diff --git a/.claude/agents/principles-architect.md b/.claude/agents/principles-architect.md new file mode 100644 index 0000000000..50242e6c66 --- /dev/null +++ b/.claude/agents/principles-architect.md @@ -0,0 +1,76 @@ +--- +name: principles-architect +description: Architectural consultant for graphitron-rewrite design decisions. Evaluates a proposed design (Spec draft, design fork during implementation, refactor sketch) against the project's strategic and technical principles, and surfaces where it pushes against them. Read-only. Call this agent proactively when drafting a Backlog → Spec plan body, when an implementer hits a design fork in In Progress, or as a self-check before requesting a Spec → Ready handoff. Detailed prompts get better results; describe the design and what the agent should focus on. +tools: Read, Grep, Glob, LS +model: opus +--- + +You are an architectural consultant for graphitron-rewrite. Your job is to evaluate a proposed design against the project's principles and surface, concretely, where the design pushes against them and what a stronger shape would look like. + +You are not a reviewer. The Spec → Ready and In Review → Done gates are handled by the `srp` and `reviewer-prompt` skills, which hand off to a fresh agent to satisfy the reviewer-rule guard. You are the *forward* voice the author consults *while drafting*, not the gatekeeper after. + +## CRITICAL: scope of your output + +- DO surface architectural opportunities the author may have missed: places the design pushes against a principle, places the type system could carry more certainty, places a producer narrows a shape that downstream consumers consume without the narrowed type, places the validator should mirror the classifier. +- DO sketch the stronger shape in one or two sentences when the alternative is concrete. +- DO cite the principle by heading from the docs you read (e.g. "Generation-thinking", "Sealed hierarchies over enums", "Classification belongs at the parse boundary"). +- DO be willing to say "the design is clean against the principles"; do not invent findings to fill space. +- DO NOT bug-hunt, style-police, or rubber-stamp. +- DO NOT propose features or scope expansions ("you could also support X"). +- DO NOT produce review verdicts (no "approve" / "reject"); the gate skills do that. +- DO NOT modify files. You are read-only. + +## Read first (in this order, every invocation) + +These are the principle sources. Read them before evaluating the design; the order matters because the strategic frame reframes the technical one: + +1. `docs/graphitron-principles.adoc` ; strategic principles (DB-as-ally, stability through simplicity, separate business logic from API code) +2. `docs/architecture/explanation/rewrite-design-principles.adoc` ; technical principles (generation-thinking, sealed hierarchies, classification boundaries, classifier guarantees shape emitter assumptions, validator-mirrors-classifier, test tiers) +3. `docs/architecture/index.adoc` ; pipeline orientation +4. Any doc the design touches directly (`code-generation-triggers.adoc`, `argument-resolution.adoc`, `runtime-extension-points.adoc`, `testing.adoc`, `workflow.adoc`) ; only the ones relevant to the design under review + +Then read the code or spec the caller pointed you at. Read fully (no `limit`/`offset`); the principles are most useful when you can see the actual shapes the design touches. + +## What to look for + +Use the same taxonomy as `.claude/skills/reviewer-prompt/SKILL.md`'s "What to look for" list, applied *forward* to a design rather than *backward* to a diff. Highest-leverage families: + +- **Generation-thinking gaps.** Does the model the design proposes carry what the generator needs (pre-resolved, generation-ready), or does it leave the generator parsing strings, recomputing names, or branching on predicates over pre-resolved data? If two consumers would evaluate the same predicate over a model field, the branch belongs in the model. +- **Enum where a sealed hierarchy belongs.** Variants that carry different data forced into one shared field set. Look for "this enum value implies these fields are non-null." +- **Classification leaks.** Does the design route raw `Table`, `ForeignKey`, `java.lang.reflect.Type`, or graphql-java schema types past `ServiceCatalog` / `JooqCatalog` / `TypeBuilder` / `FieldBuilder`? Those four are the only classes permitted to hold them. +- **Capability vs. sealed-switch confusion.** Is the design proposing an `instanceof` chain where a capability interface (`SqlGeneratingField`, `MethodBackedField`, `BatchKeyField`, ...) would express "uniformly true across variants"? Or a capability where the generator actually forks on identity? +- **Component types too broad.** A field component declared at the sealed root when the classifier guarantees a narrower variant. The type system should carry the certainty. +- **Sub-taxonomy candidates.** Resolution outcomes stored as raw strings, nullable bag records, or tri-state returns that should be a sealed `Resolved`. +- **Validator gaps.** New classifier branches or invariants without a matching validate-time rejection. Every classifier decision that implies a generator branch must fail at validate time if unimplemented. +- **Missing type-system lift.** A producer (resolver, catalog, classifier) narrows a return type, record component, or sealed sub-variant in spirit, but the declared signature stays wide. The contract belongs in the signature. +- **Wire-format leaks.** Opaque wire shapes (NodeId, cursors, federation reps) reaching past the DataFetcher boundary into the model. +- **Test-tier mismatch.** A behaviour change without a pipeline-tier test, or per-variant unit tests for behaviour that pipeline / compile / execute tiers should cover. Code-string assertions on generated method bodies are banned at every tier. +- **Stale references.** Does the design name tests, classes, or methods that don't exist? If the same plan creates them, prefer "C3 adds `X`" phrasing over "as asserted by `X`". +- **Generated-output Java version.** Generator code may use Java 25; emitted source must be valid Java 17. + +## What NOT to flag + +- Formatting, import order, naming preferences. +- Restating what the design does. +- Speculative features the design didn't claim. +- Conformance to the literal text of a principle when the spirit is met. +- Trade-offs the principles explicitly accept (type erasure at jOOQ helper boundaries; selection-driven SQL for wide tables; etc.). + +## Output format + +Prioritized list, highest-leverage first. For each opportunity: + +- **Summary.** One line. +- **Pointer.** Where in the design (Spec section, file:line, the part of the sketch the caller showed you). +- **Principle.** The heading from `rewrite-design-principles.adoc` or `graphitron-principles.adoc`. +- **Why the proposed shape is weaker.** One or two sentences. Concrete, not abstract. +- **Sketch of stronger shape.** One or two sentences, optional if obvious. + +Stop once you've covered the architecturally interesting issues. A short, high-signal list beats a long checklist. If the design is genuinely clean against the principles, say so plainly and stop ; the author's time is the resource you're saving. + +## Hard rules + +- You are read-only. Do not propose to edit files; the caller will do that with your output in hand. +- Do not produce a verdict. Reviewer-rule gates are not yours to enforce; the `srp` / `reviewer-prompt` skills handle the handoff. +- Do not improvise the principle list. The headings in `rewrite-design-principles.adoc` and `graphitron-principles.adoc` are the canonical taxonomy; cite them by name so the author can navigate to the source. +- If the caller's question is too vague to ground in a principle ("is this good?"), ask a focused follow-up rather than guessing. diff --git a/.claude/scripts/session-start-web-env.sh b/.claude/scripts/session-start-web-env.sh new file mode 100755 index 0000000000..1b583dc505 --- /dev/null +++ b/.claude/scripts/session-start-web-env.sh @@ -0,0 +1,98 @@ +#!/usr/bin/env bash +# SessionStart hook: bring a Claude Code Web sandbox up to a buildable state for +# graphitron-rewrite. Every step is idempotent and no-ops on local development (where +# the cluster tooling / sandbox JDK layout is absent) or when the resource is already +# present. See .claude/web-environment.md for the rationale behind each step. + +set -u + +emit() { printf '%s\n' "{\"systemMessage\":\"$1\"}"; } + +# Repo root, resolved from this script's own location so paths work regardless of cwd. +REPO_ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd) + +# 1. JDK 25. The parent pom's enforcer requires Java >= 25. Older sandbox images default +# to Java 21 and pin it via /etc/profile.d/java.sh (sourced by every shell), so install +# 25 if missing and retarget the alternatives + that profile file. Subsequent shells in +# the session then pick up JAVA_HOME=25 automatically. +JDK25=/usr/lib/jvm/java-25-openjdk-amd64 +if [ ! -x "$JDK25/bin/java" ]; then + sudo apt-get install -y openjdk-25-jdk-headless >/dev/null 2>&1 \ + || { sudo apt-get update >/dev/null 2>&1 || true; sudo apt-get install -y openjdk-25-jdk-headless >/dev/null 2>&1; } +fi +if [ -x "$JDK25/bin/java" ]; then + sudo update-alternatives --set java "$JDK25/bin/java" >/dev/null 2>&1 || true + sudo update-alternatives --set javac "$JDK25/bin/javac" >/dev/null 2>&1 || true + if [ ! -f /etc/profile.d/java.sh ] || ! grep -q 'java-25' /etc/profile.d/java.sh 2>/dev/null; then + printf 'export JAVA_HOME=%s\nexport PATH=${JAVA_HOME}/bin:${PATH}\n' "$JDK25" \ + | sudo tee /etc/profile.d/java.sh >/dev/null 2>&1 + emit "JDK 25 set as default (JAVA_HOME=$JDK25); new shells use it automatically." + fi +elif command -v java >/dev/null 2>&1 && ! java -version 2>&1 | grep -q '"2[5-9]'; then + emit "JDK 25 install failed; the parent pom enforcer needs Java >= 25. See .claude/web-environment.md." +fi + +# 2. PostgreSQL for -Plocal-db builds. Gated on pg_ctlcluster (Debian/Ubuntu cluster tooling) +# so it no-ops on local dev. Starts the cluster if down, sets the password JDBC expects +# (scram-sha-256 over 127.0.0.1, vs peer auth for `sudo -u postgres`), and creates + seeds +# rewrite_test when absent. The password reset only runs when we started the cluster, so a +# pre-existing local server is left untouched. +if command -v pg_ctlcluster >/dev/null 2>&1 && command -v pg_isready >/dev/null 2>&1; then + pg_was_running=1 + if ! pg_isready -h localhost -p 5432 -q 2>/dev/null; then + pg_ctlcluster 16 main start >/dev/null 2>&1 || true + pg_was_running=0 + fi + if pg_isready -h localhost -p 5432 -q 2>/dev/null; then + [ "$pg_was_running" -eq 0 ] && { sudo -u postgres psql -qc "ALTER USER postgres PASSWORD 'postgres';" >/dev/null 2>&1 || true; } + if ! sudo -u postgres psql -tAc "SELECT 1 FROM pg_database WHERE datname='rewrite_test'" 2>/dev/null | grep -q 1; then + if sudo -u postgres psql -qc "CREATE DATABASE rewrite_test;" >/dev/null 2>&1 \ + && sudo -u postgres psql -q -d rewrite_test \ + -f "$REPO_ROOT/graphitron-sakila-db/src/main/resources/init.sql" >/dev/null 2>&1; then + emit "PostgreSQL ready: rewrite_test created and seeded. -Plocal-db builds are ready." + else + emit "rewrite_test create/seed failed. See .claude/web-environment.md." + fi + fi + elif [ "$pg_was_running" -eq 0 ]; then + emit "PostgreSQL bring-up failed. See .claude/web-environment.md." + fi +fi + +# 3. Maven settings: a stale proxy entry (legacy 21.0.0.129) blocks Maven Central. Replace +# the file with an empty settings; gated on the stale marker so a real config is untouched. +if [ -f "$HOME/.m2/settings.xml" ] && grep -q '21\.0\.0\.129' "$HOME/.m2/settings.xml" 2>/dev/null; then + mkdir -p "$HOME/.m2" + cat > "$HOME/.m2/settings.xml" <<'XMLEOF' + + +XMLEOF + emit "Removed stale proxy from ~/.m2/settings.xml." +fi + +# 4. libtree-sitter runtime for graphitron-lsp. jtreesitter 0.26 resolves runtime symbols +# against an OS-installed libtree-sitter; apt's libtree-sitter0 is 0.20.x (predates +# ts_language_abi_version), so build the matching version from upstream. CI uses +# `git clone`, but in web sessions the git protocol is rewritten to a repo-scoped proxy +# path that 403s on third-party repos, so fetch the release tarball over plain HTTPS +# (which is reachable) instead. Idempotent: skips when the 0.26 ABI is already present. +TS_VERSION=0.26.9 +if ldconfig -p 2>/dev/null | grep -q 'libtree-sitter\.so\.0\.26'; then + : # already installed, skip +elif command -v curl >/dev/null 2>&1 && command -v make >/dev/null 2>&1 && command -v cc >/dev/null 2>&1; then + ts_tmp=$(mktemp -d) + if curl -fsSL -o "$ts_tmp/ts.tgz" "https://github.com/tree-sitter/tree-sitter/archive/refs/tags/v${TS_VERSION}.tar.gz" \ + && tar -xzf "$ts_tmp/ts.tgz" -C "$ts_tmp" \ + && make -C "$ts_tmp/tree-sitter-${TS_VERSION}" >/dev/null 2>&1 \ + && sudo make -C "$ts_tmp/tree-sitter-${TS_VERSION}" install >/dev/null 2>&1; then + sudo ldconfig + emit "Installed libtree-sitter ${TS_VERSION}; graphitron-lsp native tests are ready." + else + emit "libtree-sitter ${TS_VERSION} install failed; graphitron-lsp native tests will error. See .claude/web-environment.md." + fi + rm -rf "$ts_tmp" +fi + +exit 0 diff --git a/.claude/settings.json b/.claude/settings.json new file mode 100644 index 0000000000..a2797f0cb1 --- /dev/null +++ b/.claude/settings.json @@ -0,0 +1,27 @@ +{ + "$schema": "https://json.schemastore.org/claude-code-settings.json", + "hooks": { + "SessionStart": [ + { + "hooks": [ + { + "type": "command", + "command": ".claude/scripts/session-start-web-env.sh" + } + ] + } + ], + "PostToolUse": [ + { + "matcher": "Bash", + "hooks": [ + { + "type": "command", + "if": "Bash(git push *)", + "command": "jq -r '.tool_input.command' | { read -r cmd; if [ -z \"$cmd\" ]; then exit 0; fi; if echo \"$cmd\" | grep -q 'claude/graphitron-rewrite'; then exit 0; fi; printf '%s\\n' '{\"systemMessage\":\"Trunk fast-forward not done. Follow up with: git push origin HEAD:claude/graphitron-rewrite\"}'; }" + } + ] + } + ] + } +} diff --git a/.claude/skills/capability-catalog/SKILL.md b/.claude/skills/capability-catalog/SKILL.md new file mode 100644 index 0000000000..adc831b550 --- /dev/null +++ b/.claude/skills/capability-catalog/SKILL.md @@ -0,0 +1,85 @@ +--- +name: capability-catalog +description: Maintain the graphitron capability catalog at `capabilities/.adoc` — add, edit, suggest, audit, dedupe, and remove capabilities. Use when the user asks to "add a capability for X", "list capabilities", "suggest missing capabilities", "audit the catalog", "remove the foo capability", "edit the pagination capability", or any phrase about graphitron's capability namespace. The catalog is the source of truth for the slug namespace `@capability(name:)` and `@exemplifies(capability:)` reference; every authored slug must surface on at least one coordinate, every directive value must resolve to an authored slug. +--- + +# Capability catalog + +Operates on `capabilities/.adoc` files. Each capability is a durable, named *capability* graphitron delivers (pagination, typed-errors, polymorphic-dispatch, federation-entities, ...). The slug `id` is the join key the rest of the project uses; the title is human-readable; the body is a working definition that grows over time as worked examples register via `@exemplifies` (R112). + +## Capability identity: slug + +Lowercase kebab-case, descriptive of the capability not the implementation (`pagination`, not `connection-types`; `typed-errors`, not `error-channel`). Slugs must be stable from authorship onward — once an `R`, an `@capability(name:)` directive, or an `@exemplifies(capability:)` directive references a slug, renaming requires a coordinated update across every referer. Pick names that read well in three contexts: as a directive value (`@capability(name: "pagination")`), as a roadmap front-matter cross-reference (`relates-to: [pagination, typed-errors]`), and as a docs-site URL (`/capabilities/pagination`). + +## File shape + +```adoc +--- +id: +title: "" +--- + += <title> + +One-sentence definition of what this capability is and how a developer recognises it in a graphitron-generated API. +``` + +The one-sentence body is the bar; preamble prose fills in lazily as `@exemplifies` operations register worked examples the body can reference. + +## Subcommands + +The skill recognises six intents from the user's request. Pick one and execute. + +### list + +Print slugs and titles in one block, sorted: + +```bash +ls capabilities/*.adoc 2>/dev/null +``` + +If the directory does not yet exist, say so (R115 has not seeded it yet) and stop. + +### add `<slug>` `--title "<title>"` + +Create `capabilities/<slug>.adoc` with the file shape above and a one-sentence definition. Validate slug rules before writing (lowercase kebab-case, no `directive-` or `impl-` prefix, no implementation jargon). Refuse if the file already exists; suggest `edit` instead. + +### edit `<slug>` + +Resolve the slug to the file (filename = `id`). Surface current content; help the user refine the one-sentence definition or grow preamble prose. Don't rename slugs through this subcommand — renames are explicit multi-file edits across SDL, roadmap front-matter, and docs links, with no shortcut. + +### suggest + +Walk discovery sources and propose candidate slugs not yet authored. This is the load-bearing subcommand for R115's seeding pass and for ongoing capability-gap detection. + +The walk is idempotent against canonical state: before listing candidates, subtract the set of already-authored slugs (from `capabilities/*.adoc`) and the set of coordinates already carrying `@capability(name:)` in the SDL. Re-running `suggest` after authoring stubs yields a shrinking list, never a repeat. State lives in the catalog and the SDL; this subcommand reads, never writes. + +1. **Directives reference.** For each `docs/manual/reference/directives/<directive>.adoc`, identify the user-facing capability it exposes. Most map 1:1 (`@discriminator` → `polymorphic-dispatch`; `@table` → `table-types`); some cluster (`@key`/`@field`/entity dispatch → `federation-entities`); some are infrastructure that don't surface as a capability (`@condition`, `@notGenerated`, `@experimental_constructType`). Flag any directive whose capability is not authored. +2. **Classifier sealed-variant families.** Grep `graphitron/src/main/java` for `sealed ` declarations producing fetchers; cross-check that every non-trivial family maps to at least one capability. Implicit capabilities like `selection-aware-fetching` and `node-id` surface here when no single directive corresponds. +3. **Sakila schema.** Read `graphitron-sakila-example/src/main/resources/graphql/schema.graphqls` and `federated-schema.graphqls`; flag directive uses on coordinates whose capability slug isn't authored. + +Output: a ranked list of candidate slugs with one-sentence rationale and which discovery source surfaced them. The user decides which to author; this subcommand never writes files. + +### audit + +Run integrity checks against the current repo state. R112's validator will eventually fail the build on the orphan / dangling-reference findings; until it ships, the skill simulates. + +1. **Orphan slugs.** Authored `.adoc` whose slug never appears in `@capability(name: <slug>)` across the SDL or in `@exemplifies(capability: <slug>)` across operation `.graphql` files. Surface as candidates for removal or coverage gaps. +2. **Dangling references.** `@capability(name:)` or `@exemplifies(capability:)` values with no authored `.adoc`. Surface as authoring tasks. +3. **Potential duplicates.** Slugs whose titles or one-sentence definitions overlap heavily, or where the same coordinate carries two `@capability` tags whose semantics could collapse. Flag pairs for human review; never merge automatically — slug renames are coordinated multi-file edits. +4. **Missing surfaces.** Sealed-variant families producing non-trivial fetchers with no capability covering them; this is R115's acceptance check expressed as a continuously-runnable diagnostic. + +Output: a finding list per category. The user decides remediation; this subcommand never writes files. + +### remove `<slug>` + +Refuse if any `@capability(name: <slug>)` or `@exemplifies(capability: <slug>)` reference exists anywhere in the repo (SDL files, operation `.graphql`, roadmap markdown, docs `.adoc`). Surface the references and stop. Otherwise delete `capabilities/<slug>.adoc`. + +## Hard rules + +- The `.adoc` files in `capabilities/` are canonical. The DuckDB knowledge base R117 frames is a projection rebuilt every build; never edit a capability through any other surface. +- Slug = capability not implementation; lowercase kebab-case; stable from authorship. Renames are coordinated multi-file edits, not a subcommand. +- `id:` in frontmatter must equal the filename slug. If they disagree, the filename wins; correct the frontmatter. +- One sentence per slug is the bar during seeding. Long-form preamble grows lazily as `@exemplifies` worked examples land via R112; don't author multi-paragraph prose just because a stub feels thin. +- `add`, `edit`, and `remove` write the catalog. `suggest` and `audit` are read-only — they propose; the user decides. +- Drift between the catalog and `@capability` references is structurally a validator concern (R112). The skill is the human-facing companion; the build is the enforcement boundary. diff --git a/.claude/skills/capability-interview/SKILL.md b/.claude/skills/capability-interview/SKILL.md new file mode 100644 index 0000000000..8ff2bf2609 --- /dev/null +++ b/.claude/skills/capability-interview/SKILL.md @@ -0,0 +1,72 @@ +--- +name: capability-interview +description: Investigative-journalist-style discovery skill that walks graphitron's model (sealed variants, records, directive resolvers, SDL types), asks Socratic questions about what each thing exists to deliver, and turns answers into capability catalog stubs and candidate `@capability(name:)` SDL tags. Use when the user asks to "interview the model", "discover capabilities", "walk the codebase for capabilities", "what capability does X serve", or otherwise wants conversational capability discovery rather than the heuristic walk `capability-catalog suggest` does. Sibling to capability-catalog: this skill discovers; that skill records. +--- + +# Capability interview + +A conversational, journalist-style discovery skill. The user supplies the framing; the skill asks the questions and converts answers into actionable artefacts — new capability stubs (via the `capability-catalog` skill) and candidate `@capability(name:)` tags on SDL coordinates (surfaced for the user or another agent to apply). + +The skill is designed for the seeding pass R115's plan body calls for, and for periodic gap-finding once the catalog exists. It complements `capability-catalog suggest` (heuristic walk: grep + cross-check, fast and shallow) with Socratic investigation: pick one model surface at a time, gather its context, ask what it's for, capture the answer. + +## Output discipline + +The skill produces two things only: + +1. **Capability stubs.** When the interview surfaces a capability not yet in the catalog, hand off to the `capability-catalog add` subcommand to create the stub. The journalist proposes the slug and one-sentence definition; `capability-catalog` writes the file so the integrity rules apply. +2. **SDL tag candidates.** When the interview reveals a coordinate that should carry `@capability(name: <slug>)`, surface the coordinate + slug pair. The skill does *not* edit SDL files — that's an explicit user step (or a follow-up agent task) so SDL changes go through normal review. + +The skill never writes Java. Capabilities live on SDL coordinates, not on Java types; the model→capability connection is derived at build time via the KB join (`coordinate → classifier_call → variant_family`), not authored on the Java side. + +## Procedure + +The user typically opens the skill with one of: + +- `/capability-interview` — no target; the skill picks an un-tagged surface to investigate. +- `/capability-interview <hint>` — hint can be a Java FQN, an SDL type name, a directive name, or a file path. The skill anchors on what's named. + +Once a target is chosen, follow this loop: + +1. **Gather context.** Read the target and adjacent material: sibling sealed-variant subtypes, call sites, the coordinate it produces (if any), the directive that triggers it (if any), test classes that exercise it. Surface a short brief — three to five sentences max — naming what's there. + +2. **Pose the journalist question.** Ask one open question at a time: "what does this exist to deliver to a developer?", "how would a developer recognise this in a generated API?", "what would break for them if it disappeared?". Probe for the user-facing promise, not the implementation mechanism. + +3. **Listen and converge.** The user's answer falls into one of three buckets: + - **Existing capability.** The slug already exists in `capabilities/`. Propose attaching `@capability(name: "<slug>")` to the coordinates the target backs; surface the list as SDL tag candidates. + - **New capability.** The slug doesn't exist yet. Propose a slug + one-sentence definition; hand off to `capability-catalog add` to write the stub. Then surface SDL tag candidates as above. + - **Plumbing, no capability.** The target is internal machinery; no slug applies. Acknowledge and move on. + +4. **Move on.** Pick the next target (user-driven, or skill-suggested from un-investigated material) and loop. End the session when the user says so. + +## Discovery sources for picking targets + +When the user doesn't supply a hint, the skill picks from a bounded list of *uncovered* surfaces. Compute "uncovered" as the difference of two sets. + +The **candidate set**: + +- Classifier sealed-variant families that produce non-trivial fetchers (`graphitron/src/main/java`, grep `sealed `). Each family is a candidate capability boundary. +- Directive resolvers (`*DirectiveResolver.java` in the same tree). Each is the implementation side of a directive whose user-facing capability needs naming. +- SDL coordinates in the sakila example with directive applications (`graphitron-sakila-example/src/main/resources/graphql/`). +- The "missing surfaces" finding from `capability-catalog audit` — sealed-variant families with no covering capability slug, the highest-priority targets. + +Minus the **covered set**: + +- SDL coordinates already carrying `@capability(name:)`. +- Surfaces named in any authored `capabilities/*.adoc` body (capabilities frequently mention the Java types or directive families they cover). +- Sealed-variant families reachable from a covered coordinate via the KB join (once R112's projection lands; until then, approximated by reading SDL). + +This subtraction is what makes the journalist idempotent. A surface investigated and resolved with a positive verdict drops off the candidate list automatically — re-running `/capability-interview` after a seeding pass yields a shrinking list, not a repeat. State lives in the SDL and the catalog; the skill reads them, never writes them outside the `capability-catalog add` handoff. + +## Plumbing verdicts (V0: not persisted) + +"Plumbing, no capability" verdicts are not currently persisted between sessions. The journalist may revisit a surface the user previously dismissed as plumbing, and the user re-says so. This is acceptable during the seeding pass because the candidate set is small and verdicts are cheap; it's not acceptable forever. + +When repetition becomes the actual annoyance, escalate to a single `capabilities/_plumbing.adoc` (reserved id `_plumbing`) listing dismissed surfaces with a one-sentence rationale each. The journalist would then subtract this from the candidate set the same way it subtracts covered surfaces, and R112's validator would enforce mutual exclusion (a surface in `_plumbing` cannot appear under any positive slug). Treat this as a TODO that surfaces when the cost of re-asking exceeds the cost of authoring; don't preemptively build the file. + +## Hard rules + +- The journalist asks; the user decides. Don't propose a slug or a tag candidate as a fait accompli; propose, listen for redirect, converge. +- One target at a time. Trying to interview a whole sealed-variant family in one pass produces shallow output; pick the most representative subtype and let the framing generalise. +- The journalist never writes the catalog or the SDL directly. Catalog writes go through `capability-catalog add` so integrity rules apply; SDL writes are an explicit user/agent step so they go through normal review. +- Capabilities live on SDL coordinates, not on Java types. If the interview surfaces "this Java class is the heart of capability X", that's a finding, not an annotation — the durable tag goes on the coordinates the class backs. +- "Plumbing, no capability" is a valid outcome and should be honoured. Not every type maps to a capability; some types serve capabilities transitively. Don't force a slug onto plumbing. diff --git a/.claude/skills/classified-corpus/SKILL.md b/.claude/skills/classified-corpus/SKILL.md new file mode 100644 index 0000000000..3d8506fcca --- /dev/null +++ b/.claude/skills/classified-corpus/SKILL.md @@ -0,0 +1,106 @@ +--- +name: classified-corpus +description: Migrate one classification verdict into the R281 spec-by-example corpus and the code-generation-triggers documentation, retiring the legacy GraphitronSchemaBuilderTest enum row it subsumes. Use when grinding R281 slice 2/3, or when the user says "migrate the X verdict", "add a corpus example for X", "document the X classification", "render X from the corpus", or "retire the X enum case". Encodes the per-verdict loop: author fixture, validate dimensions, render the doc block, write the worked example, retire pure-verdict enum rows, verify coverage + drift + docs render. +--- + +# classified-corpus + +The per-verdict migration loop for R281 (`classification-test-dsl`). The spec-by-example corpus is the +source of truth; the `code-generation-triggers` page is a view rendered over it; the legacy +`GraphitronSchemaBuilderTest` enum truth table shrinks as verdicts migrate. One verdict at a time, one +commit each. + +## The files + +All under the repo root: + +- **Corpus** (source of truth): `graphitron/src/test/java/no/sikt/graphitron/rewrite/classifieddsl/ClassifiedCorpus.java`. A `List<Example>`; each `Example(id, sdl[, query])`. A non-null `query` makes it a doc example. +- **Harness / DSL test**: `.../classifieddsl/ClassifiedHarness.java` (classifies a fixture, reads `@classified`/`@classifiedType` off the AST, maps the leaf through `LeafTupleAdapter`), `ClassifiedDslTest.java` (asserts every annotated coordinate classifies to its declared dimensions). +- **Renderer + drift guard**: `QueryViewRenderer.java` (query-as-view, AST-print, strips the internal directives), `ClassifiedDocTest.java` (asserts each doc example's rendered SDL appears verbatim in the page). +- **Dimensional vocabulary**: `ClassifiedDsl.java` (the `@classified`/`@classifiedType` + `ProducerStep`/`Mapping`/`TypeVerdict` SDL prelude, declared test-only, ignored by the classifier), `DimensionTuple` / `ProducerStep` / `Mapping` / `LeafTupleAdapter`. +- **The page**: `docs/architecture/reference/code-generation-triggers.adoc`. +- **Legacy truth table**: `graphitron/src/test/java/no/sikt/graphitron/rewrite/GraphitronSchemaBuilderTest.java` (the `*Case implements ClassificationCase` enums). +- **Coverage bridge**: `graphitron/src/test/java/no/sikt/graphitron/rewrite/VariantCoverageTest.java` (unions corpus-covered leaves with enum-case leaves; the safety net for retirement). Its `NO_CASE_REQUIRED` allowlist documents leaves unreachable from the standard Sakila catalog; the slice-3 sweep interacts with it, and those leaves stay allowlisted rather than swept. +- **Retirement inventory** (the deletion whitelist): `roadmap/audits/classification-test-dsl-inventory.md`. The committed checklist of pure-verdict candidate rows; only rows listed there may retire, and each migration commit ticks its row off. + +## The loop + +### 1. Find the verdict's current home +Start from the retirement inventory (`roadmap/audits/classification-test-dsl-inventory.md`): it names the +candidate rows and their leaves; pick the next unticked row. Then grep `GraphitronSchemaBuilderTest.java` +for the leaf (e.g. `ServiceTableField`, `ColumnField`). For each matching enum case, read its assertion +lambda and confirm its classification: +- **pure-verdict** = the lambda only asserts `isInstanceOf(<Leaf>.class)` (optionally `.reason()`-free). These are retirement candidates. +- **slot-asserting** = the lambda also asserts `joinPath()`, `returnType().wrapper()`, `filters()`, `sourceKey()`, `compaction`, key columns, etc. **Keep these** — the corpus asserts the two-axis verdict, not slots; those assertions are the pipeline tier's job. + +### 2. Author the corpus example +Add an `Example` to `ClassifiedCorpus.EXAMPLES`. Rules: +- Fixtures classify against the **standard Sakila catalog**. Use real tables/columns/FKs. Prefer unambiguous single FKs (e.g. `city -> country`; **avoid** `film -> language`, which has two FKs and is ambiguous). Mine working SDL from the `GraphitronSchemaBuilderTest` case you're migrating. +- Annotate each coordinate: output fields with `@classified(producer: [...], mapping: ...)`, types with `@classifiedType(as: ...)`. Empty `producer: []` is the inline/correlate (no new query) case. +- For a doc example, add a `query` selecting exactly the coordinates to show. **Minimal pairs teach best**: vary one dimension, hold the rest constant (e.g. the same return type with/without `@splitQuery` for `producer`; a scalar under a `@table` vs a `@record` parent for `mapping`). +- **Doc examples are field/catalog-side only for now.** The renderer does not yet expand input types reachable from a kept field's arguments, and fragment-only (`on Type`) selection is unimplemented, so a mutation or type verdict cannot render an honest excerpt. Migrate those **corpus-only** (omit `query`, skip steps 4-5) until the R281 pre-migration-hardening renderer extensions land. + +### 3. Validate the dimensions (discover the true verdict) +```bash +export JAVA_HOME=/usr/lib/jvm/java-25-openjdk-amd64 +mvn -pl :graphitron -am test -Plocal-db -P'!docs' \ + -Dtest='ClassifiedDslTest' -Dsurefire.failIfNoSpecifiedTests=false +``` +`corpusClassifiesToDeclaredDimensions` fails if a declared `@classified` doesn't match what the +classifier produces. Fix the declared dimensions (or the fixture) until green — this step is where you +*learn* the verdict; do not force the fixture to a hunch. + +### 4. Capture the rendered block +```bash +mvn -pl :graphitron -am test -Plocal-db -P'!docs' \ + -Dtest='ClassifiedDocTest' -Dsurefire.failIfNoSpecifiedTests=false 2>&1 | grep -A 25 "doc example '<id>'" +``` +The failure message prints the exact SDL block (AstPrinter form, e.g. `@table(name: "city")`). Copy it. + +### 5. Write the worked example in the page +In `code-generation-triggers.adoc`, add prose stating the rule **in dimensional terms** (producer/mapping +for fields, the `GraphitronType` leaf for types — never cross-product leaf names on the field side, that +is what survives the R222 pivot) + a `[source,graphql]` block holding the captured SDL **verbatim** + +a closing "Asserted by the `<id>` corpus example." Condense the superseded leaf-name table rows into the +worked example as you go (the tables are the transitional reference and shrink as the doc grows). + +### 6. Retire the enum row(s) +Delete **only** the pure-verdict cases from step 1 that are listed in the retirement inventory and that +the corpus now covers. **Verify corpus pickup directly, not via `VariantCoverageTest`**: the union net +is one-way (a deleted row's leaf may still be covered by a *different* enum row, so a green run proves +nothing about pickup). The step-3 harness run records the sealed leaf per `@classified` coordinate; +confirm your new example's coordinate lands on the exact leaf the row asserts before deleting. Replace +each deleted case with a one-line comment noting the migration (corpus example id + where it renders), +and tick the row off in the inventory in the same commit. **Never retire**: +- slot-asserting cases (keep them), +- rejection / `UnclassifiedField` / `UnclassifiedType` rows (failure path is out of scope; a separate mechanism replaces them), +- input-field rows (`InputField.*`; a different game, out of scope). + +### 7. Verify +```bash +mvn -pl :graphitron -am test -Plocal-db -P'!docs' \ + -Dtest='ClassifiedDslTest,ClassifiedDocTest,VariantCoverageTest,GraphitronSchemaBuilderTest' \ + -Dsurefire.failIfNoSpecifiedTests=false +# docs must render (a .adoc break fails CI): +mvn -pl :graphitron-docs -am install -DskipTests +``` +`VariantCoverageTest` is the retirement safety net: if it goes red you deleted the sole coverage for a +leaf the corpus does not yet demonstrate — re-add the case or extend the fixture. + +### 8. Commit + publish +One commit per verdict, subject `R281 slice 2: migrate <verdict> ...`. Publish via the **publish** +skill (push feature branch + fast-forward trunk). + +## Guardrails + +- **The inventory is the deletion whitelist.** A row not listed in + `roadmap/audits/classification-test-dsl-inventory.md` does not retire, full stop. The inventory + settled the pool at 35 pure-verdict eligible rows of 407; the slot-asserting (170), rejection (178), + and input-side (24) rows stay by design. +- **Green `VariantCoverageTest` is not proof of corpus pickup.** Its union also counts the remaining + enum rows; verify the leaf lands in the corpus per step 6. +- **Success-only.** The corpus asserts the happy path. Rejection and input-field rows stay in the enum table. +- **Verdict, not slots.** Migrate the `(producer, mapping)` / `TypeVerdict` verdict. Slot detail stays in the pipeline tier (the slot-asserting enum cases). +- **Drift is exact.** The page must contain the rendered block byte-for-byte; re-capture after any fixture change. +- **Coverage is the net.** A leaf can be covered by several enum cases and/or the corpus; trust `VariantCoverageTest`, do not eyeball. +- **Test-only directives** live in `ClassifiedDsl.PRELUDE`, never in production `directives.graphqls`; the classifier ignores them. diff --git a/.claude/skills/publish/SKILL.md b/.claude/skills/publish/SKILL.md new file mode 100644 index 0000000000..c3fc9281e9 --- /dev/null +++ b/.claude/skills/publish/SKILL.md @@ -0,0 +1,39 @@ +--- +name: publish +description: Push the current feature branch and fast-forward `claude/graphitron-rewrite` trunk in one step. Use whenever you would otherwise run `git push` on committed work in graphitron-rewrite. Trunk-based development requires the fast-forward to follow every feature-branch push (see CLAUDE.md "Git Workflow"); this skill does both and verifies success. +--- + +# Publish + +Trunk-based, fast-forward-only flow for `graphitron-rewrite`. One invocation = branch push + trunk fast-forward. + +## When to skip + +Do NOT run this skill if any of the following hold (the work is not trunk-bound): + +- The most recent commit message starts with `wip:`, `draft:`, or `spike:`. +- The current branch is named `wip/...`, `draft/...`, or `spike/...`. +- The user has said out-loud "don't ship this to trunk yet". + +If any apply, push the feature branch only and tell the user trunk was deliberately skipped. + +## Procedure + +1. **Inspect state.** Run `git status --porcelain` and `git branch --show-current`. + - If the working tree is dirty, stop and ask the user whether to commit, stash, or abort. + - If the current branch is `claude/graphitron-rewrite`, stop. This skill never pushes from trunk directly; the user is on the wrong branch. + - Read the most recent commit subject (`git log -1 --pretty=%s`). If it starts with one of the skip prefixes above, follow the "When to skip" rules. + +2. **Sync trunk first.** `git fetch origin claude/graphitron-rewrite`. If `origin/claude/graphitron-rewrite` has commits not reachable from `HEAD`, the fast-forward will fail. Tell the user, suggest `git rebase origin/claude/graphitron-rewrite`, and stop. + +3. **Push the feature branch.** `git push -u origin <branch>`. On network failure (not on rejection), retry up to 4 times with 2s, 4s, 8s, 16s back-off. On non-network failure (rejection, hook failure), stop and report. + +4. **Fast-forward trunk.** `git push origin HEAD:claude/graphitron-rewrite`. Same retry rules. If this push is rejected, the user's branch must be rebased on trunk first; do NOT force-push trunk under any circumstance. + +5. **Confirm.** Report both refs at their new SHA in one line: `<branch> @ <sha>; trunk @ <sha>`. + +## Hard rules + +- Never `--force` or `--force-with-lease` against `claude/graphitron-rewrite`. +- Never `--no-verify`. If a pre-push hook fails, surface the failure and stop. +- Never push to any branch other than the current feature branch and `claude/graphitron-rewrite`. If the user wants to push to `main` or anywhere else, they must say so explicitly. diff --git a/.claude/skills/reap-merged-branches/SKILL.md b/.claude/skills/reap-merged-branches/SKILL.md new file mode 100644 index 0000000000..ef9a90f7b5 --- /dev/null +++ b/.claude/skills/reap-merged-branches/SKILL.md @@ -0,0 +1,48 @@ +--- +name: reap-merged-branches +description: Delete remote branches whose commits are all contained in the claude/graphitron-rewrite trunk. Use when cleaning up dead/merged Claude branches off the rewrite trunk. +--- + +# Reap merged branches + +Identify remote `claude/**` branches on `origin` whose tip is reachable from `origin/claude/graphitron-rewrite` — i.e. every commit on the branch is already contained in trunk, so the branch is dead. The skill prepares the list and emits a deletion command for the user to run; it does not delete branches itself, because the sandboxed git proxy rejects `git push --delete`. + +## 1. Unshallow fetch + +The working clone is typically shallow. `--merged` reachability checks need full history, so unshallow first and prune stale remotes: + +```bash +if [ "$(git rev-parse --is-shallow-repository)" = "true" ]; then + git fetch --unshallow origin +fi +git fetch origin --prune +``` + +## 2. List candidate branches + +Remote `claude/**` branches whose tip is reachable from trunk, excluding trunk itself: + +```bash +git for-each-ref --format='%(refname:short)' --merged origin/claude/graphitron-rewrite refs/remotes/origin/claude/ \ + | grep -v '^origin/claude/graphitron-rewrite$' +``` + +Show the output to the user. Anything listed is safe to delete in the sense that no unique commits will be lost — every commit is already in trunk. Non-`claude/**` branches (`main`, `dependabot/...`, legacy `GG-...`, etc.) are intentionally excluded; this skill only reaps Claude-authored branches. + +## 3. Emit deletion command + +Do **not** run the deletion. Instead, print the following command in a fenced bash block for the user to copy-paste and run themselves: + +```bash +git for-each-ref --format='%(refname:short)' --merged origin/claude/graphitron-rewrite refs/remotes/origin/claude/ \ + | grep -v '^origin/claude/graphitron-rewrite$' \ + | sed 's|^origin/||' \ + | xargs -r -n1 git push origin --delete +``` + +`xargs -n1` deletes one branch per `git push` call so a single protected/missing branch doesn't abort the rest. + +## Notes + +- `--merged <commit>` matches refs whose tip is an ancestor of `<commit>`. Squash-merged or rebased branches will **not** match — their commits exist under different SHAs in trunk. Use `git cherry` or PR state to reap those. +- Don't run this against the current branch; `git push origin --delete` of your checked-out branch will still succeed remotely but leaves you on a detached upstream. diff --git a/.claude/skills/reviewer-prompt/SKILL.md b/.claude/skills/reviewer-prompt/SKILL.md new file mode 100644 index 0000000000..6021c114ce --- /dev/null +++ b/.claude/skills/reviewer-prompt/SKILL.md @@ -0,0 +1,138 @@ +--- +name: reviewer-prompt +description: Produce a single copy-pasteable code block that prompts another agent to perform a focused, architecture-oriented code review of the current branch (or a user-specified target). Use when the user asks for a "reviewer prompt", "review prompt", a "prompt for another agent to review", or otherwise wants a hand-off prompt for a fresh reviewer. The emitted prompt instructs the reviewer to find improvement opportunities aligned with graphitron-rewrite's design principles, not to bug-hunt, rubber-stamp, or police style. +--- + +# Reviewer Prompt + +Generates a self-contained prompt the user copies into another agent (fresh Claude Code session, API playground, second pane, etc.). The reviewing agent then performs an architecture-focused review against graphitron-rewrite's principles. + +The skill's job is the *hand-off*. Do not perform the review yourself. + +## When to use + +The user has just finished work, or wants a second opinion on a slice of work, and asks for a prompt to give to a different reviewer. Hand them back exactly one fenced block they can paste verbatim — no preamble, no trailing notes, nothing that breaks one-click copy. + +## Procedure + +1. **Resolve the review target.** Default is the current branch's changes against trunk: + - Branch: `git branch --show-current` + - Range: `origin/claude/graphitron-rewrite...HEAD` + - Files: `git diff --name-only origin/claude/graphitron-rewrite...HEAD` + - Run `git fetch origin claude/graphitron-rewrite` first if the cached ref looks stale. + + If the user specified a different target (a SHA range, a PR number, a single file or directory), substitute it. For a PR number, resolve the head ref via the GitHub MCP and use `<base>...<head>`. + +2. **Sanity-check.** If the diff is empty, stop and ask what target the user actually wants reviewed; do not emit a prompt that points at nothing. + +3. **Emit the prompt.** Output exactly one fenced block, pre-filled with the resolved branch, range, and file list. Use the template below verbatim for the body. + +## Prompt template + +Emit this as a fenced ```text``` block, replacing the `{{...}}` tokens. Keep the body literal otherwise — the template is the contract; do not improvise variants per call. + +````text +You are reviewing graphitron-rewrite changes. Goal: surface architectural improvement +opportunities — places the design could be stronger or more in line with the project's +stated principles. Not bug-hunting, not style policing, not approve/reject. + +Repo root: {{repo-root}} +Branch: {{branch}} +Range: {{range}} +Files changed: +{{file-list}} + +# Read first (these define what "good" looks like here) + +- docs/architecture/explanation/rewrite-design-principles.adoc (technical principles) +- docs/graphitron-principles.adoc (strategic principles) +- docs/architecture/index.adoc (architectural orientation) +- docs/architecture/reference/code-generation-triggers.adoc (sealed-type hierarchy map) + +Skim the diff once, then read the principles, then revisit the diff with the +principles in mind. The order matters: the principles reframe what you're looking at. + +# Then look at the diff + + git -C {{repo-root}} diff {{range}} + git -C {{repo-root}} log --oneline {{range}} + +# What to look for + +Architectural improvement opportunities, especially: + +- **Generation-thinking gaps.** Model carries raw strings the generator re-parses; + a generator branches on a predicate over pre-resolved data instead of on a sealed + sub-variant; the same multi-arm switch recurs across generators. +- **Enum where a sealed hierarchy belongs.** Variants that carry different data + forced into one shared field set. +- **Classification leaks.** Reflection types, raw `Table<?>`, raw `ForeignKey<?,?>`, + or raw graphql-java schema types reaching past the parse boundary + (`ServiceCatalog`, `JooqCatalog`, `TypeBuilder`, `FieldBuilder` are the only + classes permitted to hold them). +- **Capability vs. sealed-switch confusion.** `instanceof` chain where a capability + interface would express "uniformly true across variants"; a capability used where + the generator actually forks on identity. +- **Component types too broad.** A field component declared at the sealed root + when the classifier guarantees a narrower variant — the type system isn't + carrying the certainty it could. +- **Sub-taxonomy candidates.** Resolution outcomes stored as raw strings or + loosely-typed pairs that deserve their own sealed type. +- **Validator gaps.** A new classifier branch or invariant without a matching + validate-time rejection — every classifier decision that implies a generator + branch must fail at validate time if unimplemented. +- **Missing type-system lift.** A producer (resolver, catalog, classifier) narrows + a return type, record component, or sealed sub-variant in spirit, but the declared + signature stays wide. The contract belongs in the signature. +- **Test-tier mismatch.** Code-string assertions on generated method bodies + (banned at every tier); per-variant unit tests for behaviour that pipeline / + compile / execute tiers should cover; a new feature without a pipeline test. +- **Stale references.** Javadoc, plan prose, or README naming a test/method/class + that doesn't exist after this change. +- **Generated-output Java version.** Generator code may use Java 25 freely; + emitted source must be valid Java 17. Flag Java 18+ syntax in anything written + via JavaPoet templates. +- **Helper-locality / aliasing.** Emitted helpers that bind to a `Table` should + receive it as a parameter, never declare it locally. + +# What NOT to flag + +- Formatting, import order, naming preferences. +- Restating what the diff does. +- Speculative features ("you could also support X"). +- Conformance with the literal text of a principle when the spirit is met. +- Anything the diff already addresses or that an existing principle accepts as a + trade-off (e.g. type erasure at jOOQ helper boundaries; selection-driven SQL + for wide tables). + +# Output format + +Prioritized list, highest-leverage first. For each opportunity: + +- **Summary.** One line. +- **Pointer.** `path/to/file.java:LINE` or function name. +- **Principle.** Cite the heading from `rewrite-design-principles.md` or + `graphitron-principles.md` (e.g. "Generation-thinking", "Sealed hierarchies + over enums"). +- **Why the current shape is weaker.** One or two sentences. Concrete, not + abstract. +- **Sketch of stronger shape.** One or two sentences, optional if obvious. + +Stop once you've covered the architecturally interesting issues. A short, +high-signal list beats a long checklist. If the diff is genuinely clean against +the principles, say so plainly — do not invent findings to fill space. +```` + +## Output rules + +- Exactly one fenced block. No "Here's the prompt:" preamble, no trailing notes — those break one-click copy. +- Pre-fill `{{repo-root}}`, `{{branch}}`, `{{range}}`, and `{{file-list}}`. The user shouldn't have to edit the block. +- The file list is one path per line, indented two spaces under `Files changed:`. Truncate with `... (+N more)` past 30 entries. +- If the user passed a PR target, replace the Branch / Range lines with `PR: #<n> (<head> → <base>)` and use the resolved `<base>...<head>` as the range. + +## Hard rules + +- Do not perform the review yourself. The skill exists to hand off; doing the work in-session defeats the point of getting a second pair of eyes. +- Do not improvise the template per call. Adjust pre-filled values; leave the body literal. Drift means each reviewer gets a different rubric. +- The prompt references files in the repo; it does not paste their contents. The reviewing agent reads them in its own session. +- The reviewer is asked for *opportunities*, not *defects*. If the user wants a defect-finding pass instead, that's a different skill (`/security-review`, `/review`). diff --git a/.claude/skills/roadmap/SKILL.md b/.claude/skills/roadmap/SKILL.md new file mode 100644 index 0000000000..66a1d9de08 --- /dev/null +++ b/.claude/skills/roadmap/SKILL.md @@ -0,0 +1,89 @@ +--- +name: roadmap +description: Manage graphitron-rewrite roadmap items — add new Backlog entries (auto-allocates an `R<n>` ID), transition status (Backlog→Spec→Ready→In Progress→In Review→Done), and regenerate the rolled-up README. Use when the user asks to "add a roadmap item", "move R24 to Ready", "flip R12 to In Review", "mark R7 done", or any phrase about roadmap state. Items are referred to by `R<n>` (lookup by id is fast); slug is the filename only. Encodes the workflow.md state machine and the reviewer-rule guard. +--- + +# Roadmap + +Operates on `roadmap/<slug>.md` files and the rolled-up `README.md`. Source of truth is the per-item YAML front-matter; the README is generated. + +## Item identity: `R<n>` + +Every item has an `id:` of the form `R<n>` (literal `R` + positive integer). IDs are **monotonic across the whole roadmap and never reused** — when an item ships and its file is deleted, the number stays a gap so references in `changelog.md` and commit messages keep their meaning. The user typically references items by ID alone; you should resolve ID→slug by grepping front-matter: + +```bash +grep -lE "^id: R24$" roadmap/*.md +``` + +When echoing items back to the user, prefer `R24: <slug>` so both ID and human-readable name are visible. + +## Subcommands + +The skill recognises three intents from the user's request. Pick one and execute. + +### add `<slug>` `--title "<title>"` `[--bucket <b>]` `[--priority <n>]` `[--theme <t>]` + +Use the tool's `create` subcommand — it picks the next free `R<n>`, writes the file with the ID baked in, and refreshes the README atomically. Never construct the file by hand: the validator now requires `id:` and would fail the build, and a hand-rolled file races other sessions on number allocation. + +```bash +mvn -pl roadmap-tool exec:java -q \ + -Dexec.args='create roadmap <slug> --title "<title>" \ + --bucket <bucket> --priority <n> --theme <theme>' +``` + +Slug rules (enforced by the tool): lowercase kebab-case, describes the work and not the phase (`variant-coverage-meta-test`, not `phase-2`), no `plan-` prefix. + +The created file has a single-paragraph TODO body. Edit it inline to add the real problem statement before the user reviews. + +If the user only wants to know the next free number without writing a file yet: + +```bash +mvn -pl roadmap-tool exec:java -q \ + -Dexec.args='next-id roadmap' +``` + +### status `<R<n>-or-slug>` `<new-state>` + +Use the tool's `status` subcommand. It resolves the slug or ID, validates the transition against the state table below, atomically writes the new `status:` value plus a fresh `last-updated: <today>` (leaving `created:` strictly untouched, never invented), and regenerates the README. Then run the reviewer-rule guards. + +```bash +mvn -pl roadmap-tool exec:java -q \ + -Dexec.args='status roadmap <R<n>-or-slug> <new-state>' +``` + +Accepted target states: `Backlog`, `Spec`, `Ready`, `In Progress`, `In Review`. `Done` and `Discarded` are file-deletion transitions per `roadmap/workflow.adoc` and remain manual; the subcommand rejects them. + +Valid transitions (see `roadmap/workflow.adoc`): + +| From | To | Guard | +|---------------|--------------|-------------------------------------------------------------| +| Backlog | Spec | none — author picks up an item and starts a plan body | +| Spec | Spec | revise; reviewer ≠ last committer of the file | +| Spec | Ready | sign-off; reviewer ≠ last committer | +| Ready | Spec | reopen for re-review (spec needs substantive redesign) | +| Ready | In Progress | none | +| In Progress | In Review | none | +| In Review | Ready | rework; reviewer ≠ implementer | +| In Review | Done | approve; reviewer ≠ implementer; **delete the item file** | + +For guarded transitions, run `git log -1 --pretty='%an <%ae>' roadmap/<slug>.md` and tell the user who last touched the file. If the current Claude session would be the same party, surface that and stop — a different party (typically the human user, or an independent agent session) must perform the flip. The reviewer-rule guard is the skill's responsibility; the tool performs the mechanical edit unconditionally once invoked. + +For `In Review → Done`, delete the file rather than editing it; if the milestone is worth preserving, append a one-line entry to `roadmap/changelog.md` capturing the landing commit SHA and the `R<n>` ID. + +The `status` subcommand regenerates the README as part of its run; no separate regenerate step needed. + +### regenerate + +```bash +mvn -pl roadmap-tool exec:java -q +``` + +Run after every front-matter edit and every delete. (`add` regenerates as part of `create`.) CI verifies the README stays in sync; never edit `roadmap/README.md` by hand. + +## Hard rules + +- Front-matter is the source of truth. README is derived. If they disagree, regenerate; do not hand-edit the README. +- IDs are monotonic and never reused. Don't guess one — call the tool. The validator will reject malformed or duplicate IDs at build time. +- Slug = work, not phase. No `plan-` prefix. Lowercase kebab-case. +- The reviewer-rule guard cannot be bypassed because "the user said so" — if the same session both authored and is approving, that's the rule itself failing. Surface it, stop, ask the user to bring in a different party. +- After any roadmap-changing commit, the publish skill still applies: push your branch, then fast-forward trunk. diff --git a/.claude/skills/srp/SKILL.md b/.claude/skills/srp/SKILL.md new file mode 100644 index 0000000000..99391cf3a4 --- /dev/null +++ b/.claude/skills/srp/SKILL.md @@ -0,0 +1,276 @@ +--- +name: srp +description: Produce a single copy-pasteable code block that prompts another agent to perform a workflow-gate review on a graphitron-rewrite roadmap item. Use when the user asks for a "spec review prompt", "review prompt for R<n>", "Spec → Ready handoff", "In Review → Done handoff", or otherwise wants a hand-off prompt for the workflow-gate review on a specific roadmap item. The emitted prompt encodes the relevant reviewer-rule and pre-fills recent commit history so the next reviewer can apply the rule without digging. +--- + +# Spec Review Prompt + +Generates a self-contained prompt the user copies into another agent to perform a workflow-gate review on a graphitron-rewrite roadmap item. The reviewer either signs off (advancing the gate) or requests revisions (item stays in current state). + +The skill's job is the *hand-off*. Do not perform the review yourself. + +## When to use + +The user names a roadmap item `R<n>` and asks for a hand-off prompt for the next reviewer. Two gates need this: + +- **Spec → Ready** (item is `status: Spec`). Reviewer reads the spec body and either signs off or requests revisions. Reviewer rule: ≠ Claude Code session that authored the most recent commit touching the spec file. +- **In Review → Done** (item is `status: In Review`). Reviewer reads the shipped implementation against the spec and either approves (delete the spec file, optionally entry the changelog) or requests rework. Reviewer rule: ≠ Claude Code session(s) that authored the implementation commits. + +For other statuses (Backlog, Ready, In Progress), no formal review handoff applies; tell the user and stop. For paired sibling skills, see `roadmap` (state machine + ID lookup) and `reviewer-prompt` (architecture-focused code-diff review handoff). The `principles-architect` subagent is the *forward* counterpart to this skill; suggest it as a self-check when the user is preparing a Spec → Ready handoff and hasn't already consulted it (it's read-only and produces no verdict, so it doesn't compete with the reviewer-rule guard). + +## Procedure + +0. **Sync first.** Always fetch and rebase before resolving anything else; the spec body the reviewer will read may live in a commit that hasn't reached the local branch yet, and a stale `git log -- <slug>.md` produces a stale recent-commits block and a stale disqualified-session-ID attribution. Run: + + ```bash + git fetch origin claude/graphitron-rewrite + git rebase origin/claude/graphitron-rewrite + ``` + + If the rebase reports conflicts, surface and stop — the user resolves before the handoff is meaningful. Working-copy dirt is the user's call (don't auto-stash). + +1. **Resolve the item.** Resolve `R<n>` to a file via: + + ```bash + grep -lE "^id: R<n>$" roadmap/*.md + ``` + + Multiple matches: roadmap-tool bug; stop and surface. No matches: ID is unallocated, or the item shipped (file deleted on Done) and only its changelog entry remains; tell the user. + +2. **Read the front-matter.** Pick `status:` and `title:` from the YAML block. + +3. **Pick the template.** + - `Spec` → Spec-stage template (gate: Spec → Ready) + - `In Review` → Implementation-stage template (gate: In Review → Done) + - Anything else → stop, tell the user no review handoff applies at status `<X>`. + +4. **Resolve the disqualified party.** This is the load-bearing piece — the next reviewer applies the rule by ID, not by re-deriving it. Per `roadmap/workflow.adoc` § "States and transitions" (Reviewer rule paragraph), the comparison identifier is the Claude Code session ID recorded as the `https://claude.ai/code/session_<id>` trailer on each commit. Resolve both the session ID (primary) and the git author name (fallback for trailer-less commits) so the emitted template carries both. + + Spec stage: + ```bash + sha=$(git log -1 --format=%H -- roadmap/<slug>.md) + git log -1 --format=%B "$sha" | grep -oE 'session_[A-Za-z0-9]+' | head -1 + git log -1 --format='%an' "$sha" + ``` + + The first command yields the disqualified session ID (e.g. `session_01Kc8d1cyEHM1rxZXpbm8QyE`); the second yields the git author. If the trailer grep is empty, the commit predates the trailer-tracking convention; surface that as `<no-trailer>` in the emitted template so the reviewing agent knows to defer to the user's judgment that they are an independent session. + + Implementation stage: the implementer is whoever authored the implementation commits between the most recent `Ready → In Progress` and `In Progress → In Review` status flips. Approximate by listing unique session IDs from the recent commits referencing `R<n>`, with git author as fallback: + ```bash + git log --pretty='%H %s' -50 | grep -E '\bR<n>\b' | awk '{print $1}' \ + | while read sha; do + sid=$(git log -1 --format=%B "$sha" | grep -oE 'session_[A-Za-z0-9]+' | head -1) + author=$(git log -1 --format='%an' "$sha") + printf '%s\t%s\t%s\n' "$sha" "${sid:-<no-trailer>}" "$author" + done + ``` + + Dedupe by the second column for the disqualified-session-IDs list; keep authors alongside as fallback. + +5. **Get the recent-commits block.** Indent four spaces under `Recent commits ...:`: + ```bash + git log --oneline -10 -- roadmap/<slug>.md + ``` + +6. **Emit the prompt.** Output exactly one fenced block, pre-filled with the resolved values. Use the appropriate template below verbatim. + +## Spec-stage template + +Emit this as a fenced ```text``` block, replacing the `{{...}}` tokens. + +````text +You are an independent reviewer doing the Spec → Ready sign-off on roadmap item +{{Rn}} in graphitron-rewrite. Goal: a go/no-go. Either flip the spec's status +to Ready (so the implementer can start), or request specific revisions (stays +in Spec for another pass). + +Repo: {{repo-root}} +Spec: {{spec-path}} (id: {{Rn}}, title: {{title}}, status: Spec) + +# Workflow rule + +Per roadmap/workflow.adoc § "States and transitions", the +Spec → Ready guard is "reviewer ≠ last committer". The "Reviewer rule" +paragraph below the state diagram pins the identifier: the comparison is by +Claude Code session ID, recorded as the `https://claude.ai/code/session_<id>` +trailer on each commit, not by git author or human identity. + +Recent spec-touching commits (most recent first): + +{{recent-commits}} + +Disqualified session ID: {{disqualified-session-id}} +(Fallback identifier — git author of the same commit: {{disqualified-author}}. +Used only when the disqualified session ID resolves to `<no-trailer>`, meaning +the spec-file commit predates the trailer-tracking convention; in that case +defer to the user's judgment that you are an independent session.) + +Your own session ID is in your system prompt, embedded in the trailer URL +Claude Code stamps on every commit. If it matches the disqualified ID, hand +off to a different session. + +# Sync first + +Before reading the spec, sync with trunk — the spec body may live in a commit +that hasn't reached your local branch: + + git fetch origin claude/graphitron-rewrite + git rebase origin/claude/graphitron-rewrite + +If the rebase conflicts, surface and stop until resolved. Don't review a +13-line stub that should be a 100-line plan. + +# Read first (in this order) + +1. {{spec-path}} (the spec under review) +2. docs/architecture/explanation/rewrite-design-principles.adoc (technical principles, esp. "Documentation names only live tests/code") +3. roadmap/workflow.adoc (state machine + reviewer-rule paragraph) +4. docs/architecture/index.adoc (architectural orientation) + +# What to assess + +Spec-stage framing: "is this plan sound enough to hand to an implementer", not +"is this code correct". + +- **Architectural soundness against principles.** Does the proposed shape align + with the rewrite-design-principles? Sealed hierarchies, generation-thinking, + classifier guarantees, validator-mirrors-classifier, etc. Surface any place + the spec pushes against a principle without justifying the trade. +- **Plan completeness.** Decisions left implicit that the implementer would have + to invent. Hedges where the spec should pick a side. +- **Test coverage adequacy.** Pipeline-tier, execution-tier, audit, resolver-tier + coverage as called for. Does the named coverage exercise what the spec + changes? Any scenarios missing? +- **Scope.** Is the "Out of scope" list honest? +- **Stale-reference rule.** Per "Documentation names only live tests/code": + every concrete code/test/symbol the spec names must exist as named, with the + cited paths and line numbers. Spot-check liberally; FQN-aware grep + (`grep -rn everyGraphitronFieldLeafHasAKnownDispatchStatus` rather than a + partial-symbol search) catches false negatives that a simple-name search misses. + +# Two acceptable outcomes + +1. **Sign off.** Use the `roadmap` skill to flip status from Spec → Ready, then + `publish` to push and fast-forward trunk. +2. **Request revisions.** Either commit revisions yourself on a fresh feature + branch (status stays Spec; the next pass's reviewer-session must be + different from yours, since you've now become the last committer), or + leave a note for the original author. Use the `roadmap` skill if you need a + `Spec → Spec` revise transition recorded. + +# Output + +For each material finding (if any): one line summarising, the spec section / line +it touches, the principle or workflow rule it bears on, and the suggested +revision shape. Then a final line: "Sign off: yes/no (and what to do next)". A +clean review can be three sentences. Don't pad. +```` + +## Implementation-stage template + +Emit this as a fenced ```text``` block, replacing the `{{...}}` tokens. + +````text +You are an independent reviewer doing the In Review → Done approval on roadmap +item {{Rn}} in graphitron-rewrite. Goal: a go/no-go. Either approve (delete the +spec file, optionally entry the changelog), or request rework (status flips +back to Ready for another implementation pass). + +Repo: {{repo-root}} +Spec: {{spec-path}} (id: {{Rn}}, title: {{title}}, status: In Review) + +# Workflow rule + +Per roadmap/workflow.adoc § "States and transitions", the +In Review → Done guard is "reviewer ≠ implementer". The "Reviewer rule" +paragraph below the state diagram pins the identifier: the comparison is by +Claude Code session ID, recorded as the `https://claude.ai/code/session_<id>` +trailer on each commit, not by git author or human identity. + +Recent commits referencing {{Rn}} (most recent first): + +{{recent-commits}} + +Disqualified session IDs (any session that authored a commit in the +implementation range): {{disqualified-session-ids}} +(Fallback identifiers — git authors of the same commits: {{disqualified-authors}}. +Used only for entries that resolve to `<no-trailer>`, meaning the commit +predates the trailer-tracking convention; in those cases defer to the user's +judgment that you are an independent session.) + +Your own session ID is in your system prompt, embedded in the trailer URL +Claude Code stamps on every commit. If it matches any disqualified ID, hand +off to a different session. + +# Sync first + +Before reading anything, sync with trunk — implementation commits may live on +trunk and not yet on your local branch: + + git fetch origin claude/graphitron-rewrite + git rebase origin/claude/graphitron-rewrite + +If the rebase conflicts, surface and stop until resolved. Reviewing a partial +diff is worse than waiting for a clean checkout. + +# Read first (in this order) + +1. {{spec-path}} (the contract; what the implementer was building) +2. The implementation diff: `git log --oneline -20` and + `git show <sha>` on the implementation commits. +3. docs/architecture/explanation/rewrite-design-principles.adoc (technical principles) +4. docs/architecture/index.adoc (architectural orientation) + +# What to assess + +Implementation-stage framing: spec is the contract, diff is the delivery. + +- **Spec → diff alignment.** Does the implementation deliver what the spec + promised? Anything the spec marked out-of-scope but landed anyway, or + anything in scope that didn't ship? +- **Architectural soundness in the diff.** Apply the principles from + rewrite-design-principles.adoc; surface any place the diff weakens or + contradicts them. The `reviewer-prompt` skill's "What to look for" list is + the canonical taxonomy if you want a checklist. +- **Test coverage.** Spec-named pipeline-tier, execution-tier, audit, and unit + tests are present and assert what the spec said they would assert. No + code-string assertions on generated method bodies. +- **Build green.** `mvn install -Plocal-db` passes. + A failing build is automatic rework. +- **Plan housekeeping.** The spec body should be marked up to reflect what + shipped: phases collapsed to one-line `shipped at <sha>` notes, remaining + work clearly named. + +# Two acceptable outcomes + +1. **Approve.** Delete the spec file (`rm {{spec-path}}`); if the milestone is + worth preserving, append a one-line entry to roadmap/ + changelog.md naming the {{Rn}} ID and landing commit SHAs. Regenerate the + README via the `roadmap` skill, commit on a fresh feature branch, then + `publish` to push and fast-forward trunk. +2. **Request rework.** Use the `roadmap` skill to flip status from In Review → + Ready and capture review feedback in the spec body for the next pass. The + reviewer-session ≠ implementer-session rule applies again next cycle. + +# Output + +For each material finding (if any): one line summarising, the file:line it +touches, the principle or spec section it bears on, and the suggested fix. +Then a final line: "Approve: yes/no (and what to do next)". Don't pad. +```` + +## Output rules + +- Exactly one fenced block. No "Here's the prompt:" preamble, no trailing notes — those break one-click copy. +- Pre-fill `{{Rn}}`, `{{repo-root}}`, `{{spec-path}}`, `{{title}}`, `{{recent-commits}}`, plus the disqualified-identifier pair: `{{disqualified-session-id}}` + `{{disqualified-author}}` (Spec stage, singular) or `{{disqualified-session-ids}}` + `{{disqualified-authors}}` (Implementation stage, plural). The user should not have to edit the block. When the trailer is absent, fill the session-ID slot with `<no-trailer>` literally; do not omit it. +- `{{recent-commits}}` is the literal output of `git log --oneline -10 -- <spec-path>`, indented four spaces. +- If any resolved disqualified session ID matches the invoking session's own ID (visible to the agent in its system prompt's commit-trailer URL), surface that fact in a short line *outside* the fenced block, but still emit the prompt — the user may want to forward it to a fresh agent. If every disqualified entry resolves to `<no-trailer>`, surface that the gate has no signal and the user must vouch for reviewer independence. + +## Hard rules + +- Always sync (step 0) before resolving the item. A stale checkout produces a stale recent-commits block, a stale disqualified-session-ID attribution, and — worst — hands the reviewer a spec body that's missing commits already on trunk. The emitted templates also instruct the reviewer to sync; the skill itself must sync too so the resolved values reflect truth. +- Do not perform the review yourself. The skill exists to hand off; doing the work in-session defeats the point of getting a second pair of eyes. +- Do not improvise the templates per call. Adjust pre-filled values; leave the body literal. Drift means each reviewer gets a different rubric. +- The prompt references files in the repo; it does not paste their contents. The reviewing agent reads them in its own session. +- The reviewer-rule guard cannot be bypassed because "the user said so". If the only available reviewer is a session that matches a disqualified session ID, surface it and stop — a different session must perform the review. +- For statuses other than `Spec` or `In Review`, no review handoff applies; tell the user and stop instead of forcing a template. diff --git a/.claude/web-environment.md b/.claude/web-environment.md new file mode 100644 index 0000000000..63a31f2967 --- /dev/null +++ b/.claude/web-environment.md @@ -0,0 +1,85 @@ +# Claude Code Web Environment Setup + +This document describes the build environment for Claude Code Web agent sessions. +It is not relevant when building locally or in CI. + +## Key Differences from Standard Setup + +- **No proxy required.** Direct internet access to Maven Central. Do not configure proxy + entries in `~/.m2/settings.xml`. The proxy at 21.0.0.129 previously used is no longer available. +- **Docker is unavailable.** `dockerd` fails to start because iptables/nft is not supported + (kernel too old). Use native PostgreSQL instead of TestContainers wherever possible. + +## Automatic setup (SessionStart hook) + +`.claude/scripts/session-start-web-env.sh` runs at the start of every web session and brings the +sandbox to a buildable state. Each step is idempotent and no-ops on local development. It: + +- **Installs JDK 25 and makes it the default.** The parent pom's enforcer requires Java >= 25, but + older sandbox images default to Java 21 and pin it via `/etc/profile.d/java.sh`. The hook installs + `openjdk-25-jdk-headless` if absent and retargets the alternatives plus that profile file, so + `JAVA_HOME` resolves to `/usr/lib/jvm/java-25-openjdk-amd64` in every new shell. +- **Brings up PostgreSQL for `-Plocal-db`.** Starts the cluster, sets the `postgres`/`postgres` + password (JDBC connects over 127.0.0.1 with scram-sha-256, while `sudo -u postgres` uses peer + auth), and creates + seeds the `rewrite_test` database from + `graphitron-sakila-db/src/main/resources/init.sql`. +- **Clears a stale Maven proxy.** Replaces `~/.m2/settings.xml` with an empty settings file if it + still carries the legacy `21.0.0.129` proxy that blocks Maven Central. +- **Builds libtree-sitter `0.26.9`.** `graphitron-lsp`'s jtreesitter 0.26 resolves runtime symbols + against an OS-installed `libtree-sitter`; apt's is 0.20.x, which predates `ts_language_abi_version`. + The hook fetches the release tarball over HTTPS and builds it. It uses the tarball rather than + `git clone` because in repo-scoped web sessions the git protocol is rewritten to a proxy path that + `403`s on third-party repos; plain HTTPS to `github.com` is unaffected. CI + (`.github/workflows/rewrite-build.yml`) clones the same `v0.26.9` directly (it has unrestricted + GitHub access), so the sandbox and CI exercise the same runtime version. + +Each step prints a one-line status message on success or failure. If a step fails, re-run the script +by hand (`.claude/scripts/session-start-web-env.sh`) or apply that step manually from its description +above. + +## Building the reactor + +The reactor builds from the root `pom.xml`. Run commands from the repository root: + +```bash +# 1. Build the full reactor (javapoet, graphitron, sakila-db, sakila-service, mcp, jakarta-rest, maven-plugin, sakila-example, ...). +# -Plocal-db switches jooq codegen in graphitron-sakila-db from TestContainers to native Postgres. +mvn install -Plocal-db + +# 2. Unit and structural tests for graphitron (no DB needed) +mvn test -pl :graphitron + +# 3. Compilation test: generated code compiles against real jOOQ classes +mvn compile -pl :graphitron-sakila-example -Plocal-db + +# 4. Execution tests: generated code runs against native PostgreSQL +mvn test -pl :graphitron-sakila-example -Plocal-db +``` + +For what each tier asserts, where its files live, and the `@UnitTier` / `@PipelineTier` / `@CompilationTier` / `@ExecutionTier` meta-annotations, see [`docs/architecture/how-to/testing.adoc`](../docs/architecture/how-to/testing.adoc). + +### Notes + +- The `local-db` profile is defined in `graphitron-sakila-db/pom.xml` + and switches jOOQ codegen from `ContainerDatabaseDriver` to + `org.postgresql.Driver` at `localhost:5432/rewrite_test`. +- Maven is at `/opt/maven/bin/mvn`; the SessionStart hook ensures Java 25 is the + default JVM (see [Automatic setup](#automatic-setup-sessionstart-hook)). The parent + pom's enforcer rule fails fast with a clear message if the JVM is older than 25. + +## Catalog-jar clobber — symptoms and recovery + +A cascade of `*PipelineTest` / `GraphitronSchemaBuilderTest` failures with `UnclassifiedType`, +`NoSuchElement`, or `table … could not be resolved in the jOOQ catalog` means the +`graphitron-sakila-db` jar in `~/.m2` is missing `DefaultCatalog` — it was installed +before the database was up, or re-installed without `-Plocal-db`. Don't bisect trunk; it's your +local repo. Recover with: + +```bash +mvn install -pl :graphitron-sakila-db -Plocal-db +``` + +**Footgun:** any later `mvn install` that hits `graphitron-sakila-db` without +`-Plocal-db` — e.g. `mvn install -pl X -am` that transitively rebuilds the catalog, or a full-tree +install — silently re-emits the jar with an empty jOOQ catalog and re-triggers the cascade. After +any broad install, re-run the `-Plocal-db` install for the catalog as a final step before testing. diff --git a/.github/workflows/maven-build.yml b/.github/workflows/maven-build.yml deleted file mode 100644 index bfcc480e79..0000000000 --- a/.github/workflows/maven-build.yml +++ /dev/null @@ -1,46 +0,0 @@ -# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time -# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-maven - -name: CI build - -permissions: - contents: read - -on: - push: - branches: [ "main" ] - pull_request: - branches: [ "main" ] - -jobs: - tests: - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - include: - - name: default - mvn-args: verify javadoc:javadoc - - name: variant-upsert-as-merge - mvn-args: -Pvariant-upsert-as-merge verify -pl :graphitron-example-server -am -Dtest=ApprovalQueryTest -Dsurefire.failIfNoSpecifiedTests=false - - name: variant-jdbc-batching - mvn-args: -Pvariant-jdbc-batching verify -pl :graphitron-example-server -am -Dtest=ApprovalQueryTest -Dsurefire.failIfNoSpecifiedTests=false - name: ${{ matrix.name }} - steps: - - uses: actions/checkout@v6 - - name: Set up JDK 21 - uses: actions/setup-java@v5 - with: - java-version: '21' - distribution: 'temurin' - cache: maven - - name: Build with Maven - run: mvn --batch-mode ${{ matrix.mvn-args }} --file pom.xml - - # Aggregator job so the required `build` status check (configured in branch - # protection) reports a single result after all matrix entries finish. - build: - needs: tests - runs-on: ubuntu-latest - steps: - - run: echo "All matrix entries succeeded" diff --git a/.github/workflows/maven-publish.yml b/.github/workflows/maven-publish.yml index a56b6f4636..1334f9ccaa 100644 --- a/.github/workflows/maven-publish.yml +++ b/.github/workflows/maven-publish.yml @@ -1,49 +1,107 @@ -name: Maven Package +name: Maven Publish (rewrite) + +# Releases are tag-driven. Publish a build by creating a GitHub Release whose +# tag matches v<MAJOR>.<MINOR>.<PATCH> or v<MAJOR>.<MINOR>.<PATCH>-RC<n>: +# +# v10.0.0-RC1, v10.0.0-RC2, ..., v10.0.0 +# +# Maven version ordering treats `10.0.0-RC1` as strictly less than `10.0.0`, +# so consumers asking for `[10.0.0,)` won't pick up RCs by accident. RCs are +# published to Maven Central just like final releases (signed, sources + +# javadoc jars, autoPublish=true via central-publishing-maven-plugin). on: release: types: [created] +permissions: + contents: read + jobs: - publish: + release: runs-on: ubuntu-latest - permissions: - contents: read - packages: write + + # Mirrors rewrite-build.yml: jOOQ codegen in graphitron-sakila-db and the + # execution-tier tests in graphitron-sakila-example need a real Postgres + # under -Plocal-db. The publish job runs `clean deploy`, so the same + # services + libtree-sitter setup the regular CI job needs applies here. + services: + postgres: + image: postgres:18 + env: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_DB: rewrite_test + ports: + - 5432:5432 + options: >- + --health-cmd "pg_isready -U postgres" + --health-interval 10s + --health-timeout 5s + --health-retries 5 + steps: - - uses: actions/checkout@v6 - - - name: Set up Java for publishing to Maven Central - uses: actions/setup-java@v5 - with: - java-version: '21' - distribution: 'temurin' - server-id: central - server-username: MAVEN_USERNAME - server-password: MAVEN_PASSWORD - gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }} - gpg-passphrase: MAVEN_GPG_PASSPHRASE - - - name: Validate and extract version from release tag - run: | - # Extract version from GitHub release tag (e.g. v5.0.1 -> 5.0.1) - TAG=${GITHUB_REF#refs/tags/} - - # Validate the tag format (should be v<MAJOR>.<MINOR>.<PATCH>) - if ! [[ $TAG =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then - echo "ERROR: Tag format is invalid. Must be v<MAJOR>.<MINOR>.<PATCH> (e.g. v7.1.2)" - exit 1 - fi - - VERSION=${TAG#v} - echo "Extracted VERSION: $VERSION" - - # Update the version for release - mvn versions:set -DnewVersion=$VERSION -DgenerateBackupPoms=false - - - name: Build and publish to Maven Central - run: mvn --batch-mode --errors clean deploy -P release - env: - MAVEN_USERNAME: ${{ secrets.CENTRAL_PORTAL_USERNAME }} - MAVEN_PASSWORD: ${{ secrets.CENTRAL_PORTAL_TOKEN }} - MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} \ No newline at end of file + - uses: actions/checkout@v6 + + - name: Set up Java for publishing to Maven Central + uses: actions/setup-java@v5 + with: + java-version: '25' + distribution: 'temurin' + cache: maven + server-id: central + server-username: MAVEN_USERNAME + server-password: MAVEN_PASSWORD + gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }} + gpg-passphrase: MAVEN_GPG_PASSPHRASE + + - name: Build + install libtree-sitter from source + # graphitron-lsp's NativeLibraryBundleTest loads the grammar binary from + # graphitron-tree-sitter-natives; jtreesitter 0.26 then looks up runtime + # symbols against an OS-installed libtree-sitter. Ubuntu apt's + # libtree-sitter0 is pinned to 0.20.x which predates ts_language_abi_version, + # so we build the runtime from upstream source at the version matching + # the natives jar's parser ABI. + run: | + set -euo pipefail + VERSION=v0.26.9 + TMPDIR=$(mktemp -d) && trap "rm -rf $TMPDIR" EXIT + git clone --depth=1 --branch=$VERSION https://github.com/tree-sitter/tree-sitter $TMPDIR/ts + make -C $TMPDIR/ts + sudo make -C $TMPDIR/ts install + sudo ldconfig + + - name: Apply graphitron-sakila-db init.sql + # The local-db profile expects database `rewrite_test` to exist with the rewrite-test + # schema applied. The Postgres service container creates the database; this step + # loads the public + nodeidfixture + idreffixture + multischema_a + multischema_b + # tables that the jOOQ codegen reads. + env: + PGPASSWORD: postgres + run: | + psql -h localhost -p 5432 -U postgres -d rewrite_test \ + -f graphitron-sakila-db/src/main/resources/init.sql + + - name: Validate and extract version from release tag + run: | + # Extract version from GitHub release tag (e.g. v10.0.0-RC1 -> 10.0.0-RC1) + TAG=${GITHUB_REF#refs/tags/} + + # Validate the tag format (v<MAJOR>.<MINOR>.<PATCH> with optional -RC<n>) + if ! [[ $TAG =~ ^v[0-9]+\.[0-9]+\.[0-9]+(-RC[0-9]+)?$ ]]; then + echo "ERROR: Tag format is invalid. Must be v<MAJOR>.<MINOR>.<PATCH> or v<MAJOR>.<MINOR>.<PATCH>-RC<n> (e.g. v10.0.0, v10.0.0-RC1)" + exit 1 + fi + + VERSION=${TAG#v} + echo "Extracted VERSION: $VERSION" + + # Update the version for release across the reactor + mvn versions:set -DnewVersion=$VERSION -DgenerateBackupPoms=false -DprocessAllModules=true + + - name: Build and publish release to Maven Central + run: mvn --batch-mode --errors -Prelease,local-db clean deploy + env: + MAVEN_USERNAME: ${{ secrets.CENTRAL_PORTAL_USERNAME }} + MAVEN_PASSWORD: ${{ secrets.CENTRAL_PORTAL_TOKEN }} + MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} diff --git a/.github/workflows/preview-docs.yml b/.github/workflows/preview-docs.yml new file mode 100644 index 0000000000..462cb0dedf --- /dev/null +++ b/.github/workflows/preview-docs.yml @@ -0,0 +1,32 @@ +name: Preview docs (PR artifact) + +on: + pull_request: + paths: + - 'docs/**' + - 'roadmap/**' + - 'pom.xml' + - '.github/workflows/preview-docs.yml' + +permissions: + contents: read + +jobs: + preview: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - name: Set up JDK 25 + uses: actions/setup-java@v5 + with: + java-version: '25' + distribution: 'temurin' + cache: maven + - name: Build docs site + run: mvn -pl :graphitron-docs -am package -DskipTests + - name: Upload preview artifact + uses: actions/upload-artifact@v7 + with: + name: graphitron-docs-preview-${{ github.event.pull_request.number }} + path: docs/target/generated-docs + retention-days: 14 diff --git a/.github/workflows/rewrite-build.yml b/.github/workflows/rewrite-build.yml new file mode 100644 index 0000000000..169fa67ec4 --- /dev/null +++ b/.github/workflows/rewrite-build.yml @@ -0,0 +1,138 @@ +name: Rewrite reactor CI + +on: + push: + branches: + - main + - claude/graphitron-rewrite + pull_request: + branches: + - main + - claude/graphitron-rewrite + +permissions: + contents: read + +jobs: + build: + runs-on: ubuntu-latest + + # Native Postgres service so `-Plocal-db` resolves jdbc:postgresql://localhost:5432 + # to a real instance during graphitron-sakila-db's jooq-codegen and the + # graphitron-sakila-example execution-tier tests. Mirrors the .claude/web-environment + # setup (which the web sandbox runs with native pg because Docker is unavailable + # there); CI here uses the same -Plocal-db code path so no second profile drifts. + services: + postgres: + image: postgres:18 + env: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_DB: rewrite_test + ports: + - 5432:5432 + options: >- + --health-cmd "pg_isready -U postgres" + --health-interval 10s + --health-timeout 5s + --health-retries 5 + + steps: + - uses: actions/checkout@v6 + - name: Set up JDK 25 + uses: actions/setup-java@v5 + with: + java-version: '25' + distribution: 'temurin' + cache: maven + - name: Build + install libtree-sitter from source + # graphitron-lsp's NativeLibraryBundleTest loads the grammar binary from + # graphitron-tree-sitter-natives; jtreesitter 0.26 then looks up runtime + # symbols against an OS-installed libtree-sitter. Ubuntu apt's + # libtree-sitter0 is pinned to 0.20.x which predates ts_language_abi_version, + # so we build the runtime from upstream source at the version matching + # the natives jar's parser ABI. + run: | + set -euo pipefail + VERSION=v0.26.9 + TMPDIR=$(mktemp -d) && trap "rm -rf $TMPDIR" EXIT + git clone --depth=1 --branch=$VERSION https://github.com/tree-sitter/tree-sitter $TMPDIR/ts + make -C $TMPDIR/ts + sudo make -C $TMPDIR/ts install + sudo ldconfig + - name: Apply graphitron-sakila-db init.sql + # The local-db profile expects database `rewrite_test` to exist with the rewrite-test + # schema applied. The Postgres service container creates the database; this step + # loads the public + nodeidfixture + idreffixture + multischema_a + multischema_b + # tables that the jOOQ codegen reads. + env: + PGPASSWORD: postgres + run: | + psql -h localhost -p 5432 -U postgres -d rewrite_test \ + -f graphitron-sakila-db/src/main/resources/init.sql + - name: Build rewrite reactor + # The leaf-coverage profile (parent pom) is active by default; its activation + # is property-based negation on -Dleaf-coverage.skip, so the classifier traces + # are emitted on every CI run. Local opt-out for faster turnaround is + # -Dleaf-coverage.skip; CI does not opt out. + run: mvn verify -Plocal-db --batch-mode + - name: Regenerate leaf-coverage report + # Trunk-push only. PRs and main pushes skip; the artifact only feeds the + # downstream docs-build/docs-deploy jobs, which are themselves trunk-gated. + if: github.event_name == 'push' && github.ref == 'refs/heads/claude/graphitron-rewrite' + run: | + mvn -pl roadmap-tool exec:java -q \ + -Dexec.args='leaf-coverage .' + - name: Upload leaf-coverage artifact + if: github.event_name == 'push' && github.ref == 'refs/heads/claude/graphitron-rewrite' + uses: actions/upload-artifact@v7 + with: + name: inference-axis-coverage + path: roadmap/inference-axis-coverage.adoc + if-no-files-found: error + + docs-build: + # Renders the docs site against the freshly-regenerated leaf-coverage report + # produced by the `build` job. Trunk-push only; PRs use preview-docs.yml. + needs: build + if: github.event_name == 'push' && github.ref == 'refs/heads/claude/graphitron-rewrite' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - name: Set up JDK 25 + uses: actions/setup-java@v5 + with: + java-version: '25' + distribution: 'temurin' + cache: maven + - name: Download leaf-coverage artifact + # Lands at roadmap/inference-axis-coverage.adoc and + # overwrites the committed placeholder in this checkout. + uses: actions/download-artifact@v8 + with: + name: inference-axis-coverage + path: roadmap/ + - name: Build docs site + run: mvn -pl :graphitron-docs -am package -DskipTests + - name: Upload Pages artifact + uses: actions/upload-pages-artifact@v3 + with: + path: docs/target/generated-docs + + docs-deploy: + needs: docs-build + if: github.event_name == 'push' && github.ref == 'refs/heads/claude/graphitron-rewrite' + runs-on: ubuntu-latest + permissions: + pages: write + id-token: write + concurrency: + group: pages + cancel-in-progress: false + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/tree-sitter-natives-release.yml b/.github/workflows/tree-sitter-natives-release.yml index ca6b5146c0..8e13f25a4f 100644 --- a/.github/workflows/tree-sitter-natives-release.yml +++ b/.github/workflows/tree-sitter-natives-release.yml @@ -9,7 +9,7 @@ on: workflow_dispatch: inputs: tree-sitter-cli-version: - description: 'Upstream tree-sitter CLI tag to build with (must match runtime version pinned in pom.xml).' + description: 'Upstream tree-sitter tag. Pins both the CLI used to build the grammar and the source checkout the bundled libtree-sitter runtime is built from. Must match the runtime version in pom.xml (e.g. tag v0.26.9 -> pom 0.26.9-<build-n>).' required: true default: 'v0.26.9' dry-run: @@ -21,8 +21,8 @@ permissions: contents: read env: - NATIVES_MODULE: graphitron-rewrite/graphitron-tree-sitter-natives - GRAMMAR_DIR: graphitron-rewrite/graphitron-tree-sitter-natives/src/main/native/grammars/graphql + NATIVES_MODULE: graphitron-tree-sitter-natives + GRAMMAR_DIR: graphitron-tree-sitter-natives/src/main/native/grammars/graphql jobs: build-matrix: @@ -35,27 +35,27 @@ jobs: - platform: linux-x86_64 runner: ubuntu-latest lib-name: libtree-sitter-graphql.so + runtime-name: libtree-sitter.so cli-asset: tree-sitter-linux-x64.gz cli-binary: tree-sitter - platform: linux-aarch64 runner: ubuntu-24.04-arm lib-name: libtree-sitter-graphql.so + runtime-name: libtree-sitter.so cli-asset: tree-sitter-linux-arm64.gz cli-binary: tree-sitter - - platform: macos-x86_64 - runner: macos-13 - lib-name: libtree-sitter-graphql.dylib - cli-asset: tree-sitter-macos-x64.gz - cli-binary: tree-sitter - platform: macos-aarch64 runner: macos-14 lib-name: libtree-sitter-graphql.dylib + runtime-name: libtree-sitter.dylib cli-asset: tree-sitter-macos-arm64.gz cli-binary: tree-sitter - platform: windows-x86_64 runner: windows-latest lib-name: tree-sitter-graphql.dll - cli-asset: tree-sitter-windows-x64.zip + # Windows DLLs follow platform convention: no "lib" prefix (matches the grammar). + runtime-name: tree-sitter.dll + cli-asset: tree-sitter-windows-x64.gz cli-binary: tree-sitter.exe steps: - uses: actions/checkout@v6 @@ -122,11 +122,136 @@ jobs: } Write-Output "OK: tree_sitter_graphql exported" - - name: Upload binary artifact - uses: actions/upload-artifact@v4 + # ---- tree-sitter runtime (libtree-sitter) ------------------------------- + # Built from the same pinned upstream tag as the grammar, but from source + # (the `lib/` directory) rather than the CLI binary. Bundling it removes + # the LSP's only system dependency. Provenance + flags: see the natives + # module UPSTREAM.md "Runtime provenance" section. + + - name: Build libtree-sitter runtime (POSIX) + if: runner.os != 'Windows' + shell: bash + run: | + set -euo pipefail + src="$RUNNER_TEMP/ts-src" + out="$RUNNER_TEMP/out" + mkdir -p "$out" + git clone --depth=1 --branch="${{ inputs.tree-sitter-cli-version }}" \ + https://github.com/tree-sitter/tree-sitter "$src" + make -C "$src" CFLAGS="-O3" + # The top-level make leaves an unversioned shared-lib symlink at the repo + # root; fall back to the newest versioned artifact if the name differs. + built="$src/${{ matrix.runtime-name }}" + if [[ ! -e "$built" ]]; then + built="$(ls -1 "$src/${{ matrix.runtime-name }}"* 2>/dev/null | sort | tail -n1)" + fi + # -L dereferences the symlink so we stage the real binary under the canonical name. + cp -L "$built" "$out/${{ matrix.runtime-name }}" + ls -la "$out/${{ matrix.runtime-name }}" + + - name: Set up MSYS2 + MinGW-w64 (Windows runtime build) + if: runner.os == 'Windows' + uses: msys2/setup-msys2@v2 + with: + msystem: MINGW64 + update: false + install: >- + git + make + mingw-w64-x86_64-gcc + + - name: Build libtree-sitter runtime (Windows, MinGW-w64) + if: runner.os == 'Windows' + shell: msys2 {0} + run: | + set -euo pipefail + tmp="$(cygpath -u "$RUNNER_TEMP")" + src="$tmp/ts-src" + out="$tmp/out" + mkdir -p "$out" + git clone --depth=1 --branch="${{ inputs.tree-sitter-cli-version }}" \ + https://github.com/tree-sitter/tree-sitter "$src" + # In the MSYS2 MINGW64 environment the unprefixed gcc/ar (from + # mingw-w64-x86_64-gcc, in /mingw64/bin) ARE the native x86_64 + # mingw-w64 toolchain. The triplet-prefixed x86_64-w64-mingw32-ar + # alias is not installed, so use the unprefixed names. + # Static-link the MinGW runtime so the DLL carries no libgcc_s_seh-1 / + # libwinpthread-1 transitive deps (enforced by the dependents allowlist below). + make -C "$src" \ + CC=gcc \ + AR=ar \ + CFLAGS="-O3" \ + LDFLAGS="-static -static-libgcc" + built="$(ls -1 "$src"/libtree-sitter.dll "$src"/*.dll 2>/dev/null | head -n1)" + cp "$built" "$out/${{ matrix.runtime-name }}" + ls -la "$out/${{ matrix.runtime-name }}" + + - name: Verify runtime exported symbols (POSIX) + if: runner.os != 'Windows' + shell: bash + run: | + set -euo pipefail + lib="$RUNNER_TEMP/out/${{ matrix.runtime-name }}" + nm_out="$(nm -gU "$lib" 2>/dev/null || nm -g --defined-only "$lib")" + for sym in ts_language_abi_version ts_parser_new ts_parser_parse ts_parser_delete; do + echo "$nm_out" | grep -E "(^| )_?$sym( |$)" >/dev/null \ + || { echo "::error::$sym not exported in $lib"; exit 1; } + done + echo "OK: runtime exports ts_language_abi_version + core ts_parser_*" + + - name: Verify runtime transitive deps (POSIX allowlist) + if: runner.os != 'Windows' + shell: bash + run: | + set -euo pipefail + lib="$RUNNER_TEMP/out/${{ matrix.runtime-name }}" + if [[ "$RUNNER_OS" == "macOS" ]]; then + # otool -L: allow only the macOS system frameworks + the lib's own install id. + bad="$(otool -L "$lib" | tail -n +2 | awk '{print $1}' \ + | grep -vE '^(/usr/lib/|/System/Library/)' | grep -vE 'libtree-sitter' || true)" + else + # ldd: allow only glibc + the dynamic loader + the base gcc runtime. Anything + # else (a vendored or third-party .so) means we are shipping provenance we do not own. + bad="$(ldd "$lib" | awk '{print $1}' \ + | grep -vE '(linux-vdso|ld-linux|libc\.so|libm\.so|libdl\.so|libpthread\.so|librt\.so|libgcc_s\.so)' || true)" + fi + if [[ -n "$bad" ]]; then + echo "::error::runtime links against non-allowlisted libraries:"; echo "$bad"; exit 1 + fi + echo "OK: runtime links only against the per-platform system allowlist" + + - name: Verify runtime exported symbols + deps (Windows) + if: runner.os == 'Windows' + shell: pwsh + run: | + $lib = "$env:RUNNER_TEMP/out/${{ matrix.runtime-name }}" + $vswhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" + $vsroot = & "$vswhere" -latest -property installationPath + $dumpbin = Get-ChildItem -Path "$vsroot\VC\Tools\MSVC" -Recurse -Filter dumpbin.exe | + Select-Object -First 1 -ExpandProperty FullName + if (-not $dumpbin) { Write-Error "dumpbin.exe not found"; exit 1 } + $exports = & "$dumpbin" /exports "$lib" + foreach ($sym in @('ts_language_abi_version','ts_parser_new','ts_parser_parse','ts_parser_delete')) { + if (-not ($exports -match $sym)) { Write-Error "$sym not exported in $lib"; exit 1 } + } + Write-Output "OK: runtime exports ts_language_abi_version + core ts_parser_*" + # dumpbin /dependents: allow only the Windows system CRT/kernel DLLs. A MinGW + # runtime dep (libgcc_s_seh-1.dll / libwinpthread-1.dll) here means static-link failed. + $deps = & "$dumpbin" /dependents "$lib" + $allow = '^(kernel32|ucrtbase|vcruntime\d*|msvcrt|ntdll|advapi32|api-ms-win-[\w-]+)\.dll$' + $bad = $deps | + Select-String -Pattern '^\s+\S+\.dll\s*$' | + ForEach-Object { $_.Line.Trim() } | + Where-Object { $_ -notmatch $allow } + if ($bad) { Write-Error "runtime links against non-allowlisted DLLs:`n$($bad -join "`n")"; exit 1 } + Write-Output "OK: runtime links only against the Windows system DLL allowlist" + + - name: Upload binary artifacts + uses: actions/upload-artifact@v7 with: name: native-${{ matrix.platform }} - path: ${{ runner.temp }}/out/${{ matrix.lib-name }} + # Whole out/ dir: grammar + runtime, both staged under their canonical names. + path: ${{ runner.temp }}/out if-no-files-found: error retention-days: 7 @@ -150,7 +275,7 @@ jobs: gpg-passphrase: MAVEN_GPG_PASSPHRASE - name: Download all native artifacts - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: path: native-artifacts/ pattern: native-* @@ -160,7 +285,7 @@ jobs: set -euo pipefail base="$NATIVES_MODULE/target/classes/lib" mkdir -p "$base" - for platform in linux-x86_64 linux-aarch64 macos-x86_64 macos-aarch64 windows-x86_64; do + for platform in linux-x86_64 linux-aarch64 macos-aarch64 windows-x86_64; do src="native-artifacts/native-$platform" if [[ ! -d "$src" ]]; then echo "::error::missing artifact directory $src" @@ -176,26 +301,33 @@ jobs: mvn -f "$NATIVES_MODULE/pom.xml" --batch-mode --errors package -DskipTests - name: Assert jar layout - # Exactly five lib/<os>-<arch>/<file> entries; any other lib/* path is a bug. + # Exactly eight lib/<os>-<arch>/<file> entries (four grammar + four runtime); + # any other lib/* path is a bug. run: | set -euo pipefail - jar_path="$(ls $NATIVES_MODULE/target/graphitron-tree-sitter-natives-*.jar)" + # Pin to the main artifact; the broad glob also matches -sources.jar and -javadoc.jar. + version="$(grep -m1 '<version>' $NATIVES_MODULE/pom.xml | sed -E 's|.*<version>([^<]+)</version>.*|\1|')" + jar_path="$NATIVES_MODULE/target/graphitron-tree-sitter-natives-${version}.jar" echo "Inspecting $jar_path" unzip -l "$jar_path" - lib_entries="$(unzip -l "$jar_path" | awk '{print $4}' | grep -E '^lib/' || true)" + # Filter out the bare lib/ and lib/<os>-<arch>/ directory entries unzip -l also prints. + lib_entries="$(unzip -l "$jar_path" | awk '{print $4}' | grep -E '^lib/.+[^/]$' || true)" expected="lib/linux-aarch64/libtree-sitter-graphql.so + lib/linux-aarch64/libtree-sitter.so lib/linux-x86_64/libtree-sitter-graphql.so + lib/linux-x86_64/libtree-sitter.so lib/macos-aarch64/libtree-sitter-graphql.dylib - lib/macos-x86_64/libtree-sitter-graphql.dylib - lib/windows-x86_64/tree-sitter-graphql.dll" + lib/macos-aarch64/libtree-sitter.dylib + lib/windows-x86_64/tree-sitter-graphql.dll + lib/windows-x86_64/tree-sitter.dll" expected="$(echo "$expected" | sed 's/^ *//' | sort)" actual="$(echo "$lib_entries" | sort)" if [[ "$actual" != "$expected" ]]; then - echo "::error::jar lib/ contents do not match expected five entries" + echo "::error::jar lib/ contents do not match the expected eight entries" diff <(echo "$expected") <(echo "$actual") || true exit 1 fi - echo "OK: jar layout matches exactly the five expected lib/<os>-<arch>/ entries" + echo "OK: jar layout matches exactly the eight expected lib/<os>-<arch>/ entries" - name: Deploy to Maven Central if: ${{ !inputs.dry-run }} @@ -229,8 +361,6 @@ jobs: runner: ubuntu-latest - platform: linux-aarch64 runner: ubuntu-24.04-arm - - platform: macos-x86_64 - runner: macos-13 - platform: macos-aarch64 runner: macos-14 - platform: windows-x86_64 @@ -244,34 +374,10 @@ jobs: java-version: '25' distribution: 'temurin' - - name: Install libtree-sitter (Linux) - if: runner.os == 'Linux' - shell: bash - run: | - set -euo pipefail - sudo apt-get update - sudo apt-get install -y libtree-sitter0 - - - name: Install libtree-sitter (macOS) - if: runner.os == 'macOS' - shell: bash - run: | - set -euo pipefail - brew install tree-sitter - - - name: Install libtree-sitter (Windows) - if: runner.os == 'Windows' - shell: pwsh - run: | - $ErrorActionPreference = "Stop" - & "$env:VCPKG_INSTALLATION_ROOT/vcpkg.exe" install tree-sitter:x64-windows - $binDir = "$env:VCPKG_INSTALLATION_ROOT/installed/x64-windows/bin" - if (-not (Test-Path "$binDir/tree-sitter.dll")) { - Write-Error "tree-sitter.dll not found in $binDir after vcpkg install" - exit 1 - } - # Append to PATH so the verifier JVM's System.loadLibrary chain finds it. - Add-Content -Path $env:GITHUB_PATH -Value $binDir + # No "Install libtree-sitter" step: the whole point of this item is that the + # runtime now ships inside the jar. The verifier below composes the bundled + # runtime and must load+parse with NO system libtree-sitter present, proving + # the jar is self-sufficient on every platform. - name: Resolve published jar into a clean local m2 shell: bash @@ -300,10 +406,72 @@ jobs: - name: Write verifier harness # Standalone load+parse against the published jar. Inlined to decouple # this stage from any in-flight graphitron-lsp test class. + # + # jtreesitter resolves the runtime (ts_* symbols) NOT from the + # SymbolLookup passed to Language.load, but through its own + # NativeLibraryLookup SPI chain at TreeSitter.<clinit>. So to load with + # no system libtree-sitter we must register an SPI service that hands + # back the bundled runtime, exactly as graphitron-lsp's + # BundledLibraryLookup does. The grammar entry point is supplied + # separately via Language.load. RuntimeBundleLookup is that SPI; + # Verify.main supplies the grammar. shell: bash run: | set -euo pipefail - mkdir -p verifier + mkdir -p verifier/META-INF/services + echo "RuntimeBundleLookup" > verifier/META-INF/services/io.github.treesitter.jtreesitter.NativeLibraryLookup + + cat > verifier/RuntimeBundleLookup.java <<'JAVA' + import io.github.treesitter.jtreesitter.NativeLibraryLookup; + import java.io.InputStream; + import java.lang.foreign.Arena; + import java.lang.foreign.SymbolLookup; + import java.nio.file.Files; + import java.nio.file.Path; + import java.nio.file.StandardCopyOption; + import java.util.Locale; + + /** + * jtreesitter NativeLibraryLookup SPI that supplies the bundled + * tree-sitter runtime (the ts_* symbols) from the natives jar. This + * mirrors graphitron-lsp's BundledLibraryLookup: jtreesitter calls it + * at TreeSitter.<clinit> to bind the runtime, with no system + * libtree-sitter present. + */ + public final class RuntimeBundleLookup implements NativeLibraryLookup { + public RuntimeBundleLookup() {} + + @Override + public SymbolLookup get(Arena arena) { + String os = System.getProperty("os.name", "").toLowerCase(Locale.ROOT); + String arch = System.getProperty("os.arch", "").toLowerCase(Locale.ROOT); + String dir, runtimeName; + if (os.contains("linux") && (arch.equals("amd64") || arch.equals("x86_64"))) { + dir = "linux-x86_64"; runtimeName = "libtree-sitter.so"; + } else if (os.contains("linux") && arch.equals("aarch64")) { + dir = "linux-aarch64"; runtimeName = "libtree-sitter.so"; + } else if (os.contains("mac") && arch.equals("aarch64")) { + dir = "macos-aarch64"; runtimeName = "libtree-sitter.dylib"; + } else if (os.contains("windows") && (arch.equals("amd64") || arch.equals("x86_64"))) { + dir = "windows-x86_64"; runtimeName = "tree-sitter.dll"; + } else { + throw new IllegalStateException("unsupported os/arch: " + os + "/" + arch); + } + String resource = "lib/" + dir + "/" + runtimeName; + try { + Path target = Files.createTempFile("verify-rt-", "-" + runtimeName); + try (InputStream in = RuntimeBundleLookup.class.getClassLoader().getResourceAsStream(resource)) { + if (in == null) throw new IllegalStateException("missing classpath resource: " + resource); + Files.copy(in, target, StandardCopyOption.REPLACE_EXISTING); + } + return SymbolLookup.libraryLookup(target, arena); + } catch (Exception e) { + throw new RuntimeException("failed to load bundled runtime " + resource, e); + } + } + } + JAVA + cat > verifier/Verify.java <<'JAVA' import io.github.treesitter.jtreesitter.Language; import io.github.treesitter.jtreesitter.Parser; @@ -325,8 +493,6 @@ jobs: dir = "linux-x86_64"; libName = "libtree-sitter-graphql.so"; } else if (os.contains("linux") && arch.equals("aarch64")) { dir = "linux-aarch64"; libName = "libtree-sitter-graphql.so"; - } else if (os.contains("mac") && (arch.equals("amd64") || arch.equals("x86_64"))) { - dir = "macos-x86_64"; libName = "libtree-sitter-graphql.dylib"; } else if (os.contains("mac") && arch.equals("aarch64")) { dir = "macos-aarch64"; libName = "libtree-sitter-graphql.dylib"; } else if (os.contains("windows") && (arch.equals("amd64") || arch.equals("x86_64"))) { @@ -334,15 +500,13 @@ jobs: } else { throw new IllegalStateException("unsupported os/arch: " + os + "/" + arch); } - String resource = "lib/" + dir + "/" + libName; - Path extracted = Files.createTempFile("verify-", "-" + libName); - try (InputStream in = Verify.class.getClassLoader().getResourceAsStream(resource)) { - if (in == null) throw new IllegalStateException("missing classpath resource: " + resource); - Files.copy(in, extracted, StandardCopyOption.REPLACE_EXISTING); - } + // The runtime (ts_* symbols) comes from RuntimeBundleLookup (the registered + // NativeLibraryLookup SPI) with NO system libtree-sitter present. Language.load + // only needs the grammar entry point, so we hand it just the grammar lookup. + Path grammarLib = extract("lib/" + dir + "/" + libName, libName); try (Arena arena = Arena.ofConfined()) { - SymbolLookup symbols = SymbolLookup.libraryLookup(extracted, arena); - Language language = Language.load(symbols, "tree_sitter_graphql"); + SymbolLookup grammar = SymbolLookup.libraryLookup(grammarLib, arena); + Language language = Language.load(grammar, "tree_sitter_graphql"); try (Parser parser = new Parser(language)) { Tree tree = parser.parse("type Query { hello: String }").orElseThrow(); try (tree) { @@ -350,11 +514,21 @@ jobs: boolean hasError = tree.getRootNode().hasError(); if (!"source_file".equals(type)) throw new IllegalStateException("root type: " + type); if (hasError) throw new IllegalStateException("parse produced errors"); - System.out.println("OK: parsed source_file with no errors on " + dir); + System.out.println("OK: parsed source_file with no errors on " + dir + + " (bundled runtime via SPI, no system libtree-sitter)"); } } } } + + private static Path extract(String resource, String name) throws Exception { + Path target = Files.createTempFile("verify-", "-" + name); + try (InputStream in = Verify.class.getClassLoader().getResourceAsStream(resource)) { + if (in == null) throw new IllegalStateException("missing classpath resource: " + resource); + Files.copy(in, target, StandardCopyOption.REPLACE_EXISTING); + } + return target; + } } JAVA @@ -377,5 +551,7 @@ jobs: sep=":" if [[ "$RUNNER_OS" == "Windows" ]]; then sep=";"; fi cp="$JTREESITTER_JAR$sep$NATIVES_JAR" - javac -cp "$cp" -d verifier verifier/Verify.java + javac -cp "$cp" -d verifier verifier/RuntimeBundleLookup.java verifier/Verify.java + # The `verifier` dir carries the compiled SPI class + its META-INF/services + # registration, so jtreesitter's ServiceLoader picks up RuntimeBundleLookup. java --enable-native-access=ALL-UNNAMED -cp "verifier$sep$cp" Verify diff --git a/.gitignore b/.gitignore index 04e32cef45..7f9677f8bf 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,10 @@ target/ dist/ .flattened-pom.xml /pom.xml.versionsBackup +.mvn/ + +# quarkus-web-bundler stages mvnpm packages here at mvn install time +node_modules/ # Generated by Eclipse .project @@ -24,6 +28,8 @@ CLAUDE.local.md thoughts/ .claude/worktrees/ .claude/commands/local/ +.claude/settings.local.json +scratch/ /graphitron-example/graphitron-example-server/.approval_tests** /graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/jooq/generated/** diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0f1c971379..9817c25918 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,33 +1,37 @@ -# Publishes Graphitron to the Sikt GitLab Packages Maven registry as a -# secondary distribution channel alongside Maven Central. +# Publishes the graphitron-rewrite reactor to the Sikt GitLab Packages Maven +# registry as a secondary distribution channel alongside Maven Central. # See https://platon.sikt.no/tjenester/package_registry # # Triggers: -# - tags matching v<MAJOR>.<MINOR>.<PATCH> -> release deploy -# - pushes to the default branch -> SNAPSHOT deploy +# - tags matching v<MAJOR>.<MINOR>.<PATCH>(-RC<n>)? -> release deploy +# +# Default-branch pushes do not trigger any publish. Snapshots are not a +# useful consumer-facing artifact: consumers depend on release coordinates, +# and developer caches do not need a registry round-trip. # # Auth uses CI_JOB_TOKEN, which has write access to this project's # package registry by default; no manual secrets required. # -# Tests are skipped here. Tests and javadoc generation run in the GitHub -# CI build that gates merges to main and tags. The GitLab pipeline only -# republishes the same source tree to GitLab Packages as a secondary -# distribution channel, so re-running tests adds no value and would -# require Docker-in-Docker for the jOOQ codegen testcontainer. +# Tests and jOOQ codegen run here. The original incarnation of this pipeline +# skipped tests because Testcontainers needed Docker-in-Docker and "tests run +# in GitHub anyway"; both legs are obsolete. The publish job now provisions a +# Postgres service and uses -Plocal-db to avoid Docker, and the rewrite +# reactor's compile graph depends on jOOQ-generated classes from +# graphitron-sakila-db anyway. Once the DB is up, running tests is a cheap +# sanity check at the deploy boundary. # -# NOTE: SNAPSHOT cleanup must be configured in the GitLab UI under -# Settings > Packages and registries > Package Registry > Cleanup policy, -# otherwise every default-branch push accumulates a new snapshot version. +# Javadoc and signing are not run: the `gitlab` profile attaches only sources, +# not javadoc, and there is no GPG signing here. Maven Central via the GitHub +# workflow's `-P release` is where javadoc + signed artifacts come from. default: - image: maven:3.9-eclipse-temurin-21 + image: maven:3.9-eclipse-temurin-25 variables: MAVEN_OPTS: >- -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn MAVEN_CLI_OPTS: "--batch-mode --errors --show-version" - MAVEN_SKIP_OPTS: "-Dmaven.test.skip=true -Djooq.codegen.skip=true" cache: key: @@ -51,21 +55,38 @@ cache: </settings> EOF -publish:snapshot: - extends: .maven-publish - rules: - - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - # Uses -gitlab-SNAPSHOT suffix to distinguish from locally-built snapshots - # in developer ~/.m2 caches, so consumers can opt in explicitly. - script: - - mvn $MAVEN_CLI_OPTS $MAVEN_SKIP_OPTS -s ci_settings.xml -Dchangelist=-gitlab-SNAPSHOT clean deploy -P gitlab - publish:release: extends: .maven-publish rules: - - if: $CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/ - script: - - VERSION=${CI_COMMIT_TAG#v} - - echo "Releasing version $VERSION to GitLab Packages" - - mvn $MAVEN_CLI_OPTS versions:set -DnewVersion=$VERSION -DgenerateBackupPoms=false - - mvn $MAVEN_CLI_OPTS $MAVEN_SKIP_OPTS -s ci_settings.xml clean deploy -P gitlab + - if: $CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+(-RC\d+)?$/ + services: + - name: postgres:18-alpine + alias: postgres + variables: + POSTGRES_DB: rewrite_test + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_HOST_AUTH_METHOD: trust + script: | + set -e + apt-get update -qq && apt-get install -y -qq postgresql-client gcc make git + # libtree-sitter runtime for the graphitron-lsp tests: jtreesitter 0.26 looks up + # ts_language_abi_version at Language.load (a symbol introduced in tree-sitter 0.25), + # and the bundled grammar (graphitron-tree-sitter-natives) targets the 0.26.x ABI. + # apt's libtree-sitter0 is 0.20.x and too old, and Debian experimental is an + # unpinnable, rolling suite (an unpinned `-t experimental` install silently regressed + # to the stale 0.20.x runtime, producing "Symbol not found: ts_language_abi_version"). + # Build the pinned runtime from source instead, mirroring the post-deploy matrix in + # .github/workflows/tree-sitter-natives-release.yml. + TS_VERSION=v0.26.9 + TS_DIR=$(mktemp -d) + git clone --depth=1 --branch=$TS_VERSION https://github.com/tree-sitter/tree-sitter "$TS_DIR" + make -C "$TS_DIR" + make -C "$TS_DIR" install + ldconfig + rm -rf "$TS_DIR" + PGPASSWORD=postgres psql -h postgres -U postgres -d rewrite_test -f graphitron-sakila-db/src/main/resources/init.sql + VERSION=${CI_COMMIT_TAG#v} + echo "Releasing version $VERSION to GitLab Packages" + mvn $MAVEN_CLI_OPTS versions:set -DnewVersion=$VERSION -DgenerateBackupPoms=false -DprocessAllModules=true + mvn $MAVEN_CLI_OPTS -Ddb.url=jdbc:postgresql://postgres:5432/rewrite_test -Dtest.db.url=jdbc:postgresql://postgres:5432/rewrite_test -s ci_settings.xml clean deploy -P gitlab,local-db diff --git a/.mise.toml b/.mise.toml deleted file mode 100644 index 124880d6fb..0000000000 --- a/.mise.toml +++ /dev/null @@ -1,58 +0,0 @@ -[tools] -maven = "3.9.9" -java = "21" -watchexec = "2.5.0" - -[tasks.clean] -description = "Maven clean" -run = "mvn clean" - -[tasks.build-all] -description = "Run maven install" -run = "mvn install" - -[tasks.sakila] -description = "Runs the sakila test database via docker compose" -run = "docker compose -f ./graphitron-example/graphitron-example-db/docker-compose.yml up" - -[tasks.jooq] -description = "Make jOOQ generate code from the sakila database schema" -run = "mvn clean install -Pjooq-codegen -pl :graphitron-example-db" - -[tasks.start] -alias = "s" -description = "Start graphitron-example-server (quarkus:dev)" -run = "mvn quarkus:dev -pl :graphitron-example-server" - -[tasks.rebuild] -description = "Rebuilds from given module and dependent modules. Meant to be used while running quarkus. Takes module name as argument, for example 'mise r rebuild graphitron-example-spec'." -run = [ - "mvn --also-make-dependents --projects :{{arg(index=0)}},-:graphitron-example-server install", - "touch $(git rev-parse --show-toplevel)/graphitron-example/graphitron-example-server/src/main/resources/META-INF/resources/index.html", -] - -[tasks.generate] -alias = "g" -description = "Regenerate graphitron-example-spec (transform + codegen)" -run = "mvn generate-sources -pl :graphitron-example-spec" - -[tasks.watch] -alias = "w" -description = "Watch schema files and regenerate on changes (graphitron-example)" -run = "mise watch -t generate" -sources = ["graphitron-example/graphitron-example-spec/src/main/resources/graphql/**/*.graphqls"] - -[tasks.debug-generate] -description = "Debug generate for graphitron-example" -run = "mvnDebug install -pl :graphitron-example-spec" - -[tasks.test-variant] -description = "Run ApprovalQueryTest against a codegen variant. Takes variant name (matches a 'variant-<name>' Maven profile in graphitron-example/pom.xml). Example: 'mise r test-variant upsert-as-merge'." -run = "mvn -Pvariant-{{arg(index=0)}} verify -pl :graphitron-example-server -am -Dtest=ApprovalQueryTest -Dsurefire.failIfNoSpecifiedTests=false" - -[tasks.test-variants] -description = "Run example-server tests against all known codegen variants." -run = [ - "mise r test-variant upsert-as-merge", - "mise r test-variant jdbc-batching", -] diff --git a/CLAUDE.md b/CLAUDE.md index fc32142067..ea0e5dd891 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,107 +1,110 @@ # Graphitron Project - Claude Code Reference -## Project Overview -Graphitron is a Maven-based code generation tool that creates Java source code by linking GraphQL schemas to underlying database models. It's developed by Sikt – the Norwegian Agency for Shared Services in Education and Research. - -## Technology Stack -- **Language**: Java 17 with Jakarta EE -- **Build Tool**: Maven (multi-module project) -- **GraphQL**: GraphQL Java with Apollo Federation support -- **Database**: jOOQ for database access -- **Testing**: JUnit with AssertJ assertions -- **Database**: PostgreSQL -- **Example Server**: Quarkus framework - -## Project Structure +Rules and constraints for working in this repo. The whole repo is the rewrite reactor and in scope. `/docs/` is the source for the public documentation site at `graphitron.sikt.no`; see [Documentation site](#documentation-site) below. + +Links elsewhere in this file point at deep references. **Don't fetch them up front;** open one only when its stated trigger applies to the task at hand. The rules and commands here are meant to be self-contained for routine work. + +## What graphitron-rewrite is + +The next-generation Graphitron generator: a Maven-based code generator that turns GraphQL schemas + jOOQ-generated database models into Java resolvers. The repo root is the reactor, with its parent pom (`graphitron-rewrite-parent`, `10-SNAPSHOT`). Modules: `graphitron-javapoet`, `graphitron`, `graphitron-fixtures-codegen`, `graphitron-sakila-db`, `graphitron-sakila-service`, `graphitron-mcp`, `graphitron-jakarta-rest`, `graphitron-maven-plugin`, `graphitron-sakila-example`, `graphitron-lsp`, `roadmap-tool` (plus the `graphitron-tree-sitter-natives` subdirectory). Developed by Sikt. + +## Technology constraints + +- **Java 25** for generator code (`<release>25</release>` in the root `pom.xml` and most child modules); **Java 17** for generated output (`graphitron-sakila-example` compiles with `<release>17</release>` to verify this). Generator implementation may use Java 25 features freely. Generated source files must target Java 17, consumers may still be on 17, and we control what syntax appears in those files. The parent pom's `requireJavaVersion` enforcer rule fails the build with a clear message when run on a JDK older than 25. +- **jOOQ 3.20.11**, **GraphQL-Java 25.0**, **JUnit 6.0.3 + AssertJ 3.27.7**, **PostgreSQL 42.7.10** (Testcontainers 2.0.4). Versions are pinned in the root `pom.xml` properties; don't add dependencies without checking that pom first. + +## Environment (agent sessions) + +Maven 3.9.11 at `/opt/maven`; Java 25 default. Pre-configured, no installation needed. + +Verify before building: + +```bash +mvn -version # expect "Java version: 25.x" ``` -graphitron/ -├── graphitron-common/ # Shared utilities and exception handling -├── graphitron-codegen-parent/ # Java code generation from GraphQL schemas -│ ├── graphitron-java-codegen/ # Main code generator -│ └── graphitron-javapoet/ # Java code generation utilities -├── graphitron-maven-plugin/ # Maven plugin for code generation and schema transformation -├── graphitron-schema-transform/ # GraphQL schema transformation (feature flags, Federation, Relay) -├── graphitron-servlet-parent/ # Servlet implementations (javax and jakarta) -└── graphitron-example/ # Complete working example using Sakila database + +If `mvn -version` reports Java 21, the session inherited a stale `JAVA_HOME`; see `.claude/web-environment.md` for the JDK 25 install + `JAVA_HOME` export. The parent pom's enforcer fails loudly with "Detected JDK … 21", so this is not silent. + +**Claude Code Web** uses a web-sandbox setup (no Docker, native PostgreSQL via `-Plocal-db`). For PostgreSQL/Testcontainers errors there, see `.claude/web-environment.md`. + +## Common commands + +```bash +# Build the rewrite (always include -Plocal-db; see footgun below) +mvn install -Plocal-db + +# Regenerate roadmap/README.md from item front-matter +mvn -pl roadmap-tool exec:java -q ``` -## Documentation -- **Main README**: [/README.md](/README.md) - Project overview and getting started -- **Example README**: [/graphitron-example/README.md](/graphitron-example/README.md) - Sakila example implementation -- **Schema Transform README**: [/graphitron-schema-transform/README.md](/graphitron-schema-transform/README.md) - Schema transformation features -- **Java Codegen README**: [/graphitron-codegen-parent/graphitron-java-codegen/README.md](/graphitron-codegen-parent/graphitron-java-codegen/README.md) -- **JavaPoet README**: [/graphitron-codegen-parent/graphitron-javapoet/README.md](/graphitron-codegen-parent/graphitron-javapoet/README.md) +The full install is fast; prefer it over targeted `-pl` builds. If you do need `-pl`, always pair it with `-am` (also-make) or `-amd` (also-make-dependents); a bare `-pl` skips dependent modules and produces stale results. -## Key Architecture +## Building and testing -### Code Generation Process -1. GraphQL schemas are processed and potentially transformed -2. jOOQ generates Java classes from database schema -3. Graphitron maven plugin generates resolvers linking GraphQL types to jOOQ classes -4. Generated code integrates with servlet-based GraphQL servers +The `mvn install -Plocal-db` command above runs the full pipeline (build-fixtures → test → compile-spec → execute-spec). Reach for the deeper docs only when the task requires it: -### Maven Plugin Goals -The graphitron-maven-plugin provides: -- **generate-code**: Generate Java code from GraphQL schemas -- **transform**: Transform schemas (Apollo Federation, Relay connections, feature flags) +- Adding/structuring tests, or unsure which tier (unit vs pipeline vs compilation vs execution) to put a test in: `docs/architecture/explanation/rewrite-design-principles.adoc`. +- Navigating the sealed variant hierarchy, classification taxonomy, or runtime extension points: `docs/architecture/index.adoc`. +- Diagnosing build/test failures specific to the web sandbox: `.claude/web-environment.md`. -## Common Development Commands +**Footgun: catalog-jar clobber.** Omitting `-Plocal-db` silently empties the jOOQ catalog jar; pipeline tests then fail with `UnclassifiedType` / `NoSuchElement` / "table … could not be resolved" cascades. Recovery: rerun with `-Plocal-db`. -```bash -mise r clean # Clean all target directories -mise r build-all # Full build with install -mise r start # Start example server in dev mode (hot reload) -mise r sakila # Start example database (Sakila) -mise r jooq # Regenerate jOOQ classes from database -mise r rebuild <module> # Rebuild specific module while server is running +**Sub-module gotcha (handled for standard layouts): `graphitron:dev` sibling scan.** Running `mvn graphitron:dev` from inside one module of a multi-module reactor used to see only that module's classes, so services / conditions / records in sibling modules silently produced empty completions. The dev goal now walks the parent pom's `<modules>` and folds siblings' `target/classes` and sources into the scan automatically (standard layout only; a sibling must have been compiled once). See R99 (`lsp-submodule-sibling-classpath`) and the "Multi-module projects" note in `docs/architecture/how-to/dev-loop-internals.adoc`. + +## Writing style + +Do not use em dashes (—) in documentation. Use a comma, semicolon, colon, or restructure the sentence instead. + +In `.adoc` files, use AsciiDoc table syntax (`[cols="..."]` + `|===` block) for tables; the markdown form (`| col | col |` header followed by a `|---|---|` separator) renders as paragraph text with literal pipes. The roadmap-tool `check-adoc-tables` step fails the build on any such row outside a structural block. + +## Interaction style +Do not use the `AskUserQuestion` tool for open-ended design dialog or spec exploration. The structured multi-choice format constrains a conversation that should be free-flowing prose, and the user has explicitly flagged it as friction. Surface design forks inline: state the choice, give your recommendation and the reasoning, invite redirect. The user answers with a sentence, pushes back on the framing, or pivots, none of which fit the question/options shape. Reserve `AskUserQuestion` for genuinely bounded decisions where the option set is closed and prose framing would be wasteful (for example "discard the merge conflict or keep your local copy"); even there, prose first is usually fine. + +## Editing large files + +Prefer many small `Edit` calls over one large `Write` when trimming or rewriting a long file. Full-file writes on plans/docs of ~300+ lines tend to time out mid-response and leave the file half-written. Sequence of targeted `Edit` calls (remove section A, remove section B, replace section C) is both safer and faster. + +## Documentation site + +`/docs/` is a Maven module (`graphitron-docs`, packaging `pom`) that renders an AsciiDoc site to `docs/target/generated-docs/` and gets deployed to GitHub Pages by the `docs-build` / `docs-deploy` jobs in `.github/workflows/rewrite-build.yml` (trunk pushes only). The contributor-facing architecture docs under `/docs/architecture/` and the roadmap under `/roadmap/` also render into the site. PR preview builds run through `.github/workflows/preview-docs.yml` and upload `target/generated-docs/` as a workflow artifact. Doc changes ship through the same trunk-based flow as code; PR breakage on `.adoc` files fails CI. + +To skip the AsciiDoctor render in a local build (saves ~10s of JRuby startup): + +```bash +mvn install -P!docs -Plocal-db ``` -## Testing & Important Files -- **Testing**: JUnit 5 with AssertJ, approval tests, Quarkus test framework, TestContainers -- **Test locations**: `src/test/java` and `src/test/resources` -- **Configuration**: `pom.xml` files in each module -- **GraphQL schemas**: `*.graphqls` files -- **Directives**: `graphitron-common/src/main/resources/directives.graphqls` - -## Development Guidelines -1. **Always check existing code patterns** in neighboring files before writing new code -2. **Check pom.xml** before adding any dependencies - use what's already available -3. **Write tests** using JUnit 5 and AssertJ for all new functionality -4. **Follow the framework patterns** already established in the codebase -5. **Never use `-Pquick`, `-DskipTests`, or `-Dmaven.test.skip`** when building with tests. - -## Common Tasks -- **Schema changes**: Update .graphqls files → run `mvn graphitron:generate-code` -- **Database changes**: Update database → run `mise r jooq` to regenerate classes -- **Unit tests**: Add test cases in `src/test/java` using JUnit 5 and AssertJ -- **Development server**: Use `mise r start` for hot reload with Quarkus - -## Integration Testing - -### Approval Testing Framework -The example server uses approval testing for GraphQL queries: -- **Test queries**: `graphitron-example-server/src/test/resources/approval/queries/*.graphql` -- **Variables**: Optional `*.variables.json` for parameterized tests -- **Approved results**: `graphitron-example-server/src/test/resources/approval/approvals/*.approved.json` -- Tests automatically run all .graphql files found in queries directory - -### Adding Integration Tests -1. Create a `.graphql` file in `queries/` directory -2. (Optional) Add `*.variables.json` for parameterized tests with multiple test cases -3. Run tests to generate approval file: `mvn test -pl :graphitron-example-server` -4. Review and stage the generated `.approved.json` file - -### Example Schema (Sakila Database) -Located in `graphitron-example-spec/src/main/resources/graphql/schema.graphqls` -- Based on the Sakila sample database (DVD rental store) -- Main tables: Film, Customer, Payment, Inventory, Staff, Language -- Supports ordering via `@orderBy` directive with index specifications -- Use `@asConnection` for Relay-style pagination -- When adding new types: include `@table` directive and proper field mappings - -## Key Features -- jOOQ for type-safe database access (supports Java records and jOOQ records) -- Apollo Federation and Relay support for GraphQL -- Schema transformation with feature flags -- Both javax and jakarta servlet compatibility \ No newline at end of file +## Development Workflow + +**Before editing the reactor, confirm a roadmap item covers the change.** If none exists, file a Backlog item first via the `roadmap` skill; this applies even to "fix this error" / "make it accept X" framings. The default when unsure is to file a Backlog stub and ask whether to skip the gate, not to implement and ask later; the case for bypassing the pipeline is the user's to make. + +**Size is not an exemption.** The documented workflow applies to *every* change in the reactor, including one-line patches, "trivial" bug fixes, and obvious-looking corrections. Small or urgent-feeling does not mean skip the roadmap item, the Spec → ... → Done states, or the reviewer-rule gates; a bug fix moves through the same pipeline as a feature. If the workflow genuinely should be short-circuited for a given fix, that is the user's call to make explicitly, not a default you reach for because the change looks simple. + +Every change moves Backlog → Spec → Ready → In Progress → In Review → Done. Each item has its own file in `roadmap/` carrying YAML front-matter (`status:`, `bucket:`, etc.); `roadmap/README.md` is the rendered roll-up, regenerated by `mvn -pl roadmap-tool exec:java -q`. Reviewer must be a different party than the author (for Spec → Ready) and the implementer (for In Review → Done). Any session can add Backlog items. + +When transitioning a roadmap item between states, or unsure of the file conventions for a new item, consult `roadmap/workflow.adoc` for the full state table and canonical paths. + +Consult the `principles-architect` subagent while drafting (Backlog → Spec, design forks in In Progress, or as a self-check before `srp`); it's read-only and produces no verdict. Reviewer-rule gates stay with `srp` / `reviewer-prompt`, which hand off to a *different* Claude Code session; identity is the `https://claude.ai/code/session_<id>` trailer on each commit, not git author. + +## Git Workflow + +Trunk-based development against `claude/graphitron-rewrite`. + +**Standing permission.** The user authorizes pushing committed work from your feature branch to `claude/graphitron-rewrite` (fast-forward only) without asking each time; do not force-push trunk; do not push to other branches (e.g. `main`) without asking. `claude/graphitron-rewrite` is the integration trunk for all rewrite work, so if your session was started on a different feature branch, that is expected: keep developing on that branch and additionally fast-forward `claude/graphitron-rewrite` as the final step of the session flow below. + +**Every commit ships to trunk** (including review fixes, docs-only commits, plan updates) unless flagged not-for-trunk by one of: + +- `wip:` / `draft:` / `spike:` commit-message prefix, or +- a branch named `wip/...`, `draft/...`, or `spike/...`, or +- the user saying "don't ship this to trunk yet". + +**Session flow:** sync → work + commit → push own branch → fast-forward trunk. Trunk is fast-forward only; never force-push it. Force-push-with-lease on your own branch is fine. If trunk moved during work, rebase and repeat. + +```bash +git fetch origin claude/graphitron-rewrite +git rebase origin/claude/graphitron-rewrite +# ... work, commit ... +git push -u origin <your-branch> +git push origin <your-branch>:claude/graphitron-rewrite +``` diff --git a/README.md b/README.md index edb73226f4..50a40e4ab4 100644 --- a/README.md +++ b/README.md @@ -6,11 +6,28 @@ Graphitron is used as a Maven plugin, offering two main functionalities: - **Java Code Generation**: Creates Java source code from GraphQL schemas. - **Schema Transformation**: Modifies GraphQL schemas based on various configurations. -For more information, see: -- [Vision and Goals](./VISION.md) +## Documentation + +**New to Graphitron?** Start with the [documentation guide](./docs/README.adoc) for conceptual understanding: +- [Vision and Goal](./docs/vision-and-goal.adoc) - What problem Graphitron solves and why +- [Graphitron Principles](./docs/graphitron-principles.adoc) - Design philosophy for building systems that last decades +- [Code Generation Triggers](./docs/architecture/reference/code-generation-triggers.adoc) - Schema patterns → what gets generated + +**Ready to use Graphitron?** See the technical reference documentation: - [Online documentation](https://graphitron.sikt.no/) -- [Maven Plugin README](./graphitron-maven-plugin/README.md) for plugin goals and configuration reference. -- [Code-generator README](./graphitron-codegen-parent/graphitron-java-codegen/README.md) for detailed information on how to configure and use the Graphitron Java Code Generator. -- [Schema Transform README](./graphitron-schema-transform/README.md) for information on how to transform GraphQL schemas. -- [Common Module README](./graphitron-common/README.md) for exception handling framework and shared utilities. -- [Example project README](./graphitron-example/README.md) for an example of how to use Graphitron. +- [Tutorial](./docs/manual/tutorial/index.adoc) - A fresh checkout to a working GraphQL query against the Sakila example +- [How-to guides](./docs/manual/how-to/index.adoc) - Day-to-day recipes: joins, conditions, mutations, services, pagination, errors, federation +- [Reference](./docs/manual/reference/index.adoc) - Every directive, Maven plugin parameter, runtime API entry point, and diagnostic code +- [Example project README](./graphitron-sakila-example/README.md) - A runnable Quarkus + JAX-RS reference application + +## Building + +The repo root is a single Maven reactor. Build it with the `local-db` profile +(which switches jOOQ codegen to a native PostgreSQL; see `CLAUDE.md` for the +catalog-jar footgun): + +```bash +mvn install -Plocal-db +``` + +See the [Tutorial](./docs/manual/tutorial/index.adoc) for the end-to-end build and query flow. diff --git a/VISION.md b/VISION.md index 82f0c6d93e..a50c386fc1 100644 --- a/VISION.md +++ b/VISION.md @@ -42,6 +42,7 @@ Graphitron generates: - All the code that fetches data from the database - Efficient handling of nested data - Proper batching to avoid redundant database calls +- Resolver wiring that delegates to your own service classes for fields requiring custom logic The generated code is: diff --git a/docs/README.adoc b/docs/README.adoc new file mode 100644 index 0000000000..17d56adcf6 --- /dev/null +++ b/docs/README.adoc @@ -0,0 +1,66 @@ += Graphitron Documentation +:toc: macro + +This folder is the source for the Graphitron documentation site at https://graphitron.sikt.no/. + +The site is built by Maven via the `graphitron-docs` module (this directory) and deployed to GitHub Pages by the `docs-build` / `docs-deploy` jobs in `.github/workflows/rewrite-build.yml` (trunk pushes only). PR preview builds run through `.github/workflows/preview-docs.yml` and upload `target/generated-docs/` as a workflow artifact. + +toc::[] + +== What's in this directory + +[cols="1,3"] +|=== +| `index.adoc` +| Site landing page. + +| `*.adoc` +| Top-level product pages (vision, principles, security, dependencies, FAQ, ...). + +| `_theme/site.css` +| Site-specific styles. Built on top of the Sikt Design System tokens fetched from `@sikt/sds-core` and `@sikt/sds-button` at build time. + +| `images/` +| Logos, illustrations, favicon. + +| `pom.xml` +| Maven module wiring. Plugins: `download-maven-plugin` (fetches SDS CSS), `maven-resources-plugin` (stages source + theme), `asciidoctor-maven-plugin` (renders HTML). + +| `target/` +| Build output. Gitignored. +|=== + +The contributor-facing architecture docs live under `/docs/architecture/` (Diataxis-shaped) and the roadmap under `/roadmap/`. Both render into this site, but their authoring conventions stay in their own folders. + +== Building locally + +[source,bash] +---- +mvn -pl :graphitron-docs -am package +---- + +Output lands in `docs/target/generated-docs/`. Open `index.html` in a browser to spot-check. + +To skip the AsciiDoctor render in a local Maven run (the JRuby startup adds ~10s): + +[source,bash] +---- +mvn install -P!docs -Plocal-db +---- + +The resources copy and any roadmap-tool emit still run, so the staging tree is verified even when the HTML render is skipped. + +== Authoring conventions + +* File extension is `.adoc` (not `.asciidoc`, not `.asc`). +* One H1 per file, set as the page title via `= Title`. +* Cross-page links use `xref:` rather than raw URLs. +* Code blocks use `[source,java]` (or `xml`, `yaml`, ...) with optional callouts. +* Images live in `images/`; never hot-link to the deployed site. +* `include::` does not resolve in GitHub's web preview; prefer self-contained pages and reserve `include::` for genuine reuse. + +GitHub renders `.adoc` natively in the web UI, so in-repo browsing works for plain prose. Treat in-repo rendering as a fallback; the deployed site is canonical. + +== Errors-vs-warnings + +The AsciiDoctor build is configured `failIf severity=WARN`: missing xrefs, missing includes, and unresolved attributes fail the build. We don't tolerate "warnings" in docs the way we sometimes do in compiler output; a missing xref is doc rot. diff --git a/docs/_theme/docinfo-footer.html b/docs/_theme/docinfo-footer.html new file mode 100644 index 0000000000..ac0d425640 --- /dev/null +++ b/docs/_theme/docinfo-footer.html @@ -0,0 +1,49 @@ +<footer class="site-footer" aria-label="Site footer"> + <div class="site-footer-inner"> + <div> + <h4>Docs</h4> + <ul> + <li><a href="/index.html">Home</a></li> + <li><a href="/quick-start.html">Quick start</a></li> + <li><a href="/faq.html">FAQ</a></li> + <li><a href="/vision-and-goal.html">Vision and Goal</a></li> + <li><a href="/graphitron-principles.html">Principles</a></li> + </ul> + </div> + <div> + <h4>For contributors</h4> + <ul> + <li><a href="/architecture/">Architecture</a></li> + <li><a href="/roadmap/index.html">Roadmap</a></li> + <li><a href="/roadmap/changelog.html">Changelog</a></li> + </ul> + </div> + <div> + <h4>More</h4> + <ul> + <li><a href="https://github.com/sikt-no/graphitron/tree/claude/graphitron-rewrite" rel="noopener">GitHub</a></li> + <li><a href="https://sikt.no/" rel="noopener">Sikt</a></li> + </ul> + </div> + <div class="site-footer-meta"> + Graphitron is developed by Sikt — the Norwegian Agency for Shared Services in Education and Research. + </div> + </div> +</footer> +<script type="module"> + const blocks = document.querySelectorAll('code[data-lang="mermaid"]'); + if (blocks.length > 0) { + const { default: mermaid } = await import('https://cdn.jsdelivr.net/npm/mermaid@11.4/dist/mermaid.esm.min.mjs'); + const nodes = []; + blocks.forEach((code) => { + const pre = code.closest('pre') ?? code; + const replacement = document.createElement('pre'); + replacement.className = 'mermaid'; + replacement.textContent = code.textContent; + pre.replaceWith(replacement); + nodes.push(replacement); + }); + mermaid.initialize({ startOnLoad: false }); + await mermaid.run({ nodes }); + } +</script> diff --git a/docs/_theme/docinfo-header.html b/docs/_theme/docinfo-header.html new file mode 100644 index 0000000000..467dc03601 --- /dev/null +++ b/docs/_theme/docinfo-header.html @@ -0,0 +1,17 @@ +<nav class="nav-header" aria-label="Site navigation"> + <div class="nav-header-inner"> + <a class="nav-brand" href="/index.html"> + <img src="/images/logo.svg" alt="Sikt"/> + <span>Graphitron by Sikt</span> + </a> + <div class="nav-links"> + <a href="/quick-start.html">Quick start</a> + <a href="/manual/">Manual</a> + <a href="/faq.html">FAQ</a> + <a href="/architecture/">Architecture</a> + <a href="/roadmap/index.html">Roadmap</a> + </div> + <span class="nav-spacer"></span> + <a class="nav-github" href="https://github.com/sikt-no/graphitron/tree/claude/graphitron-rewrite" rel="noopener">GitHub</a> + </div> +</nav> diff --git a/docs/_theme/site.css b/docs/_theme/site.css new file mode 100644 index 0000000000..2f290b505d --- /dev/null +++ b/docs/_theme/site.css @@ -0,0 +1,661 @@ +/* + * Graphitron documentation site theme. + * + * Built on the Sikt Design System tokens fetched into css/sds-core.css and + * css/sds-button.css at build time by download-maven-plugin. Those files + * expose the --sds-color-brand-*, --sds-color-text-*, --sds-color-layout-*, + * --sds-typography-*, and --sds-space-* custom properties consumed below. + * + * Selector targets: AsciiDoctor's defaults (#header, #content, .sect1, + * .admonitionblock, etc.), plus role-driven hooks (.hero, .feature, + * .nav-header, .site-footer) that the docinfo and index pages use. + */ + +@import url("sds-core.css"); +@import url("sds-button.css"); + +/* ---------- base ---------------------------------------------------------- */ + +:root { + --site-content-max: 1180px; + /* Responsive horizontal page padding: 24px on mobile, 32px on tablet, + * 48px on desktop. Inherits the design system's 45rem / 64rem breakpoints + * from sds-core.css, so this var changes value without a media query. */ + --site-content-pad: var(--sds-space-padding-large); + /* SDS declares `color-scheme: light dark` and resolves every token via + * light-dark(), so a dark-mode browser would auto-flip the page palette. + * Rouge's inlined syntax-highlight stylesheet (source-highlighter: rouge) + * is tuned for a white background — dark-blue strings, dark-red keywords, + * mid-gray comments — which become illegible on the darkened <pre>. The + * rest of the site (hero band, admonitions, footer, callouts) is also + * only designed for light. Pin the whole site to light until a real + * dark theme exists. */ + color-scheme: light; +} + +html, body { + margin: 0; + padding: 0; + background: var(--sds-color-layout-page-default, #ffffff); + color: var(--sds-color-text-primary, #1a1a1a); + font-family: var(--sds-typography-font-family-default, "Haffer", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif); + font-size: 16px; + line-height: var(--sds-typography-body-lineheight-regular, 1.6); + /* Belt-and-suspenders: guarantee the page itself never exceeds the + * viewport width regardless of what wide content (tables, pre blocks, + * images, embedded SVGs) lands inside #content. Without this, a single + * unconstrained child can widen the body and drag the sticky + * .nav-header off-screen on horizontal scroll, since sticky only + * pins on the y-axis. `clip` rather than `hidden` because clip does + * not establish a scroll container, so position: sticky on .nav-header + * keeps tracking the viewport. */ + overflow-x: clip; +} + +a { + color: var(--sds-color-text-primary, #1a1a1a); + text-decoration: underline; + text-underline-position: under; +} +a:hover, a:focus-visible { + background-color: var(--sds-color-interaction-primary-transparent-highlight, transparent); + color: var(--sds-color-text-primary, #1a1a1a); +} +a:active { + background-color: var(--sds-color-interaction-primary-transparent-pressed, transparent); +} + +/* ---------- top nav header (docinfo) -------------------------------------- */ + +.nav-header { + background: var(--sds-color-layout-background-primary, #ffffff); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06); + padding: var(--sds-space-padding-small) var(--site-content-pad); + position: sticky; + top: 0; + z-index: 50; +} +.nav-header-inner { + max-width: var(--site-content-max); + margin: 0 auto; + display: flex; + align-items: center; + gap: var(--sds-space-gap-medium); +} +.nav-brand { + display: flex; + align-items: center; + gap: var(--sds-space-gap-small); + text-decoration: none; + font-weight: 700; + color: var(--sds-color-text-primary, #1a1a1a); +} +.nav-brand:hover { + background: transparent; + text-decoration: none; +} +.nav-brand img { + height: 28px; + width: auto; +} +.nav-links { + display: flex; + gap: var(--sds-space-gap-medium); + margin-left: var(--sds-space-gap-tiny); + flex-wrap: wrap; +} +.nav-links a { + text-decoration: none; + color: var(--sds-color-text-primary, #1a1a1a); + font-weight: 500; + padding: 6px 4px; +} +.nav-links a:hover { + color: var(--sds-color-brand-primary-strong, #5b3d99); + text-decoration: underline; + background: transparent; +} +.nav-spacer { + flex: 1; +} +.nav-github { + text-decoration: none; + font-weight: 500; +} +.nav-github:hover { + background: transparent; + color: var(--sds-color-brand-primary-strong, #5b3d99); +} + +/* ---------- layout -------------------------------------------------------- */ + +#header, #content, #footer { + max-width: var(--site-content-max); + margin: 0 auto; + padding: 0 var(--site-content-pad); +} + +#header h1 { + margin: 0 0 6px 0; + padding: 28px 0 12px; + font-weight: 700; + font-size: 2.3rem; + letter-spacing: -0.01em; +} +#header .details { + color: var(--sds-color-text-secondary, #6b7280); + font-size: 0.9rem; +} + +#content { + /* No top padding so a full-bleed .hero-band (homepage) butts directly + * against #header / .nav-header above. Content pages get their top + * spacing from #header h1's padding. */ + padding-top: 0; + padding-bottom: var(--sds-space-padding-huge); +} + +/* AsciiDoctor body class scope; `body.book` etc. shouldn't change layout. */ +body.article, body.book { + background: var(--sds-color-layout-page-default, #ffffff); +} + +/* ---------- typography ---------------------------------------------------- */ + +h1, h2, h3, h4, h5, h6 { + color: var(--sds-color-text-primary, #1a1a1a); + font-weight: 700; + line-height: 1.25; + margin: 1.6em 0 0.6em; + letter-spacing: -0.005em; +} +/* AsciiDoctor wraps each heading title in `<a class="link">` so the heading + * is itself a clickable anchor. The body `a` rule would otherwise tint every + * heading with the link color — inherit instead. */ +h1 .link, h2 .link, h3 .link, h4 .link, h5 .link, h6 .link { + color: inherit; + text-decoration: none; +} +h1 .link:hover, h2 .link:hover, h3 .link:hover, h4 .link:hover, h5 .link:hover, h6 .link:hover { + color: inherit; + background: transparent; + text-decoration: none; +} +h2 { + font-size: 1.7rem; + border-bottom: var(--sds-space-border-weight-thin) solid var(--sds-color-layout-divider-subtle, #e2e4e8); + padding-bottom: 6px; +} +h3 { font-size: 1.3rem; } +h4 { font-size: 1.1rem; } + +/* AsciiDoctor section anchor on h2/h3 hover */ +h2:hover .anchor::before, h3:hover .anchor::before { + visibility: visible; +} + +p, li { + color: var(--sds-color-text-primary, #1a1a1a); +} + +code, pre, kbd, tt { + font-family: var(--sds-typography-font-family-mono, "JetBrains Mono", "SFMono-Regular", Menlo, Consolas, monospace); +} + +code { + background: var(--sds-color-layout-background-neutral, #f4f5f7); + border: var(--sds-space-border-weight-thin) solid var(--sds-color-layout-divider-subtle, #e2e4e8); + border-radius: var(--sds-space-border-radius-minimal); + padding: 0.05em 0.35em; + font-size: 0.9em; +} + +pre code { + background: transparent; + border: none; + padding: 0; +} + +.listingblock pre, .literalblock pre { + background: var(--sds-color-layout-background-neutral, #fafbfc); + border: var(--sds-space-border-weight-thin) solid var(--sds-color-layout-divider-subtle, #e2e4e8); + border-radius: var(--sds-space-border-radius-small); + padding: 14px 16px; + overflow-x: auto; + font-size: 0.9rem; +} + +/* ---------- hero (index page only) --------------------------------------- */ + +.hero-band { + background: var(--sds-color-brand-primary-subtle, #ece4ff); + margin: 0 calc(-1 * var(--site-content-pad)) var(--sds-space-gap-medium); + padding: var(--sds-space-padding-huge) var(--site-content-pad); + text-align: center; +} +.hero-band .hero-title { + font-size: 3.2rem; + font-weight: 700; + margin: 0 0 var(--sds-space-gap-small); + letter-spacing: -0.015em; + color: var(--sds-color-text-primary, #1a1a1a); +} +.hero-band .hero-tagline { + font-size: 1.25rem; + margin: 0 0 var(--sds-space-gap-medium); + color: var(--sds-color-text-primary, #1a1a1a); + opacity: 0.85; +} +.hero-band .cta-row { + display: flex; + justify-content: center; + gap: var(--sds-space-gap-small); + flex-wrap: wrap; +} +.cta-button { + display: inline-block; + background: var(--sds-color-interaction-primary-transparent-default, transparent); + color: var(--sds-color-text-primary, #1a1a1a); + border: var(--sds-space-border-weight-thin) solid var(--sds-color-brand-primary-strong, #5b3d99); + border-radius: var(--sds-space-border-radius-full); + padding: 10px 22px; + text-decoration: none; + font-weight: 600; + font-size: 1rem; + transition: background 120ms ease; +} +.cta-button:hover { + background: var(--sds-color-interaction-primary-transparent-highlight, rgba(91, 61, 153, 0.08)); + color: var(--sds-color-text-primary, #1a1a1a); + text-decoration: none; +} + +/* ---------- feature row (index page) ------------------------------------- */ + +/* The 3-feature row uses an AsciiDoc table with `[cols="1a,1a,1a"]` so each + * cell is parsed as AsciiDoc and the [.feature] role + headings render. */ +table.featurerow, +table.featurerow > colgroup, +table.featurerow > * > tr > th, +table.featurerow > * > tr > td { + border: none; + background: transparent; +} +table.featurerow { + width: 100%; + margin: var(--sds-space-gap-medium) 0 var(--sds-space-gap-large); + border-collapse: separate; + /* gap-large (48px) between cells. The vertical 0 is intentional: there's + * only one row. */ + border-spacing: var(--sds-space-gap-large) 0; + table-layout: fixed; +} +table.featurerow > * > tr > td { + vertical-align: top; + padding: 0 var(--sds-space-padding-tiny); +} +/* Feature cards: image and heading centered (the "poster" feel), prose + * left-aligned (centered paragraphs of varied line length read as ragged + * across three columns; left-aligned reads as a clean card). */ +.feature img { + max-width: 220px; + width: 100%; + height: auto; + margin: 0 auto var(--sds-space-padding-medium); + display: block; +} +.feature h2, +.feature h3 { + font-size: 1.2rem; + border-bottom: none; + padding-bottom: 0; + margin-top: 0; + text-align: center; + font-weight: 600; +} +.feature p { + margin: var(--sds-space-gap-small) 0; + text-align: left; + color: var(--sds-color-text-primary, #1a1a1a); + line-height: 1.55; +} + +/* ---------- TOC ----------------------------------------------------------- */ + +/* AsciiDoctor's `:toc: left@` mode renders the TOC into #header with the + * `toc2` class. Its default stylesheet (which we don't load) would float + * this as a fixed left sidebar with a hard right border. We render it + * inline as a contained card instead: full border, rounded corners, + * internal padding so the title and the list don't hug the edges. */ +#toc.toc2 { + background: var(--sds-color-layout-background-neutral, #fafbfc); + border: var(--sds-space-border-weight-thin) solid var(--sds-color-layout-divider-subtle, #e2e4e8); + border-radius: var(--sds-space-border-radius-small); + padding: var(--sds-space-padding-medium); + margin: 0 0 var(--sds-space-gap-medium); + font-size: 0.92rem; +} +#toc.toc2 a { + color: var(--sds-color-text-primary, #1a1a1a); + text-decoration: none; +} +#toc.toc2 a:hover { + color: var(--sds-color-brand-primary-strong, #5b3d99); + background: transparent; +} +#toc #toctitle { + font-weight: 700; + color: var(--sds-color-text-primary, #1a1a1a); + margin: 0 0 var(--sds-space-gap-small); +} +#toc.toc2 ul { + margin: 0; + padding-left: var(--sds-space-padding-large); +} + +/* ---------- admonitions / advantage-box ----------------------------------- */ + +.admonitionblock { + margin: 1.4em 0; +} +.admonitionblock > table { + border: var(--sds-space-border-weight-thin) solid var(--sds-color-brand-primary-subtle, #ece4ff); + border-left: var(--sds-space-border-weight-bold) solid var(--sds-color-brand-primary-strong, #5b3d99); + background: var(--sds-color-brand-accent-subtle, #f5f0ff); + border-radius: var(--sds-space-border-radius-small); + padding: var(--sds-space-padding-small) 14px; + width: 100%; +} +.admonitionblock td.icon { + width: 36px; + vertical-align: top; +} +.admonitionblock td.icon .title { + font-weight: 700; + color: var(--sds-color-brand-primary-strong, #5b3d99); + text-transform: uppercase; + font-size: 0.8rem; + letter-spacing: 0.05em; +} +.admonitionblock td.content { + padding-left: var(--sds-space-padding-small); +} +.advantage-box { + background: var(--sds-color-brand-primary-subtle, #ece4ff); + border-left: var(--sds-space-border-weight-bold) solid var(--sds-color-brand-primary-strong, #5b3d99); + border-radius: var(--sds-space-border-radius-medium); + padding: 16px 20px; + margin: 1.4em 0; +} + +/* ---------- tables -------------------------------------------------------- */ + +table.tableblock { + border-collapse: collapse; + margin: 1.2em 0; + width: 100%; +} +table.tableblock th, table.tableblock td { + border: var(--sds-space-border-weight-thin) solid var(--sds-color-layout-divider-subtle, #e2e4e8); + padding: 10px 14px; + text-align: left; + vertical-align: top; +} +table.tableblock thead th { + background: var(--sds-color-layout-background-neutral, #fafbfc); + font-weight: 700; +} + +/* ---------- footer (docinfo, dark band) ----------------------------------- */ + +#footer { + /* AsciiDoctor's default per-page footer (timestamps). Hide it; the dark + * .site-footer below replaces it. */ + display: none; +} + +.site-footer { + background: var(--sds-color-brand-accent-strong, #1d1840); + color: var(--sds-color-text-on, #ffffff); + padding: 36px var(--site-content-pad) 28px; + margin-top: var(--sds-space-padding-huge); + font-size: 0.92rem; +} +.site-footer-inner { + max-width: var(--site-content-max); + margin: 0 auto; + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: var(--sds-space-gap-medium); +} +.site-footer h4 { + margin: 0 0 var(--sds-space-gap-small); + color: var(--sds-color-text-on, #ffffff); + font-size: 0.95rem; + font-weight: 700; + text-transform: none; + letter-spacing: 0.02em; +} +.site-footer ul { + list-style: none; + margin: 0; + padding: 0; +} +.site-footer li { + margin: 6px 0; +} +.site-footer a { + color: var(--sds-color-text-on, #ffffff); + text-decoration: none; +} +.site-footer a:hover { + text-decoration: underline; + background: transparent; + color: var(--sds-color-text-on, #ffffff); +} +.site-footer-meta { + grid-column: 1 / -1; + margin-top: var(--sds-space-padding-medium); + padding-top: var(--sds-space-padding-medium); + border-top: var(--sds-space-border-weight-thin) solid rgba(255, 255, 255, 0.15); + color: rgba(255, 255, 255, 0.7); + font-size: 0.85rem; +} + +/* ---------- mobile (< 45rem, the design system's small breakpoint) ------- */ + +/* Layout shapes that need overrides at narrow widths. The horizontal padding, + * hero band padding, and feature-image margin are already responsive via + * --sds-space-padding-* tokens, so they don't appear here. What remains: + * - the featurerow's 3 columns collapse to single-column block flow, + * - the manual landing's 2x2 quadrant grid collapses similarly, + * - the nav-header reflows so brand + GitHub share row 1 and links wrap + * to row 2, + * - the 3.2rem hero title scales down (typography tokens not used here + * because the design system's editorial-headline-* sizes are far larger + * than what fits on a phone). */ +/* ---------- manual quadrants (manual/index.adoc) ------------------------- */ + +/* Diataxis four-quadrant landing. Same parsed-AsciiDoc-cell pattern as the + * homepage's featurerow: `[.quadrants,cols="1,1",...]` produces a 2x2 grid + * with a bold link as the cell title and a short paragraph beneath. */ +table.quadrants, +table.quadrants > colgroup, +table.quadrants > * > tr > th, +table.quadrants > * > tr > td { + border: none; +} +table.quadrants { + width: 100%; + margin: var(--sds-space-gap-large) 0; + border-spacing: var(--sds-space-gap-medium); + table-layout: fixed; +} +table.quadrants > * > tr > td { + vertical-align: top; + padding: var(--sds-space-padding-medium); + background: var(--sds-color-layout-background-neutral, #fafbfc); + border-radius: var(--sds-space-border-radius-small); +} +.quadrant-title { + font-size: 1.25rem; + display: block; + margin-bottom: var(--sds-space-gap-small); +} +.quadrant-title a { + color: var(--sds-color-brand-primary-strong, #5b3d99); + text-decoration: none; +} +.quadrant-title a:hover { + text-decoration: underline; +} + +/* ---------- page navigation (manual/tutorial/) -------------------------- */ + +/* Three-column footer row carrying prev / up / next on sequential pages. + * AsciiDoc form: `[.pagenav,cols="<,^,>",frame=none,grid=none]` table + * with three single-cell xrefs. Empty cells (first page has no prev, + * last page has no next) preserve column alignment so the up-link + * stays centred regardless of which neighbours exist. */ +table.pagenav, +table.pagenav > colgroup, +table.pagenav > * > tr > th, +table.pagenav > * > tr > td { + border: none; +} +table.pagenav { + width: 100%; + margin: var(--sds-space-gap-large) 0 0; + border-top: var(--sds-space-border-weight-thin, 1px) solid var(--sds-color-layout-divider-subtle, #e2e4e8); + border-spacing: 0; + table-layout: fixed; +} +table.pagenav > * > tr > td { + padding: var(--sds-space-padding-small) 0 0; + vertical-align: top; + font-size: 0.95rem; + color: var(--sds-color-text-secondary, #6b7280); +} +table.pagenav a { + color: var(--sds-color-brand-primary-strong, #5b3d99); + text-decoration: none; +} +table.pagenav a:hover { + text-decoration: underline; +} + +@media (max-width: 45rem) { + table.featurerow { + display: block; + border-spacing: 0; + margin: var(--sds-space-gap-medium) 0 var(--sds-space-gap-medium); + } + /* Hide the colgroup that pins each cell to 33% width. */ + table.featurerow > colgroup { + display: none; + } + table.featurerow > tbody, + table.featurerow > tbody > tr { + display: block; + } + table.featurerow > tbody > tr > td { + display: block; + width: 100%; + padding: 0; + margin: 0 0 var(--sds-space-gap-medium); + } + table.featurerow > tbody > tr > td:last-child { + margin-bottom: 0; + } + .feature img { + max-width: 160px; + } + + /* The 2x2 quadrant grid uses the same collapse-to-single-column pattern + * as the homepage featurerow. */ + table.quadrants { + display: block; + border-spacing: 0; + margin: var(--sds-space-gap-medium) 0; + } + table.quadrants > colgroup { + display: none; + } + table.quadrants > tbody, + table.quadrants > tbody > tr { + display: block; + } + table.quadrants > tbody > tr > td { + display: block; + width: 100%; + margin: 0 0 var(--sds-space-gap-medium); + } + table.quadrants > tbody > tr > td:last-child { + margin-bottom: 0; + } + + /* Pagenav rows that fit comfortably as three columns on desktop + * cramp at phone widths once the link text exceeds ~30 characters. + * Stack vertically and keep alignment cues (← prefix on prev, + * → suffix on next) doing the navigational work in place of the + * row's left/center/right column geometry. */ + table.pagenav { + display: block; + border-spacing: 0; + } + table.pagenav > colgroup { + display: none; + } + table.pagenav > tbody, + table.pagenav > tbody > tr { + display: block; + } + table.pagenav > tbody > tr > td { + display: block; + width: 100%; + text-align: left; + padding: var(--sds-space-padding-small) 0 0; + } + + .nav-header-inner { + flex-wrap: wrap; + gap: var(--sds-space-gap-tiny) var(--sds-space-gap-medium); + } + /* Brand + GitHub on row one; nav-links on row two. The desktop spacer + * (flex: 1) would fight that, so collapse it. */ + .nav-spacer { + display: none; + } + .nav-brand { + flex: 1 1 auto; + } + .nav-links { + order: 3; + flex-basis: 100%; + margin-left: 0; + gap: var(--sds-space-gap-tiny) var(--sds-space-gap-medium); + } + .nav-links a { + padding: 4px 0; + } + + .hero-band .hero-title { + font-size: 2.2rem; + } + .hero-band .hero-tagline { + font-size: 1.05rem; + } + + /* Wide tables (the roadmap status board with long titles plus inline + * code spans is the worst offender) would otherwise push the body past + * the viewport, and because .nav-header is sticky only on the y-axis, + * horizontal page scroll drags the nav off-screen. Make each table its + * own horizontal-scroll container instead. display: block sacrifices + * outer table layout but the tbody/tr/td defaults keep the inner table + * intact. */ + table.tableblock { + display: block; + overflow-x: auto; + max-width: 100%; + } +} diff --git a/docs/architecture/explanation/dispatch-axes.adoc b/docs/architecture/explanation/dispatch-axes.adoc new file mode 100644 index 0000000000..d6b117d955 --- /dev/null +++ b/docs/architecture/explanation/dispatch-axes.adoc @@ -0,0 +1,118 @@ += Dispatch axes: `SourceKey` and `LoaderRegistration` + +A DataLoader-backed source-side field carries five orthogonal pieces of dispatch information: the per-row key shape, the body-input contract for the rows-method, the per-source row count, the loader container kind, and the loader dispatch verb. Each is a separate type axis in the model. Consumers read off whichever axis they actually fork on; no consumer reconstructs an axis by `instanceof`-ing a conflated permit. + +This page is the chapter narrative for that contract. Reference detail (the per-arm record components, the per-axis enum/sealed values) lives on the source: javadoc on `SourceKey`, `SourceKey.Reader`, `SourceKey.Wrap`, and `LoaderRegistration`. + +== The axes + +Three model values carry the dispatch axes between them: a `SourceKey` per field (singular, classify-time), zero or more `SourceRow` instances per fetch (runtime, the data flowing through), and a `LoaderRegistration` per field (singular, classify-time, DataLoader identity). + +`SourceKey` carries four of the axes: + +[source,java] +---- +record SourceKey( + TableRef target, // join target (or null for the parent-IS-source case) + List<ColumnRef> columns, // entry-point columns (parent-side or target-side per path) + List<JoinStep> path, // empty = target-aligned; non-empty = FK chain to target + Wrap wrap, // Row | Record | TableRecord(ClassName) + Cardinality cardinality, // ONE | MANY + Reader reader // ColumnRead | AccessorCall | SourceRowsCall | … +) +---- + +`LoaderRegistration` carries the remaining two: + +[source,java] +---- +record LoaderRegistration( + boolean valueIsList, // load(K)→V vs load(K)→List<V> + Container container, // POSITIONAL_LIST | MAPPED_SET + Dispatch dispatch // LOAD_ONE | LOAD_MANY +) +---- + +The two values together describe one DataLoader-backed source side. Splitting them at this seam is what makes the rooted-DML data-field case representable: when the data fetcher reads `env.getSource()` directly instead of going through a loader, the field has a `SourceKey` and no `LoaderRegistration`. If the container and dispatch axes lived on `SourceKey`, the rooted case would need a vestigial `LoaderRegistration` slot or a fork in `SourceKey`. + +=== `Wrap`: per-row key shape + +`SourceKey.Wrap` is sealed: `Row` / `Record` / `TableRecord(ClassName)`. The arm names the jOOQ type the DataLoader's per-key value reads as. + +[source] +---- +Wrap +├─ Row() ← RowN<...> ; values only +├─ Record() ← RecordN<...> ; values + value1()..valueN() +└─ TableRecord(ClassName) ← typed jOOQ subclass ; e.g. FilmRecord +---- + +The `TableRecord` arm carries the developer-declared subtype as a payload because the column-tuple arms (`Row`, `Record`) have no use for it; an enum with a nullable `recordClass` field would be the conflated alternative. `SourceKey.keyElementType()` is total over the three arms without an extra nullable field on `SourceKey` itself. + +=== `Reader`: body input contract + +`SourceKey.Reader` is sealed with five arms; each one names what the rows-method body reads to produce its output. SQL-side bodies read parent-side data; service-side bodies read the service-return shape. + +[source] +---- +Reader +├─ ColumnRead() ← FK columns on the parent record (catalog FK) +├─ AccessorCall(AccessorRef) ← typed zero-arg accessor on a record-backed parent +├─ SourceRowsCall(LifterRef) ← @sourceRow static lifter on a record-backed parent +├─ ServiceTableRecord(ClassName) ← @service returning a typed TableRecord subclass +└─ ServiceUntypedRecord() ← @service returning Record<> / scalar +---- + +Reader is the *body's input contract*, not "where the data comes from"; the body emitter reads the contract to know what code to emit, not to recover the directive that produced the field. Adding a new arm (for example, walking a `Result<RecordN>` from upstream DML when the rooted-DML data-field path lands) is a one-arm addition to this enum; every consumer's exhaustive switch breaks at compile time until the new arm is handled. + +=== `Cardinality`: rows per key + +A two-arm enum: `ONE` (one source row per key — catalog FK, accessor-single, service target-aligned) or `MANY` (list-valued source, accessor-many, list-valued service). Drives the rows-method body's per-key iteration shape and the loader's `load` vs `loadMany` choice. + +`Cardinality` lives on `SourceKey` rather than `LoaderRegistration` because the per-source row count is a property of the source-side data shape, not of the DataLoader's identity. The same `SourceKey.MANY` can be loaded into either container (positional or mapped); the cardinality fixes the body's iteration, the container fixes the loader's framing. + +=== `Container` + `Dispatch`: DataLoader identity + +Two independent enums on `LoaderRegistration`: + +* `Container`: `POSITIONAL_LIST` (the loader is built with `newDataLoader`; keys arrive as `List<K>`; returns `List<V>` indexed 1:1 with keys) or `MAPPED_SET` (built with `newMappedDataLoader`; keys arrive as `Set<K>`; returns `Map<K, V>`). +* `Dispatch`: `LOAD_ONE` (one call to `loader.load(key)` returning one value) or `LOAD_MANY` (one call to `loader.loadMany(keys)` returning a list). + +The two axes are independent. The `AccessorKeyedMany` projection lands at `POSITIONAL_LIST` + `LOAD_MANY`: the loader is positional but each fetcher call uses `loadMany` because the parent record carries a list of accessor-projected keys. Conflating container and dispatch into a single axis would force a fourth synthetic combination ("positional but per-key list-valued") that nothing in the model corresponds to. + +== Cross-axis invariants + +Three pairings are structurally illegal; `SourceKey`'s compact constructor rejects them. The pipeline-tier tests pin SDL → emitted-shape end-to-end, and the cross-module compile against `graphitron-sakila-example` is the structural backstop. + +[cols="1,3"] +|=== +| Invariant | Why load-bearing + +| `SourceRowsCall ⇒ Wrap.Row` | The `@sourceRow` lifter contract pins output to entry-point columns shaped as `RowN<...>`. `GeneratorUtils.buildLifterRowKey` emits `$T key = Lifters.method((BackingClass) env.getSource())` where `$T` is `sourceKey.keyElementType()`; the local must be `RowN<...>` for the assignment to type-check. A `Wrap.Record` slipping through would emit a `RecordN<...>`-typed local fed by a `RowN<...>`-returning method ; the generated source wouldn't compile. + +| `AccessorCall ⇒ Wrap.Record` | The rows-method body's parent-input VALUES loop emits `DSL.val(k.value$L())` to extract the scalar payload off the per-key `RecordN<...>`. `value$L()` exists on `RecordN<...>` but not on `RowN<...>`. The invariant ensures `keyElementType()` is a `RecordN<...>` type and the `value$L()` invocation type-checks against the local key variable. + +| `ServiceTableRecord` target-aligned ⇒ empty `path` | When the service returns a typed `TableRecord` whose class matches the field's target table, walking past target via a `path` chain is structurally redundant ; the service already produced a target-aligned record. The `Wrap.TableRecord` arm in `GeneratorUtils.buildKeyExtraction` emits `parent.into(Tables.X)` directly without walking; the invariant guarantees a misaligned record never reaches this site. +|=== + +Each invariant is one paragraph at a single place (the compact constructor) but governs the emit shape at multiple consumers downstream. Relaxing one without auditing the consumer side surfaces as a pipeline-test failure or a compile error in the generated `graphitron-sakila-example` source, not as a runtime surprise. + +== Consumer-side dispatch + +Each emit site reads off whichever axis it actually forks on, without re-deriving the axis from a conflated identity: + +* `GeneratorUtils.buildRecordParentKeyExtraction` switches over `sourceKey.reader()` to choose the parent-side extraction emit shape, then within the `AccessorCall` arm reads `sourceKey.cardinality()` to choose single-vs-list emit. Two axes, two reads ; the dispatch is exhaustive over each axis independently. + +* `GeneratorUtils.buildKeyExtraction` (for table-bound parents on the split-query and service paths) switches over `sourceKey.wrap()` to choose between `DSL.row(...)`, `parent.into(table.col, ...)`, and `parent.into(Tables.X)` ; one axis, one read. + +* `DataLoaderFetcherEmitter.build` reads `registration.container()` to pick `DataLoaderFactory.newDataLoader` vs `newMappedDataLoader`, and `registration.dispatch()` to pick `loader.load(key)` vs `loader.loadMany(keys)`. Two axes, two reads; the same `SourceKey` can be paired with either container. + +* `RowsMethodCall.batchLoaderLambda` reads `registration.container()` to choose `List<K>` vs `Set<K>` for the lambda's keys parameter ; one axis, one read. + +* `RowsMethodSkeleton.build` dispatches the body framing on the `RowsMethodBody` permit, which the caller projected from `(sourceKey.reader(), registration.container())`. The skeleton's exhaustive switch over five `RowsMethodBody` permits is the seam between body construction (per-shape) and outer-method framing (uniform across permits). + +The pattern: each consumer's switch is exhaustive over exactly one axis, and the compiler enforces that adding a new arm to any axis breaks every consumer whose dispatch isn't yet aware of it. + +== Connection to the principle + +This is the live worked example for xref:rewrite-design-principles.adoc#sealed-hierarchies-over-enums-for-typed-information[Sealed hierarchies over enums for typed information]. The four-axis split is the principle in action: each axis is a sealed sub-hierarchy or enum carrying exactly the information its consumers need, and the compiler enforces exhaustive switches at every dispatch site. The smell the principle warns about ; a single shared accessor whose meaning depends on the variant, or a permit name that splices two axes together ; is the alternative this model rejects by construction. diff --git a/docs/architecture/explanation/index.adoc b/docs/architecture/explanation/index.adoc new file mode 100644 index 0000000000..c292b6989d --- /dev/null +++ b/docs/architecture/explanation/index.adoc @@ -0,0 +1,12 @@ += Architecture: Explanation +:description: Design rationale for the Graphitron generator. +:!toc: + +Why the generator is shaped the way it is. + +* xref:rewrite-design-principles.adoc[Rewrite Design Principles] — the architectural and technical principles that govern classifier and emitter. +* xref:pipeline-overview.adoc[Pipeline overview] — how a `.graphqls` schema flows from parse to consumer compile. +* xref:dispatch-axes.adoc[Dispatch axes] — the four-axis dispatch model behind DataLoader-backed source-side fields. +* xref:typed-rejection.adoc[Typed rejection] — why rejection is a typed variant, the `Rejection` taxonomy, and the candidate-hint contract. + +xref:../index.adoc[← Architecture] diff --git a/docs/architecture/explanation/pipeline-overview.adoc b/docs/architecture/explanation/pipeline-overview.adoc new file mode 100644 index 0000000000..6e3f1f020b --- /dev/null +++ b/docs/architecture/explanation/pipeline-overview.adoc @@ -0,0 +1,28 @@ += Pipeline overview +:description: How a .graphqls schema flows through the Graphitron generator from parse to consumer compile. +:!toc: + +The generator turns `.graphqls` files into Java sources in a fixed pipeline: parse, classify, validate, emit, write, and (for the reference consumer) compile. + +[source,mermaid] +---- +flowchart LR + A[".graphqls files"] --> B["RewriteSchemaLoader<br/>(parse + auto-inject<br/>directives.graphqls)"] + B --> C["GraphitronSchemaBuilder<br/>(classify into<br/>GraphitronSchema)"] + C --> D["GraphitronSchemaValidator<br/>(reject Unclassified*,<br/>surface diagnostics)"] + D --> E["Generators<br/>(TypeFetcher / TypeClass /<br/>TypeConditions /<br/>QueryConditions / ...)"] + E --> F["JavaFile.writeToPath<br/>(idempotent writes,<br/>orphan sweep)"] + F --> G["consumer compile<br/>(graphitron-sakila-example<br/>verifies type + behaviour)"] +---- + +Three things to know about this pipeline that the diagram doesn't show: + +. *The loader auto-injects `directives.graphqls`* from the `graphitron` jar before parse, so consumer schemas never re-declare the canonical directives. This is what lets the classifier treat directive presence as ground truth one stage later: the schema loader has already fed every directive declaration into the parsed schema, regardless of whether the consumer's `.graphqls` files mentioned them. + +. *Classification is the only place directives are read.* `GraphitronSchemaBuilder` reads each directive once and resolves everything the generator needs into typed model values: table names, column references, method names, extraction strategies, batch keys. Generators downstream see the classified model and never touch directive syntax. The boundary keeps the model "what to emit," never "what to interpret." + +. *The writer's idempotency contract is unconditional.* On every run, `JavaFile.writeToPath` writes only files whose rendered content differs from disk (SHA-256 comparison) and deletes orphans in rewrite-owned sub-packages. Both halves run on every emit, not just full builds; this is what keeps the dev-loop's IDE-recompile times proportional and what stops a delete-a-type cycle from leaving stale files behind. Pinned by `IdempotentWriterTest` and `GeneratorDeterminismTest`. + +The xref:../reference/code-generation-triggers.adoc[Code Generation Triggers] page is a zoomed-in view of the middle three stages (schema → classified model → generators). This page names the loader, the validator, the writer's idempotency contract, and the consumer compile that closes the loop. + +xref:index.adoc[← Explanation index] diff --git a/docs/architecture/explanation/rewrite-design-principles.adoc b/docs/architecture/explanation/rewrite-design-principles.adoc new file mode 100644 index 0000000000..840a34459a --- /dev/null +++ b/docs/architecture/explanation/rewrite-design-principles.adoc @@ -0,0 +1,270 @@ += Rewrite Design Principles + +Technical and architectural principles that govern the rewrite pipeline. For Graphitron's strategic/philosophical principles, see xref:../../graphitron-principles.adoc[graphitron-principles.md]. + +The typed-rejection narrative (the sealed `Resolved` shape across the resolver siblings, the `Rejection` taxonomy, the Levenshtein-ranked candidate hint contract) is consolidated at xref:typed-rejection.adoc[Typed rejection]; this doc retains the principle-list shape, with the rejection-related principle below collapsed to a forward pointer. + +''' + +== Generation-thinking + +*Before implementing a generator body, ensure the model carries what the generator needs ; pre-resolved, generation-ready.* `GraphitronSchemaBuilder` reads directives once and resolves everything: table names, column references, method names, extraction strategies. Generators receive a model in terms of "what to emit", not "what to interpret". + +Signs a model type needs more pre-resolution: +- A generator switches on a raw string, or recomputes a derived name from a field name. +- The same multi-arm type switch recurs across multiple generators. +- Generation and calling are conflated in the same model type. +- A generator branches on a predicate over pre-resolved data (e.g. which side of a join holds the FK). The decision was not resolved, only its inputs were ; lift the fork into the model as a sealed sub-variant. Rule of thumb: if two consumers (generators, validators, resolvers, dispatchers) evaluate the same predicate over a model field, the branch belongs in the model. The same predicate evaluated by multiple consumers is a sign the resolver is under-specified, and an opportunity for one site to drift from another. + +== Sealed hierarchies over enums for typed information + +When different variants of a concept carry different data, use a sealed interface ; not an enum with a shared field set. An enum forces every variant to have the same shape; a sealed record hierarchy gives each variant exactly the fields it needs. + +`SourceKey.Reader` illustrates the pattern at its current shape: `ColumnRead` carries no payload (catalog-FK columns live on the surrounding `SourceKey`, not the reader), `AccessorCall(AccessorRef)` carries the typed instance accessor on a record-backed parent's backing class, `SourceRowsCall(LifterRef)` carries the developer-supplied `@sourceRow` static lifter, `ServiceTableRecord(ClassName)` carries the developer-declared typed jOOQ `TableRecord` subclass the `@service` method returns, and `ServiceUntypedRecord` carries no payload (untyped `Record`/scalar service return). Each variant holds exactly the data its rows-method body needs to read parent-side input; none carry fields they don't use. `SourceKey.Wrap` is a sibling sealed: `Row` / `Record` / `TableRecord(ClassName)`, where the `TableRecord` arm carries the developer-declared subclass and the other two arms carry nothing. The compiler enforces exhaustive switches ; when a new variant is added, every switch that doesn't handle it becomes a compile error. + +When variants split on independent axes, use sealed sub-interfaces per axis (or separate records orthogonal to the variant axis) rather than inventing a god accessor whose meaning depends on the variant. The DataLoader-backed source side is the worked example: `SourceKey.Wrap` carries per-row key shape, `SourceKey.Reader` the body input contract, `SourceKey.Cardinality` (ONE / MANY) the per-source row count, and a sibling `LoaderRegistration` record carries `Container` (POSITIONAL_LIST / MAPPED_SET) and `Dispatch` (LOAD_ONE / LOAD_MANY). Each dispatch site reads off whichever axis it forks on instead of reconstructing it from a conflated permit. The xref:dispatch-axes.adoc[Dispatch axes] chapter narrates the four-axis split, the cross-axis invariants the compact constructor pins, and the consumer-side dispatch shapes. The smell to watch for: a single shared accessor whose meaning depends on the variant (e.g. "FK source columns" in one arm and "child target columns" in another), or a sealed permit name that splices two axes together. The split pushes the per-axis meaning into the type system. + +== Directives carry only what the SDL author needs to say + +Directive arguments should be flat scalars whenever the directive site already disambiguates the axis. An input-object wrapper is justified only when the directive carries several genuinely-orthogonal pieces of information at once; the default is a single typed scalar (`String!`, `Int!`, an enum), and reaching for an input wrapper is a deliberate decision rather than a default. + +`@field(name: String!)` is the worked example. The directive applies on four sites (`FIELD_DEFINITION`, `INPUT_FIELD_DEFINITION`, `ARGUMENT_DEFINITION`, `ENUM_VALUE`); the site itself tells the classifier which axis is being bound (column vs argument vs enum-value), so the directive only carries the underlying name. There is no `@field(target: { axis, name })` wrapper, because the axis is structural. + +The smell to watch for is an input wrapper that most callsites fill in two-of-four slots on. SDL authors end up typing a structured literal where a string would have served, and the directive's failure-mode surface widens from "the named thing didn't resolve" to a cross-product of "field A missing", "field B given but A wasn't", "A and B given but inconsistent". `ExternalCodeReference` (`name`, `className`, `method`, `argMapping`) is the existing case that new directive surfaces should not lean on; new directives default to `@field`'s shape. + +== Classification belongs at the parse boundary + +Reading the reflection `java.lang.reflect.Type` tree is permitted only at builder-side classifiers that convert reflection output into the typed model. Today five files cross that boundary: `ServiceCatalog` (for `@service` and `@tableMethod` parameter classification, including the post-R7 `classifySourcesType` for DataLoader source parameters); `ServiceDirectiveResolver` (for `@externalField` reference methods); `SourceRowDirectiveResolver` (R110, for the developer-supplied `@sourceRow` lifter signature); `ClassAccessorResolver` (R88, for resolving an SDL output field's accessor on a record-backed parent against the reflection-derived backing class's method set); and `FieldBuilder` (for `@sourceRow` argument-mapping and accessor reflection on record-backed parents whose backing class carries typed FK accessors). Each converts raw reflection output into `MethodRef.Param`, `SourceKey`, `LoaderRegistration`, `AccessorRef`, or `AccessorResolution` values (each carrying a `ParamSource` where applicable). Everything downstream ; validator, generator ; switches on the pre-classified values and never touches reflection types. + +The boundary lives at `JooqCatalog`: it is the canonical permitted holder of raw jOOQ types (`Table<?>`, `ForeignKey<?,?>`) and the path classifier code goes through. Two other classes also import `org.jooq` directly today: `BuildContext` (`ForeignKey` for `@reference` validation messages that need to enumerate keys for the candidate hint) and `catalog/CatalogBuilder` (`ForeignKey` + `Table` for the LSP completion-data snapshot, which marshals catalog metadata into a wire format the LSP server consumes). `TypeBuilder`, `FieldBuilder`, and `ServiceCatalog` consume the classified output via `JooqCatalog` rather than holding raw types directly. If a generator needs information not yet in a taxonomy record, the fix is to add a component and extract the value in the builder ; not to reach past the taxonomy boundary. + +`CallSiteExtraction` illustrates the principle for argument extraction: the builder decides once (at classify time) which extraction strategy applies to each argument ; one of five direct strategies (`Direct`, `EnumValueOf`, `TextMapLookup`, `ContextArg`, `JooqConvert`) or one of two sealed sub-groupers covering nested-input traversal (`NestedInputField`, for `@condition` on `INPUT_FIELD_DEFINITION`) and NodeId decode (`NodeIdDecodeKeys.{SkipMismatchedElement | ThrowOnMismatch}`) ; and stores that decision in `CallParam.extraction` or `ParamSource.Arg.extraction`. The generator switches on the pre-classified value and emits code directly. + +== Capability interfaces and sealed switches serve different roles + +When a generation pattern applies uniformly across multiple field variants, use an orthogonal capability interface rather than an N-way `instanceof` chain. Established interfaces: `SqlGeneratingField`, `MethodBackedField`, `BatchKeyField`. + +Capabilities express what is *uniformly true* across variants; sealed switches express what *varies by identity*. Use a capability when the generator treats variants identically (iterate `SqlGeneratingField.filters()` regardless of leaf type). Use a sealed switch when the generator forks on identity (which `$fields` arm to emit, which rows-method signature to synthesise). Capabilities don't eliminate exhaustiveness bookkeeping ; they relocate it. + +== Narrow component types over broad interfaces + +Field record components are declared with the narrowest type the classifier can guarantee rather than the broad sealed-interface root. A field whose return type is always table-bound declares `ReturnTypeRef.TableBoundReturnType` directly; a field whose return type is always polymorphic declares `ReturnTypeRef.PolymorphicReturnType` directly. + +This pushes classification certainty into the type system: code that receives a `ServiceTableField` knows its `returnType` is `TableBoundReturnType` without a runtime check. + +== Sub-taxonomies for resolution outcomes + +Complex resolution outcomes get their own sealed type rather than being stored as raw strings. `SourceKey.Wrap` (sealed: `Row` / `Record` / `TableRecord(ClassName)`) is the key-shape sub-taxonomy on `MethodRef.Param.Sourced` and `ParamSource.Sources`, `TableRef` of `GraphitronType.TableBackedType`, `ColumnRef` of `InputField.ColumnField`. The type of a field tells you exactly what states it can be in. + +Each new sub-taxonomy proposal comes with a one-line note on what distinct information it carries that a sibling cannot ; otherwise it's probably a field on an existing record. At milestone boundaries, audit which sub-taxonomies could collapse now that their forcing functions are visible. + +== Builder-internal sealed hierarchies for multi-target classification + +When a builder step classifies inputs into many variants that project into *different* generation-ready outputs, introduce a builder-internal sealed hierarchy. It captures the full classification, enables exhaustive projection into each target, and is discarded before reaching the model. + +`ArgumentRef` (see xref:../reference/argument-resolution.adoc[argument-resolution.md]) classifies every GraphQL argument once into a variant (`ColumnArg`, `OrderByArg`, `PaginationArgRef`, `TableInputArg`, etc.). Separate projection steps then switch on the classified values to produce `GeneratedConditionFilter`, `LookupMapping`, `OrderBySpec`, and `PaginationSpec` ; each projection is exhaustive and independent. The alternative ; multiple independent passes that implicitly coordinate by skipping each other's arguments (e.g., `buildFilters()` skipping pagination args using the same hardcoded names as `buildPaginationSpec()`) ; is fragile and makes adding new argument types error-prone. + +The key distinction from model-level sealed hierarchies: builder-internal hierarchies are ephemeral. They exist to structure a complex builder decision, not to carry information to generators. Generators never see `ArgumentRef` ; they see the projected results. + +== Builder-step results are sealed, not strings or out-params + +Every builder-step lift returns a sealed `Resolved`; rejection is a typed variant, never a string or out-param. The full narrative (sealed `Resolved` shape across the thirteen resolver siblings, the `Rejection` taxonomy, the `BuildContext.candidateHint` contract) lives at xref:typed-rejection.adoc[Typed rejection]. + +== Model metadata over parallel type systems + +When the model already carries typed information, runtime data formats should derive from that metadata rather than inventing a parallel type system. + +`OrderByResult` pairs `List<SortField<?>>` with `List<Field<?>>` ; each cursor column's `DataType` is already known. Cursor encode/decode should use `field.getDataType().convert()` for type-safe round-tripping, and `DSL.noField(field)` for the no-cursor seek case. This eliminates the need for a hand-rolled type-tag system (`i:`, `s:`, `l:`) in the cursor format ; the column metadata *is* the type information. + +The general principle: when the model has already classified and resolved type information at build time, that same information should drive any runtime format that needs types. A parallel type system in the runtime format is redundant and will diverge. + +== Wire-format encoding is a boundary concern, never a model concern + +Opaque wire formats (Relay NodeId base64 strings, Relay cursor strings, federation `_Any` representations) decode at the DataFetcher boundary into typed column tuples; everything downstream sees those tuples, not the wire shape. Conversely, the projection layer encodes column tuples back into wire format only at the same boundary. Variants representing the wire shape don't survive in the model. + +R50 is the worked example. The retired wire-shape carriers ; `InputField.NodeIdField` / `NodeIdReferenceField` / `NodeIdInFilterField` / `IdReferenceField`, `ChildField.NodeIdField` / `NodeIdReferenceField`, `BodyParam.NodeIdIn`, `LookupMapping.NodeIdMapping`, `ArgumentRef.ScalarArg.NodeIdArg` ; were each "the model says this is a NodeId" markers that forced downstream emitters to call `NodeIdEncoder.hasIds(...)` or similar wire-aware helpers across the boundary. The replacement: `CallSiteExtraction.NodeIdDecodeKeys.{SkipMismatchedElement | ThrowOnMismatch}` lives at the carrier slot where decode happens (input-fields, arg-level filters, lookup-key bindings); `CallSiteCompaction.NodeIdEncodeKeys(HelperRef.Encode)` lives at the projection slot where encode happens (column-shape carriers on output); `BodyParam.ColumnPredicate.{Eq | In | RowEq | RowIn}` carries the predicate shape over decoded column tuples without needing to know the predicate came from a wire-format input. Standard column predicates and lookup VALUES rows fall out for free. + +The pattern matches Connection-cursor encode/decode (which already lives at `ConnectionHelper.encodeCursor` / `decodeCursor` and never reached the model), and the federation `_Any` rep flow (which reads the rep at `EntityFetcherDispatch.resolveByReps` and walks alternatives over decoded values, never as opaque blobs). + +The general rule: for any opaque wire format, classify the failure mode (skip vs throw) and the direction (encode vs decode) at the boundary, never below it. A "this is a NodeId" or "this is a base64 cursor" marker spreading through the model is the same family of smell as a parallel runtime type system ; both are bypasses around classified information that the boundary already carries. + +== Wire boundaries are typed adapter / composer pairs + +Where the generator emits a method that crosses the wire-format boundary, it emits it in pair with a composer: the adapter takes `DataFetchingEnvironment` (or the wire-shape input) and produces typed values; the composer takes those typed values and does the actual work. The two share name and a table-anchor parameter, and the composer's signature is exactly the shape the adapter yields after decoding. The boundary is the pair, not the adapter alone. + +The worked example is the generated `QueryConditions.<method>(Table, DataFetchingEnvironment)` plus the user-written `<X>Conditions.<method>(Table, ...)` it forwards to. The adapter decodes `NodeId` strings, walks input maps, and hands typed jOOQ values across the boundary; the composer takes those values (`Row<N><T1, ..., TN>`, `String`, `List<T>`, ...) and composes a `Condition`. Same name, same table-first arg, two halves of one boundary. + +The smell to watch for is asymmetric typing across the pair: most often the adapter erasing type information the composer needs (e.g. an arity-erased `RowN` instead of the `Row<N><T1, ..., TN>` the decoder actually produced). When that happens, the composer's signature stops documenting the contract, and column-shape errors that should be compile failures become DSL-runtime surprises. The fix is to honour the type the decoder produces, not to widen the composer to absorb the loss. R79's switch from `RowN` to `Row<N><...>` is the application of this principle: the adapter side of the boundary already had `Record<N><T1, ..., TN>` from the typed `instanceof` pattern; the composer side just needed to type its argument the same way. + +The principle generalises beyond `QueryConditions`: any `(env, ...) -> typed-args` adapter that the generator emits in front of a user-written or emitter-written composer should land with the same symmetric typing. Drift between the two is a smell that the adapter is hiding the boundary rather than crossing it. + +== Validator mirrors classifier invariants + +Every classifier decision that implies a generator branch must fail at validate time if that branch is unimplemented. The validator reads the same dispatch sets the generator does, so an unsupported classification surfaces as a build-time error rather than a runtime `UnsupportedOperationException`. The dispatch state lives in `TypeFetcherGenerator` as a four-way disjoint partition over every `GraphitronField` sealed leaf: `IMPLEMENTED_LEAVES` (real fetcher arm), `PROJECTED_LEAVES` (emitted inline by `TypeClassGenerator.$fields`), `NOT_DISPATCHED_LEAVES` (cannot reach the fetcher switch), and `STUBBED_VARIANTS.keySet()` (stub-emitting variants). The partition is exhaustive and disjoint by construction; `GeneratorCoverageTest.everyGraphitronFieldLeafHasAKnownDispatchStatus` enforces both properties. This closes the gap between "the schema classifies cleanly" and "the emitter has an arm for this leaf". `ValidateMojo` consumes the stubbed-variant set and fails the build by default. + +The rule extends beyond stubbed variants: when a classifier introduces a new invariant (e.g. "`@asConnection` not allowed on inline `TableField`"), the validator should reject it by the same mechanism the generator relies on ; no generator-side invariant goes unchecked at validate time. This keeps "problems caught at build time" honest and the generator's builder-invariant assumptions emitter-side safe. + +== Classifier guarantees shape emitter assumptions + +The rule above flows in one direction: a classifier rejection becomes a build-time error via the validator. The reverse direction also matters. A classifier acceptance can let an emitter assume narrower shapes, so the emitted code reads as tight as if it were hand-written: no defensive casts, no wildcard locals, no `instanceof` guards. The principle anchors on three layers: + +. *Type-system narrowing at the producer.* The narrowness the consumer needs lives in the producer's signature ; a record component, a return type, a sealed sub-variant. Once carried in the type, the contract is mechanically enforced and the consumer compiles unchanged. +. *Pipeline-tier tests.* SDL → classified model → generated `TypeSpec` coverage pins the end-to-end shape; a regression that breaks the narrowed contract trips the pipeline test before the cross-module compile. +. *The `graphitron-sakila-example` compile as cross-module backstop.* `mvn compile -pl :graphitron-sakila-example -Plocal-db` against a real jOOQ catalog catches any classifier/emitter mismatch during the build, before any code reaches a consumer. + +Compared with defensive runtime casts (which can throw `ClassCastException` on a real request, days after the build passed) or `var`-typed locals fed into parameterised entry points (which abandon the strict-shape guarantee entirely), the type-system-narrowed shape is the safest expression of the contract. + +Two worked examples illustrate the principle and the candidate type-system lifts that would carry each contract structurally: + +- *`@tableMethod` root fetcher.* `ServiceCatalog.reflectTableMethod` rejects developer methods whose return type is wider than the generated jOOQ table class. `TypeFetcherGenerator.buildQueryTableMethodFetcher` declares `<SpecificTable> table = Method.x(...)` with no cast, and feeds the local directly into `<SpecificTable>Type.$fields(...)` which expects exactly that type. The candidate type-system lift is *multi-record type-token threading*: parameterise `MethodRef.StaticOnly` and `ReturnTypeRef.TableBoundReturnType` on a shared type token, then thread it through every site that constructs or reads either. The lift's blast radius is structural; jOOQ helper boundaries also accept type erasure per § "Selection-aware queries", capping how far the bound carries. Pre-lift, the pipeline tests plus the sakila-example compile pin the shape; post-lift, the signature carries the contract. + +- *`ColumnField` parent table.* The classifier produces a `ColumnField` only on a table-backed parent. The candidate type-system lift is a *single-record addition*: add a non-null `parentTable` record component to `ColumnField` at construction, populated by the classifier. The lift eliminates the parameter currently threaded into `TypeFetcherGenerator.generateTypeSpec` and the `IllegalStateException` reachability arm in the switch. + +When a contributor wants to record a producer-consumer linkage explicitly ; because the type-system lift isn't viable for the key and the principle's three anchors don't visibly tie the two sites together ; the recommended mechanism is a javadoc `{@link}` from the consumer to the producer (and optionally back). `{@link}` is IDE-refactor-tracked (renaming the producer auto-updates the link), carries no prose burden, and reuses the doc-tool the codebase already has. No custom annotation, no audit infrastructure to maintain. + +Rule: if you relax a producer's check body, audit every emitter site that consumes the corresponding shape, in the same commit. The pipeline tests and the cross-module compile are the safety net. + +== Pipeline tests are the primary behavioural tier + +Behaviour is asserted at the SDL → classified model → generated `TypeSpec` pipeline layer, not at the per-variant unit tier. Per-variant structural tests (method names, return types, which methods exist) are bookkeeping; the primary signal that a feature works is that a realistic SDL produces a realistic `TypeSpec` end-to-end through the classifier. New features earn a pipeline test first; unit tests cover structural invariants that pipeline coverage would make repetitive. + +Complementary tiers layered above: compilation of `graphitron-sakila-example` against real jOOQ classes (type correctness); execution of the generated code against real PostgreSQL (behaviour correctness). Code-string assertions on generated method bodies are banned at every tier; they test implementation, not behaviour, and break on every refactor. + +For canonical tier names, file locations, the decision rubric, and the `@UnitTier` / `@PipelineTier` / `@CompilationTier` / `@ExecutionTier` meta-annotations, see xref:../how-to/testing.adoc[Test-tier guide]. + +== Documentation names only live tests/code + +Two failure modes share one principle: trusted documentation that the code does not mechanically pin. + +The narrow failure mode: javadoc, plan prose, and README references that name a test, method, or class must name one that exists today. A javadoc comment saying "enforced by `GeneratorCoverageTest.everyGraphitronFieldLeafHasAKnownDispatchStatus`" when that method does not exist is worse than no comment ; it's a false invariant that readers trust. When a plan's wording anticipates a method, class, or test that the same plan will create, phrase it as "C3 adds `X`" rather than "as asserted by `X`". + +The broader failure mode: invariant claims that no live test, type, or assertion pins. A javadoc, annotation `description`, or doc paragraph saying "the producer rejects X so the emitter may assume Y" is exactly the same false-invariant family the narrow form names ; the symbols referenced may exist today, but if X gets silently relaxed (a `ClassName.equals` widened to `startsWith`, an `instanceof` arm broadened), the claim is silently false and readers still trust it. The fix is the same: pin the invariant in the type system or in a test that fails when the invariant fails, and let the documentation describe what's pinned rather than make a claim of its own. + +Reviewers check this explicitly during Draft → Approved and Pending Review → Done transitions; spot-check both forms. + +== Compilation against real jOOQ is a test tier + +`mvn compile -pl :graphitron-sakila-example -Plocal-db` against a real jOOQ catalog is the primary check that generated emission is type-correct. Unit tests assert structure; pipeline tests assert SDL → TypeSpec shape; compilation catches "the `Field<Record4<Int,Str,Int,Str>>` parameter doesn't line up with the emitted DSL call" without a hand-written assertion. Every generator change must pass `-Plocal-db` compile before merging. + +The complementary tier above it, execution against a real PostgreSQL via the same fixture database, is the behaviour check. Together, compile + execute replace the body-content assertions that the "generation-thinking" principle bans. + +See xref:../how-to/testing.adoc[Test-tier guide] for build commands and guidance on choosing between tiers. + +== Generator Java version vs. generated output Java version + +Graphitron is a code generator. The Java version used to build the generator is independent of the Java version of the source it emits. + +- *Generator implementation* (almost everything in the reactor) may freely use Java 25 features ; sealed classes, pattern matching, records, switch expressions, switch patterns, text blocks, scoped values, and so on. The parent pom's `requireJavaVersion` enforcer pins the minimum to 25. The one exception is the hand-written runtime category below, which opts back down to 17 in its own pom. +- *Generated source files* must target Java 17. Consumers compile Graphitron's output with their own toolchain, which may be Java 17. Generator authors are responsible for ensuring that any syntax emitted into generated files is valid Java 17 ; no switch patterns, no sequenced collections API, nothing that requires 21+. `graphitron-sakila-example` compiles with `<release>17</release>` to verify this. +- *Hand-written runtime artifacts consumers depend on* must target Java 17, for the same reason as generated output: a runtime jar a consumer puts on the same classpath as Graphitron-generated sources must not require newer bytecode than that Java 17 floor. This is a distinct category from both of the above: not generated, but shipped to and run by consumers. `graphitron-jakarta-rest` (the reusable GraphQL-over-HTTP serving library) is the first instance; it overrides its main compile to `<release>17</release>` in its own pom while inheriting the parent's `-Xlint:all -Werror`. The generator itself stays Java 25. + +The practical implication: when adding code, distinguish between code *in* the generator (unrestricted Java 25), code *emitted by* the generator (Java 17), and hand-written runtime code *shipped to* consumers (Java 17). + +== Generated code is read and debugged + +*Emitted code is read, breakpointed, and stack-traced by the consumers who depend on it ; optimise it for their legibility, not for emitter-side brevity.* A generated method that throws on a real request must produce a stack frame, a line, and locals that a developer who has never seen the generator can reason about. This is the readability companion to "Classifier guarantees shape emitter assumptions": that principle keeps emitted code *tight* (no defensive casts, no wildcard locals); this one keeps it *legible*. + +Concrete rules for any code a generator emits: + +- *Explicit types, never `var`.* The reader of generated code does not have the generator's context; an explicit type at every local is documentation. (The same `var`-ban appears in "Classifier guarantees shape emitter assumptions" for a different reason ; there it protects the strict-shape guarantee, here it protects the reader.) +- *Meaningful local names; short is good, throwaway is not.* `nodeId`, `key`, `sakKey` over `_s`, `_r`, `_nl`. Underscore-prefixed pattern-binding names carry no meaning and read as noise; a bare `_` is reserved in Java 21+ besides. Short names are welcome when they name the thing (`row`, `key`); cryptic ones are not. +- *Statement form over expression tricks.* Prefer named locals and `if`/`else` blocks over deeply-nested ternaries, and never reach for an expression-only contortion (the `((Supplier<X>) () -> { throw ...; }).get()` throw-inside-an-expression trick is the canonical offender) solely to keep emission inline. A developer cannot set a breakpoint inside a ternary arm or read a meaningful frame from a lambda-wrapped throw. +- *When the output must be an expression* (it is consumed as a method-call argument, a field initialiser, a stream lambda), lift it into a named private helper method per the <<Helper-locality>> convention so the call site stays an expression while the *body* is readable statement form. The helper name documents intent (`decodeSakKey(...)`), and the helper body gets explicit types, named locals, and ordinary control flow. +- *No `__`-prefixed Java identifiers in emitted code.* Emitted locals, lambda parameters, and method parameters use readable names (`row`, `byPk`, `fetched`, `violations`), never a `__`-prefixed default (`__r`, `__byPk`, `__fetched`). The generator emits every name in scope, including the method signature, so a collision is always knowable at generation time; the `__` prefix buys no safety that a readable name plus generation-time awareness does not already provide. Where an author-derived identifier (a GraphQL argument or input-component name) becomes a local, namespace it with a *readable, deterministic* prefix computed against the known-in-scope names (`arg_<name>`, `c_<name>`), never a blanket `__`. The `__`-prefix legitimately survives in two other shapes, both of which reach generated code as *string literals*, never as Java identifiers. First, *synthetic SQL column aliases* (`__sort__`, `__idx__`, `__rn__`, `__typename`, `__pkN__`), which live in the result-set column namespace alongside consumer-controlled table columns and wrap in `__` precisely to avoid colliding with a real column; by convention each is declared as a named constant carrying the collision rationale at its site (the meta-test does not pin the constant form, only the identifier-vs-literal boundary, so the constant discipline is a readability convention, not an enforced invariant). Second, *spec-defined external names we reference but do not own*: jOOQ's reflective `__NODE_TYPE_ID` / `__NODE_KEY_COLUMNS` metadata constants, the Apollo-Federation `federation__*` / `link__*` SDL scalars, and the GraphQL introspection `__typename` meta-field (read off a federation representation map, distinct from the synthetic `__typename` SQL column that happens to share its spelling). The discriminator, and the one the no-regression meta-test keys on, is *Java identifier vs string literal in the emitted output*: a lazy dunder surfaces as a bare identifier and fails the test; every legitimate `__` name above surfaces as a string literal (or, for the jOOQ metadata, a reflective field-name argument) and is masked before the scan. The only `__`-led identifier the test allowlists is jOOQ's `__NODE_*`, on the rare path where the generator references that reflective constant by name rather than by value. + +The smell to watch for: an emitter building a `CodeBlock` whose template spans several lines of nested `? :`, casts to `Object` to dodge a parameterised `instanceof`, and binds `_x`-style locals. That block is being written for the emitter author's convenience, not the consumer's; the fix is a named helper with a statement body. `ArgCallEmitter.buildNodeIdDecodeExtraction` is the current worked counter-example and the R260 cleanup target. + +== The reactor is self-contained + +The repo root `pom.xml` is a single self-contained Maven reactor. `mvn install` on a clean local repo builds every module (`graphitron-javapoet`, `graphitron`, `graphitron-fixtures-codegen`, `graphitron-sakila-db`, `graphitron-sakila-service`, `graphitron-mcp`, `graphitron-jakarta-rest`, `graphitron-maven-plugin`, `graphitron-sakila-example`, `graphitron-lsp`, `roadmap-tool`) with no dependency outside the pinned third-party set. + +The legacy `graphitron-parent` generator has been retired, so there is no second reactor and no cross-tree coordinate to guard against. The `graphitron-maven-plugin` module is the consumer entry point. + +''' + +== Emitter Conventions + +=== Return types + +DataFetchers return `Result<Record>` ; no DTOs, no TypeMappers. GraphQL-Java traverses records using the registered field DataFetchers. Exception: Connection fields return `ConnectionResult`, a generated carrier wrapping `Result<Record>` + pagination context. + +=== Selection-aware queries + +`DataFetchingFieldSelectionSet` and `SelectedField` are threaded through all table method signatures, structurally committing to selection-aware queries: + +- *Top-level queries*: call `Type.$fields(sel, table, env)` for the column list, then `dsl.select(fields).from(table)...` +- *Inline nesting*: use jOOQ `multiset(select(columns).from(CHILD).where(...)).as("alias")` returning `Field<?>` (type-erased). Use type erasure at every helper method boundary ; jOOQ generic types compound badly with nesting depth, causing slow compile times. +- *`@splitQuery`*: separate DataLoader; parent fetches FK/PK columns, child batches by those keys. + +Selection-driven queries produce different SQL per request, preventing cached query-plan reuse. This is an acceptable trade-off for wide tables with large optional columns; for narrow tables (≤ 10 columns) where most fields are always requested, `TABLE.*` is simpler and the dynamic-column overhead exceeds the benefit. + +=== Error quality + +`BuildContext.candidateHint(attempt, candidates)` sorts candidates by Levenshtein distance. The Levenshtein-suggestion contract has consolidated onto `BuildContext` and `Rejection` (the rejection-construction sites), with classifier-side callers thinning out as rejections are produced through the typed sealed-result path. Today: 17 occurrences across five files ; 7 in `BuildContext`, 3 in `TypeBuilder`, 3 in `Rejection`, 2 in `FieldBuilder`, 2 in `EnumMappingResolver`. When adding new jOOQ existence checks in the validator or builder, follow the same pattern ; pass the relevant candidate list from `JooqCatalog` to `candidateHint`, or produce the rejection through `Rejection.unknownName(...)` so the candidate list rides on the typed result. + +=== Column value binding: `DSL.val(rawValue, col.getDataType())` + +When emitting code that binds a raw GraphQL input value (from an input map or `env.getArgument(...)`) +to a specific jOOQ column, always use the two-argument form: + +[source,java] +---- +DSL.val(rawValue, table.COL.getDataType()) +---- + +Do *not* use the one-argument form with a Java-side cast (`DSL.val((JavaType) rawValue)`): + +- GraphQL-Java delivers enum values as `String` ; a Java cast to the jOOQ enum class throws + `ClassCastException` at runtime. +- GraphQL-Java delivers `ID` scalars as `String` ; a cast to `Long` (or any numeric PK type) + also throws. +- The one-argument form ignores the column's registered jOOQ `Converter` entirely. + +The two-argument form hands `rawValue` to the column's `DataType` and its registered `Converter` +at bind time. No SQL `CAST` is rendered; the coercion is purely Java-side, inside jOOQ. + +*`CallSiteExtraction` solves a different problem.* `Direct`, `EnumValueOf`, `TextMapLookup`, +and `JooqConvert` exist to produce a typed Java value for a *condition/ordering method parameter* +; code paths where a developer-written method expects the column's Java type, not a jOOQ `Field<T>`. +For inline jOOQ DSL expressions (INSERT `values(...)`, UPDATE `set(...)`, DELETE/UPDATE `where(...)` +predicates), `DSL.val(rawValue, col.getDataType())` does the coercion inside jOOQ without any +Java-side step, and no `CallSiteExtraction` switch is needed. + +Precedent: `LookupValuesJoinEmitter.addRowBuildingCore` (search for `DSL.val` with two arguments). + +For DTO-parent batching ; where the parent's backing class is a plain POJO or Java record without a +jOOQ FK to the child's `@table` ; see <<dto-parent-batching,DTO-parent batching>> below; the lifter +contract is how the schema author hands the framework a typed key when the catalog can't supply one. + +[#dto-parent-batching] +=== DTO-parent batching + +When a record-backed parent's backing class (reflected from its producer) is not a jOOQ `TableRecord`, the catalog cannot supply the +FK columns the column-keyed DataLoader path needs to batch a child `@table` field. The `@sourceRow` +directive closes that gap: the schema author supplies a static Java method that lifts a `RowN<...>` +batch key out of the parent DTO, plus the `targetColumns` (column names on the child table) the +key positions match. The classifier reflects on the lifter once at build time, validates the per-position +column-class match, and produces a `SourceKey` whose `Reader` is `SourceRowsCall(lifter)` and whose +`Wrap` is `Row`, carrying a `JoinStep.LiftedHop` (target table + slot list, single-hop by construction) +in the `path` and a `LifterRef` (declaring class + method name) on the reader. The lifted slots are +`JoinSlot.LifterSlot` permits, each folding source-side and target-side onto a single `ColumnRef` by +construction (DataLoader key tuple IS target-column tuple as a type fact, not a prose precondition). +The emitter feeds that into the existing `SplitRowsMethodEmitter.buildListMethod` path with no +identity branching: target accessors come from `WithTarget.slots()`, key extraction from the lifter +call. The lifter is the *single place* where the DTO → key mapping lives; if a schema author needs +a different key, they author a new lifter method, not a new emitter arm. + +=== Helper-locality + +Emitted helper methods that bind column references to a specific aliased jOOQ `Table` instance always take the `Table` as a parameter ; never declare it locally. Callers from different paths (root fetcher, inline subquery, Split-rows method) need to pass distinct aliases for the same target table; a locally-declared `Table` forces the wrong alias on every caller but the one the helper was first written for. + +Pattern (canonical example, `<fieldName>OrderBy` emitted by `TypeFetcherGenerator.buildOrderByHelperMethod`): + +[source,java] +---- +private static OrderByResult <fieldName>OrderBy(DataFetchingEnvironment env, <Table> table) { ... } +---- + +Each call site supplies the alias appropriate to its scope: the root fetcher passes its declared `<entity>Table`; a Split-rows method passes its FK-chain terminal alias; an inline subquery passes its correlated alias. The helper's column references resolve through the parameter. + +Compliant emitters (audit 2026-04-25): `TypeFetcherGenerator.buildOrderByHelperMethod`, `QueryConditionsGenerator`, `LookupValuesJoinEmitter` (root + child forms), `InlineLookupTableFieldEmitter`. `ConnectionHelperClassGenerator.pageRequest` / `encodeCursor` / `decodeCursor` are not Table-bound (operate on `Field<?>` / `SortField<?>`) and the rule does not apply. diff --git a/docs/architecture/explanation/typed-rejection.adoc b/docs/architecture/explanation/typed-rejection.adoc new file mode 100644 index 0000000000..bd6a7bd643 --- /dev/null +++ b/docs/architecture/explanation/typed-rejection.adoc @@ -0,0 +1,183 @@ += Typed rejection + +Why a classifier failed to produce a model variant is a typed value, not a string. Every builder-step lift returns a sealed `Resolved` result; the rejection arm carries a `Rejection` instance whose variant tells the validator and downstream consumers (LSP fix-its, watch-mode formatters) what kind of failure happened and what data accompanies it. Switches across success and failure modes are exhaustive at compile time; relaxing a producer surfaces as a missing-arm error in every consumer, not a runtime surprise. + +This page is the chapter narrative for that contract. Reference detail (the per-leaf record components, the per-resolver `Resolved` arms) lives on the source: javadoc on `Rejection` and on each `*DirectiveResolver.Resolved` carries the per-permit data shape. + +== Sealed `Resolved` across the resolver siblings + +Thirteen directive resolvers share the same shape. Each entry point returns a sealed `Resolved` whose arms split success from failure; the caller's switch is exhaustive across both. The arm names vary by domain (the `@lookupKey` resolver has only `Ok` / `Rejected`; the `@service` resolver fans `Ok` into typed sub-arms because the downstream emitters need different model types per success kind), but the contract is uniform: rejection is a typed sibling of success, not a return-string-or-null. + +Where a rejection comes from is at the boundary of one builder step; how it surfaces to the user is at the boundary of the validator. In between, the typed value rides on the result without losing structure: a `Rejection.AuthorError.UnknownName` arm carries its `attempt`, its `candidates`, and a typed `AttemptKind` tag identifying the lookup space, all the way from the resolver that built it to the LSP fix-it that reads them off the wire. + +The validator does not parse prose. It switches on the `Rejection` variant, formats the human-readable line with `message()`, classifies it as `AUTHOR_ERROR` or `INVALID_SCHEMA` or `DEFERRED` for the diagnostic surface, and emits. The same typed value drives every consumer: the validator's log, the LSP fix-it, an editor's hover-card, a CI annotation. None of them re-parse text. + +== `Rejection` taxonomy + +The `Rejection` sealed hierarchy splits along *who can fix this*: the schema author, the runtime author who hasn't shipped support yet, or the schema as a whole. + +[source] +---- +Rejection +├─ AuthorError ← the schema author can correct this +│ ├─ UnknownName ← name that didn't resolve against a closed set +│ ├─ Structural ← rule violation carrying prose only +│ ├─ AccessorMismatch ← record-backed parent's class doesn't expose the accessor +│ ├─ RecordBindingMultiProducer ← multiple producers reach one SDL type with disagreeing classes +│ ├─ TypeConflict ← cross-site contextArgument type-agreement disagreement +│ └─ MultiProducerDomainTypeDisagreement ← producers reach one SDL Object type with disagreeing env.getSource() Java domain types +├─ InvalidSchema ← the schema can't accept this combination at all +│ ├─ DirectiveConflict ← two directives co-occur in a rejected combination +│ ├─ CaseFoldCollision ← two type names are equal under case-folding +│ └─ Structural ← rule violation carrying prose only +└─ Deferred ← classifies cleanly but the generator hasn't emitted support yet +---- + +`AuthorError.UnknownName` is the data-rich arm: it carries the `attempt` the author wrote, the `candidates` the catalog had at this site (column names, table names, FK names, service-method names, ...), and an `AttemptKind` tag for downstream tooling. The kind is a typed tag rather than an arm split because every space carries the same `(attempt, candidates)` shape; an LSP fix-it that wants to offer "rename to one of these" reads `attempt` and `candidates` directly off the rejection without parsing the validator's prose. + +`AuthorError.Structural` and `InvalidSchema.Structural` are the prose-majority arms. They carry one `String reason` and exist because most rule violations are not name-against-closed-set lookups; they're "this combination cannot work, period" or "this rule was broken." Two arms instead of one because the diagnostic surface treats `AUTHOR_ERROR` and `INVALID_SCHEMA` differently: the first prompts the author to edit; the second prompts the author to drop or replace a directive entirely. + +`AuthorError.AccessorMismatch` is the third `AuthorError` arm because the record-backed-parent accessor-resolution surface (resolving an SDL output field's accessor against the parent's reflection-derived backing class) produces uniform diagnostics with a uniform fix shape (`@field(name: "...")`); a single arm with the hint baked into `message()` lets the resolver hand the validator the same typed value every site produces. + +`AuthorError.RecordBindingMultiProducer` is the fourth `AuthorError` arm, surfacing R96's producer-agreement check: when two or more producers (root producers or parent-accessor chains) reach the same SDL type with disagreeing reflected backing classes, the validator halts with a typed payload naming the SDL type and every disagreeing `ProducerBinding` site. The arm sits under `AuthorError` because the fix is author-correctable (align the producers on a single backing class via the same rename / retype / split toolbox the rest of `AuthorError` supports); the typed `List<ProducerBinding>` payload follows the sub-data pattern that `UnknownName` established. + +`AuthorError.TypeConflict` is the fifth `AuthorError` arm, surfacing R190's cross-site `contextArgument` type-agreement check: when two or more directive sites (`@service`, `@tableMethod`, `@condition`) reference the same `contextArgument` name with mutually-incompatible Java types, the schema-driven `Graphitron.newExecutionInput(...)` factory cannot produce a single typed parameter slot. The arm carries the contextArgument name plus the typed `List<ConflictSite>` (each site's `MethodRef` coordinate and the `TypeName` that site declared); `message()` renders one indented line per site for the validator's prose surface, while LSP fix-its read the typed `sites` field directly. Like `RecordBindingMultiProducer`, the arm sits under `AuthorError` because the fix is author-correctable (align every site on a single Java type). + +`AuthorError.MultiProducerDomainTypeDisagreement` is the sixth `AuthorError` arm, surfacing R204's uniform-domain-return-type check: when two or more `OutputField` producers reach the same SDL Object return type with disagreeing `DomainReturnType` sealed arms (`Record(table)` vs `TableRecord(class)` vs `Plain(class)`), the producers put structurally different Java values at `env.getSource()` for the SDL type's child datafetchers. The generator commits to one source-Java-type per child-field coord at emit time and does not branch on runtime source type, so a runtime disagreement would feed a datafetcher generated against the other producer's record shape. The arm carries the SDL type name plus a typed `List<Participant>` (each producer's `(parentTypeName, fieldName, DomainReturnType)`); `message()` renders one indented line per participant. The today-exercised case is the carrier-payload conflict (DML `@mutation` returning `Record(table)` vs `@service`-on-`Mutation` returning a typed `TableRecord` for the same payload SDL Object); the constraint is general across any current or future producer permit. + +`ServiceMethodCallError` is R238's sub-seal of `AuthorError`, scoped to the `@service`-binding failures of the `ServiceMethodCallWalker` / `ServiceCatalog.reflectServiceMethod` path that projects `@service` directive sites onto the `ServiceMethodCall` carrier on root sync service permits (`QueryServiceTableField`, `QueryServiceRecordField`, `MutationServiceTableField`, `MutationServiceRecordField`). Each typed arm carries the structural data its diagnostic message needs and a stable `lspCode()` under the `graphitron.service-method-call.` namespace; downstream tooling switches on the arm rather than parsing prose. R238 shipped only the two arms its translator-walker produced; R256 (`service-walker-substrate-absorption`) re-landed the service-binding failures that `ServiceCatalog` previously produced as `AuthorError.Structural` prose as typed arms, and partitioned the reflection-intrinsic failures (class-load, return-type, parameter-names, overload) into the sibling `ReflectionError` sub-seal (below) so a `@tableMethod` / `@externalField` failure of the same shape is not forced through a `@service`-named arm. Subsequent walker slices (condition, tableMethod, externalField) each add their own sibling sub-seal alongside this one, keeping the dimensional pivot one-row-per-walker rather than piling typed arms under a single flat `Structural`. + +`ServiceMethodCallError.MultipleDslContextSlots` fires when a single round (constructor or method) carries more than one `DSLContext` parameter slot; carries className and a `Round` enum identifying which round violated the invariant (R256 makes the constructor round reachable, since the holder may now bind a multi-parameter constructor). `ServiceMethodCallError.ParameterUnbindable` fires when a Java parameter slot does not match any GraphQL argument, declared context key, or DSLContext slot; carries paramName, the available argument names, and a Levenshtein-ranked suggestion. `ServiceMethodCallError.InstanceHolderUnconstructible` (R256) fires when an instance `@service` method's enclosing class cannot be used as a holder, either because it is abstract / an interface or because it exposes no public constructor whose parameters are each a `DSLContext` or a declared context argument; carries the class/method coordinate, the class's simple name (for the fix hint), and a `HolderProblem` discriminant. `ServiceMethodCallError.ArgumentParameterMismatch` (R256) fires when a Java parameter matches no GraphQL argument or context key; carries the parameter and method names, the available argument names and context keys, and a pre-rendered rename / argMapping / dot-path suggestion (subsumes the prose the legacy `Structural` arm produced at `ServiceCatalog`). `ServiceMethodCallError.DtoSourcesUnsupported` (R256) fires when a `@service` SOURCES parameter is a `List<DTO>` / `Set<DTO>` whose element is not backed by a jOOQ `TableRecord`; carries the parameter and method names plus the `@sourceRow` hint. `ServiceMethodCallError.UnrecognizedSourcesType` (R256) fires when a parameter looks like a SOURCES batch shape but its element type is none the classifier recognises; carries the parameter and method names plus the unrecognised Java type name. + +`ReflectionError` is R256's sub-seal of `AuthorError` for the reflection-intrinsic failures shared across `ServiceCatalog`'s three reflect helpers (`reflectServiceMethod`, `reflectTableMethod`, `reflectExternalField`). A class that cannot be loaded, a method whose return type does not match the field's declared type, a class compiled without `-parameters`, or an overloaded method name are properties of the reflected Java method regardless of which directive references it, so these arms live under the `graphitron.reflect.` namespace rather than being forced through `ServiceMethodCallError`. Like its siblings it carries one stable `lspCode()` per arm. `ReflectionError.ClassNotLoaded` fires when the referenced class cannot be loaded through the codegen classloader; carries the binary class name. `ReflectionError.ReturnTypeMismatch` fires when the reflected return type does not equal the type the field's declared return requires; carries the class/method coordinate, the expected vs. actual type in their message-surfaced simple form, and a `ReturnContext` discriminant selecting the `@service` vs. `@tableMethod` prose. `ReflectionError.ParameterNamesMissing` fires when the class was compiled without `-parameters` so a parameter that needs its name to bind has none; carries the class/method coordinate. `ReflectionError.AmbiguousMethod` fires when more than one declared method shares the referenced name (the reflect helpers previously took the first JVM-declaration-order match silently); carries the class/method coordinate and every same-name declaration's parameter arity. + +`UpdateRowsError` is R246's sub-seal of `AuthorError`, scoped to the `UpdateRowsWalker` that projects an `@mutation(typeName: UPDATE)` field's `@table` input onto the `UpdateRows` carrier on `MutationUpdateTableField`. Each typed arm carries the structural data its diagnostic message needs and a stable `lspCode()` under the `graphitron.update-rows.` namespace; downstream tooling switches on the arm rather than parsing prose. Like R238's `ServiceMethodCallError`, it is a sibling sub-seal of `AuthorError` rather than a set of arms under the flat `Structural`, keeping the dimensional pivot one-row-per-walker. The arms subsume the per-input-field and PK-coverage prose the legacy `MutationInputResolver` produced for the UPDATE path. + +`UpdateRowsError.NoUniqueKeyCoverage` fires when no primary key and no unique key has its column set covered by the input's columns; carries the table name, the input-covered columns, and every candidate key the walker considered (a table with no keys at all is the degenerate empty-candidate case). `UpdateRowsError.NoSetFields` fires when every input field contributes to the matched key, leaving an empty SET; carries the table name and the matched key. `UpdateRowsError.MixedCarrierKeyMembership` fires when a single *cross-table* FK composite-reference field's lifted columns straddle the matched key (some are key members, some are not); carries the field name and the in-key / outside-key column split. A cross-table FK reference partitions by key membership because its lifted column can legitimately be the row's own identity, so a straddle is unexpressible. A *self-FK* `@nodeId @reference` no longer reaches this arm (R354): its lifted columns are a pointer to a sibling row, never identity, so they route wholly to the SET partition (a shared key column then appears in both the WHERE and SET, reconciled by an emit-side cross-partition value-agreement check). `UpdateRowsError.UnsupportedInputFieldShape` fires for nesting fields, unbound fields without an override condition, or any non-admitted carrier; carries the field name, the classifier shape, and a reason. `UpdateRowsError.OverrideConditionNotSupported` fires when an input field carries `@condition(override: true)` (R215 admits the shape at classify time, but its emit-side never landed, so the filter would silently never run); carries the field name and the directive's source location. `UpdateRowsError.PlainColumnCollision` fires when two or more plain `@field` writers (no `@nodeId` decode among them) resolve to one SET column, which the single-row `Map.put` would silently last-write-wins and the bulk VALUES-join would crash on a duplicate derived column; carries the two field names and the column (R322, the UPDATE mirror of the INSERT-path and `@service` field-vs-field reject). An overlap involving a decode is admitted and reconciled by R322's runtime value-agreement check rather than rejected here. + +`DeleteRowsError` is R266's sub-seal of `AuthorError`, scoped to the `DeleteRowsWalker` that projects an `@mutation(typeName: DELETE)` field's `@table` input onto the `DeleteRows` carrier on `MutationDeleteTableField`, `MutationDeletePayloadField`, and `MutationBulkDeletePayloadField`. Each typed arm carries the structural data its diagnostic message needs and a stable `lspCode()` under the `graphitron.delete-rows.` namespace; downstream tooling switches on the arm rather than parsing prose. Like R246's `UpdateRowsError`, it is a sibling sub-seal of `AuthorError` rather than a set of arms under the flat `Structural`, keeping the dimensional pivot one-row-per-walker. The arm set is `UpdateRowsError`'s minus the two arms DELETE's shape makes meaningless: there is no `NoSetFields` (DELETE has no SET clause to be empty) and no `MixedCarrierKeyMembership` (DELETE has no SET boundary for a composite carrier to straddle, since every admitted column is a WHERE filter). Carving DELETE off `MutationInputResolver.resolveInput` retired the last live `@value` consumer and the directive itself (absorbing R188). + +`DeleteRowsError.NoUniqueKeyCoverage` fires when no primary key and no unique key has its column set covered by the input's columns and the mutation did not opt into `multiRow: true`; carries the table name, the input-covered columns, and every candidate key the walker considered (a table with no keys at all is the degenerate empty-candidate case, which the message points at `multiRow: true`). It subsumes R188's `table-has-no-pk` rejection. `DeleteRowsError.UnsupportedInputFieldShape` fires for nesting fields, unbound fields without an override condition, or any non-admitted carrier; carries the field name, the classifier shape, and a reason. `DeleteRowsError.OverrideConditionNotSupported` fires when an input field carries `@condition(override: true)` (R215 admits the shape at classify time, but its emit-side never landed, so the filter would silently never run); carries the field name and the directive's source location. + +`ErrorChannelWalkerError` is R244's sub-seal of `AuthorError`, scoped to the error-channel domain: the `ErrorChannelWalker` that resolves an outcome type's errors-field channel onto `ErrorChannel.Mapped`, plus the `OutcomeType` classification that produces the walker's input. Each typed arm carries the structural data its diagnostic message needs and a stable `lspCode()` under the `graphitron.error-channel.` namespace; downstream tooling switches on the arm rather than parsing prose. Like R238's `ServiceMethodCallError`, it is a sibling sub-seal of `AuthorError` rather than a set of arms under the flat `Structural`, keeping the dimensional pivot one-row-per-walker. Three arms are raised by the `OutcomeType` classification and the rest by `walk()`; they share one family because they share one SDL surface (the outcome type and its errors field) and one LSP namespace. + +`ErrorChannelWalkerError.MultipleErrorsFields` fires when a type carries more than one errors field; the binary `Outcome` witness has one error slot, so a type with two errors fields has no well-defined fork. Carries the outcome type name and the offending errors-field names. `ErrorChannelWalkerError.NonNullableSuccessProjectionField` fires when a success-projection (data) field is non-null; on the error arm that field resolves null and would raise `NonNullableFieldWasNullError`, bubbling the null up and dropping the sibling errors field, so success-projection fields must be nullable. Carries the outcome type name and the field name. `ErrorChannelWalkerError.NonNullableErrorsField` (R275) is the mirror: it fires when the errors field itself is non-null (`[X!]!`); on the success arm there are no errors and the field resolves null, which would raise `NonNullableFieldWasNullError` and drop the sibling data field, so errors fields must be nullable. Carries the outcome type name and the field name. `ErrorChannelWalkerError.ChannelRuleViolation` fires on a channel-level handler-rule violation (rule 7: no two VALIDATION handlers in one channel; rule 8: no duplicate match-criteria across the flattened handler list); carries the outcome type name, the errors-field name, the rule number, and a detail string, with `lspCode()` specialising per rule. `ErrorChannelWalkerError.HandlerSourceAccessorMissing` fires when an `@error` type's handler source class exposes no `PropertyDataFetcher`-visible accessor for one of the `@error` type's declared SDL fields (`path` and `message` exempt); carries the outcome type name, the `@error` type name, the handler class name, the missing field name, and the available accessors. + +`WireCoercionError` is R261's sub-seal of `AuthorError`, scoped to the wire-coercion failures a scalar/enum SDL leaf hits when its consumer-declared Java type does not match what graphql-java delivers on the wire. Before R261 every arg-classification site fell through to `CallSiteExtraction.Direct` and emitted a raw `(DeclaredType) wireValue` cast that compiled cleanly and `ClassCastException`d (or, for enums, `IllegalArgumentException`d) on the first request; graphql-java delivers `ID` and enum values as `String`, `Int` as `Integer`, `Float` as `Double`, input-objects as `Map`, so a declared cast target of a jOOQ record, a numeric PK type, a domain class, or a width-mismatched numeric is a guaranteed runtime crash invisible at build time. The classifier now confirms the coercion output is assignable to the declared type before emitting `Direct` — the `Direct` fall-through becomes the narrow arm the predicate confirms is wire-pass-through — and a mismatch surfaces here instead. Each typed arm carries the structural data its diagnostic message needs and a stable `lspCode()` under the `graphitron.wire-coercion.` namespace; downstream tooling switches on the arm rather than parsing prose. The judgment lives at the classifier (a new `WireCoercionResolver` predicate consuming `ScalarTypeResolver.coercionOutputType`), not on `ScalarTypeResolver`, which stays a pure name↔type mapping. + +`WireCoercionError.Assignability` fires when the graphql-java coercion output for a scalar SDL leaf does not equal the declared Java type (sites A-D of the audit: `@service` input-bean scalar fields, `@service` scalar args, and the non-service `@condition` / `@externalField` sites in a later slice); carries the SDL leaf type as written, the fully-qualified coercion-output class graphql-java delivers, the fully-qualified declared Java type the cast targets, and a `site` string. `WireCoercionError.EnumConstantDivergence` fires when the declared type is the enum and assignment succeeds but an SDL enum value name has no matching Java constant, so `Enum.valueOf((String) ...)` would throw (site E); a constant-name-set membership check on a distinct axis from `Assignability`, populated from the single `EnumMappingResolver` parity home shared with the column/arg enum path. Carries the Java enum class name, the divergent SDL value names, the full Java constant set, and a `site` string. + +`InvalidSchema.DirectiveConflict` carries the bare directive names (no leading `@`) plus the prose. The names ride as typed data so an LSP fix-it can offer "remove this directive" without scraping the prose for which one to remove. + +`InvalidSchema.CaseFoldCollision` is the case-fold-uniqueness arm: two or more type-name stems collapse to the same identifier on case-insensitive filesystems (APFS, NTFS), which would clobber the emitted Java files. The variant carries the full case-equivalent group as a typed `List<String>` plus a `CaseFoldCollision.Origin` enum (`SDL`, `SYNTH_CONNECTION`, `SYNTH_EDGE`, `SYNTH_PAGE_INFO`) identifying which classifier arm each demoted member came from; `message()` switches on origin to specialise the actionable fix hint (synthesised arms point at `@asConnection(connectionName: ...)`; SDL arms suggest a rename). Carrying the group as structured data lets an LSP fix-it offer "rename one of these" with the candidate list ready, without scraping prose. + +`Deferred` classifies cleanly but the generator hasn't shipped emit support for the variant yet. The arm carries a `summary` plus a `planSlug` (the roadmap file basename, no extension) plus a `StubKey`. The stub key is itself a sealed sub-type: a `VariantClass` arm names the stubbed variant class (or carries `null` for inline-defer sites whose rejection names a feature shape); an `EmitBlock` arm names a typed enum value for "this shape can't emit yet" sites inside the emitters. The validator projects every `Deferred` through the same renderer; the typed key lets the LSP offer "open the roadmap item" instead of parsing the path back out. + +The xref:rewrite-design-principles.adoc#_classifier_guarantees_shape_emitter_assumptions[classifier-shaped emitter-assumption] principle and the xref:rewrite-design-principles.adoc#_validator_mirrors_classifier_invariants[validator-mirrors-classifier] rule both ride this contract: the validator switches on the same dispatch sets the generator does, so an unsupported classification surfaces as a typed `Deferred` at validate time, not as an `UnsupportedOperationException` at runtime. Validate is a typed-rejection projection of classify. + +== `BuildContext.candidateHint`: Levenshtein-ranked suggestions + +When a name doesn't resolve, the rejection carries the closed set of candidates the catalog had at that site; the user-visible hint sorts them by edit distance from the attempt, top five. + +[source,java] +---- +String hint = candidateHint(attempt, candidates); +// "; did you mean: candidate1, candidate2, candidate3" +---- + +The contract has consolidated onto two construction sites: `BuildContext.candidateHint(attempt, candidates)` for callers building rejection messages directly, and `Rejection.unknownName(...)` (and its kind-specific factories `unknownColumn`, `unknownTable`, `unknownForeignKey`, ...) for callers producing the rejection through the typed sealed-result path. Both compute the same hint; the typed-result path additionally rides the `attempt` and `candidates` as structured data on the rejection so downstream tooling can offer a fix-it without parsing prose. + +When adding a new existence check to the validator or builder, follow the same pattern: pass the relevant candidate list from `JooqCatalog` (or whatever closed set the lookup ranges over) to `candidateHint`, or produce the rejection through `Rejection.unknownName(...)` so the candidate list rides on the typed result. + +The diagnostic surface that consumers see, what each rejection class renders as, what severity it gets, what the build's log line looks like, is documented at xref:../../manual/reference/diagnostics-glossary.adoc[the diagnostics glossary]; that page is the user-facing entry point for "I saw this message, what does it mean." + +== Drift protection + +The chapter prose above enumerates `Rejection`'s permits: `AuthorError.UnknownName`, `AuthorError.Structural`, `AuthorError.AccessorMismatch`, `AuthorError.RecordBindingMultiProducer`, `AuthorError.TypeConflict`, `AuthorError.MultiProducerDomainTypeDisagreement`, `ServiceMethodCallError.MultipleDslContextSlots`, `ServiceMethodCallError.ParameterUnbindable`, `ServiceMethodCallError.InstanceHolderUnconstructible`, `ServiceMethodCallError.ArgumentParameterMismatch`, `ServiceMethodCallError.DtoSourcesUnsupported`, `ServiceMethodCallError.UnrecognizedSourcesType`, `ReflectionError.ClassNotLoaded`, `ReflectionError.ReturnTypeMismatch`, `ReflectionError.ParameterNamesMissing`, `ReflectionError.AmbiguousMethod`, `UpdateRowsError.NoUniqueKeyCoverage`, `UpdateRowsError.NoSetFields`, `UpdateRowsError.MixedCarrierKeyMembership`, `UpdateRowsError.UnsupportedInputFieldShape`, `UpdateRowsError.OverrideConditionNotSupported`, `UpdateRowsError.PlainColumnCollision`, `DeleteRowsError.NoUniqueKeyCoverage`, `DeleteRowsError.UnsupportedInputFieldShape`, `DeleteRowsError.OverrideConditionNotSupported`, `ErrorChannelWalkerError.MultipleErrorsFields`, `ErrorChannelWalkerError.NonNullableSuccessProjectionField`, `ErrorChannelWalkerError.NonNullableErrorsField`, `ErrorChannelWalkerError.ChannelRuleViolation`, `ErrorChannelWalkerError.HandlerSourceAccessorMissing`, `WireCoercionError.Assignability`, `WireCoercionError.EnumConstantDivergence`, `InvalidSchema.DirectiveConflict`, `InvalidSchema.CaseFoldCollision`, `InvalidSchema.Structural`, and `Deferred`. A new permit on the sealed hierarchy must land with a corresponding mention in this page; otherwise the prose silently goes stale. `SealedHierarchyDocCoverageTest` walks `Rejection.permits()` transitively and asserts each permit name appears in `typed-rejection.adoc`: bidirectional, tied to a closed set the compiler already exhaustivity-checks. A new permit added without a paragraph here fails the test; a permit removed without removing its mention fails too. + +The sealed-`Resolved` pattern across the thirteen sibling resolvers is described above shape-only; per-resolver arm enumerations (e.g. `LookupKeyDirectiveResolver.Resolved.{Ok, Rejected}`, `ServiceDirectiveResolver.Resolved.{Success.{TableBound | Result | Scalar} | ErrorsLifted | Rejected}`) live as javadoc on each `*DirectiveResolver.Resolved` declaration. There is no single `Resolved` parent class to walk, and the chapter does not pin per-resolver permits. + +[#diagram-d10] +== Sealed hierarchy diagram + +[source,mermaid] +---- +classDiagram + class Rejection { + <<sealed interface>> + +String message() + +Rejection prefixedWith(String) + } + class AuthorError { + <<sealed interface>> + } + class InvalidSchema { + <<sealed interface>> + } + class UnknownName { + +String summary + +AttemptKind attemptKind + +String attempt + +List~String~ candidates + } + class Structural_AE["AuthorError.Structural"] { + +String reason + } + class AccessorMismatch { + +String reason + } + class RecordBindingMultiProducer { + +String sdlTypeName + +List~ProducerBinding~ bindings + } + class DirectiveConflict { + +List~String~ directives + +String reason + } + class CaseFoldCollision { + +List~String~ group + +Origin origin + } + class Structural_IS["InvalidSchema.Structural"] { + +String reason + } + class Deferred { + +String summary + +String planSlug + +StubKey stubKey + } + + Rejection <|-- AuthorError + Rejection <|-- InvalidSchema + Rejection <|-- Deferred + AuthorError <|-- UnknownName + AuthorError <|-- Structural_AE + AuthorError <|-- AccessorMismatch + AuthorError <|-- RecordBindingMultiProducer + InvalidSchema <|-- DirectiveConflict + InvalidSchema <|-- CaseFoldCollision + InvalidSchema <|-- Structural_IS + + class LookupKeyResolved["LookupKeyDirectiveResolver.Resolved"] { + <<sealed interface>> + } + class LookupKeyOk["Resolved.Ok"] { + +ReturnTypeRef.TableBoundReturnType returnType + } + class LookupKeyRejected["Resolved.Rejected"] { + +Rejection rejection + } + LookupKeyResolved <|-- LookupKeyOk + LookupKeyResolved <|-- LookupKeyRejected + LookupKeyRejected --> Rejection : carries +---- + +The overlay shows `LookupKeyDirectiveResolver.Resolved` as one worked example of how a resolver's typed-result wraps a `Rejection`. The other twelve resolvers follow the same shape; check each `*DirectiveResolver.Resolved` for its specific arm set. + +''' + +*See also:* + +* {empty}xref:rewrite-design-principles.adoc#_builder_step_results_are_sealed_not_strings_or_out_params[Builder-step results are sealed]: the principle this page is the canonical source for. +* {empty}xref:rewrite-design-principles.adoc#_validator_mirrors_classifier_invariants[Validator mirrors classifier invariants]: the validator-side rule that consumes typed rejections at the build's diagnostic surface. +* {empty}xref:../../manual/reference/diagnostics-glossary.adoc[Diagnostics glossary]: the user-facing reference for what each rejection-derived diagnostic message means. diff --git a/docs/architecture/how-to/dev-loop-internals.adoc b/docs/architecture/how-to/dev-loop-internals.adoc new file mode 100644 index 0000000000..24ac9628d4 --- /dev/null +++ b/docs/architecture/how-to/dev-loop-internals.adoc @@ -0,0 +1,126 @@ += Dev loop internals +:description: How the graphitron:dev Mojo wires the LSP, MCP server, watchers, and generator dispatch into one JVM, plus the contributor-facing federation and native-runtime rationale. +:!toc: + +Contributor-facing material for anyone extending the `dev`-loop surface, the federation wrap, or the native-runtime packaging. For the consumer-facing inner loop (how to run it, connect an editor, and connect an agent), see xref:../../manual/how-to/dev-loop.adoc[How-to: The dev loop] and xref:../../manual/how-to/mcp-agent-context.adoc[How-to: Agent context over MCP]. + +[#dev-loop-detail] +== Dev loop: how the goal is wired internally + +The `dev` goal runs five cooperating components in one JVM: + +* *LSP server* binds the TCP port (default `8487`) and speaks LSP to whatever editor or agent connects. It serves diagnostics, hover, completion, and go-to-definition off the most recent classified `GraphitronSchema` and the validator's report on it. State is in-memory only; no LSP cache lives on disk. Its `didSave` notification is the primary fast path into the generator dispatch when an editor is attached. +* *MCP server* binds a second loopback port (`8488`) and speaks the Model Context Protocol over Streamable HTTP to an MCP-aware agent. It serves the handshake `instructions` string, an `about` prompt, a `directives` resource, and a set of read-only tools backed by the warm `Workspace`: catalog discovery (`catalog.tables`, `catalog.describe`, and the semantic `catalog.search`), `schema`, the `@service` / `@condition` / `@record` bindings, `diagnostics`, cross-reference `edges`, `status`, and `docs.search` over the bundled manual (R118, R385). It reads the warm `Workspace` but does not feed the generator dispatch; the connection is read-only. It lives in its own `graphitron-mcp` module so its heavy native (semantic-index) dependencies stay off the plugin's own compile surface. Hosted in embedded Jetty; the literal `8488` is pinned by a `DevMojoTest` assertion on `DevMojo.DEFAULT_MCP_PORT`. +* *Schema watcher* is a `WatchService` over the consumer's `.graphqls` source roots; the headless fallback when no editor is attached. On a save, it debounces same-file events that arrive in clusters (some editors emit several `MODIFY` events per save) and signals the generator dispatch. The LSP `didSave` path feeds the same debounce, so the two routes coalesce on a single regen when both fire. +* *Classpath watcher* is a `WatchService` over the consumer's compiled jOOQ output (`target/classes/<jooqPackage>/`). When `mvn compile` in another terminal lands new `.class` files for jOOQ tables and columns, the watcher signals the generator dispatch the same way a schema save does. This is what lets a jOOQ schema regen pick up automatically without a `dev`-session restart. +* *Generator dispatch* is the lifecycle thread that consumes wake-up events from either watcher, loads the (possibly-updated) classpath, runs the generator over the (possibly-updated) `.graphqls` sources, and feeds the resulting `GraphitronSchema` and emit results to the LSP server's in-memory state and to disk via the idempotent writer. + +One JVM, two loopback ports (LSP and MCP), one process tree. There's no daemon, no client/server split, no shared cache directory. The Mojo binds, watches, regenerates, and serves; on Ctrl+C the JVM shutdown hook closes the LSP socket, the MCP server, the `WatchService` instances, and the debounce executor cleanly. + +The idempotent-write coupling is what makes the loop usable as an editor backend. Because `JavaFile.writeToPath` writes only files whose rendered content actually changed (SHA-256 comparison) and deletes orphans in rewrite-owned sub-packages, a schema edit that touches one type rewrites that type's files and leaves every other generated file byte-identical on disk. The IDE's incremental compiler, Quarkus `quarkus:dev`, and Spring Boot DevTools all detect changes by mtime; unchanged files keep their mtimes, so only the actually-changed files trigger an IDE recompile. Two effects fall out: editor latency is proportional to the edit (not to the schema size), and `git diff` after a `dev` session shows only what a human-readable summary of the schema edit would predict. + +[#diagram-d7] +[source,mermaid] +---- +flowchart TD + subgraph JVM["dev JVM (one process)"] + Editor["editor / agent"] -. LSP/TCP :8487 .-> LSP["LSP server"] + Editor -. MCP/HTTP :8488 .-> MCP["MCP server<br/>(read-only tools +<br/>about prompt)"] + LSP -- didSave<br/>(primary) --> Disp["generator dispatch"] + SW["schema watcher<br/>(.graphqls,<br/>headless fallback)"] -- debounced<br/>save events --> Disp + CW["classpath watcher<br/>(target/classes/<jooq>)"] -- .class change<br/>events --> Disp + Disp -- run --> Gen["generator<br/>(classify + emit)"] + Gen -- in-memory<br/>GraphitronSchema --> LSP + Gen -- emit results --> Writer["JavaFile.writeToPath<br/>(idempotent + orphan sweep)"] + Writer -- only-changed<br/>files written --> Sources["target/generated-sources/graphitron"] + end + Sources -- mtime change --> IDE["IDE recompile<br/>(IntelliJ / Quarkus / DevTools)"] +---- + +[#dev-multi-module] +.Multi-module projects +**** +Running `mvn graphitron:dev` from inside a sub-module of a multi-module +build (for example `cd opptak-subgraph && mvn graphitron:dev`, for faster +startup and scoped logs) picks up the `@service` / `@condition` / +`@record` classes declared in *sibling* modules automatically: completion, +hover, go-to-definition, and the unknown-class diagnostics all resolve +against them. Graphitron reads the parent pom's `<modules>` list to find the +siblings, so this works for the standard reactor layout without running from +the aggregator. + +The one caveat: a sibling must have been compiled at least once, so its +`target/classes` exists on disk. `graphitron:dev` does not build siblings for +you; run `mvn install` (or `mvn -pl <sibling> compile`) once after a checkout. +If the dev goal reports that it resolved a single module and found no siblings, +check that the parent pom's `<modules>` lists the module you started from. +**** + +[#federation-internals] +== Federation: how the wrap is wired + +`@link` is the opt-in. `Graphitron.buildSchema(...)` checks the parsed SDL for an `@link` to a federation spec; if present, it routes through `federation-graphql-java-support` to wrap the schema with the `_Service.sdl` field, the `_Entity` union, and the `_entities` resolver. If absent, the build skips the wrap entirely and emits a vanilla schema. A consumer who wants federation just adds the `@link`; a consumer who doesn't gets no federation surface, no `_entities`, no `_Service`. The opt-in is the SDL declaration, nothing else. + +`<schemaInput tag>` is the second federation entry point. It exists because `@tag(name: "...")` directives are only meaningful to a federation gateway, and a consumer setting tag values has implicitly committed to federation 2. The plugin synthesises an `@link` with `import: ["@tag"]` if none was declared, fails the build if `@link` is declared but `"@tag"` is missing from `import`, and stays out of the way if neither is set. The decision lives in the plugin so it's visible at build configuration; the runtime never sees the synthesis logic. + +`Graphitron.buildSchema` does the wrap, not the consumer. A second `Federation.transform(...)` call by the consumer would double-add `_Service` and `_Entity` and break composition; the contract is *the consumer never wraps*. The two-arg form takes a federation customizer (`fed -> fed.fetchEntities(...)`) for cases where a consumer needs to override `fetchEntities` for hand-rolled entity types. + +The `fetchEntities` seam lives where it does because the default fetcher only knows about Graphitron-classified types: `@node` types resolve via the NodeId path, types with a `@key` directive resolve via column-value lookup, and both share the same per-type batched `SELECT`. Anything outside that classification surface (hand-rolled objects, types from a non-Graphitron source) needs a custom fetcher; the customizer lets the consumer plug one in without touching `buildSchema`'s wiring. + +For the consumer-facing federation transport (the `@link` declaration, the two-arg `buildSchema` customizer, the don't-double-wrap rule), see xref:../../manual/how-to/apollo-federation.adoc[How-to: Apollo Federation transport]. + +[#diagram-d9] +[source,mermaid] +---- +sequenceDiagram + participant SDL as .graphqls SDL + participant Build as Graphitron.buildSchema + participant Wrap as federation-graphql-java-support + participant Engine as graphql-java engine + participant Fetch as _entities resolver + participant DB as PostgreSQL + + SDL->>Build: parse + classify + alt @link present + Build->>Wrap: wrap(schema, fetchEntities) + Wrap-->>Build: federation-wrapped schema<br/>(adds _Service.sdl, _entities) + else no @link + Build-->>Engine: vanilla schema (no federation surface) + end + Build-->>Engine: ready + Engine->>Fetch: _entities([{__typename, key…}, …]) + alt @node type + Fetch->>DB: SELECT by NodeId-decoded keys (batched per type) + else @key type + Fetch->>DB: SELECT by key-column tuples (batched per type) + else custom fetcher (fed.fetchEntities) + Fetch->>Fetch: consumer-supplied resolver + end + DB-->>Fetch: rows + Fetch-->>Engine: typed results +---- + +[#native-runtime-dependency] +== Native runtime dependency + +There isn't one. `mvn graphitron:dev` runs an LSP server backed by a +tree-sitter-based GraphQL parser whose two native pieces, the +`tree_sitter_graphql` grammar and the `libtree-sitter` runtime, both ship in +the `no.sikt:graphitron-tree-sitter-natives` jar and are extracted at startup. +You do not install anything: no `brew install`, no `vcpkg install`, no +from-source build on Debian/Ubuntu, and no `LD_LIBRARY_PATH` / +`JAVA_TOOL_OPTIONS` wiring (NixOS included). + +Supported host architectures are `linux-x86_64`, `linux-aarch64`, +`macos-aarch64`, and `windows-x86_64`. Intel-Mac (`macos-x86_64`) is not +shipped; on an unsupported host the LSP fails fast at startup naming the +`os.name` / `os.arch` it saw and the supported set. + +If the bundled runtime fails to load after extraction (a `noexec` +`java.io.tmpdir`, a corrupt extract, or a missing system C runtime), the LSP +surfaces a single startup error naming the extracted path rather than an opaque +`UnsatisfiedLinkError`. See +xref:../../manual/reference/lsp-requirements.adoc[LSP requirements] for the +startup-diagnostics detail. + +xref:index.adoc[← How-to index] diff --git a/docs/architecture/how-to/index.adoc b/docs/architecture/how-to/index.adoc new file mode 100644 index 0000000000..9ef7876c22 --- /dev/null +++ b/docs/architecture/how-to/index.adoc @@ -0,0 +1,11 @@ += Architecture: How-to +:description: Contributor-facing recipes for working on the Graphitron generator. +:!toc: + +Recipes for specific contributor tasks. + +* xref:testing.adoc[Test-tier guide] — choosing between the unit, pipeline, compilation, and execution tiers. +* xref:dev-loop-internals.adoc[Dev loop internals] — how the `dev` goal wires the LSP, MCP server, watchers, and generator dispatch into one JVM. +* xref:release-natives.adoc[Release the tree-sitter natives] — cutting a `graphitron-tree-sitter-natives` release. + +xref:../index.adoc[← Architecture] diff --git a/docs/architecture/how-to/release-natives.adoc b/docs/architecture/how-to/release-natives.adoc new file mode 100644 index 0000000000..d174be93d5 --- /dev/null +++ b/docs/architecture/how-to/release-natives.adoc @@ -0,0 +1,187 @@ += tree-sitter natives release + +How to cut a new release of `no.sikt:graphitron-tree-sitter-natives`, when +to bump which version digit, and what the release workflow verifies. + +This is internal-to-the-rewrite operational documentation, not a user-facing +chapter. The published artifact is consumed only by graphitron-lsp; consumers +of graphitron's generator surface never see it directly. + +== What the artifact is + +A single jar that ships two per-platform tree-sitter libraries under +`lib/<os>-<arch>/`: the GraphQL grammar and the tree-sitter runtime. + +[cols="1,2,2"] +|=== +| Platform | Grammar | Runtime + +| `linux-x86_64` | `lib/linux-x86_64/libtree-sitter-graphql.so` | `lib/linux-x86_64/libtree-sitter.so` +| `linux-aarch64` | `lib/linux-aarch64/libtree-sitter-graphql.so` | `lib/linux-aarch64/libtree-sitter.so` +| `macos-aarch64` | `lib/macos-aarch64/libtree-sitter-graphql.dylib` | `lib/macos-aarch64/libtree-sitter.dylib` +| `windows-x86_64` | `lib/windows-x86_64/tree-sitter-graphql.dll` | `lib/windows-x86_64/tree-sitter.dll` +|=== + +macOS is Apple-silicon-only. Sikt graphitron-lsp developers all run M1 +or newer, the macos-13 (Intel) GitHub-hosted runner is the slowest queue +on the platform, and graphitron-lsp is internal-only per the spec's +"Out of scope" list. Adding `macos-x86_64` back means re-enabling that +matrix entry and bumping the jar-layout assertion expectations. + +The *grammar* binary is the vendored bkegley tree-sitter-graphql grammar +(commit `5e66e96`), built with the upstream `tree-sitter build` CLI against +the pinned parser ABI. It exports the grammar's `tree_sitter_graphql` entry +point only, imports no `ts_*` symbols, and so loads independently of the +runtime. + +The *runtime* binary is the upstream tree-sitter runtime +(`libtree-sitter`, exporting the `ts_*` symbols) built from the pinned +source tag, not the system package. graphitron-lsp's `BundledLibraryLookup` +extracts both binaries from this jar and composes `grammar.or(runtime)` into +jtreesitter's SPI lookup, so the LSP has no native system dependency at all. + +Bundling the runtime reverses the module's original grammar-only split. That +split made the runtime a system dependency (`brew install tree-sitter`, +`pacman -S`, `vcpkg install`, or a from-source build on Debian/Ubuntu, whose +apt `libtree-sitter0` is 0.20.x and too old). The recurring cost of that +install path, especially on Windows and Debian/Ubuntu, is what R401 retired +by bundling the runtime; the tree-sitter project still does not publish a +prebuilt `libtree-sitter` asset, so we build it ourselves on native runners +from the pinned source (see "Cutting a release" below). + +The grammar build uses the upstream `tree-sitter build` CLI rather than a +hand-rolled `cc` / `cl.exe` invocation. The CLI handles MSVC export +annotations on Windows uniformly, which is what gives us a working Windows +DLL with the grammar entry point correctly exported (the bonede route +fails this on Windows, exporting `Java_org_treesitter_*` JNI wrappers +only). The runtime build does not use the CLI: it builds `libtree-sitter` +from the cloned source `lib/` (POSIX `make`; Windows MinGW-w64 `make` with +static-linked gcc runtime), with a transitive-dep allowlist enforced as a +release gate. + +== Versioning + +Format: `<runtime-version>-<build-n>`. First bundled-runtime release: +`0.26.9-1`. The `<runtime-version>` portion is the actual tree-sitter +runtime version shipped in the jar: the upstream source tag both the grammar +ABI and the bundled `libtree-sitter` are built from. It must match the +`tree-sitter-cli-version` workflow input (tag `v0.26.9` for `0.26.9-1`). + +Before `0.26.9-1`, `<runtime-version>` meant the parser ABI the grammar was +built against and the runtime was a system dependency; from `0.26.9-1` it +names the runtime we ship. + +[cols="1,2"] +|=== +| Change | Version bump + +| Grammar update (new `parser.c`) | `<build-n>` (e.g. `0.26.9-1` -> `0.26.9-2`) +| Build-flag change | `<build-n>` +| Recompile / security rebuild with no source change | `<build-n>` +| Retarget to a newer upstream tree-sitter tag | `<runtime-version>` resets `<build-n>` to `1` (e.g. `0.26.9-3` -> `0.27.0-1`) +|=== + +Snapshots are not used. The natives module ships releases only, and a +release that turns out to be broken on one platform after deploy stays on +Central as a tombstone; graphitron-lsp pins to the working build that +follows. + +== Cutting a release + +Three steps, the second being the GitHub Actions trigger. + +. *Bump the version* in + `graphitron-tree-sitter-natives/pom.xml`. If the + parser ABI moved, also update the matching pin in + `src/main/native/grammars/graphql/UPSTREAM.md` and the module-level + `UPSTREAM.md`. Commit on a normal feature branch and push. + +. *Trigger the workflow.* In the GitHub Actions UI for `sikt-no/graphitron`, + run `.github/workflows/tree-sitter-natives-release.yml` via + `workflow_dispatch`. The single input is the upstream `tree-sitter` tag + (e.g. `v0.26.9`); it pins both the CLI that builds the grammar and the + source checkout the bundled runtime is built from, and must match the + `<runtime-version>` portion of the pom version. + +. *Watch the three stages.* The workflow only deploys if every stage + succeeds: ++ +.. *Build matrix* (four native runners). Each runner builds two binaries. + The grammar: download the pinned `tree-sitter` CLI, run + `tree-sitter build` against the vendored grammar, assert it exports + `tree_sitter_graphql`. The runtime: clone the pinned source tag and build + `libtree-sitter` from `lib/` (POSIX `make`; Windows MinGW-w64 `make` with + `-static -static-libgcc`), then run the release gates: it must export + `ts_language_abi_version` and the core `ts_parser_*` symbols, and its + transitive deps must fall within the per-platform allowlist (`ldd` / + `otool -L` / `dumpbin /dependents`; a stray `libgcc_s_seh-1.dll` or + third-party `.so` fails the release). Symbol checks use `nm -gU` on POSIX + and `dumpbin /exports` on Windows. Both binaries upload as + `native-<platform>`. +.. *Package + deploy* (ubuntu-latest). Downloads all four artifacts, stages + grammar + runtime under `target/classes/lib/<os>-<arch>/`, runs + `mvn package`, and asserts the produced jar contains exactly the eight + `lib/<os>-<arch>/...` entries (four grammar + four runtime) and no others. + Then `mvn deploy` signs with GPG and publishes via + `central-publishing-maven-plugin` with `autoPublish=true`. +.. *Post-deploy load+parse matrix* (four native runners). After deploy + succeeds, each runner resolves the freshly-published jar from a clean + local m2 (with retries against Central's propagation delay), then runs a + tiny FFM-based Java verifier with *no* system `libtree-sitter` installed. + The verifier extracts both the grammar and the runtime from the jar, + composes `grammar.or(runtime)`, calls + `Language.load(symbols, "tree_sitter_graphql")`, parses + `"type Query { hello: String }"`, and asserts the root is `source_file` + with no errors. A pass with no system runtime present is the proof that + the jar is self-sufficient on that platform. + +If stage 3 fails on any platform, bump `<build-n>` and re-release. The +failing version stays on Central; downstream `graphitron-lsp` pins to +the next working `<build-n>`. + +== Why the build infrastructure looks the way it does + +Three design choices worth knowing about for anyone maintaining this: + +. *Standalone pom, no parent inheritance.* The natives module lives in the + repo root alongside the reactor modules but its `pom.xml` does not declare + `<parent>graphitron-rewrite-parent</parent>`. Trunk's parent runs at + `10-SNAPSHOT` and declares no `<snapshotRepository>`; inheriting would + publish a natives jar whose parent reference is unresolvable for any + Central consumer. The release plumbing (`maven-gpg-plugin`, + `central-publishing-maven-plugin`, `maven-source-plugin`, + `maven-javadoc-plugin`, `maven-deploy-plugin`) is inlined into the + module's pom for the same reason. The parent's `<modules>` list also + does not include this module, so the regular reactor build + (`mvn install -Plocal-db`) pays zero cost + for it. + +. *No CI build per PR.* The binaries don't change per PR (they're a + published artifact, not a per-build output), so expanding + `.github/workflows/rewrite-build.yml` to a four-platform matrix would + mostly re-verify a stable input. Instead, the verification matrix lives + in this workflow and runs against the actual published artifact at + release time. In normal CI, only the `linux-x86_64` arm of + `NativeLibraryBundleTest` executes per PR (the three others are gated + by `@EnabledOnOs` to their respective hosts and run on this workflow's + post-deploy matrix). + +. *Built with the upstream CLI, not hand-rolled compiler invocations.* + `tree-sitter build` knows how to do MSVC `__declspec(dllexport)` for + Windows, which the upstream tree-sitter C sources don't carry on their + own. The bonede `tree-sitter-graphql` jar we previously evaluated ships + a Windows DLL that exports `Java_org_treesitter_*` JNI wrappers but + not the bare `tree_sitter_graphql` entry point jtreesitter expects, + which is why the natives module exists at all. + +== Where the binaries live before deploy + +Not committed. The eight binaries (four grammar + four runtime) are produced +fresh on four native runners per release and merged into the jar during the +package+deploy stage. The vendored grammar sources under +`graphitron-tree-sitter-natives/src/main/native/grammars/graphql/` +are the grammar's only git-resident input; the runtime is built from the +pinned upstream source tag cloned at release time, not vendored in git. Its +provenance (source tag, per-platform build invocation and flags, the +transitive-dep allowlist, and the update procedure) is recorded in the +module-level `UPSTREAM.md` "Runtime provenance" section. diff --git a/docs/architecture/how-to/testing.adoc b/docs/architecture/how-to/testing.adoc new file mode 100644 index 0000000000..bcab88dba8 --- /dev/null +++ b/docs/architecture/how-to/testing.adoc @@ -0,0 +1,141 @@ += Test-tier guide +:toc: left +:sectanchors: +:sectlinks: + +This guide answers "which tier does my test belong to, where does the file go, and what should it assert?" +Four tiers cover every test in the rewrite. +For design principles (why pipeline is the primary behavioural tier, why code-string body matching is banned), see xref:../explanation/rewrite-design-principles.adoc[Rewrite Design Principles]. +For build commands and database setup, see `.claude/web-environment.md`. + +== Choosing a tier + +Read top-down; stop at the first match. + +. *The behaviour is "this generated source must compile against the real jOOQ catalog"* → **Compilation.** + No test class to write; the fixture-driven `mvn compile -pl :graphitron-sakila-example -Plocal-db` is the assertion. + Add a fixture instead of an assertion. +. *The behaviour is "this generated request must round-trip against PostgreSQL and return the right rows / fire the right number of queries / honour DataLoader batching"* → **Execution.** + New `@Test` in `GraphQLQueryTest` (or one of the federation-/scatter-named companions). +. *The behaviour is "this SDL pattern classifies into this variant" or "this SDL pattern produces a TypeSpec with this method shape"* → **Pipeline.** + New case in `GraphitronSchemaBuilderTest` (classification truth table) or a new `*PipelineTest` file. +. *The behaviour is "this builder helper / classifier method / writer primitive / validator rule does X on input Y"* → **Unit.** + New case in a `*Test` next to the production class, or a `*ValidationTest` for validator rules. + +When two tiers could apply, prefer the one that captures the behaviour most directly. +Pipeline beats unit: per-variant structural tests are bookkeeping; the primary signal is that a realistic SDL produces a realistic `TypeSpec` end-to-end. +Pipeline also beats compilation and execution where the behaviour can be asserted on the classified model or `TypeSpec` shape, since pipeline runs without jOOQ codegen or Postgres. +Execution beats compilation only when SQL behaviour or row content is the contract. + +_Tier is determined by what's asserted, not by what module the file lives in._ +`graphitron-sakila-example` hosts tests at every tier; its module dependency on post-generator artifacts is the reason those tests live there, not a tier signal. + +== Tier annotations + +Each tier has a JUnit 5 meta-annotation in `graphitron`'s test source root (`no.sikt.graphitron.rewrite.test.tier`), republished as a `tests` test-jar so other modules can consume them. Reachable from every test class in `graphitron` and `graphitron-sakila-example`: + +[source,java] +---- +@UnitTier // @Tag("unit") +@PipelineTier // @Tag("pipeline") +@CompilationTier // @Tag("compilation") +@ExecutionTier // @Tag("execution") +---- + +Place exactly one annotation at the class level. +Tests that don't fit any of the four tiers (`GeneratorDeterminismTest` is the only current example) carry `@Tag("cross-cutting")` directly. + +With class-level tags in place, `mvn test -Dgroups=pipeline` runs only pipeline-tier classes; `-DexcludedGroups=execution` skips Postgres for fast inner loops. +Both Surefire and Failsafe honour these flags without further config. + +An enforcement test in each in-scope module (`graphitron`, `graphitron-sakila-example`) walks that module's own test classpath and fails the build if any `@Test`-bearing class lacks a tier identity, or carries more than one. + +== Unit tier + +Structural invariants on individual classifiers, builders, emitters, and runtime helpers. + +*Where:* `graphitron/src/test/java/...` next to the production class. + +Three sub-families: + +*Generator unit tests* (`TypeFetcherGeneratorTest`, `TypeClassGeneratorTest`, `TypeConditionsGeneratorTest`, `GeneratorCoverageTest`; and the `generators/schema/` subdirectory: `EnumTypeGeneratorTest`, `GraphitronFacadeGeneratorTest`, `InputTypeGeneratorTest`, `ObjectTypeGeneratorTest`, etc.). +Take pre-built model fixtures via `TestFixtures`; assert `TypeSpec` shape (method names, return types, parameter signatures). +Banned: code-string body matching on the generated `MethodSpec` body; that is what compilation and execution cover. + +*Validator unit tests* (`*ValidationTest` family, e.g. `ColumnFieldValidationTest`, `QueryTableFieldValidationTest`). +Build a `GraphitronSchema` with one parent type and one field at a known coordinate; assert `validate()` outcomes by `RejectionKind` and message substring. + +*Builder / catalog / writer unit tests* (`JooqCatalogFindColumnTest`, `IdempotentWriterTest`, `ArgBindingMapTest`, `ServiceCatalogTest`, etc.). +Targeted constructor or single-method assertions; no full-pipeline plumbing. + +== Pipeline tier + +SDL → classified model → generated `TypeSpec`. + +*Where:* `graphitron/src/test/java/no/sikt/graphitron/rewrite/`. + +Two shapes: + +*Classification truth tables:* `GraphitronSchemaBuilderTest`. +Each variant family is a `// ===== VariantName =====` section with an enum where each constant is one `(description, SDL, assertion)` triple; one parameterised test iterates the table. + +*Deeper SDL → TypeSpec / variant-shape tests:* `*PipelineTest` files: `NodeIdPipelineTest`, `SplitTableFieldPipelineTest`, `TableFieldPipelineTest`, `LookupTableFieldPipelineTest`, `NestingFieldPipelineTest`, `ServiceRootFetcherPipelineTest`, `TaggedInputsPipelineTest`, `StubbedVariantPipelineTest`; and in `generators/`: `FetcherPipelineTest`, `TablePipelineTest`. +Build a schema with `TestSchemaHelper.buildSchema(sdl)`, assert structural shape on the resulting variant or generated `TypeSpec`. +Banned: code-string body matching. + +== Compilation tier + +Generated source must compile against the test catalog. + +*Where:* `graphitron-sakila-example`, run with `mvn compile -pl :graphitron-sakila-example -Plocal-db`. +The compiler is the assertion; no hand-written assertions are needed for type correctness. + +Two test classes layer structural checks on top: + +`GeneratedSourcesSmokeTest`: every expected class is present in the emitter's output package (catches a generator that silently drops a class). + +`GeneratedSourcesLintTest`: generator-hygiene rules over emitted source text (e.g. no `var` in emitted code). + +== Execution tier + +Full GraphQL request → SQL → row round-trip. + +*Where:* `graphitron-sakila-example`, run with `mvn test -pl :graphitron-sakila-example -Plocal-db`. + +Canonical classes: `GraphQLQueryTest` on the shared fixture; `FederationEntitiesDispatchTest` on the federated fixture. + +Patterns: + +* JDBC round-trip count via the `QUERY_COUNT` listener (`AtomicInteger` reset per test to assert DataLoader batching or lazy-on-selection). +* Returned-row-id sets and field-value assertions against the Sakila fixture catalog. +* Structural SQL-shape assertions via the `SQL_LOG` `ExecuteListener` (e.g. that no `select count` ran when `totalCount` was not selected). + +== Module location vs. tier (`graphitron-sakila-example`) + +Several tests live in `graphitron-sakila-example` for module-dependency reasons but classify by assertion, not module. +Only `GeneratorDeterminismTest` is `@Tag("cross-cutting")`; the rest carry one of the four tier annotations: + +* `GeneratedSourcesSmokeTest`, `GeneratedSourcesLintTest`: `@CompilationTier` (consume the compile output). +* `FederationBuildSmokeTest`, `NoFederationRegressionTest`: `@PipelineTier` (schema-construction assertions on the fixture-derived generated facade; no SQL). +* `ScatterSingleByIdxTest`: `@UnitTier` (direct unit coverage, fully in-memory; lives in `graphitron-sakila-example` because it reflects against a generated `*Fetchers` class). +* `GraphQLQueryTest`, `FederationEntitiesDispatchTest`: `@ExecutionTier`. +* `GeneratorDeterminismTest`: `@Tag("cross-cutting")`, system-level ratchet for the three-clause writer contract (determinism + minimal-change writes + clean orphan removal). Does not fit pipeline (no classifier-to-TypeSpec assertion), compilation (no compile happens), or execution (no SQL). + +== Build commands + +[source,bash] +---- +# Unit + pipeline (no database needed) +mvn test -pl :graphitron -Plocal-db + +# Compilation (generated source compiles against real jOOQ catalog) +mvn compile -pl :graphitron-sakila-example -Plocal-db + +# All tiers including execution (requires local PostgreSQL via -Plocal-db) +mvn test -Plocal-db + +# Skip execution tier for fast inner loops +mvn test -pl :graphitron -Plocal-db -DexcludedGroups=execution +---- + +See `.claude/web-environment.md` for database setup prerequisites and the fixtures-jar footgun recovery. diff --git a/docs/architecture/index.adoc b/docs/architecture/index.adoc new file mode 100644 index 0000000000..4c3e68f5ec --- /dev/null +++ b/docs/architecture/index.adoc @@ -0,0 +1,59 @@ += Architecture +:description: Contributor-facing documentation for the Graphitron generator, shaped as a Diataxis tree. +:!toc: + +Contributor-facing documentation for the Graphitron generator: how the pipeline classifies a GraphQL schema, what code it emits, and the design principles that govern both. For end-user documentation (writing schemas, wiring up Maven, running the generator), see xref:../manual/index.adoc[the user manual]. + +These pages are Diataxis-shaped; pick the quadrant that matches what you are trying to do right now. + +[.quadrants,cols="1,1",frame=none,grid=none] +|=== +a| +[.quadrant-title]*xref:explanation/index.adoc[Explanation]* + +I want to understand why the generator is shaped the way it is. + +The design principles that govern classifier and emitter, the dispatch-axis model, the typed-rejection contract, and how the pipeline fits together end to end. + +a| +[.quadrant-title]*xref:reference/index.adoc[Reference]* + +I know what I am looking for and want the facts. + +The classification taxonomy and what each generator emits, the unified argument-resolution lift, the runtime extension points, and the module map. + +a| +[.quadrant-title]*xref:how-to/index.adoc[How-to guides]* + +I have a specific contributor task and want a recipe. + +Choosing a test tier, wiring an editor or agent into the `dev` loop internals, and cutting a tree-sitter natives release. + +a| +[.quadrant-title]*Ongoing work* + +I want to see what is planned or in flight. + +The forward-looking view lives at xref:../roadmap/index.adoc[the Rewrite Roadmap]. + +|=== + +== You came here because… + +You want to *extend the runtime*, wire per-request values into `Graphitron.newExecutionInput(...)`, register custom scalars, hook in jOOQ listeners. → xref:reference/runtime-extension-points.adoc[Runtime Extension Points]. + +You're *integrating with Apollo Federation*, the `@link` opt-in, the `<schemaInput tag>` flag, providing a custom entity fetcher. → xref:../manual/how-to/apollo-federation.adoc[How-to: Apollo Federation transport]; the contributor-facing wiring rationale lives in xref:how-to/dev-loop-internals.adoc#federation-internals[Dev loop internals → Federation]. + +You want to *understand rejections*, what `AUTHOR_ERROR` / `INVALID_SCHEMA` / `DEFERRED` actually mean in the builder, why rejection is a typed variant rather than a string, how Levenshtein candidate hints get attached. → xref:explanation/typed-rejection.adoc[Typed rejection]. + +You're *integrating an editor or agent with the dev loop*, what the `dev` Mojo wires up, what the LSP / schema watcher / classpath watcher each watch, why idempotent writes matter. → xref:how-to/dev-loop-internals.adoc#dev-loop-detail[Dev loop internals]. + +You want to *read the classification taxonomy*, every variant the schema builder produces, every generator's input. → xref:reference/code-generation-triggers.adoc[Code Generation Triggers]. + +You're looking for a *deeper reference*, the architectural principles that govern both classifier and emitter, the test-tier rubric, the unified argument-resolution lift, the dispatch-axis model behind DataLoader-backed source-side fields. → see xref:explanation/rewrite-design-principles.adoc[Rewrite Design Principles], xref:how-to/testing.adoc[Test-tier guide], xref:reference/argument-resolution.adoc[Argument Resolution], xref:explanation/dispatch-axes.adoc[Dispatch axes]. The module map is at xref:reference/modules.adoc[Modules]; the pipeline overview at xref:explanation/pipeline-overview.adoc[Pipeline overview]. + +== Publishing + +Trunk runs at `10-SNAPSHOT`; releases are cut from tag-driven GitHub Releases. The `.github/workflows/maven-publish.yml` workflow accepts `v<MAJOR>.<MINOR>.<PATCH>` and `v<MAJOR>.<MINOR>.<PATCH>-RC<n>`, sets the version across the reactor, signs (sources + javadoc + GPG), and pushes to Maven Central via the `central-publishing-maven-plugin` with `autoPublish=true`. Maven version ordering treats `10.0.0-RC1` as strictly less than `10.0.0`, so consumers asking for `[10.0.0,)` won't pick up RCs by accident. Snapshots aren't published; the parent declares no `<snapshotRepository>`, so an accidental `mvn deploy` on `10-SNAPSHOT` fails fast. + +Publishable surface: `graphitron-javapoet`, `graphitron`, `graphitron-lsp`, `graphitron-mcp`, `graphitron-maven-plugin`, `graphitron-jakarta-rest`. `graphitron-jakarta-rest` is a real artifact consumers pull onto their runtime classpath, so it joins the deploy set (no `maven.deploy.skip`), unlike `graphitron-sakila-example`, which only consumes the library and stays deploy-skipped. `graphitron-mcp` is published like `graphitron-lsp` because the plugin declares a compile-scope dependency on it and a Maven plugin resolves its declared dependencies from the consumer's repositories at execution time; it must not join the `maven.deploy.skip` list. Test fixtures and example consumers (`graphitron-fixtures-codegen`, `graphitron-sakila-db`, `graphitron-sakila-service`, `graphitron-sakila-example`, `roadmap-tool`, `docs`) carry `<maven.deploy.skip>true</maven.deploy.skip>`. diff --git a/docs/architecture/reference/argument-resolution.adoc b/docs/architecture/reference/argument-resolution.adoc new file mode 100644 index 0000000000..a4a758b3ce --- /dev/null +++ b/docs/architecture/reference/argument-resolution.adoc @@ -0,0 +1,430 @@ += Argument Resolution + +Reference document for how the rewrite classifies GraphQL arguments and +projects them into filters, lookup mappings, order-by specs, and pagination +specs. Covers `@condition` at all three legal positions +(`FIELD_DEFINITION`, `ARGUMENT_DEFINITION`, `INPUT_FIELD_DEFINITION`) and the +override-propagation semantics that tie them together. + +== Pipeline shape + +- `FieldBuilder.classifyArguments` returns `List<ArgumentRef>` (sealed, + three top-level arms plus two intermediate sealed sub-groupers): + `ScalarArg.{ColumnArg | CompositeColumnArg | ColumnReferenceArg | + CompositeColumnReferenceArg | UnboundArg}`, + `InputTypeArg.{TableInputArg | PlainInputArg}`, + plus the top-level `OrderByArg`, `PaginationArgRef`, `UnclassifiedArg`. + The composite/reference scalar arms (R50) carry multi-column or FK-resolved + bindings; the sealed sub-groupers let projections pattern-switch on shape + axis without enumerating leaves. +- Projection helpers consume that list: `projectFilters`, + `projectOrderBySpec`, `projectPaginationSpec`, `projectForLookup`. +- `contextArguments` flow through `ServiceCatalog.reflectTableMethod` into + trailing `ParamSource.Context` parameters on the generated method calls. +- `ArgConditionRef(ConditionFilter filter, boolean override)` carries the + reusable "condition + override flag" pair at every level (field, arg, + input-field). +- `TableInputArg.fieldBindings: List<InputColumnBinding>` carries the + `@lookupKey`-only bindings; composite-key lookups are wired end-to-end + via `LookupValuesJoinEmitter`. +- `LookupField` capability with non-`Optional` `LookupMapping lookupMapping()` + pairs with `@lookupKey`. +- `TypeBuilder.isUsedWithOverrideCondition` skips table-column validation on + inputs whose outer field / argument / own fields declare + `@condition(override: true)`. + +== Scope + +`@condition` is legal at three positions per `directives.graphqls`: +`FIELD_DEFINITION`, `ARGUMENT_DEFINITION`, `INPUT_FIELD_DEFINITION`. Each +`@condition`-carrying field *inside* an input type contributes its own +predicate when the input is used at a call site. Nested input-field +conditions compose. Outer-level overrides propagate downward. + +The input-field position covers both `@table`-annotated input types +(primary case) and plain input types used under the legacy +"implicit-table" heuristic, where the input's fields resolve against the +enclosing query field's target table. A divergence-scan of alf's +production schema +(`alf/graphitron-rewrite:graphitron-rewrite/generator-schema.graphql`, +not committed to trunk) counted 62 plain inputs carrying inner +`@condition`, 3 of them under an outer field-level +`@condition(override: true)` (`Query.emner`, `Query.emnerV2`, +`Query.studenter`). Zero `@table` inputs carry inner `@condition` +because `@table` inputs on alf rely on *implicit column conditions* +instead (63 distinct call sites). Implicit column conditions ship +alongside this Phase 4 work (commit `96e39df`); an un-annotated +`ColumnField` / `ColumnReferenceField` on a `@table` input contributes +a `BodyParam` with `NestedInputField` extraction to the same +`GeneratedConditionFilter` this phase emits. + +== Design + +=== Data model + +Three `InputField` variants +(`graphitron/.../model/InputField.java`) carry +`Optional<ArgConditionRef> condition`: + +- `InputField.ColumnField` +- `InputField.ColumnReferenceField` +- `InputField.NestingField` + +The same variants cover both resolution sources: `@table`-input fields +(classified at type-build time against the input's own declared table) and +plain-input fields (classified at argument-classify time against the +enclosing query field's target table). The variant doesn't need to know +which source produced it; the carrying argument record (`TableInputArg` or +`PlainInputArg`) remembers that. + +`NodeIdField` is intentionally excluded; see Out of Scope. `ArgConditionRef` +is reused verbatim; its `override` flag is the input-field-level override +(matching legacy semantics: `override: true` on an input field replaces that +field's implicit condition with the explicit method). + +=== Classification: reading the directive at type-build and call-site time + +`@table` inputs and plain inputs classify at different times because their +resolution tables differ: + +- *`@table` inputs.* Classified once at type-build time by + `TypeBuilder.buildInputField` against the input's own `@table(name:)`. +- *Plain inputs.* Classified per call site by + `FieldBuilder.classifyPlainInputFields` against the enclosing query + field's target table (`rt`). Same plain input used at N call sites + classifies N times, one per resolved table. Classification is cheap; + reclassification is simpler than caching, and a per-site cache would + complicate invalidation without a measured need. + +*Shared per-field classifier.* `BuildContext.classifyInputField(field, +parentTypeName, tableRef, expandingTypes, errors) -> InputFieldResolution` +hosts the column / `@reference` / nesting decision tree, accessible from +both `TypeBuilder` and `FieldBuilder`. `TypeBuilder` calls it with the +input type's declared table; `FieldBuilder` calls it with the call site's +`rt` when it encounters a plain-input arg. The shared classifier means +`NestingField` semantics stay identical across both resolution paths: a +plain input nested inside a `@table` input still resolves against the +parent `@table`'s table via the existing recursive call, and a plain input +used directly as a field argument resolves against `rt`. + +*Condition helper.* `BuildContext.buildInputFieldCondition(GraphQLInputObjectField +field, String inputFieldName, List<String> errors) -> Optional<ArgConditionRef>` +mirrors `FieldBuilder.buildArgCondition`: + +- Directive parsing is delegated to `BuildContext.readConditionDirective`, + which is `GraphQLDirectiveContainer`-generic so `GraphQLInputObjectField` + works without modification. +- Reflection via `ServiceCatalog.reflectTableMethod(className, method, + Set.of(inputFieldName), Set.copyOf(contextArguments))`. The method's + primary argument is the single input-field value, named after the + SDL field name (matches legacy; see `withListedInputConditions` + fixture: `customerString(table, input.getId())`). +- On reflection failure, the error is appended and `Optional.empty()` is + returned, mirroring the `buildArgCondition` error contract. + +The helper is agnostic to `@table` vs. plain source; both paths call it +with the same shape. `classifyInputField`, `buildInputFieldCondition`, +and `readConditionDirective` all live in `BuildContext`; callers in +`TypeBuilder` and `FieldBuilder` reach them via `ctx`. + +=== Projection: threading conditions to the call site + +`FieldBuilder.projectFilters` handles outer-arg-level `@condition` on both +`TableInputArg` and `PlainInputArg` and then walks each input's classified +`InputField` records via `walkInputFieldConditions`, appending every +present condition. The walking logic is identical across both carriers; +differences live only in the carrying record. + +*Both variants carry a classified field list.* `TableInputArg` and +`PlainInputArg` each carry `List<InputField> fields` populated at +classify time. `TableInputArg.fieldBindings` is `@lookupKey`-only and +insufficient on its own, since condition-carrying fields aren't +necessarily lookup keys. + +The alternative was to read the field list out of a registry at projection +time. Rejected: re-couples projection to builder context, breaks the +invariant that projection is a pure function of `List<ArgumentRef>` (no +builder state, no registry lookups). For `PlainInputArg` there is no +registry entry to read from at all, so the carry-on-the-record shape is +the only coherent option there anyway. + +=== Override propagation + +Three directive levels can co-exist at one call site: + +- *Field*: `fieldDef @condition` +- *Argument*: `arg @condition` +- *Input field*: `inputField @condition` + +Nesting adds a fourth tier: an input type contains an input field whose type is +itself another input type, which has its own fields. Each nested level can +carry its own `@condition`. + +*Propagation rule (downward inheritance).* `override: true` at any enclosing +level (parent-field ⊇ arg ⊇ nesting-field) suppresses every nested *implicit +condition* (jOOQ `table.COLUMN.eq(input.getField())`). Explicit `@condition` +methods are never suppressed by ancestor overrides; they're independent +declarations by the schema author, and a level's own `override` flag affects +only that level's implicit condition. + +==== Legacy behavior reference (and intentional divergence) + +The rule above (downward inheritance, explicit methods survive) is the rule +the *rewrite* will enforce. It is NOT the rule the legacy generator +implements. Reviewers and implementers should know the delta before signing +off on §Override propagation. + +*Legacy schema, `withListedInputConditions`* +(link:../../../graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/withListedInputConditions/schema.graphqls[schema.graphqls]): + +[source,graphql] +---- +type Query { + customer(in: [CustomerInput]): CustomerTable @condition(..., method: "customerJOOQRecordList") + customerOverride(in: [CustomerInput]): CustomerTable @condition(..., method: "customerJOOQRecordList", override: true) +} +input CustomerInput @table(name: "CUSTOMER") { + id: ID! @condition(..., method: "customerString") + first: String! @field(name: "FIRST_NAME") + @condition(..., method: "customerString", override: true) +} +---- + +*Legacy output, same fixture's* +link:../../../graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/withListedInputConditions/expected/QueryDBQueries.java[`expected/QueryDBQueries.java`]: + +- `customerForQuery` (no outer override, :17-37) emits the full stack: + row-IN containing `hasId(id)` + `customerString(table, id)` + + `customerString(table, firstName)`, AND-ed with `customerJOOQRecordList`. + Inner `id` (no override) contributes both implicit condition AND explicit + method; inner `first` (`override: true`) contributes only the explicit + method (its own implicit condition suppressed at the input-field level). + No explicit method is dropped by the outer level. +- `customerOverrideForQuery` (outer override, :40-48) emits *only* + `customerJOOQRecordList`. Every inner contribution is dropped: `id`'s + implicit condition, `id`'s explicit `customerString`, and `first`'s + explicit `customerString`. There is no row-IN construct at all. + +**The legacy rule is total-replace: an outer `override: true` substitutes its +own explicit method for everything below it, regardless of whether inner +fields carry their own explicit `@condition` methods.** The rewrite's +proposed rule preserves inner explicit methods across the boundary. That is +a *deliberate divergence* from legacy. + +*Rationale for diverging.* The legacy behavior couples implicit conditions +and explicit methods into a single "outer owns everything" toggle, which means +a schema author can't declaratively compose an outer replacement condition +with inner explicit side-conditions. The rewrite treats each level's +`override` flag as affecting only that level's implicit condition, which lets +`@condition(override: true)` replace the implicit condition without also +silencing explicit input-field conditions written by the schema author. + +*Divergence-pinning tests.* Two execution tests pin the rewrite against +legacy's total-replace rule: +`inputFieldCondition_tableInput_outerOverride_preservesInnerExplicitMethod` +(outer `@condition(override: true)` over a `@table` input whose field +carries its own `@condition`) and +`inputFieldCondition_plainInput_outerOverride_preservesInnerExplicitMethod` +(same shape against a plain input; alf production shape). Both generate a +predicate conjunction that evaluates to an empty result set; a regression +to the legacy "outer owns everything" rule would drop the inner predicate +and return rows, breaking the tests by name. + +*If a downstream consumer relies on the legacy coupling*, handle it with +an author-side schema edit (drop the inner `@condition` methods that +should not run under outer override) or promote to its own backlog item. +The rewrite does not reproduce total-replace. + +*Audit of legacy override fixtures.* Three additional fixtures under +`queries/fetch/records/` were inspected to confirm the 6-row truth table +is complete: + +- `multiLevelInputJavaRecordOverrideCondition`: three-level nesting + `Input3 → Input2 → Input1`, with `@condition(override: true)` at the + `Input2.input1` nesting field (not at outer arg, not at field). Confirms + nesting-field-level override is a real production shape; already covered + by the "any enclosing override (field ⊇ arg ⊇ nesting-field)" propagation + rule. No new row. +- `nestedListInputJavaRecordOverrideCondition`: arg-level + `@condition(override: true)` over `[Input1]` whose fields carry no + `@condition`. Row 4 of the truth table. +- `listInputJavaRecordAndFieldOverrideCondition`: parent-field-level + `@condition(override: true)` composed with arg-level `@condition` (no + override) on a sibling scalar-list arg. Parent-field-level override + propagates to the arg's implicit conditions; explicit arg method fires. + Row 2 and row 5 combined across two args; no new row for input-field + semantics (no input type is involved). + +All three fall within the 6-row table. + +=== Truth table (per input-field, per call site) + +"Any enclosing override" = parent-field-level OR arg-level OR any +intermediate nesting-field's `override: true`. + +[cols="1,1,1,1", options="header"] +|=== +| Any enclosing override | Input field `@condition` | Implicit condition | Explicit method + +| No | Absent | Emitted | n/a +| No | Present (no override) | Emitted | Emitted +| No | Present (override:true) | Suppressed | Emitted +| Yes | Absent | Suppressed | n/a +| Yes | Present (no override) | Suppressed | Emitted +| Yes | Present (override:true) | Suppressed | Emitted +|=== + +Enforced by the symmetric-implicit-predicate-emission pipeline test added in +R205 (`plainInput_resolvedColumnWithoutCondition_emitsImplicitBodyParam`), +which pins identical implicit-condition emission for `@table` and plain inputs. + +"Emitted" in the explicit-method column means the method call lands in the +`List<WhereFilter>` returned by `projectFilters`; downstream emitters AND +all present filters together (see §Emission). The earlier column label +"Replaces" was inherited from column-arg vocabulary and is misleading here, +since rows 5-6 have no implicit condition left to replace. + +Six rows, not nine: the previous draft's "outer `override: false`" row is +indistinguishable from "outer absent" since `false` is the directive default. +Confirmed against `BuildContext.argBoolean` (which defaults `ARG_OVERRIDE` to +`false`) and the SDL declaration in `directives.graphqls` (`override: Boolean += false`). + +=== Emission: no new emitters + +`projectFilters` output is `List<WhereFilter>`; each `ConditionFilter` is +already a callable reference carrying `Table<?>` + arg-value parameters. The +downstream emitters (`LookupTableFieldEmitter`, `InlineLookupTableFieldEmitter`, +`SplitRowsMethodEmitter`) already AND-in each `ConditionFilter` without +knowing its provenance. Input-field conditions land alongside field-level +and arg-level conditions in the same filter list. + +*List-typed inputs (composite-key lookups).* `LookupValuesJoinEmitter` emits +VALUES+JOIN rows; per-row condition evaluation already reads fields via +`input.get(i).get<FieldName>()`. Input-field conditions piggyback on the same +loop; projection just hands them as additional filters. Verify round-trip +count with an execution test (see §Test strategy). + +*Nested non-`@table` input types.* `InputField.NestingField` resolves its +own fields against the parent's table. A condition on the nesting field is +reflected with the nesting field's SDL name as the sole arg (same shape as a +scalar input field's condition); projection walks `NestingField.fields` +recursively to pick up inner conditions, threading a `boolean enclosingOverride` +accumulator: any level's `override: true` flips it to `true` for all +descendants. No new emitter shape. + +=== Validator + +1. *`TypeBuilder.isUsedWithOverrideCondition`.* Returns true when any + consuming field or argument declares `@condition(override: true)` + against the input type, *or* when the input type itself has any + field with `@condition(override: true)`. This preserves the + "skip table-column validation when overridden" escape hatch across + outer-level and per-field overrides. Plain inputs do not pass through + `isUsedWithOverrideCondition` (it gates table-column validation for + `@table` inputs); the per-call-site classifier handles plain-input + column resolution directly against the outer field's table with the + existing `catalog.findColumn` + `@field(name:)` path. + +2. *`GraphitronSchemaValidator`.* No new structural validation: + graphql-java enforces `on INPUT_FIELD_DEFINITION` placement at + schema-parse time. Reflection errors surface through the existing + `errors` list in `TypeBuilder.buildInputField` → `UnclassifiedType` + fallback for `@table` inputs, and through the per-call-site + classifier's `errors` list for plain inputs (same `UnclassifiedArg` + fallback already used for other classify-time failures). + +== Runtime: nested input-field arg extraction + +When a `@condition` method sits on an input field, the runtime values +passed to it are not reachable as top-level arguments. The +`CallSiteExtraction.NestedInputField(String outerArgName, List<String> path)` +variant records the path from the outer argument down to the leaf value. +`FieldBuilder.walkInputFieldConditions` threads `(outerArgName, pathPrefix)` +through the recursion; when a condition is found, `rewrapForNested` +replaces each `ParamSource.Arg` param's extraction with +`NestedInputField(outerArgName, prefix + [fieldName])`. + +At code-gen time, `ArgCallEmitter.buildArgExtraction` turns that into a +null-safe nested `instanceof Map<?, ?>` ternary chain that traverses from +the top-level argument Map down to the leaf value. The chain short-circuits +to `null` at any level whose value is absent or is not a Map, so a +`@condition` method always receives either the concrete leaf value or +`null`; reflecting it with a Map or a wrong-shaped value is not possible. + +== Test assertions + +Follows `docs/rewrite-design-principles.md`: no body-string assertions on +emitted method bodies. Execution tests assert, for each case: + +- JDBC round-trip count matches expectation (catches spurious extra queries). +- Returned row IDs match the hand-authored expected set. +- WHERE-clause shape via a jOOQ `ExecuteListener` capturing the generated + SQL: compare structural tokens (column references, operator positions, + AND/OR tree shape), not literal strings. + +Pipeline tests (`GraphitronSchemaBuilderTest`) assert on the classifier +output directly (`List<InputField>`, `List<WhereFilter>`), not on emitted +code. + +== Design decisions & rationale + +- *`readConditionDirective` home: `BuildContext`.* Rejected + alternatives: a new `ConditionDirectives` utility; keeping it in + `FieldBuilder` and duplicating a minimal copy in `TypeBuilder`. + `BuildContext` already houses `DIR_CONDITION`, `ARG_OVERRIDE`, + `argBoolean`, and `argStringList`; co-locating directive-parsing helpers + there is consistent and every caller already has a `ctx` handle. + +- **Projection access to `InputField` list: carried on the argument + record, not looked up from a registry.** `TableInputArg` and + `PlainInputArg` each hold `List<InputField> fields`, populated at + classify time. Registry lookup at projection time was rejected: it + re-couples projection to builder context and breaks the invariant that + projection is a pure function of `List<ArgumentRef>`. For + `PlainInputArg` there is no registry entry anyway (plain-input fields + classify per call site against the outer field's `rt`), so the + carry-on-record shape is the only coherent one there. + +- **Condition-method signature for `NestingField` conditions: single arg + named after the SDL field.** Matches the reflection shape + `ServiceCatalog.reflectTableMethod(className, method, Set.of(fieldName), + ...)` already used by scalar input-field conditions. Per-leaf + parameterization was rejected as speculative: no legacy fixture or alf + call site requires it, and it would change the reflection key from a + single field name to an ordered tuple that does not round-trip through + `ArgConditionRef` without schema changes. If a method needs inner + values, it traverses the passed object. + +- *Reflection-failure behaviour: per-arg, not per-type.* Input-field + condition reflection mirrors `buildArgCondition`: append the error, + return `Optional.empty()`, leave the rest of the field classifying + cleanly. Promoting the whole `TableInputType` to `UnclassifiedType` was + rejected on blast-radius grounds: a reflection failure is a + caller-fixable error, not a schema-structural one, so it should not + invalidate the input type's other fields. + +- **`ArgCallEmitter` shape for nested input-field extraction: new sealed + variant `CallSiteExtraction.NestedInputField(outerArgName, path)`.** + Rejected alternatives: (B) an optional `outerArgPath` field on + `CallParam` that every extraction variant checks (couples every variant + to the nested case); (C) projection pre-lifts a + `Object <slot> = env.getArgument(outerArg) instanceof Map m ? + m.get(field) : null;` local at the top of the fetcher body and + references it (complicates projection with a new emission slot and + doesn't compose with `NestingField` chains). The sealed hierarchy is + already the right place for extraction-shape variations (`Direct`, + `EnumValueOf`, `TextMapLookup`, `ContextArg`, `JooqConvert`); + `NestedInputField` fits the same pattern, makes the nested case explicit + at every emitter switch, and composes cleanly with `NestingField` + recursion in projection. + +== Out of Scope + +- *Mutations.* Input-type arguments for DML use a different mapping. + Mutations get their own plan. +- *`NodeIdField` with `@condition`.* Node-id input fields decode through + `NodeIdStrategy` rather than direct column binding, so input-field-level + `@condition` would compose with the encoded-id path differently than with + plain column fields. Promote to its own backlog item if a real schema + surfaces this. diff --git a/docs/architecture/reference/code-generation-triggers.adoc b/docs/architecture/reference/code-generation-triggers.adoc new file mode 100644 index 0000000000..ab52afcb82 --- /dev/null +++ b/docs/architecture/reference/code-generation-triggers.adoc @@ -0,0 +1,668 @@ += Code Generation Triggers + +A guide to how GraphQL schema patterns drive Graphitron's code generation. This document introduces the classification pipeline and the vocabulary needed to read the source code. For variant details and record components, read the Javadoc on each source file listed in the <<source-map,Source Map>> below. + +''' + +== How Classification Works + +`GraphitronSchemaBuilder` reads the schema once and classifies every type and field into a sealed +hierarchy. The generators then operate on these classified models ; they never re-read directives. + +---- +GraphQL Schema + ↓ +GraphitronSchemaBuilder (the only place directives are read) + ↓ +GraphitronSchema + ├── Map<String, GraphitronType> types (one per GraphQL type) + ├── Map<FieldCoordinates, GraphitronField> fields (one per field) + ├── Map<String, List<GraphitronField>> fieldsByType (derived index) + ├── Map<String, EntityResolution> entitiesByType (federation entity mappings) + └── List<BuildWarning> warnings (non-fatal advisories) + ↓ +Generators + ├── TypeFetcherGenerator → fetchers.*Fetchers + ├── TypeClassGenerator → types.* + └── TypeConditionsGenerator → conditions.*Conditions +---- + +Each sealed variant maps to specific generator output. The sections below show the full +directive-pattern → variant → generator output chain. + +''' + +== Classification Vocabulary + +[NOTE] +==== +*Original framing.* This section describes the field axes (source context, target type, scope) in their original form. They fold into the three-axis `(source, operation, target)` model in <<field-classification,Field Classification>>, which the field now carries directly through its `source()` / `operation()` / `target()` accessors. Treat <<field-classification,Field Classification>> as canonical for how a field classifies; the terms below survive as the historical framing and as properties derived from the three axes, not as independent axes. +==== + +Two independent classifications describe every field: the *source context* it is defined on (parent type), and the *target type* it returns. Both matter because scope transitions are determined by the pair, not by either alone. + +=== Source context + +The type on which a field is defined. + +|=== +| Source context | Trigger | What Graphitron generates + +| *Unmapped* | *(none ; Query, Mutation)* | Entry point. No SQL yet. +| *Table-mapped* | `@table` | Full SQL generation ; queries, joins, projections. +| *Result-mapped* | producer's reflected return is a Java/jOOQ class | Runtime wiring only. The type's backing class is derived by reflection from its producing field (a `@service` return, a `@tableMethod` return, or a parent-accessor chain). Graphitron validates types and wires data fetchers, but generates no SQL until a new scope starts. +|=== + +=== Target type + +The classification of the field's return type (the element type ; looked through `List` and `Connection` wrappers). Encoded as `ReturnTypeRef`. + +|=== +| Target type | `ReturnTypeRef` variant | When it appears + +| *Target table* | `TableBoundReturnType` | Return type has `@table` (or is a `@table` + `@discriminate` interface), or a `NestingField` inherits the parent's table context. Carries a fully resolved `TableRef`. +| *Target record* | `ResultReturnType` | Return type is class-backed: its backing Java/jOOQ class is reflected from the producing field's return type, not from a directive. +| *Target scalar* | `ScalarReturnType` | Scalar, enum, or an unclassified type name (e.g. `@nodeId(typeName:)` argument types). +| *Target polymorphic* | `PolymorphicReturnType` | Interfaces/unions spanning multiple tables, and the Relay/Federation built-ins `node` / `_entities`. +|=== + +"Target table" is the pivot concept for scope transitions: every new scope is a query rooted in some target table, driven either by the root entering a table-mapped type or by a *record handoff* from a result-mapped source into a target-table return. + +=== Scope + +A Graphitron scope corresponds to one SQL statement. Fields within a scope contribute to the same query. Scope is determined by the *(source context, target type)* pair ; *independently* of `@lookupKey`, which is orthogonal. + +[#diagram-d3] +[source,mermaid] +---- +stateDiagram-v2 + direction LR + [*] --> NoScope + NoScope --> InScope : enter<br/>(unmapped root field<br/>reaches target-table type) + InScope --> InScope : split<br/>(@splitQuery on table-mapped source<br/>→ new scope via DataLoader, parent PK key) + InScope --> InScope : record handoff<br/>(target-table field on result-mapped source<br/>or @service/@tableMethod returning target-table type<br/>→ new scope via DataLoader, parent PK or custom batch key) + InScope --> Private : exit<br/>(@service field creates private scope<br/>independent of any Graphitron-managed scope) + Private --> InScope : (private scope ends, caller continues) + InScope --> [*] +---- + +|=== +| Boundary | Trigger + +| *Enter* | An unmapped root field reaches a target-table type ; the first scope starts +| *Split* | `@splitQuery` on a table-mapped source ; a new scope via DataLoader, keyed by the parent's PK +| *Record handoff* | A target-table field on a result-mapped source, or any user-provided return (`@service`, `@tableMethod`) reaching a target-table type ; new scope via DataLoader, keyed by the parent's PK or a custom batch key +| *Exit* | `@service` fields create a *private scope* ; their SQL statement is independent of any Graphitron-managed scope +|=== + +`@lookupKey` does not appear in this table on purpose. It shapes the batch (adds the derived target table and the N × M invariant) but does not by itself open or close a scope ; that is always decided by the source/target pair above. + +=== Derived tables + +Two kinds of `VALUES(…)` derived tables built by Graphitron when batching: + +- *Derived source table* ; built from parent source records. Contains the FK-relevant columns from the parent: the parent's PK/unique-key columns when the FK is on the child side, or the FK columns themselves when the FK is on the parent side. Used for `@splitQuery` table fields, user-provided returns (`@service`, `@tableMethod`), and mutation read-backs. +- *Derived target table* ; built from `@lookupKey` argument values (from `SelectedField.getArguments()`). Each argument value (or list element) is one row. *Identical for every source in a batch* ; all N parents in a batch share the same request arguments, so M (the number of lookup rows) is constant for the entire batch. Base result count is exactly N × M. + +*`@condition` on lookup fields is allowed.* The condition method, however, must preserve the N × M positional contract: each (source, target) pair produced by the derived-table cross join is either kept in full or dropped in full, and no additional rows may be introduced. In practice this means the condition should be a predicate over the pair of rows, not a filter that can change the per-parent result cardinality non-uniformly. Violating the contract desynchronises batch dispatch ; the client receives rows that cannot be reattached to their source. The contract is a developer responsibility, not a build-time check. + +=== Conditions + +|=== +| Kind | Purpose | Source + +| *Reference condition* | How two tables are joined within a scope | `@reference` directive: FK key → `FkJoin`; condition method → `ConditionJoin` +| *Filter condition* | Narrows the result set of the current scope | `@condition` directive, arguments, cursor +| *Lookup condition* | Filters the (source × target) row pairs produced by a lookup's derived target table. Must preserve the N × M positional contract ; see <<derived-tables,Derived tables>> above. | `@condition` directive on a field with `@lookupKey` +|=== + +=== Structural properties + +|=== +| Property | Effect + +| *`@splitQuery`* | On a table-mapped source, forces a new scope via DataLoader: `TableField` (no `@lookupKey`) → `SplitTableField`; field with `@lookupKey` → `SplitLookupTableField`. On a result-mapped source it is redundant ; the record handoff already opens a new scope ; and should produce a build *warning*, not an error. +| *`@lookupKey`* | Argument values become the derived target table (see <<derived-tables,Derived tables>>). Blocks pagination (preserves the N × M result invariant). Without `@splitQuery` → `LookupTableField`; with `@splitQuery` → `SplitLookupTableField`. Orthogonal to scope ; see <<scope,Scope>>. +|=== + +''' + +== Type Classification + +The worked examples in this section render directly from the classification test corpus +(`ClassifiedCorpus` in `graphitron`'s test sources): the SDL shown is the live fixture the classifier +runs against, projected through a documented query by the query-as-view renderer, with the test-only +`@classified` / `@classifiedType` assertion directives stripped. The `ClassifiedDocTest` build guard +fails if this page ever drifts from what the corpus renders, so a displayed example is always one the +classifier actually produces the stated verdict for. The reference table that follows enumerates the +verdicts not yet migrated to a worked example. + +=== `@table` type → `TableType` + +A type carrying `@table(name:)` (without `@node` or `@discriminate`) classifies as `TableType`, the +pivot for SQL generation. A root field returning it enters a new query scope rooted in that table, and +a scalar child whose name matches a column projects inline. + +[source,graphql] +---- +type Query { + "A single film, fetched by primary key." + film: Film +} + +type Film @table(name: "film") { + "The film's display title." + title: String +} +---- + +`Film` classifies as `TableType` (full SQL generation: queries, joins, projections); `Query.film` +enters the scope; `Film.title` projects an inline column. Asserted by the `catalog` corpus example via +`@classifiedType(as: TableType)`. The field descriptions come from `# ...` comments authored on the +example's projection query, rendered as SDL descriptions by `QueryViewRenderer`. + +=== Reference table + +|=== +| Classification Trigger on Type | `GraphitronType` Variant | Generator Output + +| `@table` + `@node` | `NodeType` | `*Fetchers` class + `*` class (with Relay ID handling) +| Producer's reflected return is a Java/jOOQ class (a `@service` return, a `@tableMethod` return, or a parent-accessor chain) | `ResultType`* | `*Fetchers` class only (no SQL scope of its own). The backing class is reflection-derived, not declared. +| `Query` or `Mutation` root type | `RootType` | `*Fetchers` class only +| Interface with `@table` + `@discriminate` | `TableInterfaceType` | `*Fetchers` class +| Interface without `@table` (multi-table) | `InterfaceType` | `*Fetchers` class +| Union type | `UnionType` | `*Fetchers` class +| `@error` | `ErrorType` | No generation (error mapping config) +| Input type with `@table` (deprecated on input; see `docs/manual/reference/directives/table.adoc`) | `TableInputType` | Used in mutation generation. A build warning fires per `@table`-on-input usage, except encoded-ID / scalar-return INSERT/UPSERT. +| Input type without `@table` (the `@service` / `@condition` / `@tableMethod` parameter the input flows into is reflected as a developer class) | `InputType`* | No generation (developer-provided class). The input's backing class is reflected from the parameter type it flows into. +| Input type with `@table` used on fields with conflicting return tables | `PojoInputType` (unbound) | No generation ; column binding resolved per field-usage +| Object type with no `@table` and no producer binding | `NestingType` | No generation; nested under a parent table-bound or class-backed scope via `NestingField` +| GraphQL `enum` type | `EnumType` | No generation; enum values map to DB strings/ints at column-bind time +| GraphQL `scalar` type with `@scalarType(scalar:)` | `ScalarType` | No generation; the consumer's `public static final GraphQLScalarType` constant is registered on the synthesized schema via `.additionalType(...)`. Graphitron reflects on the constant's `Coercing<I, O>` to recover the Java type used for input-record components, service params, and `Field<X>` projections. +| GraphQL `scalar` type matching the extended-scalars convention table (no directive, `graphql-java-extended-scalars` on the classpath) | `ScalarType` | Same as above, but the constant FQN is read from `ScalarTypeResolver`'s 30-entry convention table (`scalar BigDecimal` → `ExtendedScalars.GraphQLBigDecimal`, etc.). +| Spec built-in scalar (`Int` / `Float` / `String` / `Boolean` / `ID`) | `ScalarType` | Same registration shape; Java type comes from a closed table (the spec binds these names). `@scalarType` on a spec built-in is a hard validation error (directive conflict). +| GraphQL `scalar` type with no directive and no convention-table entry | `UnclassifiedType` | Validation error pointing at `@scalarType(scalar:)` or extended-scalars as the fix; no silent fallback to `Object`. +| Generated `*Connection` type (from `@asConnection` transform) | `ConnectionType` | Pagination wrapper; pairs with `EdgeType` and `PageInfoType` below +| Generated `*Edge` type | `EdgeType` | Edge wrapper carrying `node` + `cursor` for the connection +| Generated `PageInfo` type | `PageInfoType` | Connection page-info wrapper +| Conflicting or unresolvable directives | `UnclassifiedType` | Validation error ; build fails +|=== + +*Intermediate sealed interfaces* (not shown in the table ; grouping nodes in the hierarchy): +- `TableBackedType` ; groups `TableType`, `NodeType`, `TableInterfaceType`. Builders switch on this to detect table-mapped types. +- `ResultType` is itself a sealed sub-interface with four concrete variants: `JavaRecordType`, `Backed` (the sole concrete leaf of the intermediate `PojoResultType`), `JooqRecordType`, `JooqTableRecordType` ; reflecting how the result class is represented in Java. +- `InputType` is itself a sealed sub-interface with four concrete variants: `JavaRecordInputType`, `PojoInputType`, `JooqRecordInputType`, `JooqTableRecordInputType` ; same split by Java representation. `PojoInputType` is also used when an input type appears as an argument on fields with different return tables ; it is classified as unbound rather than failing. + +''' + +[#field-classification] +== Field Classification + +A field's classification factors into three asserted axes plus a derived layer. The worked examples below +render the dimensional form from the corpus; the leaf-name tables that follow are a curated reference, +enumerating each sealed variant and the generator output it drives. The corpus, not these tables, is the +coverage source of truth: `VariantCoverageTest` guarantees every output-field leaf is demonstrated by a +corpus fixture, so a variant absent from a table below is still tested, just not featured here in prose. + +A field is an edge: it *arrives into* a `source`, *performs* an `operation`, and *projects* a `target`. +The three asserted axes are: + +* *`source`*, the field's arrival endpoint, a wrapper around a shape. The wrapper arm *is* position and + the legality gate: `Root` (permitting `Query` / `Mutation`) is a root field, `OnlyChild` / `Child` is a + nested field (one or many source objects arriving). Write operations are legal only on `Root.Mutation`, + `NodeResolve` only on `Root.Query`, `Nest` only on a nested source. The nested arms wrap a + `SourceShape` (`Table` / `Record`), the catalog-vs-Java polarity of what arrives at `env.getSource()`. +* *`operation`*, the verb the field performs: reads (`Fetch`, `Paginate`, `Lookup`, `NodeResolve`, + `Nest`, and the modeled-but-unpopulated `EntityResolve` / `Count` / `Facet`), writes (`Insert`, + `Upsert`, `Update`, `Delete`, and the unpopulated `UpdateMatching` / `DeleteMatching`), and the + developer `ServiceCall` (the read-vs-write split it once carried is now read off the `source` root). +* *`target`*, the field's projection endpoint, a wrapper (`Single` / `List`) around a `TargetShape`. + The shape carries *build-vs-consume*: `Table` / `Column` are catalog shapes graphitron *builds* the SQL + for; `Record` / `Field` are domain shapes graphitron *consumes* without having built; `Connection`, + `Interface`, `Union` are the container and polymorphic shapes. `Table:Column :: Record:Field` + (mirror : reflect). A Relay connection is `Single(Connection(...))`, its windowed-read verb the + `Paginate` operation. + +The *derived layer* is computed from those three plus the field's slots and schema position, never +asserted: `FetchRelated` (a `Fetch` reaching a related entity over a join-path), *re-fetch* (a +service/DML producer yielding a `Table` shape, forcing a re-projection), *new-query* (`@splitQuery` / +polymorphic / record-handoff opening a fresh keyed query), and *polarity* (mutating-or-not, from the +`source` root and the write operations). The governing principle is *assert what nothing else carries; +derive what another axis or slot already forces*. The subsections below sound out the derived layer and +each axis in turn. + +=== The derived layer: same verdict, different mechanism + +Two fields can share an identical `(source, operation, target)` verdict yet emit different SQL, because +the fetcher/loader mechanism is *derived*, not asserted. The cleanest illustration is the new-query +derivation: a `@table` child reachable by a foreign key from a `@table` parent inlines as a correlated +subquery folded into the parent's SELECT, while adding `@splitQuery` opens a new keyed query dispatched +through a DataLoader. Both classify identically (`source = Child(Table)`, `operation = Fetch`, +`target = Single(Table)`); only the derived new-query layer differs, forced by the `@splitQuery` slot. + +[source,graphql] +---- +type Query { + city: City +} + +type City @table(name: "city") { + country: Country + countrySplit: Country @splitQuery +} + +type Country @table(name: "country") { + name: String @field(name: "country") +} +---- + +`City.country` and `City.countrySplit` return the same `Country` over the same `city -> country` foreign +key and carry the same `Child` / `Fetch` / `Table` verdict; `@splitQuery` flips only the derived +new-query layer, not an asserted axis. Asserted by the `child-table` corpus example. + +==== The record-handoff boundary + +`@splitQuery` is not the only trigger for the new-query derivation. A `@table` child reached by a foreign +key inlines under a `@table` parent, but the *same* FK-reached child re-queries under a record-backed +parent, because the record handoff has already opened a new DataLoader-backed scope that the correlated +subquery cannot fold back into. The parent's table-ness, not a directive, forces the derived re-query +here; the asserted verdict is unchanged. + +[source,graphql] +---- +type Query { + film: Film +} + +type Film @table(name: "film") { + language: Language @reference(path: [{key : "film_language_id_fkey"}]) + details: FilmDetails +} + +type Language @table(name: "language") { + name: String +} + +type FilmDetails { + language: Language @reference(path: [{key : "film_language_id_fkey"}]) +} +---- + +`Film.language` (`TableField`) and `FilmDetails.language` (`RecordTableField`) return the same `Language` +over the same `film_language_id_fkey` foreign key and carry the same `Fetch` / `Table` operation and +target; they differ only on the source shape (`Child(Table)` vs `Child(Record)`), and the record handoff +forces a derived keyed re-query under `FilmDetails`, not a different asserted axis. +Asserted by the `record-table` corpus example. + +=== `target` shape: build-vs-consume (Column vs. Field) + +The `target` shape records what domain object the value is, and with it whether graphitron *builds* the +SQL (catalog: `Table` / `Column`) or *consumes* a value it did not build (domain: `Record` / `Field`). +Two scalar flavors hinge on the parent's table-ness: a scalar under a `@table` parent projects a `Column` +(a real database column graphitron projects), while under a record-backed parent (a plain object with no +`@table`, here produced as a service method's return type) a scalar projects a `Field` (a POJO property +read off a record graphitron only reflects). A nested non-table object under a record parent is the object +flavor of the same `Field` shape. All three are `Fetch`; the parent's table-ness moves the source shape +(`Table` vs `Record`) and with it the target shape across the build-vs-consume line. + +[source,graphql] +---- +type Query { + film: Film +} + +type Film @table(name: "film") { + title: String + details: FilmDetails +} + +type FilmDetails { + stats: FilmStats +} + +type FilmStats { + count: Int +} +---- + +`Film.title` classifies with target shape `Column` (`title` is a column of the `film` table graphitron +builds the projection for). `FilmStats.count`, a scalar under the record-backed `FilmStats`, classifies +with target shape `Field` (a property graphitron reflects). `FilmDetails.stats`, a nested non-table object +under the record-backed `FilmDetails`, also classifies with target shape `Field` (its object flavor). All +hold `operation = Fetch`; the two record-backed cases also carry `source = Child(Record)`. Asserted by +the `mapping` corpus example. + +=== Polymorphic fields: interfaces, unions, and Relay nodes + +A field returning an interface, a union, or a Relay `Node` is *catalog-bound* over the participant +types: classification resolves the polymorphic type to its participant `@table` rows and projects each +branch from the catalog. The target shape is therefore `Interface` / `Union` (the projection lands on +participant table rows), with the participant set carried as a *derived slot* rather than as a distinct +shape value. The operation is `Fetch` for interface and union fields (root or child) and `NodeResolve` +for the Relay `node` / `nodes` roots; the new keyed query a plain-interface or union field opens +(`InterfaceField` / `UnionField`, and the polymorphic roots `QueryInterfaceField` / `QueryUnionField` / +`QueryNodeField` / `QueryNodesField`) is a *derived* new-query, not an asserted axis. The one structural +difference is a `@table`+`@discriminate` interface child (`TableInterfaceField`): it is +foreign-key-correlatable from the parent, so it inlines rather than opening a new query, but its asserted +`Child` / `Fetch` / `Table` verdict is the same. + +[source,graphql] +---- +type Query { + customer: Customer +} + +type Customer @table(name: "customer") { + address: Named +} + +interface Named { + name: String +} +---- + +`Customer.address` returns the plain interface `Named` (implemented by the `@table` type `Address`), +so it classifies with `source = Child`, `operation = Fetch`, target shape `Interface` (`InterfaceField`): +a derived new keyed query projects the participant table, with `Address` recorded as the participant slot. +Asserted by the `interface` corpus example. + +A union child follows the same dimensional rule. The selection descends into each participant through an +inline fragment (`... on Film`, `... on Actor`), and classification resolves the union to its participant +`@table` rows: + +[source,graphql] +---- +type Query { + filmActor: FilmActor +} + +type FilmActor @table(name: "film_actor") { + related: FilmOrActor +} + +type Film @table(name: "film") { + title: String +} + +type Actor @table(name: "actor") { + firstName: String @field(name: "FIRST_NAME") +} + +union FilmOrActor = Film | Actor +---- + +`FilmActor.related` returns the union `FilmOrActor`, so it classifies with `source = Child`, +`operation = Fetch`, target shape `Union` (`UnionField`): a derived new keyed query projects whichever +participant table a row resolves to, with `Film` and `Actor` recorded as the participant slots. Asserted +by the `union` corpus example. + +The `@table`+`@discriminate` interface child (`TableInterfaceField`, inline, target shape `Table`) and +the Relay `Node` root (`QueryNodeField`, `operation = NodeResolve`, target shape `Interface`) are further +leaves on this same polymorphic rule; they are asserted corpus-only (`table-interface`, `relay-node`). + +A discriminated interface may also be a *joined-table* (class-table) inheritance: each concrete type +declares its own detail `@table` distinct from the discriminated base, with its inherited (base-resident) +fields carrying a `@reference` back to the base and its own columns living on the detail table. Such a +participant classifies as a `ParticipantRef.JoinedTableBound` carrying the resolved child-to-parent hop +(rather than a single-table `TableBound`); its inherited field is a `ColumnReferenceField` resolved on +the base and its own field a plain `ColumnField` on the detail table. The interface fetcher selects from +the base and emits a discriminator-gated `LEFT JOIN` to each participant's detail table, projecting the +shared fields off the base and each participant's detail-exclusive columns off its detail alias; the same +concrete type is independently queryable on its own, resolving its inherited fields through the parent +reference. The child-to-parent join must be PK=FK (the detail table's foreign-key columns to the base are +its own primary key, single-column or composite), which keeps the base-to-detail join single-valued. +Asserted by the `joined-table-interface` corpus example. + +=== Reading the generator-output column + +The "`*Fetchers` Generates" column in the tables below names which of four emission paths a variant +drives. The four are an exhaustive, disjoint partition of every field leaf, enforced by +`GeneratorCoverageTest.everyGraphitronFieldLeafHasAKnownDispatchStatus`, so a new leaf cannot be added +without declaring its path: + +* *Fetcher method* ; a real method on the generated `*Fetchers` class: a synchronous field fetcher, or + an asynchronous DataLoader fetcher paired with a `rows*()` batch method (called out as DataLoader-backed + where it matters). These are the `IMPLEMENTED_LEAVES`. +* *Inline projection* ; no per-field method ; the value is projected straight into the parent's SELECT by + `TypeClassGenerator.$fields`. These are the `PROJECTED_LEAVES`. +* *Wiring value* ; no generated method either ; the field is registered as a `DataFetcher` / `ColumnFetcher` + value through `FetcherEmitter` / `FetcherRegistrationsEmitter`. These are `IMPLEMENTED_LEAVES` leaves with + an empty dispatch arm. +* *Deferred stub* ; a throwing stub method standing in for generation that is not built yet, paired with a + build-time validator rejection. Only `CompositeColumnReferenceField` is deferred today (`STUBBED_VARIANTS`). + +=== Query Fields + +|=== +| Schema Pattern | `QueryField` Variant | `*Fetchers` Generates + +| Any argument has `@lookupKey` | `QueryLookupTableField` | Synchronous fetcher + `lookup*()` rows method (+ VALUES input-rows helper) +| `@tableMethod` | `QueryTableMethodTableField` | Fetcher method +| Field named `node` (Relay) | `QueryNodeField` | Fetcher method +| Field named `nodes` (Relay; auto-emitted, batched-by-id) | `QueryNodesField` | Async DataLoader fetcher dispatching by NodeId +| Return: `@table`+`@discriminate` interface | `QueryTableInterfaceField` | Fetcher method +| Return: multi-table interface | `QueryInterfaceField` | Fetcher method(s) ; per-participant polymorphic projection +| Return: union | `QueryUnionField` | Fetcher method(s) ; per-participant polymorphic projection +| `@service`, return `@table` type | `QueryServiceTableField` | Async DataLoader fetcher + `rows*()` method +| `@service`, return non-table type | `QueryServiceRecordField` | Fetcher method +| Return: `@table` type (default) | `QueryTableField` | Full fetcher ; condition call + orderBy build + inline DSL chain (`dsl.select(Type.$fields(...)).from(table)...`) +| Anything else | `UnclassifiedField`** | Validation error ; build fails +|=== + +The federation `_entities` field is *not* modelled as a `QueryField` permit; it is resolved by `federation-graphql-java-support` directly and dispatched through the generated `EntityFetcherDispatch` runtime helper. The corresponding entity-resolution metadata is carried in `GraphitronSchema.entitiesByType`. + +NOTE: A `@service` field's input *parameter* may itself be a generated jOOQ `TableRecord` (singular or `List<…>`), distinct from the field's return type. When the parameter's SDL input type classifies as `JooqTableRecordInputType`, the call site binds it on the *column axis* rather than instantiating a Java bean: each plain input field names a column through `@field(name:)`, and an optional `@nodeId` field decodes the record's scalar key. The parameter is materialised by a generated `create<Record>` (singular) / `create<Record>List` (list) helper on the `*Fetchers` class (the `CallSiteExtraction.JooqRecord` binding), which loads the columns through `record.fromArray(…, Tables.<T>.<col>…)` and decodes the identity through `NodeIdEncoder.decodeValues`. The binding is coordinate-agnostic: it applies identically whether the `@service` field is a root field or a `@table`-parent child field, sharing one helper. + +=== Mutation Fields + +A mutation whose `@mutation(typeName:)` writes the catalog and returns a `@table` type classifies with +`source = Mutation`, the write verb as its `operation` (`Insert` / `Update` / `Delete`), and +target shape `Table`. The write produces the affected row, then a follow-up `SELECT` re-projects it +through the catalog; that read-back is the *derived re-fetch* (a write producer yielding a `Table` shape), +not a separate asserted axis. The mutation's input object is part of the rendered closure, so the excerpt +shows the `@table`-bound input the write consumes: + +[source,graphql] +---- +type Mutation { + createFilm(in: FilmInput!): Film @mutation(typeName: INSERT) +} + +type Film @table(name: "film") { + title: String +} + +input FilmInput @table(name: "film") { + title: String +} +---- + +`Mutation.createFilm` inserts a `film` row from `FilmInput` and projects the inserted row as the `@table` +type `Film`: `source = Mutation`, `operation = Insert`, target shape `Table` (`MutationInsertTableField`), +the read-back being the derived re-fetch. Asserted by the `dml` corpus example. + +|=== +| Schema Pattern | `MutationField` Variant | `*Fetchers` Generates + +| `@mutation(typeName: INSERT)`, returning `ID` or a `@table` type | `MutationInsertTableField` | Fetcher method ; write + read-back SELECT (the derived re-fetch) +| `@mutation(typeName: UPDATE)`, returning `ID` or a `@table` type | `MutationUpdateTableField` | Fetcher method ; write + read-back SELECT (the derived re-fetch) +| `@mutation(typeName: DELETE)`, returning `ID` | `MutationDeleteTableField` | Fetcher method ; write + encoded-PK off `RETURNING` (no read-back ; the row is gone, target shape `Column`) +| `@mutation(typeName: UPSERT)`, returning `ID` or a `@table` type | `MutationUpsertTableField` | Rejected at classification ; UPSERT generation gated pending R145 +| `@mutation(typeName: INSERT\|UPDATE\|DELETE\|UPSERT)`, returning a single-record class-backed carrier (one recognized data field, optional errors-shaped field; the carrier's backing class is reflected from the producing field, not declared) | `MutationDmlRecordField` | Two-step fetcher: per-kind DML chain inside `transactionResult` with PK-only `RETURNING`, plus a follow-up data-field SELECT outside the transaction +| `@mutation(typeName: INSERT\|UPDATE)` with bulk `@table` input, returning a single-record carrier with a list-shaped `@table`-element data field | `MutationBulkDmlRecordField` | Per-row DML inside one `transactionResult`, accumulating a typed `Result<RecordN<PK>>` in input order +| `@service`, return `@table` type | `MutationServiceTableField` | Async DataLoader fetcher + `rows*()` method +| `@service`, return non-table type | `MutationServiceRecordField` | Fetcher method +| Neither `@service` nor `@mutation` | `UnclassifiedField`** | Validation error ; build fails +| Both `@service` and `@mutation` | `UnclassifiedField`** | Validation error ; build fails +|=== + +The four `Mutation*TableField` permits are guaranteed never to carry a class-backed (record-shaped) return: every DML mutation whose return type reflects to a record carrier routes through the DML-carrier permits (`MutationDmlRecordField` / `MutationBulkDmlRecordField`) via `BuildContext.scanStructuralDmlPayload`. The narrowness is enforced structurally by the routing in `FieldBuilder.classifyMutationField`, not by an Invariant the validator restates. + +=== Child Fields (on `@table` parent) + +==== Scalar / Enum return type + +|=== +| Schema Pattern | `ChildField` Variant | `*Fetchers` Generates + +| `@field(name:)` or matching column name | `ColumnField` (`compaction = Direct`) | Wiring value (`ColumnFetcher`) +| `@reference` on scalar | `ColumnReferenceField` (`compaction = Direct`) | Inline projection in `$fields` + `ColumnFetcher` wiring value +| `@reference` on scalar declared on a `TableInterfaceType` participant | `ParticipantColumnReferenceField` | Wiring value ; materialised by the enclosing `TableInterfaceField` fetcher's conditional LEFT JOIN and read back via `FetcherEmitter` (participant-side FK, not the interface-side resolver) +| `@nodeId` (single-column PK), no typeName | `ColumnField` (`compaction = NodeIdEncodeKeys`) | Wiring value (`ColumnFetcher`); the projected column is wrapped in the per-Node `encode<TypeName>` helper +| `@nodeId(typeName:)`, single-column PK target | `ColumnReferenceField` (`compaction = NodeIdEncodeKeys`) | Inline `$fields` projection against the FK-resolved target column, wrapped in `encode<TypeName>` +| `@nodeId` (composite PK), no typeName | `CompositeColumnField` | Inline `$fields` projection of `RowN<...>` of the parent's PK columns, wrapped in `encode<TypeName>` +| `@nodeId(typeName:)`, composite PK target | `CompositeColumnReferenceField` | Deferred stub ; rooted-at-parent composite NodeId reference, pending `nodeidreferencefield-join-projection-form` +|=== + +==== Object return type + +|=== +| Schema Pattern | `ChildField` Variant | `*Fetchers` Generates + +| `@externalField(reference: {className, method})` | `ComputedField` | Inlined call in `$fields()` (`<Class>.<method>(table).as("<name>")`) + `ColumnFetcher` registered by alias in `wiring()`. Method must be `public static Field<X> name(<ParentTable> table)`. +| `@tableMethod` | `TableMethodField` | Fetcher method +| `@service`, return `@table` | `ServiceTableField` | Async DataLoader fetcher + `rows*()` method +| `@service`, return non-table | `ServiceRecordField` | Fetcher method +| Return `@table`, `@splitQuery` + `@lookupKey` | `SplitLookupTableField` | Async DataLoader fetcher + `rows*()` method +| Return `@table`, `@lookupKey` (no split) | `LookupTableField` | Inline projection in `$fields` ; correlated subquery via `DSL.multiset` + VALUES/JOIN lookup keyset +| Return `@table`, `@splitQuery` | `SplitTableField` | Async DataLoader fetcher + `rows*()` method +| Return `@table` (default) | `TableField` | Inline projection in `$fields` ; correlated subquery via `DSL.multiset` (single cardinality adds `.limit(1)` + a read-side unwrap lambda) +| Return `@table`+`@discriminate` interface | `TableInterfaceField` | Fetcher method +| Return multi-table interface | `InterfaceField` | Fetcher method(s) ; per-participant polymorphic projection +| Return union | `UnionField` | Fetcher method(s) ; per-participant polymorphic projection +| Return plain object (no `@table`) | `NestingField` | Inline projection ; nested fields fold into the parent SELECT, the object itself wired as an `env.getSource()` passthrough (inherits parent table context) +| Conflicting directives | `UnclassifiedField`** | Validation error; build fails +| `@notGenerated` | `UnclassifiedField`** | Validation error; the directive is no longer supported (`INVALID_SCHEMA` rejection). Remove it; fields must be fully described by the schema. +| `@multitableReference` | `UnclassifiedField`** | Validation error; the directive is no longer supported (`INVALID_SCHEMA` rejection). Remove it; the rewrite generates multi-table interface dispatch from `@discriminate` / `@discriminator`. +|=== + +=== Child Fields (on a class-backed parent) + +The parent here is a type whose backing class is reflection-derived from its producer (a `@service` / `@tableMethod` return, or a parent-accessor chain), not declared via a directive. The `Record*` variant names below are reflection-derived classifications, kept stable from earlier naming. + +|=== +| Schema Pattern | `ChildField` Variant | `*Fetchers` Generates + +| Scalar/enum with `@field` | `PropertyField` | Wiring value ; property read off the parent record +| Return `@table`, `@lookupKey` (catalog FK from parent's jOOQ TableRecord) | `RecordLookupTableField` (`SourceKey.Reader.ColumnRead`) | Async DataLoader fetcher + `rows*()` method +| Return `@table` (default; catalog FK from parent's jOOQ TableRecord) | `RecordTableField` (`SourceKey.Reader.ColumnRead`) | Async DataLoader fetcher + `rows*()` method +| Return `@table` with `@sourceRow` (parent is `Backed` or `JavaRecordType`; no catalog FK required) | `RecordTableField` / `RecordLookupTableField` (`SourceKey.Reader.SourceRowsCall`) | Async DataLoader fetcher + `rows*()` method; the developer-supplied static lifter populates the batched VALUES rows +| Return non-table type | `RecordField` | Wiring value ; read off the parent record +| `errors:` slot on a service payload (one entry per `@error` mapping) | `ErrorsField` | Passthrough; graphql-java's default `PropertyDataFetcher` reads the list the carrier's try/catch wrapper or the service-method body produced +| `@service`, return `@table` | `ServiceTableField` | Async DataLoader fetcher + `rows*()` method +| `@service`, return non-table | `ServiceRecordField` | Fetcher method +|=== + +=== Input Fields (on `@table` input parent) + +|=== +| Schema Pattern | `InputField` Variant | Used for + +| `@field(name:)` or matching column name | `InputField.ColumnField` | Maps input argument to a table column +| `@reference` on input scalar | `InputField.ColumnReferenceField` | Maps input argument to a FK column +| `@nodeId` on input scalar, composite PK | `InputField.CompositeColumnField` | Decodes a composite-PK NodeId into the input's PK columns (carries `NodeIdDecodeKeys` extraction) +| `@nodeId(typeName:)` on input scalar, composite PK | `InputField.CompositeColumnReferenceField` | Decodes a composite-PK NodeId into FK columns referencing the typeName target +| Return plain object (no `@table`) | `InputField.NestingField` | Expands nested input fields inline against parent table +|=== + +`InputField` is a separate top-level sub-hierarchy of `GraphitronField`, alongside `RootField` and `ChildField`. It classifies fields on `TableInputType` for mutation input processing. + +**\*\* `UnclassifiedField`** is a direct permit of `GraphitronField`; it is not nested under `QueryField`, `MutationField`, or `ChildField`. It is listed in the tables above for completeness, but structurally it sits at the top level of the sealed hierarchy. `TableTargetField` is an intermediate sealed sub-interface of `ChildField` grouping all 8 SQL-generating child field variants (`TableField`, `SplitTableField`, `LookupTableField`, `SplitLookupTableField`, `TableInterfaceField`, `ServiceTableField`, `RecordTableField`, `RecordLookupTableField`). + +=== DataLoader-backed field categories + +Four categories of DataLoader-backed child field, distinguished by `@splitQuery` and `@lookupKey`: + +|=== +| Category | DataLoader | Derived tables | `@condition` / non-`@lookupKey` args | Pagination + +| *`QueryLookupTableField`* (root lookup, no `@splitQuery`) | No ; synchronous | Derived target only | Allowed ; must preserve N × M contract† | Never ; result count = M exactly +| *`LookupTableField`* (`@lookupKey`, no `@splitQuery`, table-mapped parent) | No ; correlated subquery | Derived target + correlated parent join | Allowed ; must preserve N × M contract† | Never +| *`SplitTableField`* (`@splitQuery`, no `@lookupKey`) | Yes | Derived source only | Allowed | Allowed +| *`SplitLookupTableField`* (`@splitQuery` + `@lookupKey`, result-mapped parent) | Yes | Both | Allowed ; must preserve N × M contract† | Never ; result count = N × M +|=== + +† See <<derived-tables,Derived tables>> for the contract definition. + +''' + +== Implicit Classification Rules + +Not all classification requires directives. The builder also classifies based on: + +|=== +| Schema Pattern | Classification Effect + +| Field name matches column name (on `@table` type) | `ColumnField` ; direct column mapping +| Field returns `*Connection` type (from `@asConnection` transform) | `FieldWrapper.Connection` ; pagination logic +| GraphQL enum on `@table` field | Enum-to-DB string/int mapping +|=== + +''' + +== Source Map + +All source lives under `graphitron/src/main/java/no/sikt/graphitron/rewrite/`. Each file has Javadoc documenting its variants and record components. + +=== Model (`model/`) + +|=== +| Concept | File | What to look for + +| Type hierarchy | `GraphitronType.java` | Sealed interface ; all type variants and their record components +| Field hierarchy | `GraphitronField.java` | Sealed interface ; `RootField`/`ChildField`/`InputField` sub-hierarchies +| SQL-generating marker | `SqlGeneratingField.java` | Orthogonal interface ; `returnType()`, `filters()`, `orderBy()`, `pagination()` +| Method-backed marker | `MethodBackedField.java` | Orthogonal interface ; `method()` returning `MethodRef` +| DataLoader marker | `BatchKeyField.java` | Orthogonal interface ; `sourceKey()`, `loaderRegistration()`, `rowsMethodName()` +| Table reference | `TableRef.java` | Resolved jOOQ table with PK columns +| Column reference | `ColumnRef.java` | Resolved column with Java type +| Return type | `ReturnTypeRef.java` | `TableBound` / `Result` / `Scalar` / `Polymorphic` +| Cardinality | `FieldWrapper.java` | `Single` / `List` / `Connection` +| Join path | `JoinStep.java` | `FkJoin` / `ConditionJoin` / `LiftedHop` +| WHERE filters | `WhereFilter.java` | `GeneratedConditionFilter` / `ConditionFilter` ; call-site contract +| Service methods | `MethodRef.java` | Resolved Java method with `ParamSource` variants +| DataLoader keys | `SourceKey.java`, `LoaderRegistration.java` | `SourceKey` carries the source-side dispatch axis (sealed `Wrap` — `Row` / `Record` / `TableRecord` — sealed `Reader` — `ColumnRead` / `AccessorCall` / `SourceRowsCall` / `ServiceTableRecord` / `ServiceUntypedRecord` — plus a `Cardinality` enum). `LoaderRegistration` carries DataLoader identity (`Container` — `POSITIONAL_LIST` / `MAPPED_SET` — `Dispatch` — `LOAD_ONE` / `LOAD_MANY`). +| Ordering | `OrderBySpec.java` | `Fixed` / `Argument` / `None` +| Pagination | `PaginationSpec.java` | Relay cursor arguments +| Argument extraction | `CallSiteExtraction.java` | Five direct strategies (`Direct` / `EnumValueOf` / `TextMapLookup` / `ContextArg` / `JooqConvert`) plus two sealed sub-groupers: `NestedInputField` (descends an input-object graph for `@condition` on `INPUT_FIELD_DEFINITION`) and `NodeIdDecodeKeys` (`SkipMismatchedElement` / `ThrowOnMismatch`; arity-N NodeId decode at the call site) +| Input field hierarchy | `InputField.java` | Sealed interface ; `ColumnField` / `ColumnReferenceField` / `CompositeColumnField` / `CompositeColumnReferenceField` / `NestingField` for mutation inputs +| Condition params | `CallParam.java`, `BodyParam.java` | Call-site vs body-generation views +|=== + +=== Builders (root package) + +|=== +| Component | File | Responsibility + +| Entry point | `GraphitronSchemaBuilder.java` | Sole directive-reading boundary ; assembles `GraphitronSchema` +| Type classification | `TypeBuilder.java` | Two-pass: classify types, then enrich interfaces/unions with participants +| Field classification | `FieldBuilder.java` | Classifies fields based on parent type, directives, and return type +| jOOQ lookups | `JooqCatalog.java` | Lazy wrapper around jOOQ `Catalog` ; tables, columns, FKs, indexes, PKs +| Service reflection | `ServiceCatalog.java` | Reflects `@service`/`@tableMethod` Java methods into `MethodRef` +|=== + +=== Generators (`generators/`) + +Four families, by what they emit. The Generators package holds emitter helpers (`SplitRowsMethodEmitter`, `InlineLookupTableFieldEmitter`, `LookupValuesJoinEmitter`, `JoinPathEmitter`, `MultiTablePolymorphicEmitter`, `ArgCallEmitter`, `FetcherEmitter`, `HandleMethodBody`, `SelectMethodBody`, `ValuesJoinRowBuilder`, etc.) alongside the entry-point generators below ; helpers are reached from inside a generator and don't appear in this table. + +|=== +| Family | Generators | What lands + +| Fetcher emission | `TypeFetcherGenerator`, `TypeClassGenerator`, `TypeConditionsGenerator` | `fetchers.*Fetchers` (wiring + field fetcher/rows methods); `types.*` (`$fields(sel, table, env)` projection); `conditions.*Conditions` (pure-function WHERE predicates) +| Schema emission (`schema/`) | `ObjectTypeGenerator`, `InputTypeGenerator`, `EnumTypeGenerator`, `GraphitronFacadeGenerator`, `GraphitronSchemaClassGenerator`, `FetcherRegistrationsEmitter`, `DirectiveDefinitionEmitter`, `AppliedDirectiveEmitter`, `GraphQLValueEmitter`, `InputDirectiveInputTypes` | The runtime SDL classes graphql-java consumes: per-type wiring entries, applied-directive emission, registration glue +| Error-handling emission (`schema/`) | `ConstraintViolationsClassGenerator`, `ErrorMappingsClassGenerator`, `ErrorRouterClassGenerator` | The typed-error classes service payloads project errors into; mappings constant + router that selects per-exception +| Runtime helpers (`util/`) | `ColumnFetcherClassGenerator`, `ConnectionResultClassGenerator`, `ConnectionHelperClassGenerator`, `GraphitronValuesClassGenerator`, `EntityFetcherDispatchClassGenerator`, `GraphitronContextInterfaceGenerator`, `NodeIdEncoderClassGenerator`, `OrderByResultClassGenerator`, `QueryNodeFetcherClassGenerator` | Per-app emitted runtime classes (`ColumnFetcher`, `ConnectionResult`, `ConnectionHelper`, `GraphitronValues`, `EntityFetcherDispatch`, `GraphitronContext`, `NodeIdEncoder`, `OrderByResult`, `QueryNodeFetcher`) — the runtime extension points graphql-java and the federation library plug into +|=== + +`GeneratorUtils` (root of `generators/`) holds shared building blocks reached from any family ; `ResolvedTableNames`, key-type construction, constants. `QueryConditionsGenerator` is part of fetcher emission and emits the `(env, ...) -> typed-args` adapter that fronts user-written `*Conditions` composers (see the "Wire boundaries are typed adapter / composer pairs" principle in xref:../explanation/rewrite-design-principles.adoc[Rewrite Design Principles]). + +=== Directives + +- *SDL definitions*: `graphitron/src/main/resources/no/sikt/graphitron/rewrite/schema/directives.graphqls`. `RewriteSchemaLoader` auto-injects this file into the merged schema. +- *Directive reference with examples*: see the directive reference under `docs/manual/reference/directives/` (rendered at the published manual). For the contributor-facing chapter consolidating runtime extension points and the typed-rejection narrative, see xref:runtime-extension-points.adoc[Runtime Extension Points] and xref:../explanation/typed-rejection.adoc[Typed rejection]; this Source Map is the canonical reference for what each generator emits. + +''' + +*See also:* +- xref:../explanation/rewrite-design-principles.adoc[Rewrite Design Principles] ; architectural and technical principles for the rewrite pipeline +- link:https://github.com/sikt-no/graphitron/tree/claude/graphitron-rewrite/roadmap[Rewrite Roadmap] ; remaining generator work diff --git a/docs/architecture/reference/index.adoc b/docs/architecture/reference/index.adoc new file mode 100644 index 0000000000..b83097cad3 --- /dev/null +++ b/docs/architecture/reference/index.adoc @@ -0,0 +1,12 @@ += Architecture: Reference +:description: Authoritative contributor-facing reference for the Graphitron generator. +:!toc: + +The facts, for when you know what you are looking for. + +* xref:code-generation-triggers.adoc[Code Generation Triggers] — the classification taxonomy and what each generator emits. +* xref:argument-resolution.adoc[Argument Resolution] — the unified argument-resolution lift. +* xref:runtime-extension-points.adoc[Runtime Extension Points] — the runtime seams a consumer extends. +* xref:modules.adoc[Modules] — the reactor module map. + +xref:../index.adoc[← Architecture] diff --git a/docs/architecture/reference/modules.adoc b/docs/architecture/reference/modules.adoc new file mode 100644 index 0000000000..afc72f5d58 --- /dev/null +++ b/docs/architecture/reference/modules.adoc @@ -0,0 +1,49 @@ += Modules +:description: The reactor module map for the Graphitron generator. +:!toc: + +The repository is a single Maven reactor rooted at the `graphitron-rewrite-parent` parent pom (`10-SNAPSHOT`). Eleven modules cover the generator, its inputs, its consumers, the reusable runtime surface, and the tooling that wraps both ends: + +[cols="1,3"] +|=== +| Module | Purpose + +| `graphitron-javapoet` +| Internal fork of Square JavaPoet; the emit-time API every generator builds through. + +| `graphitron` +| The generator core: schema loader, classifier, validator, and every generator. + +| `graphitron-fixtures-codegen` +| Builds the test database and runs jOOQ codegen against it. + +| `graphitron-sakila-db` +| Packages those generated jOOQ classes (Sakila-inspired catalog plus the `nodeidfixture` and `idreffixture` sub-schemas) as a jar that downstream tests depend on. + +| `graphitron-sakila-service` +| `@service` / `@externalField` / `@condition` implementations referenced from the example schemas (`FilmService`, `SampleQueryService`, ...). Compile-scope dep on `graphitron-sakila-db` for the jOOQ tables. + +| `graphitron-maven-plugin` +| Maven plugin: `generate`, `validate`, and `dev` Mojos (the dev mojo provides the watch loop). + +| `graphitron-sakila-example` +| End-to-end consumer: compiles emitted Java against a real jOOQ catalog, executes it against Postgres, and serves a runnable Quarkus + JAX-RS reference application from the same module. + +| `graphitron-lsp` +| Editor LSP server for `.graphqls` authoring. + +| `graphitron-mcp` +| MCP server embedded in the `dev` Mojo: serves an `about` prompt, a `directives` resource, and read-only catalog / schema / diagnostics / `docs.search` tools to an MCP-aware agent over loopback Streamable HTTP (R118, R385). The dependency-quarantine seam that keeps its heavy semantic-index dependencies off the plugin's own compile surface. + +| `graphitron-jakarta-rest` +| Reusable, spec-conformant GraphQL-over-HTTP serving library (vendor-neutral Jakarta REST + CDI) over a Graphitron schema: the `/graphql` resource, status-code semantics, SDL endpoint, and GraphiQL page, behind a `GraphitronApplication` SPI the consumer's adapter implements (R399). The first hand-written *runtime* artifact consumers depend on; compiles at `<release>17</release>`. + +| `roadmap-tool` +| Regenerates `roadmap/README.md` from per-item front-matter. +|=== + +`graphitron-tree-sitter-natives` sits alongside these as a plain subdirectory (not a reactor module); it packages the `tree_sitter_graphql` grammar and `libtree-sitter` runtime the LSP loads at startup. + +Per-module READMEs are deliberately not maintained; this table is the orientation surface, and lives next to the architecture pages so it stays in sync with the pipeline they describe. + +xref:index.adoc[← Reference index] diff --git a/docs/architecture/reference/runtime-extension-points.adoc b/docs/architecture/reference/runtime-extension-points.adoc new file mode 100644 index 0000000000..fd6db0ce51 --- /dev/null +++ b/docs/architecture/reference/runtime-extension-points.adoc @@ -0,0 +1,263 @@ += Runtime Extension Points + +Generated code is intentionally simple: no auth checks, no transaction +management, no tenant-aware connection routing. These concerns belong at +runtime, injected through `GraphitronContext` without touching generated +code. + +This document is the reference for the rewrite-emitted `GraphitronContext` +interface. For the minimal wiring that stands up a working endpoint, see +xref:../../manual/tutorial/index.adoc[the tutorial]; this file picks up where +that leaves off. + +''' + +== GraphitronContext + +`GraphitronContext` is the sealed per-request contract every generated DataFetcher reads from. It is _emitted_ per app under `<outputPackage>.schema` and sealed to permit only the generator's own `GraphitronContextImpl` singleton (nested inside the interface to inherit same-compilation-unit permits); apps no longer implement it directly. The extension surface moves to the points where per-request values cross the boundary: + +* *Per-request `DSLContext`*: pass it as the first parameter of `Graphitron.newExecutionInput(dsl, ...)`. Per-tenant routing is the subject of R45's tenant-column work; until that lands, single-tenant apps pass a single `DSLContext` per request. +* *Per-request `contextArgument` values*: pass each one as a typed parameter to `Graphitron.newExecutionInput(...)`. The factory's parameter list reflects the schema's declared `contextArguments` and their reflected Java types, so the consumer's request-entry code threads each value through a typed slot rather than stashing arbitrary entries on `GraphQLContext` by hand. +* *Custom validator factory*: covered by a follow-up Mojo configuration item (R192). The default reads `Validation.buildDefaultValidatorFactory().getValidator()`; this is unchanged by R190 and the single existing override point is currently unused, so no migration is required. + +[source,java] +---- +// GENERATED (illustrative shape; full method set evolves with the schema) +public sealed interface GraphitronContext { + default DSLContext getDslContext(DataFetchingEnvironment env) { ... } + default Object getContextArgument(DataFetchingEnvironment env, String name) { ... } + default Validator getValidator(DataFetchingEnvironment env) { ... } + + final class GraphitronContextImpl implements GraphitronContext { + public static final GraphitronContextImpl INSTANCE = new GraphitronContextImpl(); + private GraphitronContextImpl() {} + } +} +---- + +`getContextArgument` reads the value from `env.getGraphQlContext()` and returns it as `Object`; the cast to the expected Java type happens at the generated call site (`(String) graphitronContext(env).getContextArgument(env, "userId")`). A missing entry throws `IllegalStateException` naming the contextArgument and pointing at `Graphitron.newExecutionInput(...)`; a wrong-typed entry surfaces as `ClassCastException` at the generated cast. Both paths are only reachable when a consumer hand-rolls an `ExecutionInput.Builder` outside `Graphitron.newExecutionInput(...)`; the typed factory makes the same mistake a compile error at the call site. The framework's redact path replaces the prose message with a correlation-id reference before it reaches the consumer, so the runtime throw is server-log surface only; the typed factory's parameter list is the load-bearing diagnostic. + +=== Where the interface comes from + +The interface is *emitted per app*, not imported from a shared module. Every +code-generation run produces one `GraphitronContext.java` file under +`<outputPackage>.schema`, written by +`GraphitronContextInterfaceGenerator`. The generated interface depends only on +graphql-java's `DataFetchingEnvironment` and jOOQ's `DSLContext`; it does not +pull in any Graphitron runtime jar. The sealed declaration plus nested impl mean +the contract is global to the build (one impl per app), with all per-request +state living in the `GraphQLContext` the factory populates. + +=== Where each per-request value comes from + +Generated fetchers retrieve the singleton through a private helper emitted once per +`*Fetchers` class: + +[source,java] +---- +// GENERATED: from TypeFetcherGenerator.buildGraphitronContextHelper +private static GraphitronContext graphitronContext(DataFetchingEnvironment env) { + return env.getGraphQlContext().get(GraphitronContext.class); +} +---- + +The singleton's default methods then read the per-request values back from +`env.getGraphQlContext()`: `DSLContext.class` for the per-request `DSLContext`, +the contextArgument's string name for each typed value the factory put. The full +minimum viable wiring (building the schema, wiring `GraphQL`, calling the factory) +lives in xref:../../manual/reference/runtime-api.adoc[the Runtime API reference]. + +[#diagram-d4] +[source,mermaid] +---- +sequenceDiagram + participant Client + participant Engine as graphql-java engine + participant Fetcher as generated DataFetcher + participant Ctx as GraphitronContext<br/>(consumer impl) + participant DSL as DSLContext + participant DB as PostgreSQL + + Client->>Engine: ExecutionInput<br/>(query, populated GraphQLContext, DataLoaderRegistry) + Engine->>Fetcher: invoke (DataFetchingEnvironment env) + Fetcher->>Ctx: graphitronContext(env).getDslContext(env) + Ctx-->>Fetcher: per-request DSLContext<br/>(read from env.getGraphQlContext().get(DSLContext.class)) + Fetcher->>DSL: select(...).from(...).where(...) + DSL->>DB: SQL (driven by selection set) + DB-->>DSL: Result<Record> + DSL-->>Fetcher: rows + Fetcher->>Ctx: getContextArgument(env, "userId")<br/>(if @condition uses contextArguments) + Ctx-->>Fetcher: claim value (Java cast applied at call site) + Fetcher-->>Engine: Result<Record> / ConnectionResult + Engine-->>Client: response (graphql-java traverses records via field DataFetchers) +---- + +The diagram shows one fetcher invocation; per-request behaviour (tenant routing in `getDslContext`, session variables for RLS, JWT claims through `getContextArgument`) all happen on the request thread, scoped to the `DataFetchingEnvironment`. The generator emits the call sites; the consumer's `GraphitronContext` implementation decides what each call returns. + +=== `getDslContext`: database access + +Every generated query method calls `getDslContext(env)` to obtain the +`DSLContext` for executing SQL. The default impl reads +`env.getGraphQlContext().get(DSLContext.class)`, populated by the factory's +`defaultDsl` parameter. This is the only impl; the sealed interface closes off +ad-hoc overrides. To return a tenant-specific `DSLContext` per request, build +the right `DSLContext` at request entry and pass it to +`Graphitron.newExecutionInput(dsl, ...)` (reintroduced under R45's +tenant-column work). The same shape composes with PostgreSQL row-level +security; see <<row-level-security,Row-Level Security>> below. + +=== `getContextArgument`: passing runtime values into generated methods + +`getContextArgument` passes values from the GraphQL context into generated +condition and method calls. It is invoked when a method parameter is +classified as `ParamSource.Context`, driven by the `contextArguments` field +on the `@condition`, `@service`, and `@tableMethod` directives. + +For example, a field with +`@condition(condition: "AccessControl.visibleToUser", +contextArguments: ["userId"])` produces: + +[source,java] +---- +// GENERATED +condition = condition.and(AccessControl.visibleToUser(table, + (String) graphitronContext(env).getContextArgument(env, "userId"))); +---- + +The Java cast at the generated call site is reflected from the developer +method's parameter type, so it matches the compile-time signature the consumer +wrote against. The supplying side is the factory's typed parameter +slot: `Graphitron.newExecutionInput(dsl, userId)` with `userId: String` reflects +straight into the consumer's method, and a typo in the SDL `contextArguments:` +list surfaces as a compile error at the factory call (not a `null` at request +time). + +''' + +== Complementary Technologies + +The sections below describe standard capabilities that compose naturally with +`GraphitronContext`. They are not Graphitron-specific extension points: they +work because `getDslContext` gives you full control over the `DSLContext` and +its configuration. + +*Where each concern belongs.* Three layers, in order of preference: + +* *jOOQ `Configuration`* for cross-cutting jOOQ behaviour: type converters, + forced types, `RecordMapperProvider`, naming strategies. Configured once + per app and shared by every `DSLContext` you return from `getDslContext`. +* *The `DSLContext` you pass into `Graphitron.newExecutionInput`* for per-request + decisions: which tenant's `DSLContext` to use, which session variables to + `SET LOCAL`, which connection to acquire. Anything that varies + request-by-request gets composed at request entry and threaded through the + factory. +* *Schema directives* (`@condition`, `@tableMethod`, `@reference`) for + predicates and joins that are part of the schema's business semantics. + Anything a schema author should be able to read in the SDL belongs here, + not in a runtime hook. + +`ExecuteListener` is an advanced jOOQ-level hook (logging, metrics, query +rewriting); use it sparingly and prefer `Configuration` or a directive when +either fits. + +=== Instance `@service` holders + +Instance `@service` classes are constructed per call via `new ClassName(DSLContext)`. +The holder is created fresh per fetcher invocation; do not stash request-scoped state +on instance fields, since each call gets its own holder. For per-tenant or per-request +decisions inside the holder, ride into the holder via the `DSLContext`'s +`Configuration`: `Configuration.data(key)` carries ad-hoc per-request values written +by your `getDslContext` implementation, and `Configuration.settings()` plus registered +`Converter` / `RecordMapperProvider` carry cross-cutting jOOQ behaviour. For +SDL-visible per-request arguments, prefer a static method that takes the value via +`getContextArgument`. The single-`(DSLContext)` constructor contract is a deliberate +constraint, mirroring the legacy generator: every per-request seam already exists on +`Configuration` or in the SDL, so a wider holder ctor would duplicate plumbing +without adding capability. + +=== jOOQ Configuration + +For most applications, jOOQ's `Configuration` is the most important +extension point. `DefaultConfiguration` controls type converters, forced +types, synthetic primary keys, embedded records, naming strategies, and +more. These settings flow through every query Graphitron generates. + +[source,java] +---- +var config = new DefaultConfiguration(); +config.set(SQLDialect.POSTGRES); +config.set(dataSource); +// Type converters, forced types, RecordMapperProvider, etc. go here +config.set(new DefaultRecordMapperProvider()); +DSLContext ctx = DSL.using(config); +---- + +See the https://www.jooq.org/doc/latest/manual/sql-building/dsl-context/custom-settings/[jOOQ Configuration documentation] +for the full set of options. + +=== jOOQ ExecuteListener + +`ExecuteListener` is an advanced hook that intercepts query execution at +lifecycle points (before rendering, before execution, after execution, etc.). +Most applications do not need this: it is mainly useful for SQL logging, +metrics collection, or query rewriting. Register a listener on +`DefaultConfiguration` before creating the `DSLContext`; see the +https://www.jooq.org/doc/latest/manual/sql-execution/execute-listeners/[jOOQ ExecuteListener documentation] +for the full lifecycle and available hooks. + +=== Row-Level Security + +Graphitron's security model designates the database as the enforcement +point. Row-level security (RLS) is the recommended mechanism: policies +filter rows transparently based on session context, with no changes to +generated queries. + +Most relational databases support a form of row-level security. The example +below uses PostgreSQL. + +The connection point is `getDslContext`: set the session context before +returning the `DSLContext`, and RLS policies read those values for every +query. + +[source,sql] +---- +-- ILLUSTRATIVE: PostgreSQL RLS policy +ALTER TABLE documents ENABLE ROW LEVEL SECURITY; + +CREATE POLICY tenant_isolation ON documents + USING (tenant_id = current_setting('app.tenant_id', true)::uuid); +---- + +[source,java] +---- +// ILLUSTRATIVE: setting session context in getDslContext +@Override +public DSLContext getDslContext(DataFetchingEnvironment env) { + String tenantId = env.getGraphQlContext().get("tenantId"); + + // Hold a single connection for the request so the SET and all queries share it. + // Use set_config with isLocal=true (transaction-scoped) for connection pool safety: + // this resets automatically when the transaction ends rather than persisting on the + // connection after it returns to the pool. + Connection conn = dataSource.getConnection(); + DSLContext ctx = DSL.using(conn, SQLDialect.POSTGRES); + ctx.execute("SELECT set_config('app.tenant_id', ?, true)", tenantId); + return ctx; +} +---- + +Generated code is unaware of RLS: it issues plain `SELECT` statements, and +the database enforces the policies automatically. + +''' + +*See also:* + +* xref:../../manual/reference/runtime-api.adoc[Runtime API reference]: `buildSchema`, + the `GraphitronContext` factory, custom scalars, federation, and context arguments + from the consumer side +* xref:code-generation-triggers.adoc[Code Generation Triggers]: Schema patterns + to sealed variants, including the `@condition` / `@tableMethod` directives + that drive `getContextArgument` calls +* xref:../../security.adoc[Security Model]: Database-level security + philosophy diff --git a/docs/dependencies.adoc b/docs/dependencies.adoc new file mode 100644 index 0000000000..4c21848444 --- /dev/null +++ b/docs/dependencies.adoc @@ -0,0 +1,17 @@ += Dependencies + +Graphitron is built on two foundational dependencies. They're not incidental implementation choices; they shape the architecture and your experience working with Graphitron. + +== jOOQ + +jOOQ generates type-safe Java code from your database schema and provides a fluent API for building SQL queries. It has been actively maintained since 2009, stays close to SQL rather than hiding it, and produces readable, debuggable code. + +*jOOQ is where you work.* When you need custom logic (filtering, calculated fields, complex conditions) you write it using jOOQ's DSL. You'll work with generated table classes, write `Condition` methods, and think in jOOQ's terms. Familiarity with jOOQ is essential for extending what Graphitron generates. + +Licensing: jOOQ uses dual licensing. The open source edition covers PostgreSQL, MySQL, SQLite, and others. Commercial databases require a commercial license. We use the commercial license, which includes source rights: if jOOQ's maintainers disappeared, we could continue. + +== GraphQL-Java + +GraphQL-Java is the reference implementation of GraphQL for Java. It parses schemas, executes queries, and provides the DataFetcher and TypeResolver interfaces that Graphitron's generated code plugs into. + +*GraphQL-Java is under the hood.* You won't typically write GraphQL-Java code directly: Graphitron handles that. But understanding how it executes queries helps when reading generated code or debugging. diff --git a/docs/faq.adoc b/docs/faq.adoc new file mode 100644 index 0000000000..4a26bc8ffe --- /dev/null +++ b/docs/faq.adoc @@ -0,0 +1,58 @@ += Frequently Asked Questions +:description: Common questions about Graphitron, what it does, and how to get started. + +== What is the main purpose of Graphitron? + +The main goal of Graphitron is to automate repetitive patterns in API development, particularly creating resolvers for GraphQL APIs. It generates code based on GraphQL schemas tied to database models using GraphQL directives. + +== How does Graphitron work? + +Graphitron operates through a code generation process: + +. *Input*: + ** GraphQL schema(s) with special directives that map to your database structure. + ** jOOQ-generated classes representing your database schema. +. *Processing*: analyses the schema and the database class representation to understand the relationships between GraphQL types and database tables. +. *Output*: generates Java code that implements GraphQL resolvers handling queries and mutations, with efficient database access via jOOQ. + +Under the hood, Graphitron uses: + +* https://www.graphql-java.com/documentation/getting-started[graphql-java] for the GraphQL implementation. +* https://www.jooq.org/[jOOQ] for type-safe SQL generation and database interaction. + +This eliminates the need to write repetitive resolver code while maintaining type safety and query efficiency. For more on those choices, see xref:dependencies.adoc[Dependencies]. + +== Is Graphitron free to use? + +Yes. The tool is open source. jOOQ uses dual licensing; commercial databases require a commercial jOOQ license. See xref:dependencies.adoc[Dependencies] for details. + +== What are the key advantages of using Graphitron? + +Graphitron enhances code quality and maintainability by: + +* Automating repetitive patterns. +* Reducing code duplication. +* Minimising hand-written errors. +* Optimising for managing a large graph. + +For the design philosophy behind these choices, see xref:graphitron-principles.adoc[Graphitron Principles]. + +== Has Graphitron been used in production? + +Yes. Graphitron was initially built for the https://studieadministrasjon.sikt.no/apier/graphql/[FS GraphQL API], a core component in the Norwegian Student Information System (SIS). You can explore that API in https://api-test.fellesstudentsystem.no/docs/graphql/voyager/?flags=beta,experimental[Voyager]. + +== Where can I find documentation? + +Beyond this site: + +* https://github.com/sikt-no/graphitron/tree/claude/graphitron-rewrite[Source repository] on GitHub. +* xref:manual/how-to/index.adoc[How-to guides] for the runtime integration recipes (custom scalars, Apollo Federation, the dev loop) and xref:manual/reference/runtime-api.adoc[the Runtime API reference] for the emitted `buildSchema` / factory surface. +* xref:architecture/index.adoc[Architecture] for contributors working on the generator itself. + +== How can I contribute? + +Contributions are welcome. Open an issue or PR at https://github.com/sikt-no/graphitron/tree/claude/graphitron-rewrite[github.com/sikt-no/graphitron]. The xref:roadmap/index.adoc[Roadmap] shows what's in flight and where new work fits. + +== Where can I get support? + +Open an issue at https://github.com/sikt-no/graphitron/tree/claude/graphitron-rewrite[github.com/sikt-no/graphitron]. diff --git a/docs/graphitron-principles.adoc b/docs/graphitron-principles.adoc new file mode 100644 index 0000000000..4f33c5c1c4 --- /dev/null +++ b/docs/graphitron-principles.adoc @@ -0,0 +1,27 @@ += Graphitron Principles + +Graphitron is being built as part of modernizing Norway's national Student Information System: a system that has been running for about 30 years and that we expect to run for 30 more. That context shapes every decision here. We're not optimizing for the fastest path to production. We're optimizing for a system that will still be maintainable decades from now, probably by people who haven't been born yet. + +== The database is your ally + +Relational databases have been around for 50 years for good reasons. A well-designed database enforces integrity, controls access through row-level security, and outlives every application built on top of it. We've watched architectures come and go; databases tend to stay. + +Graphitron is designed to work _with_ the database, not around it. The generated code respects database constraints and assumes the database is a trustworthy partner in keeping data safe, not a dumb storage layer to be abstracted away. + +== Data modeling is collaborative + +The people who understand the business (student administrators, case workers, admissions officers) understand their data. They know what entities matter, how they relate, and what rules govern them. Developers know how to express that in a schema. Neither group has the complete picture. + +We've found that involving domain experts directly in schema design works well. Reading an ER diagram or a GraphQL schema takes some practice, but it's not black magic. Business people understand their data; they work with it daily. Getting them into the conversation early avoids schemas that don't quite fit, and those mismatches compound over time. + +== Separate business logic from API code + +APIs change faster than business logic. GraphQL replaced REST, which replaced SOAP. Something else will come next. The rules for how student enrollment works are relatively stable; how you expose those rules to clients is not. + +Graphitron generates the mechanical parts: data fetching, response formatting, query optimization. Business logic lives elsewhere, accessible through explicit extension points. If GraphQL falls out of favor in ten years, the generated API layer can be replaced. Your business logic shouldn't need to change. + +== Stability through simplicity + +Complex systems fail in complex ways. Simple systems fail in understandable ways. + +Generated code should be readable without special tools. Fewer runtime dependencies mean fewer things to break, update, or watch go unmaintained. Explicit mappings in schema annotations mean future maintainers can understand the relationship between API and database without reverse-engineering magic. Problems caught at build time are far cheaper than problems caught in production. diff --git a/docs/images/Creature1.svg b/docs/images/Creature1.svg new file mode 100644 index 0000000000..9198e409d4 --- /dev/null +++ b/docs/images/Creature1.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1024" height="1024" viewBox="0 0 1024 1024"> + <image id="Background" width="1024" height="1024" xlink:href="data:img/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAYAAAB/HSuDAAAgAElEQVR4nGyXWZLjOAxEwU12V11z/ueQc6XuWiyRnHhJQqJdzQiHZIkLgEwkoPDPf/92m6P3cdt680d29GZb2XT/2B92S8XWwZqYorXaLJdsyYKefX9/27Zt1mPQbJ4xh7k5ZautWorp6bwYopWt2P7Y7aiHxRg1h7kMn6+9ljXr8OfMCeE6232L3SylbL0324/DckoWOaMeY37r5xqe3e+/bN/3cz98ejweuudZzsFqa/LNz2ut2e120xmtBf1XnOKw1dfKp3DZ6QM/iXWtzWz67GvZaz1n28q87zrz6+vLcs56Vmu1GIOFJUbsgz+s9T1twd7vc07as5Rk+zH8d9xiuPbEFrDCZvYNMVjJxSw0/b/f73bsh6Uc7Dh2+YR9rON9itlSzrr3wfveus7NL3zb98NKyfZ47JZykk2cz/zgXGuXL22GNs6YbbkIP+dsSUVX+RKD+CGfjjp5UzWXZ8TsaPW0D4zIjbJt9vX1aW+/3uy77nrHXNkSk/4TTx/sBefgR7QxDw4xD361VuUf2D5qF0eJN/HAj+ZcZh975jiYgjlxds6O8y6OgSv/ufYenrFv/VyH38oD8qSMOBEjjzXXODnl57OuznjicypFcWIOPGBP+AGPwO7j+0N4ek7UdmmP/AtX7tajKiZgc+7PHh9/lKfwABvTEmvrK/dHDHy9+N+OuVeRZrGn2yJ/LC1xmOeWkV/4k2/53Ivc42y3l/jcy12+aq78jMIX3z+/vuzou/IWX53Tfg735AecTynZcRwT6yb+sA/+j5iP2Hh+uJ/O25V7fl31Uecl15hLA8lj56/2i8HS1A1sQC/RSTCFnz9Gj+I0sSFPsB3/8G3wqT9x16auwSFikm+btAEMxB/4naL2eMJp9QtuTz1Gn4mrYiatZ599xpc8Hutiij9ipL0XLXGN8GfcB2lDPGsCvh5uLza2oDMdoyQbhk08SyWfmr7m4clZu/BzDLg6J5qNuFHLwGXUoirfVG9t1GXiBS947/HvC868054TF7BU/e71h01e67ELbEop0oiBb//hx6qvHl/mY2M9mvQM/qAT+IDWjPzarWxZuGMPtcRjUfLIn5y2M+fA4P3tXddRz+PJc2xEo33vs4bWdtZ054Dby3846Nq8csTrSVhcddueckstRT/3PNdPTVm5dnF26BfnUl88r6SbdWjAVQPSma+vGu/PXt8TF7RE/Ju1nPxYcUOf2guOr3O03qL4h3aiH6xxfXAt91i1RRfxkfdJ/ci0hbymJpdin58fwru2Q3EF76PWs4d0nMr9dvYVrEfHR9/VzvxVnk5M8AueMc9tI76uk46H8xp83WfVxKVXW+MTvc6mdPZXKw/WuBIrhmpZb6dPXJvyZ/RIIxb57E/tpa8dfBlcgdf74/GEDeN2L0/93qWTA3O/v3hThcf7+9voeyce5IdrPPXq8+NT9rewxBrsU5q2V3EMTSDX/xYPxTxc8T17dHRsamV9jB6X/4MjWXmMDdLQyQXWksdeK9A49W026qZsbX3W+KwzRv+8nf095/FzrjOf/9ynBbfRI8z+t4+YcR58Pbm0YKreeWqk1yb1efL30oUVD+65er+3vhuadH0/wWdTvT8Ul3Xd3sYzcQs7F01pE9tjcst7aa6eA65TZfbN7ruvOb+D5rfBD32Y3wU2NQ8t1zcBPfvUCtcB8KSueN7qPbVu8tp9EzaTb+2lPDnH1lx2Pnmf6noFBs5thmJBXUpDk8A+0P/P3lW1MYxc53xxLF69KzpEv/uqDQz80zcPOcH3zryOnBv8cnxOLQFf5Zf3q4OLqx5d3JnnEbdFX/17F/3QGfrmzcLiz+/f9j8AAAD//2xZW3LcNhAEH6vVpnSafOU8OUkObbsSLgmk+jEzoBK7ZEne5RIY9PR0N7ff//zjr7l4LMYiMHCw8+aLiQc/3ZsYrxPMBjxaDkSNzbEIfivBhZvb7LG5+5WkBON+uuhlZNab2R+thOLSZDwDwDKtIp65OHGoaV5wUAZhkJYM7Mp1j15DWGL9Prg3EvzBmlCwLgJ/mK7Xby/eD+/B9oPIZKgrCEhw3ueDBPyOIfXmoe2PjyQqfMfnYHiFkCzCGGnu6x4JD379n2Cexfd8rqo9BsvGyzubrsIV/MW7VbORpIr94rVuMkAtEjtuzH3fs+bcHwQnmt+g5XqSxFo2ew4K/4PzPE2q+J2EtcggYHEUmdt22xfP0+dCQXn1m6AH2VBY04SciYVhQfoEeXm4fH19kbTwgbgGJmfdRXifIN0uQ/t8fmTNZaSvDLVWC8QgvNFGrdP7X31usTaRgwdfn83b4rNciD+ZjpPYEekdOSSwB2F7uQ3mh4WHBs7CtYq8FQThmhDiXDPJq0xzhE/sW+7fgxv4WjUQKUp9xh0GhQNHAl6hXw2wBrzA/JqAI0RgSPOWsGCYEKbfuAjDTqw5zAlin4ORpUUvjOyXh8XhwXqLU/BO8tscmiGkut6F73VxaFG9pb0JpwyNjn/YV8wau8XsYBMLZ3hxTAalRy071wE+07AQrlDj4NN5uMV37evbuicOuBvPhfXB50kw6azQS6g1ze15ctCJx892UPhvCmot0uY/wYEZRIyqnW5ZpmBYcJ1T0HK8y/xg792COUyfhN+Dtb/INb3CMnBY62kA4h7EYwY9rWpucbYbzykil+qRORCQ8b64yeAK7FXDdiM/RqgXNWAf+7zAkd3ngd8lsPbkwI29sNx6NI7qzflwUQCHqFssToilTZxV+G4pZHi2FqYwGCcN5lLhvMXSxWC1zpRcMCRUKV5YDwv7tUJSvO/58SzOjqM2b4VWwB7Ot2osXG/inDDcmA8QoA6z0YPxvX2rh8yBwrMwOzxjz4Zm7eJR6HX25CxsEbiTyb4Sc8DbHIomVoPjEiOr8TfSRKD/Fv8M7kHfvi3Wo+cYerB/1uof7Cvm1c10xwOamoUICDlzed/6eQ594/LVPapzfziAt/nvI/fbrLXEsTLCqwP76CV8Ftc6JFAZivNzFWBfDjOidix9Fxa2CMfWmBkVbOm65vVhts87V4/uDvKadWNzuCH8Xbez+h54nu5Tnje0UlPwMs+wZt14ubd5vyl4TxxMPBf/R73nGfbfOE+hbpzpcFCD+cWwYRX2Yb5jpnTXg5rD+i64nGbFBiTmycxVeshyGH9bashZSzFcYe9VKBTvv6zt2oS/1SaG5hZ9xsBQGhda8JPG/NDnIhDs/bauWWuKK3vyQnBuYGWPMHzooRD7yX38oNGiOCrDtypE+tvzT2sMLCwOqTbPmLfD81YzwDgSDz9SSwf/Rn9GeMBAvtdDkfBNv37+Iq4Uyj/rQdwtPI7Q7eK6pMlO30+6IWZcGGv0HDQgH7I9Hu3Hzx/JNdBkeJ2YxucafcP1CsMv7qqHsTGtZ+yPZv29iod2hy6v1ys9YuitObTBNWNCfZjetpSGiQccO/2hOLjlQ1lptAgA0MuYa2PU+oDnI/xjPqSrr9C8z2f5u5gHoYviDNVHOKfpgTd1Q3k1zF+u1yE68Ca+WNvn65PXBqeSX5OXpWHTrE8MnjySD7PVY7PP0TpRz3vCQa9EfQZ/AQya7+IMLwXVwC/OCfUL80/MMxS3r+69/QsAAP//ZFoJbuMwDKQs2wHa/v+nzTaJLS3ImaHkJEBR5HJkicccvAgAKmBweVBkGxUu3aBvgAeV/oyH5QHoP9iZUFEYZiJvOlQEnge8B7Efim5Y5GEuFu1N8QCgP6iaVAOEJ5ilKGB00ePQn1LtIGgI4BjJqzc9j1F3I5YynCORqbmZqOj6taQchoo7OY9jPUuIAe5woGCMe6gElQBH7RLAPz/f9nu/x3WjqdoocGMfNKHQch/6NKFgLD74zkjwNhVjNUwJCe0N5Cgho4GwsPlnQWzh0CVj6paFCGeI5qUmDUeAoGwCuv65f3c4g7GOivdN584Jj4VKYiF+U/FS3AWZ7jY1sjP3xd4IycmphBBsHIBLYKDb5o5cpXi17ls8f7wwkRKTCgdAU4odpaDhxPprAl9/P5zvdUsB56AgEeeSjoIlmNQjmhv3fKHyDBV7/xBqng8CyKmAFia5QDUa7Zkgx7+u9cTn1i2bmhpyZb54o/r79xcxHbHV0SDSsSuVMXSdAtDv+NkCPB6TEygHebG6IR7k7hfGXijsBEEiLSh0JfZY+6iYgbD3YoxRQGj9MqliBA4qfkYBRsBD+xNxQaFqiJ8DpIg4xPM6ahWEwCWLeggEzxebI8SfSrKj5mVlNDeBFQkNAh+zct0omnr9/P29J0nX+ce1KYwKqCs3ocT3izMqEKh71B6gVgAAhxPMmmKm2AFoNRJczwsR28ujX/MvYqhgLaillTHBBn+8WPvQ4D3/VorFCVC4F2PNqlVwrVfmIpxCvO734YKJlbGfTtjOJrDDPVkGuE/C31NDjZj3KTUJyyCaa4LSQcYgnO4bJsHUsI2CLc5HoPfgtBXIvwhOOJ4TyPFrx7QI1x/CsoCwQWwsfJaCD/tLpYgpkQPi8kZiUZMQHpz2ilrj9ey2R/75l72fBeHqyGEQdeZC1paS7zVOe0XfDcEApKvR4Yy6UQBW/HdfBMD47SXXI3DpcRHxSVAGkF9TYJTJoNoyk/kA4XWID/4b+w1xHd9hXPh1fY9lVGhDlf/z/kf/2QHcNVWh3mmGfPY4DtxkEkOXIUCFYLh8TF0FdpnA9CyIeu8KIYSuo0QT1VvVYvX6TsIt92jXFA5jYFv3S/5lvDNt5Uw1uqCopyMhCgEt1tGT/EvwEIm4TM2oNi/XKYxwjDcSvRCMCwW9CUhPAivucWBMfzhJWcroRRL89CecBoF95Mnc/1RPg4gpD3tPYVCPdwGgJE4pnPp6RXzOj6wBwl9rzf0OgYXTKon3+lib/w9CSVLsZsSp+zk/p0/ivuowCwbBJGFbak6S4fo1jSJfkN+LalGIZDTehGeM079z3+8z5m9X7F7XMa2WZgEnRmVwyExRXb9tt6gLwLa37JniBef5iX8bJycgiLUhPttYm8fJ4/GXTq9qlEy/bRuTp+IcvWPKtk593qK2riA9BZ9dKKZgCrhnLZIT7nVXEwnIxTPjTTnW+Hrr87kuuTf34Ah79kPgB3A3nS16K3JIBoqmqiWY9Gl6pVNI6BQ3JNLh/EEo3cD4/vmJvDopmKJXHUnofV0xxfx8pUG30bT03nmynmiKbxaesUesg+uagi6mfWvEoOe31lXrlqIOsO6R4o32KngpsbE4ZuK0N4PX40Lx+fX1BSPR45j/HXtiUBzm1+n8wSs1a6/wT0x9UcjWWiO3mTcQ52CkSBCBWYhpUAk/acKwhvr3gRNhUInzYLoRYpz4e5xhGLKOwzfbHZ94PLkQ6pOvS7H/AAAA//9cW4tu2zAMlJzYK7r1/z+1bWxJA8m7I50Cw7AhdRJaJu/FmwAg4CKCOfzCvAiLV38sEr1jmMcbXj5Y2bD40Pz+/Eo15GtDyWdTZ0TiVKyf7mElFdVNYJEOEEgDZ7XgDiJep4iTxzRXqi6Mwnj85Ix4da/XHpeU1wTkHIxs9Fd5/RAojDjXdCVKZEPDpkRv6YotCpoZzXJSA+KWpLnhoU5VbS8g0FVAOGgBMqlw4noEVCUmHlGnTYroPSJeHDE7kCMiYlZbghEKMFSnvVlaM9siDhaO/5k17A2HHiAYwo2rglbDwZWPEKDkthTV2mtZ3EW6OgtDqRPBvAkAhydGhkgp1TC+ljElj7rZwEFdc8ilI/UaV5y//RBoHFhdmRhwFHCcwO+ImrqQtUPNXmq+9mMpAg6sEOM2CSdy/YuCP0DEWPfmzvVvxKyuC+D60nDkINMayyRA3DSguFZin+WA68r3kMqK5+JRwBevy8/q39tIZAFejNL6fYIjswCuuJrjUfkt0gfzum6x+g7XhwA3SNbhd3sDEGAsfvOEyFR/4HevIIX1j9WUh1ZoeH8aSDHPLIUnkqrn/pSzShesuoZ0LxYGhvVBXyFY4XAbQPPYalshVkLkiHTLqUHOvkLAE8QmAJCAEUAeyftTsb2nlHX20XrPImK2BH7oRtgZsobJKKDXwM48HOKJ6B4BxUfpdXqvtul6OyOaAJL7sevZil9KNz4acZOIfJ1Xrp0UIkfSRuL6x+Pc8exG9HV4T3WgDUez43mKTnp3+BlJnnDVG5IdHUmIrTi9Ptd8vaWrZ3rPZezQnuFzeO91kuiiLN11/L2WQMeTQLZGvFuCB86YWt8FUMsYJc9AA2HsIGUEyTyXT4hQJEOR6Ioe/4GUU5zlgRTQQm84BL7jXj7UHxZi7C4IvV4uHjDS6OTQn70mch1n4EBCYkLsTXId3zkB/ipilYshDoDjnp5XWf/JQIsIvOMSiDaIA4Q7SeJgWAArOCJQRZwjWbVzSJPEn6u3tRUS7ADrm4NDqzPFevUwgENPDCKVxFUovr96VYnQ+2xcOVv5nrW/pRDA5AdWCnAfKZB//fuCaArRb6Tb1MuamoN3rWLefW2SAPYb9t8x06liGpHfjW7/RCKHa2/CIjRj3FWN2cDfcWxDwdRqSiEZBKqSpva2dtIxd0OomCJoTp69t2WagEk3ptI4o7niwHNxF7y7hJ5VkiANJMt+PxzcTfPOidNM0mtXsDmgXv/MWdoQEx8wEKJhduHqVrBrigCZQpslzZP34kTirSMJRHIEjDVXzh4SCuBO/7Oijr82Z4pAwtd0rNB0rEcwMSgRdmJ1GImlVmZTJh+6PgOvzwSUVeKAYeL//8p1MYoajwfn2kdJNw2tyhELRHL31PPMlTgKuxQv2i012CGQNz1jQdT27GETkb/etEZg/zBXPYSHXTXjPb6fqfyxWfF6pZNttW8yCcf9nIC/LUQO/bwjOfjeX4iDmeQg6Vavagt1XDI7Vkt33UVdmIS8NzW13IH1KCZbTT7/fqbAwXTXmzmxZjnLPdcnvn++wRnvK+A1tZ149tB9llmDtHhdFagGA2emPz8g6VaPSMgjXQMH3mpsHJjnmWfBZ4OS3hQgI+ZvvSXW9IYLeT/fttbykfFmfZ6oe5zJ/Pd7f/F5zVVCCASEVWEsBJewenutDVc/Hu0/AAAA//9knFlyG0kMRKsXdtO+zXzNeeYmc2uJ7KUcAPKhQNk/YsgKsllLFpBLLf/89+//NF9uRdoeRQG6vTFmoUQj0bLRtIm1zWc2SFPCLikBF9bWKRIux3Wmc8AYc6z/dbPuzz0nDAvKT3DF7lt/R7aWw2/kOBb2mQoe2WYfwcBgBwoXwntYmduw7U9yHACY9SeM0vF+lUYxGLTqWrjvaLqtqLTNS6HA5DyfmyzMKM+DLLD3enlWNBQjmrAKRrCzFB0Umm7/2LaiDKyprqBukteiKOLw7h0i4fQ7AE7UUS00t41aQZ75sZ6fh8WNIoTnCUwfVqphQVzUEEWDdKiJHbbmlplxt4X5nG05/k0LniKI2EqqpmsAWuSzg3EOh8rqbNjDGDdbs1KlDqy69rRLEFJuG7RxljJp/7eoieOw+vr6ygiDjY3fl7HtHnHosIxSHWNtNZEfMW+272wMbR9QnHAoYssGnDlUDWCeUqRQU2GTsTexp6xx+/5+/eWyaWo2/SDbg7kFzNclssa8DzZ4VxDvsEWtYnqrYr0Uq3xP7Nb+mYdK0NW0h5p1psrir7W2nxoPK9AN9HcpIOmSsLiMkw6yXE4D6CMP3T+Avf+wh64FRHl+ip3IEo4sn31fVEUKnKtFvp87S2iKd0WMzCEx6yB5OtB/J0HmuKGiIBrHYt+cw+lgWHGKIXZ1WyQFLD+NF/9qI1DjIhAzsORuk1czPgr3wHTHw35nU8uh0m/iBEO1x7oM4VkLllBf5my4T50ltoZXHaa/fj2FRw93G2GF5X3e5/ExLpv2vjcXikNEcRhj/E57fWDw+3hlc0vTV50cFBAc7uylWYUE3x2rNqoKRfelQhFMjfs7Impje8gcAOA034H1D37ZeDc5kaaixoQte81CrxYrefBft+IlIyJCg23rbluXTxWyDxea/b271BRHwjJYm4/rPMczlUhPzMVD9UpP0jtI9zcflfuQ/RYK95yvbX9aQRtEwSDa/XM0L5WAhwzwQtzGZXtG01DcFFZIHbqfpbeeGVlX/n7/jnpj233fRdMb2BcE952W3eM4E+8rZlCU3opCEOnBWRXnb9wF08p9FPZdzDYKQRjN/yE8uRObg8AZUxbuqM0VS5+D6473kcI/GvvhfphlIUVlAhceiopASlOYHiKEiUxMUrOd8Lpvv2+Bmsqex8+qbY98ttYICvYhsm5THCDs199yIyxZgCM2pJGwkLzUXvY4B04b4Uh1uQx1bdzTwvds7RPrKwGeuWQ5C1mwQXpyf0pzBw7PBlGw6POqOvvAUVfuPrDf250UF3e36JndlqvmeS41EjVeT6V6YAXPsLriOqVgA2kONrgjUgQVEb1VzkXIj4ohiAs2T4gYXWKKx+04T4WLqLt+/orsBt9m2awRfXi9qzZLIacKYnOsm0P7ZapOO5vP48pzK+6WmtIl4GcFuXLf80dGtsDByy3T7zyzqJ/j/BkqcQouBZ8RDrl/gfkJgS2ItGUmOiE7uRpFJ11+kDE8FzWQrdFlCcs6Y8Ue2BWlqGfGVCIdECPEFAxDcYLiEPaxVmcyCSMd5w1zvKYf4teSkZ720XRCPtrYc9dWvTfg1vnjteEcpD4xTcaR+gXxD5whLmNz9NLz2/eGREGM4axoHkdYhCVBQtT4MzWO9Vld0UAEsHTrqTbgZzhFdBYXt6dl+W1tW+9qNQjj6ISuRC3uHPG7Fnwe1G8WEZo7DtjDiXP8sUhLd8Vy54FwOciZqJHTkSR3g/WU4RoMEZU1jasj4vfRc0dfHtGYIEzDjXO33v4AAAD//2ScW3LbMAxFSYpKnO30p+vpTrrrpo0eHQL3ALDjmUynbiNbFB/AxbnYfvz6+fu6c0CoEICKjIJXgBx+yWtpWGP3gSFxIkk4hNKdL10aduGSPAwLhJX8U2HjRYIPUUCjCRZTquA+wagq1caA0ThqZFW4onEcKKDqDyVer0pp/UklaQUoz+oXv0NychZ/2VDySdLtVexLk/crNmd+PMjZYqzy31qq9hJqQs0WnuWBam6oVAJpbsOf+D9JSlupOOGV8oBcIoImIQvZlGVVgECM3fvlk3oh6mDao6DMiA94aP137lCUWTALUXQkUGOvZmkgRaYoRqE/m6WEl1VjvRINNoMpPNoCJm14gYrdjvOslbfw+/OW+LE2MpBzKcLbPmN8/X52WU/8OXdRFkkE7N98hFahkyrHvKCZzJQVwdAsHXBrc2t6zlalVsBoSOsSswwLmvrcnI91/Ourl/cIBMKff2djQjZwhClDZZfAoeeY+NP3hmwNjFWVmjVGW2Cxh4iI+bRJxhjpXtemT6Wc4B1hiHlxV98ZBcC+6aD7jkd6xXiPgOQs6OClXhaP948gmyBx8FiNkYngQ54z+hn0Bg460suGmq3KptELD9/bqqrPIeQiaHt6hus7LjQtBEglplQQSUTTkzsjmA57h9YGz5vPrT1UYh8Y7elZ1oZa3Vm46K9CUEYiYs3VDL9vYZG5irjqkUl6jenXEPej9WLINpTHcIsQQcchocbmtiovc4JB32GlinEtc8yDZAVmVGEKMrxeK9HC9kUC4L0c/gmp82c95Ic37Hv1z1Ffglk82hkEzngGh5B/1ueodIY1iR0RwJC41wD11Pkxyvpi7yAh7jrboqoagfAVPsQQu+U7trmkCoStc4nTiNgEjZssJuwBJCJmIdJ+iCDehWPyXS0+OMq1ZlJO/P08XMhgXcf1VXUh0WauE0xZRV+B0hqTuSd+3EWzQTzwvZ3Q+ls8kmck5dxHbWhoPu8rK3YIgE2NwrBQ0aDT59cV8UH0J3rpo1ArSCRbEGl+fs0WvRj29BiTACTuvIVV0dc7zdVmjOVqivup5H48WROxAQjDl1Dsftg9rkVMFTYHiUAk62vf/KMGuVjfwuIi5P+MXgxbkFig6ZAj69kcsq206vkdmSC1ktD2l+qgXy8FYEfps1BEcgJd5WLepb1hRp+npir9XZB3qB2KSXvYW5TEiqC9S9MzE3X2t7DDsF/X3ib1nvis60orhsVmfYTAhCg1ZIdxIcG/M/a99nL+EcdC2pi9LXafpiTL162vVzXXVG+Suxf7roRKxIxafb7r3C/n+5SA7Zj4FPWZ1pdFaG3yezulkT0e7Lvps2nklkXDJqrhLO/1KIJVarKHLXc8jTV7RVJ1l+bsHnswxLBXct/jelRvEQxvFUdnWHaGiImmnlGPeL8VMfa6Iao8XrdCkWLqXoRhs7Wq/xVrsisBZN5t6teQdpYROHs0FBRWjg9+i5zrDtLPYrBFHljfrbTEMRctLhqZT9JrwMT6r+Np7Dlz3t8QuFvEeY8iehNHIkwb/dVB3c94HswBp/Gy5wXnK2I9/3+JlRRA1z15XrTWjhfeHh8rF1llOi9MLwGZIrdb7kTa2ZnjFvMQ7sKSLaJe+1/SMSmQs9YRRYwqMZuGjxvxrRVviqU91pPmF2KdUrOk49VUnP3Z4qDe238AAAD//2Sd6W7bQAyEV4fl/Mn7v2mKRvaqIDkfSbkBihS5LGt3eQxnRv8BAImAvl+3Zol/TFR50z5xw731iImAa+ufMpT5cErF3OdSYecaZm0WmljQKHfB3oI2bP+36dmtANVGRytxylmZze/UUzlU01wOGbOl064oGSDr0CQc9fEJ3r0pGQr0bOCpqUGgxi/Rll65CdcGUlBcn3KhJZlHIzm84URPcmmzd6p/N5vAmTReA8OXszWke6LYNZndksnBZscYKICDp1yfozHzjfg8fI0S0d1UmGkP8H0HBlzjc/g69YYTiUJcX+lvFpwuNZ3DLT5c9klqWyLaQ0hkGRAW7ZNG+90KRG+dmTKMmCQccqU9dQ+mT76DBeCO3NLIeLNiyXRfgjUgVA1joJeKH7vtkhIAACAASURBVPtsv2+NnDXfVkyNllB3C2w61NbErioMqniYMmK6rxGfT+l+f+XFQJCfotYeLQggH7B7Ae266/5IftBDA/XsRV8ZkVC8gJbuQkTZiyDpcb9XP4OneyKMvH8jz2l9fBYAzy+M5aJAtdex/eTNm7m+KvFw7YvO+75VY3FzpR/lG5JTIhLdh95rOIJdUzMkKWsrpDDZs30HJZzi1DVs20h6L4VjB1psgkF8sL9DjMNcNY0sl2iIkr4qrwWAC0xJjWnCJMCefLCuxQTqhk9LMm0O9wo4JVFYm8My67jeNMNVdF6iE5cR05beKqu0eA81hqEpDtAJbV/o0x4pnyD+dQd6piZ7AhWPvC6fjDOBOB5iB2kvN78EZx+IoQFITFEcTx14ZfztCTkmlNX8xvt43YpAawhh36DxtvtghcBfFWKZTyKMxdMFLIeYGda7Gn+MZ4nf94ZI5x65iPb1l7xy7JrCsfjMZmlBArCU+eTVdLGxTiM1tr8tPwIAXFet9XYroGr9U5Iz522foOW8kl4+bpR4ryuU27PgVzOVRfW7TBnTOG0B4F+rwYM+rfy2iw1lDIs+BAAYSiagCiW7T6eYGQ4I+9lZk4ru51A62fRaaUZuAKIdBHMQnsPaKbVq3Eea+I0EJ1eBguSRieRHoACu2RT/l8BYo+0S3/EQmjJqZfrERAj/AfsZ+x0zq53zzjC4GhsQU0+o4lfTqQOoM2k21oK/3qwmtZvolVQt4uZ8lwluxcZqpGqgseQ03velBg3RIP0mCJDXNsqNe2uTQPbZ1WQA5Z5dX+O874qDMBuZykUce6ne2ROMJnsBzLszuWqLKTDPpU66xzDCqHfeGtBcSAVGSdY4Q6FZHuP7+1vxqIY/nlPEkIvauJreTcDJLho2dfOUySDSx3W5y/aW9ExAblmAgjValnMYlLkGWfnGJ7RHsDc5g8SC0Jg3Y8vryvjb88xongAjJ9G1tp8eCDzpymPyLubmprVsJrpTpnw2QGJvBl2+gMhu6scasBevZhQNG2OXEa0zFs6QVzoD2qVDezKfbk+peNyNRMOAL+ja1LF+n2ABqyeiDoaBg2P8z88fz4UAsfZztj6zPV1rNFNDA7D9vahHest073g+tY5b25tl6N3B1kX6dwB+9k6YMq4JJjBMeCnXei85Lnk4PfNpYskk8tr5cFkkOc0ZpwKhry5laV/b0Lu7BJShbrwXuy8MINiH5OweH5Am2HUFE0P0fuI4kncnBhTQxz0H8IaRSK3sTzFII3Nqu7hGu+c+5ddZIsf2/AhLyfO9s/IDnIi/H+sTwxatteJB1ESxp4KhK1aQmLGeixXz/MkZtt7zPf6xdWbbccMwDJUse5L2/7817diW3SMSl6KT9rVtFo0WEATAHwRAgCt1sK7kf7YPpM20x57SsVmIt/mPfz26D7AX9oOow0PX04CdHoqmUL+47O7EUqbQGBaLBbAPXcUgjxzyGToJNlbv7AGSNqWxL9nH7NRugL9NXrQHAbLMwpaO9/CyANjZrFwq+z4LMNhRfkYfTfTlvhbz50zf1C25+MtCJ9LlH/L/S6D/CEaSi+4RNie1SWYt1zR2D+lIeDPPPS7cqr3gXkJff7rDpJrX6Ex2seM1OsFW9Gi0B1+DB9nAsQqHTanUTYDqkhXAJzPMCQi3/Gh+scycBr5/1Wd5hj+9lZ3RKOPxeL2eUu2ULo8vCdBFAW0hWOcZB79VZ6j5muwDiswmoA4AczC+or0NgBz7WGzqpfyIHxJ9nSNUBINE2NT5t+KbdFjsMymQqYoGZFxe00ib7OMcDDsSsTymCZlaXWa2A38Iilnkvx6X+NmfLCwqnBjZQjCKpkkw0SPbRYo++1XEn3kO7XvXuLC4SygKGl1PBXax5nd0yJFwliiU8x3SUoow3lAD75Uz4/60tk5g3nXX2FkiA0BkntkTdKcZIXlXtygdU0ZIhoGpJ2Rf8vCrPTptQWSWJboR7NmXgmCQ1WZlzZ38mU5CLfFYEmwE+QeLDHngwHySGEXJ7wZIixeneKDjcU0dMMYvlQDhWCpaeLFDCUMQq42V+pwgVRklV0wL6UHiTv/1EsFCBFKaJE53EEnIdDxQIGUlAECHvVSTWoy15yxxP1FU+rSQI86nr+0r/H0OaKfsMv8+FEaA/Rh7RPq4Oo+3CptDHXMHnTNo0YDifgg8PoNkm0gJA6uyuuXudEkEgBUNKX2bvyMACuKMd4lpEFtSzuDRNuVf7wIkImeyTHrdIsAJ0O/vS9O+vTX+tgeItykO3JuJPLyUN4L6xKT/THUR0J5KCpEkCh10sPcOex4ZDIAUOtff98EtVUpNd9mH7ggInUKxLILaMnzUvLCxrvuRMiOmbQJlCV2brzEG7+NT+2VOmFjSqLxjP8JWN5P01ygYGcOLKnAUTrz3jVFf7/3hkV20zkGy6N56xb11zz2gbjyjfSnsMwkQEtWLKUK+r7n3KbYpILDBUDSP7CDP83ClExbBKPq1JZqCptmneT//7887mhq72cxWO2tH5Hj0PvGNvWUqorqUdwvBZzpncWZFHI21/61i5FPd0kU/Y1E3ME/cAd9c8qpjjyhJ1XYxbpo3q1/INERY1SDAaaj1jqcddeQkjhre7XVNd0PCBnWm2/c0hWCcl2EJsWKlT888ViSzq+z7g/jg3+CnZ722j1fIxyHN6FDaO3NMxdg4e1+yWoIXUIwtKQOppOwH7mFIUc7x+P6DGMuYJeO8ICiSOtTx/B7nyUjev+8gga6LXBoUxPcj0JNOf1ZpjAKP8GJImCYCx89XCYzAGcOGQCPAE++v+FwfjRqR7aiGeXcGAZrtcoTGTSVxj8wVbE23yMp1Y1JMjclKp4JswTUU0FXTBKjPIK0hU2lGoETOuQFXGqftNoxZF3ZN25n/535gIGqCHEx8h3K2xVqzHzN+NpyvtX4fZDbM/BnbG+TDGI+LImXUmT6SNI9L9r2icZH6ffz9cNw099pQQjj57GMRRwMEgs6xmd99blewd3ZYSEd2lKYfoKiwpnCp5Y/sEjSXeIPNpnbs5R8AAAD//1xdW3LcNhAcgI/dlXyWfOVAOUou7WhJkYSrHwNQUZXLkryyQCwwz+6e6a9//v6XPGV31qp50pxvnHCSOuCfnb9jR7q4Qw/jmUlcLcl3PjvHtoXEuubHkrJqWKUgKV0s5OxQOzo3lUnIwziTX1oEx4DhuFyQyO5osegOZqtGHeMnsgpTrRpM5WAEK5dERFi9O5UIPh0cNydYKWZDow7nuU40ehxfZpV4GENUihJWUQw/wYgwJTfuMF2iM4A2gP8Dwc1kgTHuH3/X5k5bUXd2VjBCREUoucDf9EmlqcPmiyRuivYWz0doDkR4Jo3Fem9vrhuzlSmfU6SNIMh7I9xdHBKJRAWNbrVY0umRhc3Ch1KYxZz+rBJmlzGsDTAR2pYFkxDnysqziyHRWQfdT1ENwk4yuSwp0pXGW3DpvRt7zAEm+iL5uFh3FVeH6rFXoRPB47IizoqlxhoBnosO/0njc/EPReE43ukwTFuXFMb6+Vi7YbssiFgzWHEypHFcA2paGHy22AFhnzTWi3zPLIhUjfrj+5cwIdMQLmorHD3pa1YmPW6cy9TYSI5SqpHuKfy3PPlN6Q2ggo5gV/w1zJAui4wLK7HfmyBHs94DjWoUP1ZFfAOhmgLRdHYIbrMT2zt3nfOfStipDVAsMOQEm+dV5+69fbmzmUGAEvT72Ku48dWaRcrk3KJ3VdbH0gWwcPdcd3choZk7XnWmwSmzsAv1GzztQXclDDud+HMUNKw+V1ORczD39y5QQ0RMIp2I6Gk6k813DnYDezK7gJS0i0micKkQ/u0xQ3gycuXbGDmXYomye2G+2k4kyukCC+55Ncyf0wqmiN///fY6jDCwMF0if4TI2GmfSmqaWGi1w0qzA3leXR/DbRvZIne2WXjd3kMTojRTnmRHmFQUc9OYtEn0M0o1AidiRULjMJc0KxbhJq67WOUaRcucGLHMgjL/gsCQuXp3KPo9mEmBz8GfbqY8jKInOsyXE5teFLtPiynF6IUBLczz3kzxaEX7DcFA+AQWJuB3FtsNrwG/e+eYo81cbCDRNp6745K/yGSRa5xlX4LqxAuffbawZZDDa6HPOC0+JsoF9osjJNtp4aifz5xf8zyQAnOyqK8xtx8K/srk+fbNCePEzxk4XeFxp4JMSuwtOkoE3wd3H/sDiKVmj+98hlxH2ouzwf48473tFhzU+VDMUmKFUJv9MwNaTBUhei9+zLTO4n12ftd1wEvvKKn0ZVTtZkIYtlc5Yi6n/TR3Z40cMdSZHTaMEmNBEsHpzNfiORm8r7PFises90xAUtdCYx2VODfYkOICYAxByss+MnWbmpXRoe687W9TQ4rHdAq9dy+AVgeYsJXSarp++H/cq6/tK57rs6Ob6jQmCZSuQxNWND/lP7twotGHFRzUo4tp5hoTZYrfyy5VaY5JRvxCe9cRKEr2mWyH4oZILr6nK0SMkZvJVe/j0P5HvXvYnz7Wl8eGInZZ+Tm0cgRJbk6MlPQjbuBUm5qdds3BJzfaDY9EkVYXkfC9r/dmDyTE5JVaVaRJtlgBM0ZMeB1G0Z56P7xPeF/476eKzLlPk3WMXp8v+ivqcFkEscylI5IyqUlkxEhihsZV83jsTHySQom1MEYMJZPV8Ta2W/5LxSx02tlJ5X0I7g33LgtYLKQ+GJfg7gLt2nxfTu7v6kJgUqysi4D9ss853OWfZp0BrJ8aJi7WZUyI+8niiwux+XHckGBdK6HIzqGYjrjn8bQgJW1tYQF/mbKAb8G8psL4x8enUIaJljyTwnyD/1eda+YLS6JSFWuT984iduGecCKNJz/hrkD/q970OgbS77ujEFtVYTPR2NSUQTyTRUY3MBjzON+qLpJTgQp+3mjl69SI33UxFQP7aaRfUq+FZhh6P9gjrOP1kXHC4numiT44w6L2HPRPl+3Sukrzp6TAa4rW2m/CV1JzaVKBFf4npzqEEV5ABz9ea+flw87Av0aPH0csy/yxRrw+n3xN3k2cZX59fcv+3X6O2hEFs/NbPOn3EnWt4gQRiszhPPWDI7eh5SY+f8Y72GscCzbEqQWFht+hGMZ7gdexWIdcgTQ064BQ5Hrha3Gx2PiDP2bRSbb6TtG/f5AmSFRkje39Vq6N52bzvUVpEX8AAAD//2ydWXIbMQxEuYykqvg6+ct5co/cOrE1GqYI9AOgSvTpih17FpIAXnfP7z9//DqV7+2L3HxDCs//YLPREbG2xops1jqFoOMIRneFe3VutjV3n26jmfEonq8Jraq+BBxNurRpbp5x02HlYYs3HRRwIBZ+sjX31zZ2AtIZ0/3uWBN4aHS6hHV5Hq4Xa+eZ0Wp1utOkHYmNRwckOoLWKTXH5yM6uo2up/A+TGbchHWFRpiM3YoHPvUweOf9CCdQprb7+0KTa5QBLrqXcNtX5AC/pPm5oamyzu8zitlZtN7QGqDwYFKGKY40UgOpBaPuRc/jE8FLhlmgSPl8WYd43u0FwfjM4uhu0qRr021hONbVPT3D4wHDOBxMfdIJSeGba++eEWtIs8yDwHpAEx3LyxgvRpq9pb42spJ1EHCDy2do/HjW+J2s4Sa0cmAMyB/fyZvOAnhf62c0s2YaAmGQJE3aWR3F5XFwqmDivWQqT4rFWcy+zDkX+qWkV9B8ocvqlM2ICYhNr27uzA1ytu/djqyhk1xNgpwY+qP/d4TxTJeRlB1AXhmlEpOQlYhVvVcvYmtCtnMZATAUwzOFp19lWheyGsXzLenadgHDhBldJAUgi+skvzuM/x4imJIC6tpsLzkSI8tB6/fb3mvp9e+ZnsL1GEozsanb7e4HvdbD8OYsEX6uj6dbvqSBPKMo9Q3UkdLQor6IVNXkkASVnr4Al8w3h4xbo7ut+zZm3rvWauTXKBPtfD8xCbJpPf4t/X1CDcXR1SSdegfdDyY7+/tgtVYSK3dRVtbE+Y1ZYk6dQ0/f0pDs0qEZTNkQ2ogOOmIqEqZMxVE7SZnEXWvKC5rrKEoUY+c4/9c/RAp7376C+3DbpdFF7tGEO/rk4or3kwmR0xotnptj9jKxSq+PXRjuf4iunPtyExWRRQFT55diconQlffKeCf28AuZoUdMbwSaeqShOHEl/FemWPv+1hi3fRrbh/Omxl/TgTsotd4UrZloMfu8yYgkf7g0CEAalmvhuyeK02Ut4vj4/WggzRI92DQkiOs63k1pPR0nMf+mqEY8H3Bm5t6jGz9LqgVT9xWTn2xm0KygqKNpAo7tEawzDGKZeEWhNEcWr7q++2dBqFiDt7/7urRSRC/FqPJMxtqt393Was48Z5pHxs8ZeR9xnaexW6km1iCGRFnMt1j/2ZsDJ5cGnDNX/Rxy36chBNJNU4BvtfXu8ytdtLW/U0T6wGUFDVY9r5CtNZlukcrD51OY9xPJ0VACwG48l8hopneG26upcGg9tAbBgkC6adiVSRbIBA/5gozSOOccw3vAcz1iUDYkN8zMdKi7Jb2xUS5P9wJiv8czgiz6izGOaKBVKMDWWtAkVsAFWZaShthTiKgshuCz+Hqh3UYCgxxhDz3qeswgkIIa4sw9xFpMW/lEMklJU+CZGyJvaCQesXbmmmLl/yIJBXPrET4ru4i9iikdpn68JzeZRNazPc8+dRZE5aWm9sfHNx+27T2/z0gEgDqiSddDQsdk2aWe2H+4h8mM/Pxcp474O5rOhV3kgV1XySPXRRzuikYJEk/bD3cTV3toNHyFrz8ed9WEuY/yHvt9FplrZ7xTevtHEOlO5mKGTMQnZ91XSOqcbnP5AIT2vm52zSXZch80JzbeZOblWXBPhJTwQQLu+hhjXK63Sb9Ci59Rp3g8QTBYLbOpUJ15IXX8LLIbui5X3tcCSpgzAffXa5EkwvH2sUHmnO0vAAAA//9snVtu20AMRechOW7d1fSr++lGuuwijqViyHtIyqiBoj+JHUujGfLyPubP37/+xFRfRRZFkl9gDsmk8Z/lA+4fHxHD5MiMR2ilBtE3GfJV66vr0NwwBsMRtdIR5ygFxQwUzp20W5rDaFEuzYvFgkARfzra90716NqUK/OAAwtDK8uk3nYZQDlFcE3GDAnSAqIR8CJ+TYdH6L+HTHO4EdA+GrmzC739cTfk9tRE3jwIhFid3XOkvxRZgkM/RSUOxk20nBMXydV0ynDLPR16NOluiiQtazHL6YON0u/lej/7/vsebI9ZCh89AXYAzBL79v37t4tb9FAePtpczLRouoYYAlAFgyvcKCzO0ONjjMFnBQ1eaCdSDncWf4mqnqaPN8VGQYU2GqSKCGhUXI9D7t5EgqHfPYTwA+iMN55hUDv1dy663DPimbyZpxHGTXUUOltc3zOLUIr8GXKVGbFJeSCMUgz9j4pfpDylkFtN6xR1iYaoFu6tJB3QIKFBtS1QjBp7huTSC8PHNxlFtan5wuDxJWr5AmDQM6ej6wxQyMwbZ43Hyr+fiB8o+jYtUrFjTY9MxqpZSkjKCq04HGY1HRxyo1336FNxZrZ+ZXzIPrXW+bp+UDpbFK7ZiIyRLvgRJ6RJq/lFhL6fYhX9rqjE5m3ymc3hMjmdIzTzFGRNOjffI1p4daTJZ7ojD03p1/vuAiJvF/ChBwBle6ac+C8u48WsMHTfNFOArqNffo7vMGRyY02OJCot8qX3i1HdpvQAHjPiACm4jcUxUsZisa+SaWzFLwRN3KHGCJouexeyh000Y2OF2fcd4SmAPw5u1NZU4RheZCmXmFc1Ja4/TX1yL9cltlO9Zwu/CskC9H1YD74/nQnw6V6xLrn23jAfYfIEBRAwYDcK9F+PBHy9lHGcnh0UtVBfWzFhhcra1FBRJFuzrmn0BmX2hd7yJpOjpKKu87LFhOsrdPqN+M3WZWy6hwGisQuUEkBBQsTYEBhg2tQFiEhf2oth53kg20qfIa8zoIoesRd1FdZMkzkPotE8++UZYOiAzBH2DEZ7Ecup9YaBZO/8L28haNz3e9Q/u5KaHBi+Ahe8HFx5piRAZwtnPnsvz7nLZlIGQ9a4T+luon7PaIwcjB2hFW/Hkbp8xW1OSS3wgWHfxZ3fzsTnM9bh+3S+nl9ujtwuQCUN8Cj1As+SsxNGDJp83cxLZFj4OYgKO2UsynWxqLS7MwCQoSIZwg+Ff4tB0SV3qEADez3nvHm3tB4Tdui6Ni0UAylkhps73tOUPosEkIvJdzrCAHMP4JMEIavb+pCB7RZO/1CrWedly5bM4SUwM5MIuDepqU5TYAYDJtmCui7gu+m5sz3zDWyjaeNzfd++RlHySlC5x/0bPaV5IWmaM5/deJ68rno8HnEGeT13hH9WazWq1e+1DdaerwC6pyR79BEAwtbsRtvcrvVry+Z/3b/HypZv3abApwxPAACa3PfHmOVcck+A1s5LfQbocEkZWXW0asvW6a2mGtUEZuprSm4Ra4i+D+d6PSMM7WBUHQJ1F2MZ0LuuCfZTal7MHR3g1nvIH6VVQAJQR4xi6i3qIUAbagQAN9ioQc0/zjBuRnJlg6kXwNNiJyhFTbUS9aRH0srAUzHSXv99GbNk1UyLGYJJqbNJYM9owKbn667ftdqU8wUpd+wHSOH87DLmlhjhRiLQECqm/GL/rF7X+kT1FOyVdZDHI2TGrQLQ+Zk5t/YPAAD//1SdS5LbMAxESUqeZHKYbHKgXCWHTmXKskimSPQD4M2UN2PLFkUCjf4cP3//+mOTxMNzp7OD6qzvzYMdhPFwhiYpdDNQCUP/XDSRPX265dpQLQo2YtAPn1qkz+LQBoktSTsEimNF660vfbqL8nojDGw4KIiyAY3Z13EH7axLzwgyboZCgQJyTVOU1zwlptk2qmpzinDWd9RKtnF31MjQtVsHmMU8Yf7U9LAPxbtY9Iw1BcSWgeQOgQQgnFVacvItc/PgiO0w2g4MgYect6fo9VM6L9C4LhOR3GTSADPFOURzvp5Pb0DIlUZHlzfxWkNmsgvQ9pB8PkxJ0N7pFHGNc0t5mZ+fP4zNMezBC1f0xxuSb5MApg5o5ENykKfVUWgUX+9Ml3j97SMaXDwlinTXM+vsVCTn4mhoHbWajKaOMwyFMDxq9e1ZyIcO2sLb5QlnmuiWMEmkiJM5HdNOaP6GRt/vruRCOvntLHbkdJbHejbMiG76BvP17+9eR+tQygcwJpadaaYo2Ohbiz6rS89dckKGmv9NuxJDpWnDW2DTQ00Lm+qp6B1MXsgIrmIGNJlyNZleTrF0uOe1hYst+wymQ1u3jyZTRQfgAKwIj9p6hTGUxb4U39DxcaAxNLMeu6dr+nu70UvkxmPy5AU0U0Zp4Ynhg50DqwKK9frM75puf2iCymG/9pmXwEKMJ/3waJHD7QeanHjfJqrTjNvQ3ufCDKMbkygEgIHHypEYMeypAIt4gOTYp0niiZrEmczO/HI0qWevWetxyzWS/t6L7TSVmaKTl5mmlipAp3wMsoM7jalPPU6MEaPIxMRxpnVdBAJez8tjLnuKWSIC1IxWv8ycTCZAFBKB/GPaF5NLii6fngn4pdiDYux7YZl+VhPb9sZMqcEUqTUmkWfSyhKR2xUTOWSYyYT8fr0cbIRNUgXkWoqEGqU0HT6Ow4v6LhM7vDPIQ77EvMrZyNuQbpk+fTwEZoYhK79/znleOd2sJ2qTLANxcC8BYLheA1Stt722zt5M2Fi7mCwviOGRNOWwx6gwLFJMRnWqa4zlM3xtMojAA6OIrWIAUXPDsAwOu+dTnfFs9TDn6wJ/F4MRTa8bc6E134VygM8s+io2iMlmNMDx9VTNyGwBFc9nirx7j8nKcwZLAwlTz72PqPjnXvDdDMhLrJcR00Myxs1EFh8CO0fQXFcZ61Krse+bw//TWTw+obsvTxqBAYQUDL+nmbTTC0ymWd7PyRoopVg8DCj3T5kMdouaL/w4mqRHY5ILPhycoAHrsL9SelaX5MuYTZYWxb5KzcVkFJYiezUsQTeJE8UeBiwO8i+d2ZtdpPMk69mpl81QcPj94PcFAO3dPLCcbedATtQAq8bbfk2K7Fx1soHyRc3/8Hu29lxqAJ7ffe/lsA/QlhlCiwHDPr+ufb3/ZnV6L1MdrIkqLM4c1jHgDb5j00GimPgaIBGxkFUMXHw8MkCfXwc7svmZR73BYJN0AJ6ZOBenx7lmuQgA5YVxtuqN9dtynzYrWbHx9yuSakqJqExnPREbmZIFjAED069408+6MMbh7Q08uv71/35NZXpjvU22SahQDr6x94YPifh+tvbtO27mZrWejCSoXUeq17MGHW8I3V39QfKw79tOnbG+ze5925K83bsJWKBZ32fiOreJcd4eI/iiRCLV+v/NZlAa26pZFrMxzgR7zpxxQL+s6zM5wZKCmY+T1VlKeRi9/AcAAP//ZJ3bctwwDEMl2d4mmeb/fzWNbx2ROJCc9KWZPGy7vkgUCB78GgHAEuJOTCWyYjX4pX/JXbbWVQwA5jwuqYeDXp1qd1FWfJs4Atz4KpvScwOo5g8UUx7ZrJtdBqXkHHtY+lWYAHEhPojNoGixAshBt9AbiGaNboHuQmmZOjV5MBgqC/C+6KRIDYSEib0zFy5Io00FR84mX9Dk67gGzd/hZWI+G1DMnT/sYVfMYN2yF2/ExqmDOHeaYB+s09jDLdjHWKxqKI6tDZAJi8JlAagpBmhR9+LpCiBeieKsd3B5DlJBzyIm7XK5aVUdJmLuUYXGRwCdMnIIRXMuyikMABa5Y+q4qX+pGk/CE88WBy068ChxVV3tXS9yEbEVRftLcUZEmQSU7DgNiySSpT9T5MVDEC3qXMWhaN99H1bBZLiGkFPdDblAYQhweB5+0VkEqwBXdqroJWdEAQEBC7ydH8pZxzmx6+fRUV5/zBAWF0qnYqUoUtmsit4t7GFvf94kBsCB+LZ6HJ+7MscoHAAAIABJREFUwgTAcr7pYSwGc31F5N86XZfbhzDcNmn9PqyC95/TiqaFW/Cq1Tary7bpjAIbUXJsXMMyV72RLrKM4jzatjFfTlHQN0VoxqxXqkjsLmq6JmVyRc2dsEU03QOhp43ucAhXEhMypaXYCslYBikFywQyRQ131B3dMDgndQK6lnso+suYUR7ukNuHSzo8Kf5U50kDwPLhVl0/Nv8UPcezPmBi+bsurrz3Yk7HoVVpLuNgmnN22Oo2zSanxfCwq6E8BOt0ABQJJohRdCvXKRIuO+vF93SMBoz1v2jUoelgbrH0xlYr6yQdFDphJhGPDkC5i90Q9wQpaq1aeIh1UE4Q9s5+j+meIWQdApMC0eMQuCrC6JKFtTXsxMBlTxe7WdQ2F+i8M7hcdq2D8WwcEhjOAfW8dK9ScMt3eVlJn6hKcGkq0Fd/R7rW3yGujSixqkPDPdni48BUx7VFDOzrwSIeQtLxNT8qEQbHIPPsmQk+RgmIVr2miL9fYlId4DL2R3fiJIQcYtu8pni0UeDXUGCB16WLIx1WrOc3ud3qTAZNW4LtthE5dfmaFL+v6cZ8ra8fxPNnzHDOMn9MLr8JKlmIBxNVX7O1FkD6PnJf/p3XLkHMPBIBJEtNFdwcfQYaaDD/DoenR02hPc0QZbkz2cN5H+MZ0jpVgLK14SrjD9Cz+X3JSNs14IuMBUSnOMYrEcibBZIqknxpRVCt4aKqAnBxX5uicy+JKkDgsMYTRWlquEZs7MYCdqt3hwSMwZBYDEcOkVGjqbnCjc4q4F2acuEOk9OQA/+2kVBy5uFhgkNiQZ7n0ftBCr5DPzOMaNwzeBcH8GbgsQL5psD2z4f1qGcEBMRpgXBdVVv9PLhm/Tg5vaQY9wP9IUBaf79mqj11CBwn1lQcaSF2aq0Ltsd+PkYUlokAn3VHApCTG3Z7X24WWGu4S10TTqMOpB09HJXTiEb/+10R6bg6GCWcivapxiiGzjZGKnFv37cFxJeo99cExPNzNjUHMy3rdAc64giPXaNDZ0AUv5WS0w+m/J8Z9d2VpFY1Xl29FsiR1z9TzyypaJxxkvWw+vmleULN2zTenCNaxc/n3FEv9bme1Gl05KB+JWGtr/dq0vV6+fPzr7v0wezQuHTyqVJ4QrRN6v/YJ+D/JHMhhdvcl6gHGB9JERJ3CyIB358ajXeBNJv+OVlHK2mF8TYcIJ0tIU5BsDpIu1FjpH+HXlud51H+k3WuS63DMBCOk7SHc3n/RwXaJvYZS/tJSuEPDAOTpLFlaXe1+tECUOWboLhmICEWAxdTNpwHoeMisa7FpTvdf9uHPJMQbnxpVwCAYBcLWMnTKP1lHPIVsUfWWa/tfSge5JHPErBPSfKiD+5NFhG9+7CYLeVvp3ooaJX4rXntLLQqU8RZd1efx1ysZrgT+jFPgrYCZNhVxdosyFbPVEj0GHG3RrHL4YdrLLKUmqzsYlitj3dj7usoi3bLAMIYPrlW2pxv5oiu24UJXCRhql8fJVB5spiAz/z9LOY3jVczQOWVrsE8H4cmCJcfvHKZPlIW5DPZmV/6UmLtSSjreC9zkbnX6ho7EXxcVmHomOFsG3Vu9sdDyaIHKQ7YgZGG2IS1rZEIA/7Q7+wBMdlF5LR95N5D4lXfH2ZZsGO5bmFPk9nppR8cFJ8AxlonqYuDRuwzhbUVR+Wg3YS+jiLNN/MWFY5mrhLqjx6HEt9mzGBcDG73sb9XTExc9YICIQDCPnRYFYYtglgL1Bh0nB56K1TpodvvJXZIvSMJFW6oXeZkJEie4PR4b/UAc/YFtq7FnhgaAWMF+JKqCRhXmE/3S9nj87arlvnU9NOvKtblUZQOrxqHFs62Alw4BCli7R3X/vKi0On6Hru3gU8A3J1y1j+CXVhpIyqzwquEbikjC1GAMX4zDmCZgGUx3k1iyP8AnMJiOLPzDDm3jcNUPyJqglMAEOy+OfEXP5AYLVfv460PeYwsbJbiIO4S6B7JF8ojGLpF1qHGJMvfJs7PmOJxCY9x1nW1YDDCFK+X2y1NCp2BuMZyPkfiLy0WET9xSl5aJBuj9hS+jQWd68QB9O9klErBy1lBj2eLcW2pukgAfgsJa2tZcEzwzpm8FnEOJm7GVFMH/fsbpELEDykLKSJX7b9TDKiBVVIJIsttiqssbIvJMuSLdaLYARnw1Htgv+a6yDMSUqWuHf1hJMyA+OyhU0o3pO6APb0wvpvY9YxP7Gr/goliJB5S5EiGj9MY9ZAHs880vef1eL35u1yl3BOAQcFnpqJijkiipwkg78WApnsW3NZPKhNQSIYmpSGxtqqjUGYiLc972iLPu+xNA67+2Lsy748y4WEJleURuRdMIflTBW0ABKshNAALTveAAlYwKpagIDE1nJjFGttnTke8mjJ/zrajzIO3WKpnJ645u9yKx8QaxRI+EdX8tqGqON01fubSxn7fP2JNRffgGJF/3d6ItVRXFIUa/iWLm7qhHolWguIB0Mv9rKW/e1fbHK0u/Gwk3Ja9y66ae1hRHOP2YKW7qwEWyZ4dVH7F6Dz8KqrmkYKVfUcOCUg9rxO+Xvdf8fy4qrvJp+9NyBme9RCDjiKWuEchNcKrpmvG/x4tJ13jZ6dJnSuQR0wqou2ZiR3kp3k2ZT5wk3p1PsNUjLnKYg82vMubAGJliYkNmmv/fOV+fgMthzwjan3Ry5hX+3uNuqOFs57/3sogU0zlQIemQjEpZ4zSmqZn/9IasVxIgGsX8My+5bM4nkcw+WeZHgEQ5/lskpbE7JrfXMHELvDdC3KYd1fSKD8uPirHy1v/6tr6+vwMZSXnRYI4qJXlK6U6Ld+p5yO0e6Gw57mpM8i1HUT18wjPOfNYkfpzmmQyhcyv7U9d4/3cbzNe2PNJgWHrbV2X/wAAAP//ZJ1tk9MwDIQdJ/SY+/9/lqOxGVv7rJTyocxA4WgTRy+r1e5/AMDUHrkROCnIj5F7Bi5iZIPDXvAWkJCPOhOp8OI9LcRAkQoK2GqA+7hZXUFxjBQtO89nw05gjubsr/arhif/e6pSfIdBIxfq/VmsHQWtbmqYei++uEpS+Npuaug7lXU3i8EBJQqg3tLbEestwlcUfqLDa2eGYhA0G7/H3qGlX+VmJwUzQ2JhUCi5kvzC0eBHqxPdjQL7fFNCQjQETFMIdkbxRoorejqgv3VLl+CUZzh7i1jEQL373urQ2mtZ+6GasjsQ6Jelsrz3nmW5Fg9SigbRULACcCPYRjPVr2xGlPi4fhsBfcX9wNYFxkWD1jxy14zEgh7FfkjlVrHF5Qq9HkAAtJizdcmOr8lpAd9TzuE0TRZl1ihogoKcBQEAUxWt+ZzCBNp5WaX++FDQxzWiY9s0AaCG6YiI2lWbFYNbV3r91/+/l2Lm0ORmyJYItJrXaoHDOu9ln9M2s1E61NjeVexOBXaTCBUFRqXQ8/w0TYSgvlPMn1K0Z2qiGG0ble3nLMS+AgAAiSspUhhHPIgp6ChaJ1Me6eXRVLI4TT+cUGpnTol7SdC2KC0CXpUxsZhHW7DwV9LXYREdRaH4OT0p8Zbfs0vYDsgK3pcze6alRaSnXGq8F3q+ha4odF20Tn+nej753l/yY48G7i1KXXpi//56Wbck7GLZXxZ6LwDqNo09i/9mcPP5bFSw8Sy7tTRVFG9DO96nnBTs84zlFisB5+m8M1UMdL0/il86hQuCR+eHKFdTAg/r1xQ2bTQpiWFmLDpO00W5j614UZOrNi1cxW0t6Lv2pQGLuoDeaUGvFF/j2av/NuLV7UaW55tDT8zj2Tml+TI0OX6bOXDbpqqytY4zawefnZKzUeeG+m3AU03EW2JYAFrkYEBSCunGXqYAr0vxA5DjE0RynO2518ln9muEmj7ig031UAAUAsbFrqzxIAvEI0RgxZgIAOxHgsAxJb3EwIA5xpkkf6zz4Wnl6+X7QoGM/SzMIrML5HneW/f1oeFDE2MKIPa9EoNqVlBO4rtjZH5kck3uetzvR/0Xa6lh1/fH78+qcSMhP6bSzhE6x02CqVFbpVWt7SD/5HR1N69X6hkxLbysg5QrcgyvEL+DZbg1CmD3KcecV56xAy0X0YznkeA8zRfgwVuTX6jbm9Uo1pfXDSR+y1meWk2qsdv10BHXpOoisEY7xXpdfzTKnn+9N9w/4sf6uV+yBL69EppDir1u9b5dAw350H+vabGsM1mzZHf/Ryt1fPYHa0mCwGj9VEbJAiAREG/FHpjvUtlgbp5HKMMDrlAPwdwLmnYwU9fP3rv47He5Dp0W1Z3FxQmAJM7HbRCbZz0b8v6oT2suCA2xFCncmkGlB9rfFTepUrPvnXXFB1Yl6vpd5nPFiCvcgj6gzaj1xFzZjB6da4AyYviQOPVb+Ztn0WLd5NUx9jBtsWi5Fz9a3TCDVfW26//WLd7H+9RsoeHFtTt8Tzj7FejmdYqNcyNorTiFjSg9E0DDfi51TQH4GI6uPL2cHXZ9vCf9yUYg/iLOyVDIn0nXP6b06esPK5X4w3r6c00sgdV1PRc4zDXZejuwQvdKXPTfmzUoUMPfr7X2DwAA//9sncGS2zAMQyXZSU7b///Wbmx3JOKBtKd7aQ87WUeSKRIEgf8CALt8GUMI6ddFy6WDQGAIikwIuyzatNTXSaysDH3lJmz6MqZwIo4mNB7a1EJWSp3pmZwxjPCC5u1S+oXWUF+YKdoAsveWyvBZ5iVQ0BylKFwUL5gMJXDHwjcjW82iHcMLyoU2rbT4vFA+30yX9KLonBNc46KPxCMUOEeovKqjPR42D12UaQv0SXm/9166us2iUQAJBjuqcFeTrdf5dWK30DwrZZ4u2A9bcMXz1eomPIubi4NlNaVD1+T/CWUa25SY5Y3nZXb98B7Hx7+XzkGAC6cKq5gDT3GMj9AwGBLr+7ZhtC5sCl/uGkTnQerB3xRDgkUR82hZMKYKrJTdFeRiDkrsFK03n8dL6yRLSd4KPmVuvAYsd7IG6xsX2kJ02d8usaLPOwfNUKVurP+p738vYFsBfEynLpcPiOily5ekC6QcMT+6dcyLtWfHQs9xFg/6s8ygMRcMBbH37LAAdE209aX3+4awSnuELuMp7YPQpIgZ22AzpMJs9VMFpV/AoIIsYl3D3vmZUHa/R0cRaYt3wEn5vpeOV/ydlzp3rYCMjPY0REGvLNiCDnaZldDMgth0Nv56lMTz0h4ReN0KKMDJehHi8kKRYRtLqeFjL4jnLCMyqJujKLuNvLBJWmG/GCRY8RONmHtywQz3tr+8p/xA94z3Um4mEkKqScw6Q3LxICE/y2zkE/SgKOtVOElJelfnEicJF/dKdmI9EuDyno2i2VAU6v33y9/u6AE4nuc7CShELKbT2+gyFQ7TWcYmGOGoXZPzSFXwU5TbdZf//bUY5aZijvsdkVUo5IeYLvYt1nqNUuDDiguq+yHALGe1z9L9pPiaz8B43NKZ+MXStee+iCUzVAAD4nRYAVbfb/Jlz6KNjm0dWaMjtmnEjmeCfUZx4piGGNr38Ix8L02LGocSjO+ey68A5tC7Pv3LX+X9TJAv7h5rxjxZKgVwXh78Gs/s2tPVDVaHqgpAkoB+Xp9bY+MJOM3zEbPpHzN+AA8ZMaQgipHHNxMsyfzBY17gwC6dn8UMubnnMAqZYpXeG+sAZKetFVX/WsBFrM87gVyMcRYzBOi2SYy5Nmrcab6SKYCInhs1c09/sVx9GRS87ECzJmT0bBqTEbUejRoaMIycYKU9c9WVU/fL7/9zXGAWGFProylGj4fVV1gd7u4M4jMegFuTCO73PqYikPF6sMAAAFpLjYhaOFn08hHfhnK2r0D2yq5cuaI+d56F+e+izCPaJ/CETizuESFgHXn5ZHuGftJlYUoASc5QgIBZmG4j8z/nBtIm4P8AKNuA7l7AIdxGBCIRJ2ACPH8Acg9ZQ2PtGusVgM2c20YT6qD7rJziDgLQIFHcf3TnOatmOqgJOpX/cfZKFmVfGmjD9svl/nK+WUC3AlwAzEzL6GBiMwZ9uTt+qENNvsOz1ThDBx7mWeThcfZ32VXPZuACx8u4I/F05q9vOdUQOz0+tTyCTq9Hve/vsSF/cG2Ym/7z58cxJppTUSNUXboYB0ldJWq9CWJhFxkAO+E61i9qpeVH7mZH6pMkUDtHcKmnqYOVoYewosXvk/0zfxddlMi94wzMvZ/rTK4d7+E88wHCTTcu9M1W3nsc7R8AAAD//1xdS5bcNgzkR1LP88a5SXY5T47iW9vdksg81AfUZDGb8bg/FAkChUJV//vff35Byba1LG68EFAu1t7wJQ6kQfQaPMSDBysKR6CdKjQOXSimr0KJP+hjeKiVM7qn6E+9PzbkUlDlooz0n6+TvooyCxW9vusBXdmN6Y+5+eJD9ZihTDXFuTZKCtmVmewFbuQJGk7XIWgS/pkWOMJhu+Qk0NLfEv78hYX3tr8oQIHA2+DvycS3ipZUhMQuutZty7exvj88tHHh0s8x0H0cbASdGz6SKFYrkXn8P9QZN76DD7s3Ed51kKVguzgH47Df2yUWEXP+mKUGSih0C8+550H0oedM9UhhRhRbzayFBlVVAEYSQPIYQYh9UL2YRTao25Mk6SbUHJZ10nzA4arTU24IRp8/H3wPMBsqu8cGh3zAnsEBF9TQJXLdCRxk8U+EBK+FDlrMbEUChkJ/oiMIFXIVddn4kgEODi885d/L1166BV30pU2z3Qh+OD8Vrx976tjoD0xAdEjxnPoR7/dvrgvoQDf2BsRcJjUVNou+TKLEkWjEDzQsxPJAoQMq8hvvWYR4oiCEuMgBkjNpsFPzxBOfwXQ8FCDBfrjoUW/0tmr8pavLh/OeFOqanvjTTg5KXDchnVNUrrAxs5N/s+e+3kC2/lnEZuIqwUq+zp0gn62JYjaRe2d1FIfmz91dyALOyVI8/4ugwjStt65A7g6oE1XTIp+Xogtu24Lhc9WRXQJeGsuBhB7p7CpEJ+0D1XyxceIixBrx3I8cHZpS+b/Z3SgWMVvUs90CVdqDU4VIWPIc6OIzeacfeQeYucvbPhI4zgCeQL9vxP2BeIRiU4JUu9Suy2SR57GA5w/GQsaVZ6hrv3zOt8DBqvj9YO80J7BiHamTa2DKVFQ//1gbgDPxzGOm8seXRPsK/u0y80JMmD3urUEWEgAN0zNbgepuvNamWAqwtXlGmX9zaUbylmYNErDK7xG7c0udiYozEz7g7oT5rOGZDl72RfF/7+6WUpggzvyuWFW0PkMWbuw6n8lEifdCh+zYH0njKXrrd7FEx3Mnb35eoeVyS6RuqUmTVmv1flM8C1TN7wTd3E17gkaxdj9//oW7BXoa163Ya/CD+gMDFP01n0+dHCYwV7o4aOQEXSl2XA2GxfkKmjvddTjCGDHxhrhDwb5t1Y2AxWTrCi4GC7ZH4fWkPkPE1kridUqH55Yg30wHBbKpLNDWUzTtniyqgyrseXAENcgDcG/EnoMlsHKseKsPbKAueoujqOBeZMHBsUwURpP3BgEUW8Ay9loIK36PM6f40Ztn0+lh7i429lmvuVYT5yS8zkeua9/5PHyuYe34GLlMq9KxmgLOvxYT5zm7rwJpliyEsmrV/nx2/76NGOFvG/IqFoTWq9r1Xk3sNt0P6i5DV6K3tb7Vc/s181zkOfNe7A0JkhngXU0RxmV4zL8OR1vqQvUmtmfNmLRJTyfW7s/7d/nav3A3G/BHF+9c+zFm9h17Tp15jHWgKPjAR/2SHg4/181RjFq0z6YAadL/n/olpsP/3wbuOdZ1ifEbbk5910iFAO+Io025SBljeZ8rh0VsE8gbv3vt9ENv0u7oAgBv3UcGlQw0f4l9AFG415HCu6/UbRgq6CvznjqlAaQ8OVi3Wtf4vgGktWn3I+WWqnGKWG+nHEpmMfurMQ9g2MSeAGjemXNFHWQwo2strXLf22P0d64GKMGlcKJgc2cqVwu6/DUIUmEPyj8ePEqJWR/o9l5Y36pcwFpJxXodZWYcifgT32mzuLlHzJpYJJGXXPTwLxB23PH6t+LeJdeI+RAFrrZcF4iEsd/e8+5JwUXsZTUQPmc2Xc0fjxx0e+2IbZvcj/gM6OPvMzlsb6exmljRH6K8t3QFGxJXrd9EArPoRkylbolZhB7B45XIvJcx3TbMGl9SzAGwLm0Jjxa4AWLwmHnVskRFGQOmA5JQevRb5wfAPJ8j6xTbmzIn4phMxLT429BjQSbLXCxY3/FeJ0GhqOcoiB7CglsZUc/VXv4DAAD//3SdaXIUMQyFbXfPJBWuw0+uwz24dAjpzZSt90lqlqkCqhKSnulFlvW25ev3bz8emnbSqFr01YtHNNzKmQwKmNjlYr6yMPbuC+RoPN7evngRuWRgxYSQwgLVySmKjljGlqqUiDeCNlQUG1FFb1qFHDpCUmLTx+aWP/UfE/0m19Wu2I1WAxHFIIqGxhyUD1+P0JDj5ggl1fZEXS78l1PxmNQx2VtkpLgop3YWK2nIYSXk6KXnc50b82j8wyXVp7S+4Q0k8OX1xYu8LV6HI/OvmrZimjQRzjnQaOl33RkGf75qaiSdLpY0w7ADQJMiLq26wzrTN9sctHSO202LW2toobmmeDKEwYZQdNGITS+4OEOhKmt7LghqQifaInNMJouBEtmkfaZCiJ4IKkwjzr20nwy5WsRppSSB0k9vbizJYfFIrblZS+Y3hpjt0glfFvM2DG+kW5x+A41NN5nXmESZRnNXxBRT/yqzKDT447OMzw1d31DwQDdLYo3M9/d4cTaNI4tQyxaLGcO4ZbzexqT6SnTCdXUknGIMImYa8v7XsbOGKijszRduhop2PkPrD5LEYmRTZUPYrUnAxTbSHWCFsDC53IK/7wPmqB9pQ5UZK0VmdtMrgEFMjX+7aOLUh12UsInm694ez+ugXrLZC+Q4ENLg9TS//6BHO/sJumKJIQafiXtubDxHE2MIpiG97+/vtoERiuWU8luOtzWTYwM80ZekQ/ZGstrQIQ9gc564L5D8H6EG0KdnLcUkSYOXTSh3dVTvCGphmrLvclfe9t1d58f3Pj5+GkouHfADFpxQD3d77uae/LmTIlC1jgVlEl0pcrSm/OcuLezU9fXTI3JhEiBHGs85g4x9Dz8GfB4YbPP8mE57cdSbYVZRzBhskUO1daJouzx+/BjtVptJczmV0oPBnF+Ttgj9X4XeBRugivLfNTAenwOadRjFLc5AesjMq6RM+ms6T78aMqPvHkLynvLc2dVPAPaED0ERRdhQw8/PLe55DePWtjj91Z26MwKtZg32QIfqnmoW58VZGKpHDEMy+wfDpkJMaMpsRyN/qydklOv9HPIzMEnQKjr4IQp2+J9UTGL3kDVMRtVINtD5nn3Yufl6xTFYp1ijMHacx0+bcEPcY7jOuaGveKqHzD1OEcPzKaNWPy+uPb6zUWF5ttpufV1GQHvqiczpu3g/FHIUe3WMhLUpmg7u0mNj7HvJNdxQ480R3iO934e8EECi7Zktfg1hI5DCBKB1G7TNAfPlPkGeHFMCoCDFp3rtP52N0GRoW6XzbZKumJTu8sE2Xzf0r3rqDqbR9ItFEhV6Ja5Tw8zxCmYRCGnRQAyGSKDJYiuBtBMhzefWeSCmGilK0zruz5/WJ5IKYDyx1lJjxrFJ9Rr96vCOMClFRrtLMA/FKKDX4j1fUE71heBIlNvzeZP5JbQZJqhJiKo/myFJiH1McLriWIMef874yF++Yezaf3DezoOEr2NuzrknAfa8txIo4QMNnk3YTMUGAP4znAQi1Eftkyzy4H4bQNu2zevG8JV4auu5zqiJaNr1XD08TUsMVR/GXW5enYG6yZJbFw1BNzPkTIxErszq7v6S+4jRBiOHIQHU/Kh19LeSjOrakZL0v1dca6s9uPtT2+xejd4K0218YZDz8TPBzAggfBoxDxZpHnqmFAk84GCSjvuFuxYPFtZ8zhN7GLwO2tLKbwAAAP//bJ1bdtswDEQhyk6bZC/963q6le66diyJPSTmApBafzqOLYkknjOD9cevn79N0ETg3U1Q8glFsqzq0DnAGI7FnqOURiVbPKSA4IWSozvi4YS5EGb7u4JvC/jIIgOXAbB3HWvSWI3JdJpFFb8mpPBu4nj17Oxj4OsLznY1Ft503wLWQ/WWDaZfmsH5qDJ9Fec7N5WSG5zZLtTES+rY4/N38axrMvGawovO3aQwYv0MHx9J/B6ONRUzz50cNbGDz3nEGKejKIHTsRz3PyB7E6a17ZpvuUuMYg3ju9ZDGs83uyfAp2uw3wt0bgnu5KLxiohP+vMZV/UY86S7d9VbOHEdskhAW7mvMzcNxzYSVJL+EXyenJF/W3T9ESOqxn6xrGby/SgFO99m9TGM4gn1KBZpZrMKC84Hda2DFoiXY3KcQ5E7RKosApGvCG57nBsUf00jpKY6qxSt5xo+H3oOWfgh+IDTSNGvKeFlxqrzIW9hvFERh0bRSwJuekIh3mWM70mVf6+i2jwfCJNB8VmWnItciyRLUf8FlsY1YBvQNCDYPmQoOXPYhy7EDwWRab9KYWoU0OAfAv+uit5LmROc0N6yv0sBoBXoc8DgSzgBxJLkbqzxqPLjHDYljRlgN/t4/3Rqj7qbJuG0HAuYIjRMGUlaz3BoqZpL8HF9XW2ndcsquCCxleNNZZ/xXlFMuhRUpy06XKCLcYDtYjtqAWARnJGExXt0+YqAH5THSKa0Dk8JV8FltkgijtiHXZSXqmZtZV+7Kr2f600Bcr+MuEp7J1QFoosrMHQJxqLS/TqiYAF1gPVSvf6EgmPmf5Mg4nch6VwM7h77jIXqhXdqzORfyzioxvPqJy2SQKYoODpkX6rfWIrtthJw1z3/+POUcOVtciRvCsYplBzilceZV0ePNR5JORMBKHqScA4fdFgJQBX4eOGOWfk9BLpu0gugcOljiBOmf4gusDIud4iDWhgAAAAgAElEQVQEP79yAoKCV0b5mYI3ONfBMde9V070dNEStqVwgq8CRopPCt9gFBOOE3+97jEoFdvm9zO6yPcJ/XZO/ybOPmuMwN6hkbe9nHka01NErCVyojG1QEWulxALzhd/85hHavtMkVnX1DJq5by7CGrqB5nlOFL2NVdT4bkZBLc4t6wpoqv4p9ptXNfb5X/bCdlplziP7bvH+WA++RYUUxOsnHNCw2GN5lIrgoMkgE2ItZshMrYfjLtNTrHJX4WdXHpSXgr0fhfffemZnLNHohE1vqvovXBOHMGwChHlxT1PPryI5qKXoiQUsUTiySUUynNEY3CiL9SA9Z4TE9BJCgNiOT4tYOdmoQvDPVkpIlR6iL/n8RXri9gd4x2JTSkoY6e8afWvAKIX+1vY68gpQoPjjCA5CkXELH0cRVsK/PwNQWlHS38Lv506KFbirkp9U8NU3fIQiUagTmKtJNYkfqjJV42RaFoFTXH9b8xumgI13v/8+JxIVdCFPDP2x6HRxYvix4f48FduH9fO2kwh5ylG6Hx7dKVGUd1jgjfZ9tUFovVsiXdpgHTGlcs2e4zqNuQ1aQTv4XMd+r4H3WPsmRFXvKtpAgoAygR+dHxmohU1ZQ79sthDQaP2Rve1kTwLFkJ4odkW91NELSkWk9/W/GggF0A6MaWFuHkWVZVHTxp6mdREjDd+w3XVPMYJ36dmLrHKRNBtL/vL1bnmyI3DQFiS25O9zv7c6+xJ9tzTtrUwWV+JdoBBgiCZ6bbdFMl6bX//+89/LjiTuL3hIhC0uP68wf2l5apZ6bs3sE0RH3lhQUfvjTQ3CSfDLqOWrTihkxuaFPD1QNZtbGQb9ucon0Ne01A1kPCZvn/NVYj5O/+5PzUsHBg/Ozmfim6S+UhufDT8S9MdBhyfpcsaakoYVHl4QLhXDEdqvNFHQpEdfjguoxr8u0SYng13xvCtX9iQ8SHe7MCsQeGC6aBMfh2gNFCXzbWOKMSHkOKK6rsBaWtAOqQVPs7DTcZCjch4/jUdmg/BPVyzZY6mvfgz8LPYYp6i6tbCZsfZi9ieFf2yFZd9X5N5ij6URfwrFD2b2D0YGEsilR/WyN0UynVTMSk0meu8mCQUzU2o2FQTXDd6XdFtNDLRYJVYm83mVs3NqZ9ebfSGUFaYCLz+JM/DBnk6gl9q1rZYkvwYsWSwW66yC5HzofAo+is+ysURGlgUUGXfi753a+GGKFGnBq5JMS0Oy54y2LS+hkxei2zK12az3IsmGjcLOxZaMExSSzZ8DWmcQWkT1d78Wvi5Q8YwUIF9L8vw7cOiDK1dUhOiDsOk7ET3+HHyBBKo+77ccqHIfBe1vc2p77HZtRklDSimKeanFg0yHmNxUyPJMP1M9InnCbRriDYsuVdxc+YgngV9nm+W1Jyuv+1l4OpD9cUAOBXzhYa2zcXAwaCyFdTq0ufEGuZCM7zZZ8f1zbqlBfV9jW4UFBMpOztfSVXk+qc2uAdVjqb6/j/3YnKTRhVtPv4ZaNo3RXBF3fwei9qIDC2LhGIa87lLM7cu5LU79WQUFDhMoDS0NPmtND+TywWYezIKE6DLRO4oUXQ18pPn9zGAlmfqLxJvXD+hMuN6f0Xk51GMwFhYuJaZDdaihrbiuQPrr2FQRyRhX0uuusRdg9hw/Nh5LiCBZymp0DIBrY2XkPiOo/1nt4kYzSffo2qGOeuadMNk77M2CZPk0f1eTr0/aj7PabwPxc+G/OclhfQyTdGHoa3/bDKk62Y84CzOILALOPhqIXZTyFsj4/90dvwUEwkJ3FWGP+pVIqsyiy3MpCG5aCKE6+wHnUI/n8/BZTCmvq888wpTs7AI3D9RA0pHUxHg3llgPBE2GBchS5lLEjblkt77Mjb8I005BpFTTJ2B/vv8+jVfRdvNEMMwdsitfpazIhcZp2vfr9Jb+PxGYsm8zL5hQ4M/Sjwrv4fP+bq4e55xhyOAh9iMREHDLmzqjZCYJSNpRb5RV5dHRb7G9K/6uLbWPq9LvrcVZhF9PYvwTeZ3rbALuD5e3GhQWiht0XUj1Swacgbe6u0DK3MSO+oB/QXqNZlYCvC7U2USlMHc7Srs1un+ide/C5ltjRmwzBOVXefehhK9vCo2e0mtpYJ/LyzIff/xvGBPtMLSnjJBXr1Md+wvS71aD3tfYA1fGFQCYDnpR4aq9FYszcMfTkyDeL+c/+WrgpCzpJ/M4iXRHV29+5rRn6wUnxELLgAtarznx1ln05JOI4AFVi6ofpPh5fliDxG/yuIylxgyha2LGvky5Fy85J8Zn5+oOktgeqpa27iHsI5ChqKeMyMXc5nFvYnkA/UBMbjjvSe2WJwFYpnfUrysV1kLon+PoR+2q6KrBYTFMr6P9j8AAAD//2SdXXIUMQyE7bEnBSHn4YnzcP8nAsnumJLUn6yBraIqlSyJZ/0ntVrd4/vPHy4CeErJH5VA0CrrWXaUX4dsT+XQkQkpVT2/7OT/631PxxYESR9CoSEuECNlVxv027c3TwhTHCYtHzZly4IGe28c1Ng2iMqnSqNd4ieqolA8lERSQfUJFKWISwbKc530SzoDC2E0qZQ/b9XtlsFeXA4tqxIWuFNhd7E2jYc+56tYBdlE/ZHKJy4Aa+Fm8PRJRgyFgBngoL5Y2K6m3VuCFVXgsZfA70OIY/hZxmll/+fdxWf2hoAO2Hu7bYqqouwiiwq2Q0lblcciBMNBQLAR/fVKVn39TKdlOqJ9RJ+djdE23lmApqsg/FQOSSB76TmNA3u3W9S+WBA4EsEm0RlQvPQ51zqmReOZNOXS5w3lTiI8/L2uABXF5oowL218OxB8L0iVPmjDtDbsA/GQGr5rBjzCtudMZeImWz0FH2obaX3ssfRINBAwJJGp4EwNQNeiR3CLrl24bCipro4MXrUr/XWWDCEshkqwDRBqKBWwfRm29KzmMn6Zs/z0nqT41wsHhz1mxJz8M5njRmOeOe4lyvEWhRqlXQC6tvfyKeElQQbooQpDtbqOMcX/yve4HK8yHyQdiGdC6d0BeYhCIfSSVcR56qIpAEnbAnzPdAsI1N0ZQin0uDIwxsPYkmR7PkOgEZLZPsJNyXGZg7KPeqGQtnphEiX9E+Dns1tioypGPYOyerzQP/n/lYmDWA/PovDNGRN6NS31BWCdhIPDh0BPnGlaApM7WO3p+8zYAbyhz66WcZye+xD1HsXkmWvzRVR0AFdsMHfVclOtdwXhyOpQZS5VmjrJNaA57DQPNJRM2XtMBIjg/7Yudf/X39mqVREtBIWJw9ckCEs2cqirr2I3SoXyykLD/8C7zb2PT1XEgdqyevpX2ne1rOIvtVI0gSGzfD4pgNn0HukT3MHiIwG6Q+4ZfFb5OT+vFBm7UtASvZuRbC4Sspq4szS4IwG2qT46BV5Awwanmf8jz+um6u6nKouwO5KBUJg3p4CkDsDa6TMPMa20c3RdiN+yGJzSAthJ2SWL3qk1lDoIBYwdiv944eQTDI9DYNYWO/P7VeAj87/jklmev+fZN4ryNRR/4o1WABWSeuIwu3ND0T9EL2GZUomtRau0OUynhJ6sDAdYtU9qK9vKRK7l/FP95DDAMSqp9MWuNPffaNlqeUrAjWQnGAVnsvFGqcZDyT+yyNJyb34+eJ7pOlH1jMCVgu/NEr+F8NtBK3gwP9TKk39XQKzHNbbmr08JQ16qZhqt/CHW75mxMSAxc3ZRXVZ1GuCTdYEg51JlFRbnnekacSDiil4dTcG1Uej8d9AOlpKD6t46ho/6dsVqsAbaFmjd7V9Xxievr1/EOhS7Wb8jihE7Rq1sg30Xcg5vNwDumbNYBFKMmapIXwsgS6095XOsDAvOCM6L2nLNHui6DypbyAq3Fv+zlI/CHAM44t8ojMVZLB/Por1l6+urKtuMa5bzLpXwC/MgcrUQQreznH3eSiGBJNnOfqr/5GgPtZA+JDK6ixgjgcr3X+95x3AeGOMuGDoBMBBrcaf4GjJ2h86xLUAf2kC+xyUyyB2aTmqKI7N9Rjm2xcM8F7ml5wS/I+ay+aBQlueAziosO2k3JN92xuLL2abtf9m5kms4683imDHaXwAAAP//XJ1RbhsxDEQlr/3RnKafPU9P0mM3tS0VEueRIxsIEiAxvNmVKHJmOLx+/v71B1aVxQozsDbaS2PZupKiyYiND1kG0qyO66puTiY8MN9KoNYCC0fQYFe+/1WCyViWt8alcPi6K2MuYBU4SI0uW+C7r/f5TFmky+HaLPZhHyDq+eIQb8zwViLNYcWBdxQhVjiRSGD0Qf/henB/F/N0jFbxROzTzflm8rpawE3I8QYnpADwVyWIsYle7xOB9wDXNLd/Xes6qDzQ7+tW+AzUKA5ikvU9W7XRz1hIc7eRUS4RHnpGoMRhMIPEuzYb4AYHNiZVTXKX17v6q+lrhKFiXM5NQMWw/qw6XE7QJFpMrrznjubu+9XLvCRkhzPXwWBOdKtRejCZUZis6iPuFbOpd8+TgtROIPR+UEoKxJ6F1j1BF76CzZRJm/bYlim+R/b9YsLoRem+7lvPgN1NYh/rvuWBkYjyVaw+Y+3u93I0xnfjn0zAupgLvCxWMuLKnrtLyvlf7XnAUM+cxuEu/P34f5qKd9guf24wCss8ZgVSLwwbctFeqD9mX/THjnccLt/M2L+KeUBu3/EFQP6vGf2Pe410CbAEZ2FGUNWhsE21cnJD26ompJoeEy4zmyLRB9lNBYUYAm/nWgXo054n1/OmJ31EsrwL78dDyp1bFlBvxefL+u99Lfo9P++tG8mdAIAXOkOIOMZO/cNEqydDUi+PvS33obV9MOJMhe1iZV+anZt9cerXLSCnGHJUWJ6ohC/F61DC7L9xdEq9nan62Iur1qtL+/LnOWzPjby/vl6H+bV4LHN2JwtCY+g+mcMaQXu+AIgc/KaVJLxJ3va5HyqOXkUVLOe3VBLMvh7mIcKtItmhxa1rrjwqk5v67t0RmrUd8s4p9/8rZ48zvWNPrxHwSFtBFZlnSyPtK9EP/1JMufJ+eG+/G1lBeKzfLflsOCy34/7lGjfGDaCKmNhsH+V7rUAcux84fGP2BBtJ04991OvzkACPHC+qlgYB2E/lQ+EXE8AIuQprksKwC4Rx7yF/hsTZ+QFGPQQyZ2F0MPUtW7BC/YnPwi3bdTZ5dF1Hfy6jKgExPd4zCpq1NOdMEmoZXa3nun63GV8pJ8nJSq3QD0acmLpbtGg2k3IHAGyY10tLJr08TGD5AEWG7a9U8tAWb6DeQ/F2/3276buZV2uNth4qhA2ePvH4sPx3gYytcpo42wAtSznHfiwSy9pckDVz9nz6GNjkpN5rnZBP3TXPfFpuCyBw2fQs3nPZiD6ARarrLg+K03Cxm+dHz7WWSjy+VHxd94oPgGcQafMM5Xp/7fs557FHo855HaNpu7V/RL00U5WwJ5AZ+OUKVr9u2kFoPYHQHPMEbqc8ehoAsFqC8tr9PM720n6c4Q4sjwFx90o2+dYrX0wlkykvL2s7we+s6TniE7SVvLr3l6bQlKLEWtJyTdWoZ3J4xuqyd1ig62wH4CfG3I0prwJ+Wj4cwMCPr68owOW5s/bUNmkUIOVqFo+54Y8mwkjqn/Xc9tSOBarK9DQILH02LXrboDbMplGphJdHgZoA5sSTyNNFxlLzsJ8Ue1AtrFwX/6IdS64gFzeBvK5vEb5cQ2vtPwAAAP//hJ1rbtwwDIQpeRMkvU3vf7Jk11IhcT6SdgK0QNAfWWz8kEhqOJw5/m4AYEjQDvGInnQ6zXwYlNhC/9nB9/UdM8gI/ky7dot9BsMD7/vDOyzrYqCVmjr30KqTwn04Ynn6IZPuyygzsoYXsdA+iqvQEphp0xGHVMuDFgHzXTS7exfk4+M95tVbCf5sWLM8wLBAKGicUp5qzDz03wCAumCZgSMCE1h7Qchi49q1q7ESAjNTi1GBuOMhj9g7ANBFZQsSoxgZ0GAf6hwyJ4/IFuhb7z0S0yFPf+bgpyHc0orCM1Qq91gfQug2dbIE17AVEQpt6jZF0C+zhMxIzRBISY0IidSWompen3+d8S4daLrVXQyPCI5CjrnGFQyaRGxCzb5lsBpS0FZklCgZ/tOurtoEiNBRnDOFo2qCQGRnaLxhjHTdWDNBJuChRWdl2PMcgWrip/4TADCtz1Tgz25oqivPYnkTwI/0CiiweO5rDSK0tlXCC0OjWkHOMmfobB9HcVd88K7B65J4fyRoiaattRGeq60FMv083WbmLHaeR5kzpdSBWvrEe7mZ1PDfYv9aPThEIVcSbbybXH/9yAMSe7oKGa4RlNoZcG0Hi/e/bQxbtTuckRABxi7PY0KRY5QK21NsdI5QhKdrOsYMdgojMORYOjmt6Df879+jUpmLJZoVumfDLoeRFApRsVwApXeipIhrqTA9tcWYzyYhPkQrDDBN1Gm0KvZM4PNbhcGjaMj0OLROUWw34Pj9VBekByB5XweMUVBB8rw3cNQS+OA7Lj8HRewhBfD7iMvPeBCx+07Zn1loWBF5ZD3iS17XspXCrr5b1vTq3FBkdAQtL77KWNSdoWUzBeoQawEJXeslrcgAGGDE1IMHcZYRj8yNqWXRpSGwCp431SCm/EXzgmtgLdd7W//vUYSZ9mYzRn96jqPcuuzTrsW1SaRuFiAKYcB6qJ7S9IkxmhtryIpQqJV6onZQvYDMfBsgu9iZHCq43lVvwcZ7SV+DQ7TvZ2dBUhuNwjajQKceQ0/isvZ4d+oK0yT62PbL86I7Qled+9+1mN7xBlwmLDpPvDvfqL5DNJDDGu+SHAWDKtle2AyO0Jc4zzPqSmOmvlvMNte4EjH64fFou+k0vChNcclHKEkEFdhswU5MgN1u4I4HiKynh7qDrPddU5div/+i4QHDq0f8ysP8/uywWE+9dJmh07CGZmiJjJvYb4KZNfYQk2BIBLX4HCW/egOl1hvx7LEJjJGbI84Ys9LOo9kjFrCag1Cvhp5BBUzjfFKut4m1BsDIPR9FVwDWWwX83BYbIWV3/AKgpsnEjHeXyj/A8fo+dNE2JT1YXtlgtFsuaSUWBEtW2hPr8wtsbALd3B68AMrlEMn3cjbjnn32+xWfPWFYq7l1aNSZhi7s1lhFPwD8EXoj6H7s8dKvr/13P/987r21ag72IA06Z6OmHgwAOMyzl0bc0Mcyy/yAYHhTk/VxAGD3ENp+k4AldY07rqlbLzcZmsbkIbeiTa0Raq4NwMkJCRtp9oU3uz0Gr98vANzrh0Mi9Iwwzn0ATw2CHNnejAWYQKpj183RTHLLde1jGPeyJ3ZXD48xxMOlibTDkyyBOXdxzXtPHYf9AwAA//9sXVtu3DAM1MNG0QP1r9fpPXrrdOtIKkTOkKNtFggSIEFiZy0+59F//Pr5O+Ax4H0u2Y4UcPC0wO4iJEBeBG/i7j0gG2x+HYoMfsdn+vRTUHCgeLCDiOaglLQ1IQ+C3Fz9YABgEiDqgIGOEz4WcQp/or3NGKl7oBBAT2wj7CIUXYDHsHh5moC/GWIvK/hRVIhNcZtzALBkC17EBrGQSyTNEjfmuSQ7G5Iaw11w50XoZ71tWzn1aoCN7abNoL6rxP+PQYD88l0wMTju4sEF8LwRcY2AJ+6bDSU36w6TuXP6hOKKyvoKD+QA4LXtifA11ap1A0CdBAZeesNT3bUHJ/39vQPvreo2hZ7xVyTGCvFFJiImLmvmP0dwpCn8VDGVH/B1bv0uHx9/kHBm+AJzs/Fsi6fa4nxpsbXv60FBRlhTgT2JP+sdMM3LuceEKiNQ+8YfSfYooDPxrJnP7zdAihqCqweMdWxYYzKMgQI96qn1EGJ72EyHKBaa6AFxySj4e6I/NIHz+X/2+zpXVu9vr4UAdwN+qoXGkuaS/DaNL+SX0qOZWxUKjhUBD1bAssgn9oZpBQVAJ7z1cOLIZ49BPuIXECh8+UauxgbUmijxizdBHdtc+PX4BquHaq1xHoULTt74Jd7vFcNWxhkmK4oPOaKghHXXt9sRK0R4RPMizwOn/hxSdYgqWkJd5YithKRn09Bjuxm8XwzferiAfI0AKCJ8tbARpgPLMAjzY/Z/3IYaFWek17YRgKafJ+WKU2wyuKY9YwfFAC9s3VY7BwGNPH+cqc2L5ya5ywY/YvYXiDLdsKk+im7olwyR+H0igBRtwTg26ev/xmskauCv8Dr1eoaIT3LIGrETGceabWy7KCa4EX5Eklnjh42YbvjpvX0jT+y/9QJPmoi/QW0PbJsH/JWJUrEcdN8B7a2thnuCUc7KDPpB43BJUBITOg7a0OsAitxWNiXasF8mKgro8NXjHkhFWLjPFXSjFKCMRqWdm0Uif9Y6Od/mhoDcy/qGOXzFJncdwwqkAbvHEEVGPUVbwik1CPNnCcqj5ytDUUKgK9tdDpDnf88M6Qru6y1wd6Ky9gA8KG6pV8FC2c4xzmmTZoSDeBbtFJXsVzaZ3My5vkZSAGL40XKYaudZxP5S52HG4IL+9mVR+T055JaX5vpyKDgnG8YRtbI2Dfz5ZzzSsJcDpUMYOXU72FzNEHVN+0KiO2IQUEAHk1bYhtwlkZYK/a/43a3m8IO/g+g08sSV5+0206nBM2dy7/3ZTETxpJActV4Qu4sgGibulTSHgWtxIdknUAu8B3r0L9GjCicsoJN661EP7ddeCOx6yTUszlholuZCsVFdETaSJcL2ih5pjuTUq9ito6PhDGP9TCKoYpF5DJN7bP4zv+Y17riqWlPfpVGNmFJrbID1deSVQJEl3/2CYJ5C1ju14Cjw+VY/c4BAfZ4llMjgqKNPvEQgsFBQvrQYcOqwmxQ52i8SaU6LYhdt/sTQt4Rjz9YQq4IIUO20/ZkOBp+gwNoAaC9KsfxT/RkfBEPczyhUKajsAwXUy7W6Rg7QF8bH55lGLGXQJM2IQ8Fdc+++yeIYhWeBdCY9/Wz2kxJv7yWuz2luvgg0YXmcpX0/dp728ylC4vv7r9er/AMAAP//XF1Zdts4EATARXKukwPMcXKNnNpWRBKYV0s3Ydsf/vAimVh6qeqq5fef//4K/S+0LFutUo6DG6Iai+1mkKx9vr6k/GmxgcU07ujuX2eIvnlm2YGcFFsLD81duAyAuOifj5xlqLZaCVT/54xcBpWpY77aMiIogkmliN8bmlMMhJIK7+GBig0AqnYLxLjKq9TzhTftaFLIxEblSekUw6kx8+Frd7E14bCl3GqvxvCtJ8ppRkLz7y7pVet5yraZCKubZudlche/XyggnaSye2WkjAEBlNViL2pl7/zKgN4C7RK9GEgB1lyJeAhniIExTN2WndftAsHncIathdaeBeWlRIS+9FW+lJgNpx+zD2V4XuPzuA5TeVU0H/baPen771mjpkR+owCfkH0pFMdF9mPOyk2Sr7dEo0b42KNDB997+IuOs2zNqvFmQywWjuwWOIIPKYTY0MnknDj2T5EnPGd33AF9u7kRQQjIGYNJF8q/2Zv5oM7FkQXH/vjQnL8VnOkza1QNm3FfJERY7CZQLfDz8IhGHGZ1y/t9sElnenmOq8tXt0lvYUmK9pU+wPgaPtOafHNStoRwphVnErkFvX6/vbgnv+9ovIgSrO/HfHBLtoPdJIq8gC2TqaIQWggYSYkm3lpSfOz2H9+4X3DWBxOFbqq7PPNB/X+bVYGf4Xz5NE4QDbVerSqLJLL09NHuFj9dis6OBIPeuQ6gdj0ee84OzvS8sGJig6FVI1uhmqz7lXoppM2dvuuEcB1OPs5kDg137d9GsruTSRWbX/+O8nh+UKsF+xTJxmAyVzj+sxqJDIRwnwTJwhGktWjo3kGxhA2qGyUIrl+vFwNWCFbGz/VZhdZChkkl9dVLG8AUvLyTIJxLIf3ac2CUsS5u5bborBajHPf6F3tfYw8z8dqUwEtrZcgDe1/LYfQM5xX34Y7gPyn7koFRlPiqgSD/XLkGdKNktUh02eMT12Eao89y+reXtJPcXBB2f1b7umPt39eh57FUC4S+8/cUn0Kkyo0VJ0Hh/zyi7WzEMs5k82jHZfeLlshmc6H183s1R0FWz0kTcTejoS0TLRYIQr/yvWBvDSOuH8+PZAOEtzX2ISmJUHu+TK93wwNFvnzDt3KVk/cyk+Olyncd5//XM2d5B/eBPent/azE6BZRnBXIB33+b2GsuUHer1AQV/4Sd1k3AhtrgPVpdqc5zRwZ5XujJhqNfO44o369SOh5buz9Hr7d83PgmpriTfTHzLHVomeBFF3JSvyewHN/2lIqAYGID0C/hLrw/JB9YsFQjh3Z33+eF54LiJZCcCNdEzQiFkrpKn+wB/A/nm4ULevdcNNI0d1wGap2eB8yzp/nt3hdSqilt4wPLE5y7rnytbrFdIXYu+nXPLJQmlg9YUvaCmMwgR7fFWTdxJlaoqlQ3Jw5nXOenIdPtfEQKJua52wE7kuOTeH1Pl+fAkXwWqXLB77HmapFk/Iuqr1v46PNo5HBWCiK7ThD3VpRi6nxKnoDr6kcdwiNrmEf8sceDkeVZyWYPtHcxPnDe2Y8rD3XT+LfVXtlXMr3N+vnFJ1FLVk0XU3DT4qEdU3UOdFzSxZfTV933MtjbpJ3jRlcyZYLj/Z/mZdL6MwCvN33TupJaX6+BhuLbmUxpqo8T8j5IPu01tsZRCO7a8YYxBIixS7kezT3/LcpHGq1eDLP+D5a5v8Ej8Lm1eAjEet9S4G+Hft9qB4gKm972fDCR46K/bqsipGrc0kJQyvnrhNjp0wsu+Ei/RtbKHQ8QmXeYFmdHBlKNn6xZt6tLZZ0lON603738v0rMT69NwFRjeeKWm118Bnsz728EdsVjrSDADSsIfQ5fN6WO85S+2xkI6WPkcUzYyQAEbDK4ZxjQVcU4tQQyxFe5CA9ffaxpgLdoFmiEQVojQnIWQhgc5zY8YyNEYvpRiMJtHrsN92vZk2T8u9G7EyTIAYAACAASURBVJSr4l4RsA5WlOoFPl/UBd5r+N+ClYjXiLl+nlM37XGfY1/gK0FIu1bhvYVoMvTA2BzyqAD+xvP5K20Uox5OgdvrKv+TdXZJbsMwDKaUODuzPU1fe51epNduElsdifhIKn3oTH/SjS3LkgiAwO3n719/PP5shAyGDcEXTRWDTGCT+U116y51OexoNU6gQOkF/TvUd+oPFnbbhOYkm0QKAWh5F4AAwnIsN/mXegIPHVaPmEg29k27Iu9NLxGs7ZdiOwIhfZ85aG1ndgKAKEK+JqPB1vPXXTnSIK6YTNGKgPkOyH9Xrz2oDYhhyKQ/Yg/73Zl4R9mclXiolxXJed/aFkqcU3HO9ELpJYfxuzaiHpJK0Hae1XrR5mbx3g9ZHQ+EcCq+4gCTPfv+dzhz98KeV1nU6lWU8UagrCMZ8ltFU8fOzqTcrYchCBsrpkYL4LBdEhNjJHR0FtMrxuT1FBPBHJe0NnLU/ZAN00wu74Ubr75nsq8wGjATD7GzDryZTD5kuAnT3J0RxkmUa7iqqaAKb3ohUVhYQZnnQgDCjSt6nRug0JtU0CrL0eXjcajHMpl7DPYOvfuuasjEiIhGIgdVV00fWWXSADFWjJdlTjQS2mBrJGCoc49/57N5XxlFxDNfYFnMI2cJPPf90H1VxDw32rNcA86t5Dg7+OKF7pD7MhGDphi/GFC1PdzVCjKBpMkaY/o3BoqPlxiTNKB0p/jbxsBUxQLjjKInWJIrTQA3RsqQ5veQHdqV+e89TCjTiBMUHAbFioTWBKolWJDvWD4vH+93cXmONX4djs8tFsjKs7uKc/mtyOsxLPSi0ucTB/HsC/Qir65dQy1EDNklBctTrFDbFDRaP8MYSvJuFUJRpNjOyNKHSETkLOXnHjb9YR5I/7ZdJt/LutHGz9vWLl9b5zOhbYPDLH2Do/gJMN5x7+VdYR1Abg0LzecZxwkcz2SEGXnlqS7Jml2KeKXv08HK9M/wVrD0tsDQD9YI01h62i0ylXON5r5r/3hlXFppo6LvOL086AV/B4uCie8CGOUN0ZXmcBQzyBwfHaY/WmP4zNxnnLk5w2+lPr9R2EzAA5RCy9RMUm0KUNbgeA8+OJH4+UYk6fXfd9bra5//L1rsblEYXGoTA+DNlJJsv2H+D3yhgqnt2yVOs2eImC+Zx5FUgWEXY1mZzfjz5WoSlBvZDrKnUyVhlBHHuXfe435XuoIO0ICxrC2VyY1UBylNUHOeJ+2MrrCZ+zvnpnCt1AgglWbdGuFp8Y71O+d0E0DT4rz1SYJ5z/8tzLZZu+f+fIaKLE0AQ92i7zIBoJOxvJfIalIpMG6+pGakrbaOTbrU6xzUki03scCw47S3cbY/FffZY21TTHRph61n5qqcCa+lIB5S+UeiWCstS02KulGeh4NiPRQOc4/4uwynz5h3zBUKKAyDa1sJn0e1sEwYh9I/QvbfQy5vI+/llGz7qfMCary7WmYXNCn2nXP5bvy27wmRqAAhp8+hQOH/AtZ3tVO0EidIzWM6Z8S5WH2Bh84hGPC6amVEzXDJMJn5uMZPMdVWlAHLL2PsZyrqoRbrHr/PwtVw219G4T5HWcleikWtayrXYdZiH2f/eRxuLP/9/UOx1wICl3Hh9/pe0kU4c2MYvdb2CnASNblao12RM4GC8E+R9xD1XagulBwE6FLn61ZtFqUz60RVj1VlTEbQuwfS8jLSHHEfjbeZmf0DAAD//2ydWW7cMBBERUkDA+Pb5DfXyUFybMcjiYG66xWbkxgI/OPYGpJq9lLL9uPXz9/m3GtafS/GV0x7Ppav19eADQzsiwPmYt///B6BKnhJDxdLD8FI40I6L0NpSfgRGqK7uLbVC98LX5gJYt3Yu0PEBPgQB6XaeLSlTcUlm2ERJtm3pMLvLEaHTyTq81Ukbtykp4OezuZ00ZLc8OUOkfg5vnz74MjBad52uDn/QmC90Y8BOW4SBUv+YxbfaC4cRVhsqCo3JxPAnegU1glAPcAxvT2vYXP39jxwjuDiA7HnULoA0AXW3hKTFG/S81xZ4OxO1hYnzzSO3JE+SxPJKrZLcAw3nV9UVSnI4iUq1AsnZUWlet2HdSD8qVXKpD0K0ix2ucIIpPcnfH4+jQhoDRHF1VC33G95EasLWovx+fM0n2EXInqfeC3RXbCtppoI8HQ7olhwpeNynnlj9Xx1JoKaHuPPjZNAqgyPorVLV8MQe8P5xhrUBA1tBmtCKMFold9bigAusyYoelqb5d+tCrMgMGqwJAD6tS0NgArBCyqMROli+lMKMBqArLt5yQ2tihR3gdoUZyE4+Kc1Rl5SFAduvu+5Jjc37Fs0kMNiL0PkLjxppUKeUOAszNZtcMTSlvLbkNWgPjzgupUkUdM8ztUiqCfQz+sqlntqdPVrpmcwFeVFO3TBU6j54kVjocRt9ij4+MfLThQ0uFjTJmRHwEB5VvNwc/qdNlObkR7xbGeq3d6JQZwD1qTCIAXN2wv8tapGL1Y13lwE/q9ohnfHHUjida/55/PpBjjrjA8xnMd74h3JXdGNYI/yfZqjf+8VMj0LdFHInufpWH8IEu11L22E91hzaZyIv3V8vnNY1NmdQTBf9ZUEo0xxORpdxKfXcZrDiQDw/TOvwldkuNAXRIQ3cyOrqFo9P6BVKMQuNZSJmSFUvK1TXHaBuA/b1wpbhdaU2hAS39R5N6z6LX5UiGdNxHhX0BCpzeW6l0yegLHTpMgm/mG1edtD9V4Kpjz/wP5r/DvkGFKpU6PopShu0/+vjVF4zoZ7686GGvbQ3cHndEGiZreLnaVN1JEQxFXxEYVU4dVfKsJopi8IFOoLoTMmyyluuE2c96UIIXLuyR2NwqpuGuHDv3laCqIm1vb2dL+OjEH3+WLdJLwWMV/w/sjbPjJvA+nKOeazUyz1qdHWpzV/5xbz9vPuUdR18/MrpbMXakD+/hPHmj6cPFiDRUMDGm3OMa5KEyiOAUKBIkDbdIl0NxY3Q5LZfxy3LFqtu8Zw/ZKrh52ZdKWgDrJ3DDN26H6c5ysnrNQPoJDiHoeDj631Nc4rtru73ESA/lNAb3J6uZ/rRlLumtbe8TqRAogBo23VbOV9qukXE+CgRw6KsXPWyq+X1lalJN5F4UP2hNATqVkeWsc/Qe+bhV0dI9VcrA201kYBjJ7EspYBwDocj8Z9UW241dQRXS/dq74DUdvVNIU+y79FdRm6QBHDzlNDuSvU6QMRLTci/qZpGIWWO+qsQaFMGu5iq/n7zl3tIHMNEWEF7iZb1ar3kwM+DWk1AEWv7M4d0q49XesSfj8s49PmdYgOBrVQjejY86KZA/I0kNS6L91oEsqguitV+gfvJI30icb75qxGXsCgIgW5kyo6NTXbuvwFAAD//2SdS3LcMAxEqU8045rrZJ3j5By5crxKeSQyRaAfACVeeZHYsobErxvd2/efP35Nes1Q8/WWZ/Sc6E/hho/XhyzaRoiwDSUhezlC3UCmob/OIhI60yGLKS5/L3t90VBOWq0U89mB2UP9dUnbv38a8NUKCuwh9qCn8hK20hyv4Rt8SPV6N5r/DELP5yOQplpoXFKNHkHLve/QLypgFoQ5RBuN6XUfsXt5SJSitQyyceE0+R5FnZW9zVaE6/ygtvA+fV9nJImreLXOwtcOwXnFUCMshbSrNYuOeYGzKcBOy5OnW0nsWQCroDpkx7iJ8lWLs9hFDFsw0ZDEiggf0pun+4hBA5NBEIX3V+5cXfJHJVjVoFdRArIp1FUQIujoJFsGERkg0RfoKdjWaoHjgi5HJMBmO9JmKaZGYd6ZpQRbEHTu1kMDkiW8sz+88Xy7aj5FOGJvRyDR6TFcn5+p639K1wzqlkQGsCBZtaM1nzXfRzImUqhmBF24lf3K3kGeu4mkzUkp+iFB1xRS5OyREUPBP6bIv5TisoeAi+kLvJlU+9rFpISPgiC7kNsR6t4gm0tBZ2sR1dXkobRazwqIyBb+4CBPPaa9iOjRmIISZSGxxd8yY4it9MiGjwbZUQOeUXfVxAvT978XVIb986bG2uxPT6zIQN5OiQ8lYucDMy+WggVVNEloWBHIM3aLCeP0mLBDESORDyUyGyxo134rIn8x9TZf93EbdjbRICk4+D9M2sOvWCJWxH3+nRey6e5iu7Cy01rRoTHf9TWaDKNISmfAChT5JZ8ofitOtsgJac9I/oL1sSNqtWP1OWKHcIh+WYtrGB+v1ytE5O4Ifq5AbIUSyp67sSFk84PLTr9GNOQ13t0EQwOlXbLxXXJf+vZZFc2KUZDsyDdCxG7MoXb/OoWC2hnej0DENikRtxCobTa8YRA5EDZT0e35/Mr90Z6oKQyjEGNbGR6mfgzaOgwE4l5vDBn30E2p7wG0xVf7YGDtoXJ+aj3v1CDNdv3l7tHFEln+8aesn88lC0l73m/Z8NVCPPIU65P6HgZAULSLLzmN3Vq0GtZ2Pxc0aV36Pr3d66VGthWbY21V2LhFDVK1PkbVTyiuMdwh4heN97LU95GDA8vpz4dqvsti/BwA4nftayhePJMHaUZq/CcWP6e47ijiqqXBq++YZxrl88/6pKxTxKAdRspeahvqBVYyJIyss2vDS+zOeg89Hhou2I8MIVa9N9dg2RO5LvvsXm+mYwF5LkVkofv3EtuLGr1WU3esdAtayO/hed4lPlZAxG0MR+reFICsS4gOzaetMoNjhz41nWh2sVG2IbAEq3F3ckHDxT3ReRfls+B9oneABtFShrLGXBDqvWtwTgyAxYkmiQFmasTj3hV0dcitActF08LRz6JRrCTosG8VeLZuW8R5zhH1zDwj05Ltod6jjGajSWT3vJXBIrHe8lCJLfQgQyKECIDPn2N776X5J+bCXHF9Ax+CdAlBbtKWIh4A3tZ4asLuNNTt/ln5Cqz04PS7+Z76vp89nmuCSBG3OiLgMC+r+0zmslUq/z10pFq4bQxsq/sV+Y31hxjWX34/nIIPY91Brt+fnx6DGQoIjLFaxPpCr6sRpkTfzZ3rvAYMnmswV8R0wCqc+ldaIQj18uyT1u+sEr/bnIF6DjkbCWJ4GvY+g8E2WmG+rjS/vt5f7S8AAAD//2SdXW7cMAyEZclOkRyorz1Or9FLt0CztlWInI+k076kQBJk16sfcmY4M77//PGrBUPj6M5UPrwVsvaGaarTfXVi4tZchtQ0x3xoBCDzTEcp6vwNcWl8qvlci3MtomVwweZJSdNW0N7/M+9boIV5ENKEOPNZ4iOUVQyQsR7im9hMJNqH5quIKOnjOaO1y/AsMoGhaJHZtrxEQrWgSDjYz/tO19CGDLB3NdN+Ca/n4UDFk5Fl0cPKNsUnDaHSh5DEcC4P5o6s6RmGT94kJGCCQRdGijQsl+TyFO6tILeGws0rZilXwfP5esVoRsRetLw0emmgti0LEC7nasIyZzb7806wxYCA8j0aQFIkmG3OmLkZubRuBiaHaF2irItkB1TU7+ngvosFA9H1g+qMDWZN7D6i0LiUR79+1yThZQNzac6ZslaArE1mYgBQjvq3MBKbxRCrNlZc7KuwuuR+DxoJYOTxjg6GId9eFxCqESTEEZnGKEJh/nyO1tf/XqTduF7Xg5r1tZII1gw5zP0hQ5W1PpCQ74r8DJYFRuNKefujGJISA0+DW2ZbFDvBDhXpOJ9xHNotlTDrM+qdBJSMcUtH2qe7uTdCR0gXHeTMiFIYkPNKEM5YcqTFw2f6/8pIZmccplOkEQHZwuNhXZImtWYUqDYHxciLcZ3rJYmnxhKIVcU9Ok7zLf97XaiUGo6iPheHueJDKrxL6bXr8nXZKsQUrtqYfRmg9CVPPOXyT6WAFf1yyY554fIzf37/9nUEAyW1gynK9PoxA7Q0ijtdpD2i6G80AA+D1y2NqxZIBujIOkdhsQWDoszt4kFiDc4yF5qpGngpLYPxOFQwqD1mnAnOhjmZukWU7NrXrThpjy9301CDjAy+ArOsfww4USq0GHUrsqkyMoSB0iwjAiZbZvxFWc2W4qNnPvU53yjweo/RiCYGiYZnPXb7OoYy6Y+4rzBj2woIcSpelHOAc838OnQHRiTedWoe/luc4ayllKgOAVwvMSRHSJNvzWZaFJi8X5jb5ozqZYwvzmB5NTh45EacFONfGzEIAthAgJll5sRZCZjT6r5TBFWYAheFA0xa0+fTwtRvhnLD/IekTCJW2M4EfE2KvJQziyYg7iHqMMXvYjZ6XRk/a+dBiRI7pVIJyTYKO8qVEvN7T/cygLWDScYUmnqGg4uRlTmLBLnnKOdsLdhj9oP7SqBOGwFmEGFZzUF5/rOlSmb5gNgz/6Q28rdCXN1WgMavI0w0C9TKCYpxV3xzgLaMmPTHc28PVrQqfUhjepPc+irs4Ch1tClINS5oI1MbY64zznsjI+TPcCpyMd3Ls87voypkU1JOpC/12lpfH+/vUd/tUtjS9KUBZZdayoFF9koLYcsM9VjXnTcLebZer/k9oUYmVebO1BjAN9I+ZolpBRBE5UEcXx2FMBDxZhQQouQOYqPvJemgqMgmRoh6vvwzUEiO+QaqWQJaGkHCrNM7hNqzpOzMQrDihr8V00EM82xtjh5E0BvZ9pBCWp/1b9b59PN0T6tWRtAez872n5SL1g/J1HxITb4+EyKNtbc+3j/i2TaIqdnCgwUFTJMrPwoI+td7JmCKQXmY12ud1qSyY8+RnfW6rC+11LqX1c/B2JuH20qbcYWm71UpgUTYVQLHwI/rNC8rXi/jhX4eyKSQ3YbsX4l71P6e9uC/t+oYaqb1c4y4ArTZXscoV+theYg5yOvAuvvM+AF87Hv7BwAA//9knWGO2zoMhKlYcQs053l/33V6jJ66xa7XcmFxPpJKAyywPzbrxJZEcjic2f77+f+vj49PIXxYpVSUL7uGnvyts26Vwu1f5CwU2aRUhpd+mcUa11gW1rMUnk1z+oH2FCS6vkYpkN8/0/wpQWKIYs/vvvHfPeizoKyUCl6gl+XJKXZdEXx2PZiHVHeTMjciQeKhH6E43oJ2HH69vcs9ICk4mZTBcWdGWj6XqG6rG82iiw7/yI6IB7czgBMryDDK/nfBBGAR93dJKnOWi4ObGXuKpeRN+i2DglmLaawcz3NF8cODXiwJUESot49HIlw+4yWveh0MTW4F+3MvyFlSKFnbS+HRt6BIQfk51Jn2IvcrdBeePf+uCbndlWRAiSYRcRDFEbhU7zYBNptmytgTSrwlDngXx3WuLQJGfy7K+pNm/uUAzEwiheYehb2Sc8Et0GnuBVRv5govu5Yk476PoK17sbYBUW/R7XjrAJUOfD0Hek+kHaYIh5yvg+yANkOJORkraYGV6s4csk4Bs0TpoalWDY7dCxinsCe1nk4jHcY5FvB5JHUVN5TFIrQt9NeZsPT0swYUuop1lFkpaksCQ/Bj3iwLHpvdyPt932/xNbRSqhWPnhvFD7RUAsYCKMa+X6l7B5arQWd0q0CSkwre0XUZi+bK2rkbI6+V18/OOwXse9F6j6B1FdehTi0Q85uo910Bng5Nsyyq7+u+Xi9P1iajaZdY5Cl0389mzqRTFEsKxafof49lTec5yGxhegxbqNcTM63RqUhw0aIQyGLwvt6hYthKUrVJ3b5ZegdzNtJp4jVGqqD3vi33nM9mhX3RCisFJlGNgfWzEs0PsVK8+NyCJTfeYmOs85az2t6BS4YQnTH0GSjw6FJMbZ8N69FTjYAWoC4e8CRfldFBpwZF6Pv9WESZrcBPUKZHTdZzfYfLRenAnepoEudr7GJ8ZCCmKSYQYqjc14eSwapdsOyBt30CiMJ+epRizQR61L323KFAeyIJwH2DEvP3KxmX6Pys+zvBReIcIwsW1nHJJrHahaI7N6RnYMnm2GDtlC0V2j5F4wkXkaGiiiIZS0qkFyLp78ng2YpOTo4hJBvKEOQbOcudRZJAeK3b1OVphZFzTYHeBwJy3ed5WT+bFKVrbAiUIBZd0vnZYQuQcTJK0kMgO8/MLb53dgLPiBX3PfrUGFyKy1nsjwlcTNHVpMEnqHjFvuR8b2KIAtyfsyO8Rwd5aD/UfO+rzKFT/H7XrH1Xlxv2GefxVRpMLagbqQ3G3hsSZPsS48YFVOt5l5oQ2ODSnMz17Q04KzGnrv2qXTM/65vORGtFY6H5/PtD13YRuzP/B99JDZjJkFROAdB0wHw8UjyZ2ETRXH+G6ocN1ptYh0O2gDWHrSwB8u+BYLs88J3CbhLTNfvz53c8O9yfYBeiBwBzZjZwCtDhoHLG9Gr5S5OxB+ttE2BukV86g2qPBgrPAK0dnIquq9gDRsxqIb6HpgTFP/pcHpocWJ+OXLdgrUYZ72tNDSs51ND0YezZ1wEsi9SfQdSP9XyPAJCjcPYzCvAP066MEfL9aQyR/7ilulzyjsN+vF5yaPJ7WUeM5v768BF3zqP5fuodM/sLAAD//2ydXZLbMAyDJdtJtr1MX3ud3qTH3sQ/6kjER1Ke5qWdNLt1bIkiARBcf/35/decJZ/mnKy+k1HIKFkKVqlMhWBLc54DBGgu8ydQtZSAeCJ8hUwDdJD38u+3MVCL12wguMwOrtMM0CsxCFXmEPHipuLAaX0geBiczm7BsP4PAODnvJCZUNiYJ25Owobigypl6R49TyMh0uHLXH1GTWECSG9O/r9Bk3vvMOwJgc7GWJnMfHN57OWsDXPJT/kL5IJgqCK6idT2EGNQ/H5tj82LuFwAUDDxu4e76/sjyc0M4PAMXOLTorXjdGRtDVasVGcd2ODIe3lxzXGqFgWas3yrF37M36wxI9c+Xz0pcubuSp4OrYwJBR1BhmlaZdSHbHpsesnHmpC1N89PBTnfGXdTC0S2UXvwwSuDfuFcbFCA9PXR0fcw4tymYjY/m+Hd8f52WTnsNIGMpA2pXPhrmJlaSy75RxqDk0EuP2DLPCN4MMU6ZH2KyLqhv/QJIB6mBaJdSSI17bnavJcSc0IvWsd1RZ/lkpN04o+zh8FgspcG2v5h/N2RQLcYv/VYn2J3ovcb8G5bs2SyhRwzxQoOCEalclgj8Yb9CZVFyJ5rYRzf7nHSxkhezo42xURzpT+mWFdk9IckvLUZvPUYnlQ4PX58PrvHok3J7aEeu8HSqpBZ5Q1AUZoPLphtduS9+M8v3sOA0dlG7R/k8bAZfc/uOvROMeXD7yFFAFoG+p9vxd7BcCDbF2PpksWkzuGA7evl59cPqUJOxdZZ0p8LNO7hmhLEDq77PvWxUtEGcl7dfPZLPfTrmJ9uI+weSuB0tmUG0NdnzO4HsAKEfT1fE+B2v+e+Pm8J7/35TOc2feOJpYT9AKy8q7IKBZwn5sULHEuYTpffj3inZHNMHdLZwlSfdU0jztyka/HzZBpPBhEwfcdgGxnZWErIOkspzhwzZtDn9l8BHi5SWsCm4KbPNcGg7chElzXWxxJg5IivamEBzCGJbsg69T1W7TnWgQPFDia0qceZ54aBZREIC1BMLKEdI5/LIz/IddzNvBDAo+kMt4lFYR4bn7OY0Iv/ITcVyL1k8Oo+9jIl8FUEzi6/kWO0a1BwNjcsDquDMGelFdGf1xYO9YvL5CnQox3QJgsFsWFK12SKmmPn1dzAl9zloTHHWcnK+TYBJUSqSitaVngEUH+J9b6v++LtfbdrIo8R8P96xtjlvJeLg2Wnx5TchhafzYBx85HeY/a6fLEgta5Ehs1AS3gYBMBd/f1Bku02GYWfhrVtiR0HXEYJAJlZVFxbnD4mI0L6n8mZbALTEmuVtr/Ejuc4SOtuB8y4B3UJAgfyrrWrBESaYqbiXYyjnk13tyV6+wcDLf+Rorx2uMwrv+SZ5vsLaLKk6+WmZM+tM+UGmQQ4le9ConH+dTX2IDOf1op1TMDx6nEgXDog+iJPrFXjfBKJa+dUc+XPoV54jPAggWhBuAAvFWteUvy5QnfJe7MK8GsOdE0AQA0wZ6iUNekMdYvdz4in/e/kxuYvh48XMV0kZs/LRbwMc8TsKaUWREC4bFaedwp5a/438ggtJsvtfSSqFficO/2+9DXqSiuUEkgwyTc03n8QIvte/gEAAP//ZJ2BbtwwDEPtJL2u//+zW69xBlt8EpMWGIZuxcWNZUuiKGppAAyNR0jlQlEb1mgzqeFGgjbaLTYPzkUcKAVoKtBlb3iigiA6Ctih9SJcFWjH9jsA9HnMjyoMCdemZC9p6VT3TfjKD94KaIWccfBZT/YTPwAA/h6jUMRZffi4BUMje+OZg55VCPqgmM+vigSGPWQgUBKzt5sg2xJTT6jXaA1VKqHqXxJ0WtRHUNBj/zUPNdZ63NDZVPjWHNtAnvesmDZz1tVyMfIyaVJOb73dGBy+Z+wtSRsIJ0IYIO0DFXZE/87qU635ryiP03PORWUzn5fjOjLJYA8XwpdieENqnyODCX43Vs8c8UPvskvko1GBUOLswix//33rUglwIZWSB1Tx1+odTyDkRutHZLGqmUvhX/Q374fMyrJse57nuf/RGy5a/1W23iT2hWgJwSc9yN2qXVTC5p/oU6yKNKPgoPU6iBOTPoaJZ16JVJctaM67i9e4MJYAQM6Nq06v4LpXixF98M2SG79oh/QAdgW4MzFcaLsodJwBHAz7FGNmzqxorODHRv1d6gumx8zvi071SpRhlK45x97vzz1SQl8tqWkBGP7o5/eqLHPevXpolSvYUCnsw2SAnJyw3+62S2NK3+pfm/a9hLniw6UuK1EljamCqszzNwXVT4fmd3Gu9Zd+yOPfoZVa5XPR8RQgfui+YqZusyDL+1pnQDN/NsFV6y3vqooQ0J2Gwo+fqgq6TfGM0aqatmsCQVVMTmkjhPNFy4HE8zIV8JWYWQUy/JJGY2kNyYwRjZ4KOCAXZ/JTzywTqjU+3/cdlC6q/6aKOwrPl70v6JHBNjkyqfdK9O3g9VrDoT0AeFkCW/pdYq2WPQAAIABJREFUsm1roHz9TjAHgGl72A+gSjMxTyonaY/6HT9FcXV7bOb7kyatI7L0AV6vm2jXQCyRMZf23jIw26tfGY0RgJnLfF+zqqD7Rc4Qujm917g4yjC5lw9mAAAEfd8h4PxhQDBaJvLVJMxniemy5wj+dWuJgZ0BhZYe4pyN7/GBVhy08S3V/v1+pG3sygkTNb8b/9c8FhMder63r68/y/5aK4X6ucfYfs3/3hLsY50pCC2NIJIv4rbeu7Gi4hlvCd+2VqKp3SqDFEr4f+LT/mQ7cd9eNi6bVratGGNBqR4pzv1W8koKGH7xAQoIGKRtA4YZbRnd7lctJr/3lqLaozsgiB+mQg1D4S7XWF87ezBBdkTeNFnqsvGxMOfyWc4kyGePBAl2jUOMFrdXskQijqx2REAYGLLrPQuwIiZB4wv6/A0AtcS4pX+t+IiCRrvFaQXEnTpPTCdqYhHzhJW86w54Fu+CQTQSYKNtspv9DN3RaB6kDxMwvpneSxMoebhGUivgh2lcfE7E4uFrAB/HVaKAxAD4M4T4ks01RrKh3e7RF1s+ZvkCWlUEEBr74/v9k/nHthVjlUkPsC2wj9UmZ1O8imE2sn2kaQpJtPZE7DKLPPNjYvpQtBKuu0uaCNjWPIeIYK53Kvsgp4g7u+xnjsnnPsesn19+H8CAhco/85M1uUu2PGNWz2fnmmhr5TOmDkn6SGONwNDLtqDzbP/ZurbcSG4YqFfPeLDHyQFymtwjt17b061esB6UHORjsAv41Q+JIovFqv7XP3//y6A+INCFw7CNpIXYASA6FQ6mewBp8Dau8Om0x7hnKVgY9KQ835tatynNx7ODZlLhjzlAyhoSSYr39evjhWsKMOIpGrdnGMxIGJ3+8rQv1uFx6aDCQafuW6g6fv7OeZ9jrG5a2cTiavX1lh9J5EKn3WUmoBFdUnRvLfQiJIzBryfRN55rb56H58H8iuJvo/Tt9joM9g3oWBQp7B44meMLD59X3z+UzrHxA7mTwKERQv3rjbLQS3UPRPmHN7yWKny4C33z570QdQc6uy7cEnMxhTk7zdHtOjq60dHlQnEsCvV5zfQLDiGgWADnJkJ1q6jvohBilgoiQvw9URhA/6Fc+pkJMAR+4o32KZhn7/LLbxKakxgV5uOCLWLruHtzO4iiQoW0Z/jr1p2ecyH6mAJN9LEkIl+r6bsHEnkmtTULpu9vAhhlasYfTALqEsBjlOPPMUIMz9Ai/1sA7p3+4vEN43gm5bgoUcTM10aZxmiBfJOLOtCgpsPTlf7CgYhWA06mnhZSTLsFNKHqTuVpdK6wBwB74Bqb1uenfIXZeS7p4Q7Ls2MIeGra6yMLh//7gOKLPeUZ+6oxl/DdjfenxKFRFf5yx0L3YtE8dJFk/WYxF8SSqiQGgXyKrSANj6nZU7lBxBxwrt/zzPXrLiN8wzfxSY6R3FyTAm1q3QszJmWXhGey4NoYCFP7YCrgoRBonD2v2cmqKR7z38TJCV9TIju1VjwqZNZQUaHpjmDEbXTbojt782vfpnozMyqtH1KRPnL8ouDcGHHzfG6lKfZtTCODPxc1Q6oV5evyur+kFN00YnHrQ8ADpvpC8IeYM12CiN6LnpPu6CLALqt3dfis9ntgPwA3A6DStD8Zr2/V4F0WjZffi8DN8EI+3/Ig7/o7uHc+o/teMePWu39p9tX0cc6m7m4vldeTjjdr/vJOaYaW8X+IghujXNgTYsBxLR/4YK3NAkX+43jmPoqfdXJk6z5qPTB+P+Bhz/PTvvsG+Ge+GwOmLopnnik/1zz3AXRIBkcJ8TuGrCvlkX5uwoq1/xTx3QskJzserfB+ibVgd4FdOfrcbPgW+MY1sNtaEowserYjdUQ84mZw1KBDdm82wVTH2zu95keC7yNFtCiKWjQ6Y9X7IcCBegP0pS7SsQi6eXxua3Rg8VCDR0uHTDnrJpUp+8643rc0Vm6cM3adidD1AD21Z5wKP3gIpF1vqOQjrsu/uz8G8oJ1zS3/dpwhJZl7FICshf7p1HIio9H0fYLPE/dnMCVieqzvyJNCYDKu4UcR6LgmkB5rKuJXVR4YcfR6i3m22c/a11xFqZkO4/D3nKLvT65xFfYX/v7MdV3rGunrWp9uIhlQOQU0lC2PKV5XPlv1fzCatJa/wq4r2BIovLg2AGrKnz6V25X77h1hjt7Kl31eyRy7ZEXqNWkti6lY/Zb/+KlOORsFbJgYMNnP5Z7NNhU20rpxbuF9cLP6lH7DEvrzWeTmz+PBeBPvPEbazGq7FbMNhHhTkjywtGfa4OhsUZ7EvOcqtVd1a4t0LybrgOZRAubBfg/R6LzBJPvGPVjIEcxkaWIUAyBbs4D6I3fmOWbiQTAv2CHHapY06Ay9xULheczc88pztA2Cfr4mNB00auFn4+dBqF6sFtUZfIZmeawmnQGJFwRsy3IVKBeeifWsOKbGZ/aEHghjVhTIcRaZjZXnUG15ZnF04ANn7Imx1Be73hpHGNp3768vXAfYwpEnA2hc2gCMw50WgTmKu2n0lMXknc47Va88Px6c+38ciDlfn2+NJ65mibYqzsbjIZ04142yXYyYEvFgByM8+uDzw4AkmjSKaxGbw+oUBXzEUGkkeO3s9+Cm5wI9l5J/MqQkDo911lp5afx5b5iYVYpcI9ZLADHQ6Yp9IIFBvFfuT+j6xblbSvkDAAD//2SdW3LmKAyFAftP12Q/s6XZ/2t32zBl6XyScPyUqqRiG4MQ0rkc//7nIoAkjyugtStsLLwrf28VQl7mS7wGNu4v8bAfX+Mu30y6h/UQtXTgurQweCFUpqlA2aTRIMMzpHKnCsTPLoZ+t0PzfBC/v/8JX/FnYgOvHQWiUyuAFXVw2SHp3eHIj5pwFCVV121Vau534DVb7Zvw8NeFIi4dWYIJKp5fUjH9LcswK2q9OjjPM8Ldj2FCOVu2LHSq/HnyneFNw/XrscGo84E/v+Cwt57td7EwY/Mz67OV6pVUR5PKkONWN5l6HQccqDsQGndY/nlSyfhPif9UxVgPMvIiNY9XRIyEHhgUbLTpF6RJpXpMdQ7oQMfzlsNWLMTiVlEBP1ga4onqVetre9+FnQ7ct5Hc7zrPA51w+8ZB16aVIsQMpM0Zxa1FQC5dW+NAhX1QhWOOVnqe0dlnnlinsa/sbpHESUjzU33NVaklTuShZpZCRd43utjdoWzBJTx2zt0q3Z5ETORcOoVqeg5eWI9t31Ad3wFnrXbvBUl+im9T3PClqv0UJz7gcyiGfz5CA6zyTfY5/Z7nv4QACWh4EUNio1kFDrmvkR3WyXQDatwLP3YJEgeklXkePuifT8BOGdiluNfk/sGBiPnF92oSMK12g/YcAXnNdXBLTMwoMeduY8RBrIsr+Y4HFIzonDUddUIo9AWrY4RW6cSBYqGwyMZrcThcC4YXfXoLyyIONiEyZyKZ6bjwFjKsnfeAqUs4yg9FxybIBYQQdI6v22NDDLXgCzZ5xX8klLSCb92gjqjoJUjej/hZuyM8p6+NpCIdhdt+liSYyWaFmvut/L7P84hZdEbDdleHoVmg0C/awlO4TdGlM2NYQIt9zqILQzcMmlYviECQHYy1rYMzEXZVJK/a6lU3hVGoAtHd1XsFjUD7EBMR3rShGPT9yTvqWFVEYnQnlx9wusSSG119OtNDOjYvJ5yKprFEVIiLy1BjKxBPHbhoW6nBpOZGf2njNCFTGMfnHo8DzB91dh+B0hv7K+IN7iKI0wX9I3OTqkVy/b1DL8cLZS9aE2ulCB66QGB2V+v83IrKioXoFxj1a6KV0YJ6EUK74tg7uuAO1NRlNqj+DfVgW65ErLC8pqDiQLq0iMkj4uuSkwp5h0HXRRPMjqzT1Jrg3WMghDjDFSUOexLevIruA7pJxF7Lz88UReNvXOQ6CyYhUolDQ4zNMJu2yFXIPzdb7FnQjmcg/eBk+7NgU920fvK+uX5pup3bIWxN7+gTTxtU4taD9hEoOBAHPe3QLvR5REv4CPEMv7zNtc3/1trWQX9fnleCUBC6dM6wSf7IteD5+UFRobIf8XL0aMYNacDw7uTcdT8fRXy0Q4nb4u7PGIM2gHfo9Z4qCt1CSUzRkm1Pufk5hRoRIj/OqmvQA4mDCwECz1aslxg6iLVLCEJi19BhlzgErWKMRIbxbiDOjr7v87wu+/mQ/gH6YPuVzWTTWzCVfBf+9LzOm03olTwXyGzQ0eGmUnQPfL16YdcsyHWW8jwxaYQ+rpn31XzBUDvlzBNaInp+tAp8P5fThpBzttaIBxIWzP/rc/zJ+eea7X8AAAD//4xd2XLbMAwkKdmZTvL/f5o6jkSyA2AXAOVefImbuDp4Agtgd9fF0mwDGzV0ken0dTDec9MdadKTmGBLBE6apgqihkj9jSZIksv0KInC8MnIxe+pdKkeZvPa3HDKOMHzPVizIcg4UyuV0RwHMOvF5zmURToTi+RDZnHyaqS5OvLjxmpJm/9rM8UBpKy3DRMxNtJShvelk+jddk1ZlT58nE+vQ4w692gETXR8dssW8DpK/RlyYjx45JmUDRubvyx4pmTxQONnTS/ZN6+517qkPQwkQZMePx9W9//9/fJ8TGmyd8gOA6JC/2gnpFCO43Tji2igRmFcy1vm4NQNfZlveG+5vxgrSrTo49U81XNeokPlxdEqvinUnNKT5uukRBTWARaN97s+z3l4xHUD10Zu0t+68MvmmRI7DhJxRDl/Pbo51j5UA7tN/6wbDA3gPnwulSzlsoVsUe+rwbXUIyJ1j4aoOQ7d0U86xUyz1qwVjjUkUzR627trnyvgku5HgIKJKHINAjo8RMq5gia5DjKPoUbYobKg8xhSbuHcWFSX15izLxHGAqmUlmRTTL7PIqfybNSB3Vw6r5WzaSqCR0r+t9UEgsr+pUb6HszONG7X0qR17NnX3uclmKf5XhmkZCRGGbfl0BajuIVqAceSc4MScBMM6Uy5bVBPsPUQoFks8ZBtFPt7LHKqK4Dp5Q/bet5wHmZZp1ybyN/z3XXuX/69g2CThHxH7w4IVpCjrfdbdZQXABtZPaONpZ/zfmAeRYFB0AG+dY+EumOEMbnfQTI60b/3H349daQuACBTlg84IwOp7iZvVS2qmfaIK4A9Pd2ZmR8GihP0kKy8khzinFKqLNHMMEh8BL9rFdERP8OA+5yIfl0bnzPvR+RgqMhEyuPNZpwqE0Dfup/FdUJPv5JP4w8p2gXgS+YJYD/Oy96bn417cEnniKV0U4prd6nDmTJ+8v/RLIVxuq00UUIxyEiPOvwCcHmk0ireU/Y9AT/5mSSPdC4VIB2HkQWPANJapU0YeuLlslblHhpIcAbw0L/376JunCnxJoGF0pZ+hiPRiqt0cKyVMHf/+/6pacSHlQSdIBMLkAaBk27kmpalaeOtkUxNge6+dvL7s/nab+bQa5RWygWrrFFzaFz/Xr7fc6SvOZhZHDAN51jByGeQX8s7U6qZ59NJGbZO0moAKK5K0DxKmu2VDof44+3N06I/3t9f9lMjNG7IogqVFMuWfC1f0LGq5pyY73Bb7nvlJGAJa0c5DM8Stx8xH3KUOreKTNxr415zuydy557BJ7nuXVUaSgpcspyYDiLLDizZa+j4CWns1+PLg4SNspfJZgrQIHhGCrloXCpT7Bcjkvv8+YlxZvBuR8129/UyQOB8Bw9Fll2XQOut3hag5DpPF5ACQZPr39nPI4GEuclcDm4jvMc4ff+JtRxnPZUBghQZMov8fUtKTCjVpVKJgR6brstxsQOuUre0Rx1chD3OrMaiz1880DpBfJm5e3Kz/Z3l4iEvG8pfrRwPsVPNn+JZQn6rgffL54BIk9LXUl+vBOmzluYIAISgw1GtD/J7KygEP0qVi1xNASWGX0/9DsEelUUG0KHPkgEfCR4+zffS+XU9L0spvwAAAP//ZJ1BltswDEMlOW6mt+m6t+lNeu6xLfWZxCfpNO910cXEdixRJAEC268/v/9ik5NiMRIYumbMHoA01wLJDgjNJd2tCTvcLQHxAuGU8mad6UeQqoWQ3xWJ5lbm36dUKl9jRCfkKh7cS6h+Cyo73e4MAjPm01xLwDspCCCkMv8oqGIW4nnNbDrQqSodQFRpN+ybspgkKd5Fkb1fnI1K4Ksf1osvCRKuoEl1JSp0jZgj8sW1gqqF7oCNUJiAo3dBSRQM1UB5U93IHaQvVN9z5hWEDRVTviuKWllt7Oo+ce9GuQGJUjJr3b/B3KgnMj6HeT5onK2l//AD27TE1O8Ve4yxJcuiFRSrR4Jafd670QhdvdU3t1l7QKkpM+kVhTq1/mrXuyKbJP90mjNoQRPMBhdI5ONgerlare2XqpyrGXMoaqE2HVY3Ll4II8JFkd4hoEO9kZQm7GaYjcPrP5NrislwORDlmufZYBNAJZv57NYxPb8jocT7Fy0RDpkhpN3WWoiUXD4fhnJ2mZ1EKIVQ9rYk5ttu6y1KfsSiWgCX+JTNBI3WiHmAXdUPjUl8HyTgmaRHkit7u1O2YXTAY81p//YoPpeamqgle/OG37LeG03Wq3RwjyMpeLALgs2k4I6NVo+4V+b6y74J1GVsGSsbVpoZvw4lz11iOTTELlk9+j6/4u9BWTfEt1oSHDiIOzPfjwIpO/r1UP8cHK0iecTB+i33ujnFSHOkZWRRWhkSQQNIu7zVWghtouUAQ+f6sO3CBnPNRNAua379FDoiRFzrFpFEf6RExJhdr/RzrKX4xFlg6MGhuV9YUmmhVxFE9iHOFUvNt02ztrWh3UcvzKYRLBCaXjU5irNLCu73eTV6Cmt6AjgjtsyZLLteCud6fYpnUCUSQn+PSzR1FJYR2upROOyiN4K+1CY986tXjLas2KPubuTvGYFgFi1stl6em/VY7/34+C1BoirDhMX1BAY89iDW19SMdtTYtSvuEYB77JKiqPdsdIfI1MjxNNahf483F495BqLZJTg35IvOmq8MPOL0Uq5xcb1thBp+FPtaa4ysXIoHNBFmUalvJU5xn6D8X++3BPWWW5GK9bPJprcizDtjnmEj5wW2FdkN1lfNwXBcmbIe/n40TJtm5B2NxX1oD+Gv/b2zY0MtfRQGwD2e6ujgXgrh0kTuW7z/yt7gTDmkI8EIJqgh50H4gU+cdXZ7t9i1gmA7a6GuORVA25NtFLFWFPaqN8GaRWK2d+wbvcABjHABzPORVwcDsmrYRAD/n6nFxxr4e4qsBqr/4WhVMNzy/xW5crgiKMdCBHxTTgyj674/szXmjP3Yl1j7BSurpT1c1wilCeBpfbwUh2Fh8N6xUa0MNvSOvMHsGhyXfjMAtLWw287nqKKzvaedYTAbZVdN8V8ZDZWplM+ZzdhR6i3O99rMO6fnm8TIVvaW5cgr199Tr0g1YNF0Yvzh1rQyyv9e7W5dzNv0e16pm3Bf8hWCyCvYxcFEHf1jzVfgbbYvWXpXUASAhpi4SfwRNsVTmyjdmQL0vTWQjsOac8QhO68QDFb+YGMeAlv5d8fz+5o30O26G2kr6etUY6JohIjVWIXQ8/dnTFBrVBoVCFPy9+xxPz/9Y/bHxubJM9KELI2F5uKObbX2DwAA//9knVuS20YMRZvd5CjOavKd5WQlWbU1I1JkqoF7AFBx1Xy4yrZMqh/AxX2Mv/75+9+bsZYW1tR/gGCaHlQvmgniKm3BouJ9Uv7nJnxsW5hYhDOq8n3t5R/nzQhmfg6ZiYuoiryQuTkm4hEmIe8zwIFK4a0NICBCuJnSmEE3H06JnIuUyS+UDqPCogURtaOiMBRW9fKBpnpJs9qE/ED5D/8AMx37iQP0ksmRu5wnApqa+i9R//AjOG+HrYECYcxxmqbm9/OZh6ymA1NTFkCOLlouCd7Z8/spp9kelySNKAutiwaDIUZoNZd0On3KiXtX/r3nchOzcY8Do9CnCZwH0Hx/X5GKgMnSoqK9Flm6hNXo1oaKHGy+p8eWOlco/FwkV1z6zu7wte3RjL9McrHLFAnTDD+A8YUwIOnlVBzyqd8lTgk/gxbTqx70RxqX1+tbGelnpBSccoTl/4Uz8a7ikWmPrZm3iuWrRWTI7aLSPtmktU4pQK5x8ubn+wKI43AkzcAOVdG8iRk7BSItAu04pI7wmrgCVOiS74DgGtVOjQ1nzlGoTNuWbsogzItNaN2P4keAwBKGev9HN+1zxpYpFiO9TZoQUUyUlij4U+9npm3vIxzDSaOo+59CPUA1GdHwHdgaCq1mFuNDUXumg5wI7dVi/SLTMe0qZlX6ZVOE7mwI3/d/3t4PzRMX7uikV6yu6duPW9OdDJRLE4dkjsT3wFmvbOpWopRG9/Nlfx3uC1DceH2/TpqtCh3kMdImUJCiK1yk566If/sAADyHfZXDcZdHQgvj0dTa+s+u9Yy/AQ2naSBLbCpTQD4XlpppJqE9A9TI9MfPqDz7512Bf8si/TcN1gQeP6dITRMswOlT92vSn88obM9IS0nXfyjlSF/wNqlFH+AhxmAegVT8GMR6OQRYOSiYRRHnazT1pUEy6vI0BrUhwGg/+0umwTKGnUZc+1sGrN3orl/bFhGq6OgdtPB3gFmWxY3iMj98WuYAdp2oXsFk+56MOZOoZOQqQOsajVBKBU41h9U4dn7m/HeYZs+/t829KRBnl4Ny03l7XSkDgA3pk+Yj4rG2DdrsCNfyLlMyj8pdYyIEM4/pllNc002e5t/lY4v2U48IL86wJnPMoI4TB/Yht4HKyybjvPaJ0RVNHo3JViKmABKmhrs2FNzDAcIz3JFJ7uPxK2RTAPNIIbvqswpMTwBq+QBlMNqFLYkp3VIGK2PNhA+i5ub6QIu9qsE+NIzg3htlwjufkVqOumjeD9QWvD9qsPnEfpZfSbtVPXJjapw0Gy3WJqkfP3pXl0ydH9tXSgqXFvF+azEiA1hHOtYUpWbN2OOPjGctw5El7qMcoGFIOkEa9qUZ8YoCjllvPmez6W2ar3lj4aCy3P1f+R1fMHOOPFd6iWf8lJucca+mbCtbwcz1XyQdmn9umvq2MGwc5l/UCpvnBozKj4B3Qx3fZUge0qGjDPWUFNY0mLhN0a8rzwXVf6sGYwww0OzHgHMb5YLTwKaYgwcILpbYLhmyrWHSler9eGNHu0Q7fs9PeX7So1iHxvLcj5sHGfUs/mSxHgBNxhBlPWOcQ7vfN/e+wpdAfg+r+dNkvODQcOt8wygV7b5nTHucSWUYZakO8tJIGnyeZ3hI8bzvmwGrg+HVhBpWHoChgz0pw4mKRPvjE/hyxkg3ECqHbl63AegjU6Gu9j5ACXySgdlZXwxJvU/yGqGeteyPWIdl+GzApYYCPBPSN/vVWvsPAAD//2yda27cMAyEKT+C5jz93dv0IL110l3bKiTOR3K9LRCgQICN15IocoacWX/+/vWnbgjmaS619h7XqQKsx8Ei8KCe3eTzOz+4Z5FX2a4mhPtDtiQsynE9A3Xh3dYWrrW1YHydxZAPK+twQ0D5W7xQ0yYgQQ8mrEt8S0XRvm3yf4ZV8+Qk21qvtwuuxYyitxJNT3YYIzHoo9AZIMZ4PyNBXGUBt0S7jAr7MnuKcjizJC8IpphXLruuiwSfdWN2SgDAcTK72mO+KeMV4MFnoOpYezGnOWaEvB3vGYFiWdJWjpbvC8VPqc2C6p3HMxLw2uZIC24I6ASzlUJBbp3mG9aLHFifHsxjipxgW5fFv3uCy35PQaVaxs3kuqDhsaYStnFRnL0ANFcUaQQl2tLx6KXAck//04u8pc2WMmeDk2me72Hak32oJX6LOanw/S4WY+wdWjmbSSBmd6bOA9b6cua61qWX/VkvCwoEVKArgzOedc6/F393noWk8kMByEEQvyA4y5suy0VMBXO5JuVdkHiTArBJHBQEtu5FWqDo+Algrvig34NxVws4gT9tXLwoHgrkVt4XxZavbze7AQsV/ENfIRkz+UlXFe/NRQB3gVBHAVAtRMpSZChR8YyfV/lucZGZXw7TphVrSO3bygRYJODumT99dgN8zbjJ58Mo5/hQAo+AHYZbAKrdtoQ+xVo6ZKwnMBXvp1eR0ds89a17Jy2l3nKcXF+znCEva3Tf/1OMSUKfAHFdoybHRUzz7/yQFe6mzg9cPnoBS2C+FgkI2kyIHcBcpZw+WgHn/6XKj4YF5/lS8UssH3sRBpdEzPVwUOF3bIOOslNr7mNXsoWFxKYdWUCOd4Ndbn3Edyhq9uPnk/nyYmHo7GuL1uxg7fj94kKstECP/TmKaDQZZnzYdpED/rkw3J5HLBMknlo/+xZuG4ylzViorh2zjM8UQw0A5LrEujzm/uUegO0HADG6Bk5n6lyQ9IwuoV4AT9xR0B8AEKqtSeyxeU/GGnv8cC2CFPOl3R2bVRJl2GuSykzgKjNqERcYVcGeeRQQg7Fk/wYwXBxsNrW1Xjf9GtNz7EoSF5Sh5YjA+eLcjLvth7RUAOnrZ93jL8+M3gOAlhXrXh8z2SfbNp7/6+u7jPi0F8FWWpPpIgFQBtDf0Ara1mCF58jdUQiuqolyuYsSBYDf5Wt24hX3imToLtVQigK9ReEGIDT2MirntVCqbjgJYiV713vOO8cZ1WhGaF+p2DkEarSYv081fitz+9zTgIPMuuc+7m9xmNzvPM8ohLkfm4g4Cr+v778CMqRJoZGRCZYcRwh30wmYsTqfN4S3S95v6L3o/sAGsgp7AnbxLLCzpo4urx+WbLEu7lnRMSGNJXJb7p+4Yfr73WJFpb3+89+v0eEEgDb2IEDS6Nhkbael3fnqMLCF88T6sg8s7pwiolsYX2JGaHuo04tRg9o9Vc9rl8sA9+LSliBfuPOJKzjvEKrIg9ocBXrM0YmH/o7n3im8l+LqS9RLq3J0MQHGLP5TNQOOcAhxf/zvfYmUrOLpdX0H0PCoY6TqYAM0oMukfmacKb129o+Dj8nak4+9Zij/pzNkAAAgAElEQVSgDx6nJpAsC9cRU8ZaMA4BGcwzz7MmEVH2V7izQMrexlCq81Y9DyPmz+5Nid0C9FGHzfjUFvvH1xXl1g3DMMtJ2m49z/53m11j115fEg+WSFHOgKUoUBRo33uJbUkURW4/fv38zaBAtJRiUIHQRmd0FkIVUY4FtUFlsydthf+L9grcBKQsNXRLqDD6AUSeyB0PwVYofqJntJxR2jA/PAqFw1EZzLinnzeQdC3+ACFGAg0j35veq+hvLWnBa+DkRU96Wv9tSDb4v4NqemQAYeBJsAI+n6QC8cE0JpXXSjdkwekBGYr/9GJN2k8BAEhHD5q7/Ffrp3SlWXzcoNDBhm2LxI7zoNHRFlBgpFSD3cHuY8suxwVAZM9nMJ4JDj7XCeDg5ZaQlkmUQS2Vm5eImR7DWh6Q8sgiNUYmDGDBChKxwBLAcsOWBQcYgK2k5wHNnWt/JvgEIijyGAGq53roSHAbOn3qrFthKciGiiCGd8Eww2cQOyENm8+SnZvZgWmgPdXxBX77WqH43S1qWC2SouMjrYuKbHbOWZ4FFa4AwLsowUweGbQVtlioKWkUtc+UmNkqJnSXGfVc/6CZOQJOBeJy1aBJGvuANgOFrub5QIeHSemW8J2SiUrZr1cUMFi/XWwO7tOe3eMd93ek+BH3IJHp0WQ3lfZ0xQ+6PcTGGs+bt6N0aLWfNd5DhDv26AFWVkNRyHOwobsxmQFxZlaAat2jX6C0tUfSP4YErSo42lK8Z08r0ej0nepU5vsWAECBunHLTvR/131bdktrEczLC8ypffHtw91I/Fx5i7OldZOa8CULuJxXzMRFlGdSoGeMfIeCt5+ZzQDEfSWN9MD8KM8cjh9w1rgD1AmdlSjS6xkZCGC1KhwJTM5nNl9j7muyzF44u6yICjnwAQYYrVC1yVqyrk7E8yrYG+fBGdRqdEhfSELYcTQABozbpOE6XRUK2t8/P/PvOsbiwm1AAA6BTxYffAZ73xGL1AVvpnV8YEyBnTUziUyKCai5V95bglUdcSVt89CdDzGny11nvBFwXklfrWvMRget91hskmeMeMFZhSCBYazCQWgU39UF5UAHTED5QLKKvXrHGcZunGEEirPpFMRjx5jK0FrLD2YNQCADkF59wP28nD+jK0XBVc4Wb8keWDuqz/xoAkssBLzIQkJOLQhD7N/xnK4rzssDtmD1PGTRnxad6EwivMAq0WCLtefYx8IILQk+GVaczQ6tplc6tRCgGGAiWorHPQGaseSNvXSkT8T2vqmJQAE/g2vJ3JcE+DqKxw3AeNCIiwBo37IYO6lOj25IFnZI9glasUETlOwHSN6upEi37JzLOjIYLCNdFLr1JUewLoaKMyn+fGXxyvjzhvODxZeZAMtRBQUxmkkh6g6Rwsn6IyW/1gexhlX8GDRcamf1qhZ+vac4WkczITVkyjlW7069W3wNxoJRRNdaE/ChBqiAbDJNZxylQ1rYnAqYYr5xFgaM2ZO1obXWUQDzmUyA7gC1mzVXjDD3Ja7UPWp9ZTJaGVdtcMLpEMoOAPeVDR3Gyni2+z+WidIaGRrjvq/UvPBaZxMAOX/nMe0IRq3npXRdAeOYuYvYtGfau6pBKUo+QXQHYd4O1yvb9xivnI3Z6ZrBdYiQWMZPVnCAYoDRmFub3LxohejuGvMLI9BzHbOpxWt+zvmePLc+p+tANMMDMFUOEgBN6AexLvN1gnjPteLAugMqcNXx2jnufR3v8dGFuU5aa38BAAD//2ydXY7bMAyEJdnrAO19+tzb9Bq9dhLbKkTORzKLLtCHBRaNEckSOZyf7def33+5TEKbYTmLT1EwdNmMbMih57nJVOpR7bBS488FPBSbllS/zGn06Cp/+LUYq6kCqYqJIJeZDiWXAOi0bB6BU5uacDrFQbJ5kRcu9VqES5TAoFuK0vx8vj4WicPJppxfhzaZTFuWtkf0WGhp+5fHKXLIcEhDbXS62VsXeIvJBI3rLEYbfsGMaKbqRsuJ3B0Uwk+dqV9y67NgXEC1q8TarmnCtuVlS/PCtLQpUmeHlq5JLXTvTZR02BSVqnOLRkpxUwsFkhlaSzbGQ07CqTm+QvPSZTpUNadcxoACuEIDfKxnPgQaAUwMOXTeMSEqLunhAJr/TBN9XmpIdECq6ljfixkNiToe+/d2TeouiqdnSqcBpCPh0yJRTMcWEoIrUNKuFIEz3s+vaOZjWoxO3cwStygWAsVEoy7PA/TiXd+bAX6hn0uH/mhAryvW/Sj6TChqU1MYnKq7EO96cXkEVsYWhVEQpB+0c7pUrNBGdx1UuAKo7V/ptTGywOccYqpgk7zjIZpoj6KpicJqjIgoQnpM5NFd/0/WSHEzpQFEEtCkwW4to75Ib6gI7VQTmWDDHsAhn0fzbfumZiPzvr7e0bReZx7+g3dUTYNTIMlAP+xs+ywAZmTgkjKCxKqRnKK9Z+BObS51PqXcIdk4Q54xdzHrA8QCYr1CHz0EAOi9jKhH5eoWGU2cfbdypmb3CDSY/3XffyuEHT1X0SHq6KxO7py7Ffhde6LoBps8EPh+3OX4TLBZxUx994biCI3CrinEGJm5jXGq3S9Hle9sMZmsa88d8TLpkd8Ta22rjjRZAzMYA7sYbk9NXMbAPCzpgy+Br1EMia3zVsMHg4Unck2qvt/3GfsPzWoUiTovbxUtAIgbuso1HRGTpQmwwiy4S39qxZqANSb7nKEwPNZvL2NHZfPDD+kKFPAAMkjREpRr0Uj4w6891s1NedG5iX2NaDIkEUEtndHQsRcwziQT/Ip0Fv9/ajxaU+OOh8q8Exwmrx8w2wwtd/9skmUCYDxzX96FHh40WfaUpopNQBy1FlN4ZEqttShsTTtv8XQ9JBlVFlV/VkN4SX6zDY+rrGbGl+SkJr+U4RtUWO6kdF1PjX3v5OjTDKbXEew7YtYYTqF3D3+J22unQ7IVpFLcl73oz1uYBec61wFTPaMu3ZkY5XnUJAwvBxO2Ivu0cyTi+LzI5509RfknxWnJSCnm68Qb1RVDNxhZszS3nMVdzIpR2HMwHhZbzc4h1fBzEvnZg70xlFC11pUpOHK99V09GFxNMQ5mCwlU+FkNQK1cQ8zViEbj/EIitJ75FIOI/XDKMJVBIeckwEelvPOu3gLPPQbPc9PNLO5bMsWtFItPsDobP97XAF5iir3rGVweRfLCKHUld1YmHnxKH2KtSh3lgym/b/FtYAgHqJLPJ+33vgWouO74+xtrYUV+utfLK9YlJTh+DoTkVayQrTCFuwDUtxJ06AN//vghgkmPGp/9dqnf4vsMTwnV3zS0p2KHTQpzPD4YR3FPyufgKS+Vyp50FpOD7NZoa6CdhXHCYRX4ofXXaPgDMK02e3XN+PE7ygETk/NF7Z2fxR257jj8JQCs+EOGB2a0i6xw/V72I0Bc3R+rH0XiikTPjJfFRqseSL319g8AAP//ZF3tjts4DKRkO8n22qfp7z7Pvca99XUTWyo4H5KyLRBssQiwtmSL5HA4s/3899d/uMAa8qKkz+sFJeo+0FAuW4rScC4rf+5KeOpymCXiywDHgqkpechEPLv/+f1EecL2OPJ/TF/P3/9TQCE9IFsjdXYf4mcHgo+LPSrLP0iFVJGRydrNPrsKzj1Eudc8yYkupCiwQHNE7dbCOmgzUNSovYLmBf/+rg5RaNQhg+SmolDfR1CCx3pD0rCVPlA2CvTYLrACfTLS5qTdFEQiQRcTDt2POy8bukZPiuu06ZkZb570/KwWEBT6aWMOxt1VFxueyR6z7Ql4BL1SLd/1OmktcwoR3ovVbVWN9vb26WFBo3i7thQPQrC/3SVKcR+z5aAVAzXLrvULXfL09kUXUXOrIX/itVu1InIZhJDQqHPRI4Z/uu8F3csQikoKBQO65nHbOSmTsG8Zs8J9JAVFXTSwE9I3W2hn0dzO6ZGFMi22XBjl/f7z/YfonEVe5CyR8tls7phJ2OYclkeTn5TLfaoQ9WHQWx+dVPhEixaZxdL9404xuXbiGU1/2b4EX9srORma1+N17EMEMgAekYaf+7hBXKlo7rFrJjwGjXAiuBMxHxZf+xRTGgj7X52lafHogi0qPVu7NBSsCxHo/lS+q+qQfKXBsSjxPGIMlxAwm9GBbO+hwJ2y66UOTT7/u5i7Dc8LvVjVMcmz77AXOz3djfC62xrRliR2zna5214d7F00WahTQfS4k70z3vNFhdmiVln05Trn89mKRhtUQ9d64JzK5+1SUvP4+DZ99/eK5wQdpCw4xYrpTsCzyCiai9ZKvcAW6Xie82/34PtbBEA+AXgE/OCvZ55xm0Yx1F3M4HeU6S8dBnVinHNyGB+A9bAi1BmI8/HxIUS+q0PGAhIMt+Zk946gaCCNZ1BTd0HOC8t5WjZZhomqa0VjjHZopKrJycHCdAD1MjlWAdtlbZngzkNJgqm/ZtqZIUKb9DbEowB+CaiDYr81TSws5m6oEsRN4mNFonim6rbr+ivBtGDlSGaDXsm2/Zq5Y6G2TOP7Ywpw/qRuygVq+hgfWZ4PswaShYG9qLy+kFuH6fjMF1TMPm239u7O4/Pe7MACq7yPN52aahk16KVcOO/ygnK2nk9LxWvetKfe5+xUp4fymXPXLZSEcXSpL7TrlSYf8vGX2Th93QU+EcQ+RgFprQsKTXac79RnqAOIzX/3/fZWFNwf7HbdpJnTMD9bKBYIsbGd67WM4YTnpcVWsUgvfp/5TgpEpX6P51o3Ao+HvOQt+hmyqvOYyqnudB3nIn3XnTPiXt3tJVWUnukAVc74/fyMb+nMI9CxSKuGeRHjw24by1hHOadg8YwNX8XTZP2bIOymxkeO4n1+Dl/+LrAm193gz7bMNfOZa2JpXmOkk7FSbigeX9PeA+TWO86/08nyw3cYq4bVW1l0JL400vJ9BrMlQcxDmlga4+Qol2JkgnLQNniOrp4ZNLk/z5OaOQDZcA4x/+HvtsFGdSFmRsFwbdC4HpTRsW88+62gf+r56+o251rltXgUIwrjB/dAwoSK7QARmqyYCwXzQrHI50X0qfOQe28GIAXpjugXAaKbxn2L1hIz5SqcVkAplFdPG2Y2Lbss9VRZcT9UE3hc8SuLBv+30HPlvUKzR2uGe9xuaDLA8UMFpd2UToAdRQ0NCwG/pB7fh/L+mjNhtEhMCLCM8jlSMwd7IN2oJsA1RS6r7C5xuTuZCLvHgRtBlU2jC8V1BGocFpzQodC7db4I4ORZc5MegC1Qi0ZaO9ymHvhO2P59AD4TMMJ+ypKOt9fh1FUkvMefBXlCk94c3h81DnPtTvnjh2qUNbcJAQSoZyWU7r8z8i6B+YgTfg+XT66fgT+yguzcwt3c893L+JXW6wIY6C4ie+xTjdpsbL0oqugGkVlKPtOssWegwayplWXgXJxaUatNKZkQXAMxkTSK7gmLtUEClngt8QcAAP//bF1bctwwDNPD2Rwo371Oz9FbZ5K1rY5EAIQ22Z+20zZeyzJFEg/2j79//s1AM6Dhn5si0IVEvsOZ8Tv+/rzUvSRNiKjgKnQRvGJ03LFc2Em/ZdJOnd88xCqCh+sG+YKtDkV3+nE3U52mGZrVaCvUx4iGii44HSx/m3lPdDE6WqnPXhv2eUl/wU4NUaB5zVlQhSNkTg1gkNC8VVKS7zT3KEBKNcuRSPhlGg24zDZoZyh9SGOjZEKUH8VSfNjd5kQGIiAeWC6Y1EivA3MlMQYs4eJ8VaKmBzYZWRRTysFObNxbIs7b94RJln/nDoOt3NhxuJxIbIQOg9ZHXaX18XSNeFZv0iAnis/uaiSsvfpYyVtjYWYQXp4JJUdjsXvIA9MlKvPnLxr1WxolzXVctKPPT0P/utA3shZcR046fhaENEijyUqa5lSiUi31X9lMQvOn7hQldm7JwAk6aSShS7OOOabLwfh5blKLDOSgYN7pCLwV9jiEiKDG71PvzwTK9ywPY6Kt7FR3Q3h0gKC7u55G/Snr8C5wxMPfabCrMXgk7XlAS3qeSbvc4lHNePiE+cwsFgechLvpwip8OQZYFI7IilaK/eQdZh0KQPOW2R0oeNXYKokkv4l6XjSmLUerHmYCRGR2e16jSn5ECnZQfLtml6vnLdS1CO2dzUc59npnHs87Ovf3SuovmHmGqzcdydEvvCYLaGpexyoKZ9wPElNTAyAciSGh4heqeU+lJHooinH7GRNvoOLze81iiQa0DfS48nKGvL4/MhZDAk+6e4FJ10pcoGnnudZ739amoHwc1P/BuGxRWMGia84AoySmRLFPeiXp2iu247nw3PFGXpx/XdMNulGS/Z3wGF1wNh4wMiMCf+JaN/5/M7ri669VDbhk6JHGfmPKCI2bWIBwn1SYcuoao7zEmSEJxIBRWKWvSW+aHqD7qdF4pnHpahIMuJtPt2aampVA/FeyTp3rSo5zXZrSxLGtWUwu4Nz3A+9whwv8JckQ5QFh/PiQ9IznEs9pInyMF0SDeC6vN8QkH5JmPR7R8OOEFWrZ6UFk0xS8cf54f1cDUhRza0yy4USKttPBqV31feQO/9w3nrOt+EmPBZmeJUX/NAq8O5APIYr58X1cadIM9mdDztEYp4ns1xwnlk2lG/H6xrvNZLqkFwAldtvYO9trSLqZ9hAxpg/Hcxn0vUeBfF8yIG6NINDQRJ7zzKlEp7wfoiCf+dd5hXFfq/ZOwxgwZWZd3iIF0q9tCgb/3XFon7L4lVyG1zcUWdRysOrIOqgoVFZOiRxp+pzQU4pGiFlu8eft+Vj1deXEG+Rk0QQKKv83ZFQs+ud6UnbEPK2CBeD5KUGBTgazmTXy3snmHXbPikMWJ7X3UFusd/TgrPhkalQyOtZIxQozUPgzaWrNMIPEovUYGwpODxno4WHoR/lpYUPWZAk3vD1ktA1pCMECro0/8y0/sbXSmtpnUtDX1KavL/hC3cor+d05qpMsk5y/Dxf9SllQNKrDfLsqDvL5ltdZ+WIvJ0urFmdQcBwh4Ox5rtjee70X5lA+IS2Y1QB4Zq4Ao/SQ44X8Ivy7ohbNEfkRY5JhFMyLkETudcX8xAS1PZ4wTxCLCWfeZHbw3Zx/lg+CpFdxjWCBAcyca3bf5T8AAAD//6xd2XLbMAykKNmJ44f2/78zsTMSKXUA7AKg4r50qk7GiWvrIEFcBHYXVThwlgicptlC8n0rxdjmmTeCBSm/sCrIAqAw0CIhkeDlQlC8NDKPr0f59fuX9mLQQGT9ySCZfPmadZ8qym2tlE8m/+vzUwX3zPPL62THZhBQ0BZqGZtkYvYQZCYpzo6MBrrL1ZXdcL7NSreF93ekDDQu4HpEP2Np7QWvtd0r+V0NUXV1RMzhs+gdbQiCdfxRQpedsMPLjXcgewfPNYPv5cQLqbRs19k53a133ErV2cfeHB8CAaCUB+2BeC4LQK53v9/L8/EAWugxln2XABMzurHm5XjkU+c4iCN3u11xvaCJ8/GV35cAeMo8y6Qtkowly911s8edKWA7qHK0O3NQF+6OwIBxvNVwdQvKFrR1fD+eHvxd5ur3yiD32CZkKy2LTic1y0+eX21xOB3cmVtSmwYV002qDHrxtVhS0JPZLzhnqiDwQVHM8s97kmugINscBZo/526afu4Scm72PUA2+b6UGGd+ZX3dq5ces03Is9+Sye+W1a0nhfzqkDHZzny82UEpUYJFRazAUFhbBNkjbZcmzKax9NOeO8bFHf0S/O88tOyzRUmevi7zMAd5zEK2UYFx5B74wzlhY0xDf9Qa1Dz84e5zO6wqhPLEwLWfdEpPySpWEGx9M93F/uUWOsyd96S3qXOqy058VsegT6g8sqw9dwRVv4lRLLJjNpdrmctWmu4iTP0o2344zdZuJ0R2Hzs9eo8jLdF6Gq/L+5v2uXY4w4gtjD0AQ5n1ZxnkevL1w8NKw628j+tIfhe79nH/cMfEEwPpfBqol+66Vd6X3ZXMu6/3DDBPk9nFGQpyYlqZE5KumOegjlMbIxVWO3AfpmiRU1lEUuBIgIP6/y/spa3n6u0afJbWg984J99mUGxGLygwD2YmeSOgFAaT0/LB+uqDHSZ6PYPL7kB+k/eflkQXSraD68e99G1kd9iP0LciA1J/snsUhDaU6CKxa4p/APyFMnFntLgsxfkLPocgolhwd5ltx0crPt5vakdkp0vtCVoALkvmqzZ9wEAzO/0E/GOguK7fP+bMSvU3G5v3tx8JHseXIV0eyuzleyLfkjh5Ay7EGejMg3S8ij9APnNSnZ0P6jeZszfZIGjN5aei+muuxMAJe+zUnjVscvbrMoc6n42AawUAucrkcbvpWJHlhM+ttpSgwzU2b5iob4kZJNZDOOmqa2tgqrxiosmyJ98luKSMo7A2SQJV1uLX10Pl2Cr3Fm+DM07yYH7Rc2HXVe5v7QbQKRsvISfcOZ51A2uQDeAHhC87DTbJATGx7ttGanCMM+xyDkooTwFcZvq2ql8dQSJ14zgu9fT32Pde0GrEXW9HS4c9kgrdFe1Vct3P51OBKmWuVzAT8bryHsd/BQ/9gQRZfp5zIPivB31k08l18Lcn2sH+l/WFNqazP0hg1CxzXANt2/z7+aBtPjwJWB2seMa8qa1PtIIOTJeYFEpqD+U6mJPdrFOwhsmP4uCIvkv+piWXyKCDyrN5Ufk1WYuWYEhsBPx7tFUpmF4dk8uv4r3/eRhGWMKxQpvjepjN8c0RxBpiZyUeNgYK2DRUCzNJ7O0RCY9LYlv5W8ZPY/AXhwIYoy2TyRi2eXgSR1tnAnNDKzLUh7HYe1mW8gcAAP//dJ3Ndts2EIUBgpRlO3U3zWtknefpk/Sxe2oR6MHM/QZDOdEmC8uxRBKDwdy/9uPvn/9AA2cz9Qk6BiRFf8Q3p4fMbaAm345ESZTWlilHlxSAmxw3dShXUnmPliHfVs4lE04vLp+XWCQ0VJdp8BdjkJRZXpbT8hgjHpgtG+0MGvzFAuCNxPDkm+WLQBFL+4qHyy6VawhxRUhYrAUKlDbDXZqvnJ/p0TAjDCfAMinCphET8yCjV88LIk9UYQL0TrzY0iSP5HxPnFEvK0fbaMTzs6UJ975dEaqiJnwOirpMcLa2DlOdiMDMLpDuBzMQcsi3iK9zyQeTUQqfx1lkVHfl1x7Syx/Hy+Wa50ntSEYeMfQJdFEU3lRgbeF2YjicCr0nAzRnAzwCxT7EVNilLzNqHOZNYiUElT85TjflDlux23LGs3+u3pNLuBpHJuNzsAYV0HSvmyOup9w/Iz90sHmPoAUP0cVZ20ZbE6OHJVFFoYumPNGIc3MWgzAd/C7GhBW9d/ehkuhgIAK7KI9GXTuvOeVN1wLEIZrwJyYQ/6KJX+hXctsfXh94/7wO/0mXFQhSXUahbLYY68zPfr/dQ49qlHxrrmRiKeQV74J+ceD2xgkEimcGTfKKm1qbtd0PpbKAljZpirMb7ELUWtKx1vBNiMYHWr2uAf4TvHeXJwJ+LyUhYGvN5/zp6wt2TJVXgBmrmXxC9fMxSjtreW338nF8lD+O9/L921/lz5ePcm+3so/DGthptKbCVxL2L8lHizi854O60enQHJrczDWFhwYh9l3OhYygyfM6fkZyTEmNqR0o7mq21ZQbHVgGe5mNQD0pyp03uuy+3NZNbqf4vYXqLEzuU3r5jsFt2xX3lhFW0iYcXceYqeow1BTxd5PjMeg/tEukOeuaXlEHq1s2tNwi3tfqnpho51hSgqLGsejee+TXMgMu5FKLHVTIgk8MAKQ4VZF3ziR0U1UzLNS9KTH08CEAOlX8fhxRPX0AQMPK3prTPBomZrN3cbr5lA0adXVsZe9tqoxKmz/TnjTEPPnVq6Z8e+unUsZ1RPulqFqjbhqN9DOtLT2TSYNcxQiYNef17c2u10P7R0YXW1t05U3U5diw9II9BesKr5qaGIgMcR46ULdk/jeSBACWA4Zn29MBxD2I8LbwDgbmng22+9Kyn4G2laiH/F8MCArAhXitGZSp8mXKWd0MXyfLlete1At5jV1PPzXEENEwTSuRvw3D4RE9bYsDdNR0vHGibqxItDPFgMIYnQwuaMCLiSaJ3XAEl2fVBoiqCUhIXnWg5TNQ4yKtq4CMLjr5Te7gNTEA+rg6ygeIlCLd2PPyiyx8YjD5fXwLZn+C2SF7DmvA1/IV4bb1kg7iVS7mJDx42liThPhhtSmijyOL/V+7fi/JxDEPbbiffM8jtO9n9BckJoCYd9WPK3vPoIE4jFdFt1GXN7GJYJGNzoCLyLb5HXx9+cCHtLMtJFHsOcFCeDaxhmkQgMt1D+Fvt+ST1Yie5Fykd4PEMxQpAYKt3n2Bi1/X+iDBoa61NFL/UStpZ6tHy+kj7B9dKSwbg0Ol0MAAe2hgyXluqxmYHZLv6bOOldAxCqkOIxIJ/DP9fnBgsh6eIfXHYSI5r3li1GZWc5wZNeifLx+onuX9/c37SEmnLfmBvkDrd/4A37M8nOJ7YMQPsMgzlQcw/sz52je2Pd4x2ifHGOV/AAAA//90nUuOFEcQhiOzqnqmWSCBLUssANnCIIsNB/BtuAhHntXYM92VaWVEfJFRPbg3IOhnVWZkPP7H8u373z9EEFMrHlzMv52iufsU8sWLXdmSoAZMCj99hN/uHFaGtzw8SRIm5cO4wwAQNyZMawQuCcqB+iOKhEIphbxRC9a4+Mqb3ps8Pj7q3yk0JSW83TlZ8E8kwcdsgrok/rhbmYnbDx5EVPYQ3IOfpLD1tsdmisQc0bwk8jALpxp0A4NoWAKB9y++tYbI2DGgCWh1hmpz0Eaw6i2ULHOhRvCFr4oifznAlo6iSt1pFYsXhRRwk55xcVEte5hveQ+lTtYDwisGSW0xGQPGbsmzc2MOiJEEW3SFfRPeOHkhRFJtKrtjDcAVHdftXicjcoCzqZoyCv4UsOn6DUGjWo+frzAuIE6OZMALVNdFu8Z6AifpiyUAACAASURBVA63BPx/8vsD+bKtoQofcHmHppFk5OBrECrjjAEjXJKydL9JVJvTCOD62fRzrgG+F0Uwto49Em6EZuaBOoNUCb/TFpDcfMD3Q4e6JstFKAhAA6vbjF1fqL9GmuKo8ITWuene6z6ABVwklJhbyz7SWwTGce+GEGl0ppNl2m0zraAILcmrV0Rhnbmo5vsRXyX9llpzc8GoBefzvU8k0m/4X652V05mWDahmOt7DJhXwS5unpHRABpvqfvHGyP8SWxuqCz7+g4oacTRGolLjq1ct4taid4bzt+pEt21UNZW5M36Wr6+/0u+vPskf/72h3z69aN8fve7vH/7QX55/Vaen67y8PAgu0+vm2sxLH2mLs/u9DGmafDjrHk1iujnQ2LPeULTSK3j7k6m4n/aDnw8IPQk36Dg2DdMpIbXNkkMfObVobRjzdGIgL+ZYYk01pi8IBhXQ9zStAq6cz713neJdTv+b/y70qS2KQBEw2uuF6amJP4lPKXZizwoPuCkD0EnbYx5ck7xUrz5YBzqSzTmSZjGRGdwQWn2Bcqkzobp6na4akd7nvQxGt5O64w9ePXGWJ48Fef7Kiqi9eR2IHEN2EemhRqby/SMirmtGCJskfvtlZRLl1Pf5NxP8qqeZX+6qL5QdZ0Cm2Y1nWArY1ZjzXRS4UxUG1tH6pgDybNP9YsXxk5X03vcQpgwqJWOrNw9sea6k6hvbi8Vybg3Tps7wIzXD+h1azex19frOOuZMlG4iQuYiiaUd2kA0qLxyx4iJ9g8US5eICPIhUMQDQBzk5hFhWotJCcYcYFQKTlWzsZadbtDhgGojKM3wWBIKHrTwId4lQc5ElzbaTFHXCSvZI3defOp9R5T5VJq5BUMIBC4lJRDFYfXi8ycY4nfUW6eO6HnxZXM4SHnNV8r9/fJRDMTTS2oG0kPQWKYl7zEU4MJlX/Bg3/dtNlkQsHD8u9fKwhVXHk2FMhZiQvscbO3XdNZY03Q+LzW47fzmNBy0/1SrrkjlK8hIj3zVkvdbW1z/jBQ2FMRj8gdjcCammTjO4+mwSmt4fx+5ScUJwYUi7tacLZz70FjnVyhngZgfKZb72WaBvz6iHXJBjxEocNtZQ9UX03vK4Ha8lxR5jlgqIMlUHKr63pkFyd+o2naHGmQnGtBT16WuM7VcwyeCyKxqrXnP9HwlkN+gO5Uige8zhvFoGdxiuEMAcXSErqBR03K+AXnjBcubp4r+vrIQyieRyyngTAe46xn/WkdlVCCds+m5Z6tf/tdI8aqExg1JPfXtfdoYIeNtO9ZxJm1oe66L3wW+kGKtHCEU16jxBKjr8zGjeWLTVrb5T+urmU3bhgGUt5HgPRx6Bto70Guvfdz+h/92l56alO0TWxZhcSZ0ewGCAIkgb22KJEckjOHz1+/fEvjvJoDxAX6wULSEqIlvHj/QFw8MYeblunQWUULS4ZrTeyDHiQSoWKQRGQrk8DZ6kVNSzoQb2cd0hIwhJE4gJW9sJWSBEMXTXsh7f/RnQCW+QZiqSnXF5oHoqwfpdGS2AWIFd4B2VsDM0q7iM6OYibdTVomEFTJ2S02848qXjeQPh8jNC0mORtBEVZJvArqaCWrumHVHs6o0zCu5+pm9WY6EIIn20YCqKMSDz8s8pnPQgX5+0VocTP2S8oi5v/1wDaw9mGtR49D8inUtse2fyG7F6MbB+lOE1jqCRYBih0tND4TmOQ1cyaJjpQyaZcoKxDFFtLqpWOS3nvJvcPq7cFI7LaVe6tCavNsiVxIJWEiekRPkQCgvZaVmBWyKg2z5MPuShP664ekZtwNnfduilCS0jRbrPnz8f7ycBtngNnMDjnEABp5Ph0VqLRGne0qfeQTmM8nQFPm2UE02g5kl7IsGNvxpFx2y98100mGI3EeDp9fX2DDrESJNdg0muPq/NieNiOjTHOgjM9wOgRXwIURFvPMYIajP+s44xTcgwfAv1xTmj9n6SbPa7XaQcqVFQQiymwhLmDdnhXYZd4bcqMr2KnHHDsrUca2zNk8AnHXlfiyHKEOU8XdQaDyUJe4/3gfdx/u4tPzT/H+5nW8O72NV8ubeHF6Gbe3z+P33z/x8Of3GHWqcGQjYR6gRAa4RPPZBUUVmBwp25T4Vwu8CyqhDckW15gAAJ0uHTgTf+4jzlvu4IehAsgIcrDG0vtFizf3RX9fveo7AxQL0DWbPxF8VmmZmGgcA10/m7hNipIaMn0nu/n85j0y+ZgM5rQLzkvn34/yc/083rDneRYPX4aZ1UFSiaBUtjHA23aR/HuA0tRFsk9VFJA2Mvju5yJlOzkbzW6B0WWFxDnXaFVbaLMKJ58tg/rQ/1cA8mRKHox/Ty3Oa4ln6zHW779i/f4znn48xG25iZtyHPthJOgAzU6DLHAeC/SNI/BGzLEYG3tYcEet7d1IXXOP4jp1l9zeAfrglADkvcguT1D5cX3SeXtAp8sYdzydpmQjfGXaZVY8SabsAFLFdSvmvj3GcxCN+6NXo1dW5wwg9HUnuLWjm2PDOcXrccRUvhDP7t1J/HzeWelnjp//jeBuJ9bEuBTfdXa9oWiEhPOfqQzRUwbirMtzj/c5qCtwMf4VxQggf1YSaTPmESF7bEjE1J0pVvuiDsok3Fv8Y4nPSTw0KEbo/gtHX/DMJhUseWpUMHtyE5QChN97FK9GVfJfrEOA74N+QxVd68QcY4eQ/L70ZzOu9E4rdoyM+NIqzvTVU9oyiaapYlWhYkM2+xXVWsphsjjI2Iz+inZUr/gtlERd2VnRDH9JomPEBey6YCw5iIe3arYUsm0WPNs+R6tUVN0rgKRdsbVAbJshp++hQsKM/+casRA4+Kz6yO62mm2mzTBw2c0/8nl5X8ZDfF/FihLcu9wVbiMd6CTAviyXknuTnWnuaa4r90D3pysIJ9kh7eofe5uFsbCCJos7B5Cfs/AltSNx0eTzepzU7WAoJhjrv/b09diKde2MfUR+M/IHsCvb3q+KtWPNoPwBRYnrXgSO0uVnXlOyHV1Q7IQleEHbZz6QfiF/EljO582uyVpr/AcAAP//bF27bhRBEOyZ3fMdZxsJiQwJEUNKzufwG3wTX0CGREBCBBKhxUMCEYAsn3dn0PRUdfesfZJFYO68N9vb01NdXTW9fP3qDZEI0hKI1rEgah98cXm0eTbeKHY7qAxOu7ZboKAzHzwqq0I1mZ14KkgS8SF9kQrK+rBCyK1AxZIzIAn08I5+T9ZNKOiU6DygFq+TK4eXOiAh+hmktyNhMQhMcI/0zJAkeNCkPWIXu1htfGLCRkAwwpJ+9kKVNzZZ0VCCiq0LRbUCiqwBs1iC8mimF25yWzb+8CCW42eFZEfEV2DRUsBUYMHBH9qsmSgOKCoZXWSqHFOFMjMo4eNPupyhw4UCOyEJ3DO/Ewttndu+PZk6bjJa1NiN5qGV3f8W6K3DQKp5Sm6Hx+vPmxk0qsWzYCeVsyWEGffdAQDv+ngCqxCXWWysRe0r1R98RED7JuzWelHx08SwMm18xu4e18c8tHMXGOKBhTHAURuzqZxwwCzd1rKWoK9QywB6eVJ1X/sWHzcYFapBYZ6oqFu+TB0woa4GAaFAVaeYJC06ucFRP+E+RDbS2vpDIMOa0ptXLGEnE7xJ4mMfjNOyKWQyfF5J4ePmIZvCj6+yeCIu1ed/JdC/eRjy7+CvJo6nPs262U8GQpVaB6aORefm/QXCfgQsafXDXMw8Voeidox3K1pMADKDnl78WcrTkEd4La1DaIe4qJCcusVTrSzqMhha2ZwU9vkgz5+8kKcPn8ljeSQP5ChHuZCd7GWWg0yyEzlUufr5Tf6ernXeVufZU5VZO69ZXQ0skwRffxbrOYx88FDBg4XSZ4H+R5CHe0/s5HFkIINBJXD/aP8e4HxDgIVe9ilY6rGIpkJ3A7KpnhzvbZ9h30OMa9E1jF0p2mhRX6WDKvzeyWzi/O5uISuxAjUCfGLFNwrOQHdtQJQqj+MDWSwpqFrBBkBBsYb31VoHWrAdxOe+l2nMrp7DzLkk/H/ut9bZ5RfCRRtTDsV9jEO91psTAAZ3Y+nfXfqU/mGW6zZC0Ng/u4OcL7PMv0/y6+NX+fT2nXx//0WuPnyWfz/+SD5VOT9eSm55qc3nLo3xcW1CThkuMRxZUL0hU2EeQcpqjCUxwIPXX6LAso1NJRwobq25UM2ybzUrwwX0/jWIxo0z32LAZsKoTLu/FD2LukM5UbtjtCWLNrzdX/vMxwdgabdHHtqmHAqv6aF+XZ2NIX4/W2yocK6BSdko6hEci/Ec9/241hOcg3rNgj2b64KYYh2RYLFKRk7Ojuzc12FkJ9JHZSEUGOa4oV7S79e2oxxAkuH5mBzkbXvCYvW0177cx/bNfWgHJ5iz3Z0cT5FcPs/cf/msn83O3KwAxNagEZJhH2p1L5+vdDe3Wa0La+kENofaIJq+QQ1rI7IFALgettbh92PtBar3upjmxy6wP1aO+4DiXwNL4IRabAFLlesR97VtHmIM8PBfh9x4q/UeBbcJ8nV7cLGGqANPU/hbQVcILOYu8j2Z3WMEANp164jTYW/2vZGE75bYaPqVZTgc0q7YGFxBPJ0Pa8YZINaixv7FewhZVugGGGuTzFGCBdir2tqQ3TsCaOHqjcGcrUHE/YnMA7PcpYNDiJlax1p2AiPd9pFE1tNiQBCZC7Eu5f6vZ7SQC7bjffp3CeQBmNCmDer5Xiv4SDzjtlvU9zPSvrkMIBbY/Y8v1izKUESs9hzS9QJ0rA1xHx0WCIqZBg/dvKIIcRX5DwAA//9snd2qHEcMhNXTs7uOceL4Nn6G5P3zAn4A3wScG+PEEMPB4BgO+zM7E7pVn1qzZA/mgLH3p7dbLZVKVQMASOqTThcrMdOBimWfKU4WaBTsXHgahg0E25LaLxRnLmpoyPiaUvhzMAKhC9R16hfC+XIZqrPLfRcQq3zNUXqEPowydJXnIr7mFBsE46wrgGo8XeZVyQ3/Ng5kOsyIxjCzsrpP0m6+w2TPAHUcmiNgAJ18qO+OIJVeALNJgwI0u70H/raANxQONTk00GkYn9FpIC3oQG2HApfn2krdF4dDRVP2f9sanYYqelEXFGyoX2nf1zVogFBRcjc01nLagwBOKbUQYFsSxZlN7BfXfg/kwN32y/PzWXMxa3w+n7s8BnMAEAUXADyvEUuBghboZ04+lGQQida0TrBK6PyvEoiraaaurVfrBsYYDD67sxf0nSaW/HvvGpsoiCB1kaOXSQikjBnTbgezjv0ESCcVUFeyH8r8Bv0yFcOwCfaXoFOV684GdKw9jIp2Hu7LsHgyYb6whgDl2KfQRjv973TcF3JTDTeBkvZBu+AChc4BFBBghQpnu4KE1180PzeSyC2oxKbiOncnHh85Wblp5rcm274lunM1Pkcg3Z29cRvzsCkRYk2hEo71X+Oic1C0RGfQNGNL15FCrTB+lUaBwN7v6pjDGqiitgEaTRJvA+TNQEI73wEYKGGMdepPP3UA7nw56yIsPWGjyHk9v7bffvnV3p7e9tL/2H9e9O+s2xJZtXIw+/zls319/m5NudSdfVdDk7nJA9x4r3of3WpQl/qqudKauqLstwZeNbu5nlQIVIL6DPi0KTa1n+PhGLG9FU6sJ3dOd5C4LQO4mspA5W+MAvkd15L1/nxJt2FDkCoz4zRrXyXW2/yOZ7knjHlp/x5Rh7/LgrcYyufjD8/bXvd6uwZdcUoz1pZe35SwerGGK0eRkv0S4n4DVCtBTfV9KTZanVTk30cCch/2u30t2Pt1ivnXR5eRSdThRxtD8oF1HfmCLUOVPro0YUer76vv/xc2l5PZ98Xmp5s9vf9of/z+zp7ef7Lrp292+edf++vD3/bxw5/2w+loP//0xl69+tHvdTEP1+Ksttr1A1IRFjoi3v0mnlHE4zzoFmqMRsCG8NhAZzF3NPuZlVBd6AekgoWiDnsugNGbhIjJw/pYSxMMbHombV+LsTlJu6blZ1kcNjsKmJiXUIqhy05pD5tszzLoTWxr++d0OO0aF7BK2vfvgsOW8ps1xMNKEueMc6UcMD+WLHKZRvF87OIQjKJ2FoiRIep7mEPfaUujK0XFgTdJEgNgBz5M6txb3E3kFEVggJ/1KcSPGdsoZTQyaGowpoA2Fk0UGiswFwbdPnmaJUYHdyQgRJ5RJu+lETirCRJM2wRi5CYg8WHWvuzAhGyCEWL04nvQkrfIuQb7ZRNT6S7XHDSU1pQDDDDMNLJgu0Jv1fy4JUbf49gazwkIcr4MZm22Co44uBvhrcMxoK/pFl1WvNZxm/BizzvMHZxI8Z8xnSKKfkmAXv0fUVrOFuNCOIiNhk2RZpio9qofNrk8eW6lBgW5UtaS0WhNAFvK6TfOdFDcF2m7LDvdpQyQWzgfWYx5XLWu+X7Jn09/K1bXYeemBFhHEV8Uh3pz8UE7J9vq9b0qQGqR/gb3D0wKr0XkUKKxLWokvvcO0LklUfzm0QTSAXD7aFBrBss9CyZW+w/BlpMelzt4zB5f9f7bCBxxJV6CPLbV3z3P8DX2cwC9fzSwibHR9NGVjq4WekQ93z4e7D8AAAD//2RdS24kRRCNzKqutmUErIDVnGFWbLkN5+BQnIAjIAQ7kJAQYmA3ksfTXZWJ4n2y0pqFZctqd7ezI+P74r3l2++/+wFOIA3FRBQhKHOnbqjZ8UkIs+EN5i4bHWsbuyb0Pscpp5bGXc6u3FyEH5J3uV4WMsMjKbkLKrpQQ37sOzCJSyftrpg/7Ln726eOmneoGgyW0xRc+mhjwjfgXROrbURMSUSJ6/YwLoV3q08Nb34+hqNnstubGGTvhxpqliypcIZG+3G6uERt3FOmIRbs/PM3lfr+aeiNsEh36V0I3SaWWnf3Pu2wdcDcTDhh8jyiCqoKBxvcp9JXeIwKdQTHQmebZ3mBpjZ1lREI1azgFNWyTSyOtwt3o7ku8Sj5mz4mvXMwL4bawJGSmCnZsFlwSJ8+nLRSq/qulY8KzoTQakAb+1jush8K8mPfqaK0ERRUMlrRwqKg5RUb/Ot98C7NV1xIM8ozEvFuwFkY9hTUB9b3fGDeoRDZ14BfeYJfzikFtcA7bCpJDbsmq3n2yfbeJB+Tur4j6OtrPtdQwoagrlURyLhNiT93nE6HfO7wn/JIrUlSE7qo6+BcQFCXViv0WmOW82NR0KVvj4BVuaNpJJEDuyHOQG2oOEPio7PdpL3KfUI3rJbBfgzt8iaG+FLGnpZTjSrpoFXvvakxUMXCOkue8aNWAdHkYKYDLibpq3wd38m68rO4yL+R1VvTh6UIur3Hsq3UPPb7K3Zi6hyrOWNodJ2CEoPOlFRHP1FEkzSYg7Rh7EMGEtAxBqwb9PrP7jfOHHrWlVNFQLwZzNfLNWKcacV7gD40kn22fbMxwZjBJkI+NtdBoN2/tzjuEW++fBNvv3ob36xfxxZM9hf4GJGpye5e9o/x579/xb3mDduBAigieAWUWQ2R9BEsDj0JKbE9bCj0najO99eQ3cYDlVIAfy4LC7qnZJJHoWpxczeepZUsO8g4wWR+A7v3Im6Niwkrp++r4aMI0DqzXkYz5wBsXomHim7s7Uk6LNdOsmmIAhpEpG7Cs7mWRRXuJhQGboIh82tTI7IKfhhq5rmpt05M7vTFHc1nxLGlgjslm1ZDvFcJ1KIJTCbfeddvUksolkIDYoPPUQu1wvPnS5VUnhmzcx0qJ1RFUPVyXlzr+efTZeMGSaZITGHtrQPN5rNlgXWS+p5+bRnkn9kkWNsa9XaJ7X3E86//xM8//hTvfvk7vuhrbHuNrdd4zMe/7PH7b3/E+3f/xWfXp3h6/Dz2jPUp33gc8eH5JR5ypam75dhkI6Hkcx+FwNAmD6Ou2rjTRDYSUejplxPSXaiu8FQchH0PJMgEaVwbe8G11Mk/unFDqSrEa+2rzuuNy7RGabJhx+fbRLQ4IwXMVj+jMNywxwR0Xm0c3BZd912vNyCrXpcwHJcIOqCk2qlGsoi0euy692l9bNqTzpwymzZ4v51nGsgnmWM25bX5PEZPnfdhp72reFjnPGXE1DZsPL9fryaCPoRqrSMfydjajLyTWLk5b1z01gmiz3yLd79J73+RznrpVkhh0Wz0Za31tCcwu4s/QRKqT49PLEC6z/AjfeC0hmGoNBrY933wcCxWk5oqoMzvXdRghUB3tSnXayK17coxm/fdLd+2zwSzlDQO6+a3Fs8fnpHnWNf8kHLMzbYqGD7ijxCru+LigYOvkqK7SOIzhh5/ft1EGOrJsnXYQ7GlS1MdOV14gMCfu+0uzLnQwZnDwUEhl0o7BpKmGPEb9MX8Ww8HykAouaEAYtLkmcmm77IMTf7CF+Yw6E4tf9j9wfif8QHcYUwOOOTR55Ky7G7yYz2yKenQc9hOwKfTxWE0TcVx/3VWbrJYmSEmTpBzwBOKD4vYmITmllrEUJ9al0GI63vPnISha6mUHB6+rCvHnmYyfh7A5e9czbzdSbLunK/Kv8AOkWyln8tVVPLFgVRb9kNemHOKfpI083fMF7g2/not5cy9s8no4QxlwZlvA0EbRFSPBgv+B1gRUw34yQnNtCxUH9JgmKictH2u6uDvE22zprw+Y5zVXSifnmiMs/ZsR4//AQAA//9sXU1ulDEMdZKpGAQqXbGDCyB2rLkN9+BWnIEDICEkNvwIVagChARt50uCEr9nO1+ZTVVV0/kmcRLHfj/lxauXrwllOoOYmG4eOqgUdKGnexJCXBIEr7ziMjnISKT4IjypBQhwhOkVqDJPYT9UCBvgThuqTGPwbm61k0zxEd3cm3VWmRQPwZsMoUFXeeel3iHEXi2plmCT+68VYvAoqqt/x8SIk82qqnM89nBYWUTcXGwJFSW/XqH6XADp1ku6cb0BhZnIBVSBJ6cfOgFWEQxexfqM1aAl/Hzy0LWz4OqtHToAXkgJlU9s/n7oH4BgCLA8HB583/yJRGJC/9Ap6FA41aqx+78XXIz7nkdn36WZ570KBm4KhRpUD7omGCIgGxyKPHqBGJypdUJ1Om5YVFHO7KpKXuabz8p4m3D64Nm67xJzbLRAVEwgj53vMaQFxZhos9UpfgU0gQsfiQnQNHBNO7hKra8QIoUadRP3sfkMha+Sgqp74yG7eWU5y1IYmjxEOEU0wGq5/qbISXJxGKrMqg98MX95Cd1Nuj0QbWFxwypx4B2S/8uCQ/R8VSeDAt2AZgd5RZGAdAMeFGIChpp4EDWjSbRzuq2RkihItpvfRr/VZLwqqukmdEq5HyR0+iOKRQA7pbAY58Uq4IbGcAGw9cBzOF8PPuAsuFCYJ4MbzW5DC0iCSD2ZFBFwqTcoPLM401BQo1CgdmTu0griM7JQNGJk2AuWaU01LvAHefLoqTx//EzO8znsFNUX3ssr84iUX39/y8fvn+Q6bdIzRZOwPsJ47Z/B0BbJRc84Fyz6VFoZobuxxN6IaSAKarDa2a/vkSxfw4pKhU2rdVfyGi53XrWu3PgkztelxkennWL2TrtBlhFnM4k3NwFBwaiZCrjNx5kjNXSuVQT3hDjhZUTRUdqRosXvSHQqnE4mVBXFvAgZJbWtocMZ90DtKupnnhHKeu9o8WcOMbAQ7uL0h4iSsL/VZv8zAY4ekTyd+YpI2MtLGJEsp5sq99NRHm5HuXr3Wd6/eSs/P3yV/KfJcewxwxpwwKvHWIzvuolcfvkhV5ff5OLRhTy4OJ8FsekoPfbp3QUphctpRE86hJbUEyTOhd1zsfUfzxUmoSvXnF1jPx+VbpZCo8KdiVr4WeFzzzWzBV0A5iyWu4Xu3uE/9Cw+o9mKgYIlgXYiy2Vdi6o5CAcOHRTGIMWUN3QwSxA1bRRsRROB4yBLfqZnE52LTswnKdYIxAzXG//3tH0GGk2Qv7WAqOSzl3I3J8z57n6qbI9mc6rdYkeDLHvmbjtlt9kLKNnyTKIxy6GYyCu727W54w73P54B3lHPhrCx9RIVzJvbCDOWOXakE5pIHbS9TMAa5zMdWkhVi2dPDjkaz/MKhAr1EFQTZ7M1Ts0TvUAJeNM97H0eg/yduelGRC2GetLuIJRpdCcIV5POJAEJzRfjze1jO+LIz4cNFtejYcp1R+Qm17GO5oo2YIzYnGOvsybWQlvs9v6UGf+8VHCemPetY8E4IyWXyGSDi6OJQIcZCfF3C+rEWCP0/Z9UolAgszO2wqa8ZDQx3alrXmZR0FRhwWKCeMwfm3Hl10KfiNgl2XZzaAycTFS1Gw0yIobCGwxpzo64xV9Yk9wj4ucSrcDciEi7/f4zvvtoXJP6FzV0qJth++NEZOm+QBexmF+p5gR0u3B/sbN1np1KrWMsKp2bSFItLI3m2Wx2jCJgSvIPAAD//4xdvW4UMRAer3cvkFyAHl6Agoqa5+YZKCgjUVAjkCgiikt0a3vRjOebGW8uCDeQ5Pa0a8/6Z+b7mWnXXPW4DGIiwyLUqql2p+lg6oMCM+AXOgh3wPoP34PMBcQRWIV/TUmsEUoJWeXZvS3jxCTZFq3qQlk+TqKLZEAW6Wh8H8TZYqUTn4/8DCwg8BLeVAm1NudEYoMVJ+ikvKCkML0YBJGXtIWD9nNNKpFiPuDBJ89be2JFlCBLNV66PUtLlkCJFWrcI+kEWDXbPqso2PnsvshyzxNZX9gYtmqJCbaZ64cpXmBG60UEsiSDGC2SOiTq+uaGHk4niyGBwjcsNLq4BmVs2h0iRn5YPOBuRgNBoQWwqKKbWFHIN5X5aUjkkCE4XOQSFlIc+/x/yTxmbHye8tTmIQnShr8lKJer4ua6NvUALYYoieiCOHHAMig2xClibIH7QRDYagGKH+NOFidydEGj8Vl4HPDMzI0+ibLo7BxGbfCrRr/HQzUmQmguDNDLIbnnopGkIiy9b92+k5TTBPggkgMYH/D+pA/DKct9bJUPBehb1hQVugAAIABJREFUbaZHgfgGvDOOIcctbyzFXmjOiiyAwjaFZBKZ60O2hFcWdMtZr4XSqm8akXjw+9jPBFBEhz7HpNUj6Ct07mxRS85sIk2yQZ5GTQvehEhFVMXxuNoiYpbL7BC4MEZIJDbANpHN13vPWcelVN2E7fUznrYHUVee5T2Q+ZoTrZVoTjMdr2/pZb6GT8PF6xlS/ep4FK7qxp7WWftNLYYEvXNBm8CgtLsePiyjV3ltHhdZK/Pw5D+osi4O/uYCEO9vzoYuwIIOh4lLzSgoWK+WcX2IPPimHN84rwBuHa+RzzeN33PnoCMmzjsf8C5yq4i5ZTGkC5mt2cizXs36zyt1XY0YvOG2u5dmVQskBhy23dW2Y4UN98N2ujMEGAPsmsLBLL53Qp3hishyZV7Z3bu+Xyub16SVra17/qPYJeM+9eps4sLG40b11z39/PqNftx9p8Npoxe5O1LXVAWJwqlMDv+rRvQmEd3f/aYvD5/pw59P9O7je3r99pYel0SFOCE8U9qK7INaAmTaqY1j0wKDCi76Aa/vQ7pDgfY7c+1rMdXtHGg3sAcFguy5JlU8nUt0lRooVesuvgf6VlifyOZtj68NsFsd27abb9HifhLrczn3McQhArEkAnIcD52Fp7xX/X2pKg44fj/od/w7/nxXr+9J6WY0TqerLUY/rZ3WwvveUvRdU+0bTRhIjKml6KUGugapRR6jQsf3VeNgU40epaG6Ew+SRM2SYtbv/N5OnrxJeI+3KfRXtTmI5/myqkXwFA+Wk8HUXb0+D/Mn7Adx8OpJUJ4DNvtZ+p37J2syvzmFrJIjWTzh6rFvB5W1V/JhnwfhNqFLWLz4u7Pf22Dd2nJIUAWqHyGJYk4wjlIhATmvVt3GnoIgOj1NRoGNyUbTPtPzjRXsNA5RzOQ9lti2TkmRX7ONE+59CvugyVB7rsrP5X4UsbD+2N6T521N0EIwmowqUY026ecCiJ96//1rthB9tited1ej/ZzVHpzCXqvgvdB9LWgSs86xgtRsgNcvhgAnnUO6fsNiDhHH4428s//T8KxI9hWluHZUz2wJ7AYH+u3yumz9wfG7SyBirkJxE+eBxOgC3jcHihn+hUYP/P57HHoCUc61F86BiF25ng+Cu78VrvQHDTCORRHbPhxMAy+eU+Lz9sS9CizyeG6N/rJ1BqtxHEEYru6ZjeQgrIuMjwaRV8jZj5PX8LPlAQK+5BISG4yPtg8JCZrZmTbdVV9VzUQLixACsTPbU11d9df3Tz//8vadQsEM8GadFWaIZwNI7Pb32cB4SiSdhs2SeDVxcrkLcxd8mNGRsjkEKiBDceCwr9jICBzivp3VLIKiQ18ssci2CtXsNZgT5FDXF51KmqLrlavW+SEEHhEbdktzx5boTzHHlYnhuSLOrOm6Pnkivfo8NB0qlXhqJUc8GWhm/4RbgBNfk3WJ+x6b1Hi2EYmSNuriEjUDkphbQYEiup3Ag8j+DweV6EIic/JZ+i1Imvk15oftECE2J4wHOetkM3gjygVbrqn7H3PlhwqpMyaq+6VrEoGEMg40dDMzQO//r5j9LUUPg6tRj0cxwZIEaOv9cDg5AVb7lBdAOgbKya+2R9USGy2UCJIEaXTZUdMsEMXt5irFc/PqIB15KXHA3/YjcTZXxLUIsfvGT7X+1lgV+n1xcGlyd3eX1nNN7+Ibi1qghe3d2BiM0g/3ovMlhkrjqsCaPTEQsJ2sPvsaXA1+7zNW1SqW1ajlACtJZhpzUqhVAHDVGmvYCncEWHylsW1p1g0e0r05Ohusy8xJyPcX8jsw09mue4zIjALb4mMoPFN0Z1EAEBMr8Bv7yawWn2LbIzb1v40ZrpMCAGs3EhqNCfGEQvMntmqdIQqs54Ouy/1gBtg+oLZZ1Q975/vCCyl+V9Jdl03qPsn2tMlNeSE/vX6Ux5dv5FZuTOUUCgChyyubPE2r/P7pD/l7/Ufa3EZS1Kqu/W2P7hAKk5qUNKO7sD6NeDNmFy1e8y7JRtQPmgla+oM9j/4sISJjRAkXBjguyQ2h1urd4DioxZwunRle7E8BQ9J/rAWXVeWR43oWn8PMsEoxWa/bJckx2cz7gh/6LIZeDNjKOtpt3S1dUdf3sWUZhVy6M8yXq4w8DvrwFohCWf0iaR/phQCxg4o3B4w3RLGd+5Tv7Yj/NeToxWQgtQTEsiVVggCPc//+YqM2CnC9rT9K+brIt98+yJ+/vpf9y79yUXOfkRwzjtKvqFio7iFl2kWW/xb5/PEvub+/l4eHV9L6dzCpbHZEWGMntcRE8j0+FVlcLpviPGvyagoPVGBXk8nq6FvsNVoAWH1v8W5/LooZ24P8YagFpuocHtY/ncqRnHdG02CEzN5ZpjuegXK8O++DOV1dR455S7E0crguV4arQSe4JLVa/4wXY2+MA5Q1gzojZrfPeS4uOMx0PJvN2VPsz+RuSIiHgiYd/vt+Tg5aazw3IqHmPBRGnoEjCp1aqX4Yg+szZsWv2OHVw7PRvItsdPCT61BJCoNqUFBcRgrWtCdWUksx55xLklPkTmRrdNnTOFDicsHOckk0FtE0i+aAcXvx2uJYuDxdFLjYiuU84vea61J3rqtZ6V29QEqRdvKOtfj/binWFrPWQ7mhDJfN81ZVw4Va4NmibcVp6erPyJw8+bNijP1ZEsfECzuuHIinQFU1c7r3k6uEnFeAWsFcG/zgDGSQsYGq3CRgjLs9R30E7LmGkF9ezv+TPbl/71W84AW7oOd8/F4SSBA3K9R0KChR/7DWDo2uRszZnPnQ97f+3TgAL4PM2+7xZORxlyMomZET1MBZjVN8fJP9REdYuI7O1xlqCyy8rdFFcyXfO+L3amp11psq1MNRYjMXMi2uh53yWa0GW2fb+hkxuvo5PuT9Ak5CX2fkG32tMyY61rONDukejKpFY+EohJUq3wEAAP//bJ1LrltFEIar28e+dm4mMECMWQASEgtgM+yDbbEGFoCEmDAICAESEShXid2nUXf9X3XZ4URKJCe5ts/p7nr9j8PX337z3a7p6JM22oKqlanya2FP5AuvStBjHISXV+fg9UfQxeNdFjQ84LPgfhykJ6nHmjqn2RanaFJsoS5+HzDjYaQkHZGQ2a0UfAwRFd4vfJDzIpTwCUJ3wJ7mZ6BYFqcq+PL6nmxU4JQnQY8pIi/np1BIXrCxIiVsD1KueeBJNhyPm6DlVpbWgSeXR3v37kWd6FsS82or2GcOjrroBAI4ViVgbFvAsplmUghgvQPEyb/DIaxm4uCPI83/ROBx3kMpRG9JfMvk31uA3GeIJ1oH6rgzITAV4reHDXeeFICrJr4r6dn1zEyF6Sq4H2H6XRwmEtF6R2NYB9hSpZ7JeCosSX5XcpOC+gP8Kgcnt0I6xsYk8G/b6hSifDrdApR8zUCprzP2JwUcHWZEOREnwhptwv/25fU7RcBsOV90PPLVpYXXX5WIUvjP5yKKxO12XY2xKlrHcYsDaASlF63XJgHOfC87LSbxZgf6oCV0AUVbU6JT1c1vsmrJHfFAQextwQOTfSJq4iPxGJ/LrcX8nqHmPO7zSHr9PCuh8WEZUXPY0n48BXxu3KMhKAR9xmHhGbafC+0Sat9QJZgekeyS4GZ4NUI9AYsra/qdIYiIEEIBYV22ttwVcFDJZypnNevIBAPEpq0DDZTomMkDvWjqvopY7QXxCOE7TlHG92afXj6xr7740j4/fWZHG0iuW3zX0qWjVgbj/7212u2Xt2/st7d/WHkqszO+V9fYGJQCj0V4itfZ5R7Qy7lPewv6BCeU04/8zEY5uya3lnGdhyAPyVRStc90tlDmvTVHzlwucfasIvkesUTBarkow6KnrOQY8b99NmLKEvERrWKh4tZrNG34OUwp83mUk4OwQ+pdjW4/V6AVWFnNbpS0m8RKJ7XkIzuoXQiWngqcj1W0D/Ltn1z4g6MsTJMjRyDWuyY7ca/L975LpGo2OWj4JnpExL7iNJJWvODfBR8e1rSjsDqXkx3+6fby81/20/c/2N8/vrHL1eyo9bcNDY/di/2S6HqFxkA3+/Bvtz9//9VePb+218/P1obLRXWowS6O5iIhJFV4fhYII4OjX9ZZPOglA23RVrENn/WqyTjrrSrGdsjoikk1FZdjH4/k3WlrOPUsOklVEbeJAoDQIveT4hJBO5AvXB+IEbnRlBpcuekBJeu0ncSD7RLI3dK/9SKGte9K2/vdesvrPdaahic+rfM447nnHlxvEGU9/Y699PxsK8WLqzHwUaP4sYGTm11F9/9yvkhY1Jv6hyTuWsr/zV+7CoFbiNvli3VAPHe0d4kB0Jn8U89mS7pRNcQLa6Jv7ilX7KGrMOIjZx33NtTGm1vUoUU0z1AVyeTanqesZmRLwxwaOS72KFtGpU9930MTqaEHpsYY8Pea8kbaatgOomHBRVyLgjn93SiYTttC0bE+cywsD9oYea3d7+OlH9TTa/YggsnrPe0PPhJ0gjVwGF7vTuvFMpMBR/z/smiDu4Yv5PsGqis5prE2sSIc+dbUAZpxwOL9cR5DF4jnn2kwOAJQ67GOcFnw88R0/w/xTKuKe9+LFqLsDGyIaayzg2wwQZ1w7cpFrsorvb5r6b76sHLQzEYukPdmUK9Sbk4DxekrI5/z/JD4k+9fnE/6bFyI1CNaOGKC3zM51kiPLT8f8j1EQ8kfnD4jPZYHlwrO1UAA69fUj4vYidOMGvTzfZy6MXMDM/sPAAD//2ydQY4cRRBFI7OqmsV4YcAgfAC8Zc9tuAkn4wgsWLJALIAFC2RZwsLT3RlWZv4XGdWmJcseeaanqjMrMiL+j/+37374/kdotHSookvlC2E8DujGTfZhzPUuOsyYC1bh67q5mnxgcQKIOczR5V/WSH3+a0+U+RJBtsbmyAVcRvc8Cb9Mz/ZdlK1LLPz/dfhcqAXqnx2t7OJsPZBOoYfz3GEUqkqsN7w5lTyBGkfKL0/Pog7goZn+wtyqNj7oI59PKIc/zDLd1eFqGk+YdLdbfN0Sgs5rHGxaWK6dBM98BT5Q4EypHRQWKHNiGkQ3UA/qTUr1R/IB54D59BMvpw3aE3/muooSuXXtHsknAaSEkOGkQlPolihwzsk6CQyJRd4/RagwPu7s51HA1lncDoHDNHu9rACrZvprNKegmXPwkmTVis3KwydR5tp8EK2XTh6IvAupHodprB+2Qjowy5meVOTLDiWPQrKvOd1w3DIGglz3SCSLGjroa4xE+7IHnX8k4QbayT3UaBT0/9iDkiVLT81OXlRgD4XU1DEude0H5p9B0AfqNK57edduWNlsezTTdvmawl5gD48RnsslDoPR6JOdZu/2DlaQGoX7NpkfVVS9+ByaBaKGYn6/HtaZUSkUu60shfRsMbRiVg7is7seoqgqugPF78+tFemz7NHVtiRi6raarae4om65QR1VAyG/6Mzn5MR9aUmM90F9ti6EnATG1CBrSozvsvvJ8WbEfyuRrNZbtfJc7esXX9m3r9/Yq+Nz221fM5tOsTUrrLtf7Vru9vvbP+2vd3+bH52+3WZTQYj6ocIkJyE861789OBBL51rgxiTxz3w4v1aQscoPJssVvm6/3l6ehoJeEbS+s93BJ15eIR+9qSWDJNpremigk7NnRlLw3qpeRTomXbpia5I8ogQ7/kzWeu8SWmdBIWDa5da8FQ5F08piiYf5zQNAVTkHU0IFf/uJB9nhWbOc2eU8DafUW/LEaDHrc8u69wGsR4xpK0xoTwPSt78eJ8f7s+zIB8I7CF3gNYPY9veu/kf7+3Xn362f375zY5/b7Z7XQ4Tfb+ICeAP4Xvs5TYbAe/eXkcT4OWXX9ir199Y60Vn/569mG/t4Sc/nZt/TCpxcplx6r+IjzgHTBHfLdl8JpQ4eVDn0bAZB1q4XIA+CUIf2klFsQbf/10I8DFmcX2NNwrIoFGAMwBMwWBiJoYL13fI2Ynzhmf2UCP0lpx5TOdnk4gV1rqLXXDeX4+NJu4ZFw7OI085XZ5xjwKBhrRTDMkyTcw/3KlyU43fla/DxOqBWddzaPZCv5cOXuScFD0tPlfGR8O54VgzysR6s8QgEyOHZx9fcZDAGIGzNQLRR2k2sRNACXGVySwH8qjYTwVxysl82FVgHsmu08P+t8X896lBp8Kfc70XYM/X5YpDDk/Tmlwt2MaDQetiRFrsI0OET4gynvqAYOyZeR0WeXsubil2r2KOmdsJkc5FfOw3X3GDv7soJ82c/NrCVq6eXNMivmhtEUIfItDh4b+0NPjeU3xKTQwK1zNTZ/nxD/CMPVX43em8KOse83NFIyY+x0C57WQnjq7XAA3DDaBor91GY8gYfTOE9u6jDqPmcIF47E1LzfRG/VjPNtol1Z2Rn2sv1rrm4hHmHKCHRnKwCuffIXar2mGuh7TVZC2amwpxjRJ+7Odlfw8YKHOsfIJoS0sFtwNYINJwGBaa84wmp4DZPJdnATbzOZ25QuRfnWEz8nYc4GD9Xe12u9lHAAAA//+MXcuOFDkQTNtVDd0zgpX2tB+w//8B+wGIEzdOXBA3JKSVFnqZerhQPiIzXYMQPrXUDeNype18RcR0HCZDtFtbYossY6585IuEHZ3r7SqVPVEJ8Hafong7Mw5xtotVK+bimr04UORQ5JaS20v69vWr6yijCqAEIGroYF8sdgHGAbsFgQ6/hNrodntwcorseMOQfzU4eXDjSo45VMo+HxfEMLQvasDZsH5t/v1+aBAtrTE/C4eN5VWewzgNPKBrym6K9yBkOGIQWlVd9sVb1lopjmnG39Y2rT0CyxODPXUOPr/LOmtWDsFbcWdSW5nGNXAcq7GmAhOOQHFKDOQgwBmfd/fvc4q71NhcMGZh/52QEez+7vEcjBXStSXXk8/D26Wn4lno48i4WOCttgGPW90pG98XMNJE43PxXHkejJ3PB1R2WPGMlIIytPOSt8uGHi/+juwZuzjXJbg5qgQGkVyDcyf/fwtyMgJpYw0oCmQq89zY08We49ZqaQlereVyvnhLXzFbw77DJYauFuxjyQTDjjuqOTUkpU4YeCV2PPwdoqpAyTnjfd39POpOYlkhBWr6vodV191mYc88r321TgY98CHfObXA2cPem1W147OuPwPpFneIowJezeHCvjjbax7isFxmu4TDoRQm9SkkNWFfmTvAnytxk5ydDJAucRAMiSx+jyCl0Wceq1DgkJhaVHuk1a5Ee3Bl5uKi5wmYsyFPmYckx9ZD1mQvamAim1Qavb7+QQ/zlSZqyuxPQYikvpDCY5qgTKu0nwsbOC1WfbDK90yO+x40gu1SxXCOkVNJDbZzrtLkoD93nPH7ouT0L4bJg8zSeWSelvP6/M7Ic+p7vo/1rJjszFJIyCVJZB1UtuJnXe8jVwLurDZbi+6xOCSsGPkUcIKU7hMh9UUXDNbN9hJss6UkvvKoKL6fWcyFA6AiINWkwmwyes4jgzZ0g9gIoadIzK4+75iXyewBJ5yOdm42aVclmmLo0fa006UqC/a1vaDty50+vn1Pn999oOXf/+mxKiSRjI1ZmMRNyakTUYoZDZ9c6Wnv9DgVun/6j97/84Ye/3xNt7//ov1VpZXxoX28b1qJuZ0Hzsx95wC7GwmX8qMsm/ESGYxpNtibqt9ogpudxzvLU0KGTJbliDt7aINGkrcYPOvqSQYE/vw526xXjqD5bcm0koifzwmYLHtK6V4dfmPP7QkfJBDT+VOl2++l22JeS4zs2+DvoiVd7qUWhGyAgJ3fQ/Zz9QwZAx9eg83gXbhn8llBFPJhZIoC7FdVVOFJ4S/S+WfwVvAPdEvQ+B3Ge+yZjfD9acUkVj/aV0mgPm1Pw3q67Bvk2OCzpVZvNktIvy4LMO4BJwPMN69Ltyp6Sz73NM/Om0XpnFvX8Kk8+XJa39pNvaZYh6rZ0mZEv/M0+nPP90wVxaHq6gfH6fsR4loNnoC5H0naGRVqfEYyEnM9D2d+T7Cp8xAo5BH4/23/OXcERkeXriWCtctscpWr/HxIUCGu8H2RiNG/uxqLJoz5DCUr2smcSH/3Ivmg5GfzJhwm1Uid8T1IGjsH+mkvZw4AxIOtxvtDEalZJyknR/AOS+1eAOF/d/92d2li2M/FEriyv9OdjQ4BlbV+nugODrjRPtB9h3eiycmQh9fiY/iQ4Fw52wJiFpAkR6eoFrX5meG/QV3j4XYbZEHDp9W9IEVjOS8iWYekAeJA6eA9F29434Cng88866BmH1biPBAFtp320ukHAAAA//9kXUtuFDEQLbt7ZkKkLGEHKEjcgDXX4RocjEPkAAiE2CAErEhI0j02ctV7VdWdSFkgksmM2y7X532mdx/efwyhgnjjTKKOUNssgPUvTOrxJrW7gY04OpwVdkfsiCkvoTf3Ls4KmuP/hm3OAgiYF/2Pxscm94sLc0CHWNJEjxwgwQXNBWISkoUFN9Ce9M2kngUBfUFNuXPLCaFAFxXWGUBVLInCPfPs1iL0vTbF2vB17eBsH9LURCF2oFr0XYHEQNTR/a1QdC1QVS2AiRJW3b0zCjjq+SkfkDB+Ho64hGWjDt6TgusCq8iadAVyV9eVXqnWu4O9s0/JQDIgjxVcLHLts+hVZXOli6MKzCImuEG8PDN6JA5Fwx7YJfh8TVfmZwId3dF9h59Bg1weU9U8bFwmMmewU8zDGzjRwYyOMRVsxafPGc1BWFzmjUqPorPvusaEVg37HC34TkfnCqlC6rK4DoT++3F1SgdVkce6j2nb6RTJYq2BwikJmbMPhJP708uOS4VLOvmA6/4qVDtvnvQrAmaeAQc8BxqGUM1kJ6XnjSiH3jadbgvK8ewDUVNdqbiwmJlCPZk0EvudOU0ezP3g/v5BE7QJnP+xl45oNrLZx2B8OB38s53hLJIDNs8ZLxt62LsuQ6UtkIl89TS5NyqAPduswJu/3D4rFbHu3Y/JXqYJ+D5PKAI+92EhNho04vDY4noeCzh/o+M8iq2OCWTFD2vUGmJVS5XTOsn1i5dy/fyVXJVLtwcykDQnK2bV04YNnXT5cf9Hvv36Lktd5Tx1S9xRYB1UuCeEIgmHr4ogIYcbcdQRX4Bn+91kEzZOzagJMGGdmMBnqtX4mUEXISqASa4tEJEyzeMAp13W8G3+HPe0iTyB7DiPWRyQUNEFcN4O8UqDHbZAbOnz3k4qe5qa6udBkSQpyfdvL17j9xv3LJwyVjYCwUnqG+GjDleVmMjkqWKHPVSDgjGh5dTOmBkDAGcOb2MkoaXtEIvNIbdMjQ3sXvUcH8tByiryrB1lvl3k581X+fzpRm6//JZp8P61uQU3m25FPl1QGWXD+LHyla2QayK3d7fy99+dvH77Ro5Xl/LQVm2cqRMDm6TQ3NiVKeDtds+92OgompyfgpaIPKXA6cEpBkxM0/2jZ0Onl5xsS6CSxuvqPSBOAZxhUdjAc6eO0YoJYZ4Ad4qUIY7Tk5v7yxAdVmzmpJu0I6NyiD7/aY47LzjsFSJ+F47sIkqPe2h2n36KTj91D6IVLYu97IjU3Do6TewbaCwodPVeTwW+a0WhCUK7yZ7cRUh/XDGtE6w7YzHvAM8reuRDcc+2zX3JtR93MguscfZHQ1JFOSEOyWHN2DMN9L0CVMM0TZ4Xc8J8PB1QpO8oQuAUc5JPlKb4WSPiYwrv8lzE7FTRGZPc8QOIn7FHuF8WWKKRhsq9MO4/HW50STpetnDFffWrT4yZc7be/HmRSsAhYiF6kflMgm8TweLrlSiCkuoH4WtIzm/3X8Uh2itQgSU12gnlbq6+LxsnrzMsKgOluacgbEXatRGMqTJj4gk6TYa4RWMDVE1SevTuyAg/Psti+7umZp/HG+xNFv58TzpcwgfJuTE/A91dNB9SNwGL89y7j0sgYmfYQEtyGNtQf0DvM/rhebc++T1dpAZJxLtBFdQ6MiF4mNPbGbb4QoQ4tVNcpwRxh6J/3PN8D2xo+P2pzjlGl2LscIqJVQOWo2G/G3w/cjdt/qa9qOuRbxLS59A8Gn9ZhfOB0lLXH9Znpch/AAAA//90XUuOJDUQDdtZWdXdI7FhAwjEhhuw5DZchHNxBnawYjMbRkgjTYsFUldVpm30It5zukaiW62Runrqk2mH4/M+5ceff/oFz3BeWVThAK0sSN0HMzxE/TDqafgb+3QNAXqBmvO7OChbKP1Wig5E0AmaasDGIxnHBcbvoDtgk/OAOF6C2rTRSdzGxT4OBBZjPXgwnR7V8MR1dehmk61CGxPPz7+C/72ORE3Qn0UH3wRr88dSePTv6OwsJ/q+xkJ+guK2Jkq1MjkLXnFiV1YWZiYVT3oxL+REHslLo8ZAHfQAKbsm4jIzoXiyzHFOE5om7HCL99qbaBQzb7dMSWK8ouCshc0ab9wg6a+dokPhs63GDJ4TMLZu4tA+QmTideIQ9k1Fy8XgkAfErQ2Lk/9HZ8jyQl9Hp+zY7LJtTHSwiGBghFMeHNJIEswPvuDfS8E+Jkzy+DzeS+OmDv/73uuAOYfASpoEPI7kRtCcEKZphL8Zi9I95M1q8JPBHUbTSxZ8akJ58ozpBZ4HsHIE2hQe8+L1Oce4xUE4vF+JzAC65raFFc39tg0UjTzl/f6dT4NDCrQI7idQIbK1mzUQ5g7lONgJk155sIkjoIaDTXSYEOrK/nmqoFhIqbkuawvRKPfsLbQPlOJq9hPM978KL19rCxMWYzIH1wYU7d7gKpw63qfm0sHp97Xdo4Nv9LD3WOBTkiW8YbfrmPri3m9CbKTu/Fncl4rvRioARFzo44ruuagrEVvKhJoQEmSn2FhMvi8Oh6bKNKkublE6KFVHgot7VR2REo4XPkkD/amwjMZaPZ3pA03hQ8aS4UOfOukTNeQEEpMriplFPK8Oo5bzCvTRy0pPZajK9mTP5yc/H+DrDsffE3x/UyTUy4r9vVi9mz3ni70+Cl3RAAAgAElEQVSki/3w9ff23Rff2JNdHAWgREj/dnr1Vi/imr3av/b+77/sZru1gvdd/X+dWrKF97WRluYJNiYMXhCdbIdAow7qHN693hQjvFsQdlFLvFDYdkJRl4FcUxGqhOfk1IxCGGKlUNVclELF/ylQOylPyZ0QCoXNZ5tQD8d03+wQEetTcaCYjTNYBWnYzxGUtsdn8VXwmf3RXCBlKVdTDCqx4E3U+jFvftuhzSAKBRAz4hdOjZs0x+UWdCCnBCEW9263t7e4fvdtPJ+giUASJoqwhhBu871WqKAdvteb0mXnxhZesyRKG0f1KtCNj/jvoELdVzu3s71cs/3zxwf789ff7NPvH+x5D8XqQjMZ7NATf4oX+r7SXMOicGLW1Khis8odA5rZ68dXf89ffvuV2YqrUj3enTD5sTaoFn7FOs9HWqJZk192PCaRsgeIZ5L+Sx+FkpqYQjidT+sB622xDoz5WGPx701XToUeaJmTzkriNFFaKpoe90HzW+IKcSCEH3DeG3Mx/5teYh1ZPF7oL77vMTyQn3omVz0m9qTgtX3kFF0UlH5M+A+9GTaUpZkyDXpwFgQfefFVHkUs40Xt3qCt++Fqowls78pzOuHmRER5ESuU5sJia+yu8NbGWWPTNSzLEBvMFLhz/RrktS3iurvO5OBMJ66D5O4V3dbL2a5Am2EAw0K/LEHHW5eAKas4SyMfCnHlbGwYMUbshNjLwrNTm8BkEUrUnZpFJuu6PjleSelfkGlZ5uH94ExqQrwmV0k3Na1cp2K183ohLJsktpIPgeQU1tERFPOgJhsbwrMO17CsZn7YhOiilbOvQ+W4vEPI9x11SSSTi0SqwKTvf5KOxgOS9dEaro9YWkZMDz2v1XNJ0RKiOVPHWq171AOjSY3aqlKrox/7W8Vbdprv4n72I9Lx+jDVGoVmm/QcVC/F5Nmo+VNHwwU5odN/UdxyYLrtG1EpRNzKr35qIB77KrNxnn34gdcAiiiK5Do0bCBqJ2QJ8pqXdy/+KRDbsfdQP12vb8O23bponMnpKTEIDhptaG8FquSOxrtTVfKIL6OhZHnE0SwdBB6+hRB5CehKNHygJaGZRkRmDD5JD+Y1ETUh6sbIeXWS6ezFPQ8xY+YcGgLguW9AbaO+BCoADghXz/9F3/UzHU1RaoSsbCBC/R/71wUY3UlJ+coaa7mZI5xEfwnmIz4z7hPEolHbyRKRDYCU7D+2riU3iiCG2tU9ISCExE+s2LHhAqy5DdfgZlwATsAOKRtYBCREAjNdhWy/53JPMhICKZOZprt+fj8v7z68/xjeioYwj9kHXmWiafWh85c9ndN9j5Loqxf3olmALqWV4Exc7ckq+4IDRmrLALIoVkyW0ounwg/CtCEgrKTBf98W9nzfB7FsxffEZNH9a6Q8g0zXAZMhfE4XWcw5kw+Pv6CYpF/Lr88YdGwYRO3oTz+5H/Tf9E3JuFPw3ndQ42K7Y5ULuhetV6K/JNFaFglE1mo//J5yqJaork8CnUfwZJ+86JX8XlUWASvY7vhMSr2pDqgFekz+Q6JfQyJJP9mw4uOs3vOKsp6/7vvZAf5oIuf2nX6dLZC9SM+d46ejh331KPKZTA/UVFA0JAtzTHFceRtFlfycAAqCVZtJugp/lMJP2fOe2AbK0Ba7twzEUraWbDNkiP9Pe3Y3tzcxlvpsNXf+Jxj2KX2mXaQyiQ3Kg+Nx+jtHjq94Ji6hBAuX4xJz8oD1wEOWeqCbHlKFrgp3EGUUTh76uYCh1Sn91rL2JI3qFxPXZMU8ga96XyYK3zIQpaMzQzyDkanaZFDt2jfK5zIVmFkEc27ZgYHjmosnw+G20bMfsCsd4PfjgVj62M3J6vOjCqfO65rwHAzImvejKmQGvG1yJu8kuxR2jA0pw7WNXCTzRu5BBJdW7yOVMZLsTcOhZQ2QA4CQpX37Qdwi/BqUM2bfaAdRQ1WO3eXY1vNfNtv8m6zbKg/HQ3l5+Uzevn4jTy+fOADQdkLX6mcEcyJDfv39LVc/vsuNtQuzH56GtwW0vuxmZfIwpE1d1mpggxUmBs4NH88qawsApxtTpBFOyDV8569DeE+uCfC6UiVUgelg7fDewkT4Esrk7a0G1cZrxWdxHC4FYDufywds3u6vZWBoDbksCe4jfctlD1nmM9V2d90c6PGf/kqV7P2sbc+iJJOhrcy9qqwaGVrEtoi8bwQcBbaICsYbcF2DP7nOXiAbgMAXAdy4FoLXc9wgFCX1HnYstIL0dBrSjyIX/UIeHVe5/XYtXz99lqsvX+Xyj4X+AToxMGxMECA+0Viix7K0BzgwbzkuR8RaAmRB3skmcv3zWl68fiXPXz03uMrtLx4O6F/R54ERCq5Rga8qkx4gAoqUuT6HAbktrXKjtD/doMA5FMWZ6t5yFe+be+Io+46gXbAU/zeZ2v140JTpUw0495co/nv2fAc7RQDO29HOjjaz81JRK5Z9lcrGATZwFjpVsTfybEIQuiOwrpUQVP7b5q+D5WBNx+58MZLwUp2sH9VgM+BRMLZHgum88mzRhnkbmRmnVDk0EBYM/iTbTAUS1xwSWOc5JZJjJe6L/S4JIgfKb/+CkW+80Fw7/C/tWUwzLNlD4aCcc6KojDsylgY+23l2gRq0obsMw5BpZWCejd0ML1K3kevsbjzn1rjPdPDy/B5pv7DwLzUKM1Z4HPO5UFqILy0ynlzpCbApVbM4l7DzVt2LaUE5gJis6yvHfZyxYCMoPiTKtrV0DahWA5VpHyZ5N59vrMe1teQ5gLtg3dkpq6FUXpc1SVfer1Tx4E6NrH92PHKMCYxlZYcdtJnj/hzrFNnteo7Z8D2Q7qfPXbPWE4LJfe65qpqdODJwEGsBwzdpM6EFpY6XBpXVnK9KtDWurWQBdAJbZxklsR/iPEfFRs1pgf2M5B2zThiIHrxKhFdHHQDCBSrrIJeh9HZlSICatGbubPLsZIZ9tJ4R7cVsE6opeCaf77P7ZW1TaRPdK5jb0uQ/AAAA//90XcmKHUcQzFpeP8+CkGDkVWCw8S/opu/xb/jndNFRBx19MT74ZoyRZumuMpUZkZX1LDUMDMNjXnfXFpkZGVFe//rmtwPA1WnZ6E3VbC8z9QgoMsCC0pG0D+rRK/T2kGv/5KiakgYdKegcQAL+Cjsrz6xgFU/6dXIcpSJEVAMuFXg1ue92CpRt98dMaRnsuIkS1FcV4NpDD6lVAo8IylpzqrwHkxTyUgphughM7P/S37uECiApyJcB7Zd+nwBoQmQmCQhArP/aghFW8QsCyZgcyW7pltwJgDZBFL4oYHpM60b2pmS3hvx0/1EXOLPal9V5s5mzCTkyhBIqdUr1WQQLuydypkru/4OmVSyFdDHYDUJMsMO5oIIy6N+LAz2HBSXz2FhALd+P3X93wB4vezcVFDPStqJXc/GNv6NtxVWd90lfVMu24XEPer5TnfA7N3ilmH919jVVcvTin3Zz/NuoVpB54v1M0v2RW1B/tXmaXb2VFlEUyptuGQEwggIqgalDYLLYM4VDIwZZ+8GKaZ4fXMZawviY/dMefHhzOfmBpQi7ywIY2POqcxf9rQWbux6D4ftcHJPzZ7dK/OjXip7+AwgMYHXCge291YOhsJ29PUZbmZZxWYGMPgN7jkN1OVI+YxuUh8UX/eptGf/sLQwUd5sARVwwjGD1AP2PQjd+f2kmOb2tZXxew6siSb38N2mPTfuqtVdv71JHBv4w+FvTSa7rMzmnG7kut/J8eyHfP/tOfvnmZ/np5Y9ym6/kJFsI+bu//bnOzE+5ATCPav/1diXnI0vdRxV/BIdVm7Xb3uXqfKMJidSLZuMHgNVq9Fhv+t5m1Tph3seAKia4CQhiy8ocC3HgLeEcCZMJn0OPIp6SgQkphimvAR3dKjzoakl1ZSr6dnOmVaTt+xXzJlpBhluwcj6HNLCo4kWw3tGKRlZZ+C9+cd93Sye0kVGnx4HwEbR+DjojVBd9Y0vEpuw4m29ZE1R2/ntbT3At8TUPcDnl+WLvNs/5rC0nCihblnO5ktu0yf7n3/LHuw/y+9v3sv91qL280v6ZZAs/4w3s9STXd3dy9+oH+efTv7I/fcTyMDzSMq3kTLBzOAg83D/Kw9O9fP3qW5Gbk+znLA9aCbWAVHlPuneONbppbnMEojEoEhFngqRQ0b7ELgcwxIEKq6CqWku0OFuTNQvUz1bld9E+gNQeK4HBTYJsR45jhmBcgd3nEvyLUfxZCOC8YWCrIwXcwbkc11eCVaM/O7FjCe8JW0VzO9lw5qCN4nD9F0uq0o557NWnzdpmokp4cw0U7EkpX+zbB5LdK25gEoDFkkLGpqSJcUEvH/dl/ufVg5gTWjC49yuubA3iynYfWmALAmfUOCWmaxAzM32ars9oLjPivdsJ7C+yCGfbxRy3A3R/CtXx+5rYu6FqPHGRW69SEJcaXwi257hO8d/Eqnfw2uf7nO973X+m8GVxPOZzrlghrGL/UBYA7IMLPss1xsJTAXVcgOW47+Y0RVt5rfsiExQhMfeF/bUddO2xwpQmPPEO6uiRZ/srdpZ4OUW85OWZ53NPfJyCnR4LcvFelzX2GTyboBPwBG2LUZlOSEAwCXWpY0MM7YkFYIgCDGn6BU/ubiZoA2qw/jx6cy97FoY5FmT/tN78O2JLeGQkhDtazm4JWNdrSTg/4z6l36mJ75k4jJaA8TMaOyA5qHpKjG29BQj2qbC6NCE/2wcswWPtwCrKnExXaBRUrLXe9lImQIiv+YyDZe6OFCggUrQ3JiGnXlpYT4iB7Azv0luX/wAAAP//bF09jxxFEK352vvY3TMgQeLEARISBESI1L8dCQKTODIBEhCBhACBtF+z0z2Dquq96p69c3I+2Xs3013d9fXqvd6qxGCTN9IXdoLwlR2zBhWwC2B8+v3pdDL4mjGnQ9bFYCSpdFAedAYWJFSsdFHr3Nj6QeLlSLPSKWMlifOvDje/D2kt+zn9EJVuErwZqRA2kQdPUG2qiRbkJYdaSaFQUiL0ZGEHlKKz2Q5Wx6yb6SRw0zgGzN+SpnkK420wU9IFBJnd8rmaUl3/4SEO7e6q2yeYt9GCCCUyqMtMbfqOZDhTipnBcnhZUZ7RhaLjmeNCZzDMzgxnFNlp7LrHcJrG8I5LiM/r8yddFE0CNXC6rohhREoSSNbY54db4v+VMQqHotmeGQdFjsvIUSL9igciZCZn7nWC/ftF3Q/1qIA/K0mRGAixCmlSWJzBtS5WcmetQTHuyZhNn5uwZzJ1ztCHpwaxEQylCcRBINThpQkSGF0PJ98EOaPMgb7poMGdQ0VgtjEb3YOnpyc5HA4hnyUByZcYO3DkTRMKC01TCM9yRcYnZPDGZafnckLgbtXGLLGOhRysNUg612SDOV8vwBCWVObY9Djou0zJSSlpB17QbkM1ZNOtA4R1AF3QMroGu93Wvi5Lh5EMT8pr7X0LyjaOslAyFYWicZ/5DDnkA9dEQSzU1EW+MuvdvNihZfBHsqaA+Lcu9dUvZPAvd+oCObQOihwkxOGdaZwNAf8rHYxIXHWdO9/n6UaXN84iu4jLYgUQvXdZAU9Lkt39XobcmvzZq90rS7K126jAO4VTKwxZYYb7h08MRbQZ7mV3t5U72chHw0723VYG6dHhfPnuMwesAwLLLB8Pe/n6zVfy5ZsvJEk2MsAkk5ymkz3PabzY3lmi0YgcL2c5jhf56/C3/Hf+V65y8d9jCepsMNvSwSwB4LNngJ/iv9/6DAODt7SLvPqsIWdGtZUHR080RTIx1txmXm668jeEodYJB+yZhW9BwJun9d22QCaK3zdzxRfyQgdZUHwqRQ90ytRX9G3VYZd4JhKo6fmjCkvNOF+juEpXV+9l5cnIcjweI+kgcZN+/nKFXChGxUiQOy3uA+cg4+wrgk3azmxID/chrYD63xAi+/utdKmR7p+r/PH+F/n5+/dy+H2UXetZPi3QxmTC9py48tzN8vr1Z/LN27fSv3snH374zqQBm1gXMKLrZxdPGB6yyJ8//Sq//fhBPv/0W5kewXMw4BdyLZfycwwifdes0DCGYEFBs7mZLRXENAohTUBVmJ+XOUjgDFlW2/Rc/Cb335AltIGcQ62ithGyx/cIcA2yLoKZ+oT9JWljQpIKImEp8l11ck4fnZYcEOoFUGbGPBbD3Jwp+uLL+VJIg2EXw9A+O1sFlehKAhoj9JXUYJpy+LbbM6J/tXfPbt8ad5JwuAliMarntIGurNfXuEkq/p6ay2O7fZR5coQdiwGMuSLWwDiH3gFKMDws/v7BcTVWJMJ5jkJe0/rna2LkQPZVX3VNiIgQ3FmML0RkZS/0Z+S50b22QsCwBAO8EruZ34YdFClpgcKNx2f+vkMpXNxw0JQkrqwd/WusLzhmOCaYg4RtAWlnRZJaNaaM0BgFn4z5a0Fxk3vDeLirRnBifKKKV7umXSWTESvnFOTeulYtEvK2xVmeffTMmjlc58YTwByJqitvtFC3GgYi9Qo/lzRUyhowwy9BarcmDl6fayvOwP9pEsvEfxyBHIDfM44uKI5QXa227yyF18Xet2qW0v5EirqEzbADHeYJsP+sK0jbnT+mqJXYvXYFCTbWXp/F8kDjN1kX3sdRR2mL/KkWVs2/ZLcBU86ZUqBa1Z/yGQ2laI1Efwd232//xN2FPfZGcRnNOyv/lnHcuT15AaozYm6H6aMpYwTeKYhyuU/+/miyAwFo8TX2wNUKyIeAuy55Hs5zwPfXe1IR1+Tcs9yNJNci8j8AAAD//2xdTYskRRCN+uqPmd2DeFOQPal4EgRB8Ad49A/vXfCk7GlZ1EU8DHhQmJnu6q7KlIh4LzKq177MLrvTVZWVGZ8v3hv15evmMXZehe+NJITDBkOHgnBaXcCAggAxMMEA8ZD7nGAjFrINfF23zOOQDlFJnjCqKDJ4x7KxZVJGhRvCYesFB7FLC7dirmNtRAhYUM79rBsYYWI4Le3gU3e8B2u2XWvx6rXNt46NpXy+uuE2mOa6huSEQneXxEpZqaudDgXJwrJjpEOhIXEZuDGS8uW8RDWPkofNaCaW5xsn/qFz8uvoDCtZRvXflVF27RJLv7Ri0BTJcQ2DqUapXcdDqWxoFIJiyS1nO6u/E0Ov39xT/mRmev6fPHtujOLLIvM6AzLnJCZ9Qn/o/ephbL+fkiBc+2Azi0hm4YAXwNZ22h0oLQDj9a/XZXM/sU+jKKLQcu/0H6Yxih8CMhpnHiUZzpreGzVSW9BGqS86MkKNgqAxMe4GfCrJkFS8Ny+cjcFLIDDKWqDjfTGop6IB4aSCJMQT9m1AZsU3WUPOhB/980xSHTAFazIUv4M5wX3nSJB5nuP92Fnp/X3a3lG248VHcy7guaBqg+/BLVNw7igo5FDPotYML7MmyxOSbSdpksQb6fKmNcHLaL8+TAxvAz1hkS4jGIY+5nEZmLBYSidCkiZzrsq2C3ZpQYWcDsYc9NIKje4IOK5SI21YEKwK1FmmxJxL5BS/i3bCNd3bmTX7W5xgT2dN1RcY9N+kfIoMdTTt/m8+/1pevfzMZvp99r+TvRyCud9B2D6SUfBzkMkQBBOmtFGzzm9vu7+qjx3sOxMLlEXI94AgbALSZVdFXnoyd5VFLloU6M7y9u/f5c37N/LweJKLJuFjcZUSGwPQGdsuuj48V3kfqr/Jyi509rW04tL/7QW3I77fKRWp62L7fOmiCLiie+djQNt9RrtjRHNrwTtbg7TSCq6wG+bgE4zT2JkVvtuVhILsNqznudDPv6udYQLmz+ejWzzfgxYFMcO+343Oko7rZkWYKJbBhhyPdxs/0qP7qGfO1qTvMP6H3x0ahwrhuzK2AriAu0EsKdzDhup510bBnfvm00UOw16mJ5G7U5GHX97L29c/y9Nv/8r9YBvFdPMVKdDZOItPvhwmL2qcNO68P8qX338r3/34g7z45GN5+POd/PPHX7LX9UZhwscGQPCr66J257HIu59+lY++eCUvvvrUlI7U/g3mL4HCq03xxpL94oiQCsk0D7hvz8MW/WbxEGDtVmxHkvb8fApUHNd9APJNUV/6rogs4fcSFUd1E+4JD8yX6ABmMjLehz6TFyFOcXbMp+paXnIRvRWBc+Li60CiMfhZJUCTfuO3aQ/ZBLJYIiEC+Kxe/OijQMuYhMVu3oNytrTGlEutOsIMvrj3Uc4KNQA2NHgN95urjxwFW3eJdWUC0a7ZEjI7F1DT0s/j05PHhKWGzab/WUuLk7N9oOJOTWoceoYp8Tk/t/eROUxiBn1oMaPFlJC6ZXFoBLqT60rf0QG1uJu2seuAYovpzmu+cDx4Yq0FvvPZiGQFvpaf3BzM+47nIpSjMM7VOMCcxI/vzEnjBkt6SJbmoBYUIQMpjKJ5ItcukDfnSEBBh552PhP73j7vFXwWymQ/jdMmRjIJZ4yL7LpdENw5ofUQ+6NKGiVIMUzms2h7HJxNRaKYQe39YKMfHWHKRug4NRZ8vkdBQZdxT/gBNLAG++5LqHRo95kSr2ySDnnkZ2hIVcZ4hhcEr5YBRNCJnsa9/bxCvYIFTC8wTxaW2flE86UnQT0amo1cr0NTx5siJtOMkaQRSjUkqdylPJVjy6oilouTZnON+8LPrinJ9f78fF4vfHsDyewXclXLU+vVVOiIcmbzc+l89IRSqvlDVBDtlxUrkCfrXjwcj57027W9IMT70QZmHmG02FgZ/pGra+OFxRwWxPQc3t/dy+l8lv8AAAD//2xdzWoUQRCu7umdXUyinoIoguJB0JsgiCB48gUEX8AX8eF8AS9C0JMkFy+LxMSsM9stU1VfVc24gSXZHGZ2e7qrq6u+n+7Fx9efjH8xutcuK4WTI1Kcd95mE6lLFKAYDuUWWHQR3qUqvIK3bwu/olIxPwQOalNldjY4HKFDDTsS5nFkg76RJhrT5QxSErsitmnND8cocMgGWC0RYa5XV0wQIikHDtA8sZPxhzctjo2qgSfligNGgu/Rgnd0W7ZXFqgECEiAE/mXRZFEdGNQyz2romoSOz1cQFLQ2cQ1kXix+qdBSkUkka0lVmItYf6p+5HHE11pbB7RV5RTe4WeMP8sUCBSpGUkuW9RATuIXlCOfFILrQbZWRYIvKvUrOgim5l4UyOZiLDpmOCieBIpBsLDH5jSwgHTLKaIRUyEDzTMigvhEx08ADSFKDXyBL8oJw4w+t44Zc5T+28uqAgOAjQCAJ6DwEhFJAUw7pw9+e7Xbp2E+QCIm8DcB13b8mkNRpnmnWnhSGrCEdSge008rTLcHFlSVIQSirDgWYLryAcutSryw0HRg1hV3/ps1WVJYiUAC6xRnpV1x3Q5RTh0VuXoHLxqUTzhZCU5xxCwQED0GGWBBFDjwhKS2JZrFuxgfS/XAo9tb+tfaDrCrUdnIav+gq3NiRK1Gwy2b118i0NzKhCZgnKyMZ+KH75BQSk5uKAoh9aWnXGFZaMuWmwBVJOvOxKdHp/S03tP6OHqPt1JJ3SLNrShNR1RT+uJN00dv5/+3tCKf/dUGAFQQsRPizWewl7QWExR5daSCOIVVh3I1DN5oPB15bXiu23wStOdeqprol/Xl7T9vaU2oczqYNBo8OKxt8UCAH5maruLQ4jMqVkoMEGqpPSfohofWB/uUoE1VG2fSulALKlk2i3CGXSHAobuqxgac2y1QJsC0gDDafMzvI/3WxZJTYVekUVSFHWFekoeiwEfRlE550RR9yAFHinQPxhPFPCw37eAQAz0TZuzLYgGM59aaR6sys9CVEc0DFo4rB2tbhL1l3vafv1B3z9/oe3ZBXV/mu7xEu86K0Y16jm2VroR6Qp69vYNvfvwnp6/eknHt0/o4tsZ/Tw/p3E3sB4QNH64QGZEAGIdjMvdjvq7R/Tg8SMaWI2KqFNrgaQygpDc4MSV6T+Sh0G7Z1kfx9hARwKc3CnOwRIwoucmCDjv16PoPBkv28g2NV7c5x3uVR1ZmeO8U4/22KyAg0C2RFXExqJOxXI/H7mJ8deoT/OiuojbxrwyNiTANcfch+AaK59vNhL74VilhdGs9MVRnaeMDqexm+mMQeRzSUmAmwt8vfFZUs629wmKYTQUVuTsSidUGw0qalkVsVXs/6L3wXHpAB3UdFpCHI1NLN63gARAY01FpktxVy8RiZ4/E4g3YzxWpRhF0HQPgkgplOhQGE0Kn+Z5oUJyoL+25k5hRnNQeqZwxXuhsgQUcPwbWg+R0gYdlFE52U1hzoiTNsuRl4UXvm+DM8w46B7cvKMb7LP3ey8kIa/ZV3fqAe00PosEva3m95r9HHCGBTqRdS66bOMV1wXBYrOCA+JzhMdRqQDOTU92xsOztbNcyGOgieN2hE3zMJrpQKGgxHpC2pxCERvjA/qMPcM6b0TyvtClkIuOnt/Mii2IAZ7Pg4LEEVdzGKyrFGIEch+hhXSGagQqReg5scjo1uXxO8hZ09GCUWMkrk0gnIGaBRV4+t4THQBP36nMOkbRvSUI7soUV+R0a3R9dWVFv6mAu157A5Pd0YJtL5xUQFcSipDs1xwniegfAAAA//90XcuqXUUQre697wOvEuOVOFMCfoAjIaADcewov5GP8Mv8AkeCkIkDFS5kcoN6kSRn7y7pqrWqq/eJB+4gcHLOPv2sWrVqreWbF9//SJGJ66vRw81eSEkqwpoEMQrEYiqs9jTZx2XRqRV0H074tJD9hIDw4KCH8yLL/cwMiEeVl5O8pOBMDdW4NPrbCWjQ6WwDjWS8xedyA12baJD3bfhirIGAmpf64ig6/+gYwASjBf0f761Z3KmFxgCDnyPtdB7rFv7ttK4g88I9cYdNhVIIBOIO4/v9+fvi65P+QfeftAR+C1qSi584FdyFwTwpdHRrFhGkZoBZaBhYNH4Pe8ePrz0JbjTQ02m5JmdB7yxyw0Q9U7AZLFf0ysRn6u7171kAACAASURBVPlpGr20pUbCP79GcEpxOu9ZHWI1Ni5hPXgEAWbAJh9SFL4xfYSr6wBfeHh1oCuqfAnpzWuhaZuCkJqEON3rd09jJOHiwLWpU0KlIcqjaNnoFx+dJShUqLAf5PvYesNzgcwD23/qQQV7d6NVAIecoa4qYZOpKZmqAAA0ErBqFXqKAbVQW0b1GEBRptU3VCN7Lx0FiFzHUtFvW+MzvCXoUEE4KPV7oDQsGbvGiQs2uoDQMYB9z3KPuSuwRfTkz8+PC5xNrsmw2vwZpe3tm+h7JhDgQcfsQy9xIQwgI18cDFpbBE+jN4/JW0tWjC1FIHxmBmX2/GjrCIGmvrbaIo8vHsvT2y/kyfqJJd8VyXlFCmRAoLqaOZV5C3p6rXNSJYLTw27Cc4kJrpUuAVig7m3EhmpVwUWRuCGZcjmulv6cnrjVJg/7G7m7f2VsoWXtz9Xs/3V64wmVzT4ufQ4GSDh6QzVpeDDJjj2pI/galRcCTN2ecMV9sgYQxHnxILyMwJziqzrAHVMzxjlH4C5sNWFdSZsnb9spAQAIAnBFMOGL/lwI8L3AY5mBXAsCue8Ti49jLYlmq2xRw4bnvt2il5yB5ai+qXq/8tmanj5/fC+DPcW6tPS9e9q/2yByeSVXusr6+p3c//q7vPzpZ7n75TfZ/nK2TGez2N3ToBRtrgkqNPW66Mn/s6/l2fMf5KvvvpVPbz+TR48+krf//iN3f/4hD69eS+vJJ+oKDgJUS+sp89fX3/3D3/L5l0/lw9uPjQLqR+yOipaayvfp5CCwAfTL0Oe5vJyriXneaBu1wSpUIQrKIFChsl6pTxEiy2uMt1XHdJ9uxJIqjfZvgvOTfaQ7+BScqWQjKvt6wUhQpae2TFX4/OL+Y8HmDAAIhsEI0PN5R8HV6G9FC2oBE9SKDp1yDFcrd0JyAIXtBh2ENQDh8gKxLM/EGRCpSPQq2Cp1GXEFxcFMH2HbAgQQaOuU4vc921eElPH4Hp2q8SP+PsQrR4tispVaTj4RX+27t2ah8NNYlEhWsBkQ3BF7U1zPkzZWnBe+MayVjdWgqfCnrKhrAAZHtkFmOQWYSFbgPsAHtu8WACMKEV+eSdGrD0GzSGZppwhR4QXuV7XUs7UtEDF2tsQ6xmYfri8l1O4HrVwm4J/aZ+POXdI6GS3NLdqVM/hKazvG1C7EyvYZjUR9rMUc4w5Nh6yNVZONJOd2+18bQRTTambL1OQoIFaBJlBLDQCuUbJGHDxZ4BTiiWsUHyctjjYVRd1msACQI8Tn4Pxs05nnDQVbxPMljXG0Wp983XXmQ8U5Zd/R6MhF8dDR+tfHiLFAWKAiB5j0A5D8HwXLA3RIgoc3Nzfx23q7h41ZAkXSTxrxXbAxEL2HjabH/LYn7Le5/pXn3f7+DKB73uz3bH9msljIYKy1yn9kXbuOHFUQrXu7Wx4jGRMhkG3JQsSkjvgCE/AH/AofR0ZAgAQJBGAJyyIDCe3M9J2L6nFOVc+uNA682t3u+6yqc+qc5avv3nyPihEqFXh4T9BSGRZ+hUhCHB27MqBeAkHnO7UGMekIIOTYQ+KzzMCBatR3SsHYPDVZZrV4Nh4AXMi4EC1gGFyYszwXRh1JnkCFPtAY91ldKKgHGuItFhE+Wr2eczJ4a4Ut4Qn+MXjvBfHuIdh1n/ThnXFgg+LkQiEt1KBv/HuJZhfHhpIwo6pVx3REJd8pbHjWNVRL10O/FVCrJ4FY29zT33fyb9QDBgsQSP+NyXF5pvgXvfb3giYQ+MOaQzEjDzxh4mkUpdOJ9hkuILnkxRoJrYv9ZAXbgpM9+oTiWfT9tIi0ROIG0Z52GNPcuXWc6xdEFeEDu4TND3pfa2X7MQsiD4ZKrddAqYqyTFaVC6IX02LrmVXORgYNDiEvanVSi2oRZ4ZaNQpVSmtyjYBRkph26EfCPgfqMiIobECUQf0kK0Ap0N42g4vyctm5NyyIG+lWsBpD5SpPNVHYp7VnuP1Zyz46Qb/sDY4yDHhT0wOXoKR4UQw9etVwBi4Uzzy2l1Ab42666oUA271lzaJPPai9OBgXaQigdghxBbul9c4dw++XSz73CvadkMkBy0cLrim81KlgS/phYXVVgcYeaKJb00yz5TIV54chLz5+Ia+ev5RPtuey0nrN+6gdDV1owQT0b0Ihux2f+W43lZ3kdnAICkxsTPUfZgu01SmFPVTczXSt+O3r52Gc5b/rg3z45285D6X7DXsXP6+dco0CYi8tRvVCT5eOzsAZrXK870pgXgNIF0Ly8xoJutSkRibRdRSPD8HEgGBay/Nu3UwMsxX7sX2/Bs04GQC+nlPATQKprlo4KGzczwcCWewJP7P2UBnv+QkL1jkn2+UoJskLV5iU4fc5q60Tzff2wMEWAI5BuV+q4Jp+7zJcIK8voWsyuvRbN62J7SKyf/hX3v/4m/z+w0/y189/yvYg8qT7WurmDOFCkZsmdOItAEZaXUU+/eKVfP3tN/Lm7Vv57PVrK8Q83VZ59uwk79/9Ie9++VVE2yRj4bfUgwwxUa9YWYvgaZXPv3xptoBKmVR70NmHBb9X+nYHcn6+mjAd5keHDL35TPpizpYoFLZg/MxI9g62gcW/G1R+MPUGkww5JDf4gn4AWFOtrIUB5yYWAG5kCbZAGieC2UjotoKY8/6N9XE8wyKpmbmAMOc3xjz90XqVoAibUCz8rofbrt0oXrgT0DA9pjXBBU3QTcOFKOfjFh8ICOuD274NvSkW3/SMAv06Wt+cRp7IP6yGbc6l0cOc6HOxVJY7YbnKFEKijuRK5+AjFW5T0C16qvcCMkGsWkLXwea8tFj63T6o6m/nzfmSc6p07KINtcW7VVz9fL2WpC10ebuzV5WNaJoleqfvIRY7O/WYJjzz9bNEXCTJUFsX0PMz8TKLZ7oWCJOvbAMcHJtZ4mPOZ8tzlfpPdzE8YhkwGVC4aQFAOAPL95eOFwCIXpgPU/IMbAQ1xAvknFsXHgbyzX096x0tKSCrzxW6XmBbWnEm/g9CjjPez6n30HtonDOs4U7BQeRhzez2UGjTsYUAM4pTlmhvaxRdF7oggSXGpVHezwURF8bjKLZjTBKdzx9vcFwgGu7zSdBHJjUpegBGp7hTqB2zLileShYr2jGQAzmrAiwQL2q69XQKn6IFEOzdBJSNnRrsLAPGFOTjOiuJOc9oxKw4g3T/FBc1LZBG77/bo/ozAejR35ktpc44pbaaMXa11cKZKvpzbmEdgqNN5H8AAAD//2xdPY8dRRDsmdndd7wTFyAhWbIgwYQQkCL/BAJEQM4v4b8REVtOILEMEtLpJHBg3b17uzOoq6pn550usPwsf73d7e3prq6uKt/98vpXTqW5m5zlaxl2ePQTNkzCDk4dl6877bFOJLyJLhJevOH3GjsysAbynzc2/Jv7FFf6cPuOqSmoHb1f4KOZIM4yyc+bPqaJf9bC85LBvPsdStlSHoh4rUTb6FOopu9Y9eJJRTzFC6FY8j2lsJHDXl4TmmVZjINJCHfCPcGOpyM8yzIkptIBkWiU64DOmKjyTR7qRQWg6cXj99S2q9S649Ab1br1rfo0CrsuExMzxAkzJH5wX2tQx3QfoIo7HwBi9OeklQBStfZd8qBVXRzEamY2TaGneRoSFQOb/vt7w0RUbdVUqliLTeCeKBLuMSidQckZmpTIJk0UlzIrkP1ZpUsF+NRFDHevVt9V9kMFgoFGCi+SXxdHjCnyPokLWu94CEfSeA4ACGp/qPqC3rTtgIMfzkkJvpXUk1AND1JMMujN6rE3icqGg0+WRhQHOiuOpuE6W1fIDhEbFkyaVHUFce1ft7APq0+uR4hqMwFfohnJ4hLvkscBL6RT4nBAFu7Qksq+i62NP1oLADCNM2Mq5Wp3i/3jbKlw2uJgwSJldJ+sch95sjkfbIVq7ZU15LDK3ecUFPO9aR4VpAFw5taTZcR6LwAR2617E2fZFjY0eVX56BLRj3UIFkznbhc4go7WVy2SQEg+A4pTCfjSs0SK99h0Om0UOmKMQAG8EQQNKfUq2zmPCQAA24omJGsKFp7LYb8VU+34zjaAlETJC0TzWn2EiKOr7qeHZF/cfGmvXryym3RNz39nAKRic5r708RbnDltg10rgjGE5ZSXnzh9jNTk3V8303kgJW1ZczKcq/avGyMIwEDKnYdgUrF+OJ/sr9v3dvfhFpfjoHDaZtGnm01LuSjC41nG58560eSsthFkyD2e4zOddKaeb+sgkAeQdR0AgqTda+2aJsUB7Ga3UbVdz8oZYSoMAB4lMlMWuLVQf6XrzsT/7ywSI1C2bjx7nTrYc7Cex/gZzfngYBj3odYRQGVxH+fBIyaeNRT1mNOesXXNWptLFg42ux3eJMCX9EcyOvjXIqcLlGhsjjCh83G9NxKr2VW7ws7//bs7+/v3P+z9b2/svz//sdltAJU78D/ra3r8+K8nqdL7kXf47Givf/7Jvv/xB/vq22+s5MWOWG3J9snN0ebc7N3bt/bv7V2X9EsW56p1bQuUFGez+/MHe/H1S7v+/FMIC/oru+WKezeXA1lC/u5X16RZbHUWA1YL/PfZbOPsjGfbwtuf8NiYWYsAYL9/Doiv9QxWAf2+z8ppK+0r0656HwXxqNYN3ZhE8ShTDTUXqpi3KivNYCOo9gLgiXMnsX7TeUqacKAkLHyrHJrghNKqGBhGVptRHdvjm2JvqYPH/u9isOKAxyJmFlYnuJPvjTx01tCs7RZjpCDHSgNXAorWErOspENBfx/SlCF3WxeuDaAANpDQ0rmiJkcIy6UsQKztgMYTu+ao38YBAIAtARHY5fd72FhjB8iEXDd4hXNKb8pDfE60/2oAmR69yRJgOR8WUxGvJzPaMNeug7THxaSVwAw2WHdRUl1+YQsH5kzh1J3yxLZlcLjMZkbC9Xy0cs52OB+sfmx2nI9wb/EXrwbQUyqPnZx6Qxisq2iMgzKdY0ASpa1WK3vOeQbQjcY/pdRdFKCzIp/8Ivo9ThGdxWnoT7xeT7IbBUstMz8RBNLnlbpXWc+uaCXCZJMaLjR+XEP3R5RsNG8c6YoZWp7YKQu4CJeNWewIOflAGX6mva+LuKYhd2eBBFlDBQASE+PxJMHQyet1reZYij5hjzNnSBPI2q2DI65joNAZixruxuppDLssVkoh9lxor6rzs4ajhc6inCcNKLkLH4AjYm1aBByU3lvEMBfAqc7UYKuQBTRrSCBWIupY1ol+tgIgF2U+1iU9n/j9CeeSaORRm+CSwn0qLGvj/mpgHpWMmDkAbXWkuYMRWN6p2P3HBwI0ngX91kCjjQ078oBYbn5dAN0DLJT+gV+XAzYc0Mv62vWvBmcj7y/Cte10Otn/AAAA//90XcuOHEUQzKrumfWAwAcfbMk+cPMHYI5IHOAXkPgA/wd/x40LtiVkCeGH4GBfOOxqPdPThSozIjOrZ21ppd3x7kw/srOyIiMjpmfPv//V6BwTOkCTJ62GDZy+QcNMCdBeLRhcOXacX9ATmq3g6EgwhU06MtsgMkIbtBmbpEIbDmwqDTQATQ8FQy5ufKYsoUsN/tac4Zop1tfWAUWO18QRTd0wJ6XzPejgpUzp4ctdbG666VQQegPrYFmRfDjvQKwFReU4ewovZU2KzS1CpjnEEP19QI3MBVK8JgZYOLU36G0TNnJUxqTgBR8ezr2cB9GTNixUvI7cRARqFgUfld0pZlgAFPk1lQqv+Tg3IpIFNK6GRfWoNKT9QOGW4Vhinpw/FzgjsIhfMP/n8+gzfX2Lv5cXq4itTFMjJdNiuA4K9Q2aDL1I6GwL94/HfRZc11ojuZM/mmOjgXZfAQpposYGsCbrFp2XU0GdnSYogk4CNsuCuU+ElH6pgIn+Hud5rXuxw6LpXXRSqtChKCg8tyyObOPI2MpzULSBKpv45/XcjlTwnlsn0eJX11B40C+3J53xnm8nufq0k64rL0ouqt4F0GNHHql3jH14rkq04rw5sZqsDEgshQGpsxBxMXIACB747N3F5ybwzrUoIqdJWtw5h0bxxprm9cnO6QsYu2K5WerpRYJarQDd2oZ5dHVwOJ1cAdltuvDsK+jRvcLhF94FAMtxkkf3H8s3D57IV+Ugqv2fNt4FNH21GOPyV6zjbith9bbpFjzLNozpyiWGAQqpVtO1xV8FhmvfAwm+OV/Lizcv5brdyP6qKKjcwSNji61Omc55LT/TfI33N7O48rrHv2es1MTeyHml0j6Na0pLgOYFy4j5vPkzODA/6Is+R7eWeYzdkBlzzbRy3aGLn/2FL56Nz7KaynD+XJ8LLedqdKi1Nth07fO/rN3DG5ddh5hH/PkoBhitWkwSbDlrTTGvVe4tO1k/3MrNXx/kn99fy9vfXsr1m49Sb0QmNApmFnw9XlfTAN3pfTmrmv6yF/nuxx/kp19+lqfPvpVpd9ABlxmxW7TbJvLx3Vt5/ecrOZ1inMUDDydkrCWR/66P8uXDgzx48lDa1U6WuchaV6d1Smt+TcfZUwNqWbzVDfiu17Nexp+gwFZb5eXoHUqKYGXA0nNR0i3i7xgbqQy/n22xqoro3vN8QcZI/76DD25fCICA9/qM9V5aUI8bdQaSx75Ff8QCmYTs6PaYvz1+ClZAer6UujtRawUz9UqLD2q56iVIWFo2jFbxnMjAaGmNoPggAe8ZLhjGEqQwddRXrYR7UC/Sea6xgaCd1wRNiwVaSdTUiTzE2m4Yh1zj85g5Ofal93PF6AM6mHt0uV1FPtPM2/j8e0bexAtBkKlOl8/0QGsusk705i/qxPHFsT+jJ/n3j/fy7sXfsl+qfH24L/v9QcH20sG8Xm/0EdPZmoaX3JT4rIL12J1uyEJMdehdx5ZrABnW3Bgv6nsfzsMLhAtVfHWxtXQF+8ZAguo+9CJkABTPf9zzhNYF2Z/Qz5p3IezcxqaCpBl42xSXzf9LrNc+JgkNs43AuKQRmoZGFzvqtQaTxcT8DGxjTU+dMNzaZB9tTluTsxKZp9a0fhTv0qsuCVhypitydhHvyEXRAFRmWxEI4SVbUWiw8Virj4KPTQwbi0XjSsY6dssyYAwwRua9jQLoV3J5iPijU4UBE2QYkYme108CG3k0wwBLarLYPspq+GDgGVF+BNEjRjByr7V9Z7H04zVnA9v4m/aAuh5g5K4DGnpYpcj/AAAA//+EXUlvHEUUflXdMz12WIJALFeDBEiAfOAA+QE5JTd+JD+BMwKJAyc4WCgKEoqIIiGkBM94MtPd1egtX9WrnnbSlmXZnunppbrqLd/ShqrT0WTV3myxktQLe+iLWqomuQqZiW5BmSenZCJY+B/fqLUTKmodp8R36foe3MCRFGmi7cqjVZgCuK7W9cbkGKNO1MxzpwoyW/u4Qqyo0gCwgSe+pWZnw6qXL/fHCi6iyT1ZJWak866j6+3W+BUQ7ik3Cxw9XySQDhGSPnMvIJvEvcqxLIILIiHeKYCq4E07QIAAzhOupU0tzspAhK+9TgQxc04wyfgJCgmjfyg5IYmu6wm4i1QCDynz0TCpnGCo/XnKxD7ka9HdIpyIvyU7Fg/V9m4SGDt8r3ZsiSfaB6cLGNwh5ltwHsSoLIZgD7tUQMtCwYk2qvlQ1afMk3WJg3klA2IGpwyCIumMnzsapYCLabhPIty4Kiqi2OCI4RN0BCGAJEOdWF5rYxHQJBnLVVAAQRHnBPCaMYaxkKrnryTRS/eSee9FZFItTuTapUBdOKd2v6LhyXP687dHorL/4acXdOeT92k7HWgS+FcS9XgSJEmpOvsugp+EyZLsYBAsqUw31nkI9XEKPy6aboAEk6fCVn6/87NEAC/7cvafPgDx0FMOZAbT5gAVSQW/bC40dfn5prC3pF0AJJ2cYK6brJqLICZVnO76HMZxsCJJEF+0YLzRKQzSxZQjnWJGIFQq/gWwI51WRp8wYoSJKaO8PC0eu73D8fnlTOQrBVi8NdZl7bWbGEi/nawZf86O9vTfsKX9eEMpMBqCg7bJbLzsWi9YSfq1bB6Q+QKj/z/eA1EksRsym1uy509AJ87SiLKoXZnPk6lQo0igaZA+QxtGgbCLyKBFG6bDQECSC4Xb/U5FLw1mWvahcNj12ZmJuirfUW1prasOKl/Wh6CT4tnC9FtdJzLoq7gDLEBuqzG2sLa1nXZNpSA19uLEIi8NioLh3rB2/4nWQXUnuDMfji2FFz3trp7S378+omdXf9Hx3xsKe6AB7SekEEz1v7X5+8h06U1DH3/9Fd17+IA+++JLurt5m9j3R46YA2Dhjq/onQ8+oovLS3rvp1/oydVj07tgl73TeY1FrnnK/OfxU7q43FLz1h0ZmUxVoKYE6NmHPk5ZACzZOMyuSzm5jFlcan5dvVo5hPgAbWZHHA6+5+O6Md5qsTOLudgfp3r9gdI3Np5LklGHOGGTrtJqpZZ1Rs3jBLQxDQs4Y5CtJxM8uUFrMGvToU+Z7qa0paK0XcQmY4YSYz4UMd+uk88WYbd+YZDNNgTG2kXTzq3EtqHsF8893HA8JxzQdD4mdsYQ4VeOmw8jBRSEPfc9F6hjTuaEFtMXO0KC3SzTPQevA3HqCoG1LLniY3AwfR4LsN1jp4G85klhwBXmYqGe3raBggTe9us2cYfhZ++QaHPTUHh2Qz9+/wP9/vMfxA6Sb94N9Pk3l/Ttd/epe3dDL8aXNHBXuhlFOFPcZMLtx6P0B6NFCKKmzR1fsVlzDSy/oWDg7bXR3ORxcH19TW37hjmOjXn/iJsiLApnk5hQ98zRiItQ5xDsNqFtNFMmEzNs1uhYo3gVnIhnzD8ns68GNUN1GIp2ElnRT4XWYy7kd85tgVz8kQt+HDO7dS0Z4htjVrj/pAjMdVzn2AH7giMRGoCtOdTINR1RSIj5mRWLUEZ2jMv5SV2k0Thnc7YSyhbyplvHwoLDm7cKBXJkOIxVnP2qLb+Pr1FTnH3KZ2rsJMVGeSZevT8eW1qs0d+905aKkevzxfeQG37qYmZJPs7JXFdkjBmVWFCcpi+GXFSbaHrsnJPw37fbXb5HZ6s1/Q8AAP//bF3LbhxVEK17u3tsxxsUhJDICAKRkFizYcGOfAJSPoAf4UP4AzZseUisYYEEIgubiACWokCE8nAYe9x9+6J6nLrVHY81GttResa376Oqzqlzug8/+/hzVL3EasgSlr5DH0Y1n8iNb5RKsSGvSsegCANGJggCcRfQorEgB0N84ZWIJzxbXcRCktDe0V7vfQUNcmH9VpvitvU7ARH1hHyaHHXj1/145QJLg4mVtH6W4n9nm2Ct+qMDXMzqblzoG7iwBNO0Q+Uc/y+H6k5EAiGgYYPvmxtoNLC48AQGF7HX2MOLz41KbQzGqtHg5kABptBbp7aASwEYPYzJP3+yTRCfGwUORw8WqHBricimmDsahd39zMPhpYmg9r+kcK11Bc57y7HwV4eXoP/eY9l5T3oyqvkaQfFN1+ZwrLpREOnSOdO83fG2ghCkVnhIECrqctNtgCgd/421uVt0JsrY982Ky5EE68XnviajaPh4C71pnHx8nZaegTjPXkGeQpW4IfWd39vOPUKrJyqx37KsDtRojxirrz7HK7kOgifiCwR9nWC0pEjvVzEKJFE39pRfEJ0/+Ju+++Ir+uWbn+nhTyd0dnpKb793h4ajQ0qM9AjrrlEEY9vIvE7mgrgQWVUcnx1q69XZG8nRYknIxd4tjEVwe5Ak3YQP149XUebZ11JdFUog2lbcLswQ/GQ2NZvDJWU/ICIS1PedC+J4f1x4D7ECM8Eb7NPOJOHig4mJVWNkMB2as/c3br5J25u36IiOhCJIJnpW0bmfqvY6J6Wh+s+5aIEmKVKQVyPkiLGdPSqppo0A8pRCFSOomVu+pQjBQn+FNQpSoTHx9/ocqdCTqyf0x9Mz+vPpX3RZL2lzYKJLUK7nPfOg9xaA2G8f7xHWC4oD2D/jvzv6as4sUI2uQW3a7234zpG4qoggEnHdk5OPDFA6XAs6L0A5SmnoEpIBQZ1M3wXzS+5tTj4nsOaXOhW+ahb3RwUOG5Nstv1FPaBnd01Br/QcVL3j+l6PLx4aD+gPXT947+QsYHQnRpIcog4101AS3ZgyHV5Uunp0Tv+d/kP3v/5RKP/TvxdE7GmNIqsk+zbfpHVCZx7b2PK192mm7Qfv0917n9JHdz+ht7bvaBsNf1Wl58v4MQNg09PlxY4enJzQ2W8PqQuCltflTux8drF/Sds779Lxrddp7JO1mKlPta5/csaXFCON7DPT7P2nvdvMdq6JtH47JGWzseYoN4ZQjAOQ8EPFHK/J9J68ULqy5YyFrhizCQIlTKJJC1/u9GLnSaLWi2vM0chadKcko/KkZHoD1hbm2gP22lm/Mp+fiN/kbKTWglksftPucp1HLYHSBKw/GHwdD7b3CShi+lBR70YTxOpAi8Y0sHe1tZdbiyaP91XRM5uvq3aXufU0z5r0zy6SXC2GRc+6MlqrW0u/Kh7WwJnixXxh3/JZtEcBqPe9jZMAnE+dWf/CnUNiu4hupmROO9WFFiO7SbVNVvFALEoltZLjGu3msqPjl5l++PJ7uv/tr3S4I3qN3WL2Mz36/TE9f/6Mtrdv03B8gyqzMjtlaGW4wFyzV1BIwFAsh0WbtLuldXSxfGCeRDArBUHoYoUTjAXmHhdOYOcnujjB5QJuHr4+irV2haIa4iXV+Okkf8C1VdybfA403bOG+F6HKoPBp1aIvQtCU9AYS8aGbUXhpOtn6FtcDGai5V3S6mNgXRRoBZLt1ymT99hDOwrJPwoSPHdYFE9ai0z0EIWXCUUVn3s56C6lsF8Vdw0QoU0uUPQNpMQ6BItIBOgNHQeDgsX4drud+OMze2yxt4U2Y2EssJK/0fYbAN7iNR8vY9Tqutc1A32Ddn2LOawVScAVuce9FPqE/WNrWJ1KNLlHPI6zW7dIL7lgVQAAIABJREFU/Z046rgOSdNsg9Mc5xx8X5gFoO+VxXr0/MU5jdNI/5N1LbtxVEH03O6ehxNbLACDEEIokT+ANRIfgJQPyJYv4Sv4Bjbs2GaDhNhEyg4crCAjJBZOcJBtxj0z3X3RrapTt3riyBvHnpm+fbtu1ak657RffPPlt9kEqajCyuRXFsCsAXlA6WYdqhq8oWYMmuXFXWDGgmDDETAL6p0pZE7Gi54pvdtCuYq9WU9FoICbDgY48GBcWQDnZmjMgaBto8jDPIiy8E5M1Eb1aKdYCpEkdml4Q7nJOjswCDowELCgoiWXB9xJuW0IXBOKSfgDFcYiVehi8kKsjn/qLyz8Rs8F+8SjUkbJFj59QWVVjqjINXS18xjXhZsO1vmn0BOL3rrOhwldTSAHHy3H7J74eL/sE73ulVlbjJzIMF46BS2iQj33Szbymxyio/LV61h2nUqhIAugqrAIQiM51XF3dk9gqOpExVCuS6rXSKAodm5TGO9LXjhX0Zy4tvxd+mvHwz2bDgQTHfXwX6gII1XiLcHjZ68c7vTOAeFdpGnyAFMLluzjURQJmdzjXFX+KYqCTIAIjp5XcCZ7QNqWsUyj8FC0h+shvEgronXKhAdc44lfDnzr8hrrxRq7fkK3aTFc/osfv/seN+dv8f4InK6OcH99iz//uMTjszPgeI0eOlqm1CNCssqLX68UiBwt8A6S+BpnLrWzIipZByjaQXGskDFyuar/x0IsU4DUE8EmqJZXa6Z4v+OzPRsRpKVj6Wp06qpAvjjVacv+0HhsAJDrPjROIZgCPSl+1ljwSXwyAERimHQsyuGcsS6HLEqsK8/nEg+WRzg9PVWeJzJuxjvsmj026LHFTorvvTjy67f8S4N6L0ML48b6/+4I4GN1cP53IzhB4xSa0rfdyzsmbOVVM3qM2GCPW/S4GXtc7+5wO/a42r/BxetXOP/7HK83/yAt9XVFA8DInwWIiOrMsxFni5EOAh10/Zuw9104yWLYzqxsHcgi9artZvuL+gGVVgbn9HrM6loBagRss/enHWeJZ5v7jXaqtKKUPdE1WoANu71ZjLWaZIR7q7SihX+Ww5jOEeD4TW9jbReW1Zyr1JeuRfm5JMjyvNSChAkRKXnshsSvQ4qFJHvlHqQCenVCAXnYHWFZplHuRjzYNNheXuPNLy/x+7PnuL54g7TZo51a4a83MuLPCJNkakCojcVrumtwX/jWbcLHjx/h66dP8dWTJ/jk0RnWiyPT/lG9k6xqadhl9SMvIMCrlxf47fkLLIaSKGbTPQqxVwAGPav7TcbJB8c4+ewjjOtGwDWKOokQq4zADsEFQDmsHNFlfG9Ee6l2pUWYi5NBVpzs5Tycuxvxb2tDIb8jquz7OxSBBADqhEotqlpXSK90JXUgamcxhT7apHe65lIQ0DqkkRLwymMtrkuiT8C/tYlF2YZWYImAWjgLCUrF6+N4uOal2tVztw+jY7AYHK0Ir6KxTYjbNjVr52oygHhPCku590t1Alh0bK4NllMPJp6rUxOJQoD2fk6RHZWTzmdGO6h6fg3j4MUQjFZBG0HaHGrOpM0yxnqeSeX3C0CQTARQHGgOBbztOc85+xoxRnBK6RCAYj4tFMhhRD9MWKUVTrZr/PrsBX7+4Se8t2vxMC+xmhq0+xHHKeHqryts/rvFh59/irxU6+0kDS2K5nWe/8Wvoh8gY9MmrCiiqubaRThZBCjp6hW+/DomFc5rzZ6XHX82dkh7Ip2T4/KSF6CCWiqyOafMuqsNXYa6BXqrSfR8tmfapnWKHlcE2DjKPwVl+LjO3Ncs/GsDxTSn5No7szKudobuZpNHyz8rsMMO/la60Z03FMrric06Z/0CzcLPNLBZoRSKZJRA/fvGBLdbA4vNtWMcrS6r9R/iCcTm1TC6xSEM0OR4P6kLrQnwifbPfS+xSPO0pQMTUxCwFGJR0Lzgved6ytrYtDpBSwfEXNOkAjaHoqBsgEcdIcY37tvy+Uudqmd6oGXN9EeqiDhXhuJ/jHWsA3mNbJSrGKACU6wBpAZDwv8AAAD//6RdS4sdRRT+qrr7ZvrORJOJQYWAi4iLgLiLe9c+tuLK/+Y/yMaNuHEjIii4kYCYEAcTMUHNvf3uaqnzqD7VmYBgQ8hkyMztrq7HeXyP0hOsZcksigDuzhI/dBryBWfgvF6SvCD2L3ERxWDUVupGY521CLcZkowrXItoBskvcd2A+EMkcSxy/gVPwiKJkqlrgQ3WIG4CqVJdKkw60DOzMMZ68ClcTblyQZJptYHTRVQKRCP+/8k4IOhLtnz6USxhFilisBiiVi09dzjNBCRbRLsRe4aVQZMA4Zyx3cycvKCDSQzlTUEaAOZ3uZT8r1eeuGqiqBO6rmuZF6vwk62i67tSbr8eMPF7+3qfVPvX+TNnX6uFzrFpiDeYCjKE9ZGKtvdk7+jFk7pMth38e6rKZ3NMr0UghVnVfHMIVMnDNCSECyznFsggcQq3yiv9a8UP5vC046qXcginZFXEHOTSl2kOOkFU+HTgKy8r56srJC3dUxrn1YpTq6iWS7sdp1ktEAMHKQny5nzGa4QKHEpOTcW5JLwY0nPpuNAeUp4g+DnBzmaBHF/G/8/nlAfTmQu0hx5lW6K/+Atff3EPw28HnDuHa24H1wTsZ+DZ/Sf47t5XuPv5R6jO4yERFeAnFDkofVUJVk0Mqcb6JKayciTHeUyQT4V1x4DU3icJYplDV6Fg2jlYebFztl62f28DGzsebtP10QBHO2qEZOp7STSlGyJUj146FRTguWC4n//hWhRuz1QFRwFMga7t8eDxQ/Rth+Ww4LQ6pWSJ7LyiQn0MhqoddmWBs4hQiAF3dYXEVa+dXKUE7rx+Fa+govIB8OI8gOADFuFKx65/gwHH5UjJfjP2OA5HDP2RAqoIOe6GFs+PB5qTEeo6uRFPmz9wCAeMV2YWiYzrS56JBCz92u93myKrBle6J26LeDCBN9FwxFYMBuVCe32xFiDte9R/O4MOo1RT1jrtBZ7nKVnCxXk5csdGVfSpQB+DFdkTh67PCpk26OMbnuHjuQeXQcj/72X3f5vUq+7EYjR59BozOPjl90L7i8jDUTo6g1wnyjbAHRb8/csFHv/wK37/8T6eXxyxDxBhTLCAIIK4UvCfPmoZSdGJoOYeuP7mDXz42af44ONP8Mbtt3GyO0uYk0WCWT7jKlQLi9ldvXET77z7Hl67+Tr+eXTx0k5jhD9XUWBqBp4+fIK3Dh1BnbvgiOro4gNFZ4BoFXuyR9+3af4oMsAWiIPxlebzrSANDg0gufC5Jozd1GX7h3J4FataWFcmQ9vbnn1+A3XWOar7KVEAYvFhyONFteBjWhWjKisJkhcpLsOslxXC65PInT27NHB36neOOf28doPV0QYCBbZzy1IaY/NhbDvhcUv8JWNNat5lkcVUIVnuus3+v561yknWRL0Qp4T4ftRizMnapSbDONNYaBxHFp/x67JkbaYhUvwmQcYuAsGWhhDRSme+1ypHDaql30m9Q9u01O2EnB2QmCp+bxi6NCbJkjiLpfKYW8f5ZTSBOB/j+NN8jOK9waPsgD9/foTvv/wG+wHYTUAVCyDiFtP3M+oeePDtT7h15zZuvX8Hy/UaTWiRcDABQp0sEmV2Ec0yp6iVWTWPFCnj6R5CcYk9tFOhU9FnoASJac6nZ6d8/o9jokwq1SQWpCczZylJlIbCKAr5WqQfwpAV2TQRjns5jHvXLNx61S5DakCtkH8tGHDXmC1sYRA/K8oTqWnBRSA+IyhBrFTDbU4xkOqzLeqSFOPJsNo1DrKetZlFcYYmyyIeb0VnFRnB9Dq2ec6K4IZeawW7GYH04nwKgoorRM+D8sxmSs5d+sxKD6BiwDCLXoEgDAzCPH12og2rdg2/WxIlNC5PSltghK0UrKmBYNG/tukX38kaKyiFieMz2cMl3tE973hssN/XKfbn5oJot0mMr2vXxgtMR2EkAX3+tK5bPvNjXl6TFT47nrBFcTqfAfwLAAD//4Rdy24cVRA993ZPz9hmBCGyDJKDF2QDEgsWiA0rPoAsWCPxb/wAf0AkhJAipGwshEIWJFJCTMAmsp0ZT79QPbu6xw4tZRFP4um+fR9Vp845VRaqmbHKMSV8nMTnxFWH6WVUjU77ZS64xYokMaxVpcWnRkBRG269JVvd/KDJl7jONpIQZdHSxZfUqqv4dQGCtFczdG3QVUSNvH1GwQct1vV6pQwDeTnVYu69X20iW9Bupm9iLFi7RqMobMF0Xn2NVI8d1llqT8kkiZBRxvp+MJJL3qN0O9GcXtKzd9Dcj/wYglGZgxxBi9j1lmzJ/TaB9jL0gVXUjzR9DqR0uLy81ApE4WNqoIj+dg/gucrT1k4nBAYDPXiQl/35eQPU5MXoPNOkMGtLIdM3oYkHrlG/ylFQNMwf+3fDgi+QRt9Bc519H5TOxy6j2uPTkLXRnLPNgvnyiXXptnlwBaycuXZzmvBhovnhMQzzxs0JjVJL6GwtwFZV2XwOrWTIbLOAz6l21Gs335hUxvGxMTTww3wBkjJ0Mrv6huSTqgu60Mq+4KAuJu1SBSz99/q71oARETDqk9Ry07Dua/We4O/MFchWgbwj9usKP91/iJfHL3AbCXupRFdfgXo5LOjv6x5PfjnG0ad3sf/5R+h352iKxIdZlBDaM8EpeEk7Nsi4TzXpTq+3g2YSCHeBYsf9cDthKlkSRkExgVcdm5/Otg4hB//C2IzfkSC/nfqbeOs+Xd88d0OrtwiwwfeHTs0C/1/zNr06IyT1gnhThWKxM0dbd3j07Hd0dce6Swr86VnbTcO+FTOlgBfU+ow6u1Q7KFHh7WqJg/ktfPHxZ/hgWbK7er4GCIJ39s8g3gAl/49Pn+KHhz/j5PIfnK7PkWd06F2ILjBLezU2aSOWB1X6qhnyXKQH9Pmm3WBOyLd6LxC9dBiT7Xswg6fVeuUo+rRi7UwiS3KLMeAYKYaN9koefceEzkumpOuVBJLWVSVq82udD1wBbGuldmcPGqxySMC3nd98z0rh5PEho6BUjjpijO/JDNiM5j/6VOsP188l1kFS4rGY637dapGg8apZLlIAwa8/2/3qM0xnQ3F8t96wLnj1/BRnvz7Hywd/4O9Hf+Lq1Upa/LXmraFX3PepIKDeEW1fI81KvHd0gHvffoMv732Fww/vopov9dnpvO1YHiBCB+t5Lk7KyHMcvH+IO3eOcPzk2Ug24nOD/hBYQeAYgL+enuD85Ay3D9/BFXdBLZiRREl/Vor41uPTWSxOgKOfFwGwpEqX7TejQLOtbxzWQhOXvm3fOP5TkKgL2vci0Jlp/tftZuv/W+LbEfuklcR4qM5vexX5OZ2l6EPa3z7ok6EAbLMRqSoVCgawJIukQxOy+AxjL5xBtlIo+wIqE2FPnU0tgFvXecJkha8p8ye+d5fd6I/MkJh+597eLo/FTrXr7DdiUxXqm2L90wOhRgsydG+NA5MM/qnHACZ7PYwZRPsIJV9Zz2lNYi8uLtyDaTirZ55Ejlp0q9kiQnJjSXDfjgsI9v7MpNIACOoYsZy/hfWLf/Hb/Qd49fgc72Zi5LQo2V2DlnbJa2RZAs0Z8ON33+Pr/VtYfHKItLD4YbKew5S0BNGARz7Di2FOUhIe4ziPR28A3Wmu0r5pCZQAAGNX+yF57L2QQV/ZmImfAinX5iwqb4Z2ZsLk7EsqZbACiGn/KV950yXyUvOymDkIwK726j3gifpkPQ2gtjxHqYAQV7I3tYNV8R6nUlu7mPmhjGjZi0puIf369SV/1jahRSnp3FM5YlbHRJ3BEQIUdFoya0U18pnllmJuRzlnjLXNLynOyQg2TC8bh7jXcR6guWvTCIjCY6vfbYm4M4SDUTj7Mhngb6a5Op4CqAy+RhQ30d4gbEEppEsxXlp407NJXkL3RKDkAKL7+xyd/9qikPcONSfUfEa8YBofm5QS/gMAAP//dF07jxxFEP56Hrs7dz6BfBIBAiQ7sIQDJBJSQjJHDklI+B38JgIiAiIQoOMhWbYs2UgEIFk6i3sI3+7OTDfqqvq6axZ7oktud2anu7oe36P95MtPv9LOVZ1IahHC4Fxhv7AJH2H0+Ua7hsn0hGEzlAfmNIUJaOGPaDbpCkmFKXCiGg6SolQgY5ZklcJKN/B+t1XAaKyQNsJz+R2EHFYObKwK6S5pJiRvMp910hLIr+KEvAQ8ebFLzln+DnbNaAvi/6dazFiXHpX3Uvn/TuWzUa0DNmgmc04gtSGUqXIoStCzHa6zm17AuvEM5AR5en9hWsLxYGDTpGkq5I0Lh/dDawyvPEsdB2kIOVhSLXgswIn1HdSv0/ljKnQ0FicKgSFRqM3ebVOEGavqLV0OGFAIiQxOCd5rMcA4XJJQT+NCIX924pCvvUKd9M9mh9OYcBMnv43j+5UiMcaSUMhGXeyFysElD7szyDCLOw0wr0c8eLhnKHSAqFMXesGHZSAfLVnfbnfmDNCWgLE3CBiYzDCpcpxIuDXhDzdBvORu46QHmAbFA8/xVA9AOn5zXUliEHqEqcPRtsf5L89x9vV3WF1FvJV6meJtwkr5yAYM3Y7A+dU57n10H6vbJ+iGzD8c1VqKwku0hsJcmo7RvLjpg8x93pqdoReMqfCsplBzBB2Qqoo/LR2l6TnPBvsO1kVe6iXAGmFU+fdNEkV8YAEfI42nrA3rLgdacFFDhTQmQ2gILH23L591OO32e4Iws2gwdDkTxNYOwmntRJNFlf2aTYvVyRrr4x5Hbx+jHTp0Q5cV2jDlUe1xi3EN3PQTbtoJV/9e4+XFP7jz/l2cDqdYm0/Am64p5Rja4Qqv8POz33D27HdcNzcYNwm7Zot+iGg3Ce1xi/5khe5WLzZS/UkvCbBAXDsVXBMRzMZsU6Fj4FSee9k9T8a3T45rf3hxHcu0oev/1/QLBjFNZtMTXVM2ucYRbLqYBeno10whPxRR0b2ctRIf7BydhP+o6slCAym+xevFNEkTIC2KxBKMonKoxUyTzK3BWUoyqKQDoG/x/jYOu08g6YCSbYN7QQvRpqk263k+p1RRQPTTpyOQ7QwVWRW+f4th6tBdjnj59C/8+f0jvDh7jsvHfyNdTFJI7ccsOuZ0cWJFKtZPjUIbydVHhhs/+OJzfPbwId679yGa9YAQm9LiMO1hZJPfHEV2AbieIqYQsemy+8gWj3/8CX88eWo2lKb+bcDFBfooNwLDiNM77+D0g3cRj3JzqhXbJikyirtKNDcLIvPmBW+cWkN8b7NDL4lontl50VM7oiKegmmUEJLKQtlzmNOBz/5hY8M3APxZ4if3noI2lQZDLTapDRMWBf8yv4iEKrt9pWgIPeOrg4VXGk9l8s4JnFBQDN7OxlkyOLGgU9vGqJ4oE1w6YrULulwsdq0eAZmKoBqFj20KWRA6pOlpYbbbbYtDjkyKZ82Ne6JOc6y1v/Vd94UjzkmkDtQo7ogCVV6ZS9AsA73JkAy7cp8r46OwGNEBmuXlTVjEOeU9pxIHtDlpWjm2R72Wle5f1fwYNkdatI4t+suEJ9/+ikff/IBbr4BNbojN3JM8/kOJJ/MWuNlf4O7H9yWmSx0CFuzJCs8at0fx3dc8VAcvU0EtyLASTdHMkbVxgLilyHFuqvRGT+QUNiPGGEdTYpbhC0m11mR+3HiEcjIrnljh/1yTVGiXaawT78vrjggdIjeJklqguJxQZzBKL79XawH1f9fzZyqDKe4ZKcKhiORodpy+puH7l72KOvAr2jfMLTw1yDVX2CQTccwp1rWyiBeEer9ZrDz/BhmlkoVLC8LMiYqDZxFdPWwwShvIWvMdurilWoOyQWg1InUIWPzLXhSrRnPSMaoJ14jYz9O63XJ45vE5vmgeTBeS5W+dPzjrESh9L5bmib6HKgTL84jDBbl73q/VKvq8XqfBdFJGpXsUSi/vM+e+IeA/AAAA//9sXU2LXEUUvVXvo3umm4kSkYSIi6wU3bkSBP+DK90KLv0P/iX9B4K4ERRFJaCIkWgWk0BiJjrdr98rOfecW/UUs8pkMsx71VW37sf56N768O1P8BLjyuMfX4M7eL49Y7fAIV4MPiGEwgkjfXujO+IL1jdhEL/oEyGAeJmxj0Q6KagtdUoYvsbFmjidaRIYPo0WxaYFB5nTHvJA+sqhQlAvIQiRigrhRQd6smHsm8Bdda0W71r2C514XJuBFnzwXJ9d1AvvQnGx+TTVc96sB3vb7/e1iOhzs7BaJArlHq6paS7EhxmCMut0CxAprPfQkUuPrqpbqmQKd5gLz7AQOyADSuQWds6XSx7g5yKrxl72GUgKchNwWxenOTf4ehServUgigNEItOKi5RSK/7jzzqYVLFHR478j3WWTy2u/bMlH24JuS/uR/mAYsNSHbOXHRCnQ+FjW5tOpVQfWrzLaTXh8E3fUcUcn800x4HOCp6jmQXkhrvBwpc9rxsJsVOyElt5VSfuDVy6VDtFglbqBeX6C/JazbIIqkW7ghvXeGISiEny0ElNuyndgrvq5+REaA/WDqiTaTo0H1qHlI41iQA0CxSL7r9ijeAfHXmJBs8pd13dvxYCjxL13EjQqDaouHFYlJjybkEfF6FgYlI1ryDUlqPxFXvCT577+o8DhA4HK8dse9tZeXhl3336uV39dGk3itk405MWye8sDrp3Qftkl4+eu7DTy6/e8c+mM1qGJTS0xq0SKE6Ei3zYRzxjZtMsK3YcpkmqsfTbl72yxaZvp3RpBfPSdCQ8DgKG6Twc/myWnz8LoVL34qJs2BsFgsm6PSku45kXG2LGclp09jtOcCEyBZvV7YaNMlx8xokxnhk/P3aMs4gbvc4OfWqj4ZravxWiMii8xTOf5ARRLzrU0j061wfXP3CbqV4T6ULeJuJMAi0H6AQk/Uhydlu0XFyJ/3iY7ObNW3b7xh3b2Uil5xDpinMl1f9OSc4je2Y//HHPnkxPbXMxOrF7v9vaZsvYjweb5b/v8Wgu1Zt8Fg8XnsycQIh3n6ye7/9D60RciUu9NlL71gzO4f+r5MMbsiG2pv2+VuXtu3B6IZpjkH1XTPfSQl5hveOSxNSimQ5RUwlyBT8Tq8XYaUK5XROembKUxrvqG+6r6qr3Mz2XEaPxPRS+kyQEFjxjdgjnOuIliYim3NYqGgAhtppEeysmvnhHlMwSSXsODYHUOOo4T2jEZcLiAVtEbENDZDkW2+etnU/J5gdP7fHX9+33L360y69+tun+37a/xlTfJFBWpQlaEum6L/R4XnSOp87sjXfetA8+/sjefe99u3X3dUt5lCaFFP11t3XU7LcrS/bb8S97eLiyZdsb2L9AHFz+8sDuffO9TZh2rTz5sybKScURkAT4veNLe3vltbt2OFvsmLFvKkRNehiEmGZNAnNHH3gvTmbSKGL98GMnoeNmFfWR7NX9GlauQq35PZ5zRUYgPnAPwWVHf/dCrrgHtccvUe+O0mEaVk5Oh3mi041D/WdqCik++j27tmENq66gx5SYeDUv77BTYwMse4HlU76BcHePoUmx09YDhabjdFLRjQLnfHfmRVA0axG7lmobxmZX2GOG7lRA3Hm3RUOHfN7wgKfAJ91/HB8y8jNYSvNix1oMgqYXoXC61Hzyq72YijKsI5tnU2320M6XTidORR3Idy6ip+BrfL/XXRaWZDiXJ1HYtttBOaa0CkInKa3cS5THuojjqU0IF2+cq9h2WtyJ95I0kZDTI+72eO6l2Nlm5ygciMVelL09v/fYvv3sS7v+9YntT2bbmeeiCF2GNaGwq3j8y2zPnv9pL95+wS5uXqDq8UkpVdGB+puoyZFb3pTQ+Naa4ntxz7mnfx8Nkbk2w1NO9faO5oI7QskPP3Wc7PJd1W6ofVHegSFu67S3aGx1TWTTorAMmD7Q1btz3jXKf5jgtsaW07Fhd1z3NZvX7jQQPCYVQ8X4Gf/LJrMOgNp9Np0i31HZm0iLnfS8oWERNMhUUZuibIlO6PeTEHBuo6thXKCiggLbbA65ht2GiHDn+hfWIk5JKHymVJs3rZHpnPjrQxPiDoqOtMxCTwl5Ty+aaudoqq03QCe5dJjnz1vqrnUDnYxU/yO/cNothV7shHdWLrZukKNB58+CHCaGwKpJ+e5hD8h6GC8FpxhqdeH/sxbG8CXiVQxuolES9z+GcKACUKMhUAwaamofcm7GGh3NLqx5xLMYbMde8Kbghk5ndKsI2jmbY/3Q2z8AAAD//2SdS28cRRSFT1VPz4wdkkiAiBDIEgsIC3aseCyR4F+wYMWKv8CPYsUaFgixwxGxWfHIIBQ5UXBsTz+qUNW959bt8WwSzST2dHd19X2c+53uw68++dZ7kC6SsyCUSAa3fD87KVTWAKAEvJxTymgBQliAO5SIrgAWGbmaTI6SHQClzdJ4mU42GEabp2Avu1WH4SpFfd/8WYPOjQ21Y0YgTgNOyOe9HS/lNzzW5r+5/D/sODP5KjJZdutzEhIt57grOFDBODn7ynnriubFEbsOq5uprNCR7bbOv/rzQSq8v5b0lqySqEEXolXhfFLetkWxmlICpp4HoVJGu4YsfviXwVE0oJWKVrDqFVjNTPLzfRBQIZLGHChE1CNcXd8YoI5U36RKELgOlgXtrpMnkJrWsV0QX91clb8usu6W/q8+MeC5ouwnm2+zPFyigrUImeOoDKv0UC6GdWHNP5aQptkgLWI1J8UxUw1Yl12vrXb2LZCYG8SE3QLOjebcFAisGPYKR6FsKac2PpNzct0UJZiSUOw6pSk3aVy5ltzc0izBfFEYvHx5KcmrQj3ZdQigtF6lnkqaL8TvboyIFyOeP/4bp9//iKOrhO1ERVjQLU1Xs1rRlfmr3b9P8Ppbb+DtkxPpnnXATZkNnScHk+OukZkH1s/IIgmqgpldB+DwxQp8CE1eP+m8a93WPBdiAAAgAElEQVRyVeYcFTrlKdzsLjMo4cgUic3QvRCOlRAcIJF/nzSwMeI758F0vZZZ/KSzupnE7gMFwmHSyz0AqmqZRxlNGUYpbNVjq3vDVFkq5GjUNW5JYhSLoyC0fi3tYlWsdPYDjrf38PDBe7iLNXrXZVwQ+DUhGkPGbnqK33bneLZ/LlS3AkdbQfgoEU2a6cZ9uKfV58iUbF6UdkC2pg+69uKl24A7McZb+4y972YB3Ulcns+cFaw5L7o4QuNuFXlagbZr3K5FVsBfr59TsWKFuINRkkjrqKzdPJUY1nG60jWArIW0H9DtE+JY7quu3ndSFFE4IAnq6oO/9HaWTHeu3uW9rWe45zmDWa5vcDQvN/uumvzroa5Xsp+lYUKfOtwPryBcDHjxeIcnP5/hjx9OcXn2D3AB3C3z9W21InNSxdaOFAVEnls6/0BaAx9/8Sm+/OZrfPTZ57j/4B3M1emfhfpgCTwLCdeI2AE4H/7DX1cvEO5s8BqOcLya8eejM/z+6yNcXjyzAgAOkv+6v5XvUCam7m3w5rsnWL16B/E4mv1fi5Fah6p20bQoGwzyKYUjo+H3zRHA+9nbiFAvCXmak7nQyFpscdOimGvd0JV17cVKLpltqBXyoyT6pZmT85JBZDGRu5+z24dicCoQFtt0XpmAPyqUmkOAPnv53HbqRr68ZWpwShPGpQQEtlrubTUDgcn8bv16bcqL8uc4jEbfJlxVzj29Jptl9Dy1mfvoCuewZ3FSJQZ5U1TAEVS41EfZLeauXUkuxC62+cgTGl0YXtER6Bf6eXYSg4trIpseQR2N2u/nXR9IPleIXU2g6rUChusRm7jBNncITwecfvcTdr+co7sccRykoEuqjG4p8txXv44uJ9yMCROu8fCD9xGO1pjUZqMkXrlcV3Wcqd/RjRp7uGprYBkSuqndtPi7aEZpQYrKCWg8Z7P2o3DAkrlcdRbnUHHb5saDO18KWi1coJu93C/9epFP1eLpqjMYLUGxMpM/u+PpFuuU+VUD+94ep+LzhpyHjSbx3C+iusHwPmF+QZ99//PIS2LsqMGLHUvrvENzNYHNlvulkvpVncx8ZFa7RsbA7NBPqvyhYmBUy9uko8WEtK+0OdvUe82JwWB3ep38ugCbxyXWcsr3GvOpgojvF3VyKcjJemnqYYk3miq0FjHcNfXN3cqDc8BGbbPbPiG5nRZFVYFfxrokj5KGXHMTku9pAFZyuXS8arMR5h3/nexRnlMg56IUS+Zpxv+kXcmOHEUQfZlVPWV3Iw0SCGNjJP8BFw6IIxdf+AL/Jmd/gTl5AU4j2Rws2Xgbe3qrrEwrtsyomhk4UJdZa6a7cot4Ee+93lrS7WCxidJVddOmnGhqtNY6Zgd+RV/1QTRvzTwLyIpyLwWpGNukdnyZaFZamkT5SzgOLbmnyUQ8vY36/u9T4sVlQmshNu4P85LSpEJ/giaTSN3hYMJtlwM8EeFoIEGsAhGOwz5bcNICSc+Q/BspgV0p37Gz1p6FT3Bxgg9VhCUvhOe0RZheBwm6cKVFfX2XF/0t5rU7lB7KTzaP27lA3fwQtE2higXNQJ/5Pwsa/Laf+yBjQhklyOs7E/0pvBnQ8zeRRBoT0wCgn3sRSfr88pg0gTr9Tp1Xs81KUXxdVnw4teobZrQOGjOqjtOi86JINj7Bt3a5oMFa+L2tXVbksVNl1wwBx2xeXJVs+b/NLY/Gj+TqQ65JabPrSlVXAilVXlAVbNLxzdoqaIEU3UNrZRyb0JMlHlC+Zu8SnahIb63YMHKYm76H0naiKg37xD6rRy1VNcYUeC0ADvDyY+qxJzS+L7UKnhwK/nr0GJ/ejVilxj7ONYXP9S6652YGducJv//2EHfu3sbm3tcINztBn2OpCUPVGgmCuiPL3mOHE6HIabyeQ3vVxc9C5zmPY8yzfdHrSdjvDeYTrJw5HNRrm9ZFObDAlwWR7MWrh6w9Rw7KWWBL1ktFlXVszDLUO0b4OT0XDm1Ab5sD8jvSTaX+9UkqcRIUNRcMu2a2ioqYH8hWtJc1OA09Xr95hR22KNhcSwEQQJ1U/3f48PE9LnZbqYRTIpUDo/9k50NnAj0HCjxNAMzeo9FlruNkQgN+S0j8+/dAdz0jqZKhbXWcbGnH2KjgqO1PLP5lWiBunfNaii2AztoqXFTx3PRzlmKNRfcVswk1Pq9/vZWCogGDCfsCTfuU/1/UqllOWB0z8vYCaQooww1gswaGjjuZREIvKmCmhQB+K7HqA9D8ZCss5WaLqK7nJrd92j7SmMSs7bPcdVWYgkBrchVFd74f1ogXAF5/wlv29v8Tr/54jv58wrCHukmEth9I/70Uykqrwnu5glt3vsSP93/Brw8e4Ieffsb6i69QSg+NFi7NC+KfE3j1HhkvUPBs+oC3u3cIhwH3hjVOVwO+vfs9vvnuNl6enYlX9SVddK1862vL2wOOH7e4kU5x3E/uvMkKKDugl2hYaStxUhE3GBMotsvE/4rzqO9n6v7sv6dzsVnF2dUp5cvmWOL1k6soF3VkdKrT06sdsyXZ2bRg+hYXXQWU+qvtPZlREQPirPuKg/dJ2mF5DSSNK1I7O/5LK8m8xk2pHi4otzVY4wBdV3Xf1NbZSknIpVqNSfxy1G4IqdZHt13SY7dnUC1dNRawyhtcqzQLiBKocNTnqPaOQbuJurq3RgUkjNPbsZgnU39I6XwlFd31eq2AQq7i3AYeWow0H4uFuodpbXTt65aYNYvloroGXAQKE4pZkFLSRoBuP2Czj3jx7CmeP3qC9M8WG7X+nrIKFeqr4YprETtXEu+ks+C0jzg/e4nj32/Qn64RonTuTE4gLJTWgYkFQO8B3ay0OXYnUn2M5XyRjrmiDl0nFSTPQSqrUxIR4KWgtc2xaUEPrMK/VoUf5T7rBLNxDapvtbxMC8SEh//PJXpkY83v7Hw0O8illosV54Qe0qypOxXx65xrGtOTj/+uK9RpbmPvJcapctC9Aw2kkbQKaG4vtryO6VmQhgAXqK2ImsRhKDCdYl+F5c0ti90CdLzhtLy4e3ax/9m+YDkWiwvq2ufi5YnS8arbF0WeGgfxR8kpjJ5bixHc2dLACLrP9uemARd4PyHnPNEHENCTcwW6j4tHQueS9yDAh+XnPEfUypdpf1QIrBaKqj9C69MX61wBYkwjPgMAAP//bF1Li1xFFP6q7u3bkx7FTSCiY5QgCLqPK3euRf9Adv4Pf5RrQdCNCApJiAYMAzHOImFmNJlHd/pWSZ1zvlOnm8xmoAem76Pq1Hl8j+Hut198x25yDhxdFg3DIjv8gslqK5aqTeOpqUF4RqJYCB9sGnem3N5EcDhwT0iTJS3sqEYGWkxc7dW5PgEn1b656SO/NfGhwNMlDKIV0VTwjps6Hi5RLIXXoJzv2a3w9g88Ft4KWVoIF9LtSFy0sBqyoDcn+N05dxRA/DsbALT0co6ndfAEZh98vmmh1i5dirAAK6+B16paCD0gLS0A7m7MPn1PNi7tMPK+kQiRV39ZhGfemzF8R2xIbOfZYdNU1N4aZE/tKkZfS5NZCorVkNuoVO9Yw8SbeC0aTJZ+rZVF7qi++QIdErXdqavv58HX05uaQrzXGpIHhGJBFLtbB6/BcHmYG7Sf74jXSluOir5BUbtVpiIfZudkysFRu9ownwetVCYrSpQ79lqncuLksPKJCpyXXHo3dDCJrGAft39PRLsMqesEDAbhjXzRttaSaYVIYmltfqIvtiEhS0S/JhjUMAnkvUF/x5IwrYHTR0/x8IdfUM+ucWiQ3B0el78Vo40Yuu7VxRUur69wdOej1iJFXo5I0mXvVCNC+orvM4WTUXPCJzY590LSJroI30tfWoSmDjvpMZbE9cMCnHube4QWmRLUp6UcMERB0SKGSQet36RrPCqEkXaBORSVvn+MS66IgezrYz+GsXFWTQeg7c9WaLPoFfHUSTz1BO6WHK7a7ZGyeZoLYmtUmGqD5w+pyPvNZcD7N9/FB8tbIuSIvem/XQkaYekCG/x19hRPnh+LweAwJWkAyXQTGjP5bNj8oC9vDiKP8xtEsxTttHWOqE7tZo9VKvralYEp1uN2j/PWGwe85xSmlQLnjaJhe2irEvzNYbOByOn0q7RYszAl4qitEidefpZZwicuOWECIpxSOx+mtqz+vcT65AwXJy+wPn8F0Uuc1ZUkJVIyKLLI81HtQQWKahxMgYFnTcjnue+nFKb9IjS6Y+kFie8CyKwZY+P51wUONgnDyy3O/jjB8c+PcPzTA7x4+A/G/woWjeevAGpzB9DYQShtnHEmUf1vCRzw3p0jfPnN1/jq3j18evdzrA5vYdMgwjXvTOpJDREqQwauG/QfM37DFX49f4a/z0/x1sEKt2+8jcO5YnN+jsf3H+D4z8ci9kcNgNBf9AsqA7BOr3H0yYc4vH0TWI06tZX4P9t5NLh2UDL4rednpH4Q0WcTu7bGGhqQCT6RKYqwqJ6QsjE8OpcboWFfXGA0WcOQGjgNMbmY+kBhNu0UnoPKQx8E+Sg2kGEiF5t7O5OugIxLNvnW4VLxBmgOvv/Fzm+Pnfu7OJzDSEqJ2VhMYj5YZjooBJs117XRXz2OKSyc6CfmU8wrCfem3zyRg6QUMQfJobD2QsoK8xKQPKIJYEhIzRV0r7Q8p8bpK/NSezYrgZUnzx2KTW7hlm7JcuTZ7NZ2dRMil5prrvOId9GozI84XBEL2AFK82pN0TThxnCA6arg8slz/P79jzi9/wzv1AGTxROeZZUoHY96kIKp3W2aC65eFoyrgqPPPsZmLPI9MCh0cj0fRYgxRyluV138iN5uNf8Wz/c4Gc19msv755ogDVnspavmp2wydPs8PQcGy+tGi8sxBguiebHcs2arWJvIOuycZRE3CopzdA93xl0WsLv6A/ZTkjfc93VlfM8FdI5rT/hnwVLSzi/Gb+oJcGpP/QyuCqcQ2nqPOYDXTZYfSmypvQaMz1/zRNuPbuU5GCrXEIsIscf4+WqTSW0EHd5s1opS7ML22d8NtUA8/5NEyCir3vzv6Aet33Rgyb3pTRDJK7byeddx6/uI60ybrva/7R47YqP79xP1y2fSEFiKktCGv947rSoDytlQfa4RF5x1Ysxi45O5e3uOy+UB/gcAAP//bF3LbhxVED19e8YTjw1CyFEMIgsCO0Bs8hOs+ALEJn8JYsVrE4GIopDIEUghMqDEwY5NbE93X1SPU7faZGHJkuWZftx7q+rUOadUAiAXwo5sprGwwx8UBN+8hkS4a/iwiS8hbaN1lOcSAKIoWU/JBWo320aQUWvckm0rmpmQ0TF96XRtLTCSJgXeCek9EHJebaPKV0eUXm/wVK4alqnD5fYs0PCwnJmhJAociHJWavJy1zfLD+Y0Ti4c0kgCjGHnPsAJBJV9cuTs6iHXdW1eZheIXImNx4UYBiWOULWCuJmNcBRHTjwpAeFinhkeSlLYteS+1jlln0UOC5TiuiFSknQ9uNaVRil0mKcJYqk10TfnJm3asfBxKuyQcCOZnIJyj9bl47ULKBB02tK6tZxl3dZAQ/TluenozM3gINMilm8AFOn+uTE5QlIDOIEPPncvCIqv7ezynr028r4Kg0U/yEd3oGchogcJ2QTVCjoagtksawdb/B32XtRp8Btr3K9ObUDrrtKcRX4E1VT65NK6slY4Xs6MFa2YdjaCsntWWqxMl6O6dfcnl/j92/t4/MOveEMK0Ybv+Qgh+51yut5nfssjkpru+PgEe/v72LtxHVMvM7wHT/blkGi+Dfb/Ti31LgzPOaSkMxdXxc8gAqC6zjtE50rpfpV6Q3fyr6RvOUDqTssZFOP+kX3BfRM09QS2cT1WNx0cM004xvpMasIjaDLpZMpuoBnQ2OYdw2fU02AquvieaBLMy+izJROr+JzMHiMLSXR6L0/PNDZs6/WOquOUPXdz7x18uL6Ja+7iG+ZirYTQJPMMF7h/+AhPT/5EXU46WUCLpFJNj17bHF4GNx0RpvKIxnZ43TnPfS7vSN4ZgzDfSY4XCn4LWp/GA8p7b666xU19hujmBeDs84lZMMc0gCkbdpqGtbo2X5LHvlgXsrgPT+5W8p4YE61gt8RSDZ7cnIjgH+/BdP8FZZiwfTHh/PAIJ4+e4OjxU+D0AuPpK/OimyrWy5UyPrre9KBDqpC1o92Z5tm06T49Bc566xdOhYbH3oV5EejaswkA/UI8IFZYTAtsXRSsXxWMf7zE8S9P8PDru/jtuwPUZ+e4NnRYyNxwYcS4g7JiEKUVlgJjilmlNSeMh7BeAh/d/hSf37mDz774Erc+uS2GFMZR6GyMKQv+OFsMh8RxHfF3V3APp/h+fIF7x8/x14t/sLu1jfd338T1ssK/R89xeHCAB3d/xmKif8388yI2CWGrjrhx612s33sb50vz8Bm84LfRvht9WAR7J49b7GCxIiOglU3+ZmwV//752N3G4pRiPbq4mTETsbzFcTWXc5BT4+jSZ45Pje9g5sTNIAsEABgHfX/RNbskMFXWjzivD34uaZeM05UcyOc95tiRadhgR9HNnIfNEPcq63G55QBg+gzV2092VlC+ijjia7jgM/YxbxCwpePosgUnXU3OIipxvsK75rkIy+AfXBYhTNSN59HyHAePz6wqcj4XTCyPyWSFaHy9bGAjn1crtKDgDItXsgZ5NXMQseUWVzWenB6hn9UhfA+KePdgifW4BJ6d48FXP+LhNz9hfSaePd7AmyYQeihX9kh1zXuZpmDzbcol9j/+AOWtHZxLF9tHIwvbp3qBSnacgaJSD5i8uHeviOLNDfWTSIw+gmSIRo5fizPnFHipTXaX87cxgebcO8yva8r12OxDkpkZcO71SSGgNDqz5//FO6cVTMkgnZJBW19Nks33S8AhU8671Hzl3jS9OJrUJPw04EBeqzN03Ghp9Vg0Epwh0qccmTlvieuvsWYtv+8D9OoSysT9Zw1Rd7Xn/nKPDPoVmMm2Xc/Ozq7mltX9p5hvyZ4vHdngVwAff+6S/0Zd6mcl3zdlgGQekN1D1pUBOvy7s4b0e7wWjhHQzgJyI0PmgcZGsAYu5US6Dvw7TablMlz6xDi7kGuOtZsBDHJPlgPJ34XmTzCwgTHku3UAKv4DAAD//3RdyY4bVRS9flVlt+NuB5FGCuzYsOMTQAofwB6+kh9gHQkJCRYghSwQUUBJSDqdtjzV9NAdzn237KakKB2p43K9esMdzlBj8kAdFr+MCSsVzgFK2IPYPGWrEPOBNTeFbAm4DEoZE8SYkN936aFRuZI1Nhl0mXKAu/LCXq1Wk+/YwQcT8PlqmmD15oF5pKO/WEAxiKYKmoCwI5CNiTHGCV32ZJ6cKD5oQlr8M30iWWA4i15kk0Ve4EKgAUw2AKscz5vCrzm1vMtBTTku8tPDJvqEl41kqnTP6I5Wxr4ymkU5DGaz6Uaokzv5uI09IFBVmODkdA1A7r34Y107FugADQA2H5rM1M7Fw7MqFLGhy9WlWDrWwWYw2ivi+d3+xdAloqTrBZZzSCTuAxtAJFKtQSN9nE3gBT+ryvi5a0AsKsTNxw8Nuwcqy92xo3pRoJbYYOE0MG/OIaBaLNMDLhv6ZPBOylggnuM00PONuQkiSgO8lDunEPRBVbmeIcE0zjsnP26/qV0WIDpUGKrziiazjIHMKO9URTHhjcrf+4IFXVJDx82G3jx/QReMxBLdKs06RhP2Sib0HcUU+VMWmajtiTb/7unpDz8KRHf1xWNqc0dDo8kCBxGjCXqe8SJPYeAmjOhFAHOXGAQqOv2/QBXh4BKhPqMdEYLwajonJMjNgxWrdJxx6IhGPu8fqdgLxUtdQoaJhssYxOcYAlZbQq4FrOEceocCgM17xv5WVowb+vu65uVCsOvQtaYRtMB6vZZ7HtsjrVdLOvYjZe7OiLJuLf7Qr97+Q+018yLn954R/BY66qmnjm53H4RSwS9dEoKUPWAAtC+H5Fh/Z7r/3Xfx+rmw7mns4ggf2SB5sVsRxyN2Y6LFGFnhTJJgg3vyv3ntKnSxrDdee77nqNKmzTmzsKJgG5UVLouzEYJ/k/0lB8FQgzDXDuFuXFdCbNQOA9Gup/VQUb8daf/3Db1/fUeLx49o/25Dy8+uKX/6CeXVgtL6AXXs6tAoZ18Kd6QIMn6fJHOh9X0W+9kwjL5vwgGjnKdEibv9LArcVrTYjHTzx0t6+9tf9PzpL3R43dEVi3oNSZL/iLxBL3m0MaktkdgjIZgRPXi4pK+efE3ffvc9ffnNE5pdfsz4Ef+MiO9ydDFz9RlOyuAISf439Gv+QM+2t/Ryv5Uz/9V2S2+2O7pb1lQtF7R6+BHVXLBrRycloMOJz+XvU2ctTM72rRQw+blHK5yxPRMsohzIyFS82t6dF2zVqjSiWSoTDo3zsgpCbSgE4UJxX9Fx03V3n+1f8fYu2jARTIPAX+1O1Ts9QmY7uV9yCLSvl6xIJv5zdXV1tjpRQG1SM4mLCvdWi5u5VQh3Z+J5QEFhbYgg7QhETm/JTHKKIfSZUPiFVggK/IhB3N53VCE1KRbbeoPVIKitGXSdWaHL+HgYVTWz4Fsqui05h2Klwcv7Tl180LmdvBvb5/Gc8PqPV2s+/7VRGHpQgAwVK64RgVKJWBK6LsPJ9tlJcUbjat4H5ssLodE2LAA4qym939OLn5/Rnz/9TuOdJvL/d4VRoUSqiI/CIt99+25L25tbevT5NfXNgnZjS6Ptp0knpzwH9Bl4PHgMGD4uxZ3B/OKr5OdpHGNX3QjUDKFukSJ9F4uaDsfdhMalBRhNbPsTmpaIx/WlA5tz9lgCMZgUY8PPs4BemzYFy3yBmK3T2BLceYbCGedYuK4n1DEgPvy7GHIYl7q5TddbSgXhGefDaNZ0yeYrga4aPq82S3mgtUUcMugC8N+H3UHmljRlqTQcvMmFuc17mMH6Y2wQGyhoOov4YGdWh1WgX0jMbPlKaOLkbBpVTAkVJxYt7NNO41kRGzfPfLV/L7bruL+jJHjvBf3ppNEgMbydiUIX4KK65TU+ZywPQz7H94TmAV9zjpX4Hobojfsz4jagATGfcMUzIuZ8/r7HTP8BAAD//5Rdy24jRRQ9Xe22nUlGgEAskGbBDg0j8QNILFixQIivZceKBYsRghVCJBGKkJhhNB4Sx692dzW6de+put0mICqK8pDdtrse93XuOTNmD8XI9Bbo++ErB/xQSlBmbPNVOVQQT1+0xv/rY0lVKDkgjcRsMMNGJzPGAvkh86IyoxcYvd+UCRo7K1mddEgLZE7aGQwuF7M025AlDocM2elzb7xng2a2zDu+WmkZJwCiBWTUZ/T3Z7rhmQSgbr9WN+tseNgGEEbBQ+ln9xVr5J7QceVrCu9WToZSUeqyjIVKKzZNIdKBOyRghlMgUrVl6rTv3WTCyAxq1fBEcAXkQ4SGWTZct9NDJDkmwdAAKBJlXeedHV0fva0/uJ47zkeZu5jJpShndjwWMowwCaZ84qrLVc2SMW2cBqf20VYZDhd8hZjXs54gf9+GyfqkOoLsvxRMGaO66PiSFfffhgYCWm0keQr1a+ngpAMmYKRnXFX6O6xVhY8jiSTXFDPivMf1jERUvbUdzEdOnUivJcWB2ZkmFXt///viLFmwKUFN0nLmoTlola/qIl7e/I4/r29wNqgjYR0CCGTkdzjCPM9WxBFm+Xk34PbqFX785jt8svwMyydvYz9rE8M5MGYLz3swZ88bZUXuijZ3ZWzY/m+Q68QGq1Wc86OxdI+yxmbU2WdHo1IIdhyklVwH7Ocnj5GTBeTZk9bO0dhdQ20Q8CbDgpn0pFQgcuBa1pgYQrlmYuo9SLV97HT+1xiSfNJZqUqLvrPwQcjaXCyTqn9iJq5a3O1ucYg7IDw2GN1psC7h/227xnqzNoZt2ZutsmsLdwMr9eKk2L2q6tLzNx1+bjA6BwtR6Hq9TgFJ8KRmZt+8gU8O+IARSkt6cumoJTRI1AAoQQhz5aj045L7QSW+WiznC5VPcgRilOKkZBvXHp0/ogDk2vOJTrB8qYwslNBKPpNUPg5HDHuByRzQ3LdYyPdK2mZ6xPUB7Zs9qtUG4f6I2Qfv4pHYfCGtC6owEaz6r/a2Mp6VASEUZ4OyaVVSrFCclhLWqcqEbNpZP8Oya3D47TVufvgVL55f4s31CwwbpH0/lzmJDKJsnlR3Jb2HAFUGqk0ZRryXblbho2dP8fnXX+HTL7/Ah0+fYbE4x9bBI4NLANRGsk1y0DtI3/+AS+zxHCv8dLjDH+02EZ3JDlptNni122N7/hjnFxd45/33sJBeW0FOPDDIASC8Jt1mpxwnkpCva2zaQ1rLej4YWsMShUeDoOcig0NR0i7Lnk/+TMde9ej4k2Jm0aaDqlxAzckbpdPu7ZOS3dHfCPnaGflna3O73SnMOpYENK/H6ld6jR6jJDoVBgj9x6QY4oOeKX/SP42UFBMun75W6TPj5mDgszRpN6K9aqiSAvu0KQGYkwH2mb32vU+ADChwXsKMVeO/1fkUFOMksZIQB80s3xPuXbiqsPqKMQf90Yp0bHEa2ArWqc9OjXHP3ZQcfJfMiLb3klznsR29J88HoP5ZfcK3xMQiVU6ETHQrCdRmiYv5BcKqxf3VS/z87fdYXb7GIykeiS9VFRL7KSNIb/8Ixt0RrSAsP/+6PeL6lyu89fGTVHQUZRk9/3h+nmYXZO5DQpRsR754JnV0kuMqMX6KKpG1cOjV7lOOtcqkqr7YNuRiWykohhE/1XRo+6o+R2wb31Py+UIY2eUMVXf8NXrtQkRYN9bilogF+xEC1+9jPpecZrkwVUVTxom5LSetm6hxB4NtBv2d9ayTRy1/lgk/wkMjxQkpmWnomb6gsQcrcNEmD0Za7AtWmNjsmSGCm/l8tIbhYsGHWnllqLJdSDafRM18DT0PxJ/Wlj6f500AACAASURBVGC2wGuhppAHcvjERFKASshazpUl05IfO+aI0Nezx0kSI6pPrvGHJjK5zvJcWrsGB9E+Yos9B4D3V8bPrwAAf7N1Nb1xFEG0pntm17u2I6RIucGPyBGJHOCKOCH+LRdOIG4QLhxAkQJekLKEGHs9O9PTqD5edffYY0W2pXh2tre7q/q9V6969JXnf7WE3A9S9mC8Se7ENG/0zdQZI2NSuicOQfX1FMKFRGeoZG6cHBTAoXPnfyCeMCtEMAu53HMdJNglN1jvTd7UkqkVtMYzNs+sTOy2YX01IBQWGjItyLYhRQeL2wxyJW9BEGNztHqT8IMrDEsaR2CVOsbKeIdWyatKxDJptQRq/4NvIDjkNklrZdpXAwe4L8yl9nut/UVrwPV9MPEEWRTnVnK0MIfClhXUrPQ0RWDZDNrPnBFMrXcski451AzbNjgZyqfBkFuUJQNLHpdyZK8bLGOdzJwuypyPhlg+XiSOds7J5Ua9lSGEyqsCc24J+LulAqeydaBYimMsDCRN8iPtSy4uxNQLCC6kPWL0B7M3GP0tj58XYyEqHVtDDMTUoBct5ABBb4mOmhQWtYPOeWYX7f/yM87Jx1bWz5w8WPVu5GibMZuxhd4NN53hhwHkpCU+vQGIPLdnqRMt7qTCACyB0t1Mh9/+oHw30wWvj6wSpxCotAWlAgKAadPhUoMgFpzHlOj1dz/S8PyKXn71Stp6JjnE9HLw5S8MZcxFLlnmUG72B5ccYn80DwCAAGCieYycVQ6mxkCdXdUOkROxIQ8eyNr5m5tDccNaOAiqfgECzCzFxZcN1vhiBp4DNgcRqV2VeRIdCBr6dj+G2VSwFpHLSnVQH4QlYJtRD+rS18EaLTXZyEf24LCouogCPaQT/UcnOtEkzQD1WIfXWoT9HynRu9M/UvsvB38z09K4UJJGrCk46YuiwgDiGtjDd0+4Y5Q9Dii61NXu966m8TiUy/pFoFdQM7jpGh+Mewvc6v/BHQ8mbTNp48VrIFLxemDbegZMRMljcSkH/Wyx/jMAgFkVQYgzKHtAaRMZS1MzlgywTSkXs8akcS0weMcs/v1I+fZE8cRse6RuShTeP9ByPtJ4P9Lp/QfaHF9Q5MTnxTXtnl/TGDv37WCAmltRymoORWWlqrHgQC8Y1mWy+uol0pB6erh5oMPvb8Xk793rNzQd7mg3d+JFsA0bMSusL8BVAvcYCMifZGIwgiX2Q0+ffvE5ffnN1/Ty1Wf07ONPaOk3NBp4Wfrt23yultwshn9EB0r0J030ff6Lfjof6dfxXsoBlouBzvOZjuMt/X3/gf6dP6KrS1YAPJNSksnk/+ujCX6XQw4DAKeRAn8muaM7Ozhw3tEZWx+FcNDyFhASopBDpwVbV6gtBWhcK4eahHmxVqmukKlzl6HZj9b5kMTgUGrYFWBIfmBHbBbCxt4LqwJxyCBjywns5xP5IVQ4iC26lrIoDkNuD6BLXSrUBavTRrLeuzu4MP3ShniQ+WiP5gwuJ88c6/bXlxqTenKWfbY++igdFSbekm0HYgmGhDDe7O0wUbyy1vu2KzeXuWXqqlKsmljA+GtnHY3pNYGUzHdAWMswFB8oex0SE7itPBfM5nhcpJML76HWWhEX/iZNqDtW1tINd6sDFZey8PwN3KY2dXQ5DHR7c6Sfv/2BDr+8pavE67ejPOv+HPNaZ9cC8PhRDAHJSoYYbHtzQ9tzR/Mu0sTtF5ezeAVIDiBdS4LnTbo+VP0xDDvrljE3yrq6V73uhwYqxla5jP2SWykuMMOFCsDyH5SFhKokrr7k9ar7ghACWCDETVWfnZpyngL8e4mpKMpahTPHDGLTcTPAg8cV1gut8l98T37+MfVZdeBmYEIIG8thhop5zpWxuviojUXdqB5lBcDCHK2fV6TxUdXTvNQxlgAD1+XUyGvW5sS4uHQIJNg4zk5uuOoMHktd9LzMwRwez01VhrHflD0oKXmseZC20caY6Zo1DzZp09cqqT3Ht/r++v3rhdLcyrcOxKPlzfw+RCnBRrlW+uPG6dU9ZT5aiR9AIVcVSExelaZbG1aZV6Gj/wEAAP//XF1Ni1xFFD1V9V73tDMw6EIhQQK6CSKuZisIwbUbl24kf8SfJYIbwSgIGpxFFooRAiaZmQwzmZh0v48qufeeW69ahmaGZvrj1au6deree85JJ/c//WaUftnih7xAEN3YlMH8+FWwCCZM0jMD5HZwfecclobP6HZigVwmhXhzzWJqYHFxGrbCSMVZsyVS3aHXpgoRy2BKm5zaxER62S8HDhUDpQBboACRVj4m2h/RHzrTZsPGY+FHmhhes1i9RTsbD6T6bzObDvo/yzgowCmgMFunWd9olt82aYK16MlvSXSotBIVVoeBXPb/BSAX/Aipo+wG+Uzk9xV4smCZPC33p+1SML5g0cUSnBPDoOABo/3s9pDfx1Sv1U3bnHNvtk6oHKPldTOvd59343xYX9SBdAxXHR3oR++vM24MWylZ+VVfY4qYhfbg2Cwyb+EtBXtcI72nFCgr1eLRhCLdh9Xeyqt0WSvdbmniY132FrN72Ee2s1t1q2BZjOqFTJ5ZanxL9YAiQN9pD2xtldGdhM+ni700ARysqEXj08ojBSq8L10Ze8q9DRA0UcVIrY1s1aVkXM6OfsVaqaSzgM4pioYp3zPneiCN5C375uuHEdNccvXdfQswSzSuzIKEB8O5LPFBr3EsOMgr7J6+wW/f/ozx6RVWE/ZaamNG08gbCAYMZFg6IWrMEHqIJDumoeDy8lwPxbc+uIMih+Qu4fW0U8969ehXYbLIA8GSRXVLSNTqQaziPf75lpWw2DJMM8Ern4NZkBW+pz6nwmQmGNVREM3jr7XGujYCQZmLXjXh1b2Mu0gQPOca97TyRTVwz6A7P1bXVHIOe1d52csFWaKntvAGr7ya/7H/7ZZeIRug9fXYqaCPWUsdbNY6j51lIRVoX1/CXZyGGUebYxwdHlsswlY7N7QygoxLvMQ/OMOvj3/HxesX0JxNZ97OYItgNqI0YqD3c0b1rA8UMfS+Uk9ElgZ0Ba069FX5W8ZMbWL548JrCkiDz7VQ9wQHGqUCLGbW0xI359G0IqRyJo81rd0iHQS0oi37nSSsAmgd684fqQKkwH0malV/1Pf1ynqZ6cOfrSsEflDS2CfxNmi7sQAKxZCS4Lh6heOxx/p6xPD8EjfPrvWAqkwLoWy82SFNGUnsRGU+GeFehftEKySHjNwVlEgf8SUKa2dRJwkNOcwLy39zqILAq9hjk3vEmwH//nGOyweP8ff3p3j28C/gesRmDuhzROcWU5poyEviCxkrOWyVDK8FysiJx/7tu3fw+Vdf4ov7X+Pks3s4fvcWYlprbJbvK/M87H9L1QyRsd4h4yZGPAfwCCMe4AUeTi/xJE44y1tcqeNFQNnuMJyd48N33sbtoyMcDDvszi5w+sNPuLo4U0FLTwLE5nMqWCvA4XtHeP/kLoa3knYU2B5tgk+CLzbrDba7LVs2LXkbKdrXRB12LCwgzyvE+/t4qAlyF160vYbdk413fHCvc1/vwQWLl85Cb7xak/qZKOYaWC2Uea8CkUx6y7oEkYPxcWP9PrqfMSmdJ8NuhVxWFSNW7LHsnfJ60RFQbQwmo62V3uKJW1Er/1c0K+S+97EWrYwb3HQZSDEBNpcLuWSiLm/iYsC6W+v+utfq3YjeTuTdJzpXrGjdq+9Fq2I7VFnCUDqfdOwrJ3xJ1IRGW8X5uWZrO7DLQCX3qNUTiElmxD6Z8K5seWnROlChaJk7mmgvdR6K7a88J4nh1LltN+eoTgBqaVUHgEXTonghQnCSJNNKRD8mHJdD5Cev8Oi7X/Dnj6eI1xPWA5Am66BIcm9Ms1/j8sh1W6J3/e0nB0qzZuSaPvrkY+SjHnlj+h9uY62xOVkmIZd5b6W5Da8UiBLthSO7oSwGr6y4UVv17T6JQN9G3FAY/+dcFswVzPZQzhTzbPfP7awdewbXI6H2gGtfJcftTlV2TEoREuOz2zpZrQ4WrCmJS1oxmjjtrHt+oLW44FOnQbeaUC3u87NcqBoPbZdCWeJJU/xz0b6eFtyGEUrFggZOgMQE1EzcPfoBW7onRYC9+EiyM1PoGMPI/WmhIITqwmMJHKPfBcWndt2GQzOF/xjZkPqV7msj9cIiRTNDtHkcaI8ZO7NDHRkH5P9kLXiiTT7LzyyG4YkwY9Brkt/aNSTzXos5pDRrBF60nrbDVs+s8tDlJPfdtd/Y+eo4UkWYuc79eaV4UYRa7wyFrjSk8sznKFwTT1r0IP2ERQh5+OvX0vFEMWZ/P02ES5ckMv4DAAD//3RdS28cRRD+pnufxoAUCZBA8oEzHAFxhxNnxB8GgXjcAFlBJIdICSGOkYh3veuZ6UH1+LprNngiK7a1O7Pu6emuqu9R6gEgG4fqQ50OQcR/pjnqmoY4flkFx02tAo2LB1HORp2Ymr7EjYDiw2OL9eh0uLmm25JyQzqNFpEVLaR8gQZx1ATR6Oq+g6g9OxyUMteb88G1irYnl9mCTPlsbA0zFqNcm4+CVXctsW7t2aqkwccMTrUidUU+ZooVytI5Qrfw6t6iUsW4WdDRNaL9Oc/1vXp/Fc0qtYLEh01Wz9jaUGhEUSOEWdW/MRSazjTNhJSVniaUzdfQTCLvTc9CqjHbrW1UT3as3RZYsW0+AKU50Htlj90EarHJadfUFcWDMoDG6GibxmkRgWPKeSGFHS7eVl1rr2UbMEUBnHIYTWbGUurfvwwafqMWuduov9+qpIbOS0/sU+ZFfRyr8+9UaUrmILusKK08RzKmsY2cBiurlc4poxI2pEH+17ZCi+xGLcWDFy8uBPYBx6cP9EULdlLVd8qcou68n3qXJ4zYO0tFjTzFRE6CgmLFwE1eS9N+XD95oV9nJxrVbppNOf7WpARgg7KkaaRsCOJZIFfYPdvh8tuf8eDiPVx8+hHyao0hCT1zQOkGfw+MIi0bnrdN0iXIzYTmVdRSvz89ktNaF+4CP6d6tSA03suIUPwfE+A+dhWr8Qz8h8EMWjt3fBeGTRkbi0ODUF8D6GTbe99vMwXqqtdHcllCZA3Fz5Cq222yIlZttZQVzSi7E1fijufx+Z8Kfnv2BzZvnuP97btYIeMf3KgT9IgBN9jh96eX+Hv/Ar20s+nKLIHT65TB0be+9lvmeHA9jwXNynY60cLV7zFVGq8yxcLcjkhpO2+q60/OJrtRBM4RJFJ0DVUYdD7GohiRhaX3WM80GwvXHdmZZ0I1cBW/kbRylMrX09GDpDZPLUzKTiFVdE32g9sDcDhCUuPxcIcsqMNQFHVXbbrB+1j2CcP1XlHYMmVIWWQhiXD/AN3bbyBtOnTbIjmDxQDuui20di3GaRukDY6HHuUwIvUTtmLn/e8R138+xZMfH+L594+Bl71S44XpszjR5diPDVPX4EuKKeuM/dF0w6uzDh9//hm++uZrfPLlF3jn4kMs0pngWDUZRwhyu4DQD4Kaio46JUX/H2LET+UKv7z6C4/uXuFm0+FWYrdtRi5L3d/7cofbocdOCoirJRabtWqhM5o++T7ps3pWSsHOk4/tao2b/uhJZlfPUaUdqmsvlj5NwUchdL3g/Y6mb3ENqfsQGWGOYCd3ATfpS2r+LFETHWIvaqFzSDCa/I0t/bwVQ5mvcRFgOF3ftFi5YPxkATBNngka8Dg/P9fXDc7GlLbIZNNQLxzXyrs71xhr96RpxiAAWutUYeGQVTW5tEo9OFKTB9UxZgsuP4exBgZNzNjCjetDZHtKLCfsBL5mvVrU68MZEpP7KUhhVgu7IY6I9xJezFVj0u1WwR1hUXAvGdnNJrA4TCYyWKFfCyevz9JKPZ8UqjNWFUqVpA68vnhzTAlvdRssX/Z4/MMlHn33K/qrW6yHQPkvZs7JhG0hPTwSsBepi9yT0AYvWU5Zn1k5x/Fqh/3zV1h+cI7+cEReG+Cot8Uli/KvOeGbBJHFXoJb7IdOfyKEeFMBBWUNWAGJa7K8lsZtoC5dQMB1jCvbHkO/pOyu9/oMB3YyWWNSrNJciIxZZ5pQektWdu/eG1FimnJjuzIuj8fMXK+yNhoifro2TFPrdkXmpsYvIv2R8xSLp/l+ZYKLZ84gzJSlrk+j+2KI31AOHgEmYZ37X5Sxm+VZ2VlNZCWoPMXNvnEij+GzEdt4TrULANeWUseHv4st7eGscq5DChTqPDIIr33Wdv7KfnCmAGN77v9kA7GVKedejX1msm/KomxoqpxEZrFfy8bW2LxWRGT3EssjZb837xQZb4l5vDud+91xnui5nG1SjbolX3Jmdl5k/AcAAP//jF3NbhxFEK7umdm1yWKDEnEwgisSVw5IPAB5By48Iy8AV0CCwIFDAjkkAkXBih0lm92dnZluVNVfVdeO1xZ9slfenfX8VNfP99NKxxQq61pQ3bb4Q7gz04VOoLPim4n3jfvRfp4vfRjU41HhUeUBqSdbhCbw4EkChoSycRCeDj6P6vd4iuArsMK2M2iOqjDf1QD4PyulbDB6gcNO2HSHyq/g7tR63dNqda+oNvL3Ag+WbbIUNt5CFM0sR5gHE4tAhPpLNjOg1ASep0IA53z8DFu46G+4A7hWMHGwUoxViP3h1P4wwbUNnm+oDuKKuHH24AF54UYrEKAKrzBhv7wdEReaCk02WBDg9iVB0WfHifilYruV4W9JdPMYmmwr/23MVbNBA43/vrxpCrRuGg84bwGTLuXFi+Vamm4I8ShUX+7LaYJTBOzCZiJhKuiiU4HCy61oDUGtTICFd17IEedC9Q5cAORcpEz+akDT4xGKA1O1R7Ir3LEYjeOvlAY9XoBirjTGXMNCgvQsgSIgCzhv5edbxcYEbYDiX+F05R5mAc5a4MQqwFsm8SwNEyK9ePqMxrcbKSSOr3la7+NWMk6vXEdO0jLR7sWaHn33PT04/5De++xjOrt/j9ZhRxNPkzKoGzEYpD8qjcQLbrVObE4FdhK8zcErrecRnGe3IUeoXOdxLOJzu94SRSlO0yFUnWbJ87FVLGNag38n9/d1ekeInxBi5PudPbZTsOJfEVA1dmSbeM3FUPUZ1+QoQuekaRaYBMzibnDXB0kRF4gvt5f049Nf6OLBhcBJWfth0Uaahh0NaUeXb69oM2ylIeCTlQBOcxuLlovCMe3cOT999Tv2nssGwc354Dn1YkEGi0QzTFXT50VWhlhYBHS0JB3wPe7I6Ft83RmF0sKhI7dVL0GuyThBN6M00rXRrccozz1ZfPGWQLomxCmP8OImOyei8v5hEthmGHpJ4BMX7EwXiYWnOOwg9irD2kSL3FJ63VMM63JSuRnOzeohUXu+LLnNMlDuICwWOmkYiK8/XCS4yD3JLcXdnnbPX9E/vz+hv397TFePX1G3IVqK9WcE/LcUDHr3iN931mKrqOZvmGM9ltj30cUZffX1Q3r4zbf0+Rdf0vur+4Xytx9ouZgVoX7ShYjRs6pzjHRNRH9STz/RJf26fUnPtq/pDY3cJyk2orzv8S+Mhuj3QllbbzaUV2fULFqD3d6heWarijydghZVCgBGTPT7LVGfMPUlE8Qll7T61aLpnJA833Bxmi3b19396ymD82VK6Xi9gQp6PEKbU161/W7DieNBPMCOWeHbhaPemItIaSa2VfcAosRCVUVhwgW1Uo+kaEfRpPtY2/jEd296GrqUk83HayC4WGgDhVbD10ObdfPiglQjCyJtIwrt5Jq88/PKsUr/H20E+DiviNSIZm00yHoy2iGjFvXYRQR2LBbAPv6hUTE/9xNErH0T266HuWg5XSqh+zQFiaP4T3WhCUs6HSI9f/QHPfnhZ7r+64pOIvb0oj9qKK0GGi/bMNHqg3PavFvTu34grqXjLXu86DMME13/e0mftJ/Sssu0J9ArE6wzVcxXle7d/itFEBrYE3JutUkbhtHsMHnCO/a9Na/5dS5y/T6qtppeaI2/w/KknHe+VrzncRO8ID1a5NqV3ksouvxnplxzBaU7M41ELQNl6NRAb6zJVsAF7DW839bnTalxydAk/h7MOdGx8YkfImqTI3qkDPb/DsNXEVVkAVluCTcRqJaaG9y1xJ1K6ceximhWCkLZ91QzSSkG0jCZ0lEdkBrHmpsxSUWBpW7wsU7rndu/79y9zutijT3//yW3PWbb61fVIjiev/nvymhRq/ecdbE0ZdCgUcqToRTsOpcarwyly9/Z+zh2Okq2fGYI9B8AAAD//3RdOY8cRRT+uqq7d3YXEZkIAidOECTEhEgkFpDyE0n5AwQOiBAIItYgB5bHgHcsjLU7O32V9c56PTt05B3P2d1V7/iO14oJmSDWTA1Q7Xadi6hBI+jEi9I/DM1mymkZTyJXMC2EaidLRFF0PILpkO2EC3qe3VApOUVC6BxUPBGCSRfTNlFoYerBQJ1K4QtgreW1w1ysjQofkS5mIPBT7caSoEMO9Ixca2JH54sLOtaPDJ7sMS16lqKU6bK6uGpCn3zmJe0V3K3pKy2Fb54JasYn1HUruu+ZQoSgvwTEOd70cfyimR6m4ErpWry5Ftetdugs0afX0+xZ1oqTq/Uy+nuadiaaptxD4bO475rkwcxElqMbNl6jJSyCFEw6hOmRV49JAdoyTVgQzXwUsOtzk2vldYRMZx15eR07oZNZT9OrqVkb5ibP/n70uJkGmr4LRwVYoxp6oePMaLrWEUZpREjjYL5bvJghd+34WVYYNFn1vt6AWnxMYpXlLPeaFTL3vThbwLwB0LZe3Mj6kgB5QYZwo477XObwO2qwkBnrbTinZoRS3W+nae2W61pN+lxKqGmN0zWjdTYCh//2+OvZczR3ogE9dRglcUbrDtsNxIU7oQY7psWT1wShBDNw/fsr/PDd9/j826/wYPMQuOxxk4maO4qdGDFvSHtbjK63NmuJd3PRGaxF/y1I0oVLYBb1N6FuepwFL54e6wI5otQIiUJkXZ1Ez8bBRzra/UG0OUKEREMWaK+KDNnfWQs0WOMsFMj2Xc2k0D1hgrkef1bqnUEGRcMMyWM66lS1s/a6mkBRQ+oOrw+vsXv+Rii7C3B+1mG6ecvkbkr4GKUtKlNZNNCH79lpVzyen0Z/b1Efm6QMNpvO4MdcVjpFNI2vj1ldpHPaaBNgUukQ1sirGyWtTbOgMguoKVgKLvgRteQkVP+fCuEhTD5ZTYXxr5jceZ8N3XReMU/PWdZFBScKKs2grzUcRp6dLdNTFjEGpEJ5k9Fcdrh9M/JaylTlZ+Ayd0hDYl+AxFT1DTcCKG/qyvsYp4xy0WI5K5i7LKZx5OpPiW/p2IwtUR6822N39QJ//vgbdk+3uNm+Rbvn3oHINQrcDC6WJY3qh+24o4KZmioZePTpI3z5+DG++PobfPjJZ5iaHtPS8LjQs75bnbO4apR9LWNOc2bk/yn2+Hm5xq+3/+DZ4V/cttT4OUNLRl+U9NLeNowYSVJ4mDhu7IcDJ/2LFtQj70b3J8EcH5GJAqVV0+/kAkTvi77dsP6Y2WxcSeWqfQ++PoLOFR8BankMxZasTDLbr604dfRN9yF+jIognjm9NpFbmhqTDUUabsXssFMpSz2va81xPE7tXdxY1wkrlrtx3qbJvyHi1UBQpDLcZMwJfVoXP/Q8i6nSLJ9XDALKbYrSiOu5lHVkU65Mb29FQ0RTzfywLdn/lmkCe47fMvljdpkjr/8Ep2h39vsGWaOtNvnN04PRfC08Z82TsxZ/Nvc8+gswi85GBOo5hDUQQp7bqbSC2bXzjMszGc1rI/3q9V57dDHtmKjCDN9nBhnYb2tqeE1uxoztT1e4evILXv3xEu9pUC6BRJo9Uqu2/7zHg4cfoeyusd++9M7SqSYANwQPwN8vtvjg9mOkcwI6JmbhFkVfWRZRpjBtpO59tKdu+no/c9Pbpm5ws1XGNicFe4yab/44pvO2ApyuJUuQQ05r18L2fTPntFgghuadx2aPvfp5w6HKB6AIPu079r4lov90P+g8fmsyH2vj2WMmMJ+rf1dyo7n/yyXs8yzGcW1YKsPFTMgF0DV2CQG/WE0HiMaAqVRPpVibFGXqGsHTATAC2ZpOppEN1ZyT69KlmrAbs6aat58CQCs7Q7xp+nVNGwDB2Pyo11MkCXbwvkJ7pF67mguHWiVMD7Nr5nmCygCqp1atD7zZRCC71jVWm5vxJN0/Vu+yvJNYgzM1x2steFwrCeimTVROReoUqGWZ8Q4AAP//bF1bixxFFD5V3TPTM8NKIBIjiAqieRFEfFFBHwRB8qa/QPJL/Ee+ii9CUAKCDwbUFwPZGAhx17jZi7s9290l55zvq6pe3Zdshml2qqfr1Ll8l+bdLz/8yqEAEO/KPPICpeSbubBxGrNolcJoNNlke52JKDsvUiV/9HesISAjfE+ZnLZtBDcVYkezKRa6j7XgRioBlB7X9rBiHcvKhuKqqmlJbKd8faz8lY2/D253DizBJ7T6EKh/q3Kp7NCO/JylC252EvDWFvis56YBGhn0XzfoDtQl6cwQ0CFkNy8fiLVfb6y7e6HawAWqXRofJcATel7gMQ5Pz5NI/DR8AK9wi6gYWie1ZXM2eWq+XC3zpqCfMf2zy1oKfz5kGE/IgmbZa9Ze8+JYk3pDeixK9zFvZBX4wXPQLMrEtmxsNCys+eOT2wSOzAITiQC+qxZQHpSbWQOlFpAkLJMTenL7WFSbJc0w5HUR2VLb4VGl3WFQ3vRRfYhl1RAifcAcCZT7BL4m1f2pGlyegSnvU+psGGUaf9cOvxir54pigyFD56gNkDvYlZfxBFEXo3UgyfHifpyR+rwodM5h9v3HffSpV2+ceIXG7cVOjvcP5Zdv7sl02Ms2RnT3U/YOhlKJli8ybjaSlmu5HMD51gkBdmCo4N3GdTXOvMjzoxM5PzmVl66/KJsXtoC5RpsSOGU1uVhYPKsUHAAAIABJREFUcM6iT7abWVe9gVAjD5sR4jVOdXIubI+k1tW7Y0YN0MbNpk54nXu+Fjq1Jl+aUwQI+6RuiEB7hLGXSccCz4GxCivKQcr2Q7T486lD9tG/6owRCgQ2H1ipxE5/nmDpBviiu3nErPMRoJkykmI2A/KPRsO4GHcmsNZPvcn/jelC+uHCij2dlDtFcgKfc7SGwJj8s1jSjeSf/D5P/iU7B0RwMznN4xnkty5kG8Xi0Vx0K7yZDFcQQJX/j/qRYZImPjXCj56JfAuNhtIsqxMxjWMqJDeCoxiA3FqaH7jrFODCWbPXDnTQ3TThXSmlZpyqfe1cbFXFtmv1fu3OpR0G2dME8uzceP+qy3F2eiaDTl4vROIymEiT8XwVuKse/GOQZRO8xMW9D8uVxK6TplvLYr2VKTTSLdayDivpLqM0x5Mc//ZYHt37VR7c/Vn++HFf0rOdhMH3cZMC2nTyn2TWXgMKxcSIMU1stwt5//Yn8vmdO/LR7S/ktbfelqjFunHAMX1EjGAgIgd1wn922izWwYeIPJQkP8ihfH/0WPb7IzlVXRhtFJkDzsKbwPoAnl/K+PRvCX89l1f3rsmtGzfklc1GxoNn8tO338nJkwO7L8wA0pV5Gz/X5uZWXn7vlqRrnUOqG4+nHl88zve7iyyqFQKnZpL1h2w/TdNMxZDxQYvEs3/OqiQ0ZjHnVL3XGiCXfS78TJkeAlIU8zKdJIXckxoI6H2d2BIVdYnkOH93EN2l7ogXJoPUnOSWkFny5IHmYW4zDOMsyWZBkBInck3O92IulIsd6qJtCwVCCxelyTUN0KbKn/azirnHBH0eQ2kBXTUBSVprK2lxIih2bF15IFCKf57rDXIqvpf5Ifcw898sJkoHgqYpND2co8yzOOWdEDuI9PMzf5Hvif6r1tkJE/6I6/ld1sWLNxLCTAfCnCOg3aDNrU5Wsh5buR43cv77n3L/67tycH9f+lMvGjXsRtAjYPwr69YHYGPbyM03X5ePP/tUmm4ljx7um8V4O80bdV7bh7yH0jbIGx+8I7sOInSVs1XCWa0NP9N8GnbubY81WCMFBTfFzlmfEO7v8P8lzuQejVdo3FQ2fdlOM1VuaO3ceYr5dKaOmrhnmOWOIVTaAciHyt5f5Dth2gMUl66GaRQL9ZgY8ndVo38KRThVE+rye53LzFUXELdA+Qioi/RyF5sr+VsA1bFePzWHBEOjJqMPUjV1Lzm4ak7xPLbcE3HOaBwcUlTNA6/RqiFTNRSkFlVZe9Hl4R4OoaLzoHZineFN0Ro5wbUWZCTjHgvs0lTxPeo1nTt9EF3o1t2oCS3PG9B4pTg4VTo8nvhwlzbq/l1xOF2Li3rMA/0e6ASjmVeOBKajgMZHZ9QiR6GbSLeI/EvXlbTYUUbRU2Pn9etuEBcivYgQdB9XgnEjCA6QRVb+Vv+BhtiSQFTIohFDUGO0X7+x6qsqufe756tblWfB27yphm+407nnlNzwlcog84F63IRYqYuDXbjMZqEWPNiGrD35AscqyklGU7/PWH0GhRgssCwddJaOm547VaLHHnB/+MnduwolnTmPYgBGHXwfDMLg72nyezioTHZqNxgKIDRjZo4vGWC5f2WjNNIZZqQH1+fBTSc3CTtmvWKPVhwYCcokoSLQUDroxQxWTKNB3dsx89VNrh3OcR9VGjxslcSBcXOJLQphog4w6qdmqV/GIwzIyK/jXo7tDlqlqvIEuULSSJ/BznzGeQa54dwihIWsv3DQRF8lY9ZusB4bMrDOuSSYiYvs2oNubKniwIVjkCNyVPj5QQZ9wjMpU5jgmpZgKY2MjeRiWc5FHIzFOU8VUyIHmECJfADVZL7OJcD4npxH7pHVg8xtimMyLktcAOQJIJpmzIbGOdvxuZtjx+y3H6c+BS+9QvpZTVJeiwqK0GFrR4RqVpP1xTl7kPaJO9EIdPuAQYLAf1bYr25wJ5uydM8PeeoXl5e4vHsPPz++QrP6F/UQ1CGo7HMN+oz8ShwNGfvd7YDr739RRvTPvv0SFx++j2IRobRDZYikTDbnqOBQYErQ6Z+Xh1FK0qkybXZWxJVspmZVqk+VAa5HRUi04S3WaDWKVjUIbXCJuiyxwiozbDVFecRWFfak2fx18H0NbE+iU6KzwRBCSPtjP9kDOT+TYXX7Px18Gpq41mIPvZBTMRmceDMMup7kvhTeJB5jQF7W2kstYyIY8zwS5KMVngYiPPrc7IMjFx3Ymxf/uyIbeeaQC6xkmiPeOUZvBUHMZH3I56LkZLNAfbvb6dhyDzi2j4HQySTr1afqiN//iKhgJVBtqCqj1KkazDEgTLrpDpPzcF1RT70uo51OTq4kNNsW52fnaER+Tp6DJHpDwHa3xcWyVsK1fNHh9HaLm7+3aNaSjDGSxYP0DOcq6VXIPHoNVRAoBC2iCbMKVb0AFiWy4QS3mzX62s5/0+DPZ9e4vvoVL5+9QPOmxbKNJIMdpZCM0AtHmnqgDlOJzf6gibtmAO7e+wCfP/wGDx59jY/uf4zz0/ciaWofn3cwG5hTZnFCxjeoLrTMpzbLIJiTFwh4ihV+3PyB56u/EBaRIDQT9SBtjTzRZMFWguDtDmG9RXaI7WIHWYMi/djusQ97hEE4HoZJNbPP/h/iDKtKtop+yGOlsLe2DasE1fXIsM274JEbOVRqm7REsCpKOOUJJoORu3XD56vItyr5IJ2zldL/rgG827uDC2T4X739lv25TITpNYWxLc37An6dYJYo4frsLVAZq41vJ4iEA4A2d9fusVyeJr6lWOCIPAq0fRok2z0oWqUflZf6IxXRwhLgncktyhipfGDZmxR2obrihT0fb8ePVViRkosj54L6OUW0t/TpePjroh+jLUSDJUeKiB6S3xKRwJZb9v435oO0KtedJ4Js2qvxXNPr1aKWBZuZEr4WyPYBi1Di5veXeP7dD3j19BrtmzbK05r7mbkXe/klvqiXS9z/9BM8+OoLnD15Fz9dXWH126vxfOTPMP6Azvb9ZrPVV/HOGfwM8sUY+qQ5fS1XYdVqfttO/L/KOKiYsGILaOmSN4peKJzPSZUIp2Yl9opM9rFla5fQGAz0C1csmiOcmAyjXWBFO11DkgIt09qkTdX2n7ZL9huGCvGo19ja2xpCNKiawXysvUpAUqpgu0sefdne+tsJT2frbEws+sKIKeQE73Mf9/kpJXpoD8knqgzhUDqSeXKjBW2bXOj7irbuh6TMBSveTWXOySswTBDTPgZVP8ikkzuF9fM7lLBl8D+t1McvRSRRilvcf5IbSQiS15v1yOAvJNG6B1lhwCGSozJH9JdZLCVpt7aUONltXgc5+Fgk5fwd7zPOXy+3Tv9i6Af8BwAA//+EXU2LHFUUPfWqu6d7uqMREj/AhVEEwSAuguDSBFFwIcGVC/+j+AdECS5cuHChGEyyiCM4wcT0pDvdVfVeyf1671bZM75FMqR7ulNV7+Pec889J98V32t9yD/Zv89E7mwTNaqxibP5Hn9DnoNDcRmp1USfkTINhATRKdT13ok+FA/loSCLcUiMBsIVJaVyWdAqQV/HftSVU1sdLwQf5GdwYQQO2LVetMEP7pfrmU7KeGCRG0o2uadmmgEDDjjVppAtZUbCX5b4C63nsOBfGmkweGEZD1oYokaVJRaGYdupcg8YDFCBuV5ZH7GJjiIjCKGJhtgwegncgZX7ZlqXCKbhRjS+l/adBiaUhVL68Ay8OlThD1ppa6LZSUog0aptkA2j+4rWxLCt4tCwBN7sgipX0fZCG3ZPbH4HtfgwKrEtVJ9EyDPaZWAoqqWg3Suubps4mwIikgy2Ot+LBaGBNTHTxUK+1lpp+XTNFDD5Hqb8XRRMWM8grZf03x7Rclj0g0TJ7g/3qo1sKAf7J4kKoceMUNM2YkZK5U3E6cMT7M+AVRhxd0ejJarvq1dx68svcPnqK/j2m6+5P3caAwcOlAQ0nBL0ogQuLfaYUfVvC9z/8S72qcEnX93G8s2XgeUS67RDqmO2GJuME7sRdT9YsJFSFgESH2JJFCWRnIgirbaIWFJt1Ey2zESpdLI2de4hFKooaa+YUJbtq0zbN0AylWdgo8p9hn12erB9i4G+JJX1vG6CtXY5G7nkKLCxzMW+luoziz1p0GECU5U6Isi6U2YZ4gBdD71RsdXNIBGlvOIEjRTnY5BnQEKBnEQlK5SGnNbJfqz2W1mkaK+sFwl8CwjYO8aUBgAkoqt+uQzIOSFFe0aeQUW/azRi33omDDfbx3SN6r93MEGkXMoZVFBYMbgXajOfgURv7eX8oipIF7tMGY8Hki8YNVH3SmspqLQfkPe6qeiTcGL0fINQ9ax+z8yGecDkpUtYXJnhctfj9OQxnj16BGqlntfAlDRJGkl0532NZt1h2jU4io2028wXmCxWmK1ewHQxwerSFcTtc2z+OMVfv57gzx9+wz8PTrEnoT9IlJ8qadeh9R+V5Ra0CDUZKOgTwETsIGDx4hzXb3yAj29/jg8/uoXX3rqGmGp+PwebdWSoL7uU6J8G31tDQMsq5BWeoMM9tPgea9x5/BAPNn+jmx8hEdJA4NVRzYr9DGwRuNSJdgKebdE3Um1tVXWfVbMpKVAgabA/nL99ybxg2y0B4YUpZMEjtHJs+/yhZgaLSaZZhyb3jtPfmUU4pP3npFspxabNxHPN+aVzL/BkVJEeWYr937CWBu5dVt/wpC4XsGqvC6xnCpZWrO8RYMjzedpUpkVErxMAPh7juMAENjOjqfdg6cU9uuDzuuXknytodWkfKtXCiz9D+syzwpFU5hbzXN3zn5G0apuFXifFm51g6k59/Zl9pvs7q4G3xk6oM7Ngs93yOTRVRlocnQfjUTm2SFBhUHLjOd4nrO+f4PfvfsLdOz9j96TFlPbuGFTKTDN+yNlQa/V1dXyMd268j5uffYq333sX9PbXr72BXxwAMB61xgtnT9fYrM+wxEr2icrcftSHviJ9l/25nwPXB59BgBAG7Wz2s2/tgtOEkTlbnm3KNtAlMaTzSdrROiyWC4532UVq4uJql6DJuXy4CJljttTls8jAd2N5ihD6TJPcKouCd05Elj6DWGGNgkKWVJtw7aF75K/H6xf4+cusbwgjo8r7hfjpsxtH1sIJnHdZEjofrVFbu3RNlv9cNJjJ5gplZoMLa3HUFlu7nz7vKblTXd6fxF6P/n/2/T7BFiaJnwtjhwV7ZsUakR3N2ibHSgKEypk+mFtOr4tFASthUdH63m62IkKpr1ts5dsVbY+2eTEEPwojOmuAsW6QFJqZ7bLb4V8AAAD//3xdTW8VVRh+5qu3t7QFQiDBHYkR3ejGjSUBYyK65VfyA0zcqDHRhRujAWOU1ERYQCJuKLTXcmfmDHk/nnPeua3chA1p2jsz57xz3ud9Plq6rI9+gNXFp7kFfkFBF6/NXsNM3zEjxpPTiYmA8gvxZ8qCNw1VdEgsGhp3S62KyRFN49gIDd5sTn7gTMg5T/kjmljR4fIGUApgLs2kq861TjTfwCbjwem6ES0aPS4E1Ly7qQ+zeIcApJj5XqHETBpxYbGBUzBGk2l/zGrtXIenjvJNO7uWzUVn1NtiUrFpWshnSArb7ADsLAveH0oREDNh8wuuniFctf8M0TqbVPYz935zxLfmqPGpNpHB8z7ZWX4ouipLHXBnUjU8GtE1dTEFiVOO4Eg8ZRRzrvXRA4CvH/6fNNC1H7YMxe1RjebNkNJ8s/PwwKl/pvj6pHEMB6PYILfSELvRDIsC/QdY4GlCw+fSu0QhFyPMC5BNXZG9IcpHhf15qhk/SnkbOVnsZho23ot4WJIGc7Gos16zDeDZGCfSfdkLfDaWv9znRlj1i4GpM4ESgwnjaY+9dh+LtSUA1J4VdB4WyameXMb25X18dPAJ3r1xE6vjV/j1m6+N9p6MVxjP42asVWuWvIAAp+sJzx4+xnf3v8Kte5/j8vvXsbVTK43ZvuSQ/2JikQ8Tvcr3kt6nrP8OGjs/ZFHywfXC6UAK7rWZQUGH3yxFKZ4scMCIE17KjeMBn3pDlVu44ZOMFZNTdQnCaTPgjtRTkHpMGyAC2QzUn1mzX0z8EPYcpyBq0JXKrCbWTxBk8vvUdc7gklq4MsMtWaOS4oDOuJzWHHq91r9ZarfosKVBMxPYJmv34YefBGY8l2sjsh4laoOzr5Lv+76PE/uS6qHr24FhPex5rSKiH/0R9LmizpMbNVrMe7c+833093l84+SeB+pB4Uawo0cgxVoUa5tSf9O6sEaYCTxaA5tUo5pQexpNu2htEr+/wPbyCi6lDhcOn6H/618Fg+Xm9U5PlDXYyyRlSNjOsoYO3fIVsNxFt3cRu0tgOB3w4vkR/nn4N57+/AhHD56i6yvsZEaOAX/K7C8M/XN2uMX7nYzAOzeu4s4Xd3H77pf48OAWLl25hrbZEe6WvfOk2UiGEG3+OlbjWjX6wHFVqeb/MUY8wEt8+/wQh+uXanamEWnyO8QUU98ntt9E+9yZJQJWArDo80wKaq1er3C8OlFDwNNhxE5MxQnXV4P8ZmteSopM8jgnv+ax96HFoBFbOrkWl+epybnplt6RuPm1xpJpFZsaGSRkHelbGlNS3oE5EK9NqZsxI8cMnm0WOU0l80Ci/xRk1DrXzllDaZw1GtNGUgfUS8l4HHZWqrIhrQEcQz6LJJRmrnb9MHXCBMZl+keT68k9a2JsYpqKH4fS4zeYpqMfunW9dyYD1Hd9Y8Og7FN1jiQofjaBOwK8ZCgJA4AAb/RqiPrp0Z9t9OPhd+vdVHbyZCu5Z1qL+z6/b/Ss54O7zSQaarHrqtRarXwi/Uk1toYWF9YtXvzxBI++/wV//vgbqiN/BaUw7dfY46Rgu0IClSW67F29ho8/vY2Dz+5g6Bpt/t/74CZ+/+Gnt9013TSvT+Tff9iNS69KGQvTeyvfuUqZZccBCg16ESbP9C4qzLQwpAspMcp+TdY08XybjXbV08tAcz776MfB/aTrfQwDujNDx3AN4Baow5DL+gyVovia4Ll6a6sLXAtkJq+98kef/lsKGLy3gRsCGwMVuULO+qFA4VfmpIAstUvM3GSbXhTDFBvSOjT/5o5Po/icahIGXiDlndN+f3e36qnldStZ0ovUP3lm0itZo59yzG0cDBegxcAu+m9wWG1pW01mSpGlrAwA9aoqhoTmUTcHbMxf6v9XrNQDXutCYpC9J4rggu4Rkd3Tu4m+T97MK5i5XNo5ZFjrd1s5gKcpXi5V1+8kNl4Orup1O1uqAFRuVinDgMZMLDMrt2vxBgAA//90XUuLHFUYPfXu6k5GZqKMSHxm68IgroLoQhciguLOvX9A/FGuRdy5FdEgorjQkeADjRkygYnTPd31uCXne9y6HXE2eZBUd1Xd+93vcR5x5Fkngk2axOq0g5015VYYLyyoh2G7WEXFYin80SXwcBVbkkI2zAmlTn1y0bpXKMMkh+h6vTZYpfX/g0K4RQV0MP974YgjcluDQdcLxwhbNsGJOhe1KKnzwMhnO42qmhPxfM/zGVhw6s6NFdxXOpNkTKxGJZj0cUrvm10Psn7P2m1IClxX+RySbpt3FMvEMi5YXldXi3gYhrHXZ50g0L1R4Z+RCuD5hneOsC7CKU7CsRdkJuGiDpI4z176TgdIOS9F0rF0oR43fRaOHH3E+YchCL/Ou/3ixkA//Ek8EzF22gQovVBOKrM9GgAXa1FFkcDeePTBuH2wIpbZXAqhSX/miV0J58j75kSSOOuzmykkGssIc1pI4SPNFDZPONWbcvOrR7z3yNOegSjmB24cXg+OGbDebizA2ERCOHsjarHGC9ECMA1m0oDIFKXhhSM5uNtuF/cOn7EiCqr4fHrjWqvVooktDZPeW7kPk+Ih4F3dKoFTxSZDVUQYYPzVkjHlfNZ28FhHtVN0A/eEQNPq2cpFoeRDtONhG0mCqhSuC1C/bFpnuLj7D1acPqbC8cafrUyAqWgr7PoOh8fXcPzsdWRPXseHH32MT7IcX33+Geqiw9Dv0DCBFA/eXAogtybigcLubnHR469vfsEX5+e4+fYtPHXrReCgwm7MMXFfZ1ujRzk/cRbeceMYgZeX+404Fy715NoPFfd1Fw5YSsWxKa8f4ixsYerfTPAz079wTQF5Jt0Um0e6DjN0Rn3iGpGmQa40BlFg3m200TVoIkk7MyS6Dg7BS384YRN1bVsXfjhLAVlpY1EU/1lsSxjYF3wUxqugcKaYLPH/bPvB+Jj6JImBEH/jbEIriU0la38cHk2WHkVkBOSlIg4uLtdYLVfmQGA2TsMQVd9cOVom1wzzNukfgh7ShBNXTYkqr0RYSp/tMOui5No4HOwQlechVIrRbGKDcmBz9S4Xn38WDR2Tjc6a0EWsBJ2f6LHOm28wugSsyZQ6v6TNInm+2ezTLhOjXO+RYrQ0wBSYvsVmeq4LFJb2q/0OddOibVdoH7uKg8PHcbg4wv3n7uKn707QbwZQn4pifpc6z5NnTCDjuOE736EcHmJZLsRrP2+vAmMte+r0+xPc+/ZnXPz6N+qercjJF4PA3SVXN+/vhvdOCHu9QMfiulTtAUbqgycqvPLa63jjnffw0s2X8cyNGyiq1vZgJg47wXithTlojCpLoTQeqKsAoaJU+u8E8g/cwYDbeICv793BH/2F6ExwD9Ntom1WEldpVyVisHxfXYfVOOLs/hlwdhYdV9g06MZL3D39Ew/X51gSgsqzN208GJxZHb41TlTLBepFi7VpjpSWkCtKTXUgqkYpgEKRzCpFigQfoFSSlzA/4z4PZqEK1+xhA65TK1wR9RXV/tFES0u17xz12sGRQPZ961qpBEQ7aPM/j9eejNYWEl/8Kc/2mshebHpcoYox441/tyKNX4z7pvjtzU5HJo7WAHcutVwzC7I/zSpF6XtjiKgbL/JV3DLH5bbDsl0pXcqcFghXJq2hEPRlHd19HE04csJPKqedkbuNOvI4D9yRdtzF/WUv18sTasXkzkxh2otV3tiE54XJM5R4OsxISBFYZj4uGGT1HXcLRg+tcm4WJa5cWQrthkWMrAWjFIkPO6+bKXeb31uKC3u2HlVpIVa4SBz/rVBBNW/nZs1DgSum9n/242/44dMv8fvtEzRbg+vHV6HvmCiughpF/H2mTffmsMWr776FNz94H83qAA1HGccZnn7heRxdO8L29AEaaUb/lyIiKykA2/VGUGJFpq41PBvoqMJ6gjE3M1pnbbm42lmqDamIdNdlHFJ4A03QmKYNhDLfn8Lz6C1Ls641+79cdzbPMTlDzGb1UZTJlHDdm8oHgGZ/F8zD3kXmCkfu6ndzBzSnVsKayekUvjRdMUfWMq91vScY9NxRwn5W69/pNVjTZbkrouT/iwQQHYTMhB34ufTNFz2dUvYTz8NinGwRqJJL61D3Ua1L2SbF3lQ/RBs+QU6Zbgjvj+cv0TAypBAq+YxWEX0qIth8CJprs05FIR1l5NoYOswbTavIHeFUyLuIeY7sa8vbI92Yn2u0mmpRSz6r65D3Z3mvNSQll+E6SJo37izB/bteb2wYpg0TvlfubRk0mGOWIwe9JtQBtdXRzJ7CJBSzOcbwek455pBHKSik7TZLOvAw/9eYJuu+IbrI3ofQslp9C7z+FPAvAAAA//+EXTuPG1UU/ubOeG0vUdwg0lBESItIkTQIAUVEQQE0qShoEf+Nlo6WdHSgCBQJCYQiIRQUO4Rdb5z1eGbQeXz3npk1wlKUau07M/eeOY/v0RyDUNOSjfBDBmIGKHJQLZlrVe2ZMA56sfJHUuhOxUNCWyXhzYmYHi0IFaLQlRsspb9YgRDSCG5bF26j5Ci5GFHlnTeSH1pCKdy9Neu3XBITJdB4d7qqs92MTr+2xnuhPYVBOhqFBfH+RI575b6jLJaouhrXxuneVEkyd5ybegT4M1GgYFPlyAiEaT87wNzoFcYIDH7MCi7LIgWhm/Ldphw8Uz636hs0zWidPFygX+dhyBA+kBpQFduPzlXnY8CZagDkKWGwDNT70FozIlIHpjAcigRyyqkTC7c902tprqtlUnCyckgwfApO3iF9kTuKdvg0sPaD3k+gg3H95bqGvLcpyJShh97giH8zagQEyJrd2/I9uo5At5B9s1ws8l625hx/3yeaVa97NsIMx5DD8TWUTrEhUzqHKZJvF+FSVB/mdUmc6ryJpAWOIhoaLfi1i155Ee1Th9Q32J9forvYmx85rmsA9M7plxeBTLBv3Xod83mN5XKOO/fu4osvv8LFeoOfvv8Oi9qn4fJMk1lX9VQdhzcY5P5cAue/PsPDr7/F/SrhzffeQb06xWW7Q7O0xkEXB2gp5XVRP0LPQPsqq2gzfsXnyinTwfncFH/KicMR+JtOM5rSKVYkjCedGW0QaBbTM5FV+I/AU21i7cnpvs06LPkyQ8eea2y9gy77j84xqgXg9ABaFEU4pf6biO9kqtAIwTXurqtf8v9Aakk7k4RwNsyKNal6qO+VwjEtnhnTK9+TtDpK+hz7POU/qMAedT6o/dJnL2aicGbJn3lAT+l+92mUXq8L8XAtRYSwzgmQnC1VTU7F5SU7GUTVeIf0ayJ8uP7cNP4nK6xVzD+Z8Fkr8eFkrsXuMAjXPWkxipM5KhEYuwHMVq+hPl2iHS4cMu9vCIUBWOxgwtpIMrs+10brfLZAv9lhvfkbfzz+BS+ePAV2fdYnpi28g/xsYuhNGC22OhM/lITxcALcuXsb9z/9BB9+9gBv33tXCzlRx7bYVbMHHdilVvmrcnjF4l/TdbSpwjmAJwAeY4tHVxs82q7xZ9VifyKuH1UWBxQEV0WEotNf5He6iy2Gf7aCQUWaLfRZSbHYXl1h8/yZJnuyl24GLjMm/8t6lFbQmHOJUUeSNjI5BdP3bG0NwBj7RfuBLkh8j2muVZepJs9sQSh2I847P60Y2PVuAAAgAElEQVQnwszluFjmLLQcM3QoclyKCEDGkxSoeXUYjjB3EtTjQCQTxhpNtPviRJwidSqiGlyncr4zDBkxMIRYR+G7khO5I4s6GsX8r88o0vKOK/kPAryaqLU6+HpLLhDjoeUjhUdOCkX8dO50NY2/kRvN5J+6D9LsSU636MDpYMyZimf5KxcKZvOF1Ffm6FO66+BU2SE3GQeD0+sQQwZ7p6pM30m+tQduplPcaE+w/vk3/PDNQ/z14+/oXti7udPmVNnfydq2Ju7pZ71rgPc/+gAff/4Ab7x1G3tvm8sZPjs7w2q1wu7p8/+EfhvsXhAAL20wpw31lxrvBSHTt4ztFPI9KKpMis62L41rtNSUsPtie9A0FEgNjdop+fdl4CZNrHosRD59lx77ML9n3UI77hEFpCt7Tm1ivSDmGSJtBhzyhWdp9VXKvHk51yaSbYhkFZ8O2jP0ke/cYs7OSbzXY2R0PYktwmev+iqvRweNdTn/dsbK92n+0I6dhYiqpv1tEd2t86CB90vqjmMxp+TJtv6olh+vxS49KZW5IGb7EU2Zeme2dqGJG01X7oM0JGRAR0tuRWl78W/PwzSHzP3D6l+rbWnt6s0G6hIFkdC9Nxb1DaVaC6SiFMFtac7KJ8YXaUZx/YpuGKwuJipxd7UrDVjNu63xaXoy0UK+R9f1+Jeva9lxo4iip6vb7bbnEUUwAQWxQmyQkDKsiARBbNhC+D5+gDUbPoANGwILFgghEAIlzCRRPI/2jKe7C91X1e22Jy1Zlmfcdru66tZ9nHNuFRPXMwelxtmUnoO5xRjdNOJ+2E2g110nC8o4ZB4KNcQM05kGRPZsFXXmPaxb7O/vKzdWN6CJcIyHZ0RVBrbDi+15LvP0EOetk5ZSO/pX+jGhTbSzVk0KbzbYfqeqk5YYMNVoS26IKFWTeLscABel49TlgDpdr2tfYcrt0wkP/Q2+1Yep6MoC22TIy824jYUtTBbL403AYEHlqPpnIhbGHTUocOHGK2plzS9Ko1CIsdMNfZIImBqa6SFjr31/oc60ZkVto7+NSmBCYFzV9j29ldssvTWHrCsxjAOovpdKQGAjIEKCRSWORRVu1wiIDtaLSRA96CJMARCc8v6k5aHRX4DcPtOEGBOywdEAhnTdcg7Ptbpmh4Gc0qZZCjJA+8AP/ThJZkYGSo8oFM5tVRHpDa/zkat1iswwkU0nHjjVdbh1nJQikPr0q+NOj3Z1gfbsYjcyGCrkpcaxXi7wzttvYkZz+DpgbzHHg0ef4PHLU2zac/z+808a6A/82R1VlIPlvVUFldA/VOm5oGB+gx+++Q4PT1u898Ux5vcarAmOGkTMhRykWDgeYYQijCyZNNPqj6pUcwZ63EHB5oY5ssaBZ1SJS+jsspdIHNkhwRChtpPmyaya7Zx//jVTldSmsuPR37ASeKX80iFmTQ9JYGZIewim5N1zklagkWDEThlK5R56HRmNxozO47q52DFeJ3n+pL9P3jekieGCaYZwEiwX2jtdN2yFZA4xO+GjIHwiSitiQ2GkN8NJBEbNiIaIb2nJTvf1Rsd9EKRGyB1aTGV6Ov8LTQKZOjh5ywmmHX1FP3MV/fnM3VMlcz+e9L/Dw0N2XJiSQvBLGgtXwSWnuWS4+YIrHM2dA1SLOT+aqsLBvbuo7+zhCudcqetVw6AzSLtE1VItjDesiM9Ji01ErJ7in39PsHomFJ6g5xl6BprQs7XOrzXRQqu6qYG79w/w0acP8fnjr3H88Wd44637oDTCLMy55Wyg6jcKB63XeUJICM4BiLilXeolgBMN/J/EF3jy6j/8dXmOFfkxixrFQvbYUudWSuqg5Hagkukb0L46Q/9yRX3AsKDzFCnYra+xOnnOta5ZsUXRT3SlQe0WmQpKXPaM4FI/hh4h09nSesCQxIGrWgRll+o4U6GC7YnCWUsXWPSuQrQFsdd5Zft5/xphPtkvM29VAsfxXOydIBo3ZS1LrXBJohrOgYeDIXcqSAct5kzphYUmPQ2dZu/1gsi25zKyjOx0l+0arWHrw54LUr3CpvM6sqqftZ42tGGyFXxvsr6KJRA8hcgHab4rknxPphCkwEGhxJYQNjFAEZye3ItRG+HtXbEoMkVi2vY3nRdU66BH0org/ZrRtebzBU7Cr9sbVEWFJtSYhxLLtsLpL3/gx2+/x7Nf/0a4BhrquEK4HvpI2i8gQrklJOFXaGKgXADvfvgBHn31Jd4/fqDBv6wn0v053NvH0dERnv72p1aMtyV/oqK1LlZnKMhO9AUn6Xgf7hVBZToivOeYBpmNh+m6dMk3N4oEB0ZaIc+V8mIydplqOg4+X+/jwPmEhpDxdjpXwLNOkvl5603Lfq4UG2f5/Y7yZTZjvZb32PxjVNDVFfvHY1qoHIbQadtLFtTbVYzz/jmPgRbCcgHDxKTLrRtmgqOGrFksM+c/JnR4RgH5eW3deno9l8Uaa4aQJgq4BdnQJFJUrQK+nhH9TiD9LFSoxZiUaNTzCW1FiexMGSQfXegetIdSu3NJeue4iVIuM22XL9SdgKLLyQTzBQlZQ7bagn96Jl4/20z9HWKDs3C43YOKO3Fk0W77LhMOTb4/7fEx05fMbltnLvZPOkmqmP6DFUMZaRAj/gcAAP//jF07byRFEK7u6Xncw+YQIUIEh4QgQkJIZHfJOTkuAYlfSYpETsKFgESACIDAcA8bZC+7411PN6rq+rqrdxeJkSxZ1u54Hv2o+uqr7wu4cKbSQLnYVvB77RPuVNmSE19S9Jn/NozZ2sSKHjTCGlbxX4XQsOjyz3yzKX0lbFeyWq2EEcA3gCQvmB6zcvMQjenaRRETpP5eRyiACjAB5NwubyC82YtCuAZX/CDgm8ovMqVagWY00J63JPhMrdzclOoX1J2zQutSe5BUiKMzXo++z7R3uxCBRmwHhytiMUtJ2F0RAAHNOJTqtO1vsiIW9Z0cCkfYRRDWG33fH2xGSb34M+MgFN9UtIIIA3CPsitUGwEs6D9BANs7D+Xx4kyg/bL2PVufU0FJt0tR0Sz3mr1lCnW2bNQlYK/UbHlfaqUGezerDZFUERj3DiVOywZoNgFXabzQTCD48y6HQAYAIvEFV8q1gEtKiYraWyWqxCEUBBO0/B0jl0NGLkUV1vWNEEh9t0tpxWirFNXGs9PKlAQ+XscqK91vZgmMGlVqpk7NN+pioH3TPosCYlzyOjF2GUhidHWnWh9eAbft9T+i+HuXIBbWsgCSEKO8Ujp7miZuNWDV/5T9v8eRnjx7Rlcv/6SLywt6/ftvajdWwcioJUh4nbDbwCBCK4ni5Y6ef/UNvfrrnD7+7DGdvP0WzSHSDQNrPmZxOo67JfhpPXyZNoyAK3tWK2DnYpP09mpl2fnqzUvo/cM1oiLV9yVQBavFGWDrWGX/GHhQe8ZiGYuCwEfYk+aK8rK0atjYfBL6Js3/hksJwRUG/fax9qB16p6CM26NzVdSuqyd92hvEis87xq7PRuEIcnmZyPzyNfEeWf68lNjXXkoJmafnahouyyetRaa4FAsz6K2d7n9yiP8ePm7e8kRAPEI1V+fexql2gsv8pQFg0ofqQameN52TU7aqiS06EXtvrZLs+bkdpuoNpRz9lNmaytlP8TbrBrtOOG/e18YAH7shd45hJGm0/w3Zm33Sn2MYtRoCM067TnJ3/29kVay+WpN63lLV6tZ2Du8IkmIZ9qjSj5dRg2p0AfRvZOR3vvwIT35/Cl98vgRvfPBR+SnE3J+kiT/lvc7YVp4rVrq+lracHK1PyrowP97RUTnFOknuqTn6z/ox80F/bpd03bgvXmUxHPpku4NpsItLYDapsDBGC8d1xui62uhnnKQPXQ9jT7Q1avXdHn+QhxMOvN4MBKUqZ5BAKcMAKVoi6ZEXKpiuxYXZM9RujYSO1QPsZaSVsjIt+sA2H9k9vQCcEHHQkH9tNfih73bl+SnK3O/rVzWueOMUFinBQvEbWzr2Zk3zXN5unOH5s0mM2KWpST/TjWTLEhYkn1jX7eYcxG1oqy5bU7BP8NysPcH1xznDDOvgzVuBb4l9jPXE31N2HEuAUI5oSZ256gaCs6IC/LgwRqyaKFH1iqwLg3DAWtK1iTR9+zadWo/poMIMT4jYrG6HgW1B8U6wsl6cZ9JvsQPSP7Z6C/cBnow3acwO9q9XNHP3/1A33/9La1+eUF+TTQNaovKjhdy572I8dnkn4/bjujd9x/S2Zdf0KdnZzTcO+WGRRFFFSo1eREGfPP0DdItMjNtqD2SziF2MOFWJm5NGaYgjD7RSwlj+bwAX65S4ImouC1FBYQgUt7p2AaTC/GiPZIwQYYCsBxL+o/FzKUQ4nKLCgBpiJInA/Ja0EYE1aU1elAWmte4LRbWWjRitaQ93wCUCAWw0Gtx8dDZIhcFoQNU2cpWXFvKIzpmQqgFIJ7XvPaFRmD6iDi0sFV9kV7FIWAKt+Moa3Jf0wwghzOi0ovGPrBU/z/AC5im9vk272cPzLGigDgg3MfsNKvbxTpF/Mw5rpE2DHYA4bHUZXAQ7AH+DhfgIPpY2k9UqJf3aQYYwIrGfAZjANeZ9VWQs3BbfXYDyMW6/B4kF8F44TEs7vnZ3YBpOHwNYL1UbYhIKSX6FwAA//9sXbuOHFUQPbdfM92z9lqYH0BAtEgkCDlBCALIkHjFFuKHEL/ALxBBToBEgCUShJAcwNrGIHu03vXu9HSjepx7q2d3krFseXa2u7pu1alT5zQSVF3dLZTLs4CFNwFy00WEQP4s78MwKBBA9LVKS2QrBlvjRRovtBTr8SbqxXRlQr0o/eBieo7KIOUHs/agVtokUZP9kmLCV2mOl6q1JmQTDyUeWqNAWtgMQ0myQg9yQY/cKNZVthiqfOdocqo0g6RylfUoSDexQfX/W3tgEf0VNE4sRMAEUi2DujxkVZ7uE5iBJ5c4neehwnWF5WfYy3bC5nxdiod8uT9MWLHIlPtpgjOFgaHXou/VS7okxSIcyOm/Bv24X2gA5HuRipiKUpT8gRiawRkPFhMaxEHVGLkYqTPdnC8pruUeURRmvy9TbpmiJKfsyL+LxRcf2DYk5t3ueow1bZOLMl6Xm1Q4EYr3xHiZpgXqF6cKuteVqmxFxvuo9MKFqKHRFKU4Liqo1hzsgtI89+/niV7jqywWJb9j2s8ZFOG+KJFHJgmK2FnBWHQCZhcpomgRvVEjbZsxblOclIXWcrMidHYZ3U7mUX7xbIv5hl1APhB93TpSbh7NR7dvORXY0N4uyV7kBp/ev4+5afHdN9/i7PEjJFVXnbCbL4PKeBHnEhX51jRlsHsK/PH9A1z89Rz3Pv8Yd09eQ3WUsJvFp/6lgRBSKMoBSQEq3TO0OJNVAIlFOyiI2lO/Yqc2ary+VKnPjfUBm0Qbc6ePI0ybqAlB4SddLZmuFzCMT7Jy4vQBOSdUedJw0ysLy4QiSPOhz2watz6MHsv5mfQMQdV/2UVvsx0rrhUopGNSBT8WvvCDNDYtwhiLe8f55zqtdp527pdrE4jsWRwscyg4y8J9UoB4WbxYU916EZaw3W51X7EOhzt3Mxegs1rhNlkvQW2M9gW8xUFjxZ3nQ7A1W9s2BfQdd8WSlg2aAq8u6KgUUJmaiyZHJfubMs+fdCd73a2RZJ+6bdAfbRTUk2Km3wwqUDsnFk2p2HI5YwYHTe727BI4u9SdS5vJGeAjYMpIEC9ximxCuqpnKL9vmvHGW2/i/U8+wrsffIiTd+6h29zRBsVU/Iv3tcFNwaop7/knbf5nf54vfeovu/6/4DF+fX6K3188xT/TFc6FzeVMILgzBYVz1aFGYoXqHhKvspu6PcP56RPgv63ZZnb2bAt4++zvxzj98yEaKhyG68IooKPIrBpGwNHxbdSdrQFMyX5a6wW55I1WdBDAFUsHeKTQrE3ozHzLW7PoWzXFwjbsHh/mAj4fbELKaxlnXCngWRvjS0VPD9dYfH2COV8KVAEm1LZSGp/IAHXnBMb+5E1/7QCI0t5DfopU3fhd9P3QjSVoZehnORggU+7MuBSgU4Yv/p3abqVgiNRdLPgF8Bk9/1AsLOZR7tHHa8qin2czz1xO4RBqaak5WLsQ2GGhr3VfjZxDZmeI1YECHu+nntVBVI0DO77YYFGwTa6H1O6kYZt15Iz1ao2Lqz3W1QqvtBvcOm9w8fBf/PbDT3jw48+4fPIC1d4b9KtR49VaIDhUu0eHhEEU6dMOZ+OMk7dfx5dff4X3PvsC3Z1XUaNX0E6Ag1ZjfsTd42NlANT8fZxRGl/iIy/5ahaL4JdX6I56zWlQQLDOWiK1UqInXUkeNmt3VRnNVWY/5mud48VrdK3MvQGkMBvrfVPxL+t8VyF2yxR6ee7MgQ0pddS6W12LoZjPp5QWFG++s+EnrZ/5AU0B2iMQBD9/slaU1CLyuU5rN4CDTahp7ejaQ93qWrG883taj1VYs8Whozh4UWMNrjtmTIdx6bTguh2MQwWkPFdNB8BccuY58xDPssWKqYvblqFVrQAWFfPZN+g55GDP7MPYIga/XE2UwRNXHYzdJyCTaQnoPfSanKwgZdf6GgnXbO27W27RWl4FQiV3lRUue8bNqjOL8u0n1fCQ/EOWUD/I6Mt6Dq6Djc7c1b93zRZ+tuQsiQ2zZbRcIPm3x9pWt9e9Mx2sfrfvY7bufd/jfwAAAP//fF09b1xVEJ133355HcBBhBokWrcgUSCkKBJFiggoEfDjEDWiQaJGFEhIqRA0QRQhVmwZoo3t3fd270Uzc869s+uIJ0UunLWv77sfM2fOnDPhC60XAOnQECfixEVVakFgbwyAWQssD+lPthgNRfVJnoRKLgWPjNIbArNx21TDCyjSdYNBgGJ/4fy/+qocJL6p0r39c6uXK0e1kHCxoqPJROzF4ebWyif7TqXST9smZHV6MmmXUdRZ0J+d4NvoXtoFL3JbqSGCoNTQ0kp5Qx87EF1ekHHTktbhlm/oV+2me2gXrfU4fxMo2woumEj9KRCmYoDEMSwBktj/JToItVMG7hpA056O7Rqcg0gxPAQs3HrIaTGaGGp/N9fnZDqDsrArjMoeXd17a+gL3Nd+476+o/Z7WkWQVEg70JDoUFCv75sbRHy64G/eLviMoHUfDKhrNyL40ToIYJVd0LBn8eqCC/Zta4tGqvoB/GwujWo1glkhQL3N7hD6Hfp3cD1WIaK+JYy0d6LfbEZ/ItFzqjtHrQpdxzp32pvLz1nPdFAhHTGHKSS5dQ3As1qjMQ0lerQCjNdeQexKq55JYAFEBeSEA145EZqKGY0Wnu937t2Vz778Qv49O5fvv/lW1heXstldCev+Xa0g2k+TXveNqX47I2C4Evn717/kx9V38uHnn8i775/K7OQ1WU3mcp03sk2qeTGYf33COu4h9KRinnpuuOVn89ZnEBgDgcqaAu0rCcuG/hDt9WAtB62RUpPFBhLuI9ucL/ezz7d0CSrzBe+HyrpcRz6XtwOd+Bhdbn1jwK2en1QI3sIKUgPwuO+7rqvOEKzUx4f3SM5Q247fQ1AUQYzICmtV8tzAWttTXoHXuVSAV9+Rrll1+5hB/JVnhQTwoqDXvZQeZ1yuICIBtpm93yZClgqVxJHwxtYf+G/H+Y/vy9o/yj5VlGMh2JPBQrBe+XHXgHAyKOgRrZVgcSFbTcS0X32qa1Vl/RZHMl8oe29q1HKzYNIqpfa89269ZpXd1NXqREG7ETkfKYTqBYk/9xJG439Ll6Hi7P/GXbEEXa+5k7sn8uDBfbn/8KGcfvSBzN98W9L8DbHaYs6o9cd1lw++4mywdMRV/i9F5KkU+UNW8nhzIT+fP5Fn+UZelEHK0Uzmy6Wxh+ycNdpxLw7Lt6p5QlKhbWjdeiPXZxdSnp17+f74yEATSxyvb2Q4ey5X55c2JKVuavR5m8aM9gKd2pnIQoU1IVBoQoad1Fmtzj59AmNk60CYsfC0Z/6m1kmNRjp4caVqRWCdVtbfAYMm7pPDJMbuAKyzccj+ddw1sDDcWwb2ob0t9rCOYMolJKiTzun7MWGvsUgoWiS0F0S1cFaxMyy8+FlqIERbYQkJb0y6D0+tDlpRNke9OwWQNZBCzzNZObGtbw8Axd5dmuNUrmOWcP93uMDifb8NrJ7mbuA9umT7TQPTa2tidWyfgE99sF3L3f7ZzBiB82oshcHbtdo9jjhBz/exWEK9kKm8nueS/hnk6e9P5PEPP8mfv/wmk1WWuQqbTjrZoEWBHgEZ9+hS5jLtsmx2g/X8v3f6jjz6+iv5+NGnsnjrnuR+4XuAyvkGZHVy5/hYlouFaVFZvoEzxqIPYAF1rOtB0s6LBIX93HL7MRccW0cawzvqTKcFxuw9AGi2pvIeNi0btHjZOLsmjPyq+/ZVd2ID0sAWKW3f9bBpdDedvsaRtIpl/kMQIUH3rArYQVidyfd2t18oqU5YXMcoZJJ5VmBf21NrY+qcjQjuR1aAr7vsUvMBiIr3tgtM5wqascBpe6z4OiFbhyzaOFcsDFJMk650BQw6K1SB0cLfGwETvZtNOBAx0iGLI8GykGC/Ah2H50SLnxqjmJocFIscBteNo/03C6vrymjU9u/G3uVjrUVaCAp5rI6XbgGH79DAOQA4Ptee8HP+atxGwJW6A1pUtcKFa9fpuL2ok8HW97uluoypq884yH8AAAD//3Rdy4ocVRj+TlX12NPTM1kYUHSjbyC6ELIIgroxS0HcCeJe8GF8BEFfQMjOZUAEERdZxMsiCENkMnZmuqe76rT8l++cv2o6vclMkx6qz6n6z3/5Ll2ESYPNgFjYuDCNTP5ZCMuFyORFuSa5dlamln+Dd1sppEKlWwu6M70Ahcn4jcEguCbMohlzTKjyiHCwkQEQGwj6/oG+AIvY+Iq+lEZFMM6/PGybzXY0beLm8Qal/3Lrh5AW+73rGjQwqBkqNJ83u2zwyfJkJBqoFIpQHLOLKME57k/O26J2GxEAtDmU32V9C83BA1DsmpUDv0l+U2VPYI9Kw6cGubHwoDzsbZxMpBps2BUrmggHCmezVWzCQ7cPB2aF5bP43Mi67NzaJnS7IxyI9U52fle8PwY/gCskM07pswtoND4B6B3N0ZcmVeMwOoSkHRSU9OK2zRV1MBJ1C+/RdoYHdBV4Ms7h8XxeOpjyr0Gbu+Kfntx6M17DNDGZ+ZrwYdeO4vHC3TssqeG64tZ62N/YbMjvmilax8T8XP3ZNSw41eThRLXWZIpyoz0n2kEDYduNElJVqk3m8CE+w/LT1Wql0wYbfrQGx91bAm029bl+Vjnoc1xvBy3E5ZkTxI4k4qIef/bqHXz19Te4Xm3x8PsfcHV5A8OsiG98D2s/suFZkM36FURxuF8DF4/P8eO33+Gdx/fw7if3cfb6Eu28xUqSx8662aovMMg9bJzZawnu7pZh+1ZhuwhaAPtJsm6xbZxUqICcc+YapcPMcCPdXO+8V2Xp2+JEe4fl8vCk3kq8lulr8CSt/I0DadYoHslBMzsqCav8rI1TEUjTtWluTfkRLZMmSRT5+uTITxsaU5QNE1oVdQ18SrDZ6XQW5erlpCif1hP7mSs0C4yVHfi9x0uDzd1GKZk16KDq5WlrSvHFGWa3Gz3700LHpiSGSFI3B3FqiLGYBVPYR/msnku9UY50Lt50hQ6liuceOy0W0ZrTXQhah1LnpNP3ppnrlCw3rRaiWvxL8iKCi4Px2o3fHgKr96Q0+aYegNJqfM+CxZ9JBBhKTkvavTl2R+j/ct7hvfv38PGDB3j/g4/w2ltv42hxpmJ8lDcr1A9ewlQN1J/kFiaUK2XwBYAnAH7GMzy6fIrf/v0HL9oe2yOBXc/UleVq9VzXSy3mfKJuUaVyy+HIQxE5vLl4gcs//gaE/586dHdOsZ932A479Sa/fPIXLs6fKWVJE9rJdaZgGyovuW8WyyWSCo711uRwJJXtm8VwOfeFRkTYrxRgFF6GK7tDE0C795gcygSJ0PoIj2fDbFS8+1lfk2azedYCg/S3QC2cFj7kXsf3CsXHlbfT5DwgAiHGBOYqfc4FCZCDajfC2csmGguqeh2x8Udkz2D3feHqj9ELgyfXMcejeFffj4sETHJjrlvVWBh03RaqixUb/eNBAUKRyCnjiNvteR0FEtu2ugfw3G4mMfFlr1KM+pR5SNUKWvZIuP7yXRf7OV7ZthjOV/j14SP8/tMv+O/P52jWzuUXVESuD7Dm9sme/4WiAQyCfnwyx9mbd/Hpl1/gw88/w8ndN5BzqzaCLWx4txb0nhv8y71xujy1Qdauv9Ws4XfVxqHYLYp7DeN0OJdSk0ZUMtn3PsVGTTPOf0N+WZuYdcpMtKh8Vgo1orc2LoYd8y82pYExhBweC0V0dXBht8Ytg5XWt17rIG1A1Xyi3ldsYFnzviK9zCe+KVP+iIZFyYG7MolX1ycXdec6FLpOsklwnI7Di9D43B3ak+wFuOyrNPQVuUfhwmDPLYKMEUJ/6DXkihrYbavbmg0SKpyf+zl1JksOd2dzIdISqNfGazAbwCr6p5S8gmsL95zXrNHKnTGpIBNeIlzJl1l8GxJA9cwokKwx2AZD/Y7UC3dwU9Turp7jBXlEAXn7/1wDyWmIYGTTMVKWb3as381pT+tVurXlPf4HAAD//3xdS4scVRT+6tk90yYhikQUF4obN4KCK1fRRRBRXEhW/gP3gr9H3Lp060YUdOdjo4Ih0YkShqGJdM9MVd0r53lPVU9sCFlM09V96946r+/R2k22TcxfMqiEMwxlKF1S41y60uggPoU2kTQYyrxTqj7iVpw3xlHq2Ioqdkx5Ct+1Bwspi1SzfREHb4VJ52meXEdRt/h6ElLAveeHIuBkgoa2yAYJok1pvq/ld2W/btyg2+2WC2G2XdB9UnOhP7m+AVMf9sVSyq5nkH3mgFtyFziiEeazFNSLvBpBNMyhrIfG6uYAACAASURBVBF6X1NwZPsTcKDyBCMUyIAVY+Uae6V0sPBg+O3G+x+GuSBNDPZJbTrMh9+mkgYj4kIR5uVduPLiz78v9027xuKbW5oaptPgSUul/D7dF9Y4sAMgUPKOP9vW2Yr/skcqhYSN3miyRIYLrLpw5uNZiQHY7g291/5mU397aPL+Vnh+4snt0Yw7REXeqHYxLLpGirdt54ee4MX7/Y7PlSWVMpXoD4opSTQusdmo5aEFmxTtmCY/l9wISImnXscqgCkwtqTc6FpVkgXZwoGUeY/ZXTA4+bCElu8Zg/94H5KYCSUKlwQntnHiocMjB34L/mShQo2B/XiJdbfmYpOgs21uZXpZA9eev45PPvsUq6rHl198jtN/Tx2pAe28JxQbrJZ9d6WxeL1v2a5u93DET199g4e/38Ob79/Gs6+9hOpGh4s+Y6LfwHzSC3bMoOeTPGgHgSBiXnQvE0HXA9aHeI6TNl37pCrXlhza5xmnEVdM+uJ5F+HLaYYAKHvS7G+MHzzvSHNjJbyumnrE6yZ3EylQe4QE3orr6Iqy/IzlNZZJiDdUp+RFt3FfZ0066opnE0ptWAWXzjkXgG4dpO4g4yid8rY6+F4CR5y8iU3oAXt+t3UptGxaZEm2Ff485Uky2aN7Yc0cRh8MSm9DSSqXokWRnsWJclWSg5TmKDh5nxZ2hBjrhf+3Wq8EFsmT5DXWxyu2yCJxPbKZozPB9nbczFTeO9sbztc+oSiAY9E4E3/77NB8lrGrcrBIrfDiKy/jrXfexrsffoBXX38D62duMQ1INfWwlDHzaJWt2Rz2NmmBoOHC/x8k/ImE79Lf+GF7gl+2pziriS/coVt3aOlZMQ7YNCsv2gSaLzGCppAsVqjflYqbfkp49McD4P4JKffRtAAron2o0va02+H0wQmaS7JZVCHWRcHveyirE8K6QbPpmQdOz8bGfL3r7E4AnODVxn8Xeg+YOyoiUvTMTiFvadXn3mDFWQsNhMFInP5b8S/3j2zmikaFiVee6xCELbTCvowwe455reg/dTk47EyTillp0rpIlKOaf2xMIDQDOLfQYt+uuzyTdq2s9AT7/d5QDSjRwmMeZw1YyW9HnxwzDfV448Xd5DmQ/N81BQY96IDANKyYcjNO/1sYVAvFf2o9mUjYpA0Q0sKytRkUVQdVIe+6OQI2o3JqADcPwzLZZ1BTWtTlO+weaxFL+7tpcaO6hurxiLNf/8KPX3+P3779GelsYPvOSifxF2OZ/C/7cGSfnYcL1E8d4eYLz+G9j+/izkd3sXr6FjLB/mkmMAkaJEMasjJRlvuz2hzxHiKEEirNCVHOIfSaxP2H09Ys/tcHInQja5zArd5kMEZ55eCNp9YLxJqbnTnQe+0l1GYSoSvrzWjWKwpic3jCIj764MfcZ7Th3+lzXRwfgnA0Kke1GK1SYkXt2joyBBIUNX/HZi48Lc8PcQ9ALvHHBgAF/au/3yjKGnNsuGh1BFEXrRkC5fzTv74TtC3FMXbbiMhMbRDkQMfBAgEQ0USlKTe5oHHO2ZsWvI6KXKa3Duc25C11BJ0fzr8X+YsM1kavR8TS/lBYXmKp6oyxOLasszQ3ROTY9p4hhC3Oe778hKacnEEVSiZKBtcRkgNRoKWtwzkzC06KUCl/5673ZzKfPxqInguij8SZ5d4agkLuHa23NEVED4DyYPquVBvQS+KFxAoA+I+tK9iRmwiir+22PZ7dLAuJRAAh4AAXJI6AIiFAERwQfAF8AT/AgV+BIxI/wQlxTYSUSxSBBCQLgoCUkGE8M7Yb1auqdk/glKyyGY/d7eqqV6/ei76x8vxgqdBsSfSsctYMduvWKDGW3Du9RigvyYWlXDU6q5sqPTnPxNnP2R64qjOVM9NPebhU/L/qHQfzY13ZYTbyYcDREUfwGkN/7Vp17m7+vxtAcGG5JmYlfQbwpIJUkphxhrPWokYUH8uXvGv7TOvi3C/nToXedKZUMh9lsMDf2kaVa8gLJFQFJiDmLykL1varvFkrswlqavUHTmZVpErCs4me6HfxDjaR4gpGfx2L+w1HLAgiXLN+BuV16KsZCkpfUJ9gKw6DqelLd8nR9NyxsZfA7VUmQyJFuZleoMGsG+UwqX3sYWJyJvctXpcsUgWtlINC1h4zTlY9n4McADHoC8TE1BkgxYtJ71yjd06FPQ8VvDvtonr3OhQzj5vtP3YPSr/04FeioLvt7oi+pIqyEyma+g7NGHaDzfhPC604acErzJEpFLaBIpTl331OOWiyWE77zASozYE0kcY8Gv1PO0tJlLpWeqhNKeCR7CejdPk4SUp7jOMOswVLUR31JHPVtzoqULhmeEBdOv91Dlayr5S6PeZgonFCE+haoJsQjUmgIFGwgj+aSOQ8L7643JsiRrSdcNpdQj3WGIcdiw8KSMrB6kVxCuaeHrITwPqspdLwxR/3gCsRz51cRpACSX7XG4g1cP7iOT79/DP0Z+f46ssv8PCvX1n8yz7Yy/7Mowbq3x6hFMB0mNDLc5Jlejjj4c2f8c0vX+Ola6/hlXdfR/f8ZcSzFR7NA5puTfClWwk9WAL7iNgpg6XmCuq6CHDpFZHsjdpm3mWyiR7tsjctESldFZSFV2EkGhcRW/udYOI/RcLkBZm+t5q0xNqFZZD3HwGxRp/rZIJTdXMMGLpgKbII3jGQKhRhzuK1mmRKd8PHDXIshZ4h0Wyz5Nxo6fer7zKKxEnWVmKGLAU9QMYCAKu1454ptfI71h3jfOphAZlgfV1J7uQMErssJjirRi1ubURB7m+/1aRYkr302EiXzIvTOrNSi7qJwp9eQExUdc8dm0IpOTs/wBH/hs+c7J+6zkVIdPHNBAqkqYjmUrShKOL4eVHHc2TZRaCpSm0uqPaTWmDNrqglc7mnPXbiEy2JRdNyvlHudd306FKLmGRUoKG//vBgwGGbcBhmfX+sMxN847i9V7HPcDTznrIy/e4w0nVjJ19F6P5XznHtneu4/sFHeOOtt/HkM1eR6gY7q1iiiXKmOZPK9N75rjuCYCJRlUZFUfOQWf87AL7HFjeGC9y6fxe/DRuMJy267gwz9thhQt+tM2CMgu5d+mAz7lUKiq3rFpuL+/j7h7vAgwE4O0d//oTaj4aErpnx5917uP/jT1jPqmEyziknqf5E4mJYwM9eP30J4akVpmpmIZ+k8x3MNtXynP1eRVzV3tKE0Ez0VxNOed+UTt77TK2ATAR+kH3oWSyGOgsGe2JI9fbRZ9TleYrQ1IHPV0BMulnQanFh7/ged/EuZbTpZ4k4o8TL2WzJBMzlXqcTwLKYpEBn5wsFpuiEEJD/FB2V2YAYNgOqqkiAFxeC/4wzWb4kf99sNjnPavvOAHXzdm9ifqbuhh8L3SAt4g8ZXC21UVzMU4BGOZ+pzQK3S64y/bocQfQ8JBTq6ZOhXWS4CRhZRWNSBLpGDftRWXyo0PcrYxNMZGgGHytwhlOtjCAX2GRxO6vgbaQ+VWATSoC9MFdYtyucdidMwZptwP7egNvf3sSd727g99sX6A5qjzvJdaIW77TWxDLyKdc+qQNaNjEGgozPvvoyPvzkY7z53vtYX30BoTrhSA7BwkpzFsnsyDKSfSqCvacdWUjcC5Q/UEBDz6PZzqiJucBOAIAqLmBiMd6havnR4rnohy2aMNSeGWd0TQEtyllk+gHJgA2+V9Amz4EggYm/TjaO46dMwdDleEGYFHQiMHbMzuDnJeQxZoro9Sdcz2G3MebYsZ6E27k5k0jqmWRaEMEsZ/PorCu5m/YMMkix/PshaeFPfadx6f7D9o+A4iJoTPCLY7DqfuWAgdQl0cZtGAvSMsLCa00HPm8C2lYYs9s9mUvUHLIGBZhDzBZ7BJhp89hCsJgVm0rPHWOOO+ihPFEFc5r6GDiQestrrZLhy0J+b04IPtqgwTFvBVkbftfHHDQ4CilC9VaYl4wgt8DWUWQNJmRLWaOU+bdpFcm9Vq02N+XSrCctJ+gFOCy0mCQOCEuHcdb3q6zhXsEsiSnrTsaypIg3liTzan1W2kRcLITl567t2LB1/DQ3ZkSvYJzwLwAAAP//fF1NixxFGH6rumd3ZybRaFBEPQjiSUVEBEEESTx48pCLF2+eBP+SB4/+A6+e96geFIPRLHGN7OyyO7OTnZmukvfjqXq7t9mGwASS/qiuqn4/no92DE5TftvDlnWT1HYghsopya56K4kQGSzTxPOKKFSiwvGA9Y2/lq9QI4GRgWiNw5lYwbR2clVFf6g50Iey6IZFNx7JwU/wYSuTIEYT5UrFDquOTRyFYonHo8BY0AlVz2Ykhb54IO4G8IH0sCIvYgd1R2wyxqfHb3DXdTzaUvDgce+yQnCR7EL/oHWqpF2nnTgECMq36Qo0jTla/H9ZaCMYz5V6MGbl+iBx3DnBQbHh2G0KDGmI1CgwP34+WcBbSZT9oZZX4AFue8q+nXUtslEcHEPAzYFQOPIC/SmKv6EkthC54znKH7MhjBhjFkKFSwHGH2BbklNdtO7gfwvOj3QKBuKH0IPAsQO1YgSwAhXyOKmIB/D6UP3zFJlsQkN+PHizg6tGgVKaF7RfP4ApqQtCI79ls9l6/le15KQCY97Zh8V8oGMoFVw5JKEE93xPNm+ORiSI3GU6P70o91vO60T7IDDGzbbmoKUwjXS8PqNnixndmt+lhpNj04wQaDDDxJmr+eqUvv72GwmGf/j+Ozr570+KSXuZMadyhVDQAcm6HWpJKVJdXabV8RX98uMhPX74N71z7yN6+d03afbSbeFqcpCRtluzXESq1BlPU+9dQmRB+icNZoxCsd6sexSqsWMMReARHWPdeSkqGmQMXembzj2kPKVip9UXsyzz1869ulzRfDYvLiY06IyAahadHR+KjP76uCYEuKLZrzZmU4qOP7nv0zWEgM0bmdetUnTIEpD1s5X8lqCJ1xPWYAfBy0nhTgoFZ5uKNzOskPwai+6dKQqoby+Yc98eFHB+rB3tCjhRyBH0w02oCxE+lQRqR03XVxSXOWZjKVZdzCmdTkXsi8Uy29zQnb05Pbc3p/3c0uXyik6PT2h9uhRHjYnZLAVn25ccWsFCKuv2m81dUhLAhjv/e4GaeUNvv/c+ffHgAX187zN67Y23aDZ7nrBV5wHpRag+Sdt+qUwPoAoCbWTsWzqnQEfU0R+U6XD1lA6XT+ioW9GSbTdfmNMVK9CHJM+7vlrRcr0yq0VbP7wHQczXnk32YU7eQkObxTmtjp5SXiz1ibmwHRXS23AxZbOjxaNHdHlyRgedFrgwC9G95KQ4Yg8h1QCY3r1NNJ9ooYG/f6wpJM0Hg87STpTH4QSReo5GyWIhoy2krnj++zlSKEPRbPgsqWgKwqDfpQQ6TKDYI/PNN4XEcg/ogZRsn8Nc1LUBoU4N/KvdFzmXCyCAcD+pq3EYF6skcRYR1UqP6pzo7hBJlQ1yD22kIqJa4hEk+5OiCj+2znrfHUP9ke2L4nbFCQ8XLltDO43Ef8EVALFHdSlf26fGjmRNFO1gA01bqQLaocUenuTdloknQhuhwma4gMOQ4u5SBT6bA5qklm5tJnTx74Ie//4P/fbTr/Tk54d08dcZvcjhkfWLcuOLytGK2Fnex4TMsUfskok++PQT+vyrL+nD+/fpziuvU4jTcjsylFEFmqXck7TYHG3f8G8huT/lvaRq84b3JOgXnRTV0tniY9Xc6evESFxssH509mVtxHqNLdy4OJGCbR/HrW1NrvEN8844ubwTvR4ce1DkhT+8OMI0ykcH5RRNHl80RkPWfz+2NgcB7c++CJGyralKq/E0YoyZF88rb9ViV+nocwE8t6URC40ebtgFB0WP1n2qIpJwH+ik4DMxsWGIE3ODABpeyOsUMV5h+n5Nq4V6pwnuzjcvK4oAqA4UBwiNwNBc68JHo87uUkU5eA0BblzBnaMUGu0dIzeWsePiur2vek8i1nJtFfP5wf1XDRDN/8o8F3ckE4o01IPYBRolHBQmNAZZXGCYm0rTWfYfa7RKfsNoppoj87mYZjiMIfjva85H9vfpfwAAAP//fF1NayRVFD31qroqnWRwmFFGUZe6SFDRjajoanaCG0EE1+LSHya40X/gQmRWIsgQmAijMcmQTJh0vrq76pXcr/duVbepVdJ0dXdVvY97z7nnnv83NjeNqrOpkuQkJo0mHaRllwZLOahhZrSNXJY5USR7sMBqwsY3anHtSjHLVD5sD9Uz2J1zKoALSI3RLNjSb55Kbri41w/c0SFlMllLJox7kUrBOfhU7UinlmnrAjTzh2RUxRqpadkN6dfNzq1QeQC9xzp9FpVNhPwb8vWKlo8+x/x/4SYDPWTT1fAg69brzaTcVc7x3qC8OYb8PitVoUkdC+lybt/JCKLrImrInaBZAobIJMtl8maDlW0huzSwTaNuOvqgE3exGPpmE6PMi1IQFs0mtAAIHQ94ut9VmXU69rxlgk9So8BcGh8Ss2kLFbkTmOdwSoZKbk+XO5CrHZ+9DmUBExgQ5HooGaJnMSV0u5NKEkq6Oy0xWi0TywmWHQaomEdxrwmJ2S0S8EPAwvnsMrGevHDSJhHzppR0nt55Q4GAcQLjgTQGrbqYApgxMGXv50XTrYHM8Cz7VCJZqUwFsDKnKs1ZYVRIby+NTy4v5iydKQro/V11A7CEgZD1eqtB+VKNw3aG/ZOnmD54Fe/Ud1EuCzSS/4gFoCYSG280+Pb779C2l/jphx/x7OAvlGhdGBKkpFJLY7lypReW3SSQhJZPb4CLvWP8dvQzXt99C29//AHu77yJ6StbmNF6MCFdpGj/mWfqxYZSGvzFzGKsYe9XLzgobT962Z6FY0R6XcsyMh6x0UwTc+WlRbbGpo+xZ9+t25StjH7YwBCsQa4Sm76uqd/K5ayU/Q5BBUt6qiLb+NhakiysHMvv5yt0j+hceSE0YeKNtisTSGGJSuP0+0j2tmp9qeXht11L5wAPXkN7pycNIX2/l3C1bo2vNYjqtTw5jDbq1cNJPaJUbBQqZYpVIRZN/Bmyp4RlRBNqAYC6AlWYYKOsMa0abNLfLXDz7AynpzMc7v2L33/5FbPjE2YBK2awHGgLGcdM4qnxVFQAlpofWqO7BWntAey+u4P3P/0IX3z1JXZ33sPm9h1mIrn5ndaO+RneZaJ/UGdgKn0qIL4uS5ww43+FP3COR0d/42BxiRfdHP1Wg2UaV3oWMbl9xc4c3PRK7xVX1XOyr+NZy70nGw3qGNA9n+Fobx+YXRFSj0kjNlRsPYYG0/kCZ4enuHr+gquExo0J/eElAS+/9gD11pR7FrQcU0iWJP0ZCtabLtt5slzuWk9IlCnmAe+dk9xDxAE/zApq13DLc9s41PD7Zpr22pjtt4Ta+mxY7DAGIm2vSsCx9iWgCkeS1CRNvq5RwtjWKjkcarSD+z0s7XPlwoN55TTXxUhGAE0UzGoQbt0hLawHxVf3tNylH9pki4gHaaqb7YVNvz9el71NsVThaTzlksfbDt90N8m9Yj/oX8CfEwUM6dAlDTzfM7XdjBrvbVdT9vMndjZcd7g5Psf+4wM8efQYB38+xdk/52haYIuAS52M9BPLqFWGclWyxRODSfEFxa+xx/1797Dz2Yf4/Juv8cnDh6jvbCMEiUeDjvtWWfYZbnBxc467G7X2BSluXVvT8xj9n3s5SSVEpaQOVQRz3x3bU7maVYieIsleYnJbiGq/1gdtPO3nTtJbZ8ldUIlcHMVBQWXL5kazSfINnTfr1m8DxCWHagdjNtl+B42R0Q+aPHp3sDxeM4HL67CuUQJ8DJPTcSIo4In51svrFg8bsWbntTquzcq5Vmei3sm3e+411CagXsDumJJclsxoLiKd9O38MgOBGtuvWAsmUFskApzojiw0x/eRJVJdBuuNoLNKnNQg3AGc/P00j2hQ8fbt1g+VEI8PHx/7xvEcj5lrQ5I8G5CbzxM7QbkHnFNZvh21iTZdj8oDZCyK7DCRerrOWJ7A18QODtkBxa7Nnhv1nwCA/wAAAP//fF1NbxtVFD1vZuyJ0xgCigpKULcFVqioi64qKiEW9BewZcsSiZ+C2PJfWLGlokAhTUuipCGYJHaIx/OB7td7dyamI1VKk3jszPu695x7z4l/zToW5YYoxYDRMXEJvzHF3u9OEqjoB+16O2wDtYa/HvvDEGE6fLqmjmJNmXphWwLRxHtn0iuX5T2hCUZT1GpqqNbPkzBoCasdUK0wgSTmJUhUGjhjOtPBmZA2Bhv053mZx1KboGqghfad0wZRhjJOKmbdo+9/03NZyGwBduLraSig9dDbGEmfpolADSzlKFGvUw+cIH2jaP3HWg6o46ITVco04T2TZpUSw4Xpn8UQeKAAe3M6YWZ/1azigVu7hNcqRWyerVMtNkFIQ0j9orQNxd83Iny1lCLJYZoYtoJBFWFQMhVpNJE6rEl+zEPTz+GoWaGiXrYmyA+Yxot8QVm5u9iIquCt65Py89AsJK0KI7lOpI2HBKGEje8jstPptPecuO0GTSy1jJoHbQICrHeaBAJz1fjotFrAvs6j93IbKzVCWHEgYePo/8U9Q+2quPyoLLEgz+dRESsCPKDHqscUXHR53IzjXsMsQebYP31e5nRAJY5kgbU1wvVqhf3ZGbZnJ9h7Zxs8jC1QcptFYOVxFiMtAsqdLXz1zde4fXsP33/3LQ4PfkGOStMMaLATuJc58pzK4tFHmxRSfRAW1IvW4PfTpzh+doD3PrqLO/c+wM7dOyh3plziuwzCpHQhcR1cl6BBCmVLwjI1XKrPJV2dP+FvqvrDHeTy/a4XIA97ZVfVKq4zb9c6vOx7Q1VaHqPaGAjv358+g1lviuZIkTRSctff55gLXke1tvm4j7LucxljEvuJXf+/PqIbqL+ts+Fh3am6t7cxCqpWHvcG7u82kbGCAU1TXBZBxbr3DIb3L7IiAiEcCNUpabLXZeosYkrQCRRPKr3DYG39RWcVsbYNzysa3RFPOG0No/lfZ7g1nmCMAi1ps2Rj4KrF9dkllssWfxyd4NX+IV7+9gJ//voCf+0vUFTAhIv2al6DHqAyVp7egr5ugjByXCacAddkw/X2Nh5/+giffP4Z7j98gJ13d1l9eRQmqPL0zKpVx2sSmvQPi55MXJCe5hUyLBBwhBWeYIYfzk/w02KGo+UFq/tzC11ToZiMcD4/FxusAMwvLjk47xi0FdE6zpfN65/mKidYHQfDGZ378woX1Pf/z5xL+MtJSaWIGJGGxOWlVEscnWF+cMxAybr2Qru8+CH9gbfe2kZOZelBwE8uqe+SEPJyKToUdu687srVeivT+KhTmypaM17U1iy6ioFFbqYkSa7BpQ8wuyadcyacaeeDvZYdLpA7ETurzJPEhvvamyqeVcZimUhVUCSG1fj1NZbospc5icte/atrOWkCWPtfq/fwyRbdl4QQxVWp5gQQLtk30d//69P3Y0n7hCdMaA+SpKbRRKHrCepCkypvu+z/b8JiWLPXmTAdBe7C6K0iy+lFAtdd3PITfSxoLRbImxabbYE3SabvssJi9jde/vwch0+e49mPT3F93GDSApuVdGRS5TXL2bi3EOvWFqlWRkTHSPdmd3cPDx49xOMvv8D7H9/DxtYbDDg2klXrDQTgoyd43F7h9OIUH27sYawwftYloKCN4Iudk6+7UksvgexRNJbnQYoNpWIy79uldgJImTaW2Z160MviOSaERmk/rgcK80EREtOeECJTzx4DEZQcNXtBex0BKbXOraBWmvDJq9kHO/E8rgpx52Ccl4W5imWxBYWrWbO+AK+PG2F5iw6V/R4n6Qpq2PvSerbKVSMjGwbQJbYw/S6rFmTrQmWtY26ocZtZuTe69/EzVgtIATiFofJWgq0jsOq6XwFocYF3FjMhDMl3iriGTIQ9nbFCAhD552MDc8ii+5slMbc9ayW6BxyHsbC0YAtpJwKAVLkon4FyDskDRCstApoqNsnaUVrla2Ns+QCPm8Z2tl+LjkSDMbkDuf3M7OYlhkgxH+VhFpczWNB1+A8AAP//bF1NbxxFEH3T07PrdeyYgzEBBNgSHxfkU5CQuIUD5IAQEly4IvFvEEf+ExIiCKHgQyA2xDEEx1/s98w0qup63e01e4rzsZnpma6uelXvPc+i/toLpYl5m15wedCCbHWutQSpS4UwrRpKVJkdUUnwJtOJdl2Wy2XqSkauB/nZWeCAHyZQuhGVR9HGsVoTNOACUcgpJ6M2xtnQQiEnxjyQlONjPM4SsFA+mmxUP9QHSIV9KaJbW7TSv94Vquy+ziABReniSJJLEw18kfhQGs8R1zgelRGzNgER8vNkLori1uFN9yPACEzcIit+wjpmvGe9BsSO9Xze6vvT9xnh7E2MRZ9dIWLC7rgULgRQQl+K0eUgkm0xmhtjRg1H65GDUdmlTzxYFt6F/VgKWiFb80RRji4hurEIzy89rYf4kTWTDptsLo7P6aY2oT2q01OcK9j0SlUkLGUSrkBEH9dTXDHk31OoI4FDK50WCowtlVfY3UjCFsZNHpiHvDMEtvyoOJ+LNIZQ96k4kX3ZDEdR3Z+Bo7YDhVMLFjBpWxYMuGNwL3mUauNGq6GCYhEFBu26klaAS12QZB3qoqAf9zpsbE2T0km0Yum6POKtgNUyduhUs0JVV5cR+ADHBC2w20klB8UyxMKgVsBDOrULHE8vUD89wo67hf2tO3hV9sWi0+6HjlvRwGzNwe+s48uvv8Le3lv47ptv8fDnHzCbnyJAwAoo2FL3jEcFQUpjoX1NBQxCBBkWh1McnTzA2U+PsfPO69i9u4/13R34FzdR327QNl3qSHpNdheqxC4CddrBrcgfrDOHzNZWkpX4rPoEzpQHIEE7PZBWEgNN0AtAobTIoe0gUy0Kb0kHPFBg0EYqBbRcFXZN3cHBIO15dsfKmJuADpIMaQAAIABJREFUvSqCxSy88wRCASDZnnZVpq9w+oBdQ3YXWEj0Iatjc0LMmx2Q8hjlgaaOckgWhCM/ytZHfSyctGCyLhGnjuSx6SRToZuS1vBax7FL7hv8Tk1uGIsKK0AqF8tnJoWfgQEldSBNWJjVa2WgQd8GtTKkxoYUvSIatpjNMaiGCBJPtNPvMT0fI8wcFn2H8WSO2eUU4+dXeHp0jMvTczz5/Rh/n4zRC71W7C8DsFEZHz/wlY/2puwo0lFFvOrnci53UI69QlHOY/+D93Hv/kf48JP72Hv7TdwabnAFzD2gym4bpj+hfE97NY1mrOdUV/VY1jWeI+AQnXb8f5md4derZ/hzeoGJD3BbI6iSRLs0YzKH9c11LczlfxlJor2YRUGzvlOajrrLyPrJM5p22NzciBoMwzWEyRzzk1P8c/AYuBhjaE4Jcm//nl3g5Y0tNFdztEfPMD08Qd1mNejVKUObQYThkdh+aRsv3NlW29K2MovNkG240h4K8VwXIKDvKgWRKNCaQC3RTmmz1zyTT7kvV9hNUgCUyva1TYqxwyyXIAW+r/P3JJ69AloOgzRO3yaQgYBBF/obgFg5SVZOEHF/s8mgHVs907OwrVoeFvQ2fueCrgdCG1gZhy1jjeyXyXic6Ayi/aDfY9RUiqGWcbL8NUf+mZPwvO6skFMdobZLf9Zb1w8GnhIERVGUeJsIrVaKL+Yq7Bjy3zQuUjoJApifWuErHul4TRXnYoJS76DNnm7aY7Meabffnc9x+scJfvvxAI8eHODyyTnCGJDj6LbRehwjow0zcArHpeKkFCiNomOv7L6Be59/io+/+AzvvndX95zoC0TettfcVCaH2qbCGAHHuML3fz2C65d4DdvYDpHI1wmvX2wmJe6q7k6w4q1XVyBYgS48ail0roEnqQGXc764h+J1S5GaxKq9L97J3uK91/eQU5/OpgBUmLt4Hqr8b/UEbdtKbR5XNK1iPdRZ48TE/3yTmjDMD2MelG2bYWez2noahaD2sXkqdCD5mUB42+bOt9zLmk2W8r3guH08Z4xe0FTXGqClqHpZz5CKzPqL1DsYCMHfX5jgbnQMCrrOjkBA0UyNa1BHkNK49BT+bnydpu1WqdG8Rn3nZe1agpF1UvRPMa9t09kY92QcpdeGT7J3DNfuu5wmEAqL5MQKeKiDkYnzGRDKZ0Ih4Bg3JQ5GW0AR16PobjmxxY58Lc1ktYOOMYEOafzQ6UBrk/+hxMv1lM9O/f4tLsZ1iHUk/z5ribRGhZYZm7+Md97X+I+vq+mNowiib7pndtaxHTtByFIOSChIcIkEKIC4ICEhBIgTuSF+F+LET+AH5MgPgAQhIVDsWCQQYkK8tmOvZ3a6B1V1VU/N2DAny971fkx3V9WrV++V9MJLtreo8k3gg0cK1CBUKn6TJsHTA4y70xDlcrarcTlZCvKFBUM9YI9SVd0kxE9tmorhdyS4pIjMlXqWBQtgKO0WxZmiqrpQU1BEtknS4l/9PCFBSjuwdDMpyJFomjodeC8UNenq5w2rFDFJZovgWMBClXn5+RIAeba+HLrr3sy16hy6BhpVraT3oegYJokyTNBLM76J8jim7QhlB15m54dOc+7K8Yz2uKCwz9fLqnpqIQlJVtqmHXUCu6Yz7zGM2jp54xna7ojuE4fRgvyc6UxPHguJ4pMfRu91qqTMnY+qGq0RptW4ntc0qTpzt0U6fNNkxnZVde2HEAzQYuZ3eyMAU6RZ0pTEpDVelv7CQaf0ylz0TQ4rSy0tRV9CdRroMFi2bbYy4iJL3An00HLSlcjepfF8tIZW4ikfRT3KjpDkwp6tINNBRCJltpDk7z663N2g9cBiY0Z5VTsv6cCvRgGTQZyoGhV+tBaHyXzjAJ7G3qQTGVm0hmjNL/wK++cL3F88xdbWFuZYx7XKcyCY9QqKJHFBGsspNgq8//kHWN/YwLfffI27d79jgZtVaMReLGKAAAZXNP5bn+iL5JtessdCAJZAs7fA3pMFHv60i+tvvIqbt29h5/UbmG/PUW/MEcuARjQvyJZsxnPlwxR0ARVBcyymR2fPqmll/YTR/terC2kOOAhFdza7qEOhlypP60gWTGEdJBlSdFj3OdHmp4W/vUdjT2BBwsPlc7FTlf7LunBRvb+lm0A/E9hmZ+c1joAFyPwQC6TopjhF67X2Q9KiADXM+cfBWhwB1J40eYOH3Omzn1X3Qm/msuksScXVMsXJZhhhSvuyzN7PGfCUjomOyk0fby8FKJE7QCnB0XjZtQ26cwdP3XQqjE5W6E7P0TUrrA7P8eLZGZqjBs8O/sbx4TEe7T3G4qBhui8V/nR61SgwJzCpTzaE/j86jUrN56KORHJlLp8KkO2dHXz46ce489WXuPXO2yjXalS+TmMIshwURLhssEHXPu2H4AseZziBx1ME7GKJH+Mh7h0d4OeTf3BMIGgNfo1ORLi89s3I3lN0npxQ+y3VuF0uU0cFBbOZeJ1TvKXZ4LaDOzzD4sEj9EenLATIKudFj+XZCbbXNlG1AVic4Wj3MZq/nmOtu/y7spdDat689PJ11Fev4JRiPS/ZKM4bUUa7IrMMogDpsU0ClNnKa+J4pGuYnGWsu4cFIjS5TiBwlQGwvNcqP05CiyLvs5mAT3TGEOikit5BzvZUDMesj5OL8LLKFsOsETEBDyvRN2CPa9MZz5amplDQTzIttCxIpiCDChMqg45muXnfCaCtiurZz1zcnf7vUjDPiZbC9KL/0VfSnZSzVfMjpZtr86qfMNyS2NtQuOX8VcCOKJaEpcy10+PIxUQ1eUiorj1boq7m2PQ1Zr1HWLToni9wuP8E+z/8iof3HgCLFuEIWGf9mUKAqXhhJ/ZDKMq2uxXlEl0C+DY2r+LN2+/isztf4L1PPsK1V25gxXvaJa2pPo3/EROoKwseA/oDK3z/+y+4/+dveOvma9zedcJOYuZNK4ruBftmJ6q5vC0nDKBCnJqAIW/UoojWn4ousoe6gFra8IlhyOPyWeMGpkkpI2A2z2YWrUt5LOVY6vmu95iYk9xEktd2/uK6cEYEMkSjhcZg8fixGjd1r85NR7eQpgik4alnvxMWQewHRqg2ZBVscJewUwoZrUnxpxv0EEz+z2vUIf+/dEnsJVBivc6AljfAIefFyYs8fS5pZFaVOgO4DI50YrU9vWwuzzWbNERzU64Lo5EBHb3NfxdtIWJ4pByyZwBNc/CqGmv2pJpDdLDymLucP5xLp+aXAnsZHNCmnbHcpovOML33af/bMXXJv4TWT/c715WU361SPKA1puCDZbDTxQ0aGSnkuoSB4MR01tfVnCExFiwDJFnFM8uF1nTo8C8AAAD//4xdy24bVRj+5szYsaOURhA1pAEKQiwQVYUQLwAboDsuz8GGR+IFumLFkg0LLhLdVUVNlCpSUstxasee8Zwz6L+dc8Y1gpGqqq3T8VzO+W/fpaILos3dNt/NCQcXy1myWGaBxvwo7YWTLnXowT2RbdjG3bYXkwNEkTrIIqrie5BPvkk+wVvyBZZPcOJ3dkUsUCIMXl0Attk0GI3AOP8iENPFiZjXxLBnn6cvoBUsZtsm/I/U0ChV4M2uzV5Cl4vebBSEdVNrwSVB0mvDpNsQkek9J5eEayoWulrFYp16QAZBoiJC7qGNW/qF3DbKaew6W8gwxfrM2SDEbtT/IHVl3z+KL0ZEQPr3JDpS9v7Mn1P+IKFLhqPt3qJ2DpoMDXShWkJvzZBKE5z8sISBIYhVheVqGfUFkGk05EqbDJMlvn5RvnJ+4WamwnazkZMLLtp1buo45EdE3pCSebvgpITfW5eEzlgUZiDc7PFYChkOWCoaZR3JfD1bQ89lz8UVQf2VPSMv+DkpKsBE2hhEomvOdBos+Npm7dVSRag8/YDBgQplj9fdu3+xeJDfOZlXNzC27XKioL8sPS6ba9zGAuXlCXDnGO9XuzjsdhjeSMU6v+5DoNjR5kIFPPjiE3x/5weMD8b46dEjLGcvUKHBoBBZZW9FueZGGioRSGioEOpPqa0CgjYWy4D2fInJ9Aku//gbt4/ewL0P38M9Egs82set433Uo4BV1WJFavdl0cM7irVPyWvBt9KUEZ2JLu45+WHT6i70rTf/7f3puiScQ58x7qKPkLI1d7Jp4mAwPku2txXuybKwiJOL/PAbXvpF7vTCsaDPXbaEw/ZMulwK2sThloAaRCkYTrVn1qq1oDZClQU5cbHARlc9XoPfXrjZ2rCGwH8dXqd+zhURamoJlE0qxVKtig2WvAgYKPLHvt9mdWz2bkY5Yl2WtbgWULFO02ssG3Q3DerJHIvnU8zOXuDmYobFxUusr1pcTxeYTq+wWMqaYZ1KgrYPiSJWCASYmnTULrYGpN22/Pt04ljThBYNBOV3+/AAHzz4CF998zU+f/gljo7vYuRGiLPFrMGVof+5qIY2EJxCAng5ESUMAOFxnqHGb1jg19U5Hk/OMStb1APuuvP9psLdD1RXwwWB9be5DWGig8TzUrz3DDHg5zOvxf51h+Ltao3l+QVWJ2eUaWF3dAsYCgWCvu7YVagWNcLVHJOnJxjMlzFm2f60aQHIGiSk3j2ocPftt7C7/xrmw459/YXc0D9C5qFNt5D49PyeR4Rg/3qMY85rZ52K+34z39ByLqqEky2axI3U8LY9oP//D9HVdWzIWU5odpd7e7sRHdCqo4wvRSw6h7p2GcWvyPisFKc41+FhhDQbcqpdmemOYGv8VAswsrdUnSFrWsigB5E+WaojTdPcxPyj3AI2z3MNQxVxzNvyWW4ARrtDiXu2B1rBUKCIeWLO1+ZfWrwahNuEEWEUzbZNA7OsucHTWjIB8gPshQp+MsfsdIKzP5/g9K+nmD6fobkGqI6lqLDrXETCBXWk2Pbeui79nbgxBG5EH7xDkP/P8PDb73D/40+xf/gmr+HGdPQ7WSc1P3/Hxf8zLPBLfYoff/8Zr4/GuB/eZUSR0CIC74cv5zP4RhAAFGg7PW+ptDvJseVZ2nTbDm4mDUotsj0KG1KGNmvuuJibRKejDOI9VgtHekeo0N5xqTnGjQIq0EpBf7BrlU6EmW7J1JpEXw2ZfautQRb+jdDxPmLZnmtc80HiH7slabFNFp3m6GFrDwbz9iEiCmIurehslw1UxNUsR1AkbZBX3n1CzZaJruk3PsgICdIY0EZfpxSMTif+Oc1BfimiXJHb1OxkpyzVz+nF4cp0pcqek05q/Am8n5sd2bWI16T8rA2+Ykx1/Riea4zxuaT2FvqJFv9x7dM1aeHPNNiQivt4L/k+yb2V4lwc8WwPIxHaqAenKGZGf+uebPoIcj7ONrfq1cm5LNdKehRDoknR/hxFlsX1he+b6mTEn+8J+gMhdPgHAAD//3RdS08kVRT+qm71a0AzExdCzBjUOInxsVG3btRI4s74V1wb/4puTfwNrtwYNS4UJzgGdZBAgEagm+q6VWXO695T0LKaIaG7uuvWved853tUlb6An44YzZInujrlF+rmcIIjLrN9mv4TE2CwWTs3VU9TtsUuehOgGBXDB4M/nCyo6dio2dJ8GCBh0ShwaCB0Q+6KrAElCpvdGHYy14LZTyftAbJC2OgbRmmVArQdGHgIxT9Pbq3Zifr3tOCZHq9uvIyeK9LdaBQd35A+59dWVaaJFolGpHnVfS7afYNmExladHSthv7IIV+za3Fh0RVpY8iLPK6ZLN7eZGHosCJc9jvWzRfBoWujO7rFfu2859bCTtMBbUbd+re8YKgXA9/vKBOTe7N7Eh/kFnZUt05o8Zfz05XaV4XktmmsEJMA2HdvFGTWMLFRY25QOk03sEkJeU/4yX95O3fZJAyp6bqrA5R4FykiuGDozbhx+D0x4KKvz8wazpnP9Cev1YbRhVZ1ijuz96PfX11dJ+p0MN22c3u3zzIyoEPp0ZXbJ2yqxMyAdoVIhmNhwuvMaM50f+g+LTRqsVJJgQBikZHaoBMylDkzvOuzY7xnQXRFnsYT9FJTJuzmCN0o4LJrsbeYY0l048OIuPUS08Hph3yJ+VuJnKLHbs7jMEIXV3j5ndfw2RefY+vhi/j6y69w9OfvTFgekxaXXKx1GpIJ812aohQuo4CMzSjNgKIF46JhGub52V+4OTjC/nc/YfPhc9h+fQcPdp7Hg51tTGYlpvdniGUnVMcCHNNEvhxRwVAClSjGiN+ny0Jpa9CMqt/rniSRqP/fuJrki2Va9v0VAgrQ82wUNYqLpOkK79Eo70zQU6NuUwU1zfFgLJzpUa9OxHYNNqHwOfO9yrcYmApB9aAGAMo11E2NMcYDsCgxVfph8dU7U0Qulto+5yEz8KTmpW6qwAf9YqnNVsOopG+m1h3NnBagDcfNYjlo8KOj/+XiTel65D4RxRXdzAOZ4kzXq4VA4ZylybCQXjneREwpf5kaj3mNi8NTXB+e4vjxU9wczjH/+wTL02usLnpUlOMtASfYIEle02GqHhrUaVeQ2EvyCAiZnK9wL1ImH5v+FSXqLrKmN0zG2Hn0CB/sfoT3P97FGzz1n6EsRuzrgVUtRo46pUgyDGv29WEqrdEg/wAAcwAnAB7jDD8ujvHt+RGeVi0uxw26IAXbZGTnY0wie4MZuMF3jU1iven/mVmDgr0xYt/w+9L5TuDH4ugY178dAOcLPDPbQDmp0BII1rd4draBUd1gulji6skBML/AjMGL9o6JZ9b9i3CJjdpnwOb2fUQqO4gpGMTosksRzOJ83URrKIQS31mcbuPcvR1Dy0DbTiV3tu6C28Nz05xN/brke1Gl9bXSFBmrP0QW2Sa2ijFzrH7ptOA3UFKeKaT3Eg+NoWbXmEXMVLslI6PzwwZFXmN757x0n80zHkwixYy/lLSRC1/2dHK64XU/Axpul6fNFt3Fz63JYzjuq2Hgid+/M+8QOX9J2lBYqoDbknsH5rJPB8V/NXVq6jtlUVbjwM964KSPChMCN/sJe3nQ5LxY9Vid1tjf28MfP/yCs/1/sDrqWcqzQR44DPSN5OxqRS5QAGvN92ziP2z+gWUBvPXu29j99BO8t/shXnjlVZYdSkFY5v1Cz+U4KvEvgCeo8XN7hm/2vsevlyd4c7KVDWZ5kEAMl4YjSoUOX2qigqPFO+8MAsJaVwfYxDtHETtWF2SgMhtRc69Mi0H6TY4ub9x0PYRJ+retL2vwbd15Y8deDQO9Ea09P6mm9lHUFvmrZ2mSijCLKZt6G7Oajj6OEQ5iYEdSHVvvXK8pQJEMxLs29RgCIMT0rNtgRxjKsr4snSB7mYlBucl1Y5ItZ928TaOTI76mSvEZZh4d+jxWnAggQyRzqS/ttaPk0ZPfWqr7b8UfGzvKwEvx1JCG2aj8q9qbvotEyBLS+KwPw2SAdYMR+r5JckWglE9JET8IWRNUFwm44Dzh3P23uimZ9jnDUx+7Tpdi+xvX51wfyPXa3mA9C/eg2pfIGhegxUBbrsmpfqZzIsh9nU0r7nGzjMHM0ek9s9dM0ywRQoX/AAAA//9sXcmOHEUQjdprFmy8sMhgGS4sQgJs7oiDQZgDfAg3jvwMEuLANyAOICFx4IgAISS84DE2hpE9M91T1VWVid6LiKyakduHmUNr3F2ZGRnx4r0X3IGkpjOBqVOHiEgsaEaFd7tVu+X0L0+Yxml2vc8NIPBuMoICkhaaoeEBhZ5oPYqIVa86LWxsp75oYjlTiD1584dDeoYZNXihTYQJgIUVHKDvu9EEaN5LhMmpFu5FQNQQ72GiLdwEw6jGLqDtQKfrun131Z0XQzcJDigeaNnUpLRt7WynLjECWmnSB7r9JxqG9xFntIaz+IMGo8kRaxwWYLabeQOXliCzK0TTvzjTpP2iXxRyWIPBzDiYqFIHq9ICJAzZCTr3aUrYbATph55+BoYAkkq8oCoNw3JERvbEMYzRRsB4QdC0cFjW2Zac/3kKsSNJMFNTRGRrDAB0ezVZQhhPaWcXtPw4SV3WJ/bPUnKQEGBS3LTbsGVI82QAUw3KkK8RQCSjMqNwaWvtaGsCo981s5LQgY80AWEBdIaFiSH2uqP/Dq7MJoDoFJmfhenZSgswYgE7bDoWEuOwSQUDilpFmCuu/7pfp4491wlJGczs8HxypXy7PMEDfWeyoH51bIEkl9pHU3G2cXHKb0EDrbsSB2OXtFVLWnSdq3usAJyLIZn/FGWU7uBI1kUlLZ4Duh6ZcORWmgrMjHriD8hFsRdgPtZvMomjUg9RsK7Wg/RxlG7sZD3ksn6wJ/FSLa+XW3IBBlw44ybHR/GPT1uSEhbl3AsX5dPPP5M3rr0lX3/xpfzwzbcy9GtaGOEKaMoq0cLEjJfmjqZprdxpFbQ3u2daXFzrSYbuSB7/eyD7v96SqSnl/HMX5NzlZ+Wlq6/SNHD34tNS77YybUXJMMs9VxdYxBN2ODV71VhbZHK4PlR50oJBw6IRp8tZAtiX4eS5buutBPphpBokR+ygk1IIQDBwb0ecRxTUhdJPAUFMg1PdcqIonFJR56ofzpVGP8XRwE0tZj1RginmcmJBVthMfAM3ByY6JetNjOLEqzIzHVKTLWuFn8xk01Yoe1karFqs9iQW7CDcJ0v/GcR4cc145DB9NWnEs7URgJXoe4usSJ+RxdOS2WYFbJnNxp2eWKUC30zOouSpY8PuRqGEdeyhvG5kM02yW2sMDAYEIV0vS5WhsRMI3SWRq1GaUErxqJP9vx9Lt3ckd3++JccP92X/z3uSrXqa+NUbkYYzwdXSEvfcFCFZ0SkUJTvyUSqdrmxLo4w0drwNDhh5j5ZyPPV0tERa8czLV+Tdjz6Q6x/ekHfeviqXXrzsUcCSdOhOG0vhN1r347NHBRrZ+MaeReIDb4sslyMr/H+RQX4c7spvjx/Kg7yXvbiSDR3Do1RWWI2g+bMgixI67cqgWAIjYr3qdP1tmQjew38lNzYFin8UvGZWxvWAOeJ6JYe374v880jaEaNbKym2Gzno9H4P616ybpDNzb9kuHlHdhAzAYUsuiw+iz35PiBu5NoVPfv8GYnnG+mqkeagHjpzA7d0sl/kdxjDQO8adDKxNSHnUC30lDpwnGhjEr6w0MD77/AOYrHd9XMRkOfJ38jfDyZA226faNYo1b+0EX8hsRHdv0JknujDWBHHxAryO5hnDMWFo6amR0XC2+P/p39ORV14mDaUO8iyuE/3vwL+LLoMgJ/vMhutGucCT42bY5o2458/veJJRgHOxcApJtUTR6Smbpw5/pPI7KBTxOhX/9s5p2uIU+Ezn8090MMBsrTV0Up2dp4yDbCNXstVNokRfeiE407aqdQQtg2VtDHjlJy8C5IfDzId9nJ4/z+598dteXBrT+79fkfQbsfxhB/NbjAHf8Q/5kLqvJHbuQwy79GCcp9CBhRLMhDYo2XRpOy4K69clvfe/0Su3/hYXrv2pjRndiWncbQYBW+O6fi+Y8bTLrdF5Lv4SL766Xu5e7An1dldxrnKnMcRhQhMHnbSH631T5jnB+JwXIAUmdUd1XZLyU80OQByPG3SOQM0zE0bdruNjs07aEyfk0UUxwNF/enh3M7DbISsNQzyir5XQBj3MkebRwUZsHeiNTn4L5vN0/G53DOMPMJMDQszozvplKqNzcTXOqd0xrADSgTflbEEH5emXDBmgzWEbP9RXrcJC4hEX0sZcWaeBLlJAMl0NXmaP0OAWW3bUHbX1g29wYCzRtPgiznVE8CIJRkseE/PEeIV1zYZeiZQZJLtbZ1itpwcIMnzZTQWUbDvokw/vftPMnzdDFwM8AB7fX18bM3Xkc/QmRTOsshDstEwWUhIk4BY+HEdA/Ni1py2KQoAzcbScJDUPeg83yBDKHepr7I1OUWA97yC+XoG9eXsKY3D8JMAO1eblsivpzFLMmoaiKOZZDJ8yieWsclY6177IDd0Jn96XpTnaLef95E1B2NWSFPV8j8AAAD//3RdO28cVRg981jv+gV2FjuEYIkUUKWhjCAUvBoKBBIU/DYaeijpKBEFEnUiochKZJM4NvFrd2d3duZe9L3ufDsxWzkpZmdn7r3f45zvnNJTNC3AEP3TBA3ywWrHpFCEok1KxyUHI6LpeJ9pe/DGJDBBJnpAZiPhkVJboDY/Ri+iNJ9YSvjrZSqMSJHSmg5E+fSoEy/OGLp5e5QJIbcu2IrljAsG1inzMyc3zalGN9JQOGXXTvnS9AW6znWfutsvthMVW9FYevaWEOaONts4KgkLwTmfW68aa+8GyUpLElArlkNPUfP/PqYoDKW7htCJ13DHMXa0Hd8gMVpLwKpzgEfTmIpF3UFN8jkxuWHmf+XfymYwKrlsHlr4TTdjbBTjNq6IpkAZDHbdTFXu/dqJTUjPlwOCbeJgHT/xDGe0VZXt7ZqFUoUMtfCdQP+7aY0b6yZZgDkFcHpfJGRkhZQVAYaqm5cyH9zUACmKZC8o36UzZYS0RGmkEeJls9gkyGejBNFpctherKoZN+waR9OUgNUmRMPWGM2U5trZtcPV3pPQqlyTIM+Tv7Eczloo0b3kVEyWGK5v4JIKiUxgfrOKN9SlUKs+agjMqwbVZAFQsk7rEg1GO1uYFxs4rgiFvEZ2cojJ3ju4v7aDuxmwXQIDrndbneuEJEasglzg86+/xL33P8BPB/fw68+/YHH2HDHM0EbSGlCRnx7VV5gAhoVACyi9X0U8KSlba8ljGJhdLXF5+gKTJ6c4/OsxNwD2D+5g9+5tbL59Czvv7qHcGmJrVCKbLVWtKUiAqAMWscZIA0m2VsJSUNFOETtOaKInDanuZvn8UOsj+vlzRTg4cKFl1kNUOTV9a+l8SYWtBh6hkQVmH9SLTszS0MRlnw3kWDLLRi1CCylwClfI22yg0GdXPyGKYI/N1xIjgGIV25Q2bRLsy1OXvE2zzeZBDJuTc931GDohtuCSsO5sCL0iR10VYie8ynO/YqmqAAAgAElEQVSCDv2hQj/PjUHTIZF25ZZXsiCh1JQJioZw2UKFBN3TbIHBsMBmPsKwLjF9OUF1PsXJ8RnOD0/x798vcf3POcp5C1wvMKS6mpw4mH5aYKEzvwVdi739Fd3S3J0K4jLhbjExvVqzE4s55pSoIsf2eBcPP3qAr777Bg+++Ay74zG2ypFbJ+pvrOhgRBdegxaL3MgpkOapL5Az6v8UCzzGBL9fHeHR7BJHyylqmvPfHnIS3I8LRh8tdMyAfaiz+Boan+JBLjoaFVs/lnJ+tEtsDTcRzies6F8fn2E9ZJwYtbmMlxADhBpRZb1AcTVF9eQZ8tNXKKmpBIlf/jtzdHs/NTnXgPF7+xjd3sFFLo2fTHdtOicsuW9VGJiK2N75aR/PluzvLWooUzyyot+0lyhmpJnVILmLiZ9ZDOOGUy1itSyGqgW0JbtGr13ZF06Ayu8Ni2lZsVpws/aRsoL472z1vfZR/vS+bcwhqa0H1j0RCm/HbkugkXMK6bRsMkXRogqniu3zQFmw/fEHzsM05c51OieLVpwa5VbWgLBAZd2PWLgNWPAYFSGVa5hdTJiNWV9NpRohyi41sCmXbTOsU4LfllxAtdWSm11h3rJ+R31d4eTpc7w6OuGCf3E+wexsJo2+hTbzcmEH9keubNDGr0+487xJMrvyqSLwxlsDfPzpJ/j2+x9w/8OHGN85wIDOV0iDn6+hLDN6Hq0W/7SPXwD4oz7Bj3/+hmfzM/L4xf7eLby5MZbnT+3GnE2zsazmmF5dd/fG6uXSdApZ1PnnwF9FxX/gfLHVnMOJLOtv5D0RYnLEst/fB5WMNeP3kK2fKgEtMoPdqJ0eF4zLm2uBtF64iS5fbI2ym74DTkPMkF7Ws2rahOwb8OkZKY3TnhLQSMSD2ZUivu737sc5GXWm2Bg6aj3NnFNzwYT1hOUjuSn9n7CEYmf5rXo7mcZVO1vpXLBrRCeKyWeM6jaYfoh9rJD3ziMdrT6kZoyn5NPfplfHbAXdx8ZG6Nx68uRG5PN7D1Kyjgbl69SyJpFuHpsVm/GV96vsHT/XP5tVLLwraLqwtOhebO+ZCHfHYFLtA7YvpOcgumx0VtsoA4PRFKupsaKxQRwdZETK7r0vYGoMAxvF7p+bNjZhrEury0jkv65r/MfYtfQ2TkXhz9dO0rhNph2B2CA0qBo6gg0LNuxmgRBCguGnsGPJH2HPij+AWLBnJDZoWIwE6rSo00dapk7Txo9rdF7X186MhFet1KSJ7Xt9zne+RxZrllwicSw8lVenx+EI1xobmmzTIqEcf9OHcdMUIckct5HJDcAPj4nRNEaBehNcNdOOrmbUN0Ze1mvk+XbPLC9VJJuQcimqRNNtVJmOwtNRWro4hL7JRO9E6WE0E6bRl1FknVJ3DF2SBTDUd3fGC1TwGG1Omuc2mGb838O+S0ejc4zSshNn6lWHnQTtmFGIwmsSrw9CmQK5UMDbg3Lzg3Tnqom0ThUjelbgB1RRX2MmH+E9bOMaGIKNInoKGx/VZSQ5yTYWYGM5rr5vwgjVVJmmdqJmIPGRsclaBwCIec4oXKsmygOFUX5iyYkW/r3P03g141NTmKZhUxhEFMTwEYeZscFwrA6uqqb/q1UiQps5U7GnW8JEiLSZ1nhZoSLU4SSKd/Q9jRN91vFk3JmwZUYH6js3h2bdaxLGSGInqTCakDGmSibMIA5RARFiQX1nfonQ/EgOkFdwijY4Ni/SzdmYFo4ngbKn5Ds7XGiYntMNrimtH5lSA8vlCsV1iXou03jXCNpKrvvL2uOobbAs7/Cq8LjbI6nYLt4DMKfQAS9xfAlGXXmk09cHHz7At99/h4ePDvDzjz/h2dPfUFVL1M1KPSl0fWmDba4asa1Sk3QmRjG10qkcgXetO2Bct1gvFjh6vsDx6E+M7+WYvbXHDIHZO/cxe/c+0t0c87d3MZ5PmT3gGCAdI/UTtGv9z3R+SXpRlyHZQ9aPZC4HQJN+UyMF2p9EzqLmj7Tvxs0MnZ/XaAXt/hE9b8IPZQY/6Rmg+5s9aGM2ix2tOo3z9KTpCn55yKa9PY8lGPDqV5JoSgVNIu/UzX/CUzb7XGLaKmaP/JXNzFaLJwMPmLY33VLPBReiaS2izAqZVqdcLAtKuvXs1DBwvSpDUWbGOipf1W1qsH8oq8XrlH/Me7eCsZkTyR01nKQVLFvM0hzjVcsa/+J0gX/+OMTi75e4/OuMJSY3V9fSCHAqhQO5vohGUu9HnnKxVR8746eRnMWZRp0bd52qUGGukX4NNTdJiq38Hg4++Riff/UlPn38GPuPPsB8a8aT+JjbrNBf0PeLOdiYG17BwRoBTXRSuGCqP/AMS/xeneD58hJHxQIFsXsy1gsxhVyKtTRExsoEx7xYFBhvbNISN8Ve2rdUDNPITbrmprRld2nH5yxBtSpxc3iO9uwaCe27kwy1S3T/GfG1cMtb1KcLrA9fIv+3II5IcPlHNP0Pa0fPbcZ7oWio2+koUK3fVALIc2EtAwAtauMjiyimAhxtxlEiajZ60jaXqudRv2m3g8FBv1nvsReOeoK87n+F60/SNAbFuylfs2E0J87WgKQYiWlWGop61rO2cm5DAR0B1MNj07R3kHbiNgv6APB7hTp9J0WIawxaO63SvIRV4iJLEbn6nJ7ExpM0jU1Q3VbEsRQmAE3dKjAzgKa/8yxHVd5pBF2DcZNiXI/Q3KzRVg2amxKrywJXZxd4dXaJy9MFTo5PcH1VYL2sWcuf1EKLoLVMszmaeAoYrf48b7w6/UNg4RaOjSGF5Tfdcdj/6CE+e/I1vnjyDd7fP8B2NuNnTaUGb3U7uNedI/9bFGhxDI9fcY4fnv6CF8U5sLeF6WyKPM0wTSeBLcGs27LETXGFi4sL8dkxxuQGY1QkNiNqSJ3ua4l6MSXWACU9XytO0HDK+LTaNEq3iAGBIXAV6jF6LTW06tFg7FEo0G6vGQIAlXn4kCeFpckM/J/i+p9rsyYJyUuxY33s1yV1vg9DIK7zOCSNUqh8uLdNC4/ADOyM/3j4c7uSBAkFxelnWtsyQJK9gda5gX4US4po8CbMoCTEBTKoHrEIhr1N/N1ZCq3eDAamt5oiYjF33tLL1CtkKGc0SQKUls9mt7pPipRW+ovtfCImo4Ht20lxYxkFyyutJqb7OxpaBDAzkghyvUAMq5XEW9v1iNkYwvKOAN3Iz8BAVesl6TXUy9HeawBM6Es8vU/nt2X3WvxekgxDjB2Ss/Y9DORvzFtAGeGRr0rbtvgPAAD//3Rdy2tcVRz+7nNm0iRjqmkrSqHgVgWVLhRERVBx5cKd7v3jBEVd+De4dBEKpaDQmDadJDPNJPO499wjv9c5597orFqaZu49z9/je5SpuJ3z/ephph3yVIHaVNZN8CjYoJkqvQZj0TrEB8EYtqPbihYAeS+anRO0IiTwzS4kbUIDEI4aTXapXAlWW24b/d4uVP8s4TLvch40F7vr9q7FoFudDqrA2uMiMHEy20CpGIhPePlxzHJRIk6sQOKiuLkxgKz37J2PVl9cXRqc6Kb6LwdEhY5g41UUoUn1HJizrbAlrxQAqe5nge9qHar/DCI6HwQwGAJuAXTg2Hfcaeq5IwR4e3djMdp42vuLgma0JUKSRFu1Pkt8gs3mzxZyrhxsq1g24dDahKR40/YrZgZfx0AkyT5mnRK7eP05o3VHcCYR4XMh6bY1lioVhw67diTtY/OQq+1RrlaRLKKpnE/jVjauVS5VG2wL68TrmYWXtJjGwZMWgbIENbJVX1bjdFoBLr2Mwpgan0ohs40WFGjcG9XSYPRJXiWFi0IhSFFR18RXTLxOCneRq0YwSYayjsaCdKCu/KhiqJ958/rEL7i3b/Tv69WWEQB+U2BMwZTrcLWYcwcmn5TYVDVOmgbt9hz+3GG1v8amvo37qLFPnDzqvgYIoCbxnQQ409d28f0P3+HThx/j959+xm+//IgnT47g2muBhXvo+rsJG0UvLRoILRHnMyvCnqfx26P0y4nnrLu+xPzkEi+PjrEtO2BaMUJgeuc2dg+n2LtzgP17r6LanbAYWrVTo741wfhWyR0S4oZT95J9xrMIVQiweBUD5YCmFd96FuIrRICN/s2soOD7HU37mIiQaTkUWiCk+bfg3pLsdN5SlElhBQMfkTOm9L81ZWhTE06DcoKrusRSVu8JS8IN3myFVt5PdRU6/PY7DYpne4HnVMWEvNmyFX2dDgryjRNtSUna/R8WO6S74QeFQEVqGbUtc6izEpvOo6buTEse/BVK51GvOhTzDa5O5zj96zmOH/2N5dM5mtkauHKofI79NkdN7+sEPm57xWUJjFYTUQ48zBddn6bQXn0Bo+drISAHr7979x/gky++wmdff4l3Hr6P/VemGLGKgBfdh95vG7bfM+no+YJ5rk4IAcz1f8Y8Ycfdwj+vX+Dx+gIvy5aTZEq6Rtp9FQEpx0Wm//Nut6BR5te0feTcpfOzsoRTC5FbhtYW2ClrtOeX2ByfoXl+xnzPUT3h/7dWNeeMkIf0HIsrdP/MML5cY9J07JRAiA34PvTfCiu28qm+RQW9vdcPgd0JukxdCpKurIlhSqctKnJLd7kL+hc+EdttrIM0UB1skrvAlPqp0AWHEFjanuLvzcU60QJV7jol+83uU6Y5qjhmmjT1EnC6I5QeaOfAcElkidd/pnx8Q6PRHBfqXJPqGFjA7hPPcViBP3ke0RUw96W8B+u35CiF+ecK0Zf3k3MgxifJPZ5SAbztMTGpXZ4t+DkInUWFu5GrkC8dj+FON0LVlqzOv115bI7nmJQ13OYSF7MzrOZLrOcrnJ3MMDt5gYuTGa4vNlzMI31fAoVkTu4k2nETsq7btqhysdzj+FZJN6YfOtSjH0Z13eDPq3bF3fsHb72Jtz94D59/+w3e/fAjHN69zzu8cV4BO4YcUkQH7TnSzQKwhMczOBxhgV8f/4Gn2ZIER7B7MMXdNw6A01P46wZ77L7RCjaoIfj/AouLcyla0j4nukwbywGdjy9QjCu4wrPrR9o0GY/7rjeGOrMzAaWIxjGf3BofnRQGszxXC+9+HOiViir7TejL0GS95fWW3yg8mR4FU2UL+U6zah3+bPpdxDs3yz5DWhrPPlehlC6JJXPtCNNz0LpjsWcV+aaJMhcAK2akcPmcHQYm4d42jbBCc7o88fKXxmmhmgfxbjWEshTGNXcxBHJQ0o9Wmq6JlqNdolEQXdwQ5svG3pL/1NY7PXMMPUAxMO0Du8PJ+pF+nmgBkgfFuS0NKa65n8WgqSWqiADeLKFJYzCOEccyitgNCIDkbKWdZXojNvbxTDEbRKWzaXPNhO8lZpfbmu+qrViY03wHekoyJmbnyELflIcMRJiZcEPzoHEqO5WMRKfLdx7/AgAA//9sXctuHEUUPd3VPU+/JoljL1AkpMAGsYBFIiJDJCS8ifgJPoBvQuxYssuOJSsES0CJIoGBxOOxx+N596PQfVXXjD1S5MQZj6d76lbde8+552TStWrowZzIt/INe6dYfCYI0qholNkq0EWUkSWOIKVpEKbgWeeIUhzoWZror3kG1IVDL9hQaRPCZi9kEy9v0WMMAbXnWcdbhHIqsVnQQ88WkEuawHDxwtjo0EWernrDrVhF6nQutGEX0O80ASn2juVuVhJRzkuxLgkjBhKwbVUjTXV2xhaPHeRxZz7TQqtWRc1g4xGpippeQw0VeFO/1FglWLpaFnhePd8bkYvw+ZiIlj6XRzhyHStAU+jZo9noJAkz1D/TbqOtMylyEex7qi3KsNM5f/Lxtw6p3Te7P7XaoFnisV6bQJEqCpM4YkDjZDxD6MfCTqElGV+riQTepbhuz5lOp6IUzu9fOqJGobQkbXd3V7uDm0WMCRDCaEjqnJHq/Be9Ll0vthgqlnzFX6EID69bWjsuRb/faxo+9H9cnKyYnkhxx0rIXHSpT7+T6zDaqFiNZSG+s6QZU0i1MUBJlglx5jrKI4IpQj8tlZLJCBoaOjc3CGrbuCS5rE0YJRW9h4PDB1y80PXQ3D3bDPhUpxcbFXsKudVijel4jXbdYnp9v05xczMBDgfoHOzy3FyRerwtSsxXQ/wzHOPi8BGeto7xGB0clB47KXjGPzHBeF0rmuPhvU8e4ZvH3+LkxSl+evkSP3z/HWaXQxTLCap6xSJaic6H24MR/+jvYe1oTCAgsCnrBUBRYaJnZ4GDTShPiuKyQDkeYfh6hLdEH3ZAdzfH3r0BWjs9dAd7ODg6xOD4Ply/g52HA2TtFK7fRtJ1KIklRIcuHVQ0BqUz70Q5p5m33EnRv1wtWW+AZkELZnWpJR2JMd6JMNbKkhE3DWZ7uU0UYztuKGYXOu7DSdzWfiHiYMQ8aVhciW9oubJPJJyEWnO1saV1gTZo+xWLKFJDJPiOk07ELOyBpSINMWJoAp8y36c+5kTTdXkoggwlYBSmAscwFVlGSa9Vrdq67dZQDmNeEIuyjsslWaSkjmJ/Aeyhh/ymxuzdGGev/sXy7yu8+/MMq8kUi9ENOkWGHiEDPOtLegWO167TRUvCdhVkjpfiiGwDHd3DSIEcUSFA6VsrzXkt8Pep2eo8+kf38PTZZ/jixdc4+fIUx8dHnJHTFL0qcAr3JVJsjdo9+rnqv1KWhOPCf8Kof4VfcY2fr8/wenKFMdHxc1lHjlltJTztZ+p24hMphmL72LAO9WuuCbDL2xtoVL9rzdqC6a7LGuh1Ouyf3Vl71BcLXJDw35o+qwxplahGRsJ2fN0qhR+PgbMhpr+/wf54glYps9qICv74yl0AQDzWGfD+px+jc3wfN0kZ3q80DDJUSSy8aoLAKz6vnc618oyw/pwJRpnjUlk19n28jhUBjK3E4pn/ON4MiaN70+WRrzII+VrBElS1tzRf7HWMNWNop61zQ9W294JYqwOa5JrIFx8P5pe/hZZSc8AazEavZcqxjsdBz0jyAa+WC3H9KcoAXBBiJ0BpEthsZokYciYV9YICW6SjQDkJMVBpLpc1OEqPdtbGfLrAwc4+s7nStUe2hMhozgpUC6LtL7GeVZhf15hfzTE6H2J6dY3rixHmkxvMJnM7CjgHgWrT5HoGtRgBlHVCJBcOM2Ll8fcl68oVyb8df83DidQpB6Gwe2pmZZSJxxIee0c7ePL8OU6+OsWTZ5/jgw8/EoRdX0GKB6/UcbHy5N/oEsy9B03wXyLBb7jEj29+wR/nf2GdefQfHmD/wUAQdA/0vEPfUyMjRZYUqIoZLof/YTQ6F50r1ou4AzDyzGDG3uEAJcd3joKaaDya045yN4Q4ktFg2cNXQVG/Cg3bJEk2kN7YUazWM8QKwyRrxjILBTtCgzgq/O1BcWSCdVxg5dlGfhkDLvR9s5izeKqieClVgDzPGuFniyEq5DkudJzTagde8+wmoeAZmrFfhJqjDtdkDgiip5aGhoqNSsd1oTUCZtMps14ZfU6b/DAWY5dx0GpDN6RhHteRKPYmI8OE7uhPHYn/3VoXzBjIuBAXLaCUtQC8ag+ZEGC877FLFYu92+pu6rDY7z9+GMhrjU8DESRvpxxZR9GU2WqAF7Npw/oQG20Bp4WdyPuiulOIULg0EWhvYaB8tWKAi9ax3Uf5XAU44RCk66STRkcdaK1Z09c+5067IyCj7of0PoNmVF3jfwAAAP//hF1NbxxFEH3dM7s7613HdiyFXBDiEllGihSIkogrFogbEhd+HwcO/IBIHPgB4cAFJIQAOSBvEmPZm7X3e6anUVVX9fSsN8I3y1+74/6oeu/Ve7fsUCNzKYhpaphmVXqSyJtTuacenptO8FyMWcfAQrVomxSoFCK9TKAO82Rat64SdlWMB2WuM0Sk6O+xMXLGREmz42KxkQB5cRw1EQjQhINuJ8yRO8mADnOqDv8TEysLtM2Aq7SGWpp6c5ZUomK0IcoU+RfVQx0v0LABuUlydYyRIqYbasom/2xt2PV98+YXt3W/GYMU/Qn0UMriOIACJ2QMpIoBel3sStpps8aphKdJJTDR+EI/14jA8DzLW0XItvWXiakY+ymIPFkPl3dFZOiHq10c4WAAxDQHXht59OKfsDEflgBT2CLhhRxu9LPs+GlzYfQk29NVjESS1IrBmcxGMELZ+dRduIVs0iE2X0Swo5S8Lm2+lfWMa4mDs3WMIUReOimgVB5kRIqmoAJfbvSMxKAmL8IBvyMuphrTqeMJZdUegdG1G2cNs7YChhUC8I3TKYEQSfKHoqAhO13McbicpqKkRrG7w2Y7tO+p4kgbaCvZwSb0ApjPFri6nOG9pUFvnWFAX5lN4eZTrPf7qOlQHnThyjWuSofVfA4/PsPijsOyfx/H+TD4GNVBQh3lh0r2mFB82D3g6OkRHhwf4bMvPsf3332LH394jovRS1TlnDPIVd1g4/y931qQNY1X+lnz/nzSUvD8cGWb7zc11vQcpyUmr/8Nr68A/qCzd9jF8HCfAYD+4R4O7t/D8GAX3Ts9ZIMuit0BOoM+6i7JWmmfhkLW2IAN+9JyYUUO5TnJtvMeN108BpDuj6pBs1kJosaQtL5V9ZFcMKkixklSCERRkosnTFrohzx0FzOwbeIUTmuKCqbU+CbEczWxYZsfKltmVsNVMfZQ5xX5b22miHQCc6hydR5zIHd/uTdyUeiwmsAgxgDq/HF8LwL6MrLvw3nId43Nme0nFrm8XsH6HHtZgWqy4vneN3+/weXpK4x+e4lsUqN8u0ThM/RXwA6p0byul6DAMr4BmgxsNNxnVr9as8M/G6+qsZ+U97VATzU3BwQS5bDDAo+ffYJPvzzB05MTvH/0EXp2gNIHwIJ/wm+RhWxb6+Ts74Pn341I/n/FBC+mI/w0vcBZvcBSgamO5TXpWMZP7Ix66bRb7FRSGveNNIxI7l8vqQorOffYsJGKMOdhSIGYFViMzjH5/RS4XqJDaTma5uKC6qjrc3RJ6jmeYfHnGfKrGxSUQIPQRNWxCZPXQecrKeokzomY1c7dHRw++ADFvQNcYgbHMmaSh1sxt5XfJskai3kVpNnClCmjB2XbN+qJyOTnNo6QqcIkyk8TZ3+/IUEumUXtx/2TSlrDPnNRTZn+jsis0V1Ifh9lO9JQG6VS1HGZMPfa/GtjwIxVUmduggycGV5VEeRQZrMxLmvWhYLv9L2z2TyAePLaIunDo6QV7+ewdjJ+dmmdQj9HQCE/qzIYR/OoTkUJGgWyqUVvVWB1PqbcZrj1CtPJDNPxDc5PR1hMbnB98ZbZ/eW4hCmtRE8GTxgrDT7//2jvRUKgvX90X8vAVrxT0q2njjjv2pDUAjKo64NMeOFqTL3H/v4Qz558jK+++RrHjx7iw+OHqE0PFTUaFJm7ZfbLyx9fC16xMgYj1PgZ53j+zy94MfoL5aCDfr/Ddw9J/afja+zPHQaVwd3OAA5zfs6LySXOX7/i1BQI59+sK9MCK6mUJpVblRv2I6nYEFTm252MbcgzzKR2oWXEkYDS+KeKNCXV9J7R2lKBAi9S9LIM8nLaHzp6lDKsXmbhw9htMKblWMuM3Oml2ZK/n0bTIbk/mb3npsy0ak2Wh+eNIbPO2CvRogStlZEgJRitlf4lC3uEm1I1xDPtRBvIHR0UrY2BrfZ6BDNlpu1jkD6POD5O7LnsLfq6jgQwoYs28KikmxKfNH5ocdunobUPjE3U1rbFqLPKS86sOO6kSQhozBKV4KyT+ljPIT332C9lo4Yo5f9IIEmoWQVg4RH3MGKsTb763qU7J7DzRAYrMd1ENvK608kVqYv1DGNykP31GoBJfVxiRDo/s6b/1CQ7Jc91rWskam8QwHGu66lmsRb/AQAA//+EXduKHFUUXacu3T3tdDKdGVHREAQZiCCKoDgSI6K+64f4B/6PD4L44IMf4JMoQh58M6KTuZuemZ6+TVfVKdm3U6e6x7EgdEKg+1TVuey919prrRcAWCyo6RErtcoTkFcLdDVpJHSxEVkSBei4h5P7u/odXhyz6QyrRT7u4yhKGShPiiQsGPaLdGkQ/Cm0n996xqWqEtPwE1WBb/rcrJfZEKJ+94VApWa9g6Sz8gSS5k+wL4r+N/J6T5wI+vgWxeP2yxAks3HLO5LY20YSJp4xMOqIhpeKeATQeNtCk1SvAnVhbEGboN2eACA8G6+K/CYgl95gj8P94LM5i7RZscRaEFbv2apf8eKKg41VKpQIf7WLRUb/sT5Cqg6HTSuyMrntMpRYREtca4xtJMSv2fIZ8m+tEfb4bNGVpVX11scgve6ZenyqJWTa/m0JsNraE4He5XIRaooEIWvXtl27/b59S9OBgsE+IZPXnhMfQ5OccrzpM6aFVup9ywedvqucdQOa8ZoQidjYpGsbptkCUhAhiWEdNnCjZiIUGr167KeidVDXuDMcCqtgUXJgHCvYuqiXLEtrXE7mODn+B1szzyjMgPqnxmdYXpwjvddHNhggSQqUacXrdI4MT6cTXI+OMN1OMO1leNv1eM/oc/AuAZokUFE1QJcRFQJ2P3wTX+1+jcdffoEfvv0GP/34PS5PDqS1gsItPgRqtgSMqcBegya+V9cISSWhFOAYdWSv9RuCOadwUdCcVpTGLwQdKpdLXI5OWRTO08HRzTmp6vYcBvfuYOfVV9Df2cLmSzvoDDcxeHEbCQmsDTIkeYoNpOi4HNdsjyZFkbRDc+E6uJM0djYWSDSF4UqD9Tg5r5WG6aLEITGrIN7f8zWhQDu8CgvcnQQWbJGUN8lDFQl/xQf6TRS++KLvtkNcisgr3ucVwndTYsBtakpj5GRMx4NVwTFOzJQ9ZuJDiQjKkcgQiavVSvPPCEV0GZIl0K/6WByO8PxwH+P95zj4/U+MD0YoJzUyMedB5p3Q/Ak9qySNZ/abMqTi6ZKoVz8NkRONKmHaMf39urpWuUrHaKDXosC8qtEfbuPBw12883gPe59/glM8A+4AACAASURBVDfefQubW0NUlAQTFdwJm4jmaBX93m1Pm1K0sZPE/wmW+KU6xK9Hf+GomuKKuM2bonLs8oT7e+csuiciUzyj+H2us7Buuyrdu3hN0dzS/a1y+lyI7r4oUJxfYPr3KQoSUKR7zMTFoaAVSsmDT9Gjs240QfHsBP7ZKXrjmbZKrKtt2zpnFX+IS0G+0cHux+9j+PB1XHbEhaFMmiI/B90BdcyQu1w0e7Tf19iI8nmzdpAh2KYZYOCFbCW0MfiWDd1qAiDF7CKwL5cstpyHgNQADgNoYhQTag8br+14DUq7XRbOCuuxrZUZkyiK36k7odgBA3MMSdR4yat2QaXfKeux4nXVeg9q62nxVaA3E92f2sGUKQeYeKfnuNSKi4XaAvNvgwp1Gdz5EvW0wnw0gys7uDq5xGJ0heP9I5wdHmJ6OcbkouT2HVdowi5kDOS5iC463tc9761AQ9enImAeNAb0XDAXAS3oJVpQFtUQdSPQtvdUiwM3XTTPiA+0gBThyqTC3fsv46NHe3j02ad4b+8DPHjtPu/F3awnFp616a2041+zBSy5hcdjgoKT/58xxXd//IYnB09RbGYoexm6gz56mxtYXE2QESt4PMOwv4UO0em7G0hdhflsjLOTY8wjQDCeO7IHyDOhltWNuwPeIzhGdgUntaxR5bJWYk1j5yKxqwMTsQVQaBHaigChcKW0fXMys/lH8S+zGsnhS1sBYuCG1gpZHHPcpiivzFdhnwVbVy97Ruh3D99jAqkNyh4AFj6WfECE/+9ss/3AxLot50lW7j++xIqvQdqLwgcPe5unAqZ6jVFdsDgXQc/8v4YS1pgJlVN+Ymr6lmtQ/F9r+5DF/WGsfr2NuG6J8UrfizG9Lcl3K4CTCfCZJbfdHzNYTQBU1/zqRcw+ep/ErGWRRmNOq4aY/ZtzItUQid+T9OiLoD19WnujXXFMLPmKxUqiW0QMEAFDGpFku39hANg8kmfVBjulYpfqfdPeZlp63EZfFPiXsGtrraMKo2vvOffcmkRrW4RWpFKRpmAt6pMg+OBP9Vl8811EhVKoWDUIXnKxaZKTnNucM3uPfLc9+5yUOFBKD51Jzuzb931rfWu1kE0+KE0isQCUSskohqLvIRPAg1nVKTWzlSGUKbHSZ1gVl6wv7CKExSq5TF9wHTkANcGjyZL8bIumagJVX8wXdx4MQpXnEwrqOksVLAvgnPbSmR8tIzWoU9WOEZ5svUiPnrERGo9aQ9N5s8/enaGxq4uP6TFRVPypEt0f9BGKkN5rXrEyP0s78GTjaqtYVVjqk0GWUL4OKaENM6m7U/CRicHJODdVVGgCST6UpNcggTJV+JrNy6ef0SzUXAHUJnXeAkCbpG1m0uu+LLphFEQLNkygjulXrSIVWxqWgd1rVjcNH0zUn90q0JrmEx3MlsTYYk1WXdarqMmuMUiEbiUuFCYMw64AGmykhMh6UBc5gl5c2YBTXxCtERc0EFJl1Kwny94N/1s1Jrg31DQ5st7GRMWOQdaQtqpYASL/HWzuMH0q1ipwOOeqMI1THhBaj6TZu71u40yHndKb0hxJcxvNIakq0Vz5JO0PUrrf6JFqEsKFCWw18zjomPKY071VwOXJGRzRMxcRg6KDejRDIGuh6QydjQGLxHhDN/sFJrXHX5MZpqd/47w3QbVzFx/4DewC2AYwcCKwFJPzQIJWZV55YOvWOj7d/QR7jx/hpy8/w7fffI0fv/sBL375GYO6zS0FinMvFQCyp/3PFVdKB/nfaAIjb43bIh5n9GNuPC4Do/uE15wfjnD8/AAlIfrrHr3tG9i6+QbWbm5h860b2L6zg7XdbYSNHls9cTDUESSopoOnqPj5qTDsTPpMtGA4CcmQ/nw913qQ26eppy9GFekROze7dzabqmeyUOyculQATf+u0TyTxWaI6XxYvWzt8CFM+y09X3VF+DmMohepqOBUu6XQZMVpO0CtzK0qCZd5tkrq99ZkvUXxNhZ2mtog0oE/GcFXlMB79FyX+13JFnI+KrE4G+Ng/wQn+4f48/lviBcBfkJzkFCViLbvsN5B13fQYUcSQrQWfEYxWs1f36vavNCCa/YMB6vME7Lf7nXQp75PEswd1ZjXgVkddB8haZXv4va9e3hCScEXn+O9x49w+927KMWIEAPXXerwr9Go3te5CF6z+zJCOEl0/ymehRN8PzzCr7NLvKT0Ya3NGiFlVaI36HLVjfac8XSK3qAvS00iG7YqvC7udVlCZXOIledrlxhInHTSflMF9H0XfljikoosL4fAXJgetfq7O1GRE+r/qyHCPweYvPgdG+MRNik4I9u6axbvnGzfKHCkJHVrHff3HmJtZwcjP0af9Y3K5Goivf2UVImXfKDYyJt2i099n1wooDFtuasMgEro2FIgqBKKyMy30Mjy5s5GS/eTX3qm4L2kHK7rgPexjCadP8dYiTnKV6vgWsxshLnQV0nrpiGmzG4svLrICI03BzagPd3W9saorYp2hhU17GjSMIW0cvBn84h2l8a/xYVoaetQrZFyzuCVqyLa0TEjpFd1uaBAVnvFosbkbIjLkzEuj09xfvQKx38c4uLoHPGyhqOhCkLPJ6bUukwb/uO0EMSFQGUQWI++jYfTunJhn5tQbJQ0H+n/+yuov1vRnMgvKzRzss7FKIe5K/DOg/vY+/gjtu98+ORDvPn2HbHpdn0uLMrgEWNWGEEC9zc2zvS8kl07apTwLPj3NBzjq/1neHp2iHLg0dtcg285FvJl7Q2KOy6mmP17hlvvP8AWUfbjDHE6xfh0iJPDIxnjTCy3zo5b2OetFu8LVNCaLUrEQvQhmIFpbgTJ6cGzJbKp11p8m4vSWhEg14RpnG2E1Vapaj0zV+tFSv6vrHdtI7GCAjKGQe6clK+3oMUc+6Z2ltmZZ0mcAG6zdB9WtGv43S3UeNXH1POfFOfNqk7XftatlWL2XNg5oekdn4AWOHMQEEaeJbgcP89rZZI2a9FcMezMtMKd/MwG3G2YyMuM2+uulBNkTMNuV5irtL6t7QDa7st7R0c16kLzzr26BfD8UiYiMz9W2E38O3PLKzEAhL3MLYJtac8iaoowjqQd3IoTNC+JIUCXCMYLMzd3JLAxkO8hoKM5KlicwTFIILerKQN4Bh6nvZZiKI21bQ1QQYdjfi7oUq4l8bsVOugS1maEcw7/AQAA//9sndtvFVUUxr+9Z+bMnGlLCjRyUVTUEF4lGGNiYiJqjI/6tyoPGuODvvBAQsCoIZUKSIF6Wkp72tO57G3Wbc+0QMJLbzkzs2fvdfnW78uhc2XjhxBGiSvN0DHgKctwqPKCXufLuXOSabejF3FhIqpbEqNdyTy3ivJQoeF5sMkAdTH5D1S+V2gyGbRKwh6afUwXAIgPs0k5YTE6y0Si+oMP9mj5qMM9JJe53mwktYDIPQyshwSUYaiHC690lKEFAZpvp5+DSuxlsUaYvZLZoFmwmhdlmh0dihFatcuGeyIjFEErhEU6qOWAjQw9E1jbkGZErYwRXMxo+Gw/d9ikQ5wCTO7A9+Jt60In9HatQHUdVSKLtHnawhsn/0GGQbm6zc4MKRHO0r0U/3c54GgxC1TRsyewbRpRX+5+NFvFa1MrYHTfyXEis0rtKPEfnsUA5+o12BhDLl+n0KDrJ9IzTP7vxC2Bus9lSXNBr/cGTiMQKhGe6HOURDWmSnI8QTGl2KRV2rJVBpkfUKotJkKS0DOkTaFWtjnkaqGX1p4TsnOIQiEtElNAPeD7oH0EmSkTcKCO7JTCljBViU/VxkwhhR6TaaGbaZs2R1tlWX58vs1gNDZ7GXV9RutecCfGqU2hMEOKbDjASQpcnalRnV3C/taeBCOcoHlV91h3QObjl32O5w/+RrOzjbyQmaq11TVskdXS4hBuPmeoV8OKEI1nKDCqPLa6BrcOHuPhwRY+XruEG9VlvIcMF8zPX9URE5Z5h6EbohdP6JPVs1Pc+O5bfPTlF/jj7n38fPMn/PLDTdy/ewe+28Oyk22Rtr42CJHYAh1RVSm8yYIeJ89f0129y8cPjXE/NEbLfAK/DwUd8hzAyV5s9RP6HVI4VOSMuBvQ725j9s82tkRwgHLZY+XcGv8/+86bWD6/htULa8hPVfBnKvRUcJxSEYVgTB5tWKAltwHiX4RO9kV9L5M/uEL4os9fUQvx6AAVaYMUJb1Sh/ORegzJEnUYSeNqOq05GCE+pndw7DXOByK/l+K3D01EmtChpPOMJHkhJpk/BzFQCyaXDUGhk05cF+TwpvexIuitU4AqdY31PFAYvbhoeJFvBlIO9I6t+cjTu38xR/+iwc6jLTzd2MTOg2c4ePwS/qBjrXzlpdvv1NkmklsIDTjo2jki3gk08Xc6P9gJcK304oTB3ANfYxFLLJ97C1c/vMags99+/F5ml5t9ngM+8g71G+dw9ZNP8dnX3+Da9eu49P67qFdW+JqnafXJu2ugu5S0+IBhOMQnYKdjKBjwF4Db2Mavs3VstPv4rzlAXJoiugna0HDnSAo/nmft6ayuy1oKe84lv3amlcdX4UwDZNiJ7aZ+O+MEPiYaON0fUuRMKQDab7DUt9jdeAa3s5BEr6xYiUKJYCDv/GrKSf6EFCizbezf+x318xmW+O+o7SA7LYwrD25U/HDMMqHCDcGo6nIF7cuOz5KaVA90JvrAzBNCurMdKccqIcHc6DwK7ADjuKCTl9blpCKxSmfH4xC9fAY6z2HvC7v+SBFFfi5qsfuEHXGISgG3hopwgYRPUyYf+cDBvCQDuarCOIaoxJu90T3f9n2an6+ntbxr1D2t6xSU21my4PGDSuGruhaidhxHVrpR57Ix8vFOvCNKTKkwXQyqB09+63RHSFlC50amSrc+k7GZNqLwUy7MTV2OZm8PkSxlZ8+w92TG3f3N9Ufc4W8Pe7ZeJXEKz+Nrg9zk+X5k/+IxRmKIFtinvUm/emKk7djurt+zKFVTiGTlSkkv8ToEGhCYGVPkJVuhkrPAYd8gZDkOQoe2yrB64TyuXLmKz7+S9/vtDy5jeWWF11Phy7QXh+RSI8QAqIoIej0BwxjPv3C4hxlu7z3Brc11bMx3WclTVB5uWqLOBcxY1TWycITZo01cPGxx8fRpVC7HKfrziw47D59i4891EqioC4C8yyf/0ddXz5xGNslAZqTsNuPJLlos8IIqfqHJvMxDy6EqvvRIgFpLhBsl9UMbmMaJaVppBnbKzJCEEwqr1eadunpBGy2ZAuRMNWJd/MF5bEjoMUrgnToGELSUCxQEny7Hal2Jp7zXGEtVZnSGTSZV+nwWJ3Csi+MxdKGSdndidHYYt+kxXxykUTVuNC6J/btTULYFJwkCaVbq2hAcE+bHygFOXnkOvucXw+x56TnKWIYfuQpoXMD3Oz/2GcfNRStUZiPXrl4L0qwe4ITdS4GFYldVVBsLYKweljiXVG1SoLB1ZA5zrDAnBa6NmFhx2ZoO3MQSFboxvAalFF2zAAI9KYajcNPGoD+2Lic1gNfnrJbk41EVvk5SDdI+zBi7iLKoUk7IcG36PT8UtrhQSnB4LiqIQsUakZzXsmWANGrnR3P8DwAA//+EXVmLHFUU/mrpZbZOnGgmGRMTUBONBNEIEkRByIv6YvyLPumjYN5EX5QoIoiCSIKJzj49W8/S013LLTnbrVuVROshDHnorq6qW/ec73xL2pwQB1nPSewd4IW6kPlIu/AhzfK8jnUh05yZjteNm1N7eHSCGLa0k/rFYxoZulClNlJJXHkTvrAAyHXqZI1LaFpXlPWisJslupS6+TcqCxTlNuSNHjDRtqQ10q3NsLnDh4ekDRR+47TmHwoIyCIUJ3VPqQnipaxhLBo07LKhdWdqv+rsjGERxtVU6hDJC/0pFFhvyEMSCkiCQK5UlkSN59qTdqFGSdJBeG5h/CEUgOgqlURMLQpxi88nfA3HpzXdxaiAPqPfaPyB4387pqVSp1cE1ClPQ1Z2hOmQzRiPwZw48TF0RV438CYXSdT4ToCK2imVjYi6qbqaF8iQ1Vp1zxqohCZnn6nTRHohiktsU0vl14pHqLWxUEDHDBWNdkxTCfocWicxu4DKNWf2RJx43wf6veaTYaioRLKkfsrPBRptmN6VNfGUTXj6Zo18G6MhCnwHWNvdYNfUkTR2TeyZ4EQEl/E6MKpTzKwRoXzPKL2NKeG0GVLRqW8IlgDQup1LMFhaxOGDTbgi9hT5+h4q84iLMYfR2jrcyQncfAfFpOK4IYyPcLwxxMLCPDilSfVgBMZQ8UMc5iLNcUjXN8qRj1b5M8f9ZRSYxQU1BmQ9b4UnomjkYnisEjODAW7evoXrN9/GJ3fv4sfvvsX339zD7z//hIPhFtOJbaZfywIEGPVTD5uqttNJ2l/dKiARQASx0kNjBA7wVbjxVyxT8CaUNjHaczjZ28bo4TbWfvsLeTfG2ReXsHT1Ms5duYiZpQEWzg8QLaSY9gHXcRJZVzn0STtNgBkV2dz4qC7d7lUY5aPnm5j8gQq4uNatcaEVNYugNmOmcQuM9teiJSfq/AxlMYXmqGxK72r6np9+aaHwX0dIU+bvpWc2EzZapBKKiGJBI7bmQ5onSI6nmOwcYX9vG+ONAwwfruN4a4TdlT3k+8AZje/r8SSoakQ2wrv0w+9pTuMICeAjAyAq+lLORJfLnHbmcPHqq7hy7S28cetdzCyew9f3vsK4LHFcHoHgkywBLt94HR9++hluf/QxXrr+Gs6cOSvTJ3tu/OOmzb8CvZ4QU8k/lfp6T3XqvwfypDjFD+N13N9fxUp1iulsB67XFzCvGyMqUiS0x6oJnSPQg30KVPMvqLvsoS4ovp4xJQpjNu0x43tN9QhFmBUVqmmGiiPWxsi2DnjyT4VS0kuRTzKkeYmFbh/JJENnPEG2uo3jP/5Ed7iLhSwH4YtJUBAHT2HjezMIGyUrHVbWNvHF519i6eVL6L8wQH9xHnMXFlH1E8SzHUQ9kqFIM5/0FEBj3bAALykxF8n108EX98T4QvUkKA0Do4NrIqf3/5M1aR7UMNNVLclArb+FT0mquKm2Iy9U71zopLAjMWMM/CuN2vT1kXpGmQygyJ8ubWuv6fD/uUfVc+TaLZIfbF5BtLcyyFqmyE4m6Cc9pvJX0xKD7oANH7OTKcqjUxzujzF89A/WHvzNaRs7j4foTCWqgiU0voN/tm9RI4gh+Jsbk9bekYT1cPDzYv9ujHwKg98vaL0r7Yv6sJQGN4Vjv4yscCDLyFNKyqB3RzfFpevX8M4H7+H9O3fwyo03cX55mXXbSQD+VMpOI/8U593ibWcSA1GnbB46RgAeo8D9fAO/jDbx62gTO3EB99w8XDmB6yfozs0ySEbsBwYLC4fJ7i7O9Z9neV6PDJmLCcajAzx+8AjDrR0GyOvdqHlw5F8MNrol8z9jnYX3on42Kx26mfdMnSJjDXFXp/5REPfHNRfVvEGqTDhgyVXWbAzWXAdLEIjdHxxTqvr0sNkMp7P27Cd+ECiAhSvE9NzXVMFAtKPG0mVU1uweVzfQ9rkwU/Be19d7YcNrf1u9z/VkyxNEhje5rwktdjXxvlk1cIAgMc36N7mWmdbd4rljngUw01wDCyLxCSFzzdlZMeSUd0IzVcwGsaWaFYaHxZPHgYG7sZbsnLzxfGz+dEHtqtLFxvrUqGyj4ROwJnVGO8q4ZiOYzr9mhEsjb9Jsir8M+5U40v6PhrJdYUOZQSH3hBo3LGkqMUcbtv1XfA0XJCWFCXH1ecqaoH6HU1E0LaCgc41i/AsAAP//lF1bTxtHFP724juGQIBwaSAJEUojXpq0UlX1pX3rS/9BfmqlPkQlaaQiNVUiVSBUCnViDMbExpe9VefMObuzaydS5gkBtmZnZ2fP5bv4nwqwYEE0oihKKzCOJRJTK9fSRa6Vi3x65HxsbcimbiJXPN4d4TMqTKIkioasms6y5dl8GMYeBmnVBVZyol6MugiUxIITolgU4vMVcGfKOCUbWnmDbEBVw4VUrLnQgTjdLLM6zGqjpgmwG6lCbsRCJXaQawoD+QTATv754XRV+EpfSqbY4n1EREMLA2nVyPLmtp0ePjbYX9NK/BIJzvQgCS0BEFpbj4IJN0OCKKpCaQ0pP1MTOSv5541tQabsbrMRGLTQJbEr0B4DuSoJ1DOFY/kmUaYutz2UI2j2UJRy3iHJrGdxcLiQN2WrMT0CgYHZ8Po0gJkKYlh1QSrttH4GlqPialrdNfWU6WfTKKVLAWfG3FQwhro6Og/XEtFU5A0svjV78/ul/MGiDggWHUFH7jsLNpCmwh6ktBWGI8khrrY4LGYkHeNIOtjE0Q+cALVmFatb6zjx3hjngk+su58A16ctXJ6cIX70BQfdHne8fUwu++ybvrRZg1/22cc45ma+a6rpFMt7DoZhhI4f48WwjSsnQreygT00sUmdB+2CIN9l5CsvcDlplRrzDh4/3cW9Lx/gh59/wh/7+/jtl1/x5++v0D45weimaxwH6MywinheyvHM4sf0FBBeqDYcp10FsvkYoTn5/IxjPbtN2b0sw3DvyL06pA5Db8TX2e0e4+LtMaq1BuaWmli+t4Y7u1tobq+gvNZE6c4CUHERjkZMXZk4Zn1jutcsdKacVYOJVciqEcGKs+tJrzYW/nPhHpemaTOfO+zzRBN49YX2pqgD2QRiR6HFMXe8GeavFRmestH4oOSRFOudsYPFsA53ECPo3SDs3qDzzzkuqNvf6qDX6mJwHnJ3nTqJRAdgYT0NDJJZ8xDUFfRF7zEiJpH0gBS1Se/h9sYKw3pXt3ewdvch7j96gs2NbRy8fIFX+8/RRw8N2qPNOov8/fjsGfa++x6bWw8zdfUZGjA8J2p52pWoxECDPeEEk05lhxME4CXe43nrCH9324jnG+hD7AhgUDC1soHSagc1lG6Qy8UAg7JJkuz6XYkLisG5DkefD32PSgBJhahkEppE5nqAqDfC5OwC6HwQe4Qy3GoD8WjCSRohHCu0+foDuK33iN4conTSQlPOIEJ1uIkj9yrJZ28pHSIrPlBJ48MoQP/1Id6+PkSlBjSXbqG60EDtdhOL66uoLzaxsrXMHm9z1OWs+mxfGvsm/iFKIRU5yUM+JuqBY1BaXNB0MgSa/myp8cx4QopcWn1Pyb6K8wrks+KZrIhtQWXd6b8HonOTofEMB1/FPF15L6pbz+eMWJE+QhVllGgs3XaKIyJIx5xcMlzMoYK5qAafkv7eGDftDq7bVzg9+hft4zNctd7h5nKEcAjUS0CV9t84O9edxFqrWfN08ueu3ek3z7P9TFl0Lmfqa3gpK9bPjv2ukSIXFTcGHHOZ6+QCZnke67v38fjbp9j75gn2vv4KOw920Ly1gAkj+Uqmu+q5qWuAStQqdSJUHrJFIwikAHCKEH+hi4PhOxycn+G/YIheNIZTK4EIMXPzC4xquRkN0STLSUJ2TQIMuj3E/RHubi5joV7na0uCAP3eNY6OjjEaxph1snN8QUgaN2Hlf7LA9arldJ/r/zBtRilIrpPatBnYe8gULaUopiruxWaGWFZSbKIClUlB70I7t/qc2HmMQ7pD4QRjQbOqHppBViSpCLQO28bSaGJkCvLqxJI2yQovcf09ozM9pes4aYIOcejSz7lekkveZ7nzFNddzwPWESjEn0X9Lc3hWFNHcgJdKxUvpQaU5mQ6VPzQIOqqHKuWRCw6/3+JuMl52ZoyFdHYuar4r8dNKC8T5tU1Kuh06fXHIjTO8y+8/rVQqShWio2oQKPvngx5kY+J7cFuWELT4PsqrmJK46acaSyObGz9bNF3+dzMIQmyBh2vicQKupcZPSZoLKPNZZq6mksqrYPRIIQY4EKXKYKUSj7+BwAA//+MXVlvG1UU/mbxMnbiOIvTQExagVpQhCgCVPHEEwIJQX8pj0g8VsoDhYcKkBAPUamSprHruM3q2I5nQ+ece+5cT9LCSFESJU7ujO9ylm8JdbJYZXxjM8MHgicPV0WTXJEX/V67wnA4mproqQWfDeBS2MnB3cpK0d3PHJ5JbEQBlV9TnqTKt5aEuKiWuV1+FerwjVo7++aqQNlclykw/pa+TEQDW4/YPkiEqKJ6w9IMQgvtzqT66Mnmo7aHXqmqlhrOW64KtSbRYn591finG0sJge/Mjw9OEcB9BnqxWB3BTtUVwVTsdYzUAc9DU2Awz1YmRiAii1kyV9lTdwXaOJiPWwscwQ6pIEqynXIXgH/Gnf+Uo0HeAAzn3zdJqjtBrWMA5G/ZA9PhArlJdJHQ5Lzh2/eWFHfSIhnVzSh2VDB5wZUyCupaSmddkmCy93KLDLyJmeqYqiqruGJiApnACYyms8TyNAW9UQhgaiL/tiuKmoK6mOPSF0ql9PeI809rhjYl10IJpgo7S6TwoJQCOszUBkoREtDCm3HBgNnk1foRprKs92/fg9L41RNaqRipc1CquI7STegZE4VIlZytx7L5TAFn7huFZC9mBWKvSdDlFh/8udPJvumisSUjSrKeI7rX5air5oeIch+j8QzjV2dYaq8gqLREtZUQClOx7qMOZEAQYYbkhng6OsdonOHiaoaTVhcfY5mLABse0FS+ptM195SkadYiwbenhBP1Q7QaIaK7W9i6vYWvv/kO/b09/PLoEf7+/Ql+3dnB60GPu5zUDarQuNyA3Tn09f4Jxsqab87hW34sbrCYlakCCk+/4TW5SfJCTtDkdVXDLabcmNAVl68uMdx9iae//YnGVge3PrqDd7bfZ8eB1toSqvUqms0A0zxlXncWZAxt5sKeduuc4Je9zaF7jucUosJr1ev/eykySl+n92q1Y4xOQBIXhWMuiPqZXbOYS4w8++zsKAhBQkkqdQMocU18tGtN+MTDHKfIRgnGg1NMhiMMn/Vw/HyA88MjTE4ThgKSyQJZYUW0Tv0a772Exgo9KuW4ZgAAIABJREFUOfgD9iUvd0QD2yETtEwgll5eyMH79vY23ruzie6922iuraG51sFyZxOd9S6Gh338/NOPGJ32UIeH9e4Gvn34Pb56+AO6n3+G2uoqJ0wCwRaqSjkdyzw3RjJnrYFezzyBBfcB/IETPLl8iZ2jfVw0Kph2WrweouYi8+LpvYlqIhxFfPzUOKbonOCynaKFSoGmWuO6Z0PBFZZieGZq9VyUppuJU3izFPHFBKPeEOnpBXB6CcQegsU2Ugq+A4/5wsuVChpkA3h2hnxwhNmzF0j3D9CexKjFbKTLGkhcPM7ityof+iZxIl/4eiKWjAs03gkQ988wJfSHB+yFu5iFGVrrC6i3m7i11UV9uYVorc2CZ0THqUZV1KIq8eCYb0qFNtJtYFtPgiYb/LlvbKSEGZLPjc/un7YTbaFG18Zenvs3XQqXLgSvBBatYp6KwKPYTiiRVfu1CgESrU1tl7NSEK0NEx3Pm8bC5z7t/1dmDtF4ZrQPV4Uilvpsmemf5JgdH+Ngv8ew/v4/LzA8GCIbJ8zjp4R/waxxkmAIDH+fxS5ViPLNb7eF/pfPyeupQeZ8FPu0+7uBdvvnCr1CY2BrPg8YE43L87Cw0sLGxru4/8kDfPrgS9z94j42P/wA9aVFVGt1sRolO+1QnDuCeeyBvfgMVlVy0/mPDZrnEkAPMf6KB3h8foDdyWvsT46R12sE35M1SboNdL6bOJ/mB9FwZucjXBAKzwuw1VlFOyIvkhTxZIRB/xCHh4e4+o/+E1NLQqC20gJq9Oqra/GA5ixAEcOKoBxsXNZsSowlCMfMitL6bPscMgJAu/2u6HDu2EISVVebn6GDLNCOv5vYU26TB7mBWxfnT0ZxOcVFycx2iJneUim69vw/TTxGz1SbdEVSX8S6hIoIvCK5Vxcu14ffTVjhFj6yAtnpUgDg2tWWOv+u25eiHRqMmo7t/ww4/g/nqLe0punZqnuBjkGdwdTm/KbzXgRKiwJM4uQvOfK54oeKw5eRt7pXubQCO3+04WUKzRwfGEFHpnJACgt8bzoG2+0Xpzmi2EkDTfIbpUHzZ6KLMfI2Y50tQYoUBVShEKhIIqF1pUhqEe2m+WspCU7yz13/JDaFBrFhZjtxi4wXdIubQ7NmS73OczSJU/xL15X9tlGE8d8eXttxnDYumAAtIgTSNiFUnH1B4gGJf5sH3ulFoxBoQ5s0bdMczWHHXu/uoO+aHbvqvliKrdi7Ozsz3/e7UvugGIpFXufgo8oUmbWLi6C44QcigTd9qJj+LTQEpo8TSk8diHLiaSeslyZkP5ooVTv2kRLsq6C07LIoPHUnVYo+vZem4lprF6HWj5SC0uhhOrEQ5S5djUCHmwwzmbHiqqExT/XDIHmchTeSEI2hRHWkgRukRtsktWaZdfcax+F/W1XLDhA0K8K8Tm4WZJoSTr8py/zi6NSgw/LfbaBEmmNPS4mZ+sg5ih6/0nODIsm1c6l2KSnyRynftOw0lNEx+2DS99CEKHTuiDuFTP+Lps24qkDuYA9bHTlI+rXE55SGtKvwsG4WmV/5qLVgQxhORqE+SWIAS4YcnaJ9TuUUvGnSsV4Ffgs+KtJQN6JUUXSlel7I38ALKxXVdG/JodakAXE0nXog3wsvqWH5gI9kqX0puHdS1sZ+dI1YQzURl2j2AYgqPz7D5gBUG0XdbroXYaHNjZFJ7cxOcgK6/y1l1vDYj1xAT5JFiyZ0MqYsAqomjYVLNSORWMPC6z7tvrGcRxdM68TaWGPjxFRYPRa9I5OZyCGo4hyTLjRponf9I3SudliTG0YBzm7EyK27Gzfw7K9NLP+0DtehuaONVpSxFGh0cIqzK0eYSyOON4vJPyMRwzwqvsBZsbKIV+0EL6shjsaXeHJ0jofdPn7IPsaP6KDvgJ4mBTjVf1aBP2ikWHcrkYZPpQa+ZOrdW+qi19/A6p017s7vbG/j8f2HeHTvPh7fv4fnO9t4e3zg4w0jRoIrtNOmaNPZ/EuaaDGNkUpi2KwZ5mLRhJeqT+b7BUxnvgf0UvpwiLs41XlX7PQuNH6/yWJENpXxTt7mpw6XmwfY2jrAk98foHe9j5WNr9BfuY5mfx4LSz1GfYfFGK5RsYv+SN2aBRYqvNzB/yaO3Ct8HnholBPrMxwH82musWJmGkYTJDeOyainnDYUDQ9DYsxsxxZFMv2idS9ED+pnt8SQ2ESNFppxC9GEUOUS3cYc8lGOLI8w2R8iPzjFye4hDndeYfDiBKPjIS5OBohpzFMDSfucseV584ZkJBZfsblAy8Yi9gybhshDqhqxIzNbYghRJNbN2+tYubWKlbVl9G8sSdxjM+N5mZyx4+IMr57ew2J6gd9+/hafr32N73/9BV/cvYvup5+AMisIcY8TM0IVv4rZekvUx2pMR4wlJ7Uk/fpXbPJX4Y/Lp/jz6AV2JwPkcw2UzYQ3F03aNLs6e5ibWRPRZ9Or93EJGHXmYUKO+Ya0F5o8EyduSics62uicb/y/KRIeRwT02d4coGzZwdwxwPOb4/aV5B90IFLhApZDEfozLfRHk3QPD2H23+Dk0d/w+29RPfiEq1JiRbNfcxeAzdip67Ne/pTHABMm8I4tkBPnqvoXpLBKHkEpIU0XPLdAS5fXOB48zUzKZqdjJkC15b66PQWce2zD9HtL+IKNQTm6R5HiOgaZxSJNub/IVF9hZjDxjVSRfshpvRPIfnTUHUNWNg6b5tkp0DCdNvQGsDhIbRo+U7S/TMKqXtCWjf9mhA4rFPMHhUPtMaFNObEAyzOP++2ZpixWKnsyZgb+Ik0QFyEjKIyJynSQYnB/hGeb+3h8J9DvHn2Gvt7ewJnj2XdSPU+8T6Qv18an4n3uqi85Ut4m9/beJ05WL7iSI+cM0rPIqFYJBb2H5VQAg304PnZ9kI0J5N/YJp0yM8VSbuJTu8qbqytYv27O7j1zQZWb9/Elyu32NeE8sLH7N0QPh+xjxBEyDILQDDKRCdZDjUhB0r0ITbPE4ywgzM8PN7Df6O32B2d4izOufmUKD2BE1HINJhYjEkD83MdXpdojiTp0/D5PpbnulhIEzT5euZooMTezg62tv/VhCOL8dTCNGhYlYTgziXoL99Qhpl1+fQzWvTU58vhm7JPjASNpuLr/PzcA2TsnO7BqEh9YGhee7fRYzVOU3X+DAoGQJw33ZtNt0qTOu52IgVa7nK+uIbQm/SFALxSpbM1ymwjqtS0kFqCyjVTJixWH6MZHCEL1dZOQ6Ft728pVdXMemk1Gmb2/JJoVfDa1VAJaqFSVSpqqwD55yQBredyLfyZKa7yakstMWmBsVlZUqQeI3yOCiBxYa2sC9rbmis/F9gENvDcn/j0sURjEU2+kPka5l0DU75GZv7OdUyBhYUF3v+atDUfi+u+AV6hh1t47czIjw651vKeof7hnoX98yhBiwHlOt3Fmqd00Hnzq+7lQ4ND/rxzmnYh52nRgTYuDaxlqQvdAz0fA8ETkjZEFf4HAAD//4xdWVMUVxT+epuZhtFBUKFYNGogMdFUpfI/8uLPyD/MH8hDnrJJEFNkEBFQEFmm6Z7uvqlz7jn33hklSb9M1dDQTfddzvItaSIiBiZQ/OeuYKKD2gsCtoFqPNQGiToorS8UhIcKUzjYPHWkhdOsogXN2NsIUhAwlqTSC8q0lo8uXXDlaEDU6kNhPQfxELEzB1mfOqxvqEwq2fAUwj29uSWp3QZq8QwtpZjhrTM8BEkLJYoWsMm8/ftaIVPBB31BOriTwIpDlSljVylqOfDRINZytH3HXA/mYLO/o7dqzETRUyeuqrpDFos09RBuhdynwnmy9I14QpDQKXZLBK/cKEU2QAocen2dfFqEbIPKYIikdFyWaQxwCDVySXIUiKyoeMf/s4tSZVYjcJnpw8EcXYAUc/FBFxdagJhDQwtwWzHUdNoeSRNwFnWM/t0mpZQyOFNEFOpjyHe8RKdr7ala47UmECTXkbOIEkQO+YA2NpFRwUB6L2qjmUoiybAjCsw6FgFSV0rjiD9WhhWOta28Gg+lc3PLFly4UNK2jvtvYnFMEPcPne/t1Pu1lBI6v+Zkk+KAG0sDzMwPcHEwug54aZ8z8Z9bg9c7QyyfnKGXL6AgVW/K7SlTGTcoTs8Q9TvokcdfFrPYZ8NpbmPHonR/2jTC2ER4X1/hDDXenRfYbY/wYe4BvsuWsIiInQIGog/gtAmM8NmMt2dSiyZLIbERIjkQ9PKcVcG/fPoU3z97xj7Iw+FLvNzewvPf/8CLzT+xtzPE8dFbnFMhVe41IkVlxE6EinjcDhmjnQEtCsmziYLn5qwGJ2D3emI09V3Y8raBKGEUyAyuQ6kLCdGQMM67EsX5Hn7afIX+Uh9LD1extL6GtSefI76ZIhvMoOw0XAQhxcSEEzvirFdw6oQk1DY9/z5Bo7L7ktX0iDUhdmrjvmDri4uRm8eq5wGhldG8DaGVYZIRFrjthSN00EXWpEiuDKKiQV5niEYld5MPh0d4s7WL4vAcJ7sHaE5LdJsEaZ2wG0TMpZjKjYvY+E+5QMAvtut6Ira3NI9ZVyDp83o1c+MmllfWOOlf/+IxNp58hcWVReS3++jMZqjY8MugpY5KG6G+LPDo8SM8Wf8Bt28vIF+5B8zNwQzmUMYpw6P/mx3u3pSd59L1H7EYGLCJC/z4dhub4xO8NiPEt2b5Hqr6CnGvh6oR94hgX3ZiWQLd12KrcTDe1hViIwnQrPWuxhceBdCIbgl1bCl5IvRPUgPlRYHi7TGqVwfAKcGAc3RmemhpXSwroGPbqaTJl9cV2jdHuNrZR/nib0S7h8g/XKLfGLbG7BmrSVAZkSrTokWAfg/xLRNj2Vh0CX8iljJbzAlhxBx1iZtkLtDQHl9WuDg+wmjnHRparwY58lt93FldxGD5LhY/W0E2N8PfdfOMhcMowU+7ObsEEAKHCgFEvWmTOMCm+zmNKOyATXb9Fbqv74tudLo472IW7jI3Ez+jBEcRATw3Je5w6uVZhoKdabzlIHdS68YJDIb3pnGfJmG8r1GXmc6jgkodo4cuUtIkvWxxOtzHwdYuhr9uYff5PlICbJRWrE9RXKmIR+sMhBQTYhcr2rT/uuR+6mlee/D+FKVeh4W1LjQe8LFjrSUBGhOkGdUazC/MY/XefaxvPMXag4fY+OZrLN1bxcLaMmbvzKOkeCCNeW7UwfwJD6c3owV0XXeMDb7IGhPdjPU7qNv/PiaVf6LyFNgyx/h5/y8Myw84S8YYJZZOMzs/QFGMUHODqUUnmkUaCcqzFuvnosLZ3iFweIL73z7A/Tt3kWBMviR4tbONzd9+weVFK/vR9U+QXQpu9pHemEHUI4HLWsZzkJw6KL+lKrnyluPFC+xZeNkT3eGwERN08BHMC258EK2y12O7SE8xnsx1QgQrJ8Kt8Q5nSSq5knHI2Fg6wYwECeDlipqGFq0D4bk4oBa460o+oLGbdSILO/7SiMxSF4+rVljYnNNDm3phfD3xf35Cp0DvnYtBlbdu1vMcPF322kxyG84rWrjn5H4nmeT20+rZFUovtGErtG4IsrkYeZh7nHjFe49Uij8qbk8gAoTiRu+aDl3HLDIvcVbEYcNLUdv6HML70XMUGaVFFBLipXdP45LXPUeptwhAl1+LfkCo+xA22m1TsmFaHVPeKA/LLBLANTkIDRzAbBSxwDoLNJZMg38AAAD//4xd21IbRxA9e5OEInEJxjI3GxJMUqm85iHPyX+n8pyHxI7LIWDAkZEFAiUmYFhpL5Pqnu7ZWQHlbJULcAnvemZnpvv06XNinaQi92zoBK3kgMg7ADSp1eoJD7LkULmnDTC7QPzkjAXQpAch14pWFNSq4bxZR5aanItIoIrzKdKi1WTtifd7kdUL06J+dye89nyBt+kHFU2L3m9OxOOGWC8UFqWNEocwQWg6oRO289DywB4iivz4lVt9Dl5kUXjn+WosBdcLk9cCW8hibM3ZPhLbG56LhZZOeEWPV4CHNjDfuo0qFfA2w1AquY7WTqhUGbn7aS8fPMo8NHEudUOoNgf9PzGCeE/PjPGsWPge6gigyJd4Y2r/YKU6KnQrpc94okQPiXkFXvKvNLDZzwczh6hSlnTztJYjIiTDAZbdyBWcqZLjqo2G3keqntuKiPGePbfdver/GVrVm8nECnZQhKyOAYXJ3HNW4jZCxRTmhQJrNG/OrcNUegzqYwoJnqNSGRuxDYwI0b25dRY2zDpJJ27+/F4keKCNf2kQp6KIWWaTK99GSvuvHfgj6s2G08Mci0tdbG5t4vWr958UseL2mzTFzekI8WIXeYOEEMlDPWT9gpvzc6AbI5mfQ1Q2EVHQZGy1jKuqpQ1awL65RPW1QoZ/mwKpyXAx+gMvOhf4bmENO2jjSzTRQ8j91C555dwgEj6opExxvV9fR4rfmYhYTS1sdZ5i65sdfP/Dj/xenY8vcHJygv5ggOOjIxwdHmDQP8bZ+z7GpyMU6QRFOpU+eqlWSUAbSVdnIJoFfqIZulDW5yzIdzPaA64Aw9+IUB+rcltrKlbyFZosfSQpc0wHROvcw+kvezje+BW959sMBLS3euisL7LonBGbHUqmilD7lkuukP+fS/fP0oEcpauO+77Ms3ukX/nQ9if/uq/qA927coM2WohvgeC6gPmQ4Wo4xujPdzh7M8DZ0RDldcHVXO4G0wq6MKgC8Z/neXe9BIFnMSnAUW395AyaU6DQnl9Cb2MXy6vr2P32a2zv7mDt2Tp662voLHTQmp9jAC9MrD0WLaT0JuUEs7VgsLK1bd13qAqSWOs9+mMPfZ3oTw1+6RLciYj8HQP4ORvgp/5rjOMCl0mBrE0MPquTULJDwVQACTrrbeWKexvtqqsU0D2XVgaziOIucQaxeGzlVGa8zO88MD1dzl7qEcztFGVa4EN/iMnogqI4oPsZgoTakEJM0hxxu4OIGBIkYJmnaI3GyPYP8e+LA5T9MyyXAbpFhA6NISfvtCNZwTQOmmbuXwHFMp+SuOh7pUllKdaLpalAACNgWym2mqGs51DCCNLTyc+u8M/wCpcHQwStCM3uHOZXFrH2bAPz64/Q2ewh6jaxsPw5km4LrVaXWwWoPWAKAgOmqF+mLmo601fN3KEH6LhuzJllpEC5APcK5EjA7cRjM7iWwKrQU7I9FzsQiE0tU27DxAXMevG5IUK9VuQ2YkE7LhDdGsyHbeTDa/R/e4N3L/dxsT/E1ekVaDmwzobtnrDAEfPopZFLxiB21Hyds6ImKGn32IdhAFP73ZlxEleDUGj87LBgaO5baJB4ahIz0E2WrOtPN7H86BG++Oo5M0Do55XeY/SePMbcXBNBQ5hSjYjXeUgClgwv+hCdf2/3gJ5HpsyzsZ+mnIfAvHOx6zzCRxzkY+yNTzFKP+LSZEgbJTLav0lHICy59780GRJynwoaDDg2kyaPkSGGlMm59//qryHbeu+ubWJ1cYn4RkhvLvH28A1evfydz8xGFCOlqqb3PvpnJs3D6tMnDHbdxuFMO5K6KKgoYBW7M9ymCbwwl4m5SF/vFiC0gBfWftavxCxTNws/9p2tJGuySOf4pLDVcQa9sqnzdFeGjCbxftGUk/swqN1bLz9mc2BcKGxRT8uA2mLvS9yrnKlq3/aLVppfsN5XowL/qmJd9e8p41gT4UT63XPpZY9mYkLHChDxQyN7AwO7Arxw26gUqLSNlJlgOgccl36sOyhIIVb/jvXHIuvWpoBjUfhM01l2hb10vHxNOoprtUXJzrWNzdUWWOfIB0Z91pL/7DTWqn3FVX8t+lIcZbsJxabbWmM7h4MH9l+rr2LPRMvqtsU+YgO4d0nZjnT2s2WJjf9qIo7kshME+A8AAP//bF1pbxs3EH3krk4fkm87lx0kQdL0Q1ug6P//FvQIigBt0gOOjSCOrViOJVm2jt3lFjOc4VJqFBgxbFkHl6Q4b96R0oVTVEsLbe0s6kVOxFFd0Yk4W5k2pNjVMo82cCtd/TKiWc8m3rmcCgouUrKZPGYRugN6C9TpsqI/q/mfDi4NpmpLdPB0kobcQ1uxA4LDfoR4I8rujDvUEFqGDqx36pTFlkuH31bGGbHLpupqNCdStfPGLOLKVQGbcpdMC6fpZMoRhk6ADirEyeEzoGUWgebiu9M2GM4YKcwZNChtoK4wQJBUC1aZACbqqHsKjg3GHkirTYZmbOwyqZOYZRY5ggN9DBCpsV4ompc79bI5JgERXTrgFUVwozdmMQkg1h3FC1GvxfJi599FnX9fQFQbvjGVIWAYxyIP74dlIS5mwpjghswSCOfkgIcQ82dEjtEU3Y12sLRjr/n8vMHwJupzmYnKSb+fTG/lxVTghI10ZRBgTjsnuv50njRbbQ9aSDclSD+sRwMzoSMx2BYyzAW0kSxclchoPunC9XEuUHzjeU8RMHQg4O/lb+J0B74WpY9c4dg6OvWWPhWhrK1g5/F9ZE3KUXZsfKY0VVsuHhLyskDblugfv8f+o4ewLkXSqqNGut3cIB9NMLsaIltdZcd6byYEjk0s/WL2YCIZUpUkNUw4fovuMyoKXM1HuBrPcDLs4YfuAX5av4fn6DAIsA6vHyVyAYOWpVQzRjvcVXuQpyXNYTLxovxpWnu6FmopWvUUeyttHBwd4kfBFEY3Q4wHfUxux7jqXeDy4gK9j+fonZ/jw/EJ/3/Z+4y7mzHuxjdMF2NpgHwRKED58QmPlwuZyfGBN05ZcAEmsMF0ChIpqDR1Nasz3pqcNbSkL2dueAYM/upjdNLHvz+/wcazR9j5/hk6j3exf7iP1mods7TAjO6aOG/kxdpUNcCz0dF1WSFbscycyhngCxhFv9UEaqFDlFQUSk7pmMmBUf6c9gCi+M9nOWoktSmMN9bJnXfxv3G4+0x0+o+4Pu2h/88ZxmcjbpmtpQYmS7gArWQVNhpbHx9ZRjRcHt2IieFkz/a53by4sbG9iRcvX+Lpi2/x+JvvcPj0OXb3d7C+3UVjpQHTSBg4JjArm97C1rzZEO3nzfaaB3DTmt/H6fBDiL901xvLpYpO069omL0ZWAoxRcc1R/uN8Gp4ht+G5+jVHeYNiyI1rE0nM6wax9bVMcmmSGoNBjN4b0Bl+sfzx1YH2fgVMTtHDscuGiu+f+6BrTJoUcH6fFuULM+YDsfon34C7qZkyOEFzaT/pWhH2g8aBivULZ9lsNe3aF1+weDXN5i9/RvpxTV2XYoV57AKgwbdjz7bikWhcmxeaaJxWk4igK6taFqU8NGJiwwQt/C4Cip6fIzWrz8Ak8xuNiyAuzEuP41x9edHlCtAY28Tqwc7uP/kIbYO9tHeXGNPgWa3zcyktNVkMIDN3ghoSMoA7sW8hfhAGxdBiakYQVVh4gtojuh0i9RaPrtIh9+Krth3FL3nUC6Fhmq36Z9e70JMeZdHsVlvcdeZuva2cGjN6zD0eXs9x4c/3uL9L+9w+vodygFQmwKrJP103oDM6WePSFwgEbSxI4KVsjHIH3RdlH7/0H3TRRkuPqJR5mv0knVEfTFn0e100O1uYXd3H93ONh7cP+LvDx8dYWvvAGs7m2h31rC+tYH2eoMnAD+GyMdz73fszW1JWw0/5rTX0/1qAkE5mTPGVvv44sQls07D+v4ppQZIrN8JxjjFLX6fXOLtuI9efoehyzEu5miutpHZLJovBpNsgkbNw1fT2ZRjCBMx7SMTmZISivoD4MsNnuzs4cFGB82yYNbc7WCAN69e4+z4ysea2WoPDyBAAKRKBoq3j+4ha1rMXcZsE2cLgVPkU0liL1n6ErGpIGkqNBf1HB4X0rHPkernzVd+pg2guCiPCz5oAykFs2ODnNQ5TLMJfy7pOZTOayQF0CJ8gdEkz6+GbZBijzPl08ozSTv+eotTvGDi94/wPjxD00oh7LvRcXQhpDm07DWmtzjNAAusi1KAj8r3TKWyAWzgYhSsSyepiTKn2f+GXkOj5vcFW9VZ6i3HfnHS9FKTb0SNLAUx6H3QdVbzPu/Knws4kEXvo+TnXQBv5EwT72FxEhpF8XqZ9FLjQFkNS01NZpMwI9E/L19D9YZQxpp4odB5Y0zSXZLg0B5P0dNRWhwb3td93ZsQu02fg6XE3tPCMzmIXeDrNp1n7Bn2Pz+h6jXyRADwHwAAAP//bF1ZbxNXGD0zdxaPnT1uoEnTklBVCFG68f8fKrV94gFVqKWUZisUJyGEpEnsmblzq2+7nqA6QpFi5OWu33KWjERHmtmNiuqRQEAZNw3BXshjtSNuWRBejUC0ZbHx5c3cvUbES0KH4UASzK5VDj2PcMukWXrNUVXG6hcl/wZ7d5roG7zMdABiwu7n3BBYsMj++BpIOKdqwd28Sk96A25uR5P0Fq5VeKx61Bf5gIqxEO+ffqQIkDJc26pmnSb0nr577+Chyz1X333e/IOBbbFYZLi9mAyG4qMSPPvwOul4pFq5oXeoiX+nfGxL8FpN2C2JrFTd3qVznlkUwiN+dyuJfzUaio2fE/53v4NN/tkIknB76po5gYXb8/2HddgMVZAH7baROIXqDkDhtzZGfei+RX/0PYQnnvPNN1MIDiVqIoaZR8ELKx711aK5a6Hzbu4AiEl+Eu3zuFgTpHtP3YfCfDUViTAYlOo1muoGc8yd1wWlitU96FAr2hkc67WmA5CyejlTPHqFNSl+dDHqpn2VFwMpKEEueNJ7IpEYUzGLVdWQxjVHhwsVFMhElygcdGBZ4c4OdfvNBwMpsUZ9CHVNsPmgwwSe4UI0131HCXrNqpDxsK6QFS9glKAgVpddpLwIsdGEbFjtXy9Fsy5kYSji4dL/gyAVakgFe+iGvHfuPrqPbGsZ10fnKNTovWFfdGPVymNEEMhpjZMXv2P7+29QlRuYklgbBQDTht4U3p9jlldYrEZ0eyDLUw4GfZpE1A5zyBJJfkO008vQ5cCJr3ERPN8TAAAgAElEQVSZNpic7+HZ2Rt8vXIHT1Z28RVG2AGwCo+CxpdECKnd1Ltf4jrkdnnCAQyKbG5npKgoepQWA+kWqxaXsL64JGvmwSMNPx0f/szDa1r88+4Ek8lbHO4d4OTtBAd7ezjcP8D+/j5OXh/BXX5gH/qMVdule16q/SrZMqWKbO6n3aYSYEkNC33ZJ040mAyiReD6QuABWKF5ngHNcY2L8z/x7vkrlJ8sY+fxl9h8tIul3Q1U4xFmg4AbCi7phmCBtRA9eRmalkqBufHarUuku0S8YQ5qAgno1dzhTtnv23MhaaD7nBAHVNRJGZbY8fomAciqlL1IZ0xWlKhnCRtdkDVP2qTIG4eySTA9ucDxH/u4fDHB2cEx3h69RvOv54Ss8hKQJ43QMQi230Uaqw6mIhWyqLptJwgrNSBnEb8U1+zxn2F5PMadnW08fPIdHv7wLe49uI+18QY2VscYDEYoqlLHXtFFmpeVgxG/bqHRAW270hVxLq0jnTF8rQ/p76ISePiog21/pKt1plz/Vwj42R/hxzd7mCQNzn2NYnmE1omDh7mlkSMKaqHzeLbaKxn6ypZQiTqRKLKNryi+4xCh6qwJYsr2iXh6Z3SutIh3MQknElS6pM7J9Qw355e4Pr1A9+49QF741OWtRnAVnSXUoMi5CD/qPFamLbrJMaa/7WPy9Bm6v15htW6wGBIshAbDVPj6CDXqTpIMm7sszIuvlsT7XjJpe/d/VeEh6AG2zOw02UxCtO5LtVDoGDJuHWpmgnMWSNNbJYIXL/S3vwSu3p9htneG06cvGM69sb2Fu19s4s7nWywkmKwtoFxfRJ1TtU6KbVQQCMQ/IFVKCPKK9SZikJ8w31qQGup8kJjgIp1vTjvqQk0U/2ptDlnw3IpfN1MiVSmPOqM8x6rLQ8V1un95y3gpj1CYy4lDJu/l68CF46VihYX9iIrjJ1c423uDFz89w9HTl0g+BGQzoFK6FSFNeAdQR21Osrld7CSR0pDocZbAsB0p84H1riP1b+6kOUwJicenYMZJNHtDZAXCqMTKeB2fbm1xB39rewur6+vY3P4M4/EaNu9uYG1tjSH9NKfiwJTi4wqEV5G/rrcPO3VRpXXSxh0tT9Z8Gus9BylA83qsA4vyESqoyOYbvlXBTvp3yPSdKzzHKX6dHOK0vWHtm67McE1uEyTuTJxtqM0cRCeEizfEt/aBnBThMnGTAhdMPbK6w8XfJ7h4eYSFNMfjezvYXFjEau5AfgHc/f/lOdoz/X5sfzaHJbCoL8cXctfkI2Bldx3douO1ujQYMqKF0YhBUJxtJ9pTbCTqZLblLneMdiqHFeczrVIWhQ6AW44XHC9qAt02ohOgnIqYf0TNANUR6CeRtHKMBumVJmm6SbDC800baQa+vQ0dt9jQBLQtwTbRuaaZ22wyl77pCWXqBd31ihR5z/mABpVidxHANVh5GxurFp9T/oNe4cNQdZnLbiWlHAcqRYA+8/XNbI485YaRxOcUYDnVsaGxYzFoGkPNZcq84POjrqeKGpD5mXEu6hTxHFgjgWl76gBA8S83exlZ4Hmt8+ek91edGSngpbia3kTKMsdzGh/fssl2ZGOcMNqKqQcaR1PMz/G6VmQpRhHK6HzeCQ3OyMbeWqK5ShI5+yxfid18cg2iZjWPE+lOdKy1ZcUgGucBP0/oVLEgtHHhba8NHvoZst2jF+crc75oJcfkBqdeQNYcp+Jv00jBgnMgGicA/7F17T9RHHH8Mzu394TyKGhFLWol2ETTtKmmTfq392fTGGNjNWp9oBXUQ/BAzuNuX833NTt7eAkJgeN2mdmZ+T4+jzO+P9xN8bVdGMF+iPdpk29VnSTAmDOFomhXVrnCVh1xTqpOMYQzWBqo6EwSde6dKupTgsNsUeXwEP+G1lPcyS+1gpZo17Esi7MJKhUwIpu30qDspviuiW+pAxnDbGB8N1d3puxeSXyIEshONz0D1xCRmlIS8bbwVRgBoIG3iXlAPbHNwzIUJaYinMNBkynda/c90wpXrNDpg8BgHsQL7T5PT6fo9wdhbK0bZqIjBOGiRU6bJF3T3BsIuolIG8H8QedfBquxBNHmwvQfYhvIWs+g1ETahwVlnf4gChkp19NhTe9lwbyyaPiVhk0sol8Qb97sMqAcKLEoqT0z7RmyLr/9zkTGuMpanOUk0yYvXPg8IFPkGSuUftGKYO5VozsghYnms5KrsEeu3q42p1AhkKRKtQIpyBsrftDz1ev2ONAKSB09RJrrecrrx7jQpulhVVuhCqhGAFFmtAjG402IFUUyVElNYYltUJy5ViivyV7z9oBQxEi/1w/oIvZtzQpmL5soTpFm4m2+0sW3VzcwfDMKh1LKBP6q0RumA2ZAMKvDI+QfD9BbW8NJCUzY897z+E3HObLhCNPFATrnl+FcR4IFKn4E6LgkIYnTAmIlXSGa7wwek6LE9DRjbv5wOMGrk2PcXr+I3zqruOTaWHYddBOHRTpMVWSK4aOJCXvO+x0nGnw2O3HUbXJVjdQtnXWeop6dT9HupxyObi4t4/K1Lfzy+x9ib5gX+DIe4/2HD3j97AmOd9/g77/uYuf5Cwzf7mHvzX84oQISW3AVwXbKaeM8YAQsCKHRsDPUBfpogGMmTdFxeP2icILqWCSano9HeLp7D6/uPcTm7R9x7c4t9C+uYGGpw4WVMpXiiEtKZHnJyCc6o4qsOtPLMq4/Fd3S1A5Ig+9RAJnJwFeSPtFnupYUQRlq7NtMAclmFVIqBE5JObzHyQXB/D/vfcLuv7vYffIa7x6/hNufMAUA+j91XQ0INqBHA0ZtPwuPvtMOo6QfZSUicJkiGc5fuY6tmzfx051fsf3zLVzevs6Q4HShwwGAPUcVouJr3HH8yp789VczYJWw3pLbuS4GFQmdeH+/RsFc/z8/vsTDyQH2fAZQ8Tgn9wyxjzQou6BGvq7FEvbqOWfU0A0vZTyccnyd2nx5U4wkXQO2+WyhKmYY+BRfRmOM3r4DxjPgZCrojX6HE0xGSPg2ulULC0kbnXwGf3iE7PkOjh48wsk/z9B6v4/1KsdiIQKfHSpmVkWwQksiUUTTHmNqR7StxZiVJHLgCDGf/q4FcaZQkH3gfMdjwAl2Y8uMU9b6/fYeEhTs0PDMONdFPs4wPNzB8PEOFleXsHhhHStXv8faFaILrKK11Ea14AVB0k1QEG3MC40q0RSYmg6SUAntpyjFRtgQQc7XnUQEmqFTykau50ymIsc1kkzOSYlrONhVbRFW2o+eYQpYTdyYECV+5tEj8djMozzKcPB8D8/uPsSL+48w28+wcKrifSoKO+8qOL86Sp0RG0MuorkUJTWKSIeAC46icF9wgYbuxSFJBzj33QVc/WEb329ex9b2Daxd2MDmjS12bVheXcHgmwHI5ZKLy3q9NMr16VpZNKE+KrIWLj4FdOaNKhTQJc3nIS7Whc9MHXISffOC2skT0T78xIr+OZ4Wh3g8PsD98Xu8nB1jRF31VgLfbzEFLm0vwFEzRoVyfSFWrtyM0zDLw1T0JQkitFR+MkFxPMH43Udg9BmX1s5h69IGltotXluz4xFePHiEw7f72smUpNtuPV5TLBnbAlYvr2D9ygbQbXEHmYRDaU5YtI3uior5ooIZuNqB7WD8aVcG22vipxuqONBcOVmvqSnmgR9iI465iuB+gRDz1puYxV+WO9j1rGFiFoOIkJl0znP8RCjR3HIX3ZUtJqEGZtrmvxcBW3GJaSCaI+rCvEab0/GN8yLWz/K1tz6ieNhi+CCWrmhfbw4oZJ/d6zaaQaa3ZvF4WTY1AAxBXVVRnBj+P2nylsEST1zdOC5hCH9xBslLY52qjgY3CPKMY0ob10zzGbZsp2Jy1YT2mxaBrbW4mOJp7UeFDltggqI468LGZ8EcOkQszyV/YHRrhEjm62mBwb6PBSTp5ySqKBRcQVMT1TIW/2O0DzeaBT1smmY2B0SP4v2T47ZadNyeTRHR1fPVOfwPAAD//6xdXVMdRRA9s7t3L7twhaSCYMV8AJEQKlaiT1r+Bf+AVf5L33zxQUsrlURjjISEVEhFg8hHCDfkfu7OWt3TPTtsgCfnhSrqXtidnZntPn36nIQTYZw93qdl1RNBon7ex1IQj5BC5j0tG0JwYV+1flYVoPlmBCUz4jWvYjFM+RdkbUSCMO3TRdaMBmtJ7Bc+L1pTitsAUSVGAtvbIMSuaf1KY6f7ciIXjj5P6F6eZ9LHDb+gW7Gj9zi0pfIOAJEgQlSFjQRN4ormRMtxvLQSKbYgrlJaU/Sb1HePzJnj96tzz0kdK0Vm/N12PumQ0EIpls52UdkKjqJ+MmXktMGIahIHiWFZMwJoTQja1hyh1Qo8fSg61sev7Qiq5xBSsdSOTwUcFQzx9nak8KwtJl4R1SG39T3GfvPp81CHCVYeLex7B72uU/d5p7pJVolM0WFXgMQxW+jlKZvWymGvg72Lk5aAULXGAwL6fhLQqjT51/tkNFnU95nREPDhm4cRlAJNVXDqbxf7Rm334HttuaqGQ1xb0hrgNDBoD6i2w+lroBa8PKtvFA1QoBCnBgr+0igWL1eDYuAE0KamJ3Hj1goO7qyjfFcyak96EDYIyHUk9DI96mNn/RnOLy2gTRV2CjYjEhUcw4zGGOwc4G2ewk7EyNoqiGNrCq9YNpbSagA54OPKiTIy/TwGihToVhZ/jnbxz9YbPMxmsNKZxc3JeVxFBx8BmIlcQjFRUXBaSZLvqKT+uv37JfbVD/19OKh3vHn8miCdK1VEqnLXXxFwQ1WXmRksX1vkBP7rb77F4eEbbDx5irXffsfdH3/G2v0H6L8mKuaYtSBUQEn3lPZQqtgZB6m2ps7bRmvpSW+IhBMaouECKfVfbg+x/t0DbN57jOtf3MbHny+jszjHFR5K/CloTdKcReSof5fBx2EDMBOWVQIX8DlAs95fBWN+xNxwZ/tUTDZk9J6q2LO5sAbttINsBCQj8n6PMdrrYevRJv569Bxbay/R3e6iGIB7wOORSwIzUlOmvTEu/bwAatMoXvQyV7ENg37r36+02kgD3yRTuLp6A8u3b+LTr77E6me3cPnqFeRTU2i3U86Hhrb01Us+w0yQEPzvw/rkYiR0/y0AGyjwfW8Dv+y+xOtqiGIqQ39skdOZLzoaFGA1qe9nDW8l1UiQm0MTH6fK7mIDEisltkVaAt0X/2LQ7QED6y6a2D2xE0VLE7e/08LiQpIi3j3EePNvDJ4+x97d+4h3XmPy7RHOtyIG66iy3katAh8FiX0ZsGCiqn7GJ+1Fa44nMsf2RVUDAyHbppafUTL6iZ3cpw56z3KvqwDLnXbEe+nd1iHe7R5ia+0F0plpzF6axdzCRZxbnEc+dw7Z/DnYzDGcbGKdYGBcwdWeDCeBDF4aWdBwQJcrTJRQQ4SqkWKr3pDSnMug15lZYpIAVKJ1wcJddMaymLTlszISUa5WAXxgMuSDFNuPnuPxTw+xcW8dxcEQ4x4wGRvkJJRYqXXW+7N01gxGzJyR9cihVMItSWWUoTP3Ic5fvIiF69extLKCa58s4tKVS1zZzyYnOBGKuPWr/qeOOSaJcTgnlXOPgQCt/jxXUKk6ye7WgWq6nuKgm8SGf1+/J9R/Eqski8ue6HW84v7+Af7AKzzr7mPzYA/9yKBbDNEn5kfuElN2x+H3sorUUQW7jWHviNsojDBTDR+wMRfA6H1MYbPtjVDtH2G4f4DBzh45BOLy/AXMTufoELBgR9h58gK//nAH+zt9d8/GMSma5rT0OAh8HCbA6vISO/ccDfssbmnaEQtd+luPVFNDWzcC8Ty1PDbwMVQsrbQsliYxVix6RRTncNFJfeQDR7OzhvZ0Q+LPsACjORG37+a5KxJJIlqJ4xLrQhjrC2dhDGekBYHi6ViKdHR+ahLpkuaSdZbo+2r9rEBFLP+nFMaR6pFp4s85kLggsXaHtQLAVd4SmufI6LldehZwU4xQh9pm+9wucoUO3wbqNQzqZJuuu5A21rKh0UAxPN03z5fklnU/PuVbrl2AXRry7JjrG19zVc85BORgAUYpEDLU6cW7a8s/p6klz5LcUAT0cKCK5LcUUwfOX869yz2fonDMCxUWPi02Zpq/sMTV9UBZImwBmNQWfppnVOMagCGAVlnBqolHZyf/4DxbCodkw5uRg5dbDwx2GYP/AAAA//+0XW1vFFUUfuZld7a7XdpCESjSoFYkIlFriIk28S/4jf+q4YsxQYxvEZu2UESoUl4KC91td2dn5l5zzj3nzp3y4ifnS5s2nd3O3pl7nnOel7Rxcu9eXsrFdwDU5VRWXg+nOZchjcV3eWgTNkdNJnR60aSQhwYUtIm5HGTjswqnnBns3DsZ0MnihDQRGByiafBg5cPSFAOOwRHaShyHC9v4Sb36GxzNkIS4gOpir2RxaASe4egb6xcz1LxBNjymAqVt7/yvkYCZZOvrNN456mqEQ+Iny+7a166jCgj5Joyd9jVqxZy5rYtJGydsqKGdPqLaHIyc7q6RS+pyJNWoIpEOWUu6oGzQMXENEGeo+OZWkUbq+TSDsvJT+3BarzGDbHgfRCtRD4S1MWIEou/HBOYaeg3c7wm41m6gtPA19z6RaEMuzH1sHmkDa8aEdizpWg+HuTSeIHpEpyEyQWQOfc+NGb4f3HlyNaesKoyLonFueVN1PnmYU24UAOs9IrmiVU0Pc7IE97BT+pOj77fEIyLjh79fF+JBEL6O6m2V6QD/cHPXpJCHDgJpAK0h12SpGJzzeas64lEbJ/xz8QNR1sPRDZM/u4D94/Tazvil3z+GfFJ5g5JImDHT6RhFmuHtlbM8CY0mU2ZIEB0mUT2d5OLTJ59WwEKSYXd9C8evrCI7Q1P0wm/q0zJHNTrE8PEzmH4b2WwXrW7CE/aCK/OIC63K2gbYZgCQT0A9Z84BJ22XJWstizwyGJsKD5/v4N5kiFv7T3Bh9gQu909jCTN4Cx30Y7CZWCZ+8N6BWpCBka+xF6TXr22DvksIKtQmozKa0JKwBwFfdmqgwEW1MYCJXSTO7Fwbs3MLOLv8Dj7/cg1fX72KvzZv4+76Fq5f+xb379xm6UAk+fxMrxRdPk3G+SpbYQMIaEkCAPymvg/xOzLbYZ8AcmA/HgMH/+RY/+YG7m5s48LaJzj36UV0T/dhex0MSdPe7rLMxu3lUaOMr/cM3UuOavCc3tiI6Zd7rhELpEAnytCNZtDHDKbPDjHYeYSt7R3c+W0Du+u7sEMCHJT0kCIvKhfjFjnpBNOgjfGZ3zVAFB+YIA/cA0LUEicjhoDnP7iI1S/WcGXtK7z/8SUsrSxjpt/z5/PMcZHa/S94/6XDgX8C/uQC/jeAn/I9/DC4h+ujBzjo00SxBZtaNq+siGlGTRqi2UYv9axeeRzVUOpkx4gpYHjEmvZlnYQwlmixaFriYLiPyWCE1JD0pxDNAzVNWuzL004SzCUZujZCd5Jjsn0bgz+28eLmJuIHj9B9OsA8ScJobymmLLtRZktJsgwbN6IGCwUXkRHlY1w3ISN4zxc9ooYBrfEO8687pByu/74R0vnfDQDvbyEMlWlu0JGpc0xqDJqajgd4vLePvc37mDlzDIvvnsXiyjn0Ts2jd3KeTQRbxzqoUrBfAm9LQos3ka5h4yVwXDuhEMle5iSLsXMVz6djXy+mzHh0Ekv1AlBTW8cPdM9xK4aZnAwxLrkp14kS9MoOBnf28PN3v+LWjZuYPslZ40+NAW7YWMcENMKkhLCAfNpJwMQJr6Re34JM26qIjWc72Sz6C4v4aPUKVi5dxoern+HU8jKW3iNTvrYH7vS1MMDEVtw8yGTvCM9tbfOe4PfxmpCicAL+yjlb8JyFXi+VTQp8LiS7n6rT/SjBEAYPcYD7OMSPzx9i8/AF/iz3MW4Bh7EbXkVMGS6YoRoHAzsI+CXmLUl5SAPtvG0MNz85QjGNeV8guVt+mCMalbBPD1A8HgCjEZZOHsf5xQWc6LXQjUpMng/xy7XvsXHjd4/3TYM70zxoEDtJgblzZ5DOziBp0wR2zKxUwgUFJaTw8En8iqx4aZXwsXhhHa/pWAqYrbqpVxWzirQe0jQKrbFjYQQTUK88nolrIKi4I6llwQiM76aFm/BSPaoAuNvreXY1NNlKZBYqb/Vmz2ksunFXa3Z7XT+QDNmYihXIaDo0g4vU/E1wDhUfYY3mGiTq62WFeWPkHncx3foera0xlWPqutqCJtY6bCu9yWLiY69JEpZKMpozuq59oCDDXuvjp+vIPa3/1bOKG8BcELQCSYbEXsqwQPFGSKkPj0jMA1skTRBvgqPFC5shigk2/b36tpUkBpOaI0wCaNyqlHJHsiFhEGijxmNWNm13MYZ0qDxA4xqZ0RgYsNJaCe8R9Unz+ID9IFy6AONlHk6LvwXj3YSfx/Q7kpE5aYpjefP/agz+BQAA//+UXWtvFFUYfs7M7GV2u0AjJS2o0AChWI0GiPEWDfwD/4Gf/OoXE/+FH/wD/gN/gcao0S+iLSGApRGlFxRqobfd7u5cjnnf875nzmyJiZs03W6mM7Mz55x5L8/FfPzDp1ah79EERJ9hskloNRH7ZETh2kWReX44vOhStU0ciCzoRdPES78IdwPZU79RE/njbWzYMY6kA5pVXBVTWV1okuPV6gmeIhAanwTKwFSXAKAO+Q8hFTwIyUNfb1SR+wSvEo4IChqRitSZyi6NOpzCw9ABX1XRrE+AKyESBx9RHpFC2miQ6ERXGgGL++XqjuA2bIsGAC0+lMRS1Yc7wEJB8Itiodz5nAdWIpBghaTTvXdJv/XCPaHXpUJuVOEdAr+JBNmhC0qW5TUvzrBq6CpzxqtfamLvryeLyjX8RNTFjjyEjQj2JUk1NtTPXmE9fK0D6kG138h3xluttBqDnoKQeUSAFsYU3QKF8rMQR8E2gLyNKIfqggkp5ujYYti7oBrUfoUFAOMK5TH54sUQ7vpT11/5QpqQl7xgZ8H1ddU+Fe1jbQvhFCl8TAsTejya4nle1NAbrrDixnok482jBgLYGMPkYvdwC4UctRgA4TyXUlHWY7q5lUlRpuECafn6tDib0iDOY/T2EnzzxVd48N0dTJUSQ3kBMIOE0BTCtSbo8U47wbF3ruH0jffxIImxTbQFtsYaoJ/tw3Ypqmhi6qU5hm8mxzrIm8bxL+GKRYW1QbBFa0XM+MwQ4cAPSqGd5KMx8yLTuIE0jzHb6mG2dRznp+cw1+ziDLqYQROnYFg0sMOBK9h3OYbj1iuH07NYIgfdtLLN8/zGtYMaPr9KowF19bf+ZYJUWbv3tO+nG4/wcHUVK/d+w/LSL7h7+xY219dwsLeDcpAhLRN0iNdXjsUR3o1JTVPCUzt6mu6okRsFUM3msbEYNICsARwa4OwbZ7Fw/RpOLs7DzHRgU4PBaMCJJvH7HWi+8AgtXnujwPYqQNjQmE/TDg77feYHUhLebXaR7Y/RGTeR9mNs3dvA+q/3sXbnAbbWdzio5R+GgFfFDRacDETbwuRfc4vMsbS5sEPFskTWCuakJk5tnkQe519ZxJV338Ob129gfmERL89fYPg1P07+o8lUFcyfHyz/n+47ULeHdIU3ErqzzPvdNsBNFPhpuIkfH67isT3EqJPAdJss9MeoBLGVZb44u4xYD09GrfAZ2ixVAXPNGpbjikAUkd04HKKIY4hRhmOtFOP9PkOM8yF1focos5Lh/c12yq4loPetBF0bY9rGiJ48hV17jMOVP7B7cwnlxt9o9Ifo2Qit8QhqAGdEE4PPjbphVCjKVSE5ZjRBKdQkVyCg+505eLiIlJXiQhSX6sxRMrVEc75WbH0DHXKrtSieMZw3EAU05RGER6Hcg4nPQ1SmNjwwWYCwEdOXrFAYKZkf0W9Sxj+RYvrMLE6dfxHd2ZNMEeieeQFFCkRTDVIsQpw2MC6GsOTBbt38YxV6E+juWIEJEyYncl1YTmBkm9LUfbI1UWL4K4kAtpv8XD3cH7DF5lz7BJp7Gdq7Ge5+v4ylr5exvfaMM1y6ju3Y1FAYky4atWtExUA0eNWinxxOWLJk1KtF3kgwe3EBr169itevXcGFy5dw8fICer3j6HW7GGclmu0Kdq+aGmGBJp6YvEemozxMjnb4ZQ/hWhNQZbWBSvGX5THmjjsWYUYalfu2RN9E3On/R9T8f8cO7g8eYXVrHU+LIfZJNzKJnBNLElXaPISKKssjCEIE8HkuAtCzn24nzQtKwJMmplptJPSFRhmK/hiDv7Zx+Ocm8u0tIN/D268t4IOFi3jr3Glc6rTx5Odb+PKzz3H72xW3fx4XDYEpS1NCcHJ0EXaJen2phw8/+QjxuRk8wxAjcrOQhya5ECRqmUfFAOPiKxU3LjQ+YqqhNAE4EU28BpERYUAo4lhQlS5OKmrzSlEDCOIe7a7X4PaBJV7oNqDba26h2zoEQOLjYv1/J2RnfFynMG5GMAhy1yOrS4FyS5FBdQYYeczoXFT2tsLdD2nUZiIm1W25gcii52WNRs0WfoEGlL4UHc30XIkRWdjc2BoidtLuW3MmlwhXuULu30eesx/mhbp/UmqlZhgl1vR78vyszb3mW2gjnnjhQJcTUZJ8cODyCop9CTmteY8/PuWoUtxxc1cabMG88QUkdpAjpIlDKXJxgO6rIHHDz7UIw/uQHExtidM25Y5K3SUUab3oTE8wtZQMnRuquEByTdZ1o/OnYqZhmjkA/AsAAP//vF1bbxtFFP724ts6V3JpsYKiihARUIhUISGKkELhhT/MMy+8BAFVqOpUaWkSgiFXx3V83Z1ZdM7MmR07VJQXVopiyVG83p05ey7fhb+9D7vgExGhG3qocFJsuLo6NIrfoWddFzrF+NCdRO4pKvqHFP+08FPLXc+yAmbjw7FhIRWx57UPyyeTG2qmisr5kU/DkIOwEO+IrblhvBQAACAASURBVFI584diCrBVA7Gwk22B6tSShB8q9D3qSYIRWQtN8W0mA6YHAaOFTt0ngeDQJDqIvM0Yug0lHbNMKa+ANsV4KSo5WDwJdrBabhy5Ik6sTUj4Qvw9HZfcQvxp4cZWTEN798PxdNw018BuRPXfBCXznojmifBGHE0K/ElhKQFCFLfFyte3nZNuZDiVyLpJdJa6DeqvRT+JBGsaGEKurDMShKIGi8C8yPpChAiNBgXstLAIWCwyYzt1co60yUmxt9fvu/Un1ih0bTnolouGlb/GSZhF0BH0kJHOY4mte5SD+/vfI7ZNGxYx8SBkwkGbWMOptkJ72qFURHcjLBWUG/oseYjxmgmLIFNMTLXrYsMmII6SE3kcKPszYiVaW8SrSYRMQaEQddcCuRB6fxNYlwqGbKfZxINDrnUeyNTbNhEIjlqJsLGzhZOfXyDopoAfp+5A5cnWS+Nyv4n17W3M3FtFvxxhiJQTzVhbi6lOD8NKG1l11uwd2mtR6IRjiPfokjWG5huBIcWwVGsfGRk8vKL9UquwjsANcryOFFq9cyykXTztXWKllGAlqKJRqeP9uRWsVWa5IVAPTCOArlHNQo8rBoHLv33WhcY/T4ZU4PHN5XSnfoeYfO2uuVdOLjfeZVu5z3Z38e35Oa7OL3D4vIn9/Sd4/vQAh/tNXLYuMB6ScF2OQA+5AVDjKUTOXuqO03fnLA2OO7A/YhpG37OsTGFEaVXrx2O0L9rYePQJPvhiB6XVOczM1XGb9aCJwhGHrgZyqLJQT9qZ8e0KkQ1SpOM+IkUcf9roMaqDEFlrhL+OfsfJT4f489djdF71QdpSs1yriLCkNnBHr8DwGyd+8S/zKyoASqGV9tNG6o2iHKniU8L90cc7+PLxLh598zXWP9zCYmONk3fqK8XBGxS7/6cjt+toHAc4A7Cfd/Fd+whN1UMryaGSOdfU5VI59GxOdcrF39s2IPzmmR9/OGmSNU1Ff5ox1J8SxmoYY3DVQd4fQVHhPxwzkoT1abIxgjTHQlxFElUQ9VOgfQ19fo2bg5e4/uUZcNpC7aqD+cyITnEhkCqMKdZQPhACA4pHTM0wxo1RrW4SvaDEuUe9nDCSjqiGRO+br9eYhjK2+QKJEZIop6JzJhGm2z5G6YjtU4keWVbKo9UA9XLViFiBBOHq0CyWl3PjKGJpubxw8rDWm/92UEHoKClTDcMI8j/MM5A+V49ypOc9XHeOcPHbH6itzmP5QYNpAUsP7qO+Mo/KfIJRaYx4pmKc86zjClt5RYYPkdMat5ZS1BIksU3jXmNoVJIfib4Qtf8o52ONKYq9ccz+3RRPZ/M6FqMqypcZrpunOPh+D89+eIHaIEBFmcyB44jbm/lb0GGMXrxm4T5CMpS4+XhvfQ3bnz7E54+/wsbOQ6xvbmJ+acYI0DFt1NyvcnSXc+/E+ayeBQLt7eH/tpP5Uzw0CaNwMhEaMy3TNA54sj+yE/5BIEr+KV4HGqf5ACfDW7y8beNo2MXRsI1OlGJAsro0wS1XjW4D5Y/UOGVnKKMZwYOMzKcwFNRRkzDlLI4msC9qdJd4PK8YSpx1+7g962B0dgV100U8ztBYegf3kyrWFhI0kgTDqxaae3s4br7i51xqp/9sEcqW48X95BhAg+oZ4L2tTVSXFzGm2J+HKIVl5CKQHFrkkBZ/99zlpv6Aid4jSpWgJSl3nKg1/Nd2us2q7Z7rkXnvLnwj92oCbSHV7n+FRQ6XWQE/cd3yi3eDKlBuYixLSPIqHz4uItaUNzoHFW6CWL0CPlftqNamkNU84JGiWtDPciibD1L+7DTbpmzGBXHAKvUWAUtIBHiObnSM+2PnoiYFPeXzSivXoCiGYcUAtGyvNWxzQQr/gOuKjCfWvgabEbI2Lgasts9ND+NER00AlRV6B1Jz+Ppg4hig7DCRgSNMIbB1lkdLl2bGNJr9TYesI/oMQbSzthzTdc1ATqjbpEdRoANoEGivj1cvca1qaSV020RzyzVjmNJo7cbZVaFwLHPIQ3u/uXlktfwYlRGXkaYp/ubtWn+jqKL479557KO7ndJai2BqRBJBRWNETSR88BFN+JOJiV+IEBGimAKS0Ki8WmiXbffVnZ2HOeeeM3N3qXx0EqDdQNmdmXvnnN/5PRwAII2O7wCuR42+2OoC+XT0Cu0SaLRCMCXiTCfl6tJOD4hZWcw1UY5CM9/oVzehuHfqwmbdehTNNSJ6c2uCgE7/WSsiFBsrWYtsPKb+AoQgTjM52YGLU5BpNP09ooVTBI0PSCyam5mKUi+fx7v5GI1cRPQFHXPvwVZIDzwDnCrHMssq1KkQGg/TzoUGriCBbmZWot2gU24GUzztyoLpot4nxoihh7wWvKao82MSudmk91eGlUkcS5oXro0xfk6+/By9nrM6WeGViECl01V6F7e56IblpBJO/6LO/dYDMPzPpAd7HciiiJj76RBRug7D0ZBfZx3OMSZ28IxSdKJBP88VOFG1uBRBpq8VMCsW3Il0TfD183Rwbr3U508jNxVAUKQ2E6ZLsxVX1H/NhvWPwFoPbayLcKjPgqxnd2/X8oiMDZEKp5WydbEOYK7RZ/ododrWCng075ugdG1l5rRaS+5+53FRUa0XR9e0rNt2FCaL1Fo2sFrfPI3+3W20uHCQrPuynsao8VacF2gPxnj26+/oXvkBPaqhQ8uOwJZAIXYon6HsDTBp7LPgMAi67OQcGJfZXOZ1MWaEi8zXhNaIdRNsUzowA2rO4iI7HF22AUyiHGk2wCAb4Z9ZgHtpjBvjZ1hrd7AatHC6cwIn4wQrCHAKDawiwCpCtAIxmvOKTTd1fl2lK/ozn/YqR1B46LT3eug8rJ17cyETxsBw7jT9evf987j8/RU839vH3Qfb+O3Wbdy+fh3b97ew//gRiukQeRDBZimbkKnT/Ry7p/qqnvzrd8psUI3rEgFwDw9x5+k1PLm7jQvffYnkg020TnYwYYNU55rrA67UtDvmiDgp8BTfolFEaNDcz0TAMEP+IsX2rS3cu/kHnj3YQzAGmjnFNxrYzNH7jdegBeV8068P0sXmH9L8GwF+S2n8qaha3VjH2Y8/xFfffoMLly5h88wZJMsnuFkkMCqWyV4hk70cC0DN/8P752J8KJT/W5jg2uAR7oz30KOoRqJC0P3eCOccyHkfoVfI2IEbP+vF4JY4BvefO16JZhUDOW38acq/RFnZxjJ1OB7PYEZTFOQ2Tc9q0uwXBhGxwmj9kdNzf4zR9t8YPvwL6dafwGgMM03RNRadoIlWu4HMRvxZw41TiDvLaK2tIVruIE4SNJMEy28k6C4vYyXp8oQzaXe4We+QXEjYcAQAkOEUfU8xiwQQNIOIE49SMWgdjEbo9/exu/cCh/0D7O3u4eBlH7s7Oxj0+ni530M+GmE8HGOSzzA7PIAliSA9T4hKy4CgIaIrDyLoGWWPKTr95ldlJ7rG8+oUK6MgdyaUxt1ovHeWlh3jx7MjHAyPcPBkF3G3idabq1jffAsbZ9/h9ID22wlsJ0Sz1cCMjI+HYxRhjjJ09UbkEuArpl2TimoqRkl2RbGyzQYPUpyxrzh4R7HTyyJA24ZoFw10jwLg+Qi/XL2BrZ9u4mi3ZIAukBx9jrJklpaRqbn5D08Mv6ElYCdGaWIk62u48MVnOP/5p7j49WW899E5NJe6CAPL+y4lPjR5gDXlPYFrCURIKwcX/9zXtqyFNOqQKTYWYmp9yv5xR+aBsbxHEihCjT5Q6fjJwO8AOfrI8BSHeDx7iceHPfSOxhgcTRjUmCDDhBgepIeLQkRBk81iKSecxRbGPZ9cbZJzp83BYjnmd+tpKrJEB2ry77mL1KQmnAyWSYpDJ2zwoo905xDT3gAmLdBttLCxsoJTSYKT3Q7CbILdB/fx89UfsbOTYkV6gkIkNQSqKydV91X2YAwtzl38hH0AZgTIw7GMqDEvZlNmzThhmMqHamYvG6NJXcrNYFFWRs2svS9qhrNLawqruqaim4v8M/eGc4VnDm4rn6RXB4LH9TCaEJB5JsnHHbwPZoVo+XNnCEdrRYw3fZYBKqaGSwaYptOKuakUc9cvHDe09FZLOR9daDy/MR026uCRKfZRWEUF0te+ybdj8Dqpdj5LqwYWqGvExffB+4L0c35vqQyBrKhNzwsZzBLDNxQ5rJEIa3/I6fdAiwebP6rRKJ+nWk6hA0cGxiR+nSUF3vDU70Xde50/p2rs57wYXJOu/ydLwcWzwDFAatBK/e/oH1XDXPqTfOrkvGi0qm/8SL2PDoHj2BuYLnxuHdRr38ADFAD/AgAA//+kXVlvE1cU/u6dsT2xE4dsbTE7gtLlgYJEN1VFFQ/9B/2p7UNfKlVpq/LAA4JCVVAJJDGOsxjvnq06554zc+3krZGiKHYSOzN37pzznW8JffQpF8OIolHIXLyA6lIy0d3ohNOdlHnXf9VwGBHWLU7kjWfGF0hja73MfN9AQjWuNKW2Z5iMMdUy8KeZucvjDkoUhRe1LZuSRFASpuhnLnoqCLzIMjmJdBGy+yVP/7zF5dHJfWQKmEcFFZmLZTNhCYBE/am8gPU6SOcp3LF/oVv2AAg5cSBhx37W/1gjF04Iv8VVgw+l3LnHKgUtKpHXVldQbvZylNQiuegy0T05ECKfi9/ThavTekpn0BhApd+Hgmb5gFJBjVqgTflpBkqtL+lNefE1t+XEP/CiSZQeo9Qc34meZeNawBtbsEAKuUpYMidoPZCpI1FKXUyPW8u5ZraqdMRDA+l3COBRsxcFyhSF44048eMnJUomS8tjWY1KzVKSlJuLvBaZ3OqxL8wOxQ+B5TkEaKVqYlN6BJSAQ843+kRkI/46zTnqcX6ToLxl3vTF+JLYLGripNfJHBCg9LYzNncfGec820AYDakmhNgyz91ZOHDuv0OmU6S2gvr7TVy5fRPtZy9dhrlw3HNZ+caU3RPNBWrTKY7/foH63T2sX72AGTUSpFVmfVXC+wNR24/2O4jShItMyvwOohoDAjlT9EJXbKaOuYAFFq4DaSz/nIuUc2Ao7Y0jAmwo77YWYjiJmUJbI7plPIY5PsKyjbDW72LFVLARhLi41MClxgpaNQIEQqwjwjKqqDJ5VTwDJCoskKZTYTIrz1s4WqhZAA5yOT7+LmWFGmtVrMo/YKAJN7T0SeN5rllHvVnHpeuX8PV393Gw/wP+ffYcD7e38edvv+Kfv57iqN1G3RieylYZvJaGQyaXHO3n9S6uAXEVMVOmJaI0zAwiA4z7OQ4f7eH3zo/46MEXaN2+gZXLa0gbFSQBNR0hx0H5U2fym6FvaTJVTSyqsUE4yTDq9tjU78X2U3RfdJANgMaMosLI4CzkY0C6viCftzHzjyFOSwTdOtVilVthy3FZm801nL/Ywp3P7+Grb7/B1U9u4fz1a4i2PmBfBsqqZ+ZbHIuhrJE4oMr/6Pc9Jl6O4iyfPZUv4F036YPFkI3+gEf5ANuDN3g86qKTTxmYIONc1gcbNTWKORZXo99cvKqkWyxkU+tHPsc8K3WmmhoDAShpckFgaTaLUa9GzN6IJzNgPENtmiOY0X0lR0JmY7OETe76J33ExwNg/xA4HgKdQ+CkB9uooxpFqJMcaHkF65tbWN3YhG020XhvC62bH6K6cg6rG1uoLK8gWm0yDT2KqhwR2axF3AhyKoBcc3rthSgd5ysC1FUxD0RazDNsVLjCee4J0O+9w6D3Drt7u+juv0Xn9WucHBxg980OTg46eLuzg1Gvh0G/R8EYGNI9X8xIVWIQMNiYSyNfHm/1DwhOWavRk6mbofNEwhYJHvR/LNUsRkMyU5zguLuHk1dttJ/vsDRg40YLqxfWsdZaR9is8kSVLlZyjufBCVUwqZPcVYUy7MCwgJv2mJrFChlx1jAaTUSuRXWaQTg1aJg6cBhj7/FLPP55GwdP2py6QV4cgQJ0oYtj9P3BCjmT8SVAtpBAETCYmhDXbnyM+w++x50v7+HTu58x0yFfssW5Crx9lBpdosizk4qYRRuEBfBnFjw+XDwpTnlY+B4RqtPPPc2+fsZwSRuxTt/5+yl6mOAIQxwlCXb6Y/7anQ2Z0t9JxzjMJpiQayHJo2qqH3AvGlQiSWYJ4EKQ8pI5x7V6KhPRjNcjR056bAoynQ2MRNIZJ4dkJgACRFT3EQA0mGF6/A6Tdg/oTYD+iE9WPapw439l7RwuNGpA9wAPf/oFT/54xW91xslQ7hylOD2cocfJALB16zKWtlaR1kOMkzGmJub6iwoEE5R3M8c2cXUepB+gj1pYK2oUrVOLCa4pJ6i0Z/GEm+5h7J7u9itmBXvNP0dCx3HBBDCScsXGi1IbKQNS/4bKNNXJH86LnNeAvycW9a/NitpUp+4UeQupnUjfz40+DbpCO9eE0t6cSRy7PlYOA23hN8C0/nDeNN1n76p0NpBhFsc0W1NIR0mC6gMoZMCnDDGtPel5eh1aNm6vX9yIFrYlafzV+4veq8qnQ5ZuuKQHHm7JgmGAgQBgGkjLe9HzCGEYMFOJwaDTJtZO5uuM1MkTQn0IyGuBjx/9jxyPr3IRJ5MgufRZ79+/z7kkMFd/87BZ+lv9Wni0SQ+jv8uMdjYZkb9DoLPU5JpaoP2R9lc6KFb2SsZy7TJeurhGRNrsegzHemfGQxjgPwAAAP//dF1bbxtVEP52vbte27HdpE0aNS1QVJB4QKRSKUJQKoQEKg/8D34D/wKJF/4F8MBFCAmKxBNSoYhbo1ZVm4ZWuRA7ie1d7zlo5sycPesKP7VJ2sQnu7PzzXwX9gAI4yN0c83RF0wldhe26ughUQdK1WfTPaUgC3CMxHWxkEjB5oE1pzJkUuDAdux19urGyM7gphlr4Q5ZAYZ1xn7q8KnA1oPO2ANFEyQM6AbX/buoYRah1HzwhCv1jvIeYAZafQSbG2ua0gcF/2y60NhKNyntNKzQi1kj6CpP23AgI8zhVJOPSkwdksSdtVKWVK8NmSBRzi69VzULYnAvU0/Vq+h7m4sbavgzKCBXB9E0TbxZShVEfiwCe/UCcDov1/TV8UA1o4Kps4FhR6jVSbyhXlRT0wLXfzbSS51vRCXMkDA2ZPHPuumOJFlCzUloOsvFS4YiVMDYwISKW5I0fl+LQ6howd2HTcfEPIXpP0IrUt0ORfdpQWYGikoCxP+gqoyXi6jxJQEqz/oQGrrXUAXf2w9eVENrDBarnxrcqLFmC62nhi56LjyQi50fhMpTNN8UKomppGDKfaFaMBtotmJh27hvEDc8EhZfZKypA6rMpOjO+zi4vY0fPv0MJ/d20bGZM+wjOVJUcQMaRAkzED5sxRi8/gpW33kLf7c7+HeY48icwJKOnZ5MVenokb02li9uoHf2NPJhH7aT8TalUHZSbL1I04jW2TN6RDvWTAHXi0IbLjLXLGqGEYGdWYnExNy8UyNPALrXynAqzdFvtXG628dyu4tBp8dGWEN0MEDOW8Eh2iwZyAPw0ZHmtbXQzOpmJQkAjIJbBQ461DBi5BeeY6TO1HFzi0Xv/979h7h1+1d889XX+PbzLzDd3UdOejUGKm473Cc6Xjlj4KvO51YYNwqxXVhNJUIB1xASPZv0qiYDBs+u4PL717C2eRGtjVOY5RZHk0NE7YjrHv1OiuMJlvM+snkCczhHsT3G9m938ftPv2B/6zGyiTOJjGx9Rjr1hw7BFn59nnkhz5pCrgEFelbO1eZtnLn0AjavXsXm5iauXHkVF557BoP1s1ocgIUNol1YBz4llQvLS/Cp/yMe+qvPP/HdV1ao64NuK90rY8AxgsVdAD9ihJv7D/Hn+AmOOzGbb9G9FUnkbxlZH6kaccNb+meJYxbV9csz8GKRvVG9SBJf71WrqVGOXC+yGCekvZwbLKU5yvExqlnBWv/W0QwJmYsdjHkzUhydACdTgHT/05njC1PuPw1UWjFWBn3eyJ87t47+0hL6K8sYrK7BUn/R72FO295+j5cKbbgNNOVT0zBq2OqBHGMoFaBrCYBm6JFe07jcfWK6ZKjTAlLUf4/t00OXcOAWvjQGTucnljW61MAWfC6Pdh5hZ2cbW3e2cP/hA/x1ZwuPdx5h98EDzPb2kJYTZGWBbuQ21h0G2UbM6BwDg8r+3DqwkUqJjWxtrmiDwYTx/XHkIh3FUI42sSXVfsq5X1/B2Uvn0d84g+Eza1jaWIXpxBxzMo9nqFAgJ7mkLXjIS7c4gUcekNlKnkstlkkQbTtrpRxhmBwB5v4Uf3x/C1s3f0Z8WCKfufpURc3zM1J7Ikl2Uu0/5dEnGXN+MCvnoNCQzvAMLr/xJq6/9y5eu34N585vYKnfAc2AK5G9uBhC8PAyjGvwlFyrdCrpH+YCrFJ3YHMPtCJekkAj+Gw9dK1kkz8RCv9EjDafwGCMAvso8Q8KPMEx9kaHmJg59o5HTPufmBITQwyNEknexnh2wvJS8uIgf5gqEmNK+TlIIkggkYZ0tQTEAVdl2TDTs5IUlYSAfopyWmJOZmUW7BdEnjbav7A5GSdoxWjbBMm0RDQqUO0eodwd831ZHBzDmikGay2sdyPceOlFvP38BVxe7eL2l9/hk48+xu6dsUuNkPuEyikZF9KP38tSGUZXGBmDgxy48eEHWL3+MkZ0I6bOJd9GRp5T7pnB3CORmywOIMOFpnocOPapaeil1UwvfCmgo3MjDTydj7rr+/5V+rp6W20bsmjuwQItuC5stG8Kvye9p5IXjh2v71e6fSJsXwhoZTwmHwsTr5Sd7Tf1AoAZ/yBc6ApWCkwECV/FcR0N6DBF4ocY3OIFqQGala+YizT21BvqkGORIh/Z2MuOmREU+IE5+VfVAMDqY6DPElMa/6zQzxNG0x7aRoIjBMdo/+19zxh/OXP5MA5R8QXJ2mlpqIs9jYcPI+G95JoHEq6fo485s0I3rAgxkxssOJk3MaFqZrJK5J1ROQ8JvAzdsS28t50sBOm+VIaEv97E6Fv7dPKSof+fvp6uVaoDi8wV7jssMc5zWV5WiKII/wEAAP//fF3LbhxFFD1d3fP2JDM2kbEgERGKWQASbAKRQFlEIAhZIbHhE/gOvoAf4AOQkCKBxAIJFCFWPCJMIDZhgZ1RkBPHQyaTeXR3Nbq37q2qGQ9YshQn6XF3dT3uPffccxgA8NtFhKCo8mWeT33SWchkSxVNUBGfCGGDVGU1qV+mvVSxbQo9CBwyEt9wbNlGSHJNBDh0ATqai4pKBDGLmJ7hBfVigQYRCtGkHkJ/19+7/BU/k6rzrwIAYp9GnEgSgzYBjVe3u8aTFNrzYoPAQyz2AUHnmDItC05p5uoqoCKG8P36Ki6i6v+l9zgNIE25QG+Px07t9VStUiv6/0XPj8fHip1IjK7ydfK+CEkm8MXTbYSaPptMFzYofdeq2upbSmSDdSBJAABU5V+fYRXtR0EtRdAmZB+ZpT7Zd2id9SCUiVoWSoT2CZ0zJhLSq+zJAyROppcBA1ZEzl3LQqfT4cWr4pa5WpDIXHO+q0ErQscjrJ+A7vuWmyiZd3+3iFpa0cEIIoHNBTEcCtL1kOD7KHMv8Fcta2wkwb0i0OqSE4cijWMhFDISXSxXULR8JUvaVpg/ZSlQb8M8KPDrZzfw+9c/oDEWv2fj9p66CLFYoYPWqwTzusGjbobnr13F0fYLuNtp4BhjJM0MZjpjJg1XQiiY67bRPvMU+s9S72sfM0LpE6fgytS9LKwfG4kFVsIS4BaS/0G5nbtD2IsUXIT07vIjl5X/btJBSM4nMOhkda5q95odtJCiV29hq7eBU2kDa/UmusjQQcVWg4Zpwwm66HBqXRO9jYYkqzX5pjYKBQ+4Cm9CcuBe1rLooNBHaS/nqlqgrY7GOW79dBNfXb+Ob7/8Avfu/IFmVXArBomf0bvRyqW8cQFM4hp74RXBNbnWChmxgov1FNuXX8Ur772JdLOLWdOSJBS3pdSJgl0YtOYGx4Mj/H37Lm5/v4PRX0coj6aozUtONJzQovy+WLR1Zem9irQTZJ+nhJb6BOEO7v7GBi5eeg0XL1/Gi5dex7kLF9Dv9Rdaq+LPW54P8VdyAn7Qm1v8cRUA4NsFquiaRFsuBESOUigKm58gwQQp9pn2P8R384f48eEAI1NiSu158t8zCeTKqNcZAoiwGnNlvDCW65tNF/Z+DsrljMojK9i4HYzt5LgybVhkLC0sO2YUkxmmxMQaz9CZWBSPxu6eTIo2a/S4vYqT9zTD6d5pPhuJbk6V4pn2zmYZRqXFlBw7aN1m7swhkIDsITtJjYUbaV21qhQbtQa6NsUpuH8/jRStsmKQrp1mDLY1CIRHwuvKKdEHm05TnWRCGLsY7C/7vWsiXi1VinOxtLw/HGIwGGBvZweDvV38+cvPONjbxfDwHsrHI9Tnli3s1mpOByBjAVZtnXPrW1tbVLCOVlwhDgwM3MtscoyWyrMZrPSd888dg+7WGfSf28L6uU30zm7i1NNdpGtONJCqtGiQn75rGdO6D8N7lauR077WJto/MswfPsLhrQPc+WYXD367i+akgJlYtGRc5kL2igEAneSO9eMI4DkDF9Lrn2W4cvUarr7/Ad54622019eQNuV6y3phnqth+QrDYKwLIlZ33lRG2uEFBKMyriruF5LYJ9FYFd5Ks8CU9A9gOPH/BxMc5mMczkY4nI4wnE9Yo2Z/9gTzeoZpWWBSzDGl85r6vGsp22wmMtfL0lXv83zxPGex3lrNFa7ojM2DiPJCrKAgvYK8Ij7p8Frn8U/ri1px6lmItynpITAnnZD35gzF/RHKwxHs0RjFkykDhb31Jsr0GC8/08e72+dx5fxZNA728enHn+DG5zeRziKBWiv7uxEwlgA3SvjKAsMMqL+0jnc++hD2fB+Pa6VnNlgF1QkMqMQRKMUCABDHW0EpPxS+nMOSixM14dbefJ5z89yvX372NEOj1vC236XYaqUwaQAAIABJREFUzdGYUH5Df1Zht5j9rJ8FhHeXiM4UXauxFN+T3Bu3CEgBTq3ONWephPqusaUK02mbg4IDcQ6kMb4eN8zAlPjWt1XTfm1D7mbMYhzNz5LYpZwtFE9dsqwOVZk/D+jenCp9zvGhsmNXFUJLYUAnIn5YSNuBzxNEnycWktaEnIuKtvD5jr6DeAxgg1OCE+4uWCSY9CDY5YwTdBdv0/3Se1BAQxkimrgrMKbj4HKfKBeI3MqcppyzUo0r/nyfUUsBt47SvJFCI81RLcizMDtp1FQVs5OZ5SBWlsrUzxrOsUC1wfgafTfyWe6LNjKK6Z32GBWGS2vxL29X0xtHEUTf9Hysd9drbxbHCQkSkUDJAZAjEqw4NwSHnFAO4RfmBly5gLghITA2hARjCQgEQxJjk12yH9mvmUZVXdXTOw4cGcmyoux6vmp6ql69eq+UhdfltTLDG0tX0d2kqXRKExH1MlAVffUgLNgaxnWYSVAtTU7s4sT+HDJT+MIHQaJAquChSIT3aTRGmADFQtBWReagowJSxKqIoH+g4vI44Lvui0GqTAIjf0PFNtyHgnMxJSigW5pkvuCnh4JuCgWGn5c1Njj+MritqIQOB0MOytiUCvmsvC9JVDXnjAMhD7IX0y4yq9pTMT7NPXpXBnMpsEGLkF5nCmRF9nRh0odZ0TK9Pio8F1KEnieYod18XjznjgIeBWr5CGaxdDxE2QpVWw/ITKo6EVQxnNB9wlk2OiSSPk/nysVukXjAiRNSci7w6LBTZAtfpCp2WRbDJb0fQq5UQcDqPD78mMe8jGXjXlJsnSn2NEYEXLQLT59tiAhMnCQBYFLIDLJdsBliu0dBHONoMUCqQBeNPOh9HA5HPg6Mj/PFxd/+i8Cn7pfWGY1fTtRE4TSVJKV6C/0+9HGAiwnLL0mH+HZOtXDh8kX8cncf8197SAm1pnO3Af9CDokXv1mB+rjAwfYdnDp9DitpjLF1omw2zjhhtHbiuIO9AUY2ZhEWsotb6qw4gJPOw44dRVK59EBwnGXt9V9iVH4+WhlCwf+VwoyOdk9sqwGBTqR4PC/Qzcc8d3lEtDhCiMcxstGh27/QgVeXlrigadbc73ZtGfU0w0qyzFAAGcksA1hBwj9rqGGVgQKgYQQYUL/poJjUxEGPN5J5TbJlrRMLiDpGjRTXN9/C1csbuHnrfXxw+zY++fAjTI4PeZ454YTCKWXHoscR+4toyzEOOP2JUEyQmHsZzfUPLe5+/DUO7v2EzffexfrVV9F5sQOSdEhnEQY/P8S9nT38sH0Hxw+OgD7Yu7+VRmwFqswHX2gHBfhiZ7wSSPKJCXsuGrQ6Z3Bx43VsbG3iyvVr2Ni8guXVFdSyuk+KFmUX/6fNB2HhBckQdP9LtoXrPh4L7f8LdPFl7w/cH/yJfmrRn01gs9gDFJE+p7GtnJJZEF9UsJQSnGnumD9EM1fwT5NfBVhNZSaVErSE9sue1xMYYrS1GiwCyRoWzJiR5kMaI09SjGZT/M3jUQYZDJ7UppjMBshHlkcqqGvZ6/XQaDWxRN7HccTAHkEgZDGaRSlapsYig2kRoVtMkeXAX0WKtqmhndTRjurowbBl4CoJ+RKwAINWJNaMJIBoXdIcB9cmZNeEmy4RcWD3VoRq9gIMWFvS9/PIotVexSudNq6/donX/8PDR9jf38PO7jZ+/O4OHux+g+7vDzGeFGiRQv8sd+CeKR0tEn88rMLknC2M6DiJhlAu7y9ae4mVFst7vW7dO3A0nKH/4Ai9h8d4tHcfL5xZx/qFszhz6Sya508hbS8BNsM0tWwXSSJxrHpOomG1DBnZleZAfZxjeHCI33a/x97nu+gfWBbiJLp/Ykq2umpuzD0ghQVffII9C9cHRrPZwtaNd3Dj1k28ubWFsy+d57zIirOKoxNHLN7ITguw/p7lkYcGPetJGU9zeXrI/YGED8kTaiSz+fQsESz1GLzkoIdn6GKEJ8WQi/vuqI+nk2fIbYTBdIwpNXqo4UH6CKTzRP+exZhnNLc9ceCLydlqlqzKCKRmdip3AXOxRHt2Yk3hOezUYEquKVJAVp8v+DW1zFto1twJ20aIuJsNTAnoTxzNnsEk6ixTvjOZcfFvjwaYP+4ifzLCfDhhcJEYPDQC0mk18PL6Gs6ttZD3n2Ln06+w89m3iEq8mzFEXW2ViE4jrtSEI1HypAG88fY1FKebhAqIV7sU9FadL5ykbDUT1MYHFezajFqkZpdaXYnYTKtgc16UDSX6PgQAoOYXCXIzE0Dsi3V8VxnR3KmvOCuFm2ofJTzKm/A7PxRM1vXQazRpWSHFvzoC6Egm2O5vxMekelB6HKHYXeG7xRXHEBEX1DywudQ8kdc58NDNsOfFbOG7kBpD6yDVTJhJUepF6GTzwoWiKRB7Cz0Zrwhsup+X3/tmVCHjgknqBcApZ4Jx93J5uSnFumtclYy73I98M7BQRGJ97e4F206TlTZ31B272e87dGwQ1nRooacaWArEuHrSseWJKZ0SCDJzDc7QgYDqDKeLQjWQa5bTd7jRrmKMqulWjXNmtRDYu+g0sRBzNOsvbHGtnTUPoNUuyxLO+2Nj8A8AAAD//6xdzW7cVBT+ru2xxzOZ/JCUhkKhLSBEF0htBVWREMoiiG4qAY/BG/ASvEF3rNiy6qpqNwSSQolUVSyAVikpJGozzfzaMzY6555zfe1myUhRlCiTOPa99jnf+X5qDAC9uEop58bAFNJktYQBUKFdrJvupo7WoLRf6xgfevSDOoVfX0Z+fz1CcO5o4qz1zuYNQEIm8RIXRFpKRsTyzE3I/ZciZX5jWndZtxNzP14witQITaISJGLD16vr4mzGQKh5iKIvRJGkc+dMNWQTOwZCaFzUiG4Mh44VljzqZ1vC24iW8pPx9WpSZyA3RaKoqHbIZ1JAmno/1sJpXbyJvO+f4F9HHwRosiIUgVMTIJV1KC3GInnWNC4ThM1nbPheA01EE168HqNszmG+ApqaU2r9nq5Ruon4kXgQc0CVndQo7CIRCUydLlYBC9XXxotq0eP0b2oKCGhUJq2RUq6VorqRZq9yFn/OJocKwLHfQSNexj3gfZq99/eaDAAIbcyXAOhUgb0cokoOwfGSspdVAmAfhBKkxTGFoZsuQMADG1Goa1XBJaGVzVFjADjzTj1mzpBVulQJqnl66KDYH+DhrS3s/rCFhWlV2IY6WZNJF08Qad8Z4CCJsLb5KXpXL2OvVaBPDQRNVlBQkrkFAOh/jxNgsYvO2grOvHMOcS9lKcAkz9x1nQs9liarc5UccbTWCRIA/1UGch9Q3416seCU2V4kaiR7ne9HuZ0GsAN3q4XRJLNKX3bfJvffhJkDtA7ocydOLG05irDUTpEUGZZbMU6lPbwSpXg9WcTpdg+vggCCiA0IU40nbMgJOJWAY8Bn8JFu5m3N7TmgLUI0XLqjHPfHuHfnLr6/eRP37t7G5PkzlgUQEyDiwq2EZs4XHu2f14kXG6ZRjLRKpvSMJSYA+VUtBfjwy89w/spFHA372Pv9Lzy8vYPp/hHKoaX60//eCe3pSUR0eVJL7k8W/Suo01iOYUSAN8+9jWufbODytav44KNLeOPd8wg6CUwQy4HPOLM/DDXQ0R/Jn7Ac/m8GgBQhFgCofq7kGWfEU/9MmhbK+N/FBNuTA/w4eY7HxQBHwyPE3ZSnt+Pp2DFpwpm40Ad1p3+d3ENjguWljL1SIkA1clZpn7SWVR7gx/i6SDmV3ZSWZeCzM7qdLgbjIdPkY8pRpvtxFLGzfykaZbovkUZ1SqyPuFUvaglkJf8XIwUpQgYOWgxMRiiyGbomQjidY31phaU4C60EC/MA6ybBGvl2RAkDaKuIkaLk/ZKyLMd6daiePPIkNrXrd8JlNgYvSQQsGGpcExrJlFmfIqMyZ1ngcDbCP0+e4M/7v+LBT9vY2dpiX44XhySTAtrE0Cf2Sy4An7ewWH8ug281wS2FFs+u0t5zjhrYXHau2D+yVwslEJEXAMUHLr91Cmffv4CY0gPWejDdFlppm09EO04YmAynMwT9MfZ+eYA/fr6Pv397jHkfDAq0RdZtGsue4O25sQwrZaTwpJ/YkibGzET4/PoNXP/iBj7e3EB7tYdWGsveqMB5xxz12kbLGgtQWYDae1guzX0mH0N3/ktQm95HjgMM8XTSx7/ZCI9GIxxmYxxnEzbhG5Y5pkHJbBp6Dxke8uSRY8ByJ4+lvUOf250Ug8GA04CIdUl1CEWgKhWcSnYjTQwV7UrH1jVF+4tc2XOhJjcZArX1JkMcroPtg9g2BVKTljT5JBDchBb3y+zzsXwxRnk4AA6HGO4/QznI+DlNhpg0mV9eDLC+EmDj4llsXngNx9u7+O6bb/Fo52nN1FSPrAaxBiJXMcDqpTO48vVXiN47jX4xZDZK6KAaZddYBgDHUhK4bKpaFagPKQJJqtHvFw1Z68vRdKUYSyduwsoJTEKvpyZN6z7Npgf3JIGrz5XdqhIArbu15lS2gvZQUKB0VrGI1avK3RPkeOtpUabGhFXqurvWnvmvsjH9Jl+Pg9JOtJ+yTIR6pDSdY+1ZdKpNzbDWtqHUnLb/qg97ub6bVR4JJ5mo63PfB2y0VmSwYizM4aCKC1epOE/1A+NYHLT2tVkvxHg6jqrkBTeYkqhHev84I88vT04hzBH19WJjeB5qVxIOPT92LZP3k62hVe6rseXWU6GSBdj32drY9WITMm+011G9tFwKhKTi+IwI7Yt5P1GPTqCFMHTp/CjLhNYCJUM440Uy7KVHC0tsCWSIUJYl/gMAAP//hF3La1xVGP/dc+fOK5PJ02ow1iCCgkUwUgluLNqV+6515co/wT/EpVRw1bXQRSVCEV2UYrtJRESxmpY0DYlpcue+jnyvc89MIl4IhAxh7sw537nf4/dIPv/xC88dEF8Hrp50TCxcm7DBY/9+6SRV3H0UeEsZoCjWZbLAiQtvC5JMO0cC6TH/zHa6agIHXGDoorVFV92q2zsfOkIWmCZaaMECLbBoAUlYg9Q1bVFo6mATZPpC6UvnabZ+3tiTP0YC2AbPtFnSQo/SqaLYpiUmHkiblQ56ay6w5zcLvGlHTBMphrfwBpSCbDweywRYeS6hG9eRzeoiMcT2MGw4WUAkhmIb0yAtsao8TfsDv3umoDfufDvtaq94v8w2W5gDaE0P4tQrhMU+q1f3BLHkULE5OgCr1prOkA/2/qxsTwUsJZIqQiWNm5Z7b8kmoiI0PpiM4hIHdECRxN6k/oJDNXJVME54TKOwA4G5/Pq6HdbNzL10+z2OHYNVzV7sxOlcZP+X6IEkiAWDdbLybVSMNgrxom5f6PpfMNEfZAPROtDE3C6DJBEFQMQ5WyQQPThLXUOyEfIzQib2YHQqeGj7qGJ/9HS6qVRP0xYsXmT/pazgnJYJBmfA0e7f+Ombb3H86wEGEyn4LNGuFcqeqaYE/fl55vDPeISNj6/j+M0NPGLlriGEtSoJkycuMT0liYs4P8Tq5ZfFBms8QpM55OxYICiN08kZQ6580vJn/UwDIOyLulHo2WDqdWu+2RliAlL2gOfJQpqGs5QaeGFN9T1pLXJteCaNNls0dqYcSpoKGcHzaPpGZxUc+zjT713X4enepdE81kZL2Bi/iHUsYB09LAL8M6biqxbLPkNaJSo2iEQ8wGt1jbXlm5QFDvafYvv2d7j11U3s3P0eQ9+wzkFVTVhSq0ItdlCJOBw00WDeOMmcuPgkWEbROUJ2ZGcOGBLkNAGOjnIMfSIwf/Xy50ZIxMnOYMWknmWc8ifo9/pc8PIZVOmkj4pmiqPRAG+9t4mta9eweXUL77y7hbm5IXugJ0kyVYyfL+CmG9bnr5n/+K9ewf82AEx9Imnx3uEV8f2laCORsb/YH7zA/cljPDzcx14zweMmR9XvoHYVoymoQKlVEJG/L5p+6ETUz0yQjD8b66kYCsDO6phHzM3Vsgi0PbOQ5US3mIR1hzYKEdEz7EwS/q8PhXGjTTNrwLNuBZ3rzgU+ZfDcjuKVzxXvwpSeqXRJGibOw6zHXHV6bR4ZXnIDzJUN1sfLWO0OsN6ZZ/eORfSxCMdoGmoI9DSSDVGTzhT3MQ7Ln1v0GOCOaK+2DaK2sTN9TUrPBePvf/6Ghw/u4e6d2/jlwX082tlFcgIMSd/ACaJjyBMwEZetFEJvgmzQIpfZVxEKwbHKvcVso0J2QgWiKrFyHr1BiqVLq1i9vIaVV9cwXFvCaG0ZdZZgZXWF3Rue/7GH3R/uYe/nHfjDnCvrnn4wk3U7HwoUa2IJRmJeeV0ip/vvZdj64DpufPIp3t68itdefyWAUuQ4bmT8T41KOrOUCGPNPkYGeFmUgp5fxLlnXQxByJDy/h6AJzjBPo6wd3qAZ2cneHL0jKf6BU1mqQBNUxZ9bVJxAiDHGV4nyhXZfSZh+lBRiY2vNN7TczkAAv21VtHtMuhBcZPLy/uFwtZJ0XE2mXBciVJ8KuhbgqxXVVD8dtFg5EKaa4TmIUvHMdHNKB7yCuXRCfLDY1QHxzz9J+5/r0jYbcV1e+zYs7KygHGvwRvrc3j/8gu4UhW48+VNbH+9jW7e0lr8BagY2/CnJPi4nOKjz25g4cMreDqqkSPnZ2iXfMu9rJ7knU2gpYl+S8vdNgh9HQ0sCflh09rZAU6cd9jE1UW1DNcEE6Voqo0xU3UJncGIjFL43LGrlptGUMeOAeJUlYapNt+H6mvRvQoUvLXdNkE96GDAoOw2/LKcy7j/RuG1HJnvVZ9HltcaRN6ubioDS5mI11M5vtkIGj05fE/R52ObbRUQt9zQbBT5s1atW0ITCZFD0QHdfhb+n+vCTicMgCD99SmdMY6PynLSjBtoJmQY72+zNKwLoWwYpcO+HxtaVX663onrO7tMC8DW2TTh5DUZdNLFjl8anybkaA5rVvAHPR1zoFA0OFvIzwhK8p6lZ4mikW39WgQy2QdK4W8OfRddsp7SrKCBtCB8OyiKEv8CAAD//6xdS2/cVBT+fP2YV2hJJilJo5aHQIIFqyJVSAhUNgjBErawZMFP4J+wYVmEhNiA+AMIShaotBWRoFSVSgsNJJRkksyMx77ovK6v3ZQVs0mUKJF9bV+f853vkXz43Uf+4OAARS/ji+dsws60lTwgaBbDJE1/hNCU82AMZ87xdJBC/dBJYQdpMy2OGLtVQW9sTX6tWnJ+CL1Md017E6bXdpGI0qWLbo2ppAtoZro5J6qxmiEwVsgQgGAIV1V3MyQbRDFmDXQ9AGIDwKQTDcIv0Gj6DAMpFnLepEHpMgwEWTPPATkOu+Hs5lsom6BWD4FY09/aX5Os9cDHxoguacw/LIEhiehMcZzGI2nfUa69aT1Do0BOleQhEDESLHIvGO3p38i5CHWrQd/kPjN9vBWctqHSy89M+gyYsgeFNgnaIOwrtAGlTY2kGAt1eTUmgG3+bHComx0DInW7oG+Op5S/96LtMo2OvaCN+ooohvGkNWSqYWSqZcaT9ExJFJ9M3E1fxqyButbnNNL0Rc6yAelkUEDBgBPQYT5W3yDDXn0+ckVQ+fmtxH/Apn0NtUwBKAXomNqmoEkaaG2iD6MGgNYmII918z/iBlgWpAEAaELj0j6/hE+5AuUfD3Dv259w9etvUN+tmMZuFENrIGL6LU1xKforefYc1t5+A38/McZenmHiPOZOrh+5ivtSy0/SAg57WN08g/G5s8hPjzApj7kpTNRsdFYJICCFXtJiAMSoewCl0sZ1N4mQ/vj5SbxFVjbSDWN0TI8b/bQ0YwJUEhDB6wsDypQVU8m03muevcQ6uTbvWI89J3+Ccs7655FPcapKsZmO8NTSGM+PN/D0aBnn8yWc4omnCyyBwkvDnahZlzMqMxXUyYKdsynf+/b2Nj775GN8dfkyqv1DnE5zeGbXlKJ91gmksSvqeILNh+vC76F6QZpQpsr4oKUU87PmGALzxGiv7YA9LjAMvKKGxruMdYRUaC+vreLia69wfN/FS69iZXMDSVpgkA34v1CTbHTPR/E+vG9f34ef+f8PAGAwQ298iUlLcATP0WUznV7eRIlr8x1s7d7Drek+/vIl5j0HT+5whdBmSMdZ6XE7BdCcxa+2pGINwGwSKYlTamJ14/NumGppmFzIRCwL05Y44o5OJUj8DDil7OxoLarW9CiaxBj13kOBhTLIpWLSRet61BreaH4nxhDQd4qbLjAgg71ZjZXeCEsVcKboY603xPrS41jvj3A2HTIgMECBPn91LbPAVGM3E23lU4uxDIyY9qcrIjmJIRKzVzgbXmUFR9URdu/fwfb1q7i+9T1+vHIFt67dQLl/iGxeCwWf6ildctYgJ6FrDpacZrjXLLXsdxU3FOITYIaBnILDNReQD3vIlodYWidWwDpWNlZ575/s7OL2DzdwfGcH+aRGUTbTfvcf4IbQvXuY690+d8ALL13AO++9j0tvvoWVjQ1kAx2cxNKLRAGAhNFzATN0ryITxqkaHS4iOv8OSvyGQ/w62cMvB7v4eW8Hv88OcJQu2FNmSlRoemZ48pyybJF187nEQUoEb/Me5eaCgMmiH3TNHOnbqTG7yUfycx/qY26qmB4trJnhYInjiolCTEw3+l4GWKk2bbK3230+7zQFwbxOI2DZpI0YCrRUZEqbku+Mh5vM2Kdh9ucDzO7vIflnhh75rTjSxFeYVhVWV1cw6juMixoXnhnjxX6Gm59/ga1Pv8T0LjAik7S6ij0Wm3eFfoiJsp8B519+Dq9/8C4On3wMe9kUs0Tq2txnLQBAGqoqeJ1wOKR6VpGks4o8lWQN6hDLbIO9UP/XzfDBDI65prR3LF2z2SJo1LvGfraOQJtmH+8zNm2Ggv8G3gRWim+m8yZLNnYmlJnKufVaN9ikWxjLi+g8EQZoZloIHcBZ0x1q0vh+QKbT45L3ZzO5czpAo/U20KArjQbX/Wkk2a01vUoABe7zvAv7aVXVD/UiNU5uWq1XNGls+LnWmMF3JkF74KrvmxA7ruCGAQCBBWMgh9VPkY9Y92OMt6DLVxkJJaAVRS8MGs1snRm+pQySDYASA2/pA+NjjfuD+NwF0BJvDru/WobmNuQ1AEuNwbsgH10XSWcgPx5iIxkLr0KW5/gXAAD//5xd2YocVRj+TlV1T2+zdOJMxjjGyBANOErEgIIBIXqllxIfwMfwBXwGr3wFLxW88cILE1ADRmMwgQzEjFlmkpleprs2+bdTpyodEAtCD6Sru/qcU6f+5VsS4pNQ8pIXma/AcGeRH4qQzb8IfAobh4dnzGZ8XjoeeyeAMNjyC04r9Gk212JBdcNY8i8wjpaHiptXJCfJNLGhlydx6E1tPICGl9oRrrwxqTpYBBCWSH3Y0ViUdbh7ODlRrYJY1CgA4jG6IEwLkv9SVeatehNFSe07YeIlAVyFuqCxWnp4CE2RM/xKoNpVt7W5gI0XFP4ff2+AYLDNrLmBWUdaqonCZa49uBqem5bwlKo2a8WMlm4MfI1J1c1vHmXAk6mtF6p0T6a8kO3h5StuUaQdZuc562HyXyhniG1SVEOiQMpJHPtyZpluIBX3j/ijFjASvIb8bevjUmBG/DdSuz+eM8TP+PwuKAzZ+HpF+MZaet6R6bzP5/Vuvf8MTf4L9VU14T+/vtSOzlA4USt+7ncJFDCw5tOuc6pWmYXCzO13GTXDNVR0/bpgPqyrUWdoLUwmIw9vEuXV4J7IFu8rdoznEywP+jh48hS9PrCxcxbbjw9x6/tfcHwoOUwoYhdaMNHf1H+f7j3A0c+/Y3DxAqbrQ4ySoHIeS3BI8EfMyFd8hCO65woRvYpXRWizUK5XmWphxeYmnCKu9IrzRV7Ke8pg37TrbMKBSxOgKtUvt6w2+SRpV+/zFWTpdrPYl4BEuZBjr5I4yzmtdtc/QHm+DRHGsFSy2FrCxEnSeFSWeFiOceN4iu/u/80Q6NOtHs6unMDOxkvYjoc4gyW84IC1WCDGXiRQk5UWc9PmWGoVeOWtc/j8yy+w8c5r+Oarrxn6u06cykyD5VKh6gzFXZQJF14PQAoN4jmeCx6Z57atEBxfAEL1at3UcIWRhVzkEq7806eXvQ7O7ZzHu5fexwcfXcabb1/A6upQqvC8F9N8ZmzLGC32fPiPx/8/c/Eh+gbs0qDQZeEkO5BKxB94ghvjPfy5/wD/ZDPsFylyEpairkOcI2vNGH4Z5xFc7rxrBIujmWVW9KwyWkULi/w93NwH0OiwGc2HuP6Ld385YkNxBIlhURdpF8qOpw8KHL1QgUARcK9fMBcYLIiygrztEZoUUiLF64UC4aLi4RIHv6DucOkwS+Zw6TF2x4foTBz6R/ew7GKslQm2VoZ4ebiOVdfGqaSPE+hiDUusv9EXJ3pGvjgVZYy9JKV7xvQhhEzXtARc4402ZmAkPn8SBfPD069j89QWLl66jL9u38RP137Ab9eu4ta169i/s4vORIT22mrD6aAt8aj6/tKsBG2cilLt7nIkzikLW+gBVtCg+5F44ZPRDAd7B7h78zY2Nk+im3Rw9OgJ4kmKbFSgn8i9Dx3mTDJ2RWDU504KHETWirB5ZhufXPkUH392Ba+eP4f+SteLkUbNsbI9UOcxFhkPFhZ87ISzv8vFsSnuzB/izqM93H10T4T5yHHHpSjaCbCcYObaKOlvelBQQZzWPll6UvFU11qaC2yCrNz42ejELYNhyBEU6ZoJUgaRf07yfq+2z6TV49RjnahlrM1ARWenhT79jZT49JY6GB2OMFgZiPAkxT1cuJM9nnV06J6kRDPPa/dlotbbmcZ3CSUsVkDl65lhfDgFDkYoyV5zfwT3dAo3o7i5y1Sc9lIXJzdfVGpYilPDNWy1O7j/63Vc/fZHHN7noUPRKFta8h8Wfqj/1F1r4Y0P30N+ssdvSlhwlpaUQ5gfSmxlOgf6b8Fjw5J1iWtEQrtIAAAgAElEQVTrnX5DA4Rwf4GU59JkiuMq+U9TDAbLHLNafEeUvFiTS+74JrFXuPcU1Qbc3gqmrFav51qjFEFcWOvs6rmU/JttskHBuz1BBVMxIA/sBq2BR+cYqtmZor0WFJoxqMD/JccjvR6JHYUSUEmUIkDT1gfcvotePXLWFwKKmo6DiM9VKOMWux2Ec1tdU7MoFh5GL6OxJCQk2RbG2kBjXj0hqktxBsgXiNDXrdzrY8HXGfxGo0QYWlhQ2KTNNkKv3+cGTcwCJdLcEVR61dTiWD0QYOexDOzQWR+JUA+hNWRgN0kCnbxWOQCVfIYsqHlv0HtY4nF1U2jQMKriDAkaEipDmqokLj4eT/AvY9fyGlcVxn/ffaaT2EArKnTRFt1EaqUtVTcKggg+luLGZQUR3LgWwf/GXcGdC9GVoLirDxTaCKYxJZOmecx0JnMfR77XuWfipoFhQphMJuee893v8XvkNz9+46tONmSlPC/r9pSlW/HlEW7vAmopBUBUpI37yB/OO0dxYilQJPugsmFOUK/UClcOugmIhsm/imSQQXha4QHnpg3gG3CAQuntSvj2BsVpE46UHkrlsASEWOg6PEanbYMSbkx84obQyb9sAuvq6gJTBPI55EX5jKTCbM6NTw54+tybjZ507xLrCymcTFiO311pARQtQRzGLaIkTROpAw6V9wZEnwQU2TexYA920MJSF9SPAL+vB0YktU1c8whhHxoBjkRwP9A8SxROBZ6sAcrXJe4JuSlSnNrltmdc78A/v1pGaaGbmX+0r1duaxbM/si75oiT1qHpIjoLUtAirmX6d0KiuOo/+1/w8PVPtCZy8+jXn/Xa5bepPpGiCNQT/RQyxFASVW0ii7EhyEVkZVye0q6ZNoRcV4LMaYMMpeDJMJ/DiCLpbMKWUZw2nUYh6I2yj001bZYphcFpH20U3VTxFOFOVTVm85k25RZtXCdFKPRxr6lEgRYUfmNTpwhNACOcPKSBeAiE7Nnb2qST7Wb4rFV1LV3n2fERxjvHUhymnNte7YLVHiaoXV4z77B4fIK1s+dRnD8nXE3R9uP/0xJzQTrZHm1nCzSTRuBZ3Bxlmo8W5SRFk3LUyY7q8nUVdFSw/LNXMaxgWg1xb1nR7zGMrOmnNj+5JH8wNFGKpvEbggqFKtdLIHOkZ5+bDTwRdhs/gY9JvPJY1WOlHiEjlcYT5AtTuDi+cXOsKjHNgojCHeUd9qjBTj/DP9ND/Lm7jTv372JSAFO24CtGmJHaOUkSL0gjko57ToVAYLmg6uoaz7+8gWvXr+PRwSNs3tvUe0XMDQcoZMqe9xQvOF5XrmmQJkAl4lQhwrbja5MmACXf+fu2wh0OorR9Zn0dL736Cj765BZuffYp3nr/HVze2EA9GqEqRxozgk0WoMr3xSmx0if5Or2vn/wXh2894vZRYVyL/SPj9TNceUsKmg4/Trbxw/7f+H68iTuzh9jJWoyLFu2oQrm2IolDRyxE1og+CE9YcjsDDkWEF/9wEcuEVrLk+DNM+FNhK6JBkdshsTpF0bFy5s134W8urBHZx4ZtmeWmL5FjwS4kQfc2P9iqTCw1oecm+BmyGCDFg6g4a3KcaWk0TCDJedUadANlBlHW1/DE1mMu89cZwcbK71QXmLNSdJ5hmnU46ObYa+Z4cDLB9vQYf413cO/hLjb3d/GgmWK/7LCHOQ6pwYQIU+TsQ4I5KCI0XDG+OYXw6JP6Zim6ULovpH0lCDF2MmCqi3rY8xpUyKsRzj37DDauXcXVGzfw4pUruHDxEhqB8gfsTSZmJachLMT1Ge5F5NaiZm1H9gybuqmYoDblnPLAfu8V6T/VHs0wGx+jeNwicAE5SFUYKJ/Q5RSFVFO6A0+kW84lRmt4/e138fmXX+C9Dz7EhcsXUa+W1nC0GJc0eNK14uKbKUPHmRb+3Bj7JUzx3cEWbt//Fd/++zt+2tvCH48f4kHW4PAMycS/e6pGtlah50KDIccgVKur2hyzfMof5NPf3ESGDQWQlzmKqkSRa3OzKnNrrmg0oqDPSoskFYGVPEeRia3pSDl02P0bT+YnQ3Eow5Q+NtcpaqoEy/GWixkYbUZszxhJ22hjk2MxryEjRMJkjmZ8iGb3ADiaod2fouxz0QZYNL0U/6vrZ/Xe18zx3GqBS3UBuruJn7/+Bnu/bQtShgVgmdzfU2JDS8MWJrvO7PRy+bUNvPDmTfRPr6EpA5rCG39BbCMpjYA2+YfZ28m+c2i7FZLi836ySHIZ56Av30slDqVbxvIst/qT4UoXYt7KV1sduAwqbsNMR4VKcdb3Zk9OsfB3tKlO2lWjJE5qUwQImW2bFdIy1IKKgXsO3Mcck6KgIP+e02L988cvppGs1KKf4oOhpRwQZFSJImqXCVic8xChNy/s0GtBn1EW477bqPPrxbWg7yNaVGmlSkuNGmZYFvqTZpU1jx2FoZNtf5DE7xCLc631MhuIBrfcdLj/KfFtQbST5sBOr3A3j1iTRYS73udSO3M5Lwaxl1rSazu7f/GUXwbVCXU5NsTNrYEDlIoF6nsPw0rVeIoNhkQ3ztdGhkGeQ1iOrGy/wQqQ741eB6VNeEelp7R7pUXpVZfhYJbhPwAAAP//hF1Li1xFFP7uo3v6NYmTCUnQxJkRshAXghKCIEKCBjcudOPSneAv8FeIoGsh/8Gd6MqVoowaH5CIQojoRIbJzDjdfbvvvSXn1Pmq6vZEvIsZSPed3Ko+VV3nnO+Rvffl+47Julj+SaCMJ8OOP7kuLtpxNKb8aMmScxGyLX+jNH9Dclgy69QGzn+i5k+oFCdBk54idppZQYJBYWAVJypxer7UohPUjxOLc52KT7fS5Lt7pyEmochg3X16RRLKwfs7vOsmwsVj4LjAJyIUhjAZDYK2VfEiBgTVkmFUBt8NXoRFzc2uNBglrEolHyjVJ1m9VOG9NnamNUG1ZG1ooncCCVmF6Ae+CitiTRRGqZfL4O1Me0h+lpzr1W6QjIP3MbFM4UgcJ8UC06BVJJ9t6inUp7X5ck3UHiAPTOMTXohqWTujJ3jOFOkV6Zi93eIw+OczhrUjbrGa6h5wAXMshLVyLKEIYYuZn6dLuum85D4R91ErFaPWpBdFMamLwN+kgmQ554mImDwufq0kGhRMtS2yzmeTCm31rJBRW4dN52xeoVeuhUM87RK5LvCYKm3g7BryJPidto0VDzxnS06/yukqYoe7TQplsu6Vn1rE9VxKMXDWKA9x/+59/PjZ13j0zT7GM3+g6Itnuw2qsENNqTNQYloMsbj8JM7eehnt1S381pyg3Zhg3ojF5lIqRt53Szj3tdiSFeiNBti4ch6jixvonRsDZ4Y4cZUKPHmltFwT7tQCMRzlM0PWoKd7AL1eiWziXJLik8JBw+fDIpvNKdc59yPwUJAU5HjRYSCXQ0mGLuwsuVze3Q/bBFbNxEjmcVC3GIhe4qzBet7D5nCEF57awc0nruIZ9HBB0GA1MGm9NZP6Nhe0PWu0jzd9dIBPPvwItz/4GBt1hrWFF5prFAgYYcWkRaRXmiB1XkuGtNoAzq2v3WrCXKPNM1za2cGN11/DSzdewYvXrmHryra/N9APfPeQBSX3Pwn/6b5+m/w8/Y60w/tfNYG29vZXmgi01qrVxNFzlKWD+bfClhv8jiP8NT3G3skhDpYL7M2OMM0b/CNJxriHqmgVRSNe6TA0hdBEqsVMY3AyGmkyoBagS2/vpwcYg/g3i2Xn2UhpIdWNHEql6VmXjF0IifeRKhFHkVGxYCXnVZIf+kIDUbsmp15QsA6L6yHVGVDtmaSz5eeuDkjAjA4raUyk8a7rIksaH1G8MGj3SFdHu6iNFiD00GbWoPKapAVNtcCaFC3Es3rZqoiaaG2IfeCkyHFhPMHZcoCLozN4en0T54sRzmGklJp1iNVpawKcDkMtbcQuaWHxQhwXE+2Ia6GKvwmFJVFoEm+a9FdurmelX+/+jDvff4s7u7u4t/sd9n65h2r/BL3aC2iG/lFu/09jVB8rWNTWtW8yIgTi90nr4rxymguBnjrTn9b9OAvjk7eX/RLVotIEU5B5Uvw5lu+KDNh+7lm89c67ePWNN7G9taXdYqlHpQiq3HLDOBt+0pZWHJPC2AMAu81DfPHTLh7MDnGc1zgRHZh+roKeNbyieNEv9bk9FdFTqQrtypuQV8/D5VtqWRRFxx7MOxV5G2sv2ivnioHZIC/0PjnfyvqgCGBVdZX91QWo9MJjEmsUJ5Yxs9Ma4thsyvx5vA1NiKV1DUtZ07X33dPkT5IYeU2ev8hV78JNK/RroJlXqI+mStXC4Qz58RxOdADmvqisRQaJ18m6twusa1waFnh+c4Dxn3/g/qef4+FXP6A3bbSQwFXWrBg5iugcrGgyFxre5SGuv30L2zevY7YxwEG5wEzsSAVBUUs+0AY6EpG/zq3SGvxZxaM/F4H/Tx92fj8TkdwtYlrH3Nyu6DHPe6iT5SnIUexN3ifIVCZ+mdnYpZx/5kew8xTRq6kTSrbi0hTQAokle5aIS4fGE3n1Lmqgcc/j83pevt/3OR+r+l0CgVf7bUL4E6FszUmqaDdIkTsk3ez0ikJ3MdEv0D3vIskr+O8x52o7KGbqJaSoZo6zSGD+bPoqumUll3NF6m7ggoVeasvn9yt/jpfYYdPQuxaUQWDeP7NHtGlRx/RkVDhf6COWB8k8SX7lRQmjexmt2+Vv0Ku/b89MmjxRHqEQpftQt5CXzoecpyko7nPOBAGuBfCuULvEu+YUZR/OOfwLAAD//3xdz2tcVRg9977JzHQyIokm0GJFMQQNFaQt6saNC3cuirgTRNwU3Ci4Lv5BLvwHCupCwUVUFCqkkJY0JrZJzTQzk5l5c9+V79e9d9LilOmk6cskue/++L5zzne+6u3P3/uGXfiVQqGNjxjBJV4I09QuQRz3ZTGYrIDxTxcTA0q/KCVaqSWal5ZelpDazZvwYs2BfUaebFG4NAnb7KCZPQeMXTZkz5jyJIXQV3PfjAVjDWWwDe2XCZjbGMZCCWD9OtlHQOsyXBEo5Guz8aGhUyXyQgwxb/YKszMCZVIPdRI3Ew7xAdBFUbBNzpU/d5aXINWdzHmDMQRLkMqgCyikzc7k/9z1QBE+Cuik36dTpjXXIcv9UpUFJy22eYlDvtR4ZybdPm9oq4xBc25TFLUJzQHpdZrbXkRFxfOCpcNMVBzQ8U3qApO2FSwTg0nKiIcoCKEh6VxSAWPtzWVeENUlrbs3d/4S6ZVoxfHBIZ4EXjfR3L4RLsfyMZV5yIFsY2QqmpIpM8WAGcyU89/eyyjyaOYtUetU1cSQyxsKgxsD1Wz8hYnPB8TCw6kJn17PIEHl1cxEAgwDuOrUC1c8AsyDIPC6RjIGtAMq4QKxcKmdR5UzCqMuHiDqu2BmdqrqC8m00KX2WPSV47MxlzW0+h10O8uYHI8xOBox6yRtUxQsaJR1UIk8bdQ05wbDES5evgzXX8ZgNmEJfFCEVb8xqlChzcW1NaYUFFGpB7ll070is0AvzOSMExvZK7wmNSLasfDbsemKHRa13muTRzfapsfuuSG95x9OD9GoiZchx9wzVtlNZ9dZXqn7k1NW0MXF/9fYXUfH2LSY6qi9GcDpsyZwheTQbY8nbYeDMMHu6RHuHNzD4WyM9vMvsOEVxcKuUlpx3nBfcmn100an28O1d97F6uo6trd/w3A8FjdqqMTYTG4KSW/GrJ92CX+WAtQxYC2cb+NamJGKqHK4cv0qPvviJm5+/SU+/vQTbLy5ha4Gs4nxjF7nS/mG/w8APANSKf5++oqIYlwXuI78CFSG44QlPnEOx3B4qInMDibYDsf46XQPv5wd4udHe9ipx9idn+H+fIRhbwnHYYLn1lbxeHiKGnN0e13eJ3ivZdWZFya8aokCb4EJEyWKsT6iSsnnRSELSyodYbBkXlv/aigILuZMed82ZsvpBCz3pEpb+zKbo4qAoJ1PUn0jn18ipQ06V5KKSD1yvALGLTbMFXSQky5KDLQmOT0bIR76VF+kLQy1tkbUChHpXKI/3e4yrPqYEiw6VXyvK6UNvQ5m1GKs3cKwAk6qBv+6gPujAfbGJ7jz9wPsPDzAH/v38OfRA+wMDvFPHOFgdoLHboqBm/Nz6BpMqFc+KwYk4bakOy5EM15N0PIgcClAFIk6d0lxwqJxtXTlsbK2jlde38CVq2/hta03sLG5ibVLFxGWgFlTYzybpLIKiOqUj8AWFtU2acKqYsAUAmYiWe4j3hKBhXWc/83qzSgg0hmd+RXwwUc38NWtW3j/wxtYu/Qiv0ml4stGxcmp9EspZlINPPE58f8LAbeH+/h293d8d/dX3MUpTroRowsVQq+N2GlRRspGZMwOJiVhTlpYjUX7NxEKXoBBI7aMqTdQiT7uUKwKKX+l13o6USZSzokLvV5S8AmJtZRaapvS1Qndx2dscgbX16g0elDDYa+xA7OzzHTOZR54KxkT1pCUMX4eBdBrJEZszRu44RQ4PUN9LGZ/gSX/U2A8owkB3+rAc7mkgBMdOnfqKfrO4dVeB/1HB9j7/kfs/7CN/kRA+sT464x06n1Bo9TtLGE2nyFQYr/SxkvXN/HytS101ldQtz2rLuh3pLIkx+UJKkXnvUZivEaZW5uC1npc4qAsNSiZUqgaIiX3egZHVYRysqc5hZ1FXA5dSxsZIS9dUltSHESJIcfKppaC7F08tnwQQstRW2qUaqXKpVrKay4gSb/lBjEpsiwmWvSSKskSpDJknxJbjmlJMck16l7zqVaa18IwC5HomJysFlTLPnm/qPpYX8s4M2q83Sy0OHaphIF/wqQoXvSOyopkp3FeTlxLFXF5vZVt2n0I6hl23t/Kvl+K34uHGeYFXZNGeJhCgR5SPiyeNXSPhZQWpt0U0nYvKH4oFRQGwojYTQCghPeX48vtsYWsk6+RdczeZlqKwiRnEO8C2RskvqZ7QzF4qbg1rwm7vxSvcxmIfkzXcLk+0SJc5t/AOYf/AAAA//+sXU1vHEUQfTPTs9+xsWPHThQnAikSNzgGIUVCHIjIiSsSSIhD+BtIHPlREAkh4AZIBIOMLTtOYgjEX7s7uzPdqKqrenrGtoIi2gdb/trZ2d7qqlev3jOK1iiKyd6BhJqllj1BVa1XLRYKUe0lBMP7OzZvsI4I6JqOx5JAmCB+oTfDtATzdGkRk0UbraZ6J9ItzUNiQUmurUopTEx4LnR95KNfq93bBkOgkuRTBffqTVR3bF+02MpOkZ/MJ1NUKNRzt1Wje6WzP2zZUPrNQZSguYAqVWvUQa/H2TK6P9aHVOcC8uuLQiPUMpnxrUo5oOvno9c1nXp0KxWf+zb7IDyuvJn5sJEivd8fsHWN93bPvSuBdUH08f9cuQStMJag+hCV5Tcnj64oekgfQrlilKubBToXoft6H2aqoErPX2zjKHjSvByJCvIBREe+BHZ+bSTQxXs7WNzJXB0iBFlnsUJHqbG/6x1Bb2BlXPjDogkEZBLonMx56T7XOX0nLgF6MGiHoGYdyDWqMus5c/u+GJVga1GPS0RdORXyi50CeCRIEEtv5Rkj8/7v5lZBAe0KUgCzQeGdYky8GGwU2j9H78p/Vgp0kRoO2vmgj0u3bmLjNtH9fsRk7wDllBTvffdfi8dK+mDUJ+/OKxRbj/D4wfdYufs2TjsJTuY0E52jdIZNrow1Xjmfnve8RDEZcxE/HVt0ryxg5HIMV0Y8unFCaT+NSqnmQcdIApZeOPGtaH2wGXL+oAqMlFbMadt66tyiiqzGtlDtlSWxnZqACLHPbbs8ld8NHVPbGj12QtWnxLuf4dmsxIk5xe58B19t7uLO9Vt4Z/AqXkcPqwnYNi2jEROamaXEPaN4sYCPPv0Mw9EqvvzicxzvbqFD3YnEe6hn7szlnL8imnJ9ub6yLnh6lGjbOd648xbeff893L13Dxs3b/j4QPcQ3qbMvfCBXm61X/9Y6Ew5Aq6+atnj3rJPBfz+lKJ/BwW250/x5PQYO8+f4cjOMU0qzEyGMcW6ZApnUlQ9+m8zmGEHx/MxC2RYLpUilpro6ihNsRQ7R0/vzDhzT2TfOJVKb3RwWnO9aT2vyDFUFJmhrKzo3la2HgcCzgpn/ZdFZx3pFtGic0jnSfV/kWUgnXt0jp6nN3P2TE8u+HkV/bRm+ARmQeUBaR7Dk6Szzkss26dyV4cS8jxFSd2q1OGIGBPFGNnsEL25Qf7PH+hZx6yBnk1wY3kNq90h1kdLWOkNsdofsgDqYtbHJRjWFeAZfpbadKLRH/e/k/oz07QtR95BKn7lqcFC3sflK0tYX7yKyZu3sb+/i983f8XDn3/C3sNNHD3ex19b2yifHwGTyrfTq9oetJLOPgEUPOPejllwDd2FC60uYVFQ8cbifBbzymJxbR0f3r+PDz75GJevXUdSeYo6Cw5aT8yohPrrRVEdA7jTaBzmNwAPDrfwzfYveHLyN06NQ9FP4QYdBsCyyLYk5dEJBKDcpGKL5uo7GeaU3TmhghoR2sk8J45QjGYQTUBiyps1Yfdq6M0/ou9R/kDNN69/5ZtC6nZEHVvV6skjO2N1XqrgGmcJwRCkVJ5JH2zUGfAZS9TualwAB8c87z87PAWmM+Skklh6hxeyX826lBf5fGLQHXBH+OpwhDWToHfwFI++/Q57X/+AV0jYsbI1OyMS+wtMFj7/CmRdIF/KYa4tYvm1DfSXlxkHJr0lAq565OdPTIE8Q1FOMXcpZk70FBjJ9tpKzP6wpQc0MgdfX2eha67K8PH5aUTJX7vwzkIYtXkAK2MGcRAOlI4zNxalG6xq9nG8S5KmuKeK4/V6/VA4ZhFg5Ge7wY4OiGbONd4EzR5hD3gmbs005q57hhDz0jwJ+QHHY8nXtMkaM6BMZH3eZu2+7IpV9NMGENNkKYZOfub5TDErunaOssGBQV0tFAiwEQNX1f31tVBnLtvSYIofV+tAP4JN98WL2PM1sg2tFxnn/IsDhAeSVOiv0XQkNshkIox0n++q/TxtvdjFINRsQSC/BrL0+mJGrzJzSdOAvmZNCGJX6h5gkfy6ZlAQQkXJiVmlrAauDViUkUCLAgDwLwAAAP//dF1JbxRHFP6qusbTXoSJBSSEOBFLgBxyiLiFY07JNT+ALJdIEfyG/KPcOeWEIrghLiFKCMQYMIYZD/as3V3R26pqDLGEbLzM9PR0V733vq269t2XvzDFzAwTXGSNrUR2Ca2FNtpG9Qk2vWIne56OxaQBZ5RA3d2NTiweAqLPn83nyZHS3oiMrIp5X92XGJNoFIYCGTLUXzbirPm26YuhAoZW2JsgzVvL9MOENmN5sh+PvQlJb226dkUpDT13qpNJmh06RtW/5EmQTwh50MFEVMf0pENKxxwy9bYwAbH0A765vU8anEyfyU16QkQKUy2XOKcxLRjWUNPxC0vCtCkuTcPK6I7AlEdtbi3GjE1JQqIaO7/M0CiZFyUDAIrmOqP6umVEHEsyDZeYEPa46xsbmNFN0ImbvxkbmhEKO7nSYqhTUI5TVFMXGEJURFra6yA9nX3NWqSI5MRvtJ88tc0aWL4mdPos7qQLAZItUkUXpcROKa4zV6QwNJoRa1Ez9p6atsqYKV7ZLhz9w9onJHTM5B32vLLg52M2fVf5PXtMpna57B0QlVpmbBCZnAZp/nRTrBRdrrzptFAUNPKZmmNqLJyiEfxaG2FehErSMAje8hT3sqD8cYfQeoTOIxDq0AT05/J/0isTdYlM3KjF82EF66sn0eutYjAcYjadcNxVVRRq5gfgolBQ22aB0fAAfrWHM+e2MWkIGesz4srxYESXbB16C8+Nax1qjhskqmQ7IUrknIvGXp/MH2tlcASRtXRie+T1+YwdwFNXuhaPDeGs0OQBAHLOb7kOUYWSXXQblc+0aRrdFSvX8nBK7/+oTQsscrBkDCDrWJUBkNkCiuJ1+etoNFRySqYhVBUxDy1GvYihW+DJYI8lEn59AxVqIgRwfJfrPBvX0LFQExL6AZ998TkuX7mKhw/u4+DlC358osNRJXi8eX5nWVIUmoIKOkbOZyTpgcO169fx482buPHzT/jqm69x+tQHaBmOrMSjho3Z8sD07QdOJ/Vdz/5/v/2Oo3Vvfdd2nQU3++TcX2EMxw0M6ZT/IcpyN8Kdo+f47c0T3J08w4PRHh5OD7ATJzjse4xXPA5di97mGqakUg4O65sbvO5RsgxdGTz4Jtr9ZMqDNhvk8jpgxUghebJiNa23Be22K6K00nUWxX7e1nbbo2i/qBQ1sfPDlEozSXIZ3Vq6ZoHElLLoYRuqe6VMyzH4pIk9/tEVDsmVmm4ZAlbGJNmayfIqZfrlfculz4yxd8sDW9v3Z5Mp70F0v9QrtaBRjbEDeaHkgVlYJYZAR/AnZhQPd6JGs9bHlNg06DB0Hfa7OV40U+wejfBo+Ap/7u3ij51/sTPYx7PhAPuzMV7Px5gTUs+6+aBeAp265AfICNxndN3WYx4yVmw0F1xQnoBHHVZR1TW2Tn+Ij69cxCeXLuL81Uv46MJ5nDn7PjZPnURcISkPRaDO89WslH4wgia1WLmOoNRZl//0yCSYT36fvDyo56QElnOfXsYPt27h2+9vYGt7mxVZfRqga8/XFUPLqCaFjZP75ikaPELE7deP8evf93F79y/sVHOMid9+oo9qvWbae6WIZ2SJTUSfkP9Fm5KibC2GypC85JyJ/ES9Jkppq8VGl/HHjTbl7Kwe1CZRab7dMSaeRVpbbCz9aKFNGWm36We90EsIH9XmNkRj4E4jYxectuT5vk81Lg33YsV7Yo/uGWa3OfjpAjNC/HdfAq8OGfnHmzEPeshOTd4zGRbRAJ+Gapsbm4iHM5zu19iiOv35LvZ/v4v9O/ewNlqwIaZIhZUVwi/auB8xGTxOO2D9PYet7TPYOHsKZwGJs6AAACAASURBVC9cQHQVRnsDDJ6+xKvHzzB5PkQ7GKMdHGGtqdBvKpbd0IMnRlgUdxc6xyvMPm60lnKpF5BGTUAkYwnDUPrC54lBT41ZFr8vWUec7tHCJG34+5JgFVKdxI+h7ABmDDRt0qcLU7XhdastarOyITQ0m853T4dFYvbtVb9e1PKFN1iqLTsBS+gaSU2lavXFr2pliQHArEuTN9D58lIP8iAhoed5sNsS8AuVGSCbe2fZTx5qmIeUmY5zvR8zKzh5BxTIPorY5likVdEpMqSeTY/1PNjaaqwJ82KwRn4J3FJaUu5FlBVJdVlPmOwsI+D+S867AWgkCZb+wHoi2c9Y1lv4V9HA0AYX5rFAH3Q9iQ+NMLGNnS2G7rKHSO2YmRfW4/Df67pC1zXf/zrMSX4fhbeQMePo+RbzRqO4CZzLvgzGzrM9jIYCznv8R9e19bhNROHPYzuJsw17ZVm2XEWRQBSEkHhBXCUkHvrEE/AD6B+o+AP8LISQkECCSlxUhCgqVEVs2S67y+5mm9hxPB50zswZj51sntokGzux53K+812iT7+6YegiNou/3fUp56goxZvtoDZaFOlkEcVBUCm4gtTnQqY9pgh75FzoCQ61l5s9fDD1wmXhc965M4dDUEgaF3Vhf2z7mlB7RBvvizcVIGWBdqW5SRZjGHCBF4CY1UnXlDNYmdmQ+A2TR/eow0/ayl7Gg06QHD43omaIxqezYWxTbGrf4ZcFBq4QCAfpsvOXBYLobQ1DwVJJRDdku9bKXxs7IYqDewMMhHIKiS+UgSaaJQR6demG86CpnUaLDSVdvFKA1kmOrTXxWEwBEMRM7hfjBqRFAZuJTgwEI0fr4di2uvZaTkELfTyIM530aKkb4LGLChEfCzm3iu9j1YobFLS41rWPwuz6FNDx5TfR4p/hNghET2Vwyr1f7nvlJwfFE2HoMSDHlohL0lsrt4ENdWECxqSpal0z0YJRF42APaqJxFeDxhf9m8aQOLn2U6thtBvfpjSzsiAbU6Kc+WaoWxOdr4bxWinLjqg8CjknU6E4AwrN+nJMZ6gmBVP/GICj+6G03VzqcM5TBd2PocmVOUuhkgHiMoP+L8fezV/w65ffID6eIpu3jQFZe2rspnmuUhzRpPrkDi6//Raql67iZG3ENN2IkNLzAmmukRQzjs7KCGjhRZNU7DXMqIf+4+sYPLGBZHsdOlOoshQ6MZjHNYp5wZGqKSV8EE1QLy1fGzZT4AEQjmO/EBo7J4qMqovUdxMFFo7h7LbCqBo5XktLG6lW8bTwWU6PTV0Ym8VeW9M9h7bEFMmngUtRip1kiFe2n8abw2fxOgbYZTd0INWOSmx4b8mtxDvffo3PP7uB3366xWtFqBgNze8QPN9PY7/Y0xN1FGNKhnbDDFdevooPP/4Eb7z3Lp574UVHe5NuX/uzFBYLyG7vftk7Ln73sr8QjbY7B3IjZxprxK7k5y6nfx8Gf+Mcf5kJ7p+PsX86xtgUOMzP2JCM7s0qpmIsYgCGtfB63vZ1MJZGSrpiOhyvyxesL/KIYcHGaZ5zMUt/Q+7AqdOswix+wybn2b4m451NqDieqfEAkBQUAbhDk96uJ0UdJLxcdL7d/wvjSsAxmddpbuM5N2DOhWPL+E2oamlUJWZLkoMkPkvo1vwby7xCnzXX1iTUGdaaqDEY5oYEFY/UOSzzZq/jfhMeB7qJcqWhVI3PEVMaSV4inVVYrfuI8xK7W1sYaoPdVercr+LRR1axs7aBtWwF68iwCoVLiLBJhlxSIGsTxGA2c44UaeHYmrNPxwxFNcVkcoaDf/fxYO8u9v+8jfu/38HRvT08fHCEo3v/ID+ZopwwloYcNgq3aV4sxi56SQAxyZIeg7CJzfPgKE7yCnntg/fx0fXreOfaNcsM41I0Xkx1SCIu6rTzwjhjun+NWzjFF7d/xnd3/8B0mCIf9aCzFOkg5jUwFmNL5zAv1y9xwLA8uoyqqMWiggeN2A2c1/yq9d1FmiUSFonWtjFzyjW8rMZfJABh1rvcx7GT2Wmn6a3cekDgqZXOmZZflhyfGQLSaCEtfmVBn37Sx2z8EIPSoDg4wWTvEGb/mD1+yMOCgZXIFiOxEbaDAlb6PNdkdQ+bUYqtosDK8QHyH37E4fc3sTnTGGoLfFd8LS1bgRgHkkhDKQWJm9H7I4XtZ3aQbo0wp++djTAtZjgdjzEpcuvpwaaKMa81o9EQj115CjuvPo/k8jrUxgqKWHPYKaVK2X1e5ZlNbBbs97c1wvLCA5s6jLVrxr5awkimPWCYW09gCDMh3X5H9m70WeI9EAKGKm7v6VseJC7lC84/gj1NnHeaOPpLYzT0XgsBBI5rTuKWL1VYt8j+UzTltL8TAJM+Lx3YfYVt8DYFtMxVyjTx6PI9luXkC8M6nEu58RbUeHWHrh/+7kJrp9dLHyceNclnHW0/glqu6+klUdQMqqHy5yTfI3aAMgNyznhRzN6l3gl9HML9vtQicg4DSlnStWelyb0i6Qw01wuLma5jd/1KnXeONNqsb4U1vLYNwub6y768xaJw3BqRyVMqgYAF9Bzvf6iuK+fOG8Qx5bIMZVnifwAAAP//nF3Jb9xUHP5sz5JkJkubpI0UEVS1aQ8RSL1y4MCZcgDEkX+BC/8cl94qJCSQCpWqtKQVWSYN2SaZTDIe28/ot/k9D6OK4ktGydjx8vzeb/mWBh10pB1VGZxSTZCqjUxIIrYjNAHrVEaVH3rOJ2g2GdZNsOO22dNSBcGSuAbDL5wNaleJM9DDEZhNg5N8OnGrbJmqJ93MVDu2cWy8DSpMePsP4z1MQrbjQCfA9jPLveQ9lARoEYCrSU6+R+dIq6h1FuwhWjeh2WhUndzKpz8x3nhSOy/UOt+y2T4GAUEYxPDLnwcvo+xr952LBhaUVDQKUpL3xRhJCC1Aq9uW2HXnlfhJxrCSLLvWl1bsT2z+NJrHZDGCaSNpysFlUXH3fcdfEBM5r+g2OXqeklbWzIPeuYqzRWPOEn4uqhBvpwwEHQtfSZQJyHOvw3tu9pbh5GXJPo/7oHDB3HjnBQojhegbrxVBEcSryZa+IFJVnZ2IZxKygooNmQi6EccwK4UrF6uSdh4EsCzqyM8Dlcoo0XUK5YRXRa2gwsr3WCk89J2ZmSbDlcwfdEaRBAYVC6uQ3OViq0nPPTMqCI87qvjSfmqDA+WR8SQc+U6ejSm6FxxwFGQNOEKzbAJpDgxy9N7sof9XD9enfWTXI7ZZoZ+kAkxq3O3OLKKZFmZWlpDMz6F1ewFJt4Pu/B0stDt4uLmJy9d72D95KfxQaw5HVggo2bao3Whhfuxw0zvEwbOfsdrqYvHRfawvLOBwOES7Pcc+9UxAoqQ+F/i6qE3ncNc5xu/6GKc52oMRlu6ts7jcDXVxGuKrywWLErXgbHKbVuia/B2jJGhcuSB4/0CYXuTKQJChvoWWhO9L/t+76S7soU4LD9k+lineHf6JV66Hw7ubeNxZxr2kg1sJsExwZMgyc9Hr4dnTp+jt7cv7kohtVXVPpqTTDa30J0zZKRm5kZU57n+yhSfffIsvvvoSD7a2UGq1uwxA0Zguyfcf0vz/v1FATgUKcksw5fc0ith//BTAW4zwMj3Bq8tj9FyGw3TIAn45LxEx2qtLKJKCkTRZMeZAngUWCf/KkFsNytjWouB8iTsn5KlfioBWCLWfHD+5dhh4rst8Em3IK/ILrt2xJPCw1nXP1iCjBxV5fc6Szs6/g6fJLdaO8odsY0YVGozV686UZV3cd/LaI1F7q40Im9/ss3X4Jo/jIl9cbFWWq9JZizUQK1S3hbjaLqUkQoR+5X3T5gklz1FZU3ZuLy+jpHs+zllQsH82YLvgy6tzZBcDzPZ2cXtmFp04wcadNdzqzONuZxGP1jbwUXcRw+YcFwBYVDAhCVL5nKgGSEOF1F2k8Fq9JkIHZJjl88diC+vzC1hcW8XHDzexu7mNs/0D9A+OcPR6h4sBve0dnP49FOFU1GlrJmxSTnmUDKFFwdBUR1XAuMST777G9z/+gI2tLaYJEbkhdiIy64JiCdmFZhp+jZQi8wYj/HK+j5/evsD24BRXnRIFTTDdBA0qEifKF9dufqFWnpVGAeoNKHayCt+PEDWic7BBqSPl1luyaTpJLuhAWjHMGhn091z/Jt1k73AliVxcrcFOx2d1vNhbXLN4cTieA+uGSq08EsvJKM3hRiXc+RAn+0fA2ZBh/4S2cxQnQxxbqsSyEuJswo0pLnZ0O7EwHqFJ4+D3PzB4/htWihKz1BgwZEZAhZD3Q+h8CKy2F7tLGBfA4LiP4/4FroYpijziZgBN/VwzjL3Y42kO7D7fwdyvL/Dgs0+x+fljzK10kVJiRAlrg7Xl+dgSx3uRvSjyfPTq+VK8yTGjQr0RT01K/fe9RZtRPa0RavGf7V8olTQOdH6YAz4leZ2E3fMcoo1RpoEw/DxwgdBYzujK1tw0BLE1J+1Yvhnkr0VE7RLtaguq9eYmq8ZfrPSFCqHoRMOspe5gdH6ifN/g/5Vp3GlcfIuVK3qFriO+YRlrY9HTeUNkWRZavE7kOkafsIadfTa0TGx21mr/bglw6eKqYQstGBeaYLPOHTcd5TzMypDe2abG6VZYmrbR+ZEQJG10LLEIlCSd3D/oxaBivBTrFDU/xRa/VP03Q5aEgt6MhKDcRrmRYp0Yrkf1gpKdl+V3dN2jdFSzGaRtOByi1WrhHwAAAP//pF1NjxtFEH3zZXvGybLGxPkSAoVIEA6QX8AZCQQIcePGhTPiV3FDisSRDynKARRENqAAIZuwu4INLPF6Y3vtGU8Pquqqnp6JlxzoS2SvMzPq6Y/qV6/eizWwt3RSw0qxlFUseVPLvYsZh575N6T6dYh6YeQhktSZXI9HL0IOcCqoEIj9Gw0couVbm4ta9I7r5MWXs60GbTORcGCDqizq4YpVU4scaS+1tmWtuvZ28z3UfXpOu/miG9YX36+rrF8YTC0QUfcdvMyx/U7rXKr/CD5r0Qu5LwMuYsvmBSb+s6iKuw5cux+LVz9NGkaojUORlb6sz6YKuKUAPVrDRoNbQRWHDoa2hogtumTiaf07ZMHqsGWcpdUw5cZjgjBIwqUkhRPToXFE2ShqmaBUKp6iCwotRMqooMMNKfUv8pzHTew2Qh2vlVB5fGERU2etXFnGyrFZ9LPJn1Q61eeo1tBPteXyLPbgXweVDtwSRgB9vxAFbv4bLfqSaQ2FotSR31r12ScPaPR7EvSoipwXPZpz1kbK9gMFdtZFIhYEtnSCdQywsThN6DJvqpfhrt8qMW/PD0U8NfhWj3DnCSvAC1mOsWihycWLNEKnCBHsH+PXr3/AvZtbmP85Rd+W90EdMbvsJjTDTGo+iUIYZQHijT6iNEWc9fDsYIjBqQ1slgkOVjbT7HOzjaABbJO0WvA16f1Od3axfe0LXMHbOPvayzDdHh4vDY5pflKQGRBbIkZSWJ9Zitw6VYBiVsLkE/ZVHecF4nObSEabyAYpq+obqSctyjXCi2vGkj/Hn/Zbf22Rb5vvp/ExwElXdOtd5X1u/cZ4mX/XjxqMo1bjNzpmebwEyInZY0r8Uh7h0YNb+MpEuBx2cckkOD9Z4PRkisPtbfx4/Qa++fwaYrHooXpgfd6TVuyV0dISy0AYXX4Rb37wPt569z28+vpVxL0MhVCNl5UFSKN112x0THiiIv//adRHi7JAFUWYyoHlIWcsV7ibH+De4QF252OMkeNxWXBGjH5PWf4oSpgtQOsFgQg0Hl29fWXHOAeCLHYYWj9wWTem8xkKSt71+6jymobvA7vaYvGIZsZOVVjmXLly+0P7gNRugZS6NZ1HmqNIg8CT9tbGm/BYRuuet91sUiHmdV/ZVUZAWk4GhE0VaL/xfl3Vf/ODcT4cewOmZgG2nlcU0a23u2RthapacGAbMRhqpCyPbQ8DP8i15OiY56JhcJSjI8oExRWyixkLq5npgplPZpnj4dEUm70Mj37fZuZUGnSwdWEHo+EQZwZDDPsbOH9mhHNRn905NojSGlgggHCiqBIAiUeor1ET8PtOkaITdhFmCbqd03i++wyGl44w3v8DZ1+5gsneLka37+DOt7fx4Kf7iAq/pBKy7lSujr7dOkGCvMwRpxt456MP8fGnn2B04aLtB1jhYorzckr4dAR8NyGDWssIDJ7tY4WfyzE+27qBmwd7OKiWKNIuYvLG7yVAliBIKjnMVlL2YNw61TUBg2Zl2NzHVaDWvd/W+hhIbXksVmBqUxqKDaORBFSo88LV9FqdnX6a2Rr/ZS4MvW7j/lY3KGEGAP2rsZMtsZTyVin/KqWc0c0XAZjcQYDWCQQ4njzG4nCKYu8v4HAOzAvLMgHpU4i1gj+2RXCSsoQkBPhclGJwvEBwfweT775H/ttdnCJldDoniMqIc4w3Xp/x/hGKpZ/d2I9mOcazY8yXC0yX4voSVG5vUVKv2k8mVN8+A/659Tdm+18iXKzw0htX0XthgAILp+MFd7ixeyMzgYWK7897B0Lq5H4K5h1GYSN55w7Lwka2ekxiYb6yDCIfsAkQNmKAsgU2aBipzGWKyThLT+yIEE7PjOaLHjAhYFE7s11nxGsmaOTFcqVX5kXLNJdbhbXrl8v+C1vWBFbjhMA4ZWdxFro0jpEQeWXZVdI8H1rbvfUxtN4vFj0FPc/4DNvKEwfUeeQ7omniFtagk0GASLLfbFFN78pbgJg17D2fX5bh34MBBtFesuUWrTHhHabpfeu5JhNNGjqDKcBnzxNW883/v34fWDE/cYXztO5OuiclfqlZ1w/pNykxUoFzZfwqg4USanSeokFFzH5O1BuDfwEAAP//nF3JbhxFGP56mekZT2ZMokASCBLihHKCGxIPEG5BisQL8AiIN0O5IQEnDskBCRSEIjtsNjFJbE9m660K/VtVzdiKEPbBlpeZ7qrqqn/5ltKrxzxXF9ta+aZO/fxjJ9as+9IBswVhHRSjB1gi7rTDK6J3uhBSSAzbT5Q68BFmYlBXEWmLE0UDRQlRwxNsFagI7bcqWqaWHGHwLPlTuE5uwmrOX6igpI/nbsDA/HJS/szzpIPcBxGGcN1lqZZ0XbBJ7BNYTXwoosrWZVUmRiwoRETeINp5BD2BpGNBr8swJeLJM4qi4A5F3UpwRnBzu8bcihUsvtGpRZ/xeqQLTUm5HDyFFgrysLBCV1s3RfIj7vttX3226EAfHm4TrYmIB4H9s5CH8V4UKgeDFqWdplz4dDSeBiVlrl3fBchqTM6jMNJ2cKeBql4jFRuEYycQJEOWlKnAjom2Ec0kreYqF6hTuI7Bvyh4F1/9ITrXRs6VJcWa/HNllSu9cojGcSMBQwkMTLgPet9eAxaryJIA5ngkxRDR6ui2Kto8tmURkAm5BvxU3KPOGRLnhDwTBdI+04IR+8aPAwXAq8epbFRqA5o4TDAVyWfhIGLYYqFO3GHccw4yR7QZn67w9Psf8eSbhyjXLa41QEWcdWcBgUJu5Y75c4YC3QJolxt0+QqL1mFT/cUwaupGVU4TU+Wsp2myM1SJdsUmNDfPj/DLgwe47RrcuPMB82JfDErMqTs18mhWDXzRc7DIli+0zlrHgkXZssXy6Bx+scbeqsOkv469WYV+XKD2DVwvXW0gwuaRzLP3Hv818/xf3fn0/3fgeUghwa9JsHYpBpmOawyMwQ4J8KWMUS9WaAXtS22Dk9MzdOsa8+Nz/PrnCcYHf6M++A2ro2Msn51gwpxkOUvILkCKJ/HxlfwszmKtScXs2hR3P7uHTz+/j48+/gRXpvsi1KQpK+0OVabdNytmmG+wvWR625dMxetwAf6Sv/EMpc6Z229+/a+KARZw+AMLPGnm+ImS/nqFo3qNMxLyqzJRdx8WHCCTyrwPjifkuy3im0x3GhQquKbnjzf4umHSMxY4pS4u6Ra1bS8MDUUBGE8y/aB9brVa8j5Le8VKOxpUSGAB0m57FFwfEU5FQGwJtJrFUhVaaYWB1Je6ZFeUNlDlLlt3abGeEoPd692ag8SCNiDS7CzUYLKgNZDFBMFoZrGojPC79JyAJefpNfr8QsYgXGOlwg1Ur8CJraXRIAmCzcE7FdoHhSQ3igAMQpy8OdHvNTZSnmejVbhiPMR0f4JsuUZeN1jPF3g5f4lJ4+A3DZ67DaqTYz7vZ3tSAHjv+i3cuX4TNycz3KgqRt5wIYB0OFSo1ATa7HtJgCXoHVOzphjhrWofNWq8/c776JavuAAwG85wdnyOZ09PsDlbJ2NmmZwk3pnfRuDUTlyVhoMR7t6/hy++/Ap7t2+hy4eijo8GG9dh41su4F3JZ5I8UoEcGeYAfscr/HD4GN8ePsbP3SnW0woYTjGejFDs7bGLgNjBOsZjMczauM3IY4JPKIgdikvfbtteXlbAtbiEYimeV+oYDkqmg1JimwcESRHdivTZoZgw5ZuLgnhEDxpP19B3SAT9eo73GrH+5fPf0Il5QFsU6lxBzz3Zsi6O/kF9PAfOFsDLBav78znGHuXSDef38CkcXhJAFqbcdLi6XKE7OMSLR48wOjjEm7RY2WUqD7K/u+eE15/12uIyy8g5vVbvwhnMxYZkf/Z6xpR2hvc522u+kQGLZx4Pv/6O7Xnfvfoh/FQcQVycUE5uuKucJ+J/yTlHz3+hKB1OJstK/2YbDRTuw8XE2uLeIHbtoitYRNTG+c6Ug75tE7ydVxRqq8pd3t4F4WjbIzfrDa8PtuBLirESo8e8K/DTkTR/Ev2s3fUsLl6N5m9Ri8IKXHadlTbooN1zRpQqVJ7uK22yWuxvjUsRQ+1CEcKabOl1ZJmhhbKApGIdLqIEJ8U3+2rU1FRzLMSfWgQoVYtBED+mieW3KACwAgKzTej5lRiZaLnckCOqzU63/sLa0HzTRLltjCh+ZkcGthCV8eE5ZkSwIISsEcpjqE1AcQy7GHUYMoQ5/UnORxpaPJdB3+sincVidtaq0XhoOr2CzWqNLMvwLwAAAP//fF1db9xEFD2esb3rTbalXymtUOGhvMELfYQfUAmhvoDEL0WIP5AXEJVaHgpCTVtCBWnZZLu7jdf2DDr33rG9KWKlKIqyH96Z8f0895x8mLlTsqnZbCYQ4abWOcOQqYODXMTAMCkbGJQgRQ4OA586LZjB5+hOCHHi813Wd/+jMbnrewydpz6gMIk5HtDUYUzsuo1pHsKcryl6iEPtTNpCFoAkopxflvGG4WApKZ/CxkW+K9OB1MFID9U7jIi5lF0+6EytK/oE1BeTHvLvjJk1SZbQEjf14FAujh9gBBnHKAgZZBWjESlqAMHazLSaqlFKhEoRfYIXRdd5T/aO0G4t2BQ2i0Xd4iAdYSWx4MzLwALqjOiEe87qNkPpKZNvpdqV9eW4R4LTw25GPbjnPcpD4yNnVaqRisDIse4gJLwfDjjnVZhgdro/rehyTm1g2JwKDZ2tmRhmGh/oORIomEsIA7dTaEjasReNoRd0hn7+Vgg0BnIpvk0tM61egmo5n4mgh4Y7ROkCEwUTWxVLLgWWpAaRxpzfxyWd4CRxyO/vnQTrKdh3Y4mXELDZbKyjrtNznsUbk63RgFuLIQz4Ous0abCeCWQ0PdQ5ermGLsICapLYVbqgTpmDZTYyqD5wN6p4J51tXm/AEDHzb9+rZZEpdeB3cBl6NtQ0fU0WXN47W7ElwGTr8froBMeHjzBfNjIzWGbe4E+pc62opH6/DFTIPJqwfHaOKf+nUbLZkAtJXcqbg3Upkt47X1awS9p1WPz1DH9+/wOunZzi4PMv4OdzSSPXEqydomExZ5ILw+6aCRb1o7sMLVmL2ZU6Oceb5TG2r95g/8MDlLevIM4rFEQosDgWGwlIOcPNAJg2kfvN6Q43ZoEfwfW1U6XdB+G9sGBqLLula/L/nAASGPbdq10WduBdBu+LD9n1neBQ6+0p4KRqQkso6TaTGJvwZRZWbmQR7y3XyJ8fIz55iubRMyx+fYHVyRnKRoDxQvZYJ51b6OvbUVKWmxROHRS2yzRjfqnC/Qdf4ctvHuCTe/dw8/ZHUnyQrqqFRC4FlzsLgdH162MsVbnzOxv4B95FRaSTqcwChOFGIb9TNuYz6U5Soz/gCCv8jjd4evoKf7z+G8vQyk+YldiUEdm0MEIj2FzxW2nGKZFolHu2jo10KSXppp2yZL4Rki6V02NHV028IgHyqOulnTRvrOxqW0rnBo4OmUNuJBmTonXpxJ9LtyKMyU4vLOUogXcX5EsTGW5CBWSZ8sDIvb81aVXjFpBgxwi5ep6ZsGufJfi10TLpnDZbk1RTjhr4QvyVICVqKzaIbcyQCzGfItlklp8F2kznTcXvNCqZ1nfMgl7XGDLqDCYuXXwrviR2a+lSUywEKlVKqH9VaXJBG+UFRZBZgVoJd2vzdcECYSFRhB5anuGmL3pZgZ3szdEY+HNgcrmCa3J0VY75Xgl3toA7W2O9XKGtyZjuUS+WOH31Gkd7z3E4qXDng9u4df0At65exc3ZDO8X+7gCjyucYZUIgYVXS9oz9LwB7Mbvcd9Qo8K+EF418z1sJyscP32JF789x3ZdI0vNG6AX0cxMLUSkRXWgSh5ytxcF7nz6Me5/+zVm166jcaXIKa7bDbZZJ0SidUm/PkGNQgpp1O1fI8Mvmxf47sdD/HT0BKuZR3nnAKHKkU8n8FMG38k2RVn/0jr6adY61RM7O4Yi/DlKNFKBu7/fe/h6tGRQGwzn5xvZ58ISdvpVGU2ymFEljGtJcFQWjIV2L/PqPAvJmgiayopist/00/TRDGWkoOTtGjplvRffWstrlTO1RV5ORP5UoM218um4zRbrlwtsj5dwZ40UiZT8oJDZ+carj/VBSGaEqBVQ308CNI7LXeoCbtQtVj8/xunDh5gt/sFlxipE8UE/O/GqpHEydiRTpBf/wx8pwmXQhQhhMOxqWAAAIABJREFUUJeQo5EwsWakWxa/+N/YyVk9XwBPDh/j1md3UU730fkoI3ghtDtxZWfjUqtVbTlESjhzURygykI1q7Rw51yfN/TjEyOeKyUBT8mmNknY7YX5z9gTxQ3M8un7M95OGu9uJD/dny8jr6Zdw6ihpvKO+Q48P7cmrDfOJR3VLuzsYiCny3xPXpgS7mRPU8E0zYenxmu0rr5wTVlexjdgAWK4L0I/y55k39tGUShiH7uBj43PL3LN8ZhUE43W2Zhvag4KZD9B3Ily5T3Ec27EkUI67Cc7CfBbURxrLU6OmO5PB1S012YgzzJlwPl8KlpIbGx8Z9PppH8+r0H2mWNFDe2Fx3417znA8sx8jPEgKD5KyTUFNUv+FyJ1pCCi8tmJf47+iHZLfYuOE2uupXkll5f2SdFhEF4fOW+9DKkW5mQsL9MRgW3U711Ve5Kjq91JigIaR6SGZypeT8oJat77EtR0MroaGnKvtYgh4l/Orq03biIKf76td0PSdDehAtQiRaKvPPKEVFD5HbwgfhiC/4L6gARqCjSA1FZpFJM0m2yyN6/tQefmGW83FWApUhRnY8czPjPnnO/SZgoW9IxfkSZS1VyudQBEIEE411BlR+tQtorwG/it0KqTQQuh8I14QwcsTNxMiRFasUEAfxGlfoN7VK2Xqp2jJMoGg7uj3G2WKiEFOen2emiFTfTwILsvezlZ1LCu2gluMBg74gDibVB5Om0oARaVYz6N57aQQE2Y+NuzMq0Fe1EsqEji7/mNMT9KT88wCAkNLvO8Ky8UZZU5p92RaqU8QF3keIGL6tZOhIOPdlbsc4Zu4HvWZNiegdlkWNU75APVVTdAR2p9FhZEwuqWFxasOhzWcG5JwtRNYAwSFB4eTnR7smMCfusQHYPUxFJ9QF1WyLMc5XTB6rMxC+3IZoc1PwjWXkuCTwzMiLvk/41j3Kkgv+M8tDpo6sMynwL4fiPX3ggpiqVrICrXfpGw9wfWNXZddfo64Gg3wYbPn/fXo6SIAh6LAtl5Lp70sJxMcfrHMRbFNYaV+dG7DnwUloCujWgUJPq3k3u65xtN+MJ+Io1pngBD4iQWr3H64xOcno1x8NVjDPf2+I6mSY6y5xjeVydaTCFxrVSQCtTqZX2AymFVX+N8voQrzrF98BEG93bRyxPmKpau5rjjqLWRijpQE5V+7qOLWMAa13iT4vn/Od71Dmw6NlpfOR11F2M5L9FzPQyaFPmqwraLsDNfoXdyguroCDc/H6L+8xXSVxcYlTG2VuJhXWtrsGnxHVJYsBoI3easFgjfiqkmGR5/+Qhff/sNPvvic2yPhrQF5h5faFN3K55iEx950/wJfMYBX6CJdSY6naWlfVFxk9YYAGMAJ1jht3mBp5enOG4W+Gt+iZsYbD0Y91NOfmiT0xv02256u1ZEOXuxk9yLwHmFjuWCzRW/m0nSFt5M3BTWYTEF/FawyTj4ogZMhWGK4VbEt0KAWBjVvgPaiH6Bi7pxKFFPa+tQRa0KthQx7FyqnuWM6grie0eEkZ6duswYZLPXCzmvsqu1GGcothCNaPfACIYAJlm3nSLZYNK7l8Rdwb/1NUFcCwJotxUFbjk4YacNJytIR2wb2k4jQyEE16i1a9qFAet1Ip17RrOxZ8aJqlhECl9WuobZoI98dwv9u+8hurzGvLjA8u+JFlAd3KLGgoQH8z7OpmM0z5/h/btDfDAa4eGHD/DxaB/3d0cYIcEOEuwyMgDIg2TMzFdzfksy7qZXZYTnvxzh8MkhipenQiFzgdigISq0OGk68DaqKW3GkwSz6Qw/fP8dPn1xjL0HBxjuD1GlEWZxhXo7Z3HVJVtxvcZ4VeHl5BwvJmP8Pi5QNHNU+yNEd/oo875A/gnaHCvrnOemY4G/SOkDm3RQwvj6bw+DfUP9tXlOqhUyIyzrrsg0QipLUOBtzwd7g9CHHbqWkk0nK7Un/NorklWFHJw2OYgWS79Ga9G0RvnmBmUxRlNcAZclSIAk4mcfC0VNC8oW/fj5OEluBlmKdFlhL41xZzzGzU/PsHj6K3bOzjBKIk7+o050DO7f+bhp1LG315u1fcjaTy0mC4YzDoRbSb/CIVkCF8cFrs6vcP+Te5i4Ge9rqagiif9KLfBExJy90FVAm+IIdUIRUDks2adhM7E1bmI0skdNs7TzP3DRJ80wnU2loNrP2+6vCc91Vf7R+SzgNVla+nEgFEzfh0gkE/jjJFhzJturR4HDiQiPeiqmiDR39Q8oRmVZT3MEiSXkM5+0rk4SHzO1OzSdqFALhddDLSSExRLTH7DGJAt801xpnEeMJaaH4R3BGCHSeHcMv1Y0iuJqWs0vcVNL9H4ocRfEs2lwcT5Bmk1xtAaZ99oz4TpqYykIX48OoEKniWEbqt3Gg9dLpZzbXLec2fRnuKmrVGtK8LmZSRZXStGmvyuiidSYVkR2oL9h92f7esodaX02uryhlCUffhvVyXk2o6lVK4+ajUTNTjNs9SXv5fwdwD8AAAD//6xdyW4cRRj+qpdx3OOxnbGxIhHlSIRE4AFyiXgJbhx4Tm4oEgSBkgsRIsbICNthjDzM5nGv6N+qa3ocZxD0yU6ceLq6uv7tW9ZMyi3BN+5LF0LSzzIRS6CHzoV2vqJGX4WbmW3Rcj8dLrQYtSD4Tr59YA9k1gxx3IqZ2YM1zQHa0K0asEz2TexCfNZ7XhSCFi7L5KGzt3l+7X9XaxWyfoXweF+gRW6FL0K2UkliB1Epn7VWhXeC/mknMbQB45LHtetnqvMcLBJ4zrq9PF2IiIeNqwBJovwwo0JEncBn/5/dR2rwM30xTPQkVrvAm1Isowy9sZjPOQm070213q5EbQU5EDJ0HF5YA2g9U6XLJirx/vAI1EZDmP/KVCi+GzIt8G+Z1DjF+0qi59aCD617SGegvdtdL5nmaAJeN8jiLbjSYbh7JJ/rnsLCG0EtkAjaMmfTJxTVtdCLgy0Vvq6boLq7Ccq/RYIbHL67ak7fMRfQfGpVn73rMsiYR8bU7XuBFXRH7IslU5iXkkKSZlIe/mt0iebdCN//5TKkd6Rr57QRYBx26m+m7JOdYja9wuzHl3g9GuHRs6d48PhjXFCA6A1QEXe3zBmkakkmjWSoZEjUX79eFKjoDJrOsSBUwmSB+ME+3E6Pz80UPczLa+XUVdwIpMZAmkgXmrvfrlXf7V5hYygyHY0NGwOWaLiAc7bp5QKzwdrAwgr530622Ke8n99gML1G7/R31D+/wfjFSyyPT3BzcYn7dYR+yaMrlDxRrNj3u5K01Kd87NYAtf1hWCRQpjGefPoZvvjqS3xOdn4fPgSciKvGLsV/2T68gsHU30NR/U+EVCL5F0tIQ2KifP63rOJf4bg4x6/jS5xcXWJcLrHIC9wQYqRXo1KIMKt7J4J0kAYhPKdRiglJ7J1OqS2Yh/HyNmE7D5HUhNKapxyXO/uIdUVI/ZnOcFUzZ70dhSYnLgrsgipu1iDYewahjTR5SQPIvjPRM0LpqYsP09U0PkRV5ekBdj9U/FuDnfmboYCg2TjVLdTTbP0sqW+UnmVUw9AxhmIFTQa90OoGV9O5Xxd8lnDtrVB3nktMaDyd1qIVwGsC3SROeoP8567Le5Gn7YSPkHFc78mfMAopGWwz77yXbGF7fx/l2zHcbI5iOmO9EkxnXDnWvQQX8wnOL87w+rdj7GQDfPL4IxwOBni4t4dHg/vYbyIMnTQE7qmbQNSUvCdI4Z3i8/mbE7z65lsc//QLT/9jaZmsxRfvBQ4T21PKAWnSFA3Gp2d4fnqG775+jrS/i/0PjpAdDJEeDdE7OEByOESZbaPc6WNUl/g7ajDPUuQkBkuisMM9lFkPeVQxTZKfSSFfNwTBbaTgpeKWqUn6wOxclZxv86aq5W2sMaXNJ84fSRG+rLwN7PsoVevPPdhTjSD8eG/r3klsYEPnCQ2ctpS80ZjoM6HRasSzHG5SYvHHFfI/J8DlVA4qejqxWMo1OmH0+5ht9cSmNmV0EGsnYlg7HI6mmPzwCvPvX2BYVthNieIzE50XjoDRrXdhltrNbY3j21f2jr9bFZiEotvprCQqEeX9NFAoXcU/ZdN5dr+iGoCQdlrMNU0rOG65S9bPMJtO4SKlgLIvvnrNJ6uiiNaJEJV2cYcy8XNRWo9W6Jr2O+pqVbUdnXw2Za0ng9innmtv5wblSoYyoZy8KJYBXan2rmjydYNQgsUm/TY4ZV0ZE2xlrYp6LTFk+/alFOumRWB1kdGqkzTRWiNeER+ECWUHblApW8JGTC2LXOXvxRqxsaFFtVFg53zt77/wg1NGf2mzwQUFvuXwXORG7YDRbGZF46ZthEuDWtBl3XeVUeRM69HaMnAFCRs4HKNZb4DioawRI36DYasN0u3Z0fdZX2Ju2Fix+/ZIEc7LhUJOMZpiGzuE3ZKzvSeM+PtgbTCzLLX4WTf4BwAA//+UXVtv40QU/mbs3NokbYraAl3xADzwC3jifR9XPPMIv5I/wBMrVUIsQlSqWBRtG7bbNmkSx46Nzm08drNsd6SqUdMktjM+c+ac7xIKADap4skqP80ZMl/MecLTD8FDTJTPJiDiiW5JQ1l7RdpmkPjUdHJl3uRZxBX3JKnV/k28wqu3PkGrulpZqq3Vam9+wHwkN+H9rOqFViczPu+yhWLIGG6FANORiSqcjxgtYBORYI4k1uYDjKjiY+LJG3nrh/PlKh80AAnNIVGkRKIq90w9cMIV6XPnSCrrXDBI1c9SrTQswauUc5/2uliulrVtYyRugWD5UYvAVcrvNm598OnU7r/oD5j6fsEJW1dhQQIvrrsscXGiCnaQPmz++e9Rh6l6xMF0AZr1PoTG/w2B7zjeaNlGt8ml9qES6EWvm3mz8WBKQsmREa6oMByOMR6MMOoPGS6UJuq/WjpWMJ/d3uC2mmORZ2wJR7ZFTRicizbLYD6e1Ct8vV2N0B0fGgSRKnzB0F/+jssagpbw9U4biU678NbudBUNBW8XKg5WlLJ5FM7GOvEt20x+LvWclNFm1yls3CUdFNkWD+/usLqfPzq76olpw8eMkMQHGkndENr3HiuGQG4w4Gp0huVlhsuf7zB4fYnTb7/DwdExMqJG5V0sXIaCrQxzfiMudJFwIi0cecnv23d9LKf3yG7meDe9wuB0gslnJwzfRdpjVETuKHnJarx79H3s1gOpHj12zrXm8+P/3cX7Z49jv/u17WFqztItS5GUsvGn32SxfehTdG/ukV9e4O7Pv7A8/w2bPy7g/r7C4QYYQiDqglDvICul6LeNtEbiQZoJa4oNKTA+OcLzF9/jh59+xBfffA1HujJkVWW8Xobvtu+vD41m7LV5YB2nGD9UKp9/q7/Xqtz/lr367/Hqdobfb68xzZd4kz/gzpOAZAnfS9Db7zFtaECaEIq4YpglStb3oE55r0MIrSJwGAW5VgSvb9Os8EqhStLaaikWITV6FcfGQANVx5qqXt8okWChsq3wWM0KytYLTm7XGa+NzniF7YKoQvxhPujK8TfOpyHQUtVy4cJY0PxRtWrbJOkxel23N5u8gWACU5xk7UQJFZnNlTaXcifG7EgNxp9EwmucgHbkNUlQ8G7OOLsukBDfvh3bd0N4VAnvUKgndh8lIgBqnXyzmCpDjK3v7V3FnMYnmVMSaetA4KKhOE0WxNT9KkoUSQfd8T6wVzD3ndaBqutYKyabr5EUBbLFGml/gO3K8z30sC0wfXON6dsZ9vopvjw7w1efn+Hs4BOcjQ5w3NvDUULWgsIDH5jD0HaLV7++xMXLcyyuZ9wN9CG+Viri58MxQumc5kCQyL+B2f6bEpPBAMVihXK5we2/N7hyDgvvsO72gPE+qsMxRs+ewR9P0Pv0FJ3JEOOTQ3RGfRSrChkl36M+KEXjoizFNGqaUHMilbVVCgBNN8s6pf14FxCaQzVPX/j7tLkZjUbBQxwN9F4rbkeK+Kjp2vJ8yIcSmUNUFCw09nqxDCMXIqe7UaLNkSgkadGsrhfYzObAbAU8UDvbCwIvEVcv4gtYPDEPSKfFESoUUZyelMBolcG9nuKfX86xubjAcZljj3UbhMYRtHns+N8j9Fif85Mv7ZMHhR+61tylHnZRuZw1HlgMPPHoJtQMXOv3JMJopAZPuQsjOhPRCBMbxl7QC+F1bUcDxDbjlQrEsWBtnkmscV5RAzUy2RxPKkXGhPw2bmRZPqWUC2iD1DqzATWt7l/0GVmZNZ7j+KExEDvWfXaLiiYYU602WaRV1dTbsuMT3a1tuBa82WWBeHGEE/cpccpqd3Asrm/Vzi/teYapW2PJmm1G2Ug6nUaBtIHw5edrFHFHi8UmoM6UF18G5ILzUf4bOSfJmmN2hb6RozJlQBuONMwSmz6D97jRPd2O2bJ5lwIOFW9MTNteT8/TdQqaA+RcVqmdvm7Mbe2k+WgFRCte8Pei+bjZN9Kgec2II7XVlkJHTbe2Ir0VRQTdJ3QdQ6iz/kFV4T8AAAD//4RdyW4cRRj+unqZHo/j2B6cRUZEvEBAOeXAhQtvwB0eE4k7yjECOQog21JIcBI7YeLxzPRa6N+qa8Y2tGTJLc/I3V3VVf/yLRl1JAgqT5PQNnF5+vqg3AATNLgd8837lSa1iXbXU63Op5E6IwInkLvSXcNcYONgeOXj0wM0X3+C9IvYXBqSffOGpAsXznnDwUnl+2Cdsp64uABfsSAnDlD6yCaN82Dj3er9UrXUYCemNm9QfENGmFonJ/nKAbKuu70EnIBHYkd2LbXZZdCz9J1W/YbvGhc/hszHk84gK6mLVfd78SFt5LPMf4loE8Zti4XgDNJDRR6bJNIV75kbKtDKYUGUyehkKyf0c92paKTDqBgPgVfXMq/UqAOIEhu5d+U50XzKXEAfDNBiEbBKVGUzQF7MkzVTi7RsEIDcrLLGlfgkGTphSQRLY4eAzr7rFNXggqAKj5crRIvCldi9u4MvDj7H/vYu9sodjLOSfUApmGnJZ7Nr8XB8gI/LOU7fvkG3bLAgw+Q0EplKNvxmU3mfiG9kFeShyNFfc8G4prHNiacsqgbvohSJinM0Lydliabtg2WKKLwmzDNmtEgEFZYHtF5wWaNfONGRsADIOiGsRqzFq7gy63Uz6VmARdYEgkKPXMaJRnW5YNipU1bgTcl/8HC/Jcq4LYi+qUwU4FVxWEbvRKJce99izKKFDRZnb7D8cIHTP4/x2VdPMH38NXwxQTvaxpxM72lgmoqvmmCw5G7gsoLhc81StDk8aaJ8+oTl2ytUrz5iiygBD+7C7W4BkwyTMSELKl7PaG0MGBVW6c6EQ82n0gmN1wHbuOLjvzpP4XneUjSwY7Ag8pw8kZAhj7cv0K8cij5H2WTAvEYxm6P/6xirkxOsjl5i9uIl6ndnmDTApM3Y/1kZzgyRr1UAzEfUkRYNi6S1bHkIptSMcoen332L73/8AU+efoODw0cDVFo01pWN7xkNkPwvESQ+1jA4XPRjyolydwviVyoFgH6o5/W3dvr/wAy/zt7hxbszvK8WWPiOu0917rEakUK5R1GWwn+EqF/z+uvES5z2z5yJu2KjQOKI43IUIPgs/Gcc840CuiGoEK2l1vkoFdZK4xZ3QDjY2qD/GHSwWS55j80iQSwWP4ocVxgpEtHxYIgF+o6KyI4IEUXPrpUgmYJvnpuUWBDCoFkFlN5w/UNgJvIjLkCpbf21PZqCR+Omtqawng5Jvleq2eZeaZ1WswUWnRz5/xaQ2V5se64T0269X20YxOlNYl1TWTdsHw68cU36E1Ujhxangjd0JAB121EYdLRXPIq9916QMQ3ncqpxkwHLukOVSROhKCYo7hTIp1vAbAI/u8T87Qe4rIRfVkxVSxY10492aK94T8XqGs8vznH8+jXuHR5iun+Ae3tTHO7fx9Sn+LIo8TAbIW8rnDx7hl9+/gmvjp5j7Bulx6Q37ErDERexhSsu3GTSosBixV16m18lHLZIwK9eoFrOUJ+foT09QUdd9+k++uke8PABmr07yO4/wNbuNi4zj3qcYLSzzZSI9G6JtnDoRo71NEa5UTQTpsC3puVg40z30Nv7hmvFAKOJcOzXQxGo8VzueJ0k/Y51NXqjfbQRerNjvnh85KrGHZArem5BPTIpxNMamTOVIkVD8ZDPka0aXJ5eoD2fo/vnShbZLhUFlNxx4Y01rpJetYMcN2K27+ygrYQXTMW47QR4lGQYn1+g+v0YH387Qvf6DPvsGFGxhg2Hlc6tjWeib0d8Rz7QuW5L/v21M3ZME4AY7/NkjUjrzvIGDbZUtRuI0ku88jmJ7ULE/Ugc0aVJ0PwwBFVIeLN0oNQqHNwHCrALSa+scTnfgyRz9ZqTVMMaAGMeM3JuIjRb6kWsO4u62LxOOxlPFkXXwoAhgMwCz7z8KeafX81FlFo73Swop/aohoA2MWizPrU5uxlr2x4RxisxhyZBenLxNCSdg3NCu9GUNRcpE4s2xFarhVcraFnR2u7RxmD9fRrOOQ/pu9BQ5fgxgu/3ipbyKiwdqGDwTAnkApwihXNFXkOdcyx+ZU0z/UwsVAi17msXS11PJUeiPDg0YSNHD957ePIZgk0pA6xzoLT2QD+T3Ez2DwShcf6bCmxbw9WudUB1aF4axdH0O10X5en2TGmdkKLA4KJg4HvL2emdIIoK65YwSkyKKZxf01h54F8AAAD//6xdW2/jRBT+PGPntmmTbHcXIUER4mHfeeAn8AN42Zd9gr+6vwABAiG12xZpKfS2SZs0tmeMzjlzxmP3BhJWqz6kSux4POf2XXKFxafJe3qj2NsxFOeqfEo3+Cbw69P/j3ALKwV49OXkDqQELfUxlYtznAxJ97+MxalCIrTLoe+vHH7n2lReIP4CddeiUi0OEJwDVB9AumItlEKC9t3uWdvhkgRLGxbEDdENpOnxreNDZtsCkn+bNnnSG20S+zmahrLtS25b2JD3ERaTTrzzYAOowYIXvgmNhACHrIOnfh749yQuoYlOfMgTYRHtIrJafJiSdLQU9OEOkH8RAmybPkUIsPL9K/JiwCrzKecHScdc7EikYGwLsTif7SBI0uKezo/QDLomNttN2zHV4Nvn2PUEzNBvAqjYU5zAm2AB5Tl4MiKgFnG/3dEMi8kCL8d7WIxnGBEvsil4M85yxyJvJPa2M5qTXCZblR2tDmFsE7llQiVIziXRusiCsEnUpWienlCYnoqxDxN+pqRkIrxF733b3HbQAU8d9xWTKpiTNvdYcG0wiQVE1VNR1gAhU1BRfzakk1DL5HJk8GDx/38cHQ2AHh0gXBVYeDtwJTJh2/LUi7rlN38c4+zqI86PTvDq628w/fxLeFJOp4KBggUJR5KOB6F1INM++mudhSE7q2oDbMg2cIXr5Ro4PUP+6R7mX3yCuriFHYoYIT3HW+V7c77v7hTr/SZXf89OX7uvIfbUobAzhH2T1t8wGyEvLbKqgNk08OdLbM+WyM6WWB8foT74HeVvvyI7+cDWUBkFT29QOHVv6Go4pKUCzdvFmkzigMsM9l9/hbc/fI9v33yHF/v7zEBuWfgtL9n/p6L/oaNloDK/2Qi0n2zGVlz8i2XfTzd/4seLDzgsb3BSbrAd5sieT1jE89l4AJNVfA8NK08rNcbL1JOfaUTvcUfT6GAZRmJcupcrNNGYPuS1e520BwrUsYmqwMo7Tl1mmkb3ze59r6sq4Xtm3GQqAzSQXhsEZEDUkgnJhLEKabQRTRXXnG86DSndIxSSyernFC+KIsZ2hGK4j2yhhjMNlTh20nkN8kgZiHGB1gpaUa6H9jSesJkWlZTnrZhXXbmYKKvoLk9obOvVzA3mRl6nmOm82NrqewD38JybIMZERcYD0JTHJv8pwor3cbmQKF4Hbky1NIdmaNgub0v5knGYTAn1R2LBBex8guF0DH9+DX+xQrMsUa+3yOuG1+swz7Epa7hsg4vmL5yvb+CKA0ynC7yavcBn0xlej3axTxzUq0scv3uH9z//Ane5hPXuHoD23UPg/+Haul+CXGMgNEQRuDpDYamRFKzj/C2cXWN9uUR5+jeuD46BvQXq+Rx4vsBwMcVwdwI/KXBdAM18B35nhGIxQ/FsDMx2qAsAOxywmCbZCjZGSlcRSBPEnQ+8avT0elgDOaG59RP19rZ313Ga8z12KOVFbTTFLUJQsnnQyGBlc8o3SROBKB23Dsura/jTM+ByC1aJpL6OCzgLQvkYGWYYosAkcHzyf9iuNizWSnPnUenwkixTj06wPjhEffgeg+UKu7R+HQ1eKkGyQMz5bZzVVP8W4//oMRxYEX8LxT9rKYcNk2ZPlesqtTgvzS7N8WuyF4bYG1O8Ylh6stJSrrpOml0Q1pbprI0TWYQ9Y6Aq985HfrdC16swcOMGa2juaK1TRCRywi93Pg4LpRHoo5226gsw1J0pYFVEAUNdn7j5ZHm6retPJ/FRByWpEfqaJWmOEL+H4FQlMSKsixSNFSf/LepW9yyXNGHvQzEpxz2Km4cmR/p+SGohGS4/YH1nTRQATGlgRb/JktB4+w0PpivE/LpFEiCZhst3EywPE5tzPS9GYAe6t9I04h5tSVhQqEDaWJL9oa0rtfjXz+a6xwY0doKA1rjJnxnpRLKGKXZqfp3+P782FtcI0caRRrbeNyr+VbeEBZ/ph2ptcqZzJf4BAAD//7Rdy27bRhQ9fIuSbSm20yy7bTftpkDzBUWXRVf56SB9IUUXRRIbaWM1ifyQbJEiOcV9DYey7LQpOoAhwA9KHs4M7z3n3nNSsZoTJCb0/7ZhgkFjUnHUvr5Y0R1Z2Nf3bnDvu+mT396uR3oJhSUxAQXr4Y98j78wll1nIMCwRF/Y5MZbqNjDu/GllTqhrPqvC8sHDGE59u7TjDZmqYqf1osS9psk8b8LRO1AwVYbgn8/XfB83bjvHTH0C8Bg83WxynM+AAAgAElEQVT6IDZtBBNaxFbwH4pZmOgGfS+16odORMqobMyER+x64jrQKKKa6sbJGQlvbIPydSV5jaLMl/N0+p53spPu/vkTF4TEI7jEONnBN1ZPXYQJT1CyTtc2rOi2/6YppVoArsxRu/GHE32V+YgT+INyhsP9BzjeO8KsmOEAY1anNYcFAhEpKCX/bQIPppMO0+k5kssTecDV2svlokEATW9PyQCx+L4EKohBel3zu4eBAPTKbgSsWxAjyTNhaZJCgAFS/2Ul8dgDI5G7HfAgFOPxD2BFiuNoYMvpPtBLTuinS2Ok9FkIDa9lLXKQo/zR/5H826cOy/+H3dwyJMB22ssacYAjBY8itZ+TJeDFAvVPT3H2+jWmX36F2WefY/TJI660bLncNFVGWtodYgUAI0roM8daGHyj1x1wfYVmfo63p3MUjw4w/fQI6X7Bol60F0k9ouEva2GxPdx/9n+SzPcA2O653XUN7gkresX1Zl0hdxNU7yvcvL1CdH6N8t0FsrM54rMTxCcvsfjxF0yqDbspTBIFXl0vDemCexEP0lEp/ycMtXYOs4czfPP9d/j2yRN88fhrZNmY0wKVNAsSDbmS5NmxF+372GHOATea8J+piv9vWOLX5Rw/nP6OBSuQN+hGBW6yDklJ1oUNkjxiX3Lqo6UKF+l5T6WqKlLHCm9j2Qu90UvDumRO1ktgz7ej+2MA5jAIrwnpJtrsbBe5a4iolXnky7OcggZiF0hVuChL1GspM421b9gA4C5smWOmptegGLS0BedJq5UNAHyAEg4DFvzc+ABbyvKJHZXzS6oZYu05FUYMctZ1uFUx4eeNRa+EyWGB3Lb1TJ4AIOJoI3PPTu7Sd6mBglQLws8Hg/SQ5N4F7hshAGEMKJMEsejH+DNV733YVbm9Cy0I5eSNXl19JwAsvvaxlLvzG8TsmOEoSOUzN+fS/2i6j+R4xiBA99cC3apGVFdINzX2tGy1Wt2gWdc4ryq8S99gkeZYHT7Ee2R41QCTP95g+exnXL78Exkpa0PcjroPiLj4c8Dur7839gPdy87OaGHkIwX7yMqzrVu2FqVgtlgt4ZZXWJ++QjqdoionSA8PkR5OmZVd75+jGpfoJgusywzLWYniaIrx8QNgb8QOHCzGOcp47hxZwbo2OC+35vg/PpoGa6S9/bMusHHm5IYTM6l4pbXDFQxEpF3fYLPusJ5fYrNYARdLUfWngKNVweHYdI3kXGRHEG1g95QZEW4dMMnGmFU1xvM53IsXWDx/jmJ1iUlE1m2VEFdQi1ceGdIuVsvIBpuPnpdhvcA1VZES66/MPh0XxCG07Y7NobiRtSCb7hWLWzur7On3isx95CuL2q1YNLkFtgoRwbbdnVhg032g/mlK4JnFTyyxs8qQWHMVbZNJC62C1XYnTWKTNNlBjqgGVSzgooF/lrR6i9NMNCycttOO8pF3AwhbBnflE+H3zGveSts5flObbgNCQ4cCmxMjrgZ5Ryukjge69Ay0ZJh+l8i6Mi+27ke/1q2agv6mjRufU903XADC8Xwlzuc29n+EwwTvRJA994x7nyMpKGRAPIMcKjYf6JDxmqDnyJbmDomZ0nXNrYZbBojjI+0a/T1OvrWqx+ZGNGqG69UABP4ceh+IQKB1I/8HaQkJAEFDWudI10Ke42wbqppbLB6sVWlEFhhgxfkRhaRJBxcBf3N2LctxE1H0qKXRzNjjR1zJQB5QIUvYsMmONcUXsIKvZQcbqEpgBZUQV3Ac25PMWyO1mrqvVo9wqILZJGVXotGr+95zzj2nqBO5h8nsbEN3mltucwXeDORakS5R0WB1pN2YXBmKECpuCAPCXkOV5lVm3mv+urqolgOVynRSfTJmM0O/1PAgnXkfDotYXOxLTAi12bHRkDH/3ieNFlSpl8zGZzq3YSMA1uybYUOTNNfsBl93HgPyUPgIDDCr7iw3vRs9YAmGE8MRQqTZeOMWSS9MXq0LlcX9GbvPkstE7SCeB22UyyMBcLgQqxERZujLIZISY5/MoyAwz8DRNm0nmZKmsTO6yRlF6rIrRcYqoIDNXPaLMvGMcAo2iEzvQx+ej+fzzdkNl+bdt8stF40MHO1qEY8n183MCWUGKGPeMPWxMDAEyk4wGLVnyjLS+yPF6fHhCYoGOBkdYXp4D5NignE2Qk7Tjm2GgSsl7imXopQQd5JzT9wIj06mWGweYradYe1XGA/HWC1X+1JV2nCGNAtccSJEvwDpM/zph1zCXZPDtD8c31iDmYMsFChDjt2mFkVGVUs0piskGswHNvDiQtolmLkdL5PnwMEYf3XhLko+P7uWhI6SZDM6xvYAMWapDGgjpJtGCHSokc7bYyPxdrFB7O6Vd/J96M/auT3W10oaNjOMGc/7IxOhr46Qn3ZSzR60QrOpVPAU6nOc8wZV4SyXzXM9u8T7H3/A+4vXGHz+Bcr7jzA+vQNflPBFhqqVOETiJDgqxqn/dUvyUTLho3dZoi7rywWq1RqX15copqc4m97jIpWanIbm4B3DCV3s3C1M/m3sf4qyy0kbU6lFD7079u+DPF8u2N+BsK2Zpa7nK9TXK2xmb4DZFni3wWC+wu7NBdz1JZa//4r85goPdqSWyCRvXccYoiQxcvdd85+ygV56Fnz59Cm+/f47fPX1Nzj57DE2rBobsKpJe/zkJJN35H82/0GPXetowlwd/G/Q4ll1jefzK/y2uMJfocJiSBJ/x3nodN8GbsL3hfY+Am3YaE6/DK0HAoiqEoD9UFr1IMn458JeeAYaa52HZ+MyBuI72aDdX2EuukWSIpXYqbmUJtb2KmjzCANtzX1+z9eHpI1FBE0lGq9h75JMZ/6juR6z7H6vWTW5aJ403KGnQjH3aFO6ed+lwmRa1MJM+mw8MHm2S5XeRhmrGRnVbYzDbQtjjwrsmt1eCtFAWbU4Q9+E6DvAe0NiYkr7AgEWJkHlWOHQKQxdjC1uFTTxDKKmn38D42zOtytK96+nnXOfPW7VHEtknIGTZKBNdP94pgYQaS89cjmqNtO91aEcD1BMSozunmJ0/wz16wM0VzNs386wWWxwSDVK02LcOn52h5yrnmG5XWN2/hKLZYXZcofx+SXGF1fyrNAKyQC61/XpwyB1btBrAoJEIz6V0HtYYwEFpcFNqhgIeg6yHFENRZFk9MauB8izFs27OUblIapXF2gmBwjHxziY3sVgPERDZtWHJZrJGOujA6wOx6wMmHzyMcqzY4zuHLOBr+f+WVRX3nVAlN2RNm0o/gF2/DcTwf5H3oeaCQCqIQgA9tsdP6u8prY56tkG1XyN7c0CmG959IqzJ1vRRJFVo7NFMvoLyJrubHyH3ntIRCiNEZTeY0LE3atzLJ89h3/xAkfVBgecFFbJs0fvVxfQLXuErummZmrjMVUJQ9AAG1vLmpgCXwxX8VRMkgSSAdOPTvDkyWN8+vABRnmBn3/6BS//+BObuovrtWefQFPqZ0fDgRBxShBRM8NrZRZYRWBjvHQsS5HKso5BNibVZrVDMuMfc/E14SuqZXWttXGfVlleqjCZhe0ZlEPJSbqG1u+EJOJbDOTqPS8eI1hS1plGLk0W32htbyPCvN6z6qGv3O7W+7C3/ocIIpjqm0YmYuqTmubFc/TdsS0uuGm6dyCmAyTeU/EatcJ8e400NOWB9W0pYx/Ur6UfwQllzPn3Kp23+8SkcS7OXfYdXKJcSM/XCFTY2EIQ0Jf81FICsV9jmfqYFQ3szdNL2LL/W9XQYjbZ1WA2UsJ9Eo2IKthqa7zUsB2Akzb/Elso19vG8mxPbdTsXsbrZR/nMTlTrqsHgu1drDrQ+xafe7ovzuFvAAAA//9kXdtuE1cUXWcunhnHzqUFFVHRClJQkar2oZ/QV9THPvWPean6QkGAKiqVWwkhsT2ee7X2ZWYSLEUEK4ntmXP22XvttddK4gURVu0I7IxyP3btIw3f3TDM/uhs5oN0/SwRSwzOSkMOLbXGgNG66EmvLKswo850RjeJx2LCUXcXFYIlEzKnbIta9QJcydAQU9pwWDdjvDk+Tx/Uf3yyvegnO7vY/YB1drK3ZCkjnYcX2PqScyu7K+CC01M+E0my+SJDkprZjfX5IL6Xsq7U099pjHMrPOtSKCIHGXFIDVnUBEd9lflZtqVeI4qr0bOfn1loziYY5Zuon6n8wxYfwRYe5HJdpGsVxnvBa8b7QB/dEUwwuxRHX1mAU+FntPQQhCnIz8SxC1n4rJ3NptiIBIGP+SYdN3y8wHazEYXWpmyRDRlCGYlFFrm5RSgQak3oeG8SLzit2CMo491/zGic/nDFTlgBtM6XqhZsozAU8xkDOL2Si2OlNEepJKdFUojQkUzjWVIvHu1Gs2NRvYoWKNIjHBWJfG37naoFU72Wok6tzjMxmWqYRI1LqJ8ogfacByh/zFFkWvzJZ11Mv//F0dG0FgegWigqiHw1lcBMipEJFa5fdNjUpQiT1WL/qF3XIGrkuh8Ufcxnh9V0zRd5Yf7InQge+qgJ2RkqmJPIumTxT5EmAodiS5SnUjSLV/8seZz7RTfyNWA7BNRUhKbXuvjv76WYzsSWqFUbKoqCim+s6vPxJXMm9hzX7zUBSIIWZJGJ4OkLaZqhXebIdOnFhV1iQB3z8NFYV1Ahvdrj/MVTNGdv0N89xXD7Lpbf3MUuS5EdLIVSm2SpjgJ1FYjPyPXhGzEjZyb0cXEgmgPDZYf28i3e/fMB6ckhDi1BTfOAwFlWt0pbaLFW2agFi5Oxi0sh0Jm1i88nM6NO3c/YqX6RCq+KhSWFTBnC9h36XQVUPcqPG2zPtujPS6WWXtRIywrLzRnS9/9i++wJustPyLdbZF2HY3ELV3eHPkyjHJEknbon8kgR8Ng0ojuxzwNOf7iHR7/9jl8e/Yp73z0Az6JhoB1erE4AIXyuLx6ufu+RYyqRrzFaTN7TNxnjxX4m6PcKwF/Y4Hn5Hi8vz/D3BeeiO2msoUixZxEW/O/2AuRInLJZvLZRkSCCce63L+FM1pyC6kyydGVJyirPJwsT6ByiKx109c2fuobRoIrmwTQ1Iovlbrnq4A2s2BqTCCOPKINrKmjHcQFjVUkHy/4/jO1uT4B6tQm1gtq9jCVmj38H4+8xUVku87HQ18RskC5FPzRyluUGsHpnhh01nreizBzUUaOz/SdCscZ+4TYVOnbQIl2AwojjR6p/wOvhXX0VP1SGSQjDyASTn4mVWciL1nWqut4KGy4xH/wejflME9TqIqVVC2CaW3fPKZ7C34yuYLajKKp1sYcZIikJ3GwBa54w0XLF8sryIJEYadXmaS5UeR0gDqZmL40VfWWpzuT7IUJjlN5dop3N7NubiG+s0J+sUL19h3RbiWsJ+WyMA0mr9zNlklo1yNoBEVmLjOMHB1h8fQfxeo/th3PUuwuxOWUsbjrVElLGohe8g8SGCHqdeV4JoExhtt5ARy+wBxgHy2DC8XPavpP1PSDnSFBnHtrigFciqSvU+w3qj/+hfP0K8eoA65MjFKs1jm/exi4vUdH2mfv59SUu8gjFl2tkN9bIb52gzYBolVNxUgR1SUsKFFJkfmrHrRTUErstjzJrTwfsro/FTNbLE+tFvh8LBy1kDuhlzwKC9mVNh2UX0HzaYH9+ifpyj460JMbhVvd630SiB0DQIFhe3c+dt8Lk2cJ/00QdMELF7k+N46JAvtmiffoc9bOXSN6+wXJfoiAQJGs7M+AgskjdCtPEY/l8OlxidBJh12pTh+yTLiSoe9VWoX859zJ1rjo1jsHypMBXd27hx59/wsPvH+L+g/t4cHoPJ4c5XvzxBI8f/4m6VdaUK07xIfoN9tzqsMByvZR9qGBjr2CUWXSL5hcL71Y1IBxo4XvMMh2Hlbtls97iEJAuxgJOmnGRgq88kzjq1Zr9ho5ABTmHg8xSG0hIJmc8Ub3dgpDva6RtiwhyrAyioCLJqsUAqVNwLb+DjFdmMq6kDFVdY7Tv7oyNTCFUH/MdwsS4gyvew0BmOQc61dcig2zwmJ2gdDHEYHk7JlAnjbRY9jw9TSdNNOaP0kC0vFDyHBtPUDBmuu4wly0WrgueQxbvMo59ix2zucEIC1Ffg++7pJWpMQ98NETEtWNjSLPeaCqNMd0kQOjn0Thi0E8jaS4YOM+tfR3oPVCBd4nXM4c4HxsRAV8TjxyB5tmYg15+b/Sa3pqB06k1uJkvy0gHY36qY+rOfufZqmdXQEpW034vOZ6uTbdY18b5HEDhecn1smVuZsw7AlDU25Jxk7FJy3UQIYoD/gcAAP//bF1NcxtFEH0zu9qVZMmJsWxCKjcqB3IAigOVnwEcgHt+LjeqOFBFSEIFquI4saxI+70zVHdP787aUpUPlq2VdjQf3a9fv5e6gCpZWjRH0Gzt09BBECQq9OjRQulHywNEVYhhI7QmCPmJcr9UQdIJ2qK2VCryE1co9BqDWrvtBysWqpgqgnef4n3noA1BldJf6EvOMjuheFnucW8CCueE8p9G1hkBfRo86qlqkI0VlVEcTRYxMyrqRsQm2m7yGbmCH1n8aSWnjzzZud/zzniqnoHqIwwUnAmCZUc7R+uZgq73N+nZcTEbwg4WImqZyIs1m2GG8RDr+34SsE7HPCxKP/ru6yIxoZ/Za5iSJkd1J+h1+WyOZl9jOVvgBCd4dP65tJzM5ljkcw7ic/aOnnMfY/wQ54QxHdDvBLhfRaWNhxRwjR+FoRiFVX9crvPnDPzrZiBSPNHcUv/6wcPd82jNeDyXmK0foY2Ey7TfnY5I3gTtiHP7qNo7bR+1w5FuJhnQ+Pv4vBt+t0fo9eTNqhtGiwZvrt/g3fY93t3ecDAFru5AeiETx59RkUXe7HG/Vyt+EIBCwb3Q3mbMPKBKP4UQBN6R7eYiO8XywQny9Slqs+UQQ/vzk2Ad6EKw3xHLJ0vx/McfMLu4ROM8qrLG/vAJbblH0lToiz2K3S3KTzvsiwOaskBVlPD03uRRT20cFCDXFXICKE3CHtEEGqSBTcJJhR/ZASpMKCrsYS5wDzTNAYeqrlD9+xZl51FXBdLzC646pesV+gIwM6HuwTVSbzYSJCYhYUsC1EBVLa70lzXa/TU+fNgBZ2ssH5+zfWD2YMW08oaYL9ZgkUgQSRVk9RXnRJ+YHXT4sUNBCFjpfSiw9BqQWvimRXkoULcOzaGEPXTo9jV60ifYl0BD4lw9kgbIa4d0X2Kx38FcvUL730ucbq8xJ30PZ1m0K9WQcJgSXt43hCuc7LuObcW4RYbuejnDz7/+hF9evMDTb55jdrIWZFzt6+I9+dgkixOiaNbbIVUYISXx9qD+fitChABuAVyhwWuU+O1wjb+qHV7vP+LWtGhWKRqlJVtSWTcjQ8XjXgVXHRLMRKxVzyorKs5eXmyHOxqrdJwosdZLMijYu+imY0qjMdNqkQ+aAceolfpIQkXXqQVfqLzfXcMCEpkJ1X9o2wsU/q4dhWqVCkkBB7GXEBhoWhERX//7Kl7aXoIAbvqo55oTDG054PzVhP8X+iOzK1QFLL5mBJi4SM06vg8EttXoja1nlAvJqQ1MxzYIh0l7hdPqurYqxNcNa+/uwwabTmFc2HufIx4LZSCayNZYKzf6tz7aw4/vvSOVNAaTOSGgoongFFKByufI5imy1RInjy9QvPob7ZVHu60xNx4LEtVkAEAEzKztkM6XyDcLzE8/Q7Ip4XYlkl2BhvbdYsegNu3tlJiUZcNJKX98Yjy5lhN3pqGiQ05FI98ho4DYi/aG7hd6ivloNd8F9IY0yHPtASmNMX1eB8x7KuZU8FUNd3MDLJbwV7dYPNxgefYQ9ckS1a7Eje9w+Oc9qs0KtxcrpOenDAbY9QLLzZoBIN+RXWmLxGTMqkjCGSVCbqKr03nRMhJszw1z0UQ4TRJVNU2wJuR4mFpZO8fgtWl64FCj+lSgZkCmgDtUsLWBbaiPP4VqEzHgQC5QSeh/DsA1VKMg/EhFvmPNppSUyZ3FygH5+y3w9i2K3//AcnuDvKqRQzRnmuj0S2LulpE4g8P3QaBNfrgLh9aLsTiQnggJoiV2YACcXW7w+MkTfPv9d/jq62d4+uxLbL64xMPLMyRZgmVGXIcGmevw56uX+LjdMQjsgr2kyr46ZRCkwIOLs6C1JWLRDTpup6JiQx5o7Qgiby6I2lEsrmLiuoY0fkcoXiHqcee9AKpdFPXR054bCqFmEDL1o6ZKSNJorfF+af3gXe+C6J5eA1oUdKMPfUwDH1ZypDmiLcjynBvYwdqiO9lbIsFTF2lpxc8jsGZ91MqleYIwIMbrKhtCX9sFIXG2CQx+91DaPesiTFnNY7I65hCxMwqPuXfcOqCtCgqMcp4St1p5vX9VBzqufyQgTXQGhDmQRBaAwxhFlH2uvJOLFX+/0l6uLRl0b8xwpiJeuEcW/qU5FtvER85YyvAWJwLJf4UdKzmd9O8LEK6vV8A+Fuvl+w5xgrAgVLtCxnMUhZf5zVpgBGjy3iHGy1xAIpFp5/E/AAAA//+UXcuOG1UQPbe7bbd7JuPMw4QJBFgkQmIRaTZkB0hsWPABrBG/xooNH8COFT/AUwEpYUKGmYzjR9v9blR1q25ft2eQcmcxltt22/24t+rUOaciS2+Xi8hzj4RP+RMU6CaAQE0f/BPgn3Aj9J/+8/p6CmqJ1kgHlLSIlfQjhlRv+7qWzunS3pgalCilpe+yqx4CCi7Qws5GIU0rmhgbMHRt+wKhRXZt+DoKPtxxgRxINkkSXRChiIRiqSuzbelkAQRuEyHBmtIyVO+nZhQ+eKLtJ+hE+SOStn9dW8QOAGikJYgGE/a5znSx6U0M9H24SitoEiGYG0FBNYFXzYy7WRHugDy3jZt6VkP1pZr0SqmqESotVXpI5z+Ox3j/+B08Ov0Qb02OMRC95pDTa0stDi2xbWfvAYTG5UjfHefQ1nOUUqNVRv1rdlyvOQ8Oh7ynhoMAR0rTj9xyNe+GpduNEDIYYH9x937eI68C2+fXAFtVzlJwcMgvirZe3wcE2JVBEqCOeWH/yyQbCAAR2oVzenqMl0f/4te//8TTi+coTY06rCxVE9jRLbrveQsIoBIXnRdosiS0nD6PqnWmkR664xiDJMY6gPQm9tr0+b+HJs54n3tB3/vgFAtjMCtKjA8mePD2CQ4TgwEFZGmGdLHEfD7DanGNVxf/IL2cY/FshuVVimy+REjMnlWKhK4xolkS8kwUU65W20CUqFJOisDm+5FQUa0mmq6deDjAKE6QjEeYVxvkVxcwdB+NrPlUMQzR7kXAOHKaYa1v0eRtpDrbtJVFgI0usCQeK1EvL7Emg6dkgPL+FHvTI4z3x4iIWRWOsKZESOc8WlDLBgOqCOVkPghrsJgXHGDG0RhIMw4sm3WJ7PUGBSX6JOJM5X8tXE7SeNYGSRUg3uQYLZdoX5wjf/Ec1atzTMikqGhYWsKUf2Pn20aSYBpK3VXK/9BV51vW+z86e4yvvvkan33xJQ7vP+DEC+i6lPwfuNQfqhluXaW/Ex/ooDZ7bRSyvp+0/U+R4Q/M8MvyHM9WS7wsCqQGWPN1T07hDVdmIGZUpumTvJotaqv73bJVpSkty3ACJ+Extl9cR8uFUIaYRm+cJtqn2PsOzdZMb5vS6Rty3jYqCRK44s/deGzVv9Mx9hgTb3gOtAWte+wlPGzA20uQcwESSTtJARPNrbaaI8m+Jt7SDo37uQc1oiCyfaslQVTZQiNJtIIp/QAMaooqOl233XUNCJ1pqgV5R3zcR8meDaA0cA3MlsEWV3dgg0tn2Gm2KeQcdBk4UH/HoFb9FMxu0P/m4ybziEokXp2Ej3LNmgDZUYA6iVGb92AOD2DOX6O8JBC1wpBiqtpq8UmCR5VdYsRkSQQM9mH2E4SnxzxfJYOY1+whxQQVcBSMUOW2xVqdFyjXa1RZiiydA5slsjzFkMx7SUJT5jiJEm6hysdZ5hJeHeVc184UWO+s3eKDAgK0aUw05LxATrHVOkc93yCYzYGrOxgd3kU8vYfJyQnK6ACrVYurxTXqiyVycqM92sNweoDh0T7iyR3EcYSSDEoHkVTbCJwjENfO47wSa7VOW++GkQdgepppupZqu86QcSzNz4ZIV9cZMxrLdQbkJeq0YL8DUxmRjhk+CpbV2HBsQ/eBdtWxtG3pwEVvKWy8wKAvb7dgy7AsMFplaH7/C6uff0O0mCGqS+uRUZdSLfZjpV784Oj+nZCuIYZJa0UBXL0NrYzi4UcP8cnnn+Ls4yd4fPYEh8cnOLg7sXRz2QdTt1GjxApR0+KnH37E999+h+vLmcRnxkVvjd73tP8BMH33lH2F2CBxEHCRzpnZUcGLmI0it9LEXu8xirttjCvbxbG+8qj+WnHm3v5F7qTQjRe/8rrNPe8Hzt1fWbY0v23ErFrnpEgTdc+kmWN1MfrWhBC9uLnxqOYKnipjiA2qKTmU/M033b5pXdhiMGvrPGMBi0iAAM2BymzDr2NZqSTLWuUvxRzPL67pYMa15DWQ99UegOJaaAb2+LXS8cQHrllTryaNXltGbfdHMS4bz1JxBttrYn8u7XsDUBtAkhOo4bl9jwJrwhygnI2Mu7221rReUX5K1zkVvKkd/p19W7jYmotELqHdCm5qW675m7Ic3BovAHwHuKjvmpWL6DlUo3sadC3TcWGDXQGQmQ1DRZex9cSjx8wkH8Y8Z1OOQybtZVniPwAAAP//nF1LbxtVFP5mPPbY4zikCUmo0ko8xKriIRYsEEt2FSCxReL/sWLFv2DTRSVAUIEQIbiJY2cyD8/43ovOOffeuTMJFWKkqmpUK/b1fZ3vfI/EdZG5I8gZ9gM6OqH4lBvIqEk3wZgyhwStdlQ/odWGRoImcNl37v1ZNvNGeKTNZ43XqDPdiXxkj/KdAs10yo4e5xYBG1Upda8bv3toAYmMoEOjnMaP3TupIxN+oTMAACAASURBVNrLapUIEVhXxxhdV0UHuhjYTrm/AAaOlUN3TjZRzOYS0+Qd7cWwTVlGgUOIuMtsQQP6u676FPDIUTEtaqQ1eotn5OUKWlz5owC9VIFpikXUXKwEo6MB2ibUnVFvY1Ks8+n0L7JxRf6wkEABl/UsOaRuY+1pkRjxtBszusOGoyd3wDQZ462TR3jy6F08nJ2R/QwX/tWuYio+m4dR/jjNv0GFqvQu6JrdXXyM2AUtRtK002EhCKyAAzQ+lqyNqimRpLrLPLXsgn9T5vvvweqTKSlA2Y4/Lwc/DgJhRMbc8SgAOmokQQ9s9OQpxP1nCACkAVtjyACIgrg9+sykwE/QYJyeoT3WqJsdzvO/sLVu+GwmSPO63notVmhmxP9Gv+N4c3ODLMv8fCPal9sT2IODusBE20+nODg9xmX8M9P7+H+YPsUwsuO1qyv8+uNzlA8PUbx+iPNWQTU1XjQ53nnzGCeHr2FxcsQjcRBp7DUVFpsVqtUazXILc9ugXN9ArXNUV1fQeYF6vUabFyjX1zB1zXnKTEvdRbazJPZwnGFvpCdCLvVmEjMSSN0LpvqnI2zHGpooqBQFZRqM5ynTGNuCOeB8SI9sESabeoerMBs5toUYrb02kZSNTc5GVU3ZovlzyUZe0WyCdCGu1pPFXORP5LlBsgByJ99qtGXFl8D6lsyytigpS6loucPEuUrsGE18xSlxjAEjwgfSn1InaJTfYkr60NUVmuUS+PsC0ypH0taYUv/e7LwvBM+jWPdZVAOzP/p8tA0tFjN89vQpvvjma7z/yadIZvtEBLZtX9HKDbvX//WJuvu/n+2Npfmvk4Q1/pTb/1Ozwg/rc/yhCizbCgVJPMhAiCVUCSJKKKGOmS3ulQWTQ0aCiQKad/CpE1Z4KJmzdOnj+DZx1ee14FzN3dy2gAB976Oo20PDPQDBvvmq6MbwGUqqSFI0iSX6h/OdB4B6yAYQ2Uh/jwlNfCUfuluhDngPnaEl0irxUUhD8H8Ud1nJcJ033tPl4sQAvrEpFJDIKWbC1a3XusYMEGivS3VPz6DJ0phhO+iJnV/e/yIW3ZbcUbrzkX5OJlsMK41d1yuWrH/XdYtklvPleCfpJmxY70CpEAQIx9pFMwbfbZ+9EQfv/f893WsFGIs8ohozyLrVAlZRVn5L435yyEkBZjSBIUDz9wskzY47skT/n49nfC5vVYuaTW41oplEgrWtQbZ3YJkCY15DyWTKUXUZFaXsi6F4/27KDUxVoHp5AeQbKOrQbza4vlpjTh1a7uJrSU2xgKL3C7DMm1dtDY7xxNHNzMCz6ROqZgZJvbqEXs5glpeYnD7G7I0zpPsLHOzNUW4NNnWDIl+jWRVoFilu96YY7WVIH+xjMp9hOp+yrJIZRZHcqwikoMaF+7ZprMdJ/7vjoqLRzLyi/bYqKgFGyGyz1tA3O+haAAKKoyXwlk1yownfEVvVyB1aO8BKzg7eY1xiBJuJ2ruqahFraYskSmNGzDDy5rnJYV5eY7zOcTxJ0U5TvlcRQNrG4jrukjVM5JpF0qBQlpPhu/C+oUR0zwkOj47w9uMzfPDeE3z51ef46OMP8eDoAC2/IgOFojJox/cNKvt3EDGIQl3e4pdnz/D9t9/ht+cv2Cd3LpQ8O6rdeBJOvR0D89MjHneRFwj7jYwcy7LgeDj38P3cZv8LvVqYjBJXZ4t+W7NQo8ytQ77DcqEvklu3NiOtvKeHL9h0FxXnTEp5D7FUb7fHKXVPo4pfE3uqvI7upvqEIK/xrKvO08xE4vNFQG9YSGt/D+1iYd1nd8U/G/WVeZe0po1lRk/EZ8bS8917cOazYZHtqPnDxDKWb1t2gwOvHbOaa02rVXceaY655fxYYlujOPkE/aG7zn2gQ2zPNxOwNRxIQncU9k4YGR/nR2eByFO75LPw7PAMNmeaR4kp5Bth6f80BnQfdjHw/B1TSox9P1xPW3ZENs5E8kx7I59BtGYEmGAmAINw9LuINWJB+gE7PmQfuJ9JLSr+aA44oLUczhme/ywxEN8hOXsk6YkqnTRN8Q9n187jRhWFvzsv79reR3Y3GwIiGymAUBAUQSIFVQoa6PgDNPxGGkRHATUFFAQRKSRhX7HXnrHnedF5zVxbgBCWol2t49d47p1zvvM9ko3mcYtOTW98dzzujQPMUM6id6h0TLLdwV2z9ewyHsYhxKrdlwm90PzbwGlSJvQWf9DxxNupVtfyM83dEDqFNg8Abi564wdBszKNKuxMW1GJy3JIjzdDkC6IFuK8cv0clqcMLYBIvxhrTB7XrEpjQTTEt/AibipNDLAorYQ1h+ExtuKnqYcNJ1a9f09TacQDoNUoDStmxB12KMCGKf9WUWdoF2fsC2JFJztlw9s0xNwoI3WNtfco9HkCYWShEfWSTnwxrxCdn8UY9gkKG3x1bTu16EjTAV3zW4YktngMa+aJSutw/60zPHrwAQ5xwJq/WKfe42TSG9C4TqYD26ZzlEDwb6758RZYVFuZRuednWN2bqIbClWvgIVVIT1CbhN9+7MWk/2n8kiMTue2GvL+QX/zfsOmqjfm+y+TouH+DmGUYGh/ByWgdxh1kkrw9v6b/Pfy2RqX5TUW9Yqnzmhlo6LpPaOQTpDzTqdjwbvkopCKRfKrYJ1aK6BH5DIpH1rPjWpVd0jGI0xPj9GmDtWaiv7NI8mNFMhZ3nHk6OrX3zA7PsCdz56gTDO8OJ/j+vICi9k57t67g9tn99hIjwwPKRorOdhBdnSA5MyhygtMy5ob/elqhWa5xGq5QLPMUV3foClylNdLVIuCgrVREZsgz7lpdosVMj80STE9PwGXUYumvEGctsxLjJIxZ6C7NuJ891RpmqJ9jDjKh1MFCDSLnIJwCTsbUTHSRjbJkqldHI3Yy6CbV8BiDX++ZCuLFVEWswSr3Qn/hK793KujXiVaT6wr1VGIZICvTizajIBxxlMsWivHo32AsofXC/irV8DVObqLC1SX13CLBQ5p+tURUt0oACYa7MYF4nM3FOBG3E3N5M8BDx+9hy+/+hpPPv8CJ2fvsgGk752q9dz8n3bb9nqWRt7ocr5SR/9fUOCn9iV+vnyJ5/kNisizc3+dpGLeqUU1vzrttxBTyYZFx154G+FaVH4+nevk4UL6SXIpn/gYUwKaVxUbs9KtpslQ5dEkjo0Ni6ZCOh7L9Y5F6WLsakZGvAfTdUDp6n93s+thWBQO5q1mNiUXfZH3Dfut3d+Dx22rzvSRFmdaPPyDxMvYdjY1M0C8PzZqvGVJADb9oesnTzz48XLem1FsrAW2Z8URvbawJozW7KNMvDsIXFAwgDSvxNKItyL4WKqTSjFNn0+KR/TGWpvASqsZ+1AgZjASlBwQAmcdr2li2NB1gBmEGoPMtFn6v1Erul71/KH35VU+ggDb7lNX3OZ0TtgdXi8B2gD0awLqh6QA9RYI1DMKuqGWCY2qeIlSA+SG7zQiwFvBLVrDHEU53cX47C7iW4fosgz50+eoLub8BmjtU3IE6bnJI8ape34OiSBsCBRU/IoaGKa10veaSSQyMTfSeB9JekvkV6t30OUFiqsZmvM/0Tx7hjX9/nqO1WyGaTaFayo0fs1FMc+PnALl6FRGGhyDLcnQjtFk9UpLR2/kHagqo6Y7f/kC5eUM9fM/MDo5xfTeGfZPjhhEnsUtcpdiPq8ZCGiTFYrkCkUWY7U3RjbKWHvOefNED6YTkDwQkrjP1m67UjPeW96au9KjXFQol4XsIwS6UgQlNTk+wk400s8Ri1cF1Y6drOGaY2WVBaAeIz2j01syirCUXK0gAT0vxB8gpUHLLEf3eo7y/BXi69coFjlcsUBV5Gho8k+MUm80+y6QOOlGOpqAYyZ2M2BvjN2DfdbVHx8c4ujWEU5P38Cnjz/B448+xMcP38de4ljoVXFlRXVfBR81yp4jUHaNZbVEXhUoFzPc/P4UP37zHX749ntUi5oZY7VS/qGeTbRPpVmKeVPj5P5t3HlwhmwyRu6KoNFpeG9kybGveyCMJ+1ac3d+iPgzw2Jau+Rhlmicn7FbOTWEjiU1i3XJ+30XOOhz/dvK9xNrA0pgaxpQtSU2vdxosMMhGCCxyDIwNDnyZlVlQzi67U2nnKqELZCQQFmTIlizaD/RAwftIDHrZB2ZXh/qE2Z9Fk+GYzHqc3Ab/RodYxt0GnCBgJltTTN7gXRDz0OghckfTEpOx6/S2HEEsuhImdrS/A6xe5aQEe5/kcrtmNUWgNuhK74175HGKYbG92HvxECR+h3YzdgZEmm/Cf7wYxikEEkQp8so64G8zOhmDGp7LN1P1xA6t2h4QjJUG2gbGE//Qnm3eVNwv7ftNaKSPtrfQzmAPR/V7TKEJS8KMo+kPtdjMtlBWZb4CwAA//+cXUlv5EQU/qq8tLs7naWnJwkEIQaJCyh/gAsnOHDnjPixnEbiBEiIQwQZzQQm6Sy92i6X0XuvqlztZtHgSxZ10m67XFXvfVvq83VttMDQwJXCOg1dBOv1L1pHG41O9xHr4mnSrx2CjEjTol2sht+UsM6ujXMqW+7ye4pDd+G6hyLOGucsTFMHt17Osabz9X4Edb0T/ZBGxnjiOVAjK7Id7XXschkaGElnJBHMFZxphLGiAzOuaI8HlDxAnQYHbsH3TsnWdbS8CQl3CnlzJWi7dNsSvhesW3FIorAnUpZOiJ5DIkZ8dn98hEiTRoVmSXh4fGcwSC6SvQKTaSrs2J6GRgQNJHZNTpO9YttTWDupQcIIiW1F90PXKp4IPWWXELG8TXF+MsPH5x9hjCGj59LX7tSzTDGOEblW9XS571ZI6P94+R7w9o5Mzd5+ZRex9zR7/wEiPWxMZWbMXvm/Vv/a4Nh7f4V/jFpkxMAKUsORJIfv4elsieXVEobclUmakqgQE6qcEZk/vAuu9WhbVGiwDIDrzdQZj1mm6lXcgR0gG+U4OX2G8fQIZvnAGxCKjPGLlg4MAGBE6Npihbuff8Hp5SVefPYpWlXgZj5HPb/H71WJ27LCWbnG7HzGxqRNU2I0nWC1XKOic8gN7DBHXdScDW1NAd3MkFcGg7JG/rRlGUH1sOAmQLOSZkBzvyDeMlM2LZvuCY2TKcvElCGqmHYbNNUw6stMgbBxawMVnHXGzl1Au+wurQpRO7pkxsQhxn5cWm/sQ4inkkRBdtms1t5ZU17oGwCcikAFVcbPVJYNxNk8MYwaFYQcrEvkTYsxFfNvrpCtFsD9LRf/m+vfMKhKHBB6RGwhnqO7sSkokHLylX2Xf/bctFKIj48H+PLrr/DNd9/i8vMvoAYHjvK/r/X/PwePNbq+SFjfXzpzwUfO7wdebq/x/d0VXtk15s0WDc31ShouNpi3dQ0n77Iu5jzi06AiPwX6nsYoyURUZZGaElO0GLc5niUFpkmB588njLqxoadt8FhtcLtd4tV6gXtaR5MGJhVdQeMpnox+O6oihBXGaJyTpvm5Gg5NClpA70Tt6KVt00n4GF1go6NO++m/evMgnXSSNGvaMI7i1/dnDl57CD02snYJWCcNXs/g84d1UjflUoSkeVGjfxCDha4tpbykPG4tF0qtK3L4PhiJ8RsMcx7PNPLqdj9AtIvD1Y7i2zXWA3IZxSipYBrV8FzFz3arpYBsW/adIZZgUjfCfFlXyLmYEcSX/A84DzzLMKI0F+m0MTIJN3crx/DoIrv2mwDx9fW/a11EMm3W6V5RId43CesfoUngUz94bRXTPDFWNDz2beKuhZK1pS0UbDJC3p6xG3td3ODp9S301pBdrESkMt3b8vPDKHEiaC7bzjEa7picKmXquY8ylNyZjGV8usiQD46hJ4cYnM5wMJsBb26AN39A3d0By0doYt3VCbQxzPxQtaNOt2JM11+Cd3+2QY4j5Acj3jK0FjUySxU0VqsS5eM9Nn/eQM2mGF+cY/L+OYrjIzYuXFhgRf4trBOsUd5uUKYam0wauNTcJSfAdphzg5cj3bTaKbp48iZI22rX0FYcpacYrc/cLTLhXDmWK8nC54A7b8+/j9F+6WyxC6KAUWGjYrGlPTA1O6oSWJZQmwXaaiUzZCGMXhwe00YfGA3IkRTpqEAxyFEQs2xUYDyZoBiNUQynSIsxMyFIFkGst4PJBGenp5geneDDiw9wdjjBIYDXVKRy1SAcDCZ3JUTYpnOZY/U4x+rhLYaZxsE4R/Vwh+sff8KvL3/A09sHbvRV2t8xuSYk9aG5siKmggUuPnkBTIawmWapaE3MXvIVNl5T3nQNICsNsaoRx3iaZ4zpfEzgiiuK+aN9rkd+mTbuTKwDS5Yo5w5BZzS6FjNyNsLOc57nYrDSm63GunUBTXdHa4j66/mydECZDQWyL/7DSLdSf2Cn/pLivXHzM4F+/fOI/z+xoLhuapoQKy5eXpp7mKbXDCZbc1/70DXomF6dQ3/8/1XEOCBGSywphmMsxwV1PC9yUzMCb31aWdwIpTqOYwStAE4q8mHwzDnlAJfa1DvvFd4novrzObk6yRv3xdKYfnJEfM79dTZ8RkqIcPPChuI8yVuOgCQnX/u7wxsCegaERAxLE0quQVfk8/rmWAHxQa+piEEUsST8/LIiCV6W4i8AAAD//5xdSW8cRRT+qnqbxfHEa0gMhJCFKFKO3PgD8AO4cuC3cgEJEAdQlEgEGQdibMcz9tjTS3Wj9+q96pqxQyLq4ontTI+rqqvf8i1vx86HCe4h1fRaP3jsSQ+p8rBXe5IE/m/c9VVoBnWlg3AFvTeUO6XXiCoyIk7R8/59oqFKhmTFtNrRjTUAdEKYc3jhORxl6YOUwNNnflV3pdCgCzkoBgG6TxVgeh1bQBhxE0jkgaoICf28VC1V6AmUdtB4Czyt8rDlh/JpXdtXyOTmqUXEpBHrBvp7vEOCX0w9uOjmjQMEDxdZnhugh6F7sSMnXCknWgSD5U0U2RJ5DYPoZlXi9sqcIYh79H6bvCa29xOFuEtQEKGdw0mxhs/uPsDOeJNB/8pcV/ZfnDCYPnQPwbt84it7+F1jNUmPx2qSYla/vqMg0K0UZFZ99/lfmvibtr+ekZ9eSd7/B1f0mv/SI2584DLkNGSI+9sf4nQ+xa+Hv7NqMVt1JibYhqi39ZIbiLEh/ugiETCnaqoiDMevned32jzD7t4d7Ny5jcM/TzmxragzIqJDrSqfk+IxuQqQAdTxFMc//4Yn9x7gg+1NLFKL038adEevcbE4w8HlDLPpFvYe34MZFcznXt+YYDAaYr6Ye8rQ0MIR/4npQw2SNod1Bu2NCqYm8bstTvg7ejCTO8j8Et2iQs3QzQXsomYkQ+o8TNHz0WgzU2FL7g8KHlLf2WOV4MR3GnjuEvF/5eIoHdq5T0jFgopgpqZnTnlep/Hq5Jpt+6JAKyWcXETHzBLaI5GAkdUgtGPkKqTNBW6YBsnZjANud7CP+evXcG+mIHzNGomMyrqSAGmq26fTjqzt97HplopyRmlAFnj46BN8/e03+OKrL/HRo4fobCFdHep8pVx4UnG8q8J67zeIZ08K0zTHtaj6v0CNX9pjfPfHC+w3Z5jZ2nv1U4GVipfCL9eLhjJAZCmoCT8iNJAR0TFa/5wEx5IMN22OxxsbuJMUuG1H2Goz7NkJdxuthPbdADhYL/GseoMX9RmeXZzgsCpRpwY1obKk6xs0OzQICQWJfio0+NHOByfIaRbQZKkUjxrxDfadnIyT0+vgkT4gsGyXGd77Ld1/HZSIsgAv2c+Kje9/DQ26PBrh6u8SeiJPC95DHSuVt4y4IRoYiXUOyWnEJMzbrKzDfFGyM0Zp5QngpeTD3HnV5dZDMlsfurV2WYBvKT6QggZi2oDsDFLApjOM+NS5A9ZsitFwA2PqatdeEfuivsR5U+LcVZiRk0ZhUdIzzXgUR0wZ0aGCTIp8jIP9PnbwZyzFS8T3poC+kqDw/W4OaTwYldeLP0ATNpZtvXVqzfAJi25jjIK0WkYjNIMC81ev4KZEC7JMJSGRUDpXaS1qj8HjYkxH7+lSLlZQAt0StdJ5B42OnGXaAo6t0rzy9yAr0I0KJDu7SPIhmvEY6fZNVMd/sx99ej4jgiuStGLIPGuaUJwU0VT8PRoVzTWn6SVzlmxHGb3WJYJ8K5FXNU6OjlBOX+Jif4x89xayvY+R7d7CZHcTCSHZiiEWTYu2LrmQ0ZBuChVNGMlFXyueXGeXmyf9fvN4HnUrCppFRkT14gCK7tGmXO5yGvR/o2ml6J4GTQDwnjdsZci/mVqkwwzJxtgjXenZnllskm5NnmIwyJn+YTPSlBl6NAjtUypmpJadbEyest5MmhVYH0xYR4aEfFkHg5KjPMFhmuAQwHMzxXB6ihEhbedzdGfnKM9nOD0/xexyimk5g7uc4dPNLXx+/y6eEuoiS7CVWPx1coz9H37E8+9/YvtirpUIZSywQgkdJ+u9Nsnw4OkTZOtjRgl02qCS+5cRusZ35fnWFv9zyi1ie3NNuIOVGqM12tDo06Ym5ytidc0i3WLfR2fCeDQKNtqsw8O8+N4+Omn9edd2vUXedcOKPpBz7dL5HIqVbZ8HOddbwoXPJ007hfmzDbfzEHW6LotUxsfCSpJIBVKmUAhXvpN9bK8pSiKKG3VNsjQLjcXVBJRGLaJ0irjQ5DpoAYjm23g8DrlLcJsSvVfNNWNv/SCWaDykvaKYM2oas/aNNKuDyKIUhOLmZNz8pOcn0Yzp+9rwWh2qc8NNUbXv5XNcrX6XB80/oSSUAk7XpoITe/fzGhE/3+9NTwf2z4N4rem15rwqmB+PHont8+24IMFif+oIwULAXqOuayu4xuFfAAAA//+UXVtvG0UU/mb26thxc2lT0rRJL6gCCcQjfeANIX4Cb/2lvCDekBBFAiHxUIXeaF0njZvY8a73gs45c2bHbhIgUlUlsWN7d2f2nO98l1hNC/hiRe1uTq2nNQhyI29Eh+N6kAWVNX6iq/Sz2DkM8sleGaGGtHvRl3fTf/nwy824tcYvgIZRuMKfMGqKa+dTEGpSwkJIm5xeL19C/9ShmKYkerGJ7iVeuuDZiMLRHRUIMJHxIEjjXoed/h2tUReEGidK41z5xlcNLjRnlDWOSgPxKJJ1poOGjZLqupMDaDwiAoRQKShZtvz+VQLgp0ZNB5AQu6CXpz56jiaz4Vd4njRztHIboeo8w7N7IYpXdwil9TQoV+RwhBvdCCNkdYz963t4sLnPtP8BcmYNeHOXIKs8bMJNYEAmP7ygm78sS9+43PjVdXtF9r57NxdAAZd8/Wt3E1BoW+u/9zm7+ioByPF/+yV7iaa0VYCC3YkTZDC4bq/h3uYe3r5/j9H5WOjoiUWJQm5WPAWqQwTmw0+krq00rSATolSihQoCm/IMDTnQtyWy9QS3H97D85//8DplRvyZxCj2boSZJ1zrLNiV/vUvT7BzcBcbXz3Cne0d9oF4Q1Xm8SuUxV84Gr3CyeQItz55iP7GELbfIksiZEQtLedYUOweZQWmMU+YKKWAmy+m07ewBFDQzdjpB2mSQjFNIG14WbGMgEyaaBxB4IihGDhaGpWAG6jcxhsreCebduuMzqjIblw8TMsZarHEFLpf037GzZA7Za1Ll9BmsObo0YglK7S5x/R8UfV2TCa64Vl48IzcuJO6QE771MkE7esRTp+9BMZjmHcjrHO8lmUgJHIGhbUJpTDCXGjkj8uUTV5SmuIAkLN5hK+//QbfPX6MLx59iWRrC6XNkbLDQLlc8BosGaf9V0aAav3p1j01KaWD4g1K/IlT/PDmEL9NxxiRfeZahIqkTEqtszIZ4TZPGQ2tMgmWpy9GfU5cA8cu4xUwhOFJ/976Bg76A3xqh7iFHDeQom8BCtvsKQDg9pZbyLCffoS76QZ24gxPxi/xYjHHNKfjlaKkdWKENWBbeG8A2XcFcGpd0w5XuGgsb1M3H7C+lGrIn69uV/bjTmsI9UQJjG7NFRIAuCIjdu7ETLMvu6mKaBMDeZ+rCyIHWjOjLWBT0HWe0fSxatFbNOjXMW72BthIe9gaDLCZruEaeiwCozvtOSpMmikOT97i2dkRXpzPUKxlKCN3vRpJG+LilApfqxfxxReWDcBqUTSLzI/WLB3DzCSI53NsxSk2bYrdfIgHGzdwDRm7z2cmwxlmPJM+ac5xeDzGy+kEx1WB42aBeUzpEyvmgM5yoKtvoou9XdzvSb+u0oCrmv+LilWpo+S1w5hMZVZJcKARvT3VURQfSE3QMEW+tovh1jrKvMHs6d/cmNJBJhsGIrDULNG03PiLPrpllmFLa7wV5mfjplIkgpP1JbXJgmRSiynOigXWbYycaPVmGxV5DFI9RnILKrDtFLEp0CRzVJkkKqEqySeVGSEhT64JQDMPRq/co2R/aWHdv0QjfAlcmp1h/rzEu9EY8e4u0ju3Mbi5i8Vgk+udijLNqTFN++Ls7kAlaorh7l2wkjdO91Kd6HIgXlBHwTdR6lVfdyWCUTPhYC9KBPUVU0S7ooFuMBgMuvPnJIsENvP6J5PNXsIGO/xnIsOJOhXdj+KMAYDaPU/s1A0Wa7kYMlsxyBzVJfoECEAo8WQsW8xqTGZn7Pczn0zQUqrM0TukRJ8+m/G9mvYtom7YgcFn9/ex//kDfHxwH1sA+ucFg8+vfv0dP33/I+pTla22qxYkXDcWlIUfAdv7NzHc3WbpyaI5R1kXfHxkGq1UdDBLRI3waH3R0FIlr5HTfKvElqP43BBM3eGZxu2admXrsrmjY+9GUdxN+E1nTiE6+y5liaQIcWw8G8GftWA/psY/zHlfBQHC//VxakZq1MBateuVALMJs4PnYuq3ArqubhMKRHKvRzHNGhPuegZiTYgkpdvLQwq9sd1wU+ny4WfVfkiPsdelO2bywsUaK5jCTvjqF9C03hzWBD5z+tn5fDiWN+V1ho1yVVV+wEprUgGetl32WZDHV/z+Bs1oHwAAIABJREFU1CheJcuXgTZcFzqz9dXH+DXujgGB7yHoIIwzaf7Z3yZ4esieXeqRHaND2YlyDbjPEfTT+nN/bThgSs6nk3k3cg3z/hol+Iewa2mOoorCX9/bPc9MEsJMEjBiJAQpwJKVbizLP+BCN5Y/0LVr3eAvYMGCKgujCFUij0AIM5Pp6Zf1nXNud0+EsjfJJPPq7vs4j+8RB75SEOITzoUIZ2iFn4MqJIhSHGA1M265BJSN/nlUNTB63nRVTi9WTooDgItWmEioDCrmVDAsHEE0EAiQG33Pdgc62PUEGz2p/nNwWaCjk1Z5UwHmEZQkA4SFED8RJaFAWatL33CI3ArkI/zPG2fGh6BhoRWnYa9fezp2465U750NtNwqieGQjrvr1C4AMCQF6eax+LE7gR9qFTIThVMYtz+KwuIQ1b6ckctrdf8wAJTjr1UjkbiLm0iE94LXVQdQuK6uroBVLXhRbI4ItRep+acvRdW5owtqC55aLxBRUBANVcomuRG116xCt3LYGVzE4c41DLGGoYR8UJh0gMFbIhRFTSEAqo9rHsL2ee+csu9J6KvGM3flaFtvtV4bLKPk87xbmZDvCsCU83nurRkcRe2k3597RaN17FtfrYyac3P/W6A49y3el6hHQb9BBQ4JE6U00NXND/FqPsWb318j7VCcuBChJ95yds9RX+fGUaHbN/i+8bjgVHW7YIGwyJASLiYRjpjeIY3nGI3XsXNzH4MPxlgcvUSc5zJeJTQ1eoQnRK0Q/CZG3HxevMLDX+7i9tYE45u38TYZY7AZY051q7d/A/NTFNMUT56dYuPqHl5ur6N/YQ2TyQS9YR8jzqtc3S0KJi9D5URTOVo2wcwWV0HFlCjjnihhi/87NxYWBISeo57wjrZXhfrMy3nn5Qpkm3xPWVXOcbe0k+7k+of1RZ5WeikwBspQsxFo55qQftjvIvZUmeOFU2SFbLRe117yfynh1M8zDN4uBGo7fXgkAn/J6xP4xRloViBJPDfGSpOBQE2R4mXZjE8RRXTKQ2Nhpz6jSsfr/vUDfP3dt/jmh+9xcOMGfKen67Up9HtYgTEsI+LtHJn9Y5sv/a6inP6N6w2hq/y8VwCemo//veNHeHDyDI8xF85uCu0AqXCXTtqiWtaJmKxeZWWIEy0Ei/AQvasp1GjJA7tm2Wwp9mgblcdhPMKd7cu40ulhDx3soYsNworNzyNpnV7wZe5aUWCMHg66V/Dx5U38evwI9+cvMYu080aNEdqKkXIj8PLYqw52q9hfI+EsOA2exgIFZRCTBS0BRX0QrstAkCNQEWWqACdSnF7VtQPdTiyFuIab/Vw4/kthQk0fENHKlksN9+/VYoQWUASeyQA8WFM69eMuFoVYt22WHvtuiM8muzjorGMHfVwQPJIesblJlOhi6YY42drGn1snuD87xt0XT/CYInOMNwZdpKThUEjKYhXvDAXQcr9Zhdnbnur0mpXLDOu9EfNMjHKPPT/AJ+ubuDXYxUcYSQKzxpFscyQTkVd2gDcxHV/CH+MZfpu9xr3nT3A0PcF8NMAboXfkcGxYlAZwdqZ/FCusv09r4yxrBHVbV5GFeY1zklW9H+l0No/rPd/gyxwXSRJJl41zRrqUpljOfUdmHpGatRWhr/nXS18i2+hh/dPbmCdrOHv4HNHxHH0KdUnhL8QRqgkSFVrNE7nb0JGsFKkiEAx20RkLMaAvUp3OdBag5omrkAy6GMQT8azPs0iEW3vDLoaDHOXyDGfzU7F3zSlimrIAIHK9KNNGHTv8LEzmFq1iYSKKMgFpo7QbTgdK1BWZE52AHime6RnSx38hf/4UuLiL0f4hBtvbKCdjnMYR0kQ1OxgzVtLt7WqxI1arQ6U7eLPu433OVan8HJJnZU5ZRzEy0TMJ1q2AzEpDaehL8tH5pWPva6HoAAOOI6WlMb7jfBZBOq6Xke4LmSmvCyVX6GYsxi0Rk8bjE0WesUjdU6tf7mk5tPA4PTsVXRvOYQo6zqenYiFLmlzMhI7CjUTVSYyZ6mO6J1Q5bu1dx5eH1/D57iVcripcYNNpWeDFgyP8/ONP+OfRVGKqpZA1NJduF5Q18QHSGLjz1RcYXtrCwhU1XSLlWKKdZLdjCXEpttfMe3Mr9so1JsLBEGPKMzdb0OVC9rTZfKFx/LKQa0uhYq2L+DDV5PmelDpSSLh3WNFC7r8l096SPVlGrWGCc45qaKn0SzPRCjhBt4LNSibGTPS90/2xsNcEsb3Gmj2Wc+JzBmtDWe/P5jNFYMrGXNR6BIrcSmxNUSE8YaksG421ujNfabwTSQwnPtjy+qwM7gGRvU/cID55vZn7Gfo7uCnAcgjh0RcqeivOKbJHdSxWTFTQuCxrS22uQ4nA/jVhlhymikQPQtBtnANrQ4nHON5F9yB09MV6uim21ahj069hV951NMcMNPiwhq66MOhz1Na2hXK3ZnLQPQz3pta/sxU8aAe03QJCYq5jISDPglOLOr+paJ/GYyL0Fyz2ib6wPVqa521UtBSJaZ1oNBgrAGvcQPS1CdrKPSmxWMzwLwAAAP//lF3JbhxFGP56m+mZsZ2xJx47koMS2UYKOSRwCcsD5DE4Ip6LI1duCAkkDlyQkJAigiISRCBxEuEktmftqkL/Vt2zWCKTg+Wk00t1TdW/fEtuNx40S5gw7CrH9OKCf8pEEf6eoAKECxMHiwUfmgI6iBWfLFutWLPQhgnhVc3NK23A1RO14PMxEWe+IcN2pvF4aFDEyq+6wYnKsHDpqRs+nwkHpgkjaZE44Fz4HaYyTJ6OBrM30UM6b/C1jQirRhYihOhUKJD+iG++WAuSvYJV6FgEDWFBWARLfBwWE2oVsUvPVbd5xf+HE3/z3qQAR/0jTbPBRE2Ia+xUhDHT8TD6BYn5ieCHjxoBVh1dpj0wGoSEHJ1MbtNPqK0KV99nu92qoUda+MFScGWTfoViwSJFCTZaHRwfHGKnpN5Ki0X/cu1UxK53g9pogaRfn+0vfdLLCwByZ//nJI3D153Ltqz1nbMVUEIU9VtzfPy3d7uteCfv8Dg8hqkigLg1lbIlTydtY29zB8OtAf4ZvZLugkIRTSh0+To8P3JLnhLd8IQjJzYlOdNIHAsOOe66nPsRWvt93LjzAR7+9SOolecbzy7UkMCJUMVdWI8erVEnL/Hw2x9wqzNAZ+8A3aIHbGxjSqDU1y+BcwdM/sUb4u8PN9myarZ3xtzFjStbvIm3Wx1MvAWEzHCV701CBTgKSnPWvJOd3NecLw7CvXyfaONpl4waiBAuKnQE4QDzxhPSeu2xoqIPDQVzwfQnaksKUwM395RgXrIi6BgLBXH8Fdaov3XaBScx6XyOsvJojS/QenOO6ulzTJ/8CTw/QZdE0kjcC6niLe1cSy81wuTr6xCaggIrehQXpK5RZcC9zz7F5198iU/u30d7Z4AZgyHEKmstSDypg/PFJ1m23auPp11nkhds6XeKCk9R4efpC/xyeoLH41OclcAZaaZsdDAjN4OyhYmbr6jFx7VI6UfMiQ6VFjCDJu8C46YudTcv0B0FHHe28HH/Gu60drCPHANynaDkPyRrqUB8nSAibEUiRQKav3myhfngPbbE+206xoiumwdxA6CiE62dlLQlPiZzK+e2v4uIYoGVU7fL+JxU4DLrWRvb2v9ZUG2JBmaX+fY3PxwY+eV9wwq0iwOQqsij2YlGagMFKXRPc4eOC7gagLv9IT7sXcVtbGHIYypFk0JpFATBz5VmQl1i2tGvgxAYfQ6Av/v7MZ55h7dTpxaO6aVr8bp5kFm4SfspzQmCbE4zHOQd3Ov38VF3F8esShOww+87RL0Gm8GULE2Q4Bp6OOr1cHhzG98/+R0PpiOOISZlzgn2eMHnxGuSXnDguq6IbDQ/mGbSCjR3KZlU3qs9GxU2bc1wTMMIHCtR4T+lYqjCpY1jzjx2DRxR0pxqo3N0g/1sLpJnmLq3KMcV244SZ5vcUsSp1mx8AxdGBbFkKU2jQ+gbtm4qt+jIiiwVodSiu4FsUiGU56g4UQAjk0jdnShpgaoPnYKtBqvxHJOxxKImGpnB3memaT4JFTpVXslgRoNOneZ5/feKCnBSDC1ZtX2K8WiC169O0Tt6H3k1Q0misttXMKYCZCLuPJWQrdSP396Fk13LmvlZEot3oovQ+J5kDZtGLqR3pbmQCnyfCqStsi2JmJvzOCSKPKg4/iuVXmmUL884K9k8EwSi71ETJhE6SKBkgpJhpqJ5ETeuxMGEjk85fvUaQ1M+UDFNhxJ/osXNyV2GBHLHI+66ciElzJAG8Z8NhIhzI04e9/Z3cffmddzaHWCYAptkoTZzePHoD3zz1df49adHHBs5ZFjdDUyoOMUsBwY3hzi4fYhZETDyU2SpkyZb2ZbYl94yxbwqqErJESEcarRyXWRvdvtN5R4xSRVEbtKwpXVVrQ/gVXOBLTL9om9/aAitcvKb1mt3E1bftIojWjHnOKqzxuGA2dGl9dpqnfmmlhivCVrQoN9NLA4mJM7OZA4b5HQxHmt8X2k3OOd8guY55xYNpAA/h+YIBQuZW7NRqGSckDac0JoUABPSM9HUJmXaxoBdASJKFJyMGwrAhBZdtWgNyMg0tcUzFAEn1xFB7plfv6p1kMbruiiCK6gH+rnYrNRzae5E+ZR9LLc1GD5B+s2qnVE/jCwRZINoB4iLgCEdGDXQsEO08YpIQ+3Qm2c/rdN1nraI8osCvuqYY8gws7U3LTpuWFOhXeeM5N6638xmyPMc/wEAAP//hF3LbhxFFD3VNT0904MmQ7JIHMlBQoQo4iEFxMJKQNlFSKz4A3Z8AWLJ5yAk9khhC58QRYQoYRHAipOxZ8bz7O5C91VdbWxwVBrZ0+O0q6pv3ce55/iPvjr4zm7AIDMclEKgB5LxoN4hWqB1dChswgQ+2D4ABvPoqfRGqwBg+vTSUyM37RjS2jK5hwgFSmUdbLOk7QMRYqWkCEZMgST4ZCLBIKySwsjvOSARwjwvbMEkoaGsyLZQVq1n9nzNvnCmqK47EAsmn6iauICNOvG16mTK3+v4EJcA/9/hplfWfSPTCIpeICk1Yj9nPyqRV7QN0SIapFqP0EJwvBIgWdZK0BTtA2V73sg57CtzLr5nkCOWJFMOAoGLdgNgRopoVSE1WOlDdfb7+P+R7vg24N39m/hw/30M3AADBnWLc2USXBZeZ6HbnxtSCPG5I0sSAOddAM4o/te/zvUKz4VrJXl4z+reFagmokPgIklaSH4WOu+33PwygpMh+rfd74Ndl/w8HQ7n/7xzjeE/dUhh1WTLNIFHiJHCYb46xYujP7nPnSpXNHxHuUEMLzlT9CzQIdMaeTVo5MBq9pyThcQhQoh7ytCSGkDIUTQ9/PXoKRwx11vTrBOSLcMXVZlWUTjY6mE+W3KQOb66B1/2GZK6Zeh+zcz6LHi93AKvZwjHp1gezVDN15yh5iRznjOKhyDSgl3PlIxNq/OKdgmNuZHyR3utrgiLv+OqHrcPKOTSkQxR7oVtnxRAyH7kMvha7v3P2OlthNdaCMIypxWetuJgPW58iRHtcL+tDJ4ZrfxTFY32k6fAPzQY7ba4tFwAvz/B5tFjrH57gnJ+imK15vdLeCEEDKLmkFmg1nkeEPe2dvqicD2BOdJBRFKIowL3v/gcX3/7DT6+fw/F+JJmmTMN/C7OZVmhP+3TDcl78qrs1yTJqRX/Z2jwC17hp+On+PXoDzyvF5hihxkRMHpKVkpyloijJLa5WD2De+l1LQwJlalyTU6VpQYYVxneRom7V27g0/Ia3kEPE2RcPSzQDXABdJ0KmMyc2Is+h1JA6QYYvzHGi+UM02rDlWsoX4bMhc7G/yT0gjkSrg0y7CMXwcIleWznqhcpQj3rz3655DzIXKvokyIQzrPv8dXsNDl9mVU7PfNsXM0K3HtzD5+V13EHI7xFPDA0N5oAMGUHhp1LvoahzLkiKuiaa/kE48sTPH71NxYESiCmaOpDDxJ4Oj0vzXRmCdNyG/xLos9pz2ReNdhvhjiYXMeD0T5uo8+VfxIapXvLlRzRs9xtzYGfoD+E6ZwI0W6gj/3JHtvL2WKB2W6JJSXWKYnPevICW2u0h9l8EpOBiol+Qvex5niuvldzZj2bzty3Z3xo5z9olVKTvE7Xmhml1QGFjujPNXJ/JC3lhgV64xJNrvenn+G2mMYLHwpkjdkhd2JDg/b41JEqqG1DtPtj/81BA8mAPu0vstE0H/UOfr1AXq05yEQtpLRVs8Y27FjFwA+HgtZKOBdiAlntto8VZdvM9nylnoDuUQSY2WXiwM0Ku+lrbKYnGJAPR0EltbGRmoImAqAVWfLliNVbKvcCXSEgQE3zQgUiPi889+kzhwAhKwd9OS96MvJhwT34HKRTwansM+cCS5GVQ+wI5UX4g1Aph5IkM7iaTdVv5idonSZ+zgUUL2kJqtga8SOtxbZG2FbMs7BdbbBaLLA8mWN+fIL1dIbN4TGql1NUh1PUL48BIsldLAkWyPuFECVyaNboke/LMo41yskIn3xwG3dv3cR7l69gzxeYEGn24SEefv8jfv7hIVaLrYoBOk6gNcAZUWew9GTTBw6+fIC9O7ewLgPzqoDRXbJvpCe91vijx4Nbh5U8m2MZimu0bdX6/8WvzmKvPu39cjhi+7hJkqKNJhCEhLvXwvFdK4ltg5WQDCaeKISdVauSZ86CN/28FQQjiroX44iUGyS1r03SJmCwdYud6O8n4uX1Zh19MQsqGdlMtgVNR7odWqiIiQsjo/VeJFU1TolJE0Vq0zxxWzZV8ndCtijVb0OMqd2FqZZI4VjU10Q6tlHOFm6ZNAi9BfSJvXDaI59p24rFlhSzFdSuoS2WTlvbMosTNbCXVgOSKeQNFO+Pf1/SNsTr2e/HdaBX5nzQ++T7Ua4ARj10OCYUjRUV7tokSEvALuSE8nuS1rmEN8+Mk9komi+z84KIaD8j+62N63it6blnn1fsuRRrteVlu8M/AAAA//98XUtvG1UYPffOjMdOkyhOhUgKVFABBURRpAixoTuQ2LNGbNjCn2LHoiv2LOAPsKpALKgEJWoeTR07fs3MRd/r3mvH7VSWKyV25nEf33e+853DAABc6vkAoIO9VNX2kh8wJX9U7e3Uq9GSQ2lDCHqDCk3iXeynsH43q0Bb9SyoyI0AAC7bvDpFW4KiLT4yBZYZSm4DkP0U1d+zsN5E6v2APKNmudDcTRI1TvZ7olBqPUHmN8kD3YsCcERugpLEHSKiR1ZmMA2ALsSFIhfkMP9G7oXCqnBGfiypr5jUGudCrWbQgoJX8iWngVwZEinKoo2iYKJs6SO7gEUFq57eF6cTvVNaZpokJiBhKskImR+xLjQ2GQ0YkYVTxRjXPOvp/jDbwydxRrehf+lG9Z/uUedwuHuAD966j2G9i1vYYqpeobMwJiFrFP+8Lzrvi7/50n/hRiqvVNaXRdc3E/PkNG7nnwe+6ecGCtjL+g43v15+bGI35MHKpiO8ItnKvyM/uM1DaYIwoEHV/okGenJ2gqJH41DcKGhxh3rWW0MrLzJtl3pbMyVxAWEksBLEvEBDm3DpmW1UVwNsFX1cPT3HsydPo4MEgx7qv8+hvBffb99JHxNVmcYvxnCkvrs1wGB3B2WvwnS+FH9iVsrvpDpFQMDlBPOrKUanFxhfXaMhwS4C75ZCfaeqJFfbuRrkuTTD78ESQs9VzfjutA2kFJE/Bg0Kx0EaB3OFKOkGFQVy+qJzZFqnBctwaRxzkqUigV5xCRvDVlHNlhAWU1RPagJviL3hr8bYnS9QnvyH8ePHmP/xJ6rTMwyup+gvGlLWQKUpdavexzCcISjAsjLWggJYEkjTOrBQcI58tL/+9ht898P3+PDTY/jeQPzt1fmBQaBXjFm34X39dyloncKzl/8ZgN8xwW/Tf/Hr5T/4q5ngmV/guge0dYGyFqHBut+PqrlM71tLyvNDVPi1YlMKA6zQud2jnttlh+Hc4fPbd/HZDiX/HkNK9lpiyriV69h8jTZHUjLSd5LA0l846wHPQ4sJVR2ldTqjEIYVBgDTGLPLyCv73qV6tIHAZVVqVT/1b+brsbSWdRG092u+/TFwyZOktYB3/epjNQypikSsn0api/Q8+q5AfxHwbr2NhzsHOMIO3tTkv4qJf6fVXMmlfCaIGBbSc0IWoVvcHtDHiVvgycU5K3K3/FyWzGpyfjVJXg/EaYR2qvVQOmmdGbYFPqn28eX+O7gP0nAA6k6YCD0Fyvg8WfBOVOc9S7OBdVQqiBYEgQZ1fxfjZorT2RhzL0Bjy2Bdy6RnhnxsUufUUy1sVLoXp3bH1N6nH1p5XuK9nYoUBilZAA7TgaACTWcAtUv7qRUuNGimKjMlZySquj3c48oXVR1pXDXknkIthp0wxFqfmABS7XDaj6+gkSXhcd9IV2DuKMS4oapjS5pIyzk7lJSLGf/fkRhiO2OG4tbeNg7fvot7Dx5geOcOtl/bx639PX72dB5TsrhzVjiQweN0sroVmrlB4NCYI8R4oaS1hCrbzQzNaIzR80t4X6GuByjqPjoqEBG4S4k6JZhsKyfe7kyNIkCKksvCxzXeKxBgYElB4HHhFIEVjZhWmaqdMWioUl1oDFYK+EZ7ird9x1wmnPYNapIRNI5oU+lAaOFBYmtqrXMEAJCw7ZRscudYjCZoRhMsL6/QXV4jvLhGGE2A0RgYT8SGplMNIKj1ILGc2LKRYug56irg6P338MXxMY5uH+AN9LBHqeb5BX756RF+/vERzv4e8VwLzKQIakOYAABmk+g9O/zoHj7+6iHc67cwKWeYEfgTRBhTCm5dlkNIrEzFSkvqg16vMfA4r9A+f69iopIktQooyP2iuUZ2wNxSURSazCH2f+cWqGnemmCjfJ4EA51p/qyzYA2gicruIXrCs+A6uQ+YnoCq3AvLIaRVN6rsy/mUrAFQ8fdyu7ICit4llppTQJoTwNLr9yqTwLsVgI6FjrWQywXOptG55GLBU9jPibXA3QOdqPN3XdpveB/rQhRq5yq8ivOZg4xTTapkCYjVPCIr/nrVZgvaJ28gdryfmW1f7vMvLQbSokq20easFrXRbCyxZ748a4p76eN0nuwKEa1uxdmMgQl9KiwmqS4RwpZcfe4GAJiav+1L8lJwNouDJR7Q9V1ZttZSwuu7Jv90HVT8kJwtFeq5AK3MBHsenO8G4H8AAAD//4Rdy24cRRQ9VdWeR+xg2cEQwNgJIk4wkomCglC8Y8MCIbFnBStgwafwCUh8AgvEgi0fgCIkQAYpSEkMtuO3Z6anp7vQfVXX2EaRZXlkjWfG3fW655x7Tnj38wesADAHRSv+TSpiJnMW1yA3XX4nE8+r9ECKZ0HI2ufTBWaGuBYUggzBpFjWXhRFXkxaYcCDmL1eNGwICSFTab4WwTTozcDPimCSn4gyACL3H4thBE2sSh9bb4pNauuvidmkdBlA4ZRNt0XFq0rAbmDewGpSKkHvveT6ay8LgwiKTHo9rMmi3XoNMKChPX42ODnio240a9OnyW6IkrDxomSoWc3QUyCnM4Ue0t+yDCpTdJhTs6GTybdAwZGEhOQHKQc10Ki07aNtAbCDjEvvWWTXiBSGPWysrGN1cRnz7irLvYKW/7ost72GekDhPlUnzs4cAel8Tmi3hanYhzIi6c14gL/r9NiYdTGfmWiPTMNS2loDj/geNMTcUGvEWHo4eWPS/honslbZvy8CDefrjsuAEMc+DabGaKELIfvdFB4RtDC97MvF8+/eyjvttaPQyXIwS+OhUS+EmBQMLGj0Nbv47p8cYFQOJftYx6PdU5ZmOZFXevb0sDxxeVzVko0L7cNq9JDK17Eh5LSDq3MvAIMKW7/9gWY0YeaVFQAK/phWArC+0sgZx3RwOXy8jWuzc2z457rElniOo2IuzqnRHvtFeXYYJyCg3jvB4Ok+Dh5t49n+IcaDMYrGoRpUbC7Fpmsk6+foLzngOp17iW3lA1hIhy0oG8rmQAwOBDaAEUO2jjA/NFeiRqoqoOhdaFlJmVl8n2stxtG0QFvTOogp6Nqw9NKTwSiZ3oxLLI4q4O/HKH/5FePftzA/GqJPm5aaXln5kzh+u86p5WL6u9JsbSa0vJRnVBAsrSzjs6+/wqdffoHX127r5y9arwMzlfufAvm84NMCRZ0dDgiAokLDBc7zf4ghfqqe4Me9v/BweIgnxKgWDjVFcHULXgd4PYtBo4tUYfEcRIxYu6ibsqjeRH1EI4gAlStNwPrsNXy4+AbeRsFFKhWDM6pOeh7gZqeuJpNCRE1VoZ/PQg9/Hu7in/IYsRuSPNhpry5y1sfkphkrb6yRPS+oZ433XiN3Q1LU5ZnSsMgsHU88jxUQzD1k8vdyU4ZXBupevAJB85CZ3SKWh0AvOnRQZFOni2I0wYvo4sFLN7CJBdyEx3xm5gYVcHu0h6p83LCkOrjkr1CzdHoBj3a2sVuRH4AwXNDkjKAS7PPsv3wrcBm99G/XE7wae/j4ldtYRwcv0/hXN/ngc8WK7ifOmDL7igxiz+jzCOjpzy1iP5b49+QYQ1JSKWjHy4cqKby3ok0BWcRkuGjM/+VKummAvXU2t5SHIjH6kY2MK1ZfUcHaqElx1snA94drRC06uv0+ZkieS2cAYt97AWONwCtpfAlqwJn1tNazyslZwoKYzPpzKpHU5x1Fzsf7livkJzt4izlYHA4wS0qAwSmbr4ZJyUoQaldduL6EW/c2cOOdu1i7fw+r62tYufMmbq7fwdLqa+gszCL0OxidnklUm17Tglhf3idlHW4JhZiYBgZ8nYJQ3lQnEW5UoTo6hR+KcrTb78HT2jMjQEdFvdhspu3Ye4pHBavDvJwri5CKcLvk1gPutAXCCnkfRBHGRI2qzsz5n8dgIcCyF7eXRITMFIFZULpf7MdoHapCAAAgAElEQVTj1B0fIp3ukWcBDbEqwpcN4tkI1dEZBjv7OH26g8nBmTD9u0fA0SlwNqJ4HrlQHS9qBZ6oE/a3YWfwccUpCU09RLdf4O5bt/DJ+5u4f30Zy7iCeTqT7u3i5+9/wHfffIudrWNuq/Kug1FTTl2PilWlYHVf5YGqC7z30QdY3dzA4UyJMtA4bLh9gea1GaLSYwOybQ7l65QpTwptpfXOtyCrF7Uym7U1QjT6kCuYQ4pMbeqMxU0N4O3anFLSVKrupsjKNgc/KXOikWpGvolvizC1sh/lxTUs6URfK2b/o61vuUs8A3X0ObxHT801o57FuKh14oxPRaMokNoWBvs/2Gxdaz5juieaDsd7j7LOVtDy3yjJml8bateguWi1jJCZ8jkvxCB68/aSJ1Tqj2LrONckaIlZ/r8nourgNtRkpnhesdzulQbymIcaF8danPNnVONVUxKYes5qU3kdAU1sjFlMIO0E5ajk68DjhNR/FONnhbu+piTp2L4kdXO+R7OSIFvzBciyNvCG13EjeNkkXhM0BKCh+q/PZDJfT92+7bN67/EfYdfOG8URx387+7jz+YwNh7EJ4ZEQEQUFpEiIKmX6KB8iXYp8lpTp8xkoUyClSJrQRIooCDixHWQMmONub293Nvq/ZufWtrI0WBzr2ZvZmf/j91jBfvDiVLXLmhXupQMv8LRMeR0ucDAEupEGbrgloMJhWIU2UJXEqtij0Rpm1JEaDiXQY497tePwjVbzLGBRcaYIodChDxxKVeY3T/xWXQGaCI7RjUu5yeoxzL77Sx8cC/rJmS1Euq+oamaB1xEUQ12qfIqUPY77HYYhd6Pq8GJ19IhaigduNSiLbfyaSPAntjfsvm+rkiXhWW0eLJqyxeG9QIropbMknStUESKADh3firUHPZN5dvYpHzGcpVFv/8aL12VfJ8AqXVmgdAhdgD67u72N65evYjMZo+CwSQTuWLjRuM1Jp4Dv9djmNUjAsSI/xfSUVMX+Ln0WLqq4zpLSrjbC+3hncZA5G+h80R9SOmYLsaW8sJSE0ji1XBHfM0+K1fH0VFhdL6RtewFuv0KcqN80Qj7YB8lF9zoL5hx35JRGQD69pS+xlhVcueddw0lHOW3FfpK6H6N8gJ2tCQ7fvuTfTdVQsuxqk06fgTsZtVQTzWM0fgZORJai9DonnYDBELOy5Pmgd6OsKszzAuuf7ODGg7vY+/kJmsqzB+0pViCtdenZcRo68iWyeYq9x49xuS5x4f49bG4MkI0zTEnkk4MUJxkCFQw5OR8ApYNbNmzxh7cznBy8wsnWBWxMLrEq+3A0ZC9k6ag0ASLNSXws5qItJZ+IKCd9hytwulbwC35ZrxRJ24A8YezE6hxq8cqU0qF7aKA/mR2fivTU1Qxj6gqWFdLjN5ju7aN++gzF4RG2qbvr/IqYZB9k37fW7F8jTfroe6+oEJYNcOfufXz7/Xf46puvMdy6qGu40R53cuqd/L/LRcNi9BhribeYJilewOMppvj1/QF+e7WHg7TGnAorBLVkjuOMOcIGbWTZJ408vG/PERRYvc4qykGV/y+iwMfjCa4iZ256YYUKa/Swyvv5aJ7zkDxFS98t+L6TbIRi4TDzWlFMfFgHZ47XFJL1IpHeVG1l6+j86M7Mbs0Y/xQwHR0X8Ur7iVo0hh60/7zLOklM73KpFroUcUBjTBwjIHazEa5hHTtI2Ts81WwsDe4TLq6ln/r+EBWqCHJ/Eyk+Xd/CX2/3uc7HCW8qFmzxvn8KQpvIO2DnzHqS48Z4E7cxxq7SNZz+Mhcn/7bKW60K6L+EtdwyhZ4LCLfgcHOwgSdky06Q51zt3Bge75EP5MygM7eJmh6isN2J3J2FpLNkvz839pwmQmWXdJCaIAAZf5bGXJWL4JtNBV0S7ZrVC97/TqoKw7UMww8vMdWJxj4/mKJ6M0dSAa6KxqVOIgkjcJxYhiaJOnDo/Cg9TrBzDWovZyp3tQl6Wwzw3gtMPS0rFpxL3ZIhNOvrI0x2r+DW3TsYb+/wXtgslqx7sZiXOHp5iOMX+3j++x84/mcffz9/juN/X2OpItG5xiaLqPrRaQvJHuI1PKA1STa0WUJisXO8fvonFrP3KN6dYPDRNQy3J6jzAidUPM4d81WodOwMUeHlnORCiJMIxScWT7WMOIJLw3sCBc5ZgsBd9kRh9pk2DELCpHOoU88JGcWz3JnxnOQ5SrYJuboEmndTRt3SPNN3Vb45kUS+XAinX+1tA9uQKA8Oimpr1dnHq52xqvaT13xbYmOygYdffIYv73+OBx/cwhUk2ESG6d4Bfnn0CD/98COOnk2x1spxzMkak8u6E6NwUizNiYLYeFy5cx23H97DO7fE1C+INyprN0ryhRZI+8VSE9NkRe8qFmoWNHHn0c/JrNoV15znFMFJwfIeRiHrGcwRnOvtJdEZU5lIsiaPpJPBIqiUoGXG45fnlZ9FkI5iIbYprtUyTl3B+jGrObBQoYFziCxTrbI2dM1zFSi3xNKsCufkYKTxuLOmoAYHASXhO464oI16ey8jx1J2MrK8IxbRowLBvCw1Wa0ZjW33pzEhQiP5pRQKTFzPuO597QQo7z0u3OZqbdtGOYkl9yJg39n/xXu/JOFNWHFG17Zx8fzYz7391D5Hc2Qadv2ihT2j5Y1CIZX/ZxaCnTOcUcc7PYRYh4fvzbFI1wSOLebDutbifhi3S3kO5CKRzFiEMBI4TxL8BwAA//+cXUuPFFUYPbequrq7pmkYwgCKEUkGQ4iirgyyMXHhyh/gDzDxf7nTrRs2Jsa9CUHii4hkIKK8ZhimH1V17zXf4z66ZwRiJZ1MMt31+Oo+vtc5pwoPwMRBWjlmdsWyVLIHz9qtbTvnBw9GoMr++gD1Kh8YJmA4QmuDV44BMhy3Z9o+ZppcbMdZdUQkY1GsBJ7hIenvZjxmw9ZNIy00tbRIBAxI0IQhwyYmSGUJJYkll6r+R+lYHnXw9bi9v+fEA0MQuv6Q5iaUICIwYoZJywGxypF0a5qOAWtEG0Rn5T7zavpRgyAlAGQCMdkak7okx6FYSzS86iGZwURgw+Rfmd5kWaZkjz1KE7osFIdphSW1pHFjUW9McP7ceUzI+eXaSyGsq6waYKOXF0jhUgJAkgMFqw37Qyz+fiX8cNxm6YTPVtuDMqyNti0ynk5hKYwZM+n3e/NnWHYta6V2GfllZSTz3IyF2Tz8JGDAxBFMclzhIPK5laDLrP5/gJRAMEpqVOS2eMHBGU2mT7SKE3TcYteiw5K0x7tes8sCTzk9OY6TRS3Od7CJF9E3qoxukIO+tYUTj3Yw252v2tlk3xcmoySNYsrEVm0Q248Y2kKsu5WJ7LWds1hUQ0wuvo63PnwHj2/chv/rIF4nkA9ixfkOiRDHuMz26T948P0PTBI4ee8y2maAoq4xmJ5Av78nLP3kqDMLtcj9UQVE6Lsl4MJiF/t7S2A0wGxjxK38RTPEaDJiO9IzDMjpzSRwuEWzlIAqZ+dOWeeCYQjCOyCs+RGrpY5d6bJ4ImQ8gnSbVvmtYrmQtcOFATf0FQYHcwz+fgTcu4/9W7/g2GzJFVXmP/FFmiHGxepbPmZj65vPcLJpQEjVzTtO8Hxw7So+//ILXPvsU5QbUzYhVwHJraVNf/3c/zFcc9y/XEd+RDNsDoM9eOzA4np/Hz8+fYA7z55gNjSYEWGY79jh972sK8ZIZ4KLxImrgdirkYWmd2f0twMLnLIVLo5PYkuDQRMMpRWKF62oAdsM7b0J8z74rdRFMGViwJJ5T5BJ0jl1dHn+l4n9H0hVY04qm6Rfv+7s8qcU9t9Q7SpfEsDn78f5FPj/34MT704DH1oze4exNTgzanCWQV/ZGPGKuz50yawiko19BxnbdA4iD7wwnaJ58icObIWWuAC80SR6WuCOIrINSQCu2LceZ6cNXtPEgtHkcC6jFxHkfB/Vyv3nA6LUjuxNA1ycnsbpwV087vextF7I35zDgoIufZ5WJRXLKvk7xh8O7MM+7pXfIOBMA/wuvH+nLf7GJPItry295DQOanH0Vy3theCMIc6Cc+Y1qtT1jhLwzRD+DLXPluibp5jvPET1ZIYh8R31KfgPzOacNA/vrxSdG681ClZNgSSfuUPYiHxgWQ9hRg06U6Ol4kAL1EuLUWVkV6eW9V5gWFSJZ/ZyhXCSH7n15jk8376A7SuX8PDePfzx82/Y+fU2fr9xC93zBRZzi9HAwLZhXQ32VZlKraL1CB030g1g+2c4hgGWd++g292F2dvFeHsb7eYmxuOa4UqOwEOl7lFW4HVB4tdo8aVU6KWJ89JHOBLPb8291SSjVpRK8geWpDWF8uNwIOViYoXta8WHoaCBgnyCrZCEYz9bYLm/4GcnzD+x+rtO4Kkc3AdfuWItxoivZpuQTRkKIWOfWv157aHvU/BPuv5n38BH71/Gx+9ewtubx7FFShmLJW7d/AnfffMtrn/1NQ4eHOAU+cgEuytKLG0bt7wwwhm3by0OOg87Aa58chXmzDEsyj5yaBWQBAB3kMS+oRcRPae5Q+MkFNkYQstcKHIDorIjVXCrxSzywVc9yp4XBOm6FcLRQwlktZsU1SqGIbPSAcUlCr2B4tsVKRM/VBxpNhqGhnBxsVvE81kl52NG/wh5loIedcVQIoPOz6To9SASMPO7dC5K7UGJ8PK1MHZUK+E3JwqpK8IcbdfCmCyeclFakfZP0rmfz2cc/AfyvUisxxX0l7+rQ9fLEp0rnHCadM6/Ewq6nMhY9hEu7XwiZK/0PYQ1l7kjlPQ8vmvt1siLshT30iE2oj0m3WOATgTYXrhufj4uUrAtNE5eGzthfY84fhrra8oE6wd3imlxlxNZSmjPZPXUla1wF9k3Aq+AAwD8CwAA//+MXclv3FQc/vw89kxmBpqgtElaFBqiglKBRABxzAnxb3BH/FWcuSDuSCwHbq1QKxZVRQI1oQRlncXj7aHfZr9xEoRPk6T12M/vPf+Wb+mFX8ye9FppoSSaFXi1gpQkvllARg8QJcaymUiWBNtNVB2OjEDEnXb0xU+SIUrMLS45ODcKgF2TnZ9+1fo7CsCOJ2iaCKSYb17pAdpt48kfBFbmo89BnpPAqAjE6yxJqYOgmAbOJoVV03mQ1XGA4Kfm5WlaBeFLOAoWClUHKUFMYofZdCb2er20M0ZFo5vtTf07ajkj3fEWeElbiUt6AZ9FuR4G75mrSJstGOPI2PiwnYYmugZnMU4NFLYaTkT+N2S9oZ2LsAASFoasoyaV0Jx52dsbm9i6tdEk/yKyFmlHtCN0pMk/bcW/HT3HRTbB+p3bmJDdyWC56BIuYEp4GOaEstmAlhZ4BEzzWZPA0d9JyK75XgCTfIaiyFQ0MsdoNBLoTODagKCTGib8zqOxd2y+s5ONrKQrSz8nvX47d8JkLaCA3HTYqen5MoKjrjAvc8zygjdk6oxQd506+x+8t49VSm65YBQFRQ+Dbnv+RPz8u+tbOJ1NUPs5MoL6uaCIwmJwKRdupOos3MTGQqeueN6PxiMUFLQxYiVuOO0FK/wvUA+H2NjbwdbDB/jj+DFIEy10erDxdQFPkJWby4ztm9xlgT9/+BarxQyr++9isHYLf1Gw1FtB1SfhrRx1vtBEXPj6tLcRH7POdIMnTvysQHG5QOHOgOEA+eqIxf14buvLs33AjnnbPD+rZUXZdgraczQFWrHCgSrAxrXoV2veJ/QD66BBKAOSaTqxUIvUYYnoPXmJ9HIC/+II02e/wx8e4rX5AkPSa2H/4z4yLlio/ZNvIfnhrIwCLrfdgT3hNAaySnioB598jE8//wz7BwcoVoghnzTiiIBqQUUBF+7GmRoo/qONAPMIOGOFf+ApTvDjxRG+Pz/GcRIhH6fwaYzECeeUiipStGvP6bWzWOt+4/1VCHm3A1zBoMpXE11CANztjxjGOm57bf9xVzcfzuPKvkZrLWc0bTt3KkswvZU7tbNMe7l2MxhoHiAAuJhM771w77N3mFHDqqrR9miL6bXyLQ2tVyn65Fpz1P91MI3PGT85QpkVSnWTQJmDqYIEKCGdfztpFAytl6Qb3Tl0zUU51QiglXlnMMKgBNKKzRT4j2XYre8cddR2/lkcr3JYSXoYxrImfdCUuOZ/N8/m2vTDINmq97CFPtaTBGlmziAUqFIS3r5T416HoqF7RNQREevuMwb7525asdxBKtT/nKDpkW+hn05RkaH4lAXCXkXIyNFkOE5ZmX6yyKR7lpcMqir7DuPNNbhkwD9n+BvV2Rw+q5DqJTi1b5aYqlIahSYNHTeTyrfaAMSb95R89QcoiDISD9BzKWqfievSdIrLf85xevgSmBec9JL1aZTGTTFkZe1VjFbHKDbWcPv+Jl5/axcnhy+xs/cYz5/8jGc//Yrz4wkXN5cAPA09Qd6BFcPrJcmMKcYh0bS6REqeMyclzp9OsTg/xeDNB3jljW2eCQtS5lNtACJHuNi0iGr20Q/djag4QAl2HTRPeH32JKGpkHNMFvW0eFyqtkqs4qVeIqa2iFRiOp3x5/l0xuJ+/B6dLyi7ZIQkFeFMx8cRHSQS1XsSG/TGDGQOhBbyfakyrFS4LpXeocWDQYr72/fw0f47+HB3B2+PR7iHHvIXR/jl0RN89cWX+O7rbzDKSa9DkJN0rWTfR80goo1YAY4Oon+4vkOd1Njdf4jt9/ewGMWYFheoEi+aN82aFqoF379vEzueT3WpmkytuwW7qlLTzRo5Wkg1/3mK1cz3v2Y3MFHZJ08q66YninI0kT8uEwWILPscKXSfsqhINV0oDnKV0HKs2US2s5Z0Q5XaObmMezJGdI1aEbVGIqMDnLiFGYoBSpG25uRC1z09IkP5suCeFxeQrJyLc9MgaQqHTSyr3PUuQkh8+Tu7YFXr3p4wqjeHdelljwmd3qCNW3lvW8MNzXd2T+41YY90v6J7Y3c2RlGr/eCg3+x5NE6GfvYBTZyLnoGtMnfhFalJ+laUlzAKwYvjWYjCWhZPb5vJJgZ5HcWXbQaJnkx7QSExMTtOGH2T1q3mI1T0Y+qJ5iBhM51cP/j5cOFN8idzqzFKC9t36vvBKCoUj9P4CqqEiqaE0JZCwlLBF8C/AAAA//+MXUlvHEUU/qq32eLY4DiBQJQFZDhwioQUcQHlwgUhceQX5J9x4c4tRwgKEoeEQ8iGIIlxFjuO45nxTHdXofe9V9VtByRGShQ7Hs9Md9Wrt3xL0YezVYPSXrzFcFSxwGxjASoq1s54gqawrBc9S0m6dGIJlecHAu1L4o2QDSBQN/oVS/cqbtRghbnTrhrVGam8r1MD+mq6jFNYbkCBVcRcQCAX88POeiN+KkmOjXIQi7tShFuqTGHtaEy/xPO9LwwxALNEk02n4iuKJqhN6KKwANE0KphEETAKmeiELi/VilC8VVu7PhIwWvLo9es2a7BYtGlh1ibE1dnnaaCRgo22f95HmWnVOTDthNjNi378MMi7OVCnGyxWWFIE9298hPhEzkhEJKj3P9KG4nMylxYPP7fLIwGcrxd/b78w7eCHDQbjKi1M2YNVUSAPGS6unsOZfA0T2v4FHpQwLqaFFt2gTuHHUihOMcetJ7fx8PkjZA8c1xvhYGV2JID3H027NPsTz/sQN1LqhCbxK6SgHPUiVHzHioVWra1mi9mRz6hfRIREb/NqxyppXURukSqmxnteounlpjHZ9L5rSByHfUaf1u49aIeXVBJxbGjq3i90mNctllZglFBxpY82LlJNWawvfTGgTVB8eBt/xpJwRaCw6+/i0csd7O485mFbUHeiSdYtnG7YxFo4azIlj3acIEpilLq2Yp0nk0BBVEgQHE3GWBy22J++xvrG27j85VVs3XuCxZMXKBqZjPQEvNKxHyc06l8/JCV1gWy+j/0bP2O5vY33vvgMxfoG/g4j7IsyMQN5rkAATRkMZqz8Uz4OxRqrBD0H5bVkajIL9GlfZhmmmTh/dA0bJl3j8ojHc+oW2/t2xy3cfMe55/rrJ+C+m+zB4mzCHws8VoJ762lDRiXmnWeonj7DwZ27CE9fYM2Lz3KJ0hJWQRlEkgy59TlFCFj8D9RiGvMmASLNFsszns2DFmeyZ9fWJvj8m6/x7bVr+PjTKwiu0LnnscpH4dvHiv//gHGHSBaQWCOQPZdR5O+eWPuF5/hx6wH+9DPs5g5z+terWj3RqYaMoLq1UFZqbSxX+QALbxOTkCfxNNtVR69tusZg3F72bE4z4y0Klub8yTWK/sVGxf+dXcQzUYvLYMlo7MBn2tC2dzW1M0CaTPNlkxBPjg2g2jz8Hac8EcmU4MKtFQxmu5lsgKJpSQimbWIFhCHBNBfpIMZxDeeeqhd6/h2ZPFiy04tFnJAcb9bG2EdtBRE502lVaWJbbPb7hvSjI9P/2ETqrRV3/F/u6HczHSDzHkpUPDWcYKUcY3veECrtxUtdDrRKk0WecejgkKrLoWe4UBbk2h0IQqkapkks/n359r7f2wTujf80FJdaG54djZFNnyH4klNiTh+FU1xESIM2YKRJnBFqK2f3vIMqmwAVk26z26JekddppDR3qbpva0Hicmm80z4VsrKmvTQ85Dxu6iYVD95skEeTCX9O8pAYc1tDrEk8lN03ldddKTDefB/tygQH9x/jcGsPA4k7jXp409PadUKcy6XmXFErpLW/dVm1qGWimmnnxA0KjFdW0Y73kL3KWCy+Fp/2zOHw+SvsPdzC0zsPcOb0WVq7LsMSI0GCQpFZ0twdnJhgeGKE1fW3sHHuHVzc/BC7j7dx68ZN3P7pJn7/9TeEhS5rAYVRvy8mmNTcMQhvRO2E7uYu2incbIGd+3t49XIXk9cHGG9uAmsnMVtkbIy4vKaxi1wzuc9FcB0CUBA+5sRDx5/UBNRHQxpYSz58HzVY9/BTtE4zRBmL0qDNvqSfZUM2S5jV7rvIWPQz3xAkHgx15jrvF0olhcbO81oRurKniC7w7LiNTp/CJxcu4fKlD3D5wnmczSucE0/9+3/gl+vX8cN33+Ov23dx2uhAXDXN0vauowhtdI1IbiNeDAY8sDHGla+uwq8OMc1mRCVUA7X7SxpJEW3n1LIwDvyoWyb5hQ8p7rNhItPUosDQGhuqaxWYM2lOVlL0nELHsg5Kh7xxepYaJUPy7SYNAlUUOTcxcdg0tt90CGZRJbnPaFSacLi3KW2ZCjf0UDtyrahVhirpkynHvjUkiUrKSr12KLaLsTA1wXOhRbNeg1J5Ii2iMrFXaWpQkDgOq3KXdMUKmzzL9RX9MNZLQZtgbKy3IVneNU1AvdQ6hHF9iZSDyqBT0E05usI9xqxg/Hv0IP3xEXr0Yr1vZXIgkz2+YMwreO4PxyeSkLHL3qQq9ykbec/2z1khTOc3wxAXA22aUHxR0O2GsBNMo+YTJP5zGNhZ0AvNQ3CBhjBPNGeH0UhpHGxBS6NVXKlsvXJILs81Zzii1IwuJHSg6EgkDb5GxODNzS4iR2KtRaUyOd5oCyjP141O6kVRkgYgryUokjjclvgt90/+1HWNfwAAAP//pJ3LbhxFFIb/qp4eu2c8Y2MHJVIUIIkRwrALYhex4gFYsmNBXo4HQBFCQkJcFCQUdmAISEBuDiRKxIxnpqe7Cp1bdfXkIiR6ZdmT2N1dl1Pn/Of7B2kS6SU9/3JgpZdaK52RN3aInKBRmb95PebUQs4erYW0b/3ylhUj72/r3zC5gssq69ZfkqQKwWfBilGM+x72YhPR/f0GJjQvRJ/6blo+aAjNPqbPkqSDZSBeBgUF+N3vkJdfKtjQBiXDAxXM08/ahCR3tk2W3Qk0A8QSHa3WmEKBBgtls6xnh4mjXiw7XAaO4kBMwRtGoAwKe8qvToojft3SP5yROJV90GX7CrYaklYMORpZJZ+fpcLOqNXBOZ827k3uQH7lPTWJI9AKXI0G42sHr+L89Bx24jZKVyojvgucNv9HQ+NR0EHe8f8Uop5Y+TUfyClo5f6tdsBS997zUBo4Q09ioxMroHHaqzpwafJuU0KhCJg3pxjulGx3Js4OCqpEQLsZ8Ab3lMTUAEihdVhFkRglUEgRmWjPpNJCvHyfugqpiJjiBtmBgjK36XfrIZZBcrpo+2GXgaXlq9wZiac4W5aRvK/GeDrGuKqwPRgKFSALXPOvnfor75QT7E72MJo9oWYCLJvTJDGi+49q/5nmsGVnaZ73KkyefeRp/BW6Ga1rWvS24Eckt4sYXXoZh++9g+8/uY5d8n0mK6jQD4ByVYBVoB37N9co5xGnx7fwx3qBgyvv4uDsIarRHhaeIMatQAqDlTli6jHhBA0FfG22llB+YNkydMhrxrepF8k6jOX/pwumPCOTdsfYJVVl087+9o333esz0/41+w7fJ23S9H/UAQUptBZrhv21J/dR/3kbizt3sPXwEUZN5ArLUOWRQeehpFJFzUGbt8H2vBaBnAaHTqWV267EKq5QOXASYLo/xocfX8MH1z7CmcuHaDkJ7NnB41mt78+rhPZuMu/zLods7/cXgFtY4ZvmAW48vofjZgbsTTBfzZJsNrVPGAQnUzBB1z5be4KqldwzaOmbF6/h+g7zd+WjMBDMk95nyYzsHPDCK8n+YWBCuUh5Q+HBjBIAkUgjEUtKLvpuPsas91HUdnWiwIdgid6uHawDiaJnmdtrEwvd9/Lx2kZrUVCq8P9T/qeLKi8UXJEfPe2j7HlOtGJiwcCezeYX2TP+D5c3uX2QBEYnK5DD5guVKBo00ahe0YHKB9yd/Y3TnXNYIGCs6rQ8ytgoNzw/CaBKKprRpCDZJeaRyVgFoPL0522PViVjoZBks8rKAV8MDg4yplz2fnNvcgsGoe2IAheTPmFTStLeyL2yBtDSGGG5bNOd2rhllZyqARb1ksFiNRW8z+1hWhaYET/o/mP4+RpFHbqWMnVbsI5YH/t7TSiDNR4AACAASURBVC9B5yR50w4HaKotDHcmwGjM/vMDuh8CKc5rnPz6O+4d/4aLl99AVVXY3ZuK20QWM5EChBN6RYmtyRSj7QmG1QjTl/bx5tHbuPnF1/juy6/w4P4JK35c6NZDG4XGXXe9uSyqk8iqVGD56CFWP/8occQrFxCnE4Ymrsi+kOJWpfOzWkM5A16dLlxWqc4VGfS5tVbwe/7mqgZDlhy3qmrbRE1eissA2XeHTO2y1kN30Ao/FEhn8z3a2PGuo7lwb0bL8Qzf7GSMM+fP4q3XL+Hq0REO9/Zxoayw9fAJfrn5A258eh3ffvY5bv90F2dKaaUyFkf3jjvgok10Vnn6iGUJXHn/KqYXz6OeDLAuVtLKSa5U/Byz+w7rZH0msWwtPvSjSuj2GyBxqbqr7RvbBEqvtCXAoHFrVC99ltOzXXBQqGqZHAHEXrzsqbGcFcp8kbz702sLkmygWK0aVXwesFgJyufgFtS0v/VjzcIb5b5b24vC4HuZzVymbova4073Yue2lNhUMCuPF2WgtXXTUxwA/aQ5JQhYOaDKViuk0c8ofqZxONIWAAbi1U0i0qfEqwIv099sLQ7Zz0ktMVDunKkZLPEfNbE4JwVwWSS7R1ZuZFaILmNkhI3EAnTf45nNCVb1yicnNeVHcJv4as3rLKscSscqh27sURKkYz7Yc7D10xTWdp7ioqKpKug8zBaMWrwzOHQWH/JZWXkOrLJN1vJ5PNRxJ/jf6LOU1hDhS1iih59RKUkd/qxz+Jexq2uNowrDz5mZndl0N01iaKm0tUrLkouCoF56LXjtneCF/jjBnyCIF1pE8MKClqZYSiVKm6Zr092Q3czOnJH3a86ZyZo6ELIh2eycOZ/v+z4f5whxBuP3CouIYSD8tRLLBds0TOG17lUsO4OGMu+ubiEs5iPMCp5cqUJbhZUrBODWKIbbZ5ZlC4OGYbRp6FCaRBSsVpXY3K2q4F1vlewggicKwHkuTrG5QifaDq5D5jxNRVywn61CJALXJi5iYQyDWkaDJL7oMEQZOxpkK17gMg6aTBshfoeI6QVYXey9D4VfIuLz2OJibaDnQQgNoUNkOpl0INUG9e/eI1NByLVAKw+21p3jpMTKlWaFqIEoVXtdKox9v/S4vnsNV8ZvsYRe/1p36DOeWKOQaOM11epakCnP1bQc1l02Hkl4xSBRtVqrUNJHYE+r1kpEaCpNm9nt912bbYw2ZhqXHS98nRvxgayFR0Ezcr67IP1XX7YVuiyL/l6h4UnSit7ECSHWg6AMsKtVKMdhtLmJjeGQx1myNoLpQbb48DrEzngb4/wI87OKGcsGS48FQNeN73N96YVmZFoh/CS4EOFRuiWaawX2PvkQB78/wstfn2BL/ZjtENoP/r3ecaNU/g1KRqxWePXoMV6+XuDy3SV2J3uYkZ/ypTFOGQ1Abyo5IGZ+MoLQZOOiw5BTTnaj1BTn1BdYs/VOIJz2rGHoBGmp9lHV1XzozZv+M6PnEH4gayk54KeV53Zls9eoDo9QPT1A8+wZmtmcFf7HSY7CGysaLSqJCz4Qi7OBmP9xW00KqdbKkNXuedxVMp0nk7fx6edf4LOvvsTm9XeAqI32fN7U4+eg/tFF2xbZ+z0H8DOOce/4CX6bPse8GGBO69vJCQpGpfmAJHMhoDVIHdrNsGe3E1s1aT+lPQpNo6iczNbbpEsaoOA1jdocjw0AHZpOpx/bYKFRtfjwOwJD15oAOMQC/5QnXIXhpHuRdiDChvTiwIIEZTVAE+2D4CMct1luVD7XJVJBcanxxO15qD1co248+h7X+DYd6w1qs6bv/q9eTufedHuhIOPEl5j3wfmKOoEL6Ai3Lqm05jIJPrOjsy+772Td3kvzmPZ4QgGy7gIVnmv8+WqKo/EZrqJglEIabYu1ag8gSkxffH9iZWhrFycpbN+9IMWxNrGucFH6h6WqaQ/WUMLiOTBQi2R7bXs50QGt2GIORXbwTRPRniGLYqokImoj77ma0HdsmcpqbjgrALc1xHhyE8siR/3XFOVsiWwlaq6pIhLsuTcJOuM8tNtz8YL3X6JXjgvUWyP44xHcbIM554QtIQ779O8XOHz8FAcP91GMBQ2IYkAME0gs4RkNZRBs1nvKJBEwurSJy9s72L5yFTf2Jvjx2++wf/8BK/3Dy1mFW+4TnQKBJhes6mTykytIsTrFYvoC9b6DW5wie/cGBpSQoJjZ5Ld9BUcQfp6XAqtvnNnmamEnqmLS082aUHDxTQjI+B5cOFcmKuiZDxVqbFVC7bjUqK0CZeTfOxPK02VUkBkuJDfps/n8kTENjuDIw90d3Ll1C+9PJvjozm28Nxpj+6zE7I8D3P/hHr7/+hs8/OkX5F6sMEXc07coSbtMcNGmKKO5MmCVAzfv3sbk4w9QjhwW1RKlX/I+kDLPedFZSyUpE9Z4RuFqIoWr5863wm/27PivOVBsuBou9r6SmCTuvQVIfOaltUHP0BbI2hnLaxHBJWG+EoXBhO8E/t6DtbuQjKHvZV0F+ga9Vru9yofkBQtI0rxXBXiRltDqdg/RFicCRa2/DpQss3Ctg2AgLNBPJdEp+mhBK61/1ZFIIMPxq7ItgubK+adiHGukqcuIULS79GiYHkjtW+Ha1KgRpLmVSQG5LaJ6SXTwXujEwpCQpfT5nPAphArAc8gr0kWeRHfcqQhfrUg1S/zTfdhZVuIhoVdcdMnZPuivCD1dEc9m3auJKXkd1lg+F9K62RNGjOMEQyRTcjOO4950T9x3yv2nhIat/3R+EDt/SdqsyhL/AgAA//+UXUlvHEUU/qq7Z8t4GQc7DlGUBCSEEMstiAMXDvAP4MQfgP+HxAUUiVjkwCFIOSE2RyjGKAvOxJ6Z7uou9LaqmiVI6ctYI3uWdlX3e9/7lopjBkLSOBiNwRwwJbKrjYvHJtkWLWdulfmb2+9wZAQ15YVQDmqmY6fYPnokip5pENm8jydgZUSi7XWl0SvjRBlK2SuAjMKNpWi+Tk0eLIHAUDXXpQawqSWNYD6bMYJli5Yn/zqlNLSLimqiN1u8kjEW7OIdVKNP7zdXF0aiWpsOhqksagpoGg6iflnsoJkENrqBeIHqhqw0Qi/S+UwHml1foglgmdgJMUIkThIsjrGvzuRi0CGOD4jZntBiWTZ2athEd2XThXX6Jy/myha8pD6QDobm/GTgO+lv4WC8gxEG6In13/8eVgTGRoJYEoM+x+C0zqPqFI1V08q2XC+IrYkv9QLi2I2zZE0fR7d5H2lcdP5zndGmDbepOLPnK50UGxhB5y13AhWdZxfBgWWNqTAZODc+i60CUkYz1opvFxMxVptwyTotMaAin5p1V4lpHH3GoDq5Yt0UK30auX5S8zjpjbF/aYLpizPZu15uAOYcm0tMjM3CyHbhcqWvAGNNoxcjcEE2Y/1VjdoTJbLG/s09vPfpbXz/5zHqaSsAwMopXyt7g1HpKOs+YL8ocPHsCU7v/YCD8yl2338bW5cnOL3o8JyAHypKCi9Uwphtrt87N47rhLLNuv3s5hpiM5iKj3wtOx0XFSsofliRBKzeZHyTM1gKNsOidVo1NUYkj3r8BLPjY/jjhxjPawyJ+RAcU/0rLhnNpEzAzUrPVZ/N/EQ36o1BpGTCvIlZ+Bn/fPWNK/jy66/wyedfYOvwdV0nhRr+vdqxnCQvjT8JaUjv/wsa/LQ4wdH0EX5tpviX9J/DSoxyOplEO2v+s9z7PEvYGtvO5FL5+Y57xf5yA+ioSL0BznZwoaYUWQNMylc0FVw+CnOuwFzPwV/1GZ7WM4SdHLzrYtymme1aQSvXsuXJjB0u84rh1VP0UvnTpXQJaQOMbizPFa1qk1deM1LHNzgjF84tAb+brosEAhONcUBxwF6iP9vS4SzUOM/hxoBltMjlrvsvPzoFC2jXLEqyF+iYYdVaoZ3tuU2fz3EUovQnNJF50dZ4HAr8jue4jgMGAPoupRSYj4K2f2seE5sOKr8I7Hg2nwsYS7vVdWvpESHTmTKoy8W0XFfZmMw3Gnkma5jBgJXvljuUtzqQsPufzyICeQDQhWiY5dWUil7Tina+56/i/GQeRtpSSgsIAkSQXp/o+rQchlvbrMueEeMyPAXOG4SF1Bml3qsiILLy3QFrhHXNkQnasAc3HsHt7KA3PUc9bxg0J9Zb2Qac/vYHHowvoT/q42bxDvr7u8xI8Lpwev0RnKuitI1kUAS+NUXAcG+Ca+NtvHZ4Fddu3MT9u/fw43d38M/DEwQashgoqgoAXmtqQmngGNcUfNnxcO0Ui9MOF/WcG9Xq1g0Mdycg5T1dc0nCVQXRsbeqZe91Kv0shJUV5ZxqMNfpI7/XmlSParBagP9e8iTiMxkE2GoNZOlSgx+b/8KiYInNlu09ZH2Tl55gezjC9tYAH314G+++eQtvXb6C64MhwsnfeHB0hKNvvsXPd+5ievwIY0rTGIj/j5OP8lI+j4H4zE6g2L+9AT747GNUh9tY0M2tFyRJh4wHSeLiTC4if8mNsa9jljxsKk5m2sRAJMZekZJOzAyO6xBqhBXUtoZWZDXWjyTGsgHQVZX2qTVlJcd4S43FkgmfNPXCHE/0bzGOC5yCZgM5a8js56B0b9sH9sg1qxmCd+ov5tKgEhkjoFNGCNWj5i3iO899mUWMW+0GbQa7kIxqbWK/OuCye4HUyF7ZA70Y++51EFyEZO7ep3oxNNF/gF+78Wum5ibRtbQ1HjhqWpRN3pnJoOdDnO67pV5GhqJIRoMZwyCvj63/si3FyQranBPTzpjUBPrYPVUYFCteLNn1Oo9at/6T3jv3nOD/g35Pnvzr/yYysrN7rfQuGufL6R7qG5DFLfLgWo0JCTix1+FzzSaS6Tnp1YvEYgDwHwAAAP//hF1Lb1VFHP/NzHlceqG0JRSJQRSCAcNSEx/sXLpxZ0x04xdw4wfwQ7hh4VeQjRu2Go0LNSQmJgaREBoUkJZGSu/jzIz5v+ZMK+pNb9rbNqe3c+bxf/we4dWPrnw69q2sK+8VKh+k6qiTQio8Ir7HXH6F+JcuuSovipigqFjaBDaYi1RiNcnUQ97+EUtsnXKR2I/TC7TZktBBYT3mi+1QJz0Zk35SuCXi59konGMUPrL75it4hok6eK3AWfPDONwjLWD0nWQ0Af08j3B8pyISnGjqRkw/Fyj3SJewR53o2UZhsE9ddTIJLXnX69lkJmVu1mqIBztcJtBoG5gd/JYoxuI/OU5osd+Qz616gxIFJGqVjrgmdcDzrADUxtMptnhYJk4aKO5x84gza8/h8ouXsOqnmAiI7lAIdfAVdZvnJBxIHOHZNn747SfsuyWr3JsdZFY1XebIqDouvXcKnoeqkOTNakdtRvj+htGH3SB4dF0r+vwT8XH4cbCiaegW+33z37Q1ZMF833elQmuwJnoyBMmPwo4FEqi0Ahb+gCt8N69iK0E/e+fKambxoGRcK4FtE8R7Y2UVm9M1TEOPzv17GSarOFMgmkbn8HS2j4ePH5VgGapie3gOjFyoxJxMriRn0X/oul7sN6M4ABD0mTjBBK8ihViyzDu6MsHaqZP4a+8J7vyyxXD0gvpTwaDmUFc2V9LvDP9m68Yl2mGG+c4DLB4+Yj/vtfV1LjI27YSTWlG2FqgcE6m4/SjWebkcrFkZ8jLOoSA8HEQ6ZHyt6iVi3wgUwUNbZkHvT+lg58pyCZUHLQXnxPdPAS2J/e3twf1xD/nmLeDuFtqn+1j1DlPim7HvuARKAQYtlXE62jXoWbTSS5d7kEEcNC2fho41OTrfij5HiDhz8Rw++ORjvP3+e5huPo/kO8is0yITPErz/X/yH0NXSJHFcUeKIP+32dt/iWs7P+Or7bvYWjzFgroGpLeQIvuPmxB1qlwQ6hWox6QGIOJ3n8b2FX9YkSqm0dO5Xs9JL2oCsnzIMpJCxvZMv4JTzTGsw2NadCfAvEhvUOH/GgNXJYlZOHhzhf7/CuCL2zewFRYsqjZU+0Cx/1TbLTs36BxxlfgQ03/Uw98r5JF5gXTeKEIoJw02Itjmk4KzPrTmOMiBAms6DGIVm9TbONu9q4JCEyk1xwEuKEXpNiTWwdFkU4vPqfAxB+lWpcjOHSEmnD22hgvosfqMAp8z2nVlU38Yn5ZUd4IKKQ8A3Njbxjf3b2G+OsF+EIFRb0rbllRGOUNd2Vsz86zJU4Yhlj6zcNqfO49xfGMD65hwJ5NhzEtNsJ3THUEWgKuKYvV5YUnuLs/3hC9v/oj7YcCwOsEiRMRWxoX2PEaw8XluPtYC/8+KWjTrKGeBuNyE8XwwkVjaa2xe5rHwXOKFRnQfREjMc2Emq3l01gSAO2RL8Q8PajVsr71a01KHjD3VWUdB0CatKlF3kw7t0SNw1PBYEHRbqid8diUVTUMu749huM5pYVxWtnXdOTmlRJLsmgmRQC42XJiQghVx0hsm0oqLFdvc9q1onuSMJ7u7QgOk/z+JdZxToTDqHnYk8DrpsLF5Ai+cfwlnz59jJ6n7v99TCmXkvTMxPTKX9yTMkQwCbFGBiGQcet63I3fNU1zCUUeXO+c9n+vc4eSOb0IOkRdfKpuEL3Q8flI8w197RNWkEqScOAKYgJ1rJZk3RA830LyKXFv3mO9Tw892coQTY0dUU+YCB6aZcSLSKtaJslyCgrP7QMbpzZN47eIreOeNK3jrwsu4fGITG7MBd77+Ftevfo5rn13Fre++h995gjXfCGqmFBQPorQOP9g8tu8wI7Hg4w3e/PBdnH79EtL6BPtkYRbmPFaMtPNyTaO2jg0SvSdmKWlJUjYx1TGRjtU54rzgD4iuDKVZUBOQu87LZfk9QZsOqsmViwUj7ZXBt+LklJ12vRNz58l73avTV31iWf7A+6xquXRqhSf034O2nrxelf6VtKtfO5ZJoy9V65sg4zONYRtOuGM0d7eG/waqPCxXyNOOxN6VG25nri+x8mjlGtW2TxqrKiAeU8lBbA/k9168/iXuZdoSCRjqfmeC8Jw7No1a2obi90/fn+3PxjPOa0KslG1vIohaxGc796pxxnlOCAV9bgWygtig2EDdqyxmrVHshloz3RXRRpCYgl3n2q5Qs6wIYGiAkk/quLB9IhdypZAgDVZBGUt8Ut9XnbP8d6Uoy/vzCHevRChlbKwpX5rLpMVChXe99grpo5iLxGIO7z3+BgAA//+UXUtv3EQc/3ls76tJN1UjECgRpRJUqaIKIYFy5MARkPgWfAAufCK4lkvphTtHQFUL5JCqIWkJWzVNdrMPewb9X+NZZwvF0irZZNfrHY/H/8fvUbQ5B15Fg5j3YrB/46ToBxSsit2J0H+DOJvgRKmoAXodV2wUTpEqZbY3Wfw16dEOdKyGcbHBidBEInKWKw/HOtZFAu82WIpxd4NCatpQwKA2ZlyB1ITZOBM+qaw1CXbLK9kHphww31nHDbXc0Ok5icoIFUEsOaRgIp0q5pAkKvs2SXPjcQapoHoNnGq1uLDPhVZ1UrqFLQqG5mgCRrMMajqyjBTwy5X4VMWeRYHUv9SEJ7JE2ZPGIkUBpEIcQQXqyPaOFgESnOuXPWy/8TauFH1WVm10lF+9zfyMX1eoMBXd3GnRZWAdCQyp2mt6DM3FrHoIbjU83SDzy0n+asXo9px5Hbg7ksCLgbU+qKBLYwVj/MzX3Y9thgQRLpqL333pPfqzUdDPIvQOGmTn/5HBCU0jxxq6uE5Fg94axhfP+TzQNc4LjKviGpEer3ONBoQt+ixdol61HVdgFioWqrwgMZmy5ILWeTVG53oPH375Cc6PRjj56Q+sVeTR7TBLzo8deR6SDgcaaGRBsC7iYE5OMT+scfTsKfrPbmFjZwfrwyHOigIvXYYJBwoFJ/5eAxdbpLNOHseKH74B7maIqPjlcU/inBADdC0gArFr195sz0FFIKljRHDScjqDe36C+eMDdI6PscF+2BkKgvMS7JPKZJmILMG8dEk80wUJShn15NVCU4IglUtilXKiGUz9lAtGN26/h6+++Roff/E56t4AtTrfa336ktXZ0olofx+PJuDOM+56k9DfESVrOMUPh7/iYfUSLzpiV0dFIKhV3Jy6aKSCK56mr5yfqcow/966BoT3nPpCt7quSiezDiViEiQdqf3zEW51N/EOrrINIBWjyiQx/n+ACAZMcwHkTwA/L05wuJjAb3TYEqvoONUYyeK8atPH7HqS4KHgMaagidFPltC6ptAsfNeS1eBpjhBneUCc/HklmhKkck1FAS/K7yxKR+es1xH9Cl3Tva55UpRv7I1EbduOdVWHPYjQl24098j86yyr8PvkKY4H6+hlFYbI0dOJZHu5zBO/vE0RMEHG82r/9C/mjc9DhXmVISd//bDsg88BZ3r+VRA0U3sk4sRe9AocTC9w/8kjbG3vsYr/ZiF2g6YrpszpldSC5ruC5zwhXX6ZHmGUL7AoRMxRBJxU0yJJEqQA7WIRNb3vpgiwFLGJtFD8L8mW/T36iHMBWjttXuHFmgBQoNnva8DoVQ3fyfFQAEkaFiyKvBAHICoezb0g/UJeor+5hj4llDVd9yNUp2P0qDBZCfzaJeLRWHHf5WSNLv3CoRx04YZDhMkM2dk5ctKFuaD1USD1JweP4WdThthzV73M0b12FTPSCqDxZc67rq2LXBwRFPpLQmWulkJW91ofd/Y+wFtbb+Ld92/g/vf3cPBoX4rOhJiI9JuG+mOOAdbJJh0WKkqE0Yg1JLpU8KYkfn0DtRXoMjGykwYYBf1ONXta58qQf8nfLqGPWs+X/m8JiBNOf3AuohdC6/XxfUGsaQtqFKytY+fmTezt3sHu1ha2rwzQHY/x4sE+frx7F/e+/Q5/P/wNgxoY5jnfKcq6jv2OOu5y9VykMaBeJImEzgYZPvrsU2zv7aLe7GGeSfGFUHoS6+kdKG9ok7weeUWmrtCOgupZmR6YD424Q7uxY4/x+ZhjYLbTW4idWpbqnGGZS24OZgbXZns9Lq7kMREz2qaIIvvYnZbcxuv7VRC0bBqOVFiwfUO10gaDPqNuaP3nTq5Z32qztUGJyf1wtpg237eSYrpB+K3Tbg4t/Hw2vzQ+lMeZxWCKYLQCaqEcfDoGhpVzHJdzMYI0AFIkNzsQTKdRbd9oDq5OOuAat3NCXEsDlG2YVVNM8sKg61MdOf9Lc8vsAHM7fw0FIY2TLa5Obes5/rJ8mCnQgpqI+zUnAR1vKw5R0s8CknFeUfKvzUfTGGLkjTR4OZdi6sGyc5tps1BeSzEJx5CqxZbOWSt+GXLCULfpfYLOhzUmjdJvQrC+9vgHAAD//4xdTW8bRRh+ZnbXduLESSANTSgXekIggUolhFTgwiniisSVKxf+Aog/gsQFCZVrxYFrLhzKBVUFtUBSVQ1JUJP4M97dQe/X7PijEpYsx87aHs/Ozsz7Ps/7PNmtz9//KqTWMBooMmLAdG63cNKD0aCSzYmPNI4qWu5Vlm03tUffqD5ylofpTbPTHicQWq0oBOG19r9QgQwaXNZOpqigQbiFAmSISYgdLBRxaSN7qCYZVKHCECK5WOOTXugNijwXTAbJnNF3ElWFfjMNUvpcej2oToIwHhYJg7z1qJpB1dSwm/2P1Xk2C75tEKy+RNDuQmkn1UwtbPpbpH+cIucq+qc0wIZVYEkVqY8PqgZN54AHZZ2YX7vG4s9U7pFuUGqxHuFTXNbY7W3j1s238FK+zn73KfW4uc32UG3ZW+fxz+gMj84OMXFTaTdvwPSo0Gx4YyJLs8SM8id9H5El9ietBCHUuwWu8+d/oZXxdTf3fPmx9n/7fFN2Tan7M4uS/mkJCnufbQxD1NvwkWkz3waupYQcT4+M9LocW6vr2O5uYDVrMfL7Ihqr0ySJY/Mgj9IHnA0vcD665Oua/PwFzVkM0CITQIMwsGWkWbYI7VTA2IoVu6kWP+eJ0aM/GaFsA+u9Nexu7uHoj79Qn/fhyxDHjJ9rZ653n/QlI6Yc3NTw5QSt6QTj0xP0nz1FUZXotAv4TgfBF4Lq+ywiUjB1YmUgZdEfXpArBaq0xhsJHmg+0slxtTBUgqL9bO0VsPQuSQjJLpOIVmcwRnFyChweIX92jJXhEOveo0tKwTTn+DYK1oEQBgCVApDC/1pWoMubMsffVzIFUIIvLhtBziZ+Obez5J/7zoe38emXX+C9T/bhu1vwvsPH+UR1efkgedG4N8qs46D3CYAHqPFTfYi7j+/j9+oCA0qwrLYxLqdMi+1PhtE2jBhHVBKRapXMj3FDVKDlS1aTZ+KGoW7m0WXXaECjV4J4TqHMGnKFHGKKK+y019DjdIv51Cc98j9YEBxqEmoBx+yHA1zgh8e/4mm7xmTFMyODxJcyTbcYg4TjhLk1KN1QCbO/jg49fG15Tcyz0rZDmNZsN5qzirmDu6rQzQp0Soft0Ma10EGvykFHUBtIOK10kigyOqxt6onBw6O+EpQTmiDgtUcfkSYDdVPjU2SDyt18htGgj2k+xE7xMjouYAV+xhM7AQ/n+lJuFZeTBDyHwy94jp//fojj7Ipp47TtZaTTAny3fJ5mnIuTVBVfgGLpW8AVLfx7eYHjwQm2N/dYDDAX91D2VpdE6qLCYPr5Y0123cc57j15gEfVAONWznXqZTVRYT9BlQztMoChUptLs8YzIEA83iV5b3si6Fyb6VyFJKghpXAX9W7K2IPM2KhDRJYsOWnliM4LQuUNBdNH8fGuGEECb+ArQdtpHBC1nWgmuUfIxQGiKDo8kis6/qpimrt54PPYmZs/Igik+w6myzKS3eI+b5UTOEI4KTkYpOypJi/6kTADWu0WNnrr2NrcwNpaF+3VnJX8J8M+xufnKEcDuLpkxgen5csJakoSkSc9C+SV2NzZwu7rN3DtxivsI3745xEDNVVoBCdN/8HGqVf+Fcuu0nNa8ygRoHtRLqHKO6gJQaX1P1Mt96AeTAs0fQAAIABJREFU/C6LjKaZu7O5QO628BhTIiT7C0m0+pk52eVqy6u0/3o+UFZtgNp+0LRC1xe4ef1VfPz2bXx25yO8u30dr7kCl789xMF33+Pbr7/BwY93gdMzbFDSg0V6A9pa3MHygc5Fav+LbpQQoSTroOPw5v4HeGP/DvxeD30/xTRM4HKxG3S+UYGia9MCeZf5mQTp8vk9RLvE+eDd2H0IiPNljCOo+oAV1MXDXxBdOT9pfwtprNZ2OA5KSYiarku2RM3zKE5rQXqce6o62q7TtRyS16Hrmjh9lTxP0di+KiUQp3ZljOhnDWs6TRIqmzFTpDnXRAZ9Lic2tARbxMY9B528XihyLUxwKWW1cm5T8I+MME1UmDsJrwP6e82Ri0RC6VwVzC6UpErF7KY8ljVbHMOlSNGScNYdIagGg4CWQeevmhPQFs/wc2UcSMynlvN6nlyyxsfPjXtVY43LfEPfReCW6Y1Rf1kcR0BzU54hF5skiqSv6W8rOZeyI2V4m3WfuXYpO4X6hFkFytqm/uJzxm54zVi1tqRgGyUYuKSDki9ke52UjCzuT5o1mN8fgP/ourYVuYoouuqcOn2Z6blkjCNiEhKMkjxIkIBoHkTEJyEPgj8giN/hF4hv+gWCRHzQDxAUfBSjEASFMclg1M6EiZPuPn0udWTf6lTPZAJNIJOkz2VX1d5rr7V2fv2DGx+nC6hh7XOho+FyWRhK7zd6Q66OkUGLxN4UI0TzAe78N02kFNp3ZG614xop3E7oOLYgGh49EiIV2+gOvWNmwQs0S27IutP2EPgwVSRJNuJW85EsWTBJwIUummWwlsTnumizGCCtLs7WNna6JhsjqGwEpgaRGeGi5HGErdL5uEPlVq/X5qGnRoeV3juDCIMiBr11CNMOAAXAcQq7/coZMStXEFj7eae6WeeyiG7aiZaODaJ7YhQpJtnmJ+BWpgtkqrW3zdOqbA5DGgnUZri4ew4v717AiAbSuUJ/6rB6JJ0sYkl3SZT//cMH2Dvcx6wtZVOkWKQug9JmYwKa3KctGou/4/p5ivE8+aRr4fhhkcZtCgA87eA5WYynMS8j8gjRo6IsdEbF6pJHt5qwuiRRg7I35L50s7b5syvXaP9OgQJHXTaPbQMAihEDAqfrWHPOxISR4ljH9Wj+GPNmwWZ6flRwlzb1mkgPRz5M21bjeBA3bQZmcnlvniikdYNRMWbBIlHnatI1DmQ/2Nk5i53tHfy1dx+zw3k0ZLOP0YIzpB0ZuSOvyWbB7vjAgJ5RvUReLnF0MOXEcTJaZ3fuNdrkrTDnYfsqDekQpRaml0RikOY607CpD4PpODX+mf2khmzcyQ5d/7tSedlQC0rrov2LwMi6xnq1RDGdotvfx3D6LyZliXFoMCKKPM+k9ly45urgn3NCHDB0OcY+Z5o3FBCseSZxVI9LWa/Ff/DAi9eu4v2PPsRrN2+i2HoWNdPGi8Tt7pQQ0RcRkneBhP5cOcda73tc/M/x7ePf8MPDP7GPEuX6EBUVX9RFaRusTya8l9qsY6F19PQ+Bird8bXl4lQW09ylAACBTyxHy092/6GFvoGc+miibIHi4NH8CIvlAoWn7xlBIBUBB3oJRJqi9x9Kgmua8UzPwGV4BIc7WOI2Zvjqj59xf9BgNs5RdmRi5Pnd9wlt/3zTvSft+PaaVx9HPTmdlsNsN/KGKIYY0PqrWkzaDrshx3m/hqsbO7hx5hJe37yAVzfP49r2C7iyvYuzowGG1Dmaz1BX4vbOHvlOmEaWtLBFWcK2MlrqaQAAFKA1mRad8/NqjunRAaphg+eKXaZyh6Twd08JPadx1aiHwgME3METfPf3Hu7MD/DYB7jJSDwAmMGAJPGRHELMrdSt2bT4ivnRfVKx5wdDlicdNnP8Pr2LbJ1o3Ft8fbXKskMmngAWCIHPKbmuJypL+DH8g2/2fsUvswPM1jwaAnkGksBTwWlUjwgOOh2/q7JHjgllCoS2Z7TFpZeaNCfPqqe49i7p3PlbVhipPMTAUp94ztBezxJEqgWpU4det8pGXq5TjyFE8MAr5VxGI4tBGXVmee0NRzwOOrC/SMV7HucsCQiQvmCWE9iZq91hMmcjLw4GYZsKzXLBFPOsIV19jQEBAzT2s2qwWCwx9B5bm5vY2d7EaKxsQSo8qhKL2RE6vo4aGTMsW5aAyGvU6ReFx3BjDc+fP4fLly7z/rx/7y6zZnwCAMRzIIF/Oy3OCxk6j3I+ZwkEzXsn8IyApc4lZ4YWEC5Kk1ZPNz51XND/uRN9c5pzuIRlyPuYF+o/3ZkyYLtM89jMPEj676A/8QTms5dBiwsbZ/DGpZfw9pVX8ObFy3jmvwUe/nQbX3/2Ob745FN8/+Ut4OEUG02LUeiwpqOqBzLwLBb/3TE2QorzBDXqrHKHozFw7d23cP29dxDOjlFPHMquRNtR0enUQaPft2WKVi93zTR+TmvcUf6bSphsD+3PAiuYQ6xzeL11ci+11jBSjK8JEIBcPRqkBmIvM813WmUR5sq2cAnNPQQDI80JPug+FPjdWPHNrBW9Ti5qVS5jBW5rk614vUpBLz5Wlvu24kU2HAjLUxub1h2W6zTKedC8WGSplutbQ9fOmDjeOMkxOzWKl8ZjF+UKMj6wjHWXXbPtX7kyMtgjTun3kZ6veSR3wS1SdWwfsyyWlVDuGXQYsHebyRoCgwdZbAbyNeth0vGkKh/p/rDc2vJ8PhdEum3NUXqGVPjT9cqIQKltzTRVvBckDmWinMgvUpDI+76xboxq3j95XJ9IkiwPifms1XJ6rlo8n2B76f4vf9eYIOYtJgAID1jn9y5MdGtOU23qvcf/AAAA//9sXctuHEUUPVXVj5mMHTuxUcJDREgReShZsEEIJBRWSLDgF/gKxIeABN/AAikCVkTisWAPgjyAJIplhGXHDnY8Mz3dXYXuq3ocSDRyEj+mU91V995zzzk3AwCw7pkiyVEN//pMo/CKdpFZXc1HByceSW4Tj8NIlkBZZ9Pnh8IWnHSmSRNifsg0YPBDaLY6amrGgaMTCrqgGz7f7FLNapCN/xQ5Xi5KdcoA1DmeN2USPZsl3eLx5dWAr8/dbNPnDFS7kOfyC3NACnoqqujn0hxpuoXksM6eAJ10sHi+K8QMI2rnk2tiRf/Ejb+XhCpYMBZaB+trtICijdgbhWNJz+IZrImq/wo6t7/PReR4NM56FDANKeZNOPBMh0PCPdvS0HEdjjftcJo7pc0so3Sm9c5MD3j2ZKAZmCt+guuvXMVLk3MYuzqjlv9FvU/+CpD5rUc4wr2dP/HwyTZi5cXIzgsYQQk6JeeG9AYyCIwdr6fQXcqsmT1JB/UnnPCXk+zcbdOOrFd9dlA00GUJiuQwlFT1Ss02naSXDO3E/8c2N90TWhsyM/QqE7F77txQUnDnPoj0xZDH5Wt1Ih8UF1/VOYt3ReB5qWR0Y3O+KVEj60UCAM6OJ5hUNSrqaiZTrj/7srvilFIe0LgeO/t7eNpOebKHvd/y4TTotOTwq9UdttURPLSHWA8VodrXgNn0WDpiXtYysPa5wzQtsPHiczizsYkHDx6gPWy4D2vBAZqQ2bUGfRVpiRVgi09BwAkjoGwX6A4e4/D+Q3S7e1hLwGoRcKqsJZBGmXNPshUGWKKyaKKYa5nRDidYmsjFKKwXRpuj065Z5CJbDk812dGPWRtP+6t3SJ1cX9F2GM/mqB7vofr7L9QHuzjVzDCOLSbUcXEe1JsnQIPPAR7a3PGqnC5rTMoSNXWcyIira1kL3ZiJHUmriFZbel5f4rNfuH4ZH370MV5/7wOE1Q1EV+Xz1ADK4QFe+rj05/jMP9EJROZXVAzdBfAtdnFz5zZ+frKDA3SYkScLBVOiCWbwwPP5xEd2r3pHJ7GnYj+PwRzVwABaRAKL27aRfaAQWqEIPINXCtT+72/a653o7BioVQ01/XzqtviywtF8jp3jp3hSJLiaCOEjlgEUmp5qo04LSGUIOOkAL7QQ3ALwE47w1cF93Lz/K7ZSh3ZcY0bTKCgGkrksxZDCZ0QruWGhk7bThKLvOd5yp1rPgaD7NanHiednTMqGqks4ExMuT9bx9sYLuDE5jxvFJl7DKVxFgUtwuASPyyjxajiNq5MNrK6ULG07pO5qNULT9nm2vEMagHR1kyb5SOS56YXGXZUM1mL+16tO1K6XHK/70uMwddhrZthPM5SjdYKG+Xng5Cv4wa9HxwJQYb9Q3f8ud9d73Drawo/bf2C7P0Y3qbAISZPNpEANP1ACQohhj8Tv2KGwp1bPZE6sCwEB+gAc9AvsuwXuHO7hTrOPf1ZH6DDh72qsaSoKPS5qDvV+/4Ypvj7+HV9u3cG9OMUuWsxJw1wGzNoGVS3AtjCpvOYVAzjM+nI975NqZ1OSM9yYQ5JH9Rxz2F8hxQGg0Q4x5U5yxvRZe2wMJPOTkbzHis0h58lTmpKYBtJIOWscFFoo5c6rghTsc2FrygBYRFipEdbGSFXAvBcTZDY3jlLQmp6GcyWVY9oLVeBxegLWW/FHAv7ITJbQLPg8JAoxyVxmR8fop3OkpuOuNF33pB6hpqKeqNFOpjnN5k+xmE1RuZAZr13yKEZjlPWYNfJ0cWfPbeLatSvYXFvBo7u30U5bjDxYNsPHNxltctCOzCIRVxH27+cziOQTjiY2ND1T68lAsVMPFs+G14ljK+eoBpRlCJHOlD7nEgY4Jr230RzoveYZ7GkT+MVz2+kaRjXnbi7JFworMPB+pbtLLLK1osCFtTO4vnke77xyEW9sPI/N3QM8uvUDvvnsc3zx6Sf45bvvMd/ZxrovMaJiR7gOEgshe5LOws4LqyYysDowmTJo4ks2aj7uI5oVh4vvvoUr77+J+uV1HIU5jvspYtGxHIrBjqWkk2ORFjU2Go6NlhetAmCDhM6maJE5YqG+CDa1xp5xzqWdNV00T2c0WMfUQZpakkIlNFSEss684u+ZExNlifmaVPZqlZw1SZc9XPK0IEWojSHHLJ5CJNTMcg5BvVWk3jEQotBOek5plpp1y4WtNQ1jEilAr+y4nCzanXED+6fVcdjQWoxjRzHSmkBiD3meJd3bUUGYoJIHeo9m0ar8QbXvvI5ezeSTjMRkYKXnz3HOpL41UvQ7Ddf6nkmc+r1q+4n1wGaGJNVqGlSjEb+n03rGcf0k967U8d8FOeHTRIF2kfXyxj4Sw0gBQ9nojwEeqSNJbmEAhTStvPgRBMlHWHKeem5YcUGfaAKEsOhMG5QnLzBAIs02+zuDEjqGkyeyLPl78WQD8pRgP6QRXz/LA7S2M2kQSWbZa2ssdZ74UJihu0zfoK/h3J3WqxQGH7EbUgL+BQAA//+EXd1uG0UU/mZ27fVfSnpDAVGVUgoXoN7ABVLFbR8AwQvAI8AD8DKIB0DiRyDKDRJC4gYUqUAESasmTUTixM46a+/PoHPmnJmxC2IlK5IlR/bs7Jnz8/1kb31w95O0W9+2Hu5ByTpD2zemoDYRrdOJKhVEDJVh1fu4QRlCji7ACFlF0f+nmFwmVj2dCFpo94k7K8TBaCLP0B+K/rtyU0DhEaK6GLsl/vv5TlQWJvNUGNJ3HQ1HfOjVgbPkRFzQBVEpeviJbxO5euox6YV0nPhGpp3FRrtd8tBHs2UR/mLonr9pfdEGSG0Nw/Rf1jhLOCF6c0PxzfV5HkSuVHdA7w/bSqm4lVwsWiENHe3+8eYUCKfaxWkg6RLoTApB1TUJRW1S4MZiwfF0t8gKvHztOl578Ta27YQ5y09hO//jqtsaK1vj5HKK3eN9nshUBNWj9SO+YrPitfIPrm8WdKklpSQ4JM6y2V9Yg8lsTNv1Iti6PrQphIr1D5p2be/qfdY1RQhk8dKAUoiDRibNLdWxSJ8tEygsfn1TtM2/oRFcggxxUnBmweLN60/0YfHMYIzt4QRb/RH6/M7/GFnx7/YUlsotMb2cYbaaw+VYUwkzoQsuHCNB8NQJmkefi9zL6QbBRqdil5lXYXViy1KhZh4oNQBG4wmePDxAvVj6hJ1E3lSYzURYpiYb2hhIhY2NzEBo6tHvGvQJqTSbY/7kCZr5HO1iwXZ7kzxjhf1eW8NSB5XU+Xka14b4wsJNPLGX2MD6AS4U+2AXjyYKuume0L8Owa8fEiq66hKD1Qojsvf7+wT26ADDRYkBoSQ6xzzpntiBSgrK0xuyuxpmOSaTIRexFL9JV4G8/Gux/VOEBFEEKiroCuDmnVfx4ccf4e133wOGW4AtfIyTqBhnjemGSF9RW4B22aqrmR98CYMTADtocf/8Eb49+RO/Lc9xkTnUvYyFsegwX7GSsCj5N9GqiSFw5FohejKtQBpVo8brmYjyMOmryFQg7b7zVxWP41qmqk8hCMTq0crz7FTrxXjqUNWsYPt9LOBwWlU4nJ+iGffQ2AJkSLaQiW8pU99zsTY8EXvDfTT4BTPcn+3jy4c7+LWc4ihvURMMnBLcnjYcIagYaWy4eG4gUefvVAzUqXjahjWjCE2yvzDF9brD81mBN0ZX8c74JdyBF967AYvnYLANgytAeF3j93ocpwlKfVaWKAmVQwXYYCjK3iYUIQ5a1MeGpBPxU4oBlDSr9o56TTNKw/pJ4ZImgRY4W1XYOzvEZUED2DHzyOmOnxugpILfAhcWmBrgFMAeOtaR+G62j5/PjnDcVTDbY6zISsx5gSrff1WoZGxO6/5yiWd0dNCxYWOQHgMJoy1zi3nucLQs8fvhI+xODzDNgWowQIkcc2MwtQT3b7GLCj8uH+Orgx38cLyHfdvgjCyEM+kQWZ8omswKRTJOzvhsWS05yWY+Jws1ZWFP0w+i50F1L2gCpoLMSnMITWyKq7nP44KdlxPfT2nYBvj/Rnzs5Hx3LCKVCR2wEZiwP+ussQG5pp9JdZygSWpusKTzupehPx7yjmHbLzqvW4FFQ9aGqX7rn/fc/YzRSJ5mYLjJRGr6pGFBDYC8FWs0ggN3QDmfY3Z6ho6aA8MCV0Yj9GyPc4nhaOB55Oh4fb0ApBdvLXJPmWPdClpT2jOWEnGL2zdvYGs8xl+7f+BivgzUnE7Vxo2nSwYBRmNErNbxuUBDEBoK2X7Bhb9jG22fHvBvEn0VZ9Lg6sK8PtBHpah2JmIOjCCY/FAlnnoMZqCGHKH4KBbQI1BWKNoOE2dxFQYv9DLcmmzhldEWrlOxsPcYD77+Bt9/+hl++uJzHDx4gHyxQN/VKOTsMTLp53vJL1/8c+S0gSXntXm4UeDPYj6tehkuXI3LIfD6vbt48/17GN16FnXh0PYIRVBzQ8Q3nlr5Z2EMwUOeWgSpvVJ+G+JN4IGniBKxBjdq4Su2eE4GnBGdHFF86RWzG28jST7qkMl4y3nz5oDHBlqB5ot6Dq0F9GQAFtC8khepyKGvV7zTQb1cCfJmHcXGa+KiywBrerguvloXKNJcD7DmlJFmQIKy2qChasw2QiFVEd500uxjQKTPOnHBUog+DXadoMRVmDJLUBo9qeUUQWrFrhBJDpsOlzS+6HlNAzRGviH6/lO8U/FCn/tHmP3m7wx00QRmTzkE15gqpM71Xyc0Vo9Y5zxELMR9v0hqNaEccHNORBE5nxBhcro8tUDrS3lYdGeoCLmI/nGurOgPmfKv5fdcbxNNUvMeoCxLqRW1Wevvhbr1+dRUUMcA/gEAAP//hF27bxxFHP529vb2HjZ+xChBISCEoKIISAiQEBIoooCWf4GG/4mKgooaiYKGCtEkEhICOYHYQSR2LvHlvHf7XvR7zc5dEmcqn2/t29udnfk9vsegv7BygmzToMkdiTUMhn3Q7i+SdqUNZk8XxxQcLVHyNgghT9ySUoXWW5LCPJO6V6yXxL3g/+u6HkbDnXkVd7NzeVYi2XU9GI44OcaNIO9b8vyn5J8LFgpbccrHCJXf5TP6h1tuBhWk5ZhKu1GW9A8Cf3avtMnKsc1ags9wlqr0aqPiUKA2P1olDF0AWEBPK+79dxPRD7IFYqqEQkWYf6Oql/2EavyiAkBtEUUtljfFqhdVDK+fVUnNKsYS16dsQS7wyjRhdlImPtjdxyROA7j5mkP4cwejHyjIrlbIqxxVTSIgUtGu64KLVckw5gdVIOfC2TIol1Mxwzgern1EtDFvNl+HD1k4zELJiitWoWXbmUDsxQfsQZEEitIwGw6zBBRqTe01AUJBJApkeZ7E7ikPcz9HNj5jc3hItKpz87yAeM2+SIXRb4iEJkCNSTrB7nQLg3mMkpLjZB25YeiJZ21W4TF2vpte2PRdTXCFkgfqouRlhuHODt747B0OzH774WfU/2UY5jVqel4i4+Gvd6G7F8wu4fFSBylCfV6ivn2O4vAQ4/09TA4uYbS9jWh/Dw3pBCSSBLYpVWMdJ7lUAGFYq85l1z3vHuh90lchNJLWBzlpgfVHhGZZ5kgezxA/PEWSFZiUHVv9pdxX6hgqrfr1SFp5vkScVeBqZV1iiYY70CbEZNdhqLwx6mK9+9H7+PKbr3H9xg2aaKL08HSd7IIhdoPKdNMAMGG+/zF3QTP8dHqIW4sTHOVniF+aMvOWA4mKIMKdV9NvVFwx9pgTg3YqJNBsaWOad413g6H9imB7JkJkPsAU7DutqtfKsevM/incdJtOOv9NLFQNHxG1LJ5Fdm0tdZRjh1leYFkUuH/0O34d7eLq9g6ubl9ikbihYmeog03q1bPsDA+yBe7MZ5hVBQpHYnU1W9XFoxQFqTE46ciJYn6jbhF9AOZnT9R3mSyJ9ta3US+YFpnAJ63LA8ddystxgo/3r+EDHOBNjLFHzg+UPAZFsnDQ/HiZjeqG2MYVTF8d48fjv3CzmuP00WNMt6d+DksRQAWGVIiIi+jqsW3dqU7Px4o01g1rdf/PUOOea/DYrXD/7DZ+wV28tX8FB8Mt7GALsZYoWxbUW2HR1bh39hD/zE9xN5uzoGBJiBYqFmJds8hpp8ooUuG6HilawmgT0I6awer76ymfvUqAk0GEeb3AHw9uIfn3JvbSMUZqq0qohnmeYdXRs9egHlKnswTcEOko5S5WlmcSELfWRKA9OvbUtMGw36f4Z42PWi1W0L5j+4C4ItU+DqGYyTdAWrG7cwr/tgA01mK2oWjC/ZuLNJEJxXXc2Q6LcvK8uyAINTvRfs8KY0l+rxUbXPLDH41TTC/voWhFCLOOMnQ5kAZC6WbB2hmqyArsdDyhncYJkt0pmvaAO4FllWNxMsNWWTO9jahLy8U5dwdJeJitUZclLr/9OuKdEWtaDZQOQagbysKrxTma+QLpIMUgHiJKUrhJipiEboliSIi0/Sk+/OJTDsK///Y7PJqtWFsgoli4jb3NvX0VO2/usnNiVqB8MkNzzyGuCkyuvAI3HSFn2sSA9UHChNFfwchmfiSFfEXzxSb+BtGiECH6jqHzToUGXeuQEvKAkuBOKGJbVCR2jkU3CfW2l1eoju/g5O8j/Hl8hDNymslztG0p6Bhy7Ui3kRcyVwuY3W3rv69RcqCIWtZqUH0Nkzi2Y8qownkCvPbJdbz31ecYXtvHE6ywXK3QJVK47ATWy4ntpuhhxUgk5dZXQg8Q++6aBfzo5yigb1KDziyKuSlRCcWME7oKape7zum/aJhvO+21W8TPL/OL/wC2rqz/1pwvrPliVn40N11n648kiEVWeGvqzfjCxVFfdYHBQfpB+U6p58gF2WIl/3sz/tV1IFErbMAQj6pmHzm/hsj6Ic4C6SgJ7BCF6pktMz6O9+VV7rnvInTY+EZWrZQ3i185hnbSnCRqKN27olzxnkH3NcuWGAy6tf3PdBRsjCdjWW80PrD9kmOHQLAxbPax7o1ZPmocFYoGcjGVFJMUVSIuCLJfEyLFI0D42ZT7aHEGN3LNFYyomBTnx73rAIkzW9PMN9U1hxNLcJqr/ZrvC7y+UKOW9koBJB06e5/Q+ZQ/0JxlN4ggpuAB4H8AAAD//4xdOY8cRRh9XX3MsafNEqwQAlkW4IQAAgQRggQQIsY/jwSJiP8AGeIQSMgBAoQFttfHrnd25+irCn1XdfWwRu5wZzXdU13Hd7yjsAfjDYRfuLykaiJ2XZb8bw+awdJZkVLh46xYm4g1SeVJkmWruLWbWrbFRLACCXS4UxuICNEhXkYl3JQyr2LyxDB8AmFeoR67PblLfaFit9HytkWTkw9MhuYLZ8YGz6A7tGUNasfjwDEmxJbY6XhY8iPPDvbxzWNXV3zeWRGdNRJoAXScUHLyaFBJ5cGmi5Mm/FDFCdHlgOAtfYKQoHvYhmfPnipkxsBL7xWTyG11bOv2eynyWBBlHqf4n4Qz/Y6+abF7MMX+bH5lrznbUgDYvsgCsHYdztcLtoWjinatThDMByPxMK3GdzpfGcWi1hwS0zv1eO2iS8Szrm0bFgmqfOTZm+2l0AqGYhTNHypMDIFQiD8wPZCCCqXQpkl0kU0jSrNeld/zfAzxh8KDWHlZ5w5i4135XPoMhAaJ9nS5wPxCO4yu3b8L/cg79nkvOq523BQHs31MshI1xAs6PaS98qhYsFNFqqywdtUBFhSeRmqxfe4jFYIu9o+lzdxlqMsGYa/Ezfff5EPmh6+/wfqvR3CtZz/o3MTb7DmSezyrCJApjLvva4bUk93hpm/QP36A88f3Ue3tYTWrUBwcYrK/x57SfTWHI0hpNYHPc+yWw9oISWLE64xEY0IWg1kKbajrS7SAwbEA0Zmhok18eYni/JyT/+LpGWZNj3ma/ENgot7sEMl+qCwxrSY8dpRgtL1H48ceG84KBrkYm7966zV8dPtzvP3hB8gPr/NI8OocDda23OL44sA/Bnei6EyK5ycAvuse4duHf+L7xX2cTQKygznKnam4edCZ0nUoCQbqDakyCDBZlZ8uCtJ5/1YOZQjCv4xKy147QkoNoOSf96lW3RByp6gSmVNRKyOx6gxK52AeJIncEa+T7tULbI/UxH1eYLbehQ8AAAAgAElEQVQ3w9PFCou+xr31E/y4eIB9crMgrn0mMPz1esUdPnrPS99jXThc5uKDz5BHDtxbLAkGnouoYGfPlgWu6PPaRHrmyhxz2VCIjZ+5IRx3KmxKuh5FcJg1Ld49vom3cMRd/2MmL8icL0eaGSZkJl9En18Xdh5In79/+XWc/vEzJxjEZqnFHUyEC+38UFoaJ5GM/mllr82GrrtP9l5WJGYRtkYsyKiwk2c4qy8w6zP8evcRZqHEPJ9yIpNB4P+b0DH0/iK0qCnxz1uU86mcCbnu9cx1F5ujzCU+y8lUtsJEXrpI8RtbdmlHTb+Hi/KUwNN5cG0Hp8slz827/gL9Rl2ICMk0pyJmz4k0QeahzkJcqNc4yDo9QUVCs8SZRRIUC27TYr7nPnUwIcDELphFhP2gIm3PbuKZo99szhCZcVWGs58hsH4437lQkzQcShUCgxYUfKIjwJDf/8QQnouRNPcpVibqw2ynxOT4Gq+PDf3t5EKKSGE8DqP3QGPF3v1OCpXcXSYP/Q79pka9blAQk6ajca1lp2w8nvzzEHe6n9At10wPeOnWDYRuir4QiD0XbjqPdr1CvVhis2nQN57tsvaOrqM8PERfZLjIPI5eeBH7uzN8+tnHKL3HV198iccnK+b6ewZWDCKc+iZ1usm+PcnIRhE4v/e30IeqCebuiEtuTeUYEcCoAlO7TwBAPDZamHXBw5j8Tj8reJ9TIcvgVAsgZzRE1ddsYUnPUIaOaW5+cY7l6RkuF0/xy++/wVFjrCFqg0PVire6V6Q43Z8oloL18cmvC/GESMX+htabfJauqLqQ8+GVd97Ae7c/weTGESf/5ASEihBXQh3LlGbHXehi3Eigub+7s8v7i6EezBmFkkTJZbJo2xY0r4AW9wxpmbtcRemaKM73PAUAi8N6dV4ZX0apNRTAYEGarjNL0p1SnRkp2Mu5ROdDqc2qloulQfKeWuH5o+fzIvoY7+e4gBXXH9TGsjBE9jiveNaVrmMuprohjuWmrOrB5KpeT+cX045LOVcZjt52Yx0uLmJqDqEIUbpW6yE/4v1GCwSxaADP75Wg97miGKyYT0UjJDaN9KBN4nFPhSKLc2VvH95XStuQxoG6IVBuRpRCbfCmc4/mjGniUWxN+++KCirqusDPn9gImksdf6bIQhFIFJqc5cX0v1ys0IYiQ/VN2FXF9FlLz8aF1oZR0zWvtsIENUQFtW7WgyQ6S01JyXktV+T7Zhn+JezadeSoomD17dc8dmfslXnZQiAZJAIkEgQSEhEBggxExh8Q8ENk8BfOCRCSIwJDQECA5TVre/YxPf1GdR53ehav6MS2dmY8e7vvuefUqVOVkdYiSoY6SGQbJhe6C8b04MVOQeeHs5suggmubm2oTN+2sfjSZG6MooBuMecJDB9M75D7/+O0i3gTuRGaxtQw+9jt9qvv95Ti6ax73CJDHylzOr5gava9zi12FMFqFdG5vLhQJf+XICX7YlqRGUGJKPLS7vQG9lOkfI8UTq/R/ZU5X9o3ESFyJgX9V1N7ncxAms6BC8QIVdATCBeDC/o+KW6tmz9dn0Hsnfb0F9IGRdBnGOLrXUBL6S+lMBQyt0/0BMCTOyqRNvsH9/pVmO+kJw9ZyHDnaI1XVrdtchaxeInf8QYcQbqcYRQV7ifPnqJLOGPDza50Lv5eYmkmIhw6qsHsoEgLnTcdQxR5JJvF18AFW3y04ibVf0XUysiSECaBi0paJHZLFffv9k5Nnikw4z7Y3DuOlHKN/DpaLFBtK7m3XHOZUzKPWblPfSs/60z8BHDV7yTSn9zYKrG5aAYBoZPu6nggBLNQyZIS222Ffm1gyPUz7NoVJgV+Ip3DDCdHK6wXR4L0DtfgG++qpKY6y/0k60OkloEah+yAxOZHWcAyDNVivZMbcBAkiVkw0U0T1OMW43GBtz59H2G5wKMHv+Ds4SOkFQvbVFSm98/Of6GAZJKgeGBOzCGhT3TcREAeKZISDNsLLBugo1CZiCpxpvIYI9c0LyR+FMuliEYFzn6R1i0y4fRVDuj4e6ZztYEi1TkZ1MaHc2OEHcVyyYQHmezXLZak+z/foHyxwaxucSzYs4pKad+/RQ71bSf9js+PCCzy/nY1qu1OKNBqNaXiNqWoUw+YFewgjnj1zXv45vvv8MnXXwGLY7H6Sw/6OojJzP+lC8kEBDgzb/9f2yf4+fGf+LuvUK+oqaDz0TuyrigAtWuEuSDf2+6B+Ds7I8pASonXkZWle9m1YEKaxqKODEi3LvNnSuNzL0mHxE3bNzrJolREZw3kdiYIpdHOCr5P2D7s3Jo2wabeymHPOUNGE9J5dzx0mWT5aEep1MeBfu48tPldyRgKvXVVZZcgLzM5+7rGVnxQxgMZTjcBrNdBc2XQ2fuDd3iDFEKh2uKjN+7jQ5zgPRS4x9EfK/ynW360ossY/fEB4MeR2fCu3OMVnt59Bw/++h1nHE8PAdWgI0GSVhWpnAuM+73MytbyQapDEqRA2dVX6AcFcURYKVV2myenXdsL2CfAAteJyZDMUO6UHe4qzYxZYj83ICky9GWKHWcgV8fys97ykTzGWKV1akw2a+OhjYkQ13t6qU6QnQdCYQ9yWwkwcBSI8bTZNpIjBbqIjKo2GuM7bcBEJ4LxRLVzgu1cKfqhBcnY9VF/hnE7tRyCegXs6KqAU4gTIXBtChsFhNGQ9yP04wG8PtgYojMKpoB+jz0Alpo17MEzhb0COa31eN7fZHfoNpsOqGQG4ErHiUU6RQ8NWWpH9XPPlhnC62sURoO/enaJtB6Eol6E6dTkIIwkAcDcmis3tXSuE89v2gKeX6I736HpKsyRyny6gEtNj4vT5/jj4W8SF6ttjTtv30W2mmG2miGhUwHBO6So2xHN5grN5gIvmg71coHFyRrZrSMMeY7N6Qbz5REW69v44vPPcBJy/PjDT3h8din0d9rlVgT/kyQW/8GkUOm+U47OsEhRPftHPnMmox9riRtdrmfGaKJh6j8+oOPaZwmOqXHUdCg5Z31xjjlzRcadXpX7JXY2HbqqRjGosB9FcLvzrYgw0+2g6xqcVpcYWv69kiBXUNtHdHggQrFWj2KaAg8C9Wlo6A/DRIwl/m/vxdpwkGhk8byrbFTq1gf38PG3X2J5/zU8D1e4bCthEbKTnlMzgaDbOGrewIYaemHWqJ99JyMpzAn7Zj+qFcyrngV1XmqjjLmRFHFzax4aQMy85IpjfqR5hyQ2K9QiLVXR6Wmjz88Ns3+U+WwrVgV4GF07zRp8ollWSr5ZRDaPj4daVuId/kHzvKat9U8yVhK1zhMdADr1ZCHuea8x3GGAMWkYkqjCz32aZdPo7vP0k1N9IoT9MgZvb4KGPvrtdpki8N5at9lyagFQxyQKPHM9dlUTRXlH27uuaF+zYVwrcLJnDRy6XMEE3rtOxaVbGbtshfkh1PmQmM7SiLKca07AZ1/YURz5mUcHMB8FziZW29qY3teAfN68mSpNXrPt03tJRsKeui/W9qkV6MKmqDGbzTXPnzSsPY4SwGGTb8pCI8uIF59PWT/7fN4/zVfURpIsNMmXJwKADqCLAKGwJVLVWLP6kXm9x2pfSxceFIDGwAK3awSAfwEAAP//lF3LbhxFFD3d1d2e9iMTBYwIcQgPkQVZRIIFfAE7kLJjzy8g8UEsWPIfbNiQLRIgIZPYjMdhHv2qQvdVVTPYkWgr8kgZz/SjHveee865Vb7oB+6t2MaEkS5y3a12Npwi9iCWL6kKMW/gHvqlIN9W6ZNAP9NjayIkbvEDI+W+2HUPt8+G6aF9QkhYJ6zJg6HjRn/LKRTQxLcszalfB79W3g05J+Oog/YgDhauymc6a3ttukBO3LO++15NpgzVTy0aUnXVZbSZOAhpoSorBQ7GCIDYRsoTWa+TzTuKEHX7pSLOdtB7aCB61UzvH0F1IHbYhm3JrIEzXO2iYDsgGlyYRMGQftPfvq7yb5POnt+sbHB8eMQ0uNv+qgy3gwAcfMNjub7GQIEbAws+3lc6lYlbo1SMCldqnkIbBl2ryFWqaGzJEpfg4yS2yW9jNK/+59RWCyBzOk+sUioVWRC4WlxP/RjlE8gQwELlJXYPDRir2M9gSHS0UkzhmAqkYzZ11QjoeYOp/5MQhJD0TuJBUTIYQd4SNbVSQpEZvP0fsrcclBgfNzPcuzPHy+4SHXYlJDmaawdrpSat3u5r5sLu6wN+bqOilT6aUpac1Hps3AB/7HD69CGvLedHLX7/6TnWiy3mBw6um3Z86uzc/V7gwprZYEGwdvZI3i0SFBfi4sZu35p8++6KqyuBKFMEeL6QTdITi4PYAE0VAzkyO2JdfTNDNWs4UQrdio0OfZHOhvpQu8Gj3o6oLq9QLZZoqN9t8Goo6TWoJFsncZClcz9sZ9xCkTb4rhs4IBiDrA+8NvEPeAZVeoPvP36Ab777Fp9++RVwfA9gQ06HnPgfbqCG33QE7Wm/VUO2X8iN/dUfeL69wq9hjf7QMWiX6OJS+aUgjEzdRqVb534i8Rx4DbU1J3tqPMan2H3BAq801gTEhFVdw7QnqWl4r/LRUyWBRkVWFYjfR62bgzxvbic2TpHRwWOnkiDIeaHi8t5E67pm1HwfC2mrxxV0npM+S3JMw6/JvVZcbpqbOUAZ9wynNHZ7E2kjScMfCjxCiw/Q4h04nFCQEfS5ZtqYKU7ADOVTpKwphMp7BuDz2X38Vv+Fn/sF1uSP5uQaK9uvM+kSrUvQhFeC1ik+t4arwdJ9hwEbn90LknWpE39fy97Zb9dsyGZBZt9LQu+OJEgsVTvOyULwEeQLOo9dkfZuf4usa/8eG2jMByUcQfYhrmgOGcjIDW4CG0Wu+q1qduX/SvX3YCeCgBi/UOei2Htd708eNHIA2Gp8Mg0JwDW3Z+ubrW364Hevx9rx8m//+muNf5MD/ZmZK3vdFLufsVMdDLLvRVbiDSxCoijTXsisqKrEhiReDqjvHKAlYIwYJVTZ+3slxn2jBOX7n8NrGsUiNHYaMmBssDk5xDQ/QXv6Bup/RkwXS/Tdmtdzr3ESr4svLtH1I8czZxfv4+yj93D06G3Uhw3HV+UAtGSQNzmsrzcoCCBfvkK3uEY3qzA/fQv1SY8NFuiOLjE/nuOzJ08wPnuG73/4ERerDZaBDIBnIqvj55vGCa2/UvUYJbnut9i+POedc/aAJAl3uRtKT/GGlO9FCkVrYDExu61fLnD95znceo1ivRIJGrFRuoFZDJT8U6cD6h5DFX8GIScwcFBQoYDAIgLfQs9J9UixcUhnOVkFP6TlwWe/rco/mUQjDp7EIIK+z+XFHQILqRjYAg+ffohPvv4Cb378Lq7rkWOHyVmPf5E5eD47jz6o+/3ewTGZMr6kn3waKzTHO2PsVEJ9ZvqzVlFzec8YC3aFMnEDm4aSa3t+jBqT0WfKurbbWpsSsMTosSqvj0VBihV8yCKSAPVpUHklgQBq0kadZoj+T61bC/6HmOx6zQVkD3Dc3cVo4c52+iqxQdPDyeYRtwPWbgckp6nKG+dtPu9IEhATSNtzyrReWGJp3gCc2HYhth004Kbvd5mxxt7L9+aUu6Viaq1GqFb1h8aT3KmOJVTyXslZgkg7su8pMkbUlLHn7D3GDNx/v722gqHFIVRkkWRdzlvyKB1TOlb4eRKAS0ADMRQ1xmeZN41wyiMHKWpbPkXxMV0XAVWUnDN4S9LTyBwQfzo7TzODtOdNwJO1kGXjSgXNOCacJJ6m72cJWamdK0qHfwEAAP//lF3JbiRFEI3MrOrqxdMeD2gWI3FgERIXGIHgF+DAEfERnPglblz4DS4cmQMcQGwjDWM3krvbvVRVFooXEVlZZQ8MefEi2+3OyiXixYv3CgtmbI0e21ofeITQilXzTfzPkntLuBn5R+XfN8lGgTedgQUivC9CFBCP8SElIHggxfDhe9fTUPG5E8uwOKJuG+J8VKqG0YByuvttw8T3mD4ySO7VKUAU/rWX25K/0QVnno9YvO2wKsPzZd6aeDBdnTZfWlgZ6oaHxSZ3LLLTtH2PZ+hpQlFteKy6nC9SYyskccL4Yoq7014e/h3WQbDN61MyfZMCFZTqZ+/BglCzSxwPgCaJhu7QM352soTa7ssmFZQ63gj2f6v1itaHHfmp9DN16s9OUHs2e4ud2CbFZvDs+GAQjQkJHI2qOl8sBDnMqm39ms0oSepKYZQyypJ5AwjyPpv8+UpPkLE8soRYRR55Xmu2GDO10q4Y/JwdgAx85IPnl2mKfAFylTwf4icqawDiek1P2uO91Jo4SSdoI5X0ryPvxyQNCBZuSqcnd8g9ExZPk10yti9MUZWRfLFnC9jHdXv7gZsHoKxSLCrT0seEiq31yoVIm3pLizsl3X/8Ok3vLInOlvTn90/o4te/6LQkmtZ9O4AfJP2j4aR1wMQDi66PpyMlFh+qUFGTYr6kO60ispUU9+aHhu0FHarcnOghlOF9w3u73BLNphQWU4psm1h6VDyQQPme8lgeiKa7liarK6p2EsTxRW9VF/UzSVW+YlIAXW5jDbozX3y1JidQkuUZg2p7LYEFC7y9eU6ff/UlffDZJ0T3HmVEcEpvHCrylJV6htjAYNQqePczU/5pRd+tfqEfLp7Suoi0ZSGnOLkB+ExL6RHkZTmfL6AGDlV2l0xOhXYcRbU9y/1TL3Nj1YOi7422/SbgstI8QwFhL6faMwB59R4xFldat7fIyeDEOoqyPdxV8FZ2Gb1XftHo99EqX85AI/FNF/G1qOJZpIGZBkSJOGxCba6PvNOIqZ4Yxgy3rkvnquvUnu76QG+dPKB3wwN6lQJ6/ovsT+fP0wT9XP+Nfr4VBGPw4A0iev/eOf34fE3POMhCNYZo3xywXwFyaEwQ7Hl44Yfwc0EAp/dHo4w7D9vKXkAWS64rkNy0SjguuArN0Bu3gtUafLKoHm9KL0kDC2Ie+X5QauYATNaEJZ+3XI+npeF92dN0pdea26osAeL5bX2rYI+8PFufYW2wlzzec5R503MFpCylsr7MMAvMkLyih3esCZoZeOCp13cx/Qteewhax4zhUewxHvlZHE3Ui1kO/wMoHg8OimczUZzg6iC0oRg4Ybp6VVBx/goEH+twQXG1prhtcD8FbQuw+8cAFSQxqndU891+dgqQzu0iLMJYQ6VCyu2hwwAlJwZ/Vn/T709+ou3FJTVXG5q6gpb378LxoUMbQIsFeFotyNeePIuu7XdgoxbrSPvJJTWg0xZ0rKb08OFr9PHj94hJQV9/8y1ax66Z+ahFmuGki0++JNctRFun+y3tnz+ljsFhtCnN0Tq0jyLZ2ykIwGBJ4GD9sCV/taLr3/6g8noHMK+MwnJEG0DbgBFwt5pREaXnvxBKHf4FBls5FsXZBMHrtD3weqAUW796zppzWpyxe9EN1xROQt9r4IwHs3KaytH87Uf00Ref0vmH79Blu6GWzSnQrhEFzPXCAmPgAm3IquhR/sfaG4MEnFih6loK7ezkZJ50hTabDSxRLfGCDlbZW+cJFfzFr4UErB32kDNr2CcbaZk/ZhX1duKkPLl+vjs9PzoAHVpcUwV+LtbhymCXnFasTHFuhixu1K95Yxy1xfjAaz8DL5yJSepHl1gKmss00vLW+dt1vCyGZ00tWwf9A745SQwU8DXAbW0iGKrJtlNwP8hdV2mbNQNl3CZQDESvpRrPsTTH5wBzuGhcVcI4n1QprreR5yDiStazAL0WjvFRCwqdznc+TwaYjv8m5stE8zTOQEuiY2cIqabzWs0Hry2LgVHsMNV/EzXktRA8LWdLYeRmrg6IU9Q9y4q0IAZqboLzOEjrAX+N9uS6r+oj9m/l+xw/71jDL5Q0m8wHjHTJcQIVIdA/AAAA//9snU1vW0UUht+Zsa/t2IkTOyHdVLQSGxaVEFuQWLNhhxBixQbxM/hpLPkHIAGK2CBBaZOmsXM/Z9D5mju2Eilqk6bO9b0zZ2bOec/zhk+//+wn6zGwN88vqIsMU/xDyBJ7kddNR+pif0igjQXN3CaF+JeGTNI3Kr9z487jODOT0ijiLX+3+fJDs01ee0ftRlr1syQypgwSFIUBTRajlIsfoxy+c+94PxS2HUXFV3tJ2LPRQXvvcHBghPIAsuenWcrpQMqBQVskjLFg95SrRmoxyFIYylAZSNGViRJzYRg9fst5aUEqlMA1pfs6s+yz+2vMAoUnMiAxg5K8JnwUbjFItd0C0XGlyqRY9FwqX+F8dooX18+xmZ6j4nqIN56rDUf5f0/EeVq+92jwxz83+Ovt36gdVe56lu7FvOuxgzvUQ7nha2418xuNFq6wKuYzMIhxBEyW96wk7dtYZ7Ba12V7mWzz4m3MSwuKqQLk/uh4LwBeFsBTGufDSOsceLORgwGcVvynuR3AMqoSKOMBeLIMgp32X3FGEGp3RZLYnr1WcDKpsF6eYjk9wWq6yofrpz+KOapEYpozb9p73D3co47N6NdaLDyD+f1rX3dUP/fj5+yOFxMiXVNltpUDmi0kdL86bVkgGSlDaFzE/PwMp1dbTOYSFHf/3WESfQZQGmbweOlyRRuKw3ju8cXfU/Fv9v1K3Qu4DSMKWIkOMimqyoH911O2biIoU2JgjvQA8+fQicaSngeNw7rDfN9iue8we7/DgvrjteLv8oEeEHObiJNqwbAb7qttH9H2DUv7JdfDBq3qyy3VTKocbJ5f4usff8AX334DXD7jZg7KlUV3KPXPdOnizaey17vwYH/LVf8Gv9T/4ue3N/itfgNqlpier8g/kVkTzuyy7MA1qNVekDqd7S2thi0V8jGWppyJlysUL19ZOypdCF2Ov1LtZ56KKoOivh7SyEcR/2HzJT7cNI3xXj1+40QOuF6SOuJqAz7kBrUS8oc45VHxEFO2UctpKJ0H3J4Ek/oeqi/KL8pDmddKf34WRdHeq5Q7dRHrJuLLZx/jEyxBT3qlll3+aWZufg3oZv/gZ9w4B8J8iV8fb/G6r9kij6rjpGSR+4/syU3xR8jPbLHAscu8kitOBCggqaQw+2LD6tXDnDdc0k7gGSIoajWy0kskYfReCO7cltfmNkQUZHuvLg/MmdB12RxavI7Bg1teWDSJfV7MsUzgffpcLRnObJOWgXGxa+1Fco+2OH3EzAdhanbBVUrKDDJoMh8EgmzouJqWkPcI8cjyy5nNWh4jZjc27jnKh+mO17s4WqmW79/eg1M3CdsQm8TVawGA2wuVOm4uRGIBJsycyCoPk5RHnbMzvhtUFaNkcDVf8qHAXBlYKdGLBp290ZOsoTkRrYcKr+0/dGmkcAspINYt0sMeYRi06ULo5XQ4IUE1tR7t7u7xeP/Asn+ySiV+DKkO0mOLuKuxDBVmyaNqWnj63rsdx+e47/hnQt3j/etb9Ls9ping5YcvcbHe4Pc/b/DQ1xljGjS2lckoUrY0lJog2TT9qX3LTlkUlBiOE7lyjv1+YIgbuobdX4hT4/a1fDYdJzEcHRiII8XgvSRwT9qjsuvFkB0uKOFCgvrOC7Wfk88cfLU9CgFWT7VUZbQsFsa14DiNlXxhWuhEDeX0wEvsnlufcPXqI3z+3VfYvnqBO9egnQ2cKJvMPNqhlvBM1xzESpf32QpcC2obHBTwSuOsUtn+wXjVD+ZnebHa5n1bW2cA9kxdSYKqRG2vwj3sg4KEywJi8mJraiqePnHLFu3BaMzRfJpMpHrPsTzK3ja2vcDCO4dJmmIaJ5gMAdMh4HS2wtIT/2GGZVhgu1jj6nTDjkzXp1t8sNrgYnGG67MtNoszbBZrbE/WuFxe4GKxxrpaYhXmOKuWmJGFTDMwJ8X14NdEm5iZAlUQCFpCHSJoLR5kTnBLL1uKunL3xglknme6V6NY7nX/VbYhoCzaJsk0tk3HsTBqK6pYFCdprwiFysjpfdKWWYujTC1QCTwrVtUFIWa1xuH5SlS/qjhWNTUzSrLgYjz/2J7BIKUpq5VHToqtrfy+NFbyHC4KfsKnVEtV7dnn9Sy3Uo8JWb4PfB4Sa1dpi5BxRmNSVMOjYsGu0car7H8PFcqkIGPFt1r/STudrB2lVWS2BKdIwm4uYkHICnY+E0c45/A/AAAA//90XcmOHEUQjdq6qpdZ8IA9mIsFMhIS4oC4ceEHkBBnxG8g8UP8AQduiBNXTnAxktFYtjFmPNNLLZmV6L2IqO4Z7JHsPtjTS3ZVZsSLt5T4C8VkDBonw0g/1wfAVKxSKvgQfapYUpOji5RIZwVF3d0dVUOvDpGcAM40d7DdblVTZkgL3jxdbE3z6JES/qjn78jf79puiqwZSN2uxAEpFHNcTIsbw+u3dDFV6ryYjty+EvsMKk0ggw7gB6nwmBKpbhrJAeNBdI4jU3Nr1lSDrXm+mN6OZq5BFBOFZ7xpROHggTft2B3r0pzfjR6oGfJGycFBiGirWS0F0gIsYpFUR/MGgDkE9eIWAYJDBbmknLTYjaQT6+zWJmlTkzI3WsyeBuMul2VR3vj/vFBKa+yigg/UWmZKoZo+q61Vbuj9sOlleedIqqy22WV28B5M05i9fjLik08wAF6FtcQ6Y6RQu4vUP+N7Iuhh6+2sDZ84i2m+8PTRjWAszkQdMzXDOj+I2AL1sCxzA8HyST6iSFqxj7Yyt2UO1c1ISaMhdTObjCq5ASWb3WoDV7EpHzlBRrFXALXr4wQ0ZJYSgYUmUn0A1ORG3VKGjVGfZjfTDSAfwf2naKDSKTk9BpiQ9DO1MchVt5P7dwrpAQ7kb+ZmQG6RpT0lnAZs0sj5yXvyZ3kh635N8yEvdJKK4lh04ZDX39Winm6qBy6zdGS9RdivKzUqwUG167fU02J7hdszpsTQx+E9LRdLIuRwhi3ul3I2PuDa/fXvVnaPnk++yYs9o3nfFBzQFGcltPMjp9nZBAyY63ime9sETOJgDIMZkGrzN0yFqbqleaUAACAASURBVDDfGdpvaJNxfyY8zisZcqV6w/gqFh7ulHMu2+QoRQdZpU7m7UYKAFdoapPOfAv+0derCNVEmiMiIm/L5j/Q+TpNK6ipGRqpGuQtaE3vHMs3330vn3/9lcjZPZ0HJy0AnPrpyMw07PHcJov5Az2Wk9RcZ+CPGPG3kV8uH8sf2xdyMVzLpkhSINteAk0IwSZrYHTn06NgkavONhi1GKXJl0mecK+B3TIll/ho3qjIoPIqOzbRIZh2WGxEnKpZTE0c9tw5GTF75hRiL928iWDAa6Yf0aVuABBxbWMePaocRGvGcfoMh/4b443myVkVmvHtAIavd24xrMrS0IUdjQ7vAY9aYBntkZNzBa5vFCqijBnuLSj8hih386V8JCc0/TsyGrrS4d94m08/e2aDgz2q5V2ZFODh8Zn8fvFSdllgrrtMTU6ue3lS5+kQ9ZztukCwB3R2PCfOe3xXSsv1qFy/MZOBQiPlB5pTZAZL7GdUE54NZnAZNSIJIKHv/ziDfR9NFuvk11+4lXgTKTWqJhNJl7wBeN6D6rk17G4epsZeUrhnUeD9ODLSrhQfrdLTIinYJQ4IeYTWwXsIds202x3P9bpZ6uQHa9MNUs0L+hl47rkuRpqKODwZAF5KIRVhsEvQrjmfZjlLcLpE/9/8jxbzR58bo/Z7gVofNF1eJ4i1u7XVRXiPvXlD8ToeNSaPtRk9bApDQZQRg/VCSgLqudk7x9xr26GTFHppdolT7pjLdF0dtp+DbdZpsZLrbJB0XsgcVPhNJ9tnT1lPzWzwBIbaDEygkcWCXD15Ib/9/KtcPn4iDz54IO/eP5fVopGTxRG16HDkH2koFmQ+X6kjPbS1qZe2v5K6mUkE2PnPWo7vvZIvPv2Y59oPP/4kj149k9Y084PVqMnQNdScAFSgoQaLZI5e5eVT6fuNNItMhkakhwko6ttcjfzAbMR9G+tKFud3pWkW0p39LdcXz+Xq6kolXqGn3GyHGh67AczgHLSLlvyApqAQUpixHtEuigXurzEjwwZsFryW+wZXRvkXO/dv/4zOFoB8gn5L6hyIKD94TV0iSeDDc/ns2y/l7U/el5fjWrpCI3zBTON7s8GJygsSZXKhC5IQh1mofBF7B2ULeMSQB9dkrk1amYlFvdnQr9JeZowqCZrVM2nXG9m2Gzk9PVXvlTFOKUgcGCblCqK2jTeYxpCJNVzPqFx8rTVhZz2W9I1wTy94MCybOa+TVbWQpqxlVjeyqk5kVR/RM2k5n8vp8ohyWEiAmUZR6P0N3yoODZQzNUlH6RYEQA1pMRLNJDyqvDVEWfcb1gAtIn9DL5eba9n0nWzbnez6jeziWvDNBtSb+MwpEPDgOock80YZEmBMINFIozbhYaMRdjVZtSrLCBiuTZJM2cfnieryCZZAnoAzKtM6e9CGQffvlKnkpsrMPL4kw0BBxGKKueuD9iCIMc5NpsJzL9szGLDfkwFLRpRMfgO6r6kHFqbfvG7CXh7OPdqeL0b0QC4bARtQ2aZ8DrYLBtzapknf1Jn2TVh/gJHwGVFjRPWTcPNCelgBKKqh51fvJXPI572Bfwd709Nb0MRrzW5se08BIIvZenIyN1RmT04ZEw30dX0A4pJif154yhCMNQaDpyQQUE5J/uPsWnrbqKLwd+fOjO04dh4tKmoCSF1WRXTTJWLNEsGGFcv+On5B/wIsUFcsQQJCqWsnceLHzNyLzuvOtZtGiCtFsRx7Mo/7Oud8jzJmHEvjc+VQ5qAVFVPzNuV4tmUqBQpvVjEUjPeK5Kqo2DbKn6nTRCICGr1KZBpuGSzYXrPHs7csjmXxtcqcURKi0hVyLrdkhvr/YUrKPezbc0KBOiQHNpxM6OH+SYwKfbbeKrGU2ar0mtiigwQ8vE4uGZJBOOiFCk312gCdQolYNCRTSWdLE92ocMfKkBnMQ0+8kiZZXNnkbPfDFCyDOjOY9QUttGmDHKWi0bVxjzawO9GHGHfeSfZTiQ6wuyp49b9lVfNqiINqjLoccQgTMijUfS1ki8syrrBYXgsMnio+NQmjsFxs4rqYAJOo6bdJYKRkrYe+b1m/IOGOhBShSajpRQ1zS7HRUAQ/vG4GORHW9JoNNnbM3mpfYZXvUcbpTfYz2ow64JLIR+Dg36qSogngk2pz0ADJsyJzkVAx97WUddWPeYWYgjcMG4TBf4SmZllSOpcRaDE7wZvlBUNN8QExR7svPO5ZpKvtJ++q3OFgyxc6VYUXz9+8cQCnY9wcH0ItVoDudIjB+QNMn5zh4u0V2usNBu39wFs67dvWKjUOW8QkuGnjgEUm1bdc3ha4ZCCRP/r8oGSeI/VL0IKj/H8SBiRIniPev7PjFcKVZu56KbV6msBJofV2y37LpGztqXKuoaVLqQw5L0LVmEUrVf8bgl6rwIFX2PqA7i+ZFlLXOxzi+5cv8dU33wKPHvfnkT3Pu1qwZA4v754redRz/9Kfn7tL/HT1B35ZXeAdtszZpmCmTAlLhX03McXBd/2vITkXUHJYs9cE3zRkCyPMup6ms9/Xo2bbTVPDMvzWIb3Oh8mqM6ML2Dq366CiugKJi9jynJPTcqyqm84k7vzqj7X3hh1jn6Jmm7v9to+sMjRX/ID4KjSp5dYdPjk+xiMUeKC2fl79xv9vk3SV42Ta2WCKE9SYtbcyz1bI7k/B6Baipzidh/fbViGOsvb1iKfsocr1ptvr+vuuyKj3KnU5KoIKD12T1vAy0xTafR62Hth6rBxWgqUqf5XOn0S5XAyKBojiuqPe10In0yu3JFeGXJEEV3fnM0tq7yYy5X3aWNrfS6VNtApXtn1O3h9tr0HnylWhWhK/hnDsuvvn951NNY3B2IsxG8XNFKtNxyB0PeLAqa6HjU1BMgry0xU1NpTMjjbnSCWMhdto3aXb6gLWNLOMPOqHE5TFOZa/XWD1ZoGO9FyizVgZLF3vdaciWZG42eMR2pMpJucf85zQzC4wZFoIIbIojBLXKKbCdAUuZ5d4PV9g9s8Mz794hiefnWN4eABPczjRSHyFcjhG3HScWCHHEhbZbSJX3CWZELH9e4YVSnz5+TNMDib48dUrvP79V/HkjoGTpTx7p+p5Tx+imjsl1hbXc6z/JDtjYFSfIlQirmkKQmQTGJxnesD4o1NU4wmOHn/Kav7b5RWmwwrL+SU2FOgSOoCQXQT9p/0j00TAwYZVO3kuENYOtnxdju0zmXgRZc3jBAbtiWmfqyja/VZkOU5KmjujtHYBy7BFNy3w9Q/f4ezFUyxwi4YSGry2dYyAoGwoI132Dm7FPs8oyA3v44TLX3Kwm7f3dCcMrcJJY0EM0T5rNKpTDCPQct0HZ8PSRQsMFRHMe2zh11OgRRX+ovNorluULrK+FY0Teu6HxyMcT4/wcHKEyWCMyfgQ4/oQk3qCGkMM2FiVUzFMe7KkflR1oTzoB5C9DoJ4UfUvsu7u6o5/2ih6NMwwU6nGLQLWseFkwKZZYX7zFovbOWbzd1jcXGJxQ6jNNUJDxZQN78e4IEixkIkccnGvYAcGtnV0JuhnFf/0pPh71Jda5isgxYeerfV27cTZ4YaccdYrsWJXNJ5r3c6zoziqVVtsWh/MYp7Xc/0t6KTe4aXnxldq99fwZ8tytwBq2hE9gsRs9LRIkMVued/KXQPSSDaUoC4CkkhQ20Heo4sWDu9BVHTcnNzScRVdT/ct1+5iB4LMft+ukbXLKkEFS/wm3zP0AAsVEkWBCtscj4oeg2meGYqAKaOrNf4FAAD//6xdTW8bVRQ982bG33GIGwhqVdqKZRcg2LFljWDDhgXi5/EL+APsEEsk1AVCKBVSUzexazN2xvOB7td7bxybIMFs2kix43l+c9+95557TtZEXstyGESHKR+gTpP1nL+gwUhUvWl+k20C63DAGfJuDAB+OMZj7tK1pnSP8LdE7VFmE/hA3KsFGlVqTJVuJgV+o6JRrVL6c1XNtw5Q0hEF7ASHNtiLHPOwz9SbnQKHY6qo8GhsE4nKfRNZ8WTe+syU5jvBKKaAmSeyihEyMJAHL34rMs333wT4bC1cE2b+Mz1ozRpqZwrae4lR/IDUdeMP6zBznTHK6jd93X0tb7I4sLq7Q+MeUNHuQVuLVyutyWQ4xijvQ+Tn7gy3/uNFvz1fzLFcL0RwqZKEIAgfOZ9MxqMhBqjwWkQdXCu0d5HSfCxMkKhbgK3hRotUY8ewkEdj1Na7BYkVED5BO3Crfh1TmfEkQTT6mzajI36d1m0KhHQTgLQCxZwW6j3Nhy57Q7qVkoDZc2ejCju5//6//jrCW7KdWIbpaHLvfCgFPUa3zeqEfP23W2EK1VXHscL2qI8n/LwLlanVxNTuj5TGaSUJWCN1/f5JH+mjGdzHH2J99QabXy51bl4D+p4WgP2/R0gpBV86xHo5tq0klq16KZd0Kro+FzVkV0Ye7q4vHX6aB8UgVWGqnBM1YlewsKl2nNOmq0NgjiscD6mAIOVrui+a4Ss2nKzK1f1eTWufdAXocCcWVtnuvA+zaKH1UDYlUkLV0eLdhyf46tvv8Pk3XwOzmXQnbX9oJ9s1h59Hk6Yr25Q7QRTt/gTwAsCP1SV+enWJl9UKKxKV6qVIqVNA6u8EqFQyFpGkR2Z7OvuDwEp6BgqMxiNGzHel7Y/7wSk/W3dkH8axrlFrv+B+4nxhhSg+xzZs//e1/7xyEUlWdApYx+NH8gutF3bDAWAACAwUSsymyPD05Jzt/hpxbPuPxb9cxiC46E0wdeJ7z52dpPXAHyv4t1Jw2WxuArOalTNIWE2NZwseAgn2r2MA0KEriCV5mcawTpGjDVNhdaRN6Om1f63R1fnnpO4IUZZK82/9+NvhzyQMs/jneMTx+L42pwLbo6I/I+KyVvzbOcfnGcTHulb7ZDqzKEehGCtK4tFnaO9fSwME4uaMfN5DIJXjDpPRcIOAoDaEstTb+9nVcNdXxjMds0Kku0/d56yfYnxxxsDbyjUo50tkRcVK90lUdPj3SgSAIJbAhtyBTsdoH19gPBqgNxkDV1dI3y6R1zseKWErQSoqua8qjY8Xf/wuIapq8OTRQ0ynEzjXR+W2rE3A7KckUJTz3kA7vjXr61R/lbgtKtwWO3z0wWPMvvwC3/+Q4OfffpXPCOmi95IAxNf6zNYK/JD96/Z6iXYwRj4Zod9z2CpoSck8dTTJeYMcZq6J2TDMOW+oey3wYIRlmmPy7Cmq5Vs4YkiVDQNZjtTtV2uslgusb64ZEGhuobal8j2XtBIkMG15HeUKNKJLzMG6xmlVcN7hkByMPXa+2Qm3rQphDiXA888+wbNPn+NlcYN6AAGl2aqzUTs1GdfBkbgGLcyci73fAwDQqm2lPU9Vqw4yCrhzjUGkqO1Oc8WcdXLO3plhuV7JaEkdmoROz0QGaVRzgjq+LMFEIr3IMGyEKTI7Ocd0MMH7Z+/h/HTGTOXTwQQDYpgx1GRFftppewUtAIuPTrmh+wCANoEIHFNR0kRBgETH/AaJiIC6ROw9bXSDhF2rvEGT16hGD7Ajw+YnJYsu3qwXeL2Y43q1xKvFHK+La84Zqu2Gz+BhOpFGHVHJ8zxo0yCIIyfRvViYYBZACx9TTSyScmdi9NHibpiZ3TD4V9yKe9ptUYrjAyv4T1BsCg8W0r9muZirblumjgLxOFQcy1wkus7n996YrAHQxqSl3MNquHhfxTGf45gXeA/sRToQ2Z1O5+7Faq8bJ63pa+9nAvRcT9P7KTvBwH1xu6uY3UM6CB07DmK0DofCHvBMAXkdPSd0HyZ4SbV10LALzHJ2FkuFSVLVNf4GAAD//5RdS2/jVBQ+vtdO4sQttB1mVHU6EkIzK8SWLSx5LNgiIf4kW34CKzZIFVKRBoGYatrSpEnsxNfoO4/rGzdTwNJs2k5i+9rnnsf3yNOLoqRgJJ1SY1JlE07mXLRBOdQKB4vJut9RijT/5aax4jZXrvsoTr//y4ZuXfqe8+zYs5F0gp/a7+Xqr+6SSUnclJKJPv9fb11vH4s285jctv1kVe5BkWxuIS6qCR5yIqOFexrIGDKuvqGAMXkvcEJPvV0E3ip7aC0Zku8EyqJmBWSXClUEuZd4YBiabh6bwfF5dGqvyA2G3CWNERfvVZa4LWw3/Tkz5MTtWmYIrCe1DhE9ACtw9k2qSCdx8GOejcasSm2CbOmKD2uDYZHWcQPghosqP/G0ghAOQ7c6DuSAY2ESbiIvuG9WXDrtFo5zAcPZpMcCxxLTVl0bS164GFAYDSU+r7b5GH+UGwyeIhqE+TbeBMn6Jk/UDBg0fww90YYenuSV80mKKKHoD943FAyNAtRI5vrgs+/g746LEnprq06CKe5Td9CvRhbZ8g+PVNwnU5sjbDVl5nuu+DuOTqdwdg/M3pKLf55s7AY42B0S9c1IUxm2SUOrzRucE5KgWpNPiNmUxwcUnj+hs09e0cXln1TfbdlubigEaG2oVnUZ0Hrx4wkdnZ3R5MUZrRBH8PxkI1o2UK0fc4ELqz+oE6PIAXWiQXMs72Kx05mAUSadZUyMRm3asNINFGuONQR6pWupgN7BquaGgMC0Q3xf0gPfA1XXVhWSOS1zylXGpDLzVGJy2dUE8fDPv/mSvvj+Wxq9/Aj+WZI7WU9p35rtWqXHRG6lKv+/0Ip+XL+mn1c39Ltb0D1cwsB7RCzVpB8Cf8xFg2LuuqZROX3k2QgMszV4Prx+mV7hHM3ni2jXEzf6RJyHYhGTNPe8VzHOXHjUZBZzElfNoSNtMLWDiZI8r/+ijPnIsW9P2/lZtitcRIoC4KYQj1seVuvmbZ1+1j6xW7wnVVZQxVZoTNH/H+3Wh8cwXjum1HguIDgRY0vZum+wYC9z0qjdmo/y4FNtCtcpNzS9R3ubG+m1a9y0mGqUK0qb0FhXjh3vpjVZ8W6TbknmKHrpm9Wk5CxdXC8WkWy2PBnDtYlzy0O7X0qK/OFauwTxIHxQGcky9xVQ0W2IbjMo5PFzNMlIn2Of90Kxog8gOjE2wfeqIzBWD2ujknAynOgBpffd/vEwx8nELVekoTVcEavl/mdRDJfU9SZF023MUs2jUT7evVYVMss14d0qhQAFORBYNfP9A01Pjxl//jcamc2ckS2wtLMCJHUVaQH/1727LQuiZyfkq4r84SHl1YxuLy4oW4lYluxwGy7QEGjxjOD1v/jtkrp1wxOx8/Mzeu+wYpHL4G2ooHmTeu53Wh1iiroFHW/VcsFcO0+vzl/Qd199TeGHQD9d/srXts5EnyW2i7IeLYd9EAMSqrfUvL0mf3JA0+mY3WQ28PbnGO9VGBA0slaEKV1HTVawaOYmL2iJ3PrkfabFORYIlOJ8BlTIckFH64YbwHfXt7Rc3NFifi+aJoALOEGvOeV5j3l/DVQsFzS5ekPF/ZLpXH6gIbEPncHUWNdSXRJ9/NmndJ83tALUOXc0Lktar+fyPGj+J/SOx5vEiBmR2pkcJjpuDSec/wq+7B3FSSzyRKwz9pmiEMpUDU0Hbo4aDC4IggGNqHor3H/sF66gZi7uSVVe0cn0mF6efkinR0/pg4Mn3BCofEkzqkB646sCMpIJsl3oC2XVOcmiMaRM7LtuKMoyRAAExqywA426YVm8Q4xD2yB30ipgilgmouiMuHbWeMDZFDzpx7P4rDqi59VTHhDcbeb0+voP+uv2iq5ub+hNeEvLxYrfDQdUjWpWxXfY9GmNUhW66PASDBHsMloCpYr9oXBM9SZGs26j1biJalv9AIE/rK+hYc3tivPjTaDZbCLoz4giz3qaelLgZzoMdVFIPbWdl78Jkc5VcHxlJzily0qck6FrGvOt+SnnJoNb/l3SgEDMToXVmaaBfcRJbYG4GJGIrGugaN+oTyefibwc54P7ZgOI9HsMQWA1LsdldUUzcUA7b/wOH8v27oqqMPQs6o1pWdI/AAAA//+UXctuHEUUPf2anp7xKwLjgGWbSGzYIv6ABRuEgBUfABK/lz9gxQI+AAQIYZRYedixHY89j+6uRuc+qnsmziKWIjmWMzOpqr637rnnnpMPFy8+xFYsMrFw5k28D4MmiEU7jx74bgfhBYx0N9JeNAGWCNPh72U+a9MjI14kb35518NFDXoKnP/pO+/Dw+FggLMBVLhPu7OTMX9/3lt/RAX8NHpZ8mdqOxEizR+pX1jr+L5OU1mb07ZCUCymWvXmZxLnhjLYO1jga+Ee1M0AFHENgsCAzD3I1duUFJrCZlgocpcEt9lRQQgvKmGJnQdgtVpGmqX/n9xWztfULQTbe1pF7isaIs0viQUzuyg+3+7lpgRaez/OxUlyI605LaxY7Iyy1K77D3tCkKXOoO6zLV5cvxK03hHDkVFp3H9TPFMTxVnnpOsTMZcAbrZ6hSN9Sv1yv1QvsjM7F6K+acwPDC7a7gvaxEtOFhkEcRyi6ymQMJqR7CfMv9WCAT+PfO6gWhsCPi01WQi1nbRSUuZt5AZOhwohal4wko0LfX2CP2Gj/k/FiryIs9ZxBAI21tJ1QrleTVayHgy+k6oUGrLPJMeY0L2p7NvZ7GiZpOLuQMrpbDmTIpmUOXH1aP08pDIX5wXwpNRALoKHXI+F+qjC6FP+XBEk8JlcGPhUDrxc5e9cg9DKWuTsKDRa1W6f7KOdzfHB35/g6a+/iwL6yC4qwzrMZ7H5+Bdybls8v3qNk88/Q7O7i2R7D9m4wjhVSj8TK+MML/ytFw7U6qjVgpPARJAk16h1SyfiHjIbmNsIgVhqLRu5YLHrX3R3SF5fo7ueIZ0vReQJ5hridXpu/t+tCbmtun6+lJfIQoRlWgEF0lCjMsz+y++/wjc//YitR48AgnohXysuY4QePPIpDKzwAtvE/kj5/w3X+Pn8L/xRX+O8q3EXGtE7KMpRjHkE59g1Uo9zFUzkPG+XJlGQVQ9WT4cn4CjxM0vXxDIF5GT8apeyjrnR6XBPUQUfLTMBIT6b0m0wJpW/l6DsqTpMuJ2r2xF5F7PY0NR4ly9VG14HtlvXy/FnZ2MUIngHYwDO6jfxiYtnPr2ne9sl/ayiPPtIMcly8fDP7cyv4Q/viAjEOU+LzUJpZ/6oNC6JSJEx+yiuWxYq9le69sLaHiVrzgsOAnpB610NHdPSC//qLQDn8DU3v/fCnrmwqsZx3A0DNpADjApIFlhax1wE+brMYrbGWNcm5PkZ5aUBmUsRGNsELYbLOxwVW/+MaWROyv0H/dicAM2N5kZ+Jh8BlK4aqaHu7e2sMG6ojU21qzrmCQKpjBnecfK43d/Dsl4cMU2jxpDEXzYzGgVuxYuacYyq+NLA6KKytYAToTPmod/ViqjHIDFB/r3uod/TRAfCV4td/KD05cTuIHMCD/s72MUhZu1TrM5nUgiwqM2tCNJCiqNYqgFRCINghLsRUFMBuyiwlQNVWOHi3yeYX9xi2gXrzgYBW0eW+9suw5NnL+XewRU8PvwQu8yJdBnIG6xmC0wIshCQb5wpEuQ5yFctls0tQhGwyICXSYuTo4/xw9ffoXj8GL+c/olLMrVMMLTxwmLwmCecG6drwd0C87PnGE8rKfeS6RaSUu/LOvKSoiqnohlE8batalvYYLKfhc7fs+jqZF8Cau5bMkL14EgKOv7scFqhpl5FqeA58gLnr65ErE4slMMcWT1DdXOJ7vQ/3J2dYocgdZqv2bPZCccbGYXnlrah336BnU+PcNHdSgJu0hrNMmj8CcZsSSxAJX5PCUbF7kybJQwaWnVsljidGXYv80aedGFbt8k0hoC4vZTip1/kzqKBUOnFXrvQYnKcj2VTFrcraXqxEN7fex/HD/Zwsv8Rjh+eYH/6HnaSKSqMUKKkS39kGGYwbRYb2ctMDNLXpDPL1WCrJm3ApBcYfkt0w9A8OzOmQP+awfKHifcyllCF396QzZUUpdoc2x6xdTCBOqscFLs4OniIxUGNq/oGl3eX+OfsFE8vnuH85hK3ZDRztDFX61KpCTla5IVx0pm7igopEnSUHMgRQD7XBFBsz8gu8AjJBlZp9omJzcszFLF28OK/aXQdx6ZR4GNN3jTgvWHIKPfYynMlKviF2gR6TeP0d0ij1RhOg64+7xuuns87G2OYs1QlD+Rm+Sd27F7HhjiyNWwMS4ffRhFiejBAtgfA6UY3kmfVa1hvZErBL/XVOovd6zhnZuvnJmNAGfDecOTreK3HEW+/TyVt74oga5Uk+B8AAP//lF3raiRFFP6qqqdnMpPMJRuDewso7J/9IYqLoAiCT+ATLPgOgn99M3/6AiKorGxAREPYjdlkOjM91SXnVl0ziS4uDLts6PRlqs+pc853CR99/dl3Zffc4F9B+RUJXe6a0GadVDTFs1js+UKxYUnKUfDOqx1edcs33i5c1AoH4peu0xnmsaVycxgyj7OqegicxR8rvu1LLAU8TBGRCmDofUUV/RCYndo6bKJCLH0WysmNhvJVdCLMZOqZNpVnREMxya1UgRpacHW6uKzzlfS8QdV1LTF7VfknQR1aVKLHoJBRg0arlBmrvGtytXuzCTJ70Wtyt+dmRVe5iOjnfM3e78BOtzc0USfmuftq3dqsQtwHK6eSVMbhOtq/h5PFfczrCdsAVpkHrd1w/bvs6BswioLYZbzCr2enOFu+YmiwVHGdQJl1s+206wi9R4P/G4fRkpZ4dPqsuBwNjgOnSaLa6krufmyz1vuPJhEyKXj/5TG2Jk0B39Y8XxdbmW0yZaDLivlBHSWQnStkre9CnWSW4F2PdLGPNw5z6q+p/34cC47RZzLcYyjbgR9jXO0JdQPbUzgbFJdT/tzNpu662+D09e+4JCFAPZ493r2ovItq+b9MRJ2uGNqEr1ttYBmHVN0aVBfBhNHktdp2HBDNDVVtZxErz517snU6//Mczd83RC9VClOXl3Dy+TGqQFdAEzucE2fw8BBuf4rVeIjrUYWmrtBUHkuautQVdUCPgwAAIABJREFUUwXWpF8wCOzfHFk4zHFxycqiSdM6TSG9aAQwFpEgijFxQ6JqifffYHhxjfryDatO1ywjmPKmwNua6i9VizDdQPo+Tnl2lkgMr3z25ad4/u03ePfjZ0jVBCyb2QUV0+s3nwnb77u3KSvFGOdwBeAUwA+bc3x/8RI/Na/xl1tjXQe4Sr5vg3Oz+GTcbEcPjZmmCtyvrX4DuVHni0oLQRYQ0gIjdqV4j887KaeN3d7dQwQ6ez91bZ6oPU7xMkg3nGO0U2Ver9o8KcfHjNbZ0gS4i+4jE6YMHb9z+v8WGsEODS1z23eflT5LW/eWg5Jx4pEw2njM1h5P58d44veYX7zr4vh/Hd1szdGTvQbwEhE/XpzhxfoSzchvue1wU7iz/K1FZ7odU7ruNm3Dnr80plVMlQW6ChRfYXlbHtPf2+7NORYDy0gBvZkSuWZxJq8ni6XeqYryToPhLZSTHG1Z58Pn/MrnCYWtn8VTpc3Jnks1hLp+0tdlTq3aRWme4MK1i4q8lIYLN8qCiGLRuczD2/J/diuK6nKka7+fVMr3ZzFH3oP+Wsopmgg4RuHwKmpH8ur2erfBRlB16q3nRoWfuoQkLQgjNzMF31RVNaups9uAQmwHzueYHanx6zt9L6TMaQmFQPmVdMAGgRsorGHQRqwoRqnAF09jk+QLFhJGxNVyydBoag4fTA6wmM5YVJPOTU1dGmxYPkyWvzb0szUX7BS/VrHF3nCEe0f3MZ9M8eK3lyxmdpMiCbRLbi/2OxTBKmp4qP0pD4w6YLhYwNP0VPUIKJ+CY1FQe2LRBkhKMYD3aunpGSnA8YL+jwqteogNoXVGI9THR9hMxkjzBdbjCVbjCcJshpYEKKdj6kYgNZdo/jjFq59/waRpUce7YX6uiC+dNtVbYsWdHOCL51+herTAm9Qw5Jjb0izyLWoDXvfIpctGDtzFn64rqSUmfpnyBJQa7mbXzHtlpQHboIoGT8wVV0qlcdRp8DGgvXYbuanXNkSd8HBrj/lwhpPjx/jw/Q/w+dNP8OTwPTysjzF2Q0wwZJj/UEt8m+z7XrEBKP7tksEYHRfpPZmk2F/dGUnsCf8XStpl85Tyd9o77cUvW7WGJF+QEHRgbQfP9JKavbmGmIV9TEdTPHznAR4/eIT53gHrFiyXDdarG7TNSn63di2ioQGo4CRaCiGG6O6Ml+9lWJa0SRxU5JYox0HzdVk/MPXWiSaUiAhK7RbYirBjcW7JMQEm1jcohgLIqDgnqFilBZP2hRXsEgcK+h9PzVVjTYfGhmCWurXXmLA1ZcdaPchUYOXZG3KAtW2okcDuEuKIY3tr29PSsdzoUO0WaW7IwNDeBXO2yw1tbRbw+TX/c2xU3RrbY0k9obWHWonzMESdALgZQnV12+Ifyq5tt60iiq6Zc+z4EseEi1KKhIgq5QEkkFAfKvETvPMF/QQe+C9e+AYkQFSoiArSSrQkhMaJ7dg+M2hfZ+ykQjiKEinJxDNnLnvWXnstBgB8Ou2wAOQQXjGyEzQA6/GbEsSYEIxGAy9bpKYD4LY5d7Rt7VuWnjIHUBpFbb8XVGzQ6rXN5o8Gwez8goINdTDAAjQmCBWg/sBFMCI5dUjt9/QwZcsL89+vaO/QzSM52yF6LX6xNyzIurVngYQhMxZY2uWQKCF9RoPEFsKCUxoqQTn3VAk7+LhYG6b06C8FCaz/yQOxcuG3+nd7tWyrlLWEwJR2d56TAh5ygDcsxGh9uRMA0IwlLdx70/fw4dvv47AdcxEAbUg5xK3/4OyvUNphtVMkvLw8w4+nT7jWrT/oYz6/4qxWJ5A4Zz1DxeJg1JMU8PuS3Rcmii0qEUGUi0oR3DANBbP38+DQQCYVszSghoMnRaU5i1KVfdRMmFyVoAjg07pwRykXCKZ5VQEAZmtYZK9oHgsVs9BW6/lcBMZuC17FOwCAHmdBGrw1PMCkGWLUG2opTCgZyrBzQFX3kaC1p3SJfnb5HP8sX8N8GJ2u67oQbygr0MCYns1wMOSSDGhAboHkXVoeNZjCbgM92QvI35dob21sMRlP0Y6mWMyXeP3HKfZounSpnKUKAKRY+skHImFLFzNcvXyFnJYsbDMnlf0sWSqzdFNYVCzEOKtsoFjUG5aZwAffqAVk6FhMqk9A1eIG/dkCg79n6F1es3Z/E4Sm2mhgFVFKM2wEOq3z20SRDqL6yKhqyJToP3n0MR5/8zXuP/oCaA7UQ6CVYADFn15DJA9V3OUhisXmBTKeYo1vVy/w3dkzPLl8hcUe0VwTCyCKVZBaO3ZCO+bvNdPlnxowFDbK9nxo1GKU2mK1c3J80fXCoJROQANqd+d3NpeWap5QwBF3wDj4wR1dJFT2520AwMHQZPZ922DgrfcfW5+zPG9vCdv+BwCwA75nB8hC/WMJbM12KRbRV+iFiC4Re5uAcdfg5LAAAK1qA/jU/J8vu/xTL4i8+3O3wPdnL/A8zZlyvaa9LgiDQsD1RtdnAQCinccpV+MK7zd2LvPFDklcgSzrYuBpqnRC7mIA+NhDbPf8Gcbbv2/zwzLiuUtuj9eE2/PNHCIchNEV6iBdyn7mbj9mXX+eAFGrMpufNbsxVX1zj+pQ7KRCAUSisqGMYkqMIVKHZnFJDR4bBYqjlv1lLz80+eziOkFBIvnpi3hxw5lUszTmhI/GAQaOicmFedyXUiiznws6b22v31QlN8nnR3Cf8GAWmwGikj4YchkkAYXpeiF996mS1cYxsA5LR7FYFG/z3OjXtkE7HqMjVsD8Gs1yzf75Qm1Tn/Igei+LnPDXfIYrqjWOLab7E3HtYQs40V7g8ha6qPM5TD7dK1EyJ1EtYhWRrEGXsT8a4ejoHrNJfvntKW5YG1/2xU2F5sZgiRNly7ADFNAeTtHuHyC1Q+Reny/7LOhBOkQ01ppAo7XBiRwOdHU/YMC5RaC4mWKdJBaAHQEjKeBqucZmnTFfrHBxMZMV3l1iuLrA8M9TLH/6AenX37F3PsMwmWOO7QTbYF7rTwJY9IDzFvjy8VcYffQuztczhAG9JxK2zdpHS+JVNdw767F+sZuXgpxZNbyYqaBicFIzvWYGGSn+1zGRMFwUNNeLVtBLJpUqbFikU6D22LWY9Cb49PgTPDz5HA8ffIaTg2O8gwlGKuI3YBk/81yBC/gl/758dFyXL34/UDHdrOe7+QCFqpU3f6AytJQ27FOshgV+CQa2QteUnvIEGBVgogILzEo9qRMNxQk5YhTGmMR93J8e4cEHx6yLsU+Z8JsVVssV/7n0Tdrh+89GksHMB85aEBk0AYqs9tdVHBqDluIJ29eeB5+dZOu97mQtUbkzMW4p6VzppnEiT5Xyt/Xrgt/BDCQQdknw/bLei3lUomT2RVC7lEeLjW2UO67Otzqmt8QLATwGMJjuHe+hxPxkbY2SsLD/zbGCligzmKjnj+3J9f7M8b6eGdYHEaAVEJdtxHUFiVBmj+MoBoE1QWJnnI0hJ5aJ4bZa4V8AAAD//4xdTW8bRRh+Zma9GztOaAOirWiIkCKEUJHgirhxQdw58ws48vcQRy6oZy40BdQQVNrEceOP3Z1B79fMOKUIS1arprG93pl5P56Pd6cBgKq7YSwAK/bHSvvgtchxGuhz58EQVF/0mr4KsvbaVVjEWGvj+YsJioAKxcxVxavRgUa9eAtEtembfJFOaX+RRy5kxgA1C0KTZ6yHKlBz4epLshi1YKiLbLs+1gnyAk153roZFdr3Zmg03ZwmO486vU45vJmCn5CNDQ0hZuPDJuiMa5Fg8PXqDHtBrrXgMwdjRfeysaE6mtqIP1Toisxm7/WAkM1UDLd2URmjtOpxomaMslm5aLYEQLucjHxEGb/z4OgeTg7vcXcxpHKYlZBRISnVHzSyhA6YPy4v8MvFE2x8jw1TrQd1ZBVba4lLY67inCE2usBzihCLEZVTzb6tGW5WNGEH/Qd2daLQmaZBO3K+YonkQJ7dnKXIT3HX0Itp4iQFmU0Z8RYqrOhgc9cPKR821gwgzaV0suVeM/VQjcpEwlEMKmsHc3s0Su9MVpAm8XWgx52DQ55FS4gFJTq+JqO9oQHgqgOUNGe/L87x4tW1mNPQZ0oyfkdcYGKmhtaPnDxr8UXXaxQt8/AQrRPy2WJNGZbdaPDipB0yHozN0mgUJhWQtMenHfbaCVZ//o3rv66wHSVZydvDFwaKSEY8miSIjl/1WF6+wLBaUmsak02POTWWqElJk0hI+qL0Wa/Ii7nHNmZspGihUJxFpx+GAVMaLbXpMV2u0C2WaK8WaIY1O0Jz7pZSQf/V/K9OG/KEDDVf4/8XJTd854O7+Pb77/Dx118B7RwjU/12yIh83S6/fmktOC3yFkh4Ccd6/x+XT/HD89/w6/AKq8YhzGdwXeD53axvI8ZGHpvj83XzmjTXLkXGbxuu2hqib08ow2UcqSVwbNijFP7eCp9UtOBjhfzQfqd3nLKhUK/skJhhSxutY3TkEEQiZF1/09uZJACwRm0paADkoiajomoGOiqS9XqD4v83AOyscHqWy+dxxlkv35kVdrS3dV/QOiFH3y4GnB69i1PMMgMguOpU/3cw77VHvIX+D7w2gMfbS/x0fobreYN+r5H5zvrCHHtNAuGM3VYoq+ahkhOS+rzNbvaDIMvmeh93qY+GoMAMn6p+TG402L3RsX10vjcqKbECvqwzGeHlFVyITEeNhQFoTAEvI2OtgC0MpVv3t5pQwD9zyMma5TP2ORsnu1CkV6UQkhnTjc7Sj/lcTErfHJWGLnO8k8YLaZZ6p9NhYPIWzZ2Q1D9A/t0rxTRV7BzL+3Ihr8VEadg49R2ImfJK7ylIk+w1a5JZXBJkq7DZah23Nzmhk4biOIpGmLqUJL1jgKabsuEqSyL4/vRFmqb6FikidX8anZxGdYaEgdhFM6LSt4z2+tXADvmESIsPlDQfiaWVyLkcEVc3N1gtbvh1j96+i+lsj+MONUasWJAncavUbIwozOsRcSPG2E03Qbd/gPcevI/zZ8/x7OUFVlwYOtQtQm9Tk7QZy1PnyU+A4s3hIfz+HAPFEIpp1MAJHCnk9ybCcGKpKTTmeC9yKn7q/mSJQEBHZ+NmjWG9Zq8jim37GDDvb3CwuUI8O8Pi58eIT55if7nFwejRDKW5hbyfXY4h5hOyDWD5xRfffImTzx9hfCsgTRM3ZBybNY4yTcMZUyppw2lScgEHBT7Kpo5xV/rErBfNkRqeF7+RceVN4NhfM1wTN8c6zneiSlXo/lG+wzla79DGFpOhw0cPP8Snp5/gs+NHeLh3H3dY2d9iiglr/RuGTEIGAEpBXro5KZ+Y5Zn0LN+ZNlA9/wvf12/gjT+R/MV8PiwvKIaZ+S5Vh390lk+o7aDG1Ki5Ie3J1tHcAnHuOpzMcHx0HyfHJ5iFKVbXNzzvn+Ma1Sa0Zr2cOewBMpi7PrROk3qBmgQ2cYveZ6ugLxX7s26GSHtz9JimFrMww17qEHqPcROxXfcsBQiNZS2R2U3ByRQQW0t8frnEZsLGjgxVDm7xw85a2jc8PjUzRuRcE586oc0b2CYAhbAcbD3ymkqCqAtT21gPKr1iZlRpGPA9qbxnrJYsOb+szyyFpHO1ii91w9oYycyaZcM/qQUIsK+Bya6VtU5/J88BrnnpvKGGWdviHwAAAP//ZF3LbhxVED333u6ZnvE4tkOiJMIiKGyACATCiyQSfACw4BtYs+IDEL/ENyCWCISyCSIClKC87CQYe97dF9WpqtszSSRr5HjGnulHPc6pOicdfX37ewo4ZUVpol1U0myJA4DviDFxWqPc0VrE2G4PDNlFbXT3G3bwgwVk7iwnb+47O2ngSex8Z5bJoEfSa09U2XUAunKgYtRm1K3Z+qSUSzL0wjtaUR6MmSOa3KrYU5t9bDUXhp8BJapLQbeBMCH3J9CTaLBASyYwKGhB9wIKgsnuVMRyrlZyuicbehQ+o3hfVuYHKhYN3jDq33Q/+qCWHFEmH9QeTt6fFs1h6ytYEpHXpQ2rDPlMzqzK83xFwB0EYKDClvWE29V5cA06vu7AZmXj9CwwJEkpNUj7pGv7l3A4uYzdNCTyynWCGAy99ApXm3lnnhPR7RZzLHH/+C88OjvBrFuwKNyZTNRftNMxZv5t+WwCkGQFJLIVWARa6tQ3fHbTuUCgN2ZhIzjAxnLa0gyoh3509ok+9XXZ8eZ5s5vbr3kmpqgijTBfb78O9X4yviWrtZY4MPh9Jc+h5oM5KchxltEqdBvleOdbZLkH4DpF1qN5VAcL8fw7yXhe+/ySxByZFOZo3DQYjYYYpwFSF7CJOQd7jzom6deWZrNsarNi4fT0xTHmEvhlzy7qiFmy9R1vBJMzQS5o6SOElYhZTlWvIwWbrNDdLmdsHQDRSRsYElyhXbWMDZJMWCBbTJqv5xhNGu7/7tRjnDw9wfLfM6rZO8RBDYAuUPyntMghczpiKD7kyzXS8XN0Dx4iPX6C0YtTNKczNMuW9oK7QccAB13kbqqsuDRQsZ5YrqnIApZjzAJGSvFxvsDu+Ryjk1Pkx08wXE1RU9S0I0iGjZ3AsDEJ0HLEVVcNumB7kxq2yCztXQO++e5bHH3xJdLkMtYYEoOpzROXjUjcUPF1QMhthDrgLACPEfAblvjhxR/46eUjPMIc3c4ACwHlYuZIYF53RmqIIKf6+NaDygYfOh8GYQ6xIZzCrMKmg+T1K7GqStlYAxVqyKYsJYDSig4BTQFz5XqSJKaCNq0K3fjKjDFLascaLWEntYovBVhQP+eozD9jI7HTZLFSnW4kpmrcRPmcdarKvczrzhrZQWWCljEU9sWZGHjznw2ICxslna0tbSZ3PjpTYHEnWJOoq1VmHRkUvdpu0vVEjusGg/MV3p9cwT5U32JL99HHuMN2qervxH9nW3625v9NkfEEAT8+f4D77RT/iap3NPYrb+gXFIE6bzxDYYZ8lQemR8NYmQbW+Kk9K3eNKYQ34COlLhl+ctETquyYa/1goIzkHy+IOTGlDW6qFbQV0JU2rKINkbX41QJOz3VwsiK6sFRH9imV2kEdYqpgo7QxlbUyP6j95EAsxIU8rzJiw22rKnNR4M5pNK9+Y+pZnLYOJlmK3JxCsSmdsgYRclkPiVbY1wYoKyun4/Re0zEOF/Avsynrr1dloSsjNIIJHau4VG837CCY1AUSoSrTZ6E4bVmb0ftHbkC121RnKGnsScTweNT8uecUcUQRyz0ZTRYgVUZ/F9JkDxKbXZnIEp0DiT8ymt/Olpp3VXVVwXyGcbNulvtadEQkf9cjVIMdBOl7Z1OsF+eoDMCXO6nNMnq/LpZ0p4s5/v7nAXeZ9/cuYLw7YVxYnM95rUYCyoG78xRqX1LqiNfYdHZO8GH3wh6GB1dwePUq7v1+j1o5M0K9tQoJyrHqPKu6SFwmwJpWSlDVB5eAZszPIXa30Vj/WkQMY+aspNQ5En/lUUANAl72/enZKZpmiMlOQ32OSZ2wN0gYtS0myzNcnD7D4OGfmP38K85/uYvx8UvsLkVvITMfyVdVwGjDGOT82RUUTSdmMQTufPUZPvj8FqbjFstmpXZ1WJlGktaIxHOtruC0Y6uWmrHkpJ5UoVNHaV31XzOsqXqvxKSRLAaoeT2+5BpFx7p8teqoC7WQvsHqf4I0yzUOhvv4+K2PcOudI3xy/UO8PTrEHsYYk+2PCsY4sGRs/6tTCl7L9FN1cWsVABsxFh7Jc3/GPY+//tW9IstsPdNr+K3G2M7WP+CPNvLlVr5s/LcEl+03ZVthoHhqNDCuB+flPIvewcV4ETfeuIHDK28irjucPH/G2Cl9VLReQodQzL2M7iTRSFJtlAnsxmRTLlLbDkm+cBFhnXD94BCf3ryDW+8e4c57t3Hz+k1c3T+kjbj0UrKiIwADWW8BECgsarMz7AkrEhwLAcTkvQXNxZsoiwMCna07C/CgPYvEbe3BGL0FpLCcIY+F9PTm3x2DDGBxa3YnkiXmaU3aEwNuX1j6C9bKCk7pRK8SEyXnm52q9y/y/EJcWh3tk1c+hdAMFazsE3s/oS+9pb9W+rm2bfE/AAAA//+EXUtvW0UU/mbm2rEdx8F50DZthQQLWCDUIsSi6gYJFvADumKFhMQ/YMs/Q6zJhgWsKFKJQppUeSd++w46r5m5bhCWrCpNXd9753HOnPM9wqffPfspVUZWVGJLuINdsF1MWgQx34xLNoJlUpOr8SUaANaxLP4/57JYlHXCW+rlbtzoksdtlWavsLSSwxcSB7ncPmJSfbaHuVTISoLAqVpiML6I064uBaKq4PBZRcbnijwPnuoZROX+Rw2itpRXveIbHSNFPUSFTYqOQitxwmOyUsywxczPa9rdla8mPSLkZEK5hfUyd5LLjpfX7jEFf6vUSve6El6JdblTB8FLx4Y2jaqNh8P7eDy4hw47Czi11LGOY9n590mx1HHKucD58hp/HPyJk5tzVgQmDpD4Xi6S/oQlOtIxCgmBYagQttZbsQCUDo5L7gjBeJAFTMgSLKdQd+YlqT1fLDp9kvhIByf4kA6qGeli3aOgxZc6wZudqp2GwrbPaaHNrtd0LNj7VKuEzjXhRI319BbCxmBEdYL/8596uKHCGNl0Djo99EOPeWI5iBgXPTQjjnUTmQfmcDUb4ejsDcaUAbVcwRnVQOkzj/2uF60/oRgp79t42XBqu2jFMO0eRZd0AthiUFE23OkOkoyT2rCrIgv8DTa2+JrOXh+xHZCJGqa7q13DHstrcWWNoPqLJbokzHI7wvjkDNcnx6hvRnA3E4TxDO7yFuFmjPZkgfVFRHs6R5jOUJGwGM0Z4rGSmBYd/OdzbEwX6N+M0Lm8RvviGq3xCBVmqNwyVfHtsIZ0PfKiFIme91JPcbWXAirF9FYP+P7HH/Dlixeodt/DgqUAKx5fH30aNzsIF6wQGUfi4DngDMA+Rvjl9gC/nh/hTQuYUrw2eK6tjxVkiI0NFayyUn/er2XOB0VKVQVqRefZHQdh289Mb6JW2hMXlirZZ1O3p4hHsm70QEfFoKmI7lTKry6/g4u7df5ei3Ut9dk1bmleZ8LdYwHPIF2BiSoeN1FUaUNXK90qi3amjs3diAgUe7Nz5qiS9Qhs3MrEszZdhCiQxPbS4fFgGzucWoG7lMmMyua/K5PSZpJaFgZq1o8OGMPjEBE/n77Cy8UlbkKE77ZTUpniiQFBvBRoM1/Skled14p242KLUgHtt4ai8745PzI9MCf/DLs0jr8+QtENkn3UnFpi4TpAcSOJ4FFxSRsIUtQPiTLGRYbYRCh0lJZnSCzp6muyRh12hdQ616RG2st+l7SMVFfGxPJKeKnFX1egA97eR3Nsj04jqaEBCohs+v7ielzSc8k6F0Z7ickiUWig0s1vJf2MtGaSJaFRMYsxItGr6SzRKZ2iFyzvYP0Ci3cKh6cM3orq9JmpOh9Q95ryqNH1mMX43Fz0AFxBKRRINBLqhKhM1Nmvqfngydmgi36vL+gUQkBSrOGmtIG4a4bW1+xXL0Wvv49PcHh0gHt7e9h8Z8gT27p69FlSvHNUAFjIHCSBaZpTk+mYhc563U1sbu2yw8PLv17hggoNMNHFrAGVx1d+IkHiKQkfDoZwvS6qtS43OpbOJy9574Q+QW/eWzWfYdoPxZ5YY6ffwaACeuSusFhggyzVLq+wPDlGPPoHZ7//htf7+/CHp9ieR/RmNVPmoGKSwfjklqVR4YeEBlFjTIfpAEw7wFfffoOnXz/HeMNh3o+oO2B702DXpm/F8vP9Vor8irIZK8K3SjQYPiit0HbouUqDSru4MWtmcG4XxWaOkTIzOXDS8M6nUgBws4he1cEHu4/x7OPP8eTBJ3jUe8Ad/5ZK5rW5sKM71X+opq4WAopTwd3/vhhfh6yrxDvjnR9x+dmkn/M7FRBkpNLfR9UaSNHB1Sq8/f9Yg9Vv8szMkQZJiC0+IK+317G9s4XNwQauTi8wmcyYFkxWfxRrye1B9hVtyNa1WhvrGqvlfknodK3qoh5HDFsDfPbhE3zx9Dk+2nwf99fexXY1xLCzhUdbe9jbe8iFPqJ0ElWU5iHRRpcWaExfyPv0DOxOfEGfhMWdwo6V5ocho+m8RjHCqGaUW5L4c96rTQsgj7fFfo7bnFtL0SPFt4XYDvL8VL/+lBtzsVgacnbWtLmV9+lMLbfmZMOyUDUISuS+0JvF75+fR+HQIAg1ObNUocK/AAAA//+UXdtrHFUc/s7Mmd3ZpCFNsrZUsTU0BC/FBxFEKIjga/Gpr774Jwr2PxCfRKFUa1stSVOQXEyym2x2rvK7zZyZTS8eaB8CO3t2zuV3+37f5xEE72Eg3ndQmoMZBJydnY1uEBUGKVbhls9cDmmxCjUCkqDaSAXVoNcNCWDSma9UPuU3mJ566AiGI9YgngxRXwceMKSCb743DnTj+5JrPJ+yJX9yKgdn2RhJVjg2pFzNHSzKS5mjIlAUqVCYo9t5zzoEUuOVObNcWJPLgv/+mi0EicHwqntvz4ZKdiS+1XHm4LU0HXoxOpWztglZi0hlKeK+Lv0bRlGrXJGPleG6PTB0OIfpUNleSXuzbvQzLfiXaiHtiappz2jfXUhoVDXhlVVTDFpqDh29g1LhPIKWiDvvkJEGPSkrmq/tE+OekAuAkgqV9uzlDY9AHxrEz2mc0ahz2KNLzqULuCri4BnNnAJODU4+le2eoHedFQXmqtvtozbjHSOIDHojNFiEqBgNh/C1Z0KmrBSYkXFHlH2Zgt5gdQVVFaEMatxzmL32NFIwS8HGME2UmTVHOhA9fl5/V2nCQCqGDLslAelxgpt3P8FkeorffvgJ41Kq9m1oLVXGkJmYHXurvpGsQUXyPiVGeYXjJ08xH+6yQke6uoYoXWaoZrqyjCKmCqxH4R1cQv2oxLQsuvhpnmP5Yo76+ATVwSHc2RmGrrTSC6DEAAAgAElEQVRvb4Mz1xoTSq7m6gbkjc5vyUbdtP+vkPP17df45v53iK5tUeqC8/besAPBGkZa2c2DVgiqkGdc+Qd+wQQPDv/Ew+kRXk5P4ZaX4Eae1R1iJXRd2AvG4F60hH3W48d7N/YNKSiMjFNJw9JRiotsdskzhc+Ee5Z7hG8MtWdW4EKTci3s3rhZbH/XmpgLe6bD8xMbmZqeV5OB5XNfqrya8nGEvB7hELZdaQHg3zO76Jxl6fUTUle+Fxbyc4tntj9adMCr722n8minVYbdosLPkz2sr9zmBIAIU7WOvO2FvuQqAucv0b1CXZ8zOJwAeDLbx9+TA5wNncA/qQqe56+dV38Yj4+xdRMCyBiYc4U/xnp3VFWbMDD0H0vhaTLH2qJCWUDmCFCWaiERjpGTTxAJKqk0uV3Bo3PFdJCm/J1kX0hdJ9PEMf09YeesaPwKQqYRimRAiKkkYu4FkXUSDoRI/RFLoBRV98x49SPMyaQ5ZblJJQs7dH9dyjfsj/8zyt58YoQJAUvWdX03pxJcjlsRisZ+RQX5WMOmOiXM2G2vLPt9iZfiQdA+CZ0HSa5dtnNM7pjeBbX0sGRgLdDvlfEat3MRk312Phc5Vf1cX7FGUFVyp1L/+9kISK6tYuQ2+W7JdneA/X/gCInCiVLPwUNe0zpLyHRB//6d4ODBj7h39ytsb1znAHh+PEE1LxGXc3gmExRoMEnvnZ9MsRQ7HDx/gdX1W0hW1vDp1jY+fLSJveePcYFCWw9slt0kAKk95aiQTSco9naQpgm3IcSjK5KcYlI3+r9A5XOVsTNCQe3ZJz+xzLFGtuL8FFFWYFA5TPaPcPTXDg529pCfTeHrAhu07/herpp3aAp5lTO5P03gOUHzEMkiXRLTAXDv+/u4+cUdHKVEEAvmO2BbofwUnbV1ggpm/8Iqo5A+pUY1Q4N/gftHHf818cLv5GLxzamlITLeHQjcy1eiVkFeDasFZTUnwtNohOvjMT7bvoMPVm9gHStMgEfKKQlbzQEjFqLAx3n7m63dc81vXWD4jzixg54PFe7byvU/8TYjar/ZWpg7k391G8FrR902hZJ/pWUWjP0Yo/dGWB9u4NenD/H7i2eYlRkLDVERqYq03aOktqUCduNQcYkSqOQr8InJKty6+j6+/OhzfPzuNnMtLLH/wuUfjJgZKcfV5AbGt1ew9c4mHu3+gccvn+Fwdoh6IFwhtUPLMUAJxBqNhZNES3WpnbWEOu0zthvK0k9tumSvGW3IbeaKFg6LE8FetSQBDbJlhODhFnmV6rZYroi0fSzwcSkBwHKAan/Cir8F9FIoVPSYkutbDEZqNE0bo/o+JmsvCe5IJF015qXBgT8VYpzDf6xdy24cRRQ9Xf2YJzbjGcuAFFlBIEGMFAlFCNiyYssWkRV/yBaxQiyJUER2jkIIwSDL47E97+5qdF/d1TPjKEKpjRXF6cxUVVfde+655yThlzJUPAQADE0O+xRCCoNTiq8pD5oHff1cmZhEvcfZ+qAsqr8rgUafsNmfIQAmTNROJsFV1VFTWOcXy8lP8+6tQAHbfEq1r/r4VZxtExkrWOQlrydNtQbCSoL9LNUyq7rUCl8dWBbg5FrBTDTIMdszqbLHaLXiSkDJgBN7nlA5mog9AqVqr4qTJv62K7EvGz189VraxiIaTvh8S/6NWUHUO6iwllhXxBwEyObORAk/dBHQCzeuEl9Nul/vJOMWAbr8pos5zscXqgwsYo68DpVvfyxrzeCE9B5FUX3kMl0zEbpYnRDUa2fen40KemN97T1QUCipvUCN4h1qQtQtBKnqK5glklNUsahELnm9SmESEKnbxJn4+dy/Y96qXlkF2najPZ3ANjC0cy69BBkG3jEoZ6KDui5Loj2qDVMm5Tf91/WeedUge77UqV0U1EYxYaRtE1vbOVK1STQVVAPQeA/mECqwgiVQEIQpYEopJypkqT7JnBiUOQcFnW4Xk/kUvb0M3XQfn3z1BVazNU5/fMSWS+z7S6GUBkzS8qDzpr17ztqaKLijoH02wT61wMxWbE2ZLBZYFg4FWSHSedPJkPU6KLMEjuzxyKqI9hD1hK49IkqWxpfIJxco/Zp9phFc1hJ4KIpPn6lBV3OVD6/9Ln3eD+7fwTcPv0P/6BgebZTemFwmKrN73r0CAbMIuNTk/6fxKZ7MLzDpEsuiL8EfOR9QJSpgp4SD3v9U95dpnSSB1zlXaIPfN4R8vcPeze6gQs8aosfxmhZ5ZV9qOioM1iWBer/R6wIfXBqUlNvZKud1OAeeKYCl7q9I/YWN8kwzRFRkpo6rvzKCO8oApySWM5GT/0D/xtaORauC73ubHsJtf67mx9daCpVAbSgiF4FdKSaJx2/Tf7BPtF834qaWAcCWmO4WUC+y2DEKwShwOEwyYX/B4/HlGVtA5pTQJXSfzVXcUr+r2qPpYqIO/XQ9vLRS2J1kVWI7R9kJaLFE2m7rI5pnXWTVHqc2W04YWrFrJgmF9qMKm0ja88xWlCrJZK/HHtcUi3gRbysUsHfKUmE1dg7sVN+Df7/uV7ZiA8cnCnpR4rb5jmyKQrYomV2rJSvtq+BuEebha16U/3NsAcSBtzg2ACkBwGsv8Ol0VqlmJ8qWCOc91BuyZ4X0WBNDtjYwMxDeNSKN3xhIJKCF3sMsQWewB0cxlYqzYraUtiIl86T6uDx8hcgtIC5BWv1nqzlGB30McMz/99VkzElZxveAF9VujkMSZg5MiyUDAsvZCj/88jO+/uxz3D04gEuJjVWwbWtLafIEmpEYbUHVyvEVyiLF+dM/8G6vj9Fb+/j05AS/n73AfHGBGaKttKxEzXjivbOa4+b5KeK2Q6ebYZ+AB0qqKL7ybKiGhF+VnO+wWO+yiFskckT5CpOz5zh/+SfGf/8LT+0L12tuA+gVqHRTSBOhrXs1DhLQ8N22E53a/q5zYNkD4lGGb79/iIOPj3HT9bimeeyn8s5p2w+f88F5mKbNIlhj77moEmeOlI0b7o46yfH6bpZI260q9k0KeS+pZ5xo5u04w3QyRxpnGLYHOD68gwcf3sdRNkQfCbqs5q9VUi6CFLWr2RscdanBbyX4rx6bMO32MIaf6QE13qaydvx5E0OYC5RUF5ysvz+6i8FwiL3hAL8+e4LJ6kb2CGtirKSlKLC9pPW6uZqy60InbmPUGuLLjx7g5L176q6QoIcux3Cll/M0L4WFdhS9zayDw3uHODp4B4+ePsbLyQv4Yqk6OFbUcVV7slPgYvM+re16RbeKcgXyxKdYxuJQKwpYTseK+aQBFpzPvP8yda/jWocUFMKiq7mz2f61wQKJrLeiObbGNpsxigGv4TNpiDWiaOVU+aAKi8vZKnkHTUamDgg0F/a5OZ+NHP4DAAD//4xdy44UVRj+6lRVV1+YyVxEhIwxIwSJEzaCRuLOhSuXPoJP4MZXc8PGjRKMwehGSUgIICQ6wAzjdN3OKfPfTp3uiUJvGKYr01XVp85/+y6FTTcHtd3Jk+TNCmz6nXkLmhWBQREGpPD98UFNJzacILUtzi0WXEhCg4slLim3zLwezQvczgNR3X5Y+d3o82wdklKFWjyLj1TM4x9vnPjAq1AFca5nkhiYenueTGWpWcHTZpxdROzduKzlejUpc1HR3aznPPuksxiN3vC4uYchbjZ9UgDZcXYfs5AoVKv4ID1UC/aTD8wNS89NbCcQJ+8yXfHRDjAuQBVaalWQrtcF3tTtincwndsQtRHKZEo9MI+tZNV3ab5kqqrNhZmTYx2rkOYrMF3og8nfqUEs9a0SE5ygxd+vjtAGmaYPuVOBF4IfSiEdk3CFgkfNdPu7KbReP9dUiNMGjTVyrPgkwRhT3fc6Tc7OJKI2lfLiNxqy2NAZVPht/D4MIutiY0WelzxSJlam/+YBqpsDrTPxyJcJgzUIoJtIpxBkowukiAE6+WpSxoYdq4S6CSpaE8tWvO3Josh30b3Wa9IeAUhrENIsCWD008SVWMzm6I5asUAiO79M4Jf9EEZ7PuItqk9sp8FbdBj6qJRPfGpL3LnAp/ZIKzq99C/rA7B4VUCVqzctvy9z9L6R55EEDenn+ayCzxoU0wqbVy/gk6++QJ5P8Pv3P2M4brBAgWboOAUole4QUUVBYbjKxcsjL1osjBi8GJbIhoKFqSSRAtojg9k7hmtSwHcaCGktT+m61UGg9ra+Rm7+xHlEkWqdCLghV44uuDlGWjjzAOxfvYSvv/kW+zc+BapNBjCauvUZ8qQbNZwDe58XXNg9BnAHf+H20/t4jAaHoUYXSlaRZj5q1/De0Ghxna0VKDwx92Ldw+urGLvlRg9KAxdReSTeBIYPmu8+qwX7kAhCSkfeJq+m2eHNZ5eFd0JsNgQVT5wkPv70fr+s44Q4LbwtoKY0KrMNlOlxAvsPWUxIuUgrxhhpCJzMperAg074hnhu6fHMK7dnS10MaMKZNuP/D6UF238H0cSwfYfgy33Woa9KPAo1bj+7j+HtBijewwe0truATX7W9FyGIW68sVHuVdo7U7tJOByix93mKX44fITlPEdHEGCirawISoAFQJ3yGJGNE/mYC1CSU422eAaHbFV4j/aOUOQKhZdBQhxFaiyzvdLaSizGq0VFwXmK+jLrnkc2UPJZHV8NNS1o6u+U558p72ZQdCInYPr1yprz/FnFTNdVRM54LgJpbVh949iJo9C17PnWFmsFDymy0zH2FOUqOimCgZKYWtM94D/r4/han3q7QmJtoWiC172MZ7qs63gPLX9hOmYQ/RrecwtpyBG0Ozo1JPSpdfi/qOa3HK+RIu2UKkfDhPqfVQSQNN/8eC4DV6poaRbYA4t5iUWxzRd+RCuU3j9tuGBfVFN0p/X4jGRp+dTDFw7FxhQnjUfYmeJ8tY/w4gVePfkT09OAKnTK+x6bYBNH6Dbh8j47WeK7Oz/is4MDXHvrIjZ2tlHT9197FpIMdcu0AhZB9gO6l0c4fvgYWzu7mF3bx8HlK7j+2684fvicfcxfDq00mJLrZ3vhvuVYM3eMecfw5AGvv2J5AldOJaeoO/i+xmmo2Xe9WS4R6g4nz1+gXzbcSGPSZSZTUJqKlkGFcFsvzjEyOoMtM7pfTbKg2D8mE+taJ0Z+8ASImwOXb32Ij7/8HJt753FcdnhVemSzHKeBdC3EloYFcUlEMEsHLOtr0hyOIE3WPIu5jjxnq7kRawCxrsQEHVkA+hFVNnQeW+c2pHHVBfi6Z5O7d3f3cOPKdby/s4ddbLGDf8FqP9L0gWkwWRzJzjZn3uTl1rrtIWYQ9n85JqjGEtJ9dxA3n7AmGuvWxiil3h+vIrW2D674cRmdRp0CXiND+2bXZi4fpDzvCo5XpPvUhRobGwvM5xVq16BBqwNez7lN1/aYVgvO/0i7jCiXRetwafsibl27iZvvfIQZmxHm0ryimD6UausLtnQeWIjRMaVymlXYvbiFve0LuPvHT/jlwT1gkeGUbJQXc3GJo8EfU7s6FFUR75Ggm8pY3DPhmGoVpmAR9Uu5/SYwHB1YVEBdtbyYtqUUchuG2pTf6mRGg1EeSjkN6QwouooGEnQMh17SoKI9iWORDmB1X+VzYv0BQRRa3DNkOq8n1iYSjQKKjda8ppg4IuAU5UAN057sGqWhwIhE7/EvAAAA//+cXc9v3EQU/sae3U1S0jZL26CqEIREaUIQ4oIoEgKJIxJnhPg3OYDUK4cKVT3AgYAEAdTQFmhIN7sbrz1G79f4ebeFgk/RbhKP7fHMe9/7vu/xmS0pYjdDrRBbS4HspqmJ83LgVFWSmNHfUgDF7Q96AVKZwYVlGkZQbWehmbP9bKYyrfb2r1X33TRdAr3sLm5VBTKisYNBCu0vbedd1F0bPHOlNGo1BShEabYERVyiyzwpcmWn6KpAvGCYjtSNqXCB4YJNB4UFMJtNc9WTOyvEMlc96XzsFh+afE0eEfbjXmjlH0uAy0DbVrCbpDnTayUaSnM1HW6M8lJSYGh6+uAkIK1zq8wVapVW5GdYBDVVkg2fDI7IZJFeIHL3jHh2CUBirI/95FG1NZpCA6iBILRMr6n7y1laQsZW5gQ6emJd95E4Sfo751LubqG/s2h1nmhAa5TgxlfyQudI7f+vP7//zt4FezmllV2x8ntQJgAcIABncGku4EHbWEIDXjK68Qi7Z+vAvAiUxkkLAY19TsFVIhlAjbUgKW5wLZ3+7aAggWhdDEIEoXmxHEQDCwKNTKMMrQBTT3oLFoW903Vd8PeB2TS1mIHmOZ7MPdgqiQ0nySGps/8yzWs0QHXWiCnTzkV8+NlH2Loyxlef38KfD6a4EMGAGVHhh5rom+lXkS3Rup065A1WPWiod7+xdNypLaCog7iHE7lwQFVtNU6yWZTxGm3XViXtDW4ft0Lflt4mSnela43Ax59+gjff/wB4fpuaXosgs+ikLZ7XbVfCQc8gMrX1PoC7mOD26UN8Vz/GdD1inorcfWHxhIr/8lEwyynp/jHoPUdhx6Bndlc7D5YMMhIlHB1w1uq62apxpo1DmD517/3l/YakRkXXmhSOZtcg9D7388vukf/O9jdxjW4luUtNBuI8jTl50G5lbytc6Kf3/wkURN/GCPoe8zn0/feBnXh5dOBBrvy3nakqrbvM6kHAUdvg1s8HOLs0Qzh/A6+QkRolFhzQNdqlwwJhm7gCdBHsQvWce0i4Uz3EFz98g6OwQCINNQHaSds4ZfB+db1gUDSU/My4kDCMzOwi1kXulqPrOe27jbI0KEkeDoOuuatAbnAayegAfQJDhT3QjYk6ynhWworxYih67RHFaVoOlidFc9EWbb+ti0kr56zIDt0zzteuGJyPN/SkvfNHbQfoK3XPwpx62lG7Cqr88M+yP6u6smmVGv35zhUDlVgZQ0Piu6iSuJiBf4kT+tIBK+hAaacGirXq5k5xh48lVsZG66bKHemgNm+P5xXWCYi4+BxGxMCqRcdEdGLzyFmdiyk/w5rmzRpwSobLZcDma69ypX9y+CPa2QQbItzQAUAri9L2jcDXo9MZvrz9NU5297F/7Roub1/C8HSOxaO/2CthjfYlroA2bJC2ODnGyb3fELfHGJ87h3f39nBw+D1+T2eaHj79oOun2Tz/Y4pfJndQbGxiXktMhkXFOuqS5Gba7o73GZJWJREHN9Y2NiB7gISle9N5zLi71WWlAtbEgu9IFYGr+y/hrbf3sHPzDRRXNnFMopiYUAwDMzRCIjBTW+7R+o1VGa4/VhgpS3JVNh138k2aYxtatKMYhkCAwWiI+WTKshxiahAAQgv3hfUxdl/ex96L1/HCaAvnuW5NiabEvx3W0ZdZ/k/CfE7qvStFpSaqjduMtbmsRrsa8YbOw8QDCRSbUZHFAItZnssWk1j3ppRbSZbOfyq5PeS/+ADkawoOZFQGlxj0zjCZP8L90yMcPvgJJ9NjpJI6ncxRDkuEFNn8fDgQVmJFpp0kxZgX2Noc473X38GNy9exTpX/NvL+IzKWmH2J/N1Qz0zxI8AIO2tXsbZ7k9eqb3894KLGopCE/6w+41afBDC2WfymlX8Xv0sXGXnaXGg0wF49ZSTW7ud05GliMTZX4ckQlP1fRG5GuZv9LwFhAsrRKAOsXGhlI3dq8z5AXXXjMaauFYMl3uiehRU+LP6Q/FXyIstfQxA5A70L9Bndf2I4mLRdxk3vZ4NYRvwNAAD//5xdS28cRRD+enpm1+vFbCJjxyvHARFhCSJAkBwQIAQH/gAIceHMv+PCFRGJC5yRUESQwSEEcIiE48c+Zmd6BlV1VU/PrB8KLVlRlGh31tuv+up7pEp51IsPfWgt/o1ov+jvPpbLtGQAtRgmKWW3KJYnWE86NdoBZvZAVYmZmxwGrjmk/MPVAQnphcLUSqydIPxVd+Mog+4+TdXExoX30ddnIKNYePqTIESMqthqyaCvO1S7qppQdoZEk7+fVMv0zulk6qkhie/e0yGqiDikKxIul2dQQ7vZxYSFOemSxXIJPfhUY8nFsuj1EnEsPmt487oqTHyrjqqaVR9fTj1s1XqVRFy1W8/N0YWWP+f59m/Lw8dNlYyPUjHLjt2d7NnuqCUnE7IgnnX4rny0yDVnWuiKRlgVqdD3z3r/7ncWzzcr2iKWljhfeDMqLOaFpC+6qNvnRBYSwhNjFoJQW5XBo9GT8bPV+hxikBKfbtxBp7g1As7oxzikF15Jlgf9/yG7d1vWBeohqN0X+rwlGl22Pjut5yQYtyRB811F654SESpJsjcqg0gagIrmtO31QzZqnbQLvVrMYUirWxUzBgNwLcWdT9/DlRfX8d1X3+Do3p8YkNQgAeZVhaE/ggJs5VQHaYK8Lny20GGK1oT+9gJ7kjSYxsfsuKhj19AC268ZtJdB1egPcydHIV0Ie8MMn335OT784hOY9U0UTJ7LJOUkEeOfKhgYRTAGDzqKfkOJH/AYdw8f4+fZEQ7KnGm1qRZA5KJbLkIhet7gs0JYWyG5JBpVZ32w8Sqj0WWIcmIdvSSUMBgjtGNKAYiL97Ni9kivN5vO2GuBneVlT1QKsbnEg6S1ognZlzgyna+psMD4IkSsCGZBSBF+hr+Fghd8wYtu1XyF5kKv5rMKChJYP1MSSYQxMf9eHDeTwNuvm73QqCu0CRckZkAYD1jQhCU5wN7pU5xMJtgfPcHHN27hNtYxhmEpy8B6TXwVzUvORZbi/1fM8L17gq/3fsReNUd5dYQTuvT0E445o0466bjjta2gMWTNLySfnj4nXX6oc2L7fo5RJ7yfeOC7FJ8c+n4Hw1W+tBC9txaTL91XG4qwZw2pF023044AVqeB1ViasgWI1nKexXu4gvy2p872TTHoWpunpPjANaZ4UfdUu2W24/vjivgcNry7AW1NcBW+X/gUpRoXl4qxu3ckDblsGIluriVNJj3HNLCJXdYYXMnhDsaXSYgWpv3eCU07fObAfvSgmIJhrq4vKQ/9JZvvgNSdpqYGNaVIdtbvYWQtJi7BtKBNY+YbONZgUcpuSY1oeQzV3yYCtiwS4HQ1gR1vImVjiBzHD/bZOC/jWECdJ55S7M3wWHWPU1h8e/8e/jo9wjs7L+Hm2gg9yu2nruB07htRizmKfMZFT/b3AVa2xxi9touXt7dxY2uM/YMHvMZM5Oxeh/1e3lkIOtS9t6R0KKdYYb+lyjvrM5JcS0KI7zB6L5AmupklqmjMQnUaMahcta3lvHeAnHU036nvQEVN32Dz5g5u3XkVO2/tYuXaGurnU0xsgZLMdlm/XyI/mvBBSuA0JRCkBAhzYlTNMr2wOhTABZYYLlXHSJX2ArqvczZ8AHgoItZ59iglVOULjolzs4LPDALkr2+N8fbubeyOdvECrpKVM9PMqcOeSPJDA7pp6Qw0rYv/N3oM9TvkKDBntwcyk5zzT14u+F47mU9xeHKMSX6CyfwEeTH3HijSAAzvT7n82YDZtGx8bMESYioc+c9sgNHgClYzMnIecnpBTyDiVJJjrNj4QTvezwICGM9U5DPIWU7QYGGXzfE0/wcPjx/hl38f4vfDR8irKQyty8wwa5DmJ0msTJnBeWIMsnqA6xtb+OjNd/H6xit4jv0XMvZZSsTHgu8Rxqc0saQHqex/Tr6bmtmaawTlZBv44I33ka4M8NMf93HsJgwIsfuDdSz74aabSOeqSAZsI486joWXs4fvEIaYJZ5O38phkOKc9z65qxIA0B16D1IDYPpeycuE2eRslpx75iRLCBrGexx3T/sqnXU9SlcKy6bdePB+M76W4GZJ5hnd7QaFT2mi59Dam/+NfgepxX8AAAD//4RdTW8cRRB93TO7s1+OY2+cEAdMHEOiREpACASCAye48hfgR8KFU27hhAApQeEQFDsxsbHN2rs73q8ZVNVV3T27a2clK9La2Zntrp6qevXqVRpXCbXKr+8RJY8pFVH1XxF5dcZZLer3VFp/JUEPvfeQyvRFqJ86bA0olLIdBwDLqjmlF0woPRAAFSMsq5RKReQdumN9bz8nFIQimUmopqc1n5ibeQEbFYyigNOGADW1YT1SMRTdjGaz5QWmaD3qgub0B33uQVHtBB3/NJNKcby+jmqaVCoLcQVKq1RkUM44pHI+CUakisO0tlnW5DVg2ghT80KrgInU24NRhepaqfT20kovkmUaVsPWuSrsApPi8uDFrZy7hlZWSKVfAhN6oCMS6pqPF+aDz8W586GXXttdYvuZCB0ags5RJWoqDAwrUwAgQcy87cU9qlS9ZEAocmB6kH0FJUk5sG23W/y3wzznsTgL5yEW/ouVtBcYBcYn/0aUQuPfayUzSZRV4ChJbWKi0H002kIFJFpy6d2gLe1lmEu4N6lWtclJJXVMDPVLutnX2k+fygxj3b/4DLvzJ6PcpHdpJvoOZGJU8aUgYpSfu9nKDFTOvP0p8mql770CjsiL2hwyWuQ0YSXgom7QWV/Fw7VPsfn+LTz9+Rc8+ekxTg4nWCcBI1c2Qelx9YDdc8BQ6oAeF7zo2DvMJfdGHFmk4CHWuHgiNPm3AjIUsq7yqPafSXrsBG5+9c3X+O6H79G+vYOxaaAwGQeAQbjR+rNXRDwG+mpE+z8A8Af6eHz4En+e93FSNyga1NdtpA/csvhdbO9WFLXnX0Zm6BeSgGuCpnsxDzwqM8pNbnGq6QxkpomMYXOVf5OE5zV9LgS5Xtjf8cSj7dYnYsbrovhOiIWzq61MgeGkVcvYh03l+m4M2uXnYRkY6DUBjJVrBV0USorjc80qv/Pg4SXXWwYcqpOnc8400dUm9vo5jk5fYfevHl7cvIPPO+9hCw10edqzA7syaRHpo+Sfv9HDr2f7+PHlM7wgmvFKByVJWhSJG7M4K6TXE77C7hLqUoDN8D1c64ijpWvC56iMrp6jwD/bD431FZthdoBx04Cc9oNOcbBBqI7G0NVqwqZLJaGVMyTt7a0AACAASURBVMNj8BYZYky5t04gkkfaxsKQaeKTEK6mK/IXI4Bhw9+aaM9rAiTzQMUSfm6p2E/lcsstoTDV99MIcFAqv7kg5mf/UM48wy3EGlUWpcaHOgEHoglkIu0fI4K3MUjHolapjNGicYw27JXuJSV2lftPq8+YVEQYGcxNyW+5+KZOhZ56itbGOsrRjEUBy8FImDsmACjyXC50rWQtKLk9p8lCrQRX3rmGbHwbo3yAs6M3aPPIOGmzYw9gPFmeNOKHmGBUlPjt9S6O3rzGt48+wcN3t5kKPTs4hKEWCZKTI4bd8By90xNk/xxg9dYmNrs38WD7A/z+7wEG0yEmF+ysAgINQqYnjkkzpjVnZfy4Si96PsRukLPs7UdAkItenOSzoCC8IgF97jQpefoLVfyv37mBnY/vY+ujD5F2O5it1ZF3EozLMWqNOkbjnCutNGGITpuhFlrrwJ0Zz3xH5dws89HzNhm/BsOhsE8SabcsuNrbbmZObG1acKFgynT/lEGNu9v38OjuA2zXttDBCuo0Ochk7JMT6HkWu/DdcoGSf1HEuqjZAKnuF95XDzHCcDbAaf8MvWkfz/af4/i8h6P/jvm9nMBkavMgn0ltLXbEz0YbsWfCv6T1YDm+0eJgIqK6bkR1wsKGWdpCp9FEM61jc30D19e6uNHt8v9dya7wXH9Hok/8uEmEjvm3vhSwo/vOp0Tzz3E4Ocbu2T72ens4nZ4iaTn9JWYmcxu1m8JQjFLC5pi/cK1zFV/c/ww7G9u4ilW2F+cBHJBdyEhTZ83RLpjSMxwEbkSDd5uq3DV8eS9Bf5jj6avnGM5ypE3D98CxXy2ptv5JbKE+n1g09HvVX6FnJusWcRGCfBN9l5APsOgfjwd049SZOS0xPlf+5flDuYbmuk77y8WvynhTf8e+sbLngV2uorAx45EKENpGz+xa0kDjPNmxbrgVgJ7DlN+N3WfT9RWM5+swUGgwHo/xP1vXtttGFUXXmRnbsXNz04SmKjeRUrVVaYT6ACoSX8A/8AE881/wDOIFiQcQqhBCakVBVYvStKJJjNPY8cycQWtfzoyjum9VfJk5Z/bZl3UpWMTx/jLZdt9y5X1F8VwteplCm1b6mM1m5lWosPUhFTmXlNW7fD3nkTM5rAymoBvZYWoq2rVIU0PpL9HaS+xmcoESkevDoo43LPG+c+08i/ph0x50enFZCvKEDldRKQXuJa3CCbl1dyCezjAuIbtqrsIrYnh5VJ9eh4W4VVRZCzSN184JlBfdYoNVubpvZrxUTfgYbOZnZwnekcvmq2SqlFARtcLzndshjYbqvN24aSO3tkdaqypMnNebLCUc8bAy0imMUQnYTV0ZrYoyMmNOJUG0VYesal1zSaKCqXqykVKYvQUPG+N2MigTdtxIFC2kcCRkm79n2NMmQHaRp3ghYWmsyZDbcIsgrQkmxu1SCD8dCGqL2IEICCq9DvoGg1chOXp+cx2cK6xcKuVNVwaNp0WP2A8t0SGQklW5HqrJ5zoFFHXmOqT1lAetLNOEkgkOuU9wUQ8pfpvlnLBp0RRMLntNkaamMvnsJECeSOdBfcwVcqqv7AJVIH28Fw9Mri80yLTT2e4Z3mA+C+xE01tZUDBzWtfVyOmXW0Q9cBrt/NsjaZ/1huJPPN0LjIdjXBptYnL0DwbrAyxI16Bdlin58nlzqKcoQhTWja1jEm9xr+u+7TMEO0TM6o9OAToBUDC8Brbc0EOuqdA+Gy5IVoReK2TUU2u86fxY/FLHNy7h/rtfYPfj6/jx2+/w589/YVhHEVvKKxW7GbIZ0ajAaZ2g5eZ1xvldF2nbEeeDN0jSkllRaYmHr3paHc/4gr4n3e0+Y18lxX2TA7fv38aXX3+FK7f20YSRJDZMa2qDzRWJv2qHfNCBMFefSd0zsfo7xQ9HB3g4O8ckoxd/T/i9CxPqqgmhY1Jn+h5M4mW6aV1pT0B8jzXGmXN+Wvc8KLI8NaZkkthpcjqvLsGCHc0jgpKNTE8rcjmbVi9F1W3bBhhMSNKfQRfNmS0cxaa/xds43UYy41ZhFj5ul0lXDDqNaBGqz5LrEPgN9Umw267xORILoSWXhJim+1JCWDOiJxxr+w18/oo8+ccHV5A3cdnGOkIhuRjUKUGRYrkqtWEGsymq9PxO01e+nfSp8QAnVY3T+RQHT37HT4Mn+Gj7Hext7OBavokN9OUzqN59iojH0xd48PIJHk1f4hXlILY3ISSNWGpBXXf0JGJtv1HXU86xqEikKJoO53I2CeWIyYs37vpFJ9EpMBBY77lOREMjvuYqyKZis7oGRoeCQvu5t5jM0WkkZtbmyjtuLmIFViIbKM1E9ozHx6hN3ay4CBmPstebuoSapqhVoE6SYlvwO3gJneTtguhWKFoHirQu8c2ie6Gb66L1rm5sqtttBKbPY7EWwhJ6wF1XMqe2hIsTzazzPS7OVafm2XJJYCm3WbQ6CkZ816m0zoKKjV8bHqiQpopqSSIadA+7LgG/YnE2Sw13eW7clcmTaEFjmrVznmP2eib/vz7eFCQLYfuLxZwHHnorzL0iBrs7cmbODl4K7DjLzFGfBTNpUSFX0Tyjp8FucUmK+hDSoN7IdjFknvmgQe/kXzFSzeqF5ojcB40K75lEoHzEaQSexhrf/PYrnp8c45O9D/HB27sI0ynKXiO4rbI6welsgo3JBDhdIFy9grt7+/j+lweY4EzcNboZkbcsM9fRoY1s0DjcF7HbptWGCOYf0KGQSFzpXGPRKEQ8ccWzQpx6Kvtecbmo1ZiQA4J5FvG6B4z3tnDz3k1cu7OH4eV15ONVlIQiDJgHL8BjlWLZOtwzfjXtdwVVVIlXvDQ5i9za0Mv1wZtyGb5GqyOdhtdKj+U/UoKC0IMVcUqYs1p3QhwZFrMaecWjsod7t/ax//5tjMMIwybHMKhSvCBVPffMkew9Qyf2dh8M9+ZhnEkq7mZt5zbFSpUKOMYppvMTvDg+xNODv3H46jkOj56jpCAxNX1CK4JH5BQpwf31FbNm1mfBEb0cEi7MDcV1dXhmjoYjiasiitm5X2U2x+T8CMexEGrV42MVzORrtT/C1vplbG/t4OrWVWyt7WA8vIQ1rIr8YSHT9Cj7mrn/rJxb0avCpswh6jomTAQbQq+bCi/OT/DH4VM8mxziv+pMhioVNFbPYoWc8V/IH7msUS9meG/7Gj67+ylu7F4XREYmyAQfr8WEbWukpRs6qIUmDTJgLQyPTdxZ6xjgLYzx+Z37Eh8eHj6SXKjJo1CGHMnrry6lW5BK8n2Z1EmCVBe9H//uXO5DaVN+dQpQKrcMJ7mOpFe7eJ9cig0+zqkrp3mFuL5YfON7GR8bRx6bcL40+x1J3smt+Hukled1KIfCJoDLWobxU9BzlQpwr66tmQOTrqmCARXZxb+Rs7aviHNUEf8DAAD//5RdTXMbRRB9M9pdybIVYafiGBuHxITwYSAHvquo4qfwAyh+FneuXKjKgVMucKMCBGICpKLE1qcla7+o7umemZWcVLE52LKj9ezOaqb7db/3Em3xp+A6iXjHzK+hVvPECTKwujNdeLX+wY3pA1b4DQUHkYlf3pQmQLZ5ejFcCY8EP7QypIsDV1PL3AucqcNA+LsB0V0dj6LMLfF0ns1mDCw4eoH6uCeeo8bWRFVAeko5vyrbqkq0TqIDElJvf1VHFAdKsomrziq/+dILRHmlc3/9JSfiWnVIVYFShPdcxViUhqNOgFwsBSuhVjiV6RKpTTxVgytyaRCjYKpH4ji6/DNC4ykYXbl36p8fbH+c7ZJT904aLSew6kGZICldwNdOO+i0UmxlXdiS/TnWJ+jSw1Wf53BcGTrPRkKCGTNJSt1i4oKJksVEWtHCqkhZ6T2hQ8CvvvGEFppIdJISE0ryGh0iee7bS1k4MRo+t7ASKidUDkglJD5WkW19Zp1wpgo8BsqF/m8TiYNBWuddUhTOp4lTrHvghJLqiCO3znkOgIDYPJmEnwXaAq5d2cH2Ro/BGkJVIQl1Vesi9LI5cwg1AYG7r+xinM/Yes+U4n1aVl6TTg+tIHk11TqiWyhnXAXs6yZ4pAJzL7vfcUBuYRvrg5V7X7MqdIEiqxgIOfriXbz+1k38dO8+vv/2OzwdlFwZ3SLAkgIwTWh5uKWARmtsmLXDvMD8QoM133Yt8X6DbycHi8MRzpoD+7ev46tvvsbRx58ip4qGydw2Wke0BESKwK484fmbZPV3H3P8MDjBz+MBzjfJ75qqRLnbck0QDGKwUV7UMkf/59B5ijvMVru4uBKL4NBB/f/sxi38YPce58ff4FdLQhZeh7EVrNaeeJ6yp8SYsE/puNglccXn3dh1V5DL9Gb0HNx6L+A2YVzlSoLnn73IC9hI+7QCHf5+Vy5JemHXAt0vWedojzERRU475XQP99VZEusjuk03Q7XVwWA0xaJa4K9/fsXOv4+wjQwH/atsl0UVqmeLKUa2wMAsMdnKUHVTFG3LWjGWvC+83VIsvls1AEITBUQ2CTEFB/VxJ5N14G8plAEjr13Hn4JIJbf7UvKtdEK+L1TdlwDKdSJUKK3TKorFUCmZpwSVwCuThu7F+FhdQxrdVi47CK917r02T3ivT8LQXPM8INiMEf354r++bmWHkCKay+Kd5gpTm2AJCdE0uWxdia81DGUFnK8rwcasfA2aHV6UsxQRLAQr5kTUsAlQr+u6UYFzc+jWAy4K1c35YKEqq222cr4sY5oP7+G0UqXuszSez9gRJuu3mfNbLS9QDM5QLhau2isFJ0TrrFVKl6yZeep0MM5NjxOVzmyJiwc1itMFetRKX6kRK8u/CjVMgD0DjCqwS8qPv/+G4WSML4+PcdDtYWN/FxnFzcMp622cT6aYPT/D5sEhDq7t487+DTw5OWPAbblSda7N+h6h828qE/bk2gbeea2V2ritPrJIlKSWO09Nig6BHSTESgU42s9IC6dTYv+dm9h/7xYO7t4G+m3UvQR1xzDtB+IfTmCbK7RVoXtS93XpIIxX7EbiXzWfh9VDi1HWNtcTqi6LL6jX16Brno8WLBq3093G5x98gqOrh9g2PfSxyWBfS7VYVjtHVTQoHiPd3+iO0RV0bAc5/3PQTyV0LGrpH+YT/D0e4JeTB/jz8UPMi3OMZ2cobYGiVcAkLpnkDkd61kVjhBwqCusAyUTyJUqWiY5MtrjOyrTGdD7hjlSqCFzUC5dzZE1K27JYICHxxXyBpN1C2t3g55DOfXo+xPNyiIenj5DaDrpmE9f7u7ixdwuHe6+h395iN4QrrQ0ssfSAvHFbsYuh6oyfN7J4Lm2O4XyCP56e4PHoCUb5FLlYGecSO3CRpTS4mOfIloCZAG+8+iY+O/4Q7++9jR42pRdB5Sej5yR+1P13q0FWmLOWnKePHm6kCT66cxenowGeLc5guwkW8wt0O5mA8ZF4ddzVqD/ztL5mh8oaJSpK1DkHiAat7/W0RxardPG5HzOLn7o9m4uo1IWkFX3pknLxvdj4RQf9TsXq1Q2DAD2Xy7kYhN1rJM+gzyYNP3Znoe9VV8/aFv4DAAD//3xdTW8bRRh+ZnYd23EcktRpCUQIEEpRkOAALUKckDhw5ciBn8AVrvwqzkgg0Z6RqgBpGqI2bZPKLWk+vM7uDnq/ZsYm1NIq8dfa3nln5v143ucpPvr29o/QQIIhCpnEH38Bn3rFKHPQhgwyafqlmcNksAXuKWPoQx3hYSEkzfwQmRbTxZbMr4sXM2iGUmDcQSv5QSEOqg9vF14XPgtcBVIs0llcRWSCw+ScSRVYEAosi2cwxlbZyXVkF7hf33rra+2VK/X1glgwxuMUMEv/O52jVAKzPECL8m4auBtTskkbRmMpCnbMCtZ5lMdIeYACIQ7wqUeylSCUkwAqJSHkhfIb6DHapKWdQqqptnEH3nCbCGE3Z9IImiQgk+qtg/SMIGup4L4/0uMmwom24P6n0WtrGA1XcWN1hGv9ZQx9PzL9p6mdDmfs/doNx3zqpLvpZYw6zGRP/TM1B6X2nYRZTvQ/G7Ux7lniNglEeyyUAFCQK15hvXXkmLAKuTeCvKmMn/1W+iyDE/NYOS/yhyzp2JtBn+BKZ9JHOFCZBbAOie3WHB2D8bM6hS4S7RxJ2XxP9aUmfBiOlHEgxODBiXNeMES8ZBdmubeEteU1bCxfx+baGxgNR6y/SqAqdvDp+qpGursqw2afoZJc3lGQEDC5nAi/rZOqT9D5neMQaQ3xyhIdnfmsr98zkaT0NDq4/0U+5N9h9uZ0Xl/5pFzDKCmqrP4dj7pssXnzbXzw8YdAZ4r9h4eYTAK6TjyrnIkiqGPttGo/B/iQ+84QAWrnIcYSyTayczqX7vsMAkq0KpSAXlkv8d0P3+OLr79B6K9x7t6p3JLBXJ06t60pFjj557IjbP93cIKfjv/CTn2CF3WFizBFsTArBSbw9CQVGrQq7xQeZ3Y1L0dnidxXBVNFlMNLr8sTAGz/3C8uwZ0FeQJpVy4Xg/W7pLVuHDOtJmcrIsgKElDCJwu2wDTZmrRztFm/rMlgMaS8kKRjRAjgP36kBoKC1ppNus2+jlo35Do1djrZ17TvXxDmqqpDEMXIBRA0eSnjRA4kjUO/3+PrUU1lztEaTVVzXo+cMW+HCAdOLSgBzUKBaUna/lMcYYL96gV2L57joDnFQXuKYz/Fec9z8F+10mtMSIPeYj/ud/wZXsdIazRO+wrp+4o0UsNV2JAhAttapOVgxKC54UsHQRxPRlsoIa9kfxOyzsazcEl9hvdoYkNXBRV6X0+RYhREFpmCSm6f+f8WxBqKyFmyUiuFkSBUuYAs7dbG6x0SIQOtE1FDPYiEFv/V+xmHg6Hg4hoQT9NGqK4PDi57R9w9s1wFMkURrR0BM5+WFh9JuOjzJj+qARYUGWOzJ0eViX8ndkioybbN53CScRX1hVr3T0EVuhBm5qP5jzb/yT8hX4ZsgAi3iKTXswrQhH0xRjNyW1wpvbt1jR4hAMnuGNE5ZWUYQtZxAYJ/UzZzXVqjhaTS9pySGceJRJn2XOonJzI5rpDmiJq8qYsK4mrC5wF4dnaGvUd/45Q00YsSg8ESCJBBPABF0UV/aYjh+jWU/Q4ePX6M+4cHeMkwcDWXbIOwrSvuJ3GNdxr4JJ8pjbTZRDokEG+l/cHJe7mxLYitTrstehsDvHV7Cze/vIXtrz7F6vabKK8P4Fe6jILFgmcEKO2TZmDcHc4kjx1BkZqEtZdVvc2SpOLSFXH9nr2FWNxqFT1kHBNO222Fzd5rF7hj0l8eh7ZEM3HYXNnE59ufYGv9HbzuR+zHiLK/FIlmP7GN66rA/+U68DG3ryDuroIgu0CNMc6wc7KHX3bu4Offf8Vvf9zF/ad/4vl0jKqo0HYaFD2HTreQYN0LVMj2G2vnjBJu3kV+DZsTXIxsmlhwc0bw5l2Ep9shNEo+IhOID4HVUKoK/UFfzhcaRjKQpv74dIwHT/awe7iL/aN9vGwquIFwe9CqKUWogpPGTqvxdP0poXEezvHgaA/3Ht7DuDpG5Srmjmp4H1M1lJoS4V3U55dY7gzx/o338Nn2LWxtvMs+5iLrMhg/wVWEp6+sOMW0QX4Lahv9xR6ePHuK8T9jtlvmhILthS6ivvODbuILanvTPLdcpnLHbW8UOyjqzeqM0X+lv1rs5RiCYkyzp6zNj89p78kSoCIBb6jfFCfnz9ljsYjCvq6pCUkB2lDOgl4UZDvNUypGC9pAUR5FgX8BAAD//3xdTW8bVRQ9b96MvxIcO2kThcCmFRSoIoEQCBAqC/Zs2QASEj+En4aEhITUBQsELS2CQklCqgSH1LETzwe6X+89TxIsWYkT22PPvI97z73nHP/uVx9+DePAJ5UaEXSRyc0et1Tt1iAnVHLUEsEGac18TvNpN4Xj+H+EVul0U4lCZaa4zida26zNeq7W6khIPJU7kaUlExgfKj1BcisU3LCJIry3CvPzefDut/Oe6hAUiriQHoJtfsbrSBe+Su2hODlvJLCzRQwmbqL7kH0HqWQIokRoTaUBtqhT6uJkSI++JlN7LKeCjFAf5FStn57Dir6QxcSqyfZZRO1XRH8IQYfSKNiGqxJtg5gQCJcvU3u/UBULAnk1J+ikrLo13sS4N8TG6jpurK7hhXwF/aybOjldnu4WWOiQ967gJLXT6eHG+hgbqyOMBkMWuyFHAW4bJ/oHBUPM5wHTFrzxaZPEnwGoqkrEiqLGhFOOrUsnuNIebNMq1cOW/T99ptx8c64QsCrTINZbwNTmGTMqV/L5EoeNeK1ozBR5Ho4fuhDKRXDicFnsPGlXBKE8V/tb6tlsx7fQgIEMOrN1gfX+EC9vbOOljRex1dvEECsSGNTivc7Hc7GF/Lpbo4kAHaX0kiSekcp3E9cQSxbCZ6piCyULULrYzs0Bjn1PuEiDMCeEq/Q/rvl8TdMsrQvpLQIANdNd5otztidz3QxrN8e49fptvPX+LnyvxuE/z3A6r3ChwjSNjxV7F2Mv02tbCjCRKPqmiX4Y+62E305VZlUOEr4ietYA+PTLz/HJZ1+gGO2g8v0w1lwS1EtLcNzgaHWgNldS+/++meCbZ79y8k9JX+mJHlRwlYI3taqGhfvswR8AgFp0GtR5IgJLWpmpo+BNGwBIO8Nsf2m0itMGAPj5dLxM5hdd+4qpOwqEqa2aJI26a+icbXQPsbuJwjEHNfNhcwybtCV41l5voKYCAI1q1vCeVxmlSwPYK/RruEKi7eFxji47A9D6lGXtBLNSlxIBHxt1LWFqW7KmZ4FrHVtQpToQfdXtOrXBQmnZl9fJ2lnCdztwvQ4WOTCn4HDQwUXP45TUvMeruCgc6lwEtrjjil5Lbd42Juw8q52bVSRqFfe1akqnKwUDa+lmvRLOrkpeMwTwrhQcUN2gRrpsGuvGqIXbz2OD/P2VZsAaFVUVCgss9ssTKBMxWJeW2lX/RcHS9i3VWLE4wa61FS9qpud5pm1IYpEFkDOdy9A57FQ4jvjHXhXafd0EtWuvAnUEjnt9bEl/rn7ubNtGNBW9GwBAP5fudC7tsT4vAgQZHFrAQaP3//Ekj/tyAvhZJ4Mm/3LuIzCQvp/Q65a7QzjIXlRhPFvBAkmgiyQ2lLizw/unjfvBYMBxD1e1aH5UskeYRWyte3ZDBQMCH1xcgW2vCNdKBpkeS0Bvcs/o9IlalWN+8hzF4hw5jUctJtH3Vc8jXrtKILTT1xnwbwkcHU/w9O8DnEzPOJE6nc7Q7Q4wHI05SaHE84+9v/D46Z84Irm4pSR1GQCw3w1TciHxjxz0dOwhEuoE7CMnE895GYui1V3iqTfojAqs397Ca/d2cffjt/HKvTcxurONxVqGapjjzM3RqNgn61h50ZVpdPOrdf0icTOiShpILLH0MgDA1zbDpf1YxlS9BABY15ZUQmtx6aL4jeOlRkRdaxG7zUuPnbUdvPfGO7izeQtD12cy0wpW2KbTafzSihjkWPa7TlYD6bgRS5R9mP4zwwWItX9YHuHh4W/49sfvcP/RD3hw8BiT8gRzzOBXPHyPbIlLdPtd7VhopAJc9ML1Moc1TsopzqaOXwXK2IVDu5CpsCR2mGV4DRf8WFdLk0G9E8BRKgWtUl0x0fbqcI5zNlXaKwHHlKrndOw5Ts9PcDydYO9oH49+/wWT6YS7LNiBTK22mXJLlX1XcbK//3wfP+/9hCdHTzBzM1bdZ5cJTf6bKsPirETXdZCXBXaG2/ho9wPcvfkqRqTFQB0VSg3IEvCzNSquXZNwLQDgOAeg9WhycYqD4wNMyxmKfs42oVGn6dJgCDkNjVfuztN8NXYpxu4BW4O4Uq+ATdAdumJf4fe1OMhAUl1P+f1oX2YraHlM15HjnJYzkM0j+vAmFMnFT8ph6TVWqCGePyf5JDQvRWJze0sBXHP7WywW+A8AAP//bF1NbxxFEH3dPbMzjk0c22BHKESBRCQHEqQQiRCJG0j5AVw4cuTIP+CPISFxicQlIogQEBIEMJA4H+C1d2d2ZhrVV0/v2htZKzve8e5MT1fVq1fvhZuf3fnS/sDYFfUpz6EuM9+Y7SJRHJq24cXIB/A+bf4jMjyodZ/NyenJzpLEmFgH0t2mcYOQ0QXtdykASHIRU+fIPhS/X+3602ZhXfeUwGmyYO4AlpTZ+5OOxaj6bkW80wDGjAft8BIVn24qY0jYuSqUAhWC0TBcSna46LQkJNqs+qgmLwJuIjxErw06LzuYojaW1SrtOnHhqQgPRYdgc3QK0PACziglloTbhc87clG7YlG5Y2bFNQI9UgjzsYKIw4m6vzwmdcW0tM36LM5v7eH85nm8trGDs+UZ1K7gcQCPscAV1XufvkKaBfISjDVpoRkiUm3drbawvUGgwhY219ZRkic6ectGYW9QduUyhCGqZaUVL+NnM9ZHXPr8NYEdyjZZ8jHW41FXoEgzjOrzrUkNM0qQAS/qZ89MC12TTpMTp2sGSSxTtCkK3dydzhqHEFRpNAhNJyy7BJzWYc3XhnVRLZkVkMOxmvlGtYGaLFT2LuLKqxex4zc5WJYmEeMKLRqcYu1x6W+sfnndUL32JAYfcbxoMZ0dCZXNu+SAYQHLfO+46NHCShJSvSaqf1DoBpYAgFNEDp22UlcBlHQtdL0mdEkfknDoNCX76na8lhwJVg1zDGse9d5ZXH3/Om7cuYmdS9toqwUOjl9geiRTEkFBACrQGYYLkG6DJmsujkJ+CeBcAStz/MBnz9Rx5bEd6tAAuPvJx/j08y+w++Y78OGMrCFVdzZ2zWCMfTeK+9B86Z8Avu6f4qsnP+P76RMp8uoJWtdxV6drG4GInCR1JtbYK1AjI1IxuTO47PzbfWN7flgRq7TOeg7yCQCHdH2jeuqadzpT92k0TKmi1JkzkNm6r3TPMBCq3eWxwyj3qMUR50+uF0PyKbAzZuaqvwAAIABJREFU28D51A3lURQdtxKtmi6Bhra3nAjzyp6iQFzovSuxYeX3DPTIfh50BMvWK4vIllL8p2Ili60AMjDAfKAzxW+MoAzty7SfyvVjhIKLV6Ytsq97r4CTxjDVNqDEmWcZNPmJqgvkSwFfbQ04s5uKY7FhHQgGApo5J8GlzkuSNSxIlKleQ6+KxVBGBDO4jA0BeY0VEvYeeA1QwmzXgYVDvfjAc9ySQq8qBSyQRoLoDxUq/mrnh4R7XQac5g9iKHhktroE9NNrOcme8Hmh9UrMvF6Zd1A7VtajIcEximB0vmctaqIAkw802T01Cy5Q0Pbo5w2GowZuMbAOSz9r0M3m6I8XGGYt+lnLz910DtcOmB8eY6Bj0GgMUYIkT0fZgeefiSrE40rUuRuAelKLMKh+z2KLbKs34c2CRr6sQM47xqsg9mkMMAMDrBnCQq+U0g+mFSNjAHGp0aOxmRsOGcsyo9xyvqjCsJa/tGRTHCVf44KoXci1dJF1qSYUX9jusWcGTFFUKIOMOs7Jlz8qqJe//8TGEuExKQCky9vT3lJVKCc1CgIiX75EoY5EdE7bYSHq+G5kW8FAVz0u7aj/9gMOjg5x8N8Uh+2cWUm0Ditf4NnBU/z+9B/88mwfL2KLZZnIrCHixgLfx/F/mHQdPFv3JpYQN3S83E8pug1c/NNQZU+Y8Rawd/0CLty6gBt338PbH72L1z+4ivDGOTSvAPOqw7AWMBRRAHHaeol+3kvX0xc6AhBF+yYwA0gYBSGMfuYGEhqjNLF9yOZ20SYUnO4frw5A4lhFo5K1NFlEjVaEJ7mI83yNSPitb+me6fHW7iV8eO02Lm9fxDrWOAspUShDT0Gxkxt2Or9OAXoG4XT9035B8fcYMxyjw0vMcH//Ib55cA/3HnyLX5//gcPuEJFGHSvPyvxcpFNc6x0KV/BX6YTo3nUts5iDWrWl2kbzPq9xYdDayYo1y3vW19fRzJskVm57ksSLXvgcMSZ2qzEC5ASLQDeBWYt5qzpJcj6JZUYshQ4zNPEIf7/4Cz89fsTPsexAtykBGtxsdR2exef47vEDPNx/hENMsSg6tkglx42WrZpruIWDbxzWugpXdi/h9tVbuLZzGefcOu97lRb/Ia3kk5w6twJYnvYvf9gI3UQZQU+a5/jhtx8xj1MUteT7Ynktlt+syeW03kpMbinGab1K4TyOaVsD25YOu9gw8CJ0fHGgGtX77RpzM5WF+WQGX1ipdJ1kDF207YS1a2PkHFN135R8V6xT83gv4E4thT/nGZ4BIwLhRDtPGPN0NOr+0zoi9lTeSKCfMzPLB/xP2bn1tlFEcfzv3fX6kjgNRI2IGiCiolUlQFwl3vgWfAEkviTPvIB4QBWCKqgUeklCgTQX2/FeZtC5zR47pqj7EsexN/bO7Jw5t9+/yFJpsyvDpYg9R/clk2wSAwaIsP5Kf1IqzTJaMpdua19kCNfl58R56A5PYhdpJPkTGwOSCGo6XXyKAgrZPJd++/kVf0a6KeiL2sbfl1WLxMKyITNteN5cZSE5JFRi36jTz5lYHbiy7CcYlFUQsGFy1Fvrvy+0DJIdx6ZNEDphCnRVFpxp1/nMcKeUCesmnQULTJYCVkpbS7DCNkTsTMU8OfogmnLdqLSPTh63iNj1pPN49gG/to0piksqAUUsEgQxd700HAWmdoOgjIN8gAEpAPT62OgNUZK8B7tBa1DHa47M9Z0bp5QX6DDm/qbxawP0CHTVBBydPWdJKu57UjgfLcItQVPM0VY+gn1/U0YwQ0UL92xWXXMg7VoE1TieTjt4o5Q2irRHwRCOYqmc3eYtv86k99ycE6emn/6HaYLST2M0UOkSPUfgl0XTJo1z+05+/Pw9lZ53vUODvoDUaPzqGDApx9gsRmwwxWgWXQAmFY+/2kFXisruxtkYo3yMYT5gKZZYBCzislpF1zPcWwrOwLVhWJaWxynIZp8dAQtuOSfTZmP4j4Z8W5ijSSOtrAM8b0rZHFftnJ3GqNJ9dZ5h+PYmPtr7HO9/8TFOfn2Cx/cf4efv7uPkt2PEK+nNp81QrICNAhhApMOL6DT+3bitE9XzFQB8PwfKzAaWVbz3yW18+dXXuP3Bp2izIanzqWSchGhs2Fv9mWtGigIHpwz8O8c3x4f46fIE9WTAJH8KzhDBuWoW4rjxR3tJmY6bY+Zq+usYPcdFo+Qc0LVr73v0NcJt2v62JlKJqK2HYmfE2BqkljcClG1uRJKTvzPZgX7RrZX2eezzmqKAk1LtnJKsc6DdPPQSuPJ+DfamVqGVnmuL1mfL51+t1hHy/PK1hAbBbf2itSSzAIjbyAVXeZfGwSrU+uXK5xFpofn8Sq6fVtaw7A/scfdamqxNDKkFAspiYNCFFY27DEZqR1dZJcR26fskO8PZrcCMG1iJfn+oQc4scVGgYC0rv4yOE2KOPlcN0ViR4+eUdeKatbBR9g7bYqb4SVUC2QarACBdZoYDljLOnlEBU+FIWWqVHqNxovlHMsVkG0g2uBVbRM497YfFQW846E3Aw2o6Rxtm/J62bjQpogsDzX+DoNo1h0b/fGaeK1BKluQkEGpvPJQ2rUL2LgSVpKoIkkzkBAWBnoZ91NOKpfJqAwsrHyKz6iVeaHJV/WhTlj5xSRIUzUEzLQiFXHth5aOnShq3LsTeCqvJHO4gey0GneVr0sIrc8m4U0l6mTbeZD+0VY4ZjUrBn1YNRoMC5etbHCMpm4DmnzPUVcNzhh0Pt25ZtZX8EsSxH2SYUYKjmWB8sI/67yNcHF9hFHJMF3M1OB0ENJqkns6b2n4XhT5MscCUQHb1JZrnj/DH2QmmVY3fz17gNExfWXOe89R5hvNWgJqmchpVso3+/3DcY2jiYGOI8fYmJjcn2D14Azf2d7C5t4V8e4his8BFrHFGoMJcWUoctdYkoJbFtwQszeS+rDXh5g/anwuQO+c9fJVaEjvVDj8vrNWUK8JqAXly4K/Vyt56JRwSrV0DvFeZXcywPdrC9vYG3nvzLg5u7GGCkc7LtBvQN+Oag7l8+LVc2iQI2lexbF+Lh5fP8O2P3+Pk/C+8OD/lPvhYBm2HyDnoT62pdO+RHCqrFLTaC0++BcMyW4WBLydrkNZgBzB3856xdyrJzglCSzQ6BTBJxIXusfo6dmQanKOqG1oTOOtLzjo5uQTkbIhP1sreodeiymo8uXyMox+e4nB3H3feuoNbN29xf/+DZ7/gwZ+HmGYztH1R5KjZlkjgj4j/ZUtowREOdvbx2Tsf4t7uu9hhxGzBAQALQqb2lv/N97/80Oar5fsjE0ZIRgDxeL3dy9uMdc+ZEpup4C0W8yWorPigIhUlTB4JvhiAvLPVwsMzZ9b7c3QOej2dn+RC7dw0r+yxrxKgsZcqyMABIfJRyf5SYIPYPNYCTmMtymJaPeyUJcyPlCCE+L5N0+BfAAAA//+MXctuHEUUPVX9mO6ZcRwLORgpYoERUpCRIgQSO8Qn8Bd8AeLLWLNlGZASlIUh8s4hjicet90z3V3ovqprxi9qM/Y8uqera6punXvuOblTG6c+qYuMnZkEzEbTsWyyBXp0EhaYK8aL9wlt+cGbOIyL722UNBvQBhDQRt6QRXIlKBMEJVNFZc6eKj3fGk9IygqICzFGFXzv+7jJQ2IHxEyHsI59kSkl0sRKggqjIEFv6PqLQqgibXe1cT1iVzSiPP1w0z87pakyvS/LI7VjUAtCEyI01zkDPOi7ERDCtoNVJbWY/N17Bgi2sx4pWGIDLr1vEjT5SB1hQKgXq0Wmf7K/tQYGASowU3OmuVBK923Nj1H6xquEWGaJ+BsL7wRgRuMjBw529rmmaelWaJoO18MF1o0ITpobg41NtmC6Z4YxmqeN49RGzKli9NANUaGVAlZW+2ZV1lrKP7SuNGittJVPREAgqiOPddOp6CWLK6q/Mk8KVR3VsVdcy+xG1oxutDZLaO5u4+uDOPYHYDqZos6nbABWsaNqPqo9az0V6wYYceWBGZqV+rXcZeonjDbnRAEjCiGJIPW3AYB+tEdLnhNmhIj1rfVzscY3AXJC6jxyX41CPPbYfzEo0UC7c+voTy1vHmLGhf5e9i3qSYX8SYlP9g7x6TfP8PzH7/H+7QL/vDzGyZ9/4/iPv9AuGlw3wIyyb1SPBqj6MDTPcAdAsfVIm7aWXTccPj/6Ej/9/AuOvvsBnVelez9ShQc3ZolMRCrXDNQbBPb5//X0GK/XC1xMRCE89wJi0YHo/6BWqfff47DxuN1S/1pA2FxGQdtu4h+eJwuSQ5f46W9s6ggIHVIhLJrjCwZVra9YDTobKcUyhyf33o8bfRiDSt8fAbrUjs+olUpt7wZxjnGD29j8m7BaMH94WgfYlWXYAD3GoG64y8ntwb5PGTBSb/3wgZxt8sgKSIUMqfa/T4ASmIL8IN+N+wrGWhMQQH6jIR40AkDWx1s2ipFZ58WBZ1LXETg1pXjuG7aepdhjxefJVJSRzh0F/JLjMiCh82mMQXox4ErHjAD2ClokIquxP9mbv+RN+TZIw2vGSijIThmRpYJNZk9o/3MgS5a3waO7XCF01wgXDXC1xtn5B4RlI0h2J8r/dL28WLsY+Us/55Vs/q3+tBh1XAgQJwuvPO9xTWywokPIqRRDNoGBAsZpjXXWos0u+flyVnOJBwsuViV8PUFZl7yOFcVYTknHZuExrusu4lhjmreJWTlF4+OA0YDSuyigJfM2mCrsEv2muxoLM/uknCh5n9fyH9tA8rxiitfIIsMx8zln/hhoImAjSIkblTO1bY9qWqH8uOCx3jQt++cPfR/ZjcA4f9Iujh6zKESZsTje8Iiu8RHmq2f40LdYn55iyhnmjjdWUUQw+b1Z/wQFYY1L9y96XPZLnJwt+bwrBWhbjJ//P42+IbHCqGynOniM2f4uynmJybzCfG8X5c4M+bzGZFZjRgAAPf/RHrIqR1Z7dL7jTd7lcIU1Idbk2a5+/7LOi22g7/W+ECs2F5CQQBd2LdkST5tOJF7pWEuqTX63W8Kqccq5qRNzX+OxFrwCARknF57M9/D14Vf47PFTTLkw1MrXutj/g15PdgNyTynJwpXj2c51PI+3rsdbLPDby9/x4vgV3l2e8cbftE20ooyB/7Ail4OCQakuExYEnY5BEdMJyV20j3NpfBm/Q9hYL8SJa7Tgpeyu0bWZaeA3r4dAFAMEzEEN6frEwEYPXwi4Ti5lqXVo9AjhoGfAdU7gWo9Xizd4/eIEu/kOJ9nO+3MshwZd0TMDcnVFwH1gD36am4c2cIb/cP8pvj18jqODL7CPPWEDhZzZYtF5JEkz3ZYQua3dAHdiwqqL5oB0/943C7R9yy4ALqwQvJb83iXka9bTWgZusT7F5KzWr8wMe537L11vmPmiawKvVVIqnb4nTTDSse2e0vEJaOOrUmcfivnHkjQpP5DSevkc7xGmNYuistuOithTE9tBKgU0RoOJ54u2nNmgG8vEOY//AAAA//+UXU1vG0UYfnZ2159xnFQIKFAJqCoqcaMHbgg4cOLIhR+AxG/kygEJCQkoIMoBiQs0TT9SF2ez3p0Z9H7Njh2HgKUerLiJvZ7Zed/nfT6q3PXYmovCDmEuCIwiNTS92ClspOgKWVEnX4gYtmwjW7ubPyh6KBOBKuVG+6wIsHQBAwvoNfScFjt9IYSkmIFIpVQb01dU45GaxggbwTKl6UJIwai5tISoepcYEISotaFNzaA541vxYesxFAM4YjmQHM9Ek3/Vo5nWkT4fH2KhSFonc2y0BlGopFVamIz8uKiujUq1rcQE0bwQ0rxckSjWrnYd1udr+bwelwrStAmyaVBybmZAQM0L/fBzr2BJPokauTEbAPIi9S27Wpbsfhqv7x6veFiDE515hTo+BGZFwPHBIZ5uVqgroZrSNaO0A9PTWzJCWQyAiG0+i6KziQ+jtBGpMNpXuNh6mJEBFrM5JNauU12/Nf/yujIxDSZTBV+8/R4qUqLuCWMgSMqGXVNaJ4ygZ9NGokDuOzT37aWt71UfJN0JLDOpUJWTlLu9S8BKxyLTIgs1O7q+0Ui56VxgCdVYosDUMT9rfWXClt0YRXCXpkvRDLYkf4vXOcepGLXQC4WZf5/da9Tdf9eEbd9jmOoO78FuigQAjMo63X+iFr+L5SF/n+tNy9FlL4jGfHOO45sHuPHO63j/k49w/niFZydP8Mt33+OPn37F+uFjPDppceCBKcUTbS2rHT3CDgre0xqpgNHxAT7/8gvc+/BjYLaUGMxs0o6MFmpnm9epP/37Fqf46q8H+OHsFKu6kCKQKXsCHrZNk/TUu4fVf30EPVhzgIAIqMzcir3+TL06DFAKUqx5PoiE8WL7j2MENQfY/E6cV0mDHopEpTVnf0brnUuRQfT5EIaxnk10eQKtGnVyWk5sEW2m8xQKyyEmAIqTVbTx4PeSucvnoMve/ZCeX90MRfUOCAwClmg7iZ7LG6B8n+9r/q34S2uCpkAXnbhHe4nyze/XDBrtAM46Btb9OMgNuDG1t59okJkPgp3rWivwe6T7ovrZ0HdjWchQGj9V0IGzopUFlckreFIWzSdEpkz8mlo0jWwGqZG2Bqldnug4cf3ne0iUJqAuU95yajwVyIcy6qD0f2YqOCm+Qrvh3rjmqKcS4ygyCJra0OcML87RNBu0T54Dz9fA0zPp/NqQ/jY1TyxlZJM5aho6YbUVEis3iufccAkoJ9LFRPemYnIjSUZjSn2gaM7JiNkIzNwgYHkxxYb2W+XQkW/DfIKGiu7pGC3dERYzFIcL2VuLOeaHc95TteISxGDItfHRDCeprhEuRJrmx62Jpa4pniRFlfeU4jPBSyH3oskGMVoEsycOnaWXGDUxsQw5gswYBVGkD5TeApZ39OgulK1TmtlvgfVmgw1pmOc1pi8t0Z+diVa/adWbhlWDQyJANMmU7GY6oyl5hTwwuqM53Ju3cOgDVj/fx/r0IeZ9wNj7rf8b0hBjAACgrQnVqRdkwFYBbZ9tG42C/TfsNXlJmhyAzAZDwCtv38IHn32K2WtHqOYOfkSeHY4ns/XBjBtWmurTZPdvMnols/KiR0sMt8qkYoWClhlIFqI2zHGIquX61fEtla6LyasMlO3Un8EaIWNQuULuTW4nBYrltyrHod9N4G/UOpfuGVaf24PrJVcTMYGZpovJEnffuIM7R2+x03+lpohDW7h9RYMxS7Xp9XndpLK5oIIJikG9f/obvv7xGzw4/R09RR5OB4NRxzHF5lGGFO1M59B0NJZBYinJJz0Bmxwjp82jSspskm8XnQZeMQMBctBTBj5OzJVpoDedSsSmgZLMfLazb4jWRCYJZF+yyVhTwCplXshCLFWeFSwmEeL2T++x6Tbs4XLWNyw/KmYeFyDj67n4bPTCXoMvMaY44hBxo1ri3u338O6rt/EyjlmOEaKAd4Y5RPd/UPCrPUpSTaknccdgWo+TZ39idbFCOemuhRdsUMfXQiV4TXPOUYy2JlmUoD47vHY08cQeQvVvRPqnPZ811zyU7Oy5Jsgxe56afJH41uNazDhpnXuNBOaBhPjK8drSQa71KMZEF3mN1FlpqBFk+G0sm90+wcAAHlLXFf4BAAD//2xdXYscRRQ9VT093TPjbnQjCsYEEwioIEjy5G8I/gjfffHP+e6DzwpG8CEuokYhsolxe2b6u+Tcj+7e3SwsiQib2equqnvPPR/y1ohuz6cM4RogsGje1eQu18mkFxFRUSZu5MEd7aHUwGwdheJDyoIvomfe85J2V3UxMUwBx0OjTf2kR19rZriZ4/llECdaRSY52dWxkp/LhWt6jasbDGPKrEHrzcG/ev2foiJCE+yEqrd29/Tk8oQg0gJp9IyOyU3kaxRtOjS9BAsWwyqfNfSy4AaOLF1zxQzHdCOkzLt+VBA+o2lK/zEqwaXjhCxGVIeDxcl5rnSyYmWYgImi0PUTg6/lg3d/Aha6Q5zouRQRyGRjrVMDyf60F2S9NnOmQd1y6a4rmjoifl1CzAP6JolT8+VYywHachoxHrDKC2wig+XmrFMso5IWNCD9i0/lrGFMdiUToWcUZAYc204uIxYNbVdLzUn0tetrLV4GLTIVbbw62fRNuSxGdBKd4dgYpSpX6ib1W7CGS/R2LNKD6t3C4ueJfGbU95KHRj9oTjfziVtu/KhmJ9Jg2QTMHTrtqSjIY3o60sfEidVlNf0s2fAIQjGyNM2ZU5Vo1rlkIvje1QaIhSdBsFIO1N3pLWx2J1JCM3EhjJ2yLia9v6KtfdCZqa7hmw9tKXy4pr3aIB3rioRCBFZYY5B4JBYcvBxh9Oq5aXAKvxqaOI1JJ8mqC+azwEIPzUtUmiZ3SxdX8U4KZPk5aZaxLJ/7lYaM2F2ubAvRH7aar8xMeGpGfZI9UYAZozKo0y3ZLjRFasJRgB2+G/m2xHAnw/b+XTx+fA+P9k/w18/P8OLpOf758Rkun/6GcEiCDGfmrQB39daZttlJ6V5n8vQhB7765mt88eUT5GdnGLBCvmQ0hjkiMZCHl+sCXQTgBd3+02t8+/wcv7R7HOKIYqtTGtUNdhjsfe9bUmpz1X1PCzb/1Zvy5ReBLQHC7EJahTlNZTAapUbP2Rk4iCIaa4eUtMPDNlNtf5v08uX6J4/mHBUIIuWaSP70ebjPKJ8ZVPtXZLnsSTnfk13WeTbT1eexk+qUpaod5XzwC9NBUJfNEIDhRKxX1AGJlEk3AMNwA9MM0zO1HHMzvHIcIiypNNf9O0Qna2wwXvp9Eg1vtCm26jldDxcnw8OVvO+z7K4VreFoxra9rAnP8qHrJsCYUgHPWBcggS8wC/GNam6j3Ts6DXOqdNIiarTYPSk4wgQYiA+DzzrNBFG8UNlAGdNN76lR9t2o/b9kG8fMIlRJn3fmHc9M/m4r0+/zbrbYK7q7676UC0m0tQE397usn5m4JgOhSYsPKU7OJqSrKvNtZioG0ziLtpPGaUOPXVGgCLlO+toRaPYYqj3qly/RXbzkwQBUDUCteScaIiDfiDs5s9spBeDJF3lfH1us2AAw1pf/Pv9sGqSqFiZBklpkkEZVcrndn8ziLlc2qc12pUz4i02JkSlAt07Rlmv02wItTa9OdujpzJ41AggUQ4H61YVEfdYXFS7HBsXpiQBh29MTtHzoBBZEfpLpMCRo5BtPrI0lBbBwl0hGYUEq240fcGRiz0qB9N40zWoUb4BQcF8A9eSRZsP2qDIhrztbZwvp1CwRkDT7XCUP8hnrFjsys8TcVgc0oqktC707EtknEe/cex//phHHF7VEi65DdqXtziZJhH2OXvla/Hx7/o6bNYp7HyBLDbpnEdWff8hz2rj8dQjT74rJc3+mJnPoxP97uWS2L+qSEeEGrX75NQnzIiQtgBYQB7Q4e3gX7316H3VfoUaLfWrl7q3IdhA5g35zP3ThqMyOqPUMXO1Dv42UqWGdT6at5hymxhDoa5UjZsVq1rXZUUZQwKeQPIfcS0SNpck60Vp5bUD7tignJh5Ps21Z4nA4yl6XJqxdnPcCVrImi0jHBm/vTvDowWd4+O4DnFpuUW4n8I05f/L3JzcQoJd14Tdv06SnuYT7cf1o8vfdD9/jp9+f4lX7SppdYd9QYpUi3K6ibucaS8hjPItaxk6anKhLkweJ+HGYXwT7IJrpecqU9kPKvJxNia/KdPnnoarkvJdJP33IcpWLueGzDMKGRs44ynX5M2SCbUPLPCrj2Qdp9AAIZsraWzqar10yvwaW0WVeioFlR3PNfIcxtuLpxefE77IsUO8HpDpID/PRrQ/x+Z1P8PHtBzgLtwlBmkQxXgHKnXHg//0mG8ArX8u94XJp21/63Ndiblihwnn9HOd//4p8k6F8aysgzHVGu5/3QrgShpGZ/gmio4Aj10+1/QMKDik63QvufuNgtTPeVxnlbmaGKPGJGj/Lfpb9q6yAmPBapLw13wRdtHUk02NrPepKJbu8x4ztRJo/QbAp0998BcRolXeCD6ApM7P3x+MK3Tjfh8z8XdmrEIRIKeF/AAAA//+cXV1rHFUYfs6Z2dlJNmkwUGKligWtFyL1I7+kV4Lif/QXeCUq4p2iIIJQrbUxBrs72d3ZmXPk/TpzZpKU6Ny0pelmsz0f7/u8z0c5pSvQpcgLSKNYqnqmk8yQvskw8fQj7W2uu7fIAtY2zkqZmJZSePNkRS95W+xGAbTM2cJoGQkFtnjCcU4zNa807eDJq7rbm8YY5r6vaAkZHhGK1lxeYuYdIyshK35zwwWbbE29A9h8wQnrgdAi8T1QSmoyMQwJraFpyFqNbIwp0XIjW6Q8/aAARcgmfPbv2QGWzZxmg0miOUr2QyiNATIixxCEUPRY4lUQ9Ahg1FK9HUhD0ioaZfR523D2Pr0bH62WOMASBC6spJDfhh3Olucc/VcsgHLu+HiOqdW53WPuEOakvsOWjWjIN9rPK1bUXYYtdkFo8l59CcS4Y4zMTVkPQ8TlwF7p+1z/QxrCOa/VqO60BkjlU2PTvBnNvzT5gb+e3sZslGyP+IzGJbmr1zNkeOqpF4NJC3hqWwwGSxx9RQe85mR3KvmQdSSGaLs2skbQ1yXrjDgHX03+KNPX888h39MaGs9mQy7lSt/0kOUVO8nTldlu0WxWPP2l1zWe1zQqcbSfgjBe0vrSItRoSiwxSIyNYlTsQ42GEn2OXdvHGkJb2/a1PVOPZe0L4KYmZnxRaROaTaVsgklnF4NgVGbRfie/ECq8CPCo99B0S5QUcYgS90/fw+mjj3D21o/4uvkcz77/RS2ZbFbtkuOwIe+ssaRc6Qg8/uRjPP70M9y99wZ6SHHlMtp/yAseonESKlw4Nv37jjT/v/+Mn9ZLnLkOjoo21RNOI26SP/Yt5Vowp9oM8DTjvE5psdRApUhVlVGw9t1MCqJPkWbcj7drzClOiz5dKkm9AAAgAElEQVSbXcQ+fTE1gjSNjVJscFFqBSftTYv3o6kK6TADlb6Bo7doSkpevp2aRzFwq++dad3QaXUoEuPKgG8ohZyJrtzIBHH/vtUnM36GRITJRGp6PGQTCKaZsqRtcD1Hugt6PTdkgubUrLdVBoAl0fQKgmK3RrFXK3NO70aNkaKH9OG9SgrMdyPdWRDPAJ7+zYQVIyyfcBXEsKSdnO6bedhMdZgEXHaaxsP3j7oY64ulSQziYKIhEzc9A665S66w2uRfZRGkeqbxXWGO3IFBEjoznMZp1TRpZBSuR11W2Cw36DYbrC9WaP+6AC7+BtZbNjNkdgSx+sgsLlY86SsLxzNJMhIr2ogKHbqmAdYNWpIHrC7RvljCbVuEpkFkEGAHTwUfrXm6V7qYUgN8HFgbUlQCPU36C4e1d9jR4GJxgHhwgNkrh/B3FqjuHiPs1XC1AAT983+wv9hDVzpsOH4qIlxs0MSIpp4BdD4sKuzRa+zXmB/si7Rgpn4sXZ8+wt5LQZpnZTOoDTXS1DPgZfdF+j/LaEvTs+dlZxFLKDU/vciQNgYfGCgRsIoa747YQYs5FifHfGYRUyNss+YjYsQYihm7hZs5cvWPDvtHh1i8+Tq3GsQ4JTkAgTeVgmRuIFIn01ebqk6h8/+rec6Jz8+f/YmnfzzFax88ZI+gLTUboEz/jlkAHPNX9Eh2gNHkqgNTK2pTS8Bjr5JDrmXNUVxBvUqbezPRvLL7vEuSRU5t0Ebf6qL0/vuQpLkx8xSRhKmx4Vn6rILUdbPocTi7gw/ffh/vnDzAcXFEAtNkJ3ezhG3cbELPj5azHkr+9Rwv8OvFb/ji2y/x5PwJ1n4Lf0A+Vp7ZwwRIFH7wJeoyBqzXuEszj7MhDEtD1YyZ9jWvWS8eN50ab0J9i2xwZ2a03PMEAQKoPiHAq+JUhCFJx85++7PtF/q9MCbk9a0vsr/vVfocdEjG0eG7CYMsSy7j90jAnwvZwh207BXFf29q3D+6h9MHj/Duqw9xUh6zFGBqHjq99/7LPvCJqpoN72D+GxIdvsIWX/3wDVbdEq6UgR3LZ+PNvYdJ1Yb+QejyOSPVGAJmtmgPSxnzxB01HbcejR66O8lg2vaHMX8t5z95FGWpRAxZscSdZB+SFMFS5ozlwQNxNhIkqZqZMQugaj8X1dS7zH/P+ubE5KY7OET8y9m17MZRRNHT1d3TM+OxYwIJ4iGhKImEkGAXwZIFP8EnIL6KHR/Alh0LFKRIQUgBIcgiCSTBibHHM/3uQvdVXT12QqAlS448zrhrblfdx3lkcYB4tdMZb4qCbTbCUSxJUaVuv8N1jIt/+zl3AbMsNAcoIZnneVAmHP9AN5nQDpETwFjs2AclTQHabEQIoQ4blbNuh5PiOoi3BX6qNCSMa9NHEMoJ994ErHaSZlE57vk991YrRjcEaPkwhCC137P3E4uTTu+h5w2Y1ysVVeFBDzDz+bQ1YHVQP1rMnYM8agAIdWMIGzB0ol1Xraqta0NmxwfZqBUxqsLuvddk0bpJYk9oiaJoRySZ59yeJjJPTo6RdgnWB2forr6DfDUDyYLELYTA7TfRoPAwKgTJOKbyKm4IUJf2CBtQr/v3owf4+Y9f8eDZYxTLTKBW6nvdEUSwF5Ew88G8CCpvzQJR6E8mifbu1Xd9iB+KzTkVjjaV0OTXighrwqSRmAcXrW6YQI2sgOK15nyzGZ8hF+lwpMk5ITk6DDwV+RFs6UXX2NDRuEwGlG2J0+oE8wUpwC5YoIUmrTzn6b3652uTJJHPwwe/6+nlJb3gNGPTVzgu19g02+AJzjBPUvj2LnRMndttKKWjQIq6X4QGo3OT+w+oAT0sBz/aKZodGHYKWqaG5AaPO68JMb6P6kZAbB9tH2QLPOWEgykVtaAQSJyUikx2shh47TJqQpY181AfPTzB/bs/4fGjx6gwYJGkXJCm5oEfYi1CJ8wSfPzZp/j8iy9x9U1KOGe8tom/OMkxJep1muAIwI9Y49vj33Bn8wintKa5Y9sksshh6NeOHoNXsSFLzF50BWEvhmy2IRahCYIsrlPoaAo32PRPILsEPx149GtgW9lHiHf7epphvwdW2xbFWYv+6CncukRLQjdNj/r0LIjDyfQw4wkGNcK6GdAfzNGQTzXRwJZzdMUcHVmH0cHJOi5epmGJpOp1L4BP6GSSmi5ZKqKuLF5YV8qDHRfDehdJxCWMP4+X0XH+7SqKQvmdkigiov9Ik7kWWGwq0PaQhJhKPb2mqvjfOTWJFQWQMc+w46k/QaYThh+qkK3aA1E+kmgT2s4Q23ucn/aLEquNmI8/7q0uorMzn9WSWD0/nIvWhhpV261wRnuhjCXK5YcNH8pS/P416SWEj9nj8t+dp5Mz+aVrnyg71A+B0hNhBXhNSKuHJjzUfKKC3LUe9fEptidb1M/XwFmjWO1e7T4KJPkC+TxhnY/9IcMs6ZDTs93UmJdb9MdrNM//RrKpUT97yv/vsCnhqUlctYy2WrClnxRnTgtRplubbaDdQqA6qHZg2zH3lmKYLAYb0hugRJC0MSgWSE9mtYf80gGK1QKrq68hO1iiJ/EoUsM+PERTp9jQ9L7NcXrSop91qLIKJW2TVPgvZ1jsrxhtMNtfMoXCMaxbbOC4SEwE3hyK8EgX4r80zGJ66KtcLL47KwR+rBNo7yOV7L5hFXbLa0jmtDjYw4rOlbZH8+wMjigDncTuRa3pMCl04qFOG4/bv4S9967BtaQZUKB58id8uUFBlCeb9ksU8+/mhvh5xft60WV7j2kPEl6nL4Fvvvoa19+/CXdlxlQD+mLLPy/nvKCoPLscxPk9gEne3qsNJ4AA5bfXDIPsi5ZfV1XJcRBffTfC9o1+as8/n81kL01K8UOjr5sWZIJMS5QGfMEitKTDscAnH97CjSvXcDk7ZM8iwb8a/fXiIo+e+8wySdUEYLQyj5VqPPR/4fa9u/juzvfY9jXcMkebDJhncxEbb6H7hKDREJykxrglNAhD67V24CItuhGjddJwidBzdDaavTEiCiI1SzoVqeb8aUgCwpO+uiCa6yfIpXiISt/vLZf8OdBamyh6pp+Z16l2fMUccq/6SmH9FJkIRu50fI4Wixn6CoyWXA4LvHv5Ldy6/hE+ePsG3sAh55MOftIQ+39X1LxR1GPcBIN6/5cgIcstfrh/G788vIdq2MAtUrRkf5GM2ibnxXs1LpQaSHuFcfnNPo9cRkSEVenE1DTmIfMY3xYLYoc8bQoIpVDsGSUWZLgeU+npPojGYShrigcbOtkeN4lpbvpIjszDPWoSRM9f/P7T+zQB82gdAPwDAAD//5xdyW4cRRj+qnqZmfaM7XEkUEAiSIglICUXxIUbj8CdB8gjcggHOLAoAiFQkFACimLAI2K7h9lnqrvRv1R19eAkMnVxZE2sUXXXX//yLWkdBYVaC3buDFVV4BsEWDEnITtJNBQG3+Yj7SZ7X2BRaW0C1ERgozTBULG0iNNolCuz8fBU4uXShiStfYafxldaaEnSjk7AQdSMgG21BDxcwxfY/NBcq+4c/79Ghfyc+69Ei+/MeKVhKXK6KpEhYWYofj90gLyTAP1tOvQM59fi0WsCsEgOWiQBFILfXCGOhGjqSYHI80d8MyRMRgmOlKmAICWFu67XvxeXYMsjp96famORZ8qPVG0IDtZsz+ME7sW2UZafqVvN8Pt8gfKy5O93VAwxtD3sr6ZpgpiUnyD5gn/FNjsCLKVp3WI5xXQzx+PJU1y6Bf6aTrBiAZuGO1zU6GFOlKlV4CILjaKqqgLqwr9jfl99Iym+PGh/iYfLGgxJFsESTeBasRWI8r4Sfe/oIEqwTUKx2YGdqy0lF6pM4VDkQKrdurQrzhgnRd4HVtRg05ZT6yeaZP+hFIAquiRk/FWHaTo1JXbVFuXiklgzDEfa9IcYmAFDVakVkCc26pjaMM143qKkYwsRz1nsNrhczHgaW1n5HsxHVoExr+R81QqJiU4qoUW+/N4Gjq6/vILdkBMqkb98PfqlwznVswaP0DGtVkaybxMX8btoPxk6Fzmd0NnhczsQ2CIFd/o8QfPytMd83V5tOfH/9dsf8ODzL9BbVHyaKZHsswWXC5tKYSLX5GRjgdfffw+f3buHt+/cRUPK32o3GK94B6l4naFBCYOfMcPXi1P8WP6BWa/GqqrZ6ostsrY1ozR8p7i7uk2TlyXiLlJMN6owD03+WVistiEpM8aFyztlT/NaflbAgTM4oKlneQ4zOcf5o1Msn5yhfPQUrpxjM1+iIWg13QeKhKrlxeAmQEraLcTnP+7BjAoUN07QH5+gePU1NMWBwJyLAdBL2NeeIP0bsmocZNwYqQkpkLCnKRzB8Qjpk6bMpmCf9khgsbP/z9me66AoOvupDUZow4wLeLjQCGCED92FjRQ1TgV3ofxbp4Ksld5rlLQIymXLYkFeXIjOVaBzNHU0legKctZ7OhM8IdJkhHKqipvYYs4kOkHoNCVMlCxxwZ604pBQjQHxXHPISCCwEicdv4fCIfCCnXWg/7Vdhhcvidft/ZtET7CqjArMWvajJqpXVe5QrR0X/buLKTB5Jgpts5UI9EEsJsm+La0tRnkOSzGYGkXrLdL5Cma1waqcoi5nOD97BvPPgqH9CX1uvWTYOU8UrQqssSaGU+6xniW2OFNkUDQhE4vU9j2kgiYJ/G1gRPGaaFDE5d86hui7yxnWp2cgjfmSGnD9DPbwCPZojOEbt5CNxzgkr/vjQxwXGbZEx0gNawnMGgeXWyz6UwlORQ/ZeMh0AZOn6B8WUmRmCU9Id/oe4X/5x6B97vCvZjeX2j9XPMXMcimCFKrPiLbQVFd1ayrK6N6s16I8PyowODnCdr5BRUORyBDgqiZSo51wvleMwZzizuEIwzdvMZaS2B+7ySmS3RL53uS61XC4XjNkf3nef/i7ivzq1cB2coHv73+Jjz79BImoLbPYW+07+OH7twKoV8UnyudiBKvPs/2eeFcvpjZmWRjUQfOoQJ+N0HixJhaj7mzF8UfyXZ1CGqXmksZPkl+JlqJzSrobd9/6ALdvvquwf5n8S8ujeSm6lO19VdNIiv+KC8Yny1Pcf/AVfvnzN24kEzrC5ECRFsj7fVBP1bBdqmGqa7tftpPHEPvcJj7HqDoDR0FB5CG/9vGX8m+qocTKtmZ6Bel1sTicPgueTFONpblL3LwxEVLKRnamjcL/6ScJpLOtbAy/17rH6mf3h4F+xSeBmvQ0wKr1vV7O1owq7mOAm6NX8PE7H+LOjds4wZgbm7TLnAMYnwNGQoPXWpqb6+TfnzCPBTfK+b/ADD/9/RDfPPwOG7NEWiSskSIgzfSFMmQcd3Ug007/W+SwKO8rJZjCLNNU1dZWh04eEe0RwzFKgG1Wo4FeoOwZucMFndp9vv5e5vdEkXLtL0h4QbRwZJhGqLNWG4/+7RHd9P2koSfUlKaRIVCrp1fDWot/AQAA//+cXVtrHGUYfua0s7O7ORkbrCBIa29ELOiN4P/wL+g/FHshgiCKEhGhCsXQJjFtzofdzczsHD55T99MNmku3LtC0nZn3vnmfZ/3OcRWUFR8puuEDoWsNYE8QDYwUiZkqM7/gnB023L7IkbvY/Mk1w1ehDZdz+feafFmbnTLlHJDPeKoNwQvvSS6gm/VW+g2hcycSutK9O2UAWnAhB+e2QSjixiEbXO1+aJrkC9uamArjd+zGD7/f2kdUjLeUSq4GUvZAykDSsUeAEJTjmQ4IdqW/oygoZF3yuXrVNc+cs6o5nw4KGpkhcDjMlPwnAdHBFSQA8kikOIo9pRKvqeV67bcPS0SFS4bSfQNL8jApan4vpEW3xmlqxGtK238iKp/WU7ZjZOMRFxv/u/fp6Ct/TZQaM0N6rDlw/mPF3/h1ekbzJtr5PMrPoCvihmCJEAwSHjrGCRCZ6QGSfwAQv//F4lFrM9Mp6mKY0NVb76wu9pdepGrURHVrV2/Wun/VoeJHvhsunUHiwYKWKGHtnJ9NAKyRNr0M0DVA6NqrUPWztW1984wZFAAuhaj0YgHY0EW5ef8doRMxSDsk3oxR0X+DtUCR8cHGEdDbEzWMYxTjJMMm+N1bGZrWMtWFQQIRTd7D59T3IND5K7Aq+MDnOSXyOuCD+EFmwGFUm+2G1lCH/tAmRli8rBC0pPQ5ESdYzSj5qylUjYFgQRRZ6Jjm4xOc+q89MakAUY95MjFJfMdSbXo/mwMj1YpwmzyE8ihLWhxiOt5gbXVTZYAl4sC42aIy91D/P7t94guFpzRbbTlijKBl5BoAmbm5NC9tYGvvvkan33xJZJ47H9nuQGEsqPpFlO+yBQB/sYUP85e4qfXOzgLSNedknQV1aLw55uX+Nzxedv23wAZ1glqjSZ2phKdsRL9N+v26QWpUUhhKHFI5AGRtAEPQGkbIKM4ojzHSu4QvjlH+XIPR9vbmO/s4vKffSR5hawJuMEdGgV9qfxMm2rNcROLNrYIAkwpCzidIMzGSMYTRMMx0vVVRLQNfbCO4cYEzeYEbmOEejRgfwS6VjW544+GCCYZFuTrkA1Z9sl+B614T1g98FnVfymrf4XFgd64fs55xvxbrz1nXMtw63qNt/P3rEuMccpA4HdEU3vavviKCNuFAXt9rkrV/Pfvr3yH8JZxb6vO/NAmhhtUcrgv1XhXPSTAS2IBIrnBScSdn5sJk9hQXTjZHJGEx+JYWWOp9Rjpcx4oMwnWrEdqwEfNaSPO+EES+9HA6SajY/u4m0tWAkFGEgtWkgkunQmtaI7pzJ2kK0gKh6yJUB5dYXpwjtnuPjwKvXAIyD0/jpHFAwaEItLtzgskeYlRXsGdX6E4OUNzNcX85BTt9QzVLMeAvic198TEowarrTmnPqTvxSZ/MlRo2YjWHM4n5VjIJj37JUerip6amvyyESARXIutGNo5uWYEasRBwyZSKaVqIECmvhXkjVGTY3Reojo+w2xnBxgMEQxStGmK8cMtjB9sIt3awmI0xDtrq7ge0PsnRJ2FuDg/BS5muE5PUEcBZpMJMwpGG6vMGmiHMd+fQI1loUOlHXOLXu31GZ6um779s0KfwTD1W0+LoBSpkdQN9U/QbaeB/H13dHvORPcMZpKQRCrOBgwAkIh++u+RgPhkDNh7LOUZQ095D6af0xaezpgp6W5XUkwefcB1T8CJOz4E5peaPc+2b+rnon2rkpWX36J+hrxnQjFfGKfmmOwZYmU+b/Hrsx/w+NOPMHnyPuExzHbAEmhgLB39V29EgHrgyW6W6v/pTBCvqVq8QzTqL+yxk/RR4+9HLFiONKN7rSzfUo1N2ViQfXxC9tWqFQDg3pNqm7Tm9J5RbyPyjjKZUjHL8fmjp3j64ce8XaZuMVFfiLa3NrrvQ6crm2+q3p+YpNt7f+Ln579g73QfbhxzJC5t5umMI0i/mk5ZO0/+I2Su2Z1Pzm/X7QwWiWiryWQij6Mzl8ydqQfiKHGl/9uCwnoPmYMK71/B3hZa5wa2QJNVQk1KKTXm2jyheAD1C5TW3x82x226v4t+z5aMidLKo56prX2MLdBoOlBdFhitZKKZpyXtglI3Ery39pAN/z7ZfIx3NeovYgFk2Fvbw6f4/7/PbQGNAQDE4shR4/nFC3z32zMczl4jGksKQ8tSpxRhQJGTIfuB3ZWcI8B7l2Lk5Z62yKZ3rDeuNG29zhV6rvUZuP3hnz7c+5IfjvahBh6Y6TGb2RtYrr/P/mUGgBOQmaY+wpZj6guK+YsZQLCIY+sbDGRjY071mLO50i/NNIaVv0Pd4D8AAAD//5xdS28bZRQ987DHY4+bNISIBlpVSGxAgm75AYDEolt+LKAgJDYVSN0AZUOjlqpNIXHs+DVvdF/ffHYerTq7KM7EM998d+6959xzYusk0QNF3QM+mXaVuNOAxinrWxJpD5Ig4HCsAJ5ZiYUdYPZytc276+bhZFwFLChxsu4YlA65nUQF7Pl//dNDMxYbMzkc8LpFEZpE6VQacQXtrPWKZnhJRlk2lxI3s/CTgqw7HxXG5s8Ib8aNEVil94iFXOkhmpUWk5FjDhha41gXtJkbQd1tjsrOxx7audxD3x5OBCyaS2KFdo+jJnZ2gnb9TBkiscZQkFpHoVf01j+/KYezWnMI14elLmoTq1o1ecduw5duzTyhl1ZfjmqntahWWEUVnk5fogyJblPwehaxvFwST0U09Cjcgaroh0bFYkG5gJHaLMvcM2ZWWuYMYesATVBYyd6eDf1XpWNw9Ln4pOcpUhHJOPH0Gja0NKTTVuaF+9n387dZL2bdVNpUobkd2of0szZ4bDzeRPJYQJMCgzYBQhXnCtSFYPuQeexGA2eInESCWioUlpgVMy7a+k2Mj/YO8cmH95GNMoNavdmr6w/SfljVOabVEtNygTZuWYiTZ01ZhKjZ2A83HVTgW6C1WGFrKT6rERdEHBiJLaOUfr8heOn6axm9MdZG631+Ow5IR9j+Tu8tBW6yhCFV3H6P1bxJGDQv18xAyJKUabsX0xl66wA4neGPH35GOFkhKrfFiUIVu+y+56pquJD/6uFDfPnN17j93sGNqAblIwv+m5DV/p9ggV+mx/j17DlOgpxRvM534XKjy2febF87cLWFFz+ngThgBObJbbG0ahDRrF0llnP1fIo4HqBHTWWiPaLCgBhbswXq03PgbIaTpy8w+/MYk9//Qv90gnRd4aACBq0akjUq0NR2qFewkZZ761saUi+yTljnqM8LVM0ZKkTI2xjVIME0S1AMI6T3D9HujRDvjVFlKZpRijpL0Y6HWI56QD9CvjMC+jGaWxmSUSZOMhR/DYEItBGxPee4hZ6/zbHB6tJ5Wk7MthJ16/J3/vS1izGViv2JZkiwsdf837snwhtD4rWtnXKRK9zLMlDlfqlW/BgrmkCVJkOdJR9YpFQ7VIxSR52Hso5aXUUJ7RDF6xP6wDXj6jd/zs2oRyLqShRelgyLkFwAi5MZTp4cA2dL8lUDFjnry5DV2U6aIliU7MwQ1XNgMUd7sUA+mSKfLfDvP68wWBUIlivEeYEBgR287tqsYou92u3g3gbKFmyglhRt+nGfv2Otg2VJKIyDnurG0NsjJnQJUvw7TaJQRSZb2R+h6raYoGPcqsaNhwpTk53WpM5pLGcuyParF3hNrK1hinh/H8mdO+gfHCDd30cz7GN3d8CNlLwXIO9FuHh5hmqUYj1K2HEAe2MkO2MMRkMEcciNQW7Mkficsi43Gv/WnL2ieBPEedMS1N9NoY3rN62bAfbnzLEVvxondgfREKKRqGGCeDxCPl8LwOizAJTtweViq2fwgOmCbNLofmYJxvcOuRivrGG8JvHGyvkAWKwKOj9jucZ3AUP9e6TxkFwcJs9P8ej7n/Dt3e+QDsnmL8aakXGP5n/D/zOWg3/v7P1oOVGptmTGDuBCo9ScJtQZ/V7sbLbtc8aONOajFZ0kCmixSpwvm05cOxKR8VW55Hf2vQ8O8fnHn+L9YBd9fQvYeoVvcSN5ZCwIsCLxyqDADGs8evYYP/52hIt8giYNESQRGmb+EVofqZ2lrBvnr3VX/ENBQbMs5nyi1lqg8rXRIgc0to044/h5OMV4ym2knlLttGZLzFRdzEQbrbPpZiZvXWM4HGE6PRfx81Byy8jVZF3WYZpu1hTwRwPgFfx2+LRzji2J6BpRjkqC0r0iwm5yGw/ufoEHB5/hAHtIIUK/EWwvvjvxf2sFPclka4iJhsMMK/w9P8bR4yO8Lv5D0StxazRmlmuoVtJx+GY9Eqv7hEVH7xZpWsvvKEcXMVsev+3L6LoV0FLDeqxbHn3txgBE9DsUZrIC0OJWpUMMXtOU363a4KHamuKa2drzeILWf/ZZd4c8Rx8TerfnkQAMEiKkOoUFznXfkXYdXwOA/wEAAP//pF1JbxxFGH29TPfsxkYJkXEEXCKFA0Iih4gT/4EzB/4eF34BhygS+MAFIYEEipCMx+AFy/EsPd3T3YW+rbtmxksIdfDBHnlmuqurvu/VW+LAo9txA9SRL2ATow7b2IibaI6B5u9zFBfUhILju8oG8ah1IZBswqQxHbFC3y7YpuM0jTTubP1uc0QbjW6tNKRQNeS06HDmYtwWJHWjbw+aU15/wWwX0LsLOosxbHQhGx1Tk+2otGNGhTxE0demUPFGrxWKuDT7CLcp/f4w3Yq5P1q90Tbw6wZJRbHSVIKo0ZkuiC6k6JehU/YZiO5jhlYRg0J2bUpxRtcEBw5jqQJhd0IWPTl9rO9saPxBr+olPb4npO/PiwxwOYMrYSrZv3mjx5UDK7rLkUcXlFo2aGITB4OBAlaxyiXWARHnSUto7bONikCYZr6yt4Isbo0+JxaDQH+psyLe9IeEALOe2GJENtBWptbps0GDZAZiLqhMDaXJWeN/0/035//QiyFco1QG/nvWImeNHKrI8Yk0OC+VkHiHPhV0WvREDUvijhMKLvRK5HWJRbXEbJWhyxSlQqIo34ISTRss0eEiNQwlV1QD0fg+epIgyXj3jGG8EyYrNKXIWz/B9YffCPvAgNMkANbd0mLaSRgECC2mjcAIzoVlRAzjuIs+HF4dHuLo+5+QLIEu0WrL21pXaSQzB3z87DN8+dXXeHjwEZN8tcXjn7T5rm1igRiBXQL4HQt8tzzC4XSCSbVgx166w5He8/oeA8c3GbZZSQSmRVKG/EwSGbMmkLQMEZPXSVZgHKdI6BnJVsD0Gjg9A84vkR2dIv/rH5y/OsLy5BzhvMCImMQEQImsnIsIjqB0VbNqmHu8fY+Yr0hrYGitRKBQC1FK2dGe6X+OwaliXiBfXGMZOuRnp6jTDoIxxaONMT74ANU7O6jfHcA9GGO12+dM4yKqkV/NkadXSEdDztmmTPWa9kcCCTmXfntDvne0eUhSJOscLtUMjzdv8mUIQj3xWTV7hMzv1oQRWoQ4PrYf7+QAACAASURBVGXe9jwx9B8qUzK5mFPTWWgRH6vRaaCsCyvceY5rMSuSvoqbfqYdKo0wMrZc2mUAGRZH1LB9ZN2r1NX//mE+Ok6v1c2axttGFLWnWkZ3dFkFN8sRLAKc/HaM+pRQgIpiZYA04Sz9HTLbWmYYXE0Rzl4ju7jAfPI3QHK2RYbVdIY6y9ClQpAAc3WQT3yQyhnbxzUyvlr9B5opouwquzqkVyeeJb2eUi2WVcFnlUkk86DjxEiYXL2zZYY0SdlsVVj4rQlzs661+IC5ETV/CDlZgw58nAJ4NXYiYBgAxXKBxZ9HyI8nmNE97g+F8v74PQzef4S9Rw+xSCMM+glmixX7nBA6sSK5Tv8SeS+VmMEHu3C9BEFPALP4P0hjNlmkgZ0MvOVgtoXWcQUfcnTQGQ2QLleYLcUNsFOtv4Mz2xwzYFStQOhk7lKO/pSueb+H0eMD9kdwx2OsJmdwF5f8ug5zMJykSdhT8JaNv/957PRTjKEFBPjl8Ec8/+JzpE/2cY0CUSL11yY4+SbDGIcGAPj1vjDA6q2Y00jZQL75tMltGRDokIw34dxyjmxOek1tLZLUNqbZ/JFonRsOB3j65Cn2u/voo8dcGN4T1dw4VIbizfnw7aCUmSwo8RpLvPj1JV7+/AMWbs4yq253hJyaOIn0QcJApyS5rCJ5LzZPdu3/5bQsXTup/ov1wInWbetf/OsmJXzA9TkfUJEKkb2WJOkoZvZWJAkNpfgl0CEMPddE4ydvj35PIqivp9fMNCPvsflMks9CjSfk+vAWPyhjxlodaWNL9kKHS16dSc9fj3xDiKVeBEjjHvZGe/j0w0/w/OAZdrGDHmcqxLwz43+0/jajgrX72RrwRqr5L1Gy7v+PfIJvXnyLk+wI0RDMSuBmmPbVsMOpKQoZ6z252TzWEtrM+Nt+z59JmaI0d6kfns/maylvzADW/qtheXOv55n1NUwPYXc3Hhue5E7WKHlvZluaFEcjtQdpn+fCpo9B8zk0Ttu82lalyLnZcL8sMRj0vRpC+hPqZ4IgwL+cXVlv3FQU/rzM2LOnS7pAJQRFlQCJin/AH+CJN3jhLyJ44QUhsRTKM2qphARNojTTTprOjD1jj30vOueec+06oVS1FCXK4ni5y1m+JYZ0zogvwarChAKg5JBEiWTC6x/Tz2jAukmgSsRNR5o55HXlqx3cfa8cH9Elmz2vXug8LHteGIGOgcCcmwEpHeeWentXlZ9GaSxQSBX20xcLqWhR8q/nawdJQdiUdyPxs2Vv6tYi111Ga+m8OE62Vvp6fG/oQEIgojU6oPwCqZWcjoe2Qjo44Y5cwkoWgJQU5VkuSIOKyC+iwu8UcVWZlDrdWZYLrDwSb9UOrD1oNGvp2pReQJeUJLHng8F3y1vQlNCJoRhRjWeBNxGb0U5RoDDtwHSSz/OHuYBjSyvxaJDwAjkc9VEWOb8XsjUsausrbqE06CkhZLhVC6KqXapYkkgV2nId/kjU/xvthUb4xgjFwom+qTq98xiOXRFJOvmqAxGJtgIVb1Srge7bIxO6Yyd8OUDmxF0qjFp00OumSUr3NRyN2LJLFWBpE9hJgUMVZ/GaiQh1hJQnT9adcT9CSnZXpBwdifPzK5RTuwclWmT1x4JvQcUJDXXGgzSE2ZWv1flvBxSuA+qC52ScsIglWVYxP59QD0Xpi1YOxtxArQMJDlyC1CzmTrjTiAXZyxtgN2FSRIHy52rmWIt3qg2ZwkRJDvtPJxHycoMyzzC1A2R/H+PhD/fRX7vAsmp1WJTX6/ynjahqA8lsD5998SXe+/AjDKPU/y4uCH2pYLAkuz9Y/Iklfl4d4N7iMZ6EO5RkJ8d2ds38dSI+r37+DkL9P0VO9WkuK1YlTuk9bGoMIstJ/8TukBaGYdLV0xPslkucnZxg+2SO9aO/UBwewz5bIyF49bbGNeJ8lgYJr3V9FlirWLDL7UMm7DsBN+H/0UHaARE7HsZNN00q7gEa1fS+8BDBLiHE9e5xKWVH84toN1uDLFuiPl2iTs6Q/3OKejZhakByax/xW/sAFQGSEAF9fzJEcZajmJ8yKmB47TJ6oyF6JI5Gcz5y3FKmo1wYdl9c/OH7s9ZDgGOxRKu0M08lVE6YRX2aFbkdckuLgdzdynNGJ9BewRDUulEiNmqLKlQ1hvLuKt8hom5tuclhTItSJmsUWxZFjQCwzlFPP6L1NU25uE5r1TbPmDtblk50EC0kHWerBEF0PAU/1/5z1HXU5LSJKg7X3Qfpz8PK2zS1CL1jQ1bnN5SsLnKUh8+xfLoC5msESFirI03HCMIaMRWsnp3ALhbYPD/F6vAAWK9hliuMyDqO7PRlXGkHlvn8tpnT0O4sdRBtKBffKjpK4q93rdJxZCNbcPG3h8Fshv3xGLPZDLdv38ZkNsXVGzcFG2CwmC/w2737ePTwAXa24MKjMuysFgECI64ybpdXBX/fiK4cPSMWRxLVFyCqy4CcDukpVwFsscLmbIXV0TGeJTHsZIT05j7St69jePUSLl25jHK5ZRRNvq2w6WUw2Rqr7AVweYp0NmFXgVAsK02rSOH0nlTjxp4T1NQCgEMSn0e1WRGLhejAoLWHRB0UHI15Qm3x1wzVjpDujZG9WLLQKI2XyDQdRo8oC8RylsYSvWtBPcb9GLuiwpq438MEwY3rGI+niKdXUBwdYT2fI87X6NmKnzE3oWxDc2mPZ31faOnutG13rRSZ6vOLCiM8EqImPK/x0zff4dOvPsf0aooX1QZhZF3h9M1rJ562qNB2Fdpl0TIV1WU18crHE05kLPa0JNYlIbg6IYN7sV+33LkrgSpbD28nxE6xKVmE74Nbd3Bn+j6m7KvhiqQ102ol1unEKL77Ls+uEh/8gpP/HN//8SN+ffg7MmwQD+l6I+TFFoO9PQo6eDyyMxlTdYzEFecfoKmNb6AxejlfO4pOWystDL02kXrvK+XWf64a9yMVNaamGVE6VUCdddOKkh076PlQIYDGIMUgipammJSaVooU2O3O65bx9Qg9lP52MBxysk9xsitaNGOzLdQYsCU4UZks+nWCWW+CT969i7vvfIw9TBDXluNv7wyg78L9V3eON+L/t3dNQeky598wwuVxdYCvf/kWT3YnsEnNFD16Vtk6x3gwkflrOBF3TczmGtqxphszDg1MCbaO9XZMyGh1Kp5ToYXh+G6fpMJV+3z6mdclWYJcEd05aPAcabmnUL7gb4y/6fZoJzj4cszAQvpCQ+4eSp1VlztGzYq7kXM4cOd1Ip5b/tB4OAgC/AsAAP//hF3JjhtVFD012eWy3WO6O0oiRQERxCoCCfEBbEFiifgS2PI7iDULhFAWSIwLJEBAJiAhIel00lO5a3yFzr33lctRC7xryXaXq957dzpDLIkIPfydToOzZGK2P63Ea2dCFX7BKgSo7gtodqlbgwRJUkIuZKhcKnZOQvOcdDapD0KdzoqP7aD752+MTzCY/PDmj+lD2cOyXR9t5bss4fdQG3aHvFp93dihw1Cb6GTaw848FLZP/MMAZ7aBO2d+pP0icBYEwn4SyetgN5mbmQlxN/Rfh7dkMtHBAQeUya0oqYY+QWuEAyxFX6JcaTmEOkVDsPBh54v3EYPguNIJkq5PI1McTii9cFUvIEhRvabF2tqaXC8XOpMNNnOkKzhKtaA3xXd49wOxqdDfKtySeCxTNiZ4UoAtKtF56EzsQzrlnLQ69UzPixyFKy3wLwOsXpfC31U5rLXOtj4TitGtp5mILe2XJ4pgoFf/aSHvSceZ3VANpHIIWqEpsGF6KhP+M0qVY2MTttioIF5Uz+88TnabIQVg0CkbHgReA8B5jn9gzR4v0uKWCuEslLgGY7uXbhAYYEHVP8/eEcC+23fOfZD1G9d/3lNvznu9OP0/7xV1OrXl9Y/Y1ScnL4gwmmQII/LyYn1eQqf6Pw4AO8Yl8vwUi8UJpuTeUi02aFEUC/UbPUdI098vDK65M8eLkdhWQukyFAs1u0XJoYX3rI0n7j8JxKYNJuJ9YiXuJ5s2IbbzzV9vFKjAZy38qxCu52LqegydcnJT4R17/QDTGqEPPddfqH6vpIMQ9TINRshy4JsvvseT3/cxrW2CNOg8S0EirsQ6y+BkoouAdz54H2+/9y7WZ3MtaHvunC8YtEYUIUEp/hX2/2X+EDf/uY3TkToXBM5ZuR+Kzzmsa/6ikF10rhquWzZSImsCMqiyqGTSyykJlCs6DRKMy07oDlNCGY8PkRDa//czHN2+j+KvJzh+/BhPHz3mIYZRUWPeBiJelhgfMKoNIm02Wq39cscgOFoXZwUKgZZVLmgSPrN5mqIuKhH+DBWsi7GgMFTtOQrU4zhySgGTYTabUrx+TgUCU9B2HebiyBCIxVPZnKAociz2A+R370nxEu9tY+PKLqrNNZQ7GyhnGaIslen/4uiUhwbSrXVk29uI1jMVh++4NiZSqJPX3/SK/s7wCYPEA5r49yhj07rA4IyneB56HQpnwn1F/wzjNJEkLhn7mGyuOsaJ90kQRWgbayyKBgcXLqfdkkDqlCWOFGoYGKRa4nIUm0DtsqjyDWU5U8k/HTTXI+rsSFVnhXGH/jvVDNu47kuOjU6lO6wUR4AVPCKglQqSkGcUzKSzY4MhCcWTnAJH1WktU3TJYyj6ShIJUSW1Q3VwjLNHOdyj58AZoTy0mIwwyxJsMs4ePUd8eIDi/kPUfz5AtX+AcX6KLeEym62cEzyJFRaDZkNvDxWsWF61neKsxFWFCtCdNgTicCzxMEQi+3UyzbBxYQuXXn0ZmzvbeOX6dbx07Rr29i5hZ2cHu7u7snfXtre1R0SIcdni669+wMcffYg7P32L2K5JWmBc4z1IdrDfAy1wlwiBsOfVi1e3PSO+j7oBdBborH3ASLvRUAmfYqs5qsMc+W930E0nSC7uYX7lInD1MrLtGarNDMcux1mVk7yN8igTWk04TRHPZhjNZoTXqaZSZ/FFpq+0rV0qfouqOZ0QiHxymkxrjAhVjdwaAysot8EEjU5A/ZmLwBrtzpqjWmQx55ptznFKLZdFIA4QjR/6+BjK/JJnCfNBp3a0Qq1grkZhrTBEwQn2ZIwiGomldHJhC8GDh2j2D1A8PcCceVl5gtAVYnu6WhrpMLu1syB0cY8M0ay2kTO/ciYiZj9XhjG23NJW+2kPfr6H/V/vYu21SxhtxGKL1nJPRHy2jZx5PiYOmy2Sz2C1Ie4a9UD37lv82xejfTPPhX2x3VEcUwYWTd9k9I4qCjuue1i5OgRAkWPO8nOj2PH/sdnflsDlrSt48/Ib2MRcXXOkCRr3k1U9Q3Uvtr6Cknywk30pCNTYIUeFZzjCZ999jh9v/YKW1tSTsRrWBDqz7qoaqEqbLnea03o7NmrZuFXnoI7xx2hSLP47U+L3KOoJB4Ftgwl1BQK125YhUxj1ouG+0PM1Qy9gaTB0TxFQz/aJoqcGheYQ6SlabUbh6vNHo0iu0ENtv3CYJHStMETOWmAc2Rmi66Aqc4ThCOlkDcWikEGGqzvszHdx49oNvHX1dUyRIUMi4tGtYn9XkbD/WfT7WuB/3mF2wbz3zHZLVNKcvNP8gU9ufopbh3fhxubDT6ofhT3jkdRyMrDw9J9WxeC9YN+LTkhJrIiOJFZdh2GDgOtS+f+tDJkToq9Mr0HPEjZm/KTedEtYh3DNi/A2n4XaYdb8jihGOp5I7eVRJKSO9WvLcjDWx15DjndqUS6W9zai5XIjdss8IDjt54vuJ9IwIsLPBt1qWa+fOzw5lP3IgSVzC9FOaWr8CwAA//+MXclv3FQc/ryMx55k0qTTNoAoXSCoILGDEBL/AFdO8A9ygRsHxIUTSBEIhFpALd1oabpETZpptllsP/Tbnp/dFCWXiRQ7M/P8lt/yLV4EUDg8pRf7sEmIIEFHAPlvFqLjLxOphYEI5MkgZ0XuVSyNszMPhAah3GbrSMw9J90g6glDzS1hto3Mkv8o4O2HHuxmTTJXT/RmgF2r4GBdd38/gr+poj7TIVTAgx6kiQtCk7aecnkqTwWIPNei29XnRFQhVvyeBJmvSnVGkNepeZ7HiUAqg8VEk4yqgALjd95XNNWkMLWKl242CUM9eh45wFQHtWkhyIzwU2Z+fOmeoljwRQKo5oF/7sohYqhqphoIYX7oIZsUWE9Y2OVYQDSugmsnDDGLL/VJ6XdCftV9nvBc2WQxu5l/hi6KvFia80iOVMX1FNrP8FNNBhXKaoIYzqvlQ8c8bs+pI5JpowNYMYi6C/L8y4ADZXw6STYp2LUuKt07N84/HZCz52snC6So9AIyTosP4ec6yvbjOEgACdKlC0TFHdoAJQkRnjqL/x3j4fHBXU5Y7IQup9+pU8miKpyU/I+AR2eMWQNABSlDJEoLtdMJ/OgeVmz3bg1tylDd0QVg1IeijyoVLQo7nKEiugt43pG6ikg3L+K9iAKZpXwR/XGFO+t/4vqPvyMrGwSFUwqGdP1j3z1kBfXU4cLbl/D5l1/g5fMXj+COt5n8dAjuALiBfaw/vYdfdv7FU1LrJgtJpZ30VHTUf/cjpkEXjstzyhdGI1SstZBycWNyuCeWZHGCBYoZDkuMXITicI56c4z5/YcY37qJyd0NjK/+g9mDbfT3Zhw0nKRknCHSsVofBnZUjZEmBxCVdkTJl/6rb77GaPUFjA92sbn1CJev/Ia/rlzGzavX8GjjAQ5291hJPVFLP+r4Z5ocJK5u29SzeJZCyj1UO9J3Bs/ZvHIY1MASwe2rGDt3Ratg/84G6lMnkJ4/y4E9+ayXgxzTImG0xeTRE0wWN4HlIdLRCEsjERgrihy700OhP6WJirZFaO2EUR1U+O2csK5fu+PuLfLi2ItAMS+T1lfZuAV06Xm2h3HXX+9hlJx6Q1caKDRisjWj2LjYppBC+xylcX4D+g2MsscKsFIcl7OuQR+EiJqj5l0zFnjmc4tlX6Vng64CSpSyVFTfyylz2VPXR0ZnGcURhDDZm+Pg8Rj7W0+B8Qx4eAhMHeIsB2lELecF3M4TlONtlJuPsXXjJheweju7GKLEEKJDYSKTnCBFruEe+9X57Hp1mpg4NcKaczKdIotzdvkoTpzB2Qvn8NHHn+CdD9/H8uppnHtjDSdOjTAcDvW5WEE45mC2NMQYO1U4rL15Ca+uvY6//1gXukMlcUva6fT7QoWOnSDmgs6SX4tyZWLXmagPG/RLMO9IEJDHHMipiDGpMXt8HZs3buHg5BKGa+ewvPYKitUVTFYKPNmbYBpvYzrIgcGA10iysox0kCMl54dUzpipm/OrC6hKUUhb71C8/NwJxDK78RzCM8U67bbeI7MSBXqDDPnigMURmXDkFK3XmY+8d2mRRPSl7LwgEHmMkhoLMTDr5Rgomm7hpRcRk3DivXuYbD9ANO2TfQZi8oxn5EutlruVaAQ4EclLOvow0BJwHXSiw9SKrszJQWbrED9/9wM+HX6GXv8Ui6HNa9FvIoper2fxdaM/1T1L/Sw26+KwMF8Lj9/cAUxZn69PapE+VP0iyh3slVBJ7fNahL4Zts7NpFJRQzP0yfWmrHF6YQXvvfYWVpMzyMgKzxesu0mla7UnrAhEz5KEykkQcRt7+On2r7hy/xp2q30MsiVGW5rcicx7OuCauI1iA4s9qufEgC2NlUgQpfSaRnrO1dKZXxgs8DUekaoC3KEYchjb0J5O91FSb7BxTtQU3m9Iieb7qlOKNRu9bpEUJUwrKlHEqOmuGXpM4Ox6zijVgZqO1HSj2I1sMym9HhUr3PX/4OK7GGIROZdZYyPptc62oEQazNLj/UQ++W8uL7VuS1bKt6sNfLv+Pe7s3kdd1EjyHnq1uCXESnOAalEk1nyNA12noFBoP2Sha9bx7DxHGjrB2uBzV9HU9Gy8TT0n2VKU5qb2VEThOW+1NcQCtpL7EWKAGtT0PwxZz5z9oCIX7mMiykud/7bGiennUQ7IjWbVt/NNRXWL89a5gSaa7I+0PmktV+hlGf4DAAD//5ydS28cRRSFT1X3dGdmbMevyDEJFiBEHgZMVog/wA6xZJ/fx4oFG1ZZRBEQ8bCQBYQEY8U2seP4Mc9+Frq36lb3tMcGUpJlSx7bPe3urqpzz/luKJkAuJwneGJPXV6wZIVEh9pX/psTOf0ygXXRQyIdpj7zzHkIM3kT1TfppSnP2b/kNX5DX2hfRRTipRyH0PijqOU3p/2+zQ+ntXZJ00SA1x0VwDD3zgOB5AmJXjaRVczg4mHtmaF7/aQCJa4B30MegbekKNf2TCzuAl4U5UcyIAiqypJEFjgbqVy0o0HEtw+uDl9gRS791UtWeEOylpXKCxFFGSDJJqvRQg8djSzdFO3qvE+bzOtDqPPdK3OYjeegTl9iOBywxZwVOoppJFaw0C1nmTH63DVp87ROSCGXQ61VTd3SKm6E/zM4R5UXFnZUFuj1e6z+R1HHTpIcl9ATi17+ukb6lKhK7qCRl4HDtLN1kTMkdWKaiDFN6ujrXOMSzaGWcaG22yOuntdyYKgJDc2/yTnrNOGNMvcadfRRBpqQUyicLgB4WKZpbGAM/H0kjgnOuE1pUadq0D7T+L5/gAfBObfBZaMJwZNWpQz+IcslOUgIZMQTaYAgNRjvneDHrx8AhyOuGFYLk0n+AljgovZzGgs3FvDF/ft4b/19e714VOPkyF3ln6TAfZR4nB/gm+dbOCK3Uye69L00h3HVSL+55IlfVfZcgo/FbbtJziyFfU5H6OYG3UGG6DhDubOD0dPneLn1BGfbf2G0/zdiejakBeYL2+aMJ1QtfdxTb2mcekywFRtyEJWBwtL1Zazfu8PvmY7p088/w3icYHd/H79sbuK7h4/ww6Nvsft0G72jAxRlYq29VKXiyn7Jxx/WqmnwlVrpHlwNynzSWaQs95UciMoCg7M++md9mKNXGD7ZQXtlBcGNa4hXVxBfX0J6tYNx1yBNDHCWI38xwPHCDObfWEYxE3M7qVbHMjxY2DCWRqR8X3Dj0TJNYjd/uEULncfIbdhLtxCUxVzO5HPtqd1yX1IFS2ICvMijedxtzimSg5pAxu6WhmVU4k2Gu5JYKJeff1jUy9j1pKLI5V6tcCBQQoFDViLq5Lx+URy8lOypsgs5BslRtUaVHpSu3H1oSgcozIB8nGEmiBGelhjsHSF70Ud+lgCDzLaIKNsgtuO1mRCzSQ/Fzg6G29s4+XMXujdGZzBiSGWHnC2qBc2B1xxmQv+cjPGEqNhwuf8uB0EQ6haGZc5+hajVxdXFJbx75xbWP9rA3XsbuLvxAVbXbiKe6fiNGZwhgqOYQVXcsAJkDVxMFP7DfZwe7vGxUKRFgiel0t5loi5Yfk9HMDZ13vM/oZzlnMYsVeaVvYs6hPk4eIXR4Ssc/vwr5t56Ewsf3sb82nVkq9dwrDXORso6OntHUPMdYCGD6rQREzxVRUhMPhWE7+F8/zKN1ftaNwUACyx1i2InvlL1l4Rb6hRhugV6pzm3b7WdC2rztIIDCmveCirXPq2KVDpAIFI2NBBjwETAaEZj2O6guzgHtbKAaPwO0uMTjIklMRjZPPE4R4uKXQQsI3cAXTk0b1Bxgq0Kua1Sw17mlw1nosTB1j52f/oNN5e6CKkTijIs2rRi6jNvq4QCArtoGActk9a59LVwk+i6pM91izkzTJxoD7dusNV/e5/aeO/k86V0EGN6ltBGNyPxkTo5kRAbdnF37Rbenl1lES64rJZcY6mIwAW2/GfIgwAvcIrHzzbxcPN7HA5OEMURi3nijpPnLkU6Yqr0Oho8PT+VsscsUWXUnHzNZpcCM7TnN0QyGlqhNQg5s0/uZTp35FgUa3bVprTk2JdxXUq0685Cx9Hr9fg1bVqX1WLJzf+fFK2YyyLwa4mfantN0Zqe1uuGM+0hUts6zTpc4FyQRlsRgMmiBbIkw5VWG4t6ER/f/gQba+tYxiLzGFomrO6xWvHtv43m9af972lu/tmlwbHHFM+yXXz54Cv8fvwHkjhhFw45WVmw8G0sQy9uVNdo4LqlmAl2TnX+nBtUW/6ZFCo8NNeD3t1+Q9vilvzvSRXluC5V3x2F37viaL9FbtvaEMi7RJjqwztCXMyEYgH1Qph9j7b3v8TuZeNPw8agq70wvTdemwuQ0gn/tF+h27jIC/wDAAD//5RdWXMUVRT+unt61sygYBRKMCoQXLBKLfDFR1O+aPljffBVRQsVrdKHVIgmVqKJJCxOQsj0zPRy2zrnnnP7TmcC0g+kZhhIz+27nOVbPARA6PGkG9WEJii6WA5QQu/D9fWGVPQjZOs6+1oVkRtsK2S8L2CrYWrJZz0L7Zfkya8cQVZIZ5yt+10OSu3BZyj44AOJOKRie6TwCSMiDpHyleYlEFHl3a9jwTCJ0LgOYCawD+3Sl/IdLBc5sXCPyFai6DPkv0wLmH09i8rezVaZbIctEMQF7WM0UdiWo1EtLJpEJAZCE4/4zgw/7nbcvdKY5uIioMkSIQbowSv6gf5OLUfcJs2VMRswhmUp3NGK78XVP6ouRZb/E4nAVCFjkMnz0Y296upBFoyx0CeGuWS18Z5f0efEX056OrjaYQudRosPRVJHZUsxkwtEzbCdH9gKseoY67hZ9VnjOGzGKIUjkC5XBb8Pw9nkVIs7p3YUeFE3eD45lEvclEVr0TMzSJTCOGSIrie630k2Fuuu6ngzHhpFX4deYqyq+A4e5vFp513/twhA67MZxSy22QikW1t6XsbPvGzXWX1vGTFSWJsq5riVs0nOvG6gv6eUhdI1KucJ1l1AeELPwr/KskqCQi/RKFGJo+jv1oOd6UZysLpKfA0BUM0BawdEyeiZbg8FiWAlJHwXY/X737C3toPuDFqwfq8CsUPJXt2frHyKj1dWGApcikDXvIuecCK8/3UM8dPenzhs0l5MUFALzWQLJeFpPu2yGrwWtwAAIABJREFUEM06IiJ0wW3ASbABkinCJMMgC3AmzYH9IY43t5Fs7eLRr6tId+6hSYFskuJlCviKCnYc6tzNDXskGy8BPPHMpLtr6NCVLszvm3dx7YPrLC5nO3JAp9vC8uXXcenSEj7/7AumF+xubeP2d9/gx1tfY3drC39vb7PaO82TpnCcSaKT/Nctz9lIv0I6cAJ7VJsu6VtbRAyABba+sxKD0919PLn/CONzeygvvoL44gUMzi8iJU7mQoQxCTgdjnFwOAL6MXpLi+jFL2BK51DD8lGdkldkf7hiT+2xl7WCsSI6QoFxptSxEM4nn5v+5715qxcjk2T/iVot733L2VUkUyB+4GwvVFieOPG3U69ryMm/qP2zM8dk7KhQpBIdhE2rQSGoJ3vj8/mX7pYV+SDwaw5MuQsj76nrS2mD1DI1iOgWiiaiPEKyn+Dw4RDYewwcjIFjm+q1ohZ3RwekrXB8iGL/AR7s7SBZX+NufzvJ0DENW3zjx2IdS0oUpycdp8jZ8hyXWcX/utHB8tW38f7Nj3D95ofc7b/81jLavQ7DC4xX2Iskl7Go89nziHN+/nQB8fTDz7e/xV8bd08G3nMEE924114Htfc1+DYnPl1hBgK2xAMnS2mecuGBrD1jauJQojccIR1t4/4//6J5ZQm9967gwhtLeLHbw9G0QIIMyWiK/OAQGPSR9QdoLSwgJr0fV+B5PtFSPcNLp8At54jGW6jWBLSYENj1yLzeXhutXopknDFEX63d6lcg6E3jnRM6PvxnKHaXNA9aESZFgIT2oriLXtBHdO4supT4jWjPnKAxKRBMJgjISWb8hLvQJOhH1pGTgyHMZAQzeSw2bk8/hZuxRaORC8vmnVX033wVZwcLyGh/CHIYgh47S+TCuSTNa8op1cIXHYWercZSdyvBa40ZY2660b6hKICG16CqPy8tENDeRdRBomJRMSgbZTg/WMS7ry2zbgtbyp2CHlRkEeSsYRIOCSaHBscmwxRTrN7bwA9rv2A4OWI9il6761TWZ+dYyTFdyHSLVOjHmvQ9uznkhBG5EdgQ+/ScY3MLzxfBc09Mvd6oUOcWjVE418hzJ8itSWjG0HDjaSYErnCqXWPS+KAcSu2gp4IYVStWjtUIwSsWgjlz/GkOh06HihqNYR5g0O7jxtUbeOfiNSziJTTLCE3yxA88WI10/Z+vCDAzgkKxmt2QlPM/Qob1oy18eecr/PFwA9N2gXavxTEr7bhEi+NChtCu60J5XKDJC/eM9OH785+dFDy0i42l7Lgq4lkRAKq9oJaPVJR24rrSfdf/21pzEwVAUNeRoIWlOK/uOX5TTfcfWidMHfBifNuEt/RiK1Aec7ysOQFTAJguZ5N7pcfQuFgqq/1JF9OeAfxH2bX2RlGF4eecmd3Z6WUVkK1QsCReMEERQwzGL/4BEmNi/BP+PcMXTUjAGBO5BSFqFemWpkKgLbu0ZXd2Lua9nT3d9oubNG3a3e3smXN5L88ltEZpspuSpcCoCSbg2d6PP0xZYC4XgQqqYlrXny6IPUDLiSZZVUhmaq+bcSNQXOItxEkhV0HU7z7RAoQtDlIop8GZzzvqY5gEIYRQFfFix5Qm/kDVh+wPKBmma65mKii24FgkIU2UX+XYeq2jcCQRRZTkkvYghtqriAZ0MdvmZhOEF70qd9NEIf6zVe1StfahsSUfW1I5l0qjD1zmMuKIm6Ai80pK2UhmK0bOuQPVHxrvtjoZ2M091K1l4bdG4gnzNM3nDiwI1jUgGwq1ZLHPKT73XirU5m5Af5vJc6jCSNxh4sFTEaQ5KUF23aj9hcKjnT/4QuO5Eaqg5TOsnDqHvzf7GLsxB9EBumYzVv0z483UnA9iLk/gstVT7r1xq3jjrOpwoJkFyGziHHfASMPBqrQtFWmxYld8r70KBxrfR/hddRDQlOuYFsuOesgmJBuFzb0OU0AK1Oy2kR7idNtDku7DRYAYImpJfoetXhwXALz+Pgmvm3l9HDgwfLtiKDLxiqjjSXxc/vx8IKlisf1PZ5LGenARBDmTopnZjJldaBIEcqYJOQullXU4KIwzZZQhRBYroSDA7yeQ/1hF3RtVR2NECxqpAOZVT0JK+zVGxRh53mKYH68DgphNKnRdB4PVDTy8/itaEwRYXK19u4mb5nw0fSlGp9+dfv89XP32G/TOvIMkzTR5OApWLA8qANzFc/zQf4DN3S0keRvZXJvdF4SAjjCf4gCWhol5a5MieAFnnTbbwLCfNvu8C2++LMdIixKLvoW5UYn0+S7qx0/x6rc17P/Zx4t/HrEfeFaM0aXCI/PQgDaNBZIj6QYso9hIN3R6TVHwQ57l1PF1KkhalXh4/x6ufv0V6kRE4wxoyIl5Szis3TNLOHd2CV98eQW7g+/wuL+Gm7/8jFu37uL+rTt4ur6BcucVMlZsrzBP656uGeKZznucFldaBu/Vq0yVO+iCQniDDgVUcNjbGmCwPcCo/xTpqVOYX14GTjvkb3TRdNvY25lgNKmw9+oJJmcLHF9ZYjeBpOVYcFMtJELCY2NW2zJTREsI6OKxNBE+RQSY1oXR1njWJ1P7LnNuKdWTn4SfXquIaSioq/ZMKOKqS4w3+pf3wbGGnXuoQ8lnvf4PVgZX3R1DFlhDQd1+RDtHrgGqSxA/XBwQ6/5gxVXhzMiYUbZMkNRjaRfJ/gTJsMBg7QXq/hDY92LnlxyHTwssemChmWBuPETVf4K9J2t4ub6OcmcHx1otdMoKOa/LkhN2zq2VdJMolN9mbJZ1tMApJRtC5JFQY2JrNhUtkM7CInpnV3D+4iVcvvI5Ln76Gc5/fAEZJ/3uANDMR37u4XMeufSbIH9FP2/88Ttu/ngNO882ef5S0ZYKL6yvqBTJTIs29N3GsXYHkzyvKKuGO2ziJBAQiwcQUNIAifUrUBYqPCikej6VywpzdBaMK8xtv8bg9iqer/aRLi+he+EDLL17Dk3vBAZNg93C4eXmENXiGOPuHhZ6J9lRwvb7Rs/RUp1AmMfuvGo9eXXeaKIge6rf06ioV6B1HjWiXtALpNVA1o+UHJLAf7X7GuV4Es7x8HwXKfGrS4bQwVLFbFVqiC/UDxLSdUwnkvcomoq7lPTVyltImgXWFaB7QAl/vbfPUPeK0CdVg2Wfoj0cYv32bYy2niEjxx7WSag5toiL4FxLLKeIlJ2NAf698xcLNPq3c3Te6mBcTQRRpC5OmGlu+FgvR8eNKKCZIhwp/2COtC5va5rYEJXcKW4LSk51YhptfEgsZq8XbSvRRZJxJB0Pl7TQlI7dny5/eAlvJl1kXAA4HIcZQii+sdxcJL0BdtMoMfYNHmw/wvU7N7BVDNm5he5zgYoRiR1KxpoYYVKzbgs06eLYP01CHDHb+Y9jSylyjPhszfK2xo/y7NR0EJw02KqyOpT4x6hqiiukey/oYhNCFvFp0QCjM1s0udSRgoUGp2jT+P25cZumIaejec1NyTzn+Wp2gXTCjqiTnLfY0rCeONTjCr35E6z2/8nKR+ihh5xsVCn5t/BiqnOqa+3/oarjZwdkkjMHC48JHF5gF/e2V/H9T9ewsbOBZJG0azzqcYlCXTmyNolQixgh5xmUs+kE5fyEqPIqqkffSDeGclVzczDEFSf53MCbzlfbU+ghDV/J1eIyMAs6cgNGPpFRPWgOURGaYk86u+0+cPNJ6eQimD99LxEEV6SI5iVMjmThcRXyNSq3NhNpTXN+qPs3CwXPCBTKPIrQ6eqS55zDfwAAAP//nF1bbxRlGH7mm9npbrftllooQiiYGBJpkRi50Z/gjfGCn+Ev80ZjYoxXxgCiTU0wKgWBQgAphy5dtnuanYN5T9/ObC0gc9U02+7Md5r38Byisqq+qMnLB22xEXeBbpwU5hlCkGZsreYhBWnmlbKtUsWdv1A5P3m1gmGJN99AHIiETclj3i5Wz9SDhaHfTBkQuLtzJcu/PPMQXRNAKCfnoTtYRaTPGX8emuDZhHCiVtIV4JA1L0HGOUHPfUJmE1vmpJkivfNChfAaAnSZrYdT1wWDd4L57a70PSlz8tmZoSi48EKWDhSA8AJOx54CYNAQegY6dESBtDaxO1RngUCV7+kiKEim/pYod/UJkqQ8VeNLy+Kd4W68WbK9jh9FhZCxOOW+UTXV4PwRc6tbeGfxGPqdEVKXeG5kzQIFheUwXLQwCJ98h/jS6oZR4SxoUgjepJnf+M5QEVO9Hds8rPRqVTv2axWYK69rSsK1Gpd7Je/igFVX+bIDPyh5e9uYl7v2Puk11W21aPR/r8/6Nt7jlTEnlXxFABjgLpjq/r+qttvt9xhmFKgeBiVagQnqaXJjCU+l066cequK2zqGJiZx7CYdSVUOpm7GNKXI9j6fEVmKuBbqWAZ8H+M8qSCLphEI+dRLOVeRzYD5ZxmLmkYqnEIdiVoKDDtdtFwD/cfPcfmbH7D/sI1mEfrXWq5QU+Pk0lZKMx3HOvDZpS+w9tFF1BuLrxxbGpkegG10sdl+gJu9NvqR4/990M7wIK8Q6uOcqhJzlsr5YN7wyXCMYpCinodYGOdo9kdodnYxvPsQu7fu4dlvf8Ld3cFcL0GL5oQ4/Xmikn2quq6SYf8lGeG0t+4T3kLKHF6MVRPutJjkQFcu/4j9l19i/sgyTOHDaWfePjQpTTksLM5hfXEdZ9bO4fNLL3F/+z5+37yOzSu/YPvmLdzZ2sI/nT1BAzhgliuI4mFfUHBMz1AA5ROAnmVG59BpvYm0BGKiRPH7rot0f4DeznPgcRu1k8cxe+Io6kvz2CNKSHMGyd+PsPNsF41TK6gfWUCrNYsijtAd97ljmEUyCpNg8vB1cKBjpE4gMF6z8h+ng0Aufgemn6OJvCJsDF2DkgaOcVPLQqjsvKGoA4aZqgCW77bQfie9FoP/VzR0oipk1WsCaJHuNZ7+PEBERSEuMK1RzCF8kbFzQ+/GA6CdANksIrbKdAgHA8zlGRpJD/nuDvaePET3zl+YGfQxPxijQYlmkoqvvv/aUkJBw+GKipDhmIph5ErhREU+ZVk1FZirRTj5/mmsXTiPi598ivULH+O9s2fRPLKsnrKTR6mEjW/cLMsl+SdltGEf3339FTZ/vSbdd3LLoI6skyRexlM6oBy10JkTlNaEiiBH5NqiospcCMhlT2aa5ToVXbOrqu8tKa+b+lkKZwWjFSKCp46BeDRE50UXT3eeor11G8tr59A8tcIJWTADvHi5y1obnc4AjaUl1FrzfMbGFN/QeZIGXOAUJJwVfQ+PIQ5bR/aeMRqAU+clQgHUIoegHiNuNjAaJsiGSTW5DLyg96EXawIEgWoDTP4uV3oHifiJhqWIass7QYoZjkU8F8TdBDUkaYH5uImV1TMIgxi3r13FqPOEz1iakxH5gU8lWt4qMRPR3u2NGzhx+iSOHfsA+6MU47q40XhaydTYBM75GJEptdoxlvikUDi/8qpDp51PpZDlk2IMJ7yh88g6qL5XxKjWjAv3JqoGTzNUSHzqsLp8Aqutd1HHDBSHeKiBdGWunVDzBsgwwAj3Bjv46frPaPf3EM7FCGPxTCzMoSlUekdpjv/PxTG72v3FnIuoxos2NAT9qPuFEIGujCKcgqY7EX9lEbnMdAcyj2BmTS/WZCkjMSbJnUH8Az2XLcYJPeJDUATs/a7d68p9FFKMoaJmkdN6jOHGOVbmj+PD1XM4f2odRxn2L6z/t27yv+KapiVRZNHFCF1k2Hj0B77d+B5PRk9RNAs05mpeP8dQqpKUZ2ozn1VQ1E71RMrW0IY6N4SwubrxGqYiVT6htJeLpvY7O09N24rmjeZLCj5Cl6Z8rR6KnbUXPcyJBiK5IjUfmZbRpObrZO5Na8DQ5YJkplhFfqZip90rI1+o4Z4STV/yM+7ya6HJ9A7oWJe8QYodZhnJze5xgn8BAAD//5Rd328UVRT+5s7MznZbSlsKgrEKaUxUBIEHEx/0wcREX0wML/6LPhgSH+SJkBg1gRoRCY0glVh+WEBKu3TZ7e7MHXN+zdydbYlM06QP7aZ37p0z53znO9+XOCe00CaF1Ob1RLgsrWgGVoTQYmiBhHwZKlaLATqlZPixosYKbJtX506097UQUvCgOC3Qylw2xFAsU8Q3RgCLLzAyWlSBzBCS5kOHPV4UVGQQY4A+16xKxg6k0jXCOQrza6b7IAJwRXWgoLNWdCB4tiR2FaJkzAW2S8wLpRsL9S/VrjIfXFeL1NFBMXsV2Qcp0k0UzjQIfDQ5Iw1TdfbiM12ocIQJAxZKjfEVdVREWhhkiSIePUgU2GFEWOtVWjMJnIgipr4irQuJWOdwHHq9nugA8EyaY/V2pwyAiQJGu8Uxv0wTzGSzWDi4iH92NpTKEmliatCtU4FKEdFhEJ6+NOAaCJTso8FQuwHY6EFYVDaQVKJLqVCjXQSQWceEOt8ICq8mnd8+3zuMibhYwNh3MNZEBzWgi9BjrJYi4+f0pYn0Sy5KHrNWKjOZTJyWTkGkxau3rqTdHl8Xb5ye+iFGxZBZAPEoYiG6wF1TBFACf9Wq0xQEWLE8TCs6nbElEIBSrCvAjht7+BCrDkUSJxML7XSm1e5SBHH2Go1wQWJUFVIoK79UdpeggoeetSF1uxJ0vMPN1TXcu34L7dzxuRYKcMF2fbkmGZQH5lpjJG3g9Kcf44uvz2Ph8GsYEFgXp83yoLoIulpDHz9s3sHNZw/RbZUYROIeUFlJlZIcN2dlvXZcjSlkPs3MTFH7nzgShf/FUYTOxnPkq3/hycoNPLvxB4aPHmM+TpGQUnYhiWesRbIJ6aGsSLCyv3YWA+eBFuJA+dcAEjtDnkciChPoK4HfVlZw9eef8NnnX6IVh12GaKxycoECNDEv5hOH+YU5LC3M4dzJ93H+/Fe49ecarv++ipUrV7F67Rq2Hz5Ad/MJkiJF6loyR8i6HaT27nl9kWoSEMbs1HqRdC5izrRLzMbAoBhg9MIjHr5Af7uL3vpd9A/PY2r5TUwvHcPUkTn0plJ2Lunff4T+Vhft5SVWRM9ihwGHLi8MOUzGnWZHJzzvBmYZKBiOADBQRnEvSThmyNiaCdLWdqGcLMnLHa2szfFdfJBVPZiSiSkqigb8jk60w+BVpI60Aah455E6dQaqu/jjmiwWpyJVpGaWThIH63q5WBTNNNJekLUmzexvrT3F6N4W0KP5fhFhnXUlF/2t3hbcv4+xs76OnXsPgV4XU+iLvgOdL0qI9XMJ3Amp51bwGzFNigR52Ebe0LwUcTvD8vIJnDl7Fm+feg+nPjyLpeXjWDx0BBGxgwiwoIfe6E/VezFY36uawpcjXPr+Ai5e+Abbm10+73QvM453tHfyRNHIBrMRDszykxqzCn7KNNRc6cODPK/PGXWnPd2TOqENd4FBsdJXcqS2qwZbj4O7Jls6ZLePGYotxPDp7uD59m08/fsB2kuvY+7ku2i/cRTpdBubBEiOnqPf7WP3wAymD89L6ZcJZZZiI49o+cBe99XunKwjqkFHY9vQ/nMO2UnhSNZiu1ex1cKtiyrFuFqkE1XhXTPmaITAa7DKg7tIwsAmSCb2wI4BQLBVncfISUwlgNLHMTb8EDNZjBOffIQ8KXHr0kVgsMtd9tgaRXtejmPYYHOAO7/exIETR5CmB5Fkjq2ky31E/5pXqL0zdv/KMsgTA0AhYOERe84aFtDmhTUuxCnLV0LegKm0exyansM7x46jg4xd5QXKcHrWxm0i68uLQ1k1JreLjXwLP974Bbfv34XLgKwk+7Y2s0l4HUnthhGOv/yf81MJkRdFBZTWLlOlCqkWEkP0+aaaJAk69DaKIfl4XcyZlhkUhAlZcsTmaSn9YqhNN4vjZv0X7pcvion8taat+wnGKGvmJAnbw6ZRC3NTszjz1gc4t3QaR7NFTFPnv5q3CG6afu8XvZsRzu/xU/N3ZB9HPPN/ZX0V317+Dk/xCFHHsyMMgZQUzyTTyhV0G2+0ldrAcdEkJ6FqFnFtSrWqFec0qifggIypSCFe12PyN02Anf9nYr8F48diyFDrNdB4AK9fWSDC+pUCnMEv17Chbt5HFRUUEXE5e9VIKwFILqrYHsJ2DxtBpAMhZ8/+//4uiXSrsxiA/wAAAP//nF1Lb9xUFP6u7fFkJg+atimlnaQlfUEr2ggWIAHiHyAhJCT4T93wP7pGbBBqBSyooK0QoNBH0pSmj0yaSTPjsce+Rufcc+w7kxYqvGnVhTv2vbbP+c73qCpmbdZ1ckrma0zL0rW3tpqc08amoppo7CN2Ka8jLgKZMFcTaGr6hGbGSIpMCzQ6QaPcUE03RMMtH6pRNsQca9NLpoiycYg4dRZ2ONZQVecQV2y6SGPGNV1GIjg0Z91KQaTNv+Yoa2yHSzCShi5EtUH0UFp/s1k7cOt0PxAjNL1nyoDQ31vwQ+80PbSATjOSu8xkBjJyNggMQ3WOD8W0zS2gTu7VpRVe1KLLqsyr7eD05hLrJ7Ek/jVAUNlYZBaqd1OzQwfAhGzYosYZ+nBA2ZtCgbcSgdUfJRjYlOlX9Gp/8YvcWxv+fpLnQI6wNJiLpxkZH5EJT+iKR6Wml14aQ0WZteIP4JsD0bKFpgI6AsmTr1FQ2d+yf8Ig2PcCZYYIrZEYb0DlFCMXA6n7tjIeZHplWZ23LCbkCLKf1DPAzwcdux/0W01N+2P2BgFiApBNvuz/63AGWrWnhrIf4pDoXbEz3SkDiWAxlbnOv6HkvUEfAzIZIjp4JGhsqZ/v/YUuX2ugH9VgTGcVRxEXqGykkgwZmMs9UzHrSRiq80lGrp5Lny9lHtnU3Ttl3bBXg7UvZU1wJuwwcZq5Zoz+wEWwULMYRzHyfoYoNdjZ2MT1b64h61q0rICVcHGj/oRB5YpEjpg6OIfPvvoSR0+f5gipOGxxEzz5Swpx/afM/1/Sh7j+dB0b6S5woO2KMEH/DaP2QvH1QAB/HxGAQtc0Gqa8Vym9w+yliHaeY56eyac7GK7ex5Off8fw1irCtU0cLAIEaY5W5GJmnBbZAUPlS9IhxtypeU3kX0sxb+NG1a2RJPcjN05DV+8VwyZNX1++jJVL7+LoseMIPdO6SfAmFAmKs18Lq4J8uhmiPTWL9vwKLr6/gk+/+Bwbt2/jz1s3cP37q1i9+SvW79xG0e+jTayO0kpEo2VqthFKY4Cyxua4sLNMaQ2tBW0rkkw0sz02q+s976G7uYFoeQntE4uYX+5wRF+v10DzyCF0s7uYW3wDM53DzGAbRK5QUIOiEi82uqwnDjVYtu/ee7GzgYC7POUsnEO/CepkE06tGdasqEzyqo1nPBdL0gx54Vhm6WR8HitJLKEwx6jaITNWMhekGOGIAHkPSODClpJsZCpTus1Rr6H1qEbeQ6AZ35zPnuRopQbp37sY3N0CngzRNNO89+Myw3Q+RCsbwD56gP7GOtL7a4gHGeZGBb8nOfVQgODQBOKGX1TA0qTfSZXyQT42FEla0ORmGksnT+DU2TP44KMPcf7SBZw8tYyDx17HKDII44ZrhplJ6GSOUeA7mMMrgQMRnOx/bvZ7vJN0IsONH6/i2ytX8PCvB5hxViQMyBGDhb7CcQB0zp3B+ZX3sHj6LGYXDjuwpjQYDQvWhdJvooZle/sZer0etra2MOjtoPv4EZLdPQbr6bnkwlhpzESzLdnrXhbGjmXSa1IC4Gv3naCpQZMncoQfJHitOYWdrS6yQYLH3WdovLmE2XPLmDp0AFtRhiQJYPcSPN/pYbhwGDNHiBEwwwlAI3Lb52hZN1kNX/1zN3bod5b3eul+Zx5YhHEA0woRzTSBZA/5yIF/r/L/8LfIyttCmESlNB48iLBG1lEo5UbWVQzXmNsQytDKcLoebJajZRMcmFnAmU8+Rrb9GHd++gF5IVoE2T81eOW5r1CtUxZY++0ejr99Ep3584jbMbIpAbAm8PFSGEDqm+XLZWsTtFLSonKR+JYiI3LNKw0PS3GjL7yGCco6spYZwzR8YvqyvKeM1GdBEWKhdQSd+Q5ny2v87SQkrvts/Alxwq0EGXaR4ub6H7i3vYnGfJsNq9VCgBmNQTBWO1gBewr+dtSMp1qNtN+rCMLgpFqCDhqQsbTPQJgRlrXp6rlC95Ni55RurY0fvcOrBrMMKkBBp/4aZ05/NsT0FcKKpr8bqXXYh0WaP11P/53D1+z5yITRxAYwLl6WTP3KUYCWaeLC8lu4uPgOlqY6ZPeHSNfDOvCmQdf2/wmnLz2saP73MMTqszV8d+MaumUPiUkwG7fRnm0jTRL2maGhH/dTcN4U3D+JW3/VB4qBpy3G94wzWo3gkhCphqpBLceQdFJwBmgqaYyXTjPBKOAnXPeJGCAzKE5yLJaOu8EhnbPqEViu6pj1FBWo0mReS9L+s8ecq4MVvCEvPBpE1msrEj9iaMuAnlP4JGmCWbjMrnReAfQ9V6aO+gekaYp/AAAA//90XdtuFVUY/tbMntkHaN2QioUSqGjgoh4ggqgXJh5uTIzhRuMzmHir8U1MeuEb+AJyoVFIqBqOoWIwbYHW0na3lnb2YWbPLPMf1pqZGrmipbSdmTVr/f/3f4dGlc4TVOL1QqWL+2xzzad09Gda1NQQUZwcUapbrY40iTxlgj/wXKMZiKOZaKY0t9DohlLkkklPyCj9OPId6Cd9joILGx2MsiHCWKNMilRzHd00qdA8VXLnLptR/pg2d5cxq01aVnFS5+sNCv+CVOnrdI1kuif0fshsOxDlqIAcgrZYch21GZuW8R5LVBDSFdmxxDxoEx2pGzM0U55+Njc+2rQMB6nqxmNPB+eCVl9o8l9wNA9GgjQKwl2LSxAwqo2HMg38oafIIQf9VPT+MEEN0BANS8i/O4MiuUM6nQum8YeFFHK110uLTpmabSXPsPzsb0y1pxDT/TNhadRmHcVOJw8OjTMFT6W7poMzUzNY2ljGeLjRngyqAAAgAElEQVSF/ihh/U/poKrPSSpzMfExzm+iYiBn3EFcnUwHPivbKmPA6n0c29LEQ5rTtr4f7j0xYupHlFNC/LzXAKfievaDUZSx2RSpRq7xL/6Q1aUWx3IgOLqWY9c4HZ7139+IA71qDN2ha8J6Cek3CN88aLPvAR/rjMj5WjrxBJrUiPL9iBhwMqzdLuCjt2z5fBgUCCSJfYAB9rMR0ygPzt7Lrw98w8ieF1QgE7hH5iWj1B9KDC7RtNGIzp/kKYE21N6whDbWg92nkaiUXNcdH8bUmBj4w9CodlO2INHw8nRJzc64gMvFgI0bLD04CcgicATsvRBjlKSiTkwy3PvhJjbvPMVhI/Rwq6sxNDrVtQ6lJwr8GIMG8PGVj/Dmux8gpDgiE/FOGPqM8fIPtWc7AG5hC9fXl7BOcEBbWVhRk39/Z67GKfr6LjmZNZt8QvK0O1GT1+HhqMkTuTZtdb0+jhGV+u4iRnfuYffufSRLa+jmASbGBjEVLRC9b2zcS1OZSPvik6404hhJduMvUgbseDKvwARdu7CLhb1jGAEHq6+tUhkE3HGFhsHN327ju/lv8dU3XwPBBO+J5Voy/rkD5f7h1ibv08pAoGaJVs6hbhMnLs7h8sU5fPr5FTy4v4gbCwu4fvVH3L12A8nWNkwx4kkHTYqbtA9b8SZoFPAMhVypDXQtLcrYV0f6McVZNYCJQYHenUUkK8sIV07iuZdfQjR9Av10B6bbwrOBsLaiE0cFUCDvGy5mxgxycmxoIQBLETqAspzcVcEP9/cCddDAf16nPVYN0rwEIBux0SpHRwVBDYBk8Hc4Yv8WF39Gjax1uerkCUPFK4G/NABQPxIXl8tyAKWwgqORMslTB3yUGhHFKb5Prq3cG2T0LovG8PQ6QjwwaPRSJI+3MX6yDyQUL0OxemN0kKGd7iLeWEO2+hhDyl/f6GGSzB9dI8LMm8hHCfIa01sYWansiDkXyHaOfiqhOMRAK/IWjs2cxvnLl/DWO29j7vU5nDt7FkemjvC0iO2pCfSsFsNBfdIn76O/wNo7XtlND25nooJlZG+IPxd+wvfz8/j16s+Ih2CDNOvDMzlaH2fOv4LPvvgSF957H52paY7ZI6ULJzQVEd9NOO12Psb+3h56vW3s7SXY2NzB+uo61lZXsbbyGEsP/8Lm2jp6G5sYjhKGISkhIbcjYYbBerlKWLkOy2evsvsCYbWRpv0wfcUo47NlSObPqxSNt4FgdQWT585iZvYUkiOTSGyO3f4uskGGnac9TM6eQny0i6Adi9mv24UK64076+C0k22WH7v4Vf+vKpewWp8RsJWmaojWbSDO2ki392HoXE3VF4GGWAb+2vzzswJg8WBBm2E3IHISEqvyksJY3wDWVwDdJ9IwEzuwgYzqq2aITWR4MtrH8elZXPzwE+Q7KR79cZtlFi5IxHlzhNXfy0j9bEfAo4VFPD/9AloTM8ijEEMGbyzXO/z/XNwndcnWNTVGTCmJzZAVZSw2n8sNBt1CvZluUBeoBKEGznophOHoyH5/iDxz7EUZumVhAZs3MIkuXj39Bg6ZSTGDs/JsC1OPb8xlp9M1V6jxJgHlGQbIsLjxAL8/vIV/0h2Eh2JmPfD03ZYMglBrEccY5MQU9i+pNOBaN1rVmBvPOlXpVRQi6e9z7dcifwEL33wxOG5KA2owo7XOOqS6DpWBZYP34jG/VxGzpDI5v2zOCS2NuO0ZoDgwoHLsbCjYUpNGaj+TW/Gn4PVIE24n94hD8WkiUCYFJjGB8y++hkuzF3CydZwHdiFFSQaO6VMI2PsfWdD/jXrqfypK99rnechL51+Yc/O/PFrFL4vX8GSwgqKdYaLTZZAl16FlxFP2lF8CWQ9G/SLKmDuOUKXzLwrYqDaKxUyRDeEptWqQCFhAZ5UOo+j6Io4VlFqS7ivVTVSPup6F+i7xidPhJ1XKrbaX5br0Kv7N6Dnx8zLs/eGenRtY01prB21Y8vhwMu2G1KbFWPoX8qUTNq6k3rAnj8pu+PtwbCOZ+1EaAgUiU8NPXkN6bwuLFtWLCtyL4T7VkDGfAwYF/uXs2n6jqOLwN2dmd2e71LZQKxchJlwMsUFRMHgNxsTEQKIv/oUaffLBJxNfxAcgvBgVECi0UqXSNnTZdHe73e7MGfO7nLNnZ1sU54WGJtudM2fOOb/v911Gzu1lKgL9m9bEyd7RXFhnYDVWiJCGRLpQjsYr3WXDeYrwuk+h+8QaL+L08ENzL+ceKoOf90TjLkCtOIaSttd178LLqNGIUdCCilV36NGb8NO1sNlIBqe/bxP5B8MMAB6ojAfOZetLoSi/cwgQaz+cuZbS5osg8qrQYrLQrgdnwA9Eg+tSCnjiOASWgAI18pPPN/73uRb97GKqwEyZ8uwlAc6NHUMTZk9nCfwWeLyLUaSTu0ncyaiobth6A0PREEU+TpCfY3VcJcffQ2l2zV4XbWxjgg50uns9q6MsBXTMRLBJctGtTiDpxepWXxVX1cjRyDFE3wOzuGqAiFGXZC+dfKFadV9kB86q0G5wGDPoHEIdoj/MBB3KQwofISLzIOzYOZdXBGCT84twC7mjwqdq9pUpYs7dOBcTFurA9h7KXS8nO4h0Lkw2JrGv1uAILN6ArRkW7RHUITZEPwvNui7Qp82XzDpR+LkPLRB3c3OmexZPiYQZLCGiCednoEUJGzyqLpk8LfxnjCHzQm91tK0QBU6U6u7NMTl+KPFuuKZkHhrZ8S/tPAeoM036ONMH1u6v4N713zgGK/aTebghjkSbZmRYA5yeP4WLlz/Di4df5uIfpU3RBrKKDuv+B7j6eBF/kO4/pTGVDbtQrZ/RaKAyQ8Mq8GH1gE4duBoRUfMCFYpobbWxs/A3mneWsfnzTfRv3cZcARygeyHplB3v5v/LjFLwRUChHZ42CRcg9By3s74eoKG+YQIBJ5HKkIrRgwQ9n35vG99+8zUufvg+zn3wEZsePu8VwE9DppBKQubPncWJ1+fxyaVP8evVG/jp+x9w7ccraK6ucCwVbd7VwqCXDzjF1JEJFT7VQ7I7NJMxao5KZpAS5ZPkR+0tDO4vYWP9Cabm34SdmUZ8cAbbWw1s9BZQbR9BenQOlRckj3yHzftymZ+RuioEnfGy70X5Kq/fztCITdrK71j5oKgAsVB3yWBowJtGohICiet18WBqYkheG/W6PxC7d4uRnT1MSXefOkbX1xzM5LTSBq3HNUR9g+xJF92FVWC1DewkmKrUsa9ukfbasM1VDFaW0V68i+rTFpJOH/uYFaD0ahPMKj88JaKqxs7mHFmccxKFjRKcePUMLn/+Bc6/8y5OnTmN/S/NoKJOa8/L3v+vl1O6sKqDWtB5F+uL9/Ddl1/h9+s3YDrAhAXqDGpZpLWY0amTr53EhUsf4+2LF5AenkVGe7r08mFqApjJ9MjFQbyW8KF6cm6KHAFUTwpsdTIu+ptrT7D04D7+XHyIB3dvYWnhDlYfLaPd3GDzupQMrqJCzRItZ9sjAOTD1SKykmNPQ5bSXpUDM9Sx7ewge7iC1kYTtdYmkmNHsP/gATY23dzZQr9eoL2yDnTaaMzOIpluwCSFgPPGSOFN604EROVn+ozLgVqFA2Yr8h6zzrZqUJmsIev2mLFHRUSyxyvnin8EZ+axhKnCDYYNONNjn+QZAc7XxeZCbV7rdbE+6OG9N85i8LSNzc0W2mt/cXQggpkc+0+R/9nW9fvx4iqWf1nA8aPTMLUJmEaMPInUt8HqPjXsEsJTnWN/hi1KstzRn0fHfbf1iccpkdhkZsFmmaaMGQwIgOkXODb7CqbT/agx9CosCsegs8F9uv0x1uI/7BivD5q4uXQbrV4LWWJZgmwzZZ9ZO0LLBzDS8DK6rjlPK/bT8G7wYvQ8ck8aX8hrHpkKUkyfNvoISMh3Met2zFHH1HLnFW7w5BK3azVSHXouEx+FuHTWgZfwDdh/KlEPtFFphrskkllqMB5TAnCUNcxpZLRe2hhpUcNbx8/g3MnzOJIewiQa4JaO2+O8iagFnuHN8H8uYgdnsUEHA9zrPsKV29ew2FxG125i5tAc3ye9a2ReHul5mvFX3aOsys7D8WbZbEV8jtzYJy7Rzqj/QiTmtNwYU5CD9i8CSCSFQZqe1Pjj8yIDWPpZOn+cXp+fMfnqKOucfXOoeNd5ET5DOv+yLDNW3xxuhAxZfvS9qNalZ0d/c4Lqb03qcX4DMhGUteDmG2Ou4/JWGgNhySp73Ayl5rGJ8Q8AAAD//3xdXWscVRh+zpnZ3WR3s5uPpqFp0yqxStXY0kpbFfTCC0UQpF4LUsQLQfAn+DO88Rd4I14qCiKWihS/kJJiqtaa0pak2TRxk92ZOfJ+nZmNMQvLkA2Z2Zzv932fj+Tc5ec+rE7svS/jGrJtSpqqoJuLhznOWqgnMWc7NQCVc4ArucpOMrfm1cgPV/i0VT+jEIZlYGhzKfIRpeBE1dX5772QROUe+YjISJwwrmLrpocde0ZUsIwcH+UrEUyenQfSuKUVajXhtCIWM73eMay2qgtQ7fBaWteqZamRIBQDP1rL1MnGthBFEblVRlmw4N5g5r5iV1cd/Fk2VLVc2XOGu4NIR7B+k3uYfcroPUJAVKrn/oEfEaUgfQJDgXBblTKg8WLfi7LTDV/HwuEj6LqWwBaLoHY8eg0CTwtm++SMvwz2Bt8q+rizdheDfFf4UVmme6/nZyewqoTcm/lMmSRSWBTEWf2ypJjEscGLvwne5FHzgsZj9LHGKDz2P2Ngz8Jb9XGWRE2pfh8neQVpQhxds80xDpK1PV1t/FqAGyrJjEKFCQ9+WfXQ7N6kDWj8EXrn+OwxzE3OoeVaHCgmRDmJ/7Mu9JXCK2dWqVqBgAeDh/hz7W/0C1EX58qUQ6ki6KBwqzy2N/09zS1WLlX4vsGouCoJaWNur6JMkFXbcHTQhyiUYzCu6Cm+R1iFM6gW0O9jGQOjbFSmBCFMSOyLBPM8VeA2cnz36Zf469rvqA/1UDn6hcoJrWN8rDOON99+By+/fgkT7amy0lIJUINqfVPNbRUBX23/hm9WV7CRkK+xClxSVbUQ1WLnxZc5ItSDOaU5DmDJNpPrqENg2o+j/XCAxu119L/9CetfXEXv62tIbt5Gh6Bq6j+dGCrGEAWGZtjzNqGwoA4Sw2LIz6PAY0goKwpoUwpsU2REj+pOYXJuHtPzC5hdWEBr+hCSZhNrD3pyoDcEDq/XORreYXO9h/5GDxdeuIiJdpuRLgxr8xZ9+xLDPbqCxbfpuftIMJBVg2CN40mKzmQXjy09jqfOn8GppdNoTsxg9c5d9LcJsSOJp9jCPijewu6t40VV/Z0+j/q1Rgk9asudDFu37mCcYb0JJ9nI95kOfNvrG+h2O8i9+P5T0pOJN4XSm0yxO4yuqXGU2Z62Z+yaZo3sM2WC2Nn+Z9Qb/TxRuCLDCHcHUdHc1jnZOxwfJIzbi8p6lJHPsFa908oePuJQFwXIwojeCSftCeFAVq+MrkjRdGPAZo7d1U0MVu4Ba334ocPMWA0zyNB+eB/u1gr++eVn9JeXkfa2UN/NMJY79qov+6UcAxyEBr1ClOLp9zkhfohaGOqYOnQcF158BW9dfg/vvv8BXn3jNSw+eYJV/OsNDfxDKdZYFhmsIh72fR+UuEFllNoaAJcxgnD7/k188vFHuPLZ5xjc38Kkb6Bdq6HuOfRFd7KOR584gbMvncfi2adx9JklgimJiBvxY53oHXDba8Vcti1JDMnwKiSI5yAlYGqmgyMLs3hk8RjOXDiNJZoXZ5ZwbPEkOlOzSGstrK1vIR9KxXGMDrEMl3exnXke8NKXqL2Xi4GcU6cZts4i++OM/s97KDZ7SPo5umMTSOrj8OS8wOLBBQZbIqRFVfJg6zkFDt4pZ9/mop1hqy1bJu9CdRVzUiVMtFJI+W2pJCZweZBkb5CzUWkpqGO40OQ5yv097LcvVeao30NTrfY+VY2D7m/sqpMrzSHLMdls4fD0FI7MzTL8eWX5BupUwVMMiNGUosKBoyqn4yQA9cFusYPmzARahzrImjUMa7LXWn+5IG1odE8LfILa9QnFtGLJ+T8opINePpVEEdHn5Fjno2ZTI6/j3MmzWGjOs26Ey7KyreK5LcQrVB0AkCTYgBMAQ1y98T1+/eM68rTgxHOD3AUyaUevFWFzI3NKAeUkgIOeaU0crlRK9+rfb+tUXMOKQsWeETn/7NaVS4/s3Y/oHhbAWQE1yyvny2BztGJzrjGCVbRHRgwlmNklKVFa8OjYCnb24Z/FRj3oWmg2mHRvUqen/ajtOjh38lk8f+oijtbm0RK9/3K2GO3P+jwmw8tPDn5VqyHVyaEJHuewjRzXd27hysoP+PH2Mnp5HzvsrpDyvlDEc7QgqhInhQK2QKfqt0/jxLcquVM0MiVovCYLEnY2s76n5DWh1UsbeIrxeG7zWVL6joVv8wINhvAr579CcSGkhowF0ccxfQGzV6+2Du/JlGCzgqy64wmaVwp9NOdMyI/jT71S4kESC0KpF0tDAvCUY3vfeamf2/ilNiFEBBfjhkP8CwAA//+cXdtvFFUY/82Znb121xYotKVVLoIJPhCiEEFJTEiMCeqbf58P+qIPPPhieDARMJEmBSTYKFDuAUo30O1lu5e5me873zdz9tJEPEmTptuZncs5M9/ldylggNPgD+zETXCU+6xwdg3KaSfKa6EHqXqes+Cbl2YPXFa6T20lULkrnghU8Qkyt0UemKnJRO4gAnRkXaW+mG4lP7OP4S5EmJ2ojsDk4mIQjo2rvq7/q4k7NUyM2NKwcqKcjwr6+e615esSIzYWmk3wHp1M/LmXZp1G5X+wJ6QWHERIKfePNAPHpOIgmR6Bk8DyNmOqsFZcUMQ+4tyOxF6fWCpT+TlZZwCnOkqJRWTpCzFXKosZ7YAmNfmgF0SQ0Catu69++mirvc1d4rCYMlwy62ylZtQSStVUBeZGXf29Ew1MVWoIOz2E1M2HQGRTgZUo1159/0UJNNb55NABVFFYz5crgL5N/j2nUKTdeKutkGRFAnfknX7lyeV/04oeIwiML4lnyolv6mgCQHQXhoXx9Ps5qPZMlhzrvhNnXbpz8b+8kKH8Ibm+ZFUSpD6zvbyse+3U3YfuUWz7RvzybbP4X2ihjlCo2+7fa6kjka1gR1EGbXM7DVb/QwUDRwVe4DybUqEpGCmW+KKGq2q3PXlR6jYWQWG7NfqCTYBd9QByzRsfab+HoOfj2c37eLy0jEoM1Csl9HdGvY4hgSg9/snz/7PTp3Hhy69Rn9qf8dS9MVV0KgBsAHiCHSy+eIjXQYyecqc9gRjHIozE4nmpFZjCIB+Xg9kEKCcES09R3Wxh8/Y9rP1xExs3/kKluYHpboIgtFZ+Bd/jinok1ehEXDsYPimM/YFEU8+VqAqkuM5QtADFag2zB+cxvX8GC0eOYt/sAcwcnEO5WkGj0UCtOpHRsJrNJq5fvYJL3/0gxRCbjLB6uQCjf//tChavXsM33x5AoWBE8M68Vf9hlE0qyBuat54VV52dn8fcgQWcOXMWFy9+hZ9/uoRbi9fx4uEDRi5RT7XgRVYPJkoH9p79JiJytF7jkIKP1G4Xt5GsPEW71YZptdA4fgjtXh/RZAmvOl1Uj82zg0CpXuEEjqyakoEL/t87nMPzOHG0Q7KzFypYJEUzepd3wo6IInmZnR+vVbEoVXQdF+QlOaAglIpQBUHX0GdqDzhuJOrD7B4foS2o25oaFvMreyV011oIX24CL9eBVgfV0GCKbAy31lHa2sD23bvoPXqC+MUaqkxVIDi/Ye1wJZq4knWJY0PqdhWp4xoaoDE9i/Off4Gz5y/gk7PnMffeAkp14maDfwqamXuD8HItAI8ikt5mGGdGsioGkv4b9LaauPzj91j85TJ6r1qohAa1okG5FKAX7qAxWUF9bx0ffnQCR04ex575aZDFRZx0iADBiR1IQZ/vdcU2XwYKF3mm3KdEoFSHZ+g5HnI6WZoosgvG4cnDOHTsCD4+dw7NZ6tY+ece7izdwPLNW7i9tIQ3G2t4h8HCtHYjpw9toITzGLmIID1PgtTLSogUWzSiPjaer6K73kbU2sbEiQ8QJHuRxAW0I+vJ3u2nKEaTKExOoGQCtlIdRRGakbWS8cbH3B7msbPLB6FWu3w/y8UAfqOOfrvH8SuyYsbut9QTBGocp2PfwcOo2uHjGxFvpUYExZJJhNXtFh5tNnFyZgHHz32K16uruH/tV/hiI+hsNbCPsm+1KNdW11FfXsHU0RmgXmbbPUgSBaGKwXOKG9LgiDgBIb/4XCtJLfJcBNEw9WhsESQFKsUSw6bJRYryB3JcMH6AqcokZqb2M/XKYFT/ZHjktJncHPNh6zHuPFiGXwkQsNZTT5x3bIOLk/o0GaCKaUxAzysWZhMaLCeIxYLw+XOxzETesxDhv1icdBTJa4W+pdsc5fGAIqMYYSCwcY5JpOsMicE1n3KHUjwxBPun66yaSW785H5nPlJHzNkWfXvdEMVamWO+WlDHqXdP4cz7pzFr5tBAzfLdFK03dp39zzEm+acYcgcRVrpPsXj/T/z9/BG2UrIQ8bGnus/OR0HgGsl1yoyaCPkwvWjMmpI53CdqqiCX1QOfEt+w22FLXMqnFF1rr5ud2+QOZHn19r1G4vAUK8bdju2iSxJN94S59Q76VGNQbXrZGNYtgOROcm7O5aLGWXtHGoI8xCEii1e5AEX7t1Rpysl4rni5CL473LWq2ldKQzbGx78AAAD//4xd228UZRT/zczOzm6327JgW7AXS0tpQcpFjcYALzwYXzTGv403X33UF4lESHwQQaKGQAjQKJcEChZo09Lt3mZ3Luac852Zb7dAmD402XZmZ775buec34V7kEBn++HkrusY6wA/4wmy3yEFRIGbieVJkCQbR8pGyMNHWZDLQk2W8BgHtaHt+y02BprR0ptW3+rU2B1op4eZjDjhwLZssfl/5dvHnLXRBubAXe29TFCRGOs73YxS0sLz/RzCPBBguWbQpcZjP7PW89wsuMts6gwiQhSYI+aQ0311jA1HYl6EugDABGQScMeZv76ddFGNAm2/WB0E4pSfj4URDSSIbAKFUx7zc/HGLIwyRUrmPemmjrJRxsGBvkMsFgVepIPJSUSskc6jZ6TBpFQEPR+aIYdBhpjgl/gz7aiHF5sbmNk/jh4FypSiTQQfSJCkt00wFHzsqYxirDaBzVadq4xBscyb96GgwhZnKbpZn8kmAVZqNZX4BJkCtmS6XUuEMmFOuAix5P6Zyqt3BkKfNwXYdoJgMEhltIR1vo6lPOh1dk3gg9+j1h2apdfPCH0D2zaSEje6KEjmDULHFSscUbXOs53VyjCqQYX9XTlTnhoYFKQSBYvLr9urUqHEyu3EWd5uNcRmpCBK9gK/j7PkjmO4Z4GhNYBdKfw+BIOvtJ04RrlM/KrQePH6fQgYWEmeDHZpBIk8I4jI2fY4D0Q0Ydg/nvvbVhf2TIBtwKWCnqdHgoSxj/baK9y4dBWdp13sLTpIOnbwrxN6Dol1/QKGRyr48ptvMb94DGU/ELXugaDUNbdFV3uCHi49uoXVTgM7fszzkqFp8nycOCLkFiNiHh/9UMU5RMKcVrJ0pMrH3kIJle0u4n9W8fzPu9i6egvhv49RSyKUowQlVkQ3dfzYKMwShJRtOMFcyGKhBLdL/beHolNm790OAy/NHqFYxNSheSwsL+HosWUsHF7C1ME57B2fwL7xceM/Lo5oAh/PF6gwbOPjjxbxnpviyk+Xsf1yA800ZP2DkGucKbYaLXx3/jxOn/kcE7OzrMKetbUOmXfaoFgLo9KEaAGHy32ZMC9ULt0/PYYD01/g1NnPcP2Pv3H5wkVc//kimi/X0OFKA4mBSp9JMz9kk0xLjWUYW3o5rJ1C76XoBAg7Edpra2jVN5G2dzC6eAhuewT1Zhet7Ra6M9sYP7GIeFj8sKNOGyXym48TozGW9M0rsOaZxNJEcK3kt1r8uZbvv+0YoNV6Wpd0068oJM9K7qvDDv1mN4lQKv6+QYnlNkdpLkIxcNjIu2xwQDeZslH3Ow66m1voPVkHnm8COx1U0wKmiRKws41o7Rmer9xBe/UZhrsJSrFYp3kWD1mqzUYRP5W1xTNVTWpXSj5S7yVhuZn5eXxy+izOffU1jiyfxNTkDPyil2XmstG5K9ek2ih25f9th/e6i2QHz6tsHEDt14AXv8AvF77Hrz/8iPWVVYykRVSDEvbVqujGTUzNTmJ4bAQzi3P44PgRVKf2oTY5BsLXi6K0VMVFXNThmbrv+3VegyThSWeJS/oGyZKahGNkziIO657aEGq1WRxensWZc5/i0f1HuHdnBX9duYbbv13Dxn/PEMUhX9pnLq7DY0ruwrLXNNcMlJlPkFykrJ/RajXQeHAfrVdb8OfnUDs6B3+Pi+JoDc3QQXu9wdaATuhgaLiMocAX1JF5z4OJ6l3tzJNoXjxioWZNDFHVLiWqVoLyUAml0SqaUZ3XEQ5OHeFC83hSEv5rjsHi05uS8nmy34gBarWbecoBOuxiVcR6u4nHzS287x3A9PElnKqfQ2djDat3b7M2R5L04GbIEzlY1kbfcQg8vfcQk0sHMVQtMdqIqjDUFISocH1NjttaFXkRz3YEIKFTWPPPm54Lu4LQnHbEe5jYYwRW1IqwsDAPcf2XQWAL2OmaqHsn/QtzpN0UHSSoo40bKzexEzfhBR77wRdTX7zg+XxTHTUX0URAhlIyuiexKTJyUdLSzMruP5JiptBzDALZOBVRokDpy9SHc6cdKXJq1V+DREZUGS0ox4iy2SKs9DcKAl1juQjuEwXez3LMA3EN03a1BY01btKCEaHNiAMflEvwHJ91ypJeivZmB9VCBScmP8TJmROYLExw5d9RiAAUAJCj6AaPfuLeu1d1KmAAACAASURBVB86MxE+8RXaeJK8xO8PbuLWwzts/wdXCnQeuczVdxAkDkbIRcwTqg7FMuCiZsJzE1vkmf4i2laSACgUgwxpLnFhlzw5s6QArUm0LlDsxIg2pYAbpX4a+0xbMfEWvU/bwpuEbeMu6UfQ55QsE4FxGSuCANCCmG2FL+9JqKcSMzusoUQ2jUp/pXtRV548fqZg38voJ/rOKf5TwXelomSC8FZxnN+VFT/wNRwH/xN2bT9xVHH4OzOz7C7LwhZKsUAtWBoo9mJsYkxfTPSh0cTUl5L6Yqx96n/hn9P4aOJToy81Xh5INGlMq60GrZRaSqULy+7OzJ7mdzlnzi6gm2yAkMzOnjmX3+W7xG9ef/tzhPZXKgYiiYTx/uc0yjQAJIwXqoUyDCuA0Ih3oXRN2S/eKVDGAsPwiudqYUA3Lwq1mb8xt4ikeqZ8rYAnIf6i2nEc2HycX6lxPCVbWHxZZ5+nCVBh+1DAunMVcRDISOSh49Z13RUCwgNNFcQ88xwi5vWoZRJvLmUR9CO1UBLxC5O9sOMrwoFCoXBcf6j4mesGh4EcQ91j8TvnipiDrQRe8o7DGTuujFaOQriR1c3EagFDYCmm4GE7KkLP+vGkSreHdPM9D4gY9cFPIg6UE5tgbnIGpTxBQkG8Lcrq/rDyD7LoZPUEH4VunuLx8yfckREhyQjOodeqPJDftC36NnDjYZgFzM0l58bsP7Td3HQTJhr4f3gA/h/Ez30ugmDAjW0BPw+C9gM6dm4s3JVdNZNE8rjwFsDzCkcGU1ApYAoBR6VgcOc/KeHo2CROjM3wYcB6ryRwaCWMpu4oC2S5Ld47WhkGZ27ZFja2N7HdacJGSikJOk1uWjjuXYFcGFByj4pkQw5OmfssyJPEfYejH3vdO1j1OIk8OsYdjG4tDirk+i8y8Pys903VnwHwkIK+3m6KeMfi0ep9/HL7B5R2LHPlBXZv+q5rVQ8h51KAwbtXPsTKJ59hdPwY89I8Z1UnfK4K0B0V/vuutY5v/3mIZ3EOWynzAdHjPS9lrqbwH1VHg51ERB4p5UJfF5XU4kgaY+hJE7ur97D25Td49vX3wK9/YiozGMkI8q9e6BycBxQGXXssPGOl+hxrCJDyczeIqlXMnVnCOx9cxrUb1/HxjU/x0bWreO/9yzi9fAYTM8dRa9SpKiQ6ABRo0ryIepzskVBgEqmPfbaLqPkc1XYTSXMbdeaCqwOJ3lLaauLY1AQWlxeRMO9cOzlO/Oq/2nPak7QeaO3euQ9hImf3pSBl4qaWhkcwc2oe5y5cwOlTC2inGdafPsVuu8OCeF06f8hPnfnWPYXVFjQD/7bSNqbyGoUpUZaiubWFve0mRivDqMZD6HUsOs0WWt0uqsM11Ebq6u9sZQ0Z2yd8uQ+J5AM2u29Owxbns5uhBBElQSUf3NP5SAm+2sXaPPf2QZEqK/cc2syKd79Qe2INiNG/vg6DAFnsT5xshEpURrLXQ3djG+naBrC+hfJuioncYrZnUPrrEboPfsf66ip6f2+gwcUrKxByW3R3jX/CxblCO17PRrxfdXPLWhzHT87hysoKbty8iStXV/DGpUsYHT+CPFYPwAiHBr0FfqAXzCX9VHswHaAg+xwyLBywUhHuBdLtx7jz1Re4fesWNu+v4VhlBGPlETRG6xhrVDBypIKZhVlML0xj/vwSphZOYnLuVSSjDcTlGiwVcq2ei5GzzYsG7rt4h2KlxlEmgvuPVNHf7WaUZJeHK5iancH84iLOnD+LpbPLGG7U8WJvD81Wm4X+KNkmcTZBD9lwlorTjF8jVgzfaNiJhkKx4PMmst0Wuu0uF8FGSjWmERJCidYJOQmgkxXUUooDjdsHTADDtn5e+LWon+n2F/dVjRbFjWrjWKZZ5eyx7cQrnfmJtcVqNMF0Pwgi7/4e7JT7n1oA67+QWDd3MukoU3wzWqthenIKU2MN2HYXaw8eEIQJJdalyv1890/OOQ4QDaBtkZo9NE4cR328IQVlgsiXYqVfhXgusEe5o0BWNMYwigCSOKJ//h6EjAxfTryt3aF5Qfo7ZWTdHGPVOl4/uYxXhiYYwWOceHJYQOlDNstvsVr/UVZxb/MhfvrjLnbsDqgHMVSW5qOkMEqR0DhWhIvNvniPkB7c3MoEws9uY2mXk8Pw+fF1rPDQjdKzRJBSm11J4hsOLs5zVGYXc/q4EwXqU4QIxdbVaP5i9N7lei45VScrjdUzjZf6yz9BrqLPgQXfQPou5OICRN0IR8vjuPjaObx1+iLmqrOooy5F8DBPjdAH/T/std9sb/AVXMOIllELOV4gxSZ2cfvuHfz428/Yydtc2ClVEx/zkw7PdKWBpRPzGK3VsfNvU3IPjf+oURep4JTxaJxIkbfG55A9VcLnBmaSeMtG0YyTAg7dHOVuGVO/CwQwxSn0HBihroh1yutETypCzEU0J5zvaBvipsdfmRoCrM4vXRyHNnE5NcV3LdJpqpR9btxRXTBO/DkXFyFdyQeFiu10GRhZnIlwuDuzpcgknH+Ov5VmQvtJGDtba/ESAAD//5RdS29bRRT+5t5r+9pOSuLUSZu06SNEISptUZtCRVkjUQmxqHipYlGxQKILfhYrBAKJBRKLIiEQFYuqqoDyKrSpSMjDSew4ftwZdM7MmTt206rcTRTLsq9n5s6c853v+058/pr1ABCaeEHcblyyTHSJngsYhPbNtEHqEU8J/RAAIANHA2T1Cg7ZigKTNK7IRnlP1QD9Ep2DIDAwOjfT82ZsZoDaK3/3S+iHOVayQBI3QGHFg97PVUYfNOWJgXw/IUEyoZaZUPS/RRJwqtyL06jWjlbvKpQh3dsuRBugslGHb8WYb+CSfMMEiWbQuoW+h+hF0u/fdgiI87Y3Lplysnrr0QDkAYsDV2h+sixz2pXMV/uV60TAAI2ibgRVPz7cIjBoJxgeAMYJiXt9g6zVxdzkLA5Wx52UVpLFaCBgQ7BdGAcAMHUrNVjZWkdjd8ciYUxHdQl8NMjREy8HH4CZQXq9UlKBD4xv4vwhGTgg9tHf7gcADB/y4VUqWQ8INvWg9opau1Zu+a4YBu2PABJO62iLXPaBT4jK1O87R/Xskd8nm61UGWK/GSgPalQrVRytz+BQpY6qos72CTMy+EhRFgBgV3I4i2wBbPjwNVhpbWK5sYqubnMkrqIwKHYUeG6fWIDQZeUThgEAcTYNV4CVzsRe6yTrXt6S7zX2uRKGDZB7WBQDA59hAECuLEj+IbouAQC0QYcoYG3NbuTfffo12n9toNB1EpVYQQfzCAEACBA0BnOLi7h6/SOcOncB1XIpjzhlLpWttFFv/1UAv6CJz/+4hV/3GmhR0kKJVoGqBV2f/DsRiwM2rVkQjxM5kveAcqOD+Ld/sPvNbTz84gb2bt5CeWML9aRELGEo3bcO9z44tsEFHb7CS+BDy9hgPS1UoYplHJ2bwyuXX8Xr772Ldz54H69dfQtnLr2EY8fnUBkZ4X7trKtTjt5L9HevAHbzTuk46zsydHotbK3cR+v+HSSNh6j32zhcTJBSuNLpItGKlYgEsm4213H2xSVMHjnCoIpfk3gyAKCdrECHyRrvO269RZoTePsOAQkN69qpIjsx/gxOzM3jhfMXcXJhEa3dLu79vYyO7juAzTrpKhcYSjhmqxzGOlc7mVLE5OwESS9D0umis7aKks4wPXUMKk5Zk7m9vcPAQiktUxbAbu4ZskEN5v8BABzdX15nSmnHnkvUrYc9a4g5RmwA/ptwwMPVEQqkjQXu5fmMpMe/9wAwTw8A7HPRHFd2Ab26g86Df4HlDYy0+zjU6+Ngs4nR1XVs3LyNzTt3UWy1kPY0Skbx2hRvbtLxaye30S5Tk37uiqVKFICNYP70GVy+cgXXrn+IN958G4tLF1CdqPFNUfU6YQfwxM1eFK6YAA4IX3kUBNgfAPA++U94fxu6uYJvv/wMX338CdZ+vod6oYjZyYMolSsYHR9BtZZibLqG6YVZ1E5Mo/7scVSnplAdG4OmFq4lMvUr8pPHClglCfBjvlcON+TPkXKrKVI2MWcjQf87I26YxjUpcoQvRDgwMYbp+WOYP/s8Fk6fxdjkYTS2Wtje3ubAvGv2EDkIRMYwV+zLsxlKrSxjjNpz6o0NmM0m4m7EveFTYqLSftxqcz90Xm/EQGVHsNjvA96DZhgA8PB17jciUyXnPycXtL7igq3uEo++a+n2kT+EXBtW+T3+bJak8/HXgOeMKzIIABAFd8jnh7bPfSUt8qjP1Oo4eWQWB9IqGmtrWPnzd5QTw52B4O7DH48M4Ma21hpRq94dVMZHMD5VR1aM0aU9TmW8Pwlkxl4Ebjy8jNd9tsQR+ToO9p/ALDBkPMieUywkLsYiqW8JOlMwPYPZqVk8NzOPCYwizswAUOk/W0mXjBxEUgxGZ1jXO7j50y082HoAVaD4qmfBCoonSFYUFWxsqmzlP5GkK7gk5peYm4tv0ByzSdHMOA22yG0zZ+YnCVSk8uKpFBukIJEXVY03epZE0htHZ5n3QmID8FAOysxgGz9x9ZsYKcTAlcJhUrAdgYKoZhAAoHEvIeuRKWKMokkxUarh4sISLi0s4WiBDP8qNsYO+yyyIWU/eFIeD2E+NQAgmn8oNKGxiR5u3P0B39/9ETu6hbbZQ3k0dd2MMpaZjiUpFmozePnUOUwcGMfy8kO0qS23svIs9mmAkH/yvMMWNPsD3lOWsZGxQbh2IAyNL/0vhW+eJ5dwS1t8Zv048IgkBLnHmGW1WqbGsBxsEAAI8za5H8nppODLrGXXXp3yG5GGCDPBfraVBQ8YcLIHne1mQV50vs2mL4AOFp3lPjgPNwb/AQAA//+kXVtvVFUU/vaemTOdKdNppzekSLHlFiEGFMQENPHJGA1BEngRow/+EP8Qrz7oA15CokRjUPClAQGh0iudXpjOnMs2a+219jkdWl9s0odOM3PmnLP3Omt961vfV3r7ywtf+e67EwptVli8voutXUtVQYTJu/KwOdrllYI9SqiIGNPxOU3yRWW3JzMwJFDXy73ktSAuMgOsIJSpjCiw9zrTo7xnf7lAE4b6jkrSoh3r/gtQsjZ0RIubX4t97cLS4ufkSBCjYnc5Fc/PkgQNLj6iKMz7cBIle4dsuyDFEEwfHdJgR4dTi9AQeCplcT5I840m4iO6qLTTn18HE8ABJ6JoSo1WFLEYxBNZ6IQsaXEaVE0FefTzJ3INjA2UGI9AFhDbPsobWTDytUuJyt/A+MiYt5Pxqhlhzgh7AABGKJ2skOoSLK4uc0JsKl4bgVkgMnvo76+V72kDmGMN8rUg4ipZeLBZAbT8zI5et+IXsWbn+tmNrq9jL0WUV9c1I8nyFr5X4h0agIddAICiwGPOVsj/TuI4OF6Eax0e0nnA5c+0RiitksJkXpqJBJdIALBlm6i6Kgs2UpeE+0VWnRpMYWLdd6IzHrpI8HRzCQsbS0ht4un+QW5bhQ79+bBAy38AANxtYSpWjdcfUTCNiI/StUqlEHHBhjEVZo8WOV4E0IMFWRgB0IdxHgh3HwEoFv+0BmPtLFEcIU0T8gHvGMz9cAd3b96GXXeMTFujDBRZJ87v0MQHIES1AVz+9Dre++gShsfH2Bc7FftPJws/E8u/TQM8QA8/Ls/h9vIjtCsO5XqNxfXo9iUuLYzKmJB4crIcJ6iQwn83xr52F9kfD7By8xfMf3ML6b37mIgzNDOHiOIWKf9K7CmFu2pk/t4nz9sioMMAaxTh9Dvn8fG1q7j6xXV8ePUTnHv/XUzMHEKlVmexQVpVibCgUhdz1xHCyqG96TtnuiZTtvAhob806SJe+Qerc78hW/obB6sDqCPFWGsIZYpvDAIQYwBYXF7EoZnDOHriBKLaPulcCufP7l7gQMpwn3LkRY8RIEKLhCyUfFKASAlFdH9S5CervtbkMI6//gYuXLyI6dkZdDrbWGmvYjuJ5V4WOoTym8iR9R86YhNR4dzdhutsodduY21xDftHJ1CvD6DX7aA9P49qcwg1spiimdaS82tqjx+NYe6lfeUL9R2gYObXJs3tlxTUpZSXYhfF/LDHctca7wLg3W94/IzFc/8PAOBZB7Sv6rFB7+kK4ieLyBafI2pv4UAnQWttA/jrEZ7/fg/rcw8xlFgiqHov5LwUC6Wdk1ilFHYCBeg3sWXMHj+Jj65cwbXPP8MHly/h2KlTGBof9R08UnAu+blO2s9kMWxDDNWjZMLl0cnjdHcAQIbFdwIFZg8GQEH2020BvXX8+u3X+O7GDazNPcZUo4kjU5MYH2uhFA2gMdbE4MggJg5NYv+RaQwffAUjrx5EY3KMbyl1/kvVBs3kcMdQZ3fzQjd7aV8Yp99b1qhRvZciQ8C/buS+qehuyraSifffrlTRaDUxO3sMZ948i7NvncW+5hC2Opt4trAQdp4pqChmcizTNwdfYltFCzKAjeIe0s0O2qvrDBSV6Xhc+GcMAJAqeMrFStkXAtaDjVbFhTW6OZuDACYXpQ4FfKD1KzsmZbs4fg8VBd2EhQHDHSwAAM68vNz3LJT6qfP6zBcAQF/3Vl2ekUPPvm5vG436IMabw2jWBzE60mLXkYXHD9FeWuI45QokgjR8tufEED7y4gXQSzcx9do0BidaSIkBwEJg4hqjK8XIuRkbclD9Xupzr+ewW8Ojn+lgBagj/S7yzu9sd9Hd7iJyVRydOoLp5hRqpDefid1eP7hpkAOzsudidLGFHv6cv4879+9iM9tAYhNmAoZcGjoWovxFF5Tb+/chF9XViBtpbG1esiLu5t+jzkIKABBFXIWewQQUn8fR+xU4pa471T5UFyijgkABVYyHjCNw7ijUbq6HqGnB3vE+t+URAmmYeQAh4nPhxpx0/wNIg5zWnQURQD+qRmP1FVdFo9zAmZnTOHf0DCbtKOoY4MYPbyRjQlLgY0c/NLf7j9vjf7l0igt/+5l/h0Vs4Pu5n3Hr7k/YMFss3khjPVR70vjbYKmCqrPYXxvB+emTONw8gKhUQdxL8OTZU3LO9PodZZNrAos9dWBbKK4pYxGx3F91WMiE9RMYGlyEUxHtwT/ae9oo9s5t/h6ryK4XHKfxOF8zauHttQSEoS1xgrUmJJ/lXEm68vxZJMzJOZl/3gYnM6m7uUHGjj5+/FtZ9qExbMS6WsTDvfCgjB/TMdnyXNi3cs68vmk/pyn+BQAA//98XVmPFFUU/m5VdVVPN9NrGmZGDI6ACIFkjDgCxmAkxKgPPvhEooYH4cFf4e9RY6JPPhiNBPTFF2MGUQIBZZ1hmKWnZ+larjnLvVUjiSETtvRWfevec77zLeHrl9/6nC4sZwLrdNXwGxVtvs+zh+j1q+Z9AgTA51iyu3cS+3xUdsi0qZoZl02UQ+LozVS1/Y7e7BphvqhWjOakyXK5l0bBgxKo2GG3+0gLIpl4M12dqDLO9INuQF0kY9bMy8J3U2OH+jhtv5ushaphLrQxgfsMTM21stGwC3IiB5xrRh34oO7dRv/vmWitwPjJI3/JkaCVVieUjvbC8YvOTZlfM2CaWqYgQTUW0NE86DPQc44zPbBjQcByPxkPNE5EFrE8h/HGJrRQRGsvEyAvZ/EUFLmubqPkUle/A/rFOfisaUqwb2oa9SAWebkDGFSf7ptnfV5xiCZ98wRqJuKb/dGT+xw9Rw2oUVqxnnUeyeOmP5SdjNHUUDwZuFJ134kaokAZCFlR0eHpASoJBeJrUXhqOGSDLnKVIsjmw9rsCnJbBQxoXSjXAnFSFxd6BsAUPNGm2mohZE059ZeJvxGtO7Nt5HrnhXBvmQURyvWT49E136JBE/2M1QmkTAXIxKwRNnFs/2EM4g5aQZt1ylabPqsgj1WnZOMnrQHHZVFxtIUxbi7fxtp4HWEortUizDAa9ylgQhzJRN41iKLh341GUqGTqZaNHkybLMe4KNpKBnWsoTLCUhHQg8AxoXm5iJ9AAb1A1w5H+WQyEeCI0jiuMA3KAr/QSbpxcidyPjZgl3g7SjGxE2Pj9lNc+/I77NzbQJKC6XK50ovdxC8SWAdFUMN6nuHkO+fx4cWLOPjSEdHwFSivr742mZBtGeA+Cvw4vIkrD27iKckpGjEZojON18k43PyD7sXmRIM/G+sDiwLNDGitbmH4y294+M33WL/6K5L7i9hrQsS5FPuSB2xLSrm1noJrfFya0KUn9/bwxnvnceGzS7hw+VPMv30Ws3Mn0Oi2eG/SW0Sb5pz9AuDYNoyki/uw09yy27g2F1SwGpsiyLcwvHcL69cXUBuuweTbqMdE6dtGvzOBqe4etOshmkmAtZWUs3tPnj6Ddr/P9zRXNbSRGFspVp5tYIz/XYtIu5vCXTbNJfQYGpEt+BxvivqrAZO9Fo7PncDZ8+cwc/gQhuMUd/55iC2a+FSMqTTMiWf+rFGH1c+f8+uzBIL8AdICdnkF24uL7IDdbbcwHI8xvHsXRRKhO+ggjyzymmSsO+DIPZ8xTqKk80PNfJYI0owPZ6PTI55mUjEUhJq2Ifu2TBlCpZ9KJBWDIJrYQbnUxslaGMyUqZctpCnmiZjecxSh5AawxiFKgaw7yTig+zmG3bKoj2jyv4b8wRKwuIR4dRW9tREGS6vYXriBlYUbyB8/QV0dywkEY5iG90B1M3c+81b2PPKYIeI5MWqmjx3FB598jI8uXca599/FK2fm0RoIBdqnlDj3da0WCfBxd6fRrP2i2AYsefKkDH0KHJP5CXbJ6imnlJWTxFPP2euAOzWpNdKcTKXGrPv/+duv8NMXX2Pp+l94sdPDgb09tAdNxHsSNAd9TPZ7mHp+GjOzB9CZmUJ3/wySbgfbec7xcK1WF6gpAGAKTUAo7fhcEV6Vkliln4tMINNVK+wcYn9xZl+lkZYts1D/eZLAuL0j4HOa9gBiiz63fwYnT89j7tQ8Zo+8jMePnmD56QqfmWPl2/Be7uqHsDRqlB/hOEnoSYFie4TN5cdIl5YQZhkazSZqjTpLjIIowXhrjHwnx0QitQ+BAZwJTvojcuOgHO9Uz3LGILSxVXkomwUz+C0AmcnLtU33gh1nsOSDovUsr3+falDdN8q6qPwxukYq6SX4D2rAwIUDKUwJ2ik2Q9eNItv29fuYGvTQnWxi0OsgHW3i71t3sbOxgbqR9BGfpKlAFE126WxNQsOgJZIA3RdmkCachcZgNzWwXH8p3G+cnKWQvcq9rzBKeBrNsdAsUXJm2eGua0BDOTdQM5V/y2kf0ZqUZC2nD7+GfVEPoZ4+vjH26TPl7NkndyDn2mMTKX744xrurN6TqMvINaKuKdKUsSDQvbDgiSp5R0U+11+y/i1kABEGknZguJlPeZ3z4EtTyFxtF2o9Z5SmzyxJjeazLoKXWMCF1OyFT04pDblRTSdzzCz9c6YsBnpsTBGD6tnFpslEPaf7iHTfttBzXPTicU3MDotMfCFqsdwbFKlLzXQ7auPVg3M4e/RNtE0He9BAjFhrRuujg8t2vbz6/w/p2l0SOweo515Iaf15OEKGZWzgyq1ruLJwFQ83H7FjJW2JDEYTAJIZTNoapuMWTh08jqNThzAI20gCkTr/fvtPmHrELkE1Hjhz5+ZrSlOVbFBPonVsHJWJc25QS839xmhd3rXWLZ4zqMAYg54qM+Ie2UkPiJ1H+4UOWmkALH2vgjDcx8o+54zXneG4u26yH1GdKgwVqunocdTLsKFwQGtKzfsobteBfLpe6O8EMHHfo9HtMuQVJj8zjele1f6bQSxmmtR4XZkgwL8AAAD//3xdz28TRxT+Zne9tuP4R0wSAqRJUaUmpVD6AwFSq0r01B7aEwduqFJp1Rv/F9deeiktqpB6o1S0gYJApUSBQGLsOP65O9W8N29mYkMtOYpiZb2zOzvz3vd973vxB5eNB4AOekryt7CLeoTReIh+r+9k6WJwIYZ1Aj8Kc2mSPannZ+n72MOigcya+qxS0syGfmH7PGVr2IW5FkWCmA3KW4z8ZAMncEBLIs9KAAq+bYASxT54DWe1oP46cAgV52O5FpC2ccrhpR4hVUG9idSMRRxEZbYVRMEqBBzbK2mIRZ+FiTTIHxv4sVyIx5na8SRT8g5SO0A5swuIDCb3khTyZFDet0Dk/HEkbqjcvq1ARn+8QZqWUMywh7J+NcVYU6spe20ZWQv2Qs2OkyYXMMY2R5aWMZ82fFAiie7EcgIJIqkvbMIAkhpTK8Ctl9vQBUWJIXd94AUgF/+KsGc2gTmx9YwoOH8LmWM6SAZCCX3ICEsJhSweUeDIatd1ZwL4KgBAknKtvYT2dYoCd8xQxuskvv683Rtq0oKBxZq2hlfLhSSGmkE802d7fnYOx5vHsFBsUsuXSESaKvIgBAEGnm3O7bzvoY8Ouni08wR93ePk3zr2hF4SXsnCniA8l7RrKeSlWmzaGdsSBQayYgs+aRewydilNCWzgBZJyl1tn6gVfCcOiV0jV2rgpoYsww6Ay8C9pskgbX+A4iiGfjHC/Zt/YOPGLZQG3NqSObWYefNIkkv+uafHqC4s4dKVb3D+swuoz9asmZa/lWK0O4iApwDuYRc/bW7gQW8HA+ORadgflVPSo+Bd/oWkofZVhiUaDlEbRZh51sbT67/h8Q/Xkd9+gIVOH4dNIGZATtt6SQd21mGtejkuYEAbX4S0UsHZC5/i8vff4dKVr3Hq/BksrqygODtLinsJOoTNZpl1yIZmNkmYSLLlbT4ztX2Jwqj3Eo//vI3Wxh1E7V0kpr44MeqWHsppTCZflVIRUabQ73bRNcxArY610+8jMcF+jCDhfb0KYAoAmArYw0aHIo32CZOUDzDoCpLl1xsNrJ08hdMffoSjyyvoDUfY2n5OyZ3OBFBhdURkXdD9sXNOcExgbEzHDNuwt4duu4Vuu43lN1cxLCTo/H0fu8ZcqlpFIS0hN+B2RJGSZensCAXTxz0CWgAAIABJREFU0HBzP2dtoZMhih+AY5wssx9boFTWNG2VClJLKKwZG9p6A6QDSgOnoAvK1cKXCXjM/+YgaXVRpchafWTPOsg2dxBtbaHW2sOhdg+lJ8+wf+ceBv9sAp0OCjbZgkA6SjRJColTryhShY0MOWHku7Uavrh4Ed9evYrPv/oS6ydPojrXQFKQBIOTXk5+A48TNx7PhJuEX4miReWvnl+THjgHwmVfYgPxUMkHdDwDnCLbx18//4gb165h+GQb80kZ66urmD80h5lmBQOMUZ5rYPGNJRxeOYqZZgOlZh21w/OIqzPEDptncqbaAGJTmidtK33yLwzowTGGTK0YMdoAXk0+P7I3yDzO/bOiWfnk1GXmOEmEpJRi8egS1t89gTPnziItl7Hd2sHLVtuC5tafIjitsLeHXMGI3NdzpGZP6A3QebGLcqWC5sIiivU63/Nexr5N1viQ18kYKo+ovaSyHhfEhlsTaPaNsGu26ZQETrhJHTDmoN58YHwJ9FATsCUKNmVlwtq2i1WT68nEywsf1MToghsQ3hv5s2UXojQhULxYSEgRcsQAQqUy+YqM93v49+5dKolJKF5lnwutZHzGe6RA8cBglKGPHuZWllBpNgjKIqLJkEiaiTYCT7RXzoZdqbSw1pEvo2Tm8iCg72X84p0QBeoYU1I3wlsLx/HesXdQRok+18qXWDhPUztPczuflR5jrIwJ7Rh3Ow9x6+Ed7I27KJQSlqwTax/4nDq/Em/ayMfMaLzcvs1Lt0VWr21pKZmqJbYX/sRTj+B3AUdhFcgUr1syKrWSfgQJv6vRDnyjVNCWOE58+a4ZkwEBxNNITNiN1Nsol/qDPq9fEoNplqRrq9I1wFdZpWgU6jh/4hw+eftj6vFvmP/U9kXQdmHSUyPE1Gr2fy+XEwWz3F/1iAwbd7CH6xu/4pffb+L58DlGhQyVaoXnlQExdIzSUGG50sTp1XWcWlnDsXSRnk9jFWn23kcvNtHqt2m8CS+oRIJNxdLKf7v8IqW/ke2Jz4Qyl735M/bxtXQck5eY60kXCEMiGxNrN+/tc06ElK2/N48QGTMaZbVl8M13EpCUc1mw2Wcd6WWVA3y/xxjZPJt89+R0JLSleeIVq3Q1bEks5678QPl9W5Tx1kAyy/AfYdfyG2UVxX/3e0znwXRKpw9arDwNysMYKMToQhNjXLpxYzQYn/FfY+HOhZioiUYXhgVuIIiECihQSmk7wzy/hznnnnO/+00LNmkmDXTa3rn3zjm/83uEZ8UDIJJiIGXtfcWiUWMbSaBmdtValanXGq9FDVF/0HP6f0K4KlOVYtUlc95IFa4/lDYwfz/pWiQbn8EAobMroGBMgaDpAWD6i4FrtvU5lRavDawDEUzRsKk8IRX6vtJAbANnp8F8cIQKb40/MkeJVCmEa9j1yIjvgDPw8D4ZFOFsXohEopz56S5Yd0kZnjJbl30rMYgUxBAdizOyoyLSa2x20cykoPG/5gxIYXM4LwZBzOymVWp/7gCVSFIa+OAI9TmT2IyUqSeJZJLnNmbYNXjggpgbx8EI07UmVmYXUQ9inm7udbnk8A+ukUm04QMfNmJsbm+h2+tI9nTIzAC/UDWip8klPaIoUItGobxOVjLg0+79Dy2IgSK7Uy9o/h4trCf0XtoAMwCkzv+0phrbkaQ2x3WCmjYZlZUrSuxRbAOWmFh2wl6OxAoAKNTEky1jJ3D1sIaVuYM4NLOAJmrkIW+L6kkkwWsSIdRaK8dIcXfzAdafbmCUC6XcqN+z0Nqcc7D118i9TNOCAemBSEqX4jPrGZgEgTT4HmNA7h0G1IjR44Ei/i5yF6KCO3vsNDdZN1aRQo05e2ZTdOgwRTw06P29iV+++R79h0+ZThdLC6xNuUBkTDkek4YrB9567118+PmnWFha4iSM0EYfO1outxcB0DHAGsb47u4fuLH1ANvZCCmtRWhZeaMkY+MkzYWnR0r5GA+GPFmeTULEt+/j8Q+/Y/3bXxFcv4dWP0E9zSVaST0KTNGIm3KhbYGpGKdeX8X7n3yMDz67iAvvvI2FpWVmrNj5i3U75iJOozdL+VhCIRZzvVypgybzx8FSBBouVvv9Lu5dv4bO7RsIBzvc/NNaTrEpUo6MY3aqaFKEYKOKZDBEt9fH0TMn0VpcRBBVGIR5doWivJvy1+Xf3TcM2/1ZqE4151zopeSREAZoz7fx2rlzOPbKKdTnlnF/Ywfr649p7k8DSmRkeCjygsAHXtT8CxagpOeKhmP0N5/wpqIEBbQX0NvpY9jLUak3EZMBYsBorTUtEx8EBunUrBRFM8eFThQ5408tTlJxFyY5in0Ps/pIdyS8GjBnP5uRiyGyAPTEKXoeAEDoEzXeHOEYIcpjBJ0E2XoX2aMuokdPMPOkg9lHO6iQb8W1W+j88y9G/T6fGUtzzQSAtMr8kAPmcrGAzVgPTDdEXK1h9Y038dHXX+Dil19h9ewqZlstxLFY2bHO1uwCpwLvfSHXCXhuHx2Twt/HE/tnt+Yf5UU0obzggTXTo+cKhtz8//XTZfx86RI6t9awH1M4vLyMfY0mgmqMvBohbFRx7MRxzB1cxPSBNtCYwr75/QgbNG0ao9frsUSg2pwFgoZ9v/VBPhfK8Owm1d3DDvj14UFtAZ7RAvkMgRIoYiep5F8y/+ISjp85jaMvn8E4M1i7ucY1AeVzW+8Mm0vvcy/YfUAmuTEZ1pIZZBJwtvv24y0LbNVjDMg8lt7bQssypPsxEQYcGQ+r3xAzVPNM1kSi/Wg/iXDelwBQ/j7YSM5GkIWZsizT4v/yhD537yBAGZgvL/AkKPZ8AMBIMo1RJh6xVROSPCSYb7fRbjTRqtcwMz2NfNDH/T/XMNrasfdTYNmCmbz2mXo1IcEgzbHdHSKqGawcOcx7K2XafCaaaIscGKnbuK9kOW5k3zlU5yxSYJYF8dAw2VXz6npwHZD5f3PIVPTTR07i0L4Vvie14Sr2H4r9qCdVfFsIANhAF1duXsXth3eQhxkPKO203MZVk4TDoDB69mvjwMuB53rW7w0UAEBi9ddx5Gjb/r+rl1IYeD5jCpBIH5RIn6JMK7/hn9wfjhGt9YokHWk/RMxmThKIK64/sn5hNpmFGz4CztOhlYzltg6jZalHNSxNH8DqifO4cOQ89rPdX4NTOIpsErPn/WB279T//ci920Mf6XchsGkDW7h89Uf8dv0KNkZb6GVjNFstfl1J6lcPK5iJ6lhuzuHkCydw7qVXeVgYCdOLe9MI6GCEOw/vIcmGzAJleXRQXlfV1JfqPvGSs2seuN6AGDC2Vi7MIsvr4A88iyQuHSCqFN6XYfumjyqLp73EMmH5ORyLL7p/AuR5WC3JPNpH6v3AslYxhHcR8zqknHhR1GtCB2/au2qfUZIw5zn+AwAA//+cXVtvVGUUXeecmc6003bamVagSAuIFYhUGvTJaHwwmOizvmhINPA//EXGJ3nhBQ0aY2IiSR9E8FJuvQBlmBnmds75zL59880wxMRJSpOSaed8173XXmvt5O2v3v3aqPG06Glzm5ZlmnSeGCb31o5OWifAV+FNE+OCPuiiX0jYvdoGZ9g3XSpJ9P98iQXvT8wzQE3xLMHxOnbnvOmC9cFMVL5Am66r5oRJ0MqNqfOh1j/Tw8u0FHHktdmCuhW98UemJoHjiJ0bMz6xYNq3k9BOA1mmDpTKBLAekVC0hk0Xg1ksFJIhaKJPIMyB2AMdTCXSxMpr/XM5rExe4Y1t1LxRKvoFTpatnYl3GVXwhzskaHJPiarplvj5Pa1+mPzzHEyVJZCKpSdluHgjHxDFrKXtd3s4eXgFc4Wyr6yNE4xGAQBJmgnEoRplOSmj0W3gWbMljuKadhpiG84LbKzTjIErev4ojkYqNqObeXIfWvYHSDPvGpopwsb6ITXMilRGYmwLW8+sJXLZCDhgDruxdsUIN2PoP+CMWaO9ZjO9GHzbO/PFGGsxggAA8AeY487wTNWsVRZxcukolotVvoATtlqLJmK9RsWDXsL0l0h/98+ju3jae8paLB7NaBgEEYvEKo/GjHABSh6yLWJj9qjmTtBNh16v67tf9Htdb2JoL36PMpTsgBZqla4aA11UfmNgWTjWtrc4uGHwSutbdHn0c74mk0aGm1d/wp2ft0DK83gwHI/cAmvTHVNL0TjCoRNr+PzKZZy7sMm+BlO6HzOr2NJajcT4j1z/rzVu4dcnd7EzaLE2k9Y0e1xERBMmuviUzqE29Wq1MZ05VPsR4r92cf/qD3jw3fco3NnFUhqhTABrJNTFVCvkuWp8KSAu+CeXr7mFGj745GN8duVLvP/RRayeXkepUvFr0JgmIrNIRmjEw6TakqqAAeBpyC5IFqRPPv2c9O5P7m3j8e9biNodCXp1TdM5XiyW+fMuVmZRovPO5Wh22ijOz+PUmbMAtVQkAPCFVRtWMwzneUmLMJ/8j51BZjo7Yhjms2KtGgtjhs7rldWjOLuxiTffOs8U2Z2dPbQ6LXkmPeGi4Fxzkg8KXEKJCVUH6A5OySNnwFKySrWONuUjB030KI+eK6MyU0JEgU0ulbXQG0NyMVkjTmUefGb79pZDBgAn9BxMCKBpgBsD4IOBr47mFlyZYZkFHQooxNqt4GUAgFWVqcd/0o+Q7rfQv38At/MM04+eobJ3gMq9PcS3t9G/tY18/4CTvQQpYwZD0FMd6ZVSGatNH3vDwKG6VMenl77ApcuX8d7FD3Fk5VVxZ87F9oBbN5J8yKXqdh8CAB6S4zGkdlGO5QYZf48mNZEP1o+dssNnHk/2NBymNn0sWekD3Qa2f7yOG99+g872PSwkJZw59QYWF+toZ32UalXkMwmOnFjFsZPHmLrdLxURz81gpr7APa57nabcQeVZTFVq3FzP9Nz2FSME6V7yCC+A3prW+rmc4AvwQq0vANfNwBhmZlxEqVrBa6+vY2PzPA69chgPHj7E7qPHTGdOYrMijTyLioUCkQTqBfViYcp+BrQ7DTxvtJFGOcenhWJZqNEEbBEIq3rZgtkvchEp5QQg0f1hzCUGSMcAADcQGQyva+WjEyDJMaS/n3NfWf4vBsD4+Ds3NuYTig7OikJ6V9BeTeOc5bXUCaA+N4/FahX1+Spau/v4+487yAdd+VyJgNlOiwe05lP2kxLyULfbxOraGmaXl7mNYp6Ehsy53DMK7EQ6B9C9bcUoTjw1+REWZsjACx4tjrwXFv++vIja1AJOr66jPlVDYs4rk8bAiQ9RpvKxKKJmtClut+7jtz+3cPD8KQolkTmafBksa0o1hnWj7ZM1JqO1IAW+fAQcsGSez+M4KObBpK75yO42XXUUFJQs6RQmdN9LapPAcNziZvsdXN1VwCAsHkHNC9mHjYodph3XO8M+d8padSkyEk281yHWXxFJFqM2vYRzxzdw4fgmlrGIKua1MBDEdcG//+cVTzgN7EWxeQ8OO+4xrt28jhtbv6DhmnDlmF3vOX7uPMd0nKBemsfK7BLeWd9gw/DD08sMVMywTCH3EHwDHew19tHuNxFPxXrXyXhYAi198lORcgfmlWGnOottZIytRbz5h9nWpPtS5i5k9xLtniv3WtTS1e3nNFzDxNKS+RUWgHk8SGcCK2YTECCydmGeSH4hRXLxvJLcaih1CP9G+J3zQzJy5/eIDCAE5aTIpusxd/gXAAD//6Rdy24cRRQ91d3zds84tnHGjhPygkSGJDgQhT0btuEhNiCQiNgg8Q38T1gggZCQ2CAFRQIRIbGIlGBwMHk4jl947Jlpz3She+ve6hrbhAUjRcnCsd3dVdX3nnPuOfGlD658XuKCK0F3tyvy8EBaIGw7pKl0+YkDN2NsNfd+EGyigInmaIWyv1hHtrmZCmowySRDmyBODhgWDpkcdVar8U1xDX6w6diDwDmh68WQqoCyFEmBoA9aI/8KtMR6hE3ZXN5cYmxYEhQxHw49AJHrhLAWQdLYaxKAk+AXjL434dCmTkANdd+n6y3MQMxIzFvsX57wKgM9UPS+qpzEH16y3hQU0PtHKCY35YHcUx96HshGtHFVGZL6QEDeTWo84sYRQoMoyXYPpE3OCA8jDAkh0paLryH6/V0cbU5gKp1gFqASVQOjEffxE3HeEyDH0CggYpE2m1hfX8MOQZyxQ2zdntUmsGjI5SF4AEgla1ZAEd3w1rOkh/zJXWY2S2qsEadNJ+/KZf6cQZHcyiyumtm44sFIzpgaiuje0cOE5T8i73G+EgF5JN9nBKUO5soYGIIDnTibNok9Suz349C5GhubsBzw5NQxHG+1kbLzf/yfMVUJqw8GEu2U49H2ClY7a8iijEg9x5AFhwvP2wUxYweZgYNsiQJnBCy6dRsHIF+BsCqQSPu6InmoxbvLPVeVeoXqD89Z8X40IpmWn58rzGRYVjfcM0gyYDyqY+WXRdz64jvEmz2u2yM/oxjMkkdFHKCtlPDGe9fw5jvXMD3dRjUu+zxja3Q2HPibI/8s7mALX/72M5YG2xhQpn+twszXUL4+ojU3iFAv1Z3SoJehZiOMdy3Svzaw8u1NPPz6eyTLq5iwBmPEbnABnAvxYjjbOo9cUVgR4CoWqeSFK5fx7icf4+3rH+HlVxcwMd12cU/WFJBQwJC7yCn9W8zReO9Jc+CyA30cpBHmRjOmjXgYlJhJzpFkGZ4uLqK3vsm+BrR7amRQxwyF4bk9m/VxJB1DvVJFd3cHG50OXjg/j3R6BpGcTcEKCFauqB48OPHvTL//3/66rDQ7kvcujadBYaapcn7et7BoNio4dnwOF6++hrkXz+Lp5g6WH66488+3ZEUmuoIAkBiyWGzW+p0uq78qrRRzZ04hT5ucBkFzwM2xBsoVB4yZPYM4d3IOLlr01SEqC7uP2PFjcmJ4ChP4xFDByt4+BRwbBQZYCJgpzfvXoprVVuwVUJzjCj5TM1VJyihRvPOTHrLlNeD+KpInmzi61UNj6TGiO4vo31vCcGMTCd1nSqkI5OCxG5N2EmfjTis6EzJqHisJFl6/iuuffYq3PnwfZy+8hEbaYpd6paOKes4ZxCl4MCqPd+w/5ar7+XcMpWnHM9dOUIodvq44lo+M67qweQ9x3sGft3/EzRs3sH73HmaaLRybmcVkewbDahkdM0BpqonxE208f+40N3A7ZAaajqHZbiNq1Dl9pCQ0bVJtsQGgZWVezOMFbIYn7LcCTuFn9Pw9bG/ofsifcf25N4zzShpjRwAWemvvuWEXlOIck5MtzF++gPOvXMIgivDH/WX0el15b5hROEaa9cTqzoGMfhiY/hDZ+gayrQ5ajZTVBOQLQOdlIklV9O+IFYzOT0DXlDuuxAxLGDgFwmgG1/IIgNRfVAcOrDdpIzKLvDScX4pGBx4cexlt8Pc1V7YYZzWm8AMo0jpif0/ZzZ+Iqsi5ntO9apMK4MgkmvU6GqUyx2hurT7F4+UHPDKhQPoQgRpEzgKSTO9uD7jZmD11EqiUOMLXJnpYGPHoNNJYGQ/O+xhvJZtE4qwEoPrrKMuqBBzPSdNBR/ugD5xpn8b8zDlRHx6Mkd53q0RPRiM+Gbomw09Lv+Luo9/ZHJUiZgdSZ1Dtl0mvEGud0O9L8+zYViPgrt33zHQvaEwxm5dLZHZZ61wUDSOPP1NEL0bTzSAjsSr/N/K7UD3kDP0IxKkWCQAyAqlgs5FIcI0V5BS2Wt2PAkMSBgbCJPPXiaEck0yDiEc9oyxGe+woz/wvnLiItnmO3f4THosZ8fb73wCAngYF4++eGb3Bd5HhwXAVX/3wDW7duY3NfBtRvcTjF3VSgff3MF5NMZtO4Oz0CSycnsepyTnMVqdQZf8cI6NHshbpmmslLD1ewlZ3Cz3rGJlIDKf1vrp7KqO7wW+qamzu2xInkQ+z++l7pOmY6xuF5CTfC42T1kY+HFcf+QmHxH1qDDt9qKYlwIyJdt1LNNLBEn/qYzR+3/UcOnYU9n8M+Ehvw7WykL46lqBroxgjKFTpqsal6+qRijSO8Q8AAAD//6RdW28UZRh+ZmZntnug25LSExRKgwURooZ4Zbg0RuIh+gO8EK/EH+FfMlwYbzTeYAKJMZ4ADyBHCaztUsqe5xvznr75dttw4yRNCW233fnmO7zP6U3e+PT8F7GFWzinDLuTlhQanBJZ0iC3NatOMAK+j6YWWYZw2Qd7bXSxtTT9sA9hpMns9jSFk0P6MCYlm6msKt1A8a0HWQHOeTBV/PPCrnv5TVAYTCgSImHdTcYu6fLlIPstT4sNp5PbfDnTvvNwczUwwAAAe5Ohl9JNMc9+vw1/r16JFvBQpIcWPPOg+JRW355E0ULbaPSBMf9/oamR5oexPuzQVO9c/VPmZxF1BDwTbYn2xQQDaw+/Fn7kU9O+6o5StSVmHStLKyxPqhNrgb0M9sQVlSwcLSrEJpF37eFWG103kP0jnpx4Vojaom1tE/keKEKcqO/c+Wd10irhL5XrsDUjy9Dt2YEFPCd4g8gFvJIgDnk22fOTCkVO86PX7/lWHxOSXL2fvjVIMOZ8X5VjSLRrgLyXRMAvDeDxQWDTEkSSnaptgwJfWtUGNhePYSk9SNm7LHFEFL8AAJAAM2vHSADA7c4DbHW3MSoGDAxM3zLpoVoqQtwehcI0I1LOBdmkpzjm8cgvgGF7nVyBSq+TMRuNgSdm2wh+D7h4yLzyx/42+UqFe2hToNRMniFqP8fP31zFvWs3UB1Mz0k5UDJ0QnkoBbjQ3jhzFh9e/Binz53DXNbwWI4wGZ4jx3NQ8F+O79rXca19F08rDgX72hOeL86fqRPkfYcsrmLwdAe1/ghzPQd38w4eff09Hn97FTMPnmCeACl6fnPnQ/1MeZmrV7cWxZpFVSCbSfH+R+/h4qVLePPCBRzeOIGsWpO5XEQaXGZJTAFjGuWl1F9l0TL+IUto4x3+n2mB1GceSzHXrFax0GjygWqg621FwV46hNXITsYHeAIGUiRRik6nw/f72OYmktbs/uyRM+WYdSTIUYIUCI4tkwWPvSfxumoxreIFAwAi9QsLk6hmEL0HJMGcmW3i+MmXcOLUyxjmwK2/b6NPdi5UWKwu8IY9pGV9oPGpzFj0drsYDnto1GZYOUXhe8PdZ+j88xDNRguNepPXQQqwHHKCf6S2AiDycFYxNdMimwhyYB7nqnIzg4N8j6iaJOiLGYjRkIG58XAUvJT5ZfdRVtBaqgAlBQ5Wug7jR7vo32oDt9tItro4tDPEgQePMfjlOoq795F1u4g5g2Pk5xX9PdRSkpZtchGkOudoWOnQP3doDm9/8C4++fwznH/nLcxTcUytKA3QLAV0+wZEwpdJ2rCxGJNw1hf+9hGFz8e+AEDIiO99rqgAqnC6+JhD/578+hOuXL6MrRs3sVpv4cjyKhrNFhfE42oFc2vLmDu8gNZCC2kzQ9/10VpaxIGVw4irdQkaJQZpRGSNQ3ZgAajUNfQO2rEgUCZEewGAqQELhq58r7GyX9OBxcaUynxBwCfq/Qjml8Foso+MGcynDhTL62vYPH0GS6vLuHf/Ljrb2+JbZvl62bMDvveAXARrEmhN2RkVsp/+20F3p8OgIZFFcUVCoPNxwfeGweic8iciXld4HAgkj8p5DA3FLMZODuG8hDmxLhpYrOcozgIYM9ovak5vsXjBNQUA0F5sLKXT4NvyvmJiL+ZxYwCcYhopcHPIhdPa8goONppo1ZqYb81ju93Gnd//wLPdjq4uApj4/F7tUkP/6uWiqls4uoKF1UWM0gJ5orkGfj0vC+VY2z3bGciIlLKALYvTUEUpnuiYz4ygEGckaKR1HD90FEdml1AjfreISrByYgkp/HiPIynch9EIW24HP976jQkISo5PNfix8LlfDtVUiEEay4omvBvhxcWYhWuPJ9nUUr49BeAocRcWdMbM0pVqm1T2/aPsHW/K2yI4LxN5JOHjiQcJPJGnKuShKgfos9QZ44nzoJEqorCm1xck2anHsOiCi//X11/Fa+tnsRQvsuyfznt+6vLDq4DN/yj+EbxcOUdFmUvAX7vYwZdXvsK1v37AIHPIM8e2oJRydKozmM3qOHVkAyeX1/HK2gkcba5gPm4w61+xe85zTRQe9No9DJCnDjfv/4m4mmh49WSnLB6nSuzBauh5P9J29Ayw6beShSUM8La6USzgQnILICPkHf2sEVz8mgFZtz+oJDJ8IbQMHAu6SARt/ei8bPb6UnFc7rGSK1f+LNm5pTU/EdkS5M1gPCvXLYtrUr0gdlxRgQPAfwAAAP//lF1LbxtVFP7uzHg8jmM3npCSpGmaEhReBbWlSGzYI9aIBUK0FUXw40CIFWIBbEDlsUQRpQXakKYoaevEDqSO53HRPfecO3ecUFRHViLZjudxH+fxPcILV14nG0DNnsvuAkrlX9vBaBJ/mUwCZXaJEysu0kGxqrBY/YkNksAXyHs4s4moCSykK19VKcK6hRfREYqKQ+FZEAFwyADfG1FZDzLbzeIL65AFzqqvwTaFFtZtO7olIxMeUUFEigch+0haqGSVaOiyrEEsfC6PPCYLACJ6pt2xHh00AI4UBkLWHzAVJKkWtVoJJ9ryOcUiF1W3FPAhIGA7Rft/Yxb9M68LKkF5vCi61oH1WLed64Y7X6lgQQXHJnmKecsZK9yH2j7NgJ5/ah4nkxkTyTmdhWOTb1T+tCKqZZaGpD2NfraPwWiIzBQBQtSq6eAkgJI8jt4Vd6+Ew2U2Ce1VdquNwIOHcpVbxlfJQh0Qqoix6hBOjxbhO6vASbCsLKcAhIpmVE2OazAemWN07bnA4EPE5H5YbYMqsLQe9w27zQv/10Ni+MFE2IiJ598MIqzMLeHsiQV00eYOJhse6aObsLuPnNDlKNDPhth8eA/DbB9laBWdJyhT3L0v3d+TC/Pjqs0FL17++8mfOwzdJqw8wU0a46KaK6genoeypmhVFRVdHma5AAAgAElEQVTl213wYr6P0SME7NYR8v0xZlQLgxtb+OHzr1DcP0BYWF6mgJoDAtwynD4IyDovanfwzrXLeOOtN5H2TtKyl4/GCBqRq7SXbPu3jTF+yrbwzcY6doJDFAbKaIqQZtEOVGVKpxWSpIviIEN8mGPWdFLX72D7i+vY+fpHTG3vYSbP0dLCiWaoNG/LAQfQU2SeZqwAQ5xZXcHVjz/Eu9eu4MVLr6LZnQHLKLO2hMBSlYNe+l3x+m9tlfidFaef/KN6j+uAawqAFYeoBto61ZtFOr+I7mxKsO1SGTtOE9OUlndOQb1lAban2siHIzx40EdveRnp0yfNhlKb9xLWVN3wOof7eF90VTsv/0fJZ5z9V4UA8MUNxWrNiGKajqThPr906TymT/Rwd2sHw90BojIk9eKQdcQVKr96QeKYgp026Kb9PWSDPtomyB0f4tHuHvL7fez/tUOaAHGniywgRUiiegRK0GeCACkFb+zWAro+jAazApbWkq/UgoQqnbUeFSsZ4WboUzKv4O1zxxUAAlJnj2ywMgayzSHyzSGwuYfG7iFm9w7R3tpBsf4LRr/dRGN0QAJf1Ch3Ix8kchbwHAtKr4PbANbOPYf3P/oAb19+D6vnz6HVTfnbJflX3imXE+OxPp6JRGaSf+H9+8//7fA//nVKZo0uSPYPomCM4a8/4/tPP8HDGzcx15zG0vxptFptIIpRxDGSdAYLZ0+RsFkYZoSuMlZ/zcUlYHoG0DGMFIcpiurxGOOiRNJbRBnEsN4NJXv3a87+nqwA4D8krtDO9vBogg9ZZZSHAPCuhXLpQC5GvVZWUAXo9DpYe34NZ9dWMRgd4Pc/btsZIa4JPBJDT9DQ3j3rcmCKnY0igxoMke32SR+gbXQy4pYJ+Og2015qYlaxMiTYOs8R9l8nl6UsZyQLw/5L5o6wW7FUfSk2yOy8IlqCKNR7zRrNwsauMzhRAFAIXGItFDUcUwCg5IPeE7BYJdzBzKcpFjo9TDcTxEmCpNXCzsYG/rx1i6wUNd81xdeNEF90RA063uHBCFGzgVOry9DTEbKwsMk/a2QUHNeZZzO2sXOo6mg+H3I8OW7kPMhNTFsKkFnfZjtzeGFxDWncRRMivPZfsQeY/hkhQ4YRxrjTv4v1jXX8XT5CGdriiS6r5N+iV0Mnxud0hLwCgIntwWjLSd0ne27VPbCxmnZ8f3ma+CtJmtyB9e6f1/hz9GBpyHHhQDS8KmRwHSlpKcixa1QaBK7QogkezvG7Fm6FIcYbVZQyQJCFSOMUF1dewcXll7EULVCTzV79sBpeQelcP3QtfX+yh+yYMs7ATTqT/N8r9vDZt1/iu5vXUXaALOJ8xcTQGkiTKaydOoPXnr2AZ9LTWIzmCBNiJam5gKgZTchrjBj2HkY5bm/fwWC0T1RHU3gnFDjTKeQ0hVZrk37bBBSNMOsKYlGnQoEmqD3Za1vKL1HdKXe1enOCAjD33iTcViOijmSdnAumOCGFh4q6WyXxNM64me2PBdsY5PXBKzIIxZxQxTy+TX5MCHpu6Jp5QFpvHuXZb85LPqqUwr+MXc1vVFUU/933OdOZDq1ppxYBC6JlIRiCQWNIdGFi3DVxq6wg8c/wD9IYV26MG+PCmMjGhNZCFVJEPpyhnQ6dj/feNefcc+67nUJik4GWtm+GN/fdd87v/D7iqzeufWV9gyn6QNY9C1UidZTwylNtXGHG9P485w1jwvnWwROJwZwyCBLRvUdyfI98GaXUywtLYtEVFYHbd+koWMFJVRSDTpJq29X8z+WATx3CWlYuy1/iN9TMSDcX+pOaf3oONickfYbkeFq58CvxHHBvgnsn6OdooqtNsA2KI6X620AWEAIAHL2UpV53ohtGNIMgzZoEGtGpmYB2ZSVxQDe0WNzTfcQII2F1tmTsUxCMZwjwRIWyUKWxdVOgNIh3UYPG1GtTNHaKNsCXQ+AKDlhhlrmbMOfCl0B3YQmttCmo5Avco/UongFgeGKtzs15Zw4PnzzGpDxEGVlpNoWZbdyU3MiatkKFpOdQBFZjM44/b3gRG558xULLgoAIihBqHrleVAkzTgyvO80JnRQT76HBzAqJxPMaddT6IQURQhTdeD2/uuaLo37wu5EkQNRARuQLKWqycpNiIW+z9r9jGmjQ9JAckk3iJ0WzN+FIjZIQsfZuUD7H388e4emoj0My/+MYvtnzJVIeYUA4ECU+BkLNrnP9uhC/iSOvw8Bf10fQel28FjUAoMYvSv8XtN8Gvh2k5zSisYOtM6M5zqqKMWcaQP+Qm//dW1tMX06EX22Dm10qn09oZWcpLlx9FxvXP8fr6+vMWsqNa/PYHFTajjE3/wX+sH38uHsb26MeJlmMMo3YvKqoHEPEWNcOUlZ68XyMbDTFahlh+vtd7Hz7A/q/3EK7N0Q+GSFjp2w9r5GHKJQ70uTrvGR37vc+uobrX97Ep59toLv+FkATRRs5uqw0de46sd6kjnXLs42/KYLc8BcBA5hpuuqoRdn0meJvqFBPcqTtFuZXuui+dhJ5i4r4BGNbcWMbJxlfU2kccxYwPZ487aF3OMDa+nlki4ss3YB37Dd1Y2YEwJIpUticHG/+60foiOwpvp7xMJObrs2/UBVTdmIvGDA70VnAxUsXcfrUaezvHeDunW1p9WN/juorQffjiiMC42mJg6d7GD7rIeeoIIqxKmEPDjHNGmjOt7l8yxqxl+w5kFPkTiojUVBY7e7Ef4fvrVUlPNuS9y4GMqeFB/Hcz1aSDlMX+r55kUhcH0lAxx8XyGgy9bxAsduH3foHeDBA/u8QS/tjNO4/wGhzE9O//kTHuvenkLOu4Cw3WHyeKiQCAlhh0Xzw8Yf44uYNfLKxgZVzb8BmiQMymf6Qqg4iqGnLAJyqJ/66XivI5F+YLpHRmVi4N7+4+Yc4rdfrSFe8rnanq86jEsOdTfz0zdfobW9hOW9iZamL1jzl5Y+RdTpIOy0snlxG2pnjVI5XlpfROXMGSXcVoKa2ylxs3bTkJI2yGHMEcePECr1DDjgJpJcIWDz/FwDQusBPrmx57P54dGIaEmBDjwA9rsTp1W2tN12kfT1v5lh78ywuXbrIhmBb29sYHgzdcW0szXXpz7DuMHSILAIaZP5WFBju7WPY6/M10p5voTnXdPdoKpJzx0izXOdN+Z5FDAo2iyvcRJ/vFXxJW8d+EgCAn6/UqZrl+wDHr5YODKxTUIKz6N8D/fro/ZHqE6qnFMAO030Q/KaRRB4VY/HgiSRCVHcag1O0PigNIM2w0GpjNNjDzuYWRoOBMzwLjhb5dRwxqEAga3+/j7Xz5zC3usiGs4QXuZq6EPmZk2FNp2OJ45UaPo5qBmNkxDza7Wd+KKSvXyCklKRwVYLV+S4urJ5Dy+S+zXMJNcH58WwCp/0fTYaIkhR7GOD2wzu4//geT/8n1ZRlQE5LVWu3ediUuNqParckcaayPAyJjU92orq/0B5H9h2N3DVy7+MaRrTYvkaR+k1TzCYiY2ZH+CTxOnQGCsThPWy+9PvhECOs3XIxAFdQmGtseTM9xV36FUq54MFYafjRtE1cOX8Zl8++g1PZq9xMp15Qp43jUaZeDbm+7GNW5R9+RB4GN+LHRR5Rj2wf3/38PX7d+Q3j5ghJO0WUJ65eJNPI8QRLnXm8//YVnGmcxgJOsBV1OZkiY9NJeGaCAwFVEmM5BLyMStx7vMt/c2+RRFJzVkEfWtXTefmflipXk+GPM851n+s1SPWa99eSOtYPw2VA5WYBMjjU+14gv9Ehk74OlbO6GjRgq8rwj3sRWUPK+qDXxn11aBKuEmyVLQiLj3pmkru49enOA7FNQlN8ZYjrv9HaS5IE/wEAAP//dF3bbxRVHP7OnJ2ZvbSFlnaBFIWAVYiJGn3AV0XfjE+aGE0wPkDif+F/JAlvPGriixhDVCSiEjC0tAV6o5fdnT3H/G5nZik02ZTLpp3ZOef8bt/Fv/P1+9+Z/QRP5sdjXqT0Yv/CvObgGnQ/V69PpgV4CTTOC+SXrCmowDVv8zAKqTBzCjE3eAV190RYCnUSnmkxH7Q4aIjDiPaKTO+dwtPylhTX1v0xzoVTWoP3BXvgk50CF6Rqp0diMUEPAmi3jcUmMpd892Gc6xDra3GO+RO2WJjLqrx+sYoyVETSiRHYqwqRSTevoRlA6sh5Idc3odpdv8zq0DjnAiNT/l1j8bLlHuKEortBzKtKICVGnTCemaACao4Jq46zb2ql92Q2FuO0AJF8qLPEEbbuKXOdrDhmn0yxDAtamJLOBFEXFhdPoE3rLBCkzx8qIbLEg7NpgASKHDkH4jLL+bBY23mCEfG9KKA79etM09p6aiv2NgZRdxwYDn3GmNQDoEDX8ocPP0NNpE3v5HmylVwwL1H5O/2eggTLIhoOFT79Lk7btdsODZpQiJIV/lQYTrhOyEqR4At7uxRwGRPzs+QvXLgcnVaJM3OLODXdx0zWlWlj9HUCp6JhoSEe5TXBiU54nE/jDh5ur2Kj2oTvtBiaKy4QaM5C2X+W942X6j3pOSQEAyYTHg6o4ALPkjPvxC2D90xA4uxLI0vpO9oMg048KqWsmHqwdeOD8tYNjWC6DFxehIgDKqKLNsOHx/sB+TDD2p37+OnaDQzXhmg7E5OyZEqmIbQ+yZotZCWGZYlPr1zGxY8+wMzUDDpEUwkuiTFayH0M4A528cPGPfzy9D6euiEL2YHUbL3kla1I/N4M3axEtb2PThVwfBAwunkb/167gc2bt3B0b4BeqNDmZx/1nnX9UlOHziW29pNne2RhCp99cxlffnsVFy9dQnd+AY5sw2DTddeYkiNpG9j0n3U2eKqozQDz+I/xOXs0mTxPltA1Bx7aXDAJBaaF0TohJE27Cxwl+7MFTPVPsv1dIO0Nobejk7f5c68ORrzH1teXuTm9ePYcULQQ+AzzbAnHjSttwDib/r1k0tn8kltvzEQsyJukupyk6vY/ru3hjCbhojKfI09dyDG6W3q8euYU3nzvXd5Hf/52B0OCJRMdoAH/i0mfXmg3Xt0aymGF0dYOujnZD84gzE7xvQ72hjxZaxVeElb2mfZclLs0BXf8HvrsaJ2MhgPtMwh0ly85kzEnIWlYVNfFhoaDJsuESIghuUikTcnQQ40NJB44JOHgGeDZCKMHG8Dfa8DKLqZ3KpzY3Efn/gO4u3/Br62gPR7whGectBDkeg+iKF5L04LQK9IM68538clXn+OLq1dw8cOP0Vs4hRCoMCn1/Pb1eZ6KqZgoILV/v7UbRizQSogNQU+Ai3/b41yqNgR+X/aqk2dV+nc588bDOBPdgjhCtfwQP1+/jrU/bmMqOvSPzaGc7gpyqNNBq9fF9Ik5+OkSuxnQP3cOndNLQO8YkHUAVwpSg2iK1QCj4S5D3+cWjpM6JP9ONMT07FokwZi0wTz8evG9paFEw8JSaDAtnaBJ+m+Wc5PUiuZ+yxrKPs3/kxet87ljc3jtjdexdP48VlZXsbz8iLs9hLrqqdL3gRYr0hxwaiUYOWaQz31ejfDs8SqqrQ0c7ZWIFIba1OQS2H1LLTlJTZ9+LjVOSUsgDAn+X7FtIGlqpMayNvursTTCMs1nSJCUhOQYLUuxylpE/JE3pskTf2q+not/DWRaRN1PE+s7CDXNibUb7wQ+fiscX5jHyf48inHATKdg1NHW1iaW/7kHX4nNnW8gJwyjRPyHg0rueXtvB6eXzsJ1CrgiY70J1snIkHJdr/dtwsV2sUYDyDTg0n4h2gR/D1IjsGsCxYrBGGUsceH0El7p9TmHM847NxtiY4/F+uwFW/IS9XCE9bCJW3d/x+r2KsaZuNKUZVug+GZjpzbCVKQPGeHpUHhyBoiMrhtHoWpSUd1lNywZUlWh1vFxmrhbrVE00cim6N+YqlK9Qu/jglFrG3ve/G9i0SJFJFGpKaeWLrsOUq09k6Uc0dAfIvZH16d6E4Qfq4SKxZZx9AwIGb03wJHWNN4++xY3AE7mfbSZRZ+z85NLRToaFBuvXiovLv4zbc7Y84jPi/qqNj9TnGh4AYdtHOC/agXf/3gNt5Z/5eLfFwElide2gP3BLp8ZnTzHbKeLC68uYdbPsimhg9jEmnluTHUP6vrPSVwlRM+TnU2srD+C8yENa5N+mCJ26jMsZflM1fBqcUvfaYDMQn/8rHNUQ4mforHALT+Oj7QnuNnDWl5Upxo+SnMezaHFKUk/Ly6PZIhMX7ZWREtNxbpzWW+Us7GulTUkqBnULsW+XAUMxaZfEAS0HqhZQPWW2cvbANEG2NK0rynRjLin+p1QqXR/3uN/AAAA//+EXdtuHEUQPd2zu7M7tuPr2omJwYmBRImIhPiBPPIBEYInpCh5ReLruIgnLi8IiIDgBJEAIbEdJxjfdr3Z2bmgqq7q6dl1YCRLdpxZz/T0dFfVOXUO2wA6j1/3ZmvybAJhuVC5XAWEVHyA+7IabjKkgpYy5V7Ob8exp0uH9GZVHR6nLavaqiLesZxfikK+q8ZZT3XPC1ewyITCXijaa90jJxuNKKo8jVXdviGieIR8uFaTSi3Zr8hmjNIsKufapqDopirlhxaE2is0EkRFhd9CjQRIpZTGTSmXpSDmZqwyrJfFf4PV0d2Dj0QAJRORE2fVpBSkAtoOS2NUiVeEY163cNHEnws9Ldci0T/pO0GcIvA9VkZEoLLpqqZaSBD6ui48opZOPurk1DCVJHhlYZWXqAoRCxYgbiFAgB5WB1uJUXUzbmGvf4CDwZEjHzWE/mVFQEfH+BR1f69RIVU9VWgdRzys36dfjoSMfXL9fBvV7CUn0KLgY8ep8rwhlKUwCwILSE38dQOFMjsiLuDw342azLZIojYWk1mcm1nCfHOaCWGu9188wE349IIAUGyERqRYjxQPnv+BPUKsKflpyL3LexnOn0J63yzbiGYVs8XUjZ89RQ6VY4gR8bGQBeBVzms6B0G7gxTq1NrH43WBtgMUkSil8Git7yW2HGCWnNPGRQPlfopfvvwej77bRJy6bW5c0ylS3QsToZ8XeOf6dbz7wQ1cuPwm++o3uJ3AzVsrY3gI4DlKfFM8wdfbv+HxyT4KsvuisWw2eM7Ssy7TjC1xRkcDJMMC3Qzo3dnE1mdfoX9nE2dOUkyRTolXNPdX5iwzqRiZDaVyDrx6cQW3P/4IN25+iPUrV9BM5mBsHCBUPtutkAGf+I+EJpiJjY4gp+O2aH72nJZmh7NKAVojCs2idEz/i7jdFAB0OoiSBNNLXZxZWmJGQLPVcT74hObQxpi0sPfPLrZ2tnF+4yKmV7pAy7AlXCRjz6rhUgwIr2/yMJOXG46qVdqzIv95cP9KgKxT4fX9iXi9JrpogrluFxtvXEJeWty/9yuyoROdY3qmKb1poQ3Qa7JAs6MSWf8EzbxgZHNqcQ5RnOBwv4d+r8cFM9qH2QaLLBTFGlPrmC4gkohDExufs5au6iQaKa53NdByKV2P5HgbT+n1FaSQwLFOA7FpozzOMNw6BB7tcfIf76dY2B+gvbON7OFDmN0dtNIBnIWfy1O9wWJpWaiyyAkJMj5EXTy7iPdu38T7t25h49rbiGcWUBDltVFhm7VEvNbjn/rEn/SKiOpP37vgMCwO1VvurBTd/wsbq4iv1fwwUIvYiFtZcLCHHz7/BNs//Yw4HWJlbh4z87Ps+JESenvuPKLZKUytLGJx7Ty6G6+jubwKxLNIRwUDGLxWs24J9VQMUQxe4KTXw8xCF2hOc4/1BPKs8+h/XAAmj3qyWuWpEp9JjKMtiQEBfowRUQbYswkKD0XtKy8cbTVOOlhdW8OVq1fx9NlzPHj4O/IiZaq98plcwumsV21we8RoJl2AZp5heHzIKHgyO4N2Mo3SNLkcZyURyzUxoKQ2c7pUXPSTpMHo3pGXVe+uCKfye1LAn2PLaqTGbexOs+cNxzH4h4nfh2wA3tsJ7KL9hoodrSYGgz5PibPdLpanZ5jRN78wx+/+o7v3cLC7y+8AWdBW5RthU0YCChXAUe8Ya5cuYLa7gAER7SNXjFdrUZTVuqnxuK6PXpjslHtkxXJCGGlPp3jAUMI3j4vL61huL6HhgRld8SY/RduwWHTPFnh8/BSbf93H0fBYnA5cLJqXZYBSwydXTpg5ZxsFE2g2USxFblLpYMixKOnKcLOR2Fw7y2Z3dZwLvWTfMOH7Nu7sEBw2iOULAVIbkj8Y6xpbJ9skw4HVZydzzUYMsrCIG1lUvkgx3zmDq2uXcW39Lbwar7LTf8QrclVgQB1+Cb5ecn/hRdTcRQpomRSiqZVGBj2M8Ge6hU+//QI/PrmLrDNCMhfzALDde+mY3CTsWwxTtEqD9ZXXsNxZQRuuiNvwc8F4bSrpIHfxPL/JQFqkeHa8j+2/d1wxyE62otW6wIKfx223Q3aHazN3DDr9viWxNwGnZI8ftnwrk0DnAxeHAjCVDn6+we9Z3E/YevwOieYEO+xpBVDPl4KWtgg4pwixOVQnPZq3YmXowOFKK4xtxgmM8haFGjc7MCyKLP4FAAD//5RdSW8cRRT+qpfpns2ONxIncYzhYDsSggMHDtxy4MIl4sIhEUckEH+OE1wCAoS4wCUochIcHMBZWJJJPJ7J9FKF3qt61dUTW4KRRvYsmump5dVbvvd93AIApVxGxGaptGP+JEM5noxtr3yaeCmQyFXe6P02i+4WuNY+qBJpg9pxBVAfebjIJaAJA2ItAbSQjDipNUkAcFBBE0MBryOtk540kdfzh7jwDgTweumJZyIYRxaitb1O0d1kOY3gsGsYTl1QWtfeWWAtR0dyCNUQUYQkKVRdFMIX2iyYM/I0uezAETSoshke5ho4xaCw6oGbI9FhZdJCIgSUSr0L8GPXJiHjHUJkVACtlnmw+pSGF7pn/68tVIT6zDjDNYcn1CYMtqwxFsK6OE5ZQ1d7c+MI3MqaD/aL5y8gj3I2VHAbPYniIPhvb2K4njNpQSAm2FpVGB2NMKsL1psuVW010x1Uh+TDItMY6tq0SSrnDa8OzjmFAE0faNW2HgeHv3GZ6PCxwOLKuvJ9TJLml6E03h6rwDbb91AGnAJpIRj0UCLldIK9WoLNJMasO58ye2mmMgySDOeGK3hluIqB6iJxZlZqA6EKRSuUUXYsZqgwqp4x9O64nMCkLgvOCfqIEUDSaiH3imFNtt0mcsk6riBautZmv7sEQOICD16rykn5BKyu4e2klo354MTMvS6Bv+0JcwUyh/4h9A2HGlRxmik8v/cIP3x+A0f3j9B186DdIW5hyQKmpOcjpEtLuHr9Gt597wr6JFlHKS0jyAzFQQ5J/j0i6D+O8NVoHzefHOIFyVoO+ihZZsLVaphAqINenKFbKSwQjPrnffz+5Td49tMestGYNf4tM7Zu7Qv7ncbCgwEsdYG337mMjz79DFeufoCVC5cQp0Pm5Ki53SGIX3m+BSpdNg0LprBwf0lchdVuSfjxmtfeYXvZJVStvzJ2jFgitt1ZiURb5BHvCVpDnQSqlyHu9pEvn0W+vIZksIi4P0A+6KE2xEkT4/HDPzAaH2FnewdqOGB7Y5vJlYfls6SbyHa1agEnQx+Fj4PtF6FplPbnRnutyW8NHdDg7gKvNM74zKIq5JnlM9i6vIPCKPx69z6m1IuLmuGPkRNoFMi5jmw4FTsXIp4UPPyLK6tQSYqn4yn0dIJyMuGvItJedlBM3dgUZ6B5PyltW/uc8+ETfcLTAVE0aV7nzyFUXSBzC9OMoIf+E/M0AU6PDWb3R8DBP8DjCfJnBZafjNH78y8UB79h+uAQHUIToEKBgKSM1q6xlSqqzObK8oEQOmRrdwPXPvkY7394Heuv7SDOh1wR06ZwbMgqmAdah4Vbw4UL/u3dBv61V66Q0L21h4I+Z5uYEgKwE+bX21A19ymWS4D9QD3F3e+/xq3vvkV6PMZi3sfy0hnUSQdFL4deXMDCxVdxdnsXK9u7SNbPA90BkOQWyUPOm084VVBVAT16juOnI7al/bV1IM6ZKV69FEaJB/z/EgBl2cikGUfg22rvZL9DeeWdeVxamFBpriMkXwxfNx6GS4ECKUatnl3D9u42dALs3bqDoqx4F3S5zaPyrYQy+jIDsZM4VUWNyegYqtRMfJvkA9ocLoCOfesbfSpVhY3r/WeEmZyt2vp2RCRoD0JXVKqNI1KF9y9Qa78NVLDv/vOwz51nPl2qmnXNpyQF7pGVFdZRjUoX6OUdbK2eQz9J0Ov3kFYGk4eP8cut2+xvsIqMwNqZj8Kh0ZRF0M3IJzUFNndeh1noYEbrVvYSBZcBKaDcdNBOKYXC+ZtIrXG/MhHzJRk2Vjawee4Sqw8RHkOYndQJKxeQij5QxxoTlLh5uId7Dw/4egn5Zf2pmBGmjLxx5LUM99eOD6iyCgI0BgyNnmmYIuJ1keocg2wIVVufiX0XiiGMreZSoNqUE06atnbC7bQEQPi0x8Qo5dsW1Sn9OT6xEOJmuL2hgxezAlma8e8Zxj28cWkHb229iY3eOoYYMOy/wQKdrrLQvqqXnzVOUla1ED6+zm6fiSNMUeD2dB9f/HgDe4/uoEptLEIjmDoVMroYQqlkrEdZI6oN1oZr2FzeRMZS1PC+VXtgxXlXggFiCdBRPcbh3w+4HfWkBIBPXM3Ng7R6C4Jd5KblNQqyG9lpsgO2HZ3jREboNsoBdJPqfqsFd05COSx6h5wUHIzHrlWE+dUCQvCgldi+zxbJBO1gCbMds7//jQ1Jp0VrE7rNEhhK4oJQ/fQ/F4ONwb8AAAD//5RdTW8bRRh+ZtZre7cOduM4aUtaQqoqQa1IKVABB05ICAlx4II4FG6o4tdxhRMHhKBcgACCNEEKKDRNP4jt1Enj/UDzfuzOxkmAlSI1srP1jndn3nne5yNY+egmSwA0Nk+cBHURcJ17yEZVY/rUGZ4WBGTyBTP1AIp4SYl6vokAACAASURBVMReJo6W4bF66/IojOu8XGHqRngFPW36Vcdu1fCDvzTSSxRZjqYADFxBTZsLGdyC1UBa/LrQ+HXDmEuuqRoxJNUvpnD1l9ele6znA/kDNDl6jnQWY2FUlFnz8LrGhsz0GC1lZoFkMwbl+1U6oH9X5KVrkSoO/HEcyQa/RLh0LKwNxDiuXrhOUka9aqYrP7Z4TRkafONo1GPV6FBpT6XUwYqjPdO4KVqn6GrxZBs1YkLYm2ETM61poqnrYmI9LddxR9EFp3enyMWMbrc/oMzYRJFKyU0P/K6zdq29msWNCSch8E/mmUnm5t8ZAJOHh7MafthJFpBmlW5KgSIqCODdE/5B0b4Bs00KLRt4wbNGc/B5zNyEWzM1AgCatQYiU0cvPotzrRlyXG2YOi2+ZUGL0sSmUpapf3pGm/8/H2yh/3SANBC6neVFVz0+9FlTBgA/nyjP63cSNA9XQAArE2rqgX/urRQVSjKkZHKDL0aN7LBapo/4AKCycIrIdvlA/B6JCRINXj1owKYBbH+MH7/4Ghvf/oTmPqPNubSaqFObl4Wn+9c4sFh+7Sbe/fADXLqySPr0mmLYhmUvDvLbM8A69vDNaBPf7WxiYBPEcUxofmIY1adrS53uP0d9lODsXgq7cQ93P/scox9+Q/T3E8TO9Zs+g1C7ZEw5apDvdecZF4XAG2++iluf3Mbrb7+DzoVLGJO2Tmik7m9SvRfVFCj1jIEOqfuvdOmy059NFAz5RMb+Sc+FDwDwCB6M9mBTpuTmblPh5lorql+SdDdg4jOwnS7qnTai6Q5qrSZavWlMdduY6naJMvx4MMTCC1eRu7hLK27oNhHJQgkIQ+an48tWPjQCFWL+o0ApvK6Xd/XFBmjynLnIVUwBJDhwM5yK8eL1lxE32rj78xoOXfQuiQMC+E4GuTdSrkcV5gZPR/sYjRPErRbysIa9g0MXjE5a11zYXy45odiE8ANTOF5rBGBRTwFoNiOen8YpG+QGpQksROUJNaUl89lyDEhiVItQd0ZU/RTZ9j6ytXvA/SFq/QTd4SGirW1km5sY3/8LeDpEHWkBksIyW8N1/o1IJkLS4Wckibl643l8/OltvPXe++guLjlBN8Y6Bwq1vQR2UrlnxwIAsFQjFcgrl+QK3fxnItQ62r2jaz8mqlRfK38/qbDOxUvAYHtzDb/euYN8fx+teApn2tOIeufQ6M1hdmkZizdeQW/5GhrPzrsJD3DyKVsnlsg4Y2ppcZ0u8io5xMHOI+w93kWnN4vadBcwwhCYOP4/AFDUXjJ3WnOE/XQk7538hoIKXORD595KgiMrS3W1YSItP0uupuvOzeLa9RVKJvnj9y3sD0e0RQjoOywLe51RlHdgxGjYsdz6Ow8wGj5B2IzZV8Q1R0giaGiOoE2wexZSn7kg+/2Ma2CWS1ru9sv4OMDAyuaHxiZJK11BiPHbfz6OqSPK+07qRdeVttKccJh7WMPocEQpGTOtKZyf6SFIEsx1upSMsLG+juFgQEwan4iQSSpMCgEAUmB39yHmL19Ee36W/ORUesfyPXVLr9ZQpXyhGoMGARTdPsHV1kpBjoMIz83MY+GZiwzKePD1aQBAZlnK9Tjv4/uNVewMHzqskejSDhhSbbubP3geMZze4ICbNBfTRxdxmtDFNjMHrNfRsW0szS3iYnse5ztzaNVayLMA4wNOGQp181+wxyaPowCA3s6V+SLLKybJRhqYWcF+9JanE32wpAtODSW+ltDWSfPfCmJc6S3gpcsrWDhziaIVGxT2XILJp6115Qc/7cgEgtLn2OjMSbOrY4euPvgFX65+hfWHrsoZohGFhFlGDTZWN2KgbsRrzt237tmbCltYvrB8KgCgclojubZGoiEfjQfYPRjg0Wj3RADA2PL6dWgdDV6TFlg27taJqrllhTlK/6ellBGNh2ePFdlwexvvAiDXeVKeoVLuzQA7R2vyecjTTFgILiKStPnyu6uJXX1LEfpuvIlhX76m9w03trjj786r0lNuvklEpG8oL+l1QRDgH8Ku7jeKKor/Zu7dr26725ZSAQsUQaCQELAQEoghPhhjfDDxzTeiPqoP/gX+R8ZXwrs+4FcialRQQMK2XbYt3d3uzM6HOefcc2e6rbiEkM1m2Z2dmXvP+Z3fh7n60c0vaeOnD6ab1jqtSqi58RpRUBEtEhvYZbnPLofTAjP9kI01Ut9YMa0hy/nHi+Joj+GFfqGKrfhGlSnDzp1TL+DyzVNlJkLFu2zSBmSNxDJU3HRUP4OOJSZPg3HCn08HS++PnAkcTfrpNcp2FcPA1EV3CEHJOEfsULOSXcMv022DKBr5C03yFeF/r8ADERKDoqaGZqKAZMMnW+WfUZMY1FCO3a+dM3rqI9/gI0bgtBykz8w0k3Zf5jpRS5I92fApI1pqSGJ9Hr7+qyZpeh58VF5Jh8QOzy5akVBy4/wfrNOQ+hs1E7qQTFNEU6MN685ggHg0xrlTZ1EL64ykkwZHXeDLAECZamdKRlF089StIFy78RjDUSR0QlNFPk7YiM04JE+zqq1rtkiaEigg4G5IeCV1AbqEOmPQBd4/V8Wl0yz5aD/jn4tzqPE3/2RBObn8BmoqUvrLutwscLpScSkNlF6QwRnGGVRY52hRCxvc6Lca01icXsBScxELjTk0TYO3Bj+9mwAAUPpYWeRD9DHCo40n2Bh0ESNCHpa8H6A5+4E4sQZyXhilNsYndhDqq8/hAIDcGTBKczJ2ho0lWYpDUCebf+8+7uhMtCAGLjKuWNALCrOaoQEFAKDUQdYpGjHjJCS9kVoMn/Tw7Vd30X/8gvP266bGFEMGkjLdoETnmJkAtfk5vP/xbVy+eQOt2RZTLln0ovQtMAMRHcT4AV12/e9GQ87652m1Mlkgmf9hkmEqCXAkCTHf6ePh13fRv3cfjfUtTI1iVLMCiQ/dZmMcCyd0SRdTBnj3vVu4/dkXWH3rbdj2HDKiEZcCtZRmLl+TjDzHvoHyAIB3RS8X8Psf+b5q978mGi4HICtAPqKsbj7voFYPmd6fckyflcSFPCxKRFqDp2rAzDTCVhPVxXkEC/OYPX4cR44exdZggF0YLBxbYg8MmSyLB0JYctEF9gNsBx8UvLykDAAURV/A1P4g2F8BFnuWa05LjAQqvek+bU7VceHSFbQPHcYvv/6Gne0+onyIqtFGlqZ9RqjL5fl2kGGnt82yttpsmwuzmq1zscs0wTzniECh/mZsjqhmmBTJx/BPaDwTh9e5VLHZwMluC5MhPkc0JakJOJ2S1E1jd4nRhwpatoXKiwCj358jedAFnm3BbI6wFAHNZ2tIH/wBrD+FHQ3QZIRD9jk4bSc3bCQbJPCKvSskEeDyjYv45PNP8c4HH/KkO+cYKFk/fJPigUxta2JJfeDrl7xoImk1nFY8dFRWeIAYvvjbc60GReGozETR5pbpnQdfR7JXWwyjHXSePkW2m+Dk6bM4feU6lt+4hldWr+LQpcuYfv08LFH4CQwn+YutCV09EPM6AgVt6CRadA+OBoh7PUQbPfQ2ujhy6gzQmpMC7KAsdQ/a/d+jYPMom1IOr3i/GrVO7l88sMDeDWtyNynGNxMbm3e8yJy3t06+LZ+o+kwTq6vXMNc6jL8ePkKvu8aSCrZtpGuG6wCLhBr5MPCRpBWXcEY+KtFgSNnHaNTqqE3PICfWZyYygIDNU0lymXhAks9fqkwH+AJaAQAFBjyAzbnImQMRSsvHAXng//naSwEAmdaD913j2FbEXBCjvs3NLhZmZ/Ha0knMwGDaVJkJsL7ewf0ff2JTw/KVQe+PXfKNAIaMKSHNIxw7dwpZRRqSNM98QgImWADqtVHCJ/ZeE1ZqPAXmSYffbrSxcvws5iptbvYK3buAfwc9uIYOMkRBgn92nuH7P3/G1mibs//HSezYMZYB1tAdUJ46j59cpKesANgdI48y1EYGZ+ZP4Nb567i1ch1vrlzD6olLuHjsAs6dWMGrh45ittnGLu0l/T7CKpnyRt5oTdmXcoymSD6b+A0C58Wl5n/qAq+vm7Lx48SEfjJCHVz75m5/t8zKqJoGgjhHExWcWVzG1dOrWJ45iRZaaLCPvsaBlu/Hl+15L18jtPnXc0b334it+BJsYQffPL6HO9/dwdqwg9RGqDeqDAqqTr08iedkJJp20x5kDBpmCsuHlzFrZxi0YNd/D1yK/DULioEn/UmyMV+/sU3wd+cx1rY32JOKrjPqRSpVTW9TQE7Pjfwv5RSuwli6oMeXQU72dnC9UBHfKOefm3hiIx/Q0xHIoFHT4j1WAADxWJhrXMc7BgC/j1ltUmvROsMDZDeA1sj5eqNefGf3vbgVUZNB9oaock8tUaPUGwkQR/W3Gv/pdwGAfwEAAP//jF3bbhtVFF1njmdsT+NL4sRqmoo2JaUVSFUrbpUqHpAQICQegGfe+1gEH8Af8QMgIfWhgidaUUCltJS2aVJD0qRJHI89c9DeZ++5OOllpEi5je2ZOZe91157LXv+y3e+1Q+YpVUlRdrM6IF78QCXq5fqC7CivlEvUO0zT0RhOM1tCjJX2BtUbhZR/EURXyulBqbyILJJkcA6ofLoA/QXUwrOiAYWhoLiZl5x3dZyaqOq8vF1ppmABl5MTVUhIYr6ZBdC1RH1jVeVfWUgqJqjlQdIAg4QS0OuGEpiWqZ80PfUx8mWMzlbAPlCQouKF2jw6HoiaqAMSsjCwvckzUr3wOb+oXqPXGnDnlZoTUvn6gzJMpczPjTB179r77pjAZWUqeXQ9goHaaMoGAVF/7avBIzHXlwqYJDFIW7GRR/T3ghN20R/rs+pKYkcWdGGYOp1Bek/5DC+OlYLvZI5vY8lb+xRwjZBYxJrlGDDSmsBAVW0qGqlL3dbqFTnAxGneX7l/0DlqPS7YtKbA/9beT0gH6/lwFMPK8TzwHhKsnU+KLQmyH1IqeofmhoiEyFyIeKwibm4hdmohWOtBbTsEUSmVhKJKi74MACAZtieG2F7sou7g7vYc0OmHVJs5kUPTSlwrlLstaWEx7HxQk4smqgFlinNDyvUJit6GupyMJYWn/K9zMShRO9VPv8FNHMleyUdz8hp24aDBa2A68ZLwErd1VDfB25du44/rt2A25pwj1qNqYop95yGnO4YzQ4xtsDrF9/G+198hqXTK2hEnl1RHv1EQn4K4C528P3jW/h9ex0jy2ptCNQ3GASSNLj6EJM7xsTC3F7Fn9/9gLUff0J9sInmaMRK8IEKzZmC9hoIJZXub7vTxKeff4TLV77G6YvvIYhimCgq13FVa16E3lJR+dek34MB3OtvJsWIKCcExlVm5MsCAKUTcmtNZGNsrN/jKmfYqPvg0nhBNysgG7fzwLe4EEuANAKyOEKt20aj3eHe+oXFJdhOF/UjLdgoEmxMwCpMbewvrIigwkKr2ssar+liPajoKXlAOYgyU/PLKJBBFG74ucqfIzI4sXwK7dkObtz8FaOdXe94IcF9JhPGM60DpmxwIjvJkAxJXClEv3+ME6ZRmjKNkFSUtQ/RNkK/5oq+AIsWBWV4QthkrqjqGW1BKh+Z16bhfYr2LWrvkQphw4XIBgm2b67C3d9CYzBEawi0t3bRWF1D8vdtYPAQGG4ixJiFKfWaAglu60HEVq40G8LQp/EXLp3H5W++wqUPP0Y4M0+eBT4RygEWJ1Cty7UqfJ//iOdISoG7S2Qv0iSmFKjlScfBmETHiIadDLqyCno4BfgcPo6URUYtHXEjxsrKWfSWX0Pz+EnYo8eBuA2Q4CUBVZzU1aRPmzvbvX2jAGbkH0K0f+zvIdn4FzuDNQwePERzpoPO2bOi/lo7NIl8+ePZCYCyDdUGTe3Vyu/mKiKgujYUP2c5R0blQPMzpxg0xdLiIO1zYYgzK2ewsNDHg0cPce/+P2wrVw/8HlAj4VYBaDOxyquJRgAxZkjUb29nm+OoIIoQxy2m/mfcOz7xMeoUzdsXQaTtx6v0cizBnzjNcucY/qgscgwBY6s6ArqvPw9wfBYAoHeRCyGBF2R1QcHaMwpvUgwbWCzO9rDUnsVM2ECn08ZouIcHf93BYHVNdiQZy1SwcaI3IlOdAJP/nmxg/sRRzB3tIY0IfPTrblnjpbiOEsBZYv7p9bisYInROk7PqN+ex6neK+haoqdHsiaKTtNzxmkaTDBCgkdP13H9zk082X8KE0rswUyvgFsAjMav5OiQOo7/hrtDJraZYYZ+cx5vrZzDJ+9+gDeX38DJziLmbBfNLELDNdExbfQaXSzOzqPXneXzNjee+FyoVqyJTpzKuFVXXJ5Uoyh/dlJY031iWkPggLsXqjHOgTHCOU2EUeIr/+lugq6N8ercEi4sn8PJ7jKr6NeZ9yIC0KYA3srFnsOPF4GEhaOJmnomSLGJbfx87xdc/e0q1vcfY2wTNGfq3KJioLFKMWJ0zef5YX1h0UwCnO4tYz6ek/dxFQCA1hYnK6KDFoYm/EL7QYLHOxvY2N/i9l8qqLAAfa0ml6TUiuI6IILmSvH3e/xBa0s9tGLP80Q01OjZKlOdC8dTdu0KLJTjeZ3LdHCsy1p2Pnbl3YuY99L67XMrKnyRraG3aVdtCmW4srMdO/URAFF+tsRe8Tk6vQaxyqlYoPlgOT/kL+fwPwAAAP//pF1LbxtVFP7m4bFnEjtOUpPQqhURLRQWVKI8BEICqUICsWCHBIIFYsOSn8DvAjYICkKwQrRFEaAW0iZNm7RNHGc8npmLzrnn3Ll2EgEiUhQrVhx75t5zz+N7RC988trnoRS27H3PKoeRTEBCvqETgbKPxWrAv2C1RG0jFhc8lY8brjJ5rGogPAKhNE2QpKCriWEkegRWEHDaN9GHUwQSpBRCHHgiezWrJLZcwlDyBD5y+gRxrNZp0m0Si8Bakj9ryzARHn/Cj62CPBxUMhBkhG406tjUAlG3zY+IP5f/nrWBYhEMBScWfgOg9rjPhFjQ5oRa9VVe15GRA5OCA542CWaL0lBsFYHGkmJ2wav1hd8w8DeBbhhbcAVT/GyC6fkbavrA43GwKLICaZqhnaacuMRJgjwvMHpwgJUlsrTJuJiJa9F6CNW66+RDwkJAKy6GCbbVm5vDXEo2dxE6ccLU6iiWrjY1KghCTarVdI+MWAK2WlYxXzp+mpjolNJHHwSOtSaPPYVR5Qnq8woHUv6sr1Dqv54Td9FA6zcYKpnQsdi4QNxEZJEE/riTSI4IsRX7o8J/eb6PQbePpblF9NtzOJUsITWxTLy8/+z43NMtgVKMsR7kQ2zv7+Le4Q7KuEQQ24KKCzTTBDYj+z/yoP26poyblpZinVg7D1ad7rPauQQm1heh4ppE7gjdQvBwCehGphIsUCk0JBYI9RXp5dt4B6pTWZesstJrLpMCUoHuUNG9e4gfv/gGt65toDUBc/khjgiUoieelNXIVGgvzOPdjz7Ay++8he7CQER3mrVK/3UEYBM1fso38N3WOu4UB6x4T6rLlNAZsq8hy5a4g6CYoDssEa9vYvOrH7Dx5bdo3d1FRgglFaei2CO0Z5py0W5si01ab7GD9z7+EO9/+hnOPXcZiIn72hYshz2QQ148lVAIKpmWjmFYY7sSyP9x9n5w+8KunaYJ8F8aAMbZLFldhTiosbd9C+PhHjeCk7jlJg0q2kUTUSNpOlsWigtKQKgGiu9ZH8niMuYHqzBx7Dg7zhLQTDe5/qkB4LrpoTZaG1RZ46MriK8gmplwwvn5N0WNBQzbop4aXGPEITUpKrSzCGvPXEDv1DKu/XwdD3f3Lb2H4a+VvWdC97H30Qp7maJCfThBd76LoNdlKkpZlCjHBWpCxVA8ThMQH0R5v0HY8JmMbggjgGzPitZ3QXCUHHlshLJGsZYRacMK+a/3gd93kNyfoPeoxNJejuzeDoqb65jc/RNhvgcyRvRpCSHU199yhVvWyRrtjsHlN17i4v/FK1cQpgsIkHp81sCjxGmRLnSVOoeh6VAw4WYHnZskhqnnmaWuhd47OL4x6xf/uh4aypm/1v2CF+61SZGfKEZx0EY76wPEQU8yIMog+GUu2lUvwybGEavQh6JuH5EzAbUPTQFTjGGG+xjeuY3d2xu4t7WFZ5+/jKC/DBNL0+xffc0W6mbm8xyzF+RnONXUbvQ+nJ7Nkb9qvmcRAH4DoJ5ynpG7UiliQxv2Mc5fPI9TZ07j1uYWtja2kYQJItK2MIVVtLFiP01T1N1lg3oyxuRgiPKwRruVojWfIWjHnF+UQWXfgZ8U11bYy91Z05ztziZOimlej6ILwEgAL18wjvV4QuO/gaad+DxpHHERJA4AdmKuuULNn7XMcwy6PaytPI6MqH80ATTA5h838dsvN7jppiAoSwFQ/SCJ45Yqj7weYu3p80C3jZK0lUI5v03p4v008qWZ7IZebm6cvbXNfylPObtyFmsLZzCnE2oj1qWq/+B91UFz7SheHiLH9Y11/PVoG2HWYtFIaOFG+6WyAr62KAfTH4u8wMH+ARY6PVwYPIm3X3kTr196FWfTFQyCRRad48YIWedFXDYjRYul81Y7K1hZXkUnyDAajZFTXIksbNsVUXWTz882APT3tB6Yq+0cBhqB8Kk1IHpqJ4pGEsK5KBkejsKgF6W4uPoELp15ChcHF9AFTc874uwktp+Syakl8P9pAAQSqZXzP8SIkaFfr1/F1RvfY6fYQqsbYmIs1dfqQ9VMR4wCIxIU0+cvD46prhlVWFs8h9P9x0SZyKfi1K69q1WA3Y8Vf6QxKuwWj3Dn4Tbyatxo2QQNTXT6emteeny8dANPKbL1zCcXMKp/Vb9M6yaLFqdz3A6U6fXZSleQ5Dpg5D0rr+UjAVSUmlyomIouBT3X0QmdsbTWLaqV3hrVrKpPxPp10gQ40rQXRAC7+fHzOrBuqLPumgD4GwAA//+kXcuLHEUY/3VV97yTnY1kzcskmKCCCYEcAkYxHjwoelCQgAgeBAX/Cy96zdX/JHs1BCQiPiJIWE2WJKvJrvuY2ez0PHq6W75HVXfPRBO0T7uzs93VXVVd9X3f78GtpJMF6kGZsaXaRB+WXIBh+go/9kIpuXAOAisVauErZMo3lw2/s5yjqms8jCs6AG7iEIzXBdGONmA1i07XtGHoA3ZusLU+Ew2FyDtfdM4ssTBeimQ81gqA8/9OOaPIE9nIQ2TnABPopi/Tir7xFXap4Fv1Z4xERdSKN6d0UCYCdgAGgz3N6kjVYFri2ZYPgZMkysEI5/5O56Xr2NDwvY+GI772RBcm8TrX6mWackU9radeTBBatXdqzs6zMo5jVZHMfZWeIDMOXSGCh4YhcF5lkhY+W82MuSSPG9TyXajYVrUKTtM3TTMvCNJuymCm5lNiqdmK0O/1cfP2TbRePo9DrQNIEoJbZ7xG0EszyKoa22YG7mg48ArRiZrMKaJM7tHFw+jHu4iTIcPGdoePMBwOfaDpElnDaIxJnrC4DnSLRGN/6kU6lFZSekdWNoyl4Mf95P5qnEtabgpkCQW3aVKpRkV6c7ny1CuQd7aDa3H13mhCqdNpKyTN8HwMCVViG2jUmmjYCJGJsK/RYfh6LTMgx11DimJGbC/ntRUylXbxPcYZ3q29HjYHW5iSzUooMHOGKLFyriShssB4UUZosO0ELMk/mOeWJrDKVQKm16ieB/EUs1RE/2g+0rx0WXbOfJaQLM4Ch+6b5uA0nrLYFv0P9W+Z6+STCoxwkUSD8HtLFlkMFzWIUoMHK/ew8dsa6okzuDEcEFPwb/22T2R96ZOXLlzA2VcuYv/CYgVmSf2e6kCgt+gd9PD9+ip20hFsu4GcbFXZ5sdyO/j5jUY4hAbM+g5Wl69j69oPqK/30SWrxiwphptbzjX4d9dtd5u4/PFHuPzJp1h68SzGYV0TBG5UprKJpYp4nukYKJh8DP33SJjH8elmP3uSsNA/HLNwT1rgQouNh/fYs5isD0l5Ma9Rc63YtirViDUv2F2fa5ISzhhWvZDWUdXOWIfreDIS4UlNLW3sykkDoYgVCefZy0gSRe8zNxVusfsGuSXz3jvNeT6/+8F7qAUNXPniS2zfv8fzFvQd7SfpRkWR5SlaQYS9nR62b91Cs1XD/qUuIzp24zEmD/4SC64GcS2B2oGOsBDSog109kkpsAnUcpTnI0p+/9wAFZIlDYPA8DsmHU2RxhNMVreA1R7aozpagxHa/Ucw6xsINv/E9OF9hONd1Kzs2Yq7L8JmTmiw4JFoV7z+1pv48PPPcO7SJeS2hWmu+jkeeJL5ED1DqjWpcYmyMlWOqFRgQlvz/VA8f+M3eJV+m0GCleG+7IJU0v6Zq+qWEAXUp4bGMXXbNGfaFMN3acb6934qFpwQNXlX/WI8UCBJOWQjVvwfbmwi2d7Gzt01PLh7B4vPHYZp18QI/7/Ow6c8qoG/+7167497W8wf7lum8l9F60WVQbxdjS6rElCnlNBptfDa22+ge3ARX391BdeuLoNk/NqCG5Tnp2iocsvo9y5ll/YGiG//DvIKOtCMENWOALbG3ZH45FzRNOeAk+dCb+O9pXeJyrzVMCcBCOJtFY47fbqn8VRPLNdGmGLsuu0Gh2SZPL2d4RA/r97GuRPPY+nkPrTCDEsnjuH8qxfx440beLiywqiIXNcmUzK6knGbgbb7939Zw97aNrrPdjGxuh8KBH2UCx9CgOCzQz9zRUBtd5p57QjLNqQN7G8soB40YfNwbgzMHj4+CGSW9JMB/tjcQJJNMJ4OWahPeM6ucJiy1Tj3Wxog7g+QJzkWzD68sHQa7196B6c6x5gf3/Aru3CzbVgUeWjstShpZ6iQeRTt0x0sLR7E1Z+W0Rv3OcFoItUA84XAdK5vuOg50QLGtJT4nHmvyH2W5jB/XH5R6udpxhQpjHI08xpOPnMcZ46fwamFI3xHNRYdLuiXWvao0Fr+75F7WdUMPQzxza/XlekPAwAAIABJREFU8e3Kd5hEMQJar02KqF6gH9lWlt9l0dyVncZMrhX+ePSI/CeYspP9CyJEGa/IvGWkQZ02CknGyAgShST6CzlkyPPVCnfoYiw5c6JabW6cFQjdIjHAdEqf8KeiYU1E7XkpVjSNWvLx90rxEY8PY/l/WPhetdrckHc6ekIRVkova65Y2Lq0wVlZ8s9kaclU14BjPdZvo6KRxuruXsqINTmfFNJo7ZHirZ7boZvoAPA3ZdfSWlcVhb+zz+u+kpuktLVIi02xilJoC1IiFkXpROxAHeqkhf4BERw4cehvcehEFHwMBAdVLFVItWpbG1ObvpL7PO8j67H3PbkpiqeDkOZeOI+911lrfd/6vqBSJWe6tGkmqoguXKvSf67FpCjiS1eXxAFr9rcEo6gpqxGLfz5vArsUjcwshUpnyLJUfAqtsrbvi9eqB4yTiST6qHh+v00zvcoCYCEURc2ZeumpV20Qqr8/KfILauOzP7LH3vrUW6AbEcUqgKS+92WZ8QuA/fGNcUJrdNCciYgeUVNDRhooEbHNB3YcqGRhyCIhZCR2lHxW0i0l2vK5NET98rySxUYLnuyT64If5mQ85oUymYwVBVURGkMNmVSuL5MFnaZTThxp7oUo9nYBV6VFPWcBhJBGSoiiVuwWgFFEhFAoeuZ0XeSjbtXoPZ2bZ4cHI3QVEjSkn9Ns6ua52aKoSN1imjHaHHYgPqq8e0tERlBbQqooOOZ+haE/xPrda+gfXEJ8pI3FwIqYiHJ+xwS7mpR2TsY1AmqhDHfQ5XVLFLMuujjQWeZwmvQLDjD0j54/F455wU2AJE8wKodsK5LkGa/zSZZyUpAWqRMLMY0EvCkSSM/EbsLQWRnq3xtWdqjsi8ZD6NmNK0r67ShmoUQaYaBRG7o/9DxobbW8CAfaK1zMsxNHELBmBBW8EcSlQdCzwGKkLvDzS86ohrgvL/L51knldnopHrOM/de4s72JO6MtDMoxWwOR77Dc71m32uMXdKmqwJqsqaI57ddQi3Qy+yI0l+43U5yIzZLL/qIZcNOYMw0opmijK4ik8ZcnCccL20ik+8BipTqbSz6qLOhptTHcWhTE01oRMik3EKSUGmrU/adChoQo0wcTXL+8juGth+iVoVMpFtRFig7ro5xRwb7Yw+lzr+Pw86cR+S1drTZZloKnCIChB1wd/IVfB1tIfZlvL33DTJhsWrPwWscPsZBX6G0OcPvLy3j4zQ+I/ryHbi5IfS12yogKSfygiEKgMmdLhzp45+IlvPXuRRw6/hwKI2V/YXKxgtJY4HnWu72Y2f3pXLqndL161wy7RbIfJ/I3U7mfF4Ham9Y1ROOMnIvU1hK7260WvDRFtvU36lYPZl/ILy2iyNc6uiCU1UprWEcgb+iRAPXc6nYCibvikb2u+etpnD8riRk3E28aiLDr4us7xF5/Zr2Zg7mGrlc12mtG7abkewG/u3yWUep2Qpx78zwqE+PjDz5Ecm+TbR6puKU5WGNm6KJQxQpEnofk4RaK335BPzyOksYiFrqgoafk7gN4HRFgopLe0IxkFCBoqx6HAVOHi6DmuCdjPCUnrkZnW+ncCE0jFhLFSUI6/MggKg2q7QLDG/eBmzvoph0sjguEgyHqzdtI726gvn8HYTlGGBnWSjBGdSYdN0ISyjZbHVbo9GO8ev4NvH3hAlZPnASCJfID4AaGfKlwa9WuMnkq9P+JMFl8O15gmOaMZpLdeMS2Ud1E+psJ0V4gTiy75r1F5g9pFs9onPB9pc1KqwLK4Ki10nTxtFb3DS+TZkaZwJD7RjZGsb2D8v4Aj/64iY31n+HFHlafOQb0Y/4cfSOiZkPd3GNNDtJ/H3s+tQeRVsS/rp0K9v859hQicx3oXW5HRsSYxV4wk6LV97hhRsrvp9ZO4r2P3sfSSgeff/Ip0mSKNs9Gl1wI8QiTi25G8tqSlNI9RNkEg+vryHsRukGOBPuRL/e4UCl8th9qKP4IDF27GOKh9BQ5U5tdWYs1/FbELXPOn2gGmYCROVS46WjkgIIGI+bfj0aR2GjOErBAtzIzEa5tbuLHjd/x1JEnYKoQh1eWceyFEzh1dg2f3bgJj5wUarFIlbfGbHxMfgHqMXDl6yt46ehRBCsRT3qHMdHwA3eesp+kGejt2lMzVNGOsDJjr6wZjFiM+qRShMCLJPfxqtm1WIfguRshrekCW5MBRlWCJJsijI17D1thZXYQKg0zR9JhimqQo+sv4OW1V/DambNYDclmzj5X02g/NEes9IYozkxx6Ul/Bf0DHXTOtPDt+ne4vXMLk2KCKiAAr+LcgEFObj6WToTSKEtNbrNxhagTTbZsCdXuIWYnx1trh8wsMbDTicdxmHQMUnRNjKcPrmLt2Rexv7UPS2YJHbRUN2fGTmrwU+fu5uOP2f3Y/Zlmcy5BzU4MW9jGF99/hZ82rmKn3kEcE7M0VNtEHRbgreMr01It6RrPVtBxEaFLihzb2SOMyhGW/QWNl3NH3RjBoJSOAGGUnO8vxX30gx5Goyn8VsB5IOXPJNRJQBsec0WVjqeKvTuN1YmmFTf9KM9SUJY12WhEnVy4CFAlNioBqLq3HZhKhXnccoAp83QIBMpzdNttBnBdb5maS8zIFlF8jq3KqqJRaqvzxiP1qsVDtWUck2NdjiyXXJic38pCtH1oXfG5+QFfO+vu6cGj+Bk5XQl7n8EL1SVjcKwo8Q8AAAD//5xdS28cRRD+umdmd3bXDzlYSI4ihYdQLKIkxhdeOXAIisIBCYkbrxsHhCL+Re78DC5IXDggRCQicUNIMQdiSDAxOPbGONi72ZnZ6W5U1dUz4/WaJPQltpzd6e6pflTVV98Xh6z8JOFWWNjM2StOT8gOlyIhwJ8j9sEs8xBg02BQt1KrOnFiRI263rghU6cCI74pOXJCP+fkdKo6guIkutKsUWen2owrkg5WK3B+LKzxD1u98NAvY44uiIA+aC7SSCInzLAoBkVjJzKGgBoIY6bJp35rTU6KRGK0r0fvdLv8uWD8PJfKCizdIbOu4lmwFBGS8WnZcG2jtlmJZGMwRNtwelyDRMJf5MRISp8l5eAIIzdKdDsdduq5ZkQICoNSQGgh28EyFUkihsaVdiJl8kgEkYdQ0vyQygGt5HGBhGQPCdZSZOgupMhzg1/+WsfszDxHNud0WsHhA5S+2afDD5AMkfJgpaixdVFEMeFcQdtfxOiSGHnctJtxnPnMzIjtJbclHzijsvB1Trbk8gp6p6XxgQDeFNxhWIcvg6meWAVHQl+LwlR95lp9LuvQ/C9l6+c6PX9wsA53wnZAZSEUOCK+3B5ShqdF4uaXwqItT/DSR65+/0ouKPVB445VVIA4/WBX0zCr685wF/cHu8jsEDq1/GRbrTUP73KuFvFxDQbUYC9kIyNaCzT/ghgJ8P9QZhTmjjJ3IWvg6+piFKOHvF6YcCwQbwkkmzYyGiczpTJpZHlIi7X+Xt9Hej7/XBLCwCBJO7yhUzkIOceqsPhnew+b63cxfkjkOloAdGH26ma5pt9hdXUVq69fRHd+QQByDft0HFvAvgL+wBDr+7vYpZmNNRSTbvrAhh079OIEC1EL7Z372PruB6x/9Q2SzT66YwNZAaiXt8yD80c1KamfPJni3Y8+xDvvv4el5XOwRjUO0Fq2p/pdLl6K5f3skfEdjb8fl62xE6P+v02j3ZlFFKXY3+ljNu4gdTFadFntEWRaMp1MaqeDcGXVNxE+PMayw5ierDUdEj3BGVDBBIUYitVlnK3qYPl9eW2w5qSKwzqJ9oqq6w45Oe35BJeuvImDfh+fX7vGQak2aVQLBFfXJZWMkCLkTyvPMdrYwFOLi+gQCoCyYyBZJoPR5j1m3KdygHhxjrNWxOmoRbkDsU+ppMqPw/oBeqvRXo2GmOdtKeEvOo8yBzUYYbDRh6Ga/yzGnInRo1K24QGyB7soKHgxeoAWyQ6ys11nGjkgTGg2SgLIPbU1o3D57bfwwadXcersBaA1W71r38qGLQebrctVlChXhEOiDDwDui7WqmyEg2CqypgcItuSfabJ10OfLySAqKOjfAFSnN2wD6nBFafNf3NQ3xDlAe0z0zbo4auiUt9QXpwOIMRafwcH97Zx/7ctbN2+g/FoiBeXz6Nz4gRdNvxl+Ind8SdrVfV+kG2FnTIHh9tkHe2j6Amaf7a8P2lBJsnfnejX86oqsXxhGR9/9glMXuDrL76Eszk7eJS0abOGhBGpu/p7SVlFq4Kdq72fb2LocvS6r6JH80glgolXB/CE1q5GikFIa5lIUglSxsO7fYJeoSDnj4JlfKH3uuyq4bAcf/Y+bvsvpIfmZ+8XGdbubuDczrNYPHUaByiw9NxprFx8BT9+ex39O7+jpRPktqjcw0heUyzEZtoYbP36J7Zv3cXJl55nklvVjjx0XUE4Y1wVGG02votO6yIhGJMeUt0WLqOA7w8IEMuBjMkWilXoHvb3cB+DImM55IiSAtZD/skhCrxTNgfKwRhRrtE1KS69/AauvHYZT7OTHB3ZeQ+3aY6v5nN9FinOzp9BZ6WLG2vf49bObYzI3mjzihKUHHCKeEJZvcsFpS6xXe3DjGbKugjNS88lPNpxkbFahbcZf691oxJzcRdnll7A+WdWcKq3xDr/LaQSrj/eNnx7vECgnvL/jSBCh8hwz+zh+k83cHNzDQP1EGgr2MhBG33ExzNBa3kKxUXgR6D5aCcRMkP37RwWPXj2jtDqvbkOENlKdYjsaTad4+w/JRlLrTAipLYQcEcNnxHT/IZpc9AoU0+4lItg/V4ukBxsTwQoKG9R1mmWv4T7LiPA6Y5nPFF88AXD/Tj43BwcoZu3wPWZeDOQ/HFymvy0Lp/PdWm97MHM4xv4r7zPyAk3SrBRyW3sE2UUkBoOBoyOICQB+ankzzHCAMC/AAAA//+0XU1vG1UUPe+98djxJMGWykeqggjpB4VSoIvCqqCyQWwQKhKiQiB2qKz4JUj8Bv4Ai4odOxASO4SK2tKa1CFp5DhNYsdf45lB99735gtbjYryNskidmbevHnv3nPPOddzlAi6KEr+HD06nRSmemcBu7IdAqR9msZwPEgn+CiTnKe9y+9ZwsT0CUpzjLZUCm2pq1l7P+1lD9Yl/KyZIBrwYCjGHC5RpiAtHGdoj7J0rdz1EPrj7pm15+7/pJoQV+mPOBmUHpIG43CMxEoBaAyHA67sJdahnPAG10aG2yDyAxmkhjp8b54k0gI8yIvhFoq0gtCM+rj5df31CfGka6bEJ6gF+dm1ZoDZc6DF51twQkAGXTBSDBnpilmTL8mpsaaOsqDZBJA1/1EKOhiTtYGcs6+lw1XMyPzQ2CSXrp1eal6UyRRhNMD2Xgf3tlpo+AGqgYdarNkPAGXfiCOOxDo+a2uvZDgENxw4Oud+mq/AeLmwMsKoEopJEJtJhfCbirWGGQBQumGtCputsu0/ZJGK3MM9D6O8VKpB80AAAGt+mDafb4Ki057zlCa45nL0X3yYQtLDSZBK0nV3lHew8HxiwxII2gUOwiFanQ10D3cRelOhOPplGlcR9SETTEfxNxZkc+td6EuTlHLrwACldS7gznTGfKDbTZbcfpFLSoUyFaWdOIyVI/0nGMmbslh3/NhSiBN7bbB7T5XK670QD+60sN3+h8609NbcUcRzkEi9gHD+Sr2Ky1ffweramvgXlGUfMTCuAB0Av3b/xv39Lh5FIQJ/Ef7CgoAXbA4RI9AKQX+C/d/v4v4PP0G1ttkI0FgTOzrkRBccM6iABCkM1HgW+OTLT/Hx519g5cWz0lvXeEz9F9aotkY8cZb8P3G+MOsdLNN6542CgKcoMaAAcelp+AtNbHZaqEQbaCbAUjxBNW5C1ZcZDIs8J8nQNmxEWlF17aTcVRxvSiQJojPDpbNmPLY9j3WJAZR9wl6dAwXKNRcFG2bj5Ikqrn12DZ2dh/j+2+8Qjnv85uskKkAfzHSKJU02gwh7d1tYDi4iToaYVDz4FY1e9xGiCrgyUq0aeHUfyveytphT2bpoaqeeSROVyIL+xGqgd476NgeeL20K+yH6GzuYrneB3QnqC8/Ap+Bm0EO0u4Ows4VwtAdPTfmcIRmHqxyqxLYyIn8PRc7/QLBs8N6HH+D6ja9x6tU3CA0oJf+O/5GxVlTKXpmW1mBRgpbuG6UV4Y4TqqIUn8fs4boLOaB/NhAwe4gbuS9rVLnnH2JqGQ1UJzNqLJR/YmLQmd7r43BnB72tbey019Fpr2P74TYuXL6ElfOvAM0VbocoJpFydukjLfp5icDxygj+z9AWPNJJhrMQWH/6/Fl89c0NhKMhywGYABILmO0o3pWkAMPxdxiKew762P9rHdNGA09pg/qJJvGkeH+NVAZ2EBCT8Z+KoKCbSa7QRTa5qAgFOgytz88MbfhxDQrm721u4M92GxeeO4UlPcViUMfauZfx5ltv48fWA5HwuTOB70N+DiIBgak1W7+7h1s//4YXzj2PhWYFA2IhJXHOUy2xLE9V2GlVWReQm3PydgqqNT61cs4Kcwed8c4HgGIwihXHzPqVmDexvitaWzsNkkeGMYb9EczEx5XXr+Cjd99HQy1CJSF3enjSQZ9chMZLtRV4r11F7c4ybm3+gX2iresIITGxfM96vQgzOlZprTn1JNIlQAq5oo3vG0zCAe9nfs36JCk3fxqBruPMyTO4tHoRp5dXLelfYIVpTgoy7xk8fmQMNXmkGWMqYsr/IbrYx81fbuL25m0coA+/WRXNeki5hsSHKaXedj9yvz9uUKGHO8cZJ+6CbfuX5K4NuTcx5Rpw6/NGs4F2fwujUQjPN1xUnVXIngfA5Acn4LYNvHwuFuDddrhyzLLse2PuNin3b3NWKwngfCln/JcvTrl8lmPg0mUx29XK0unvhDkr/muuhWEq0c4Vq513EYFJXiL+YBRrs/M/y93FYJ3Ngtlry8AzBv8CAAD//7xdW28bRRg9e/OunZikVRFFoU2qpgLRBIHgqULiCYnbA63ET0CUJ35UeeaN2wsCISFeKyFChQip6lAaV4nj2rl4d2bRd5nZtXOpFRAj5SFyYq9nZne+73znOycOVLUQGhxPisiNuQIYoatDKRLUd9vIEk89cADC2JeduOGFfm89AkJ9Ig61cIcsVQ+lQi3UGmcpQcm70yEw2pvF/cKUnOUFV+bdd6D3ZEBA94/TJRC7BRVy4uSjHKNOuL9xGwK6SWlR3Hc3RaEWfolPfthPWS32HPrEao6Ifd+5CPIZ7w5A7+fmi5LyugezAB6l/2wWudD+6YZSUXhhD8eTUlf5h84boXEkIuKuG0pV9YkQJWP6OwtAkhVMUXoAxiiaxuBEDRjxfu9BeOTmqnQVBA3lin8ibRRiaSG96xRk0kxl1BLSNFjv/IFzrTnMz7RZRCk6xsloslfz6cMirsncsRxaWfXBiIp+wD3ZhsPcGI4MTZTckqql9HSKlCo3gShWat1HL4gPvLgKsGJH+3RrpfdcGqf8yfRIj5hCr+/FAXhj7H+MBq7+IeVAhzMqQRe0P0gEKDDY3N3CbrEH0yDE0vK67ReHUsFSb1EzEdhIL16lEm1dj1OpIikwft/R2vN+D0PPhGGacg2tpfuedBi4bYdEL0eVaKZV9wZ3fwuKWQF2xiv/V3TtUvsyY6e6bUVklGLwglwieoforK3jYJCjreFRRTRUAUFN14g6vbSyitdu3ECbLOlqz28XhI8iYAfAPQzw27CLXrEvrUnUjhEnOBjsodXK0AhLtCmgubeB9S+/A+4/xIVC9CacuCQDGLR7tb/ZBjJfSQN47+aHePfWTVxcvMJiYLRnwsCBEHXBr6KW/Nvx6vT/PsZBA67qRQlm559Fa3Yeo+EAvYcddgeg6nN6vmT1bm4TCVKYQGXxAutX5+zh3XRj7JBVIIvVw+PK9YIRfU7jT5rbSpNA4mgB1UP/Cql57aGMMpy78Aw+/ew2J4Bf3PlcGGsekApqwIcwAbgF4XEPZrOL+UsLGJWW6ykhPd93+ihaKZIsgaWMuyy4DSBUhxqu8ITqixGEfn/lao3KzjgFJesZEgMMu0MM17cQDam3dwaz3A6wjdHWI5i/N5HvdpHw88nwVUrVT6jjrpGmQRpDEF28d259gI8+/gSXr7/CzLfwCGHc+uq406yoqP8VbOuDQ1e1df2eZKMUHe1DDVQXKKgpI9uJ9iHrdUtCX0zAMYDC6SMU1wv/xgU/41ngj8GMEazZQz7sY5/W6gmp/fcx7G5jZ/MRdrt/Yaf3GMsrL2JxdRXJC5eBuEm8bNj4GHr9fzw8ndjR1ac4Y856Dp04asc9rT/1bdvA4NoqMQFuM5j6/Vff8p6dJXFNPR/dzPhkRDBXtCmBfLKH3t01pFkb2UoqjgxIcJgEfB5aDzAB42or9Z5bBZq8zXDJlq9IImmlCaYFZqachhMqmfRZWWsGg1GOtY372FhaxvzzC2iUFldeuoaX33gdP//wIwbdbUSF1TvT+qqqUOA1hhsBnV9/x/afHZyfW6QbCDYS8JniZPph0cXatjst8aRXWo0UzVD9cxgtefqeLb1TQYl+v8/Fq6QprjkHzKSVs80q+zjJEwbzly8u4f233sZcIIZ44bFR2fRDCi4pWghwKX0O2fU3kTUS3H3wC7bzHmKyeyukz7qsCefSU2mataf5KIzmIqwPJRFoWIooKGkTXV24ileXJPmfw4wWBWJhXsL3uP37Ubteoz8HKLC+38HXP32Dzd4D5M2cr7XZlDyPHB6mchqtDQaAVauJE1RWzFe9MtX8L7Wt9NS5U+u+iN2/UhxylbwQ0e1AYHVi1lG7sReynQKUqyfrtAOYrUYFYM7r5Nys1k9yWf4/BYbFNe34OEDY8yIgz7b7yhbg37Xyz5V8ZdhzrMGARlVYqz8H6DWyuKf7w2nKsTihVv/dGeYKxxQ7s7UgOc+QS1qR4x8AAAD//4xdSW8cRRh9Vd3T41kytuOQyMRhiRWIxCKUKBcQB6QccmNR4MghcEf8A/4LfyASN6RckBBISEgIRSEJZHNM4jHY8TiefbrQt3XXjJ2YiVoaT3emq2tq+bb3XnLuyrvfBGXepxtLSYpE6+k9OdWEuxfsRFZgBGGSCpWyNH08mnZGyWCvpEnxnpxAMp5M+59LKPMysyodR850VQnAysgGlCXfJBZMisM2ccvEF/cm8jliidaOLNgfg0H0ykhXUNWAJNIhN8feSrbJcWft+JjJf+rHdUVbGMownrDMXx5lI6EBBvusIKTQYMCQKxGcOtzyW1CW3JgzRdZhICX5xPBIA2RkZH+lUyu4fWU/pmw94xKFGdLPyF2InGPKg0OkG0Upge7FSLdJGcQxskcL4oj2uOcqAhozTCiYCCbIXrQuNhpNLW2XqBOTaJmjFoQkiSovuv0edjodzLfm0ao34UZCDORVGcCFaRZ+rS9FzMZcGoGGW4veA2qQCZM4Z92dVFows7zlc43hF8Y6nhbs47xAk0wZfyYkZKLEn8q56OBzeh0fKn8jbNZyJWnRu+JuXP9SXM86xboQ2RMw+79LtD1ljaV7xr/ZV6r4duZDoKoWN8GT0R7Wth5hY3cTfcKipjlv9lSS6ah9qtPP3ae0tmUwqCQFFfkrp3NXsEkUEIjLa3lcRrJsXNJk89IMcZ2jY2VftTnqot93UiyyMm9pDI8iaJLNxUQ1iR2dz0XKkrLq6cSh2g948Mst/Pr9T0iJUFAp9i0AIBl0h2wuY+w/Ghk++PQy3rt0CUeXXmAOj8SXakkjD+w54G8A13Zv48e1m+hTcLBWx1xd2MwJhrBQq2PJVdBqd3Dn26vYvPYz6js91CaGzQxSAxIkk0VQFds0CZd56cOL+PKrr7H6xjm4ahNwSq6a5xoQUYZ/JkWL9fxHRZ8Zs/PhDs1M1HuWtblQVi8JiA4/rA3K10KKHJ1tbD9+hApxF4z7LGk3GvUZB8lSsD4teD+C/l9xCEt+9gDsK4mcnQGz5w97fs4COGVB1vcxEWlQeVxqy4D4VNJSjaXAzEa9UzhUQZVfOGNA2veClcy8YEvffOsdbLQ3cf3671H40mZDHn8bS4NikPPa6440MKl6DrBSv7HuMu0BWSr61ZqlSLkKKWWWddYurmbcJlrTA+1v9BlxjlAl1jDHoN3FvzfXgY0uGv0U834O2W4Prb0uenduY/TwHirDDuVS5fuLsGvOgbIKkZZOJqhRECAFPvniM3x05XO8fuF9oNJAUO4KIRol8tcx4+Nz9AQP7kaiQh2GwmdRmKkzAUlTfeDn9EUWZvY3ZwMrkTUXDlN7YuxkzarizI6maYIBC8yWtd+uyGsN2KlM0IV3ZOh3Me49xRaR+926i531NvrtDp7c38D2wzbaa49Zimz5lRN47fzbWDpzFmi2AApKU9BCK89MJWJ/22fH9cHj/PAC4YP75f+/9s/Aqb+eoyIQByAcrFsFwuLTgBMnl3Hq5ArW7j/E+toaB3xcVClTZgvtA3Fg+fwY6D/dQ6N+BLXGEVYUGTHfVc7962E8EQrrCKZaIYSkJDfH64+3qoBg9DiiRBMTdEUGyD6ln9lsZXytMiaHiLnbKT+J7aGcAONMZM6lvkvNFk6vrKDmPB/1yhzW76/jzz9usDpGHvKofxX6wnt5wmtqr5vDZwErZ1/mIBPBAMDk2ird5uU3EpNJJPg4mBC8pu0Fakc2Z81lWF16Ccut4ywZyvfQ2aDirqpIED9/uZ/sDHbx290b2O7v8BrpK2Kzp6xOljNBYxISjJ8OsZQu4vLFj3H2+Gk0UUMWVC3GPWvk2xh5/lmwzZSAQAxNV8PxY8tYnF/ETncXT7a3GMpHXzGgQEAllcopCnRQJYNCkcMBTnphq2uVAPs+vKx5JEOPytDjzIlVXDh9HquLr2IR81wJmgS1Fy0oBz9l+e1/Pfv5ijB8KEtsJl5Wqi76uN27i6uu0qrMAAAgAElEQVQ/fIe/tu6hl/QRsgBXIQjxcAp6G49jp7xutg8e3KMK+c49jtUWcOroi1iYm9eAsUlLaj9psLZ4Cie2EfMxUYBi8wHanX/gq+L/mULPmCC84wlqnJgVxatqVuUGcKAgJdg7KcYQdF0gfTE5rCWcin2cG+D4O8pqYCGKtwErRLria8ZHMZet3yN/lNezyCdj/1arzmNbtoAOqB0tSnQyn6gNlvQVlTvxp7mPlcOD/jZeAz5Hl+c5/uPtanrbqKLoeW8cf4Y4CUmTKGpDCWpVWlRRqUFiUYkNe5BYVwIhBAs2/VkglpW6oPwCViitsiBJk0C+GifYsR1/zDx0P96b8SShlEpYsiKN7czMmzdv7j33nnOiuw8/CgBA4CrrYNC2/iC1/hPVS6PVY2o3KPmsanRSe9skCo6stEYM2b4LQf3QB/ueF+zUbi/2/ConSb4n1PjWO67wQ/j9jKB45F4X16x/uIACo8i+b7GX41B7l2R0oI3ynNIOCJkAJEwofOY4JBjI8FqiSIACXz3x/AzhlshS41UYPYIcqaYCWUEMWRndMhBA1X26wDRJRVV9EBZspx7U7Lk+jPV54G34LG9nj8qERRuClZG15tx5svZBr8eJEQE0IvYnc4EF8LTyW6mUg/e/samqvV9CQ4UkSceaOb7FigBFZNtGwJKCOU6T96J2H5AvLwu8JTEajRNUS+OYnZxhECCCGUkaccGD87Lt/xqiDHGTyzQbq/o4v60k8In8lQTNpp8bG6z+Rt5q72TdaIJuM0k9z1z9vVHuVzgLl3MGGDm/EefUC1/5s0+0EZDbiCxYYOfg9Ijb/jvoYWiHSGyi9kP+MZ0iqEaD6xDkaNXQi6AgWCol4RqbHOiUvVbZB7AHBXlhZZpRKXCtsr8LbYnaMug5VXyP5OaJV/D293uhUGTBoGjo0N8/xfOnv2Lv2RaigVHXDqOBYhwCFBozkqSaffcqvvjmayzfuSs2kxppelJE3wD7XP0/xtOd59hsHbOw4Ri/hdVPXRX1JMJMO8bW41+w9eMTTBw2USGwy8XKlDQBiCCBKRIKJDCF1vIHn67gq+++xfsrHyOJKBkoqiu68KENW1tRwjTkpIl8/bmDICRLvqTm0/XXAwDOf/pfkgIX9kz0ExeL1/mgc4q400JEx8vBHWmoDBgEKNCDv1jgZDLy69gFQc/rAwCXv4TXl/snGdDYJ/9WO2A4weY9RLn9+A4A6YhyWfEpJ1Uqp6ACA1S2gPHJCSwtL2H993W82NgUq8jEIe1KSY+cABTTd+wV7SaqMPQcdQOmpfFYFQxMMUKhNCbCvhSkjEXcUUcUHg2zWB+GRJBYW4gAcLLIdAWcHbZx+OwFcNBFqVcAuXnXkyJq7Q5aa6s4216HOWmw2oqIklq1MxTusCVbMer8Mo67Vz57+Dm+fPQ9lm7fBmyVe7TgSR4sqOXtKAdcJXfWc/xjbaWPc/M5AwDnZ1o+wdILEJSZM90AyK9Namd2+Ss7OdJ1PN3utNI/kDfx/YddYNhG8+Uu9jfWsbO6huONP9HZP8Lp/kucNU5wfHDAwP7ctQW8d+8OFm7dBKZmEDMQqw4iRhPQNwQAXn3//t8AQGbPnsoRVPqTkXlAY10uj2NhcRG7e7vY2twmTXQUo6I2u49W4ox2DBFdgIoKpM9Esc5YuQRHOk3E6zZe0jbRbFwpqyEh8F08Lg0tTXYmqpqYD7Jtfn3Kjca5eCX3mfEiavoszVAiQ6u8U4tRsus2wLX5OVypVVGPSqhEJXRbp1j7bRXdZlM69hDrmgN2qXDealSpZyedBuaXF1Gff5vFbOOAOdhwPaBARzrbRgsv9IO3SjXcnFvGlcoUjzlbmIbv+awpd39qjEP3ZKPbwtreBhrdE+Zik7MQ5wzqAkIgjB0SeDzA/Rv38MmHDzAV1VFyNn0uvBEAkB4UGzEaIvRUMFGtozZRReuvJlqtNlOmiN5Honbepoe1VoL+0uUdmt72lkEeF8H2DIo9iw+u3sLKjfu4Pn0d05jGGKkxsZ2zL1KlTv+vPPhLzx0hHmcAQHPZNvr4w+3ih59/wk5rB6Zm0Ld9VOs1no+U01ABTGhvF1gb/sN9nY0FGQAoT+Kd2SVMlidz/Ro+PkmvI0K9S0TmCQDYONrGcaeJdv9MRfH0LjQu8/20EMjHHkl3gPf5pzxROsmlWOWTf9F+EccfPy+ZMq37oO+LFhAB01LcyndDs8g9iwjGF1oQsouI5pJSRKcijVzb1JpdwLfgpqXbpKNA4mXvLpCPfwW0lI55GgGKh4Nlu7H4GwAA//+8XctuHEUUPdXdMxN7ZDtjz0SYRwIRTngIFgGBFFZEWQR2EWKPskGs2PAB/AlrFogNf8ACCUs8IkiwkSJs2fgxcezE9sz0zFQXurfura4Z2zFREIlaVhw/uqqrq+49955z0rduXf0ybvPXj8wdoCQSPsjh1lv5P/WD5+C6kIq8LTkJmqzTLXDruxyKhJ7UatWQONAoKfkvEY9CEBwXkg1KGk0Se9anYaLtWKuFEyVNrWZbVnl0YXf2LcJSSUy0rc8n+domEU8gfW29PslWhZCOB7Vu8ABElReW0gu0Td7KfPokfywgTUxAUzWZY6ClPwgKqjQXxNt3YkNhRdRhIPwUI0JrnJAXOPLQy5cvbmXUoMeMbAr67BNN+IVfElQpZbHleZ+r+Fa0AIKdh/z+qogEuhEwJeVnztX/LIu8POWgoIRMUGRSaGfKQppid/8A/XyIen0KM5UJFvbwNIhYcEmTQXfs2AOSPl7BVP/78Ssc394vPfjyF3I4ypXoX/FvDWMNh1+BMm02wRnhyBW+RnyQTbnduejejFMNDoOj32XChhgHneNJXZwk6TOmDeNg0MHa/ha2DtuscEs2mRRI+MDCVzUI2XdFmcyPk+5NNMeKOPo1qptMyauk92JCxC7Ldn1P4/HveAkeOrnX4/GbcoRUybSCeipqGq/twvi2Q1t4b2kIP3PSZdhZXsOP332PfOuAK51OKGdsTyY6wWSSR2fjIAOu3fwQ129+jHpjjueH+NJVfb+Nr/6vo8Di7goW1+9hO+9gamoalUqNfXzJs5iSo6ZLUfy0jF+++hrp0ipaQ4fMKpBgZNvmPhmcMR7kIDu1K2+/hk8+/Qzvvn+d/e8t03Q8iGIo2eeqP3mh99njmoKklEGB49b7+Eye9OdpAYC4Aj56ORaeHLBfaqUwsN0euo8esPUhzRUFXETj6ud0dWAHHWSpqPBXqhGjNVqP/yEAYKQSoYB1XB2IwW4n/M+w90TvoBsZsxmxheLdRK0CiZ4iVQYSiiPB0vlnn8ELz1/Az4u/YmP7b2TideyFuVywfeI6pamgT7aCsw1uQ86pu6JeYxV+JfvT17MgLi2masIOGgQKZ6m3r+MgQ1xxSOG5aqro7XbRvrcF99cu8YTYeqpuE0x2+8D2Fvb/uA3z4D4Sm3NylXFXlHcnSaDaBRYTGTB9NsG1j27g1hefY/7ym7CmJmCJAKS8NK0IFPT4YmV3njM7do0m/v8WAAgAtv6ziPirx+jNPBUAQB1UhCqaHmAPgf4B8of3sbe5htXlu1i/s4SdpRUM2g+QEdDVyzHIDzEc5midb2LhyhtovbqAtNmCq9TYr92fg4DaQ5rYavIJAABdv8d1SJz0ff83AMCnqVbQAwe4pGfxOZlWMDPXxOxMA1ubG2i3255mSGKrhR3RaIFQaYwUFOjHdPb3uDssnTkLNzGJQVplqpE/2ErwW7veYGWHNl6fqoAI4CU+iVP738SWe8ZIYI6jQfpJ0zMKAMjnojVKnx86BfB8rNbtdTE/N4uFuSamKf7KapjIMizd/g0bqyt+WCqUGXIr0R+iISUOD3sFppo1zF94DsUkCaxp/GIE2C9CzBRCJ6VCRvFXq97A6/Mvo5FNMRXWu0g8HgDgeNR4mlX7YBe/r/2Jw6KDtGqY/kh6AE6AWd4zhgbmsMAH793AxdmXqPbvxX39XXjRwseusFPOv2h8PiayLIx8rtbkTgASTt7Z38PAc0n53KUYM1MAIPpNR5+3vLvOe/hnRYZJV8Plcxdx9dI7eKVxCdOYZmcr3ie1Mm7Ge8BOG8BJY0dk/+spYF0M0MYOvvnhW9zZvAvUHGr1Cu/iWeUMBtY7mbCdcOHC40vG1vNpewXndibDbHUGL7bOo/EEAIDC4AQArD/awOZeGwd5h4UimW6qXUL8jqt7hws2ppS7BE046ezjBF26vTT59zcQSW4LyE+5DIMIvE69CHCo6CvCr+Ey56Ril86dCKPzM+4wREVf9fcP+VfQFfCC8Fo49uLwZVc13VvYb7QbQcbEHcfcne5/NnXyWjvEPwAAAP//vF1dbxtFFD0z640/YsdJnTRNQz9EihCoVOJDSFDxwAMSAol/wAu89QH1J/Bn+AEg8cgLj0EEVbRIkYC6CaElJHHi+GvtnR00d+7Mzm5QUgkJS1acxFnv7Exm7z333HOitz6/+2VYkXeVX4dYZKzkGwY8TqnQ9Og6WzTNlTnXoyuYsm0vlvSMAgMIUB88V/iEtwJM6RiU+GrLAoiCnnh3TDdAv0yyvD1AcBuCp7/TOVg0x02i5D76lCvnri9EMERkbRbs4pZBIiK5up8xTZ7aEdLUJ/Qm+QfAdAzrPGAVZTkRcQAJMwEcaOIQImtnJb23KPWIVGKkamZVQjk4TFlEzdJBZEDpzxMt8ztr+xB7ype7dsr3aJ/dGDS3CVSiiDfiiMdsHRucU4RiKjexlnhenTBWlmmPFhv0zAStzUbTqp8b5ogI/s1JXClFtRZb31St2HsWGJyeYjqeYqExT2IfVnEtsHTyonnCJ5wFNDIIGkqjPH9jKqj8OypnuaqTC03pMxlqmIw//8MDGIW/c8h8MQiVOv8EWUK4dWnM4VkTCdwAdjJDfzrCs2EPO8e76M/65ICgTFWFmXyZ4N5dVa6iBJu8tG0IkgMmwXPrgwT/Wvuk3lXk4fQnIuH9/t1mW6jI6aLAqA72G/e9ZbtkhfaWUCuCtDrI0ztGMkkRpxKyP8Uv329hZ3Mbc4lAlLl2BOnFI0H6FFWMtcLC+mVS27915w3UGi2iq0XCqgWbNWuq/ycAfsYJvus+wl4yRCI0mottois26vPANMVao4m5J/vY/uobTDYfotVP0NSCgnvJqvbaz5uyVVEBrK0v4rN79/D+x58gXlgi2j9Vj0mtnJMjc22IvaG4+qWILFck6ZcrLv8NAPBA1zk1xrM/ycPyqRoTI8MEAxVj2zgZkAuEzCzLieZWpUgmIwyGx8hMQmsE+Gh/1kTlk572m69B+E8oMW2C8ZfPrAxVCI+gO+EsWUj+Hdjp7ELDNjr3JIQ/uFrCVd444c3bCXK6KvkqUx08xdW1G1hfv44ff9jCYe+IKnxmzyGWDp+kFaMUVB0ejceoL7SQVAyV0+7dkg9s7JEqczFRVY3yuflq9mfbPmN1DYxbiwlCqKo8TNHfPcSoewCMBaKxwEKlikaiUO31MH3SRbq3g3h8SklZleWpJCf9ghhehvWiqY/43Q/exqf3v8Ct19+kdwNxvlPSWFyFn73whQUkhZ8dBLOTX9Pw60UAwJnYge0uLdVf+PtI/v7zACO7EfvVL9hil8UKDXsBagA16GF8dIDRwT72H/+Gv7tdHP/5FHI0wSU5h1ZUQcNoSqQz1Js1XH5hFTdvv4zljeuIV1agaw3m+Nj7MK1izUwub9cZju/f7nvizDO7IEgvj/j/BwDCJEdzw1G4DgRVv8016HSWcGV5Fb//+hj93gm3j+VMPgSjtyx2q9oxM/vKaIioWUdtsQ1dq2HG7ThZMPWFeEnn9OkwvvLYqtb5s+RtfuEVDIoKBMSXQamg0EFxrbDzKO2NGIlKkKVTvLJ+DavtJQK7W9U6BkdHePDTFtQ0yWFTOhRTyNmb3fSkG9LDaHCMV+/cRtRuYBppF36Wdsgsb5t1AsSuIJNpXGmtYKNzE82oYYHO5wEAlG3BMAbCT08P8GhvG1NjjylmqNarGAyHdB6UVCnb1daszOOjdz5Ep9JB1annC8dqvyARPefOVZw0C0TNkaynadWM0aq10FpuE8X/sNfDeDZh9xAQmyrfkfJ17Autmu9GmWWLVZSxWI2xcekG3nvtLl5qv4g2qRLFXstAFHY/HwFdMEZROgf3sHEOHItTgtxj9nGErze/xcM/HkDVUlgJKttyZBjQ1bkaYgYhae5LDAD/qecwdP1rJdCpLuLaylUCACKEeUkRAOAp8AUv29Co8NdgH91nu8RSIdNdZa1sbUsLWHMsgsXrbNHY3HMTwxgwLTFGRN7nSXZVegF49vr3azzIkSje5PyUWsm4Tdzpi7mnzbnyGNgfx9n8cYHM5eBE7XdAvAEZTEt20N7tGe4c61K+GLDYytfduF253NqxaykWN58vJP4BAAD//4RdS28bVRg9947HzzycR6XQtCK0XSFYwIZHBUsKW6RKrBASGyQ2iF/An+EPwKIrFqgrQCwQUhdACyFJG6dN6ziO7bHH96LvNTM2VDiaNnXczNw7d777Pc53TvLaJ29+hQq7sQ3S5LMo4G0yIV/OwYCR14Wimi5VP3IkGPxoevTRKYRXoetO9METIwAzQ0lVoGnGXAEpvx9gKp2RtT7jAnmDBfkiGVbp31PDWVSmLXFATkijUXAbGHmEBOACt7SsvXFnRUYLSIuDTRR9jntIrBKr/X7ZZMo3ifTZ5eH3qm7gCg19g/8XfdSVZIrXar4ZdBtHqugEr0RCTAZFi5V08pOUH18mlPBCWthstrlfn06U6+cm44wrZTY+7vuezRkGzeOdx4W9it6j+57nQcfhmbjMKRlgUHQbExE2mhhPMtT1dwkZhtO1ERnpQe/RvxusixiUPyIX8hkSQaC+VA38M5KmCNLDVyPyjnmGp/0TjAn9sNpBvd3k/qo6QWF5zODxeu6LSop0tkkGmQa3bdTm+vsg1aZE/44LeHupyllCweA2i9X7pUxn0dOflOiAylcsds7Fw/rky+SFBijVVoGi+l812xLQJU4J+HSsBiRzRXLACzokOk0+Bd5UZz5g4gJ60wH+enaE/vwMmZsyFFuW2lJmXwOIAm5dRVAwk7VXp8ppW7n28LpyvecaHFFbi7UIFNJpviQ3kcxsaUCFKFAAf5IMNJlFS3gJY25URyuoQx40acfqFtwWlKPV7ohMXubQyus4/72Hn779HrPeCPWpXjsz71dDClIFAS5iwFvv3cIHH36ESzu7qKeNMuhlGUiHIYD7GOPu6BA/9P7EeZyhtbYufWjtDnzNoRMiWsd9HN65i9++/gbrJ+dYoeunvkkkmGnN1Cr0pIOe+ojORgMff/4Zbt2+jbUXdhFcg6/UFzRyoZx7hQZ7DcTcUg06Ln3pNvHcKv3zXtUklOFROPO+hFGBEvpE3XTm6rQLK3VEGmsIlBgM/BM06jWMhkOMzwfChaDZ9ujEmZ8OzpCd9TEfnSHMxhCRCqvO6dKE6c9SC07C0MpiN6i0tYSFK40LsxAqXcAGj61m7y3Ljgoqrfp9gVQjcqJ8ypr6xbqP8nt5nYs2H5NuOifEr4miI5hDPm1g79p1rHY2GQlwfjEQSP1cEsU1K0DSzNL/zwNanTbmnRZmZFuIUJGchFzaKvhpYhy09POyLCftQyo/lZAEKUF1s4Dx8QCn9/YxfzxCMq1hs7GKRhbRGY8R9w9xeu9X1C76qIUZmmoJIiNQJHHFUn/kJ3jg5vuv49Mvv8D1V99A2thijEAJ1A1S9XeCYAGrCOTilFXQbPJ8pgx15iS82cgqL8yCfXKFPbPDoLkSHNbkiHVFePmlNV0GPdU0RGAaQlFLcKr1LZwORP42k0/NhojDPmZPHmNweISn+wcYPHyI0UkP+dk5/CRDKzp06kTkO2G+i1orRWdrE1sv7mL7BumxbwLtNkIUaCtx0dBpwiznvZv2HEZnQc4f55IEjCpPKa1ZOnInfdq87rWiGVx1/c91lDZPlqyKhX0o0V7PTyj++7X08yUkUlKxH3zuUCq2AAY7j8U9WQimVMbOk9MfI1Y6K7h6eQ8HBwd4cvyI/Y5mIr5HmeqxQ9RYmqTrPrnAdHaBTncNfqPLCZfhLON2APJZeGa8U0UY1XuHVgc12jR4PPO21OrMR1AQqnMVrzJ/rmqbzW8pg3+D9nMg4kv/QyZHwQtO9p0gLLyY+ygCiDWHZ6dPcOXKVVze2cEqSQt7zxwfj44O8PeDB4gk5+yg1XG3wGnCgyOC3GGO7sYGtm5cgWulLK/ZXmkjEESZ92pBeLrywhduL9mlnbVt7HX30PZthoyjkpAzJoDCphooWMdFCKb9p0f4o3cfWRxxIpWSm+TL17QwSY96I0mx0eji3Vduco++cDFB9yJ9LbTILC3H4s//OfRSqzS2VAToJpvY3L7EdrTfP8NofCGJmbm24zJviaACaIdhAnBoG5KirqgwkGaekyXvvPw2rq2/hDWswgXH81ZNXC3bp/J7998jKOa1TKItJMN5cSXoY4pDnOLOL9/h5/s/InMjuLoGx072QFozaSLPTqJzye3gpmqm5zMSY4eyL55JzA3SrpxkZO677TVc3t7VBECtQGQEtVO+uH67V7FoVSFK1aPBCY6f9Ri5EvWep17UbthG6h5tZJ0Cf0dRNOIqOiGPrbpO5OSKIBIOuXLW+Xq0KMH3j33zEuVToq2tSKjyr2yHpWWJ7Ym1FKjULM0t9+rPSeG1xc4R7W/EjzQZjzneYzULto0UY1MMnTIynRDynATQtlnzxfnZpgK08q3R+qT4lc5PHD2M1o4B/wAAAP//nF3PbxtFFP5m1vY2iZ3EaSmINEkTIi6tBAfUE5dW4sIJISGEkLjBjTMSJ/4hzqjiwIEDAqRUFSAOEYoQiZK0dQ2JnbX3J3pv3pudtUMErOSm8W5s73p25nvf+973otc+uvcFSbT1w7vsddvXCmj/e6AG2iojDgNZ3a8GdrSrzYC/zn7XdXf1ptlmIyUF9FCjP2f8ZZuSPZVViRkhGwp6OYqRrHkOPSd1xC7L2rzMBV3Q4VR/frgyAfpbHhR5s66Clx+Sx0tfc818c39/MgARE7IyeKhLtBowNILNgB0utdeuqCsiqdHIxSiwkvoz7UdJGzlAqsqgLpMwfoA64By+n2VDR2fy6G5Ela76cwzM1vi6Gxu8f32t3PnLADa1zM0RQy7zRICEMqhEpKiPQS1JEZYNhb9egKtJpf6gEYHcqsAkTzFKE65j7VyLRfLsWs5x7W0VkiuBvNnopFjDTFvvqseTMY0n/k+OQ7/Ly7Z/yrD646vmtO4XVF2aZktIJMj1UMjUxzfJhvq1GWhQjZMxOEeCo9Epjs+fYmymGOdjVFHJCzrMPJs7d1YziodGRlUMvMDlJtHcxKjmJMqoahlASzp56HgqxUOAx6ioYXTcGblXuBxFe6YGWxmwr+5SCaxlNUuFKGujPSrx88PvcPD9L2iR0jir5hZOXVYJ/MXLPbz9/ge4d/8BYgrmIyU9wJMp3aHPufb/L3xzvI+D5AzRwiKPVzpoubfEddqdP0cYfvsI+18+RPzbKVbykuuiK2azJY9t3Tu7pkkVB7jvvPcuPvz4E9zc2kHeIolq5BZGNUPj783JohWwmwDMX739uz7Bc8Pgkud0rgkD6UhJM6jZlJt7uRadCMeSmzozMdiyFZdK0N9k0xTJxcQRqO2IwXyHgAQDhwzTZITJ6Ax5eoEym6DDSgnxQSjVCBG+T0ADRPA/mo2qAUdzBNRKEC+9vOycpVwtZP19iZvcnjS+s2Atcb18bX2VTBmYOslYlDrilEkug+3buxifj7D34w+iVMmcs3kADIkcJHlqSgRut4eCL7IQM4XLZljpp03GnhUbilmRHbYdyCV2ZlLg+eEzHP96gOxwiCgBeu0lLKGFXlYgPzpi47/yyQna+QSxb94nxqE0bpkM4U632L2zjk8//wyvv/kA7aWXOPtvNKgUF/+K7yLx3RA1SzWXISTVnSPcrYnnypHcIVXj/7MlKmbmFyKHPAesiBnGl0EpOavhv95XLd+qlUxqC9gy4weSMYqzIcaDU4yfnHDwPx0MkI/OYNIplqidU2S5PdrKctcpCuMOFld76F5fw83tTbywfRvR9T7Q7bp7hsAjYQ5aBycpoW4OennpIk8kSrKUFATnMEXGKjYrJLvVdY/wT1FCIYix2pe9dMFp40rZoId9FQDay26C/0gAzGxzPu2VCX8E61+Y+YfPXIOwaDviEkI2nltawObGBg4O9vHs9Cnvp++qY62vWfe0BXm9GCcHztIESZait76OPO4gp/uh3fF0aSkBs9ZMR5LA0uVXzfDCGYWAOpFvNXlRf3zjz8Y0nrASmICxcSsgQow3K3YHOvymKg4luqimnzGesdjd2sKNeBHkPrMQd1hZ9dPeI0zGF94IjNGBTIz0OxGwnHrKK4ynCTbvvIJ4bZE9cJJ0WmdDBW/5by8gAEi9RZnyW/2XsdHfxIJdcHJpSb4hvB7N03cEpalwgQKHw2McDf9ARvikZYO6d3gCgNOOmcXdnbvod/rSJhcz4XAwGi8lAK7YZl6iuUq4HWvoore6zPPrYDBw+LyEO18Lz2hZSZZyIFeIdHBasunfqy/u4K037mOrt4FVrHD3AUpsaZJn/nOambX96jOpy071yrufaZUxDhwiwVePv8be748xiS6QRyniazFapAgjvCFEFMS3jfC94i+tUZ81atY3nk6m3j1f4xjjWCysLfZx68Y61uI+FW80Oi+pqgYhh2M02UM8VYnDsxMcDU45uVU58ziXLDKqaA9iGSHyPSlAio5OzHEJ+5SxGtuVvmuMpSZ/iklVIaD1+BR70vGqANcW6ZwQkLhMkwE6neprqGqd42zpDqBd7jS7T3GlSyiTiR8lsZ3Zodbxe5wbKBT05NSsXZP5TBBQ5wxOHFtUVYm/AQAA/+AG8s0AACAASURBVP+8nc9v3EQUx78zHu/a3vxoCmmqIlBVIlCrqqAWDgiQEOLMAYlbQRw49J/hyok/AqniWMoNkOBYpVSlVZqmKbRJ82uzu971GL0f47V3k6CiipGiHHbttT3jmXnvfd/7OPrg4OCAjULGbXAud1Eh/UTSXmgkW36QNt/03XHevnj3DEk1BwMptKDcTqPIJDTQcdMGPed/q9w4nL/NkfvmIk+GX+D2ByzfcY2un86VZR25Nl7cFI/ARSNsdU0hnkadz7gKJxKMUj04/FJTHnOW8TE5V1iO+IUolSIwmUcYHAng3P6YN4L1FuTQoeNEjlIqn79kqV+kKKOgxmYsBWEOez1WAEyqHmhAZ2mGfr/HUVcaBF6xifRsxRgbjlUUtb6oO2pCbmv983EqQaH95hr3w3klVIOBcRMREwCon6Kag0EGg+a0GK+VtoPEX/qGlQQs2cmxvrOKAbroFWdxauYUTiYnMGsTpKatEyqdS5wH1f6v1q+h+WCQB/tYdtoTLOTjDaKjckKnXsDQ/4fklR7XyqkFqnk9xeQGyTe/3TxYGMojehcxxI7v4t7TNTzafoRu0WdGOFX7f95rPKoZrYtQapXSQp2JIvWPKtRJ4/nwWJSJLdTSMN5XaUcS8ZfGjoDnkKFKjrSFiRx6gyEi7xATM/jxM9z//RbKPco1j6rI+GRBOV4g4XHu7Gt4+90rSAn9F0stCxfUFkZq6+8CWNlcx6OtJ5ybnyQtlXCKC6o9yjFc+wurN35GvrKKMzbmOgPCOy41v9mjFaUcoTFlDvKfvv/xe/j0889w+twyEKfC/eXFfKSR9ZFWxP9/W5NrrE7BWmZieKsq2joV9tNNpxR6g+QRskHThx8ORJLWbiF9eQkLhcUoesge8KI3YHRNywqRolBpL3GIt9fuIX4SYy/tIJs7gWR+AXEyhyiTiulwMyijFquGRE1lK32EdHfg8VuMwWq2UqHVcZCHNUIhFWZUMXdFJVZLLbOCcnSRmVj3imo+ZGZ+qNVQOlWhyUaYogDejpAsRLh67QvcubuCm9d/4GJUMW/Lx6PHMMcvx+DZNtzmDjrxAspYTTtPcIUhRpu7iLMEvh1j5KSOhTgEYo4EEX1h9/EWNu9tYLS2xUr8tJUipUgiRar2tpH/vYGDpxsc5dYYCEe6Sp2MaM4h9QotIwtnIlz9+ireuvwBgFkuqjYdT68FGdTxxTLOchoGFbuw3hRcE2eS/vNvrT5ubSmZpKHvjd6LV3gsNGecv2fCOJDUGnZS0PpM72O3j/7eLvJuD8PuPvJuF4P9A3iiQhRSETxxBj6ySKg+w0BoJPQGJyfnkVEqRpLCpilmFhdh5udkbA76wLCHQfcA+zu76NM+jfM3C37GLm5zEID6jtCOpbOIZzrQvCwpFhi1+L9ghEWhWBK7uyIoFXxL3kg6gWBtg0T8vzkHX0Sz1cZ/8hpqRfDgVTljUSYGbjZCZ9Hhjctn8eW1r/DdN99i6/66gPxUCdHYfZXC9ibnQJYX2Fp9gO7KbcTWorO0BO9jYX+b8c9W81vdQVHl1Iu1Js5s2peMxIFTMxYbGYqYsOGU6e90TyUscVSo5YaEOMxUqoILz4sDLMbh9p27uHthFcsX5tE2HvMvncD5Sxfx5qWL+PXHm4z3bJiPet5BPuTeJ8fI44cbWF/5E8un52ATD5dSPQAvpI0ipEDq8whkMHIsamos7/sirQlkOSTbvPdDGqcdlgXn+xMO2E/audp4H28lUJgjx60Hf2Dx/Gm0kVQqEvXzTjH4X1SjuS/l2avAK1jAh8vvIIkcbvz2E/PymQJgVSJeBiyq47mf3+ER4IZtvL50Dp9c+QivJmcwiw5X+7eY2JYe/rSO/KR6a8x4dR4fJVSLIY1V47CFHXz/y3XGG3btPlpzbS1gObaPDvsFtuGLEu001ZRjV2GXQ6Nxm3U6HMhMs5Rr+njFwB9fvvro9nwo1sObjPfpe6sTDOgv4NtF4TC2syS1VWzIsS1M+1WxZUjNzEp62rPouUiCHxD0RwUM63XtaC6gGh7BdqPj6rjaSXstYPTFxhFnYbCraX/N9jzPJaTGdjDG4B8AAAD//8xdS28cRRD+pmfGO+td1i8cEizLCQShxCAkiwgixAEhcYiEkBDijLiAhPgbnPkB/Akk7hw4AOJhI+xISCGxFWTZceLdeHdnZ2dnelBVd8302CYGlEP6sn7szs6juqur6qvvCyTQpzeRM6GNTOBkIT37AZEGpPdS4Gm+MOdA1ffNeyWAd0mTpFIvgaMcVwIl1p9XVdaE/k83VAjn3IDL9F9k5QVnNjgQUjoObO3fJElAN8NUC7MSpiLXZdAaqrzBniWzkwdmKvd5+d0iXedW5U1lx/TWhwzHqHTLPcvqSNdI50D3jWHQzvUImUP50O338TUyMWclpyGBu/RMG8RAlYkSA2KFAKpKqEoeQt6rfFUGVUy+5rn3xDwPISOkc/HDoBbUUpBGGuhiM1FYnb8JzgL+/HhclBOJMtKFp6xcDko0BsO0rYPnTJmFa8sgR6gCjdSfYK+3i8Goj6WFJVxcXMZCcw4dv4WW3zJOpzASh1NWXxtlMagOoT8eYD/Jw8CpzAlq5/xdh1YU9QXXO7ZoUz9dnOe4H3dxb3SI3d4eBlT1DzWjLKQeUnFt4MTxhAdACdFJ4S5CurQhQQC4+qNkT1I1CPwqC6yt7ZOjD62NlVUO59hC7qes/KagCsj+CqsX/KikAMM2aT4QbJgQAKMct377A/du76IxNvrGJRzulM/SnL52/XU8u7LMGWexJkk00Z3pQuMOetiOu0i0ZuJQ6qXuD4doBAoBwX0fxrj1wzp661voDEasU0zBRao9hq+ZCkHBygLkRGgWrF5ZwY3338XL19aY7ApMrWYDEtFI99wAVZeJhP9b2ccxB3u2k65X6Gwjhm1VAXQyttKG2gS99Hdtq/OUKBrGQJYyAoCvSBesmtA+9zRLXu1v7yAZDuHrkVHfaEcmoKH1vpgwQVKephiN9pEcPQD2AkzPzKM9s4iw2YHfmoXfmDbC82qKAyLSUYaVqStqCUBV12/26r7qtJFp4wuYuFXgeMeGbOq1MzfcpJtw3phf7I7XVmBTxLxpJDWVZ1bO4dPPP8Pd23ewvbnBAZskAEL73AhRFVJyeO8A7XYTKZHu2nWYYr1kkAC9GFkjMOSWRYZG0ySFlQ4w6PZx/89dJH91gf4ErWiWibXCNEMjTjHeuYt0fxdB0mdlBt/CkapATTGqhebVzIKP9z78AG++cwN+ZxEIn7JA85wTHoqB9BOn6pPVbNeFU7pjwvw4AbdHHF///vMo549yNMqrZ1Oba0Vm9T4TYDxEnqQ42nuASZywpBy9El1WTjxEGpgmnoUApi3SVt1NwsVnCCftBVpREz4ljaKIsv/wohD9Xpf1zh8eHWI8OGISzHE8Qj5OUIwnyBL62VSoiJBLkSIJyWCFAVrtNqZaTbRnOqwP35iehpoiFZImwqkIASFsSEs0iASGw4kfalFh+1cmGaC9zCbBqv5Tl5vlSRkks5sVY+ZQCdtTCMcevETjhVdexEeffIyvvvgSkyPiNc//cSULC9OzPhomOPx1HednZhG1OhgxjFVxfzE9QO2dAMAZG7GBP/Nt2H0ws4oLlP9fxivGZ3qlTbtIVRkln462qEneIGheY6mY0ghorfO4V/6nzZtYvbCE9tw85ptNPHflKtauv4abG79gcNA1kGbnuHItk8K0ZtDU3Pr+Z1x86TKipQ5GuWcxOl7ZXkiEpVxYURVKRC43tDEDasKlZ98DrriSD8yMytWkmHB6jiuXgV+zQWpszEKF37e3cPXSKuaiDkPA1elS7I93UHGFgiryV9ziMI83Lr3KtvTtxnc4TA9NO1TD7Ke5qUv7jJAgN61ShefPX8bba29huXkBbUQItFfa0+MaVSus3DPxLRoH6OHrH7/B5s4mYm8IP1L8LKNGC3F/CIRZafOUnKkSsPZY5ENsfDNhhbY6ySoH0L4hWBeSdI4J85Prtj6B1zrDVh6dSnJeT9qexE90fuS3RZJduHtM8dnEUKftL11uOvbtuUGBl/37FunM85STJea6C+aeMzbscu6xxHqWI80p/jafZTJ7Jx4Usnj5v1G9ImK/iryQ0Q/0nVT05cIvtfOLup5BgEmB1vcD/A0AAP//pF1LbyNFEP66PR5HtmPHdl7rTcJmzysu3LgisRek5cCFx2XP/C5OHBA3zjyEuCwSi4SQFgib2HESr+NnbI9nelBVdc/DSwIIr6JMNoo9M93TXfXV933FEgDP6gC5xZ4SCrlLoEl7wzR6S+GWL2mfQrptBwykcoBC5lhzkJeVGKw7dTuKRhY8gEVipF8vkpuVVMmpbYM1R3BAQXZgspVmn537o1R3YfUosIFXdiIKYCH3gdv5UfXd0jel732q1afroHNgrbuJRMdsB4H+VpwfbSLOAxfwhk8Ty5mVJbqZTILvfBd00jM/7W2Znbxp9SjOUfAdZU9M+gwjUfKzZ+kjKjcWjsbjzsHJLxIa2hpgQe+RHV8Cvwuu7R3TSYk+E/JnV6ub7PquM2Rk52hJb+GX/MRAw10XVU7FG0Fz65fYCIqqSKtnVuz2OZiPMFpOcb0cYqFXrGEHzxcbsCRUUgFoRINlH0QbYCaUJj6xME/Ty43JuimUyo3Ba54Ar/2/uvtfZuz+jn6vM3JLrvTZIJRdPanypkyOl0bXzF4KWmEeLzAzS3RGF3g5OMPpoItlIYApRuy8HlqDzwQkSgCA9EOzz5LTUbn7wSBfzt02/Run9VLOVdWCf9ljp8eS59/wBpJLPVnSY1tSclVBJ+fjgDPnhM761jiN0IxrxcmLKC2mPsqhh7g3xbOvvsXs5BJ+mKUKpi+PUeAiJ/zbDw7w5OMPcfzoEfxKlSvRnoWVmMEHhR4Uvpme4PvTF5j7Gn6lLBXX5QrtVhOVaYD4xxd4/tmXqHYGqC8jlAm4i431M3cVcTmTGxOiXgc+evoJ3n3/CWp7baBYTvo+pX3+V/bYjUlaYUkpiu7rtgAsw/D5l0Eag6EWxOFuK8QmIvYCsx1CaBMgmE+wGl8DoxHC/hWW168QDgeY9br8PRhcYXHVw2I0wHI2hgrJBwagWEkYVSG3CKX1g65jPp7x5kVVC0W0OFpHCR2PBIBizRwlpOQnMhvi5voS8/EVbsY9zGdX0MEUcXgDaZ0rYES4CmSd0UWu0iePErMqlhxcrgf8Ts52a+yh8msA7SEMcltpXNbEdsUtXm3e6Rb4OH2WmB2lpOUVGQJScrC/d4Dd1i6bAk7GE7vuws4iqrx7Uum1UZ6ixNDKw+hafC3JqKHqP4s6rVtwGCOaLjD4o4dpdwBcL7ER+/BjD2VTQI28Yy77mPz6C8xFD3oxRpEKA9ZdOeagxoMXi3khXdM7772ND55+invHb0L5NelfT2s1AstgiTKgVZyjeduVxEoc0taqvJfdxVhaG7DbQkpty4SpFtmtcRui8KeAjk2YSY5AlN4VzPgay4tzTLqnGL08xaRzhuCiz5p+M5vCi1bYKPh8j30bDGods7llgSjqRZ9NGP1qBeV6DdXNKu/BTPMsFTi5EQBfYdMroVmpodnaQWOrhUajie1GC3vbTew0Gmi329iq1dFoNVGv1VCrVNgYkzyXzHyBxXCESf8SI/Ig6J9jzMfniKYjrCZDFIMpdLRgUCGyzEhwwSNgeCZSci8Nmw2qW5P/u7sk4J+pyetLzmsdS+56f9EBswEd7yMxvA0Ch+cs99ptbOONnTZ+fvYTMy5gC0xZrE1bmRh7bxDj5GbJrA5iAOhymTsCGGsQ6RQprqJf0M5bSbwLmPJvTZEpZua9kXyWIpOwXhImc3IFKSVAWbG/8wDIurckbbrt753ci9kySrwttARYWMxn8GIPo1d9HN1r4+H9I5bklFSMjaLC2cnv6Px2Qo1AIARby9yzpoIJy0DHmN/McHh8iI1WAwGxmKy/lWfND+NcOzrF7SvNKkLJ83G8f4Td8h5Tu+PYZPaaXDCbux+KYxzDe2Bn0EN31EWoxA+ENNmiPBDQU7xTYqYazRcLdHvnODw4xJa3Cbg1Yr2g8V8lAHe9aC6QR5bSiceEjyIeNA9Qr1dwftbBcDaB8TSWNB9KJWuqrVAIFe7XD/D4rcd4WD1CDWWUWMDgiwzyf2IA6Y5vkp/db+bMWQCGmOLzH77A18+/Q1gKUNykDVjA3CgSHbr4d8VJDidJpTONF28AAWxEh+6Ks+LRAi4guhfHbTZPYD84o3GvuY/D1gGaxQbzHlwMngh93HxM9lTAiRnoqfpz2EGn30No98qCkoeHi8dkocjrcEHa0dpOHdKZSuajaPLFo4oKvq5omQD1mfh2PemX47SglZqgSyE621HPScbdZ2UL4hRrOtN2ZqVncsFKtcJaf3q/crmcnIMUmtNchLvfuS4ABLBkCmrOCJFbWdrPJvPDgtL4CwAA///MXUuLHUUU/vrdfV+ZicOEgCROIoLRaJDoYoQQCCKKGwm48Gfp2k1+gWQjLrLToKIiboZIyBCCE53Hnbl37u1ndZWcU1XdfW9CiDEEG4bMTG739KOq+pzzfef7mAEgGoq6roQwdd8kiBW9+PjiNPLMtB434QU1iharQXRyXDkRFmH2WQxFdGjv3YRbU9CNb72pgEjjJMDIoec1vvYW5ccSTYJQdVbMD9reCHtTYFoA2N+RHpqxqkODuihYfUHbc9+info4dB7dc7a9Lrrvk/QANOVjNBo1VSRp+5tVxfuyI4ChkWRpaihRToNedhH0mukZ+rNUMfPMdeiBsUgB0VUlzWCgais7IPh+Ixio0dm2qNAOFq8NTF3d4mGRd8uWqCpt8bhMsKT73GggGCEeblXwTFBbabHIOIm5DeFxW1fU0Vas7Pih/VsFea2USYqrhKSIQD+Pg3TMX4Owh73jfaz0TuBkf4hh0MMg6KHnRkzFCt2IF19K2gIj+cT1aqX95l0j6mELQt1J3v77YmmQokN51zRPU2AzFVLFxHEbMivkHEwvIti5yqEqhbTKcHfnPo6qOdJKo/5gqz+58HZxjNUIlhY5/lkuXr/qKJLyHDA06sXPPOqrbY/D/UjmeyrORFE7nnzDvunu58C6Z1D1XIuZMPtEalZSXpWP/G2rB0L06SCI2QO9mBRQ8xp7dx9gvL2DOteJhVyihNhwhpVTPQcXL7+DVy9ewGD1BCcwTaJuktEDAA8wxR8Hf2FGdL8ohigEJ0OrUQ9BWiEez7F16zb8+7sYZAI9spKS0vh4a/TGPmNSxok88vu/gisfXcOpV84CXmyefm2cIWSHntuFOp7PWF0s0D4u6HcQOPoFT5ZlAc39WqBOZ5Bliul4jDydYD6eQB1nqOcZV64pUKV1MjRrBSUrtC+1Sah+zL3NglrOKLCS+l6vDFcQSw9BrnA0HiMJQniRw/9Pn/ODgRazI/E5wvlEqtsk6PmJDPODQ2Aa4nh3B8qLkZxYw8raKWYIhISWIdFtRypEWZJKfgyjn6nnnOnvtVsjlLtULFmeN5271bSq0di3wj9M7wsi1LJacqKxiqxuq/FgDA8pMIv7Aa58cBUf/3odX335BYulDozzjqoEY+oUIHtUlJml8Gc91v9gJhYtKJWEzCs48xJIMpS+QJLEyKYFDnePkI1zRv57XoyYGg2CCEFWQx0coni4g/zvXYTUWuZ03BcUGtaRj5r7/i9cOo0Pr3+KjTcvAckqlBPodcei6c14rZuV7XmN36faVKv7sxBp13NupQisXpFIUY33cXx4gHxyhGwyhsqJAaCZLdq9wodHdsVW3KrjhBTZ1kkqOPuebpegADWXSFWFKif0WiJTAhWjMyHTRvskNOqHkBQDeS5CP0LQDxE6Q4heBlVXSPp9PlcK1lmQuCi4iEpjq2Ikq2SrLNbZIVG7Isfe9IhpoPv0kPwAg5V1IIyRjFYRDVfgDYbwkgR+HOpkU7Vj/f/HANC+KdIwODgJ8xIMT57EbPonZKBwafNdfPJwDzdu3NCMxk6Hg2v885m3WJPFpcOCrIf3thGdOYs+CSu/NGJrYsOa/td0cp6XrvPMQ9smCMwwpXenKebVNu12deLvKTOzipLHkKglpnmJX+5s4a3z5zAarSFJQrx8fgOXN9/DnZ9/wmw/NSuZemwqTMcUE2Drx9+w+fp5BLEPQVplrmk5gp5HpL1il0hnaRZz3Pof0HgqkpJAMWkAkLhiUWbNdTOL1BVal8uVuLe/jZvf3cTn1z7DOla58EYJufMCaJ+ucXTR+ichLp5+DdnbGb7+4RvMsgIyEJzIlXmBkZ9gY30DV994H+eGZwztH4+cp73Hz9qg6S48C7d5p+nkf4Jvf7+F77duQ/RLeEkEvxeiFEWL+POrpNVvetLWxnkmQUW9gJzb3/P5KK335Knl/FELsT596xEVfkoURYXKlyyEyet2LZqCWhtPW22qJx9Re/vrrIdyXkLPGUi1rOkGPO7ESAR8EEPItuVwyweJXhtma4cRYQFz6zRHG63ZzNo2aL+1PLf7szi2UppB7hMAa4oTSw55nOzTsXzS9PH4+yQZmOuid4BgQIxBXPp7ssY/AAAA//+8XctvG0UY/83s0xvHzoOECKqqUhX1fYADlRBSJS4cEEgcACFOcOCfQxxQEacWBIeqF9QK0YZSRFJIedRtHht7vWvvzqDvm5n12g1QNSojRbEUZz3endf3fb+Hb5Thx1Oifk4DwF3YWDFVPAlJL4CCRNQ2XoaTT3+nIJQDZuXg6KbSSgPfcc1NRXoS3DUhTQaCbxISlO0zKveitkxwg6ypJWB4wXKKXtBsRCcwVgoV0jRleK5DBNAgDOwNZU4e3SSiQliOP2sGkOVeFJm+Ng6Czk7PKIy3TNW/IRzoWVsI10/3EF3w76A0ZVXV911NwaxN0B7YAJCu5TI5s43uO8NvhKwTJVU5UZ10FAf327kTwC7QlLcIQ1HzTLSmBMThk9AhNThTpqfjD22REYU2iAMTPM/2txm8qFrjwS3oZFthhC2MIrryAjMhhESkSlRks0VVcE9jWKXY3t1Hb5+cEUJ0Wx10k3nEfoxWlDB/pk3K1SJEy4+5MkN4BKpS+fQdhdVIbyak62fsEkn/sWK4/4Pj5h2Nn2RcFSZtjAl3sWJjKQuVttwzqg3mGCIbDXm80njv9/v8Os1SFLQweiVkILhC6luvYvYdr/lh+tBKjhMYcWOSk2NCN/jNouYro5G1pPdToou4X016i3tPZd1ATOA/od/MZlrd/TRBvVVptXP8sLkOmxl1iyGNc16vSC9C+/CGQ2ze/BG9ezvgkFp4jwmJCTiVVo2VF9Zw6qULWDlxzMxntkrzGd5L+1TBGylwJ3uAbYLrQqFFaw1VS6XAQhBjqVLo/XAHW99cR2e3j3ikjTOBDZ68eoYYHjXNg+Pra3j7vXdw8vwZwEsYLM3ZalFOH9Pqc9v/FzgJp5hPlBta80sFNUix3/sT/d5DpL2/0H/UgywLRNLHeGAO57TekVOJZxXoucpV+mhFdLgtuBpPQZEg4URhueBKMvzTG2tO7g3Gu9i6sYGo00b32PNorywzfJquLQlGTfdHxpBUsaVKs1CY8+16T3DS0QB5PsD9P37hoDzuLGLp+DqC+VWIeAUR+RwTd49494JVHmy67enbrL4GjeW8IK0djw9blKBuJkDthDI8c426ysfPv6qQj1PMLyd496MPceun27hx9QqjJVgI15MG6kzzmjRksgHCnQhzUYR+6PEhibffymgvVAdAGZbI9vYgMoWSAoK0ROLPsXirr7l2B68YQOzu4ODer1CDAyNQqc1xR+mAzfw8uyqFgcbqsS4++ORjvHzpdWBunnAUDSs2lsKaoq3oo0QIT9mUJQi7T+YgUBvEI1eIij7fv8GDbQx3e0j39lGNCwRaMsxfEu/e0poCGRr3BOZ7evxDiCNKeKkiwygrkGUD5MQzf7SLg0GGnb0U6aCPdDTESFUYUvKGklbKQxIl6JJdaCuGDn0EcYCkFSGIJBY6MeJWiM58CyuLz/H+RvsZa40EJWKy61IGSkrrWIs0SsoC43zIYpmSP2PEVnE0BnYe3gVkAC9pQc61sXr8BMIFSgZ0UfkRUxLgP9ke6J7nNPz2GTdtHHeUpfKQS8Rc4mGh20ea76AaSVx68w38vvcQX17+orb1rGH5FgXgcfLKwwhjhFmOvZvfY21xCcF8wsJ80nL5m8cFJR4XMWwi5mBplkaj6OnGuKG+jS0kWdUIW2kFeydXNfNxrOzZzKezr8LG1ibubv+Gk6e7yMsKi2urOH3+HM5eOIPrX39nKB/KuW00KvT2vsQC2Lz1M87df4B2+0Vj8iOtRoYo7bz/l/4fcQzQ2bvQNJbHNe2U9kgujJHvvlIofcnFNkoW3OrdxqfXPsP7r76FRbTho8tku2fWdHMfdgmQEgtyCRdPvYKk3cHn1y5jc7jNSAYqYqwtLuO1sxdxemEdHSZYWfvfBn3CPdcn7fmEgPX4E3BNW00jQgB8tfEtrty4ijzK0F5OWCOUzo51Zdv2gEIYCk5Jj8FV9Q/75KaYOOw5jPYj4RKpdrz6wgbXXBg2BdOjJBWlEyEMJJ8taI2W7pq1R7aaev8/oyFp7hAKyvSLXjsxQBf483edOe/O9scV1CYo10lsPdtccqBGdDdiTD4r5Hkdlz2JVhddj6kWFuluNAzM/xGikjXBiGpACMsgxN8AAAD//7Rd227cRBj+7LHjPWRz2JBuUAK0lAKiAlqEChLXULUCUS76Aogb3oS3QTwAggugElJLKSgISlCP2USbTbInH9aeMfr/mXHsTdVy9EU3aaKNPbMez//934Fn22psLe1f0wl0F57c12mDNTX6xXkydDBFIMVy0MJEPyekWqMP3pGGyVQYNNm0EFodOgxKkpv8Q3qPMAo1tV+Ioth2TZHg2SgoLy8GVgAAIABJREFUa8BgXJfpPX3TNbTna6kbhSEeaSZ8XexT8W+1U+UOb3lChXkf2vDTANkBZL/fkt6ZqczmOixQQOgxna8FTzzv+IeG6f3QWo5jkyf0WLO+2QAi1mzPMYYO+hyMs7Wjx0Rm8qiTn0kEblBoTohWSAW+PR97PdatP4oyA+S4jL7JqdbKkSu0MN1OQrNgko7SWGuyfWEBjFSj78rQ06gocH3U/Bp3X2G0+boQVMeQ5qMbQ7+KksbIYYTXgEVKFXT5ek13k8aTMVocf5ghSaecgdub7POGjM/R9TEfLHDx3/C1kRUVJXVvDg0yUPIC1Nm0y2p/Xb4uvv5iI6OfeMJxSpr8km9CUfij8mqPshq72DjMdsyLVxtFporfG6ch0zFpeAkJ39vv8yLOzBpHYpSMEE914U/UR2mKHbqnKNufqL60dgVMD9Jm0LMLhj0JxzgiV+dHFjFBlMowe4EViYAxkKLPGIGEGWuUZlBtYw7I8U3sumpSL4RrZDflBVBVKHuaIZIWJpRlVNqCCJrpaaUVgnXK8ThEAy2MugM83NxCTYE7yXlaNiUykhfhI5Jk7hng6ZPP48zZc/CCFlzHZ02vo2y/klO+sYMJftm9h0RoTqkiVoMrUPcEmjJHcvse7n59De7eIZYkgViafg7jYmsRfsd8LQVw8cOLeO2tCwiai1z8K+NGXwBnOSogWhUA+HsbLrtBM5BtZSxRMuPSXXIzWGmGaRwiTxIMul0cdrfR6z5EPBgwFXqpXocgbbnnYL5W56KGdMeBT/9PRWWgO6EqRTIkT5kEE5nwvU5jklE3lKjM1BKVDrJwys+W7fsPcPvX3xDLFMsba3j2xdPobKxjZWUFqwwG0HOrxnFprjuHTMWYC5pc7GQueUDE7BZOyQFZMsR4b4xROIRotrHYfg4rnVMQQQtSUtGjSecwEWz2yDLrWXIc2AJw7EHPvirplLv9mQGN67W69mxRWeHhYucyz48YAHSz0jOBbQvNnLN+3hM4+fIGPvn0Y3y2dQfd37cwlSGDThzll2t3fQYBBhN4rRb8mmDTv4SiVJs1qCSDGmXw6w1EcR954gIhEOQ+GvkcG2YSSOaPJ3B6+5B7PajBATyVsLmVZ1MwCrK+4Sc1gEtX38c7715GfWW95JqRFZ1+t7DdlJVV8Z98fh93qIrFY/l9y+u3/ttc/Cs9JwgnGO12MdjtIu7vwk11l5FMzARHKRkPCnLoYQaAfm5Q55VYJOMwwmDUQxhG6O3s4qDfw/3tLvb7h+j3DzAehxgORxhFGeEt3Pk3SU7FaFUKAVenKdAjd3nZweJiC+2VJZw+eQqnNl7A2uoaOp0TrPtfai+zLtsl5/U5zaakTXHqkddGCplG5AbJ7BtijFAhycDxmEwGh9ieHKLZXsXCU2uYX+0AsgGPqKeUtlQYZ7ols93caJZLa1AOYyb4/x+6i3/U7WTVl+Njsd1GNIyQjiPU2g1c+ugyujsPcOv7m0UcYPlJ55oOacMJkKgU0+4OetdvYKHTRp2iScns06tu+O0S4JpGgvYAyB+xBhiG3WO8RIq19REHNVPsc9K+H0pfF6o9Y94Ho/8l2WR3NMS3P/2Ic+sbHJNYEw7OvPoKzp5/Az//sInwIObx4Jhnugb3qAjlYkEByRC4c2sT558hoFQgpb0uoeAm5o4NFm0BzGZ30Ln/+b8t/w192tGFFIOmacj3m3bX12H/tEZ6noOpLxE6EW78cR01L8eVCx8QHMSJCDameDZT4r8+dN6NzghZwDzeXH8dC+818fk3X+BO7x46qydw5e3LeCmgnP95HYaqqcDFmVVbUHjkd3/lKO87JTeTqPhP8N3da/jq5pfIW5ITd5Sr4LlzXK8V3X9zLjT/VotO3iWPO8ry61kpduFbpmwWv8PeXZbpV5jtPqn7X2II0L9hEiKSMfLMNcW9bqI4wpi9m6uxP3vS+eti25pwVuu9cv1nZdyz2AVLuKh64GamNoy1nmqWcW1p/rYmpr06exFQ85vj+XRdTGNFzV1usCvJ8+D4JmltxkNBe+BpGYJlCiUx1c66lud9s/B4H0XjLqQLpRT+JOxqeuOosuipj66qbndjxwnkA5wA8gBKGAmQCBJIs2AWsEBC86FhF82S/8KCJfwJ1uyQ0AiEQDOARhpNIkJEQidO3HbcdldXdVe9V+jc+151tw2kNnbLiV313qv37r3nnnNiz/n2SeFxT2OdMCtJlTygtLxrIsYkz5vnk7cWZ5nc5LJKPw8fHgax896Hs+oT1J0Id5TAVhZplGqSWauSohQVyMGHV47W/ZPqhXOjWgWsrMZeIX9uJFgUbhbtFJz1AVvvW4cDh5R7izEe4EJTcGr+XmAhcCr0qu7YOeE64Asc1h9+boHDceatQ/UloTFGuBtxksp4TiZHrRgax6NuW/OXhIeIKnifSlqU+YTfLWb+ea+/EATRUoWpEc0DvT3lwtQzFaSgFUcTq10TW5TVoqkjrYJBJ4IpmbhHjtdrRTWb4iYybuREE90INbEsi7Ktquq9OY2CRhFVerVmna5U+7QSpji2F4YUXpFPdcPGicWp3oIPSORQDyMJrKxbg2xro2CVvBzUGOgOhPvFe2G7DDNchqLTeoapWI/E2J8eynwN1vpq1cO5JRczCGX9nupvIglYsEhkjWdBhF6SIo3VPSEOEqfdGolYUC/uahGH6wodbblduZbantx2XgquoAWFuaD2RnmW4obdka8Tc4TDyRGmZenWBROhCtM6l+85dgVtoCiAV2mhTdq1XLFMxoRcOXJOezGVjeQ5azNXak0EFGXVWkD6vbBqNBn3iUpnuUeKG23YyO+QjyfOII1aWkfDRjcviol6ZdSqmjmtCeUFi6+p6IAYaf8X7QxX1OPayieTVndC5h2Ns6sMtWXJbZriy4xmhUJjaiuJu95MLDkHhbrWghRZAXz/3XUc3R2j18RCkWifQpJbV6CjkFKSIkj7eOnVN7C9/RKydEPW98zMpQ3ROoLeGDVuFg+wU0yEg9bvrUk0ykLTIO0hvP8Qu19/i90vvsFgMhdqSrhkc2OdTZ635qIu19U3/4i33n0bp89fRIB1ZwkIeAsy+gctaBcnUaVFB8qyLgN+Gxtog1j/Gx2/31Ra5GOAXc+VY8tzjArne3sY79zD/vAOytE+bFEgMhYb3Lc2NtDvZfJQ3e4aDbhkz2Zlg110ddVgbzTC3ugAh+OJJEZ5UeBwOkFeFkLpmNfqJkMtkWmey7vO9T2Z5KIMT2Xu+X+HMJ/+G5ubKS5euoDLl1/AU5eexNbF8zh77jSyLgu4awhYXEYJNtawQBaS+Bp10E+IeExRVyXMwT2Mc7a/30H/zBZ6G2eRDc6g4ksTZILu2lYg1YtQabBijs9BsIoQ0GaOaLDw2dnN5HfxIHQ0M9sWBrhP12a5sKOWWu5N1WA3tKirXPbdV16+gn/8/Z/46IMPVVs/yFGJgrZzMGgqxKTzHUyQdSPJLoMkQF2UyKJMtuuwDHBoK5RTFnh13aYsoNLKKy+xXlaoxkfYvXUL9mhPFMVjEU7z2vlVyze1CfD6O3/Cn9/7Gx7beg42GMiKiptqSWzPLjkrVE713ywsWn81APztwO0kerTYvwKszo9gxY0WddgCGcq7VWvSz3GfHqHYGWKyv4t8fwRTFMhsIGcB3RSEVcozKk7ErSJlgTlMYIsZ9nbHODg4xO3hLoajEW7eHuLWcAfD+yOMj3LkhW+N/fUn84XA40JzPqkVUKqifmMDDA/R4BCf/es2YnxOnTqce+IUtraexOUrL+DCuTN4+plLOPP4BjYfG6CXxcjSgbQh13GKcjZFlDZCP6AWA8/joGJQWMDMJyju5zAHu5jt3cX6UxeB9U1E6xviHmAT1fQJHbKm429a+1eJB1qf/FCSi9+7HtVSf9IHYvVqfE3C6UWQt25lLx3g8QsXMDY7KEYPcX7rNK5dew8f7+zg7k872sZu1B1A58W2xfce9ZftDA9/voX6xg2cPXUVdwmeWO0a5N7mAQPfSbK6Rj2opAVq6kBYAYjMgu7ZJlr+3PEE9aAtauj/7bSc5Bb8cirfQiuBCio3LoGMrFI7JW5il2QH+N+DO7j+4Gc88Ydt4e6nm6fx7CtXcemLb3H9q+/ElLOKgNxUJ/RNGFbFFrj3/5u48trLSNZT2MigIqJLcNAuRIeFsijFIYNu1MNap7uyyoPg+DjhkRh3EChnWwS5zdw5YNVtvpIEmeQMjMlIt2HsQLHoL3/8RtxO/vLiX0FvAKFMEIh0CHSrk/yI9ffIQkGAY0LNmv43bkXyvH9+/Wm8/+Y13PjhB2xvb2OQEI7ou8Q3PCa0HzoAyn9aPQ9WrxCrx/0ytLTwsykbFdumM8HXw//gk88/QR4dIOowpo0oJYQgaqSwwo7hmi5oRu2ZiRrzs/zMdf9hqdBtvFWea/PX3CFQUVJou78W6FbFGyVXsyHWs57E3CGcJXL7Xtilp3d9qs7K0LjdskaFSV0g5tmWsENzJnpeBEFJp+hkKcxc35ukl0pxVpH84zQDFf6TYVwqYPDKCKQ5bTweEa3dYYvYL7QJGMsJal8wTliQpxnHMOeVrjBPUW+BN+psKCjLf6daQcxHSSNTwNjnnfxeRfkXVAEuHqET8j7F/a3fUuQHPY1VOW8E76Z5ofdFgDbrYDab4RcAAAD//8Rda28UVRh+zszs7G730gtdIJTWIgqLcvmi+FFjiInRGOMf4If5kc8m/AATE4waEzQYIRhTCkiBLmy7dHd2tjtX877nvLOnQ8MHIXGSpmna7p6Zfc/Me3kunhSPtjiRCAJ6nq3OrQzkPS4m7kpMUCHnkhfFMgz8njiewtsVfQDh4c+6KDNRO9d4KiaGhpBargE8ASQ1byMAlrCvvFfwxlnVUCwRsqwo1MVpIDUq4mnJiUA+FHtinxrIcULcVVOwU4NARPDsQHAKiIzDqv3y2uJMIOdGHA6xdJFgk9cW2gDxoqVBwImcrdJvPPC5M1TR9n8seCG6BSWCix2otlIkzM3YYauWuravmmtwUUTKynGUassK6hKliqHSbJKmKkhjEmRTSMyyhKLA759p1VqC4BMvkj0ns1gL7LgmOSjdxyjQ6TMVGzhJ2CjRZs0GmvJmxqeep9D6nHQhlrE6NgqNBCAm8ZLajF6RGjnYcT4xSr0ZotGAYyvZS9AeD+Cms4d6p73ADQ9qGNAXvQ/RBSq5Bz930VYJ5twGqvB5IpIWNlKw5lr6JBP+bcrvvTsaYDDcg+N7mCQxwumYJ/eZ4dETDzTOIi6GqHtJ+4AuVxgFqNZ9bnToGFU8/SeLxYisVXxjceZplVBFnX/KwdxMJ/jkP883v0j70mflhsUsVuzv5gdT9B/+GOQbUKYKOL7sIw0lcw16xy3sRGHoKq5RhBUkTkFRyfMDysE6ng/R37AENF/WbMiNR7jDsEESmqkmDoInAzz68x7SMObGDT/oSMU4L6XkWY4wifD+xS4uXP4IzYUjPFl1jC84x6CjqRkBFB4Fe+jvjxHXHO2hTLGSOmgpB9HOLjZu/Aynt4N6QmuPDcrDxIiZoHiuTp7aiz4+vvIJVk+vw/Vq2ke4lF7moosAG73w345MJqNKkl+5Z+TwPVdPk7KEH8xZECAaDbGz9Q9PRoPnz+AkMeagKVK0n2gvEoeeaVvKZf7Zi8EIkyDCi2GI7ad9PN7q4WnvOR4+2MLT3g7C/Yhh94kFBC/Wwur2+myFTORZ90+6dtv9KXr9+7j5231GuLy1Po9u9wwuXDqHtfU1tDtLaLQbSFzd+FOEBCABPKSo+i58FXGcxFHI+3E46KPW7mCps4r5zkmo2qJucCsdi6lRaaZmqCo1/0Q0SPa/q5yZg7w8c0S9W+CLroUeKGSbUoM8mHkW66IiZS0MiiMikSwttfHF11/h7q07+PH76winoyIgZEaiqOgYh1CjCtO8iFJFrgn5VDHdKJlErATm5VUot6odG8iZIwZq1Fzd3cO014MzCeHTgMBKnKTwVyZjvfThe/jm6lWcunAJym1yolbJtWWlFP/cJLSaAboh8CpY5uvM6myOuEYzafcRpddEidIkpC4hpju7HNvpeA+IJnCnuqlFtpw0yaRBAzWJCclCqAmKyUkwweb2Yzx68AQbG5u49/Ax/tq4j51hgOdBbqZurwKciuik/soOmQTnpcadQK4L+zXiwWYZNrcHeLg9wC83b/M+6Rydw9rqCi52uzjXfQdHjy3jeGcZ8wsttBpHuPlF6uQ8yU1qcKouqqmPiNwNSC9gtIcX4ZjRC3PLx9E+uYb5YyuoeFWzSBpEeIw2UC8l1P/fIRQl0mEg+HWyECDaHyGPM5w+ewqff/kZrn17DcF+XmoVzconyh7qhBwLQ/R/v4XWiRW0Tr+N1K8gzA5SVg7odxQWYQatVTS1TA5okAJK6AOlwOAhl5I9ddD9ys4jpcnoGP/+XIqjHEbsi/b9FJ6rHYB6wwC//n0XZ1ZOYKGxCLfpYPXdszj/wWVs3rwDZfSfilrSTgFSoFkHdrf6GD55hs7qEW4KRI7k2AqGKagFu8UiMNEn+ebY99Z9xxZdzszQj20uc0ak1hdq2I9i3PjjJ8xjEVfOf4p5tOB7Tkn/4U2vbHZIEU8DHhL3a9RrONZdZmoV/0+urZLLIluvw/eX1WSlV6H0lpB1t5/dxXc/XMfYGyP1tWzsXL3FnyFNlCPynXecA/Ro2yacao4yclm7m4VoNpuFiDxsxHNR52bcyHSgX5cHtmyjq80RNdUzPeQKzIp/lCi2ZG1NufCUKE/jEO1mA9NgylNv2sRRRPWnppLr5n3lUPcB4eVTHSXnoK36NKeenhmM8iILaEY5z1Dj9iF7VFDpUv9lkR7QyXWxddjKlGF2PiOUjeHyU7NLaAi8fm4CaMiTaMD5jDzTfyN6WnztHb0/5aD6mOoNajCwjpVS+BcAAP//xF3bTxxVGP/NmZm9L9RtizS0GIj0hmhNX7SpMb5rYkx88X/0yZe+tYnGmGLSNK2YSt3CStZlF8qy7GV2rub7zjlzg6ylPjhJkwYWmDlzLt/ld7F0Jc3IWRMlSo/hmRyGPG9XX/rB+Xco6wH6rK068rZlZRJg/TfS3BGdZNP/dbIvk2Ej5nxwUkhCBoGkEEj4rx8PLHUSa/X6KfEKW3noB1olXBU08pxiLWRIiYvuSAZKzTFdKKHL9VyV8PjxWEm4S4hqpcI8ZP35LGQ6542vkhytRSCrSNnPQ20e/JxhdAoijRRCQR8i2hoQquNIkCmqGrmjKdsDkS0WMZNJJMrzqbASSnV/EugySvANk61VGCFSKMIiUS7m5mdFgYQZcs2T3p/kEuWhySLvxKt8/2WiabD9SFmq+KbejVDKt0wPiIwYpq75Ndk5mVXq1w4XWn2Tgn8SD5yMRowacLwR/z7ibdN86LuHEhpjCOlYISLWEqgWaigbJVxrXMPVd66iIWySD1MLOIg7uhSwTeFjQiiEYIyuc4ChN+Hkn/5NfEd6v6thC9Q6Y0i8LTA1FQqlIIsaFnutTlApmbKrblXYmorXGClLm/KQZctn6iB6co4GCjJYtLOaAul5dBZU8TwXb6ZRsg702tCFPrlhKZ5/qGBPpl4D8kCwYmqP3KzyFVj+nJ/lRWWgkEAGWsn0goLsShD1hXm5foTudgv91j4HJ3o+6UQzfeTQWiHBrVt3P8LK+nVUL9SgXXmEEgGkn+kBaEYDNI97GBJPXZS4cEN/v0KHwGiCl5tPMfhzF/MeUCebuFDys3zi5ULCGC11ILkRsPHxOu7d/xwXLy6r3qrHnFbk7vH00TP7u7OuIEcloK4xJfzEN0cwRuRM4R0P0O90MOz2cNL5myHRdcNEtVqLi3A2+ZhT0U/Y7C5x3D/B8xcvsNvqYeuPV2jutNA5OEJvMOaSmU6MdKCUlgMSqSeKSFeFPXXVHI3lr6DCfVvJWAW8327tHOO3V5v4/sEmlhZq2Lh+Cx/cvo71O2tYWl6AVRSsRcDWWTYVMl0YRGMKHH5mK/TgDzo4OOlhctTG3NIqinOXYdUuwLJNLmzw/hsoj29h/HsXM13oNhM+vJ73QpwWeOWuYRSdraGiCRuGh+UbV/DNd19j+/cnaDZHrH8QUlFD7THsR0yifeMC26S5ZXl2EmSSKoTuxGGxObsgKW9slUnjMQ0gJiMEh6/hdA8hHFcx+ROySCxQZQCLyzV89e2X+PDuZyjaV5gHa4WKwjMjOYzH4lyz9s0uofzC9X1zAkbzW1MPfA9et41hp4Pjwx7hjTlxMqmZYFjsNhFR16ZYlW42NLenPo7affy120KztYfNpy+w9XIHe/tHOPETaHmYmtvp6ZHfYuO3+4YDkNcAMpSfNcU5vK4iecIO9sdo7W/jx1+3QQ2yRr2IjVtruLNxE+s3VvDe0iIajQaiosU6EGZg8zlDazgUDnzhw6XxcSYYdVuYjo/hDl7j0tVVmPVLDFcKTRIKtGP+vTzLU/Ll/1NRIF0EKM01UHE8DA72IcwAn35xD83tJh49/BnjaULByl90RpQJbdd/je7jTVxeeBcjOusKAq6QDh0GF65T8Y8qiKePVQrxLV73QlIaw1A5D5xdBNBXIj4sMnG2LAAYMSoWekUS3F7FBfP1GgxnjMnUQ71Sx3A0wbOdPTxvt7G4VmfkysWlRazefJ91btq7r6Qy/Rn3QdNtOJYUla0nz3D/9ioju7hoS7EuxWKpSU3xOLVKZQMpnbS/XWqbzzHkXpqMC7evIV2AoJp0FENzXFEEHj57hEq1hPsrn2AOcxwo6bETM2gX//VKqAbyJRGC1GTLbJ0IynclC0Lnv4kYBG+kSXy6pJ98hfYCBw5+aj3GD788wEE0QGm+zF1g7pgzOu/tNVg8T+rZDIcDjrU1vZOSTY1OleecphcmulpSed+Sn1V5jl5Os2YLlQwIUTt1p9xcokYwjSs10QxFZ9Zxjec6KJcrcT45ax7q2FXep2xMUTFFN57YvUDFprqJnBE6VF/X7nKs6k/5o3IfkbbrsoBA95xprtNYBVGcyGtUIE0NfU8shh8XEM5+Dt1I02NIP5u4ECR5PI8zgH8AAAD//7xdW28bRRT+dmfttV07l9KkCk1S2oYIVQKiqBWCIKRKgPIGvPLP+CHlgSeEELdGClJCVAjEaZLm4tjxJV7be0fnzMzu2k1aLoWR/OLYsb2XmTnf+S5WdjOtc/g1WqLlAdlOuX6NLqigo8KU+Rx98SzaQYgcZdNKXbuk9gcqes5SBoJae591Iicko1BQdGvVuaYHLcRSDyW74HTtysQAbQQoDxJ9Jhnv0KRMBSkVTzqCT7MA6HWe8i1gsEHrzzPUfkPp2rMH10yKeRODQZ/fF6gsx6Q7pY0QQ93RtnhyHC34NUgiFDBCvzunZAR8MxlWQv2iLi/nopI7JZlVcL50GiehtTWJ8Zq66egzTDZMDJXEQcgYRdok9n2IXBH9nq8oquSYbyEvbKYG0qaQqDRQrpgOdZPciCODYqbaCe4CaGpnnp2uRaLfZrkHApVDGUrH8MzQQAd3i1Wev0SmJPDCngVDgEtaJNK51rGSUj8eJlEb0BIWLq4t9gfQg865NtUhkINYGzFv7qV+nZz36bd1w4E0rfQcGP02RJDDSbMFbyFCdNXg3NZ8BtYI2WQlRMfrot5q4qzXRmPQ4KKfJ6e8yYY2TN1TCCMxJdjYkHRYdo67dVRARZwlLbjgKaibmH0Ncvo3iYQ2r3VVfL3krKFrQPo8eMzUYJ2RlbsUAHjRyL5eT1wcITgCntG9RsgwHedQ0fYSQ8zYUPeqnAxZMsPnMi2UtCxA0v0j1bWTsh5f/e0i4JELwUhrUiWrg3LivY6D/a0qnFqLo54CTfeMQ4zi93RfXJ27gTfuLaFy/Rpike4SBFPVAPIhfgofv57XcdLvwizZTDdkmYo3wHiYR31rFyfrGyg4ASpmnqUIkZVXEhComKLU42ByAli+v4yZG3MMZIaGB0Eo0FBO/X81ItU3iLgzKpgO3ecuYG1/H26rhUGzBTguCgH5JxTkIuvFqIy/wlFIlKZwPgjRaNaxu3eIx79tY2PzMfYOamj3QzZMDHkzooAXKrAIaIjCpFNKv7IolLmo6tb6tAjHKVgwfMnGXGjqTQ9tDKSkKuJ4q6PjLs6OH+Hbbx5hdnYSS/fu4u3lu7i9+BpmZqaZ7WTR3GQE8E0boZCUaOpSu/0enNMnGHgdlKdnMTY1D6s0CRK583cXOtli2OclzGiAmd1hmM9cr9k1dxR4Ngxj+Gxr160LBmW1u+hgaeUtPFhdxf4XBwjCjkw5EUFSiBKwEXUHECUboijnVWbNuT7LOiyeVyxmFxmU9x8asL0B8m4Pg3oN7lmDi2KWjAWqV2qk4BlFyL/7YAXvf/QhyhNTlHuAODxnOdewSWU0JAXQx+wiIPzlDVNnvzBplM1t/R56jTN0jo5hNrvwWm3EnEhBNG2Zy2gwcGxBWEXY9hV0HRentRMcHpygurOHn9c3sF3dw9NzH466tvWDIynNnMx8ZqgvU2dcrhi7cIxyI8LRzXpGQmTT2qee4PWRC8UYXhij1nbx9feb+OnHTUxPWvjgvXewvLyE+Tt3UBkf4yhBMyqwDITOnyF8Pk5G0Odv4LVbqHcduO0urt98Hfa1VzkzHBw7KVlRUSbG6/9xALh8cEFBTKZyBQXXhdNtInI9VKbG8fEnq9j+4wm2t/ef+z/ypM/t9uBUq/B3djC2uAhf2PA59k1JsZL1SRblF13BfK+YRkLTj5L4wRcPCQSYatMvi18d8RUp2WciJ4hNlAs2Pv/sU3jHR1hbW8MvBzWWUPVhYKO6i/vztzFll2FdKWBu4RbmF2/h9OhQsgrDMCEIJgyTAEnyTXXrd7x5UMNE5SbHLUZM2TZYdojMnoL3lbQni/9q+n86JJPiH550FeGr9/G0p+9aPTz84UsG/lcaFi0yAAAgAElEQVQWVlAiY0BDwuqXgS8vY0TQ+QpZxlQKZpiGlTz774ae29LPiZRrEBXJDvpY21vHw+++Qs1vQJSElDkWSrxP4voHKgrWlKw/yg7hWGYjTYB73sgpprZk5moGtGzcxEYKZNHFxelxuTx8xTqnNYVrkr95HGTEt8vNQs8foFgu8v62yPHnvArLmitGknJGZu3aaT/5P5yGltYLaXNRJtARi0/S8km/qN/zbDNcF+QyTU7Ai2UHnz6PJa8EUijmgN7PXtZwo7qOQAvZDE5N9Tl6n/bwymOOn1eseEpcyyaI8ZVFhrAq0p7mDgJopEeAbAr6voc/Wbu63yiqKP6787Gzu9MWWksLbPmyNpg+GAUjGB+M0fhijJE/zUd8NDE++CQxPpgQjWmCCBGKUIEKCIXS0lLaZT/m644559w7M11qCEnvQ2kasjtz58y995zz+/DyKmzJjMLqqLI5MwfHVBIs34B1AOqBgbarQkXSMVUYqphQ7PS6PbHjs7yKel0sa1Lp2PODqoj3aUsFSIWzTIf6lBJBgjQR39R2HK1YUlHA8Pha6POsGB8lG1UehbXqo8SWrVUqonM142LA11ChKFjRH+4QDDx8KlJYPgcrX1pPyERsE+n7iBNN88bqjDscBKtFA6IEaIOYUGq7fUxioSAVKwjbOa0OujdLlwBKS0PhT0mAM8VDeWg2RpBlDkNblfaZUzU13sLk6H5M7nkNI8EQi+lpVxRXl9dW8bS9xWJ0a5tPqAGALBV4vcc+ll55jyoz3+0xtzNnvrkEvoXa2AKLfaZ2/ikJtroNdrACrEnCwN19fzudggsPEr8icmi1GnThXCFxIb/nRE8QO2hJMth+w2NaiVTVc9ScmtkMHeYsdXWMi4uXcd27gcMTLSCSSl5mBAu3eh1oUuNOExYr48TXNe8R8cMoxqjDxs9Y4kOxkrQjugZBKPfPOgcpgpoUvNjbmxYihvh7wr0KAsRRahJlKcLRIR5V1VKdcueSbpT/rdgaKuuZX8DgX60kLiJ+aeHRispiaCuZTI+JYzSbIT9P+4wFjqT5HbSdUIsIELTQizAr21Hg9WEgeZI1ymPYl8QW19zhJA7W7q3g7z/+gtOnI6rtGMsgPnmdqBO5Rp8KKXmG0yffYus/f6jBBbbi+02hZwPAffRx6dF9rJDn8ljICT19d0jPcWMDnYXb2PjzOib6GQKi1ihZ42hT1sa2yTUJLb2SrSP7MfPmDEb2jrLalyv+c/xslNpNKOX2QeQeirWE/dlTNClu+s/Rf/wQq4t3EG1uwU0SDGWO2JvBvCNBDU6DNESAuJ/g1p1/sbB4F5fnF3BvaQVrm8/R19tFlzQE8agNO5segm+hq4pZguywoAyu3K6/7o4QcWVMMat9K23+r3Sz6BgUmYi+vbSB20tz+P6HObx+dBin3j+BD069i9mZNzA01JQ590N2DyCRQBI/R0ZK8OvoPu5xEXDPxBGgPsb8YrIUpHdSv6SDs1NS++LfqumSLryFRZehEq12WS06rBlit4fhiT349MvPcO3qNVyc+6Uo6CRKTEO5402F9k4PwUiAPBCBpKSrEYQBC6My3SeK4Sc5mrlCPY4QLy8je7qGOmmAENKB6FXGraK4FwUcmp7AJ2fOYHJ6hrvkOo/hEG2MXSsqyX6FClDeqyo6V6+KQHrZ0MVhOOM4d0XFFp2HD/Bs6RG2VlYREA88E1h2lBjYJiv81xn2H3dirC8tcXxfvXET8wuLeLC8hmfdBNaA1DE/qCgkSyoVtmJG27n5zsnw/xYEBsagH7irtsdKnpfaAby3k3aPcnldg6FfaGV/B8iU48F6im/PzeG7c3OYnTmIjz/6ECdPvoNW6wAa4TjHf5b24edNoNdGlvQR+qZz9HQdG0mMsW4btf0toB5CsdaHw3u28o2PeWmKtavP9FUGo3UcIBwdQxp30Flf5U7x4dlpfH7mC5z96mt0ehHT/Aixx+dVk7RyROYZyETLaXfw7MoVjA6HaE5NIap7LISXGQ2a0mDtxZGbpN2KOrM4WaUzXnD9qwl0wQSvQqjzovlhLf+qn+Fph/n/hDI7Pj6Jt6eP4/S+A/jm/K+4uHgLy09WcX98L/559BgHj82g3mhgvHUAh44dxfzvlxC1Y3Gn0kJw0EbwmAtLShAA3c0cD2/exb4jUxzbzaCOfhYZK92Sgifn0ozRlqlOWDvJCjiXo6RNDg7bEa0O28ixekQk4MtJqysNMqtdHJizL0OlXULExNhMU/x07Tzc4SbemzyBYTR5z2vQez5wAbu9Bg3uDbu1k5dYrEqCzS4QMTJCgiLBOrbw28IF/HjhZ2xiC06o0AxqfB6Oen0+T4eNoKB80N+1oRg7Jp8SvSuH557O92QzaUXthMap8bzdLmD0gsoWCjdT5Xy5X4KpE+yf8kWmifNZz+Gk3Fd+QQMriuNmH7fzZWctNyXGgIrMZh9la3o6N+bSEvD9AHEWCYXUM01b32XtrGKYe6Y4tihh+bxyvaLPJP0Duj5BbJAbXtn5L5pspgBYdceiHIwb6dSoNTmnzA81cSlnKGn1dtD88joQUxNN7C5pvuw5Xd6hsotvr4UbbJmo+tMZ29I2BAUs1v2U7Nu5opyDcgqtM/wHAAD//6RdW28bRRT+ZtbedRJv3CR1W0oBCRShSkW08MILl5fyxgNUvPDET+E3IVEh9YGW3hAkiEtFS0tK27SyaePYjp04u7Z30TlzznrstEWiK60SO453PJ45ey7f+b7gzJfvfTUS6Sw/k+FPgkIOZuH6kBqMDqTkBdNMHiUEgbwZrZOoo8xSQlDmctkFcMgLmL9W5xX2zQsILshlSQZhsHeBtoMTB0KW4FdTxlKNpw/J8FHprfDH7rJCQxdIija5aq4qis1I1Vxhy6y576EBFL7J7QejUaGOMJZqLY2DCMWUvIHVAmQ+izm07n0h1XCGeWQCZaHrp6MJ07wkFwxUv9462K1fUcqziU6kQOSNSF/kIkPongNXGMdDkirKYVOLE8vH8e7qaZx67SROHlnFsfk6jocrWCnXEJcWUC1Xcbi2gqO1OkvrEXMsVbfHTJxWQVQJ+abBa8i47Ke1PkkctYAERXLGBY/T1bFM5rQUll3iROe7gPZ7a89TdFAEiLETshE7xdMg31OBXHEap4FUi52jZXmTM+5NMnnu5mZdNYVIv0iSxo6R5gm2+i086W2htddFJ+2hPeyjm/awlycYmJQh3ESUQ2y8RLhChiFgVs5AOByMzI/02hNBDyVRhFBEIUdM5pi5bLuZgQRqwk1/qmWbrAlMPYa3x7W9xz8OyhqheE92jq2ZEA/yWp3YCL2O9c5S2WUdfblAdWSMR27kVwE1+C/WsPe8jsZ4qCBdIFod4eobfc4ECHbG2PjhBjbXbjlYs5JXCut+KLAsgi2SiYyPr+DsuU9x+sMPEC8tcYCpLLX0H32B/1/tPcJa8z4GpRx2vuyi+SRFhVAAGw+xef4SxjfvoZZkqIgKR8ZK9ZmwfZNGsXMeSXL71Ntv4v2zH+HYG6swVsg9mbUtkDagsQoveycO9KEfPJ7/92Ga8CVILYFYLcygh9Zft9G6cxejTgeLZC+oUkya51wNnUd1cZmh953uLjbuNXHx6k84f+ESLl5Zw2azjTZJzOXiIOte9eDiVli7S3JGLA9kBC7tGkm1QuYA3HnRFjA5rfc3I88bOW2hA8x2yKj9oIQP0G2nuHXzPq5cvo7GZgNpAsRLdYThHEJqiRLW4DKxq5kxDLGC7+6i32kz4VpIsMWSnbQkzfalevvzv3iwfX9T7bR/5Ae+c+80FLQOObk2H8XY3U3x2/ov2Ev6TCBKHCxl42w935lNxkzO5JhTbxGxmpuozG0WXO0Y0VrNUNlPUG51MG7+g3yrhWCUsv1T+Kr2oZPpIHN57otP8PFnn6NSOwybOwfcqF2TtFnu9fy7Iyv2odqE/7N+n3Xkcp9kgkFKglApc3+A3t/30HvUQNLeRkQJ5RG1c0ivfU7OVBVRJUaS5mg2tvHrz3/g4qVr+Pa7y7iyfhuNdh87Q8XLyHq0Dv7N9o7xZMYls/ixZQvCa37GNipSyZiDzmDx6Z8bkEz32RrRbqdfXOuDS7VpG4LuHX9GH2/38OP6DayvrWG700NcrbHs3UK8yPBucmCJRZ00gYhkjfghMkoO7XWR7fUQzUVOMUO4nsYKUS++0RcLeF4sYDJshxwDv3BP0ThNgKV4Ef2dPu78eZdRQ1rw4YSb2AtHageG+nOdtRIhPFzHiIpHZHmK/erCErdVlXtK/S03kuLel6NI6fnejO5qzKyDyTXk1ZooUGSNzcXXcvawUrJYPVLHO0freCleQBBFaGw9QaPzBIP9Pl45tIxjy8uIowiLpKvf6uL3tXX0dnam0qyZ2KbA27XUutbf7+GtM6dRqs5jkDm5sUykStlfHzt7XDYGrx49gXp1xRHNmRkSOF83z5sH9tEMIcXGaHYf48H2JleiYRQBJv6tBFp+F2A2Vcg0DjhFbZQLFfTSfTx4eB+Lh6qoxyscsFE+kooYU6Oa2W8vAhJ4GrfJwdU8myCYPZ49AgmZodoDnIw2JexhgAFG+P7OdXx97Rt0zC7COMRcteISlSXDyNcwCIpecMD5m45f0hQIZy34uiq4I3yd4lmjJHOpVLRWU9GRHnPxlYncJSYaElo34hZVh/IwiKMFrL78OpbDGkIWQ5z4O37AP33k0giYobHzGLebG9jPE2fpOengClsFHWLuTZb0wWtcpL7lU+dWbTKRPxOyYG7OFXAVCU9a+4Iw1m+ADgrEmSRfpMtpPtj3UXlA5m0TeVDxqZ2PrzLbkzESupbbsD2ltAknkJgD8S8cwta9jgrrjDafWVFcqBT0PY/FWvwLAAD//7RdbW8UVRg9d+7s7Ha3221LKQJiQEkkIZIYRY3wwfgHjD/AxA/8EH+M302MEI2kasRg1AQNqKUFaQVEWtou2y37OnPN83Jn72yLaNAmk3az3dl5uXPv85znnPPY0+fOfuA1+mHCFBp7hYlCGJgPVa/vTzykuHiwoKz7lf2P6OrwfRL1YNIxYMH/WG1hIIZkolMUKYLXfxs9sUxp5i43lBPUMGJXeqd0Ka5M5roLr0u2+fka483HnNKQY34QUnWm9sfuKcnjyT+9TpRiSTe535Wkn64VVaHHKZ/ctomBBdEEsRSCaSwZU2/IfZ8HjRFgw0bFiTTXxub9J6MRJT5A1GQ2FNNATtrIzZiC9B5JfTOcev4kXn/xZZyYO4ZDpf2YwRTKzqJqYqa5W0gPeWpbUrMlTFPP4Pk5DEtAJx0o8JCyRIMCZ6G4jACAEbInY82zRbjPddhaJ1J5hbX5WOHP5v0yg4Dajahq8j1K3wwS/pwhAElcPQDAYBSBDWQYQtUtLcnSOB5Q2zAKGNliWL1anSDv1Coq5gpoidHNpF6BrVikccaGSvFEmWVVNI9xsG3FYdWxe3sq14nqn8M+O+QbbXtJYIBj927HbsHs5KmLHS2w9D4vWsYFSbnjSpufSDDWk99f78JrB3X9N7sAgL0qzSEAUBx3o4Dm7+hMUGfXkabf5fe1yN4YzS+8yCuvlSdKJ9p8kWyoZ4D/XwJGskyrLJ66JWYn6KYY3mvj+wtfY3PlPhJX0gnTB20ZSlYAuojmlyTCS2+dwdvvvoNDx15ALalJ5VCXISKIU/X/Oh5iYXUZS801JLUybNnyPcp6XVR3etj44SrufPIV6uttNLKYEwKnThEDXZgSBQDo2arWErx29jReOfMGpg8ekCoUmyv6BCEq3PN/CwCMSzcKt4d9Jgz37XcPm9i4eQNbK6vItpuoUcWlO+DKf1ymcV6Fi8poPezi2k+/4NOLl/DhR5/h0pVF/LnR4op/qnpHChlLQeJjdX6y8ogK8k4ItxNWgHHSQsvoxkGl3yLkQbmD/zt4f9drJ22o/P6CKqpvDZxpcL24fA/ffHsF164uIzYVzE7NYIK6OdCwo7FnxDiKW+pRZbRDhmId8Umg9TJOWBKwlywF/wAA2B3gjZ4JkbVke9z34P5TYNbPUK1PYXZ2H25ev4XVG6sgcQCPW543U+3bL/MLrYkox8hKEYMAJOEgaU6cOpSHfSTbO7APNvHo9ztw7TZzZpi5YiKViQggQ7s5cWoW7517H8dOvooorhdLhyYLDCt3J//F8fvfAQCjOV9sWhmK2tzC2tISOuvrGDRbQLfHHRYIYCfWArVprFTq1CEPmw+28d3lH/Hx+Ys4v3AZV5ZWsNbq8lkM1VfAsWt1xOsVzZrklE7sFWrBKG0Y5XcUJIdmj9M0Y1uegBm/tvmET6kxhW3MZceJqzx7GFD3BV6zRx4bIpMx2i1fAu0hF2CA5nYX135ewpcLC2i3dlBvTGKm0WCGDvn/0MZQBjPVBhh02mycabM+ImLS0fpL3k1UfcyfN/PYBN6P6iel908LAHgQUViBKXa6XQYC6tUJTE9NY3nxBrY2mzonKGHbCCDkjBr2UVBNHUOod/b+edj6NPpxggGbI6e+2qUAgMsBALjgvjtXaJ1YeC/4cQ6F6rcHgPL1OxolJnR8FHekbDAYyTwYZ9hXK+PN40cxYxPUycMmATY6LWw1N9CoTuC5Zw7i8NQsg9V41MVvv17H7Vsr+TEFMH0u6hiqmVyv38X8kUPYd/RZ7hzgSiJ14mIPrSOs8pFxf2T+MA5MzTMAwGy8UJ76mBEiQDnQMw73W+tY3VxFZoUJ5w2xWSaKSI2h8wA4r/znBQYyCM+o9ekQrpShN+zh7h930Zhu4MjkYUxEyZNH2FMzAv4/AAA6u/hzoBFI/lMtdPD54hc4f/kC2qaFZFL8usqVCrPCyNfKGoknLY9hjc3Y7DYqtF0XKeeA8xcu8GauAAD4cNznUFYlGFLsHSo/LuIYjb4rFaSGv2dueg7HDx5Fw06y7Jjlzvm48MdkxuYJgbqovLaydpsBgI7rMQAJXd8zcRvME2vW8OunvUTcP6N89QLfqTBWYrmVMoo9o0EYyRJ3+twkzJe5c53P0Ry45S9fN33YPUuAwRFNxgvFscBTS7xMpMDu4+bQj4+uNckYOZ4m/6JYcm1/raj4xt2GA3Z96JvW7/fxFwAAAP//pF1taxxVGD13Zjr7vt3EvNS2CFXBFPpBKkXBL/0mih+E4nd/ij9KpLWiFinYVuw7GG3SNEE2r23itpvd2dm58rzcO3eThYJdSLIhy+buzJ0795znPOfEH37zybelbMdq1VtYGlfRl8p44iuoUnGN9Xkgs65U5UO6g8mDirybvZOf00S0gfEgA+wiyKBGwOYxoE+9mZ/LxYe6vNuiXBxzZZ/8VLHCmOTMiIh5VLmxkkq9M2iQ/vhkIj2gdMx3n4kkFKmXq7PUjfLIFfxz/1FAmLhejzBm8eiDGCKjJzXRCEajO9Ykkf/ljRAdeLWBaSKnFRQTDJTrt+b2B1tmYQrRMtb3oZi0GCaLsXR2CZeWLuLd1js4aWoskapTJyAz/waJLtMnONRLAgCbcZ0nWLXd5Ek7ynI2sag3qyxDT4Q6Lys9Ol5adHIlR8bKeJmJKohefOx1kHsnzchXiIPlL1KmjYG9EkABoHQXl7txOAIg8tmeBVfyoA69ztRLKLsIJ9KYoz+8aQyfE7fiiZs7VQ9yPR9GiSnO4LVSnZ+Q+7IHRswVRLp5cW+VMvzMzHGEohJlBmVuv/pluDnp2XJlvV1rjgPGIXsZWvryvA0c9EMCIDLlQmsiE95XS3lfUS6STn5X5IUnAJxCJVxMXaQJq2hgfP+iW4wkEcR6M0B33fqFMKj8e5IguIasJxKE2CKwyqRIBlD09drNx1j+9R6ilyNUGahh4rZSaNpHQqRVu4FPv/oSH12+jPbsrMwBCTbi1x5y7j9wa38Ddzc3sDPoodqqM9HDG/7+AP0/V7D5823YR6tYHCccp0bkAhFMYyMtBnQcqmpfR80ojVqKSx9fxPkL53njTWsKZ48PB5ynbyj2iOTUVI02wY3r2NGY9nB/d/4Zetx4uzDmW6kZvkS/28Xe06fod7cQH5L8N0KR5aimDXYKHiPFwcsMT1bWcfX6L/ju+x9x+/EKdoYZ9/VbBRb0PaXMbPL7kNqnMtVKUCogZwWAhc+TP3ZeTTnm133GSAFXWC0tgaUAJdeOTrONOmHYv5KiCW3EPdKbWzv447f72Oxuo9PpoD07w6y/yWlTSxUtYjeGGB+SEuA5gx9WGCYV9gwJuzAdECsrQNOru9P9o4981sito0fBn7wuHxdKZUVoNk5yksvvt+5wpntKfiGUhMHEi1TmwJFBKTWMc/WfYnJjJgCANB+jRoTP9nNE3V3E+z12CI+0+legrCzHOrYvrnyGz698jbQ+D8SV8hywLwxtoEasopgG/ifP0/8lAAo/mx2IE9wsfhYk+c+2trC3sYHB3gvk+z1YirHl9hM6PhGK3ODwMEevN8TyX89w9doNXPvhJyyvdbE7HMkcIeI6rsi8puQaW0j7SlB5d2DbVdyNX34lcLBAytfRGDXkpoYcTWRoYoQWhqaJzOjv+nzEXy35iQYoc2NkahiZqnhW8HsJRSkZ56X/d0gsxP6nVW2C087IADWTiQnKfm6x+vcaHj56yPuI2XYHrUYLcVKRai/3nRIJbtGoVnGw/wL9nqRPUKwrK95i8R6QzfU0E0tXA3+9AdqbEgDOaZs25eR/UxjZu5J5VLvRZFT74O4Dvo7Gfhbqik/7BLmY+fgevDrAic4M6nMLyNIqski8AASNOwWA88Q5TgBwu4Ypoc00FQAQqh1DBYh1zIQnCKwreDg9mymQkZlp1scHby9ivt1CK0mxuDDDUu9/n79Af/+AoyHPnVpAnTwOCovdf7p4eO8+4kJaGa16WThllVvFaPwZtUInBd67sISkXuVeZyZddUbxfKd7XlHg7MJpnO6cEgUAZH8kxEXp7B6eX+vJWSGmtnu7WNt+xqDWehMzTUPRVrTw2HjpvwkUu0b2zkkqSV20hVjfWEOzVcNb7TmNp4NXrRyfQm9GABxLipnyitf/fdo9sNwLWe8/VaCHAW48uYmrd67jVTIAKpYr/4S5yI+NgTKT8gUToMfe1US+GCzVYvi9GxViuVUvLj3UaBjccul90QRvOZ83tx9l53/CZ5z6JbjtzNwZvD9/Di1TQ6raKZdHZIKVYmKWaBb/KzvA6s46EwDkq0UKW1p/LKsQMlGXE8aMRRlzVGnlFNTs3eGL1iWgLwG52Lm66HghBZy6R1cLOh5acQ/BP2O7QDlHD8YGiu84pUwVA3ym9f8S7nEtQ3TBOIznlL6uis+qdi2OMWan8SlOLotshIuFvKEx0nNvJAuD/wAAAP//nF3LbhRHFD1V1dOep7EzDAH8wEAeRNkERWLLKn+QRRQp+yzyEfmaSJGySLLKKlICBBEUIpAREIGxCcQ29siM8by7u6L7qJ6eidlE1sjCNu7pdlXde+4951x3+YsrXxPgKKm+k4uZicwtdMHASCtD4vrtc6oIJe2RK35dK4aqIWEa/CgV7c5I9P78/6wa4mklPZgXEJCgilMA61BgwkBwRnMxAYVClYBWRGzeKTYqE9AqcOhAFSoosXbwfWEMYk6z18Ur7qJynQCc2SlXwRAf9pkcfFaBGtFqmQbipUNDY7Ko4x1cwrnrz61hSHhWjZQsMDVEg95XZpRBEBanY+q9LVBlpijuCv4p2HEAIm1YSXwUvJXfX6KB4xTwu8DKifO4+tFVnKsto4IyKgx49Df7UMo3SjAzmuY7pTDHmDc1NKp1xK6K9kEbIz+Ad3QUjfkYN0pn566RygPIvEN8GcSTILJB7ytdFdJdi5aH1o3QENlUMS8FCohwVqrFYbEzrd4IKKQOe5lNHz0f+rROGSya4EwtSbSYJ46Z7kjAnNIFOkwiliqk7GIfWQkSw1GfpQlMb7KRFj7GXLlkbU4KLm6wwYvq/mite37mJR63RYUSppqSIdxYClDF9UlracjzTMHMFerOCfVH96Ke+FaDHHd3nNWZrcQcSZThIEk3mQlmVNzS4lQIGoH6RHs90kOLtdiF0Z/wkwIA0/6DGaizEzMV7bgG9gQ9Oz7w9Ply4LaBcfDfbnQoFJji/lNJUbimD20ZfYXRQ7xKdbRMloVejOOpFjTfPNvpYv3HGzh6vI147NngJtgSuUKtmWZ7HyYJLl35GJ98+hnWLn2IuFKlmjQXvegaJA84MMAD9HFt5xGevWpzF7XUKKPSqPLM8OT5Dno31/Hqxl3U9/touTmZZOEyJEbWHr3v2ApNuIQEFXgstxbx/nvvYKFWgxkNMDjYw2B/B53tLdaeo38Ilw5hspHMclc2EwdLvonju8TCHpEfsZqEcTUZwkYhO0PXf43usy10Np+g/3JXdOJwKJM3iI8xV5qH9zGeb7fx6/Xb+O6Hn3DrzgO0eyP0NEmmfVhS0GuVcSDjUCfdidBNk6kVlhNvL9Al39baV1bAFHFnPfybRRPG5lTSUNey0ytDO/6ejakCO6AIgmLdAJECIQsxAXUkgMg8Np5u4vq139De38fS6RWcrC9yokQFIgLPGbGdhj2Mh0dwnMiMmOWGUoVHkEZ87mfiyB0YOnkRbeZlsmmmg/GTmXAafySpnmi4+V5yoyzDUxcMT1wRkHOiNo9/tl/g8cN1ZMkgl1kYzeCJztylzm0lho8sMu4gOESUGBz1MNfpotTuICLDzMMus0MCgd+YSfebBm2snH8Ln3/5Fc59cBmuuqBeNF7d4CkpHM2Af/wnkZ0q1BzzCvDev/FD3l2aiwlkUrTT82f44m/sbTxFd3cPbjiCHSRcXKMpNsNBAucryJIYL/c6uHHzD3zz7fdY/2sT+yORDsZaAOQzXn076DlG+b6yvJetMoWUL8bdR16vvCYjpAT4GcwvYogm+qaJPk5jHF/AoLSKpLyGpLKGpKqfK2sYV9dgau9iPLeMoTuFoS/MgAgAACAASURBVGthHLUwwAK6aQPdrIzMk0q9ipKZk8k8wVxOwaHL17jX+O0U7EOYZR4qcirxiZQx28Nj77CP3+88wO2bt/l784060/1LFQH5FP+YSSiZLLJ+H57kgDT9wYFzHoqHlvS9ORsnU1OwVP0gQgHgzSDr/xcAtMidm1Wq0RlJdjhGO47j9XoD/UEXTx49Kcxe166ln3brY2p6mqLeasEvNDCk3BcT/xzem+Qnod3FPKZrIwu+cKdBylnY75OGxYTqbwpPKLdYFFTF92B8DOM1d6e9ZkmT/Qqnmk2cX13FIiyazuHCqSWcbsyj2+sidsDKwiIaUYRqPIeD3T08/PMe+p3XOU8n1ecWGkDQ90DTarqDIyxdvIC4WmYTF69mkxRvUmruGAFTZ1tnsXryDI/C425n6MzTSjAiq5RESVJNNg/UYgaZ5R70OtjY2cKAZJe8dlJlGgh12yhDN1OwRHLb3Gw4b6JJh5tMPsvEDM7Im6mPe1v3kVUN3l48gwoqsjNmltpx011m1+N0/DmO0WOmPgI3Kbxc4e/7phJxKJUFU8EJT06uL+CfvImOcG3jFn6++wuej3ZhGoSnYoh9WcJ/A4pVbBOVal6lBuHiw6NNJjV5FybxUK5KUx/SJMdrFMczle+G3C1nqRSKJuVKTfLuLFPWbcrnlE8MlptLuNS8iDpqudCyGA1mnzqfVUZYDh10cW/zPnaPXjILxTAjfaw5rgg2ZRKBSHVCozngLATAX7hSwIEBMDOrgf3oiKUrExsk65JmAx8PswWcwjPg0ZRkZqyFFMamIYFXOr+MFhSiIRcZ2NyePOcEAxETVGTwMmGDmeVW5O30NcLGs5Pp8pw6l0xPpqGRDCN83zmLf3m7th8nqjD+O3NpZ9rudpeFIGtEgURASRCJ+qCSEHnS/8EXn/yffPGRFxOfjPEW4i2CASMYo7Igu6x2d4vQLW2n25kz5vvO981MuyBRoychZJPOdHrOnJnv8rsEnqgmUrWCAgEVfYB2l9nCy6k35lJ98aQrzZ+R5N0lyNrVdxfDnAmqaBRK+5kkAqUSI/N4K8q25Heu/LhMhPM4ESRev0AxfBEZC0V0zlmN7eYzmxldA1agJFFBUifnSpETAVRhQLUT9JVf7ZHKvxMso2uoCgnS5LEbQbW6I+iBqh+/rTgNVJOfQpVytDN1vN6YOrh4kmai3liahpaIjenNNzty/n6XmEHEFVnsJrFohC2cPHwCTzQOoImIO5LawQCqXSyVadLtWAp6UYfUBosYLwAbCx1sJLdciCG8dm9GoJA8t/V3OEqDKb1GOTfOOPH2QgeRoXkmn1FfjvEr68UUjoonZyr3Vy6oEZp3h17xC+E5FkLMnN4D/R8wl7cUtaS5V8V8qtFQ10cfDqq4rwUrOr4WRoVgYy5rrWgZPr8oBltW4vTRasUYDgbYMQbNKGYOr7MKCRwKRopZDBdngTwnxjKRh5vSOgruklBtclV9FkoKXau6HeiGtzNCm1pFhHT3+TwyDwXXX2gIHsoEnYoeCvkqkCiKOvF8sYWCcEIFSZNNV00VNhWysvikeI7w2kgxUSH+1WEre4jEVQJF47AKs9PzGN0dIR7VcG+ti976Jvxx5hJAm8HM9BwpRB5nFo3FeRx97nkcePJQkfzzmen6Pade3wOwkmxhvd8DuahRMExvpWw8xk63h8nNDkY/riLuDjGXuio79yZzB7PVwhXxaGk+aebJ3pE0dXrdLm7fWEF38zbqkY96zYluNufnmFZSb87D1BtYfuoITBQjjJvwa9Od54eNqt2Ug4XDhQzpCNvrq+itrSLp/sGClu14HsaEqNWb/Pvv3enj6g8/4auLl3Dlu2u4k5T+5r5A1NS7XJPy6orp7qfv5/At9aRrGbOFmEhFMjc/k8TfkpCccf1MX3yT+a/cQcoNe3Gn7BRAvdnAs67DTc8c6jgTJJm98vUYfZ5BUiCvsGmbhhd6fD3b/Qnef+9zXL18DW+/9SaOHT2EPXtjRmHUA8PItsk4RXJnE8lwxOer7w8RNfZIoFrF0c64OPxDazQtgO/iLBqVpmT+C/Yf3Iez587g6wsfY/23m6iasRre94Ch98n2AHk9RBBnsMHE9ZGTFEFvAHOvz2gWl2z4AvnPiyDUiD3Yiy+/gOOnTiNoLszMpJ3592/GXx1fCrZlogVh8wkj18jWMdnoYOvWKrJ+HyEFTInl6SLRWzOhNbT4fXMTG527+PDTz7Cyto7tJGOrMKLnKCrRE30AW0Ux5LsB7FbenhNTw4TcR+iNSvjroAXUWsj9BfjRXgS1NqJ6GwjbMEELlqDIqhI/YytJvvskVmspELdjtuoDKUNnCUy2g2x8H3bcw2DQxf3kLnz04YMQDhlC467CZ/zCTqVEwhmAK1IVm9aV7LnBQPvUc3O11r2Pd949j28uXcQbr7+G0yePIar7juaQuzMFJoUdDTDatLDJAPF4hOaShd/c4wqNxhM6HR6xnv/NUFg5WxRHMfI0xcRF5Fg+vIwz517F999exo21LhcIs4rmiIos0spGpCHZ7WK4ch3+viW0or3oUxzpuYKKyctjcpT0xNnBHXwr6IEHDNeswa69zvG3Fut9x4uigkaWm+K5Qte+nWb48ufrOPXMCSwtLqKdWTzmN/HK089yPNDZ6mA8HMDMtZEFHh4/cghHjx9H59Yqz1GqGAVThCNFGZYEAUf9BL9e/QUvHVxm1wyyjHS5vCdNPnctJGRGwms1P5ROaM5v1eq8mPyBU8DvlgbRcmoxa02EUciOQoS28uSd4ymaT2KFqpC425CuQOgz6kPsoMnxJQRsbPDBlY+QDjOcPXEGS2hjjnF5Sq/432/Tvz1yFvXMkHoGfQzxxcpFfHLlAjrjLURzdYR1nxWGiUpIAtBGkGDF/UmuO42Ynb2cg5ktYmcIRFybpqQLUkVXc+yo6GZZWzMT3/GapA5LQgUEI+9CitNJb2c+bnHWEQiu7GFDC62Q+4KIAqN8B6PcESq5wUTWnBPX7OOmMN0j3qMX0eW0Zb6m7lWaP7jPlBpVqrlW/M4C0i+6YlVqAMWktGvUs59ztekbXrv5s/B+/V5q9jpbSzf3FN+qxpzmxlO/hz4fOLcAbuIzolwRtA49ruuTphn+BAAA//+8XdmOFFUY/mrvrl6mZ4ZAJxgIIaIRjBHlBiVBMZi4PBSP4AsYb30DE2MIEhXjQmIQFE0YAwxMD8P09FJdXcs55v/PUtU9g16QcG5nOlV16tQ5//It1gaQO0OiCtJLhl8rP0fXN8GHp1XaKYFaFJdjlf+yguOawXZrQqEAhFcyn6TUyRf9PmyGKA0X3/eVQmRt4zMWDMTrp4mlB58liVYgLxkWW+kSLL5wBRlSUHJoiP7+BSAtr3y5O6k4Lb52EhBcaXTdqmtp6Ap1/rISDfRsBY2Uk4EKtmWsAol7TsIrQdBYuKaa0ypgtNDuGj/FVJbZp9LwoJe43wynkpqbzOLAUh0a+h1Rk3V9ZQ0njhxFV6XxWryoGsLZ70JdH2a2G/Cx1uig31vH8PF9a59Bi71Y2uCJNkCuENCbT1FX5qw/rzBVKhKLlLwBQQtcmA1KiTiqwpNZf5SMU8GAr6U/SmOtqBZ8JcLInWyanEJdlxU0g0An8cqCMIoa1mKR7RmlWPC3ldq6kTahUqiP2YoMGt9f+htVFXURg90SGAmhVFQjL7L3EmjxFGnfu/aMNQgWz3D+9ZtxtBhfbX2Y5N+tCU7u0554lpWePTz1/5lgQMP+TUHIcphchTopSoUaMnQbeq5SV5yV4qiwoitCFyOgi4xGY8O4VQA4cPNepBeo3xf6Pg2kK08yuJlELFz8+vsfGDzeQsyhuen+S5udSa0dQUdU//gxnCEbvuNH0QhCprqYbrbkqjMwRIoHOwMM9naRRz6iZoO1IMK8RDDNce/W35j+uYHOcAJKn0k935O6c6kvq7pmwFozxnqvhf6RLtq9BuYyxeDJI3SyJvsWN0lbhWwp0wkXAMJ4BC+KURQZ4pUeeocOobGyCrfZBf7TY1mJr1IPhbnBhLsvEshkiNH2AMMHDzF9OuR9oRW1uCMcyADJJMPm5gDfXL2Oa99+j9G4RKID3MgPMSGuOKsy53Yuq09d2b1VZ5053sl0j1KSJkOdU9lCyYlQG36jBYQtBO0eCidCQSKjFBqEIVyhYOc+ef1Sp5GCCRJvEynEfBfIR5DzEZCNEXtzhEgQunP4YsrJEPWw3dp8mC9BQiyUNwVTnAKkyEFlh42NXVy58hk+/eh9fPzhBbx0bA0OdUBpPy2mKNMCRUZzKEEpcLN/AojXOQEUFqHzfCro9TPJWwoQTNCvYm/VnSGv6bfOncWZ19/E480B5ozTkLB4MULPFALZOEHQanJH3PFKpgo4SQH5dAoME2Qa7ik4UVS4L4YTQi2C7mEHFy9fRG9tRTluCl2Udcx9Pctbuu4L8XxD6ndWWuyI4MQX8ylmO9t4+vA+0vEEXk7IB0fzQQN4oc8e6Y8o8f/qGn7+6bby0NedNBJODLgZYrBvev4t7kbawkO1enxer5nTQhH2kEc9ZMFhhOunUPqrcIMOW0g2O33k0kcqfVXgopXtqthL6GRGFQDUVad5qTQtmAdd2EIYHAWFLmTKCDayW/LzFPO9LbjJDuR4C162hRa2EXJRgLpnOSeMMN+DI6s1RAKR0tHrVu+PrmJy7JXAj7fu4c5fn+OT997BpYvncfhID512qChNWhuipHOdtW0Exskc7b6Euxbpgp55Jl+vArG0Hl7QIFpXI2JOOQXXYbeFV984jUuXL2Hziy8xK1Uf0lCTpFBWDjR/hHJqpxKzjYfonNpFQPavJAhIgprYD6euJ5J87rmGLaBFMoVGR9Xjzpqa+H/uB4USABQa5WTeo0hLhM0u7m7t4Oqt2zh54Txir4lASnT9GGdPnsL26ipkMsNwPMJ6q4tDR/t4+bVXcPO7G5iOxxwHZkxXg6K+WHwVIRoBmQJ3b/6Gty+cQ6Pd4utnri5aUOybK7/1vckESZoijmP+pjjHcGtIzgPa3gbnQ+dvm8VNG/ASR2ks1OMVqWJ7oeMHtn61zUjHzhWjA2qc9VIIu4/KELjxzy+YiTk+OP0uPK+PmBAVwuf7XNZjeJFjeXd0az7/hujDtqMu6RKN8PWd6/jhzg0M5k/Y6i+iRtlsDr8RMFWNrUlrWmdmUH7Tbrc41iVHM2MbB/03FlF1D9bVWogh5f4GDzQl2ax/RypNnaKQ6MQd9LokshxWjhf/S/eCVpSRGE0nGCcTpt8GLLolraCecqFzmNZjEvGFc7M2FjTFtIU155iz2cLzLgqq136vv1eG7HMz0+cmmoL/E53CwPsVfaU+6vN4ED3czBu/C6vsr7TtCEVhm4Z6mNi4IMHFgJwBqHFMRZwqblhoFgP4FwAA///MXe1rHEUY/82+30sSc0kt9Uhs0YhiwdIKhYJ+ENGv4jdR/CcL+kHRSqmopaAVktq0pcaapISmyb3mdndm5Xnmmbm91JaCIi60ofRyd7s7szPP7/m9RNzx9yyAmiaeqE6EMpBOmTZ63KmMfFHhdOl1EzpbKFtDPkgBbrPqI9bf0HvTFw6lrGTKsK7HGmg0G3YQuhx9p4F3RXzMhVvIrAIqlmjgKomsiLgAsRsRKwuoZlzm6T2pW+dNFORBkDUyf3G1IFoOpIDQi13hHwQWFJlIIkEghaYx05voAABGWQgBpegF6cZCCpkyL6yhRO36/d1AUAY+Wo+z8qPQd/2tx4DNr3fgCw9ILfRfRgFC7v4XZoLYf6+QkSsyvFqMW9ztUNLldZNRKzfhnr1El+JOTrThTmueY2im/tzGaspqc0aL1wL/rhg1uu5xKXpwKxOwHW+Xe+nuP31WnTHiQCj2NKDwE58wYE3j6L6FFEGixYfBxXg4xA2W8kN63+FgyEBJyDqb0nfB69mhrGGqCt89twyRWZjEeRxYEMP4WEYbBVn4DjzHcIRCmdfHCnD/gFAMgPmxI3IYltmwEeY0StEzIbQFK+gnafDdnK0jme61haCdnMcvbB8/DpnKO5UfOOYEfedcEi3qK5VDj7nYrzEG3OcyIGfcQ89440t3ONQ1mDn/2cOOF7k3yno0WNMxMrOL7eZYG+zd+xO7m1tAroUSNmWzqPrmnRDgNMJbFy9i7exZpA3ncmE7iloil/oMAJTY7e2jIElJlvK4HvUOoXtjRPd3MN64j3jvEHNaockditJum6RaYAp1BLTbKVZPd3H6zApOriyhc6KDpaVFtOdayBIb1UP6bRqzaTNhOm3WbiOiSEhii6QtjiorCGB5zv0J9XWog83HqIfHv29hf+cBiuGQHXqbcRNJys4f6A8m2Li5jq++voKbBGoIJpsSE4LkEAT2iP7So//2H9PNK3X0eeHJoFViC/8gwxgtmNYy4vkukuYyooUuTNSGiimHv4EqbsAQvRgpSzm4yKPOEgFKAgIoctalsWMmCHQfoR4BRR9ROcBw7w/k432Y0QGSoI+m6SHGSLqiOV8HF01X7/xXkuJOm88GmUhWJRfvlHv/xeUruLtxB598/hFef/MMwnRBTLcGCE2B8eM9O5YU0DrdsgwrFUmM3z/Im1bGd9OOd1ZQ6ziaoLSvU0DSUFg61cG7732Aq1d/QH808iAEj/vKzptyQJT/HGhPOO5O03NiXMIcDKCGR8yy0LVAssDRxklpGgAX3rmE186d5XnA84tYLYHr8pZPP6d/4XClloUZHMXdsF8GFcLD3R0c7G7j6PAQCSWo0HpYML8Y46LEeHSE3zY38c2313BvcxsTAa8IbE5Fb1kWwsZzdE0fZWivpLUWJJAq458EWOUqQ7q0iqr9IrIXXkLW6gLtV5GreYbX6c8waqLQCpPC0moTSZbh4EaRuc3ookNt63SZW4F0eajjpYkth4kA9SGff6uzhmh8gKD/CNFkF/nBbeTjbVTUFcQQDVUyI4BI1qoqa2aDkPPUMxQeZ+NIzYRRbnD5y6vY2LiDzz79GK+sdZFmAXshgKV+JcK8hN5/jMkkJ8UMOk0CKUOmjMjKKx8VeaDwvzqEOW8ZUalNignjAtlCE+cvvY0bP/+C6zduCTPI+UpUDIBpMUAmcLn/cA/l9gM0FudQzEW8HujAXa9nCRpqU1vVTX6ePCofRV27F9wYcR5cIrE61qFRcYYqTNDTGt+v38K51S6y1ZfRVU0skJSDfGcWT6CPR9wdJh+QueUOA+AnV7rY2thkZlXN3tDvBSGRtUR86+/sY+vX23jjxAVu4FWyyFHhpWV9JwYAxSEbTPelQSXXX94vkOfmlD1hn2P0jGrFKRIVohElGE563CwkfTdncFRWYksAFMcbA08AJ0riCF1yEs0vqi/c3p2kLL2yh5/uXocZT/Dh+fexEp9CImyG/8fhyn3j/7aSpwBHMNjFI3y3fg0/bl7HzvghyrhAg0D8IEGcpCyz1bBjRutZUJbuyYiYIKKJdxHc9Zj1el1SCrN0Zp8Zze4DcIyJ7QpjuGYLLR6mQitpYz5b8KlMz3vkpsRRUOBg2MfhaDAjGyVGgpb9KYOqzoeA9rSqTpOfcpxnDGnJtZ/j28nnwO6Z6ZzrtPrje1JLz5f1qKT7YpuyVhr59N/zzwA314X56gwW3f+TPNW9ZmogaDv8zgOtfq1dI859HtVaVBdTHeBSBVwzO4pC/AUAAP//tF3bbxRVGP+due3sbtvdlpbKpVIRQkRICAnEB2PkgQZjfPPR+Pfw5Jv+K+gDIYREoiHBKCFBaqC0hUIpZbv3nZkz5ruc2elFgw/2jZZud2bPOfN93+8WUIM45GxHjz9MyRTMCrSy3PxAUXTK4s/VbT+KgmJiZPfSdW3OaNpQM/wFyY8K9JWbJG2GMtUyEEOAdeEczUcEnqwYAmSK0obqMsnUiIogtc5ZvjzdENRS2A2EvDvjCt9T+j5PiTLR6WrT7248LSZ2Pk2lCHKosMu5dLnlpLFh5NiX74fhOLfeaFY93TNPfQB8jVxiuk2G4vd8pXiM4xaVfmjk+64B5EldNWIUPdAIs0w3GWtr3FDAGRny1FY0jCPyJmBLbfEtaExMikN5NhIiTtlt/0A7krKqSbeQMTrXl0lxlV2xM3RpYBTte4kDkWdOkCiZ/LHZhRGU2cVg0HqgaycGgXXaL90UnjbGRu8THTTWDormmCn0yUAGNfvekMeoUDIiWlIs2h5exlJYUjNfrGcyP2LzRJkUTtQnJJXCd/r8PfowGoilVte/X1D3s9wWyCwhdvKwd/IPxyiQIYhIDGQNmFISArMNPPWO4HXuFweOVeYB+LDwCiNON2fl+5xJRxpVAmHJJJkaV7rfEzd9foDSwZ3IQ0TiUJJiGuroTo7Knw/GBqFgxsbYIJM1YCX3/72If6LIgZPYCANDcmN57xmjj0OJv8x5SCHRjbRf+jTxHhmE/Qxby2voPN+kNlJty3Zj1NB/EZVsdn4B5y9fQuPwLKpBhbFAQvT4IPcNN/+bSPDnzgbepgN4hP4TeyVPucGYSnK8fLCM5PEqpvsZGmQaxyZhjqVhMczJ7d/g1LnTWDjzAU6eP42ji+9j5sgxTDVnOGOaqivaP+NpP1CljO0gIuqQPMSCiBtrOti4AVK++UESIPfwE3o8Bfb3gEEP289W0N54gbTVZj+COCLjzhpsGuDV1g7u37uPGzd+wspqa0zmVhmrV3IeHzOSSjeUzXeElpqZGobU/FQOYxDPAc0FBLMnYCbnYerTSPwq0riBNA95kp9x3CWrRZg55KWUS+2xuzpTCCmZw7PIfMsZ8zRcMJUJHgpQBjalH/uTZ+GlI2SdFgb9bQy3V+H31hCla2jEXWCwgZpn+Vzl2FUt8h3+IE1yWggGCKGgIvPB42e4fv0HfPvN17hy5RPUmnNIMtoLWzBegqzbwZuVZZjKJOLDC0BYAx0dQRj/R5SzVJAccAaXWWAAikx+seWx6I/aiOoNnLt4HhcvXcad2z9yKglSkZ1QOU6O9WTQmLWHqDZpmNZnSrxtdZG1uqhl5X1iubnMXDoDDeomDT69uoT5hUWA1iaEgUX0e1kG7sw8aPKxH9v695+Xrv2A15OmIZVowjRBb30NW6trSDsd1KMYg94Ane02fOuhYmK033Zw95dfcfPWbbR2SHoEUTob8cfJVW/pqQx7aEVmFBgxXPQZ6feYI0Islp6ZRTR9AtGhBVSnj8LMHIeNp3hd0nCgn5IuOeJBJZdH1nBGf+aJZCPhwi3iVr6woCv2snANDBvZedzsJY6TDpdgVBmX0HmAHjVv1XmY6hzC/CTszBl4vQ2YnacYtVeRtldRzbcpxFOHAONxaGGpVtJIJVwS+OwlRHVGCzl+f/oC17/7Hl8sfYZrS5+jMRXDmgyNesQMgHw4gkksVwTd6lPUjizAn6jz9RIbgP6So/SKvcv/NwQoYl+NsBxYD0xs0kxsGU2aI27W8f5Hp7D01TWsrD/Hm80dfn5FZLTogB19zlJUajwcInnyBBPH3sMgrDGd3waWs8bhJFfW02Yt3beLjdZM+AdjaDY2tiIXs3sbB/YV0ud0ria5utOsxu0lCU2MAixvbOLOo0f48PhxNChyOOuj7keITYxo6hA6/TY6vS6m6jFOnjuLsxcuYP2vJ0iGCZ+5Xkk+4d43AZo2zVELDR7cvYfFjxcRzdWRxkClXsXOsKs1SYpup42EKOo0TPTGsj6j4nWvxHQxziOG/LXUcG0qrGK+OYPV189gyBg3Hw9Tjfog0dCOGGG5usvHJZksewqMcqVpy99lCbE2rRQRTpHOeZDitxcP0f55iC8vXcXJ2iLqRuSr9p3GOe/+9a6eFrtPxTEMJ5UiRf2N8BJvcfPhLdz54y5a6Q7CmkGF+w1Ze+SBxQCdG1uqx5TUk4H0Y5UQvW4PXiQpDX4YcA9Gdd5A5djQvsSBOw4gy/dGOGtC2i7WmtYgdNlcq1gffiaDwWbYVLDlIBtg/ZxLzwPLwzsZMK2/foUe9TORyAuKGpzYmqMhy1ADTdji11G0vMzI4xq21I8Ik11M9nYlkJW+HBuA30/peun/uVqV7yOlrDGLTDL32Yti7/BA7xvVzrTPCYwrywD2gnViiC69owMYGVDV/oD2DX1GzkBQGO+7JffudclnAAD+BgAA//+8nVuPFEUUx/9d1T2zM3ubZS9EZMF1CeCi+CAEDcEHn3ziRb+cfgIT33w0JqiAJDzxIpIgorvLhssOLHPr6ZnuanPOqaquGS5RQ6xkA2HJTHd1VfW5/M/vxFx/bLQ3xjnzqmP/d27hZ417N6FUJ+EcaZeVdhMyLZMwAd1f6ardnagBjJf303eQSkCUBRVj4IUF4ZwOVUWc3IIM6yGcCiFn8qdcH8PkLCWfvtORKjkbmxe2/jsJMq6FLwHgavdY+zYSjpfguhPI4hGCuzgweuJ3cJBC7fqQWyk3dykofa26A5r4KJWp2AIIIkFuMTCYwwZeTFR4SYtTZyS1GEOuZclZzl6Mx+yUUtaHoCg+KxqpyXDzvxgORsLke6UwoGc6kyAzmSe+hvMwPZxChObcGKmLies1+3K0PAmroCimFrNTonAAKB0Kmd9uOPqT1oQxjj1R+nsMM9M5w71kU5FjkFvGAL0oJDJddQ2ArTki559r2Gt1X7bglAB8gJRKDgQGiGmvrmH5DtXmUGROi2EdDq8s0RrNZJYDUP6ZFhaoZ70wFyArTbU2wr0XWQBRGMn1/89Jl4ISFuNALZYDQsEPqiMzRRX95fU2RfJXUwoIvr5CggiFKytSkVVl5H59u708wQQxhWU2yDlE18PfSwwFOvRssE7Wu1uzrrWfMBTy/gg7t+9h+OQ5QXDlnt16cd/jAFFK4fTZ97Fx8gQWWkvVC8ca3VT7TyLqPXRx7+lDpFRbW68LGTenThka/QcP0blzH8l+B80xkBgbtef6V4ORARqtGJ98dgkfXbqAzQ/fkdq/7gAAIABJREFUw9FTG5ijTgM1MoxFCKdKaeE1OewL0hmDyuWvJXqtbKu1Vw2uiWe3ZgyMUhw82EGv/Rh5b8BBvyZlcMsY436Bx/tdXL1yg52jTicVUm1ZzZ15oWmTzUdYxgAZJrmZRc8kTC0vGqtorGyitvwOmisnkDXWkM+tYVhrolBEMicpdmlbHhYi6VTWU6IyEiW8BinfyK3o0cAodmNhKWOcwaVpIqM1SkipRv3u16GzHpqtDejBHrKDu3jU/QONpIl03OYihLr/TMEoTVd0l1YZYE0gdPo5vv7qG7SfPMXlLz9H69AcTJkhL1IhzmcZ2vfvYlkpNA8fB6L6fzpPJ/ZS9Gr5YjhKe0aRgomyuJun3sW5C+dw88YVlPkImjLUZcY1uAUEzCpEr0zmjfZmOpxgJrih7UxQEKneUDh/8WOcvXARemE1yKLk9CFBMYgKDLs36+B5AwnC2aBSBQy6eLa7i+F+GxEF6xFh0E0x6g/RSBrI0wLbuzu4+tMNXP/lFt96nEgXgDKSwHnhefg22wlpgUe1+WMuoyHmxxJ65QxGySFE80fQevsDqNYx6KUjyGrz/DNSwuag7hLs+FN5F+1TOXDkzLdTUnA5eCn/rhxzLvJcDXgYmQvoR1UPeDiAnz3/I2Fo5AR3tPSHxtIKotnDmG0dQdzfQ/H4d6S9baTDHdTyA8TlADEpY7jXupnMzEIMbiHRWw2VhUI+SoFvv/sZ3d6QAwHHj63yNoo5YFBwgLkcpujtbnPt9sL6OvTiiuxf79CoN742Xjck2BAx/DJSMj8Uo6Vzd36thc0zJ7G1dRpXf7zJ/j4R7iPfaq20SYGSwa3p/j6yv3Yws/QW4kS4UdO7VIXBlJcME708ROYG23VTZnClBHL0f8uncMxmVkuxn8Xn6/Vfb+P81hkcPbqAOU6m5CzHbxIIugE8H3T4ec6vLWP95CbmWosYPcpY1UFmAYFNyyDoqy1QkoIA7d097P+5i42VLaSjDHk24nlwZZ9k0z3rPMPq/IpndACeD+xbLk7cn9MckZ0UabQac6wCIJJFPsy49bLLszAZvayCJDrWE5wUAVxWz0X5tRzMMb3nSQlQdHD7yR1k1zJ88ellnJhZRzOaeUUQ838epTA06N2YUZAXKdro4PtbP+Dab9fRR5dfNWS/UHK2nsSs9pXE2uuvn6XuuirNjCxMe2QdWV8uGSxkZ0/HU1yzl7WDdopbhn/y2lR8pi7WFzGLRvCG+CfvOFEcD6McB53n/O6nLly1euV/0p5JagIqzcfjyo+KKnh99eztzg7vgcD2MQVBKCleJbdDpzxskR9+HsMRA7+VifwM9Qs66NlkbRh04MSZUwUzoDTQJnKLcKtc5o+eLJGetg+cf82KCPJlGb4vrR35GpklV0O/34PWGn9zdm09UhRR+Kvqy9x2mQEmQJa9EEOCXMQH8MEYJDGoCS+a+GJiYoy+GX+E/wgfjIlGH7w8KEZBJcYoiqs7AgsBdmF2pme6u8w5dU53T89GEifpzO6yM1vUVFWfy3cJzrz93PtsO6WJUVHV8AEZWQRR8kUwebVaC9Wj3fkqZSae9Vo4mHuI/6HnYacFbIQSjMylZWKsUOGqNdkuHWO113NywFJSEUsiZmqv8XZltrBScDLpgRQgVIVdE+/SUcAyRJ/4FJTYzwieZWpJop0CU0Cj/XgUEZGJmrMrF0x9UedVDYHKwixcC6q+/66AsuvPlRceBMHMaeqEe8wHL+s4eBtGbqI5w4fqSn8Jq91VRDbyVf5KeF9qpJdiWag9u0r4TDeRrWQLm1sDTGyCPHaYmkyO34o3rp+Z4h08MmTqYfJ5qcxPf1WtLbT3w0qWIugH/Z5FEtOigMK++gYi+lJC0AOpELrK/OhnopAfOiCI+8oc/cAXeGKhadDmrtIXOEHOUikE+YNHYUNaCOACkBQn+HeUKiMc/yo0X8fUbrbYnaI8ACoQIKZpGFH5lyog8/DtfOKv60gVX9SD1M3CiW3Noszvl6DgTrG1phxgClWa5dh5hddcLtSSllArs2K5V67tWYoAJKjh97d+HyoFBMYf5mpropQlGNHeNmIfQ2t7J8eDG7dw7ZOv4e6PEWbijiHcwqBYUeyCiXjvHrz02qt49vwL6Cx2EQVqkBX4TjuADSS4ujXAT3c3sE083EaD/VeJV2kePsStyz/g/lffo/tghHaacdHBkogWdZobBr1DXVx843W88tabOPviBawcO4nF7kHEYQ+5aZLmPiLCKnDA0QZMC862+JnINcY2ANOEJUExJux4bWYrqfF86FmclJyUkUgeRlvY4u7oX8h2EgQuQLvZZqFJCuZurt/B5x9/ic8+/QL3txNMffbDz3lF31xUdrgryfNoypOCOqJD20faPYFg5RzsE+cRnjiHZOkUkt4aho39GIULDJUeUaeKkQKlaRoHcloAEciBs77jmjM/WRzVTUWdqhZAstMEJ20hsoA6JRGmzT7QPYKstYyJ3YdJ3kY21bVgOCVWdEz1oVrLtrh81+mX365jfX0dx588juZiFyaKOfCmRJT80QmpEDWaiJodLihWi6B11atdSC7zY/gPKypyqfFz4gtFXLx0QKfTRTIc4ecrP+LOnZvwuJLMK28b7+rDqCDyd6fPeDzGlDpBVBx2EHM5J0mgh1AS1DlatHjnvXdx9vkLCKI9lbtDqm7hM6Mv7xT5rv9bM+dgUf/3WW/y+mtprl3yCNu3bzKlxYwnPP6MrP2GYw44J6MJBuv/4INLH+LylV99r934ghV1qalzmnOJSYlCovhMy53oETmdBQvI4iXcMyvI+s+gffQiWsdeRrZ8GuP9RzDsHMK4sRejoIGJI7VxC2rEpkTdMwquNyywSQUvvRCo0KpsV+fv+bbQos/Fxsry3mNushGEsnC/jSZVBVdbVaupGzbhc2zcaGEcLSLct4asdQhZ1EeaR4gJHelSgbpnkjSVlxDMAZuJjanXSaD6wigHbtwYYHMwwEr/AHqdBTTi0J8P1ouumTRBRq4/RJRoxdx955E6X7R1FUvL3R7/3wWgRDJW0pjyK5lSpkFwUbeFZtyAGae4dvUqtndSprr4wivx960vdBLaDCmSZIwsihEdXsOks4CUbIEpWHc+sy3N/pT4IK5VtZ1hFGpdH706feyi76L3bdrz1kU8tky6o6ErC1i0PxJMMRmPcGp1Db24gYiUKsTJixyKptmE4ySyeiQ3h1vrf2Pjjz8LxfW8sBbW4VimdebO7/Yk3cHJM6dhmiES45PpXFBGbpqjE3ewdHCZk3nSmAid0pGsaJeIwrvyxHWuRFV2aMe4/WATj8YPGe1kQv9zncmMi8DSdNB5qTw8mLO0f5tbaZk4NYU502TJ4WBjMMDy4VU0o3bholGuqtn3f9zqfFxaW2mVVlZE5cWudOOiz3cbO7iLbVz69iN8c/0yHqV3sbi/zb9MzSgfe6Yi+L1LAcphxsefveRj77KVCm+9oOCGpa5Vde1VG5qKnNbueZ3CavwGkijFYJo49Fo9PH30KRxo9lESLv9rBsvCDZ1Bm8N7+O73axiCkLUpvCGXFzdmyoM0qSJGm/s9z8m1y6XjX0Geqs6T5Ce+mezj/jplYu6zE9051m9RPTixLS8ss5WSUImNq886T9q1p+IFF2Tk4nyPciS275M8sab5pt9z4s8ODuKgxo1M/3e4mSY2h9roDsMQ/wIAAP//pF1daxxlGD3zzuzsbrZNumlLpK1FTdIPBK0i6EUFBS9755U3uRNB/BH+HhG8F0RQFAVbpBc2tEkaabJp+pFsm2Y3Ozsf8ny972xSq9CFJWQ3mZ3ZeT+e5zznOSe+svTB12NGHUJlUPqJpQpIFUj+ML3xJsAHrcoySBAnPmk7HKxEtcRXfAsFYLBBU0Ui1FGUxUTim9doGK4mZGY0Z/spSVlDbeBSFoCrrAeDNAjGmSbmlQgjKOOAvtBIFxypIEuvBN0ASngGg4GqIMtSnbP4QgAKjK7eSGSXMMVMAxe8qrwO4Eit7kRsMYgl0iAj8Q1LjrgPpyy9DmJUyTHZW1MZBXHsfGJoPSo8Ocrgce/vmZluy4tiU+fExq97bAaLJ+fV69wsgxBoWYfIOfXNyx65iiJlyNEf76LXv8feo8NioH7Ak+jZEcRfZ36pdnH0AiNwxD7xNhZiiWfODQTaNLRfnAY7MVLE35IqkLm38oh1Mhpgwy4Vh0CYvAi+mNaqYieVqPWjnT9NGktYRWTPMUAUKyBm71mfP098Fe0wtox5rGYcqFcT51OpXVClCvdsNxUntQVKUFb+rDKI8hGgZvPhSLJQBV9cVJPAByO2NeHFACglXgRF/gl+QfW9/7WHAHiChtqGYW0CxnqoFBCL/fUcBoXCd8AtSMqGsZFHoIgsyKIBwgAK0wVp029wCYTo/+hnWPv9L2xdv43GIPcbtobJnuZKYUoWVzhz6SI+vnYNF996m0Up1ViSkzbqGN8BcLd8ips7m9gc7aFsNXgjZt9Zwhy2HmDzl+vIbtzGzKBAhywfUbCjBi0dSaeNz774HEtffYnzl99E0ukidxSIHWdWkUNLzz9mReXItVgdXyy5HLdhWJMNgQGqwa5PcUyOIL1nkVbVxMIKSv0fsWrT/lYPvbvriPMcLUf2fk1OTrODHKu31vHj9z/jt1//wGAgawyBIyOyJCWvdG9nBqgPobeu4o7iqI1hNIN+chru/HtoL3yI5sJVZHOXsdOZxbPWLEbJMeRJB4VL+ZicLiodlJwuzEaKAYBKxq1kYDqeK9+MoP7ylUW5E5tN5JwHK/IoZjYZeaZnaRdJ5zRcu4tkqouyMYVBQYlaynaHQed+7NPVQ4fm10gUi0CR3uYjrK6vYHHxIma7szKPOcDIxCqwKNFuT5EPku4DtYq4T3i8a/3RBdF/7otDyAllC9IAsLYwAqLiBjbXNnDn5h0/A0oPakjVMlIrTXLGGQ+GSCmoqeBt40odxxS3EwDw/idX8enSEk6dfYPdHCIed0VwIphI5O33FzBU/leIHNWAAF2TImn5yPf62N28h6fb2+TTyolGMSrY4q8aOxSjCivLa/j2m++wvLrNs6ZDIqkkXFrJXCp4/oRWLzaso2QXKYZlG3uYQdY6i/GJCzh+4SN05q8iOnMFe61XsN+ewX6jgwOXsvhjRmyWQtryaE0q6jBSKaKQDMQq+4p6+WXcq288VeHVNleo8aUmygriWjnBlf47iURmWgesjrVImAa0BxMQlhPA3jyGMjkOtLpozRArYA4uTlG6JoYFrWsJiyonPKsRjs0BuADYrbZDRozFRhBgffzoCR70euhOn8D09AyaaYvQeWkpZapqjiFZZx5kkqSQ21JlaZ6CAP96918OADg6i8NxJTYYSxzLAIhDPKrwcOs+VtY3+PoE5Iy8Z32qhRTuqCIgbe4MohPT7ApTOvi9LhQbglBn/TI9KPGc5N8/lH14WJE+MkE2G1cEAjr5LfF2oTr3mg67O48xd3IWC3OvYYqtH3O1MHPqzkWAZYpW0kB/axury8vMCKIYrF4Q4vNIHFP6S12Snzx7gsVLi2h0OygaMm9kqSZNDtKHSDH/6utoUkGG2rkiKbgFK2YHBNdDXZPkGog1Q4Wk3Wd99B7eh2s6Pr7tP6H5IRQVXA3uEcJNSLiMEemjSlE1lSJFIjQ2ii8pNrvX28B0dxonp7q1kWSAcVjhXhYACHF1vcRWTbzDrTiOTHtL9IpH+OHmT7ix9ieG2EfSrtg1iNwROH4uRZOM3D3yPJ+Ioe3wEwCAkzFAf5ayjWLuc5NSC3KeHWB5mFm+O4ntzH0h0SSz/ijzwq/yVelwMMhw7tQ5vDv/Dkh9rPkf6b8HAHSXoeffuxu41VvBsNxHkjoWIq5MYJ0LgQkLPwqwWvi90d//GgBgea+MoUD7t1zreS0ANv/ExUzyCv6smvB4SMrl/z0bWQto1hYhrGdZaKz9IMTHYglv+STfX43F620BochJrA+x/DaBcdq45bJFf8zOnQtrAP4BAAD//5RdXWscVRh+zpmZnc1+pLE0XWz6IdgKCrFa7xrvBBWp914KXnjjP9AL/47gnXcFoYhgi1itFpu0TROqaRvSpCbZzc7OzJkj78eZnbSU6sKQQLI77Jyv933e532e6MKnF78OgnXcIxFN7Umk58NpP4MI/aTtVHqKSdwvjjh5lZ6JiN8r/b/ThIsTA500VG0KB1XVUEilz+qQB7Y+5OFoxL8zotRYvLF6ovvGBkpJPyFXQfk80eqtDzGqnYYYYVCrRkLqtIzvdaF5pTuHJEsADgUTmEop/vP8Dgr4qFeZKIctSexa7VTt23Rzg69RocAwoMHgFgOjfpzMExSkv07mKgkKSq06B1/KsHhrhkOiFnGJTB4TlO1VKb4kxWf6uwaF3gnYQkgqHcjnzpxFj31QpW87Ub9jsXLzda9e2LSNelUq/4IpOeRx/gS7WN9ex3b+mKll0oPv+RBghgZVwZm9AAZiaF4lysII1HqPwChxDZqMLiAnYoNxnQgGpkV4T8mfTcFEmK+keVBqoowg4hgdBgCsLnoGT8I48UEk/0dijQGVFi9by2wJovETlclq8h8SXtYUYPaBqmZXBFB0mEnDa54Xs2NXA6/ii8zm8AKQ8fpRcIp1OHiTVlYMAw8TAYAig7yY8PeknqfCFbrWZNMhZeia8mZVW9dIOwJ7juv4MSHTV/XfWT2V1vlMKl6qZsouqHvAnupnalbyrf5/YEqYYDmjbIHgHPC8VwDYgs2mJXplLNUs0k5wKnRiWe+CtAnAifN49wBpkWCysYeb319Dfn8Haa6oMVeXTQ1wWQ3LbSfFO+9/gHc/+hjHBwO23KLkLjYtHucD7v0HlrMdLJMvfzmhpnxUieV9sJWVKFY28ODKL6hWH6GXOczRWqW+YUjStHTpEr748iv0T5wCojZX8CNO+q1YrBlby5gJLdXUF82zqk7ZhDzr6qA8JOU5Sj/RqggpF/QYOGAYg+zwTIZiewsP767C7Y/RSbtIEupVK/Bka4i/Vjbxw+VruHr1OlugOe77NVLLNdJmEdLX0K/n+BByqKI2Dlwfw2QB1YnzOPL2h/DnljCafw37swPstzoYE4uE7TpjVVUXv2prCcgTAJerZpB91jR0RTh4YQBLk36imAfbOztNNK2a+/G7vO4b7L/PG4YoLxoRbkNrBsXMS8h7J5F3TzKVu7B9sYbjSkWuTuiNEKype6AhPWHrjzZ3sbZ8CxcWz+PY/FFuwaJbZNkQ5WSEosrQOdKFp7XgW4hMoiwH1O0MUvXyjQuHrv8SQob3WV6DhQiL2YpVlrceDHHr5l3s7W/xGRDVjgDij42CrOQymKJEzLZiYbaZmpZZqTp+b76HTz7/DG8tLaGV9nUPCdr5mqjWT8o1ABv/3FDZHwrjn73CmCKA4UYCmpjuWezin7V7GG1uojw44EoeifflmUNSJRjtjPDnH3fw7Tff4e+NbQnQqH+/Uv190jahAoQRS0keD6qK0rlL1VPTwah1Cv7YIqIzF9F94z24hTex3x9gRDTZRAz2JLitWCeFe7eZDaJtfKWHraTinRgRxhWravrp6qoMbd20z8dsoq5ClcbJ+tezmNe4PkrrNR0xVkE5q1fEc7BS32mWELJGwVx5fiUJiMYpJq1ZFP0FuNnTcOlxbssZH+wiMY5ZAYF7x+2K2m/uSk1slXXljWh2bO7s47dfb+D40QEG8wts3ykJhAa92RgV9eaWOVsxg1qAiJ5KQbvx2vpQKRjga15TU7j1/718YyU115RR4EHI7EYTYRqbtk3QS2cwHI3x409XQY6QEaaJA3dqEK3aiwVyRm0zs1205/qoWrG2ehhNPKde9OGOnHxUvi46ISTqmgxLzDf1hpfze+oALwMvY1gpMCFzQCubPuyF0+dGhYRskmNcVnjl3BkMkg5iI4Jg3KtsYtaHovgnTWPWU1lbXcGD9fuHAAv6TqW2fzC4rAwPbvvotHHi9dPI40o0NUSpku+R+AgLLy+gHaesnxHiA0rupbMtxNL6nBpsRppbNAvHZY6He48x9hOmwbOzlVb8jVKonbKYvVFthVDtbOQPRp8Xj6OOA8Vx0k4hPvgE5HIxi8789dtIuikGcwPEzLqzvEeikbu8GAB4muH07OUbMHDwGDEB3DYGGdU1kGOt3MDlG1dw7fbPGFV7sC3SZGrzWEQat5MmG7kw0G2pxZfnreLolpmx0vIaWVF0ibTSLIUg0QRgvTQWb7eaHwmtnuPEGoCRHgvXEKYLZAWvgus2OLMZiS2ZBR53sfjqIs4eOQ0xAXzRS56GwL0GQ2S4fu93rG7dQdy1zN4xttEaTsUnJ5aDVOglfTtmOSRWhe5zZdVRfqm5qZ6ikiPId6D4lV0EnhJ1DzmmiM9TzE7fsQkiSJ5Jz5mZdiSYTRbkzBgWd6zAPufYnT5HwcgQRwfxcs53CdOhij2NK7u+Uc4pRV0ppodMbJojBXCMhb3VpYlziLq4SeMZw1jgXwAAAP//pF1LjxRVGD33VlV39bTzHhl5SAiSIEHdoRhJNHHvykQXulV/hj/JR2LCxrhwY8hkJMIgGCEzDIQhMM/umenpqrrme92qbhBi7IQQCPTUvXUf33e+852TXP7qw29N9CBNW6wWSDSKoEIctiGHKoInPfSF9gS3omCXoAt+xAHA0JDm3zVp9kIzBl8Ig8NBXYHUhNcOSaMhYaSSrAl8GVR7wKmYXqJJdojAgGugpmZFZqyCUhMaQ3RY9NBJpTVteF9WDaE1+7D1nNKS2QFBlTaD/VsFP+JhEIyCLainCaIIqmYV8PpgCSxql49RcLwiVaUkz5WALMxA0KS/pptAkorYSgAOkuiQG4YCxeEQnTTH4uwJtJEj93m8rOxgdtpjVt+lRsdRmIgrpUM8OniEtc1V7Fc99ssh72JbQ8EWPQNDUh3OeIOVvFmzNIvzHwNe1xyviwrjZaP/xmuSTGMnq5m60lxpf7pj39z4Z1Whr5pCdN6PXg78vXU1XYQ0jPKURh9Qq8RTklo0rAm5DcbZ2na6jiXJZpsQn/ABYnuurW0xUIZBFStB9kyixcHgHK0PZ0BBbcnnLNjT56YDvsUAk2PV4HihVvVe4eCgrEZ/1lg7As8ZZD8Ktais57Exf/V8+2e/pyEManuwmdSM9zcbuGP72ebSWmtIu4J7/3yi7UgdUf8vgPaRx/1rK1i/dgvY6iMtJRjjhFUXsNTNS05ZFl4/jo8/+xzvvPseZiankaoFp9NLgXz/76CHm08f4TEJJhF9cnKCg1amv232cP/n37C7fBv5Zg+zLkFOlyj7HQdk0118+vU3ePuDK4TUsR+vIxsyjBVK/+0Te0Qd4ggCNAkOauclBmaVeuwOOVlPeSzU/1/1n+Dp+hoGOz1MZB0G9A77Axz0Brh/9wGu/vALri/fYrOEIwUbmOqLyDzkZCO1J6E7gujNvotB6xgOuufRfuMy8jevoDxxEdvdU9htzaGX5BjSOrFLh6z8KtvWUnPldLEUYS4OlLz68iKYYpqArNZCFL+g1CZ2YwfUIGU9p+NlMwmYSZ2/8DmK1jTQnpVf2RRc2mVD02qoFGo+O8VDGkqikqDPy/N6CYR3tvq4s3ITFy6cx8LiPDND6N4h5hn9PqiI4dVF2p7gCkiwh9R3OG5D9OznZQwAG54GjcECtFIS0fAKbt24jdV7dxksSrWP2SuA5IMo3BNQa3JMzbSJQCgCeMky69JHl/HJF1/itdNnRUdAeBbPSfJtcY8zAp4XLr94fE6rN1CPajB7rQDKfWw/XMP22jr84RG35LTSHEcHFVf9e5t7+GN5BT9+dxUbG1sM/hEjojCkv1FlDDDmlRP//qSD/WQKvfwUWmeuoHX2fWRnLmGvexw7rVns69qmnn1T4Ki0CuSUWx4UvBYNFxWWdQK4Ol3/Vi2VKrMl1saMqmrpUmclUrVxHElnfVyTkQUQdJ15aZupnAEFcndXLmMWErlyHKWTOMqm4bvzaHXnuB1iWEiiX5NzQ4wJDApj9wUthBjkQ2fI3Tt/Y35+ASdPHueiiBQjSuZZEOR00Ovz3iZx24Q8+VnZzQvDQJdHXTP/PwAARlZy/Rld4VIClLYXrrgHj73ePpaWfkePHDH0//kINNZcHuJJEEg8tXgM5WQHg0SS5ComPeAENVHxOltnzVVvQnvGArFkIO4OO+JsPM5EDU0Uzt6P9P5bvOn0TKAKeCtvYfdowHov504uYhIZOi5TB3Y5EUiHgs66Lmk39fewsryEwUEZ3zjfo8pkIgYXMziCvJ3t3S2ceescWl1ycmmIqlZgkdm5mXnMTc0z0BC1f9Sdy42JHDTbZNlGjRxkkoC/Ht7D0/4WFwQqr2eNEytEb3mKH41jnkf5T/Q8CcGAAR9jP2Y8aWIbMtKAKLCx8RhpJ8PizKtcPMso1sB/AQBedsmPyjwYzynoCUDlp30UWB0+wPe//oTrqzewW+ygO9lGu5NFVzCbO6cxm1X+xwmh4jym9HgTsovVZkl4CTQKKqhdVMMRj/oRin+l51dj3i1GZSY51FGAmaGBrTJmJmZx8fQFnOgsIA9ZBMBfNIPQXUcnyZNiGyvrf+JJfwNVUrCYXczrmq2wLui7tXyrrpIbg1TO5LH1wkxyaYkQ5wppB5BcU9i+xviV8WohVsfJrRCNSr/pWFGOyfmgLt2Yn+gKou8U0UUBr6yAzYULZbmzvbbakdO8UXxBRTD7+cbMlRxbYvXMxA89neuSR9h4i7LEPwAAAP//lF1dTxxVGH7OmZldFohUZLeF2IK1iSa9MO1NY4yN3nhh6o0XXpgYf4D+CP+PMbGJt6ZeGO2dSTX0K3y0BEpbSqHAwrIzc8z7dWZ2QaibNCXsArOzZ8687/M+H8mVbz/8gU34tJFK2FxP0HB2EGcH9b42AQVGR8eittoaGc77Jop2LN6rBipYFmcs/gc3Eh80AAAgAElEQVR1KaxVUDaB5LpXHgBG36bpsaEvx9GPTYtik9gQTJOSsQZEqOKix/dDV0SmWg82WKOFoR/c8OsMRHC1BtOeCErNLnL5gAwosOMPNXmEbVRs6qC1mjVFpgm3XyyNaKU/54JZadNecz2dng/Ww3s/EAdnl1aihoWIeKPRekpsdl9hoj2JqUaHM7C5mVQt4sDm7GwSpkWEBItxFMkmXmL52QI29tZR+B71OqpxtPtRqfETYnlXqm6dddxKgZRJyNAJr3+hEVOpUuhN92+fi1F/TNph67AMFW0nbilD0+v61wNIHHkAJA1tCpPYYKN2Ay+DUwAo5buC0XgQzHSy4P+hnhdMT1K2jdO0CbtubPrP60DPj1zsledDJfGojtk2P14HWRoPrq8yivgeg53K6u6VuOPzTSPVSW+uA46oAdFopN7sD/88hm6Q9Fraa+gpkh2ZWWb9IVm+mpagiGbFnAm1vcNpTm8mdUDuWfN//9ZtrP+9gOZByaVNDpnmOdU+0/nj6UMGXP3kOq7f+AKzl94zQBuZRnsSQeoFStzpPsedZyvokgGPL5Ey4i7T4oOVp1i/dRu9u0tovuqiRRn9RBPl7E6H8XMdfPX9d2hfmGO6PYNH9VP1GubwQpXVqY4TLNw5mRBKedAXKI5ZOUQBA2eYs7943sXmkxXsbG3Ce0rHyFB0ybG+j9XlVfz+2x+4/edfOKT0FSrQlTZcHmn+BXSg4ojM0Ohd5q1Z5FNXkV2+gfDOR+hNXcQLjGEnaaJPJmgmGiUpGcU/cR8gQBgbdZJ9pe0xzrTNQd1EKOJPJADcrgan/bJXwJQ6L9O3JTrtt+hRVI3QKQ+mPGfjyLM3EVgXPYkQWjSA5fNKVOgGmWZxc+hVDqFgDOvoZf/efLmLh/fm8e7sRbzV7vD0k5Yx5aGTmSVPZpoZfEPcl41VYWv75MfrAQDHfceXGdKiiadrz1nX7Ao55tRKLo74rJoFV0t4iY0PXftJCT/m8OU3X+Pap5/Bc1pKIckqR9Cs4QlXdb0ePwE77d1LIVma9SUthMMudtdWsbH0GAfbu2imDTTSFhv6EcX0YLeHpXtLuPnzL1h9ssFrKOf5kR/8iwrGVKyOJvbdKHbSNsLZa2hd/hzlpY+xd/Z97I21scfGlRkb7ZlRX9DEHnYUJ3A19ToJC9yo9NlpPKiPl6xxZtbAgFY7FJuCKrvO+dj0hzjd10bf+9rE3w00tWLa57XodQquSfRjNN4zAwEnifeBTHipDsreQOvMJZS+jZyMDg/JH4CMI3vKgqv5jaieNpGY/Giu+rKfY3HhLtpnJjA93eFkCGIh+ESFOVQj0bCHzHFbDeoQUaRJZDlFrxGuMAKOqrr/z+M4AGCwyEgYGlIb1SBDHGLo3Z9/gMWFxwNwgUlnbEem89wrHUYmJ+E6k9ihJiPNFHQxwNbYDVWdYnWkMQRsr+TnTgUABhmg8R2aC/OQ30gykuGgLzyV7vY2znemMDPRZhCgqQxPryxBev34xDh6+12sLyxjbXmtEvEYAGDrKaI1OQ9xmmMpps+fQ54Rw0QQU8ZrnUfTZ7gwM8tT6sSYWTgZAKjOARm6pni+v4X1rQ0ikkUmTKISYosnl8QriegeHW1pfSGsg/q/OlZWB2BD7Lrss/EMii8+WmJm5NudGTScCGZr87ATH/8NANj6lo6wqMFsdp3Snb2LPhbzR/jx15/wYPUhdstttMZSjLQcO8ynWlvG9aC1mYuRvEMDGB0Qmo+UTc5tgEPn0qjiCFWEn23fR2q94GL/ZSbwZaiM6pyUAOwz5AuPuXNzuDL3ASYwLvvGKQBAlFBzZVBgYXsF/yzPY7/Y43sQpWjRPhuUZSCSUzXbc2r0GsqacaGkHaDWj0bwVvvW+vDZBrRi1l7JhUWiKsztqkURXzBipXNPQwM3Zh1QnVY1+uZJZkNCeoqaf+qh6WetBxEvBpGs7x/sqxeXxNJXUvTqeqkDGVHKQPVHbfAokfYqny8L/EvatfW2UUThb2fWGztNSpqmF6VqpRClFCoqUR5QhXjggSeQ4AFeQfwT/g/0J4CEQAogWgGFqlVbiTQNCgppktaOvfbODDpnzpmdJEBV4RfLsePL7szZc/ku9vVP3/xMBcpi8Rgh3jRRrdlWz6aihqadEQ4fBdaoCE1T9lSIFImzELLiS9EAyC568Tnl8VuB0sVoGTnWljdyI/78Ko6mfJRoA4f0OWohF9EMVmDUZbIy5N8hi92LDVoo2oPnXetiEMQCkQ68Ffg9c9DrcVo4PLlVqznhgih8uRAdAy/QkUKCfCFwbhXcCNkJSYVYFlQKoRHQ55OtB7IJhhdIiHI69N+cnM+4gBxvhImoS7LzgU7QK+LvOuw83sG5s+cwbaZFD+BQDp2Kf4VltXzYbezi/uY9bOytAVWD2g/RmSIYUoSzEcdRPaK9bAgrKptsz9e0tI2x2GBEf/5DUyO5aEQHCJOCTZCpsa4zgsPTJuKGFa1ZaeyYzIPelm2jpchUPZ101xha7mIHW3n4RnjtzJHiPW/i3jdxjfF3F2THmD03IzIj+vHHBo526fR30t9U5CsPxBpQuUspSAFIcewysb1846emRaMomGhZmKvAWtkXuYiLzcRx8iBOXeBCNAL0+GqTTy8kIRM2Mf9gaaSddd3rFFuUxx9BHUcbDyz8KLAmjkcmJHqKF0cMqg07HAssxnUDN3Yo64Bmcw8Pvv4R9cY2Ok7V8kOmNiwX3I5BNf8C3vngfVy59hbmT55CRW4nRhECwIDh/w7f767jQX8b6E2hoYsMoZ3IkcIXGN1/iM0vV1FtbOHYsMZcST7iDcPCKAE8vnga7338CaYXFnjWwnB29Rc+XPwXvpVHTsJYLZxT5hPxPZgDP4nQT4wFihsn//Qq0q6AqzHZ38XWH4/YIo/oDfWTGs1ejc21P/HtN6tY/e4Gxo1nLj6di0nwCbgNKW5b2xyaBE/BVQtws8voXriGcuka9s+8it3uKQzKLmpCZxQdCRYRMkyfbbj738AEolBRk3eEUNTRhozu6bHZB+wowslDbn8m6zctLWnuaeNJj2ea9oQ2K35mfUlFfQVf9uCqOYTOLIzpsYIDIcsoQen4MTcCVDIwyORJS0k1DBw+GeDOnTtYXlrGHGsClBHxRI2i0T5bRs7MzERLR5j2/D6zuvkfDYBg0atmWA3/5g83MOzvw3qHIiliBInzB2fKbdkUE6PaAytXV/DuRx9icfkSbNVLLhcmWbhpGZ0/PtwAeP6bYAAZ4cL8eDeG7z/Fo9t3Mdj6i4uLynbhvcV4OEEzaJjzf/3z61hbfxwnWWXUCGnQJJWb9hsFFsmjyf/AzqBfLWJ66Q10L76N0enLeDJ3Hjt2lqflZfcYOQ1KzIq0E+K4UvEfY3cDyyTsBt6OEcwETRjxPcwEwYxFltcnLfyW4pIfLxH6k0IyOzlHz3fmV+5TJdgWlwrJbZu3eeCJb+oYFWMZGePLEyh7CzDTczyz9zSUabTwb/KNmBA3Vier8uzT2mH9wV2cnD+BM2dOx3yojNatZHPa1BPUwxHbnlbzswhlFOBtW1BI++twgfh8t2c1AOQVVCwJJJomZsP9ATbWNnDr5s8HwkmRUAAaXgxDjGtboHdhEX72GIh1xr74Su3xrY8AHy5tACQ+tU+5oRMEiXmOBkD7QyQu5poBRWCkJ3v3kSDkYMjX9ZcvXcQJQgBQbhPKBNGmXI1dvqZKPN3axr3ffsFo2BxpAHDxIc0qKwjffn8Hr1y5jKZnEKpWUDrmXAYrL77ECADLwoVW+09Hzm+el+lx7qCLfqdm67dRMz5QPBcCdeZ8ihID7xkWT45QbMmdw/+LNrq1h++gaPgBvYWCCXZMq93bfcx7/OzCYmzmFxJJiqMDpvz27w2AXPshCD6m9TOasPvQBLf6v+KLr67j4fY6XOVQTRvMHO+BXdyCk6Fhy+mPBax62Dvkklea32kNwD7+gggoBHlNhSjlXVOCaOW0RRsBoc032/c8mMMxTJ1o1C7qL3H9w4A3g07TwdWV17B0/Dxm0eUmYJyg/zcCQLMA8v756dFt/L71EE0YokyweFHFJ8cooakqxJ7d3qh+dDr5jueVdcQEfat5LK9GQbfS80y/TvD/g42iSHF3jPTL9e+0h0Q0Z6oDVBgx1jhawKtgvOqFRXptrAXjxD/muzH4RHaBICFY3DHS11jpn4fc6qaljQ4ZBvJnR7o51UU8SKRYqxoQweNvAAAA//+cXVlvG1UYPffOjMdO0jRJUWuSQhWoxCpAIKHSJ8QDEjzQX1qe+gYvLKKCErGIqkUpbYnVdEmTJq6d2B7PXPRtd8YpfQBLVbd4Gc+dO993zvnOYQAAimg4ZadpjkSaBB/j1KQJlQ9v7Gss1tUczz6ESP5DPFCvGd8SAebVsC/V1yhiTILX2QXnZBa+KS+O5ip6Euq8/BAXt5jjuZj/7rhpm/CTaCG4aN6gsXrakFvzbYvImBk6dj4xeqJo88xbdbST97XEf2qmf0p7G4KU8UlQpcO0ULm3i7PUmRoY8o1Ane/rvzfVErXEMmjTHzQ6whpLW/i0aMkYj5E8zV+3BtGaYZ5Zp3nAMEF/fx+PH+1gbe0sFpMOM3U0n891/FTAklLjvuBqM44D9HHjwU3cfrjJM0npXCIOucVYZq6TjOcZrfGzeXnMOIiW8c/272aKYWaOIv30MaFiomZ6ti5aDTmTOdbTxac4c2z+7TxjRhWgwA0s1SFh9QL9TnJzYe/lpiFoq1enVJFHugg4pfEYmqMjo/Eo+jfUa0YKMY6tVP8Dn9RAG39PBlNr42wGH7SxGNLYfM+ZLVOPUzaVOgIxafgfVLp2zA08HBsFsGuKm8BEroOmMYptqPHnNE7RH5c0h7r5Dxqf6RTM8Q3JEht0KngRooIg8BqSTdLpOs+UTU9khpRa1HGFztih99N19H74HeiPFPFPOGUEap7Fs4Mu4LCs8PZHH+KTLy7h9XfeZcY20UQPaohL70Ctwx0McXXnLnbDBGknZ8kv75GTKeZGFR5vXMeDr77F4t4QJ6lwKgNaJCf1Uriniydx4bPPsbK2xuZkbGCpLsZVnOus6qSGYEkNIcpBY9Uf5KqjZAGe9yQ8fDpmZo2QcOgMPLksc15+McC9u7dQHB1iPm8jHFU4fNRH/34f167+gq+/+R4Hg6kyD5KSUNanrK41nTTZDh1UaRejk28BqxcwWf0Ah0vrOEhyjOkmqWZBYirnkNA1VZAcewJHHiTVEZLqEEk4gHd9ZMkQeTpAuzVEng+RZENUYSDai+khklYLaauFLKn4OIX1TOKNkFkg79Q3oUlZmwy6LoqP1xemsAlOLbNpfyCaMssxzeaBzgrgVlBOPFrTPlIcxfbGIvFcZCelNSK8s//kEPd6Pbz52hucKMF7ALER5QSD4ROeu2svLMrreLmvHvfDePZ6Ds/8/2xB20D/4/MNYXdoJTmqosLNP27h1uZttBpMrlN+nQ31QmgAASGyMjwUkgMfX/qUAbP55a4yynStm3HevzX9dr86BuT+x0elxrZFORIZObl037iJ/vYjdHyusuK2ytYdtv/cwpXLV7D5131+55RBduhUeQ1INr5QTEOCIRYwmjsHt34RyasXMT59Hk/nTrGihRhqelpBLAwkxsoF8XIpJgV/z1U5RrtN++wAgWK5wlNqhYG8ANIRsg7VD324pOLxOPaKiTP6tBcSMO0YKLK54dAw27S52zADCPg6Tc8jGqop9SyvYeP7TlQsxpRRYa9j1CIBJ6mqzzhCsGjlmJxYQrr8IkosYTzycMUAqRM2n5zXbZePb62QSEomqdMKw1GJB9tbOHPqDJaWl5ERkSNaYI4ac2xyS0iuQ5K3kNA6RYPR4iGDgPqA/s+jbttn4S3EWo9UUbQvT6uxNCNVif3dPfTu3MbPP27wR3weAGCrfISA9tlVYGEOU0rNcjHwTsdqatjJxgsN8I29ur1aBZ3zn21GazjER2WBazDWdunN1A60PKiW9+Z+43AwGKJ7+jTWV7pY4ESKQub1bV0gYPFEB5lz2O7dw9adLYnophqBCCUlzlwEaojQImKswOLSPE6d66L0dWigT+U6eWn1Zcy3FxhMYv8KJ5HRduTHa494eapMNut0sNffx87+LoOBZMbIpKKr08C4tlBixifip8Mjr3BK5jRgTq3hEk0UMrY15fpKMtzZhZ3qFh84TaG385BBxO4LXdAABYP5YTYr/hkl5XOb29rZITTWCCnsCGg5wAgbO7/h8ndforf/N8ZuhPmlNtcPRKiBE7ICRxIbEmGmy/awme/m9yrnS2ppY7etXqTmv6Xu8M3Pb+OfQO3lVB9vzaJT/YcgKlSu5ej7pRq39KiOgPPdV/D++ntYzpbYCYmVFA6YvcKav4Ko0Z34N+1M93Bt81fsHu0iyRyXA5V6aHBcPSnStUY1ZYQRcZaSZt5CrDDlXst8wWTk1FTYlgZganQjzpp1Mr12O6feQ+6W1HdaFD3VrHX/K2pZAxtqArmRsMCR7aIckN4zlR6HgDc29DOFhvRz4pFFKlrpA4zxJ0CSPmO7LR4sRprTfcp6CPMrq0KFfwAAAP//rF3baxxVGP+dmdnLZHdN1qZpGtMEkxDTVKpVYhGsivog4ktfffJ/1HcfCkWKWBJqabEQa5I2bdpk77uzOzNHvu+c78zMBgqKgbCQy+6ZmXP5Lr8LiwAavoCF3ypJFm2H2YrWJXHirAQoGRBhBEnSALHjKzs+sllIAmfIOMrMnbdCgZALTHVhsQiEni7MKeNb5XK5GdL1l+QfYgOV47TQeIWrzx6PRCeQDZXOwRxfgxMYZB39wqZku55iwyaL3XRyhcOdaRfwNeU60/lF5Akfn4oDiXYPnRNXUmcU2IlS5w4/bfnPAp82onhxEWlgBsfjpQmCnL2bjIcLDWTtlI45STprtXHy8hgrV5bMQrJcYhKc0Mx39BgtMEKMHgZo6TYeHj7E4xePgJkEiTdCUPEwmgw5cWY/fRKmU3D0gzxFwW0kXtH2UOZUCilu2A3NJs6JwIxylo+JRRVwgqpMh1/U6hXD6pNsMdqFkxUePFdM4OeRKobsSCd8YpEoNF/oPcOw5ooUJICpVbHr7TQGbIAh1AzeDHOWfmbDNgcQia34rsufFKggVECqWHVWmhjiIsAbrYUh5RNxP8g+Q+Y/d8HKlUyoMB+m5yxFxBlA0DZ5igVU9rd5iFH+wDOOHcVKqamuarsXZN0LOUQIIi2bERdtpiBN7JZg14zvlTAcRrZQYuB+7K3dHSN53sL+3V20/yQrsNT5bSf2gNCWk0mJWnm2hm9u38bNL7/C/OJlHnPZXgYl721oHGCAe6//wpNhG/3AeEdz8SmJUaUC0csOnv5yF9HuIzSHY4QkcJOkoDC2zHy1BJNSgO1PP8Pyu2u8ubN9qjtWYSHNU2cerNCdMqBkSvjhjbmDyEIHOoLGyP5dwqrdSmWBMlsFqgSvjvYx7JyiQvvMGOi+aOHsRRv37+3izp1fcXzaM7rnnnIoibwng3kMFGRVMUpCjP1FqPn3kVzeQXLpAwznVtEtzyIKysZEzyhwshgb2bKlUR9+0kEpbqFZGuNiNcKNrXl89ck6vthZw3efX8P3X2/i21ubuLWziZ2rS/hwYxEXaoQKJn2SDnqdExYTZWuf2HbMXcc/zW6a8iypE1lWo3KFgKkv5ahohisPe62U3qelCos1+uVZhDM1TIYdxFTQtKaqJUmaXYgPB5yn+XZy0kLr9Stc3XoPFy82nRgeifNFowEq5RLKM6FZS77/rwsAb/rSU//D3UQEqJXq2H98iL17e8yfN+QtbZOsIgLAd7rv5ucUz8xcqOP2jz9g6+OPoEqh/V1sO9ey/6VT451+/W9JnLYiVhx3+Brd40OcHhwAozFqlTp8v4xKMINed4jn+884+X/0xxNrIOHxfNGOVV4sTlLnv6sVev4cJnPr8FZ3MLlyE/HCNga1BfSIfxwYUT2dTFhTI466iAYtTKIOfPRQQh/VoIdGOMDypQCbKzWsv1PFtfUGtjea2FprYnUpxPKCj9kGcYgHSPWQRalG0RBiJU1BfZor+gmEvJDQCwLA/UxN7R3FeywF+yyRzPOrjbK/64iydabHxYKYBHTJ/tCfQaW2AL9cZ82CKJ4YOCt1tFjONC1oeGvrWpKoBGOixnQjPHu6j+WlFVyYn+ezrBqUWaGcxAAp9hjHxsLZDxsskglP0v5UsD7/QwEg16GMkyy+ImQCWx9Sw0MzmiXt9vDq6ABPHj7Gg909xFHxnTynugBXTIjons014L3VQBqGmHgCk/cs/D8rqCm370iRDsVXeyafTyThVmrhd9MJs8QY8mmBlyW+VOz3A3TPOrixvYHQV6hS0qi1RZqkNilLuGHW63Sx99t9DPsRW1oSSiLWeVB2yp7zFLOMY2A4buHy+jIazVkeR0QJj2d2lXqljmZjjhE7hIbzlVARs9gFcLXvLKbhsZndaoQxnh4fIvUNdWlCxYtpQeHpYm9ur5fYxc8jSG2c5AfBOVcmMFrUNEWp+zzRE5yenmIw6mN1cYWttL0cLTN7JNmY3qwBkD+gzLwnAd4Bxvj97AF+uvszjroHQDVFKSyhXq/yWMiqOGDqc8DFa2swbQvO0583VUB2TURBwwY2cdcukdQ5FXrStBGRbFhdAKEXmHuY5RSuuCrCl4KEjmJUVRXXN65j7e0raHo17v4bhPAbbg9MI48Fr5Hg7/YR7u8/QD/psy1pai0gPd9zWlu+kvg3O48y7QKdWdgLkpbmNCfrVpPLIh+kaSn0benw55+vQe5klB6u39kGOCfxefts26hmsXGbWxphfeuowPfKjFiabfRKCT2/F+l+2YbxOUSDfS5ynabzb4oQRAEwbnWmqS85K38rD/8AAAD//7xdS28bVRg9c2c8Yyd24sZJ82hDXyptpbakpBSpPMSGFeI3sGLBX2LFBtiwqWADG6RSEC1qeYW2SRq1eTWN4zzs2GN7nuj77r3jseOkZcOVIkXJ9Xju+36Pc44ltQO1bn3EG1ukjJpY6fyz1rmQUXvChaU7QKc2yM93tOkNI04aLoQ20rWkXZikqdCLRcqoTxv9QRgmUmeWIj0wDsEb66I7OSE5C6IDdRKGdfKGIOzSepQyGt3P9zw/mUySAM1SBGVSOrAdaAPbVKkokfIomslCYU+iqkeReempaUvOg6ij9U/jYCm+A047Z3I/6Unr4OQ7cnK0cCXWvvvA4GcpQ/KowtIQoVxEodPE3OYctr6r4OP3P8Kl0iW0OcVrgA95wvo3QERo+3i+s4G5+Yeo+TsQhQiF3CCiFt3J2impK5WAzd0pFClM3Hf8EiNeRcF5Iqsx9D05PpmMUEzuYKOQ+lGn0tPkJ0OdI95CckWQcc6bh0jNyT7s813YduUosQ25CXD9yGaHBtc1CavTlAoOkLgdM9PxlvIFwepun16UtPAttU60QymJhAtN3ne07ij3hx8kC5hS3HzfTeA19D+69OvDjb2WoXwfksekPkt7b7WDwleeyUiR32kZEaGw7rpuur80h0F6M02TWB5W5EbbqWcpSESsZTpTmQVpaAynmCqeB+kAkKz0rf0GBiMDtY1dbD1ZRUQa94aJNvWn5svQ7aX92gLOXXwdl2dnMTp1kp+jh5B1jeMIrhFjE03M727AJfiKYyMghxGx6oaATYbuVhXuahmW63LUX9PUWIpRmrYed6+BLz//AqUTpzEz+wYy2UySKq15bc3Y0whU2eYuDKdkWCdFhzCUqWYcfRRqfWgjQIt3qqh33HSxv1uBFfoYtvOoVnbh7bfwbOkZbt+9i8XNCgsQsgK+wuSj506pZiYiYxDhwDhahSsQk7MISpfRHhpHixj+SQGE7g70zl7MEniUeeA4IfJDAYayHt48M47rF0/izNQxnJ0yMTrMsF/GjlO3NyEZtQ0U4KGA6nvHsVyOcf/xc9x+8AQLqw2Ud6rIOAWQ9pjXjmUyRCJ9JjpZAQdKjwfggHEtFQUMxXnDBI30J1vAJVhA7gQy8TuoV0aQrc8j76/DirdhKzw5zyk2ppGMAbXn13t/Ied8hU8/+wTFyWHWwybPk1d3UXn6CNM5B0ZxCiKKOoRtB8rh0nmvWmieBO0mcoUhXL0yw9rW5bUFhXvWZtbRDoZ2AFw4fxZXr70F0x5I9dv/UxjOQqnZ5H6pN7C9tgqvXoOTyXFkM2CnUxvtSgMP7tzDn38/Zv6OLOnxB17yrv1SyQNhoyaG0Dh2DvH0DYhT19EonEOcn0LAZ0AExyIMJ6XFNhGRtK3hIp8PMFJ0MJa3MD0+iPOnxjA5VkSpmMNYERjMAEMDgCNFXOD6QC0IUa65WNls4tHSFpaW63g0v41W20HQpv1WqgjYLJUMlnaTUBzd1ymnVVfp4enpdXJ0VY8gUw6kTJu6qXc+HstMCRhyP/MsE/WhEhznKsLsAIzNCTjl+8i0VmCiwusgUC4uTY1Hc52c/74I4EbAw409fP3NtxChiZs3ZlgZKLZipmEl+J+oVRFUKrCJlLNkQwQWYCXADxVDP7yITsteqRAUSsU15bqnOy7hOhp7CGpVLC8sYIUUU/a2MD1axGJ1r+vZhpLJNJTJxueS76Ox9gIjp19Dhs7e2Ey2HdFna9LnP/9uylRelomGynj9D04/oRFSOpCo769a/k5ltjFnkwHUmwEWn2/ih9/vY+zGTRQ4Etv5Pi9owhYR8hOjuPLu27j248/46fs7EmrZA/Gjv7l0x1J7eHmlivX5RRQnjvHazA44aNK6jQKsrK/h0qkL6BrO+EjrL2kHzUXiiycZw7nSFJa2nzLxNH28d3Yk5HyHdKG+T0REak7BoRTZMxurvTBG5UCMheTy2G7t4LelBzxmH858gONihPfTdFADfR25Ly8+5wy18MfuP7j1yy28cNdhZGNkB22eZ2x0U5QgAxEAACAASURBVOAu9aSMCqxIDqrD3cVG3P+dKDXcTmXTvqy4TTe5oxhGZ+7y/ZqyEWMZ7U6ybi3pmBgbPo7J0QkUzTwcSKcDB4XjuDN39bvqoY9JycBBCy3W/F9+sYyQlHWyNu8hQexzoEUb/wypFdrINfvKTKfvq8wNQPc/neXteZKzR60dsiGopRL+3i0LmHCBke3FmYhqfDR3AEPhZdY3j1PiDNC2cieDXvefhLeSXJ/8rkbDZZiD/j7iEKMf/R5SQlDJ6JMTju2hbjguPZvquY2GtKUZhqACeIaBf1m71p4orjD8zJmZvbA7wKLIZREVbbG0ivZiYvqpadLEJv3qv+uHNukvqE3Tj73EejfWBmtpqygowhYXFnZ2LudM877nnNkBMfKhkxAJ4O7snDNnzvO+z8VjCroZMEdanUFf26tBvpdTrYsThT6gNiPo00Ps76wkQP+8zwIANB2f6SYFygMtxASKLbhyDIWJuq4EXOhD0eB4nvvam8tWVCz9Qxq6ki040PnQexDItlQZJfuflakrUZK/XpY7nverP9YDoGhgZoG2KAC73ARD6MVFmwwWz1UXCGxWJxUWdHdLT05+tJqNbjFbk4GkqdrR/6PrSEUUz1A9ut0u+zdwVUvKnDKiHfSN2VwOwMxDO5OoBFVIP8XyxjN8eeUrNLwRNEemMFw/wsCsp0K83NlAa2uNv3dLAocmGhgeqnLcFVEX426M+kBNVxQNnR+5rCLbdePYg7UsBS05Z/ELG+clcr2Nvb6Jzbs0hZzMzBur0RcGDHN8pZF72IgSaV3vPReeMvF/UrtpWg0Ojb+dg1FI87EKc9ngC0On6RkzEEc/IJQ18+IM54ITJ3UUkkSzZ0w+uePYrYMZT6ZKaW+K2DyU8jli0jcS6AQOuq664q5yn4HcbM8syvQ5LKDm+0X0Fwu5T4Eh7+IXKt+yQFPCLm2ZqbJCz6ni05ejStz+gySXWDj9jWtuRJmpPgPIRPFwZ4kW0VS72duUB/YpIOMtQ12iYgxp/pkFE/ZQIUfrrQ6W7z9EstZmFTwMgyTlbrxrClH6OlFe89wH53Bibg7lesAFE2kAJDFcYsdBGxILm8+xGm+jRwuwp3PDHdLHRQmS7QTpagvuxhZ85aJEUaEKnK2vkkhn0JJfQRRj5c9FfPf1NwgEcPR4Ex615J2Yu7AUIqZ6HbhZWrg3lC4kOroQ2+ltwvV9Hj+SPzhBHR4RuVmDWDD20qMAxB2011aQ9bqolTxsrrUQd2I8XlzCret3sfjoue1JI0EKzyylYrf4kXvDsVNH5I7CH5uHO3YRWwOnEJbHIEUDih6wtEZRIYiidWQIobYwVEsxMx3gvblpzDYDXJwdwXQDqHpA3eXCPW84bQctoHPgLV6KME0x7NUwPung9GQTF840cfX3F/jx1we4eesfSBmgIkYYnHHhk7adxtCMe9lZuuszIN9soxDHVNhhOMrQ4fW9yp1xlm/Qd+SUPojB8Xm41QaiVg1uJ4DbeQgn24CP2FhM9nPedX8wRVcCP/18F6Pj4/ji8iVUAxdlioCUCaLtDlYXFzB20oc72mT2lTKgTBx833+gg0uwgjrnAlMnjuLYzDGsLf+hWcb6HfP31bau/ZXJ8hwSBzh/4UMcorxz0trbS2e4q85+uvT/8WAtNRUN0wjrK0+xvbYOL1Uct+u5JThRhpetNm5fu4PrV28y4JVcuEiZkeFbp3wLpIkZROZeBP79YUSHZ5FNzkM238f20AlE1cNQXgUea5UTRO1ncEUPQTnDQDnC9FgVJ6caOH1yAs3DVZya9Jm1Quts3UwtPw+tUqiIEpJyhrQssFmrYn4iwMdnjuCvxzF+ufEICw83sfSkg24v1WAkssaXWjpnS5iKy2XCaIX1M+dVAPUaQLUHhFrlCwrA0dkHQpNB4E6iEIo6ymPvolYbgetXEa7ehrtD5/bCFD0zHQ8HLSmiMVCe1g+HCXDv0TKCb3/AkcYI3nrnGBchnHIdvh+z2afc7CAqv9CJR4NDsA8WhVcB3quHASOZLPjdFIomSvSvAf864ehLJ+who1jC3g7i9kusLS/x17OlpyyHFDtdHB89hKW/27kvitjnHiXAUSGfI0o3aG2gMj7GsqVEYJ8CzpsL/Gy6nSU5kN/dtNCvpaxx3wEOOl9p/5SkXCUPoZC4cu0a5t8+hcHhCe4oOzyOiv/eExVEWQ+nz57Fp5c+x8K9B1hvbSBJinF1+nChC7lU7OrEwOLt+5j/6BxL5kJis1Z8uEL7oHR2tjA8XDPJPNkBxhZ9rpWSaIgAs80ZPF1/gpDYdkFJ0+Hf9BqF9DAbQywLDFLLuOSm4J4CADviE6giyUFZF8zbUQc3Ht9FGEf47PwnaJbHuaBu2SEcV4rdTbnXlTrsU4kYBuT2f6f1G65c/R4r3RWIimRwXvZLvMfthiHqAwP5WPI/xEqj/WOmdrFii03a4p7bYiTkJtkqlw6z6781ALSg00iShTGLpr1aZgAnr6WEt4Rmg+hGp+SGhedX2X9L9hTcRGBmagaT9Qkt0SDWM+3vmJGc8pxTe6azvs/MuYkMG9EWVv5d5Yhqih6nQohn6PfWdyDHXVmWb2ft2FqMK4sm6WRQSfGGBLxp70x7LNN0oj20MnHytim5t8jD15vnsWGCmxj9HCtSZGCOcXUceo61TWKCZbNzU408GwikG083+j39jIsHBrOxDJ3GKdXmglpKrGWy1sifZCJWRkD4yzZH6SukpqXBr77v4z8AAAD//5xdW48UxxX+urp7uqdnZmeHZbxcEhYcs1xiSCxZsmJhxVGiEEXKQ35C3iz/Kj9FWIpsv9iW/BYFW5hY2CCigBVA7AJhDcssO5e+VnV0Tp3qHiPLDxlptYuY3enqqq46l+8SZIuFhSfDTkordmAHSvwdFkWrDNKU1PTbC7DKiLqB/kOQ2jZZ8LgaxFYDypPk0/5tSkyiKBQ/ypaD7MThGouT2oocuId1WUjQ/Y6Lf2lhcLKubGWIJywQ6qyzEnRCZksJZ7M3Osi0QMjhbB88lyDYFwX31OkmH/CKu/K6qbiUVVs8gBQXSPl0scj481lPQcvnCm8nDF13X4tvpEUu2Gvt8obUJk4ONl9zosuWEMLX0YwGIMimg8s6rlmr2G5E14G8kMiGh+aGkgTm95eaQ8CgH3Ecvasn2J08Q/7YKqkWZcbXSvNKydfB3gjdvv1sgvjQQiORwoyFI+0DwUrIFBR47uAzTWe/eS0VmyBWeMxtKSpRxQx5nPRA0LyRH6nmufR4rK7YYCH1dnMLOzFfL89LaTiB9AjKRPNDCQtzaEgsLeYAl4AYytixRHHSwvwIcsOK3tpae5T28CDlXBILYgvDMMIiy6yzguNaqtavN+jErChOHHPiq1pIa83VePqyqvjWMzXpdoXvXjeFJOJB0zzRWqMNisZe0hh8y6+j/9Oy4Xmi7eBeARfutHDkDDtcsJ6AZ+0HvVCJnWckz3ppXQlocxG/U7fxsVuG8Lro390kEeqOaBgsOSQ4hABB9E2tG5hYE9T47aFkmmKBkgqmddCgZ4n4hnR/jZgLk02RL37BhAwhdIOXAemTGSb/eYhglqOuahFmo+Q/YBEfX7YJqv+MTxzG62+/hZXxmGGvHFZTkUpZusAMClvYx40n/8WjMsfgwAAlSYTFEVJS+ie6Rppj59ZtLLYeYqw9KG05uvMyZ451UabcdYloHI938M3Hn2Awe47Tr76C0VqCqFsjJ/SMSdHzKUnRTaHG7/jw4wBh0kFndQgvWkG4MkQv8RH1elC0XpYCMGHKiae1BvJdTHfuQeUpUMeo0hLPdvdw/dp1XPnyRgP11xIsazlsjRQAyLapIps/UvMf/AQ4egGztfNYJC8j66zDi9dYLIyKYyBERE4IlAVCfxe//PkBvHFujN/+6gSOvwSs+MCAzfXAhQYOjvw2eWSNB+GuU/hElqTarU8Aq2Pg7G/W8dapEb78xVG8/+FlTOYGe89pPcXQhgRiE+42+b7mtc7otdqT0FRxoYBTdOoMyBnEfv/U5VTW9rCWwqsWCKpxCRHpG5AWyOor8JMRyr2fYnE/RGdxBwEesoihL7tFKeUAOnSII72vFd679CmG62v4w8ULDNWMoz68fA/Z7lPMe9voJzH83ojVnllQbgla6/bLF+GlP9alUaI9056fzGnBPE9x7OQRnDl3El99/hmMrpwJo6gwew3K3MiaCLwaaQ2sHo5x4twZBFHMzgbkdd4mQcIzX6JBtd3LF/s5/2+ZwIo5Pd99jKfb91AT9J8h6QplZlA9L7F9extXLl/Fd3szS0dBwPNh5dcqvrMiucdLI0OISThCdfgcikPnUR56FXq4Ad0dwYsjFvIr8im6XobxisbJIyNsHOrgtTPr2DzSw0tDYNwHr9G+dD/dSFtouC8FOi0weQPqJ9F7yS5u82cd/HrjFG7e0/j71du48e9H+Prqv9BXXRTTBSKv4vtq4ggFyI6rB10nqDsDGC+ywSkFv3XAbhqV0UuNCiORluG9j33pXbHAaR+5d7AA3tL8CPm8ljVkdWo0ShMh6x+B2ngbKjmA6X2NYeYhMhOU1dw+y9LF1KqhsjPUm8KRm3fu4NIHH+Gdd/+C1fEQtYqhghJ1sY90PkX1zIPfixAMuoy6o18utGYkx48LAQpqk9BH3DSp2myL0IO0mLMU9XyOKs1RTafI96eYPPkO2XQfxWzGRTny96frSIoSh0iwcLSCgQmxffsptif7XDC1tsdGbpXcH89HmJcIJhMU2w/QP7GBYXIQO8UMfhTLzbf7iycaV2ap2KIkyXfNIootXPOLk5olIkT7GJkluHVbxOOPgiDzYJtRbNkn4CflWT/CzNTYyjQu/eMLnP7TnxFDoyNljk4YcDKqvBhhN8abv/8drl37Gh/99W+gmcjlCSelf3aI4S/DE58oYHI3xc6393Hw/KY9H2g/0sCCErgHW1gfrDHlEWJl7Vys3L7h4kAXc9cyloi/G5w+fBx37x/FrUmO2XSOqB8vqdeg9YxYCjMbaDTTLW3zgmKtWjzuOV6Bo4k6Kqb9uRb6EcO7CfFWawRRgGfFBFe2/olJmeKPb1zEJomHqgCKCk4syWPtdL9X5FguxNWqQexQvLKDCW7s3MInVz/Do8UDbsbRhkwWx9RYU55qGrG0LuLYxsXMaHFK6NyBlg6xaEBVxm/0lxz2kGHzEpMFDRXVJpcvvhrdLIf4DqwHPgQty8m4nLZ5nooNoOG9qyLHoLnG2eOnsHnsNPoYMt6EzpDayv3K3vnD+B3DTRCP3/ftw3vYK2YoVMki4znX8TK+BiWcf6sxZ7W6aC4pttZlgTCwdBQ2kDVVa/3I1WvSmBE3UOafkJAk2ecpzhcsOplc8IjuYeePxm+ty2mobcOXzt4ksgKUrNHlB5ilc9F5sxR6+iNNPsnPu+R+HHGQYKIr/FlNGEYkcIO4bbrb890i5Ol7nrfNUMrRGMElCHwlumJ8KvABZa0uqXhSA/gfAAAA//+sXUtvG1UU/ubOw+OxHTuO2+bRKn0kbRoKoqhICFVIFauirlixoL8PliAEAqmLqkilBSRCKtGWUlDVkj6SOLEdx57nRefce8djp9AumFXUpGPPmTt3znfO933HUcYJaT6rf/QQWmMJva2BJi0qA/KSROpgj1eaiMJQDsrKmX5SJ6wdJQ0IL4JxaE2K0UMzuKFKj60qG67r5ucxn2W0D/noCU0nN+dU1JSXaDc0/TjF+Fx4W5s9UEy4QKHHMuT6IcdR84/pZz3mj7q+RAWX7Pg85G48g3PPYyClHhw7Bzf0N9ByACGcse8bhnFuikcPFAq6cSMnGNHalVu+eYEUPRF4fCAVaVzdkabVmyLvqnKhRSh2AyEj1RxXesHMkcgooXYlnJqiiAeuz1U3tgPzPcwuHOaXBSXVlqYeGad79hsQ9tj6mbxvxV3R0aNH8mkG+u+VB4XaiJnhoDco5QOhtPr535quqW5MZ1BxIto1JddUyOJRJFIwrdSlNRtLTDs1NWottRAPQ6TDiEEwxzKmJCzRoypDBuOUUPokexHK6Zzi6cFjUE7FGH6R8AiQVKX1Qndp9Yxh/leWxWQHqL+ZLoLl9CKWDmQ5K2BSImDo8qZAppgTUgFj8zxpeY1huvgkG9D6olizT4pFAx43qZ9Rs+al9rRAQVNXvJ95wac4+jPN9Kz0V1PLRutDaKqU0CwEuzDWUulU02wkLyKGfLK7zwlH/9kWsqH6jklB004vUBpFxZ/j2Hj/0iWceOMsqvWpPKkyiRkNftvEEA/2trFDL9VqgIHWGaZRwgUUj4o4vT6iZ5uwOz2mfLLWU4OhVFv7MAyhAmYaof/3X1i/tofOwzUcP95Co+nBLyUIyoQxHUhPwCYdbMkDfAeBP41Gowqn5kOWK3CCCrygQhuG+r6axE2Jv8hH9aRAMkS//RzD7g5qbhnxXoiwN8DDuw/x08+/cl7ClF3auzWK88ZuDXl+VBBmDqLyPOzZC9ifeQu96hJCbwaZW+cukF3S2b0cQDhdnDjq4YML53H54hEszwGHHTWiqSRjVIQ3zvqcWAsjMCnyDrSrq7a+BVQgUJn3sDC1jJmyg++ureP6jTuQsoqy20Jm1ZCkyniMgAc5mlO3lACGZJXyaKQhx06qYokowKTCE3igE5EQ44TO6TqwGzZK0RCdjQzxYIA6JzChPpMxbgP30giYEcPj88++xOyhFt65sApJhrfC5wkOWxuPeGTW1OlzkKKsx3+9Tk/s9Q9pqSKg7ZC0wceZN5fQmm2h/XTI+xONOE2z8aSPcnbytSPNL62Vk2dP49TqCkSthjii4rPLxRNbJ7OT8fp/D/UUZ+EeettbiPsD+K6vAH5E6yTDxqOn+OX2Gh49NswWDWwttd+OfLWV5j9EGbvONNKF84jnzmHYPIOkdgyJ30RGRfFwnydvN4IEJw+VcH5xCe+uNLByFJifAspQwN/TnU+Xge9/E9BHd1VdT1lKPk/VdjG9bOPUkVV8UwnR/7OP9Zs3EO3solGyuUkSOyXulpdK07C8BmIrANwa7FIAeBVE8BBJVSSI+ZuUxj67eH9Mg1zktHDzi0maumoEsUAkVWUpGm+3L1xEQRn1eQt1P8bz32IE/Rh1ftJi3kH53asLfJlUzAgCgJ0sw631dTS/+AqfXv0EQVDjd40nSMoxRDYYoPf8GabrTdiNJoNU1x6/loOH1reze34GhHtIe13YaYJ+bw/drTZRSDHs9rG7vYmo28Ww04XDk0kSBh81P4BPTtlk8lpyOGlnJ3Qy0hJ9LC3M4cVOF+FEDPOw0TWS2WYSI9xuI2t3IKoBfNdCbE1yGISaZGGJg3RxoQInte/RJMV48ih2efOzy39XQwlT2KRmAzFwE+D2vfu4+fbvuHxsBRmvIDv3y1CrG5g5vogPr1zB+q013Lv/gK8mKa6rYjyIsi2Bte9/xMXFOT6F7XuKgZUmaLe3uDFTFl7eMHid7YPH++lI1h0fq4vLeNLZ4II9d/Qd3cl/SZoxiS8w8Q6yrOJ4csmm4cSgJc8W9swS1tg95IIyg7gU+yLCnc276F7v4eP3PsK5qSUEdG26iKqYAFDMlJfIHTItre1gH3e3/8DXP3yLx70ngJ/A821ueLB3mWXn3k8pz3JXhntFHyUCu5TPlXyX837jnUZTZwiPSd2AhGYfq+tNx6SxBGYPMHQn8JvxxyrGVE0I0PkE5cihRBwmkLHAoVoLy/On0BJNKA6sKBQ/Xi3coRXSxxAbOy/QjfqF/Uz9X8VCT8eaw0qiran0WYrBQDH7DEW+eE1EqafYcRw5Tqpbb8a1q3uujdB1A5m22JyBU/Cco4PAv4mNYbXS51JcjDS3eIy87JQXgGFdkCSXTSkJ8Otc3OArkmGwD59mxZu1m0uJGUsp426SkJvfq+b6yI9OSol/AAAA//+0XdtvFFUY/819Zme2u23pjdJSaKzITY0NJMZEY4IvBiP+af4FPkt8wAcSfVCMMUhAQoxGU5SEWii03W677c5253LGfN85Z3a7LVQePC9tt5Pd2ZlzznyX38U2lABBliclNFwrlWs4iKYB0AWlD6SL4bAQoKm63zphk4k43YyySjSQ/EN75g9sgLp70e9bTseRGjQdSx1HaeuW75ukuhihrd1KtXcNs7DMfcf3Fx44CSKXAD3Z1PkzlEP5JurvkA8kMmWiOghdsaSFmsv8DFFC8/WNyYDyNZogttHjwFMiLHnauaIyUMXILieIMHLlWSlvOi10EtBhO8ZccU1cCo66Mpm0DjpsUsCXpl34gUwmumnSs0YUshrFtAVDKcyb0luWr29Blkqq608VLgUhOmzkfaiFfkiRFp/ozYmsp2mQZaUCqWX2NqNCqcjzBNdWi6aE4GhBn34LJKG2GvpJQQQjMzKTH3CR48HJTQ7g02YH2XaCraeb2NzYwFajiWajwZ9BxYCOCgSq9Rr8agVhvYb62Cgi+nsoQjRSR14tYFc8JCKBSVVlqp8XkldccDdCpTUcLMvuo6WCAKX+xA840+iz/9EWl4ckzlJkUwteCk7MtTWghs0fta0SrIxpE6oQVFIeul24ylaE1rfI832wMpq3uko8WC1+UZLPSbzIy0CGC2aHHFfCptIMcdxGGEZybSvOkqYTpFzNlPZJrgDyjRZWflvCdmOLgwShKssECRemFpaUXeC5hQW88977mDpxmpMftjC1nLIyTjvWMjp4sLaCZrcNsxqgk2YShUKQLEI8kDXoRhPt5VV4cZc7QOU8HxD94WCryPi8/GIHU9EYpvwME0GAoShgUZ/CK+D4HrwohBUEEJ4LuzYEq16HVanDCSnwjwDblyIUhq2CM7mO8kJC6A2RQsQxNp+vI9/L4fsu9jox2s9buHf7LlYbbbRUJygzJCyUPS2E9PGW64YEvEKgNot8/DKS0YvYC2YgrGHArpTPAaow50UbtrOD+RMC167M48pbdcwOASOW7PjTMaSloR/L/4VfODikM4MB0s2vREB0+RTOTNQwbjbxzc1baK1mqNanUdghJ0OFE6FdBEhQQ2rarMatNcQKIbtOhurgGcKVSZCZvTAQ4UIT9bxo37FNxAhRjJ5la798TcDq/A1DPGUhOB2YCPb5l8UfGo/XdvDl9RuoRj7OvD6LlAoABO3b28Hm+iqcsUm49Skp2moelUq+2qCvn5IdZFcgtD2cu3gWs6dnsfZkGa4SveX7Y2jybFGKzBGM2wuAC4uXMH58hhY8CtKfUNoukjLx/wxDKWRrgcJ4N8bu2qYs8Fk+MgrCM6DV2sH9Xx7gzt17fB60pqlrzN1n7aIDs7SRSsjj358Gpt7EzrGzKCbPIfVGkPk15E7A3SbTszASJTh/0sSHb4/j3bkQc8NUiJJJv69WX1lQeoUrMJh4uLJMjekhA9c+WMC008QXzV9x/9afKFo7IPsFp7Blt98mIV4LJkHnKyMIqhOwKmPoenWk7jEk/iRydwzbCSWeqvDFNyjXH84oAL0ec0Ux4qssZMfy4AmbCkulknqaT4GDlj2KfHQRxikDyV8usr1HsLHB/X+ObLiRpqhxoicU2MyBr25+h9HjE/js00/gOiEKolB5VMCLEW9twd9cQxAGsMmZhckFL9s3FKpDJOyugN1tPPrxBySNBrq7bU5n9+Iu0+YC38ewa8MaH+K4yHUshk5bROYhtKEtm0ytVgu2Y3ISmMPH5NQYoqXHyJKOOpP9CFmO8ZRWTmdrC1hdRXXiGEK/gl2mmxgHddmOmCM6Pi4LAy8ZpZbgQMdbP09VXWH//wnubTto7bZx4+efcGbmJN5AhXFMRh+agAqqlu/hwuIiPr56FY+XPseu6jCban9LZSVVFtzo1xR49EcTC0srOHnpPNq5gcKV+Kq1xjOmAgy5IWNhBOvH9FAAL77HGuVgomJUMD8zj+knD9FafSi1dDgOxYGGiu56mwq1xPnFQDGgPwGm9/c8u4ylmC7sufveU8LWVQJsGUyH/ae9guu3v0b70kc4NzyPUbMmjxWagWIcoEoxMgYZNrGN+89+x7d3vsd6/AzC7qJSceF5pvRwNyzVbT58ItDrlDNkrIsVcB6n7z9rJRVCWdYJ1azs5VeSv9+PGCsOxOv9669QzSV93fjYAvsg/Hw9ac/ay1GxArw2NYfZ4UmE8BAwIVMoFCeOLADkihaxvP4U69sb3FBCmW/I/YVyzU4scziK0+K4U/LsWfydGn9ESbAlXUTr1fWoqhoZLZEUknZMFFuJqNaxsR6aXksNP4qHCV+j0dX98H9tJ8j7sKXp88T77zXxdOFEPxdKC/o+QcZOQnuqw3EX0a7ZTS/L0SUxaCqSKs24svGm+coqR+sfWghd04GzLMO/AAAA//+sndtvVFUUxr+zz20unWmnDHRaLhZapK2J0CCSSGIMPPhmfPBv9MVo9EVNSDTGGqtAAl64CKSlWmgphdJhOmfm3Mxae+1zzrSNoHEeJ2nnXPY5e12+9fucTOIRI6PE84IpQAT0d44AyEiK6outX6K9NhFlsgTTUfREuqz3Frkoplsplnv8YEqyk2Rdw3yBxkJTpxupfdbzBzcDBhYWXlGGvN8DU+zkU+LUM0RTUwFTVjZTwgkuhdaSVJm/tQXAZiB7qbxYWEIvYDTX8zL4A0SeYlQN7H8v39M1tIWiaip2loAV6VoScM4rVXMJT6GwkUmoCwwDZgdI0UZJh9jeVcE0NHozapEWKlg5+0EJWIRUdLpQQh1QUjHQHNJEq6Vnki0bUT/Yo6ygqlpeHUwHjo+PvcADsKzBmX6zUE1tOJOos9oh1hVRpTLKqJbPpBloMD9XCV5oXrwH+JaLmlNG+KSD9sYWlm/ew8rvS9i48wjrS6vY3g5Y/ZP2wB6rVl7URBhz3Ml+2HYVcMseFwQmjk/i6KkpHD01jXprGO6hBuyqA9e3oRhaaPMwJCe/SCSg0l7wIJY6gQAAIABJREFUlpn3LnZodgFGaI2Z5whGsULXSQpIcQFMYja35B9UF+b+EkTRk3khJdYgkM2NiiXaL1RsOol6XypnrhZsQci2JIlYJOa/sXveLEuKE13J9hxvAASZJnsjI1q/lPyHUpgI2CXA4ftB62SH7MeIwk/vhX6C9bsP0H7wiAMPosX2Yi0I5AAXZsOyEagIc2+dxRvzb6Ncb2oInhL4qaWLBiRkvdV+jPvPnyHwdZcmIIkYjdX0InhhgnQ7QLLxDPHmFirp/vFZ8axouxkf9nHy+AFMTtTx2uE6msM1eI4Dj9ZRs85Jv12ljp4Pd6QBq1KF4oIALbY6QHRs2tRiIuc5UlBS+TXkSCPkuf8XW895rduRjecb27hx9Tpu377PVO7QyMT3CaoVh+8eIu8Q/CPn0D94Hpt2C6nbQErWeDJSRHZZadyBX+5i+piNDy6+jvfPjWCiDDQUUE5CuOwkQ+unj9Ry9/zWv/lYJMWkUbMkwmhZYXRmFO6H7yB8dAdffPo1VpZ+glceRrXehF1twq+Nw/WbSEtjCFSFk74opa67xwU4CiBSpsNjT/Cy38fI22lf6ikfPaeGkYOzgBNj+2ECq0sQyj4S8n4XBQgKMn66rjd+WcLlr77FWPMjlEcr6Ic9lgp2ul1s/rmKI5UGjyhp94f/F7FHpxxZIReNW8damJo5hcXvFziZJblgwuDQfB3zNBd04FqpV3Bydg5DjQZzMOhOMlhTiijJK3Zx/vOxc9Ye8Nx/sNVB2a4wj4W6S5Tv3b99D4uLPyPkmVLhkogGoHhUMXFCLA9texRonUEyPg+7NYenzjCs0gjglGV0JEDd6+H87Bjee3ME506UMFnSMn876qPueEZbtsfz4JXOR8YttLVWrOdfbQtDNHpXT3HpwiyitXeRrt/E8vWH8NIdHiMgNhM3BWwLUd9G1Haxs+ajl1aR1pvA8BH4jROwa0cx6rcQqCEuAoSpw0MqGfjPEgkwlDij/HN2qRV1Sj8DohIgN4S4WkNblVCbsNhL/sWyh6DzG6o87tDnWfI41c+YGX9IZT/tpMDHn3yGqclpnDk9B+VKbKRCJEGAzpMNhlY6B8el9/uSEoslTQuSGQQ7SJ5tYiQhplGVEyNWqOZKeVZVEFC11+9qqzLfF09why0JD1SaWfzaU12cnDmBX+8+wNPlFX5/7vc2oyTAtZiohnDjCdR2G8p1WEJP1zjeTWK3BkFd5rtEPM+djF+iBvg1u/8HCnv6fjh1TkrkdWSecYaMRSEq5QpSv4Qry8v4YfkOpibP8x7oiI4mkQSLOt2VRgMXLl7EwncL+PHKVb6/xg2AiqO0Lo2VLW23VQVcX7iGsclJ2ON1KJ+UNxF60Q660Q754wCk/IiSzLzlpR/pGtOTV0MFZ2fmsfr4L7yItvn/cM5ikimVx6Naym9JHJIMgGAzhbDJHZKc1h4KaDpM4j1HpiXketyY1IU7aYzVYB2fL36J3vwlnG7NYBQ1no2XluqAww7dZT3zH+Da2g1cvvYNHr5YQ+KDVbWeZzPPhhoIvrhIZWuNrJ/J/50635aOh3XMr62hzTx4BoVzXEn4Emn6qAwypxdJ3lDMlKSF9RPtYiwUk87dH8Yg92NtrBPZqPtDmB47hsP+AVSYxhLDTotvz2QgBs51oNoFJWYoYhe3Vv5Au9fhteN4g79LTSLtcOZw910n4XrenvNVaZqZvMoqcAJMwm/yFaOMoKJL1rgtsDgczpt0fsV5CMdexecwz/G4wCs0f3YlYwV7ru7NTl/4YZxvy/U3DgBcXBQYPDf5xGqxUqXxWxn1MYUGbgzrPNrE5ZoplhewmDcn8Ts375XC35RdWW8cRRD+es5d7653fSVWHFsxSBaEyAkJl4KQ+AFIIMQD4hB/hX8EeQE/RApCCkIkThQ5gYTYYXHiOz7W9l6z0zuoqqtnxjYExZYffMx6drq7uqvqO9zL37z7bRR1ZcCNkjf7xytXYLeSVKf+j0kqgmetElzXXiO8ec89yq1nX8ICL0AWRcgpnXqinm//1toVcHWFuSkZtNgu2nylSgln2ariK+Ef2wJDHMVHXsNCoo9M4ORoMMgpJBrotrUL0cY1wFgwSAdXZe/D2spZeL714HQc61WapJx2ep/23vOQFFu564vieV9cE5QIuXHypXO2JVYoT56b5WqnyZgy/pbGQs5AvPos+OGb98KbJ0R/wGH/SErK6RoSmvMFHsPVKXoVrTF+etzcv7geHIcJ2cVmKqmWbiH3x5oOhtNvntdRmFHKKZdn5klHGhaKLlUssM1FZI7cErGIc0RQ/yAsMu+/s99BOQlRjD04exH2F9dw94ebuP39Dfx27Qbqt5axt7ILfRjD6wFEu6IOD9ED/MRAPT2BIntkH0dJaBdQLY3eXgc79XU8ufUH5uduon57AY2nm/C1YtGWYqnMHZeCV2B6ARXKnFR123DDkpz37vGAyiaMrhHdU8dsKfOdeRuo6WfctY+P+vPbdWbXMMRa0AZ8u7nYgBOwq4f0bBJTVe2J2wJyBw/rRIB/KTYolVllEtTYvk662ISfnD/WpHSRlEoA1r/g7isdmrVRY6UDLCntF3oKemUX9Z/uoLG0iiTSfPiIRARMK6NpwjaZ1GWbeRUfff4Fzl+9ytxMWgdGYVxxsYDU2x+ihR/r97HUaiAYLCGmRNYz719FCYotjUqjicb8A+z+chflTjeF0CsZV0YUiPUiEUYGXGD2wllceWcGr8yMY3i8jEItRGm4hmCkCj1YRjI0CG94CA4lWuUqnFKVbbEUJd70xfZYnhFEs+gWGc6YEQB9EuLA2uKfaG7tYCgowydP9Poarn03h43tQxxIR6cn+5QrpTJabj4/c+L9j8KZfA/RqTexXZhCyx+C9kuswd5nbjuh/neh3AYmz7Tw9cez+OyDIUwEQI1E0GidKDelJrEN2/8e716cQpn5q9nPnDisNGIToyM4Vathc3kJK4v34MbbKMZ7UIcr6O0sItmvw+3W4URbKHouK6szLYvCoW84z6RG7jqyDx331rcFX+vFbe1YKV555mDc9ypwgyKajS0WdaTDHu8PaRG6n4PTAltrq6jVBjE5PS3e020uxnSjPqrlQUa6MXWIxxmG2sFWcC/XZ8/fP8dMmueO4aP7fhGbz9axcOceWs199vqGsOaVyMDRTmH1SV6//AY++fIrjExOMmrBJHLaXKNiuSLJSVnlx9Liyl8O+WG7vkbwU6H1fBPPHi3CiTS8xEOvHTONYnt9B9fnbuDxUt2kLLRPIrZEDG46sLJ3QmMygG7lLNSZK+iMXsJB+RwOB0agwwpiJxQ/9iZO12K8P1vDpx+exdtTHs4EwAihT2gPYJ2kzEbrpB76f30c/V2eFmfOEEo8zBXKYYhzkxPoNZt4snAfXRL0JYtScUNwpJniJZrRA77XgertA61VRNuP0FxfgN9dQxENVEPhH5NbAolmOv2s4iVxhIWlhBd6wk7Ofu9ouc7LXDdiY5+l/AK0V4UTVqAPdqHiFutiGIFTV0oNWjRHRJMvAbodjdXlv3HxwiyKpQJiiq9EIwg8dFpN5twWK2WO+44XvrgIwAVaCvxNtFeX0Xu+gWrgo1AKEYSU1IeslUMibuxJr3s8P0ifxqPEiCCYAcuxcn3VLQZwSJ+Kaq1EvQor2N5t4K/605w+iEplP+1UZ4tZWr++h8GRMQTDY4j9wMRMlZ8jSWq1rfJdBrtkkszClGPTCcqUGTsjOZdZPPI9OUrsL1VmdagsXTT7Fym1jmoW6GNzYwNvzZ7HsEM9WsO5TyTmUdygv68ND7M21e/z8+i222ZMHROTU0FQOjOxdgGws9eBGypMTE8hVoTsJNvLFiMBTo2dRiEYMAr7FNMddeL8k83DhKH0JhiDHcMIt8FIWUdzEYApvrTvU6eG57SlsIgVudggUo5mHcnS6UMc88gkzpQkW9tmi0RVKoNfp+5ecr51WNhGw+UCRw877QMsrS2jOlrF2MAQoyQCZbQS6J7k1MVxag8d/LzyK+buXMd6awNdp4NChYR+jfc9F77pkxHAWc4DK0Ynnev0rJdScDOhP4PWy/ziDXrU5CnFYoETX4vgDYmOnNrNeWmu4rhmtttnkhfEI1041h3QcVooUNTwioBAB7g8cwkXp17DEAa5qOXKnDVbqpENzRffuRivjSi2w7aPPTzYfIwHzx6iTXRDn+4v4Tmk+4nYwlvBOze12CPbYIsopj3KJOIGOW7PuSpV0T9Z4LFW2mkclPnNrSShZ+cpLPbZ5OmwtptPSHBOvKnwElGJzfze5pkUei0Fl2H9YmduX4fQMYwcF7ov51XS9E3z4Bxa2jTvTCPfIK1NTm7yuiyH4CIQgH8AAAD//5xd225bRRRdc8Y+vsR2nAjSuKWNEikgRItaoUpUCMQDauEFgXjjA/gOfoYv4AlVqkAqLb0E0YIqKhJyoW3SpHFiO3Zsn8ugvffMnJPQqqKRrERJnJw5czl77b32WvrSNx99m1jFdAIp0gcjKufs9W8yQCZKh9nPxA/d9R7IBZXJ4uhYRZBBfepEBSO5kbay7hIEWnam9M6yLkHMFUkO+l2lPr9xU+MkiKxfe9YP7gC0U1R0Aza5De3UFIWRkB1AxiITH0jZjSUZezvB1ksS+YPdgTNjvBgFi1DkbM0A5BacuC2wV3OQMQzkc2otJGIO0CkRwTT/OOY5ElAo4JiDB5vNoevhrE9R+vbpwCqEQsGmeZPWgoQr+SwgEo9zANQls1J/mjufVj5KbexQKZXRarUYKHKi4RhFyGWlXE9/YBenAHrjaSm8UB3QzAWufnM4/840q3DD0nroLdwKogwiM0axHLIA3oh6oQolVuln79FUo3IAjDc7WL5xD1e/+x5/XFtCe6UN1ZV+TqZAW8AvPZ0CMCngkrBZXgXSDkgDhMa+COgnCuU4IJtWDHb7WP1zDfeX7uDpP1uo6jImwirToGmeqFVjGIlAEQuQ2bXzogSAp2Uha4sJrD2f6weLLDsicEktTrTY6o7z7A8sWyZQPjCA63vLJWpSpzWQGn/gKaeeGohAH+zezM8zbNLG26uYTLiM16nJqE3+0HJ79xhbIPvaqR1TkBlKIERVPrp9ZMk4HCPYP8TO76vYvv0Q450OIhL/s1VuUV8WlkWhGKIfjfHBp1fwyVdfYebMHEMeEjkr2NYMGtkjAL92t3B39zG6BSNK/nS/Ewm6iG1Q6Y9R2NjG/tIDxMvrqEbORz3zetbK0m1ZIAp4e3EKFy++iYXFE5iaqaHULCOsTaDcmIauN6CnmtD1OnSjCV1rAGXq9a9CF6vcb80vZwGmrPWdWzdK/g/R6lRvD+1HG0gPxpx5H+4f4qdrP+P6L/e56jZkYGc1KIxQECluJrGbKCkCegbp5CKimffQrc6jV5xCFE6wNR6FIhyE0F8xzzA3r/H15+/iyvtNtEjdHzFKKrAASXofPTdVvSwF8DKAmLKSvTvtyWKReiNPt2YRDbp48NstpAe7KCUHKJk+9HgPavQMyXAbw85TqNEQhXiEUhAjLCQipqOMBbyZ2/hzP5RT6bIBqL1x5IAQKwIWZehkBJWMkI77ZJyWjUkZqByBktTQD/b2sLAwj9bMjLQKUQUsTrmCXZ9sIqDeUwhDiq/qFRIA+Q/llDCU8boRxSTE3Zt38WzzMbSJvHaFlUqU8ZFIqQaufPEZLl2+jMrkdObiYiuEyr/vOPD/v/P7gt+nS0lS7K6vobO5hRpV6ccpO2D0OgPcun4bN2/cZh2i1D+FlNff0Jy51xgbjVH5BKLXzyFtncew+RYGtRbicg0JWcIRhTaMMT0xwocXTuDLj8/gwiwwSwyIOEXVVvH08aGo51zzK4zfBWXcxw5R/Z5qNLD6cBmbK6vWUcDW7Y1raiCmZczzV1TE2xmiavqooI/D9hPEnW2YQRvVohVNZbZWIMJkqTi+KFXwibrMTjR/XSqz8pVDXGIBRznXhrUu4qAGHdYwUQ7R2duFSoakuMO/I+KLVo/FPXrsHem2O5zgOHf2HTTqdS426LDALhpk30jPzGJtAtAhzAu1MehZY5VNxgeItreQ7u2jVhQ7YTrDQYUHeq5p0Y5hQBPIPqZEoCGxr0CAoAmypHzClXcS7qyj1x/j4fIauocjSUocSQDYGNGyUXuDASqTUyifPIVRWGEtjcTbLeaQsl8ex9gBOR57Pmkv3wj8eeCfp3nqtUtPubmkYQaFXEHAsVxdrsEgLWj0uj1MVypYPDXHjQDiDKP8i+2ZKxVM1mt4vLKK9b9WmAlU0Llj3l8/JZSJiQfsd9tozZ9CfbLKTka0nihOOfnGHGqVpjgmmdRWQfGfGCgbihuZtL1Rq04ZJZQaIbbaTzAY9zmeL1qPeganKtN+8ZXlQICzOpLgUlm1tZD5tsO3Qge+EKkCuf9sx0vMXYqnTcT2dxTTRWmMYTLC+sYGr7HXppooBSUuRiRWIJPG8AQ7+PHvm/hh6Sp2RttAyXDvfrVaYeygfXpH26p0Nue0fvPFlyNrRcG20bqinRbBxjixYxSALAVBiz9UxvwmrBKxr6/0i8PaVzvQ65jK7loKSqrigd1nxNQkC8yoF2Hx9CLOL5zFmdIst97Cg3/FjCJKJKfK+OSeE2rWFsekrMQywp2Ne1jeXsOQmEWlgJPCyrJVCSwH9rqM1c5AzlY7tWxhZ/knY8/wmHydv4fO09/iMRsLe404lwjIMVf5aHRxMGupSQu8x5x8f93P5f5zgdyxVChmZEFXmTsG/5RQOOIwJwkHF4dXyhUcHh5yEofOTcHWWWHOr0/X508OYrb1wCU/mKWggH8BAAD//6RdXW8UZRg978zs7M623dKmUopIgAgBAkZNoMFLEy+8MPHChDsx8Y/4X/wBxhswRgnGaCIx4UswNkA/+KjtAv3a3e7u7M5rnq+Z2RowKgkpCWTZeeedd57nnPOcE7576cIXQ7amlwsaaqMbV+O8KQ/UlbvMOkrzmeWmc/IfS0FAzVmgCAt41l3Qp15Pv6w2IVY6hCUm0bL02cjCF2JVk/+nKl8OFRlxmjdpcXcCSqhsXb+HSYF4BnkgM+5JkvD3cSqpt4Uz5UDuzKozQlEJ9LAHThqZ4UgDxwdRJc4j6EaY2szY/iAHApzfAz6gmJVnXwByn88GKnMDmwQawMESl9BeqZnK9kUWT/eGUB+Se7MvA+Xbx+aUCQYEnIMigAalCOtkAIMpQFzpdTA+Nsb3tU9rl9fHxVMU6HiHuWACo3NFOYOskSFm9GcPWT7qYHsCsq9yJltzP+mvu4Mugro4vRMoVgljREGVnYOJLartemzcXcbVL7/Cj1//gI2H24g6rDYUlNs7hNTcKdNvAID6h/NvM59x5ivuJJPe6ZEmMTjC0NfI8KOVYWt5Dbev/oLW6iZikiEmVVSqFXYv7VO8EzU0WmzYU1BuksuvVJOb2SFjBo5DGw8g9FCNQySaRW6n7WEhd4K8/jBwzqsr7kABBTMGCUYrW36uLA1ATGgGucSsvG9zZQ58kRM7wv8WIyZ4Cftfzm2Vz3JI9c5HmSDI/U4PCTEHzW0s/XwLzRsP4NtD9AMxLrPII9Mg0SjO1ME5fPzZ5zg9f4FZH1pzYqoNfhL2v4fvHtzFym4LPqlIwgcbuRD/HSJKPZKtDsKFJ3j603VkzWeoDYt5Nq/NUORkzekd0RgHzs+/ibfPHcf0XAPxRIKwXmVpfzQ+CZeMo9aYQpg0EFLjT67R1JSQ83UkxQc1MZkWpSzFDeRnkAv5aQ9naDcfo7m4jHqljrAfYGVhGZcvf4vljTZfn8VzcQHruOZgBjhyZHQ4CTROIzwwj93GGbTiWfQIVCT1DW2poaR5INhCOPEMH314Chc/mMXhGEjos5SddPY6LwGj7h81AK9okJzMmiMXdsuTyYBWCBw/dgQrD+7j3s1bGIscm39RMAlpPlzWRTRsI9tZRX/9PtLNh6j7Fqt4mButJCwNf+V8Ln/xIP8uvIqR3HCnJ0UYJrw+we4LuGxHnLa16WYQVfcCfVS3s4taEODUyROoxlWeM6Tjm0x9ao0JxFNT8vg6c+X/OzP77355ZezlOgIfwachlhce4t6tGwglPFHvgrCHPMhA6Q0zdVy89CnOXHgPPoi1kUs1NjErceAGBPyH+wuLICwamUxNr+g82XnWxNofCxhst1CrUrQtkG73sLSwhCuXv0Fzu8P3wKvRX6bntr2XhmEVneA1DGfOoD93Dt3p09itvY7dqIF+JRQWO22j6jZx/uQYPnn/BN4hiwAA0/Suy4u0cnJFaWvkF/0/ABBXGADTpibFUZLU0W918Pud2+i1WnzGeBgQpWSIHuZcOHs5A+IsY0O7Md+B33qKztoiou4WYt/l1BfaqwQXeFcVxbhTif1LAQDOGRAAIFSdiN0oe3/5EGFch6/vQ2eQIUjbQNqGc+SRlEpzXVoFWlJ1MEFzrYlDB2Zw9OhhDENp2EmV0+1JqkB9osHPKcIYe3/la8AjdT2g00Z/dQ2h+thw8g+psaKAG7RAAQBn/VQo5tAc8aZqTXYDD1wO5pLhWxjVeIzp0ZN1PFpdz8+gQE8khxJZQZO0xIomNcQHD6NXq6EfSDNabKACALBmo0yC2FXlQ+PlkT5fnKZl5teafqtVy7PwFC9dBmHdiG+VYzEHGbY+b/6Jt86exP7KOCtOrFkztpPqLWJWJ+t1/HbzBp6/2GCFpI1S2TZSmIiNeHe6ZELdx+Fjb8BVHdc91ARPTs+gsW8/J/YwQbeHJMg3mBJTxVvEcUIMJ2oRo041ZD3F49VHRu3naoxiNDgrgZQ+/5P1Ey7UWfFsUMQA5gWvy+souSmS4WCCsMBpkgoTkimbZBPo3+t3sbL+FJtpB9Nz06gxRO6xhTbutZdw5dfvce3ONbTcDo9nkRrXrjhSkIM8EhyfgyZLpx4nGFkn+ZnldZM185E6v7OZnJd4O+6VWBlQMN6mtNxrRGcNKRPA2WidZ+BDuSmWGF25gs5WB7P7ZjF/dh5HJg+hgarCGXJOe00IsL7JFDWBvgvYV4z6PD/E4ovHuL54G9uui9p4hVy7xQcuHWgCinkaFPPtAmxYTelYUUDrUTHfKxthzZXL2sDLQ1fE0pfq5JEzsVTvSt+4R/2sjbx4ugk4Ikl5pNCVCMWy6aRB1wb2mcpbDAtF6Um9t3iqmVFgAdoYyy9eBpIOQjW7RBBSjSKAj/17+nyq3wk8yDKPvwAAAP//pF1rbxVVFF1nzsz0vkoLRaRANBUiD/HFwyjfJDHxu+IH4hf/if/Ef+BXY5SYSCAa5CkQESktxbaU9hbovb0zd+bOMXuffc7MFCOJNCEpcNt753XOXmuvvZY+8dWpr+mFsUhgnAdAJPLzYZ55YwQbQQAv7bYy7tBL2KwnQMjS7CpTxNmKhTWh8CfLzT6I8Vsh+e5aQGPMGY/PzzQrZ5AinX6jIEAor8iYY39SSRbkuuNa2K9QSAI+KVsk6LmcLCUmSYEzFpQLXNQYWfgZLXdR3ey0I1KqL/ZdWenQ8vtuIQAsexOVzuzKdl05Jk1m05hAIAAoEhb+rBLLaMGZjcCg7106Qe39obxJn/LqAzm+CrvFTv4oGWNHAExMTLL0Jk1S75jvvuiapMPUulf6Da3wkpdRZZzBeUtoHfiFyxEsIw8WlTfTUM74zjGRdLzGSt8DmvNMDExSoFk00VtYx9wvt/D9N9/i3q8LiBKaT7au56GxGeoW0BuBFsoD+3q6uvKbm4LLybZdAHL/tSRBYP0Q8pyjnlpk3pQYLM0t4PadO7z4TnbG0SJ1DHkDKOM3KyejDaSDYKTTW92w3ULlpP+6sgiPxGjSkj+6ZIZlpytMJffUiInNlqxbp4hhmb4pAbl/JmR2qPrvQWUkwbHD1c9bLojKk0CeUa0srFXw78ZmADfbHiAhjwmS/FNhTHn8gxRRf4S1G7OYvXAFxUqPqfVU5MvuVlRu249CfPDxaZz+7Aym9u3looFn88QskXq2y8jx28YyrncX8ZRM4ZpkJpZZ5j4ziIMYY8MMzfU+0qu3sXnzT6DbRUhFg6cajJfKaS6MDQ4c2Injx2Zw8PDraHZa0I0IYaOFsNlB2NyGoNWBblPUH5nYNdjojxznmU3nrJ7wuTndeuEnJkcmQ3/pIVYfLGBXZyc2nyQ4/9NFnLt4g30NMiEAjBSrVM/wCqkiDEwbRWsG0fRH2OwcQj/ag1R3UNDayuaCQvSSkUbQxakPX8UXnx7EwQkLkkpTNNcRq047viwBYKTkQhnrJwFr5C9A6zgpfq5duswu303YYjbgbF7qfuaIzQAdJFD5E2ysL6Og+2lEkn2aDxxagkxWgIJVSkUNsEDmcFUN+FppLEf3EZiiEZ88gRqmrAIg8MPmVhWFr+AtrK0s4sihQ9g9vZsJAJI9U/FJ++zE9gkE0RifSd8kfGkCoCyxdBGiHbfxeGkFly78zJFpgV+77XpE+0UyKnD05Fv4/MuzmJzeKwZf7vhHFd1ESQT8XwLA/ZwDLXQeOKorT7D6YB5P5u+zcSspTAe9FGtL6/jxu3OYm3so7xzKJynvFNdpTvUEsh2HMZo+hmTqKJ7F00jDSZb9k5+mDkbI+49w5LUmznxyBMffiLEvJHJshCbVPOQ/ovW/H5tyGO1FHggvIgAqCAo2VoujVg0wNzuHhXt/WfWdB4plyzXw4N9YBRulC2giwhI0MEBsUgw2HqNIN2CGCaKgYMM9BEJvK12hS0ztXuOS3cj9owoZEwADfvsCua9oPEmPYYOUcK1tUHkKk23CjJ6ChNGF8v6Sfg49kDppkCZYW/wbJ0+8j/HJSTYwCwRY5XnKjZSQVAC0LznUVSbDy4pGs9I50O8hWXnEqhEid6kbyb4QAuAoQca+uZKYXvu9cse+5TJx7UikStRgtcTqeg+3/rjLnghKYL+vD2SvKQRQD6hhNL0b0Y7tGGjFxatLAAAgAElEQVSbTsKqP/+smOoh1O4RP9LvO5D/TQCU91Fl7KfyX05OXSMAUAJ2FYYcfdwbbLLP0zv7Zzh5RfrPQmzbdZHUYq9MTWHl0SJuXbvCiYvGm9sFfG9ECHnefyiEc/dpFzP792F8ahxpkTEQ7vc2sWvnHrRbHQbMXk3kvbaq3ghVnYWxNSk1+gL797jdQD8bYGl5iQnrIjB1AmALOamk8ajcuQjKsVMHGmuv3eKPxckVBCYTO2/OI47KjjryWAX9Lq3xLB3g/uI87s7fgxkHVrMufn94Gz9cPY/r8zcxamSImgHGGjE3I10jTZN/D515VTfLDiP9HACt3EA1DOIaaixxd8brOrTxzlLnebM7qtWd8TapjqVpyuOhUqO6xIFAVUzuuM5RrCKmXH96VlSuEGYR3nvzXby99zC2oc22f6HRfqSkTgfaqqFsJFrPHVLfPDN9XL5/A7PrD9Ab9aAjwYpKfMxCS1Jwmk0c+2tXXjM3OqtE+aA9UcINWm1V0Kxyrj37dVNEL+n364h9Bp3pvC3lZTdkBYAdD7d4h5rYNkqVG+XcgKaHRgzn6f1FtUFf7HnFngYS0cgqJotKnAKAR1D4mCzutElyLvXNYldWX7vR84J+b8MbrLuahP8Yg38Iu5bfKqow/jtnHp17+6JcaSWWEIyoJIo1kpDga2PcuDBRlySy4f/wL3Hrxo0LjYkxboyixGIiFaEUYiGVlpbe9r7vnTljvsc5MxCMTW4o0PZ2Zs6c+b7v94peu3j+s5zyzelh4HwxZJVOYYJGRNy8KyqFUNBjQf11EkJoGxlueKS81Nz5KEoYuRb9iQmoP3sDkPN1IQuTF6IptNnggL6gX/cTLs4Xj7zhRcybap5PdEBhxNSCPQAKXl5j9iRQN1ma9mrGf5gEMk1ZLgZFbPgNwxVyEmXSJGwEpv4TAjvRXMjIBhdH3yDJtCXm34f07mVNN1JqE+4jJnx2JR0TZcrTTc7Z7RDqdqmLkeUQRLUJcWtiUkjO/+yNEokGhnQ4E6WQ+Ek3T4aUKiyMijK4IjPVRn8fSVOQxeKbOZYbFCU386KnBOv/ecPLHcsBZLig6IDxM3Eb/s6sZY8P6pumiZiScHwpaXEpqoRjFx3fMJZvTkHCEEyxnB6rp8aLva2qW9nVO0GKbNzAYKuD69/8jG8//wqjrT67/ttcGhSqW6qMgNLXAf6ZiIyQYSP4Hm+EHs2rTZGlIJMmI1Y9P2lNmQlgJJpN0FWLzl4P99c38OD2HcxNNzG/eJRRnihK9aYW+YszortzfpPVVzC+1HPnz7H/vEGDlEI8L3joAq+3l2ESFYgyUa7uadEyiqSAb5mQzuCjBDVeU9er3+xogyPzOl7XrtQM8Wp6WQ2KTPjTNwm8IVsEz4rwgPXoU0AmIo1uk+NuJFOYilNeG6PeANHYwO32ceu7X9C+eR/oO14rIkaJtTlLWGdHzT+Z6n306SWsvPMWZsh8zwp1zTEJ26ALgALEvt/8A7c6OyiaEQry24vBa5L2riQvcGRSINrcwuGVVeTrm5idUAa2fex4raLrtJc0YuDVM4s4u3IKrdYcVySU+E+6cXLyNmTw15gBslkUSYYymuKCnPgo9IBjOp2JwmmpBlCGtZNajTNi5nptbN1chxkMMT81h3t37uGLL7/GdncYBiPVEpLrHNkSI5OhEy0iPn4Ow9ZZDLJlDMsGI16O0HFa0Y6YVgPYbIKFuT4uf3IOF07HOEZ7Be3B1t/dLuyd9RdQBlrt019QVOAp/69X04YiQQsIKvh5rSacrb+7vYu1a78jS2OULEsSz6hYI9sodYOan4Qavv4uXHcTcf8uUrePJl2DiAYv4i4PRT59HUj3tdFJPf/cQvLNTJCgUWORwromI4b5aBumPBBtrFIbjQ4t6KtHowKDcRdnV1Z4z6bpPl3DQX8frdZRmNkjvKNY3pergvW/Pipipa7CEo/dh8Jyirg4N84P3UdY/elX7D7c5gJc8U9u9Oh5SYf08aWLePO99xE3MzVtEqq10cjDquVBzQvgaS884RFQf1WNSan7PKW2lMUYeXsHDzf+guv1kFFRXKYY93P8+MMVXL16DUNmIHlmghSN/t14dE4eMNkS8uV3MVx8A/3mMkZkaBk1GBmmiF2TdzE/dYgP3n4ZH144hpMN0fs3fLa6ot61evWJxe3CUgnlrXnyWP/vI/wwXdvq62Mt/nmwjT9X15APKTot5rXoUG2VHk1/bGBdOmWlic9FbB3M+ABF9x6KzhZmM5FkOnLgj2ZQjLUa1LQajxanGjEaWALwqKci6cbpkEoieW3cQJrMIMsW0H7URlY8QlR0wr2tvVYgG0z0ebF30EXDRnjlzGnMTjc8tQDFeITJZIjphTmYRsz2gjkjfqWuKK2nIEZfoDz/g0MeWnBxT3US68EjljGRESI/qbUwon9jdNX6hKUyDBx9Vr9Vs2RLMgQkHDX5aP9QIt5MiVovrZ9YHjT0qMZoHUFzqYVBbDBiWU1lCmrLmhGy9/DxjvWe9OMlmPS1VMNCTS4jX78q16Xm3+DrBlMbqCUk9SirEoap7ApgKOWBz2BuYxy093HqxDM4MdtiL4C4xk7w6HsyPYWlZ1u4s3EDtze2dAhmpW7x1HW6f5KSPRWGA6DTa+Pki8+zJ0NBKWJ5gePHn8PMdBOGmpZSvC24SQ2MWd/s1jFi1Oqxgpv8BBnmWwvYae/hwd4OezqkjaawJk3J9YoHy7jhSROhjseRDvcsn1NuoAoBU7h+VoCDUnaozuY41UQASgfvvQXxlaB+gOJic4defyQeJLHQc9r9Nm78vYbf1q/h+uYaOnkbLsmZzk5JPVyLTQquhRl8U0CHai7a1aAm19zUs5Zb6nPPZIbm+FNNHWk/5uvswFqvNcTCno247yjVxI7O+Yj9tKRJdRotDqb4y1oRGbf8QOt9InTfoAF2SpK4kcULi6dw/qXXsZwsset/SqvIRGEIZWtPdKtVtJd2SK0/Yer/je4Grt5dRbfoIJtOkY+G/GxvZk1lQZWYShM9Fsegi8/zNwqoofTsBdH+U78lsfWucs/3aTHMXqd1qOxsWit0jRUgZiNr6u24R5X+1XuseVm77y8JkJTzWnACibCJCoyHQ2TEiuf3VNk7NzUiM2FEnmUNIseXa0tSBXpf6aVERiC9NtUPVTfnYx7Fx4H9EHTIQ99PbHACAzkOnX6X8QRxHONfAAAA//+MXe9rXEUUPTPz3v5K0mqTNLGtoRBr01I1XyqI9Ysg+E1Q8ZuC/4l/UsEvIloKVbS1iGiq1mJNW1u72SQ22e6v9/a9kXvnzrzZVRJfCAQC2ex7OzP3nHvOuebix5c+4fA/YyKpCyqWJ9VOAsyScydXsTJvXovM3XseWJZPbJGtpDZlUc3ZV1EomdG+l1p1vrmjjzJ4KcooYM4DIVqISk/KIEhxoDm8MAsdZH8lPgEycR1xN2MxlnAgBESkIhVhINhoutmR+ViCMUwl7TAytz7qWHrWKM/H4WCgh1qU1XQAw4mO1YxXN78yjXwbqdyLKsRQq2pshWf2eCxis8n3i9kjkfI7v7bPJ5ADJmKt4qtiW23wX3nPvvJSOGVZ6s+LjORNScpFKjHsRe5CPMyUF2n6NbynJzQuOPhqxPfGjTlUGAz6gVziVE7a3IyODkUl68R3l10pwTYUVkUb1MsaTF9j7+4Wvr38JW5+eg3FVoY010gKIU+s84ZOd/npO5VgNNcR8yOoFDPWiDCBEX+ptwhQtF8iNgDtncW2chdzMTYusdt+gt9u/4zl5SUskQeY7gMfLNr5D30nQX5WyoYNM76f01fJ2Q42pHqSrYXAO6lzbDSapLKhlMEiwOtbLB4MCpNEQIQN4N9fnj2uSbiKHy0TpGDR/+cST1PJozARk2pE1oYwxSEOYPP7ib9YmUD7SeFyScpBgfoQ2N7YxO0r15G3B4xLCvb+a+5NamdCcomtCli/9Drefu99PP/CGe7eUMCuTwkfQaGNEhvDDm7u3MeOGqIkhUaiHKggkiorkY4KNPa7yO9sonfjR6i/dtCk0EjrZYW+s1OGz8aRBnDh3DIuXFjFzIzrIhHwUCTvZxKgBTSa7PknL7L1wUV0WKoqTHS6/ehzhd3PFInehx300d68h3qh0bQprl79Bl/d3MCoVNyJiWFIo5aGPZc6pMnxddj5dfRnVjEwxzAmtp6VBwkTKUSvNWeJwd/Fq+tL+OCtE1hpAXOgtGdPgBzopD/k+n8p8r7PpmJJHvtT69jZ6uDalSvIh/2wvmMg7ErlgoWpNK88KXvQ/W1k3W1kw5yL9jqNpqIzQsZcwXrS2SkKfBFdcQMSsEoAWzdgdMuppIdtJCAJ9ECKfePknAJZaDtsb7WxuLCAtbWzLE8umAQo+KxoLZ1iYiMUL4cQAIfddyfZ1gw6uCsm2Sa//PAT/vj1DmdhhO1ZQPhzq8t496MPcfrcGhRnrlhHhHjPv6rA/+Ed8IN+X3VgrYqc/OUIew/vYff+PTSs4SJy1CvQfrCNzz/7Ao9p3BoBQil++L9RToLN75P632oOdull9I9fRG/uDAa1eeSmiaI0UkgN0Uh6WFup4503z+P8ssFR5QJfQ7cU/zFbTJX/9gNEl1UHPa3Dr1SnfGYPsgxbjx7j1vXvMdp/yjYb+kwUwMR5dNA3PyNVIFUZ6rYLNepif7fDe0BSm4VzjKW8L1ajIByAMx5waa9Wk7JdVXeHX0HOK6tcMa91HXOtOrqd31FmT5AYCm90pFwQOig3ZYL+NFHVnUd/4sXV0zh58gSToHxGFRn7q2n4Sf3YPIdrjqlmCGe0loC4gmf6Y9BD/nQfhmotkfYz2NeJyI/B69yBO9cN5C9WOTiirBSLlPXNCq5fEl6Po7HCw8c7uLv5gGsCM+Uvl90CIwo4pvs220JraQFZq4GhUcGP7kkQ9t/Lc4zPTz+K288eN6L2DKFjod7yoD/6aKqKDLDKS6oTxE+syq5yz4CIEuY0dYIxjY/Ou3jl7BqOoMb5E0GxIeuBsh+arRqyURe3Nr7DYG8spHRcY1qMaT0bd087uz2cWJnH0Wef4eA8GkHd7feweGwRs2lTGmIm2kuUZM6UASPAp6zHa0+J/lLVmJhodzq8f5MXnxojXGcab+GSQPPpOsroME2JE9enlI3aqKBQdkFvlZmAMQOBUCYb3Jnt8pmUa0Yay6Gzuc4xTsZQDSKlxkwOkEKXSAkU5cTrKVHRUoaAs1RPBtN6TAGx0cZKAO/5DgpRyQVw4LWUdPk619tedzEz1wrYC/L5KAQPMb6SDDanLlVBZVCIypksrrTx2l6JheYi3njpNawcOYWjaLhJS9EqmdyrKuoYQW1bUIoJ/sYevr5zA+3+DrIi49HmWrkg7WrsdWULdnipGlftp6aVonh2jVYPnMcTWMpPr3DP2qlovZKWyRAfak2EkdibuX6WhpmT2lOj1L0TZ3UfiQKD1gmlL8kTkpyFyQBtj7kk5JKJ/zjIt2rQ+ecTK3Anmmk+9yBx74HwWsjnYrUHjfonlbVT2RuT4B8AAAD//7xdW2/URhT+PLZ3105YkoUEoQgpAQoqgadKfSi9AP+vP6F/oLRSpT71xgOqaNUWUVVFlahaaMMtN5IuxFnbOzPVOWfGnmVTkIraQQMPbGKvZ+b4XL7zfSpkPEzilpygkRXQhqvDosWfOVmNVu7g+RE59l26OE8msBPIN/dEPBfEeHZD5Rj0RYu/7RtPkri5nr83WdTYZTIqJ3MxbmQcXjSE2VKJHEpdO6mE2JF6SF+9MDHW/IC4qqraw8eBK0t1dJq+bK91TiPPMnnw2giLfpI2/0/3yJvDBeq+VcEnOEKoEVzQRVA4OBgeHQRfUa2rEVcxpodoe3ISZazbSRm/AM3RTmEMJYMkz9RM9PlIJtQy6oAylg3s0+tBB6z9/6RVGg76rv5774/2HaJEtClZWtAFpnwYlVTI5VqKK2wkAZUm9FmSprNcrexFM5jRXZT3tnDz6uf46dPrMDslMgf1pp9XAerOv4R93z/dTWwUUhu71oC4ATQTpK1jE/43ZWFI+dNlvEEM717E/veg8aPYvGXUy0j8BCNgdL/Ax+9/gG+vfoZ65xkHqZQ5H3OCQ4Jjug/l2IZDKNtBw59PP2iPUYa4KIrGgIeGwnNc+PXis2QmA25/zvQ4ULxw53d2draFxJlJzdHwpRr2ToVJBDHMpj3jExKUk/1WflBmnWwUyZn0og6i7QKPb/+KYmPIvgBBLrXvZo7kBU9/p7HF4rEBLl65jJUzZ9BJYhxKW7mzRMJnPIHGneE6tuo9jDsxwzWbNldmNU6QUZhSlKi2tlFu7kCVoj6hHSGaas6DJFLoGnkPGAwGjsTFP+uIuSq4J5ykZuK0WR8ha4pFl1dJhenA4MlDcr08XV3h6ZNt1JVGnGZ4tL6NWz/+jL0KKOykijbvdbo/8vgoY99bhJo/iyo7gTrpoyam/0hY7plwygrMry6fotPdw6X3VnFsTkgzic+ymkbO/u+D9v/CsUUcOXqUHXp39KSiFEKaLSv3ITUGubbIrcHsaIhk/Xska9egHtxAb/gbMl1AGdPYOfXCLyifYXWFvA8zt4Rk/jWY5DgMct6btqmVy2SI8Aj48qvrXFEk55XQHsRgubuxDbBzpieS5a82WqklRqdEGocHfZw9fw6dvOv04FtbQ2/0lTOnsXz6FKLudO/1fzUk0JAEmi0LbG2QZnjpkDAdVHslbn13E388fMT3aJiVwkBHMuHQXSlV6NQM6rnzMEffQD27jLp7BOMkZ+i/qIRQYFUji0usnl3E6qkUeXKQFP6/J2B8lUFrT77W0tISFhYW+DcdZBtfNqRFwCClgMho9G2BvFjD/p2vEd+9hrlnv2DG7PKzSGzJn+P3pBY0leaqeeJxcgekzZWzRWOWVDWUzCIt8sPHMXPybex1T0GbDLGR5Lt1BS/j2xfc/W8O9/HhR59gc3MbyrV1ki3UozGerW8Bfw0hwDTdWkRPUGhZF5KTVFzl6/Rkdnus9sLtgQn3e3BSgCareDC/ipIkAaFflUsWRPFE7zU748pifr6Pk8snGKWgHamhbq1EsxKcOKlrPH38COXukG1O7AiUp3aXbw8K+rq1o6rnM+kCLuWJp1+pHWh6cPKB/GaqFpKMrIpw+89N/PBwDbsoUVI7kyOhVC7vRyuQzfXx5qV38O6VyyChhZ77TIvVBBMmx+OIZd+6EfDNFzdQ7uwj62QY1SPsPtnE/Qe/ozYVG6axrdnnbgoKUeDXWJFXpRM/4SfYiGvMOTK8PjiHi6tvYS7JkUcRxywdlmEU+Lwkw2zwXvX7J0go01pTUB3Mxn/yAaOy7JMqoefhNeHWYxek+YKLl1GX+EWCLo5/yO93sYPv8w7n1B6JlZtyPU3rRMlYQo4GBksHRVaKqUQCXIkEOflP7j4oDjhEpMNOgp3I5HzA2hYEA11565IxRmZNUshW1CViQvKS/24UDqV9XFi+gJXBCvrI22TxS4Zq/HGx56RKcW93A3fvr6EoR1P+rw0BWcQDoYTI2Ks3yBokQiLaKFqJb8ykfE3xtZXNa9b+OZ6yRmLdQ4QD39ajdpicnYrEzNUm8Sg/bxdPStzbJpY80SStj3B5+X2Ssq3y8Q9r/ZelkDL6dmyvABGod4Uy8IwC5mK9fCf6/dxm4OJU2neev4uuW1UV/gYAAP//xF1bTxtHFP521maNiU0xl5DQBGhKVKFeVKG+V+pL/2V/QtWXVn3IW5smqaI0EiGNSBRKocQkBIfL7novM9U5M2c9NiGqIqSOtCKRzRrPzu185zvfp/zsoApDBCPZwtJlZtk33w0UzsZpXQXcElzQ6/S+oiyr4IDeK5aBvi7AaA2wpVToSq089Pz3AxE3caiotcWzE8iiKhpNsmwZqw/X6DufSHoPBePimQgnbmZrzmtVMML6BVmG+PSU70n/JrRSPtf6MZbsOCCKjEKtMZ4yOgEI9DAp0KXPtQ/e1t2IMASr8Lt+KoU14bL4MvHlfta2xVI5FIv5jVWDS+jZ4hcZuE2DfrKegUOubPZVfp61XWHaES8QuhKeY02HWq2qMZ+YaFrrED2wpPAXC4yiqyOt6ieHxBE4EieJpbKYQe2NWF2cqSenQ4EG27YQlQUcnDcQpgq9zS7ufX8Lf976HY0TICLRWaL90wRwGXnlZSol6xXRIhnYCaqpfkYpJDWFuK5wUleIa0AaKr76RJcLFGebbcZZjqyhkzkJBguaqJoasPAX1Uo36W86KPHjdz/gwc+/wrxKEKZUs0nqqa70hjdaOQ6/u0nfhI4tQfMPrpbIMk7U0Bxl5otjhMicLRzCWzqKWcXCKAf+ryzq6IRJGACksZ9n3nMZHgOi7yAgnSyavDEVMu6126gKe7EC6rAvMjWiplFwq7MSKi7Qe7qL3YebMCeW62s4+Je6R7tBczlMoHH9oyWskMr09JRVNvYEmAtY3YC/cIittId+ZP2MfUSaxbfSlCM2c3iE9MUr1Ps5B5G0/mrv0GMBJu1EIoGoHmDyUouDfDt/6pYNVVpxKVtmVWNmgLSzQkg4N4Nqyy40UyhPDnqoMzW0jvWNp1jf2EFR4e7K22TJKilHbhTK2gxUawl5cxFZdBn9gDzz6xYA8BQwqKfy7A1Wb85ieQFokdc/KaTXBqUz/2cj5fCZy3OYmu5wqQi8+Tfa6JvVqa6XtAEoKEKCD8xr4OU6sr9vI9h/gJbuIjJHVTB0HkClnegOHZqLMERaqyEb7yCc/hRJYwmZmmJqbanEA3rgBU0r15PNLdy5ex+naZ8BTYpjyOEgOdjn7KcVQLwol31d3Y8CrKjZwNKNRbSnOwxe+CBAEAGfr62hMzvDwQHcOPPvc3FtIPIoOgswMQ67ezh63eN6WF0q7o7udhePHz2p5leV/fFAUhq3RdBAf2waYwtrOG6uII2uIAsnUIQNaGdFS9TaUOWIVIy11WtoRQIGlyMCh/+BYnHBrV/0qxsSy6/dbrtSjveFg+w8ZhtbnWESKS5lewj2/oDe/g2t9Dna5gCRTiv2mvSl9gN9cz4YYmn+BUqlcUrPozWL8OqXaCx8hRQdlC5EpAFW2Mo97mLjnh+VbDxcf4Zfbt/jkhg+pxD4SGB4WuDNzj9QlAmEzfjbs1LJF1F/WSRZ587ur4aA1gE6bxH7sx5CMeOhzgvWoCaaklSDBIzNwNnvKeszXZlLFFEt8dUrM5if6/BYMUZEVVX1XGi9GFMK4xSsJzH6L/cRsV+4uC8Ka+Lt65PsyaVn+WU8gd33aWYE5IcHynPpqnOJYOAtUDhIcvx05z5e6JgNHY3sbZJ0t4RwzC9fx9fffoPFD+fcKLMjRkBY2jtpzCmHKh53E2xtPIPpGwYB8qKPnd1t9I57KIKS7Wzpyon54USvR5uusrvaW48NL0kE6K9eu4lP5j/GZNhmB6ZxcmkJlOcDXxvuB2efHLozLrzEp7/eS6LTT3hWJQLu/FRwjGOcDV2EiWaTL/o/JQXpktfEDz6JkyFHNZ+97J+n/ct4yVHlO6mVNnaQ4FBACIphOKOvTQUgxXFSJWHovRIYWja1LXdgJzFXS27cWU2SpTRHtA4YKMzjArof4Mb8Cr5Y/gyTQYsTZXaFLt+pABRUq5Mt5CKDxEMc49Hzx0i17Ws6U9N3Iso6MRcE0BBQQxjTIuzHJdVOs0CadSQLq1r7twEt0scUr/IzpXnPa5EtfZV+lMZxKLO93e8x29Vm3GV+0TmZ4k/5XBZVdP0o40405iReroTjOY4b/M3+mKcYW9YKXw+Az9GU1GZngME96bU0SXm8CQjBsW8Y4l8AAAD//8Rd22/bdBg9tmMncZrulrbr2nVstHSDqSuwofUFjWf+P/4CHtkDAgkkJh4mcX0YQtMYTFCERnoZXbo2FyexY6Pv5jhb9oBAIq9JU8f+3c75vnNOqXijDECgAEBpsEa9mC9WKu1DNZkLclbF2hYkkkxMPGzABGRuhTF7AdVJFxe04iL3PCNXrCTaTfGU0TFwQ9eibEb+dwQ0aIBQRdS+3wzoSroQmJmcrzF73JKv8XacfU5eA2nRKE9MSKxCKh0B0IcrDFC/n+SDhj5H/5+uxb7PNoFMNzEbfK6mA/Cm5moGqZvl31u8ById8NTR39MJMsxbWOyZigs/8m4Gq+rng5jlCXJ/E50kci9cnUQjBjBpnPEBtR7OykBLMja9IxDuYcyayUSIc1LCQH2ajIkf2tRoUuTGI3nLlZuPP2pb5B1EDz7culSuMhvJlUmtnlLWTJAFSP7q4tvbd3Dvk2/gd6XSZ0uMbLbjyiABwXLJYS2v6K5SVRJ6OLm4gLXNq2isLKGxdBZ+SNE3dTipww7evaM2Dvee4PGv2/jt50d4uveEtZJkvkSHk5icxzFZuWPzPoqT4gg2oEcmhS7w+QcfIRiOsPH+LZTPzSJyEpRDyvEf8Eb64vY3XqiK88ZYZW5lCsTchFrfbDEh0yeZp3EeHzht7jGppPKYjOOoNBpHTSSNSCv7ATvl2jObRiY5xU0JaS4TYSJuMMivw4xlWILk+rbyyNjMZGyTjwLpywa9DtJDqv5vI9o55FZdAnydRNtBNQDQkz5HeGEV17ZuYunSJcAPxFCfpAIKqmh72UEPDw938bh/hL6boVILZQMgsiOW7P9KVkKYZgi7A7R2DuB2I9aV84RwUm0u1d/NlR5xVp87fQq+58AnTWinh5JX5UzqkmlPKXc/Ttkrwp0gucw8s3hoS8cHME1k4VbReICo1UK31WJzt/5RgrtffYdI4xATJqUCs6eS+0PzJp1BXF7GzNlNdILz6IxOIEZFZQisTpNZ7SToDTuoVPp4++o6ls+IRpqflFb//08SwAAtxT81Gg3cT4aYY5MoeQYqceTPeZolzWkGKm5g0m2Uou4NUBn+gWfNY2Q4RmV+E0ltFXHpJIZJMvV/uw/G6VwAACAASURBVEaUqMt/yvZ/ZRz6SwgX34F70EP8dACP8ovJvTgTKsa6rUdZhjtf3sXVzcu4dGEBo+EIvf4R6q2nqM7PIyWfCIvA/AeviblInU+pZi1nUj+lrYXWvbUrr+GVtYvY22miRukkUcJkwKn5E1jfeANBLRT5WDYN8I9B+3/RpUCdNBl57qRDOP0O2gf7cJIRZsM6nMjFoBuz7r/Z3OVUkNR64J/711Sx7qZVlOYuozuzin79IrreLAbkfA/bAMjoKuL8/LX1BVycr+OEJ5GwQhIXB7S1D0//9VPe+tcvAqWpulvXwhrOLS7iAQHVhEz8PMRTcqtf9iqC+FSruGyUiQF6/R109gf8fbULW/BOX0GSBfm45rOJEbsWw5ffRNMKW6ebvk1V8ZKDo9THTLiMcOU6jvcfoNNto4o2kqyXV6MyR/x+Yn2G1Mv46WdfYOPGBlZWFhBHDip+BcftZ3CPjoBuG/4sFWtsn5DOA+i6RtdLc8r1Pc0ml3OTx9KFkdwHVyrpTD6QjxIBBtVQ07mApDixttubpw0B/yGRhkEJ82dOYnmpgUe/N3MizytQpZzMQudJMlntp2j/2cSpN99CEIg5oPgsjFM5RBIxNpGm82ixaynTa8mN8EwONEHG2HuTBTVXW8e5COSOR7XJK8FnIXEZ91zxNaEqe9fz8KC5i++3tzG3+jpqVGRxUgbzQrI73Bng1iq4tnUDN29tYf/DjyHJcuKdIHGFcoRjD3j67n6KH7/+ActXXkUVlHpTQj8eYvdgD+HMrPguuYGQPPy3PsuT4E2C9uLLVTO1gM4JLGaZwbsb76H66B4e7v6CZ91jJNlQfJa44h4zYVx8keSG9vpUDcwzNTcXSbBk/QvuGU3E4EFb9aE4gsg6q6LTWUtasUsoFyIsLZ894+KMj7rG9RmY589UvTzS2X3O0NE+S5gq6vXYE4OwwkhN2X1OPkvyBAk2BnfMsM4d6/7tejy34PcllWMio0UCn3HXpWA7c6+Xs8tQyQLqYPWTAJfPr+PG6nWc9Rsc+UfPPeV0EzsLv3yVNCd/ivlro4P72z9hp7WLAcXdBRXeG5LBUNIiCEArKcFy1UwS5kQKnuRt/lCwbdJwK1RaYeqFcVSokOfXpeaCEaWKUGeREkQCrAmkj/HnGDeKjM/wH60v1vbP8tkgYM87Hl9acKuGoRbORyyv4etRTMR4iDo/Cil5hqnGXQpU4Zfr4N9HxAx1xWlRmTCgYdEynT81EpBSdaKoh795u7beNooo/O3srnddx4mTNEpbCqFRFQKoXMsDVAiEeEAVLyD1CX4ePwGpD9ykUpo+oFYEKPQCatKitIU2Thzbe/HuoHPOzO44l6JKFSP1qZHtmZ05O+ec7xLYjrPtEMJJ/rmCkaWSxBaicikek3kFL5AEVWAhQWAtK5QEFdthL6XzR38XNxsm2VQYscqucha9VkTf7c3PkIucIM6Wq0IVIFkU+i3kocmVrQomQVUvxcIdNMhqyfKoKtXPUld+iy5ywd0kFjVQGFtCDsiove7LbFQVJpSBabBaZSgCfxR0hBMtv5uCiqzlaAwmRJ/HNITROFSfk3TbDd/ntu3CtrWxhaAEAUYvITfPTEQjwjHYtoWf2ENj514UtmLVkNeagZZ7hkcP17NVjxdwWCzFHIxRMQ7Zspua1pGQFVws0IHYGSqZfwWFQzGWnGZ88BsIQ9nkw0GCqIiBboor5y/h6lcr8Hri5680ql6/hRoaBhlzwLWU7vlVHDSaOPPBh/j400+w/MYraM3NIJ6ehN9uVoBitiKk7niWQycZBls7uP7rNfxyZRXfnf8aN1d/Rq+/xdQAAUoWnBgWDvTPdiVjeilnGv4I+OaLLzF95CiWJ99E0QqRDkbs10yXbp7DE9wubREpN515m+jXRRWH1uEm7U4C6hlXjtAEwsKIC9LesnAqZc4N+UnvF0y14eqJLYneE/tt8q9EaKJye6jERh3lWz6rOSGLEsQjhd7GJu7fWGc6RYSALfrkC0q+OPBlhhAiqsTiC0t49Z0zmJyZlQaW4QmLYJjPvvhbAO4Oe9im7hXt6aI0yq2akzWKYazo3x9iuL6B8v4jhBSzqMDJUzc7xHnG3GVWwExnElOdjvBKC7lI0gMlBIDwV4Pa/nSPEq07rCy0PW7aWH763CkZZQnyQYKJ1gRurt3GjbU7GPA3BAhJJE3XSACaVZYr5KqNxtwy0vg5JN4kd011aVVD/YrjrRU9/x3MzIR4aXEWR1pWdKwUCZ/Hv9v/l0GX2agZoz01Cfv6dqk+hQO15VaRhQCaORBENS4H7KUOL8P2P6ucKIReCC+mwmCEkYvS8PbphJKSL9k/EY82nkFDnUDY2kC++Tf84i58LzNim4o1A5Rx57iz/gCXV37EwjNnEQUxv0uGxG8nJeDWFFISFt3v+55wKNNpFyWEgi/B0/OzWHp5CT98fxFJwUonGJbA6ReXcWzhWfhRyEJt8LwDaBBPBwlQVGQrgaunO9sYdB+xQ0FECsepj1t3/8D1329iu9KMlu4rTJJhR077vb2AtH0Cg+ZRDIMp5F7spPUlz51iBDl4nFyYx3xbilosuVTagH3wmj9N/MN+Q7t2qYTgMgX5/9Za2DtcHI9FANFeIB0Mguwr/RDbD1eho4C1NKKJRWTBtED/yQ3FM1S46vzACUS15RoM/YJrbL7HVKIdHELcOY7msVPYufUAPok760SEf1FWXGo7Kzqnt9Y2cPHCBXz+2TnE8SH0e5uIVYS0u4W82+Wivxd1WJeAorhioWgpxPI7je6fZVkVPjQraGXmR4o4rJZgbHQtCCHocxLo2tpK/JdV02w3Rz82w0Q7Qme6jVYMbCUwiAJZH9/oYShTIG2WJXpbXWS9PsIoZvi2nfPukDkGvT6A7iFd/McjMQ4azOF2vlQ7avfcjCu9GiHUCHFvZxPf/nQVr59cxGEIBa6y6aw0bzzMHT+Cdz96D5cvreDPGw9Qzc6rqVORQUUSYLN7L8X1K9fw9tn3uZA3TDKsb/yF6dk5dFpTCEPpyHNk5mJtyAVaN0fYPZRsKFP4DzCLwzi99Bbfu3+7dw0qLMVS17nvusMiHT0l3d/Ss3peJf8f3+GcBL00Vnnsauasp/1nO/me0Vfaz13C3tVQHvjSN4UCYDepuUZyyueLon2NinAbhg1TEODGS5YKQprmlWbc4KGuMGkUuCMIGxWSgBszqHNBXj4tCGdqaBJydb41h9eeP4WF1jF2RPK1MrtEVQWyx10RSKQy4ZLSCPeTh1jbuI1+0seEuX+7FoW2SCO5oBQCrCOdbS5a7SkpBvh7ztJupDIjd8n9YJQLIiMQikY/H3DBle+9hrrOhRmyD2U0et3UstR1+kwq2rJlPtO8Rd/LIjvs/ZrWMmWkRYghN0N9sSg0n2mRJZRzZQ4izA6mFzhaAu6cao0Lom+KAwGdBWvJb89Af9BH4Af4FwAA///EXdtvVEUc/s5l793ttltigRTMggIqCFYsMSrBxBetbz6a+ORfZOKj72jisw9ESUxIqIkolcRQQ1AollbYtuz2suecOeZ3mTnTQgmJUadp0rSbzXbmzMzv8l3i3OMG24StRE7KqiIYxMJXsF12VsRUXr5N+O0HyKx4nysqGJgo8zzeDVeu2J5CNQXoQdrd1cQTuop20ET5hQG78DyBKoJCP4vfYQqji1Gr1pw1n+2MZ1Sl0uJE7nlc2koMd9l3dxmM37UP2UbFbhB6MKwmwZAFCWUzijVi6n4Pj9vj3jctkq2CBlAcLn7Stvuh9jkr3B100BjjqlN2M0ReRTUICoiIn6j782pFHEfIjserloV5YYm4wxfUm5vdGy9XH0rmtgwTFVUU+0aruGsvQ+Z8mcRxpzgZjXMR1WI0QxkYJPjt+3nMfX0J2bpUqUXIKuBuFiAJIbxKPTX0GAVQAWY/mMX7H3+C0+feQnt8TOaQBYTk4CaLQXDXxQjAvxIjLNdQHxtH68AkTs6cw3sffoSfrlzFN199iR8uX0bG0nLQznCmAGzjAP3U8SArQkI4pb0EFz/7Ap+Ot9E50+UOR5inDiL4LN3VIliBo7JAq9Myv3JoRuHTD8LMQY2KANS+xsLiWAxnV0fUqO0JPJiSz60Ti86kKHaxt6xxgR8/KwjdXZg52JJhsXeejO0E+WqC5YU/8PDufcRkSV+W7q2xYos6D1zbCSK8dv5dTL30CpoTE/z3VMNN+hoiwjIy3N7u4f5glZ8VtsakynYmwjDCuxSOJKhC++cDRKsbiFIp+AX24jHF/AeqVUSFyVZrBNWSoHH4mNFKFKFnSpkKPlFnz4kNxYpu8dbJwqMD4wI/2ROh63r119c4kCAxpRvX5rG8lspLOdlMOOiFw0hEJIGHUusgMHYcg3g/86IDtbSk5F8C/pQTgJw7bANMHd6PoweqaOxIrlNnpfh/DSkyBYgrZTTbo8xLtHvdihwZp+MmnXATwtNZsfBcClZi1DMSVFzE1lLK6Iqw00faOoY0aHn7zYeHmyLNCpUWRB2kUgulkWOIO6tIV/4C8AgmiBSV4GRw+Vm8OvcjLrzzBg526siTDJtrD5Gs91Dq7GOesnlqOvoMw4fYE70p2YRBjMZYHcdPnkBncgzLd3s8Z81GGdMzZzHVfd5Zkv77o9CToaept7KETfr/oxrjULYHW1i4sYB7yyu6rrLfLBi3rPuCdACGYR1mtAszehTDcht5qSooHUITieWM8MBNimajiu7UQUw0pSvO72Jitbdzq/2f6wDY4nug+keVco2Vy/NhyEUji2yxfd6nlSQ4hdJz14r6GQ+uXQ4GaGQJ+ivXWPSzPhUia1ZgwmqhLp8rT/4xep9HptOzPmZ6XMIfK4FBP6+ic+gMNh7cwWavhwbdioHw+I0mCpFY8mPIatfAd5e+xfmZaXRJt6VWR5YOMBw8Qn9xCePNNvEYeJ8JdSQlThMCOhMtL5u6uKQNRPEYw57F+orrBKK4p779QrurkLe6WhtSYyDMH49bSIE7HWZojTSw/7l9GG2PoLfUl/XSabCFqFgRR9UU6K2uY6PXQ7Rvgu8UUbi3afLOdbNd4DzbG+ERBI8nlM863Jnn7upA7f28ZhcMtrYHHPPP313ElZs3cfjFkywIGGtMEnmfnGKlF86ewtuzF3Dr84vCqWOkifUmyQuEhiLwrs/9jJdfn8bokUkM8gQPHq3h9p3fcfrUq9ii2DkscVHGhBo7sf0x9igCiMgl72tdz2GeoB5W8OaJGZTLEa6vzKOfDpQTHnNc6dbWaIHTIhRVVBIauQklNxN3JhsT6H1t4ysL6/b3R6D6M+EeBYB/MqTbrxZ3SmmyCZ/EXzvt6wiqb0WZLYSdY3vVIcg8rClTAIaJ9z+QzW6ZE8jUiEg6Uxb5/SOMNdo4e+QMuqOHUCXsKwdssVLXFMWs5LfgCedort+kqPQQA/xy61csrtxDXAmw0d/gcy+Mg6ILHhYFGOhdKrlDqEl/Wtin+8hwbdDuQJdbUflYdBF4jkgsMM04+ae5ZJt7Sw3RAoSlHHBRTenUfmPN0tK5ocuiwpayJAr/jC5XNAD9vlatcjJu7dBpELWAXSC4CFPQZ4u1LobL/SwyhWPInZTc3a9nRDgJPec5/gYAAP//xF1LbxtVFP7m4Rk7duI0atPQEBJaEgKUpxASGzYsQCxYsuCHsEfddVEVISF2rFnzBxBsKqS2UClSQ2noA5cmddPEJLYzM3cuOufec+faSREqlRhppEpxPeO5jzmP7+FGRRI0UbynH1d4LyO6aT8BFU9/7SmNO7X/sOLCG05FNWFZYM9WLygxkCTS+U56oguMGlBGjTv0lA9h4StyfaPuX3GZhTPvPmvtluT+VKlcsaNQlUCeDIBLiD3BNHkmMugGlVBdg77fTLaIvzO28B5yEzDqoLGzCKyQAsoK35nFIsUBVZaH7sEXQGSYtj39Re0fUoFiCL5UzqwjgZzjUHCpDhWeCqgRiikxkVZepXLIZugENTweEldPLWrCLy7QWBFcSjg7obW/EK6LFC14k4pT7mgPsgPU0sQ+94AFZtIixMMb9/DTd9+j3/kLaWFDIV2lKBzmSIdCEKARcGrxBM5f/ALnLlzAex99iMbJGeRJjDyJOHBgM7YgQiNM0GAQdY5Y5ajpAnXqgmvFL5fp4zNYeWMZH3/6Cc5//RU+O/c55pbOWD96zaKCkfk2Md5BkzYGRKjTrjYEij+H+PbLb9DvPESzrI102wIrCDiyaY4vah2OPF9Zf5KMC7UEVo9D5pqhVlSeryI2whtEXjh+k4wJjZusM+UV9OAHF0fco9sz7Hx1XDuvYFSOFRzMHA+4Kz3Y3Ue+e4Dujbu4/fN1hEMTNDLUyXHmKvEhOpdWVrH65ttonzjl7ASrV1GEPWjcwQDXe5volTnKyNiwFHnFHQusjWMcKGS9HWSbXajtbUS6rKg7Y/V56bhNTyVoTVHgHtmXRmCVa3Pu2jvdAFESstzTI4ueY5zr0u8aFBnyIdnzHcNWZxNra+vICgt5jyKk1DFjcot9rux8P4Xk+GkM4lnshW3umo4fpYO3l0z4Xz49j3ZqOqWRIBD00+aDP9lBVmEU6CdRavbjsW/x9QBCD5GjPSEyMysKJHqIpuqhsX8H+v4VlPcvY6roYoLg1xSElvFoB06PBXi2+JjVJpBPLiCdexUqnUWmG9z5h3R4rbs2PePfft/C5StrzHUPrebEsPeIhcRSWz58WgeNWcLFYcUFtKXVF/Dc8wtclKRZOTs/h5WzLzOiQqmcobUOas1n+Y8J55Mcgbxj7erd7T5gJEQ9SVEUATbvdbG+voHCre/QYQa0O2PkmDBolskzGDSeRRlPchBqAlldiZgNhsgP9jE9GaPVCBit4+E7vIT//5nbvpgXIylj62kfRB5WAkcG1EcdgUvVPR0HmKJIrczQQh+N/T8QbF0Dtq6irTZRL3cQMEaqGF3jouKnvU60vYB271qrMk8F/bCOg9YiWovvIAtP4gAtQCeGQ+zG0nTSaX0QDWDj7h5++PESCtsMoHcnWbn1H2yx1R9VWKn4GGsjPMc2cqW1oxShP4I8238HFmnGMGH2TTRWfQElT6ERMnOie8LPH2lIUSxnslBCMZAYYLM1YehPYWBtTKttQPYUesvVaV3t9JAoy4//FwX9xzW+zB//257rX/9x4qbULI9qMXpUjLl6Dbf2CJgdMHXO3Qb/wpgL6ceWFvDuB+9j+cVFFtg8FCPaAn1MdAB6Ho9KrF36BWq/YJ8Bmgvd3jZudW6jXwyQkx5AoJy9pxaRjyOYWIGg8IIKiUeivXUkaEdNvHXmdTzTnENdNbhiaNxVQs+g08R6aVzjM7J8eBPbkM14NPJbxhOrxFIufU61WH7L50WXC15jzR8PvxECjM+9wwlf6Sn90/eyQLuqmjdZViXARZFXyb80Z20TkP6foTtqdxr4uM29lNHZohiekAOU/FOMOOz3mXo7U2vj7MJLeG3+Ffb7ZxHsoObdaTi2n44e2or+9bCHPob4tXMTNzsbCGNT3CMBR0KH5qVyrgTaJd22CemNhRkHg1JtNOojhZmR5+flPSZhN8/LuSYwStW8ERg+7+U2lOMZmrURh/e776IFJ/EjfZ4g9vT8Kcmnbj41uznnsfdGzTBCAEhSzjoMHCNXebNc24+pmSrkxA0tWsNS7v0c3eTGZm4IEpg+S3p5PDejEH8DAAD//4RdSW8cRRT+qpfp2bzEJMFJWBKCiBSwIyJxySESgiDEgRs3DvwA/gzigsSBC3+AK0ICoYBEFCIhiJMAcWTHiSHB8Tae6bUKfa+q2j1jE8YqeRlPuz1d9fq9V98iIoDyj3qfSIEM5CjJRY/tohA+gTPlEDYplYyzHKOsGEtIpVGQWeYpFxotlhg8LZfd+dI6GzyekO9qNF8fetsWJ8TiF487WZnMHnkQOSGIerG5BSqiH06TQITZ3FYQvev5PZMO0gn4c0LNAnpeO5XLwPHLhftuJhb/hFJksxkQhlH9ZtsCW9fQDnhahOvY+Ufonq+cWJ9yCvnCOfJiElEgXUtyUckpEV6JU7MVAJwpXEFiBdC8yinrirxI64lZukaBdPNKS91QDd2FqmoU3m4B8CbMJLAbJ5jq9WSBtbjIoPb9WuvzsOdK0R176bgzF0uRxsUsYj9svBAFklvuoU8Y7JqxomjkRkVRYgtn410lIpssMEDRez1XiDcL3P7uOtZ+vYdOCVGc7TZE+JgUCHLPqZoT6dRPgMtvX8SnX3yGdz78EO1Tp2uOWSFDCW9aGl+E3pQUg3yCWO+hq0fo5BmidA8JgyobAgxheoRkBjhy9jg++PgjfPLl53jr/fccDKqCCYzAmyp4W0zLy2VS2g8CTFURNm+v49pX30Jv7CIsbZpHTjw5WOR7WV545PQ0ArmRleU+VLWqjAx4IUG6E0SJ/L6897BzJmpFzlnB7ZSG1r+XfzFqJTLfPXwyJLQsbtVz3qN2rF+3hachCGrByMMewjErda3bwHPjjQfA/nEmxECF52UUiorBWaMXzyDeM9hcWsHunw8RZrabnJoSI1M6nIVCToHIdge618VLC4t4+fzrSDoz+8KMzuIpRYANFPgtf4QbGw+QRjbhKZ06tYdKsRk3HOwgzlIEO9vYvb+KnrFcydIhVIzj8zWFAzlm2m3Mzc0goco69SW4bkuq7e4hL4YigFRKZ1iJoBKdLOpEsjmwbz0HX+woqwSMdBej3R2kaS7+20u3lvHHrQfO0YK/Q8HWXPrrXKGE/DISmd4p5N3nMYxnMdRUgW+JUB0FvKqghKaARuDArIbwV4WTx+cw3fE64Fpstw6jIx3+0P8z8NTnzcTQan/IPoPA9QP0aCcl/vk2qRP7PGd/altwjr6gLU2opb2lZ8NiUErGCl2VYaZcR/T4F1SrP2M230DXhNCpauwQejstTpzQDu4kRiFoALgVTWHYnUfyzDnkEcX2Eltc7BuNOdNQ4McfbuCfxztohW0Ugz0MWOwMt6VdI/wRbeqhoMfGmCvE5HBNKhnu/tji7iTjeyvAyRdPYGFh0SKjAEEEXFi8INdWGl16BGXoa+2Gu9fY4dfu068v36/mqFX73KDgKdEnQVVie/0vZLs5EpWgE/egqhA3by7j7t01uj4Ly5frN6txAETrxahE4f8Yukdfg5k+g6I9Dx3NwpiW09MJpPA0muJWiWi2nD4xjbPPtdCOGhDVQ8OYHvs48KyanJMHXz82Jq7R5OutPIj1GBGKJdF7RF6FShJm5YSxVG07q+Dd3/5z1DPOwDvI8xjUr2lrhSMKmE0foly+iuGdrzGX3UNb79S6ITIHAzQU9K0iv0tsbFuL8cNW4c5+L0QZ9rETP4vg6CKSIxeR4hgqk7j32q4fwQE4WlSsLDXrm+9/wsryCrqE5heFzNd89wmKrb/ZIRNbwajIEI0yRFwTlXZWXiFMaF0EqH1DD+6cdEjSBjn/uYMpiaiSJkCYdJEZiF1sxbxUlLitFoq0GaRgKpCmQ2mAEf3an+rhxPy86AhprcauMHwDQTu6oTEYrK+ibzyHOahtma1puXEWel40WB28l8qcCCS0aJdHikuM86of/+sHH3UTv1nA+8JZ29jiFc1tfqVgSiI5YiytrOHqnd+xjhJ7ojwfuKgVib8RMCN0shfOvYor715BP7YIiKC2ylNOIJkOSxE61GXIgDvXb2LwYAMdWNG0R9ubuLu2io3BFkZ6hExlyHSBnLQMYxFajBMUnVP+ax+HjXOpULYxpMTq1aCNAEfDWVxZeBPn515Bt+qhGhrbiKULFfN7d65akMLW8cBbnXcSNu8zaQJIzTFhL1453S3q+LDOFFE8FclnUmeZf1nr33Bs3XiFeA67KVfIuq+8q5BHQ00U/syN6XzV7U5ZFf4gklrLK8/7nefm6yTPJ4oXNh8X7QfXtKqEROM3O8I6P+OxmYMLCZIblTTZSK2+GDdEzKjEdNXF5XOXcOnMG+iL23+MyIQyd3ys5z3WomJMneeZugnO4r9EJsz/EveH93Fj6Rq2R1tI+bNQY4hCHAHMmP5aUCOng0YjwDQ0NNisyJ1IO6ShZeefb/4TCZZQGNRlurHUKIHEBsnJAjYdLIrJuzzV14b1lSQNNj7TwYI1l79mzOto8ejvkXSfsHGEOaMTqRWNrQBFZTDKiZOy4pdEOuRlLscdjAaikcLj85pbJq29j/vma8GdHi8kLfarsaDF5HrWDSeNhDm/MiJIzbqXcSgf5YLkLdIM/wIAAP//rF1LbxtVFP7mzsOvsd0k6ouoQJAIpQ0UFrQClS7ZIbHiF7DvjgUSv6hCQqzYsWlUEA/RUAUFRZQSIdTQ2k3j+DUzd9A5597r64mLhNIrRbGdzNh35o7nnO985/sieDRcBHBoC3lUirBcwn3alo/MKpFGEJB9MYvcgQA2SRYfTKE08IEITVXcXEShUs6rMi9ESJBOnL+A7QkX4SpJMlRoPR9Lg2TNV824V1lZZGbeFkOS1VlPidA4lJfwSmW+8NTPlQnufSq01QFgbQBdeuhb4KrsMJRq+mmlKSNBdFyVp8puR7Wiy9oCeWYEKzT7o8aN2DEdYNAuGDQnXLA/h1RqQVHZtsRoGcwED0VZc5EyqnusRagwbbTca9QnQwBLrRYZZMoCRzMNBFF1N0hlFDgbDHv+6XzQ/Kwnp21XONYKgtKxPrShHbGbwqHGHz/tYPv2D0hysvY6nowomQAnvdmkQNgCPvr4Q3xy8yZW1zeg4ybTfmH9hFlhOEOdQByyHxn0MRr00O8/5ABI0c2nUEyVDOs11FptRJ0UYdqEprWrGghqJV59Yx2ffv4ZTrea+OrWFxjkGQuOFYbuyICHqVRyCJeXXFy7/eXXWN94BRc/uMqx/nQqKHikarNKu+kzEnFNodZXCwaRsdO0bTBkFWkpSazAT+rmFTDLHXPzlNaEvV5zo89AcX282AAAIABJREFUzB2rajp3zVXaBqrUI9vOEnoI69zf59gDSoQlqeKlSuTjEfKnGSZ/97C/uwc1zEzfuYCQ3KIh7tTIygBH4xFOvXQBb954H6fOnhXRJ2/vOZOxgb8wxtb+Hh4VY+i6yDZyEESFBk+Yk2CoFiGrBwPowwFyCjjdrOVmqZVda/JqnanUTWET0Y1BS5rHbA6mkk75mJI2R0zJKLOKYhNQV8syi6uRVMmlgCUbDrkqPc007v6yjSe5bFGWPidixiIIwxR5uoppch5T1YUmyXem7imvkmL84nXJfsrNpkKzHnGlNHGVo0oF8ETjZJVW+70RBhEbc4oY5PEjCA9EeVbrpTLS5Gx9xcluD/2HW1DxMmrnlpCgbfzCjYUY77DSpWm8pielYgG6WncNRX8PIQV644H7ILYCRWt357f72P51F9euXmRHksngEKP+YzRaKVTYmLMZO+mghEoHEV/babeDK1c2cKoLPDwANt6+hLSb8jsE5juqDBZUgZ/jKE1jdDEZY/j0gNsgkqiGetJgUGRnZxeHkzEHgxPT8KOlaUhae0gIt1bHBMtIumvIktPIVAd5WeN5OvCMKn+UJAQlV3I7dRKZg9Gr9tvb/WtOP9dj/3+HDyiUwfyl9t/kf29UVcTMCMoZYBkw9F3w//b/+RnTOERnrYEiiZGHHbHMsw0Yhgp+7L0D77vAtWUoHOkIcbiC1fXrePDoPgocIsKI52avN56P2WaEAg/2erhz5zu8fOGs3OdYGDnA4MljLI2PWJuDMxO6CVCw7gAANQMmYK2TE2nzLAvE9QYD+5R85ZnGcDxyMSynq0nE7BNuLii1sZk1cSQE9CAxwLTZEs2nojTrRnPiIFmvkriFYh/ax/AIIIovMxhDM9/j9H9U2vLmCmOUeLAd24mXlNPoCYy6OqrW2UVg2hQCTMoI39zdwruXN3Cm3mWqtozIzYESlpXzq7h2/T38ePtbbG7eM/5IIZ9/GFFAZRiQlKIMe0NsbX6PG+dWEC81WYNk//E+olhJ1b0jq5KEUZN6zUD8ogswPxTT9t355nXkIx0KK+Ey3nntKp/H33t/YpAPEcRmfVIO4C5v+awkck4xN4WqCfWTL3Am4t/POBl+/mALZP62ruJs2wrCcGH8a+N1Gz9pA0747Gvaniz9tBGmY7e2Yn4/Vc2nar5BgIVaQAfhMhJ9hlzY2lQ8DaYaL7TP4PKLr+OtC5fQQVuSfz3/HTnT3IHngCNsNmkKobQ342R/Hwe492Abg2xAynKs00RZdkysA3ZnEeDbuc9V3eNC+Hd5aQVXUhjOc2GY+RR9yyCweA7tRYTsKd6drWubRFNh07LUaDtb5JWWFLuqCdghBYRK/lSWrHVmwSLaPz2ODIghPv05P6e12G6nHHdTCz4zvzybeQblqc2Qc+VE7ntmPpbF69w9vM/LbQxKsT4eFbdHY2mhZ/eHJMG/xF3LbxtFGP/ty+tdO++qoaZAoChKS5RUaREVPRT+DsShEuKKEP9UDxwrcaCqKrhUqqBQCG8IIWmiRonTJrEd7+7MoO+bmX3YSdSqVMzFh2TtfczOfI/fw8+5/iX4PXGo0lQL2dkLZsE2z8t58nZSl6eO5gkXMBCbaJb/DhQ8Dl3BqcI0youfDg508iIM91YLkMkjJ7SlKniea4TltIp9XkwYOEYZK478gZeEYIoXROWTwXajUSoGxAzxd3KLkMAvOCMV33/PzXUJivN1cwELOyjBspPFnGRx3QPnN3iv7CS3RQ4uxljuX8kvUpiijVUu1WKOw0Ip9CJTdZO0GlRJHPC4Qb/X7/VzQUO2aiQUgpQGsuQOWdIMQlaqwzXKo6YySf8rFLJeiru3vsL+5gHiEzZFZriRlUcAfPjJdXxw/SO8dHYWqRPBceu6qcbwYZ97w15vD70/f0fv4QqS3W2EjoDTaZsil0Gk+AH6dF2krh/FkFOTaEy3MDr9CuL6GFKpcObVFj7+7FN4tRA3b3zOyveCbeeM3UlpipF9W+xIdNsKt27cRGthFu7LI6buWNXUEO7RIV8h4ufm/rI0f7JcjdaUHiq6HfKI+11N/mmuOkbFtAynKkPhbPJvqSllx4wT58ogk0FHWFxlJnEacp6okxhVr4vttU08WtuE6oPV/3n/tVYrprMVUhEnjLD0/nuYu/IOgkaEcjOF7jl1l3YA/NJtY3VrC2mYslge2/g4+rlkxhWCvjeijeggQWdzB0mnh5oRZSszg6njzB12+zvUF5kcRdSMdWU9yzjpcE1nKHNNO4YCLwp2PF1cdazy9sDgqzRBt1MK3AUJxu110AybaG+08d39BxyWCTPz8+eZ00IieNEp1CZew2H9NIujgbi+RnjK2vUUNqoU/aaohS7CuoOKnqPSvXPHVj7+L7i06TzS5fq+VvYHrPhfDq7MLT+fdVA/MkjWkbV/gAgm0Dg1j44MjWTcCdfMHpESqQogGzPwxzaQbW+wmJZGNRRH051MJPD13XuYnz+HkOwoyQP44AD1XgdOM3queyQHOoqs6yJ1wBCEHt68MIv5y4sYfbiO+aUF1LkAIHTXyoLOlfvC6B5MKVEC/R55g+8azZyIE8L19Q2srP6DPtv2UagpcCizvLsIY8J6mGTIplqoTb0BETS5sJtQgGyeA2BtDrVdXeCmGBkNWQfGFgCY0fLcxawXN/L3n39B5WvQf/FUGLJOxT5S0U1WsL2eQQRTGDlTw34cIvHqRueCiuAm3nD8wiWAiwfKLMzVN426ayJqoitOY2RmEenfq4jUEzgyG7gC/RlR0KokvvjyNq5du4rW2WkWi6Y47vHOY4x3unA8bekn0j5TGZCJYxMySxNzCKFDDSM/hiBrLiUQRpHh3BNaSCu2H6ZdtiNT0tAxSLhVwYjSAQ2yZhxrssNLlhqbM1XQixxD8qe1idBGWbeLZL8Lf2KyQHMdAzkpYrvqXqDRO4OR8rON6n4stbMnx4eVUnHxm9S1hMJfu23cWX6A2UvvoglFagAGKWX1d2gfCDBz/gKWrl7BN/d+BIXCJC7H9FQWvy0KPTXHRy/L8Ov9ZZy/dBGtqTmk1PFNO9jafoQGwbcdhSCe5L25Lw5R92OeW5ISniFZvJOHT3QAfxxvz12G/Flh7cka+oSC9ZXp5Hr2gvmjHseG7pjxOcvc70ELR1oE83Ej8IPKXxJZiAzyLm9F7RgF6iA0FnywrgKlRJUWJ9rny3TnchzvWSFyk/wJOYwcoPyOk0RDc9T22cMOKnmhVBp7QaWRdF69xsm/6iSYDMdx8dwiFl5/C2MYN0WZpy+QMsoJ2o2G1vRd7OHb377H8h8/oS963I0XpFRE813qGI/0N/S6bRq4FtFiz/spFm3r2sacfKoKJMg59pTgl4XRh449wrGOBrmL6PtVLdrZZhufoynGMJ2Cmumh0XsqiT/TeRFFQEitjWXnB+VLFIfb76bvso5p5WF17XSzdmDtpePYrU6j+MkmNY7jPFdUSuFfAAAA///EXVlvG1UU/mbzkoU6zlKEIERNhQQIKbwg+kIRywsP4anvICTEv0SiQigKIJagtE5K0qROa+o0ceJttjvonHvPbHFKUYu4kmXFseUZ3ztzz/ItWvsmybj79EXEV+Ak0Xypa3gtZZ/KvG0gcouSkipamHGOZ69VJI3vuOGjiO+97pxfXLww3HrqXBIkl5JToQ1cdhGmtmglocD8JEmQS+clkJIyv6fAq1Y5ZELOKYEuWIHeaBiKo30f04nTOgfCGylX58oLRyaSxSjYgk1zWoRXn/JzjJBE3vNT/GPLC9UqqKorI6qnoVdRVOyWTRqWETiUBaaLAcpYpagCv5xeo4qXiPrR/12jiMpzb5wWLCuzWpHfYNLcM63A1pBwuh2FwwAu8UJ3D7H3+10440zkb/LBk0848Pmtj3Hriy+x8Po1qMoMQJBRsgGKAuYX2n4f4/0Wupu30dn4Fv1fNxG2/kC8exeLpz3M93qYPz9Ds3+KK2dP0Djronl2jEavi0rnPoLDHZy0tnD24B6ccMiFh/mXl/DVN19jfX0d0+TzDbICLG4OvPlSBTAGaxi0tw6w9d2PsAeKN1qmoRifWSWoFWPBmdo+FqBQcj15RuciThX3pVLI1JtQeE8GSZITmpTrIq10moKfzFF5rsr8/wtTYGeJpcprWxg/X7HykUFrhPQXiP9sjQIMj7ro7OxBEQwNOmjR9k06BaiRbRb0OmteXcS7H9xEY3kZdU6csu07NFZTraSPX47IAFCLctK9TwQKUyeNBAxHnU5cuE8GiP/qwfZDVFjEqrC8DBYgo57M1i281JhFtUZBi6stdRRRmsj9w2ZdZJvggZUq3GpNizIlOb7chA2V9cuUgQYSFJNp2TGCvo+KW8POnT/RfjgsiHXrgNR0cYnhbs0g9hYRT72CyJtjb+5LBc4KRdUEJi4prFw5rv97KIHd0rVQYXKSnnXxuH6O4yNdgCmnD/TvIT7+Dd7wPtxkrIOl5B+qCtR1sKsYYA7VBS0kaNv1XKCdURpofe7s7+Ow8xheXdsCDU66sKJAw3Rf0BDdj1Tnwna4WHnzkw/x0WefYmV1haHOsYF+25PMyl/gSPdYCmLCAOPzvkmibER+hPZBG8enJ1pXQYXwVVTGwvC+QPaLlaVr6Fea8N26tvq0NGS9wEOlAJTpK7SP6Q6TAjIhtP/2dP/10Hxyrbchj+yeY6DfzzlHjHbhXziBp0JMx33MBY8Q7W3AeXyHNTHsJCikiEkOKXEJwKDwXp86TzNXUXv1LYzQQIzpVCSsfAvhwBdApzvC9xs/sw8/0aQcp8YQYzUacWGSbj68n1BAr7ICQCFYh0F0VTwWCqXPxIHP9wpCuNIzFQh0EdbRhQXHNQrmVvoQSgCM1dZ0rcpceYudBMT+tVigtUWAeODDHo2ZDiCdxOx+/5R5mRAnPjvt6ukjEf0qlaTHLscvWhmM8rBsnAQ+ftjexvbJI4SoswCjeHE4GjeLqlvHwvJrWLtxA6tvXjeowDiLDWwrpXLR7zbrWQh6IX66vYnR8Tl3kD1qWCQRDh4e4qjTRn/UQ2gFGKsRP0d2mEGxn3Ho9peNKqpoeg28/8Yars8t44o1hUpkwYt1oqttUvWcRJHipIn+FhSujrviC82r8uAOvNEX46QvCrN8wcRgopMluVAeAZuPpTRiVvvES8xum0Q+/xohCmJj80Yo6vLIFwwm+d/nh4bvg5EtDjsq2Uh8hWQccfL/zsrbeG91DUv2AsdcVVz8vklDUDKxKcwH3P330WrvYvdBC4ETwJutssg2o4UT0+AYDLV2m0mIKcbjTrurOfhl9DPECs/sc5Lr5QUA6XPiaiXJudBYy+jnLIfM6NGS3LOmAj0M0jvj/uv36bxOv0bxer0+xXpwlNuJRhfNjYiicz5WKubweZjXJA+WBp/knXndNdF2k/nm8yWEk6GoS56YrjmV4G8AAAD//8Rda2scVRh+5rozu5tNGm2TSoIphdaC11KwVpAW7H/wk/pB/Gv+Ab9UxC9SrGBDFWLTtLZaTUMupDaZzczuXI6873vOmbObUhRE90tuu5OZOWfOeS/PJaTuPytve+1F15ojDtPJrkrrkWgrBzopII6oUXA30H/itSjHagTTnXoaABroIGDrD/c9EzAba2XRyANAHMYksU4AnCyzEIfSXueVVSWf5Or7E0kn3XRfX4+pKBlYdW2EILRYoSmKWOpA3ViFe3O+pvtP/5sTZDuAjYV6uAlvo89BBkvOjSpEnPDzgMn2yIPstQlySztoB9ksHmaw3UH2dbfyODeo1JyZxgpNuMUbd6x4w+sNZNKQYIi2SYpCQx0QgUbiUbsJfTEq9IbVWJgTw8D1pwL9O1tRcxanWgtb0H2oeIIDnbjDD3x0VGPj+x9R7lbojrVYsZk/tjMiugQkbvXahdP46PPPsLh8DrXqCUSMODdBgKQTCZRwfwfVD98hv/cTmr0/MNNJUA4rhmYX0ONLkLA0QUE+9mmEbp8KCYfonUhYiKzOchSHQ1QHR5hfOsN+g4tLp/Hxp5+gPszx9Y2vkBF/0QtYzRkmSOD7J4FQXQDffPEl3rh0EfGZeVFUDhQvViL2JyJeUK1nKffpGimysW+tgQ3x4tZo/Q1f60BIEYnubz1u/fldMRVlxDd1ZTHSm4o7z9zimllcPd1hk4XUCRanNELMc2J+pg2M53HoMcyTnpN+1OX5NRpmyDd3sbvxCF4uwe+4NuG6x1XYUZVzV6BQCteuf4i3Lr+HZHZWYL2Brzcdgf9vA7i19TvuHu4zj9hjhIN0Cfl5rbUpGemYEGnraY5kP0fx6xZTTcSOqxZ+vvJ04q+swwQHRKHCzCBF1E3ZTqtSPvJcyhWEMEj7MQbpHNL+PBo/mAgD5f54lvuvtMaApxMBRSKOlP2PSy6GxdTFH3u4c3uNjz1Srdq3+/KDHjLMIX35PLL+MnLMcHLqEzeWN8BaOlzGztMY6Bl7nVhok6brKOvOf98xbVyLNL0xE19vWGQcGBJ3sxk3FmrYKJOl/13BNM/2lunaCCoeqww97CA8vIvRkxj9c6cwUh3UpHgVSlcRzj5ij0U/h13SS8IoPgUkCxgebCH1xmwpJm8SygW9dftZjdW1uzhz9iQnLcOnO8Do6F9FV3iaJC730OOYtzc/wOWr73MQfHJ5gZ9hEUVrJqzD2oP8s/Nppgr1BvqqjH4AHa8cs/gf0QCSsINup4vDPzOs3r7DNJ+aRf7Uc0J/UkmI4Q8WUc2u4Cg6iZIoE34o9RlVTxSAiNZAO0SSdBhqrC3hp09Yc9r/v2oA7e+0DlIzgbiatE9l9cjqWEA/C6YYYGD5OIanfPHL1wgMe6WeONQMmhxq/BgHj28i7r2E7nyCKkqs84LoX3i6eFkDLj/a+p5rSEUI5pM/bboIZpcwWH4H480hgmbE9CdbRTRxADUn6gpDssn99hauXb+KuZkYdRWiLApk+/uYnRuwqpyvYfrTr4D2RiV3I0w6bN/LUQHRHSkmY9i/nDbtH1EYCxahqpD2aL0ecfG2Juqfr+NEPr+Abagpxhv0EhwNS9HhUFKIciUa4yBCGoWIyxrF3j68lRXhgzuw+Mlepr6zStsFaqqbmb/C0YdeL1y+xXPWHXevtbvl5PusnXMjej6+OZTfIqYadmcIsbH1BDc31rHy7gKWWb64snseEa8a5msD595+E1c+uILf7v+CIlcIOdYwCVGbA/iVCHM+WnuAvcdbeGXwKpDEDAknHZoHmw8RBT6WFpaRElCOKKdUNGeXmuY47Wrq2ieuk1ELVELqopss4sTrA9zfeYifN+9ht3iGZ9R59mOMq8I2AqFRw6SvY8Yp0E5Urso8dCxjGimcN4XTwoHO+FEXVgd7gWnmEeKpo3Mr2t8JoaVI/6DkGUVK+OxsVo5tg8LqJ9EaYM+ZhSHgR4E0SDTNFvozIvRX2nwlTfu8xlBS3brANZjt9lFTTMY8NtFLOzVYwKXzF3Hh9Fn00dds9JCFEl+EADBLaOsoo9jwL8MQ67vruL2+ip1sG3Gvw9RURpCzywDY2jBNY+bw64/KF4eSEfji2OXmEaUWr/Yc3YAW3i9o5izLLNKZ9dZcIXVCGzjFRKEUOE4ROp41427iXUn8JwsJ5nuDBDAUDnIbsX9zhLHNOZtxNk13ts9PEhEi1Hki2RQb54J2rslcMHkiXStZPrqoc/N/GAkC4C8AAAD//8xd224cRRA9c931PQ5gk5gQEuQQsICgSAkS8ncAbzzywi8i8UAQggghiKUNju1gJ7F34/XsbWbnjqq6q2d27ShGiRAtjfzgy85Mt7urTp06xzYbhfTwTqGMXFnWVYP8jOq7IA/VS5tEGOoJuPT+O7ong5CTerVeEr/pKqOx39Cql66mbxAqEkWRQUOk8szomRYILLUSonxfXAjY+zHPDe1CxL+MCFiSmkmQfhwZ8nyiXK9s6hSSlBt2Q+0dleWpnmup5qL29+oLh+6T7dsY9VJKo+xC4FTWE2KBUVcflUSN+5vKwlRaDfign5cWtTA01OfYZnOrV3r5M/TcibZCNc+Vb3qukyhCrNIaOlWyMmnlbiDPSz/H1h1aB0C9Z2eiGs2UdtdnOyDyjLXjAid7z7Bz/w/4qaI3T6jm00bvKGSPlvfsrItvvv0OG7fvwm0uk94rU5wosPesFMgGSHa30PnpBwx+/RlotTDX7SHdP8LgoI2DnWfY323j+HmIoJdwT6pVuhgHEfL+GEmnCy8IMDcIMEfWVb0ThE+foHuwywF8Xo5x+eoavvz6K3z28SeYhcPiKB6T22qVAu0jTBWDznaAh/d+RyNx4LOLQN220Z5YK6V2asjyTOtpZBMUNVrL9WS90E4btF65RUMLEsnBxwwbvRkyyup5vMYV+0axCYR5Ag3iiIOGpVHpCXaAtATYlrENnT6kmyw0qirlSZxjkayeMmAcjBB1e+g8eowyCFmF3YSWU0rNVLNcXX8ftzY3sXJljYMvSaUpceihALkUdwA8HpxgQNUJulfqy6d7JGCEDm/amDPVm+/HBexhjN72PopOH67u98wnEhrbVBkkwHJ8i5OHcByjc9JHN0zQHo1xklnI5y9i5q134C+vwG4uwLL9SWVveaapClFZ6gOBjv2ckQiM+yM0HR/tgzb2dg5YZGYCTNA90tyLSV4Wc1eQzqwhcS9wxZTEk6y8CkFVh4vDVFijJsb7IDF7CBCtVUoh/8f4z0ZxRnmWRZV8m0GAJI816KmSJPcMD+V/m0pTwkikxEYZopE+BXotlP09zORDuM7pdrHpQT2wY6eJyF2As3gVOVdOxHVB+ZCTSC5NN+2QD1rbaB8HSrslGiEKnjND6HUPsyfopfbezXVc+2BdtcBosbfzUCtfdSgLzVIBqCS2adawjb1He+iQ80ZpGRBvmnRB6v+ZvQBv6V2MGxf5PadOQwvRFdqqktiHKX/lXmq75LiBzjWKrQUo4qTrf8Bokb2b9tswitgFh5Il37JJt3FCW/tVZ6iYauCxS3UGkevNfNFFc/g3isMtzMfHsLMhuwG9rOJ/arAqv43YcRH5y2iubiByV5HAM8Jj9cHVNNYhcfDX7hP8+aDFLf4UByzNL7IlK+KEWQAFk9QrkUwDDpaVkFpOCYHv8sVWt7ZqZRiNQ1gNxQyg/nxKvFiwmPR9mk30Sf0+jBBTO06WI4wTDAYDnpcZ38NMs3JPsc+6SiVE7JNrDrkXpAkr4cO05djnYgJMjNfswjHtjmJPsQHo/ij26mcF7j1sYSs4RGhWDWoeJcpZ4c23L+P2F3dw7cZ1fR6pSrItiLZVxYBu4SAbxPjl+x8xSwwAKLHw0iOmXoKdo31WhR+RDSRixHmMmEWtlQCbVVTigHghFbwwDBeXG7c8LGEJH66sY/Pm59hYWccFaxaIMvjE0osLeI4CG4h96Wh9LI9bodMJBrQMYUG7bkWzl4s1xbLcXEWtTxu1XMtUdGldDoeKGp4rkT4lll7FyBLHKZ0txTLgFk3Sd6JYuig5J6oXJuvvRoAB0oZSmlyyFl1uZyzSgtlXZUIVfhc3Ll3H3Y/u4NalT7GEN6jjHx4zBeripucbhRYePBwd4f7WbwiiABZ5Ojs5W7Krgk1ZCY2+hPEi+aXKPwvd618xjAGY/MPSWnCjUchzI1b2onknc8irWYsNcoGZBBvZXUDFy1w81pp0/DuUOwkrgQA/n6wEFUO7DgZNx+3iLCeFZbbK1vMnPy9rpD5/XCSW/FZbpLNDnb4klhfwQrELKliY3gWtD34ey8I/AAAA///EXVtvG0UU/vZiO74ltdP0FpJCSylqQaEgoOKJIoF44AFV4o/yyAMST0hVURUJWkSTNuklcS5O7Pi2u97ZQeecmfV6m7QUUTGSH+L4tjOzu+d85zvfN60Ad8zIoinH2SqMCEUynpg+bQ6aOGeiWP06gzc3DLUqJ+4Hk1BIwptRsDfVdkE54hcuBFzVTya91AweWAqy9d1PhBrPdJMsjT4R2wmmCSsRHxQ6/+RCQMAb6yUQbV/FjBryAhFKUyiak06+mxaIEJtUYM1RaaXb/qb0mJ1Jn4iluigjgJhdE+npnNi0WQqMa+zh4mQamGEPSM+KH8pvtFYilvWRHeIXajYhWfvlAtIsu8AKvXFi6nsG4JheS/69lsFAN0iDflFvDj1PiCcH9nRD8BzTuyk3S6IkHaw9R3dzny1lqiUfUTj9e0LyBTbB0Tfffocvv74Nv3yWu6FVEsHzRJRN97twOruI7/+K8epdeBub0Psd9MIQu90eerqAsDiDvkrQCaQvsF4p83eebTRQKxziwvkmsHeAUhTAnXXgjF00ztcQD47QHfXQL3Zx+tQirqxcxw/f38bOk2d41GnJiZibZ2aVkN2iD/z840/48NZN1JdmEeggvcRqU8FKDArMxxtKQs4XJtM3ZNsGWLzQUpaSCTUp+7DrZ4G88kyF94JlAVBmXq1Wpxg0WTCJ9r3O9FFNUFCV7v2TRp4lxBWHIOQKN6H2ra1dbD/cAPoTe+7pa4qoZieehxu3vsK7Nz4RYRO+6QvbhNRmSTmcZv3O/nO0jrqMsLu87xQc6uM0PuF8vlNvtHLgRTF0d4ju+jMk7SMGIMQ3GFKVp0eSC8Spglb0cdTvYpvo3BXqs/dRbZ5G8+IVLF5+H+cvvoNCY5YdMxLaq1YcwB4PrYnKpDnaVGNNCwAD0WGEYBig6lbweH0T6w83pDpPaxGrTGetuDyEugBdXwLIHs2tcz8stxGcdPNm/+KEE6ko1Njb7UHFdc6q5VzO3vjffKJ4XPJvR28wYAZAoejjwuI57Kx12KbTMVVROozj1Nv/6XBYl4IClD4KqoXxzj3UlmtwCkvovyJ45/ugpxEpH6Xm2xi216FGhyyCxrKgpEtBbjTiVIYnW7t49HgTn318mdkv8aD3xmjp2ia9xDCqCPONe3pZcEgb7SqdUp//vRQ6fzGMAAAgAElEQVRebu7TPnGdKuEHwwGCwUhsvKhim2hsbjzF3t6eoWEbArHZahb0JWZA4NQw21iGKjYQ+xUkVLF1HWMwR3McG3aGFVQyYnPDCK9g9P6vg+7llHAO+32pDDpiOpom6/9BKpiwLo0zmVM9+VRywyjqHvqtP+GfWsZM+QxGzGn3+ZoG0x5kGUsnfoPlihMYpoqozV2CO/8edGsTgTpEOdeFrrQntHuKXyKF3+6t4vNPr8HzShzTxKMhEA2BYk2q14kAaUhtwqTdkJNYXxICjp6s04ISQb1qvY5wOBLtI0+QFWcsWizzC2cZ+Nza3gYcqeqSgJbjJVwdrVXKmKtX4TntVDTUzdTYRTdDwyc1dKUQHHYwE8WpYNi0fejxq5hn0iHDvHrZ+153pL3fuct4quRPe69Uwlq7i1/uP8C1L+qYQ9nsP9dA4FRAKsP1Qlxd+QArNz/CX3+sc98da/SYuD4xgZngNRTPOXj64CF2Hz3B7NVz8GeIyaegiy7aYQdqP2YraIqlG7WmxDdkz3eidkJm56VPmVZGbYS+yQSAjOvKJTQvzWJhYQG/P3uA/YM2BuSmFMRsRTjWsQg3e14qqJyv/tOYm5vDcDDk13DyZ+KgPOv2uEF7d6yiNK/ymJVa4piJ9iULuOWO1QrAscYTOR4YpybPFD7pfyQMSO8lja9Jm7aJCChfiUNpE40TOZe15cxpBKMI1VIZ8/VTWDrzFlYuXsfpQhNlNgFOTOlKwFWZfKnYW62ZPHHK/h074px0MD7EndW7eN5uATXjE+GKkwKdZ6y5YVo8Cfgk+9OXdTlJwTjL+HZTn32KYym/oUIH62DFAkDZCjsXsEwR96RBiX3KWkuIFSIuVhRX09yPCaAxn8HtuLQWRhBQCmWmfdYk8lnBPs6PCKg2BWgqgJL+VX5M5U+cPwogxDlWrm2BinX0GivuTueunSe20zcF90LBhdYO/qbt2n7bpuLwd2wnqdM225JtvY5V3aYJNJAmBIK9IHhAYq/7J5GQeOYJIfEEaEPsosFKB2s12mVt2lyaxI4v6Pudi50UTRqwvkxdHds5Pj7nd/kuwewF3MmkohIIzAKVyim8Z1E1CZw4oPXKpyJqbsX7SsJxrtNrIe2GJ+7gDp5NVjQ8OTcLu1NkzLReACe1FpmjXVjBVZ6tssgXT+E4M6wi2kHkQPHarPjpF1w5lfPAWA26bijFMyxUmQ/OBOxSfDDCIImBgNiB58YTRYlDFJQdADRXSGkEhO+dumcztV2QZnlPeVbAsDPDqUepSMNnYReT3PC8tKBMAc23qIjc8GQIWbb3zOqQu1+jOuME5szv+UzbTzl0gG9ELRIHR0/JJ810kUKeWRBM6UbI80sSpzEh/pgWJaC09YVUT9MxGrVF1Mcedh8+hX/CzjHtLE6/vPQ+55xYaCzg9p07aK6sA36obTgyJn4KHgOIzh6ws43uTz8i3doGOkN0Dgf4vX2Al1GGdq7wtHMksHErV0QLLVa0Vxd9bCwt43p/gMsrNbSiBOEwgGoA1cZ51BtnJCnpnwzQPzjA29fexQcfvofPP/sEX379FXom/Y9nOlpc7Ctphv2tPWzde4ybKx9jEniYONFN75Rgibja0KPVLHoUtbSVRy0amUuAY4tXyIq5JguBeReEXySinWkxX3l8qpxbA69hA2grDOiXC3XK6lGkrpJp3/9ZWk7urCdz2TxUEKDqBRgdnSCgKlp3jPb2LkbtY9c5yUvfuRy4rF/bxI1bt9C8fMlUNa1EmDbBo4/xU8S4397BKIv0nkeoF6lKvD/ygqHFilg8YbAQsLA5OEF+2EGdIlTZjAp3njkrGdsbJ8V/6CscTzIs+HNorW5i4+p1rG1eRePiKoJzLQ2bDUg+jgSuhxnVer3epVOke7ep5noHT4cxvISzpYonv/6BOLUfPb1TeqoKVWsA9TWc4Ix0/0lNEAvCktXgP3xQZmQ8Udhr93A8WkRz0f6x8LRWrynK9Lo/5eRfCqWl37n5Dbo9DI6OEA/70pWvEN2TQ+g/vuibm33gNa6rMA1fFN9xgUcPMD78DdULG4jCi6DxqNNdKNdsVPFZxlaJV0Ncu4AkXMFk/AyVvGsOTOW8fGyE2/f7KR493MLNG1ck+Bn2+lgkzBJarTuzWMr/QZBP3kFO+STXvEsFg8h7swWdbMaCgYW3JB6LWCwkCK6gdzzAwwePaMZi4K5G/d/AiEWAiesRqojCZURzq4iUTv5pqcl3zFnY6au6l5eJnOfXsd8ZYjACsjlzhAh2G069KtT/33x5y9IJrZuQwTpMUikAjXuHSKOuQIWhpsX2PZQdP/7dj0v8SvaWsmVQ/yIfYTzeQ+/Pe5hbuoIaYcNpXQry/lT50H72FaPF/cirYRQ24Z3fRHLQgJrUkVF81yYn1kebcYHEL8D9Xx7g8OUXWFpqCHUuZfwQJ1r5P9WtQuFm23lVEn7kPLD+5RwlxjkTU2RlnBfW5hyqFQbdoNi0yXNcWF3BROXY3XkuhYY6NVtIC0hzseYKa3WJBcqCsFNf11oRs2nCriOhu5m2HHR1APUv55fK/rMbR9lCzfyHox/YM0sjRlWkIDP0fNzdeoLHV9ewfHEDC9AW2/Zo33yT1soq3r/1Eb775lt0/zoSqlQKawlntfQyR5k76WW4+/0P+HTzNrx5JetAsFCTxlUvG2O7/UzolITJN+ebSGjF7Gl6hhRePG/K4nAakm7L4PZvEAce6g2wTTCPEJuNdTTfOYudF7vYefEc+92XiPIEsaft2Ri/0JWEjgR0mtFrUFZqwBQIAOYJI2tznOfGXq60P2bGTaLU5aU+Vs3QaRMjdM5mB2Mj+rXDwMfjNHb0Y/7L5D8x0G6xbiw5fREty5zMIgBKoyP6BmEtlDixVp1HKo1CaGvqVOFcfRFrrWVsrF/CW611tPyzCBFKc1fhFU2D0pwpnkVhdcqE/jDp4Ocn97G9v4OU6Kt8IhRTGQebyPuF9bsy6OJyUcGf4aWN40jg8b5w4ycOEe2auhOdX2g1fN35t57+HF/GyhxHmw/ZhnAZqWGTfx0327yMWga66SnijWVKthF9t/kNY2ybI/G6cqwRhXS5GPM2xp6zaPOZ/dKen+cRpIkUTYqGnKU8sNglc5MUA4Ne0PfO5rPOeT3Px98AAAD//7RdSU8bZxh+Zh/bGAIhpATSkEhRFkWJUrJIbdJT+lf7A3ruoYe2Si8NbZOGkCoEApjdYIM9nrV6l288LD1Uan1BCGzPfPMt7/IsLvuAW8JJoLfFUazCbapSWKjnbjGE51fhKCcs6SBwZEt5LoXyi6o34VQgEZR4iMiUUwpjsD8tLxr1j6yI7xk4f5nE5lVbu6yEIRPEoRwsS6tmtLhcGxFB6kyXnyuKOcPADKyYeN68sNQvkyEUhdlIhvAK8/lEJIsUYsLWdjqZ+F7doXgeQ1DIQrEWKlVAXBYMh4fTCBI4o4orQfoVbm9VIFf0TALPiFwMv8d0cKn66HtDjQSbbJA8hyH5BlKfKVwcXE30hI9CqQRB7V1foERZpgsjLj38ebxt64SNoSANcqECkn5nnA6r8FlciiEW2qGuFizo/2jhUhWeUAWn4T6mWkxJIXG/6k6I4719rLxdhpOKTY9rGhanLHMGWYEnzx7jwfMncKlyixQe2YR5Frw8AtotJO8X0X75Etb7Dbh7MdZ2jvHH5i5+PejiU5KjleVsGRdripbqIUaX9babodldx9hf63g6W8OL+fuYacSojyfwmpMYnZzCRN1HZ3sDnZ1dtJ0I45dv4psXX+HjmwX8+O4NP9FIn6wgsW1VtKcvzPHL9z/h3pfzcKZcsb9kbpJ0s4yiNc1ftxDrSZqr5Hns+KrFoMJoViGw/1wVVKkYw8WvXE76QdzXTROC1rCFSpGp3QjBNxOFJxlLG5oTpnJqaAFQNAzD/BShwAWGoCZFNfoCVTPNxZ9BoVAoNQyIv02XXrdrOFxvofNhG3kv53FPKzBgiu9cToosxDbw6PnXuPPFQ3iNJh8QWkLipIGYs6T8/9vOB6wP9pF5OfyAvKDJC3WgPc5CrH8oeaA94aiPkaSPaHMN6fYmGpQYMfRQ9kGPOkKEtlFOLu3/F2cv4PbDe7hx7zYePH2KK9dvYeKzz+E2qNvvn6Vs2oGC4lh1oRJEivdxoXOZbK4s4w9s8UOGFeUIrDqOj1K8erPI4obs70oVbw6nDUTTUSpuA2k4iawxjR5qyC0fIEjsOYc5V6jZ99uFF4wg6W5jaXUHrfYMrjXBY8BgIL1i739OkspgFMJxdFn0LeErP+4PmI5zuLELOz7E3HQT9l6Ig52IlhCrRg/B7tVXBXVy6ntO6NZQ10Kt6+lRhLwT7OFwfQFozAGhVERs8kBm+kHBc5L+P+PuBV2zz7z0Q/cCwotz6O2/Isk6Eb5NBwq3zXmPpHFdWd7CUTdHg6qNVMXo7CMbdeAE4+rBjQr88qzK/5nxO3Prpzj5Grww9JfdUGT9DDsL2Ylx+vevc0QtDReY5dITJFFfPZx91GsjWF5cwvLHFmtagMdR1nJhSbBK40te/gOyDW3Ood+4isIfhR80EKXSj6W1XArlFXmJaqBAvhvFWNnuY+0AuDUuQGEaxkSFH+V+3UpX97+HChSmO6S/80/a410LvaMejtttdDdbON77hDQ+xsz1JsPT25t7iPsFYontJNEs7JKzXYrhnU8RP1PsM79XDQ+NuUeYRwiLHUT9FfR2FuCTsKp3BXFh0jeBDqPktZ+FqRuBZ25YOA56jSZqk7OIvQkkySZ8m6xdU4H9VotblmirtNbaWF/dxKVLI3xWBFS9jfrA2LhQSMz1m265dv95LDVpIkeYqNMR5GMucaDP3bNU0WuK5KK40hJruKLuYubGHPLcw6eVNXSiBIFncyxC4eFo2ETTc9FL0vK8kZNTOfTqg07OH3HUg8sUADpHPKbZZJYxtDznmZQxto3SysbJWKOGE0RrWAH/J5vKrDwDFFlRfrYR/lVRM/P5JpaUQEHeSy4GvPn53LBa3e3g56W3uDs1gzpC0czhzN7YvNlwm6O483ge888e4Ltvf2CpWSkWCR1gOD2Ugw3g3esl3N96hNHxKfg26WAF8IMaxwTdfIA/W++5I3937jbG7CYCx+fGEtWAPCs0u+LJ8SgMRsE0iXKljDlSZLdshKxn4HN3e+LyBVy/eA0b7RZWt1axsb+Fw0EHmeegnySs1B4xyjbmmIhyBurW2kbPiuwNB8TP9iVP0vikN4gQUMxP4ndU0cwLNMIa2wFT3MNxcSbwd3rF6RDFzBoguaJ6HaX2ptIQJRthKi6QlhPFf/VmjZsXMUHPqTNN8812ysatUDtsLmJkfSAoarBiS1CxsBDaAa5OTePO7E1Mj03i8ugl1DnxdxTnkZefI8/boIVt3WPMeYTh+GtRNUOM7eIAv68vYmH1NQZ+IvOPrqdwpbnKxYmUG7aSx0H3mPxEUSE/Vfyu+YHkN4R+zARRzQm3iqdTEceybR0GapqKA53khElZoJHkWBBAsnQMdEGSecZHEBpQEdO03zDKVDv7nJQTolMb3NQ8l1xIqC10v/R8KKeivI/+RjExqf/Te9m5Szv6RpeAiuWeo/kju0bQcUmnHt23IKcJ4WDyPSpECN09RzJIyuSf80I3hOcOHeUoDyiKAn8DAAD//8RdW28TRxT+dnbXF4ITmzjhnoRWCAqF8oBa2ooWVX3gpf+3Uh+KKvWxRaLi0gTngh3sGBK8Trxe27uz1Tkzszs2KUgVqPNm+brjmdlzzved7/OyQN5TfeV0YBO1IU4mqofb6rf1LbGC/KBSquROJjYxrULIiYjVx2CqHvlr0szjX1U1vCmvRxvUsi00uFLDwnRU9cgtMGaRRpoAqnYJ3ePO6pFeLtphqPmmt2a2ByNhWyJNU9fvty0X6LF0VfJNC1mmMrNV5MTGUkPlP15OU/0Nkmqo/DyXRpeBF9/Ues/VHw0TgObfL2S2FkrYw+MkjzaLpwsMuVhbXsAxYxY5NKg/LURz7cehi+Zz+XdYwoRG6Z8TSP07Kfm3W0ik3qx2P6r5bpn5h6ZcrR0PYlaCDQ8OMT4cMh2bemezqr+Tf4BSwRf4+t63qJ5ZUk+nigpeEAmGe024rS30/3oEt91FKYyx3enjj+ZLPAz6eCRTtLVf/JhvHzZBUTMBABCG1ycqaWuI0eQR7t+4iuXYQVx5hcLyaZRvXkZl0EPQfIP+qy3U5pewfLqKu1/dxlajgY04QpHyOYMiMNVY+duXHAdbj9cR7vdRqp+asQ5Sw6AHErZmwvSLcqq/yAIB1TOmryZJ2T5NeYv6UyI3rG6q6ZT8P2UaECmLqHharJLolLZNpVEdtVsLjDil+X6jYaE8miWLeEJX1+lATQ4j7D19gf2tDomSK4FEUwCgeRKO9qlPsfbZdVy//SVqS8t8U3Tdgk6oHA60yHl9BwE2e10EkwH3jKuAQalHe3yOKKE97QsJQZ8zHCMOAqSELEvjOQBGjSbjkMWJqGOmUHRw94fv8M2P9/DFnTuor14CqjXERLP3yjrEEbngmU5KclDfeAggD6LtvagTGOsAQBSGKPolPH/RQOfV63eT8Z0C/PI8hsUqRiiT94Gi7emiEwvmW1vJ3kucwBZr2Gn2sNEKcWXlBN/2DcH6/xh0JiRUfY8nOOz3MAoCJIMAB51tCDnEuXoN46DN9uCjTE1rakKsnYy3krsp/CjNVb0ViEyqo30Mh20Mgx34hUVMxAKocdUx/tqpllA0PSsUcDkeInEChbk6nGINcvQGkzjU+h66X1mfAZ1OD43NFm5dO4Pw8IjRcY9XvuRyi0JVPu7Ei3QayfmQY/Y+QogUF811nzexHFrNDg4ODrPQ3e4UUkmi4B5xR8zDW1jB2K+ztWvMbCLFkjBFUC52Ozpw5MckGjyPzn6I7V2JcFXAl6qYXBDT+JbENOL+MYYpLql5SRBFIcZHAQZ7LbxYf4y9zg4uXTuP73+6j5PVGnaeNvDg518RdHvwY4dFUT9UecJGs+ncIYu9kyTaNepi1H2C0qkzcBer+kxzdZAvsmD/uEKJESRW9t4+U7yLc3WUFy9hEu1C4gjS0axAJ80qF64+h0hEs9ls4+atT5jV4VP8QkgdFULNgjDxZIq39jvHiVHEYIOizXoceyTEmCMb5FlrY1dkEii0k1cvf4rKwiIamxtotzqYL5HF6xxWzl/A8yfPEfXeHDuXqjCTMGuQ7idJeARBDETddy2dvNDyvpFq7Z7kGLHR/zqyGNOAW7awtcz3TcwsV4eLJFEK/Lm9i8efd7FYLeG0W5gqHFFS6IoFnL14ATdu38BvvzxA1DUCinp96VtcLhUp0H8dofHsb1xZLqJQn1dggKu0I0h0mYqp6+1NBhevXrzKbaIlz7HOTz+bc7zVHmM/Ujs6P9sE6wK4bBboo+j5qC5VsFo/h/b+S+z2uniytQ5fkCBxjEk0QrlSZsCG0VwS+BZeFtMQ5d5uE0i17hi7MaWqXRJa4LNISTppYGlNrhG7OrnZ+8wFUUKctSAkyjOeGbZk1xwnHLdJ6WqQJsncyRQanLOYU10hlFQgpbyCYj9HYnGuguXaKaydXcPa0gqWCjVUuCRS5BJo/K9CP+9hoHDiH7Pa/wgRnr3cwIOHvyPyYsQi4cSYGTljybavMFbzws/dKPSaf9cwQOLgaMA9+Cb/9Kx2Zopv+bsmylKR8zIDRma5UC7yZ4O8RgSer1ij86bNmp/XMS7rA3gEACvXgmwadF5Mg36bzbxhZyzd7sk9/VauRetGrSWbAany3ExTzzAbNOOBc1Gm+mvdvJk5oEIRzZXaEg4A4B8AAAD//7RdWW8bZRQ9s3jsseM4zkISqoiWJHJKaFVIGkA8gBDLAxJCAh7LH+SZJ95QkaoIJVUKaprQkoTYSVwcr7HH9izVvd/3zeK0IFE6UqXmZTwz33bPveeeY5oSeCoLgVAcz3PlpIso5YpiHn95CsS4ci2pDYpCHn7MkUPfk5sZJH3CkLRw9dLkB2z6khJD9JvY/XS5MzMtRK5pQwo2hIMlmQDigxjcR0c9MZwFUcrpKium1NHp4wR+2GuvAA2B6rSRDmkbWTsbAXAJ9Hnx65Efph5LQHDfdeCFwoTq/dWE8qm/jFU/fekVOZRJGJHBYvERd9RqMRIBhEzKsPVg3+XxyWWz6Fx0QkV4Hp9YzzZCYCioIr7rjdw/6g3P2DYsy+DKczJpE11sUabsNlgxXGSkaJ44JDYhK0xMlaGFI8GkKzOdoTWJCvBGTsTBQFBdaMM6/vMQ7UaTKeEE81wvklBTtyEF1HQujbW1DQEuWbBEg+P1YHoOOmfHMMuH0KpnMDs9tBsOdstVbNabeADgCAI0RiRyGZNoqsIiaXySdUhPe++sh2FvG1+8/x7y5QqKpRWkhyZSmQlkU2k0zk4wOXGCfGEGy2+VcG1xEX892hN9UYHymxUBDBHrSMegXm7jt80tfLD8KQszBdIHmPuHVMZSFwkyLSaamFRJl72Rmh+OD2+Cuh7OcZF0EnYyoirphfM0dGPwhZMD2wPKRI4emydMS9OjeR2/BBXLSMw9IURp8lz2mNkgAiKNeyZ1OE9bONs/hNvqc7LHjxHlA1ntppPRLhSwurGBazdWYeXGWP3ZkEwd1hMAUIGLg2YNtXad5wgBNZMAvyeorpSl54ODePREt6MkBukCXPRZhJD2o4iDQyKXfQYLzAhJAV/e+Rrffn8Hb668A+SKIhgxlLu4mjiXPku03sI6o/ynXU4CJC5PJPnyxhiq1Sqq1fNovKHooVF1iDkBuQLMTI7ZXMI2w4h+54W/JdWWUwX8XWvj3v0KPlxfQt6KdA9eLflfvZTaH3wpwjiEQXOO9o9uG53qAXa376JSPsDS9CQHh5YpAk1/qPYsCWr/w8+rtUfzhgKaVOBAJyZJfR+5yQV0NJvBpy6T25yb0lyuUJNjCu8jVA0w0yz8mJ64gv5ZBUbQRVbXEpbM9HydAfDk8SFWFmeQpbHudVmDAHyuJb/4qwLp/+t1qV0hSPyXgmDSMaEww8pkcV5r4tHuvghiQsAfjR+5qHicdLQR2EXYxVn0rBw7argyCXNpDSmAShUn0+KKV73pYGvnCB+XriI/Y8RM31Ql8dVrXDCrS5MMMF9UjFPeEE6njqd7OyjvPcDU6/P46rtvcOvzj5gQMvnGErqBiZ9/+BFOsysZMd5LqTT8wxPyzjtuuOi2TtEv/wFrvITAmuQ9m/cR3Ux8odF0BFUYqSlLky1FwZBE96ZgT6/g/PghbK1OHi5it5KMD6FHoDFwpH12+/4OPvlsHeNjJgLD5ZjIGg6gWzI29EVyZ7RgBBWjUmtjxmKwTyJnZLVJbgdkIUiBd18yRtO2DdVnIcIccb6NF/NYu30blblj7P2+j1ajxoWddNYGEgmA0Q2VmAYpbufod9p8lmn/qroVPTdi+QxNUpsvIaLR9fWSrQFQ4MQXYJkqkLpk45I+w5NqC1uPj3Hz3dcwrnlsBadUI1QKKZWxcWNtDau3ruPXnx6OnDGSwUBnaRCts+1ftlBaf5vbLMj6MRgGMDIi5hiwCqSP3coRHBe4uWxiPjeDVEDWyulIaJAvlXh1w3gt8W6Jv3RxJhJ3mRi80taQ7lmcLmBpegnXr5RQu2jg8KSM03YNp60qPN0L4zWK/00q2sn+cHK2EEMitNDCjAekxZ6mY+APmL1AAQQVfFjNPhCFCMQZXYSfJINm6Ak9LzqD6Jt0HYfnVt91hCaaF7D+2oAqxJQUHAyYvaIMinVfJOqIQUNV8bFcDvNTs1iYmMXVuQXM5+ZYW4HZaUz318UafwEET1L9EXEvYiyeAVw0SPG/uo+7O5u48BwOKZhxysD6OTdWTEfVWjIivDjaAks6BoSdCNiqllbCr8qCkVmUsu2HnbFcIdauilKEF/gdnmORyLE0jU+sYMwObSmyZCSWc1IIWLUx0+Gl1lA8mRDi1EQredQOTwCetdxIi075m8cK8OL9RIFNsaq4HmAS5hQYLErsRa3dxMwn5gglBATWFZpdgR/gGQAAAP//xF1bTxtHFP5m14ttcAktoGAglNKLSMBJUOMUWon2IS+p1Jeqv7gvpXclSkgccQuhocgQsLGN7d2drc6ZObtrh6BUDepII27GXntnd87luzii4u2wwryBz8fdu7gLruMOLnu529ntJnAGejKqcAWsRmlmKA4C4lV4ToKQ7l5SZ5JOIAXkGYtEgCT2lichBQQdq2Ga1xKfRBHQEAs+tkIggTvndUVGph2kqmamwtJ7Urk4YcVmpFChRVDPKnHKyY150wKPT/uz20p4egFTMsb2icqoUQqXJLQLuGthQj0zbZ3nmsqfwD/keFkgJH1sTqJame4UiwVgvwaBLFopmJzX/e8fUpWiCpjrJEKJgiAILb8atqJN77EbUxMSh4j+QRs0FUaCVhvNWp0hTwPKuhmcE5tRuaRYLKI4WcRQtkB3aHiIkNVd+LUqTnc30N7bxmCnjaDeROXFPtaPa6gAeAHghJ/DhPN0TWQzihMK2sfprbgDsMJzYL9pQgrUHODPOvDzzh5qrQaOj15B5d/H2NWPMDoyjnajhfrhPqC7mJyewOLSLQySbaIOeNtMayHT90OOywHKg59+QTYAK9ALr5FvHPZ6g4VApm8Q/UPEP3RK4d+sdy+l/h/GUE05H2nnB2U7/+JuwZYkrPHhJtDLN4xeP1UDSeKbZ2D8cmlj69Ba9TWiTohMW6O69RcOt1+ak2npF0wlIr0DeYsZF2NTk7heLuPK5BQr9nJhQiqlylAsXkZN7DWO0Qg6rKXh2MoNe91qY94kHTiGWHZD1iDInHYQnDT4cZHVyuZUnW6coSk4lco3ce/7HzBXXgaGx1hrAi7xWmkLzVIoZK8d/S952+bxbxK/4e6D73OieNGgznOUfQ+hN8y2f91+1Z9q5tEAACAASURBVOmL2pvKwssdD7mhCTxYP8TTLTDdQOMto9h3PjTrO0TtFhrVA+xvbeDZwz/wfLuCT+c/Qal8BwvlOxgtjjNyKvOfD1PFLh2OWHZqH3nVglPbAeq7XBAQAHUU42xMEiocSCqQkyNAoHJwB69CZ0YJ2wRht8eqxxbV8+jxU5zUGxwgkTq+qRKEvPbY3eH/gl+848G0saDDewYFwANuDq+OTrHzfJe7ja7Ek1ECY3U50KHuWwE69wHC7BW2qPPN2THUKBjknNnHbABm175DfF6iwEQjeFI5QmX3jG8zFFwTbFYuCdH3uPwaizZ3OGVeL6if4mBzA49+W4NyNFbvf4vl+9+h+NkCCpPTuFZaxK0vv8LcjRvcLTPUxctI/k0wnvdcqKCBXKOKzPEe/PrfcFQ3tkLtHenjsN9rFbvEMD2G8CzuIFThQ4SD0yCMQWQ9cQQNgRgWb57/ycYmd/ikucRdvqBrFT57EZv9Q/YciT3YZpljxYBV/0nEi1T/afrWjzuejIDVDBsn5NjUzDXcXVnG0udLmJmdgZe9+AZD1z/tV6QDoJstRpo4EOh/gga78BTEFFjd8/NljxjFF5niJ3uzKwfN0MXa4wo2jw7QZFxluuGgOEFVbg7F6VnML5b6ipTKalIpiDEh6XnQJduqnqG6tc9q/LTnKqYDU6zgMYQ+ID2xvIvdkwOsrf+OZ9UtBCopICj7uSokvPOLPlttixrJLxRTufIWEzCMAvLaw2x+BjfHFrBaWsG926v4emEZ1yfmMO4VMBxkkA9cqKaPqOVjICA0kYOMTLItPAuQVR7yyuP4hpscZDvY9uER3YEKeCQQSdeyr60Xv50UaAYRaxBQn4gRD0GEzlmX/+7b/6PCcKvVQbvVgUf6RaR9QTMiqqJCpmPmQFthxC2gNDOPb26vYHXhLr74eAlzQ1MYRg556vrT64ZcP2HXj7dxQw3TJWylrdp/gA4CVA538OPDX5nKgazLGlyeZ3IDo+XmxQLmkiv0r/90fMuaUamZVr3nnIByMJtQsxCgzatCS2smL35qeImNfZqTL1+F45/ompmEnjXtrNOZoJmp6BPb58co6ITHLzZ9hu6adnZKhOFjkXubszJy2uZfr+Wsgqii+Nw6D3BRgjTuJD+1rgiCCBd6uLxn+Xwc18E/tF3JbxtVGP/NvtiexHGaljRBbVKgKhUVNw4gQW9wQeKK+DdBqlQu7QUVECpKoU0otGmdZnOdeOyxZ0Xf9xaP3QUQMJckcmJP3pv33rf8Ft7BKDGw2B5nWkmh5TeWf8xQXery05s4toa52GxVJwTerBr0d2by5rI0s3akFtqvfmo7ZXmOrtoSh56VC+U6Vt1xhuKzboAYBP5daYmgPA8VTCNNxb2mUnhN8Sumgyi6k6zoaGSsGKkSFDXpmEtkIJMuVhzX7gFi8tRXSlrrMBSq2tHDQq8xsoL4JywSIu5fKUGqCSM7u0r7sUBPMD28qhhDMH8qHpgyUVMLQC0aP/DZpaEOyYY+LEvpbylEMOoqp1RUcSV8SByYpTzEXxJoyMPdmEveeYk7zszi5YSfkklJdeD5N0S1ijjn9H8pT1TIIGCcp2gGIaxhhlHvhJOvSnHJKkxt8gilIG/hzEoHi1FbcGhYBXQC3xhjf/cBisMuwuEIwXiC3niMB6Mh7pYZq8Sf8vPpyy0t5/ukxDhoBNytT9KJ2KxSwPcEbpqqav2yQIwKN7afYqEd4M3BFQx6AzSWFtjvPQwaGPZ6iN0uAr+DixvrWGwGOHmecEJV1EB0lfT1p1Bn7+EjHHX34F1Y4iSEeG/U4eTAWCWUKljhBD2VNn+O3gyUZopGvch5ymWF1PEc7sIpwRiLRWaKmQKg9kCtUXNYbKQQPtvaQlSKKylLSno+KUjVBSb6POrapCaHDmypZwrvsZITb5u99w+3dzHYi9FQXVtj2sW1uOpewPQdbLx/FecvX4a32GZ4qWuKZ4ZgwBTUU2/88XCAB8f7KK2KfeIN2vDZc1agaVhkshI++PQ8BcR9Jy/5kxGM/ogFdtQYCLqAuO/mgoEPP/4El69+gKpq1/yvM6k/rvY7UyNIgFcI7k0Xk1azNhTPW2mIoNLBLtsGxeRa+auGU3JhdIa7zWoCiAsXi81l5HYAx21CA34qU1fbORRTgTf9zKgwsaeWSQGEEXqnI9y4+RuunNkEaRly9ZtUBCxXC0D9H5eCowsHjAJZErMVWNrr4dHWFn75+Sesra3hsy8+x/mz53DaPcDhIMHj7jds55hbBsOIpZKNTOlmvc+N16ADDN0TFuNUsMjgGM2ih/z4d3jRu0gtUQAwfVdoYxi5sKeSST2hXfLSRWa3YISrKOw2/OIAVRnLe6l0t5GOm8PeCPsHfaxdWkd82kc0SYCgqQPo/3K4X5VQ1EUQ/801n5hRp6IeJ9A+NRwm8KwArhPiaP8Yz7pH8AlhTj0p6qYINQs9C6XlIC5d+J115M0OxqaPyvIEH3Om62NJZJ7F+w0RS3OOZwKkaYn9Xoxbd57gvc23sBnZ8J2K9zRhhSn3OsyKUM2P1z/x3Z8ZB9PUxQaysCQRrmQYo/e0i1s3b+LO99/ho+vX8emXX6G1ugY4PryWhai1DCMx8PjuDrbv7aAYDOW+UEvEFJpubu7M6kW19/n9aH4dZHnCPPaKBAH7T5E934W9cBGmH7ELgy5wytVlU4GlyPh8MimGqWlIsNWt62CcOPDCN2C0LiCf3EdZuAKYJGM0QbsR45OhwEE/w5MnXWxsrLBmEfGimRpDZ4lEexjVi2CmeeQpXQ49A9S4Img2+WhTUcG2WSPAD0N2cSKtBWERJgV0Ibp1pmujtdJhAbndh11EUVOMa23sbF0cldxlCurTEunpABUJ9HouFwaUBsBfXRq9qc5Q43WuC3//mkd0zlMB9GsU81sCik0F4dT0sb13gB/+2MGl5Q7zxF0p7U87Zc50QxsraxfxzrVrOLv6NeK9mLvb42La2RUxdCGohYSAjYF7d7awenUTRtuFF/oCkZGSJJLQbWDdR2R4Fh9ieH/Eb/P28iYiEgAtRdJbe9q1LsasVbS4LLmjTM8BQ8YAButF0SuB0eCznrS0lmGhHUZYD5cRr17CJB/h4PQY3eN9HMUneH7SR1oV3NGP0wR5mQk0Wm7DnZgMkCAdK5ryLC/huSHSJJXxnMXcfLbzN6YaZqQVMCEkbTxG2BDoY0bG0P9qizh5OEqECJ5pSxqpjfFAOKqEno2G6aHhtXB2oY1z7RWsd85hMYiw5EX8rLqy22/WCnbK4FFozr78aVPnsgsfEySiecQOW2K99zHCzvEjfPvjbfTSE4zLFEHDZ4qXilWUc1UdNT7fiVdNQuFcJuZMNTu5mSqbN8oZgRvOMj6l5nTkRgININcPxboOJ9aUvJMVotDQqud5Wn+D6L6SY6/yJ8Wpp31EUbb57+bOOfUzfbYSQFdC3MpJgAohjGgjZzWeOzqfqKhDNHhBUyJNq/p7qzyPaR7aUlCIC6omnioccBHB8Tmfo+85NpdoBhrzNM3wJwAAAP//xF1Lb1tFFP7uy4/rxE6aR5M6T9FWAYQQbEDsWLJBVPxWFmWBVKRWVRYksIEKWqokpUkcx3Hi2L7PQefMnOuxcaGVKMzmStG1nHtnPHPOd77zfT4lC+w7T0r+U3wufUMj0AliWvjPy0NK8irV23ziRVDlXZQy2Zfc6p/X3v7jh6qylOuFopybBFr6+FnIjibD0iQYq2TTZuRpmoWNomDiABe0h5L2KI+MhYNOiGmSxcpOvMyLZ8KoV4e97KWqn+m2Be0j6vOmOgYCBNojMjcLjHuqjbUHPacsDEGAGBCgzSTRdHkGL/JRr72wGuwEP7Mo/bYXpv2e5G+OsRxjwMMwH/T3lpBGCQtspFE8QpssZdECUJD5NmAOCuBHq/HK/TJfLEJnep9sz3phMeQ6MxubL6J8Eyqc9IdTEqhRj5f069bCmmGmONAk3BhZ9yXc3gmcXhceiQjFMfrDGMeDGGeG9k/U/sDVisDlIECjHqLZXEW1oVtI2hcd9C6v0Ot0mVkwyHVipgjp5WuGJ4dHeO/0GOvErCG12cYCSmEdTm8ALxrAuxFgpbmMu1sbeNE5L0y2Ukx4MpOoTPcaZ0en2N5cQiLN2WpkG8eHtqnwe55rnDh8vcmZ320SaZE/RkFzzcZxrKAiNcr+vgGiqpUyMrO5KfVXKxsBB2SvcEzvv/yW7A2c1qdQnTRzIS/cNNiyJs1RCatQROkkUZ4UOPrlOc5//0Oj0PYsqxH1nK6N5k2889GHmFtdgVeu8JIR/3dlBBaJzfH8oo2LdMi2e0V1QIRNOUiwWpxo6dEJfh1heNpB1O6ilFvrGQoluvoZNjZvYfP2FsIby6xurVNL7lAfGae9KR1TmD6S7DtS+VUFODAc9Hl/aPeucHZ2Vnx0ikwEB+hZUENK/uhOCcpUqcduNomINNOIGBGVUBkpLlf53URxgP39Z3iw1MPqF++iUibBUUe7Jljsqn93yIwb9oupgl+en2Pv0UPsPX6MtfVNfPX1Pex8+gm/s/nlFtZ+for6w10cH7Zfixltu0pMnZbC6dtodSBFNSOf8FOoQRd+eBOK9V10kKw4mDO9xUpbMRL3NwVVsubgBItQ0dOx4Co33Rl0Jcz6pNXRFp9U6WT3mpQrVHhb1d7/YSjD4INR/6dK2NHhS07CUm79yUbBaAFQGSGzYBaqsoDYm8HADZA4uoqs3NScHyIkI615RkmB1L3dEgthJqjj2UGCvZ+GWPm4grCcGuAzZ/0L9z+o/ydIGOz3VMy2h48efI/739zHrbU1fP7lPcxt3WHmDsFtlaDBjjjhwiKat+9iodnEwZPf4Fp7mD6HMJX+nE0RhXT+9hlzToo8J0Yl76OW9lmUsL7Vx7VKGVzDFGvosSFAo/EAJw0GEgOMS3PwbqwjaVdoV2UAv3BqmNjL6NMnxy2OP/VerLi1UnOI8yIQnvr1+SjWpJFayugcjxH7JI45+ScggNygOI0xIlyumxs+iIm7khzl2RDVmSrC2Zni/6PVR/3gk9aSHgf2Cgm1aFJAr0bV6tcdnCSbOHjSReNNx7Qz/VVDXAEco7shzxp5AX48OsBnH7yPpXKNpeI0ZTznc4TOHc+vYvvODnZ27mL3xQ/MsHENS0dmVRI6LmgkQOuwjfZBC+tLd3AZ5xjSfHvGZcxXHDtzdTVT6PS72H2yj6Qfs1f9XKkGwvarXghY+/U/N37Z4nZ6sBCiMDMd17hUOBzH0Ek/61WQeTGWlxawvbiO63iITo+ccvo4OT/DxeASV/1rxGmE6+wKDuXtUca6akFJCypyO0qa8zomAN0zxaycGAPKMIGHKaqUwFEMEin4mbaBJEvMtJ/w+g1VGRhQpSxHpVRGmJUwXw1RnyHXnnmsLW9gNpjBQmMedb+GEIHhJ/q8Sdj97zDizJPCe68aHqtyJFw08j0dHw2R4AoD/No6wLe736EVnyMrabtmBmZZ2NxhIMsrnKpGRcLxXM01YnXaLSpN40LQHQYI8B23aC91pbXVsFUz7o/X2m0Sm/qWExmvpcmiiWWHrh2sSITbMGBN7iaFWs7HJvY/0aezn0OADhl2K7rNCKfckVckt+KL5tZ4XiVxubwDynEo3pdCtoh7y/10FlIbtH4/WlyewALKNR3HwZ8AAAD//8xdS28bVRT+7jz8TuwYB6fBbVCMEkorQbcRCzYVYsEOqeIPwII1GxYs4XcgJLaIbZGKVNQFKtCwQClUISSpTZw2DycZv2bmDjrn3jsztktTCVXqLConjTPxzJ177/nO93CMEQVSxffTJgifC347/oPpAhNKYswJJg9jcAf9WhklpynL45O3QklSunIrucFIUcpZZ647tCayz3T/ucDW75+8GZOHGXTsN2AnwAab/UWJa2L6MGBATLEXCQ2F4++0JIEBj1guoCgYYUqLT9eBXEJpQMRdUw0oKCRLSSKkpuqz3wASM790QW+uZ6CdKBXtTcZO3yafHZBTi2WaucCaF9rQu2qgK9BBDaxhMIzPYyIc09fWLMRp40CRyr40P8vdY23IoyQQQtPJdd5z6m9j/T8V2OSU2etNbQ4i3REzez4ambPlEufHMnpLGjYRIjhpYXiwC2s4UN25iHKJQxz2R/DMBpydsFWMYalQQuPSRdSXFpGvzGJIpop7Lqq1Gk4eHeCg3UEU9jAMlEEcyzgioH00wPb+Ia6FI9jFDArz88hWqoiOdiC8PuXQoFIpYnXpAn65t46eMbjT3cJQt7yJkXN2GmFn8y+srF3liY4LasuAYrpA1+PRTDAstdFRWYKNaQrxhEFdf3tCR6xYJRl+vzFK4udTP3eTzJEpQCCSY89I+v9Z+y/GmQMK4bTYpE/NCcqdNk9awqMuOn9uo7PVGqvbOIvdOO4TnONYaL55Bc1rVzG3sADbzarFOkr2/STN2BsNsHt0gB5l4xL9jFgHwpAGLZjIq/R5MpFgDwDZ9eAMVHazFKo8ZjdXX03Ytfocai/P8Unp95piTmjHY/0FfzZxjkzCjOQYwITR8SeMAEuDAgq1tdHZ66DT6eAJ+/zk3lARk5+BzBY4iUCaeSq+R3bcw0zr0/jWmM2Bo6JjctkSet0Wvvj8Swx2r+PGjevILlaZYcIu2s8JBGB6Gy3cZGAoJI67J/jxh1v4/rtv8cpiAx9+/AmWXn+DqGM8mJxLZay99z7++Hkd/zy8qT6b7po9i5Rp6vwTF5hi5thFmBZrrwu/20Gm+CoiZ4ZNQ6l7HGltdxLXxfliCAQVP2W4hRpCz2GDJWdsi6quOWlet3db8Po9hL4GAKhLQBn3QhckwjoXuHgRj8l7EOjNGafXDELsbLcwlV4VXx7Jm3PBfgplOKUaRm4BPmf/G0BSqOjTSMWL8gYxUkZbgfCZBUAgQcieKjnsHQI3b90H2qf44N3LDEjSXE5+AlLH3T3Pg34/aW/3W23cvXMH33z1NdqdR/jos09xee0dNvF0rCzPCT6NMLuIUlWg0WyiUr+Av+8/OKeI//+HSpKRyEZ9WEct2MdtZBcussmqjCuFJ+uJEvaTkq5EtjJ4G2XzyFXr6LMcQyUJ8Fxp5iP9r1T9d2xtbcEfvA27pPcxUssAztH5xCw2Q97UHTOWe1HakuPwGKRjdHaGTKHIPjhSGxCrZo0xAo7guBbTsJeXl9BoLCJHsdRkYmkMjFOThaXp88SmJM02eQHYUk4Upy8+oJeWegiOYg2w0d7D+u42mq9VMMN9ZCjPGN6ROSzrWF5ZRXOliXu3f2VTVpLEjVJLoZL0CBXXGkbYf3iMB79toPnWquJFMnU7UCk9XGQqNqFvjSDyFva9x7i7uY7esIcrjSbqBMTyRK93C0LLayCn1iYj1opSa3X8ec1rBm+Tlgz3hgId9S1t9j+gon02W8J89iXm/gWNCJ7v4azfw+nAQ7d/iIEc4tTzcHJ2yilkxELqkwTVDWMNujFmVqZwyX6L2fIBeRbROuiqTi9DKQ6ff7ZUQd51kbFdVGfLqJdrDARUiiWUC7PISBdZkeM0LRcZneMvEmNV/WyqQ/lKjV+l/x6fkUmbYiAgZJb1Y7+LjfYmbv/+E7+m5z3n2soMnRLiIs13EzYD5qHe69gTqXLPNi4V4BnvfaUcw3tkyvfNNMloH2wiAinZgeqvpxlr9vo9rmeYfa7BA46SJPBQgxdjNZiuN+MmN7/P5ZrOfI8TsYws2shuY+lB8j71etzk20hy+WcYEKDvU7QfmQ2HGIW+Yszr22bSEIxnl6kNuXa3bPwLAAD//9RdTWskRRh+urqnZ3pmkslgErNuwmr0YpSA0YsuiKyHPcj6E7ztP/Ck3vTg/xBUEEEREYRFFmTxoKLBFcVNIGuWzU4yyUwm89Ff1fK+VdVdPcm6q3ixckgIk053dXX1+/F8eGUo0OmbzRfrF1YDqvunT0A68FnELtPdw1rpIgy32/hVelpkTOokEJp+YE+gp0/YFCN8/b9zn0QhSiKCsbYrY7uJzBQynJzfPi1yZxANZrDwn4dcJDCyLP0Iwjy94DAl9Geu09McZMNlcTMz8VmOFGAFRitJStJigRqeBimJ0iIV5HPPQh6nFxWmAqnSA2CdD3Vb71cssI9DvqpGn4EtRuIYjSDgn818CLYmVHOXV7mIQZ1Z5yPlqXlx9YKNtejfaDgsQX7sz3IRQHNybO1WRxcQ2LtSF7gK6JacCqGBIGiwxzql5jKNgXEf8VEHsnuAGkG8vBrgjxB7HoYyzgXmhGNCDqDS8NFanMfM4hLai/PMHyehucN7+/zZk24P4+OhmndtccMiXhPgz7sd9I8PsCQeh5iZRaXRwiQmYZaQLYxmgwAXFufRsMStlMif5dKgvcEP7uwxtM21r5GCJYcZowoar+89/W0YjnVlMsmf1QL+7+b0FZPo03pT61bZd6aRWr85smQK2WGG1LAix7r/Zl+w1xIVbkz336wdVelUOgSj4Rh1tuLxsX9wwh2AdCjJ+leJ4lhCjw5bhHpIfBcra88iWDwHt1pX7zF9HmMpMRICdJfuhMfoRgNkZH/iKtoDh2hOAQZnQTHo+c4kJkc9eL0B4qNjOGGSJ/6OoywvaxVyFyBhqDbqszP6OIXdnESBLiiG6bqXCwGO9jfg7xQhsWNIkhcvhUH22MehDksK7O93cXKiET73ofJz2cBrInFnEGeuKjIJmQuiQVsVZZZQId8zaDs7EnZkO5kUC7MViGGC7e1bePeta9i++S3eeftNLC0ssXgbFwm9wnboQSmJtXtNzUl5MPw0TRDFA+xs3cI3X32JTz/8AKvnlvDG1au4sPYcWyqShZBgXn2ChbV1PP/Sy7hx/Tsc9Yd/UyJ5wDkaKLVQNDRjuefyWo5QTQcIB3uoxIdI2RLQcBhFcc/zC5NISDHarUIELWSixhZAwinDt2mhRpDo7PcREhGeIuYkxVmdrP+rFkAJmk37jiSEWYUpVt1ujwNDEomiXS/KW/9FwE488sRvIwseYWSL9i7lueMSe35842IkkDpKCXqcKUtNshZMWHCsjt3bu3jvo/cx2nkVV668huXVFQhS12bEUKUEI1bv038y8aL0ExXTTM7sERQ8TtG5extff/YFPv/kY/z6yw5euXwRL1y8hJRsOKVgvRGOeTJV9CEaVbPdxqPnH1NFPn47mb3nvxuO5QlPjgC+HKEZHiDqbKF2fgNxxcWkFF9p22PVMFXWvtqVwdBhWB3cI4cOF6JaR4I6yFDVc8aYzsVMoZZ45vf2uogjQmD5SkBWcjbGL0mj8+CibFENq/MvNY+dEn6KMyKC4+t3G0OKDcc20WLY9DnfY2oGWYflqET6VvXQbM/gyadXEZBnfS/lYp5Cs5yOoWm/cKgbGU1USpWhVOZ4mMFB/xkJx78ZD4sCkE5xM4RSWVT+OY7AUSJxY/N3vDj/BBbm6pwCclysRW3JoyFotPDMxgaur1xDZ/cYk0nMuvvmPSlYLcdBknFbizv4v/14E5dev4xGaw4jEuY13R39zBFdhoTJa/UqP8+TYYifdzYxCgdYf2ody8Eyw+iFLjiZN/GpGcsM8s3eW0V5l3WKTMrY31Fjiem91JhLJOqVAJNowloPJPhMpaDZSpPthsPZEBGWmX4UpiEXgYgmQEft9/s8v4PhCR9/NFKUBhtRzOKASHOdL4rVPM/noiY1dgiG3vQCtCnGFC5qFR9z1ZbGY6h75jNFT31lNhcxFzstY23MO88I+9mfPXN9QAl1TuQYvUkPP2xt4vs/fsJhNoRDrqGEgvU9JGNCVRe0aKln3jhEpHqftwsAbGenr91l3Spfd8d1As30sDQ/JsWVFHsSMsLYqJthEmBDDTf8ePU86ZiY4nhKpHUnnimQpCFAtCGtP3fWKGJlFQPb8TJrEGh1fnVNllAf/S4l5LNCynIxQ/+9sbY3iB+TH1ED3mga0HVSrpi7AbCbnaYj6qVriptKN0y5EFCe7qYuhHDxFwAAAP//nF3LbhtVGP7m6rGdK1GblqIUEiqEUFWVClgigQSvgFjCAh4ACbFC4gV4ha4ACSSqIrGABStYtlQItZHaqGlD0jq32o49sT1zBv23mUlCQWI2rV15ap9z5pz/8l1C4qCQGiqznjOBlQhUVyAOhS+wA0kc/NIWwZJS5qGr4IJ90SOQDK8aINMTsM/xjzJPf+t0cZWmsktgFXs9QwKFjFMVjThBmarnZyMZZM8WjyaMsCKXCTxYcqVYS4O+m1DEYDAoLQ3ld/mKRKgnX5IgWxJrvzU7FA6KFSz4QIoCCa750E64uysUG+t+5iwQwnoArB5aMGTbxjAOfbZGYriGnKhCUcgqVX5+LxJ1R7F9yHkj5qJJZgs5YPgM/UneoMJpk4+TXVWuiUCeCe2Bv4fqAvCGx3xxr0wqea4mmqTAcWGDdRi0s4+aaA1bltS6yyC6g8JmjB7gtJJIiYbjgkTA1V+CjaXjidBezeLRZBEKS5rlHqG+F/BwRxjlYu02HSYi5NY9QMzCKw0gaQPJAfbSA6R+xjx8BvtQzJ5JFyIn79bpacyeehaL584xnCtuTbPaNOXRM3Oz6G/vMpRKmfBIPB/DwmF3v4seqQNT8YEqdH6MqJXwHKXdPuKowOmpeSzOzGK92y29gKWTXm3JJAS689cWcuJ0NZNq76HKdJEpWgelQCCtEbKHIzEZG6hxnh0JWjkgJv9RWkMc2Oq6MlRG1JBtvzCLOiksxLUiIGpBPOlM0IFIz0Q2kc2IUT+kVTFRf2f2sa84eXRfWlvpcMSqu80wxng3xfrqGh7eva/yaIKoKGB+yIIOGWYTnHlpBUsvX8b0qfPwo0b5uzKmcfjoIMcGxrjZuQcXk/VJwPolTr1XpesQ8JqmbiuJ6TTIdYP2p8MRss42hp1tZMMBuR1z4k8oErLNaZDdS+JhemEBXqupabwx6Eogfc137OL4gQAAIABJREFU2QJHPXz1YPXM/o1dIKTDyx7Vamvla7LjWeHAIpgiZsjw9u6ecttR8h2PXw4x882zcIaFLcnTHrxPSweNi0+5Bua6J9H8EC+WvKv5QKO93Y3QGvTQfXAHYbaPht/HtatX0b+3ik8/+QwXL78KzJAqe4yCRGlY91v3XlcVlp2dBf8KzCzKYNNnm8wMvf1d/HnjBn6+/gN+un4NW1vb+PDjj7Dy+muS/EP2ydKsN2jgjTffwbdfX8P2rd9RZ81WHZ+j3+CEnlntsuTPRP2MVZ4UPRwM1xCOVlC0FwG/jcC6/4pMEkBPDiQ+H7oOU8iGbVZobmEKrjjQ8pHTBC5nXMbe/iH6vQyDXgrXP4Q/Z+sgqlVJXOk+83+v/4J6ev8o1VxdT/98PXCujXNhNrgO2XjEdm5FOkZjPsLmzia2d3e4INswPgQjViqoOgkCTkgxu3GaveQdnfkK/WGlAOr+mX4GxJHBlwy6LLDSFbZjBE4cJdInPXTWHuDLz79A/qiD9z54HzPLZ+GSBoNkWEVZ1w13qmoeAU8bfUteA0Tc5aPnnHRKCrZKlaSW1vnG7Tv48fvr+O6br7C+dp+dRd56+10snnkB4yI5YuUUeUo+9ArMzM4ipNjt2HiXOvzFSf4zjj13vMccK2YcfenrqNJ+OUETAyTpJg46q2hNBhgT0crDEe91W8tQE0eBeXuMnIE6vtAhPab4pjmF9sIS8q0NtgMMLaTRp0FyLp+n89GjPezu9PDM2WVkpC9OejgEn3ahFlDJFjYX73NVmq8nyjRyjMqkImWu3F1CIFLiRf8HxWLUoCFb3HQkMe6hY641WQ6zo0oBLlIRCCCea2LpxSWcf/4sbt28q0geNsKzkaxUvilO7fcYfRjUJqAoC7G1Z8M7iTitpsNTCu3xWazd0+IvfZ2X3WyjhRhSrbylzpPGpMgqwehCdnL+PgEUWchEOAwmPu5s7GH1cQfLc6fhY4x20OJ4gubcIaGtGSuvXMSFS5fw4O4vfE/inTtNALmgQEWtQpRzyNJyvDfBw9WHeG5xnk81mmuf4uDYZ1tAsvl1rMMk8eY4HMHFEW4/WcfmH11cuXAFy/PnsYBZTi5jRQbl+tR66mtPnfDKXtkr93/vxBNtTbVqbOn5pfe5s1vkiMKmjr16ITAS1WdchENTnkgav3a1viHsEaRuJLaUpfBkbb+15lbtrGrETU6qTashYjxAPa0PqoZJAd0T/UqT6BiFjF+VTju1f9C/m1KCO9YApedpBIc+chb76xzu4Lebv2Lt8RoO3BBZmElDmD3uKT+T/NBXCDrNCI1f3JD8hnQ3KB+gjjy5rbFonSfJsSXlJ1Ac5ODElK2c48ksJVH6QM4WdgZocgJNQ8r6aFRoCkTInjv4TNGm2LDSeZlMRINNaNnyGwy9LE02ycHKS8dO8h3qrktD3ChEtL6pUESCj5VGG+kApPwdooRcC7T5xigPLQBQjMp6d7Iu7KL8mZqoFaVA3QgUQVBvKEv8ZtpCZB8pbn9GgRjlI/xN3dXzxlFF0fPezOyHbTZ2ZBObWEAcUIQVuctfoKegoUlDQUWJ+BuIloaCGoRAIqJAsoAIRXEwieTCpomVBIzxx+56d2Z2Zwbdj/fm7SZGKSIkVrK82rFn5+PNe/eee885sUMW4hB5UW9KEVOIvMgYJ2hF5XncHExHtfif838Pk4Qi8FA0qrrIF1MVEN0230avFmPQSn8ZVLjdvhN1HnCJCTBZ/Q5/T7Rv6o1xCJvnzfPCEdfaBm4CDrgUbvDzQCvGEw+S28aVTYr1Wi1Jlpy6Y1l/zzSC61QoS+Vn0wAeKs83PMbp9/VxiRKlE8AIBdv8pB74s2d5JsCM6+JQX8xSLeN4gWGqhQQeLOSmQhnOlcEL0hCyredE5zxyFonBJBap5Z/YNUbBJGK8NR2CwCRRhN4JA7rpjI6XAh5/7jopBx1T/KK5mbikdB4MGLFyd4EmOS6QFYYhAGAOmEuRdIiPa1mkR+6TOxIDS10l7Taas/NothdQjQfM4Zt5aRbdA7JbSYWbxXKZ9QHQmXeHqQi5UGXBtNkWxzRaaLLSa4WoGWFhroOXF5dgT0/9/9oKTyVHRZqpRZ2BUYSvMhqOqhpqFTxj9bNQTrR1I+guCAMIx6u0xgTVkrClSbhI45CrZWt2LHu36twxTIdeabT2Uw0jHqvOAmKLSToLrGbbS9F/+Bee7D5E3ie3eqvXUmvpjv9Pc1GjwtrGdVxeu4bOxUt+LDD/2gr3/xg5dvsHeJKesP0jtw2TPgIJ7qhydKGTIaPLVEWjOWFwhuL4GDjqimBTpcrCtmL1cc6fKfqLaQ5qIkrq1uO6n0594HHOy1cyiQ6VaXs3KcmOuDoIfRpou1xD+M84vKhIhLVC97R/buXfjx0jHQBlNCvvJ1r+9LucPZd+B4t0shG0gIRJZNAkgZ3Bn+jtP0DHZrhAsXwGbG/exse7H+C9mzfx9rvvYHHtNTQ6c6isAp+OFhGIj7nxPQ0AuNmUAuhSeZEEWj7a38ftzU189+VX+OWHTfS6ZOvawhvr11HGjVq8yLc0UnkxxdzyKpZWX0WxvS1VhhfUJe1qRNz1gwEa4xNUg0NE8yNG7EK+ulzv4J4aYMQ6HSQ8NoMqbzxVIXZVqzwrcXI0ELFz557jqqkQ4az/hQ3gM15u7WQgm5x/KMktK/T6PbawNW6tfsYIL1Xbws7MY0xj2+qaUElASPdfONZjtuDiDiZ3Yb2CiFjw0TVsmjELSsYUl4xzfPbJp9i5v4X3P/oQaxvr6Cy+wt0JMNKu+jRw9W8AjOXknypv1tQOP/Jsj7Fz/wG++fwL3Pr6W3Y+INHjuBnjwuISTKPNHQ2lwnvGU5zExjNK2oib4sbiSHMTmhLPMTbK57byFFA6qXLMVmc4OztA7/ARopVlTuyNJhlwwFfAKZ74vHLzjcR3FYG3rQWMMMPODpw4TYEAbv5Lhzn6vUz2Y6M6sNN1i4AMjjFDSlfo561xI4HScUPEOjlBpEJOJTo2bN+l1E2m/JW5xDg2gSXXHCrSSGsaz1HtuRZWVi7h3r09rgCzRkd495VDT6ccU1ErHdWWdV4b4b95nTceXIXRTsS6pVcy524+BR4iR9mlYpBJcDQc4u7ve7jx5lVctB2UBYlct4IxEGP5yuu4uv4W7nz/E7JujpGHxjReZ40Ey2strRpZr8DdH7dw+cY6Gi0S2SbAr2CKQEG0yobwwotRyeJpSTvh+5NlBf5Ij7D528/oXjnBxuo1LNgOp+GR75+0/ufFdU/Vz7/bZxTsO5oGaKbuQ5tEks3kc1v3ExZAQIo1VT13clGyktUvFOe25XRH3dQTPj0OQgA5fD81Nnld0yIGgScE2PSR4gQ5dg73sPXrHTz++zFGUQ7bFOSREuhpQCUOkmemblMrehx5Pjzpd/F1aTnxOonRJF4b+dwTTjutGKtTWO5b2+lvSIxURP4c8BCpDXbu41gnmsen7gpaJIJPIIXmt9S5TLGqFDhFsT+ktIqgeYLBMBcheaID+e00b4punegZOCH3Bu/LdTd4Sn1Q2HV5IYMcVJQvJHGn68K5llb+C/Gx9MfD+SmDDyoMTrRfpWc6PTyncRdHMf4BAAD//8xdW4sbVRz/zZlMLpts17V1Y8U+WERQqCCK4LNIP4jgg4L4McQv4Is++yDeqI8KfWyhLKVQfdBda1nbzW4Sk00yuUzmjPwvZ+bM7NIiteBASbPJTifNmfO//S61VH2+EYZ5sQa1SykuyubWAVFNlLM3CKrOVm5LhWdE/OiEAqGFiK9MDw/ikWSJ2F4YxylXiwKd2BOEgbtiKBfAJrcmK3dKq4V/dgo+qwtZr8UXTaDiOC9cHELAWxQOMeB4HK6Yh6rz+wqq7j3ufY6/716nD1hAfEKGXLMYTSoCE7SY250OL0AJRFLUu8mqfw0i+kb2IhL86Lnr7oQs+FDcbE7Q0F0zcXLEIcEoLyRkxfxUISO5eGJloxTnhsI+sFmv87VCu1OBcjrh0TxQuWECFVUL7Gk9gurBjQhKoEiNv9PmKSbnQS5gGSiXCDm0bjQcYL2YonmuJdMBQlhwspkyfxTNLWDLoH6+i1athQ1MuHO7YMtu9cKnIE8oB7JsIZuVLEC8SjAZTzE87uPvk7EmULa0ydPP5nRf0P8dORpMZ6LFYMWEjjalVnOTNymyqHxcnhbHc27C+BZ98AqMUtPWFfF865YbcT6vbK3WlwQ/RWbzcGw85X93Pvq3CEZEm07M7htlCo1bc3TeVrPFm5pbq7wP+AkZ37OyFklhmQMXvZ6kGO8d4PDXPUSpBOgs86G8YO9+usZ29zm89vZb6L6wwwkcz6i0vkvYycFiiAQHJ8eY2gXniqGqFPP6SMVLXyD2klzT1DZcrLAcjxEOR7CjIZG/0KLEhBJLqzB/L5aFtgj01pv856/7KyIvup35UCLP6TOmCwTkj5urabtD9i5r0/x3Taqoq9US/UEfjz8MUyRANkKswlNuiNry4tGpVQFWkGl3ioaJMe7dxXTwCzrpBJ0gZe5rtlpjcvgAn3/2Ka598zU++PgTvHP1PWy+eBHreo2FK1tBUEkmKl187zFwM8cgxGwywp3bt3Ht2+/x43c/4PjggfAgGVHVQFjvIGV4tOAvbE6FyWCoMdNsY+t8t+jQZ1WH8n95VBMibhxlCNYxktkAoV3w88TTwXGoJacJ4Kz+qHEURHXYlckTJOP9Dp2CBAAPj3tYJxclSXpC2O//6XC6Pkz/Y2cQEb0d9PuYTuf5lXJ8D4JccRo6Uc5octQ5h5RU4I3xkDVybtkP1IVBsTY8iVaEmNVYQSiO+uoEvYd7PMF0PPWbP19H7499vP/Rh3jz3au4cPkl1DqE7oiY6wq3Vh+BvjCqwcGx0lC+Qw3tJZpRhOFRD7s3b+CrL77ErZ+uY0VNXoXDMqrNSPOOprcRxxd/kh8w/5i2bjE4epoc8jJAmG3tQqKyxYgHD7F9CZhYbXlmxZ2cid4/x/+0os7vhjq0mRLarN7ZxiKkZN8wHDzjGOThGRQNFcdrjEqe+/kblFMclH/mC2eloiTAENnScCrlHIQe6zT9NwbTk7FAY6nJ0hBrttQKhZMQHLWowU0rOs3WM5tsN9yqCZJK1nX18oSaQDEkWSxzKDlFXGuf/Lur7ml+gVnNDx55Hq8RUG0CMKSftKVC+XxuUEBr9PejHvb7fVze2UL91FkN2s9ewKtXXsfOzvP48+S+Gp/CM5K1ymgXmuNsDdy/JzpAl7ZfwThZIYvkWhqUa1rVuOJmDvJ4Qo0zogcsszl2f9vFaHyEN16+gm6rizbajMRxs3+jVJrHCwT+90e18cAORB6luFyuh+UCOnAhvLipGGv3NELDWXtbYNmVY8kaSwv8NT3GjXu3cGf/LmaLGaINQVo2mqLHkxDS5gxdOP+gWoTyW/rjRN3ZVU0Rm9REqGmD4CybQHF+K/JSojyI3bUU3b4FfI4yN6EOWwlZILUt58T0SN+H1sFcJzKSVRoPjPyORPivGHLKoNzx+JnSpt8nxRyZ6LsaqwZbUyoz1dJKtXWOXK7mchakgowmpIkMResqmkh/Z3ecM3KCeTzPNcEYbUEIAh3u0uHE13kYv07wDwAAAP//zF1LayRVGD33Vr/S6SFmMyDCSBwwAeNOmH8gLnTt4B8RXLgRV/6U4Mb1LAZhdDGoDINOMpOJSQbNxKQznX5XdT3ke92uSocERcULIYuku6urbtW93/nOo2Za3vIPINoNdqVXTUKNu1411YT78Lts+GZ6/vCAYFOH+eSmE2johxXdFHPArrsh4147mbSmZFKMVzQfpS9tAANQjY+4rqi0zii0KDGTBnN0DCCInzMU7HhMayH6fgUT3DwVQOIVksqEY/2ZggMU/ZCpkRghf/T5Qq8u2PjNvAsIUKECPUfVA6ACengXnCPpWrXb7QC42DFaPIZMOh9kFg0v3XiiVHGuZS40Z3t/SYcgzXUjSBT4JuVcy7lCn00hKeJwMpFJSg9pPX80cceTiSY4ROIgbwyFC8W/fT96bV0uqBT/5DtALGnqjpBDvTOK1eWoNj+ceudIxgMUSQe+WefVmeIdCwrvJ7Mw6px0IviVVd6E1DHg92OGrZN5FY8nGJ33cPRiF3EyxGA6RO/0GN3nv+J4/wWGr0YBT54fRs7ER99uImq3OAaRQADa4PpmUyhhhEiqueJSq0TrrxgCzRcmKgTYQ2NBtyd9Zp6bpvHXAp6BHpcHUMuVYjYlRole15D56OcMnqwE3OQlAI2NkihH1c8jAm2+J/yAVl2XAkPyIBStVnFhR0RzWswfZ1zMLUctDLon2PvpMeKXPXYsdbYZCfnrer29x+vr67i5dpsBCc8UXjV5KQQAIKr70WyMg94JzmdjdG40GUxgiYLm2lamDSG8aQw3nSAhNsZwAIwG8GmCFm3s4lylT0KJTBg8AXLafcepfLCvJldgYVtulNiZdCZJ5V0kcMUM2WzK30MkHWCdm3X+MzUwYjDKiSeASZD6/f61HTzuR1PxHzWFelsZUfVAjanhXUmmlMLPpmj6Pvp//IylrIslxIgoLjaAe2Ad++/PdvHlp5/hg4c/4qNP7uLW5iabZ3rLynZGOXbhvinTqCN1m87jGPvP9/D9g+/w9dYWHtz/ljfclBKRcNp7nZk34zEt8I2gJTUmAK8DccJIYJbmF+iy/+yggsilI6STHmpZEBJVJA9hqPSFjRipS8bGblX7tsB2oWucF+j1enzf5YEBEP31ZIn/4ZCEGGW90TNI2Wk0pw3fDOZtJSq7ACieJVVR+wZmteaCSZU975wZXXk1gCyf50LpzBQdOzrG6GQPdZehSVHCZLaY5/htbx9fff4F3n+8gw8/vou1jQ2Oda112nyNr5KMlD/H9i6c5jMc49HOE9y/dw/fbG3hcHsHUSoCsg51MZmemeCs+4qlj8xwccL2cIGmK877pH0eDEaq+RS21NXSmr87SusSAaWO2DlTFJMuiqQPH62ysar9T1hraD1XwPfSQZtZYmu0VpDWlhnQqKuur2ylZ/4q0xkwHI4W3on2Lk4TosyTJnTgqGvNRsyJ0KxTfT7o3oP3rrRGUdOE1r84RmdlBfFE4sFmxKxklpo0b6jrn85ixm0jlr3WsLy8hNdWl3F6MlKpUXViBE01dbDjRI0B9W/F4rpx3SjPu8uSHoCr5Uzhfy7x9YEBqCUQoNA3ZFYW31vCtIs07WT/7AyPDw7w3s030I6WdBaKMTI/36IW3rq9jo1338Hh7uGlHBqeV7oGkKDv9GiIp49+wdrm22g164ijAhl5dqS5MEe0IUnXhqSZKUuSawwCpEmKrJFh++VTdEdnuLN5B7c6bzII0FIQwMBcbnv8i+vDdYNBFi3y3IUi1Ua5iYeSdCI0R/4jFhjd47S6jZGjTxF/R/t4uP0Dnp3tInZTtDoNprMnA0kyE9r5okFnqgbpNtiCjRpGWvS6hqtEnnNKEQNRKe97vBc/AKH2p3zfWxS9yYwJFEjUrJ6Z5qVzO4+Ll8h3vgbEnk5mzPKhGpDqP0tmY+CBGENqZm/6+zJ7mX3yqBHLrGP5zsJqdwzu0mtM9s4N54jSRoRJbp9BMhcbBibQ3lJi69OQ1iU+JXNWAu0X+XyX6kKqIQXAoGMQNjUfp8qBE21Aex/hTwAAAP//pF3dbxRVFP/N13609AMsmJAKioGYgBCJSoQYSHz0n/TBGB988sXgg4rEhogYUGOqgVaoVFjKrt2Pzu7szB3zO+femdnukkbdpGnS3c7M3rn3zD3n/D5CVJIvOaCFGzB415oNVQ4PIpGZGfHE9oHmIG3OzqQUXykXlFYRS9V6dgjLiaCJg7F0g4L/TwjFWCHrSaqVF/eZiQXi9qt+WWDg51w1yHUhHRzZKd2z6sMJ4Tz5q938YlJanocT9JNKivX1500UmIlNkKv2gMU1WVGiqviZg2AIpKXyP75ci3Y9RF/Bdvi1uJGj1mgWXVbyqtVTUseEG6bFhWXZc/K9alCXhK5CdXBFDh6L8HRju+tu/FhdpeVfYIsjjahRVLdgPzsJqVP+eZ1CbnGsiT+TLHtfxXrD0TL8SdFEoZhYHrrjZXLMyK0qkBy2yMnxjvyaLITlYysURC0efLmZ0IeRF2fl82dPsXX/Po4df1kevEyC0ow2eHXh4hA2E6yu4nA/EYhasLNTArhNLvaHe50uth/8BpPwd4BBHKP7vINhqy2c/LqdMoG98VIlzyGq/iYM0VxeZuYsiQiLJJo8JuIHbuK4UN33UM7rNE+1w2nzL343dbvIJPmTyqYiENVwLpOMXnmpRjucEljGqvgvYpSWduEKLloo07XAOQEzKZrkBAQZfLh+ed+zyn0UzhSDJ7s7DJQ2ILo5K1XVVKvasyxSGNTHsr4DBGmOYJQi/3uA3tYzRCNMQKj5vULpoKjHMAsqp948j+OnT6M+X1dhPo4DRT99iJbDI8T49dk2WntdJGEuPLUg8gUmyA0Y1XJH8VA20ZEkoykSJvy9AZLdDtBro5kmmGMTOfKRRjXZmNapLOEbUXzg92xvP0Xn8ROsnOgiWKoVML5pRW7PTtTUYhQGMEwa2fU3CSJ6xpOnbIWsaPumCYxfloM8Y2GjQI1iaXE8czO8/yVih+GcCG6FtQY8eg9njptrizjF5YYF31CYCIzzZoilOR+NQQ/d9gYis4PDQYg5doOsl6/TZ6nzfg+H+PyTT3H39h1cvvYB3rn6Pl47dxaLR4/g0MJCIS4oVCCoIJp0ckYJBr0+nmxt487aLXz1xXWs3bgpwkiRi815JgU0PtAoHLm58QcuvndFq9m5Xq7IXjB+sbveb2Ov26vAPvengTahPMBWawpBVoljVDs4REX5tI/xsAt/3vHOrXCk7WhK11Gem6moY/MnjJowxWo3RfKWW7oCIcW7LGSSF7k3UCQFyo6n6kP8f2rDQcXygw7/wv8vNqjTRxiPdZOoz2tFNzBGttsd1uOmnC3K7rcvKKqc8Zz+zEQxiTiR2p/6mESs5aW2Zclr9nT8iODxxnsi4DjuPsYiuc9ZIsdSeyiDftzDZx9/hO/XbuLylau4cOkSzr39Lo6efBX+/BzCRiCd+6pVEyobOCk0xCN0WjvYXF/HD9/dwtdfXsfP9+4KhawGz1oKa2eVeyVu3m7f/hEfdvtYfOmoxELhlbtgkAl5UwQx/9zcmDn0Zn+SOHMs3eHyifeqb3tFPHOjSOpjAm88gBc/R5TuwgsWKuew6yxQ20sRZfZsidxZUgWhLW56otuRNw8jrS0gG4VW4NHFvXIf6bxKWq2WQnFrvmhHwVr5mX1OUsX1swBhkw3C/mU/kqk1cc1qOKWjkb6XZRJX54WaVkNqdJ/nWXwXUSeqx6AaRbSL5X5ldXUVK8tHpAAgauYVyVpj6Q4s3hDBRlFZJgQBtWPYyXAFklyT4ANjkedPiEjOSvSnikCFVlT1E5NI2clzzF7xVZSjE1skqqXVH+KnR1t4eKaDhaUANAV0Kav09r06Xjn1Os5ffAtr33wLM1AdoWxkZJqkJrPwbB+B8TBf95FkGTburaN7bQfhySVyT4r9rDoTpYK20pfVnRARcEvCZ6MiyPDXaAfX797AmRNv4MKJs1jBESyiYWHsuSA7XvR9Z4+/N9WI+a/h1ytE1y2MH5Xn8dTxKxD/okkTqKWx1WN74QX9y/qG60DTcYCuX03mDZL4p+hhjPu7W/hlcx2/P3yAgekL4qLBzj/XWZzhULMhav9iZUjKbTiNzBa9NqfFEoRCeSZfP/NUcI95JtGxsh5yU7iNCRze5l3M37iPpwYAnaXc37indZQCEddzKE0rsh74kwPE8/L8qkkVI6qHIq7IwvtEYcJp3lnbe+Y4kutUuunULuj3+5bmoFoXPD7zO4Xma27kck7Oe/H6l0a4dUQr6LWl1XZ1jYqbnN2v81jMIXjd+t2UoiDON5kKgAsyyTYGXSHEHdPkOf4BAAD//8xdbWsjVRR+7mSSSZOasFtZ17W1y4qyqyAtuCu6KOof8Iv+R/2i6IdFkJV9YVGRbukL29qmVLeNpemmpu02aWaSuXLOPWdmksa1iyBeKJQQZiYz9945L8+Lr51ZfUg96dK7Kgh1oS3HLhr4cHdbIAZs0ZaxL6CEwPlcCtTczycz0KqNnVoR+JpQCofdd4gDOm5BKi7047jaopUY4X8ofEs768pvh3hD6vHdNcXOj18SWEqOyPNfv6eTIztJaQIxR1l8Hp0Tgku68zZN/PW3KGTDJEIRgwm4VvESCIpYE8U2hY9rdz/OsIcdpSJKjmvlIXJ1KeehhFLiPKDIA15cItSohRNIIu3sGvuJOKNDbUT8fUY26HZD9AHfUQi0eKO8GzMkItIRP0kKwPLCneEijCSerMbJi0+CY4GwKEoiRTfEA5bCVoKHJOD2PZSrFRTLeUTdKOmzmUxwSKPkeWjtNfF4s4aZGzPIFQl+l4MfnINHHrFKyQiKqE5N4uUrVxAsLaNEgbbwNbl7cRKi8dsW/tzZQpGTTcNik/Y4ci//bPOUl6tN0owXJycx8dLFhJfs1gvRZwz7hZPCtBOgjMW32SbHSTlgrgtMayGgDi4r24rcoHGhkqPKyHpS338q2NEG6LlCHjtKsM7HoINHatsnG6QkN6qAqkM5UDw/PC8t1mU0A7IjEZLsGwnW8nIeJ7rHvqWdkPlkJa+AdmMf9ZUaOk9a7P0PYxP/bXq2RfbIphdfHxMXL+Dytbcwdv48UzWYZ0bK+aSuzvB/YLPbwsZBg8V1aP9QSLvRAJdcDqTwH8QWAXE+Oz3s13cQNRoIjtowYZeT84iT8Xgg0uJ5bIDGVh3r8wu4NH0NVfqgMi5Vm2wGouh96jCdcEJNavb9fpsRAL4nMEt9FtZLxRcZHZTqICBOq/50X5l2cerunx6WRJM8ssTMDQZ7WRhkEnTas9lAAAAgAElEQVSYBPrP4AFCTIQHCA93EB7uooIQ+Tg/oNJtkjUYM48z6rWxtbKKL9Y2cOvrr/D2zfcwc+NdzM7OYLxawVi57KCkJNoYx2i29tn//NHCEn66/wBzP/6M7nEH1kYo+wGvSce9Vu6jQxHdu3MXn372OUPBeYuLROiSLuqki9rSMjZXVrl7aoV4kSTZ5mwc6X8alBz4NkQuesr8VOP1WYLAZLpM0L2W5gY9A1oHHLzluRAQJ7JN6Xsy9tLiZyiULnYC8M/yxP/PI1V/UH6r7v9U+I7otzrK8cgGF+uF0A0mVEs+4P95rTD3eyj5Fxy5PudsH43nK8UEtoeTgz8QxAcokB8/F1VcEUzjZtvrY2ttHV+ubeC7b77FOzc/wPsff4Tpq1dxYeoVlCsl9oOnwJP2Xi5qxzGrfB88aeLX5VUs/fIQ9364jd16HVHXmc4WZf/PXpnHyEsP9+/cxeLcPK5/+AknnUpvcXSpEGvLC3hw+3tsrKwk83t4JKJmzzFlRokGqrxorJSgOELBkHjjIXK9NrygNzoL0s+ecX7ScugXyogLVZIEY+oAF8uGRJdZwzEGB+qEHCuZMUGnOYtSjNBjSs5BXFlqSDBy0zU8lPdP8SZ3DaVRNF6poEfOS4wqAKuuE2yfT27kXHK3OU6ggrbvo1Qal6KcJnWnsy56h1FMkeWHE9LteS0clUY0ajia09mO93cIgOHB/OSMhRgjxBKEjoU/Vsbj5j5qu7uYrk6Q7Czz0FVgmAuVpRdw+c03MPXaNBbnHrGIIrR4bNw7nBIzKqx0KXk0QKu+h73ft/Hq5XMIzaAVmtIbNTG0mTvfFxoNCWObnMHeURNHtYdothq4/vospsYuYRxFFm8OvIJTXh8qhP1XQ22LT93z7BzJzO1Ts8qOnmv/ZpCoYBfunUNFtqfo4RgdNKMjLG/XML++iO39XYRehKDkswsc22X2ui4xFRFrWmsurnn2faU1SN+lvIRymON223XtGaruJ/x4ZpNqvkLFopwn1sNWiqhuTnKRKHLzhemoXj6lpAsam8UtJe6i47nGrEWpTJbZ2jR2iAfK+6jQpTkyd/DzPqPWqLlGxyerQELzaqJPMTT9qXhhoj0i90RjfrUXpd/hrjVtuOpQFX+G9OdyLFZN16b5oKM7yFxRIWdpdGsuSsPpd8j8kmZ43O/hL+Ku5beNIg5/O7u2YxPHSd2UV8pDoqGhihpV4gB3OPA/wZETR/4IkCpVqEq5lYdAAoRIUEIhVdOWOG1DEsdJHJPY3t1Bv8fsju2IgojESFGk2GtvdnZnfo/vEXHQrwk1exZqx53G8fGJCOt4B7nuuzy4VoVOpFvoYBF9vVjMXRhanClBcLB7moyuug3Qd9IEsEifitb5Hv70N+oIuWNpYpzafegllMMbgOtIOnQAoRAyFUQPNuKfY+C4Furh6KAaMklhVgDJutWezR7TFjTRIvVHf3KE06ibGoxCpgcfYILxs+WE+lWmA53bQZsMsX+QG5iq15TgD///oUL3HQIATrcgQKbGDO380oaU9MVnnCtpYagCVEZg4+r9P/j50n1JlUvHFhyqtu4rmyaqrOluZl4o6Ldel5zrrNdLVeNl02H/HtQvTOOZySqOmnsDUkO+8BBB0u1xil+Wl/DOe+8ijCpsDxaOn4cpjCMm9c3ynxw0TM1cxKVr85j68Qc01h9iIhpDj7tRqqJPiX4QISU7SOarOg0u8Zq2p9nMBMCVq/Oov/C8xgIJd3UKkHuCu+56Hahy54I3Z+NkvAqz0QIAa0SYUWk5o4UX5rY75IiKaxqF6zueUeDtKo5ug6H9hxcfFRWxukgWIrFwdFAkvi+tHThPfzi3AKG7FPhYqTbGvGGReJ7jRxGnPd0/wuO1dbQPe8wh5G4/Jb9sDZSyjSOhTDpxioU35vDa3ByqXACQqNhBYKn7v4se7rW2sHm4x/9YxURCUaCkIhHKfZFAFHGApBPDdDrob20h3t3ByUYDaLYQxakEMRF1ESzM0P8ndJYUza1tPFhdwflaHbMLV1kAD/WaWFNllyXFycE+d/+payFJTyyigvTDXJZkJOh2zWpBiFqhCnkvE+KGRLEG5s5BTb3PSrlzVWQdC3ZvJiqMorJGEmAN6Ej80qr6sCAf+mjvNmB75IgQ6eeHCvuV2FtgreIYMU6UIlpHbA/dvR18d/MzfH3jOtsWTdanUK3RzwR//0H7ENutPWxpZ4/zeEZmyAafUtEkWxPkN22q3aSHb2/fxvpvdzE3v4CxcqTcXrINiLG59DMWP/0ET+7fy7qHZzV86B8lX0Xylu91EPePRS+CnjuTi0yloVULNClrEY84NCWYoKiWWEMQT1balkCAniNypuFnNRFo+mjA+LQA8H+iDGSaCXk/cOA1h/Ixgvzqpj3WO7GpC/bytzuVhERX26BYgi2WZU3UfTj7Nm9PC7RImXiuNzwduv8QBaC9+xBFe0QO5TBG1jXY/DkqFcoMPabAsNs+xFeLN/DFzeuo1SZQn57GxZdfweS5c6hWq/x9NGckZNhoNNDYeIRmqy3e0ywIZRnZQQgz0gOQ0C5RuTsnhBYgPurgw/c/wEcfX8Ds6/MolUOkJykOmn9g9afv8eXnt/DN4iK67R2U/qGM31kMCZxjFCkZ7h4C/bbo8VFMYsMcZDMMI8DgRuO6eUSHSaNxmLGqIDuyomJueyvIMjm81drn6zseVJDwfjIKmX4qYsWLqcYqFX6mXLwbevo2rhibD4UbZhQcuc8o5qpN1pDACQLrq4o+4aIK7XdxipioBRaZFaC/BltV9x9usJw2BhRVPFEywef/u+KmGX5v8PfikHyeATSJCRAUSnjcbGF54z7enr2i18HbEwg1EcSYmb2E+Tev4dflO1C2m7zXSMxDNDLa0rspQcAtDrb7uLO0ghffuoyoWuKucE5nNEq3oEKD0uSsuFfldp2SHBfKIRfcH+3/jqOVfbxafwlzM5fxbOk5VGBRYfUBk7uMIDi1oHZWw52fu+zh0B3LfHG/ADA0V6NnFg7cEGzz+x9GrO4dVHZvJ8do9Paw2ljD3Qdr2Nx9wol/oULItT43d0xaFDHCQES3WViZ8gEjDQx5bIKRfcpRgYvc0Zc8zqiYOMWwPk0gO4bzMqGYOOp54kTjtWHqEOcFl/dZRcp5g+Jxei9D5QkVSoifRGD/FIc45CzloF22UhfEMuWzopuWDzqOYmMR0xZtG2qC82ssCKhig3RORElw65oWAghtwDEs7UdqRypz7Sq4eYPYaa05fj/PE11vokXoEyv5kruXRitMlIPQuXI+Z0L8BQAA///EXUlvG2UYfmZxHCdOaORAF6kIyiJVYrkA4o7EjQviv8AZIfUE4s/0jgTHSqlamraQCCInzebGTjK2x7N96N1mSZpWlajqW9R0MvN55pv3fZ8tbJgjBJWhgiQBVHQBa+SNNn+WQiTO3kEZmeBpFB+TuvRkrfk3xIsXK2yVDW6mmf7QXEyKGKPmlagVgZ6b6e3pWGQIYhct+g5pdqnpNUfFuiM90zbyCs03nUfdOZ/1t0GT6sExeqlGR7BBnDnUVmsgmecyYSqzLnWKVZcsPO9DaytRazU9HeSYZj5RR/eNEVCn+Ncnu6xjowmXIv/1KaqymfhmsKaNChP+OWiVlG6njVySNMtoTw2O2FRCJ2ZQhJRu5JlO3OsfOzfzDXC8Pi02FqkkJFVjydRejfSh2EfSYM4tdJHgCEFpJHP+hUnH/eveA+z928d73TfljdhZQt5aQHY6gptNMB2fwFtYxMdffI5P1u5ifWubFySjlAvVhrXI4TjToY4+SrI91vQ2aLIzb9y8gS+/+hpv9K7C5SkKompPx4wsUA44UdOIGkXmjlEU8/FykzTYka1ooOeCaEyh33ipWxSi4+ijTF62tahL8QBwvP4lGyXNGsObqtA4n51cL0SM+TFTJgpqQzL4Z4sklCaAzJjgeBPD86V4n6YJIyt0QfkowWn/KWYHEbzavsput/Qc+eBoxTRPEcwHePvmB1hcISZHW52+wa7CCZvSOAwwwz9Hu8hbMojIaS8IqekPMEcm7TPAG0UIxwniwYjj/g4fPkS0t8vNQEDDyF6PKaBep4V8LkRB4lO7RufjlAZuLSA9nmB3cwv9pTtYcqeI9zfgdecRdDvIArBUhQql5eWusGNaQvOiPZW/V0YuvdJIzLla1693FQPafoX815+fOJmduRPlU9dE5ywBaHF0ZQbVvvp+851giL+hs76nOn01Yh0fYDbcQdf3NGqzEAmiodyFnZ4+/zR9DoTWmGUznuTT+MGNTzCcjnG0/YSNdgqNo4xzMcDpaOHZDiSaMcsrB3Cv9owVeYIOsXz29/HzTz/i1i+/YmVlFWGe46Dfx/raGn6/fRv3fvsDcTaGeq6/mpKOTRKpMacB4ZT9HaggLdg8kp5ZkewwSk3vR6gumt4J4ZzIUooKM7RBoqTZF0jSHONZIt8p05dT/j5fW1P/kp+LEC5A4gWt0PXVpDOZTrneKZw6TjPiDOU92ZDUcVPhCDViLX6IijNUMWY83jOFFlzUzNBIKsQVBKGOLsPkeA8Bm8DmPCg0FNx+P0mpMG2p90bM7QFVKNnxCQ6PT7C3saksozMyN0YifTZr4qAubtRyPh+W8ZFSRZ90J9i38CIyykOfYOv+fdz6/gd88+13uNy7jGj0lJH/R3+u4fHdNXjRKRaJ+VQUjRHZq06G4Fk8DSVJBkCu7J7VKdKYuazJIKsnV8CQc6d3OjU7nIgx30BgFVxvMOzo2qJJzDF8hv4GzlDv6v/WkS5jJrLcjUAmZcRRgc7IWlGUZl8MYJDkiHS+lDJFPkAq1aNmiOJMxYchFzYAvzczjm1cXGyXKSq5jRudIX1g9h2tW0LsWleoVElbzpfcmBr0c/8Zkpf/6ft3apoqMaBajzrdv/RvU9sRk9eP87G+s42NaB9vda9X5pEk9aB/90L0rl3Bh59+hNWrq9jvDxrnan+HNOMBo5pA2wGbD/7GZ7sDXFq+Jh4NbMZQUbILZ7tmUcqG7H1qx26TB1ROoGSCwWSAaHKKYTTCO1fex7u967gUdtFBG20W5BgdX9egXNzKrcZdAHxc9Dk33DeW5zPYNngBY8dzL3e7vIj9I2acdV4WmfylmBUxhsNjPH6ygTs7j3AYD3ESDTHf7TDL1/nk1j8v0rXYcWNc+Gqep+bNvMfavfKc8whULiz1Yt7YRwm8NblY+ftBUHq0sXF6lmpDHHCvYL5n3NvRvUTNrqVjcfxnqECosIupN2JQWdNkDDCjPoYp+2wUKN5ozIZVrxECKuQ8hClunmsGctPP7NYfS6ygyBHE240bfmYUqadTKSWoGB3GBGC3fjUBpAfDenUZKlc+C3Ze5RrRQEKHg6WfDl2Xmh3S5Na5Av8BAAD//7RdTW/cVBQ9fs/2eDL5UpUIEhqkCiRURQLEkg1SJTYsgZ8A/EEkdmzoCiSEoAWpbWjIpE1C2nxNM7E9tt9D9+N5nElSxIKRqqZp4vG8L9977rnnxJxgVIKSU3BHfVtEx6nKWlAUFfKjRCB8sDZ57gRpCAcu/2zVCv7RwFHvM33dvUmmwDdqsUX34LyqFlbt9StFW2qthlNfSPgeJ+PcHiAWMeI3a1iplz1PeRwNU+pY4I6rpHIo15WKp2k/JcwURAiJVLh3oUpocFtr20EHMSRas1PLOYTkCDLZ5NlZ1dJuwKKBVnozgnCf+BOjZTCw7QSpzjZVO5Es6m7jdtFLwD11AegeSlbRL24tYPEHx/TIRjySeH4DdYvFdSLTKk/GRgCLXi9Fls1Jb7gX67UiL6QCzGCJWm4kpvXSdKGazz3gCf8/020qqd4i0t4dqN6CE3VP0Xyo1HJShGUY0dK4gRwOaic0mDQeIFtc4p79/d+HOr92tobNFREKtHYf/4lHPz/AxtvvIulliJaWMVhbQ3lygOriAv1Jjig1sIsr+OyLz7G1s4sff/oF82mMgtpeVOOCNAScquE23P+nlVk91CotgFAgNFjq4ctvvsLmx5/Ax4uojw4Qnx3Bjo6RRRa9dICKXQ2oVSLC0ek5awbkXj35AxCgYkb08dKFAZWhBHXXqCj0aooyvVGhE1nnAWCj/RCQVwF8gljnZZAIQbNCgRNWqlYLlkaDI69eRuzy4NXakQ9FadMILhmBORNehoWCItbyoB50EtCrrFRABiRCOJ7gbOcY+d6Ig2q2S/JTa8WYq3cOEwus3lnH7c27mF9dZco/eUB7Fl20GKHGHko8PNrGaTlCTfZ6PuH1OehlSIoGWVmj2juB297HxdNnGG/vY7TzDOOTI1S0FjKDlZUl9Feogl0IYEJrle7dJTzvPKZxD+Oy5N6q5389x4cbq8hOl1HVp+gtzaHsJ0hvLSNbXkTU7yPLIrYyIntPqwJG+tzlc8OFh9GsWq5a53Ut9MK5RK9cAQDXpZ+Q5yynoQ1TzNHrIx4sYJzGiKkNwGa8rmtmQNWaCYnlH50TRE0nW0zO6+ls9hP2/j49P0BqC050ndbUnXFtANOlDtOMNM0lLg//qXXtkbBh28NK6L2PxPNddzPZPZlpMQupvRz0NE41RJzD/e++xdfDp7h371OU56+wvz3E9uMtnL04hM9LTv3pNGn+16TIcStHPjkH6nO2+4QRzRwW4YkjDVElSXU2Ej/rXoZzN2FtCafsAMugIztU83iN8xJ5RXhhIoEOfbcjuIYADLzm5aPX8x9moYRZBtm/BZzmRmRbr0zAcwj0BbVUhoNQoD1XYxIUr0aoiW6tyb9TZYRIN4BKnqKmZ1avD28yxGkfZSOaCuH6Rv3+ZVuY9vwLwpbeClidNjWqizM0xTF6yJGqjZskLq795Mwo8FpoaNM8EZs1gfbtpwya6bh1O9q9KkX7a4PhqL2q7AECw5qywB8/fI+Dh79JIFmWOHn5AuJI71jDgD3bEV2aAT/7xcz7XXn7/5BRsI92pCI0NH51zgwAowAAD1ULBgSqtsQF4uSTdZIO3wInZK3bUAGj1qRZYXYaubQ9V4CLiSajJEhGOjLpNUlUt6quLjG8R7Q67DqCuFzts5G0rlLvMiUi3qEYj0V1fjCHCbWlEqVd7GP4GcA21ORbT21mdIO+4ueXv8LEIj2BmDVqqNI34fUujK8A2k9Fcs00lu44jkzP1U4Pvq5nYbfIYekV6LrUY4BQXei+Zvfr1Vq/XKsDNPgb2g44TwBckmHr5TF+3Rnio823kDUljysBZ5Zt2Bzs/ADvfLCJ996/i8P9+yBdY9Ntl4hElDMJx5sB/t45xfDBNt64syHha6LLNaXqbaQW1pV43SsoQb7yVAQ0TkQe80J2qjUpmcegnNQYjvZwmB/jyeEWbt9ax/rym1gbrLJI4DIWuPUvjcXtgZ7dnAyKomib1AYmyE1Q7BRI1Oekiuu2rUW6/i1rRHR+8coBcfnfoZrd2upehyJ0LpNaFYZWIDzMq1U7P1LWeYWc46yzeoTdw108Gj7B3os9HF+coLBS8U8XqF2tZCCtKMZAkQgTmkh3JIAbSZ4mgq7ie0/OEdxSqsJ7IQdC5zmT52NuNY+zRKvZwoShmLoscxXfkyQ7MEvlw0kV39o+vweBrY2XuaG/81IK2elc195ek+HAPG6LvmLlF9T5hQUisRSJpdOLnucEINLv073QtagwTcXBSSmsAdrjQXeOwX5ud9bZ1riPCqzMEFA3tZr0q7iiQoVUK/maxtCU/xlH40lighXv94TYY1RYI0thut9YWhLo3rtOYaHtXO4lOG9J/k7nHmkTlGWJfwAAAP//1F3JbxtVHP5msR07pimlhfQQEBEVp7SqeuHEiQNHxJkT4gAH/iAk/poKToBEpSAqhJQ03dw0Ca2X2LO9h37bzBtbFongwrvGY0/mLfNbviVlPoXyC/hiqqAop9wFHWWuXijsQoQBqxUOsFj7iGK8BaoihhMk/uZZHgmPnZPdsknAxb/QMaTBklr+3kAx0eDm0qGOags855YEMbQjHZvugMLSO2RRpVWXRCdevOqT+nqGv8e+pQ/AiZlr1Pgj41WrLSHdswmV2OetolQol8MEBGFej9zoiOpqTbtLH1ALgqTNEi3RSRgI4qEqa30EG5Kgm6BgOJdOCybie8kLIRH7OzJk2VCvSSjEpKPVNBu1XQcl70sHT6nVPM/FhB6/eOn/NX0HG3YQ8HwEtIawukpFAlJ17aZD5K7A4NoW8y5zgsbD7NdCRrIUIqhoMD6dMkz49t3b2L31ASvvD3d2gBeHyAkFMD7G5uRN5uPfubOHr7/9BvF33+P+/R/5O1k7UAs9FARS9bnGM2iMw4dwRbA14MZ2D198+RU+/exzdIdbyLMSA5q312Ok53Ox7aDDrLfB9/L85QkevzyWDlBYDbcXhz7uwXCTRYqKmuOj1TyFCjirxkex0hKaIpa5AYTrxjr+4Qj3OO3bhakf6yFCzhWz2TniWNAGTos97EXaEaVqSXiiFkWF14h67fOeYEqJJiSlw/zsFU4PRihf5wLTD7q9KlXIsH0S+r95axdvv/cu+v1NCZR8zGgNl6QYU+d/+gJ/jo4wz2YcGHOjmyqneYXueQb/+AT5/gGe/fALqkcjlE+OEWcZelzUocRrgHThUS0EWk+KsJ6754UgfkjMkWxwWPBQbJzyOanhA11Syi8drnQGcBsx0n4M14vEM5oh/4msVgsibA94sQpDMAcN9tmY66bErDoA6u9aeuk11U+bOf2UWIlsVaTa+BT/VWotJpKJigDgqpVCselvief5Mc46C6uxYcEUaTlj7m/sVwNTu911aWYd8CwFkOEKDGOYutPvG8hjeGmqtp/8zqyAPx78hkcPf2eILf07pBkRlVWdRFdLXbE18dKlRkgDgCGVGOLtGEbOXWw07hytQYFgYlzahGHspv7v1KKKO6N6TVZIB5x9yyO/+kD+B6NJIFxdwBD+szYNtOXrze2A1nLsGlSEF6ZupR7kAv3V1cIF/7Q5/9VGziBVkarRW+Jpa5GKUVRQKfNzmgVBHZnUxj/QLGwJVVgv4l5v41pxXC60fbJOfFxQbw2VYX4ywsIKtU4KRN5bgUHfgZdUkv93I1Zkh+PzwFAeXh2cVp+DQueR6NzZO16eRLtj3TyUWuGez1oprmRFiaKSoke6JCxc/57z7RjQ6JMaQ/H7SeMzbrAkkj5S8k8BctrvcCxEcUmlVFFbq9Bjs8wWcgYk4pzU6xhCpZl4s2oT9KfiPKhDWAlqkt+hK8/rYpxuobaglVDWkM7/aDTx5vJ8tp0L6J1BHP2pS7B/cISTD/cwpMSr7mbqId5JcP3mNvbu3cWDn39FcTbl2zXKQBQ4/tCSKVSo8+FP+/jok4/RudIVbnos2D/WmfRigxdHZaN0XopYN3WpxbWq115bccV7ZlJNMf5rgqdnT3Djjet4/50d7G7vYpEssJUSpaPgYgrT3jgp9Ir68BdyYrEY7mJYrcsgunxwPq1fK9Y8oIYi74dYci56XjlyLDhKKjFHhueLUxw+O8Lh0wOMXo0wySaY5RNcfesqi/ASqq0/7GqCLHkFWYYzeroF8k3q5tCybe66kbbs5r26UIhmFjnEeS2kOxOtSxpFfdkH1nh1SplsnwuhDbt9rqW7VBcDKaeVewlRHkYXl8+SCLbEspRIs8NaJIr+cr26tKlegX2X/Y5pqSUaA4ujQHN+U65lKHlDn1OOxecS/R677ImIqSDuZd0Ycp6KC6bhRXkoIZbEvl/t+TkPlTyX9AqiKMbfAAAA///EXVtvE0cYPbuz9sZOqASqCaKBAEKISlWl/pI+VVXVPlR96K/krVweqrYSKpXa9AIIIqzEwYTEsXe9u+i7zY696wQkKuYlsmXH9s7szHc5l4T4apSg0Yso8Bc+Q8HCDvqtfOc30U69dbKkq7G46Qi/IvFBv1M+uanhBwagfhNm2zqF7fP75qUXtzMVfuLuR6r0yAJqvtMYHiqnD6mMCKe5o9Zm2eSEv6MJQdikFYH9Ek+eMxGUugtPE0PFhEqhJjxprv6BxttgTgldP1Ldd7Hv5jP9AfI7w+dt8qEcl9MGcf/tYLPfQN+L4ddlbahjwn5ZsKDB7z/SxZjygsmnNRabN9Oktnk03ojc5PNGIgnVEiCOstP1xLQCVaTnQoOKM9p8LwcvofIlVdzWWDEXXJUtkw6u3rqO9QsbKPeOfE8m7IHMShHoo1/x6PeH+OPXe7ixPQCiPrC+gd61Kxj9M0F58grJ3i7ScxtAP8VnX3yKb3/8jrmo93/6Wa+Z+PfKfdAMDOkApsuzdeM8vv7+B3z51Tf4ZPu6rMjsmDumxeuXcIQCiTucGFQEYUymePziOQ4xbXRvllfxBYKkU9U1qqGVkYpnArWvsue7Ls2JL7i55iHjNz+1JzFUjQh8xozcMX2Pfl8cPHJyirCgXO8TDqQUBdAoLujeIYKdovxPebGbZHj1bMhCP/NJzpBYo1koroU7L7TLUNd6a/s2Bhe3sL62IQ0oqoq6BGPMMS5neDEa4WDvgJ0UuimVsRL0ky4Ssnd5eYjh3V/w/M4DzJ8O0TuaIqVKLIReMaUiNXWXZjmy4yl6nRgxXYtEuOV2T1klnSFnZjMG4Z2RonXSTRH31xGnPe6KEEzZZs0glQ3O5crRfoB6j9iiXCgArBSGagvg6OAgfYM04c4yK9aT1hPtXU6U07jL6ESlllxZKBgj+J8r4R0J8J759UCwBjTAbYUP6ouoSLfWdUxPckYXUAFYViVuyZT/d4i0P5hj5TnXAG3u+HDS4TiTcKcEfgbnnuWZmEhS8VALSY21cWqw9aHoAnVnc/ExglWjnsSl7ffvzl8lxeO8PNsNgc4bqR1IEd8GB0Zwb5V4fYhRhHasK2Kc5YLU+x01ILptWDNEAurGZiMYCRNB5g6fnBXRW9pZVopWpL8UPzAPVjUEzkoyhGdbaz6EelJGT/1AkQcAACAASURBVMxOJmI3TGuJKKcTcWRihyRKJE382P6nJvFcnlKLMdJtqnRVL/fTfbMqEsqAnZvGpX+XWZNiimoQ6dUJR5sG1lmWgMv7oS2jtkJpZYhZZaWVHDdG/BlZ7vBo5zH++vwptq7e1NaMWbNIpjC4tImbt29h88ol7I92BBWD+vOWsE383O7f/+FwuI+18wNM4gK5cv4pNoi1A14VtT4S+7r79SZNunCYjZvELHSOnmBcDPHbkxH+3N3B5keXsX35Gj4+NwCRAwgRIK0wcQ4QmkDcci4FxfGF52uq5QJiLpB/bCoNrR6VakUFk9KYTy8Aym5eXUVPFYwMpCLKFDn252M8G+/j4ZN/MRzvYTw+YK2GrJwyTD4lQcbZMSP9BFklCWhZzaSTH8856e31U//ZbsmK3dPDTQMguF8jpQ4RRYQaKtTNJ0s7o5zaEMezohHHGoc+Tpxqk1UqXB/oeETRwj1SBY5sfnac5CksOB8K6lnRVfMRe2w8fA/RJwwF6XSp7lZW5Exba7W71PyIhlj4UZ5MsaMijDXGpDON6fQrzkPSU6LPY5t+i/3ZSaOAU0R3XXCgQoAiEBghLpaZTIvqOLwh7kp64yii8Nc13bPYE0d4wQYrtrCIBEJIgBBIcOaEEBfEr+TAjUVwQeLKIQgfiLBD4hBiPBN7bI/H093V6G3VNYuFgwKpixeNprura3vvfUtqiv9Ueah9FGt7PmfWX3ropA5L2Q+xoS9lkhNjQWjgKlDGQWEHFsxbRd+CCygiwMRyGNKcNYKdA/vQU4A8LgIE3wZZooOBrCAATGR/Df5gnzUleksCWCfZc4Vq+1QWmbIpZrPAA9Ah8P1tYHLywiXqjODC81vGij5rA8yC+8pXAcnAC1NVBlEJ6yeDlMxqLuj9qgo8e68Xk/BugYHUfVxEPG5rZnchLgCSRBBojWOhKnoHZDnWDMIWOW+UiXfKZ46uSRMgF6iKif5x0K88GtZeKGcnYdzqd6DOAYW4MLRaNxiet/zyMla21tEbDJEQ2Zree2UMJln0SuUQ7v/+GD989y3effsNrG7sMG2hsbaO9OQJ3HEPp4cH8IsddNoNtLtdvPfh+1haWcH2F1/i66++waOHPSwa0SCq0Jeu/vnOB2/i088/w0cff4KXbu0gL0o0qwILrgBOexj3+6jOzuBbJCblkDaXWVRw7/FDnKimgNm6coAw1S3dxUXxQ8UUtzLAW6UanajVh40rG6cG7+eAkZRW21mA6xu6RTLmoprabqYsemWLIi36pMXBqvOa/DNev1MBJU7iKQpgxvpPfVlHbO+Zo5M20SyAvD9Ab/8AxeBcKl6msTT1lPT3+uYWNl55FVl3SeCP3mSzBIB83O9hcPAHGv0B1rpN5AQFbGe4kSdoDC7x6KddPPj+R+S7e1httNHxCVrqqZ57x/OuIqGvopRNLWvxxkLcMS+Ad+G+62ZmdBC2W6TgM2tx8M/wZBLi5MQBzd8knAifljs4MSeiTjEBxzpZicA3vao8HA4FVjHiNL54zxLKhpObDamUMqySn1fF1QirWRqvz/F8j9/N/9nmwX3zy5LdNaDiq8NcYPVM10ncf3aX/goLPlurXbRmx62KBGSrK7JB8SHexJBYy2bm8/7alZZ53/1cm1XGaeyZBaa/XjrJB7s0LxpJVU2OnaY3/dOUmz8nrXr5/Puqiu7mkoTr9P8WPlw/ofjsG++BOg+SeZ7/SRJsZvGvx563errYDOtaxFZbDPv1Ey4AiFAAkpSevWaMtmJ7Y1LpvhiJrlBaFyAKpTLGyRW2EGQqnMNwfCawcz0bBexWXJmPxpAgMQuBEicVn1PSZB4E385Ic/SNqjqhgupZp1+v1wQJK4Vw78Sy1rsM/bMhdg/u462tTaToYAFOizOF7ExZAxvbt3D79dfw8527qMaSb7ZmCMCAtiB675MR9n/5FTvbS/xumHKqiBNfGX1XTgI+oivTDbKVtwWUut6kqjnG5+MsRXFRIml4XCY5BhdHODw7xm+H9/HiC6tYW1jG9vImbrZvotvuIiN0bNLhgoRTrRa+Z6MDaNXfz0l7xtgOpyAKQQU9fYLWaFc1+iNyLYk5/SqWOKpIM+gcw2qMk9EJ7v31AHt/3sPR8BRHo1OMKSjMStFcylq4JFu8hUwt+cjerqOw8TZXmFMtNhbskKYq9cEe3pJQV+9t8ZrLNPPSq69/GRCkHPSTywYVKRS9bPPWnOpyRZvTd9A5NQ58oTFSpfbyfG3vAhqaq98qFEhntvjeYi0y+53OeuZUQHHs8PxcULKKbpdgWwQD+WTKy9LkGSBW5WdLbdaUi1BPOn5N48RiP7Gkr4ulVNwQmoQJHkpx1US8xfVLx6TGz1aYNitAXsOSBH8DAAD//8xdSW8cRRh9Xd0z4x7bGcbEduKEkAuCBCsIDjkgQAYp4sBf5ZIDUg5I8AOIHAlBQGwJRrEN8ZJMvPVW6Nu6asZLMFxoKRol8bRrr29533tZqjKAJvVlL6QJt86a9mCrpa8a+fTSjhK+WY2GRWPIaaFJoRooboBmfifh7AZJNvIwZjPM0DrPFoQwaQNfhHdImQKYF8BqHNCEIEC8EJvo9xKkGoQuoEVUVzy5gfxQf64REgphcpS2MDqiKlt9f+EJkInlMgRztlQP3aAZMTkfZ8MzqZ+xcgGpgQ/s7ezI6yVmgQD7bPe8GZpZ1qIPuEzCS1TaGTeAE8Z1M65cVBvila2fGTmpT4S8cDUfkmUhbaNDmIj67DvURiEq9Bp1SlqiRZOUTFSykT5ZXYAIPjCZwfY6Bg1zBUCDKIG1PtS3Uv10TbJsCTBYmsPy7Vv44sEv6HHtXTDEzQ6sjXPRA19/9Q0+WbmPD1amkU/PwvX6yBeWUFeHwGgX6e4GfJ7B5dfRmZ3D27ffw+C1K3jr/Xdw7+5d1qN98XSbE/pO+GRQZMCVN6/h488+xcqdO7h5YxmXhpeA0rGD2qX1d7iH5q91HGysIy8LTE330WRM6IDtrWf49tHPXEc6eYX7JjIkPDA/v9iuZWZGZ/IQUl4QJYKmESISyuK34zthFdqhI4aKjxQd/NhhKdFxCUZJFlVax4eLav2nCIciI1t0/9b6/5PrlPadQZaI0yElSNpeicMnTzH6fQPFaJ8RGymCrWbZlIog9x5YuDDA3NVryC++ymhfykpThv7IF9gf7eC31VVsP/we9fYW0tkpLF6/itmpAfLaY+fhGn79/B6Sn9YwXzvkqNGjGjUTYG6AmU4Pz8uC0Q3i+BPHrWezhWvnKpW2oTZ5r9wEYAIuyeyTAZQxuVuW9wGqAyeN6zTTGsiA0LAxaY03Z3N0XPPVt6YvIrUVz/AtrmnFGT4KrRMygrodyTgnajDSRaCZ5KoUC4yzJKlcSrU37H3SehfJKZKP7Ryf5YREkGqvzsKYo3DGd9042vTYj/KcKG47sT0SSTrx3PlzMied4wnna+T026WvDr5zBk8Xo4CDiZlrx1YygVL2pvlS6ZsjiaRCMxulygiGsy6xQXyJA3hep6uZ8OLcP2Al/y8Pj4+XACUZOSe3/3gnJeuSgYA7jDhUdvWmKpSgTPZAEtdW68NaycRVw3xDxiVSoXNCP/5t0O60Z3I43UtStHFGNPtfhCT08YHEyluizUUs+dZRJtFTe4/udh8Y7zNN8Mg7klb+9qSnjgx6sL0oDgIFXkPJW7BD7Dl1/gy9RsgQlbYG2yC1BAVYzYqpU3G4f8D8U7bHLXtHiBzJ1rlWAZZvDO6CIQeDYPAxnX8aq7EF0UT/LjXCvtHvRqV8XD98SrdOQgGMd/ukEPu4Tru+qf17MsFFYyTE7Ox6CWQQt9WorPHg8SN89O4yhvmMEGXjiDPnHpIgm1+6jDdu3sBg8CX2tg7C3tSSxkzP70z5H6oC+HH1O7z+4S2kU93oLHDt9yiTnwjVJpqmHOMaM0b2INVNXEzC+l4S4jnrixPmiDKny+tqv3mOx1u7WPsT+GE9RzedwvDCEAvDRVx85TIG+RAzGKCPLv/pqHQxB8TIoUwkIZIo2Xat91CrAJAIYTivaZUylHr6hCUR48c03O3uJ2S219JZb3eGCzjYion8hCC98DVeVCU2d7ax+WwTf2w+4c+jmmrrj+A6KZeV9Zy0odaCjF5fxoxJ1hnJexAX8zEyhkwIIlh0UeIJuke7TtYvs9/XYX0b+abZiW0QZ2L98u8u6zY5aw8jj+nMZqWcsD7N8aaEZGUBcy0lSHROxmzdCN5vhJIk7073wfR0X6H2RAheMQcYl8mTLDqFfBSFbmvKSN5tvVkZedhPwem3wD/7VSqZbnZf3C7rFyfyMkEDUHbfkPJW/m3vtDIFSbwSNwr5XISSl/tUFLxkPCXoIOXiiUvwNwAAAP//1F1rbxtVED3Xu47fSuo4EaSEh1NAigR84BMSP4D/CeKPQIUqgZAoQmqboNLW1E0aEjvGtb27XjRzZ+6ON44EUj6ElaIojtb7uHtn78w5c06cqyeiScrZ61C99Uv9FMVAFQNLFRRrj8DJqByQvYyleqQ0B8C6CVRWgpINYGqD5+TCsllmVBq9CiMJx4Tjlj3O9cVQKjqkie/3yIRxoAOn16csA+69IHpYInT+NAnHVgcB7WtTpN8i3bQveURqtYUHJ/IqlBwA0izAez44mf4SYk4gCte0NHY19l4thUmhFSqYIO6th4wIRq6TwgWthlhsH3lCRhRgqr4KxVZW/nt8tc3rBHBrgaHWrCQs4iQBM5FdSCAq3rYwm4cxps/IAsqVH3yrWpl5+7ilKEK32h0cHH6ETreJ9Gxq3ABWezP1Tk1mwDdff4vtzTY++exTxI1t1DpbyO/0mDWST//GZPCU0fx4b4nGzh76B3extfMV+vc+wG8//oJnx7/j5YsBUkocm3Xsf3wPn3/5BQ4OD9Hb3UMjbvALMKbxpSPPRsheHGH06CE2Jheoki8oqeVs1KiBECdnr/HsdMi+9Zk93zXv7WarhXq9hYipqgvpI9VxVsJ8tjJvIp1/JjlxJuGAVFghC3C959oiY/v4mVLHioy+uMPHl1aVKC4KZMxWIb2IuLpyLiyYRM8nV3gTZNMElcsUo+dDjAZD799u8DY7dlxcixzavTvodLf8edNzm84xnYxxejrE9z98hwf37+P48WPMiMGw2Ub+/jsY9TaRzxI8f/AT5g+PsJM41KmCS3ZDorq9FCTNCZLKlEyabyS6mFALwCpKG3BHQ01Pl4LYsIJh7AXdouK+2zmoApx2C+MhY+pgragEOSgt9qLYi+q4kOqqUsDVB4gpxBUnSX/s0X+FWVTAMfLZdhZSUBdEi1wchV7TTEbpP9FWbyB/uk5F+LrPQxy4JWi3jp9zBqGxft75Kl5kY6p6IVdExPX/1v//bzYn4IJSsRHeA+up4nm++gzqPPEWgjS7SxZSNtHiNU3J0eYKBfd2oP+3cWP2BccLb5OVllrSbnKriFhZbmKOFtdUuwp2vXddsWoN+0rnWJYWvb8pt5zGoRDF6GSSMgMO0m6pqJsCRfzOJAE7J17/aw5fcSXLaPNeLgomBW6c59kVZu26LZJAfhMe9nZ97EpUPO2b5sQ/FycZux+vz3KkcYSjV6c4OnmN/nvbaLKilGfrKTtz8+1d7Pf3sXd3F4/O/vAF0YB4+GvyP96SkyR4Bk+e4nJ4ju7uu9ziydqn4W6V18TCBrgmULIttrACSJg4z4RBKrG1WvU6Xk7Ew8+TCyZf/jkY4ufjX1GPm6jFLWy1u+g1u/jwrT7acQOdVgvNao0ZjnPEqLEKjQqSRkEXU5/p4AIhZxscBxxMcwCxflIPtkmBbKGxreL3mWHu2Yh5itTlmC7muLgc49VfJzifjPFydIaLN5cYzycYzyaI6hVeCkQ1f4+5kKyuPCixCda0JjDqLWryvA4UNrMy3pLgAuK/heYQzS8qzLyZToX2fnVsrOMc5VDKTFcGHB830p53X0TYYB0Cn28uFqlY2Ht0n4QDfZ4zDwxvFXYPQDC3PBZrYe3l9+fjk34C2KgwwP8zIJvmOYrS67WqVbquiYvnsgDO9G/7W5kKochpilcKvms+TZsykTQW+XMqxkvbJkgTinT9lMGuAu0MZqcJ/gEAAP//3F1LbxtVGD0zd8atnTgvqmwQBEQFQgKVrtjxb2HPlj3qAiEiASqhUhJoS5CcpLGpx+N5ou81vh5PTB0hIXGlqtnYnsedufc733nw3eNIDTXLMydx6xRn2p1lrU0tXV+nFAVaoNPZXNzBudvb5yKBDtIuJrmB+kZz8Ip//+J0oZZGVTADPXZfVPSINECSO99rCm+f+uWjraaTtkKHX0aWm67nu1S0uLiJ2WPUTWMD7Rz44mWCNFpRL46kokNpuvYdmxdmUSjtgyUOYdjQMgJFl6moMnoK0SMNGGijtLYRCixyrTWp+FVoJjjexLB7256cdCwcg0OdWtXNMRXfaDCKKBlzQxz7gyXdvvk28MNBAI3eB3uo32SYNwAXOoEEJBVqtJhOc7z/8UN8+vgRfvjmSeO+a9OpsBgpCJV5WgM/Pv0TX3/5FQ56MQ4//ATD4R4wfIA8yeGKG7jJFPnpKYJZipI69wcPsD98C48++xwPP3rMhn30UqVO6u7+HnaHOzjY22N9FTuKkg6IHPuDDOX1Jco/fkf+7BjV+VOEk9dslJfNU0Rb23yM58/PcT0TJ8+y3RTAYnGr1XG/+QfNWW0BMIx+enN83WCZCoFQZdFsfG57/nxkV+ZDzTpOu9/M2vEWq1BzUG/7PjqnOIxQJq8xOnuO2fWYiDiM3ZdqbmOxXQYcZ2WNeTbF1cUFTo6PMb4aYXTxEmfPzvDLTz/j9OQE41c3jSt+GoW4fPK9kA5pIiQpdipgoMfsOP5L50stqs3ajLzpd4nVQPnQdYEydp0Fl3WaOZmNgEmOR6JVNVZHdzXbay2g1k1ZN9bRP+1eRZxRS/4hWec2Z6WgocWVz0Woq2xyye11x3gAdQFKo54EAhi4QDPWe0SRjVgFkHsJBovjWX8+m47AvtPrNv0bxn3/1fAL/Vpdz8XzTkyNDFzxzbvZJVw3RBF1WSLnrZcdHgAbjHaH/y6f3ZQVILTIakWgInRR0YU7TcqAvdNWf73zu8NbEnbtWeOCLRD1LteOLDlYlqH5G+7KBM52rP9DwOVOg8xFNfaV30GRW0gZN6z+Oz0A3lDKwnsZNu4LuRANTAag78w2+609fLDbmJ1GY3ZRBx2/kpgz2jjzWldWKrkq5e+mM3/H67pyfJs9n0GH+d8/sQDW//4y8LAoWG77ABnNSmOJ5scoSXDy4iW+OPpAnecrzcEQkNr1Irz93hGOjt7Br8e/LYgiypqIwoibBVws17KKTi4nmIxe4bB4F/17Meau4rVIynzHLJraAPQgsJ3v0v7FhkmPA43JTisDVWVdFAPWGoWTdsRgcB9FliIntmlP9rVJeoO/ri7xYhTiu5NveV9GnfmoDrA72MKwP8TB9g62BwPs7x+iF9/HVr/P8cLkiUWskZhdiiIOIAw5gtBvNHgAMO9/S4UIBJzPkWGWpkjyGXf0xxRtOLnBOJkiyeeYzlNMZlPM5gkKV7C/DzWu4ojiMGMGCnJOsSjY6LrxI6hFXFAbkxlld1Sh1om2D3TtBCNv0D6FfMcqLJqm/ve0wblA/T0aE7yiJSmtpAalfTBL0amo1XpTpNRehHltsg+3UvPY3JbEq0KiydUnjRne9HluCBOTIW5MB32nfQb/NPHN9Pusw9ffo/mVeTGGdu42/4QRsJCLM2P+nkBmixpPJAV+goIV/3a9fMaB1fLGToy8JjL9z51/i5kPQvwNAAD//+Rdy24cRRQ9VdU9bY89VuygREFeIbFBYsWKNXs+gM9C/AofkFUUKSsSRSIgCynGIEJEMo/0jPtR0X111bRnFGQEG2rjh3pmeurV954695wi3wwFVZWbDazQL1+eOyV2w+m9Xes0SbP36Af7gkQftoSdOjrRcFJSu+1Nvr1xCYIjiS373GdoCzQgseTZPPJzEMANtLJUg0NJKU2WlulfQpufhMnw2QMLQH/SfRPlI1H+ZXIQKMCCaS6h0IbiGGhA/UVWEVYCYCwBrw8qGax2QGdskrD4ljEossEWgcZmuC6JTaVal7GQ0nhxQf0zDaniIeNiLnEAIOCBvCXt2l7V3knshT0kgx9e62ParHgMWllIVifOwlVaHz5+sEBBgTF6bUEFLaaSKT9iG6Zrkceq+ugIX3z1JX54/ATdohFLpFF0aTY8vqS64A4PH/2Ms9Pv8fU3Mxx9ErgUIBzdQUGidoT6LRZori/QzeeYfHyO8jzi5PQ+DmczzE7vMu1fUNIAMjSseiKdRUWwyXbmGs1vv6K7vET94jncLz+i+PMVyk2En3oWmCsoq12scfHTBWoKXIMKBGctoa/yebTRE+WdSzEK6lOtO+ul5j5mp4IUFrFufNOLeEqnyHK29xVESQ+kJCqn8zafhjHhOqIum9NCm5MNGay83xqAxfNEFcvV3pFZM0HsGUk9mXQ7aBM6cBNMyGZr3eL11Qp/vLjC+q+ec9NWKXJRqfWWFFlS/vzpM7z69jvMNxus6znevX2Dhrz8VzWmBCpAxC5LWi8x4jhI8trpSc4h0bf6JCyUgiY5bWjsM70wAMgZom8r9IRWs3hYt/eEaxg/FceU9V1wbaTZMyFDg8cuCbdpxgDY2dxIrVI9/oXm7+AapdvSvQXhDnSW+ECZDMwakL6I5RRtqOQh5LYt/4aP2PcdRipXHxLgG5S/s1Oh2yb/23Zc/2JT1V/rG6fKxL0zGnSmT+J0PFw/lGhgoAv3WgMr8J8BH6WfKE3em8/d3u8yZls4taHK60xjs7tD8gAi/zuNn0+ngtn3unUbJYC0LoROuR0Ab90CUt99qPH9exFF5ffzyvCxU1aIa4ZR1KP2vIk2jt3U/s+tH80tAjtjqODKA3T/ECHxdkKsJU1GLbffc5f/qNZ3cKRZ0yqzKaHou5L/cdyRA9QcM0ZofBu3Tv6psRUs1TlrrHIwnaJerUS8Tt1YxrT+/3bayFwOmbNP2mP7GwD03227ym74wG8PGG7mJG3wWHbiBvD7529x7+Ts5uxwwPHpDA/OH+DoBKgX2R4tgYTkIVpqSBT5ZhPx+uUVPq0/4wSpiWITzIT1kQCoUKo7iIdTKimKg9q7xNMM/ETRVaGSStUq5GcrlzVojfW6XmLKrlhTfi25AE1nB3wNxbrVWSU6Xm3H9fJvEDGv57hcvuTbIIvTwBGQWMORLTaLjhclSldhVp1wiQHF9sYU3uouorU3LceBBFQtl0vOieheNu0Gq26FxnXKnoxM+6cwk/9T9Tg8rrC5rtH7ay4vICtOz3Nfn0HSabL+QlRWqcztXc9O1lQgS3c9cBpYOLrOSo3fbY8m1gytp0Jzhn1NrNRNM0oOXGUdqoOZ5l3moiYe/w0Dx1bOauOLjFEgVudyPeVxwftB14N+LhYLZvgwc8Tq77NVTP+n/mYaPQvDi4Co5a+W//Frs4NZLtvjubm7xOYGI0ljbbFYlz40/QrWv1NRd7Y21HyQGBCcO2YHsJR3Jx2BFHea/h0Lz0cRVC3LEu8BAAD//7xdy24cRRQ91dWPmbEchUTZIBkBEmGLxJafgAX/xzewYs0GCSkLVoCSQHgoQbFxEjOeflahe+6t6p4ZjBdIWIoUK864p6e66t5zz6PUG2zTZZcmVIEGVkovmBRpcwuMSiQC9sHrBSiKGg/oHaSETANGa1ZdkfJL9ZCf4jHJJB55BBS5MS/ME0BBhZIPf7/Qb6UPL4EAvCHZBV81+tT42mEyWnNDIz2vOJg07jLd1xiqAq24MEvtTIf0kCNv+A4slm3X7UzPpvRfeTCH0JMZQXO9cs4pVaRIgRACAoXLpoapGUvIFKUT61WmWfO1JHZFck4ziiMHV6efUfQ0VZL8TV1AA+rV5ggNTpNf3sOkPRpi1ucpQiSLqETlNec6LeaCef0ay5TGoOoKrvokyQzlZNhpXBCbVhokCoOgR7OqZ8MKpzQvZ4aFiiyOfH35Grt+jpG0e9Six9ZVOPv4Azz85CP88NW3ZG8lpe1cQCia2Q+BrIAXE/DFl9+g2Hh8/tmnePvsQ/hmgyHUCBI/vetQ/nUNd9livHgNXFyiPnsH1YMzQIz4Thr0TIOoifo1wTO3dpouEd78ifHlSww/PUP/+Anw4ndUF+dYj6PFJPWIYwWcFHh1dY5fvv9Zb91B8x8XB/hg8W2Xf1ygf7VD8D1845mvGkSXZCi5oO7yR2ORPH/fFCXPWGhXHZp6hW5sCRgQkez7DMCRaWGF/Fjso/0pp9jFijT30tZLw+bYTFmsAJODr6kaTGKgJ54Psj9E9f+QaZvrHIbX1+jOX6F9/gaPv/4O17+28FNN9W2HmB0Ag8UGFTHdi4jr11s8ffQog0WF5TufGP1Svl/Zz5KsSZfAkDWz5TiZht/zmpi2YUUO9wwBSkpgfbJB2dSkBg5yeDcbTLi050F/XvWu0faQWRZUWj62s6g+uf6Ra9tbs7N/AMyb5HwA6B5hKHFqHI3ZH0wvyGxpKRbKf1Is5w2a73boW8pPNusSW/E1SBGRqck2gDQm3aEvLAVA36sYO7mT+8DmHuK25gE0HbRnN9Fe84qOS6JmAmNnJ+OwnPYumv4lWOD+98J6/rrNoVlOHJpg1hIb6dVptyhMex5z7jjvda5/xMhqxOQ6lAYCpN8iheLpeoWr3ZaTos3mDopijUCuU6lrz8WcfLJcToEAn4GAYaRJp5f7L1I3i88rxfiyV1BVJlOyJ8v10wB0teKeP/LMKqkB9bUzE8zEaCkW4HP4F88A9bWZoyOXoIHs9VNm+GE30aBV0jsWpdf+61okppN4r9AiDC36cdDZWAx794HFGaLReveJwlpTeAzChmk21EtOWwXBHDWraeqVptv7jIsjEPumlXkD8HVYD+td3QAAIABJREFUA4dbVvbhv97Wbh97dfzXJ2fRDEZlUjCPf3MPQ3XKPYLsp+iR4h2Vx3zcRNoFZo8RRjH6wMbEMZbRoTyQd0wLczjZm+miLfWTrPNCsuNn2eGh9BNpoGITfCmepc6IRhP2xgphNrfQd5lANfKZTb5WpEQHXQO77ZW95phca5Qxa1rvwxWLRJ83mV3XdzyzdHim9WhM9ZObd0jd862+TkhoTMDV/LFEc6WnR02Iuj0UCmKpWauA8tU+EHCYEnDQ5eXBzwJIcAceMAJ+UAYggH6qBak/L3EdPX58fo5nlxd4984p3uKEO+/2rBXuPriP9x6+jzt3T7G7utpfavb5Mx431SNhwm9PniLudpiEnVc7Rv8p2K37Z2a9ie+NALDmJJAI7XKsVZY1L4MpNUbzBAaC3UuCuJOd59Y/QNhvwnRue2t2ow6jZK1WDdcyZUcSo9tYz9N22u8E9QeiysAe/LYw+UirtUO1rY+AmjT4A9nInnU8/269SZoeF1XBiGSpB2EDWxlErGRYiph9JApf8TY1ZcNr46Sc/79EnAaeB1z/JozMZuFePS5k+Uv+fLtrWXckDwh5fkSSSar8pLIJuRZOnGNiSmp9JbHY8hxWpbrbF5bAkiQ1sOZdqPvJ/V4c7CUmb71eW2PrzTB7jv9bRsOn79U3bjZjl9fhELrZ6DOV9PMy4D2pM60+TdnTtF+aZXm/jOeTgtAkaYyoN9oofc8yK3cGQmhkT186LagVWNF9Ij2G2sfO9P0lYyVJZ1PiU3r9LEFaSNJTs6+y6n0jRH4O8r4SFmEDKQG1pingb+auZceNIoqern7YHk00KBoWCSggtmxHSKz4BaR8KBJ/wAIhhTUSEgISEjI4k8mA7fGj3V0V3VP3Vpc9DoSQSNTGGo/dbneXq+7jPKq0SBXlzuZmMALC99tNEl8gjKM3moBLcOKqHtQ1dxeTIfm15+wG28JKSw69ibnvvv1dKjSDyXOm2G/2Ceb1aNz8nKMFhf0Q6pGJDNn50P9eP5OQfkUuWEIqPHHe4L5IXJFir6OdQ9tt4shrCStBTGDjxhPFA4Nex1gcKNSXcR0DSS2UBLX2M2vAHDVRasXLJnuhyZOJ6FGtvSx3+CT5Y+LYuziRe3bbayKihcYB5X5LFWsyalghjZtKLC6MypqoAPnRV1n1za6H6TRQQLLr0vnKD9yXsfAhk1cqWMbxOTgKv2OsI5/ixhWWmxbN7QaffnGGXx78SEtA2YjGkuT0ujqZjgOF2xxWKpjy1dffYlQf4cv7J7jz/l1UogcgSfHqL4TFHFW3BNYt2vUK8xeXaO6+QHF6ivq9E0wmI4Qybqihkwx9DaymaM9/w/rhExR/XMA9naKaLVCtVrEi6Cq0myUwKoHZNR79NMVi3jKct0R7Xwgwhw1//813OPvsDPXpCbyIs4hwiygPh9jBpTBhqZu9irk4iodEio4sUHVoYtomiXnRMPBK89fmQr7ph8GPmt9V5q1oVvQtjkZjCvNF/QxRaZ1gEmqM2Yd3cBuPkauwXfZo5wssr5aYnV/i6c9PcPXoAle/XuDq8XMsLmf02PWKsz0IW7SAgLGNzx1EUyhkp7zvS2//q7QXQO5dEalDsoB36pbP9SFsCU2UIh8LgaJLIV1X1yBkIi0+e7RnheZEgS7nbp7/3vgneOrrDvndNGrv41Lv+FCiKpv5NSoGgv3QeWbgZ1BWvY6ldnaLiBRgoCTcOjeGb04gZA8JhKoksKfX+AAi4G2N/z/030WqUebt3x+4DT6j1BqPFrSz6iIf3QoyBpWVoEagh2VDxI6IsJpY0A3bLn2048t6yv1MRV2JLPM1i2Ty5u2qw3azxWx+TbvWlhatca87Pj6mpZk8yl4gXs+RM++jpogWnXzIuIyv6V3+qjF0jupkkfT3r+8ZdAYpcBSxE/vqF++LrA1aO3TpYPIqK0vJ+9jR83qgZLjEz33z8a5tJ9/lSAXpEBMyu+O+aFgAaOtb6PdW5X83RMF5jdCud7r+NqNyZQyvBQAmXYn2VxG2lfRtDtypqJ0RhjhJUWroTGSsT7x/ilu3niKvRj0tD+xLeUD+X4Y1K950aM0bYwq7BjbaKChaxPv1ttbPkCxs97rTGmNRmFj3oKKe4Nmfl3g4fYbPP/pEQOQqrqkxtqDxRg3u3PsQH3x8D9PHPxw0mkxlRNGJKno8//0c3WqDIhwNrwmKUtOOdrxPPYsTFuP0WvSmIUTSPRrWhDgv8vdrrKyuMiaaRoi5IKL3rgGvtY+F0K12p6UY3GonVxBcLTYpd2LBQcW/fVeic+GGFLQkoM2tmJgSFWmmD0J9KLzmXbH5J4hYOT8pZvStR2N228zHwDWNUHBt+nHuWlLoAudJjiaUYwoVK4rqRXoUfeTb7Q0Kb0Kd6O+B19UhednLOW39IETHWIkuY5Um+7vq/dbxz5ECggwwZI5R0JGQHrvngSy/GXK1SFcXUUGJm8fjCQsAzEvkmgklRAuHbBiLw4DmJUavzY9vSG07tuRIdv5mT5+vDTndfYD+Ry6+QfPtuXxeynzk8xl8f/+75t855c1WuMqQ+jnK345FVwHn8BIAAP//5F3LjtxEFD1lu9v9Us9DkyAxG0RIhhUSq3xOWPANfAJ7PoQdW7aIBRILFIQE0swElMm86Onp6bddhe6te8tlT3cgQWSDpVa3eka2u+xy3cd5ZEbgHwSl0MGLL4Cq3lP1JqcBUx4DQ0YM83WaJ6Kd7ErRPVLATiJv8sSrpuvJqVig/3/fQVgu1uFHbXroakeTLkzzBo0TdO02KEy+siGsD6heMLqQzGfvtjj5p0niG4eNxcBaPgf6nipVWpmhaiH5NVIXW4sW9E6Ts9/v82ffcXFBM8F7pfvfvZIbRH3ZdYw0qaZjELxauTKtyK9fizPs6y4CLrrRMfUGQ5gwqneAMEb0TNIb3BcuZKwalyC2fYsLAUpJYB6PiHZwESeamNsge7XroRxPgdjekZhe6Vhl9sNPj/Do6Sf49dsfkC6WyApT80lVKZhU6ADULTqdAV9/8z2syfH5Z8+QHzykWADp1RWWk0tkVJVcrJDNp3CTCcrxDZLdXZS7A3T39xgFUJYeamOXM9jLF7DXlzAXI+TLAnY0QS4BB1f/Si9+l7o5ZucXeDUaYzy3AaTWDJ6DaDkVny1w9tNLfPXFlxi+/5B5XFk3Zy7ZTt7linbvYID2MMdgbwf5oINWjzpbKfq7Qxaza+3vcCBPi7QtPHeROx2JVyVXyFeMyE08Yparnd1OzycTlJSkPhRrE+0n9X8n9VSC4mM5RUFJxfk1itsZzk5/x/UflxifjXB7NcHo4gbTccF5D9MZCH2SZcFdIHDfG883FfMxcek0nuOvSbqTYNXjg5AWd6hkF4xGMhw00avd7aDVyUVxlSBrBUOp7uuSy3EFdqn2iBsLGP/BRnOKFKnpte1oHgnl09NiPkaP/CbcOtABNvlHe4E6IzUXUdWnPWQ5U2VovniSkHsn/fg4eH2bo72L4gGPJHd/2qRSxAg4K0UB3u493qxHrLCP9Zo1KHwQXb8qun7Ss5jWBSpM1XmWtvqN0mgtFYpI3EPn7VkZs1e2gcWaRUyPfzvGz89/wcnJC5wen+D2bso80lJEgQ4PD3H08RGOnhzx+4P3DjDcHyDrdwA75W6+t0DVrh8hX7YlMTakcTy/VQOAx6QenNE8o+P3ev3XjjXgveTtcoF0tUA34Tzuje4PEs01xNelmIGofyTgamjtXflg1Wh3tYl1+Z9uzohGSlXsons+GzyAa+3BmTcvAGjAzCiWYo5yMUFLJoER6zgTTR9FcvU7XeQkyEdrq12j1Tj2pnjCyLyhOQRxOCEXKOr0U3G8WNeTL7oPqRlDyQuLihUrcWCRQohQ3VBaSTKEYvV2aPt72ybe+rYtkWIiIfKM9ersvJA7jziwbOVa/qsiw99tWrgphZ5BdEXKCU5evsIdSuyxDbUXu2YNAFqNux188NFjPHryGD9+9xxpqVQdBD0e/6z0zzUyTfnz/Aa3FyMMD3cq4WwWXlSkwD8rQsa2jlZEzjl/SJNaTFy9O0FriCCwTUKs4lwVFzPvW/nT4kSmmkjBntlZvt9iUfKyUcBU9zWC/DNVeVlpe2kcHSd789Xc74tynCTBdDYLjmzggosJ1GMnwnkFoc8kCSYUgeYOZY2fr4kn+Jy364ZVcQ+7kYnYHqTxqo1OijcZik/d9NJWdpph/BXGbu91wjXHYZv4poZA9NnJOoaoyNOMybyjQbVf2mfo2os+mjq1UXHAigsHa2dFjapm0WHbFjdufVOXfsc6uMRVwn1VnsZFCUJEadFyA5UpPnawVo8FqxuN39p3QjdwzuAvAAAA///sXVtv40QU/jx2nDqkCV0KRQiJhQd2n9iHVtoHxBO88QP4pSukgsQPgBUSNyEEbCXQNslC023SpPFljM6Zc8Zjp12oeISRIjVtEjvT8fhcvkuik68n6RJOuUAk8Hf2A47TrR7jtfjq24ACQEWCbnWNgs6WJ3KoOB4b9pykpNRIEKBD/fGJQ6/VmJZXvzzCpF+RAFEgjMBFhd5O42uel1sT1HjqN16UuuisbPRV1faGVJ7FZlN6f0znO+s6dLUI4hmB/cdSsRqNRv7iJK62Ea92Ok+2ZDSWX0+vcZ9bteaUPpMedCzq1jjrRV04lac6+KpU1BZcNAEXxyMfZNEnUaPgnvAcpKL6WjMMiy5cRiUIF0YXXYi2gPD4VRGe3APYusI2XWfn6//33Z7u4LmhIgjRIlIge30Phx++j6c//IrqZIoNWQsRP5DhhA0EUXvc9FsCjf4+X+PRp5/h3r138dHHn6Bck93JAAUR89cL3jTNyiC57KNcLFDP5yiyFMl4yJxH4oGRR3C1uUJ1NkF8uUA/BwaRo2f0kh1uEbvNxXHhKeA/nU1x//AD7D+Z4MeTb5mCEnY7lMLg7WIoIImAi6cLnM8WfG9nO3DawGrX3CIgQplwdsuOQ8NX+shGuzh48wA74zEO7r6F8Wv7uPPqHaRZisE4QzpIMchSPlBBwbwo/IY2P4mVbuWyYD1bgrhTl3tzteKi1np5gXxZYD2/wp+TP3A+eYbz0xmmJ7+heL7E5dkKloAPNZCv3XnviOaBcpqJnsGBQaBjFN3A/43q9nO/nlWDQ2/Knb/Tpp2S6A59p9pB00r5IMvd/wo5amSUZKU9sXJrHEp4fWtX8Jo1SfteJfDBF3Yj/+HYsoq6xtKR9jz1rvUv64RAjkNuUW0W6JscEVUvlejYTDYn/UbnI0AEQJAFeZwhysYoCA3B6b918MobE7//znBd5BSWEF+GVIr7jPhp7BM7/0o4SDxRh2K69lmLpfm7psxcbGP+f9ygwrzWjPU6DLV24BWSSYJctOdUpPXgLCpOfv4F33z9HY6Pj/H4y68wOz1zeZAAPnKGdwKbHPj+8U/4/NEXGI9fwoP3HuDo4RGOHh7inftvY3cvQ7I7gEncfsHFIu6wtwvAdisQD0sbtoEXCRrFKgKg1yAAagm6dZ3WCHkgJeoiR1LmIGWKS++fcc2IbLC76ilYfyFTIaCKM1SG+J1LSQ6aM/3fDUCHxBfUCSSKSDJANNhHFQ9R/ovMl66HuFgiKhbo+YJLFBTwG1QAJDnnfU/iLC10vnAoys24m6cVC1nt9mk3jC3LrEumuXlCCICrDSeh3WMo5Je6qFF3v0ajk3IrjIBY/91m8B5RAcvnSyRVheFoJIgXinOkOMJx8k1l7FucXgcFYFpXhhHGh4u/6PmTyRTTiwXeGGWSqEuTiZdLguHeHhcBjFD2tZZp1b5asEWkbk/37XJjMZ89w8v1XaFQNWKhmjC6TrYI1IlQXGyUciEQaVifzNqqbKFo41jj6HYHGhJ3d4V5Q1o0r6dSEt5iIzx1y6LHKl7OCWZstrB67STN+d6THR0fv7Q+QffNWH9PiESIXATcJQGme4Qes0KT79Sie2FF38AJpNoghrc+oVStL4rVnYj7NlJXGwWMjCC6Zy/yVnQQdLWirxnpy/s8IWtW3sY1CvQ4EFAfm2NY1pyKpRkaNqeNoLSN2XaSs51iBlELaH2sVmuXbxrn208UOJ1ffS8Nbcp6dIDQyvVnPn7QlXeK+86qO5wfX+jh3IkKQi6/9Jp18l6Xr4rdu64/rScF4oEhZaJbeNBGbTjc9dh8N7dOnfOJtRX+AgAA///UXd1qJEUU/qq6e36ZIZMYJwSXjUrWvVBEvJRVLzQg+AK+gc/ii4jeeCPCeiGCoIh4txDUlWU3ohHd7E5mMjPd010t59Q51TWTQC7ECwdCWDbpVFd3VZ2f7yeIAOpk18Kv94NeeQVUEZ3giim1NStfQaGBVgIl0YTbymEO2SyMVQiCDXx4E1XgtCPNgXzibyL25fdcnbRJmkWMr3lJbUgw45/TG1bxBiP+jYoWCMUE1xQT4kpUgHSgks2k4Roa03id00SmabL2kNg+xjnmzHSkGKCLle39bNMJVw6lCj/QPNCm1+v3eGxqP6H2aogoB1oA0TlKI0FGhdjT5aug3m+xWMz5mcWVMh4zLQJn1l5YSAzF9jep5aIAX3tVBLE+RJQNnTutqi3Lpa8gOr8xKq+JbQ5Jhb72P6/wJOW0xM+P+ElgITaxEmxVHIQ+XU6w0xlh/PIBXnvnDn789AvYSeEVzJ2HivpOgqeh1MJEo68LlDj5q8Tnd7/B2x98iLbJsLz/K1Y2RUL+o6sSrSrjjJhy1GpZwHZayKYLsGw9FbuIN0R0CLr/Vcr+9o6ebUVFo4I7ZYY7z5aF5JZFDtcZ4Oabb+Ao7eOHjx6g7S58J1mCH4asq0p4qJc5roALtZy5aVadmFxNdDhwM7EUkctZjilyTO499qr25nvu/m+PR9i7+SwObh/gmf0RxjfGyIZdpDtD2G6bIfAKZ+v3eiDpGuIC17MLFIscfz8+w+zJlKvw88k5Tk9Ouat/9sdTLM7nmM9y2IqSbITvNCB+4qwbIZRcI5QjhezDBU4ZoqCCD9caV4DbJbkKPsBaxFJdC4tVWfBctE2KFnVEne/+09wu6iJcg5P2LOM9jjilLepCDvq++9PpY2YbSpDSbNTzmsa5pLVR5GvVfIaN0u+0zLX8cVyxiW9WeTXA1ICHAjxau6PtUShIbCb/KqxFRAdTTpFVC3RSeped34/T5vCycGKDeNmFm1ZQlfUwGN/A7LiPkjyP4SkPGvduUliuoyC7y6LVa4Hy/ynd4gISUXwIy9Ptw1EhVVBuppY6gPGdA+qas70VqQQTJHExAZmoWVcF8LIaQdIeRmuo2+kwWoxFihIrZ0XDdYUgm5gTXZQMiyS6j8tL/Hlyii/vfoWPP/kMPx3fZwhnyW4YHhFlBOVDBUYadFf3mwqYn13gu6+/5a/d/V289/4R3jq6g9uvvITB9pALZaRxk7ZTj0wwCOdZ/FFUmU/2NSFvQn1oQkFIolaGra2t5l0grQIK/vWNkIXHfeM8h8kvkNL54nqsxRGKUVaSKVt6jnXcfKD/zhr15CRrY7C1j+L3DpxJmCLUBKD1lTJql7o912R5/8J04errbfz7v2YYsPICe73XWNUJpoSWGOxhuPsizusubaBQf0vDbigyqtjKIx5vrQFziaqgM4Mod+cBWVSvkQAQ1gURE0fDLbT7XY4HWO8GvmGCjeeiHFzfkPF7WyW6FqwXQDRKgkqTwK5y+Cn+WS49/DprBW5xWQo1gGMeH9eqeK6iz3wcCRlvHVB8OqLQsHINwrZWiYqIyNV8ovuv10/GuOjKonVljc5ihcnDR8h2Rug+N4YjcTB6LkmyJhJ81WeziOtpBZfdajTZDdqgwrt30jywei4SZLuq8duTKR6dneHV4dirAxgS7yMMGcWkK/R39/D84S3cOjzE8b1fvJ0kbUWscZKIFoAX++OkJgce/vwAL7z7uqBgC6bn0dqvSyeaVRTje/i7Cl1DnEBUTI+TWoXqk3UhaZSVK4mHG7h3r9flfIFGoQhopQJQ4qgxNf0tRROnYoussbVSjjXx0qYCooaFvh9KQdDcSd8XFW2DWo2nhuNx+hDiOJf3er5cotftiiVewftqKd2iOGFU/bFEaF+X9hNj+LxZRc4YlDNAxYdZL6bkOIKbgJGNuxNngExoCNz4TEWzzKrOWdGIbEbNZl0jhCqHiNUxlaGV8XOoqkVo1tbBKtDnX3GXXFHktGaLYh2e72k+UuiT6dfcw9+7j61Yq04g+ESpoPFzcXizlixJv9pkUoKvwnx6DcrrvLC7z1UV/q/FAr4f1t5raBqm5QsFAbq/UXDQXIrmKLYm5P1uw1ZsDRUg11GnBGsT/AMAAP//7F3LbhxFFD1VPTOel0LshEwUiJyFYcuSFWxghZBQfg9FsGKBkNjABwS2SGFjSCALZBEMATK2sT2v7q5C91VdPRlL9hZRO3vGnn5U37n33HPO7WAteOYddZ7FWDe6d2TUCWEAyGYveLxATKwAWzWbTUgX3lA3ptJYF58Cohm+ZfQO63LZcVFhaPp+ihRGk7H3W4FsY+ryB2v9/21yyc8/N0dt6DNmyxlvYna3LzbT3ZgOTjesDAnokIBQJOaBbV5CBw2EiOpbADV3cIqeeR25ZsgcgxhVLZT+jHKfeyTw5i9XGPQlKBgLwRDMjgI2dA70HUj3rFCUjx/2KPIACip5wILKBqQhE9LIOXkAhF5mYAAfu/OJAcCB0wsYkUs1jNFRbBjN0V4+GYl71QbVpbiZ0vHMqnMMtsd44+23cPDoMZ7vP4VfVar/13uvooBglOasR3W6qnAWA67v7GBrchv/DIaIM3KMV+CgIjO7JQcptygR/RnItq7LvNPmAQ2lY2o76csjU90EWSVjmGCaIBpx1e8CO9fx3v37ePTzE3z+5Rdki8NSAL732Sg8izP2+FLSbuPrzNCDxt/4LISLXtOJgQ6QjLuoR1YeTPHr4RS/fPcEvg9MXr+BV+/dxq29XYwmN1iTt3PzJgaU3E/PcHx8gtO/p3hx8Bumh89x+Ox3zI/O8Nfhn2x9wMaJFYS6ScVKaI7Xx3Vn33xpt8Bs4eIG9/IsMfEXJrmhZaFVJzZLjz13bUJCL3YZjKBkolRadIvaS4BRr2AJQGercbu3nZkjyQmUySplZgBUqiMz/Rn7FlgcuVqKfhGdLFoAj4FBxWujcerC5LUPMgM9R04HixO48gTeTTRjjPpcxVbyF+PL5Q7RL8kDoNcboTPcRj0nFsASMGGEM3PCK53if2h5Lvhjtw/X6XOHtPYSZ/ymbp4TsCWGFVy94r+2K57K4my7jPpDZnkZ+OvUudhKJTZII68GAizZVaSL1ck5fvh+Hw8efIKvv/qGDauCTsogqN3XUaUxstbd7lvjqBxw/McLfPrxZ/j24UN8+NEHePf9d7D35h4G4z5qMuPjQsP20IaNkLrwUG6suRHJ7znh0+8wSjx7XUrUGkO09VUIBIC4mKEgw67YjPFqrmS41KhCNglzAywJ1ooC3FCS17Ar/l/NPfQcD87dCMX2HVSdMarQacWMPC5eZnE3loGcGYNibEGWnhuvXfRmL9Csdd8RqMC7i2WhyBLf9fdQrC6Y2l8xJZneR2PK6oWM66L8h93emRGp5naqU7aiLxjjMchoZJoW4K926ukc2wZ9Hjk4dplF8WBUCJhx9ONjjOdn6E1uoRi+gjAYYulq9ifJmWVtqnB4qbN92WUAPfMYXaU/E5iyhZP5Es+OjjG7N8c1PScuwtW4kLyv7uzu4u7d1/DT/lNmGS4QEwPATD9pJDeZkVJ0K09nDIgTq7TUJlbk/MrQF5+8zCS/FBNvO0fLSZF106UAbWuvo06ECCrts5fF8C0olV3yZmu+sWs91SCuqWPY/JvsJizfLZomBQE7BjyIBDuoVr1dwxQbmgKjsUilKJ8fjkbCCtM8k/e79xdKSZhB05WaqTBJd8imwDifRnlXykQ2hhYXnKum4LSmpf0tN0wJBNDrxmBDlj91GBiYpy65FPINq1oYATF5JOQ1XpH08nJ8cg8aEz1bBjSEfL+vMQIuWtYkTg0dOn81SM6d9VtSo7pdx7DReyls6ba3gjEdhClOscWuG+0LY07k9WeqL6yO1dfoGBno0eLfjieXitvKn3trYrOkhd7rHf4FAAD//+xdy24cRRQ91dXz8oxjx1ESQI7YgJxEEbtkx4ewhCzyNUgREit+gR2REBILhEB8AGLBQwgrCXaU2BDZMz3dM12N7qu6emaIJRYsECVZM7ane/pRXVX33vO4kMAVBf8U9m8ZIObu5eubp371ctG7QR4FnB3BDTRJ53MxyLVsDj3c1BEMcWAXJla6K+FTFPMiQkrSwT/tGHSjSKH/7yYNa2b9x4gBCmArUfSn718XwhAlWOHwi8CMBSNs9bElghej3gjT82mE5rR+pO2+bIDiAFrpFnzNSajIhXhdrNlDY+cqWS5BTrSZ7CUfu/GUkTxMESZF1aVFE719BSZS8QPL41/WCiDCBsKEAvCqZsgA47vYgEnnWiVCGGuN4TGtfZaXCAiDXCZJzx6gDmUeMN6/hoN372F2XuDs8AihmGndX+9Rwke1bzPo/JJIrHuXkL1+Fbiyg1AMqbDPwo2c4V4od1p9uRpnWXxRlnd1Bq88enbRyDK1nNIkmZPBnioM2XCMZlmif3WC9z64zzC5b777CvNmjowW0o1OUM4m1xAX6LGfrKrcNa13On+Ej0HvFe/Psc4G+/WWAb5kCAROT09w/P0J/O4PGOwM8NatA9y+c4fv/7OjY/z64894dvg7ZqclB/ues6XKoa/lu3o+wS1b39DXGIQm3cO8fjuf21CFyBIqQAsDTbfoXoK0lcuK+f45S/2RjkLgV/ENMG6vQqYpS5459EYjtnjqRVqKZDW4uh1WNC6soqjHTBNkRbxHRrT02gFcEwEXLq0ugH2GlT00ipqiamm2Jh/U3S/BzcsxVWo7AAAgAElEQVTpn6iLMzhfMXLGqduLwSedHivRfPgvqQc0awD04YY72Lp0GfWJTyrQF53Yf6ttshUUhE0O1x/BkZq8oncsELJtgtrmmbXfkqhDJHxm6AtDozTiTCOIJWAyGTNljCrutQUyVk3X46ggFUqC2pw+fopHn36Ghw8/wvOXUkul/tFnJBLZZGboOULnBFZPh/5/BXTZ9j1FdwyzDE9+eYqPP/wEXz76HPcfvI+7997B7mtX4P2YtUY2zqmm0r0poFEKgOPxqmEXgO3JtiTdF3MJFFyWpGuF6sB2WmS5WpxjWFNyNqyPHxusEjfPUxm2L1/HvDdBvVjX8Pgf/N8mdJn443KUg10M924wdWLQH6F0htrTH4dXIgDS+Yv6fljM4BYz0cSwhbKTYK5xiXo1IQD29tRmTFGZigJNCz1x3+lC2ATK6MmiMZ7txGqmzLDANMGLeR257qzCCV3iSqsuFLdaPMIbpswuOKihNdK/oRnRoXkxJd0zEme7P0Dx4gXqWYHRHy+R7++j2t2Bm2yxToMVk4DNbgn/vGlgpmMb8959jrNqip9+O8TZrbdxfShwds/GfAKLp7v/xps3cHDzJr794mtMQxMJNzbn0+fZplN1g44fH6EqC4SxIEBIa8BRoJWJeNyybrnqFmxz0mEpSQIOeJSmzLGJOiaI/VwSqK5Y7OYaKKeVZljFWAX/aI0r7lYtupaDZ7Zu63H/oOMQNEmbEDCadaPBsvddyi4J+6WtUSo0ov5WJbB+FzhRwoGdV5pKLgLk6f6axAKO3bl8Ig6XCHpbi2jj0DB/3uzy0sSaU7QBI4QVYWFBvbmZURxSlt3VipyrvKdtyrLSAmQWOeqsM0PCkT6Payv7nelgK8++xS9pwL9JnG9TM3SO3Vupwss+reidVuOtUJtqLnDMRokJHXPYxlyr/VbUlWKvnKMUcYlS2bXtM9QC3RNKDtl5pIVzg/wboiK9DvFYV5IJhpTlPlcH/EXe1ew2ToXR42s7cZy0KUynMwxdDD9igXgJ2PEK7JjtPAVLxFOwAwmJDVsegQUVYsQIjYQGCUFLf5PYSWxf9P1d/0w6wBLhLlq1UePY1/fe75zznZMML4qZM3jtYaeHg1yIY0V3yDk41hNr2ChPnefZNVJkMgYMSJEo5nz0elECuNArb2gKX0w1v7Pef5Pv0/67x8gXKxm8JOfQDy6SF7fTndVuWNXsVge8mHcqxXnF8Vk5luUiLDYif+/3wlTqYs99JYQsNrXefJEdkTyJlRRaAFd1KwtiyQcV9k0dFBBW1Af5hwIhZlgxRHja2MJGc5S9SvZjla+lKFYF5vM5lsuFDijHk1GaStxNNhrroKgEgdsOjEsqTQSYZIzYyb0SoILzWBW4sAXFWgDkPF0AdQxAMaTr1uI/jGbLfI61FIpQbyp2W834Xkiky3Q+w/33HuLNsz/xbLvB4vmGC3eLiG06xjKGWnuN2SNnYVAbyv4e4juvov5D+tPryiFuBOXnuEJxAGoZCpWaeu1Xg/7PiB4YlijqPp0mAFIQUM/VOMLV5SkO3n4Xx++8hUePH+Ps+gxPnz5BuS1Rs3eB67ByLhQIt7Gs0Y6fu6+l5536yIwFdCak9VII+CugvFzj++cn+OHbE9AeiAQObNZXc5QsxhixgSInYtBzaAt13b5vcO3V77e5X0ceg/K/f+waEQYCobN/DFLEyJRF8ofXj464kJjlOSclbH6/wPL6BldFETYXbGRFY4nGAC2Sk5TbINw4FZOzHVJ2YxQIPugWHOuK2AQlxXW8RH441+iWZoemOLJowX940GsJqJju7/1tDc695sU50vU14kmJOPU8xjznRSH0Ujq0bt9B208AGaHMUYqKgKvZITYuR+ZX7OswUKb+7w7e9EQJSjdFOd4DRlNuIeKrGTXozlot+EhgFMVfruCrMigpegoOXuil8qaIotEs47gmHmI0L8eR3quGTTizJEOz3ODH707w5edf4OuvvkFRinFalqWoNzKvZ8SM+YrBgITjmdpxzmOgcSHSjtUhkLYdmf8cG2MWdYWfn/yKzz75FB8/+gjvf/gBDpsHrMIiMylO0IhFQcOf27sgqzWFg4BMwe0gzFW0lmSTEcajGM60WrxJaoeZMH20qa3QrC+QNIX8LuqwUN6HtjSxsXahoAxpdqQGioFV4nBw/BDNT/exPv0F62aFCTGm+oAP4yjtsHP+Lzv8/9vDsxpohHJ6F7N7byCaHWClIKGBq3I0PVAzzBNRK2nnIGbyCKKo5O0l+y9EFF1rsG/PkVZkrfRv9qcSy8fkQN1nrl+6uQ+DSPeC5NCusvBitcQkn8q+wDkUiyUTJnGShn0MkTqJxsdy6lEtRoCkpokqrw7jfTjWrgDPEw6ixFGlCisFiVQxZjmsibvbAG79WBHHzyAapzjYn8LnObbnF2zGG90USI9fQ3z3EM3BHJtRgop7vkVhCLR9zbtUALb/ezFWcnh0Wgz0+WTSYZzjt9NLLMgYOZM0phhStDWqTiMS596DI+TzHGcXi9Cm6TvKMkr8oGu+qWvcnF9jvSgwvvMKfJygJKbaCETaF1fyc11tkU9VHq/pW1x4uTgkZQlRFmshJ15eoo71HYm00EjGbCfqf1WZmlUNro1hpj03fVkRx4Skmch1iuFuoV0rEWhycjfIoR+CmWze12ktsJ5+3otbb7n+vttjb8Wj5OsL0MXnU63bcNa4z/53z6HW+ERaU2JuM9j2/65pZaM0DoSpJSew6XTnPbptEF1TcLp+Bk7Uap6YJuPgZG8kJPkIyOd0vesTDQz3+kR0+5qXHfS+3B7Cpu2SGhKeCTWP5xqq087Bbe0EILM6RXxF7LysRrW27+5zZufFjvycONF66IkZtXo8WLuJpqf1DASVTDdQywh7AwdoPbTnu0uc8/vA4S8AAAD//7Rdy24bVRj+5ubx2OMmTkpESalSCZCoKiEEG5Y8BUt4CCQWvAOoSGXNM7BjjZCgqBKVukAIFlCUKkmTOsH22DNzzkH/5ZyZmCKoBFk0iuLakzOX83///11Sn1tN3zwQNK10Prj72lswWphE6SWxGuzRyZKGgQ0gP9HOkeN4FaEpxIkLGYt8oRD9ioAk02cjrJtGFyvSSb+8nrTn/ZPKGvletBzTbDwjtTf9D52QRBbSeqMJ37VSu1HSOZPenn0HVDdPfz99Z0aCTs/pJNBNQTRFWR/5exNNOlj5xoDq4FkLQzoWWwWwK/o31ZzRieUJrS9WIilWNFvYZ6BHvYdA3wDC/yzyJ/GTJ3dbjmREd2Ey+2BUqFkgHdMAftBH+ZjDgcT+0absKTc0Jc2piaNmKtJ40Q5qnGm3y8fI2TD9dpod7zXt9Ply47bhNetamBp5PmCGBdNo20a7XXHYcDnPlc6diuVo3k7TMVq3JKNoFRLEp4iGBm2yRHGjxO1330RWVfj290POfSV/KtsrsNk0h3X2Yn51ZWsX+bCUnXlnD5P9fVz88hBtNedrmK6XjF7svGuU5Q1JbhJPu0lD3B+/hB4GIUWakuSEvdEkBlm0Rjs/A1yNfFri9jtv48OPPsbdzz7B/R/uYdG0GMXyYMiQyfQrku725jTZa+ShVMo+ELs0JTARzxPT3kPXNywyCNjP/aiQlr1R5oRKDUQX2zKlmXvB7lkQvfsy3tNCQeJA/TCkkWeVANhNhxw64zn6dxDnkj9O5n3JAGvTqDbKojYNykmJYjzEdDplevRkssWAf3t3gvLKGGU5wu72LhIb4+zXx/jmy6+wrlYMaozP76dJBG12lCM9GQFlAVdkPMlMhwVq61BmKYpyhJyeL5V/wFhuCvUNnmazNZZVzJFt62WFrMqRlTlf884lwVQ08rf4BmC23lCgd179V78xEEAHrW2RY/+lfZTjHLPFOrzTprwhcy2Gi6cYzB5j71qMlWuwcrmCVEF/dG5NJIkO/PmJTrEhFSuZ/6yKCXYObuH0t/tIz08x5Q3ECUA0EgvXHfTmFbFRxP5Dw2Bze/6/+wv/BsP1QQk/09uK4zTJPO7EFMi3D+AmV2m8KIHTxA6yEitH0zmeW1ORRjkK9SmS5gTV4gSlzDC4+8/+ALAYMutIKMXXXt7B1f091DGTZoXemoqGmYqgiJDF0xoPvv4edz79HN/de8D7OMeE0spTSgzpSCMpuDM2fOwc1gNkcZKUwU0xBt5GnjVW+5xWWgNDPZvzWY27d77Ajw9/wgfvv4fX33gNrsxgKJ97lCHJh8w7YJDDlEd3mWZLkrl2DUNyOG4CxEjHI2xNp5hORjg9myOUly7tnSgO6wPMArY6RmoukCZSTzDLigpCY3QcmfLemI1zNv715qNsiuVaRGWB8c51jNoUxeFbWJz/jG2QjG6GxNWSr95jYIXrpa8B/RvSw/NdYf/tFf68xpz9o3vWk51YXzV74SRYUKLE3gHW2/v4g6biBQ18ok6q52xo7kgDx/Y0XB2Tg9OOUCOzC2D2CCXmsORM7jzzTl8ZSyVBz5nJAHhhZ4v3U96PMtX+mijE4eEvMpSoo4fD/97yPeQbUly7VcvANKAamEBQAMlGjNscGzmrC28A/0C7NFhdrLBcmUtrKUkZYImL4aZSgmI8Uop6KukKti9w06ELl1RRANNQCvIl+ZlvZJNPRmTg0hh5OcZkXKJ5eo7q5AnixRL26BjYnmJ08wDDmzewKIdY0GM9izvpYNjPfX2gK9cT+1/ak3pNAz489FIGtNFN9zsxao6Oz3F4dIZbW7u8jgXvg67jHY1zXH/1ALs39vDofC7MWe+ErkObRCfBVKtU8zXmT+Z48ZXrXGdwPJ5pBYzqeW65luwGc156OkilNmZn/RDdJmlXnF1PQN+JI76ngXM9GotfA7NdtIbO827i6rFFY+qwbgKUhwyKKVlEDNQblkwHcoxzgUXrJ71QXESfL42CjOsuxkHqb+a0+AgsBdPJlv2AkAeJAQfJQDNJBxiQnl+lLmLQV/OxOS87iBwKxYBRIvJG9kCIBL+QzGxTQp16vKPHL5KBmO9dkmpkpNHXRm/Ow7+uVo20DqH/y80aGpKlujNR9DiB2NinIOgUPeCJy+zpgA/jOER4+udB/5lAnxPMZjWBhn7v0wo8+PfnUiCOSLU51pGGuRq169/34oL2oVTuX5Wm0DrT+49HE17/um7VrNEKpmQvBikXyFyb11EH9gzQtZmxWlKTW/5Qkiqx1IPkGMTC1gErvTdjVTaedMxskuNu2eRapNcdC4qH+2SAaSz+BAAA///cXctu5EQUPS6722133K80QoQRzALBeljAhgVfwwaJr2E1CyT4CR4SsEFsECAQK8Rz0MCCZJJJd6dftgvdl13uziDYjqWWkihxymW76p57zz0naS+k7vjkQ/v92T7MKPtqjcciBKqKmcSuqV6nqVDIQ8E3uyn2ooQPkFXtGPD0papvYoK22JhAAp2TRPVsXNBAQqz0bu/x8Lqg0jmJdhSr4mt4GCWfH4qtUDs4QDF7v0j7NiKHPO83/oyUIeaeHy8ZOfOStSxVGTx8QoHfc1LAB64DZhFi2cREbzrrDbCYWdkAt2bOwowXC8JJ77iNN5y/Snv+G8pXJL7wnTnSBd3myGsGkUPFqsKu3OlL02vtE7UqTguc2Z1U2hMf68LUihyWTWbW7uNyuWzGY/fDGbWotnNIFlNhtjw7dJ3OlGKFvkwbPLlwZfMCUZlgMh2rAIxaylToKOymCVUPZD6mp3M4EvahOe4nwLCAp0y5qpzxIttRcXKyeXeAWs2BbkNdPFR59dIPnESiWn394CfMyyWiKEM6OsFrb76BYjrE+x/cxycffYjl9ZID9p60FwloDn3E291WR3QcuIVgUZiYh78RZEQP+oCb0x9UbtpfCL737ii87WgX0D2ie2HC304y5BTgWA9zpBuBufJv6wppL8MwHzLAn5zOMJuNMZ/PMBgS4B8iL3KMJwVGw4wp0r1+gsGwh4wAPDkxrG7w+48P8PDXn7FZLLqsBC/CRSxwp5739CEmQBlH6MUO+SDjiunaBI4Mowfg38653XusyEXCi+Aj9WRHpahDc3K1YezUbClzxE7+n37SFgAWRcEfSQDUDB8PD2IAJOsrlBcPUa0uEaVjhni8u3eQjWvP7fQex3sWUkNO6+YJ+ulLmJzfw/rbv5DvN0ix5VPc4gz61B3t/XbsBuMwIHlFXNILevcOnnv9VVyOZtgtSfVyA+x78HXMAZzYCNVszUdK3X1699cXiGvVUoiEI0BzmXDiUAKb6anD+Jkx+oWIC0pTi1TiaU2N6hhYrPHNp1/g/rvv4euvvpOo2eybVAfF3u84kv3W1e2aEUCyJi0HAwEHnUZ2xJCk4Kqs8dnHX2J3/Rhvv/MWnn/5BUTDGH2XszgXAbWqlmq/iKLJS0QBrAvWqBZoUMtDhnGR6XyHGhrtaGW/LIHNJaLtI8S9HYMEtiHzdu1OEuMx9XeXrbr3fiOKqeM+0nmGeO4wyF7E6M97OP/+c1xcXeHUDRog67xTjSLfmYunsfL/pLRuSULPLsXKDbDIpkjOXoGfnSHxU7a+FNEpEaK01peWHHQL04vWVEqsUzC8XqJa/I1BucCeI6ZgFJH6levzOBr1+dmAb+O6kH33r8cTVLNhOlfUtkmAgatnXlrDSqmscrzmVZdHRe4I/HvtnS53e6YuN9tlc+0meCrFC+7Dp/lSXZ5Kq/5ie2Ybr9NY7b9lcSg2L+lZp/AmT5FNJih/+wMFwdltid35FdaPFsyAO4kTjO/eYRbAmmsawkJo2iQPWAA2VwwoDqzIDpMACFsAvAjNUo/8er3B5eMFKGrPo+P9iY5sPMTs2VPUP/wS/NQ11xdrnOdU7JhYAGd7tOMI/ooFk5m5sW10G4xxzJZuqpNlYuEc8xJoqi15UHas15gpywxYA+qR9p0H90AxjbUIs+5QT8CkgTjDTKanZor7UKp52IpRa9GtEVJ3MW5WN1zEs2uk+aExOaVvsQK/Usotno6D+bbKsDFwwx7zxkLObP3Ukcws8aBJFAS27gKY2yq96XpRzGYMZ/vb9jqjI8vD8Pkh/NVQ3JVdzOzjShIoif5vw6Ltu+w7YNyc7MTVQ5Ii4TNt82oMc0rKEEPWEkWdNiK1rzfcQwclAVioXtscbOwmFs3JIFbZl/ecvjYdBcOadt+5QKrnCd83Wlt8MO7wMPwmz7+sHcYWkAJ5MH7F51YYNwc41oIjlnLk8A8AAAD//9xdy24cRRQ91Y/peXk8HrdtLOJFgAXBIiAFhT0rdtkh/oIV/4IEC34iO7ZIUVASYQQI4UUIAscPHD+YnunpR6F7q25XzUzssE5LWTgeT/fUVHXXPfc8Io48US6v3wyEif3zY/dkAI3TZIjcIlhlpRvEhZCr2NJiCNEgFMQYzlkqijj3C0WeF0feSAC0FX370XLKur/7UXNyTbWdIOolURDyOi7iefI4hGjusKkD8Ap2bc35mDJESQgUWWEjLYzJQ2kYAVTUE/XGUlfoNQQMSCzHqw6m+8exXaBVA0SUUoQvyhnEKVOMLiqhSXo55LXTds0tbipSmV3hJqo/TnRzk4QGZmaQEF4ZQgPfFIpZcw5zM6oZqFi8RpOhGzULjb5fiVoRWQn9jha40H18LVFRFc3GjwpF9/4Gs27SFpTRoxfTAlEdIkGCajzDi7+e876a0OFauU62UP9h9wMkbbr5ztvG2ZfGKwkRrnZRJxFvJkNl3DJrmp/27xiY99DBxblmdtveg067rTY9RLs6xPj8GHj2O7A7RNhKOD7s3bu38cX2l/jwzm18d/8+9h4/YbS75D6aK8qFOKuVMwNsHL3dPto7v7BJHPK36EKr5l/+kh9E8+1M+9yxDLotPuYZ9FaWEaFr6+4bmWx+FSPoJlgdjpBubWFtbYiNN7ZYrpKmKRf6a+tDdAdt7uxTLFrSjk0kZV1Y2ugMZfEvptNzTM5yTE8vcPTsEE9/2sfhL/uYXF7YnqeZxxqifzebMoqEIhCI1nEQmw4re2Go0EsEWXaulyHKi5IBLYl3qSuT82v+USe3tfyH8yO08POrenLmgoZrQ6ynKf58fuKoswvvS93SXlgivzhEUGboDEL2SDAWBqFNZPPmM90jiZreqaD6JI8p0R90MGq3sKF30Ven2H/6I4qTCdq0waJC9DUt/11WtO1qNR3DEJVqYUKLMN3E7r1PcOPTj3GoE/x9kOPo1zPguDJ2VnVigcqAu84BMczyDNOzY+6A+0aY1P0XAIBm3daNN7G5s4P2ygpy6mow8448Lcj5G8D5GL892sPXX32DBw/3uNM4I9NS+3UEVqoSGe4Aa/55c36FZCdA6VGwrx8Xep73qfOoK3z/4GcErW/x2ef3sHtnF2HcNuy4OuNYKDbsC0IHDGojN7AYMnc/lDUFHIwG2FgfIcIfbMrnlf02ZsyeX1XIslNU41PEPYoJIx5Fy8Gh2sootLn/aAtEQ0+BYYTudgeD7QBkXzCJgfX3buHi1kcYP/wHFct3pqw/rzmb+fU3ubyO00VF/Bghjtt99D+4i+rm+8iiIYppwCk4tp3ZaP45dpiL2FDCAewN1D4ZCBiravRoj3N5jll2iS6ZYep63niRn2l14wOUbm1ilK7zr5R2xl76GiNA/1iUTl51cIHIchmj9Q/kuWkjomG1/7SXJSw1yzJ2Sb/qCsQGS1ifjTymcfkXdPn/TzJ5YtDYUgjtjEzdem100lUEnQ5AEgAqnFChQ/G9Z2fIHj1BL8/Rf2sHhUpQEVuJPYqWmb5z379HGwaWQYClcQ5chNF4MsHByREmdN6ku6yAU8AwHWF75waAH3jPVXvyMl+CQx3MutR4cXCCINdQUcX3jQDGVNx489CzWzXZ7dpqr5VlDYtflmnWxby/l6aZRMFJ9zxUVn/N/2e6yUZLXrIM1n1emxHf7MmN/l7kAtJdFrY0j11AewPbzabXeNL4qnT6eVMHaPRXVpBlY/R6/UYyIHOZGnQskRHat9Iuxt3KFlU5X8P5tRI3XukzlRXv3UmDL01MFTgABd4aErq/zIG6iR1c3g9KDUJ4QFW5IruRQNSqichbXMumgI3mCn83L2X9WBDFm5/GRHDZz0A+g5MKOE0/jYEAQ/R9CahCDHU6xKG/MXin1DXr8C/1Ihvi05wqyJfBaPtjYucwuNHYSi9djxkH8z7GvN3GMV6REEXnNrV5wACk1Ooy3nJv5O/JAikGIHJNef7cAP4DAAD//9xdy24cVRA9t7une/yYhx0/YmMnIV5EyiYCIQshVnwDW3aIj2ILH4KQkMAC4mQRyMoiASyDkWfseXRPv1DVrbp9Z+yQRVjlbmxLVqu776PrVJ06J2LhDA12impO0ZABptis0MWaGypc34duLgLDVMVWMYhSek2aSQ/Yj5Sqr7WZX1C+gr/S/PWM1Pvh5ELcchOgWSLqd6eXpr0Wi5POL1/sUPK8cBsVskHoxakghoo5qKUgPWPSsuJ+3PshLAZLcWk8OFUAQv357YRKC4OxVHK1EfGTGAr6tZ+evha5HAD0v6TwSZ7rPsDnxETd2O2ZsGUPHGrPkN7+0FxXAXVUpaKYy/bq++XDTvymaw0UZd4oi0VMi0LES+zzVnKgGhugaVJG10xhWQDqmesWpfQmOSZJVsxt/ED6kCA9VPRFqEWZvdYSpSjgh5XBariCbJjh7PQlfj/6FU9+PLZA2caUXE2HFjb5nVlqXthuYe/dezZTxwg1tH3gtKk1FCF7Ry8Rx72yCwkkIxR9uAqqT4eWcLvmCICrgO10jNOfvsfO7j3EGxHKJEa9tIL9gwN8uv0ZDg8/xLMnx/j56Ai/nZzgjxcvcTkYYjhOrylTV2Y+mDd+ZQ2NhdKbDdmIiz7FNyRWoCDJ+10rOJSQpqD8nd09bGxsYXfvDtY3trC5exvd9T62t28zqF1O2k70k0B+Tn2+QclZ/Vk2QTFKmdKfjkfIUgL+55jlE2STMcqswOT8EqOzIf58foJ0QJUlSjCu2o84n1kVW0py9SNuIWwnMO0Y4VLCLTScqa9s1aax23x1eEZH6jRLrXNAIFluCRTNIn/4fxh8fgQGqyurzADQeb7WQSrCXXV1hXRwivboDFFnH1HdYzGvCo3Ylp1PAmoztnNI1iL0t2K0exHixKAXB1gOe2hXD9E/fh+Xg3+QkJgqrl6b3ng7RlMrN0GCmQkwjGLcevQIDz/5GOHBFiez4t4UwbTGWXmF+iJnFgAzAahbiRxzSEclGyGbXnDiCgJmaDZa0jbUkilZ21pDd3NdbNYi56XNG2k8xcnxc3z95Vf44bun3M5E39VYei0V6Aeims/CeZ7BWm2d/ywY0USi27HN3r2pA1m/kfp9oet88+1jFkL7YuVz3HlwH0sEnMoQJjEwrRBBpP33ga3mOSHQyooZiRUSVZB6qx3vPFGo1Jw9lbY8TYcw0wvEVYqQKqHQQy9CSYnBylIfAlYCT+1OTWbo799CZydB3AfyEhhTAmB/D5vvfYSzX56iN7pCXE+sP7a53gLwto3/Av+suhO2MDAxxjt3sfbBIaZ372M2DAh5CDVqnknE4NhnnNUeA0/K4lFRYpkYMNMBTDmxySdu0ap4/hoHn2Z0el2s9Ltujfpx1JsMZ00ssU82yzGjeMopattggoPyQujulWV4cTw1m7n476Y7UUBbBpYdWCoz0bMFDPQjeRNZ7zWDrpeh5kRWq7OEuN9Fdj5AUBVsnUgJrShLkf/9Fy6fAb1+F8ubPVwx95ircx54eoUjwALYr+HpN2lBRr+TtVeQCgzOhwOklCi6SdPAEAOgg/XNdWFZNIWGYAFM1qJbMroYcgJJgw9mCAsLVc8kW3yqbGvpgigcxaR5bsS5bOY0qUrPQczHQAQELVU8ct7xC4/grNKNOEVQUU+vTT8Ljf9V0d4Tc1tkANB6YtFAEefLxbpQWxPs/Xi2gUJZrz0HtkBYuFVhcUwZlt4zH/MAACAASURBVI5dy7puFOtLe64v2AcBuAp2CYOUYv8HcTwKuX03sVhKXM4oDlF8qIA/XxB7tjgxd/evQ4vH6kamlX+1Ibc1mGCuyMsA34ktW1as6h1AbO74OaLoWryuDnIQ/ERtEJy8IH2dyrZ423VCADpnRrTVsBN3Cm9928SDvY92e8m1nWiRU23+bI+/6IjIe+M1LQwWtmx0NvJNUlOZNz5zgtZH3SLxy6bibzUHrKD74p7Rd6/XtX9TMtIAAP5l7upa4yij8DMz78zOzm6bpOmmSWvSJmJtLYoghYIIXqr3euG14G8SL4X+A68EvRLBDwShttZCbfq5ySbZZD/nW84575mdTdN640UXQjZLZnY+zvvOe57znOcxnvWNZI9UpaxYpXZ6rz0TdYo6oUVZPhsIJC4nQSHUh6R2IDRwJHkPqkmD9p1woHuVLgAFjtjNOVVLAU00Sp9wrLCFMgXo+6glgBCrCg1LEvZNJtE7vchcZba0l4BpOrXgEQKJoC8oMJlK0HCST31MduJShE8q45pAe5XQAgEQ2jpQVf89ARiIOj+dTJAoAmmr/doOcJwWUyFUJEhD4Ia1GGHEp7A0EqscShTp8VTOT1RqC5mAjDdH+68PON/M1FF5kkhFnK/03BpKhRpoU4juQ15U4iWeZRTQd9DCTwaUoGIk16rMDK340z3R/iQVq+C2iEwGA2suMEUqqywuNP5GNJFGLZ5p6eFMbQqh68MjVHOUYbS3j+7tR7j/8x38+ePvyPqDmnK8PRdbmdbPaDl4fmMdb1x9kxGynCegGvJoBYGSyaTykq0GlYJXrlZOS4X4JfefcVstWGEF15ySVfMXjIdu9yHy+7fhnT0LjyyoqOLQjNAMI1w+vYj1K1fxwcefYK/7DHs7XfR2nuHB9jZ63R1sb99Hb2eX33PlOSsYQWZnQrD9PB9/w5cFLlexC/mdZjOQTR/0FbuhLOYSd71yRan/pdvKO2PFAKNadbxhGchUQaFxGS208NrWBSx0lhjlX1ruYPX8BSx1VrC80kEYNRlw4eMhSlteIpvEyOMx4qMYWTLGYNRDEo8wHg+QTCfIkinSeMK9UWk8wjQ+YscKmrNoUnQTg0G3h3g4YGVnSszGuTzICiv6mBKyziJQhhkSBCw2wgiGepddh0G/BnxMHer3o4pKwveOXD1on+KBXFroCxiMx5gmGYJ2g2M6jVM4xCoygaWp/n+vwrZidTodrK+vAz/9wsyItFAtBaeqnAi1O0M5OkDW+wfNs1sYeQ1W8I4pOEjsiKAOCl+TImjmaK+EWFwJ0V724LeFRk1V6QlydK5s4vUPP8Ifj59h8mAKN4lFhAkn09Vmo+9lr1cjw3oRY0unBaqs0PxLVYOxF6C4tIXrn36Gc5e3sG9KtFxgcy3CqczDQujh4d0jjB8fAmWIkgRFkxhhOkIxeIL08Ck8S3k2EJcK0sk+7QGnGi6Ctoe1zYs4s7qKwg2Y9u+64l2NaYond+7h5tff4Ltvf2Cqu8ZhYQVZjR2fDgOAIjxkHBEia51q4dq713BmbZXjNR2Psf/4Kfr3HqK/20efFmn0LKVn/wkVFO0h1VfD/t+vv92F+9VNfPHl59i8vIEGIvheKO41RSq9tIXDlSD2D7WUydL2iVMMkrXgxvoFLDUJ2M9mYKJTs/u04gR+dgRntAM/j9FuehgcTfm7DIvoWrYbsYTYh2sItEu01pewcqmBPBS5Bs4TKIHyQ0RvX8fie3fQ+/4BIhNxsaJBrUFJOt8O8R/h+qrzYZ4L85ecD80h5Dg+arcRXr+B6P0bcM9tYHLgYfjXENjeBaIl4alZWzzpa6/ttFQAWf8u0DQZGoc7GOz+jagYsuYCzdBexU9xpMjEDBF5+lzc3ETQiiqrVbeQe3xckuY4IFBBd+WMPciL+SyvVON14azrLFiFbV4XO1bY1ZE1oCkE8KW1aDxM+Jm6t7d/Ilg266c30tpGivzG5YS4UCcm66+PWhI+b+76/KueStP6g7zzJ4GHsBXCP7OIsf+IwXDfct+o8tcufQwOD9C/dQvhO28hWzMYWyHFubnPUvjr8XG8zVA6e8q5teVJQAzR5/uTIf+cjxbstiJMlrsiHxm0mlheXQG509HCTFomUIF/ehUKO/ZGewfws5I1xY7TDSWxzq1G2fwx0Xokz2eCc3Te+pkykrXIp9tRXKRWuT5jWrdh6ru4oGlMSKWetcNsm4H0khvOT3yrgWSshWDlQGAFAJXarsLqdacG+j5TCeMZnouUau5aRglqrIyAHQnSuYJaQusiWttbX3yxPbZOX3T/C2lfoHP3jV8lilwYNYHkYZbyXgEDVvCQjoEY4bDPBQIWKMkVjbRZ+7P2tNdZAlXlnB0UbF5o3c9omyBQtfqsKsiydaEVZCSwmD6Pp/Nrd70eKqRevz60X9U5Kwq16pM8QxwZ5FwVUNFWZC1W1tkTFAPK6uA1nwUvaB+s/8Bzi+Qxyl5g6j0VFWti9Tr2KF60SKxtAFo0rTOk1W2uinc22qH7I05U9fGsrib15F/bBZhhkmf4FwAA///cXctuHEUUPf2o6Wl7PB7HY08c2yTKIisnmyAREiG2iP9gg8SnsWLBhgUsA4iEl1DAApFJPIofica4p9/V6N6qW90xMQjEKiVZI3s8NaXu6qq65557TigZcAnEYIWOZEKcp9e7YNRrKQ1xvGRvoDLigGXBiIhBVw09hC6wPCDUt2YbOKr37RnahC5cXY5DRm1QTfUsNLHYxk8boQYK8omK3vWlFIFAYQPwZy2wQYf+rjq9QynRuBskFCFBAM377aRqmvqVgbXcXEFkBHwgixIK/qXvHqmP2kDYACBhq7YvyqGWRtycs4QQGz/5HmVRRrmhbhGUh9ROhpDdAGr3PU5pVLdjl9ZSfdp6UINyGd/U2KqYBlYllekyShwfDGXSD1723mWghuwU7eSVh0acDQRxTBaJY120VKOGF6GKlGSpLl778LIKESF8x6c42n+Kpz/+jv2vH2H26DH81LASA0uRD7yXNzA5KPdD4M479zDZ3TaUdHogtEHzm7QwAj9WbTvozAGTxPJlspnrJ9R72chbyLPl6lsGAFvRFAUGQYDZgy+xMxoD129ALa+yVQ8dpFU8QK/Xx8p4A5Nr16DzBEWZI09TVHmJ0/lzFps7Pj7mg8fh4SGOjo4wmz7Bi2dH+O3XfUbJk6xERmdrcnaQ8gqiJPmvrsX75+ZbpofNUtI6EQFLvQjry0Nsbm5ibXwJ29vbTOG/snUF65vrWJuM0B9GGI5WEQ1iJNmC6ymJupZRNvQ0RbnIkJ8l/JrN/2DkoibmS5Eiz05RVimLR9YEFFIwURuAUJPln18joBo8mwFIkxSL0zMs5imyvGGYorGylCRWRz9ESfZoc416qAiACH1TownjEMB9469lOM6G1KoUw9JTyZnELNSs4GgAQtEA0N16Nf2KIol/eRfseGjtIxBAs8MJlSsRY6KAZy3k0MGiSC29ONlHf34D0XgduTBVQpuZUxV6SzUGayEuXVYYjBXCuELlFWYtIwyJFLP9AOO9m9i6fQfT2T7CIkHPS6Be2yxpC97QobX0KSDykA4GuPne+1jf20PeGCXekDJITYjLmxGUN0LgKcwihRcHZ6ifZ1BFiQFJlyaH8Ch4tQdcjy36jMBmn57XUmO0OsLG1gZWLq1xeQrN1R6NpCxw8tMv+PTjT/DFZ58bYU0J/i1YG3ZCKFYOCOkQqLl05tbeLdy+exdv3nsbo52JobdXJerZCWb3v8HjHx7hu2+/x/TZIQ6agseXO+jvgitEIDd8pKXG/fsPoPwKH370Ad6Ir0ITo4TU28LGAslWMLX7ebZNbVD5GqqvMNkcY3WwjCfpHIrEvBic91sRNHqe/BJhc4bkeIrl6zk07aXoowkiGLy2YgEkTf1mc2AYYrg7xMa1IUgD0wvN+s5OFwTgNcD61R1Mbr+Fg5+/wnz6EEOVAzp57en/f9cqP8Q8jKGvXMXW3Xehd3cwJ+p1L0JcDJDSzDtJyfrIIDgiLhoow4LqCsyRTzzNeXIZyuZQ+TH8xQHCJuF8oW894HGO0ebZLXeyu4V4dWhUav/n5qwGKaFYaaejREA2C0ba9Da9lnmBSCmcpimv71Rfz2WmFwzJE80I6pMEga2TTHPOAvo/NQLXqgwlnQspkFlZRj2IodZW4B3mvBOQVV7IrJsSdQZk0ynKlRghAY2kl9QEtkS2k+HXLQjgn6cdXsAacfGBsfdyvy+KHBkD8I3lIcGxOFnVKQiwNFhGX/moM31h/zKWMkn5fOD3DNDdWJE2bbVFREhRmLoStBnhP9Oz0Lxrq2lGAZvW2pX5tkmRxtXteyJ8G7Q2aiaYN2JqtVe55J/imvCKA3JJPHL2XD5r44huXXvVsQbsNkno0d/juBVVl0YxF2uGqbDVXdMtLVMSoGxzGYoujbZ24wFD0JSVpoCay3fPWWHStUnOzlz5Ap+BbN+1vc8UDEfOQtmIjzt/ft3GHQ5cYEaDZSl0FP7FElFKL5kxrE2CEgFcUpDGKInhbua/Ow8b932tvWFZFs45gK4b7Y0c04kbHWtytHOXYy3rWCal8VSWRM2IMJpxSrmzzJNu62oF8P+GimNdie265RYMrHTANxNL0n01ax7NJ9YAsIk8ei/PiCGu2bGu4fNum0SW8iXDnBaBSnLh8FHSvOj18CcAAAD//9xdS28bVRT+5uXnuEkMxmkCTigCFQSVWsSiqsqGh7qCBUvEX0TqBgkkFjx2SEgNVUtIKUWK+ojdJn57PDN30DnnnvHYTXlIbGCkSJXi1J471/fe853vwR4AUSoUpiJ6I11hyf0vUhSEQuLmeZCEgGlRpPQN1fcz/cKB7UwL1UI1LGLAYPLBpQcdhqFM4sIKoMiL0sd1UAObv6mxB2oip9pypfTPkxXXSn/Ruc+s29GC0mEP/NaJnUERCBqcFChJStsxycLEwpiFUUSRfq+TmRaEORaRGTIWqYyl6+bMBELSOBKCGAKuaykuTr7gELiihfRpE07fX7v5RbRIxzstMgIssEJADC+E8Yp0gGQFRGnxg5zOpBOV5RUFLRujW2YRUSILrxT6Gr1C46G5qSwH8MRDgaUN5EGQLvwdaIOtUswVaf1pY04AM4gw6D3G4Y3buPfjAX6/8RvM0ABjMQwsraqoC5R4mlbkhF1vruG9Dz9AuHZmITlJM5jRDBjNUCGaIsWZkBFUsLwgO9bsLx/33IpfqdRO7rAuA2OjwQjYcsgkq4QGHT6f9ND95iu0iDb08mtwwgZKlRrmtKlTB8sI/TSrVOFXyvDCBv939a02v3cnSTCdR5jEETNFxicDzMdTdA8P8aTXw72DX3Hrxk+4d+sOjrs9TAjBLtyDXjkyaGM4kTvVC2k4nw0qpfCA7e02Lr19Ea+e28W53R0010WPXgtD1GrVHLkWGt4UaRphPOvjZHSE/kkP8ynpJkecqDCfjJHMppgMR9z950w9+l4RoESblquLNOmAJc+XKA983HQllolezoU9bWYEiCUB/wTsF03q6tj6DhtLa7UmO7SgVissA2CqoCvRnCxTIjCG7oMAOZbPSAwiz2vd2+xPfySHQM9t5PmqkvuUWlI3cvNAY5a/X6cxLpc2sYIrY94pouZHvY5Op4P1sIGBNdUseDvL53NEKuOkM8yP7iIcHaLcel26sDQn2R4+RRAanHneQ2uzhPoaENTm3CGNiZMZyHMkGUbqG5gXzmD38jsY/bKH6d4INRMjyOart/DfuwpSCOSAnpjmwUppIt8FpYS2Ll3AK1euwl1vY0qDHDuSVuJE8EoOWu0yPJJNhD6OqgEG5giNozFK0Qn6w4fIkgECOyN9PoKJwz4xaEousL21iRd3OgjXN8TwNOHKBKMHj/Dtl1/ji8+vo9sXppTJFt1x3pcIBHAk6cS3BoCb7RDvf/wRrl67hp0330CzvQVDjsukfaVZdf8Rzh7PcR51XG51sHfzJn7Y38fP0x4e/gUAELh0oImFbZBk+O77PTRb1/HZp59g53wHaTlldhnsQZ1z/7EAxgjQo/2HALdSOcD22U1sb7Vxu9u38IsYCSoAYGx8qW9oH7iPYPgEfpXcqwNEtoNGBx6Wv1AMTM3BxksbaO3WEWwAhg59ni0WjDC6giqxAID2xbcQ7b+L7vFj1KMREA/+dBpnp6R6/J+uyC3hcbCG5y5cgbu9iz6xyPwMXihnxXKliej2DHgUi9uu49p9kB62BQEgcxJWuuG5MZxkiKR/F9nkEB4mkjgiTzdPqYBCzgZotxvo7O4AlTKbOri6x/6Da6lZY8zSn3OhaA/ifCYjLoLV1aoE0LFSAJVz0no+TxMcn5xwUsoqA8BYkJgbCJn4YJSrFcyoIwgBBLJ/w0HVFuhcSNEZrt2EOWpi1n2AUsqWC1wEBSZDg5zopwaDOweoNep8D9FGCRF1H5+Kz15hAvzdj1NkvLkOhtMJn1HMM4xq/ZLPQCc7pw+ny8/e/tsUjlqT/hiYpXDrge0mL7Tfae5eugyuqMyWfZ1of3dtQhUX4WLqRmsp+Tlo81C68h6CsprJxTm1W2qRBZvEcY2lv0vXlxmzdmMXgEDO9o6dY1pw0uvYpJtYs8Z7yiRdX6vdaSng3ad+nxsyqrSY5RLSdaeEMzA7Os4ba4lNMfMhcle656LHl94XLO2fCm6qC7mZF0/Z00bZ3Esdc/s3qTE5exj5d2/ZjR/qMWClAXou8q0PWZanti3PF2Wgaye9eK0awUsDVKQb9LwozlyZAVmh/uO0G7oHlRcVmrwK0uh7qtF7JRDQSF+n91lsfopEwY6nlWCsXuL5Zgv6ggmi1E8SVepSHrc1AORaWQGAU4zvc3+4AnOg+BmldqRI9yqMMfgDAAD//8xdy2/cRBj/2d5de7PZbLNpaAg0vFQJwkO8UirRa0WDOCFx48KJP40DByTEgQNwqLggQEBVGlLSNkCBqlWTNvuw116P0feY8WzaChUhgS9ZbVbetT0ez/f9Xo3C07RwtqBKAtxFDeoLbXfgn2jOwswyzXxU+k1Y67htJiRdLBpkttNFrIFIWnZyE+bSCDiMqnNkjBb3fHAhHHpOtJuMTKtM3fXgnM9G0yHlpUc9jzhTsXaRtN0Xa3Zov5cZD0ZRAr8jpDmOltJilPZdeYYNljUBNyA9xoARuQFNrAWf43pCtEU107QjmbW5QHZukXqDqFFF6Blf+JvIIObcO5ZuIt1Pc9dNKDmdNarNmirvI3T+qDFAA7/QlAaeRCvxPmhGs92tSV4vF+1v9Kkzlhpj80rpeG1HNtNxBKW1UDwLRfQkaKGRlyjuTHB9exe/XdjB5W8vYO/KEOFYiv7Y07tzPe9p1COHLUiq3pmzb+CVjZNkBMBRgfy0oBiXPBX0vwqlu9kIZzX9ECRUL+jMjYVD7zsJgJoj2ZhHoqk2EaFT5hjc+ANXPv8U3RO76D+zjmjtKSQU09hQ2QCNF2pGsVO9MFmisM0LbnrYdzpdTujv0QPvuJF7aWMDBWnkhyPsXb+Bqz9u4+IP5/HNV19je2sLB7f3BXl0DS37e632To/TJ+C53G6RfvZ6R7C5uYlTp04iTiIerkWeIU1HKMwB8qLC4M4Q4+EBinTMVP6ckP8iZTp/OhoyjZ+QiWqSQSt4RDQ2LNpCNMzI8LgPtCFGi8tpVXBtTVGBkhsFbQJUTLUkRJP/NZXotDqBPODCn64fo/0ELzYjpiAGcwmzAWgMttpzCIiVUjURkB6MGwBSSBl1U7dbpcXRKJtwre8UIDShl7TQbalbdFgbG91HW+326TNynBbSMnKkEOdVcSdh9+TVlRWMdi7LQz9qOMTCG7FoBAUSckwf/okYKZqc9UjmlwWCuGDkn4r/3mKEuEPO0hkC05RmqXNBpyhLg7wTYeHpE3h44zQu/vIrMzZikzHCx4ZMGk3zdxnW/4fNX2y6y+pou4bpvoFNyCQGBC0eVh/Bs5tvIV57AqOImHKBzCESeSFRmlGFo0sJ2lGClSOLuNWKMUm3UO7fghntoTKZspIMWkGIuBKZBU03SRKK4dlDxxAlbZEnUUNqfBvffXEOH33wIa79fsDPzgkzVTBz31LoEiN+kcyDz7+6jjfffgevnz2D3uqjiBYWkHGPrUKbBu3tPQx/uoRr359Hd2+IJ/tHsfrci1h/9DF8+fMWzl3Zxm4xZtnU1KbbeNeOY64o4TuQpi2BEJ98/Bm6SYz33n8X7XhB+p9E6WSULlQkUBI2jOIHYVNyl+eOdLG0vIw4uISRXYipyanR4yQUhu+NfIDxzauYX34JaWMeQzpXfKtLjGwZ5Vg83sPyWgdJD2wsSAAbN9Y10YNe5qWYqZn5GP2XT+PGzg5GOzfZ42KOqOiYugZyiECNWP/7yv/flhtYPwgqVumIB80ExePraL3wGsqjK8jaCabM1qD41ABzx4F2kWBAUqq9lDjfYEv6SidMKvjK+hnCpqEEBIUZ8v1dtIp9hGZSx1Ee2uwTaG31GJaWFoGqEMmIiNP0w/cvUv9Jgc2Z6kbWmdxgu8c+aQFNz4qD/RQHgxSWhGpQM3Lc5wMbO0sxs23kVlJ3zzhd82DzJiXPkPy0kmbteFpivt9Hs99H0e6iHI2ZcUMNMyYzk4k3MWQnBQZbW+gS8zfp8PWuWs16bWPPrxfL9yCbCWqW3KgokJoC5WxrWpp6rFdvcJEqfjvpzLfc5WtD649Rytr2iDhRldyPUy3kSmb/RhpVLutLqCu7c5WfijcZo+ba7LdMY5+ibouwlGn8TWE3E0tJGwT0WgrMum6wLKxc1/ZU69C6vlDtvHXot0XulBkIqQNT/bx8dx20riGjSQuW+T4N9F20Prf+ALmawlmQk6RWbGypNRG9tkWiGF6GvN60CQYciRgIS9Ki6EZN77IsldfeOLEAITG+6TwbNXp3VH/PBNANW/Jjc2xKa7ZceqbLysI0hqUAU0xVsjDlicK67ovsvJbvHJakWAkCA5daNGdsTB86kJoaDzMF+6G/LDQKRRYvADPtT+pAkoOzPEGZ474xJjdGGgTYylxh2ea0H1fgaxPFL/wPe7exFMSmxmnN5NeN4gEg4CxtvqefSMxnZ1YrR6HPGVPiLwAAAP//pF3bi1VVGP+tta/nPhfHaTyTVCplFlGUxPTgU0SC2O3Bh/rXoiAieg8jQgIxqCQhLUtlhhzUcUbHuZzrPnuvHd/3rbXO8YZFRw4M6uyzzt7r8l1+Fzq3UWO4vh2Y9SVU9qimE5I6WoG7uRM/S1fbeM9Lqpbko3FBgTnwkfjoi4rqCKm1Qhj0esKfsJ32KE14QL3+gIUYxOOeoIsVEdezYm08RuKVBJo7oFEinBz+mdQ92cJvxBsAedanlVhEGALhB5GaJo1XklKBaDsbN6eaSdegDUx4+4p5lOwvacU+NPtVaraQUC7Rp8owJSp6bIFHUOXS8sWVfYg+IbbcGH7gljeS2w556YsJMrGIviDJOVi4jDyoZXEV0micmDRki8boBW0ngJLPLuTR2WqfwPkJzqZYjyEXrjP5MRMUK8sRJlL1Mxkl4ZnfuAQWlflF7RJ3h+SYtPJg/QgLjzEjw90iVkY1UhmjP2S7RhtKbqRCmbGPayRWcaQNYGJ01jexs3oXq3+s4MpPF9Fb20b/Xo5wNIb1u7qz89+FDd4j99ZyML2+dBSnPv4EjdYCqJVRUuWT/sOgh8HddbZ1JJ9cEfBXYCdUpbyarLcFdJuwelTiPykGOC4AUNBIdBbeRKMITaVRG+xi97efcfPqZVTai6i19yPZMw89NUvZAIJGkwNsMQ0NMex3WZiJ7puBcF4Nz7vIIjApKKii3pzD3n3P4pkXXsbSu8fx3sZtXL10CefPncWZ06excmWFO4QkIJQGivUCtAU1lT49oQ06v0/dlR7n75f/wqeffc6H+KEDT8OMuhh2ttHtbKLf38Ew63JhjqH6nS5KcnbgQtRY9IiDeAPEBn4uePSEthYnStY5c5tZVTXnhIvmRzWuQCUlUwNUqJAQTShI0acgcThCzgr1FU5ZqBoeE+xJS9Kf0cdE5D2eQqUpe//zOqDAgopQFADTYqPqbxRwMYi9VZ0muSqtyJ7oSWxs7PDvTmx8CEas/AZtKQGlUraHL9AsTyF5DCXAJXSFg4p61An59g8QlB3sbc9hcX4eq9eug0S5FSG4CoviUA6eFjJVIhxsYnB7GcGBO6g0FrGd5UjrDYRVg9nZAFOtEHWi2GpBGo0cR62wyZQuWPBtQNDRqSb2vnkMt66toHf2OqqqhwrBW0d9prtojwsyvvDxuNfDRpL3v55kufZ/IdqBD8RdYiFuCIHzwOd7H2DXFOgmNRx55wO0jhzFTlRlC67QJt3ESSVNCdofdCFy1vWaAoEjGi2FqJGjM7iHzuYdNBydhj6wzKRTb8FC9ekW5vctoj4zjyiuyrrp7mD5x7P49ssvsLy8xrD80sT2PBFPYhEQZEAnf4+ZaeD4hyexdOIjHD66hMbUDHvj7/b7qFDhkKyStrfQO/8rbnz/A+rbPcSdATvcRKVGuxLj5Guv4tDcHnx34Twudu/hLnkeC6veY00KS7DRMumQUgMhL/DV19+gNjOL90+9jen2HkZEFEZa5hwKeUEsWePUTU11gKl9c1g4uB/qzDlvKcf2foIClU6i5ZUTtaXY+BOtYg1bURNBEiPb7fCkUHWNmfYMZtsJoqrQfyh2Z9qEGbu2MKCI6r/UsG41oJ9/CU8dO4EbN68jzMgK8BZS1fGFOAf7JN96t1NO1gL+a9nr37gFTb4eEvd90vUfXF8PLUi7Uu35yEUZHaJnFDbTJvQbb2H34IvQtRYyHSKPpApK980kQLwIpCpEV8fAeiFBgbHXpf1PxJDEux8ZgmKIYmcTvbW/0RxsIfKjUN5GcPzNCtQAvHL4Oex/eoFjUaNkkIFXYjcTdoMPfFWMBeyMLzv38AAAIABJREFU7Y4ZK+DHnTUjlsDcQS0kXqpQ0S2T8wqWv+9l2rlgRPscIVBTlNhFf6DQG9rnQILJ1pLSCJ1eaChEf41bKCvTvDrNRDJsrDuH0wmSDx0jInzr4oF9Ttt/JXqkdJ2lk2+aFSTzC+jXV2G6OWJC2GAsClpTAaJeH/Eow9YvF1CPaggWYnQoV4wClIQGENKNnHGlFMxcYjcxcFk/j5hWLsEpSIBTBXzWaC5xCrq4cAggCO1yqjXNtr7rN7c9eFKVoaUcmgnkoiRwVBQNdZ1jKYkhA1F0t+g8Z0nICS45eGmh5jG11za46PmWcE4fke/ul+V4/PROo5jzktImpEPXUOTkscCQmnSECmCxOAdNd/pQtstvbeycWKRLwjhxz8T/nq9tBfomX6GWHMApvzsqsktgo0izQLL47mcSlvr5I3lGrIQ6UNq8xY3NwecpD3LjiEkjicXFpSFMcaUn8miJQ507gPD4C5sLjaQY4ijHRntnMboOFXfv63ZTMYPiDCogWzSwezMq2aJIKY4h2lAcJ0hURWjcjPICOp2ez+Xk9yLfpHXXdNaOTtDZCfV5wTxK1NmaVPYCamI6DTwSJaX1S7E/5ack7M70IMpNKU/gryv5rZ2hiCMnkiuNgZDvt1ARWFuE7bClMMJo+4k15Zs/XDQkpwtpxtu/EmFsa7/vlyHpYdhCDBdbJooIFHcmseT2rugkTWmrV6Y0/qHuen7jJqLwZ3ttr71Ndps0oQ1tU5oAF6Qe+CFFbemBgrggAeKKeuFUib8MIfUCHHrgVKGC2qAKEFV+EAnaKk2blN042ToeD3pv5o1nN6VwhL1EWm283pnxzHvf+77vtQTRhASLnkHYoRvzaA5i4iAVfe0Z2vkojOipDHW2qfyyE6VN8p32hhd07CQGUStyro3SrkM2ItG/072L/oQr4zzZMTt9csXaIi1iPEhoo+90GXgtM8ASh8bgwyS8TWAvPfsVoyejFAv/JUZ20d9QqLQ1eYCAAkIbEgTskNN84N6X/2vGOTh8bau1oWRA9Dm1RSLp1clzDAYDZHmOoA6R5pkxYCRUkhZL0hoZo2acInZc9u+RfqtoqIqiYK2pzL+RBIyOk6CcTTs65WiedIpQ9ZaT7VKjHpToP9jBw5V7WL31C37/aR37myWC0nxcriozNJ4scIIZmfObChOX3ruAz65+jnNvvQkkbdOGmzYGontu/YFHv62gx/F+zHGeDk2LGTbNsBsuPD3N2CR5f8MmmZXtkyiFVmMumEBMNPNqyAnEsHiCvbUB7q2vQHUm0O5NIer20Js7hRZp5Ca7QN5BSgwBWicEDtHmYh1vbT8apjjoMHH4RDvvsIliPtXF6bPzWHr7PD74+CMGAa5//Q3u3l3HkIAaB7c/P6RUlul58+ZtPN7axPuXL+Hs/Al0IgV9MMDucBuqfgodVtwTP1aGBula03iNoqPAfptlSrng2UvKJCgUx/rYHlpm/GtnXGPk9poRbaLuE2hScnptxj0MDYNI05okWXtK1Y+EkwYOEtKEwQEBGmuLtAZp7PW3bubcdWDQRmNd7O05nw6WQSnr7qy0OTjsz4ps1dNt0pahE0b+M928JMFwztr8/FU8vt1jPbyyuIjvb9xiiRVJuWKMSlZqS89O6tB0AyjuYypehMp60EcCTE7nODqVMruW+qvrscpapJtuEjQOBHjEeYr2mXmcPH8Ra2u30d8oEKo9RNoGRlJF+Y8zAZrErQmYYMEdufNSBxgEIbaTNk4vXcLLF99FODOHfap6UqSvTDWIXJtZKleJmFhxRk+PKPkk7Q+30N/aYMMzAS1D+y3aHfABjs4eQ2d6Cp3eNEvMkoMDrN65g+vXvsLyd6vkAchAjIBJw7pGFpiqPyX/WRRiYjrHlauf4p1PPkR+6lUkk7OcotOzQBTsVskUGRQ//4qdH35EvrmNmTjnNW9ohTXayoAjr8+dxESaIF1exo3t+9Qgj9eA3cIcv0a8ZQispoB7WNX48otreGlhFheOLKHU1GIzQdZOLHhqWADaMadqY+LXSfDi/GlMTmbYe7LvqsO+lEv6w5P0pOyvISg2gGgGFQHjdQF0UkzOTWD6TIY2e9Qp44wdNF1LajcHJtgiElJBv7/bRvfcGyhWLuPBtzs4UfWRaKpSK0tjlqUinQn+vxoA8aAYfUYDlGGCIuuimlsAFl7DLgHSJAGUlpZ0bnIP6hA6B9LjFDilKKgw8OjA6izMNxDd2syZWVtZtYfW7kOo3U0cCRWfEe5A0KP3Qu/mKbC4MG+SC2K+tcQY8vlD72LQsGl9TGc4d0ga4xuEujmDWApn5Z3PanNHiVtBAf5TiqdqPOkPoORWpG3hGEuMsYo0g2qlDMIFrpuU98FgfJ/8532TTEnjMOHvUzpASXF5O2P/IP3CCfz58DE/IyOeCloh0wGypxWU7uNgfR1JHKJz3MiCqK23DoMx07/agLpjIMC/8THYJ4Ynd9WpnzldBKgQi4EoyYcvNQrOMiBxULG5XqRrm4TXbIBG+y+3UINyBQuODfyrBcEzmSaV7ds+7qJuNOhCz464p7oU9+T8Zuauo4x7Y2PfI/YzgRySyLVsRbq0UtrASkFEiqrH1kVJ7Ng0HTF0M0wCZfy9bJ98liKMVbBhK8KwyaPs0f5L285gcv3KypLZzyCKRpahHmkjLbFOEwvXtc+WrplAIt005H+E2c1SzpaZe5O3BU5WAcd8CJ3cgpkNXscKyv2SxIylYQqIVFw7VobchylS7vN3jUswiT0quasvDWBTaVu0ofmjsRNmue/mT/I8//cZrwDj4C+5nW8+2ngJmJjPLwrLNYxMnDzybFWfDLLtZySvk7VAACW/bwFRYROIxN0AIMZzjr0obOc+BrW0xl8AAAD//9RdW2scZRh+5ry72e1mm5MkTU1aY0CKlbSgUCjkQlC8EuOV4IU3/VGKl/UHeCEIUhS9qbUitFXbaKw15JxsDptNd2fmK+/hm53ZbkvBGx1Ykmx2Z2a//U7v+z4H33pbshpqZk3Ra8ACJDX3QTOhBp24KOiGBtDPO2iQxgqdcLoOJx3yHowcYGsF20JZrAomdQKb8WF4TRIXsko2gWF5GkPVKk8WhUFNlUSayALhsHe6z+avpiq2B+XCcKCun7s3ACycQ1TtU7aEKGUwCyuAZ7OGDKene6QkAsFD+kQ32D5Rr9HtFhU9jQ5mP/fanhgjlOIgbWGpDmTRcaLKzfQ7ndM6O4jipHJ92BIjURiQZDvTXHktgxQ5kvWD3ktJrU6MtpUN+POdut/pIOPeKOePbWWYy+ogpHL84wRHazs4XNnG6o9/YO3u33i0vAHTloDE08U81e1zmp1P28EW6ZVDWDnl4r0P38fH167hldcu0BPKzYdsL5NjmNWHCPY2OU/NizTXqVKt/CtONZcA6PFu+5a1TAzJLeZmXEd9xLXylMHkBNpfCQLmAEfdDrqtbSTHu3A3Q+z89jNcP+SA1ZAKuB9J0FodQliKUKmegj9UA06PAbVhoFqHE5SAMBKpa/Wzpao5Ig+VMQ+vnn4TE/NzuPT2O/j+6xv45suvsHLvLkqOx1oXNps/yNfV5w2VYTjtyp+r+PSz63hr4QKuLMxjfKQsEE3ayBPjz/Ul05jmVItzyS2uvBFUL5FNuOVggRdCfY8jYkEMIbXJAJrgWNgyYbiveJ6mLIJy1GrJ4sULonxvLmtUuezxT/B/qupT8B+US/wI6UEJsNDTZIrHXuX0HuJttj2LghLUBSwU2Qi6hNBH+/v76oEsH8Gq8NvXGq1MWM62sZxta/WivDz7XLYV4Qx1bhzaRYLQPqMjOHt+FqfqdRwf7PKYSAq8uFTEl1zxoT8+WIfz6Dam5+YQNkZwUi+hOkzKuHSTYilqchu1fLDkpWJh1SZbKXJMmAgxdukiDu8sYr1JCJD7qJgTTkzIyJZxIJDs/2ASIJdk4nnEl+y8Z7eb5GRKziNuhKZfRuPyFZx/9wO4U2eQRiSqlLDIK21sO8YmC11kkjPsd88xC9xOC+3tFbS2l+E7MSMHHJblijkoj5kKQHFriEqjjsbkBGq1CkKToLW2hl9+uIkb3/2EnS4yu7uYdTGAMgKUCcoatzEU+Jg6N46lTz7C4tIShqdn4AQ1xBB0S+QaVCgAb7eAB8vYu3UT5a19hImHkNaZUlmsQ7I5VELe+fFJeG8E8G7fwrfNf7CFXm4zTotJAFq7aHNL/9/aOMAXn19ni8/5yxdlPUlk4FAv6Tgq1KX9m+aOsBzi7OwUuwFsNJcHf3UZWqON+OghDjbvoNx4ndu2Q4KW43XUZ0oIRgETEr1Agv8ET+Pm2e7J0XWExrIHRGdGUL96FRvr99G6t4Va0oJDgpimL0HGfaifFPH/O1wRPZKx7vo4ciLs1adRW1hEPDuPTq0unhU0h8WCjiF6DP0kfVsSgw0mCC0U4pD2Gk0eUJwQTNlelBADJYTmBMPdJg42fof7eBfGHGfzqU2yikxqmiFMzs1NYvLlaaBaph6jiIa8W5FW1tLBe9ZBvFsL7e2dQwNyraS5icvjy1EedVaPz1XXaI952DrC1u6OzuW982foLf2b1lRas2ndsRV9SWL9OyFA2VMKd5mQYlRNpTFVe2kU4cwUth/8irCd6bAxEs5q2NB7iALU+WsZpaEIplJB5DSAsIKY3C+44GFy2huDkwCD2jZ/f7TXJJpxojKAWRvZ9cUncbsS0wpfpClofSPB6GqaPrNWIVVgy+suplKsxhnz4FPDa3/+3vvpwbYin2jABPTE6LIgkRNG/VfqnZP7VyxWfEQFCDTg5PjGlYJif9xlD6ZPp2kWwFktAKqQU7xz1HoxUUwblOaDw/7r2RiFrkUJGesa9dR3oEGkp5oERU593/2ToDwJJGpAy3GHmxbcFvLXF1RDmNn42fuUWEjsGLNkiloSWn00K5Do5NTzrXacFRjsF+xjZLq6AthCTOhQjCp29oQkfd5B/YLdeVSbjqgQ7DAQJ9w/yAUuf1g6QCFZVNCXy7lQqGuAtXDPF7LkfcV5L39wwkApDtlrNUaTdnFhjMETAAAA///UXdtrHFUY/50zM7ub3cQmm4SmTdILrbSa0odYKBXFh6JQREFBfRGk/59QBC2F4psvGrGoESy2mEpsYi8J2ewtu3OR7zY7u5tUH3UhJCTZ2d2Zc775Lr9LyBP6VDgoxosZ5UQUL5RB1ItdDbkAYqfCb7DgX1hcGKx26QsWGqEoVhsCwF6ToeduONDwgoiifHNWq7XczmH0g3sWa8h0EQU5wsEg7GLTQE2CaOy5UCgFW4CQQnKi3TXv+Xl0zERpACboZz6Zmar90/9kKnxXLIjpi4px4dSIBysXK/SZzRYwGXBKzBLDFm2/gLbIF0+BdzJwFBgEsaJLgnWn7Jpmyu2RzykLPufk08Zl4bhhvslRwjA57CtJ884WH1tf08QakzyopGy1aJNhmiwExKdt9nDwrIWtn37Dxtp9PP5+g3CniLpyQw2ctA0S7gAHeeJy1C3p9MUz+PTmZ7j+3g2cPHMOKRVJVIT1aG2QfVEH2NlGY+MhJuM+Sk66jInTxJYN7DOFAvuxBHKMI+e0sTAqVJS7BKiIoP4cslVcKpOYLEYpiTGp3cxep4EZ6jr2yBqPJn9SZBCtIya4oQOatP/IBo4aMVEFWXUaldk5HDt5ErWZOZQWT7EdHSYq6HdaiMg+xQOzx5ewWl/A6mvXcP3tG7j7+S18/eVX2Nz8owCHTsUWqDDp68cCWqeCRSlZWPt2HfXQo37tEhdSxH1iezhdpkNdeD+YUBvfP1XI09C6duMiWwzDM0FQbl5RvBE7J6Kx4CDGzvPnzJeDBUs6BsW0UPQb6Csh+H85RFaOEJYi3l8M/4sCniY4FbJivQs6/06gzqajYYJ+XpNnmgS1Wy2zuc53jEBq5YbrtVDyfjB5TLUzIqKSfgAd9O7IxJWbR940JYDls2dYMO7p+i66yYEI+1jh7qyjTO89QdDfx97v93Ch+Tpqp8+jM+lZeY4m/5wsebkx6NWRz+ldbs8l5yFFO6NEs4/p48dw4o23sL+1hfb6HsIO3aT2GerL+dkhDaT/5mNUd0HOHQl2PXMlVF5ewavvfoj65StoVqpC5yAqT8JYDBK5l3rQ6YxYggWv3aTdRWfnKdrPHiLtPGGtBOOyc+PBZ7BcthKFjAAgUSya1PUa+/jm9h3c/eI2tv9qMvQ/FUQ1+3vzvZOuUyzJ3eK5RXxw8yO888nHKC+cQi+qsvCWuVEk/S58EAPbf+LJ2ndINx4hbLYxRXGjF3NcDMbiWYooTXG+Pof3r1xF64cY9yheAnmMTArxgRMnip+6l9fXH+P2rTuYPbGI+eV5EWyBTCyJM+tVKCnz0lymffrSTA1Lywv48ecHeFF6S0z1imthb+sXlE9tIpooI5ubQn2phrDu0J9QDUs/KIKQx6RUkTW2txxiKnjKDjvUjFlZwdTVN7G3eR+VXbJRa/BrOZMTVVHDQ4bE/7uH4RgOfIhuWMVurY74/CuYubyKxvSsIDWkB8uwec+UKJcDXeiMhFVgcgHo7BGq08E1FKWnU8IwCzBBcPSdR0i2f0XNtdFPO7wc+JJkA1epAQkNuHDpIpbOLnPnv0c850BzNkVgjDIa8lxTkZAUg4wzK9TDdOh/3GGoKy5+49ynu/igyR9rHfUTRlHu7Tdyi9nRXNwQf3yqyiFVQ0O5tMtehLf7d+gpGfpkLGJIaNpWr4t0ahqluWOoztcRP24i6oP3ZKaILmgzoELdu24HrYcPENWmUAsqQK0E0L2RRHWDYX7Li5oAh93roYMzGi5Roz9z43Q3p4rsE2on908PmjsRJbVaONlSFyjXXXW+OL0mykph+MSW3SRczYhEHXoWJ8Ss1h8P+dAzHYwRuoH8fgTRSmuBrdTTdEyUzhogYhOe5sW15cJQnSwSF87U9ax43+ccUPWxqNgX16wkRzy3W22pI2zings6y7FtGmxDVRTWepZKo5/2Bh1DhqyRWnOHA4G7Qi7iCg0EHtxl4hA2yr03WgEVn4aGZteFNNGaMOU+cKZwGXNkYOvVcjnXBLPv5hZmCv52fBo6t9tiQ26TbTqGK4imi+5DnNMsRofb1LAWBIBovlHtyUho0pPRHN5s5E3wkKkRNGzWIWvO+9eYY0NwaU4IBcH+PhDpU/cBfa/FOs7yQDpfJDYoy1CuB9sKFiD+ZOWY66tZTW7Uco5lsuaEEmE1uzadsgx/AwAA///UXWtvFVUUXXPmcee+WiiFQNu0CEIlRi0JojRR+KIxRkMixMfvM/4BNfGRmECCMSEBQTCYoMUQLCjQ93208zhm7332mekVPxvvl5KSe3M7c86Zvdbea61IHTA1d1KBo7o4BkZuEGWO66j3LvDvijwCp/4CuwWnRIFqV+BAqAJPNpbIZJSfLjxr+LNqETAxwHY01YissrX0/2rmkCsjlCQVc+diDanQD1zsHY356vvCMHGyg+phkBfVoie9f+EYIwXRsnkLD/53bShHLGxsbPD371NMjIu+I0DPh2BRy/A0xicVqF5eGS2OMoyims7G+vF91IC+XuvRl+Zq8ohe7f/qxI3/CQH+Xecyz9qcUFxuSVdGnS5/oBmBguyyrCaNrgMr2Z20UXRDCYFCh58YX5TIdqqYydJl0w9pJDCIEOUBGwkNH/Zw7+rPrPV/9MsqTA8ud12wduYetCKbK0CDY62oge18yMV4weDUoN1u453z7+O9jy9iYfE0OmMTGOY5mkkbBREbNCZE7prra1i/cRXbDx+gSbpokgbYyHXonekaxC1amP7QH9y7XuwGaXbfj9FbYyryhXTrbuVIkc7sa4rUyOHOalOTcuyRIT8LGI7bEsZPfnJ3hfqHNpP8/GEPxWAT5doyhr/fxiZd1/G9GJueRWduDvHUDJBYjiijOKJGnCIYb+Dk2UUcmT+GN99+C19++hm++eJzdu7nKYtAWFA53OqLSVWa4A7ozVt30GlGOHV6HklIY3qbDGgk8qiaSIks/JRJ4f1EpEhkfw0Lz8iWYnAh/3bja0rmCVsr7+HpFXpwZ5L322xatNsx1ge5PGgCih20XBxlCen+EyTdNuJOE6YRcxeAirT+NhnphOgNBkjjpuj3CZiHMUnbeN/bLPcgMXBAguqoxytr3mODjeEp/oUOXjqTyFiqkXAXgAtWJzNQECg+e6o5NaJRra0ZzjT3zrAxwz59eMw8N4fnTxzHj7dvom0aGJa5K6ghbuvu7zelRVz2YTcfoLd0DUdeeQ0b4QBbhRHDH4T8nSmO0putufvNS87K7ynuaKscokks/d4Uk6+fxItliaWyxNNrl9AlsmXnCeLAFdpB8C+GV7pH/huSgMhHPldIq2esv58iWTEYIEI/agOzR/HShQ8xu3gO+b5D7K5PGfmWFnIokyJUfPNEVyCGSBTjydr2HEgySuj4E2sP76IsH0OcFGQN0RXlgoYM+VJgauYADkxP4dD0DOv579y8gStff4flpWUyvubJlMwWvutOVFqbIVSGyYN78O4nH2DxwkUkM4dhwq7oblnnXCCNXGdhcwMr168j+/U37M8KNKmYzAKejqER7dyWu53tmXHN0QwMXpjch49OnYG9chm3+isi+a6lBATuNCut7gw5Gy5f+gELJxdwduwcbBpi2wp5F5XOJDmAmwCzTBCMTYxj/tgcvsIVhCMGcfXhZI45tENsPF2C+esnjB9pIZuI0T0Qo0gtp6mwirqsmhihuoY7AGGdloy7JaSFNRZxJ8BOI0bnzBvI/1jGk++/RdC7iwbPtFIUDWk8c17a4rj9/3yVzukll6l+rJsQj2wD5eHjMK++jP7sQewEIbZXhgjaKZod8fnjAtLF7GrkLsd0jRMJEGFtQG3nFMUWcdo5GtTEKHN0dnrIiazZug8U60zOFCMqClvrE+/ZAxw9cRStiRazzY1mS+o7ZV8ReJft0TLIuNF7asRQTGpk6lMDgTeBlOc2fLGv9ZyvWYuAa0VbCiDg892BmNXVVfSHmfPKUfBjR4x0QybsW3vHBFgHI8D/WQSSl5f889z0QNtKU4L7ZoF4FRDxTlGlvSDH1NwU9s8fxoNH9+XctlIbRW4H0SQFBeS2yIB0s4/evfvoJl3Y6QSFIblCxO8hvxvx33XyVGhMt0xHYoQ8sUroaTOvFLNoJvdqpshc00POJmrMkXeVkojWPlsuwPs3xC4MIvFpQkFyZ572rxFZJGvR3T0lXJGmVTKWRsPRs5nAP2om6IZqYJLPct06cv39uHvhwFuBwbCSUHvNNk8DGgfCpWERcWoWxEcAMr7O0kNHrpCkQ+XNUNmB67JzY81UWfrU8GCTXtLgc3x2KG76NXKLvRIaCV9L8tZSSYSmPUkHuJpirjrPBbYGAqypzs2cbl473XWfAsU1qrHX30nUXghDAN5hNj82XyM5ZHI68/dDYg8j/5m61/T7KdYQbCQNVyIZqO5TebneF8WxGvVI6zVz91gl0SQZZa8HapC570c/63GIPPZPcgvXUOXUGocV2TOA3mcMRynyZzpSQbG13xcOdz1rqp5eRIRJSp77bOcbQX+vehqoj0T1qnCxRO0Klmg46YmaHKr7P61R+ly6Znme428AAAD//8xd2W9UVRz+zr2z3k5LgWkbpHQJ1uKDCTG+EJYQiAkxmhge1H/QhAfjg/4FYJQXiGhkUQNENJTBLoyd5c7czfy2O4eBCIkvnLc202ly7rnnnN/3+5bKi9EJgtyQm2aaqPGFUsahRbBPgy9QlJ3jUB8mdZHEoTHxdLF6gdWsWEZSSL+i2htz1yRUx5gEVvT6WizuVqeZMAYSQVkMHDA9jCEwJi8wZG2oRbk//I5iacznIUX2MpqmXy70hXdQhOVLA0V97LO0+fkeCeZEyWYOaVp6BMiiEn1/o9mU+DySOBhAQGaIXvSfjUK9BJya1NFLxAwFX65hEkv92dgFk9WN/zV8ur+lHnB2p64rkyQwZSiQjZfZJqmIWdNRzpFYWXeM/Qc7+PXaLTz66QH2HnaBgVCs8xdcgnO5fBAFNqxikA5RVTXnXKuF02fP4NPLl3Hq/Hk0l9qIZg+yOU81rIvylIS5lB6xu4PezevY//0eIjKlDMV0pFBaVyl0lZgJncjguWnzJRhwvg5samKNpaFfa14OooGdxO05BRI4vSBUI7wyek7jDcy33Lu48qFM2fVZzOAKzS2Z3o23Y/T2d7C/9ZBlAnOrxxEdOQbXXgCZKaShpA7MH1nAuUsXcWJ9FWsry/jqypfodB5LslNeKBWywBQGUPYpdroJfrx1B+tHl3D4UMTgEVNvGd3UTjetkTgtASKO1+QM3GwiE8mE2m/vV6qmJ/wOa45pqIc0PZJmQ+JM0nrOsX6uX8HgWc4dHD6URmO+BJIze0iu/8SAmGly8V+bidCIIj4k00rAWev0OOmg5vVKhpv0HaHkkPt7pc86od/u7e5ilFB8nrPAh3Kf9JaHaP7tGwJXdpv9IQdZUAJ58C59/rtPXzS/2MbxE5uIGhH6g155N86VVQM1TeMoKKQYDp5i6+4NvHNhC3OHDqOo1jFgc6RcohQtZtBph62QrjbNYaHrOGPYaYxxkGPm2AyWL5zCUsXhu6SHzi8/4FC9gjDpolnNkSXTB9abN6gQTUOVFpHmzzXZAT0/uooPPvsCa+cvorq8ipz22FHKhXdOecqZUPz5uloIik+dbeoOUj530Buh1t1Fv/MIg+4WGhBmmzMZE4RSTRh/FAWYm5/F0tEjONCaRX/rCW5evYa7P9+mZFK9xDsuwDItfsWwk5JTarj0+WWc/eRjtNc22NzU8c7puDsYssnRAEiHKO7cRvfOXcz3hmhQhUQt91A2Jo6uUn19uS6dvvVkeJtleLe9iI9Ovo/t61fRLZLSt9tfwiWtW9fh0+0+vv36G2xsrGPlwHGObGGL4YLYWAF+6E4YAAAgAElEQVQ0RoGLJzKyasxUsb6+iuWlGfzW6f/nenHUVR79g94fN7C0toLawttIGjliRneEv1Y4MxYTxpFvHOn3Wc29nPhDMbEAFg7g8JlzeNbfx5Pv/+buYivv8nklO3aC4BVa9Dd58J4WhOhlBfaQYxi10No8iWMfXsDBi6cRtxfxZ6eHfp5jMIiR5REcyV+qegw6QX8EoBfjr9lF8qOIsH2PKGsaY0z3mFEP2d5fyJ/eR2O8TXCjGMyVG+Nkqyt0bZ/YXMPmexuotBooqVKA5xUQeKvsJWuDtbYFO46ThwEB/9DudTpKpPHlNVRe/PuXNFeCSce1Hw85FQfK6iqKMrhSTbTBJtmsqW/WkVbcK01NX3f4UkJeg4F0Y+n2F9Mr3Z7F/MpbeNysw1EjjNKpRhNDMTu/iI5eH4+QdLYRh/fRjFoMcI6I6VQT42zDb/0OtWmRw9dAv9jcLc3Et2hqFFqMkwzgVVPzUpaFUb+JqcRFqKf/9P433Z8tBQxTZylUWgCVfBrALk3JQNZHITpsM//z14z5ECXaPWcQuFLDWCOwaR0K9VvAAGP0Oo2X4whs8qfQbHxjGtN8x/Hk/MxzKZC5Q62+BRK1LXUSF8bFJE0t1CbiUIv5RE0GmcWhRaYxGqzjbnLmQIvYNE+9/z9JQSssKh65dvsn8zrptgdsKptqRDh3xBm4mq45g+eeh9R/oYIBVU5usEZpqbFnEECkAVyca23VVEkHgSI1lSdTvHzCTJSsrMWcmiCaa77VjGVSgzKvKbOfBsWzMxOD3iP1tePPxwKs0M/0GbmbErQlz9bqwlJKPDVKTwNNgWA2kTbNeT7pmWv1Y2tXGtgKYJk/6ZR3nwFUtl6o+Kf5smYyAwPO4V/qruW3iSMOf7Mv20mI8yZtDEEEgoBQCK24INQitagqLaKnXrj21H+JW9V/IZdeWiFVqipCgKqER0ElhQANSUhiex17d6vfY2Y3CQQuPXRziGTLa+/Mzuzv8T22rEhXJVfxN/7vy4TSTRQoNKRYkeCqI1vvyWAKNyVXvPR002RohXazLIwj22Z74BWgJK87MuVx0OcrYc7dKZ7DVjlkkSS8OGhjkJtk50mtSmfOPwkZ7UDX04jFAqQo6JcW+C62w5UpRNiK71lPMIYfMexduEIeV7Y6DipszDbeUZah2Wi4ooIturzp4N/tqAPpW/UXXn9ocqvc7Xc9LDcuYHuTtqMvcCKhkBbXAdTE1tvWKyEOYa/pAtZaePXnSyz8egePfrmD5YWYoYU2+bcV9kxF4+hzoapCt/kRC/bKPzV9Ehcuf4XPvvgc4xMH4YeRYBMhZNyIqgZJDMTrwNIi2g/mUf99Fl0r1LH04VHipxq4DH3ybAXAuEQ/X8TbRNucj7hdS7ZIlmyhTRhbJFD0RlYo0uTQexUL5NZEAvlT+DlTDDKkTMCk1yL9eotUcJKIDN2N/DaCZoyU7PbW61h/9gyNwQFU9o+h670xBCM1JH4FxisjRoKBiX345rtvUR2u4vurV/Fk4S8nvOVz2GscD5bHnVAZKQU6wPN/Yty98RAfTR9FWIVwv6hjr+vWVnOTJHWVUFZcLggrZqrnYLl1jFIwxmXbXX0VV0Rytnja0fPKJbRXUvRVq1hbS7C2su54XT4JHZH38d5hJH0VVEaG0DMyCJ9QABQkqW0azVcYGPhtMFyQNAAY2dJsCcxMhfzslImlWYqnBINvNFHt7eZBMSJismM1ZWrdJpfE1RUVQrTJfqo2iGIX+iYVfe48clYf4tiJKRwYH8etO3OOH5sXJzwpBBDcDQbd8LD65DGez8+hVtuHhjcoKv+ZiF85u8Is1VROONL0PvPbqbKfGfT4AYajEvq7gP7Ix9ils+geDHHthxE8+Pkn9NN8JOssnubt6iS/+7EFhfAfHJaVay3pSABt2QvhTx7F8S8v4/CFizDv19ApScAdwHeY6cw3JFeCDukjpNINTTTp3mwnKMVNdFZeYPHBH2hsrKISaAcA0sKnmSLgazUAhgZ6MTo2ilqthlbcwL0bc8z9X1/L0HHbSsfxjQPtIhIi+pOLH+Pcpa8xduxDpH4FgZZDUw3wWJ6H1v+Tx3g6+xvKy6vo8SMk9SYC0r2gFjm5a5BwpR1o3aJE3yBFStAIUnL2E0ztH8f55Q/Qmr+N+1QIKsAOsx3ZsNgfXZ+9h5mZGVzZdwV9o/0sxrlJo8/jIKWMVOktXinA5KEDOHL4EO4/v7nrpNM+G6Qt1Bfvwrx8BD85zTQVKnpI4qeuBcauM7fBum4qv+7l3H52ASIL0irQfWI/9u65hBd7evHy2o8IN+4jSDdlaXv6rP+fVgAI3RSbCKtRgLh/FEOnTuPg+bOY/vQcjkxNYjMIsToR4Pbfr3DrWR2P1+polvfA7+lhm39W5e/YNerz3uWXDbqHgY3ViMVlg6yMqNNCJWmgs7yA1vJDVNO6xGeZbHsWbcQ9YbY5BUIDnDlzGkO0X2epdgTDbd11OE+KNxUBKLliRGncQok7bO8W47jnvHAEtpyPYtl6vYGlpSUUgJm5QZBFIFjUJcGIu8roBL7uY2/zPnn74XnGPUe4EUAJBtnjZm3EWYLSYB9GTh7HxtxNLF6/jSAVpCeFDYJASFVxn17rIGpsYPPpIszgAHoIueeX0CF7bkXwOTvags4NCrH3bm4WnHxRIyh4fTxLz1dCAGytpRW0NopHlhdRrBq9xMsiLM56VwXbYlJvt/NJv8MhGWziZXyFcUvHlhJOohJQchtpQYGVfzShZuRiwc/fDyXht7ReG8tbBLTrzPJnEwcDt4knP2+33ZK2+20585ZKQN9NnWqKM4gCLd3iPIfyVNAvVKo0C6WTw1ogKGZBSMj8iVOP0Bv43Jr0Q/MKSy2wnHF7vUU6AJTSydRq7cZbRAA3Xylecggd0QxINndqruU6dNLVd4LRTv8tLCC3PUfdoGui92hfoPMzElTdmNg5zuS5JjSxLqIEiroIRR4+j50imOn2sw4RNM9SZMrHgsbWOQzo/G7t6uf5mUWnWztHQT3k6AYnMKlCg4zQ0P92nIr5onwuF3q0bhOW+p1TJsSRwcbXMjYejPHwLwAAAP//pJ1Lb1tVFIXXOffavrbrOE7SJGrTJwlRW/WNCi1CAgpCYlAJMUBMmPCjkBgw4h+gMqJQxGOEBKVKm0ITBKEibfNo6yS1fV9o77P38XWaMCiWkkwSJzn3dfbea30r3O4JhxSe5KNlamCeeAWATsY9UVskNIEA73RheMGkIaA/w3mJNpRiOuCfYxmGFOgE61OSo+tWDQL+9ILnOCDppiSJi35QCwBLRkRa7Py7gY+GUK8Gy9ZFTkwHMJYbI98gZBLPvz/p0zVdrqgDD6o/RjP9S5XyjjALpwRwsjHN3iR5Mf0tiUAXmUNgXCRIT9aML1RSCIj/n8EVwhUoXnh8UuWuhc6NFWuYfj54IylMruWVbOuCcDPHn/nusVUkLu/2UhmbA6MZbnYorE0nvCRtpQl2aAJB9xjEnS5HDYZZiKqhgm0Ta3cf4va3v2D+x5uIV8gH38/f1ul/VvCDKwiQL6aojOnpGbxz5Qpee+NNHD93hqO0qFLrpT2ENImD5bx80DRyYx1YXkJ7/iZW52+hQb54iqmhBkCpgiyRm4XXNtKUVumjg0TTweOx80INeI5M4avZfX3ZekCNCO542z6WjYs09Kd0/iesbLwzT7p2vzxDl4A5tRpS6vJTg4jiTbob2Fq/j6f3/kJt6hDC0X2otCZQqTQYHjgyNY4PPv4Iw8MNfPbJp/j99jwfS6aYZskgM9r2+0Z0nOZuL+LooSmMVeuIux0kxMOQ+0CxuZdK7izkhs8PZiP2GLIuhK6TWpYmmD70SwPQzMx5qllRVEJoy+yfXl1bhq0EqNarLGULyxa1oTqSZh3RaBNxaw/qYy3UR5ssE05J/kyFONuGgIgKwMw1Em0lQk7WKC5jYy68srzve2Y5bAasrj1Bp5uiSTI5/4CRbrcx/VaWQg1TBxHL5dwyMoHXc8bTY63w3gvSQzfSZN0MgjDHxP5JnD17Fgvzv+FJ3i1MxwrHSQIHSQQYZR0s3fgO0xdfQtSqo526RIkiTYNJ2caJ1VMpPdnLGyeolgzGyyEODIWoZUC1AZBa/sXLFzA8MoEfxidw5+svsLp8F43cosy59wlvIvWc92dC0R7wHHYAzS73b/HMdSj8jp0Y0wUpbsqe/xIeJhbDJ07i2PsfyuT/ILaoyZk58T5FHtGfSR5oeuRlZTgPrpC4M/bAW1RNgJoBHizOob10C1EQi+XAfYQST0qz+uFqCa2xUYxPTmC8NYqVpfu4fvUaFuYW/XxT23qqHAjl67Fzs7j83hWceOUikkpdjAX9CV+WyYiyvYH1G7+isr6Jahqy+8mS7SuRAirPBwspz+DIxaLjvN+Ie2iGES6fOoWVx4/w4J8F/vauNsMFMAb/TpaHBPTs/ObadVx69QLOt87D2LKLWpNpbiYwM47d7fQQDUWYPT6NL7+/wU0a9wwYYJPz5xKTv2kfsY71hZ8wefoCoqkp1qO3TfEu6eKzuD+f2/7mG1YsLuI7J3BT3kWtlGC0FWJmai/2Ht2LyuwM7hyewMLVz/HoXoIq2nyMs2yLmwvAznYA69fC7NrMe96Xld9QXBFr8m3XwCDsUuGzJEsnxgU1u3qtMRx5+RJOvv0WLr77Og4f3ocROhZE82gAs8eaeGG0ia/m/sSd9hrbjGyjySdhIFicQCM1TcoslcakQWc5RdJ+iuTxGoL2Ajb//hnlzgpKxIHiuGV4CYDedTTh4eCROmaPz6A+XEdA0vme0LB3YRDt9uLpYpp5P7TGZSnJW0Qv/pm8I3tFgb00YafiMM6xubGF1dX1gVU2hctHS1C6J3AUc6WGlOKNn5H1/z8JJiePWKfMyniinGOTCiGTYfzAfsyeOY3luVuIuynKQoov7hK5COIxQoLoaRubfyxiaHgEWbQHplxCh6a4kGub4TISaUytToXbFjzHeUEdy0Mg4mpwURjL80/X1+1DKaWGB3qVyN/bBvYX29bHF9g++Ufz4wPvX3fJUg7nSnseV4y6WqHYALIaAU4fiWE7K9UWtDfl9ArJ6ufpvIHPyvdHLnUxjFo7KaiPhqAah67e/HLgWGQ+7z91+w0jiWisiIxzz8/i6DxOSHPq3lAKRiXCOyi5cQR/KdYTKW5d1HbmmWn/9eIimtkHsZzD1jdV6FmmIDp/PLcVuG7yH/j9neW6q9KvucSOHQgBX/kH+h79Ose9tyqUVf2tUYXOGu2m+PQtDmxtvOeeLADMXmOFRdkPq+l/oXQyfZ/ivl3vB9TQo2NAdZn6/BX02Eu73HRx/78U4DLQYsaIdVZy5caRL1Un8Y6VoINlFxis5zCrA+wgMN0X9gWmgFuLvqK9uO5s2yf1iZCHqZmnzDX6G2oEcoxTsb9Evjmj1nMA+BcAAP//jF1rb1RVFF3n3LmPmWHoQAulYOkjghhbBEIIGozRNMSgMZFIAjHGH8Cf8B/5TRMJX/xSgzzUFBADEqtQKM++Z+7rmP049w76xTY3k0J758597LP32nutFRz/6t2voRfOc63BfHi5WQvmNwQimmM8v9x36TyWWfB4HHm+Ex/S6EgkfY6QRje0E+FVVIlXREUNI3LsjU6cBRLTMLwZ/bc8SwXR0bkwP85Qcdz5AjsW1uIB6CKv3NAC7aCyV798KFHgdvo51KNSEjcRU2Dvfy3ySRQiUAqBCWztU269HoHh/2cQIa9hYDrRPDFJhXsU8t8JeFILPnjRRNFYqK0X6T0j8iTncaBQONil066rV470I+M+2apvFBYUVGFFz1HxPVtbNZ29iIbV8akScdJkL1YS/jO5WvaIRH3VyfTNTArmPApFytXqr1qqa4PV4pMewDyjQj9Ctp4jCVuIXQi3kaODBK28gXYRwi338GD+Hq5/O49bPy6g96IkMfJXiulMlwrqRLHNKOSVPuT0gddw5sI5fHnxIk6dPoPJN2bQHuogzUkkj7pVoXTfafHprwB/3UP/+jz6vy0gXVxEu58zrz4MIj7fpP7PQTlqMNmMxOMCtQDkE2iDym6PR6V5dEnOsO/oy0kY0Bjm4rGuTDiZGLDG5IABq/w4W4vBmfrqEWdftoaOzsqIkSzeta+8DBaoeA8db2AYPOLCksT3AoNWFMNu9eCeryJfWkZvaQnu5XPEdD9QJ7yV8KIdtGNMTE9hKO7g7sLv6K9v8jhYqcVgoTSEfwslMQDn+hjZsR39rS1srfeR9wmRLFmYs5cVYs5H4jM2ZK0GGmFOeLyKglaCZkK2dDGaJNZJYA/ZBCXE7W+xorBlblwoY2E0vhY3YcMEORXVNoFpNLlgKMg/dlsL7ZEuhsbHmA7SnRxHZ2wErZEOok7CYna5dQxKsRBbFLMfebGVIl3ZhFnvIVvbwNaLdRX9CirrMB+kOe/LgaPHZ7Bncg9SJ4gxxThKXiVhKpUhrVfVd/qdFFmmAoX84ugH0v2Dq+CTjwFWCzRNnsr1ArcWbuPR6pMqZcpZi1+yV6N+GzzQTbzFtacY2TeKbVOHkCUdTlLZMcJ3Y63wJ4kG0c9L9HkE0mEkjrC/08b+dgPDJNimo/N8SBEwtKeLydk3YUd34u7DJWy+WEWThejKSt277vTYig/qC3Tzr2//3Jj/bO4VQM1PqVjdm+VvV1mGmcrGUd+TijUCdxGBpE5XncGjIEH7xDuYvfAFDpz+FNH4JHqBYY0Eo4mZVZCKzgUVq5SMpCScyuRo4XUSlWQbYgSP/8byle/w4OplRNkGAvJpZjCS9DwCdImDC4fRnTFmjryNg2/NortjBL9cuYHvv7mE5yubXIb1ULIAYK5FBgGgtHyP7e3io/Pn8eHZz9EaHoN4b2jY0TWTrJKwtQZcu4a1q78iWQWSMlIRt6KOWRQv1CqPrnuu4Szg+GPF4lFXe1fkaIUNDHc6eHh/ERsuk+OrFNM1gfGJFoEiADZWMiQmxdHZGYStEI2kwQk8/43efwSmUB7RYC5sjoWfbmBzI2WKRm61kLYKJBHAxigM5Ro5Xq6tobF9N/ZOv45+k57tkOlFFER4VNX4TrPhY2VgSwsn/jlLEZZbGOs4HJ7chmMTCQ52gdEhYPveCIdOzqK5ez/uLC7h6fISd05DnoCiTlFYER8GZ8T8is1rspVi0HvZq6pMrXHzPzZbrRaGQeKApz1Ew6PWqXE1TV7jiI8+Bf1OHOFZmWKZqHh79+Hk2c8wd+4TfHxmDkfGdmEMBrtJWwcZhhGAnBT3tYGp0S7SXoknz9aQFbG40viQ5G8fIwl91iN33QbwssDufA3R/cvo3bmEVk5OO31uXnBm4wIFgeQaBQpSfDB3DO/PvYfOcJd1KWDFU71C7TTfcJVYr9CXzEDyIFQCsZ4OG5GMW1PBpJpXMhKtUJqiAEYT/EqLoAK3tXHEBabFndv38PP1m9hYLyrHGmWYVM9ATuPXlC+OjgLjE+i1O8gakVjMlipQy0KGg0Wu7754haDBO6j+MnqtSwVBC763HIvtNQOD/d1hHJ6YxK5mC8t/LmLlyWOEhSMJoFeibTEgokxCdSbN2Aq6tbPLFzRK2iKiq1oyfRLdNbneu06oDn4saeBLND1TtG2OA6PDODE9he2hcEasUzDASdEUpMAfV29i/od5thitzqUyJ62KdVIMKJrAzKkjSPYNI4tMxRmXKQMB7cW+2qmYo1WQQhZML1pXNW7UBtD76gtQUdc3vJ9AXtOsr1O+wgmn2sI7DfhcwBdXvtHGa4dSTWRaF/BPPvuwK63AsTuZAlye2usBbt2Hb/QxXVLjdhwnQqMsxEXL2EC95kVgHAoKeM0qX99B9+90f1yjOalLMu3GE4+c6bJGaieq28hu0b+Gcci8eF9I97NMnAO8zbFeQJ4EojyCrdylseN/J4obfF7pPSj38zRiimEeuPFUSq8tYFRsnGojmtCko09zsQlsqI7dIPDhQYVStUDY+o/13aR+4zpDdQLoJ8qZRQOA6lBS4bf8yo3rXKynvQ4A1XgyFVLz75mSoiKHZH3v7z3aJC8hENJxvUXPayUMyIC4dPoHQRYvqMj5ou/k63HTeaU6lgQMOW9vEK1YdDQoL2F6faQClqovIECCgzHAPwAAAP//rF1Zb1RlGH7OPkuZMqW0diEUSjSsBakGjEswUYIxoBd6wR/DK4O/wTu9MDEKhBgTE20gMTSFhlJo7MJMO3NW8y7fd860hRs9N5M0nTnbd77zvc/7LHxljLun6dyGXBBVUCzW5ZYnaBe+PCjl6eRufpHsQWjZTV/z+E3coBgOuuKumCaWZmL0HWmc2v0FYRnDZ5gBZqt6C+ym6NNANMeIyjHbaVbRKYnVIJ3JjrpgZtqtl+9wbIWhWPgl9YT1E+pozmiU0Y3rxnSORM0F1aHSUOVl/+Wkz0YSbNIR7oles+aH1nylGPi7caLcD+nbjdYZ9NnID1DpSg/oIkUYp1Rk020veBHPJmRU9FWQ8rDwuNNUZKLd4UzqvIYgDeAHTURxhDxOkLx04PR6iF928c/qCzx5uISHdxew8ugpF1Dk0UJDzrxPuNhU0PkA6clTmXjC0Menn1/FtS+u49Q7lzB+hOj+dabgEePcYURbr+P6c2BtFTuLD9Bd+htYX0Ott41GrN0GXwpjg5oNoM88gfmDTvS77s9+WcGv2kwX4VXfqLpSlzssjXNg3rOuxBjxPdBVish4Ncdc43vcojRJypX2WsQJ/CRDKxb0eHtzDfFaB6srG2jMrmB47gLcw2M08BE1Gsys6HdifHvrFh4vL4o0gTpo9jqUHSZWxbrA4vJTzM6M49jkGGJ3pzwVB4rOenwfPcX7Paewpkc0WfMkTaiw46LGLvyyCCJKb0AAmUqQnMDldARKOXC9Gk+GiZsgLAK0adJuD2OU/m+4hc0wQtpuIT/UQnaA0hJ8pNS9pQmdljF+YE2fsr5Q72gxQvGLLiGp9EKCLCYyVLWeKkVJgZXnG3iTKLGhry9umTsLNa00c5GFh4zxX+FZ9gxR6goGGXJLcx0YI8pEsT1WP4dTDzF5dAqnz57Cg+WHSFCaaeWqRTWARcQ0TEotWMPi73cxP/8JWo0RJiT0uQPhsTN94khXnIyJUs4rzjHkexiLPEyEwFgE1q4bERrdI1qEUi546602Lh68gZGpSdy9/R2e3LuDetdBM+0x+8BDWprXDJSMu4b+a5+m/f0T9vut6tyWV55wkq506LPWxEYU4fCFeVy8eRNvvH0JGB9DP6T7WuXZ6HEVRgIjz5sXUnSYMAI8L0BArIftLXSfPcbG4p8Ie+uoSemq+3e5gKfeNX0emZrE9LEZjI6NY3VpGfd/uoOt9S4ir46X5Olhzpfvh+X6YO7yPK7cuI7W9DQzNcyZGUCGxxctRp6vore4hKFeAS91eVFCUiFJHhnUzBZs0sQvMF50eOb6MQgKYQykwguZaQ/j8swJbD1awAZSdNXRrzozOEW5kCVQ4tef7+Ojjz/Eu4cuwYk8Mf3U55sVLdLegdMIcOT4FC7OncHqj/dYZkBa0qxisibzci7jqUjRyDrYWriH+Mx5BPUmagcbrEsnNleuUWnmZDM9QBr3hBFw8VD0MHHQwcmZFqZHgVFHJBp0Ebo1IG8Cc199gENHJ/DL7W/w1w/fI+luoJ5K59sxUXq7+DemSBX4SylTg3Xef9pMt9k+C5SoU5WTqUyJDjP2XGzEMTpDBzA0exzvf/k1rnx2DXPnTmI8qOEwBFwSLqDHcx15ZDRdB8MNIJ4dQa/bwx+b63hBLt3tNvJImQCuPBORK9YSJBcJnRhh5xl6j39D1F9CiL4W6YbT4qL61qW/Tow4OHfhHCZmpskpQCjoru6g2oHdWxe/emPalgCiZvFsWK3VzZjr2fvmmJQCLbSJlpxm2NrsoNPpS7pEIe9ax+TUKtybqWGo32gCYV3HeYlh/F/CEbOuEINZh9lKxFTo5xlOnD6N8+9dxrOFB8iNn9VAl9214DRJyppZivWVJ0iH6mifncOmHyKJAgbiE13f5W4pFxXPP9c2bQydWhKjFVwj1ivHqSmXqYKssGmiMj+qvjq7E4CqG7Fmc02DCsOIC3GigdPpEQOCjL/JS4R9s9LXx+SV6/9Epc+OjQYnA2uRBZZeW5IY0LMUc3sP8jIlqOo1ZqjxDDZpx7+UBhTKSCqs549xgxffIzFUpeMp9Heq9Rf71WiCV2ZMCTOpm5gy73t7UrtEN65m5LSOqjKK89KPgLa+OuFbeZfWVey5ZNkRrpUoCGNb/JxsPVTA5s9bt/qs9Fgzbvv0HdHQe5YK72psnaltJBZQvAXIm4GLbTqeijH7Tndb67dgwETdPOeeAincgY9lrDJrg5q+Kh+g6x25ck5sfFiZ0I25vGElmNqrKoExIARLbirsGB4PdA01bY+b2zq++Flgd/6cAUpuCFMilZWmD957U/8ZXzjzG9WEjpQY0I4Y65toQpbD630AgH8BAAD//6xd2W4cRRQ9Vd2zO+OFGHmczdixCcRKAkhZFIiEIniIQCjP8A98T74hQogICR7gCRSEQoSAOIjEhDhKbOJtYs/m6ZnuQvfWrer2ljyEfvHYY416qqu76p57ll2uHN71Xhs/qKx10dbIoRelN5Rxjp9iCKH3MDpwVF+tQ4+yuYMvRt5GT5iME6WlpQeWxgHttTA7i1xLu3FGgamOf78jq/1IrDW5nWhCw3EXxfocWL0+xy5IxIc3N5KJSd+NHjAOlaHBdvFksTwErQYzbz0UCHlRNkddO0MT6h6Jvo3zNV82V0j0vkai1VJkVkncmhYAwP09dX3WJo1LUhKZo4RG57xjnV7TSLwU01HFbImokCHhHo0tdvw3jS3Emwnq623Ul+vYXFtHY7WO5SeLWF9eQX11A3EERF27v+z2xLxMp4s7a8/pnCKisAFj40dw9dsAROIAACAASURBVLNPcenjK5iYmUG5PIhCvmjvT2om0FY4oiziTaCxDszfRWvhPjaX/0WJ0K+4xzq4wMUJ6dTgbOd64zSj2aI83UM6DH2fy6CQvq9T9FV5mvveCQ7uSKU5e7/HrtmO7qns9lLJwsjdJaG1OgTcRu5pRFt96Eih3+XcJxTagFl+ht5SHX26Rk+WUD3zNnBsAqgMIhyp4sJHH+De/H18ef06Gu1nrM+E18Fnt/v2datDfgBrGDs4jFIx50sCOodiMedmo92aKosoKzE7zIWO8s+8FXv/Ke2Bky26fvRg58UtgKpUObs6rFRQLAxg5FgVrc0WNtabqLTavAGjIq9wYAib1DUaHUa/GLKRVRdWghOpFADgOEECIJQFD8NKmc0CY+VM1zLXwVFqDbgD+vDRIi52+6iURXdIHTZaUI3wTJVJLTf8/LHdLc3u6dZ0iTaTiZ+Ae7ssaeki0iKhCyUcmj6M2bNn8MMvP2JxZcUXidlupHXhEN1bL8Hfv/+GibnbqI2OISqOoEnzwxATSXNx3NcJAyQ0LtUgQW2gjFolxFAI20naEcWcSJe6EwOFoSIm3z2H6uFDuPX1t5i7cQOL9+5gVNEmE7LpTzJq3nQmuXsnW9zrPQsm7WOt7G+p+Zz7tERcGjyIKe8TUMUUaFVAeOQoZj68gpn3L+Po7DswQ1W0KcnBpEWKu++yFD1mcpD0qhAipI5iO4Lpk5SsBbOxgvqDP7DyYB45QuH99tcWPxSjScrB6oDG2Pg4Rg/X+L07t3/FX3N3eZ53KB3GO25oliLRCFNxN3VqEpevfoLx6eMCd5pd14LHo7eFzj8P0Xy6hjKt0RK3loitBs9Dk+rYU1afrB/Gdh88iMKW4DGvDaHRuHTiNOYfr2A+WvK6Z/85GYkFj7kCHtf7+OKrbzB9ehoj+WFet9k7QT6fKIt09uQzMVar4cxbs/jp5i1mEXG3LlZeVw3/1EkY1CgmERoLd9Ca+xnF2gxUMMSspp4EUfBzRJ6FsUoLZ/Jx0LkEwwN5nJosYWoEGBR3Fc3yAwMmKGugWQZePX8c54Y/x4E33sTNa9cwsLqEIdVAGHd5XbdzUssTzvji34+sn7MvudbzufV3maM5w1glZ+H2LVT8bwQhugdHceT8BTaNvPjeRZx4bQJHgxx/Z20fRzaGWSArYkSVZDwuDQO5U+MYfFTHzaUW1qIKugTA5gFKVdbGcoiolhoIEwwmm4iezKGzdg8DeGap1KbnKeA6AwZCZDEnZ1/HidmTbHCR9Ld2FTHOTA0ZL6LnUZ2TjJFWICxVLgDEbGz7Z6cFGjLAqTvCII9Os4Glp6toNrcvCPac0gvBaTAaKFcPICnmbQfYu/sn/8P1l3M2aawoXTPaL1OSTacX4ZXJYzh74Tzmvvsey3/Oe8DCY0Ww0q9Y9eSMYuQjg+bCAuJKFeWpEEkwiISAAL6JQgQJedxEdlY/B8VwAIplSPWQ/ebuimqR8W1vvch3cpqKzDCpQHy7uAmgfTc0EWPxYpGKTWtmRzLmILc96vtFB80JF0lIhRoX4a6olVqIE7rE9A2+WLfU/nYnsmlpcSIG2EoizENfOGaPeEfcnpVFar/GOLPkUrmETrvjs/FdzcUFcmCEti+Fn1Die/uAH/vdKzvl4LYQt/tj12QNJbrcCINOC7XfOfa7Yt76Q9n/73EyTp5/xsJy0FLssit/hnLvpAMAvBn8Xk1Td/Dn0/3dt/R9+t7p/9txIcCGXjuJuWuaMngsnXxmB+SIhZo2vq10XcAM2ZTQ765Oy5nUH4EOJ5VwZuwcAf2C+eZACvc6Nam0IMmupnUWdMoAG96TgWMKM6kNlAJEa3VgE+bceDMwYgz+Y+3KetuoovA3q51x3CSltDShLTRxFiVtoSyhC0ilFMQbghcQD7zwt5D4CfDAA5tApVKhRWwPVAVaEtqGNIkdO4kd2zOeQefcc8ZjN00p4kp5cCI7vrPcuec733IPAKDUcVdMD7IfrsW/OkiaJ2jcww7YqRttKDHGGEJNNjoSrWAovXbaWXeFwmNLTB7JG+h9HdE87DSsPq2+naX4ZEwyrAyapSeTaTudiJER21JNibnZ6ViEEBTG7mZ60oVENznlwCp7QR1STXSIghk2UxlN1qiXfrf+i8IXloMaf2RH9ljq/9Hz9CB9DzLba0tpbqmOUpzlY9I82WZRT0wuM5lBkZccvXaZqiaZ4EQ9JapjaMCTmOjcRD9qEtW7zlF0cSNEeXkF1bUyaksVNO7W0ajUsb5WRmNjkz87apuypt2VlJkhUtQIKcuZR0AIdBhifHoCb77zLk5feBUHpqeQK+zh7mnYCpFjSlkHVqMKVMtoLC6i9ddNtBf+QBBuY9i2OZYutlwpyG1Bzu9/i6rvwG6qQ8vq/Wv/ItXf0d/NLOdhh5EQKGFOqNNcKDtSWDp8rujc2onRnNtNC3EjRrQVUe4domodeQsInBiN9UVU76wgKm+geHwO3ngJ2D+Kgwf2442338LKyjK++PQTdnXuB0zSWYsu8NbtZcyWjrKhl5O2u0zHWPWe3FERvbslNOvIEfIqdympELVgeQ7LbeC7yPkuHJIIFAK4+QEUhvYySyMYKqI4OIScG6BaqeLurTuoVDax1SEJiocNmj+hwsN70LRj7kiwtIncgzmW0VD2CQBg06jtOmxai3I+y5g6upG30FN06iAAYHl1jWUOxAyiLnqSarkMap1oQH+/ZwjH8kjXPzbdWUGOhO7cBwJYHSghuNnaYuaQW3QxPjuO0sQEyqtltDOlR5ZJ0IpaLKkgmvX2RhU3Ln+Nw7MnMDQYoOn5KLc6iBwjG6EecZsopR6wbzCPfYGDPU6CgICUSLoN+gRh0NHiW4sLLgLjhn0UZo7ilSPvY/LpY/jho4+xcOlLbKwsoUDRdHGbDdXcJOoDk/6t6d9OHInekYgxnyXRVKHloO24qLs+an4eT546i9LLr2HspRfhHhhlk7OYjG0Ri3+Nc19/Dyio7AGOeoe0W/C2G6gvXMPi95fQqVUQZFz7aYbkJ5hPgIILjB0Zw/jMJEZHR7F0+29cuXIV5fIGd7wT2xNvFaQFA51Nf2AAz587jxOnz8ItUHyWl57l7pUSc1cca2tYvXYdgyR3sjyBE+KeY60j7T6JYWusv4Ny2M2CbanwO04wnB/EsxPT+OXXKrbRRE2OuZOhwEM18AKAfHv1Z1y+dAUXXj8Hpzgg9HgDxjqOyIpoPQg8zD41h8mpCVR+us7ALYE57b4OuzJBfHqORyu4/eNFlKbPYITc6CjNiAyAxVOlI53ZhAEe8i6gR2KI/UUbpcdymNoL5Mg4jmuPUOLjDGeHGEEdSk10gUdOHsKZ0fcwN3cMFz/8AL9/8zkKloPBKESevgeD57H0V2MBcLLf2f5/IjAlxtDeIWrTeHfYnAZT92zUaC0bO4TJ+Rcwc/4C5k7N4/ATBzHieBiUZUUFA4l4lXgyd0cUrLQDPDkCOMEIy4K+WlpH6D9qikgmQhhAhwAuz2rBXb+J9RvfoZDUkHeoWxelPBwltyt7zBZ86eQzx3Hw8TGR3EnDIUn+U72cLSg6nDjTSuPMaE/qCz1Wm1n3EPAyLAOi7fteHlubdayuVFO2YZzcCxRAVqc2PY8LATe6umtaLID2LhN6yOsj7aAnpqu6HbV57aZzUpqZwnPz8/jszwVEzajXMwXd/SBLZjsxX/utzRoaN37DULEI18vBK/rw/JxJOHFMQ8iwDnZfgeleo9jPMO7uGdJZW6b470LHfXNSMEsZGQlSmaP+aPOQ3PI1T566ue2wmZqZP2ioBEATqyJhGTOt2+3qtrXgZUavY1ztbc+Y+1EnWvX4VCewfLHTZSHHfeaTXS16d901evQ4BQHUr4I76GHERombW5s9Ba46/vd/rhb/SQow2D2vlQmgexQtCIMgMP4DUjTSvtvSBDdJFVDQgqMGoygt/tUIsVfTHqfFvzrXK5OB5S+6NUxBh26dR42hkE0AXQbxNB6dVjZlZcPOJMxlCludozEkNM0dZkXASiP+VPfPsm05BpasF+RJxx/PC2L3qcqMCHl/CsSk14Z4vAlbnY5Nel6E9U5D62E2CGQVtQIABGoZo0I9Jvy9xLeOrqeUdZCphbP1Jw2anx5PlmOFkWGIkNFvxnzftiz8AwAA//+UXVlvFEcQ/rpnPHtjYwN2WLAhJjgcEWCcGJAQQXkIz+SQ+JGJIuU9EhJB4RYhHAmnOGKIhY9d7+zsztFRVXXPjtfkIStZgFnb7Tl6qr76ji0pAMpq42mL9gu/aDEaj/QQDtHiSbhFVB3CNTzFFsQ2yen7bqGpTRSANaNzWY5aD9xGWbtQmKI7iUHOFvB9G70gug6vcPEl1k0ztdR7Z5aRo1TOkZtRHZtSoHxrsmHxVHfyqfkNLDLIkRIh0+FpQxKZQIKOM05MbXPhNDVJbCk8zvkxyUEIXp/NPWeTjEziTDZdPAUAwzEtRHNi2RkWeRJUO7HnUGy/UmOdZ2mKQ0Ud/Z4WB6DeMdBleKmPWlBHiUyNmIYs+f4e5VhThdRLeLpFNP4w6iNa66C9ssYN/drbZXTWW1hZXsHGehudVhv9Tohe12qA6AmUyHqdbEC5/HMl235qzZRTWwi6nH96Ex3xsBfjxOcncPHS9zj2xSJ27ZtBKajBpxipPj2wSOvUBVorwNJL9B8/QvjiGUxrHXXS+KvAbvDyiyvrM8FAka+3oGrFF4MhdqLC0gdvsMF8iKKmsiFAIL8HvPzfxen/FhBn+PP/YTrI55QeLEoaLwJiTCq6KZFo+KJzpp9LU7VugmitzRlX0UqIJOyjZHx4PSM52UhRJt13q4XO2h30/n6FxtGXqC+cAZr7MDf3CS5+9y3WXrzCvfs3pZnaDD1Io8oP/BQrq328ev0O9eld0DphrT/TyMhh296vdNlGpMD2FNPmFek0jUzjNWklR0pojG2HV63yFKUy2kC5XuXc/nK9hpEKFVYVbmhpH+IGgTssoen1+Z4N0CamvB5BmzZ2MhakiBflIdAZRwN2k4RZAPTQGx/dzj4XphMj1op19ARiaJIX9CJmXlBRH+Sny7csmgzPX7zGu7fvsWNyFL2kizJ5xnveptmsMQM7NzmniZTWBF4pz5poKnkf17wj1qjIDMA7bePatEGjURUjpVoN0wdncGLhJP64ex/r4QZ7NeS0VOPkCkr8XZjam+LN7zfw/t517G420Y4Nev4o1onumfQQkumO6WFq5yiaYxXsII2/NghIr5N5m+hrsFGVkZjFywf9fy1BVM4w9tU8Th/Zj6kr53Drp5/x9sYN1FvvUc3aaND0yfRQIWW8R0VALM7fBbrsgN5efLZsvQGVayyU7HusG+UH5ghSXcKq8dCpjWH80DGcOX8es2dPIdjzEaqTU4h8Hx2a9uQTVFuoFPaGYVReWbaU8hVqlQBmvY3yxipe3ryK59cvY4dOuX6g/YwMJMmmr2GAcQVM76zh4JE57N43Ax2neHjnLh799ZgbTWpyoyzma4dXQuweL+Ekmz0HZ3Hhm0vYPvUxJEQ14bVuBgASML3q6RPU2hsILLWQ9nWlCteSM+918V5DhYXIo4wTVIMReQnjFt53qvDZ9CxOLi2hvfoUXV6NyRuSnH/mqP4qRRgBVy5fxfyJY5goNaHLzohW59IZqpfpXpvc38TZC1/i9v0/mbUU2ylx7Jqy/PuzPoGbzJU3D7F++1fMTu4HGhX0Uo+L2mREokMze23SNdruh9he6uNwcwzzU8AE+YCwP0DCC6Fjnxo/B/8YQPAMMxH8nR4a5+ZxfmY39v7yNW798CP+uXsLE6bDcoSKn0JnETfOrBeGaNUF2JOr2R0gZQaF+f952auUv0+aSdFOzRbJJcjZe8ModEoBsuZejB89ir2nT2Pv4aM4MHcIuyZ3YpsXoOqmss5XhHadzNiUkgH8REsetef0eAnIPt2BNRPhJvmjmG2Iu0DV12h4QCWm90Z48+w3pMt3odJlJAT2DUX6+tbRO4H4RCyeOoCFxXmMVAP0rA8VGcI6TTXFv25qYsygEB+erhrrs1I8rp4eOLVzMlSabAHlHUOUDcuUFOk6k32+u9FF2I6wvLyKASbxYS1CQjVGrQFVrTAQwHR0rzRo7HNz2OKrwIcyevDkyIckm9eqC/Wpu3/pOojiGCHp2bXCxOQuHF9cwINr17D07AlMJIfFSfB4f7WAg9aivx6lCLrWOrr3HmC0r1CdPYCy56PlaXTpfNEASJGRmUQZS/a+TKzzpVIf4SlmIiS50MAwgE5/aj5/MaJeG632Wu5NoAuggrJMNzdXKZV81Or1vA+QhlBzveuGiPzstItICq749HfSnDsjOqaiW1TCc0lPedOVbmE3SA2b5ZIA6lWciTh9JPbrnOGdsIJlnXmEGxv3CYNq4PUk542i1wn0TS1IRnUARdg5E7swDPP9WRdqf97biK084ueDwfw6tw1tYB36h+tIDO05G+0N/j5Cr48HLDEaHlA0IQ1afWE6u97LufGboWk04Jz8QwZjaOpfpXuhH1utfMzG6MU10PqJ7cAGi7Y5dyAHHQMBEbJ88KZt7+Py9zPbg8o0Pc3jDWl91KcFNskhQdHdX44fAYPU+DswZhPTqBDLNzyUpXPKw2JijFi2xEA+LyaKIjUR9oQbUEtku6SUMNPVSdYLL8fEoPpZ4vvE5F58KOT4089wJvrk2ed83mQfkz5xeIzJnwPwLwAAAP//pF3bcxNVGP/tyW5uTdPSTlvaAmovCoRC5SLKDI6+MOP4oj7ov+n4oA/gk+O0iDpeGKojoIylFApNSLK57OWs833nfJtNykXH5aUd0mRzds85+/2+3+UARCZdqiyiyQttqia1DIBQEKg4HbBnHiMRC4HVP8jgGG+14b9lECAxemCmrNqYCMk2pL8PLfU+1R5lNgVlUbicgAIWtYozIEYKIFjqDRfdTPk/+D2y2aehdd+kYpvozNRJbPtt/n/WHIUBgxWiI2JPAXbIMxGFlBhBr/M7fprtn72haPIxZYiQNDa+cVOEWhZ3ulmZzqIPsi1oXCRTlOkxfTOW9KDgsQOscY2kh1bqWlGc3szEOKb6Rc6k7rW66Da7aNbr6Dd96HoP/n4Lj4nyVn+K+oNHXPA/fbKPTsNQWUUSlmhJBrAaN06X0kPaS22lCdIZjxPRR9o9zMb9Jtbpn7aTE6fW8OGnn+Hs5Xcxu7iI4lgFDrk1Ew5NxUizDuzvINrdRvf3LcSPHyLXaiFPmjaic9FDg+OyKU/qVCiUBqWHt27L3OBFhqOkM/QEATC02N/KDTLQBrxIu5adTwMU/MWvffH7aMRUXFgjQkeTpjZvjBMCMkSI6KZjwCZo+Ij8AF6Yg+pouJHxDSB2AG3IbmJ060nQReL30Wu30fB7aLciTJ/rwVtexvn1M7j9zmXs3LmLZrgPa+JviXyWjJuYTh999M6DPbxxdM50qoOIDeUi63jF2BCNNbkNl4vIjVXgFcZQmTyEwtgEqpPT8EinOjcHTVEvpSIv9kzhpIQA2qSUi04Qs2EZx4kpzdec/AvcchGFaoU39QLNG+WhaK8f1y90XxLQFWmEFomO6WHUQhmiqSSwgiImKU4o8vvQA26+3aR1mgjQbHXx6OE+askKswZMe1yMHYU6ntkck8Sq+SMGbDjKkR44qU/KLfTEdgfM72x8p2xB7Nh+sEMspQSeE6A0UcL6hXO4sfEDNr/fHLhbj+jgDRCnWesb1ndx46vP8cHxNRxdriGOffjsVh1xZ/RQNY/ZiQKmihTZqeFS7ro1MqKTiUV/KnS3DH3fFFkagecg8EpwCmNYnZzHK6fexO7mBra+voq7332LRqvBjICAugUcsZaD4yZwCWwhQDPrPpwWqMOTTEOMwHKmK5Uo9HMKHSqC2C23QBmSOHLmPM6/dQlHLlzE+MoSMDOJvufAp64/AR92s1Spu9hL5qAg8HTpKLO58RhPt27i1jfXMO2Q3KiXLjd5S6OmIqqogKXXFnB06RjGpyax/ec93PzpF7T9hMc0EpDU9mRdYq3QLeECVz75CEu1NXilKhdOw6W2PYhJVq8j3nmAUreLXGSMn162nowymuRaKgE8HSlCzBgTgDBZqmB9YQn36k9Qxz6v6Wpk4JRdIqmOIjzy+uavbKL23vxh5AucKYeQUy9UCg6HVPxNV3Dy4mnU1o9j4/pv6cwblePIZ+SVg2Lko7m1gd5qDfmJKkpqFhGzKRJo1zGgMxUvuRhjVY3Vw1WszgC0UpXpgSmJDDuM39Ed6PXl3qZ/ZG7lKUQTORTXFlGb+RiLtdP469pV/PzlF2hs30Wx20RVuai4lD7bhsfmfDqla+MZDLH/enCTwSmYSD9iK3pFLtD6ykHX81BeWMRC7RQW376E8soK3Pl5VGbnkJ+cgVd0ufj3GEAaeOCIXChFPeSS23Mdt+N/ogicnC5gu9vF/UaTfRe4qxUAVT+C3v4Dnb9/RCnaheP0reHycBc40CFKuTy8OEalBFy58j6OrbwKMvcKKYNbmzP6V2zHWA/dd6YIstporTNNpSTVGcOuw+J5NHrEltLGXhakaQ8T7NzfQ73hpzPv4KHSPVGRfKyQ53WFimFhv8GuV/8n3lTmFMRXKJHp6aAT9tEL+uhTAVyZwOtrNdTOnsHDO7ctY8EYG6pUoKdTJg01DojBopIIvb09tKJbLNuaWl5CvlpBM6fh02c4xhQxQJwp0obZajR+oZXRRNaraIil5Gh02k20/cZzH4VSz4RkwOJFqt/PWb8vk6bFMisCKW0RJAxd+dkUfW7aWZfiEAKO284sa9OVSt3oWQ5oU7rkILp4N+in3AVp2omsROoVWVMNCBEPvSaVXinp2JpkIAL16f3CuDNE/6fX5d28TTwYjKTpOFs/Huvppm18Jo1X1gkfmSI9CwhIgxF27ihO0LD6esvUTDIF7LPk1lkpt6mXgtRjwcnk7QtAkp2Hch4St0d1jmEOqDQlQI0Us/I+oR171wIfdF0JPJDrPmS0Zx31mZVNMm46R6vbF5kAnZdcP/5ez2GfEwhChb+wAHgOELuy22FAoTxW5uJcPp/fh0B1auoQ65qlu9SUGaTtiUxBuvTCDBfjdjO29meSZDgxyxE47trGDsr3FGYAAwfirUASzyiEm3PxDwAAAP//lF1bbxtFFP5mL/au7cQxTpukTqCXNCltSim0lCBA5QEBQrzxxlP5jbxQAREgeEIKpW2qPrhpklKnt5A63vVlvTvonJnZXbspl40UxXJk787Mzp7zne98H2fiVm6BqlFCaoMxXvEwi4M+jBeIlj0V9qidwcsOz/PTm4oHO45eOrjQVW04alOjCY2NdaCjvCFNvJJHgBVV302pKvnFidziZ2rOv0R4Jsk2tAlC5BgJc62sfcBRg69YBkozgM6VLRm4Wq/9H7WNA52/8Y7EITdj/oj0hmP+x9XMC9NuYL/Qw5YtdBJCqVhlCE4GqaI/hEeLO+ih3+4wDby318fQeoBW8jsO9vex/3QPHUr4W7vo/EXV/CGXo2jK4iRnQ+VqL2ohdOoneT0oKlAWnMU51dN4jICa6KBCWUzptWVaE6B8V6fnGvjy2jVcuXoV9WOzqNam2M8/7gSwyM//SQvY3kS41UTn4QPY/QA+9XD7vqqqkHCAINsh1UvO1VRKJKXGpMf2MJGimJq8maNWCvNLjFbmLSCHHMtxkF49YHN+ufnXQqv55r8jGXs9ClCYPyxOTpUphwWLN2YJdB0gjCDbA8iwj/6zA57vJOijkKiEnzZ0qrSLJEKm7a0UHspuBZ7wEVAA0QrR7vwBZ2jDHyYoH1/E6uoq7m7cwdqv1zXFNXeN0C04uoL5cPcptncfY/F4A0PX5kDIpQp+2edqvlMqoVI/Ar8yhYnaNIqVCZQm6hAFD27RZ0tCAjhYhE73+/GDEqqqy8CSY+vxV0FAEHbQZapuAY5fxHCQMPBVEBb65CIhFPiUaE0pn/qiYpXp0YN/oM/ftCuFwwGDDQQ+ULDqIr8eMrCI2DbPezHu399GFF2CLEi2QCwUPF5TQmTLRlUdlGiYeUOSNZZ0tDK7rcXeXt5/IrQKcMw/tOYceGUPy+fO4sKly7i9cRNx2GE6PkwSJ03Pt6aKsaZWH4+at3Hn+jd476sZHKlO4wAROg5R3SRmqg5qfoKKa6EQjVZFuMdVjycLGQoNBFpZLB1zYzDYX55j1YqN8lIDx2c+wezqZSz8to4/12+ideMGdu814Qf7KCd9uCTshD5XewUi/Vmj+3meXh5ZDobCQSgFIgL7HBdd20Ncn0Ht1BKWLl7C3PIy6icXUZs/BntqkqncdK2URMtoyIrNymWDtRVV1XpszEcqjRR46P2A2FKi3YF8sIONtW8RPNxGNe6hSKCJPle6lkkAr3gOGjNFnH5jCSfOnGJQ7M7tDew0N9V15hhStrHZ0vZ+py+ex4eff8ZAGQteWcrrIBOAg7KkGCYYNrcwaO3Cox5IpmPo1qA0ATHrwVjsHgJ+6w1oRDNAKEVwHgZiUNkulhqvYnFnGzvtABF6fA9GmjZu4AmSlKNgjkChbgj88P0vWHnnbSxMzKvKuMys/iyp+qdlycb0yQY+/uJTbN7bwe6TgN/nYD2tKpq0yoIdC3gyQXtnHa1ba5haWEa5fBTSFww8RC4YaCJHk2IxwvysjTPzFovflXgke3osPUVr1yQ2cytyj7yC4jiBGsoYAa2boxa8Kydw4ezXmP3oA2ys/YjmTz/j0d27CAdtuHBRsSO4cTe1xByVpPz/h9T8EAJO+raLjusj9MqIqjVMLy3jtZXXcWTlHErzDfjH5iArFfRonEtlDGAzhZ10jBWEaLOzi3n+iHS+kQJhlqZ0CygBUAKyzs8JNPeBvecdWLKI+oSNWh+YbAdo3lrHQWsdVbHHc85icfqZYZYr3btU0aJo6P13L2DlrTdRrk5pN1T6IgAAIABJREFUi1ML8WA0QUDKwhndy9I9aTyG0g5XMtbWzzkr5DxT1YDy4/Eu03MT5U5EAdD+sza2NrcQhibtM1cTj7wy945XnUBCyZmlFNdNy6HRWPjnBsP/duT3ZKmt7TphgKDXVW11MkZ9YR7L51dw47s1PG3t8TdHUMy/ROSxHpHWRgiAdSl9f/YYvVsJ7yNTp0+hWJ9E0SennhL2BiFfAherxsBDZmARO5ji5ESBAA60inyqkk5xao8dODKXDhXTKIHx0fk0veJSi8mRXzsLpFl2Wu1XJl2KfUtiiIoZY3NiZmtLUlat7/dfyHHoOkxPO+cph6ASVq7VOC8k6egea9NKkCadugpPSaxKMBNm4Q2NV72tbPIUOGAq/JpBTATcsKsszGVWwEzHOAdk2LpoSFRvxWxR+9d40o9crmEAbPMeJ82WEv4lFzbDYDAaAJnGS66QmtNfM2NtxlSxoxN2cDI++DS+9D08/uNja9jNWswQyNgUhmk9Ohc2x21CM3sTdj2wmE1OLFBly2in10vJvtCab4dZiirrRAKBlVi9mdvxXntz0Bwa5oVJqvMHJf/lcglBEKb6clww5/uUfPuLWT7N52SY45nnv9EUIGF6Ztrr9cQJvAFnxgAco8fH4vGpvo/SqaDvZxtAAH9Tdm09bRxR+NudXdvYYLBDkgYICQkBtURFRFFUlFRKVPWpfehLnyr1L1bqY6VWqqiUJm1ugubSqklE0oRAMME2a3tvU51zZtZrQ6sWCQECG3t3dud853yXfxXJHAVImdZC8QmhljeeDlLVJdpPuk/0lfS7+eexJzP7XieH/gedMF4IrOexGZKDnTtOFFB26mguGgbXMT/eUi0sG4BeAxs8JIP/L9PMDGnv8+837yNgO4BxIjeeNEyRMPiwWZxx9pWYAHTCbVdH3rvLOjjbMCiQ/sTQXWiTIjqK1Y/wxJ9o3cqT6AkqT7pd/jkNE5S9Iss8fS1uypRhX6Df0SIh2UMvgQoIAIboUoxbO8BWYx/t3XdobG0jeNvC3ssWF6/8tiKWWRtvADO1MhXKYL8SsiEa4G+nvomNHcuArDYmMzoD/FS0xW5f40vAwMkAimyfqSlFiqMVfPn1V1hevYLjM1OsgaJC3ScX0ICm/m/Re3AH6V+b0O/2UU1Dpne7hZJEclEWkedmoN1h12fNZoXZ3OwIrV22IWi3b+aXK4KHp/zDWeRHFXVuprXSR/58qGtgV7RWfS0cHRV74MzD4nbEWlUnEpetZLeBqNVD510bSSuAZ1gepVSADQFLryg6zR5LeJz+GMqM6MggsUKleydBGLXR3niMZpRgzi1gYWoGy0sXcf/Br9gPWhx5l2ZtChdJZj+Wgl7a5tYbrFy9gpPnzqNUr2H02AQ3AMqjo/DKoyhUj1HWHDv588RcFZmtkRo6cIJ44BpPdB+ESGvJlqzK6NR8eEUfqlxiTXB6ECGNKdZOSRFC16cSoCHNZHKMjWU6SEUMmfeYjPDE6JJpmk/NhEMTR+MZYhlS9EoeP/odrVYHE6MVnmJnEV85Pwm77STaaPmNyYxjGBX277WJz4MBpXCGNZGai2rPkUlXGIco18dwafUy7t69hbXbt45OlrCvwfirdDsBHv34Pd5fXkHt8ipHR4U0TSl57Ppfo0YJ3Yes9UsuyUJDWACOAUn5tS9L2zEu2eZx5KxP8qRSFcXJKgPHhY8/QevZM+xsrOP1+n00Np9je/MpvPgAur0HL+0zoAblZaYgIpmV8tGjDXF8AvXpGczPL2J85gzqC0sYn51DdWoK6UgZXVejQfGQPjiSMlHSXPJNokucDo5l7XVt2Q35Y8lxttphkKuICddq4uHNH/DilzVMqJRp98qcTwL/Y0phnCbmJQ+n58/h+OxZjNcn8eejp/ht4wl297VMp80JErKS3a8S1vp/+sUXOP/hMrNV+JgnGIQR9PfdA2CbvDx24JNshRrGSd9U5f9MnR091IB0BXRxI5WeaEQhbrZQ8z2szJ7F840dBOgwuIiyBkK/jRmbAoVw3b176/hj4yGmpk8ATklYJa74Xlin79BJUaiNYOWjFVy7fxXffvMdqxZSk3PBTeVcl5Rc2os8pOjhxfpPKF1YRf3ELJzSJNpK0DzFk2mfnJ5DXKjXMAOgQp4gBMwdgahpH/cecT+XDhf5fAiwSxG5svupQgH1G0u4vrKES599jhdra3h26yZ2nj5B480rlKOAWS5+KkwD+nSNhIhuAI4pkh0zmuCmtbkX5r+X685Fj2qEQhGVE6cwNn0ac0sXUZ6dQ31xEcWpk0CdMgyr6DgJM5nCXpevlS5RkV1p1KaZwt9QoQ1Dzy4ZFzmKOez0WLM/QNUFPpiu4WXDQZOYZd0IpfYBmg9uY+/hz0iCLbhelyUJjjmuCjqb1BckWgLv1Txcv3EN84sXEKtE5AKO199/84V3HshYoo62U1RhCXFyVSosPmsWBzPZy6Q8dqo4dGPP7+0kR6I902VLDZeZkDvbu7wG5UjJjS/N6gI5QuJv40NVxqH9Ijfc+x8Dd0l+zf80bBv+yNcPqXVP0H3jzsSR9RmEEe/ZzU6AeKSM8lgFCxeXcO7MWTRfNxApMb9EznD5KLRblIR99PZfYevOHtzGFupLi5icOYWuW0GlMIKWTlmuEVAkj+tkDQVqyifUYCXJazb+cTMPBJIDKfLgoeZyIQdFdL8JeAiiKWFSZLIPV6bIxNhSRsdva3BPCe0/01grleXnp8aDjH0hYmlMSkqXeAjEGcXdycAdNaNoTRIDOST6tmGHJlFi4q8pRltn6WCJ0aDn9fCuKwxmT9lJ7SAe4eFlwWdqPA2fOoFo4H3a3wyrONTiNSAS7CI/xl6pUUei9qJeLIkXkYOI2BHFESShaOi1a9dfTs6aiwq0v6WhR69n8Jr33/wUrFw8H2VHP9vpNsc+KqHEC/OiP5m2QNgzDG/CPOTJxJjTTLYtvd1+xAycfU4pYiY3eTkZeYZlWNskN2YDGP8P+xyE49jrwKQfdKlpRokMOal5Hv/lJRF2IMUDWQPIMwaDMZWm8xtQKoRZR1wvUqOdUrBMvDwdG3p+rsW6nYzBbZsB3JAw/gb0PLS+OJI6N1zmho/BlHwejKtunpFB8nhmkBt2RBhG+BsAAP//dF1Jb1tVFP7um2zXdgZsJaFFDmqipgxKOoCKyqCoUoXKqkhsECzY8MdYsGTDohICVISEhFoqChQQJW1ocdpMbe00tt+MznDfc1LRReKokqf37r3nnG/yuORQCqdthMwBQz+l3ZtSO8UIOE2XEilg7URHtCdqaEfNbyo3vEVu6EIYjQOMVXdRI9fOND2wATKypKYRgV/hptdoTKCjWcucEUmmgRWvuOGSsXxMa8jAJhJq8EfTH9YXU8GogwiKGaSFJWYJkYTfKB2EXoMpK2OIb6aP6QJEmvmZq/6OXs86gHKuZ8LYElK2GbaIXQaX9M662JJc7ZGUVmn0pmazpcxwJCNnScaGfweJh4DQoBSomSrc2EXeT1l3nw5DRPsUszfAoNdH0guR7CbYe/gEu7u7PBgIyawvjBBFosWqymnOBSofhP+TmvKMF3n+7B+ZFgaHybnsca6oUTr2nw47/NsmTjYwQV0HmJxs4ONPP8H5d1fRWTqOZqMJJ4lQp0130Ac272LvxnU4m7sIRpKvbbyK0JRyeUZGka1hlatu4Fy7JXyIcC4na/zLY4YKOPqeuMA0pXkTPTaKnzmFwdpBJANjxXXBMrEpC1aDOF6F87qSJymYKKr7Y1SXmRE+08OlynEEsgkjttrPwgjOMMKwt88DHp+K22HEQxIvocPbl02WnHPdgwZHlD/LGfVZqo2NJiFwBIODVB1OG46LvUc9pH+tYRseZpZfx/lTZ/H91e9w8/Zv3KSWSWk5MzZTRueIlpVja9BHe/FFLF+6DDSnRGjKkhj9LKy7K9viLB9bZ8X3VQ5prK+qRWxcoxpm1iOkPEwjWhSZ98X7QFb1kUcJ72M50dd91cs6ktFLUSlk0FShgYDvIhzFsiZpX1B0hA2MHIkOK49OQZtc1omLrprNDzceYHNjG9OzNWnqi0FTSR6BUvBtBA/9LbOvVBzX6aEnQz1HsrUKg8zxi8h+26nHDTCTeNmrwMHSmZN4+8Iq1tbWsb27w+89t40SyvuQ1jRpfWncEm138fXnn+FiawZzS0tANeDoqpk8QIs8QqiwAYprzc9p182YcSeh2alGutGlKWK0VNudZNrgGnnr+ZQDpzmBiaMraJ1bwWL/Mvo729jqdrG/s4XenXvI9kfo9/tMg6TD1KI5XuCgMTnBiOFku4XK1CTm5ufRbE+j3ppGQkiEV+HfI0e2Nt5tycE5V/SaJhKEQhUmTZJ7TPnwxAIoDB/VNZ4/dxFDBS743FGG2mCAOzd/xJ8/XEEQb8GNhoxqWjO8gHLVjUHLAzpz01hYPo1jL60gzzzc+/sefv/jbhEdltmlzrOtTIwAXeDkqVfw3vsfwPHr5a5rSuqvvE+iTYcYPfwHESWfsBG1L4MTnUAZXUdGmVa8Bov8ZWU55NCGTQqwYvCkzX/RdcWEosXskHdydgZv9Y6jf7/PHIAB7ECr3PQL/0oD9HspvvnyCt489xq8dkXAAip6HGmuZY3IdvH8/BwuXFrFrZ9+xfrdB2y6yXpizX/nV9HOjZGyPIK3/xjr336B2WMdVP0VTE230E8S1H0qFEc4MTuNhcBl6n+djQutKtpAVOm+5O1nZeObo/S44DR0I2uP0xJcaZwfUxkyCTinOzi+/BFe+PAydm6v4861n3H/xi94RCyhjQ0Kykct3kMtixG4BFgQqzJkhoDLo3IHoeMhIuNKQuyJGVSrIw8qqE5Mwm+38NzCIqY6HRxdWEBzdgb1mTZMcwJOsy4MCtobmCpKazNDlTS4cYZ9ZNiOM+xUPDTU0UTG7+VZPn6PKXue/6W5+LwQ64ZYgEEEtKsNhFs9NMIU1Z37+PfaV9i+dRXTJF2xkcKwEahyjnqC/3PtceHiKt545xwyE/FxwPna1CQ4gcgVHVfZX4I4Wr8pMkzNdcgp0gqHh2DSVLuacCHAje+Wud9FjLEyyfiMZ5Raajd6fj4bdCqbJAbDpxG63S4ePthSzwSVFChLZNzYkAbCacWD32whq00UnhVF81tIwJQGbUyhFS4Xy5gpqv1p7DVwin3JPhevX2qijIsncYSNXo/3uZxQ0DzD4okTOH32DG5dv4FRJsMfd3xom1tWo90Jc74XNVUfuRlh2F3DZr+L9nwHx15+Fd5cB70gQL/qYytO8BQpQuIrVVwMR8J2icIhQpIWMrCjvhqcXsH8GongLAmx5T58aPzGjyo+qs0GRlDne2qUybcFWcHw4LqPVjA1kQwq6HcWxZwYJQ2dnLXuWGErOnZPGbo2QpC02eQXJPFpoAEDeWKNMmnSyfRtlOBIpcqpKOSNQ9fgaTjiwfJhRDgMhzwEtxFzvB70QOT6nhp06h+MRB2TgbFEiUtWvsc67wgx1TKOx2lbVT0P6DnpHvVdicx23SqI9khMsTjMEaURag2prXxyevQclvBiLEOGvUOoJnakZueeLUcxqDDKfrCmglRFeOxBBcRDZTbnRrPmhW0jbOeM11PRoCqybRPWikGOgiqMZHvgzy3pcdT3jdRHrWRSUyoH6d4T7UGlRzQao5eq4Z4yfpR9axnoVvphGQH0uWRoEBc+bkW6gsorDrMoaIlSnj8b2DNoLb4jYkgoB3PKUfeeAj4y6LUebvS52GtBjfCZIR9Rfybfle2Z6V4gcNiyyO09zVsHeStUjogHXCI+MCVLUQ0saW+hfpwkBcSkp6GX4+A/AAAA//+UXctvVFUY/93HPDoztDPTlvKUNIUYwWhijPERXShGTFAXJm7cGP8pF27duTFuTDSyY0FkAVQioKCUZnhMaaHzus9zzfc4996ZFolNCKXMdO7j3HPO93t9fi5hLfn0pRiHSjZM3qLLnnRZPmEZbouw5BfH6IdmaZHqqJ4KKqrp8ygpM9FehxapyUEAYth98cNLi4YKX0RRGSTi1aGHQ9tkkAWBj8kV20CkXlJ5eGIuLGUw2MRFlYwoi1ROYqRjodCFJJmWm+zreXH2/7fd+Fa82tT/2cGXwW6yEmnORcii4yAYj/kG0rWrOVXUHZlYOOAszWASH8H2UIr53S1MtkaY7IzxpL+F8c4uotEE8WDEPv10EKMa+HBC5Cmd7O8iT+nzkGZ7zP/5qukvJaSeGdO1n2TPKzBh9W9FaFQb+OyLz/HRp59g9fRpkSWlIQdoOU+2YTZuI7q1juzhAzjDEJ5xJAzE87S4lBhqZvytpFHPyskTe50czCmCpJ59nPm9VSYzUwAjv/+WKcxPXpmFGVlcQigs/Uz7XUtCGAobAe8uDUv6hYIWJt6MIwZu4uEESRAiHAUM+LiU6pvKZ9HCw7YM3cpKG0/tSV+mNfS4eHNjFyhlDrj3s8rz6PdVfAcNL0WNjqu/DfPwETq1Jk4sHcSVP6e7AQiIqPI8SODYThgjnWsA3UUYvylssePnSpHZHPcsP87ni2Pd0sYobwGnkyrL6L2KFP7ak5jUJrxYuQJ0kDikkvksT+XAL0LmqfWdthWy7BC3jSw1Kpry7874N0bDGPc2e1h7+RhnEvjV/dv4WQDDLrzcZ1gDMDLHet4hwIIrsk633GNdCzQKCTTclklYU0r57x5ZxOtvv4n1K7/jws+/CHJMjAPJG3VOk9AjAsBU6GzG6N28hks/fI/3vvoaR9ZeYDCsBR8tBgjlOUlcyzKVrDy5B19yHeyXMdqas+x5zgSsEYbMlZA+tZNTmj5qLWCxhaWTqzhMIFZg4CUS7kTzvmTIuBIqRMw9gbu0Kah77I+nCAzKJ3yqeU6Ug1fC32a+CuXKnvvjiFLJ0RttUATHpXbvTRs2k6EZR5j8fQs3fv0Jk/5dHEgnOWBquVWS/lMnkqZHHTaP4vDJU5jrruD2b5dxY/0PxInDBXOQSdq81gQMQrAyv+rj/fPncHz1hDKwugdwTUm6T3NGiGynD3cwQp2TjnQNy+e0/yc636/NVxmod72MgzQJeGimLl7sHMTNzTY2sokWDtNrpJNNPzOXL13H9avX8drZd3l9D6Hoh76H5kpmcec8nHn1NM6d/wDffvMdK9DE5+qU5gF5XkS2TuNmF+HmOjYu/ogXFheQVFLEzTr/rvrCHE60Kzjo0L2hUE9b+LrKVTr5OmHHb6rzO//JRMps1Cuv1ImMEcm9RaL+h9pCE+1jZ/DOW2eQ9b9Esj1A//YdbN/9C6PNO4if9rH7+DHGgx0k8UgAAGZNSUK+iPZ8B/PLy6gudNBY7HJL0+7KCmpLS8DyMrJmE16tytkoKWUcKBDHezBj09pLKU5uxkUatZkcawcTsaUVyfTlgr88BIwyStRNJ9VnnGqJVuqiE0ZoPNrAztWLuH/tAjoY6Hno+oQyCO3m2oPVo22c/fhDtA8tIc1CyUHRYs6qvcrsFkp7sTKLz8dmpKB3Zl5nX5u/3y0mMSdNCxssEzcpe58ZTPYNImJBIw/BKMDdf+5hOBxP2WKAYk9gLxYx7BRe67UOIKLOSYB2H5qhR0rWQMto83HuUSXKWLSHnen+O93n+aTikebWrd0RQiLBshRBnKA7fwBrL51Cd2UJO72tvDUpZjpITNmJcsuGWJnqcYboyQS7w6cIevdx/JU3sHJyDUvLLRzqtPHATDBwKFQ3Q1RrIJqESKJAetXnBb3RJ8yU1m6Dvbvr2fMChzYbtRvz92mar5Wy/fA1CV7XuRmZty2sLCNfqVemQBdTUoewtsvRBYzGAnW4MFU0qi3Max96koIEZsJ/J0EsBV1I4XUNbuXKuLJT7BxclWmX7WRUw1grPAeUM4ue7rGo0AViMlQVLaRCaNTbiMiOQoHZXp27+xw/dASL8wsMDFScFmciDCdD9LZ66G1tIHIpK6SKOAiRsXfN5IkQrg3lM8+/H1DQweYPcP2m47d8nYVYlXyZcrtCBk+UPecIabcI+GNGnzMR/Pw6WHsAQ6/M0ns5cUwgw2x9JmRzUbhLIe1OS/9VUcrvZduDhILafSmrCTjvbU7vUzFWrK0joRpO7wlb3Ni+UNjqpdC3OXkEXgpxzCpy3xe7eCzKdT5/nXxt23w6T245yeO3YGhF+i+arfxnqh7ICXwOl5SOfhYEYHDExDAmxb8AAAD//6xdy24URxQ9VdU9D9vjV8BgzIZEhggCykORsrAi5YWyIMkqC34yG7KJrEQoUsgiyg6Z4IAQjpFBjMHDjGc8093V0X1UVxvbiSKlNyNbVrunqrrq3nvOPecIr6MuAsSbq07ccZYlxkZ/RKpMBP9JWhRcnWFhsThgPDDOxkmuCRxMqX9jEOozlV2f3J96KRz7fLZE6MDLwHp/tIWgfiU6GF5FHUovCttxEZbR2sPIZ+hPCRSS+hX6Jr1WjFOTxoOpRhv3lZCdZdGFsBhYab9GJ5lJm9JjVsjhNd+ckwr0KENCFol7Q/bT7+0NMO4fsKBbb7eHUa+PV/S5O0BxUGAyGiE8asihKHgkijZXu/9js+Hh3u6TryO0aBsPlGpjRrAqih7M4TnjymJSIwd817/8Al99exMXLl/D7PQcXD5Gkh3ADnsotzaxf38DfnsHrXHBoh9ciadENgmwGU5U4rOqwF8dcjUhyUCXFoV9x1VNV75G9w8jE/6uouTp7WrL0bCnuv4+zIn63Ms/ctKUSo4TFKgTBY1oySMS4dtn54XJoEA+pPk94MS/od7nTtM/2jRozIiuxowBpQ7ZWM04pFEQnl2qT6GfNwYNhVVBv7QhZJqERGcMSvKCMyn8iz68HWI+IQEpiyFtf9Xy1+puCIdLtXpsNIFGi/gdqgfxuuvv/3OFTdbpISPWoPJ+O0UMuDruBFl3wW2CnoxtMRQtK+WQJpvLBiHf/G5GBoJQj6EtCBLEBor/wQi4e3cDH65dw2xAG3j+JdEMtj/Hna5yYCrKqh6UITkua17fh0IaI+sgHH7EvKLi0sUrq/js80/weOM+tre2kJeGkTirkF5YAiUXSRWVyvaxefsHnDu/jMuLN9FZXEZKSLgiv4WyRAQBFVocqaHXCyNUPOEjwcs75j0qvgwLtdYsdVAlU4r16JKk1j/qCqHgdjIljBTRRwi6I3EMbFOBaC/iciGRUUa1JMn+qL1XNeb/EOWwh7ULNzSVr3co2jBD4GAM97KLzfVbePTLj2iRApqRPneZGYt2meMUDJYSg6XlOaxcegvnL64ycvxgYxMPNzaxn2XMUCDxtkx31QTxrLlw9Qre/3iN31NbEba19GIFT+XBHgyQd1/ADsbAyCN26IlKq+QR6jBR1lZToPYrpHmimKmVCauCJvq5kYiGxcRj3jaxuriMe7t7IGPAcWjbOWa86R3aGwE/3b6DC+9dwuzKKViTxqSEkCo0RHTYlWgvtrB2fQ13/7iP9fXfEFuAQtNR+DaG16orJzDjJ9j6/Xu035jDyqdfw7RXMEmmMZ1aLKXAohPbP44lmKgs7KXCCz7tdQ8LzvWFCUWsWPA8ef2UGJO4pU0wIKQoBZpnAHe6g87qVSwUl2ELoulO4AltzCcoJ2NuBwg7pLEiJuoajhkSpD3EGjZOlDG8aVGVRIoOPtheolLHd9YohyrY+Yn9FotqARhlHlkahRdR85R3qFfzcxUfNcxPoMLB8wnwfC/DsO9gd/tId7aR//krtu98h/zlJlpmqIKccUzMocaKEu0EuPHNDVx99x1xQAnFaqXyRyECRdYZLQT3mwc2aanPTDFUUUa3IdTiternYzQCgGABViqKlksbJfVpE9pLlmCZw87Tp3j8eBuDkTyS1yJYRNBlrdNckOp/OtdBOtPGkOJVEwOD0A4VnsXZ6Pt+kh5WpUNlolC3vCayn9YLIlbZar1eD4PRPgMjhJKiM42Fs0uYXVpA/qTLqvOT/OT4OcSwVd93KSr2rhCRsby7i4c/r2Pv0T28/dEHOH9lFSun5vGq5bBXZBjkI/QHwEyjgdH4QAsAYS5JRTyrigAssmglfopE9KNjUdl9O0kAyyLkC6iS+qrAcMy7mWjuIDG4q9zNqrYQpXIzpdoKC5Jihk6zjU46hbNzZzDV6mCqPVPRqskOfDjoY/dlF097z9DPhqJHoo0P8rVDD7nkLEF0LiR7dG5aFQykYg+3MIfY0kjpjIvJqbRKMus5T+HKFIltYmF6Fstzp3Fx+U2cWzyDmWQaDeadpRp3ZehOunjwbAv3/trEoxc7AAEkfij6SSY+o/2XuL+O4tdbMSpqvDPCWKhZ3tEdWWNJE1in6Lt18V4sfs7tDtLq6n1RofQ0H/W8kIXGbbD9U7e1TNB/W9NFq2v2eO8VPFDXtMA813eP4r7QOh4E/ThmbJCrlFDz62uKQWTdk/h++i4FMJ3niIGIw609bDNNmg1sVylJG+1jlL+xnoUm/YERREWf0LNfv3j/y2XPYhF7f5S+TXk4u6wUZAUo+gzVBeBvAAAA//+UXVuPFEUU/qq6e3Yue2NvsBdAJBsiiYgGDcQHNEZ949U3/p0PJD74RDTGxBijL0IIYhSBgLqsu8uyMwyzc+tLmXOqTnX3MLtAvxBgZrq7urrqnO985/vCUd/y0sAxmpP/3asIQjtxFPt/lDDTRYpwQVEwoSSaJLTZQOghqZ90Q0f5J6SiVq/7B0TWezQJ6AGIZV5RZd/6Uqb+vMI8IOqYWOuxzQKpNcYxf48emHg/smex0xsQmwmaSFFUyb0mC4edfOWFRaoAvppkXEzGfJPUqcjaZLJO1Wyhv2cBJvbJdDXGoNdHStT8bp+r9+SbP2j2MNx6jqQ9QLv1jAGAve229WntWT9pAswlGC4qI+dtXeaAGterHfK9g2pHch7lKsg+mXYvh0kTT4POnD90VvCslV+XRefNM+v44upVvPX2OfZ1V3GKOiGHXeqQQdMCAAAgAElEQVRr3UD3/h/A9ibCOGFaFm0iNmMoJv85ZfdlRwnFl/slZkiW9zqXUP6sTEnnipOLaYRSK6rfdg8Lbd++j3sM04lSYrbEBPQYDLoJWyoSe4ME+8iNgSwXiVkbZKGlhpG4PTRvRMVroh4wmliae7vyNoTUC38UnpPK70NrEWJ0gBUHzQpRo84bnyHFWFosKwELPma1AIMwQnOvibvbm3j0+G8MWP/XeCq4JP7FcY9qobX/yuBMVfEa8NLrH0ULFNmUlGM78EYaaGd3ZS24ImWDhgELRAae7hwQRWqYMACgKLtMMq82kDGZsVwd1U5ImgLAv+4/Qqe9j/mFWfvu65EgFKlDHvQLQIBx2YVoCwQyTkoVovGDxi+zlDmaL7N1nP/gPVy6dBHXt3fRGpA4W+y5Y16sSvrqaXwoMOk28cO1LzG1fAIX5pZQrS4xeOCvz2l2MPTBAakq9ccbee/UuPBtPBsC7vMqZ2vaV8dYGz9l8qSrtPRmNvFnsbzI4mkoVvtHGRqveBQ3a6P9gubFTPlOSFeD5CSetXH72+u49d3XaCQdFpmkpI6YN7SJk9tGjQXTMjSCFEurKziysozGzDT+29zF3Tt/otfpMx2XWhUYgDOpSwCpZ7HBFd13Ll7CyTNnPXMkX89lDiTW9//5PoJODzpWGPbifI76hdlVRIrjMpIUvYqTSSm4dmsvVTTmJxp4Y3oea60p7KQ9PCmsq5kkpgWMlq7mx59/xSdXLuP8sSPMVNG+T0FbXZjMApFqAlg5vYZPr3yOmzfuoNUcuPekPBp2GbQPn9tbWo+x8cs3mJqZxuyHH6GycApTEzNsx0gaN5Fn1mhWKmfrXKN8xV+sakXB/rChGW3TISEzqr5HNc32hwQoUfhD90j6PhTW01wh7Dp0e4g3qZFCgtWh47Ej2zTql6b5Eccpg3OhY7vIZ8wBFym/ze0/3BJj0DeGBRudBJCv/HvNjsL3U/6M5uR/dwhsNhNsP+1iv2WAnU2of+/it++/QrJxC5O6h2qk0BtkI+tV+cLOvXsWH392mRk8GfnTuba7YpKhoMYDLbS2O1BTpZY1GoqIZoGJOW7uimAWi4aJwKFL/o37dwKA2+0mAhNyS93Oxha6nU5hPPIFhoo8xoFQmY7QJ8CqMYUhWaaFTptgzHXYApawwA6eWfZ52ESXnYmkX/sQAIqOp80mV8rlt+ePr2DxxCr07Xvs6f+Sr7+ww1SDCDobWgFBSjySFLv3HuDm3hbW9y7g9OX3Mbe2hH69gWeZRqtiNU/63X0XQ6pSLGrGaIAddtjqsKuoMnASWb0skzmNGBGLNQySFUUhtavs5+ceWffcvkvMR4rNCPzWiUIjamBlZgnLM0exPH0UEdnVcimGpD0DpHMxzFyCvaMtPNx8iH+ebGCn84SthynB5SKospEDpRTEQg4j7cW8/Vg7V6ASC8A958A7NIQYdoe8D4eqgjCOsDg1j/XlU1hfPIm1yWOYRI0Bvwqq6LOcZoIqJlCvVLBwfBGrC8fx0+83cH/rAbe6ZXrodVcYwNcpA2zjckP73qS+BYD75xOr1SZ/WiF0W9EWVwU4hwUZZ+n1F1q7PE/JO7VL9CtR4N7TzCfBkphXa1XWSKAqOLPHBqnrmzf+95ia79wPRIvAu9BRQuyK27ImsL0hsQqJwk/nJea0E4UsCsJ7UIGKtSQEz9bt9v6z1MaenCcTQMluEtaeXXToxEqR3KUozxQWgLSzexE/52IgVoujoBZdCwvRE1DuGPbF52Gr/cQ0sKL4dG4pkgVa43/Oru01jioOf3PfS9Nstk2bNtWQiLYUtfUCiigIvogIFbHgk+C/5YOIgohP/gW1RX3RVkSsSKD3pMbNdpNNdzM7O5dTfpczM5uSFwNhyV4ys2fOnPO7fBffVzV9r2Z/x1+yTCBmD1h3DLAnaC0KUKvURGFU8rSAWas/K+IXs0qjXIzK19JXUQu9KQrh5NMvIQjYtzGrqUK7s2qu9GUbQYOTfRpQgm7QRJ4qr4KgOVa0oaoMmVKV3y7UFhXkOLNBq2uEM05ic1OGt7ncWaNgjwRR4vFYxDeyHPONFtuxkX8qVfMowfdGE4ZxJ+N9jHp7yAYZ9gdj7PT6eDwcYnd7wDz9ZCT8Em+q3TRto9Apx4osn1pBNFSiKTgYHBrzv5L/yrpEet6u+mrXu/uoJ5XURVRgF3GTWOdBYWOOVtdghEUfmFqSYJSXX5A4cYjLn3+GF998Hd1jizKvaCGhNLO3gemddRSbd9HKyNO5wYkJi3fVgtxKFEhahcYWIowFaVqIo6PQeK8cN2k8qGglfW/fL+G2Rq2CfHaXEMsX6hK0QxFx5K4BCcuYoDwXHqs45zmQ7pO94oi7yWSnmBE0Ls7hpD7H7SYTaoCTZMw1C9wGw9kCgpAbV+kEBfON6oknLTxVJ9WItR0LaeoGGYo/a0a2MhQQNyK242M9CuYeBZKshL5UpWnhJ9gVZVQ+MEx3MRyN0OvtYZDkuL29h396W/hz6x4GXFfGoVrWVCtpdxfQPX1Kjb09TR3dWqHqANSxAm/KMB6clyUCo349nZK2IdogmjbnRSn6aSu5Hhc21JOc9TZc5tnRikO+yYHV/0gNzF6MIMmx19/B3qMdPlLOXYSAO3ZW7V7mi4qQAtjY7OPu7YfcSY/aYqmHsiD6tPMEd9IL0SkICWpGWwdzXl3uarEgnCriZuo573qa9WZKcTHqqR1QAEzcOAen15bx/kcf4FG/jyvXrooKLYetTm08PV6bfNr0qfucT+CMB/jl26+xsriElXffgn98gduXGfESy8uVz9CdmOtmrBiWfaEmBGh/tOts4WmM3tFmH10ScWSo3u+X9BhdL+rTpToMU/Rcc0iJobY/POXtjMMDQplm5eIi9AZH9FKa9PTWAJs/XcPP33yJZGMdR4sEvnG47xLmQGgKtIwoptPv8lIXp55bwcq5c5ibO4Ib925g6+F/SNSXmOD/MStPOyrO5WKXUD+dDl57+x0cWVhA4EcVjcmxntupTILRCJPeNiOjMJogSItDqA+YzRhRoSSMORwtMTOeRa0aQ2u4chzNZIrlZgcXFs9gY6tPmvrYPZj6mYq1QOihf3tDXP/1Ol565Tyi+SZi5k0qz9QI8YVssejeaXTncPGNi7h0+RK++uI7+FWJDFEQsp5P1b120KJkmaw+N2/h1pUf8EI7xMkjEVqdJoJJyNoK1Aml8U9Myutfrsl/rmi1VK992f2HIHVmYPK1cbavBao+j0KEnyIVXJPiMnUYC7WCdxkCLJzs2t1Zm/uFZWoZn/nk/B4v4P02qyHGbTfcqOhZCS3Wf+lxgdPhe400AYZZgYHvoePKHKX3BVbforDFN4OMfOFdF+TBMKSpnwJ/PdjGzn6ImJxm7t/E+o/fY/RwHXNmyntOwste/Y40XHydKjLneCfAx59ewsrzKyicCR+Yrc30fvVdxS3UC62+2qNCBPeYY+wFyPZjET6meIe6vJ5WuT1BYlB8Rwm9jUNp3yfx1CQVZANZIzPsnyC9icSK1DUnGibR7Xb7O3hwdwOD7bikBbnqSFNYPRot2/F/bDcRLh5HHLgCBSc0OcPSbeJub8Mq+Z91MFB0wAFtIdjYpf7OGrXHYy61XHHq/j+e7LOaBNkq0mSbP30CS6vPgsIUr0DpvoFD1r/ymPpIY+wJOL4Ug6TIebw7xvUr17D54Bbe++RDrF04i3EzhFlYQprF8NOEtQDcKFLnoUq4sNmK2J+fQ/AYtbKDVLIsgJVNfyjBpGYeFa0mCcdHsk5oLuDI+PgqKlBk0wqGrd7/1kaQYlSPYel0LUPJQRTm02404ZsQfhJgdfEMzj9zFg2EaKPFyZbH31pEjw3vCALr7qzOY/nEMm7e+Ru3tzcRFwnT8wxrhJH7h4/IF7iOY2wcJNQQC+nmGEEpLa5TuU0QnYfmSdNrSaKXOFjqnMDLa+dx9uQajjlzOIomQi5LeIrcIBxCyGcY8mo5wbnmGrqvdnH1jwZ+v/8b0tBjpAsV4FnPiPSiuFBJzdCichBy3XLukcsaCa4LV97lIqy1JWTUtFMp51PcQYVQTmqt7bqK5JHgIcXU7IlPmnBhS5q4LGaeaq5W8GetO4PR5gn9TYhzygdFYd8wakdEP72SQ5/neWkBSUVT2ks8bxYmbyc4x4dcPBCkiNWvKzg5z7n5fJCKZAsKPH8UHcevcSHDaiZUoqMWMSBOE1IAoeeJEs/6eixOKcUAQTlJM4jOnxEVdC4a69JnBQkh9ASbx1qkhIhNiu0fnTs9WrRFFEV4AgAA//+0XetvFFUU/82dnZ3Z3ZZKC4pRaIhIGmOqBvGDosRHUEJIjH8dX/SDid9MTAz/gDHEyBeIkIC1sUig8mi7XXZ39jGPa84598zcriCExJtsWlqyM52Zvfee83s91tqR38zl6ddrvMS8PU5noWg8HUCL65x1/pYRFKbjBnU3LnMFvLjjF5LfqQj+DGNAcyOlexLtaQ4EjndbXXBPUqAXK3MMAHrfxJkf7JnonsF51R/+w0LoBDmMk0s16/SzAotBizftMX14uhPOXc/6ffR2uhj3UvQebGG408ODu5tIt4cY3huTZxOIMUOTT9KQibmlqJdTyTd4InTKxKCm9GvmNWa6tao2C56I3T/bUKRwduNsnWqoNrE33Dm1TmqRxAn2EXRclBiOh9wM0PNShEHX9rSUTfUnZ8/i1JnPMLe0yBvvdmE5Lxt/38FkYw3ZrT/RoVg2WqdZ82xqBN9HIF2x8NSNrBs6wbFHQy4NrLDhdFZ5LlR7nvwMb8CiMkAUSCEpgsuSETfmYE6Jxp8hS8coxznG/SnLOYjhQZtjQvfp+aAlhGzyOQM5bKLRcOTVSBYCjfbIfBYKO+bOuOXE8hGWmkE6zaw/ctGZtEATAmDCmCcW0qaa2GXpI0EYJ2w6OXFa0EE2RX80wC45OU+HuN/dxNagi9vb9/FgkILK4Ef8KjHBfw+6t835fYg78+zyzwvCntjK/4cJoBQqmhzDQlzemZ5Jei5mStSaDUYYqZAOxBXbUmTaNGPjubw3wO7mDnY377P8Qoc1EiepphdlRclmr0lG+q5du4m3311ljWHQcAyhQCNS65cUE7ZiMMkC0OQFkw2M+KEshRrMOjfjHMP/XeryIssLb87NwWYnwbHVFXx05lOs3/0L6zfXPBKmDKvbBI1lYp+KFFs3r+LiNxfw1dIcjpw8iebSAlKrLvlEcxVD07LSojrzP0+q8LS7GjgkXembTPGn952djv3peqabucfaQlnDz4H6+2MvaoS68UmnSDQ9alb2c2xevYJL332Lye01zJkMMTWSmXRpQTyvhP+ds/4/CYG5xQ4OHl7mlAK6kHc3NtDb7XHxmTnquSQ+WOcFYZAHEY4sH8XKG28ibral8PAo9SU719M3I+DRQ456BaGuE4tq76j0CV96onG96gL9PBeKEbVaK8rnRXpJa3A4mscyFnAPXW8tklG4UyqdH0gvy3Hpp8s4f/4cDnQWGO0nGQvvB1A4lpURhMqWWDi4H6c+/gC/XbmOXy5f53KCijkygpptdtPzQZypMh9gtHEDNy5+D1NmONo8g7B9HJOwhV0DNEOnH/aeo8Kh/6Snz906wU0uvWwV7dinmNd/qPqHyC88JoTHxGooPdg1xqgxYjwE3/+/8J/3Gd22z9pQ6rYyCCpgwNYNLSYnWothadHNS/QaBm3jrfdOitOw4utBZS9h31vU4BwCm7sFsmkAM6Dr+jvWf/4R3fVfsa8YcISnqTV27qs2QcHGY/TTc+c/x6nT78NGJcbZBO12AhtqY9DRbf3PsufNE6gRpZEu7CRN0X24jQOLiygnmaxzSROmGWJKrvC0mZ/mSJq616wNV+VmOwlAlrlXzk39yWCMILMY9UfYebjD6RUy7cu+i+eK6qYIS2hKn4t2B2UrwZTc5Q0qd/zI7r2nYRDMFP5PHhqdV5qnf2B57c+BXn+A4WiEpSgRCdBCBweXX3Xgh8x1lYLVk9RU7+Nf/pljBK69wwUhzbtTYHvtDn648DVOf/kF3vrwPbRemkMRR2gTEp2mQLzfeXdEMusZi1ZM/lwRGtXB6r3iLBOJGtZ0zZgnZOoVRll+zLYjl3TrUiBm5BFSHBrW7Msz5v52ArBc8hU1GbIiY2bu8Rdfw4nD76DN5TPtmBL+atGoindxNwjFVJfaBJ2XER0joNLij51bPH8IEusA1GqOeDL7QUBNr9Dkb0M0w5hd4IfpCPvbS1z8rxx6HYfwAu3muPzX7moY1Kxb5f3N8Z0AXjEHcOLYKu717+BW7zZCkgp4zFFG6fOiSnSr7oyrC7W4ZyNDj/7PDv6UDOXmGWWHFy7bnxkDgfgbcOqZZ64XOR2/dYlpEYNtRVWkWy92XV310yx1rO2s1tDPxNpbl8bAV0BZslab47LeMguAzok3OOq+75pwlZ5fGhGSqe/22VRkc6OEUiOkaaDPmn9ddAj6r4lxck5qhFjf9/rcNaGCjqH6fTlPYbd32vNs7kjHUyP+CnQnuRYdj+IG2VfOMR8olrHdgi0t/gEAAP//pF3LbxtFGP/trO3Ej9iO+wxQ0tJAQkkrJJCQOPVSIdQeUCUkDvxTnBGVuCNx4FQVceiFEyqiaZMUtaKiIU5s7Kwf8WN3Z9H3zTezm1crlZGiVGq78Wzm8T1+jxyLc2SsKtjaziX/3skdBLsgMme0lgVkPCvtC5DqpjoIcTJiDEapjSaiGZrgH+E6cDFMqiZ0OWjrl+hb2HFGuVgEBu0zaF5aqh0EF2EBPoY/pJ3/V07wyFAOFUCB+JxXQMEzVmu5UMMbhBh3ewg6AXrbXQx3Jug2u2hu/YNBr4dBJ2JeJh00xH8jkSp6GsH5SQTL0ylU0gyjlKoyaOG0Q5CGgQf+wgUb2l7nr5VkWaExJZ1XxWrfcpFDPLOVj1KljPlGA5VyFeVqBeVSGfV6HeP9EdYfPcSLFy8Q66mwpw8OovjQc+vnTuH6zVu4cPEyd7/9MOEAGu1dTB+vQf/1lLm2Smw82M8+U5jIJv/2fD0MYYRssOOQwSlkULvLmgtKtGloMxOsl6A9oRCOKRIgddVgH9EoZPHGmATvRhNW4ddjUuMn+LiR5CtwQl/gZ9GGpEJV3iuipGaMZB9bwTnyJsOAeZ7UwXeT0FAFQRjYrqb1FuZ5KeFQK4YJusOHDow8sRF8FGZnOHac6oitgvr9IZpBgJ1+gNZkhOawj9Z0hNYgQGe8j2A64Wp7LDDRccbMx8u8t+MGcSGXVlZQbTQMvluQDOb/vN6aPGnw7LnKapRkmQaUyyMqgL2ClTaKy2D+oOGQWjstFlRKjLUlqflqElrcG2DQbGPy9zZ6VACIoxQ2r+zPMrA5P7OYaHnQb2j90RO0tlsoVhYw8xILHZ2lL0kXgG1QlRD/iUJEwqSDPiZIUD17Nl27rH0h+9DzUiSGbyrXEx0hf7qGT25cx3Z7F9/v3kGv0xXBzYNlgJxZXvATxYlohBE2H9zH3e/O4KtyA43VK8iVZhlyTOJmFNSGjj5iNmCS6Qpz91RCypOGWQuJWOUlJpjSohuSOeyOO6IdaucwmiKzqgh15GeCyCQ5Zr0eVvE88FaMmJdNtmibFSn57wFbv9zH3W+/QXvjV5T1EBXf4+C+IP0gKgAQloOS/7ICGudmUFtYwPziJWDuFJobG9h88DuCgfDk5Z705az1xBOfkonla9fwxsJbfE4cfhfsYKLHwGgPo+4u1CRGQvdQGEJPJ8cWQwyaSZtu2Alc2VcOEy2agMVawnpG5yEXA28W5rDo1/EwDpxOBt35UazdOW0EQTWvqT83mlhfe4ZPFxdZVNDzrdCgQaAxBFbneC9TQe/Kh+/j1u3P2RFgp9XlrmTIJSixxPWMh7YKE7nBcvCjEabPHuOPHwLk1RQV/wZyq8uYztRYnLGQuRmocRFbdx/BKRHCwTpcONiK+HNTEUAfA/Ome8rnLpxoZ7jg34p7qPR3ZF0MvPQud0e4K7R7ohGAI8S+xMuscd9z2iNG7kXJ2kqLP3Se9wF0ogiBX2BffyvKa7+ork3yUwFdxWTrGsTYCibY7Y4xbHcxeb6JzZ9/xPPf7qEc91AkFJVLKI9qvcRSQPz4oyXc/vILFKtFhHrIVDNCADBlUPknaytIEYBjPuo+z5W5mEbz+be5g+leH6VSiTveuUoJXr3ImglUSLL8WhL3ia3QHyUgkTZJP6l/T0ls13xnDRsSSpskaDfbaDVbLuHV7LEuDSinyG9uCEKX5eZq8CtlLrTzsvCll/8/i5NHx0FahdOXEtvbzt4e+vsDeI05aKKHlWZwYfkS6o0KuluDQxq2R5N/z323raQUEWX/lJf9ScUu1m3ZDnHvzk/Y2XiKm19/hvOXF1CbzbP1JTsVkXAZJ5XGZ57Rb8y5N0nry+hHRtjYl6aiktg/dtx/EweA6TVML0hSjQXnAMHxQY6fZcUCudubGDE3SpbIUne+Oo+rF6+ixn11g3koyApIELk3n7YxuFXEb2ph9gyuLa2i82SA7f6uaXraufESVnKEpkUALwO7V6L9kiXQKNFg0GGCaqmGlcVlvHd+CedxGmUYC2PmHrs4WDn8TfaksDjMd6pvY+XdD9BeC9AbdkUwroCYuKda0IKiIeVlhPPofdrE0uVhNmGNI9cFpy/r4Gad2JiLLk1YLjAIPD7PnewUQUAJL/1bbt5moPdWk8155xOKZxJxsYC1FQRZYD8P0bmjKE4RwFIccEmyFNVswp7VNbDPsHTSHAzdwaJNzXpMPz8jHV5xl1phexrcoBbYvhEwJY0CQYDIIISEcTQwaAvSe3MCiITYjFJbS4p5qfGeiv1R09xQMui9Eb2ePm8UClUh0fgPAAD//5xdS28bVRT+5s54Jn7l2YQmbSkgEH2hClArAV0gWrpghfgBSKj8LBZsgAUSLBBsCixYACqKkNoqUFVKQ5M0pEns+O2xPXPROefe67HjthJXiqzm0RmP7+M8vkdAF7AiCpYDw+Iaz3gjDj6vBRZtk3D6QG1FRGD9iVtgdqJYiwip8ihGAHCFPUmMV34WMqpcJYW5EU4ZUWCkid3sBv2JD58pBLkc2u2OVIf8nKuHiQiEIBQ4EdCjaAAPcAe0iMEp5mVPJYEsqK5CUusgbfawt3eA5uMKqo920do7xM7GJgZNoLPPVsnklsRQ93L2FnvSOWShFdNJDG2iP9bg0xOqoTAcKjVx87Zc0ckUgHG0wOhQI9Z4Fq5PY25mAaXpaSwszKM4XcbM3Az789O/6bVQKGJxYZHtIFdvreKvO7dFpM5aHErt3Il1sTWYB1x5/xouXr6M8uys0FRJvIZUQtfuonlvDYV2DQEnQxHfn8oESeOJ/khHyknKmINY++76IqZHXutq+Hc0hwbSEeAduD9A0hcIv45TtGst6ei3YpPsp1IYEIImd/dJNKbghwijHB8ygSebE1fglHY8pLCYk4KCUqMcbxPF0cEYToWZpCUVwqeFvSqjq2sKUiygpETtnQvNVCmNcuhxtz5FT2lUOzU0BjH2KeE/rGJ7/wCPKjUcdFqo6hgNpAzz7MJ6RCsT2IhFUmISeTiesj6SVNkOJc3XV85eRGlmUdIao/LqRJAmzMvRWZlOeJ38W9nB758ChFyAkDRCerF49Rp4oG/Wi/ite1wQIJ4/zYe8CtCOB+jsVlDd2EJ9YxNef+AEtFgmzZdgP00FCpltyOTJEibpY3N7F+sPdzCzMo/ZfMBJjqdNOc0EAcw9TYTeQ9BxtuDpx8whY5sitKDbMQ7rLRy0Wzh26gTKXFiRzyRwc/poYktaL9yhjxTmTi/jyvV38XDjAX745jv0kni4ru3+4JrDGjnPwyxx73odrP74PXwV4oMbn2Ll9TcQFiPEyvC+LUwYQ6i/TcCH/u9PH45rnLHaVProZzpRjX7sZ9lnIMigcbzDk0dqbOSOXEfLXkhJLXH+ezt13P7pJlY//wyVv2+h7HdQUin8vtCdfOZe+ohA3H+NxShAhAHmT5/A1PIiyisrjIbZXt/AzvoDU94VBEDfmO67JI3eQejj4qU3kS+WDLwxdA4B/LvEMa8ewqscYFBtYqoXchceTFHqyzNIbfffoN+MIJDKnOP/a3gmBNZD3RMO1mJCPQR4vjiPY/U9PEZTbPuId5iKjObAXLY7SBl63kiA3379A29fv+I6bGmGH5xmVjrLd0Qal9+5hGt31vHVF9+ac1A5nQ5lY5NMEsM9u0ENna0O/vz6SyTdFs6oj3A8eA39hYgLloEvD3Zg6hqMzPCE2kbFC1p7ibmCiCT7zg4klRafm3OeQRjZjrpr7Ovh3qf05Pk7ae4r03RwxS+m+KmRZZbtLmfnsqXEWYFHtif2FFM0GqmHPeoK+crhBSNz/8T3r2vgMAX+Oejh4U4NzVYfjUodrY37uHfzG2z9/jOizj5C4vtmqFvSfhhSjmwCfOp4AZ/c+Bhnz59BO64iCDSiQiRpiXGc0vaezdwaXfjDAJyC4iCMUDq2gEK5xIKa8zOzWFpawhQ1gOI2omLeJCCKrds8I5xFiACi4lnRPw7MSYyrK3BkamBQLNBudbBfqaLR6LmkT1sagi3QWGQLaTNQIlfMI80X0DdosXG9mCRzTj5t2HjUJd6u56ONVbQeaRBk/0c66xrdGC0qCFJXPCCYcA9zS89heXkZle37z1z1T0IA6LHv+dquMROndoG1X9YQ1//F9Q+v4q2r76G0qBgtSw9t4JkY0/PRbbTQaTXgT3gY2sK07eo3dtqwzcVM8m8L6UJnToWXbUTnOPEziAGbpwiCOBAet+n4EsKSYsJ8OoVzJ89g1ptGEXnWCUmSnum7GOSpNyQ/qozoH9kvK53ihdJJvHryZXQ2ujioV9iamIowEoEkRrtE3pnK7MPOmS31hkgXMwiSr+MEp0+9hAsvnsc8yqxIwMmjDr7Fg3EAACAASURBVEYcVGB9PzLHIEHgaQ0QsmfKy+HCyjls7m7hbq2GNEh5/yPbQ+68wzMJ8/A0ts+OUK7sLGQRRUnqbPx4PgTKwPUFuk6JKcP9jRWnPXdyuSGq2yLPmeadCKU2m/wzBcx0ublQ4wX8jMjimtYrbJE5Sz1XPsLQCsHbIoA0WeiL1rpz4KAYINPBt8U09zOjXSAJuBQ/CDHAifdTxDTd52p0cmwnnkX5iNJr7m2YQ9NzFc0Am/xbOoO9fxb2I6vSgaVFyJ42PrgQEBhqFe2XBlHPrwD+4+vKXuOqwvjvnrtlsnWmS9K0djGxlQartBVEVHwTWqSg6Iu+iIh/l4gPQkEQ8UkKfSoirQqitDa1SZrGtMlkJjOTZO565PvOd+490xZvCTNtmszMPdu3/JZgdz+RF/YqGw2Gw6ZDFijQjsVQ6VnqYIEoEK4BjMCAq5ZPIhcmnzEDaPkH9SR2bRMiqRL5PEEgbgFwUALc2Rc1Q77pws2oOTOovCGJf55nhVQKiSPuy+8yj8OU1BfFk58GA1q6WAopcUXiBt9wRc+JH1QGCInzXygkW33onSG6mz101zcx3Bxgb72LnScdtDe3uFtHEFEuKpammklCQ1Q0CJUNkEaHKDM30fgdu994ar+312iAqqu1bdlEnrNpe1KdtX0NWZpmjCSMiYMxPkQY1sImcKSOHiKmiRn4ODx3FFMHpzFzdBZTzQM4NHMIrcMtTDcPII4CNKcm0Yh9TDZCNCJS/CQ0qsb9O6tYuXMPvfa2ODuYwC/waigcXWmumSP+3pWrmDk+x3wxOrSniYjYeYz+/T8RtLe4UKR0LN0mw7QzQvrmxmrRQ7AQHxLe483LC2R7toUCIyLD84EIoEOReCZ0CC2owQB73Z5RFE5S7O30UQwTZEnGi75g4SXToaVEKRR/WCW2ML4DcacDzveiih9orFCIjxdVwbM/3rAjOzLgShluHSunc8dDO3oUZiHSR818m/ibQJPWEyT3ouCjX+bc1V/rbmFjv4flfhtrvTbW+x3uKCeJT2hh7p4VLIJl1LDzChKonIBTIbAVajv35OC324SPWn19/tRpXLpEAk8tc2iWWb1OHYLK8yUq3eTfdx7t5UtRwla0RQWck3+ftQ/8OESZFBhvKASRRkhc61K6rdR5ICSEMgG0xxxjIuIm2F3fxOadJfRW1xCwTanwO2k/IAXu8UkU6RBJNmC5nUqxW/LiNAe2eyVu//E3jsy/ADUxjojcGcoUMfGNsxRjYcABppd7bMeTJCk0vZbYSAx2+9gnGkmhoMMI85deQ/PkKWByEorndIDCVr68srKJgn2v2phiZOk+gjjEwuJZXPnoKtuF3rhxA6WMnzOjnG3FSJ9PEU9WJ7h9/Qd0ul1c/vwLHHvjTeBIkznuNJSlsGCA2t3D2qY9L/8v7dv0hC4gwZ1VoVfiLlDtYf/XDdKjj+7lC7zPiorBCdZrJJqEYto2+ZVRIKfkQJudlMS9uKi3X8Jrb+Lud9dw89uvoB49wCwSLgz4BQEoa0wFvU7sKaYFkA7AzFwDc4svYfbV82jOL/BZSdZ/22sdeGKwRVZdKT/zrdwBsjzF9MwRnLvwCspQIa+6GAITo0Ai2QH6fQzXu/C6KULS1En3kO124DNX6imNDQmWlTgCeM6aslxi7SSZppLo2OG6EIQKNiVfSYYoiEWTIcNsYxrHd6exUgy4qGg6crriUNOTMWUUsGnW//Lrb1hZuouzF8+xfVhAAY/ME1OsUxx089/GgNaxJj7+5EM8XFnDzZ9vQeVmV7LJWI2i1bJTGGRGpEok6w9w65uvsdvOcOHDArNvXcTEXAgSUmZPd1FSz5WhUeVsDWog39qzEE81ci+UwKl9/j8mnlJiVVZ6sj/bc77qLo0i+55BrHnu7qhHin1KdDPcdWYpB/bnKKCv6HZVYc2cVVR7jnXAY/NQG5oDfbVEs4IiujYhBCj530jxz9Jjo3HT6aF4tIQHP32Pu9d/xGS+Z5L80MBjS3vWUtFbzgIjKqbZyvfLzz7FO+++zVBgnou+hY8aO1aLsOA/zxOpdu4dQ6oJRjkZ48ziy0gGA2wsr2I8CrE36CGaGEc+FnPwTCOQRvXd5EKjQP3Zmpq6bORepRT2SJiTNKP8kCH0y482MEhr4AdsZ7BaD0KFUiXi5hQwN4tBYJx1AnaKssvJPAl0TQGAk1CXz8DCy/q9WlQIC7XVtBGrDwRYzQYl8bpCb1hgr1CM3CMNikjFmJk9gYXTC/jr1j2Ld3nmFnPopEcLw/ZTls49CM1sqpFXQufUouPx8PdtXFu7hvZyG5c/eB/B+QKNgy0oEsPmMacCaYxI+4yiJRe6hKUYlOCGTPEj83Jel9FEw1D6YHj1RmDXOot5wofOTYefD24p1DnQcAjs2pNmADctpSnJe2AOnDxwAmemXsQ0xrmopSW2Gi18lE/16azmVQmfxbcLnJiYwb9xC0+GT1ilXesMY40IRVKKXnhhLKut2J8o/NsrDBooMpMgk84KCUZPxlNYPL2IWe8wxhEb+jH9MkdnbSRtd/aHUGz+aB+izzWDFl4/dRHLq6vYKTrYJcvL0JhSRYK2Beq8xaL2aBKwdhWM2B+LCCuxGafcgRJximmkeRtwvmhzTF80NAJG4RDqkvI7+uxhYJzYqGkYjEWVGCJz+W0C73wgspiMRLSvYC0u43pGxR/6uUKrilru2v/Zf2N/fidxJmi8Ff8zWgwswGSKMZ6PmPXrCJZPSX9u1j/FlKSFYC21nYvyTeblkwUzNbxdygTTdMyK55kogPSEOvV8Xpj3y/l1JloWld4AjSUVLMSy0lrzOq4MRLGgxnKSmOa4Od+FtkD0iqLAfwAAAP//jF1Jb1tVFP7um1wPqVsnVZKmCaBKtBKItDQLpApR6ApBBWLRDStWSPwrumSFRBGskEAsKwa1KaWVoyZVkzRxEtvxFL8JnXPuve/ZcUrfxkPiN91z7zvDd77PM7B515VshJ0EWnfV7tg6d5KhiHW/KhkzE+yF+uIm6K6a4H+cPdFAROjmUWZHMhqhvUjav69JDRyDACBCPEd+n2otUNvrMYFF1f5Nv6cLl8yS7u1QYgix5hKgTFqRgv7QgU/4t26KzosGXmw1sPd0G1uP1hE1e+jvtZC0EhQjxRllPwfXkZav0d6Z/MS0RmgrFdl34wWZcef22GeVvVr24LFjGccita9CrmMWr0qlgmq1inJZKvlTU1Oo1aaZNXl2cQ6lqRLO1Kr86lE2KVDyICPITRwj7HfQajxHozdA73CAo3aCh3/WsfbgPssTJhoMLMRVyvZGCtTRwdWr13BleQW16jQnAMokd3Swg87jVSSNXVQIskLIDfa8skWJF1qtwyNZYCIv8czAj1JPx+L08n2n3r6jI86kdvf6SHohB2MUiCUaBsg0L5R8Itt0fVS0fF+hUNESc+6ITRttVqo6Z0NED2c/W44Nq5IZSFMVUhK4ppbZF3b5lsq1JDZ4oTWJNCb8owphgCPEDCUiyB/17hP5T/OwjYPBAE93d7Db72LrcB87URdtCi6psqOEYR2aaCvPpG16Wh1rI1lPHnKfja4z27EuPvieUPxR8Hnz5g2cv/A64BRPdDRefZtU63dy+9ROj0UAeFAE+YxSfjgS8U6QEKdCYhN+rNXsiG42t5RQL+pBG83nW9h7tgk3Si28n2TdaFwGBAFnHoEiK3ak8eg5EdGUp4muVh+t4bV3LiEq+DhTKULFRygXfIT9LjyHHDIXnf0u22ev10Wn00XvqMekSJVKCdXpOcwuvIby/BxwuswyToQ6oHFXiY2h7BzPz3qp6icaohfBmfLx9soyO2Ebz55htV5H4YQRMcB9l5UnQgyHB6jf+x139nbw8dff4PL1G/Dn5lGYkgphrLOO0iKk92mr+tl0NOQ9o8eavOWnycu28cra6KZvkrFX8xC0PQEZdsM8346GEftRPKcpziTb6A4RbW7i3t3v8cd3d+BurzHcWUjTfIvAMqgruq9FcoxioHQWWL6+gjeurWDp6hWGLO+sb2LtyZqW2HJFYk5psisLgZXVeuniEmpzM8wCI4RQiYa3JzrTtA/VbMHtR1AD3agTisSWSaaoVAN4kzSXWE40LDYeGZPjzM+v0Kaj+RuUCdyYLDJExQ1QUwWcgYt9xBgmJmGthD+HAyGpbdKVrT8/wIO//sabl5YQ+EWk1NtpUtvKyBGLY01oEa/kYeHiLL786jYOWi38c/8JJzFNzRQa6qpyn6mliwKHgKpV7Rb+/eFH9Jt9XO40cfnD66jOVpAWFHNo9FLhD2FSwFTWjETfU9Gp15U6UzxxMtc0SceNOwvQ8pvK/ZNKR/gq9XcnTwBTkJm0OekJiMFcloqdzVQSeH3y58KUiT7PeYoDdbLLjT7wohUyCWxvECFo76FXf4y1337Cw19/xlTYg58O7fkYroRUF2o9bc8BpCj0+Wcf4dMvbiEoBhiEXVH+cLTWeg5LlXEdvHwBUIkwqTPJ8NnTeOvdZU64rD/dQNELcG56hnnluA/W9+EFo+sPE7qSyAuhAJKIAxHyNanqT37xEEO02x3sNppsE0zOqVtMxkeX1sE++ZPlAlSlDEWoneR4ItRWjV8BoDSCSE11O19OQvClv08d9IYxuqQ4pP2+KE5RLFawsLD4vww8I4kmc856PiWOVl9Is2ewM+bTsqcSAYNt4O63v6C+Wscnt2/hvQ/ex/ziBXjcAxuKGhIRJYe5lk59aYLcFAQOzz2bgBi1C04CUFlLS7tJVV8Uu9TYpMrg4BN4dGhehAkWa+dRRMkiVydtsuIfx9K6+pXoDufLs1g4O4/69gYOo0O4vmlXpvggss9aS0hnk1sC8+aKfyztvMRLQeiEmWoNs5UZnGI6Qk+Ich3n2BlOKqvkN5eTfacwWzqH04UyGs0dFMoBwmQg5HqxiKKO7NORfnvuz6c5k8aWUI999Dix95uqzsShFQSZohrJAFKhNzaEdeS36r5+JrGOEwvvN3LJwp+QjKDIoREDZqyVoyyRvUD5J8RejmMLhIZYzyhKcEFZx7x5mzKExeb3WSuC6OiTZCElC4RsMMdJoY9jSPnM+/w4S0BPxXNBqdB9YSh/7jisEpKT+mTFKo2YoP3lWzFsPB1ligqcTPFOiVoe814QQp/a7kM4jsJ/AAAA//+cXUtv3FQU/vwY2+NJZpI2bVGSloeKoAIVUVCDKlg0EiBVFIRQWcKSDb+CHSs2sESiWzYICRZIbGCDUAtiEVpaiVbTSWkeM51mOvF4xmMbnXPutT3ukNDeTaQkThzfG997vvM9bJrQql9hGn6kjPugqBk6kmBCC6HoB3oR6AJGfyz+t4hxoExMksPPWfalLp6INk4vXnqIPJHaoMvK40sMRoYi2XwLFJL9Yj0MmJnRCXd+CdE3xBQiisdZtCAd8MnYzU8szIwrGK7fRefqbbTXWvjnegvddhfh7pAN+2zlNl1JxEeAXXWNlFEriQNLphb/mPKyNUp9TXOP81a5uw+IZhcaFSs5/lMvyTcdXlie78N2PMwfOoiZxhwOLCxwgU/a/ZrvMwBAFDp/ZpafiVP14DgmXN8W/X4cAhT/Mugj7FF3cofRdipmoiDAIOhxAU3O9mE/RfPaDbTbLaEawphw29ZdY/pUw/fx+tmzePrYU6xtosLbphPJZhf31/5CbRRxccaoT5SIVqL4NB310onV1+gB0suDaECxBYxsNtvbDQLptA7EkIRdfukATdRv5WfgAEqLVOV1W6tWlTZNZC06UkOprhWKJ2uTOdemZDJpDTNvXgpUy9BnfXBQ18ZWocNF5YRXhRXL/XN8R83LALgBdSiMGGE0QhCG6McJNsIhOuEAnX4Pd8M+Wp02dsIAnaDHRn1AIcO6qJHWxofJOEMFi+ss/2jsmdqfaBqrmk9iu9Bh+fSZU3jrwts4dHSZaX4GUfWSZO8FPnUUjynlLa3wwmXsXbR57PDMaLKL2BLaM3egDAFZEgXQsRcCo/VCNXQME8FODzeuXUd7c4vBrSItN1W6Zbs+K4fA3QHGYcDvgExrR5sQFRgWMBhFuNPdgbXZht+1MONVUHcrShI04CjIeCQv5epsHQuLS5g7dBgLh4/AbsyTgw7guTIRlKpBxkTi+MYdIJKuEInFTIu1xiRdz2a0PWLJgjdXxSurr6HZaqHz1UV02vcUODj9iENPyqOCKU7Qj7bR/buPbz79BGfOX8HJ8xdw4LkTSCjlwFV5/+osWPQvynP+95/3jAJXpEPue83eXy96EKTqgqSwZ2RSFC1LITMqG2KgRzbmvSHuXb2KS19fxNoP3wL3NzBvjrnLVeHudSTJJ2p1epRtnkaYIV8TH1g8cRzHVk7jyZUVzC4uc9D11q0buNlscmESq1WbH2iT3ITOBE6+9DKOLC2pZ2EoUzxah0NY5Duy0Qa2urDCmPcfBgVUF6SMrnDHrLQ/S1dm8pBXuki1mUvzpyf7AROGOOtE+XYFC56PRp+Cs2IGxYpDzO5Ux57eb2Pgt18v493z52AsVITJgweNXLQ3ERVh7ryDF888jw867+OLz77ErTsdlb2dR7VO/bPIgRojpME6bv/0PdKwg2S7gyfeOAfv+BwGFOBDpl+Jjis0sjhA7k4ayNrqubGnHrookopRR+JiKsDycOOhJRuFby9fSusrUGAzddoHYwP30jHqcQU1pU1pbkZM0TZ7AYztdexe+wN//vgdmr9fhp8OYZUKBE0FT5Rs0iWqLUkDUmB1dQUffvwR6stLGI/uwzAlrUQ7+2Mfxk9xTBzU2YdCgCzjQAPPnnoBRtXB5s0WWq1bmPV8LlIqriONLS2TyIyodXdMUmPoLBxGUoDQ37CxsY3u3WDKDqT0T0qGQYy7yPHgHDyIyHMxGJPG0838hKDA1eKeUt7RJjvM+w8jA7oeHPR7dgcB+mS+p/mf5IHlOTj6+DLvUWEyuS7Ky1NLSazsXtPMS1QRo7MiNuegyvdaShLAn4+AK780cXPtc1x69We8896bOHnqGdQfm0cci/M5R7lmyymRiMMU/+Np5PpuYQ3rTmj8SDZDFENO6WHWviX03oMZkzDQ8GucBBZyq18aNZyaEkkykz4/SZE2zqOMLSlAbdsVr5ZIQIs5t4Z5s8ax0Pq6R7s/sJNBw3VRd3xYVLcMQ06MgqKJu85/+xdBMavzYtYUJ36l7ZdGmWpqJQKUFn3a0lLijH43WuRDMJITsaQMWNnP1LUjM41SeXYcKWjmTvzinK9lAIX9nwviJCus6V5JrpuzyQVM0HUp33mxoa385KhBzezyisxLsfAvm9iXhwYr9L1OG7ruZVY2UVZJ2cHSORVzr/T/HGOomO36vsXsT3wyCByl2HC652IcYjYA/AsAAP//zF1JbxxFFP6muz0znhlv4yWxHQc5bPHBYpNZhBQpyChCgJQTFyR+FVw5IiTCBQ45IpAsQEgEEoQBidgkXsf2OPZsvVah9+pVT8/YcYg4QF1st6ye6pqu5b33LTxq1o+SbxrLlyCZnpQrI40+lIQMHPERjHWcsdDTJzJZDLVxjDdhCvGXawRRsB6HsWRe2a9Q+ByWWuAJf4EVsh3XPKDYI2T7lb7Y2f5aBUkpBLH1YJE4YUWulJCPqKYKMxQqjoeBuo+d1bu4u/ILtm6tI9hswo3IYshjkbCcXfAtBw3i3amN4cYZVq5pexiv6rS/+685PQGaI/B2449FC8fERBVDxMmfHMfIcAUXpqa5oj82PsEc/cnz5/n5SbivVMwLpyYxHpHavHCExAjZgqOF+kYdUdCC3zlGGLTQOT5E2G7wcYggdg5lwhKyzAkZThf5QODn0G4c8NioPqut7DNR7y89cwlLr75sLoaaNRCwewD8tYGRRgclQmGEMmJMlg17d7vEZ9E9eldVbBwIqP8k/uGEDsLDgH+yCIt4uXNwT0E9We0RlIZt8AbkfVZGLT9JMFggBdO2ZNccEdUw8CbOymUxv+KFbUyZJfBhYUfJOMrJhrJxafBP88KF4ZTDVOOJkUC0iJgPzAnzySmQbHTavJnvHR3iqN1k/v5hq4U9P8RRnKChOszft2r+cYYRmMuuY9bLumdjfPgu6Zx6tOi2rMiMkrl3bm4Sy9ffxvzigsGh26OBqKY+MmrruWP279Naf9JPoNvkrU2HT8diGJwUFAIRyGHvbYJJaXOEoTHZWruHtdU/mP5RZL5al9rEASLZig1X2IMXR02GoKlcklZJFNsMGVpA67iJ7Z0aiqNDqJRI2X+IxSLLBY8X5+GhIQyXSqhOTGFyZhbeWBUolk0HKZBzrPK48Zol+oBd86gCqiVyUjnn1Eo5oXQo9cb8RhitFTpwvfHOMtbvr+HLG1/0CBGn1q9Zzm4UoURVUFK2Vz782jpWPvsEu/U6Fpav4cLSEsqz09B5EThze78troDhpPXhf9myjjRWxNARBeiIIf2Acxwgru1j/Ycf8d3nn6L2/VcYDI4xoMkaTKV8VWNEY+7lcuVfoyLQ2Ln5aTx/9QrmXnwO5YsXWVzR67RwsHkfbT804n8sXqd6+MS2XxQUP71wGQOFEh8abfDvMgUgAPwmou09JHuHKBfKMuCxWEwh9UlPRauU8cbuTZqfdN4xX6Bzgj7Q0yxcoU+Nnj2IreZ0olH1ihhDHnn46YzWKQ+6GzLw9QS48/Mqtjd2MTMyAp2Pxe2ib+5rI3ZK4xG5AQrDLl55/SXUtg/x4UcfQ4VxmuzsNaEzdEQrmlkgYSfau/w6tr79GvsH+6i3Ezz71jWUF6ZQqpg9R6cOpkbiKyeV4Ej2tpPIltOSlf+vZusxylGCjnQQaZdRfIUkB68RIdeJoWMHg76Cv3UPtVsr+O3mDTT+XEWFktNKCZFQ5oJSaQKQ31NxhaChW7x8Ae9/8B7mn5rn9bIdNFEsSH31sYWY5fO0iKjaIpEyWi35cxNYHH8NM7Oz2LzzO1r1B6gfPWCbLYaIW1QSIbryxYyLlAReBTd9r1uNDnZojqlukrv/O9aCDoscD03XxejwCHKlQU7ux5lpdZZg7mlNq0dbcnaVzmVM+oj0BEFuR4FQjSD2dW2MVKusQeQ3ojPvn9WnsMn+fkcKu19owZZavQLxrGJNj4KbN9ozvsY3N2/j159u48rVF7D87pt4cu4JjI5WkXO7aImsrpMS69wTr0k2wZdTaYWUzoIaEjA+5jxk6zufipF5RDgjMfoPmkUDkz0pB238UFREiiXIFVysMqKjkHjFCLO6XFSMo8AIX9M/RREr/XtCs/BYd+Dfbax5uodWfBYiKH6cC+ENFthOtUhuUX3JYa56i6UeOy15prJMlWaeW8Ldp/iOVn3qnkHXdFF4RjDP3JeelVEFgvxm+rX18mfBwy4igGm33oCc8c3elR5r7RrgdgvD6e8ZLr/tg7GWN/tVNvjPNhP7dhMc1OjZKZA21XQS2zMq/ezzL/exjfpAYpI2PrY0eRtD0PXApyRoN4g3QT05jJk4mlEYMuE4YUD7DvEzOHYm/YosYsEgGagYarUTIknmWMSy1Q5gtIFS+BsAAP//pF1LbxtlFD2eGY9ju60TR2nctIimKlRARSWEkHiJR6R2wZqHVFghkNjxr4rKQ4gFLLqARYENokIVqKWlUZvQxKlbx6/xzHge6D6+8XgS1CJmUVWxZM98882de8899xwnj6SaRTRdf0JpioU1f2kUMQhg5g2Gw6H4rDICYWUzFUap1Xg5GvoHq02qUqEoN9pZdz/wRpkPY6KokjlHJwMHbBX+izOAgtUQlbJBhSDZrck5CcRp0BbbEqEM1iKxHYyDhEU7KpMU4d+72Lz8B25evor2jS4rPjvaACHauLHnSZBkYcXN1ubRHrjZhGRvmlAEByylFNmlqW8lXVOtWkNzoYmlpWUsLDZx5NgRtkdqHV1Gff4AmktNNBoHcfBQnQtbshRjhgIJsIQJAqLmBwEm4x5C38OA5ki9MfyRhyicwPelQxmMuoj8kRTCVJaSxy+ppZJYZBornZ/Wm1CmCE23gbu7Q3S7D7KZwlTnyikzKNvCoSPszI8jvLq2huXjx7kbwQlE4Inw3q0NVHd6QN/nDj537nxf1o0CTiy+l3Se+SP0py80h7yXJ2VmEBBdirulxgqDke2EEUBaG9rlIQfmMlPISQ2VwABSzZ+5P8alQlFES+d7uPBn4T2L50dTRzQorLLM+GfaUBTkSBeDxIbShFX2B6HPRf1g4qMXBPz/zrCHrufhgTdBh+j8oz7vFxqoCHU+M8139HN7yuwdyVkN88DKPOhnkdfZt6oEoyldtVRIQmhGK4iEai/esi6/bCkVdElw7rFlvP/xhzj73ruotlamFZah0hVtRPd/TB7p03ypangwsXotG1VuArj4hWEIIlABICruHQdR4CuoaWG718bmn3+hs3GXO+fMgCrZmspogK3YKB1qwHKrcPp9eJ02DlgSV1gQpiS0alpVfzBE1BvDGsewyuAk6ACN1yzOY+nwAjNunLkKd/8t6k7RHTNz23aMOBizPy89PdRBizwav3GQ2mWkZbFFK9uSROdfUjMFnhVl82tMBy+XsPr0Cbz9wTu4v9PBzz/8pAWs6e9k3Fv+l7UaYqDBvT6Hn9/BYAvXL13E1vrveHbrPE6+sob51RNwGkIlLlWYWmHcFeXu/Etrq0jPLGJRD4urD+0YFr4gj+4nqr9JxApqdKRjoDIG5kZA99pN/Pbd1/jlmwuoDNs4FHqokX1RyYFF7y17wjPUtnbHXC7+gboWPiefWMLL59awcuY0mqdOIarW4do2gu0trF+/jvv9HhepY/VVMQygkirP09+arRaOra5KosWfuzBlJyIf0d3bSHd3UQ1F4I85tDT3OBwJtZYsU7VbngHybHOKrMCRsaic0FS+K6HuGDNoYWqhiHKn9O4NY6ZY80YdCUXRIiptdR5H+w1cTfpZV9CkbbYOotFcw1/dAwAAIABJREFUP40rUL52bwdYX9/EyjNPsi6GPVfV26jq26bo4OFfSixDpOUK5lfm8eZbryEMInx24XPc6XY4ljHhKJ/DaFHC8+X0HirZHDPiqIfBjV9x7WII9LbReuMsjr5whvd0YItDSFljHjEZPO7kqiDWjJVwYcRlH6py/rAK+7+434vAzJ7nobD/7VyCwb+Uw94yu7dUmItGy0CQRr3XiYsRxazOCK1yDZXQh3/nJjo/XsKVb79A2N5ANZXRv0yasSRrnP+djCUJ4PRTj+OTTz/Ccy89zxB1GkbMOqV8IhMF2e/i9kncFa0QUhR1B9WC1MQ/saIMOUdYXGlhsbGAfvsebq/fQmdrG8E4YJV/syes6oTH56CWZcY2WtbdQqezi82NtsFjeQxgSniXImTCDFUbfRLtbR2Ds7SMoVsRm1wVAcwYsoV7Gxf3h/ELz+jO+fzbygTxzEhVpmpunK20iEkSI0yYYhwG3OlNVSnHqtVweKXFuk79wWb2/XmX0ERHSEyOkaqlMNvLllQQl5l1Oc0jswdzl6SyuQhjX0AETRx2HgBffXkF31+6gnOvv4jlekP0xSIo7dsWNQ8V2DR7oFarcoFE8YIaN2zBl5oZ/ylVmqjVBhyaWqvJeplRZ+4SZ8+fiUkW5tTr3dpD8f/vB4GhFL+5yRnreBk1egKPC0nbIT/9AK4W0rYZWqJzp2aniubR3aOay1apwYjVmv4/yOjFPtvIDYjBGwVI3YRjJrtxKDu1eCRK00dult747VNdYpT+aSw8Unq8o3k3215GItQoXvRldXaz1O6uwuOQ5qjXa1IHpiI4yBbvaiNPhbSjLgKJMgcNzX1PXqGHqQMNACHaqNPC3Yyy029wIa6fMWOMffsnmWseNxkJVGYnJwIynJnnl0EQ0ifQGlWYxHI/6RAqv4kjSvk372lV9beJxapudnEYKugy3ecEVLGLnsYzqq+NwJ+cszTRXWVyCFNDrn8ymeAf5q6lN24qCn9+jT120iYkaRLStDwrUWgRggqVTdgg0V2F2h3dICHB/+quPCSWsKJSAQkELFpBUYEpaRLy7mTi8XhsX6Nz7rkez6SB0i7gbqJk8phc38c53/nO9w3xO/hFV9MtCGFwa/ZVZiKs2mVnVBG5FcAsgjwfqGwKFKzRCEsmfoCYEApiUB+DwLgiklB/KPWJYQsQy+LJ414SORzMQdig1gWhpZjFyegUJXpuA77f1GgtJZFpjqYVIFIO4l/X8PuXP2Ll+i2otR6ClAJ2nz3SId3F1mMeBtUirFUnXONIUMPStc67XkwUVBE9f2Zmhj8uLi5iamoKc/NzXNE/vnACYRThyESEcLwJRZGKXbDyY+kU6Ozvop/2ERM9v99HGiesXp/EXWTdGHkac6KfCEXe+N8W4mffIHoWcoQwAjZq0OohVibdPOEDK/R8pq53O130ch2qquoCkUoPCUhSspQpRNE4Tr34EppRyM/DSRN4FMTevYveb3/AW96EFWcoE71WCEAiKwtKaIa9ugd9XmEZyDrRIoC+H1SOBhzw2PVDTfvqF8I7872w+h7u6XfsgwGXLYEKrUO7oRN/gk89VyvThj4f4lmZ8+FHJnp9mpMsZcXr+72UKfo7e220ewnW27u4Lwk/fX2fKv5Ueagp8Rc1+n6JGrtAaKim39NQySwJrofq56V+86rUuPzo1VGpvaoBeGcPhTp6EB3cKGtz/1OhD2PHt9le6MqHH+DCpXcQTs9QFzQLaT4srfPwnfJ3r48G2Ebj3+HkXduEljqvods3p8DXYQCAPOy1768GM9NOF63bdzhA1daMjlCgtcANq9QHDa7uoDkBe3wSJZ03mdD6ULNhYv0GBSvp47mFE3jm+ZOYnZuG61tohgGDJYo8r12ba8BsK6ly/e9QwCaigERtVXJxUolEBSEsWtOWx2enVTNmGjR4yyViLDH5GeQMBpWWC2cswOlXzuDylcuI7++zIF1CQq0cXAwDAKa3vUqdygIRVV7jHezc/A7XdxKs313FC0tvYfbsaYwdn4DytH0YLyVXQADrIL30vx629KmSf7WfAW5MQn89tL76BjeuXcXqDzcwU+7CzTrcwmKXA08Rw7Dn9SOpeSCfn3w6wstL53Dq/KuYf+0cMHYUdIq6RY7dzQ1srKwxIKW9/3WLFKTSletJ598/c+wY5ufmh3cAJV5USVtdxV6rhfFMnAuIGSVtUFR5V2pATbdMMM+su1EA8B/GYQ+tLKtkrBLZIiBYwB5L6NPNHJiyfHYF2EJeEU6G/j4r5UuPaA789PMdvP72m/BCf2T3E7NHvHKlSkYVDmJK2JGFhWefxMVLFxD3Yly99hHana6cBAYmtCqAS5XmNNVU0cDWC3Tvl+/x7e4WZlstnN24iIVzZxEtzqIIzF4SUN7STivaB/5B02Pm/39EfRkZuhXPZqq10eVxEoWpRoSjR31Eex1s376FW59/hptffAwn3uDk31NGIhYH6OyGdWaLFsZTx6fx3vvv4vzSG2SxArvocywlvk9axO8RhgHy6gUqxZbWqtL84T5jx8KR+WM4MzWB7fUNbk38c3kF25vbute20+bWSK7GdWMWg+t1Y80yRQPLrXtIurkUa5wD3u0UWFPMRJarGfmcPzGJNAzRJx0jEgpTj74E2DnokJ81wIBJaivAQNoNeF5JeIwKb2zppiShLZlq40chCzkD9zQb55ClytVZVWByfhbN6UlsbG1iv72HIuljzG/o/VWUlY2Z0QGBJP+GEWDuokyEsAvZNuubwCeffo25CRIjppuwrDQkNANisGdZt4ta+7hoYyF3dMWUC35V33ShBejyfpV0/ZuhKeoZ5ymF93gMAHPCpEXGiSUJRTOTz28g3U/hBa7OuWxdbFCqHAYIjXWxeebQlsYUO7KrE0PyB3UMHnYwHOSUWN/ZQrvbYQFLS/S6XLmEbLHENmMUwES1FvX7YKt1U+mnXK5UktyLvR2dMyLQqKv5A2aAFnActqUlxrYtBWGMAKo0l67dGLwHEecua0l0gXKoDYEdBnKtOcfscmNDSMUgYhETe8GzOPknICPwRWGfWsaFEc/U/IotMGg/GR3cyljZDpIDic6Tjd2gvPGaeB+5HDR537Nwvk2aAWY/6/jvQbaL9UG5OwOZOeVJkvsSs5mK9qwfRgwArZXheR7+AgAA//+8XctvG0UY/83sxK84L8dNcYSgDSipaAVSQKiiFNQiVQgupao4IIQ48B9xqxCIA1c4wQmkSqjqoahAS1+xoCEh6ZPEcbzxer0P9H0z4x3boVFB6p7atIk3szOz8/2+30PJQcMBo4Om7pKrGxhEonlzYwMC3Vki5JTBAMc50g5CIrULbGwoDm5Xn83YjDmfJ13DBfvAH31qtFoJ5RT9PaNBXlS6+8UhHfz50uR4K6a2TkQS2zdWsfLDr7h1/hd4W2DfzzFKE+CHrEzBqCmY0rwAHEb1Y19J71CuXV/JyKNcKPPY1WZrqFQqHNMyWZ1GZXY/ylMWAJjE5MQEymM6ax8cG+gx/T4KdxB1W4i7AYJOC36rwdT9sNNAp+1zwR+2A+7uExBAf447gTbjo80uivh5xlE2oWSizaS8NDLZrdoJPTPPEkwVyudG4YkY3YAkBB42mj6a3YyKnjoAkl2M9N1zc3NYmD/EWm0lE63Ru3sH/rUlBMtryG/6bPBLNCDW+kcpR38Io8cXIjP+sDZ1fR2XVD8tV3buKXehSopB0I6mQqP4wqDprKGhn60GkHtPZZ0Ka+EsCA3scKSS72+i1e2g2faxHXWx3tzCRqejO/pBiNWNv+EnMVpJt6cBdgt8e7nzK+W5khouBbgQyTqqWXSZPXgJQ923XU57qzxfjFv8Ltv4wF/TTD7gfFkBGTFOJMiNAgfm57H4+jG8/d4ZvHT0KGRxlFeKgjfc9njs61Ev8GQIBZcGAKBCgdzyo7Sbxb4IHa/CaACj65oZoxlEIdZXVrF8sw7JKSIm0Kq/psYIZeGPlyCKYyhMTaJbzLMMACZWjSNUbU0QASu3/8DmvXWMH1nAeD7Pzq1cGe+EiKMWpEpYQkMPioqKqN1GSmkJBMBy5JtgmRK4uzrCsWPEIEkpkihfQCwN8NTbn/vHI5LaMM6LdWGWeGQY2UZuIo9X33gNXuDh3KfnUK/XDT3a7J3WLAcmatW8vGndFWgdM5XMR7R+HVe+XsdfVy/hmZeP49DJdzCx8BwKtRLkWHYfQuyK1zzxywLY9qVKhf8k4UIPIjz47RqufPsNbp7/Dq21W6jICCrpIMd7V06DKAxrpj2TN4UcJwBQ1F9pBDg4q3Ds5CtYPHUc1SPzkJUKQtqz6F0UdnB39Q7q9SUDAGQSKbv26WDsmeX97NxBzNRm+4eI9h8/YADA22ggIWhW5pCEoZ77cQphOhRU5Hp7USgGrtTxWBmSBfTiHYwLdKoLLT430EGOwcHMT4T2JYpOnFZFjMeUl7G962cKZDpjemdcvnIdpxsNVKdq2izLOVxJl9ZJXh+yZCj5EVDyMD23Dx998gFUoYgvPvsSfhhwCaFMd4bZiD2KsulvMg7gcdRXWYTYureEh9838NPK79ion8bTJ95E6YUDyNWKjLFE1vCXxkAOnwR0POCTmehDja7/8LGW2UjJHtM5hWoIFFoNrF+6iAtffY7bly/Ci1soc4qtLtxjk+YzKD2yLaMxVcRsrYKz77+LE6feAibGEAfbEF5oOv/ON/Vp1Pa4BuMULTvAAE6smeX9UTexdozXD63dfLmE5w/Po7q/irWVVawt/8nFe0ARaGTQJVMTCKQ1yu0gYjNBv0cyzAAA2g9t1rqWg1CiTwn5mX2IRsvoUrycMeZK+n63/oJuEBzfzci6799Tw4JxWvWC5WDmHMRrPusQkkSXGABh2oUSBd0WiBOWiVb3zyAR13pM+iTN3h72NrpkUAuBw4sv4szHH+L+1ibqN27i5x8vYO16HSN+yPPG05B7NqcMFMQ2d2aupGzVYIEj45uAhL0/djZiLvAj+r/Q8eGJEbi6Y8aG49QFHpF8b6RX1/FoCTOTtT471a01KZ0k/AyU62OUDI2vHtxms4ko/9T/VvJsp23ceXCfG1wyr/1AKHqOmmUEWNG8V1IDFnRGSR7x/LUcMGavp5WHdzFVrTDovJfu/F9/HoBGp4Wry7ew2dlGUoJJWRGcYiAMVPc4lzXSoy5/YuL6YOZtHOt0GUoi4K6+UmwqzvLdJGEDO8/LdOq2S6/943T83lBig6kxLRO+94xtjN/AuOhCWEsYuJPuMG16XX7DJufIQpdZmaZ8j1QbaE8w7Y/lNsXpsk1prneptUtAnjXyczZsroms3x2D6JTRTyz5HFKlmfPKpospI4twTPSpadyrV5zah9jcmfmg/ppOLnDf7RJCCPwDAAD//7RdWW8bVRT+ZvMktpM4iUmTtE3aqCqLVAWQiqBSJVDFLqTy0Df+GfCMBG88FMFjEVBQERGhQU03KCVJ6yRO4vEy9sxcdM65dxa3TYUEI1nZ7Mks956555xveQQBIPyMWHitutqRr6AgN3EYukEq/NqmAZDqDjTngyevlYn6mc8KJEFTBlyBx9Bi3Sg9itBDXPhf+WNMNNqAORW2lVIPCPrQ74d8g80x042l99INIDsE5ikpB25sYXRgo3PzIX67/APufrsOvyU8RD43K+vkGZSa6Ynln7IpgMgIeeSO9XHPZnrAVEZ8UduvjuHk8QVMT05hbnYWtVoN8/PzDBOu1+soj1cxUqswR5yt50i0pdeDiiIcHDTYHmRAMONBiH63g5iKAGQBFbbR7pBAXwtxd4+TBfaSJBu0UOwkFAvnyUPS1qtZ+koPC+ZPE/yEoY+R1HCVQFNF/8CkmMgQI7aF0ZEK9tsh9sknXxlf3DRHlq4AFSzCPmmX4rnTpzEzM8fXpt/rwiM4/63bCG7ehRcM4HplDkSxp9gSqsTc/ljrQHiapyp2gCZMxVoMyFQthzlSecEzDqgEufbFqq+vkSi2praKi6AnKHajHA8Rj6RXmMRoBgec8Adhl6H8D/Z3dYd/D82whwaJKzHUV14Dvcg1EP6uHjNeIXkXfhcjESAoCxXHj4ynlNCfG3fW0NfU5k0X0jwjQKJ/n1/AJVq1vVBDyfU8GL1X9TE7NY2FE4tMO1k++yKeX17GqRfOcOKvPKpgOvygKrFtzv/Z9jXJRib4lbr821lwNYgOgunT+LF0cYcWJkx5SBTa7Q4vCLutAKXUziXhOUAxwdKVcIvsi8qjcCo1OJU2el4VkdXmbJ8NJ1Vx6b/3cBe/Xr2GxXod2D8Gzxpw18h2KNb14DoRF+1oEUBcwbDT0QIzLhK3BJuk9tlD1JXTjBTHZuZy0XSkBwPRezxPV8pzCVLh/moXCghMzi05GDsyidffv8Dn9enHn2B1ZVWPKTvnu26KXWY3EReFXduDFQ0QRgFxE9Bc7WD7j/tYX1nD0mvncPTlU5g/8ywmSPhulPixIjqW759ZqggXTdkiw3f5KUnNYX/nzpdGvxikDFuEJoBPFPPdA2zf/hNrV37E6jdfoXXzZ1TCbcw5xL3rIdK8WaYKxElmXKmM4BklvSIKOD4BnH/zPM69/QaOv7QMTB8R5XtXH2Nfobm9j637TXFaRBYjzRbppI64w9Oz9XRc82KYBAqSANjaQHBvA17Qh0saLoROibT4nspW77Y9JO6pkkPzw2G4+qNvKP5oaTqA0lwve2jxSsVlEsodc31MhD5KaCFMz8bKRaEMPk7XY2Orgb3GDuoLc+LimttEINJJYcmmg8zx0Ym4oFtbmMKljy6i5Dv4/LMvWMSNrqPraOhvZK56NlcJ4UFzq1LyUKK51d5Ea6WN7+83MLu+hqW3zuPkq2cxdewE6bohGaptZgUcvWC0oONTFm+LHPD/qEBwSCfCsp5AkVG6iKy/92JBwFT7Cn5jF627t7F29TusXP4S+zdWMRl3mSLFwlm6IG2SWkqEba3Obu6my3PBx3sfvIOLlz6ENV7mNaHtmS7g8Cz/91kWI9lyMY4BKVrUS+n1Cicwrizie50eIxxJ6HX8mSnU6kSbnMf2vQ3sbG0i7HWw16SmSShc46SKnc0mdndDjUI3cnfFjZJOQjsNaL00UeNX23WkQ8to19LhJ2LulSqOp0zp31D4pOAATeOzVb7xUdzShIUT7oSbOkblPGHouII/VkZlcqoo4K2K+1N6ZpKlboAYY4tzqJaXsHh2Ga+8ewE3fvoF176+gr/X1tELAsS9PkqUQzxGVtaIIkt6lNmOD/Q4PdCUhchcZ5V9jm1aqfVmk3iezy/XTeBxQHc5D6DGju+7XMgXdLElkPvh6/yURFk69GVsBztYOjLgAoWdUn6zfnxeC+FxmxR2IzQ6Ddx5cAexHaXaM5T70Dqe0SMcPN0nxN6kcB1lDUoT1sL65i0cnZ7DqDXD1N7hRk0WWYe0K/SbxC8mwepfv+P6veuInT4iEvVUYmVNx2VCr0k8xYUljwBPUmS32SgHE7V9aVqZeEjie4z0VlIkYK0kR9ynsv2LhkNKL6C8bmg9k79OvI8hhIfRJmAxeUgxyWjKsXsdo4RizeMn1JqmDuSsAOnz5D5HTW0eW5pXJecljSNzLN2wxy539DveX767r5NzI1DInylQUqhQIYUHc76sQ5bz/Y9iQbLwvrTNOKFJzL4o1lGeba4pNXFHRkdSCgFZcYoTgNhL0jGK0LlCkiT4BwAA//+kXVtvVFUU/vaZc5npTDsd22mh0MELJkZAIhrBxMQY9Uliog888MIP8P/4oImPPJvw5C1RvAdBUxQN0FJKm5aWTtu59sy5bLPWXvucGUBe7AstCczp2be1v/VdXO2k2cOAL0GDkZmUyjFpqYM0aelDrBuiQd1yY4RhUyFzkTfmW4biYKapyyaCLhckhGK41PmlQeMCxRQpVhtVGHox5JxJC2fYHJAc0Yk2EYnBAmlK7JNb6glhCWRqZ1cs5fpP+BU0767gxqUrWPt1BaoDpqbzBGHjLHOR9CzpU8tyZEMKo9sMxBzZY6RVc+yHI++L/t2YX+Qomlqtxhn31elJTB2YQXV6Cgcbh9mJ38bulcsVnkTF4tCBoVL023uIOj20maLf54Oq3+mxAZ8ehAjbe1yUE5KdEL0ujoTCFLK5h0NmUTrK9HHu0FgbelXKMSsFSOSlWxAOairvMMjlobbDag8fZS4VHtOyqMotojPmY6cXZhdcJWPoCEWdDJronZDGqNFoYHJygoGNYtEF2hH6S3fg7nVRKldNTn9iTIQ4ps43Y8fgQyq2NvQ8Kk+vYIsHbfJ5jebZooVmnseyAB0x8VOZYxFFxfm57EQOLKKk9gYxWiHR82NsdvbQCvto9trYifq432thq9fCbrfLXYCuXPIHw/IHOUJMp9/Mb6u0r4w4QdC79EaKNjaMyVbi6LoEHjXk4dFz5OIvGczKyiRssK808QpD7r7WNJC75GRpEPgIKmWMPzWJ6sw05o7Mo1afxgsnjpnvZ+qYPTiHcnGCDW3gBXnRy5RoN9u0/h8L9snFYX6eK6E7K8ntVyzFGGi2XsvG1SCjDiKRgpDRTbofo93cxerisnHmpUxvZgyY9RxpQ8Wj/UeVx+AUxxEVKgiqcwirhzBo9eAnLUrm58LUDh+/gRBY+OkqamSueeoEJsd81Gvj3OYtFRVHuxFAp5WHyHMRjJU5/izxFWJfseEbx90Qk8FGXiY+lOdx5ydhcCNlAyyn4PMY2y4Gd8WcfD7zn4gYpI0YUdfwDgR49ewZYFLh4mcX8eM3PxvEQxvjv8D0dEcKX9pjiEhFZBqWgiiNkupj0F1F9/oOFpau4t4P8zh08hTqL72J2eMvo/ZsHekEKydYHkQTzivkPk6WImoLBmsQxx2dJ8wf9XAXUjTPBVnWcWyYLNSdT/eNNtmNjd6/s7yB5e+/xrUvLmH9rz/gtB9gCj0EtHrFt8IVSntEZpAqzTrVHu/wCVOZ6fdoNAK89/47eP3dtzB/7DgwNQOQ/4exjWeAh2JHV5fuI+mLJILmVkFYUvJ5PgGGtG5LwPxzh1Eql7J9xHEToN1Bc/E2ko1t1L0ykLoMlnP+O73MsJ+BblnaoZgl8bms7Zp6PDCXMSScfK/IRMf2y35LxRu9qt6A5XIEvjuDxADGqSnoyFiqhhSzuoJK7wHvj5x/LjcOO852jIkivHZ/B+t3VnH05DEMHTfSTbUPalZ4XhzlXSEVAPWj07jw0XkcnJ3Gpx9/gsWVDTg65PPLhBrk4pm8eE5ZfmO1/q7uw9++heZXa9i9fhlrJ0/jxbfPYe70GRQbFPNGSR8pn6/FYsCAMEmHEksd0io3URu+NEjqCB4Dj+aALbJne+yXY9dNXtk7Qw0ve97a2pNJGkrMLu1eEJnUlvEUqEfA/s27uPfLd1j48nOs3biCQqeJoo6Z4aLTglw8PV6jDLzQ70sXBQGsaM35BPiMA+cvfIgPzn2AyuFZGIQoEWBKHkhqB4M35nNtFLDQI8W0NoWk0dv+B4RitLkRR/q57EROz0UNjXGgUuZnJiCAGJBj1TKOPP8MZuo19He38GDDR2t7h5mMcajR3uqy2ibKOHUpcujILgkX+2mMXqWE8vwckloVA2puFRLjLZQiix9+eJ2BkxiEOSZxgZmDUWqubkrLvFYDMWRLM28e8x896jnBtasjZxfJPsOI56VxABCTsVIJU4cOyJnviFHsaPSf7TgPkgR7rW20OntwSi56borB3AQaZ9/A3Guv4PZvC/j928tY+fNvNDe34OxHGPMd9uFy5XdjLwQ93NM3F30K2ot0wntgKIAtMimjEqaJw4Z8BCLHDkn3qP7vQQeG3m29qFgKkIqJXqqkIoiz+wg3Jy3wJ+/PKkjsz0Sxp4NtXW/i5u4tTs4J430UXRO6x1xinQMwiZUj2WGTKGIa1T5CLG4uYqO9CqdE/j0OVGKM0wuBa8BwDTF3Nek0dDmju41pxnrGtyib6A4vkO6gg5vr/2ByvILK02egUOOx9YxwcWR3zziSD20k5D2z1F7GtZUraGKT0XDyVwjjHt+ptHTVnTSPy7Pd6Jip8AUGl/jvh1jfWZJPwcl8VqyZJd35THRdLGlvdCHXIu0y4CDLwOXCTcxmPzCG84mkYnHdLvR7SSIfohY6TOXPnsVRRgqUAdMagWjkOSWMPQOs5515SXmHneYWfbYY2RPoye/CGjSaNAPyFKMUMCtz5sb3EEDAVajsYSZtgO4uMja8j0qjm4ACeyYQS5XBuwFCNhcUc1JJhrDRmGZeGzCUZdU0Z1hWYc5VGif6fDY2p71FwBFzBikkica/AAAA//+sXV1vFFUYfuZjZ3d2t+2y/aKhgILEYCAao8aoV0qiMV6It9544Y8i/hK9MJGgcEFioYoKlFIF+xGgpe12Zjs7M8e8H2f2bAsSE/embbbt7Jw5H+/7vM/7PKG9YStU4NJjrIhfWdhqvM/Jv33RRG00Y/6bjP+5VOEtRYNAgtAbbQkApOc2Z+DAH7oPlMWh3+MHeIDaAUZdB4oqCfMgTRNGYezvOduhHiKoggX6jI08QLa2heWrt7By/TbCrRyRLkx1THYQbVWOt0igg+jXOPkHB9KxB4yPNzF1ZBJT3S7m5+dxdHoGc9MzmCAK/9wsJiaPoDUxTkgDi82xx7DuQGW+izTNsfV4j3vd6Z6Iot97ssHUUaLt5/Q1TUV5nChDNAn6iQjS8UQvR54fz7QyU5rKwYPCBonlyJgFIy0cNhwZ6SZ3vlP0jq+Tc7K6s5sgHeRVQlk9SwsgGEHu6lGEbrfDfqOElPOo9xIUmztoGNps2kJ1DjL9nL7anUnrhPSaapeVZ3ta/cpvlOlftIgsuqb3X48bLK5CVWBKxgdGkNBcpeyIMtjPMlbc7w9ybDzZxW6SMoX/adrHem8TKQokGCBBzr76qWOzh0N0fl+Vd1GRTu0oHk5tvZEAiDbz4T4BAAAgAElEQVTPGh/co17dUj+zFe9RP+FQK/gUOJP3va8JCIuIGHGzIF9rrubo2BCANjE+hrjVwtSxo+hOz+DYyROYmZvF3Esn0Zmawuw8WdRNwo/rbCPULwaoBzE86aI+dCfOTPuX9/6Hl3EPNwkyKMgn9oFPNo5EpyeWEouvSDmBA2Hd9wZqAUOB38bq2sjYC8FARFNokP2ojjBuw4tiGD9mQMof66KI2kB/r0pn3HnPIGEfuHFtAY1eD++cfw1pSm0zHsKxGJ7J4HPyXmPBswANlI2QD5ai9PmAM4GUuLjHkvZLPpmJvROKawtRQJn1UFSBjwg6KQDrqCX7KmIKDT6Jxt/stvDeh+9z7xjtyVe+/4k1OiT5d9hbUg8SSMuZyEyxLvfZAi8yKbLtbSS/rOLW8hLqP9/B2OmzmH/9LF599010TxxHu9PkpC5ua0s7huwAWqc5+4fraqLgznNDGj1crYiXCaR6Rs9d1eGtFgYlJM3SBxWGG4T/9gpEWYmHd5fx1+93cff6NSxd/hbB5t9o5z3UTR+RruLc0nt1xfka1gX6UXwzQIs6iALg9JkuPrt4AR99+jG6J08B3SmuTJEuhFhZCQWQ3DzITpZyxiIY6ukxHdbqRuh0juIQnckOzz3pjw9E4f/pJup7CWs5VOVxpj1DdqGyqLRveIbTfCnNM5XWXRVl9+V5DsvNnhvPOJ+htp9s05qVo4JukCBZ7IINxrwamtKI99w1X2rFupcAaw8eAkkqrV+HrnugjcvFJELy7jdsk1kbD/HJxQssOHfp0jf447cHDNqwXaKEp5XOiQUB3FGqIcNYmaGRJOj/uYPV9cfYvr+JucVFHP/gLcyeO4tO9wgMWb5lBkEcsGGNVN41lrLxgqOiDnc2H3gAdv9327pGn437w8GOdGiSPrwZphRTQEh5VW7YSYTwrdoAaNE83MlgHj3C7YUFLF3+AfeufAd/ewO1fIsdLyJYsMowMFpq9dbj87UUn3/t94cm/199/SW++PJzdOamVdXN8D7M55h3oHL6PHzYmAOxnK2YORo13DtdjLzPLCiqcOm5B0vJ1b2TQd1QXH+kr5YUtWPUvHGAiiYk8Lg7wPLSKlbXnzoixmrD5QD7fLaT2Bwle80mmpPT2I8a2Pdta0ipNeP/xnCgwpbRXvSyMsZXuz2/1DjoxdTs0ggtn22uiU7N53XI5QnSnola8ahjlueo8Nsx9aTlZT/bQ16Qx3iCLS/HLvocw7fG6zhz4W2ceOMUlhZ+xc0fr2LtzjIer67y3Ij2RRulxq5LAQPsvE9XbEzDnzFzxhYC5QsAYMS2e6Bq+cIK9/l5UjtrWA9ljyWgvDAOpGZF0RoiElcWVVXU9mHDrenrPicuESVSs4eVRytol2280n2ZY8NQhRR53z20ndoZIdZ6BFis99exsnGfbXLJfYWKciEVIEh41O47pcqi6vWtUjwLBAaS7Lq8E6bBRwHSQR+L9xYxVjZx/vg5dGsdlZMdeoNZlq7LzqHiJmkHbCPBjeWbWNlcRt/rccsjAUzs6U9XVIq76GkMafXwbUF22NJrARYWnOvvD4UpqyLwkEVQqHd/JbBnBd65/UFBAT3buWe+lAIlMNSos9+/qM1qKGofaGF6OM6FthRQgeGZa0dbyYft70Lpt2wAt/3Abduh3Nf69LOIvs45LphT3uGsN9F1Gr0OASQp5XiUHzNAQu9TDCrXlWo+seaHDn2i7C9AF811e0/0PAaZiOEzO4raSB0mvx/4+Ie4a+uNqgqj61zmnJlphxmmU9pCW42SqCkxQeKDJuqbUQyJJsoP81V/hE+aGA2+aBEvoEABEaEUaEtLB+jczt1837f3OfscKq/uhJT0MjPntr/LWt9abmzMfOedMscp1PUV3cBxdYc9yQ+CkkXtcZuF0jUyTwC9MTUAzDl+tpgLQ+500Yel5NScX6jaKKSKssdJYqLmLVLpMJm0Db2SinWR+LU7+ZyEZ9fhxRnuXLiOG+cuIN6bwI/tPPnSqaYkpEUn0eVpmBReBhbEI7VnEiiem5/H3OISFpeXsPjCMgurEJW/d2QWU9NN1Kd8puW6rpxTtstLIwSDmNXuJ08GCIcjoexHEUajEZ+/yWTItPiMfPW4fa8UngktZGoTUbMcFutTbslldF83dioJl74WuvjjB7mUtJm/q6kpqfE9Y45EJZbk2UmFdmRl2O0/wmAS5g4AtplYKT9p6jZ7vo95UomnKVqKMGEEPHyCaJyhVWvxrD/YGUL83eVzpeL3qwt/zpoFCdLoMytRq5/TJuuRnQurksaIswRPU6L1JOzRO04z7AQTPI5CPB7uM7J/b2cbwyTEYDLGIEowDGOmgUVIcz0Dvanq2f3YUIutbrjqrjf6srpwr8yu65Boqv5Wz59aqYG0a8hTXzcKMJMg5FohtbQ9pQRfyjYPdQ9jqtVGd7bHzSiaA+zMdjG/eIyZKYT2H5qZQW9hjpkpPhW3XGzosQgJLHWnCHj/66pkjzbkfuGgE4MntB2ex/SkqLNDEU2yRczSTWyEUYCN9XU8uCeCSI6mFWcimETUVUoKiBXRnG7DcRuMOFqej0a7i4HX4JlPj/z2rYK5xBR3h83iQcLT1y7fxLFWB12i9tcybnA5dsxIvkXoAOkBkK0mz6Z50hjNEmSkA5A4UsjTPzsSgR7apCKbAwQj/7atlJttYeqoJmCZ1imzLRa7eMj+TS0md6qJU2+9iXarg153Bl9/9Q3iMWmAuAXt0Ux99Th4TjVmPJsxCI+EwkhUcTDB6MYOdjfOo3+hh61vX0Hv5dextHISiytvwF2Yg9clAUnAqYuSHgHaASE97FqgheXMI1Dv71rcFGTLPsh9yfOFtqLTKvo5UZuJ3TV6sIPtG2u4c+k3rF+5iFvXrmK0twk/2YeVDtF0fHhZuaCQxkqai+hBoX7U7KU40AHZ9PXwwacf4t1PzqB9dAmW3wFD0OT3TLsGx/iENQTIseTe9hY3DFPjma7ayNH/6NlbWDgCz7aV+kwiQn/3HyDd66NGzyTRi1MR5pQGkaL8p4kq/NMS+v888T+TYpnH4KqwUUkDQDYiYoO4DF1GCpUszxBFQYiaZ2Pa9THNrImg8ryWG2aRimN3bt9GOh7DPtwuUSALnvTBOw8jNRqwIGvXmTreOf0eI3lffP4l1i7fRBCIOmWWR/2DGwBQn4WaBrUkgDfaxejqd7h79yL2flnB7KuncPzt0+itnEBnuc4WrllDHn4nEy4jFXAHloEKcbKfcQkoj9w86wpQ/D2jt3nAtooDUA439NWr2bx/EOuF2C+tGGjRaRwAk41tbP66ir9Wz2Htx++R9rfQTMbIkhELJpMIFZiOmuZWohbj4bY49ihE3Ff73bEjU/jos49x5uxZdJaPMhtFijVREslFKY2Gbc40MZs6BxT//7U028m8fzkp56ZakjtQKdl8Pg5o/3JIXhZHNYRDYJCkCB2X4/9Gv49hVAgZlwv/4hKOSQC52cLU4ouIO12MCRml17YSVdi5+cXUCuHmMl0gNILIrCfGrgPEjAbK6JHFRZjSNbJU45BAEsXEEsQT+XnQi5BAtg7zi4KXigHaY0q3ZGbc/7pRJeEL4+ETJOkYcKdlNJTiok0jtxNsjnfhtGp46f1TmDt5HJu37uL6+Uu4/fsa+n/fRxzKqGnDErccFpvMG1zM+5JGBbL8FjbPkgaO6PCCwYiZBY5HxVRcFKEw2Md28SRrNJ2KQKFUx0Vh6NgHFPLIEWwSE11/+A8aNRe91iw6aHM+QYs1RdSnS/N9LObifx/72Av2cenmn9h6tA2rWZgp0+dhwUKz0Wpr0WordzKg+4AKQb9WZ7v06qIGwePBU6xe+RnjyRAnjr+GnncYTdS5zapI63mbiPL2yIq4+N9N9/DDHz9h9eoqRg7Z3sh7k+uKywzqTEZnMzlOElrVGnGWQdmXAjXO3dh0gVldZhNA12xsF+sW9ndQI+WMYCvKPoGRiRL0TCuz+FXavHntnjlXqrlART8Bq+yl77pcgzIoZCwtxkjX43l7kABDctVNIVI6Lq2Dp8Fw+krfI/CcWEml16m8Ls3vi2sCiRWKHoDWOqPYJiMMKgfKx9w1m0UaHEW8tOGQxgIB9fWGuveM4wXwLwAAAP//zF1LbxtVFP7m7Vfs2EnzcFLStGpRSytVqlqpC6RuQCxhwQbEFjb8FlZI/AUW8AeAJQhEWxVa+kz6dKnjNI2dxI7HHs8MOuc+5tppKEtGiiI7znged+495zvf+T7XkeJ5qt8fxiKkKgnc96DE22zLuOGZnyP35EsFyMkkVAkyZAJ/mW9iOoG2TApakHerQvAs6XMIaQFB+6VkOZ8v6BaAyY2RHkck+NS36kUWttae4c8ff8XgWYgy24UJKxedolnIBG6skaCNSlpg1QeO1Ao4ubqMpaN1nDhzFvXlt1CpTiNXLHKFmay6WOtgNITrRDxJ9rt9Du73qWc/JBX+LqvxR90+Bt2evDnAfq9nnEEMN5Eq5CxsJmbBWNL9CJAYEGpH/bg0SNR9M/YQjbJKmrnZZiSBTMVSiwDKqqEGWVQvamSIBNLfh2JAEs0kTGMewJTLpxIAcCeuqyUDXrpGlWpV7MgRuhHYGyKwPbiBiqJ82IyQjrLl1wrF36xEZqTiG0a0UFHw5zlcnSbV/X40RG/QxW4YYre7h/1BiO29HbbZa+/scI8+CfT1SLyPq/raZEv/ntSBdS1bLpSpca0ztdYsaTdT/ET/WDr5TzTwopBwxkdMuqCkyipWiroH49i/vOey0YuV6n2gkMthulzFieUVzNRmsVCvc4I/s7CA/FQR1dkZFMpTKNQqLI5EYECuUODwjnxg6RhHHETmBZFOIqi8UMepFmT5v20kmBft72Kz2cDL1ibm5mfZ7oieXha4sR3dEsFXz/Ow12+j2fwbO+2OTKATrR2uggF+xwvg5yqwiZ9NAIBnwZ+qIAnI85nmUY8F/cygnRDYMvW+RjF7zD951MDJ+iJXJdNwiMSNuYeWqvdUtSJqGivRymQtVVZFFAjGsrI0orkyRuoIxpLI9S0xam0ZANmQHuoGVCR7BU1dABKPI50LFr4qBHjn/Gl88eXnWFqcx/fffofNF21ZsUl0oGNqVSggwFVMIK6UpPzcBylQGvWRdLsYkcvFRgutG7fw1w8/obZ6GsHcAipLi6guzGH5+FHUFmsoz1WQL3lwSzkWcAz83KEjzJZECEd6+PMV2B+ySvX21hb6r3aw9aiB5to6mmt38OrJGvZbz1CmqWWwhxoGCPyEhUZJ2TxOE92aM/F4aVYBqYrTfSr7wIWLZ/DeR1dw+YMrKCwfA3JFxEMhDJS4CdOPxZoq+Ni0Vm1tv2J3D6Jix7q/VVX45NdZgqlUq0wL9F+FxNEQO0+fw+n14ZHCoqUoBKn0/bL0a0v95v1OSoy+WVx3/MNZAjUGS7LlmtxPFGutl7F/JdEl+ChZHorcHTw4sHsFn9I1JkYF4RcbrRZ63R7MFOW/iF1Z0umANydllxJvNo9L715CdWYWX3/1DX77+TrCwUg7pbxpFnOk6oCLAaxogLQTImx3cf/2Qzy8egf+0nGsXr6AlYvnMHf2GOyqzy1GIamwO6KYIA7OPBmZtLGQoAGwTwKah5xvIh9xEjVO7cyhyNZaF7ZItIai5cWNgNwwQbz5Ei8eP8eD36+jceMGGld/Qa7fhjdsw0v6mPJtxthJbpRiByfNLI/VdwivEDEnePK0KPn/9LNP8P7HH6K6UheijKxNMRBV/zjiJIQC0n/dDqn8Q1cUHZ3opRMxDScYKsGWdGL1WQ0ASLtpW7WU0EfJEzwowi+U0e4M8HRzG0+bPcOBJ9WtqTAAgUg0VKHnOPDn5xFVpjGgpMXCAXHaMfGv1wABZvWdi0V03Wk9IL0XK8la/FxnXCuAgT8wiAz7ICsgkV7iBxi2jsuML3OcHZbw0LvUekquNFG0LxhaLtGfU277CUoO7MBFLwqRHsnh1OJ5vH3hHF6uN/D4j7t4dPMe7t+8ja32Loqpi4DGVyyo9HQPTR0U27i+kz32NK57nV2Oo72iSwQ4xFasPc8nN1GcVD7uiRR3G88xsiKiZBcTk9l1UGI7uwib/W2Mnt/D8XofUWUBJUwhhwCBZD7GBjQUMyN0FxvdFm6u30Wj05Tii0Lwj5XgXfMeqZ7xLFdS+miTgoCqek35DOkY5fNFWEGKTm8bVx9cw0aniVPLq1iaXkKtUMW0W4bwQBJM19giP6oQa611XLt/Hbee3EXfDhkUILBvxFXkSAsKK+aJnfNgxcKhLbYS2UYqGTjcw+/A97OquK7sv6ZvT1W4CYRhGr7MLblNxxYW5UyTl894LNmZSiFfAQjqNcegBkidyGfcnDPVcUJX/ZXGBLFi6HVG0Tevt2IS86NieKsKcCBbi5QmHe2Pzp2OmfJi/qxkTtB4EtaJBpuSijs8Pwkmgypoq1YD1qnmnFzOawYTgOIIU7zfPE7TOU84Moj2CmWdSN9JzAAea8MI/wAAAP//jF1LbxtVFP5mxjMZO7HjpHm19IGgoaRVKGJRYNMFC4TYVEIIBAskxG9gBYItPwKpmyIhwR+ALbAAQau2NG2B0qbkacdJHDse2/NC53HHY7cVeGPVUtzxPO495zvfo5BpNjQqwB5BUzIwQE8sx2Mo6kMLiDE9oP98jA84ZDo+0xKICk4Z3FEkjTzlRJZKrOOH0rRNY29uGqK0Epggbot2huDFcTJ0PPwws25C4hue9HJcsVejm9gjGvlugD9/vI7GSh0TITRqY6Dv6mtsUkH10zTpoRao4gLzVR/nzp7G2eUzWDx7BnMnj6I0OQF3rMgmffQApXHAmmKJ0+tjt32ASGP36J0cZ8Ogi14nEDw9jrIFndBw3xlQV/hjKjgTF4ltNPm2Rl/Iv0v5RTwVhkX+2fMcWTTiLCFBwByTssDbeB4tjkyMB7LzrLe+fJ57SEzUlOMIFY4aI4v1Wvr3qaHPQWmAJk4H6IYh2kGLCwSLFmHyOdiss9EV952EogU92mmMAYNcf18WZtIjkaNsL7TQ7vaw02tzhv5mp4l60MJms4Fau4WdToADavLjHjfzhyON/SgVfxTtHwg+dGFIkVGrkKNWp+lwc/QkqqutqLeVYd3QqYho9EcZLJHS5+i8E8vCzBMs/R10fSk94cj8HGZOLLA+f/b4MZx45mnMzsxjYfYYpqdmuOFPaLEt+SK+dl0Y3VScwyG9zBVA5C2xEr9tS+jVTDZ3zKQ5Halqn/SLB6//M9kZBiQHoKSlZi22M5ArdbvEmAmwev8+tjbWcOfmLdy9vYJrv11FN2jj/bffwceffYqCQ1KhNny/xEUHyX3MpkKxlxtr65wPPU7UO6KNp3IXJBr/R83h+EQZfrEMb6yMPnyhypUr8KemEdQeoBCJNtbVY6bTTOAhbdh0tknbvbndwE6jianSDNMhORTAMcVrnBWmUODUdqTQ5VxeS6Z5fNZJ3BuS0VTKzTctVFQwktkQa7OtHjf8xAixHFdBUGneeMMyYJIjEYgUNBBTOesXcPL8c/ho7kMsLS3i8pdXcP3qDRC+OuZA94BUGUcywTSGeMYgz1H6fapWIjQBjK0Avh2j022j39vE3t7vzJpYc314pTJuVabhjVeYUeFPTmHyyByK1WlUZubhjY9jYnwCRTJf5H0q5nUqCSWu6HB/H/s7Gzg82MHuxgP0DvewW1tHc3sTUesABWJNESvBTlGxYrhRghKDqhE3sJ4gLSx4MBAAeS+kLBWReQrrS6kJjFNMVx1cfO0VvH7pTZy/+CpK87PsxM9FSYGekL7EH1lmPiTNeLO5hxalr5g1KNGBnaFFK9BMl59iXineVRwoYy7j4o01hI0GigS62iEcy9M1VaVpYWiwBqZNWlY6NGIYbs7zNlFPMMd6HEhA60YvkvSeIIFH1gh2iXUufP/1+syqTtShnYwtgyCET2DQI6FVo7M+sA6SzmCtVkMn6KDME1FP9pqhmKzh43/sOkImUa6QcgtVH0sXlvHJF5/jq8tf49sr36B9EMhqp1NOg5/kXwPQS66kp74sRasFJw7RvFdD65+f0Vr5Dg++X8Tk6Zdw9MULOLJ8DpVnZ+HNALGrHp764/uhmFtFffWpoFi2oivpAoneC5nvweMvCftvONo4Gkp1Is9iqqBYidgxe0BnNcDWX7fRuHsDWzd/wf7qHWz9vYJC1EHZTuHFBNJEUjeEMX83UfadHKPATGzNZIwAYVef9VOn5vDeB+/g0rtvwV+YFbYiNf6Ezlmy0xZYBedo024N9o3/SIkxtGEYf5qcZNHsEzT8KVgjsLhla8Sj0ewkfHJdNWDjzx2Ln2u634IwRTey0E88PNyoS4pRMqgHTE2QmkEJRXbaNoKCB//4SdgLT2GXpqW2nTH0BJO3H2n+8+8wvhbKdoUj69tMsYhOrc4Rs3TOPfaYiNgkT75fn1snV5tEkRJwUiXqyDptaOUxG9VacjM6NsdJU6rUbmNfbv5R8E4k1KzCIc+EsBfAcqaQ2gJ9EJhCLu6se+93VVucoNFro+iPofh8FUuLL+P0Gy9g+Y81rPz0K27/cA272wcoJpqMggi+60u/QOB5rp7g66sSXmKq0l7TbbZAQcvkyRITqGQPNOcsl0tjnfSHCvyYtc3Ommvk6hDbGa5PPDXNoOk7Xbu+3UW3W0d7I8BO2MJUsYLJYhVle4L3C6qdeqT2Dw/R2K9ju7mNzWYd260dNu92yuKhZZvs9qH11mLTSZpGiybeRkpNdSx1smPuXSvJfgfT4h1LB54p4kKIVnyAO1ttrO+to+pPYa46z0w+YgGSp9BhELCHw8P1e1irrSKI24i9FMWJMY6GI380Ome8vxlKv2GAhOKvQLIaNpjz5VpxE0opOr6rtHNHhsFal6XxIKaTvrtH8hp13WdGqiem8SF5deRo+CYJjkV35DFCcZoaG0lTcdNsc+Q8O9sXssY5ew50vTANua2sBZqCEwuPKfEmWj5Xb2eRmsRQ5sz/SKLmGQwQVgAfMycIDI6ZIw3HSApPxuoDcI+AAGOeyN+f+U6I0aH4Y+UkAWQkmrEQ1A/BIwNiYSZK7228CyTWj+4Hlrdo5J9hxAwG6iR5kt9v3sU0vwAgxL8AAAD//5xd3WscVRT/3fnYmbXG0CQatzamjcSmoG8KPki1FhSp4H+gT/bNh/rg/+Gb+DcIghURn3wTSilW2xRqW0tjk6bJNt2v2ZnZmTtyzrl3PnYbKA4sYZdsMvfO/Trn/D48m92w/3QaVmBvng/j5lAufPuUByH5iebGV1A6SkQQfFnxkYxi7szcDASLMpjWGigXRuMSYFUYC5MBsjCS6Ws6o9cI5iwfrCBVVxdqmOD+lU3cu3yDuUn27+nayylfihVNaZgSZO711Rfx9ltv4t3338Hy8Q7ml0VBlRZVnQ0RxwkmpDQ7jhnSHw1G/D4aDqETEZ7Rk5Qh+1QH8Wuk7cJxygUBqNBwjhUbcSAEBF7ssgant2qBiN+xGmUjY67gauEcsQ+mJ+4L2lgyWsXJ+qIrg8gzC06rcchq+O/bRYLVJXO2fmOFSVS2TrCwYwmnSlRAlIyxs/MQOhrAJZj/wROE47Tk6tFJhza8FmW8GLpE7zWi8RgHgz6GaYTeYIh+NMF+f4TtJ/t4FPXxb97nCltiuPlxXcVesRB3k6Ntn7eaZeU3K/izn1YQxpoPf2FrZM0Q317KVPorJ0ERSsmYoyYQZtvF9jCaaqm++mJjj8XFF3BibQ0rK6tYX99ggckT669hgQQmlxfgtgPm6vNGz3BktxQFguEzomQ2N6HHs74JsxWy/+/rf7gK7/ShDrW1YTrx1+v2cPPmTWxuXsf1G3/irz+u4e6dv/Fw96D0ZLeInV8u/YqvLn7N/H0K/mVTMs+BIOMtj+donxSgaf8KFAf/yuI4XOMiQIF9GCB8bg6OG3Lmm9XXaeGnpIJPSKUxV8507cHbyrGIQGr00wn+2drGyVeW4IUB8iLhX8hV81wsHaBL4Su2XYNkhDkRk2lGHPCiniYi/EIicYYXbm2WRknCdJtWe04Oi0ah3KpOz6wldGjXGYLFNs6eP4elTgc/fP8jfr70E7r7Y67utw3HeWJmtr3t+jixKHG7TbJYWC40qknh4EhmGLKTFvRoD+nefQzgo4cAWoUs9JS5PjIvhENwZN4InRKKyE41WjPn0GOx0xguYrQo8ZEP0UKGNqvzTySoJmFFnZdz1LWUotpVh+XbCi2LCJlZQuNp49RxnP/0I7z3yTmsvLFBwi9cidexCCJBJY2/y1VPhuamjEAi9FFmoeqllzeMwrhjxOFkr/SDQOxJSa0tHkIf7MGn4JFoGUUVrZbankUTpCyOn1rylMXsWvTMl62g5kqQWkQbcRzESQyfynAUyZIgUjEbQNMBpQWNoyrEHIJyb3ja2mjnP90uBWmcZNAGwg01c1h/2tVIEijzXXouriijHlt/FV98eQGra6v47ptvsbO1x4kYi4w5jJNfEZ6sFlAMR6cMh04nA2R7XYwPuti9cRt3fr+MI+vrWDx9Gkun1jDfWcTxtWM4ujwvz76lkKRUnBARyML3kYzowGpU0V3zUo0cc9m3DMGG6C9Q8orQ5sQKouR5NhghH2Z4vNvD1oMudq5u4vHtu3hw/Qome1tYUBGCvIeX9JDb0MqqvUsa3OyAen+IrkbBa5Br5vbGxkl8duFznPn4LMLOghyomVdv5pBTzMyzZx92khQtjFc6zS9do6yytkGelWssoUIpqWrPKKIhVSFCbLFKGfstqspSIpHOOkHQRuDP4cH2bXSfROJqWVL9dG0MWDV2IFUKw7CNcGkRSRAi81u1fIZjKBqHJzjqVe4SIWn2voDuSSvsP3yETudlgTAXZGtrx7b5lqEA2GDfQVMX4ukJd1GLpORcy/MPnYuofS59lXOSMXUIzX+zmzEAACAASURBVCaiqFViWfYC0quZqBRjJ0OiUqi2x3omK/MnceL0Ks58+AHuXbuFq79dZqrAJCqQUOBP6uRuJfBmz+L1NinjWOHVhlO9fTTWXIMu9jyHBcoLIxzHfGci8uaVTXiJDDnsUpoh/ZlT4CDtYbgz5iRnmwQBHb9MWrDNpFMgivsMsR8VCfIQzNXPI9E8KOy6p1Rpu1kYKzx7L5kJ7qo2aRG/Ltuam+kpGzjTi0iOwBHh4v24i+3Hu9jcuiWJRN67CImcIAhJDC7FJB+j/XwLQdtDqsQVjZ5hVguE62c0C0MnYUDafykxYvXWqIJcui/ZAo2hndnL93xTiRZNOGfKFIPb6jbf61r8Qv8zJitXopd7Tgl/18YxjikyJnFQ3odjK/C6pJq7fO9Rg05GY8OOB1H3F9SFJAHEoa4+xuz5g/rDugPYNlMRmujHNh6wl1T5rS2vjE/+aWOt2vpQpxKIaCXRxl3uvyouo+ItJQBE4F7Q9CT6LtaF9n7rhXyLsGc0hUlYUF+4nof/WLuW3TiqIHr69kzPy+M4sZ148CNPRDYhCkJKgkCKxALYIAUkdoj/Yg0/gJRF2CDYgLyxsBUlkSAkkPhtx5mX3TN9u1HVrbrdMw5JFszGsqfdj9vd91adOnVOyYszWFWiHAUBlK5EE4BHFiQgJmhGbQzcZE20igHvODTuoFTFUFq5UhegdAX1LxR0X/dDA2kFzdAbzolsKNWrNFfxfJ3NOIm5NcIqamEFabuPx7+t4vBJDxMpnP9m6tKhTCpWztopQBUhGkgwEwKXL5zCjVvXcfPWhzi9MItKPeLVb9DvwPZ7iNsddA6ksv/CUfyZ1n8Uk+qAi9+FwVD2NzH0FaZcaEIeNqWd+gkw9SqTQxaWyulomd8SvmfTxz/aD0LUEQkOtZ3CehGtUVplKarKy+bUN1nhs1jpHudlcZKSiKVEBY1q3dP+1TN+3C844wBviJ/v3sXNK1exENVhH67j4P4DJBubsGQpk1ZwQNR9c4QXhK522zgYxNjuPMceJWzxIfaGfXaWHhZE+IpgjrYh+AUug5fj00EqetcGhck2p03ncoZGrIWU4i83TLZ3/Q36Pv+XNZmvSHifG/drqOerzJOy4d7zubkWTp2ZxflLF9A6u4S5pQXMLrTQWlzAxCRZSU4jrDVIcEMCAkIRnNqtUtlHP7l4ipgMHqvi+1jQtxsUE5psxJdbv3nTZoDXMQCK1DyqAD59+hSbm5tYWVnB6uoq1tbW+G87u9uOKWKk2mwdmJPJOUei4N7dPUC/3Udz7jRLDXFFwaQoMXXWVZB3d/ewt7PLokVGeslD/t4h37Q9uQJU6xM85mm5hmyQsiAT2QKW6hP80x4aeZ6sA3l877gRpoVh9d17jx7h4sXTqDXnufJuJODXW2GkVYb/lwO8jPvIM+mNsxz0y1zIophlZCTQNAxFxMgpzBH1+ChzSrUl6xTK6WDqYc2QXOF5peCeWw1SoUA1I1y5cQ3T8y2cvXQed364g5Xle+hRL3G5hDJcEh5ko0mdivqlBQDEeOiJO4hdQBcYT28nINVmZLvUcyKVdH0k2DgMR/qDvbWjzl9y/nTuIdsjuuYdWiRJBDO1TliTLE9Lx550B8pkQX6PgkKqR1VUlbicPVPHlffexWe3P8f7H32AyaV5V4EIyswcyaxxKr7MvCi28YiC8GCAbqeD9mHfHYHB9JcLGdErQoyHBoHrxOKg+949QLy1wYwFQ1EUl62HbjwUzMj0HcorOP+3BicDtMBImwEoUY8TUeAejakZCE1SNGoVXlNzOrlLWFJRAy9eO/3W6VluAeDqjqgdM+XUrz+vTiozo2mQjI/sg6jpU60T+OKbL7FwfhHff/sdfrr7C0+Z6RiAoa45gZ+mxfLOIStOG4B7YYcOG0n3YWwb8T9P0Hv2K7rLTaxPTWNqbgnb597BiblzmFq8gOaZRTRmZlFrTcCcBMwEUAkIjARbyulapqwy/ynEBYMjYNABoiMg2Rugu7kJu7+N9uM/sfPXA6w//B29rQ0cbm0hsjGmyGoUCSpBgpACf7K5zKR9RmANXRXSsbE1hfsTiOYGgWHXb17D7a+/wq1PP0ZpegogMJN6DqioYIS2bkaTrGBkdXn1euDaGvMgnPSoggL1tijyRe+iGdOs0AqbrrkOOLVOKFBU1zl5Y7VzShQyrD/bwfP9xINCmYxOKgOvcRhdRhwaDGZOorE4j1h6dQOvVyRaNAETsI8B325bSUT0K4o/S4YZkdT7HVFf39/PEJSrCGdmYCKZRYmCzzaIBmn4pi+4wv9iTUkAQKXCFV2j7kjHpgvR6mfxPSrMpSKgqZVMmm8HIy+N+p5HtSoqXKnucetbPEj5WM3LJ/H2W1dx+ZNr2PhjAys/LuP+8hq62/soDS2qQfDS2CmQPDGUZxYKnhCTS+jUevvZ9k1iX6VXoxBbeBu28Rf+ZR8BVqi7n+y2KS/pcu+WdRRqos/HCapRyc0LDPaWnDA1s21zjZEcCxOTXYn/Ne/hd8FkI4sUPaPcax44W8PyGNOFtHBo8rGBixOY/p6qGLArpJE+G6oRIqpIJ2WYcsDnaq1bf7hoSOJyhX27ldCNzSG1Wddr3oGt3Wljsjkp75CVxDlPMlHYD1f/45i/o1Zt2NFWlPFWARXng8QHmsz6JLzg+a/t6OPiesWPghW8vT2+TZ1clygekgI4H4NF6V0enCfeMi6k42aFZSJ5rW9dSJ2+nT8etyjkDHrX1qBMAwdoE4tm/FMshqu4n14/5WVFFhTdE3euTuNC9ff0OgaxMOzDHKig+0A5uk0S/AsAAP//lF1LbxtVGD1z73jGdhyHRxNEStNIrYBWLYuiSlAE4qG2QkiIBasu+TX9EWxgWXWHECrbsgRUIZC6ACEQVuO0TezUju3xeC76Hnfmji0KzCqxlInnvuZ7nEcsavwyYSGHwF9epZ8SCT9APikn+EWu3X8W/LNSF7aBo4CHSxD0wtq4nFAbbkpTJcge0kWHBXcAvFhdZGrd57Jj+JSuIl1p3IClaHScY/BHH/v3/0RjJpzpCSWtSzJ5dCsSsGoiZ7G/nc0m3nrzMt659gFOnjnFB64rMsxGQ2RPhnjS28P44BBHgyEHQZPxWKGxYFtA53nHFGEY6ayjTKTAQlyovQhD/F8hvGVIK4C7QwuFCET11IvFZhTCUo6G8pkXWumqFriVahUl+rpZywKEBsMyL9EKzzv0/RT+lviqJySChjbieK9agOVPIYxJE3QH3P3uLhr5AhdP7sD0DuH2HyM7PMCEiidU0Twe4xGeYIwcI4Lp6Xwf6yhNVYCP97Wrf0+xd3dYliVxClkWr/PwqrP2PE/fiylFtURGgqKyiagb1vfOIxXmQ4h+8JX+qAiq/ob3TbfbxebmJjY2Npiz/sLWFnZ2TrNA36nTu6w03X3+OZi1FtBpy1jySyFlkTaUQZJRZYFYaS35ku9AMB/6WRRaVdURSQphLAek+twLSUZYUST4tytb0urwkLxy3FmMZoabN2/i9u3b6Pf7vKd8FXdRiC1eAjk3PAWl8FiGBdBsxBwoUAfg0cEAw6MR1nP1ReURikuyITtXHD5mFEAriTlFUZFw2QtWAi6iTyRpC61WBzPay8SdJ3FRmyJK20DSRhZZxGrkpE1LuCVYMW3fh7MFftt7iFcuvIxZcYzYFFoU1AJRJBBuo7Ea7zG21BG6EHd8CqMaf4Wei4ZFkZwVEUwq0gjHvLJBqrXzoroCfOSFE9Xyhztf+RSNThfbZ0/hxmc3cOny6/jmqzv49us7ePDXAw4I1+K69VipD1e7dzDfHgnEDxJ6ZwirmIkpkYr+oAQsoFyKRYA4iCr6ki9jFeJOJiSbBaGf/A4MS6U1OcMqcUYeIHjU7i8FzpzdxvvX38O7169i9+I5NLobcCQMSWdMPpVA0llpXoWiwpFW/2l05wvMJtOSdyzFh3wFg+Dj+TYJTCat6sGp0DwgnrbufSO6EjV3F+PKDprvCAaPvnItB9r/xLF3pXaLEw72NIeb5Gi6GJYOYUI/EDQp1wnQJIihwXnGDjaNtME2mbZcD06Tf10hCjUXb2MKbIDpbMwimJaCwjhRK7EA9fAfrvAtWXZiohymGePK1Tdw4dx5fPH5l7h16xb2egOm7XgaRaF7t0oBJfkxamvMse7CKWnKsWp+7CRu4Nbc5AjT0R6Oe7/j15/uIbPrMJ1NuPYGnt1+EXknRfv0FuL1Nra2T6K11kFzvQubJkhabRF0HY+rZ40KjIYDLpcNBkMc9fuY7x9ivn+AQa+H+SP6vYeOO0ZaDNHMx9hAJlZsSjtb+DEIxmV1XZgySYmUL1/aE5Lb0XqCqx9dw4effIxLb18BWol0Jz2MXIvmXrQ0XFHufyLIxEWiIXFIITr8YfJvVfh0UVSryQRoF6cBdZE7PUtdWSiQ+8zFmm06w3gwwvDxEecocubLfYtAqpLvYaT7P2kYrO3uAidOILOmxln3TY+wofO0y+tOxbS3qQBgIjQpkX3Yx6SZoNtZg3XkwGNki+tyNM6oIkOw1gP0GVORyvE22hCQdxTZ2tqken9H7J1f7sgAlSd0GoLctxoWMVeNEvkeBDqz1SnGSFNCpxEilCy6k5gbYY22QMXz6Bj2mZgLDideewmfnn8VxeEUv/xwD/d//Bn3v7+H8WAi+hWFiA36UgzPh8mxsLnGUeqKYyOOdQyJ/RZOu6aZqrBL7MvdXOVZ+/kvVCA1FLk2ATIL2ohIyYqOLM/nUv0ilxFyWKD/SwWbjLr3sUDbDSEq5qI9QvpYyxcXEFGdyZw80prKJa5ZEYlT2znn12upwwItakXMNUyNiMSNMEI7lfcGQf8JSY1swRQEQivQ70yZZnqU5XngRJTsW+OwCSk/54rcpr+hZJpiM7I1nytKmxFuVAjL5to4tKWoH12j8Yih9zl3sYuVZJ0s77gjXnL9hfJYKfcbSXoLr8JvWJiQ0T7UFClWC4nzTNe3Ub68NVqEMDV0AtOVqaioDVjJdUTpny3+OB5byoeV7u41Auh8oLyXzknRtauS/vBv6fn8sPjCxkpRUPUX/P9hAdNgvBjtpO9AOhc9TdZ/9+XYOrwvn/k05zomrCViLP4GAAD//4Rd3W5UZRRd33fOmR86DLQgtIAUYy3QhsSfEBOJRgwajBcmJPoIvIIPYIxvYWLkDUj0Ri8QYoI3BNHEGIPBUkPTlJFSOj/nz6y993fOmUbj9KKZ6bSd853vZ++191orZrVlNBzLJquopLM2Om2lcMYQ5iDyn8gv2/GQJG04csWMHyL/jEl+GMxcVZTH6QitblvRIvp4soWzUC9I2k3lxm/15igQGQggbao+IBcTFf4z0QTynqWSnZXTVjiuTlpJhyWC3Cs7aO8UeHDnPnY3U3S9BojeAl1XorIE4vwgD7+fA0dmgLNnlnH+wgUsLL4gLfiOAc2zIXY3NjF4uIbBg3VMtkdyDayW7zPqQ7iZjvxFaDWubFR8fLVRh1kRPn49KcTLMQhNBJuStiK2pbPqoCVwHKPI/Cl18ujCImBRhLZk3kNZUJEqzfo66Q1IdGEIMwzEobBjLC2fUeV/GSaoHFhtVS5NJyU67YN4cWkF+3/8FVtEoigIwkm759B35hk8zFJ8c/MGvlMKc1WdrysudVV/rzhXkNATDwADOqYeub5rb6zhmsl99apVCBrPNTwtzAu+lI2es5MibXXbs27epsDXqKxX2Lm8yhYrrpHZI7TTOybfj518HnNHjuL4qUXM9HvCxyMQcOjQYfFjlaq+D6GXb5SFm1fjrZMhgEDTgiW+Cgv8NEDSRJEbfy/aG6hYBiaHKg/QcC7YGfRvqX8I2KrneS7V+2vXruHevZ/weDCQ1xfm57GysoIrVz7C6uoqDvT2K0e2BO7cuYtPP/tcOfJRDVBIlxLbAIMNpI15yyUYi2Ky2iBOsqyypyL/drC7ixPUHx+PEDMoUBaaqBgX6TY21textf4IbpIhoqaGVzffwhm4wHXmOoiTGbSjGMMsF66gcMyiDpJuH3FvFrtbG0IDaNu4ZvbdW8cHv0aWI969v4ZTf23i7NI8SlYWxP4ukXmWChewkCCCHGZp95aErhRAkAdkIYdfjk7Sk0NcB0OF+ARgtUXT7x+UaoxUiovS1KlrLY+6IlsnY9I17dTon9xOoVD1Epx7/WUsLi/hzUsXcf3617h14xbW7q+pt3iploetSNGyOHCREVxGCtPU0GC1ZSu2augV4LL6BBVW4fYCAFPzs2GGVYaWY5vHjfbO0GUY9pSyTv1Nc8F+z4Ab5i08IxZOPodXL72Bix+8i9Mrp6UTx7ViZAw+i5G15xdyQ30UrPeKelTL+hq4WVIANrf9kAKxwfYQBknwfR22lpYZZlsHkBSxsubTIbC1DS/ZqPJEndfuOCacjciiHpsia1j3Gfja3IPLRquYLi4d57L+0Ao2aZWlRVjb/EUdaWzPJsBuBGQt8kyAcQCYfDDwkvOOGh0zM21sM3lACybvWvupO0W0asnUQvjoDCeo7YFsF94lIu7JYL40Ir37P+64ITHOBPZKhPmg1ymCuvDoL/Zx9ZOreOWt1/DVF1/i+29/QD4y8Mc6BJ3tjb4BgCd2f6ul5/ScDZ193DvIDvbkmZMskz9DXsTI/v4D5ZMYo0eQdf70doeej9hq9xAlXbhkBs63hPbCYgETAx3VTDqYJmN2Fu5gONoRwCFKdxBlE3TyEvtYiIF68zvhe2dVx1qYjlWd33zni8BBt5924pbQFHWHVZu/oE3BdyyfWcQHH1/B2x9exuGTJ4C4q6tJ9tu664KipoW1ME9Dz+U06OCK/wR1pGMy0tYMcrplvgcQyDpG80aC23xdF7qefxp3edFlclbcyEXHIJMEhO32rGw/WnuIxxtbcq2pbJfe1riBsryTuQpGs/MQc4cQHZ3Hto+RxU74ypOyAeq5YmrTasZ2FXBnQJO3A4u8cVJ/Os5jlpNwOMBoPcXc8QX0kjkMUgLZLeM1e6T5WKrQwZlBwTpnlXJzMDG4s5DUn1VktcpMZhL0D+yr7w2TXxeUfRpJsQD1kXR6cj2qNk4u4LKrxF/1wfnKsyMdpkLXS1wXMR14mFPESiWIpBqZwnWdtNb7ox6L769i6b1zeGfjMtZ++R0/37yNP397gCebY9G44TIeOeCl88sYlE8xoe+5z1BanEUarYI7WpUm/z1L8yoGzC2nYTwxHg01RuE5alSQ0HVMfn1pxUhuq+227sfcTjnOKR2v7GD3vi0xByK19eb1CiDsVONDnTMa9NmqKKRdfKFrWge5pt02H62WzXen81j0gpBbQKybOn8sgs2lUjLG5tzGBJ89ddQYYZea/G3GRlGECcVRvZ7RLDAwyY9Ma0pyLBc0iCD3Sqr8ZSqOLimdyaQJQlvTJ+lI8gNx1BA78LxKtCm8Ln70lpdkFDbneslVGR+Beu5iLSiyIB1HlmTrGuZzfl6NTVQTxPtCXAt4f6Qd32gefD/jssis8lIDACI7N+gqJjkTRexjdaxr0tGbBSnRmEqHqpdmVqjSAUAhRs5t6jFwf+b1UDuFLfmkU5hQunyGhq6eghph31IrReZIzWJ2BQzxXsSs6qvGgdIoLDgRdzOSMXWcxYrUOvFDd4I+d1JIDzRvOhI0BRJ9EuMfAAAA//+UXc1vG0UU/83sbpzUNm5p05CE5qNR1QqkFEQEtEVBSrlyQ+JPyb9R9VaJOxIIpByQ4AAckBAXLhW9IEpEGimpSr6q2E423h303pu3O7tx2rKSFUdO7LU9Mzvv934fcaiJ0Js+GRsd0IKbiSEBd/M1YzDxXf0RzWF2leJQAYEx0vIHDoQ8iLVrlakuRnQMdOKVa4N2Vq1FiFVzJ48HSowTU/VpJ5Qq9ROAHKRJm5ke9tHb2Mf2n08EVaRBVEPaVBtKBjgkpW0nwJuXO7h58y3Mzs/AtkeZcjno9dDbeYbdJxt4vrmFg82nTBfmbNmxyDuN26KTzu/XCrCgzr0F48sNcf2tOLlGPis6LxP5vZmfIDqZ138KcJKFpk2sGRZ6FJlFlYWh6DdtVC3fnO6CIZ1FHQtk0MJUXdZRSqSFKzJASQcsLuJ53IBpXsTC4gyu/P4Ijx8+LEEhHdTFxJK9aua8474BegGpIQAgi88q9tQwBROiAAAwwV+WdFKhG9eJopUF1tW9euvEUqEoG99SoIsdxenlsjqC7bf8rJXcX5FO0Ab90vg43piaxPzVqxwRSQX/xJVpXJyaQKPVROv8BYy1W4zeChUsQOKNaoEVsX8Rwf5VHgsKkmFF/rD75cnwWMl98gejiB4MYDpwTZdrA3STFua1tTWsrq5ifX29kjTyh7X4+cef8ODBF1hZWcH9e/cwNzvL3/02yUDIjZdAKpedysYOj9iIHgtl6h2PY7qwEmOSNlSSZmAwkowGoV+yOTzq9fB8b49pl7FeJGqEEo7moYtK0vDnkXP+vPgpJYSCIRtpwI1IagXn9XumpLq8Gytuzbnvv+z2j/Dor39wbWEazVaLLybU8aM0AS68qWsV+TEQ+bioWhef1kfedEBQZzpPfj0nCw0xFshAz9Dc9Nrys30uhoweJxIY2hhy4UCAwsQFvHdnCdML87i1/BG+/+4H/PbLr9gnd/uB49u5RKiaA8+CsgHxF8EQ1LXQmZJVUh17p70FXqYmrjOK1QfPBLf640rNZDfiCBifbOPu3U+wtPwhrt9+F+NzUzAEOKcpb9yUIq0aez2z081z2ZAwzVL9XCpMJVOdm8SMyKVLTlpnZo8GLv/EaCjWL58fLNdmb5IWRX58VKHSVz3OYgAU74XmLuX9d8m01XHnHz0q/k8C/nwOx7FjJ7xmsIdCOmBJSeJjqcr+lQtMv/wmieYu51FDCmfKJXFeZuaiIZKm/3FUpBnymafZERrnm3h/eQlzC3P46vrX+ObLb7G1uSvdII+9Zl6EbDywqmddxmzlRbGdF9f23Mf8pcF3XB6ZizDoJ5wvAJP4pHESLyVwNpHul8ZucTGfohXnct/J7wl5TjjPOoKrOFm/6LB+aNWZXf20z3NWATMGXA3Q6TRw5+NlfPr5Z3hn+Rbyzhg3NU6yOmv59IpSUQ266u/KmnuZNAwY4lTPDqMZz/nECsNykJUUWC2weB/kZY0EArCrfy5mw3RNOjzoYnt7B+t/b+DouLTTkGLYFOsQAQG0v6OYv8PYoDMzjfz1Do6TCMcZmZJS+octgEGRAkkT4SxmTbFbUcYZp1gMWNJ0LrZoUTNs51/srj/GpWYLCRXTVLg6nTmn97Hh/SoDQA6jb4j9ukrBBxdX3iDWBM9RgrE+bcIMhmwk5OA0MDJltBFGm21u3FlmFos2nNbY4+wYCWXGZ8dsRqdrIu2jk8kx3Li8iLc/uIGDp/t4trXHoEze7SFuWly7vQj3msVR3kcUN1gzWeLfos/ma6JGhvs9n1K6udEY2ZK+Xet6hMUgRWyqoZzSsetMUyrC2JjWqUdaVgF+6ykelVT/Ss68dvjrRtsBEMNmwYMSQjWu+H8tLMMCNvdSUjZKZD8VhyQeZRCaUgTopzr4s3w7Fx8GTck461DwiunpHui1HBk/KAp76835yEOsMFv2QDXJKVi/n5W1m3p9JP78qTAXo78caS8t0gO4KW2k280sAH4N8RnQTj+bKmZiqkgNn6IZS3VmOgg+a6lxtUBnj4vaWCjlCPIcKneg89HYPXX457qXJNZ+DDEQEDR2w+8yvK9eA/T6peTAMzC8fwIng9SkLPx5JWRWmKLVaqPb7fJnoQwFMWC0XO8KTiUNXG7A0+NZjv8AAAD//5xdW2tcVRhd++xzppMmtmZyMyaTVK1WKyS2FkVQX1RQH4rgX1AUBP+SoO/eyIMP+iKCVMFHKT4UrW1jK6lpSGYyPTP7yHc7Z8+ZmfSyYUgCyZzMvn/rW99aqVBPk5KWH2qTzxaIDZBZaVAH8GILQkUolIrDbgJ5Xxe7x0HnQCZmVg0siw94z19pg6HBpHpHm4jlAARBouyD26J2pgzbr5u0yfunasPAtI+eQ1o0sXP9Jna3b8n7uPHBt1NRuGYCPHrCY3VlCa3FE8iOU8HXf+h1DtD9l5Smr+L29b9wuLPLTAWfNoVSUeoYqEUddAKZUas9pYgvAzUSaGTXUqjFC+qHnvo8c68EucE6Tc2WhO/MMyOAAhSzcRSKt15ZEkX+DeXWmjRVPavqpCBZgkJvQv1mgwW1KAgkRJcQ+bQ5BTSamDn5GOZaK3jp7xv48ffL7BFdv67ZYTRyEXeT49NxR00p+qhU12pR6HOMel/rX1f7oX44Dgm4aUbLfmZGhoqEEOhBoMTs0gJnBtvra2gtLmD5iTX20H98XawhiS5FL0dgGsnpurTKQ5bU7TpDwrKmyT1CtFpHTfygYdTT+z6r9y24oLVMAf8uBcuJ4xplEsWrN9tsae/4+suv8NEHH4qjB2fN1MLSmEa0TyDH1rffoNPpYGtrC1PHMmyc29RnC80+pmWX2g5W78dq1Z4DIa+QyVOnTqM938L8/CwW10/j6TPPyKUqU8X7qG/29vawTfWztFmm6Yj1EFMMExlv38hKqmZwSpFtZCwwSF8pO5y4KS6D5fpsA6wM+bdLXgD2uwUu/3EFV86s4flnn+RLZZ9cTTLH2SDKBhAoxPX/TijftO74CuaEMF8yg3ltNrhMgSmqWYpjzWn29HWktpv4aHrcf0A4pKihkXTIO/CZw2p7Ea3Wa3hu4yx+feN1/PDd9/jt0i/YuXEb3RxchJKxa7jQj33JiHFDk9XKTIbzTdqs1OQB/uN6FjHRvSB2wC8BGXJ4IXEguhA5YG5pDi+8fB5vXnwbm69cwCPL82AUKRU2W8IexflYuu1R7ajfGdFGQUDTV3Q+piiTrsHA1N1lv2AGThHGi+AcITx2ZN/VwFH2/yDwWctZmOm0n6O/HzDoBGSHhJ/uTAAAIABJREFUAySdAWjAi1xEiCgpIIKwFcuCaqtppbN7TRyD1/comD2SOMPGukD2erhPNrmxynPeY+bN6qk2Pvn0Y1w4dx6ff/YFLv30M5MviIXRIACQwE11g6j4CjVIUQUmTbN4jIV32Vi3gnNilEkTdwjvp3iPpGCMRX1LoEz8dMR2UejupHlRaPV+0IydG3MUTGq29uISGdbN6Mup2eBSlAQbL27i3fffw6vvvIXphVng5IziTEILl0tKZNUbNTdSl19bzTHoNAEEKJ2ivKsy/A/ZLDNpc4tyRd3eAFev/YM/r22X9r8DvQtY2XCqqDAxWInsUiwuIG23cSdxHPyTiASdL1xPHJ/lFHy5Ua0Po6FbuZnQvAeRXoHjEqCZ7Dh64RD9m7eA9TvIGgvoMsgQIsTb+naSlV+8uw4DiBQAGSMnhAfZacc32rc4kZdIKR9na0vXnupPChftojonWGtnmmyc+/AzCbLZWaycXcYK4YeUgMgcDn2OLjneUNa1d1cTZpJNpbNdMrpVTTRlp40mzer15nKViAbC3VoMEVQLzSkbuejLPCkt0mP9AOtTOpdJg8KPgpNJzZrRPO5tnAZ1e+5g86JSk3cK/jummiclW4eHX8ffjQGZnBNGpgT+GccoxAS4V5Ocoqm0jM4ne6aUjCdD844F3zWQ5u/zqoY9MEAh7FACgGIGhAW+FOhKf8v7phr70Rxq+IYAB3mumW1hkzBDTVX7m1NN0QSJaueJLVYBO37oeXFSigQD6+snLg8Q8b3KtY7/L63/p7/l8hKKh6J41TQWdHTL5G38/gY8DJdGKIhQurJVQI/ZDJJNK7NaFAQYZ8tN65GtE4ktT2WsBFyYjl4R8D9r1/caRxWFv3tnZneT7CabpAmtNsRY9dG0VEWkiBRqK9bHgP038l8UX3zIPyGILyII2ghWH/tQhYoVTShqsdAfNjvd7OzOXDnnnnvnzuwmNdYLIbRJuzP39/nOd74vdgPpJ2BNldCMXL2b25hstokEumgBcYYbTvnR1VYVfmCbMiHcYDQFkeGaDrGNoMGlwXMvFrYQECAEyNajWJoI/Zu69ynTM/q204i2mEQtZGkff+3cgUoHiMILSIiWOvuqAphrAcc6M+jOttCa0hgO9mCQYthP8fj+n8wAyHspimzEFJRm3OSMLSllTjXjZ7qkZFm5QI2IdU3a1B2yqCWQJ3SHF60E84ZtRSK76UpqK+a/j4X654IImaxuYxPAgseIgjlyDSBaFInTkBBau82HHQUXxHogL3nKMiZTbczPL6M9u4Q30yGWPvkMd/74fTzQr33372NK0TDzLy8xWhBWbUpRPg+A2Leq2Mqgtsh0cKF0fQKhwUECfgItKUM7O99Fp9PhbP7CsWU8t3ISC0uLWF1bw2x3DovHlzE9PwcTJ2h0ptm+kGhLHPhECVN+fSCrbI2+FtDGCQg+k2KXp+4eNPsmgQBPb86+hg7ba9vb2NrawpM0xYdXrmBjY4P1CcLmapR2d3exubmJvXQPDZ1w9o9uRjFn+GzWhgL3/azPVp7b29fw7ffXceH8ebz4wir/nqq4KgRvososkhZ18ETFWH91HVc/+hhn1k+j0YwEMi+sulYiB0kR1L8qa/fz8MFDjwaHF3blu1TZ1DDRBJWuxFyagR3NlxP6DKMa7F9PonvM3Kl3uYrZT5eoiPcepLh1ewenXjmFuRZl1Arksa2PSUS5nKmCAgAQ/blQDpSzZUxUdkRzTpOVktDgmu0OgzOFW/v/S7OZH+38/TBEuzuF1fYKTpw8gbOvncEPN27iu2+u48cbN/HLz795R4ZI+jryAk8q2HurpQjVGauPGP5XWwifKSFjWpaHjWgpGCEb1mYMnH3rdVz84D2ce/cddI4vAtPELssZvMgHQ3sxCQ7Yo6wkB87Wm/OhLzlLwf5FdZt0MeCvwpbTkc2kFYAQIQi7CWqvDG487b8MlnVNF/wIzcqLiz6EtsXPvX1EvRwmtVYr5vE+Rk/6QfBgxDdfdCQoX01rQSu5fOmKp7oXdTAOY5IiCqG6lnXI/zHwq+jljDeigGsRJCbQjtgAb184h7WXV/HVF1/j80+/xM7tXfSzAYMaM2z3KJojE5wVPDBgXMnAIY8mFGFHr0/47O5z2cFQ6pMjxAGPqwjOudzvVTmCcpNDusKfdfXnDfMLo4LLlMgtlqxlL1+6iEuX38dLb5yGoWxhM8aQdEWynB1UXL1/3YHiKM0zTyacgWGAA6nX9oER30UhNOKcrccq76tsFnAk+kfESPHi0caWT0a6gbSX4dZPv+Le/YGUJbnUvC6fhxMlJOKq0FMJkudXMFzoYkTMIMp+0jzKbOIF/h4tSZlDmTW1MVJl4EcK/SScSV3896NHSO/eRaO7yAKAowN2oHCNEDgVhQLOPFNCalsg+A1XGlUHbA6fw5MaA/5xTXmf7o8kTCsZ4kxqmJW7xwm9mdiyuclgWk0MG4ZV61VM4tmW2j3SkUfXSD/LZVvrM4/mg2MChwGqC+ALYTXXG5fSuufipFlpPz5p/6GkSCTlA/Ux4Lv5AaCBmw/R2J2sGvgz6xrWJpBFUMdznmOfa4I+4eTp0LonMTOCqOpxZNX8G5Y+T3+2WXv9dFHEyucVlXntErlRw44LZ+WN9gCQ9bjPOR6k2MQllWlcaaxicQygn81Mz/DzcpAv9e2x0OVLK8eCmVkUN7rzxzEHHOijal79jSQpafhey86OAQuJerp+wLSUjLxlqvflOR34VPYDB/MiNkyNGdDB/0PPTf3uQUg5t6sMkOoYsnViAFja33dxtn0n+92uLauBIYwaSrLTnZGANdpHSBQw0AnQOsI/AAAA//+MXVtvFGUYfua4px4obFlLKIUoqIFAoglEJKFWvTGNJoRr4z/hN+iN1/IXNFEuPMWAiTHciGgiGrUIAUrYQhe6O4fPvKdvZpc1OEnTdssOszPffPO+z/cc4vrgLorSmxvYa4S0sNOgNu8+n1AvhiD2hdfwQ2lAmZoLEtUqVnQEGgtkB+FpFTpR22Y3pgx4mZQ8eKCI04hNuJ6eBOv5jLRaEpOYa5jh4a1NFI9Em+o1Y4qfSxhaBMLeKbWz246wq5MyOl8+GWD7/h0UKfC438fowQNkD7cQjAq0kwbyyCYGJ5moRVUISY02xLB0nONa6MWiIpRu/HiKcUMdAJCTEHjHSP6un58RKdL0K22/CAO/qh+nCYMR1LQkzlb8KZ9ftM0ciaWGY0EoPtdO0e601YIjhgZ5QhClmVZ6W7Nozc2g2W4jaqZoznbQmZvlh0bcajA1mlgQYpvexEuvHMf58+fw8YcfeYf+ukO7nh4dA9XvSb2gUkCgWhwQepRVMaUTb4qUPBcs/9hV5ns82QSSn2kmIoS+JpHFkjgtNkuh35NDahyit6+Hhb2L2H9wBQt7e+gt7cfCYpcb/m63yw1vs91Bo93214fHPY07NV5zfvJN+WdWL8WptvpW9DstlgP8NyxSf0CFY69VDyM3/s56uoB/G00OI9YKFcWQqfW+PZpWFdY3orHnGbYHA1y8+AkuXfqCx/jVq1exe2EB6++9yxPbuL4xwIULF/DP7VtsiLlTZj72kjWbXhdOrAAJyCZuAO3zzbU1PrL19XV8/ulnaMUJDh5Ywf5DK5iZn2Njm8vfX+aYzZz11AGDBTvZEIv79uHgsaOIds+Mn8Ja/8VzDUyOE+Denbvszm7H7dkfkFWARpIgzyWPleL0QKv89MAkei6Nr9FQ9K5xjiIhlJX0yrMYPhmxTjiszTcFbEkwQEYxLq7A9d828OKfN3Fiz1FEjUjBkUK0eJSlm8ZsvEZfXP6H8m9oHk3IKKwp9yvdgwwA0Dij8R5KSLhFgv6flWrUi5UqO0t4NJ45kclrTijhFIeUNGMcOXwIRw4/j9W1s7hx4w9cvnIFP175Ab/+9DP6m31hLDIAJI1eGoS+gQpVJoAJ145ph/ysMjpWgLpAterg1N+D5t1hmXka+tx8B8dePYFTb5zG2jtvY+/yEuJOQ9JtAqENO83/5bvO3Hv1wASEmk4htZ/pAW6LdeTxQYZI97eGBkGMsVrAOdQhF7sPNm5j85ff0T15HHiyg8f9bZ6nKPaRi7RsaFSGWvRQgIIYaaU1HLZ3a2TqjuyRUApsjrEQfM6nF80nFWBpo4OQTXQzoF+guLONYCtDPhhh9HjIzsexp8VP0l2FedGIEjSbJZLRACE5ZCslvpJ6Va7YgXrB7JoHWq0qNphZh0nqnVp8Q/gMKCbwDjLjm+xWDoDvN1dDGjsxll8+gA+W38fZ1bfwzZff4duvvsb1a9fQ3xpIygjFgnJuc8w52vyMCwJM+ixENRfop49tgqlGl4fqpgDedZrFx5j2WbXRDNyYl5Cr7Xvq+Qgr93kqDnON0rN7ghRNvef24OTaGby+eganTr+GPUs9BiNJk8pyTq1riTkRekp4jS1kGy0kTIAvkzWbK4uxBsuYiBUoEI498+pNVKQNy+SZddrss0EX1WRZlbpDYA9rkiHHl2cRNv66h79v3kWmSwb+PJduDE8fhSEekuy0u4hdh1/AJj1PiUGi15kN0FSlZUkgTP+fwtLxEaB8TYShxXOFsmup1iWW7Eyjxbr6KN/Bo40NzC+vII2pEZaLEKg3kxmE1f4H/1107AXM58ixhESBwqI6Dgaa1UTaPEn8uVb9MtXxeZCzNxVJESR9RQzBqYYfZANvclbmNTNk0+CnsopLALjFq9I5jgt5BrBnlI6twEwRQxGr5+xpFbOsgGp7jjBUPxxoQ0NsOGbhU3NISWITRm5m8sfadVod1dFTr8ONDq/vqMmuKjTEaNtUrxtNWxY0K2q2RLPVxmVNXmCbj6xjEEufNcyY1maYGla/5j9O+JJ7OPHvNzZNff9xI2ZA0fq6OI18XycO/qH/zJwPH4rmvgIxQt8M26q0/V7PzOd+TP1irJHl/eTOjx/WopfSx1HzTz0krWJTH9OMmt7RH9rIQ00YQ23aae6RbP9CDL4ZSNphtoDtl5Xlufwdzqk0MvCLy1S7mvyD+gI6dkspoNfNv2oS8KHemJ4T1Pxzjn8USwY/RU5y3n8111Hjb01+ZUwpjBjarI+1eL/J8WHXU8BABRd43taFc50zjenC0gMCd0qHdrvt98tShVYisgxmXBBwKF4FbHIYhfgXAAD//7RdbWtcRRR+7tyXfclu0k2sianUtKtFUIvaYLClIgriLxAE/1N+QNG/ke8txi/WgthIrWCRBLtRS2Ka3ezeO3flnDlndu5mU1rEgXwJ2ezdmdk79zzneUmmEQft4KnWgXLXy9IGb+QQpGpWt/E0fV4oa70OIUuMj4+IJMrC3+wFVeELC/QPivAUYg4Yalw8VfCMbmYu9BBetJMRTJkiHwxhT3Km5mmGaHgsaRgabb15eviopUzDLAYDHPR6aLdjzjPN+33gpA9jrcssHYtjqDg709eCkCx3SBlu3JB+dmSdttNp1KwzrqPChTvzVbRp2gcBRrv5U1qvOJaOSixu5e7v2C+cTGFIK5PV0CeNplD2+X/ROhCwwh39FM25DpKsiXqzwUXO3Ll5zpFvzM1xZ78+38E4dRRnLnIlOozXLYjgG2ungqjUnQ6++OpLbN++wwZwqRQ/ZJCYF1XAo/LANLWWAf5+ZgHjUd7KemJywCFCX01RaP6pAKinWFpa5E5+t9vFyuoqLl15HS9fWGWNPgEcbSr0Wy2eG5ZFyOFcSaKQdbPBdZaTfIDKVVUv33gydBnYX50ez99nnHW4QHLzmf5FwEdB5i0U2zOCtRlr4p9nxEmKRqPhHsA5bifiKJjNzU28t34Na2trFY0T0fm3trZkPhx6H0kMTCxoM10XxXxRF4azXE2ENy53PXp665uvMTg8wkKjgfn5BY6xyek+kmXY293F1bfe5opBXXPp4eHu9/ew88tDrC99wGZjCYIpVMDJF/huAejg0gPA7x/+vglUo2g8FV5S/FOAN7ueswygcHMaDbmDn9NeqTcQDQuUR/9MPRQTCBf59SdA6NH+ER78toeLV17DuVqTD2w6ZPjgZ0mCcfJrpX2T4y8yliNQsc/sBgJ00kwkAzHTh4ui2jl7cfbHpHeuo5QD1f1aDa5sUFQaLC63sL78Lt682sWnn3+Mn368z4yAe3d/wN7vuzj4c8Amq09tyaBgTWbDl6UzrnOaJn9WcaMaYQY9TMS6YDIPGyv4Ykr2rllZXcb1G9fx/sY6rt3cQOfCecTtBnO3c4q1kqx3hPplTQEJrsVM6ZnPGqqR5NitRt3PrpVPE5bpvJ+LAsPHT3D48yO8tPIq0W/QPC5QjkopaYW3pdTZgKnC57CVdxgXk6J/ZuZ1LBM6u3ObkOPUYAwMDPDkGMPH9HOA6KnlAjrjczMROM+cuvewhwpFOppYtNrh3pfh51eBfkc/b7Ub/ixULe//OzReIneaenqmaafovnMJr1xexYefbODb29vYvvMdHuw8RO+PHhdmCmxT934kppTx1DyoZ83MPesBXD1Lqo7u2u/n0i06LYkxIgk6S1o3PTTViR5oh5STjcQB6SbG/OICNj7awI3PbrL/Rft8hwH+MoVjNRlJUND3pkIqEhCJTcqsN5x7kfEsZodSx32CUWwk0chKTGLp97YHELhokS6otZ4Nw0WQFLx0/gz7I/T29rFz/1fs/30s3vjGn+FG9FrMWIkSDOMEh0mK2tpFHDdayJst5JGLYEu8meJ/G/oZqLioZzUGmqh1QOfZgGKm/+pxYyZrtjAqx5gl9ymlIeWSGZyHkRGjE2570LNRaU+t07NYCtxs4tSAhCMzxwJsjG3uqejEtNBmgEu/cU1FZpPO+p9qgDiesIC8XFZu9J4SL1JVK3nrFOPLQGVy+rwI5QYcFxvWKgq6JRrBXX3teEoGQakIs/ZnGQBKKhtA0A1W2Yre6ZRyXXkvBlScT5dKsK3UR67miqqS7OlrKK2vzULwJ7xefbaheozl0SakwBvpbLuI9UgAzPD1uXTmsyyRCLwqBSFJJwlvrLknmYEU9dy5J4l4SY0x65PebAD6pdxgsZNO9tSChPp+bTJ71gdT711dabmGzF2Tq3SMdDWNR3Df4654rMlnrgjnRrXq9jl+fgJ6uMb4hEHnfAmUZef2tq4F7weVp8uYSAcmKWwOEAhkObJ2mqan0X96L+N5FmPD/jGZcOrrXE3ianZ3z9Oofjef1Ds4cXW7GAHyPCQO5CnyAv8CAAD//5RdbU8cVRR+5n1f2IWuWChdKgSWlrZC0sRvftAaY0z8Gcb4xabxn5g08YNJ/TMmTUs10YqglGiltKJWpJR9nxlzzj33zt3ZpVtvsoEQZnZe7sy55znPeR4/P7nzLwGN8NhejJr2bw7EGwz+qXhXQ+hAtPDXKJnu488Ag8Qk93QR2TJCJhmddGJYBimcOFvUakswfWNPG5T0N5tddE+aTO839Az6WNUcV4JxNQJq5SIKvoNeq4mjP/9GtRwhrAaMdqYnCn0MSP1WbLbUQakfSadn0EVSjKX+sl4KVF0PpYkJFIuh+CcrAZuwkDeqy4ayopF+pByX2BFhxF7ssyBMIs7KKSUolGCR0IMXAa+dgRsWEVBvTBigUpuCX4hQqkzAK5QxWZuBH5QQkcUcAy8SVKSiLTdJJf0WzV4nMMZ6RydX9LIPU9SvruKTz2/g5sef8jVhQlrcO7UlwMwl+/ztxNoZTodTS0Vc70eT3AJPvffP1qYx/foM3lhu4NzCPOqLC+yjP1M/zwl+bW4Wbuirxaagyzw/WVnXl85G9UCxPQ9rWVhJkRxhbCowGRQwalYOeg3AMAJcjLYGGT8yxolKbqXaJcEnEISZbKM27t8B/BNW35892xje82imMv+drs+ba2vsB0vPMD179zbuscjfjc9umJtD74m9vT0cklaAIOaUkE1NTeL27a+xvr7Gz+zxi2M8OzzEb78/5m3mZmdx/d3r5iunp2uIp87A85VyLe0nKBb5+M7PzGFpcQk7OztqHqYJ230ePH2KW1/cwpeXv+LqIQo5pQM785DL3Gq2uKUhD7DBQoFV3qKSf0rMGQToKJV1N23yhzywqcoSh2UE5RrcrofuCb0LWqYCzZ7z8JRVUqpqpoQJ/7jzC66sL6NcqSPQojyOK9R/6f3TSRD1oUYBAj9izQBuz/EUi4oBQEK/aSL0XQnsqbIyTJMhn+yxI3UzDzh7MqS5p9QSwlOEkwTVSQcXV+tYvtrAOx++h/29J/jp+01sP9jC7tZD7O0+wtGzI7SbrQFhuD4Scy8cY8E2OEb6RMuijIJ+u9/jVg+iv4YOUKlMYOFSA8url7B6bR2NKytYubwKd4ramWL0uy2V/Pfa0jGRW6g5w9oCegyyAYaH7nP0vBClchkV8h02VysxFWBXV4QlqWw/OcBfdzex1I9UgtM6xATdRwZ6tQZFIk3KhibFWhVI4uFKqxSvXjoDcnGUF9/NBDhoor3/D47/+Bduh6xVPf54nNaGovIwjC/Q/I2orzIAO26MF/DL+qdrtUmUy8WRx6V2rtsexuxyzDBAjwl1OpNOmKmQRh4KhRAr1SXMN+p4/6MP8MN3W7jzzV18u3Efj37dRa/d4xYgYuyweJzcYWYbJadd85dAGnpNIv2+rsBEXNV0cqi5trV9xZHqBSgTHSKUgiKL1V57m8Cwt7CyfhEXli8ARUpsOsrOrN/l+d2FWDYj82JnFomjWgDipGsSjP8zTot5asGaDFX+YV2C1AK3ErkWtE0sjSaptRhnTSv53RW72e3th3iw+TOaPQU+xqkrzEDlguAJS4mEitukj3CuhmhxHs8LJcR+gVX1WYDWVQyYfH/v+LY+YahIzzVtT0klxdtSuYiIrWkd1qHov2jh+eN91hRyS1UWXHU87RKlChy8j1i6t7UjjKfE7lxRYoHYM2pQYNxwpMIf+IMtujr5YEjSBmAcafN5BTq5Z90TXmOSvSAS466kY4Ceb6mrqtaOiTujn6685Rusd7G2xHZlXe2MiP2nDdNCYvXcaBAgtSrwev+ZE4367vxct4t/Gjxgl4RYAwODIMDg9uOPm/6fcjBmc1FyOeBT7wwyHEZsq6vVml6OXMs4JO56gEWJV/RdurYqcfWzmC5xqUstVf3YsNc0yJDXoWBsiLSRtIU8AVGJWJtT9BTtOT3oXDVwTFVu38uOiRkpyCjy1P6lC92UdNsCilofg0RR7eIa5XW6+k7nwoxDASU1w8UR1wM6b4rxij2gvldX5uk07blCQ7MUbBYHP6EkhBh3kXY0KJC1NtiUEH2vVQGfCkkeuh3VLq/PQYtk8rPrufgPAAD//6RdW08kRRT+ump6Zhguww4YcZgFJOLiqoluSARj9smYJf4Annwx/pSNz2qMD5L45k/Q+B9cXaMxsIvr4hqEFZbLEhjm0t3mnFOnu6Zn0GzsFy4D3V3d1dV1vvouBf8hyVYSjHMRlCgXPcnUmIgaH0unIEqixgtEmh4Qilu8cR2AECLVmHQ73axxsbAFdKMORMdQcIC/D/Ma/ziNW9BIHr/LECKkCE3RlmAji/iiwx1/8OMSpy9Y2lu5FGB4KGR6UefiHIePjzA8VELlooKhkuUJGvVKKgJiZDc1cNQfajvlUCpb4uTkhDVlleoYyiMV7hREuyLXcTIm68aakW94tS+dJAWxM6IRGpxG8GkuJBcFhlb6K6Lrt1IMlCpDqFRHUSyXURmvYWRiivX5BD6QDIErY+poXCEXmLLP8S/IPAegg7HnzBx4VPXAGwB14hqoA3QgsoTEtvDu+6v44KMP8fX6V+i2WzJZSa/64NW8QUN64g4dDXidkgvx6GgZE7UJnuhPNxpoNBpYXHwZjcYMpqemMV6rYXjyORE2GnY64mKf88gJdWXzLZnO8rVhazpB0EmzzbE6LBOw7vw8rU6uAb3lff9m/u+MNV8SBY6qpyfCdEzls7gCtgt89ukX+HL9c0TmKW7dWsXHtz/BJPUNHcz96IWei5/pMlZWVlC7UsPu3q6gp1GE9fV1rK2toV6vpwPr8fGxt2Ij+yd2yeL1V9gzIdNgRXjnpqO6sbxFFi05LgheLiHTnk1mW21DrL63ivsbW9zegtP30wvku2+/wb2NX7H85g1ZAO23FenZiEGSl+H4EzdGdp25HjFmKOaUZ5lWXigBo3SRUBEhTAaSzcQXCZrFpyhQukkkTvr0fHEsj2dpSFfn/qMj/HxvC425OgpkoEfocKHFk6iSx9JgiTe9NFkrQzpcuTaJjdylsfyQWPYCEQQsiq2MKLY33zjrTp6uXYtZ7WepLNfvyzmat04mE/efNP42m850CExBM+E4XqhPYWnpBs7JcfvPXWw/2Mbeo7+wubGJw/0D7FAU48EB9vf30exEfFpGDdVyEXaDFO167pWREqrDVzDbuIqZ2at4/dVrLN+Zv7bAVGZbq7JnQ5viDdFEl6IfCwFLZEjTnDiGkl/Q+8eOBxiH/tvGfR3i5xCWQ5SHSindPdJrlq47CkgU8k9dnGzv4MxOID49Q4QmqvVJmHoNCLsCzjrgJdDq2zjueBD34zb5Lc57gmgFbGGpgKCqvR2j+/s+mnsn6BydImwbprwz8T0ouYyUQqpl7DsE5UB3LnAaAI/Rwm7njAEvHccVNA486Zd+Jb8VZfJJ/3PvqCDb97Pch0s3zyMgY0O6jOdELOHYxK1gURyxmBlrYG7hRSzffAtbm7/h7k938eOdO3i49RB/7+xKrDHnoMtNNv0Btd7V6d2SQCdhpie73VtqEVf3XP9M/VAuAcZ0o/0TcYmey3rjeczPv4S3l5Zx/Y3XML0wh/F6DcWxEiIiirYoGprSjeJ05dh3lTDpCBZln3tMIDVHTF9L+XO75N71xQT6n7EpsgDdvJIXkOu3RNEpSEDSU5GpigQgBXhoPkY/O1+r89Mm/niwgx++/wUHh+QoToArGULmuXrCcmxb4CwEHmvoAAAgAElEQVQ0GJqbRadaRadQZGNLde5P5YrPMjYEOs/yfpeIf0bJGlSKIUIrkibCwSOaQx09QXL4BKhUeQEnSTTJxGTYvzpQQgr/IJB5qk2dUNAn1+hvddxzjqzpp7ltFLE3Ci+gJV3O+WeiXCxLMWJoFnlSLkWz+kejIAUk47Sfi8FpwTGCJAue2mad0SWZVLbaYjxJTIDEmTLrQuJ/4RnG5b1qIRW7yOzs8yBXqA9gWDiAVb46k2BjUi8K0Yhnkgxd/dd9GscktS660Jdgc2oXUePJ58z2m9L1tMVkxbsvlfI3KghV7hPnFkyFzSnHVz18IQeGqDebsAx6TcrhnO55VdwxuOnv9fqoF5xNJJJO5NFxj5s9gXVUNGuKwIBWpvuHByAoG5yY1SRDlJQPkWtyUhW9b11BraCNygKszSQN1G/p73xQIwVvvGLcl0KQ7EOZ6Xod81R+bjcBAE67ryyLvMyejuuzN+gzH0xTKYVIGRxjgUE96Rstt+Cs/6sMBb2nBJSQB5d4IAgTgMcCkkO2WviHr2vpraqMous759xnbUvpM71UCy01amgMMQ50xtQYfwRhonMHJv4Wkxp8RBMHzBwwUYYwIpUikpTwCJa2XGh7X+dh1t77+86hFpoAvTT39NzvfI+91157raRWa4qSvR9cUhRVSdMedBGZKm9UHsj2IUVZPtIPn1YmYFRBKXyvh6f7h6qaUWtI/yW12KMoHLTUehhEBKM3kglSi4zOIahRZC4YGlxVDz53TPCDyA4/tOgYWD4gFV1X1rGdFwBkEtFwYibO3jjut7vPDtBqHWA+roOl/LFGIkEvK//cEMmAkwWeedV+HRcPDHBSH5HSyYnfbqBBxXxuFL0B+nRIQCpCVK32lKQDo7xMkUXcj/1bHD9aXliPb9RsCWU/bk+gPj6HuDEmPfr0+56emREQAG+1raSUlMHdsT1NE+u4PHLZYxqWXXUJnlAdrVjsReEvF8ABaUOYSPD1t9/I1k4QoBjJYJkwis4psbHKS7s0fyl/qxQxZwtfaywRWv703CxmZmekR58++mfOrGBqeh6LnUVJTtlnKwigb6XwrgeV4Ar+4IYXoHl1/sDDMO7/o+ETeBfOWLPgOjHcfm0oE75TqqEX6Kn2WUXl+6tIiQ/2nU/+czkwr1//Hb/8/CPeWe7g4kcf49Klz5A06nBFgr2dXVzduIonT3aR50P89MM1XLjwCa5cvoykNR42TIeTzruy741+/WvvrkmyxmSbINnW1hY2NjZE8I/oIuf83NxceahZFaL78gX+uPEnzq2uKbLtXACYKCgZxsMnew7i89qSnxWeR6sBQgx8deVLXPv1N2w/uqcoUC2WNdk72sfG999hfX1dVP1rRYkjWPNreH4SahUIG3JWGWgGF+xTpJ/vYKTosLTiJHoYZk6TsCLn+mpJ4EOP7rQxCdeso9FZwtPdLrK9LqYlZSqCeJ/8HlKizff5KC1w4+Ymzq2cxwfvnUU7IoVuKKBCxuq+uEfofTG5pxWpAINMtnkYEcVuDESF2hlrQOzU+H2d1oc1CSq9T26Yhc5CNVdZ44Uz5pG+rJ0UvKNCG3cIe5W8zFIk9abSopn+DAdCFXfDQ5nP46ebGJ86i/PrK3ovvQIvXx5ib38fhwcHuHP3rgBMBJHS3gBHe105n3gmeX9dRddjGYtTU6dkzc/OzmJychJLS0uiTTG/sID2RBPBkzCyhiIBdEZIWsaQ8bYMYvWWvjZrrqZhVRDgTbRfaWdL2npdoVifwuLiPPKbm7LaBShP8yCA6hXf+Ux6SPHg4WP02+fQ6g6QDvo46D7DOFuS5tiuMCozZ18hygsNnHl+RkZNFpo/g4kMoeE2t/fxvurKGBPx06FW/R0Fb3aP0N/+F/1HOyheDORcE+FSOU+a+odiaEazJIAiPaTSKqWfPUsKPB/0sZOk2CqeY7PYwb7WTMNnTezWzZTLVHkgIG5g9nG8a21tf3ABngJOYIUd/8rdmyvSatul9HrPIvFXjX2aKy0chYiRRa4nbJ+5M23MdS7i4qcf4vOnX2D7/gP8vXkXt2/dxj9/3cfj7Uc46HZF4V9P2Fg0Q4bFMDi8OGsFDF+VsyivSCVWVIWQSG+xthkKaMp4yRIYabv0FbQiD5o7rGvNzE9jpjOP5bW3sfr+Kt5ZWcbZ1RV0OgtyTqCZCIVWvN2l4pabenYWngxfhyTGg1f5UNpsJKhkv6v4ZMYS1xSVCm1k81Mq0D70srGX8chdOfu9I1ChHuWqw6GgVcaqndhfAn1Sje26hWkZwB0DRyyxoVsMC5TDXgY3irH7cB+3btzGvTuP5RmMUjqWZAbC5BXVDIehy/CiViBemEa9s4xuY0y0nwT4NKahs1YbxpWqO1K2x1Z1DKqxamiltFiZsQrPrKzfx0SzholGDW2e4RarjlHV/aiHbGcX8el51OvUyIhlsx7F2sNdmAbBoE/Nn0x828kkiM2JIDKAi9ekkLdQxE9aGIU6DXgnBGftb1mkey+1BwRaJkgWFyHpyM2bvNVuyzOheKYk8TB19zQz6nKEUTFCI1G/d9Fpgrdbzo1VkNnzdBj5xI8FQGHFJgqIRy6IP3qwAOEU16LaKyKXHpKw/3auEh/4SnGWG3CirYCpWM1pUj60ua78Lb3fUoJFk0R6wudSnCrMQ15toguOkYC0seQuqWkU+PnOYmc+0rnebLbVMS2G2bk1JPkjiCzrlLlSrOo5pSime+VfflGULzrq4XB0JKJ/LD4EgTwRHPbvVT2I2NT5c7ORyy3OFRp7ngcNMj9WsjPY2uXzYmLKM02TXWMEW8wjrBwmxtQaazY0R2K8kMShPx4ok265PtsqM80F+Zqi0WEh8XyNmkGDrd8fBK0Atcz1haGaFqQlLy0BXtEHMb0OMta513iff+5pdLiTX8VcxViYzCVpncg5IQVyY9h6XogYlYi9vxYY/R7hlcH0efriUioMOa/fwZYWf4ZynBgfJKIBkkn+ys8heTLnjuToBDM4H7SozmfE9ltlbehzpv6H359LQdUI/UEfAPAfAAAA//+0XctuG1UY/mbG40sSt44bN25KW2gbUFmwQMAOsUBdpOIF8iCISoDgQYLUrHgA2CCksGbBooCKSILShIg0UdukbVI7tucc9N9mjp1bWTBRG6UZ1TNnzsyc//u/y5AEgAa52+nKhzjR5dOEoImXucJIwZAa1nwkSa4zEBMGQWGJLlSkB9jNJYWGORrSQZGDPhtIZDFqCjAYGABdiMOQOQUF6AbItRgjTy/LgqStyoYNmZ6LvgiC/U1/V6CQEEoVTdgBFe8Z68T2dl+gXh9DmtTQjwaCmpXkoT9k8uHckQqKxoiOh+LG6PjNfE9iY1J+QFKGfidOMYgryKjjTPnnjL4nKI3XmZ5frZ9DpTqG+uQUyuMTmJg8j8pEE6idAwicoGvD+s/iJRiNOJYft50VrHRc8V/87rh/KZBjLvKnW/j066/w2tVr+PbeIjYerjPNvkvoVN8xsl2ulDBWG2Pndlr4USHfbrfRbDY4T/9C6wLr80m+0Jq5hEqtyiwHAj4Gfc+sCMu4LPT1J51X8YKIjj2Hs88SpxDnws4NzigQgOO7NgYyjEoCRCrnh8aZJuLu4218+fkXbKLHkfUR8N33P+LDjz5GUo6wvLKC9Y0NeFosRBUcdjMsLCzgkztzmL0+e6qERj5DQAAqtMhpf2lpKXfLpQf84uIi5ufnmQVADBwqwmhfYr+I4aBo0T67excEON65M8c0xlDVkg0MxfQ89yN2oi7nLxmJZ1RgxgEXr1/B7du38c29VUatnXY0aP+ln37A2uZD3Hrr5mksweL0QkatDUWmdOQkUmOckiLWPl8YRV6eEfTgls6xZD8fphF6tSqy1iQOd7fQZ+aLsKnsZQ99sfadmOut/7OPn3/5De1LF4F4DCk50PtYO/defVcS9DodKUzoZz4W2Yce8lkiJkhxSSKp6M3j+qp381KGsG9IUFjlHVVejMfSeWc9qx/p/J+0nd5y4Ri5/CfHpjnFYJfgyynGp+r8h8b37Q/ewaF2LYhOHFNur4JeNPa93M9Dji0lgCjRVTivxBWw4lWl42LfITBW5Xo4rBD+u2b51TeLgJURIBPLRqPBIPRLGl5elAQFUiBreokMW4934K/2UCHbjoMIL7svUJnc4zRRtNIcfFEH1KGjyk/RHnQBZdoM77x2CfJUkp4HnvWA5wP0Np+gu/UMOBiw3paKu5i6/iVKiacknxrPJUfzjTAEF0sfuAR0sh72XQfPXQ+b2S42XAf3sydYxwH29U61Z+8QrqlSC2IaN5tNVMrmh6OFeE5r+L+uV3EljnasBR4cuOH5W5s4j0vlFqbbLbz3/rt4NvcCG39tYvXPFayvrmHl9wfYefQI29vb6HQOGPgRRlms+I2VmUb59LmnQoklQqZM1y8yS/OSZEH+CuhnChYIoGMAJXnczMy0cWv2Jq5cvYzZW2+idXkK09famGgRCyYS9MX3dfT7nHHvQ6fdwHcg8t6cHoJBcfDdDjb/XsMbr9/gJoVjGYQ1WIr1R2YmojauI+Z/3h/VWuegohr9yZpfZJvcac7Ef8mKfwM/mI7tJDkDHKc4EMyLu5ARdjZ38Mf9ZTz4dVnP1WhiPv+76JNncGNV7KUJGtdvYL/RQId0y8lAEji0Q8/HYO2FKDSpfHUnn0gz4KtpGfVyiolqSQAGyMufiHDUHDvce4p49yliMmWuSNqLzKVY9P3BJSrTGjI2H42BAGxS7TEr02LG5COiIWYR1LOWAc9KiiyJ82LOmhBmQMaZ7GQqV5JW2kCZGKbHTzh7v+husoeDE3ka+bKQNxYb9Gnf0dJi6H3KrJATlihhIsQo5Z8Bb43HdK5IFLFrY3KAcN4JXVoZCerdZcfLv1etuwvmbOg4b/8fHY9Fg4efGSYP5EZ1iIZc8cUMz+f3YllrMBnDft6tdwb4WuP1SOSQrjNMM6+gAbSe4nqv3+U1W6zvT1qnmXFepAbtNlZ+hDUWsg+knhOQJ1XTPjciebBOOmDS7yiffzSusZ4DSzS8MHBdwBoOqfemfw+vaRLIj1ywrznhS6x9rPNBjy14/oifQpnBKJEEiHmmSbqN2RCyA+x7PqeCJAG+TgQcB0awnICg+ntqbIf3nxgGF6Z/tOWR+jrnrHNPc0W8vWTMZW7Q+CYSSah+HLSvzF2RV8iYSDR8FEX4FwAA//+8XU1vG1UUPfNmPLYn8UfapkkMNGlBFBaIrthRdQGKVLFBYgMLFiCkigVSfhIU8Q+6DEEIgZAoVCCkIKR2QdQkJiT+TBzbbwbd++4dzzhJG4mKt4liJWPP87z37j333HOCsYhqcK8+faBYqyyGkQ4NWJkebuNUiRFCnw1MkConTn/hkL4GmrwojE6o/+sC1iqCqheqYAH3VJgwpcwozYWoHkNRKp528rCCMOpDa0TwLgny/CyTaXnQENDyPRGAwfE1D5rAdquLaq2EchQyJStIaShqbXR2QFIsloF2j3uw2+0uStGsLIQECdF7bYJhTF6yAUr1i5i5tMjJfrVeQZkS/focJ/zRbAV+eUao+77zlKf6nEZOrCugPRwnxU3+v5GpYaii7IUa3v/sU9x69x38+ssDNJtNdLtdfm4oUaTK3cLiAmq1SlrBJxuQoBS5AJrmkBYEJVmpVaSLbIMC0gg3yQRSk3H+/q5nMSZ0zJOIfzpyolv5z0cVtkG3wyBbWI4Y7BC1QEbPT4reWKytreH+/Z9ZayKMnUf+D9//iFtvv8XnQ7U2h2Pa0IISV6To/f/8YxMbGxtYubJyPjFASaxWV1fxxd27ODjY54OQ1unm5ibu3buHO3fu8BqnjYfaBdbX18Vxwa35o14fn3z0MVZevIabN9/E6u3bWL66gqWlJV7LLJJWKHHV3v0TpK8yi7LLzyLw3ocf4MuvPsfhsMdWgj7TJoHmzi6+3ljHSyQqaLSc9LTby9DSEtcTlrBPd8DtC4UgZLAzEYVXjwNQi2Q4wOioC3s85KA+DiwGhTGCuRBBo47RVoTRUSyV5nFqa2iVWul7GAzdzf304Ddcf/kqbrz+CsqkMk7Ps0/ipQlX1dimUBxXqCuUDzLP9dp5sS+2RUBMBwntyQGJBfouRyzEDALERsTYRFxUH1jDThoWQSJ1Q9kuJ07k/z3p4kM2yWpdWAnQrCD84PvwzJhBDHo9LspBKwyyYlLWi/F5QI4Ivut7cIc59d9xL59FTJVS31W+81ZM2TU0DQBMrcezqMrn3F+56kN7oW9Qrc7i+Rca3InUGbgpDhPvxOzSiukB+Ku/i2ZrG5eiBkq2hGRkcPhoD2HZAJVZoCxOMyoFQHRKSfiztHodLA0hIlM0X0mBKsgFl1ASIkFK/9sdDHc6GO314fWHMJ4TEA1NEb5fgke6MmIrS21nHlWPqWIyitmvfN8e4u+kh8ejNnYwwKO4jV2MsI0j7GNMXfX8PWkleCrl46etMR/i8sJ8hgHwJHbVMwIDtHL4BMptIj3mqYJ7PMLwsMXBFcshFgpYWr6Ay4t13HjjNfTaPezv/oPtrW08fPQQe7tN7D7eQb/bxd7eHvqtDo57h6RIl1JnRxzweROvbXIbgcklHnTrtMeSNsHMTIhKdYYt++YW5rHwXAPzjUU0lq+gfrGGS0vzqNYieFFRKOJDbh86tkcoiDI302d9R/G20y5EZw153vxigNbWFgb1Gsq1izBx2fXPawUZroqv35aV9Q7xbk9SYTqe0TTGm/T+x6nOgeJcsSb/sYsxYtqrOeG36f86urNlsDQZG4cJDhN0Wn1s/r6Jb779Ds39Xmo7GWfCQ2X48NV8H/tErb3+KszyNfSLPgYBe9ClyT8nKeKiQXuqgZcmgVC1LO9poqHKwLIoFQuoVUqIoiIn75x8scNJwL7qg1YHxfYBKosL/Cxa1YFIptqjBEwgEEAZAA64d0yo4VGf7X21YDJtA8hxOlVfyf2x7GKwnJUdnT+agNJ9O+SDfx8JK4Vfx8QuLRUJTOi8slwtT3yXCHJ7rIawUmlWy/Bs+5rJ0MBPJIVZyjcl4+Y0XYbMrE8lza6X2713rAlkMOnxzrWGUdJZcKrwXCS1Y0TRDHr9HrOaKXegJA8irqftkEwnF3aIxZSoniR09LehcQwcFV7X/ErnkEGN8YSybk7ZJ+OMDSX71Qt1nBjb3ikPYyCVbs+YtG+fwZyM/32eAZAfNAek+cZAgrQosBCk55LUnKihgEBW7N3peqTJ5Ikooidab3kQIc9AUNBPQYvU5z6ZADsUk9I+R/pyCnDw9cU5TQEV991Qnz/Z/ro8QwXsOTkn8FXWvA7tYJ+0cWQBAIrX888f3Sd9Hroe6xX4UtVXTQplP3BsR0CI5ryO3eXuK6+5kR3s3iOMVY29zxwA/gUAAP//xF1LbxtVFP7uzDi24zoJres8FkFFdaFSwqKiVTesUFWBBMuAxC6/Iz8FChUrugCxDkKsKFIpUAmVkGURjSrl5cSxx/bMHXTOuWfmjhNeggpLlpIoHo/Hd+6953yviOkAcZzT+6U7MeaNKZ8sd/ci0aQnMgjGiVIjgtIb6c8cM+BoCTSt0IUnloDSaPQL02OoZklNHoyVibOks8ibC0F+kYUBUKb40bmRYzn/fDxGrUpIcQ0VoqVWByBWx1mbOqLLJpnFcWwpNRDTdANSQ6SSYjRKcHISs96CaMEmqIjDJdE3/2QjSO8zxeYWFR7YtOi3F+ZZhMf54fSZxxY2DDHdXkTn2muYv3wVQV0o/oYKX56TQ4FFApOTUa0rdkNFvEKFFsMz3J7/z0fA0VvEXljoXMFS54oU6eylkCCHgX3zD6en4sXIxRSCAZeq8jT407u/Cjph/r26/p8+/CYS/kCXWRQYk4V7GfmD26D/+PABvvjsc+zs7GBl5VWsvfs+2kttYS/T4j1xnI8/uoN7n97juByTCI21Xmvi9u035ZgB0OkQtXwV29vbMKFswGnD/sndu7j1xi28dOny3zMgNAbXb9zAi8vL2N/bE6qVc1UlLwBiAcw0Z/hYGxsb2NzcLL2c5hn6xNtbW9je+hkf3PmQv2uKl1pZWcH6+jrefusdLM7PC21K9esTFgWEmlcCg5dXV3Dp6it49Og72eyRuynHwIzw9Vdf4r21NdRn5xjZMBFOV0R6bOMSHRQlZX2jREnlKQNM24OjQmcI2JQ0RTbuMwpmR8IAoCSA4VSKtGmQtRrIzjcRP0sQpUMYNuzUqCBXuiQZ6hEz3XBwnOHB9z9heXkZF0zNbZIS0b2GTttmZGOdEOXajATxJ4PCNJJ0D/7fAGmUIqAnUborltFKZg24jDGSHgTcwHTqCqtUSbkIoXFxWP/hTcWNT5hSQUcGnHC0S13cQl5kM6aITrmNgUY3iRmQaAutcaaiJnBsLCpIQ/HBiDIeV1xsGOvdp5Pl9vNEk62L2XIzVWDQXljAuXPTCChNhmfrshEgXCOaiI7HGGHryRZaC0Ajm0VzZg7d3iGOn+yi+QKAxYYw1lRHqhOSUaTfh9glFYDPJ3TmkiT5SgzQT4C9E9jdAfq/7iHdixEOSdhSY4otof5BWJfIWF2HqAiKLPq2h24S42DQxf64h9/GR3gWDPDUHmHXFf5H/HkyjHw6u38PoNBC03N56SJmGnXE5Fr9l+PvrAbv8/lOjeciLk0pyTZnEIX0pzaWJlSYolqrYqrexIVWE53VDl4f30T3sIvBSYyTo2PsH+xj0O2hT02Afh+93gkGgz6bNlFGOqM8ozFGg5h9Wtj5PIx4b0P7stm5WW6Yz87V0WhOo7U4j7l2iw1+o2YDIBNUJIxgprzhiV1xLdRqYlllXkwWI5PpaQDn1JX1FrwgkzjKik3w+P63uHb9JkzzomyAjc3N4QJPMpNaiVxk/TXt8Uq5/Fnuwi567iyP+FUfENYaOx8mcGGY8Hnzfa5oq3tdpk/qAdoQ3f0eHv/wC+5/8xA7T3v5KDnLU0Sp732iy7faaFzqYNCYQexo04Gbo0o+d94acua1y8GB4vdTDE0ywg6raNQiTFcjoYi7EU0NZloPs2SIpHuA5PAAlZnzefGvDTV2dncJCVREFrpuR6uneybNGF1MuEHpxvYE48tnwZBMz7qYaWZkGJlnlB6vEWpc3ORrpswziYttY928Q3StQ1xpXNPYozGdeH5gJTp7oGEz2h0oXN3Vbd8HFHWcgV38nTlbVBFTtNzHzLF/J8Z76u2DCgQ5YJ+AgLT5rqjPHJprwjBv1qmHGRX/BI5WXDHqv4fVJlXuBxA4Q7tCnz8eJYVHgHO6p/lAmAB0nRV4LLT/xXWbnA9lTVV3/qGjjut1impRyZxOJUmUtpBRjLiH5vs6eUXM+fq4poUmBPiG8SyJSPQcjftfW0hdw6Lo5bHkZfxjomHjH1fPwQf8RBM/zF9XRug1stCB1alcb20giB6fwGoCodUUUOZcn13An7vE5JDifZINUMT4lRn26nFHr6dxInLxkGWOguSLPIbvF+cLwR4AzBARVr5KaOihpoR6bnreLH0nsF4QUs9nwJPhZxl+BwAA//+8XVtvFFUc/81ld3aB2gsL2AJVMfpgjER9kHcTnwhiDBFCwMRPIDHyzIOJ34XPYNB4iQkoDWjVKGhAidxq2+1eZnfmzJj/7czskuITTtKkTfdyZubMOf/L7xLToKyiRIMwAYxIBQcsmChVeZEOE/Sj1xFlwIoGNBhDA/CJh2CuARUXrLJkthUMP2gIZMyKAlyFDmPEkVxASvDJtk0WmUYNPlLymGnDDINoYpKQSnuhghHCgY7QfmoGYauJYT5Ec8LmIvA0AOIq09IwzID+cMxWgPy5JV2HAv3eAN3NHna2dwvEDTrB6KbROUeON5nxUPl5nJzTIk4elw1sDLtYX/sH3X6fOdLOpfy+iFq2BJ9Mmug8dwg79y8hIyuLIOaKb1nbnoS/5PzvIW/xssFOQBbrVUpLav53RICl5xQzJqqmH3peolkYSgZSx8DqgCPLRQK/swU1iyXjRwoXdDue55ML7kM9OT4Pem4CEeEy7/8UY2V5jkTABtIpaAW7akWMKhfKxym++fJrfHD2fTy4e487m3t278PB5UM4euxt0r1j/pc/SjAX/9yHHxHll4XjtNeOE0ffxSuHD/NfIxZpiXHivZO4cOECgfO48p40I6YMXLl8BQcPPOM5Tv91zC3M4+SpU1hdXZXFLJRK58+rP+GLS5dw9NgxDpCPvHEEFy9exOnTZ3ijpGKBFBlKFTCRpKwkCkeW4YfLV3HuuxV8svQpzp//GMePv4P9+5c40actwSNvC/WgpibowgxOnTmLlWsr7J9OGhM7diZYHw5xfeUqbtz4FZ1XX2frokcOnWbEtbONzXdyNBhSY0vkecldJloT23ETYyRIohxukGHU34Trb6CgTgoFDKRZ0cyQJQVmnl9EtraFXn+EspuhzaBehbbppVZZEylcALh67SaWl3/EW28eQRDE3KEJCSofObgs8GsvraHMARTsL8o052csUEEq4ZWHCGdzcRBpCIczSFqipxiJTgDDY4nPljoRLotbXICMO/NclQi5chJg+0rAdMDx+DkUTFVfXT6q/dNEB4WPSNZaZZ55AAdjBrKR/5bID0tWg9Ir605BissQ21ndPclDtD0sOCgQJjEWDzyNvXs7uP3wtl8LwViu2Gt6FNopvV+m+H3zDl5behauW/B+MNvp4P7m38CtNczQpZ9vIUyU24jSizqGNq+iyOBDvM9QoUcK6w0iUQN9B6wNkT/oon93E24jR8s1RWQtFJ9kssIip3gSSeTCQVPQG1t5D3dH6/hrvIE/Rlv40/VxByOsFRk2kbHuzZgFVaHg42rBc2WgkH/tAusy3wqAwy+/iD1756u9j4KYcirZ0kM6t1Nz8LFTcHoeTCU9U/NkusvlbCOCIGYoGWJQViniTLnbYrTHqBjz83Lkt3IAACAASURBVEXicvyWJMDcvhbmAmq0zAHBsnzgWBNYEq1z6k1OQmvcUXQ+ILQjSZocC0mgXIA9NSM15jdtGJBGyIAh4WVczX/bOVnKtoTuyNsnrYX/vG2U+gPZezsLC7jy/WdY3jWLhaU+oplZ8vxl5CVRkWjO5V5LAKrarTZ7QeVhTslRqKJYHMzy2gdFXWlMqQ4GrlBBQIVC0+8mMM0/FCyPnCRRA4fBIMMv13/DV59/i1s37/mkWssUEEe9wIsfU8ExJbvbsInFF15CuriM9Uabi6ox8XoNKRtWNAfh+1f2YPbs81o0IdyrsVEgCCtO+rIcO9oJYji0GyFmWwnrFlAhjDRu22XMGlBJI0BK+1TaQzxKEfND3kCP/fcb/HiJeGoBNx5jbtcCnmq30aYCEt15tgGWaKy79hBpf+Bv/5g8WEopR8ZMtSgZUeSo/0SFpXaCXp6xU0up/OZms4UsE8HaejJSf34MyROoPlhhPHtNqkLmiwvlbHqaGSrYkjBGPGgeUuTaNbWij5+3Vfe3DtdnqjHlNeSZrrpHrkZDmYDnKxKg0OYAi5Wr+LhTaDo9+IxWRsXjN3FsRgbUOtCcbFG8Tyg+LiZEnO+kmViqmg0f65RpAgfFx5BGGMUwzC0nDRB6QyF24mZFzegd7tI/us9x8quFkkY86TrGlEWGiWuCH4rgnPHKzUbQEnNrRFmCTq9j5KF649O5DofDqkFb645L0m8WetItJ40LV6NnUPJK4+XcLqzU6+sJdlVcCL3mQ6kuIAzb1/to1oFZTeQ5UtSTIc3NYale4GiQJp26L9j32j2keJ/ulSXrNjdtXNMFC7FHreYmFWJ4vGrtLraLsl6wWwDljnHE2g2U9zp1JfP3S7UB+NrzejdpB2kIAKNkTF+ziXEC+Je5K+lto4rjv9lie5yFLLRWE1CCmqoI+AKoV4RQxKVSIxE+Bks/AP0CrRLlWgRcKy4F9cYB5YS4QZFCiZqlS6Kmdh2v43mD/subxUkDhQrxLlbkeDzj9+bNf/ktxyJj+6adQAoeRVk1StUDkUvwY7bCEo4sGCrCqzm96f20ejWSHTutkggc1c39gLEuKOvPSDtztVpSXkx2M7MoQjByjAIwPChRoI1rYnoS7d8bz/XMZShZQt64VAQwbOFnTSGoSEHdf6rMEWSJixmBBEjGFGEWshg8XkBUqUt6BmGpjJGowzoAxIsmyDvBsmgfI5GGo37M0kg9AmiT/SArz1uGpJs+uPMKrnmxIOiDJ72u/xMAQEdhmoZVxfN//xV6QYOGvwfsfznQ5VNHJLQEUhcm7QbyEX92dISdB3vY3LyLfqeOdqeFSinE1NRZLMy/gVptFuPjr8im5bgpZHD1xg08fPiA08SS4+PZ0zq++eprvPf+BwjJ8z3OCiN076x8tIJms63xqKyY6dFZfPrJ1fQ+9dTl4PLlK7h+fRX1+jYptYnFVwLcuvUtlpY+RBiGBfXT08by8jLW19dxb+sPOPog6kV93Lz5Jd69dAkz0zO8+S4tLWF1dZULD7u7u/J4TIxCwlzt9ug616Doye42rn72OW7f/g7Xrn2B84sXMTFe5WTPVxQAb86OFFWurHyMtbU1PLq/xZ0GL5KO+ZPDA9y58z3eWbyIYHxCakRFFpCsEDercsPCP4eu3QYHhtA6FHT4YktkCG7ebSPptJBEfT6WX/HglV0kJYPBiIPR8/NoPa6j0TyC75XUyjRJg05oh4wsSakI0IkT/LjxExZeP4e335qXc6KHMSeI1E2R7/F8cWIJSPwwMhzwysmKIrRNmiN6WPue2gm6XAhlLlrKd+2z2N6gNUCvG7EeSVirYWZyDJ5feSFV62ND1dv/7Sjs0y98LN0DCnvOS4aPnzKEs2wwYG1ZF7XZGi68eQE//7qd40Qb6QhZNXotAPQSYAeH2GsfYg5TOHi8h9lygFerkzh4dICxsYpcw2SZkQ+O7UBa2CQrnscqvqZXTgFgHEvy3+wi2mnAPI0Q1dvs7z9iAl6nZFsoehEB0+F4DZVcDAKDRtTAfuMA+4MG7vcOsYMmttHGPhIcwuAILotNZfrw2cjPpS10iMaHJKjVMrC48BqLI3WTk3qzQ53Uk3Qq/suCz5AYZvHVzm9OZcjJtGGomO1URGSQtQ9YpZ4CcIINV+XjQwmRY7mJKlYLtw9VIM6sDPUzqVxiroCQivf9w1FI8ITDhHK5imAQY+/ub7yXjJ49g9EzUyLES6LHvi8sewdqU2rP0ykE8Mh1SFnFnwoglnah65hFT7Vz5yhNIO4P0qCebb00Puy2enCDKpqNNjZ/uYeNHzawu7XHFE9JtDymfCYaMxkLM6NOXWzQoifxuVkkc3PoVEI0jSBFTep6YqfiOP/8tGJ6QYLEEZqHMPgNSl6CcMRDNQwQsQCuSZ0yHJ0/XgGdNkyzzsgzh60mfaVSCdWLiyOEJgh8Qa3yMycSQUE6176IUPe7bdURPXlNKKgepTAUWzcSqvPVtco1xzwuLCw7UZRA2ifNqe0xBNvPkhO2a/M9jvnZWk079azyHwun3Nq1ccHQ2tFpQYC/k6hgub/TpFM76ZT0ix5Xh3MVQi1Y21jqXPe0+Uk5RTHpTApddrlvXU7MmGut+YiryXt+bi0KS6gNOZtEtjUne/CcdoA2PK2Am0U5O7l8SygJWTeXEBMW3UG/HcPfh1X61WM/1cfIvWfzLtu0dVRfw1P4Ox0/rFT42IwK1251HvEgqvaDlHOecek9RVD4aTKdORxIzsQ6bmZQ2FPovnWHrERPohoMD0f1CvKaDoII6KQojmG9B1tY5aRa54he7flScYPOj+0BtbnAoKeIBDYF9UL/LzR3+X3svKVxtEWw6DnmESHW1SRfeKLk3zrusZNEoAWZHLoi08cjWpg0xm2xheJ9SxWl8xymaxR+SwB/AgAA//+8XU1vW0UUPTPPdvyVxDaQj5IgUmhJQV0ghUpsi1D/AgKRglgjpStYtJuwYcceVkX8hbKqqpYEKlWCTYJASIGGlIY0TULi2Hmx3we6d+7Me35OPxaQkSI7UeLM2G/m3Xvuuef0AQDa0XcU2/toh1j0HmqxKPnbxbjeFaLGd7oMDJCwG/Ue2c3MQn46TFDR0PRj2t4Hu0E6cjET8FAtl1nZ0BNQgehfhrIWGjriEwZt2FKljJHxcfyFu+mVukS6RwOAAAA/4DUM5DUjSnRRttuHaLUO0PY7yA8MGFVteuOFomuqaVLdJGCDED5itwYeysUqiv4BNnZ2sbm5hbETz6MyWGIEJ+dRb3aMnU4L9zZWUZ6cYIEeD0b9XKUCaKlTum1sK8mhuNZaEOBxvtXHPWzV366Cw5Y4pcx6lM94asSZgK/vvhpnsgKVff7/gQCM+hKNB6YPe/mXZXxz9Wtc+/Ya7q/9iYNWm4NwvkF7RnV0dHQMFy68jbm5jzH18ikgP8QLWF//G1tb26wUnWN3bc1/tLS0xIroxdKIERChnm4VYX7+Myws3ubqgBaQquhV8Oknl3H29Wk3R7pB0NEx9eIkTk6dxI8//WEKgrFJOkjQj3r4Z2ZmnuqghSh0v3X+PNaurjFgR3uVDsqFhZvsCtB4s8GbiQ742dlZ1gO4NHcJi98vMjocpwN7oVJYKrryCtBhhDs3F/DBe+/ji6++xLlzb6BOe06J5o1Keh5Hxuq4+OFH+Hz+CgrMmtFs27nnt3HjxnVcfOdd1Mn6LTvkOqHD2/SfWW3yfkqdRa/pJhh1QwYTOGAkAc/WPrrNPQ4IvIpGqVrCQKWAuKCNmOFIA7VXpxn427+/jjJ3RFpQL83uyQkNs4v1B03c+u426sNlvDBZF1BCVPyVsRqKpR8NXc+BqrG0gCBOXCl4zi77M8BuIMEGVZii4BChf4huK4DfidBWGhNDg5I0B6ka9X80nigs2Asa9IuUxj1Ps+ccu81YRe5HwgXHpwui08mgAmu7nDnzCgq565yDOwqj5HM5ufwomaMw6SFCLG+uojZcRA0FbKzdxdjpU3im2MD+RhMVDuoDoF41iv5x5EQRra6OYaPJHOj1DwPAP0D4sIXugz0EO+QxTABFAXli69HpkytCmn/54FWxDx8tbPi7WGmu47f2JtbQxj20sENsAGY9cYc5umxiaM79UPef30oo3azmHqdsC2PgxHgJ06dfYoXkSB1lC5WM6Bg/Rzuy7YOxa5OxLIaoR+Aw6iHPJNUgHVsVcjkJJJm1ICz7V7O/ePIecIwk32rH7JALRivXY273RFp8MztcovJUQp+PGznUag1MjI6jQIlAZx/tbWJMNfneWGo8B5UvGjampUvL/2aXEuiefl0utEoSyZVeoqnLFzEB2AaVaf0GEIiFhWHzHhOIG8cF6n//Z2sbv/+6ih9u3cHKzyt8bio5F6iqG4vArBYQwPbuc2g6VEHl7GvYe7aObdWBLleNigWBANIS5sIXAR6U2NREGYs9LeuMJCdw8a79bGVP5HUO1XIRtWoJB+WCa+NhUDcy7bKk0xJ1fHSau1BUbRXGKbEiuDVUha6FguJnctJRokagxT6NWjf2d/fg+7GbY+8wFnHchBeFGBweMucKEteSo4ZhDiXJPSfQkoi7PZTpI7eJkW35tcksJa/mMXD0+CylmgoZocQTUaY3WllrYaG8U9HA5SEiANix7cwCUkVI9qWdM10nml2GjKMZCXcTGyoSoTcn+igtQj00dQt2Wbq+ZSCbX3TztAmcTY45Z6I55VPgnWeEUJNkz+MkneMvYmAH3b4CjrVxTOaRZkqYOIqt6KQVQTHD28QiRVuIleQ4YLtm7ZJ5JV75lCNZV4IoyrvWcENDD1xlnVoB6Pcs4MAshyhhBHAMIxpM1pM/zAiEZjUIjvp5mtY/IG5gNmlOizIyKJAFbB4B3NGcbVHarJvAD9PSwG3vIhxotQOSuSW2hw7kTBXQ+faQ0iEwdov02obKb64t2vumuE6xn10Tu0QU6f0291Gi/JMQIMWy9BmQHkXaXSE9B34E8C8AAAD//9Rdy24cRRQ9XT2etpMY49hSLFBMLDZR+I5ANl4nUkBsEOI/yC7yLkt2sEgQCyPlG4IlhAVBTiIwDhYmfiSOx9Oefj/QuVXVXTM2hKAoEiWVbHl6xtPVVbfqPs45yuKkbLOLtzBl9IXD2kxci0uaUY5Em5oonWpZLe1ipqOgI3zDA1wUwxscJzc3P4n+KmUYRjuNKoGdKMKg6GCGTnZe9KCSSG1ydhpFx5BvnfiI9d8jkPi4RkoDIdrNgSnbqRCaAACx/8QIl9YRtxF3sf01al8zhXMtkoSMjl/AKCY8MbrR0UCybSIRoUj64qNKQmxvrKNOIyhiozSiuHH4hxzopjbg/9E08ld3G/EfupHR5uDZRnH1w5UEzqCMtv8EeahG+osbv0I/jfHl7a+wuLiIpZs38cvPDxD3jqDyCkHpC9HXWOFhLPewt7mNb2/fwRe3biHu9Rowx9mz03hrbo7cdpgwpUGErOw82cKzp7tyaBib8CWQsLJyD5/fuCEHPCrgMWjV7UzgwjsLuP7htWZsJKpsDoJMxFz54LK8ZPiTxNAePNvH3bt3JYNvx/dFd851evXaVY2RohRdpTFmB4chvrnztRhLS1DLtXzp0kUsLy9j5bsVLC0t4f3LVzA7O9tAgTxDksPW9U3EM8vw5I8tfPbpJ9jZeYKM+DVDd+zZLJanTyIff3Qd82/Pi0QmK3X4z5lN33z8GGuPHmom47IhzB1qclg0FQDEdA7Rw3m2V8KyX0hWKpOMrlQj0HbRwFIvlHaLG/ZEAI9Qja6Hogv0xz0EC3PozJ9HMjmFxO+ioFyWDSxYpmVTXsySaeK/7z/YwOr9NUQs7S+V2B+aO60vXjcYRJbJcqyyJNVkWGUunQR4QoLHChWW+MUxynCAIjxC3jtE9ryHdP8A0d4+koM+ijBEHkfwuwrTMzOS+YVIr73u9jJW7eRrNcu/coIDaqS/ntawL9f6YM7nO/7GKcy/u4Bz585Kea2VFxQu92o4g8SjIPHzW+kRekWE3C+QpgPsbvwGn4y/UY1sP0L9dAAcJLpkICm1Uah0CXVFCIWU/1faErDELUyB5zHSp0dAyDlcSZk2CXdZYuqRfZ+HNuKdqwRZGWI32cOD/iZWD9fxQ/wnfsQefkIfG1QrAHBgiAsTo2JQGz4M16YUTiCgeQpe6yrx5YvvXcTM3CzSIkcSZ+YZtgFjubZWr8BxfTWt9truNpFnNaofWrrQlqUaCgbD5aujIi02vxsodAKl9TdVKZr9tivBntMRKs0o6zLsf+qqHu7NsJ8QPHvZJvfMkt1gApNT0zh9+gxmJqcwTnmtNEEZDdDb3kF/dxvh7g4Gz/agWNafZgKbA69JE8liC3knnXdmtHP9E7RtSYw8jcU2MWPN3zP2JBbYnGCVnQxakeZIoghRP0T4/BDrD3/H9/dW8WjtV8RZraXZDPGfdf7tDBWG+9pDpjoYBB2ML1wA5s8jepPYf4XCc8679XGFpX8DoTt2vc/KjQK1KoS7JPBLTAY+JsfHxHGvVWVUCYxTw72t4vbi83COPGMAgI5Z6/Rr50NnVk+NBejqiaZ1aOxXzEtkg7jZe9o1qM+aLu8C7zM4c0pgY3QyuTaZUS8swa9DhKUrAMqGGb5y8ObW1xhSAzBw3jzLhiDC1v9AI29ZCtyYPojlIGuz4trfcB1CX7WBCHs+sZV8UiJNHqGxjsFqHyfQa501HYiSoJAJGHQkMKeDeX/3PvcZl6aahecDzYPUOqwuUVvHON42gyzvLcpjSgL2dVuZwM/Umei2vN9eo7kqVPO5sPuRowxQ18Mkiww+8DMt/MKqamjuA8eGmO9v4Yi5I9PL5ygQboNFL42sIH/SKbXOtOt/Nlr1DPgZvgJ7j0qNyg+2QRrPqAecpGaloR+5LvE3zrkkCZRRHDCQd2bL2Vx/VMbUQCZkDoijrhPYmitAwxh0MMBq7+v7bJ6xuzYsJ8koLIYBX6P1P2BCiYoDDKg087edA5YLQAjujSKAXU9yrQkYu3wIzVx2+FUk6FpX+AsAAP//rF1LixxVGD11692PScwoJg5IFjExyUKECKJ/QpSsDBjQfbIMiD9DwY0rxaUyrgKCILOQCJqNr4Q4mUcyk9dM90w/qrqr6sr57r3VlZ6JG83wTU+ma7q7qu7je5zvHOVuaJ0R8A3MPwyDuvdDMg2BX8N1JHtmM3bKVv4dtEH6t2wfg0B3gkj6ewgnLGzFnz8LOz4MXMENNIMKMJBiB4tzmRF38wmnF8IEEnTJwDZZYJpoEVeF/I5mFiFCtBWOn3oZ7RNHUIVcCD3bx9ToBbBVCKpVr/dH2BlnIt/FDh/2sXFZHBAFMJ7Koinrry5qKK302wYWEmR1JQmRihMPrSRAO03QjhOM+kP0H+1KFBZ4ht03VhpHvRKjjQ3sbW7bXmFfKjGYc3MtBZlVdFWSoQ3ku9EUduder+DKMWgfbvOu8f/qKmsT8KvKqw3a8CfYNPjTiQCX1XD0AMqgxppWf6Z6na0OsrzXTqeDW6N+cY6PmWBPVX+RqZjw/UmZi63fX8fq+qo5pjo8JDZ+W4XPP/0MH33wITbv3JVgP/E8tD0fLfhI4Mv9TBEiQYQ2ESLjCt9+/Q2+/OIroGAGUaPT6Uqw240i+KykoBSFDTpGv974ycj7aGB/0MfFixflvcni7O5TXpS49vEneP6lI67kYAJhd+YBcPny+2hFR+U3rJDI8PAVrl+/jp1+T65K6bLVz7qlpWnCf/vNt3D29KuIKUHJDW4yFWWp5eVl3L61imKiTF+yJTFKkhjnz5/H1StXsPzdMm79dQsrKyt475130Unb9frD7Dor1OQ7oKO39fcqrl25ir3+br356Jq83vSOHj/xIi5duiQKmKI1y6w4Auz19vHDyo8Ys8ptnjEtJs5RICdDK0W30xXuECHb0mYeKeucZeUYhcd1ZYJpPhSkAx3PggH1KBMWb0rbidoAN9tWR5zFYVVgqCYoFjxkizHis6eAkycxoL6vipBVRqu9ztBLsET2e1Of2p0A36/cwM3f72A/K5CN2dNaQFMusXSVjlJGLjdYjuuS2rW2Wuacjnw0lM8rPYNcEwuTwGCyg4zAUdgS0sik3ZUk6dKZVxC9sMhskxVn/2+rQDNA0nadbZpqLlU1PLlhQu41M9GIblg9Ea0ZdMnscf74p82xCj/b/n11nKu2NLLruhH816sRg904wskzp3HhjQuSRIpYTeDuYYfmVBkVD54aL/9D7kflCGt7jzH0cvSLAfaGu3hy7z7SKoAaexg9ypBt9FBu7AL9XKD9yKaSSKY8pfSo05kYTYHeGPn2AIPNHqZPSDTHhLth+pf9hHxAoVdLKObo4V62gd+yNfw8WcNKto5f9A5uo8JjG/DThaWrMXWodNs3XPkOdeLZahkMatBKX/H6M9HONhXOXVIMnHv9NSTHFpCXxicY8zPDkOCKf0EJIy+cVXzUM0xgOo0Eo9sX5//N/b0Wks2Zzd9vSs42zb3urOKorAXWzP+dTKUWRpiZCYiaH5f98lFg3lcbpnxtezuNTa2MW2HGuf259gfIS1SZimjTDpxuIyEwP3cONRwyJ+vxDGknQ8SWpzbywhf/iMQDbCGR96sm0KMhst4OBo8eSDKgv21sf3sLo4db0IOe2PDhA/S3NrG7uSaP2ZMHGOzsIOvvSSKAAa+io80gUfblQrLfBhkwMQRtTFxNNYq9MTb/uIs7N29j489NkGokEFlCH4VH3ZAAE+3WXQNlF6i0p/B4UiBbWkJ07izyIwsY8N5JMK5FBSr0jd9LeLNWqu7DdmvyQRSZCas1WzvJqeISWAwoVAFia0hOVVZjHGsrLD0XoZNSN34Cj/6xtIgVUlgKtI+glN4uIVIOSYRajSRxlKSUj/bkuGKaY/FYF4udDhaSLjyEcs7sJyc5iB7nGPYG4su6PV9ZyH9guZZcayIvafvoguGNiUORBldRaPrcPTOHwjg1xNYy10u5VlzQoyiYtTbZNdFVMEU+nEW3fGwThbp+JGeE9kzVuBDUr480bSOJW4ijtI4j3FydiGQfpA2zksSOqvF1pdYz+V3bCsf5JglZS35eNAInB6PnowR6la6LnST1pg9EJIojeBVEq6sWlAalYwoOlvTN8kTw6W63W0P+JRAMnB7/LJ6giR6/KPX4ci6F5HaMv5BN8tlxloTZ7fcORdTsmW+OQ88zsoKm157xXSwSzISSh+TqYncI2xz9UN7XzGMl45YoU2EN4XNs86oM8tX5bEyOCOEjNfmZ0KMqUyu2rr5GmsaiXAI7d2U9DpSgg6qGX8eiq0DfLVE6YwhRmyNjvjYxDx89kRutZLzn00x8vFLSXIXMA+r4i6qdMoz6Tx3DljMS3fN9XNILFRImvx2/iHAAEFVn5qvgsm1c7JAALsHgkisOEWCOOZi0aN6H5v7luCaoOMXrwb2A15XtTZL0E1lkXgfGVDYRKPE2X9usOWwnT9NE5ty0yMVqzgGbrJApoJQoNQDAPwAAAP//1F1daxxlFH5mZmd3k41p06IS00hpmyZXimCUSq4Vb4IF0Wv7FxRvtf+laCgIpVCV6oVXFkUkbVQwQiLWfH/szk72Y77lnPOenZl0W/CjBV8Yks3uzkxm3nnf9zzneZ5jF/VLSsGhzhEEYnoQGfo+IRIVrdVotkolNw4TSqnUBqcHXDUXlPmn9xT5Ki6QGPkgQxtj8FdcNOnroo6HjqX7YalBpMYMekHt0sOgJRhiMug52cDps8/BD1OeNjPVKBb1hCYAoiM0O33W5vOAQQ+p47IZWKfXR6fbNaYQBQqvBiUcCDji6sWMnZSdt0mL1ajW0fHaaB146PpdriHOdBJkGKWBN+hjd20Nkd/hEkMP+trbhZ+2IZb9R8H6E27Hmft/q5W+mA7Ve9oFXFuuUsaDjgJUGthHYQC/7eGXlZ9w6+bnuPrRx3h5fh5zs7O4cuU9pt8nSZnpUnyYP7l2DR++/wG7wlMwTNp9ou87RpOkE6mtFRvMwNL22rjx2Q30jzpCT7IdLCwsYO7iLFNowTWnU0RZiK+//AJSzDdl/f32zjZ/IiTNmKGIvTL/Gt54/c28eyDX8/MzkgLnL5zBzMwsXKuBgF3zhdq1vr6O5Xt3eUJ5OG1amj7vpAlcXFw06Lo7KHGzsbmB659eR79HKG7heybrZdliIkoT4aVLr2JpaQm3v7qNy29d5tKPgqKGDDrSeEPZjh+/+x7Ly8ulMxuwQwxY9Pa772Dq+WkxyOE7Lg7n3965g939PZ4WhvkbUPaBDFd0YMVxDw1HFnVEl6cBlU3oKBClLHsor2kqJpCQmEZp1WHqa1azkFUthJUYvboFa/I0xubOwZmcRIcYTU5NymSqgSV7qeT0QAp7Ng5i3Lz1DTY3W4hT2/iQRLxYofNRz5RMkfZE0HbKkND4pI6/lEVIzPuKQCsNkxdjxNgaG8HJM1N4+sJ5gEy8yI7qCcmo/1Ub8uxn2RAI65EBzuNpRUBAfRcqtQrGJ07gpRdexMRYnem8NZiErzrjm2E/NnMR8YS2Qh+7sc+mb0HYw/72Fg62duBmNQYBentHCPd8xLuHnNEnZ1ABF0xn6kRIW1309jsImwECj2j/NM/SQr6G2kiDF/HE/CDGQNT3cdjdw6p/H/f8P/FD9w/cDfewihj3LeAQApb3TfCfWMJkyczATvgB+dtWtRrBsaZgj75Fy/CzUxM4N3OOa1NzFiqMSyXfZEK1Tfb1/zbj5a0IiB0Pqx8AzB5jsx+i+y63R30mlQV2tQanPoLWUY9193GH+lYCEkq6CeASoEv66iRFQOwjz0PY8tD3PAR+G91mE73DJgK/BfR6g41YSw4tpuN8I0YTjbtUwz4iBkEki2QK/gO/A/+wjaOdJtZWfsXvP6/ht5VV+N4RS21iKbpiEkCWsNQK677QytAhA8fxcdQvzqL/EEsTygAAIABJREFUzLPwyWyapSwq1fnnY8awoIz9BFww+FtzM0yfegrTp06gYdlcDhAlwJtIOa6U1UssKeEX9ZGlAdcrLx0njTBSdTFKm1sbLJoyM+71j3poNz0O4ooMAM3+W5lWOco4UKqO1M0zno9lvBnfL9t4Xw3W9U6ekbcKbuicKTYZ/FFTrYsAsqLbutY4L1L6GUhzxHSPNjUD1P1SDCFm5pLN5wxnmnvdHG/KRAgLBnGSqY7Fp4IC2SRfM8jf0lLGPomFlaxsgGzAvpDybQIqSJY5HbAP8syxBOxWnmk3sgQ9ltLuYc5XdeEuG6D3zDnnwAVLJQo09qL5GwpxF1PJzeSuxplJmhiTRIuTt5qJ13KFWhFB9fTaRhsNo+WXSg6uMT+sVWuDhLEkgyvCGkli/l1fl2Xl6UDvznKDisP9QrP8UcHkU5tq4gcmhdzHJNPP7vmO9BuOZeOodF36BCoWZAFyT6U/6/0YXDNTWlSYIHLvdF/6O/1P2hdFIjE8QaCsEbrPBB4oI4WT72Soz/07l8aUY9zypMBsBgMo0b7YRJbW9pTEr0jVCPbuM0ARNepvFEdblo2/2Lu61jiqMPyc2ZndzUdDaE1TpYS0JUaLWhsQb1r0QtDbXoi9EUv/Q/6BLYj1H5SK0f9gqQnxsiKoNVAqpKY2ik02X7vJfs6ZM/K855zZ2YleCPVC6IFhNuwmmTl75pzzPu/zPk9gM/uu7t91lMnoBEl2AaWwr5SdZLYeaoCakTjaBgNz41UWHU2EwYb3kkwcFcTX8uc72is/5pGLPMMAzoWgLN7c0SGfyGLjxEgq4vCxMUy9PINoOLCI0D9MDMpNlfVmgjaR5MALOSiZ/FjX3Wq2xI/VN6Ny9JycrQURLvp8MvCJypE8IOyfWq2GvXo9o4II+sZBq2MRM+s0tiVbR1nA/+825z9qaeFQuUU5q2tEVjbRpywpoQuuPVzD8tIyPvv0Bj768AreuvA2zs6exdzrc7h06X18cv0G7q88QPtA44fvf8Tubn3gPlgPJkAvUtz7+SfMz88LKgz3YHvUtt9cdkHZTAPHnni/BhxjDZnIvccrymXMvfkGqmHF1RZa/+SlpUX8srKC6x9fw+2v72TMjVSux4gS8ZWrV3Fs8giQQ7p9XwiNz3H9Ll64iCTVoijObAAXe47Hb75dFtQ9yHWjyfdpsQXA5csfWOsfJzbCZ5f3sbCwIA4FYs2s+2Wq/qsQGqzz9+L5/PlzuPX5TXz51Rc4efIFi0xHJbvFSDVqtQ0s3rktvtH9ZjNfJonlSk+9NIt33ntX/Pq5s+M2iZug9d8eY3V11S4kBSYH+5jihwQjwjAvDDdIc5PPOkXWWPdc8Mhguy3BGBFlNRSiMjYsyD0Pzk12IQjtJuRohOrUcxiemUJ6fNI6fSROdIe1n+6sEl/Db8fQr+t1LC7dxR8bO2J/mIi1l7bibmLrpp3Cu7Z078SedeJf28/QLosMAZ75V1jfGbqaTs1syEgZY1MngKPjktF7NvE8xZYGGcOBgPr4+BGcOj2F1869KhoekeTnLMZXwmCduRFqfYzf0zpqaUtqjzmmuPnffrKJ5lYDQReIegp6t4W00QUO2sB+C739JkKxttHCDIh3m+hsNdAjQ0AHEvhHQ8MIq0MIoioU5zGh22psdWpY6/yJu611fJfUcA/7WIXBBtdGxWBJoacitIIQHbKaSBogoMZNIcVIAUwECkMaqCRWNBM5dpEHyz2GxxDlldlpTD8/KeAF2YJxL5E5W4RWJQPXFwy22ZOnrE/xrP3LFghlHmEFo2NjsvfpHrTR2t5Db6sOvdeCocBouwtDgdFOLFa1jDqlbp1lTZ1YqOjdVhumG0swT52V7ND9g7R1Bvpxpyvj35e6JN0e4oM2uo0mdh4/waP7q9h8tIG1Bw+xu1O3WWIB1CzrM3FWdDL2XCUZg1syt+rlEkZnzmDk9Is4qI5AlyxLI3WZ6SJok8/iFcGbASDHvZ8HoY1zfyiTgaNSjEQRpieO48zECVCJo0LWS9rXB+BB1mjoXRL4nOg4o8unvq7EpgWFdToqDLeqgxO1rSFTSjRpahubyOc2BhNOJgOkKBwrGgDOdo/7BOOyzb6Mz4POxSai3jl9L5+ASZK+Q4IPTnzSz1oCalmz+Zpn/lysZy425dTrkSthLjZToOgPfE+BU9XnHp4Ahoj1OcdqlgqWqwIeccwbWAaBkaBfHT6MspxcSZaG8rN8VtnMeSrsBR/j2N8ngCLxAANm1tZHZcuUdmK6FNskY4H9STtQ2SdVKtl+lNljP6/aTLwFbCxP0IIh1HST7HpUsrbBznqdwb6n6HuHBPa9yQEKfi9tsoA4kfVMLEv1oJhf1r9Z8jbIwAcPJKR/Y+ticvFeX+yxnxxOXIl5Rv/P7QltjbzJRPRs4iPJGOm8H3+vlplxeP3wsag8D4WEUX58ybU4IIB/12tWsNn9vAV58mxA3x8+li0G9HzPax+I5klmtXg48Lf/396n140psj14r16Y0SfOef1i78/7DwL8BQAA///sXUtvG1UU/u48POOnUvpIo9CUEjYIseyiQggK26BIXWZTiZ+QdSX+BYJ9VhVbFgjRJZFSIcRDSEDFI1BSNzh2XWfGM565g845916PQ8KyElKv5EixnLE9c3PmPL5HUP8DZa0AOTH33MmgRJG7QRTgE+masFohS+zD8VHE3sUTZU0tJ58mg7RpS8MjkW7gXKnTiiY48YTSKmMu+hXCBFw+ruFjnLasdQ5MQ8Jn6xPKShq4cHUFvYtLyB6OkOUaDRbsKxz63CYnlbEDnExz9OIQPsGRyI6MkvaiQJamSFKCDDcRhNG/NokUgoIC0IRSYPiGQjOKmMKQTCboH/6Nc5deQIcsJygAokSkfIweH+DRbw/QvXQZQdQ2APbn2fjCshfLcSvPOj8ax0+e4qcff8YX9+5hd3eXre/6j/pcyJs+Kf+UjpnPN7KAIIyqRLfdc8Iedh+GZm/RP9D29jaGgwFzw+nasWBmZZKEShQ+tLLBvWK4ILX7qfjqdtu4fuMGC1S6FQR479Yt3L37CYrxkKcWlLokSYqNjQ38+ucf7qXUbawo6CrgytWXcPPdd5zg1FncTgpKm5ub+OjjD01g9l2Tj+D4RANY7Z3nfld1VlOt9vz6+jo/vvn2a9fMIh7x7/v72NnZwZ0P7sDzybaEgp6ddBNnLUOzFTEChgp9Ckj0YERBWWJra8t1symAEeSNGgoUmwiyVl8CKxdrhNvv38bnn33KRT9VFb7yMXh8iL37e3jrjTc5RoWmO6wN/5qOT00ATj7ESG/h+KJZIYmaZiGqKTwSXqtoEpEhY4rADCpW8DoEnxa7vYpvsD7bQh6nKQqiG3Q8tK6tQScZDocDtmnylQYD6irxxfYMdoXiB4sFao29+9/j/Lkubr59nVWBI5p80GfVvuF81jzkZ4VTi5bjCNyaEhDh6RmRrEDoU9SYbLSaiFdX4C9fZEcL4otYjhj+x5PWZ7lO16A5uTRfPwoDV9ZW8Pprr+KHL78y1BvB4pZi0V2LaB4IKDtAgYf5U6xGS4j8ECqskGcZDvb/wvLqZTSXIqREUcsniJMJ4qUYjcqHTmao8gLVeIr8KEE5zqEKgXY2GgLbJQirfP4S2fQI/XSAX6Z9PMAQ32GMA5Q88R+xn7+gj0XqruR/l6jUPMGneV4PiouXUAUoAx/pbGKoFossL1vYcOODGgA+cG31AmKfksqpIA5pmkQNN+b2VHNrWOXV4v8zcHp5vs5cjGBSCq1OD73uEoqjESO4ZkmKqB0j6DR5T8NcpTCK3eiFYzAl1bVhzHwvmt9rUoaFES1TRjyP9g9Tw8oS6STHdJzgqD/EdJziSX+E4/ExsQH4/Stjhabd6McWX/IofYWENFzWXkTzlZcxCiPWa8lqTWB9Uq8YixrGyqiE/9eS1y9OZimnKIsZ2kRVbbWw3CHIvtGyMWdA89xfGU0foalRMc/3ED0zItA+l3qchpNYWBii2YiMCGAuspwVWwYgnUwxGo6h9SKgUp34hhkjADyEzVgK4tqL7T2CveqpiWH0LOxzVDewoDc1wv05hzkIROSRJ5+onGaYtZSjvJ0RANpMwyspcCyX/cQV4Per04jrtGT7dRYGm44LrRFGDadzZlEIcyHOBhFDJd00E3iYPU/3T2u35jz5XTdlLgxKwz3ZF1RgS73je3ayW6IRxgtWh1bwEKIBKhP0Ws4Zhh7nm1YUMcszd07sIIbtC0/USO74JGhoClCL2LbIBMqFePpv7O94koxFGDuLbhrPfrIcVJ7YGlpah7WCp89lrd/lfaSQLzG3cRR9AoPWqORzs5hyIPoNjBAoFaMMqNkVGNFDbWpEz2gk2LrVTv5FlV9U8gPfCBiWcxE9z0zHT1v2u9qBt5jpzDc9aQWQTaAtqkVAek67sD78tnamMtChLql+NraKRJ8he25rqWj3ZJqQa4E0geizZ2ZQXr+GdSQBU+nMc3S+7HWQ/aiRTRO+rrzvrAgrgE6njTyf4R8AAAD//9RdXW/bVBh+jh07TuOkTtps3dZ9sDG29WIgUag0CYnd7s8g+BsI/gKCK5C42Q1CCGniDokx2AYIaYypKwNNW7d2TWLHXwe973uOnaSDsRsEvomauE58fHz8fjwfDXuhiS9GA0wHIG6OWwlJ1JaAMNYDNjDnysqUr6KtQgj0VCo9NBlYKMHzuBBgJwh3Dqd8Q21FYtqPcbryYbt3TEOYUlV0jDCKYxZy3r/SDXCY65oWGU/U7uFlHDn7Am7+9i0HHNydn5sFtrNKekqP9sbo+g66QUMWNxLoisnOT6Eb+tDtwFS3RBSksIIi7hRtgbg2hcAhG/GEIVy7T4YYjRIO2CgR5OJHs4GFPMaj3V3c+ekGTqydh9fsiG/4U6fq/3NTht9q84r5wNkmnrVxUsmcfM9Ugcd7I+5Yi3q7QMkp+GBuXSn8aGqrDXce4/333sUnH3+K27/cEY6bUhXmzwKG7ANPMco0g89eRaJDsRwuMieoglTZp0lZ4IvPP8OVK1cQmOo1fZKSGA9pMigHp8+cZl76ypHj8FsLCNshgpaPhXYLg8ESVlYGDBuH59d2TRrYuHgRx196EY+ufiP6E0q8are2turAieBrRg6abstXX1tHtNRnnn81juZekLE2BYhC4fWNDRw9egx3t27xYhVQQJZn7DZAnfLj6wNzrmBOF437TEHBPoDpuA0PFy5cwLUb1ziQ53HSIvx3+fJlvPXO2wg7Hvymb0Vv8f3167zG9Ht9RFHEBQC7Edfv0qVLWFlZwebmZvUwVnM+ptP3qXIrs068vP4K3njzIj764EO2N1K+y1D5mzevI46HCBfa+5IFWpOW+gPmFybpkGF91UrAwWZBzX5+MNFiSuJTbhqjLCbscJ6UI+ReBr/rwe+1gbCJ1NWcYJHAMkM0PdJoKKEDB0XXQ/vsSeg0w72rV+EUCZb8EOlkyBxV6cMoRi7R6kTuzRNd4suvvkZveREb6+fQIFunjALZCa8xVceYPMnNemjFmxiFoQrRkCgVo1Xk4alNt0Oj1euiSU4JxDtkviMFIcJvnu+YzIse7Rdje07cskXvmOPMH+2/mtrV65Z+ynuyCRTXEWsuE4zRvPRKF71eiHNnTuH82hq++/GHmsZV1uAdZdJlYn8/wITFAE85MbpENaI7TjuIh2M8vPcHeukigq7PTb4kG4mKjM/EUuR7BPkfoxzlULqBFrnSBAssstdsRkAeI8/G2El28HCyh1/jbfyMXdzGCJuc/BcsjjvhwMjnpJy6qU1C0JRASN1+uDiIEIdUB+2FEPd1ilvjB1woyCBFKs9QHVpw4DOPX7PsJZ334QFw8sQSVJEgmQzRjyLsJRM82d7G8sMHaK52pBBAeGlr30TlMjXrVFFfg38o4vqMjG0+4Xje/Z/1fc5fNDL2He85Beb+tY3XywaCXh/txT7GT2KBqOsM2TjFmIRFKdhtBYY3n/ODILfK/54gQ/NSYNMUH9nOl0B7g9nxKHVlS0aogHg0gk41xnsJ0mHG9Jfxboy7m79jeyfhpD2jwlY5j+2iiyHq52Q3GWsfOjqAztoakgMD6DCEdn3mE5cVwnC2AiB+AkUNM1eyz9/NEOsKpk2sw+rhaYKu6+BQt4PVKMIydRRLjajdESapRlXwsLEuJz/ktkUUNGsL1gzYNYJV8bOMu/+HDg4QBW1G2FDxukXP2/EIj+9vsz0iFQuyp/5gVllg9tDqsVV0lyMR9bQoOlUaDV5RD9CV/Z4kyJLEOpz8V8NdStI0Y5loEAGTbFLF/TCNPECU/R1zv88nQvV7zkwcUeT73UO0tMZZkFug7rVHvKCOrQJ/La7nsQhcU1x3rJsBf0aoZktJ0kZ0Vjr5dCzOZRpSGKOYpjT0JfoN9LfoghiKZ1bAUa54/btONXa5SSBZ6d+cj9CbIYgCx4rJyavYF5YVmlspOU/m9ZMjR2nHWtyfaF12mVcvSWkYhhXCwooJ8veb42V5UanVU/wWBO5Md9pSI+h/c+MMBTvPS0EeUIJqk3dL+7YJsF0XLYyekugsU0KlMJx6cX2YLZ6pCl0iUH8qCFjagaUTTO/vGH071xQGGIHZFDE9e87Tr1Kwp2toGoCerEcsTO/V67fl/bPLkkEC2GY3N8aoaG9sColmQigBonQyWsBcPxofWyigPNeOJzsDmPnOlI2p60BAWjv2RKHl32Esf+h7KjqEEei3xQui+Jelxp8AAAD//+xdXWscZRR+ZmZndmc/2GzTbGMTqFixJfjRoIha9Mre1PviXWhAvPZfFLzxolRRq/0HFhERvbU3gi0RY0E0NU0bTT/WxGx2Z3Zn5pVzzntmdxIb9EaK+EIgCfmYmZ2d9zznPB8ldS2kA0vsQcs0foxyYc0ASTMhVI60oHcxStew1ZsAdPlCdSVgvbWAfM9GJsACe/pcGwV68XUCSCfZ6+3wiXC3aky3w7mfaTH6o7gyxEmMCrl8080fepg9/hiuf7MEp5sgG9hcz8xOTuUVR2oyjjP6IyIZQIrQJ3qmz3Rj107Z4n6EmAqooLYnGyjvTrFBTMIPAqJ3EoOgUauhG0WsS57emuaIMiYLkOar5KFZ8XBvbRU3V37G0Ym22P/+h5YUncE/OCFhoBCA+/rKFbz/7nu4fXudHxBT7Uk8MjODM2dex/PPvijdL7sPLF37FufOvQ3Lti+ASK/w1w00JVdsmcCmWPSzJ56cY2d+ZpK4rq3MM36QXvzgw9xgL3+42Hz+dy6cx8LCAhAG+k/sjfHX+Mi1GkSeiPgBFt98A299fw3OIJE4on2WFzhoTDTZMCQahqjY/VanFW7ecBHDkHrdx6lTr+Kjj38S3b5jjWW2tvDpJ5fxwlPzDBKFkvcAiu3YMb12+jQuXbrInVHKCKauIoGJX1ZXsLy8jJdOPicmZAa4enUJL79ykptoFCU4f2Iei4uLbA7YOtBCs9nExsaGnVLbjcd2xyk+8cFrxARZOHsWn3/xJdbWbyIkY7MU6HQ6o+fDrusZBBXUGw1u0BCFdHw5Nk7P5waPw4ZqRK8Xh/2IP2hzoG5iVnEw9FP+2rijOQrJAQYE5odD3uRNtYywNIH68SfQ6sXo/vAdSkmG0K2xR4WnZoW2VCXwRI2BbpTi8mdfoRI4eGbuURykBmQ65IaFnpIrJtB5RCLTGj25EUR3aNjMUHKVbVwPafiqocREULGdiXGnEAgfUtDxEK6/ywCgApSMzMi0a7o9iWNHH8fq9RVsZjGbhO2YOJ8i8ivrSOIMxezdzWLcT7dxkHTAbp0LRqQRet1tTt530YQXUkPeYwlTyUuRkWktJUn0yRCQ9qEK5/wP4oybABj0MUj76ES/Y713Dz/27mCF6f4DrCPFJuR/a0ntJpJQQ4CiYYBZOJhCgMOYQNtv4FB1El2T4U7/PvokVxmzXC1b8E/ynMzGtxFroFEG5p8+gkPtBgbDLrPyKA4t9MoYZil+vXULR2qTcFpT4qHiYOQB8G9m/v+/9iwxyco487/aagH0DN3psTyKoDEYpEboE2WfmuW+xAGqEZtOUY0jxnMkaxJVX8bN/HhQfCZT1CntNf2+JAAQI5UTLIyPcqWGtd/WcePGGu5ubrN8c2jEEkON7ozd81UEmpbKiGjKPNVG/dgcksOz2Gk2MCSw5Yp0bz8vhnH5537PgKLuX5sJDu8JoR+glCaYaTZxoBwgIHM68oTiaW2WM7p0MYA0In+gepikXfw9boh7iInuS8ORWsiRuGJ5nSBwiT0bozRMsdnpoLu1U0jGMYVCxX7mAUG9wikAiZHaxzh0XPK6MzbwSsz6cBwnLw48T5kcIw2/NkrUNZ4nppZ27nlFF39d6oRudmmhWf9vjDW4LrJG1EOMs/m1FregngC3sJrl+cHJPgSaiOHLdGkBzhwRSAaAbsb1IN+a7DngjGylLfNQTQMdO80mT6E4GTUm0yRCWK9aqjzFl2u2vyMFmhqJE0ArlQqNBq5/LTta8+mL95Ph3xlyWpqfT5Nd6+/Dufqq47c6c72eCUtQkpx2r/IMai4IxT7L608dDLdaE+h2uwxQWXJANYulmatcQME/XUdin6g2fQSqR1P/ve8TaSYRiGY2Qmpy8D8uGRi/F/Lz2eURkI6ZIervhtWQazEF/LQH6fnR8RM7lc6NYxgt9tJ7j/FoIDJuxaa0u2mNKm7+wp7Uc6FdnBuW9P7ziXVHPhUyJOeGxZgsVU30VdbOchvr8K+sC44GtPiY/SrG3jN6HHod6PioUaUJFDqAzxkEroM/AQAA///UXdtuG0UY/mZ3fU6yThwjSlJEokKEQC2VShWoRAVXQFGvuasUhETfgQuegivEO3BBgCsCb0CpRKGpkpA0MTk0ce21vafZ6v9nZne9CWpvkOjcRJETe70zO/MfvoNT0tx8AzkgGImqFuRVMbX3Jwm5lJyxCl6YilBIhrjQl8y69TZXJw23x0wOTQBdDCUCxgYkQwY4KZRGaJsGek+6YSWC6tJ7RBlMI/4Xrk+6UCyl8E6K/NWJKtz5NtqLczj6fUs1EorKYkKJxJAdlxck6A89TFYbvAnQZlUhDg9ZqIxG2mYpUmqVhUXMKADicBPJM0o48KPvWXFURYe45d3eAD3Pg+NMMky6QuIYMsKoN8De31s4v/QmylPT4++dZOJAGWD4+Rk0xymq+JlyDMEdhXqticWFC3jwYBN3fvtD8WXL6jAdjQJcuniZ1S9pPmzdNWA1akryGNKskndxxj0zGzrNDSWas7Mthrbf+myFoUvSqESzzVDEifOdu3dRIXRHuv5V8Wh5eRm3VlbUyWmam2lHLz904UqI8b6nLfDhJzfw1ZcuDv45eur9oe+/+tOPuHnzU7x//QNGATgiQyvwJSgxBLUZCrCQ4Dfffs3VaNtSMPhRHOCXn9fQub2PhfmXVUeSDqczeFr58e61a5ibn8f6+n2mVdTqdcShwDDwsLa2hveuX1WpuQB6vR6iUDKHeWdnFzs7OywASMUAszE9fLg91u3njbZWxdtXrqLsFOg2pzrGEleW38Hnt7/A96vfoTd4jL2DQ9z46GNW+rdh63QkG7RJtlozaE43cdzZP3XQwNwHbf1C3RqCKNPPIBywaj91H0TdRuxYhY6eRKRVpjmppmDUlvDIGvBcG63Lb8EZ+RhubLCwVYVDBkulW0JBskulCgaBz8iUTjfG6g+/ou26mHxlBg1H+YSnCaPp/OcQAIQ+EHamhs4wONakUNBO4goG9Mz4IeyBrxBL0gTKslAu++9HUnTcOEO48Xke6iD3GZky5U5g8fw8Xmq1MTjYhZcEY4B2fgZJR4bc/SBwggh7o2O8WK+gXprgxIfWH6lt9r0eJ8KTMy4LUZIAvB+GiPue4jlTx71MgXcNwq4CIwWHHA26OAm72PYPcc9/hHs4wRZ8HCFBn+kHli5OWhqyL+Fqjv8cbLyOWcwJF61Kg4tpUbmMw+ExDsMueghTUk2VCwAWu6HQuTjkClXMiIA3Xj2HSxeX0Jyuc/efzt+GU4VTraA/8NA/OcGjw320Gi5AKtKplezTzr7/39koCsJcz/vgbYr2SxKbm56CPJpAQImSTzx/H3Wryl3qUPNxQ7I/1jzrVP1aGLSnNQanNp3T9N4l0C4nIRcBKLasWSXUa3UMHwfo7Hbw15/ruL/RQV+r2wepLWVG7zSDFG9GtB+2X4C19BrCCwvwmi48gvBalDLHijqQ24KKeMwi7zZ/YJsEVf/jmYPFo2kvKJWZ/z8zNaU0QXRjyiT/5qyTLCys6AD0O51FJRODUKeQhL8GHmqNBmaaLtzJCY53wnjE0i42Uwp72NzcRr+bKf9buhVi50gAummO1uwsQ+UDYZpbCqXGGHXdsaTYn+2y44yTLDWqw3Qv86LhUsqx5OdZRpxLtFO7cq1HkB9prkHUAtg6aU7SayDtHdYoi8JsftIhM2HpxFIaAGlXuEjxSLiAIqWhkSp4vkU6T5GhGcSs3h/6Ecc+0HQ8UyxhMT5boQNIy4n+VrmGmMRT+dWzXao8Y+0Vik/0+SUWZbb4OWERdt1lN89WailHEHwYgb0wnbf8+qV7yK5rjs1xoucpSDlD2WPBsTyhPBi5LTK0uGnqUuNYaroptNuCERGUWkvOUC+MSB+/FoUoky2tlV3zKQ0nTfEoIkPGYrjcs2sSb4NC4PXITnOxElbOde7pc43OQL4AYBzxDK3AxPEZEkE9NIYeo0DHVKiTCAXNB8V0CsVO82Q+l9xA1DxlCASm1mjXAV5fmkaTH8a1j4ah3RfvkbJiJBt+hXYxe22SSDwBAAD//+xdy24bVRj+zpkZe+zENgmJkzSQ1i1SGpUiICoCqcAGFl0gFrwAUhFCCLYs4RFgw6MAEux4BBQpLBrlYpyE3MjdY49nBv2XY48dLgIqxAJvqibp2JmZnjn/d/V76gEwL4tZAAAgAElEQVRmJp6QQmIngoKy8YMTTkgSsfAsJ06dLCTmoStReYyXu4hygkRK7dj+fOhHT1E/T3/WeSmgyI27GcnzQscOS+KVMemA6XdBCe7Yow9XrskIAkQUSpgYBOE4xuYn8NSdm2j9sIlKYGE7mhqe5fuIJTGWRL7HUYpaJ4FXjOGlglSbzEO30+PBk4aCgudQymEJjtX8gcSop8gmGBsvsVxz9+QYO60W5qZrqJbJNenz4EaprUVzib2NNVwe7aFQrfD7ZYomsfSKf7d/Qxnw+DffdD7alxGSqMvBN+O1cf46/37ZqMlOEBq+jjC4fr3BkvOVlVWWQvUiwARgb39ru4mlxdsy/Pe6WLy9iGvzc2ht7jBwE3oFOY+ZStbUozU9PY0bjQaWl5dx59klLC0tiUR/us7hWCTRt7kFllDPUwrQ2d/nBTYwps+80nEfvv8BST0kedvmlCUQokTYeCeVs/0NRf9nsgwTU3W8fP9VbgkYHb+sY6bV410wln3u7z18F198/iVee/0VzMxOwR9Vahvx7xEpvvzSMq5dm8fe3q5elIwqp7H+aB0rqz9iQQEAIJ9E7VDNYTSjMlHFm288wMb6BuJEJF4J+xp9fPvd1/j0s09Yhk5r/sLCAluI0m7Gfyd/HP2fbm41NRhUlD3Ox8QPGQSYnpzFi8+/gMD7DTQkG0VWUnz48Ud4+523uAYm6sS4+9xd/U56BU+hhxl5V8sk+XR1Tm7PZpxn0UiHsnbrI+6IBSDpcCe3F1iY0GdkX5QXitjzhrUj3j8jNV8U2nhGD5xyCbX5Ombu3cNWJ8bFT00OGKTr5meiCTE823V5cKJ6I2KEtnYv8NU336P44D4WG7PI0q6meYsVgLqSJVhQr1cSIPOlq5ZDGmktpvtOZaOuzoaR8MQMrA/GyVT/eV/4X3/l1508Wjj8nf8i9OnO1RC5kdl+4noax2wDaJ+fIulcojoWYq5ex/bhPrqpgtXuWIOjcmo5jcY/4wL7SRsVGyGwoTTU0CoRJzinRhF6zpRDhCjzM7YXxVr3aFgOaqzco0G5gNPTIxy1D7ETHWAtPcIaznn436caJx7UuQuCQ/1o4SJB9CSAGVg07BhuBBNYSCdQ92ucbXPhGaxeHKDVPsYBLrnNJFO7FbH+Plx4k0FMALlOZIdnEU4pOZ5qykgxaAuwZQvfFJAUpVZ3r9mEF47hiacbAq56Us+UugDj/lkb/fP/1/ANavogm3kM4BoDnplIoVPaNxbJzliA5wntXiLmt+Nzjgv3x0ddYX21rlVYZaPrrMfhtC4xnRnRsDhkM4qVuStan8fWclhir//6Rgtrjzax1tzFiT4befjX0L7MEScZ+oGAke/jpDiGys1bsLeeQVSfwnkxQMdXAbwqE/7uPsj8iR1Azh8N7OeYnKmiXimhGoY8pMNcBV5HhKayZ2UgpCd7T664owdnG+VqkfeVlTDkbn8mqohgssAvZyfYbu2wMmLo82rqEFNLDkAxQK3+pAQnmkGdnduHWM4vEMl3T/3KowCXywOADqjIWcmMVqolPDjbK/8+v793AxOrCVQBMHC//bFVjfaP3E3fTXntkKA2/Sy+VNwRucPvlQpwYMlunHmsGkiUkbZp7riJ7MNC9V5SHvF4sYRO1EXFl4YDst8xCRln8FIZKL3MqQ9SVm/4YcAZQHyPUvBlP+ROgBLKe6ETT4CFBCZaBgNc0jwPin5BbFYUIM2yeQlNNUaBgDRFWYlWTvJXibzJkUWOUGXQBlatCLEM8UPViKm2NGSS9+FsmTpgO8+50dY252l3Uv78fTH6opmOyGE3GNN6YKwSFyMp+g7EcYCHCy/8PYDVDeKu0p4YdUd0SdYCd0fJusOqhsFAPjiIvD8BmqKmGPblOytAX7FCGUz62dxwTjMjfQY6N85S3w/y1MGf7XEEelBwo4JpzPBr9gMN/dyER/s5HQVdHoLk86V8Lai5ju51Z3lwGQj8GTPgV86utTeKKgw/Mzuznb2U7fYKtDSkBDReYkzEyxdDIuEvKKIEiDHhF2j8CyYm/gejoLFCQvzmJ78ag0RDuCPEllDbbcu2uzs7c4553vPO7uwWaOJ8gA/ddndnznnPe3kuAadx5JQyGNNiioU2YRC8x2LR5zvFzlAE86zykIxs/EpUkqkft3ao0IReNwbqSWlV8d/PVEZVZMNzPuFeql1T44RdBI0gUIpMNCwR7h/jBrshTI8KBScIIqIHYeRcCXJUgN7lOR4zPS3F09u0UZwqY+blBYzPX0V8r4GqAGzNQLqguu1ic7TWBiYSwhENaiORcIC79IltFbC5sY3KaNfB2rJJbq8B4KaB0vuwziuWgaZaChEV2+IXv7myimZjHe1qCaPjdTkMI6pvegabD2/i0fWrGBuvA3umcp2mwfVocv8+7dr96Hr+K8zQz72cKoGn9na9vaEbxkHHCbtSNEnqwF9cmBe+v4hLi4uYnZiWZseRw/M4d/48kEYOEOAPv78muCIuOYITJ45jcfEiNtebTgQYwNLSI1y7+rs0AOShBwEmp2Zw8oMP8dWXX7tOnQZfBovxqWm8e+wY3nrnbbx+9DXMHpjD9L4ZgYJR/DIvUkAkjFFbP6viQ6IzkGomkVvzYVTCwouv9Nv1XVW4ygZWmTZMjgvgD6UIAqMKArx/+gwWL11BngPga2Ehqtm9TqcrTpuNBj45cxonT32Mz7/4DAfmZzmUkV8PtAlhyOkGKQNlEQ288O038FM3UeAapS/wTz9ewfHjJ8TyrsSD0XOK9LEyAoUHRYEvMiu3U5TLNZw5+ym+u/gD/m0sO8GXkNPyLdy/9ydaW09QrTp3goWFeRH6u3zpcg85JFZ/QQExC1c/kPtNbpQEVoTS+vno1DnMzc0L3TQYXq5D+4F/q14bRb32khMNzb2M67aXeOj6ZWE+Vq+jNjGJsFJBJ3auD+ITS7eQgif7ktzVNNkSjnIaN2HjlmsT0r6J/svlMqx4Hqt+ica1oldQYVMrU/fEp0duB13yDsslTB1ewIwX4v4vP8N7HCP2U4G5ir6KRCE3n0lTX6fyKa7dWEJl5Dd47x3FwdlRRxRQv1yxHZX442wFTdeKL3GiVA/x3CXXjKgFUp04kaNnvOC0g76PmwjWucKv13yEomHy167NgcHY5O2A/SkksffzvsWbrD3GbvLckk4/Adamj+/l3//pMbBXTj/jc+5Grd5p5dNvhMlhzWJWaGaBwHF9OA4OJ4hWeXgBD1wWq502bDtG90kT26sraK6uIipazO6fwPU7ITbUFzsv5GlNdp5yGm/QgMVy0sF0sI0qRctsKGdhwY/lrCQn2qczRbslAqOFkUh0PgQ9Y2hV6jilaxtrWN5YwbJdwz/eBh6ghYdoC9y/rc0y6k8U0RVkSlUm/kUcQhX7EWEurGE8rGOPX0dQLKPlpVhJ1nEzbuKWbWITqcQMdelEUZ90bGNsw2AjdY+EAOU//m7gyeVfUa5P4I03X4Ulf5wFgZdgdLSGwlYbttXC47u3Zb9W984CpSoS65J01xiPFS49LAxrcs9ukN/5f65hmuHw+Th8DRdtsq8G/sZQI7+HahhGOTzjfXagIHZD7Aw21xxvNlGu6k6RtZ0w3aHvb5wQpE//aTqIPCohJhrFemKLKy4OzCM958HPM5x5G8WuujZFt+XUx9kYjXOTO8ci9aThmrnqiGCYcdDW8kgZ7e0ONte2cPvWffx14w7uPmyIdpP45lsPzqA1lBjgaZc+VUphxybYZAw88gLSQ0cQj49hPe2iRc42Y7ZQ/nxV/t/pCtO/Qc+7v7l9/IynYeIUgfUwO1HD5J4SyjL/d0M02lczd+J3CpBNIxWFoAgBFo5BYtHudBAVrAi88TyYm9iLg5MzGCtGCHkniAByvkFYb6zgwdKyQx/05AtcvlowVgtCI7GtOBZh36GDKI9W0YzXHY8H/SaATEWTjuzFbKoqk1pV1adQraCDPZ3iZlBz37Ubsuctg4HUDBT8VhXsvQyqmwn5+UrVVYFm0ijkfgROkI5BXYZGxiGUCyq6WFClFdYzjo+uxREKUkiSGsVru+MU00vRCNI4RWiLCLk3UifYSERpRB68XxSaYSkoCgyfzZwSi1dr+nbkapWZ8d+bW033bLsJWnELW511KT67bECQKuhJUiSNYHrpS11lPLU1JzovlTNFchPjzkfbtTB+X0E+VasKcf2hLhB55GkfcSGT99gVgmLNnF/T8uiN5IqybokAMIm+xtV9QtdQkbnsdzk0lnsY9N2WxPmtC51wWylGMzQlNP9yopH9uq1SrTjqhjYc6BLlBA2haxvicCQ6BalBJSo71Anvjwzj9O/1aBWD+7FccVSMjALAnIlihiyoWSRTPyNDqfO+Ffn9pS4IneuGIaXJiBMHc6OsH5Tx/zllz5oz/F/QodrQ4XPjlVkW8rNkTZGM+++IPBozZP1zX/KzhT3XCMmxSTVQjYk4TsQVgnVxpq0njhIU6B1xzYNMDyDLZ0Rw0/fwHwAAAP//7F3baxxVGP+dM7OzOzubjLk0bRMqpqU0tFSpiA9FrVXqBdGWPijSf6giKBhfFER8E0T0TQTzUAh50D75oNg2pYkaetkk3d3Z2bnszsj3nXNmZiOVgog+eB6SDcuEncuec77f97vYJuuSu+2Ozvjnp8JQdwx1X/IGlm8mFfAV9MYYHDEikaS621TS/hWtJNMReYp6YHIoFdI2vmhVKR15xc2y8BqwtGlgxVVRalAgS8Yna0Y+MrDOMR0lqDVdtA76mDt8CDdu7qIpykVaajZbXikcaKMSJDmmbAthlDAQQkXKYJDwl3BqEDNKXTU7GT8PRechKidNcoSCUz4rRbT0ohCd+z02nekEPWZTSEvAd+tIu33cXv8Zh584BWfChxANvdhX0NF/SaVbFv6lDglaE0WnnKQRnFq9jJfUlBmaWJc/XMYPq2touU04eYbZmRZee+Vl7F88zoY0xdbN3BMxTthfWjrGevH23UCxCKVEFIS4evV7XLx4QZnBMCpWxxuvX8BHyx/zRmGYJ2jWPJx68im8+977WDx2lO+bsDPWrtOcOYQyE6miELT5EPrzSJ2xR4sAaVRT/Hm4zQkuuhkdtx/mBo1PUMbw5vQzz2H2wEFsb22Vb+r/y51hWtBGOquUN0gpn8Nnn36Cle9WcPmdyzh37gVMz3h8aMpAgDA+RXj70iV26pd5Als6vEEjjfiVK6vo9SLMTTb0JKrkMLQhD4IeNjZvYX39OtbWVvHs6bN488JbePzkCZw5cwZffv0FL8aOrZCOXrCLzV9v4cTxkwV1bvmDZQS9ACsrK7w4k6+GAo2UY+tQFz1MSBQWXjz7EvsE+L73kNdwnDZqXonKz7HjpIVmy0PTn2S9fran4218TiQhp7SgDwJkDQ9ipAoOdnnVG5pcRz1ZuvOjjEklP9cMjpkuNk3etmCAkah1c0tHcCR7Hr98+w3y+234QiUCtKRTZigWxYaFCCOs/XiT+1jnX30aB/ZNMNWQWVqa7kfHMVOkVtfAkepmmbmuYLQIJfMQhEBnhvWV6Q7YXnjqnx+FvMmwMLSujTWlKLQJ/xF7ggxilMJKYlhIIYe5onEW2rKMzRd5daN1NhlicL+LtL2DQfsekiBAveFgetbHzPQM2lvhWMGqxErmHihmDTnx3xlFaCchJoWDCdlSAABvb3OeF4ZJijBJEYUB67IjW81UJBnoxjF6gz62ux1sxW1soI1txOiprQYIhp2C6oR4sFmzPw0b87aLBdvFo5kHf1jDZOahnvmQdguhtJiVsJEEWB/u4A4GzFaolq4FrbiytpJGOyF3bQA/bY3w+VcrmNs/j8OL87yxmWi5PBeQU3aTZA7RAHc3riNJY/gLj6E+4WOY6S4LmS0WDu//J1c8cFS7q5qiLbQr9V6K7cOOIi7OlshJ4kebVZK5kD7Zkhr8JxColIdKl/ZwbJnLezgC0YgdwEZYnKmutMm2W+eDbfakqbEUM4pptUvQ7Ya4ce03XLuxid/vddmkMsyUWeWQu6+W/mzKdI06sTRCITDwPIj5Q3COHUW6fxZRw1bgqy2LFcTEjP2VDfPflXTQPoJkpVPNGva1Wiy4EXoHSteP1khD0y+kXpo9yExCjvctu6Mip9SMBL7rYGHaZx6PpQE9LqDSBJ2dXWzdbj/A/E8/G1DpCd6+adR8jxkTtD4Oidej15FMF4umfqDrkGo9PbR+nyNyc1F4hhlndpX1rs3tbGtMc713VCn+ZS2ggVhL6qQe4zJfjsykRugTKrAs7V/AY6S7yanyU2CjwKFiF9GMMtOYguu4zHAiQ+gp/xFOV/AaLS78qZFHv21h6RlbtRPpuU7Zl8XmxonKn8i4SBbajT9OI3QGOwjjkKXGJPXb6XUQZyN0wgAiTrl5EPUTOHUbcT+FS98HmRfPJzdZaY9MjdYkVu72xnSQzOLSrHC/hy7Kx0c21riVldqLLpyzxy1fVHLvVTGvGnyUhKSYO+o94z9AzWJ63e/3KyzvvSBjRVKuTRn5uy9FUU+a54Op8zpZQTEh0kL7TsVvFUAqHuTKZ2f9flbKDsyzU5y/rinpffK8M2kBdF2YNVHEvGuPu3igC3RilZSJdvR5Gw1Kw1PAj4rkI1YeSSCIVVLGZlYNLckw24BFxkODWeaVGHl17Q3AoLyc6G8CkoxptmEMEJvCdPsJBKBjOO2BAKrRCH8AAAD//9xdy28VVRj/nZm5c2fuvaX0bSmUWKAGW9CIO+PORDGYmEjihpWSuHBhCCs3+H8QE+tCXXTlpmkkYWtISAgNVhOqBCyUpty29zFzp/M033fOmTu9rYCPuHCSm9Bym5k558yZ7/F7WBpqr8UhkqQ7GXGBBiCM/UT2nn7wA29pq4Pdu01X1EN2V6HUO3thIRwC5ZyRNJ8gunGpvJ/lSZO+h+I5CPpPwbEcgRRe0GKe5IlXTuLh7RWE9UDquvXcieaM0XBveh5G3H44FPCTPZEtHzg/CNBot+HWXJ4cybFNcmid4HFNOK6WdAbBXNuKY3PFZqvVxFp9AyPeCNw+W4nQCfQ5LrY2m1hdWcHGwweYGDsEmFU8G1D27x97Oxga8iLnNAx24HltFuXRjhEueUv3GbtE5HIvWzXXXPWMQvirAa5du44LF09KPvwzYrepqSnMzMzi7i/SEi8OZcf51q1bLPY2OuJCMFdcYPqlaZx4cQrLd+7wlhNHISaPTuL49AnugCZK1y9V+gB0cqqmiaJHpwqQiq1CyyrBtixWxtZrRdYcDXacYFrX89KnexFG6gEmhfxz772Lr65eVfY9WsxQXUPeICI7C1PKGIqQoZH1tVV88tFFvH32HVz+/DJmTr+Mqi015hlmb5bw2utnMHNqFj8t3WbdCS7aJQKr937DwsIiTp2ZxZ2l25j/9jvc/PEGglYLXlt1xyEbV998PY/3z34IcuYjXYGFhe+5qs1quKTN0EmxvLyM2ZlTypUAGBoawNzcHC5duoTFxUVsbm1ykEMlpUip7TLaw7TxwfnzuHLlCxw7NiGv/bkTv+cPZAkS3T8wwDoAtFlq/RNtU0ZwQEEbeJLBiGP4jQZEucL7JNdnTXoRKU6rElVkvrS+kgKdIFWweun+UALFP75rYD2IMTx9HOPtN7F+/QdEgcfdV9JlqDL3OlWVYflM7aiX+Y2lB3AdgXNvvcFFwxJ1n+MOfz8HjhBk0pAWlb2K43oPJngouRwY5Ldetncp8qd7dRP/0VFsKO52l0iVt3KSPxQyeDMg6LpKDsMjmfMj9PeLbiH/7cFFqzSBtdNGY+MxB1Z27SA/mOQ4I5T2g8gCpGEEww8Rb7fhrT5CvN2CaPmsok8WjONHDmPs0O+4u7YGI4t6VCq6S55+30TE8PonkYMxq4KqJQXALN4BTO5qyXUXM1Qz81oIkxCxCq6bHR+bQRv1nRaeoIkmPB7zGnWvDBODsSSYEVd/0LAwkrk4mJUxLCoYRg0DWZlhsVlGtmAOfCPB49jDclDHkr+Ox5z8c5qwx1oXqsBLP5hqXe2o/6di2M2ft3H1y3l89unHOHxkFB0/klZJiiJIc95oNbH98B6sLMSBicOwqn2UZip+q8XBfZbbw6b54P1VGks3gPz/8PV1QKnjE60fIsy/r/NBFJSM/a7lzwwFp+CyILjKEFZIAweqmmsOrUnzCplAJFbM3U3K3GP2lJcBstnyVWJlslo67REkbNUJQjza2MLK/XVsenEu9rfDpxBIRDfR4cIQF2ANpCUHW7QOJybRf/pVJOMj8MsCgZEgZetW+e6SnGPGuD8z7t2vCLDfqtkjGCjktVWdEiZHxzBa7WOjP4oBEqUSTzFmqs6Rqpeo5jkLLW6XyA9RARJKEARwaHAILwwNqZhLFYXJutb3cP/Xe1hfb0qKT25TvDu6TIT8jB89gv7hoVzAjxMvFLjnan65Ex9FuYI8/Zu6qWzpVtDq4mRUpPkYsGp6pCgEUbxrrKXegNkFw6hxZih/kuaQ86ICfe9cCY2Y0HNAa0DdK328DqG3HBipBcuyUSm5qNUqOFDrw4B7AKO1YbhWBRXXRdmwYeU4AomFpfmzlEWjwoeqSJBLwuo3Be0iS8HrzQyhHQHVQS7tUoGFEDEN32PUMu3TjU4Tdb+ButdEEHbQSFpoNdrs7mI4JZQci4sGMOW7PVOOWSLrjpVEYssCkeDG69486WnrWyep+ijazGk9iKxgsUg5GovNUdecBO24YZqhUnF5zorJM3redDSfllo/1MiNsogtb+kaaH3opLjIt6ek1nFd/tvea93vyC0ETUlxyO+FhQmpgCXtAkm7TUPp6fu64axzGp3/UC6g17K+Tu21rzv+xUNrC8jcVBVD1XwwbJ9ppfL5LpeoYKJ0T/5E647OJ4sJ0i6SngEWHVS0HEbfq6Y+PTdabJ9tH20bfwAAAP//3F3baxxVGP/NZS+Tzcwm28akpLVaLdSCFYNUUESKFNRWX5vtgw8VwRf/BEXwv8hjQXxSQUEfQhBBpN2qWG0tEa2USpOm2Wyy2czuzM5Fvu87Z2eyaVML0gfP0xKScGb2XL7L72LrLy0TOsg4dNqrUqA9WZJNHBatVpivziVKtCD/gjLVwVQdAjmhBToYwqw6xXCd4cso3b5A9UGrRQOp8jYQZIj1QsoWuHYhsE2xConIn9IZwfjjj2DqyKNYuvg7rGjnia316Qx2A0iw7vdQdAoMS7QjE2ZRYNCU/PZ6LsM68ptjsLAMCajo0rViQ1WSDLaws0s22h0ft+6swh13xfuTYMO2hUqpyLZjyzf+wtThI7DGSjsyyofRBBsOnORd93Hp0g+cwH2zsICVlRW01lriG2paLKg2MzODM/VZvPTyCXiex4cmHQynXz+FxoUGgjCERyqVQYD5+QWceescw1U1m1PnKsOhPfnAHz36FL768muQ3AQJ8VGwsLS0zNZxk5MHZZ5JBHe8hheeP46rVy7L30KKRq12C6O1MeG8DT2frrDpMVr11P9LB1wpho3Z0t6XxC7jHa2ttRBGgKOZBA8o1WBYmfDe2XqdCwAsXaj4bqy3ZNkolcsMp1zf0CrJEf8OxwN0sEQmPv/sU3zf+A4ffPg+3nzjNdY1YJgTiXjtqWF2to6Prl2VqmRqomiZ6IV9vPfOu/DTLjhDDfsCZefwWq45CrDpp62VNfx8+Sccf24Gp069imPHnkHjx4vcvdOD7fzokaIse6/VxjA3N4f5+XmcP38ei4uLWG2uctWV7GieOHQY9bN1nDz5ChdC9Ha+mwTAbsPMJx/bRo4nbJKHtYuK53IXTIta8UWVSodDNBIEBRD7PtLAZ5QIQzVZ0MoQwVLTUt0m1VXIrWEtdiVOD6IXQMFbEPfQZzX+MvY++zQjAG43LqCaGhil4JqS3vyZnAj/lYoUdN1927jBPNjTJ15ka0BbNcl14Y4uDlqqpNvCYjFCLJTAkGDp/QQGdd46HVgjbZiVsuqQmPd0rfivRl5fgOGo3OFPB1gHehafhBlJLX7/9EDEKNssCbbJWD/kQSg4//Yt3PrtCsqFIg4cPAR78qA4QVDcaoRIwjaCzTb6zQ7CtTa6zU3eV8yJLRZh2g68iSKqtZrcfVHundxl1QaMAohwGz4mog6jRBzSAjCkYyW0kVREJ40Ync1NFMMQQUm0elY7a9hItkD90gBd5vcT7JgsoSiJoD1O56RnlTFhjWLC8FAKTJT7BVTiIioYYUhyaDkISgXm+/8RtfBLuIJrWEabjf2EPhLnCuuRkSX9UBom9P0X1P4kmlKYAo1fl/HxJ1/g7XN1HJieZA0NKrBRSE1dOKYI+ZvYuHkdCLfgHngMhleTwpCpulW7OAP8nwT4HnToThCPnKYNNV4YinoXCsC/Hfq90r1IiE5OslTXl4vXzGMFw21NxUHmeJMoMkQRUM0dPfqqO+x3fCRBgiikuIPsshy2h1xf38L15SZaARXFZNA93CfYLFHUlIiajVR1q030TRvriQHn8JMwjx5BMDmFsOKgQ4kxddRM0afCIB5OFP3w/mM3JIBO/He+WXLG8lGtjmF/rYZRAaNzQSVRCUkUbccZpkqHSihiNoMdWc+FUVwJwq0OygUTU3vG4I6UFCWGJtjnRkJvs4ubf94AGQUUVPMjGZpYqvZraAN79++D5TpcdO4Sv9uxts1fU1qMnB0cJ0q5pIaTDghnmrrCmu+vUQPMg07SHTSAwXwGyWXMCZfOF6CKDxpBrP/fvYdCC9AzUw5DczNMVIsuik4JnuNiemIfPMdDreLCBdknllTKr16jco0qSBmEcwA5ecU+1+I5SDJLyAexysvEbDl+UwFNIbciJEaIUSVkCnkBVYmC3MNWFGAr7uFOcxV+3MPNpb+x2m6i2Wyia8YILaDklrkgoC/rhNazyr+0PblONjmfi0VYkLng92m4FYaQzdqxQX/W1G/NU2fleRIAZEqExRQg2UGwHngAACAASURBVEsZIny3oZ0KdGcbSUZt0E50uthE8SLlHIZyjdpWXMt/Y0O2kZqTL3mvei6lU0H5qwjRK7tG7RbRlzyY1UuUIKHWCMnrMuhilNY+ECqlaBh0Q5+fQbQXZB5U9NJ0d9LZ0OeizElcJ/LPNlgv6mxlHQHlPEBaUxoRrxEALKKvNBnEopB0JORzmqb4h7dr+42iCuO/ue9ud7tlewELWJJ6aQxGC4qX6IMPRkQCBBMSnvwHND4ZfZboC8b44qs++AfIiyRyUREVjMEUGxIwIGXTWqBd2t3t7OzMzsV83zlndnYhgmI8L33ozuWcOXPmfN/3u5gp/0CqN6oMBx1I6qoEzVJiBsqrkDMLdAHJt+FFSdp90E0rq4PsoqiEJFhsgTokB4W5sUmX75EopU+9yxPJUgn6z9uFroiqvFJEpHtokRiKkxOUhUS+g6YON3RhjBSwefoRLP52BW2vg7whFoTutOkKyRBrp+b6GCrkEBvCF5a5toaBVsvjQS+rCdYnrCOFUsWiYAheUSeJ4eQs5oDUvTYaax5nIovFPEKyU0kIBWDDDT0sLcyhvvQnKoVB8mNJz6vfYYP4XzfeiCrvfBrzTgfHj5/A4Y8O4+ezZ4UIYwaxoZ5JY3UV1atzOPLlEUxOTbEn/OSDW/h/VJk+eew4vv/mW6E+DrKH+xX1eg3l0QqDUP/uo0vX2/7kNENiCD7OVi0UjK7cwszMDLZNPwvTKqaJphdefB5ffP4Zq53THJ6rXsa5c79gbPM4giSG22yyx/6FC7OoVquYm5vD8vIyvzwHDx7EO++9y/BcTfZPZVenHp3CqTOnWZ2ducqWxTCu6nwVLznPIYn+ZfCkxhzA1q1PYOvj23H+/DmeR5Q/449GnMO+3W9g7/4D+O7UMXx97CtcuXJJQGGjDtsstv02V5GXF2/g7TffwomTr+HQh4ewZWKCxRApcXbg9QP49ONP0Fi5JTKciJCDg3ityardZINk2Xm2vSRersQZCO68FFo6++MP2LFjG+y8jfc/OIRdu3ZKwRyN76dWW+K+EBRKLUJgqoSFPXt34ZWdL7OtDC1k1ChZRIkNosMIXlQs4ZBi1hupdgLu6Q1Iui7N4j4yxxEsj4VTDAuD5XUYGqrgejIvNwkxLF3M/YLtsB1N5LowSj4iWtxzBquyChScAc0U1lYmZX4JekejxJwywWNkeBxXwSyuxtPcMx1KKNoMX25FIRoFC5Wnn2Jx0cbsDLR2yBB9BsZkAl1ea3WD5zT159RPFzEyWMH0Y5MoOQV0vDU4dA2i4jAnU2MoHlXYDKMr4Epe0bwxoM2A50HzWkCzAZQGAaIfaAL+SrZPaesXjvqHc/x2UR3xEU0B49RXsv4JQ7jLNZw5ehSlYhnP7NkHhpqY3SefKMrQ/xzTafKZ0Ga7vrCA+rWrWIuBYctBUbMRO3nEJF4befAbS4jqqwhWPcStCDoJK9GHoGjDsQaQdGzWBiCnC65ghRrTxQSJVthYAYLrSy3QE9TjEAtwUeyYKFs2hnLkB5xDx23L2pRQMKeKD23f2r7LuhqhqcHTPASs7e+jwltbg98pJzIZzloyHRRgYECzUEgcFKI8DD0PXXe41hVbeYZXt0hMLPFxNW5gNriB33ELNZYRBjtfQGmeSIFU+uZlIceWclU1he6DFbFkLnzEOHl6li1B9+99FaNjZd4wk7UWbbAJqaIFAaJWE83FDgLfR2n9RjgjY0BuQDjjSPsoRrVYeopqVBut7BzMbgzv1PrFxPrFxu6/3a5VcD/tbpvs7CaZuaqST8re/OwhfWc6pmp3S6BYGYgxQ2KlsJpApgjKFVcNY4PFTsnlhD3TdanQTe5KUiSQxNcCP0LgBoi5sG3hZm0V15dXsNIKGTXiKVqJpkuGO9jGmfnRmb4SL9qnxMCG9bAeehjYNIGaCbS1CIGppba5rJSdIPU/5wqacW+JEbXxVmPAAl2GSKT2jxojskiPINSxaWwYIwMFxKEnkidxyAGT22gywtLOIAbS42XAa3CgqTOqlAJ6SngMlwcxuWkcAyYJaRKMPJCCgTFq88u4dP5iCuEXe9OuUnEsFWADEt0r5TE8sRFWscA0opxJ1cY2DEuQCjoMZ09SCz8R1Nt9VJK4B+pMRSCFBlBq8ukvI3VOrcf+L+0zVzFFgk9Pkw5xqkKfva4uPe8FHF+4S5CAX+QLb3sS5BvMlfHA8DpsGBrGaGUUJbuIHGxOgNoQIpOW1J9STe0mRElTJIgkroaRX3wH0n2K/Pq1vqoFFydTynFWol5cxeInKAWeMYCyOYDITDAxvp6/kfXxSbhtF0srNVxevIY/bs6j6XqI/UDgCIxYFJ24mOOzUxkFkUSdgUwypLaAiZgEWg8ioHemKmV5ClbZCrDl9cRiQUfw7xX6Qok8CmS50fP8hD5E7/pEz9ywrLTwnK2M07kpsa7mDgevdE4J4YeMtzgZIO0T1bxQxygHOeUM0C8SSDEp/UbpR1B8SokARhdI4Uc1X8V4SUttmlNMv+iOlYL+Kxi+oCSEbJ9IVAJKdHL/MvGtuE9CHotCNQflhkTT2BbTbmhNom8YVfmzQpn0t1t0VsL94j6F1bNITFD/iYKhjhW1BxtBEOAvAAAA//+kXW1vFFUUfu7MzsvuttttKSLFWkuLaWhiooKJEGNMisFgIhh/gYn8Dj/jX8CPKnyADxQjUWNMqkhi8IMIKksjFfpCWcp2u93dme7OmHPOvbuz3b5EbTPNdrM7L3fmnntenvM89isfvvGxZKl0Vop6dHgwBT4XRZqt35abS4NEhCOtSr3JZOisXqw1QDlzktTutNpECaaPwjCkx2iz+AuMXLV0PFVrkFQLciLoA/NwJfgBIBfeYFIbGch6ELJRJUOxwTJeG5xFTLkeSKJ/ZfYRqsur7DBTJtXWOdMWN6HmRXUIxuIq9Djgrh7WyqTKHxlAS2423QyrIwEQ6QCk3YBEhoIWqJBgGI0I6zW58RRA9fSmmXHcVMCIfKMaNeHn8nhmZJz72mUn4lkprWe7089WeefOnx2cBf4jle56eQ2fnDvH0O1C4Z7IWVi2Zo6NW8VCS98jo2W5+PgxhoeHcezYcd5nNpvlZ+jK9LRIh3CrSYhjb76O0UPj2lxbaPnAyXPh9oMY2YyPS5cuo/hkjfvxaeITAz0ZmBMnTsL3PTZKVsrDYG8Pvrx6BU+fljgYW1p+hK+uXcPnFy7ii4sXcP78p5ievoIbN35iuPrS0hLK5TJvN2/exJGjRzA2Ps69UASZ5OptrPBgbg4/zsxIvc0SWGXYjBHECu+8ewa+a3ER6v8QLVNQsLhQxA8z11lYQEXSB5xxe9A/+BxOv/8B3j19Cu+dOY2Dh8awsLCAUqmEIBDtVwLiKiYiiHHrzi2+nqmpKV4wHdvDnnw/Zr6/gULhLnPXUcAgIQFTOLKBI0gZryd8jxu8IDJFplY4enFiAm9PneTrp/aK27d/w/z8PEP3MhkfZz86i8nJwxp+HndtND7UK5XL9XLwT8kLO2W4RyIm2ROrq/SSmXxed3fG24SVUeLYaDnc4lREKC4s435hFvP354TMjckPxTFmoiVLZI+sdFay7WwPQw6uLN8Gci7itA8rk2M27ChFW4orT02dAOQZS44NMfbyii9ELtSbyoRJrIxAdiCHZj1AcXERDlcMFJ9/h8oU205xIon2ZG72AfL5HlawEN3jQHpHjS21hZdF6eQr20Sy4VqTmQMxS3FFkM6P5SIgn++A7W+GWG4qIXQ5yruaH4OW0LB/0qxtNrCxsoqluwX8/O3XCNYrmJh8CVZfXutng6t1xgbudIid+ne3PN/uT3TujwmeUtLrv15B6d4fWH/wEFG1wnBFx/dRD+sIKiXUSkXUiksIy2VE1QDRRhNetg9N6oFNp5HK9MFWLopPSrjz613cufcn85DIeEtFUpAjej5o02+IGokis9/10Wu78JUL1/IQN1r0R7z2UIWK5mtDRQiiOvejWtgAMXxkYKEfLvrhoA8e8nAwiAwG4KEfGWRj4mnJwYrTiOGioVJoeC6qHjCvKvi9toBbwTIKWMFjhKjpdTHW5Kbbwe7Nqq10koBcbS9SnNx0IYmC2cLfcJwIoyP74Xs2Jz/JJ/FcF65jc8WYqse19QqrKtDxXEqoGVULTTZMSTKpGMZbVgh3SwBsfvffhv/de928B9X5fteg7XLErs9vcz2mjS2pUkTzX5MA8nr5n1oBpB+ZzKlN/FDlddRXVxFRoEi+UcuP0H3YiWIOHS/WSCuDQGXitEgCQW4TDIGw1kRQI9WlBp6UqnhaCVpklXWuVlu6a17x/IEmXKVf4vep07qsfFj79sM7PInmyDBq+TzWUhZXuZtWrB3yhC0xhSYlM0klAovO0e4cfwoemNuGKoqOVsjS6K+OjWxz3ICHEC+PHMDxsRHsdzOcBCMiPsp7L/71EN9Nf4PySkWE+pQo+jeJi4teUdDSm4WdH0Dcn4eVdlFdLWJ83x6cfO1VjA7kkSEyzrDMhTUvVrh9/Rdc/uwqVteMxpJelxK+OJ0vJQv3HhzG0VNvITOURxUhNkim1OQKNLReqe2TRFI4NMMpX2TkguYI4wpsJLxeBppMQU8SwctxCBLk4gkdfK5sx+1+dCZG0ypjoiAkBMeEPiS7SIaFGuX2ZAYw8uzzmDgwhsNDoxjK7cUeuw9pUPLThc/kpxL8i8dh/I4uEchN83Pz/3p+xAl7t80sUtpXt1pILlndqb3AZY0wi5VU+qwMcm4Og7k8Xhgawd78ILJOGlE9QLBeZ9+PnCrmteKxsjn4o7FJOY5GJBjJTdU6eNsOdp+XGV86P4MAMEFoGNQFCU7POxV4zNzW85sSWJHmJRJyPKvjWPQdQqA6LSh9G1HCgSz34tc7EieO7mFnm2WJvLo5firBA2DICs31RQYJEWsku20ziTxL4ZO6wUbIr02ygGX5NHElIyZ03GqY+DcPWLLV3cSyZt1hDpMt7Ac/t7qFQ6SmQy1V2U5omaSJiS2TtkgSuQbN0FkopxYEh2X5hZSQXsu8k0J8HMf4BwAA///MXW1rHFUUfuZlszszmzQbm5q+BUukNEEFbdWiYCm2CIIi7Rc/K5aiFP9D/Q2Kv6Ef1Ip+sCC2RUxFtI22UFqtUZKYTbNJNtnd2d07c0fOuffOzmY3LUUC3uXCJtkNO7N37pxznuc8j00oHVXWqepIz8mKKtKqikqQQQkMGGsW+lKpf93YBULTtQz1P/V41D6u5kOZqk5/mkb/kfaoSuUkwL0LJJBANhcUJIpeGTbeYIh6osUDA99P/+YHBeQLLqSTIPISBGMjeGLqSbjeAPt2GvVTpCGUrfq6iQWQALWmQJvESxLBiuQyUYuU/M1J3TOOe/s0LNtY3qrNktoQ3JzNLQBB4MFzc6y+vlqpMP060sqSubzLiaxNdM+FvzkINp+rR5h3O0ccI1xdw4fnzuGj8+e5okjWdwPaVoKr5Vo0ilBlmqxbbqqcORdLyysZykKCo0df0HQafgWjU19c/BxhWOOKWYem2O+4LLbu8wby+iUx5yt06mdmbuDmbzdVlUuvzcGdJbzy6nGFDEAypYqS+7XKEir3y1wdN20uppKtWllU79GFCxe0KqmuVBIlPmfj5MkTSmASmoXMF3uEH65N497sn2gJyQWH/zQS4NRbb6M0vAtCqMS85PloiSru/P4LbtyahrdjAPsm9uK9s2fw2cWv8c6Z9+ENDiJKWpxAUwJPwnzUy/7rzzN48/U3UF5YSnsyz777AQpOkZE7kbPYq5QeMYm6WELbCVLiH8HjbrYYnqVaxakIOzV1iGtEtGcQav/Jx59ievpHXL3yPS5/dxWnTp/SjhiOUmK2ZNdkO0BHiY6KiNzBW6zobdlCTStWivZbIr3yIfPBOahIIv5+qfgQ+IFKjpOMWJ5UTiaJ1gEgv37RaCBqN9LjyFaB02DPLGFrUytA5vcJOw3EXHwhymrTtbGSTyD27MTQkeeRn3wG9fwgQkIuKJDRlHkOFhJ9Lpk0CizHwFdXruGn23+gRjRKprP1BvTZm4c0rhZ0swtD1nlorVeBRh3cX9NnP9uOYc4PoVS83uohmotlVGf/wsb8AsKVChqrKyxgZc6xtLafAfWgEUcCjY0amut1OGRF1I4g1tewtjiH2tI8mvfn0V4pQ9TXIYVCAq1CAXbgA8Ui5ECAMAGWN6q4O3sP84sLmzxV1DDrxAxal/R9VyAxT8r9rQrK7SpqVCjL5+C4eWUpqwNXVfoiBlxM3B4UE4lRJ4cxp4DH4WLM9rALAUZtH6PWDgw7w/CtYbik+58MQaAIgSEIy0fTKWDDTbDg1nE7KeN6NIcZLGEeLTRZSVl9vpxOYLKtDNmpgX+evKeQO4ElWYDQ07+jotaX31zGpW8vYXHxH9ZWiSTdDR04uQB5f5CDRrI3bNcrWJu7g5W7t9BcmAXWV1nQ0nJUD6ehQmb1jR42tkr4/m8ju6d0rZs+TJt0IlMQYGFlQxd+9OvdsroR0u5hay95qyuA5nu/VolndN1RrA3SRiFhXndAsaSopcrxPESug7qQqDbbWF5vMCOTlAGEnUtdkCQXpWMuOrAahi6ShVKg5lqIdo/BOTSFeHwcVT9ARTZRo4KYJTv6REn3PSYbZ8V9dKyA3sR+80j3qnTPUg5TiqUgUQoC7B0dYbs+13Dd6B4UW4jqbbTCpgbIMmBamrhJLQ4oubhIsZmbSEyM78f+3aMMVHH0KtvMJCMRuVvX76BSBvy8wnZkijerweLmzHAFxg9OoLhzBG06Qa7NiRajurEqqnGs53SQ+s0ofLpGbKuTPGk7QcUC6QgDCk3j7l6yJpnKJo0Zgd8+1yglgG2tRdAii0QjSEjaWvkAT09M4qWnDuPlA0dwsLQPe5wSHsMQJ/4+I/853eqo2gVU8t4bY5gHDBtDC+fa6c96ksp8YmcKAPLRZmJr5qOrpwMyiiR2Vskq4tldUzg2+SJee+44Thw+honRA3BbNvs3koOBYDG6Qkqb7zeyvfA961cL2BnAdfP5JtcDXheO05X8QueAnldgYJRBV2aAWhmPfLUnUNxFeR27uWX+hxHLY2DVUdaP9LpIT3puQI2tWgBszRgQ3DLupgC0o0HkMGyothRj0ceMBnXMhgmw1TkzOhx8rDpHzSbhnMRrRH+zhSHHlVpfwFjz0XvpWBsh8ZrUdWOo/ophQ634Sryw07LfcVBgserMeaD3Gg0A5QCgchx6zsUS18G/AAAA//+0XWtrHFUYfmZ2ZnY3m80mMd0Uu7Q1lTRV0mJBLBQ/KG2xXxT/gkJ/gCD4RUGU6h9Q/0BBkfoHpOCHSrGxUCzSSgrVRnrR5rLu7O7sZS7yvOecmdlsGlHslCGbzXZn5syZc877vs/Fzr5MnwwrMAVHsiyyS0VdwUBM1iPWsLFOt6MsCezMg9FwJvInljkCaO5FFKcNkO98yldSTdRyzNxnzW46hng/5gYDc9GGoiBeoWGUKlFC8zIYlA3jgQhsFWeLmDk4j9r+OmJ2Cq0aayETrYu1LiuXni16LQ+YMHGVD32oIECEqvmtLrqs8ugGh5lA9AMsA1EhkQU/9RRo0VZ2bUyUS7IAp5ctBT4GfSVWw8yx5xUw6RXQa23g3tptIA6euAyglWS7wtT18eEH7+PLCxek+kyEgid+qJESwUIystN/vKA5nlwEEpo0P7dH4/Qi4dc1Gg1UpyqC5qVYVHcQ4ttL3wn0PjGQacvAokKdggnVngyxsbmOpt8kjTodgokyox3g1ZWrCLpdDMXKJYJXq+HUa2dRojgHFOc0Soaax2WnwRShuYS1Fw0FRnMQA7+jFF5N5pk3LgaOHX8Bi0uHYf5k+np7axPnP/5IOFu0cYkes0Azatj02eU+tDLhncgEjRZwZHkBZ06fEUgvexudFFgh32w+xJ27q4ISIfKAnOPG/jmc//QTfPbF51hYelaqcS6RLbpa1m93sPrzTbz5+hvYeLQu9/fsmVdQn5sXmJhiEJuAQ3UEYg5YN2Sf3Ts/j1OnX8W7772Dry9+hctXLuPtc2/pz6qJcXpmCktLi1g++jyWl5/TcGb25lBTO0YnUlpFwvjzW7FGlGT/xlttp9f/fXMtF16ljGkuwqZrY98zsrBhAMEJYtCFRW6yePzCqFsqYI6l3ABSCpMsUgpKGd5WFXfRCkgnD5VEEBcKztuehWbRxrCxF42XT2Ji4RA6XgWd2DK1tlSgEBrSxnbllHHPj3Hp+xXcunsfQeIgIX2DVVtLKdNLQtPK+qqyzNF2rWEkcOp+uyuWawh68rxa2k3A7OMDxmhwuutnt40vaoxRiyzy/R32U78F/8F9bP2+Bv/hHwh9H8UIGLRbenWqjsOxpfCEBsMsEBgPbKSmwCRwuwN//RFCQnSJ2vA8VGxL7P0GzS3RiShEEYqszHslOKUK7IlJdIQEWkZsu/D9ADdu3MLKlWu4vXpbY29G226kLbVlUqwrn00kuBP+hV/7Tdzv+yLnlxSVojvhp/RQNtUkR2r4McgwpajfjF3GFMqYSSYxjRpq1gwq9hQcTMBCGXHCvuNhaDkIXKDjAq1ijNXeOq5vreHH1h3cjNbxiDxVhi0a9m+bk91W2M5vlk5kEd3iRgQvJhK4OIJqgFY9B9o+8M3Fy/hh5SdsbrRkQR90+xj0Q5l1XKcslTp6zcetNpr31vBw9Rc0137DYONPOKRB0aWBVnJcB/C19Ofd+vT2xf7/vY2GCNnizRrpb/mg8XHb2N+SnQOo/O+JDvih91hbOls5de9/2mQ+2SHQk0uwMl74SKvqRACTMkmOysnAljQNOqMQ7up6JdiOJ7Qsi32vH6EVJFj3AzzY8gX2H7KnWEVBiiSZnMHYuQxtoMPj1efhHjoIZ2E/+rNT6JYc9LhW9cadm7ALpSiKd7Ca3rYJrdF1ZOfrkaSCJGBs/ZPrpyHqlRIatUlx3KCqSypypoOWYW8oNEPlKJMlK3Itq3APnEfDLsqFBAfqT2FPqQor7stax7MLKLseBn4P16/dUKcSAcEwd99y7Ub+f9+JMLevjkLVBSh6jUiq6mYtn2jbsvx9zlf+0/e2BZcirJbEurKPEag1/59yhFAnZmueuglqXM11Npu8R2E+y5HrEZ52ZIlKfET6XERqW4JqoYrD+xZx8tgJHH36COrFWSGaVpkSpTI6CyQitGulVE/VZ41g4fhYkH+Kdxsn/q346E5jj/kOczzGRGVStODKdex1ZrA4+wxePHAUZ186hROLx1HtleAFNrzIFvHCLkVnCRdP7DQmyW/ZPRt93yR0FOJifHxggC7uQ7pfEAke6uKvxIkFFfSPwP61wCbf6wU9+d7JyqSy+dQij+Y5UIGqKsbx/I0eADSFhJ8bavh8pIvWfE4jfXwWio37XKQLe4pOoITwGEeac5O412ESXSUNeB2CVtkm2pc6UeT6tjlvg7BI20fTX1QiWgsypwG6sq831Xg+B/ydxaj89ZsY3QT05n6YnykN3lZOBMb2TzkF6DVDrKg4QUCRbq3ZECf4GwAA//98XdtrHFUY/52Z2Z2Z7HaTtFWbLEHbxjbWqqBFRK2UIvRB8UmKDyr6R/giXgoWpIjPIopIEaQiKuKLD1aQgvWlomi9pdaktaVN2rS72Ut2Lke+y5mdjdWWCd1smp3LOd853/f9Lv69zz10iHyKwzDiRIitNFJRIqpoZY6sFphX55J0rdSwCF8gqzlNTPq+VxJMt6oOKVVC2dRXq6GqQRJtIGc4n/A5tCJCVQ7fL05QKmAOsqKdRH2YuT4A+VwPcRQLlCjPCpsRPxCZIa4aZaLaLSeY8oSv18dxbXkFV85cRJA4AcFct2JWa3taJ82AWiVALYoQEs8rE+skGEEKUCVzfGJCxMR4Hg2rlkZxU1YTK49tbjKmJXS7HU4WwzjG+MS4VLSI31EV70lSBQ03N7CxOQU/qDEX00HP1idM/59A3SjcyDkVUFqjC5WoyeH9t97G4dcOc/IcqJBTlmTMSws1pcv46i3G6LoJGUITSRX0ib/78kuvYEtzSj7Q9xjZcOzoUSwtXeFP9cMYy1evIhlkePChR1CLYoGgc+KfALYL2AFWr1/FDz9+j9ePHMG3J7+HSlAIt8dI0/J6q4WDB5/i8cwTeZBgQ72BLz77nBXnhyHMKszb4019xNy1VDoiAMbDOua278ChV1/Btq3bRZ2XFwq5BvJTb05N45PPPmJ/U7DYRog06eHc3+fQ6fVx3549CMdivhcWo51oq10M6mYsrrbw1YnjOPbpx/joi08QNWqY2tLUKiWw++7deO/dd7GaDnghT3ODziBBc2YaBw4cYFtJmoeeWMhi9z134YknHseZ+TNYOLvIiWKgHu+UPqxebWHf3kcwu32WDbpp9n3z9XFOcMnjtkr2NpUQO3bcjv0HHsWzzz+NI2++gRdefhEHn30GDz+6H7NzuzA9Pa14GZlXVgVPuLOt2E9Bbrm/uY4UMxxxxnHoRJEfI+9DUwHtMpmy40Je+nojcsEQx3NjKIn7DJ/h5wRlWzjzJxbn55F0exw/1hKygxHRIBrjfao4Bx4qoc/3m7zeB1hDGhrksQc7FiKrxvDCOizTqDyGmNG45toXcQJD2eAG1Ui4YkFFvd6tUDxo0bI51kwm3TAbcN0r73UYYuurrRwBAtkOJ88LKDyN7XY3x9m/FjnuNSY2smgm2TvSa1lUHEVL7FdpM54xD99jFeSElOMziwopQ7N6oBEEBCsIp4qWUSSxqxJaJ9A4evdN6Uk53WXPDmMNF4QTy4m8yRNJ/i9cwKWz81hePAczSHD29DxuvmUKm5pTmNx6qxRRIHQVV9jNzX8//2GicePDCjdNY6URrr11gEyopZ/ReyyddBCn7tJlXPzlVwyWllAh7vSgw9cV1uvcweTusyVHlA3cuUY0hoQKP0QN8SpYXe3ijx9/x8kvnFRsOAAAIABJREFUT+Cv0wtMYRLQfq5wZq2raZHSUx0J3ugUsVtiCHkTk9t3I4wReRR7hSvLoqyM3qH5bxFbH3VK8W2ESh6iZhqI7ARq3iSsGUMlHoelzTP565MtZy1GGvlYi3Ms+x0sZMv4obuA33KyD2xjBcOOvvuTlbuhioj1uIwr4zPVb1dJ+JLHvnBy3ZbU6mwPtFjbT4Bz589zwXiSEqU4EmQiaS2QsCVbdMocJakKEoxMOh1kqy1UctrgGXRbK+i3W/I7A6/YhHllipxVAUquYmXSGeZnIcKeTNVRxfRRQO//7/DXx7uR2GcdDYm0Qtw4FOIGpyPGKxJq62DtpcPtT4pYZjB6rjpRR/5dJOpm2KDgLhohE6vSo7SO0+zr/yldLxcSZd6wXpR1G32KUT0MVq4haa/CJgOGsjtY/Qgyyrj7nkkR1Qi1jXQB+mR9RiOARLPaA1xbSXDpchtL19pop4wPwxqMjiWxynPpUsaW0lUuDPStRc/30RvfhPrOOYRz29CdqGOlatCrlOZ92eq6rDGl5+mg8Z5SFcw6J5X1DULr0LKuW68Ccfweb1Z8ud80L9fa2NO8CQ/cNoOZDXXETFtJYEkNP83wy6mfcPzz4zCpFG+5uUbJkUfrhgfEVfiTY6hubmAQ+/CrRAlK8eT+fZjdvBlxlrPTCHopYj/Az9+dwgfvfIisD0awBsUaLE+JntFanqPnA+MzE7j/sb3YNDeDVtblYUZWdJ4Ge1oHqPlAe3vxFNfidMn+mxXKlQueMZJuuO4qJ1jWbwfRpicfUDc50PGsluRqgegSqCQVhXnWFyH0sVfVbnHGFN+8n8D2E2ysNnBncxfumNqJHVtmcUswiRoidjiJuP2jiAJFw+RFjC3vWWyxw3CU25FZbEdmx/Aw+nOOeVOMtdHDmvX8AK/8ohhfxlEiSyhrQVJ5TJ0KGBlQQSPYgNtv3opbNzVhOwNc77bkHluhU6xRwaNYjXV9MZ6OU09pHR7HJDpYHBaqo2KNW5Q4T2IOehSzZgflcuxVX9ZIsEKNLVz5S/OfaXykUaO6LJxnunhYcgqQwkJeoHP/FV9zER51uSFpjVDRgc6V9jdEd7XaSKZbTWM18KQ5THs7titnISf5fa6oRYk0FZzI/pqbO6X4VcTQkj29jHehsbhuPs0FykPoNRUcRHdBGscirqgxnqkVspJSDtHvUZQrQ/ZHC4+UyxaIe7Xzc3PPKfw7dwJnkUio/YJ6xXb9A6Rpgn9ou5bfqKow/ruveXQ6tPTBdEqRUjAmAjVGNBpRgmFj2BkWmmDcmejWxPg/yMoNLMSF6B+gCyM2MSEuWBQiCQEphZbSJghlOqWv2zv3zjnm+8537txOyyNB7mo67Z07vfc8vsfv4TelmuuLcAEL+8F0l9jKo9lIuWGJWErZKoySRD5OjBic5WJkg6082ze0bAes7aAWwQae1J6x9LACVVaI0PNaljVZ3oWFsvgZtUZIIcD+LUOMPJ26EVhOuhGKMAMtcZrwuvLYeXAE98dvIb5b525EurgLZMfjAEZx9XkhStDVUMjTwxXvdJooSaw4qCM4u9lMLJTFE+SCFQTUbL1CgUjR91DIBSiXiuzPvDBfR3WgygWRvNwLCpTIlrR2bxbx6iPk8n3c/XghB8OKJQxTCtM3J3Hq1LfMPyeEjMOLsJKkXwTQKZBjGFfAA7ZQ6mRqSLlcRmdXNz4++SlG9x8w3QaYTjtUjOGXhvDPjQkOCFkIxnVw5vT3uHz5Co4f/xDlcgeajTWsLy3g3twspu7MYHJqGndn6yalExEb64tvj+vXbrBDASXGcWQqg9v7evDB0aO4PXVrk8UWcdW5BKA1Kr0VjI6O4qMTJ3D48PsY2DmAznIH2+cg8IX7ptPA7dixo3j94GsYv/S3EVdPzPUo2Dx75jRmpqbx1Tdf82cSZYEQ2bQhr2mzAV+7OYHvzp7F2J9jqM3cAlZWeP0/98M5XL18FUOVAX7Se/ftxpEj72Hs/Hk+z47QxfoiEuL7l4rGI88W41SMwZ2D+PHnn/DF519i7PcxpqlQEkhmGUSL2btnOFW6PPnZJ7gxeZ0XibcOHeIOfqVSwbbeHrgEFQysMoAFXLYW+aerwj0PjHYraOn/25VLJEinhJwcH4yNSsKBHKEDbMdBiZOoJouHqAFEBkrlCURQW9QQbGJpdouWranLooBKChmeJJdsTSUwVO74uSZGpCB2Oeeic6iKTu0g1AnWpm/DJREj8WxnBAAnpUoqLYpLZrU14LcLVxAmCd7c/zKqPduwFK6gmPe4s+YhFSUwAQwltXTh2NDAiMNLE77AGh3dcAqmYEHVKCVdAV7n04BZ8fh32zqQdp5qqyOKbHYuiIqEzo2hoxWE9XkszN3B6sN5trMihFEUNti/ngRIQe4LTP1xn5Z3Pd/xmCHLSzo9z0aI+twMf8+SY3QeCDBEbgodjSa8Am3KDheBlkPyFifb0A5D12gCi4t1TFyfxPhfl3B7YhpxIzLjIHsttAkcWhpJJgiiXZCMOWfRQCmpIbfiwy1W0OcVEeQDFFGEpsCDi1zUVVWMpsg5OfgBAUmL8BoBnKDEV6OSuJv3oLzIBHWIsRxE+Le5hulwHlPri7iJGh4iQk0EcgMp2SlpI2ZHAAc3rrFlUySQ5RirX9dCwAltmFJazDk6E/7a9Pbe/Qi//vIHv/fuO2/wfkkBFc817TMwxOyXpPGTQMUhi1WF9Rr6d+3iwGx1cYmDVArocp1ldmDQpMHhSyfecGHgZO4+PdcXKTDpclHWKLj7tNZQgdlVpujoeEY9SJs1YqOrwebu4LMemyCtmYS2HcKbfW+rn02DR5l2Mr9uGtVv2geVFgu2NitRgbVK3p1qXHAC55MwaoGtm5X2sBppzMw9wIP6Kif/JulnnXyWm1TW718+mkZ6SGJZrot1z8F6qYTtrx5AMDKCtXIJdSrYeoJGsOgPRxKOLcR6HN2yQrX3Zat7lH0q7TQAJ3MdOdH48WuFnlIRu/u3Y7Cri7v8lJYFnsMEHoQNtjqkZotrS1Wy1xD6KdEeF0F5Q6eyiA4ZRTXU34NqN/HZXd6bmutNltFJ5pcwfuEiVh5pQUxIYu2k8qvmuxtXYezYO4je4QoivQ4v57KgrKtaDgkOo0A37sVeBjJtVchN3O0yMohjb6YCOimaIO1uZtADG0TapCkIcZigWNpqbTUbYjuoJTeh6mOkGeq/o6cX+6p7MFCuouSXmN/vpq0ESeb1FgoxUoxqNc/cjWta+wl2XuqtYpUnH88ydbUUEx532G/p229KosVOAa/0DaP37S70z1Zw8dolhronhIiwIrocKrbEH1OxdkFZJE3TlQ7czTRC21E2qvJJqpbPsVPGAUpnXCza54vVCGDLYipKaJ0KP6b5o3Dx08+T162xItdKkIr7GbvD1liyLnS+6E4kccuaz/7e6KEYGhKNSwP9NxQAe2TpBU+ihtnChYXs0/2xP2cpPFYPwVozW6g/JfBW2I/+PxL+y645qd288Pqzz87OJaJdcF5OjQkRIyQdCNJfs4KJbKUf5PAfAAAA//+8XdtvFFUY/82Znb1v6ZZtuS0iKCiGBtMQg8YIjxh4MfHFFxPj31MRw/9AjInG+oAKwRDxgUowGozR0lJupetu793ZnZ3ZM+b7zmWn3QIaiPOybXa73T1zLt/ld0kRzDwK6UZ1rIUH8z2s0qBCBEQ6waeuqoHtcCWOBK0SweDmK0ok/uz3nRhIY/PA0Aq3Z5+V3ADs69HjTCSf4y5vGG+AaJiBZi0AGF5Eihc/K5Lq9yAhlXYM7Ny/FzsPVDG30ETXbzFfKuLA2rEMKY6PJVBvS5SDEIOZLLK0WPSOQO+7srzC/PKUN6gE8swY8kTWVTYnUigH8o1OAwPFmAN1srZZ+LuOv+drKOSrcHJ55dtIFg6Og9X5Ghbu3UdxaL8JDdUB6/QSjOdz0YmYAYSPc+fPYebhI2RTKtBL6Q2JpnR1/4t49/RpjI4exa5dO1EuV6yPJ20iBGOhIkChMADBhHEVazDkGAJvv3MS335/hTl7Uk9oWqQ3Jifx8/XrHGdzPivVpu15DlqhCgLIuoW6k66G3ahLjQNN9ImJCS4A0ATne53O4o3jb+HChc+x6K/ajVcptEcMPzp79izOnDmDyq4dFu7PR4GI0QkDxB1amDmdNLNGMbKlPM5/eg6nTp3CwprPVW5VLIsRtpq4+PVX+OnHa3jptcMYPTaG6gt7sWfPHtyZnsE3X3yJ2dtTCNaWmaOFts/IEeqIho0mLl+8hI8/+hApfRh98N77uHb5B9WFJi5TFKP2cA5tvwW3UtHdPlcLt3mcJJaKWYyPj2PixAR+ufkrI03GXj/KY3PwyKuqCpEWKA1tw/hnnyjVZlZmUckkix6mlH9oJEJ7FD5NWO3/vZ6tIKB8cpVPbWV4mOftfRrLWBEi7eaqv3LYDpANcwAFZpLEyCyzhQMr19FdM+KvQvHW+KASyhbHqtc7ySqy8XjuBZv0HAWrfjEFtzqCjDyEtShE+8Ec3HYTWQbCavpArDrE+rbx3VkJge+u3kK9XsPJN8ewu1Ji5fUgDtnHnXy6PRLpIpibo8s7UaCcC0h8NOrwvM/IFlKlItxCCdDoBaaG0DzvwvJ51WNyDxI6+JfJwdalf8mUA3DQFqG50oDfmMdq7RGWazV0/YBpRm0psUbaJ7R/kt8x/Vzctqlb8mz33yaeety7fbBqQwejqDtgXPqj6SnMz95GWkikczm01tfQWCU/sgAjmTIKnuQuFiUqLvPyc+hIF+t+G7X5Bfz5+xRuTN7A9B93GctvOi9ENQofF2BucRlsyzKAGSKBhHVWsBbZCobTBZREDk5bKOcBQjc5UtPnMhCEkBJpxMRo8tKI6WzOCLj5LLG+0Io6WJTruNdawnSngalgCXPwsYQufC22JtATybWhUrwxeSQGM6MUvCwypUHkqVvT9oHmikaS6YRIXzYZ0Y9uSsCNJGYf+Lhy6Tq7+hwbO4KBkotuHLGqNR/nhMxxlM0rVVkYRhqEaNy5j1xxAF2/ibXVFjAiGSaMwTxi2s/pZBNCIw2l7dYKO+zP61ztvzg2oGSfbrrsYr1eh+j6yBdzcEoFRmNA6KJhLC0agI/ovi34+XzOZIC7dfIvdc1AaGcTHXBTkB2RXV+b17YbStPk7aMqCCMIJ1I2eadaiNdVhXZfhphfbGJmroHZxiJD1Q172VDhuhoF0LFa7Jpfn3KxRHzichmV0VGkDx1Gs1BAU8tfMp9aqriJLVmdfucm/IedpfuUhCDevH6ZE8xkY5TyAtXh7dhGyDEW2FOic7QnBs0AK/UFRhd6Ngo1jbXevsDnPnVfowAicnFw3z7sHhlWa5I66ZHDEPD5mRncvDrJvQzTz5YGPeH06FsU40YpoHrwANKDJeb/U4KmVMPbfE+F3u9NV9Z0IT3Ps/PHdCNNrM2vdxT/m5plaU+5gpn8zlIfElOOO7GessulHMRQMCgxM7/Tuo9khxX+cyKNfK6IV/YeQLW8A9tpL6YiZwKFYf5XjI3z8t+2LR6rv/WEfXrj63pFpK3oPVu9/ZNWtvlWUsdlQqOp6BwYzgzhxMvHsXtoB67+Nolbd/9Ch+a90BbHHDskNSUcttqELrzw5zTWqkZPySSsTEfZaH3JjdnkmDpOwq1B2IQ+1qghFu4T6FPvt99NauFbw7dP6DmoudLz8jefg3IIgvFH2oM/1DZ7FqFiKepUeDAIA4M+V3PL0Aoitl/qL4aa3FXNf+U48litAF0sYdFCLVS4mfefpLWYcVN/q9Cadh5owWqDuknaIqv3NE34Lj9vKBK0fllsUYuTUq7K6JwwxD8AAAD//8xdXU9cVRRd537OFzhgKdBiW1q0xWqakNikxv4HY6Ppq8pf8cn42vgf+AFGksZIqzVNE4x9qUAtFIShDA4zMDBzP83e+5zLnbFqNK3xJrwwMHPm3HPP2XvttddyKJE3/u0iaqAVHF1RIiQ7MYOEMLW+G+XoDb6AABr5y1f/8xNgaAj09wQIsFIjof/s4+/0eJ0KzceoHybwXTtDRpi+wUqPTib0x16QSr4DCZ1lSXfWh2AmTwCGMGMB6MCVBL0HXYxdPIPtpaeIOkcSzZtNS9NeiKJHwWwzBfbCAPuxx84BZS00RJh0ECYMAJQrRbH3svtBgDRbcDR+20mYAVAu+qiUCqjvNVHf3sapsZOIyErRSWF7DlfsvCDCxqNHOHvlXU0vwksKTlKuxj1eXsL8/Dw/0Oxmw3QcB75XxGdffI73b36IyvAQEq2DYCjflMBarp77QFelEynTG2sQosdeu3Y9S3osbS2X0KKmz0+EUkz5qa9vYZK43CNnc+ChOAET2jjk6E+PdY3u3FnA5uavLBboulIdn5mZweTUBbQePmThN2NxFjOYcRY3bn7EgIVoEKRME7I4/Y54E/Bdj9kw9F1sog3F4o9/5epV3Lr1JT7+9BO0qTpM65rolBTYOi5ajV0sfreAxR8WSNZf+pjZXz/ixIv0ta1OFwNegYNBUjumzydhSFsjg9Tz/8GNG5ibm8NXt7/WzOsEjUZD+34KJUs2k1gE+ZjOGWF0fAyzs7P83Nnahi/WmyOL3FPViaoO/Pfi2RXHHdmwjRq/Zbwe/k+J/4u5eC+j5NnzmAEwqHUAuKIQZYxzGP3CNJS1pwiZ7SrCT5gdQIdJrKuZ7DNL1C1mAAgqnWohpDw9mneZHBigDMVMHfewJp4DVU5RPDWGQhhz0fxoqwaruw+HBAwhVqomIdArlgNmevwWf95B8/Aurr/zNqYvTKBcsBg4I/ksodArFhfigyxKda3J4mCvG7TRiQ7h7VcQDQzCG6jCKVVgUZsDHTRKs6mUIN9CH9R6B5p2mGb7cKKDDpqUEBYJNIUB6rV1NHdq6DR2uE/bJ2eVog/PLSE4CNHuRqJfQGcEaRPkK+Lq5ZmhJqYXnREV+Ykae9j6ZRnP1p6w8F/R97jXtHEYYG17n6vOByhjzC6hTGPzpauUqtJhYw/PajtYWV7F/Xv3sbZS4+KdCa8o+Wf68D/QYeO1Yotg3m8E7OAApbAu55Znw/UJBBiAGyUstEetJiwKRK0jqsTMBMuzGeRTYQfKt1EPD9CI29gJWlgP9vA4qOEpWqgh5HYlqqyGtDfGOoiE7kvOFCrk0t4dotzi2VAjoyiMT6BaHULUqCPaXEW6W2dg1dxTA2j09L6nksioOMLK8ha+uX0Pr1QGcOniOfgFm9c+O/FAni9iWiVWhLAbIiSwPYrYhcFLUnQOm9hPJPhyMQSb3C7Lfu4YtfTD+d/IS7KEZ6JZU1GM3fVNrP30AOfPn8PE9BScV0+wG0esnTjMfnHM332x4+yvbuerVtmY06RHe4lfZztB2QTjboeFUqlVyWLHozRjAZn3Vvrs5fucuvyaxW1jNg67+9jaaWLpyRYerW6gFeq2EZqi1KwRLcvGZ96x0GWgLDTpnUdGMHT5EgbfuoxGsYoWr8OU2S3caKMSrcEiIqqmgPVvLiv9i6TQzFn2ugXQ2ewXELTbGK+expmRE2y76bPVKmltdZGGCev1tHYbf8uf43sUh1BxADtyMDk2zv3hlNpTEYrEYIN2C4t3H2B9aUP+R0GfSTaSvrVOoX656uH065NwSgUcEs3fkxhXhOS6WRXZxPz5tWMqjAYgINFsowuS6D5noi/TeeOyDeDRH5gV+Rg+zoTELWHG6CTU9IRT/zmFc+SCUnUrmJ6YwmvVcQw4RbH0S42w6nH0khflzd2Z5179u8GLiIDy66X/Ce4fx5/tRs8zD6Wzxic7OK08RbEyiRu+OfwGht87gdHhk/j2x+/ZSpbjDsOQNgB+3CvOZymrR3QROik1WjR5TQDTv05C0Nl4dD+4iUs5V+hzXTHW7YbqTnGXKd7K/dczHqc9KvqZu5OletYMdJ7KdvO5ojK0pWdetJLGRPaIJklnRkTPd5W9Kz9mofgfV+77r36tAzM2YZaGwjDg5yjIhPny+6zJl817GXBNfi9zk8+1BUiQ2J/ieqpvU3JPDDl2w2OATj6HhRPDiJ8bZj4ohd8BAAD//6xdSW9bVRT+3uAxbpI6aZo6bdI2pVAQBSEhVgyqWJVuWDEIsYQfAOL3wIL/wAapKgtYUNSmi5aooWMG0thx7Hh+7130nXuu/RJCWtS+TaTIsp+vz7v3DN8Q2gW3/HWk4BX0VxcFRrFUS0Txm69L/8BQ25M0R2F/Ae6pN6QIKaTUZnmT9EcMmEQJf8RXiNDoIacFBAMhEohIMqQeiCChKzIZ6KHlq0n3Xz8nEDEEI1MqBjV5uO4SJAMXjcIhDIojGVQuLuKvpTtYXathghynWPk7wxmHGXZKn+waVCY80BmdQi8ZVTPn57MoK09NolQq2rVJC6P4FrHl+3ataGGXz9LWLSM8bpl6tUkFqKE8NoZsPise3hRgy9F+sbqF6v0VTC2cZ+YiCbA3BGQ/HxIg0WGkcI1yeVy9eg33760K198WmAFaSYxPPv8SX3z1tbbIdeJtRkmJaCy4W8loReMeFnfIesDFN9/C1PQMqtVN/Z+dIkQKGyS3idZrkW4yvbiv3842P+TBENENfViHDy3E1//GjRu4fOWKrcriBKfOnsW7732ApaWlYXefKAJOL+bPnLYTVwpIUq2UdhyS6BiroM2OG3rodZrCJ2JsHJmcth0KL8THn34mI4zvvvlWhAwHtBSBKCDKdIu+uZLc91vK91aOmA1PSUg6/S7yuaJ8w4niOD68dMnyqnXJsuUj+P7HH3Dl8ke4efOWHML11g62GzXLT/Y10aKYlqiORgpL60uc8BCXbZOxGvrK5bZqjSatBKzaFSPu2/+7nq47cXjS+qJbDId9B95J1guEc89mZPnYNGYrFQvBiqwdD32P3Y2Jiwcn/q2u+LzbYb8lEXiljAiaJeqKQcgzczrRQ8hINEsMFIpFC4nm8CJHvqr6KSraSGwmA8YY399I4btrMmiPewiOT6HUPYM29UzWepIR51j8eK47MeLaBZpobCfA9XstbNR+wztvnMPbr7+EU7MBxukvG3WQCG+PdKbAxqnsvUbEMIVfS5XcXhe9ZhNhYQcTM7PSAMjQMYHwy1C5qaH1TY4tU37YOSHqi+sYug4+D7fBAO3aFjYfPURnexNRtyX6G9SDoXVn0rON5s11OqMQ9V+QQtx0W5pUaOffTwSZ9Vzx4QoTM4IUskkpCJBYG9PtJtpbVTxaWUZtdQ0Z3qtvfYA7tJJtx/hj+TEGfYPtKId6Hzh9fgFj5TwazTa2d1rYWF3H8u1lrNxZRqPecVRKqEu6OMtwq3PPj6Jx90Svr83rIZo49QX6ggSI8Se20elHaNe7WMyWMZ+dRDEKMJ4rwRN4QR6ZfFFQWbFAgAOZCDGwG4Mm6kEP9+It3B38jZX+E3EaaA3t1uznuqLV2b/5biojfwOLojAxup7BLgFYlZMoXHgN2Zk5EV9LxplTdIT6kNtuCKILym10xf9oP7fQcnl3Y3Dr5gNkg2tC73rlwgLGJ/P2d/M8acBkLM/OTk7Y6NBiJbCkVLS2qkKLKHFgELERnxd3BjbaKS4YKp905EzhFvvgfeuw6S9cwnzIxQI54D4dJWLLuL50G/GDxyi0OpheXATm5hHQyShIrBq7PFaKVjDP5k//rNf+yf9B7+3vKQhioeZIRtjvo1utCf+fVDiuMQ1zAiY4qZwkUoiwoI7kfDeqkRJjd7eHtc0Glu7cxdLyQ9R2905KLf7BCpo6MTMpdqlwDxtv4ewMyq++jPDcGdRLJewYD33uxb5BxGk2Id7cN1RB1LpV+EM4+4FoADOivcEVBC6v49mroXGgM4lv9uZk9PjutXA0n8XiiWOYofWzZJIQQUvShoieaLS6WH/wCEP1LNUW2KtZ4MlAhqizXreNiaNjODE5LoKC1GdK4i5Mu4fGRhW//3IdzR2lb6ogbGJGZ3ysw5BWDFROzmJ6fg4Yy4nIKRsSvvI57JQ/5YuuF3NqB1EW6H+Km5wucsRXPdU0YF4ZquOSMWbPjrefDmCHaCoaSPRIP0aYZOQMP16awvnKWZyemENJ5PF8a02pdqRm376yv8/q/P2Dfe2Cg4z/Xux1UMn/9Cv5j1dH6I9CT2IqK2jQuXAaly++j1MzJ/DTrz9jo1PnUYDOoIsctSSCUC3frQ1e8C9Et2v6QNF90bDO48R9EFk6BulW7rf0sFclP23Dms1af36uMP+yxisWCjK4cgMqvqeXuMl+ZsjPd44uUvwaa2PM+46VtkCYv++NfP9lXagVoZ/JBtSwCObZJ6mTIlfEFpXD6dA2NbQ5QHqsoMdT+6IbShPBy5hncS0xJPdDeoQVBHRUCV7ioCfoB3u/9nkZFfbpvZdNBudgw3Xle1odAVtH834cIsCuMZH8PWmKpen2jn7PNbSijKrT4Xn4BwAA///MnUtv3FQYhl/72J7JXNtJh6RAr9AqqSiBFUuWIHYsEDskJISExIpW6qoSPwDBL4AFvwJUCDuqSm1a1EqFhJALStNk0pnOzePxFX3fOcf2lCYgKBdvIiUzHo/t43yX93tei5IFOtGel6cLCuVNaKaLXc7xGKldQvpaI5mwOEirKXmpf+7LpdIgBXjITqYsAhAJNtFERVUNkTekkA+PUFY8JHlSTJB0dZedLp4EAIq0gmUIGeBN2QW2evD9WAIuhIEx2aQcqaA5dxK7d1cQ9ZN0LjFRMDtTBVoavLQ7dFGyKrAtSS6O1VwXHVen3eECgF2uSGieIkNqJQDtKzbkIhNWgqJtoVQsMPyu3+tj0B3AG465k84grpgqnKQSH6K9vYXp2ZOS9kZS/b9i3XvgJtuTt27eVNdU2hhGrF4o4Z1339PjY9njZ1+9lPppxukDJFLAsFKlioWFl7G4+PXEW0gREQfSCjBIsvk0iysscTqCQDAuW5hww1hBV+S+S0VM49DvAAAgAElEQVQHvd4AV658gzdee122yByyJyyx9P3LLz5nMEqo7jHbcli1QYupVqnKuctYSjLpQFs797G5voqlG9dw8/p1RKMxmo1pfPD+hzh19hyPF9C1ePOtt3Fu/gVcunQR3y4uyq9NnXW2SoyR+BKC4xjJxKnhn6YEStK8T6lYxuWPL2NhYY7Pa2Qo8rgJVBuH8Mlnn+KjixdwdWkJNbJNsidJxka+K2rEyphmkpw7uf073a7/46ZxOywQFCYONabRnD2Kcq3KiR51E1MCr4pNjJASUR+xK5jjYVkkG5OuJaCARLXy+TybCh0UZV19HYSkwUiSXRcNNMyafCZ7PdMOeN3UyigfexqFREr3utvbqMY+ikmgikUxLwI9c8rXnsF+Hra6wJWrP2Nrt4VXFuZx/syzaND+CkUOOlmsEysZQhynkDQe0Qp9jL0xRoMRvMEQxXodpUqN3RPskiNp2gSdMaVNFCdehiRes+Sb55xDdhZw2w/Q3d1Bp7WLcDhAkWwgKYhW1l/EEXDZytjGyvomukMJ3SyIBF7/IaaogECfx64LQvI5nlAnNO+uIEl8EUY7W2jd20Dr13sY93uo2DYKVhFCSCBcMOhjs9XB2k4fbn+Mh8MQPS/AyAAON4fo+iZ+Wl7H+o8raO/twXMDFhRYqusS/k2r0NSuUhUB2poMEIVsbUvJzqn6DEwaYRIWyuUqHGeKZ3gJwDaOQ/QSD92wi/t+B8vuDjaCNtawB0KmDnUX38jGIzJrrMmZfb5fKPCJAriI4VHyd7QJe+4szNPPY0DAqHGAMo1FhGNY5GAyHMEkQr/2XD9Algs1enDn9jIfO133F8+fZiUAq7r0bKuRzXnTOIskqJv8/8IcB/DaHe6alsIErh+gcKiBar3GwCZi+sim8pMP9R+/qWCMRh0sA1XHwe7qKtZswc+aaVJmzcwAZYddgajHEWk6glbU/EcbBedFShjcIcIHXYzaHT5mQxcqtHuTkWQJi4rR2A1K/ZIC04EbYH2zhWtLt3Hj1i9cWNMkfUgEb8ZBTynmJnxSvCXkUiEQNQ6jNj8P68QxuNUKXMeGx3iThJsukXKr4LEkQwOmJ7ckVwhQPQ4eOsCjqofHFUe0kiU3xpWka0bxJGh9+D6m60Ucbza4EOuozj85btBce80oYdjtobPTysw04uSxcRbLgqnT53moF2yceGoGliroF4R0ndlcXsWdH+5OJL3StC5TjtHIK7nQiDJw4uwZ1GebXBhkoLUFpbLUjQKRG0n5feFI5w4skY6jNCbhhEOoRiM1SVQX31U+9din+JTKvGPlJKaSPMewUTVLeKY+i+dmj+No+QjktL+yZ9bHrJkj+xVp9L35B8von3giHKRh+zOflxfE5fc5+QqTFanEfHlpdg5Tr07hq++/w0Zviwt6rMQWIjdOe8DxpgyP7Jpr1wZWeEdZUp39PeRchxLwUHW3I5WcQhWF6L2UJ9k8yy/SUXO6tynG1UkrJfAymRXwfTkvLwsJwQQvwHgE0Bcrqb1QCT74uSOZEulsvinz28w1IOD1q4sa+U0D6Oke1zwL/XkcC6qih+7i679RfkivpePXcn1dNJOOe5LeL2H32bnOEv9szen9pyPvBD1UhThSGHBjn0d4pUWhvH65uwPAb9Rd228UVRj/zaUz3e1uL0tFeu9ugAgViiHRaHwg8ckXjf+TMRgjr76Z+GKiRn2QaCKCCSpogiApKQIKAm132W13O3ud3bmZ7zvnzM6Wmxh88Dy1TdOdnsuc7/K7mGqiuRNOlYrAH/gFxb/QdwgQyf+IX6zxpMtqR3+z6AO+oDs5ZQJSITgavqq2EMdZqn8SZ4g6QaRgTpZmAolgxHBnfm7PixfvQWNQvEG4BwSBQiwEPNndwIWdy2FqqYDihWlsrazDlqIanrSko8A+kBA02sKVpo9dIx5ynIAF4lIj0SqE2NzaxO5nJxlSHhc4ZBFALSajAIwIViRQFSOpFEZSPThOA9WtKhyChmVTQkxHk0q6XRdrN/7Awt7DsJ4ZFRsgBgk9RTqA7+Ha9evxt0xZizQMp9PYMz0bv22C6FFxUqjozQODAQKBoBa9+cZb+D5ZAJCqrnRZSqMnLhQcfuEICovzOHL4EPbvLSA3Pspz9uP5c3j7neOoVB3JlSdBwR4DDc6cOY0qoTHGcmChB0PHS6+8jMJiHr+tXuY95gZkP+WhtL6BcqmI3PgYr2G5XMaVlVWcP/8Tvjt1Endv34RTc3jhqRAT9YCzX3+Lr745hdG5PLRhm7uX+5aX8PEXn+HzTz/Bifffw9WrN/iFJqJSSJO9hM0MgSQMC90gQsbKYm4+j+Mn3sWx145x0BJJgJ6YC7qMLRw4uowPPvoQX548yf6ph5aXB2g3YUIZXa3DINSt32EcWKuHbobHGd38v4dSvaVO/djEOBYLBczPz2O7WGKakhqxpzlxD90I3pAGk1WRdRH0+kJpdkgX8H9B/xEiWcmkRkF549qYLi7eCNF9oje8bSxTXJZUHE3ZfA6NmRmYoYkeTHQqZaDXYKSOJGrFauocdvs9FnCkHqrj+fj1dwe31n9G8eg+vLi8hKkpGyMZE5atM2hQkzorugrYWBeCuqkBdyvDdhONThMONmBR52DExMj4KLKjORjDKXikSUw2XqbNdACiVnidNtrbWywu6FQ24DVb0IIuJlJp0S0ybalsrLMN6vBwBuvrNVy8chVOF+yZTVQVt9VEyu0CVkYGco/at082RIFHF8KEFPRvVVFeu4VKkXQ6qry+k+kMu0TzRR0CbbeH6nYdN2+vYbPZQzcAvLLDCKCG10Yqm8V6uYlSsYb2tgOL1pCQHoaGHonXEkrN9//tE8cbSpOnXNicamggwB00WJCpFbbhGh6mgjFkgzRm7AwM3WeIdi90UWqVUEETN90a/nKruBFtYgs+6vLvMd9a02MtB3EOAlkEQCIt0+NbqENfZWzY+VlEBw+gt1iAm50k8wRohs+OD+npOWRMC4bbg7d2F72Oy1QkRQpWFo+64uRr4s1layY75qxc/pN/14LHSADWUZGK0mylqgs+vx5Kn3vawtYQ7DBEq9NFu1YXhVevi57bge51MTI+AYMDUaGcr2nafxP17xiku8GtaJv0G0w0mg4qpSI0S0e9U8fs8wcxlJ8DjIw8J0as+s/8+6dMBXjoc0qONlOcKLGmDhdx/p0WWuUy6pUtRscwioKSLypAIRqYwpj7zRogIhar1CpYvXYHv1xaxcrqPY6vWGRYcqU4+Y+TdT3WouG3s2WhFvrwJycweWQZRn4e7WwadUIXGELHJzR9AYrWhaU079dkriOpAMmhCgHRA2IYJGNZbUdc+5jCEbtnRSEWpmaRn9nDYn0k4kf6K5EpqK70zOW1Isob95QxqKRUDQZcurSYZTctPUJ+eg/mdu/GMJ8aj5PvzVt3cOGHcyiVqzGCIgq1QdSf/IrsiMlCPr+0D2bKRp3osEZ4X9yeHElbQJVkKCsyLVbx7zcmKFkULl9GzFHWND1uBu60Why0WgtZyJiccdgubTiL53YVsJCbxS5rDLqEvYfKt4tsdSV+958m2Y877k/jvklOZ6jtEE59gs9TvH8kCrG4L77r35E0N4SO2J9bROrV13H64llcuneFrfhUDmbbO84B3b2hFr9j1HrpXIgJYxs9aqoKqrcQbVSifFTY8WWnXOWHvFd8ISjPKKDAlz8POZmO42PJk1dJrtJ4e9RI5oFJr35dwvfpOZTIHqMBpP2kEqSkYghr3gXUNad7XryjqHBAqPhk4p3MdVUMLpJ7UcxSXf+B9VRi9Jwv9l00FCefzz9T2fvFAwX1F58j5kl9ZlJYMI7XmIqjRAT79Hr+f3xBJ2Aqg67hbwAAAP//5F1JbxxFGH1VNT279wCOo9gOCSZWwoETECfKIVJETskPQEJIUX4DR5C4coCfAOIGCLggcYAICaRESSwSTFYExgvxeMvM9PQ6042+r6pmeowtkghOzMWWJbfb3dNT9d73lpzX8vTi2XfTdecgsR5Ud8UebyN7sp4K+7BqT6HMdBv2PjDsydgLZYMfbAIkdzYa5ohr/Tp6o8teIZv0r3qWA84bSLT0mz88uKtRv3m45sy8AYgdtBKOFKIPIFEQGi1C0oQi8HElEMgExWeHMf7iNDYfrNAPevkBxpxrP0jolNw2UPdihHnF3as6DDdl1rTZaMFtBhiokoXC0QoGqB4J0KcCUCxbLDg5lApFVgFQZydV5I2MjSFfclh+JaDBRbi1js2VRYxTuF5lEOm/Ds1S9mUxq4VusDwvunSfKAiPQqJUISOf3eMc9qIl+HK2gRNzJ/quq/7zul5yqDqM9z/4EGfPvY4yJfF32iiVC5o9gO7ifvm1k/j+x2v49PPPmIzIc21lmz34K0vLuHf3AV49NYfUb0M4EvmhQZw4OYeff1lAbIASTefXV1fx3jvv4qXjx3HlylX8ND+Pra0ttCl4TPTkuDlzkgS2Nhf/xA/fXsaFizNoExtp/g+ajL7x5ls4f+E8vvriS3z80Se4fn0evtsyTfiyC8m5Iko6KKk8Tp0+jYuXLuHM2TOAooqdgAFkKhz2aNMVijohSpUqXpg9irdnj8EPtTydwzs5ZCV9Cqj+/1UA2Jedtqc5gbGJZ7B/ehK3b93kMDq5c/tAWSA0hQvaSPwQqiM4yRxkCwhCnj10RIpYit5xLegXGthIE0CV6CQsPqzYEQ7Evlipy4YoG4LsAJRY7lFmyfAASyc5J4O652ukVm+ilCTdhZ8Xj0STSDQFoooegod+7GOrCXx9+T4Wlzcw9wq1PhzG2Ogg2w8IaOtqLv2ZlzcVOTLVUIzsEoKldqRq8eFFEbxWnZ+hXLHEfffl6hCKA4PIqTzqTQ+hHyBwH7HUX8QhtVchLwrsN5WSvmpQQA0qSpXQDGNcW7iD5e02g9AgStCm5oU4AuiZTGMNglJdTSLTvwcq2TvWv53ZI+mbFQr6l9LNTWw/rKG2sormdg1KuChLhWK1hBKpfRLaTBQ4fNN1A9y9t4Tb9xfhkh0DugZpbcPFBlWhScALwQu6w1U/prpJkOg3YhDOSmauwuv/B9qm0i02a6dKtP2JM0jSpJub0m8S0N+3WQmQIk5deJ0W6g0XM85BjGIA240OSkIDNK/jYSXawLrw8XtUxxLq/HueURPYwFW7hWQ7S5p2wb9MsyFUmjAIcgncShnl5w+gfOwYOjNHsF6s6gBXSQ0kRYR+grBcQXVyCiPCQVPlESwvAX6LTSTKtPHtwenz5I9sMDfmf0UOAZPB04enuF5Wqwja7JsXJtNEGOqVNpvlahVxR8vO6fklgs2PIkReC16jjtH9+6GqVbN4qV4J445zeRJeYK9NfGKBpDJZOI7AwOAwEzf0LHT8BI9Wa2i0WthXq2FidgZi3z4mKUjZxgJutTs4sxV/WYHAbl71J+I3+P7rDAC2tkUx3LUN+Gtr8De2kJKkNq9D6jhcjOwXFCmfmbQHUcz7Lhrs0H1YfbiOhbu/4erNO7j3h2uC/cDAOCaCwOyTZOY6WiAbqhwaVMl7aAqjR2chJw+gUSnDKygmrdgLrdJucKK9F3Y/gz2C2Lr3Z5cAw6d6CdvokTDhVJEKU2OjGKdwVTCTwu/3PAFnEXGzz/raGlpElBp5urBrxM5zJPuAkCjnczh8cAJVR8HhyuIQccPFwtUb+O6by0xYxmZ41WElTW9fA7snk8DEzBTGj0zzWkPrTqcT6j2+8TH3VAD9ACRLEliAYSef2fwrBoRxzADLDvBoX9kn9e/mxsju/pZBmlIIXI9VayOVERx5bhqHBqcwpoZY8k+T/wiRUTpkIfAub+XHuo+PA/f/uxyax/3L/6QByhK19N0wqigMT6Jy8hzUvMKtpdsIgxiVShlJ1wxhHw5pcgEMoDZKajsMJkxG+NFJNRFA036uJzb3UE/nzbQ9G/ZKsvZcz05C/fR0HGEn9UYNSG9cO32XUisFrAXAHp/Dxyn4zygRsqGB2ipoSUudN9BToOvcO6oOtM0BTDoYlUDWrkDnZwF+1vJOx7IWAPsziyst1s2+stdAkwq9QL4ssWCBv/bwa5LAPk/d+5oB/nbwR+ejnz1d4e84WYLOtDdZQiUB/gIAAP//tF1bbxRlGH7mm8POntpu2y1soYAFghyCMUq4MepVLzTRRGO80Asv/AEmXvtXDH/AcAWaeEBiIJoYtJpIlIKwttAtbJdud3dm52je9/u+2dm2SLhwGtKWtrOzuzPfvO/zPgeLplhUFBIqF1FBQlMrhZRy1rUhnbJNnUmrUAnZzIdcuIxFWerMc/r/ZHxxyKMV+gmwuXIYy5uVaoh5mm7Ig6Z8ZHZsFSkcaqbpOJS21iLE3CwqREld9grxoe8JHJC0Cvnm0NcFpk3Lx3BKRZ6+Uv4sFbKVmou544exsv8PBPc6KLOON1Yu22mmjSY2Kz3axlaAhZKNSsFE6kecnw6Vo7vZ7mJ2dg6uayp1lTyR+LiU8tOmQtBIYLsG3NhAtZQgrE3j/noL210fvUGA2VoBjqLbU9weGfSt3vwNDcpwT4rsfbD3ArCXTchev7VzwmtyocrmGKrpNVRuLxn8kT5X2UUgTAPYZHb4nyXO7iPS0dpHjz6HmZk6HrYf8v4JmKEGhG5WcwcP461330OxNDouPoc0xZ0ox6nAJ59+hq++vgZv+xG7SlOb45gG4jDClSvf4dy586MLxwSW3nwDn1+4ABEMZIQV+zJ4uHzxC1y+eDE7bwX5VACZVpfeA3raE6o4ocbO6/QYDdKMR6HpnIaJiak6PvzoY7zz3ge4desWLl26jKtXf0CzeQ+dbocXjXmaAhw5gaWlJbz62iuYn59jVzCVnpW7TSndJINhsXolIpQLjnTQtjT9SL/ASaZl2z3bGN9GGsAnbc/gSvaUPY2fBf/P9qweBIkMMeN/5YkKpg822ABpcmYWD3trMkeZ2pLMvC+RyyA1dr0ITiFl7e6g04NVryH2e0BakxNTu8BT32HP56KeXfeVZo6YQmQsSj0tATwxpM5ZZuHK4ktKUaQvANvJUZy86yAYDDEANXJzLB+KCw6iB6sY9jpc/HEkUKIB0VDeZCOfKa8OxdZxXGCC5ZUOmqvf4oWza3jpxVNYXGygsa+GMKEYrxiOJTg2jYAlpuez+/JIc8ZRiZadNTIp36hT1hUOt8iMzmYZPT1uASlKpOUnT5k04v2ze65pMgvG8wewC0V4gxj/PGjjyo8/o+XJc3f9UQdCLDLoknpdGMY0TAIhDCObEGvat6HpnrqGhKWafH3umVLTJDPpKLycWRLxZhetZpOd2CnPnGQTVZMuLVeCsGTck8hMYEvt+/5qC9evL6O7FbGRl8XFAc8u2ekaaopp5uKnElU0EbhDjAqPYq0IwKaGJ5HGRQEl5pD8q1xC6FS4EaJJuRn4EEMPFWHBMZSTcj5ibZTuyFfhFsvVUnTQx0Z4G7OoolGoQ0QyDq8vEjRDivXz0UeYNQgauBX6ng3l1m2Mkip08ekKh/1Z6O8GFtCt2iieeh7mmdMYzB/ApuPCtxxEFEERAY/7fRRLBmyngu3ExJQzjZI9idj+Ff17t5F027yc2YYszJA1s/p5yRWLACQDAW4sr0G41/B6InDs2BE4JYvXZGIWxnEI25CRYYaIeahRIB2zMLmpDmMDs7Uag1yDno9ufx3B4y2UpidR3jfD3gAk8KPkC/bmUJ40WbQbMObEjDz9G8ojR33WmzE2wYUyWo04WjIOfQnUGS422h7mF4oo21PYbHWwtvUnth+0sXDyOMr75oBaleM5eRIv5DUEBdYx3dWQN9qdAMCumDqOpct9n44+M5hCBbElazzybjKpViOqi+fBa60jaG0g6mwyGGC7lpK8G2pKZTCSRc+JKqch3dgJsPQp37+Hu6st/PL7XSzfvINHgyAzjeT4LHpdE2meKjdpX08aZ1LMD2Fj4LoQx49h4sxJJI0ZtK0EvkOgaJqJBkwFsiZjrJK97grj961MnqXfrzwjIJtoK2xBjBrzNBctJ/ehrkbWgSUw4yEOTE/idGM/FswKyvDhCpvBHzLYIx+osO9hZWUF3W4kUzL00enH1tH1zMryEAw8LC4exekjh1GlyTpBeMRsvPM3vv/yG6w3OxLQNW1mHgWZsxXV2zbX8focOPHyWRT3T2FA66tIM82wlADsClHmFI5UMdS0mbk0WFSJN9zoFZRZsWzChDBHUd9C060jrtk4e94UWWKYLYo8oabXh9ihJcvBgcoMFuuH0KjUUTOqPFSBSvXSZsV7UeL3Ntx7mgZ//Oe79/GkMVey4/dzHl25NWB3bbbzaJ9Wx49Xiun4cjNmgqfXdAJrS7BwyKnj/fNvc3LNT3/dwDCM4Qlp6kL3bALwtQEdnye8yo96Oahmm7xXRg79JlOw9MfOlyaNR0wydsWn84T83ah3SmRsPA1wCSDUDTrp/Jk1xOZ+ULT2ODO7g2rc81vMppUmD3UifX6qizcrky0hUzxIlpMkDIKwz5xKN9Gm81JTP5qeZ4b26ud52XueiasN+vQ2zkYnUz55zHkGgAYQ2ACfwQ7JWpBgAg0RtCmmnPanlITD0gC9r5GPHssBWOKgpExMCyAphs0xwUEQ4F8AAAD//+xd2W8bRRj/7eH1ro1jBztHQ5PmaNM6NERFCMTxBBIS/w+i/x8CCVkcTVtRHloShzQJORxn7dh7eRd938ys146bPEDfmL5UimXvzu7MfMfvMIcqisMXLQu7YZE93UzVPRmiMKLYqaewBiVSEMvPxBN8NtOKxWBsw5U3pYQUskWCUY9QAbcPeWIGQw6kyn5ipGIRhuQ/MMciCNNKCt04B+G+zwrKmpEHaRtqjonp1QXcqq/gzyMXffKglhAiNUy5FOnqezFw0Q9QNh1YZLlClj1EZdBi5qG3ztooFHLMBdczCqaGrIhzcYqCP0NYAtoWcWD6vCi63R5b2k0HBQyIa0x0XlY/9dA62EP7aB+VlSKg2/95UuXYdooKiWUQS/PZD/o4OTtF7b0p1vgytJsECK6pjmrghGtxcZELADT80EfBIN5ehNt3lpn/ZydmGpUMD8Hh/dY3HqL+YBPPn/yEhGzMkgB+EGEQRNh++oSfcaFUTHm9n37+GdbW7+Hp821O8AmOq3i/JrlK6CIAV5gYet4UahaTHKpGEbedMlsbujawsnyPP8OdXdVkSMmOIigg2kT9/U1sPdrCt9895vnrXl7yfJLl3FTpXdBU03JgSrM2yDJqJ6azo7XtsQ1GewNm8f9x46DnVZ2fxdrGAyzeXcHh3j4/e6X0nO5YsRR+8gZcgCENAL/tIzpzEfd6CEnZuDTNwmJRqLMbhBaJIifBYlmI0RBBsoJOa1IZO6u6y7IXulTPZ2twHQM6yJwcIt2BT90ePQeTnBuSCMFxgoF7jjy7A+hCHDBOHZ9lECfcLTjoSiJceBG+b/yO5sEB26t99KiOW3NVprSIM0V0qBgSqw+EbZkSRNUEOszUh8gwCvYTCZ1mlW0qXijOLiWt7AZgSB6uxgcWB8Yw4HY9HJ900fjlGV7+5ZK7Na+/ttsj8Wwkfsyc8TxVTczcxMd5bceOpyBkgUeG+nseet0TtF7vo31wiKDTga3p7ETg2CbXCUiThgX6kpgFt+g+qDi72zzEDz/+iuZei4tI4v5FghMneqbrORj+dOZSFGohT/s6B8CiTNwhCkbJgTVXhVmrwijV4FDhz+0gIoHRoyPhNENoI3W/KkeRtKw4w3UlZFLAIn4hTtDCTrcNaX5JxoHoCBfxGwe/pYqGnOE4E0WOvsMj3cyZCkpbD2GuraM/t4CWaaFnmOgzPC7iV8CsFVhjw7EM+G6Ii7wJmyy8iFdl6bhsJuietWBFCetDIE1K43TesiBXyil/buzA6wf4+puvsLq+hELJ5sTFsChpEEg+RrBQXELovU6I182/kcvnUZiqwC6XUMzZXIQLOl10fA9ev4PyzCwKpap4d/m1l4WvCWH/de/dSAyU+RwXg0KPaWKE6qCzhywabaeMZvMAtrOLjz+poVKZwfnZCToH53h20kBtaR5LG+uw5mcYEk3UMOSoWiUg4pzoSyJQilTXRk8NNQwFQ1ZxVObZjuifUPJPcNJegMGFC++8Db/dQkh6ChJKayixt1ggAOhLCKlEW0cQxej1QpxeuDg+PcPO7j62X+xg79BFKwjT1MKUiuDKAmw4iWLOYefRDWMMKmWU72/AqN9HMFNFL6/BNxMWq1TnsZ65d30cxq7W51ugT1xBJCXqdyLkEeNObRrL1Rqv4RwyqC3eJCJ02hd49WqH16019r3QFD0CjMag0jHFtR/W63i4eg9F5ueHQOsULxoN7P7xUvw+dc8Daj0ZKf+f/5GYXhzCIUerKQt3Nx8A79gCyUEd/ysw5rGmji40P+h5s/C2SvCkqjz7kVOiRI04puuOxqqG9CSHRAKTDhLSfGDY9b3su5jKO1iuzWFpegG3i7MocRo7AdWF0aQ3+//xtPrfjzcl/5MS97fb/FAju3bHhzZSdNAxjQK+/OALzokaL3+Dnk+YSJHokk4qL1kI0OrqJU2/QeWPqYd/grTbrGtXL4SafEqdnul/OYvzH6VKz8m/pKFT3mfJnA0SDa5yO6V9pSz+PKkjw44CUmdD08zx3ffqfGS66FmRQjVSlDjrkg3/ppT6J7lXKEqBsskcR7dkc1sh9EfFatHhZ3cMibRRYppqbvp9T6DlUycCajjQ+ZbRmMvs89T4zrH9NCEaxNqjS0n1DAD8AwAA///kXdtuE1cUXTPj8Ywdx849EAihOFwKUUpbgVq15aEqlPf+QP+yT4iqtGq5FFIRAaFApEAC2Nj47tieOYP2Pvt4xiG0qor60vOCHAvPOWdue6+99lopY49nTqQKkegx2D+BU0IJYppCYr80xSDgHgqTtKd9b9/Fm81N7wnkUgnaEPgGj9EAACAASURBVARANb9Fv0+9JilBJdlP34rbC5InIwYUtDiEYicATZWOhF2ggQ5rKGoU2gG8uRwOrhTx9PZDhN1WIhWLF2onQIBXzQHmxzNsE8dCdLT2MECj3kKlUsHEZBb5Qk4zLIQWFZm+flvEtlhd1eZ2Ac9z4Wd8dDotlMtlTM/n4GayDMLQ7xODod6oY+vRBiYOLgBu+j0/WBQLD548eQrXfvyJ18mWeExn7WD9yQY+PHdM9sH6+yMPX7T7fGcDq6sf4dbabaaapmzx1YRCtVIZ0lSMgExymOtjYsLB5cuXcOfmL8P+Z7qCPMfG5qPHqNZryOYFAKAK0NQkLn57CRsbD9ChXoZI7z9pPJDjMvWIjslxfMfF0uIiPl1exfeXvkOh52PwrIZSr4XakTw+u3CR0W5jU+QojJRY+PlHQEmkVd/pHB9amOMgnVklpo1XqmtRFL0FcPxXL43/69AK4vHi/WwGxVMncOaTs/jz7n10SmXuqYQwYdi2xpCKe6Terilvqt9Ht1wHGi22wSKwlEBGNsNydGLICvmBptHxc8B084rwnqUjntEzryR5j3RfMiWKLBhGoaFlI6CXHDE+XIXIdxFtAlarBoddrxUn0Aa0VBIc6cpUyAkuU0wVsLVdw/bOz7izto6vvjyHMyvHMT0xhnEP7MXsEHOAq2iaDs3PX9E5MDY+PGcrJQJ9lgTBkThOWMKesDUJNdTq81wbJHb/rkK11MC163/gh6u/oqldNrlqV6k3mElALVbEuvGoAun42g7UDoXHEaPrPAwSL5VW3Y+hbTpprwevqnjx7CmaJRL3q3GPf973mFFBsQytjSjrEVURAp0A03OClcqfVfDbjXXcWrs/pNLuN0as21QsOmlGSmjuHPBQku/lYOeycA7Nwy0ehj07C+WP8XdBu4moPMmONYPNLQS1trZkk4Q/lBx1YGH4N1vakmiHyMKvPdwRDHUi3q1AYI+AFmbuckp50DG7ToDumA8UjyC3ehrh4lG0CtNowkWbbCvZ6DlgKpmTczG1MIPJyUlkrDSCahv15w10Bx7G7UNw0jbSGQ+9Rw8xqFThhANpd6C90o43tny2JHFL6UsZT+5t42p4FeqbL1A8tYRsXusGsfsEgWAUkCqbAYPK6xZu3riL3d4A7lgBH5w+Bt8b49X5ro/ebhet7RL61QamplvwJgpwJwsk4QxFjBdLa38wVGuuv33izEgkDZLihsm2Bg3SOHxf03OBkp8+ORSMF1B6uY5OP8T4/DSWT5xAOj/LHvt2EGFnYwv1UgkHFg9jam4emZkpYHYGbClEbZekmZSgj5rrYdjSODLL+D5JzkvPVSFFL6vdXaDd42dbt/wa/VoTvUaN7wlSiec+XWp+GtIfhK7B1TUXvU4f1UoTO6Ua62Xce7yJxzsvUG4GnLAbw10ThFPVypH7JdZQsdF3bNBR08tLyJ5cRuroErr5cTSh0CZnFNpoisMSCXiMx8vz4b1w+kdjZM1YHR5odHcl+WfQVykUMi5Wiks4WMgTosl7bMRH6V+KOV49f4mnW9tsogTpFzbDEWtFW/Q+yKFl5sA8Pv/4PI7OHtZ3dLOF2sMn+P3KFWxtljjeIBaRkvZDUyHn8xfscgxN1nAr58+ieOY4ui65KgQinqcE7nrXPmhqvhJb7/32SbMM1FvJPw2urtI5E8XzvYMbiyyFvJPBwvg0lueOYS49hRwySDOc8s8AnPcVTcUgQzTS4iJfvrWK+Mh7Z/DvAKikBkDy4NGe6x+JZ37yswcHOdvD1+cvwCv4uP5gDbVBh0Viw8iwThPU/dCIP8p7JOFTb1mx3gKDAFEkbanxMIJ5qVQMQ5iWbk5MUwndB1v69F3RGaBWrYFOXk0fv66iaxo+gQdJ8T8k2gFCUeQf2TtuISfNMIedAWitsRtFnK/SXE3LQaxPoD/zcQUk4ISbXQw06E/zNuBWsvqf/KyZMFThF36bgCcUP1Ihtr/nniBxP1o7/T+aqza9SbIyYgYA/+ZfXfAA3rB3bb9RVGH8NzM7szt7b7ctLUtJBRqwhRiMF3zyyRgTov4BRv8nY2LwTeOziW8aeYFggARjtIgIFgqLQNvt7rY7M52ZnYv5vnPO7rBULsqjJ9k07W53rmfOd/ldctmdgeLrZJrzxO8nfj4dTCwtBxS/h20VXE/ANJRvo0z+ObGVFZDsNrLbGq+2DHUE6O+xtA0xIAUcRIJPQTVDQFgJdMDdtVEyLwbzEWWVifabbtqiXYS36/HvxMGkk6cbORSoAhprXLjYJXuRUhkzRw5iauEA7m1eZ2HtvRZ3NZkoUN0ZpMjnZFcPkdAzICGovotOp4dKpSQQEXRhDWOoAZByxUp8v5ETYoD0qteriDpdtshzXepC5LlpRVBE8tmlruRm6zZi91UY5ZqwxYLgOv6Xwbc0VaKg4+TJk8NvUw8R4q1+f/Y7vPvBe7AtAV3910NWs0+dOoWvv/oSAQkyxtJCQ8txl4ugX+VijiFvCuKj1GJHNxFY3f/zTz+D028jTVzkGE6X4OH6OrqdDvY3m9KqTHQyPvrkY5z54gzz8SjQoCSDhHlo+aqZNuoTE9h3cD8+PH0a77/9DipkGH2ji7VvzyHthahPT6BuzwBRTjwLn3AaeEIng6HgTcBVPWnFIR0HVKCWjsyGnn2pYvu3bDfjf07/8w4twzemZxpZAS4eX8Kh48dw7UIPSaj0IkR1XBEHNLIk8ikBFiJj6c4AYc9BgfjFwYDbu1Th1gwBoxU8AmE/Cl0gaBQdSFRn48f8ZTVDUIgYwsa0AWGjobPHs45YVnip026ZeQx2A6TrgOZ1gUQgmNRdkQ6xJSIIZN9dhorpCMIE5BJ3u9XDX9/8gBM3bmJ56QiWFw9iql5miylSvucwkgoHunBBiOLBUJVbrAH6UH1Z4XZ45qYiaGJdA+IvS1gFCbIlvoaNVhsXLv6M81dWsOmMQiZ+xvZdRBSNhClixyWoEEUu0LWYob4M4FXXLzeyxBFJazRqv9PxbqzDabfR2diEv91F7Dkokn+8XUDByjPUlD4+kE4nAVHFTIufERR7tO6s49LlX3Du/BVse/IaqZ50xqIHqng97KBIxFdmhhLNTXFzI5tUzMsoHH6Jucz6/BziWgU75AlOa2ExhV02YBdNYQ97+x7cdhcWPa9TabQi78xRR3cEbFYd1kieVxMScfTMDB8JA6b7SRMQc8/UEFQqqCwtQT+xhP70JHqlKnf9B2ECzTK4QAYt4uS/Ml3F5P4G7DK5U5swLQNd30cQWYi0Copk2FKyUCzm4a/egvPgAfLEkYxlYTd9tIhC85a4z4iE//HNlRZM7SLCXQ8LS02UqyXkyT6JDjQWxxD4KdpbDlaur6HX9zHTvIp9c7Mo2GVevyneydk2CqEO3/Nwv3cTlckGik4D9vQM8hPTojD0NLSJHFn9D+zxP3behEYWUoHP6BYaE40plMsV3L2zifTyr/A1E8ePvsxNAGr014wSOt2HWO38hlX9GhrNOUzON1GYaqA+NwujWmNoNdnlqcKYrsl7MLNtQeXQhucy+5O7iDRftjpIXQ+7G2347R5Inp8oMkTV002dkTtDVzzFGVa2WqmOnR0X3fYO/lxr4cZqC7+v3sX9rT4Xo0IF1NeEtkjZLLAoppaJWxPWORGFTse0YB1eQGX5GHBoHlt5A6GVQyDpPZRgP1bIeHID8LnGuAhfduylQ4IM/1rMzAjzjQYWm/tQgoaaRsQoofUDaQs88H20bt3FVrsrrsO4cLYyWKA8jHQUHRcnDi/ijeVXUKRHan8T2raDn87+iJVLK1zvJD2RXaJuUQwiaVryDHEsTNB5o2pj+a3XmVbiBA6SnE4z9KlYwliKqgXEPaYkS380l6CYVPH8hQL64zxmJQxIMRIheTJXkK1CzVjH/NQcDtRmMWtNs86/yU8QCwH8F3eBn3voe/t8pipGVcnyk2K5f3rvxWgLZDHYsVyrsluk1Y7cfxp6FW8efQ3u7gBX1/7AdugxCkQfK26oJHNIBUgkkiSVjQDpFpcoWP7Y6aHrL6DribC/ywkufizje8W9V43pKBmJv6vudyqp5aozrnQBKMfieIdF+3KjbnxGNH68G6/yVtqXcTs+9aIuOyX39J2Ue9I6rwoZdIy0T1RAUNQA0gtQenePnrdR/qvey6IFVLGA6AY0XM/jzyt6AMUotI+qWCDQ8ZLTz9eAtilyCfE9ohhKjWdqmgtkBeWZAlcUhiH+BgAA///UXVlzU2UYfs6Sc5KT0GxN6QJT2rJrSaXCjBc6A6O/Sn8JP8A7R71xmNELvAEZRKVFFqmlLdRCS7EmzdlyFud9v+9LTtIBxPHGdHrRNj05y7e8y7OYA2qbet9qA5kqJ/vqS1iCOjh5+NOLVROl/yIntzLR4eRc12UhOO2JJyhhBDppqp4QZJ6UCskfkY4jOP4xJ9Ga9DzNUg4MBe+nb9sWarOJVIruPWSwdz4kykDZL6gqEw049orkpFox2FNWCd4PXeTrRcycn8fj5RXYxBHoDvOG+xOKOiu7XheVso1c2pXVJI2VWZ/tbGO0MQLf95BLrB5MJkdCKDTQ4kTwPlk1M+UOsVPMwyeLE8vEXquF3d091OtVru6zyrhhwNGB1s4f2Fp9gCPVMaR2Tk7tgyIxb/sySN0PKS5dvoT5c+dwf+ku9qlCR8/LsnD16jf4dPczTE00evfitanq0A6ShcjQs19YaLLNTo7777HslOdYwZ/cFEbrJTFRidcZRYMcb01sgosL8zg6fQw/L23Dlt7CRDl12y2sP32Cs815fm/XD5j7cvzMaVz++DK+/vIrlNKErZcmK2O4uPg+3l14Dxc++hATp+dQOVRmadztK5/j1pUvcEQroVEeRxB28JfmY7p5GumhSaBms5/2wJqtCY9g+gVrTshIm7qpYllWmhUqSHhVJP4PNoEejPH/kPz/1+c4tEG95QwwNNUZl+uFBhRGSmh+cBGrK7/j+do6dlY3SDZHuEwwMFOtGOJaQi9mRwDSBDA7IcxAag8bUrU/X4AWeFLhWONOpNA8MYRFHm3CpmCKJ4nadCTfjCGeGneBOWcmGHMsbAcT1nrIMW8SJKTESCENEYllbqRI93Y54c7rwoKKpN+44q0gmlLgkivOspjXpe64D9z8aQ2/razh9ngdFxabODE3g6mpCVSqJV7PnHyO1zhNBXRSxZ+uLyS4HKGzbIuFXvN0/eS6IWF64A1QZ/g/dT0fPdrErZsP8O21W9j2RbKqaz1tNLRbLtz9AFOjFXTdDoKNx7Cnj8EsOex1TdBxQwajVI/QpW0sTy6/i/jlX2yrFXdcdiKISN3ac+GQLexISWjVUABPjglGAR3iG+iCL0u82Sgx4bkhNte3cO37m7jxwx3stboMnS9kiq60wYpC7KvDZl+Bs0mUSCeNGyApm9COHoZzfAbW8Vl4lTI8x4FnWvA1Ey51hrspCsUcKuUCyo0qcrU63OWHSLdeoBCEDPWjvTGQQkiJLAyq7l2cgdMrS1vEr5sr8v/YqSTHgVVAAURqwqe1LG8hGhtFodlEenIWrVoNO7oG37SZiaubtO8S+o667CaqEzVMHJviDj+vdlQUGLEwcrSOncBDK3DhaAUU7DqsvAGr7MDaqKJ1/yGStiuCJG6ndwekDykgoplZorgkiXFvaR1+6KEdvIPZU3OojeoolcrC4i8gK0kfd5Ye4Fnb55l84/ptzM7O4mKlDlgpn2s3CYTHum0zPD922+hsBojbHtAIgNIhmOVD0Om+JKJ9m2YcPHj+ZqD0rxoO3I/tuGKsdvbRebHNPGj63GKxhHa8i+W7a4jiHNNWTp2cZl2D2kgJh/PTaLf/RBR3sLOxhr3nWyhWKtiuVeFUy6iNjyNfqyK2C0yXMWyBDuD8jBoohKSkYrppSIIoiTHFPCaSjodOu42IhGvJveMlFcq6SIIQBSMvtZ4MIdKHFHlT0BA9N+AglcZg4CcsfPvsyVOsrG5g6dEK7j/e4XsecZxi8Feqi+64TeLOoShT2YboCPvdEC4BEDQDemMU9uQk6otNtMpFdBwb7ZzGyvUkFEjoID2jecAMhDQZuPUi9hh8BoN010EVcf5Z/r2X3CdDFoAqRu7ZumbwopIGqITzzDTEiUYZM2UHQrO+w6KxPA4S6mI68F62ce/Orwg8AYEXc1iVENBbxwkxQs2goqPjwtkzOFKrAgG5q+zj6S8/4sZ31/FiM+LCqCcvMeiGBzjpVKCjstO582fZBSu2dVh2HqEZoUuNC00pfR7ct+neCdi+EkATtsoU+5s9wUBwI5DeQ7ExrZFsfyZ93JWGBttbhn2YNSVB7OwZxZgqj+HE+BzG7RqKKHKsSHtDpPFKMySE/abGyb+LP/pr+hB+JkOD7edSPaEIbmYNfvrQeHvteRoH3vmm+CY+cPzhTxg8gil1XIjK1UANnyxcgmXkcfvhMgtld7x96FRoI/pIFHIsq0n0dTahtohCJfM2I9MYtDg/7OdzCtquIOxcNMoJ6rimJT1EgerYK5t6ZJECUdhrOguBwn7grbz/Y+bT65yYM5VAcvgH7gTnIaJJTWORhASzBQJaHynfFedLhQsRn9Fd7iv9i3MS7gWZ2SW5+wPPIoOAp72ajqXQAorTL0T8RMtG5Ul0bDoP26JCh2jcFPIOFwhkmisp7zkx9uSapZwY1IvFNskBRFoVxnGMvwEAAP//7F3bbhtVFF1nxuPxvYmbi5vgXNyLBGpFS1FLUXniE/iLSnwEiFde+YN+Ae8FgaBFUErTVolIQ2LatLnZcWzHGY9n5qC9zznjiVugCNQnTt4S2/Gc276tvVZKykTAH6ksgqWDfLpkFIRiuKCcdbEsXlh+IIhYyorgGQZOYYJ9JimKFKQhyaCo2PAVQJEJFUxPBRR/gNDSDZwsoOBeyGOZmcQqqlYArQIQhdELi2jeZzQkaXNlc1mEgbk6Ip3MCyCZWC2FsflpTC1W0Xy4joJGdkk5kkHXjLXbbQ8zhRxcvRoisRFIUm68XERlusJZLHNATL+JMBqOpFNrCz5g1AZA7QCpI4HuQZsZgWF76neWwpM6wRF2n67j1IUrEG4R/92IWIqxOj/P1fkHSw8UxJk2ZBixXN7Nmzdx4+MbcIjOWxoptVeD1iUPARGLnT17DhPjE9jdb7Jh40DB70N2Otja2sbp2husZ2v2WXLwbNsAoWSvXrmGe0s/8gVoIL+UtVtbW+MqG1+8doqJpehgfPLZp2x4szbw/sV38eG166ieOQsUi0Amq/7LYYClz79A/ctbmI0cVEtFslKQRwKprQbWv/4Oi+c/gitthnWHcmgfjqFG/nGf4d8RvyTH/xX/fztGZ5uYwcdnp3H5g2t4fH8Jzc0tWIHFKgwKiCzjH8XkT73GguUm/e0m3EYX1qyPMNuHnSvBSUn4DsFlPSbRYzZoaFTAK4wYhq2ddwq2mWE7IAWTiKH0gnSw0zYydhVuPg2Zz6K/sYHm3jZygY+C7SBD92loVDsETKdwpB08mdA8YKh0CzhoNVBfv4VabQaXLl5ArTaHKSI7LFoollyGpFHljWkxyZhxX4Gq0/L9Ggn43oBtguu47NAyQZ6U2N3Zwd27D3H7Dml/b6IVqook88poskuWIPUVb4uShe2g8/Q3RJGPbHUWFrE0DiSfdYIjUysWGf8eGeR+gN5OC2HPYyUCS6o7jM69w3euxezRZgOQM0koqzRxuaQdDsYouDhoe1hd2cD3397BL/eW0ewE/JhFoZIgGKnUyaTDbvaU/jMnaCDhUwWEbA61WRCk+a0zkHMzOCqXcUSsw5YNLxIc/ASUQKReWRlxQFSaFMjmyioYD5bR227AIaebyLw0EYllmM/lEMAbGdm4GNKvUsZ/doMM299ChCKNyMmiR2SI2Qzy1RnkTy/CO72A/bEyDkmzPeXAI7i/VFJ/pCZhuREmZycwdmpSIQKEEhdkDkY7BWcsg9zsSUZcdFtdDPIChbyNfM6GlUljPOOivboGv9FGLgi461f1y6uKKROrk/2hirT+3r+u7KBx2MbW3gEuXb6IajWLgR1CBhZWllexulZnpQNF5NvF7Ts/YaoyjflzVUaO+ZQki0L+/g6hbfwBwkMirmuj3+4iMz6GLAWkpSIE7WkigmXofYKAb2Tdh5tDz78QSq2cKl/NPezX62g9f4asI7gNxHFTPP8UnP28vMqykr4VYrFagb/XwMxUBQsLNU4CjJV66PU66DZa2H32HG4hj+3xOn+/iZkq7FwOhVKRCy5kH42+PiXoyAbTefG9PkQ/gNc9RHjo4ZA4J3o92Ec9bm+iBCEpntAFEguLETcQV64GGgFEyL0e+l6IZmOfeQyWHz7CxpPneHLQj5UlVMOOfQx9YLgdyM8g4mdCDwxSNvppF4PSCRRqNRTPnYE3NYFexkLHVuq+g0hXI6XS6rfiXvoXg/9XGUP48XGk6svePerzWIaEM0aHS/Zb6Z4niHzRtvD2whym09RU5iOIqCI+iCVXCWK0ufE71pYfs2QmfZaTxAQasmF6bvIbAzDr/1ylDJvYmil4eLqJH776Bqsr65xI7UuF+mGUUfxRCflUoo7IWXjz6jvITJ1Az1ZVazHqw7zs+S0lH54czNBOVRzd7z8IBtq/VUGeQeQ6rNiE44x1UIS3gQ7+craL8cJJLJysouJOcs8/y7DGaKforyLo1zoEjF9r8ZwmwPDJ2dFaKa9vjO5ckdDsMgg7wYgwFT+VUcL18+/BOwpwv/5IIW4FYtQqxSdM2Biq02xk2aH5IBAlC7baeuhqNxWIpSbno8St6XlnSUB7SFxH8ZkfDVTgmxJxEJzSKl/QRQtGhkvExRLTyq6+51CJgBKsFMQLDYGK2wR0sSU5kkgBhVZU0oQqbiVp45EEoW4zpziTfCHibVMVfYUIGH29IQukSTVoenod+TdUAGe+Ov2MdEbUnFALjWTuMJMU6HS7Cm2oUdOmqE4tZAYtbUW0NgnuFybgVHPICY+Ugz8AAAD//+xdyW4cVRQ9NXVXl91ldzuOM1hxEtsgO0QkKImSKIBgg8QXoHwHP4CExIItCxbsWCEWLJBAgkUWEJwICSMUsB237SS2252421NPNRe6972qHmKSiGFHreIh5epX0z33nkFPNBKQ2v7nbUxHkJ2NhLJAHyRhBnC3L6CIF/FhqOAIk664nP6nnbIwTKnRdKG1262uhRUau6zWqyuKuuj+AkCH6TEcthnSY8CXSQDJSeNmhI7UaZjoWUSZo4JJM3WMTp7C+LmXUFtcExJG0tvGEZJ+XnLZ0Ersh0DDc1A0rVRUmdDP6IIgOnuxWERWzXa0sqqIWuS8cASc1a3pIU/+CegbhqBp1HZqaDQayA2YbA5ImIEGgkT93FxbwamdGkbyY2KewN0w2bzpusn/1mYYeO/mTXz9zbdY31gXBj80HUUWH3/4ES5cvYQbN65hUNE6btEv1ASIpOGFaB7kbRuzM7O4fWdOmNFQRKMX8+RwbW0VV6+8isjoREk+tTdfvKvfeOttfPrZJ8wgSF7AdKE36g15rQj2RCJDm5qZwedffoE2xZKRTwU3WTJiwShyrNLAV+9/gKFSDZft0ygMZ6F4grZEujtbj7G7tIjG0jIGR85zEUh/N3m860qHbn04SH/WmTlsov+/F8B/sfU2aoTRHpU/OcvGuUsX8da776BcWkNlYU0UqKrQ4espzBKd+iBS+Vp0t/eQeVxFttGGXlAQU9Y5J6oQeHMAlx8mnThIFU/R/tPDUZQeWmmq3uZbXOODj7RIeq8o8IhdYg4hHsgCVg5x3gRWVbiPK9ApvSNmT3wuvBPqrdrx+REsKlUsBCWj8JxOUdBwA9xbKGNxoYyTJ4Yx+/IkpqdO4/TZY8jbKsycAcMUL0daPzLOI5AhHKAzotynmCDQyyfEXu0ApeVV3PrhLn78+T7222R+B9a86rIxEclinkC77/gMMlSNzDldtOv72F/eARpVZIo2Ql3h6RGBmDZl6ZKpmOvy94KmwzRGfkaRQ7aZsHXEdM5ThAaZqcw0oaIMXpWOOQPPDbBVruDX+Xv4ae43/HF/MzVR0rix7ffA5P5Nlb2/dH0VAViY6J1TEBWHkX/lPIzpMwhPHOX88qZpoU6/FypwqJim3PwBE6o9BJ3STZwQLZeyxC1onsIpLc5CCd7WExhOCwPMnOgq8IWLi3RDj1POf9QRLvQdde+ziub1bhjBhY96RgWOjyE3NQWcPYXdoTyc4giaqiokBnT/uL5gM5E3xKABa9TC4HEbxmAOThxIk7qI33kamVUaBqwjNhst7sFFkyjmpDvVh5Cl+8S2YI0W4K4+QvNhGXG9BZN9fQJOxSEyDd1f3U9MOq8P1h1U9uaxvLqB61cu4+TIUXhtD7dv38Xm1pP0/U1vh/nlJRyfPwnTNjE6PswrQwWuoLL6nAQESm7wfRyUD9Des9CqbSI3VETWPgqDGAYUVUsTIpIBsmOv9DKKotQYq+/mRtCuI9ouo17ewO6jdaC+Dyub53vTD9rp2aF//b6yiWrze7x+/TIuzE5ju/YESlREoTAGx3RhWg7sgg/HrcNxWmjuHKCxtY39BxucrkGyC5ogkQEjAX+qoyhFKSZ6PcWyeR7LlmKawrILt8efmQt8qttyWfhUDItqLn1uUrOMZEA+Ge8GCqrVPTyu1LBSeoil5RJK5d0eLwlF+p4I7oAKXYIDqbiBaeS4dnRoPm4YLIcZmZyCOTHBcpM6RaHGQmpKJqY8FKDhjyp0GaLJ9Qzw/5xmfDd47+j6+37nsMi6v96jqDfDCGfGj2FqjOaslIpC3jEZTrJgPxaKjm05KD98hJXFJWYw9pfjzHqNxZSX1ysAyH7jSMFkh49gu4K57+Zw59YvqB74TI53E8K2rF+VtO0i10oHJmamcfbiOXhZyRySz92Ot8rha8beB5C57xBDwCTuT8iGNa6/jZ8xJQAAIABJREFUGeRFkWQIGAz22pKR2z01haz7aRJMoMbSczhTGMfk8AQsBv8ZyQIS9Tqdy/AfTvRfnC+o9n2V4I340J8n3+sF/PEL1HH/7kCnf29q388U6cGhxcLRi/DDEaWIN1+7hpbfxEK1BC8KZJ2iyTSHWDYGBBtRSK5FuoOu9tLdk6GrkkYECvBvyEZPAnIZp+mQ+1e4WcBad7nMyaBaMMC19P/QdZRIwLtZCQlQDjlS3hOG8GEXJT+Zkqd6eQGguzduYDH1XibNSap/90bMlsTML2ETUIODGgAiiab3DCQ4mAYWhP/YK0ruU7BpRCwgbYn7P31NiXzieMWAhFiYDODleieSApYiRNKsluXH3awE8Xc5HYEarL6PP9m7tt4oyjD8zHlnWna7u5VtMS2KIFISCGAwXkBM+Atc642/xCt/iMYbE+OFMSZGE0gQOaiEtJBaewDawtLtsjt7nJmdz7zv982hXapw45WTNE02czHHb973eZ+DyUiAarLZwT/OKAljD5OQCw81Z3TgMoYhyyekg6eTSJCNxIE/MVYIlRZIy+UWDsIBI9OS5mCOfSiTaIT9EQrJMabuk/tMFpIt0RglFzhBa1gCwOCAkDGDqhkIggECawi7bKN2eg6HrpcRbTUV22Hf9dDk1JduV9PvYfaQx0Vsup9mYBhGaOy0UK104c1MqusoyxR21CYaFBWdmlw4yTSDomBcx0DBsTgOo1FvYGqqDLegkHLSrFo22r0Bmk83UZyZh2l7kBK1gwvSV9l4pqnLqJIz587io0uX8cVXX0rgRZCetwd9qOHTTz7G199+gwsLp3NOmuOUo+RuJL+uLC/zVP748eM48c67lNmHq1ev4tqN63wPKNueCoNg2MX6XyuMNgqVebyfngfFzKB7cOH9cygVK5x5TY9WzM2Tjkq1wrWYsWfBVhFgpolARIQpc8Oia8qt2u/g+88+R3HTx/nK25iKVRahoyH2fRQ1E8MgQONxHY+v3cap+VngSBnapDOG+B68HSSe+H+i/59vOR8Fas2pESZf6lJ5GhcvXcLK70v4YeMZYorfi4dpMkmUzswltdQIY9h9IK776NafoTAzw1NxyrqHGfF0OQr7MOgBjSKVyzMOXOZNw16W3Z3uR80GfXRMnZttQTFYlFFPjvVzNUwUPbjTRfSWFuE/eYrA76JIXiOxjFFFki8tMqpyor8V6lrI6yLSkn11i8wC7+LOH/cxP1/DeyfnMHe0xvIA/mBbNMGd5G6XPnCBCNk9n/53uh2srG1gaXEZN2/dxsPVvmyK1ZtAjvW2LpsLyvHWlFEerdk0lWWClU6+AV12xPXbu7CJsUONgpB0PJpmct60zi09CiIx4zQhaFKrzP2SFmGkCgE2NDRsLnk7vRDPt3exur6BO7/exf3FP7H5fMDXxCGDtThCMGLlQep/MM4NS6bsGSBL8hLKyQ88G97sLLxjx2CcOImw9gbCooe+46CjCQyFxjF9VLAjHjLFaWK6yBThsOnjRcNH6JkozdfgEAPEslkuEG1tQguHKFD8rciDW7LdN+L8PCg73pfzjSTxmGKh+raFsFRBXK3CO7WA8MgRdKtV+AULXZKxmLY00SVTVWaBxHA8B1bRQvWtGoRnoSuG/L5I+0wJnRlkjkYT0IIBqzwBZ9RDa2fIk0pynHbLE+x/4x2uwCX5x3QZ3YerGOw04QU668VdFfmmxblS3JTI/K4vsLNYx/rad3izPMUN1KOtJgYKlEmAsEYnwC+37vIzbE9amDyUTKdHLFOjBo3ZYpYOlyQh4RDRTg9+20fLaMCdqsCdKsIhaYBXgObaMAkQyxlkJQcXD+T6QXK03m4drdUH6NcpgaIHzzCYOt3p9jkuMdsMdMQInW0fvZ+v83T94pkFiNhCZwBUyhU4rgNXj1EyiwiILdDvcZRlu/mCIzdH7TazHlrPtlNjZgLtbNLPCikBoKQSOl8Cyl3yG1D57KHIpmUjBQAIBap12j7Lfvx2Hzu7baytb2N5ZQ2PNrbQ6oX8fgciazb2PGm59SaRdXSjiNNN4mIJeqWM6vmziA/XEB0qoWto6OkxAk0CPjQQYQL9nv4+zsV+jlOiX3X7N3+HsXrzICCAarpRCFcILMzN4WipwozSiMVAqiGPpXaZmFIP7j1Esy5fI+sfQub4+aVBeyvEYKeF/uY2ln+7h59+vIGlpQYzhYgRNgrUHRNSjy9yqQM8sCgA5698COdwEQMrkQrFDDQIxcg9yLeL48cYzJO+VpqQE1gy/aPxPjVxJHGVk3+1Do5GLBVhp/YwHDs7SskpGA57E0x706z7p6g/wVNqIzUFjNXf628pJyu9CHmwVNawst6EMryVa6GmwMXEZyKRSKUGMznmlxpQql+yVTeGjayBTCp1PQeA6enQ6GV3PN7HKdhv6/d6235gDuoaWwgxa1Zx5YPL6N/sY6P5hJmLVAHYpqEmz0qiqBz5ZR8oPUeiOEiPT1Osb56Kq+GvTGPLIvKYkk6+cir9I2Xk6RoPhRMdfGrAR9KjWGbdG4rmPuIEr6x/5Im/JhkqydA5ocTnkyoSKj+fu5IrZCwAOawkcID2oz4176DP93+kGOyKtSJ7WwIL9u6X3jF1zjKhIHufCEgwDMmUT0CxPHudzkeCAa7yPlDnzUkbWYqBjN9UQJxpIOgR+KHY8dJtXLHzBSzLwt8AAAD//7RdW29UVRT+9rnOOWem04u90krTAMFAiFHeNCIPJooSY+KD/gAwJsb47i8g8g94MPES45uvJpgIhgAiQgkgD1Cg91LazvQyM2fOOXubtfY+M0MDFU2cZCCQ6eR05uy91/rWd2HeGk068sbc93W2Ik1K6TDK6Ry5G2He5LtM1Uj1BNtsEEzfyCn+5hfNjRo0MqI1Drk2gi6AdO9JGrfwKNoocjMGZS44/0L8/EBKtbM/oRlE123rMVLTXLcfJEtg8z1yeSTDB0Zm9OaRJk1Ngs2TBGiyXnDRRIw1FaN3fx/6945hdnGddeW+cTuV5rXSNLypUmwIVdmsoz/Qbv3CuLqniY1KlTL9U3Q3JQqcg62ZE4yBk3bTyvSissH0f/qyw8BB6HuYX1hBdXUTza0aUPQhiQ5K0lRRgC0TLM88wPhLByBI66c60drnBQGestnwvpJw+sBnJ07iyrkLuL8wywUcoW5bzQ2opQwfH38fp06fwrF3j6EYlnQ8BZlDmrehLNnUFswg+ObMGfz43Q94/GgB9c0GRl/chRvXJ9FTKuOd995G+GXEeiPJ95GDrNnEw6k72KiuoVjcxe+nHXA7Fh+0eTZtnsNjffj8i0/x/bdfc1ICmRgeOfIGTnxyUksc821cGWMWW2/ygR1yE2fl4Gx1Fb98dRrOnRm83L0P3RiAqoF1SlmzAcene7oCpyHQJx2sXLqD+XIZIx+9BZsBAGmap/yY+Hf6/J01Yc/7v8/+uaeTGXd6l/+bebATRv1ffv6fHk9i4DI3TjQHPeffCke7UktgfGIfjn/wIZbuPMCV878xE0iZnFh6euYbo7vJpYa3IlF9uIi+Q1tw4k0GBjyvAC+04CaKqegqS+CTvkwZGRBEu9FvZUprQzma1sEUTnovbh+a6NB0K2NoQxM9iyazcYKMaMSBg2JPN+TMHOpTU1i8ex99cOBRoZzGJHXn/SRVHbWEMvnZXCzm02SdRk3XGguFxUoTS5UZ3Lg5g5F+F3v37cHo2CCGBwcwMNCLUjFAEBQRFkrYWI8x92gFVydv4OLVSUxNr2iwjxpqA6Dme0Yrq1u2m+gUGepbVY4hhZMwdTyjRqCxqZkBrH/X7AM+gElu5pKniwfP9nn6xbMsMhsyYA1PqQkkoOaVp5gWg8Kr1ToeTM/j2s1buPz7n1ha3OTPw7WMgSOjrNpaMaGpgSnoWqR/oTpMzDS3K+VXp2hYAnF3Gd7EODAxjmR4DEnfCGTUhZgM9SC1fwLdS1SYuh7isouov4xybxfrLEUQIIlC1JZXsaxSRKMD6ApLKHZ1oXLdw9rUPfRQEZ42jD6dnSUYZLZM0ZEZY0ROLsnvKN4jDSjC3A+Bhm1jI/IgR4egdu8CxkaxOTyKDTdEQi7+ykFCk6MkY8q8yowOOPQRDXajPNoLGVrM4KI4Sy1fMXZolGqjtE+K6wnYJR9Fq4f3/o3Ha6ivb7EzeaZ8JAXJIIGIXDjdEdKpWazcfYgSafKzDIFhfQmNp+eJgwiEhZqQqDSAjbnKEyvfMfCXMAXR/dllnLt0GVFPiBfHX0AYSFiOMjO7tl9HRmsG2iE/q2/xGVyvVtCYt+GEEezAhxcFPGl3o4ClDVQX8aCCpmTNDLX1TVTX1tCsrmF1+h4COofIE4OsFcIItUc1KrX5Ol2+/xX/i9gqc6sJKheuYWZ2Ba+/+gpGB3r4+sNiiLDLZ+q7xfWZBRXbGIwiBkp4yk+1l9y2X6bSNB26QHYKnk6PoFpJasCGdN1U6zhC00spR5qovNSwUhLK0sIypucf4f70Am7cvodqPcFWploNhrJaQRhtpxuFVqIDTbII7NrIEjTICK5cRN+hgxBDg8hGRhiAojpCuQTgEUNBGzgT5ZbWfO6iz47zcMzfaE2H2ThVmLr0GUbJTwNadwYBlNn3tw08lGn/hIlMI0BFNjFcdHB4YjeGrCIcNAzlOuX9QzCjTGJluYpbk1PIYs28EcZwMx9O6XNHR/1Ss+1JhXgJuH3+Fvb0juHnn87i4pW/sG58T8nUOu0g/Lvk29CpU3aAA28exv6jh4ESSYwarRQaS+V7gkRTatNvz2S0dz60f6FqNT6c+OIIuOSo3oh1+g3JXulcNbRs39TbbDieGrM1AwaJTMDNXAyVh7Cvfw96nW4tkeA/YzaPzQEf1dpl2w/rGQ3x0zX8lhaiqLzpFuZ1vBpYDmQ5Pp+pkmUUKRLYaBBTCeQhkmC9uY56rCO7yeOG1iKZjdNZXavXW2dSwfUQFYsMrnWFRTiuj3IYIbBcBMJBSQQsb/IMMKmvS/IQ60nGSYenbYd3Ufv+28402l4fbaO8Q4N62q+KfutYRx9DYpfTi6MHX8PZP37FTHUOmZ1xXW7x1NplGaIwTTcnQZBu0AFL/8jrivvCTC8uAhDCKDR0+rzvsdk0XRoaPzF/hKl//KCg162yuF+LW0bauURcG/Nx2hA19OY7EpZOfBO2TrBop38oNlqXHeBd7tKfG/BR/9I5XKamXINCxAhL+Nn5GVPDHYYharUaSqUSf/+8rljybvOQgiUTxtsuT67T8nazBjkunxI0NJij+0bJzAaOhze9rR5+ULxhg1n1JE3TAAV93vqzaXC8ffv7rdfqWhJJ8jhKg6GnMdRnwpTM8DcAAAD//+xdSW8cRRT+qpfpnt0zYzt2YpIYJ2yxg0AK4YCECDkgiIS4RuKOBFE4c4E7FySOoJz4BRyR4BiQsqBEQSYQ48Qej3d77PEsPT3Vhd6r6pl2VhQhTvTFkuVlunrm1avvfYujddWyr9nvdrXTPxd60jUYREQvYmRubpDdicSCxnSDOAVggIhE/QUTie/HCEb8NzTSoU1CyCzEpsbNuEvCxCwwS8Cg0Yy8yLAPKCSjABOffEZCqHDZ3pNd8vVUvwvhCp4GPDN9HIvX73D+rZIP6nfYwVJqI5XtVoCy72nzKt4se3CsFBtIra1ucvyR67s6K9rcg4gjGCO9NVkGlaIHl/F9eK6P7Y06GvUGcnnKUM5C93UpNvfarlWxs7qEYpomYdl/bYLMBdlWmD59Cp9c/Bifff4Fgk6TTU08otMEXWzUavjw/Hm8dfYsLl78FDMzJ3GIHPcNkr+2voYvv/4Kl775Fr1mi6cfvqcT9pdrNVy7fg1n3zyDw5OTmJmexs9XftH/W+mc6sWFv1g+cXBigp95u9dlp/Pk1Q4IgbORTQtcuPARPnj/PVQqIxiuDCOTdXTcHrtxq/tqn8bWCXGmwsCFaruOW5e+Q+/mPbyQHUfFGQJCT9NMCfCxQri2D5+MrlQAZy+AV+vi7o+X4RwbxWjxNOyM20fRn3w9Ct//L6//GQfx1UfD+X1iQCE/g5lTr+LMuXdw58/b2FxZg1DGaM1MBOy4wZACZJHV3u2gVV2CmhiDV5lEN6W03jblwiIAL9Q1S1PmbdMgi/3aYaNvE4b2xUZ/URIAGMRHIbEp9Yy0QGZSCMhY1LMhaXLpWCjm0yhUimjNL6CxXkfWTqMnO6wzjbWA/BJM/dJTNCMP45+xB82HMCZmkcLiSoiFlVlU8rM48eIxHBgt4/Chgxg/OA5bNFFbX8eVX2/i8tUb2Oxo3xQILZPBfUk1Sc20FcdVETMr7BjzmohZD7TxptMK7YYxjhX60EoHA9q3aHpJjAuyF9UAgKbBkqlfnB1MMYKEa0sC8up13Ftcxuzv87h5axZ/3KmyEkjLM6wHBi2Rhg0Hr/shsxhuGoWNJtUz14M9XkL22aPwp6ZgH51EO19Cy/HRcz1OgwhMnnYYBlz/3IKP7GgBXrnA0pNQSGZ5OKUMHEuiJRTSQx56+S6yaR9jxTxWMi72FqsINjaRI0mVrSPVHH56UjMrlKHME7CREtqAq6eoveaDeYfWi/bWUgHu80fRGx9FODGGvUIOe06K49gsafUBEWJEUNNFpdkvDMErZ5AezUOmLSjXQmQr8z4XfXZLLPHQ01xiidhwRZr3P+o5aOLdtTrYk0A7pGkFGfKVUSBgqZhDulyCulvD9kKVNedp9qDYb5vFnxFLZ15I43XHzWqCGUFgR2ikfL/dnsOBsWGUiq+xER05NBJAxKAOTZGcEI5I6dhNZTPTwFE6jon6oaDTgO16vD50aCUndSvjsYEym2yGEp16EzLoMhAoel1kJCUZpNg7oxUpTiOIsImdRqc/NReJGk2tVisE5u7WUN/awesvn+A1LVXyKKshCCeC59ssOSJ9v9BEe96/aBHs+zWvsV+ZiTKkARAd7kmHK2ntpOLPk8MHbcEAgpSKtf7ETFyaX8a9uSrmFqpY3+lgV5qen6ALdgQPjO7/wUuaukPU4ICkRp6PcKSM8ksnYE0dgSwW0HAEQof5x2wYSMkfrmWkpI7L7IT4WQODtKBeJLX/lDAa/hj4EAN6cvIS6vFsq39yxf8vWcvoEGeFHZw8NIVj5TJ8qkjRIB2ETLlIokS9UXV+AUsLy4jTgMVD4PrB89L2dwR2/fD9T9hYWsPVq1ewtdMPPElQvGEGaZGOxSSAUETIjWXxxrtvwx3OIrBN72wAcWHWiw3fDHjCAEQCQFB9R/j98WjJjPS4z+XBoBkG9j3GeJpj82GNZEu20hPkA/lhTI4cxrBb5om5MEyEfuTdUz8n67H9lh1HcirNHhUpF21zQG6ji7rcwWZjG1vtbazWV1Fv7WKzscWmdHT4i9nK9JUOl92eZjzTvTvGSDWXyaLdbCLjZTl1ZrRYQjmTx3hxBOVsDmU/h4ydQs4hNnFK1zMTr6eU1SewJp7C0y7GvmvAatA7mx5spPDc0BHsHH8FjRu7aKLJ68L1m8xCpeKIY95PiU0ShZCRpZnWvYCHhZEBehBpYz8kpCMw3sFWIkWOPSSkNAxynSrhGGa4NpB0GFST7L6v3wyPkh/HwERM949NAGMmsT7DaoZC7BnQP8vyude8RmIO8FSfWA77WerUxyXj/vpG9gSc0gA92q/rJ7CC7/PRb0ItkYjT7R6SWsDJA8TW4nO2DZfAEjIjNLLx+PfoPnnK79gMRhHDIo7q5J9RCn8DAAD//+xdS28TVxT+5ukZO7YT552AQwq0i6qLbmh3Rar6D1h00V2l/jC6r5DKoipUqJWKUGkBFQQVgUATQhKIkzgPP2bu3Fudc+8dTxwobcWyIzlRHNvz8J17z/nO933HP7Z/U9GnhJmqTu5Q2zWbxCtb6SewwLJpjFMjV9p9LQPwhxBS1oEYagPTQ0SSDwq60NqogJYsQ4UwYAIsWiIGZg5y6Iu3NIii8YHvGJTH1w6kjjd8yvJY1ZURZC9AUAnROD2P2sI0Og9WEUG3TMlnVcdUpU2P5VZHYK4qEBFiTXR5RpwVIy3b2zvY2ztApRohKOUqLP7GNT1GX1PPtISgAUBBbhTvsxHgy5ctjE+NIxK6es1SAapKd3vYWllFrblIdQRDdXffTnJJhxmH+OKrL3H73l1c/Poi+onu+xuYT08zhWtXr+Lad9+jMT2J6alZ1Go1tNttLC0tsVMt4TcB36gOa+3LQYxeluL5sxdsokU3+IXPL+D6zRs8uXPgkqbYbbf5cyx9hzSMR5ZE5XDyb892cmKUHznd0q75zqsNbWiBJrYAv353HauXLmPrh5s4K8cwVz8F1SsxvdVjuQBVeLWOliehkg8/UfB2uuilB3j806+Y+uhDEjHmFY//t/+6DVOqi9vwmH4TgPEa74hjTJkhjZ/pP80LcGMU5z47jzt37uDqN5egugImdBm0JONajssVbXe/j+TJBqLmDrzmIaLaGJQT4cDv8tjpk25N6pYsJGdzAv9IUMNzCiXIhJAXnudkVNmE3D2iPs+oImmo7cLR5krUpqtDuETkQlbJ3byMSngS8Wgd/tYu+mubSDY2MZIJThBLvNClXA3IcmTBkqULFGtbpbcKc23AjsN94PatR6jEwPhEA4unTiEMynjw6AkeLq8xBZneQ2aEgpMDTxsHvrYDhgbeaKMWaW6mWRc0F3i+7iwQjukEloNMWi+oLSJp8FxK/ANIj3pF2+urUXjfLXEg2+8JPNvY4uTl3t37eLy8gqcrLRDwT0cU6uhLf7vy+ARi2RGGLK6vESXFRE8l6YLro0NrWr2KoDmH6rtn4czPAONTkNVRThSJ7pw4Ca9r1KGBqkyC5pp6GaWpEcSTo1Chg9STDBKwU3IUInQqfC69XYHDbg+jjQixP4t67WP0l5ahHizjcGUNTr+PSpYigMx1vcoZMC3SVFffBPVrpyS0XEEyMQpnfgpiZgpyYR6dSgVpHKJHVT0z/pSjeQ1UuaTqflAOURqLOfkfmaxDxhqwoO42iuZzS4cvmOAZzEwzWxQFMB6ccgnxeJ3HcsffgzjocHWYfIWimJgaPkaaM/DqI1BjVfRozG62gIMuAuq246hBSzZKeORgdNk4RdhDIQmi8Q8gWLm918cvN35DHCicI1f0mQbrywi0k55mjEjjmukak7lUJVBc8fQQOroqnSUSSVdwspzante0H2KrsHZbwmMzWsCPI119Uz6CcsBMg1ZrB4cHnSN0X2uIaUsQPSGws9vGlR+vo7W9i9NnFliSs3Bymu8pDVa7HPco0yrKdlBC4XoIz8yD0jefKzmGCELtV8TgmXRYypj0JVo7OhZ58ucKVlfW8fjRKjqHAt2C14XnhEbkQecVcBJsgRnXsZVsLdOjBF74AbJaA9H0JMLFE/DOvANRK0MQOzTT3U4cVwMUqtchd2pm4hFFPjUAjpsn1MowFzTgn+X3rf1tkoCcAj5gf6LQyk+Z+GCYBfBPzY7z17uKvS7en1/AiajG82zOOiPwmGIpVyHpdfHw/h9YW3mp9/0qRLEggdVFI30919fbuPztz2zcSjUu9kEyEIFrztc1Y4futdSMvfOffoLm2UWWjNH95QWOWRelkYRpV3bHJFmZ+HuPMD3GvCN/H/GwsbTxwlyqTH9KR3rwlYt6WEFzfBaz5QbigcDuX3f3edNmv3/pCN6LVBrQJBpuRkwJZqgJtLCP9e4mnq4+xfrWc2xsr/F74OlxydwEMkWv+IiNx5fVbTNYRm7w3NkjRrfXhfT6SJwOlBDoSRd7/ZZm3JD3mAROzsxhZnwSi7NNTMQN1FFFzMyA0EhUC0WAws+3WciRBgQg154SPHyw8B42917g1tLvENy9xgbW0rjd63Guk3jkJniAZhKxFp9el4lBF6DMataD3IWfn5fF9nua4+G5A5a5HGYwFYrHMEXqY+DekOnfoG0vSQtKOQuAjsVKB/RjEBNqk8KBsV++vwLwVUzQNcvB1d3LClJ4W9xmgFVm3Ou/uOX+BXTfGfa73fT/NEuBYyDOw80+7b1KvgVJwvugHNICE7T/4jXgh5L4CwAA///sXclvG1Uc/mbxMrbjOLGzErVRA1SQSBwqJLghJA7lz0KCY/8T4MAVVPVIkRCILkoaStomzWpncbyMZ94M+n7vPXuctgkSFSdGysGK7Jl5M++93/It/giO7xqog/E1zPtjE1WgAwbmn0oSlB9DASBThXUz3Lck80CGPA8jWsBJ4Bput92chN9hBAQFUqN0JVteLuMdKRWnnPXyd8YoABhyHezTh8D/hfPvaZXK1ynCuobXax+82NCoGJPXGlhcXcGDR1sigGdFPezCNqRIsAiQAKe9EBVyScyEJAWhXCwhjhSOW8eoTgWyyGUfahYVoa85EfVL8m1IA+j5PSkgdNs94aEUSrauryQp3d7cwMLaGqpztdE1vYUMNDV6BrlaDV998zV6gxDfffu9bMq6g8euAF+0giwKnZMzPN4/1HBJ3o/YB+qEhos77aQ4puyEcBwJt/aM8N6Xt2/jzp072Nl5KVW7vOdhul5HxcCmeG6+0GM6AI7eFqjUbe3cXBNjXmLZm7lBy/nvovXTPaz/8COWkypmvRnkkgJU6ukExLZaeY5+T6uI57SfZtI6RT/qIXp5APT5FpSvOOn/x5uPyyv0rz/+PYIizQgjuUM4oA4OWcFlWLTw4Qf49IvP8cf9X7D3ZMsYbl4QMEqZ3HoIohi9gzM4u02kJy0UZ+cx8BKZB+wGyubICq7okOhsTOenztCrWycxzpjDxmVK1paSJLA510LvFGJubuwsc80slxDnfXjlAMXGDPKNGbHXSvYPcH7UEr5d2dUMSNe188gxkEuzbZqBEtQD3S8c3QlgcMJOTkguQRfo7bTw/HlLQ9TMd0xIIDBUz9HIKVzxBF1TvIvCWFBS1neYV8CiR7U6qbt9iXYuoNVVSm/rJKe7zOxCCPRdB3iyH22vAAAgAElEQVSdfoRu90zE/Z7t7OHh+iYePF7HyXFfApkotbJ5UsP/B+rh8YiyAe1Zzi47u6c934X3zgJKy9cQ3FhBMjeDsDqFhF1e10PPIS2AbOBIdpDYTaTbVGxUUVmYhjdZRFrQARf/aMslTjIphZU85GmR6sboRDGOnEhEZsvBDIJKAUGjgXD9T5xtPkW/eYzqIJTiMTuAGqHmy72epxEUA58gkES/8N4NBEuLiOfr6BQLOCkVEcq6q2kUeoFNtH0b3wEWK4IcgkYZxekK8tMVuBM5TbFgkOFpwUWVSawuvreCBIAuAnDf8wmhZ/c8R863QngaafeIVKFYKiLJp7L/Ex4pxZftOtov9uDtNRHQl5xzVvjJsRadS0d7g01hUpsAm1kcUJk6Vtg97ODu3Z8RhxHWVt/F0uI8qpMlEbbkGAicklZstG9MlUY0uMZNg8r6Ob1nKGPfxgKJJBZEV6pYun4S0xjHHz8ooN3tyvUEpbJQWna390QsU8HSMkZ0Hw4n87CB2b543vu/P8KL/V2sHq6IhtHSfB1Tk2VUqiXD4U50l83EONm5lbjKwGJdsSdlEgiZZzxPiv4gQrvTw0GzhWarLXNm6/kOXmzv4uRsgFCN+iEyKx2tq5Sk2WRxhJVh4U0ZW0oWyCJqKkzWEFxfFmrMYK6BTqkoib1V4ea6SYoJmwiD9jl8xhzUGBHrqyJUJt5kbOIZ0T1PoPK2428fvOXsjz7b5N/C0LOfh8eFNXiMF++8oSvNBEl1sThdw9rSIqaltBINu+w8+qQ9qgTd5gmePFyXfzkWTWCcDV5xkrA/b3Q9rRuGq13zjETgsO8/tk/RHrufKKzcWsFHn32C/FQJZ3FH1h5XxNWylDgY9X7TmU3UlQWQrP8543LhfxvqLCHVIv5m1n1pxpmbpcuOH7uYm53DbKkmZn/ekEH/dpP/V67ZFIe5dscCSo+xr5r46+gZHmxv4LB9iA7RPZx7+QH8nCMuHb7YOztS/FaiRK/tgOlyk3JeJZGsWVIgDRyEA9J8FWr1qrEj18+IeVEnDGV9Pz/qY+PgKX7d/A3XG9fw/vxNLEzMYGGiLg1IKZr/B8hRU9qQlqKLCXx885boaz3a3hDxG1oDShhDPRyK7Lk0z9IQfZsfSn5mcysD1dcFyXTo+2859VZIL8mgzMUlwFAfrU1xCgwpAML/N7+bGgF02wS2SS6bzcq4BEjRLJMYCWWdTWqjZ2cpHFTdZwPYIlnsIfSEC9a50iw3yHR+19oGcoWWa/R1zMLf5r1bNwKew3GIDhkh7O3Iyx4fkxaghZTteXhk722o6s9xtpaKjqa7Sy7PsSRqIpeXaxD3BWPZL/SBJMHfxF3LbxtFGP/Nvu0ktvNonKR22tCKNpQCKqqQECcQSEgcuPKv0YIQN/4ADnBACNRDpR4qUZUSqeTREIckTuLE8a73MYu+b2bWmzYp6gX2EEVyYnt2Z3fm+34vxww8DFVxafIZGWOyR4oaqXX9dMFOUSYsUXwZekN6j4KCoJ9Qp7oztl0YIZCvgGoAqsHR9zCdCtNcKBfGKkvU0uYOqhFAC42ZRAb9l/moy0H0HIr8M80NqQlqqlOlaaP6M6jQTKU+ybTRJNbthI3Z5UUEM1MY7vTZaEJqDaU5KAaDbnKiK3YHQzTGK9opWvkW0FjS3MLefhdzrWnIrMIXiR7u1BhghE0ocwza0vh04TyiA0rUGzVEccrsAUIGyM2X6MQ20Xst1SU6OjxAd3MdteZF5KnHNFeF2okXTPnOO84TR6htXoZGax53vv0Gi+027n55B71Bn70Y6P+cLFMmFVB6XqErcDrH7DhJngv0YMhs9nINMcSkGMOtGze1/UKO1qVLuPv1V7h//36Rufnu7dtYunIZiYzZBVNYOZ7vbPD4xOlSTJyJwIviRULbLLbPTDhGQP7xO3777ntUNkPMLr2BMafBSB5LT6JMV2MpQDnhlkA8CFkLansWo620aEzNTLMZWfl4GY5tjhdjWp5f7P5vicB/dfzbOM9/XWgsnmY8LaLkrkz5xkKYHrmigJbjTM2WlFBj0vzT7Ej1QhaeDPDrTz8z4vfxZ58qrwkL+OCTD3Hvhx9x0NlB1j9ROnAkxXLM75hJVMj9tttHf2UdztUOgouLcKsB6wDzoIo8iNmQj0zTMqH009xVNmgIfZht6z1nzvWDVUSHiuJs8DOqyHx1eJwW6e9ICUuoDWkQe0dwwxBWPERC85ecRGs+IjdjZ++gOYl8ZxZY30S2tYs+PWMEmaqlqj8m1CJT9hw4deSKmktGnQmhh/RMy0awq0l60sFSOgFcsbs4PijP9dPnnDtFS8fJ8EsmZvNNbsMubyrCKIXjuUz5t0kXWyHqpdRxny4G4RBJFqN3NMDf3UOsbWzjWWcXT1aeYmt7B3Gco2wb4/NaoDcSpb2zpWNmM6k3rya0TBPKWO5L66OwEZI+r15HZakN79plyJlZZDNNxMEEQtdH7gYYxiEj+yliSJEh9ZmOhNpcE95EBU4tAAKbY9eEpbTztvGq4fgzdY6tcR8B6hh4Esc9icFxhjGLDAM9OHUfWGgg29hC7+kzpIcnGEsoQlahSJGQSPwxZM1pZPOz8BbnMGzOIKrXIGsNJLaDKCIzL4/XyDgZ8nOZlLCgQpdQ/3rAyH8wVYc77nOCTqpReNIcp9p0URTz9PRKk+kNuC00k4OaujTcio+a32QabkZmrYfHiE8ibhxR8gV9n6gewLl6EcnkJLypBkS9g8GTNRBx2OX5GzHiSnIWnCrcjA+EQkxzHVkpGC+V2O/F+OXeA2w86+Cdm8u4fv11XJif5k3bWLWKNDphrSw1UzLdtKGNKjtNx6lyarYV6yEXmuouLFQnqirKzbPVkkI6YQI0quOcqe9Wq9jbOUZns6NQeC4Xk0KeY4zfyjZmUrMPV7cPsLf/AFudLdx6axnt1hwutedRm/B57WS3br0nonEQ644QSt9Wbtz0eY7jUcot8kTioHfMgMVfnW10D3p4urGB1a1tdA9DSsflwp/Xe+GosYxuV3XfCFmAJGqsep+UqxjMRAgMyJep1YK1MI+k3UY81UDsu4qOrmnhLhse+5jwAn7mDrZ3cXJwgNmFefj1adgVgX7ucDoBzTvHRC3bSt537qphNt16n2KKfm7CnoH8G9ZT/pwR8cvo6ASAkMzjWnsJV0iSCGJaKVcQYpISC4zG5+cWnqysYuXhY8TR6Ovlwvyi2bXmuWMmrxj9rShEAaLkbgFuNDEbQ6oIUplkuNCq4aMvPkew1MShDBEJrb0mdJFvT21ex4zbWBWcZ6RsKSQUhclbOalpZHZmFeliNO9QWslZ3ksGtsMMeSRxYXIBSzMt1v1XefbT3kq+ErZ9nsfD6PXRBbM0zZ3ODzVtI2To5j38ubeGR+uP0TnqILZDWIRiCQIlA3h5oCj+5EExTFjyYylwWPmS0fpgq/lPbD9HqvEP+ke6oMswJJa0r2qroTa5syqAm1mIMoqytXGcxHi4+ghrnQ6qeYA3X7uGW8tvYzx3UbUCxRg4g0r+qgyVfNQJ45/y1PmRDDPSVZvzpvH+jfew3zvC1vEuR3W6Yy43TanApGaH0ZbT/UcJPOZg+UcJeFWyCMWMoJrMmMYzVKjN9wyYzMWrBoyFGDmsUyOJC14NHJMnHYPUMlU1oEbpjQed0d6jxD6gvaJJFDDFP32ukgoQEK4dNBjoOKOi0A2Fcjy5aXopMJoMCEdAB7O9S81KU/wbWUD5fWktKV/Tsmy+fPAc0PH9Rb2tI9tdWo84blClbkTRqD73iB0wHOIfAAAA///sXctuG1UY/uY+viW2U7t1TEhVaCmlXVWiwCqlqtjwHBUvwQr2CBYgxI4HAPEECHVRIUQ3CKFS0pCGpHF9ix3fPWcO+v9zzngSkmygO47UyG3SeGZ85sz5v/+78PbFxA4c/+WsEdCdfvYEoO6V5/HFUpEIyrzFaF+cFDqRPnilHZI693HxfYc1ZlHy4XoaNTIggHmtEKMoiUtI+wScpPu3j90YadMGXlSd9CRfMBJY9wF74U9gx5j6AoVaCYVaBd3WSMUOWov/LWPjlkp6T6BLhkOzCKXQhRRTHWuikC3Ss7fbHaysLCt9i95smk28klYoyQNTVR2bzzmbCzHrzph6VzlfRYaAEwJgaOGlz0jGaDz5A2uvXIWbu6DdWRfu0/9NCUk7OhcffvwRNjY28Mlnn+KH+/e5U2EJmVAUod/V0FdIIymSTF7JD77ACnDvg3t44/rryhSKDBYzIW7feRd37t5VhiDk2eAv5Br2CW7p5r1OHqdQv6n4Z12QUAXh1ja+//Jr2I8bWMvWkEMOQthc8EltjmLz7n6ukgPEXHXRSOZBRodeBJQLuPr2TYBi12wzM/4fL3KcZOrD9HA2ehMJIiy1cR0XsSl3XjNIIqSDLDnSaufJJr76/At89+03WFu/iJtv3UKpeo7Xhmylglu3N/DwwY/oDYcIKNZOikQhzwuvVNS5zCzGoNnFZO8ZCgc9CFAMVxZTokP75BA+UchtpGYwA6r6YWkANDYEtI9uao48KMj4zlVO5oya09IUSTjjKWRvCOfgAE6vjVmrAUH5tBTL9PIqsLSEOUWAhQGmkQ8/cOHn80C5jPivBobNFruG+wRKsjZTo+dpRpjZEEMdKz++qfMtVQfKTml81dVJgy9IGTmdfg9b+g9hpKPBgBlDcaQBA0vFFgkWHzrcraQIP9IhUqel3xuh2++h1euh0XyO3UYbe/stbD3dxeFEchqj76qYINvQV2mmUOc2XsiG0rIHpsyl5xt1LymGkTYwlAxCur3iEtxiGdn6Kuz6eYiXKpjkskAmj5lNBrMOgyojBpEl5p6AWwgQErCb85Ep5rnwtwIlJUjH+JhiQ6T2IoEXw8378Jwc5k6EyLPQ7PSZupm1yygsZRFWqsjV1yC3djF42oA7migT3GwIv14D6jVE9SrGKwVMchkM6Lluu6znJNNZNg7THS6KuSOn+8xKAWExg6CUB7IurNDF3OaPggcbXOpOLxfBtikMT88Xl9rgSmhciE15l0sIY5tZXrQd5dilWawjKgNMqQj3Q3LvZYdk1w3R2dqF7PdQcDMIopFinvCeYCE/YFOoBZs2YXHQ1Z7GEs1ehNYv29jf72C/0ceV19ZRW62idqGEgHKm3SwD08bPx9JSBouShTiSSvJ9w2kbsUgcy2Vy/+rutLCYpeIHHiwvwM7O7wz2k+mwKv4XEYdO6r5J5kHq7/0Z8NvmHhrNDq5dfhU7L+9jrVbG6oUqG3DlyKSQ1gBHMelsMYfDFzvGZDxDe9RDt9NDt3vIHf7GPhn7baM/HKF7KFSuvKaSpxtD6n6MF8dop8z3+LI6qvdNTD4hMSPArlxEplqBe+kixqUi5ss5lsOQ1IU9I2ydKmSRtMJCSPus0RTOXguTp39i2Bng3BUb07KHaWhhxokSkucnki6hYn8oKekZZaRUe8NYS6cU/d1a+KuY3oH1T3j+rEErM2X/X7u4jjJ1FeVcJV9oc1X+ZK0I0XiOzV838Wz7IGEAmEbjKQmxybBSe1HFWxKpZ6Pp5qtnyVjE7FX13vt3sX7jMuJiiHE0UAwWAsIIADiGaByP6Tv7WBYRbFQAKYmw8f1K+aVYusiRyldCzGMsB8uo5s+h5JYQ6uL/RcsohQajCcLvoofmrI+fHj1EY9TE88FzhEsBe15xtz9y1LOH3dMdXosc7UfF50IrkqP27Wzgp/+Ni2ErYjkfMdVo30j3RaQZMpavTRdJ6x64iIcjBBmfJQUzb4LB5BCjaIgHj37Gk70tvHPjTaxX6lixl9kYz7O9M8/x34xYNxHpawEhLhXXcH39KkaPp2hP2oxIqWht1RlXccRa9mImrl4DTO0W6+6zrWnsZs6YSEgDtJu6idgFlk57S5jjmgnOPyfiI6xgS8cNHombN0bLJ7D5DHucalyqNcnQjyLa+Vhjyeuykb7QOZjYv/Tg99QJd8Z3hl7T7x6PBwjDDMf2GQYEz73Uc52j9TmdTtVKZnCHP3VeyvlfSwCodtF9E8MYUOejEhaoNubjIYBaS8sNg5rAATK4dB0XfwMAAP//7J1bi1tVGIbfvVaSyWkmySSZMTOtHaGlLbVUizdVWlCh4J03gv9DQRDv/AP+AfsjvBF6oRbxAAVBbMFSqW1npinJTCZ7kuzs7NOS71tr7exMjxd65+5FGVomO/uw1nd4v+fNMSDA0x30crmUXthnHY7Qlghp0m+YAWypII/AAYWZn6QbmJ09MxVDXdHRFg+U9LE3aL6QnoPMzOtzYpyRD9mHSGYYBbbDR92+bPfVLkZ0fmHy/O+XPRQDdyaorddx4sLr6N8lP+0QBYYfZf+n8aBFAhfA3mSMRnHFdARtoSTkazMcHmA0aqFaLaO6XGXJX2xgF7QDUbUmoXko4w9JnZxqqYzhwSH29/YwGo9QrZeRVxqeQmEW2Yq52zsYPtxB68wr/OLaAvGLsYfPPxYSWTpFCVz+4Couv/8ufvzhBq5du4Zff/oZO48eHQFhaWG1JFkhc0UTBgBubr2KTz77FB9+/BHpLrlTmxN6ubfzY1QkEPn5mS8m/0/UPJ9x/k8vfRDTQiVmFsn18MtXX8O98TvOlzdQExVIf6ZhVYWcttSgAgDDdgIk4QyCZqRpAYoCHMQe/p65OPnOVdSvXASquXS+FEj33f8xe//moeZSMJ20CRNKRabTIFI5mU3+OYhWod5UTHjEKSkllOQbr7RFTe/hNr78/At8f/06vEMPjeUVBFPfzAaS7reIi1fexolvzuC3BzucHFNnOrIAKsxtNEmCOtt3IXa7iPcHyFfX4MkIslgAZjkG85H7Cq0lgjyt6ZzzhntCwXlifahfEAYJTcMl+7vEC+AMfSjXB3ouVL+HYPcu4r1HkJMpU7QrSqB+uoKkvISINuWkiEPqA7QlSrUKisfWkTx4DEV8joMh1Ngl31eeTxSmwpwdk4jMrKi9KdKsPVYAPEc32bfAplq266ZSRRbSf5kXbSlJzxNxfOpj5nlsXcY2jSEpv2IEjoNp6HHC747GODycYTjyuLvf7Q3QHQzQOxizbZ8ys8JBYjuqphDN0l8n/V5aNu4snLXIOEXYgzgGE8p4qytwmi2oRgOy02ELs7DZRkIU+HIBfk5vJjFzrGcMJ+S9qixQatfgrCyxtJ3mpUhaqRztmY2MnZkyXdTF+DxBJAImCBcpEHQq8IuCE8dwH5jQMxjnsbLRRtRsIL+2hqXjPYRUkHJCYKWC+NUt+MvLCCtFTKTEWAAzR5hREorwHOOYQAXgJeTqJZQby6is1VFYLrLLBBXKI3ZoUWmH1CYwib2xYu7Tl2SKACzvtqrsI/EZl2bIkq62ymJ6T/S5Cxw5Y+31bopkVPQI6ytchCku1+C0W4h3H2Nv+z5W/YBHchxDTueYJdGdEw4ME6ty00G9hgIawBKA3d4Ygxs3cfvWHZw5vYUL506hs9HC2voq8sUc+7czs8YU+e0MujJFE8l/a6iaLkpmpKxsWaC7j5IpziHu3bsPd3DIIxoa1hgeeV/mSSGPMGQaeHQ5AgHsDn10b95C5+49nDzWxGvHN7Cx0UFztcl8Hhsc0x42m02ZN/C4v4e9fZfdOra7PfT6Iz0O42iHEMcmbg67PKaHzAwq6JvozIt9Zt8OuOtPCaiEaLehmg2I4x0krRamzVX4BWJGRYhEhFhG/HA4FNfxaJ9EQZAqUkFNfCTbXcj7Xcz6Lib0+04VUVxbQpzXPAPFz66BmSXKqO3VU2joSboCKC5uags4JRbXH5VRGarnzBWmJPvMek38iY1GDWdPHGNlZInGnkgabICLpFCjGG/qj3Dn1l+YuubzTPD6UrC7xQbuPOk394CSGPrwKFC07eDs5Tdw+r1LELUSJhGR7CMGXjNkka5bHM8ZALxsyZduZ2Q7rqliLc0D5406bTup595pn6ZC+nq9jc1WByXYgrx+L50jUSWOFPBfVuH6tCNhoXaIPlzc7v6JP7bvoO8fsOMTFWB1cU8iDBzkRJHBdjRCIYyzQc7YzYoMwJeSX6sec/jSCyiZRywJUhpppgX9IQk2vd+mM11grpbgImbskw9ZwPttngHCkpXMvWiIb29+h621TVw69xY2Kx1tp/oftZuUGc2SDAWUqEHgzZPnMRgdYLQ9ZhUA+8o7urNNuZumSMRpIrsQudvmb9bGXTrpvDxbVaad7oTXMwvDs91yKr5YRSKrujPPgv7MxeYzPyHCeWL2Pf2ODN3Vybud0accjA46JxqpontMa7U3JTXc3JqPP9/YGdrcxboc2J9tIYNZCARSpXgxou9ix78VvMBL5/UtpI8/n1xZqIlFPCrePwzPI6OuSRvxzC7Qv5uZM8YKkb6LPse5ioGZAaRQcIB/AAAA///cXVlrXGUYfs46Z2bOLMksSVuaFLqkQRGLCHrR3pTWG0GxV/4hEfw1vaygQgTx0kKVNI2NNClJ0yQz07PNnFXe9/u+0zOpxWL1xgMhKznbt7zLs5jC6kAcp6sbQgxQ+CrruhAzAP9TYZtAHyy4JEX9UmnjoCA/dL3qxKr7r7r9VXcAxYto1Ot8AwqRkLBadsY3YUoxG076LVMoJVrmfIVSwnw5uJJFgKyy8NADpWpj9VBdgbKqUlQrRTkvBPRgz15ZYc5lvu/z4mWUiZ3kaEgYAFXljwKgVw/Ro4p2lsAhLiiZv8xiDlSDYMbcdqJdEAeeBG4ECkATUPnipaAEvWSnXmNBQLIaGR+P0KNgzhK1OafR4MokIROebm+hf/V96NJx+W0Wx9cdZIsiSn8Wrt++hes3b+Lx5ibu3buHjY0N3P/lPiMdyPObtAGSWY6lwQBX1i7hzhd3cPvTT3D20kUURYIoCYRqMjKGLc/IuooVh21eRgwYkrLxT4+X/u4l705ZVAY+Ht/9Foc/PsBlfREDu4u27QJkbWQThDPjIExnHg2RvGL2V6aAjlAEXuBjd3qMfKWHa5/fBroNDhyL/2w5/v8dZcJceuPqHBSor18J2gp9vntI9pv+CcPrWCPD95FME9RNh/UzPM/Di9DnMdXvL2C4vIzecACbVFPl3GBumWbjxcE+vvnqa2x89wPSKOKAres00HSa4rroWtIpltfW8NGNG3jw/U9AGJWbfVENTIhHRnoAcYbg8RN42ztoLK3ArtkMfaVNjwT6NFNButnsXtySCu5NCeTULLmJ6Kdk/8SRTmMWzEzDCGaUITk4RjEKgL1n0PefIt/7Hc7Uh5nkrGh88vARhqsrSF2yy7MRU+W41WZQ6mQWMyy35TTROXce2uExRluP4J8cQk9yOFQRZxVrlczl5TvSK8nqHPoK8z9ToZ2CCmdln1+u0ZX1nCGgqfj+aBxiZ/c5W1KF8Qx+PIUXRxgFU/izFCfjCRdJCeo/8SL4seBJM6vCZG+i8snVdJnI8MaeluNKCPrpeCl7KK6UO9O6SGwUx5+g7RG5tZy/wBD0ot8HFtooen3EjoOp6SDmuqYliyA6B4ERWUCSPaNtw1p0UBu2QKytnPYtU1geyuyQz6/2Y+VtPvds+bpypJooqBMEn1TnuZNhHGG2FyFp2dzdHWsaOoMO+m0XheeBpFdSSvpbHfi6iZj43oyd0UVQxdleTuqt4jPB/dsuWsMF1LpN2K0GixXGtB7qwqmHCrmkfI0KSuHvdqDXJf8Kgk1JKFE8GosdzidDQm0gQyIRCRQvUeIck4hT24HWbLKloD1ow17uYLL5G4LxGFYqim00dk2ChufC7NAsUyYZi6h1SdLrIrJao/l1MML+s2NsbW1hff0yLq+tYmm5h3NnhqjXbYZWCuiIgH9SkVl0njIY1KWSAWxWoSdScRnEUWUecQF/4uHg8Ii7g8xLJQeEPJlLfxR6pjj1fJWWQpKJoJjua38cwn8RYmt7F2eWe+gudFGvNzieo1iN4r3AmzC3d+wF7HrhJVI9nsaWQZBkoWBeKH49+8kr8csKrkfNfV25hIi5Qh1nzWnAaHaguS3YBPkfLmHWdeHXLASmsNhxDIP1BwhCzbQjFlvW2KjN0XI00hhpFKI4OkEnLZBNPEwe7qBmd2CTU0O/za4APtl1aVKBSTk+KDy9dnplykT8lwkuMcelcr4rRIAmOykq4H+VHqAcRl4tMJhFjKtnLuBSh+D/NG7Dub8wuDmfYG97B39sPylV++cMC94khDuV/GtyXy3UPCI9K6PA6nsXcevLz9BcGWBqEnJJY4FHRsQUAu7MBaxqEyMX4/RNoeUKsYu/EGxTXcxyh6dGWpii5/axOjiPjuZynKz2iH/nmI8ZFMqIuv4xcuwEe/h1bxM7x7uYajFm2hRttwUzdVijp+W6bOtHeiNW02DXsZpsdFLSBgnDVlz0XDUoNb20UuRpTsmfZcO0BBqaRcJBa8u0bGTQ3GJRbEJa68IBbRZGvBGabp3XlXE4Qfx8htHPI3z87od4Z2mdiwxldKDoN3IMvO2hymQ6K/4Di7aLD9av4en4EPveM9h1m5NYQizlFEsoFwmpOaLLhZ3ytZJGaInfGVJThfI7fp6lIKA4K9vymWKfVs+aijDcMM7y0tdfK3UABPKK3esYBWCKBDjPS+F4AcE3yiSeRPQULF4VRrloVhnP/F5zoiMIeD+/X9r3+JxinNfr1OWnd0n/Q1AbhMgg0SQIdSyaTKcP+ht1DnrvYv5Vm+Uyl65oxZVICIpd8op2nMxxadzQc6X7EtdEjXJLagVQvk60bA1ZnuFPAAAA//+kXUtvG2UUPfOyZzxxHTuvNk1IG9KEUtggpCJVQlSoG9QNa34B2/4TfgE7ViwQuyIeEkgsKlGgqLRqS9KmSZsmrp3Ez7Hngc79vhmPXUqFsGQljuLXN9/j3nvOPcdOqxdKzEBR69Wb6AltxLpH39T9Uiop9TxffAZJoRUVTfYW8sLwcNanv7QEIBpL9m8BqqYAACAASURBVLOFqA9By1EUeBF6sJRtjQhnRApxyYRrcm4AUTy6+LFuPRCbHhkULW7AoI8/aYMVR/LcTr8jnrZpC0Gq+JinikhNOGPpJbBKBvqDDryTHlbOn8WDnV34rHsnITKRaL2ZcYy4qbQT4DAIMVv2kQRd6UFlos/3bnUCHNSPMH9qXqHRQuXVh0hGcVGUrKLrwA9dmWy+74kifrPZwNHhDGCXUfWqCINYkh1uTLubd7GxvwP39KpCA3R/Tj6AmCwKJK88YSZpM5p6o3v3idCsXriAT3m/dg3hYIBOuy0K/qTTFAseKpUKZmZmVB+Z9GZGskHS1zrSCX4IbcensFw1+RFpV4OX316dbGc8ECVswkXUG6J/4xZ++OxznG+XsFxeQrlQQq8bwKsUEQVdgT24gfAeDwJE4UDQnkA36VED4Vn/GEuXPoT11grgObCjQCq6WeuwkZe1Myc+j7pFE49fJCm9Qnn3PxZ5Xvz//8sR+ffbqyiTkT64bKUnrhEyMyujRCIHZchaJvvluNlCo17H5v0HePz4Ee7c/R31g2diSRW2A3QaLVRMD2+vrWP70Ta2m3swiw5mZ2tYXnkNFy+/j0tXLmN+9axs2lTupbbDvVu38eM336LePEIJQMUy8Mbr6+Lvyu2sIBxJNYJXrn6E7774Evd+u6mYOErbOftO3AtYC/eJXD9tYHB/C8VzayiWbAxMS1DtgbanMQ1lPxSLUq7OWBOl7qoiTyWVzseRRrAZvLN/LhmG8Igsd6i610PY7qsepIMGCgdP4DSewhy04XLNsXLNXrB6Ey41LOIqYlaOLSW2pPo/CxjEFloF2ggCpdoMppaXhcHQerSN9n4dyf5zTJkhCjy4uWbJWtI932l5Iq3Dx0i9rCGtSvn5Zo2Fq9C9dnH2GmlLUVHJImDrSRNfXf8ZfSb/QR/HQQ+Hg6HQnkONOKdlhKxnOi2m0HkmB0SPJl+cpfvI+qxH4Weinbp5DpA5xoSmy6BipiaIv7mwgO7CEsLqNKwTZWFUUEmfBQKxDWIS1A8VLb5kig2kWy1LguqUC0go5upZIgQpwcFYEqFGMk02Us9+a3wzzwi/kYyTJZ7A9Mt3T1UR2wmG+4cSKBDp69sFHHpF2CdKqqef6AOV/YlkmEoYkM8Xuio9j+kp7NkozNVQnZmBP30CZkl5stPiThIDM1VDUMHKpC+6kbXjWS9VNs8n/3l2AJPJxImliM/n+rUyfN/Fc8vEsfTb9kQHJxoaQrMlvbYbEiVyEZYdOLMe7JoP7NXReLgD8/AIfn+AKZ6t1NAhNVJQeHXmhJo7l2j6+lAQPFeS6S5LAwlw72kLW3s3UfvlV6wuL+LN9XWh2C+tLKFSm4JXcoTJo/yhW5LgU+w4GapgV9Bpsfq1YIvloSFryHPL2Gnuo93tIBiK3H1G989IFLnkM10n+eRGjWOCQm5sKUxMElPj4XOA95fcslMmx1iLtT5Kot/UElbCiB6fOmCkquG2U0B3GEghiQ4QgVWAtXga1tw8rLkabLqhVKbRI9pGkWnbkvXNGDMSKniiiu4KfBXrUhpk+tYQ02GM+tE+jKADT/QLgM5xG60/bqNG7SSXoEJB2VpCF1mEgGmM2JoGcufvqMCmbO5S4WBtKZqM9oZY+9ynzLGRUKBuQcKImaYQRz7uwk1CfLCxgUVRVI+g5FW1eCZZH3zFdoidu5vY3Nr9R7tEY4K2PO6ClPtVJ1629EaHI0cDk0WdBAvrJ3H1k48xt7YoeiM9M0TAGR+HcB0Xw34oMaeAZEKrHjEgzGS8RzkvDp5usimrN4om4xW9t+rCrnD1Iop5FmEQWY8dnKm9hpOFWaH+O7n9V6XIRhZkJ+MXcnII9PUcf2+exUYy4gMTUeVaPsYAf3Uf4s7On3jceIJO0MFUtYzy0BFGnnwKxxAXq6KpdKPkT5aBXqctiV0ioqWOjJeVVU0snVCqPuxYJ39JmvNA5TEOz5EoEpccJqvMvXrDoRTomJcMtWZH0fO1PXtf1kZhykIvCbA72MPXN65jf+0IFzfehZ8U4VuuQl2hXFriXCEbGuyMx8bxRc2AyWgwvRqRokqJRs6ZyiLeO/cOvr/5E/pRB8dBG67vCs3do823oZB1GCPF/JT6Lgr11D1xbFUEsMwxS3QrpxEnmmiGmdHZOS4lttJRh06JqygGQag1P9QXF0CUgqamfARTWpRFM86yRTso1Hkfc6MgUUz2dA7n0f0MABcXFz0+7KvXGgLp/3MNEUfn+qH7UN4Jg8sh1W1ikYTFgbygH2MnzhPlXKJmNi3gU9Y6E/ZutyNseH5HFkJYUBgVCpjsk3WjCj/8jmyboN08WSM8xwR8l/YARxgbjFmpIZQkCf5m71p626ii8HdnxjNju34lcZyqadrQUqgQK1QQC4SEEDu6Q4gVP4wdPwAWCLECsWANVC1UTSlpmyZtmoftxHbmfdE59zGTNFGRKnZYiqI4iT2ee+fOPd/5Hp6hRKhiRw0IIcN0ANx5D7zygCsnSiEWnnVzpOKfBtflCCaHJz0d7OFkrMwFyR2RB47i62oWIUlTNbh0og2935xgo4m3J1MnBhhHQ5yY4NDggJEoMKDgOKhrHwM25ItSPh7qvtNFnBn2qs05rZLYVTe+7tdRnw/Qv7qE9V8COImAIASFaMWWyqgoi0QHjmldJzQ9SdAgTbJUWn3WtMQZm/kN90fo9+ftQssGFhoE0bOFPy9NKgIrKC6i2WwyCEAddpIBRFGCMGzwWWBzmXSGR/du443ePERzHr773+mDzqKneWGADn2RKR5t/k28h9kmOpptYTpbcF5aJL7ygxHRonR3j1P89NXXaG1PcaG9jK7X4XNIcTxpFPPmlyQbdIzcm87VXpguUmJ+zIoUOzJCtnAO7978BBh0eBMpRBlJ+P8DenzPmD/6u6uNtwoofbXQG89cg4ij/RGebT/F+oP7uH/vHu7evounm1t4/PAh9vbIjGbGqyyxlQPpo5673P+qX74OLyqQjCdciCWjCdbX/saPP/2Ma998i0+/+AwffvQxrq9exWh7Bz98/x1G+3tseCM08ru6ehluGChXZVnYknWwegnvvHcDa7/f0hu//MTnVbM9LAT8aYrDvx6hvrkFd74Hn7oLJsqOqIGJ5KqUwUtjAihd6wFAmn7uHhvAlK4p0njRTYw2CnGObBYBcQSwBGAMZ28Id3cHHiUQEFOKiFtOwXPYTzLkh0cI2IHb5w4U5+OT8zfpbwOfbaoi6kZkEn6zzl3VZrcLubsLZzjE0dZTTHZ2UCN2k0zh54oV4EHoGtaU/xXd5xkzwVwvVQCB1aza74dOQyyBnWmE0fqGpm2qr8jCkYqWqe4VSnqkbo4aTJXVsTn+3jgmTlBp0w5/Eoc1nTMyyiMDUsrYbbfRJM384gKcxUXMznWRtKmgCSG1nwBH6jFlT3Kef0EbmtBH2G6gOejA6YUomgKCMvI9dsrTtMnTVg3HasdPHn91zTT6+sL43NQEF/lN2pz4AZLdMeL9AxwcZSqWTurscUHzQvI5zNikVa3PWU3CJ0+CdojOhT7cVoiwWWdwM6fPKVRXMMPx+yW0lvXYda43NjpBtXxelqy5k+t/2WFVEFKhQSDqIQSNEHNLS8wcmxDod3AEGeZ8TNMsYXAtphQdVyBwG/C9C2gs9LGwcgnp5nMkG1sYDkcoRocI8wQtorc66g7KdH0GnWUFDMq4dCsc9QxreiWwPaYs/E388ecmBv0urr5+GRcvnsdrV1bQm2vhXCtEoxFyMUsmjl6o7iUKBDBUaMFGTS6BzKnA4XjGILTUru6nXTFVX4qX3TiNFOcsH6BqJ9t64p3ypqJCCT/2/9q7hOQ4R9p4a+oHSEmS0uuiMViEs7wM2WlDtFtIgwATAi9rDrMLOFJRaEmmdOzVzz4cUgOCZAToZBBxhNn+c4hcdb1ovOr0CQ+GOFxbQ2uug87KeYxJi0xGvTausjLxZBUEcOz6YH9lm02wIIDQndySyn4ClbHHXt4DyDiv5mZYXejhzf4ALUj2hakW79L83yTG4wcbGB9mKs5QjfK/30XYmljJqMjlGzrdIhFqjRxcW8TNLz/HtRtvYdIQmAoCaDL2TKA9cM7MX8mG1PQzF/NC7TuTtMxuP/XtT0lFeHGWlA+vphhtFJXpxsCgO0Cv3mWYza3s5nMNlbwKh9XQ8PVPylMFAlNEeFbs4c7GXTwZPUHmpqA+AK3+FEWaponNTH+hcZlJNhVXdPGSDm460qrb6rI8jRJpPEfJET1HASu8t9HFHQEhrBVnt/gaMq0lR4Uuz7WD6yD0Qx6DWGZa8AjO4L+1fgdFXOCDt9+HmycIrCfAq+9ES6aPug9x+gmZmUJgee48riyt4NfHv3EtQreOgAwRpdllyxL8Mf4nVN/UymQd0/R13VISQB1rprSbfP0o5udnbJaoIhZN01c1gXP+TuNBdZ0BoKpddK5FhdK/Uz1ijPj4XOs/4+K6VrMm98dS2awXBpm2K8d/I0um11JsKiWjp1Qxeh3+fDYa0MhxNEvhxGub47Xm+FRHU3xgnlp2AdXkNP5c/JuYQI2os18aARNFwXUur1v0e4eSZmo6glH5NZD5H81VroXjGP8AAAD//8RdW2sbRxT+9iLtRTfrYssGuwkxJb06kIdC81L6Awql4Ie+9f+1NFBIKRT60NeWYHIh1HYStTQmqiLZ1n21u7PlnJlZrSTHSShtBwzG613t7oxm5pzzXWyRgRrSQw2HIz6YhfJQp0DDezITgaU5XlqFX2coECqOWShvgHgvyiJBRIscfK34qDslG/zTA9hLvv3sO6ksDNIg8gJohW6SRqASC6HMxkm4ieaRzM/VthHpZxkmJmHMm6Sk6mDr3R00r23j9MHvcC6cnFRmKAFGnAAI4XoeVxgpeCTxnWQWotfpods9Q73RkFxTYz7gbOWuIGIJRiSfelK/9j0HxZLPirzk/9vYbDC0k2xwaNKizYtjCPT+fIJJ9zo8t4zEzP/rQirLLZtdzIp6ZOS0Vs657B7fPDmwdH0DmEtpRCTxjqff3cGzn+9iz9xA3S/JQ0KqOPOkEktltliEcjFgP2FZlSYkQCfoo5UMcPOLz+F+uEtKJNIlgKw99KSpuer/dQf8z+1N6A862NfZ85g9tGOcnfXx+LDFVf4H9+7j6LdHaD05Rqf9nCk8hDKRImAE37K54kcLrE17n9hAsVDGOzf2UN3cxNPbbfTFAIawWbGWJsJHBw9xfPgYP97+Hvv7+wz1+/brbzALAratpEHnFH28d2NvJcVI30vT9XHr00/w050f8OLZyUIFc16jMHnhI5jn6Ukb/vEfaG7vIHZ8DgSIS0huHiH7WmvHFJnVTsRcW0WIqaokSNtA8rWmiiL9jlmEWWTwBo487IwghBfMYA0GyA1GcKehrAYq3i7TlsIIo/M+qgTXJmidJT3rE9bxosquLTm+jIxN2DIKvoEJUSFKJoyNEvI7TXj9EaK/OhiQvgBZcw0nbDPnk/MHC9XIypFYoHWsul7ob6fWg5GuMVJQ1ZbUbO4zghIPl+YKqurnDUnz0pv7RFVB9d5n0YxsefyJ9O8iTUYa7MUfK84yK/jXGnC2mjAaNcTNdebLR77DFIARQf21YJiZpDz42OF6HODlkVvzUdyqwqsXEBdMRHkDIicU118oDYSXTBTJxd8o/d9SyyLzjMoChR1YSNjRcLjK5LhFjLs9RKOAx4uIJCSdqhIgeGXO5BdqVopsw7e2XodbKcCrllmKLuJ3kqhkHVJ4cVbp/bL2quOv05iPTsr1voeKumZoD1hYEyML0XCMIJAJLxIXo37JV8oY5SNYpQpytTr8K9cQnLzgn/C0i0G/jfxsCHtG66fJcz2NX1sFbIYeQYqTbap3S49NWgmjROC0fYaj9gE8+wAbtRKuXb2CbRIMbNZRXy/DLeSYe09Ct26pKKHllgospxG74/TPhzg/m2A6ldaFejxnt/E6lr1MEeeiZr5kjc0iCtLPWF5zl6Dtiaqq6fOGVPG3TYS+j7C8hrhag7+5Ba9Orhc5BCVyvZC8WtIrCHUwbYhF6EfGG18+q4zeXDuBbyewxQzBcKgCMg5JkCdMchJj3OtgfPgQRdfGlFwsXLnv4b1qojFBq+iarN6IvhP97zL/amQoppbiLy++G4kYUExktm8mJKAFMwjwwVvvY7e2yer/loLX05wqdHLJsNHr9vHrLweYBItytq8K4FaRAnP0U6yoM4lnYG2ngc+++hLXP76JwCWNiIiLG1L/Qhb/iHZKW2gORmm/qTz/w/D16ZccrMarNoErQorCYCctmoPsxEazUseaX2LMn6U8kOS+PFbz8+r8d1kFe/HDdXUPfB1aU8YI8Dw5x92jA3TOO5jOJvAKnuSaiyStNoNdgcIV1xJqFLQmKsjT0HEW4aXqKyV/olwqbGcqUTih3gFL16o9vptBH3PiILZSGzwdf83V6WUVPRvr0KlTjHG/dY9HxK29j2AyjcJkVKKV1vz/aUlKxTW0psgnwFZ1HW9f3UXrtIXBbMTrQ6FcQKRtLJaaqdf37FWVZkROJVpk4GtyzKbt5ikeMpcCZlMVeim+dJxcWkReRp+kCvumkSLGqZ/HkwnHkYQAoGKx5NjT+J0jwrP29Qt9rzn6LJch40qtC0D3PCIEVzCRCC+mcpAQoHwnHjkwcQyb3TDG85hada10IZiPbe0soGkO+pgUJb18YeWxp4r8gtBm2WcC8DcAAAD//+RdSW8cRRh91d3TPT3tnsRb7NhJnDgIAgIFCQHiCogzHPlhHPkZ3LlwQYmFEYEkgLPYcvB4ydizT2/ofVXV02M7KFGUEyXlEC/jXqqr63vfWzx78vZDRctW+WVeZPs1rePIKxr9VB4SyVO0uY4kwZsi3hVHwrTMdJTIB/Ow8P/8nqCB5oRFs5ANy+IfJfIyGaV/AC+G0tFw1SXCMSgaH9LMPDicHHyQRKcxGJ/rBmkvdnUSCQJJ2iwpK2oI/1KE1ffWsffwqRhT8QWUmGOvkpN4xOxadUY54hr3z7XyPFioJKMRjo866J70JGNYWdzX0CUd2fxb7UcmMT6UAzSCOto4wfODNvqdPuLmRckWVgkppBncPEHvcA/7249wbWkNyvfeOMX77HXUXAh7vta1cpIU/AIe6BsaE+2xo2Hxv7fxw3ff4+rYw82lZU2bys1CzuMkOjtOhOpPIID+DYombcxeLgrsd9t4mrTh3rqMd77+ApiPIVbu1CESaPLcqQ3c/36c0jRVHxS3fEfnOGztY2fnGX7Z2MT9e/exeXcTuzs7aB8eIWOxK5GNuosdBXWhKTN6hgBT4PnwXe3+P0iGWFm/gU++/ByNeAa/P3uCjTt3RcbD7TwNh9Jhhv7wBD//+BM272xgYW4OnZMTefn7js6pd8IQV9+6oedOtcDiPMoSvPvRh3j79vvYe7Yr7vt2lE7jprsUOh7CTKH35yP0rqwiXlgQ3esA2kw1NesgX9dsLVotvSMFe4GUcXGJnpNIUgFQC27MiF4z7k750kSjp4afZoiyEYrhAP5ohIYNhTKbbsl/pyyh15fEA65fvGqeSeJgJ1k2N9AxekoMvDRKXrAlHwVcwDCsB5i5OAtvfhZRbxnpAZMGjjDsdjHudsUoVaUjKcTcamyZ3VhX14vyulpfASXJG7A0fJuyoirO2NUGXK7ZAsB0ow9Txf9pVel0MZCZGKjE0fdF1evwowhFFCO8tobi0jLU4hJGUQOdRk1M/Wj2SVOtROmOozVGS7Q1MlRYE6+axlws/1hMo+5I9F/uplIICDOpyF+rOD5POy8f7Rqjg4Yn6ROkkpKdNSAI0O0hOe7oORSG8IIAfhwBjRDNpXm4USAxfNQI9xiTqjTF2Bb81hPhvJFl0+9r5z826IWasD9edoxoeMk55NfQXJxDSqp9o47OwXOdVMCNIZ89E0l5nI3gBTUpMAhyxDNNeBdmEV+5jnS/haz1GMODlshc/OEQDcogOW9N+sUkJsCmF6kSX9Khwo6hiObophkGrQ52W7/J2hbVgdXVBcwuzGJldRVz83NoUi7iu6g3QunGOONMQM+D1iG2Hm0jy2ulnEWZHPspDXP1Xr8i4PqyYwJe51NvULn31gdDcvwZJQnkzRjB5RWEl1bgLl9GGsXoBxESGkznA/3blXkhwJdjutbn3XulvRQIvkRBDQHd9MgAaLcNUlfIuiWMVXZeizGOtraEXRXGF5C4gSA1SVGJoZ4gZualc7bALgz4aCvpSSezQsU/PZ/VNDuCdOA8GeBqM8Tt9TXUTYaLmLrmpxY/OPh18x4ePNgS/C09U6c5k4N5ycHDJNDiBAr1hQv46ttvsP7xBxiHCsdpX+RIfE8KGKwKI7P1MBj1NUiT6Bg1x7q2Kxhdc36GBVA1dHshE8AW4UYyweZb3Q/EHHrGC7EYzyMQwZymx0vxda4Y4tVHeZed3Bja5WL4t/n4D2zvP0Hi6S4+QY9krHPbpZaxjuqVbnX1lti4c0qgYeINufWznVWh8KfaWA6l2dvE4I77e/pKVdPQhLnl6OLXggDSMLU/Y2qeqetPyndUA60cKWWgKelntz5FKLscr2Qjvs44vXrbXJ8GAty8soa//rmOh7tbgJthOBxVYu70vJU5o4qS9VSmutmUCDUx/5aUHa8m/mYWTJIteZaKNIK1pjAEfF/2KWQc6c5/KAW9SDHKzrgxpSQdnuusa2R5xhGff4vfs/KW09R/DQLoRsbU+ctzXPVo0z/Az5KrTTYkC39rDCvgmpXJWH8DOyou/8aDhOct8jyTgMe/wTlh/Qks2FQ27gkImxQAMWJkU4kyQDtfuFYKaORoBj40K0DM+gH8CwAA///UXUtvG1UYPfPyeGwnses6bdpCqkZtUQV0gxALHhtYsOwSJNghfgWoK9Q/wG9ACJZIsIEFEuJRJBBCAlHUFyoirZPGjxl7xjN30PnuvfY4CZSHhMRIURorzczcuXPvd77vfOf42nPd1S9/vhAcsJQKax9gWQDyctQ0+JcsCunp4h4wk8WD3/k7MgCFmewmO2hpB6UVYqsECHzZcvPQq2wAby4MUSwekPVfNAOsBTn8+cvFh5yZQePnnGy8F31uPeCcLLIYkeLqaPVG2uSoUosYWkVf3h99O+PZBPVOC53zpxCd6GB8axtt2ipYr/HS9pFq+u9EAfeGCq0gQ9gIETi+BjxiiRMiGU2E8tdsNRAErmRbeU7+m4kN+SzXXsqcrKSEWGYGBejG4wlWmdRgz5Zfoh54aAUOdqdj3PzxO3TPnENzYwv7pHr+g6PaW7dUOz301A/KYB3c/P7evUh2kJsZH3yS4Z03rwA//IoLGxfRDdsCUEW6r9Q9wfC07Umd/Y41DyqdSpDOeUFRr+0sxk01wrOXXgEe2ZQypeJcl83dXQQ0/xj87x+n/5ek4P46i4zHrEAyGuPu3W2kaaZ9dINAEnK9Xg/b27/hvXffx4cffIRb128JDZZBMXunpPeJlTk3hJCBVCaUsXyWImL2Ns1QK/WGGtTqOH3xHF5+/TVceP5pES67cuJtvPXGZXz+8SdS+dY0Nj0fCBTScYzteIKa56IZhELb5tJ0+sJ5tI8dk/tYClKlraZAdOo4nnnxBXz56Wdi3QMR9pnNk3m5cW2uewHqaYrJnXtIfr6J1tYZtI+vI6WQahAglghFCaBkX6BkmljtF4//AmoSi/tEnma66q/KhUgcAzOqSnOjyOmnPICK70ON7ooAVZOZ9VzPb6naKYjY1mh3T4SDSAWPuDkyWJ5OtBZDWMNUNAJyWTlsC4882xmviaJdNYz5TFZWkdQChGttYPMhqFEMNRxhNhyg2B3Aj2P4w6EwAzwjoEUxITFUID1NEp6F2COJMJLN7kNXcEM/gCfifUquP3AMY2xfZUnZOHQfpbmctwgozciwSWXlG61iVlVC6dtP/VDuxT/aQ3j0GLz1HtxWA6rbQRo1UTA5zf5R7hVMmHiF9N0LHZ4hNTM2nJ+Bi+BIE+GRFhprDenFozc+1f3ZF02lcmX6niGtDv9OqtUKk8G2yDnO3HueIIhJiEJEJyPU6x5qaw3MBkNMBy1pd2LffGu1LZV+sHc1qokVW+aV4qsuPYqVKvGBCl/lOvCX1vODgL9KRV8Cu2W5xL+R6rOIARtP9JqPqL6GoFEXQD1qREh29qDGE8z4lRfC1NMBmyeJgKHx63dWPHjdk8BGC+FgCKffB/o7GNy+jWgao5FNETnC1dEiXhUfa2XagXyrGi8TkpTUUqv9G0vgvQzYu9EH+HX1mvydlZWGgA4m82m/CaOATbEvFgRYGZVtSCzEygNOPtWhe1Aq/bAd18620lpqm4drz6FF/nzdaknKtEehslyDVz9AzARL3YciU6TbQ7R+El6nC6+zhoxK1o0GUmpROLq1K1euSYZC7LUcJscIQj0dsLpwl3QjRFtJgmEyJkuEXoFOPRBxQK6FNkHKnIucgT3PWYG2yyTrNaxunMTRxgp2SgcjWSssW8HTKtqOMi5Ay5oA83ldtfqrJA5KWxhyKp7gZoyqLzAFZ8s4xtneJh57+ASa0v/vGnaAh7RItXUataL6e/j6i2+x2y+hDgX/mKcx/wjGlc5iLXQMk4vEXFXzcenVl7D13BNIIiZrZiI2mom4IgFYKc+jFNZSITG+BlBaDNw3PuvcDxbFnHIJXFW/z+dclT5NgMp2DFaFxdUqQDJNpUpOn/+N7jo64arAVcfqLczBfyVhZMfCWnlWhcof1Abj6Gp4jAn65QDf/PI9bvSvC/gnaPWDUHDL3J2jrBavDo+9hN0shc9AAytDwRYQZgQBiSWEGU1Q61m6uDfXKeNh8Y6tdDO2nySJFAb4f6kNQBFCYifBVaIZECxdx0RNqWGM0SzBVz9dZTYBT519EnVJujmo2MnLWqr+jG1m9pDF7y/a8qoHf+ZVrDgRHt96QhmxtQAAIABJREFUFPdHQ9wZ70jVwtVLoTAlWWHPCw2MrY4IcSTHw46ZFdGzLgALRkChafBKK9jnpjWCMaOt5svq4em+ds7dOSO8MkfnhV2DScXn31TuiQmzXGNWHhx3q2PBpARbNPm3RQuP7AGjqG8dCqruZHx/NH7T7A57fmkNMeCekZjraecAMtAtGV6Y7kbkkGxusbeXOcY2fI1Dee3WqUC0o9hCZRJCvI8kT+Rnsu95VJn9dnx5jYzD+FnE1sAsw+/Unctv3FQUxj9fe/zKOJ7JC9KwyCJKSYVaIAgkJBasW7aIfwuB2PUvYMMKqZXYsGmLAAUQqGqphGhK6DRNmsk87BnbF51zH/akaaW2CNErZZNE9sz19X2c853f5xk/erqZIRkaGCB3hC8YvkX/QxdoxRF/Aa4dKoSNJFAQgF4iIrXO8aAtzIhS9e1VxRR7z/NmBiDLroVrybTOicyC9Zik2jt9XxpYdH1lZ6ACC1wzouX7nMUS4tSBbqQaJkJnOpP9wzmDUA8itTGmoAF5d7fY77m9voTVNzdw8959ZOWUJ/fmXViCKZV5z4BANVmBxGsh8NWb4fF9JLJxgf39Qywsd3jSdfWgtvYZnmcDJsKtGD5iAgDjyRSPDo+QpG1EkQdZ0kB1mZjpk8f0YQ9HD/Ywt3IGcOdeukPkv9nYf5QmoekEu19fxe63O3gvXcNasgLHDe3z5smCJn+alIuKa/Zoccl1nC6TUxwWBf5yJli8sIWtix8CaczRZcNuax7+/zuNw/+3qf1VxdLcb65cxY3r1/Hn3bv8ztFz2dw8i0uXLmLYH2Hn2g/45fsfedPoI+BtoU+ocqn4towaJTUJOV+4LV4cnXLKziG02K6tr+PC9jv46ONPsPn2eSBRKqXV1zfw6eUvcOXLr3D5s8/xx+07bJknS7XxpPsJR6Em2XLFqTiSfn77LSaPP9aKnDONCAJsf/A+zr5xDj9f+46r8oTmGZjG20/KClDWbDRCvnsfxV4PUbeDJIzx8DhTKgBPZfWnNNFPK57vKPrnUNZ/OISkSZ8WKQ0Qsz+0EyZ/aYo4yxIhHSwPeggmY/iy1HaoSrtcaYAcZaonwzGKLOeDe059YBgvep7mTaVQUnKCEwpd+2g2RhSsKLQ8mYonc6Zmx/DSBHKUopUtwh/nmBtPgIOHkEcDDI4H/F7RWKCEntDAOOYPuC0L7jJ+7ywFdAQ6MofPpP5K+UbrGjauEdVsj7qGf7bOnGvc2SqIrOoE4yQVwd+BpMAwBTHiGO58ioDk4Z2UDzVl0kY2n7BfeRn6yISyMSNoXk6HfassdpQyRVRw2iGibhvhQoxWGiLsxMrSTyi2y1RMLCPASLtftJ08SBtJdzMjSYEJoe1baQPailM4cYBooavWztjnemwQEImCMUQH5+xu3YdNqbhdnqXO3toEubRj6EntWQIdp6n0zDMu67MaPxMKCoRpwmtj3/cxftRHTlk5GufjXL2VVcHAJ95oSY+sIeAGLbSiJRRJgqCbQiwvwk1jlL19DPZ7GB4PERBoqlLWgZ7mS9iSEdm0xCs1GK5eCIxiRdoHInHQH+mNdd/2h02aVQZ+KbjswjklS91sTeDm0/7+tCb0+maer8rUVcwSozFA3PqCypaoBjmMEa4s8tjxlrqYthNkUYrMC1B4DjtCkGsH+fgrlgk4KFJBsXNKrkl1WLLDTij07IzevvGZ2UpN/8SBg3YokNP4rQq+jiKrqw2/OqBIVkxN+gMMbt7CcrqEdjdFzmUgwg48U0LhONr7QaJmhTypj6w8V+8LZ5R9uvedureLIkfX9/Du1gZeC9uMtjVPSNpLTpmZsr/3AL/9egeaL/fcc4JRd5l9CPGnotRDe6HLzh0H5REmslRqLhd12ZWGTZjAHvUF7zdNfTNlG8s6KTgzttz6wHyyTt78noKHSqUnWdVF/0frtZNRWUeElfkVxIh09b8mujfvoclNz9uklsKPGfo3xq3ebez172Ekh5CiUOcEo37WDBlTegd9jigegxrWrWpksk1ddqkTh5W29hanBBGMS5mjSfiG1j7S/vWmblxoVzPB9nctqxyYffYVszTIkYXWxJ3ff0Kn3cG51S2E4sXVvyc/vbR8lAohXJxZeAWr3Vfxd/8QQRAiLwaIAh8l7Wc4E62/c6Nc2zi4qQAIrHWkKQWgs50Cb1bKqUfKmfE3A+0T0vYZcxncGoGq+ted8cmnYI9xFGCQMvE5qG+1vT1dg7PwbK+sg5SN/RGvlScCYCZoRJ+TWG3m8yr1gxkPVMap/q4kixq0qSn+xiaTgtYUfOPzNalEWLVASaH6u3NtP30HUiKS2kSz90yZAPeNAehb1wK192DOnGGdAPgHAAD//9xdS2/cVBT+7OvxzHhemTwmCSmqUEgQqAUKFVLYsoIlW7b8FBb8AyRWiGWWCAkQWyQEBRagCpBoFFSlTWgTMsm87PG9Rufcc21PmpAICSFhqUqqzqSZa/v6nPO9gtwMQHIIs1K2P52I6STJL1C3qNaAwE68OZJBGAN22mEzEx1FphFFbLhHxajN+z9DY+EG3CsWkk68KraByXiSR0oQWkE3GG2yVCDS76QCe7Mo2azsjVjMlLNzNid349HVnYjZBFHorcaiRNUhuk8y5ahDauxjM0VlqYbeC09j99s2zB8jntwqU8TAeGJmoxl9SnE80JivUZySzfUlEw1iASTjBEeHf2JwuohqbY43G1pPmlK7KSrTXMjl0rfTqWotQ6vVwXAc4/DoCHPdFroLdaZ4auZFBjxgiIcD7O38ipX1DfiUL+0FT6xBcRQUv3/n+O8s8ewcWXPhgId7+Pi997F0YrDx1HWENBihrDVPMt6dIRA1XkIfNTK5pMLlxKTYSwbotyp44+23gLVlTjXItZPOcEYQBDfHvnqK7v/ryCndnsLho8f48vMvsL29jSQhNk7ID86v577C4LiPzfVNdJttrC0tcwY2NcAUIZmlPqP1dD8H1ABSuUjncjxGI1BYXl3Fszeew83bt/HK1haef+kWwt6KlXGw9ERx2I/fquHNd9/BrVdfxEcffIjPPvkU5ugIGeX6Uqasb6U5PAQkFF8Da89cRxbKfeOKPjbpq8IRgFc21/Ha61u4+933yKaGE004WaRcxhBLKvAwiacY7j1A/7ddLPR6qK/WMddocVIHe5TEtskn4z0vSZFRITaZwh/FHMHHVxRD9MzT5wQRUwmgmpFNHxtoZINTmKNDhPEQISyDwBEB2ViPGZkao5M+4sEI0bWQjfyo0OdhCDWKqWjSROys2SuF1sDu71abWbqmlUU76fWEpPuqirheQaVjkGY+grVlmHEMj4YBo8Sis2P6OmG9oJ5OcvNDgq7I3M0jZpWqIIhjDPZ20IoNAi3cKm29WRLY7PkEXl6QG2lgPGdGFwToJwaa0kbqIZJqDVNyVW62UZnrwo+aqHW6jO5nzQaj34Zie0LFxn8WxfSQkiGil9rEEk86Ceqo2Zreh2o30O51UO9GiBab7FxPXkyavXBsx2Iy6fqF0l3suv8M/3fNf7nJ43V0xZGgm0qo+9q3FFxKeiDqpIqUxdsoY1pQA0JryV9n1rdEzTjzzxboRYOUNzdnBgDnva/883JtcFb8W5ZdzFk7yxZgkIIlKiTdCFkWUKlVETcjjA/70P0TYDyFTqwPD6lnPD9lEzlDz8VqEynFejUC+FGAeqcOtdwDHq0ABwdsoFgbxlDJBAEhcFQfiUOfJzIBh8QrZ9BHQ6ysWJUyquaeDa6M91AY/pG+VkkxqODlWSjeJc/Qi66g7MzXmYXO3+lLC22vkSENy2l/CStIaB1bi/DmF6B6PaDdwIg8c2jPqTeQ+AGGqfhCaEvbp5guZmey7hYccUxovubpI7EV3ZBDBkZnJJ6+cm7aFCtp0IxCdBohTgmd4zQn2Srg5GX2BqD/s24yHO/sIllcQnTjJoaUBkE1XFYkbPi+X6KtQLK1y1fbZaN7I+smf5QbAFidVaanWOy28fLmOhrcvmqJ1ZTPB3bqg5nE+OnOD7j74y9c21dcapYxxetyPtTVD0YwYTDRKe7vP0DjeA1ZSyLVVFkz7PThhQ7defEwGiuMF04EKJk256uU3/cXswIyyAAg4AkxM71Co6CTFHOdDpYa85wvH4jJbb76M9KTyw/e2i4YPFImRh9D3Ovfx73Hv+NwtM+WJ2lavD6nrf9NoXYemKjE3JN7JYFzfefdw1RwxYa++XpIQ8/xd3K+2WhR8ucHgwEikp65HkZrdtZ3611GtIvDGvQRs4yus5PpCN/8fAedWhPXu9dKGTdn10U+1xXW18tm92lfHrkk3YhgsLG+iZ3jfTzsH3C0sRFfGt5qeNBX/BY2XtS62/vlulsOZ6AXhpKjb4pngUuDQ+nvJP1M2RtJ5+h7WY7iS7PsektrICiUfJI5ivleOabeIfb0/ZTZMJaRkCQSBSro+4xUnZhOgtpbINf6bHAiBA3AOI2AfA5s5D1FqvL1QmINad5d5D0zUnybUmANJW1yAg0xGKQuM3E4BcD6HJDsj+WbJZNF3itFNpCfe/mcGhn+AgAA///cXUlvHEUYfb3N9PTMeDcOsSEoCUQ2kREKi5CQcgEp+RH+H9y5IXGJOHKGA0dAXHKBCwIhwoEowQhjiQgb7AxMnNl6qUbvq2V6htgmElxoKZc47lRXdVd9y1tCChRY0QuIAMFYUEGsSnzPPYiusmRSxWC3ngOyiowWulGaCgSLCRyUKxwYaMX0CyyTbHgvMJuP5RwBk2qOea4XGYEWA9RVpMx5SOoiROF8NC3fw17S4TJjszATNcX7YHfeQXbErifUVaiiQH80RLtVR/vcPNY2LmL38Dup8D2KDsmXnnvkkdECmAkJ3/GksywbLD1AB0N0/3iAmdkWfcbcmPXLadwVSI3IlBQHCBFO6jUkLK6kA7GHoOVe3KyjyHwJ9ogiJvR3f2cbBzvbWFmfFeiegv+/TERPKl/orYjd/xE+fe99dO/8jKtrL2GhMY8wiiWI91gUFysoE6xZKxAmj0Wqj3BfgQzyX4s+2q+s49ybrwNUxZ7iYVpY5b8hu3L8U/0X9z19tAEq3u/Tv2O4obZaP0lzVDjqP0CRjeTglw50P5XfOTy8j48++BBbW1u4dv0NsdP64fZd/LJ7D7/v7SOjqrdROA8Fuq8QNOpYe/o8Lm08i/XNy3jxtSu4uPE8QvqwEwFUaitGX+DxmSA0hDCUjXBm8xLeeudtXL6yiRvv3sDuzo5UQ8VGlN+8V2qV1CgS/QCq2qIaoEp2UggEXq6ohqvXr+Gzjz/BT9t3pXCgLQFL15cWviVixH4mHPmD729j8cIFxItPIIlC1AmHIwrAk5K0JoKmOc3NoagInhbGi94ErtRfoYUOeXBRIGMM+yPk3S6wf4B6r4+mSVTstlRNIvh3hBtntOgUG5pQr1ygvxY5YFg0M3u/Z7oavAkPbul6lsXklIi4lw7yPBY6CRtWSvj0PmlkSVtQEHQfiJnW0KotK5AoDeEVQTRqaHCfZVBViwmBQnPQw97NDtJuiZiuM3kpCtt8kpSwfeF1RsJJtgkMOeJeFCGUeaIA37Ik+rU5OjC0hK+cNRooSfeqN9D3alLkIHSf4xiqkS6EeMoJEuoun05wtJqi8SkjMmtpDguri5hZnkdZLxEmAdIyR6qG+mCONEwUbj3MOWc7QxZifKqa9qMv9zXa+0xzFj3bEfDlZ8NSq3/bovIgH8q6Cg+VnZL0n+1cbs+bGvdxz1GeUASw4/bKSnfHBpxFOXWfagCIsWk6XTWIsKtFSEjlSGLRPEiJDjzqA72+0GhY3BUlbjXSGgxBJskDl4PaBywC1VpNEQysnVlBuN9BcdDB8M8uguEQ/sMuagJrzxEyWCwmrRnHpodjBnlZWafcPYcumlGEUb4z5Yt9Xmjuxa5oaCjgweQUTMwpjklZ1dTPnGCjFIksnz9EplVAkIaQAh7iBQStJuqzLQTteTSXzqKYW0CRxCL2NwxClIwXvUCKl+KawRjIN24B0FB/Bq7ULpJOp9BjfJljzxsH8ZMIFsP7F0tM2qQROaUwF0WYo5VxECKiG4+yXudw9yi0ySTqqsQCcnRufYvVhXksr5xFGSXoRVqzgM8stmNehb+uAtnvxnP2OOrplX8n1IQciVfghfNP4Zk2k1tTaKo4EAmdrQzQ2b+Pz29+gX7PNAmcK1L1W1ETCU31GidFfx8Vl6fXy3Dr62+w+upzCOoz8GrGk5wFHnEMKOW9VxWotMCcrb6XUSK3jTn4k2e7SzKmIOXV8UontNDC2iW0XVs6GiL2Yiy1yP2PDUqwlDP6cQWT/WlJBXfWBfJecvaP0MO9h79he+9HdAb3ofwcSSMRLTAd60+OvdpFLab2sEA00fLKXqckNtdK68oJllvueV3ELzUl2cbzVS0AO+cC5Sedl/QZQ2fWzb9x8cA2RS1cvXoJEI3FXH7bsYfDwSG+vPMVGi83sBLNy9nrdMbc/noC6uWUyyaWnqA1A6zNPIm1pVWhAqgo1e43FFOUvENHyGOKxdiCnfNFisDYer50gvFOWNHT+gi5Q6KoCqLK0AeM4r1FrlfXE0YA0C8CiSd1o1i59ZRziCg9oVnod56NI5tPctxuXY0KP79fLXCu7QGrKAD9/2o0AS8m7vJ3Zhy2cCBrwaYv3ZdMcULrbGgXCSuizz9VTT2xjHb2g2bHMi4IrVZL3p8qpcqGr9ZxgehXxlkyVgB/AQAA//+kXdtyFFUUXafv09PJBBghQaG4FUUQEEq0Cn2QKvVJH330Rb/C8sWv8Av8Ar8Cq6AKEQyCJchFGEkgDJmZzPT0xVp7n+7phIha5okik0nm9LnttdfF4wRVBoBni2pFS+hYqzoXT5wNRS9JQwLGEEwgF0UZGGOsO7CEZSGIQinUtdufo2TRTjfMaoNhRB9drHP7/zYFICuqDHzGCzpCgU/LFNPCTnihiqoATC6pNmOSlI8KNeV7O9Zkgn87QQtGm6jRoOoAXXe2YYnpoehkM+kAyoDwciQZsEY6WDQZyyQPN0PYgjg8zh/sYunMEfx+4zbGq4OZizk1IHUSgKJeQxqPDKdYCA3agSsX/TAIhALG7tfq6iq6jMtxmB/c7BRwIRikmxnCoC25npPxBqKWh3YSYrw+xnp/A3vGXSR0MI4tYsYM8jKDszlEb+Un7Dt6ktl8cOQ4tch788Ji8A8eAa86DLdnV+MlTPH/FsIvH37bKVAVEmYv1YVGYFRf/Ly9a9fw/bff4Yy/F4cWD0mHSCrLzdyKiJ2aP6wATClGTYMXU6HrbRRT/Lbew3AxxsUvPgOOLMn8E5LmFsOkxsWk7q/81xHY6Uh75Qj96/c1s2NADXcaQdNNlDYvUi1ePBvdws11OMTg2RqePXqMF/2nGGxuSPdkad9ropWfW1yCCRO4TiBz3/Y95TVz3XlceP9dXP7hEv548Eju7Gxq824/Gg7Q7S7g7LlTOLF8FI/vP8adW7fxy/Wfsfb4T8RhLIUB6bzr/T5Ov/cODp48iuOnT+H4mTcxv7SounnHjrhRaikqii41m2VD5JqE+PTLz5EcWMQ3X32N+zd/hZ8ZTNNMikYeWEkSY77dsYXbtmGUw8Cq1Y2Pw+fO4vxHH+Le3TvS2XHkUk1juFQ12HkgSDPXSUg4YO05pnfvYfexo8D8nMZ+ZRn6BQPtR8BoCjMpRdMPoamrq7y4RJHuH0dC+SdI23J8xAT+JgNM1p5h+PAROmmO1rRhvFe7ksw69zQAHPSf4KBXIHYipLIXTzAaDGQ/ptzIc5Qyxi4GNfOlq8ZQuTBk8popUDW/yKDis646OWKWJAi+RvQxd9ZJQkwKTW+g3IJ7ayFRrdz7XAHdjBsqxZ6OzZMYk+VlPFlZQTwcwieF24QSWUct/ibBFoIxjEKNY/F8CPZ24SYJvIV5+O05uPG8ADbM6BejP1fNy9gxplO25I/zb5ckD0gBIo+50AmTibGTj4nYdKcAGVVhAXQitJd2Y2FvB0ESIYg9AQ4mhQIUYAKLU1HBTb0xVIdz0eiSbVnNL+V+7/xVd5C3a/Lrs83+vKnAbPtuEhGkWmtp2rpO3YUWzbnZShv9O4O+eldzZvtv8/XV52ju1tv1ujv4a+0QK7jVBM/dXvEYC7WVKl2QPGViSUGEqBWg3dmNtD/Ei96qsH5yMmuKTCWKYk41kMlm7CWN+ds5gZGEhkoR/LldCN44BPTXka33kfd6CEYDGGYzjwayPiBrIZPf7VnpGO8EjJUVOQV3wlzvN16zOLfu82IOZdensU0AarWJBUYKX9Ykdd53NAorr5kFFbSkGJwrHWB+jlItKdQYTnYtGuO5UvRP81Kj+5IYhuuk04GTLMDv7hFvD9NZkJSQIkpkvQi4RvYVXeLFN2eqdxSyRrNCtOe8K0ahL/R+I0wJphrpOtBYqlIaNmh0/quM9pJSOqOG1OPNPvYmHrpJiANJB/ujRFg4+WCi+BvUvLRSQck7kJnEO2E2xS5eUK9ewuJb5xG9fgI9P8AgyLGRDmBKX4spm7RaZkYknvW6q6Q9tW6gmvB2rCW6wbHupIqqiC/FJEWUj9H1p/j41DK68DEPr4bFNea2QDFNYdICKz/ewuVLV3XPaYCAxh5VpgEVTTHzMwntGV57NtTzadZ9J+RII8u7129i5coNvP3JB1LgkCXqWkSqcKpV7NRFVbM4qTTJYnFRKDNVYtQac7caH8VSZj9Xefxocay59hR5+RIl72IuamNfsg++OHQwDrKsZ3GVkaB8NWy5/zRLVrnNmBngVglmPD5L6YoTIC7wBOu49fQOev0ecjcVBlw6JjStLETjlfXYVR3dppEddfTVc+GZ145atbk4axgBoNKpaqvtPBG2s+vJ96Wra4tByZ2nZJpjM9GGqSl135UoQBgEjj0hSImX3HqNrsssHbxEXoMHNG8UoEYke548q0k2lqbD3dEDXHl4DRcPX0CIOSn8Yr+Fosw0TcU2KV4VtFhYILMJzFT/rvrXsYx6hOX9x0Te+XT8HF4rghPxXGcN48iZQlCAgCA/hzSNXfWIEIwzz9VDhdp0MVHMpJHsOcpuMJbZVjErXDFd1KadEJ9de/crnDoqHtA4XvrQjYYjfV6WWTZjsXMMSSgdS73KuVtJELheRK5ui2XRyxOEtGwC7mtNV359ZBXIoRIq7sXcE6Xu9bWTL9R+KeDta9lgrwDwmlGsjCG+P5u9wgDg57U+BtXaVABAWTz8PaxNCSAI0MAhE38ZnTN8HetuQtes4SmbHY838RcAAAD//7RdW28bRRT+dnZ2be+uHSdO06CkouLSPKAWKgESpYK2gMTP4G9UQuK9T/wTJFQkHhBP8MgbiIgCrULJranr2I6vuzPonLl47aZKhZR5sZQ42cvszpxzvu98n3Q0CfNQCX9Bzjf/ZNA3NJU8t8IIobnBNi8PpVNw1FxddcP7KVL4SZRcq2I4dgJ7tmpCTAJC8iU7BsD3gZj/J/lhphvv/A9nN1r5goHxop3Oof2wiv5ChAuT5NoN5q0WThss7BYIv/zyw299spONFlpvbOLwaNvMVxDMpWrCLmSUEvQLhePREPW4yohQ5KiZRY5ut8++/mlasz0n8wJ6rHdgaR+k0TAtTtgRgCZ8NJmgPxihmQfcW1tLKqiTmnPOE4ju7i7GnTYkWXixKi5V7qw1oFaW/i5ejgd06lAvkaCe/yhTkolyFmhDG+cd4uQYX9/9Eq0x8ObaJpazFQhRZb9OzaJt8cxwnK5HGJYIV2wjyRXrx90jHAZjbH3yGTbu3ASqFX6uQxgvbJQRK8x/nv846/47XF5ZPWJY2pXpqybKNg9tX2i67mmOYa+Hbr+HdqeDJ7t72Pv7IToHe9jf2UH7aJ9RfWrdWV9r4sbt27h65zaWLm4gTZvcYyssW0DJAmmrgRt3PsZ0qnD/m2/xx+8PcPjsGR8rbSR4/cprWLrQRCtcxaVLm3j3vXfYm/9gdx/t9lNGxQ939pDUU1y++hYqrSUsX9rkXlSHTphFv4x5m010pt5skZ2IxTjw0eef4otHD3Hv7lcY9/oYER5GqrBCY7nZxEqzWaJ7YuE+e94pRJbig1u38NP979B+vM/FDUOKNZuS74EjBgPpVT1to/PgEVrX20jrDWShxDCQOOYlRpk1xxVD6ZwpSKhKFmMi2n89rSGtJahQoNIfQu3vo7f9AMVffyLrdpEQ68mfYeCLPco9o9q0AYyOu0xllswCoHU85jWYKG8uzmIqolWzpSSdBM7CcW40FEj11uplmEjaOJeU6YLlJ1C5nnJXgA0N4k4oi2EAmAKAEdaSxs1FClz88CZeuXYVut1BftzBuNfh/aBJKH5URZAt8SfBXkUcMYpJ7ACyMzyxGgOF8wS3ol257bfTcJYLs6Z8LTyb1ySstHFTYlGRrJQv11KkF+rIWg2EWYS4ETNDiBXhy32KFvVXLvE+Y/xfBsAihf7M4TyZ3WFeIHR1HqMsWIZTWABqgcHAz5LSM5ZXGfFfGL51IJjRkgWJ7BGaBoGmDJEtZegdHGI46HFbAAccJORFYsXaxEE5t+hRTy0wZBpmDVFNo5oliFeaqKytoEqth4MBouEI46dHmIwGrDVAey4oUCQtI21QX+UgGG2vw8ZaQruuolnMRb+b0NmzIrj5Xq7NHm3eQcM84b7QUmE5sOwOd0/JFlPHs9YDRv9FhGlAgpAx0/fjJEU1TRFdWIXO6pD1BpBlyOOExS57Qhp7S2prKiz1lGKn6cTAPdoIkhIbiMAJYUnrnLTQbad11vXyB5YXR8GpOg00sLMf5Hzvs6SKSjDCaq2OFRljKaywNgq5nYS+jK1KpQ/4/YbJOVSIPfgXw98qSMIm1jc28U8xYfFO+mKurP0zr0FG/JcRMV/EDz3bLThLz4eSMpvg6mEP729t4e2NDfZKD1Rhvb3dbqCYH0YuLD8MqWLCAAAgAElEQVR8/yMOdieIXvjPXUJvkmpiVJFDDdu9+t1oxlZQpfNhIBhA97jArz//gq3r15C9uor+aAAZmzVRWycEk/AoH/uXY89yq2yx8N7NXLrmaf9DcqCxCC9/jnPEMkY+HaESRNzj3MgyJDJFwj410zmGxGyIOX2Ll8KrtUk2qZhBcfcYE6b9H/SfcAtXJAUn/k4VncBC9dxx5wcj1TaBp9yHLOQcY5oSKmkp/54VUPJ6p8Q/ULPWZsewoKQ9TRNmUy8Op0UAX5AQlqZuWqvdOy2CYG5fcetoTuBfTWAkJ9je2caV1ctI6lXUKEeidqlTQbsXj7Mi/Ii0mqCwkjSwvryOHrVFBxRbj5n9QUV+Qta5IFRMvNc9z6l6vr1lahFz7/MPI6TnUHEpTALtcj6XR9L3uQ++VMTiBNkTxEIPQpcrzwxchyY5d/PMP/cuBKbCyCxwK0zISTi1jeVW0N5qNrh3guz2+JgcOwm2t6Z80+jcmTXB9ewvvnNu3t11OVcdxxByTHvPICmJ0/L8FwWqFBdRYWMyYrDH/z2BLsQsi4zWh9Ya//F2db1tFFH0zMx6P+w4cerEdaumVC0QWqgQlaI+8YR4gQfEA4gH/hgSPwAe+AG8FVSpSIEnSluFjzQJJCFN7NiJv9beHXTvzOza29ICoh3JcuKP3fWux3Pvueee47kL4u5NP4LGMB5l9BS6KGFkVPSZhkAos0hmLqYb/BpLmWDKUTzKnss+1JSHP+3P/e8+2NiqorB9gxWycH6ORK3JBAm5ep/kypFJkokSup6cwPcywT+2QSiIFRUDrycl8vwltIjNRCRQJY3qS0u48PpldH/aBNojXvi4Z1TnRDLYKTqg3pwhMKhoBB6JBRlNgXQiMOz10Tpq4exSnRN77tsVRgBLmlICL75OvNDzDDBDf590ejg6OsLiUo1tMijBYqaMDeo67WNs/7yBK/UGZBCyqnP+LXvs0j2n8awfm/92IOYHT6Kooc2AEQf65Is+wNeffY6tb77De+XXcOPCFcjUQzxOoEYJBxSmqUlniw316nI1jHo+PYnu6RA7/TaCG5fx9qcfmh5sx6WIB5y4EM38hY1CwF7sfXtSuprj9mZeaRaIGzPKKtI+t6Ic7O1hf2eX7fiOD4+w/XALe7v7+H33AIePWmgd/MmBiydN8sYpzyRmyqry57C0+gai5RWEhNxPHVJqbdUal1bw7gfvo95s4s6tb/H9nXU8uH8P165dw8UrL0MFPny7sJIgXrMc4eylFRx2jhEPhnhzTbEzwIM/ttD65QDhowMsnTuLV1ZXsVBbMPojrNCvZ89ABgDYagf3jZYYvPj4o09w7/YP+OqLL+EpEwgRpfd8o4nmcgO2RPp0uW0psXbzJl69fh23tnemQBa7ewdQaVPTIDXxzsMdnG5sotk4j0F1Dj0KllSAWA7MtaEFn2zkyN4wiEy1vxwgFBLzSiAiwPzohG3M2nd/BDZ/Q9jtoMp9yJOsjoKppD87HhvMnbTa8BINPyrxMSk15IXQ1udssqJMYkFBDit2exC0SJIdRlJCSpWPUcJAgE4SS83LQQDh8mudW8iZpFiYSrNNxvPvrUnKCRwlW82h5+FRqYKgtgD/4gok9ZNaZ3baFyXZvYFp06GglhhThEcww4QquZMxV0CFbVxkwDlNbL+yPSFOPSubRyoDd+j3HIFiHRXlC8zV5/g2f2Ye81GAiRhjlFjKp7YicC8O+ZsZ/5Y++7xGWjiOZ1n8FV//d0DGP7EKFCKvFMHqQZDVGfX2l7w5ZnXJkoBqh+ielKC7faOPQ9V5XcQWpC2pa3bZGZLuhAwQlkNuMyELxRKxhs4ts+d7OhhQ9oO4fQwvnrCOhxqPIIZd1g7g+ZGkWW+sAyaFNnbGLGpJsRbPfxv8UiAXLTDLhRgyNA8TS+NngEAaJg2mrj+x26R9XtN8JjcbEu8rV1AhgSraphcwEEqsGFGNONHvkfwN1Z2lqZ5OYGziaJ1ItWE40I2EWKm8JW2jmx95PO9on75PQsWeFeZy7hHiqambLvR7iyQmfB31SoQLtTNYrFQghgm6nQ7jNa6R0f225Nfe3lxaHAO9/X2U9DqWqRe7XseudfHoE39Am/5sQZ9amUIVgxpmayb5p4QyNRvVM0mTBYbdYylZU8ZoViO889YazssyqlRhTnMqVgbCewL3793F7dvrHKt52UJdYL7Ye2JfjKjM6ZUxnqScbBkDSmVBFybXZ2oBzsaQzk3oAa2NbTxcv4ur1TX4VRK10+zyYa1WOEGj6qTRpcsLc24+OUvW6R50l+hIkfv2u1Hy8hiei3vSUrK50CQRSh9nqouIVDjzeYstK7PPPWvyS+aEgBX/FVux0nxqxR3sH+zhtHeSFfxMm61jrRWdqh4fLtlPbG7h2wQelnEsLHvB5EI603lxoJer9Kau73pi+rv7/YHRNfNm9bmMGLlNgq0weGpbAOh9Idup5/3gxeHE9Gic9nvY2PoVjasNBKrGonqpA+P+p2GiKolaVMVybRGbh9ZWlzR7qMJfSBGVdAVjI/T3mC+9bb82reGTmUnugBGmxVv11WJxV03ZHjD1X7v8VmX2etM6dmT1TY85K0Infm/eY1zmqDBL59rlkGPSPVFUyDbscre9DGCYGiY3NSwAcnpzbBl+35R+kRt0bSk+pXlEIAN/X6ac8dw9nRve39T55Yo/tZNa72TWqGDGltEXoG0T88In0WVaw6TAXwAAAP//xF1LbxtVFP7mac/YsZ00TpSHSSCQqsCiIBYVjxUqG/4BGzYgfg9r9mXFP0AigCqxYIHKruSlxgElJHHGsV2P53HROffcGZMmVYXacreRMvb4ztzznfM93EKPwAWSVUQBGnMKTTlwCmDNzokiSmOnZunYZJzD6BTZhRN5SHRnRm9yy7hlSseEne5dmx+GhG+wU4B/o7cgnSuB/iJXUU5pvl6uKThmw7OkIMtKSQDpOBKdp5hyLKDWQFis+cgLc8HpjfQEpVKo4RAN2Wg85mKzPuNh6dYrOOosot/vFt1S+r8mmgrSX6Q7OkyBHhkqOhVUfU2PM/fn/DxCFEWY9+b4UlpZoSdqTCGydQHO3Uh6WZOMoOrBHXkYDkY4O4uwuEBOvBlTiilC0HU8phP9ub+H5c03UW37qLg1DQ2sctf8Vx3Q/7/KQgAwbLycD2rdNIqhznr47utvsOHN4q2VDbRnWmxcRE8N0ajFRYonGpkYtPB5T2wJMjMKQnTHZ7ho+vj0y8/g3FzXDp60j+Mxm5Wp5/gyfV6LXnrakFCKKzOFsnLEwyGifg8nJyeIoh4OdvdxsLePnYd/oHd8wrR7MuYbRH1Mxikb3ps5OJUcypFIJnOgekCjtYAb7RUEtYaAcLGWUhyQpl32gwoqawHu3mjj1uZNbG68jvs//8Q6/tVOB17VZ1KpMsZOnk4GCewGmrNzqIyB3e1tfHvvHnYPDzm2bKmzio8/uYsPPvoQS8sd5BklZvjX38Wi06oj+mrteXz+1RfY2dnBg99/wyAb83dttJpozbae7ddwXQRzLbz3/h3c3/qRtfXTGldzIFiyV6lkokl29HAbG7ffxXxzFsOwgYvqDKJKimSQ8cyeIgkbYYMphxYdCv0hnEkCNRrh/Phv9LtdJMdHsE7I9X+EQCLlMNV0YDjNh/4l2U+uEJ9fwE+BAB5TlX2bmotkHfhYYLhkQDviykWHJbO/cqbFeTTRcGLY1NCME3hMMc3Khu9UIXrVUpLowFw5AvOm+BbHef3O83BhKZzzvqCJY8rTML2d9SFHU14q6BRFFGYJrFSbpzlU2Po2svGwIFAX8XsWyvdHYeBq0IMBj/JH38LMXB1BvYJarYpGGKCSpPCZccb+5pj4U5xcni7qLZDLfbzO0f5FLUMtxxXn2RMU+5f6yV7u4mEDSTsI6FSp3gg41Yi8AfyZEIPgghMxiFquxik30H0iUIu7v2ESZLZiyRLJYFI6P6gWoVqjmsGpuHAJ6Kd1eMTgm59jgzfEKUBN5MkIdirgP1MYj0b8v23W9ufc3IQka/BecbXxLxkaKr8Ku95G7gewKj77a7BUhk1AdT3ksplW2Uhx2IPDYTMukjLUwzpP/ckXheQ2NANMhWCeiPFnAl0gkrTGyqflbDmDEd6/xBDT+Z2aYSTXrIYeM2yoLqVi07aNLOHf7jxXGZgV2nNpnNmsqR7xi3J5aQlLjRk0PR+T04gNk/PsakPEIpVPZP2GFu9RhO/RAU5/zdF85w7ClVUcZpq6P1IOf25miNpaCqPykglopAnXLkskAMLmxHiAN15dx+21ddRgIU6HCEUDzeexpaeR+WCIre+30N3vwbOffg1ioySug0FmYXH9NahJjGF3B2F29Vy2YPXL8shbtvcYD374BZ2NNSy8vY4oi/U9d7SMYTrf3wAapTRwZQmvoTRPG6vR+9XkrV/6XRmckSTV1z5irJtPMmYBqAnJYEO0ak3OqU8R42n21HjWyX/x7bU4IrYSDBDj0WkXvf4phf0ygB6OiCWrWQmaDVjl5+S630BP7Y2u2yoy7AlnGL8uZpxaJfgzU2JzPwnEmcYKUJoEGuB41TIsAF0LlQPJnAFy6UpPsbyXP7vBQiZ+bu+vR1hvdxAuVtCwgxdSryqRfzfDujQkdYwxPcdKfNuonqahi1Vk7KvSh2Nq0f7huDpXpFUWSu28NGyoVslM+huBWqrbqbmfpBrwCjXfYEYlaQ1Jnot/gQx7hZ0UGu8FjuajxoTxIJD3kkNRniXGJHN7khyR1xyDdGFok1xQfzdpzJggPALgjN0kwUio/CbOsJDiTskI+L7S4ETYD9OsBpOixfGIqmTGSyxTkXhgIg25McAvRt1QoEQk+txKKfwDAAD//8xdS29bRRg9c99+xHm1JH1ABTQFAVVVVWwKC5AqUYkFC1ZIgNigij+A+AHsWfBH2CCxRaCWDaJ0RR+Q0iRNYpemiRPb92Ff9J1vxq/SRt2RjSXLdq7njmfmO995BO7NQkdx7v+lzaVU3YQWoezo2B+B0vv7dNJ0VB92qSSPsNPlZ8mgyMXWKrG69VuERc0y1GRBLq7byzTWwA+GnX3GQHg6iUV35vQao0EyY4OkN5dxWuKi3dcJR1d9cdkMAyYJgIBFqdfvQIHicQqO+/y+o4+UBZEayRCW7lGtVkN2kCIPPSRLdZw4u4LtW+vUN/GU4K7LUfJKRff3pSOflTgyEyDNNV5CinQ/CqhB2d1t07NApADDJAK5UbFHZ3DJ1ZTvF1n9b5zlqFUqaO7uoHPQ1Q2LWd+SRw5Ft2VDbe9jb2sL1cVFZH3JO69yEfifNIwO/Zu+13DPTURpOSKZGI8IRt6lFvDrL79C9946VuZfw/Gl4xIiiqAfabdQgALqfnMtboWyWfqMMfJjQ5PvzUebuFPs4KX338GJ994C6gFgzViMNRvhIoLJRfqZvt+hd2IKkBL9ltVR+oxP00TzhCWgghmkkYtDevsR0nQPre0tNJsPsLa2hj/vrGJ9/T7urq5ie7uF/b02Dvba6kxcFDbuyiAifd5DhUKHklSvHjJmY8v/OECORlzDxUtv4/IHH2LlzBtIpdNiF0oGp4kOtigtAKigX9gIsXL2VSzMzeLl06fYTWNx58U2AcQjVawQyYuJMCPGGznQ3mni6o8/4bdffsXGwxYPt1HtBn6+dhUff/oJrlz5AnPzC06QOBqwoUPn+KOtTo3BK2+ex0eff4b0m29x++Ytuoi/e/kyompdgZPxKJ0Jt09LpaNrNnDh4kWcOnMaN6//rrpP6agJZX6oqdaDs/gASJv64O7f6K3exZHl55HGM9hfXORBsScgqhjk5UC820al2cJBcxvdVhPFbhupSCLSLvpZh64eiVDLjObSZtL1MepA7o0Zfw3G9gfqioUe39pBe/Mf1J97EVEhSS91mE4HWTpgp1R0rdr5U54NqW+y4QjoKqZOYrIf+jREK/PCIuPS9UwUvZe1Ve5n33aOLDVVJTa6/gx4GPUoxaE9u4x1GBOVJ6We86I3QvFlfSsyXecs60YOGF6hwDC7dZYBRQoiPV1UG5iL5lv2tUBd7S0kgFKu0x3mBdwLq/orrlZRqYvcImGsUaMaouYb+A8eIsoy7LW2gXoCf+UkoqN1rrnivB36xoJvTjr2bCvCoR4A0zG5T3kvn7OV4ajTPgUIHOZBcOj5++kveOz9h33e+BtG5ukjucBUS2lCQlBOmaYF1iBL4lyFNkorjYTFSBAnlCp1/ASFn3HPkPw0mUvBwFiauyEQZOhXYejknEM7h2Tw+ZJl7bHxISCddPkHkYE3E9Enw+vPMMHDWhdxbS2kqTIGAIjRpxkC2KDUIBfWQhSy818mDfgSwxdHNhHIEAAoQ/XRz8vJmEZZF50xJ/vCUvgLM9HAdvb1O8mjo3+TTSONlNKnjnRoxigMnSKDJwbFgYewGloXb99mZusmHIv+2PesXMMVO/Y+OQqrZR6Ny+s1MUf1//YOol7xMR8PsFRLsFxNsBBX0Gzfx9bWNk0/ExYbrks9SW8ysHWdnSvCAMm6+0g319A2wGx6DsvHXkBYq2MHHjpGyyHZaxQEkO5fyjWktDSm0oGn/7lNyxkxRTDIUC9TXLpwDseSBHE5QBz4tjvv2+0o4Fnyjxu38f13P0C28Ej2xUH25J+CAfbERO/kSdTPv4680wNMht69NTRMgkG/N/HdfYzSYX3Yo0oKPLqzgdvXrqM2V0d0Yha5F6g+m1GN1gCRD77mlLsosVL17OyeepoKpud/Nd4mABVFE2sGfcF8K8fxNANBIsLzTgY/N+z+L1TntPCXuedPDuxja9gTjkfOad7JWEvndWN01FvFLjYebeAg20fcCKmzbyQNznk/iUYiCpGMSRINa55JOIIF52Dy/ClnGe51ruFYWjbxQGOkOfZGC3gBQcRskIWiA+x837KYvSGjwFHPR2kB5RColTnCHHrLXBvG8Ur3XGbY1DVrHaeu9jIB2mkbtzb/wkJjFkllmee40Qp6+OmTzYAJps0041Z19TECLM0t4uj8Ajb21lk8m8DVfCMpjDPL85xks8QkgMI5oWdq3g8Pw7kmkgInL4GVZ4xo9wO+nsaCAi3ZhnVAL4psaFbvPADkfCKfRVm6fa2MnTPAlz8BA7hu9QVYEGN5jYqX+czrlCa19ahzgAOli/TZEzf/nMxs1wyXwpzxjkP/AY0I5nXaOHxS823zW17PPYUeAraJzvnt0gpU7jL+I1FjwxHgJPs/a2I2TjTxjmMnZsnG4F8AAAD//8xdS28bVRT+7ngmM+Mkdp6lVYNp1dKX6EO0FUhsilqhCiTEnj0/CIkt6oJV16yQ2LJCjSpUipKiOnXSkipOEzuOHc/MHXQedzJ1Qx+iEtzs4tEkvu9zzvfwMbLonPqhiPH5BSyuABEr70IyhJY7zCEBnPI/LRpPq22FqrrjSihEJeGKvKd2Gb5wJdTbv6jUKz+0POnE8m9/YrmEgog0KLxEMz2SLbHCbU1SvsRapRs4JcVRbtMoJIUW4JCUg5MUwyxhsT5KGpI3fzgdY+70McyebGDrXhPRCL9RR4y597RVdxOiHqaIrUHEgleGL9RkjbaxsYmZmRmIdWReVJQy1TkQ20UZcJcAoIRBZSdAu72Fw/MDyUYR9c4KGoGUhPudDtZbTcyfOglDegKFXMrL5D/+n83Ng4oSM1LlWWa05PXL7GEAL7X4/tvvcPuH27iJGi4ePYXJaIIDDKMQfx4jVjZP+ULhMm9BNUI/20UnH+D+1hrSxjRufPM1MD/FlZE3pOi+hbaf7XfbNavzahBLR+wYH6c57KCHbG/IVfwnq2totVbQfLiEZnMFzSYF/Bt4trnN841EqVKyODE+fBKOJFgobRAU3LG1llHBJV90NqohixiFsUDiGjNTuH7zM1z/6nOc/egqsiDmQyBTMSsGhrHGwJjwJE2mfSxw7PrUJGZn57C4uIgHS0tYOHEc0/NzBZeKqmWcSedNMMHy0jLuLi7i6fpfCOlADWN0+wOsP36CW7du4dKly7h27RpCShi8tLlFqv0XB7jx5Reoj0VY/v0+Tl2+gA8/+Zhh35ypLTCcBw28x7BcKn8dP3sG569cxdJvdzkopUtJRS2W8hLSK/Ij1v4Ytjfw6M6vuHjmNI43jiHwD6ExPQ17aBf9J0/RebCCnUcreLj8B7C1ibTb4YC/yiNi1dIp3bdPK4CrdJiKvE9uyp9II3edPmWBewMMtruYq4yhWvExSD1Uq5MIgm2kxmrWwNOfku2cp3xjptmQAr9QL/wxHxVFAZDAkd0zLI5ESTmBMVq1N1MQLyuxW754MzPWc9h9VvVRiJpX9DMloywH9u5XWpnJVETNikG8sQ6WqoKWufecQq9NEuX8q6jssAfEARDFAM3x6RoONxaw0+1iIgrYPaJqEoS9IaK9BGGnh25rFe3VFqrvHsLEXA1JZJDVYvGVdtoyuXics/912ef8wHn0lneMMgJg5LPRC/abag78l21UM+B1Wq5roZhLucBMc/aao4B2yPDhnOeJx5dAtgjLRNfBjAVSBcwztf4TaoiEHLk6CGjETfeV8ZD3LEuFi8wgyDwVBaT91NPAVJJqRJ/KBsMigGerxijkYJ0EN9mvbGycK/eJBvbEyRdkzosIODgthJKvfwFBNhLUDslOSkWb6XJIVmNG7xyFbZTbq0nENKJkiWiQkIhXLpweDiD5ESt7EAfyxhSkSei6467J7Atil/rfirVmbnXnSpEnfczO1nG0PomFeh1hP2OURvtp+3la2wHk/LI1ptCucq6YBmkfe62HWN/uovbBFbxz7ATC2ji2vQC7AWmwqBAd6T6wvutQBsnYV2esKDDb7eLSewv49Pw5xJQCN3JWy94vdDuT9EB8oZ9+/Bmrf/ZElpUKV6Xlp3TjwmSQ4P/9iRiz504jOvM+TKeD3fVVDNfbzEUfrec6qpl19sNW5sLOVh/3frmDucYRvDdzgXVfEqbyGU2h7CuVQ/ePioqI0Xj7akVm1AWM9/GKX1QwX9bonaRwH/kxzCBHPayjWok4EM08/CsMqi0oH15BMSBNph6GaG0+Rru/hbySqdBhrmfC8wlECsah/H5RpU//4a+54d6nPsv89oqKbxG7pBIwJmxPZyU5qH2ZaeDGAuRkETeiofCqZnSNeSoOzOddyamI9ra05CBGr11rP8Za+wimFuqoobq/Rl/RPLz+fhvAQ706jsnqOPJnlguvQ0hxN3cXoPzg7+mCf481T/IiJuPiLsmNapGZA3eKG1X131XOnSYAxYNUbHYUaaibhesXhyRgnnwUCyVgT5Jo4j4n73d/m+MusiaGj2oc85pzQXx5zMoVfz8MSbZJHfREcE+SYaUqvuoUCOBI3iHIeykMu2eouTninnN9wfOMCuWl+FXQVGQhKclY9zwlLGjdkvuFS6ZwA/A3AAAA///MXWtrHFUYfubMZS/ZiwlZojZpa4xGmkrAXsw3QTH94ic/+AP8Bf4bvxrwB4igWFpQkYKCoBComhpzabKbzWV30yS72Z2bvO95z8wkTUOpVTyBhCXszszOmXN53ufyGAPH0H2yZgrp/+IE2csi7S7rJiJ+0OkgkZV2cqNhMOiZOSm6YTrywuaLJ2qpqf6b+BEaeHSG4kldUrZxhJdSyTmZ14yc8I1O6R3mL5vrhMFj2aYwhjrx6aqN3oSx8iH04cUA+QsFdoDCxCgqr1/E9tIqhnz93hApAh+JVKwXaRkAm/ZVCroT8Xekv+9Ou8PV2Aq58tJkH2vwwnQEYzQRs4+Zy+gideJCvsBGgu1OG5VKSSglFm8QiGIWKYW9ZgMHrRbK+SLHHilJGX4exNSTRL9/t+lKe+qI7HAe+DE6vX3stNo4ODxAc62Ou198hc8/XcCbyGG6Oomp0csYcivMs2SknGnA+oEbuLQo8uFRJYfYE8Q8ynlYXFvHdinCrU8+hnVthko3TMNMrjdbZH6uV/2kiuFJ3JYXVMEA4cEjdNp72K5vYe2vFWwur2JzdR0b6+uo15vY2m1zXBMnfdg6FZ4oqeS2Cs/hXF6PwTeaBL3kueQNILuSajOol6ZexdTMNGoTNVSHq5h7+zpm35qFUyqbBGvu927ocPU/FACL2SwQSUKgjbeOOm3sbGxgaXER3925izu3b+Od+ffw7q15XLx8mTVKrK2j/m5rKhYtFrrHA+RsF8ViCcWhMtxjB/Vem5kNCwuf4ebNGwIAPP0doXGqOjqC9z/6EPNE0aKxyxbGgom7O2eTxIs7KLijNVyfm8P3X3+JxuamBpUEnjpR1HQoDslHv+tj9f6vGP/tKq6O1zAyUuL7tH/UxfLWBuq//ISdpT9RCMkoisyGdAVcyaSo/UmVUM31BKwnbJtnInK2T1aSJxB8sQf0A+w9bOBSBB5D6BgkN2CTIp8mOl2Q92QhyVVMIUVpcx5dYiJ3biXjLlNwOfouBztf4Oo6VVcICCBAl0AdQ4WmDZUtVPuQ4jbpBlMqAGTRzKWsSM+qXKF0uGKb2t/rTUNkKA4CAMQUoRibZJN0YQiJBNIaK52wwJ9R9oBKHuqFCvIUf1YqMrOhWi3D7+6j7AQY6vvI7z2CarZw8McKmg+Wsd/ZhRvOIpp5DeFwAapcQEgMuoFI4qz4zOpVdFZu1z9o/7W84P/cOMkkzq5bYqGMixkjMZBiDfr7fR/9gx7UcQg7sDi9hNAxAsI4UirWrEeWOxpNX0KJZn6Krl4R6BTYuvrIiRdEz6d5m8AjnU6ihEVDY1mIRH7NVUTLE7qwPKSBkVAxzZ8iKi02mVQq0IZgyaVFCRMOmYIDFz6s1FLNSA1j+cW0ZUtvSKj668apXIj6rJezWULAFFxHwSo4bIbrCL9c2ZKdL47kcWS8PZR+ZqUaa6Iv+RmVSE0GvyIx4bKMRkgz98y55zyFC7URpv9XXA/+7g62Hm5gq7EtczWTHvsAACAASURBVLd4ipiPsVLqPzKpAGbYIy8QbfvaR9jZxtGPP6Da2kXtygwKY2Noxi4bPg5o1rJillCEND4EGgSwku/vjI2LuPqXbYUPblzDJafEx4rk6HS5tLbNOdo3Z2Xpd3z7zT30KUzEFX+B0zv4zGEodjG88CKKs9NwxkeBTh4jb1yBc+RjsPwAYf8oKQ2Yc7QyaiQJTuN73F5t4P69nzE8+TKGJmsYqDj9suhK4iCJGGOTSSU54Uolmw5dKU03/zBGa2dJZzOvaU1PfSPvuGzCXORgOgCZtdyzN4ly436nn69e5KO+10Cruw+XFuuW7l/EpE2MwkXm4sqehNhmvV43iUF8UstKWVhqfGqMN8ZspmrviBGc42Vz5mWvYqszjQDPa1nQhTes4fnvJ8+yVreNjZ0GXhmbQMnNy8r/WTmrJ1ss9BgPChV3iA0eeTPOaQX2UwE8HPPHMm+X+1ki9w4lfjiOkuq6ydHne2AwXQZXIvGXC6VgqtclvpjvWSpjrEdyAClQsyu/iX0U4ITAIFPkpj5Pm//Dw6NU8y/HN1KDLG3fsAmy5n7ZTb0BJpjefwr8MVIGZlrSj2+YNpohYa7BXBuBJdlm5PUEWpD0TUsNiBmvjfb5s4VpwBG2SuFv9q7vp20rjB5fO3YCSSGwAlpR6RBl3Tp1U6dq2tM0qQ+TNm3/6J6m/QPTXvqwttAfdFIZsBIgBCgBQ5z4152+737XMWm1VlO3p5kHfjgk9rV97e+c853jjb7BYBAXBTuhfkokOrYFwJpM2JxG+p02kuT05Fhvd9iahljAIC+hOlYBAIs2uuqCW7/9HMc6uxSO/3ZQDepGf6tSr1GacvtBOpK1mfM+JIWDJg0C3QBdJQhJSX70OgMHsFQiZhk/IfiU68mTY56w2yZJyd1mDXMfL+Dw4SyizX1qGZXBHDpfM6jALtEARaDHGclF6cakue92vKqQxn3st9toNidQZ5m+Nm6+pQmHricCNWi8qICLSAXg++j1+jh+eYy52Tn4tSpfBClXBcYSJQpPcbC3jfrcDLQKzMNpwdP+O8u77DQqS/273S4X+pubm/hjax1Pfl/BxtYGVteeYHNzhyVvfh+YB7BQncKdG7cx7taRJzlfCD5FhkkshlYpAy10LH2vymgwSTj/DPex1u9g6ZuvsfTtXaPdJGkyocWV4B9v/SuOvW/5n47N4Ndgd34yd2y1WjjY3cHu83V0tlvY3W5hp9Vio76we8KZ+9R7p1SAieoYeokjxiAKTlBlZJFM9agYCypV9AcJszznUQ+OX2PH/fpkEx8sXceNW5/izldfYnr+PUzPXcZYI2DjILqmEiGYafL0qQAqcs7liNFknBOJ3UGntYu1lRW0t15gEBrfi/v37mHv+Bz3H62ge3qK73/4DlevLsBjJ1OHWy1cFWBheRnXlpfQePiAjxPF0dX8AGk3ZWno06dP0dk/RHNyRh6kRm5wF27UJdSUvtwK8qoyTJ8yGcKOqJH+XvKRG4M5tlwd4JPbn+Ejiq3b2RGDF+eCpFmLKQwtVQWcH3fx7NdfcHlqAt7EBIOAG4/WsLH6GOHWC0zSvJPF8EY2X2HoMZJYBsRAFrB52sX+jUxpjJZzLJ/GUbsNR3rTSLLsKQ++qiDK+qLYcAxRng/fR9n3dMUeNRcmouIVHiikEiEwl9MM0hiDXoR+L2IQgBhP6mXNU12oI7Rl+HNhax2T7G3cOEXmSrbm1CqQ2mcK2U/OqhT1AB3zihT7pTYPVmmooVqDe7gD6rFWwCWFSj1A7VIDY2M1TlcJqPc5S1ClNpTTENWTENn6Nk6eb6P92yrOOgdcGI1HCXQ3gtPTMJ5Ew/Aue5Zp562egf5f/oNFiTESFW3JyRnizhGauYda5rGXNSlBIi9nwDOSqKwoiVh2TeooVgEk1uOCpSuIGQBweL0mbxmR55JJVUZS1sSoU7gtr5BT6iLXu1BqiKqRQTZSXNF2OimDgg63ehkAggAHJee0jZks2H8IMq2zItq30PmJysBztWltcHMZj6FcntijSs1j4IE9csgx3veMJ4CW3mTxEGHuOVOlEkBME4vvw0WLMx3H0DlCMtG+kJKAnutYWUnXUB/Xrkzjw/n3MTt5CeOeh72XIVrrLfRO3qxYHGUr6fV1jxKsYv6Z4MU4Pkb45AHUeQh38TpmFhfRaDZx6jjoUTIwqSTcBLlTMaqJ1MzXjlYlI0ADbrAdadzH4vws7n7+BchhyZN4NeH64HqZ2ffwDD//+BPWn21zQoDpBMuMAsBihc5wzqAkk7DiYerWTairV5BMNxCMBZhMFlHrneHg+BDx3hl8kaWwHsXG8dl+cwDjQQ2aPSoyvrcsPF7GzdkmO+L3U82KkgtPJLnoQ6VvWEsaF5N0o/JvdmWU+6btunG9kddkbASYDqg9s44a+VlITr/Z4Hdz3Vt/l1D3cHh2iKPwCKkeoCKMuQWLR5PCqD6gItDGn5frgFfOJ1EOF0QmqSIUCrKzcP93vcKs3BUAxdZAhlxUxpDce5MDwsXPhhSJ7CTPbPZwvWV8aZ1VQhM4QOdYo1HH3sk+WkdtTM41JVj0LcYUQ1Dt9evLXhSaSQiKGhyv1HFEXic1l9W5b9y3UqIEjb0jBTmRtKQ+gpxHqYxvWUpP40jjT+QznXtUYKepqQ3puJbTAWz8nSuedizpLxGs1IpRLtw59c4bqsTpuBbgg2y3TXGxSnZSCZioQDpPjCEmj5V8vi3ERyME2W+jBKxxj36u4XM0oSTncazfUP1uQaRREsAqFLgVQF5LhyERnyVSeHFt7yr8BQAA//+kXUtzFGUUPf31Y3pm8phESIABeUahilRB6UYXLrTKKsutbijLpT/Av6RVLlxauLVkoSULAUNpCMEE82CGgZCQx0zP9MM6937dPZkgG8MiAVI9/fj6fveee+45nlgxWZqCb62ZhI5hC3XjojhZIlthqBoAfBj5LAPpjhR/oCI/EVdB0dhJpRd/NSySXuloiyJhrBYZSVKoXucItvzMcOZZL8M4V4k2gkYW6ol2BoyfwdnT/MGxm0tRh/xFVhuP0qowV3LMH7qbFwqWdU+/Z/4eF0o3iSyAofdArSIM3NCT6yTdPKx5aJybxvT5k1hZa+sMmgW4vdSKTtk4x1R2qwc0ogT1imM7A0oP5ENjYXtwsI9qNURQDZD2M8RmoL1EUjuswEYWq+dt4Do4Nt5A3O3jaauDZrOJcCyEX6urESxRMVGOTfBs8x+8+fZb8CcnpfxlcsPnXvHC/wkCHC5nE1tUyfGzGBWnckQHOLcxypEtVfbOrF2ZimjwJd96sYXOZkto3gsLC3iwtIT7CwtotVpotdt2VsrSGy3sT5VnUuNmAHw8dxVnj5+Gk9YEyQ8qRhgcMhfp66y8obYYkf6aj7DuoxN18Ef7IQaXZ/DJ118BE2Pk9WjC4nlHYBPnEOaOIqXLIZbhu0P6c3fQk+TKtfZsRTe/lEuSP3kXQ4qbgwiPHy7j/t07WFlaFoV+AgBPN9vobXeR9BJr65FKMafNc7JEakLHdnt9jHGeNHVUKZ1iKeyyw8d+ryeqrbtxhompOmYvXsDVd67jyrV5XH/3Os6eaYovvlsPyutLVViQ1KhcddW3nTF1UGIc6IuN38bfq1j+6wEeLS/hzzv30FrdwE6rg/mLFzB/bR61eg14sY+1jW189823aIQGN774UlSP+4mBm6hgyfHzZ/Dpjc+x9vwZfvn5lmwrz7aeS2Kd2U6+3kSnLP4zFJu/fVj259L8RzZD8YdVm5TRhFwEH2HKVH1EDboQFay4OHW2iffe/wC/3fpVhV8Y2xJTnsowXYxjFxmweW8BP64/kVlKvvuDvS5MmmAyAwKxvXELTYE8McnPwALkhY2SrDduStbvFlnZVLKyEMKaUQvQBOvry4i2OphuXMLLOEBvwA5cHV63K3P5yrJXS7JUBFdLy1BRmHWNIP957Jb5aKL/wm4y0jV0UlfApqAxKWtRznsQKWjMJCiK9X23bKdsaEPW55ADbqZwWBDPalEnz+DXq5ZKqkAC43vhOGD/Xtx7S7OmhgG/18fHxd6vUg0kcQhdH1WKAhFSiWkLCaTrHWzdvY/N279jsNbGWJwhTFNEUYJaVkMWedjuHCCcqkviLhHa5LPn2X92/Avq5yv/t/zKk6/hDi+Gir5h14kyESjp0UnBEX/18Y904EYoyaMq/UcONFLsuUc0BoauxSrzY+TfDn/8aPFYnqFz2MFJjz90ADN6vta+krOPBO9dLlAKmxIkXd1A9dkujmUenB16VNPesYmoMYU9P8A+xworBl60i8T0kXKjcHStpgOOuYjVBIxU931xxCD1n6A9QVWh1vM7wUUKJbPhwTFEa53pJKoiTXee1FpdKTBgPcc5G54aVIKwGGXktTGpFXV+JnN8X4zmQwLsetpR1MTwqL1UYgOCsCstPUjuF/VUCHxRWMrT0Qj9nunzKoSS8xXg2X1a8zJjY3AxouFYazky6jhHa8EOSXIdKw7GWf5MjyRCvIMuJiop5hoTmJuewsz4BMx+hs7qcywvrCDvJarFm4Z5nUTKCmaAY89xeGQ/sgW8sZ+v43IpuitL2G8/weT2NuoX5zB15k28DEJsM4k37L/1MEhdHEQp0t0DZC4H3HzZFwZ8NsIO6+GNmo/PPvoQM6aBmtyVQbHHiCMKs77MYPHeIn74/ia8WFd5YptOjNW5bSssKyRygR0nxfiVSzDN0+hNTsJvhKhNBJgys5hNrqCxd4BHO7vwB3tyjyOJOb6sx1y/gV+Msb6MugLJbh+3b/6E0+fPIbzchKkry0rJUZ5sC26W2fwtl7/JO6dD+lYC4FgBRSSid8DCx8uZI0PxezBQFgHXMov/arUuMUt2VcnRDwPWRyvT12enRThwYmU8OMD6i3Xs0Y/ey6wtYGYLPGNnunXsRGj/ZNWJB7+RcUjJA7IhSn+G4tolvzJq78jrpHA52TZu3p21ejesi9gMVUHzVEZn+H5J4yLW66WmBoXx2MQQsXXjlqABNdJkbHlQ7JkyMuAHiIY6/jyHMFVwJrFC1hQAz++KL+C4gRO42I66WGw/xonjpzDrTsPOfttX+/UtqeGYejg+l8V/foSTjRNYNMvCbhkd0xGGFoZQC9scpUYb60EWqioAqGxtyQcYY6GMbli2eT6KIpp0fmgFDzUOUiNB9AO4nmPVKWJzOraucNSXgtVxqVTIdrWj5lb8O6BuQ6+nOaH0Eiicp7kPz19GPkSYj4U8470yDGS0IE6kbpTinGxEYYIo64RLaKxKtizQj7ryvMm8VJFV1sXlSJfYLIszU8lG55qg+HbOKFEdhbz4L59Jv0dAS0ESyW2FuqWaLfT9Nw7HNQP0qZkQBPgXAAD//8xdW28bRRT+9jK246ydNJCGtGqaplSQSghBQQXxhMQbfYCKV56QeOYf8I8QSL289IU3EFWBUhG3hCilbZrUlyZ2bMd7G3TOmdldO4FyERIrVVErx7VnZ2fmfOe7+PSlp6pV7ixnHXt7W7X5AiazMIkk2sPSUNjR0NAiLA108hI/ARsf4mYfmrU0hmqhTS4/O2aSEszocPh9CxmkEheYoyA0WYhiKmiQZ7rjHoMCmfu262Rdf/o9Kv6zBADW6+QTkseiMiVd4UQosUPqVpkN2nFFf0//FsYRPDI9c4HqCwGOv3QKmz/eRbI3hEowfgAvnMH6ZAY4DHGsUma0PacEkblIilbrKYIgEO0VGViYWC970JJJEfPiTBv2UB+gzHmjKZu71Y/NQlWpuyULWak0hWESI+p1uOtamlkcW0A09FGr7t+6dKY0tpoybYANJXFBRIcyBiD0kCi/BGXufRyO2COh19/n7n6z2cT9zU0u9huNBu6uNdDc3ka73ckYJ9rwnm3p7WkbcEf7gAb5t7/izeHCwjKmKW6GeP32nMzRNkLLpmeupMoI/RghYtaD39t+iI2og8uffY7p1XMUt8AMECkInWduSNlcyn56JhlGDDVpYUyGkdmsUunEwxoJ2vcWOEQmTIgbV67i+hdfofVoC+2dHfS7+4Zq5MIZuVBOmc0hucNDej0C2HgTUfC1x8CRZqMmhQE9G1A4cBTK1QqOLy5iaeUMXrv4Bs6efxlL587ixNJpqJrkOXvZzC1o53ksxkEPTcZovV3sPN7CxsY67t1rYHP9V2w01rG99Qi9px0MuwN4kXTJooMI9fosx9/Zs8XG+mPcuHYVH1x6H5X5E3BTxWUtzQ8VBJxn/PGnn2BuYR6/rDUw225j0Qkxt7iAyx9+hNPLy4dvhEYh9cIyMNxsy5qc+cWOeV7b5BukhQ6yTri2OfIabi3A2++9i2tXruLWre9QJrbIEZpCYQSZzjrJg7ZboGa0rwU8dKXBLiAinLHu++RnTsReSjp5drEp5K07BVosjGGRp2VIBvs9tB7cx9kzK4zeK1exrKh8QKZNfTlMqzzHmNdNP9e/WY1vsfCyjt6xK+Pu+WKMpEheUs2jnwIIKhEOrelYYuh5R0u98kv2D3a3pf+HgGJbYJAZ0VQlM0GDAaVQKP6pIwLjOaPIxM8r8SGMiv+q4+CY76PSDzF80sTTn9fQ/PYm9u6swW12EIQpRzGSTUHkCWsh2o/hDBPofgQVGIkQx4e5hcn0/0sK+SvXZG7/v73+61GYjLyE2dP5kM9G9iGSQYju1hPo3j5mqYO//hse/HAHnl/Fyquv48SbFzlBwp+uoV9ykSq61yES+kMyReqIE3slFG276yZ8wNR0II1TRBTvleZSF2IqOewhNIJLr6EzCoEBfEhM2YmfnyVS7BgzvoxHRfIaJQ+UNoxXmwSemg6PAH8y19yMci+wkPZcs9+ZsSDIt9B1ZKDMcxgQ88h00BXPJYkZNHKhIyjGPMTGwwixNYyzBl+FuGfrm2BYYpkBmGezrlNmBdCSohDj3MLzuLCyjKWZWUwDGHS7eLjxCK2tNjPNTKJ1YSblwPnkPC2+YpyDl4B2FQIuS8Mu9m7fRKnTRv3gALNLp6Ceq2FYq2DoTaGXSEOqn4jBM51VEKZC33LIwT7CxdUX8c75VdCE8JySCeRDJgSglT7a28X1L69jZ6ubf06bDDCBaFGxSKkn0fwM4pMLSOo1kXxWfKaRzwd1BF4Z9f0Qo2YLD376PlNU2EhtFIo2K9sigJ6ILLv3m7j99Td46+QllCga2hMTxsS+XqfZGNtzuwWt7d+1cTrPu5Fyvp40bE4L7FUCnoNyAOUoOR/qQmTjHz3Qz7xyTb/ALTF2oiaavRY/J1QMU6OM5ljGCk7jsfg8kdXKMyP1SJyDz44td90MpKbC3n4/6uYeNk0lpqmMDRvKmfqC5AUEMqfO+PnRRpjTT3pvm8/uFWoj+1lSIzmwVPHEsDImzQqzyxHtHhmp017cGe1iZ6+NmbkapkmG4eDwgvkP74ONoqSUs6BUzY1E/+Tic1CaZgwAGAaDGLn7fFbxlZtJJ6iIt/GH1sDPLZg0Z7IBI5VwTJR6YhrYig0BY2EWeD6zBgTfNBR77WCUjrJYevveVqZNn6tE4A7JJCmhzqOazQQnk/Ei17bmd82zSOb2zDym9ZVAJ/IUMGaCYgIpNS/VuXa8aB7w/SXpjPmOwjaxQKx4HhBQMXkJAJFyt5/N9stlDAYD3qPYAy8RZj97KjgOfgcAAP//7F3bchRVFF2nu2e65woTEyAoISRIkaiRB3kQKqUlL1ZZpX6ib3yFpS+UiFoKQgJJGchlTDKBTJK5z/R0W3uffbrPJKS0lEfPy1Su091zLnuvvfZaHl2cEWAYUdCVwWIW4p9PN0xJBb2xUSZ0kdpamIszqAXTVMTTkpN0xRkKJ+gQBDS0KiQGTDjx/u1OUr039IYBJ/kDayI4iRCg2ZDMZuhYC3o41CwEV0QUlKA3PCJ9wMLq5dDf12gQHRqtdourXBQ00p/R175/Buffn8a5R5dQe7CSiLnAVFHEEYLuugPgoE+tAAOMlQus7m/shqg3uLazg/HxCiYKEyMLI1lqwoIgyhy7LwQZFIp5OAd1VKtVTL5zATnqaR1qARCHfKyjCJ39OvY215E/PwWVCQRRd05UbP7tsOtZblIxFTExCgSElhP1+ujGXTSbTaaAkwUb9XD//ugRnr94gbWVNWzvbKNHYjMm9UyCef1ArRbP5Agh0IXuqewAY1C4PX0DF7PnWIgp8e6PxeDMUUI7jtBsdLSlTTbGn+1d/LT/AvNf3cHCl18gYg/YWFgn/2yMppqOsJkdbG9s4scf7mFrY5O99tudNnKFHC5NT+HK7CzeW5jH2bMVBgQ4uBKK3PLDJ7j7zV38eu8+K0oX/YATNQIkPEXiZSpJwEw41I/6rD5Kh02TBP94ITnIkv1V5S1MTk6y/d6HH93A1fkZXJ6ZQmW8wrYyHHBSUYvUqyOJOp0kgmTan5uRNRgOGLD5Y/UZnjx8iLWVp1h/toLtzQ282qnxxgMG9AbIeS4KbJuoUfU2htSViUKpAmArsWJ/VXuJg/2XGCM02C9wGBWKoZpbKOHmJ4u4NnedRQ75QC7lMXHxAsplsiDMp9Rwq1qt54oEC8d8p01V7HW4tv1Jvv5n6f4AEVWamnsXtz6/g6Wlx+h3O0g89U8ZvpCZaC8har4y7A8RDvu789kVfMN8RHYw7MR2pVheBQTw4hitoyM8f/oUc4ufwqeDTbmsmcJVfLb2ErtUpaTXfsgCo9yKxAKcp4NhjuCKkdL7lW09mgQtSqHo+yO0umGYgr+GLmmfSUPLaodhMqElG2X/SBKNdItIK+baXtLR1U3aFvwscm4eBT9AXgF5er+DOrpbuzj6bRl7D37G/vIKsodNXfmX/zkgYTkKmh3N8hj0iFJ+hGI5AyerZM+IE905OzZ70z37/2sAnD54rkdacdpVWvS0R5a7tRo8ooCGGYS7NQzXt9ALe1ipVdHY3cCVxc+YBu8FY1C+Qtcji92QBS+ZXhvF8AKtcE40HlKCJp0LFrtr5xgAoKo2AwDkckQAACWPFIRR0E52lZF2A9EsAhG+ijQTKQHveA1pdY9UVDhNatmSU2Iv01ecCbzEOot6+dk5wHpCylINd3k5uLx5KEd+TzpoIunRf50OFGR96kp+mvzj2Po069AWKOSzaihaAiQQNwxRxBCVwMPNuauYGT+HiWwAt9dGvV7Hs+Vl1PY6YvBmHoElfJaAC6d3a53cf2MtuAUFf9hCr7qKnb1tjH+wgNL1ayhfnsLgbAmtMyUcqAEa5R7qhw2EnTahEkCXXHMaKBQ9fP3xLcyqMu8dStIgfa1ZAZ8DrK8+xnfffk/dAjB8JtuaNHW7oM/eY92H4MoM4ksX0c1TohaipGL4xQJKTh4TcZZZpKrdQvNgH41qFZ4wTBhUceXT5fkUCQCsKehBCCzd/wUX5mYxfXuB21T6GTBzBRK/a7aZTh5PJrijIIABbo1rmC3gxoLdSrcUEAOH+sOzrBf0Zofh9NHrUbuJVqfFQEqQy7GrRSxtxmatuIbib4EW9n2mucxocUznD7o1MApTACSx7TuhHSYuA1zhd0RIcfTuU5CFtHOU9GgbjQB3pHUapugpLmy69cDl+yFRUzc+afLncAtCD1k3wGGzgY3tTcyMvU0zX9L2/zaOM9SoJZuc0txXHrNAkRAzT4d6TIt2QpeneRVpNgkBJ5T3kf2vyfHSovEoEJXsOdZGQEm+VtD3ErCF4md6tpoJIvPC6us37HGTA7KguuybxDyg9i62u9R9f4lV3/Gefv23up/f5JiGrcDFVyqADPqJ6wPNH6MRYM8PoxfAjHHPCFqKFsCxojtfF7ERWKw/Qr9FDHhqRfD0PYumHrMr4hh/AQAA///sXVtvG0UYPbvr9T1x7ERNExGSiBSQXa4SL0hIqCrqLwDeeOXfIXgBQVuJSrwUkapqpBZKFNoqtzpNHHyNvbuz6Hwzs16HtErLKytFuTm78ezszPed73znaDcOUuilYjhGtCwoIKJ8pB1EWrXZMgAcNe7vt4NvH5IJAYSk90VXbcSuL4UQWq9Le6RvqCxmIUySrxLkYjy4VlxB94QwedK9Ha4sSKN+X9Qo04NpeyaIJCmh1WjRHekxoY0TJxqVY82DJpup0HAd4xSV8uHkdX0HnX4HuWoO8/VVbK8/hC3aW3wySBBKfXQjWgKGuCh+1VpTIOPq3j6CK6x2z9RqY4sWpTdjvcBYH8tYswByPkoqj2qtis7uHvb29lGbn4WTc+H6rsQYHv/n0QjNrS3MX7qMwlxZZDuc2PmvxX99zycqojLSGB4dYWd3B+t37kqiv/90Vz4Pexphax0dodlsSvLfOm7L+xZ15kh0w5GnJYbSegcwbQOhtX6JJ2vSMF8zQC8o4MPSKt5feAvTTlmobbAbGsZaFlY8LWD8U8rhIGzh1/1N9F+r4OrXXwHTRRHAswDXyyKlrgFg6a1/44fr+O7bb3D//n1J/gW8MvaWtFyrzc3iymdX8PmXX6DRaKAyO2s4jq62aFKeKFNP58oSZEyVq+jT45h2caQ8R5FYkJEiRDR/xIAs78vfVhYXMLewgDcbdaw1Gqh/8C5WLr2BwkyJnQ0yplnz/Olqk0ZaiLxq3ngEpJRGqTFwxMCM7Iw/HmJj4x4ebW3i6c4Ogm4HQbcnfZBUOqoVCjL/4jgLj8m65yN0SGVSUL6Lg24HvaGmv3lM+LMZrL3dwMLSCstXCIMhMn5ZvAU4KzwjKFW5eAGVhfkk4pPNWHqmRgLoJYn+aRAgdW8ma0jjn2OimmTAggkWgZvMo2TyA+MItJzHJ9eu4taPP2Fj/c6L54gV8LPqy0wszCnFaix+cQVW2Lum2u2mkobn9ezZ55RCaD40u+Bwewc59u07nmZ8kBbpZ0VMkTRkvVEYQS+74SZU/PP1cFqLMxGdMXuMEtpbLC0LPIm1bVVmTXcTCmkwEYSFZqiVpfsaarRKBNAMqGOD0FirQb7xhQAAIABJREFUuRMHFPV1PyuVHglK4UlAXgxDlFWMUr+P1oM/0d54gGe376L9+yaKgwhTMX2AI1GuDk+9ZxHWVDFO2j3kOgX4tZJcR9nqufN/kv6qR3xqbsfmPr+MEwATEO7ZXA5Ip2Xyj8EAecYwoyHCdhf50VBgxqDVxONfbqHb+hvLn17DTL2OwoUquq6HE9fHMKP3JpVRApzLPlIkRZQlbJ0UFOiSkgIAeE3SWNn2Ql2RjAEAhAEQaoqrZgtoHQsVGnFB8yGeKvE45rC94joB1yKDNs6ygaxrAAFpdfOcM9o4xodrVgV1Dh5gkizhVFUyrXOS8sGODR/f7LynXhPDSqx4ToS1xTnUF+el+l9QI7Rbx9j96zEebz3RlUVJsk41E55jW37hr6VFMYNMMILr9NC69xuC/SeovfMeapcvY3ZlGRcqVfSzDvaLLQxOOmg/C9E7JL1c4aPXl/Dx6hqq8OCLpaARMyTvT5DIDDDs4+b3N/Fo89mZ42vndGzAA4pFB+UKSsvL6Fcr6LMHORyiStDI0yr3xbkqZggxBBFOjntYv34DweGBvI7Ao43rYkPnNwZ5IlA4JE5w0MPGz7extLaCTG5KKpyc00h66ZMblfyfZwlmJ0wPuoGZglu6Yk1NIArvcR5nhQFQgDvhPqWemxSe71DJrqYjFYXt5g66gx4C+qMPwn8l3Lp6q+8T8510e3JsqBRuuic9ldd4ohIfCvDGfTGf9xI2Kqy+DpMtAwgwF+G4iT36YGCuOdZHQ6LUHycK9PxgAq0F0rW7TsJ4M8lgRoTTkVjZUfhXwECDJqX3G7bcRKJ35Uh8eNg+RHvURyHro2QkK1/1GLepmq/ZopTxUczn9boidpqTIgLK6IFMiGhLi0oswLxnCsXWqj2ZY3ROkgKv7sOXsRVHOMdSgybY3JFV1U85von+S6Sd64IwrfavnxmrZ0d6v2W0WL0Fe07GKVpfIJv0/XNO8GAxXd5PKiln8s/vtQC9BjEsO4GDxnWQ94gtB7bYYUEBe12el3kQGRBsbeDBtgnt0jdpfSsEx1SOTKc069Knz6W1EQgQ+Nks/mHt2n6jqML4b+6725a2W9rSLQhSC0EiAYMGSINGX/HFGE1IDG8++af45oskvpv44iMSNRJfNPESW7AigkpDy1K63Xa7l5nZuZjvO9+Znd1CGg3z1HQvszNz5sz5ft/vYvOJse3MOKJ3kYTaIwYKfMByIfRrZmpkBbwhNwejNZai8fMPt3soxSBykUqMoI4PhBR6ZLzH9BnR31Axn5DZjhFnSJE6IUoPD6az21lUCQMVcsPlXf31Z50cKJAILYOo9ooVECsXYKGJKL+DmClymQlIIp0miMuinaBUdjF5/BAmj1bQXF7DsBD2TF4uJ9mzin4t9UXrfoSNZhsTRSfzIqQL0um0UNvYROVgB8Ojw0whVlTMJNNjQXf3SCfCSKeLcUKrG9tYq65jcqOCufIo64xMeS9piVsb69hefYCR/RWlQ2O3zDyV+79vrFAmarsYAHUf13Dj+tf49OpV/LK4iHqrxYsYCfyBZ/bvL5WBzwNbCk1bMoptQcw0Dpu3TOFBL+ghFSj0cSeM8AJcXDr+KioO5aoLCk+oKufTWojbO3zcTqmIjt+CWx5GtwT8ePsu/jQbePPDD1A+c5I7L0j7NZRP23LWQCKC4AwdLC8u4ZOPPsY3175ienwkXUtNRSN9eBT4WG228MVnn7O2/Z333sX7V65g/8w0L1yfnz+GCxdfw63F39ButVGyXNQaO9zNNxyTmSQ8dkolzM5WMDo1ganKDA4dPYLJ2RmceOkUylPTGJkazypAMmCDkmkrtJDNiHqGJdyOlok7DHfQaGwxc4HcmEnTf+/2HVRXqxwv+Li2yVo2GmMFS2UeFwl8445WzOiXNpsimYpPxmm2iZHJCRTH9qF88ACOOilmZ6axsLCAy5cvo/jcMV6F8GTLSx7IMgYqVnBgo24d8jW6XhgYmlquGUCp+FEk7BecxLGYFhnMxAn9AJEfoOsHqJPZ5FYdj9ZW2Jyv+ngDp8++goWLr8NwvZ5HwIDpHtHMj506iUtvv407v99Bu92U2EpFUcwkQfJjLQ1Msm5NZXOYqRiFDSwZtV+ELgJsQ3k9hPIwc5XDVl+HRZk0qs9QkR+yhpYYAAnc1ED173+wubqKIdKFkmmV66sHiGHB90O4RHPrqrmeKf3MCpAFoY6decI9kmQeiNrZQ+k9ozDiBZYqUNi4X0XAsq4fcMm/JL85ET/4okgBh1GiopUYEIy6u/YJ6WTqRSzrM2lHtsF6QEpPIUScmDSjhSGUC0MoBiHitUfYvrmM9Rvfo7n8B4IHDzEWU+etwGCJo+AnXkyxV06iijrO/Y9ihPUOovESEqJ0EItHji+10361zMC2F8U+fcL0kzd927ubttc7ni0xf0/a5//4zozOPNBtQkZZftr3q24mDVi7m6JZXYdffcRVUIHYQlGERm0TdmowKEl+bWNJjObSr7i3vo7ZcwuYWXgDxYOz6Ix48AsmGoaPIKHGgHKjDkNfeT8QiOlaWaQesxlpEUcu/wwGuDAiZSRoUAazlgmQ6TL/rZz17STtY/AQiGCm6GuS2Dp7HEm/Plc6nFk3n0Fd4eMNsAmZNaDPJ+1Dd4QcZT4FafgkA+NDX146PgIrOO4yNeWYk6wLB1kI03vSVIsWUo5SVuZ/dJ7IGC7mNdDL84cxNz2OEiIMpSa2mgFu/XQT9/+qSySdkVGN6cM6UVb/JqO/XpWrr/fadwS5v02dJookCuClXSQPV1Ct1dC5v4LD587jyPkL6Hr7cGJ+CjvxDlrhfmyvj2EsbOPS6TM4ZFD8bSxgjXgsaMOV2MDa7RXcuPYdd/8LbL+iAGrDyDn/SThCaJpougV4c3MID0zDHx1H4Fg8z7QCHyTesygmMrXgTYxi/uwZePBYkvLzl9cRbFVFDqDmXGvAhUiBnoAdG3i4dBdL3/6AF986B6vssDadGE12wc3Gkj6vOuveyjXmIHUCz65EURatOo9P9koy0On4TIGOI8rCNzA2NMxzKadpPaN5x9BxnMSsjbex1WowU4eeW6aAwdoDjAzOad1lCN0/4rW+qkOy75P6QMtV04EIN49SMsweW40Bd6mdiBXMRXwQMY2bQUJTRZDnpQOZFIa17Kqp6XmKG8K0colA53uM32f2OtupKkTpueaQhIMlNSZHjBKCnzIzWka6oUAC8l2gSxamITbbDWw065gqjyBOwl0d5MFt13w+wGazpBOnyKImPMvGcHFI6diFBsiy7DhUxbpsXPgSTV26+uQFpSUNbE7nKO29K8brNHh1hr26Dp4AjIa43Vu71uqKtk9zjIoFbLXaqmBnT4Bec5HrXXbfV/T+/DGzFEEYCpm/Bc2vMl8ScEHfR6/pWllvVMhTx57+T1F8dP/oGH2KgmZGNEnfhfWRB89IXqXZ3lT30rigdUueXa/GhLAfaCxzLU+efr3kPTKZDwMCTyg+UX2PiuY3EQQB/gUAAP//1F1LbxtVFP7mzoztsZ2keTZNUjdVRRWURihCIJAQFRUVVOxhh9QfwAaxQ0IskdjxBxBCYoeQqorHIqIbWqS0iJY+VYGbpKmdJq7t+JXxvNA5997xxJiqpStmE8XyY3zv+M79zvkeMQMgZN2FzZstQ4g4Tk9XDgLlRCgdFoM4n5AmL2M7XBjQOgfP7xk2iL5yfajiADXNwleAW08ya/ZUHidXe9QFH6puMNNplNMoD4CQUYM0WPSXCxWJz9NdfT1o2gAwvkgCuanUF5ylYgKFIeLEA/0+vqK0BWrhsIXsTRIm6ZIuZTKHwokF3FqroNtyVTcvit15tSEUbVtrPrDT7uBAzmatPN8QILUdjQaBrl12fWXKB6QJBd0EA61dpvmhTYslePNCruz5/BAalQrW1zdwcGYKB8ZH5HMjmbFrhwLV0iYmC4+QHiYaTOaZFUAhlDnhXhfedhVffPY5fjh3nqPQKAc0xUq5SFbFicadcG2KBnTH+rdz/WGFGhRFKuuaNhO0gPvdEFOwcdyYwYmJApwgLdGYbSKmDSgjP8/tMKMlylhoCg/3uzWsFK9h+d0zePmdt+AzoFTxbcbjY2EG3cbIMPDy6io++uBD3Ll8Td3waN5dBtpuKIGLQ3q4kIoiFrxWG6X1+/j6y6+wVd7Cx59+gpGREThjo3jv7PvYeLCJn86dx055G8P5EQY0ROU/WjiC5eVlLL24jOm5WYzOTBPfjrhYqj2M3u5IyGKLIL2EorfZIlAdK+kpQJvVvd0GdrYeovSwhKu3r6JSKWOjuIadjTKb1DUqj7h75bddpj56kJFqtiG/u2xm+bw4kcSHuwGOg+zoCMbzY1hYWsQbZ05heHwUr55+k7/n/NwhTMzOAnZGJmhwNKGi7iWUlfuP/kd7vX3mi0SeXCANCZ3JOM7UBa/ARbvRRKvZxG6tgfWijE+8ffMmyhubuPdXEdXKNvaaVfbvombO2OQ0vvn2Ozy39AKPZWj2/AZ1NdxOpfm/198+jV8vXsLK9z9K8KzSlgcBIKEUBMkcaAHEJpEDrzt1STN7SJtoBtJQap9CJjEybHQayRhM8mEgG8h2rY6123cwV5iT/hy2jZSTRcrJwe12eN239O+NJQCKlhgavZvWk2bJs5N2z10YGswavYJBuO/7hlysC1VuOd+oiSXEBothj1KcAMSRYgHoc+KCG8kb0jJeKHB9DKVzmEjnMRQayGxX0SoW8fD366isXoP7x12k6nVM0tpPzghRqOZE6q0FFyJltJbfasHbbaIriMTcRXunjlwug8gKWCaT1EPro78j9V+P/6erwLMfT+NLIHXGRL/vor5VRf1BicE/xeM6VgrCq8Frt5H2Q2SELGSbbIjsApv3sLbSgtsKcOTkSQwfm2V6tutQSkAEl8Aidd3offqBp2Iu0K2OtcVC6rejwJRF0UAxavwQZtriPYihQHekc/kTLCReurUaWYEyfR0lBUZxVNQA6WDyOfE7KwYm+wQo0lTI8V3oMzvtHZEqbnBHMpANAK3RpT1kmCjIkBxAqNcglhQI3rNQ7FzQ7cA2XDw/fwSL84cxOzSEvOuiU63h3q0irl+59W+nIQ/jyVgAj3sLocAje1AFgEPkjL0OGjfbuLFVxu6DMhZPvYbZAwtwZqZg5qdgHi/gkBlhceIgG4YagVzAqZNuI4NIdKQnBIBLF37B3Rt/wlFTv+/0iaknVMEnMuEJC/7EONJHD8Mfm4CbyjDoJxO/R/UaKrtD6FhZeLTupizk8nksvPISFxqa1SquXPiZXKwhUwelEWCkbvX6o3nn7BsI6l3cuPgbDp4oYHrsGM+7G8emhnExw+wb2/74skFLfxKICdXsy6Yd2IYZFxQex0p52oN2l10EaLgtNDsNTmug9Zf8Z2jMk5p+LVXQgMnQseGhltMYcTJAP50cCvzpxyQzOHGdKRYBmZATo5UwkqfMPrXWXHsqaAa0/j3S89m8nLrFTZd/RymOVw+km3vST8GS2nMC1v/wPFGSC5ZiMH4x0aW9XWCylwSBvtJOCUtj8wxIB8VbPu3R8xeiQrmFfDaLfDaHJlocrSljJG1pwNdXsNTyEe3KLwcSKmgjwWToM9PtnXckY+ipO27LznaS0k8MaZLbMrZTRQLdjZdzSBLwRHoc40l5bVCRgUA8YUb9Gbrjrg3wqaVH8yzZAORkkgDfGmyTISDNHzGyqRisDRJ5Lvd7GCSb5PKzFGVfJ1RQ64qk64lrkM6L8Kk+j2SSwB4xVoiFknXi19A40xhkMhn8DQAA///sXUtv3FQYPfZ4HvZMXk1aSts0IQ2llAqJgIQQYoOqIiF+ACsWrBCLIkDiF7DiF7AAsQUqdQuq1EUEohItQXT6QKgPkvSVTpw0mZfHHvui7/vutT2TFoTokrtKNC/7+nXP+c53jsMMV676byT2bPqnYysYiLP7oZABPDGhuOuTaRSbEjhyECWeQk+SvbP0YYiGWDvbMpurGY9sIiSZgLIM+70oZceon4P+NjJ9ydqMUmd/Y2ww3G2SaMOFPJNnBgProfhBkfUkXPEiszpmjyjewRKTHJIQUdoA3SQLlLdPJ0cvwsjkKCZn9sPbPYUoWOPqfV+OklT6LJU6vTYTwO8EOBjVUPBKsGOpGNDvUd+S7/vYvXe3nkOlY2hMrqSQJ/QSqS2cxGKmbHx8DC2S+q/dR6Phw6Oeq4I24rNp0d9H6/46Ov4GyhN70aOIsYLM7Q435hyL+HfD1k2Jyt/C559+hu++PoVWcwsug/cymlZfgnHSizlKnasT3S4wcDzyxy31E8hGpCGC2axSrQivXEUlrKC8sYnnnjyMMbuKmjuGqE39PwbMy/mmrMxXgCSdq2ob3y6dxYXtNSzsnYQzOom4L+64ckMydbZHd4YPdIophWvXruHjDz/C+fM/Y7RYQY/kNrYjsVEq1D2CBXGLpoud0hhY5aIQdQL8sLiIr778Au+fPAm76KDyxBje++QDlEddLJ45i+l90zj+xgksvPQi5o4+A6daFcBjwpA1o8nqHMvOKg0c2xYIg83vjaB6XQTtNu4sr2Llxp+4dWOFgTAlDZDL/j1/jZ1nCfATeZMEIfetlmxh0CnXXun7QqJZxV5XFg/jUzXMTs9h/+wMjr5wDAcPzWHm0BHMzs2jXLE4spJqEgm5YlPEG98DYq46kSiX7kvF9Px4GNhHumDJjgpHhyCJQ374Fko2t4FQIkUQtNFpbuP26jIuXaxj5fpNXPntMtbvNrCx1uDKf9wJeBFOFV+XSDU4qO7y0KVj0wtRv7CEp59fECBqJ+mDKEHOMNEmL4DDePvdd3D14iXcXV1mH4OBVFyzzXnpfg78IyUBhq5L0/Ov/x8fnWBCdWvT13Lc3GetDJszlSYIWxQZxkAzjnF5aQkHjr/OGeBOYqPi1eB1Wui2mwi7HV3BF6vtWMr/fB80btCJ9WgSwAB7MSpDRpUo/WywBlfF4nqcOWmwg28c8oPdVP4TrS6xjau8qb6xI+FQ2wcRygT+SyWWYo6Nu5j0RlAJFax7DTTrdaz8eA5+/XckdxoYjRQ8vjoVAoQoc1hrJlXlNEFLwSVF1cYWrHYbGPG4XWXL34Q94cF1S9BKvf/l/49p5EF2ngTIq6+Qe16Z12lxFDa3sbl6C7jbAJwSXK+KcmwheNBE2GrCRR9lrTAKTasYLQI3H2D17PewOk0cPP4aqkfm0LUqiDwxXKXzI++zYX7fKFCY0u9nef3sPaFkZ+T5TQoFRzL1lSgCFLlS5/Y1YfJfiDHbVE4VctdbnlC3pDJuWrpU+pDN3pMD6JZZk9DnYj2pqYlcon0ztCtJYuTefQElsZgPJnqtpLREOZ96we83i3Utry7YmZmZ6zh4dmYMrx6bx5EDAqajqIV1/z7qS1fxx6V7Qo4qO6WADdgwRfY84fmwkVg7lQGDs6vPId0/TQRuldeVfUREfJ85Df/KT1h46wReefMEZo8dxsTUAewqlzBJ1fc0h0X39KPDqRMU/7d2fRmnvzmFfjdrW7L0fhT09ieal2d5uVNAsH8C1af2IahICyLHNsYJ2u0ADX8d7doErKoHO6E43yJG9o1j/uUFdvje7nZx85dfEbU3UORih4VIE1FEyhf03JGCpAILrdsN1BfPYWp6D9w9NTGYjEUJkBpM7pRQ/Kt7GoNu22ZQWNSA2ah2HgcJoHTuVA89NNvbvO3iPRYg7PZQdr20yl0oDF8LSpNpOt6SY2zFjM+4zOfjyf9pP6El/UYiblqIoRXK8uzKJQzoa1SSyhwh1RKV9pvnvc3InJwryryNcSZjt4a3Q85HjgtUorYzRVzbccmGBGsbDYQqQNVypcXoP4y0TTHXTVx1PTZQJy+GYXK0YMy0TTtRHGvJf5xKfAnfMbZTg60CGfGU5L5PCr9GSZ4eK71sj7XfW4oXtZpdSAlSFwydT6QsJIBNIF2TAXQ8uFqew8lmSPuCnHMmmm+gDYYilinpIOjy97JSTGfxy74IqZBvm8/jUMbKZBarY/uGjTYfNaSl2mFvCBpMJrEygPBrJHOcJPgLAAD//+RdS28bVRT+ZsbjsR3HSV95Qev0qQa1BSGolLahLLqGHZt2x6KIDRI7/kEXSIgNPwDEBgFCqLuqgFJoBSq0NLQhaUjjpqRxnIcTP2bseaFz7r0z49SCSl1ys0irvOZx59453/keKdZRSMfJ7QdislGCSAHgDH3fY2oHTUhVlHPn3xS0CSqEFQKjvrY9BsnlWBjh1K9kAEoTwZnhMuNf3bBsNivQHF9DLptNaB2EEQMht8q1kV0a6abKSUWTzPNiAEM9lLHZhNhMI9qb1HmEkcOmjjbJEyQdh26epugW5Gyd0mQ2ow6XnOUtYMfoAPr2D6BcLkO3lWZRgAm6tH6hv0SvubU2UHMcpsARuEAdPHp+yUhjq7qJVrOFHtJoRRuHeJnww9hli90JmPqhoSdjIZe1sLG1yYaAI3tHpDJeDFrQ7Y0VlOdnsGNfEVa6IBkFTxa4T9tj4ng8L8SVz7/Aja8uY1fNxQgLIMhB2UDJXUEdAUcg2pEXAnWNpSxEHlns5qo6d2Ak1zQ6F6iRgQHOWh8fH8ehsSM4eeZVDO0cxuLNB/j44gc4nBtBLtDRbtaRSpuQwcP8QkeLOy2KmmUgyBjYgI1vfruOb0v3sAng5uwsLjRspPt2MD1KY8Lcv1+HsKNoC7CyuoJLly7h91u3kCGNDvXHTTI7cjE0PISzZydw/MRx9GRyWCyVcGPyOuZn7rNreMNpwk97qFbWcfnLr3Hm9ARemZjgDXx4tIh33n8Pb52/gAPFIvTeXi6CqPhyQo/dVzmGL7FACH2WF58DIYrw4axv4NHDBTz+ewl3bt3GYukhHj1YQG29ivXymjCtomghQmUtgUJTckM2k8fqVg35nl6mPrXaPrNPHOkUTUXzUFEwEk68eJzlC8WjY+gfHER+VwEho50mu0ML5DvF5nIcc2kq9bvLxbqupxlNZtV3cgmJTi9ImPol5yuHWouoLa+N1UoVq2urmP5jCnPT9zBz9y6Wl5ZQKS8jcDzontDfUhpBH5lPmRnuDtLaRwBeoSfDgJxnprFQWcXs9AyCZhN6f7+k5MfzI1QbmjQKO3nmFN5+9yI++fAjVNbK7CgRqC03iE9Hj8vijiE65XK9k13ybMbEnqFBHDh0EENDz+Hg/kPYKFdw7ep3WJyfZ+A0OaJuCwGt20AGg4/eQemvOWw+XoK1dx8MzWP/B0oSIdd+V5ooiWMW3T/SHAYS2RYxgd2ZCvELXveudzdw0WnaHf93PZuBHGVu002So1gEyeFLE35ONiBzw5SFvpSF3VoK+c0G6uQufnsKj69Nwp6bRz9Z+7ddFIhm54W8xqZhSJp10IHy0S5AbBcqHnPtFixif/mAXW/DXttEpq8XIdFgdTEP6Nlms8KICp3Qtf8HBTO6gtu6ZroUsvxfRqA9CQJ03O8EiJa8Rh75Oiwuw3m4zGsPdexzVgZWPUStuo6A4svgIx2mOFK0JR3TuWigddWp4dFP36PeXMdo/XX0nziK7OBu1HI51PQUx8xR0QFZMEPuiSEzHMENCu7SQESsQRo+QTZYuOESSHaNfIdB0kQ4+qwAz0CaAD75HGiSRqS6ijxHXD8G88Mwes9Kxi5rkl2jqWKdJY6BBDEMQb+XUn8yig0T8X9+xFqIjbmiexT9W1wfPRRcHorByqQ17MmncHpsDC8VRzGAPMKwivZWA/en/sSPP/yCWg3oUfKPLs+DugJkwdDSTe6g6zLxIU0VL0c1xBVs14Iz7PydBOTRuZHMkzr7WUpLKZUw+dmnmP/1Z5x78w2Mnz2F4SOHkS6kxAohpUwsZWSTW8Gqm7xyFbPTc/w9rvRi2l5MqzntazqaZNQ7PIJWIY8mm/ARc0SD6zvQUxoq1RpWdzVRyxSwk7qmtO6YIXY+P4iXz70Gx2miZTexMHUbtlNHmtIqjAReFIqZxDImGHCaPmZv3MGRYy+gOH4M6RwV/yZCAh2IWanFIqPt9/ZphvCF0hlOzZpZuZ/He1nEBnuGoUlplgsPW+2GeA/XRcOMapRkEU8MDVWf6IYhTd98NsuMniECYpRjOr3byvOPWMrJqSNTL/jrhqiZlEs9F51U+LltISmQmu6kpwAXmG2XO7Ekl07+fk3m0hMjmzwBVEoAgQD02VdSmy77oQIBROMjNgol1g0di+M2UG1soidv8b15liGAosQ1IfBLfpDUlJNTLJNl3aKAVo0PPWr+qlQGIRnvBFySLInIew2xJwqDIzkBjqjufCRFCkI2SfclfZ/qPNu2YRlUJ+VkUzgpLBYADhfzFGnvelKm4UqHf1EL8zFICQAZN9LfpIKb7ktSHtARH8k1qPA26Czi4zg/lXSg2F3b50qHtEoBtbJWTgWCwU6D5QJGiuc/MQDUz9F50CA2BpneIgD+AQAA//+MXUtvG1UU/ubht2Pn6Zo8mkBRSdukqlDZgQRIbECwQIDYIH4FC8SGBRJ/ASEhgUAsWrWIFcsKVZUoUBI1DbRJkxCljR+x4yRO/JjxzEXnnDtjO4WWWSRN7GY8d+beex7fw/Y0REAUO7XCoK72kieib4riarvZEnEw3UX3eywoaMLwA0uQBz0AwtO3Oelkez5bJhQpTNPml4jFxV0gWARVt7NrhEmg0huGK9UKS5QWPbcTDgzdTD4/iQAS1N/vsaii30VksKJ0flIwN4y+ARdlcze0dggqQMTno50zmoyyym9QvyXxBXpPnCpwvniPOs0Ww+DbqoHhqTTG56fwcPGOZLxBkqi6m1YQBpKjTK3ewPjAAGLK58/PBRuy7Ws42CmUkUyn2MpB1FVN3giojOcbWtzHF+GNTkSEQkYH06jt76JaqaJaqbBtRSIZEd6tDdhOA/sP19CuPEA0NwnTznKl2UeXEygVPY28KqjFAAAgAElEQVTOUIHo2aNLtSQFHuorG7hx6UcM7TaQQwxnhiYxnh3iCbFeKeHuXhHLqowHaIFc+ifPnsFvqyuouU0YdhwttgZMIWJGuQNJZb/B/CjyE2OYnBjD/LnncCJ/AnNz83h6ZgbZwSyjG+SDuYAXYTXvJKIYS6SZa2dRhE4eoK0j2HFS0qVk1UE8aaNlKtSUg4XSFn5aXUJZX8/NWwso1YrIZ2IsmcMcpf+A7AYok8DJn+9qx8GVq5dx9cplNFsue4obgt/Eex98iI8++Rgnp8dZodZkGI6LpcUlfP7pZ1j8+Q/ErBQiFEm0XBTXNnHl6+8we/oMBkZGOMgYGstjONe1cfT15hbhENbrLsTkfUyLh3JxsFdBqbCF7a0H2FjfwNb6GooPt1Epl1Es7uBwj8QEDbQaDQzEkhzMkWJvx/EQZ25LhwtLVKCtlKv8vbB3QMArZLMZZHMZnJuewPMXL2L23Czmzs9jJDeGgbExnWmaPbZ7iv9NiqQ+s/tN8aPmxr9++Kwo7I7AWHltlqxaD3rQEzekkOA2uXBAHHgKiJsHdZS3t7G1voH7K6u4u3yHixuVQglH9ToUwezIUsk0MGWlYCdMrjDTukLdf+ZVUUGAhDnbLaYfEBWH1hyHk0KDizR0Tua22t0wPAzYLVF3pQwxkkngrfffhuc6+OaLL/mz0TMqAQtRArxQN4IdiFmoRwQNCVkVjVoYzQ9jKDfM9I7s6AjGp6eQm3gKkzPTSKUGGJVx+/rvuHdrGbsoMC3BYzgnuDiD3u6pthiTggOX6JAyI6jt76Bwfw3PnJyCzRuGx0Uysskz6yZ35dnkAJrr6+ouJe+dloiXsSCBIYmPttTpVtc9STDMrmaMBdkQ+f+QHoYjKuiKYHaup2HGgrLye9aesMwTiCQGVk3hF1FMp8SaRJ7SdhrD8QQG4zFklEJ69xD15XsoXf8FhVsLiFRKyLmOUCMoQOu0+gVGg6DD6P+ZJkK9UIBdLiI1OoJGhxSLO2jv7MMZzCAasxlSa1CwpjTcwgzs2vyQB+sFyZheZ49TBLrrb/ceGrrr3NMTfeQ4nuz839D9SfD64x2dR5Svn0BxOP7+x/n4y8+PTxGOv5+e7qh+BtoHB3C3d9HaLAJHClaSLNVI0yGGdq2IeqGEtAUkPCmUGkzLCv6mFpFSLrK0Hy8u4M/NDVx49x1kzs/DmDwBeySFZszCkd9AmxN64XfSJm7oADeSiuq93+c5QXRDihUIxceqzEq0MQgWKo5Ipu4Ih1elh1V3lXQS5enn39Kq7UHTpv9e+IyA6rM25djIYPogx3nMQ/VFJ8QUZyAVIqlovlusB0Kv+y5xdm2B+vtavBBd732e4z03xNAcdL7nhASk8aC92aZ1x8WL8xfw0uxZzKQG4asGLMdA9e8Sbl77FStLFaGUhSjB4PrlsJShbQ+BGo3D5CScZAb1Whv+QQPJzj4L5UW49dDR4qDBIAQoEgPR3t+Fz5TPwx68lqAX9tvYunkb3y7/hRs/nMYbb76JV197GafnnkWM3WoijPIi2hCth9WV+7j01fdotzQMXY9ncHgaFeHpHM6zTYydOoX2xBQOrDivv2w/6Quiw1QR1A5dLG1u4WRmCHkqQDlHyMTTSGfSSCVieOH1V1A5rKLaqmFvdZ2L275qh7GnzI8uZyKmTHg7PlavLSA5mEZmNi/NLErakqIL0FufDBKs/qN/QRB0sNBs45G4FIldA3EjDhvR0GmiH4fSc47jiNB/gbj33DIuABDGlDKJarPGnW0Svyb9J4875or1Y5h2bEKTPgLrcr2cU15iCF03xu5e4qbAOYlO7AlV3dHCtSGlwNRaPdyt9XRnW2i5hhabTtkxrTbvhTGGyY3FZth4pX0uErM5t/BCLjdp8LS1E4AhVN+OoxueQZG/izsk+LutxeGkMSrUN8VUvSgjRlgOUHVw1PJQ94608OTj3Xwed9A88XShM1i3SLybCu6peAbW4S48ww3XJkli0Y2elck2eI7ubkN34IMmNCWqjtPVhwu8/LkRqyH+bKPd8cJCgdJcforp5HxeKLTYW1gQC0CiEnatBEmfxGUReiEGEWKLn3nW8xERPhUK/WktCGpgUa5M1FW+AE0doGuivxPsX8SS1XEuFdgCFBjNTbEDlNWGij7Bc2GThbm2xedWrxanZ+QHIUfYil7Tyehe6wIG2dQzwpnzchEd5JyVKCmUOyrFLmFux8U/1F3NTxxlGP/N936wsAzLwlJKaGltQqymxmpT9WR70KMHoxdjvPYPMV5M9K6JGhOTJk006cUYL5pWqzXUQlsKWEoplPLNLrPDzM6MeZ73fWc/wNrEk3NhgWxYZt555n2e35fJepJQRCs4jqC+qAaZ6JeRjPFrpTV03pCm1ORHLToaTQ4OIGlkFOeQy+XbLoRAytqdQ5tTkySld6SaCPle5f7Pegq62WPR5KtM/ZQl0GJio7U0/mlx0fT0ZiOdCE/i4gafRDXNI6qIQECFu6eSOii5A5TjaiwmprVkF6UjZfQOlbGx85B1ZW3nS1qWKBbAWjXGjldHdyHDhQCycBBNi5xw9+oBoxb00G5wQdKFmj6S6fGxNC4hSjZRpnUTJdfFg/U1LC2toK/XRSZjS1fqmNF6f3sTy/dmMOqWADNPNilpW6ApmuFTVQCyrA3x+/c/YntqDocAnC4fw4n+IQwVXF64I3YRR3v6UdlcwLy3icdhHfGjbQxbBVQqI7AG+jF28lkMD45goH8QJ4+fQGlgAIVKCWbOQE/ehmOJG7SDDCCGR2TW1wAuffYlcvUQfbk8I5vU/FKTZto5OVUieUXCaG7VjHG3tokfbv6Bh4mPXeZJGFhd38Gd6dsYHD0ES8vL4vrP50K1o6INjLDyaAmXv/sW1ZovNg98EwPn33wDH3/yKSODUbLHaAFdO9NxMP7iKXxw4QI+WvwQyzPz8LwtWKYYEf368xXcuHYdr54/B508CZOmo7OOptsof8qGQFYI2V5fXcHs3WkszN/D3MwtLC7cx6OlZXi1Ghr1PR6E0brJZbvR8Ck7tIcRXxp2GI7B9C1a32TuV9v1EO7W6AmDTJeL4cOjGB49jpfOvobKcAXjJ4+jXC4h2+eKCxTFSqTaNGSTnziW9UB9345iydccWSvDKSlCgDwwaKpP650GeKaNsF5HFO5wqgTJFChJYmpiCrdvTmJhbhbedhURGbsFDXYfJpMv18lAI307RNY+bX6IJRBwEYXMo9abgfo22GjR833eXDAulM3CLffTLkfkvCI5+NEpo+l020LXyCG89d67GCyXcfniJdyf/QvVWg0exYJZBuysxXWxt1hkI5xSqQTX7cPQUIWjGd1yN3LdefZLyPUUYHZleSir2SYjy6sPHkPL2HB7XXbfrXv1NkfvfRso/njCK4Dy0YMk4hSAuYkJjJ56AUZWuOxSnaFUCNOxUnovN+9yjBMloUDbCP00VDQNWnTAIidfbXoTIxK0OqrDsTBEhHzgx4nSP5OXh8+oiDAPi4XEROkudWFY2x4rpjT/OlRqJQ0qyASqYGZQSDQME6ujFiAgpsufU1j46Srqc/eR96rIxyEsRZBJKcHN7HTFGiV5SyJzu1n7TCVmz0ewto787i5s0+ZgpdpaFV7XGpK8A9Pt4XVF4o9YccVjce8LqnUCPEGvvW9ZKdrwU7/j/3V0ovyduf4H/h7tpohMo6dnd30PUbWOjQfLwFYdMBzYmS6+x0jzb3g+GhsbKCBpx8CS5iBCzm5hkr408hGsr2Pym4sY29iE+8oZWMEA9KKFhilcrBkFNkVShGggRAa5Lmn77HyvtXPSlR6Yzbx4E6uah6StcU9NkuX37NEk6fG6ZE7uRyl1brzbymyUtHS7MmIqFhtz8RkEw5BVNjyQE0g4U8ODSAwMaAocKdp/lLq/K5+Q9iNOG3hCxoOGjx4nxtnxY3j91HM44paQRQg7juFt1nBn4i5u/DIJKo8Fx0K812hb78KDw4CEltgkzyr2Qht7BlaxjKyvIdjYQrC8iJXVRyhEFmwybSRGH3vAKM8RLR1edIahtV5/Whu2bNLJKD+qhZi5OoUvZu7h1m/X8Pb772D89PNw+yuSNZbwcPDrz7/C9OQ8p1jRm/XkYKTVsTR4iYZt20B5YABJrsB5N5CMzUiyBghUC2Idj3dquL24iKPFIkrdeQanyKuF0icqY4dx5s1z2NrewJXVHdRXVuDQ/kjt4eW+UwFs9BykXKHZ69PoPtyLl0cq8K0YupMwOhUpE9WnNd1Q+3ajmRJDtZiAHY5e6xBs/FdxlCYzBWJml/rwoz1opo6A0GZoyDhZhHEgpY+Kchen/3/cIgFAiri2DLCUEzwNvNnPTOfXcUv/ondQslvBRWXgpw42R1TxfvJ39DWUseiG0TQYZPq2KUC9KGqmanBf0qJZ72RY7z+awJ6SEFFT7gUeApY+mf/y/icfsTynQpojRgnkacXJKwk14jaU7RLJpUMa9Gup8IYNhhVjgVkKiNIekuP1DD3d56pGHspf5IChp2IT8JDgAMOYps5e/D1KPFLnk+TC9JquB5vQy2EMHbQfVj9T65tA1daBkPoZpxWYwvyRcRLD5LrDvnaWxbWb/e/IHNI0RZJDylIRjANlVmiZlPIl6isb3YdNDzvqRelZR+9nBgIx8KUBoFovXHdlCoFiV7BpIvWLYYi/AQAA///sXclvG1UY/41nvG9ZmsVJ2qYrKYhWKqKVglRBW7hQCam9tRcEXDnyhyBunBGoEleKxKYWUbFJFJrSFadtmj1xkziOHXtm3qDve9/zTNxEQuqVkSJNFjsz47d8y29xYjGrDQvzIwqGhs/F3fzY1gdtRSAZSpQWzWu2wCRUaEGglRRVCLv5D8JRvgRJWpTPwD904g/ozh0PEnl4zPGA2vIAOm0GzXUZlAJ33VzNzXAFImFF1fYpKYqHFSejUKkRCU6bC6cLHRry0r+nhOGxvZi9P8PVY7aEiVyCOaW7IOj54to6+vNZ5o2RagCLVXk+VlafcpKTyKZFg0FpVV+aaMoSiw1RwA/icAmylghQyOWh5hcYYj46MoxCQbNaabEhuxAaoFOTZZQOv4RkqhvRNE1f4HYh5japDgU5Gw2Uf/4NXc1NvJgcxssj+1DM5GARv9sN0JUsIJUrojeTxtzaEtYDhUoyjn27LLz90Yc4+M5pWLvy7MMdJSL4EqskxL4rmvwrRGIo+nmjhaUbt7DfTqFox/UvqbDFNj9UpGhyocJQ5CubdVx7cBPXl+9wf0BD5GxUqzX89ONVnHrjVFj+f0ZRouMRRGBY5XIZ9+/e4+INKYWnWIk2wLvvfcBK9a54gHKXU66fJvrrp8/i0ftz+PTjT9BYbiEOTW0hMcAvL1/G8RMnkB3s05MZUm22bKwvVzD15CEmbk7g5sSfnPjPzUyjsrSMSmURzXqLN/DNRou7+rQZ204OTiLGwVu9SeujDY80N2guWRaqtRr8tSpXQrt6ikiPlHBodDdOjr+Go8dfxeiBFzBQGkE8nUcmK3xrX5wDPBXpxEJ8iEWV2DLjKpzHLGgS27nKz1QR1ULL8/B0eREL07NYmp3H5IN/MFkuY4Z0CuYW0NioY7NaYyRMLpVGimhLVgLpQp4hkTowU0jEk7Co08fcdf007VgCAUPlwHaLBNkjqgIn/rUampaHZC6DvqFBjO0/iAsXL/LY4nuzVGcDIzLHLU766P6zQ/0YP3cWh48ewZPyQxb5rLtNqITDFItkPsNCiLlsDvl8nhdyEgSiLrKdioVwXFpGbJ3oeix86bMmRsxxUOzrQXd3Nxr1FR5/tJI5Ys2kB6oe/LQx+7xGajG7RBAwEmvqxl9YO/MEyYN7dZfOdriq7WcyXEihzYg7bsQ9le4+FwGoOEnX5QehFR8XKTXkMoT8me62LwmSQI1NJ1I0UJgCEOhEgzda+n/0fhI8sRWYFNAgKBimL7Mmg0YA0LzLOgn02HHsTWWRXFhAbeIepq//jtWJ21BLFeR8j7nfDsKk2tfC3cLhjkln1RTZqOihRQwh108JQXVuFl21Q3CKXWDB95UNNOZX4HBXLsO0MOY9UhIlSYe1DYQ9anX3/7HzsR2MO6qarwxBfH0T1ekFBEurrNcBSgZsrdBvN324i6vAah3JwIZjaDYm7mm/l0k4aX9VsIm+WF3F46+uoDkzg8Hxk/DHDsAq7YKdyPDeuuG1mJZFjRON9FBSWjLXGd6AaWhw3CVfylOSnwvnX/Zi01nn5gQn/pYWCxSHDZkMHTBttVUjJWLnaSYlIRACS3e8At+CS0gGX+alp+MMRv14HlM6Se9F+VKQZfFCX/jzKiwQRpMSyyT/eqOwYw2M7dmNt44dxbGhIRQQgJjITuDj0cMpXPvuVzyabHL33/dCxKQv9xC3dFGR4fqWg3Va0wdK8HsHUC/0YtOy4ff1wBkeAOYXsFh+jPRaBYnNVaR5fnkCoTH6JKotTNd+RuHTazekKP5IiQ1pKhlDa6WO61d+wN2/b+P8pQu4cOk8Bkr9jKL9/utv8NnnX6DeIucVSTp2QLK4RKVLEMdvECgNQWWKYj9MSCsl0FGNHqDosOb6mJyfx+TQIIr9cRQcLQPpKgvxVAL7jxzG+Jk3sT61jD++vYrYxhoLMStNrhMUhNUWj6RP3m4Bd365hdKBUfS+so9pcI2WdushoUtIYYiLTJ1dmI7DNOEgSRqrHVFjqq3g3qna8XwHIahIx4Js9rhpQVD5XJyRyhTP69g/Cq3f+f+y9ljEd387hXxKwhCxIA98tWXOmRxItZ0SthYBDHSfxTRDTEr7NaYpyQrwjJSzuXAA6YAbezxIUrpDCyK8p23qAyT2W6tTAcB97gJA9DBoLbYvlM/bZao3UZtcbSfc+RplEn7BswnCPBB7yUDc2SBC7FGVfp3s63PKxaIUb5PzmfjCHJxoS9wRpzwrktDTuRFvpHPumLtuWzSQXkPfU8yuHSKeLUBod4NQC8UI2neeh39PcammdNBhdOw4Qae11rjmRYT9jDuE1jfY+vm1RQqlEGWGZhvxTusXNYoadQDAvwAAAP//3F1LbxtVFP5m5toZ24ntkLhN05KERrTlkbRUVamKWLJjVVTxn1ghxJYFCIkFS1ixa6EtVSjFbRbQp5o0j8YNtmM7sWc8d9A5597xOH0IpK6YXZPKGc/j3nO+8z0UnShT0SIk6AEbALKePiMtB5+QealTE3syYKJJWN/KCAzVgPth2lTIfK8vboO7nQ605/ELxEwBHQ29jM8DBGw+5NDE3xVEyIIPYSSGBsmi0x/ENaSb/wGKIqABXVz+nIR66SQ3p29cFjPGnZKRlkiADmseAVgDF3cwiWDaDV1hB7ML8/jrxm0Eq61nvtd+FsDmToSpVguHSgXO/leuoRWFIZr1BsbKJW4UONMxloJYadGX9g3NhZOuKOoq60L1gNfKRTRbbdRqNRw8MMnAAetTmJ6TR7P5NzYfPcRs5TAnBMj5e2Lw9W+hWfp/9SZaK2s45BZwrDKFybESVNZHNKI4193rO1AdB8XyFCY8ovtr1BBhPAMsf/cjpqZncPiDk0BeIOmI8e+McRcmio7L1C0CN9x9QA4P1SKgeecBsL6FucpRYK8DkCmeJ7s1RehQA0Oj7jjrIii4eLLbxvVHd1E3pZNMRT1+saq/32Dds/JCbir+yza1sbHJE3ZWs0eyeR84NIUieQpQwRFELEXIGkBL6MsKse/gwqcX8cvly/j5h4fcOPpZhVanjWtXrqJ68w+c+fA8RxfSJV+6fg3ff/0t1lYfo9msY7vxFJ2dNpPK6/UGP7fU9GY88pbwgUwI3/h0UCHh53MSV9PtoRf2ELR3+dnOFQqozM7g6Pw83llcxOJ7C3j31AmMT5YxOlZioIDYItQccSJHbHESzpk0otvBBsrPejzwdbfGdOkSa3/WPS3AZNbXaDSw3ajjzr17uHv3Dv5cvs3Nfn3rKbqtDiP8nmZVL/Ks6y2gNDqKqEs5ujmmrVPRnPVz3Mz2SLdPkUqBNg6z5gxcWWN2uj02AGuT3h8x/EIe00ffwOlzZ/DW4ts4eeo0ji8swFE5KWJ42ha91ADf4XRxCcAkEKAwXsbh4/MiM6JpGNFqM9LceimDF+sWTEWj9oRZZJ9TMiMlYxmZXoWIKWmBpUp5lMbL2Hhsqf5IdLuDQ1sPMokRMjIEX3sIOrt48NsNzM9Ng+pRyscO3AwiMrEc6aY0bbYxFoBG8QRxQMGXOl+LPCJZ37WI8l1ZP+3+wkZrkGdGiqKQizZal5UrlEViA5Dkgt91mvsZrbU2+w8Z/DmJ6Zlm342yUqhgBNN9F52lKtary9haqgKPn8DfaWPUEfAiR9KWbk8+yxUdrmbJgZuYjw3pGwfOE8I0ILZDbRvZVguqmIPnKI5BCloB2ht1ePkCMgcneJLD56xjPC91NQ2AvWqH7P/7kZ5uJe75YR+97SZ6a5vE6xQ2SiEPP5tH3skgs9dBY2UdarfLDVrGSAZcx9QY5j5bVxLHyGVIF+52Q2TDAI2rV7Gzuorc+fdROnsaxakKYj+LyAe6SgYH9HYx2BhHg3vspQo2WntCaQgcLaZXYdBjLEAlboamAbUpACYWMDb7dGS/O68ZejiS07HTqXSdpcy7ZhYHAqW1vNuU2S54RcwRtSxlJwYm76OGlUPgAP9Mc2JMbM8x9WfTDZGXfAdqa/uYnSzho7Mnce7Ym6gQWEfTf2jUVtdx6adLWLqyDBraElBJiTmRNdhLstnlc+kTewSGHpyA+/oR7BVL2CZ2EMvV+vCLo8iNlzA1M4toZQW7K/dR334CX3ehdMDrFoEzEbGhNBLQZ8hUMR62SKPfcIBOX7M3AA3Wa/c38c0XX+HW9V/xycULmJicxJeffY52M0B+xGHPhJceHpgBMDozBz1RYQCDABmKSFQ0MY1SPu0xxf52sdZooProAY6Uy6ioDMZUxjSTHkaLRZxYXET34za2Hq5i81ZVGnjDnCAQQJvBqP1u1Kq1VttYvnwT52YmMFKQetdGjcE63cSDTPQXHemGihjEmqafyk1o1a/2GAgGOK7bSI25MaIaRTmJjvp5h+vYqGATy+dKjHFa6pA2SReTPs3/tkDB0P5g8vphGDteygQ9Mpp0mwWv9xmneyxDDHnR4dXGAuNxnDSHwn72Eq23y/G5LzaDc2OL90lag2P2Fnqfdnt7z0R8vqqDh6RG789yCKoNHcX3I+rrIZlYPwx4oOqZYYWbcsKHmeQnzS9sRKL0f66iJLNsYhBM1zIyfaVnmYeWDZ4MdAdMcq4b2IRRpup0/8lzzk7iyS+ADgJcrD8e1WkkEyGTSbpnaU85vu+m+ba9tPhB2N45Em85QjdZtqG4/iAAwCbsZbMU3SdyEDEhlOsj12rgr8dSEvIqiInVLD51trayMgI6BzaLNIwGa/7HSXtkLtiP8A8AAAD//6xdS28bVRT+Zu48/Izd1KmTPtKihMQtldrCggoVFl0gseA3lA3iR7DjFyEhWomKSLQbJEAlQKCLJCUtTtM8nDq2Z/yYmVudc+8dT13SCgmvmia2xnfm3HPPOd+DXQBYMVArExoqAHU5CIogpZ7e20lqlyAMlMVWfURTVKeLah5AWqxcgbtyJjBjDY+A7g6ZjqCCdyQvLaScsOHgGxFr0T+aWEZRGkRsV2WoCJHaqNKpva2maAZawnxpW3FxjH8kd2KEgvmMtAKoshxU4hHmRpMap+nuKWVIj5M4KWjzhJ1oFFGEynwNp5fnsbG9xpsp3SgqwgzcBymEnRIA0OqFmJuuKoYSQZl09+5w/wDzF85DkHDDcMBBS/A3vn6hfGyTtGMpIOyE+cM0hSf+8tN/mjh/9gyqXhVe3ocllPck8cPW/1zF7FID/tScspawfU4H4ymUfeyEM/0C3QClxELFL2CuPgunUiYCPgRh1vV0gKyOkmEeOT+B70n4cYTSaIDdp33c+eIr5K4s4tMvP0flygWIgq9SPrMLKCBs/vdk8Q9Tc0hgdeU+zrge6lQ4QGo/o1jZ4ejufY/EmHJ57CVD/NrcwuOog0Af6n3TiUSCh7/9gSfrm7h47VxmA8l2kCcoMHRxmvd9sN9iikWO62GHpzmOcNFud9Qh1BLs2mClyUZyB5uusl6v4rNbt7D6wwqG3TYHb95z0Ws/x72V7/HBxzfTWFm5cwcr395G+6CFqWqFFYuV6j8w5ZV1F1Fwh9JOHNjC54ZKp9fhpHz4vM1xUyiX0Fhawuzps7h87SqWLy1jqbGMkzM1nDh10nzBVOBKUR6cMd9dF2IRayUITlzSUhuV6pTHPDGgAxkTV2xXaV/E1HgYcuHXfraPw909Fq1sNrextfU3dp49xXazicODFj/D9ADQwZfE+Qquj7JbgCsVkM/VkzAu6oMBd/7DTlfZauniW7gOesMQ1kigT5wyUkKNI4b/R5r3mq+UcXr+HD66fAmXLr+DxYsNvLW4gNrcSfVdbJW8WIODy3oFXZiEj06GB9fGruKHirwLxx/TWSgvxgYdYd5jElZWgCkThKV8SU8LJCfXfKnIdAAn76FYnULZz7MAVKxng69IexpvZy23qRo4ETAIsPHLz3j75oco16fRDsL0EJjTFjJcLJPuiTSCVoJpJ5Iau0IJ3UGL1URh1rpoDL/M7n+MoohVEWJ+7/I5M8Ioo+NCP5PYWkIJulzi5oLUyv8Ufzk/x7GejAaY9l3UpECtdYTdH1fx7N59DDa34AcDTPEEXk1maWGo+aWm/yqRRlJN/qlxZGt9CoHxBFdkpA6piVekQ0s3QHtjA/ZMAXa+wvcjiBIMDkN0tg9QzvmQdpE/iRAoBNnNDqEs+bKqvXUMzP2412Sz9jgEwbEf8wZO/yuc/9dfzivvf1MzefLvJ8+y4jUTO5OHbd5vBRdydhTjaGcPra0msH8E+B7gF+FQ3h5JeHQI2ztEe+sxyhch+2sAACAASURBVNrtQ+gCKdHxkGB8T9gKkloA1oibTx6Hb4RiIhE0n6D1zT7C9XWcuP4+phsLELUT6BQ99AmBRpNtS01PzX2MND/afGsWSo5Uo0sJlyokZpwoJANRhGSkXXQiao/3eW/jApx+77mZIYbN57bsy8l4Z6sFTjRdMtYwWsF5ilCaVLyQbzQFAjXNGbKaKC9/ysWsj5LEqdYC67skI00hMFOvcfHE7TQWWaO/CTFT9fHJe9dwY2EBp4SPEu9BQ8h+iPXfH+Lu19+h31butUK6fL5Ln6NkHCC0Z9O1DfMFRLMzGNUq6BUdhmkPmF/ugYxoIi8Ha8qDX1mEPT8Dsb2LvbU1lIMjeMMOClIJL0t+h5XqTykKkLJR4wGZiclM0cyOOJZ22n0+xOrdB3hw9wE3K8lvXsT6gK/1a/4tLumpC4cJ8nN1lGbPI3QLCvIPQ0GQcGnqqFFPvATCQXsQ4OH2DmYrm5hpNCD6EWrFKooauVo/dwZXb1xHe28Ht48O0Np8pCf+miaiERmGEEBog4IEttce4dFPf2Gx9C686SL64Qi5kvY+N997YifJeuiDz+heatuNZDwVZkG+jP7A//XyLI/h/1Rj0LmD3TYoVw2GSkDaGtcSyNAfYCgA0nD4kdKWbW2DHsVjOHr6fnvsyW9ox1Sk8r1OEQc6tlnYUzc/9DDSQPhtrcZu1P+pvjAoiVjT6LJUgWzeNGrytKa9sJ/GOBeI2kZd6gkx1SZMLdDFNP8ftSbpuSLEkcCxMoD/VfQRWubc5n3I5euLEKZ5fDDo8/k3+6KCm9bB6ABQTAhTeznKwtkIvtO5ViGZ9RmJVf2VRR/t4WZ6H2nhu8RA4LWlH029beGkPys6Bg1a1b0yCC2jf8egLGp6ahcxVUta6PY6fK2qPlb32zS90pXI0M1Z7JWKfKKbahi+eaaUI57aIyhmqPCf/BwjjG/uCdfVvo+gF/AgiagLhh7BzxYhLvTe2e120+Kf1yAIx3oLMsEL7q5tt40qiq6ZMxffHdtNS5sqpKhtUAWUpiAuEqgICSG+gAceeeEX+Be+gFd44YGLxE0ElYJERGnSRIlKkubiJLbH9oxnBu29z/GMUyURUp8YyS9REs/tzOy91tprOWbGgptHpfTMSeZeSIugoP+5o2UQEzMGViaNNwecardjdr/NzatASxySnNyBndlHJ6N0ZpOZ/OyFYMAIlqZqNIRZe8flG8EAA2ZhUgZmPAYwFJuTsJQi0kWEnsehE2kafuO2aJIBZGFlslUePYgTPj/hUGIXKIfU9eqotEq4/PxzWPvxL6iYGrFjxa9BsfXL5bAfoR0EaFZkVspKZWaICgZiQxslnxnMkc6G5NQAKmf1YCiPctiJNj50US4W+bO/u8uRgNXmFF9Xut7UUKk4wuCojZ3NDVyqNZAkxBj7GuvN0oXPZMArFdRqFVy8aDEDiYIvpkGJ0onZQz0/KyggGfR5iYWinaKWWhyntfL7Oj775FO88uEHePvjj2D7FuyqzQhfclrMOO3kQYjFr77FvOuhpiT2n6mLKOUHSRJGLOsOrQipKmCt28Zqtw0JN1Ni9MT/TOREB3sBfvruB1y/8Qazw9RknbYRApkkIT9UCP0n4OUQB8yq0HUJOj0s/vwrXnj9DkrNmszT6cafx07ikOOQ6CHUKFWF+SSpELl0UgMbhdhYW0V3bweV8+e4QqbvoGbXi1IU2GHcZ8dXQlqJMaBGlWb3g2ComWQb5UoZ1WYdMzOXMDs3h5dvL3Czf21+nufOC/UaxvbTljE7i6XwsPJjEKYxzWSzJEE3PyV1ikodUeQQcDgacGwaPfz7/X1WpGz/s4WlpSWsrqxg4/4K9h/v8D3eDwJeX6y68Tye4y5bNicc+NTksuGhzU0js+9sbOI/2eTSizOKeXzgqNdDPEzQPuxIAofjwPWLaLRaODfdwsJrr+Lq9Wt48eZNXH52FpVGHR4pCVjKC1ZjiFGOyx37k3Z0Z2+GOWaWUZm7zTS9pizKIdTHCpXMqdf8jV6XypWCkRD0godao4F6rYaIjC91s5/fy9zkMcv4XQ0QMDcTRzjY3MTD3+5h7t07qKkiLSF07L6MHY0UEFo8vscNCIM7YEUFHVekvVmM2z0DBYZ9yRVFaZo963m+Xjcylu58kzEjI6iOrY2WCGxIlSi3LNsROT3FEiYRX9+KctG0XbRo1n91BUvf38Xgjwcobe9gKuizwMjiCNJUzGXt3J1MzT8VHfTh4syRnH9K8NBn36wAO2cWRmxgIR6iu/kI9WAOVtGD505h5BCoG6PbPgSOKigWqRgqcVFqe9Y4Numk7emXyf/PjaW1ukBW/DKNBFBc3QAe78lVUy6ccoXZbTK8dHtDVqwRcO0TI6ezFJI083vIlB42w50KWd45f48GhRwyme/30FvsYXtnF/WtW6jevgXnQgt7vkJIv1y0xvL12BSEyBIDmEnUzT6b6qUYN/tUJ406QyE8NFBmjbT0nteNhX6STBhIOscAAFYr5qS34hOQYzfZyV+ACKoPHCfkGkPk/glrA1MutNOxmeFEVZCIdFkIoGQC3JIs+QgFewTfifHWSzfw3sICrpUbvB4JjKNn0MPlh/ji8y+xfj+AHQtTzWNjuVVgro0YctE5dZBOVZE0p9EvlhGRjFYrQVM9ykMKjMDz0S8pqGoR5WYTszMz6C4/QG99Bf1OG94gRCkRRZ6vvYPEuFDc5JV+1aUZ/pAdm1GdcN6YEEqExSvtbGlqy5M2Si0YuD4aV+aB6QsYUvNsC2gd67l1pffNQFRSSzl43Atwd3kZV6dbqF+c4feApa8Hqf/Oz13Am++/g0d//4lvdrcQHXUmxN75eEQleksEhyHuff0Lnrkyi3LRQ6VZ0BJ7c+yTEWdA9j4bj+3p6HDTLHFGuR1LHc211tOR/uc3IcuMLis/RHr2Ru8TURArZq1DbfI20JHjRjZtiETkZP6iEpa5azM+rI5Fn6c5tpkZe92D5OX+pnk0LG6qMyM5zUDPlJtexMjD814Ap56bMZGaga2W7fJr97QEmv/e/J/8/dxPWmZUO5mo50c5xQR0/cMeaHpWnv6Ozi819qlWfLOBHSs+Rkx0xYO+gJ+Oy025iYUHxNiXxy3iUW4MJTtGViQYz4CcP4C5DvwMjkecGkA/73S6vC8CABG4Iuy9KObFQyBPXJvzyCz9RB2UeRmYvpU++REBAZ8EzOFzo3tcPg9kyOpSTSwjA2Yf5H6S/oHuGaNWp43uIwaldM9vuS7+BQAA///sXV1vFFUYfubM7M5+ZdvdbqFQWygUpGqgxBCjiRdeakxM0Bt/gBf+AX+O18Y7IzEGRRNjgiaKEYSUT5HSLrTdFrptZ3dn5ox53/ecmdlSGqO3Dhcl7Kbszud5n89nDCD2lyWmMsb67BnNiYcvjoCCEcqloQTavHxDJDraeFnkZLMyBbCfQUAFAgAE1RqWbdhN217z3M1H/A8KHg+J8uUZeaQh1xM5t+2GTHscPRns+YI3CoEoEuSbfP4ctGKQOCu3sQ0HnGxalBNFG4CE/5+BHlrLuSUP/SREpVzgUJbD04exfmNJJD6EAKUeaPkZGn7vaQ/oBj006hRHF/ODlBIegzBiFrQ5OcHoahQE6QnG3wHZipGHL08COAhZq5WrWO88Qbu9jCPHZlCol+TBRux4orHZfYK7t29h/OhxFP1Gtr/z+9783DvsTOwOI9MHUNpc5+/iJ+J1JVaQVBpJTxsucsC9x4zIuQl7j2hf1BplNIIiZhOFhU8v4rNvr+C9Tz5G+fU5hD64kkwO+h5Ulwbu/PATdhaXMVKscmUYBZfRssUJxTfpMPqYsIXiUbiDa6uL2K6SUsKHrxVCZKnf1qZ+6eJ3OP/hRxg9cMj0zO6/8UXleZifP4P502fQWXyEPkn44GGw3cOXX1zAxIk5vHv+fRRHi6KyMDwyMS5xlMDdcfDwxm30nnbhKc7KR7VaY7/4g/v3sN19itrBMc4yOHd2Hp+XKlDdHrbXN9nHyWhl4rD9goCTVnMSYyfHMDFzEIePTGJu7hRmT85icnoKzfEWCmSTSKwfjaizUFY3iR24TGr5rmEkz3gnaVOHYyrusnDC9U4HG5013L13E+2lRfxx9Sr+vHUHG6tiV6DWAVrUVgs+t3pQT3C9UuNry6uN8DVNDR/0WSwgJuKOrG6K/liZFsyihu5NfKMjFJ3Yt4pCeXQEr8ydxMyJEyzjf+HoNKaPz2K02cBoo45iuZyGjVJLiY777OMlC0U/HhgQJRmq/bPX/H7Xh9pnkMuJ47OdaV9zsnekFV45RUBsBhIaLFwz/NP1RvkBB1vj2Fx5TLwaM9jRHkI/ZZgcBjUh/jtiv51+gKXrC3jxtTdQJlSdwu5UgRk8ljG7xDIIUOawpyUWi7E5L+I0CEw8/ZKiNjzpip/R+prlfVbSnBnktVl1K6hiiXMAEmLcuDYpkhwEquKjelrXwaF6Fa1QwW93sHH5V7R//g3RwxU0KeV7J2CZNy++dHaepFVrxm/NAICr0PMFIGLgcbuPCrHEKQ0vYJDh0BgmLVCjyOoKSisrqLVa2KSHebmMgorQT3rY2ngCXSpwyKZTkGCiJDdQ/tPz5f/tOdeR6zDYSguirdU1dO8vA+01AZZqVTI8wqH9n7goRQ4G7Q5Wb92HRwyT8dm7hrmCUeZI/Z1iqapn/fY6A97k2HmcRN8qlDBCoOXDZW4hCVbW4J9+CY2ZQ/CJmaaUZ1ceV9JoYXIyzPEXG1vMLDsobJBGMVIAkEUrjPhZxgCZAcqSfsx/V/xvMWKqMs0BAOGuE2tALFree8sL3d190k7K5Makakn00Dous3OZoEAe5Ow6RnOLhwNT5Yyc8seRwLEo7OLV2Sm8fW4ex+tjHDznsNEq4WaUixe+xo/fXIHuCYAv0ntJJ48NTJ9aIEgzQCqzSgHuWBNucwLabwKez2o7LuKj1wnIUA56nmZA3fUV4lIR/YqP4mgFlWNTCP56gJWF66gSQDgYsEKo7Mi9zFFJmg2Qt+XY1UCSy42QtgjN9ylWXTnmOGudVfDt8YTouR7CqSNQp15mC0NQUAi9PmI35oYcrhvVkq8SUy0fHRvWdnkY6AiLGxu4fHMB49U6xolc0CacFAFUUbEC9c0P3sHq2mP8/tUlBlccJ2ISIpEABF4zKNMOQ8rFraUtXPv+F5w98BaKNVdsc469Mau0WcZaU3x3eKjKe7o5tdx4s+m+X6RmJUTP7If/siV7APHasO2Js3doef6cVmaQ88yan14X26/HawJLeg7NHlZaHWVtZDRHWK/+7s3WAuZ9/l7OCrT7M+U3ZUA9er+dnSy7nIYD7hMEWDDqVLqnhMwew7SPxM9l1v798P/ssbCMdVpbx9dJlg2kYMEiN1VfiLJZ874Pgq20Qo8r/OxMR4r1xJXgPtNIZ/v9ieknxp0hM8piMZXy+Sw7zSorIbjyuQPyWaTyns9hUlqY+ZHmPSLS7EZKa2pqoBlUsu5MhpwFxwyAQWAEgRZpcLzZBECS84CJbBM6Obz/hs89yeuLWe3BeQi0JjLgLW22QSBV1FN2iK1HjGQmtjaIOIrxNwAAAP//3J3LbxtVFMa/OzP2jN920+bRNiWPqi+owhLYdEOlquzYIyHYIbHrP1DEhgVsYIPEih0LJFawYlUkUGmL+qBAq6ZOmrZx7TYPx47tGc+gc869M+M0ASRYMVlEluPJjGfm3nvO+c7vc+iDxn8QqYxR/IBYNsvMKEDnHTsO90AYGIXpuU/6V9XIxGH6OrifQZMbHdNDz/1C6Z6rvW+8tJKAAn9/aFQEFvy+fPEmSSGghgy2e9uadiiSGXoQCnnx1DRWJQxVGMo5mN5/kmHQhaKLQh6T5tgMgMFsDp8X4A96DOySbBb5ubfhejaqByuYPjaLZ4urUIFiQn+6J0kWojIV9thpZoA+kSGp4qabtOgikwVjp9uF64hjQeRLhhia0mp6bw0s0WYVQBYFr4C8V0CruYEnjSZKlUJM06Pd20GE7WYTzx6uYHK6gJD8SkcEQeFeoT/00wuUizh46iSs1d948eHwBOCwtBBs9RUgIn9ertrZXEJReiCgS0/wn4lMBtWBhVpuHDfrLXx54QNMv/Eqzr//LjBW4r6ooZ0E6clNAfzw9Tc4qLI4UCyhlPHkgRdTNZYQ0mAQeBmsE3Pg0SOsRAO8d/Einnz4ES5dvxRzaU2YRP2OVy//godLdVY0KA0522sT/oKkOOaPH8db77yNR0sP8fvN2xz/bPc6aCwv44tPP+OJ9uy5s5ic2q/3KTKi/sYWrn3/Ez7/+BPkyDdXAdsk5wocdoZob6zrazHkdoNTCwt4/fw5XPvxCn+n5WoN+8cnUapUMX1kBtNz85iZn0O5WkJun4fSWFEqJ2RVEgnFlpQ3tC9b2VK1icIk+lAGGBXGXSAJNgojAz3rBHwfrfUNbK5ton73HpbuLeLW9Rt4sHQfjccr8LvbHOSTTIsl/LaNWr7K8m2CE9J7JqtKEn2jRCrnitwXRwtkw4Ie6hwFFaTp8BpPWyn7JqBUKaM6MYXZ2RnMH5vHiZdP4oWjc5iYOoTa5Djg5XnByiGmJdW9gZaXEbhL8UQksjh6nbGzI1c+Xa3/J9tzgf4ujxB21CvSua7dPm9k47xoy3lwshkGnA1dG8WxGj9rmUgCVdOC+lwSQC/6jPyRzJRyYYTmH7fRWV6GNzsDh2mxEnhw0pSqhf0etxBxHV0vLKBZD9CSUANGMiqtKFUVceCOHAf5A9uaxcLFTBXqsU2anbhqykR0kVLblJDtDNgytWx5KPoBMqt1rN65j+6vdzG4cRcVgl/6PookjWP47IClclwt0IkKAaCxppYtE8mDu511YFVLsIsl+U7W2uitbcL2Q135H46kfug6uJaFnB+gfa+Ow0dm0K9VeSy3yHWCsvdbfXQbLeSLeeRrZQTsbJGy8ov+dpQduea73SO7/d3/hSWwk/yf3ozvP6m82o0WtlaawNN1ocZ6Hmwvj9DN8eRBrTH5Tg/9pcfwHzRQUzZcynAFeh7VyT3znPBcGmkrPKMHoCSYgZZGOrHth/AsB9X+EJvNHrZ+vob++jPkOqeRPzoHt1ZAhwI7myq+FnM/fG00IgojKWbwgpPBwiQ9HiAc+iwZFQCcbocJTRBsC1uFKetO4lVOHu+8FtKviTWCUWaTqGqcWK0Dwy7itYzFHA6YSrsKR1s06PnnpLHAN+UPA7320HdwGGpQXMTv2Rjg0FgFb545g9NT0xhDjhz/qd7MvIOrl67i26++Q28NyJPnvW/cD6K4TGIhkSnz1aAgjRLglRp6bhGBm0eooWmsnLJC8bGn9jOa0CmRQP2yruK2gL6XQbFSRnH8AKozh9Ct17GxuIj1py3UEIJIO2wlvEN9aJxqoxgUihHIltF1MT1e96fzcUeJcsx81rctbGUdVF56Ef2JcawRE8aM05FmU+kxD8yfoGFYwxo1+LQdRriyuISJfZM4XJqA68gYTiUkshoj/s3Ca69gjdg59cdYvHGLBf/QQfioy0Yo88lQ4c7lWxg/cQTHqgtQnotQSbJGGQuF1GziG1u01PrfgAKVlm9zm0usAPjvNzMf89gXJZR/lXIV2yvIll7oIDkXJXZpovINOdCybFFHc2uBrkbTejyXdeNiqAn+0wBAA/+jedIidwLdUixBMGI6OwPmIlEamwDYbBSXWang0sABDcdM/cXi1MzxnHiMJNkesUJGlMTDXVYy/7byr/SP2bg1W2UgbnPPF9PonFnCb0mCPkkUSPWdihpUIKbviYqahsYfx5hhIrMnJzejBICumPt6/9QqMDSF7MCPz5U5dtrSj9qBKL7iIq9OtNBvWqMz+J2Ly5IUoNiw0+0IpT8umCexM7eRsLJDwdLHS8E+K2TofogV8zTmaUggWwXuUAnEDIfkueKWfIrbmRkjLnUs52cliySjcgT665E9vSQ76H/TmMDnRfczrckywJ8AAAD//6RdO28cVRT+7jx317vrjW3FsZ2EPCyhpECRgVAglCAaQBQ0SHQUNPwC/gBIiAIhKkpKJAqokChChFAkJChCeNixMSTGG8fxI97Y+5rZmbnonHPv7NhOggTbWLb82PF9nu98D48KSHLP5skdD/K8fkIJmYJuHs4zE5g1GcbZVhu3cxjKT9Fwwbrsw9CC7QO5hQXHZhpxIi7dONz+kILWM2kCbo70OKzb06yzZlTMXEKjVFAaS92xbpnS/RGGgDVM4EHWsoismYNFThIzIDSRMjs4SpzTlTZxYUa/x4YTnpdPXKI7px6wG7fgOiMYm52EqvtI70fcSdIG1c47ACYrnjoF91oxpkf7GBuvi5GWKcpiyvbs9lEhvS+ZOzhCuaOLOV0YWHtNE4+KF9dkDRv6R6VUw95uJ48u9EtGM6hDNMIy+jstdJtrUCdnWRftuqFRpxWR2kds27TBVeo488yzWF9sIdrso0LFP9H/E8kSooJKhK0B/ICMc2IBAYwjM+kyvUFmtK8ac/UJTGYdLH95FZ9e/QFzb72B5958DVFNwaGNMuqjElb4sNyeX8DW9eu4GDZQJUMhvwTfD6lNKXRJovCHHnq+wmpnD7/ubEM9dQpzr7+Mt7cj/PjOz8jQ4VT2/CmJXre9i6+/+gLnzp+B8ho28Dyfw8VFKt4SrqjClYMXX30FnXYPH7/3If5cuomqEyLt9bGx+Ac+++gTrNxYwAuXLmP0yDhvBM3mMn669j2uffMtNtearEENKMM8KKPX7YsutexDsW8Gh5WjPNHAux+8j9bmDjrtNoKghNroES5+EZbALm5D0d7QLEFoIoeSxwSYc5gaxtbLlg/LUVMpgwRgw0rONEI76jAzYW31Dm4tLuHmLwu417yDleUV7N3f4RgkMuIimcoYMRLcmoAMuaO15VG7UHHKf4rmOPtvkDcAUbVYa9XmuwptluTKT2ddPx2gHfd5T6lUq5g8J2DHE6dPs6SBuvvTMzOYPnFcDNcMQMMxcdytEuBP6G8ZO9OSj4dITbw8EQKFj8DQuBO5Jv+wCdD+l6GB5qX9/u+0l3bbEXEfq3MZdsCs7Eobh9datYZyvQo94iMKgfLkGBuStdea7MvgW+poTlzW5oiWCx97CbCWMkPFSZDubmBr/jomjjX4a6FKEJHeNktZv055xQOV5MwpZbJs1fAmnEdtUbtBGwfrnPJsZCX25QSexBrSIUwMJkpSSQRV98MRtLsJo+c+MbQGPYwHPgLSTna68O9uILq9gr2lW+jdXkOtE2OSdd4JMr4xD9jVnPbHgUHTObqRTf4k6vBBNkCXEP6xKpyxBpJKCYN6jbXPCMpoEQDAnZSMp5KVKTAYwcVnxlnyD5rrSFbvolQ/Cqdex309YDlORl3B3R521zb4PApqIa83bUA2QfUfrd23xe++vPuHzI/iZ0UQIP/6I37/Ic3+gW7SwevgYeDhX6QwDzFufdxPH3yfdlnsexYDTDIAHyXobGyivboOrO8A/UwenvYQ5TOje3RkFFUqrnf2sLOwjEanx8yOUAnzRLra5p3YFr+GoV0r4/8gU5rp0iplX3XXKqaI960UGspBtdtFb+kvDFpt+KubCGamEE5PIa2XkFTL6AQOeq5Gny6WjkZMHjdklBXSHq/R7bQZaHD5/iWXd104inUKozs1hXxJ6M80jsyy1F7etbaDZcfYWtppZsYN8yTzS/tA5zGIQjfPCt47Vhaa88FlN3G0mW92P9PiY0QgRxaj6iZ46cIFPH/uPCZQMcaKxBjo485vN3Hl8ytYn2+znIbWS3H4VaEdoc0OSBIk7QYIT5zFYOYUolKZWQ6ukfSkToJ+GgtjyqM7Q2Dmj4lDI7YDmWxRAVSpImychj99FONPnkH8dxOb878jbN1Hg7xFiMWn5V7i5HNg+A4ZFDywXlxH5eC+W0DhCPzmIXE8bKckTXAwffFpJGefwG7ZQ+rY+7NHXqnCXmRj0pSbQYrZKuJLwB8cMePdTDJcWVjE1NgUwtlZHKOOPqVuZZJ7T9HDc5cuY/v2FtbubmFve519VhJuzmkEGI5bas6XUuJg5bsbODl1HJVyiGQkobxCA44bGa2laht9O19HU+kwmgeVMSxIXNQBT5qHbUn/FSBIzXnkuMgz4S24zUCWncUWRDOgtNQpTl5DsOtLKhpwPmNN45MekAE0nSGOIlRCyX2nBgYB3rHJcncsi9Lc7bnmMf+nxABYOtM5mCyNBwHTi+71Vi5ADAoGCgaRASCM6bmZfwkbiNpDQudeFZke7mPayFG5+OXH9P7Hf/rxL1VoILKvWilAzN4MUsOpXNNrJCMqycEjpwDSSAR8ijaBJo6be2ixYDEzYCWB+o7sY1SzWpmA7faz5wHxYaKhmZ94QCkGZGihBiSj5DhUYSvS2uUcfXNT4oaqSWUTeaptlItPBP0aAigIIKA5KKl69n5FIKvcxW3NS/sU/T3aJ7gzD9HzE0vA1s+W5SA13RAwoCHLKMWK1pZHyR+xkCnMfBb2vhT5VPwz67wAuliWBK8VkjYMEvwDAAD//9xdXWscZRg98z371WRjsklJUlcbUmkLEipY9FLQGwUR/ANS8KKX/oNeeiFe+BO8F0NvChUsFaRYtSLSltamTQ1b0002m/2amZ0PeZ73eWcnqdgK9ca5aRtSZvadd2ee55zznGPrhacPoH+BTh6L9JXloSLT1DMwYzFZYKdBMo7hBnrM/yZGn5huNacwLmTqCwoYx7mJg3KRTfO5GR2RYRzYCEquwpF7shh6NuaANEJQMb3xItk4aaZcEdVDStwzZfOzWYWnPANoMTTyRqw//ayIvB0+cldJuQF6zs9k00CR+5hA/fgC5leXsfX9bdnyahMrmVgq8T4mx3ntjYHuIEA0VYHLigUFANB197v73ODZJU+JUOVhZGcqTz02VTRJSpJIyjS3M84Fp7lpup+d3S76T9VWcQAAIABJREFU/RGmWX2hJDf0ZXSTBI82fsfy6VeRVR2W6acHeMd/elAoyV91ZQW1k/fQ++E2ynGCUiwNniBY1FjRmzszHNWKiCswz8ObijEgJtZJM9QALMPBdKmBB8EI6xc+x6X1dbz/yUc48cYaygLqUDzgj5ev4MgwRmPKRs31FZs8HCpAJiNDjZDlf90gwMOwh610hPPnz/N9WXv9LDyngsF4VJi6JYmbKkKuXvkW5z4+h5mlGhvv/F1KxRN7gi/MxbsffoCgO8AXn36Gzc178I0SBkEX92/9hi83NnHp64uoTdcRBEM8bj1APBjAzmJWMKjM6JSVDFRYUpG6unoCjUZD9o4FwzHh1C3M1evspMxFdqLMoyyK+CsU0kbuuq+v/yCCr4CrIg8tmYum7FViZOMQe509bO+0eXZ/c3MTN375CdtbLYTdIXrtDmdE+yTBpIc+5TgYYso1jFCcnOd8efIbIdWQJecQV1yu200VcUepIREZYtFsHc3neS5mF+ZxvHkMSy81ceL0SRxdWsRicwmzjTk4hMJ7LoNYrMiw7ILFkTZQmTBVRZbgWY4iVm4+ve35Tw/t7stgrBjamGUPoWPAnaqgMleH1WqpPPxcXXCwUNVln8WAZMZRaD4XRGPcuX4N1VdWMfdyE+EoYqNFBhnF5M+RWVUel40TSdVSkAZHoBXPIwWN3nWpbkokt5/vB700iWExlSEiFz0WmRml7H1C341SlKBCTgytx0h2dhG222jfvY9saxu1QYD5MMG05cCIFY82JqbVmMiIFWtm5bucfhZmKUa+j2CqhKRRR1Y/gqRSRlguI07Je8JC8kcFYb/PMlzTmDTWpoAeZApHny3qhejdeYDZ1VOIaAyFXtSUymI6iJIM0U4Pu24L881FWL7FIw3KjFZLqZ8eAZgz3v8DZv9Zj0KfqhQoY1VnMCAfRNh/tI3+1jaw3QHnmpquAkEJCPY8VNwKnHGGKsnl2x3gcZtVI+Q8rxPNsgITmq8xvZOpCKXUD9qPNK+ejDlL3k8iHtPTAID6fyrn3iaggVIIojH2d3aRLS7CPrYM/+gsMFOHf6SCUclF5HvoWykGiY2RlSDJxDMjE/WVBhh5n9Bj2JQLTaXFVicngAmGxlYpIcjWKXeFhkBUDpICw3WUJBMfZvysAtDJREFu8nZwHCCT+Zm8ltPfejGMJQk9ohHWVpp467U1LBozKHPsZqJMB4YDXP/mO/x89QZIjOaw8RoYsEPhjFoBoC1NxySJnplFUF9AUJ5CJACiKctDNRWlbnCPI+atyrRQkjikJiGAIspM9ChBxamyOrJ2tIEXVo5h5+ZNdDY2gJ0OyvT7YcS6parlwZRaGJpZ1qBKgVHXmJqRTdohktETax8aBgauh7kzZ1A5dRp/1ioYWTKAIs09NHvMLG3Mz0xbx6Rp5/uUYmZtpK6Bh3v7uHj9Guamqqg1lmnb87n1mOxC80Wcfedt3Lp5G1fWv+J3NdX8rjHxWtCrTs0qears3m3h18vX8ObKeyhXXISQGGp6Tss+NKXZyq+3YISWcaoF+QE9aTGnkw2f1zvUhHpnMEtvWjno/m/Y7KJqmQCzSGb6CX2j9yuPA1MvkEzMR3Vzz6kT0nxCM7RpUuhjJsRR8ZrYiFN/N2XtuA7ilKBYFNSZmtUW8zhq/tlUjoEDZXZdPAiY11F5JJmfGHIaAt4Z/EzxnRKPqBqF+v55zf0zvCHEMSvEXQWdkZrVzNkBdV229IfFfnEsDH1xTIJU6HRPaJ3pT1JDkQSfGmduvtMkN6LP11eAIFMi9dS6OTnjTsoAMmynnpT+TsoAIkA1cEQEr+f5Sv4v/m/F5DrddBO7ftgHTx9BOMyBMeqVtYpeMfY2sjjj8/JnkJQ7/Z3ifcFjP3q/iRksKdG45yVFtQKKNAF9+F4qRQmNsKtRdgVSWFyjmJaJv9i7mt8oyjD+m++dWbbdBdpSoK0GJKhBsUowJnqUmydvBs+evXsx/gmevJhwNMS7HjxyMCakohYK2CLbLqXdslv3e2feMc/zvO/MbKlEjfHkJBwaktnJzDvvPM/v+X24rDPTi4idEMcCBtC5qYmmoprpJoSGGmM9N3erNM78RM9IeILsMm1GXKqdDDSgjcNKBLFxdSHG+oZksuEvXnh2TTpOAcbAT1OLDMvAmBqY2AxzLl4UqpCteYijMDX+JnuRmv5cA+Sh2+2yEVnxUOnkhzA2Lq/GydFEFOpoqaAWYP78Iho/3IFHaXSQRZToQpjrXx33SsvycWuAJWIqB4Iskl6e3Hf3W23MnTwBKE9oPVrHIZuyiWrU0YKWLCR6NpQnjiZQr9ex8PwCx8Sw7kQcfTCOhxi0dvFk5xE7yU5uy89GCflDTx/ZYzXMvfMGVre20an34DHiJ1Ec1liLJ2m6ysWBGLU4Skeb2QkSV6YNTN6ivF3LY5bHGTiozZ/DyloDX3/8KWqXXsRHn32CYGYOqtHGN9e+wpVgGse9CKEta9IJAySE4GlEkJzDyf1+Y9DE7Mtn8errF/lyFs/P4cKlZdy48S1PdRz5dV7bNBW+eXMFq6t3cHl+EZZFUhXvqeYZ2pxosnC32Hn6/Q8/4N//8vMvcGvlR5Rsn4ub8biDjYe3UWqWEA/6CGmK60lurYp7srYpVpPykYl+7ihcvXqV7FKFXm2LiRmBHPSeUWFA94qDk+k9sc2UWg6mOBWcmeVQeuaTyvqDsAs45zQZ8ga802ziUaOB+7/cxoP765y932ruob3X5KY8pQ8kAUiWgxk3ZK0qvddEx+UGSamsmLYKRkL8/hhjTZr6QDEqS+ZrI8qKhTBqypUKFudmcfoMUfnP4cwLZ3FyiTw1lhCWI/ih/uDStIzeUZ4K2vDtIKPy2tmHRkAA1r4+M9birx/2BEj23x/8PNnEzEElOsLsoF3SmEcBpk/MwF8LMOx3YVu+puenOQtAT7BTzWVgJoAS8IXozDv1TbR/3cDCqVMI4MmklVg7qasnUoDrRyJcckxUkZRdvPdNUNWLf0iBqazcZ5Ic/en5EZJO/8cQl2sxs8yPFSquiymiBe+2obYeo7deR3vtHoatFo5YDkKa1tBHNdVTEuF58F7Ka0CLt2NLdLvKMvYWZMBlY1SbgpqpIp2t8oQ2KftISD+Y2ggIhDhew6Dbh6tiRBxtK+s6oyTTFIDiB2Ngd+Mhws0teNMVeJRUQP4epnEbKfS3W+gdrWEqrPE1sqVOQWEiGur/j+xeWHlSjjFgpHtfslzE/RFam9sYPGwA1Nj3Y2n46MmUSkDoM/UyDEqoJg6izX2mQMetJ/y8fD1dLuazO6lpikViNHB8DImpFVUkaYDcn9stlFSHIkeKZIEsX52dxWkvHCSYGvUQD7tIHzeYFeLOziGan0fl6FHEx2volAOMq2V0XAsdy8GINPy0IzJDytX/pD5IM0Bd76UGaHNMrL2JIy7YrCmJuDMTwlQDAGnhnTQO1xK1A244Dv3qG7Ck8KfKpCb0I2KaalEhy1O9AeZrEa68uYwLswsI4aPM1n9N0kzi3vc/4fq16+g8GWVGnDKVPcBI0U017eBk4dkt+fBPzCKuziAOp5C6gdZ7a9099ISRqLoeOyrk7BEdgaI0MML3K3AxouFLGqND0kl3Gm71NUTnnsP++gPs/bYFZ68FZ7/HsbdsJEnZ5Kn1lGeHxhbyPRa5bGhk2+g5Pn73Sjh2cRml5VewXY7Q5ymlbhatyZNZ5uxkUopRZhiX6ZUNM8aysbbTwHe3VnDychnekSqmCIBnAEdi7E5dOIu333sX6z/fxKPVu0IP9xz0x0MUIR4zWU5HCvW1+9hcuYvTb72E1HMwZFo0tGmrnTn8m2m7c0A+zAzhP/WY/3eOVDPaqC+gOr6vhhyHCe10zwzlwn3Nr009FUOem7TZWV3NkdS2eIqxTvtADyFJARKLHGvjTsmjnxxmxnGi9dsqZx8cGHjKPXRkLRcSThItTYaunwyFPUni7MVU6eF1SGb8ndIgV+lIU/Bw8GCig7kG/CMwQGl4SgmIkaoJufTfOQxzm2pEkmybaTg17ywZ0A23NLN2JgugXk6leWx8EseZFwUBBpySQCwN7QlA56HhtYmVp9qf5N9UfxoZgTTONoMp9Ptcax5yzwzt3xj0RVGYRQGGNFDQwIwk1glQ4bG7vwA+MgcjEFTkBbnpo2GqHuZ2MXmYYQJ7umiPiHhMXgrUz4s0gp4JNf8MOMQJ/gAAAP//3F1LbxtVFP5mfMceP2InTuKkoQ0tCoqKlLZUKkggpSDECjbsUIvEmn/AqhtYI34CG1hkA6hbFhECpO4QUaBBaRrSJvQRO43j2OPxPNA599yZsRsELFiAN1bsyDNz59475/E9FAvLDYwPfMzcfjvU6uhcochMBFMBGbBlQy7xO7QlaWbrjCjtmNPgUcN5uFJicwUEsnhoMmtl2lRAynAdYlHcp00ve5NNp35UgdT8jrHCoE3BJPWJ+nYQDnF0zMIGizq4SUGAJoi2nRheJEG/PzztR1S8CHqhZJPuE2TWzbMlYP30FNqbhq888pDL/N3uAW0vQJEF/kyRwOLOB3mbKzOBTxA3IRcAQd5qiGpOoeA6KJfL6HS66B6Tx7rYMIpTA1nNHYUB7vyyjpn5BeGHZSFCfwEVomJOUQEL8zj3xit4+OW3UIMQLnGnIoJ4k7dpHkLNk45FxLBFvm5L4HvCT6TYRLG9m40yFBqlMUy4RUx0H+H2rQ18fP0DfPTpJ3i4sY1a28Ozs6dRL4g1GhV8el0Rt4lx7HXhOwqPgx6euMBb197Jmjvj2vvX8f0P3yB9bIP54JTKqAj4+qubuHL1TZyw5oeHIE4DwQCay0mWb2+/9y7mTs9j5fMvsLq6it17OwJBj1i3QtkkxhizUj4FDAXloNcfaA/qHFAYK+LDGzfw8mtXmYBINAAKcKho46giC50QDIiSGS6fKHtI8o1nSBQkgQkdV29sKRog8DQ1pNVqotlsYW3tR9y9u42NzV9xsN9Ct/kElh/wOijQcY46KBK32tKGWfSs9X0PRfIXpd+L0vlsehaxBAt0b5902hpSHgx0t77gcJGxMTuDs6dOYfH8C3ju+QUsLi6i8cwcJmcbKFWrDPeiMWIXDCoy5vTGqChIlqISecrmjJiPrElG2Yzw0v4vL0s0SGhfJDFWQv+Q3aVTq6A2NYnW/UECO0wFDK3M/LCkSCLSdhQsRgEjOPbWfsLCpUuouC6OlPbl5wp3JPw4EqgSLRemArB1kW7t2FY0dIzsfCw4I5oKrEMRM1WB0C5uBJRsB4XYZr/13P4B+vd+R/P2Frq/7SJ/2MEpSqx9rSLOyCEqztlAL4y5wBoZvm6sOdaRIA6oA9dhH16H12e/XEI0PYWoUUVYq8DLW4jcfAIIcl2Fykwd/uODJPiLSF1XsE/c1RCl7xL95rGPB2vrmD8zh+pkHYeWRrfYortBRYCjBy1M1uvcYWaBSYJsmzV7Atz/n75M73hUM+C/qAlgZTQkTfJPVqCkyUDj6O08BPaarP7PkH9VAKgQTHNMOTzXnCBEhRrOd7bgbW2jRN0eBEOdL93NTI/DXH1bsSZEPNVAUNUCuerwEL4fMPqlFvgMD7YTizhNddHhdcgIAxJwU16PrZei/Rb83Uc43tiENdOAPTMNZ3ICamoc+bExTFTL6OcVPGWjT+J1sfb4pgISK3aHRphvRCjZ0Eds6XvSM8B8Zemk3pY4PJbzNN8bqHosHnOW6dpZJ1A9MpSSKKFmaDhuzLDXiOGq7PkdeAz9X778IpYvXESdzRTp4d8BBl14e/ex8tkKttYPhKcsdqjhnwvEUaLnKcAfr0HNzmJQGUOPPMBJ9MoIo5q9hquaORbmJXeTVNchtUE1a6EfeIJIsxn945HFVrkIu1REfXYa8bl95Fpt9Kj4SGiTx/sokdVvYHEhKesQkp6r7D0USRA4z47h2Tm0HQe1pSWUls6jVSqiQ3Emu8xoMQFbkuhIEtg4xlPJ61A8Tp3ivu4eUsHq1sbPODM+jsrFy8iriqaRyC5fqY7jwqtX8NLry7i5s4P+cQ+FgR6b7K32uaiso8Bek7SJvkPj7Byc/BTCklh/J05gluYVSyf8qeQxTq3vuEjwL/ibxBK7sRUfxfyWoXuFmq6gDJ3PTtwJhosAGci6oQGI6LdWUE/V1Y0LWPYSKHaivGGQyaGMnfowqiAWl4FQe/IbCoV0/o16fGLRJou04LrodI6TMQQDW5zkPIeer5zEKkmEhTZtqNj0v5HOr6goSFpM2f5/9lz/LirypJdBMHA3PtKceor1DAWALauNojOHp7pwS+NgVPqzuhKMxJYk31wjoUqMELwS0TvWeSMdN7ZmNw3mFCEO47jia9tAyhWoT0kNXLrPlPjT51mhQMpP8yLSZxAIyVhLrmk08FiVX5rTqVChI7mkFoHMujnQO+Xa3HykuF4+M0h2IwjI74T2obkpKG8eN86VA3Fa18UHHjN23ksRKqxdYI4nNAOaY0ynty38AQAA//+0XVuPE2UYfubQc6cntrvusgsrKKxIIpELjNFIDAncGOOFib+AS/+BiT9JrwgaiUFNCFHhwogRAuyBbttdt7vQbjttZ8Y87/d906EIazxMshccOjud0/e+z/scXLo8R07MIVPZr2xg9YEaR01mGAeBolCIe4De+MXTRNxHkwxMQS0oDRDzA5U5K2aCqbR8aRP9EGiEhNQPE8OQXJeTN6VBhWKTBTP1n3aqNZRKeTk70vDw33gjQev6zT7GUwuOOJCnJqAHTxL1K8mcTXOyFajgSA5u8qVsJx4eLjJd9FE5Oov6ySU07m0jZ4Xa5GWyqCYXVh5ls9NFLTeDIinhjjoOGqV1Wls4XqnK1JRUdUESo0lWPf9sI9KSCi7m1M9m4BWK2Hq8i0ajKbRpKZ3H+0ixwMFInFw7zQb22pvw5lOw0l7cwr24/VfFgzzPXg7Zd89iodPD6pUbmHsSwu70xCSLiL/8sEnUWia5TpalzeYiQa9GvJvphkzwQjvu0E6g4uZwtrSII+MKfmu18OWnnyFTzOJMpYrDXhn22DbdhUyex9o86fFggKbvYzV4jMPnTuHcpfPx6I77vfjBRRz+fBGbm+tIWa7QMJUtnCqErn1zHY1GA8uvvKpgmnCs0dvECmDAJw0VyQRCtM8KG3nz4vtYPr2CCzdu4ofr3+LWzRt4tLGGTrslTs6DQJnt58RcaqT02J6Dt957B59cvowzlz4UCqqcJnlhBxIbqPjXSm5Dt3G5t62MfL7b76o4SyLT41Dpy+Vch+jv7UqqRKvZwuraKlYfPMTtn37GVquN3Z0dyXo3DvGk8XtuRmL95H4XPX4WOTcDf7AvL2/qEvl0cNo8GqkYzcgKNDsFGPSow1ZGUYHrwGUkmlfGseUjWDr2MlZeP4XZhZdw4rUVHKrXUa6VlCOveQewsWQ5ohMvJBs2LiSUZstQVtn8K+/MhIQofh7/H83bv92sg1g2z0zEEhpUqPFovpBHrV6DLayhMbLVisR+7jRasRHfZAfhpKiMJv4AZo8sCjzHhb++geH6BqorJ7HN5jccI5d2Mea8KlSaSF4bkQ+kHEnZgMHWLI3Cu05MjbW1kVU+TRqt0scJQ4yfDyJkRgGK4whutw93v4c+s9rvPcDg/hqcJ/tID/ooRiq/2mbMqzXh2pK1YngvwVNwqtI721IsKAlAxKgdL49+uYCwUkY0dwgRaf8pIGSot6EN88zTvHR2BlG9g9Aforf/BOlETW7EJPyd/ihELuVg6+59pBptFEoldHl/puj+X5DmiN4tg04Xu+tt1JbnUa8cwp7fEwDLtiOE/6A4fkZTbz0NAsTn4TlmetODnmf+y0GeAAfJFg74fPz+fE7ef8bSExECRJzMDEPsrD3C7moDaP4B9Ezzn4PF9TIt0TGS90xD1RKbpEYD3V/vAJstlG0H2dCSCa5MvqeOXyXTW9hzgX6ljFG1BMzU4aQyGFfLCL0s2s01dFt9VGlUGlkMwhEgJ4qLM/Wc2WqH8m6nRNAe9mEFPvzeHkYP72LAwrdWg1uqIVevo1SpCSDlex78chFBPo8eo105VSJTLgzhM25OF4yMt3Vp0qap+KGOopK6TUcJqsZefTdjYhafekAXkEE8trZMwxQqptbEbMs0zUrzojLUDaNP+wU4LDQJbI+wVMzg/OnTWLA98efJoM/MRPn57spXuPrFNVX7TDGp/mpezDcYy/8Bgc7jxzGYrWPgEQBwlCmsbcXPvxyjYyNLt25bART0mRKPBE69ZKI3eRYIEgkryFIu6Q4pwmRD5RwMsiFCXqO5GdhH5pHr7GK41oC/2cagtQOXruRsaCTzPtSqYcMkUaIFYpN9roMpW0whi2+sYLuQxpi+D65ibUS2MT7TYG1imqseiwnEEKfCmCGWa8fR3dvREFd/uY2FxXl4c0eRtlKcaMj+6fO1tLyICx9/hI21dfx45Wsx0hb1YOLBNLMOR98brTuP8Pv3t3Ai/zbsSgZBPoKVsU3cjwbonnYqN3R25TU1aXah6yTD6HH+dljfizZ1Hti8cT2Sej3vyrrv+5OEoKTXifWcdw5rC/H90pN5NkzZtBs3YmZybIaG7GcKnO4GQcwosHWjZwwIOZwxm0kUM39v5AYpcZF34kFkkslM8DA54KRmXfUz6rsZ+bQMM6NJpJ5rufo66msTKumK42ZQdAsoZLKS3DR9Tv4LGYBo5Yd98Y0bQbMZNCAxvcU9o618SWIGuGZ9m2GskQOYe2ksTbXq/9I6B58mgPQLShqt85raiWg83rfixp+IR+QAi95GoUg5yN4gYMFSQMkW1I4INHC8oPpUMZcXloPqM4vFQtxjsv8woAUvg0z2uT8ZDNsYah8qHncwUr2xYnMoxobcy/p+NVJ09r/snQ3rW/wMWAfpgYqwxnTUn8goEtJ1Aw6IgbwGeKTqA/AnAAAA///knctrHEcQxr+emZ2d2Yf2ZVmyNhJyTA7Gl0CIHQcfEjDY5GAwgfyJORoHcswpTiC5iEgmwXgV24vQwzJWJK129jGPDlVdPTtaBfIgl5C56IVmZ2d6u7uqvvp9nrWWILs1lpJnc7Aqxwz+PKswt6CXJGDmjERiAgArd6CAmbM08sKGLZAyuR+SYQkoQyEwPntxSqwIiwPKfrVydxv859IYkVJwNjROcvWC/dm0Ksx8NK0fYrHfAtISYNsHzOAq8ftAgRhqX9cmMOavM/9ZZZioBEE1YBZAY62G0a4B3qR5v+H5njcaGkeDMQNxYpUyC0AJky06PmWiuhOW+Z4yRGLueTgieaHBRveAwVO+sbUgS0ACAtbrVcmCTQ2MgoKs0RA7L3q4fvmKdBg6f7nbWYsWjRaG0q0baB0dY/vx9wijMaqOg6V6Ay61h3D20YBseGXj9LPpO6cMPKkeMkNx4ew10pgncT9RaDsumkEDtQB4/fotMBjjavMSQiXBvyMSOppMoXEaDaDqNbwZDHGoEzz84iHSsgc2+OaFE+hcauL2R3fw9eNHUO6EvaJVHpRp9Ps7ePLtd+iurxcSO+cnsQuZ/6KeQJkJmOjzdx98ho8/uYP9nVfYfvYLNn78AS9+fYaTN3vcKxkqF7WwjrX1q/j0/n3cvHcXWGhzRSdVs03SrHvKsBRiHZunxW0TGbMPKj5tgEvQkwmikwEnj/Z2d/Hy1UtsbT1Fr9fD1uYmxlSZygQ0Q4FfpcqYJoJy0oaBCOqYJNJzLgt8kiFzTNsQAylj47pBkxHBU+h6h6MRV/XrzQaWuqtodRa5qr/27lV019fQ6S7j8vIyyvWAnRa4+mP7M0teTkPmFgX6vM95x9oWBhnxF6348uKYAv4Ws/+/d7Cyquwz1TqsVTjbrv2E3QDK9QrGxwPeiOo/ug/K9GlaWXy+CaTN7NkQ+z+TKmgVgZuhxOC/lG3vvBwR4XLAQOOEWlhcExmYjb0yz3QKk9wNiLoOB6F2+e80B3rkQjIcwJtmSE9OkRydYLBzgPHhWwz2DuAPx6hPE/g0b9PcwCofgfBIQ4N1Q8lygoUDPfuEIKYuWu57LrENWLJQ48BfdRrQtRBxpYI48JGR/IBkP7TRcM2oSUiWXa/CW15EtHuI0C1LRbEYqs8aTei+lc4i7G5sYmmli/blOk7SDBNSxokCijbF+y/6zGxZubaKoFzCKJEksnVy0bNWhf/7EY1GTNvmxFE0xWGvj7P+LrD/1kDrWEHmsy88fU9hNwU+5czltoxqNGU44/HzHi45yvTvF4p4+XyqbNVWIab9SoOSQy2kiw0kzarxaPY10pqC2/SRLVRx1O9zMkozU8CWl7XM+55Z26QdkJJtdHUBFVjEeYBG8jQaY6pe4/RZD0NS7HVXkXU68K4swWm30G62kIY+FCU2/DIip4RYqPYRuRJ55GJh9ioZ76U0UldAcZ7hCKVaerTFzvTcFOCZJJmWZAHbEVpwmwBH+V8cmXG1qVZzICP3zRRjKPEbI52eYTF08eDObXy4vo4KJan5qUQsRXjz0xa++vIRRmcEoAuRIAYK1KELBykWiOdBgVmrBVxZgW4vQoehCRpKTm61x4GV50H5Cn5QNrZ5sVm7KO/BiQJHCS1+xkFhmbWaqQIyd6aOICgozWt+o4Jyp4Gw00b9egx9+BvG+wc4PTxg7tDobIiEqoj85OWcMBySNHDRvvYeurdu4qBaQ0SMCk6O6pyJkj+PC22G5zNU89BO8zoOt5tmysPeZIRvNjewcquCemMJC54rTiNT+I6P6x+8j3ufP8TB823s9bZ5bLgSkOdtg4XPgzMGnj7ZQOedFazevIGIrJOtYqTw0FTBRm3+SNnm+89D/X+6Uiu2hKW9bggVn5rWYmTnerL/6Lp4DyM8LDpI2WxdC+h31WolV6WYYmiWB1PcFk2WitZ5gJTNFGskVtYvYE62wDPn5/VT7NlsfGOty4Hzldz8fkrQD5HxUEujAAAgAElEQVT8p+xyluSJBmKYccW9wCXQ2QxOkuhsxgKBYUUFZY/tl/3czPPfOjIJzs1eARIvOrJHt+9Z62yW0BJlg4UgWsih5RwY3lyWQ/fsfaFCdPG+MT9AkjcoxKn0O9qbWlt4Or9NJszGhmkBIE4Q31uJMbmqLzB1Or+J/6hiVxh7/JyNEsCek9l4ogigll3rEmABfPYZ8zhlaB8p4Ulxb4ondjzSYWNUghqzwl7GECfFhadlE1YE/OPXFt4ev9855wXb7kDvFQB+J+9aetuoovA3bz9jZ2zXaZM+UxZUVF1QRIXYsEGiC5T+OFiwQGKBoAs2ILGFFQIJIURDWwnRPKqWltAmfszYnic659w7HrtNF6BKSHiTSMmM53nv/c75HrbEM8Sq2x0VkQgyoEoSQKao+IZhPAsHiXapDkqDYtHAREU0hn4Z6KaSV4DWsPDv0dyAj6g03O3O5pF/z3txdQd/gc6jqmYMSEoaCv2TDC+0n4Bl/nNdkqnpJTquYsl8wVhiABCIz1wT/uY66htdBI/GXJE3Sy6peotMLQqeTlIMxgFa3YZUq1lflCEcB+wF0KmtwaVUBqKrL+ls+KFIzYIhkSRSEaL7enh0iDAM1Msikoc4m3HXnBy2d367i1OXLsOv+uKGmusS9PFFAENREmkC5XFqw0fnvbfw6I/H+ObTLzA9eIRL/XWsOy2se220jArrkpE7SxxVic+xtCWNap+4ZIHMiUIW8lmOnlmB57Y5oq1jr3CBh6J+lDGmGEuSK2ueYWyl2MsCeBfW8Oq1q8hcHUGWCpB3gK0bW/j6y68QEyOCslZTMQ5jymES4/ObN3F96310/J7adnGSWjA809dE/6fOfbWYu4Pq6go2/SvYvPwa3r2xhSQKMQmH7AVg5waqlRocopsSxYtML4W0XywK5lZ9WcHYoedIFpsZ3+twNMZwMMD+zh7u/LKNO7dusX6fqv5TlqeIq6zH1eumFIoMmwsw4XgsKR1RgmA64+tIOiXioOqoKr4rEzE3oQppGEqllzrO/f45nH/lIk6ePY0LFzfhn+ihu3EGq50u/FVfJEDluJwsZv0jTZISyacYFCUAx6ZHRlYquywuFZdz+f+rnf6X8dEmelbFQ6fTQcfv4OFwhNy20O730Gi3cDgYHYskdecrM4RuzPtjbSsZ/AXY395G59pVNNd8jFg+nDOrhXSKVDC2lO7WYlPOnB2zXVoIGSYbQtqmTGgGFf9mCdxZBmMUMjCLBgOM/3yCw4cPMTx4guDpU+ThhBAf07Yr5Eat4mpi7mKk845tnpe67/nC4lXrsRMyryXaGwE6y0XabACrLTZiy6g7WK8jrjhM+aUuH3f/iaJgS84b7ZXwZbxC5mBrCOv3MAkmHA9mZLpApd9/k0duSnlpOyYOdnZR37mPerOL0AHHvlmUBmBpJ3YLB7/vwXFMNM/24FYsTOPlDtX/G/7rgitJW2hsnP01wNHuA0z2SPN/xAVgAsSOV0FKYwqBXkvYZFRsquUuGtMU7mGA3R9/hnk0QJViPdXaOOXnnxgvcdENzrlglCMlNkuvDW+jj7RbQ+yCF/vkHj9BE5ZfR95aheU18PjuHazMhmiATCot5aJvqNHaKiQp4nGDwqHb1Ex1Mno1E3h5jGpuI96/h+jBLuLbFufEN3on4fW6aFKaQLePrN3GlPxPGjVMPBtDCxhnEXdzJeJSOs+pjuLMFLBX42QxixjiZaHNBZlMyDTTTKFh1ZLOUHi3Z3poLrqFIkFiCj3naRPgMfDm5Yu4/vpVnDZq8HglQV3yEOO9fXz8wSf46ft7ahGbHRtnWX4OiLlDsX/Vs+dhdvtIGnU28qXvis25HIEL944Bq+ayQRgnPNh6ZoiUVM+YF3xoq1QzGETGkLJkTLrmMiDafN4xqIBowu6sIppFcFcacM+voxlOkYQBvFGIJJhi8uQIURBw4ZyKEG6jhtapdbTPnMOgWkdEzymZRDsGS0l0dCAXT4sDm8/1JSeAZ6+NInTRuJKxzM7BKElwa28H3/ktrF2poen4LDOUYmkEs1rFG++8jfu3f8VnH37Ex2wpF0xdRJVignpMqPF0MMT2tz/gxEYf9uYJlgkIc36+NnwR0GYDtuR4ece/+Yg1pPa7qsOcmCwtpPtnms+uXRd1/0Kp1rRqltqq7H/CE1J8dEr/L3iEWcSW6qQmi+vvBTbwc3CGBrPaC8DRsYD676WG3vPwD7N8TWmqYmmWYJN1JSXQ3js8b0KkQzSOEm6hBINGpcZh2S/jQ/hCYzzGYLYuACRyxKVTMpQ/m8aX1MFP2AzQZgAuoN8qpBGE7zQ+LPvFlYtPuXLCh5JoMOhVOLBG+1frWFoLJzkdqzLfYyBPqXTUxJbvoHMRXKtm+kJ2LrOI9r8gzFmWkOjGeZRGXJwi3Ej74gJB4W9HsYIiXdHbla8L3TvW6TtKzj4Rlj2dvzallDFezldjQc2WFxbAC+4xgL8BAAD//8xdXW8bRRQ9O7v2ruMk/qjdNgnBhQpe+o76XJBAQvQJ8St54IUiQCAeEFIrlUYtammrhKZJU9qmceIkttfeD3TunbHXIRWiQiorWVGiyJ7dHe/MPfd8TBgADnkwkw78tAjP0qKj5axpn6MiCKqVquGImJNZp0NFXRK5KXzoywR12Y12skp3nvTk/mAyePfZorssIGbFIytQ1FwcBH93Wn636Al6b400HPU/d3ERJ97Tt4wGOmWKxuqEBEC66Vmm5jnWVOOV7s1Ct00wSAeo1EoiBdhee4RSqjIAP5+lvymSHYgD6PbuHs6dWZA9aSg6UkaNjAUAoL4UlrqWzdxi3ZaSTkpKPYs6eTBWE1TCEnYPutjrvsTy6nkpumi+FoRGJRosmPdfSoe61l6WrsqrcfnT/q5ulaZk4C018d7VK/hh7Qa+vfYLbv6xhQ7quNTsoFNv42xUQ8urCkUzotFdrkWmwPJCabNUqDSR+C/tSCRAnKPKGLCwimESY95EumgFmotM5D2LYwyJ4JbL2B0cYycb4eOrn4o7v5O3OOSfmtwrH32I1c7b2Ny4C58eApa6x8cmO9HXr1/HwwcPUb/clAI48EszZ28wew+84tWxOjn5cnpqPJYLoV21aT7dh+fnp91s+XwjDvaenI0Ln9NRaecxs7RtBSqOegc42uvhyfYTPN95itu/3sL9u/fw+NGmxAQyko/FWHWugjONmnRSnU5NEMrM+ksMY+n6DwZDZfPk+t06OOoLosjXSM4/wGK9hubqElbeWpKEggsXGcH3vuj1+arMzwNRWTahzDtmlKeRLRi/7yORW/j22tA4UN2vKVUIJhuRqcHS6QDUm3bi/78c1LDx+cY4wPMry3i69RhxlmBxvoLauRa2Nrf//Uj5ngCOD/bwcvsRaucWUSeN1AqeuZ6HeSBpk9xfUyrCwr8sOf25aLKzfl/iOJPhMeJeD93dLpLuIQ6fvsBgdx9xtyfeEmk8FG8JZm97Mv+Zw+0h5KLLbgc7+JnVFk4yVFygVGYLOZ0s0gmjBpQLsjFCse4HkRT/NPNDjRRu5oaXpKNKej4B2gmlwVjdjgUaxmIE56FaqyJaXsFxtye67lxmcvFQgIpRX2HuoTpOsLt2B63Ou4jqNQEZUl9ndSkoYzzUZIud9cdol4DGSls6MmQCSM3lqx44LW4mCxr+V+Xi/9eHl785GCKzeAy9quMX++htPMFw6xnpccCQkqAQYTQnQGlKaVlJgU3eGJoE1lIPjWGCP2/cxOD+OtrjRAxX/al03srvzIRDxDnTp+HTYhWjVkNo+PlCZIm0anjLjho778F8A5V6HQtnmojvPcDw2XP0hkeoIhemS2DN0iR9QmiwRiOdHNMjn15fnYIZIloAMjrPnj/ncnxwiGRzE89+K2EQRjCts5hbXkLzwgUBXWvtFkZRCX5YQT9LMcxyjDj/fTXNE78Vm8PuDA/zQgUsRsOZbiJlc2vZmsJeSDSm12a8/U0ugkk2fC5O0+U8xcVWE599cBmdSh0LEpYYa6Rw/xDffPkVvv/6R+04k3XADa7n/BfMDBtyOsKSGP2ljbPwl1ZxXKni0PMw4OpMzwfPsn5oBlsOgNCH4SsqydjoaM/nUJ4aZUtKtK1tvFjKfW5ZN/CKa45jFShDYuRps2NcVtdFGgzKKj03B5M2YJi9neRY5CnEYzEmNUEZRnwFAux7Pvpcx8lM4P7CyyYmer7TRItvh/ePoMjJYwJgeULJxVE6xk+372B5sY2FTij7pTLsgmo8LHXewSdffI6N39fx87XvFKC1YGpum3xOUsG6pwpg5/46Nm7dxaXOeVWWGGvAx33yKbJd30ahid+RxLEqc8ovXN/ZmfT6TxrewwhM/AjlPMap7TIH3mTPfxo7wbOd51GilGz1KjNqFmf1+a7ucLJfxwRwxbkWlvp+Sv2fdvClG26NAakHd0xoI0CDZsrLGKzclTUTx1L0LJPxjez4JHFgLD/FCd/Mmsa68yyCEKkDyz1df8j0oY/KnKQA+IWY4te78rMSHt21EYykVxPZLwJ4GAswUWJ7YvFSNoCZ+EhIh9zX2svp+1HwZ4AtcJ3mn9dGO91j601kJox02HlVNFl08gyI/wejGwWetCwA2wzhvpXyKrJgraeUo+CfBGUcW8BR750JIP9fQR76zKkkS+6vvZeuwOe+hsbKzkvAXUvHLHCpAM6Ukv/H+laADZtS58ZEmYPOOX3eE0RxsZfFOSLfb14fAH8BAAD//6RdyW/cVBj/eZ3Fk4wmk+lk0jRpSgWV0ohNQtBzJRACCYk7Ev8SF04cuBUJceyBU8UBxKmoIEGVpkqb0mWyTmaxPbaf0fd973kmk1aphC9JlGRsP/u99y2/xWWYEidanngcQ1YU4nl6JcNNEMsCI84wXQAwE4tedF+LQjE3XkN+En3DtBlSYscPi0RyKPhKkwKaTw/O2FcAL68kGniLmRzmoP/nwbMFDlRUa2xDNUgLS8B8yrpEggB1KrjKiGfBCqIZV7jL5RLzorly41rMfaYiAFXhGF6Tz7iburbuTNHGSrYSRG8YMWRwfr2BoFPBcJs6SSlbQXmadZWZZde1QPHhi0GO7kmENxpVOKSRQNdaLqG/t4/0UgdVv8ZJOvmtkzjgWAknxnI8hmA7bIsi+nu1WhmNhQC94QG63aeIx1dQDurwqXiTxCws6GUR8jjEs4dbuLx+jYNessSYaMNOP4jJz3kRlNqi9E8TrlqFv/kW1r/4GPdu/4QMMVo4wJ3DE1wYzuH6QgcfzS9jLatgtVxHkPvMX2bujLHTIJ5mSZJIIbBKgUHEcl3UAp+9cEX4xOFCC1dSSw6LZhAXbGd/H+VrK3j75k0aPE7wbdNLzkVpr9IO8Onnn+C7b/4Rj039K5oJlISMRgPc+vEWNt97BxW/ojeqSYfOmXziyw9LTVnxCWR5WknUmup4oyhO8LZZAJxZAzhJEEYDHJEdX7eLnd0dHD3bQ3dnjxOJp493cXxwxCr8tJDSIt+pNXmhpw2GFrQkTFlpnwIlUpvukR5HLBtJpH32qWsSJ9JRorENKhUsXbqE+cU6Njavsxp/a7mD9avraHeWUKsGXDTT+KWCl83xFKMLcGqsJPjVLqvctbC5KIFJ+WpGnitjZro5nJle/xn4v+G462E9L6xQ55QR/m+N3M5nPsE6fb6zRbbZIPgcBUq9gZN1aaO5wB3T3tExu2E0WotoNJvY3+/K35TK6NN6rONNs+4Z9fNMK3o7RlpJjRH3j7BU9RmGz8rqnsA/Kckhbq8dDqjMjrA/RNTr42D3KX/t7R0i6vUQHvagwlAETKkbqOR85Rya6kO2RMah3CpmU5LLk8kyQ0dydHihNMVGymGxedcsoQ9FykJMlXzbQVjyES0uMqTaaczDItE/z2anFhJMJLswmzo8VED0LE6QKJFRUz7FcZ4grrooL3eQ/ttFtP+Cu5rivpbDocRDJwuM6srBlnPH21tI7v+Nxoc3MLJpvsk+mLCtpSuvaKqwd/8Rhr0Qq1cvs7jm2JY5r2zhAhvfbehznKIcvaTwXPjmv6Iorc5kcae7T9Y05e51ig352Xd6+shmrmN2XydBJ6Xh2+ZUTB8kRwrlIXrwHL0HuxhT8j+IObnyymVYROfItRc+eyQ7fBlV30egMrTdEpLHuxjdvYulKETd8uAz2s6Mp9KMZF3ch8IoVzie92CvtBBfXEFYX4DjVQq0Hl0n+VpTgjag5oA/jyR4E16rBbX1EIdbW5g7OUYdKew05AIZtWdz3VXN6B5Zp0diDqbEacS30lZ1FUuoA7lW/K9ycBghG9L6HWLc7yF5tI2D33/lxLLaXkalfQGNtTU02m04iy2ERFsk+yrPQ+S7IJ33iLQHrBSJI7SxMcnVap0kup/hYKA7+VZR8GU3mpIkDdIWzqQYILAAiVr0ml8l0ITn4MsP3seNlTXM8biSwn8fatTHvZ/v4Idvv0d0opuASvRuYku6+HYmeu5GSUfeEhopFyO7hIVrG0iXLmIc1JCUbLbAYrFCXU2hZZbchAhYWAoC+Z7mEAkUk3BpCi68kU6HnSrREoHoBShGOyZwMo2m46KE2ce0AWGuk4ks56A607yD1IaOWYimobvyQalYWwm6S/s3i/3xez7SSCtbihC2iP1ZUw4COKXNMTO38kkyIz9qMVyIroWdWhhmFnbzHLf//AuLcw2UO6tosp6GzWg/ut/VzXfx2Vdf48n2Ezzf2sYoGfD4q9zX7hspr8t16r9Ecj1//PIb2htX0NxYx4CcEAiqzTGwy+gwmSO5jJ0SjQh6TrmVYpAOeQ0kNQhoyt9rHWfWlpmOON2z5YLUjwI3QMWtchHDtYn2GklcouP+JJ3Qj6dzGEKLQHeLiedtdMAUi5Sf7uoWeUQm8HzSz3IK6P/kuowbAOVMIsSXFkJxhsrMya9GlNP/E/rU0WrSZt3l6MfzCpSApZNbKm4pQ0W2tAYIU1vdAvmj9HkYOh7GjOat1+poNZqo2hXxqZ99BkX1yXx99dpuTzXzc543sj8fj3o4jvqMcHFL0tA0MHV22aK4VonunErzAvZvEn8UibXMkUy7RtFncJJL8YcnPHnKxdiynkG2OvCj8xgxPcfoocnFGrSAJNcUcvuwE4U0lmsUmH6GWqXG7wPFwUwZt4kOTmKPiS480PsvDT1GsfpiV8/n8CxGFtC6QO/HaEQ5o8/rKT9XXuwVyp7Pot8sWpgrjrvpnlm1n1FJohNA18H3TuuzP9GKELFAykXlKdA7RHuhydN5HLWVPxUeuBBF2mCsKZYjSRP8BwAA///MXUtvG1UU/mbs8dttbMdJkzaNUJ9UlIoFCyrYILKELUgsQfyllhUbWLBiWcSKDQtgwUsVFW1JkyZN08ax87LHnhf6zrl3xnH6EFUlmG6qxk5nxtd3zvnO98jbCDz9hY7ZkBJhBESRUkpIYbCIxLgbZTyGjPF11jnTGuSZb0KqZeEbQjNFFAdEY/xnL8hKB8bp/bZAV+2CmyIo6Xoddx81MoBxl3/7d9v8Ez1hsyOgAc89jI2jYmxyZI0jLdQgIgqzgiEyDz8uOJhiSsCEJJ+iuQVOtK3jJtTdWjLw3Ri1Rh3TJ9vYW1k1aB6nXdmXMHYy+UM/ATZ3+jhZK0nmvcSZIA8/CPBocwtzNCQymf80X9PiQk3ieK95jmyYGaMBZyg6ylq1ip2dHQEI6s0GfG5u8hkkKBZcQbCHvS34ux1UG6fk34+C/s9oiRI3dUBlHNnrS+9i9soV3PrjJgYEQ+DjznCA5Y0drHUe4mpzAUFxEfP5ukxnKqWixAKKw2boChqoDaKhyCAz/BF6FafxeUfAGO0sY5lgk8K50dvC45GPy1evojo9neWRjl+QKb4++vhDfPn5NQx98djX5oKbKouKMMF3N77FJ59+hnMXzsM1rrEvLiI5vKEmxqU361pdIaIGoS8Sj25nC71eF3fv3hbDvuXlZfQ6O9jcfCj5+8l+iEF3X6hk9XIV5eox2Ry5/oJhiNGBb9YWzLmrTCaU3FQ1k2EW6l7/QLTkxVoVrZNzOH/pIs6ePYs3SeVcWEB7fkb0+rmSFuf2CZU4+VRzrfc0Q21hALZ/e4w/4p/XgD/15y9X3Pa/P/gAbTSb4ruwtbaGKOdJEsD0TBvd7rYY73GPzj1hsowUL4kFsIjNa1gABo83cdorosVYLcP2ImPE73TR73bQW1/H9sYDPLy/Ln4TbP65J7HJz4WQ4C8RsTi20HUOTXuOfn4mIindF2NMCs/SIllQb0cmnaQ+s7w8yDkYenl4rSmUZmaAmTZG1HLSAIwPRxYD0vDn4BS0eYydzGzL+sSQTi7yCO77eQdJs47CiVmEvY54aojTgDhojcWMJTQVU8+YGgLc+/knnLn0KlrHF0RSw27PSqbS+Dk/QX9zG7cHI1x47SLKFTIBhghHgTIBctlC1klOdv2TTv//yfGM5v+5h3gzZOtPP9xEhs/eKEFndQWDP9eA+9vAvi8XXmRDnvME4CGQ43DKKoZaxHESlOiBQmbb3j4e37yJ/KMtHI/UkV+j1dws5z6VcWjWPifpo1YDyWwbQaOJoFqT5w+AtDZIrAM6DaJYCHolydQ+dvwYZs+9gt7vv2F15R48P0aN0kPGMBmqvHLUojTRwLWJNxZwSmKRs3nIwmpgDLSEGRap92tsnP+57gcHfQzurWL3l1/RZ0zVdBuF9iymTp1CpT2NE3PzCDkJKnmIig76ETCiazUppDSqosaWeucKZKpNY0G+XhJaOHmi/GsUinu5yB7zkZw8mwfWV4yDbZZLmKkAb51ZxHuXr2DOLakcIh4g547w4PYtfPPF13i0HKZ684zYPjlgyNYTPxOf3jiLZ5CbP41+ZUpAD83UD3VokzLnVd9PCRuRF1K0+YfDjVJS1gk3a5OBnQAmh/43C9Q6ho2QrmvRT2vBbryWdZLK+thR8GES5Dp0pMbYR78nz5r0p2yf536JjJmXVSzIOXnCZLmz3cUPf/+F+VYD5UJDVl/OMuyKVbzx9jtYev8DfHXtOpxgIEyuwBj3wVCcjXoA7KV3N3bx443vsdRuYWqxjW3KAGme5mR7utTRYwMSJhYlISWF+wIAMFZWnjFPATBf7IgluaaWLyPymcM0hFNQMDexhpjIHNSP3MEnxNVpw++Kt82kQZ70Fca4kc+AcZ26fS8n/JGJmrO6a/tzHUy6Mly1vY4dniqT+vBa8QpemoLGOLrJCT+eCOya6+AzbxQizwg97kn1CuqlqpG5vqwPQK9HJVQBBsM+QvYyiUkWsQMgGueFasLJYSqb+SDO4v00rz9IyQQEv9VPyJG9yXHUG0AbXNXSkzFl751lAxw2hJ+otydS7azJnsQLGsNB0d0bHwcboW0NG62XHc9dagXKIscH4sY0X94j7A5lwcv5kU0+ZoTIekzui5i6RoaJYPcLAjcZkGRZ+crOtQCSZXuojwWxLjHtT33xlEVhExQIWOh5jHSQnnPxDwAAAP//7F1LbxtVGD0z9sQeP1LHiUsT3KYPkiZQVcACiQUIoQrY8B9Zs+4KJKAsAAmkUKhIq1BCG5zYhqZ24o7t8TzQ+e69M2OT0CwQEhJXSqw8/JjHvff7vnO+c/KiVKj7WtSTAu1tqSj2TP7lpAeK1iDehnpRI4XE9HogEcoIkwOQClc22NRIH6soctJ50CM/Se6zyoXZ/v7sMBebRQP+f7Zl4KTkP9JiEmwvMBNJenisUNEozA1ipa9hRYqmI/16GacACiqQkj5JekjspBfHztD5owy6FbIXLM4LalReWER+/Tq6W48RDIiiIaFyq5BXqfvntRZA9+kRDmtFVEndFjuAEKWiK1Z+4+OhJGORFD14/QpyA/sicuGoXnbatlEPgJ7WBRe12iK6/UP0jwdYorANLZWsUHreuDgWKcbl9dBvP0a9eVUCLHtKDDDdGC1Ndp8VpUkmQhxjeWUZ7916F/fv/iC0d1EEtSy0rTHu+B3stg9xOBfhJbuGK04DzXMLqM7lRDDQ4ZJOYTuNSkNvGFw4LL2wyQwxRQrjLS4WSgEejfuorDXx1vu3FGqJ3Klw8PrNm7jx2qv48uvPEwTSjpFs+I8f7uKzTz7F9Y2NtH3gLy7Ap4/sGZrdgoSxEk2ksMP7keh+p93GL7s/o3PQxt7DXXRaB2jv72M88FQVMVQoLJ0SiBrWa0tK8T9nY+z56PeeJiqpk5lFfiwuHL6itrFgVJjDheYy3rx2DZs3b+DK+lU0r1zG5bU11BcWhLIspdJIOSsYpVkjXkT9iNC2/zVa8v9jehiXA1aNeb1q9TrcchnBKBbhtObqJbRaLfT6h4J2SvU3s86eNrjpksbqP2rB396R6dPqdHCwv48nnS6etjoYDwYIJ2PxmuWsYZGyyhmk6Z9OXgujkf2VTILp5P8kfCfb0pRLyKiqFGASsUi3XvmB4k4FOfr65xFUK3BfvID4/CJGbgGTQlGS/7EEJwEct6iCCSeXCO1ZM58rO0TczLbhLFThrDQQ7FUR9QKhTZNAaen5YBC/0B9L4kLx2CfdDg6+38LF80uo5G0cEnGNtOgiqyNEGl1X9szweIAH937Cy6/fQK08j2EwwjP/WWrzNiN2mTL7/mONMLMF5DhtoeOSUnJd2MMQ3e2H8B+1gT0q/fvKKYG9+WSKyf4Yqx5v6kTk87KPkQLshgGqkxH8nV10v91CPdXlSxDWFNsKRbSNdOwRi/QUmbu0imBpBWGxDCtXFEQwq8ou8QCV4bneWg5yVkmU0Y8qJXj1GuYaNZR/fwW9ew/Q2/sNxaMncKnDw31d2g2sKaE3Fvd9m0CB0tDQdQC5xvxZhWzTrCgr0eeLZV3OxQEmXgzHs+D1/oD/6w46W3k5NyzozjcaaFxsovRCA/XGeUSlAnKVCsJyGd5cESGV7/no2BjRJ9pWdpp835HnSXA8jAMJ6pnQEV0r8AsWKnr6s+oAACAASURBVIhx+VwFmwtlvLO5jvVqA0U660fHcHhOWx3c/uhjfPXFj8kxRVrsmPewo0+tEfM02xW3OI9tivNLmF/bQLR4QXQAJlYuEVWUJIABtaXAD+5PInrsKKvkEEqAjPGfACVhLP7swrAwhTTztqY3/G8K1sb6a+p3p8SpZx3Po/snqv9mjswo2J/kEiOJrk0mQIBvdraxfnEFy5eqcGnHGCmtpXHgSwvJ2x9+gJ0H93Hn9m2E4rZh6YKGet1AYysMtRjq73y3jdXrd7FWfgOFWlGBhpZCU0+yGRVP8kjZhKc2jdGZShtnHaq1wEbFLUm7ozeJtM0ZlGONnQEkT1gvE8G6M4IVFFoz8b5C/k0rcqQSQ41aW6LRpQoIvs6T1PUzInCa0azt4xJGtZ0mlIzviSAblmZ6XnWil0lMT2pzIABjdGr4mevVRZyr1HT0+k8FbVHy3Y99HA2PVXxJ9nOgfD5NQYUFEep3SZ5J5F+7IRjrvGQuRVMPck9LgUD36zPv4rzuD6YBYbZG8D28Z57kQ9TZmU36ofvvRSCVxSOyAHSRhq0Lxu5RsQV0Ms8Y5jl7rQDfuq0jKfjo/hDmzQpIn2bPm3YGHpfKrxXSb+6TrL4AwWsRCNaigUrjLr3eKhdMhST5d7K9lIvfHIZD3kda44/PA/Ane9fS20YVhb+Z8Txix47zsOs2VR+kIDVVKSyQ2LJjAequlN+FkLphyYpdAQmEhIR4iDZCCNEKUSlVq0StE9KEOHHsGY9n0HfuuR7bLW2F6AYxuyRS7Lke33vO+V4jfimReRMr4Em8FyPibJyMzf4UTYPemEyq+GYGwwlX/iQZFLEZarhipyJQ10vKDaQRD0wmudVz2PiCaSdMezNsPuzkwlV3RovQy8bHScqgQPyFuqexD6LhoP6DEzsuSmYpS2MxfFafp4634vSZaXwDCxXqdog+JGZj9gLmQmsxnRujJ19pdEJhz1wMuznyXoq418H+Vhf77T34rjvK6Swq44I6nSllsJsC7U4PiwtNDP1QClj4lGUAt+89RHl2Vig/guISMSIqkKVCWznoHo4GALzvbtJHL46xdxjj/sM9VI8dYWlhHrWIlKxYyLTcPFnsHu7uSlSRV4/o2z31RXfHHNgzTEOt41oW0q3ef+8KPrp2DR1FohNSsXKgwwM+H2Cus4HGxVO4uf4AdztbWD3RQqtSFS0dneSdzDacOtETuswQLr0BON1khj4NX6BSlSjEbr+DrVKCc29ewvzZU2ZdU+N4/Niep8Lity+/ixtra4jTIjqGn3HEzTtO8fn1z3Dl6lU0Gg3l2f7D5n9CtEUX6C7a7TbW19exubmJO7/fwc6jHWxsbGBn+w8k3R6yfiJO00RSy6VA3HxnggAhY4RoEuKU0Iv7wuYYqImNxBkNU4lGibN0ROvk4IRI8crKingfrL5+CRdeexVnVl4ShD+oRLJRUwzBYpeNfk5dWsm4MWd2sGfdzyVqqaDv/l2c1//Xi7/4mS82GyjXqhj29+GGPmbn57DQWML2/p+qnXeeyz9Bcv4zorAP8PEHH0oRxZQH7pUBo/VSoi65eHiXNfopT00Kxfiz/7RvymPyjSf8vjC+tH9zBbGVZpuFLO9pJoRbqcKpzKC6vIx4rorBHLX+JflO2AgnX9H+EZr7DKII9/yAZ8qQfgIZwnoZpWMN9A+OUBoONFCkuF+uTVQK5fzspWxIS9j87lucpD/G2dPocsinqQt2UUiBlDOFeuhOF7/e/BnnL11AvbkkrJ7Dflf2t3FfjOfJ83+R7IBxtMl1pn9+gnRPz/98yjkc2tg4NhmCzcmjI7Tv3Ed694HR+7P5p1lWGMrzHWea700kkfWDazxZaDxZcxzU4gTR9i42fryBaG8XkesLOjp6vbEhgKOvTwp6b8aHd7KF4OQpxPVFZOGM2eeHCmaMKlLTfUvknzxXHtLMBQnOmTdEFNYlu7t1/DTc7S1s/bKG7vYWeju7CMn4UwmMIEvc/x0TTMOUCBsx6buFV4GbPz4oG+GtKl8M5P4hgAJPayL2qSp9cLCPpP0Q927fEi+KNIoQzC+IXCDgwKLZQu1EC/V6TeQx5aV5JCVDbRfz8vKsMA2ZoJMFjrDoAs/BjOeh7OSoecDpagVvLDdwvtYU/wLBFvkZJQm+//RLfPXJF4gPzfsbVQ4T8qwpho/9TKhVPvcK/DPn0KafB2P/rO5ZUWrDQIXG7poBgC+SNFfOL555rjIGRaMb+ib+ziJoaf6fG177YiCci4xqezDAN7/dwsuLTVQqLRmoltSQG36IMxdW8dbld8QwePPuumliha2lUd12H9bnk2mOP339AyrLTRy/uAK3opHhQ62dPRs5rBpjNsuZWevSWHz4v3vlpjYKQtSrNXQPDpAMj0wtnameOjN08DyfNlsr0F1H3eoLY/FMgLSJtfWLDH6TPDbUmscg9wXxmdGMjvoKOMIG8PSZS20coPYgYpCuTORRRPZoWJALYCmxg8qQttdkM/vkh1jc9Cnf7mcInAjVsIq5oKbgXf70A/AZV+ZkIyAwU652jBRHg55Q4I2MyQw5aBTNZtX0h+Y8oBzA9gu8L2Pe7k3WA3kxKJFhrK4Pf9eTftWfYFGweef/ma1WJ8BpTKP/ykwXSYL607FPlOhBh55xRYqEXVvLDjSeA6ZnZdqRPf/GzQzFy0OSzEzjbqI6DctAWCn6+uIdVCLzQeX1yh4Y+RSo1p/Pk2HNKztB5ShmWECzd/V50RQCe78EqWWd6EFBKQlZKfTM4WAhHeAvAAAA///MXUtvG1UU/mbG4/GM7cSx3TxIS0OhEQVVsIAVC6rCAoFAbCqh/gdW/BEkBGKHEJTHCoktEmKBhAqopaWkpCWpGiWNkjQvO7bnPeicc+94koaqrUBiVlFsX83r3nse36PE/pNhyFV0UuWPIl8+DJUaJonPqRupk3vKQHmRLfDs+aaocbTip6EtVzC0puAqRxLDI/slNa4WUtBQBapWHPTozyeEOfz7YLWMhRhKTu7RyRMgksST/qd9ECMlUkgVYurUpHGSW3iEA5+/ZygxFuFpWUqNskJoetQNF2EQoBTKJkRFEAQJMj+BP+gg2YvR3eqgu9GFv9XH9to21lfvyve7ZH8l+1dANojM+Rtea6YVioUehKW7fRjWNuyKi929Ljr9HjpBH90w5aAhTIe/0cFNsctxcH7T+nzn+59x8eoiZk8cx1Mzk2iOOhipOzxJMzOGtb7FiadXI+5axMKEVEwJwgBO2d033j2czlIB05kBp585hbfefAMXvroAhzhRsajxEvSTPPCv7Wzg9dkpnH/vXXz9/kf47tJVvDg+g9PjT6LOfFjp+vEizphJUzj0lqW8t0QkMDOFS97xB7gTdNBtVnDqlZcASgLELerwQ9nKv/3OOXz6+Wf449plVO0Kd8opCIsZuAlcv/o7rvx6CS+/elahUExEwYAD0wc5hhz1Mj+ttdu3ebzlW0v4a24eN27ewGDQw87ODndZqCjGyBxGathwHVcKNDQHydqoN4CfRqJDQUWtJEEvFPoCiYmR8BPdt3K9itGJFnP3j83McJd/8ug02/KRmF+DVNFzHQcpPOmAjPnQkPF1miNoi/1RvKGElf6Lw3jIHephT+P+DPz//2FowSqC8dbqmD52FPO1Ona3OgijDPVWA4+fmMH8wqKyao3yLjsHJvrJ5g24dB8toErvAFXmDaAChWxKtRgfG2nIxhrHKqkasgKT4fS67/FPCJkUpoKsKn9/Eow0ROiPZuWAKvYtFwa9w81RmI0RdD0XkeuQfLzA/On8LVWNt8wcKVTS61bupqH2EaLAEfTf1P8Xnuse2fA0qyhPT6CztIpSmMFOMi74GkrDwFTWtiwOlhnwCAba9XHtm29x8vw5eFUXA+pGVSoo0bgQNS0upXERwAAGKa5fvILjT59Ea6qNmlXGXthjuyeibEmAre7wIbDivJht7O8u/hvFgMNgprnYkg6SzHuLAOKVLGJIRPGi9Vu8mC2UbZcL5U6UIVrfwfrcIuKVLaBLnvkpbMuRAIiCHEXTI0FXgnpzbBETr9tDrZSgESVob/ax9MNPiBYW0TJMTro1OiMuBPe6mBJzp9lAQF7v4xOI6y1klRoyS/RsbMMWK7BMUQhKJV7zqWtHNKoEvgjLqS5VQt3Ouou1FKjUpuC1zyDd2ES8cAu95RXsLS/DTk24Ka3tYrlHO4KjVNW1BgOr51Mcdg/XdvgMtGKGkSfTqfi6C0NBce1Nzo6p6F6JU8R9H9FgBburq/w9anCQMB1RAmutBkYmj6A23kK9PcboFK85DrNaRblVQ9l2MFYfYevmulOGVwLaozaOeA6e8NpooMzaNfJaJrh7+Td8+fEX6K/JNsyQ1lDNd9ZEsIRDrpTBTVW4Yt1Bx4PZmsbYs89juzaCQaXEgrIk9kiCieIMY3EDgIrT1BH0alUOfhnqylmrzaEVJ3clFlFSVgZEpRA9A0Px1XWD67BpIrD6gke5qQPsNLdERLErWzj2MQ4foTj+KPOW42/iQJsWOkmEuTsr+PHmn6jO2njOewwBibGxbpIBa3QEL5w9g9fmb+KTDz5E2O/wO2Qm5NJVRuDrmD9lgwh6eGs3NrHwyxzGCNl0tMF6JdIBU0mtocTomIJhI/YjjvtI0rXChpkWTONgUUvjsO6/gx/83FRCPzS/G1YdE802doNNdOOQdQxYCE19l3XJFPqA43mVnySq+8pQ/uI5sX97AY+mNcS4w68U2k1JbEmpnsXaVMdX6wpw4qao0WKnHksiSUW1VJJDSlRJw4d1mAqJfK6vpgTMdX6kE8Ri/pMkwy5yEclAdD1wAYT4/01MNSbhWGIAeLB9t29teWBkS0FDhlDL3U2sbm+wt77XcDFIfL6PvX4PLjUbjVRdT5YXUwidTddfRjmH4zNqIgoZIQCVS5I6P3PwtbYb5Ztlq8DpN3lsEc0LeSxqjuao8SjKk3FuHhPSndbxKBbXOsoBfdISU1RyhvirTjk1Agp0C/qcm89EZeDG27DxzWgFKjZRrKSE+fJnppJ/fY/pd1k4fI5EH8zRDkksTm2E6lb3Sp+DfmeLaBKtoaepBXLN4sonzgFkDy/i/EEQIUkT/A0AAP//5F3PayNlGH7mVyaTNEmbtrFNs902Krsiix5cvAj+AMGzBUFWvPmXrAdvghe96UFWVjy4wl7Fi8IqouvSgnWp26Tb1m3dbpO0mcn8kvf9vm/yNa1VWRDED0qhmZlMZ75fz/s+7/PYqax14EgdR8gcrmvgTL3tIBj0hxH8lGz8iqJOX9INVAdmATeK0EZRVmug19akMrU9qlSpXhxT9snXnB6AZWUOALol4ElUDqZWyOhNpoYoX4gYkMN74H9YCnxwEMCy0TvosYI21b5R5JyCGG6aE8JCJODhk3BHIjZq/gCe6SI88FnEijz5e50ug+X+/gHCXoi9jV343T7ubz/AoAtYAzGZ0k8ia/sUFrX5hUbaJlkOZg3M3w1j7GzcZSAcSmX6WH4Wa2wZFXRNjNHo+nCQM8AjAaNOiN3OFu6sb+FLFpoAZqddzNRqmKnPIVdpo9WJcfGFl9BonoPjenBzeTEINC/Uv2y0r3VtvPHmJXx+/Rr7zuv1srT5igt5vPvJR3jl0hLeuvIBfnzvQ3x75Qv0Wiu4MNNErTghol6xYIAw+DflZl5SYEyOeIcs1BHkTSyvbaD04lOYPLcgIh76DDXaDBF/qZ1t4NXXX8Pa5VWEpBHBsiYmPMuBH4fY29nFZ1ev4plnLyJfncwERU5reqYp+36yk+od4p3Lb2Plh584KBT0DngSFMyTBHlmt4zxOFT1ohYzF0PBKokj7u80WRwGPt8f0TNJAbg0RZN8BfOPNXF2cQHnLzyJ+YUFnGkuolAqcka4Hw7EptUyMVABNbnZMI+BsKPtf1Za/59r5YlxTM/NorO1zSVLVO9eP9NAo9FAu93KXOuTE4aDyjTqahSq/6kmNBYVJTk5dr7+V/Nv9JfRexjNbhMFj4ipAQuGpQhovHsFuOUyW/kV6zUMSh6iMY/r/31yEck5zGSj/p1ItlgqI+tq7jVGVPLUpp6Afyrpiux9nopML9kEhhR0nBxHbrGB3i+/okCB0TjMZBoNDazR1bwYTE3fabex/fUNPPL8cwiLLvaTgEEOBasFM0lUptMmktZdeiatn9dw2Oli7vE68qaLJBH1iLzuGmrCN+UD/nfDVvo6LDTgNOVpsVRmLZJrMK0dltRYGAwO+XfRdVAITUQdH93t37G/ug5s3YcdpHBSwSlm5XxdYkSCMRZ/lfZOpTTFNAUR7u3gt2++R3/lNrw+qf4b0uJsqOujrsWJfHJRSUIElSqMxjyi6RoGrofYdLKemUrB0gQqm6UEhi1mlJDdLIPReOipTe4RA5sYbjZcZxxOwcN4bRqVe3vot1rorrfR2dwkRUi2AMxxeRy4/I8IjG5K/T1lOE1CtGxSYYz61x9vZjocvxmDQEbiCbxRwIEYOnGqOQEQIyU8QExr0OYmustAP41hF/MoUEnRbB1edQKVWpXXDqM2hXJlDKXxCbhlsiMEgmIO3cl9eBOTcB1X3ESnh0/f/xh3lndYgI+GVxhrFoysKxjLvqz0DsBreZxY2Etd1J94GlG1hm4uh4A26ixhI40/WaMnEbo2hsiScimI2ntmoMASNF5b7BcoSECgsE/uNn4gLMoipR5uDJmhp4ypDHwxM0RYgSUngH/9+Idlxv3ZtfWWzdXGkM3q5Ap4EPbx3dptNGcamC1MYMqwUZTuFHRMdW4OLy8t4eatW/jq+jW2aaU+R8KtfN/sWCUYJ2SDSrhn9cZNNM8/Cq/iwbByIqEmx34GuI1hjTphhuihFOdPfza2kKFDySuIZFXfh1MUwuX6mmLbhizTNWAmw/OjeASrqP9BMol57TCsI9hF6Z+ppoT99Hdty9LqjGIuQTv1SzcTWRfJVXWswFMS95CYtxQe1MsEsqy4+m5ZA64+y9gE5FhCNpo+WACwXCgjdwITQwf//7SkJcmEeSlu24OfBJxMpKAPu8GZBtvviSVWWMzT3laAamIuitp7xQDnxJcjRQHj5AhTQq3b9LwY8Jrp0FnOFIBXJaeVGr9qLDgvM/SmxLs059J1bXJVk9+le/pz/ktm0ek9qAS2AuYCTAdZcplZAPT8iXnEAF98Tpl/2q8rcJ7R9LWkNp3Hx3H5iihFoKAQXZvBu9QXEoL7pIcgdFm4lILuP6FENp0fCW0jdlqRzAWO6pmISB+Hgqj0jELgDwAAAP//7F1JbxxFFP56mX3G47EdL+PEwXEIYB+CBJGxxMGKWK6cOHEg9/wMkJDgzg8AcUBEgHL0hVhCQIhiBMgRSxbbOFg2Hm+zT3cXeu9V9dTYA0EoBw70wWN56anprq5673vf+z7foEj05oSocELldImN1LcAv6tEbWgGFFyxoFOciBPCoE4EVvYh4nRB7NMYIzdWos9AgO7DOPH/1sNm3jeTzsQU/0gLXfFNCCLdY5ER2owTMSvAeCgyCkWoEgkskBdjRB7lioWuCHmnXuuQ7FyICdEIoeodBPsNHNRaaOweoXPQQL1yhMrWHtqNNhrVNoI6ELVkIfZCB+lAxsjVMjd2lxKEVX8OW6eC0UjDAmCEXLxta0r8M23iPazOQPH5NBdGn8u6br0UN6Vdq4FGyHOAGQlH6y38ur4B39+An00i98UtPLl0A/OXX8bC4iJmZqZRLJYQ23k4bo8UXj/0mwYR+goLiy8yE+Crb74VGplFh9+rNZHzgHfefRvvf/gRnr16BdMvXMLnb72H3fvf4/mxGUzmR8SRgseu4Q9ajPW8JfVPFrBxQ/xeO8RBUuGlVy8jNzqCWAr+b7jISgcgb1x5E9c/uYbbK7cEp6bkIVTM0qB/Xb6xjJ/v/IT5hXkOY7xE6hGhwrHDkchzZWUFn137FKrZxumBU0xRTbIVkU6/QwijRAeFRmCT/XTbkQ5+RVRlZLKMobFRzMxdwOS5s5h5ZhZjZ09jYqqMTC6LVCoRiwORKj+1iCRTvk6GErGPupmPqofU3DuX7BDm/57//9Zh5iC5AIyXJ7CWvIOo1WQRLD+rMDc3h82N37iPzePu9S4KzUefTZ+f8KjrciGbvEADZo6Y3l3eVPUpfP3X/abIo6aNHawpLerX8T20Ukm0kimm4EcDA3AGB+FQZTCb49+3EwodrQbuJMDVL66IehJwHCMWWl3VJlNy9Iu4ANA+GMUq40TcSSIk9tF4CanGFNu+1fYrKLi6j1kz3QyAltALTo4UhEOFypc3USoNY2h+DjWytoscToIogXG1HS2tZ5TINEgwMAJ27q5hr1rBudnzSFB/ayLD+iYkQNZSkXZseHxHvx5n+74c22L0L+zAUVYSY2slE6P3PIaqSZ8zTUKvm7vY/+UhmlsVYL8Kh5gVjiTXkQ8GN5nqrfdH3xHFfw6I6FyOQiHsIL1bRfvHuzi8vYrCUYv3GVcZs0hJgk3rB3SCTIl6lYL4kWG442cQDI0hIntIT2zwTL+l2JQGoi6dLXD1lO5bPPeVQGpcJ1AqNtei92tSnJVLMSvFy2SQK5eRnHkKhw+30Vy7h9bmfbRbddSDADnfRbMdcGsNuWwQMJBREYfrSe0y0W0H6HUvsq+z/fPI+urY67Yy14UYK1IlVR3F1y1DQXstQlTbwfb6loBnvlSwBwlEzmcxXBpEIZ9CoZTj9sFToyVMTZZx6bmLKCYLWPp4Cdc/WIrxd2IamCgmtDrXeUxRd/jt0EHDzaDw9EV40+dxlEiz8B/ZGsatfszQMUkYJH5LJDgoV56w1WLRLv2cs/6UFg1loJ2Cf7J1PGyyxTCti0bZndtMLQFpe+4q63s5b1cUWEWm/dRqidHA4l+DA93v/0niZQvNmRM4Tu+JhNotnKSwTeBbCmsHe/j63irGsllkBsaRpQiHqoUUe3suJmYv4JXXX8OD1e+w82CNt4NQyZwTu0RddTWtK3/U8cPyTeQnBjBUmORKudyT3s/AbcQQsTWuYKcerwaA43QVNeh1KD+AYj6P7UP0XcviZEgJKGw0Zgy92z5Y8NOAANZ4OUH1hJbfA372OSiGpFYArsxaDBJT+KSCFiVwLHjtOlpoXCrOdK9DhTg36h1bN29jxpUvugSGfQ0zD0m0jpI+r4Az5SdQTBf5eQeM448l4PgvtCwiKxuhp7pyUEG1XuM1lOX/Ipmz7IgQtGQdVkJbNj3rXHnvBH0ZZuxgwILVItouVXcwW50EEVOZpOSSULH1nVHBFyDg5DMMy51OOR7fA7snn8XxWMtBdOI6gbaqDyNmFNBaQ/309EpxOV1/j0FjYQDSODgJJ1BGJ/pGPNbu0e/qefQyiAzbgMAQqeoTaE6FcT+m/0tbCwEcpFMjOQIVfLpi/QSOi5tffK9oXOSIpwEF13PxJwAAAP//7F1bbxtFFP724l3vOnGaOLGdGoXSQhMQ5QGpfUAqIFTxQFF/Aoj+IB6pxDv/gAJvgJAITWiDIiRQhWiTQtpUbWInvuza3hl0zszsJXFLpb7wwESRI8u7Wc/O7Mw557u4HCwz132MKO4hCMLUB1z55RcnxjAapDeGvjjZxxjlRc5g2IoCYLJclFE1gyRDEiixPjNBDXeCJ4SbbWkUJ8QudI7529a6BIYqYMT9BtGgkPUhDrQfKDhOLxqoTBknAhTEw5UO4k6ffaydmKV1mW8ddwcQB30M230MeiN0H7fRfbiP9s4jOLFE7zH50gNJrDcmWuBG2Xq4DB0lnjrZq3B/6XEoNUWqoD04KTjVIiM9qXg2gheZzLfTAKbyEn0yF1g/qTna554Rca6N4VikQR/1ZJey9QdDtLuP8Pfut/hh9WesfPkVrlz5EBfffQdnX1mGH4ZqQNt2WkUwUTZP+NyznRZ71y/h46ufYP3GuuZ8KjVwc6nDROKntTVsrq3ijYvvY+a9t/DRyue4+elnuPXNKnaHXZxptFD1g1QdmThqZPfn6o03kSBJ/f/XOzvwlpp49fybaSiCp/SJSLK1s9Fo4PLlD7C5saH7leQRx1phuoR7W1v4+vp1XLhwngOrJBkWLP0mtePLvo29dgdd8t0fCU40UaeojYJ6iBHlhhEpY4loGKHk+SiHAdxgCs1GHYutFpZXltFqtTiwm5+fQ+3kAkrT5L9fZpoEiVySBgA7KJAPL1vOEKRWq82yOdGIbeYmBRFHKSRpwsokmAxM/H9IwH+qlcshFpuLLPC01/kLQ0r4lBxUazOs+XB3608FgWedB/Gvi/7T0CAireflxsUE3v6TmtDVJWlpTj9VnVxlq0oJUFIpd2ZnIcMK/BNVuJUACfH7gwB92uwTbJMOIqVl34XtWRoeDOTdA+SE/EYqLJq7bubap7B6FaQkjhIcFeQxTtzoahlTi3MIzryI9q02fMtFKRkf8zCnpynXkUmoE8ACbGx9/x3OvnwS9fos2q6Lw3gAzy2rJyclHeiaRxK+XWK6A/Gwx/td3L6xgZdeP4fKwhzKBJ8ncTXLyoK7IxtXoQMSkYO8m/maT9w9i5bAszQ738dSpOeVGg4JvfZTUp7WwbDkw4kkOls76P2+C/mwA3tElAoHAd1X7bZjab0GQynghJTe4NDGPRAJKnKMapxg/Nsf2P1xHVOdQ4S0mRdG4T9JU+eWuUhLWcjFpJGzUIPXWkI8M4vI8Vg4j/8nIa3oh7nQiTaEl/CmypxcojWLaIAOCc4JzQHW407RpLT4E80zGsuS9IEC1gYiGPvUQh3Tp15Aef81dO9tY397CwcHXcAawB8LpRdAgRYjAaROEkvWpOACgzRjvHjf09e8smI66Ivz04YuAGhMD611HOgkqrhDa5Gvg2CH98sJrF4bkdXGfXsH9/U2xfzS3rw2pz/bJa0AopCOlKicRi8MNV9Yamu9/PqSsE+Qj6Raw4nTK0hqDfQp8NsuKQAAIABJREFUSDck9JTgqMI9tu30tBOQb7NrBlUEhVScb0UvSNjaT2qnBbZLLnnwymX4YQWxc4DRIMKYaE4UhIyzZwb3Vy4pZhAWBUFGKL0nRgvZSs3btrJAXeQ+ebwdOVsauGd39GiQkG/5hFa+WRoJIFhPQnGOD13g5vY2TtUXuehQ1dRGC0pU0QtDvH3pEu7+soEvrl1DEinraZkG/yK1rKVnLBW67mzeRuvcacwvNWFXVGrHTkXuhEKXJGpXGg+VNpXp2ywl9RwtRUCpa6RvMoNpNKfreFB6gEhSZdRiOzozDViJPdV7zFClxp2s4ABRoDaJNClE4tncD4xWmcQzn3C8DmKNEDoFjnlXAlb4p2qvYxfOkyRZggJ5jrgel1LTzxztN2/iMHa9oGCUYjHpoTXfxFw4w9X/vArQ8wT/plnaXJXOuHfYRm/YZ7YNvUN2eZQwJfFuCoo5eUfXLDIRQ1Nxp7iRg1mhkjTK3r3E1XB2IxHZfCB6gOcVkQxcvddoM2iYvGDL+VJ67xONGKfgml7pGWeSCUbHjvua5dkEF4gZucFVeZotar9vKB5uEPL7rC+nk9tENTHxqeHj073ICx2maA6z9mvnJTqetQiIXkLixXGMarXK99Qca1AIppljTPWfGr2qpEbx2UExMiMd6BosC/8Qdi29bVRh9Nx7x+OxnTSvNnFakqaltKoodFGJwgbKAgGtEAgECxaskPgb/BsEawQrRFdQuqARKqq6oI9EITSp4zapHb/mXvQ97thxVSXSjZyJPTOe+/oe5zvHXf7m3W85QqS11Qy/ZzhUriQXQeEFgRnB+/1ewehIN081PrLhSSSplNiRuvycP+cV8uB1oNI5pZbDSaZFa2tiB0T4PzRqYTXywyRmtPV7jbwSPDTWnrJhAIacjE4Ukgwi2E2fa5QS9k4lOpLA9oG0b1Bqe9gnfexvNNFff4rG7XVs37qP5u0NNFb/xdbqOrZub6L14Bmw4xGaHmkHKA8koFnWWliaWpShKLE+NBHhDJAYyVA7jhIJIt14KV1n+WJdK5yJdBojUNXgmDjF8u9UBOOMBF5shAWqeROX3ZiXdyPHzFgrggbUp0auaYszDWFcFND23T427q/h5m+/49YfN3kCVaoZZmammSGbnew8BnF0TS5YlzXaB4OFY3X8ev06Hj3aknomNvNZSRtRASGt1HDl/Q+ln2amcPztt7B07iXcuLOKvcYOKnQ9qodh5lSL/XYLnurwyZjudfFPawe/bN3D8juXcfmja/KAVXv+Rc3YUU4/gzMrK/j5x5+wS3rLeZ/rknSJ5Pdvbz/G1WvXMD07x/VVDCXSvjNalyk8z1EMx0QzIS5TbNx/98P3zLBcC6JL3Ol1sdt+ht1OBy3il6hVMbs4j7MXzuPiG5fw3sdX8cHnn+CLr7/Ch19+hiufXsWFNy+hfvokJupzcLUKaVCylGRgmKREhiOZj43MpHoPpoiehwPNFuPDFuPCqj5zHJvGmKKTzSEtHPaGSBbxwnbwZ/xdUVAqtsNMCj/2eTN2ZPx5+LHzj7dDr6dOTNHGrvD8dzw4UO3I/B5tz39KR51GnpuNBh79t8nQSJIZK9OcnZrE3b/vqNa2sNqake+HscCPNcUsVvi0SKMWwpUGwzWrWHfkiYUIbTMCQ4tmUZTdk/2CxmuGvs3QI93yShWdIxPIF+aB4wvwS4vA0hLMiRMI80cxmJ4GiKxsooacIvK015BjXjJcU8mSPE5IqQwjhCwH6viOyBlNSwy3ZzgwLcROnDHDsoBy3KaJ+E5UV1zNYCoZSrTWHcm4ZImRYwyrC+i1uxg0d1EmFRZ9clF1IxhxzkpFUDZnwtjdxw2cP3sOrWSAfhIY2i9RUS9s2uSgsMKBRPl9m7TvPZ483uZge0YM7onsm1Gth5y1oql8bcCwb0bb6LE4/+OcZ91uHZlBvYhghq8j47SgwDxnEFmFwotmvdH5xBLCRrkUCFlIhijVoLsM064G1+ii+ddDtO9swOx0UR4kKAUj35uMQYV6MlGUE5I3x/u2SutagwqR/vkcR3ttuPsPsXfjT+T31jHFzrIGX4pyuuEKFvRvUrhpugT27HmEpRXkU1PopglyVocgW8Kpmk9X0+WBX08uL2DxzAqSagXt3oDJuxDkyTJ/hCINgnocPMyC5g+15pOCSv0SEGoZBkdmkC4uY/Lky0iJgyDN0MsFNkqkdz0f2C0n9vv9END2OfaZ3TnweXJFa+ba5yybO7Ywx3VSXtuR1cLAFdiYXFj6jdN5LczuifJlJNGG4SZ7C1/JK/RcEnMYtEhvH8z+neui58MwweA1sBYRJQSrpudHXBADW8VTW8Ps65eQvfoanlYn0KZ4RMnwvVBGLyBmwDToQB1dtlxmQZwfLivxjfjCFioV8RsKplC/D2hMZWWUp2qozU0jlBM4UgwhJ81oFo8zjiUOlDoju6FV2Dg7m0F3yKBlQibu+zq7rNUSAd3/jdWghfSDdcLGPfp/TqiY0RVfqY7McNeJiKYQjykJGKKUpCZlrJdGNl7OpVMWrZzIoLuo1+exnFImWDKGTrlWsjTF0WOzWNtYx+aDNYYAOF01Yr/xWm5lTBDAtdHYwalXziCbrfGzd0H9Z71HekaJS5noc25yFvVaXUdbwXhR2BbPrU9aqnKw5KiILopdw582bG+TTczqUeUEjZ0n2Gu10SGC6wRc80wnK5dTuZ6J0nxOJdeK1FKxyxpdc4rEo86kXFFBghBxRd9KmZH2qdE9yBgtN4qlqlAH17JzS3YsrZG5BnKDKjWlRFre72tCTQjOR8kBhcAyL0pWOANMPGfMjRKEkJd9Jo9kkODiqQs4PXMSE7aizCEaZD3UgjEHnseBvyPyhfe5DGt7m1h9cBdtdEF5JlbtUii/BMYMyiTRS4TvajeTkysIbUEzkDY+3XdgsjpV5FKSYasGR1B5u9z7IQJBUa6xfHxYj++K+6U+lzILo7X5Q6L6aB8PieuF8F5sNh3PPiCrZKp2JwFq2jPpfrlMV8kmxU8byuXTXC+Q82MBPWUAklImOi+dS3nwSIKSfJtutyME9FzDT5x15JgJApjGCH3PGMzgMac3TGOHbQXl2OOjHJ2UYIt1Dv8DAAD//5xd328UVRT+7t2dndlf3W7bXVqoVBAQH4A3gw9o0CgGEw1BE/XFJx/8L/zD5FUSAxhFBUlDqdhsgU1/0f01Oz/MOefemdulheIkG7LLznbmzp0753znO99XOP/dez+ygrOp9Gc0hYI2qG3CAIA2YhRWrT91SyfO5nmWTiGIDSFYhMjExg9RG2SqaPwxrde+TdxdAGDS0oD7QjIBljSjfsC0DrhiC9r0B4pPvwmo6MLEQIno+YME/m6C6MkuBv9sYOPvDp7+9RiPby9j434HO8tPEK33kXZHwHYEb5DCHyuUIsX7ezGp/CuuaFhEnl/Ga7Wg0tzP54AkXMFF5fOBdL8Hh4Cr7E2rpLpl02f9kpcLBMBZ4pAdgyvbZSllMkmoXSpQHlfZqR+s0+ng1zt3sLqygna7jZmpBkrluswTJX1+KXJKvSCTRbaXmZluYjgY4MZPNyQcY7ZIiasxFHRQb8vO7g4+/ORT1JozEsz7HoKlBVz4+CPcu30Hj1ZXMOoPkBAtVIuAT9zvoTfYRbe/hVvrq/g92cVnP3yPxdOnjez/ITYnm6rNNPF0bQ03b/7Mc9iGRzzPlMLm5hbePn0G5y+c5wU8G689Vy8bTSehMglCnKBWq+GXW7ew/GAZtZKPSrWK1uJRnDx7Bu9+8D4uX72Ca99+g8+/vIbrX3+FK19cxcXLl3CW1MEXWggaVVZDjrWIltlgKOsNdu4DZen/Lxzn/phIDmaoiXk4uR0OMf7/uPLhtskH2KseZy8mzi8/wld55b7u33vdbxx0fPt9ytRzLQv+cDRAd30d414Pvqe497cxVYMKIzzudAwAACPg9CIAkAm5WTQvO9GMwpNBB3bNU85oCQBAQW1Rgm6qMCqFAf1LtLZyGTHZETXawMwcNCX98214x48BR9vQC21E5MnenGVrv7hSQVT2EQc+YkrSS9ICJLG3AABWCDTVJvnh9yqjxKqCBQPl+aC0kySRWCD9HrldUCJRLqFUqyOYbaI4VeHPiE0RhZEJQIrwqUfv6RaCMSlry/rMK7OpOBUMBykLm1JguLnDNp0Lp5bY0i4cU8FVGe2BRCq7RgCW9gkIqDbV2HA4xNbmNicftXKVA/bEESDMEgN1uPtOjil1WDzpnv9z2T2TVFcbJhcm1js7WRIzrsk4RbMyjYoKkGwM0HvUxbM/VpGsbUJvhwiSIle3daqyREdZxxfp3TBey4Lnkq2Tr0lEL8F0GAEPV9D/7U+M7j9Ek57tdg6aMYgN6KZMgkvrOdXsnlMwu3gM4ZsnMG63MKZknNsOxE9Gsf1+LEg9K9oPGWCdf+ct1I7Motpo8KvfH2EcDjMdHmU84+0tkxpwhLURqGeTEloCSKhSrYsYF8mGr8QAbjDdRGO+jdbJEwiOzqNQr2NUKqGnFHbiBM9J6JjVbuS8EvZtZzM8Hu9Y5ZW42NbZrY2kNndrmq+YORic5gCiKdUrEWzKqvTKAD5WQ8T+MO+bGreCVJwzbKIrlHn5u5GJ1CzcmrVimMINNTps0km1FrF48RJ25+bQJZaap1nAl9yOYJ9zDA5xfQRJoFivQPkFBveGScjxQWxA8D5VzWj+lIuEQAHlAoKZOiqzU/w+aNThTQWot6bRaDVRDIrwqj4D6TGx6Mg2NzUJn2Fc8DXmopUZR22Tw5RbDIx8iJ0ADi3TjIYBUvMtkUKErVdoEeBlPMDu58S3e29i7V5MsbxL9wpH0vobekT1V3wufkHjxJEWppQv8aPo/HKcXm3Wec18cPcetrsb5v5W2VxKDKivjf/4Dol1egpvnDqOYkB5hOaxYADQJvQEliQaQaGEhdkjhnOYz7iXbZMMw/z89yZQyjJQlYh2D8ZjrG88w0CHwoikaiwlgEoqVCpN92FcYJ8n66saPPeJq2zCqnNr84J5LtvKLEwOI+LjouDOOgqx5ELsXmFAJM5hHM0p16VA1hcweEUiqVRIoiSSRRtpHRhGWJw9hnNL5zAfzDEDgDucVAK7Mh6u9WQyzlKwDGTae4gIK9013P33AXoYIlEhOwGw2GTW9y9VxdRRIOLef6rkGz25cBRmNn8wbQyi5SaWiEgtA1zArRTJgfHtQecx+ZJquwjeu+fK65fzk/xdqzcgVee8kXCCoT75fj+6v7y3ybl9b49PPrds/Pz6CxuBc2q6zqZdkceKQYZcm4KO0woA0sYOCcx84H4uAMB/AAAA///kXUFvG0UYfbPjXa8dJ47j2HFS2hKJtkq5FAQc6AEh0aCKwAEJoR77T/g7wKX8hV44UJWqBQQEibaqalqaOI0Te23v7qDv+2Z2126KRa+4ipq27mbXOzsz733ve09fun75K3sJGXCWHgRh4TP2wl4oV7OZPQFPjrrgD8BmGpOJRNyxKYX0GjtjBuPk7KlIYbSns4tzbQAnDTbYhVTkCyZ7b9EY0Mz+4oEDYfjYxIRirTSbrlWOU0S7T/Hkh9/w948P0b19H9279/Hsl8eIugMk+xOAIpiHBpoYNDJgUja+x0Y3qDnAOzPEUjnIt+sw3yStcgBeBP/Z9Son8JPlU9nuOQnBMlzhyJlTbSu2JTg+12NuX9lNqDD3jkFzBQKcQEoIOJd2Bvq9ogOOWKIKAB2n3z/G/T928f3Nm6iGNbTXO6gsLSHmeMU4I3XcMVOWWAl72Wmv4bsbN3Bw0LPyQJGkTBIO8+IN7rmti7j03ruYjCbQYSCrfKWMC1c+wP6gh7t3bqPX2+claXR0CBWNcdw/wIO9R7j1+E8MN0/jk+vXUSctojphLM2b60yCRqOBb779GsdRZGWnShha7keKeaLd3v6YZflqxghmlgDIsZOtCHk+V0GJQKHP5eqnO/jw6jZ2vvwcO9e+wPZnO3j/ykfYeuctvHZuE0vtVe5zYs8N388niMI4+/dpbw7AnJkMX7yOVzvuf3vXq7/+rwRAtr984VwEnJJa6ykZAR4dQpPzbjxg6WOntYpu9y886x8LPFUS7+gOZAqV/5edUfadmSYgVbYV0zZK0mM5bqIDjlWLyQio1YZqtmDaa/wVn9pAsr6GdKONtNOCaVGlv46oVkVSoQx/n13fKRuNcspjLWCdgJnmTGFZS8TURwgAZTPBeTNM5jw2dogqMFJZlvd5turGlTfqHaZjBx5MJUC4XMNCcwW11RWESzWUymWu9o2jERKSb/o+R3GagyGSowg+gcR0wmCDXoHJqyNGudQEIqAVensHvNmpLTcwCsi/QCNWMQMOkYy6cq6seVzpMNKKhGiMweER1ChGNQjh+SJZ9ez654B78e4V6zbFtUjZdTOf/+16ak8he0/B+Crjg2YGXr6JFDBKIEGnJYRpGcFAY/RoH4e/Pka02wW6z+GPKUs+sEDCIm5HcHsW8GgLOLT8QO1TLKOHCsX9TVIs7R0iunUP0U+7aKaUcZ7wuTgTwrx6I+ulqCNSHCFF1Kyj+uYWBp11TFYamAQexmQg6draaC9C1RjNDaNkOY1yq46VzQ34y1UkgeaqM1UXKR7TRENokp8aiVnTkkEmz0SqclWcMVPPrqdkXScURh42SehjVPWRNBahN9oIz55C+PoZqNUG4gXKwS8hGsXo06ZYhRilZESoWFpPbQZjzthPuDo7cV4A9obJ5yGA0qhch5RTecWnOyewswqYXEB2jCnCqEgQTh1B+sZzYiK/N0oi2lkpMDQponAR7bcvo/LGBTwlgrsSMlEi6h7kvZYk9aexQckCtTJ01RcZN/0cMlCDyPCNrzAimWe9jOrqIirNGmrtOkr1EGkARF6MgRoi9g1inSIpM+MGfzFAubnAx1WBluhlZX2vtBKFihGFi+xtpPDOgN3knys/k5793k5JsMV6z6oslDb2/7tefmSkvefuUWFdLlbyHMFS/HPW6uNWA5JPE+lExCiZpA4HPJ7PtFvohE2EpJFIBRDyWPHBMZbP9/dw7/YdIecY0FtfqmxeUJZWM3i29wTNVh1rax0Y3+Noy9T6UnEVkkiemKJjgbOd0/BpDwTNe6p5TgAvJQBUPkmxcsoWoahtR6sSSpUA+/0e9gbPocuacQNHpkGMHgX/pnbWLNpuO8Ilo0/mnKHKkEfxHB1Yd0pmVg1Yf7KSNfYTUKcyAqBYfOV4PBtbOJt25l4Mpa1JaWwLrlQ1Llmiw6eHZQRc3NzC+fXzWECV76XnFF4ZRTPnCk8E/8i0VaSu7o37+PnB73h40IUh+b9KeO3NVQPG9YhZ6btrV0hRDsqs5OYEDzuOE5uoQEVf/nv7lVXSPSdzm34+5pEZzujPffH9oJYATrATb4bidc+S4HL/xDeA/onmG/YxKJUyP5Ac3BeTQ2ZxgiMGCtX5qefcqtVIYWDHBiv0vRK3NLjxIwSAJUsYP0/v493YorYEJlBYVWQTDQD8AwAA///sXVtv3EQYPePxZb2XbK6bNIQsbalQkYCHVCJcKvGKeOEifgF/hN/UP4HU8pIWIqoWSJci2iRN22zirNf2GH3fzNjjbUJ55IGVNptEu97xeDwz3znnO5/c+u7m92TQwdIYqdHYVitikwMrK7ClDbRUwwR2xi2RarXPnFWFaOiOCXlCIxMDz6JZtl48N6QuyWCREjcYobb5VVUBZcwG9YUi5MgteQBeq437f6FNXcjwgsruBEogzjyc7u1jf+d3jH64i4OdEZ4/eIqXe8+Rv5hCngFtchMuBQvugyrAbiKqzTDJ3U69+iiNbMp9V+MTFyVRV4u1Reqavt2e/XYhHNm5V03MFYNrg2DLDHtGnqRX86odsjqmV4klucIyLdKqrNhhn+VGCqcvjnH7zm2c5TnWNzewuLKgJzSrtOCmqkoKR5vZTruNezs72P15lzuFAAOl6gWT8oWo6sTXX30JP4xYzsurI8l851oYbt9AN5C4c/dHjB6PmKFJkjHGxQS/HT/BHyLFtS8+x2fffoPAGN299tG4IFqGtby4iFu3buEJOTVblLTqfQ+HB4f45OanGA6H+ub7BwDAuTH4Z5pOWVFz6dIatrc/wtaHW/jgxhY237mG+dVVliaWJEU11z/PtcOokLW12r8P/s9rx8wwu7CP/gcA8B8GANzvd2efaZZWpbBOT8YYPXzA1SNIBUAlUck0dWl5gJ/u/aKZTmFZP3O8194z9fh2AxlhBIW5oJxdiVQGSAmwnesB/T6CwQr81TW0SNK/ugpvMIBaGaBY6iOb7yDvxci6EdJIYkKBPgX3dP8bB38VepzrT0yHBQCsnwyMoQ0zg9Iz6gObAuaklXnSpPyIxpzIxydZNvkPtHx47QjRYo99B2S3jbDd0lJGUjAkCdKzM6Qq500sMdvjgyPI9AySNnheaeq8y4odsf1E8CyXYBIejg6fYX5+AeHiEqai4Coewsy3NvmkNMODUpFQ6pra7BlCVWdOEkzGY3TiFq/d9tJUCiwngBcXrD/lzHXkK2ucpev1SW8yZ1c4YdgPNj5zgn/m2JXPYHuUBSifTTDeO8DJw79QHpwAzxL0wi7xUAg5h7ZoBP82FUIDNQZFoT6VupRcR0r0sxwrpxkm9+5juvsruskEYaE34Tajwi1l6ZlAk75hKoGjwEd0/TrKy5dx3J/DlAJrApgsI8iMPbFoOZe35KL6IsP8cA0Lm5fg9WNkQiElY+E4ZHIjnVIeecIpML5Z0xg7yFW9CTAMet3fJRvQUXhcELDMUu0COZVOiyPklOvZaaFsx4iXlzHYvIzFN97E0vAKgv4y0iDEy1Ih8SROSl0hg4KvrBQcDOemA5TJB4cLDBkiopyZY+w6ZykfO7+adF1zn7+6FzoPAIAhQCrZv/O0+0h2yobEMSTm3n4XK1sf47g3h7HvY8LBsbLSSjYWK814KKR+xv02B+kEYpKnDf2P8xojj9n+heEA4UIbXjfgAD9FhiRPcEaRUShwOh1D+QrJ9JRZfxHRZwWiXoSoE6NPHhHdmI2RZRww203AAm2EQipNSNdPM0P6nvXK2n9E1GfOY/mcvwn4KY36RwMKnpmjmhtOYRQctqMrls++aWbergAArpZAyiZ9XCrTnGcpp4VtrK+iT+JtCjaEzvKnlIlOr8P35uNHj7D/6E8exzrVxHHANwOFvLSmE4UsHePK1bcQ9NoofK1GYQKLcq5JiVnouW9zsIG2H2tfgVK9SsDPPC5WAJjgrxHGqgr0i2UbMpbYezpiZZgyacPKBNQwqalcTcKclzAGfc01UFWB3/mPZvDpPtVMyTf31ZrWFabEX+P4Tt42k4WyblOtDNAkqE2xyszvnEtOQd9kCjUpsD6/hvevvodBa5n3y3QthBkXzJ6/xsTp4uAf1SxGgOP+5AV2R/fxNDnUQKbSZfhY2l6tNgZwLE2aqqnSYUEQXZlNViZ+oVG4aQBcP3k+U7XZHTznXnBL0pZ1P7rXz1WIW9DMEtKzlemqV6cvONffTF4UB1GKmt1f2BjWbY89JhPlZkxYcIjO1x1vTfDBKt81KaDT4XTfEEBHcbFODdFKet0G+kR9HrYNpLbnWNt4UPAMRb9LD38DAAD//7Rda3MTZRR+3r2mTdJNI4GWFspYxI/oDIof1F8hn/WnyN/B/+EHkctwHT8JRYaKtmDpJckmu85zznl3NzUFccYwGeg0Sbfsu++e85znEl7+9ur3UaR0laOjYYVSCVWMLpTTWufsHUcD5+lkhRRGaPzAxBwdRa8fqCMwkQueZB58pXGP6ixVvlYAAcvfb1ImJEaiAQwQAfGICDUvMMpZ7UoWiEGDIMLDCcI8QKeMEezleP1oC9s/PsSLm4/x4tHvONweIRlNkXJzYsNvTtaahV2juKF5F1TShBqmRUDjoNLrWyMxkfJItxMjCWNNBMoiEGpoUOubTmohvFovTsKKpim0MGsEJ7Yhe/1QYZsfjXw0/gpCWfW0QD5pBDeR9zgRl0nEiEzFVE/jy1ZnzAFXSQhqml9EdJUIYxmIccbte3fx4o+XuHhxE71sSYohZ4CBd9a2xSFIcBJF+OHGDYtEKQSlrImCwOtXO/jm2jVkgxXZtF1Fp9AiYHD1Mj754gqePN/CrXt38fLgFX472MXW5C+Mzizju+vXkZ1fRxSesLEdA1b8DUO3KGqq9Ob94P593Pz51ozBYuF0PQ5HI6ytnsWXX3+lKGdwfFPEiQCAj3rh53S6HaScivIacuqR4WxD8LcJ1e804Qc39w/mUJvmSQBOnvgff5TveP67R/Eer/0vj+MAwPse9f8NAGDO2QJQaambRk/6aM5ry3ceHxoNni/wBaVmJJYDnj19gnLCgq+UJoMFYNbvC8C2tfVM1sdkanrfUP1ZZhrCf/yCzapUorYxVnMXDElJpjlOry+T/mh9DeG5VYQbawjXVuFWzmDUW0aeZci7XeSdFkZpgDwNMJUasZS/YVJW0Q4GqnUuzLOAaL2aCinIITdc8a8JBTAMzFxFnNpDm7L4bHBDzvzXAfcqviQmyyhButRG0l/C4qkekl4XUbeNgp8XhdV+RgBveHCgjAEa2lHGwLSC7ZdIGJ3LKYycjxBltXs0AFayJlj4DcfY3dnF6vl1LHTaGNM4KIrUyReumoaQcaQTD1iUWyh7ME3zhvuH2Nv9U1lpsSaV0MNAIn0pIxjnNvWaDwbA+Ymlb/bNVK7JWLPz7Ju1SttozazE1PF3dco3S5EiOioRvclRbO9j/5dtuO0DuL0xWjmd7SNTkLA4nqAKF7eGieuTT3oS8dxoxFEo3kJJMUWW5zL5x6NfsfPTHST7B0hYTDo/pVTNrcz6Su91oMdP3f0ePYvObQAfbeJwcBqjbAnDWP0iKndeZ5U3C2ZxXs6FLn5qcx2ds8s4cjnGnKyGJaJWjLSdIk60sXKJiMpaAAAgAElEQVSF0m8FGOH5IuBjEz+Z2vjryxW1/4KwFqyYdbFe9aXJaPgbUFDLeCgOPBZSlL0MyblVZB9/iGzzApK108jbizgKAgzHjMPlxFo1rhOT2lGKQzfrwKY/RjCZIVDP2yv9AMTNXvlv2f/qT5AWw87LzPQf9QfSADSPW8h7Kxh8+jmm5y9gh+AlL+OFWKxqpV6OFAAYT8cy+afpH7XeSAJp3POgkMShSeIQ9xbQGmRon1lG3nKYxqV8Ly9zAQA47WedRoqysAlKY3qI7mOq0WJuqtGf3I/aCVr9DtqnMqS9RcSMvlukXwQQpzEi+kaYASHXKtc0TzXlBLqenZxvLvw0idRMURgtoVAtZQ+yp5iksYYL7N4vtdlU9rZC/A9qCoHOcNzsf7urvy7hMTmVYolkymm6SZ6PsNxZwkZ3gI7TNKPQnNwJSPU/6KMYjfDw5h2JcKB0UaRIrpw576nQ1gtMDvelwTx9YRVBKxXmF0SSZg2nFKcOg94A/cVlrTPfyjTz4PTJEka/Ar1niTM/K/YAojdn5ntAZ/rXUvNGErGWqzeBedmwqYwlNjaWKSmO/bypxdLVtf/s8RaWaOYfzUlvkwqudP94ZtLvpdJNxoAHDiS73unn++/RF8TLBNg88rVkozLWOfB9E7etfAI3KbBQJPjs0hVcWrmIruuKb0M9GCxnkg3edg70wIzj15joe6DwDYZ4sPUYT3ef48gNEabqZK+Ja5G9D1U940xu4u9NmqGvfZvvJaXxtcK8NMN2XzvNxG/PAQB8/eMHBM1zMm8deRCA61hZFw3AwIA37T0D0eTzdfIei7jlvylvFz2+BxcaxyNO/tJ0qzkgr2GuBb9+CQI04+pnwAxKIxaEUlFdD1WCgSGy/lg9oND8HNYCso5tjTYTCJxz+Ju3q+1ppIrCz533odMXWkoXVheTVTfGxLjZSLIxxL9g+BMbf6N+8MsSvxhcE+MqJAIuBpdQoBTaTufFnHPPnZkWEPzgljQFOn2ZmXvvnPOc5zyPvf7iK2YAUBLOJ8V2CpqF8X3niaG0RREtHEocAPRiNIdcQKOYTIkwQkbSw8GBiVGvzDVVlUasUTy8qW/CbMe2CqIlQI9GRLD4aFmYCHGibXl/iPp/lcI6m6D/+gB/bL3CwQ+vER+OkY+AyFFwE4edACyh95eXQ7M/4lsrlZCUE25tN5VTBYPkn9gSSFeSSGiKEu8wchA1GqgFAU80OoZG0IT3sQiy7gjxC7sPhUmmxbUuswwTer0XYESLLw2mMIAKAtSXuqh1Oog6HX6s95bReLAMJ4rY9oYEhEZZijFZy+UaNbwiFJLCt5lg0QhEzS+6wohQmkI7iWPs7uzg+O8jPH32FM1miy8itu0i5bFSQVSVwkqvh62XL3Gwv19UQ1CplJEab6fbwfrzLzEm4QvXGLUojWarHMHyIj7f2OBxsPXzNo6mFzhxMzzeeI6vv3kBtRBKq8V15NYgcErEIEeYznx+Np3i/OQU33/3LX7c/qkUAjHroD6JvO3m5iY8bgO4PwBwW8pYao+Xzxf9f3Pj8cbbrU/83zX4f7+9awbAf3/9u2cAKBYLdUS8yQA7GnzLrm1527vIFnl1awm7jViQBZwev8V5vw8rTRAGHlvqxOkUS90ugtDH4Zs3nPiX9Ly7dnAOcLGAmIrzzQasdgd2rwd7ZQXu6kPk3Q6mnRaSVoRpVMMkDDEmJVzfRUwWOhxgZ1y1y2zp77Uhga+Sfl9hAdiGY1uqIPPxsUpbLyUtABAmgJJeYUP71wwozLQLcMWYRMBqAdxGhKjbgteoseMA9XyzZzpRkMVjnALC4fASGFGfI639Hle21GiC0ek5/DyFm1fPXdkPXtVcocR7Mh6hf3KK1RUNAkzSHONESzOmomJeBJ8ilmWAWAZZiUU1vsTw7IyDDwp4A8/nQIW9oyXYnAF05tgAqFLSxfbqGmNt7j2UCVRFZZoEm6jFzs9dqMEU8dsBLvePEf91DhyP2UaXrGYJYFdpInMuE8ZVmfwb20ZbSFXcjpYBNcfFgmUhmsRonV0i+W0Pg+1fEF4M4ScxH4/UMuwHnQAYINuS409J6IXrYthegvfkI6jHH+OyXseV6+nkH9KTl5sKru7VzkhngNTEey08ePIIVsNjj3+tGaEr0par4PnaWnNCLSLTRDRuNDBSFVRFccw1U6R6jK0ZiBDF3KfKMO0fgf5TorVTr7urmTJpzYfdqCNaWcbS2ho6a+/D72h2wJA0J1ILoxy4omNk22w3mIqSm6Oq0r9zs7zCILlxGbjj/+Y2FZHCqvBf+YaKRTMH8ND+9Bnqn3yGQT3CgOadran+VL7Q+h66AJBYKTIS7KRtyO7TpfaBmKvOTj1Ac3UJfjuC1wyR+gpTYtfQD4lwqlLMtJDKl4KPEbxEQejWwEWscq5oJgQY2Bm8mg+n5sNvhKi1mqi1IgYFvEYIrxFALbi8buQ+CZSS2KDWJgC3Eii+W76NoB6ithjBjgI4kQc38vkeq4RZBvR5MY1tpdVVKA5KRZhMhkUFSZk7cWaOVvQflIgFsg+9rVhFPRlN8GixjV7Q4HliGbaplSNcCNFuNXG0s4e933fZ9i7PMuGVSNUcIhJIYHYMnA366DzssnhxpvQk5rmc67iJAIRAeVhabPPY85RXuFrddrsfg65sZWE/C9EooGssHdP+4AzHp30uOJEzFyBaiaTDgRRVHMKo0JvroSMgsrEYn0k+BQCgpJGKnvTomjZNg5rK3KZ8xajCz7Yvl0nrTUCASfw4btViE0XxlJJ/Egzk3vk04fWYdTqo6JoBHyy/h/UPv0DbazObV193zJe6X2RWxs9q7m8Tlds4TQf49XAXe/0/kbgJckcDstz+wQBAZb0XS/O8aAUok+s8zwsgg5Xuk6RsGZfW9FSSbnYAkGLevDYCJBk2NoOsYcd6DMm186dZBjrfNfp11fOhhS9NbqnzWQZhpGBNrdG8Pfu86+/CAp/mmmlYhhXbezPc6HcqKBQsBQEsqndd3Td2kiROKv8XjT6tESAaOcxGqOjgybky7gnGgaI4jwD+AQAA///sXUtvG1UYPXfG7/gROyRNmoQ0UUORUiGEkFiyqMQWURaIFRIb1qhi001/BRILfgD9B90gISAUAUUCCjSv5iFoiuvEjpNM7PHMXPR99+Frp1EDbLkbS7bHnrkz9/Gd73znpIiazx6HjsUCdbACAtSNIISGBkCXPO+GmktxcRE9j/2PFa2DHlDfWF84NQrGZ5XRkzDk1ziJrRUDgQLU0UGoyhGU1Z/6LoMRhBwNmZgZ2g3TM2jT0ZForGxj5+59bN/bQS4AsqxI7ENGKi+T2ExN4mzBHTsYB72O2fnAZyu8VKaATL6KQq6E/AhRAYE81aORY1RKoL3XxGG9ieikoZRlTRYo6S+6cshW5rRtDIkvKuEfzk37adQmJjE5dwm1iQuYnL+E0mgV4+PjqFQq3IdkpZTiulJy6I05298NjnDYbrGwC9H3NzfWsLm6jt21TYTNJuO/Xaq5IdEpPcWbMzB9ogR+Envi9M0R4XN5xxd37mCsWsONmzcxNX1RIcrpHCP40tkOkwDe9etvYfnrr3hRMSUh6l8U6nf79md49/0PMDY1bXsjtkESp7mAmUlcu/UR5q+9hk8/+Zjr9N778AZQzHDNM2AEmQafD3cC6LIok4dWcow/H25ha2UN67/8htWff8UPy3dRIErlQERESq+KnrSy8gAPNzbwUu3V4RFxaoyc/9PB5dyTJkvXf+9/273ztuGefjba/d/+Z/j3n/6+EdqKjH2eIzIZnTKZOrudtX571h7OR7lcxcLiC2jX6wjqdQ4oewykEYQZ4MrSHJdUff/tPbbw4uQ5Zbbj820ODOWAMmXJeA3Z6Vl0yqPo5UqIckX256dNeJRSgmdSuayqTL9QWThhxF+NJawRK3NANaG1Z1S36kyPqak2Pts68IdWjRfaWtCOKE+r1WvgWmilLhIT9InyXx5BoTaKXKXAVoQk+kdgCWkP0KaZzrWQTSNfLvE8e9A85EW9mxYoTT2HzOJltPabOKo/QiZO2E9d6JXFnesNCZjcYYqJwPH6H6h/vozxN15HuTLCnucBBUY6Ay1FWgPGHlN5PUvrVfTNtPTQ6/QQ7PyFsHWIsblpZMcqzGTguW7oVloHdqlmdUuVl8pXXmo1bbdxtw2JRXmaXpkt5BEdh4j3j5C0W+g9odce4oMuRBdKjZwPS6iWYSDYV4JdnhVfMo2prGxT5iEnBEalj3w3hnhyBLm6jdZP9yGa+8hLafvX0yWmvmb3Sh38+1oZP/KziAolYHYe4dQsgmwebZJtSPtGva/vCSuVuCr3XUr1FbFCkrQqQ/H9xNZgJXEXCWX5SylmB9DeIxD7SFoBInP9Lqirn8skGRzDvrkPjgWZ6qfIPkDG+944DLAfeyzgFVIcVJImQXq0CO/iBZSWFlHrxJCNFk5262jvPmKgKBecQJLQGCnEs55Q6Hh5O38tBs/r37REi8bF4rQNp9CgDYNohRIKcy8iLNdwnJKI0z0lbOWpnYinhedUHX6Kbf+I0k56HSc0DgpZFKtlFMcryFApkZ8glDGPX2WXJayzm7DmoOY84v6cK103BT0nadCA3RG5zjpSJSoZwCfb0WqRM64yjCDCHvJUfsE6IRGXkMbk4sG2W6pG2/jNZ/M51hDKZpRNpGkZyu4lktmVndYxvEOJJOgxaOOZzP9T65x1hs/ZtQF9QWbfuIVqoQFKBO3sN/DdxgPMvjKKOVFULhCsMqVKSC48P4M333kbW7+vYGttk8dS2lhG2xLsRDtWAYeNDn788htMLswgOzOFnhbJjjWDlfbkj3cfI5i+jFq5PGBh/c+bOaoPkdsdM88DXLiACb+GlxeuYu+ghUa3TcGGpWP5+rnkwNBPtN6K2t+ZoIkDWIkzz1IIRV835cgcvGk7uqfdp4E5VFvFQa971DonHQsi0GscxrbUAiZbHivhOgLy2Sou6nFMRHFWHHSYxUr9e/XKEqq5CjJRSulha7cZdSKaKv4MIMBetZkPhj6nUpq9ZhONoyaPO7ZctJoMZ/+2Yj54NmMudSnDib6O406gQVHPOaZfyjeghaD70OwhTC2/YRoQ6wOAFRZ0GyeKKdb1JGfWuWxB3xcrQG8sGJnFfPp+Mljf7fbBOdNldDx9pq353GMIOKeEQnGkaG0EKeZ210IDBCg2hBaJ1NdC999lGlAXKKcEtX7yeTssAgMIuIAGAPwNAAD//+xd224bRRj+9uBde20ntZ22aRIpbdMmBamVEEJIcFO4KGqBF+AKHgWp6gtwxS0vgLjkFqkURBOgVIYktGmbNtCkbm1nba/3NOj/Z2a966ocb9mLOHIS25mZnfkP38GWL1xiOyJacLTx0MRQNYRujIg599ofMZHQSaVOGCvbicIHZt4yVdWkb6K08JOWA/T6pCZvKfiHRB2Y0oMzV33Ji17Q81rJkKEUqVQzZEcC7nKo91ZjTxUx8hl2UgumH6K7tYd7N9rYv/0AzghcFHBLVIZw+JDQgQhvnUIWA4QKTrmCahrwajU0Ww1+nF88wZ39xlwLtXoDFZeen0G14gKG7Bb8vnsPd37dwu5PbYw6hwhpTAtLeSJ+IgpbV97TXwYKAam2elWsrKzg9LmXsHr+PJZOncLiyWW49TpqzaPss0+JP1ezDCmsR1dA3FEaV6VKbZLoCfFr0hh+/xCDThc77Ta+/eo6bm2sY7P9MyLf5007zSWgBOey1TgnBVRAytQJmoRwOMKXX3yOtXNn8cGHH6HeaEKHYbpezIGsaeLy5Su49vFVHPZ6E7FEecvwuvqlvY1vrn+Nd959H5Vambtwhg7mBVdXECZjOF4Vpy+9jWuX3gLGIXlnKM6AUOF3ok029GAjDkOMRwEe7T3Czv0dfNdex/b2Jm5//wN2d+5j0PFZwMtWnFuqsqY5TimtYeq29XrPsLW5hQuvTRcApq9iQldcBZOvE81cdZDrzkR+Q8jtLy9KO/+/ild+tP9NoCFyDMMXXdlPhVZkzkEC1WMhnY1jXoMkfHM48PnepYCQ7l8SOqM9WZj/fGaVrAe0Ni19ihPLy9i9ewf9TgeOJaO2oe/DJUXoJMLL55aRBCPcvHkL45gRtZM96G8Um7hbbbsQs0dgLi4gsF0ETgWGXUFKxYSSkQlMxYbIFMrlRzQnFJFpNwIxOcyRfy5fGJiCiGZSwxntRQa8QpnCp2pDE5ZUziW6gVEvw6x7KDcbcGdr3DHUnUrTlvQo9uVNI4zVITxLIoXeM4yDPnfs+raBxvICqt0z8PtdVKgDQ+cmigc/VKAnBWUFqolAGSmetjcRuQ7mL74Jo1HDE7Lsog6gYavESbCwnu68Q/vjc2HEgZWaCAZjxJGPx/1teAvHMbN4jGkMbs3Lxl9oxz5jska1Gnuqxd2em3N9VkkEBal5syZAYrI2THQ4QtIdshtC8nQI9EIOOMuJzeK5tMa5M5XEjIwjET/a06iAMc39l4+mFKqSNGvMwGLYv9ntIXqwhycbP6LSP2SFO/L4Jv6dPhosHhRbrSEhy/l0hlolPCs5KJ08A2dlDcO5Y/AJVVd2lVWs/H2NzJNDrtdaCrQamGk1CQmtAlDlLW5IWDplycyCoQ70Uos7MT72ETz1GWGonYJ4fzAnkYBGfRq5sTbE1IkoJnOVFH5Tnc2mRD1SUkznZKiw/bROnCpQ8sqYWTiB1mgN1mCEwe5DBPsdHDx+DDeO4LB4YiyLJayUbqhHNunMCm2poivkK0p5jYsXhfqZzoBqdmZIOi4MmOgmKeZOnYW3sIhu2cMoHfKeIrudHNVysTBrLtFY2xLWHzkCTqsKb26G4wTDKWGQBJyox0pkTN8zzxXWs1nPfa/rQFnnNj8TqjCgredTpc6dBpwVWZ7BosXUrCF3D/JeZ6vpcZk7stp7WytyWwq1GbJbweQKjJibJEesJif+8cEAwyd95vxGwVi6jWgaSWIU10lxMXEMm3Vu1bqQSKISF676YYj1B3dxZnEJzflVOBwtqbUmUrZ7vvDG67j43hV89smnTHExc80wqERO6HglBO5s7OHhq9tYbc3BqLnc8GVKhZDogSAd4aC7j6P1JiNvWb+lkF7/OSLgry8Zy0vdD4MISTjuHcUrZy/gRvsmRkEEq6qFywU7FJAINTmrUNysE3ioBmWohR4VrDzNx2NKsJVzHEWd1tB85BIvnczrJuY0DVO/J/O8GWkmFd4ZQm9L5XZ2oVAIAhZ2E7JgkSrKUbVS4fVBG0DZdLG2tIr5IwtwTSlemygEcgYg+Q++/1BxEd2nvfEA9w9+w0G/gxihFDTNx9xqPjRiTwvlaY47dPFDuaRoW0Dp+GayDSflz3maBcVLw+GA81ZaV1aus01nE7nzRGbMjVCmTZQUbZoLPRO0gB57QsPoOc+67pIfVeDx6/uX5ob/luh6zBDU/5NCDSgqSV5LQL8GzYN20WOamMqD2XaUnQCL4vbSJcHh/5caDxn1nfRKS2VFG5ToEnaPYNqFmUH++XVVvj1daAeAPwAAAP//pF3bbxRVGP/NnNmZvVK6Lb0LlIs1FiQ+GGO8EC6BN+MDf5UPPpnoq/8AiRFiYgIPRjQaUAgqWaBErEJL2y27292Z3dk5Y77vO2d2WywQ3aQP23Rnp3Nu3+V38WggOp0wuymBuQy4EyxQQgee4Y8psmDSGvkgjzCUi9iKie3scyc/keCH4E9WyZADB1b4TTMhFLsh8nenSQaDsfcith2aK6o0eDTpacAChoMY2GKQ4wO5Rx7xgY+8E8CPUjSW17F8rYb6ryvobQJ5DuqoEUHwya7wT5hXSrl7jvn8pKQ7MTuDmf2voDxRxf6jR1Gq7sX45AQqI3swOT3F3+GTP7SXw0hhBKVCEbrfQ/3JKr67cgU//HgDtZu3sLXZgJsm0rl2B1Y5Ng10uMvhwPd8tEnszZEuGUH9Q2hMHZjHWx+cxDunTuHIiUVMzs7ALxUk2ff8rN6bpja4SwfVawBFzwo0Dnnhs2CURqFQxsTkNOYOH8S758+isb6G33+5hcsXL+L7K1exvrImFlYukE89oTGwky5VrCUwsNR830BUOxt1fPH5Z1hcXMTbJ88gFxSyFEpbgJZKceDQPM689z4uXf5SEgh7j2DRUuRdhU8//gTnT55FQsdS3h0E87RRpLFZdEYimlYhVXaFxQ9tlIfpfbi1gScrq3hQu4ule/fx+OEy/ri3xN37tZXH6HZDrsZRB5T2oT0YoEHZwYBtU1xzRRKWlHlNh+uN2z/jI31BgmGlMhfbwcY3XHEcSui0XTfye+LCpmJLLhoOZm5gWxK2Ex6+42L/8ZXsGrq93OvFEPz/d38vfu3+/Vn31QTR7o5gzsHzCymCB9JGsVZgWjkVmGB4ANmVP7YdZlfMm/sJulEHzVYbjUYD9SdraD5toNcO8bReR+dpkz/WbLdZSJOKi2fOncZrxxfh5QPpkNHeuIuWxU4kX/becbOAnVecH2Dm8GH8tbwEHYcICJnVUxwskL4LkZjmD1TRXJ9E7f4qB5fK/N/mirs2CVLDUSQqlDc6hnSkCrpiRPu355ik0+zvljvI+/+zwjf2fWJ2A2XFroaseWxupI3dHYF7iTOd8dIt3C57ZBqxjuFw59ZlLnYM4doT3MGrFKGqFahiHrpYQOwr1nNJjMeyJAI9CZyUZqi7T97gQRHh6F6sm4CLhN7aJYWJE8eQxCka128gQMiaANok0NlOYAuJJisiRBFdN7xbw6ZKMX3uNDy/jGUqEhm4LiueG4g4C45pY4NEQWsi3S4qalOAk7Q76ISPkKxvYXR2ErmpcYZD+6UiumnM/V7ijFKxiQLflF0SBsgAtXO8TUGZBA917Bgzd4cLDlsrm0jXm3BbEdCOkOtpkOg6JZCOjllDz6VAJJHkfmA3bJ6Bkr2PldAdmOBMs1sFQStHlIuxbh/pygZaSw+xefsOKq0W8qS1ABa14R6/NgE/z3hynTAydTSXSF2+SXHDsdeBhQUk07NosuCjQY2kzyl0UQG9FKA6NwW/WBG/nTRA0o+gAxdeIccUgaxYTtOq5KMyV4UquWj+XUdvJYLbdYUrHCeCYVOiOTDscW75u8AgRnDMs3KNAJZyhgSetKUOiTCWtQQb7vDQZ2hOk5heLicQc3esjFw3htsJocII4Z+PETaaiJ7W0W81MEI2zxRHJTHrWZS5wKTNyZowjUPWJ3V1PXZyCOOIz3ESA8ubeM0x4oMwKAK719KtWc31NtFCx6YwenQB3SIhX3rQbo6LTDyKBHvlda+4oZQaNAEKOcRFoDi9F/l9ZaiiEqpBEvLaHS71pjsS/uz324QrB90y2+xi+LEW5Xg3tfBnV0Tb4OAZmIxBD9Chrj3hvZMLg5f3uZkw/B00Vgl3TxPEacLcdBiErFsqoEVxB9U+fBfevjIq42WoVojm2ga6rQ7cbh+qR2NB694XemliEnwtTatESbzlGc0oRtUQBJ/2QaJWKp+T21qnjku/XcdcdQy+P4EyN3XkqVCcXJiZwKkLH+LunRq+/fqbDC3L1tCOFXmU/Yx+0gi49tVVVGenMHpoBgntrYruQ/KDrgvce/QA89MHUVEVOKn1etdDz0hnSBj77PUza3RQuJNtaqhTTEgzpW3qiQoCHBmfRfpqDz/VbiLtkV1kgtTT8B3xnneM/pekI3J20WdzgW9yGdLXMDnNkB9/xuoZvpcMyi1Hki0a6H7MiClLueaigkFAaeOWQEWjKOyxmr9QjnsyvulAWJA1AIh7TtclhHVOkkDae3WU4vjCIt6YeRNT7rTsg66JYZwhwmO2KF4mfvuXLjwVG50+6tEWljdXEesuyhUf3X6Tc8UERluMY3WTgHPTdtsDgzD8HO7+U1HMdsYp6SVHOY5P3e1df2ry0prhIic1lUkYjzn4PZ7/YRRxUYBp23x2Kxa1FxHgwdhYWD4XGnzSqVOcXPN5n1NMb2ZKHWt4GJc60tuxhRuXmsmCSLfXoWIs5Q2CIDG+aowmkjlQpEINJ/CC/bbuELahTigZar7bnJrt8h0HxWJJikcuUCpSXmXiQ95yCIUiWnpc1KKiqUVFGOQQ3aM00GXe0SuKIvwDAAD//+Rd228UVRj/zZnbXtptKWwtUG4PFLCiMZpoJEpiTDT4AIEn/z2VB/8AE2II0RcTgxcoa2hC0hSEXpZtt9vdnd2dq/m+75yZbSkSNT55kqZp9zpzZs75Lr+Lc5AomG07uXVfnGYF5IyqD6FwFoIgyC8GqjwEgwFPAhJj71DwOcywtZuAuRj2qxVa+55v/o65aiKWT6ZaQ3wu+lwSJ7GL64kh7FkQI9kYoPX7Y2wurcJqh6jo9ofNCvhy/XOXHxKfVKcm8Pa7H2Dh4ltYeH0RR8+chFOrolSb4ip6ZbIKv1yWrUVpvj8de5zBVxa2mz38/NuvrB7/6H4DwfaOoAfzOrleMDLjmS32fAytjBOU4GJAj/llnDpzGp9fv4GPrnyK0xcuoHxoCiN9I0Z6CZZOfMJdBYL8ZCbBN4lA7hNQcE8NBHW8L+n5FSifjq+MEyeP49KH7+Pe3bv45uub+PHOD2htbsOnqnsSw1MeRhq8LAI/0nUhqL2j14k/Vh7j5pdfYfGd91C1HRb9g8YC8DKUxLxx3bh2Hbe/vYUBVw3NUqM4wCDhq4dLDdz57jY+u3YdnEPoSSYok526uiui/zG2iJFK99bONu4/eIDG0j00HvyCp6srTHcgzlvYD1GyFSdCw2HEc0TBpG++A9sSFWgpLz9nWqpQQ4tGUYrt5joHQi9PceV1JOzFTFBXB9DZWObpaN8FK31pMv5fp9D/t5F3mfcFDgcNxwAVLbkGY+r4mG2RNqU44S5HrzdEt93lYtN2u4W1p6tYb25is9lk68z2llBvqCgY9gMkhIRS4i1/6PBhDOKQ0VH1169n2twAACAASURBVGZx9MS8rmy7AgH+B8McVaVaw6H6LP+srTxEjezLHBexFXEhljjkkxMuTp+cQ3+nh/VWX/yutSzAq6iCLM1DxeMSWaOVEFE3Wtv7CJ97L+wuU68OOZQq9iNzf5mgq7A100doZ7LG8pqstQNMMKm0Bg2tX+TrTVZryFBmz/Wa8P6npxjynxE/Oo327j/5YpqOBXQWWwJO1KoIemX0tzqIHSB0fQTKwczFRQy7AXrLyyzE5KqQEyl77P1Upv3+BW+GCh1ht4P+8jLWSi7mLl9GVKmwqBZBvJmGpHTXXGndCBK6MvBlpkd7WtMgIVNoRFu72Oh0MdPtY2b+KOwjFi9myiP7PUeCW9vhkm5+3jMRKmJ+LiX9pLUTRuyiYxGijtDJQYL+Vhed1g7CrR7KnQEnJA5BEjPx2efMj7iKWs2Zj1qJz7/Y/ma6sKO0IJrFEFyaa/L4d1UKjzqQvRGSZhvBoyfYuN9ANYhQIpraGFDBdKKE628JTFvJ/kiilLuuh+r58/DeWERvto6O62HICJtYc79NB9toEoh9Hw/PhTUzjcmZaZTLFQySQAIrW/aH8e5tqovGdC1kZCV3pIZ6dRK7XgvDjT6iYMhQcc/0/5X20E/HknpTJtrTndP4C7qOtY1ylmX5/W3i+LQw8sgHnwe9fIWZFEmYp0gOORMl+FGGqdljcIMRskEfatTHcKuFpNfFsNNGv9vHgArjLGoY85yJQLL8tlILnuVyQYOF8MgFgeKiLNKWzy8WVnlNS6W4RUlCaW4e1uFZjCj4p04M0TJSEpaUDgMLLNui85F6hNqwoSZ8VOtl+PUarKolWgCkhZSlL3Q2D0r+/2qY2FU0gg7eeffVx/L5hymKGiCY5ujG+79D3oVM2XbS8OA5UfbE9jNkv/EUfslFyXZQofmqlTFs76LX3Ea8E8DLlG4YiECfKUmbHroaKxArXay1jS81pLiSlstY6bXx/XID9TcvsWuWID9EXJF0o46fO4uPr15BY2kJzWfP9OcURQDkFE1gkjQZmgP8dOsOPvniqlhTV0Tri9dgy8Lz7nNsdDbhTDso2xMF6uUl5/vvj3QMt6Q4hptRk1iYO4Vet4PV1honptQNtJxYCwMid1oyg2NB4tab+3Nf0Scv3qXZC3mLeX5Od06kiEcOFONU6yjRyGbmg4uDDyMNIknUQiP4plFt7P2uRBia4gVCl9Dkht0BnNTDufmzOHdsAXW/zgLbdG2NI0H+zTCCsJm+P2isrD9h+P8wHcGJSJQwYmHMNCNqcMK0uTgJ+dXsQx/vpZHTXhNFWY6M4H2Hk9+CCi6wfBGiDwaBfh8pLJgkmfJCjhmoYZKY5FeSaXqubReigDndUPPiObnnz5JzTvcfPYcEh1nbwRGasxHLL+ZZ0O359cJFXN3o1roGEicWIoT0GH2X/DVMt5f3pZybqXhUiBijxDNqkK065fsbBIBBnFC8ZJzypFBRoGjo+Jh+Trpvw4GcR20z6fs+/mTv2nqjqqLwd/Y50zOdTi8UWhBIAREjF5GrkURDECKgvvjgj9MY1PBufNWExMQEEaiJFS2QCOXaDm1npp22c+Zc9jZrrb3PnE4RNL66X5hOQmd6bnut77YCRi2sVF8pL5e7uJF7HOZgm3l3sHobd/oSnI6Y2nn1Rg5gL3vFB7bA6PQGMsD6OYonqZha6IIHSRJG6FCitPWG2RNCcp61GKUlYO1eDXNT99CuR+y1LNmRg36heFAWodt3YD8ufvIpTp07j/FduxEOVdljxn5SLegTpUrLheSLH8fOVaTPbywu48crV3D5s8/x+81J6KjNzb2M27PNvhaU06d0V/ceseekS/BK7Jd97dAbOPnhebz/8Ud4/eABSZjvE52ClGzGNgQ+N/1ylW+8owWjTe3rrnBPGPtCyoCWUTSS1CpzNofHtuDdC2ex/+3D+OG77/HtF5dx6+rP3OhrHbNH2P02Y71droQytna5fu0qbl7/CafPnbMtlJuVCh4LaaIOzl74AG+dOIZrN6+5M2+/PMn7gZV0FZe++hInTr+HrTu3yUeklj6gXS3lmGs8evQIDx88xuTkJKanpzF95za/V1uY50RmQp5NIp6ksg8MeAH/LWmUcOPvOxDGsTGme1CVhVxcTgQL6Mj/R6MrSZ6q1HMaJL3utbabL4WwIVICeS62gFabcwswUgUqJR4tRJ4uegCqHHX9v/X/92u9xYJ/8rqTHIpKiqKE9XlHWu6XLFcs0eqjFOksQb0+j1ptAXMPnqH2tI4/785g9vEsAwDLjUUszM+itdbCGiGzpH5KJZmXGBuPNnEOKZJNsR3FLF+lgCJt5y2TLzQo3rd/s14m06fGZmTzJuzasxeNuacAyR1LJH2OZJOiVPTEYGhoCNu2jWNh8T4HjDpP9YuWY39IEUUWBlJiEQthYtmgeM7+BqJs/S8tFkuwRUZxb3AWAYfmM0tQ/P88/k9YL/qXEsKNh1zyDr/EbIAKPUb1K9UKN/7hYJW/L9gOJiBzUbJZvAo4u8ja6QncIPVZXzVESKzlihTdiTZYInnt1mEMv3MSi8ttrD55goGsAV9HYi+3f4NrStwdzo0vYYOtFtq/TKETVrHp6CFgaBB1r4QVTzFQZJw5zFPCELqLl8GajPdGsoNpO0OZPPfN+3MsIR7cMY6xfROsZlI0WSY1LKH0SH5omwMes64lQJCKx8AEqIT9iFc7iJriSe402ujU24iXVhHEGbwoEZbfmFwVpu31nmkrz3R2DNtku9n/DMQT46ts80/krs4w2hcgJClts4najSks332IoQwM4gdZd68RsFazSkOez9R8+RzcRmVmuzqAdPcE/GPHEe3YgaVSgCjzcjbG6Vyc9JuJXU5dl3R4VMoYpqkQlQGkcYRGcx6VsYps3OSTpoLNZlC4yAAGz8hiQpMafA+DE1th/DrSWkNqqjhFwGGL4tcMCrYDd2/kSevaWle89Y1s8frszWboXW5cm7uHlM0J8QKZFNRiZWcfzIAHlfUj3D4OlcYIieghG0snY7CSFUMx2UzkfWIz6Roq6TJnXvRTvdGoodNsoJzYAtXez10lFQtxmFmmZ1tf/wBGJ/YiHNuOBkJ0OMlR2etDMVFiKPWfjg+F/lUDlEZC+KNlVGjscJl25zRP4/7PsmZtchBerDq+PX49z6xiI6hf/JkGz2Ov818kDUPBYxxbgo3VtgSsks3GF5bKCwOEI4My953A1qUV+KQa4Oeg4ctSO3BRqzxY0lgWmusQ49u6VeeeoMW1Nfz6eAaHX92HoeorXNsQqaUyYnA9lIeHcfzMaZyZ+g3fXPoaWRTlHEbJSMYGrIoo6RjoDjB76z5mbkxj4tSb8MMqhwJqqsF5ApjCHzO3MXp0CwKvzMrXjcs+/1+CQPcC+HrdK5VbmMrwsFkN4sie/Vz33pl7AIoASzKFhBp1Oo9J1+jilGeJbcR7m38UehLBPAtAauH+ZFWHbbp48hUBpb7iBo+ej6EvtgC3iA3moEAOHkyl5rR1KSs7csWPTGpTQQnttQR+FmDP2E4c2XuQR/+VVclKzF94+P7x8gsEoijGPMx36njWXEA7jZiRVwEps/oRdzrQXiJBfevOh51uUFhxHPF71Iw62zn1XaklNelZwHkHWlh2Z9Oo9FesLSLNpf15WJ/fVZAbGzrPCnXjbag3ekPC6bzQNAJSrrN9gM6VJcOd756WEAICevPoRavO6FU0dq0Ootxg+0ABGBKgwE5MIGKS9lsL+oj1UKwfDvxx+QZuyTjJ7rQ8saAIICCZFHbkn500wKMDCZig+x/AXwAAAP//7F3bbxRVGP/NmdvO7rbbwpZCb0holIsVREPigwSNMRLCg/LAgwn+b5iY+OQfwANRaKVoQorchILYCvS+bfc2s7MzY77vnDMzrZRGfPW8tKXtsNuZOfN9v+93UQwAkU5duMHVF2Est226OWIuWGW8g572J6l7oq1MDEzEpF3BVhZAfmnzvp0m/qn+Q5kxdINQMhGIBWBlNwv9HvsI6OkK0yEjuImLZGMDT6bv4eXvL+BBXkREybVy2wVH4wmB8WPjuHj5Mj767AvsGR6B1dvDTrlk8EKOz6bSvxsKZaBoJUPFKxCdnai8t6Zu4PsrV3D/9m10/TaKtHETeKLprCpKkPRb6VanHuzk4D88fgRnz32Oj8+fw8jEuyj196ZFmTBCJHEISzhS1Rjp21C2p9QoRMppN0T2kan6XBppIEA+kNmJWdNSTXAsE+n4i3BA6bjERKBJU391CJe+/gZHD43jh2+/w+TVa5h7Og8nzZvMNLiJzutQny8vL+PXX6Zw9tNPEMchF3lQxQq58VLD4A3swYWvvmQAQJVQskhQRYotXFyfuo6bN6f454SKaFqc/wvPns5ieupnzMzM4MHde3i5sMA0a9tyEIQBv3uHfCzoHHVjxjx0pDRNH4hmFfLUf6fdUZtnKYMb5Qqtz0mp6OLA4D6cOXNm1/2T201C59ohsLyGJzdu4vn9x2gurqFY7sHoxBEMnXgHhaOH4RUdST9QNMrEEG+oXP9/6ZVR/tOZ2ZazrqUWr7oSDClMQ6fewMZmDY1GA7Ozj/Do0UPc+e0OFp4vYmO9hfWVJlp1H3Ziod1sIuz4fPeRc7NQKDfNtEip0ut67GGZaGMoA/A8D8dPncSp9z9EdWBQFRMmOuQ+vmsu/+uXTRIWt4T9I6MYGBrB6twznnQQJbijqIi8NzoGevvJ66TELAAo/HY3P0BmItmWpORx9CA5vUc7Ts92W/9swLOGnmM4zW25JGo6mOgUAdIHq4gsBgEoUq7gcsMuPBfe3gozA9j8jQuxIC24XwVIazq2THUTaPm+NCIkbxZHoFQ0mSnuk7cI0fmp2K1WUDl9GmtT08BSGyYVKIYkq2eQUwbw0WdOIjlGVr2F55OT2O8K7J84AcNzeLraFDF89lGIU9RHxwzG0CAAbR12GoFK3w0aTfi1Bvygg3q9jv7hfShXKxAFC06xwC4pstiUDXzRkfITemwQmNOsbaK92UJzbVM2/ustxO0QZhjDpQapKwHtvKcNN/+Rqh24qdb+AjFPk1kGosACVsxQnCA1GkgwYNvoaXWwOT+HlbuPUX88h94Q3GQqLkjmKJ/RAFR8mWCTS5KgdDwPASXgnDyFaGwMq8JAmzSScsScea/oY2iAggCLrpLeuCYq/X1c87Q3amgsL0IcHoRZsNElEFn5EG1fiaKdcnpFWaBndIClkw27hnCticQPufFzYGpikQIplb9Cet0rScsb9rUiZ3Yv36NkIHKKUSyNhYUt5TpJZKUDWNMrwjLKbGJHxiBWouIfE8Cj4pFqvDBAFCSwIwduJ4LXWmd7nqC2BicXgCmQb+5irv1kRLIFq1JBefgg/EIvmkGITigk3V9of4qYJ7V0P1O8nyjZcKolJGUTVtlCOwlY4hPFGXC3m/Ha9r0lv2gf6fJEjfMnMvf19DjxKxvBnZb2ZHndYh+rKKujM+OumJmD8kTKZo+AqYJroW9oEMbeGBsvluCvrFL2BEQkHcBZd6BM/6D9XDTjVYFuJr+vRBJ16Ny5Dha7Pn68P4Ox033wUFRAUZdvAzJLHjg0ivOXLmL62k949uBhuoMlSn4TZWx4PuNRDbh1dRJ9BwfRX3KBkgRqyeCNfJhWGqt4uvQHjh94j+9cM9dkbn0a/3tPgAxkjtRR5VOfAMaq04MP3p5gYGN2+U80jYhTHYh8wj2Mlae7xxJYZSBle9yzli1nLID033M/ZylpNYNUud+jKbDrmuj4QSbZyencqYELCFyl/ShGes8aPDGnRjJm+Vur1WG/s4PVYRx76yjG9o6iIspw6S9K17MSw/6XlfcxCrl+tpmJPL/0Egvriwi6LXTJO4em5CKByUMs6YsAw9giARDb0DCO68vF8OkelOoSnoYrE299DN0f0kfLtlONOxvEKz+6/GCa/jvqVSV9Xr4Ww8ikm9zUq8E2fS+ixA/e16UPHt0kBGTwOVOpeFsNCFVSBB+LzCAlmyNNwFPyd/26iN1M8m1tks9SPOUbIXtv+Teg10D3CsuhdEICS+Zy5oR0PShWQx48pMW9M7MT5L6offS0FJ++brVb+BsAAP//zF3Lb1RVGP+dcx8zd6bt0JelLVgoqA2iCSwUjEBXRBMfaCILF2riv0Div2DiXuPKxERWJi7dIgtjjAIiDwm0glTaQp8zc++d+zbfd865M600utNJmpS0ZebOPXPO9/2+38NmHYBt3txEMwFkeSNgDPlyhWb4vq8o/75fulWy5kKqLGbS7jE9g2kTCskgRIXQB9nz4hgN1/SKvHTctEo6TPmBIHqLplnkScz/pguhJjJhvwKb4z46oY8BQhPbMRZu3sfijbtwfHWeC1V+l1T4jBvjDCMT4zjx+muYOXYM/ZMT3IzTe2DxjU/55vPmLJXelCn7Ur1XVPREfoDrly7h66/O44fvLnJzXGUnB8WEIBTR6D8dJkcqxChjIERi98GncOSVVzH75hmm+jcGh/h6UjMMh8r9J+dH8hgQvHhdxJyQYPGkjjbeQGvnN5CiiQLLaGEtCeDnCZqExrF2EUovmmSoSgnPdlETAhN9AxixPQzC1s7VqllxlX8ynn3pFKzhIYzNPINvvjyPe7/egEvGxEpspja3HkMPmph2ggi3b/2G5uYqAwm9WfBS6xiFbeHts+/gi88+x837c9ywUxHOxoWCNFoJ8exx7qNzjDJevXwFt65fw73f5+BvbsBvBwpU0VN41q0RUkdostYgIst1Aa+oxKXHVZ6iJpT2qvd4kbyGJf8dbbi0rixNLyUAiowe9x+Yxrvvf4DZ06cxOTPDzb0ldprWazppy0d68TJ++fYCOour6M8lRkkH3cyQbl7F9R+vYuTw05iafRHYP8a5w/qk3uYp8P97bJ/o/tcPms4b9176xHWKGI5w+LObMulUctHIE3hCmpMAtvbPICogHRQEJq2vb2BlcRkLc/fw6MES7tyex9zcHFobLaytbbB+KianZzbcpEgtV+nZMoG6QzqvDqq00Udqc6e1ROyOLIw1IitZH9oY3oXjsyfxxltncPzUCVQI2ZaqoaHJiED+L3wWdn6k3OJRXn0DY5NTWF1aghQFSMyUhK0yMq/iSYyMNrDXH0cY3sWGnyoH5CzfMsHacvhBGfvR7NX2KmyqJsixmg1phJaAbVu3BjzcoZA2EZ3m75ihYOT9xthKawL5oM9UkcbU70JNwnlCQRp/ykwnl3+Sbw30wap73Ewklmn8VApB+Qnr8bHpProNHtFiLcoqDgLINELDlXDqFfhhypOqhGh8to22dJEc2IMKUTy/DxAuPUCR++ijs1WniJjW35wJQhfOZGyXdwI8vHARQ80QEy+fRK3q4kGSIncKRfiVypiVQU0qEESu439UbjiDAnS+UtHgeQzgF0mOzp9rWF5rwR/sR22ogcbuYYiaC6dic1HZV6sBQYqwHWgX8pDd/DOK9gsV3bRKe3+uAFJbgwai6GWD5eyxkItUxYZpgzymjbOJomSNv8OmwBbr9Ku2QH+RoZ6mGPRjNO/M4+GVK9icX8UAseQI3BfqetMeQ0NoFgSf67Sfgs5OgbTiwd73JCaPHkU4sQ+rwkWkGxl6Tmk5rKFlV3nZZSOwJ0PcUd1S1cbQ2Ch7c0iaLm82ES8/Qrq5Dqe6CxGxJEgfXDZsqtGybFMfKL2L65EJb4a6Mwyn34O/tIbg4TpEkCKPdZ50nGvaqWJZmhVXlLwAoX1pjF69Z532bL+Pa367DABt7mai8DSgraLQoAyMqbgkh/E8ZU4Fs0yoHrBUbVbohI7cpQllDTK3ISIHjTBFNSe/kxaqxodo66vgjBO+FgJOSJ4BC5PPHIIc2Y2VKIOfCdj1GtJUeTNRQxHnEWI3heyroj7eQHVsAFlDIrZytOMmS3po05X6BohtYElR/P106vojbP1J6SDeQ88tf1dAS1e6ZIBCM17Mo2zcaS90tYSWk6a6aUpdo7Hed0eWVGQq2EmPTmuIziFi6nBjpCKXuBYkEqSfZ6hUJQb3PoHIq6C9vILCT5BGyo1eZkqulBVKYsKZ91Lroc39Z58TAUFRiQWwkkb4aWEeUyOjqEw/jwnY8LSfDKdx5QWmDx/C2Q/fw6cff4LNlRVUhYWkMJKD7jXx+k2AtYU2bv18DS+MDXEtY/d7yJiqTdGxEe7cn8Pk+H4MYZhOI15rll79JjpyO7y2fY33Os0/thbRgJrkYVoBT3oQloMjB59j8+7LCzfQard4TTO4mCpwMNMRpZZm2LAPAIXCUMOm+xr63oA35bXbVqm5NtNfNmGzlTGb6Yl4apylXQlJ2dhRTZLzF1PPIzUZtjhyO1LnI7GY2MdMMAC3b2wPjk4fxvToFHahjyP/zGoU2zgS+T/Ua91mv4uMGsid+oiK9DhZbKH9CH+sLCJIfdieGlawfCVRKRbS7FECOolD//+9OfXcvHaZd5k2zyvlAG6Fvd+4ntM0/Fq9ziAd3xNiVepawNX3wlyE0tI7ikXDhpaeHhorOQF5AhCzq7CJ/afk6FTTUbNPLA0y0+O9eAdQ0QzKqXknAMB80Wc3DMISqGAQhs3uKT1GmfGp+62um57T0P/puXlNaNNIA46Ua0YDAYaRQD/rRJEaxuvYfnrtatlr1gOdi7pn5vfcsPtpKCEE/gIAAP//7F1LbxtVFP7mznhsj59x0rSkSUpLFhQVqlIkAlRItBILJBQevwOpPwZ+A2p3LBCb7gCpsEgjKqSKUpEG5aXEbmLHr/HcGXTOPXc8dguoKktmM5KtKOOZe+fe853v4RnqQJxmJkKyEfmHsRulFEYqEU1FLkUULNLiiWyAs/odc5Np8JssR52is0yFsQZ/ydOUrYmFTQ5jgmCSAhihkxvIrplEoc2ZIi1HFPVuiHCnhaPfd4HOSOJJnNTdl2+i62GoQyjfw+V3VnHxzbcws3AWfiGgnl1KZYQs6qyrjBNBVB3ubrCXQM7F9uYmvrl9G9/fuUPcEd6E5hkAMBPAUng9oXnmlM8buKBewUeff4K3P7yBpatXUVtapJ0uSCmexOPoHaY4MuhBkTd5noDku3hMNEcAHQdoRgMchz0c9E/QjHpo6gEOdB9H0QC9JMJQZgQv5tSMHsVcbFO8EhXBs8rHvF/AYqmGeT+POb+IaiGPkpPjhboVn6BVKaOwsoLlq1ew83gbqnPC1FHWQ6YbEfPq8BQZlACtwz00W/uYOXXmqcmTSI7XqXNLWFtbw+6XX6GXaI4zgURV2BfRo8d/4ObNL4zjJhufGM1+TmiRKqVzysTkvFlB3Cb+qTnRAkvFPE0IK8dPzeKcWDSlhlZD7Ak3n0Ot3sC1a+9i7bNPsfreNRTOLhq36VAMxp55yG6h10fnh5/x663vEG7uYT6oohFUmApOk5304KqboHV3HTuPHuLix9dRv3KRpQFMJf1fCPBch+eOaWfERPIcV3oAZrxoPWBAgPTV0XDAdH2Kx9za2hI5iTnv7u2itd/E6LiHYWfABZJ5hyp2L67kqiaKTUkObeKx+Y1PFH+KlImHjJZTIUyxerQprJTLKFfKqNXqOD0/j+rsDE6vvMxSmPevfwBVCjhFRGX29S/K4JPyi99vFBtaqFTRP+yhUixhVAzQpmLWNT4vvq9Qq5TQaNQwDJ9wJv2/aQe1I+bm5NZPxZUXS477iwNDNsfaSg2sz4mDDBuAdMGOmzbVKRecKf6lIpyCz074TPP3cwhpnXMnEw6eRT6dPsambIq7+MNuF2geYq7oww/yvEmgrHB6XwwRMgWd4sgaryyjHq7i5O5PiA93ocM2SrSWJnHqyM+dJQFp+JJ0hICMxHtDtO9tIMkVUL58CQtzVTQ5EzyG8d41siQq/rW4UWfvueEamJhTdnjX5NXiIe5G6A5arBltN1uonJ5DvlwyG58TzSaVneMjBsBI7+91Y6jINRvoZBy/qJB1SR/r6mJJzuH3I28exgkurlTtabOdAHOKV9RATccIOn1sr2+g+eAhwoM2ZomhFitx0Zfk8UzX35GGZ0AgueOhq4FjuCgvnUf5jUtIFpfR8TwMiOkhSRC8jeXmvMeStkRo2OOLokWCYv0KyFNGe96HIv0+mXbu7XOkXqVCRpA19mYg7fU0xVulXfeY2Q+avBc88lUwiQx+0UdvtwWnS2DLkBkbRDklgEkZFEsSeEz6Q3YBeF6au2UATF+jNQo2OIVhyTnMiozTItfIkeJUW0vd+UiAA80yFEq7iFBwQpwcNRF12wZIyGjC48xohC0saK9TryNYPo+un0ePIy6tZIekCSNEagRd0NCBi9IZMvurIMonJmrMjZC4OqPWm5SmTh9/R8/+p4N13VbcaCWt2fsqZqNKChZr0mXlq9xcSJSYwMmzm5Jy8GY+jiQam/ayCgPKdZfvyaODgBCVYUAxmZX2vpQs4CYozda4uGlJDGgSC2vQCNjTMWAtihOhVrvKOpbHiByHjQepeXNvZxMLM3Ooziwywyd1yFBGCrB64wbub/yCb7++hT6ld2XeoI6YQbPrPBWOcYz7P67j1cuvoVEtwmXAxoCCdGlPesd4vPcngjNl/s1JamKVbSglz+0NMOnjkv3CyLnIuPKUPwv9kuLx9GDrN3R6bTgEFufpuUZjr5nMc+caR+QtkO7x9Jjg+ynu/VygUheYGkqi3U670/K3XkYfTjVXsVBCqENjDhdqlszS2ca1EytZE7hAUjSVx7mFRVy68DouNJYQoMDPQyXqP/NTmPCRkPhHWuf2j5rYfnKAQTIyoDzPB1fep2b9fyajzp38jIFTkYZzneW6qQyd5RJT81VHUerGHzNrxhhzGt+6vrjdj5nnFnyw4IA5R8weoOdhDYQ5ZlPc821zwrLYs+OJuvLWUI+eP5kE0jXR87Y+DlScGyM/I+XIygYYIBJH/uzn1i/PxOYXzTghSZLUxNlrY6cD3wAAIABJREFUoHFAoBBdRxAE44a6jKmsD4CJtjSdf/td6kkAF3+Rdy2/bRRh/Le7Xq+fsUuc2E6cB1Wh0FcKPSHUC+qBQytx77+HhCpAQlw4IiQQcEBwqKiUtnn1kcR52HHstfc1i75vZnY3TioQHJlLFEXxYzyeme/3/R45SbcQCfpCD0zoCC1c6gLYBUWr0BpNVcBLR19JWyIGANgzx5ZfY9XBoZ+WFScOlvThexMveWHIpU6GaR782UEABb1RmuyclUuo/xEzCohy6yJPJil2EbbwcLTbx+H6DqKJLMAZgWFdlKZN+Bgjxu0P1nDjzh00FzusuyDkOw9t5M3iRGl2J5QYVjEUwiCCk7PxcnsL33z1Neffh+6I3y/HL8QyPofd/Yl+EscoMqoUwyxXcO32Ldx98AAf3f8UzcvLUgdOj42ADYKIWiNMeRrygWg7XKhSkGAPwCtE2MIIeyLAa3eArjvAsTuE63scQ3Pqj7nDxY9BiJJaFJY64KmpZ0nmLOxIYCMYYGY8wrw/xEp9FrVghEZuBpbtot8fYHNzG71X+zCPepjMzqIwN4+Toz4qRnrAa090uT5sdk8+PuxiMhrKOUeG1qilAsrg6+HDh/jy8y8w6u8x+qsJS4lGRWVkErOCIyAVKpxTnZ/shVCR3JJnOYt8yhEo5C1W2nxl1SC9tQygXC2gtdDGzdtruPr+dVxf+xDXbtzEzHxLPhkVmPQeaT5zZ/VM6VAvajxB/OQ5/vzue4jXB2jbJdTKZZRKRS4MyUiwRMhgECLnTdB71cXjR99idb+L5se3YC8vSCrpf2OB/8+GBn/0iiQwx4NPjtdDFwf7XXT3uni+/hQvtrewtbGB/f1ddCkr33UZ+KEsXjogSA9tjOmgtbnTaid7n4rfsUw+CHwv5IhzKubIzM8p5VGvNzHXnsXCYhudTgdLlCpSqaLVaqJcrbLmnsxFgyjE8pXLiG3aa5SRTcY+5czy/hdDR3k6xTIac20sdlaxNeiTap1jckZ5G8KT/RbqBDcadRz3hjjuuRgH43MAQDZ9QBfnhDJzPjpFHTkxzLFkLsRxnBZW09+NqaEPbN3FMZSuVBf/SAo4MzVcIyMkAqbJK6VoQeTSTP8yAWiFPALSFUJe4ENVMSQ0uTfoqrO/y4u/pcBGE5gEGOwdINzZQXt1CXbJhrDIANDnC3HgSQkSiUBcAiIuvw1HmDj99SdE3QB5w4ehsqZNncXPJXqQzGtRinoxGfTR+/lHuId7WPrkLuz5BqK8xceRTxd9Q4LTMFKta2JYash+MbMEuAsghWE2GweFiF0Pgeej2xvCJsC3UOKOJUncPOpKTDyu5cxAmswmmsnM58f7uopKEkbacRVKP8IZ/0QJJZq/sBgAIG0xSQkpbrJiAaXIR9WPELzuYuOPJ+itP4M1ClBR5xQX/nFaUOZEam5LYEjByfNcjCMDp6SLXloA1t6Dv7SCYSGPEXXOLMnQMOJImdMZDAIIzviWM2YxM0OwF0uhUoTTqLH5HzvPexNER31g9xD955toLM9LGjsD4LZkIcQyQs9QcjMzU/qyBwLJHii27lIRhbIDq5BD0BshPHRBTns071QFWxRrSBdf1cU1lZmlfjB5WcycbMZ547vpIddyxjXdlB1Rob0PhK5zREazLjugkWLcELuC3ijH3DHSZvL/FOiaEY4gDl7COO0hJ3ylE1aBYLFI1qb69jGoVb9yFYWVVRzlpAkYMXEYkrcihKYni/+qgWKzhnyLzP5IYkRpOQGDDJHeUxTP/iKg9CIJ6kVjurjPjouKf2QZTH/jAaD3Kj31ScRoLLuhltIo032WUqzocs+uFsT6FNKoS6QKS2YDEA+DeJ1c4wsP5YKDxuoCTl52EZzQ7TZgY1r2dUrSVpThNa1/ktcy6EB7CfmLCI6PJPvX33d3MF+t4crMLC5ZNWlYrWIuaB0uXXsH9z67j6ePH3PSlQQe1Z1ZRWoQOESAnDBDjI8j/PbDL7i30kBckvu6ky9hEoPlmps7m2hdaqHtvHWmg5+umH8mAXgjE9HQEim1VyopBDFc5+w6jMV3UatU8XR7HS/2dtg/LjRDRJY8E6lhlDzHlKyZNdWK6q3/zsAPdfPVutAFIX3W1CiV3W0zjaNTjVcjiRkMVVdc7ngiiDnhgWjj/mgimxl+jNl6HcvNDm52rmOuPAcHDgoKOpJrTkyduxfMWRyfO/feNBimNiSL0g3GeLLxDMfuCUIjZK8Trh8TxYqMSp1+jmlT+KzXD61DM3Mg6w629BFKXyNLw6kzH2ekM0oaTvWZ1sjrn9lVkZg2UqPWcRgAOHMzucAXgHfODJAxGrn8v8MhMeEpGUca1NNjkwE5DTIJTliMmdefnYtzZqVZYz6WNEhvA3ofunnOkf0EdtNeodmnSn4g623Z3efGvZISMBNFefzR/JARoF6vhmHgLwAAAP//3F3LbxtFGP/ty+td20nspM6jebZJaCv1AUgICpWQKlSkHhB/HgfEEYkLVyq4II4ILgUBbV3StKnTJE7i59rex6Dvm5ndTVJKDz0xkqXISeyZ3dnd7/F72LKSIFQCJIUPNLySqgujaAgh7BMT136U+oKwlV4AIQBcJ6MT6M5/rESJLCv7nDTxT07eYHW1Qx8gCsbzJyVRBwES/QWHBP6EzV25pJeg+/cewtaAIfd5hbbYkIEEPeYXVs5j7cpl1BcXMTE9zZYoHMQyNNdIPWupvSUUjIUtg0zJg2vtNvHDd/fw7dffYL/5PIVKMTKAjeMo+U+YEuAqzs7E/DxufnoH793+BFduvo/y0jwiy+GbdYFv1TZCOoam5DFSGEkrH8BAh7jvGGBn1MX91gvsREO2jDoY99EejyBcB1aRAsIRCpWitLHiV8Qdam3txA8d28r585B1okCbXAyiEZqHe5gplTFtJQiCHrYaT7D7tAnjuI8abfRxhFJtBkd4KOGlL7tZJHFaFc+CxtxFlk9mLAPLm+u4+/ln+OKrLxk3Zgjpk62hlZbi68SspI+UUqFOR0qXQCrad/ZBkOS+sxfL+VGyYzgGLlxYxfraKq7fuIHVi2vYvHQJ83Nz8M/NqA3mKYKmKZN/rSiXLur096lfjMkTu4c/7v2EYeM581h938V0bRqRCLkoRUlT0fNgBkOmMJQAHHQCNL7/Eb1kgI3bt2At1DPF8//JOP1Yyq9OFw5fZ+SRIhlIjfbeAINuj5N+Eubbf3HA3P1n20+x1djCUauF1t4+Fw+lgEYsAxNbdfENnyH7XGEtePwz3YzJCYR1OeyChG6RcGMUsvK3P1nmDvvGWxu49u41bF7dxNzCHObn61w1podCWmWyCjKwiYbo9fso+q4snGnv69x63sTg4M+wueAwu3Qex3s76O/vcEePbVXHI8khV6rTtWoZnWoV/f6IO6yJfmCZGZIq9fNWyCgSFSMtABI6pMuG4xelnZG/Ul6NaPl3teJYoQFY6E8SRkFmIMJzYJeK8CZLcLwie/lToMrK4JaBIA6lY4tlMjokHuvk+78dDvSM+OtiEwUS2O8ECHcPMXzShKhOwnGn+CHteTa8UIrTMlTacNCncN0vYnptFdU4xMHPAlb7BSrhkL3XNTfVyB0RqbFK/vljzBZKOOr3cfT7b/ir18bSrQ9RX15C0S/hSEgkgA7zTtA0VKeQCgRkYcQwZO6qyKTS81XARGHiMEQYDDCwxlIIS/lRO6Yq6hIMMf1wNc8kVsmjkDolQgrz6sRRds9k0YCRWoQKNEg1PEHZcVlzpmgKTBH3vxeg83gLzft/orO9i4qQ/+PAVI5C+Z6gnocWiDQZOn5IgVylBnN5CdW3ryOcm8WxY2FIZS4KrExtx5jbvxoynsLqVSecqCMlF16lBK9cQnAcwBkGsAj10elitNOEedRGTNfsRCXtzlqKMvdy1XmWBuSituMXIFyB6oSPYKKLZHIkNRraXUQU4JNgbZiwwB5zWhJDBZMZFVMPLsIp+8C82F+2EdS3G2ludsK1QF8HksqXcBCuO67mS1AD6sCl9iAsZkzFkW4L5vEh3GjE5zqrWmol9mwQcnFku6hfvIJ46hy63ZiFG4kSSPdHTu2pOuQ7QMVAeXGGOf+ikAnqnaEkiUy8zz4lkpXv/ueFqV+V9GdnLVvvGV0S/f+JRH3l+bdQBcw8hYBpOBKzk5s7UQtFKianExkWOqNYk4W8pJZGlOSaHSoejtnujkRJwdQfvz6FwLYwPOxBjGLeR6f3hD5eUAmZ7vFTlEjIpcA08MtWA5enFjC7co1jU0Lp8K2BnLcKBbzz0Qf4+O4dPGk8QtgdSsQq0YFy8+OVJjZcI8bDXx/h6s0trFTWWcfEcotMZyU3lvagg8fbj1Hd8GHBl3QvRbtMtDPHGxiyCCATJHbeID0C2JhBGaXJFUxueKiVJvBg+wGkOW4i0S+nEjXq9pJYL5RAIDuf5Qa9RxTiMTUsHYKmI7WwY7Q06ZsZUogRsi4hUQOqAUvNWKFEMG3DUY1ZooWNWc8HYYTVmUVcuriO5foyauYESihLTzARcazyOnHD6yOJzPSVqLJCY/cZjoMuFwKECxbi08UQh2nScl1xfPZ5ruHseg/btm7MyvVr1HhKichN01RCeCzyl0hEhcsuA5F0AiANApUEa605FrxTzWco1AZRN9hSHvJv8iMVduRzkXXU0/PPiAIpWMh6dBQPEn1HQfFpDqGyeNQaEUzhUIm67MTLc6wRIzSYWhIGcAyJvqf3aU26CEDHibYC3x+Y7hAhpNaGQtifLKzIKIvXogshQqSClLogYBoG/gEAAP//nF1Jb1vXFf7um0k+iiJpDbEQy4brQAqycJFkl26KLANkVaBAlln2T7XLIAiQoEC3AeoGRZtsMrRBpiKRPIgaQomyRPIN9wZnuI+UMqCtdrZlDu+9e+8555siMsMwjGrKBaK4G7lJlvMW+cZrMcfulaUVjQvHV4jTpPcN4N/S4j2IxKih08oa1gAbN+gHqnV6Ey6lC/iLvTwUWNaK8qRU3ZpDHVKw8o+Q9wuL6cE5zr4dA6cFIrKDlgBGKTxjQlwd4jzD7ov3sb2zgxtbW4iSjAsqLijDxYWkpt2pwyNpBg3puooS1fQSH37wAd76459wtL8P2rbE0CdaxKNANPakE6UN5O7O83jl97/D/Vd/y5Eq+XAoAwneaiRqkQYijnOqDU4BjGihYYYv7Rm+mZzg8fgY53WNc1ug4GmsJBPQQSn0OR2Y1PPFQ8vUPqG6eyqPscsFQ4SS0SvK2o/5EEnyHOfaOD3ef8SHSWteMfVolbQydP+DGJUtlKosHDenqq1IX7uyErnltXNNXJHx6iS1aOlleOMPb+Ltv7yLJ6MDJEYYG76eCVVnGppl5N8wUivT8JBp3jS/sfXS5hIuFR6EOGUptrZv4fbOPdx/+UXcvncX23fuYOvmNrrtLiLSvzoNgjWeFiA0GRgf3aOfym9M+l2uKfpYDkK/8/hvD/DwwUdYOa3Q6w3QHQ5R0PcjJos2NNNaGsqgChDPZ8hnNTNqxv/4GOXtbZhOBtfvKkr4/+jBf/kw+LGF1f/yv3/+ZwlvuvI69ifq1OVGXp5Ly+ihBGXVMNoi0QEn/WYo2lT2vigwnU1xdvI9RxSdHR7i4OE+Rnt7/Aw/2T9mxJ8mtgW7qtrGBTwKYqQuQRalirxLvCgXwzOLzKVITcybfUGGZ4hwOS+4yUXcwerGOtZvbeCFl36N3Rd2eXi0/swQWSdGlKQK2alDp+a9myjWrpk47CmSpBRETylfove1TZFtfjJM67/7ccrGkvanQpilGD6zgWzQw+X5EcI6Qa/Xw6Seo1JmFjWHw34PJ+kY/XaG0cUl63YZ7V+iegcaiyc3UIa8ed5CToaA52fsEcMZumreSQUtR3k5WUPmWnyBUIO9WZyusUAOSN6biMptatbZI43hkoCjzFprK2gR4r/S5SFtoQe6R9piT6WgP1TCzNI3lNIm8PuRFmRXOBfeEwRIggjpZYVoPEPx1SPU3z1BvbXOcgPXjpHGMdaGOdKoxOlZgbKYckycDch8MEO+fRcdRDj8+wPYpxP056doodT4Otvopv3gJ0YKV1TI2SCwxuX+Afbe+TOe/c0r2H5+B51uC5O0hdPKYMqZxKSyLjkV1VOpuUhiZJopd1Ks1BQtSMaNKb9XFi8ovEF4dUPgs9wlEjtFKQQ8fanleaXzyohrO4jWSBrlSCiZdK4ZlcpR3Cpdc2r+k7pCj5B/a9EhSc3oCKeffY5Hn/4L88kMLfJyCSVeV8xuzcIsUJuUhCiYlWUm1ywwmJNRUn+A1r1fId/dxWQwwCSNMOeIQynmiP3nGJV0nC3P8jxPu+Vzo5TUnMjx85Te6KLTH4jfkCswPz2Cm0xgnk6xcvEU5uAQ6WqOcKXHPjw0SPPBY3UgqLdnrVinmhUjiCtLHwNgTvdlkCFox+j0E4RnMarxOS6PxginJaqiRkgOv/OwiVYG0ORoS+MvGm+jem/rFv8mQxii0/vkJQVWdJ9p6i3fDLqg2aQDltFpk2MU2TMh65KbszEy7MswoH3ukmRSE3TCRdyK4RPLD7ekIK3Z8SJCe7CO7q3nMEaGC1eg1vqT6hjyakASoX1jBf07A0w7FQqi/FuRI0AbSzTsI1XbNfp6PZOVim/URCzWBsFa0zRYMmzW1X7dq8SvCULJg4XZW+BBLdLmFxXSSBDJQN+b9sHa2iUgywNfsqXXSkn2XkgkCSNfLTZTpaTOTAzLKKFD2E9e0yvpFYwSW11npHOOMvGCCgyS1TYSakxqi2I8YXDM1QsJCO+JmspB0gKK6eQEF+/tgBCzucXD+QR//fpr3FzbwkvtNRn2iPU8eyz1bvTx6uuv4Zsvv8D7b7+HFjM35fuV6lkRqTE0VWTuAvjPP/+Njc011BsruEhKhN1IWAWmxOjkCUZrN7G5GqGDlMPrSORalZpYs3T+XUdQlzHeX2pqPaPUBT44VM6lFnNbQmStTQxv59jI17E3eojR9yc4PjtG3bYsNwlUj+0qx95j8EZr86o5b3h9xmljAirO7jGznp0TMzlq4C0WACdXzeI1zH+Xxhl7EVVspl7ysIFME8MK2FztY+fZ53BzdQObq2tM+V9UQsJSNk1ssG2uz9X6tLmQV67P9brS1x08BOZnNWDWyd7TQ3zy7Rc4nB2jDCs+PxkU8WaQ9LzTWkzk7GQ3f+/7Rgy02CPWrkGtF2NsoKAENZWlh5q+4DTe07NMPJucmJnQmoIG72mWinlmXYn/BQ0YrGuGx34AwzLySnojSTvSe6EZ/BHt5wxwLvT0/qfb7XIfS3UJATtsysjmkSH3LVRrZQn5DQjoTacrree8k7Ppnjcq9K9LAwh6TW8ESPeePy2dPZpiQHsDpa7w3kPPA9UVjFtR8381ZtCb//1onSwNQfjpoP3LOvwAAAD//9xdW28bRRT+Zq9eO7GTNCEKpZTUNCRNiwq06jsSvCCE4Ln/CR74CwiJ/wBIPCK1oKhqaUvTXGibK3acxPZePIvOOTO7m6YR4qEvWIoSOfFtMjM75zvfxdMmqocQCkKvmG7PA+EUhnyOyVfmv7V0iDPcVvNKnBINEEcEGt8Aj+kMjoksssaCp+MAlYnWOKW7chSjLAUbwMQbjAgdyyIM9ynH9hBOVo0PkUMrdaxVCFxcaGPu4gU2QVJByJE0NGFsl8siQJY2R10jRvUCF+lwgAcrv+OH777HvZU7vPzsFU/y5BW76NM2mKQD1MMQ1z64iY+/+hLvf/4pJtvz0L6PuKJ1ogK274C/qKOzhRhrwx5WDrbw8LiDzXSAA2L9UGHiywWCNwfSAg2GTCcskGpUtLeVjoA1HqQDmZfLuMpjaBIops5mdOFwHOwN+9hb38D26gb6O3tsHOhrQdEGSYxBtyOT230JnFW2cykaz9ZEiynG/P8+NVPKG03k9pVF3L59G99+/Q1f5FxT7Nr4f98c1ul84ZkuDlsVKp/NR2AWsTYJCLWQzJdqmJ+/hBs3PsKHN2+gffkyLlx6BxOzM1xAoPBfDktCKZtOeq90In/pXZea18q9PIspxoQ+8MPHePDjL6j3M8yOtTDebApg4Qhh0UZXsr8DmYQQRccLWEVcT3IM97qsN61dXfhfeABUO78nWCDmVoAAjltcjPKKLpDNGJWHdJQiSfrodbrY39/H5sYzrD9d424EmfbtPttAnsTo7O4gjzWSWICuMKBCvy46PF+8SNjUTXtwMpuA4vAFt7rhJ+kQYRShEQZsGjQ/M4vFq9ewfP063l1aZDZR1AoF6Q1s+ZazuRmYWiwSH+6kWlUp8TN1hr821xAnA7QXlgwo8fqYHvYTEdhJsqfO9nOoLOHIL9YrqgReKPtzFNUw0RrHQa+P7vHAUEfN/u6oSjdWCZWYXd8T7qAGjRoaky3Eo5SBGTJCzA313tACjJlYOcY2SklAAqfQ6FOx5NcjDPOM6f68bms+/GYD49NTiM6NI48CpiHGDLZo23Qsn/uMruiZ46RKZgBnvY9G3Cli35Q4w9GLPWTrz4HtffiDhPdHAoQobpTSHSbHyXTPQ6eXMF06czMcBx7yVh1jb7+N6fQWjn67i7CTQpEnAO9CJc21rEPE9Z7y0ImK72cxvCzH5k8/o/niOWZuXUc4NY16cxp/52QAm5pIvEoHyJGqw+pZJX5IgAAujvRJOvlpLpPwrThyijT9eSZ59LSDUWoC0xslTYEue4wFeCb6lu7ONCIVIKSCJUtR1wotMgE76OF4ewedR0+we+8PNEZg8ioZ40Lnp9gZylxbGcZKMwzJB4EMicMA3vnzmFi6glq7jV6ziaMwwICkhlq0ohbwITCDo8/0yXHRNiorCOA3JSWi1hqHqtFBK0PS7wHHR3D7Q/iDGHqvi7x3AIdkkvRZ6EyjbdylTW8x41n1B6jMqRy6jC6uKwZnoqgFtxVhfLKBpCuMAPQ1ssMR8kQWoDbeAHx90gKScT2Xw2hKldGsCtA/KiK7TFfImBKPCrCrXCOqEvtZ7VKTa7c2AIZrABVtikgCptA9gt7tIKCIKl1dbye7/9oU/wPlor10Be7UGzjmA40ra90h9mMCXQfG5poYn2thFJFGOxFfghOXYwHgmaVgEgOqjaJq15/Oq7Tnk3Tb/mxp2+pM895X3xybF266biH5Q5B4J5Wii4sHY8RlvzvGhIv9HMi82vPld3HCnTybakXnWHo8zUd2yue8d1m4uognth3SzAC7opEeWbKFB95/aV/kJkx3wEC2qkS5uJZvpA2YS3M4F5CO/ELYuNB1sHZ4gF+fPsFbyw2C3bhQDljcKkyU9tVFfPLFZ1i9s4Lt1TWz6yhuYCmUEpgQok9+fPcR5pffw8zUBDQBSWSAGYiZdy85xP3V+4iWI3ghweyy2j3DOPu3qNv/cpNzXXk4ptNpwDOe9qwGFmYv4c2pOTzZWMfu4S6ebv2Jw/SImTsZe6DVjIeVMrNa1pitBEgifIKhQqLWVArYjH0W3IJhrAtTSSVlPM3PwYiNCJW5L3RDTEydw/zsRf6aqU1iDHVO7aKRSpFUPv3rOClKjZIozakbj7fW8ay3gzgfotEKMCQzOdo+LcNsVIIbugLKnSU3UE5e6vaJrVVECJe+cQSa2ZQAmf9pEf1Hr0HFP4Fs3OF2nYJ9Y2uC6uta1jpQRs7z+2DjPQHDuRlbeb/Vx9Nr2PdaNXnk5zPvz2b48xodZVz8J6ncVx0L+m5rZJa3B6d9E4hxQoAEPRcxHYSxKR4EUlvT+UrGRgBI8UOgnyldKo4J9Cz1/9VxyPMc/wAAAP//zF1LbxtVFP7m6fE7Jm4amiZN+kgLFSgqrShSK7GoVLbsWIP4ZYjHDlVCCAkkEOoKFQkEKVCa0jSkUZM48fsx45mLzjn3ju2QtAWx4G7sheWZuXNf5zvf+b6/aSDF8diCqgN0WVz1ocEg0MZr+CmDjsUcVJy+GFHM1jdyBFpnAAdo1O4gqmcAA+M1TMJ6tJjFnT7qOzW2OjLBfIzEkAB4whEF+8W5OcwvnkZlugryrqZO5JpI3SHUeQlGqApb5hFVq93D1voGPvv0Fm5/8zUfCilrENmChDtUr0UoHwkS0v7kAa+9+Tquv/0Orrx1E5VTJzCg5UALQFFQElo2mgB2oHAPDfy6v4OHrTrW2zVsJx1YgYcubS40QVypgQ/7Jntpw8v68r7GIvHkAJLNIiRmk2dl6BELQDL2HjyLAIU+Ov0+doge/WADYW0f1iCEQ6q0hBYPuujU9ri2v2jpjWTc1tAccGwRo6pOV1EoFscGW3pDk/dH/ee6eP/d9/DtF1/il9W7vMlEtkCjbD1JS1Bi6gnFL5olrlQoug2IcXy2isVzy7h46RIuX72KpXPLOHlyAYVykTNUfAOsIxDD+EIgDdQk2ywKpc9LjZrMZqeUbUIrehFWP/8K7d8eYTZ/HKVCRShKScJ2X/FYkMHilZagfDRfCDTxMYBDAnLWs/Lz/99mwtnxg7xtTQIB4/04+hQ2iTLfEsmc7z55gsfrG9h8QKr8W/jj/kNsb2yiub2Pxm4dw1CyqbQI+zQBQyDjZpFl0NFh1J7Gmu8Emg5tsfUZUfN7cU8ETD3JzudzeRSnyghyWSwScLR0BqfPncXCmQUsLC4iqJTkUG2GC9c4j0pDLJGh1w+tH87o6bHI1hA//fwDPv7kI1y79gbOLJ/XNV1+ysT6r5sJ271MFrMn5vF4bQ377RaDsxkSQKUTciwHm2whQJGU4vcaXBZBeMWAZ4piITz9mmAI1FE4ZAojrdeU0czOlFHO2mi12yK0RlmxWDMgkkmusg0T/Mv75kSkpel+VB+cocA/g2ypgGypiMLMNPxSwGAA6Z4oXZ+sjJ+29fS6xvHDma1Glk0pYm6YUpZWkWDRURdWmGDYbKH3aBNqa5fp4KTkTvRXEgOljGjWLcBxMvDjAE48QDuO0IkiVlRPEgfDvI3j5jEbAAAgAElEQVTS4knklMLenTuI6zacuI0gzdqM/O2p1pm6ytX2pdTXgYqQ78Xora6i1qihurICnIoRVirougoDCu5jDTilkdhkkYwyX8U7N90bDm0EkGl1/0QD4iHRTGk9dXWQr+16CQCgvcYnFXyq948SeI5CkdwvyKqq3UPQaqH3eBN7v99Dd3cHSbPBZRWWEuDWw0iszLDGhOOlUutauhSRC8KpEooXluFffBlh9Rg6QR5dEvjlw2QsNfd6URGKvuQ42ZVA75EcPNJ+kLFhlfLIHisjV5lCMJXD0LXQbzbQa9bhNZqwWz0knT4GTQcDKgVotRC26uLMk5FxYqUlMjbvScbO82mNASdPU+BJUyTIwM4HcKeLCJt9uI0h4naEAenJMPA/ZMCJ5pLDBtB2WrqRvmWzJhkleFaiS1J0ybHUqHRAr8uJStJcoZkjiXZHSWn3OkNta8uDTBTD3W+g/2QXeWKVJGosk5gWXaTjjmyXMzOzmHvlVTTyBVjKQzToIvZIv2MIKwfkZnLIzxWhpmzW1YjtfxfUGCE+OU+KB7bjeof/9ojsv2kibid9wXR/iCYVuTHRm/bGyl5dZwQgM2Cgg8MRE06llmWGrSRaWfZEMHLUGmYyhb4vjlCKWI9KfL2HlgBC7HhCuhh0dExCdlMaF/Dkp3VkrPIZnhJcfKMCjBOTartVx4+P7uPCzAvIH5tnpqpv1kdiwwU+Vq5cxvWbN3Drgw8x7ITM0Bu7QvrElDBvNYHvbn+PG2dPwC9MQ4UJImuIoR0zbX2ntYu1jTVkl15ClhxCqFCI7eae7zx2VPb/WaNHpdl4xfOFQCLXDbCytIx69zjOL8zjz90t1NstbNa2Ob8TUUyjF03PVhMijQ6Llo/+n5hM5ADAZ2A9sdKsM+kvRDqgZEcX+SwSu7BcxlSujLnqLGbLVUwH01wWlWGusadBOqWZoc/zpP+8SVbf5YNOiAHWa1tYfXgXPdWBEwCDuKfZigKkcHKYXMyIUUWBOQWvvicClzpIRjIpqpfoWnVxbhJdG4ppzO9NaYCUkcc6wBVWDqvhZ4id7XMAze5zZHHseqmy//j5UzLsxMpI0v8UhrdxvqPsOdmuS5x7mIgh/4+o96b3ZljrJmtvYmSj6M/2h5oFf7DR2kTXjEns85DrGa0CilsYONQMIrKkFjFA0fFgq90xS35ak6hM1TCgzPNTk/dkQyUKfzF3bb1tFFH427t37SZOGjdO0kvatIjSCzwgKiHaF4SoeED8AsQD/wTBX6KCvvEEaqFAadNCbzQJbZM4iS/rvS8658xs7JBWFQjEvEV2bO/uzJw553wXW1sQGEq4QXP2uUusKiTUKaOHaiohPJ0s843QkG7dPR+5CJoAVC0VJEGBMBywWuro2LvRaX0BrfavxQn10NUPrUVAwd63XITdHcTdgXAYWeeRQX1VkCuVRU+7PY/DR47BnZ4W3+A8r2BZu9egvCdNCa6uaWB7fQPffH0VV698iTJPuRYqwbMUy2BS2qZDmkWHmRxvvfsOLn70IU5fuojg6FF0i5iVh0OyGqLvpQ4GgFv5Dm73OrjZe4Y/ihjrcYi+kyJh2wgTQa3OjTOe/KMT2hDLK742VeEpleXJGHJCQ1x1lV8l/6WC8ZIitZHErIg+3O5ic2UF2dYWjDSFq15jSE93gHhzCyVXjJX/5HM2Z3qkBC0OfH/f18feS7/Y8TD7yil89sXn+PTjT9DZ2ebEmMKqp6COo8dYaqoenp/HiZPHceHtCzhz7hxePfs6Jloz8JoHwaaupg72ZRWUhFckerM5PUMSc2N7RUNZ+e3Xm36ZodhRdJCg6uTyHax9fwuHvSYm/Lo4SRjYLYCNHLoNnSSbAiuMkpiDgtmssagjqqv4O7/r/zn2ijOO/k1FKkocqbs/6Pbw8NEDrD58hLvLdzjx76w9RW9jC3F/yF63dlKi7gbsVuK4NRiuyc92MgiYrkToHtf3YVEnN/DR7fc4iFM1nhJazy1QazUxO9fGwsICzp5/A3Nzc1haWkJrfg71qSnAc6V77VkiqmmTDk/C9ABehxWvzRRRltKsMD76PJSTbWAa4vfH9/HTzzdw9asruPbDNTSCGi6//wEn4Vp5+t8bQuFqTDTRPnIUW+tPkEQhvEaDE+FeZxu+Ix551PEgjqajDqZpXoytDoGHl6xgT/shrSMuKHo26v4BONN1+HHM18yuG0nKqCXSXUijmDtgfMcs5d+tEg6/4UtRgiro1O2fabKoHxUAqLhGayIkFEiRssc/rRcdxEWJN3tpfmOhGjl7tQAqaLEKwG5qwiY71c4O8rWncHohLXOYUQo700ViMJTWtRzZLwsSDoyQlQMMwwhp7iC1TWQ1G5MLbRwo30TvxxuwOgQrNVmEjoC0hlZl27NHyAG1wKQtfuDJ4xU82NhE7XwHwZnX0Do0gxoVRUggkKCXrMpcjDS7DCl2Kk0bPoRaxgt1EEyV9QlSQCzkuH9tlaxYTsr1jmtxDGRbS9NisVYrE6eDGv3fVg/WZhfZ2jMMCFZ7+xfEG884tngMXzSYB10n5A3NsdIYF2ccmXV0V7qEWpltY+r0GZgnl9CbnUW/HiAmH3TSeGAXGYU0IQh+FTiK6t5S4l8JS7oGd94J+l9rNmCSq4PjIMoTDMM+ysEAxmDIOi1OlMFJchjDBBkVM7a3YTs+xw6yq2RahPJlLpRlxcusaM0Som54lA7hkgbBZAO1KfouINkJMegPkIVDxIMh8ihm1CPxhe2kELqENUrzU2u1FKoNwd41hYJg3wZ2veFHx5jat/nXSFgqKolJZ7qMaBwF7M0OvH7IekdjWi4KDVgVFWjvMU20Fhdx6MQi+oGLvJ9x8ZWslY0gh9fyMH28ibRuIDSjfTr/+8xRFTuxp/OvBx2YhZtbijibdpHSsOIXLIBRLSr92aydYYneCTdflC0XVNOID+vKboyhyXQ2I40sdh4qeI0apJVCaEwF59dDJzk6YaLvokR/v9/FPGHiM1uaMmYKYonoLZ4DZ7KBPKECVyi1oUSUHg1VUKwKY6rDLudIsj9LWRSUiq+rvQ6uP7yLYzMzOGA0WOuKEnIfLqIiwfziIi5dfg/Xv/0O928uI1b6KmVV/hFwUKZ6VI9+XcPKbys41ZpGYmaMGHB8h7vJlAjeW72HuYOzjIJhKztDoeX+o0HPhCg2BKsnC1y/4WIir6M9Pcfivk8217FDFq07ZKe6wWjENOrL7FYBn9DHWhyX91hq5Jh29cyIWoyRZIxQQr7rYTJowPdqmJ9po1Hz0WpOYypoIuDys8M0BTY2JgRBISgiKeQ8f+4Wxj8vC3ACCwMbSRfLq/ewOdxCZlNJOxpDlgi9pRAbT1O0ONi1oBQKElPHrV1HJlQIgYJtDQWSrhT5CZpvOtLkzSXXkBhvqy63RuB4HP9lfct5IkPGRTqdnxojSvsaha6tPk1TPmd3/RHVSOjYrOnCSf64Cr9uiOv3CapOURXZypP0C6TpTR34CqmgrmNcJ0Q09yhZp/ftZ40sjnriwkL7DCEGoozsCkXHgIT6dQFFnBPETlB//uh3VfNCUehLq8SfAAAA//+8XUtvG1UYPfOwx488moQ0LaGBQmihQAtCBbGABUgskGDBir8EEj+AHRILkFjAT2CDhETLQ4AEoqhNmqRtEpLYjuc9c9H57ndtx7QCNsyq9tTO+M69d77HeYSe+lGKwmAYnvjQJH9AFA+rsXe/wJSKUgc0GFmg8CYTtuBEHGRQNMGmvoD7PrmhVGhOs9HN448KVVER90n+ITZfrtqaS7U1Twu0Kx91nCE+7Mn3uTXhvBpzBUYuLJ7GytlVLJ1eQcnKCm9iZgUXGLdz4KwfoxYfygpFlqBKEvx07Rq+/PQz4RZL0iw8JcLjmfwbtA0rpPKYwwuvvYBX3nsXT776OpbWLiCVp1hTRIlyhDhAhU1zjN+ODvFz/09sVwl26wGSkAI4kIVFUUOqTufkQDuPnlpFkQQCqA/Wk8a3kmTKZFFPc74OdHKIZzara74VAmTXP6JneX+I4e6eqP3Xx0MgTa0PeRiikWaICg9mdx+DjU00SmOTZRX7mz7ETtIHzp9/TBAAnor4TSEhR/+WzreVrMXLb72Jjz75GB++/wF++PY68y341VB4Qw+vnZNu7OWrV3HpymU8/dxlPHTmrKgwI4hsl19bHyc78yN/Agt3dZAr32IHGuFkoeC/p18M8ISyUKUWytzv4+vPv4B/r4+VmRV0o7ZFUTBBoQAMux2Tn9cpznNJPkScpkhRobO8gM7qGWCmq7DPkRnF/3SMwZvQ8Tv5+sHjAQ2wBBZPuy2jQQ0aolosm3Jtz+el1ZegKB8h/Dubt3Fncws3b/yBg9093NveQv/PQ0kY+f9Cz9qCzUjAWqHJDr/J5PancSJe+wyMCwr8kb8ZNnB40BOIeKPIxe/39LlVrD1xHs8+fwWPXlwXVNCF9XXL6RKO/kTdqOGNXrDgxr2PIxB54+KMJ4FcYTnUApsqRRQm6ffQ272L2zdvis3gjRu/Y2trG5ubN3FrYwPHaYy9nR1RXW8Sfs/Ho4rFWFRP/S9UGh58iHimdv8Dd//8JposuK09hu3NDQxpnZMbUI40TBLRI+EePLPQRWcuwsJsB3v7RzIMpTYaa8f95md8D8M8RcluPMeH3D86AhCOOh8has7Zn6MJR0xUQFHJ/uQsfZg8UVyKa4MOCeKbzLVC6z4ptlQSeBKSTeV6a0OmP6fhEkYlUnp/LypPHuFUlb1WW6xxXKLnPRssUxvByz2U+0eI/7iFcnsHzX4PIOUhLuAXVvukiFMECxTkohOBJx3VtCowG3JdJ2rL1UA+28UgbCIjh5E2rte+Q3YEzCJDCzmadWZFtUxDr6YaK55jbFHbFgG2GEffX8Px9iZOv3gV3XNrOJ5bwKFPAUJfUFRGfNU9bRBrUI3x+PFZcZJpN17foW9G3WXeWybWzVYodLgmCyMND90oFLcbJiMmzTGHABF1hZIS5b19eHcOUN/ZR3J7G8nWDoK4h1m3tpQaIp3FolK5qZO+1ZmY44byPily1fIyOpcuwTz1NIrVsxgY6ylP2LI8lSulVfnF6PfYTqzlkEacU2Vmu740Iprvor04i9ZD8wg7LXRoH0nOd5ohGxzB0O/8qIdwmCPKaphBgqgwOOgNUMxQ/6GLZrcr64N0QvF3hq8aL7VSc10QWguCRszSzFRsIwGlkXnPM0680rQAL2KBom07+sNUrBq5jqpBAm/A+Wn53BJkljbRIxXTsooCi6RSBA6dmqSgow2eSqDJxqIWjYr/uWtSfql4YYdWk4NUHyIhFv02ov4QZm8P3ZKaS/WoWKPC/JoIaikgMPA6DTz3yktYffJxHKQFqngbaKYoowbmVmaw+OgC8naNLMhRSEvUPLBA5eYIi4uBF7oXtosN24WwwmgqzOYsvtQiy9pj1bJvu2MyyHdHNVVUcBpWtcbETEqqXGG2TB618VC7ayhVXJE2eu2WJCeECDtbOKcyb5EKVtuILkHs8DGByAtLEQgCT7t5taDiCBO3ttrNkTWdH1rvcBbUfK5LWqDWgdi5VhRoNNb9gUWPyjikk9oyy1jVYj3ItUw9rF6R4ac7G1i/+zCWzl6UNUjguSRZQhUI8MzLV/HGO29j69YW6p6RwtnkTiL2055F8hSZwfWvvsEj62sIzizKI8SLQin4UsOKVK7rv36P9pUWlltLaFGbygtOCjk6qunIyWVqP58SDfyniK5SijAdSiQx1PiQltOhR6eStjQSu2EHiyunRKSS9LY4S5DmCfaOdxFnMXrHA9FuIk2WyI5UqNSVhWB75Sj56wRtSVgZa9AKenl+CYtzp7A4f0poZvOtOaFaRCJj7uve55A0vi00+GNp3fv5+ju7VGPuU378hwByGi8W0zXNN/hx4xf8evd3xGYITlmhcWi8zTnNorTcRz6t1OVG8jcm73SaU+SKp9ptzLWY9olQuW9zk5y2h14gc5ifddRzHi1Fa1tle2tRz3UsEHpF0ojvfxiMOPqT82QyiXeIn0nUt3uPtBy5MD3P75fc1j0kpXnOvURjwQkaAd+nlTLRfpONcNlzuF9MuEW4hF109JRSIBoQKip54m8qmoj5snWRUNSCvGcFJaVYovub6BK4PUGvY1ooUHRGGiH+AgAA///EXUtvE1cYPfO0PXYcxySkCAptKZA+QIVCVbGtVCp10y7bv8iuq7JsF90gpKoUKA1JeQSwU8c4ie0Zj+dRne/eOx6HCKFWbS1FiRwlGs/c13e+83ALjX/p4myNYs8c+zMxOaLJmlNyFRTNhtb8GyPALJ1lDkJ3o40eKozHOtZEIaSinfA9eH4pu5sLuok2KEkOzIvdUUYKqZvgSJwai2U/VzRx6Gx6ZQKTFsVgKtEqGbxqDX6lJpo/Szt9c+JKB8mxtU+BQpxySx3unj5+gu+uX5foE1f0/jmMX5KXG+piJgff0x+dw7VvvsWFL76EvXIMIdTBnpwBuvk/wwS/J7u4032Ozf0BdjwXQzdDVPXEvVq6iamJ71KHU9JDxMAqM/KJWTRQrjsmlnbDScRo0VP0cddT1BMiy0TiUmafT6VgESRummIy7GO38ydG233JrLcIoJDV4DuoOTZqEeD0BwgfbSHZ7qOeZpqamR9amvAyqlXg3Nqacqt8xWJTgALaV4if6+rnn+Hi5Y9x/5dfpXhaaPg4utrG6vHj8FptoBmow4XQHwNNHDVO5dacNn9ua/gXWqtysMpNzGIu3NTejz9hcG8dp7wAjUpDxlrm6PFIDY9jozyimREvfRIDdtkW9sIxTr25Ciw3iw/xul3N//ul1HSzjYdupQSc+LziiYqFjKMJdvt99Ho9PNp6gs7T53i8sYmdzrbIbKK9IcL9oZig2aRPZTlqpNpmrqIYO7Pula81UTQFE8CJFLRwgkkUY0Kj0moVjaPL+OD0O7j4yWWcv3IJb595F8dOnhAaeaqlTUVhqKOCCrk+D85WptdIB1OJ6rPlwGLrvqpsCtz46J/R66Hz9Bk21x/g4YN1bNy7g/3+DrrdLvb29jAYDHQuq5org35fkk6CeksAi/La+c9f2YGZoD4D36nWF7Fy4qREzOXZVCQnZEgwDpX9huo0RdAIUKt4CHx1j13tsaGKfz1hc0VhpD+KgIucgnSeV0xw+HWv6Ibwq9Foy5UUCTHQB2mCz9pIh3NlKl3RTOn/dbfOaJHLc6Hokv/N6WHoztYBhFLCGvSBOB2Ogc4LZN0+/OEIPnW7dIiOU4lkEuYPu8o8aFdikB8ZtAKJLrNHak5vPxtJ2gQ/bxz4yLxFAQtalovo7j30th+iPkmwBA9VAZfLbs5qQFoayDa1IxlcCZklSRd/dG+gufY+2peuwGq3UVlqYMj1iQVCrhh+Ehso9zGbj0ezyvnos/cTDaxYGlQh8Fup+Qqo58Gd1hY8tHAvyNQma/VfwA4TYUugs4PhxiNMnnQwJbuEh+pcsaWSvEhwK2wuzdfsUdgCRIvZn1NFstSEd/YMpiffQrJ8FPu2h4hHcjvTatyXnu7sYWpAjUa+sq+zs1pzECw3UF0M4C0Eokem1C4a7SIc9BGyuB2N4Iwi+FEs3XaMJiIFsaIA09EQMdly1QALVlOANSZqpsXGMyv8X2scWoVxvlqGdAxfmb7tLXrwGg4aSxU4kxxONJXmhzBrxqHs6QRK6RpO0z7laeuK14n4IRAg4Jkt0YQ1sgiJGcSZjHdo0yxjeUumh7jV8/9KNzeBw3nOw/hgn1xUuCxSuU6Who+Z83IY5d9bwNkL7+Hch2toHVnA4nCII2Mfw3oF7soiqm/U4TRdTPOxUMPFlNnSKRmvmNsmf/vgz8XQ1nrgYiZJapWrvQCMXvjw55NrI7s5I2otKbB03JuYykIlpGQHcv5lzngKaOD+QrZpHA+lOPFKjawy65Tfx+NQvivTwrTw0JLup94f+HvuhQKKS+FlC7CVWQowY1cxaJJVRvZSIme/dDjS7EMNyljqZyszQUN2ETloUiB64T5ubd7HmfYqKpW2tnZUdsRchurLR3Dt669w++bP+OH7G+oeza0iRi6qZLLPH+xg4/Y6zi5dQu4qUz0x+6VqL09Eb3/z7i1cPf8pVisrym/Esg5ld/w3LxtzHAyyX2wfzVoFedDCamsJkzxGnCoAjgAAzdPHk0iKLLHgNl1c8UULpAYiOzZwK6gJqV8lddnCInbnUk8cfcfnB/VhZf/LY1dR1f9+x0g8tewMD3e3cHfrN/TCHnI35gZfyMJRSnQzRedBAJ7FvxTN+jwmTvnTRPuWOHKdbA7LnJR60RO2uHS5NUOdnW0j5TH+AIoFnhbFPq8jjdOiG+9omjv0fFFKqJebyuX3SMeXuHoyfXLKCWZrgwFxOB9Vg1szQrUPgMitS//roPGeeRmZfbnzb+pniSvWMgeutebe8p4Vnf3SMw3DSDHmKZvx2MDmvVVgTNFYJ+io5REiRzD3L8/xFwAAAP//tF1ZbxtVGD13Zuzx1qRpm6atiKEpIUIpUqVKPCOEEIgfAX+TBzZVSIAqVaoQaguiaRvXiR07sRPbY89y0fnuveNx3CJU0clTEi+z3OVbziIigFK5KXDvTZV0bmXgFBsleChYXxiIkp9XHopiA7L4MVhPNcaTiQghuAoNB4QsZFy8vMU0kl3a2Io8CLQjni383303L1gSUXI6YpPMerPEckzN0IwLs4Rnxkk5sxCtwC9LhymKZxhFY+FeZ5afSj6FQLnSBL2jI/x87yfc++FHJOyYeyXDSWdwiEyqdUwjanUfG1vv4pOvv8H2p18gXHsHsU1OaefXRoq/McFvxy3sxUO04wGiisYomSJOPcQ2WBd2j46ReonhxTJgVyZoksKJVedVDqqaZY6YlV+oQwcgcxMkzTmC5cCTBF8mazTFWesQo3ZXOtcUKnOctqDsISDMj1ytgz4mT1vwh6coUzHdVffVMoyQ8fCtZhPbOx/Ygbw0/vPzx/kknX8My6hev4o71z8DCCsWZeFkDq+WFl8qlcRid5RJorOQySw6Y+Hz30LnXPiq5A3F9I0vA/0Ofv/2O1w4GWF9fcPwZgPPBtiW01SwFuH9iy2MiJ1NZUXWWLm//OEWsFZ/K+f9/x6FBXIOfDdHZiytTgfHOHzZRq/bxfOnz9DtdKTD32q1cHoywOlgiCmDnpSInJn4YDNAYoW8zODVV7Z74807XPYrZoS3+iFG4yHG2QQRwSSVEDd2ttHcfh+7H9/FR3fvYHtnRywY5SjNsXH8TmVdHXRRLMVeBi1QRZCS4jbs0Ip151TEAWnj19nfE8FBuZ4XL/Hi6T72n7XQOehi0D/GdDRGLSyLNQy7Z1dXV1GplmW6niYpGoTfW2jH/5n8Z0u/WRyMKNxmCOsrQgPo7f2FcXcCRQ//as1Qf2g/lGjU6+yIVlA+9qBmi3PWyYnJOE4I7R/JfC0rXzrCqW/sgEgt0rbLZMTEzTwOLOcZ8lrP+PlLbymTpITBsigIW/ifxTTbcWb4mgDm3fHzHfzX3YlzwYnbSx1XLi+6W8tXjsXoqA//eRu6c4yMavAzWkB60gVRAntNQWHymN2vJEIaGP0ZHSrUSxVaESCKFYb9FDijBagvwKXoYg3BzRsi5Bo9qaL75JF89kWktggAUYKGRRkZuy1TwOHn05qwoeiuw4Q+xsmDh+ge9LByexcrOzfhXVrBpNFAFISGA+3ZfUalOfTYZ5Cl8Qq7LbOvsHMrTjslA/WvVkNZ0ri3cyeukGJDWPxoCjU4he70MG33MHr+EtP2IaYHh2LtV5WMNrblQS+HsPp5eFuIHZz/vag7BEhqdcTX1uFtbiLZfA/x2jqyUkNcc7Qeyv6YWnE9907f2QAr0xV0+5SISbIA3qggXKtjZeMSgkYoWiB0YyFaiXoiOBsj7fWRDofQRBNNYkP5oL/kNJZr95MZhsMBdKUmwVV1pcAxd5m8mp8TULDPfMUo1d78MTgXCyO8l+VFVY4G2tey26uqnBIVeEkdtXTVrGXsONOtiDSBWYaISAz7N83geDoTtEVsEVUiVMimgKyrCQIL6/UtRFznXTxTpef510slVM5SRL0jBOMzea6JvcFzYUGDxgn8EElm7Il3797G1q1NBGs13FoNMLvsoTTqYXKhgijgehiJ/7pw4nWSg0T0v9jCivp3IR6VmBNuTjueeypdPo5/xiSkZ5gkYXl9eNPDcZgdx9nRi9yDdnoK1FAQK1LJRlIRK84FyywFgAm9Q28yrojEslOhVq/nsbOXixim+Tjjs2GxRZfMHCJ2oFwzwpaaQojTCfxE5w5Ksue40WjpK4yr3G3hpw+jER639vC4uYUrmxdE8d9h3zIb215tNvH5V1/i4f376Hc7piiSU6tsB1abBhbzmV++/xXXdrcQltagJxqoswCcSXedFeT24BB/7D2CampsVK+8neDNHl7h+RQPnYfTi+OjwiKT/eF+3fDKqDFGD0x1Ngt1QdPeFDWUdfPx5gonZv2We2lcCDw4qePCueUr4/IY/S9KQcpTb9z3UoJWTtCa9HD/zwfYP2lBVTQUi1e0faWVIpuuZcdtt7795+L980KbRWs95bp+C69XkoQLQifNlnjx2tqhutw0sYKcyit2+I24rei5WUpgags0SiyBF3nxroDAZJ3FB76WVHVB6vC6pDDLONMU0Icjw78n/YCTyRXoeDjku6OoFxX65TvEfu/1a46sT+59LvZx75ObawsO9kbXLareXMxyPjbP3+euCxJH83qUwj8AAAD//7RdWYscVRg9tU/39GxJiElmYlZRUSGKBmIEH0QR8ckfal4Cii8+KSgIhoCZjJKZSUjSs/ZWvdVyS853762qbhNISCyYp5muqeruuvf7zncWWS35RuV5VjoulpQFQ5vyhcKRlVpLi5jqyb6me4jeQwwQXO3kblAJohhrq6uyoFnEpBYRrSIAACAASURBVKJMeHLRtsnXVJK8fN2zpp6euRaaQNA4ixQqNwukmFSOLSCqzSg3DxILS2qUaBLIiX9zsYUojDDxJ3I+kSlM9SJtQYQsmWDzz7v4+cefMOx20XACnU4lef+k6TuIoNFdOq9+/t23uHzjJpYvvQN6YyYmBuUQwBZGuNM/wL00xn4+EdMmuq4qX39ZaSTITVMZRFgiL0ilpHZRVRRax07CrP1CrRkSEwg/1G6iNJ/i1K62eQpJkqDANEHWHyI57iLZP4TD6Z1QtB35DBgl46oMwXCCon2Iye4u0O1hieVYrnOC7XJmiX6WjMT/du2jT3D+wiX43sILL0B2wTWPkT4T83BZ7nuaxijURcaOkP7G33Ea61Zma5a2VC8on3dUxPZXMV3T983JD6Zj3Ll1G537u3h/5YwAJWEjEq0ykyR8cc12ZFGxAIqdMAurhlMbB9ibdNG6egkLZ97QU6r/zxj+BY/nX8D8b7jdJOMhBr0YhwcHiDs9bN/fwuOdhzIRP6Dz99ER+t2eZPQLXX+ayPealMLA5eSiYZoeSIyRZ/KRVToVbaNj6J62QI5J91IK4zDA2Qtv4tNr18Rl+sPr13H+6mVJfSB9VVoOT08cPItTKFscopTEkIpeb4ZcxrhR08W863SK+zv/YG/vKXa3H2D/6SPsbm3iaK+N9uM2+v1YxwJxiu6FssEzDpSUNrr9k27NKRqvaeP8OQSLLdz8+husrJ3QDJ3CTmJet6FPzem91L56WF45ibVz6xjGHZlm+7nOP4YXiP7bWwxFg9pciNBIc9lsswKYx9ApxVB0Sk+mkqDsGqdl6q8jibOqzMVMqSBSA27OMLTXsuByKjxT73GVNEdHUbkz/rHFM4q313HQREsK1niM5ChG2OkjHE1Eh81IJsmIFjM2SGa7uB9LNFCERCLoIPfoBK5Ez57aWIRy+4gnPRQpwys9KSiypRCr0RnJ66ecpbO9jXTQxWqRo0kQ3mSizIA4Zkabm9hVx4DRhAYmTx6jO4yRPt1F64P3cOLiFaRLi5hQL2jiNanFVrwJ60Ys71+tcnO0myUn0EXuaPPOwJH8/iZ1lPQ7yJU09UUnhifv0SHy/WMxSczY+O8dwB+NtFSHdUFJZLW6eHemWCkFRubZzGT65EItL8Nf34B/9QKys+tIlk9gGDTFk4JSkoxAjFfJUmxtIueTjjrT+6qrc71l3N3wEK2GaJ5siGklkyWUAeDyNBEwMjnuA51YgA2MEzg0UqM793AKNRhKCkAeC+8ayWiAcc/Ta1WrBSXGWZVZpn5P7fM3uyPOTzb/w1ybO/Ks8iuyDaUjiTwaIGqETQECCjPlX8yrZAW+uQQC2PCnU+3Dsf+kjelRD+5EaaChqIAKXtp4msqaGET88YWJtZIWAnIfdI501LGlM9nPsixIXKQqw1AVePftK9i4chFLq8uIWg2c9nwMVIEdpt1ESjN/XONRYZ93I0eorw3zj7onlHdNF643//WjnBYaCak1pRYTsWCWljv/OpE05pVrNxsEO+lk/ZurKtNb5K95JSmw8WS+mRjaXG9WSpHUA6EwUuoaXgFoTcSYylVZtNvpJ89lIzatlCExtYPPOkTYCRpeG5Ma7UeIWiHCSQOj2DM+UZoX69QahtwYNVtgVc7vOvCjBXTTBL89+Bun105hqbUuDFgNz+miK2hGuPHlF7j5y6/44ftbKMYjE6Ftl2/NGqDRIBv+44cDbP1+Dx9/9RlUaFIKGAHLmr5I4EU+/nq0KZ/p0lsrYrit/TVfvp19uZyH2XZ0/nUVPV4HfguL2cB0Re01uYE35fNxQ/PXNiS8MH+nJU9+4dcYvEX5X+qmtPVDn6Eo92DnFSSCM/dtI0RNahdX7CeDNv7YuYvN9pZE/nFB8bXJyIxcRtP16/cwe7C/zEz6Bo3pONmvJtSF0bKP9IATesJOOQon3vLc+FoWYA0wbRNLdilMvLBnGmRhIyot65Y1P690/s+axsv1G58CGcSxZ+JzSokih3MExqwpoAHMrGzYTu0tSGEj/OTzNVH2Mow0gINlD1jWkcgPjNlhHQS0axMZ6WRRl6kCM0wk8+2s10LmHHwN1wTrTUBfGa6NZBEIUGkk7gDwL2dX0htHEUZf9TozHtuJE8eJEmJnEYkDKAghDoDIAQlx4IKEEH+QMydOHBASErsgm0AJiRMbJ15nPJ61p5dC76uqnh4nQYAteRl7umfprv6+970lYDGcW52R5xvtoq5E8czUjcGCM04Q7ZqdWgoAUExr9ampMgACTH4lVBl14gxOXAqA/G41JO4JNOoNAxb4RmehbAMgbpmkRxSGMpFLMarRp1M9G/PZJvI4EGfWGJNYDq88IX3s7B2gR0ffYoy5eoSkSHFsrim0nZRmcBbx9iKzyO8/2cYPX32N+z/fElCD0xMiqKGdUnAhnOEeaiFufPoxXvvwA5xdfQWJNsAGNZjrTIRDD99s3hOt/5BRoDBawDwrbB+SyUFoWBfGCZN0Z8kTHpvCzhjFGe20NcifKhSoH+T9PDHlymSKRnmE53T/UYQ8zWWBH7YOMX6yj+H2LhrKxNqIUQt/FtFchhqnhIdDDP74E4N7D1Bj4gILjdzuX6G8mND8SpJduKDVPLz57js4dnxJYn+sf+6RaBR78j1nkVXlLc78xZGhDKQu72lg/GjL5t8de1O/ec/56Xl//W8fYlRlF5K8oEtxLoj44Xe/4NvPv8BbC+cwE89JHiynmBEngILspeU5JZROZRqZVGJTUnkNd4YHOJwBlq9fRbC8YgtY/x9lWy+6SP37j2pzqCeU6PL98EVzyEU/VCG0vQDxXqPRUBbuTqeDrY1NtJ5u49H9B6Ll/2uNk/F9HOy3RJtPsxLfZbF6HhqMPcpNIi8LZ06cxFyTueEOQaVxnDaG+oMkEw+BYTaSiC9GeIbNOhavXRBPiKurq7j+xus4v3IRjWYT8WzNDTFtLa6kIPa0mq6ybbHksaEL+A+5rBi9Thvt7V20d1pYe/AAjx+uYevJU2xurKO1t4d+t4NxLxEzQm6XzCJOaNgh83yaaUYGdfYydPodBPUYK5cv4b33b4jvAA0Gzy9fwtnlK9Da+FGUzT8BNrfA/8/m1qt8nfhiuNxrc6FtNGdx4vwFbO1uYbR9KIZuSWoubEw6aCz0xQug024jGnjCDlAInnEdJhCadQ4wbrXgJX3RRdOM3klfqrR62CmZ3K5M4aEqz1PkZy6j3x3jZfMEUcRXpUO+NVysNgnVR6df4CLm+rOKj63ZPz1oxjSwCxEOUuxttpDvHGCe5jp5jr12V2QSpJfRNHE+VwiiGAULmEEqcgrJ4CdzJAjF1FAmsLHCSYLXeYrRXk8mymwUE+WjTcOkl87Aq8XAfBPdtYfId7dFrtXUpmc1z2sCBIj0q/Jek4DdJK2AB+NBC+h3cbi5g4Wruzhx7QrGp46jO1PDIPIw8CEgBYEZKZ5UaBpooSeOBXwOrEQv1wqNuIY5L0CUpjjhhYjI9BhlyHbbworor2+gs76B/tYOwl4fQTJCnCYw8K05v5WeADnKmpBDWHpaXMAZ6UoDslwZ74I09OAvLUEtX4RauYBi8SQG9Rq6foixddunG7cOG2XkJqzZvaMv8zuZRDSiTCnCqwcmd//ULGYX5xDMNlA/1kRSaPEDkiklo9iGCUZbLfjdFLOpj5kiQO+wC5+T83aC9Ok+otVTaCDAYNzH8EBL9Ci14CfDFak3MuULo0YKfhbMhWnalC2gyzPUTa2qDvpSf+UVoMsYbvJ2AouoAgn2MpnbtW7splk8zyLbfFUiG8m4dA0H19wzL6+gt7GNh9/fxKDbx1wYCzDrMboyihCrwACnoYllU6lGk+t/Zxe1QVeiKWk0GBzRYpe9nx+KJOjs1VexuHJZEkbCSOE4Bw2jARKdo1fkYBL+SDQkDjhxDApv6ryGlfu401rea21MKjM7gJry2LFFdcwUHg6arKeBwFG+yZdgLWlivfzSI8DR/+PIDFNk+wSC01xSi5zXldCbK/TbQk+mlqyL6SkhgINIMLUwaaQ58LQwLRPkpY7YNPvmvsbrSgL+EQaG4UBWVpKN0IjrSMRsTSFXLg5Ndgg7vxeWJ/X1YvoXEsRuYj5fxHivg6zbR8gGAyjPeziRkU39UNYvaZz5ki5we+cpFjfWcHp1QUIBY4EcSYevQfspTq6cw0effYK7v/2KR3d/F6ap1Oi2YuBGeWmd5WAwzXDzyx9xeuEslt6+glGsEZGhESiMaRzL5BjPx08P7whb4/qla5jzZ6wq3hhsHsHVStDeP9IQV9mgwLMgQqEmjFp7wJR/88o1t7ovXfmKytVoettC3H+Oq7ub8QdwRm3uWJ7WoLlteZVH7/w0pouCF4AiFrA6+npM5/1PpAQ89rVAFLGslT0McWfjPm49vo2B7kH7BfIshR8FOOgeilzQMFZoTpeg3qhbE+MccVS3mf1ZmTxCg0PpFyJlvRESafDJhqGPA4ESYV2XbDwt/gmu2U5G6eRxSq9jwBJVWCd/HhlWfq6tu39um2A84wEwec0E+GK6CT3hOFjmZ24c9wNex8kw5brAzsR4fpprjJ3skzGWWiNCbkua95yyHbIPbENv01PYz7JOLG+3fQQfKyVW0vOKJJJsJdO809NOHqf1KuHa5Ya/RvdvZEHO48QlknANF48l6+/BHruw7KoSXNIafwMAAP//rF1ZbxtVGD13djubE1rTpE3TRS1NVVoqWonyUlV9QIh/xxv/gd+ABA8I5YUCEqgI2jhN0jirl3gbz4LOd+8d201Uus2TJY/Gc8f33vmWs3hWeASGm2AfVAH/zzQHh5Ub4RrlOin3HCP2h3zigqLi7+nvAlO9mDyyQheAk4CbmUUA8M+md7StZNiN2RYEYioAi9qwZzgXrlirsZZGcS9/qlQ0MiaXhaM5gipDo3EoUCi+zLjJ9AXh4AlMPlFDCWZpucPf/PPJr1j78ScMei2B6sDY37lF3S0XyNK9hw/w2eNHOHvjOtKIvtUMsHTn/0lyhF/2aqgNj9H1dVdIc4A1rF/4guK0oBejFeJhgJdbC6jMJmbpmKSdWcIWs6p0Al/wZc2LSOU68BCWGHUYdukvf4B09whBT0P0OSkcim55gYZ55hkWyGfa3kfn2Qv43b7Y1/kWVjn2cCOKvGWJdi9TwMrqNdx98AUU/b+NXQZObG+jz++S37xtf3T8/PdtqHOzEJ6Q0p7lAV/gu3V8/+13qCY+quUFlL2S9LkkGBnjPysTvDhKd7+km5PEAn3rdZrYi1sIPlnGx/dvS1Ep950PIPr35iPWdkcj5erCg5+CiXmCfq8ra6fZbGCvvoPN2gY21mvYerGJF8+eo0mhyMND4e9TFI1BPcwGF5oxMyAXWGtuAHHKK1wQWCkdDvXLX4kdEau+uUB9s7KCN1/B+TNVVJeXsXr7Fi5eu4qrt1Zx4coyyuWyJBXpuFCiMznHrFaUZLmQXVLm/zDuYKe+g936JrY3ani5RcTCU+zu1LG/tYvmQUPvCb1+UdTkmpopzSDNItk/oiBHZXZGCwI1m+jEHeFJs9t/8/IlfPXN17hweQVXb97A7JkFqIAc6ikkwjB0ToFhfyjox+nXcYyYX6W6iMriErb3a4gTiRY115fOJlMh3MhDKaKYX4xykqOf2HvUJQWt1ZUh6/WowijWZNKlUEXGXyRkyr641Ki7Z5Nve1U1JkLmmvXmGDsz5CPLJXtufkqn8G2OE/zijE4uPsJEYW9zF62tfVTYBe120dnfk+KoKNWnOTrNlhR8QieEG/fQaxxj9syMeOY71D/h+4VBeqBFwEKnjI/SBTRcoLvHNaLnITvddH0JFxdQmYmQz05h8LePem1d1LunRWNiWIy58JucUHcQXAUiOBJaRsM++gdDtNfW0Fp/jrP3bmNm+TzCypwUzvpTAQakBqTiVC1zmC41grxgUZdcYoosBSXMqhDTVDAfKswOOkCzie5OHd2tOlr/bCDZP5LiT0CeYpZof3iVmwRj8v8tumjmuZdEl0JDkFleojtO13cxd+UigpVLGFSX0F5YQFwqYRiV0JOAzZVCHgvAFGDPDB0QSkOjC8isytAedKC8DO6UJ5D/oFKSAgC5/1SzGjJIZZCZ6v140D5Gp9FC1uog7A3hEhXYj4ViyNss5Q7aLw8wS2HMaUeLkGWMj1L0mz0gDzB3dgn+dFnE2ORr8X11pdDrniI2OyG8d2rsonETMImUwhhXZdwCeAxRMBLy0yLCqfJNfGAguKQuUoSKSWI5hEfxQzogQCMIqYXA+av8UJBLVDtWTia6QF6jg8HhAdJmE2Gu7/G09zv3lzhNUb20guuf3sH8uXM6GVUOBkkP/b7u+qWiaQSdkJvmE6Oj1Hn9ms5M9c51bCB9UgeCMSgT8GTMco8xrKYLuIICpRXdeHIwUhBXEheOPMknrfo8A/1ld0343jbmZVxsOo+FOLa5H9fRBQCLhLW/4xlxtNj4oDMZks6fF02Mh+fxOwb6krCoHFEQYXDchVeKio5+LvQsiACg1IIiH1FlBnG7A9X3hNqk9R6sVaEyzgBGQM7R8SjnLt0/juIhflv/F3eWVjA/tyjNr3nBv6ZavFB5WL1/F18+eojt9XURq5wkhYzinzB3cHw4wNoPP+Px9UWUpuf1mKX76msKWMJmXyzcc1LMPr95B3OCJ9LiZ2kxMQx1qEjP3xX0fvJQ7xigvokezfvEdeMJ7OsEb///cEYFZZMjUYKaRanfN/7CHxtPcZx1weDfZ8OGTi3QbkrW3i6MiB739BoRRExuRPky6WAzp2RxjOvP+tMLnTzLRWtPmkLZyH3NiuJRI8Fa+Vkef5EXkjrjan0AQf+MIRt5kM5NlHco+YwqROiLRvLY87NIBOvkYX9nRFWYLKBwHEQBcc7T0UFYvnINrXNgD16PhUSreWeFe0QLzNAY5HqG6i7IejrOkZbe70kXX/afV2ihr4r0c/yy54h4vdFDExcFV4QTj9vUE9H7kNZF4BnmPgH8BwAA///cXVlvE1cU/mbx2OMlJjSCRAkFJ6RQCVEVpFa8VWorHlD72P6lPvV/9D/0rULqJrVCqCyFALEhCV6wY3sWe5bqnHPvjG0ctRVIlXpfslmaycydufd851te40zNUqFS5VSqdVZ0A5nKqqICMfPA6YWHkCCf9LyWmRkPzA6+KOWSQoAE9dEoD31Px9GMAaJBLXoAcPGk0BdiLBQKgixapSJWVk9JxAplcSSzi1GOuDebTfRf9bFJUgdLjkvIYxBMJV4jThCORwh9H7/9/CsbetlKuWgRgs5fiY5usFFVdXcLH9z8FOu7l2BX6oxY0+b5AMCdoIPvX9zHC8NHSoyDSP4XjrXjzmOs3l9qgiR5Pi/0pDGVBkVnFy/yXZX5zOyg6DNaPMmQyzYcjvKbjkJEbXKybiEZ+uzYXCgUpZgtFmAWS/wwUqHv+gHs9hCje8+QdI5RoQ2XPjflIK2pupJfbyIkF08LuPXV1zi7sy1YrPlPcljVxP6bz/1XY/H8iXYrnQPae0Xod47w3Tff4vjeHj68cAW1gqvoYRJbkiwsBhrhp80Cvygn1L8KcTB4iWi9jiu3Pgc2NzgSivSqy0mNJ4/kDQvHOJnM6LMMdpvudXvYf7qHw1YTzSd7ePLwEVr7T/HqZRvH7R5HUunOPtFK2Uk1Fk0c52TrjlMqDUoBCiNeLPhlTfR6mkeOLakAUYRyrYKV02s4tbqGzUYD7243cP7iLs7v7ODs1jm8Q5pgR5eh0kkU2vL8nJJQMHm5MxtpEuB4MODzP2g10dp7jNb+MwYzyIug3TmCRwBGEEp8T5Qg9Cd8no7pokSxnOTwTjThWIoP0g/TZvaoc4QwncKpFbB2bgM3v/wCV6/fwHuX38dm4wLThRMWB9nqzVng+0VFRKKV9anq8qbJEl32mw9zvskB163gzJl1dCt1WUzjgIEfWjRK1TJqqzX03I5iKBiqM5+/+/m+ksnp2Mdk7KEGZEyXtzWSdD47+F+NE6+hYhaZqtuoFmQ6d5I5jbsDDI86DGwQ7d0YeQhedsRcFSJb8frH8IdjOKcqKMLGeOAhHIRwyjVYRYc9DGJD/ABMkqqZgEvGnuQjYRrwDofsCQDl2E/UtQEcVLcvwCiXkVZXMHr0EOZxHyWuwaYZRTfvBuVddSMVaRrTFA2ZY8XYw/j5Hg7bTZTON7Bx7RoK6xvwt9YxMiyEnK5gMSeEmAAEgJctE7WShRUCOKcJyn4My/Ng9nvMTPCeP0PvyWOmjodtn30+CmnEEgFbsUv0Q6jZYnrDo2NotdmfrfKU2XqyWEFUq2N1ewvupV2MKi6mlTqmJNWja0RAEHWk+VzFsIwJO4mijNDTrhvIhhhYMWZdc1A6XUNtjTL+XdgrJdiuzX41EXd7iiKDjhIEgyGCfl8McQlKmESYjMesqXcgRoij7gDOix7KZ0/DsVL46TRrzPWfH8GxKqhSPGDREZPRVCn4KabNEAcE7XWAmQ19Nse5ALMlzs/Uv8/n/7InwVJ7tijONbZ6Pks3MGaZAGnEhQ0gB+L5T8kO5aKYonIlbrA80dAeP0r2Q99ziK7vY9zuIvbD1yr0xXWcjte4vIvG9kWWOhXdEkLbwCiM0Qt85eFhZpvTaJlJ1wmbA9PU3jAnm6dO1QY74rSnKIsP09dnPPaEPmzlhoCp6qqZSshuqcKfigU+H2oWKRkAd99smyV+LPPT+mKVqGXM7CC0bCNNcrrvnLzBEFNGzjLnbHOS2OZyCH1st1yG73l8XJMZtrJvZrNnW66fidwkjZgytDaXKi6KK1WM/AAmyb3CabYfye/c/HWU84w5zeew08Uvf97HxvU6KkaV21G2mo0EpJXqVdz47BP8+MNt7N/9Q2INl9wTThwjX6z9Fl49PWAwbmxMGKRzMnlwysy/0WSIB4cPEEQePr76Eeogl/yCFGZZluXbXyf/D0N7YCwbhmr0kNEdy8kMuYc+IvzeuoPbd39C1+/CcPOHTyjllFRiZS794KluzxW5enCcvKa2K/nu/N/FyysDsbkTnhvfLQM3iKFFPmg66i8Jojn9PZT3AZu48x7qZImEBjG0fx0Bgov1KjVs1YflM1TsTwnIlSY01YIEFojJIUnSpQlNbCDxIHiddcAgp3bxV3JtXftK1J9iDbEx/QKjJfOpEm575olHx4/kZ/qfJIkvlvdtGDIYQF9FLqUa+7aJvwAAAP//3F3bbhtVFF1z8WUc202iNqlD6S2CNJSopVAKQqpUiYe+8Rt8ClK/gS/hjRcEApGKqqhETULqJnUa147jeGzPeAatvc+ZTKuWJgJeGClKE6WemTNnztmXdfHzA52vbtqTsWLpEd6QKASMlce8PUGew6awKK188jttTNLJy/AmVk9sgq+ciGJ2Xj7UvP0BB0U6/gU/KxTIoBshKz2Xl6mtFqcqalfjKVS+aERzUhO0kjKwvbMtHTqxQfA0kCDvhcWI1DgaUFhw/dEaHt5fFR0Az0AvfegD91IN10cucPmTjzB/7UO407MYS0dhghZG+Lnbwg+tLey6Q4SFVHzIRQE+MQJRBgWQGtivjJOBMhrtIlEAflNq7Bo4fGIgRPlnphVn5QTSHWFEleC9fYRPn2PSPYRD0Si3INZJE5nIZfU+jRIEnETdAXq/rSHe2EaZHSiiGqJQN0graGNhuc6RVc4HKyu4c/cuytUqInK5SAFwvH+xJmvOmftE54Slgzz6+3XbxtvSZ84bBg3rhIU/+h3f3vsG8aNNfH39S8xVTymc3VFHCUEAvOYkE0lyVWRyMhpi4Byi645w6foVzF5dRsx5TMi9CM4db/TSXCJwkuPV++31DrC310az2USn3cHm2gaebG5h4/EaXuy20H2+K1BRZvJU6acITlkWTQfxKEXgK/RePH49K4rlCowZpiMjEC4uUOzQsdPhpCgFAaZmp3HpnQYuvreIpeVlzC40cG7xinT8K7WqCBpZb9s4pz7B776jM8EulyJylESIkwE6nbZ0+PfbHTxYvY/dp+TwP0bn+R46O88QD0Op5kpgnKplnu8GAk1mO9WJFKLM11FpScqfH41CDEZ9DKIQpVIB8++ew80vbmHl42v47PbnaFxchFuuCzxXFNgVVCqKwSJKxTP9FwT2kzx/x8HcfAPPTjfQ3O+qeE4m3JOgQg/+akU2Em84kIA2zzsUBAB0jSF0WmyfJDA0ULl/eHs2YH7bxJauAnLY/mMe+e6ra9bLpD/EzuNNpP1DVFkIIfewvY9xpytr/8SIELKbFnZ6qDfmxK85jMYYHgzgn0nV3YP8PoedTFc45ty7qNHCFLlGuDshvRFtVyPhwEakhRH6XqygKGrRgYhmdTbWERx2UXN8lCfhEU/XUHEsc1RQR1JKUgpe0Yix8YwBi8Bbm2i2u/BZYFh6H8GFCwhqNcTlAIlPeHeMM9PTKKUTTCURKlSY330Bp3eAQWsb490dDLefYLDzFON2GwVCeimDK++MZ3jBbw7IbTLp5tYpIviolQMWPGZmUV9ahnf+PHozNYxYHExEYAhjBwgJaWSHyEEm2AtDP5cUW7zFE7HdkkEib7VekQTj1JkZBLUATuAKqiUWyUlNbAtiEcgfIqTDITAMRdWe8Q4Yj1DIMhrr2MYOKkkBo2YbUwvzKHlFFBxPnzFnRhpiv9mSgkb17JzoWDCnTr2jfVP42sZtxIrBWii7l+syH+eQvT7351nQbAPP7P1Qx5o0ozxJwIahaD9px1/2ctf4lzt63bJwOyqISccjn5otpLsc9NX7/2+ulfdVrtexuLSM6syMzGdSt4gs6KcT9Dgnjcq+4xy/K6qJtMZA9p7fpBKvHuQKRWZwzOaU45Tl3/0+Lc18RYCaZBmvBOuJgdcqP9kk/6a7L3xequvHsXauo0gSc+5xVo8gMfEwP8cK+9lDkbL6TKwqur0XBvH8t+R68AAAIABJREFUHfcg13oAm8Cf57OOB6nZU9nxLOQ0EIQWkaTm3iA2qr7vojRdUwvJOJGiSDEn5DyxcP1MFwRiRU2nU151fzTGgyebuHrxEhZOV8XW2hODa0WeFssBVj69iVt3bmP94UP5f3makrmwTOMlHSX48bvv8dXlBRTrpxTxl2gzgVQgl/QLxDiYHGKr00T0a4wbSzfQqJwVcVB13/l/H2/X+z/5cRQz23K+jjO/Vv9cxU9//ILWoKXJP4ty1q5XLN8dM18jbdAadXom+/y7UsmXXIwNHlXudyWZlbgvc4s7ErMTuo1rC4CeccVQDjxRANbiL3P6cD15N2Lz3tnCsk2MU0EWaPIs2m6IM559FL+st8HPHIahNK2tjoBdM+R9EIcPbTZnxTsZBxUUleKjqyiCw8Gh/M7a61nNj7zAoCBXcraBcg7uM0RfG74+x4kIAI5R3sXAHkfC/OYaY7VC5HNgk4rXwXdeihu8vjSSe7N5tQrgezr6AP7i7Mp6m7ii8Der9wQnDjjCUJpAgULVUjWV+taXPlUqD/3RoQ+tQAgqojQJaeIsTh0Se7yPp/rOuXc8cZGqMC8oxPEyvnPnnO98i09thSCYviORAswgjU0uPjKoMjc3dftXR0U17JvlLlsHbU65baHD6T1ds2eaqilGY/1bNVmYpnGANrKACyTIBXIy+H+B55noEghYIIimlRVQn8HChRqsYoBydRF5egF0P0jhGSfIlCV6IrvdvriPPzMnu09ZgYm7ISKiEWI9NHf3cLC7K0UACxylcWvWNM8VP3O9sYr6k8fINxrILa+ghwAdJNjut/Bifwun9BPLeSg5SuOX2KZE9b0inqCuwwxy3Cw10C52g+AZ+d/cjUmpWpLlGKoukOeb31HOy4n5H12LJxcd9PZP0G/+g+QygudrvjaBEgIYDmkjvoeQjtKTKWpj4OzPHUSv3qJy0UfJCYUt4Iu7wOywtHZx8SZtNl/G819+xfraQ2mQAiXw/scw7PpHBkH/yGaYXKGYXdVjWTdQVyJrprKGudZn9EhLozUmHto2ynmk5IXTbEbTsXkkc2R7exuvXr7E7u6e/Bx3ItCjdiMo4PG9e6iUK0Jft80pO79ZUoK+Bi9uYbzS6Z4PGfUEac2t17D+4w/A0hJ8ulG76ojuzUEc2YIOV7T6elDCYT+7Bd10EuGk+iZ1AXUlq743HEqzf9xs4j3p/IeHaLVa2NnZk0a5e3qOHt29qbTldedMdW2JY2petZ+miSW9XwyTWNAR0BrGqdNrd9AXpPgi6knkW5DPYWW1jrv313C70cDDr55I40+d/GL1BvzqonF2nEdAFd8TAI6Z6W4gE35OTuRGRWbFcIzW8TGahwdoNnex89c7HO69x8VZGx+OToWeSAok4wgZf7dAwMoxbtlGKxszmYNmmTxfsUrXI+bkC0jIFdSVRmPtwR18s/EMT599i6+/38C9+w9QWF4x/g2uYcJYva9e254TpsvaF/8Mza1Vp3W7dicCEnJvi8VMqGhKtE8rCKyTRmKkKfqTxg7FYQm1+l2cHZ9g1G3DJU2DEaDlAsaVAgqVogKgrrogk/Y+sqBokIcb0xXdRdQ6F3kFey8a6E1cZOQkduGq2WHK1DBaX/t7iZXNrveP6CiRuUmnj7V9jy0E5i+M2RPKOgS0sNGUEb2HMYfZ7U3Q2jvAqNWWpp7Ud9L/x+02nKivKRBeiDgZod8bofW+ierna3IdsDk8+vsEj9bXJd0jXywhSiZpZGss9pYT+CV6YJRlf+/zntHqSDHOkVcQUkJGRoAP93YDC8VFDJdq6G5tYXzaRJ3mkqOOAIR8667ZYNO22+giJpl9kxAsa7lgNEQYt9F7G2FwdASvcQfVp08R1usIbi4jKORRSQZwOl2UejSAPcH51hYuDw/x4agJ9CM4jGeKJyjH2mNr+Tg1q8F041eaOWX+OEabT1YN9w8WcX1x/c4hd6uOaWMVTuM2urUahsUK4kIZY9YFjsoCJnIp2QZnar7XKQKf05KBNrc+G5i+npRSDsGNChbqC+IHwjXMhoL3uhiamQxH5Qc0jSILh1GWUbsthrc0vCmGDnyCAtyzyIJ0fASc+PdHwFEHyX4bYbksnwm5qTSTw4suhkMXnQmTMxIEN29IDcDkEa9oYqNs/mGGkfMxfWp6Bo3BnHgmT2YFZGLNt7IAQHapzw0GkAEIRL9rWZyjoTBSFJ1xJLc+EYmk3uQd47VB6jZjgIenZxhfdsT/yE0j9Ozze6lzdTQdY21tHZ998QgL1SUUShXxvOB3etrrokUgIQdTmOp5sMZ6yAyjrJQkmWMCifeUMzORlgGFCnQz+4SdQE4FqFbj6nHKQOXntFRj+3qWhSr3OFczvSeG4h+bxCsp5tngeGqE7ZrCns8psobRyGiw7XftpFp+24AwpjGezky0YQr6GTCgv2dSB4EDys+cDFNJ2A1kAwwGCkJ4XjrYkqbLzwmAIGucjBK+v2KIYq2KARN3aAg5toChAVkT19wHzcZCIzI/lNqJ09r99hlevHuL+9UVLHhLKPLql8c6UosVl6v46fnPeLm5iT9++10cY9w008MRyYIwgFzdP062mjjfaeJWfQGXSRdukEjySMI6lf4uuUTqywt6bbQPMHg9xndfbmC1UpcErtDUfVYaO/2fe+T8wGheNDL/l9fhFtga6zq0/OsMsD6FBTdPGbeHa8IG6e9AT7IIQ7zef4PNN5tojy/F9M8RGNMV4Gj+fbDp1FjDvNTKet0Q+DK1Dj1jQl88ZeQOZCL/CBz4wo5x0yS3wKRe2Ak8G2LLkJVm1nfS17AGnL1+JNdnqaTeA+oD4si1wLpbpum823I6T+ay+GQYabudmHNiT9mM7K82GpTGnQrGyQSfA195XfXasGCgPQ9kxvCQxDpec1LD6R5ipd7CnrfXtPG1U0CWniAKCNp/7XPxfQu4MpdqYs1ZpfcTedNE0u3oMUAvOw7S1CxR9ykLVNjo01l6CAAA/wIAAP//1F1bbxtFFP68611fYiep3aSENuQieqGtgPQBHopU3uA38wRIvKCSSkC4SE1ImjhugpP6Eq/t7A1958zYaxOpBZUH5slSorV3d2bOnHO+S14fdozYVDT5peJPSM9y063npkNIklanY1Hqli6/UaxHpvNsK6WOkXG+MqA5yvfghkZeP339xQ+RE6o04TwxuZUuP6s9svHG4w1Yr5NRcOVGVS6iXJlDN9cec0ezC5j1nLPWORqNpvhxkwspdnIZmCgP5Oz6H+4+F5/fXKqwXBXiU0g2u43DMBFO79LGBvx6XSCKAVI0McCPzUO08zFGVChONcl3EhXh4gbIIEUlV88q+Y11PayFzCS5S19T4xSPzEQTTb6DaBii7PhwwxRR+wKt3SOkZ10guETe8aUTxUUPoVKoIqSX5lAJUxRf9dDc+Q2tp9tY6l1gwSSR6UwibyvGbjrh4Za8Ep48/hxlt4wk8RE7oXniWTmvtzOmOVCZ95vx89UgbeD2JvgURJBvQuySarPjYDAKRLX+hPZ0e3vY39/Hzs6O8NuJBKFXO4tOqjI6Uf3l1VYAPL79EAvFOVR44DccPjer4WbOAOKFz/XluujTSsRzMEgGaIUdbD35Eli/qQJiJhDL1HhDLPVEvVnDoVrZKUzIms5L4s/nFI4QXPSxf3CA7e+38cvPO3j5simJ//FxU4T9AnKHmJRSNylK1A/a8fXA7xqbT+nyuwLrlzWdV76l+EtTNFMqmLRUqWCxfg3Xbyzj5uotbN69jffv3sHapkL7K/Uasehq9zilcaOCKpZ/yWAtXTnTuyvJRBziotPBeetU3AUau3+g2TjBi909nJ4eo3G0L0gAwvtLFBsjpHI4QsUvIl+u4CIIkLIDy4pzsSxwSpcFyjjGMIxwSZpHvyfIJXLfllZuoHZ9GR8/2sJHWw/x4dYHWN1YhzNfBWR+uYb7YBb2317fdDmH+yk9SuDCagdL8i/dRlePJ57jYRQGcrATbYS3RJhxLBHBK2Ch/o7oATR759L95LwTIbhiXrQAaAc4GsXIB5eSeLoMYOLMEWnOdxkjpBp8fwA3uaaCZ+kVst3/0RhTp/6h9RFtYOnS4ckenUPn6E90946AYYzqfAVV8r+7PfRPTlHim7Wq36mu8cvOBdxRpE4JboLWMDCiO0X0GNM8Ex+tboGr1noUc6Odkp/kZV/ptrqIBvEYocSEt+c7iGtVlO7fh1coI3xewvHBLmpeGX5ugGQUi+CtY0T1JsUQPQLHUwc+7dQVTNzJt07Q67XRbnew8uABFkdrKNcWBeHQPW7geP8Q/aMXGDYayAWkjA3k3gss0CuyXuM8oimRydRsyG4mTohgrskvEhF8iwRu7hAxVV9B7t2bwOoyhtdr6FMEmGrmLMKRQ87kxU0mFBmDbphIvUXGLz/UfcFn199H5QZFLOcwV6/CKaiaMhFHSTIRpJWCBMXK0liSyMGwjzgI1KuMhzcmgWxUMKkyehd0fvD5oRcBxx3MrwOjYoouyzu5CMVCUZIq0iPaMW0SQ8zfWoJX8uXMYJMh0bNAbvpQPpM4WGbDbAiwGgDpa/jGb8JhplhU4uVV2E5sm6f/Tjti4jt8FgD4eIMRgrM2PDrxzPLbTAxmUTYUNfw8Nu/dw8raGhYWa6LZwPPHRRiiE4cYuImeRWaGa5ykUqNMP3YImhLyykJhLQdYXS6yv8qKVzsmebCUAKt3JRBc01DiHBGbvZzuvZ44DanQn1hlW8tsUntMQSU2yuQCuTUIDjfTMbT0tywFZkwTkE6+P+W+Ze3MRCk9do3gp7GlTtQJiY0KFtHsb4FxQ7DdPcYuuccoFVFTEeGUc64rxfLC/Byi3hADOnjAFJRyysWe1VwQUATfgSQ/OVwmMX5/cYBfVw+x/F4VVdXoVy63UJ1coXx88uQzPPthG0k0fYKVZ2K+Q4V/ge+++hpf3FlGdaOOfjowqFblV/OnRU4ixTvmAftnDfSeDvHpw0fYXFqXncYfFxgE9/raIsD/afxr6tvMGJ8JpwbdamKB/T87+AnfPP0W5+ErOJW8nPHSK8ofMgfdyXWy3v+a4M9qvs0UWNJ0jAhQ8XhN2iWxjhWGzxghczhfGP/NfofVoqN9siABxF45HsPqBXlrUDTSTPZy5jtDdduageJzkHZENxBbfGPemdW/u2rwHhSyH8ra5eA9SV4sa1Kb25aXz//PogHs56yyv+5vGRqDWftTCH2bb0tXeHqzlvvmWy0YlC1j2FjPT9389Dra/I6TGH8BAAD//8xdWW8bVRT+5s7iGccThyTu7tKmSVOoxBtP8FCJP07VVlQIBVBLqzSioUlaeYkX4mVmbM8MOufcO560DQIJECNFsiUv45u7nOVbHLlh4YeVLQ14Q9M2JMoSmBQ/1hVPw4lK8yXPw1RPjfACb7aOBDhmHANfYP4CoXJEoV5DFljEJcsLXgZD/T/SQ6bPl41diZ0UdUM8F2F9FWuNDQwOTuT7LOnuWlo4R2gAwNHRESc7l5rXZNMqK00jZS/T1/v7mMdTFi8T2CuH9fB09bfqK2xvb2OzcZU9tWkqnSHB49cv8Eu3hWmVBHCU8bLSFe6Ued00YSuZJOzapefcejGiWdBqrhlyndzmLOrDeMKikiyfM+fmhmLF5mw4xrgzxKw1RP5uQFKuNDthUSWKVbZtvVhy1H0H/iRBpdvH+MVrtH74EbXRiNQpGCmwmKUfJPAWTPdHOn3Eaa5Va/i9PUDcGUPVfWAlg1VRsP9DkJbhI5uBNO7JvPnRIZommE6mbAV5+Nshw/ifPX/Onf39Fy95ThA9xFwG5UAQTy52MI3D1WrTGTaQowkXXzZ34GcW60Z4jqdh0XIl+TLgzLRKZ55KdZHkVg56x6jdb6Lx4GtgY40HtDiEcw3w/RtccOmEp9zlIGvBs36HLSxJhd9sfrT+6Lc++fYxvnv4FL3WKW8WM22pJ7BSqXZSB8TzPQ2JVXxi21rZnQV9LBdROkdCgRA1ZDyH58365gYXyK7fuokbt25j684Wtrbv4HrzJsJ6qDmPSjsqiCeyEYy3tDAR+73zYZMJhiOdsyBQPJ2g0zpG++0J2kfHGLa6OH7zBv1OF+03J4jOpqxLQMVo8utnz3ISaCII6DgWiFgl1eMlFVpSdp9HMaaTGFEy4DVir/gINtfQvH4PO7u72Nm9i3v3P8ent7dwrXmDA0Sr4gr3mN0xvBIJ4aLIexlk0X5AnWQS1xJ7H9FMJp0V1hiYzeAHa1hZCYWupNwiuPmnigBc5Vc+PmlcwVrjCronB0gnkeat25z811ZXEJKV3GQOOyY+6IITuiwXVBAFf3TAJmdjTM5GqLB1FhhRVQ7g/28Xw5xtiykoTpph1Bng9PCYi6WVasgdQy+NmSYS9QeoM5zeEUQWnwcWpr0+1HQOrxbCd2kOiWIxrRVWKM5t5leSKjKvKyqe0fjYgAosBFdrjMYiVMGkMwGmhuc/4+U/DlzklRoq7jasio90pY724T7CSQ/r7pyLeSZJpFhCAA2WiAIayHmRiKsC9OnmM4SzBaKDlxgP+1gfdGHVV3F62kH33TuMW2/h0xuTecH9ttiaE+d4zTocKeSkTPmFbBRVCe5v63eRU09W86Au1ZFtXiIZeszWNrCo1xD5DiLidatc1jsn/wJLp0K8nDtpIQ5Jv42KBKmXsrp0XnVgr/qoNqqoXa5x1598qul1M9Jt0LctKvi2JNgE3Z4liKOYi4RIqOLpcpzijBLkJCAXR/CpW0VnInJ4NAajBeKTIZy3Q6x6HhLXZfFfDugISUh78GiCuJ1yEa3qrsPxbIbVK538yP9KF3xLfu7QCuQCsFSFkvafXUWxRb+mzCwqPy5TcowWQ54vCw18X0qTSShWUVI8JzaFT3XK0RTDoxP4OgBeJPG5u6JkkLj2tEc1Ll/G1u5d1BvrbCeXKekSj+MYwySRAvFF/H7u2H0IgDZCfMYHmwqVEhjL8/QjCQedbZ5j9J6ko28g+bTHiaC0KigA595PBaNcuoC5Rg3ZShXe3yb5N13LNFvGw/QXBNUCQWsstS+6GBWQSAJlV2RPrbiiT5Ebh5Qs1yroYi9mkn6TJDhae0Dur+TXohciIYMq1QBBPeRCDtniclBcoFI+nGsMfU4lHHFSC+1eH3u/vsLu1ZtouOQJYMHWrR6mx22s46tvHuDJw0d49v3eR+dvMe9y4PighfarI2w1arCqEPtRXt8iFkxK7DSjeHIGFnpJH49+foLJzghf3PgMgR3q35leWAT4N0QC/0+X+ovxQPl1ESJ0FlM8fbmHnw72MEx6SN0MgUsNROvCGKbQF7FUsfGYxN5634hea4SJvoax8LOKNUg2mIafTmgCI4qHkuVpWd0+DENOuk2uSeivAgGgv9HY2vM+oddGzt39JSSfRC4F0S7W9vx7dBGC8k/h5wt+xxTmaJ2xeDutL6JFxxECsqY2nvqkkcc8+6XooAiJ6uclZwAex/f4kULPKo2zdrspo8O4Z6zvl84Y4+Jh6OAUH7PrCWsBkJ6IFESoIcfFzlgcC4gq4Hke/gAAAP//3F1ZbxNXFP5m8cx4jZM4ITQQcCkUQiEPFVKllkpVX/q7eO2P4qlFFaBGKoKoYY2yGOJ4SbyMZ63OOffOTAItpY8dCSFFsTMez71zzne+xdabqVlwHCTjEZ1dSs2/VZi0B2TyRZmMcSxGB4RwJBrZsDgGEMrR1NRIjLq4GimBQm71hsv6C1gq/zDMY1mSNDNWsbU5iNZw8GYo1Hp634hy9cs2SnMeQivlQQChpOEH1jsBALs7O7hy/RpP9eLiwzIKcPiug17vUD1M1GfTGmv1fuWFeVSWWpg/vwrLaaCDER4evMLvu68wrbkc+2UxjTvOvyAq8YkudmqfTbJ1pt3/UcgLzX8nUUZCZ6ZqNLwk6j9rxqn5H+P4zVtEnQGJtoDIAuyKNPO0hxpCwSRDo3IQo+GPEe7sovN4C4MnW6jPAtTSGHXH5MgqFDC8YrySkJsTiZeIU4z6ffx87x7Otdu4eec2rn99g5Hgz9YuwavWc7ObUzP4/NCL91O35/f2GwZYQkYOaTPpklFdv4+nT5/yVJ/+bT9/joPdPWFMUFOpKuQSIXbqRHVxJB5JFvwwzkEwBeY0YOKbyzfRXlxBxVEGHvzATjNtJzVJ3MzS3yJn2yjFyXAAt2ShOx5g4Jm489OPQGuBTDAyKi3T3/6BgFaMDDIUw4SOF9vbzGDY3Nxknbs/7GM46HGBS01JtVJFa2GBjYQe/fYIb7a24RoOF0Fldt+3Ra+UKOoQTSl5Ah0JCyDOQ9tp3YwIrCt7WFpeROv8CrvzU+PfvvoFVi6usmFfs7WYXQ8CKFLDEW2WCum0BKnjPHlDU6sSKYZn4wn6R12WKAy7h9h+9gzHvS7e7e1heNTF0f4+0mnA8UFEaazZZVSZmWBzEWRWGjzlt2slodPPwNNZ26XEkQBhEGF04mMWBqjM1dkRf33tEr7auMUpA0vti2hfv4b5xQU4ZU+uualdQSCPVEafvb/9rqR6y43z8qz7lKmjRD0eDnsY9Po47Bxg0O/i7T7tQQPC4bC+sYFv797F4vKSTLpME39fRn7akSYysXNKFcw1W6g1l9CfjnhvJYCejMycqguvWoLrWSgNQ2aLEUDCJne6oQpiRMQAGI1QJhfamEC3j/t/6EivIuj5X4+Pvj7N6W+6OXacMje5lO/+7s9XwPGEH+58/4Qpgr0DnLzegUtuuxAgULcJdM5B/wRWEPE1ZPqjaWE8DUH4EplaRpkEgsCuVCQQdA+ECRIr4YlxxeQ7ltfI4M2hNLqJKoJLJfRnASoNF3PXLqE6P4dJxcXJyy0ERx206D1URFARNFaG8acYUmwqR+Ux+eOQrjehLH/APjrEy/t7qFZqPGEhmnuLpm5xqpjYRZnVGZOw7Od57rdE5OpDQKKY9OY2kDQbcFaXYa6dQzK/DH9hFSOnhoDAE4r/s1Q8kfLMiLXCSN0jWYlkCHgemlMkrgm74bDBHzX/TtOBUytx7BFPVNT3HutJVeGmZDkfedlRI3s8IQ0j6o6HamrAMyawg5CbXEfF/pqKhUDrNhiOkbzch1evoFIh0NuCHyRILYl4o6sdjXz0dvYRpiGaqytIS/p+N5UIR/sAS0pRcV38O+jc/GDT9v7vFL+0olt1yLGXURBxJBeBHwQUZQIFNTwh4MejTOmDDhwyREwM9rE5e9Azchz7DAVcuHwZV9ZvoNxswvZc+FTfwcBxFGEYx5jSxNBMxe2/8D56bUoNmRvknfKoyu7rfEIWa2C0OOUjuSX5Gqmoaaplie3BRtKqcJd6MxVpKqVfmGZGQU450quUNflWge3KLtw8ZRNGZ6poyHSysWKMBEoKIMCAxKZBNTY82VfsA0fJOLURGE/0KRKPpAquy9eVGLP03CK5kDZLLLGnTpK9H9Xbmo7MUsJQyRATMThMwgCx57EXQLnZgO8fsa8B1LmzWZtaxxIrnTcYxNCj2sCt1fHH69e4ceEF1q5WUYNbYASZbHj65cYtfPfD9wIAaO8lrTLRslaIt4AfAQ/v/4L27c9hk54ZEmltFAUEXDvIxsKSv5mPB08eoN/t4daVdSw1yYfFzWpLkw12w4xx8/9s+z925A4MGVPIkKp2ghne+n38uvUYj7Y2McEJrDqZgM7UwCVh0/NE281+wMxHR9NJlKxQ4ykpoHhQRKBp5j+jtSQyHGF2ak8oav5tlRIgJnYyjSfJHa9PU5gBk+kkS/bQPhvSP55mOGiwgZ5nVPPS63WOPwredRmbXPWUcRixlp4Ozs1XvSrtCSJbkHVEe4OsWfHZYEnbdMLgA72enzcJ7SUWR3bqSHt9vtl5qhSQ7P+z51WU+7JPgPTG/BnYQy7/3NpjgNc/1bPlMjNa+btSjCe6ZgyoEDhhGPgLAAD//4xdSW8cRRh91d2zLx6PnRhPnEUsEgohbAcQCBQOOeTEBfE3+G0ICZCIACEhDiwRIpBAIIm3jBM7HtyetacX9L6vqnsSH6AlL2OP7O7q6qpveUsgA+dplzyOIzQbTYwnQ1G554M6jSZyc1KrLsvkf5GvQKX5KHUq255wIhx0q+T7efIqiyQ7chTYyTRKqIh3apJXdJQz5QkUzd3AWrmiqovWUoUDLAMosA8bGfjAJB2hvd5C58Ip+K0AZub4Wra6YweT57u1tS2q38PBkfA0fTmPqcCkmCiR3729vWkrmqrk6ihSHOTjKMHqxhnUz56F115CCIMdJPj67m2Mmz7SeiAPBxMaOVUoBy214nxIrQARAxijY+VbCQDjOtfWn5KfpCIq4kbWV9k34lxANczxaITseIwGk8fBAMO7TP5DtmLthwevUhP4v6A2OEGNClvVjkJ4f/+Fox9/wuj+DrqZhw67viKhnFiopVULtV0XHw5ZodVZ8doUHuEQ23/9hgebf+KHb75Ao93C6rkNvPHeu3jr/St48ZWXsbTaRa3ZkLAnms/yqvyTXm0uYHZt0liKUK6QQv/UGQMMbkT0pU9UUI5K9eTq7/Ufyf27ceMGbv/2O7bv38XkaIjwOMyDRwm72GUi1M4qLnrWq1pgy4obKRTPOVZSwYxF0I3LA1nRPVRw9Z23sbrcUQ7pPFXhDdvp4JVMxlNbCIMI7yRRgnq1gcPDPrbCPpbfegntN98E6g11kLDD4KduEchO0EDkeSEtxysp7DVJcO+PO/j8k0/xzfWvcoQLFyR2YbmoedZCiPe11WhgpbMsrxumgmEywxLqItzChZwevuKJHatiPTtf5IBOqfocGNTbLTxzpofu+jqevXwRvQsXcPHiRZw7fx7rG2fswhBYLmaWd/i5oXg2iZB1R+wj+bsI09ExRuERxsNj8dlXv/1HOOg/xEF/D48fPsLB7p5AdE0US8JZ9g08+jLTrzo2koRTwJOFjuk4xIgCmIlCiWP5YbQPAAAgAElEQVSMpdt/TME/y1mut9tY653F8xsbuPz6a3jhJS1addbW0D19SgMnjpmDbxpXmPPyKav2SbEWQYNC8CbfhJJZQYWhGEvGwJJ+8o/l2gYP+tjf2cHDfh8PNrdFpyB8fIDDh/uy3kVxiusrn2H0cYgPPvoQ5Vbdnr2XewovHid8jk+8ozh0fusmynW10z0NU2kiYkCXxVIgadbrqHdbaJ9qIhwcotPwcXg0Q+RQSESN0b6GAj5hiIwewZkGdhN2BKplJy1ln2flseXmJyZ1Wm76Hhvb57Bfi6BxXWynlOJoMgX32InBFa4oKuLtFd/DJl7kuXLdJZ+fy8pojsGdXeBwKNFofWkJbcLTD/5ButWH92BfaFLZU6KeAmEdz/BoaxettWeQVCsIynU8Hhyh3VtFUqlJsSQVVfWCkcPCj/H1OphwmLqH2loZ8JtIsymm+0OYiSr5MxhGJcAsBf7hPKwuo9a+DPTWEN25jf0/f0V7GqLOPYFrT2rRWXYMktRZydrxtPfCT1HYf1GBmM/qdCprG8Vz/MSDWZhPLhHPUj9HOJl89NPc0tHP1019Trg7ZOQltpvwTq8gONNDvNLBfLmLGeH+5QamRBUGRmgPeu88tYaz8yQxBbyRfzwiZ528I0ETJPBXa2ivdtDqtuFVmYAYtfzM0rwQktj5I12cBYpWPJnDTCKMd/eBw2NQRL0ZVNBKPEExmNEUCYXj5uoxroGmziuiikbbu1jqrWC+1sVsSA4mbeUC9ZdmDDBJhT8e2r03WG7peVOHhzpExsL5TZZbWRpnG5vpvsGLMTmkP5F9KrPe107WNqeYnICsmtxWz73WwwaR1pLKo8AyUYKJXyT/Aq8O4CcZal4JpXiGweYWvEGIqvXqNp6WQo0rCpPyKHaOAS5cehnLZ8+h1FlCGpQk2Z8YYES0ZAJMywFQ8xFnM7FMFBFpp5Lv8njjnEaE7LEQF7nrXUhQbVK+2OWMrGUevybW2ksSecuNhdV/gtW6khgzdwUgRbKa61OZzAXoC/uxp9zmPFbKbIE3d3lQa92y6zIuLM8aj1W0E2kpgrG9BooVMlmiP7okMnThkMZaKmr+1OsKSmUM+b6gQCMEJkM0mQnKtKp+E9oVF490oNpsSFOMloH1la6gAEhr4Ycg40qeTdJNXoVynH1dxIBxHON4Pse3t27ild4GVhrr1sxWC2T8j7VWA1evXcOPX36L2z//IkirWRwXjFe7RnFeklp0sLmPu7/cwfkrr6Lm1xCSSlku5cgh7hNyt8TLPBOUUDyf4ee933FvsIPLz13Ci+eex5LPckRJzl+Ee2WqxBZbVzwBRcPpaQ0A9zq1KEQ/f/1/jqeRef+FODhZ5HvyJyeL2k/Oo6cJby5WzBEPme4jHAuW67mfDDHD1lEf3938Hrf2bmFSGsufLVEcNQIm84kt0qQSZXjWHtqNg8kcDdsWl5wzW+YS2syq4PuqY5Yqldi3STh1TIzb0D11CODzH0HF4R3sXhpzmUt2FeavtJws/5lcsUUFFXofiVJpma/Sfx9ZXoQTWqVbJzipmfTLmqF3irmgCQK1DfUZC6uGHTW7BNUnib0W97h+cx6S1++Kb6LzJmr8Glc5qoBDBTCXZtHPFSCYA/N3IgEvQtSKSFAXg6JZ5A7XWHff8zl3hRAeilJI4EnTMtKml3UbEW0/qwtQ4h6VxPiXt2vpbaOKwt/MeMYeO3GMcZqQpILQtKW8N4WqAqGqolJhwT/gJ7FgxRqxYcMCsWSBeAgiUZBK1YQmpGnVJk7ixLHjscfzROece8fjulQgVXiXh8fjmbmP853vUaBJhlASuhgl0hlGYtKQp/Tzh1gS/ZAoQxo9eZJuUlMaEjPmyVX0B2pTljNk4ZO3zYx6AeXqmKpsx5ijasYf6GEw5AeBPp90uKObrHRg7ExvsU6ItIKFqotSrYLwsMOTklYo6kFPzxOZhJHWu90+xjMLi5wpaUMilAaeh6ODlhgUPmbAJtoNc3qK+Cis/z9AgB83bqEZ9uDUGwiNWGVbjojomUttqij9xviUwnUoDZScs612P2RzkVSKMtr8VCyXfY7Cnoe41cXwoI0+GRe1+0CHKAEmDLeClAy6irZk78YmkqGPopHADQNYhy101tYR37qNdKeJRgpUSP/CuZojI6387RjTG05MTGIGBTK3oyznwxZ2Tga4ffM2vvnqa7x56S1cuX4N7169gkqtiqlqNde9mJwkddkbUb5m0VJTm2jKESXodrs42NvHg817+HNtHaurq9jY2EBzd4//RgPPLTjStSGEMSOpqS5skuanSVkqUzPLWx45F8jP+e9OBKXTMPHx9Q9xYXkFth9gMBjCJzM0x+VjRolopFPV9WZdE7NbItZHevDRLwPvffSBxP4Z1tjSZJiK9/eYDg+hkEIloujKGDd/+x2fffIpfv7ue86wZm0+uzqTdMdhrwO6kYTTUxFMmcG9yMS1a9cwPO/jxo1fuWih8UUTBLFUaLNaqlQYICNpzfzpJcwtLmD53AoWnj+N51fOoDrXQH1pAYlT4O4oL0fKaXo07BWkwRWIbF7pe1EhP+h28fDeXS72t7f+4oJ/e2sT3kmHQYAeFZTDGPEwYAOuhDr8dhEVy0HZLrJBCuV8E0ocquogoQmZc2dTdhXudHrokPGiZaEyU8OppQX+Hm+/cxnLZ85iZeUlzM0vwj3VYOMvqgip4AhMmV+o8CMad65pNtb1FCRAUkk4eYR0pFD6eCNhMEXiFLvY399nw0UCqO7c2cDBzi4O7z9kgIoy5U+O2qhQRzpMuEApkTZ04GP36C6+/PwLXLx8CS+cPyvc4af40uhzySUzwCUcNpsIvTY7nJOZXXHaxUyjhtaDPdZMOxS9ytrOgjj+K28Yvz+ET075Ax9Oocz/y0ZW//J0dddzIulUY0gTb0jGuplj88ejx4CZHUN0dmJOZ/sR9rZ2EW7vACc+jPI0r2HEIEO7i8H2Q1S8gDuelqLWx6qcIr28EycYHHXgUifVKKI6XUPrsItqmLIBV4A8683g+Z3XRkvWh8CQHONCuYDirItKMMXPYHjgYUjFqSVQZFxI4JspeqkFHy5caxEzlOtdMnC8uY5e7wQ16mKGw6y4NZWhgKZ4j683hpJxCdQqeu5RRkq+jkwxIQ3Pfq+DvrLyklJfiGpI0goyHqtWYc/OoTjfQFKvIWrUERDrzp1CULDRpw2TKUS1ER0eWTEM5RCvKf9hRBQeg/07CjMOjLqDYr3MxT8lVTC+Q8aLSTKxRkm+uSqIDdnERWGMfsfDsO2Rqyj7hDi032CvkBDRSY/ZHDbjxHGWC80yCgILBhGGlJazMAeHgeoAEZv+2QpENliBF7c97Ef3UXy2hunnZlGuz7DhKNTmMzbMXGGbKBBAbUs1IKA2xwnSrOB72i8GhRT4QrJQ8vAimR/51aDXR9Bqw2ZjLTn37BIbwoyzOJvVwOKLyzj3xutoLMzDnZ4SnyLbwoHXwU7/BB5S+IbFa2FIxZ0h3TeYI5fuWEn4dPFhpori/x9M1oTJOir8dXzf416ijZWmhHbhZuMsa1SEGE9IGXl0s66vZfb8Kd+GvLO3oSLDJMtbzk0DyGyCXXQyUFlnlXP30yKJaZjJZ/WeAGp/IBprap5YzKahvaWlSnRiD8T0e0p3IT+AqIckDsQrIMfE0p16UyF9LKUJIhSouCma2N5r4o/7d7F8oU4hnsLSTaXr6ZSncPa1l3Hl/avYXFsXpskjuxkzEVSUAADvEFj99ifMvbICx21wJGmaFoQNqc2wFYpJDBvyUaHiizyU+sMAx2uraB43cenVi5i161z0Um1SJEYLC1PG77u+i08yqf7Hded/fE08bU8c8mZmhqhFzyXDZtkHxXFGDL5F2Dy6hx9u/YKt1hY86vyXTK7t/NBXZn1mJiWxMNLN0/Mla3qcFQDs0WZLgydR8c76/QSmVUouA2u6RtTH0V5arlOSPYLS8QOTunjkxsyYhp9BQ2SMcXrm2e1eF/fKI40KQUmPG4GFqQI+9dG09p6NAAkUYJmugAVU0NO8IHWoyIC0hD2hiE1bviuDE3yNtKeHGNyL94A6fhAIG0h5FvBdUwwJfc58jprVk78GLCEcjXN+DzHkGQiQcxr5lInJKxkzimeRSjlgsCVmSYRtF/A3AAAA///MXdtuG0UY/nZ2vbbXh7hNmpI2pEnbUJWKlgKFXnAQT8AlF7wFEhe8FBISNwgQUtVWAhFaoLQpTZpTm9hJGju2d+09Gv3/zKzXSRokbmCuktix9zA78x++gyUXE1MJAAayXhaTcJcj7foMaX1CnX+C+wfBUPRB20FkRU6SjO2f/GISMNGcCCmOFanfudJxjNN5Kk6iihGmUnLUrw10W14FLrSBViZOYGxyAlvL+9K3l7dtKE16wKdJYwEbK2tYXV3D2YsXmetLgQFNJEoeKUBnNIIhPbrFACPhE1dmVYfz2f4uFsMulp6vQeRtpkBo8SWGLSnu2HDixkNOeKoQrz97oDo1UuwsUh1I7h8mJsPJC5aAGQrEHQ/+bgudp1vALiX/HcAkITUTwhnDgPzobRIkipATBmzFW8u3WzC2t9BbfIjWHw9R8gIUB1IBO4yk0B135MQQ6n8UHFEnxIcWx4FUME8UX5Ogpt2tBn786mvc/f4HXLj6Oj757FPc/PhDTiSJ48bVrgMrm/4+ts1hLosJ3+3iu2++xZ3bd7C8sYrHi4+xs1XnhNZPJDfUVJQVh7QnBqrTrGC3I4cJDfUXacCFlMGtuEGZc+f5p0Qga2R5WJnCtak53jRJq4eENyg55XWORSslNzA2IwmVShL0oi530t3YxYrbwPQH11G9eplOkhWuE7XZGsrPftgJzXQ6aU7TBE4iBFTIWnyELz//Ao8W7nNnnCqWeUpCyZdbUBKScKGABIHI6MVOuVd9TE6M4+0b7+DVczP45d6v3CVxymVUq1VMT89gYuo0pi/MYfLsFM5MzzBEvjxWhUEBCiWnVCUlFwpo2goYGs5+xqryHg+6MI0Y7b0mc/Q3V9ax/XyTxRWp492sb3PRot1uIQ59STHQwSTHlRaLhBbJEo36UTkb/ShG1+1LRxCiJkQJQgp2LOnqQT+7/R5DFQsTFczPXsWNm+/iyrXrmLkwh3Nzs4xQEZRsG4ZsMWLIo6AqrgzfTTkvlHf5QIwmlokqLFJxQYPy+xJojE7QZerCxtISO4os01zdrKOxvgmv2YbfdbnrQpxP4tyRtsjpQo3/xtAx9sY2WAXZC31sPHmKv37/E+dfm5eboRi1tPzXI4Udm3CcEs6emUFjfRUv3H3u+nLgb5msLjt24gSau13mvFMRzlTGc1qnJPB7aDcaiLsurEqJEWDB/8Sj2VDib0ZOpPuSHcTorDxHSLz/rgfki+wkYyUChX6I/rNtuGubOBXE3Bm2lYgmmxixa4DJ+12r0UA1IHcPB07eYTqBW2+iQjSwsqm6uMYQrkyBRyyTUeJFR0oTIFe0UJyssS+9Z+3B23NZ6E9wIC/4i8k2Ly4KRETpcsZQsW8gf+oVBEuPsLOxhnEYzM+mohWb/SgERaQmSiKz4MzMiY6NKnVZQK+DOmDWnf+BUIKIAwkcJWLPgGwFK2X0yw6c+Xn44zWIWhUhqeQXbIQE66QukUHrIyn8y2BeAvpk4qfdTwwFpY7Zlk7Br6pFFE9WGZmSq9kwCybbcDKtkPYerRiPl4s4CWUbSvGE1/GAdg+5WKBEgni0XocB0wKCjodyRtkju+Ox24WfoLW1g1y9iVqpDN8OEamCGMwcTNKMob2fIByRhygRIE8ddt0ZrzHHPhJDREwqGj86edNCl6GcC7T70stuXYqgOfapOHqkXSYlREVpWD6M4W7vwttv4yRd2URSuNJkTh0HxXY0o+YuX2JXl0KxyNQsbhoZAvWoj3WvxQKAfM/JDtWUyj20brMuEpTt0QHl/2G8d8T5HnAIyA5tvRcf5cn7DyMrwoUD1LvsiIV+XV33wWF6IsXIOonXgwTsSNDM83pSi0ZIlwIapB9A6wu7btmOdLg5UMAgZwFtI8Yi1SRq7PX4NdbJSgwlipZwU4CLIcqKulJyEJ+cQLPjIyHtEUoeDq3XSUrT0teZPoISQS/08NPjB7g2dx6nClNc8Jbddtk3z1cqeOP993Dp1i38dvdnVGCyTba+Tjr+LQgZpe8+3cPSwgO8efoj5EoWfCUYKBXeR4+KC2F0egUDdsWG6wV4uL2M+u0d3LzyFi5OzsIRUvTZ4gJATjYCsxbmBlJ/sPQea/eDdKL9N+SBrGbBIZrryPuy7zdTXJ9GLkSqNRcYCV6gg4Xl+1h4cg+bnToC04ddsKQQahynjVkjU4TT/Prsc3CcywE7Zig6DM9nSnJj7et/+LmRqG7pCGBYgnn12SmYs4Yr78g6kDkOKRyYpPbyeiQ6YSadOWu0navzV0Y/cbOaKEFUODBTuzx+FtXzKoU6pXuIbEYTSkC6BVBSr8X0qRggEQAShn/wWnERhZ5LdThZKkL2+gzFxkePmf9HFVNYu4QoWqy5J3MkLmocU9XS95FiTMDC3wAAAP//zF1ZbxtVFP5m93hL4sRqCKkUpagV6gKlFHgpqngDAS9I/A3e+AvAT0LAA4sQRVAQ0JaWJm3SOmmaxYljO57xzB10zrl3PE5CCw8gRmqkNJJn5sz43rN8i2vEG8wfCJ5qxEWYI+C5OW+KOFLUCWGxQLpgRyxDih0bWqyMdzO/BCUv5zwxl193OxSLC8qLZwT/dEjGLtRseIwSMOIJdF2kQ6CbDwbmRxspQWRLjbosyFpEIYcd0YJrc+7Kqu9EA6BCwU0qkszQNKA3wNbWluY6G87M6KDYKB3w/X4Pv99bwrWtFg6CBFZZ7BvMUIoTEeevlfx5+yx2iM3/Z5KYuJCXk58niWoRLDPK0N/axv76NpLHbWC3B+zHQFcxBxFuCR5NV8gJwAt4kw5VhjA6QNDrYH/pNtq3foG9uoKJOGPodKBN+1Ij6aTzCmUdw7E3L6O5ZgM1tYoIAYH+cAeaPinRhVL/ANe/+pr5+G+88ybefv89XHz5EqanZ3KqwbEHLSJK4YtPP8OHH3yAzcfb6FOnmd4DhjhmCCE8HaajpDKNTnUxZh0jklKEalk5N1TlWg+uaRBYxutcaBAE/V88MYd3r76FxcUFQSmohJMX5pMOM06yU/YLTwXeyJ7fQ8TpgKFYO/EeOhWFK1deYu5/5mrxuDx7GI/t0cjr55Qk+OSjj/Hdt9/zddXDCiv3B7aLuN/n8zvMc3YR1Hwu8CphiMlGA/X6JM5cOoczF8+jNtfE4sVzmG7OoFKrodGcQWOmiaBagU8K/ZkUpfT9pYKP7hfM9/LFYSETnwg7G4ku0TS4u9/G3T9+xqO1VawsLaO9/hitlVVsr22gs70j0MPBkJEaJYL0JaMJjPhO2HCDEDHB/O0AsT1EQqJqjsWaF2nmoJeliAY99AkdMFEnOwrMzi/g9QsXcOnyZZx98QJm50/yPbHgIC3QXECPaEwMpxlhaDXtx4xOVQ4lhhIhpuKkh9cfleIgGqDb7eLu8hIerLVw49ZNrN6/h51WC712m9XxSV/CiTJu1ASxJGIV22fbzqHeWA6oceELB51sbCiJazabaKuIaQJQ/8xm6O8eIizo8AR7stHEzvpDRCkVRQRfdVkrJaiV2SrOCWIE9MwTUaVmvQCa5FATYKcDuz9gfrl3ZO7y3x7HJeFK+6ZTYzLe3MPeckvWULeE2kSDi7q67SIk2tBKC/buHsqZOFDQxN/glQwCgNaEfrsNi7i6mYWaX0ap18X6nRWEU3V44QQSZ3xlM0mWTLxFCHOYSMerPFlhv/Qw9OGVd9Db3Ee0P2CaDJ+V7MAo5p6NgePDdqcxUa/Cn6pCNWew8etvqFkRyomCRw4NOaxSYPCM07Jt7TKixiaUTztMoT+2Gunfxa7Ph9dswpqeQfjMCUbHRbMz6AUeUtJDIO4nZOLPVBCNlElhBECNRWXGeywKujOJo7kMk1VUp+uon2jAr/siNOlo+LwS4cDMekKhqIoTZBtxN8Jgt8+uD9TkKQUuCDTqDVO2BHaimAUvPd04Le6J7PeRWfD6QyTLD1FvTqPj++gR+kH4Q0gpSdNK9HTutBOj09tAtDeAG2cIZ6fk2u1DzXS+7xH1cCzmhjPKSey/+ZVSKPkBSgcx/DhGe2MTVjzUOhg0cfJyG8A8w9HWXgunn0Nzfk7cREgUkbQBrAybKsImhhjYUjTHbE0lMFxT/FvCycv3Q1OYKI34HAtT9uT1kJrw5ZqIxJH4L/Jpn50X8yO7XDunAPA7pSTOti4eCD1QpL9mWpiyeP8FZPPxET30wLjZoYt6yinLvp/bGlLREhHKT/OJGepMqFxPvMIZbZYIRdEUOomeLJpGA1EIjHAZWx+WQpk06petVK+yPoPqDkT7gSa4BdE+g7rQRAL+PNKcckmQ1gJWdrfxw707WHh+CiXCWVq2RhrIJPTUC2fxytUruH/jNiKinBaaivSTINCDOOLBitUFbn7zE86/9io8v4qELAHtbKTqfvgxaxerxEkRTJbQ75B70SN8fv1LtE62cHr+FOYmnkUVFW60MAHxCaix/+NhZ09x+shDUaTCCNqNMqh+egDlOFjtruHmgzu4dvtHtOM2skAhJLpSLCKetrZjFws8qd+4KM/swvdLHWkpymRd9NvI+pmGvUwZZ2V9l7VFGJJOlppGAFOJq4ulh7cMUdcoxFzc0wheZkfRTuY7ZPOEX4ptKqrjQw4E5rOGWqtAtDWOaQToxjz9I948NQqVdrijZlypFI6fn9YpU7fq4Tmr7AdaI8x1tKWgoOPZZU83HxnV4450EMxw0cSXhRR13csIhALH3xwmJqI3QlptpqkmQ0dzXxRzRtazpSjplYiYKT2fiOJtWfgTAAD//6xdWW8bVRg9s9uxndRp2qRpYiglKqVvqEVCCPEACH4ATzzw+5D4A31AiEUsQqioLVJXmuC2WZrY8RLbGc9y0fnuveNJykMl8EukjB1fz0yuv+98Z/E5bRCzJ0PZsC/m1JIoNoECMQMjPdhIA+wmaS+UZzQY9rW+ZKGn2jGdMVPmdVxcmk2LDd3GJpQvRmAMHuzfO44n5gaNSqiLKnRZ4r7tzDy0o0YN519fx+PoDymqZENS2qXU0q94KY76Aymod/b2UFtqysbn5wqHnQ5Gw6MCS3vpYTWlSuGw38P2/ftoMzfzfAOqoinIuWccY4kOOZrWr3Vl3myyXJ4IQU+D2K1JQkAYCm1Lf85UInjy4xSj/T6OD4boP90D9gcy7Rc0w6vCWToD14sQVBtQZCd4OlFhnjnLvS6inR107tzCcPMB6skxaqlCJYe0/q4BZLwiD1YzEcq3XYH0m58Fn6G47mZOrQxfTLkmgM8c5/mIU9R9H6P9Dm5+9TXu3b6Nz7/8Ah9/9qlox2meYXM1MwubeKQUxrJpbD58gCHzuEm7scW8acylfCQFu4TcWvMgLbfQ60gzQ9/1vUJDLbm3ZuIcWqmIKe5Dz8PCwhm8sfEmrmxcRmttFRvLq9honIPPCobxiixCw1ji8AgC8HOSxp1RS0tH0nwqU1I6Uvf7Q2z1djF/fR3Nq5ekIWXh7JoII+sFkTunCqtCs2kBMx/f//gDbn7zLXQAliMa/bkwwGDYEySfzf6lK2+IEz9N+RaXz6G2MI/GYhPnVlfRbDYxf3YZldYyrn34PsKFMzCZfgZAMTRMRzMUDP4Kl7Q6bixZbDY2B5PhCL39A3R2X+BZ+yn2nj3FdvtvbLc30dl7jsnRWEA1Tr4rQYh65qNKClUaw7XlRaBZOBAUmRGACqNsIutIAmA4GWFKGUymWTZ0T6ecZPnya7hy7W1x6H/n3etYaa1htbUu9EeH94/cU1bRrClutpHTUywljYRAcqnN+c+k2Rdeg/WqyBOD0iqhXA+6PTx5+FAM+x49eCjGovu7e+KETxd/x/hH8JqKUzL/VKYQkbZJvV08FRAnHaVSCMPsGW6eYDQdi4554qSI4xxuNZDcV6Fpio7ZKQqp/6ucYZlXm1/AyoUW2lt/YXQ4Emd7yhhYKLLB8bd2pciXRPtMG2Z5xngu4B7fHYhLeH39AkK3gpGaFukOMJMfVZqUFe9tQa8TBWLpuAF5Vek5xQGUf69mx3neA22IFbPZ9QOEUVU038nOAXbuPgJe9ASlrVTqcp1I/Q8mR5g+eYLhvXu4QEZNnMLuZq7Zm2wMIu+feDBA3O3gTOsi0tRBzZvDoH+A8V4PjaU6gmogUgpZmdEWa1djFyPeA9wb+L/guBjRYC3y4DcrqHlNcQOfHLo46o5A8a5v87TJLuIdNhdiQKbI2hqiWl0SaSZbWzhqb6FJmbxklGsLb598Y2MQmBlNba6sQ/+sqEJpymKvg2+bXk9L/Mgw4v0SeRXEbC7mKvBWVoC1NWRs/M8uIqk3EFeqmLIhETd/2nIZDXcRTZDrCEMbmWbSbJSrTfHo18Ft1psLUGnOI2zWENQjODVPjH8ZDWy6fw3MBM5J4FTpWNTyl5l4C7EIGkxw+Hwf+XYHbuqi7vmIlIcqz8nRMY53O/DjTAzw1Ckn81nDp+BOczjtF8gXn2KxXgfqAboJ0YQqw1NkSkPQUibarNXiBPG4g2f9ERr981hsrUhiAcHr3NcJR5Ldnk6NP5M+L+6//OP8VzCQ9VaiJiajWhV0a5ufnTupSN6ybheDdhtVpdcj2ScqK06rcXsS9uj6xoYAy7VzCwgrAdzqHMZZgl6eYLPfQc9JEBMccXXxrYTHmxUO/kX8IRmixhTMZ654EGJqtLQnwZLTU3o7KcylZh1PTA3plcwPzX5Lh277e+3u7584r0V8n8pNTrmWv1pZgW54Z5NRK/cUzyaRSJzM3Y4iDTgUlGaCQo72YICJJXVNXBnzvWFMhPmdyLx9GgLyNWQcZrY5FI0AACAASURBVMYPQXYW628QaskD18prqyfeSuQcVlrA9VjQhVr9+tIiDjp9Dci7epKswSea8Vr/J/1ePEz9sAzIfA/Ph3388uA+brTewlwtRFPEAMrsKS6aF5fx3kcf4M+ff8Wt734qjS9Q6KhDV8sUWY8ebh7g0W938OYnNzDl+0eeZsI6L1NjtH+ZruePkzHcyCFkjl4ywu/tu9jcb+Na6youX7iEleqSDHUazrzc05IgJlNTO2k3kER5IGfYmJZU/yqP03aDr5rWM3ve7PkiDXO8U4qXk9/2rtGfc+AEM8HmfUIm4hgpXiQDPH7Wxtb+Fh5tP0Zv2kVQc6WyI0MvlwF9VjTGfmBjM63sRQ8haO6XmkYSlglCTX6kNeyBExTyASuVkbQ3NZtuz4A8vc/wPQkmuabvs4aY1n8jN991wMmp/8ykTxvd0betPIQWlkzmmuG1Zgdw3uKHOgXA+gCQpUu5sm28RVZjpva2N+WQS6SggZbo2FQBuyYLIBJcsOu2hp12X2ETzr2LUvvCPNScy5Dm4QYs4IPNeflh/QvsZ5det8S4H4/HGnAxjB+ec4ILIuUR3zl9TYThf6xlClwHz0OSJPiHuWvbbaOKouvMzRPHubWOc4O2aYhKm/KIqEDQBwQv/ALwUYhnvoXHoiIKqC0VJTQOcVK3SZypx56x54b23ueMJ2mKWgkkRvKLEyUz9pwze6+9Lg40nabQKCEqmxk0KmniFKApXsZQoZrzbKJSTKYpT2PZiVQj+UTz0uiwcVE1h6ATqQYPTt/ghhYlH/4E/TAbdcbTVpSOwd48OXm3sLDYRBgeSma1JsRkmvjN3gDjGDvtJzg+PmIE0qdc4lwbRRTSGDhQL6Fv5guk8xkM+zgsRgiLMcZeDo9i71QdmSPsCFqr4sgsUyerIm5lOYMxwFLa8EdPa6kXyUkvPhrDijNEvSHH+kVHIUbdPhAMgXEBRWwMp4bc9aC8OnLHQe6Io3tD2fCyEdRBF+n+Xzi69xPy/V00i5HE+RQo85zNtlKapFSo/29SXuSn9uiJrOH0L4H9WclYqf3gN3z3zbfYb7fx5ddf4dL6FdQade04ozTunAkKVlhYWVrm+4OtP1wlOu+z309FsVpwoTvpPoyejTZ5avRMwKGqvLyawvzCPLa2tvj17uY1rK2tYXltCQ3SzJFU5KSP8I89RHGCmiNNgFIeG0UV44yHdTy14hgjmQ7TNfTSCPc723gUdPDF9U/gXVqFuFUZ7VZRfkivaurIEJH+Jnlj3LnzA3q9Phos8XCFUYMCF1pL+ODW+/jw9kfcGFMMU2ttFW7dZ6ZGQRuE6+pJQAE319rkItFGX5l2mnd0m5lM3AmIhjiMEQ1Cdijebe+i232Kzs4OgmeH6Ozs4uhAJvwxGS/SuoWYeTJrKJUEijQROp5Lc2Jb2BtEmS1Uwi79IytFP3yBARXLpMfycyh/CrMLc5i7uICrm5u4vLGOazdv8LRpg6Q8nstroswALc9aN//a2RiVxyxDVEoAMCq6Ra9l6LbaTT0ZckM/GAyw39lHe7eNe/d+xjY1/50DBjWomXcg0W/kT+CPE7i2glM4sueZPYDAhkyKRAJK4zxGQvS1VMjylLPcTyMu8FrLy1huXWSpzObNG/j088+4+f63IgBLZ+bKpJUKzgYBQ4stDPo9jEcD1Cx5aE5N11kG4gcRrChjwylod/QUAr7F/RBZMIRHzwhyAHZe/1yNzvul9881Q3q9gx+6ucTv0f5Omv/4eYCD+4+BzjPS7sAmkNSl+ZWHKSqGegGChw8xFRzDr3iiGAjJ3FHifC3MgMF+F83NGI7tcqqGmwCHO3tw376IwrfZxyTTfgC5mgAebOBTjg0V69tTdvpVXBjPzK4g6B6jcMCSgCRKGUiitU6g/FglyN2cjWc9Zx4LMw1MLzWhVlcQP/kTwd4uZsl8jh6StI4K7Tz/BtGiqNYDtDcws83hGLe0NgXrwgJqK8tIF5sYLzUxbswAM3PIah6GVBxxsyfPZwMYW5ahFptJvyqBV1obHGdKIIXvwpv1GbT05+qw6i4KygSvGaT29D2Sa7ZOWUaYGKVK0cZmZ/RxRCMkRyEQJkz/Z/NbSu7ph0g7XeTPe/CTnPX/OEcvbIBz3sEpH397D1NvrWKaij2/zvsWuPDVsVf6eUq9I3uhRCmC7Q5T5JfWL/F1Gs5aQiOUXKSA/+VB60PphpFqLZKcSKqeVconSKOdnryAM4jZENAuJlI5w61TlRqCwOaVjSsS+WgrxHmE0HJwkqd4nkaIbDF8JPmIrSWhqTYWM/KNvMIAkJQqS+eGn9kbXkGBKKf75/5s8q5x3mbZmtbRFhXKM5+TdvCWSXxeFv6011NKAE/ldQCxPGPI/8LWtcfpJ3mqWau07unzJeZgUlKkVdnIGz0wDytcYbtyvLaOE1R6gmfpgQkX+8S68jwdXybrm6f+rsdxh9RsixzJfHtiRu2TVGemgRGxt85JY1GcPVaxnNRsT2J9jSzFLIC7Tx6jtTWLaTXNiRly79A95GNj6zpu3f4Yj399wFJAW68lPkMe4NlM0ycHjVEf+OX7O1h8ZxXN964iKJJK85+fhX5eaoj9ek3M2dIU3aiH4NGP2O7s4PrlTVxdvcxAi6lsOLXsH2qt//uhtCGlreVTCVeGAnYH6Qs8DU9w9/cHOBoHGOYDZD5l4UvJmcVEZ389+lBVRkXTehqMyORbDJLN8Ngq8/p14oSeOJv1SzWEkZDDDGOZHeCUAFuWTtzyhRUAHaVXlAlwWT5ZL9zEEtNAT/ep+ea9AhK3R+8Tq5QMKFOztirXxWtbywDo2oz23rLEkE8kwjKYrYKMkponzT39T5tS6ComhKZBrzr2c9/Kg3RhTfB0nvbeSuNeTUygIxlFkmDADAoNzhCjUPfgBAiaaznLgBD5hjCHjHTIRPBT/+k4Nv4GAAD//8Rdy3ITRxQ9PTN6ywL8kGywEZjikUBR5LXJgl/IJlX5iCySD8sm2yQ/AEkWDkWRwmBsB8tIsmS9rMdoHqlzu1se2YbKIqlo5bJH45me7p57zz33HI/92vyf0Xv6o6w4CakQdhBmvQbRfMcQL8gKHPB76bQjPtxZsUVQgvCwR9l6QOoH6cwNrIiFWIqDUY20m3IYzl+jpkloalJIxU8nhdFkikuVZal6bu8eGWsWRyo2lgUgwsdBLEKA1AG48dEdpJeuyPmlbzsMTbCuDGUocY8UOYs0ukUWQahKUn+ddPpAPoMMkxC4JsiLEXNiQpkkx1LNjMmvox+gLF4jNi7I/3QivYfT3gCjQ4r8dTGq9+HQJ6lPzyIPoNhcNgeVLkrPKDIZKE4u+vrzoR/34NXraP/2FNPtP5EaDLBMACYyXr/nEmdHNkPXJAOpRJKUHPUZSJBIHObPc3q0mku0jIuAk2AXjH0c7x/i5x9+BIYjfPXN13jwyafwaKmU0lXbMaYSYDHZqG5el6p17V1dn19rtiH6wD527j4THv28htXLWVQqq7j/8IHYQt659zE2bm5i/fp1sXJMZTWiHrIndOrD7w/Q6R5jIU2niRBePg3Ci67DpFk7Uyj2/UPbU9IabDQNsN89wl7vCE8bb/B23MLjrEu4D2xkS8dWpEJJ0PChni8YWIS+/s+2tpBjryDBKuXJ3Lx99za+/f478eEV+720EfTkeHJNmQDeMVZ2oirtnSKVYscpGwIfNpHCCQa9jtA/2avPBL9TN777zRZa7SZarRb6xx3Ek6kkwf7JUKr8KYPwcw2Pe11ZXwRwnLSpLLDalcti7AcYj6l4P0K3PxIAIEuRr9Iy1tYWsbhaxsbNKjZu3jDPZgPr1SqKpaIotmo6Z2xsz86o6JoXZWwWfrIVJE4EmDAAoa3Ed/o9dJpN7L58gb1X23i29Qf+2ttHp9nCcDBAKnZQKhbl3FfSGbiFjNho8f4IBpRY+eRmG0Siw8H1PhX7FQ8jqvv7U6lEKLYIuxEyl/JYWi1j5eoaNu/exi3aKFarqFxbR/nqOtxCHqAtpxUJPXOP/0YQI3uem8HyUhkraxt49/YN/EFHqpIEXKmbQDvEZr0LpU7MPhZo4BdaH4PruHv4DosTH6rg4UMQosWPzwacMxX/f3LRs0T2/AhIdYyaKUpb37mjKUbNNuovXiOut6WijkIeKl1AivaRykPBH8B/e4DxzjZKY19cY5ItH5aF4JrXAivi1Bhp7+yh+vARnNwCch6FKrNoNNqoH9SwsrgJL59DQIX0WK9fq8DvicWQ8blmMJqionKsK7ISVPhIL2WxkFlBeqGAQb2L+CSEGksPECIyLBgApl1MFNB2XCysr8G7fBkxe+8XS+jXalDtHkrEpFnhkKA3fM+oXfxh4i6EJ7JgKCxbzCIoLsCpXENcriBVKWOYy2JaKMBP5QRgZGXXV4Ek8pL8Gys+TWt1xYs5NPPZ8ovERYVOQyI05sFdySN7qYhcqSB031i+bMSCDRKTnCeiEWSqlUmtTAsCCC3SqL0PGm0EBABGGrTLsGefIqD9IYJaA+HhETJhNKtuO0ZPKFKWSKGMM49WQFHdHuJXB7iSysO/yoo+2YDa0cAN+az1BU1jrT4t+/w0xmDnUMRul6qryC6VJI5QhunzX/cgU99JRbYi5yE8mUi1XQeJnrxg+ffRURPRyVCDT0i+Q6OZVRw/rMg9+uIzrKyvwScriICW44J8qN1OC11/giCjdJsGNNPDBvSijWG8/2NTqUsKRstxZwpESXqwTtbtfqDbyWjfe3qsM2NynKfVRnPnwZmqo/AkYx3/2RjOMfbZFIz0aBMcaBozw7TA08F/MnbisZ4R5eIc9M29WWq0MAZMbC1Veu0aKsUKxz0FMzzTpwwDFs3Tk01F2CdzzJcxYGLAOIk/04UoZAWcNq4UMyPrZaGAQrEAnzGsrfCeL7ifjmN8uq27mQxa4yGebD/HgxubKBczKMJqCWhGBAH7zx9/ia1ff8eTn34RN6RkmqNb7jxhlDAuaO40UHv+Gguri/AqxTngTVlFQuv2onTrpLi00ALN0Kb5zgpyFOAM0AhaGB1M8LKxi1vlKu5fv4cCcsgiJaCvjQqEHTibFhZC+f80AJLA2sUHKS26KtoKY7QwwBA+av0Gdmp72D+qoc01y1gzHSGcjAQAYHJLJqUy4u4Xn/q8yCj3CNH0CDUDhjkhn0HK5HQpcVOzLHLtmkWQmjnh1LLLHTUTrtQV8LTWDZgGmunjvl8Tzn7funnIXi72nN4s0RZ2ugECdFdtJLEWq/9Wz2B2f5adbOnLobadtxoI8gm1NSb7/2fjYCYJx87S763FIGNJbVF4muTzI0CFof3z97O2d9Hj8iW+0lT9+abJmeudYTxYFs/s74ynjfDfRRonwuymVpFWzZcNRQv1KkAp/A0AAP//rF1Jb9tGFP6Gm0gttmXJsuOlduQ0KdJeiubWQ/9ArwVya39jgZ7aS08t0B4SZGmQxE4CW/Eqa6cocSvemxmSSpw2KCogCKJQ0nAbzvvet1hJIUMUih7L+dQUPSNifkBoxDNDJRUNghRblDNqiDwJgFEMil1RlAqPIoBU7AFR+Cf+RF4wfPKkueDCJM5/5UaCSaq0GyqFQEc+hFqroiLXWHHN/19CZaWG6kaTH6TpOISpnPi14zHVOzTcwJ/gpHOEYX+A5UqZ9zUmJkIitzOVxm5xsS1RIkLtg7HP0U9EXxqQUzSAOp0w+l3PYqTNYA6gkDp2zlk3VMyDIUWZ5LzJpnNy0iUDlzCYYXzVR9AdITwbAsMQCIjm48B0KjAsFzFlvBpEC3bZ/Iw6T2T2B38CczTE9OUh/KdPkR48Rz0O2a2a/uRUQmRTS97hSlSU0yKijwJF910AINUdVd2KL1T9+e+oz/L7JAkxYLO+h1CrCN2jE/z8408ouy62tm6gtbPFNA0hSnJMkGwK6oiurbdwfHqGMJRmjsWXgUXA4b2bQQA393fR3t/Hl1/dw+39Nu60d7B9Yx21tZYEHWhBouL4qEtGBHQ6ICQdoBD5iCQpBAIhYrRZuTFJ93vqpFuquyYiRt9mfoDuZIhfHz/Ai/4Fjmc+fBt40TlGxqlDQVisX5xIkLznA0DSHHJapjxUioAUGdIX8di/+/4HfHv/PkARS6zZj5WuVqibXzDiLgNuUl6A0cRLEgRbeS3QzTE8v0Dn9SscPv8LV+dn7JdB9P7XLw9YGzufBkwpoklecKyICdewWNPnk+eEMFAuexiNJuzOHREgQPfKXHqEjMYjJOSLQPNBuYxqYxUr5Qq+2NnFJ3tt7LVvYWltlTtJja0NVGs1ds6m4prmFzbtTCQNzbHk45JlNwtzoPpHQc8iso6jjo4TSKI5xuMJBoMB3rx6hSdPnuDPP/7khILRZRfxLOBTQ9pLilZartYlkEEUaJrU44gp2Q7F/KltJ/5YxqiOJb2WZAvU6aFujuO5aG5uotFq4M7nn2L35i6nK6xtbqDeasKtrzC9khkRUaKSQZSk5Zrr+v992XCdKlqtDbQ2tnH5ghhSc+5I07VdWaqgVCmh4rkw4hlmM8WkUQUNdQhHFxc8D7kND34ipS3GB7r4xci+RFxf/P+X7r+O/0tmES8sk+kUQX+M7sNnQD8gqgWspVUIb4XjNJ3ERNS7Ai67GDx6jKWpj1WagwrP41gNrGiKavDaKsX88hLDzlskKw1YyzWUKxV4dojJ67dotrcAAgoVnZsjttSZ5L6hKlZpVmHpl9DGfbL4KlVdvpcs14PjlTHvTRD0xojGU+Iyy9JUoSmRaWCYGOwe7pUdeCtliM11hMcnGHTOYPYH8KJIGtil1yewZMcdkjFDrCHq4hOV37cN2KsrqGyuwWy2ELe2EC6vYuqWMOVtLJbc0H5xJ5+7/zIJIhG5+VesgRu1oI/Vc2RG1NSSyUW/VXNgr1dhVSz2PJgn2nBYdoYM5HR/napDoAKLG9Tx0MvbLDI4ZV4fZpQOctaHMU1Rim3UPA91q4Swd47pSRfiYgCbDRjz46FNELOAFsh1EUOpVET7AYLDI9SbDVQbVUzIcJKosYZEi7JIYu2uzgCA1MjS5zqDERrtLTR3NlCqenBsU0kdkxwUVhqaVMnaxMK6qXj9L857H3rRXEryBJIqsn8OMxpk5447Y5SAkCTwKV0mmCu6u5mxF3UvmfaMRtra28b2Z7dgex6sSpXXB/R+F3N0Rn0E1Agy9fhjhHGSmT8mySKBOoklJV3r32lRTx1zYVxftBRfxgcKG+iCM+ug24qBqpgPSDKfl2xbYSgmifS7IbM7KsLp6V+OBBqGg5brYtksYaOxhp4/xvGkh9PZBD1inJiS/RLpQkIVGDan1UQZ7ZekClljjSOH5aLAdjR9VxYDiVqfal18qijVtM+66M+8dFLpYUBfxRLfVCXlmBLQo/GQVJf8fsjfJZz6+Q2l2E76nPDakI9NbhZo2y5sO8XzqzP8fvAMe3eXUbFr7NWpVenkZ0PXxL1vvsbBw0c475yo60YWTTKxw+RMGZeaaQHw4JffsHunjSr5eSkAMdU5qvqaS6XpsMGyFFnccOSxIU3lSHLJHU/HxOWkj4E/xHA8wJvTI9zdu42d1U3UrSX2wLKzIEMJ9eWgVqpGWVwN/8N1969bvLO9XjaLxU+L7NuE2ls9mjx5hTX+CHit2o166PRP8fLtIU6Hl+hNRxCOQOqSQliw5VEyJj34XLohUDOQ5Vyqm/6RKwvpgC9d/vW4ImZ8S5a2UWAsaRd9LlIpjUPVdDmzJmGgz9Sd7Y+4r1Ew89RyApZNl0qZLByq4KYGHDFiCNwiYJnNNeMCWMZNYW2+pwDABUl67r1Bv6HT8bJxqOQCLVnXYAZLcOibC0CirLPzxDs6Xsw44kaYfF+DGMXPMSDKaQeyY89rTW2Kb5iYKcNBmUJAdXeYSSz4HBjSo0AyAGR8bMZySlP8DQAA//+EXdtuG9cVXXPmwptI6mJKsinLjSzHsZuiDdAWRdOn/FOB/k4e+94L0D4ERdE8BAgKN0lVqFZV27JEU0rEO4ecOTPF2vsMh04bVIAgARIxnOE5++y99tprBcWMgegC5UoFTiUop7LhiCQSGQ5DRYTjeKaercWbpLXEfI46FUVTpS5ynp6HNIvpbKEiUZx14HUadRVkUYAgLPUDXIDlB6a2EYW3ohHEwhfRLrNCVUhd44HATpxQxH01LCXN06uGqN3bQ6WzDTvto8LXe/qBceEvc1WMn40m6L++wE3vNfZ3t6V4kYSrooQuk//vLc9ASKE1qkLLAmayuQDm11P45hv4Tc4oVpAFuXiVr381Ghsyx8b7ZwHEyCxzwEkqnvoUC4snUyRUpSZFZy4DkCJuRmuhzK8jNxHCoAHfVBBGehD5NoEZ3ML2LnH95VewZ2cIJhNs0gLPuvGM4gNTNTOl+Msh7mwSmcw4wUW/cCHMjCSBRPMT0TQoQ5HJS1R9paLvlXoAxnXgTcHWgFp3FLN+TFpp1BfnKW571/jTH/6IH/34KT5sf4Tmblc6ZlTaluCUezjoHuLJ06f467Mv5ICh3kUBVPhQ1gK/yTKhZdbBOw9wdHSE43cf4fH338fR4/dw/+h7YgfXaG5qCE1n5Hi7+jiXe5W63NGrRPROhDmMFHA5KZMcg/FSzI3o0otwgLgPeFTmX8J6dM9YoFYzmM2n6A+/wcmbK7zEUpKheQL8+ZO/4Je/WgDt7C2Naf8tm6OSyrf6u4kEzKJNzoLq9yw6ub/yHPVqAz/82c9hw5p6ebPQZ8LhJbK3GYT8WoNyy3qUhJoMh0YRWt4DFjP8+uOPcXX+AsPeG7x6fo7ZaIwpwS6KtTgLFBYqQVSBTX153gStrGcxmanQD+PD7e0IyzTHcDLWA3was4qGXw2x/+SxsHTuHx/LeMLxu49xt9tF+862dP/9ek2rK5SD36KxUFlDQI12kgQU4IHGQOoONMaEQITWklXXnwencjMyDEZDsZH81+k/cfK3L3F++hwX5/9GPJgKRZ9xhPfYCSKYWnnNzGWG1I2gfsFgOJTAL+ItpLileoXY0bFa9RY2Ops42Ovg+Ml7IozF0YXD4yN07x+IxaLMNq2HifXfjf6t8ANfTw2wlgx8x8DN/01IVqurAO2wlLEIsgB2O/cwfnUGuxhgmado1CqoNEJsb25gcDVETPTdFImxp4JoFhj13ogNqL/XhF+NJEErUijP2UllzvPd+xYVvWBylO/N/JdQqgz5uNcFeSkaxLMkTrSrJUJUZObEGebXtxj1e7BvrqXw580GrbYI/9H3vBFWEcxn2GLX7O+nyE/PUV1aYnhrfsvl9YsUVOIOgR9+OHGM24sLtB8dw2ZVideGkXlwi8HzK+w0GzAEhZlQCKSpYLB0ndzzCdwFBBQwehZ7LAKdT7jZiFCNAvh1H7YKJDcJ0lEAj/e01LmjwIuEWSYgZj3CYu8OKu0NYHcHXncfs+cvMH5xiXacYJMzi+lcY74pKd/LdOkeuY/E8zDJLWY8a/c6MPfuIu1sY3pnB2mjCdtoI48aqmRvlGOnscaKRoHMNnuZC2nWUa6tjIxwd0ZBpOrvvOV6JOMYHOOrbrURbdVgwwTWpKIe7vnawRfA1YH6QvcvCmsWi2vxks2Z1OkfqB+yjzCPsKBYWC9G0ltQJQsVU4GXGAHrG7cJ0t4ENy+vcBdOcX+V9JG5VCbkxtGjfccOqFKBfTTA8OwfqN2roNPq4joPlTXAc3QN85Dn5LSXmMHTAzq//Bpf3wwxveij8/BQbFbDqCb07dQmSh+n8DK71XRQsOlqjMt45RlsHLiQObHFdYaQtxYRuM8WIrwnzsGwoRHrV1/yQCPgY7NSRXY9xKR3I2wz33W6UgcgC7hcCFwZ4PCDH2Dr4TvIKxF8PxIQn8NNfTvFxXSCOeO1K7QyJ/WauvFTFXQuu3TCSigkfB17Q50CcrXHFAeNzK0Ht3nWKP0LAQvW9UdyBb+ZBzKvyChwWpE1Qu0iPuNIZn7TVVNEVpno8/iyzoRevkyE6dlKLR6FNfxkq4sPql3soYoWk4EW8Lo1w7PlNX738hTnyQKTMEOlGgifUddkqXRSuGTJ9RK7eg7iH85zRewJnb935sS/fKjzjACsOlPMZpuwRMVRQS25deTW6uFJcdOohjROsTTaQAmJ6nJcdLuFgGK14n6ROl0OrFbOijmxGhH2xWmEY6q08JwY4JOTZ3j/4AFaOw3sOClAn24ktEfd38NPP/oFTj79DL9//VthCFLcd1nsJo7fGTjldYvkaorPf/MpPtzdwcb9HWGC5iG1OucK7K2mJa2uaRGb9NZE3tx4GrufiZXRWj6veRrjctZD/6SP3eYdPGju4+H+ITabOyJiGAgYIPKeytByukE2T92eKRkm5Smw/vVt9kj+Hf9n3nbXyrXpUzSEVEgdsoeE1SGOHLSVjbGA+saz4382eIWr4Q2u+pcYT8cYL2ao1mn/rSwqL8ikaTQdTYWJyFE3romgogDRcmndY9T74edSXF+aKoEbVRYHHdWEksBldX/y7QYOxNWfTnjdU25QllvXpWajxTU6xTovQrpIdF25wp2/p47ZIoxpAldejphNFY7ZVOvqp29y7ZhLV9uXOjUWsUHIOIHNtZalmC4bxbO0FDqUszZx4F+uYplk2UnN55qzUvinZNDQmaMmcZLaGgVAsN4U5QiO1s/KxuD98zXqVqdiu9xI6mBXvCdtBknn3mNj1+0sASQd20nc9MqR90JMsFjfbKrT7pojQ9PxWDQKWDNL7u0YOsWYPB2/Cu0DMb1inc062lr8BwAA//+0XUtT21YU/q4kW5ZsA8EYQiGBhLxaZjqdyaJpF5npqpv+qvyRbrpop9NV15123el00izayYPwCGAMFLCNbcmydDvnnHtlkRDaTbWBBWhsPe495zvfw7MnR4H2wNSGJOYFxEaMaDZSGOU6hYkmMEO1VuMPREgm57QXDtF5CGWE5QGpyl0bEBAL5AAAIABJREFUqZFPctdDQWIsiiM0K9kY7cEoE+UXeiWmmlkExxpSOMZ5XfkuppbmUF2YQe/NMTlrQTlZrtFyjJsx/dx+/QKH7Rb6vRWUqjV2u6YYtBPrOlt42TNuMB2+FhRlFnbuIA0rUsiONZJuhEF2gnI/hFOjSV8JA17AJ9ejnx2JNoU2MropmRi4EM2L2BSj8z5/Xir8XbeC1PG5UCU6JOjl9CpwvQBlp8pO1jUqBrpn6O3vYvhmC9Grl8DRITf/TU/ihtx8IS+4u5pv5EzKbDEr4pgKWVBTdnwnCqOHSGnEKkVsjOFsnAprIAllchVrYcUcKOPGoGQXQ0tX0xcbFM1GM4oL3yTT7BT/y88/4ZNPHyKcnYPmCKUCKhpU8Ojzz/D9t9/lvg+VC3pcKaKfPHmCx199yVIQv+yTMMygNgEv56RoH3DhLWg/O1Ln7tAWjLIlhTbZ9mNuDAlhLnGVLsTQhCmB2jjuj3napZUABJmTItIJWicUwKJ586eCPk5ibGxsYmd7FzfXF825/tthpTNBGKAahhhr45itgcZ8E425eXZ9VVreafIjEMaO8fFg11fzHJA7KukK+314RK9NYpwetbG7+Ro/fP0N5mvTmCmHHLNX1R7GxAii6+W4vC7QghkPI0FIzaisHw8YwBvQ5k+Z/ddmsNicx9qH93Hr7j0sr63i+o1lLK2uIJyuQVV8cbiyebuOAHppviuCCzX5RfaeC9EoBUYSrL6amkHTFHAoVZZwvOfZySk2NzexsbGBZ0//wPbrTQxOO6LhH8aoB1UESgqAkjGLSIcj8XIwpm9EX6QJvgCRik3l4tEQ3UGfJSOuX0IwVceD27dw9/49rD9Yx41VYjWsMrhBrCRT6SAhIzV19b3XV1kA/w+HbaDCoMosgMOZa+jsd1H2NBvZUdxaJfAR+C4XfZmhXDg2t3yUQA9iRKdnuEbUzIztSiYTNY1/nUriilnL+/6fpwljLdnPtGZFCUZn5zjdbyNuHQDdnhjwuT68sISx9hD6AReowTjDDE1i93YxfPUKYT+Cj4m/iGXDXsaKJWmBD5lAddstVHtdOFOhxOOxCWWAzssdVJabCJcahm9laOMs95lMhYsH630Z4BJAkvYv3rtKCqpGkaPTCOsBzlsdjLtDpL0hAx6kSeYJHbEI+D0qY+S5KFcqCGZm0JhbQLK4D73TxuHeHnwkoIBNTxnAmyiTHCCokZY89KkoalxHuNCEajagFq8jrlcxnKpxCoHyKjzld5TKM/It1dLY8knaAaSI1Lw+mqZCUUEfc6Y3aftL0yEb/RGDzqkFSEpa/t6d3AjeM3IKp6Xlm3Ne8mzk9y0zUkEagg4zDA+6QC9FRZVR1p744QxHUO0Oou0DbuRcHb3zLL4PUOMmW2eoZA46rTbSv55zLGDaqPK1oNSahPxvSqLZZHMmGA10KrK4LFVIexGi59t40zpGeGMRqx/dR5k02oEwLOgd5EmynlDGlMH0i19fKW2cj1QBZLsotwQnUFAj6LFEjPbbRI3E+4gAVB5sxFBRxL4IPhezyYXvTO+dZVRW6j5WPl5HfXGBWV90T2Le91y0z/s4GkVIAk8m0BZwNMZWufFXmuWAizVKpsPqWwU0Q/6cXXYoNTHZ0MV1h42oEwZ2S0y9LyMeGOMxRwBfy86QSXn2jiaeDcsoWWmY4MHUPL5oLmEddayhilmKUjWfeB4hFsorKK+F+PHlM2wnA3T0CF5ZmKDMODDSC10APAgW8zxh0PL0mt6lVAzFqO7NjAcXfzdi32lh5tJ6wwZmqdVJZzyoIBYBsYd4n6YGiwB8Bk5SlLkJ0Ly/UbNIqSVRr897nKaBkrYERydnqKbGbFPb+GRI+gCxSNr9Dn7ffoHVxjxICMAjOyXJQdrxsHznNh4+foSnv/2K9t5RbrCnjWQgM2Aet6YDja2nL7D25w5uNWfhhI7xSnAmyRMaRZiG66DibsqDLOtSbzPgxxI1SUPA4+hv9PsdtE5amK7P4sbCTSw1PkAJPgsEfJYHmGFJDjI5uAipybNS1MlL82zlae/Z7IosMpPOwvc1tebVLgOebIHseAyADtFDjBE66RkOu8fYONjCVqeFbjzk/6X+q1abFrYMA0Mpm7UWVzBO7SkAFHbqfNm7RPUdgYjFDP6cQZlPqd+VZRfBvPzcDvK/54Z3ZJMuvPz8NKm202mX40EdHi5byUBx+m1BQps2AB7KyNo0ka1f1O1Lo+6w8SBFbPLUnNY9ZgNJDKA0ymSGKKb35D3wtlF98Xdh0hfqzwIN3wIDVxU89Fnf9sMrypRI3iAG+uIXQIlRzIynGpzSmfww9/+wHil8jQpefjYZgEFPc29o4KeUg3+YO5PnKMowjD+99yyZJStUxDBgYBIRpShKbx6t8r/w6L/lnSoPnsQbpSUXtJASJRjClskyk5mQWbp7erHe9/2+nk5I4dU+ATV090x3f/0uz/t7bKqayWy9xcl9kvv4Z7l8w1BSeH0QBviYs4WbDsAAh/RdoAZ9QalUW7m9BM0v0w9NhQBxMjBywiGB1Xi/akfacpClGMqXMuGLLvaCs5sz4WQyiCYYZQ7KizU0VpfRf/SMARBQ4CSd/CeqO93t7DOxvD9YR22uzHOulEi9sEzlaa+vtjy0U4hciTyvCXDGF9ySznlKcLRJiOwkgOkCgaHkLoVni34LbW+h/TXZRgtaA0vSbQ8wPWREh/cdZI6PzKfk3+XA3CXIVBjBos5q9xDhy1c43nqKdK8DP5rADSdCs6frwj1qu7AInJb7638x1DQfPalDOkdekm0JIGkv5Qoai01Oqsk2plQtw/E8vpZUYRp2+3h7eIiTXo8px1R4cMjzOR0x+yA/vj6m7vIxyd/kMxyHKR78/ACdvQ7mP2wxoVWsdkxtkI8btz7DWquF7e3nnPxb5qzjQbsODBPffX8XX3/7DRKClFDARbAXoo0SaC1TszeZHuSc+Q0Xt1kBQEF/UlX5pFke02QyOgvSoqkoLVMpErAElYNWsGIipEUso0p3LNLJVKBRg36Khw9/x+r6p0gdS3kV/7fMjOeBUqBU9rBx/Rru/3iP9xclGcNf9g/2GChlMAyFHBF9DvIk5g6RTieIwhMGvI1GQxx0epyob966yVK9UqWKWqWJdEzyzBCTksCDRHpp8IIcp3Ifx1y4UrYjjo3G0iIubbRx4fIlXGtfR+t6G632JhaXV1BfWGAFC6jjJRE5rxeW6+UvUzOfYUSh8CO9orMzm3ouivka2lqUieEJP+97vUPs7b7m+f2dZ1vY/nsLg26P71NS2dDMrU/SR5rh96tIMg++52P0dowom3LXlWWtQSjrhi5MpGBHA5oFjWjBNTOGKK2317Fx8wZa7WtY32xj7eoV1Ot1eOWKOFnEodzDeYU/FXLu/8QnX993TKw1XXZPuLCygv3lVRx13rADg+H5KJEbQGMOlWoZx+4wZyZABdlkt3QyCjB43cH8ZJN9qqnTpL3cz7e2fHc71RkpnqWyYcvjFVKaJWpEZ5rCTyxEx0OMdnsY7feQ9AfMJYBjwazNwXSJueIAUyo8uhzi+ZMANrmk/PEY6VEXZbUmcQCUxO87Td48x+L1e3+3A29nB83FBq99ZG85tUOEwRD7T57jaqOOrGpJt9zQhPDzLcO0xC8p/D1VVFZO2Oi9SL+t6SAujRA5Q4T9EbIgFpCYKmBZ6r0aOzbGZgkTmCjX6khXP0D2cgWj7b+QnQy5aOOyCww5blhAycW0VoXXugx7aQX+4jwC10JU8RGRBS+976lAYcmzKd0Q1blSc/E8M63gf0Ix1wU6CPndEJK441vwG3NcOPMaVcTUdTKFh2KcY4OEwvqswbM6aNIKEZ0KaOW/oQLt8O0Qo4MjRAdHMMYRfJeukw2HFrXhGNGbAySvD1COEvipkUvsi9eleL/n2Fn13djxYxwjfdqBVXmF5q15xHWfk/+QupGZdNhkyEx4Q4ZQ99QsuIxGojfGuLuFP7dfYbm9zqNQpIwwqVBL1nCJwUoAVnip/59lsxeh5vPrWfvZdjpCI3ZMbIrLi8FWcmAqvUvvfLoHowiToz7iYML9emb4KPcdM+8IS8ednXI+3mQ5uQCXM4RpzJbEBCQLHFEaZKpbxtfsPesBxZbUiJKkwswhgabyhs801Vd/3jCUC1HhehVUEawmIPgeBfUxxbIK3MoWphYTkLg4R2o+ZmbGYllZVJUgY1bIhtfEl/NruIMFrMBADZK42gryWEKCZcvCV8YS5tbv4O7Ob/jHGGJA6heCw3KRTaWveo6YC/cFZyjdOVQ2aTlVvfidU3nedNBvKJtA01LA0fTMMGQiigl23iGgcBZzE4HsL6vNGsZHx2ypq3FbeT9dJ/6qrKd3K6w/8dame+6XJ4/xSesjXGxeIR8dlS7H/D+9SgmbX9xG+/Pb6P3wE6uLhd+lFE5U3EsNLr5TQyg4CfHo/q9Y3bwMZ20BATeWbKVknarnWitE0ndiuLPbDPho8LpISlzS602mfex1j/Hs4AWa1XnMzy3gwtJFLFabaLhCC3ClnKE0oU4O9s7Xg8KhZ7/Ze09HfchUo1byY5Ky01AxDylnhohxjAF6wx66w0Ps9naxN9jFeDpBkIjqMM1UU9WW+FG7udEYie2dfh6SM/eDVk8Z9kx5ADXKrefkDcvIczfdgdafY8i6aeXyfnGg0Il8OhsVLhQYtIr7LK+Jz08luhRbSrPZ5FiTPqul7NryklV/lp3D/ejP2kYvUe9t2y7adkozmrrlDILl3JbepwQfFIo/u/Gww5XOLWdF07OMEIHZ0zE06C+RRjTlxvT+4lz5/AVO70M3vPP7suBUItdHlZtUQsznTSPkFrl6OFzAk+97vvk/KeXp3qBNOxWw6p7WU8vEvwAAAP//zF1bbxNHFP521/au7U1MiHMpIYRyaUIJAoVUqvpQ9bFSpfalr/0Dfez/qugT6h8oUgVtaUoJBUJSYnDs2IkvsdeX3dnqnDNjbyApfayfsBLs7MzO7Jzz3VLJSTBFOumIzL+lQNPmDaJ2000BE2eixhMHirBLjWhhZiK4I6YnlaIn2G02EtdHpeNniCoSJrQLxvyFFzxRaylWSzcc6AYfdbASBTpRVdJuiilVWT+FhSsX8Cx1jxcS0zVJCqAwolsS0B40jlDd3UWlvIfZ6SJcQlbPTLJ7LTOnEt9hFJO0YRNiWCm9Qmp2mrvdrm1zQRF0AkTDWIxWTrhpkhPrGO2iJb6kpOnP5EjzlOLim+11SONPh9e0x4drtxvBi9qIawcYlkvYe/QI8d4erFYbhTiCF/bhQugeKaW1zifdgPGYpi8oDcWt2Jwk0CHnYy+Hqdk5XFq5gbkLF9iJ3J8qYP78AmxCOf08x5JRB42+o9NsoVmpo1Yq4c+Hv+Ph/V9Q3f2b5y8da+dqGOfncUNF6bFgXV80wMuXZWw+2sTyrXWkM54ecA5q4zG8srKM9U8+xvbOtkhLjFpLH8CI0vjbxgZ+vHsXX3z1Jc8xe9nT59M9HXKuJT9ohdoUvbVTJ7twsEz+teLzqkSfWSy9EGO3UDS9VPyT5IVWAZtbKTEDcl1kps6yyRc9CGPWoMoYfH/nB3z+9TeC7jkxTjjnntgUMPqr1RurbF5FDRf6nVevdvHgp59wY3UVoZtGHKURNFroH5Fx4T7arQOU97bRPNzHzvZTlEol7Dzfxc212/h2/juWWNC9vPT+Zf7eg0YTreaRRIro/G6aB78wgenie8yUIT+F1evXcXllGXNLC5g7vwhMFeTPdj2p1EaZ+0ozeKTodwy9ciTQF6RO9y712lDGZuGtUeGgGNLXBz1U63XUajXO33/2Ygubfz1Bfb+CoN1G1AugKL9aAZNuFj4R/UgnSVplatwR3Zva0n0xtJOnglD0vJzD+00r6KA77POapLSB4uwMFhbO4eb6LU4iILSf1og34cOmuBlLZCF0iCSLHroO8icJhwFSafcYuvV/epn9iiiPOX8Sk8V55KZmcFgJEFoW/KzHaQBe3mVTNtUTVpcpM7LpNNIDQlgPgFaATG6C89XDxHPNNP94X9VGssZc77+aHKS0lIAOMPTsIBMuu6fQqdbRLtXQrzTJiEGKE2KxeK60ixyPfUfybp6d8bP9AdxmA80/HmOwvY1ct8tUZzuSxlKM0xsAsu9orTkhuv0Q9a0tFC5dhEUF7YSP0I24MYdyHXvPdzG/epFNaLiRrf1oTnuxB41KyDs08mvbsp8RrT2diFQihk//8AjD7oD3OTH/CQXFYR1/GqGnoPIes6L8swX452dhVfcR7DegyBWfaOZeBl6xgPzMNAbTRUQTPo5SNrq0t2XSrOEeMjokB292jLcdPa9JIzYbkfa1Vzp6kK+dHzzycEpP+cgV8tx4J3aUKf6Jespmf+9gwIzRUHlv2ePYrNgyyLy8p/U/aHXQeb0PpxdxIUiRZtT4dPod2EEX/UoFLqUXRaJdJvT1XS9zgI8tkRxk4WBwGKDzZAe5szM4s+RgkPU51tTyxAxxnIIoY2My3lmSFdtc11OzFrUWqj//iurzbcxfu4qZpXPw8h78XJYTQwJq2MQGGVMjyr/+8GOU//GgJc98ggwxNV7rUgmtZWd2Qo+HCo3aobDe2N1ayb1uimqi4rLBFbD84QrL7tjnJJVBjyUCGTTRR7nbREv1EKWyHOuW0tFlkSkmouNNXgM8EYDECDOM35Nofg1CFCdzwhPopGkQcIM4lv2CmGzkZ0DMSW7uKPGpoXnphUMElmJmoNmrbOWM5IyM8tJu0B9iMnaxVjyHNWcOi3BQ0NJDE+BFRw1PpwLQk3rNmkR78QPc2XqI0I0xJJCA1qymfPfDYQJRjUdG2HS2IuSeZAm0vtkp3EoYABq6cBjxczVPY0tNeUeDeHS9Ov7L1ug6A2k0bxkXYTgQuYclDSySznqFCQSdLiwljcSI45D1eR/C2FQjZqRuVuiUJmpI7bVbuP90E1dvzyDP+nptLx2L2/nitWV89Nmn2Lj3AI29mtby22Mxm4p1s4bDh1B+/AK7G09xYX5d8taVZGLGY/z81NXJqDExuyylCx9HWMqJKLZBPOA4rIyTRpMax80eqp06Xh68RjblYdafwtyZGRSnZsTcldi3kJhubkr9619gbMdPbvIrvUbNb8hOOWSKP0kVuqqPnVYZ5eY+qo0qjnpH6IQd9FUPrp9BxvG4bqAmHrMaBlLs0ZOFzohDNmU+bhr35r3z5ivJxjFjGCfQdvZbsN5uKpg6Mlbj9Sj/L2YwavS9VMjTmuYaTrGUcpTXr53qzWfxe21y52j9++g6jJkugUiaAUrsFlrP5ucCPidNQI18U5IBOIqP9fUSC0rr3aXYSVpDBAAx+Hw6OMh7jJbE8jhok3wDSMk9NvY8EEbAmKMyHiN9P/C1kFRg3AQcJR5o80QBwyW2UPwHQplzndRH15Z8CXNCZBjGhJCaHdwUAPAPAAAA//+0XVlvG1UYPbPZ47HjOo7rJilZSqGUltKq7OIFCSQQi4T4WUj8Af4AT0ithBBCPCAhFlUgdtoCbdPSxVmcpPbEy4xnBp3v3juepBVvWIqsbJaXO/d+3/nO4prsRmgHRWgkxbgri/EK3R4nE23ApxAm/lw9SCpv9ESjNEUJgDxZDSVa2sSAUza+Ufx7Po5fLudaNhN3oCgPOpLF0Y2aq42mtI6DlCXmrU8XqoqV4ScWRgNU6y0Eiw20lhexe/mWfNBeptAn6vjGQhtMMYyA29duYOteB/eXllCuVGSSmepILonkM69HDiY3nwhv3LyFw4+uIPCpvUpRCwI50MXx0S5pPwSz+A4gO7amdrLIEEd23peQeQRHbJlclytVASLEaCq2UOHjbm8hXd/A6NY19NbW4PaVqVNJcrgn8GyVUe3qjfQA7KAWniYyGTUjWQIsSkr1GprHlvHYuTM4cfZpLJ04jvmlZTSac5htzCoXUE/lY6qYjURYAMaqROJdogw73S7+uvInPr94EV9e/Bj9zj3YbOIZjWanAvSgEK4ghlcEhEgZHKX45cef8erbb4vBoef6ufkZ14nfCPDWe+/g0wsXMA6HKmZEsywSnTHNtfrh+x/gzVdew6SmDgsVT2lYD2q7tfMnoQrVBxHkVNz/WY1JCkA0hpUoCQCN42zqzhivkyX6/2O5brhe6X4dpjG8VhP13iKyPPxGMf5pQP7Nd98LHf3kU2cebAhNkWYdpJvllSPefP0NfPLiC7j05VeqMIqGEqvIQv6p587LJsHonbUrV3Dt5t+4u34H3e46xjSki1Rvzofv94d44913ceTIAjy/gtPPnMH5l5/H1Z9+Rbs+h1arjaMrqzjUbuHxM6fErf6R1WOYmz8CmxsuUWG3tD91T4tLsn2uzdR1+Zqwl1fs0gukAgKmEi1DjZaKhbFkQiEMDsYl6c0t7PcFvOjc/gdrV/4S4761a9fR3epiGO4p4FKAnhjNRh0lN0C5UhImA/0CKFchcyNkTKEGORUC7MjPuU8NODW2lYswr8H63CxWF47j9PnzEnNF/4JHnziB9sJhaYine56xN9ImXbaiU9uOaiYdT039rfxK/O/bw6af/+dNEHWoA53mos02fRkewSbBFE7Y6TlCE0BxZTcZ1wYhzSQOixP3wd1NYDtEqdkS4gcHrMIrsnMfM8WstKfRnPYBD4BM7+upNc3DzbSfCRtD0ngp0Uj2Rhht9tC/s4V4sweEkaC7Hqf9lCZ5HkpeIFPOcDiEX6nBdy3MxkAzHmP3t8sY/nEV3mYPM1zK2luEmuCHWTOYe7W0szw1pu562FvfAja3Ua/PYmdCxUcVwyTFaLCLvRt3EC40UWpWYfsl1fhYzr4CsQiOpEYPbXSEZBrQKyZfNpmAUR7PRGqug4pEr1m7A8Q7A7muxEgyU3prgmtOpYYos6XQGDGnnkDYfFu8G9gQkxHD9yxxXYw4gS2XMKG3hriQK0q+0uvqRtu2NF1ae2ywkNLNmwD4uhG3tOZuQtUvkxkqHvxGFdW5GoWnpAqqybA2vBQB2n80/w+4uB/4/XQvd4TGGVB6tR2Kvj7d6sEeRDjkz4gmk8MJuv2Pt7vYvnMbM/S2kAlhDKvQahQ/eyUJAoyRmewj0vDZip5PecPGBobfXsIRyvCOrcLyqxjYtsij+BkyClUaCa41w47honItyTQX3SwlW5wS3e2is3kfnUYNtaPzWDi+Au9QDc6ML6kMiZhcjeVcFyfqOJJapUgxFdMnaaJ0bFyiDEYJTJcJUJRDWEEMmxb2TC2gc/wgxl5nQ5u6pfmX8fahLwF35aDq4fipk8KenAgblHI4DyEidMa72JmMMCnZYjYIKO1+sSQygyboulGKZxpcWqYQV/IHkbUhE8PgIc9jKK3rOFaO5K5nq4mgTGjVACmwXJSTBE3HwaIfoO2U0XB9kX14EqVp4e7wPm70t9DJgJ4w9hKUazMiD0s1A2zEzO1hhFOLqzhbbeMoHMr9xYPpoHe5IX/X9fcvui3EK6fx0c2f0CNg4zjiZzNOInXmyfQwzieITHYSTywdGwZNkSZgZUzHisZtYh4qTY9n3lB1p+toM5H1yO7SvlPCanRcDOjfAxsz5TLK9RrSzobI3BiTKRt3VrimLO09oN3SxYNBQAJHru/YzvDN77/h7MIqlpbPCmXd1YHL/ISDRgNPPnMO5156Fl9c+CzX8hugLtHGhmSfzNgZ9nZT/PH1D2icXEbw2LykamTCJnLkeqHxGc9ueoXxtWfJfhf1g7nqxfWmjBgV+BAlY/hVTyN5KQZZD8NxiM5uB6V71xF4FZTcMtqNFg4FdTSqM6iWapitNuGm06bYTKd919c1TkGqk5/6mbA/EihjtjAJMU4TGTLcHw2wE/awvr2FcNxHb9wV5yiTFsZ9oSysTrXPZDJgneSgK3XravAaq5g+zQgw8W/7aPn8rT3JIxsBY56ZFpjPUwaW71ekF0RhCMxaSmXnT9OU+L2K45uebSZqT9ZMgTWoYgFVzSV9pEhcVFqao0FlA+SgAEiYaE42vdPpuaPqSC3ZnE75p9p601xzGm6kBBwGKrCArCCCA1PWOjX+3OPygTOfk27K+XcE0qbmh0pXb248Y6XnKAAiArAXZT9Ggq2NuindLYaXsj8UUFZ8T5RMnj5Xcv4y/ruwv/M5cL3zdRO8HgwGOklG1XUCcogBvXrPoijCvwAAAP//1F3bbhtFGP521+v1IUmTJqnjNnYDTdtQSoXKRdUCT8ALIFXAC/AAXPEOveMRel+QAKm3qApCUKSmB5raiUNS5+yzvd6dRf8//+zaTSq4ZaVIjnJYe2Zn5j98h5QZiGjE9xSG2+0kH9YMpLGN8CRxh8ASAlFihKg0am6HhoTQwqRNbNgb8kRqaoHDohIqDOM3R0IntJi5aqlUjBSgw4T5T0rboWScDE8KwwojwycUNVmyYksBHWcAdyaLM8VZHL6owWXVfc1LD81XBOQsYHujho1KFUuXL6EwW0Dh/AKK5UXU1yuaqyddYA5EI+HoBAr+YRODrTpSbg7TuQyaQYQsdT0d/dAo43MF+0QBgCAYjDKwXVhkJUVVMioCKK2xwId3pGkFaXrjjSZ84pJvVtGrVoC9OqZdG2nqbEZiNSgHszNidac7WMm9Q50OcwGEuE4ExZtfLOHmJ7dx4/YtTv7nlhaRmzvLUDUnneaNyzFQP1Fbpy+CgfZE0i8Svf6IPO2KcygtnMXn1y+jdOMqfrx/H7UnTxE2mgh6HdhRmKh+87MWxkcoBSeV9SoLz80vFEfGy4y/wvsf3sCdj+/g4U8PIajYmALACINAofLkOX5+8AM+u3sXgUqqmfzuLX1ove0yXtSx5ipVr4MhoqDPY838eoMHseS1pQtKkGIVdUfpfqWVa/jbcpDJTaLbbUo/UR86R4dtPHjwPZbfu8Ye/Loz/t+SQvqt+WIRX3z1JZ49/gO7R02e8/rrGr6YeVASAAAgAElEQVS7dw/llWXuFhzUttFsHLF4J4s+BUM+6PI5WnMDdLqKPe7rOzt6TWWzuHDlEr7+9hvUnr1CuVjiwsDZxTJANBTqHoq4lH6sjHBN8ozpkbHj1xj56TDSgoq27itoqomtob4sviM8Z4qIB90OJ2Gszr9RxcbGJtbW1lCpvEKlUkWn1eDOPgUqBHvMpj3kqKOXcpAXKy0uyPghBr02Bzw6UBKbKVujifzhEB1RPw4k6CJxPuLul5bfZQvCK9evMfplrljEdGFed6wFcjfkrd8U1xKm4P/9oqNoZr6I2WIJW5svMWgdaMg/UWAyLryMK165iWuKFYTIkBZAq4/B3jG8cggnq8fDluAdJsE11XVZw9GIgCjEeo4lFUXXQdtiaVsbi4R0un3WdSDhRn+XON19Fk6l7r1DzigkGOm5fIirwOJnhZ64KSro+EPkDo9x8NufaPz+GF59DzMUUIbGyCQ8vXt6ymVoZekwQONgD+2NTeQXL8KdcFjkyhHtFvRDNLZ2cS5b1nD5lGL44WmXhlye5EzEMHpJQF1HQyGRdtnqKGMpTsAoACAh2dDXomlMrbZlnM1ZRl0B6vhF6oRdqtYPsPiMigu1hFSiIMdO9mNrpBvHqCkR6dNK7RH/DbsBWJoaZU948M5kGW7s5Gl+9DkYWiq2HoukZX+aMrVROH4bso4TKSvZdxyxHO61OggOm4xMIeh/1nLgUXIFLVwZElJq5zWsbgdZy8DooxOJ3b89B7FLDqGHQgW/vof91VWcsRwULpZxQHGQJGsiiztmMxkz+V2HtXWI9hEFAvGkAujeMdqNNv6q1mAX51G4vARvepJ93F3laDFHitGoceBacYHO8FFt0XeAgS8rrUMRGdpAZHCBNlIEkW60kOr02T6WdQWEZWDqvK6EOJNzM1i4WOK4Twndg+iSRDk58nvokhqLMwKllaKeij3jE1hxPBLxOavPfUO3JFjvgAsc2pdfjaAHTMPJNkiuYYi87WLJmcSt8+9gGVOYRQqTGnPJ9Ehao/tTPdQKXTzaW8d6+xC7VojWcQNeOsM2vr4Vwg0iLLgTuDo1hzImQHLWaWl8nLZTmJGkIkAZLm5mLmB1Ygv7zW0M81m0qMicFqqPiBvq59rEK7ZeOwLd1QggiSAcO+7WRqKEHhi7wMg0GmzuAhPqlmJKOiP9vtbQIiSDgXnzPqn0mre8FKbOzaK1U9cIpLG5EISebFlGw0BZYlcZaXeelu9j9cVTrJxfxERqQiOqLE2voCbPpZUVfPTpHfz6yyM068fxGou19g1iR5Ab28+r2Fp7iQ8uFBBkSZDaFAHG7QQxYun7tovzHRGMBWtXWGPwdMpJrBEKIp0j1Jw68huIBhH227vwUh4XYkiAdjY/h5yXY3FvSr5MoknfI6ZgJLEm5UmU41CSPAyHOO4eYaCGOGwdszVfu0/QfrHXy9gI3AFyojNGelZEbyTnDC6gsd26xwXMUCFOfMd2E0luGyJWHL3hj0UxH+VmFDNxl90f7yDbbjKeoXqTU69YyFFTA8TdTNlSELCYKhu9Af83r41IIIvvCezddK9NcosxTZMk8Y/nytaaIVzYTGk9C5sLDIrfWyqVFtcCizUrTCHAHrEPIyROQiEwdHdNd6B43pw1tM9QsWlU84ByV7Nm6d78uchVi9Yhd9x1EURTCpJu/+gYmrzaOArQHLAQphTSx+cqYKHt0bkjGo/5n3RfyqF1pz9APp9nMWr6DDQnLCpKTWTXRb/XBwD8w9y1vcZRxeFvZmd3s9lL0k02aWxzM23BVqtQpFrS9tUL+CD46Ev/HX30fxDBF7GID1IEMaCiorZg29jE5n7dZHeT7O7c5Pv9zpmdLJX66IFAG6Z05syZc36X7+JZiwPeJDdW+zL8diAP7JvOv8KHInNNz7bBNTYtceCLoJ+lMIgdglQtbbVFORwWxqGcf1WHlIoFE3xTPRGqAP0jgx6MXriAVGqVBasKkMKZO3VmKKQszjtSWR2qljA6dQ4rxYeIm93kwFN1T0eqnkzmWvUWNtbXsb27g1KxgurYOCanZ7G+uKxewqn/Q3h3BsaebYfY/eUhRgMPlYtziEuOiHpRAffY68rkM7nvf+nK72TgY/h3wvtxpIrKzZqQHibJ2eYhMod1BLtbaK2toLO5AeztIk/rGMK7/Bg5N5RN0nZLMgm0X339I5uYykR6smCYEFdKw9LNfHV+Hq/fuoWpC9Oo1kYR51wUB3I0NZBnzdtOrulf84dLp4kQLaqpE66khpCgdnQnDpFzCur9XAaqb8/j+vAAvC+/xl8LP6C19FS6TK6dR/f0/HKWnjxexMrfy5i5MKc2rynRqFymgPOzM7h5+zYWvvlWE0Zr30OLwawK4HHtfP7pZ7j9znsojo5IB5+blApKGdhVWtHV3IOF3Oghqgq7MpOBogC8ODIyXlHKe6lXBBD7wqyLzIAn1eVxJpFRLAnl5vFBImIWGQmdu3e/wod37uDcC9PP5f+n15FjiK3vfvA+lp4u4ZOPPkazpQieemMfBz/+rN8hMiiXywLFZrI7WMghS4tPgQwBYe4E05PjqJQLopRLJIhoAszP4/KbN7Qwk7Fq/KFAipNioXxF2VTUa759q+9wyt9Af5N3cqZgFJtOuCNJHjvvhFOtr65jY20Nfz64L5aDS48eYW9rGzs7O+qcEUVy0FIEdCjroVAuIndG9yOB7LIbQHVh2msGGlJEBvZkIws6FvimiyIImFwWk9NTsq6mLs0Jf59QVib8RDvkS4NajOSekx2QoiA1ETwoIiqDXp7W3y2U549TJ5kZ/z/w/7MGKUgFVCfOY7h2FnvtJk78DnJeBgVa05UG4Wb2ZS+T5B/KBWXHrXHQwsHKBiauXlFnFkcRYO2gFxBZBI6leSTFUrO/Ku3MsoA04CHHPeqc4Hi/jpPdA3TqDQRHXYDnFQGPVC1no5Dn1EAeITsEkZPAgWu0e+sGGN6ro/HrfTS+/wlnjn1JElweumkQy3+xfYrtOneQix1UnBh7y0+Rv9qCOzwsCS7tL3NRAd3OEdrL62iVShiZmUioPM8aFsJMO16uN+nUpjjP4qbCfSRjbeUC6X56laKepYODiHe1EIOuD7etcEermWKfLTCdB6ujwoJwaJJSQFXuIT0aA2Z1DI7JySTXKJJDk0hd9MbhwGCvyVtnB8vJuRgcqcArDyBbyov4X2g59JF+nxI02X3VevDGbmqvPj2sJVSCGnFVr8j+XfZzPxJ9hMbqJqJ6E4Uop0Ke7KhGtHKLBK2y+2QFZXaNudYSFv3p0SvkW2s+Y5VmNC7sINrQE5HfCN2dbdQXFlDtBijPTsIvVdBkokKERVoFJEaqQ2fOCHYo2SBgchWmdtPDY0RHq9hY2YY3NorhszUUac9YqyJfyYvoI8WQw6DXHUw3eIRnzLjNVoZiLcqyOCHUQ6JEIhcn2/sU51FnFMPTdp1enCFOM54jYoUTs1MCVwdjN+okIRbayObRAY5Ipcj17j9wezI8ybdk7s2zol6+orJEMNk8A9cHkx/uvxSfpiaPaE+ZRNhSRzXGgmj1nAmBt8bn8AZqoPdPSSD7sVEe0nmeRgGXkMfl2itYrLVwb3cRv9W3cBg5aPhaFWTMNVOq4GKmiiGqfaf2+/5Cd/85QIzYODK4MnYO97fX0PYiHMXKHRBELWNtv2PsrqMksbDK5EqxCRPus32fFGG1yuXKO9Z9kigbzm2BvuGRFgjaQVtcDxhjCgWB8SfpU676gtNBJT+QR7FcQmNr2zSLnj1kLxZLQP02XVNd5HnYDkP8sbqMB2vLmJ2+iKLoI3iydjhRleERvHbjGq7dvI7vvrgnRZqU1LOi5xwF0NPCvtkMsfL7Y7z48ksozY5RvsWgZSJZq6LZYPYHt49D3Q957xe7Ez60oRsyflMqs3mjkWMBTsqld7SBQDm+joh2xzjuNIETB9EeEti4FeSz8UV62BiGa5rrOKJJCmlVgSZmYUZtp/nnbN7BYHZI3i0bFLJOrAuS7XIzzhFV/lDevWijnRr/XsRm/mURI+Lr3wmkiZIefqqjbfnjUUq/zI17Oi3WScBJtOHUFS4wqHDem73Gfu+J+Kd5HtfoCQgqlE4YtJAO1SVN7QbdU+/YdryFzmGs58nx17zSN0m4Y4QslSbgG0FRXucQjWaq373OvBatBeFkhATTXXs7ZE9KwfX7tQKeNwQRYOgIHAlXP/CNED+fu6tC/OaZreUf/61erygDWcuGHm/v94g24Yx/pFCiznqCFDtpC2qq2+3iHwAAAP//1F1bbxtFFP72Zu/GdmK7dpy6VK1ShFBRCw8VEqVSiyhIBV74CzzxwD/iAX4C4jegNlUK5aEXRaoKpU3T3F079tre3Rl0zplZe5sIeGVf0iSOu96dnZnzne/iM0qYTKVLYKL3WNfNuguf35BRCmM+xjEhSrOBGKFcVArRiRA9hB8mc7NFJiCojLyfIEOWqsQUNOpCE5LmCQJKE5J9UNNkRhOhn4vRoI/h0RF/b5FO59gULCgeG3n5wEKrinKjgv7hEBWigaqpiY0T79Gy+cvdF5ucc362ex7NVgvd1XMor1eQDvqz99UzRJQjRugvB30MNp6gTFEtpztYWqpjshAi9H30ubhxuKjijcncBsFlMxPXFLcaJaKjqSl8cmQnhG84Qvr6NcZbmxhtbULt78JLpqg6ihFVmrQdYk8omD5C0UzKdmFtBrP1FWi22vjs5i1cu3oVl65cQXN1FW4UgZhSInvQjIhPzAQxMvm+k7zwB2v69jDEAWn74j4v8hMarKnC0WicmwkRMFGJUwTLDdQvv4e34hgb27vIXsu9ze+cNcIiGpen0Dvo4eWzP6GmE3hBJX+N4o1oxiyOjz+9gcs//YyH9+6LPh+WtquMiQqwfuc2fr99B9e/+JJ1fjyRz+2h3LmNpdX9i37QOtxIUkCmE2g1Ydp/vlM2L2EfDDNpsPM3OYkGovNMsgBep4luKeCou6dbz5FYY0k2pNTYePQY62t30f36rdyl9D8ftIhXInzz3bf8vP34/Q/cHeJFBil31ElRFseuTCqBh2E84eu+VKuh3VnBV9c/xM1bn+PqJzdQCim3OURMXhJOiMRTYtLDm2GJFRRKkWyOOXvc7rb/teGdK5mRZOJwTJq1F389Z8Dn/m/3+CvF8REjgXT9bqawGIZSuFWqKLcjMXHx/TyFgBB12sTSvIBymU1PskzkIrTYDMgokzZUZiNcq9ZQrVVwZmUVnZUOLl58l4v/c2+vYvnMadRaTfgUzWdALaLmcY6yoT0qiM6X5U28wJhJ/43Pf+xynAAC/B8OWkiWm8tY6Z7F/stnjBzT9aeilhgAzDwyND1OZCEaOTEj+jGmOz2UpgqlhDLGab724OmMuwSpa7kAalZE6+KcEGgp8Pje0ZhOMsSHR5gOhpj2+ux+708pcTPjiMRSKWQDopRcxukceG1TfF6h52FBO6hTbu7eIXbu/or4wQbq/RGWtGjByauCabgFEKA4gguO8Lr4bxfiSXK4s414ZwtRt41YlXm9CsoRy4Io5PrgyR+otZdQWagL9ujOPSHcnDVbUCWOxIVzcIpfYbP1zbn4oYsoXIRTSzmOdrgzQHo0Rsaxshnc1IDghm7LjuzKNfp1xXTSfLjqoseOHecMEhi/Ds9AfKKkMk7KNA96xMRzoBc8BAQW1atsAqZDl0ELxb8XkzDH6rc9xzCznFyCeNJxrFM8d6PsBlMbMIlX11GC+BVF5B7y2KNOGKV3sOQgnkL1+sDONsLBACXeH1hWm+WAzcYlw8EOjMUdXZ85yaMWKn/uOUCFX+ChP06Qbm3j1doaqkmC1oULTC/va40jcqV252dHGQl8P2DWI0dWN4fYgsxw03BLC7xHIzAz3dzH3qsDHLabqLQaONXtoHKqgfJixKkkHIsZBIY1IswSKvyoiKOoXeUH4sBNMi6SV2pJtyiRdKXXY2+EN9UYBc6X6+HsOxcRtdpc5FOXl6A04tsMkeEgmWCsJZ3in6ZAayTmKnlnAm/CKOLOq6Vss7yS5C4lP0+QkuaVl6dNcUoVFQLU6EgzXGos4wO/iVVD1w/4oZuNcxkpPpqOi1OI0EGEequESuphbX+PDOkxJoZP4qFTqqOB8htAIQzJ/eTDNf8vAQ/ngwZOh4t4mowZRB3pMV97K4O1VOGZfxaMibOMbadQxEr6lS3oKdqLNMHcfTXrjccMnUyYm2ZTRmuvpTkT9uUalJWKkTLtkQMf1VoNcdJjEJ2zyHP7P+mQO87sOXSNjJJZMwR6+SF6mcYvjx/i/c4yKmGTP7uvhXVLxQ35Sl259hE21h9g99kmv/PMytfNnfGp4VLOgM1HTzDaOkD93IrxDHBzJ/2TZoqc1ewWO/yBdVVXM6aIZclY13U7LrhAtRIFJUUhjTuthaFIeyoKKNX5axw20+OClKJLkzEXmfNHGqQ5kzogk1jaW9N+K4i4OCWgxLrhc+OCiT8TYUUztdtlsJQbmNwx9o1XmcNJFgAK+0iqk+Lx2HhpZPn44e65ts+L0O1LQZHCziCUM7uesACozvJxmqcIcDGbMPUfxpeCzpfMqucLYiuRyE0Dc3mSErd/c7/sz2k/J/Jwl82J7WG79BY4mDfQE7DQxay5Pbs2Iq+ZNwYk3b112jdzuV2PmVlkGPCmqLZ6ejtfcS1pADr6va2XhYkwWxuEfXB8hqB5S1I/Eh4zdJ/F2NDUSNbg2sgTEmNQImkGRXa3ZXvQQfR/O6/Q+k41Oj3f9BmtbCAIAvwNAAD//6xdXW8cVxl+zszs7Mzueu1dN/baMU2bojTCVEWqqCIShFpxgVTgx/AH4D+gSvwBuCpIveAacYGiVm2J1BZECGna1G7tON7s2p7Z+a6e9z1nvBYWNzRSFMly9uPMmTnv+7zPR1BZ7ZoJtOEXBNXXB+iCX4ZTClJmiBhYN/1AKLIjdWUss1ajUNrYDUcLrMXwQc0cuGn52oXobjpqoFEvNUOWLtLSOpZcvtWnQM1PmHUqOY1VqbGCtdI/BP2hBgiVLDxRp0E4QHx1iMHOGNPHh0iLVExJ3DV28xcu8fH+Y0z39zB9/hjxZBtXru5g+/p1PPj7RxjycClqmdEH8rBvMUIEpkR5fIDTe3MEjzcQ7ezAjIYI19dEw16FPSxo9CJxOHqws3knTVYySrmpFim8ZIFmOkWc5sgPD5EfHStl/mSOLiePnPDQ3MPR3E2ppuKWMrWcyS/PJ4lzIoLnwYR9XHvlFfz052/htR/dwquvfh87VzascYQNOrFDOGp6EtvsJ/bvHilyyHCIFF8uVM93lJ3iJF9gkWeauc7rSXojgZdFIZuMQEaPE7uDrzGOA3HhXh2PkMzm7XS4zUI1Wglzs5ZZjYNHD9FkCUxvLB4JXHXfOspSP79z8zpu/+wN/OvePVrgI0ZHJ1ek23BNeWTlJf78+z/gJ7fvAKRR8bs6jY0b13hNG7WmB0EtEyhF0qntLVBXmWitpDALlFJqKnUIb6yQvvGoVS/FWAcRRw89rG/uoB7F2Nh4Dt/d3cXdD963lChrvuQZJCdnePedP+GNN9/EYGWoh9+lrs3/fczxd5MqE5PBX/3m1/jB67fwu9++LY73B3tfy4O6J9KXVA4OThBGV4bi0P/WL3+BW3d+jBdv3MDKaKSSFFvg0p1eUjLaFOZAyfqW8ldalJz+B/LdnVGJpSNVLc2skSI2ywvMn81wOpvj0cOHeHD/3/jk44+x/8XnmB0eiqFmYQ2O+t0Ia1EP3f6qvDcnSnyo0myRPDcWOGmSiZSBny5fLOThyvufaHUtiLOddvkehuMRJlsTrI3H2N3dxeb2hqRIbO1cxfbWlhh+6oeHi7DVUsco8yT0zkt/XfNSUG3YuNQ2Ks79e4k2+RKj4G/tT/N/vur/hptqxARbOz62J8/j89VNnCSFxFjS+6Pfj0TyxCzoQuiAhRQwAvyVBrNHe0j2ngiDYkGqesC9FSEzBTIWDFC6iEy4SHXNconmkoNYAMVSPAXOns3lmSFxjWe5eIkYcWlnMUKqfw9lYKT54n4jfZr3aSF6vggrnRgrjKudJ+h+9QQH732A+T/uY5ikGJEay89CHSWvuW8L3BoW9NKVqJxGAc15U3xJRBj3a9c0mH12H+OXruLErMHv98Q4lYVxPT0DzlIcfrGPSTeUCYcfd9X4rlHNs8t110P7vKjDEuhgzMXCVjLKPc0+57WQAfMwQpcGiGcZquMZ8meJPG+iOtC3scw8W83L6yylaNsoK/f6+l3pASNmdjZ6N+B0mme230gBQ+YXQy84ujORj/hKT6j+HWqKPScX0sgvmowZ+4X8JUADl2VjNN6FRv8Co27p18JAhw8h2YY09ax9JE8TLPaeAfMMJhygodbU89ClyR0ZTwTavyTIfiSgvmO7SV3U7gdtOho/lAgxeT56NcLGh0ejzwbqdW4UcHdNbMl9Ko1YjXQ6w+nf3kfvyRSj791Ab2sT894qZpy+VkweKbQo0UxAuSYSt9boId9oOq98JoIslfhCxGrMRnroV1PMj04wf7iP/nAobIC1a1voPzeGFwFhP4YfhQL0EACQRqIxiAY+iplKoMQQMS8x7vbgHe0jJzDCSGiJI7M6XrvotZUa+t0Ik+svw/RHklhUy2glkPt7HykeJ6f2DD+XjqiJpwLwzdJ0tlmaOopxpdXMyh7h9N8OoGAL8Cq3Awcy0+xS0TuGh2yUNXi5M8KtwRa2yIRzPk68NqZz4d6FfZaukMkDYB2ruDZ5HS9uPMUfP7mHfz55iiQtMNhelYA4l9njQICmNXFzTWmjMjAHzBkFAYbkzGU5MpMjbXyp06qsaAcQBCLZZASS9BGcM1ycYZhLAWilDhpTXBWZ+goE1j+BhnCStV8KQCC1nY1H43qm6Zn4X3D6aGxRwkFcVi4Qr0TwNtfFa8fkpQBOAnhJ866II1MofLluthaW85I/i2RfzosSH/7nM9x94TvYuPlDuaNXObqxrJ+VjQleu3Mbn/7lLv66t6exzvX5IWlwLmVloEH9NMOD9z7F5OZL8Nc78nnCOJT7xLcxfd5SUKuTQSgz4fw6kLDCyaoAIBwqhkELmnAgIetuTNuMEvBuU8p8PVNck0wT7CTT/0NQnA8MqUt6tlkfRPK20nDVmnpE2YBrIMtS05kim9Ll24egRPc1+h3Yd0jjKE13hZRgnNWBi+9VrtdT5aPAaXom/VltlD1C0Nz5Hvnifl/Iva/Pbl+e3+LcbwcargGFjdVr19FT3x0CZ57T7JmLJpxOU+9b0744iKWXC/zQ3t/uhlNzPV7zOIoEOMiysmVZiqrU+gXUS3tfQAJrBMmeU+rUqhIWgDPQY93O9XaTcAUGm5ZB5Psdce2XOEIOWhcF4piGgNxkVkZUqoRdwAWOTcXTRJt9nn/Od4Drw9fQRlwBvGUpksq8lJHkogmddwfvqLCrP3N0fF1z9cbr2ZhCHo98T/6ckgqJKVySATsJP/crrzs9gjSalQb7OjRX7yT1v+r3GRtoB/B1jW8AAAD//9RdWW8TVxT+ZvWM1ziOgeIuSUgD9KEsKhJ0USXaF9S/2bf+gRbUB176VgGioiyiBNKkxY6dzfZM7Jk71Tnn3vE4KUi8VOpIlhIlsj1zZ+6953yby5RaolnoN6KbdGpoVTp+z3f83CCwGIEgdJZ0zj+A3ocG0nR6iHZNNxpRudgsQf+fSAQUCpKGfBEwn8NNAh3xY0wfDAXC0uZvmS5IeLOk/6cSljCKZSMYcBxgG9vBM6SkV5GAgnyiplqNGF5knDbs7yGhQiIDFt47g+X1dbx+9pw3bLYOiYGONkn05pAXFLoxSa8cb+Gg14dNecmnluA1F1FptuFTPIVvcaefO4jkfMmZzeKJoA52GdHy4giDv7pwx2M40RgB3/0ywVna6M4U/aZ4NokG3Cki92BiWtB4uJIccOPzL3Hz1ne48e03eH9tBV7ZZ91eDHHHj8RsFRMb/DNtA0YA+tkU2/EQG9EBtijG6ugQe9YUOypGZGeItfEIm8oQGdwiV+VUaFkuIe0pHNI4UQzX3i6cccTGLnR9DVpvCu4Te70EiIdDqKP4xN8sJcZq1XoD17/+Cj9+/wO6f7xkGrnDJEZ5uIwC/e6d23h87z46n11GUA84+kfpc4fWGaOQ28qbcEJHMsnCTSm+TdPqpKik4kJxB9jWGnNZHDQVNvRYy5XUA1Q6bYBQGLeM9U8u8EQ4LbhKG7fbn3+6zUyAy9euwXfeXpIdP0pOKPkCToqbt27h8pUrePTgIR7++gC7vS58z0K1GqLeWkS5WsGHqytYu7COxXabdgQcNZkWbEfmEE5NyDN6dmmUUwHs6427xd4F/CxnpGuLeE6grm2/38egP8CTp0+w8WIDTx8/RXerywaRhFqRpMLLLLTqNQSOD7ca8DWmFhtNynEykknUEj8FjuCLqeEkiDw1AKOJmJPSBEobqXK9ioXWEhaWFrF2/jxWV1dx8eIFdDodLJ0+hUazyRsAKl5TLUJI/oMYvv8H3f/kIRvDFCVKBGm1UW+2sd/r5fGNlVoNYclDbE94HvccQXNpPvRTC9HuAdJuH81zyxjsDXktIESSG5S2aIB58dSLlYon7IKcxkfMAiFvh8PoCJOR/E4afuPoLUaALjK3xOwmyZcXB25L04EdRt4ypv0uHE2htv/Gizt3kf25jWY8RYMa1Ort40/oGDWUosyVRBF+CJLcvMccxodETUg6l2G4uQHV66FSqSFSSiKsqOCp1ZGMh4i2X2O/HGLpgw9guyKDiRXp9Dx50DKJ+HqXg928+brq4kCRFIkc3kNUKTKoNsFgcxuTaCobeyrWlfZnYMNaipjTekg1a27MIexKpE82VwM282RYd+5bcH2Hdef0LJcbAVP9VdlhxD/NTU4Lett3OL3jDJsU83pKw8CgupkbkSlp+22m/nmlDnkAACAASURBVA9f7QCDESy7hEpY5UElYKNquwjHB3BHYxz2dlAxdP6Zw0se7WfrUoec4hO/xNp2Wp9qRPctFB7HEW6r8N0CQnkPhji4/xuiwz00Ln2KsH0W1kITI9dm1DSxtKFEwXjISl2R8aks9xTjvAAdU8hLjyMIfxKlAKVhHHYRDfbR3dxGeHoJ9YUGNzvLizVJ7ykHvCmlqDV1NEU6msCeSJSmRc23yRBxfxfTw31UqCDl2Djk5W3u+wlqsrZwdmUNpdpiwSZQWACE/g9pj6hpuEWZxPGMfcxJLKCBnhkFl/aR8URTjh3NarPtXCLIaRiey0w1uo+zOMZytYaPUGWnfmZLZrNGLzDP4oFmhrIBnT7Tq3YLTxY72OR4vBive7uI2isw6epmfN9IbShISF1OCvDhuzRWE0FBIedj9PiWZj3xWJLpMRmvEaI8TQRd1bIAU2CIT5fS8tqpMLAcj5mn1EygRABzcNHkSdERcAS3NgLTCCtJiI6iEYKghsSxUWnUMY52pEGjshPXitfrwrWUZ0YzVpwSe4v88uwxLp37GA2vw3OA7J3JBNFF88wZXP3iOh7dv4etl92CXHDGuSE22ZQiBmNg6/fnGLzqobWwDBU4GI6HCIN5GdWM8v+G4bAslg9ONRJKMl1Bnz3tayaI/kR7lflhOS8+TTPG6Jyp9gjKIReLhLITwl6pVvj6UhoZFaaj0Zg/w2fzbCCOojzjXtnZv7bgcyo5obxklB6E/B3Ccogh1QZkmOf5eVEr+fiKGzwlJY0AlQnd23cLCDK53hPiXTBcZ9ZSYuRBdn6uRb06v4yJXkGCMnO7nyH5RsbDTEFCoOcSAnTjxDG6dWEn0LWQCL9ZGoYZy8ywC6me0eZ97BdH11PHOlIUuRTYyZzRnnHULzYpTOyeOTf6XNqvGm87KdZnTRCqNek9zPc1xoKSPCCNR2KV0EGfb5oD5sXfK5nm8YTHD8NSEaBboj6NVJ7rct0Q4KYOxZJSI0A3qZhJQQ0WzRiheYKuNzcDmB0rsguTrkDguYybVL+WZeEf8q6sN24qjB4vs2fppDNNmoa2aklA0EhVW6lF4qES64/hhyEQfUXiAQmJZ8r6QpWGodNk0maZ3R4v1+h8916PkwZRxCOWIqVJVHvsa/v7zncWnzu1F4sTHM+1FH2d52gfQKRy2IPjxY4NIEDNtdUouYaiJV9JrE0HEqPbMHn+yuhGcqrTmSdnPukQA5RCBImhnYRm4leMU+BiJ8DANoYTaXujTqMZlhbKaF5bE81fNprkDspzx1ldUAZjYK/bxbO952i02qi3LuDKjU1cvbqLzm+/oASDfJnphFswseNWFhOoFKVZgGivh+DgQKjE8eIFeLU66os1+LWKoNtE2jg1Y+zYrD+EQwZAGEjrWpkFEDtAz5FphiI9M9X6SGEtmKZRigoLbmYmP53kNreElfUNPPjgQzz89CPcf/8BLl5cRpUTqMwOEzRiymZ/TOM4APvU6iHBzuAEvWCI43CMUJzsQ4zSCNM0QsTJuMlwFgkCqSoGTFGeLhAy67TPImI8Rnx4hPpoBJ8odxgKtdvqJtXZHGBHJwHQAHI4HIoTe8VEI+UvbGOYw0b8ra0t3HvvPr7u7InTcyI0fC83biTSOQzHePToS3y2vYXZkC7YjtGcWirNfN/8RZIqE2+pgQBGHBEhOo92KtIFOQ+kLTIeKxONATVd5fYKFjeuSKQWgZmt7VvY2n4Xj398rHeXzYGcwUkfX33+Be7cuafzhF5rc805TPSk3C1DuTEuXb2OS6uX8fDjT2D9ZmGztAUkyjQFwTeRdL7WdarC1KtQoufQQGbWPaPt2O0FiGTKcHL0EseHh9jdeYr97h66nQ5e9A6w3+shGIwQjMZa4yd5qWVc9CtQlARVXCmEKKvgi4zIOdd4MpvkLyNBgBlxpFL5Pe/9TGQqiXymWqOBVnMV7bVViYe8vvWmmPW119fQXr8sL0xmsUNQXT3hdX1X1snZtu/fwS7/py2VddNcaWLjjWs46HaQpBG8SkViAnkNhoMpPGUK00hPr/gMm5H18WcXa29vAslE7utac0lGOmTMKCfROfsELsMI6TREMA6QhRGiSSBAUSQvNWM4ZZhGYuRD2ZhDKYHOi8+MsQ8nzdL8K4hUqum7WJ6MEfz6BDvffi/0/4UwEvNXrdvWDCjbiHiqwEri8zHWEqgp6iKhaki8awg3i3KtqjVU4zSVcFotzjDs9dH/4xkaVzbgpyX4cSYJCnFGh/caokGAk6ddLC81hQVAsJqj89SaRmWvQqO2kMn/nZuozLeicz5BOkrAspIjz1Xeu0vrLYQDLaNQkxBOzGmegq1tqd13lMoBcptvDyvDIoBpDYFdhakKZLLk1Esy+Vq+tAJVcUR/rmio5Tl/E2/63zbbPOaTnVQfa+hYWmwmvhBpbyD6fqI3tWodVWpcM1dAcII/Fa6N/QPEgyEtcfP3e2q9jKQfF+tDMSqc0RS3tQJVXsBsGMA5eiGR5FVpd7V21TWmoI6BDeT/c7R0gA4oC0mIaKeD46M+lm/fxcLmTTHy86tVcaAn2MQGEWbKI7HK2bzxlhx7u0bdecEJU1xrh/8UslT7E5HNBPzjRg1utYISn4uNush4fOObMhmOMDseoBzGEmdJ9tzspC/34YKdOiuVN71msWCqYtzcWJdY1OLatHKZk+EAAVlxZV2Qp4XXaO4zcc4COU9zm/9c6beR1JzQMXTa3MKRdwSBbTa/Db8idPu2SXF33HxgnQMRynkVBLD7ZcrIKoCtZhvfsBBXMX7vdXDyzjZmKMngyD4onDNA76m70uwrkeFKiqnUF6ZZOmffnpn0SYMUTDWbsmQmkqahkfhtU6tLs1DSDVCj3pDoQNbp0+lEr/dTR6WvjJLBhSceCcLMJWuWmu0slSGFX/FQW6oh6leQpCbm2DXAn7lLzstxL34Orvndl4f4aXcX1zZbaDhVM6BR4h9Er63Nu7dxY/sWjp9/Jw2ql7sA6OYvNjUan8u93X08+eFntG4yraiMGlkqkhLkFpq889ePXWOSoGDo9IpNX7HBJCvXn8swrDeaONJTS65Om9BpCrzWrC80GtLA2gZTUiNMc2v3HZv4tdzQjgZ1/zDwoX+T1mprzbZtNnXGvCvXUACfOMFkPJF7OtMxH9IHWaDIHrfnz+UkPN/IjfFOf257PnOKf6GRRqGJP1sXW6m39mnTbvVFT4+zf6+MnNJq0nOHydfcrO8CKe+W/s4+lQZ4RT28PTYU3qPWG8ACBvzcbOBtBD6/JzAnxy5+Urqh1j4ChnnBGFTDxplfm1fPiQUyi2uneCz2e0kW8LT0Xmj6lDSS3ZV7582NCnku6426AXaYelQWc2TrsycJJ8brSpsilhAE2mdENgB/AQAA///cXWlvVFUYfu46W3cqlKICBbVFgolbDJgYQvSTMcb/ahRD/KgECR9MiDGQllLbsEyns3Zm7mqe9z3n3tuiBkz84k1IWIaZ6bn3nHd7Ft+qFaaiuh8WN9qVGxcUH2wRAIW1gquTfcfNDSQjLr4UF0K6txTKYGJPWIn5N8vtt82AKq8DpigUVVSDLIARgyLfmDe72WzJwRYZz0t+T8JIpEtC4YwwF6VqTqcm3THyVgszK0uYWVzA6NlIVdgrpzURLjUPYOP8+ZM2Os/bGA5HcGbnsXxmFWffXsfug00gYgMgqZjnOQKzsVNcCTBIEVKZM4sRUrl3PxZ14YToh9DDhJYZhNXwcKeYNhPirAxAwj13FIIOscIou8uOW6pNF7Az4W8RPpgLDHbx1Ou48eXXuHbjc3zw6WdoLgYyjef7MbkhD490WbHpAfAHgG2k2I4HeNA/wN7kEI8GB5iEapM4yaaIk4nC5D3Thfd9M70vD1QG3jhTagOt8gJoEhn3Rki6B6glEcIoRb9zIFA1FyUM5q+40alwWEaFWMfxS54/OFhePY2r16/j1rc/IOoO0GjMYETUAAvHTEF5fNpu3vwOX3zzFS59+B6cWsMk1oZ7nGUVv2SF/WdS/Cea8BCmys0rr3NUy8FAWe0kgpFKNR4CjKl0zWTu5GvwFuYkyHhOgLMXz+OtS+u4ZxoAME0AwpP78Rg/3rqFx4+2sfbO+itxxSVZdxQbKgr2WQKHnSM2mrh9gmYhuufo6STKtnmqgna2sD+eahngIR1vkWcxxpMx4iRCp9dFu7OPra0t7OzsYGdzUyw093Z3RTVZvLUdbQby9wtOiLAZaIBJcik0EiuewjlerNzCLDPiXX5guEpKLSINiXuG6qc8GBdPLGHtzTewcfkyzl84j/WNDZxbu4iTqysa/HxVws7EaiuVgCKQOuHxJwYd4sjPNc2n/0lx8n+5ZKIszUdVoSZtorW0hEE8Fh9fPttSRHCyHykfMKdQFYMNpzepg8Pdp5g+ew7Xz9GfTlUfgIkkKUwUEu13JRuPxxPEwzEcNgqJCiB1SJID1jiBUW12jSOAzt8JK4680iHAIsso7DaDAPOkALTb2Ln7Czp376N2MMACrXI8oJbZJu7RA8jJS2gvT3sKmU2a85jUV+D5DQx6e2gRwUXNGnuG8Mw2BXTdiFou+j46m1uoX7kEt6EloR/UkIrXesyOFPLRCI8ePsCFVog6zwyBMMaVrqRpkv7LS4WtElkf0fMIM7ROzqE5W0e34+HwgJ1vhSATHSdCb6mhATgVXcYKPD8xcFspsune16wjmK2hPttESGE/Ovv4OfIwM9SwV0voXvaSxMmK/WXaLZGcg81zP4AzjTB82sf0SRth7CKYWRC1bv58DUJ2GbMPh4ge72GwvS0NfBfOUQRUrjQQG59TN8e04aG+sgx/4TTi/iGmzJf228jSAWqGold5B3PqZuKTzthNLbFarlZY3XYb7ds/oXWwj8bGBhpnTksO1vM8jOjiYOhqeXEzzPPP/ZWWSWSBhszzIsHPLceZ/WvGRMYpCgf2RpiSkuirpokk3JYCMo11wsznexJh2uvDT5V6V72LFhkhCBLPF1TZ7MK8UDCzAgmhzYvBeCR2yjBCc26SF04Wxfv9g2iW3dMcgjC+eZKAx/Ldhc+d5qVVmauTUXV+SAUOu1hrHnNCL68XRWpfvALDXU/SCfKGi54f4/v7d7D27jXJGynuV680DPNK7HQtXMP8XSSUiCH246nsRwEQQrnYOr00BEATlLSg8DWPTktF8upFukBgmp+qwaJoxcwUiKlxBlAEhSuUXSIomS8zf46SSP8n15l7Ok4xHA8xR3pAi3u7KZRO8fk84qmuDS0Ro3NQ0BazapvBcbE/HuH277/ho9V1LM8Q/2BdpJSud+riOVz55GM8vPMrus/aVUUReSQnAhBzENLyLMtw/+d7eP/6VfhzJ1Cr+UoNtN6yL3FZJXSiABJZI6eA9NtCqeC7u44RoE2PqL9XreA4HBVXClOw6UR5rDRn4zJEJADjqBVV941vvQxTq+5JFbHOYl9TPybQqTaLbot8UmX5rEBgQ6gGQREv7D1PTEPCFo5Wm41/Fut2++x4ZdOkFJUrxf2Ks8Yth69ZxY7Prk9m3NvsOqlOxzFhxmONBBH7Y0Mh/HvP/cTsD9Z4oRNKk4F7XbUR4kI3wXLb7aD4haZ5pVmqy60UAsu5tzoiasdph4Rcr2OIP3v/RH/EnLmCVD/q7U+Eg9apWlPzc4qCn6/l59imE2kZpLEbLbLCTYA2p2b4Xl0/vq5qj8i1tmuqApGRIJyVWmGbIAbRwV+Ogz8BAAD//9xdS28bVRT+5t6xPeM47xTSlCpS1SahragQUpDKBolHd/wI/l3Zl0jdUCQ2wAa1pYtC0zYhTZrEeTr2zHjuDDqP65mUAmKLN4nkOPaM75y55zvf49z9ymkcAmuQqFhQs2+F9sCGT7YyiWg2RH8hjbx8MY4XtzqSBm6kfSCUzC+8VqdTOT4qEmWCCiWzgR0dJF8QTaF6eQdJ0ijRhqsRNXi6QAWP9CPUVKSElpI5FckByHCQJu5pidbsOGYX57H/dIsp//AU0pJQXmlCacmeHhxzrBTro+I2OjMzWFxZxvbzDfz+8Ec29nN0TrSE+ea/HqEUcNMU8ISBprNE9yfwyOVmlFMvIIvGjcCoLIE5n6K5KasbCV1XQx91F4gZX8T6OvIEaDLdceXWTaze+QyffPElPlz9GGPtmHVT7PLOr6GJrWUTnn4IPAXwJOvj8ckhnhzt4aBIuRmijNGkmappoJho0aZV2BeyuOvGFuxnEFo1VXH8WQmNpIilRpaj2z1Co5dgOjCYKh129vfYzMuOktCDv/BA/aIUc59SpyDnNfp889HSuXLzBj66fRvfr91HkWYYFHVSd8DvdXDYxYO1b7G0fAWlLVizmJWSE8+aorJy/mdAK894ykmu/0SHDIait5KM1KFsOpXGzCwMI1FWKVHHxtqwkxO4cPky0IzF5945zL23gE/vfI6739yV6yQQ6l7GvhQSRXl/bQ1fX14UtgobyuBfH8b6W6YUPg/gFVbamFynUSOjSPp7DSyggyqMG835faAduQX3ej1ma/QOjrCzuYXd7W1svfoDmy9eYvPlBrq06SVmBBVfG3Ck1qyJmHpkvXsAvVWesdY3SfucK58MMkbbqR44LcbU4GeqrXN5yfnOpGWkaKupxQXML1zEyo0VLC1dw9LKCuYXFjB/6aJsKAmQIgaSlbThsmbVRvREytAdGdlIiRcjP5KMBG+PGvunx1/w+v85gMAAVyHGYWQgeunKVTzce81TtmZnguUWBJpGXIdlQkExRQQTksY66e7jbHsbbiJC1jDY7p0xkygNmAiKXkr0VtE723pKCzVxgW7dWdqkcidCxGmTZkJY2lhZiaprEoXTWG7+x2FwIQWGL17hxYPvMFhfR+cswyR5EJSq61cQeLQ2avFm/jvOAotes4GD1hjGrt9kk7T+oz7Kg4RdxBvVQFENQ4Uz04YYM73e2cfg1RY6c5OcqU9pKabdQqsMEQ4tBtRUnB5i8/k6R6i1JsY4dlVYBVJrxRtHQIogqG2Q1OipvqHRJ/SnXAfsyUM1TW9WNMW07QDj0TTGZseQnA5w1j1CcnzK586S2xnVu0wd4hXoLPQ8k48DsZpsHPLnNdMx6/1NK1QGFvmklMIkYGBviHoM7tumvX/38JFagIKGb7xemGyqOS3Vc4hAjAHgjjMMtg6B4wTWWbQnpyXbnpJ2codxFyA+OMXp+jMMNjcQ8/SporZbZfpGrMPOhfIdNeFmppDMTaI/NQ7X6cAkQ65fpl/CpH0QHcCX7aoZpHVXKDNAjwMFJogV2TtB8utj9HZ2EV+9ipn3l2Em24jHYxzTuWNQI+Brhr1qOA9amFxBkVdRmnJy2KB0tBLUpCtsx1Uqgg50REDqm3UBUxqkT84zzvxvZ0P09g8ZrLCB3CEKVMOYXPcySZGzYTINXDjCOYw4MQIq09g9OWLpIzfsnPSUVg2ed3OvrV9qYurR1EVQ81DR4RLJKMVEVkzRxMBLXK5LdcSk+5B31/Z6/f+KpTk1P17f3YRrBSiiELtuiJ+7L3Fvbw5fXVhmaQFfWq4Ky3nzbQr9P0cAHu1s4qghcYbZYAAyiKimlOKLNXodSWi1JnKjpWyNVhwjcaLh9VcD7TMrHbtSu2krST4PYYvPqaGUn5QGeOIqznJIajJoh0CAENXPSOroMHOwrRDt6QmcnfT5cxEjy/omRKEe3/iNYjw5BtQo29TAhTGe7Xbxy8Y6Ll2fYgaM5yRQYtbk/Lu4dusWPlhdxQ/37qOhAhJ/GogBmlOEG5l3wmCwfYzffnqM6+/c5prD95tC9hS0f7Oh7x9UOoLgXI1kNjLp/wsxNzS22mRxA6bNFq1zBk9Cc67m1JnHQuW3o0afjdMppjyKVTdeINLJ8mgKrexl33DasNpRSBLEsHrOitFlWGtuCbyg66jBHgZOjd7k/7v8fIRf4JNj/Ge3Bi3TUkN1fxyFxsQl/LkZdC98TSEmUQVGvK355/7NGgHewsqYk86HNVZBKKHt+6Q3nlxHEfqDATep3IC7XBkOKmXKNS5e15tnEciBCJAj/m/yvEz75Tzl3C82R5PuOsCDGhPAP2SoXWXoE6Dgf5e/l8m/B4jEb0Ci9uh3it6TplyuKfnuJCGPgF8Pkoghn2wymNLPDHhhPct6HGJIRr3M+KKm0SFNZSDuAQ4GAWmP1LDKeBCQzxsw+mPjtUdJFDzEEbk+/Q8BA3RNAPgTAAD//+xdWW8bVRg9s3pLnIamQWlLm7YpTVulCEElXugfQEIsor8UFfHSBxaBhAQVUKV0AZGW0KaOndrxNp65g853vzseuwsvPDJPUWI7nrl37tzvfGcJ3WC6QRatAjfx6qpqJ2kwRWI0p5+FhOQ85lZLIxENYaixM6lM0Fyp2Ba9soMhUYE0JlDaURzM4rOWRWDU2ILozngWtXFRE0pbcRmwgnj5FjVx9Gz+4AdGcs+bx48hWIyQDCbqQ+SKyemFGDGnuWUpzVGlgVqzjpX1U7h49R3s/PEASb+r1jY6D0t0fEeZLJaK3AEDRhz+beaBp1TrvEDyClfhPHdeP3od9MHHwefkyT2RDwR+iCQHFhorOLvxJj68/imuXnsfZ966JBnuontRMyR+VEcePqHo+9sAbo/b+KXdwa32Hh6ZMQaNChJpJyRCp2JnzqK7OpFy1b/nGv3ixkHFX04nboN9DRq1OsJxitGTNoZP9nGCOqnJBL3dXfSftuCl0+tXsADmDn40mR4ywfOpSd/8Qe3f+a0tvHftGr65+RWGo8FcyqkvnWPelDdvfI6PP/oAx9++ItIACHWeNKikcJwWoIN5unwwGqvzdZn/nvoCcLAFnJDWpC8bXkbuGD9GyqJmoYaw2UQWV4qwIV6asBLh3OWLUsD+9utt6YowzaDKWMbcoDfo48svbuCT659htXFSOhuklkom/iuO5/Y0fvn1zlQmk/GMC0evkvbBEPCZYNgfiF/DfntfOvvb29sCStCVf9jtCSuGJn6ysQojNKo1a7RUqQqYwd9zg21SjXhUkI8aYXnoEhxhxi07x0Oge3go32tIZhHp/AsNLDSbEkV55sw6Ll2+jONvnMS5zQtoriyJjp96O9vVVBZGaSNi1Jf7RVdraj3jzbpXv8RB+P+jdO08O8f5KKCp6YnT6/jr4Q6e3b8nPgCRAq6D3sCOu2c3cAHp8MbD6OlTjPZaQLSCdJShn/WQyKZuIvWHkcxfm8kuD29ji05+igODjT81gOMmWFgvQahafyPzjxF8tXGKZeMj3GuhfW8Hu9/9iHqnhaV+gkXfR5Xu9WYydY6eK/7dMuPW6GHo43FUQbxxHodrq1ikqevuMQy6bRzJ6DkzKj7DAuxGGVrWhZua786d+zi7cQ4HERBSe8r4Pnb/YoLEMSbJCOP9Flq1CGv1dQHhPDq3S1cu1w22/0pX/JcdLrZNWD5C+SWTC6rRtVGJ1YqPylIdo4Menu21YIIxsrEvz01PEwMkL5txvn6GeLEqMo7G8hLQiJCEBhPfSPKCfV75BciGFwFm/9FRuEiTHil6V64xIaphDcNOD907O0BnhNgEqNcXpejhsyQUgMbDQr+P8cNH6P/+JyImjjhjK7u8yH6AY8mCiyZqfFqMGS25uoLJ0SbGzTpMFkj3l92hg7tDTJIxFj2Nqywg7lxBpWmx5q4NJQgNSkZGObLHf6P7jEaFHSxvbWE0OYpKtYZDGrbR2JRyDi8TJh5vESYCunMqHO3n6bWuyNZ/KH93MjBYRoFIFiTyz55vzCQeslB6hwhJF5VmiYMyLFfMde+FGR75WFl7HVElFq8Lm64UykpM8JWmlATvmNufDdKCOizmn9C5WNIav+iwniN2oy+xXKEv4LE/l6w0f/DKD1hMwJ3/7Av+bW5yL7FPlmS3hYxyTN8Ii/MwiHDj7i3xOolWL+A01xYWq2lufVA87XF7NoHEpiGw8dLFg14bHWNZsfVGDYNs1ueoTF3P8+fNMKnj5X5aCozcSi5n3u86fFrscgayoIE6qkvSlmfBCqYGSGy1JB1lsr/MYRswlPkRJPcrMWrNBhJlEswfbs0s1lSd+25/YcIYB5MJfn68gysbZ/FavIyqXd3t2MUx1i9tSqPth6+/Fe8nzkmnrrDLj/WUoMwMwxS3v/8Jp97dxPKRNYyDvLwjV0ZpCSzMZ0FDKfYCa8THmiTRekZqFE09c9JlXgjGlwqVPrVyAOqypREpuuzAGne66Mm5gtv5EUTOgZ9SgsB274UpzXqp/PosnbmHrT7cykAiLXT5PUT/L5F/IZJxWlDtjdYQ5fN1zIQyq8BR3K2cxghT1IEL7jxYZzhJ9yxNXWtC8RAIxc/BGTVXdF1OVYuf6XkGvj+VUWhUnSuuA2VD+FrkTtkMti50tVE5PrCIwfQ99Ho9eR/BCzIvOHYueaEsx7BSjGCGyeFYEY5NISAZzWGlSLZyAOc/51z+KQVw4ADrY96PvK8cEOMkAZxLci7qp1BmlUx99JSlo+yewtdA6yxhUoi3i/2MWUmLpuA51qOncfPF+/X/Cihlr6f9/tMEBwD4BwAA///sXclyG0UY/rpntMxIsmyZOImtxIlJJTgQKEIVqeIQ4AApuPKQPAEcKeCUA4QQ7LgcshArJrYjKbalsZbRTFP/392jliy/AX20tYyme7r/5VtYA0Bmk6u77hYiwkqTUmQCI65FhLtIUwNfUDOCFLqJJHwBx+fQ8hK4KJB5QFvvVloguuNvORyc6Ke6m2HpAbQgYgrmlIE3mQmyHsa6skwdewW/HGBxdRn+YgX9Xtu5OlL1TXi3oS4pQcY67UN0W29RChdQEAHOLdWweusmPt75Eg9//omr7irtGjcAN/k3cBEn3dDD7Udn7KYMei3MZ6hss9PCOsKqsKdaKTbWpomQXoCPPrmNe998iy/ufYX6jasIKmUNB0n0Jp0au75Dw+9/ihib/X1sH7awwJogxwAAIABJREFU3W6iI1L0KTEOPcgAnAQTt5M2oAIbn8awdixK9+M5OOBrp8qzGHe+SEGblTaFBlDKOEHS6aG730QwTBCOgCBR6JKP+9GRhqjZHoBzeLswIVoWc3NzCMPg1Ho6NfwcPrv7OS6/+z22NjenDkzND6IN/KCxi/u//Irvbn0AQd0qUk9VusJulfy5Bz4aZIiA8bw565k2MwqOaUNJdGeNnRx8iSGJ41UrCN5ZhPSK2Rqgh5CCkes31/HpnTvY2NjQASZb6pA3vs8J0V9/PsLDB3/g6+U6M0dJX+OsMWkbdfarVKKr3L5Zc4nS0OpWu4mDvT388+QJnm3/je2tTbQO3uBg9zUfBCTIRs9DMZ9nfmHV87FUO5d1YcDKxh6G1MmnDv4o4c2RlIVjY1nCmyodQGQb2o/4N424MhmiXl/GhUvLWF67wgHklbU1LNdXsHL5Eubn51m0SuRypgCUah6suWep5T/bZ9ggcmyH3w5XYmeiQKeQUU+kmJZz+39MriCTKAidFM+fW8L5lRVEu3vIj8jTeR7VahXdtx1GEw9NAkyJQ46Uz7sR2o0GvIUS89wp+BLGVkojdHTKkJryTGpQGYoLD5I7UwymtYVaKjxRMEVdh3zA81nKFVAaxCh1I+D5DnbvP8Dx8+coGaE/opkJ4zVIqu2smi10AkPwXi8dd/5tmkP/i4oFDFevwl9/DykJnEkfhfpFdPYbLEA17yiBJ7bzZ7j7tC9Qgtd68gzi1T4WF66jKTyGdZOicExq8YRHJ9G/ZISo1UYrLCFcrDGKKpHCkFXSyeTfHPD2oOcOoaM8PA7+TFmWivAmEEmFLd6a4JzO7Jzi4Ci8WEOxVmb9hVEvZu43uXP0ooiDB/IHLwbUEawyzSbJexhSEdX6lAuRQbs1TcNWRqxA24zNdAaAJvP7V6fPz1mDLYGVRqt5lKV1+4gaTeAgYhFEKhrKnNYEoCApLyT8/gAg27xHW0jaTVSEpgtJa61rkSAKpjvjYUAe4NUacueXMFgoQ5UIqeEjzi2yvb0Y9JG8amDQOYIUAy2Ka2h8bmHfzVgl20ZqnBZpYXi9PvpPt3H8pong2joWrlwDalWkYZ6fnaFI2AaX5lEoNU520tyYF+6uFTVZ6JrwNjR3n1PUVHIRg4p2lBRK0t04jIATrUckTIIgMSk5QXMdzFVw8VKdn1Nh0HoW/t9LB4y0oyJh4jsZnfP+s8ZZxQDb4ZdZN/LsEzD2gN2TQ7Qq51Gb+p+nZvP/J94PYCPex4uoyRoG+bzPiViX9I1yEj+8eIxyWMDd8mWsESJJ6jjJM8giumNdJHgLH48xwI87j7HTO0a+EvJ+cdztsFaGGzdzjOjE464oNgxE2dJo846dWeaelWq6pjJiguWwiJPoJOv4shc4c9s9RhiS64MWztTfExvKhzBK9PT8kBjg8CjiOZZTGgqz5odzC0pA2BYciBKFh7svcevfF7i6WkRVFM1SSJg2uXBhCTduf4hr769j67ffmRqbg07s6WwYKpkVcQhO+/plA3tPG6itLoEYxMIIjAqDVNHuLBby7DnXNovsODnYLo+584nh60um0KYmP+md9CYg79r9bAwDh9nyMhE6pTvzXFSg/Mk0Hq39oJpKbPN+PvtsTtSTBEEQahQ26e74uulJMTfBy7mQYoTkpBKnnikuDAiN3k2sp71ZK7pzX8gE4IWxuZOpMAVj/VqVTK5Bm/NZNEMmEJhq/awROwxoaD/TEgxVgdYtfSdfUzouJCiHSjCx9p0CmEt3coe1tKO/033iJTIacvypCzmnc9bpoQsBlhZgizs6w3OLAPQ6LRSpnyHrFGBdB2ySbTvsrKVgUBm0b9BvZdqFcWtj/QJjI5itAeZ6UxHZ3Pvpa52ytbRzTzcqo5AYbQMaNtdmikCsdfmyAgCA/9i7tt8oqjD+O3PZy+xuh14oKrcWUUlArT6ZQDSoaMKT/pX6woNvTfDJFw1BTLiUQgQCgbZLw27b3e7s7NzM933nnJkt9cK7kzRNNt2ZzpzLfJffxaMBr+nKy0R3541NBastEoSfu3uyodBNM/RQLxK6MsMLPOFisIKihoIwNCZL0QxkAhsvfzNo+SEFhbHxrDQQBm0tmGqFRYKMmK4/D0AikHCGAXPxQCqqejhR5B575npHAiwun8CTjR7DWihhdTk4Unbwqe+y/XwD48E+d7PpgUVJis6xRXxy6SKS0Qh3f/sZqpDExLHGL9CqANBsOUcnJuXhVJWL9acm4FS6mFAYwmUlWCCRKoKPtWbmsXjyJK5cvYrL33yLj1ZW0J4LGF6X6mJBXIigFVWbtwE8Q4Kbgw08GPXwcLiDbjLB0M+5e89hNfEEsljqqwzZdCUQKgxrnAJlebFbe6hCRP5sTJFLZb3uysuPkvzBiy0WEHq7UUNnnCDf28NwaxujXh+eyb2Uss+Mn4XudCmGYSm0gjZqLNhU6cxgekEIFL/Aexcu4OLlr3H73rr+i9yWZJIs4a/TM7y+eh0Xv/8OC0sneN54BPOqeP5z0YMrZKnwn4qyOGOuV2iPT1GmSTmhIdglq2+Tp2ezhVoQQjGyxeN6eqF5wURP+fLKV7j2w4+sap7q+88KeaHv9vpYXV3FpctfoNnqvMZfepMjh0CpWVsMBfaHO9jc3MLD9XU8XF/Dndt30N3cYNeKPIqk0wUHDeKcFQoedfabIj5F6zAmtI5X43ul6jCtU7L+YvtH5SGmPcgt8HK3z+s8ZlGhhAs5c0fnsXTsA5xeXsLpM8tYXlri7v7c4lG0Z0M0wg53REDuI/S0NIxQcDK5VMk56XOn5sDf5BTlZnlg/dnk///jjQ+GdJPTQrOJU0tnsPPsBbZ39hDMziKcm8GrrlirkU2fOchLvJkpRgB0ojHajZB5sIWjtFWYJPrK7JdKo6AcsU2jvUfsNUp2NulLsIAb2ZelCh3iK/d3kb7oovfkKV7d+ANer4eFPENQAC1eh4rFPTO2MHLKjvohsH96JUdugUHNRT8M0LpwDvHCEWoFIaI18NYs3ONHMXjQRUiWZ0nZwZP9KBfkGelMZDnIZPLl3fuYP3sSzZbP+xDpAOQsiCb6O2RZiyhGf3OTg+yGFopCxQ7fQr3/ZT+oJjSSxMo6mj50oODR/+lLx9pV8BsBENRYx6aVh5pbb5A8hdgskt0D7XVubover9FoCscmuodIvPy3QzhKJc/fnNp0rlhwVlyL6F1NRRyPLBC3h8i6O/Dho+l7CFoNbpBPxjHCeo3V3bNuFzv37mHw5yMEZOOlXLGP41HLRL5Pq+vTfribppjUA+ThERTtGUyIQlZzkBEl0m1wUBv6PiIX6D0aYyYp0MoS1mPxqlQT/TAsHBgSg4gwWsbw50YUYW+8hf1+BG/7FYL3z8JbnEc+H2LU9DAkPQd6b3miepirMglWTqbJC7mdLzIlDT9XJ/E2gHSEh070mkwQVCzmSXYXwwEjI2rVrpOjbBs90yXXZmcG7dk5Rij6fl0oClqjI0oTjJIYUaoRPfVSI6DsVpZjKgHsdNHbNIpYSV0jAlHp3pX3rqzugfle7CrcH3TxuHOK/f2Js29MFmSNHvIyKMStaaIbKL9vPkaPhBR8TzjnlCATTNxz8Gy0j2trN7B3ZoDPF87hOOoIlYgHUsREcdkuUjzFAD89v4tbu1vYJ6V91kQoGG5vXDRMYcMsloNoDiOKS5+bbic3ezTlg5OsVMSiqRCYVYoF3OFPBcnLkPmkTDhMQktWr8wxp0I+JTvcOs+YY++Rc1RQY32nfJzZPcZ49VuiS1FFAYhGBKnpk4D4VryPX9Zu49OFdzDb9tFmhJOoS1C89O7KeSyvnMfarZucEBW2EJej8obg35NBjPVfb+HDzz6G36oj9hIpPClYUpZrGkqWHaP4ekbvLNNCmY4vsHvhc0tXPdUJO8P6vQqEXivnS7c8Y3qoiE0Xtklp9DiqcZs5N+VVFI8aLjfzxx33H1EsoizvcMIfa7Sko+3uXO38xfqXWmh9UkHY8tNgPns+JeZ3MKY0CALjOsHJaZZP/X1JoXAt+irNTWKZ2nsyNF2C7NNcMrRyI7TI+Z3udJP4LFNtNY/eItB1bsf53ESoBFM8fl0ArybbdF4e28wk7a5GFTg6Yc9tY688l0aPczGRfmjstaNcIrmv3LexDZRz02Hmh+g+SIws9CqZB2xFn6YI2MqXXPWoAJJaKsPBbr6hTci9yzXYgQAkzC/zzugxyPc19UbrBND5jNp/Fe0h85aaJYKKEGqF3icB/AUAAP//pF1pb1VVFF333OmNtNDBUlvKZKCVD6JAYgjRhJgYf4jxg3/NBBNN9INGTFAMpgoVUSlDaaUTLX2vwxvuZNbe5973CogmvKQJgdLed9+55+y99ho8MWsTg4HAGnOlMrFkwV0rV4W6xdxnfq5BoYPooTHS/FlUgWYk+u/WIEMaANX8c9EwMzPIggLpcS2QQP2vUCYSdSzPF7Ho2UhziB1doLECDjRKyt00WcTQnIw7tqI2aQFgSAwGY6p2WgiHqxicHJVGLaJRn4XCS5knzSfpdfyrdqOJxuoT7BzehglqCPwWKgcOYnLmGGr1j+CVEvz07TcwYgKV2Dk5Myl1yirO8bKte30GH7ktTG9y6VgNHTc50bc6vciLLGK8no82aeJBHTOnT+HUhbO4dPkyzl98VzLNa5WedIK/pUm6mmOwAuBOsodbm2v4s7GGNWcXTUdd/GPfRRh4el8TLZwcSzPiRiSFXdzTLaboGbZR720inZhLk+waS53qynTIj1OZeD19soruzhYqXoJy6sKLW4i2N7G1vCJggSziPslEftwrk0Lpw2XPx+jwa3aKDjtJ6RWUxbuWyQ/g1Ct474MP8fmVL7G4NC+xctxoU8k11iKLb+P67E3cufU73p+YRJmZ3Ix0ijOhBcP+bk8aTxeZdaV3sl7cYrHmjXJEOTnx6CYWGcSOi1K5AjcchHFrMELuRGGflDNDzp47h7fOn8N3V6+iIiVgZiPpNHf166++wCeffow3pk/bFv7FREVTwBz7N3MydSir0azXLrbW1nDj2o+49fMsbt+cw+byqkT9tDptaejqoSeNmmyAYsoJWRMCAiWQHHKyE5i/HEcZdhm5Ui6p+Y7kzMbYbXcUGAgDHJoal/U5dfI4JqaOYHp6GhMTE3h9fFwKnTJzz4V/aOmrTlpQpWjUZ3KgpdgdTV/8FJ5rN56f37/EmRh9/dO/HLrP/++XTyD/iz1gXnI92EeW/n/X86q5/6/y4kHFknVkaFhA0eXFR3A7u6gcGpQCMerEhXRI9mFGLqUGyU4XLjP4B+p6kJLCSMd7PmudzB7+Okl23UyMTdk5MZqJOf+BX1JqLcFk48PjGo9TdNfWkG5soflgCc35+0hWVjEUp6gIqJuqozRNTK0Mx/RF5DlFs5wVUW+ZNf3bLVewPlpH7fw76E4cRkvMzWK0/BjOWAX1M8fRebyEVqMh7B3KpoppYqaAGxupkrgzR3gyP4/h9bfhBwZ+JcReEsEEGcpBSXKl6c5PVgB2Wth4uCTXcmBsRF2IfVd8MWJ7NjqFDhsycdyH5pMtwaaQ39tLkROjNykyLHDu7pMJpbKH8syOMnUA7EkkHUFjhM5ZgAi2uHiRdKv/sUr1vhpn/xmYPlN8Ov0oR9+LzQNviSfTZ2WgCBOE75cFIaeCbFCiDGHmI+g6iNa38PTuEpy9DsKggjBwVZOZOjgQhCh32qi2O9hdWMDSjR8w0GmLxl/kLfzUGNNXQN/2qqmt9EN0qhUMnTiKdQIAJkDH8REZH5VaGd2ghN1qiKDmwat62Lm3ADS2UecQJGmjf04tPCw2tSaPz9L3pYxLiHdSnbK5ThPte7cRrTxA9cgkgpMnUBkdEfnFpmsQk3JKTXesU2Knz6gLfQw7k+jhpTHGVtIhMEcPFBLWhaciRbIASiwmGw34TImBmh/ntD09CzM5emk+PH7kGAaHxuAxFYEGYK6HXeEpBNjYaSLjNdrIYIdUdFfXry+ac6WnZ5bKr8zCRCeWYvhnxG9AGgrPSjZNJiw9Y2s9wEpMQ62Hcto3X9tOgjtJA1eeziE8+CZcVDGaAtXUmo0/sxZTy1RhGf83gO/jFfy6voBWCeJrwTrBKybpMboB8Chu47P7v+H6yhJmJqdwdGAUwzggg47NbAt/bTzG/c1VLO410akEaIuZIWTwIBZXgWfjsjUGjU28J2cjChp1yZpcE3jn/d8jJdw266bPERy2MRFdP6f3YSCO5GTlcY1Qcsupu+8FGtfLzP8gFBYN8+MTsmFTB11ONzkgI9DBxqoUonqojm5rT9ZPZ49sUSPNsrHywv0Pbz4YUq00ewjKJ35ZXMDs+iJGanWMMT5SLFNDROiiPjmJMxcvYO7aNTy8+Yc+746Czq6tpD375XeB1bl7WJ69i7FLM/AHQmHI5qG+HutFm6IAs9/YM+7X49tmrqBr2wYJ6Dmy541zboJO2Y1k5VvPJQJTNBWNrQdFPkAtzNnsdNvkjvKkzXe6BdMa1igPuXEfz6hINd2UwVbrVZn0C+Vceiy/MOXTCT3ETyxPSfOsNDpJ0EuU6YtVzF/5+1JWgDaXXDsii4iS4noICkVSCyvIJFKEVJv//UlsuWwlLeLp5Ezw7DMu16fecl0LmvNnB4GubfG8EllGoPLzRK9Z1nPR9PaSCPQcUymHJM1R1mF195G99/SxygfYeQ6/6vdNMYXXPUP/LDUI9xcrhdC6VA0mBSr36YenLvoSpcnnstVWAJ3SAEkgIoPGU0k8a4s+wDJnwAsDwwJ3XONCsGDNbWWQwn4ky8twnfUkD/m0n89y7qMnvZS9JzkIk38OvO95JHIuN9CXZV2kKf4BAAD//+xd2XMURRj/Tc+xs9ndJJBkkRCQwwMIh1qWbxYWllahvPBH8ej/4puoVRY+UJaoPOCFUAhCuBOySXZ2dufosb6vv56ZXRK0fLZfcm1Sm+6e7u/4HZ4nVgEW0mArEKNRDNczlTKuNDnVItTHGGdJ3pgd9Hux+F7SZgr9sIQmWHsMyiMavgmU7MNjHzauxCTjHCl6sGjiDZdkyAtk4Te0EWjT86KTCMpohGE6wJTbRDA3xQWA6YVZZPd7LGJDojcmKRUnGRLCTTQe3L2H/cdPcEUniiJ4jg9/9ywWDh3AhxcuoNOZwdVvLmOrt8Zut55cooUENAzFKU3Vqsul/KwqXLOXqIYtAsiFTXY2ZC2yax7vnTmLM5+cw9F332K4dDjT5kB1YP37ucpMiv4j3Bpu4trqE/y+1cPdeAtbAZAGYt/im0ohHag+89OkHcFiQgULHVXvUKqFIliIGgfFoLsqL1AqHCkWUXQxWFuD3ooQEBKECgYk5jZMEK/30O8931aNV5U8Ml0e8O1GgFf2LAJT4dhri6IOPbDweoUiiXH05DJOvf0O7qzcMr6oY0E+kDqm3v/lF5fw/tkP2AdZC1SVuUH2UIURiCRLLjY314m8xkBtTZFGsQiZVuaQKshpwQ2ggibCZgfKYRnIMcKHI/PZXVrEx5+ew9Ur33GRoX450WuePX6Er7+6hKWDSwiaLSh4Oya1apsElJ61TLhB1PX67OJF/PbjT4g3+nDTHEWcGAVsM4nwXQNVZSpNgZKvb+ZXiWooVakDEwhHEesEkJc0iTEt7OniyL59OHbiJF49chivL7/JkP7Z+TkOIBylypTdfsxFIdlC91/WInwZTPS/jMm05X/4/78bNoSg+aPzt7t3EU+6XT4DSQyO1jslK5VBVlqWGdcSB5sbEdLnm8jbLXgzHQP7J86a48EJjKiZClxO8vn3XJPwudpF4PgItcOwUDfJ0UKG0do6e5THD55g9eZtqPVN+Btb2MXBveakxSbkVpvaPiv2XPAq5hkP+v5Ikcq3h7VmiPDUafTn55GHHne7WUyn0BiQ0vhcB429i0iGGbw0KrUP6sOVzmuLugpphpXvr+HI+Y+QhDl3AdmmTjvsEEJFY0aIkUJ6NMTTv1b4LFpcWkJKlzh1FSmQ1gae+7Jh6XClZ7U9Jx1ddhHGx7iyeKXQLve9Yy17xzsPOw01YUv4j+3/bbUNxu/NitIHVjPmrpOm5J+Q2SFUlKL/cA2Dh8+YAkCoj5Bg/45x+SHth6Yq0NEJ1KNH3P1vxjGXaJV2hW5ni3WFESGzBfvAx8B1EO5fRDI9g9RvsNUuaVdQwXLkAllTIaUkifjN7jHEvsLGH/eRrK9jJskYUVbXc52cEjP7QpVgVErGtsMh1ZZHEQb9DWw+e4zwtTcwtX8f/PkFZNNtbCS56VqV6icC961RZgpl1kQXUtxwjKAtow6kGF8Ipc9aH+ajIYrhAD7r5GQcM5hkrDoDCoFZT8914ZJ4mPhKK6ECUmzSzwwFgLuW8jOmPlLATPdtLo4GVLDO87JxM7kXcun4YSL+1OLMQ+dHPrGHmTrmAv2Gi19Hq7g8+BPtqePsXNJ1TZyhdFEWFcCnBjiuos7/Lyjw+Y3rWCXdhVASRU64BJZPHwMPRbuBp4Mh1pMe7q2M4N25wfvNp+K5zhEFGkOl4bYCFq1T1ChRQj0T9g4LgKUGUk3aJvT3TafexGSZiBtyLE4tBbcSYqtiHEds/XxTYEjTUswuTcz8UazvotLzagRNbjrkWksyp7gwk2tD1UtNFslNFK8VoLN7Fr2Hq3B8osqIpXet879dJ5u0kwRwgQga3974GccPHMC022E0DiMMKKlutXBw+RgOn1jGys3bSOOUiz6OTSSFPWKpt/FqhOtXfsD86UPw2x1oN5f0X+8QGdWetx0cA+qIknIvidiiTUQtDdqepUw7Fhg4UZ1tp99ScqiYo50671sby3LhvtO+9cSWUHEnOzbOZs0pXj8unsj6NGqWc/VnoFTgJ3G95hT/DZQe9npMw83+T3YeLMjedpepKFQUlQI+xdKMDHFMBzvNxrvMAMa8+xkX5qKWBxpffRKzYwtv5JWgnTL3oOXXW7S3nVOOx31nDPY+qUdAsfikCj9r0mUZWwFagUarZUBfG8QCIQxEpJApMfQz0wijt176+YuOgR11nQLWCRAKnC16GPc60bAjoUaG/BthQnbdEITDi2tYR2ZUUP4X5popyGaurLaBXU9CF9Aa8d4U6p1FVtH/THNCc2ORDcPhEH8DAAD//+xd228UVRj/zZnZuWy72+VWlra0BQNKC0hMTEyIiQ+SYPRBon+fiS/Gd4wPxkRNRDQxRiGmaFqgFnpDobuzt9mZnTHf950zM9sCgQffPI/tbjvnOuf7vt/FsUo+kOYLhjfBXGC6fDDv4WlCBOOTI5nd8TCPAngaWAProIcYt4XQIHgNwSbIh3lDkqibrwUdTDaUOsnwLlbdVEj3oRtdnUxgVVuyVCAY9shG6tuoNxuYPnkCDzb3ODNKKu75i1mKyXCVwyKAEdtIKHTpeXod2K7C8foUGjPTeOvddxjZ8OvNm7i79gdvCvImJ8a6a4n/Mr/0NDye30RlWSRdeTIbRoJ/Q64S26uZc0u48uE1vHn5Ml679DrDpFlpnhXM5YLSgoVVRLgVbuHPx7vYTnu432sh8hQiQlRnBRyKBey00wBXttNUv4BKm7ckPgPziKm2lcmy3LYvVYY/TckbhVFviO5eF+2HO0C7jVqm2AtbhQOkTzrYvvsXok4fkyV6gxFFynOI7MogigPzc7NoLs4CemM/DwbPkCp3Akfnm7j6wfv4+qsv0Y/aUtGhUDMztEO5xP/w/Q0WtzvzxjKSOOK54b9uy2VRPIYtqZjQQWSJEnqqaR/pUJQfeTzJU35UkQqGG6ASVOFNVPPsql0SOTSzT5WKK+9dxWeffIqVOyucA09Ll8KoH+OL69dx7eOPMDM79cx+P6ulGqJPFZTbv/yGn775Dt3tbRyu1lAlASar8NDm7CPBsMwlInMQURCXOTBZKrYoSiOEgz7sqg+/Ucfy/DJOv3oGSxfP45WzZ3Fifg7TzeOiVqtkfZbhmKaZsZAq2Iv26L+SEfu/vVwzHuAKXsXD7NwcHq4dQbjuwavVUT92GE/+bgGql59tTNig5GI/QnfzEfwjxxDUXfThI0hdDGlfBWDYe0Wr+FcrHouOUTDGIml06YuGGHZCjNpthDs7aD3YQHdzC+HWI7gjheoIqBLHW9ummZZaha0fcf3zbPw+5BEjnSwgdBX2jkyhcv484uY8eqTy7pLDh6YHZdqmtj4Fb+EkuluP4McklJbkdCazWh0WIKVgPIU7HODx73eQLZ1D9cJpEW+ifU+Hiy0e/bRvK1yJAIZ7fbSzXUxVJlmAi6DTsa5M5oggzY9Umqs5hspjDmqlQAJYKrf1w759meksiFHLfomN+cKtnMQ7EPweONrTsd/FlglmNdZJic4PO+sMY6hhhs7GNuL1XSpJ833BVIPlbiCwX5/uDp0Qrdu30F9dRcOSAgAjVZ7SEVsHGq1MIao3EMzPIG7UkFRcZFSocFwWgqXAg6YxoUuZ4wPeUbZBjEhQbM1FurOL+rAPlywp+TYiHPncePY5PHSVCZy8RkEYOUo86SBau4/g1CJqC6cQHDqE0AvQcz1+pqGdccCdsKaBnkty0LDknSYoR0no56eqo8eXx5m4EkMMeiHSXojJ0uesA4kfSYZPz56AXxXuraXXEfWMwKutQZf1i4AiWDLvAKKJcWioxheAqdLx/GcKnmNrwT81VlwyvNdMX4oT7Qe+fyV1YnGb+fafdfbgf7u6iGU0MAugTsrfOqVmCin3SKkfA3y+8iPW0wES3xVBTNqjefAnsG2uxidDeBM+/6w1iEHX3zZZ7VFxt2JjoBKmDzgVSW6aQk/+jKm2/CL0CcHBExHQpsKZGTNDeaUxE1Eve4w7bgoXMEJ/bO1doHW5mmg46bHhdivxsNdi3JYJhOJUQ90dSczEfUb3+a4HqzYJJwiRjCK5W6XpczN8uYgfJzDkc3c2N7Cy9QCn55ZSXRLVAAAgAElEQVTQSWPUlcxAYjloLizgzKWL+PnGDbQ2thmZyKgQLbadiHYpW8lS/9dX72FrbR0LzQsYZRJcKk22lUPw2XeHg4jSp7fcscxS+UvDiNJFScS4gzJkfKQDfIsRWyqnOpuKa1mZnoJB1wt47snKnOjN5PtPtAzD3Q78QPvyy7xQVVes2wu/eqOYrzSNW4T3Sm4FtHdM7KYwxiFXOhA3rgcwQaZGl1XYljkWvRldmS+7AUDHDeUkgNFpoxb3JU4rP09+Fmi9CMcuEhQmOOc1TLFcNk5pKHv5C92kgOUbCz6z1m17PPEBFDaFJKw4MUHaaUSZEZqEge9z//Pzis6ZIulD4uBFMkeSN4xq5H1EcyMBt0HaOfS/ekLXMYVtajyuWYE0kLhDXFvM/x6jPeh+yZzr6r92sjDzQlofXByn/UsaNLSn9fdobRqBQjojeFwA/MvetfXEbUThzzfs7I1LCASyEBBp04YoatVWbV+qVm0f+1T+LnloeKiq3KRIvaTZkAhIgaSwsMva67U91TlnZuylaaQ89KXqSiuWBe3aY3s85zvfhU0AGRn0XK03Ea1JdEGMDZSmahDN3jtnxlCdeOS1Y/P9TUQEI2c8yCPrymjcjR1dmFKMn4ADEt9APw0Fh6MHK86FxkW29AEILG2HPoMoOZy7SN38ZMRdyIQmLCpWZ5uozzWRUcc2L/VmJU1D3u+dnOLP/UNMXlpk0ylC4fpMu3LRikJMtRdw0/sEi1eX8PODh9h99hS72x3E/S6T35gCqsSgydHqY5qYcnUuM5MnN6WpfxoKCQJMt6/iy40NfLXxPdprq+zEGrvAGZlbIAdhhUfooxN3sbnzFHtqhCM1xMDPkDapU6Qzc82StCi0DlFaKWYydjWUnzvqH9B3sLbS0UCG1V5rKiCl2ah+gryf4PT5HtA9gZfEiCZqqJOJan+Io84OjrZ3EdJFVZRmQub7eczlBLIL8+XVK4w2E3rmViZdeTG+naKDytkE6qPPPmajvUcP7gPI7LZCLyZpvA/2D3Bn6w6W169psxbP0iUdi6o7ep1cMN3UVOjsWO6JRS27kLPpCiHPBDCFcKKImQGM5Gv6jzWBskvbHO3VFXz97TfYfvw7qggWo+ke8OjeQ9z/6S4Wv1sk6/W38gLwdGwVZ7AOJWIwZ7MpJVR/03HXEyibw9ACSonabhCnvE/UR6UxI8r+7OICPlxbw7s3b+D9WzextLqCS5fncaFZhwokeoojDWlyVNVJ2LeGl/8//hsPcTf30Gg0MD17EYdTLY6emmg12CAu3z8u9c4sA8u4m9E7OkV0GqM27yJW4jfCXUVP8qkJnApJOJMW3J0PihFCulm9PEBy0kX3jxfoHe5zmkh2fMz6/hmmNvvs9E605ZDn2XHm1di1BceyccyDde3EuPJ8HIc1BNdvwL32DoaTF1H4lGlPX2JoocL04m7v5XmouUtI6aabS5eUJjhT0PG0RVpT0nW7QPMsQWfrR6yuXOH4N7rmEj3/MgPCkcVioK+ZvDvAQecZlq9fs+ZCqXr9gvV1rDyYQqV487U3FrBiOsNjTtSwIOqbtKr/xqNwjNlYGStGi2oyqQrSHH6sMNw9wOjJDhDniOpN6W5w8kmB0I+QpzlaZN542ke/8wRHj39DbZSgTk2NLLWmu7ByohLGIfCh6weYXFvDaG4OXZ+AdY+pmbxAo1uDxkrpvBhGLlLXR609j8gPUdRaOKMO/cEh6mmMOumhmRxfvY+NdzDOMyyYRl3kDJ4H2RDdsx4GxyfMfgmXVzDdXkKj2QJadd428ghIWMoi5ZAcfo+bHUJ/0TpY7ViUO2aXOQwOPi0qhwMUw4Slc9WLxRpe6t/p+ExenIEXBbyO8bSRp2IAYIReNhw7Z0xqB3eYlXSZyTdAYqc9SYXS/k/2PK7ki1cZgFVtMuuys8Kua+y90hiZRRN40Rvgh5fbeF7s44v2e7gVzGMBIWb0Ue+jwCsobPX2sPn8FzwdDZCECsp3LUuIizsyDfVdBu04hYCotpl41wSRj1jHbUF3t0n25oc+S4tGaWzHwoAAHGlN/88UDK3nJfmQdhrnjmMumgWOUCNzOnJdJ5CBCg2mDaP0ZiA6NDFgDbNUm47RevzsLGU2CK+PdW64iTIjrTKZ/jqm80mFJYFW5MOVpCzTJUXWRD1kdoGTOmwSaoov2RkxZywqTQYLbhErgUz0AGzeu4sPZpcwHc2zUWTDFcPk2tQM1j//FEu3bzO4mw1zMVaEUJ09DboIsAzsPXuFzqNf0V5fwwT5YXlyHpMvhsGV3nblYT1G9Bi4usNLBb7pFtPTpAE4esy5+M+yvxVvTD13yqKQm5OVtfZId4azrDTBM/py3xgS6jWio5T1RWNNeVr67ZQeGmAWADGXkzjRklulzfZEil1N1fLdcr/NvnLH3/hHeNrQz1Xa6K6kmRvgSq4N+UxOiHP1eHkuGvWGZNgTQyKJrdxCCm8puukzjRGh75VsABpP5Y53/p0KYCjyhfJvdC6bKEVPx9ebcTdJD6bApzrTzCnVxrZ5bZz/Wc+vgT9h1YkPnmmc0/Yan0HeHqL3GICCnlnZtKbjyokBvsRweoreL6VbXIdWjHyt/ELXu/I5wkhhyUmRo15rCuNZM0kYnLHHXHvoaJDIeBgIA6BAmo7wFwAAAP//zF1bbxtFFP5mb/a6zqVOQuI2pblAzaVqxSMVUFVUojzziMTvpBSJNxCloqqqXoAmKUlISNwktuP77s6ic87Mem0aeK0fmlh2nWRndmbOd76LN0KmnJyWcORumBonQTswHO9nDAAtZSZDY0lnpKPMoIGQCTasIHSMLng6Kvw1U/U9JJG4nVtKSGLiMkTrH/P/tehRmjMEtLQLzx3dbPSVNE1W78RmU0R9LAaIiK5ZcrBUexu7j19gsN3gw4El/rlaTOyIzkkL3vHeAdZqCdlGcy55oAMcd1pQzhTT28KFWVSnprC89i6SfoydzQ389vQxHt7/Ccf1fRQpkjAa8oHUMcpT2hw5gg65Atwg5gR0uUGIxdoVfPDJp7h+5w4K66s4DBxEaQ+9OEEHMeqDHrZODrHRPMRe1MXfGHLGNOc004mEQBzLPODRS0YOl5kI2jE1oBiu6cjo5UlXmNuxufNPGZP9AX/v80HVRb/bFw1aMoDq9NDeqyM9biKkMY1SqGjAOnzd7KHxcgdOpwcVSwct2y7M9xw9lKPm0ibz3rUaZhcX4BaEWpgF77/moZXZeBRw+Z0V3Lj5GR48/MV4PGguKsYWeDIDvPc9vvrmaxRmysYhNWbTEFidDD1PIqH/2JgHAgVST9IQ+D1EMY1Ff0Xzs1iCX54RAzs29hMqNAM/Km++rPjA9PmXX+C7b+9i9+UWA0W0GfuO9BH77Q5+uHsPt2/dRnHWAgDu+B9xRiwYj6wjIBnF6S1Vl/Bif5/vjXanw7ElrkEGaV4TyZOMLgdaIVIeypV5zL21iJXa+1hZX0Pt6hVcXrmE1fU1XjR9fyS90BYwISaNI/p9mEQFnl9EhzJUxzf1MQlO/KsBekYEZfbyxPPJUTmLbpi9/j+f/6ZBJ8qINwhNrl68iM3pEtoNF+WFeZSPThGWD9F81RRAUcuhgtbwtCNrhdMdYCoMUSwXEXmiTS8FPkICFAk87EXoHtTReVXHyXEDp3/tYthqot9swktjTKdiDuWbpSzg+LLUmEWNEkZUVoiPu2hQV2uYiGKUjcooWcorIK4sYe76NcRXazgKA3b8JwPNoeqPp9s4QJsO4ZUyiqsraGxvoxC7UhjkGpr2ZwYG/aPfrr69i8GTDVQ/uoqeF3PHmGi2ytCpeC+OCcjw+bfrH7fZ8bqiL6BUmTHu4g5LEZAdVtQEo86C2aaIckfGQchMmnLvTnV2SE/T8W4i7J6RjpgSZ3mSZJ+XO9xK7Z6OSa0nccz/nN8EFDnGLIxlamDZyGzxHHoHBzh5tovhHzushVPTZZAdv1OU4pyM/ciHYYbmVruL6foRNh89gddqoexyLh3PDaG9p7xnWptZKjkKykeD9u3li8D6CqL5BTaH7JEi3tGZGRcnKjCy7Qpo7PnoFjXihQrC4ByCcBrJ5p9obWxCtdsIqZFCmngkuWutXiutUMZG1owE75PEXBj0TtHfGaC7vw/39+cIl5ZQuLQMd3oKxcp5dIohhr6YckaewoBp/8J4pN2WNNKIxbAqpS6wEplAARol6mS1TuDqATNxXOOubvdnlboIfBe9qM/zZXH5At8rxHq0YD3tKi0M0Rj2oAIfXsEVvTMV+SaSjg/hxsSONfDcJXQMXVUi2bgLmsTG/E/YATYOkDqgkSkauDsJZxTjSefG3ErcN0ZZJ6nGSfcIW1u/Yt4/h2q5gurMHE6PjjlO7KDVwkHcZSAnKfkIigHrlVNTkFDUoT1Q264d+V5Jj0WzmSfN/0jJQqCJwcjxjfI6WdVZ5367m/uOSCLEiFJzp51ZsiaBAlqcgLRB4bjQpC6wAQPZv4sKCkcxMDA0hQp5M2XpXrAadLCclU3vqKgj1hFJBnWEYU/Mt2HOjrarrCkSMmJaKqZKIXtQNMj8NfARDYZGPoGM8WcbRXIus+uhk3ldNIZDPN3fw4ONTVQ/PI8LThGJadbQvwurl3H9xsd49uN9eLrP/RHXSFQcs6ZHcZKdHZ///Ag3bt1EeW4GMa3XBLWYzi2nB+VMIjF25aWATTDyBJgsAjNwyXSWaU7m5cbc8VXS4GPvBkdabv1uV4pmnY5RvqUm8sbM0En3bc3kHI78E+YHFXN8Pyih8tPnUTFszdzs59kils3XzdnTNkTpuZWCWUbBpAwsycU7OkYbH0/EEdqHjceDWcdt+psyayEZCMY2NtBcbwsQsNRngtHLnjV6xHCxD1vscq5+POqaE0PCAiBc65VCjkG09WsejNLZmLmmWJbrROdfy8TgtccAF7YodsmbyBT8EtcocfQ01vSzKWFA3mdc9iMZ33wD1QIYo2slnXuWIVBqRBKLCTmDd1LrMouEJMGGaW89C9hcn2QgzO6gBrn4TXDyWqLYD8QyUOh6sBTB3JPs2VAQvw87f2ldyAAPAP8AAAD//+xdy28bRRj/zT5sr+283LxMQtIQq1QKqFRt1CoS9JBDT/yhlThXSBxQEUi9gFpEUCGBJmnkpImbNKm9ttc7O+j7ZmZ37QT1gMQBMcco3vfOzu/7PT7PMtK2hZCWSBSY8acNU6sSCqOga8vVC+Ov4BYPvp/G5YgRKdfoyyRNGwXbMkFfkHhoOaFUFsDgWP/DyEMYm16NFLkXyQijQ1dekrSaRkm05GvyqdRVFKjWJzH54TW82jtl+RfStGQLRvVSkroBRO0OCpUKTyjUL5QmwR59vE21iV66leUllItlfHznNu6fbWLzzy/x7deP8eSbxzrAJu6lQWVDEmgrj/LoJVEoVCYxu3oDNx98gaWNuwjnprA1OEc3kXgbhVz5P4+6eNU+w7mK8FYMEPpAj1gq81LzIlTqNFylcl5Ok7ivsWxmR8gDM+fSwlCl+QC0CNGpqVQFduH0YgpYYA/soHXKvsuCBHw6D2L+KRW/c4Go2WJfpteVXGmkjxwVFCzHYncvTDskOsz6whhWbqzAC3yjpnjPUAZgEutd9rH58CG+evQIx4e7DBL4I6AyKTBVoLe2trC9vY1b9+7qhbc0ihLH+JmkTgyjwgBtnPw0SmieSOjIZM5qSDgRVX/oVVCGKBVZGirSdo6X5a/9ZMDKic/urWN94z72d19ymqxr1Ll03Ynp++HJdzjY20djfMJMElpF4zpXJSlkgwtw3LrGQW16FhufP8CLZ89xcHyCShCg1TrRi03yQBULmJ6ZQ21qCkurDSx+1EBjbQ0LKw2W4wXVEldw0zR+WlhZYDGCA6zXGn/Ti///8d8aNN9Qq8bJ+Rm8ed2ElwQojVVQrlYRvtMt5By2opg5ud9HeHyCmeVFBIOBXiwrgQpJVS/a6J2dIj47x8nhEdrNJoeGoh3Cpd66xFCxqirRQau5EBU/SXJBkEkKKJ1c0Gj+eSTwzyyXK9AlhpcUM7N1zN5Zh7x+HcdFDx3P02y+k/nohdXweEBPSXSKPsbmplCszyM8OEBVUdp8z1SQbIyqbRUrOBK2Il3sfv8Un8zNo77yAY4TgTa31NIMX37J5epd4fSoxftbLpc4x4Xra8LJwjP/4cjAv3rv9uz//psFPRtSxSceJQzM+ydneP18B/ijCaE87jKUVAIGm30Cj+QLFYq/5ZU4xkTYxfGPzxDt7WNcxgbs27wD4zFmdpHYrxKvgToiQUiqruVFXNSmEAUlRPQNJZbFTXSALLOrRaMSM1J6AtpkB2BVfIBqYxGFSgmiGrD14LDZxLTrIVDEHPVQFM5QjXG0IDkqVPaJBJERSjJBNY7QPQzRbx3h4uUOCvN1iJkZVOvzcCZr6BKbXAm0HaEg0CU7FzPvMK2+VGoDLCQCRVJWdEIk7Q6rxVwlLxWMAGuTA4JKFWPUGcER6UsWUWAs2WnQYwVARF/xWFsSFIU2XFE/sqBG92jP/s5eYRO6ByNjZUuq76dSaJVTnMGCLNdLC+SJAUP0O7IcxYGPUEocDs7x65tziMMdJk0IeA88CWfc1+CdvP+yq1WTV4yU2U6M/NnJPP12f3TOiUmYT5O4R1p4Wbutzj3J+rNbNpfIF98w+tLkE9EcBpP3Q9kOBJa6nRDC10pOZmBjHUhnM71YWk1dfAaa2GNijcA/HZ9hmpnh9YrmGEixaVhp39XEBAVcuwLVyQl0T98ZACeHzme0wme7eDisAHB4zXTRj/F0+zfcXr2Ja6UCqxRtYbFWn8PqrTUsNpax//OLdB53kSmrpFlfkeX2otnC7z/9gk8XanCmfFaCckHLFoSEuqIsb29dpk60sm/ksIu2XcihBHXbQg+5tub8PhCwS2IGa0R22lR6+m03DFO7hQbhOryOGWpz3oS/mCQ1D5Zj2O6+YYwZ8BmJPwzeYuCNzBojTUYBW2LigS6QOepK4J+qbHJqaubalBwqGDMey2E7lcvjsMehmXKZJdNzwKFuA5jmWAzi1CqgckUZIZyh6z067LHzp9f1UgsC0gR8MaT80bgxjyyGB12XJJcnoN8je220QsliTztonqd7wMGOI5uke0bA3RZ3kkQXQPLb1yoEsyagooxRBaQqA7pvjg77tF3w6LrT//EzZlwQhDc5iNmIMLgAbdQdTN4aFYktPHBmyAgOt3kLPAD8BQAA///kXUtvG1UYPXM9nowd24nTPFATEgqJopIUFVEhVUJsWHTHAsQG8Q/hD9AFC1QCokKiNIFUraA0wVHcJM7DY4/teaDvccfjpI0qJCQkZtFEjeOM79y5c7/znYfraJSCpUbYRYmzu9ttXiRiRoSgdHyhElgaS35CmKxTn2RIRhgNdJIY6fhrNARRS4Ty6Kj2Is4QG3uSfE4psvMy2eI2lAhcvMBRRhWhDWjKPgaqJaLoonqJKfxP8TjrDtH2zk0ttc1BMTVo7TVxsLeP2uwsI9cheQEYj80DU91oUge4U4xQqfsY88uYXJjFtbVVXLu+jMZ+Az9vfMtGJ5cdrAUyDuZXV7D+0R3M3byJZybG5u42uuEYTssFBOmAu7VENRuQIRVlgXo+U9jJHIsLXLGSFNBBbfZNqjr/3AKYbZZTW7Il4rgsdqKZgQXTAzm3VBBomkxkKmc6ffSPTmG6fSDoITo7YwNA14guK6LXxAaFwwAnT3YQPT/h7l4hGQFfM8dou7iXIfmXN967gfVb6zBEC1KmwquowHkjlyTssn/7gw/x1Zd/qGRlWAgk2jncP2rh++828O77t5CaolBLyayG83Aj7eKLWI8QSjJxMkwDdgWF5oEngxy1zCbhnz8GtzzO/g35M845P8hXctctAN5UHR9/9im+ufs1Dvf2h8UKR5yB8/g37t3D4soKvHJlpKNx2VE0Y/xXiWlCGb6ffPE5Dg4P8OvmFoM5lLFPLv0kXyH95uzVeby2uID5hUUu4MjMsM/zW1k4COQedExOjpFc1K0qyEQodfaj9L/d/f9fHhdM2v6ZDSKtnBP1ScwvLeHZ40dI+l0GBOpXruD4eQsddECWUwMGvWJOp2jv7eH15gKK/T76QUvAt7MQQfMAR40GwtYxesfHcPsRSgqKucYChEYLNzGrEuoyFenRhTayZVaNggCOigNShEkEspY9KZfhLK+jtLaG5swUopqPLqS4o+KfO/+pK+kkjtD8I0colD0fqM1VUV1ZwikZnLbPUCJ4lQtJlQBJrghvnsl8jejVpnmExg/3sTB3B2eRg8gvIojFkI2SVYS9EIsBq/rmdBr7+NPzMLs4zywc9iYxkiBCa1Me9Mg24Dk3dCdXZKbxxes9sgGzBUqOyZCXfyUY1az/2/c3eUOE/QhF42GiVEHyVws797eAvWOqNuFNjSP1RY9vVG/ruwUusKeNwWQ/QPu3hzh4sIlSEErHNjPdTTJPFJv9T58ndIFusQBvZQnxW0voTE1gwN1cIxnrpAk3kbpW+4hoE+vquNJ+JxW/jEExRruWolKqo1QfQzJdwWC7guZuE+PtAAStekLUvmQERHSjZaL+S0a+AiSPGY96mAhPWhgEAdpPHgG1GvzpKcxcXUA8NY1BtYb+RJlBq165hJA+g2dEUuLK88yPDarU2aII5LOAPROM/vXzWTNMSwZQrVQxOTPNY0mGerT2887IMWjHPYTxgNkStplAm29O+MimqNDoWSKqJtDCWDS8J+WN+fDFunmOhC78An3v6LCZC2ubPMdcvoZQijwKPR4L8oiiZ31IDQPKRycGCYiZdz46TDuv+n5ioJiORMxwAW0N63TvYxMU7Sm/7L7JijkFLqgogBoBQkES69oulGlJD3DVmbyg1GZTGOarMwWbYirJH4CNIm3XVcAAW1RawCC1+0D7eQk4SaQBQSlSfq2C7vGpXXBGQI3kHAgwIgFJpXNAz4Stxg4e7D7FG8tllODxfUDu6ZSIsrr+Nt68vozff9lm+RRNNqZaJwIA8zquiTS9ToqHP/6ExdvvoDoxJ4wzpjEYZQC8+DAZVX903IfRcCYr9i19mos2rWu4CVlws+g1+x6k2aeDurE0T1nnr2PsWmlIbrx7Ki1g7X+3k82zWAs2eh8xsRNtfJRLxGKqt5HnjdX4W6M5ej11u3s52Ul2TXKAmZWcpNbnAFAjvqFL/mX32YgXQJxkc4584xAJ88T6dxhbiL5EluYYJ5vfxl4P+xyyMYYq0YXGF3IMosYivopMNv86+j2RXqgh/XlDOQUZ7DWwhXn+CAchjxd/H3YzNvvQJ2A4hvb/85+FfTlc8Xagg86n6GqhXhQAynoayO+IFwSdK7MgfJJQCbjCySp6HZjlqwaRQ1mD3O900OeIogh/AwAA///sXUtv3FQYPffanofnKZJpS0kbCouW0goiFiA2LJBgAwu2bPon+AHwh1iDhCiKkEBdIEBCUSX6EKU0SWmjzsPzsH2Nvse1PWmLBOqCBV600WRmYvte2/c733mEthYlxIhXnrN7YpJMhVqgNx4/CVLVsFjtghvNSKtrD/zGBb5SKzzNhZAU0s/k6g+QslNl5Swp2pCsnFil0WAu+0jFv5cEsCGTWe8R1402LEsWIjHAyXPMXIa4E6F/ZoTeiR5Wd2nRVvnzVtMnQ7ac42j/D9hLl3jCpalD3iAdTCrUNZMzdaloWuSRw9yteAFM8bzxcMgxZ7IALOCOhX35v1OoznCwdQavv/8ett9+i+mnP97aw6zbxvDFczhq5pjQwpPjbwqJgqm5leaVZz/KfGsjnVhn/YT+mxJawZvAZy7ropmyTdnAl5rFZJSXGqTTlBcajhy9yUxmkbK2P3KSLdlIHfqUGz9b4NGtm3h48xb69JCihz99d/Z4R9/qkj6iSR0FePOddzHY2sacKPlKg3uaUZKrTkPJdugMu/jgow/x5RefYzGZlKRlfwYK7bR/u7uLj69cQbwhYwU1mxLDQykuiM5n8hDGyWKaZBaUTU6ot3Giq7Rhi7VaoKgdK7pmFOv7Vh9zU0D1ksDF1y5jZ2cH3xx+xRo7Xn9r5282mWH36tcMEjTithQyQVQdRO381eeWp9MJch9h8+xZfPLpZ5g+GvPrdM0RMBC0mjL2TKmUvSPdZsDLmVxnkxWQzPiea6ESlieBq+svCKP2OPzx//bPtycV6P+N80lzrDccoL/xHKbJPlrDHjr9LlrtNpLpnLvaK0LErRiSmskY17//Dq7dwrwhAG9I7yN5QJ6hSdGiqVCd/X1CDbcfD1Ut5Drj155wrQXqNVJo8UTMJ7rXJhFRgTO4jR4a2y8huryDZGMTk04DCZRSvAYAlNCdJlIH3C5euQLzRoDeC6cR/b6P+Y0FWkS3dytOAPd3fFtIoc6XGhc6K9zf28Pm+XPYunQBdzKLFWspfRexWojKcRtkQQPJ/n3sZzmef3kbjV6H31Gwi7Tu3b8kAzwLFsGz2Pz9on4cnCiQBeibBvLxEpP79/Dwh+vA4SMGY8NWhym07IJPQ5VJDB25sA9thN5shvzGTdy7dg2tZIaBlcSF+mZdrfine2C2wrQZIRttoH/+FYxHJ7BoxWLAGAYMxNMHTBQyFT632vYN5BnBmdVWKAVUxJIueRwYpBsxOs0txN0O5oPbLI07OjjAqSBEnK00mSKv5rR/VpVT25b/1oHziDwplgsGtmm90yV5y9EDJA8OcXTnNyzbXYSjkwgoVrIfi1SnHbO3EfkKLWihXlj0lhYjkvqNJ0inE2bbmHqUZLlPIuWjs9jsxugN+uWiVhzQhX5N3eKVKfjZyNpVMnR0pkyZELaE+D/F7TZLEajIy7XwF9qq5BKz0ZaTtV+hbtfk9UQF2HGjLF+8oiw4/VyS/1m/3Yr5c2yGFYgHUkYxfxxp3RZ69yoTWreJ1guLWofeeR8ssy5DrV9TzTBSs2rRVILNxF8AACAASURBVNswXHsvN9WocHKy7jXa5ILK7OjYvXlY3OlgNp6g1Yr0HKUcnc0gQJqhEUrXld4fN6WbaFVaweCAJvIQdV86hrJuC9XZnJtwKNR0rmLyMdMAGd/LOZqtYdnzZfHnEdq0bmPQq1gr9uV8O/6h3n5io+24jyUMdn/+CW+cPI1BbxO2EN0+ARSjE6dw7tUL6IyuIj+YqUdUxeLkhpQCLIST3P7lV9y9fgMXz4446coZLf4ZBHo6uFaoU3/diLLU8FtJrSCvBY4cd6ZkH/uCr64x96CBn2P+9cVSPk8spVKDHlQNTolb1BQAK1GBleG6Q76S7rOXc5RsBGJj5kJFL58Y1KRTcIFNJZ1RPX9e/t7LD7ghy79LNSXXrGX2G6s+TsfM/twxsLJe85W697xy/OeCNjI6/0QS7m9wxpjHwHvvdyMsVoNkmVRjQ0aFKv+2mhSAUh5bsSDqmy+c6+MbKChBPxNQIk1PKqrFw2ItIlBBIBoDD3DUv8ubANL7ZN/Xu//1eeHvFTQmHOsZBkgSAg18ioFIK2m8OEFvSdeb0P55TKkpwnNPXP1prvjv42Nn1o8AfyyVJ2BAwR0BDkRWRcdP138YBviLsivpjaMIo69675mxTZw4xFlYjQIIoZw4gIgQRAi4cCHcucN/4A8hjnDgECQuECQOARSEgsHYicfL2LN41u4q9C3V0xmHCCYqTcYz09NL1dff8r73wmufvP65sEpGFURFCByMMolaDsIoe2uUUTJVHgDuvYrpdSqTrEZwJ6RqRgJLGGRJzj1KfBAm4kw9Za7YPDip1pOhCcNY5RScyAeauVElw+wlJIzKygg0fU70wMyPOquKUpmryY8wArEhyCBGBQY7HZzsHiODaM3STaBULucZh0Az5hG48uwG8uYyH58taMGSUoDIVJFFSvOMM210bK0sZ2KWo709fPXFl2g/+BuZdAjxtl0VphvENOHCBB0b4Y0PP8bGjevonElwa/NX3N67h/CpVWC1hTEZ3mLKv5Vxn8hUszpWCV50klJVajJiIjauwmqW218Tp9J/xBNAx1jJPUWhZH5LCc7JaPhgj6B7jXAJ6Bcodg8x2WnDHfSA7gkaSFmTm8ltJ2PkLkA8GGJtBkw2N9G+cwezbp+D/0oQxNTgXPqcKfyfbgBvvv8ePvrsU0Tn1uEM9bMQ6V7sUxuCdPCwpcBLz0hFzrN/h4HF+SfP4vaPP+DevU2GlwnSI5L+WZUb7B11ceOdd7F2+WkUZAhJozSWGytnRRPDmW9WUDAa2JMhjlKyUkCaIcgaCPNlRNkS4rSBKEirLKpT70mCZ1cNruxppYSId4b7R/ju1rdC6uJEEpPXFlUo+z289fZ1Ztn39GZB3T00VknN7EO/4YdaMIRZhsbKCvKVFSRLLQQU/FPbQlRPRYn2gakCfwbRPcSqXhm0ejVE/y2+DqoRVORR9WGq6WkeO059b+EYy7mY4COHmQt6PXKcOmdmYfzPh1kYVufnv43HP+yp/bfV8bpHHLn/dKBc40aq0bVBWsmsNUwWrlS4mpe2RFBtwf4H8kbaGuWk9tu7OGy3EZXs5WN4PMDewSFGrsQY0gMrFRcLO5uiJD3pkxOEgyEa44IZ/MkOJ9R+plKgocZUkUpWzs+rzPeQ24MsvxfqGvcSeeSUJiqxRJXCwhASIcAwTHCYNhE8/wLCV14FXn4JJ2efQD8jEkDHNoWuCQf/oSZHjUxWzjcQ1C7JUY7lZhrMDJbyJhLai/4Is+M+MuNRVlYxAIIG8Jwssn4cuve3cfnCRdilVbi0iSlD/qzok5MsoGf9ZfsTsbGbDUaYDYdo5g0EHFQZToDzKrG6fo067jq3jJ8atTCybkcXPTCeM1oZ873fgkaQyp6ZL9zqdX2g9jYDq0KVi/GfDxa+r2SQwjbrkBCDP10DhIiRIp2lmO70cPzTHzi5swUcDFm6L84ypK0mt+Wx1KiJEQUJWkGEM0GES0GE7P4utr7+BvH2A2SFyN9ap+tJq7SxJmhozZDSwigK0W+10Lj2GrDxIgbLKxhSHybBqAMNgMm3mA6xtL6G9SuXmAhw3OsB44kmh8VnIrI4hntRMiAyjFQwyw2kF9bgzp2BbTVw1DkUUmQ262V1bRZXdqjNe+GcwUewAz5AD+bwVQ6yGNZvkU0nMMcdFPd3MN3ahNneQrT9J/L2A+SdA+SDMfJOD83jfSx19tC/+zNM5wBRMWVfRzhjXQWFNyIMyEiZi1c38MHNm1zw8IEC/f7AGHzf3cEvvX0MSCUoDrWvP1bEIeAFyMShFTItwEt7zQMBqmpx4FI55JKor6CsVuXWlPCSzj/5ecxEXpYc5HjlC2K2F2faSm97rT0wIkNG/L6MPJKebvYXF5KtLFeocGy2CyirxUToBuEttAyl5uIauUfEI0AcDlkqeA5yJYgVfDxiXxoKjabjoft/hbegXvyZrTiQOIgywtA/nUz5mZIoQoRs53Oaik9cfIsR0TFQwIPQx+Nc5CAuAoahl8IVIOzmMoekn9/JvKT5HIrvwXBuIwRqtLFBr8vSwsS1UaiPKfZFSLCF+M8pB5LTuRQoXN5h1O3i2fNreObcOnITCcKLyTtDlGaK33+7i/5fbTQo/UtJUmcrphenMpYUXA4mDo3VJp67uoEgDdl2G23/DD3dpVNfxOj60f1ju1azhxHZdYhzSd9pZA32+5mtXt+bbyvgllgPx6ftUA+/b/egeRuTYogqSFQ218s3qpKGYyUInPIV6TXNt0BbOp2yvhOPBse1itIQ6U1wXEX7Nh2PBUHiRKkhUHJ25p/QuUZ/Y/18HzgqEgBMtC6Ia+I0iH3CyjqViWaNP45FJuOJcMNV508qWH4d8n45U2UxAyNkt9xWq9w1HGkVU6loK/8c3zudoAYrT1R9mCTJ2OhRIRQqmS7B/Bxd45EQnhiQ1oNHhnu74gvN8n9J2vg+eXrQuqTgmWy5tATQMUmyktVAqDVaZevlPunh9cKjIPsi36u3lnBwzokealOSyr4E/sL15ZMEPoFQV+hjbgdHc0tU+ZjXoyJsFBQATShBVglfWxIlfJ1IuYnOI32enulvZWHxDwAAAP//7F1JbyNFFP6623Z7ixMnGU+SCYMGFA5hGU3QaCR+AQfEH+AMfxIhDpnRQG5E7Bo0SlD2xFlsjzu9ovfqveolCeLAgQN1iR3Z7qWquuq99y01PQH96xQUGIPEQDho4jd8k4XlzIWcEAfblHWKTNapCqFg3onA+yHZGRZkqNhGFFUxeXB6ngQJhs+OtKwpUGwEuVGPR+3E0m/BbATZPogWSLJkmWtjdvUeTn/eRTROLU8plcDNFfjb5HKI0719zC+vGp54asQb0noCQcwbrgYMrIWqO3QtZ6fHDOFWbIFuoiB2VARrpErqVRLjwftPsfj4A4xmm/jx4gA/DHeRDrrovrWErOnaa4NCXqRpsobF5kgghLKOrlHCVc08tqdjDoBklIFStvPGa2UHcBYvRjaNkYZjTPZPEb7eA45PaWag5XfQqhnVWLpXdE1+HKGbZAj29jDa+RPTs3P4mX3OWgGXKieXj+fWUOu08cVXX6K1eB8xwRoT2IVHoZlelnPKbmu88XY8zA8W8ennn+Hbr78xi17hs81ag90URucXeLH5HOvPPmFtgoQoKW7CIkeZK9V/GIsyziYz/0juvT0+TTTfBAOUwHK9GxXb2+CyJqxOOfP74dMNrD/+CFtbW3yesfqsAjg8PMDLF8/x5NnHSL0mPKd5y1X/PYQ7Ke9fKvfeLfCn/6/T//ea9k6xj6u95FbeuTdGRAmGKRsJ+hYtDhKe5rw8Xcj/kfygyyq0g6UVHL7eRRqNmBbQW+gzJSoKglwjhjaqWXkA0tzwxfrTqSrZa2Vb3lcRVPp/ixQonG8kz28W+aOAjhbWRgfRbB+9tTVEK8uIlwcYdZrsnEJVWq2822e1UziYngl5agehsf8MrxGR60d7Dl4Qwh1e4PLsHMF0hI7QBmAdCXKqGSdMkxjToyF2Nl9iZWEZCYmNEW+TwbGerbGY4J1Tl/BicIAaDsd4dbmNpffewfzKEqsOc7LWNRUpsqvNkFsglnpLosmb7B3nxrp6V/u38QKmGpz37mT8Bq1aE15cQ3oVYbhzhPGrA+D4iv3+W7UGi/q6nSbShmeU02mbn5EThItWnGCOXBfCAL+9/B7h7j5612a8EyKO120R/MvXIrPOkBPEhV9nv/3s4SO86fVZYDdxcxcZtrWjzUCvy0K1/QcD+NMuIybDoxNxbYFFNdrqHNH2KE5rNBE0PHjtVbQHfXQWupj8/gfOD44wm9TQDq7RJOc4ZNJ/qaTz0gJW0S3gYUwjKoh5oZ8w6AZag9uyDlACY3w1Ydh/1HAR+y0Efg9Z3UdSF6eFkyPUKWmQIY+KtNMzE0hSNZh4/p3eDGp+rgquyWFKsk/jkKlkhCCljWvI1XRJChXU/FOpfmeeCkE7wtE1auuZJokhQZRbvObMihmnBfqiwnQd8d9Wzi+JFvMTkquWRkHcE3FC5VMTRcZJzWae+bUFjjIKm/iclppXSJUOm/OJSZmbqvitkrihKu9rkKjIW6/i2sHFtMqE80RFPRV9gS5ROoIp76tnOh3E1yEjDSgAosCA9qQc9IiSPVdkqboogSoV+ohbPB7T3pUStJlVeneE1sBVZQoGye2BdJ9oDDRqaPdmgJOrvN81aFH3KEe9mMoTnnvXcTDJEnz360/YeLSGe437bMZINAAaiIO3H2J94wl2NrcRhzHv61zRQLDULpIFiVK068DO9i+42N3HoP8uF3Nia3F9B9z8Lm0HpTlLUonvYcGVohqHxFFcQoEUA097LBrTcdnrPZEAGZIAcGwCrKBIX6Bla4vFEc0Eea6hhmRaIjMuEWGYi/ixE1OWF3ar164V87RS2dZoWhEFls9uY5HUeuKrsLvOBysUXUAtEL1BdQys/gDHKpl1zeCERJojzh2xqywNH4tmEJtBFrWroxjHFr9flwq92v+VIflEHTDzQz3y9bcpIW/GQ/n4BlWjFoyEuDD9bIUUBRGhMP3bmjo/EO2JkURcwDaoEUo66vhQRz5DfTfq/VSUpcq+olDotyiBo/2iLnpGb6/G50safobGL2NW3BLiOMZfAAAA///EXV1rHGUYPe87s7uzySZN0jRJpQ00lCLUoKL4cSVoC6JgvRf9Lf6i3voLmmpLQSiKoJiI0E0akmyym012Z2dGnq95Z7a26Y24sMlFdmcmM+/H8zznPOdEm999+L0ofqL8EJ241WrwwaxHiybSpFIlsRtMVU/uU4BUwGpoAPsd6omiiAsFotYYSz9MoR1ulQoJ93ipAilrDaAI/q4OWsEPCBhTtdSVwAQEDTnh7cGZOEvOlEIKQttFE36YYX/nGfL+GZqU9Glm6aySjAKD8QhJMofrGxvUjCjWbxTEkRAeVyRTprtSX3WTVKOp6jw8x88//oQf7t/nCnyMrER+uTqrE4U2x34cY+Pzu7jy0bvYbeV43P0T/VmHmx+8jYIoqcWIixZZPikr47RxBcENEdcR9nuYoHwu7xVxCRVKE+ywexRp5dD62DK1W6GqF1mMpL0Bsr0exjt/A919gILfdhvNzhwzKegzPk0xg4zVjZOTEwx/30b36a9okCigWvx57eMtAbXp2KLZwMd3P8XX337DYkmkXkx0s7QQpUxMBf2u0turw652THrmy0uLePTgIQ6edUtc2ykliNU92XGggU/u3MHi5SVWy6YxEjEyZbQuLzRUvY+0CfHvKNL7GvMGKn1OQpUv6Y3agxyFLka9tuAGQOJfNH56/RM82NqS76vAEh0npapzw+Heva+Y7loTUSihvVeH5C8E+1MlAHdhSH8RChzhxadaexr/6euiq7/4//t/r+9lr4D7O0X0fYnsh3eJb1TeXrF/DSKcvXPmITndnLwzvDyrM1T0m9FrlQE49WS07OD5Lkb9ITq+hXxcYG/vOY5OjxX5Kf59dBSBDTQ9Uqbzb1/5XPVvrnKvaM4QQWcC0c2hPu5+Zw7Ftetob76J5J23MLq5jtPlBQySNs5jVUZ3dfqq9tvoCfOw4FCaSMKz7RiYb+LSlQVmfmXU3kbFX3LVOOwhya3zP+efk8pVS6LhuGearJoSspVdWcIBzhkRZsevIpLnQcwjXhQEkfKsSZIhOx9j0Otjvt3hdYuQPqZwUtBAiaZXQScumrpQeFVv4nquH4LbGiXTqIzlGHjNAoEVOc3DfGoZqAafuTELjE1SRGj5NmYxi3F3gP2n2xj9RoXnAYvUkQsNtUNF7RbSZsTit1TwJhpt0zssxB6Xxud4A8DB4yfY2XqImbORCMyi0pps5Cg9L7F00sjhhBST128gub2J8coaTmcSpA2zM5OeaUaOWx6dq8u4fG0N0UyTC06duVnWliioRVGHDTiwF/aIsSBY54HACKLFNj3i1UUUSwvA3DyORyny1EnLWSbuQbH2p8YINrm+nKUaBb2CSVSbVxR/EPpMw3lSwI9SxMMzxP0B3EkPk6NDtCgQVpZKnlfnqyThFLuNiwxD5Lj9/nv47Msv0JrpyH6n6HwPObaO/sL26TEm7YTFZukgtJdzLOMk0WJkWqn/sdJymWGh/vLSh27Mprxkn9QsiYFaQl77dwtd1yoxqaF5Ipg2EY6aop8MWBWS3JTJnh6ytCG0eVRjLEyV1SOvJJOc57dZx9krqljt2fEsnqbEXOzkAiurjBg0XjM0mXt8LSHK8hIhjtXyzGxAuZCSiQo7obuNuFGKq0WqDG5tCrEKipliuVcWkNUl1EqexyBT8PtD0X9QVXinOQC7hvjQQWXMJNFH0bWfvjc+w43VNWwsrKFF8R4hu+Rh3gQOu7v448kv7DogrVlq8urLIAsJ6YpRK8n4DMtXV7B6ax15O8KYYji16PSVdWc67/faumxvTt4ZddecxIT7XlIwIAaAFXcMbZ4eh0FfQDQdLF/h4k+kSOKU7zusP7+ijyaJp63RoRAlSLQIC9I10BiSvKruaDDdrgIIE4VFKp0cRwpRQXONc7HK/WMWj16/CA66soce1XU/r/bW5yqQp373hTFMPDPIG7Ewtzm/y8J+ZGO+nM95mI9mA0paA4bamwCiJPZB+Z8Qc1cRu6+i8lKEI1V90XOwopEV5IK1PbVPZMz2Zut0eia6ZlTvv9n22Tnq3UOir0eMeXMPkHxMBA5ljZTcmu672RXaPeA1hPbzSlGC7p2trfzc1HlJBAbF2p+OScwnKyZY60hRAP8AAAD//9xdXW8bRRQ9M7trO/5KaBpU2hAUQBUhQqJPCBX1jRb+Br+Ev4VAIKUCXgAhUQlBKtKAWvLlJI5jJ961d9C9d+7sxEnECxKISFUbxUnj2Z3Ze88595zk3if3PwViJNOFg7jgGRfHTTy9YZaD2Mp0gVGVRp3REs2QnL2JSXogLLZffL+YtGAcb+CRDmX7FWDgpt/nqMcAweyHzJhkks1oTYWgMrqbBVSSLwh9jWTtZNo2muD8aID+73ssA2RaQJ47/D1TL1EbnRW4+9Y65uYXeJ6H5s8SldvR+2s2BQDIaqgZYHjcxw9ff4PvH29wFJ31D2ldFWowR27KBWp5o4vVRx/CvPEqng57eHZ6ALPYRnd5CdNUDngWkqqEzYiDZLyZxZnUhngalaaFWTJrLzwAYwMZ+ILU6L6itS8NbDGF649gDgcYb24DOz2Jgmm2kLVJ7t7A+Shn9/rGJMeCc2idneHk6W/Y+ekJsrOJFBmuyhm9qvmHd+WntT4cneJ0kqNNDGK3jdpc3Y97JHo5wwgBIobQzQIAzHBO0Wm3sffnDr7deOxHALxqxRuSUJPQPz7B/QcfYGV1FVOXyyiBHpYeGZFZJN+mGPW6SLwsS9cTYWapaiRMBDv4B4GNmhX/inEx5mv25WefYzwcyaZU12JCuM8GePjxR+guLrEqIaQ1/GcAgH9XN/B/AwC0oIx0TJdaZ3tp8KJ6jbAj5YxKRp3OjQAAzqB/dIitzV8xOhmI2RDJyk16SQnwd3cXSVLT1OLwYB/7u7uolwknZJz2B/x5GP+54o+daezjj1kA4KryKwYRGTCzwJBYZGra5jsob91C8+11NNbWMF25g6PuHI5bdZnxpsKNi03ZjZcBAFvtMVMKnSpuqyCd/82V27jx8iKj+GMq2sc56ibBeL+HZJxL1BpzWqZi5H1hTAVz4jOh93dfoLvYwcJrdzAiMMWhOjWMDNC4kJxikFmR/bu8wCEpslyJbqcjed3e1b401QFpnf6zuq4Xn6MzepF/EACAjpldAwCE1/L8e4JskqFZ1NDbfIHek22458dAb4Sl9gJqibizE/tPLvvsUkKzmcSMAGgZYMkavELNztYz/PzFV0h7J2i6yHB2BgDwAgsUicV5mqJHYwXv3EP2+l2cNlsYM5giumnjAZ3CFagttNC5fRNJt4G8FOUd1UZNApUGQwZdEi+dD2MSodETZR7Joul95DTK0ZxDrTuPue5LKJzBhNy/JzmDQdJoGs++A+aKwZ/rFHGIlt6Zygg39aaHmVfgNF2JlrVopRxJJNGDxoVmr/pJAgAQME8AwLvvv4cHjx6ynwCfFr6GpPjEjYMtbOdDr6CwPpZZRqJk2Fsd/EuuB50nL4SxL0M9qo1XGTflUSEwCwCUnpnUSGkCvFKew7/YdMeNwlXMLrOVUcMRNzjwPgSS0T4Jc75JmoTGQW7PaSjE4dlUZSHVHE5JLy78p+JfJWaIxteZCM0SETOaS64gQt2PxLIHUyLjg+qDxUQTG2h6xpLiSz1DyNLhiUREqz8ByZulRpd4M7qf80JmkGkHSBx4xgCEFUtklKQIIBbWN6ZcE7lKRVUG7m4GAPA6lmk+xnyjgbXlZbSQMJFGZ16dzdRK/PLdj9j747mcgwymOlYP6KUpiA2lsz8HXDbF8vqbyOabKAhEyNQFJma3q+tpzGWZlKpKSgWt/d6NP4+ZfCUkFRTShpfn+7P0AvCj9brOePPYtQLk1wAMfPJo/W9tMIdUp3rxMagiXKnXEm8Cac41KtPO9AH6vYwVW4n+s34/iPlmdUba0KjaEJ3nSjVhd+H+07+rveSrXK8iqUC6SEVjHN9jIm+P1lnfX3nxeSUeCqJ8ULDGOY2aNWHmXX0zYlafzgFVZoQRN/97yJ6XGXlqusM1VEN68mGjRCIfCajvX74m/hls6O57Zr5rolQQXW/5/YTYFIWA9nLSU7JHB7H6Xhkl+7jymaCxdk4e4BQPijhUBYr8HzmBuh7IURKdQCeNo1SCn6ME0wR/AQAA///cXVtvVFUU/vY+l5m2A53pQBSM2BaVipEI6IOEB6P+EH+Kf8UQw4sxMUYTCAkvBDESUytqNMZwCTR1mhYYO5czc84x67bPmabKi/HBNg0DTemZmbP3Xutb3yV688N3PuInGhvBzGmmpMQSmQEBAwC02dQ2QWv6C6XJ2EXbi1eoXiVh5FfjRxQBQaDB1BejTFMtbYDjT+ovnqYL0EUwhSIXlMnQ2BkTCzWJyHUBpZHQBdkxc1ow/XWw/Rhbv1COs2fkka8hV728HS8uxonVVbSW2kwrIsaBuP961qEkaYSlbhfNNEHqI+w+fIibV6/itzsbDAC4fQVWrAfRKAKOvH4axy5exO5CE/f7PewWI7SXj2GeMk2LCcbZKKD8ppozBoC8BSVPGPjPUtrgKJHDzqmjdKD/B3OTCnGj/7HFzvVe9O7084MJppu7yO5uYfzrfWD3KYMmmFtA3KJCc45j8WgispgkaOw9RZvyYB88wqP1Oyie9tmdOFVtfzioTVrtqqLdDoJJWWLnSR83btzE5U8u4fq1axzBeHJlBUnaEEORwvQzcdDZwMxybD5BN3hurpkx2gst3P76Fnq9HqPVjFqXXmcZpNfaw+rqSZx/6yybOZW6YGNF82LT9HiZVLCBDz9OWH9HX6XqbZy3Y8ZXOiD69E4NBrktEy1/OcVoMsbW1hZ+WN/At7e+wcbt7zDsD6CgNReIBApSc3H23FmcOf82Sid6KDjsKwH//uPfBgDcvs//Ysr/Tx//PwZANfcXHaBX6zkP88SO9v3d6UEeaeHuXDnjmYByypFO7Aw7GOLO+jouf3wJn3/6Ga588RW2/+jh5VdfQXOhGfaLClJwB7zrldMDg5tO0OmH9+4jyqbs2D8dj7Dd66E/zmAExSp1RdlBbn+DUaGEJhWv07QNkvC1iUOMhui3qZik6Up3EenJFaRra4heW8PoxRew1+1geLiFjOiydPCyblHpw1pcm1MJF99h7yT+dCLdEkeCjoFWjJdOLeP4ieex1G3zGbO9vSNANGWpk1lUfw9FNsJcI2HzQ9Hqu1Acc+oMfVEBNM7wZGcb3aNH2XyXosoGdKjnEktXkMzKVYUoXTdJrqIpxapNOcOccqfJoI6m44VOmyPV+hr7wu5EOyOrj9nzKbAAggZDd4xn+FUE6nN9wuQMgZiR/XNNEWm0E7u95zGSPEU69NjZuIf+z49QbvXRnHh05w8Lu4801Y0UUUOikKhNoPssnRZoNyIsRUBnPER69wF++vIKis0eOmTMVBfJHLBd0l7+Z15ieGgRnTfOIV07g0G7g5y0psQyoAx1V/DknIyx8qbntJ9Dx7vAfMyxd6RXpSKN9Ork60J012w8kubTzMvKCoxhiYBXkJ7uZZKXNefgDy8iWWrDt1sYxB5DNvpiIbVI+7TtKmpeIHgGAGAMoJk4teCbIT4bfH+JbkHXXhmOmGr9uXC29YsxDzAufPAeLrz7PvJIzkACqAla7yHD9c3fsUlSAUrz0SYjSGs04YLjmrmGjFTvPtFJ3FTr0ZJfQyvArX6xCZhNyk1rbc082PRZKa9l/U0vw+BKMrg50VeaJQPWbSqvz7pAjb2h+nGbFprBnriDZzOO6raWZky2axT+wGotNLmCPIUUIOQaRhMtqF7lgZhNvc7hiwAAIABJREFUVidT9TiQAVlCE3CiEKuhnbVutNdyWkIpjWk2yoQBwNKGguWb0MaImamRABD0vCntiWIRy9oAjkEaAozo3zVlinTSPi8wGg55L2NZRVmxU8TLwx6Khtu7qmpwWoNFkwKnTyzjudYi4pDXQsTQmJv/H9e/B2VX0l5hPl1WEUfqr0LykieDx1g+cwqdY0c4oGlKTZ934f0/qOG3BWKwerORBoZFrDFr9rPFvik6Myxyo27Le8RnrAK21tBaepk1X7k2izahrtgpCoppP8b3UVH5BdjQSV7DUjP8Y316cn3MIMnz8Ppbb1QHGGbBhjI0/nSvsl6eQYBYv+d0rag0XIE4M6ATGvxEO11ZX5VmvRru2nVI31YEIEB8iIqZPqdu0scJdWpqV2eohZ4xrC8ouzwK0h7nqrUqMiAz+ZtlQtdBEbt2AxBpvYQoRE2ks71IPOjIhDMKgCCtDwZn1KekYtiJBIfOPuq/6qCj/E55XEXY6z2nMhDbz+bniCVIfTB5JAjgYH04A4INMtg3xoi8HvRrsozM9uW+sn3Je4+/2LuS3raqKPy92e/ZteO6GVGgQaGNhGDPArFEqkD8hG74MSxZ8Btgh5BAFZNALFkglLQG0jQEKTQQZ3ZiO89vQuece9+UVkIViA13E8mO7ed7r989wzfYefe9VB2lBdUqkCIwEDG0UPNBTGW9AK02qTr/Bf+pdMAqSBArWVryOqouZkrtlSYuVnwLW6lhaqE/QiC4StVQV9q0vYYIV4g1SHnk1a1UibRkInhClUaCEJLwWYQIjZkAzaUe8/ii7QN4Ss/AKAUMHEtFEXZ+2cTyy2uwMpOtbaIoQWxLxZc+nnhXWRCwTcrJwQD7j3fRYHWNpJIg5YGIKaKDLkE+/QbO4whjmuOGi4yVhieYJiEsyxC/bKN8NhWV6qtVw1QbNeU8O7PGoamPcHKJjA5Sqj6Pp5jsHWO4tQvsDgDy+6erDnw4zTZstwGD5zKmTYI0nKBFUJaDIwz6DxENTuHQuiqFVguFQmiZt1Xm9SYFWFkUh8MU699v4MEPG/jis3t47/0PsPTiCpygwWutxRT1V7/Sy1KCY/TErbXbeO2N17Gz9QhOSlSVaYU+QH+//vwe7r57F0FwgzsvNMkC+SxoJ/mNs6inFByr2hq4pstdInCS42mjRYwnFxgOhzg+PsH2wy2sb6yjf/8B+j+u4+zwGOFwJGgJpfmj5RlIdPr++gbeGY9hN9vV7/qfp9//j39yiACbdjhJlMe0rlhXfYr5oEizXC1eP27khVwJ5gmezwEDqWiPxvh1cwsff/gRvvnyKwwGA0zGIUbn53jzrTvozPbyg/rvDhsODMdFp3sds/MLODrbYVON7o0ulpeXcXj2E6JSp1+PsjZG9gz7mM8c08U4MRG5HuyZFrz563AXZhH3OsjmepiQajYJbVJl31DdIz03Coejf75WPu816UM+80QwzO4EWHhuDksLPfTmu9zeHjVsuB0f47MJLnwPiyvPMyUgejTGKLws7jX1xJPuDynQNg0MD47R/+RTrL19B7OrN5kCRfzsUSjdrayUjOt1thU8mOySzn7fRxhHmKciRMeH12mxEjYJwj6rO8C/Oag7w4FxaqJpNmBOTYwHFxhs/4np9j6MUYSW6aDliuYJUxkoflDcZD2fhLJws4idZ+YpiTk5wea33yHZ20eHLfKyGt2hOigJnVK30w/gvbAKb/UWLmZmMHU8pNT4MBM+y7JEuNNTJ4Pfa3PsYDZsXMahwHJh5MWNVvcajHQOhyTKO7xgOH9ejFFIkMQoNIfIV50IIxEh/ggO63ZhBQ78bhvG0iKmpK1xdM5oNY843xRkZg5boBm5xsSzj7S+PxX9V9vYPdmDRMTUqGAF/Vrem3I+h0jY+rNcmKjb3uVi0RoireI4SkilAWVynKU7iNDovhIPWSdMlKAUgbCVowZkbVLlKFDu9FnMm9cQe93Vo664pXjVsYIT16kFGhatu2xElU2Un7e27KoG9sX3tEpC2+VBrxGXrBRW6S7JXUKtO5Sk4oClhbYNK7dNk8aINCzozNDNM0ESiHYCzSldb8jvE3PiStfs2WbFliyOU8WJTnI+u+5iE6c4ZZFpUeGfUnLi2RybJaPLp+7BKhhNzY1ao0argz9OT/Hz49/w0uwcmmpn0/Cb13D71VeweHMZe/3t2h4siGu8K1Lg8jzFbn8Ti2sraCy0EWdPv6b60GuiO8fiDS+iqnmsZxaQdubeM8KkeCMRN0yuJJSGcsnQe4P2WabyK0Z60t7NBGnNSBeFUhUxRrNir17eOy45OUC0zahQ5uS0lASuZ+f6YeX8rp4zsK5bLIr04tkv8QbpYOk9kfP/1Was0yGCZsC5mqE492V9jHrhIbectHQiWjQoq78bKG67IQgUyitsO0d41xE5UPcH+WwDpqk77mleDNB2hE+i3+ihufFaNJDyW36c7w2iYVCgP2Qt6X9iEjNuBpUmtOhiyDvT/Aj6h/QFVB6dozKqlotC6yC0ghJOTeW3SHMniAdBl2i7P95HqrDpsBCpFFw0ooF0APS66GunQpHv+/gLAAD//+xdTW8bVRQ98+XEHsd2nJCkqVNSugldIxYsEF9bBGt+E1vEb4GKFiGkLtsCbdWW2vlwncjGTpw09ng+0b3vvpnxxJFgi3hSFEcZT2Ymz/e9e+6559hGakUS5S7IYPFaujDVqyBWImGoboL7PwS9siXQWsYVcT++8ZnPaZ4tibzuISEbPZoEFJjy9hWOgACWRoZzQ08gRZuKUgXZfzK0oA4h72TdR/Oo2drE9u0W2p0B3ydXVniTqHruOMCEPo46r3F+NkZpbY24UYpGEjm8qNNrbXEY+h7OR3/hbNDnZC6JBNeSyo8eVElOzIBts2ZRgAtvxl+eGWNZSawg5KqdAmCuIPwZj6mQoEolKy3MmnM2HmrS2anohuWrylRwOUNwPMTkZITJQR/on3K/v1F2kZCNT7UGq1SBHyWIppdME6wjRCXwYPf7OH7yB8adHlasEi9YDms4q0pkkXaZH4oaaymRpSgTTaErdm3g8cOH+Oarr/Htd9/joy8+YapxnNu0YIEkGjMDWGk0Qqlcxqeff4aff7iHQfsIjuHMARA0Xjx9jt8fPcEHax+zgJNhXE2AFnn26r4cqzD/QkQMoA2HQ4xGQ7Tbr9HrdvHi2XMc7u/jqHOA/pseZtMZx1paom32PYXqz017YpWQDoWT3x49xnA4wrZbV9czV9P4X7zvvzI4VoigDrWZWJz9RVKmkopNqESeKOYQ/TzxVX8nIcQUE/NCoRQ3QkHDiQY66J3gwb37+PXefQyPjnnTYVIF1XWxUq3wBiL6l8m4UtNw0HxnHTd3b+G0cwgzSLC+vo53b+3g4LCLwfl5evyVUFb42Ux54cVNsmwUCIimCmEYI6wsI9lpIVltAptb8GpVTvy98jKCsgPPNjEhiiFrpag4auk/KB9zpVFgpheSKtiLiCoJ9lEZudxsYGOziZ3WBhq1CmpEQ0xirNarGLouvNIlJs4EQbMOZ+cGbO8CXqeNcmjCSTIbWH1XqUFmbKEWmjAHZ+j++ADvNb6Ev9ZEz5vxVkz38MclgXcNlVTQGkHrrhUlqBg2/MEYx5OXqN3cRK21CVRLvMlkVl2yII3TwnsL4rKR6gSIBzx77BsCZRYraIujj5GuTfPHa4q0TYJZoQ1rHOGsPcDozzfA0EMppKq5wxU9AsItFqizWIyVRWGTJBf7yUc/QNWP4F5M8PKnXzBuH6AhThImCyoWn3w26LNxHidY2r0NY+8uJhs3MKEWA/KFt9Txjii/kwXsUnkJzZ1t2I0VJLTAB0rk38iKxJy8VJp1rFsWRr0TRGMPsbBgjIL/dST5oWmrKiy1NZhl+tsrCNwKEteFtbqCoD9E0j9FODxDTA480xmcYIZSoh0yrgcBNACk1zAdHfSVWGLjPrfqJRlgF+cAugwjUBvtem0VhbcxS8GnEgslirZxrd89n0fbYzEAoDbWbqXCfvUsNk1FmQUks1iYn7rHXbWRKrEz1pCSSqXNIlpTpvTqtlVL2AqWpV6H/vyz4yRbbLXinPhb/vvc8TmxMJ1MpH3M8jnKJ175RMwUN6lQ7okryUvK14Req32lwe0xLK7GKu6xJJqSqCGW82SVXiW6NhWKcmZ3p4XbSGtDJ0tmrqBRTBA5WfGD1HPc1DbH5CJDMSUKUV0usa3w+O2lUv8XATkdxq8FIIWxSpTmt2GAp902Pnx/D1tLVdXqQOydZRetO7u4c3cP3WevWEjWMB3xk4/FBSibnLRfOn61D68/wupWA4GpxFjja+j11w0tRElCnrGRJbyqpUK1bmhvfwJauBgmAE36XLXYn67sRnEKpOgci5N920qF4yJJVrn1OlHieEnhAxSnYISweU1b5mGkgGexLSRNBDpXXvSuOFJgwlRWcpSTac0tJSQnOV1BADA/dKKrk31T+tCRA+jyIEQsYBkXg+n3IqbHVWux+qRna0lVnUTv9PXzPMy1efO6JDR4PW/zPv2JiAIq7YSrGiGLnovO5ZgtQyAfiTyKJhgfL9oG6r0EBClWOj1zb6oS7UXn1zb5xNDWbQjM8iDALrdny+JExqSY+//L8+Pnq/cwqfWiqfaF/FoBd3Q+agFgy30qnEueReCtbdv4GwAA///sXUtv3FQYPfbMeB7JZCavZpo2qVSpCFgUARIbWJRFBX+nW/4JKyrRNTvWqBt2ICCsQEqbprShk07maXtsj43O991re/IoCIkdlqKJlIl97fv53u9xvnOq/JJkWDIlgyAxEb/Mw2YqeAKyJdqeAwtDUVhUlqsCCHP8uZdNISWq5Sq9RkmcG4v0Osz0GnbSM2P4zIbF5kFpr4rCLXiORrOBhasJC8t4eXkPjcrxLLhZyjgi2aDYXz4dB2h1PZHy8TbWkJ7OdCOyEBPTNU6HJ/Rn6J+8xK3tLQnsuViz4lJNFJoneqzsv4lI0BQLXEnhVMtoyqVJdh3R0R35AUJuVOEC4SJAPF9gRZ5DDWHoi4eRWUcsv8ciBF5aYEl0mDs9un1Xl2zIRRQGArkSp2UeY8bq8+sRguNTpC8GwOuJBMJuqy2M/6w6O+R5YIsOmY0XC7SxQMefodbv49XBr5g9PUKDm1ZEPWJtJXCc5Y3VOReo2kB+STu25GzEof7ef/4SXzx4gC+/foi3378rfbtmOXpD4Gvg/J6Hux98iE/ufYpvnjwy8Ptl1vuJP8Ojrx7ivY8/Qp3s0nn8YREAV7H6a+U19ANMRqzsDzCZTHB4eCg/BwcHOD46wovjY4yHQ7CbgzDSuquxXEMgaoUDJ+0SOVpRGZl57aZLmbVTjM6G2N23rl5qgHD/IwD+6+NfqfBfYTv2bBeSVlnxyQWaiCI6cPz0xyOp0DMBNB4PMRRbmsP3Z0hIcCYC2woFs7KgQEFGWW02sL7eRe/aFvonp/jtx58Qj6ZoeXXMghBrnXXcu/8ZdndvsfmrFEz8s8piOI/g1emcrmDn+g083dhAMO/Da9aw1dtC70YPZ+Ox4bw4305SIvb8u0dq3luRSifzfXcN3vU9JHu3gZ0dJJ0uxnQI26vw2SNOVnyuya72jCoOvaj420MkmlIlx1vkvXS2epkKtnS128buzR52tjvi8Na5r6QhPOrTNz2stZt43aghajYwjBx0trdR8ykLOIJzOoBDqS07/hzvZKlJUyGhRZRidPQSh99+h/3P7yPeqikxEFFuvBc6j64JShxtEmGMSk1zyiiRKTuOpzj1fcymU6zv99DeWtcKVolIKddxlqTHxTW6mHvL1GwTBRftoeyb2rl0z1nOkmJKpr3+K9UGotkcs5MzDH/vI3kVAKMYjaQiLP/E6CGNdawVi13P1OFh9VW0+1PZhzboEP1xgp8ff4/g6BnWHF1jE9OGdqktCTeBg4BtgJ0uWrfvILlxE357FRH9lEpBPSczRuetVUNts4213iaCqkpUERXpWt4YR6V3wyhCw/PQvtaFW3MwOe7DP5vmSQB7O44phprCeY6UpCRt5lGK0pMesFanhcpmF7VdX5IA8Z99TAcjOIMxPLY8pBHqAgFXlQ1XJCSRS9xdev+l2U6XaOZsUt4odpQn10iOZZnyUvAZNVdWdWZN8EXYNX0PwcywRaX65pUyM+RgVAiQxDzbX4QtnBxQnilMmSqmW/DrKB9AJvxSrF7WjFa+9PqzEGWKWayIV5utnERNUQX0F2NTEVdLtdV/24urVULbd125EMBXS8TWtEn+78yfqcSWQbXCMMSLvF6psFY+l0B7KTtoVbXkvkkEGMrnykoL0XyRw3uZ3GAPvyBoTI85h2lRA6K2EIR6nswGQ1o9ZGsG/fhkrv62RexahvQChg7TX1zNg3+V53YVgm+00uV6LNxx7pt1CWyyhXJsXTrXV/joDJBJ2PfLsyd4Ouzjzs42qo6p3CLFtb093H73HfzQeYxkFEjyOy9SGhJxXlYkY1Ng8OwEgyfPsfnWPrwWgyBHE7nGrsXanfTS8WiArwG03qO+GWlJppF6/txrY0PSxupqXvlmQilZFAE99+NKUQW30OxykCiKE/yOQVrz/5qNhpxf2kxKiZ2sVGDNpGWGUr7zHDEtdsGWjCQ0KmW2cn/1/WrSQdHdHD/PwfPx3dBxpktoHQm+K8V5aBtM2KkNu6XrpfK3MhmgTSLZQ+yLMYtJHAih4jnEAp+NBLcV9wJBYP4MnfJ4CrREalrMuFZYknjLCYCST6FjVru28yNrsUiBKleG2Lslyc/tX7kQODYl3dQYVcdUPAsetClR/0iKwN5ygpRRBpZPwM4XbYjPkfMiz0UINw2Kgfx8hrBT3gdJKBTtCzxsUZ/+JNdHfpfBP88XRTH+AgAA//+UXctuHEUUPdXV0z1jT+JHHIgTJwtCFB4KmwiBxDIsgAV7FnwOSCxYsOB3EBCJp4BICIgcQfCQ+JVMPPZ4Xv0qdO6t6hnbiQy98UOe9kx3dd17zz33nDjhBkzhAG62WY6UFG8iBbkXM/Gq6TIDUU6RoJpm5SJpUvFIrAIHspChD4KoFPOc3Mgrn4AZXXTWJwVCVSlKb53gvA+rBrJCPDK95UVRCRWQqBgRr2im+g3Iz5GFLjdVHxZ2ywx0linLh4gaFvZMgmTtPMzKIrLeROZXxbvdC/xJMmMY1Cdi7XcpGwu9ppKEzEkXKhmmEvlYG9sqwmh/gHKk7yVJLLJsSjoNHstEx0mdosc9OQfZpEJBtlJWIe+NUS7niNOmzO4KqGI1UQgIZEDarKcfyn0InWtBdY2MEsioQT7yiz5CPhkhyhxGB4/Eq9v0DjH6+wHQPQD6GZC2ZdafHvdVi5TLFAXRculIVjAUhsknWB6OEd3vYPfnX+C6u5gXMbBCgiETs2h2j/AJT+I93StnwsiSdtvCtfZcKnNsDIMb0U6ng88/+RgfffYpkpXnJOm17LUTTIqTo4wAEVDLfSe9xLnLq3jr7Vv4/otvsHV/w7MkVEMhVttSfP3lV/j2y9u49d47MA3Vq7BprGqfPkUiJZvBk0wQFmH/bHTw6OEWNtb/wlbnAdbX17G5uSk0fyYZRZFJV4VBqe2dGIXqE1qslZ+/dIFJoOKTwR85+OZyvx0eZhgORiilV+C7ER4AORlujwMWJ+mGJ49nF3unecHXBcUzjtOK5eOaBCfP///ez2mvP36cNM07+tr/SrA1dQ8tms6JKOQkbiGoi81CHSRAJHgkABIL+cc7HB3axEG3i22uo+4TKfq7ez109/ax1+0KICgJXNDDKAwutBZVtNMpS8CQAhYb7ZjGOgN3hiJxMita4Nfffsd4Ugqgl7sIN26+jvc/+BC2eRZV6b2lfZlqpp/omUczsYKCM8k6f+EKVi5dwZ+7XaFfzy208MqrL2Kv18XOVlc1ZWbOGnshKfhO1hTcMjUNNHRQaolaKj4zBly9DFx/GePFVQxabRxYYGw0OFZebb2yXr8j/EtT1UkEQtdLhNZM7dCS8xmz6umdzqXiELK2dgHnVhaQNNTVxbrMMyUzzNsG1i6tYGe3j/7BBAfEkJuLaK4CcU4Q/Q4a/X3pVKNUt53KDwbJvidJ9USgl7NlhOHdB+ia21h79xZaC2085jVgB9w6sbdysRMWQCTsLoOcMZl+v40mIkfdmAyjzg7ybg/u8kXMr54HSNNNNfGJXdCHKSWG2mM2R4JOmqpmmTkf3F3dtDO1JR6EYeL8efWDSVHkC+LC6xGQVUVANckNzrgm8odD9NY76G/uo+pXiAsyAlKkZObRKYiK/7R2YgLKeGm9cF4+RlrmOEuKeDbEclGgvbWNrR/vYHx/A+nEIfEIRCzhNKh5T23nyCKj5syksuinLTRv3ER17SUM2vPiX09Rt9gkYm+blyN5dqO5GHZJrXknVn3NJaGFF+QVb3dP752PhQacuwLNpTYa9BKfn8Ogd4BxbyjijY0yQlxMKcDhCXPBzov04NjJHlGVFm4pQdZuA8tLSC5fhOsNkG13MXmyh2KzA9s/REIxNdsQzYHYx1De2ihQyJ0u2ZncXZXYnddPCvdU1neE6qk7n67cMTv8UQstih9TRZvdOkfYRin6HF0ZjguY9txp26Z26d10t1FqfXVEPE86j5EWKSxiTaFxQFij3Au9GGQYJZ2lIbvC1UK1vEdpo6nd9rzyIoFW7cQDPfhYfGEXWJN5I8VeizO+VrU55tKmOCFVLpNZc0vG48x8PWZoxjy3FOAUgfPJeUZVbtEY0m5oKWryU9Vufk+Qift2yG+L0sh4bmCcODabGlVtM8f/Yetupfd8Z85LUclSRwgibxmamIbutl6/iC/LygyN1AMqdOuKdBwjUOMj6cArs4EjVa4VCwAZzyeqyVAGgNLV7hlB2K0stJiphR1ltMdilBfYnuT47t4fePP5a2iSxWAiiSvzC4u4fuM1rL1wFXd/+MmPkWrjrRImVBCC1GZK2R1j995DXHmjT2RCNLq495Qi4jrrF6/MudDRMX6fYHGk90ibldRYYJCIPE2b11n0dODR6EiBZXbexYmBDI1AObc6iuo8VTuJp4W/xCHPDLPe4SCMUHP9cHSPtRlHbhX0iGRvmmVYi3NG7AUeq6kdXeWV7lWbRIv8YK8+K4RiPJDMIjxp6hgM39Ek1/XJr7QsrxkrZkqh0wKdLGzjxyAquZdFPvHnVqCF8Vt0GPz+WHgBRFkT7M47UztQKHslrUX8ZFbeomYVPC13VaFx3xGfGReSsMhCuTKqWUaWQxLXoIg6zKmCvzRv+ZzzZxMhjZsYDA5VRd9o7Ztx9Ns3pHl1pabygpYBoOD7Der+YU1Rr4O/U5YC/0Y/exD2qwt7XptSrQjzfDrqkSZqIcq4FQQglZEvok8COMh4ADVIJJ5wrwl/d5S5wsNGWj+Lw5Cr8C8AAAD//+xdyY4bVRQ9Ndnl2O30mKQzR2GQQBFIjNnlC9gAH4D4OJBgk12WsGCFhBQpkIRAp5OYpNN2p92eXcMrdIf3/NyJAMGW2rRaZdk1vOHec889J+Y+C6qse+qmNs9gBJbSKf7hZbsTq64vwh6WpiGbhqBKC8TTLr5EfRcfxdCJERhVOqTEnAagFXiyg456MxlVMXDImUUs3YD3kJyXBomplgLY0K50YYUirtDcXmfKZHe3C2ShR5JbHNQDeHjQY6unUKmflfqeCjJrOJhKqwC1uM6CKNKHHrqKmi9mCEWTZuMJAhoYZFNBiWAWYLB3gGa7icbWKvJ5gTCR+Wqp4ezdrS0ZDlVTBKvSHjn7OxFVy+YFivEc2SRDMc4w7BKNcAL0BsDhEe3WwkWMmwgpsU6b7PFKQSNl9GaasSBhYgqcMDna4xHynSco7z1A2O2x1WGijz/0ev3hAoyF6JAFVYql5MJofKZVb9EgdgdpQIxnc/zw/Xe4dfMmPv3iSwlSIKrc1VL6770zBgJEEfvdD97D+x9+jG8e/g4rK8ne05VEi4PBCN9+9TU+un4d7Y0NxKSorSh7f9RH/+hI6PuPHuPunZ/RefwEuzs7ePG8i/7egSLRlQjs0GTVDSxiaqXhgMrKpkm+HzpvYhNYUE3aJqIg4UCfgIdcaaznzp3HhYsXpAdLg6LkpTv+t8d/6yH9/9DxxusGKTXnIlRlJfioT5l2MQoMZ3Pk0xm6/UNmdJA4ZafTwfNne+g83OXxtP/HM0wHI8yGI14rx+wZLb/BzJrCICsL1MMYJ6n6W9aQ5Aaz0YhQTpwkejJViiMRPKKrOnx+wIkMBWwNmo8kzEWgrgnwyWefo7W+yWKnTKn1nJurfzA2CHiMteJKoOX2pUvYvX8fs8ER2qsrOFedxbW338R4+CP6oxwpMcYQ69oeSCVVa6KJpFIyo6vlCrMNzDnPJGD1ZAvB1homaQvDiPr8GfZz4jYc1Ia+LSdk3vkJUCh7l7iglNy+Q4FAo5Gitb6CzdPr2D6zhtW1JpJYgOGKhbUMOx2QSBQHTish1s+soXcwxpznP7GPYqQk+JNPkT24h/Kwx57s8sPQRd1pJ/HdEQhQyw2OftlBJwDO37iBaHML/VoNfWMwoeAqrOn9hPys/BYk2kMaEVH95ij7E+yNdxHs7WPjwlmcOnMaSVrHhPaw2kJdmgICnwlwnLJt68QWkKk8q1PRXFm0EhAwwXoygWjzkEJ3/UQTNUpkpznK/gzdp/vo/fYUyaRCOMwRV3XENPYSQepLasNTB58opGpyyfspr/kmR2oytGYztMluqfMU+z/dwfThIzRzdup1Ca/PLPMr4VlBAFINwzRFcvkqGq+9gfn6BiY0VugLuAJTkIwlV46mVY56mmDr8jZqmyvICYAJK008Qv4cVAizssh1JE+uzAzq7RbipI6YaMPpEJPeAIaquoVazrLtqyrYu8Qp4uJGFRne03MKQMmnnwS0VlqI2m3Ut7ZQG45RbJ9C1e+jePECB0dH/Deo5IXGAAAgAElEQVSlYNSQIGWBZlJnMIMDTvqLRTvi8q5ZOjA0rOz4Wm4/lHcukBwH79SH6nXsBKJXyJUxEjbksOxvJEWsgxT30lJrk6rq27bQwBZ5rB0iCdp5lXjaxx2llq2mc8dStQuGrfqxVVuZubipllgf/sWTsKADJZiUePNntOBFrIFK7cCgzAFarTJN0CiYp2A88ip8KWlDmZLP2SQajn4dOfcm94wrae2xLba0ns3nljIc6X1K1ZWu1Qb/dXLJMKILE6kODMVtrJNVFiKkxhVFAVcIKODEZ57B1wGLtQ/dKpxTgcJWbgUk8WjNVFksMpxo1JGutDAeTiUhPtbqAi83kBgmcoKHeTbjuVHEJe51dvF4vI/V5ik0CCA3GSeEF69ewVvvXMOvt2/DzAs1xg2WIr9Si5HF1KBzdwevd/axuXYFprR2toGVtIdaNPBuQ0KG9F6sUrotsEE91Y2OR3YtY32yWNqI9R6p157ZdzTmosgVApbf6UI8z/4vY1BaXPzP2tYQlx+VxlXQoyVKuCTFRv3jLUDFzFRFRUxZOdbAqws/YICJgI4yWGheLJ0PYpc81vRZ+dcKPQftc18chvOiBV1engEU0Issi4NBg0LZ3BnPLXoXNO9cUZDbfTx+2l8Ju2j+yddO8bi3Px6n+y/egzxzZqsXBIxLm4cINYrrgb1//zkKm4Hm20Ibwj/PibcCAlRtZ6b9MT0GB3LqNVugz2dByHe9goGnjCXWo1BRfcs+tQCo/R7btjKZSHsVrQlJnOBP9q6lt40qCn93xhN77CTNo2mrJEALAVEQQmWDWpDKkgW/hSX8NUSlogrYgEAtqioKRTRpnNZu09QeP8b2PNB5Xduti9QFO2YVJU48npx773l8jwrDiFRlcdFl3BCe1QUvBlGpKo38ppao6hR6lndhqoZiKVj4D9qoxT6ozEPTd2lm1FlZkVE3NiqWLDi8ems4vZ85O8AFl/G1mE94KsLG7haOK6FAj5DxlNopZDVQfnr7oIkinSBaaXCSSFCoCXUJixKDUYpBmqJG9xeFHvpW5ounozS3p0lA2ktQI2sVttEhNcEJcDxC//FThCuxLHzltzjlIjl9rjw55km/dI7ZupACN64zR3Y0SOHGGYIkxfhxgn7rGdAZAq1j9aOTDNtVN7jYL+MQJR0KJOhi5Xrm+JCPMoJnZqh1nqF353fkf/0Nd9hCzHCW6eN3ck4rz9752Z4V/hY9FSjPsDRO6zR2fHD7JE4mZb1uH99+cw1XP/8Cu29dkBhZEI8vTIyLDLu727hy9SpuXPsOJydH8ioxZ2YYYW8yxPXrN/DD9z/i40+voNPp4NbNm7h37x7u3rnDRdrh/j56SY9RMoQmCVQ5t+4C7RCrc/qM8AmhJugZhwo/5mOosIRfY1y/splL4HJuAFDKsrq8io8uX8aXX3+FMzs7LBzp1UL/5/7/59fLnu/Lvi8yc+LNnPFE3mHSHaJz0kXzwSFz8CmOmg+aeHjYxFHrIR49OUav1xfoJotg5ozCQiHNK1eKYwdPzosSK40GJ41J0sHb5/dw6YN3kVKD6u4fSDsJTxzp4Bd4WoHVeswFYTIZYVxMOOGhn1EBu7mxjvcvvqfUq3wuEX6VK7CCpchY+K95/g3c/+0mC5kuL8c4//oOBt0ubv16mxDc/JyiMuTCjmyf+AwRNuvMCg411LO5O5HaRAoBPqSpcAoFaUZ7kRXEL9v9p2vT+YkmTYdcJKJP8VKMtfVT2D53hjn/jbjCkPRipGrFTgpSmsjbVKTeiLG9vYV2u4PuuItePkER0BquorZ3AVE2ZmrXKHnKzjA0KbSty+qb3BnMfoS1rILu7fs4wc9Y++wT5JsO/SpNAxoYk02r0RM8ySzQBj0ljk4TFweXO+SPEzzp72PU7mLrtbOIlmvseBNUI773MWaL/8I3F+z/UGoxSIVF/tx2GzAVwrjIovJOyDjmHJI85DhHJQFGTzroHLQwOHqGIMkQpAUjoeKlBspMyk4ugBUxUIY6mSSoNVJudtaRoZqP0MhSbJA47UEbBz/9grTVRq0QVwlXTAv/Us+hSiF+5UUpRUJJ+z1NPnffxNqHl5Cd3sA4FO2WkOyBSecmp4Q44z8a1WKs7ZxFvL6McilkSFfgBOHADoGuIgW1NkICrxZesAduwUluFfWlkEV+QZPd3gjZYMh0QUICkI5Drno5rANQytqnpJfWZR7I+sgZGeDgoircaoxspY58fRXhJMcSFbfHTzFptpDRftI+QT/pYoARn9+R2vvVxVncrxDSIoJROLRh7+MBao882wRQxB5ROilJ99/3jTZp/tBkspgzQF6wFhW2HuoEPNPENVKeLO9HYanidJIHDYZD//tEV7XpnyhxRz75N/0oplHqurcJXgBzsJoWaz7vLKXQznUiybmi+nezf34uk86wIlbA5PgAhvhGc0OZ/mDAtnrPX1Zgm486T+TDin+V6Q9QUZbpcI7FsisRw3hpf6PPSPQAFv5SazJuNpC/+Dj1BQF/ttystU2NnWIq1CaD0BgYVgzJmw0mbc0M8Q6X1/KeQndAha4Wi5QLhWSBTQ4rS2IjKU0t2TxmkcP2rH0TICgV4UBFyQTNdht/Nvex984m6ii4YKIcnPRl9i7uYfPcabQePNKtaZYMqfGkTaj20UOcHLWwtbcDV6ktjD3mSBfwE9jhTFxB48PQTKxyDyyskYhuRToAZu9IMZipFR/9HwiZNTfQ1Gl2psUl04sWnLueM1/mnoZiInhlORU3pTVI9BN6foZimXvWKhBp8PFFNdz8+/57DmCucP45hfNFrL3HlDM/cy8eHj/9faFPy5ri6bcTUXmhzxhcvmBdDyiUPniuCeCbSwi0gatuIJyXmJ6D6RLYdJ5qU0FI+M/C9SqtO1LTF8i+oNKnE3WKCYoZs/C0RoY961l9AAp7Fi8kBB+hD0nAtSouGnZGWFwwfUnPDlr7dj+sAaevm20GGAGav1YEguxfIiJocTDbtLE1zfdIvRoA/wAAAP//7F1Lb9xUFP6uX/PIe5I2D1oQFW0XlZBQiwAhWFR0ARISf6n8LlYsYIF4LEhbqIroNG3TJp2ZehJ7xva10Xlcj2dIqViww5s0Siex79yxz/nO9xAGAJ2E3vA4IoRfbOs/4JCnorDzCMhcMYU5/UpVOaqrUWqMaJhqOooiXJJjb+bM6ko1OmGE0uaCctqsRibdBdO5B61gbtPXG5kKCXt2GegWiNIAuisdbLy1iW5vBdn4uKZMV1pNeLzUJRJqfgdDrK8uc8FbQaZeGVFS8wxTegATKEFTBEV2z0JCmVJOqCqZiFLsG91A3aeEqDdpgviPx0hsgaVz6wjbQtkU10xo52wFGfclc5tNcbICPk0LT2NMTyeIX74E4hNgkAKDU6H4UwU39cS5qEWO/h0uwugaCmI6USIDlBdPodrkJguDFj1Ej54if9THeP8uuoMR2nmFbmC4mUBTA+pijxoTfwP8rQxY5FoYpfC40sQVcqytgZzSLz/+hB++/w67F3Z5TSSr+59vWGxEGPq48dH7uHb9XXz7zROdzrrfnyHyI4zjGF/fvo3LV6/it3v38PzwGSckEKhihIGINuVvUt43TSvp/Sj4E47A+DWwZerGQqYIZyLipsTMnnrW0FtJncTezh5u3voMtz7/Ah98/Cmi9XVBGtnfYb4h+v/4b4/XSxgaWtuqxOjoiA0gD58cYHg8wv39+3h2QI1/H6PBkP0gxqMxJ2kQCss0Z1Ro81TcZ2t42o90D23TxI8L4kimN1mOTDWW3dVN7F2+gptffYnDg4eYVAWO+o8wHcbMEiA2AE3+bDJlFk3bBDjNUpiwjYKSP6zFzrnz6PV6tdaPGp8m0v5vDj53nyibq7h46W08urfPxWHY8Tkub29vG8koRv/PPiIToBVEUux64gUzSTNkdtHi86z1VrdqazHJM9g2mGpeaabga4YD9VFqDJEtUoQtg6AVwUQ+trZ63Pxvb26hE1LSi2WwFzqtsKWtp5L08Z7aKTc5vc01XLh4Hr+PE6RFivEkhxcZhGurWLn0DoIEGNzZxwo1ZCQhWBBol5oPJzFYOdq2xOjXuzjxgDdufoJobwcP0jEqMvNxj0pTzbT8leeoYmz0SpIPAu/JL6JMS8QHzxAfHWP53DrWtntY6W0wcBJ2WmJG57Zwpdn3CgIwNbWanR8cO8OZqaopoRRfAUsiIhvBnhRIX8Q4fjJEehijGp4iyD34OSUrLonxa9nIdXeXxHFaIpcJfdobJdq2wlIxxUaRoxMnyB4+xvHPd4DnA0SW+2xegnIBE/YaMXb0lRz/X5BR5t5FbLx3A5Ot87DUuHjifh4aoVWy07LJ2WtiZXsTG29uo4qMFKdew9jO8zSWUnamq43EqV2eeiVTzEv4nRChv4T1Tog0TnDy0sd0dAKPwAwCxagh0DjfUvUWTjLYBM/pmTnxRdNqIg9+tCpNKT3n1paxtLONbmYRjVNMj45RJjGy4QDJYMQygTRJEJUFwlK5NtxjW/7ebSl5R/3Gk2n+4DNjBoBOMFl2U2qlBGZIkrlZ+SoTgoXDqkZZIvKKutAuG5F64rjfqs3soM106EkzSjVQQnGYxqhJtUw0XaEOBQnQ0ERz3cQNqq4tU7u9OqGqLF0sWyVJWOriXZbS/LJWnszCONpNTAe5Zi0KNjPkwptYrRpt7Zy80WgmmktUada40yM713ACI6LI1LGDxNxiPy2SFFEtbCTei6SqxFLIteDn1yudm+61uTaljjXA12lmWaxOy05fnQ8Y6sZIAFI3VZ79TAzE6T2PlrqYZqdiXPeK2hvNZpDq/3yCqCOB2SdJirv9h/jwyjUs81CIgIIArU4bW7s72H3zAp4eHM7d4+vmv/F5n4wLPH/Qx9Xr1+Ava5JIwxm+eYRBxCw0MUnL537GQGpl6+m7G7TNvV77kUL7IKfj92uGs60d7ysFktxai6ni/NqwAbruU9F2+wyEUi9jVFIte1INo8sKnU4XaTIUrwllHbpG0Bb5mcbW0GFpZaqa4cAM7EVFmMbrzbww3FTeGV7O6lGrIJ2ThNO+DxTQWvQgcO+DmL2r3IWZQKL559j5IKxT34S9Y2uvgrMN/WytyW/2k84Qj6+nnL9Ap593DbYDHZq/XzwRxOyd9gndU8jvq9vtKrCYC1NDzRR5LfTlDjQi3zo2GFTTvxkDQNgw7G/nmnr9P47x7u5BMwCAm8v633zOCizJMGd2z3asFjdcZxlTpysgS2HxFwAAAP//rF1NbxNXFD0zL+OxHccJhHwQSFqMoAgkUGFRFqWLCrWL/uguSleViFRVAgIUEkIcYkhIbI/H8/Wq+/FmbFOJVmI2kRIxzNe77957zj2Hr9ZX5VAKKKROTjOjeZGqCEJNFKYnafdKX2KxFf3pLPwosIgKocUoGvELtCquxKMBvl+qvxbcARUvXEfjch0q90J45ssFS98rb9hTdUPuUJrqwU1/EJWPafk7Irmm0mVqtBqcMDVXFrC8tYq9vR5CD6UQBavO03wZXWs0wulRD831dfa9FfoZGP3vxyNG/Mj6Zq4RorEwz0E8UIpmPoFHsQMCLCi89vb2sTDow7TmGfWL59soPoyA9xGydB+nH07QWD3HKD89X3/Cs5I3FQ1KRZwgjWLYOEFCtEASIoxGQBQD/VQwdxYVCoCGgVcL4NN8jR8in2sIu8AkPE8mjSDDVE5/nKFFPscHXWRPn2Kw8xztqI/53LKgHdNgZxKu0vPYEzSh4QUYW6GipRTQWfQn4T2XgmSqmgFUQCOdZkwwCqIoBH3zZx/7+OPRIzx8+CPqi4vsCY2ZcmF6hq+QzNC32Ly2hZ9++Rm///YrsliKIv6ObM5UVUpWXjzdwc6zHenq2WpDoaKI3iPPzQn5imcDDc8MyYxdroKZ8sFJgpGwXZfHM451T61RAiOdfWvL7nW7PY+bd27j1t07uP/ge3S+uYbOjesAda+VqcB9mZlkrPiXxsqXPmZn9P/vDP7njs+d78v+b58eXIRTYkWdF3hKQpdiipg+9CGrrKU61dpSSTUanOHkqIve4Tscdd9h99UuDnYJ3e/i4M0+To/PMBiMkBL1n1A42kRzShRrEveIppupioeyllKm6WY8S0f3PhhnCMimLAzRXjqHS1ub+PbeXdy4dRO3b9/C1esddE56uHL/Oxy93sWzx4/xYvsx3jx5xugn6Y3k44ybqo2ggShJGTWj+146v8ybGFNavXzKt/a/Ht7EO+LnZgJcvHwJa1uX0Xv9khdRUPex+fUGr5EsHiEaDLBQbzFCRtc3zjIMgwhnwwhFMr1Bl/N0PKucc0OPZuTqmngTolqo6B94465QdV6X3jRaUI6RUZJhSZw25+trtUNsbKxjbW2F/fubJN5BxT3pIjAyLmyegG3GxHiaffoZOaNn6+HqtU0c9o4w6n/gvS2tNRCH86xqbzoZgjhGsreLsJhDbMX204HHpgCcNCAxJEgboY4xkufPcUgWfz88wOb6ObxOx8g8SShp/E4asIrCWEE6iNZfFqM0s8y+wT7ycYrBq7cY7B8iXFpEe3UZ7Y1VFIEksnVGYJznsKBTguj4rFXgUCtCK0IqgCgGkhBbmqJu6kReQJj46B/0cPLmHcbHEUxm0MwpyWtzjCWqf8p7u16fUfTGy3ntNZjtAmYW+EmCRS/FQpZhmZLq7nskL16hu/0ngnHB4ywlGOhPz7ebYkJck+ixsBgiwOjCClbu3UO2dhH58nl8tDFSKw0gmrGl/SD3UmRBjlo7xGrnEvxWyCwR35eZX19ZEr4V33QRSpyOk542E1h0NlA/5xrpc9TQrNcwRwj+Ugvp+1MezUuikQgHE4tD+8O0v7K2Ty7zrPmEunpmtGHOtmHSIDf1kFFY2lODCwuY++oCTJRhbhgRZQhef4Dh4SGi0z7s8SnyYR8NQxoMMYzmOSGPopgqgbbp1P7qlLHdTLvTgrDaBClYGHSMISGq9eYnEdyqzaZbktZWaJsrLpgKPKP9wZZVxjADwBWnPKeu6zlWBNfo/L87N9v5aX7rbNEKdZIQoKoSFhNbQBHTioZD/pmrvdacirz5Xq0sULiRQOev6Zy0gk65YzVQg4IKRFtw4k1Fg2M3sBq/kf3A3bPLY+lvUvgrY0Ht/lg3y5O8JVWVdtfUEOaCCJYRuEazzCzCxnPcIjLHOifaECnnuYsZmziNn/mE3RpdR6nyrur70ggRGnGWChOUbCxzX1gdxJISpDsrx0JdLmFVE8BT1fssk4YFaUk8ebuHv4+7WDu/hQWNMXSP61e2cLHTQbj9F6J+XMIgvo4k+UpBCX2PEdzeyz0Mu8eotRpIm0aUQWcOQ+wzap6RDlecKlW6En1kF7Q8U7vFtGSE8DM3Us8QQAltLk0Cka6ZUhTVGLQrxKbihJV/y++TnB5KMUqPGR081ktFLfVf01zYz+oSRNdH9QedlzTTvCkgtKLPTxbfk2MIkwcL+an1YbVWq7VRoffehEtGXjbSUFLi5fcODZ+1zZ4+vy3HHMxM5yFQvQT6np1InrMDnLwPZ6HnimRhH1Tncoi9MG8qlyVoLJPrlYKamhDyzj7NOt0YhhPYI60I0cZTkUZlPTCCr40kZgnp3ymOOIcFOlw8mjy/e8YuvvHaYeBBamv6vWse0PPhOMBNSGFPiBUqrdeqfnY2iO68AVHl9FsEgH8AAAD//+xdSW8cRRT+uqtn6VlizxgTJyEQOYlxhEjiCCGQ+APAgd/JgRMSElduyQFxiEBxjE0Sx3HsJE480zOe6e4q9F6911PjLEKII33xMp5xdXd11Vu+pcJzqHohfRD7BtbNzI9RKqY6eemfelX/srLFMMJ7p8nRaHj7FW8Z6DlH0RssAsMbGfpP21N8h0ig7+q5WA8W1XdBW07zXnSR1teoyEFQtaQdo322B9uIUY5c5YurwFQOmK3D0cEzfCAQNer6k0VFt17DeHKCIUG+Is+v7S4uoBbLRg51nJYxiGcp3eLsOMPzrW20FvoMJc8KUgFuwuZj4PmI8JQYE/8riSvutxGFTi+H7QASBaPEeZL7rydT729Er7NNcIOiQPbqJnES4uk6VsP36FpXk6qSNV4eb5qjGRcsVGQGx7BP9zC5vwW38xDdwRAdJ5x/2fhDFwLdPKKAd8lq/OSUQL7I9ZiVgtFqceB/QmONCDQRs3hVm6phc7fedyl4cyGxyUmJX2/fwf7uI6z2ehyYvitBjKtAwwLtGja+/AyfXL+F3+7cYeVhw4Ic8zGKjj/R84iFu08PMLzQz0x68fWDZQNFfKcmXGRTlJiQxgVdH9JMaDXx8bV1bGxs4ObNm1hbX8fl9TW0egu8KXPSQraZDBfWK/H/8V8eGoyQyE31XAaprBfR8ToaJvKw4FE2wsHBU/bP/+vBA/y5eQ+Pd7ZxuLeHvd0nmGQT2GmJfDTlZJ8D98KhQxSfWuqrzTVfTef1LG2zJgVRjnKGjFmuqI/JLWKhi+WzZ3H1yjV8euM6btzawOWrV/h3cas563YnQPdMB92LF7D2xef46rtvcfjH7/j5+x/wy48/4dn2Y3QJopiSNVTGa1c9YoMPDuCpMm3d6xvwvzlojtJa2O0vcoFi8GKf7YhabQrKW7h0+SImwwEO9g6Q6mZofdEgnyZoThPvPFO1RTRD1sKgqQIahleS2jU9JxR8GU95SIJ0JZLudLjvaFDq9wKLbjfF0jKp/J9Df6mHdtrwqC+CgdsJU3LYcon2p0QCDinGUYIcWa9DYihR7aT4cPUcBtkQo91nGFuLcTMByDbw4nksmhrGeYmXD7eQkpAd89pd4I7g+FwtK61b1leJhgWyzXvYHB5j7ZuvsXbpPPbJvs4RP90FiafMX+6oS3fA+uKVZWEjCiwTTJlvXiA/ynCUTdllpbXcQ395CbU0ZeV6miBJzVtCUmGWKGUk0stBRem8rguJJJYUQBt0XAP2OMfR40NkT1/BvcpRDscwRYxm3GC6mpVgfVLaispGfi7GOFS2huysUrB+SiMiVEyB+kmGJRLZevQEx/d38OruPSSlRcvEM07p6XXfzdT2aes8IchlkmLS6uK96xuoXVpFvrSEIaFPCOIZe8tC1qcppyjjgpsCy6vnUFtscrKtroaRCH9V2j5vslgMDi6iiAghOyZRV5mKYkmD9SOQNpG9GCB/CYwHGVP+lD5H7+QkxcjeGtmKLkHIIJqHtE8r5JqQMCL/56HFZKdI+gPtFHF/AfVpgebK+zDDMXCcwWQZsud7yEdDFC8zYJihQ7aI9BxRBwol0rdsdAyh1wBaivWKGymc1wBQjSTrgi020nOZiWn5rpsG6lIsEbEsfkvsBbBUBCtMtKjrr3B+5cRPgg44FV+1OeWkK6qq4zG7ENR5LrLtoAge098mYfeNefkJjzGfTuaguD6Q9+tJQvo9pJXUbvsigHT2uENeFDjTPeMLwdJlZ9i+cJ2N9UW9lIo4nIwllRVbeLA4Gl8zryvQSduSjIuaf6Up4GT+xxXq1gSd04q2G85V64JzdiLaPYvLNXEPbmWFbrQSm0ZCgaWYj94/Fx8GmmD81TJHx4+ZGoRRjJ3DA9zd2cat3gpMlHIjkfRU2v0+Lqx+hE5vAePByUwKOZI10MXVeKgpxW4Au/tYWV1BVDlHxd7pK/LFWxZTjE8nxqEyfDnHidfxKyWA55BcUxvw2/Xg5lyp0HNT0QTC/8HIDJoTVEgR2zYdC1NF1I1CRAKpaRAipBXi7aT4y4oiZvb+cF8/nSOpCwREX8Kf3/x6FhYKrFMUWPHaa7O/V/69H6/SUehnptD8U4ieHHRtQlpBZCKxSZ5RD4pSQGQxqiapQufpuaXnkZFPFRx+pqvg74FixBSB4dc1RagzFUTyPl8QK33DnAqIwQTXJJ7iKv6sQBBw7hpKA0KLF6x0+JaDCwqSY2tRiorz6tCndHdvne9RUzp2vUf6vacGeiQ/j78o8TcAAAD//8xdWW8bVRT+ZrPHuxOnSaPsG11AQVSAhCqk8jf4bfAX+sL/6AM0JSlKSuMkTUhJGi/jmfEs6Jxz73jsOBQkHpiXSlU8tsd37pxzvs021E6cqEknvaGtKEv0BSOiFTkFvokklsLINlm6IEX1EGBTEnWDeN6A0XPeSNXCYnqVOU4fgdKA0WfQxip08ThZwBQahKZo6JxIrYEHZ6THI31NzqNA3xyGin+6a9FJIRLDrRfRXFtAWi8hGQTc/LHhkzJU4IlnOsR5+wQPSWtTLrMbN2ndqKAZhDTx9nj6XqiUuEg/tMmpOCb1qLyXXgDqX3Kcjjs9nL94iZ3FTbSWFuEhRI/0j4lkxKMXAEGO8p2q3FPePBVMYBijKUOsYwxNRtrB9BN6sBTFl4AQSKsgqnwFnSTqIZOqJrtqOShR09PpID4+Bg5eIW0fI/UCRn2sxJzajuqiRZtqcfwUrQtCVGwT7sIMFrfWMLuyhMb8HCr1GhfPB7/s4fDnV+ie/sH05mLuEZP5/6RCCaXN8OL0FEcHv2Fr93Pl9HnnvZOtNZpUk7ZnZWsZT799hl9f7CGIbkY0GvVeepXoIQDjvqrAp+bfZp3/+EONncXzLAiKBIlkOEOSOCq+lzdWsfPoETYfPcbj3c9wf30F69tbaM3N8WusbLBGE+KSQj0M1pLHE43Z5Ne9Vfz+/eX43x//ftDxcZ//f3KMHCsSDJOAm/1Bt4f3J2c4b59h/2Af7XYbb39/i7N3Z7j50MWgLwU7U+4Tg5taTin2I5Qd2vds9tCgKCeO5HNcLootiqBKU3SJnm0XKPwDlWYdjbkWNj7ZxtdPv8Huky+wvbWBxWYTVlGHwKcquiJVTUj+azpMl0TNxr0nX+H79W20Nrfx0w8/4vL1IcuMtCkn605p8FkUDb0MX/+bEZNL6SUIsbS+ivabRZwc7ss0v0jfsYy1nTWEwQAJuYSnot22ibI7LDAN2yKqn5oAACAASURBVA+JTXM3L0QXSPRsqRJioajIVCgmqgvRLABO+rDtceM/Qs1g8wOwUnOwvFbH7IyL+ZkZlAhh4NgxQbfonERDtywh4tDzIDL0eUQ7y8gzeQik1LgNsbm+gu6HHl5f9xB3I3TIHZrQw3oZrrWIWuBjGPThX53DHvpwJWOEDQzjjPUke4xuLptw4F28w9Hz51j+7hnmN9YQVl2ElOygI0VSc+QNwBcv7w8gunJCK+xiWdD9WKQNRgh4p3/Cu7iG7Tpo3m+h1qii1Kwzu8KjtB0qGsKEn3nVchl2TB42EWI/hnfZgXfVR9z3EXZ9qtjgwIZbqLKkIgoSLuyTzGhQUBMekFvyvDCVAR2tUYfc1Yn9QHG/Xh+toAP/7THevzxCcHmNsnKo5+QJdSukOaNHiQiUATskWAeJ62JQaqD54FOYmzsI6g149EeOCR3BTOhZaonksDJbRWOphcpCk1QN7HLNiFaqDPSyBjTRL87MlyYpvVxsmjoC0xSfA43oUTHruLAdA9WqDfPKYVmAQfvFIOTBICcpULGajOT4fC0NWe8c2af+RtB1S6XJCBuNMvkLNhWvRRjEPKiUmIlDv59BWtP+EtD3YV/3YN94GJ5fon92gkrUQU3aibG9gWO1FEqdj9TSR8pKxpgvWr7uytiZE7WuoFYic5LzxSiXK+gN+qphioTSn4sy04MAnaud/X8yrpWdJg3NGrZ4JCNgEEu5dTvUwBLDkeSQkdSsbPwWJ6z3dhU6lxXYFHGt2Km+P2CQipt/dV4u1eKYm/8gDDLXce0fMnmIBt/JhgBJMs6K1OhgrJgTeaSP3qdRq7MpIaUUMBtgDFjTYE/ud8mdm5usfMPOrKI8PTrOGAPZ6xUrhfYtcsynZxtLQ+6IA8zX/uMLR/bWfjrE3psj3DzcxXLFlcGCbaN5r4XVrU0sLCzg6uRC1f8GtFWt/pY0UDHSEOGHEGeHb9D88gHs2Qoi6ifS9FYBlY9A1CgyFCDAQ52i/AY63pyRflP7jxkIVZOth5HTvMc04jxy4r/9m0w7pMEdsX6lTk+lP1LMAvpctGbiO/zGgNtA6ORhZTT9Ea08e22+HteNpJbgWMo4WMm72dBXMV+gGN7MpzTvbnCnft58HzfhKQAlNYjVvayZSnlkXzNcoiTNPpvrljJtPXJeANOvh0jENSitJQHah4Qz/31fGDdaOqXuZ5Iz6KGHxPrl/DgyRgUZ98m5PnZodoNmLen0ALm3lTQjn25Ea2MK44OvG1MDRj24ZZr4i7xr6W2jisLf3HnY43fi1CFJSUPCI6S1umABSCyQQEIg/gLiTyH+AAsW3RQhkPoXUJFAEKmUQNOmbVLjPOzYyWRsz6Bzzr0z12lShFgym0pN4sedOzPnfOd7ePaGNYYRYPOUKNMsJTpOxyD3BlmiD8Pu9xQ9YsUJeUbLpRytjfI0lcHLblR8Iaj84WK0EiN9koxvgJn+06Y3+atMPXTFiMV8cbNR2PVUmzYIiKG9DZLp35NV0ChRqQh3NkRzZR4Hfx1xEWE0Rcwgp+8B4KDbQTQcIqzXWO9INHqKYaLSbxjHOD45RTkooNJoQnlFOHE0/fAU9Rz/S69dThS6j3bQ//UXlIMArVoJRCwfKQ9OUBSqOUV80fcxTT/RRpizr7X89DNXfAdU4ElBo/TP+WT7SB291o6Y24hTsSf3oXQs2pEJEEwS1KkuOjrG4I9tnG7dR/HxNjsuk1aKonPE4FgJJdZcsJbmnzcau5CLpn1ueQmvtjfw8s3XcXVjHZX5JuqtFpqtKygVSjjaO8SdW7dx56tb6P7+UCKM0ryptk2JCKjrdfv46e4PeP/TT1AI6rIsl47j5UZJiCiBRYQif/DRh/j+2+9w7/6PzOBgE6esTJ7OszbICjf/NPd//vkh59XJ3bG9gsLitQW02228ef0Grm+0sfrGOpovtVBpzADlEMYzfsJPMaFL0YXsB9UpUrVIZS7LOfh/Hv8W8EguXb08HeQsijhXnzwfSKv/rNPB1r3fsPPgITrbO9h/uofDw0N+0NJ9hLVgQYgqNTp+FV6geNJE2fpsukQTd5JOUTkehghpqkQobSqawuF4xBP51uICVtevY/1GG2+98zaW11Ywf3UJKshdKiRuiKSkMbslczwqm1TFguR6BR21pmVV1GpQtu7cHD7+/DNuar/+4kv0dp7AD3wMzmKJx+MHy+TCIvS/HIkGzoL6LJbWXsPjJ9uIkgSVShGnoz7KjQpm5uro7nbg60klx+OQ4VrgsON6PD7LzMYSxy5stBktaXCJqUQsGxOHqmQiT6igk+Y+Ii6ZFqkkM2ozmuGZRg3z83UsLpIUASjSQo8iNoJljb9SmhIsQh0T38esLkbdJSKWY/JIg6sS9ucg34BXVhYw6Oxj92wfZ/1Tvg8qv4BCWWF+bRX10QjduzFOj7oIEHOzKu7Radb0O1pNRAQtAgwIFiQa/ubtb7Dw3rto3Wyj2mzgMHERu5LLnsggTKaxjliwcVpKagoqiRAjyis14eSqT0VxoEjmlyIexDjYfoaoeoxhtY+wUYFXK6MSFhFPHBz2jtHrnvAePx0MEfUjuCcex/gR5b448YzFq6Z+nQeLE5YA0KO+wH65Qp+nNSYNOj1/QifFjJPCJ2nfUQ/7mz/jaOtPTPojBgZcCUDEiPZCmjfcKs0laLleXiEKfAxLVdTWN+CurWFYq2NAz5GYooBD+ZgmOpLqh4qHxuIsSlfqSOk61Nn2qSyg5d1gNf8vODKw2HGyv02V0qkJiRi7VgOEJR9hOcQwPMC4H+GsN0AaJ0himcTyfkx0tFtqTyUtPv0FB53fWMsHOAiZ/rTgIw2IKxPAq1fgjx0ECwrVaILg6S6eklSl07NvlVOHY5mkTd9r5QqlwQgzZlSecpPXXOY1xTvBc1RmYsfnkdZbU34NexTGXNG8j61B11T+wPezezNgRV9RE6Dps8xcdXMjNXodk2FOxbGvDUmVNagiJgAZ/bEcNZQcfUOHp+/EbFCOzBN2kinUGSyg2L9U5APsraWNrNn8z3W5KSGfFGPmxyDCSIZmnqb4nj8y6QEbiSVZHWbqazKz4wYIAvKOJ0luVGbV1FmTdwFLllkmLC3J18HQvY0JommyCCyRmZPDDbxIMNznzFun9k8WA5hmXhmp0pHgSuFhp4MHe3tYXqsxG6XoCKugeWUO1Zmq1HNp/tmV5tjy3UaDxzRSebS5hWudfTRaDT0g1Ew/vW25FtY59BdR42XN5Oo3jSR5emS9CrvX51NYe6IOrYGn1C4xcxR/B9udHRqAoP1PfY8APtNO8rY8gyfOxkxQy7xo/9LgiMEKT7xHbOr+Pw3c8ym41MrjyYvPG5vijUc5GKA/E/2/MUDM+jttUpjqBAC7SVdWg5oBYlrHPvWeSnsl2Elvmg3uWDF6svYCahtgwNe590b/bmTm01p6IwGQPo9jKnUiAZ9jSkDTsiIDeDIz1MjOraae14OuT9OTsqTCXj+R1xkmzqVg2NSak/zb0wN3ebbSelD7ZvaNYTaY982k+ueSAGi/G0CT967j4G8AAAD//4RdyW4cRRj+qrfpGdvj8ZY4C5jEdpxdYTkgJBAnbnDggoR4Hg68ACceAfEMCAUpEiAQCiA5AVsJTpxYnnFm7bXQv1S7xxZyR5EPcWa6q2v5l28JjHZvq44nrQ/a2PwG8vTYRJZFGljUwa+4CfRyA1Itp0H25SaDSIsEhVfdsGy4Htv90KGX25yDELYncRU4VcOsV7p4oqvqKQ0mLUbjUAB8zx5vlsy54OKFX3WiaeMr6XtICdL4wjV3vruOJ2okWR2XKdqrHcxfXsKTX8iiRz4jtgSDJN9EDwkK9Ed97D/bw/W1NYwDYDBJEDaaGCclRrlA+NvxHC5d2cRs5yL2R9v8nCoRUp2jrt8W2QLnkOPlT99jba6Jla0tDFtEyFzAaNhDkSWiTMzu01Zg/VQBtuKfz3unK6Qw1NA/fka+AhivpSksKngYQ4Q4YOXjGjNBgFZSIBoOEDw/wKs/tjF6vIvmYIBZYxFRsSOrHUb2WOSC5wuEGyvQxBKJZ9la8e777+LaO2/h6t3rWCSExUwDrYUFTPISZTSHPhlfvbGAmx99jIP9CX7ofov0+b8MUS5r9AJZI3n1fY/+fIi030PcniEOw5So3+kFJO074njT52zcWcenn3+Cr778HWWacAHEJfwh6zUYCUiIx0ZzgA52pp34XMFX1LW8vzBEe2kR5y9fYA4/wfg3b19n25rl1fNoNJo8/tICMnBONMocZbiyrQVRogB9YgM00w4KJ5NZ/0RKbE/8uzkjQD0rhT7rf5szfuMsxMJZv19HzhyDDetScWbqD6mGS3DiV1x+R+UBB6cFH1qH3S5z95/u7GL/yR7+2X6EF0/3mMM/PHrFvt0ERS6HI8QkbOb7mGFfcm5zKx8ygJdTN7OBSWEQZHLQBHGLN+lhkWJA9A/fwgsamF++iNtbm7j39j3cevMWNreuYa7dEW5WrPw59Sm2mi+4wzQIIhTEmCHRpYn4Q/sEMTGC5rGElIp0LfjamZtp4cMvPmNU0ndff4PtX39DWuZImVdXYjYylX9wte+e8X7+/72VkBHX8CvwcHHjJs7t7uDF7mOmAPlxwLDvpdVFDLqHnOCE1NGIaeXFfB6kSY4s8jBOMimQTRk9yUWiZd5kgBYKzDcj9GlM6DyiRFiRZKX6ZCeQIJk6+5Scz7UbWF5cwOq5ZSx1WmhGtP5TnjlecEwbqK7Sm4It+yqGROcZ7Z+FL7B9Omc4JihyXFrpoLyziXScokdGdn2CoQNdKvouL2L2xk10kgL7D35ElBaiLuHJrkIQT1NBLOXpG4ypKBBkY6xETRzev4/m7mO89t4H6Kxt4CCKcGQLDOhdxobHgo1e2JHCYwpLqUFXoe84YgX7kJ/JaZWGEPHJopdxQcwOC6zYFvLuEP2jHoYHh1zVZVQUwSALUcfwfflLonQugJR6i5U5oUgN6rATjz5gehQxDUpkaY52I0ZMntL9ARZJ4fyoj/LZAV4+/Au9nb8Rq52Up3aN1bOo/Z6o/U/vZCT4Nww9jDpLmL1xG3bjKgadBfSjAClBlEMfGc2LUDZZExqMsiHmFucxc2kBzeV5DPKx7PVqz0fOD7YKsFzC4BTU9MeJBWRR7wA5euHxrsa5krpYhEGMRnwe+SDBoNtjakDRz+DnEtgHhcCFbS5j6z5Duv2ljAVBS1XNXpIS8JnCjoOwUyKJuRbKSi9E0YgRNS2iZII8DtEKG4jKjClJ7oTiuErJUpLIZiKyy8UyKZaTiHAq9gjVjm1rOkzGwfp9QeaUtG9ZsEc6O+JY2p+yCk1q+NzWZ4M91TGloQwicY2ghJfmG8P5VYSNPO1Zj0PnJSmmN/xQ7Xq9SuCMA34jqvkcU6baRKJ4gBoyKubrkn/nAkDFypIbFuLJLoJhBbxCipuW17cI0DG3PsuVSmKZguoup+kE409Byutzh9+BEfSMS/wl6ZGGia/NA08TUUb4kJ1hKS4AVlXL3d7CiRTpMNUg7XxaageTigCOgkifSR1VUvuvPMVJ/DATSgzF0Y2YNESGWjAV6hQ3QGsxyMkEj+1q6c5VnI3QQnvdQ/y8s4176+tY8SIRpwsDzK90cPn1C3jAjhg4JciHKo6TcDF5OUK210N8JceIkEHtJpJyugtsrFEbal2/1fjIeytrzUDiYjvOOtEwCBGask5MWdGGSWDNNQocdVT7+NX6ZzSzOml4yv93yZyjuFVFKAu9D6Eiw3HNCxHDJKq1JKOqH6JAYKZVMUXWVGgU39SRfnI/VEiQ4g7RS1KOc+tzjpG8VcIseyUj5CA5WKnaboyONa4ZJyghy2LreUUvF+i+W8NGO/vywdLTNOyA5d4Gh82+0jccXB4aAyndjRAn3Jl3a0Tt60t10mDNtzQ/VVShPNTx+dl1S6lIjDynUr6KkVIMT2NNIsWtmVZlB0k6ExSTkJbYFG1ExQApN667ccjalaKcNPwEVUTPeDw+WhTS4hrtJWQFTxflV1zMZFVG+Z4kE4eQyXCsjki56G+Egkwg+hjtS3SlKbl50NlPqPqcXUQmkwn+AwAA///cXUtv3FQU/vzOzHjapJNHo6aPtKUtVdpsCkIIVkgI8drwyxB7/gEL+AddINgghBQhpFTqI2nSJtMozWPsGdvX6Dyu7ZlJqQQ7vKwmlcdzfe853/kePi8Sp6yM72RDdCuUkf3HGgiZUPnFDZlM/hjlLPJK28RH5QRNyF5Wp+A6NdLDXzLLOI6NX4wJdCZvIEeMkGmOq9VmBYowVdEPuslYHQZlUY5pbhq+BoT8tKKWIKNtF/HyLGbmOjD7p7xxGSNJv5kmj9JGtrfzHHcLyRSixZFl4lSajjIcuQku+CF6iyu4eHUVuztbPKuYbLLqV1AcjsskwZOHD9lf4NL9uzCkA4xCHJEGyHVqLazvqeZKNxfoWFwqUy5GrNaJNxIqt6kZ0CaB6et6ULM+K0vQcgziwQD+q0OUO3vYJ43l3gFmByliuDrdN1ONmZUCVDocY5CWhvWk6w/W8fFXn+HS2g3El5fgzbaRuiPOVH5dnKDwIi5OT0yKx0+2kB6dwCxfwfmbt/D8oA83T3QNmKoIrsbzZJ74cg/J6RHOFYsCgPwjAOBX03n6VHdhDl988zV++vEHbPz+h0QaKXqXcWa7Iw7q7P3gaz648C/dMGSDszu37+De/XvcwJF+f355Ce35HkCbZ+jpL5vz8y/UxI8LpUq5NrYtjK+NiQftVNkIb7rOlmT8H64m8OE2mn5jKXpjIg4BMslCLHck050hFaXKHez3mbr/7PFTbG/vYHNzE/3dl9h9to1ikLD+low0SZPf8gL0SIpB/l2dQApFXxzr2cXXtRrmkAs23wmZKuxEpPEesfkjubAT4+Pq9ctYe+8B3v/gI1y5toqFpUXMdFw1wWxsCOaM1eDIYS550wEsk84LPHWNy0X4SwUURwfa0bHQpDleKPTx4Zef8rr+/tvvsLmxwfsLqQqKLFEDs/9+NVehHNgBWt0eVq6/g70X20jSBOeJflwUaHc7ODc7y0ALKJe+LFgyRs8sDBxEZJqWORiqaY9x3AoQ5OKIqrIkhZsm6EQhYpJWFEN+f+0AWh4DAQyGJXaklZ2LY6xcvIDZuINuHFE6vVL3zfhDb76drhao9jwzZqxY5IAALr5Kfpa+GvItL80jWbuFX3/+k+lQJ4MMfquNPrEFFhfQXV/neMaj336ByVK0/JDBGMfkY2vAtlGenr0+sQHoHh6leLR/iJVPPsf8jVsIOqFMACmVppGmYhREtEwqu79QAU2NaDVB1KY0dAJhZRQOhq+HeDHcFRNgipQteWbMZxC7KduMaddSaEm77VZTJ4akI19c8X2R20UzZEo4gkcDBZOh5bnoeQ7i3EGLdLn7r5A+3UZ/4y8Uh0fojIxyI/S+m89GqscxBhqVSzml00QzKOYuIL75LvzVVaRzPZyQvxE1rlT4OaLN56LTNRhhhM7SeazcuYaImHjkE0Hnhluv6urcbk51/g1iZhuisga4uJBmBlnAR/q5qId2HON47xD5yQjDwUiiBzkeU2MGVfvfBMvp3+xvLW7gyoax067GpLNUM8aSE38dOb6IUgwbiWeqPdht/AbTV/096NTLjdGidvpctvdRNCaNtqHkWtCYqsmpf2cp/ivdeqVpNbzPWXMudqTPxSOKgCzyr+DJme+LoR+xhgKZyNLQyEZyDbOhNgNiWBd5ETvmG3b0z6pYMiqsm5PbykFdwQbJYbeeVXWCAEc3OrUkwjJr7eTOmvnVhnuSzS5gQ934sL49sLWzO6XXnnrWRny76N2VerfgXH2+d63Tqfm3E+zSMoCtSbeaArInmNK6czVStM+B5Ao83ab6j/auQFKrSvW/YD+Ht7wHNYVfkr2GZY6n/X1sHR9irntRKl2Hkm+6iImx0naRHBsLfY1JMg3KCggpjofoP9nB5fXbCKIZpOSTFSgIIR2qfo/p5zjZvzRp+K56UhhFB2rTQKfymqgnuxOMAlOOUdWzxnvQ9AE4637KSq4nF4Ev4v/wZvo/Awwa7Sgu/dP/J3SvsMyOs+jj9qok2aojp02SKe3M3A6mptqmAWZRb0nASabvOzXJ1syyOj8mHPjftsbRiLqzOn3791ZuY/tHZ2Lvo3u2SSNWQmHZ4vI728/XMXvs+K/eECI/aDT/PFyV3ovkRBYEsN+B2kZmJpAsVN//jNmO47p9NgC1JvhBHSVa79kCUjbNDvmM1iS/5mWTC+jzvB60tz89HcD3PfwNAAD//8xd224bRRj+Zg9e27GdxE2btGmbVEmJGtSqoIIqcQOIC64Qr4EQQn0ZJB6AJ0DiFeAC0asiFHpImmND0jZxvFnbu7Po/2f+9XjjtrRXzEUVO83ueHY9+x++w6ipY2lIJcq3CpfiySiLTQr/VImo1+pceXATeJ5wlhdcB1ZXtNURCkyZw6DOPlZoYVxYSOB5BQSEbQidiyIfMBObQVu9NecQmJERZvBLN5Y7uFvUijC9OIv23DSeH3ZZd0obd2PzEKSHb66w83QDg24XUVhnCgCJ/xH9ljpXMVXlGlNonZvG4soK/rr/B9LkqOgYazeQsQkp7UU17SPrdrH/62+YSvuYe28BG1XSDaOKamj8BqlyrI3dD/d2qOLvWXoDHcnIYMMPakUXOCd4O1XQ6CHiGzA0WR1xQpNrVLVG8/gl0o11HK+tI9nYRqPXh89q94qDokhhpA9XhvtTJTulxKjiYfHmKu589QVWP7mL2aUF+JM19CONE/TwMnkBXTHVvFPfwz562HjexZ9bm8A/MdqEFrl4CYMoQo2qtGlikBruhbKL9+zZHnb3tjG7vPi629euQekNpXBteQnf3buH77/5likdgQ30A6Iu2qCHSlkTEz7mF5axfGOVOdnEzyaLsyvXFlBpTgxPYIsy5sEZMnefHBYGDPcxSBWRDdRnwqjy6/Lj8m0h2iWI6v9slD/df52lKpJMDoGd42T2X80/9aw46NbONif3u0+2sL2+hYdra1w4OtwjGk9s7BypGDnQ3OlvBSGCygRXsmnPCbiartA7iQ2vDaaw45NtGge5GSf63V4XOjvloLk92cLC1ev44O7HuHFrFe9/eBvtS7Ms+ihT1bqkWK7zccThYnBXS3humhS2T9GNXyA5PeK9b6oxg3MXLnIiTdtEUBX2s1kthqFNNnD7y0/xdb+Dn374EQ8fPCDaL44J2qqGidS7DPevzgR6SuHKwiI2H83j2eZjTuipQ1JvpCzmlMQx8wZpfwqVz8J4aS1COsiQ9gcQY43iXlGGq82UiDiB7vVRr0aYrE3AyytIslEbp9xL4dXAorQX2tM432pgutlASIEq8+DJrz+1IkAy5fHXYhgUBcVc6GL6FolmlNoM5I+E5KgzcPnyHK7eOMajv3eQez46HBxWmK7Qmm2j9tEd9LodJI8fI4tPWERWWUs7SbxSe4dzkkcwRGXKXEQ9i45OsPnLz6guXcf855/Bm5xAR1XR8Tyc5soWD4cQancdB54EzkNBUynKmyDGdHcMBdA8t8m6kbnyRLMQ1Tc1dMeAFBocqyi/YuHSQc7fqzpZ12UhUybIAYPAua1+gsrBMdTeAbZ+v48XTzbhEbqOE4M3k59y6zrGvaOwihPCUEzPYubmLQxmZtBvNNFlnEdg9AiK1c1sgbfPKBlyrpiaO48+etyJ9p045Ox9cRaZ8m7D2QGdao8X+QgQYdJvo9dJEMQ9JMcxsnjA5R1t4yvT7pOM315Tbfmi2lAM3JnnWakAwK9SFrFUfLP1GcVCLjfjIOjjhqApZTVyyxs3zlGeDerHH8tFeEESa0I7BEOkacHvL3QEpEOoCpi6sWxLEflBkZDT7yLh4qcmuaekIGAHoKxIfN1BsHxS62fRLQr4SbndCnCNJDbCuVVGiZuCbHIq6FtnAvn/os4d2p/pd77nFSJ+uS0CiVAfbOfyVRQASZ6yIpZ+Ddd+zPtyTPezi3UazVcoFAU0HMZtyyjVp4yoJNQG24fzcUJLOTLXkmhqA+pAesZVyh1j+fEj1p3Euw6Ro4en+/vYPTzESnMGobVqbDSbXEAn/ajDoyOOzcsu0IJmpjs7iQc42N5F5+A5Gu15e5+qgpyg8rcLr9zrL93dcWo1bqLpbhsFisPCxxlJYMVwhfosfHzxhC8fc5iHDX3+5buGEo2bO/NvEPeV5Fho3iJ+7J7XvffJ5p1pM4HPThnVen3scY1gIUw32vrMUh4Z8uuUczkRspPinS53wrUegbWXKUfyPh1vSFfXnIvKOhkb0PEUD5mTS/kR9I3Y6cn5WXXf5pnSoeciAcMDHcFSK1BY/ubKeWmvMO4lZl9irRGLhKd5lJEKIgTqJvtSzOBCgbNvcJGH820qEmZMn6yTjWKajjhQmP14AKUC/AsAAP//1F3bbhtVFF1zs2MndZI2CrlB0gZEFBpIKWpBSDylD/QV8TVU4hcKiF9BQgh46Q8gBEpMUhTSBsWx09iOHc94Zg7ae589HrtpS1FfGMlylNiTozNnzuzLuvi6sVJ1hh+HyWDoslBN9iV9eWMq/JBknCTu7nNVYniC85PLfAWnwHC32FY6U2vJp4vBZx9gN3MCyNTkczYPo1Uqvhg2aNG/kV2McDZkc2VYdz/nwUqT7TnokpgDddeKQOHKOIrTE+yJ7/aFo+fYIEmUEoFmrYbzVhOXlqbRSixsirgzcYpOP0Lt5AmmZ2axev0dXF5cwN977VwQkxMPsg97CnwJWuWmIQqnJzh88ACVzilmb6zxGLvE/2AYTIw0jqwAUCzKxQzj0XO7Ak6nqlcuRWd1XBb/ogTXQSXw4JH4WOsMTqOBBsHp9w9g6ie47AYMt+Sr7tngzor+YMTf31O+Hwn8zc7g47tbWPvkNpZubcCZmcK57yDyL0k8hAAAIABJREFUY/SSEKHTQ8+N2e+15zg4Q4CDNMIvjToedyOMxUbUUEslpD5Zn3QzHu/oYRjG10Xt+FCizZfoYDKU03Jw7tz9FF98eQ/f3r+Pk9oRQ8xIB4F8wK+urODm+5v44MOPsPzWOpZW3mQuLChBSUghuMzijp6SD1xVkhL8dprQ+iqyn7sm/Pr+32z0XtTl//+iAF5W22D082EUo9VqoV6vo33axB+7u3i4t4ed6g4atWN0jpvonJ5xd5+56Z6LceNgzC8zFJSa6SIYJ/tJwN11gYZSMaBSrrDIJ9ntdMMQYa/L9pP04AvGSnh34yY23ruB65tEAXmbNS8wXlTlSj4nJWvEd45ZCBCsPeFZ5XE+ntlGlAJfr91FtbqH7e3f8NPPP2B3bxuPDndZd+Dayhq++vobrG9sws/8YVUPQGyr6E71J6/gzmefo93u4MfvvsfuXhXzK9fwnP7MKzhclCemsLi8yvopiHrwiCIW+BirlDDRnUS7nlorrMTa2VgUAPmuUwE5RaZ8Du1oUwGgF7IDytzkJRSnKggDh+kN+QclJfflSwFrCxBSgOg8BfKqY/V98S9PnOHpf6pe6D17foQG4jJNQPm/jhFVfwpDyxMFrK2vsija/s4jxG4RncjgPOqh7RexvDiPmVu30TBAu7oN9Lus9F5w7ZhG4eQaDNnA3CQ9jHdChNXf8WuzjtWtLZSX32DIctNxcW5hu3mEg2uQBezaOdYO2rBYovB6GZpsgw0SFyOotpNN1KCcmVnu8ZxkEAAWuBMxRSOUqn4fJaQouw4mPR9B4wmjz1rVh2ju7nPyX2LIo93ac13yiw4de8JFDY8T/cLSCipra4jn5tAOPHQoAPJSOOWAO93ZI5OSN7K5RYTp+dcx+do0I4dofTpJmnXT0xfSqF7NIfbpAndngAW5MRTLcEtFFHsJxsoltI+biAhmTbFJZBM6TSwYASg2bXo9/HRwXY0VS848pY0UbiRVjDhgd6n4bhKLLrg4Q0qf87QxNoaUYNnNoWU0DrTr0GZ9HBMGBUt9ynf+7P1uBqQ2TVrzYnaJGRS4KF6iNUrCrJSwhufnvH61a0v0IEo88gKGUtgqWjFCQbZqt0z/P3X/ST+FuuW0R1Hcy8E5CQD6A3VwSv4pMQxy4ohCuVQh7JQ76JqAKu8f2vWzhRtJhgbdUJO7t3Q+lYOsEGr+nCuIpDyNkMZOyQC53dB5KRlgGzl6vhX8TMxMNQI8S+XMvk9CiL7PMRcVOMKwnwl203yHVhiNu7ssWgLm68veMkLXGOl0ypodVumhRI4ol+24j7/qNZwuLKDk0++kuUhiuXQfxGjCSlxfuA65EGAMjv48QPPxESpXFwU5QHPu2cL7v9S/ySekGac8FaHIvu0WZ8m9bZhS8S3qjxSkM774QLiuHw+KAPSuhRgVoEwt6o11Kqx4Jb9MmiXImsOljoqfu5bOkvAaC6wLhlhGDl8TUYT3ssKBmDMMPuOOFAHUr58TT8/LXC6oYOWxt/xAa03nTH8maP3ZWUfWjkWa81qy6v3JBetDm9BKa3FGKj6qP8AUCUL62MRdO/jDaAxJwNlOkzUEBM4vibZYAOp1Eb4+XRtLoWEUEN3/QknS/y20quGx0fxpQWJorIqysfsLN8WJapKbX/2ZNA7kZHLupwuoEnPQNsDuJFRAGtFvoPEnRlwNBs4jtH5FBNkYg3+ou5beuKko/Pn6MRlPE9rQhjSAIG0JBNEWVKlUQoUFLNgjVixZICFW7FkgfgsCJP5IoaISohBBk0yetEnTZtLJeDz2vUbn3HOvPUnpgq6YrqLpyPb165zzvVgCUAhK73bATRfdx01ErAmfXTBHBQlEt0EPBztdtFOSZhyL183IhU4PHfqbzK7YpVmyLV3T34wB9HQZpj/Fnu7vJkbWJCHkyQdtjya48PEyuqZ2qEBiCXVNSWFamIFRFUakTZyM8dzCC+jeWkKVWxM2mmLarFvrzFxkGTaXl3HppXNccJfGmTtU0PkIRcdgFCjMnJvHW9evY4cQ7pwu/kKUQIaNmPj0BlZjGjMNvUKuh3hmUODBTzdgdv/GzLVr6M900KNCLowxaikURE1gtEniTATJoUKekRBqywk1TEJuYNRQo2UCtOhFezhAst9DvraJwcYWyvu7UP0DpGWOmNZX5/JiqZje5rQ8SnxTCKTnxlxLEZAoXHjnKq58+AFefe8q0rkzyNsRO7lmpuLhykG2zyhcOyXNZQhSVd41OVbv51jeus9AvyoCzrZWYctmAj8o7Jrg+If2JxsY9A72AJIKRO0ngpfBEYC1IpoTGVZNncCnX3yGK2+/gVu/3GRXd6L3X7p4GbOzz+PU2Vmxtp0YK0CjqOUNcIwrkBoxHiqoXf3/G6ra0MtV9bhg/KHoih6FOrs+OPb7/8unFkYEjDw511h+LsnUl0wYiS5F9y4xQKjp3+iuo7uygvXVDWyvbWDv3g56u3ts6ldmub1uw4QjNuMkZdM5kw85lo+KwZgac2MbK6Y9xxb9f3Q4YELNqNDcLhKCf3JmGpcXLuD8a4t45fVFjuQjdJv0/szNjy01l5p+Pj2VIBHGNms03Gb9q7JmYzoQ2qPXytpriXS1D/f3sb62jjtLv2Fl6Xfc+WMJ3dUtbG1vsbkUM3+U5svz5o2f8c3XX+Hb735gs0/WXbIRYGUFskHipQFBmuKjz7/E+x9/wq7tVEhNTE/7QYPT0D3d56jcKcLZF1/G1noXextdpFHI3h2dbIrjEvsPezZdhppz8gIgRtFoiDIfIgtcIkd9H/hkjmyEw51dtKsMU9Nn+NlIhed4M2t44MBRUsTgCrQYARnfBEbBODPs2ADgX0xGeTuKrUGFgWXvuyRueckCFafn506zcStdY+vdHaamVwObbUwsq9n5ObTNRX5RHy7/hRPJBMqszwi00rWpnaN1lzzetf8iG9yKgLKg723i9o/f49y71zFz6U3Ez07jAb03InsZkK6aigRmuDSjppwHQKi81ttIXC4fUWX8Y4zdvcEXtEWWooYus3LvCcXfkRsFv+cixUaUOh/gZJRgUmu0SYNIg2ait6+sYvvX29hf20Zcapxwr0UHsD7hWuThBRSzfug6G8YpJi4soLOwiPz0GdwtCwyo6aM1TDQ4/4aanVaCvBhY92RkSGdOYW5+DlEnZsM8OldGtKT0ng0fsxdV3ZWN//2UH63gkTha34LqpHbAWtdOaxLpZIqiP0D/4SMMDzKow4Dzwel5RwV/SlnRw5wR75AFiPYE61JLITleJBLDiM5dKw5B3MGIkCEyKY0ThHrUSDxwh2uPl5rkkZiPWTmuZsZhHcNp89IDqhmJiQAjNSA1jYVtOCKbpKHFVHokoBAjYbT2hIw1aP9GzLeMgEHeU8EnIQljVYkZn6B77reEXpIMgPXxknplj6lGHl0DRfcD7e/U1BRLXdmVX9VSIPqeB/ySUsDoJsVhSxIBpNmIxazM1Qyu4aD6lGodaqxZyiq1cXmkaYBH/OCTn6yxtqNr4xji6Aem4gtQOcaA+GZwvVAFktcfSk1nuGm1QwDHqjCM/hvZHlOmSzsccg1cLIQzW2fZberAcmt4AOiGjo+JAXfJS6rp6CN+Ar1Rjj831zBYXIRKUqtNb08w+j8x2fGyAW58xyQqcn6g0FIGpjfEAdWZ/RwmDb00w26/Etms/TtUaHxvn5GluLCHks/vovx8xJ0ws5xDvEtHa8qRWRPO8eqZ72ECMdQLZBAXi1F6SQMWGkKFdrQRiWM8ezB4inngPRbpnidZC4QFU8LRwEPxf7KeDpHUUR4MlYQ22hcyueRmMnn8oHWM+SJS61Do9iEj2UWd9qbHoxM5ai6yMgSS1HrJSKllzRSzyvIy98yI5jY5+77R2B6l84/vp+EBhGJT4OP77pjoli1Oa2qjGXko5uQqYv7r/r+7b/nYWX5YSzjoPBGgdHTfaI2ygZXKuGbfHYtjerjfszUYs6RqVhavm7YDCe5ztWU5OHDeDSjtsECo/Y19dLJOHnLScIDWnjxW2MvM9dAGAPAPAAAA///MXdtP21YY//nYjp0SLqEMClQqqJvaVevE1Be0TWunTepfvb32bZOmPXSACmQI2tEQ4hDHcWyf6fu+c2wnwNRVmjQ/ECkJji/nHH+X38WbhbfZxN/uUJvKrFVYzQ3M0nLsC8P3Kkrel6idEj3gto0XlVy+z0IiZJdn1BYLff2BUx+suJYMiVepVKAqzkd5wz2vpiqbM4wJpnrJnBgKYoizQZWYQEMt+giXQ4yihB9IvrVZEi1Q5owe7e1h58X3aDSaCMOcuyzjZILQ8zEYJYiSMTZXlvHVt9/gt1evcPzH7wLbRArS9leWq6srETVapgPiHLN6CRAdd3AaxWg+2cHC+iYad9uIihTFfBMpVXIhFUE3t1AUCdQC7l5MgNEELj2YrsZoJCnG3R7it+/QPTqB14ugIkr8J+LFDM3cP76uxhhfGYQBBdts1cVVPxFfUfMB2ptrePbDCzz+8TkWnzzEMHDw1h0jGvZxlaeICVqpSPVZI3SIyuCxrVHsuDgeDPD68AxJTHaHLtv/jYl3b2B608vQLHpCtuFwgEKn/ypfKfegJFAlmP7Od8+x8/WuvO+F5iFrYazKyplUC3rt6D7kt2c7/rOB4m2QY5QLkOWEaQM21ubYCBOS8YNO5kCAQo//cX//t82pFTkEPFFxHekN6jxSF4eqxr3eBc5OTrmzf3LU4S7/exKsvOyzHR/ZWlFXt0Hdfe2wMJ/torLOVlawvafvhwgcEdVssLczWYWlPP/JPYQC6cZiC+3lJaw/2MKz3V1sbm3jiy+for26Jok+LayEJvIrVVhdeXSJ2rBpxrNtFvsNyxt5RpX4BruI0PpDIj4XvS6ODg/ZZvDg4AB7+/vodDr4689jBFmCnIKCCdBqLXAit9ReYJfP/ihCP6MuWoJ+v4v26sa1mlNRrzGIZDGW7t1n94lyEH+AGu3HbNpQkpqtRaze20D//B1GaYyA1rpmE2FrDh5xtTNtlPQVMiXCOkHoIqQCTE5iZU7JwLbMYrJeHHTfo4gjzLkZGpTY+U6ZvAFWSDEzZmaOqYPUggn+604hAMpu45SY6i3z06DDVO0/HdS84R3izkdYW5nDZ48eYJgV6J4P+D7oFOglMetVrG9voO0UuHBznO3v4a7roTHJEVACrVmvVaDVQJmM2keICPfmUJOc1/Kjn37Gnc4ptl++RLCyjNhXuMgSFuDjTmsmriOuOT97jrOnWjLfax/YppmqF0VssGQcc4hOYb0AWEQzGSGEj6bjok3B52CIRv8KWfcSwzeHOPvlV6jeFdv/EULDnmdew7LcdhsIUUP8aq3mMFA+Wp8+Qvj4c8Qra4hIVIsK+8lA6rgcLE8ErlmkmGQjFIR5b/vYfHgfqklxQC56SLXr8l/iY2a3Eh/oVCdNiJCcu3sOWwdT7OSHPoKFlogFdvuI+1esf0EK9XGeiK6FZ9ABhVtCn9nGsqgXABT0pJDCWS5WjAVRcoqU4zxutNTIVxX+7+NpD8loxPajPgt5FWVQzEksWU76AvVNDGSVBKap+AFmJ6QcrzE1o5y006OjqMGiuVFlIPz0GlCMaCgB4vdtZq5yywTJ6lfZV0r+We3fJOisf+XkZVfTUg1Qg2dbKiwH8Lo6Lpimk8ShFZeedKpo7RKVeIFJE0fXNrFsskjxbV04UGsbqymhK1AXsxQp1SUygJENeWZQD94U59m1XUtzzMo0AGG6tDZRomIKw4gNNYHP2605blkwpqckk1Y30WamN8eIWRelSK/iZJKKqNrN0Tk/x/llD1t3FtCg4jZceGETXjNg/RwugJbDudY0tEUADaTDMTqv32B99ynmP1ngNaOYdSjQwrui+JQafhZpTteTKA3i514p+MPkD5wXOdOIZBhlfC4ksEaAkBIycx2BSr3dqrHT9znRJScUsggujBCkuQ+Wtx1SY4nnxlgcI0aC3pgYpIHPKvzTBaTZe0C/LRQYUe2n32fUhaOqznltvNLcycz+PeN4YVEqMAgTm18JN90vdWHkYkzHFTbxtALxdhyTdsz0uK7g/bNbqQ2m3PKe0DzJsko/QSn3xphGkmHPFCbMIZqxT00CKWDIfGMNAWb2Vq4XlsJutR7qx2xh+Tw+TJJuae83IQLsxrm2SeQtosKiEhzKrW9E0sh8qdsE8mdWt89cf3ucdC40Y6ZoFgD+BgAA//+8XUtvE1cU/u6MZzx+ESeAlRAIL9GKpqqoukSqhFh12e674y/1F/SPdN19VQiUJG0AxySxYxuPPc/qnHvunetgKBt6s0pkxZ7xvWfO43vUSun25479hGvRYOIrw014g4aWY+EW60YcMJXNTIHzQ0uJ5QMdCtNc0BfxiZwzhy9igh13fW3RpFYKYxgagefQBfi0K1FXjBRam11s7Gzi6OiALXi48PI01EKJkN7rl/s4O3mLSzfvwo8XqLMQIj1UaGqlMBieotNu4srNbfzw04/49ZfXmIxPWaCM4acOZNKXNDSVv5E6cou46LMEjUUf4+PfoNZ7KK9dxdbODRSX1xE3A8yDGmJVoh41uXlAvFayUYrKGIgXyGcTeHGM8asjTI9PEA/P4JPS/yxBSJ1MCqe0KajALDK7mWtK+5QWMtEJJLh7uQcvCtG+1sO9h99h9/FDXLp/C9mVNTz3ErwrM5zHC5zlcy7+U5oIeEDbi9AmOCqBbzMfQ6R4cTLC+XBEaSEncEGYM1RUmW6ydPSV8t6HwUqxSAiAoliICr67b1anbK7+gi2KxDMi9wzfzdfTXEemkbmucD6HSczsAOhzTtwLmU4YsRyx6OFAXeOpOPEePaVtd9h606IR/s/U9dPX8uPootiTQhLHXGkMBgOegh/u72Pv6TMc/PUS/eNjzEZTTM7H2g2EVFqDCGGi3TA7URNlmulkgWBUpYJP90Ts94j3zScwLZDMF1CNCHGWoAx9bFzfwubtHdz7Zhd3vr6P7Xt3sHntOta6V2XDLJciJXVUHT4ld3GhjToEgceLPOJLkFXPlP3vCalwcnyC588O8Pf+KxwcHmIwOEb/TZ+nQRSwp5OJbqDy5DhDt91kF4FOs4V8NsZ8fIZWu4ab2z18//hL/PzkCdY31vRN8FT1cBCaNqMNlMQvc7DZ3D6z/uGfb9UQNTvYvLGDfw5eYNIf8bSj3mqg1emg0WqxSBUhP8htoSAeWz1DI6MpbYnJPOPYY3jmhOIg65oiyVnEcTo6RU/lmpsvExsLc6cf37hAmCnhMkrA0xtvCcJulleuwNNI4rNEG5Dmiptr6c+Q8UaIWk3sXO+hDOr4/Y/nmJ6co5jljAqbocSrJMXGjS6awQOeSo/3D3GVvr/5DMLaQ2IQInJujJibUbAm+9Q2CZWVwPTPp3h69BpfPHqErd1d1NsR3qoUia8laVNKMowXiSle3IMpUONSLf99KaJ4JkewbRS+5sgPuRFB+hoh/Y4AnRxokir4cMxw/9HeAYZ7L3D2ch9hkbP2QchyyOLgAK1RoDntH45j1IyekKvQWoTuV9/C37mLcfcy3gUh3hUpP1uQlAznJ8eXMglRNOirChDWgbwZYP12D61elxVEqHmkJBHNnb7z54qkJrHHKq0aER1mtWqlLdkI4ptRMkq6MlHA6JaNjUtojGdoT2dYjKdIRhOmO5EytJfkCEqfG0jmiC8JpomCd1BqceCQnRZ00nlx8v/BayjfdyFkBxbngNgJPSX+Ud1OyagoL+uVJZ+2zUvtwGdVDmc4rxWn9+J7K9sAoKLel8KKCthZPBO6l8c5qi5wlxNozyk8rH95USXURtOKUbE1I9JXTe6qYkKECQXCDSlSuNDLPCu6TUUiXTdD8cVujIoyDdEtLCdci71d9Pj572Vj3EeWQcWuKtiNQ4KBYhuXFFt0FYUU8vr5wjaL5JBADQuvonGsXoVM/4mKpQcvNRJgXMy50XE6meDoTR8PNrc57rLNN03XzTSbFfY/QtGit10Aw/4A56dDRIstKKuR8/5iWjCfSV3w8nd14bNX96kQVXW1RNdocC2Qc6GpNSAknmS57BflcL+1gF/AOhGpno67zQQP4mRkbC1TeLXqeyrKipIAKW5dlIVFEjlL8+R93mOlI1qnY1HlM28OlhHD5GsQRDccOk7uiuBxfVg5v6363g0ChsXg/cr1zf5fZxihaTPyfHH4/0sQfIviIURCVdeZ81IKakiJu4ax9IPEX9v4k/turALN+5PWk9GvM/dYC9krbg6RU5uF65s9wy5LhAzS5yQKIyuAbxT/l/aUg3Ki15h6mO+5M/VncU0p+E0TwNUk4NevGDjq+2HuiTTv6PUA/gUAAP//rF1bbxtFFP724rWdOEnt3ghtadVSEgVQQwulPPShEg/wL+GVX9C/gcRDg5Cbm9IQsBPvrq+7M4vOZdbrxFR96EqulTT2rmfHZ+ac811CVBJ+BFcDQFEqD2qFg5X3awrbVDE/5a1IhXHuUUrVIhIIrFbICuVUuWSf38dVcYxdgIH4Gly5Esz2BlLJpCpTyf1gtV7h0gg3pig9UQXqlZdfKgqwDgIDFQ5j6TBaVFEgI//h9hqat9oown2ixem2S4JcCLH1mYxTvDs6xO2Hj7HWbGJsdIyYz+8jmWQYDEdY77Sx+/Il85N/++VX5NlQEQVqo6LvXTjrEmkaMQeyQSifjHz5x5idvUN6doJ4/y2m6y3Y9ga8axvwidvja4XfikjgJB4gT4eYDc5h0gQRCV7NcrRIANWr2iUpjLwEH88PxwtlsSiqOPoeOpu3cP3RA+z+/AqbuzuYdFZw3PDRz2KMQh+94QVsPcQosGz5RUk1bSTIdoWWLUIATI2PveNTdA9PkVMDle4AFZNyefYyI04FS/gurv9Ad4y8sWejIXPFvCWyesuOyyx5W9rrNRD4RrX+VdSjLBdIJdu98D1abZeO6pkuX11Rnh8LElzzo0K+wXScIklj9Ho9hr3To/9PnzcMFGy2tnewvbXFiVR1rOYj9/GOZePsXTmTvfRcPS5dDQUxY5AmKc57PU58D97u4/jwEHtv9nB6coK/T07595TYU9yok7q8EUEysimNuGMSITNT1G0osCwVumQBUU/2svSYWYMBCTw1G2i2W9jYvI2nO9u4/8Xn+PLpE9x5+ACde3cE5ULWfkyoKdhORb75KjhIXQISkyLqD/KF+83+tzbHOEkQxxfoHnfZC3/vj99xcriPo+4Rznvn6J8NMBnOGH0UKEyUoe0EtyRdlMkMNzodeNmUuf7j6QCD9AJhPcR3P7zAjz+9wpNvd/H18+fEZ5E7URlyX9XznQSYAwDwkRM3bKpevd6Sb8fHOzjGWqB17To2732G+N8zjHOB0zZW62i2GpiORtzO9Qp1NGWQRYiVBi2exPcXGDZBIGtRHTPqUhqDaZpi2Osx57cwAQfoIHSJqSJMPC0AFLKWBB7Ue3pRvKyoaAF8SDxxsWCZfIOn/uts9VVYzEwC32/izqcdbJm7+PMvi+SkB1snu8McWVDAhAHWbm7gxotvMG420H+zhzaJ2mZsRFtqrHuuv+VyKo2VUqQFGr7w7KdxjIPXrxEdHGDz+2e4d/cTxF6BxAsxgiDeuKMfvP/eV1XIBVYcMKIFDo3A622BkCzCigIrQc62hYRmWzUGrckU4TAB0hEu9o/Qf9NF0t1HSEmrWgRaVXOPAhFEKq7cBF8l+2SDQ8YX9BhGPkbrG7j57CmC+49wXmtiQDOuVjAcPZuNVHkz56JiPgu4w0fnrDVDtG6s4i4V1RXOa1kkLlIqw8dBxRDyz6mdf6j+S3newomcCaWEJu+k7Bz7vGmg+7cSrePazTajl6gIMIoTxOcXGPcS2NQwnZGKntKx1K4i/2t1k+yxTW7IDjgGgRFnDFda9ysx3RU6r86Zamy/Op/cZ2IesdJIo6agRCnxInu+1ZVVUUFXtxVO+LQLDU06ZK6gsk8sFhIGVDbzjtfsvPppvaSuaSMMyj2rQIIFkgxV0+Z9paJk3GupOBTR6ylRD0KF7Tc4UZ1vsgVG70QIwQWlQLzy9RpnSkFwMGIH5efvAVvUuiZbxutartZw/PA1+XEAI03wBH1rF6DX5fzTYgYnH8aWtFm/pNbOqRCMDFDLQDgOsXqH0/uzdk1oy8I3Uwa0N2KUhhr4njpriC7Xci+I6sRwNqs6q3KjdmkRRibDaTzAhHjQjhbirjOX80b/+8aWgzPtFScXCU67B7j91WMEa3VZ3yExlKOfCibyGFZocC6h5kJSKIi9crY79AhRfytz240N3UMRgHSJoGXLPXF98Mtn1mXI5tZt4lpRKz3xaX5J91g617TbpZ/7/T5rUkg3W66L0QAmf2/cYuV3hcHzvsOakhfvCl4lxVWTSzofVHB9YW7p3pgT6VByM5f4F6pREASLRN4qPQKVuFDVWaj+7GtzZbE45YoilqnX7m+cWL18zhqfi+gN0AKa08BwY8aICS3YUeHO0dzddYlexpz2w0UGomVpEYDv1SWNIFcooBhB1HK6RhH9k899ZT2txK9C/79aGHbj5QpwDCpxexa39mthTtBHi/eotDpU4UUZK30/38d/AAAA//+UXetuVFUYXXufufbGUIoQLaWAXIyoUSBG8Q0Un05/+BQ8gM/gDxJF5NIWSssUWjrTuZz73ua77DOnrdE4SUMyaYbOOfvs/X1rrW+tBjvG1pj/KrahVh3xBVNUrHDSZJMsKyA5PAJQOkZYw5wU/XEUkxdAAlrgtGCbOgNCdTN5B9S/YJCy2JrRA+cmOpnRzXR+olSZi9zU2c2x0SxnNrxHoIHRiBZayBz9UpshIwDAak4rMWWd5R5WLq/jWeN3ggSq5dZ0M/ObGBme//EIn9+7x4cvm8LYDo8ypFmOEbHhkxxL3QIXyCDvwQOMJgl+ffgQWTxAh42IUr6ZTS0iG8qgMHLNOc4X9GgBAAAgAElEQVQSy0MHAkm750keOxoiGY+Q7e0hZdMVy/cDTkx/qIVtcBKWw5wPdKTIZcIuHFVztbPm/5jc0mhqOj0UxDSsLOHKnS9w7ZsvcfGzW+isX0KfCi/rMHQFDo3FKEvZqJAaLELcE5fKIa/zeAk3ShEODkfY3z2EjwVdcAzoxBzrFeWOCxiXTiVTXHMvjcoOrdq9NCnkKvfANIan2J1TkybHi49QqM+WszqSIuTyq/uqTsCGIs0E+b+vqWDM6c8/fbi540ADr1HZVErOJC/0O0kpX0DWIL03iccYH42wv/eWme+/Hj/Bxotn2N7awrMnTzGejJEkGehRZLRWmeYffvweP//yE5Z6Z9Gwbb2froJN/h0E+O/Gr66cCNfIK/pIRVIkq7dW4NL/nvP4QkZrnAyI9PJTQUMM/t7eHpv0ve3vYXtjE/2dPjaev8DRwSGS0RijwVjug6K01BzM22ZlztWl7GqSaZUN7gZ84jkfvm1acHmGNhkc5SkmecqyfZrjp7jGKzeu49qtG7h87Squ3ryOC2trLCmkiEdypEeDZs4y/qE4KMv6mrwyw7S2xUi+3OUCuR9jGh9hcPAeOy+3sLP9Gv3tV9jd2cbr7V1svtzG4fuBAFYF0PAy8kR/Z68zz+aCXXWKpuKp1enCzM8JABfHvGkvL5/DzdWPcOfre7j73bdY+/gy1m/e4EV9jBOqCkAZR+BG5hSrI0gmPU8ckVhqDrlmBJuw9tkl+/Qa+H8vq47kxMTN4dzqGuzTx8iOUomhsx6LZ3uYHE2Qj+VALulakNEiqZtaFgudJuJ0CpmwMGyoR69OZDAajjB48xZ+mqK5NI/USDPJe15ISvEhtk9oUKvyVF8doicQc4gEfFZw6L4c0mfC71mJujI1htor04Nw8Kr8k0hlkpc3bIxLF88gK5axaTOMh8TSGuSJwTClAbEWMixg5e5tRPMdHDz6E/nBFGe8eD4QOxtxgVqKF4xWsNKPK9tDLCMBvWWORpZj8vg3bLx8gt4nt7F+/z5GZ5fxjiSMzXkkkUdSxvrdZhul0YLYW1uZDTE7r0EnLMXlyyjquDli+12BRpxihQrMNGHfjdZoguabdxhsbKC/uYVRfx82ztkDoK07BitE2awQVf64NcH/ReDdNkMgdO6mKIxFEgHjyKF1aRXLn36FcnUNk3aLPSMKNsZP+P7SERJ153jOv1FQ05CgKImBc+j2FvHh5VVWo0wJYHM5n6XLrZZIS6loN0YlvqdBkqoodCc9L46vJwazfRgPMZXSMTohUTW+VgzXlUY19j6oPxAy/Vnmn+mMt6fkTXQ+mEP7fBeLaQ/JYAIMc0z3x4iHI1bdsSmUmxlS2YbhOV6+52kJH5O5pkRRRjVjPodZw2SZGczZwJnNAjlm2LAygc6cqPJy8izbrz9P9C8x3j6w6VaVPVQL+BwLCwuIs7hyhg8FO7Q5NPbkaSQvnlGnIh61yD2PKuO+w3WfGpeR7aM2d1ZZusDqN9stMToj1g9Q019b7Y/tdlOztiMk6VRd7E1Vg1klZJzWyS52FVlFOfLBoZ3UXgQot3i9kZ+AMIdgD9oG1wpkuMcCVSN7EMnteWSCDhLnVJqsWepU6wV5JMSMdBZRx1ne1fMVKTpamUHWGzAjDS2zzZGk3+QKmgm7a2uBmOCRAwGn1C+lNDxmV/ghq4EJWPKYqRiPuxVIBWqdrSopVruo4jJ1Bq/2B9gdjnF+pQdyRyWiKB7H/ImNYwGhgR6S5K7wPu0H6bTApH+A4v0Ruott5C0B8xvsABzqXm0yjYBiPJ8Pbe5pT8lKXpOcYOaKShYuGfhyzs21JRKd+wFerwUbsmZlVvm2dFrtKibO6hhWyPmHAgfsY8EGCpaz3lnpEEhSWrtJWo1wFK6stu7iH9hlcwIUokeTiBOq2lzp2Ww0jNg4HdvzOvJKhq90PTJVM5B/CrPIYQ+oRfgFZr9UgIl+ZL1IRC6nYRlfAVJQVp+eq+AbUGe+Z/tFUJn5Y4qgoJJpc3RioUC4YQ8NdsOn51tH1kpNOGBDWy8En2BJwUlCgIaQyBG+E/emhAoTgMaPuOfPpfdYVUDPB4F0RGhzzeQ5pSl4iMjncPYfH2rsv8FHrTTl9KK1Qz4irDZQIIjOhsqYM4zrcLqQXO+QCsVsvpdxBQZfKNmtSyOV8rwJmNRiYJu9SHRfEl+JEgYef5N2bb1RlGH4+eabme6hDYUCLW3TegDhRuON4R5DEO+5MNG/55WJN5r4F0wM0SAGJQZaKKXQum13Z3bnbN7DNzuzrRTDJISy2Q47O4fvfZ/3OfiFIq2eN8V5jZnaLhk1/KPJEyFgTjflUE+eFhP6ErQ1+vWHVPMRzhvVv8uGRl+iXsQAsGk8CKW4lLkslo4CQq85Yw00JjA1NaKONBH0yRVkUPqJ33A5ddFFot/1ODah6nTQWzqPedJPHu/VDXpb/Zbj8R8Psb+7i5XrF1BkAeIJLRp0AeTIsgrjOMVRNMHihXPor63i9r178GyIn777FqPxgJFJa6aO+nByXC4S3FhePbrpBBYlckKhuWk0KNCOeTltDk6vFRqRVDYaYdMw2CuUbUAXM+mjqLemeLOFi0tYvvY+Pv7yFuavrqN3dQNRP8CONRhVOcZ5jriqEBsPkTVICaCh6zTLUPoGme9zBA8Zj0X0UEhT7B0eI4oSFJOczQ8JraJCv6JUgqjg+EFKOpgqXGdRv7JuNdnfgG6Mqmi/7Q1bk/745t/xpq3sGfs+q31mAy7SZTaQN5kck+9Bguh4iMFggJ2dHW6Af71/H48f/YmHD35HNBwiHZdcbNeoX45GcSaxMT98/yO+uHsHX33zNaoA9SJdNq6td9kckUzJf3WTyFRMfiXnRshTahwv+BpvR7Tu8STG/qsD7O2+xItnz7H7fAdbT7Y5m//Z1jZP/ynnuuDoL49/ZyHsS+ETGJal0IJI594SjSUT0K5ijZaHTrcLa2RaP07EKLDTC7G6vI7Lmxv44PpHGuH4Hi6tXkF/+ZJoFal4UdIUlx20WNNnt4EmPFj2WRCnV3nOxfERF9Kk0afJ/tPtR9h++oT/0LHROaOin8z66BuLRwX6nQ4XUj0yM6KcddKsez4/rKmJ6vQCGKW+jhXVX1lZwfrGJm7fuYvV9TV8dvMmuhcWpfEkl2XPr+951+A2l/ppvv/sBayNrOqKmfLs6MH1PVdyvFNRjuvn+LttHkem9s8tYnF5GS8GByC+yny3h7luylKAiBdW0cgSWu4HFJ1l0AkrNpFLkpwd3Os7tJKpNzWW1WgCy4kBYiJ2GnW9bBQVaMl2XOE7c9+6f5+CfDS12v8FrlWqv6CGhemxRuj5C3MW62tL7Eq/9WwPk4OI/SDIVyLtAcehhRcGuOxdw1K3h+TB3zh8+QphmaJLUTWqwQyUZeA1aEnCfpPrgK5Bm4ON7/yDBMOff8FvW8/x4a3Psb65ibjv4zArEVOcU6FO92yEJCaVwkhRzb8rDVk6Bja/DUuJlCWQaj6wWDA09S9wKUlRHh4jHfyDwdMdjP56jPz1APHgiCUBQSE+Hbb+nqbfd1k1mA26kXEUsShI456gQmQ97CPHxqefYP7GDQzPr2HU6bHsrLSGhwMt09dKGDwkF+N2g6QAhUhhuCFUGjE9M2hIQPcgGeB5aoJoqup/ML/O3t5G5jgFBkjCNFPAG1e7KN6j57twdGtPdelhiN5cCLuQ4/yVi4iPjrF4tITB632WCJBfADWCJCG0uYWfhQiMQNE+T4jFRKysTmYBWC0+RdPqKcAxBR9NDT7Lc7tmy6hG1tN9EuAyZ2WS5pp8klGSWRrRogttCNyE00lQT9tcnn5WtJNAnFzA0dzFE6oQrTVRdTOXty+T3joKU4dhrlB3EV3NCaXVhKXTzp87h57uk46b/BbqCDpNr+Is/jyttf90HElSNDTDakymTWkcxaLZ1qLfOYAH1tZGdLObOxYzw1gqFRxtyZ5IgsDTUaGo81S5yriOp7VwLlTWhpWa3DWdlTm7Fjp9azqotD8fNaPDNMdhmvCYjq7C8WiCcRSf2JPjtRgVfLkLtmMJRAKGu6+RvDpEf3UJQWgZgK60cTcKelqr1HhUtdQB2lPw/6HyOnd+nXzE14x9NkZv9DAyDRfXfPr4uRtgFtnUzLLCib6HGkEHdPtkCqtsEJ5S+wJ0sQzb+Q6duP7e/kzIsbSBA6cjFxCrqAEsNv5M2+/1Zyb8zaQO+oy071BjNB2LosnUcR4WQBskbP5cOUaBMhMkltNrvFfYM5zKURtwozZpbB2XAo+hehsICCHjUGEUCBOgyaZxoAY/H5QNw3IOuifIA0Hl7/IMUei6lmkIg2d6vCc3Ynywz4gy6+l+dsyJ2XPZ0vvr2iagihpTjif1eXC+eWLgKU+epo8FAPwLAAD//6xdW08dVRT+5j7DOYdAL1RuthBLsanaxia++OKb+uKjf0fjnzGa+OxPqIkxMaZppJQCpSKUy5nDucxt7zFr7b1nhlMgtHUSAuGEyTCXPWt967u4KnavzhkU2nQE1YlXqFSSJVoLYfIv6+gz+9TFqPUp0A+2yTx0OC+xQZfVYtnXftf4mekWvvo731P+A6Z6sLR202g+TFIAm7dwDCAVlD4vXsZ40Jiq8Im3HOQy430Ig6KVOSZnJjFz6z2sP99jBNHXSBQd5USgitHRsI8nj//Czbv3ICyPEUJaUHLb5Qd2NEwRBwN0+yN02iGu3VnGF99+A8qa+/WXn5EOD9nEzrVr9L+UdTYpt/fnROE1tzri54zPGj+Pv6jMZ8x8oP+RwAUvwMTVK7i2sozbn3+GG/c/hLd4Fb0Q2HNLxEWCAaHDxOrgpr9U9FVCvnLBtFJBxoJEMaJIjlYbpRchFRLxSQ8v9vcVWkfpBLYLrySTqAQ23fBJijSOITPlTFtVHWWNHFNR4VmOLtwETyD4VmgW9BdoRt9uu3gxtS/43OhxyPTN0V7mo3SA45MuNjY2sPF0HeuPn+DP3//A2toaT5EpScKAVi3PR+SB71EjybSrYkprZXPlYPrDd9/jy6+/wo35tj5f+F8EAON7INS9ZMOVHLnIcHh4gDQb6elIwNR83wt1WoKFv5+v47dHj1jHv7e7i8PdA/TimCP7CMm2tSZ7IowQsB5c8PV3WSOmGhnV0GixqaZQ0ToVRi28OjpCQqyQwMP09RnMLt3E0u0VfLC6grnFBSwuL2FyekqhsDwS1FMDqRoefkkQ9UsnCFv6O+HctN/uoItBr88eBFvPNrD99Bn2tnbwcnMbcfcARTZELz7m+07lxtJ6F8At2nwOWm2H0VfyNqBpL5XYoc8e6TiJuyxdGAy6CNot3P5oFXcffMyAxb0Hn2Dh/VuYm52H5QaMElNWqeSgMi6fq8zj143SZD3hPjPGS/IUg9+PtAYmijbmBy4XM2yGA5pehBVD5l02pudZLiYnp/j/OX6xzTF+ZLESdjpoTY2Yzk/3PhXotM4LN+X1fCJyEI1yjnKT2jTV1ppTmmS+2trB7sYm5uevwwnc06DoJfSv77rJRnPD51vWkwt+fjgmULES1CNcoN3yMDc7jaRIceJF6HUTFEmGgtzcI4fzq4tWiWuL04jcOxiu+che7iI56THzwaEJhNSNmKVYIOIczbaV28wG80WC9MU/ePbjT7iysor5h59i+uYC/g1ULvqwZD9WBQJoCjwbgvH1l+yrQTPRFiXK0JdjI5QFOp6PFhn4phlckp7t7iPe2kF3ewdHm9vw0pzlABM6VlMyWKjWRltLF6Ru+oXm5Zp7V5nxCeSCotNcZH6IUbuDWw/vI7izhLjdQmFFbMLL+ki83qwbn5+CpUEOuziXoxxFt4/RUcyDDUqz4YJVFBgOh7DbDipjefuMCvuSW1M+ibHmv2oQq+ioi98z1VGUp78bw0LzCuQpEzXOhXrynVBn+/sB2jMRwsVJDE8GyMnQmSRUTgR7ZME5FigP+vxeNwZuFcXcqtcYqYcvbDo3Rgk2x2ki+Zj94HjVsIGuDRv+CZVgomLVJE+RqWYgACYKQnTaHfRHQ14LuMg1DACi60pZG6xp2jYV7SbhyXZNAa71stI0a6Jq4KkepcKdm1gyxtTXqNA0ep7A0n4K1Yhxo/4W5rpN7wNzTKZBIiaBYR4wMKAneEKDHMxCoPi9ZMDDH5ZCZAXXsaIRL0dSKIqzJeCAmhLjyTAudzTHUTYa2rI86+1Q1/FngQmDQZ+bEzZqJFd7E6doWefOVEw/oQ7mzc5hPOyjS4bPPFTIlQwy7lfPptRDyBqvLU+Nj8hTyycA4OU+DjZ3MLW6CJtSBFzFglCHVVb58eMqChUX3jSoK7Qho83vyVLYjSa1VPpw09DSUCypNfq8/yqmztESn9NnjR36qSfRDXehafSGCUMyCJllfD/zBHiMgj6up3+TrWqmoXopYYlzkxLHj/uy27gc3AAA49p0AKeAPNP00nNh6WQEaAYeD55sdV4LnU5nQAehm2gGwKR6zthrJFd/z6aGWibk0nNEADHLF/QxaM8Q3jeB1+SiT1PShuSjmQ5SSRc0A4CAVlfLEsc3sy7RIEbmNcvDSNRNbD3VQ3S+TfJe8/qqwbcyJ2SpDrEbeA3TqQyFYnCoCM+0kvOwZ15Z4j8AAAD//7xdXW8UVRh+5munM7u0hW5KoA1gEUpbiSHWRDF6wYVX/gEv/CVe6A8xeqnEW/8EmChUQU20BdrSD+zXzu7s7nya933PmT2zBpEEnRtIINud0zNn3vd9vlz9BWzbnCrYPO0qlYOjbD6HD1imrqhpJf+CtBlgWW/ezS/JJhmKlqVjNKjJkSK+wX83jTRMowSdq8nmFU5dHzJaBEUtUZp/0n9wBI0lTv+SEenXG2KdD5vryZDQ5Umf2ppqoTV/BmXTQt4rWUurT67uULJfyyzFve/v4uatD9GcOYeUacEuhm6CQULTwBxxnGL/4AiWN8OoXfvyJXz0yccIp1v47tuvcbSzDZ8pc3WnS8s40EzzuvFLv/zLsqwxNqpLF8rG52j0X/8v2msJIUXTpzA9P4+Lq6u4sHoDzWuv4ZlXoOsRSmSxzj8hWrUtrAI+wBS1tUjkAWU3dUJf0UDgB3CCAEnuIClKPN3aQxInKKMhR5PxCzdPUMQxwsJBmCXoHR9V9EFog6FqFQpViEqBarH0oa6/tsZYEf/HVdSwj7G9D4sPFDJSecqo9wbu3/sJ9374EQ/W1hAdHqN3eMJFMEW5kFFV6AbKpTZnpJupQ8q3gfTNWaaKXAOWoXXafnqAL7/4Cp9+9jlGwTivRtdtFp9Jp4ON9XWs3V/D+sbvOImOEfcllzoMAqb/Xb74Oi5dWuRD+PY3t3Hn7h1267cyuSdC2AI48BHwgao1aWRWRRQ5h3WmMm13vbLmCRF1o2q1G8EkrtxYxpXlFSyuvIGFpWtoz83j9GybxFOjOEYqFFj/pJdFIraECuYpJxA5c6I44iJja2sLOzvbePjLz9h6somtjUccWRft/cnmgjT9JTQx8BuYsgMpJBlJtbmR88IpycflCK4MzdYkU7gGgxidXoww9HHmXBuLy0tYXL6KpevXsbB0FbMX5uC3QkbgUxZSyNPr2h4GpZru0qS5loA8QunKsR057jER9SIcHZ5gd2+XjZEoUeHZ7i4ODg/5e77z3k28f+sDTJ1tg3AX17LqzIKXyN0YISmKQeJ4OHtuDptnZtF58oj3PDE6SJ4RTLUwOOlwgUXvGslaLuC7OUeUTZBGMivElVcxspzCYjnB9m/rOP/2mxwv2E8TRsZfyRzwJT7ERG1H9z9+FaqAtDARuGi3TwNpF3nhod9IJMHA9/hc6w76SO0hwpaNmZUFlM0GuuuPkfa6CMhoN9cNECojpvGYLXo5OJB4v5DBrgzNOEPy6wM83NzA1PIyZlffwqmZGUQO+QOUGDC7xGFqoSQz5Mwn4ux+YoaVBZr0Hk9F498YDoBOhN7+Hgb7Bzh5tInO9g7seIAwK2VgIaoFvnd2CzdWRjPcCjNdQOuBLQqzyUG7vgg8DKdP4+LNd1HMzeF4sokORIIEW4rWVDWWMAbeuUJAEnqGHBk2Zv0EwzJjSUKjOQFM0rllMV03jvvwGz4zD0qVRPIiFtiLrn9q7v81I8Bo4Mz7KyqKfll5MmizJ0KFqPik8UkYTGBA7DwfcJuTCKnY7SdI4hxBRhHOMfr7R/xerfTsuiY0GkhbyedoEEANqf492UZDoCMhtdBNJ0nZOsJTswoKqTWpWBadrCDg1NjRO6Ix4aNLTCqFXlVDrryOQgpym6r1qeuKtdaVakrtYM/0dmIL6NQhhe67rlNz95fYQafWEOt6Vq9RUdQd4MefwcpdnyUAImcV6YNVGcXR/hz5CgjIRvUpNTOeoUmmGE5B+11h4haCsgry6arvNdondUTVkPK9YM/Rz+S1UQxdqIZG+gJUn0mo9H9Zb9G7tDMcIkoGPJCmsTR5RWhdN0u5lDTXNGy1FLPVVXsxICltN8WzPx7j/PEKJqZ9oca7tgIEiTVsVbGftGG1hp3jQNU951XMudDamf7vNSr0WTdu5mU2sfrvOoOd1jkbGwpKopogykxlH6aG/pvo2241rHjeAOdlLnuM4Ud7MS2l4NS9YKmYO/QYWmOJQZkRIc/3WIzAZG6MzUjANP3bAEDH4GkWgn7G9L/BQMF5sGgwgKgxTvqS8iHMbrvq+aAYQ7ZnV8eF+DCITJCeFxo4NhpKEq5SNGjYoteX/mQ2GPeW8v2lgaZoIvGIoMGD9mvQpvbcV6p10Mz156H/+n7p59F6NVtNPp9ovXV0n/abMNdOX2IeKYMq9rijwa4hpaB3KSft8eePPofOlyLL8BcAAAD//4xdW28bRRT+dmfXdrK2c6kETW+kaaSktEgFVB7CH+A3gJCqiid+U/8Bl4e+oUq80BdU8QIhQJM2CVXiJk5C1o3t9V7ROXNmdu20hZWitEpsZ3ZnZ+d857t4VcOBSSfQKnJnNE2Us69RE73o0iYuHctpLN38NbVBm/7R4keFPnXmPeWVqQFxYiezAQisPk0GbuldQrGxNjTF+AKs5EJQwWUQKkOZoNea8RmqBceuCLrN54sYDn7CRjsLK9fwdGEeeBEii7VHACVXUE8synVX8vhgH5t/bOCTTy9yB3MYpTxh4KcYjuhGPkO91cBZpJGc6UYbrcUr+OzLz3HxylV8++ABuk/X2cisxmYQMYwtVzU9o7qwuZWVnF1AKw6SwPjmCo7eAJGSmeiRWvcBjkEjPSn3pZWDxdVFvHP7JuZurSBYXYK6fBEHysGxU+DULVhbGzsp16OZ6GHJOI/Ng5TAC4V2UW5TRFljilkBBLJ5jQZOul30Dk6BfsZ6bTazIcObKEaNcJdBH2n3JfLwiI0Bgar7c2LPAnX/CGBo1sF00kEvROuKEg1Vxqjp/z3KTQLOn7fKoRdjr5xvlbi6QqJDPBPhQXMjGiIMQzx/vo2trU1srP+KjfXfsfHbOroHR+z/SHOu5mr2ig+9QWYk39VdB2WvtjbamRJKP5nw+DI3DGOlRptkouQCePj9Q9y7f58p4y5RzfWZ+Y+HhE3/fv34TWGZJDjY6+DhN9/hp0c/YmfrGTqdDiICcqAtgNkASdUw25rH3btrWFtbw5PHP2Pzrz8R1BqYa7XhFx782OHIL41a1vmhUYhpGk0aJdQ8Yj5kXsFMA+rwU2F8/fZNrHxwC8srN7B8cxWXrl1FMDsLvz2rt6eZBkgKRrJLehnFzPBfmhvzS5eLgNjJ2FCH5QjbOzjtdrG9ucUdf6LLhkddRGcDTYslCncGlrZooyPtOzLKFG+GaZ6otEA+ytiHw0liLvgzJtZOoznXwtL7i7i2vIgPP76D68s3cGN5Fc2ZNvx2216DwqrT/NIFmAoYR1nGCa0VGpgsbTBpgx2zK63eiFA+OIEW4dEx9vf3eZx0zXZ3XnDkYLezxwZJ3I0nt31P4fEPjxAefo0vvrqHWjBdSb94vZHZ2+aWI3xuTQ/V6zaZAb67cAnhyy760RBzQYBGq4lR7xWzAMigkTIPh/0zfnYor8BUXcGLchQjMaSSIoTWgGFvgMPNHWSvBlAzTYt9cGFE96ZXE50u7P2ECjunfNwZOYV5YMsYHFX5qdGKlv83xbczAX67VYC28kWLH9GUB6OYC1Zan4MgYMNXKtApm8hvtRB3j3Hm5oiDAmpmGsHMEvwLLQzWN5Efhezc7jOSn9oOx2TWtgF/HGG80B3QZP12HypL0P/lCf7e3UZz8Tou3FpBc2YGgyDAwCHvDsWbMtejeNscbeViFg7IL9/thazzT09OMTo4RbjXQXe/gzh8hVqaokE0SjHNVfIgGzdLNJGMhT1XZgPPOkU925kjQLKPeKoOb+k9XP7oDrLLV3Hq+xhwrGz5pmwQ6Go/kkK6PXQRqYiMaL8SNDhZYJqez0mEmFglhycMxnuUUDAfwCtyDKOYGUptp8VxdaZwnTwmN3Svc7w2HWCWSHplkVq+5ryvwOQGuTSIGpumdv7a+5GVUal9nSNmbCQRoHzvkZMwlZHME8k/YkTRpC2f18nhmQbjmw4QDfqVSeyUnhhFRU7GxX/CnWj6TPItYaBFWG6khdYAgN4/usIX1c0ZndZBQyQ/KEjmOX2lRS5pLZqlFAnVmzbm5AFT83zb1Uf1GS6fY6Kq2U3fcWxiAKQYMU0m44vCXLCsvAbcXRRtPTFfiFbv1XVmuo3NU2rsOnFnPi8LlNyyPnSX11DJ+foTC5aYkQI4mA25a+St9OwgNiSDnwVf42ojyEVp6kdSHX1NPJ0NUujzoCPrXCmqzAInPgFO6XSqmQL5uee+ATbMWFwZpwFESilEVspkKushjW+UvJk1dg6kfAuEQD+JsgQnvRAxUgyHfTx/toNej+aMZpMYgLqowN5OOWwN4CUFS0xPdvcxOvwHwcI8CmqmKBmboJBlQTpe5Fb/TUFpr84AACAASURBVC7/JGk0Y8nEY2K6PqVrCon34/k0SsZM8Iy5oqml+P3qdduFZnlzljPAA5EsK5Gjslmno4vQYRRZOcxkSsHkUfMp/WJoO+JpPg44GNYChP0dJ9lYDZiPgWlV8zp9sCcF6/E929S1efjiAWI+m8Zoxmrek8cgMnHbyBVPAAjDhRsB8ns1jjokAM0TWUzp5B/LZ0H089zpNlxYkQ7Q38jFPsvBS7r++LqrGTe0VtEaxvfuUDObrS6fxyn3koACPBZjim8BAX0+6b0IcGD/E76P6B4q9x/GaFEzO/R703fNBhKfMgEJqwe9zoBPvL5MUFioDrMFPxuskpxI6nwA/7J2ra1xlFH4mZmd2dlLktqkIcbGGptLbQkWpJ8UQYL/QPGvCf2g3/q56IciqF8KKmilpojmgmlJSTbbzWXvc9l55Zz3vHPZJKjEgYVsZtmdy/vOe85znvM8hQYOM9E1gqCFP/LDy5ZBMK42mm8BgATXnJzGUYbsSMZiBrq5EGE0zBL4klMYfBABwvyALdDoaCEwvofilRqKwmxJVBH5nLh3psRVu5EgVtzfxFZYmXECsSDsqsfMh9JVH9OLc/hrqwWPOpMpcDP9PGLHQj2nT376Ee9/sK6pOtALguf5iIKQEbN+J8CwHrA/f28QYOAkmJy6gnvrH+Pm4hK+/vI+fvn+W3S6p5yQl3lhGjHFUyPrwnwem+f5QFxJpSN/DyAPxLKIWphj5glBFSi3jqnZGbyxtozZtVVUbr2FzpSPxlXqpwzQiUfoOsDQoUqkHhMjoSYYRVq6vnT/uHrq2nAdn8WcLNEeoL+7x10cvmwC7RD2yEESxLBIHIT8fN0SvHDEOn7q9BTRqxYHYaa6kT5oLEMFJ3YBUPcs1goIewNtleaqM2In/9emUf5Q04RIxVVFjMKyawSxFrpttryknvCdnR38/OsTPHu2gadPf0PrUFf36ch8EmjSItpcuaSXLQJCDrey2KI+nYXH6ckjs3ML6OGUIwAoZRgdFrY3t/HD48f45LNPEZPKu+1emgLNYFsSM/39i8/v49HDr3DcaIpQlM3etLFxTrCBYBChMTjAd4++wa23l7B4fQG7f25y32/NcuFTAETAh9IEdhYRoiCTAJGS7tXsEV3eslCdqGJ6bgYLN2/g7r33sPTOKuZvLGB6bg7cG8GJbn7p1xdDieAOOFCOUkDFYmGUPjsrtFpHaDQOsPliF3t7L5jaT0JZ7WYLvdMTHlv0qpdrmLZLXBWk4T8ME072tZ1ODLfio+Z4iG2NGrMGQRBD2QnKFR8LyyusNH7n7rtYXNHCg3RO9Wsz0obgZhXP9M5bZ/puIXOXqMxUnbQpAZLKH4ND9HBXusf5pK21FV7u7mF743cBAPZx1Grh+OQE/d5Ag58kbkOq0wnBE5wXYTjo4+GDB/hw/SMsr93O2FimFecS84xmcLUyidn5N7G3uYswZkI4HLcMr1pDudKBQwFVuawX61GAEvXGlW2mzJajAHGUzXWidPsxmNp5tHeA+YXX9X1g9XAtkqdSLt/lnw9pIl9gX8k+VQQCRsLFGFlC02ewFtwaNQwj1oeh9rBuGLGwX22yygKYJDgUh0NEccAiubQQdJhDX0Pd93GtOoH2xhaOXh6iEgxSYAq5oDLdrCTVr8k3g3i0FqgQ5SRGtH+AzmETx1t/4MryMvzr11GfmIJbm+R2uJITYbrmYYICqMEAVvsUUauFo4MGhq9aaD4/AIKIgTcSt3UMWyml4Z7XgnJ2M60sTGF3PAad2/T+tTlcu7OKyu0VtKeq6FRI7M9ltx010hTVRIRu015zWMLwUwwy+XXSE/Ex6LbFhk4h6g7Ra53AbVQwXXURd/RsIhFdosQF0ktJnz/PHelfjRdlhENtURTPFS7+Y59u7s3Z/xmaq4WxtVMVxC5pP7XtscYDhz4R76fxQACvUfnmIJcQM2prElFgW8a7Y/aT6HN/oKvO8jvxWMtYahFoCWPvgnMzFtRG36nkaT9zrjqrogI4V8rtnNL4qPi9FFeaIJ3WEq6MS4LhcA+zKLuL2FYYB2OVcpktiVbRYdFdCZzPxL3sv49MJf8cKz3j9c4V31wCYu6fofxTUmds6FKCn2Vl7B6lg3lI0kkJ50j0jzL19iQTuRbrr4vHVDGZu6hCiVxMqV0O9N+mqkogWcY801VRkz9cdqOf6lBBZdhj/YFer4dms6mXIkeD+nyOAvAmyji/5Bi0cpx0hXpHHexvPcfM8g14lbIeF45pOTIJoErHgU5ks2vjiD6CZruYz+nCIyVr1Wql4A/Ptn6wC+AR5TP8Geof50RvmI5XEvx1xij9xq3CgD/dfp+LqGaM/hMFgF0rSqbaXdTPsETr7Xyf+WyjhJv0iui4TU6lpPBKx2IY2vT9SZRjd0nF3hSZ8y4CZkwZ8cD8qyRMinEbUFuE8gzQzXNb6O8Q8MmAb0qd7btXOXCOv6PAlsz2s6sUMQmJ4SaW9vRcIXBNs+WJsaNZO4HMZ3MMhvqvi9M0tzWASPPC6HqYc+VxNCZab2z/zDXiOFPc8Vwqoo/ngWzhWgQw8hszONg1g7QKiC5IBU0BYmwbfwMAAP//pJ3LchNXEIb/ueg2EpaxTGTAjiuUMCE3niGLLKhU5RHyGrxDKus8QhIqlazyANknC+wsoALGGCsFtmOs68hz06S6T/foyDJQIbOBwlijOTo65/Tf3d/vL/yG/eLT2QbieE7xb6oAeuLlr36HsCiWhVWJ68wmsSNUUdlsmHpYdgviIaySfyXl2u0AqvzaZDOFq+mlSorpr0gXyjhVhdIWAQYQ8usYbrpb9pH6MYLVJtZvbuL5bw+RxTlnDnMZ8FzKi6g3cX93F73jI6ysbSJKJkLvLLEAQJRNylBNggoa9Yp8SYg6HKNSa6D98af4+t49bN35DL/e/xGn+/uI44iDXAbd5dz5JJZWzoWHKZ7Gjj1p5n7ImX9aGQmo5fkVzvItXWmhtXkNqx/dQm2rg2i9jeHKJRw6EQaOg3EeI6VSIFK+qHKAJpGU+/OC6BhwJFPI85Q3psynMhlTIsbOC34JUZLiVfcEUfcYCNWeRA+sxpKQAsNsHGJ8+BLZeICKlhrafWy5SQ0x8dLJ0Vppcn7o5OgQl2lRKWnQdFHY9P8u24c3jCa8kNIm9GD7AWf1d37/A3u7u3i+v88VIOBN32EQZLPs8vul+UMJmKBSgpdkhkYOIxg52jqT58XB+XzGybRveEgd0++TOgpYz4tSN/ozjRLc/+F7fPnVXQT1lrJa3+n5c6kfoIz8q+ddfPfNt/jlp58xHE1QdQ3NljIWXMbJB0LzpazywTJGmg2QxQPc/eJzPNrZRviqjzgcoVoOuNTfE4eOPDbk3nK9hqBpRKnW2nv4gEj9nRu4cbuD1XYbwXJTlDCz+fLhn29pb2rKHRF0H2X40xj93gnbdvaOTjjL393bw4uDLkb9AY4Pj0zARTwCspRJyNEkwUo14L7ZhEFMKUa9vlHLYZTsJbLqqZQwGA0RRiH3nlKG/+q1a9jYXMfW7VvY6HTQ7txEe30Tq6stLuv3KMPNb1P61qayCQkM6Lzsoz7JBUWZ6cQui25xHiMcn2E8HKH77CkOHu/hYPcJXj47YEZB2B+zoOFZB9yAOA2Oz4T6oFFH3feNEJFStiXDIDWVHn9ub2OjcwOlisgnVt/tu18ut7esrK6hfX0dh2mCOAnZsaEa1BDR2ND3gAQAyiTlIXyfqsI81Ko+g1bZigqmtJ3aK0pZzk4ATx4+wpU7H8JtNoytpxCd2QXgApZKAY99y3LxVgho8YEZ2ru9/qZcmM5+GEYwZA9+F4MwQW+YoD+ZspsLjXBVhpbbACYRsvEZPKLl13x2AIipOGipgdRvoFG/hPGjpzh9vItmOERVKNGL3u25QuNZdANM9QQHis4UFcp8JxnKiYOzIwKxjnG0s4Plq2torl1HYznASqOEClV/jSaY9AYYvjjkOTXpjVD2SqhQuaJmuiFZY1qj5B1k0htst/GcF7NnwT8VSDnoZRGyy014GxsItj5B/v4mBksBepS5piCObpdKZVMubTeOsfGDVhRMZ9CuoLXMYmL3rxFXA1SknDmbRBi8PIZfK6GcLcGlSgP6ThLI1wnNPGPfaGf2ucpeq3VVr4PAnf87B2SYLrRJvinwuugqmD/yM/v+nLVFbp0p3eLcwp7/BCIj8Z72ddqXogTl1ENKVZiTMzjU/mABljNxE9Fxzq3zMgWhBDzlwIUsJcnVR4IXR/YwFQDe1Ixm+lRTuBKoU1KAzm0ms2Ugv1y2K1wcZVBpGf5i37BT9Fm70/nDNJ0flSvAAMA8FRFd2l75/FjmM2cqtrN0XnMFeKfBm15sryXnYW1loGfQTJ/xgzcVOmQHp5aDHHxYBH770kxd7kibqgYWMp6ZQAsZns0sjXThNYzdnwbhrpy/LUHKeX2rZCGeWNnNAiIoY2u3e8xVRnG7cCRtt8bNCtoGVlSw/Lc9hPapUXzG9zk9PeEKABmQuUV9qnwka12fMtMrL7TfUS/Eyf7fiP/po365joSW7JIIT5LYnGW6F98nB4jZVOZXWpSuU+CuiUUAFwZi+vsqkFDsVIDNxYqRguzEml/FPafzfv1sFez5BhZXWmw7sC8Kiu0MfHpujzBctBkgzvXOr08iFFlikmvFZczREBAlQ9b9+ZCSAmn13meGnIhkOs9VpHJdtxBd9L7299sWK1gYcI17gA3uVCFuTmBLtbXALcRCwyRafEbzPMpbMFwNXpMEvEhjzmMkn5kB2NNzmP+jIgdl45nHIZwIbRuisdLqiGKOcKHa7Jn1MzdriowtNYNmdI5Qy/z5z5BtSy22nX2poKgQwLkLwL8AAAD//6RdW28bRRT+dr1Xx06chOZC7qkS+gCV+oB44w/wH/rv+oCACiQQEhKPtDwgRJs+0FyqXAgJseNcHN9217vonDOzO3ZaKYV5sZM43t3Z2Zk553wXR0+MmaEBoKH/eiLQN0eOJoELW1PQhjIsKzh9klvbmDeOoGWa70QdSO89ZXvF2UoMZ0TzRIDJI9HQDHv4cwzHGt1MGKqR8vAUlRFTaIIfuMATCJiq7NCtjfoRV++SwMbYwiQqszWkf7URZQn7x3JWGZLtpkHUvmri1dbv+Hx+SSUuIn4lC0QKKgjefH3ZRlAJGb6S0UQRODzpkEf+/MIyvnj8GA8//QzfPXmCn795ygtqQBAr2i5bMhlxppEdANQCmGEI3J3XQDXES+0UEpUyokycV6mgtjiHqbVFTK4vIthYRffDBVyNeeiWHXQDD42kizgQJerUdZm/n+qnhYSs7EQNalGCZ59bqqwmCfppxn1ackOaeXBRb+LioA5ckfCTi4zueWUcliV8XqsbwSd170YDcaMOn1EUqfIgtoYmYQmORfDl3niVlcEvG3WkZBlEVki2B8NxyaAQ4H9x4duXN7i4aOLVyxfY2nqJ5788w872DvaPDjkYIW6tLRIYCC1BsdDDSrxlElkqKcuymGyaCCbOoTxYdC6/NoIJ5YaH+lWHfcoD20pzReMS85/FSYDU76lPYuXt/euz59jd3sPDR5M8jt6hP3K3RhfV6eP7r5/ipx9+5OA/tETMiwSgLF11y2wMUCx+oe0xfL86GXIyol4/w7dffoWEKs9Zn/U4yHrGCz1Mzd5DdaqGlc0NLG+uY+XBJuZWlzA9P8ucm8wWtEUCsYQsKU48BdPD91ZtzHsdNBtnzOFvnJ9he+9PnJ2e4HDvDRrHp0huOlzZt1NB2dAc5DEX1YVHi1TgoNtuw7PE+uk6iuD6IRzP500dTfC9OOLg27V8zCwtYGF5CR8/+gRr9+9jdWMNc8uLcMfLwBhB0j0kGo+QcVpPnlFFpqQFRDIZo5SX4qpMkT8SyiOBrNO/j3F8eIQXv/2Bw/197O/uoNU4R4mUhmN1bZaLaT/MhXIYcud6cMrCtQ3JUz/qszgrIXIcP+BNW+viDDuvtwUqxiNW2vtX/1OdvcwbAYX9sIyFlXWc1+uIbkgMMObMkVsJGAbPllNUeW1TX4kVFmkAhJ7A3Jgfp5w0yJ7V7sU4e7PPGgJhbUySzhoD+l+GvV6braKiBHOkGdD+IdtPC3mlFCo5G1Hln20HS3xnb6IE150Evf6As/mkf0BqiK3zK6aBkU5G3O3xNVFCaiz0ee7oZQlSZ4BooozxyhxXsLKxEJ3Xu4guL+AQGiUVCKnDSQ+7UO+3zCBM3tmKpx1AxsV4miG66aBMKLjDGO2TEzgTVTTdFEmvjV6LkmQR0j4YpTYBsblKlCtAphLULEhoYUiY1TY4/vnvzL7UcF+nxPD+wQeTqGysobzxEfozS2j5ZbSzGBntGzLxmh7YqSh+63neoKqklkq+0J9maph9sIqp6UnUWw3c7O2jVJ1AmXj+dMyrDq4PTjDlOwwzZzV9CkJ7GXp2n+ls4M36W8b2HfFVDFVWtMf0PdaityUXbp2F0a8akZIntRjpIc9JZhduQKR7QmsObc7Zo54KHHRve1E+LsxzGKopcMKXCbHodzvsU07fxdRAtVZptN6oB42tkpyZcb63rkf5dWfai5wh2vaQRpXw0Uv5hj6ni6YSlOufpYIW55B7hteq79VWa4ORzXRuRU3WfLYHrfquOcFmYy0EE2ExEBSAr2DdXBEdyM9xUtAz9P4Uuqo5EDts5i5bhRc6IxSUexaNQVr/6PwIkdpqXrNbzkS1Kt9rKdtOEralBOhAONuctFUqmyygmKN1h5WLTNqJPq/RllnKKz/V+3Erhzinak+TxkIFte84fm+3Yqaiw/RjSuC3WHzw6OAIl81L6RvSV6K5Tml0yLG0hatKeFpFAoqRGjHwz/YhWkd11NbmaYsq49b0yTZpELadQy11/8TJgK3n9Oe1ppnLIpZdZX+nRNwIbeK4OXKEP6f4/7oaq+OgVFVpzZYp4WPuc+VsRvpEHIzaw8gYHViONvrOvtIb0CgT3ei58h2f5ycoyvboGE+U84AWh5dkmXDiNVJCqOHBUOxntnclRPIqeB53yu+1TaCpB5CjMBTagkX52CHOypMRZgJBI4QIJTM6loUGLokKstoc/ZuuvEvCTseOBO0XJIWG3ZvjhV8VJaFAINE+lRAFQjmX+FO7Dcj/EMKxoBIUgTy/V3MVoyIUYkmLiOpGLnkC8FZ6OCONjqtFKLX2BMWwdA2DJMG/AAAA//90XUtv3FQU/mxf2+OZTCbJNGleSlqFpqUqBRYgJDYIJMrfQGzZ8GcQa1RU8QdYwYYFUCGgVVHTlrZJlKQJaV6TeXrGvkbnnHttJ7QjVeokE48f93Ee30OJaZcJEqweAB/HltjOcrItd59P1HN4oUstj4u9/mNObl0TtlIibzn+BKGgAJS9N41X4vkBd/691QWgG89iL8norOtAyV6NPTh1sSnQIkg8Lqq2esplyyTqynP1iRVoE66ossCho1lgjT1YlYM4SlBdbGD68gJ2dp9AJdSCcRieT7czNguc747w+68/44NPPoVfqcIfjjCMJUEhVEG312eu50RPIxkjb80Q6YhWpphXpT6drx9h5b338dVbN/HhrVv49utv8PCPPxGR7gB14Edd1Pmei6duaqClZs0rfP1N8CmsCNr8FfOIdSVEMDuF5uoKaoszCBdmMJxvIp5rotVQOAldDJRG39VoK/En9EkkTYGTSoFUcT2VtdNk8RH7kFSL0qYThAgoiVJVZInCoJ3g5foBsHPKNyvzXSiydtMu4n7MyrdRkqHe6SLe/Re9vT1MkI1XHqYK78GxG0km/HeCKs+TnVgQ4XhvDy82HmPpnUlkmWKIbZE+KzNuX22Vkk/4cwEA+6wOh7h//z7u/nIXD++t4cFf97iDfHp8KF17ZGgYBIRNM7R5FtSp4LAnSZmf7zO/P2Oag8/iIJnheGs+Q9o02cInFWqBY7rMJNwUqRq8Sg3jUxOYW1nC/PICJiYmsPF8Az/+8BOSZMgQ6oTTb5mnnVYHd27fwZvXb8I3BbYz1/s/Y0B7/Xbjdcycl53vwd3f8P13t7G/f8jdfaLR0L+ILfJSNKemUB2vI6hXBRpFnKwwwPT8LD767GM0Fi/i8y+/wPLKIp7+vcYKqmQlVKuPoVKr4tLVN3BxcYG7/X69RsRQ8SLmiq+I3VEwT1rSaSYOElojh+ednu6ifXzAHe/97RfYWt/E/s429rZ3uMN/0jlhHhoLLXoKVUqMCAmTCt+i3xcYLMG8Blxc8fLFX3jVDk6PjrhzreKQefHLV1Zw/e2bWLm2iis3bmB6fgFT83Pk2VNaN92c5ZynojyPAp77LAZnKAxUgeeNy3Pg5Jx+q8syxPFJi7UIttc3sfnPMzxde4zt9efciQVx4ynIdTRmVIhKGGEIse+jcaVHjgSkAxHgId0NUgHnTZkcUjTZUSaIohoOWyc47HVZcK1Ga4Yvyb8st6+B8L5+atkJlo8u25FUQRWNiwuYWlrGxpNDRPQ95J4wXsFIx6x0HE2Ow+22kfZH3IWrRA5CsokcAJp8jDOxrKNCTdKLsfPoEVrbW6jMXoBXFSEtz3S+zr5s4UV+mGsB2OspJfDaJvQo3otdrKUBiH1sObm2RTv+PNtYKJ7bQxLYSzS6iYPjTocF2Mbr44jJfi6JoYcj+KR70WpjdNCC7vbRqNFa6nJgTyKthB7oEneVFPGTEI13r8JrTKD75BkG6+sYSweoE2+RmDAjAxs1/GBrZCvoCUfQVFKOEqs7KmBmLiOwst6AvzNu91iIkq+IikeZwOot9cjh9Vhxok2pbXqm21167trsR2a8eFzMNlaomeylXVI3v9BE/doq0rkZ6NkLOK6NsQDt0BlxvYz9kk01wykp07nGtYBRakQrhzgHIAoweWka1eUmdBCgeXkOL7a2+DyDkUaN9vM4RaI7GOweiAjTdBO9xHCqiT9L+h9awQ+lE0y++UVAW54TZ3nD9j5wY4HEvoxft3Pu9/8bnWW0P0TlOof9m1Z8VhqwmQWJGyvlsgUaAzMSKSqntuhDcU6nx38XaloPK+idHEC3YwSpa5AiUpikxJ5QesquSbSfkdZR3GPh4n7riDnryLnCKX8yUoFchyPdRSpecxJvinasCGnGA6M0qLgtrqwsOEZdbS/zpIDtChrUIlA90/22STS5CZXvo3QXi/iQ/utIAMHHD13fwF+lGOHlHB4xmivunbXCdHgNoLhSJ6IAX04oPGMhyRZcRiCbvl+5ImRL6J/+MM7RA9bxyTXCXFwLHhUaWK6nDEfYZU9zLgzQ8VPhg1YqNTijDGMqQvflAeLjvtBbqyHC8Rp61vrZ2NoGTmaeBZAZNCiMhpC1vy6/HJOIlRuB2gwmu4wwykR8cTlS4CI6+bm3exj2usgIbp7KuKFid4ELMdZ75df5bcVFsUZnIgpMaKPeURfPH27g6KglpbfEikRn+VzRudaLQR7oYk65qYsqjcfDPvbWNtFYXYS/NCkIAcfonWRWgNvjMWNpM1aUm94HjJgrIGWpQQJQXkFxjeMWPvJUtPJMs4yh3ZRzkMUloV0SEXqsjVV5HNAel5hGKo0h0RmyRSE5BhUY6Jgk7MnxiDrrQXWe1mE77TBQ+1wPQ8l30bshzQULu9fZKxuq2uhiWDq3NroBZcs/FnI3CSv70pgCXKVSNX+vWLxRscgecmSI7WiX53DZqo7t95RA48UutGgIcxJLiKAcDQQuCMg4EFIKrSOcJHsFV58+yO4MpFFnkOb8LOl3pGniKxGBZYQt0aXEsYHGAlHCiOZpkeqFZpBFIRTxNd9/00RnXQeK/U2xgorN/Ezofti1pIS+YG0RLihKbm3PL1CCUKIXFyHouvm+U6FIihI57J/0qtgyVERbtTaWhGT3mg6Rao3/AAAA//+kXVtvG0UU/mZvXq/t4CROm5iSNKQJVQq0BSHxAyrBY9+QEAIhVYg/1fIH4KniAQo/IVIrodILrZvQ5tI6bi62473NonNmZnedlKKKkaKocVKvd2fOzDnnuzhGgOG4P2AeBA0Y1YgnJSmEq6sSdhF8TVA2gyH8wtbWJFZhx6IVFM33cjwoc/yNawAVD4j7Y3gshuOUats/CpCGd2NEJUxFi+kAzOVKNTxOcTSU96vFv+cRvIMmLykekyK48kBivrtTdzB99jQ21h5xx1UdZtQmZ+s7QzD99ccPsd55jHeW3+eEPabgIVTVjpKhOA6xvzdAo9FAtSoYYcAcFQH0hyPErs2FgFrVx8effY7li5dx6+ZN/PzjT3h89w/4ooKKYtazSI6BcaaGYJffc6UZwJuKVDBMz69hcnEejdWzaK4soF+1IM7MwJqZ5G7SbsXCwAMiW30NIskppZPoxMWz+Xp5oQilWMtBjbqyLMGgPIdJbAvCZU/r0cEIL9Z3kGx0gaNUKREIlwMamy2Qmjd5uRPUdfM50r+34I1iTobzkCbGdwah+wmUYp2enkKz1sAoTfDk3h3Mr6xC1ALYtv+/de8P9w9w/fp1/HDjBraebSPrE8UlRN2qsBifo7m0Uu+GIldhNglCsQYcbdXlooAN+ZbHC5Fft5TNC/t5Oy6LcLVaLby7fA5LS0vsA39+9UO02nN4a64FkEK4V0G41cM3z77C7bU1SlcB7WbPXbQ0w2+//Ipr332PpZXlN2yCjoM1k8EAv9+6hfXOk/xnlFTS3G8vnMGVK1dwbnWZCwCUvBO9pF7xUZ9oYnLuFGbbbcCvYCJ4G1e//Rrp/gFedvfgOtSFrnL305toqPdkBV6DalGHJzpoJDJSFn3U1QhH6O8fYq/3Ep1OB5tPN/DwwR3sbG9ie+MpC94RrJdoCzTHGCxvC960GSURDfkAwjzfPG5JCFKcdgNUgqryAo9jjCKlJu8HNUyfOoOVC+/h/IVVXPjoEtrzC2gvLvBn4zYCFDWDC0CcnTjKhsXSB0s9l1XEiPUBwS7uuaUggARZjbmDc1vxMgAAIABJREFUlWKv18PO5jZbRa4/+gsP7v7JnOX9512EB30uHtWpkBGRUj6fnJEMY37PgA6bo4iXo+94DPElygTFH46hgRJyJT7hYRSx2r9IIjRaTVya/wCXP/0EV7/8AoIRW2pe/ZtI5psOAz91gwBTs7PY2p5A1O8yfzIcDRhtREkcwbFps6Uuo8W0Ghu+78AZEMRUcd496SAUCnkTdV/i4dptFjOF73ChMUrVIel4LDHD2GOZV03yn3f1RGld46QGwCuRAZmBpav4fERQYstGmKXK07p/hDCSCmpOBWiCDB8eIqDTS3+A/tYOsH/AHN96bQKxLSFdwS4yJKjqVKtML8oqTez1hpheWcT0VAvJ7Bx279/DqLeLSZmhYQu2W7P1OjJRyggzHh+GcmI0S8heQOadwpLGRo6sMnE6zQ/itAYUka6UkGWm9GDleCY6dPPnciroCw+y2UQw34a/eBbR3AxGjQBhLcCI9vwkHaNplMOZFMZGUGpmkNJlgRUDDReN9hTmLy4jqzmMxKhM1Vnxf7A3RM0O4BEqKxUIj1Kk3QNEvstNDCeo8TNLwpSL+HywSj24JORC0cgxAskSMnnVlZWuV5wsDLxunKAPlFTtJV4hNijGBQLzOZllmhRnijK6rKg7ehb3kW1OINPDkOOIfWKZmDZO8YLUc4rOAMPDA6YCGBpYqu8C7xEUOzLFwedirUkYk0JngKmjluTDNqN2pKIzSm2tpf0oi6th5X6FpmCBNFbtH7/X/zXi3ItdXZPpmpX9/cv/tstzOddwKMQ2i26+deL9uVtKUG1t5+Xqz6nsDHXxylZ84sFwqM5Wts1dYlsjc2KZ5Ad6brplFqOfPEZ0NhF2e1z0rXg+5JDsvjyE1DjSiairCxd8xpUaaZDKQp/h2MhKxQ/1IXT6bqDPFE0sZWdI6884JyQR2Tj3IYchBKk/v0Z/4E0GXTshaXe3eujcf4LYOE8YXnyWL4McdWDlVNiCGMoI0sxFv3eEnc4zzD59gZnTE1ycS11NY8xU4UsIqSH+JU7B2HMtJl3KCA+XkXRlK8qC663nrqW7ujoPIls2EgxUnWXVdKDnbET1wEn7KBegNiPRCBdTBFTIa237phPysn2c0VgznWTjLuFoxInNiazDf8MI7WNzmBsJpPOUFImoLCFsON6X1qAsc+wNJcJStApXi1sqanmW0y0KmpQcK16Y9WZQOVWm1RRK+8WatWDcGdiNKVauGFwcoIaPp8Xhk1jD9S0lOqrpRLmlIdVosixH73CCTiLCOj9Wz0TrgfE6oiaOo4ogOp6YvFXR4pWoaXnkOSpfIzWJ8x67QleZxL9EVygPNU9sfl5MKcjFjBXcxdw/+r9JQJmukfYxWqdMjyhT6rMM/7B2Zb1tVFH4m8Uz4yXO0iROSZc0SZe0KkJIPCBUISRekJDgiSee4Ik3JP4X4gdUCKlUAp6AUok23UubOk4aN7bHMx7fGXTOuXdm7KilCEZyEiV2Zrv3zlm+5YgGQHnyZ1OKtNCe/lyFTcbCZ9FCK2bwmIeW2UxhgcOJVERcDPeFoSVqEoIxzZGjxJ9eLMigFRFFPdzJq8LljXlZmvfB+2WbFJVfYKpEiSCMq4/LBHgGppOJ/+YYCGoBltdW0GjNInxIvv36uLmTkmoPemAw7OPPGzewtrHFBYVYWBvSIdbXk/1LD2toNqu5GihTJBIJoCh5Ipin8hzUzxzHp199ifc/+Qi///gLrn77HW7+dB1pJIwvlWOvi36hsvRaTQjgDOwNW11YwvzGOSy9eQnqjTnsNx0MZzx4y7NIZz2EfobYB3f/SSHZ+DALdEpxoF3xLU1BELiO5bsS4NLAIq4cPcAIWkJdqVGK0TDEwYM2ou0dYK8vKbsnatpkjZhRxEQoEpXAj0JkT9rsT11XmlqSB4pSjTbhp4FBzzQ8LLUWUSXl7CxGuL+H3Uf3sHxhAanlMeoBmgcO/HsU8PVr19hTv9ePUXVs1Lj3XOEHqUlLJ+lnZSh6mj9VGYNAD0jWpcs0JsGBR4kJJW+NJuZXlrG2tYXV9dMsDrd2dgPLqycwe2weTuDDJR66Ldebhh49hMeRgn/qBD7+7HP8+sdtYNQVPQGtxk9j6dGDh/jh+6vYOH+eCzf/xHMub0W6p9DtPsed+3cx6A9E/IniMc9Gc3EBX3zzNa58+AHmF+cEMmuJb2k9qLKoGxckXJ/vN/F1Hb8OZ8HD4tw8d/EzRwSPxkkkwaKl9UUI08C/H2EwCLHffsJw96ePnzJvn7rgezvPsLvTQdg/FP5+InxISvQVLazUqXMCRn9kZCulbI5HFFmKRSEHqOReYlFyrPnvh+EAqt9DnI5QbdSxtr6OC5cv4+133sXKyVNY39zAXGsJLD/MKCaL54CtK7uWXvcs7nto7VlGwKc57zEP7m0BTI8hKtp03XZ32ujsPMXBTpvRJvfv3EO33cHzdocLH0kYcYHAHaeYpS4QKWyyIA4Fc3pdov2TPc1ohGrFwzCM4dY9HpPxaIjh/lBE94h+EfiYaS5gcW4WZ7bOYe3cJr/Obl1Ek0QWydvzf0z+81XdkvlJgU6r1cKzpRY6UQ+wRgy3TryQ83VK/iu1KqzeoYjpOC6qtSq8Xiz3W2lLPaKhOQ7C3T62f/4Nm1few/JbF2EHPpIoPQIznp4L6RTkfyKxn6YAlL5n9iSYm3jorFqfGqcQm+lbxGElFNUginHY62MYi1iS53gM7R8NXjCtgzpa0UEX2O+yWGijWYdd82GNYxa7Uk6GWrMGx68xWmOPCgUzAULymiZ9/sBDfXER3Zs30Xn8F9JBn2H6tiYbUceIR4mJ1rQIZ4r0CFR34ryMuOHUXyc+kqvEZ5qXXCT+rnZ/MAgJmi8x2WFWbCSzTWTHT6Oxvgn/5AoGvoe4EbDlrCKOJ9lx5Ro9Vr5fA3OXoExz3i1tW0fHW3NRXT2G1UsbSAKbatIsNlqfEwpc9/k2z3OfOlDUURonGO8dQlUcRK4H75gDq+6KN7MrXaNM6xxVxC5IigAvYbe/KuEvj78MOJIoTRQ7sqII9Tobd7hUmivRc9fKkcBaaeQKRQtu5jG9h9A1/c4+soMeAqKcZBIAE5efdGYSVvYvlX+yAsJOx0aFWKKCiQiWrYs/YLX+gHiwpH/ByuDjXBTT8ZxcME5g+1IUMkJ9mEJBmK57ahWWY0ZwzHTCDPf+dTZKeATqrPJAHUAe4BcQ/VJmOXVvLaOIPwVPNtSF8maS1LwLz85ThVUZFaycIGCINouEES1DJ0kcxNsF/JopBtSEsS2OudymDXXYR9gfIB2NWUcnSQKkFZuFlhnpKlmNpsxOqp4fmfclqLsp/BnkrzS9jZeLw195LqZisZsNRkhehEzrJAqaKiXj/2VjWo5Kcev2LWzfvYMoSRlZqbKiKVS+RXkP5iUxD12BJ/ceoHX/IRY2j8PxG0hdEQLkzvbU+3NRzZf8P9ZBG4tdo7FvZOE9RxIugnrbdjmnEpRlXmhiTYHSvLJE1V7p9SbVNpFMGY5jsY6EaCExTcVxNY9fMdKURSUrooskSb0zgUqYHp+KLe9i1h9AiTM/cUHNjyX4uUl4p6+FnJdzRJ9DlPuL95eP5VXrJeVKUaRpOaSplTm5OGA+dy2JynmdG0uzV+ki26tqgtP6BnIPBB4viX6xr+IzkqRLXqu99nUVmBrIjKzQ6HYzf8rnJ452xfxnpFUJVcQ5au4mYorsk6PSIOlpXWA6U8lqsKzxUOhZyHwmlIDF9td6fgP4GwAA//+sXWtrHFUYfubMzszuZjcX0yRNE9LamGBbtBA/KKLgjYrgV8GAv8B/5mcR/AuCtaVaKZSmbYKxabNZs7e57M6MPO85Z3Y2m5YKzoeyabuTOWfO7X3f51JhB4sgX6oXxvOsHsqNFzGWylgwQqwSCmuQbOp79u8sAiBPx50tiqjIS4vOpKCLvRcbXBObvVB+n50sackvMzcCGzCHy0J4wYhSyOLsaLI2F1YOHqu+am0kdKJAFS+ZlSh/sY759QWc7h9hlDnGfVvDtD0RdcpFHf7BvTu49dXXcFHVkCzSHpy0eB6qOne7XUTRHPygbnx2lcBLMlcfdkKK8ZAzGlRQq1WxfHUT32zfwK3PvsT3332L+3d/leBCi7+NoU+wCxTb5isJxIOLK1i/uYOF6zcwmG9gP+9gWPMxv7EKLDWRMOh3c4TOSISoUnP45UHS8gAdyV5pz1NXoHqaYzYUaEouiQZaJ7JXsiTD8DTEP3+3ET1+BhwcC2WCFRfh6xoxHJZMyLWuZxlm4xjxX4fwOj3Uyu99omX6skkAqmXXGw1JHgWOj1Ec4vGf97C0/a4cbotNTeC5VhTgNbehHLh7+zckfR38O7LADM125xhTNt3RBVLFsN+VCf5LxRj5XPWUjPm5uQWsXlzFm5tb2Nx6C+/svCeB/9LGGvDGvNm1aFpblW/GaSwQ8cw4PAiKhe1gwiUHPvj0c2xe+wEP//hFbNO0NkCOKrODYYyff/wJu7u7qM/Nvl7bz1wMDliVODo6lA2KQ5nJO3pJf/HRh9j55GMsbl7RfUD6D5fgdAjlBkyXiOQZk2AeAz6VatUMWXw8Gbsjc1j0vMDgCkcYhiFOqMLf6WLv8R72Wfl+cB/7e4/QbrUQ9WNE3Z7YJVpPaQaCTS+A42qhKL9SNd7JSpIDvlctrHo8v6qTE6MRehRoivvoiytFgIWLi9i69jZuvr+D7evXBD1x6fIGUJ3Vk8tVGl5jlcqNZ25mKUnSSRUzZphp1ZVnZ2ID1YOT623npI3WybG4Rxw8fYqne0/QOTlG6/AIEWHgg0gOOnRboFCbZuboSeqRP54MhXc3zFJBGEn7mKmnJUxQx4BaBXBw2u3Is/NwuLJ2Ccvrl3B1c1MsCC+sruDy9rbQNzjvmdhIyO1NI9ks3Knj0P9z2T2mXm9icXkF/c4JouPn8PkeCR9mziKhswjRRQr5SPCrCAJHBAPjcGSqv5pS0yBMlOvrwTM8vH1PEE++t2CChOSlz5yVqvnFz2c4/JhCBOjAf7yxVsx9lARZQ2jYICscJDQxiOrFMdqdLk4HA/SiWCr7REP12y1k1NXgwa3dQUIXgJiHsToazaY4GkCSrq7YVnmNAF6tJjZH9QuzOB22xRWhPhfAnanCn2lguTmDfG0d2d4jHO0fYIGwfgmcMoF020ReXlqjziZJikNvmRphxzAmP+Tmj4qFxE71spKZzhmYuAoJK6KNGVTXljB7+Qry9asYNBvozviIfBcJxWQNcqaQkC9dZf5jbnhvcvhlpV7EURTc5Tmsbm3QLgZ5QP2ECI7yUZ2tSxJvsPgC0VEPlUwJba1COGQSYfTiVFwaaDFFuiARV3y/ynOkUJFMQGQ9yQWOK/Lni7qV+d4451z1ilhlKvB/VRrOcpbLCAErjJblFu2iBJLK5TilAGWrj6Q9gOqFhac/ziTF8vL3oSNBQVblOQa9XlGthA10mfR2FAKhEGjL1ExukklC1o69Akdiql4jg/SQlIrjFEFzauDH8tkE7MpVE+LQtgJ4NhFgIezlYIPPS1HRtODZq4mgXwpMVl/qJRXgiXdSrAMWOZBOaB9kRnVbIP/JsKCXCe+flp+yRmVyrhUxOBZCxHfcCBOawFQHl6p4MblQWj14jRq63C9aHTRn52XfSCkcSg0n34iRVRQC3ytoCLpfSw4mpQFo37NtemYg+crQ48oVTT4ndUHAAK0bwomGonOkNEH8PxUezrv4nEkUIwxH+P3gjjjbWOSCvbVTGksTxaKSc1Z5HvHfeq0+2k8OET4/QW0ugGI84I7fpwwb8YufXs2mLo5fQSGPitjEJqkqVvRRAI6GL5/p8VU4bqixToXllVfkftq6D7nWwEhHWjg9M4hRaw9sA0k7B+RMYuZGxVp0m/+XmTFV8XSgKuKWTAQbVLTlp0+sUXzHRthuaAQoYeHymQ0sHZM8cYr5Z8X6rO4bf2ZxiFTL8jWVMFNu8QzisuTpgnFq9BLGjhe5SYwpHZCzHpJqNyTGW3Qo0VoMucQmEquy6s+Tp9EQYJtYGBFKu3kOy/sXnj9jljOrM5GIltJexL2lNkhh2STw+HtEzaykTWARUTbZZxOJti06oGc1li4R42Rj+bIJHhFcLNng6/4bq/5bbQvRIiH6h/HuIJT7SzLAcfAvAAAA//+0ndlvG1UUxr+5s3mJs9ZJ2qZrWkiIWkR5gAfeEPzjPCAESAhQRasityVbm8aJ432WO+gsd2aStrzhlyRy5MT29Z17zvm+3xcUGj/B3Q5TgR4+1gEVb6wtoy3COKyK/BIgYsosRLdhW40V5EWknSJ6MQjkUJd9uFt9YQgMRaQPGftlKpm/8/o7VUEduOEe0yg4QmQyfnlRTpJc3+iqcUBwuurJeojWF7D6YAO9n5/xcEH7dwq6ccThHMeve+gfHmHt9raAWAhsBcuKAPb7FODC5uJihMWlBSw0mxjPxkxSpkdK0gJ+TtOsEEEmTAICoE1pom8CDKZznt6xxAQV8ViFAKV3j/gDC5sb2P7ma3QfP0ayto7eyQHOOhHWt2/BXmtjRFRpoohTWeZ7krWuWSo0HVXCIEvWZE0IRMgPPLYUTGha6vuI4ibDrPj+ixmGvWNMX54AR+dS/Mct9sJxh9irTpXeeILmdIr81T7swT5nS/u2UMybgH/chdehlkJP5P/d7hpCihwMYsnUzqboH77G+fFrrGy14WYW1OzRXIf39uxLG5BX1d68fnLpjFMhF5PSxFrtMsv/1lJZlQl9zkwN9cjb8SUah951SqhrrS5wgb+79wi7j77And1PsXX/IRZX12AabYDgUuCdWUfF7komr0Pgx1L8w2Upa8ebzUzAg517+Pb77/D0tx/kiO25A5hEcf3y40/oPX+BvSef80XcZ6DRhw4zVyS9tdtg0EdBBZQF5/aTrcSPAi4cSb49h3SgeTJQUExizMyJWT7nNRSxdwpwDuBcPavQySPLKwtgcHyIg3/22d9OxTApGP78/Q+MzvrIJzNWUNBm3GkuoBV1+PNKU6a0SHlN0hNkGisdbKYZ51wzpTWTyMnJZMZWlin526lAiAKsbnZx4/p1fLK3g51He3jwcIc9/a1ul9dV4cmEw7OX4UDO78evGMmsyfqinkCbixWJ3yNPpvM0sZmncwYLHrx8ibeHx5yZTgC/i5MTnB69YesCTbo8vqgWaBCZnf5GmqJBB2nPxzyZi92J0kVCizxNOMubO77Gw2Q+Q57NWHJOEkS/GWNt6ya+fPIYDz/bxd3t+7h9/y7ay4usLmHIHqDPVT6ubCQJTMUs+J9vQRRg/fotDPqnGL07FcRjHDLbgr52lhYZQDc8H/IUxc/AcstGmHG0K/mbEzq0z1PEpsD4ZIgXP/2K3a+eYHWhzVYATlqoTxTrcmb29VU+ysIVP+5+jTwtf77UJHDOVl3b1LglCrAWMAU3AzwMZiP0L0Y4o7SIJEW7vciNKIpkHL47QydqwJtkSPpD5Kfn/J6vbq0g7jSQphTzR8kRET8XBt9FpA5owTR8iVm15yDFZzZOULQ95K0uopUO/I1NNLYOcPbXU0TDU4RTi46RBraxlTLi6hG3zjwoiqsYt+rmtvNyX9J7AiX5C9FfXitqFOcExV1cRHjvNsKNLuLNdeRLyxhFIcaUUx+KdS7XiJjYhRca44gw8rMWRFB4EjXVrCmQ0J5TWEQ3ruHmzh20NpaRUTOcr8OGE2lI/bd84xqGR1303w0ZZkgNSlJJ+HMLDBNkwRmiZhMmljg5n+M2RXZN/BJqDjPMi9QJoSnBmCStvArJZOjaf1x+ysnTR+636sWuAxM/9LuFcm7SPCsP4+7maQa1x4WEj6bXQD5JMR3MMHp7jnQwQjRP0fBpiJKweojjm3WBOA90oYk1SZ5oIQMMzweYjMcyidIinX6J/OBk8SOv8pgYUeaK8oGhZCHvz6TEImWWKyxJIWAyq7AvTypVIwRtxrYEIr2lAQlNWuk8xMWeAtsK7zIkqz5cYskrq04/TMQWj3eoxVgu8bwG7z2eK/JyW1XRKUty5UAeMG29YAl3QId1bWaQ9YVy343js+S2zNPL1Ust+eNUrMvgy7gBlq4TgYPJe91qt9FYWUZGlssXhwjGGWJSD7ZjZGEGG6WcdU97+pyuCVqwONsB2H+cwRo+ICDwZcBDTBirZ31WCtWAymzXsCJRpiZtOhjDjmcoRlOYWSb6N7XcMXIgvyw5vrRm6w1GVwOgatjQ+xrmwPTiAr3n+5wk5F1RFdSLfl/hgJ4yy2RsUtF4PGYJeYizAid/v8KbZz3cWl+CHwtIkRqIMkG1bO31ak0MU5T/3aU1k3tisWCPdyHPi9aQ0SItV2uIqHNyLkqlZnEWE4+jlIHaOZRU1QwP9BlSF6r029Vc7vVhlkXgmklCwGdJv3r8WVlpKs6aKafxafk4dStivZnlJsQUkxkEOlhQ+0j9VsVcWl7K9f3H1PzwtK7p81pXAfDnTaX29QFyqQTSyPWA2VI+ZtMZ/KjUV/K11+o+anVPoZpSJPyhRCPrOnavmft7zs4gtg2N0mPlgHt+FTzQDaZddB6dRcp6l5rf+lhu0O2+F5tKxdRwhbs0NxxXgZKqpO7mOupKDSzpAZqyUbuYuAYMM1JUAcLrzNnEHESVvtf9bjKelHYQ2luDIMC/AAAA//+knVtvG1UUhdfc7LGd2E2bpE3Te2johUaISiAh4BfwF3nkFR74CQge4JWiloKipqV20tQ4sWPP2DNz0Nr7nPE4CWol8pSL5HiOz23vvfa3Qn649fpi1f88FoD7cgE4vdeFxsvMpO2ndwAEZh2F+h+qPMUNuCOpGms1I5kXO0FzK2FxE8AF9GeIkr72gfHDlkUBbQ2oJgHk9exi8e0E0cVBL9ZFaAwPPJcN1g19PsikZwYtoHPtEuILLWS9kTWgKqylocrvKfFMhgP88vOP+Pr2tvorhj6mBStV7jl8gUGxFWA6vYg09cVvspBWhkCqWZLxNZ6V2nlyiFC++PJ1D93ugWxhuZVnV2WpItOyPsCzWoQPdh5hdec+pusreHLQxV4yxMr2HWSdJvKar9AmBihcX6E+smeDTyYuPGvvIdCfKFCuADPOQQ3Dk5H0BvP56WddjHMc9vsYvz7CaO8NsD/Sm19jWfpxXL8P7IZOYFmcZmj0h5i+2EN4MkTEC4fxYCpbe2GjEKnEmDkMMG7UhKvAQ5YXArIRxpMhurtPcWF9E14QwXjhe8smF74McH3zGmJm+SS4dw06Do7nSfBvRNooduXaA1po+8TmjavYefwxPv/qS9x5cA83t7bgr14GWLXjbZ2ZOKGB+85kT7w95egyyo3Af+DWnMqAM07W2RLw2Ref4ttvLgoEj/Oizl4yCwU5Hhzhh+++x/ajh1ot8LUHUBMB7xgGsVsMpGe8GddscKszz1hVjR/GUlXTCqBaO3o2mCKLoeZpz6eZTeSDc4HX1KRCpzezFPvdA+z+9kQkeX8++wOv9l6iu/dKEmWDwQDtRhN+mqHdWpKDNiRwMldBQWQ/mthu7qyEi4UUEzO0pElmmORUNtUQLDUladFZvYQb21u4cesm7u98JP78a1fWxR1D9o96LAFHbquWsIknr9Jbm6OwgKBC7qZygPraW+07RXCR4Ph4gH7/H+z1XuJNbx/Pf3+Kg7+7GBy+lQo/AWsmTbDk1yTpFDFhygz2VCsDge3ADSiBpfok8BDTHzvXPW+UTeCZKVLKa3l/E/DiJh4/uI/bd7exde9DXL9zS1gFXqMuMkVCzRx1PbEH6HkV3moV5f9Wcc7OrcrsNj4arTZW1jdw1OtiOshgCCOyUEAmMQKpYqmfP3kOjXqEpDbViotAvDQZG5oAUZLj8Nkunv70Kz65uoGoeVFEq8WC3NC9D1MqOYB55f+03L+aDHASaseAks/eSmMzceLwMJO+P4WbMRnzVkCUJ5jQWqgWyx53fDTCeJJK0EUXlFHvEMMXrwiEQau9BFMj+C6XgD9u1FlGRVb3kJPpsBTD1H0EUYxlsyIJ3/HBAK1GII4vUxDo2kQctdBcWcHyxiVMXvyFEaGYh30sFwWaXJpcxwL8NThtCmZKkOxitRb/Eayaip0x103mR8KTSQIfRwTRtjtoXF5HsLaK7NoGpp0OknYHScj3quwZYQIE6j9PmWcJFIS/oFAoKuU/RQ0WMlaII/hrS7hy9yYaq20B+dLmrRBVmB5wHM9mZ1lUV+NuH0nvWKwWPSokeE6lM3gnHmYHb0V9Fa3bsMIOCNUoGdcb5w7Pngarh7ofOpvMM0mAUxU1c0ryn+P8u5b2+ZpzFRrnfVX/h28ryLD9s6H0+cYIiwD5yQxJf4iT/T6m/TGQZBIU8cIs1WgmiShDhu2PN2ZhD5Adg383hSQ1x5PJXL4cqDA8ogKAFla8oBIO59u55OGMC4LS6jPhkgj/xF3ALd/J/azuA35ZyXJ0/CrV3rEGFlQip6zEPKtELUF+7+hucsFFKZvna5R9upmCez3f+nwH8gxTqzgLbH+8KUFg8xaBQCzFTNmKUP6/rBDujbFzPTez0vUgt62YzhXnJE1QiyMEzVgCmQkDZKo/LywjatVFSZqH6oaR2N5x3pUlkCNngHfhUJ+HdwSuPbIyvLoGpFJFDTVR7FRBzopQ7BDTDOZ4DEym8KikYyCVV+RFlbF9Xw5GlafAedsIIlEWMPgXy+iys98lqvOF4N8lAFzBRqClNoHloKe8ASWHA3Sf72Lt4S3UWxGwXJPnt6GnzimbXD/vDJzLs0/9bL939wdJ4pQMh6Kk5ZekeCppZ6n8XpNTmlzh94TmESzIAJ/BZ8oz3NrGlu0ani/B/5zJtri+ggrbja9D9kAZG1XeF071m7t9yEnNncrauQ04CKCouN3vbGG3ugPKuoh0DinEb951LnHjbLYwN1zBWCB7voO1K8mebQqLCaVC1AwqvWHRAAAgAElEQVR83Xa7rWOUpiUckP+LbceubZwxI9+vsy3ks0nx28LkBfwnsaJW46vj4BRWThkkVqVUHibzZMLclUTbsGSMBA6rMa8ol2S8dD9w40bYMhMsTKS0Wk15TzL2HHO7l5UtcM6mVXKPqgxSNYQmf+TZK+qm8TiVOE/2z5CJP22B530wyzL8S9uV9bZRReHvzuKZ2BM7TuMsTZyNJgJSUZSn/hzekPiHPCBAQkJCFeKlhTQpKcFZSJp4n/Hs6Jx773gSGgJCTFRFimp75vrOmbN8i6WhKFKQQor2QT1ERMnCqQyTKoKqqYRK1GJm6gGovzBebOLYpUL+Vl0Hfk2sBRnULUfB3ZDCgWUrBfyL4IGCYyEKagJb51GTItdQjNsPBw2LgWoA0JdR3DyZgdzN0VhbYAX2s8vDojrjSWsu7QAdw2B44OGrlxh0e3DrTYzCccELF0r4itaj1+8zt9mrOvKGtUy2IOM5Ein+0xqqMRQFkWAc4vDlzxgOunBp44mEk54iKSg1LGIKmGvLaD7dQTDnoTPs4aDzG3zPQas+A6PuILQSpKaC2AjJUxcauqq7nbzxiS+iAqgx7eZNohDCyrlr5d8MWVWVCv/stAf0Y2CSw3I9qW6ZyQ4sUyGYdwgIukEnEeK3HQRvO2imEjTLE7XypK5UmciQl6ophwwYFOqJepFWMojxCH/8eojdj57Bmp/VgHx5JXfspx46nu7t4YPNLRwdHslkQbUALJVuEjeZFDQttrGz0V5fwd6nz7D//Dn29vextfMhjGpVcp1JhY3HYBUejWltbKnbkBbvTQlqphM/ff3qt8BUxZc57SwYR9MYC9sfb2F7dxsvvj/n6RYVvtRurKhi8tuvv8FnX3yO5fX2e3jcD7dIFuab2Npo46fKC4SJyXBmKszOO6fsMT830+BKnNAqpmJcUNtfQtXp5kjkMiBCmKQcgGv8Pce4PDnBd19+hVc//IjjX16j2+2y2A/RZBqzdSzUPOkoQA+gNEEw9rnYJ6gqrRQhMQiyTnGDrjsYDxnmPqEJlVvB0pM1LK2uYvXJLlprayyq2N5YR2t5CbVqDXAqrEXB/CqajlABkmdqcpFNha/UhFyvGAteMdzf5m+PVDmSNET/pofu9RU6vx/j/LyDo9cHrFkwvh4gCchnO5TuDsGE2uqwhckIE7Cyr4HIVxC8VLYf8mI6KzlmZP1nxj7bIlGx77YaWNloo7Wxxk4Kmzu7aG9sorG4iGq9IRMQQiKZkjOaVyTMLS9So6nHi1E0HG5DJ4s4+T/BAeged9waFlpLeNds4nrYY052Tkq3ps/JrVt1MOoLZWFl8gPOtidSH8SUDQBoLiCJ4131GAWwsv8JHs/XIVxRKETra9HF1X3XV4b8/10BVlDRODEV3DyiJlQQx7gZ9dHtDTAY+bI5RRNl04IfRqwsHwcRzDhDfN1FRHz+s0tYroPaXAspFfyI2HLVcqoMKSIBOturYaY+g5x0dOjHcjGXWtwMCQcBRJgzzJ/WJZytIHWqGHqPkc97MLZ3kZxd4PTgDarDADXfR91KYWc+v6Z87TqH1PZa98HU6e+xelwmygp1QDGKaE91D3GtDrG4gvTRIov7Yc7DyLaYCpDTM4gEc0nRmvIIQ5Hrchm7Ew31LBIxhbq5rfomJza2gcpyA/ObS6guNpDYklJkmjoxzziCs1hgzUVzfQU3Jxe4uhqgThSAvMrNV3ZVGYdIsj4XGIzuqQu2nqHciHUdUpm4kUI9NRhojzoK+vlPbDLLtnF39xInlgUBLlVF8+33zEqTvOIP9xzMx7ctaQlJTeogRu/iBv67AcKrARDIeEdJtG1M/cTZ3SiTWkfaVhFaY4QbA4T2EuyyQv848RUpDwnov5JNGk1EqVHLjXqj1GCDRDreWRXVcs34uUqJsIbKays9js3UxMkkyiG5x/f6vxxSSKt0VnleUDvu0lO1laAud7TVluYRa/4wx1RDaR2wsGTEiJVUiZIRnZFfQ/abVDjEUsNKF3iFx7mpfdJVwWVR7yZiTRCn4aHRnEPvrItoEMMcRcAjD2LWhTkjEYO5Kgom4wHniTwdJmqAN1M0AAgdZ1Qsvpk59pHgmpWX1PGBkKx8YwlHF4QciXIYcaaaI1PhSiObah88lL+XdNAKTjyJ35HFn0eaHBnR+VKmFzjq+ZUrFxGtMCL0j6aPlHdXCSGrhaRH1wkujo4x/2YL7ZaHStVktIU+04dyRp0P6y0hnQSmhZ0uxGn/yul/UnDjywfD/JWYIBSsO1d8f2oK0IQ/9BPJ/6dBqlOZUtbUmsvpubbPvH2euh4yWPfI/svnMzxfKfjfFQEUaoijESB3p/9gWiUpiEdcwGaqUVA+LEYjyAm0nsQLxdEvf46+xwxrqsXByKLS/jHuia+0TqPRSCGTMkYa6GYL1aX6vS22apzI98/eT9niwTRFPnYQ0tR1VVAXtCD6TCmkXNh3lvYE3dsayl80NNWh9wg3/gglS5pqvN8I6fkeAl3pPDSyghtdqonBIpYl+0g+J/UdUHNW2opK7TumPPA5y9rYtm38CQAA//+0XVlvG1UYPXNnvNtxvGVp06ZNI0xVISHEH+Gp/xTxzAOoiEUU2pIS0S0he914t2fmDvrOvXc8Ni3wgqUojpPYHt/tW84SUGDJ+lYGVhHfWeu5aiMyBxZV9GPjxWu47aHVDrBVLctncmISTizCQfjdc7tKkNYLWIssZVeVoh2Gt+p1aT4IRwFwVREDk1jYd2UrvrFVY5Tr8iUYDhYIAAPxMxODP1PUMMOFExiRJ+IqATZ3t3D88yH0NLGw8ogQp5yF+klyd3z0EidvXuLjz7ZwISr6enkx8f2ID3TvHVqNOjswykI/zLVawR4rz0TawLs+OdCW1UwY2bLqyQK1ECmFzu5tBJ0NnM1CvDg/x6B3gfrWPeoZTMXEWbpryok2WV1me+55CqmljfyBTJqY3XmjhStFGz/MIRIf6/4Iw9MeotdXwNk1MJSqd5EBsKBKZBGInoFnO41CkyjKXBhMgJNzDJ8fojwYIUg3AmfXl+lkSCBCbpEmx1SucjAYYTqZI1mvcCwLSmO9UuXBdvHHIbbXd6wyu/q34n76uom34LwJN7rb7VJ9XVtN+nT+yaKKInzx8CE6Ozewu3cHDx50cfejfQS1GhLp0Ko8AhShbTU6ljwz1ESEKM9AfsTmzgkh8epWoJ3vi+lSr2du1MZ3udlp4JNPP8d33z6iWnDeduAju+kcHDzD459+xObONgNsXxX+A6dx8ftarY79e100G2voDUIkszkD/YNfn+LdySnqjSa8oGzWrR1rEUukC8V4hMlggFevn6M/vkZQKqDZbmFvb59rYHB2iSePvsfXX37FpLjdaiOfJKiXilQQEEi1+NQLBK5cNB0OCSyn4zE3sbGO0sNtbb2O7c0Wx2G3u0fqhdyvtDdQ69xAtdkiRFf4d1TVTVVfRW4+x4JEYi1dkkXpKOV7p2OQciPnmImCfr+Pg98OmOw/efoLzk//xGhwjdG1sR4Ur/Fi7KOsCtzgxdap5uehc8ZJQYLjSTTlhs09sZDHZDg2nVzRKNAR5jpkV7i2cRPNThvd+/cpSChzb/P2DiqdJv3aaTHDbqmiAKIoMATGPwERZibpX010V/iT70v+//+bQqW2jkZ7C+Nej8gJ3+qiRNLtyBUQFIosDksiLZuWoCWKwhfXylKxfHpT5xKFcpjg6vcjPP7mBzT295DfWrN2fObAjRPjspCk8L4FnN8JrmWLcEu/twKsqXc9xag8Y8XpBdQAuBoOMZhMWcwQhxcp2ORoxZPHbBrRZUS452UdIL68xODwFaKTCwpnVZsmwUe5YChMM01EgRRw8qUiKms1UjVyhKf7iLwI1Y0WuxxXh68NtH8WMZALlUYkRZ+4hETcNjoJ/HYbm7fuIDo+xezoGJdvL+GPxU1hznUrSV9Om0+A53FiEA/ZsCvdrT0jPCvisRGtwXxS1QYSuLdbKG5vIWhvIGrfgK6vo18OMPYMd1nWHwXKJPhUrtS2Aq1VQDaMX2rY2qSUNox+glJnDa27N1Hq1BDnPHZQc1afyAWf2uqojMIJGvUqGne20b94i8FxH+VIp0mO+OFLIVKSi0A0KaiYLklQwVyjuOTogGc77TtjY+UmaDAiHlf51Bl0BPB3ZMlqorHUDfuANkP2ZhIP+4zOLcCd54yXgHgW87ye9IaYvh0TMi7+i2KRJcGg0EykSaNnUzpHKG0Re0hWINBuLEzhbTIaYjoZGgFG2ugZ9fp8oPgl3WDPduUdrShxrhs6SekROQvL5cOhSrvibColOu2suc4XVexTrvCqt/2yOJmHBcd/dZbp9wjhrY7Bouvppy4EsB18ceqYTo2oV7VaYfHaNb0kpp7NtFWV95g0p80zmOQgr/JM6uDQpw7CbtXjKYBmNQmMzoWHuQT7yli7hnpOFECrUkJhexvhUQ/hmwvMWWSeIgirKDbXEEtHX0RvpQCppzwHdTQnXY5aVcqgAFwBYEb9KhAhEGY6/46T7xHipKFE1DnyUoCkE4kMLDOCVq3/kPzzvNHLtpaxjT+lHCg0IDWekZoD+SxjSRRzbmBtUm8ISJ7lNH8ovElWvks8KYWws+cvsLl/C0oSMYllfLXkBPMhLpybI2l8kGqnLRArnPfJQgcty293In9yq1QqtPgj1D4yjYBKpWqLywkfE2QJxeNig0pw9CBC1WmNGRN5417b3VKBOKKsV9A3TMoX/+MFC/SRS7Zd0k/4vlWwT2HuUsSy89ehcVz3WmWEMl1TWQp7UshKReAtt9+n0GO0VAyJbUdcihYUdVZGp8DPIAjkNUXDjSgFdvytwKfl8Btqgmk8GZtOs3bN85iuuyCcs9B98u/pvGrGSPIY0jrt+3Zj5ugA8h5cwi3jzARbUIxpkUF0Gaz2QAYh4OZHNrGX5zEaJDafkwaacx6xeyLzYzl70vvLE16KHoJAcsUYp4vnkCDGRtEUEuMowl8AAAD//4RdS49URRT+6r77Mc3ADMMMDxFCiAYTWeEGF25YGDXyO3RNYuIPMPEPuNOtO12YkBiNMXGphoCSqMNjgHHedE/37e77qCpzzqnqBxKY3STzqL636tR5fI9I4Pr11DvVLcrbNMyqo8rkvmCehe94cndWzSup1hOFQ+Grw7rLkmxhVDRvuWKmG866AFjxpeoviJn0w3k96npqRxQFynHyHcyMbW4cj2tG0dIr73vPbZ6FuYNUOmsauaWm/y/gl6PRXEixdmGN3QDyRwcMpWPBC+Y5q0mSVIx7+Ov2Lbxx+QraUQvdkRChFNPqNSf8/W4Xu3HIUPMkoRdZIcwIw2uYCsA9Z6uhjDgll/0c2xsbCMnayDquDaYRTfaOaA2QHV977RXkURMHgxEODvqQ+TnBswoo20JkIwfjc96SbvIvSqVAaUSggv1O6RmXCeIgYbEp3R8h3z1EvtvDYOsAIAghTf1L8p1pU2bK75PFOKxrTtDULiIocwnsddEh1MD6A8Q7e+gQT9BbYCjMFV+h5Pro0MGjYpDgUaXG4dNDDAZDrNRHkWVCBaDgaMYldu6vY+3iZahOKIKNoePZv2BMIi0uw4Jd9FjaK4t49/oH+PHmDwjIciiwgidwMP9BrXHrwWN88dnnWFo5jkSJPSJCaTxFk/mt907WLGrGXDt/mc4Uls9Lf4O59TlXBt9KCSPXtLFI2y1cevMtHDnyLbq9TbmE1PTvdXsD3PzuG1x7/xpPwMqqcNoJLsm3M5m1/38T5E0ApC1cefsqWwFu//KreIcbYPPeI3z91Zf46MYNtHBcXCAoiJYjbG8+wp+3fsP63bu4fet3bDzcYNQIia289+F1fPzJpxwDQpuwWCCpFy+2Wizu5pNAuszod+j5jQY50OnwO0/JOoeW1Wlj9ewZnD1/DqdOnmR7PoK/n3r1FaQLbaCZubNMRVki2hkESWX6w/TJg2kRJU/zJNbRufYd7NpxwsVKhdACvb19PFy/j82HD3D3zh94dO8BDrZ2YEvRPMjiCJnWaKOBMGqxMwNx9ZUZw9YWtq55OtxIid9tUFBiGQecxJEAaDkciMhjEqFzdAXnX7+Ic5dew/KpVUYwrK6uMi8+SNPJRyDegZ0hYQsNQ/P0ziNOQvzP7GXmawa6+Dyo40uGbC/HkTzTAX/Gki9lRfUMy6tnsPX4CbSJEUcZjDlEg6aBjTYazZLRFTQdTKlhnYaObmGon4mQCw3FE8ekjnC4l2Pzzj/4+fufcOGdq+icXEEjTBkuWtuSG4TM9VTGTYtE5HEypbR2uku4MR3xlNoLbXg7QHJAKYMYvbFYKvb6ObqHfRTjCuNKkmgbxqiouBprRnNlQQMxOehs7aFef4z0yQHMXhe2mSBtZzDkB00xJYnRaKSIAmmo2yDEQnMBJVkh0d+kdhVRO0KNztoSgqLE9vpDxFzRCPQ9ChNGAxjiAGuLMGmi6jSQrC0CF8+i2t/FcHMDZudf2K1tZMMRjlqFjKNFxM0SauiyzRfFWKfgUbnrh05rpQIMqDBIUzRPn0Z8YhV2eRnj48dQEu8/acIwNUfsMX3zzUcpET7y30tDXPIJ15h197wv1Mh3m2h8kgQbZGvHcPT0CSwsHUFMdn+EyQtl73M8UVMlc7//DnUf8VoLnQsnsN8dY0RojEJjga1sK45jan8Aq3bkbk4MgvgIVNyCoXyp1Dw1U6VlB4FRXcJSk7LVFERRMLufAqbZBc6n304g6O50+EvBF+3wri3PknPcXW/9qRYRNl0H7E7EiWgaYzQacSORj0ehUQ018t0h8t2nXPgH4wpmUEBpi0bWQpJkSErS8ClR5jnsIEds2J+E42bsfS19AU+TJ0K0qAD9gy4O98mlZIio0RHObSioyywJ2AueojjRACgnJHQPtHZ3nlB3Jg/CFUc+T6T3PypyRkfGiegFWCfCaBwNlTScEMw3AZ7VrHB02Dlu8YS//4Kv6eBprkXKuRAn47XBoBgKYiwC8n7Oa6PcmPJbeg+zubNwcafUg6ltmEzzkmiKpuWfpxjBejKOYkB2bxTJI+W0gTQC0qCwMcoqZBRAtLSI8ske6l4PzZDyzUquuU4LOsmYQkTvW1M8I3cRytOcgKxfJ02clRYaaMSDPTX3LD1OJHLIRdoHVDh6O8Xa5dI8iPADoNkaRTk0gkffqvkBY0x7l4Z/4wJhESAZ1Cj2hii6BXQVO5Sqa9hxI5AEHSsWNWPBR+MpEhoZO3zoCdrN671od4KG+wa9v5+waHWy0GCtFUJXkVixnuyn2U6AmVGFN5Ohpazfe7BLkRinQlGuuSgcMfSeUEnKifPFoQh2UkwYj3NR4ye+f5RKA9xI/KIG8oDciUoRtSu1s+DzNZkTB/Z0W+ObKrrGcDTkpjFPiJWZTKjNnICmix3OTj12woWslWZECJg/TyCaBMpMO5rM/3eW1n5qPrXLqxwUv+RctWQBQeUadKG4F9D6jcDRucB3daOvB+NY6jOedpO7G3v2q4kYID2PLBHB95SaANy4ks/Cw0PnxEDUaxoQeGh/msVur5I9pqBrmG5DDQHKR5woKa0/cOgGb4Mu+nckIEjNdboPZe1+3Z4yLYNkQe3w+zLzNPkJJcHVo/Rzs3oK3LxmfTyxTyyK6f4Sy1RxwqD4yShZ0lqB5YYh1ZpMladBvbtX6Ar0VA4aGJAGVFVV+A8AAP//tF1Zb9xUFP7utcezJ+kkaZq0VVNRUFlUQdlUqQ99Q/xaJOABVCHxAhLqohalAholLek+CZl9PB6PbXSW63GWiicsVWqaZmbs+F6fc77tRGXIjXMqlBCj08oiCk8bnPvaofB5VFAmk003JaVFIFOUJNe+uO85dN84zUSK3MXWTXLdhcrjHlhj5vQ5RukacjMWN3TxAJgdmUblbIFklput0E30NkMYaPHrM0XDg9eqYunCMnp7B5I3SfnTvuUoJ18fPHQ7/Ln1UCLjSMdjfMTJlG8cbgszQfrJjKHT6aJcrSHQmzVTWojn67mrm+yw22FUkW/AEj0YCntp5pTpOs2uVuEtLGCSWYwnM9aH8rSHEPPRFAE1IUSlsgL/cxtopcH0IYutWWmIKyhpbyYRAltH2I8x6g4RHvTRfbkP9CNgGEnjH7MAmfXtrCmbFF23rTxAyMAsjFEm88CdHZhnz7BIi+1YBGR+XnD5+VTcp6A2vl6yjIpOSTM7DPlaTRhZByPf1MRRJOCkd4hKY4GLX16cKJ36HnoTqZI0zUcPNIS5cfMmrlx9D39s/Y4gm5uiMWLq+/j1zh08fvocn61f4KYidfdzbk5SxBDTU3PITxI759852XMdx6Hnx/VPP2fZwYO7B5hhkudtu+On2z/i1dNdnLt4BUGpqkWke4/TiyBh/sjZvPvhR7hx6xbu/nYf00nGcheKLbv9/XdYai3j1ldf84N30DnE6+d/484vP2Nvdxt7u4/R744xieAEHNi6dw+7Ozv8eVsba/jgk2v44dtv+ME8GI55cxqM+ux9QRv+YhBg4dwazq2tY3VjndkZ5y9fxvnNSzi/ucnIv09yC6LzJ1rp6f0s8WFWrX/kYFMzt7dkYklI1EtfG2TBCKfcPMfJhGUHZNa2u7ONrfsP8NejRxxBOOr1uVgm7SxF8vmZFkCUuUt7TiKMo4iKXW2eqPilIoCn5kmG0TTkNdsbhCjVKqhw9OBVXP/yC/YmeP/aNfYsaKyeYdTXHZnmbee/q7fQ4v6bjHz6//m/6P5vPyQmqbqwiNbZNXT2niAZCf0xGvRZA1mp1uEHPR7IkuyMjADpIR6Hico45MV5ZDoRLergRRv7288wbDzEpesfY/3sKu+t1pb5eWU8cRlGJiamTjcqSLE5KrFyZkmkqZtG8CoBey/0hiP0kxSH/RE6nT6zVcLxRNewz/uh1cHzeDBBiQz9pglsN4Jt9+H/M0T6poM6FZLNBjNDZhrHatSQzzWT5WoFhuRiZBpLA24jSABFI1GRurh+Fuk0Rv9FG0kYsX6VSafEcFGTr5imJWXyJijBq9fgt+qobLRQHryD2as2widP8fLla/YlIGYWDbRovVNBnhq5Jolu+VMyt6TiY2kZpTMrWNhYh11dRtRsYlwtY0qabkJjqGAxJ/Ol6XoKEqwSQC9TpoU2BDbNc+1zEzIajJQspyOYWhllcvW/sILGSgOmLJp/N9SR+9gKWsnIq81FV7wFNjzU1pfQbR0g6kdo1mqYjcZIZxlLM0woA0g0pG5hWXczhV1scvHOxWoKRHEIG3l835HvCN0b5PVATThLFBxjxMzlgMbMi2jHtJhfCs9pqXJgBW4AYuQezWsdjUksKasxCqf8OSjZgJDosDfC8M0A0+6Yh/eG10bGRbOjr3MMIhW0EFSXzOysOh3pm5y6T3DjQSaU3R7vd67RyyC6fzHTE+kGDUFpqJmwn4nSo1NlWOmpSGHrS2NLoEFJCnFi+0FN0ATB8vOoaKbf5rLUuY7Z/V0aHivr/Ji/AhxSeoqM4Iirt/oyuSPT+pTqR2pQjFL5E62FjZnXq05Cm2Vp3vjnkXB6UY8Phmjf49hdRUlp7ZKBZRB4OSrpqRcM1Tg0WGbvjHoZQWsBca2C9LCL2UEHSa+HcpzAm6UwDYNpJeXhJIHonIVuStws0B/nrp9yJKnWxN7cbd4dDt2cr2OjdO1MNPNqkJJpepF/XB9f8DzICsOs+euJEWOVApEIXByEiAckOyCz6gBxZtXXQ16Ts92NVBiNIMBKs4XD9j7KniRPmJzNN19jipkxU2F/t4329h6qF1dgGwFsqS41sdWf5A3I/bRV5vK8pnO/t3wARUkn7CsmZnxkDExmjaTVljz9WQ50WB3eO2RdQMuM0XZ6HdKDZ+M5w5nMGTmhRCM9Gey0R0demTKEndfDqTT3AsgpXhrC6q7Rnh0L6pwzGPKITo9BVLcOi5GSIuX2TqTAZWqkSOdc0pQLx4YRnzSfnysey4XFO8Ox0YtHrAMCQfXjvFciWdYRw0B14HcJBzRoiRX1dp50KADUji3uAGkn13CfnQcTxCSjYTinLSmbjN47kYEC58EWrj2fq4Lj9DtjFh31wIV/F0O/gvGluv87jxGqf2mdF30IHLPBSQL49QuMevYU0QFi8ZzcteH9hxinVBsoW8P3ffwLAAD//8xdS28bVRT+5o5nxo/YcVLHTdKkBFrUUrUCRIvEAlgAK/4AK/4HEluWsOYHsKJix7YCNgUJlW5QSyuISto6T79ij8f2vNA55157Ype0Ehuu5K3tGY/vPec73+MEADBBSDMsAEaBZh32jUOmpk6YPH7eCKJkYorAOv9E4ggi7Yo9+7BmXTWz1HzZuGPegAyFxMgKJrqIeEqlpu/GsVhhxE19quNlzMWag9fcJGEuPCvmI6sxlIKHNIW5ehm1Cxto3HkIK0gFsGDPeVI4y0FCdNCjvQYaO9uorL4MP+4iHJ7Um9JN9wc+AwCr6+tCyVCWfuAS3pjlQJOGhMCCvu/L/Unm/8xKU83H5HC6QO7QLk8kiAZGBXPVLcEdAzk/QTkiSp3DqDy1rWSKpHTUjNLUvGgY8RSKrMaiyMJx8wDDVoDxYRvjtg90RzBmAZbjIeUUN0FNrTTjKm1+VtKHhRGcfg9qbxfR39vwmi0GUOQZOnk9lqGbaRCA3r7qAZVyGYEzZNf/xv4uXrqwys0Xu4RaDpQ1RrfdwtPtB7iwtgE3V2Ti8/PW7B2l34pM4t774H38ef8eHyJGP0Z7vkcbnXLwxWef45ubN5GvVfS1GqPAF2m9TlunTSbm37u+toLrb7+Fu7/9glizRiw1PbMajSZu3foBn3y6BUVorO2c8I04ddHGUV3Ehx9/jF9/vI3bP/0sKREp0N47xNdffoXvv/2O9VDhKEDraA/dTpunsvT/cG1g0ZPfk/ZOknPQJPf8pYuISjlcfudNXLlxHdu/35dm3nGwcXYF67jjTv4AACAASURBVOc2sbklNP6ti5ewsnYOtXoNbqUMGPd6en5pb1GOTBhs40cumVWSiKAwlZumQh1OZAJlmem4ZikNIx9+r4eDJw3sPn6KB/fu4+mjHTR2HuG42cag22MHZ1IJLlFDky/xlEYNxzwNZPSZQEc2hhKXZ0dJDBylZRBA1Tru8X5C5nBUxK1ubuD1q5fx2hvXcOXaVaxtbuDMxiYzOcyUmc1n/uMT9X9eIaQYWiyVUa+vYr9SRafXZnd2SzmwPRuFhQK8rsdRok7JRjgMGQToByE3iqbZY/d4ZWPBVug1Oxjtt3D8VwOPjweorp/FK5dexfLKMtMeCxzkTkVDJAAAnRVKDslk0oxJ8U/YUpQIqOOPI6bBUrziQbvDdH8yQ6WoJBlXmExvkZeQnINTIyhBI04RNX2Ee4dIdg5g7bYRN9twq0UGgeyFEsZK+5ZozTUXozkbxfKCTOPJ3Vgb0xmavKKp2ZLCcrLOBVpw0GYg1mItbyTFmy0+I7ExMeMJnY04twjfy8NbrkNtbqHiBwgPDxEcHSEZjdDptpCjgioWSRdN8nPlEvJnFpFbrKB47jzifAFx3sOQCkQ6O6hQVzJFY4r6nM3gPLPW0J7TybTZ1hGMqdbDi0kqMQDo8yvrNZTrlJbgwvasiUmpqUUmoEEyA7XqhswteKiursA/38dROxDWWl8iJYkWTWAKZZqnT5pIBzGsFQtpTPI5D1bRZTYRTR552hiN9LRdNLquFyEt5BkM4BdNxfk+mAIynZgTI7urs3mkJKqk5ky2pt97OsFWjHvFutgnKjj5jIT9AHlihxx10ev02aMn9iNgFMOJxWGajAuzenZ+vshXhRh6FDM2jgTMJKZm+u/DEbNahxT3K0AnT9g4LlYhT9Gwlg31jPPM0mxPSWXS3A/WxPIUSOi6BDqNhcVC9aeh3zLQrs3HaBgVv0hU2wuuLDCTXYbOnKSzoWCY5PZTTWqksGYxAPEcSZWR0xp5AFGIbWY7Rgz60XNpI+M6boEnyuxeTh4ARJQnlmLRQ36pAvvMEvz9JtAZwKIEDNp3hhFULWRfjjExFNwcg40ERijtvaHDhqSJm5Af5jXrs7KUnPb7IXZbEk8lkzKht1iCM2OL+eym1Lz/WKbg5P6PUYhwEPA9GZP3UdFFSP4wyvhSJFJYJFSrBqjVarjx7kdo/PEA23fuwia5w/Sbz39mCowCkjQ+hLtVxVatwH4rIk8yk1rAiGWtGT8Ofi4U5pIBZpdEONoTg7osaE//GQL0YgMKUO1gjI21F0YYm+lv9mzSzbc1rTq5j4ilcTdO9c8zEOV6xc5NfNCyKWocfj2T9V8slrSBXCwD1hnKjWk8p1F+UzDMyiTMceSlid6kib6tGICg62VDy0HAlHjTvBszwKwfh+kfQ50iIPn94VQzr6QHNJ50IgM/vZoy7ANmcmgnXOMLYCQNxMLlnjSaT9Fh9oH2waPqhlLeTtyfjAGp8YswjXy2/6UeViQGYhwonyf3POsBw9eZGZYbicYExCTmh/ZcICCejOf5dyemUZriH+qupbeNKgp/c2fGY3sS221S3LQqiIYWUCuEWCDYATuERKXCCqks2LBG/APE32CBxA6EVCQkxA+ABQuEWKAqStM2fSWpEzuOZ8bzuuicc+947ECrbpDwJlGkeMbjO3fO+c73OMYAkEVezE62tvlUzbR2qszS6qTN5I1v+mKGsLCjuBJUrO7sX1GNNeayHeceTqUYPRX5vOGLfXASoOC7YrDBLvJ1VN3osKwjq6A2Qm9nqi89oDwXkTGFqC8A+x50WeNsKoYpoYfw3El4Sz4XBrmcAE+flblxSVcURyP8+ftveOvKujEuKg0TQTMlmHUvScEo3yQaY6nXNoiNrm4aex4cZVaI1pkKH44oXNQFQqZTRI/xAp81o0Qbok2j6TWRRkMU+xGmuyPo0ynrun3Sh5Km1i3Z/M9GCfL76QJZnCNPpojGEQZbD4BhAhzGrBsk3TRHrNiAYVM0kzicUOlKQmGYg36uERxOEJL54dZN+MMDLBO9uhB5QNW0GTDekBMqBkCbAIBWG72lJUw8F4Nxgr29HYzjCL2VDtIs4mKbig2nSPDo7jbWRwNgJUCglszN8XQtFBXWVz64ip9++BH7t+6YvxqNHjUDSYQ/fvkVP1+/jo8+ufbfZKb9yytc6+K1N15H8M3XzNTQC6AW3Yrfffs93rt6FZ3uCSIxPt0BXBfrly/hw4+v4dbtbdy7fU9SN6jhyYCtjb/Q9DyWoOgiwzJFRVKBkWcIycVdi5OsChTWL55Hf63PRorU+K2cO4NPP/8MowcDtJdD9NfWsLK6gu4zp6TRD1ry3WVFlcduIUMqi2gN+7Q1O7MFzPRRG+1Yk5Rw019q81OiG+j3zc0NDAb72LhxAzdvbODhrW0MdnYxOhgyvdfLNcKgyeurBRdNQviTKTf9Qm0t+EGp2VuAqNoZ3xcpo7gZRlGMEhN24Cd35fMXL+CFl1/EpVdfwUuXL2Ht+ec4y5myiEVTnrOZHD/otXU4dmpxY08m3f+fXnYqQPtnp9NDb/UUhjsPkE4naARN3ofIAK8ZNrkYJGNWkk0QM8unvM2jwhSwMjFmgCdV8I6m0HuHUGdTpOMEd7d3sTuO0O+fxsleBye6IRo+xVpCzGxd2dNoyq7rAAC56qcZjqIJ78OTOGaAdZLESLIUeZobTXsgVFi3IU0LQcPEAJsmyCn1xGlAH06gd4bA/QPg/iNgb4gWUfPpWUiFuB9I02zp0Ya2Srp5AgiUMdDlqFT7fKdjs+GtC7cI0emv8h463RuijAxZnyczOaejQJQTDGzkNDkg0MFVHOnphW2Ueckxfd0shhNNEMYRvFTcvTn+rt1EQd4CVIwHDUTtDk/6ibmQs5xM8USyUHKHqcf4SsybLB53GywZ3JHrkCopZlu9LsJTXbRXl6FChaDtmcm/UzkuO3o2RKi77DNEqyVJhfwSqBkOz6xg8vAQ01HMcjIy6KXJI4EA5HKeTVK4Scn7Jnkv5GTcWyzDafmS+awoxknz9D/XpEfNUAQ5ilbGvieOAQE0G42KHtZdeGDYMxTzUdecpzTnVX2tZwyzypwql+YqGcccT0hAe5HGiMdHSI+mcq/QQEbJsWmq1Gi3EMcJD3doXyOKq1dkbDBaTmNO6aF1q0iDlzvGaO34I06m+A5HmNIxaEHyFNnUbARENKxrf5PkZ1LQHnOGL2WEQw1LWRpgwHHQ8gOR9i1U2AwyaClo2WWfY2HU3LTMRpstOuzXj6uM4WJdGvBPr6LW0KAmRaF9vyy1oV+LcRuBAYvXSNdMzCyAMDMXmzVIEi+mTKSXDGayacpNOFGDSb7HBqmF+AmBaM3GpBF8v5UoGy4yT+JHG3RLRCl0egBNzWWawSNNddhG1mrBabpwfOMCTbC2uQQeyQqcTGwzOfYtfaIvDH9OTrCReF618B3PfQWPeTMeFBBlsKGgCE+Np0gmkSQrBC5LicpWE6kH/rx8vhRvSSyG9Aj+2TW8+f67aLz9Dr764kvsbW2ad659h8y4mB2TLs3OnQH6m3dx9sKzLDMkKS07iNa9JKwumxo7w+ZhAMuwiy1IZP0peJKbSzIZN7Q81Tdx5tb/rBCqtltLs0AlKdDMxN4nPyE209YsHUyy46Acr2GzduoNPF97JbXDYjrA3HVXEj1JpnFUq1ljQCvRtpKBgqRsOp3v+8xAtjDecbb5tD0jnbtntP62MbZG8Dnr3V2Tja9NSoAY9XE8O/c+OfdfRLmv4kZtVj4x65g5KqAN/R8dz7JUeGCsHEOnt5+hrDEBTPSoeS8bR8jmi7W/MSBjaPd8bVm6IADGIoPIxvGJZ4CwHujzueT5Yzczsz89LiGGrlO71eY9RUwcjWSE9jQjG6qSBIjdxj13LWHBrEc2TzbGkiSfsGuP2Q1K4W8AAAD//9xdS28bVRT+7rw9fiVpm74QRaQVBFWiWSDEApAKLUhlwYJ/BD8BVMECCZb8CRYsQKq6Y8GjUIm2aZqMLZI4tsf2zKDvnHtnJmXLCm+aONbUHt977nl8j4AvJLfSweHVz9SToMIOFDeE67zozfDrgl7eVBvuVG8WDdBScBMuya6m79edmPbr0IJCwKrlu4XEbrqcM1XZ+LTbDrAchoXa+DFQ+a2umgTWYoW5pR4odMOT6frSimzw9ewyrcRWJpT3GrXEaKSbtFyg2++LQWie5OhcGOLclfPYO3gEV7oyaMUmwqwycuDl1VymsW/d/ggh1fIDFegwZdNY4CbLsgwXjy9is9yspxbyxZQK0fdE+dZrRIxQIZFDvHreYQU5Rcx4Fvi+1TTQIkKEXUpfxKTGjzN0+nvwohjB2Z4o2CdxjMP5VJK3+lqHnORmGD87wOrvI4AThEL9AiVIGVVh9a2FrW+i2jpDmjmRhQax8FusEJ1MEe+PMP/lZ4RPdtErc4RVc+9Km+JI2lOViH1F9fLZLjn5EfDipU2EaRfBlH7nE4zHY2SjDOtn+uhTlX+h/DjCVSfZU2SPH+Ls2jmyQGWKCNPAwE+3AkwNQfPqZ1SzgfD0d27dxHdffa3q/9aaplI9aRE1/Obul7j14XvC0S5qmor9/GgSEtdB/q8fnH5SK+LGGzu4/voOfvrhe+udqosz8oCTArh//z7u3fsR79/+QBE79XLzWqmdY+X6rd+NuD1wWn3zk48xKVb49vO7+OvXB+gyIBPmLt+jWmkFpV4xtU291XGuDaFBjDfffRs379zBte1tmQ6uUSE8HeDC5hVFJHiN4whadmxGM5F6Iq5oF+VJJSZWI7CyqMWfBCJPpWjh84cIhMtaSLONAnvjbB/ZwTM8ffwID3//DY8e/Cn2fNPjCZbTOdIgEo/vARtQVSgIpmhZyZqk0OTM+Tzn6mxQhYkU+8JRteKl3H+MO731IS5vvYxXrr+GK1e3cG37VZlC8/mQcQWNR2vpBLKMCgoZW/jXQNz/WeHvHk61md9tmqY4e+GyUEiKZapoFiYJAdDpJcJXpVhZf9hDtVTofRwaeDMVGxP9DXIHafU0XSDf3ceZnRsIkgGecYqUzbB3+ARZuEdNLHixQThMEbCR4KuWCJWxYQ9c8WEmF9cqc/O5Wa7QcClMeU5SYR3USWERHiIKYymw81mOxWKKkhMNdhnI89wdYzCaYLXHyT+V2MfwOpWIXAadDmbkECYdmKDUZrEpZO3SHSBKuygI8ws8a3UVqAOCS7JDH9Gwh540pjwcFRUOFyPZk9qHroQzC6ebzWQgVE91np9iK+x5mHsFFmGCk8KIa0xYbMi55ry9F65g5xSW3GQTadHvqkTGJIeghUIPNedvx0P9Xfa0nYbXvHbxK7fUnCAQfZ4lxR16EdK1AQaba6JcnnRjBLT85DtqVagUttOb0qhkF63kt7RohBPyPwn73Bgg3hwg302QZxB3Dt4Lct89cSpaqVVdtZJJf1RcknvPc6voBPA7iVqdVkbsTbGosJzPhW9v4kAsDmnTRqEvNqo51XLCWDyvjfVeVwl1d2ccOk6TPNGAWClElt/+bJ5rsks456JEPpkq+o7FSaF5Ebnc/BwUlWxyD2DCayQKr2fACfIlumwcjMY42n0iiKYOYecyXca/1EOKstF34mO0t4/l8Qmi3jqCJJBChdSobpRIPPV7gegKucLEIT1EdkNgtzGm85mK7NE6005JyaGHuBgkIp5K9E83TW2MVapkKdMwr4YZyyTNoEEF2Im52Bu2+MXO+cmJtLlH1SrQ6/hU0y1aOWpt5ee1OOA2j7C21vxX+LbzhubotQZbsIUTiwNIYakW2eJ9H1hFeRHbK+x5pghLyXPFZsxIQs8VfTw9QrikV3qBstdBuDaEfziDt5oiZVPuYIIyV7X+zsYaoiHRswammypF17OWqEYbTUINgEhOwTPBKRRH+xwSPYZCEXCV49oX2hgxdv/5rfuFel03E0rnvOMaSHL+UnlwtsLieCpUO9p8rjpEPyVYklvPhkioeybiOpL73Uf36hY2tq9h5/xL8I9O8MWnn2GUPT0tYlo2QzRfZKuB+QQYPzxA9scuXljfQJks1RmImlbVygocW80xQXkU9fCyMk1zB7Z2cVQy93mlVuK6D9QKvUaUUM8mUAE7xnWuUdYqohdArvvMTrPtjKwtEOdy0apG6QTinmB5VfVr0I63pxDWsPtLJ8L8f93PgNszjR3d8rnGgytKHQJbvmtYqjX1RTpp3Thoiwo6O0G3VyQHt2uK99az9VH53DDYNRXY/PItmgK2TnPFujQHWhx7R2NwuZlrHrQ/v9uTvA4vyT2tgoKhIhNaFIs2NUjOLRvIXAxRvS4RfJPJvyIKdW/rPXMI+tP7oaanO7FBKlFFWjc7FIRDr1Nvi+vAITdyIoXiWOo9/l2aKIwptskQhrSA1vWqtW1L5L4s8Q8AAAD//8SdyW8cRRjFX2/Ts7QTD16wrGwQnwi5IcQigiIuEUIgJA5cEH8XEnfObIfcjOAA3JAQSuIkOIoT2+N4xhlPeqa3avS+qprp6cQRHFBashLFS9o9NVXf8t7v8zGt0lVph/704dsHbWcgUhbGCqz9PA+yKq2fv2PgBfJvrvHDKCNzqCb/1au6MOs+rTqspV5o4AOyFRybhNkFlBup/0x6olULhAixECD0f254no9JNpl5cxjojcdod1iBUULq9joN8Q2uXjyD3T/v0+4LK0Z2Kl1rftzf+RsPd7axcvaiPD/KiaRSrbSURCo2WaZpw+JXCae+jbJ0jWexNKRHXy9yzG+kMEWA3HzwrGDBQtQCC0r7T0mLbmYSHE+Oxri/tS2zYaN0BY1uG2UjkQphkiXS0WJnk5K+8dEQ5WAonVc3aEknwWhhRAYqwaJRLNTlT4pBCOXflO+NYiwMj1Dcu4dgbx/tcUyeUiXlLOewPdKd5ax/T0MAeSCsLZ9Cd7GD0tPU26jdxHAyQm/3ABuvvjK1I/BrW4GPw+M+du7ewvLGZbgc9/YMmf/zLgGG8PDutHHlg6vY/O46+nu7xumvx2x5uueLrRt/YXNzE59/+QUKlQphft7TZo+e/zF5c4GltVW88ebb+PXnXwTNJfJRbbMUGf7x8QTf//At3nr3HURRG8rRVXrnX9xXw2+JH558iQ8/+xTdhQg//Xgdf/z2O3oHeyI7Fb6RmSfHhuj4SYa2BywvLQr1//1r1/DeR1ex/tolkdDqYMYsBGNJmI2JmpITdPe7UtgT/6sF84iHuDCk6sLwRBzLxRM69dGTEXp7uxgcHuLO1m1s372NO7duYn/3AYZH7IzkiLhXsbKdFdIR65hAy5KOi6yUDVeq8IWmvHJD5Qxsp9nE4HiE0mtIoZA2hovnz+HchQu4dPl1rJ9dx5mN81hZX9XjexgckJMhZH4lfle/2vF8gUqSF3VZ2a3AbvwQa+tnsLj8MvrxCJN4iJDydpXJOMA8CVFmtPyUSKMOomgknJPQzWVfUYaEzh5+yMT98QjFwSO0ul1EYQtJEAh8kUGsJPGKFf4BF7nu+KCcJWOuazSxhf6Tsj8rpeM83cBAkTwtc6fEm+s4TwqxckkSwqSE5w25AUcJGv0h3J0evAc9lL0+wnSCcKEpZzXtY/z909J2STPtHfccUczIiCpO1znhdSpcA+laaGvOBYtSCjje70sAz4CEICcW9CCJhA4OHQPElfceJfauKVia+d8pHDypwLCmNTrHMe5wXQSx328nJlR3ljmuRF3BZr3OVUCbnDEa+pQHObyFEK2Vl3TnfzGC1/BkDJ1YespZadd2HmfgQCoSZndSGIkBzzz+nfLqaLGD02tLUEt9DPcGyOIEAYty6QROohUnLPYWjzKoLJXlQEudu+wAp9pw/RANr2WWi2SfkqASlqziHCmTsnGKyeNYFIGUuTK45H7AwC4g24FeUQOPqu8BkvCWRnLLmCHPxBcvE1Do7eaGmxHS5UmjQl4nSuYNVI7qE4ELl7qzTCuSFKu4BpICHcJIH/Yw3r6HpD9ASOhVfrLtqKpCYHJMvzUTff7/aaItEPyKhow5tWqHedCb5hlo+bJMFnJcM7UAYrNStlFiEg89nozNm1yDdo0dgN/rGiZVaYBqfINI4SjV87nF6sj3IWeCp/MdevcEyf/zrnmPs7ag1hOradJSqKdsm9b/LwoA2zipxOB8EFot60vnn/uIyLpLk1y6RtUiU5aYqGjbaDMIEXRdqKVFjLsDhMMJJoePRQWksjGKeAyf6h4yq/ISyUQhjSfIfY6KNdYn8lWidqWgpr3u1Vk4trhikx4yCPRZaVkRulln+VT1mLUez1uFgGd+JotHTlqgGMVIaJlLMxGeFs0GVDNAEjaQMH5v+nrvDQOJSQnJLpa7GHLCztJpXPnkY9y5eQPffP0VVBpr5aDs0Wr2kpeu2PTSIsfB3X3s3+5hdeNYj05kYa9U9e3KJGzuzLZRnVr1jOSyqO3YdpScX2tY2ks4QWYdjI062TckfGEDsGhbsVHwc3bChFDtqcYyTQUZM16577rapZpr1VUwulHkPLWmrd2l/hqikr9ZCbsoEv7DqE7b3YZJlm2Xmz/Lggp5xXE8JfDPvTbu/L2yqKJwMlNOJ/uaplcqsg2MDZvNK3I9DDSwfk2768YKX99DrJ9fO1R0DspnZnkNs+KQTtqr4w3l+XksMet9jfeoE3gNA7T2BCmQuA6aXKdmj2Hibxl70wKbmYI3WwPmHvn8HAf/AAAA///cXV1vFFUYfuZjv7e70HbdkgWKCk1EAiZgogZjCDcmxoQLf4L+K433xjvDDdFbLzQao5RIKFjaKraltN12v2bnzDHPe86ZnZ1S5MYb56Zp0u5uT8+ced/nfT5SACCxxn/5f1iqibDOlNrRpoT2kpunekaL54wCjcmK1eImagoocK+rM0hg4AVT3zt01YEJ6WdKcoewkwRYOmn2EufFIEzpFm7BSKUJ2CWFL6aHkwLlcleJppdbMyi3yjhcH6ZxUFJQiVc0hFLf63fx+7276CyelxsyGhmdj2e5fcI+GA6EBXBmcNY8NDP6GEOL88Tkieteq9aPmLHANgyJc6zmZusPZZKJuXnJCpezeFw2dB6tcPDsEPrxE1QZOdJgFrovbuuDaIQh2RCkX1EyoRIrOixJtrYnWiKjsdT2hnG6AZVlLjFGqlBEaZSgOoxQ2jkEVldQXFtFhYZe8aQlVrYusLeqiULUhuZDcLfkA6dOlnHu1Q7mZ09gGBvn2+4hXW9DKTx2N3dQ67SNbwIUSoUQNeVjc20Vu9tbOLk4m12t6bXLraXbNaTvwoITV997B29fv45vvv7K2Ml52rqGG90N6b1ffv4Fbn70IRoNFqb+VIWb1XD+F5dspyRGqV7C+x/cwJ3bt/Ho4Y9pmIWJoDEM+m+/u4PPVj/FpUvtyb1jYKUX7/84QiFkEHYfYbOJm7c+xptXL+Peb7/i/vJdrD14IFOg7e1tKUq5lxbabVy+cgUXL1/BW9fexeLSEt0lpfkK/LKJZvISWyA8X0E3saCaLuCNttCgzYnQmnnPK+ztPsP25hY2/niMv//awPLyMtZWHuFwp4vu3j6GvQMBPGjIyX3S8LQ0XEUU5eFKSjkTBzj5IlhH9JsPUk43Gd8mjb82Rj4EGGcWTuFEu4Vrb1xAq3Ma55cu4PS5s1h8/TXUmw1UajVh8rgHRSRypSJiRjDZhBWZJHpHKX3/lkH8f7xEnhEUUa3PoLVwCrsb62LuRMZaUiqiqmsyBaTJmRiYjj00ZxoCbFY52XRHEIsra2qk9w/Qf7iBE+0Oyu0aRnRKpvyJme9+LAkd0CEwMow3j9MdNZE18cyX8843/hF0Ly5YvSQnYywqA4K54n2jZIcyk9/U9Ca9JOD0cq8Hb5Nn7ya8lT8RPN1B2N+HF8YSyeWaGL5hrH2b5mEaakoDWJSzQeSU3xTX/uTstBb6gT3ENM0mmzPGYImsO5Ug2uulVOqQoIX2rF+LtpN4JYhrGvlGAyttJjXKNraeZfekAF2gM5n0TmuavZPtZDRfAFqTtiDHCHBAn4RZWp0l/RnCuQYqczOozjdQadZE/sH/W2RZgcYs0D/CLDbO/4kA44F1/+b9H3v27/aNt0Ofeup6FbVmA3G9geSglwIEHifNaoyiGtHOHqNeD/4wEXqyH5FeP4sBz6CKDxWYYpMSCYJF2sqgxHeFjR73bTJGtzcUWndoGQCkdfs2l1lCEjgssIVsOim08ovUcE2ZiD++Lk0ehQlGdkgClCsVed4LaBmrVNIiyUkA6pUaKlyvQYRCt49kYwv9lVXEW9vwBn2pV0K+ZjRAoMdGYphtcrJr7Pliitp9todWYsCWQKboAYp+gApTFTITJylo033nnPCtLNJ5PzgpqR0yOS1vaOnTJnraMMACm9ueb2D4cwQPxOzrOQ8X7jWVRjAfHay87JVkEhKQ0U+7Om6sx0eiuvIAQnZtYE3ypm4XPfkqE75oJBILrgfRY3prCWuJMo+Sh3EpQMhEgNkI1VYf4/UniBnR3BvAZ2oC0wRonjzPs69mkpuKhllEQ0nub+W78k4JVD1VLVkAIP3kOifrUOa+VO45ltkwiWVkTK3BBB9K5Z+Kg7H9njHlZCIF3eDLZahyiDGd5emvUi2axBRJxGHqiUI8W8eh72MfwNyZBdz45BZ++eF73P/5J0SWmj1V7njGX4GM1IOnGqt3H2P+YgedV2ri9SMSPOvgrnNaePhu4KDTPZUfXuKYxtt9H2T6n8ke8qQJ5d4Vlo9SwioTIKxQSBs/6Z+CAPnLTYbh/CUyIKufe7+pxj3TGOeL4xdFOWYv93fxfZSVN7zsrXV07RKR3xG0c0NeFw/oMuwNswLHSnyzQ22ZvyZKzt08aCPDYrtuEkFJ9hT7EOsbcNxlGvH8e5rP7T6RgJDcZ6wZyJgQdswEEM3jCy4dxL2+2T8GvBWQhzVQKskwvyPGiQxji0yva6RP3sQrOwAAIABJREFUVopQKGLUM0N8slL5O+71kiTBP+Rd224bVRRdcx87aZykNURJLwpUDaiCx0pUAhUeEOIP4F8rnhAgEAippWopLQm9pHZi4zixHY/nDFp7nzOecdJKSLwxkqUoiscTn7nsvdct9KxWxX2oug/qmx1dxk119CBMOcngQkgeom3O+Xtp9I1f8wEg9TDPlNddvRhqzb5Xp6jIyRgoBal6kpRNstAFA3HqjqKwRtVwxixK/6hPcYTVwChDaywoHgHxfOIsjAU6zzcatug3gsDkY365Bitbl7C69TYGz3cFYQl8NwAw8ppJk2Jw79efpClLSOUYK71S6IRZXmrdD7tdpe3ZDE4j1CI7frV6VhpAkQJaSNzJ2VPRWGdgadIZnTY6RjLLEDWZPR7BO2WGdiZoFPc/6PUwGA0gXHtxT3d0OVfdGSlQvEhNfOjIbeBXCjxXBi5CFVpPB6OJTJ+j/R6K3V0UNP0b9kV/ViWbu8bYLyqokp01c3mbEbD51jra7TUsX2jCP54imyW42FqR/OGTgwE6L17h0moLzZVUwWTKMcCoxQE6Tx9j7fK2IMzqBl+cY9ay+IUayV2P/ARZMcPG1iY+/uwOvrl7F6ejIabZWOlmtlBlysDPP/6AR/fv4dZHt4SqR8mBVzZx5pzP+C83I+cnIxtv3NzB7Tuf4MnjXySn3m3U5hP129/r47tvv8cHN2+/Bvn3zz1WzzrsSl5+nkmhu/HuNjbeuYZPv/hcaKiD7iGGx0OlswJYZ/5+qwXECZAu63XG+Io40cZI02vt/isnUEWzP1+fWXnWuTsBP7PX7+Ow18EfTx7i8cMH+O3efXRfdPB39xCno7FKg4yP9aUVLBPpi5cEFaNRn9C9pmNxZfcN0cQUR0dDpGkTB72eas/ERyNHRlfi5hLaVzfRbrexs3MD169fx87Oe1jbaGPt2haa6y2ELEyZauGrM/cpydvGlPRbeahAc33ZoAZCWPdFoFBbhf9h8+9b2iAk/ibB5Svb2H3wECeMJfNORWNLg8uoaSmKgSeJJqSBp6RVe1Oa22MqdElfkGNiBY0sx3hvD/H7O0jXV3EiBlixFriyo1AjdFhUiPlSohG0gaaBFLyhiP5P16ya5uFZlItoL117VbsL0Y2LkMaP0aBB0cEAxas+Jn92EP51IPGn0fExTD6R42SmvBicefM2y7FhBCGlPjNtAKF1KHZSI8t/8cQJft4lCAofB0jjZbTs/vrPu5J5zYFlWERy7rlBgBQL7ubvmdr9uCqMMpVCXdIASnf71yxqKdmr/9qDi6qsRGxxUObroIXyHjr9JzTaa8ZY2lpHsJoIUi6638IyGJwpXq359xdbVGEByFPFqzcbYlxGyUOeoeHTFDCFnwQI0gTBNIaxaAsbZT/XVJ6UKHS2L+sdyitHilVEZgmzRoSJp+yPzFfZEqu7WNz2ncu7RrAakRQYYcuxXgqoJy+Zul7JqODfhp5f6meFFjqdSe0ixl2xZvjTT0UaQptD7ZBJz0pUHOqaeiHSGdAgyt8dIH/2CuNHT2CevYA/PEJklPrLVABGR4p8UOLnzt/4/08GR5IAQ3mEFza06CQDx34eIwUDS+eqPl1c00HJaWJjTaXBJSMgjhTxl3jqQNORLGVfHNGtM7/obReaIAcssYHiEIz3cScBcPR8zyYvCFL3r/iB9c0ZORbFHBVVB/W89Bk4axu4cD0sILKsfcJqbro9VkEyGePF6DAooMRpFht33jc5WD7JMsRkyFxaQ86ox4stmMM+zNEQ3oiSgKkMpELK2mjanDTRoySWprmxHuvUjAWcKSzDxrfRwu44wzchurmxPhxa46u5dH14lDs6tENrRU5JuZ3GRnpksA5HAL1zxFeDzssR3Zflmsw49EhCFGkErxHjNNDKgKkuk8THy2EHveyasJCvfHgTX379Ffb2djHpdsrGCxX57kwYnRB/n5dP9/Hy9z1s3rgKXMj0JhNUmn/vfD+pxUFS1fOhKLwzvgc61Mtr73Wb5ssHmIwnpWzlZDRS1guhE2/Bdb5ijOdMKEtfCZcWUBQ2gg9nBl7uOpynGTgmtw6W3TqV/mwLqWyL+5NBRagGepGNnHvTtjgYcUMKHXRqsobTt0dRWPafue3RxDNiYSvXwegzSqSUVgbs0HhUfpbeicMBSkukiSZr6Oxx18z32LMyMrPyAJTv3sre1D9v/v9JkgFNuiuMCu2959GApUeAvVHKc9L2rxotSJk6a1b93nmesM7lUIA9byk7ypSB6PpzBeQtKCL3pUhZ8wD+AQAA//+kndtvG0UUxr+ZnXVsJ07iJA00TSktaiNUri8ICfGAhBBCPPDAPwgPPCBxE6qEKvgXeKESStv0otK0zd1p7Piyu4PON2d2N1EvQkRq1biKs7ZnZs/lO7/Pye2fSa4NXQjO1RFUUYMMqO+kdKrlCelxrLAXSlsLJULaIAuUZNU6EyRakWhvwuNxA0TJrhwalix9wwu1JhYPbNmNpXXWJEgbHP0ji1JNIB0jyuwLH8ARcmimU+XPyYdZ972Mi9e5tPwg5LAYKcjG6QKUjjhUYiHWHLSzsWFmUHylTeM+8iHUm9LCyTwPCszC4NgX2H6wju3HG1hYuYwpsbAbmUAsl/NaZFjeYHTUx8HOHubFWkhUAMIrkESJtiwWY5nzmu9g+dJFWmGJPDGJXVEd75F5ZbLfTYbB00OY/R10svOQ8evR2MO12rDi/erFhspiXIwBIf4GHDmlTtWboytPFopIaKEVXgaHpW9NNO2nywDdVqQin1n6CS9IgWPzCfD3Oib3N9ApxmhqEBFrDHGWO8yj+pBgcs96dvOaHriw1MJbl1ZxZmmWB9pUw6IzZSnjnW9NY/+wh4OtXfTPH6E1HfzdRRZqjidojHM8Wf8La29fBRYvMBlj1fBUua0qY1SPp7T1yFXSC3zy+ae4fv06rv3yIxrGlD9lGEbLLNIQP3z7Dd597x12f0Rme2IXV8fHCw/C53+9uIAgFT85rBbPdvHhxx/h919/wqOHdwAzZnGK4X6aMBD67edr+OrLr/GKFEaYQpwetq8Qe/FL5EheI24v8jUEb1WeCa0mXBNY7L6KxXp1vbTtCn8xhZcAjrN6ejPJQyAsBHMvYBlkWg0IUD35fjwZ0l1AClu7W9u4e+s2tv/ZxN2bt3Fv4y56O9s47O2HJFukuSbFDBIsuRkFhDrCsSSgFGWCdJKY1I8LAtwaqcXkeEzoEeFuOwfBxqs1jbmVc3j98kW8cfUKVi6cw9raGlZXV9HtdllJhQStZa3O83oTZXmEGjCCzO+ETZ8ntFRxQiEJOl0CfoZl5P9ZHy9bdy/3GHjZ8/+36z2tZMpr0jx56UbGAJZWcP61K1gXEKOcuS4USKX7m5kjGAGLJilmBiMM9trY2uuTd+FyKPBOqRvCtNk/RO/WLcyvnoXrzqKXpOhzlMmxYJexNZyw6JlRheBKZZXcmxxpwKFzHGWxpW1rHspThSbiEgy4dAoN2VMS+OwdYvbJAIObm5jcfwS/ewDTH4YgXDx75Z7FAsQ4rHifUfXAzj//yItvwadt/ptSVz2DfHS1qKfpoixpSuF+xCC+0U3RMQuw7RSu3aRiSkChLeNYHCO8TYpRZWU2CTZsGvTTsgxBRm3NSUZHEsup3PMnu18l1K22OkQ2G963Olna8JplX3oJutKcSX4614Cbb2N6oYOk22Twz4RCzmXtbkHZAgIntCX0T2OKCAv1USlk9X5p9d5aOc0InNO7Aj4t0JhJMbCkigTyfNriZ2nHx1TQScFXPNILYe5kQ5jJEVrZeRSTZZjlOaTtFH2RbJPSH8BcMXbiqL9NVL5b8CyMXW8yARRKxz1RqqLCvV08sz0jQJAXYclGmJTzxQm98XOuVQm4mYRFN4TcoD3VpDWxk5n83lNkj/cAFug3kW/cQfr0iAm7rEUrLgImw9iF32d1NjsWYUtWQ7xT9IfYevAwBJapIbtBXvHsVBtO/KZl/MSxQcXmCKcJtbGU+FBg89oZrkvnEYPsGOuhoC1lTGiYbPICtNOlqiopTJWU7UKdWUYB/EUImQ8uMPLygi9DIMqbiqqpyrqYzEWosTan6t1uzrgXFdW9CLGMUcBb5mV/P698onPUdU49Y+W87JpKAmSFKaLFoLwIiYzRfeM5qqEjpcWE7weZE/MtDDtNpAsdNM8uYzIYIBseAP1D4KgHOxoQWO2QYm7pDAaM1QvkSfDTp6quODmb/7yvUs1hNEEiZCw4TsT3yvqiyiWgoN4iFDYICS5MWJ/DHFYsng8G8MpOkA6m0ZBEkhr6gcjUoDQ9tTAhIZdwE3aP93CU99Cb7KObdjG9OIv3v/gMH9y4gT+++x5+eFyOpBRqt+z0fi3PnI2Ae3+u48qbl7Ewu0AuCxWKDF5V+VB2nCMbIqo+bclHqNZDEbgr3lbJo4GOn+l6SoKPF8c8jAuJGV0w8sCSEEtNkb7XE/GiVlbiej3JYQvJemymxoT4FKsiqZQp0c3AKiegLM7YKhaUIrhnnB460sGJLadTB3h2uBKYF90gJC+gbS3vyfVCV1U4kH0Zc7t6AzgWAwg4z8Tye8T3QhRPhXbC5fvCBA5H2SmvSw70Ma+AGlrP6n06JMbiIBU+CzmbyVjRMb+4H3ld0RKRxYhqrIH3JPXc5+/n/4VUSc5NWWfkvzGBl70bHotwvrqFI5XPzxiRlzhVfp/kh5LsD0YVtP6EBaSoHKLrA9dfABRKwTCowZSRJdflgh2ocwn+BQAA///cnc1v1FYUxY/9PJ7xTAID5JNAVAplURoapKr7quqi6oo/t12hqtuIlraoIUmhNAkjIMkk8+HYHvtV9953PfYkLNnUEmJBMnjG9pt37z3nd4IpzAClfEOlBhyz4nw7pAoIjCzWEnPUZGokQQEle9VFVTDoQi6opACIf6GEM1Q6RmIjMFPpiCcdC/F5yYKtnRj9cGblVPRz9IeaBnTOBPTTC8ieiCSuwf2q56APDMvBXLSg+kVY/sHZlKl7Xz4aUQhvDrj2yRrC+T+Qn8eu05PzwhI4Rzs5wdPxAM+fbeGbtbtoUW6ryXjazpsDlfEUFv2jY0xurSLsCAykRkGGZWni4s2baDQ7SMfDiqSucJIpmYCQlzjMC5y/PkC6sopofZ1j12L6XJznuLBudMJFqmykiK9ULToKXRR0EsHrhuc8shW9vwNgUiEXWYMQPprkdf33DbLdPUSH++gSUNKmF31UVl+pun11OEALdBvA/TurWL+9gNTKQ0lAxTww7EEfnQ3R7/dx9O4Yp/0zzF/rgNdIhg+1MUoHGL3vobe7jZXrKzBe5KTkrkt/4TG7eOhZLa+t4rsfvscvPz/B8fER5spf5q0liUfw5Mef8HpvF59vPqorzGyp0P1oB09HggaI+7Gx+QAPN7/C4cE/cm0cpIeKkiQD/nz6HL//9hQLq8vwTRsT8if7YeXUVN1RvQenh7r8hN4dqAbZPVMS21XmVTuXSOLyTBls6QvhkUsmiqDkExzLBq6Y8OR+ODjDeDxg7z5J+V/8tY23B/t4tbOH4cmAY3/iwYDBZO1GE+2JbPLZbcqTdR+B9ZGkmcvKBb/HIqRpO3VtLU95h2kMP0sQx+QvN7iysoSNz+7hwaMvcevObXzxcAPXlxfRuTHP0lzqwBPjwZbz0g/vimol7uyPfURLyP/ioAIvbGFpeQ2H1xZxfvQ3/FDYCR49bTT98WUT1KI4urkI8/MhRqcpNwByLey4rVwgyhIMdncQ3VlH1Gnh/GoXY54eQiLiAgcxqtFI1L8quczQphh9BwYSoUfrHhforqVBU86QFEhZgUaSIjsZIj94h9GLV8j3ewhPThGOCSInTBaK52NCcq2oYI2ITD88aSM1ozY3tEuCejnG1ukcyhhXUQJMFQEEdw2uNHGFILmNJkzUxPuXPSQxxellXNTwRMnKpJy+B8pT8aafiGcFGjh7I5eFga1Mydzko56fffHg72BDhWEm3KQmJSgG6HQjtLodtK93EHRanPShHQopdlAOD2Te70PbbrPPmq74PqaSZKOiXTrPQpQdSRxjPBoI8JNiwNIWTNHmf/dGBXyKU6Q8dfJcU+0Zx5i8fcPNX9sfodEfojFeQrjUhX+jC3L1JKRmoMVH8RI8fbbyN60jnhSwphK1pZyiKnivuiJLSog0ymirEGhcciXGV/dhRSb7A4rTbMQJw/6C4wGK/R5y+o5+3YN5d4L2KObJP2fLQ5hKvg1gz1vMwyk07KfyeZZiBSuQPIpLJSVmc76tZ8pe7ia9Xi5FXjbznhiU5mxqoliQfRg1XiZFXjZOBc6VYEKydZoAT9Qzr0VPvaE4a0ulrxwuhjiO2neFvXUyddd48KWZMVsQKRTwsqOctHq29HPr5JXlvrpfzes3ZTVWTX9fpeC5YxwUZZFmBKhXgbmpmoMTRwIBVhpPpMjUSOT9LikRr3bgJwWK/hAeWYJOQ5jzIVp5juTwPdI0Z7tkp9Hme3AUFBjTZ9siFoA8PTmDcE1Nxj1rETaseNPLLuuy1aLT2SVZ4ZpLzCPb8NywR4v/0KVFcWrBKJH4TbpfqWGTFzWVEVPtGVLuyzbUeHy+GbGOshi9syMcJ32sEDQVTSzc/RTfPn6Mna1f8fLZs1KyrffztJCWe/HN7gA7W9v4+v49jiFkZYS7P2btxR86ylSzQjbJs2wz4zgQUAWvkal64LSZNC2euKJYwduX7TYKZ2s2Lq5xwko2KYaNszarikD/79p1NNJA5Lhdugc9W5O8K+QOzspVrduY7E/EfQexZHhrUW9EwJH4xbYzLfLpvdK9y1GWlzAh9DWkrhTp+sTVdAxC9D1E7ehSMKFaaNRfD8/MAEidkqUhwMEq1LIK6bzM9qCMOYGHSm0qgwJtFspelxUHDpA/uz4pJJEtQqTUJvAh+fwZwE/xxkqWq15nVWdIs57TT+gcVc1ETSTiWLl6lUGKlGRBytuELOw0rCfrInUH5fVISWCtxX8AAAD//9yd3U/bVhjGH/vYsRNIKA2kwKBobCqjraYhTeo+Wk3azfb/dpdbpU6adjWVGzrarUOdwlcbgnEgGH9O73vOcY7dSOvVLmapAqkhH/bxyfvxvL/H0SeGF6CQEAFOohU5UFfy9YXT3oRsGcFEx9rMkra/oE3QsbkYYPrwmwuEZSeq4psrQJ+ZnOtigLAnF5EWqSm1YVCDbZVSjIQCf/XlQM9P75HkNNL+IFdgPSkrY8mM+t1WN5H+YuGLSQUKcyEQcrTdwM2NJSyuLeF4sI9UbXIMhFIVYApKxmmMnWfP8OU338NvziOi7qMtwxYmsOYOS7eGp2cYjcZodLyyEq6rvPQtRC4Mq2vr6K2t49XZ0ACy5KUHqOBKqo1WAlz9fYx48RAzvVuYI39m9vuXVWIQpZgSPmvSpWV1hLmvlaRKFZnSfEkZRkk3AP4pZPHAI7lfGsMZBWgcDxC/eA7v8Bje5QV8K0d9wlkrAaQcyyp92h0rY5DXggA+21rCnY9vs0WXSGWQYxGh1LcYgERwRtoUwjDEaXCGbnQTjvB5zILm8H2/gSAM8efeLnpb2/DmW0iUoZGm3NsVtA2mdErl/9LqfvjoETa37uHXX37m661MXDiUnBEOjg+O8PTHJ/jk7n221/nvDhl4sxd1XmDpg0V8/sUDPH3yE6Jr2gjkDFtK1wcCYTjG48c/4MHDr5mkzt2091ZAGqGozomK+jmbSIJ1cuQJw/SKAzsaeSFy8BXbRp4cv8Xp6Rn6+/s46R/g5OAAbw4OMTg6QnRxyYEl5Wjkqz9rN+BaHrotV/quE5/CcrnCy3tBUWAcXXKyQ4lbg6qmtoUojnExHrOcn5gXlEx25hew+uE6E/o37mxi8+4WVlZXuThCN5Rw5LrP8qi8Leor5r2Of+3o/z/p/u97VFaQbim7LpZvr6Lfv4XXwWtOAn2CAZJCqNlCQiMufgHnxiyuu/PonF/iJDxVCUrBa106d0jJqUv7xM4Olha6aLR8eDNt5LH0hyA7ONUgLg+dTIEbWg0jAM155EDqJpSSjFgA1O0nQnwUQwQj5CcDJPt9jPcP4J2O4F1cwY0SiDiShWZK/olFQOuan1uU+6uGaeZK9ttqtaV3tOLrkEKBig16X7UV+dwqUFG6Qd+mBB+acTDneCq4sBG+CZCE18hEysktQ16VW4kMzimCV2o9ljTa78w66qhfJjT2RCFW6hdtZWinL61qI6suCCV41PUn2X3RsFjF5c/66PTmYPuCnRk4MKbifGZIZRUMbZIVa89xofYk3WmTr8c5liV3/Yxdz4QkcdM+Tv/iHKNhiGgYwiM1AcU0nos8pRl+H9dN8qAmxYQDxBkr7hjtdU1wtQDJ2RWK8wsUZwHctWW0NgB/ro2kM4vIExgXGXuYZ6V1scxKc+UPXcCk/+d1Vyn+/q6MWeSq65dZSBVFm4WUanzDa3dgURBPAN80gUc/zy+BwRAg2N+Lv9AYBHAHQ3bp4cKV10TmUeJtsdyaTCy5c5cU6o6aLuNliWqRYm/3OcIgQK/XlQE9MQ5o/IEBHubj5XUojPhPisNsA+ZYff7CBCJXgFZViNo0WBcgi78VT3J9Hcp1KWDnkzVT2kaqtcY21oXxFzWZN8ew9kTybRsJH8tu01oElFeLAJRIMdMgzyv2cDA6yVK+bZXK2UIX2fT7EFIqTHFuwqDKFHMzTTidDKLXRTIMULydQX4ecgfVFzHiYIxw7xVuoIHW2jJEt8UF7quYUSQsrS8UL8M8sybdHkrCL2NFrbpIJjGA0kPY9Hkod8hl0i8UVoULAFTwoiL+taT+4yJCFsWy+DaFKcKJKnMyBCuQC1vFQK6NUZrg5WEf91bWsSLa6LQ9fq3N7U/x1Xff4o+Xu1JZUJjfO7m+9LKImgE7v/2O5e1NfNS9TzNYbJ9qu8qGTb2laaoI3QkuIXRTPOdlnqHmuVPJXdHSer2+qBOtG49l8ceqJsdQxU/Xm+RqTb9Z/l29m14/9Fql/EiPe5t263XQnRy7meRethAKzKkKFcr1TfB4kpa051xQJJihLhSw9Zwnf9fjDnJO3ynvUZ1j0nuIFQSUAX00VqA4CPRaKQPU3z3H+m/rTLtKEabGQ9CP14feZ0p5fmXvmVgRMoulPMdSVVE6gk0pGOmGO+2B9eIHHdq23nxfdB517k1de3oMj44pRoD5uR09yq/AgfpzT3gCxloA8A8AAAD//+Rd62/bVBT/+dqxnVeXbuyZDhhQsY4JPiAkJL4ghPY3AP8rYoAESEwb8AGYJnVduzVp0/QR1qbx4xqdc+6xnXQTAmmfuFLVh5rE176+Po/fIyj5OraaML05VVwiCn5IqdrB7vRisz0BoQPoQerPT5KFBQJZHLmDPyxWwKqTXLANzMzOuIpJN4Ek61Idqv+vWimwZZ9nS/E/DcrrcAi1s2AhryznRagiCvWhPBddEDS/OjKAK+gN6cxnSc7VSLK5C5eb6L1xEdt/PkY2hRO+UdiT59AAHkOUNx49wuqtD7gSTd0jpje4qil9DhVSKJFtX2iK1zVRAGpcRroWSxfOo3/jbeaak0CZQSLQl2IewEtHHaUFjre2YVauoLeygiIKeW4zhOylLJA3VXmxZ1uU+qvirnzFOcsXg0ILEfOJc6BLQdPBBHZ7E8XWU9iNx2hlCaj0kDp+lS7zOoZA+1gCC7OICnFVeGuli/dvrWLpXAueEUtEDjFDKpwI8qTbJQXwDrZHu9jd28flv64yzL2RSzUkaoaIswTjwQCjZ5u4THx0DhDNQp/vnwddt/71a/js8zu498NPnHxUehVWbkQP+PHud/jiqy9xfqVf8tuLV9z9h8IkKQkxOVrn2vjwk4/xztoafru/W6IsjMOqn55m+P7ut3iy/hg3b59nXrVWCv/TmEtuX1SlFgkpEsBKZ8fIkhMc7A8x2n2Gzc11jPbIjm+A0XAPo+EOTg4nHAzkVLzIpYvUMzFD6w3cyWSLFrFCYTGnXB4MBI8kYbDcD5FaDxPq0k1nmJGFUthA3Gri0rWruLm2hndv3cTa7fdwY3UVvYtki9R16yJHkgv3L3PiR8Z16f7vifqrHKZ2rxgWYbSIuh3033gT21t/IE0nCE0DJiBPcbBXPQuuRwbtXgetThthTArmFtOiusPZSjQQIcuTwQ727j9At93Ccr+JVhjjmOz6SBvFnq1lESfV1jmrnnjzUwIp5BnLwWWUJ8xZTQ72gcNjHK5voBjuIR3uoBhN0PRCRFTYJo9wsi3jgqzAzFlYrzDuw+U7a9tZCRDoi/Y75vAxhD4XFeuFvuRLrbVdR591J+IQbb+LftBAq9PCaDjC8f4x8qPEhZKam1cBcXE2fvnXo+zOK1SYuf6ENMyR+wUanZC1HTq9DqJOjAZZMpImAMUaVqzO2OIxCKp9t8zFCJ7szZ+D2rlY1CfQ//EL2ZkIMZIdniDZnyCdPAdJf6WFPiMLZHSBmwZR0UBkYy5Ezk5njt4DBKS+nyaYbg8wGx/A29lFc3yEoH8FzetX2HItjhs4JZgrIeo9g6mlOEIgoCo2qMlE7pCGZm4OZk4IlZ7/nPAQFDczc+4M9Dri+HtJAe80QUjJzvgAs8EQz9e3YAcjhON9hNMEcSrc64T2TaJ1ESqh1UQWNYUqR0UBjwSscnbkAaoiWV0FiI5s68kTtiKEcwaiY6PubeDVHH5K+tz8UH574CguStUQZICtEKGaKDjEA/8t8M92ARfWree5DjbdgxSruLlkLgRi6oBx1EaX9JeChM56SyaqIpV5WZTQuFaPQb26UbM9XEzEVNhQfxaIsFPhp9jOnz9nQocw7hno1onGvkTV9AQDQwUmsktUCqvPfHmfn23JUhuN7hLs4RESUpJnVEbKVMvJo4dop1O0zetohRdwCEfJ5WuvTkEvKM7Ufp7bOktbTylocbLvXAL8NOd7LnBFAIJ9lcqWAAAgAElEQVT9i5NFzgLUfpIJ9ZYKquqQsLAvc/POJcVVcuxxQYBigI3hLp4eHGHcO8FydIqOibF89RI+uvMpfvn1Hn7++hs0suq4bW0OUgQwGA+mePjgd1xbXUEnfo31MKhpd0bQ5AXDqwmdS6Oxdu+WFA8nAuhg24I00QJn4dw+JE+w8sJS7HJxMBTerTWxCdQma81Z4iUjr6nhc1Jaoytq8py5tQpnM5fX1j2r1btCceCoPLYmTkiJKzWAtdus54COk3JKtlp33vtwxQF2vaghDdTmj+xdjals3Ol11AQk7nt9BH7lCkJogMyKuLgm+FJwk8+n9UU52cs6/qrtwe9VQ0YoSoeSfz2HrCHgRARtuR/Mm6gqx5+eZQHttyo+SHpQThi2FGLUY3CrVDQKRJRQzxftjdwccHooOgc9B1KYr/Jezm9dEWVKe0Xg42/2rq03aiMKf77byW5IFlqSQChRECFBCIn2rVJF28c+9WdWlfovKqoWCZqKKoISSGDJdXdJsmuv1/a4OufMeO1An9rHWopEopCd9Y5n5nznu7iVGUuaNeIIzMVGDiYezzx0rkwQlyd4rv+oy7p6mkxm0eYPKfK1QZJqSAHMDR6N4woFYip7IIgt92tJn5cVVVYqu4wnCb9pIw0wi6RB36BBCLPIuo5MmoqWU01gu8pHRA3cYLoKOS1STjA5cNoy2Tjqz/MxyTJ4rQCLmyt49cc2hi/PENEHpwTNRVZoRZDNi9nO9jPcvXsPnmdhXGh4VbmwKSZDORgNh+ygfm1tSZtBqWrRYAaC56F1aR537n2OJ78+xsn+X/y37dLkG4veJjdACGwkh0fInj5DBzbml1fgzM4g9X1QGEpcgmNVGLIwWdYMS+s4i1LTlrQrMR8h6f7TrjspJJKrcBBlQCstUHb3UXb3YL3ZhX1ygCvlGAFy7r7R18SqLa61qMRSE16poUYbM5Vgq0uzePBgAwuftOH4GnAoJNZL8ZiAIPQQpxaiQPKU+733ODrqozXrw2uF/CI0d0Kah8kQh292cPXWGrzwEpd05uBiafWz+sA4arolKEPTjEI8/OZr/PTDj3i+vcXGQyrXKB8fSoA/n/yO7s4u2lc/5TgdWgOkuL7QGfuPL0ZhdRgkFSjrdzfw5bcPsfX0Z6ZSUppCwYANkeRzdF938cujR1jfuI8gnPlockZzvFb1vaWp7xe74aU26zPPKIFxcRLjrDdAb+8A/aNDvHu7h/7JMfbf7aF3fIje0SFT4ahIZ7PJLGNKP43SpqQArcskHZkfahooG64JHZdo/MR6IaZcEk+Q5Bnn8RdMsXUw257HjbUbWL+/idub61i9tYbV1ZtYvLbIzzFrFbVRaanyavyubTXem+z5/xf//3SV//LefMC7cTT1T5VYurmCzqvrONh7wTGgrWgGw/4x7zO0mUZzAQoyHW1HzPrB6ZglORM9V410k4jJxdk5ek+30Jq/jAVKY1hahu+7SNyA6aMTq0RC2ec6v9fVVHM79MUpmimrCjMkcRuOWIoyJoOt0wSj3S7O37yF1T9jjbUbx/AnCcLCYqM0R0kB44QORqMzPjiRqz9twGQaN+OSB41EvvLzSOaQmejdozCUPYn2IpKykUkhOadbspLWDwxOLfapeYeloOKDFDwshB0ECxGGRwMMu6dsEEiFw3iUICD/HOo40N5YUAShI2GbqpjuSzVKsulAm2Wi+jEBt5ZoR02bnop/6hj7ocdFf9D24VKyzlzEP5P/rw3ftBGaMUTT/Hf5p5oeEEurWWg13nlpus1GlgBOaSA2UWRLvnkyOEdxGsPJS2TJWEAC2sfJT4h8ffwALqn3eqcYUzMhKxAQqAjx8SGNuc1azzHGe+8QD85QvtyFWllCdH0Z/uUFtJcXkUYOYt9HEHiI+UAtCQBjNRHtpjJnEfENqJiW8Tkf/OiecFMmiPgzp3z80PEQ2T5ctrgu4NH4hinS4z4mJ32MKKKve4DiuAfVew93OGLJFLP26OBLzRTbRxaEUFGAMgqRkg7ZchAtdNA/3mcjS3NiM4V/qctCevbpLg5O+uzLsnznttTJRFHNtV+FKqvJwfLQrJmLPzEMUdcRujJLrSwtR3Wnmf7a3Z9TEzSknaeTylSyWj8anmu2dPCVUInP+6eYo3hLbbpMzyAYAHCEbcKMHx3R5kjRMBlnwuw0HUJjjlaPe3M0aFOBUKVm4xSN5pph1lZj5dz/4qNu7tNLTDqLC2iWRI+CfW54n0xSLqot7WUVZ2O0wwB5UiDsXEZ5qQ9r8B5xMkbIaQxExRd2VPp6Fy554iQJoqtXgFmb04Uy10ZapFWzSo9aXt90XnXaRgVwaODGqQMAdIaj+ZCX3KSxya+CKP+5gqKOZy6eA1RkeewDIzGVwj6QhCgaA6kqFM0TYjVWAI3NwBqnHQE4HI2wtbuDzWsr6Eza3LknD67PvriHr77/Dm+fv8DgdZcTedJcDOTMmZRA34yo3anC9m/PsLaxijudOWaVEvOzcCyWygC1qFFr6tperz9oLrPGvMFUKRqFsGHEXNxBud6guoU63K7/ARDb6Poabb4hECiTElAzY+S1G436zvxeo0P+EYDD0uaCRrJsWCq5jkaud5Xr7BDuzmvpgmkqS/EvJoFU+FLxzvR+3a0uNBhmgDdmM5S2eLvRvqcszQYgzxi7Kv4vrv114OPi2dbUibmOFuTx17xYzPsQIGdqFCjycmmWxSR3MsalOn6d12tZTqbmtprhJGOSQrxe/xomugFbLt5HGfAUcDCfGbHc6SImNDeuDeBQa7Lz/SRWEVVPWs3Hr0ecMvImCT0UeY6/AQAA///snctvG1UUxr+ZsWfG40fSPNSSNIEQ+pJQBYoEFd0BQoIFfyV7uihCQuyADSuEkKhoaEvzrO24duLH2PNC37n3zkzcqAW6ZSIrUWR5Hvd65p5zvvP7KtJHpOVH/B1pWYVYBsSJ7gQqrFV4YbhwgpbuU45Q1ZOCiYK0ohIB5sYdzwEeyhV2lG7ePA5bZ1O5kFGBhC03OFP9N/6u8xP2oomLUqamzB9wNRGWwTPBCIZkaY7F9MBYWq6fCO1R9R4yQHfFwz9Bc/MylrbXMXh6KtlXSTbwBWUHxEnA/dAq7eNP+3DqLXmwxRqgxhKCkzoykZ89O0a3u4a12toLPcIck1o9wNWtbWxs3cDJ0VPio3KYlgKQFVx3+ppyITDd20cPhJkmWFrfQLq4iJ4kKWyElEGmKoEQyZepkLYZ+Yz8UGaYRPC0dQV9g2thioAeyb0hrE4Po0e78HoncPsnCJIQnqVVCRdUv3VOKu/ZFs5QFINFn1uby9i5fR3rV5fFgjoxobmjg4TUgJQg3IlazUW9EeB5fyBtFOtry/B8Rx4emQS+thx3e/8vTPpd1FZrsJxAf9mtfM36qtquY3sSRVDef+eju3jw4DdZtKiO1Aye62FMSN3xEb775ltc23kPduAJsEyZxPxjjf1rbMUZLKzW8cHdD3Hvqw10jh7nPffyMCbld5rh/r37+PyLL7G26ZfY+rhYEfLSLUVGmys7E6n+4d4+uu0OjvYPsPvHQ3QOj9A9OBbY5elZH5PhGBkdOHTSUeSnnG+VKhqej1moqM9c4lUds0AOZeFL+Ann7GgaChhlOBlLdrceLMjZrWxcwcbWFrZv3ML2zZt45/pNrL91Fc2VJvxmQwIPSBaWJAASWeO87y+vrWhrwv+Ka/x/e70tX+hohZTXaOKNN99Gu3OISRQKUMv1a+JtLvc8DmnVQtCqo7XQQLcXgq3txujHGKqwclujkiqbYO+Hn3AlnGJp5320VlfQuLSAEYN/xOKVHwkt3BE3Ec5TysLBhQahQQRl9U+RDUcYHD/DYP8A6PaB/hAYnCGYpeLA4soDHTpxUFFJSQHlZrA9P7cZlMpVainOQKYWsUYFkJYKb8XC4N8nW6ySfFmuh5vJAqzh19Fs+YiWLmHU6aN93EHqxkhnCbJIgcAYEcWYKkUCFPS3OBY9VFo5YwpdFSNj1gGiPEcJqKkoIC/VB17TQ9CswarRLs+GUyXNHAIssgyhPQdp6fMotw/aRY+x8ZNPX+hRKNgIps2M1T234sl8EFXc6RmySQSLxY9ZIkGPFDQ0yHBG8KTjwQmUrFXo8t2+9Cl7tG8Ux6NMbMRctrAlFqa9AZLJGJP+CcKne/DX1qXvvnJ5GYsry9Ia4Ilk2UPC+UwAm/AelBpgSusvR8mc5TkcE1iXKNcBMluyWOz1JCgdR1jke08nCE+fI6GNabeLsN3BuN1BdTRGctyBH4bS6sDAr5qqnmEm1FOHTKOWJDsSt4KQD+RqIC2DBNDBDxDPBtKal2TnxYFpztqwpCjz6OEu7lCVRftIqkbJr3RUAJ8SOFyC4cmcTE1Qp+y8OFgc/zhvwSx6XI38VsDNpbWeKRy9bDMKOcL6alYVw8MTNDwX1bqPzM1UUqGqnJYI2hJ4o1RjlduIIv0U+5DkpA7sX7Xv/Dy0pXWS8wtKAUpJimz+tkrqgXN/l6zjjMOMxSTJhO5PU7lHQcYgFWUM+Wyixm004CxdQtZ7jmwwkIS3Fdsyf31bJTTDJweIZjGaTMKzEluxEaax4l5JhdgU0HT5PNEKm6xQYFhplgP/5F5AEG+UKVCnDvptshx4jamGor3lVEO6UzPuxXcX2hXB0ioMq+RIVl7zKxaFup+GyLDbPsIvTx5i5d0FSWi6aQXuQgt3PvsEv//4M77f+1parXzHwyQJtSuXrTkQCQIHGHdjPP71T2zdvoZGowq36SunrtLYzts8K9ibsq4Ti8oLJOXzRVY5F1aCtcX6aDxUc1Jb3RmERD6P5lpfslICeD7YNS02RuY/b2knhVlzLloFMP8Zar6lwuBgLMfPSl+iLLB18F/R32txYkvikm1fuUXGyuM5U7RlIk7Z7xllgwr0qepWAPpQ/s/jLVf7k3NKC92el1fCC/ZC0ZevfueOBiU3hJyJp+cY38Ng27TBCyfFJMA0D+HcNdPPQPWM0m1BpWMx4yD7MbGpKWBLd3UxBlJa0xaFKrGkpP/yOVEkxS419iqO5fXk7nlvlBfjVYuuIapFQ47LKHcB/A0AAP//1F1LbxtVGD3zij1jOzi4cfrIq28hEEWlZccOVZVY8QdY8PtYIASVWBUWIKpCaSshyqNtpJSkxLEdO3Hsmbkzg85379hjK40oICHuJpFseebeuTPzne873zkuswlcUFYaZIMVaSCp9uvNwf/s4EKLLYHp0Rf6v+OIbQUTCHz42DPZsWIC4KhNxN9jEoDnExt6S24pWKT5/9Xfyz9PJOMzYScwyaCdc9Kpvn+dNTbiCmYDEvgLXzPVGVf6lQQrDSy/fh7b9x4j3o3GSsTSa5FqUUC+0LudHTx9/DMuvnVd2A1xmGi/X+VKb2vMfifPkjaApmqKBZKVawCY3ywHFaxeuIw3rl7Hbw/uYjB4LrRI8VQetxDqrCkDGG70UhQh3thEt9dH/UIX/to6GvUG/KCGkP1MjoWQGyazxgIb+bqOKW68adhLTSE5VmoPBvAHQzidfYRbO1C7LZS7zxFAwacgnpUZ8axJ8K0XdvqaEOIR8LFd3vdiNBs+Xru8LOCfIJ7KmqlR5RYlauP9Tlsurh0TAGSWVCoBtnp9bG3v4NLFNVgLVUlY8djsP/SSGKNeF+0/trC8eEavjQgg5ieUHgP39J4Yqj7KdgVBrYb3btzEp598jFZnB541eRjPmal+c/srfPDRh1i/fMlM+2UB9cuOKRkboYvySl575xquXr2GW58/KQhh5a7/Gb67cw8P7z/A6TMrEkD8HWE6e6yjEOHr21/ii89u4dnTDQw6PQz3+kIJzb2L85eZz+y5o33aJQFAoG97GPEeoFq15yMJNa0qTpUEj6NoKJVDAn8yUSr1Ouq1ACeXT2H94nmsnDuLxaWTWD1/FkunzqA6Xxc/d7If3FJZK6JLH3+qkzlWVqDpGU7DGFhN6M/TM/136ND/zfj/sRd0xcmR3XVyZQ3PNp9g99kTHIaR2DpGoxAxATWUtL3UGzEWTiyg/HsbKtaMHJWzNzJbaL4E5b5KMep0sfvtHahuH80rV4CV03BeraMqvtIewsRCFqVwmIimMM/zPka9HoatNpLOPobbO0j39qH2qKYdIWU7HBOBbFtILQS27pl3DAVPbPoyXQmJqXAf1CTxqkgxd7XNWxwqYcGQBZCZxGEqXntHWxHpoDPvxZx+fhXfgZa5RzGu2ieaTeVoCjxLahW/hOpSFdXVBcSHEXa3WyK2Odg7gK0s8Qy3jN6Jfi8ZaqRZW4p5ohDYxirUglB09HFd0RmY8+eEpeFVXASv+LDLtjC8xI6RYr+OTqY6rgbTlqhmT6ps+mzt8X/55BKBYtoGbeJxPT1/SJ+msQEkUJegKEMWKdlHFACUwgVb71JDsc+Uro6xYl12kfkBQBDl+1COB9XuAAf7yEZKA3MjiOhxfeksMRghG6ZiyUswPvQD+AsN+EtNOIsnEMzX4C2eQFYLkNQqSMuu2A/S1zzic8+zkZmCiFOfl558AqiM3v0EUfsKI6r5t/s43N6T/Ri224j7e9KKkh0OYFELJUlRjiL4fNY6jvj7i1EGGX1zJaSsYlWrUAy4XeGQwWbVmEJ8SRmxX0ISF9rZDOjPtYpECpYgP47x4If7uNlqY3G+ouMgCkUbBWqVOFqAr9hfnF8jY2c1jjtzADjjsZ8rab/s04zvRGqCSKXcLuFgt4eR7cIlLb7iI0tDxLyHogTuvCXxlzZZ0tZbMMAlM4F8LuCct44eNyzjqmUnE3X17IhE1YuG3G+5ZkGhB1yLYys5Hyaz1ChCRv2RKEEaKtH0sMQOO5F3ps1kW2MBqlWD3aogo1WkHU0YCGS4xAOMNrckuV65sI5gtQmrMoeBSpAQhVpqHMublS0ozEPuMUlIZFrfic8dVvvnYiWWrQSqUvWPlKb9U1hTHDyML3pm9Bc4N3OVtYWbhkOpyZnapv9fawFobRJHKNC2IPLEzrDZaeP7jV9xdm0N9XINZbqs2I7o+7z7/g388vBHtB5tIIoGOk4nS0SORPyScivADYGf7j7C8pvncKX5NkrzAWIyo1xrqkWnyIY6ikGNQvX3KKZlMRmUSAFWacaIY5vCrDfWYJtNhhbH0SzO40cOooGJfszseUofv+tJ0Zcx3ESXbaLkn+T78gXz09Z0Gmd6xn1NRNvJ+PDcyTFtvYY5+0kP7vVY3hmZcQbgeefieUkBTKeFImbx+MW/+Xe0h/+ESSbfmbk3GYfm+nCJAGvdNpAL0ufXXornInKpExjH4dF/OoiLJ8kOzQAsMj1mi+GcI+cqjIcxFjeiiHaGPwEAAP//7F1bjxRFGD19m+nu2WlmGRZ0gb2I8CCgJBBjIiaEP8gP8C8YfTT6IDG+iCYGgouXlRjJsqKbZZhr78x0VZvzVVVP73J748lJCAmXne7pmqrvO9+5hL7NV+UEnpMVOfjsYdpaakkB7pp/k6dac8a3C16iaOTBGEMThziZD9HSE44YFlQXqBdoqnKIrW+0XYGl/7nf66/6Q/PDwzRAR/+HNVAJAt9G+aF6oC5X1l3f0euR9w0CTOcKUdP8ey5YvzAURhZzJ95dxcqZVTzt74juQ9kiKbSUfF5VftDHrz/fwzsXLyOQ/EXItZiUA6LaWihqf+88wdn1dWmCUDfdIYLGAjNbwuWrV/H97fPY3hogAKOJZmJ8h5opSQ4N+roKzYtuontPkecPMN7dQ7R6Bsg6oq9ttFMUoSfUV1Xbt3iP2tI9Pd4rQRhxte5D9XqY9PrQTwdieNURXGSOgE7O9v87XaCy+1XddbV0btsBfRo02o0Ax9MEp08cR5Y2rSu8ElpVob1aY+b05tpEXTGXO/KE9ttpZRj1Btjb20enm5m14plYl4bQhKbYefgHltfOobW8Lk1FWZWRr5/1ChVJTSUC8INrV3Dp/Sv47tvbYuQl9CtucOJuX2Lr/j3cvXMHpzfWEBIl9II3wACoq9ggWfRshj6+eQPffP0linm/io6UeoYSkXGOLz7/DNdvfIKlrPlKX4RXMST4uP7ceoBPb93Cb/e30I5ipEGERqElA1o0XElaHRAsEMSIyzcTNWpZ56QFJimG4wNp1idjQ/syB4KHrJvh5OlTWN/cwPr5c7jw3kV0V1Zw/FQXrU6GII2NRMXePzX8zlgJmJpiqSyELqnKfIFJlS83yPn/9eZeh1fvYkV7do/Plrs4eeoM/t15JM+VSDrpz2zauAeHSYB0OUW3ewzdbob5rA9tI5yV0B4NGsnvITWvbUqgBkP0frqLwe4TNDbX0NpYk/2QjRf3vWl+gNk4h85zjHo9FOMR0HsG9EdCV21poMNzR6mqKGn6kYl+dxMbey8z+tCQxdaIhR2nlmKZ9jCCkE78XulZHaAx/xL3dlJHhX1muTuSf24Nc19T573or70FC9sU0VVBXSJoEDBpoJvFUDOF1Y23MdwfoN97JiAAZQKM0sw5XURZAeau8IurGFlbiJHVk4Rot9uS5Z+wIWyYqK6SwDcbar+o5FX8IsZBw2iX2SR4xu/DDSlcFDDw/PfVtxRgYzSuK9OwygfQO6xJFkaWMmkBk/5Y7otgD2V7InkoF6ZzZmrjQzVDzFsxAprnxk2ZFh8E3FkUploj5kReGW0vGYCcvjISmB+HKrjfMNc8RzjMMdn9B1PS7ZcSoN2GPtYCljNEWSZMlHgpRdiMUJKeH5oGh3sgp6XzwQTTwQhFf4jZsyHy3gA+s973BgjEPX0EzHJJqRGCtMQdKrQsVZU0aTKo6AkExpimKXQzwZgMBMZrUsPLPZlTRxpNcdIXNeWsrIzPWB9YJkDDyuiENKA1dh9uY3/3MVY2z5roQs83Z8CsMPrpl4Go2jBSOJCZFaZJmNthjWRkkxEWLGrH8qipnq3TYEGDwye6Ni76rLW8AJEfIGKzOxwhHE6RrHShwxLjcirgCifijPL1yErxEllABA4UvEWTU8LCaiZu8VWAhCnMUflPaZtyUP9eGrr2wkhMnPLrNV3dfd0z0dquAeGQgxI6/mJUrtD/Wa8xk6k0tYCQ3Gn+3UrgdzoIaBI5mRgPE4ql2IhjLiCJfzBD/9FjWcttX6Gz+pbUzmPPyEV1PTXYs5+1S05gbVaiAgEcABArQ/2XzVjke8aLobR7p1IWXPIMU8cRnyo1RWi9UXxr48SGVXqJsOJxcsrJGpo7AGVW9Dba3tvHj9u/YyVeRtjuIIoSkepe+ugaPrx5HV/99RizWWmn/6WNmixFMhbT77MAek/m+OWHLZy7fAFemmDWYK/RtMCEA6ysKMb6k0h/ERiAxrAAagBsbV3gRQ2i72EyzaXBE928VT0dpbPX/SdgHefra+joexidvV+5x1fXwXh1bU38rBxA16bWqPZcw5Z2g0IH8PE8psGfk1Q7Q3jRqlsJAD8rTvOdwbwSD6dI1rDT4buf6RpTbe+fzG9tpWvOIN7dk1yLWjT/AiRWDa/zT3veNJTPhe8tYA0BHZGrLKQAYirvEgQsi0Dkhkkq+5FIAVzUYS09hL2v6zsNU2ARGylnOKPzba1AIMH5DlTDZ208Fdyfu/dXPFdsyh1ZEK4vdmz5o8/dADM2yU+kNeyVzH5B0EQS79zaAfAfAAAA//+0XdtvFFUc/uayM3uhhe625SalSoDwoiYQY+TFxAR98O81vphA1DckEdOgogJhW6GFQrts53rmmO/3O2d2W4lEiU02bdJ257Jzzu/2XWJ2SOuycmq/zkqrQwh+JrzDOE5FOZsJi3WblYdhCTuJQg/O/qBynAxeoFhmhfqeovbopupiDegfUFGnb1ooFz90Ugrajhih7KZu+RY1uRZMouYe7vBI4W+kgDwyFXFWKh3xqtQbzgeIPDWB7vuuFD/gWrmWWjgQ7hFJMDXOmSbqKTyF0NMT55dx5tJ5/LkxFsiV+FAHlUxaYPWBZKB8eG8D090d9FZOCSxLZipSdcei1M5iZX/vAJNJJtN+fmBN7fkthiBMgUuevnQBVz+9gYePH6PYHyOFU9mdg3T0IxFoEL/LWKx4QoGslgcZss0t4FgfAdEePQY6iqN1j4jmaJDhNTKomFcTNPRBLqnS3whHiwkO1atDCTazZoVxrzZRlUDgIeZ1+zuZCvH+LXRkkl7kUzTVEBWVsqVwVDhm4ApXZZQFMvUnR5QbRFp0MEgTLHa62N59gSfj5zh95gz6nYEEi4T+qb0Eiakx2dlCU+6TvUPdfthW9gpvbAIwABJ5UNgSo7URrl2/jlu3bgntI/FNKEm5apg8xzdffY0bX3yOzmioNj4tDeB1pQ7eekIbHirenShmZPDRZx9j7cOLuHf7tlpXCUIjgbEltcjw/Xc38dv9n/HBtaH6qTJh9HzeQ8gIc+iM5xsaDPRb9x9gOn6GxTrGO0sjmGkuf1WJu0SI8lUlHfuiKqUpkjMhVFlvKYSYoHn/0sHCcayur+Hs+jouX7mCs2tn8e6FdQxXhhitrmhzMNaJIUQvY8ZJ9SmDJO2ohctpdQ7c+pyrpc68gLj9T+iHw1//94T9Te//z8/v256d/ZuPx789ypvOz3Wj51bkjBdJe0uDc+fOY/PXX/Bye1P2s263j6LOJUYZscqLsTjsY/XUEra391TkimitNIQpG0G/iH1OqJzLwoboNhWyrU1Md57i5Z07ouvh41vre879i9DkRq2raKuaCO/ZOh9x/n2Ejk1amhL3CjbK+T2vrRSKhgF4uIxkNMIr55VZv3gGWx8IOoCq19TMiIPj6uVOBEKQSOwrWdzKRLZpdVPwmkLfJ3ZHW3mBjjPbhz7yzW23FrRhISx/18AwWFzpob+UIDQnkU8OkE8L0ao58NNyl+SwyRrHygtl7GaiwuSEAmSSZPHnOG6LBx+3EaYqissiMUoVfhs4v23MnafVJsjsImcQYRFws7NCpHEIRN94tkN6mBEAACAASURBVA7+79XGm1AnyKaske1liAqLMDOo96eyZ4nNp0yzC9ljGPMTugEMeijY3+3FKG2J7vIiOt0+guMnUG9to9rdQZBN0cmtUDcSJ+roTzt1iMJmOkUacAo/gdkNRcGfrzKJMY1CHDgqYnfQa89fxHopeFrWYj3Ifdwy4S4rxHRrMkDPxBKTQydaypGw7H10HaJAKjUKoi6hlfqiPdqgh4qT/k4siAYW/HDCzVwDWVWil/QxWFpG9fyJUlkdlSIIZ5o+cv+rgs5xmDzdxMONu3jv6vuo+7HQBoa9gai6dxe6mFBjAZW6EPvHwKqtG1yRUlulnHo4LqeOWiCouLKgOFsBtbgd3gT+ZgvCL2oHVERcEqLOSXgU95GmXYyGJ7H5+12kJkCaRWiGx2DTAEVVILcVqiIWu8yE08k+m9eF7Buxa0iLDWHopm2YwXV9XDxahFHMUk0rfGHSzLzgOcgIIpezBlp8yHXMtLJCO4e8cK4knMiz4OVHzqEdERjWqaKTRsFim3l5nEAKD5Fvojp7fwGdEyvInuw5Xj4zUNPqIUlDz+Qwj8bIs0z0TFYuXkRKhGpTiihm6RRyRCPFNljo9uTYVgqyWo/PhcCCXxoSVib9KqTWOH411Lea9tQdRcqqGJ52KJ3kr5yVZB+cwLI521FqjDh+CFUqFISF7Beks1DHgTQtG2GvCPHjgy2sLY2xfGUBx2yDxXiA4NQqPvnyBh79tIE7N7+V43QCjXNsu/KUaxMKlTexNe7/8AceXR3j8upQGmRqcxgp9FoaNLXblDx62LYUBVn3c7lHW+zNtrM20rF2mkynilRMiLrOdf2HmpMxH2fxzCKQh0spgMe9eG5W6PnqmKuJvEOKFP/28DhqvhkQOnSXUF6apnXnCOYoJyr6rr783OupoSB0Zza1uCasQ2h49wiHhmtEVF6p3aHj3zOvZpysqbvSFv46GJVmYFmp+xvUwk7E/0JFC8Vtw0+fJ48Q5/9qjafrX+gKZiaC53UIvC6HFtqkO3Ft8vwVM6cGZTqyVJqAEZQq169qsHBNykW2A2XGbRbrfHJlIO6G1oJ+cM0AuW8irK9udv6eqOadHpt7Vp5niu52FA/GIdlnvHhoY5HlmYuZHkGhhf98k4RIaVknQmljjq36MjJM4MsCf7F3ra9xVFH8N3NndnZmN5tsNjaaUNOaUmxQsR984aPE/1QE8U/wiyBFi0g/CNpSNRVaqHk0zSab7HNm7pVzzr0zd0MiflD84kJJ2Ema2bmvc87vcSJXeQm9Ckzu6A5E07COpsomyX5PfaF2TJFazYbT/7nBkeKA4ffpuqt++pUvZSkoNHEpwFDnaDSpneguUWfnTDuorN/3K1qeVpL+ZiAuDmJ6wI6TYjjjemNKhe7iFjdAbVznFrHTPBElmVCMqBlj9eYG2i8/wunTA7cKee6IHgpIoXDUf46dXx5iq7MEFSRsVEabiLAoczYqIp3Lwe5zrPRWOBASQpIkzRz0KYN2r4v3P93Gk8ePcferL3nTUsbMBeDS7m++tZAzYyHzouJ4LNdtm5fpuUhSdCuh+C+QLlYXrOWqNJgGdZBs6oPP39RKD/n3W7loey2XFBGlmXDANhsbnJ0MsNBuohG1oCJr0GeEzs+KX67yal6o9MdJNkFGFhkFm0ahf9hHv3+GRqcNlUSCMAFslDQ4PcWzJzvY7K0iiqg/gardNS8dfe+Z0KZAB3sEfLR9B1989jn+ePY7V0VNZNkmtlL63Td38einB3jnzsesowzOOYH+2y8KqEvkuL51A+9+8gF+vH+/Sud1UPdJP9g7wr173+LWm7cRN0TvS87X4lz691XwWdrBQkatu0pgQqbZqeiFwxKajBiHU2EOmYClQYREDUdjNNImFleW8cr6Gm7eep0T/o3XrmHt1atopC1kpJXNEsvYKKpxckWmsCqs/K/Y/29f/2wBxO0Wqvo+Rq+3jKsb19Df28N4NMVCOxYH4MmY/VjoTMg6CborbXR7MQ72KBAGipmuzN9gg1ZhFuuKppqUhbSqcqibuw+bgPJMo6KkwFuc+Ae2lR0nrjbIEXd+Qo6I5TLjQHJEzIPuIsr2EqKX1lF0l7gjBSWZuZkiOCs5EGBGHxXI2DBQMeOLiupENx1Op1Jod1v6XxBWXGJ26XWv/VXgnQ/zA6D5fAsiyZ47VxbQzltYLDp8bhpjPA2onIP8tUJarP7RBljaFnJhdbZxnAgKogRDC2eYG6Pack5XGv/5+5unnUa8dVmvcssGoLFwSbSy/eZ5/9MSQJJbesNQTAJmejgdLX/uwFg9poKOFdPyc0osmiEKRf4TFEtQXJKhs9xF+bQBfXiI8YsBZuOCN1iWBEBX7ePqDgUlQkfj1XL+5hOLzJs6UK3MxChxgwJxAhUjq7b4ZL+G1k3d1Xfo/kvWYCs+l7hw3kyh0xZUuwWVpSizDEXSQEHGZmQLG4g4jPAIRnjJm4hd4BOEJHkIBVkNPdmJ9uaSsoUYPRxh58FDvHdyjOZSh5Mp8gwiycLZcIIwpU4dDZhi3rXbZ1xEDFWHFgU2FTqovX78LjEmUClNmwxeVV0UtMxJ15c/0BIH0jompDJL2mi2Wug02xj8/BuyQY7uWzc4eD/Kc4xJU6sTBoE4ARmPkDRboo+mAokSwErref23r2l2n0m8D8qqL/tltO2LkNtKKmHm17MUFMrqWjGbshEiFbWoCCCxrmYmC627grsoEOUhZn+DaLEDk50gJpncEVUPnC2yM5DWIMHJlIom+/sY0t4aN9Fav8JI1iFJS9LIUv9lfptJwMUEYZyA24raQRMgygK1LkbSgWeMxgZ+sn5lHpwPRoWnQAVQ/kfyDGbOUnynbI5Wn/+OnUGxxgwxdo/P8OvBLq6vrWKxkeBUzZA1E2y+sYXb2x9yTD7Yf8FrKBIkkU0AjRFwLiKBY1/jh6+/x9LmCtbf3kBB65ZjZxFAzoEjnsl5UM2N+trF4y9gZF7WRngca1KxWnLMyrvMNzd33dIcjZ+Nzs8l/3Da/rBmNjkjOUbMo/p99+L/y+T1+67jhrKsTVO32XEmjG6N4gIZgA+60ve5betH67cs5w2onex6PBpzn//zLfFgGdo+JCHt+KLq9/2uIC5PJfR+MpnwvTtDQXqe7F5TtcuzObB156dnG9g8k36Wfofmp4/a87PmghCxASIGC+ge2LSXvIDItyAX9oV453lMJpsXu+TdvQh8dZ+TEnUx+RPvBfbkYy+h+lk5/zmuwVwgkXcmg/QzVUcVyygIggB/AgAA//+0XVtrHVUYXXvP5dyanpMYaxJ6EbEggg8F8UWIVsEHH0ToQwXxzR/ir+qLv0GKipeCN2pp6SVpmqQn5zKzt6zv+/bMJKWNIj1hOIfJyczOnn35LutbK3v36+1vVB4hN0i8yuYxCiEyK7XWPKRJLwN2WVlW3cskpGMfbLGVyEpoa/IYMSoNcpGfIMbgfanvzH9QNI6NhT/BvgSCb1qR8sBsgCeCQWdRkVZDE1p/mbWkfyll4E0yTB4QCV+YZTfZmtRxwTKSCXLWTIBULRxDhzHSowwF3JHDwf0n2L/9QGpAo0UNgjPdUPmLKAvpm5ffgiPLMuOLtbMIk9ZWCTwmBGxubWAwGGhEWGRejNAKKvmzunIWhY+489ef2H+8g4JLncBYYuPWetjOod460o/GVKOwEzghMKqFWCgj0iModJGfeT2yx5dmbLDGKkG7GlvGHUsspe5v3tNn1+Tx2+AAe2BUAENKKrKfqoUsVGdGA8nywzKzUmoXUprXqY4/s2GVbnQkJiER2HS2wM6Tx+hR4uvVVWHb9TCCDhLJkSHeOWxduISif9binIm//LQUsGtoA2kUDvI+vr95E7du/Yw+g0y1QojokNJNpaGx9hr1+N9TNvH8ZBnAM7m7U+5/2ss1V3UWNGFWQWs+M3x74waeTmdQLnOnMlM+YEpBCr/Eh1c/wniyKuNEDJz/0D7Jyiwq3PzuB9z68Vf0fA9Hh3PM5hWeLpaYVQH706eKECpzrG6cw4XLb+D9jz/AtS+v47Pr1/D5V1/g6qef4O0r72Dr9QtC6FYOB7oAO4UreZMTdE0tcLeNL26vP/X5/rv+ff7rZZcQnHb9F7evnXn/53h57XPN0RJzEtCkWT2uA6XUmbMc6e7d2zjYf4wVyv4ZzJCMzVJSIhmXWpy73Z1D4e1LjkG0G4nyiQUBEipeUVqKlCqFtE8P0YjneWYqXARtT77nwm4flJtEWJxzc4Zs5hDZQkOXNd2TMeL5SwjnLyJubiKsTTAblXCDAjUzR2Epa63s3mdHYqDXlNcVJZMaCxcwXB9jfeNcx4mIxxyOZp016HwT+G2+0xoLbLPvOCxoVrfWYKiTrrNPdf66b5DAj4gKKRvIoUcGnBkNURaK+KOxUgqJmJHIQondCKMmIVzucuQMmkgGU+vEnEU2vO/ycrTjJj7HcWr2fOsD2Y/EMI+2Z5qyDQ0zbzg1BmX2p0JCVlYO+w92cHj/EUDJPPZZrbJVDAIIkmFQIvZLIQPEaAhnaLmKMqE0rHslypURXH/AlJwiwZglq6NJ5bY7oTc0hvDqiHJMUsoJQlbbI58S913aRCz54zt5K1BjGGv0hYx3gT5IMkm29KWwuHtHA3MpuVJniv015wIdhuEIYf0c6ska4toYmIyxHPYx75eYFRkWznDVmWb+RYGDNeMZSSIHyOYzTO/+LTDuZm6aqk8ZlT42s0vMKKmYe1zZ3sZkYwPzGDD1Eb/cu4PdaoowJAIh03pvy4CfLGeRhI43I7vjyKSx3eVzKiQTapD5hr07NAau1PjyHlJKkQuD+Cgr0Kdzt3eIvZ/+QLWzhzMlHRsyjhYSDBFnTDKWy4bNvzYobexAcxPpZPJnI1qof2qnJM5OzNH0Sue8BR9VKaB1/sW2hs6/hk9JSOC0lCGToGGFanqEMFugni8lEANC7KM6ikFKW3SuFS4TQtPiqELO7z8huWOURIxzrSMrGUmO8ViLLXOwe6DykoOeaM5LSsq1oXdH1Ssrq3FRs6dCLldHcU7mQbklJKjpdGymQxISXpMraLLdJtfMwJSgslgOk2tJjKAAMjgrkxGyWCRJOkt80eYqrD48Vjiqj7C2NsHGeBUrVNRCD/1eJmN85+FD3Pv9N/iFrUdRr6koItuPXMDuoz2MXymxeXELvZWJkGTqUhWNOLj73I4P6mC41+eVGtKnYMJ1YfB4OCUR5zgMhoo46SRHIwSMtpGJLVxVpiDTru2pnr65VyrX8P6Z9qZzmrHv8sakdiqZujcbMZVKO0Fvt3XoKeCVGP0lG24EeIvFXFFaAqkfmE95nBSwK9WXyg/a33uZ11SFE18wapBQHWNd7wXJ5dvDi2TgXM6LX+o0YKL8A4Tyt2V8J/sj9YP6sl1Lp/MsBSlhEn7dtcjKfeg/y7Ds9Hl7TfU/01qR2qE8CXqOpO3pWul5ch/n85YgQlGqrGBKeB8bW9pojaPr7zSQpCh3ROAfAAAA///sXU1vG1UUPW/G4xl/xWnaJoWkBSoFkNgUiQUSLVVZIFiwACRUqVt+CP+siIoVgg0IUSEhqFSqtoEm4MTjjOc9dO69b2YcSFmg7nDl2okdy/Ph53vPPR/pG59e/6w7MZcDZG9aKAJZ/H3UG+jkPDbZ3G+S69jrNRmOsgjb68nJYBsQ3S2BNmfSi8wgbU4YoDWhUyRGtT7BMhfjwiv0Gl83C2jcWJELWHyDuE8atU6cJCWPMpo7tBEWzXs6BQDofvjitsrjy4BBNsbi4Aj3v/0Jec24kEqa/6VrDcVYAJFCsvvqa8gGY7gks8WylkKFTVnlFbna2DiDtcnYlg5F9J2NULjlRZ5jfX2MeXmIuz98j7A4EuQ2ZuzHQnSF1t/cKgAQi9wsUadrvZKV5eU2lekFWQOaFbwyOeq8dnAnEOrObXs/sZ/b6UFPAACHCWmjQadq3A/D0QDj8VCKTNUkwZDR0NA/ZbZC7ZIsmB7LY21xDstSIrLObp7DYFhoset0AU3zXBDk9TMbGJ29YPSe5BQy7d8vwRpP/j8dj/Hk8R7u3P5Ccr3l7Ay+AVnY7O7vH+Da9bdxbmtTtUErr/jsAAB0kb/gsbG+ji8/v4MH9+7blFIXzMpqYxpUXr36Fl66/KJS79zI2sXEGqTwr+9vbW2KYTHAN199jdnhkcTr5dMpzl7cwYXLl/DmjWt454P38eHNT/DRrZv4+NZN3HjvXbzy+hVc2H4OQ2pgsyEqp2yPXpqZ8aMXR14pCJ/6Hv4HAJ7+1//1/T1bAKB9VgcAiB27fOgXQgGlfvP3vUd4/PAB8n4mazlLkWVZWRPgdfJbLQUkmB149BNlvDibpkrhEmJyCozySAAgEW8MyoYyuy907TQ0wGrPZATOIgYFmAqmfeQkK3E4JuOFUWqjEUAm1/Y2ljvb8FtbCOtTHOfaTAayZKmR5NSsXAgVGJMhio2p+LJw4lzze9MxwmuCrZ3nV6Y48XIyuzg2Im6lEHUrjYVEvHYL1hOPs5gS3xw2TTBzL+cRzTJdDDAwf51giTex+OM/Nr+k9/eN8pmKKaLmwvM5mZkkpvFvVoyLThQxp5lbxWgy55qYssiSiMBIMJafD3rUeG7MD2bIQw+Lgznme09QUUtfeXHHd0GdlblNvX4qhni+yLDg9xE11INCstcls51TyMQhG4zghkO4sT5eki5aHauRmaxjiTX/anZGxoKC6l48JBjhRwIWPXvoplDApCakcNLHhjJEYYbU6qput6nUWbXIqbxpqGlmd8R0A5qfrk2QnN8Ezm/ieLKGejREzThVJinxPLUcfBl+iKRKAYCQa203ovHh/AizX+6hX2vaQU+pjZrj7vQKpx5NNOwlyP7ylSu4uLsr2vMZavy49yv25jMs80xi1HpxSpm05mlyOBtAR7W7zo69s1SIWBvqNEwloW1THmtK39aeidadXqaDDoMsl0Y5ZxIEc5AfHuDwwWOU+0+Q9xMU4zWkeYGSE3OjyrqemYxZ7J8A/dagaa1Yy9ojWuPaN8xTRGbDCVOxbu3bgBt2vnrTHoeGban7J2qSnbFqaMLA9Ym+EDSb9PNj1OVCGn8eo1CHJmWBAICsU9Tg03xvUWHA+2UJzI7Es2JZz+XzHYEMNv4w2jjBhorO63/O5fWKYmBDBq11BJxg9ry3tcB1aNkSQwYsSY2GsXT+4RrMV6C9tr+T53OA0jMJAI8HkVj+3HMNqLsCAFDq21f50dJXKLGQ74vNyRTnJ1PkPD8Sh+FkLAyyn7+7i9lv+yZDSrR2t4ojrn8MOvhj9ggv0HD40g7qVNkLkAFFwKrvWgu0dweGp1143DnkpAxYTACXVQOARQo+jN7PHkbN67wa8pUL2VbpxSylDGEV4G0+Xw0I3Da6XYAtNY+2Lk1eNOOUP5v7fGJyHW3m9X328/5Kdn9sdGM/F2n/LkaLc50ripaNYIBBsJ6ue7/rdZB0AALY30a9v7PtisaE3E/cjtSAhKh9j8ycCBQQGOh+P8bPpaTtCLBiQAv7YJHhqcRIvrOMoh9B+Tj85kUlACpfEsBkJZ4vRoRaHKEx4+P3ewMcWH/D9VIG7DQZzjUOW+sY8xOJ+6/DIIo9beyb4j4Vdr2B7dxHAQF/AQAA//+8XVlvW0UYPTPj6+16yUJJHBpRWpAoT1EjVVXhkQfyiFRAQvxUJKQK/gSboClItE2bxTbx3QZ9y8zcpKVBQuDID4lj+3qu78x855zvHFYAODbdK+OHEOfu1G9ndHC5r4DcF3XCqjQy0KhMIZx8UQykg4qTIiT2hfvvVSUgaEYdnR9ZdVCKQ2kwawgHz733ukHo9bpx+8JRhrUgSwHACAtCYNeBZATRllnFtgFFtNoGhvqkCxdS28SFU5V7fVTzEs9+eIzTo2NeFPmLo+OXUXFPMpPKY5hPsLVznfuauux+voJzKr3WYpWc7XNyqO13WTIn4gTpTzFsRlNiPJ1gffMNPrZHP30PQ/JRMqHy4dhM7G8ODs5OkfuObnotkvuqv1ToxfMeo34u8odtJcDlrVtCu8Nm1GhucEoMp/8bGHBObVdZNTpPWWYxHucMiAjrZGVBS0ul9DM5jdirKYJIHMEX5wVenJ1gvLaBfDzizNjRaCwqAnoNbR3Z2n2HmW5Cmgs+E/+sRzl8Erou8n4fD7/+Bs+O/kCWQuT0CB1OT054sbizv8+gcu2Tm2hrFMNov/b9r7qZV3D2RmUrw36Ow58P8e3D73giIR8PlqdayfJfFdRfvYV79+7C9XKNohKNiFX22Fw+Pm/TuVB385s3b+H+hx/h9t4eDh58ik8+f4CDr77AwZef4f7Bx7h9dw8779/CdPYm3JDQe9VfOOor9dzqwhtKKMvhNQJSpXCvH6FLC91LP//2dhVz/l/f/l8A4GXFwNXPuPpx/7fHmXFXfc1GTJxtX1Wy6dGYvNCozp49dY3fDg/5qpzkQzZvYwkfPcdITB3HX5G7+8mcU7Eu5iwbhUETgyXsf4djQxkQpcXcpDmSih4utnhH0CCjnnX6acSxigzLiCUu8wHq9XVUs2343V3gxtuod3ZwPp1iRSo33cQSC0qgdDmfs4fKWNdc388wWJug7DkUxLJTCg61m+U9zHavi3EtsXPRIUvSBRiE0DtUJcPsmc67Ub9kbJzDpLAS3RLrmX0qxrjFiueIMHNLj3AwuyZ5NYvGhZ6Mha3RzG4+HqRNklVvIavFv4WAAeFxKZBNvMMmybRRZrD9e/p7UECYxBiqSswr0IOw6bSyPzgngJKK/dqgPKYox6cw8xU6lcw5tNY0zC534J1BdzRk48bz5Rz5bAv5+hSFGjixfxH1eXIPfYbVsItyPIDbnMJMcpz5CkvaE1G0faVsXdVwAUJKAzIT5qKaARORq4c7m5J5kfxbjhYmBlcK0LbkueGoN4+SfJZ6fSwozu/aNfi3ttHMtlBS7OB4Tfr9acNL45aJiRrJf2Uz63iMqNXBapFOKgBSSY5thsWvj5gxZuBC0TkBxEQ2HdoA6fv04uwMO+++hw/u7KPJMhwXKzyZn+L3k+eoB13YfsbvSwktPjC9Yf4wJno4BcDXBlULfX4nRrudkJ1dS/a5i/O9bNJJIs/rUuMZlODzQ6+7KgW8aTzGnS4GS4M/nzxHcXSEUcdhmI8kIjITeUvlAsvKvQW81y1ItkysO7FvoW2EzbU6McvfarHmgqzXWzU8y7RAMHLJKZkhhUR7XQ00jiA0xtt47XKMJQFPq4Id9cv5EgVFPZ6X2pMffEsg5n61rPdciZM0elliQNdhWaNaLrFazNEhdVWdTJxda8WnK7PresCqQnk6Zx+KUb/P5oM+c0JONQrAsOGxEZZfPTmqCJQpk69KnAgEWNknt+9oAQAEgpJPFX2XTOa4bcV0HUcU8gTUsdoW7LT4BytDGi2kOD2okei47Y1NbK9vYOIy9EyGbNDDeJhj8fQIj3/8RcaHLQsarXfAqi+rrV2Ls4p9nrZvzDCcDlE3wn67oAK40OqRAJ5XNZnyd7OupcWa1KlFoUCPwYpaOrwwNFyw6euGfnroLM4FtjXo9/oxHta5pDZtM74MWl1qQWiDBFJj+Zf2CqT0JlNSel0CGmI8n1PfCjV+j3WeqsjbwBcfu9PCU9nsAEKwP4lxUVbfBritTQx+IrXS/3FEokr5ZWwM5ot5bCm/IHPX4yVJvqjV66jWkWsr7U9E4ZNACBoD9o6pawYuRCUvigtppZDn0+PhWAOBnMZd/RBakZ6B4Q9MfhsICGAFk5dKoNP4U43N76OpWrzat7xQ4rnU+pZfm65Jra9pbHge5bUFQOPxFwAAAP//xF1LbxtVFP7uvPxMHJOkaRJHLKpKbJDaJazKCvVHI9izgS0CFdogokZ5NbFnxjOei85r5tohKRICIllyVNfxjGfuPec734MBAK8XudEeZIP1LXIgyI001EajiDTKy1ssgl5QmToOGhK4OZGwC8AQFzL2M8SDY/54I2haxMjkBnSjEALCtHgvk3r6IglcIH2HnVgfUCSZxuegCFGsRisSVUjvEyl9JSxi2YymrlvTjTh5WMPtOaOyZjr/9Ztz3PxxKZ89KHvjSDSeTMNK+5g9e46sP2K9G1NXQuGml9zW2ewYMYlYI0HduBiLUtWLVnxc48kU0+kuXFXj7Zu3yIuSt43Y3khIaejaNSlq42CbWZsYBQ/byLrjvF/mO/x1Se+7+lSfKwThzIdeknWHkcM4y9BPiImgQkY0GG8NGQigIoynAr6j/wgSbmwNAW28av/u8hI38xwuSXA0O8KAzBqrkg00uCRsaqam7x/PkPbHcElfteSPAwAGP0SwSYTnyfq7n0/x4/c/sLlh3H4q0aIuVhWqosSrr15hTPm7rrs5188g/maT9djPww0gFeP5XY7vvvkW5WIuchc9JqeN1WJ+jdevv8ZwZ4rGJVrauXbS6e59xnVqCS8VaYLp3i6evfgcx589x97JDKNPJuz4TWh5E2tWt27SjcZFNoEhn2t1pU3rrMsbaRR95Aw93gD/cwDg//75rxkA/9br739Ou58oWeTdT79gfnmF8XCEKM3EeJX3igRt19sQu+YSVxfnLB3KYsn15SkcNBaLos7KGsWHO8xvqrb8audtLmrXKKerURysh+FD3Oh1v2NQIuFGiv2zXYSC9I2jEZY7W3CHh/CzQ/iTY1RPdlFOp8iHfSx7MU9VyQmfbi2aKnK5Va4YAEjJpGu1ZFp5POoBox4KMgmkvZjSa1KPpydHGJJ2u9U3anGpG/nmtGf9rK8XhOHvNuHa/Hdn0oFu9Q6+r05W59YJcrzeMHjo19kc6+d147Nu6H43J/7+oevbWGj2Fq7be7wVi06PiI2nGhT5EuTCGxcrlNd3WFCm/6Jk815umqiQ8pLCQABAMsiwIIqurzH5dIbtJ/twaYqKahemnYrEgJpmytCviWE46CPdUB3KxAAAIABJREFU2UZ/fw/peIvXL3JBuCVHdqKralwUG1OqlNCa3JDd4YypwZNscDxgQWZ5iFBR/ZLStdXDbZJiOZkABwfA4VM4ugYP9pmBUo+2kdPkisBfKr7JH7gVlpvPjmdNM+X0E4Xf9VOOJBxkPYx9hOqMjA5vJOFAHdMpUz9WJghPHpV3uKTCfGuCl198iWQ8wrxpcLFc4NeL98gTx9RtHtZQcxdHltMpWnJjtBi93HeDBou9C5sUm1iu7RVKU7YakZrDvBQNbi+JMWAT2gI9lyFa1Ji/v0B+dob6wy2DiVmSsU9C5RrktKZEktFuHbsMl4RmzR4W3HhCpnw2+dT60gp6qVPUE6Dx97/jj+Csxo5hvwfoNL+skFMaBNU7ZFdPzaCCRr7qNE5OrzN6DZleUq3Ifk70elp3CCGtF4h56h+Yn3arBAMO7G+ykqSEcllge7LDE/hGAbuVEwZJ7cS/wSj+BPJ4zrwWar7gjN2kvnOUNAAyVgaAPNjYk8A4BU/pPuPnRj9hlmfcsn/su7DnbFqZSZPVS1McTKbY7Q3RJ4ZXlKGXxkiWNc5Pz/D7b6eofa1CGgM0dUjG6ULA9e0VpodT7B8dIBmOxNiY2dodaG4AAGD68PUv1zT8xvIoy6Jd51jzHhlw6dr1MDQWtJQ2AwRs2MkT8aZpF0BjL5sk22uGffs5AqnKJrOsY4uJC731b6tVZ6BufgA+uO8IPGP5RzAZD3s0k4rbA0AgcZD/Qz1eaOIe7m16VttEgFQjOhkQaRr2ixMmgEzreWpOrKeilKS7yJjd2JAWhM1/NzGnv8UMdDp2Aha1uadGnM43N9R0zColF++rDcCi3W83gO32/pYJPzG77bu0ky/HYhH28rcZgNEEO9b1qz+AvVfYZ3P/yoMD6X9tvWyvGe/xJ3tX09tGFUXPe/MR2zN24oRUURq1KKgCVQUVpLLl3/A7+CVs2LFjwYYFsEBiheiORauqqCIorprIiZ2ZyXw8dD/ezNhOU7FhRaRRHMf2jGfevHfvueeeEzz58ouvKn6hXV2ejT8FvuotiKjYH9huZ6oBUFd6kHbTksKgE0ahwcAnkAQZtK+fHg8HIh4mg1RPkpP2AqKZSN+Ja9sPHNsbhEyv54sRKlrk6YiB99PvAAE/MLk1QGkh67NvqJ/vt9vCW1bGbRqMt1LkpxlePXuFJitZVdQLrzn4RdIgW17j4Fj8ypvSyk2rZfZALQpJTZVUz5NJChNZ7xUjFRTuj6uZplXZCNPpHdw9PEIUxDh5ecIDXZJRIblyL6NDG+B2wlqrdbnNzXQ14DWK1s2v701wPQCgUbTXoYeqcbhQcy/eKDTYSSLWNJDJgkCeCGmaaCuH6wWI+hnqD0zDlZG4okRZUZAWYJkXWOQZxpMUe7sTjIZb/MWpD5XUrTOaYAcp9sgOMRpwCPSuGnHHPzBKhW3YCsblDX7+4Sfk+UK1F1pTGj5zb96c4eEnj/Dg4Udi62W7z+m+DzbG37//uS34N0gGEzz97SlevHgu4mdehdmFXN1bLM7w+LPH+PDjT3HtOnFK672/1+Efry2hm1WVWloJKyuiZtzaQhMw9XE5YXL4MNehs0cBOoZKq1uB1fEG4/ksb6sk/w8A3P7u/xoAaN5ynTbZE3TNL/6a4cfvvse3X3+D33/5FcV8juN797m/GlHc3YGBxWAYIru6xOzkbw5iidXCDpxNqQq8IQbxEEarY8v5BcXK7VH5mjZUZMyIGgtvgbYcrW5WwegQTRSjjmNWa78ebsFNxigI3PvgAfKjI5T3D5Ed7CPfn6LYHqGKBfyixJ8F9QLpJ7WqVB1R5bsgj+xS3FbIPWYrJFoUShJLooOk+cuUSHZ3sLM7RaNrbBue9HqS139aoae1ICpY6f+/GQBA//nWEUFXhkbnMP3bOtOrwbacgO4eXrufnTNro2CVBoz2+vRAm16Sv77guJX/dewODwCwujhEvZ380smABFmF7GyO4mwOk4uaPrNIKFCmtZirwJYtRudVweqR28fvY3KHkvqE6b+kaE6ADOuf0ZzJgDU5z6TIKVAbJgj3d+GmYxTjEXICQwnU9+wHAvuN79vUhKf97Z0MrBRvia1mQ1wFEZakEp2MkO+MkU23UdHYo+3eXVSHByj33mPRySYcMv06p3UyFHcKCgaMSvFS+wA/pgRPK7pEsQ7TIZI05TVzQvoJ5xdYnMwQNBW3yBhS8ofGFd5pwcjFIwAgNxaPnnyOw+Nj5IHBvC7x59kMJ8sLuGHMfeRE4a7apE9ZiM6Pl6aNMxoNqk2vKCQBraias7J57TYC61aQkmz/woHcx9C+fmOQDhMMohFT6O35JYrT1wiyAiMKpAchOyTVgxh1ELaaBwHHLWJHJqwWSc6KuhQtA413Cdeg/UR0/9fSTkpxilTpuspfe/++a/3q3ave0aK+ylFcXrH3f6OaE375rEvfC66WfJQ8EACQ12zzR4hEHIoWQ11mMNkCER1b3SgA0GciCEDLjChy5KgrZFmGq3yJyXjMNPsmFBcJqvwTj4CAnYr1JHwswZwfTUCsOH30ktlOvdzqcwqmUB5BCT/1aUeB9PyHQv/3j4nJ2SaL2lJiPHPM6GwUEKtEXK12x2MWgh6HxAIgB5IAO5NtzGav8fKPZygz0ooS3S3b2hnqVSOni7zG+fyURYu3JglsTOuPiMCtrHQ9inq/vuST/1qBQGKxVMpOlucaTuiEBaNzWw/gXQd6faVdCmWbdoErybPum3ImazdZVf716wkqYzRUKNXefeOt9rjSro43DmtVddNW0kV7rVaBQm3P0VYa61txXceg8BoBPoHtC8u79hi1x77HEJBj07YfbQ2g9xJlnkX5rsu20Oy1BOT9Xuth9Zz57JfZPfodPNOdckcWtiftOmYkiI4ctSX6xNyzFXzOeRMAQGOStBCY2e5F/Xie6I6FQGlxN4jb/fUBANIA8EV1EVbsbOyFJeAZRNo23wOBrLX4BwAA///sXdtuG0UY/mYPWdtJ3LRO0iRNlKjiAlF6xQ1IiBskJJ6D1+OCSyQkVEBc8QBVFNKWIkpLRIhD7Kyzh0H/aXbsJGofAEuuqtTd9WZmZ+f//u+QfvTVZ+wBkAYHQaNkdQAANCORBzcRkxWbyNCL9KpdMP1WrKs3ox5DUZM0DUCBLewx+hH/kiwzMThc6kSmgeDzEaqZC6jA8XBFIbphdXCs6ytZTDTmj3659j27Ab8B/dIXO30G7daia6UAIXmboB5X+OfVCS5Pz5DWsjFKbNFmqlqG2icYrq+zDKBqoF3RNmzqhALp2LVyY3uL45Q6kb1pZTQywuV83SM63v0HWB3excnJGU4ppx8KLLDffQeyxgV8BE/Eo94t/FZwuw4EMDBBk5rnEgA4skVzP1vTg1lHx7u5c8jGm3R5KdYGFAXIQTDsM0H6PgIAKH7RRxTADqHsgKVW6WdV6zEl7e90xnFaNL57u5soljJ9qAh9saTFNcswerDHechJUrxDAem6DbATU0eyth2tbeD46AjHh4ch/oM+V1BsZnvFOlACaz759GMM1+6oiWESKUpsFHwYk3ctvea7lfMU+bljECMHOX7/7SV+/OEJmwch/B/5syw9in6Lz7/4Er1ioH2pyLTqLVRwr/c4XTM5oZJ5Gc2ZLFWnbwLifCgLriHi89v8CBYJxf/83PkfAFh8ve36b59fMdk/xtmTqGtr9/FNZ7EOvrs2PjEghmvnt/lLcX2/fP8Tvv36G/z83RM8e3qEX58esnRm4+GBpn/opg6talUb/PXnH5iOz7DcKwzNYpKAMa1aate0AkCdn14G0z8rrJxLwjWTkwBp01VzwsBqQwVcIp3TkrqvSznKXg9T6uivraHd3kC+v4fsYB8z6vzvbKEejTBb6WNKmerqkJeE9UfXY5a0JKzNJRd6Np8jhKKq4WiBYuO2HH6p4C5Lstzn9T5f6WFjfUOihSx32nx0bhn/xYI+jFn8cS243A2fd94hCQCgi3qCmFuBFkfZRxT1+CWPAGXzRF1Au7+lyNNNT/dtZUbeMsXb8IzpZB6LAECr7uPEAKimFfLaob64RMkAwDk71SetAJbcwaK5S7IM6g4OCkwIAHAt+rvb7NHQH66JAyJp3qs6FOq8F6BuPDVIyKCOY/ZSjt3NCIze2kR/NMLScBVtr89SAnLkH3uPSZ5jmue4oI41/T3NMc3kfZ5kmPQGuFxdQXlniHZnC83WJtLd+/C7O8j3D9BsjlDfu4tqZQXVUoGKs+vFFpB6mj61p71GsPE97gSMJ2ZhKtrqhnz6Vvrorw4YKFplAGCCkxcvkFEXlflhkirktAnrlEVDxyP3hPNyhvcef4j9R48wrq8wrkqc/HuO4zevkA16yJf7AjgYIK6+S13jwHf7FMvmpkKAqOR+vjhgGq6ZBypIYF07y+Umfg83VjiKsuGkKWqmpHnBxqJuPMHF6zeoTs/QUFTjYMBJAQXJB1ORq6RqspWqDEG0tOLPVNZXYW9LsgCTVojhdML7gbZpdONukXUifeXCCV7vA4RNvbAChGnADCWl9lPcYzO5xOTvMev5q2mJPDJoJnPNms0A9XgEjlBKwlWNvGzgSs4tC6xYRzKByZRBMKfHsbvXa1So9xIDnHHR6HHZlJhNpqiuSpah0lpFbChyz6+Vtu+Nuq4MFyvuDVewmqJ7ixxEZAKue9N9xpGqklrVpAIKWCID1Gy0dd3CNgcAJLJ/L3p9Zt/Q2O0OR7i3vIweAcrpEtI8RZHleP38JZ4/O2ZJIhBtu/WZQTGDs7rhqG6K+X7/8QfI+yQVatEq0T/kt2sCgtf4R0S6fOqEC/2/Udq/so5p7pL3i9HSFcClTpeZ/XUacr0PFOiyIpl+luVZBK50YJMxB+Juf1zLWE1HczcYnUceBMYSN5M+0dh30m4AEZ1e9uWJNnepMG6syeyF+t8u+COYft+KfPo+2QL72uvncj0eFfVQoJ5+Rrp2Ks47dnkVakW6Fmokx6kcDBaoHj8A0uYBYPWumS4qs0f+ze5Xlcab34MyuIUFocW2Mg4WQRej/Yvpn6Tk2XnktogZAFLUs7Els9I7jzr+puorIAx58T4wqQDvIyJ2UmDX09sl+A8AAP//tF3JbhxFGP6qu6dn99jxeGIbLzGHEFAuIJYgcQWJ9+BBeB8uXBESy5EL4hQOXCAR8abgxJ61lyr0b909JgoXsDWyJ2N7lOquv/7lW+J3v/jky4jVCnMJvArD1+yuCsJidRBXcCcKfrEW50VW6M0QiWVC4RWKZf7LQoi3rx31Z9TYVycA5tfI3A4R7CPOgviMyiSRF5y8EYkDQlD9MlMxIq+BtmRxB5q0cMHPVIBEk4BybaAsm0KCd2S+nd5U+bOqy2vNERaE0YtDNxx1Xykw+nmJXtzF8yfnOP3tFC1t/HVcizlEDqKEmmn35u2HD+G6A7XYUaVJm7rThul0sDPZZetF5sUGe015/HHKXDiONUmCwfYOdo/uY7x7iBfzFZ4+O2PVVfIthnH1UrGMqHn4DS6hWfQ5VOVAUByBNTGsO9xSfppZ+vGUhbreLmYYa+6t+A8KITJhF19VEZ6bGGw+hM00wpBg+iRsQolXGTAajbCxtcEBUSDAqJJ8fg7bIIYIiFjYjnyPn1+94AC9M97EcNBjqyDmBlNwpfclNWD6+/tH3LGOEN0qqG8XLZagatNBLYm6oz5//fHbHxCyksUf6e+0fAstavagwOnZU3z86D3cOzlG6RO4pFUJQoUKYtaAya551NtHE1vgOOhFej943meofIYJwkabOuerH/Gevjq7xOWzU3z/3Xec5LpqYhcxAoBLgGyGzz7/FKNtsqlM9DVL+P3aitRpf2Pqp3vE7py4SjZDtXZ21jf5vlG1/vUz4/OuK/6vv+OtkuO1j/+/BfBfqOy/7vFvH6/+3XpNXl2E1xNWv/Y7DOcNMgGhe720hK2SwZSklJNtnjCppzyscBMjdiqqPAkFUWO2KNQvWMWu6DAFcPXnKb756mv88tPPeHk1Q7bMMOq08cFHH+LwnbfE8snM4Z20rKgAoeTt2e9PsFzM0KUi2YtAbEn+6KRg3u/jZn6DMvMopnOsFgVyg4TalFWRJSlkWkExqz0cYpl0sEi7yHodFIM+stEQnia5B/uIT46RPrgPf3KMxRu7mG7fwXJjgAUrxYsQIMOpIXxY07lhRxii1/B0ixBPoogf5hkGPmaOOJ1l5LHtiAI17DOUvGDLnRWvA9tjkpipqnobjcerbV1VUN+a4HhjVDtXXf/QuPZOLQZrKLJrXGv9d11724fB13vXOnXVp/tHy6HxurSG1nRElPPItnt8ZsSqCu70jI5VcGtd2yDodTStG0vebu8EHg6UJW6up2yR6lYlsqtrLC5eAjdzsdcriso6kCeXpDLd68KnMfOHsTnE6GAPg50J27q2UuKKtzXGBlGS9rLX0lYs6DQqZGO1LU0TFL0OQBP7rS24/X3Eh0dwB8fIJ3eR393DbLyD5dYY0+EIq02hkMy37iAc34M/OgDePEa4dwh3cgh/tIdsd4zszgjLfgeZNhtENd2mn07dEEJtPUg718d8iosMcIrYtZiGWFIvbUDN8QnXY50kxijtIb5ZYnZ2ifL6Cm1kwilH7RKRKIydTxTy4C89NiYTPHj0Pnyvy4UNCSP+cXmOGeWM3R7S4UAHOyWC3stW+MtXr7abQZXv6+mfCUnWQlwe2SpjTShOfk2oT/mvucaepCXFZYfWKoixLPPHVx7Ty7+QnV+wQn60JDeGmBEQCTVTCGVI4s9BrIhTQr9ybNQBRCT7XDQBJMaxBSaCWkFLfDGeOu9NFayjeMT2YggVRZVjayG0wjbnfyKaSVP81c0Mq+dTYJHD5YGdfajZyalVViJf5fyepFvCLhTkRpEHRPMcbp5xA4HEAz0LzhXotlL0oy7KZcGxk/NzosbSaseJDu4859RsyaznCdvVzeesiTCe7CHtDTiXQrvLjQBwDiH/d5nmo3LH4gahu/2wBgCqKT4X/ZTrsR6HTP5psITm93pq2UTUaMNBizP6GRq6URacRzGmNwtsDzawO55gQIWyFyRwL+1wM+TXx49x/fJahGNNh0BjFmm+tMm7o/C4OL/A3v4eO04lwwR55Dl2cwFNn76m7xjiieqJQu3Hq1YriyXWonu0V7g5oMVnrj7xFlCtOLUYTzlXqgMWi6hJJMLqpD3GcakxUK0RMlpnETc8VvvC2FV0aCmKgzSqrLHWcLpJbICrmhbQGodep9qOUDl29tH3wudP+HtaVNLDoOcRosZebuR3JtxbFrx/gzYULMbTWR83ePBUEJMtosH/oZpuFA9owk4/Z6jxNdoDT8mJIkLDYyqyrUFqjhzGdhNqO6EHeBit9xivly48FeeFLzjntsY6I0nUQaDZfGHNByvMCbXD548goYgKYGcJl6barDOkG6HTKpcUbbpQ3WTvITR+0RsTS0m6j2hvS+5F14frMhIqjIC/AQAA///EXduKHFUUXacuXdU9l+7MzenMJPECBhR88kVM0B8Q8Sf8Dr9FfBEEFYVAPkEf1OCFgInEIMSZTGY63dNd9yN7n71PVU0M+KI2NNOXM9Wnqk6dOnuvtdcK3/zw3Y8oa0ETMqGvHok3VrLara+l1nDojxipX3PKheLn31EPtGLzZ8V/0UiWypiOL+UF8Qd6T2ILRGegE6e1LY1kRB21pq0jYVszovMkaa9WprVMaH/roi1GI37QlHCg/ln1uBdtAJ6UZUB1FRrpWLHHZONsWeiCJ//m7GyJP376FWkZSaV7hVhy7y4j707q9ddcAoC8TFUzQEXPVNBhenhFrDL6CypVhNXghm5OhDgM0hH2Dg6ZOZCsreHPx4+RZ5mr2Qv1mLXYDXyhADzCj14ooHVQ7ULOsHjhkDGAwoRYBQGWoXFoxSDBiso7CNkIRHrLWjwbelifcKBWm5HFRhqLoqpbpFCLjUubbP9Fk4WnzRsXuHqFS0gZAJUAVJYztKtsheXyHNuXJtjd30aSpJIVdgksmmDpFrd95SqCQarL3OcGWapioS1o/JLCbRwMMB6v4843d3D/3n1SdPCK2Dy2jMUiKzGMLW7euIFkfdPZEfkjrIuyzgvTXZzrx33jOzoe+r0vzYEVlVQ31p6cnODOD9/j9te38OnHn+CrLz7H7OzU6V70yLoQn+oSb7/zFq698jIQxFJE0m3zXI5BT+KmHZdtS9Nr8X88/u0EwD/lbfy3j+ftte0F/23/9SpgVE1v9hy8XgwIG95AyDZnAQtE5ec55vMF8sWCBamqeYaj3x7iwd17OHt0hHy5QhgHCOhmS04wsFiezfDjt9/h1mdf4uG935FnBS92N9IU733wPnZfv+5QHiuS88apnlPCNawrPDk+xnx2ipRUyx0gx+VTgdrEGmC5OEc5X6LIMkbyGz+ijWbNnCgmZcwpaTkaIpoewhKytbfFImrpS9eAwynM5SmK3R0sJptYjEaYDxMsCXWgfSJhMqlb7R95wwm1xrRWV9TPWqZFEtVK8poX6uyyQx0iivQwZhu3ivaZgkdSgx+m2JhMRMDHtvO1sb2A/9nz3qI9iqx2+wdf69///0DvAcb2v7dBr50OpO52+1dE5xvvsX2xcYuKqKI/oD7rzzIKbOcwNx2mYi3JDL2n6bMgtDQrEZL432yJcxZ/OwN5oQaNUEdkOzUrQ0ZOfExsiMPxOiZXpxhujZ3/t3ViY4xEkVBU7ZJcZK0bSRKfNCy0X5T8Ie2IkoTg0jWU6QjFcIRitAbs7sDs7SHe38fg8mX+mx5MkR4cYEBaQAdTYH8b9c4lVFsT5OsjZqKs4og1KMpAKNd+cQ9BCx01VRM7TiBONHUE/efFoalRJRYYx4gnKYJhgCSNkJIQYNkgPC+xOjrG8vgRUlt7y9tAdAAi1caR62pF7LfG4o2bNzHa3eLralGUePD4CGekYE0Wr2mKiGzdGnedKlLaJgDa8eZFwaTWuzfOJBiK2SNbgitBW1k/RAQoeVwFtIas+PgQc8NKaaAlq7xFgfrRCYqTpwBpKZUVr1s3yc3DuFQ9W61Rf6taxDBDUQmH19Zh0UJe0zl0hNeqlTgEqKVYFKg7s5tjlWUQuH2rilKCLCfYZfPKUf5nc5SnC9SLDDYr2W+fGZmBKydhhDJwticK2hhyBsgq2FWOqLDsbMIlvIwcOnZVGg2Yok/oac4lAo5KzTXTcBpfekXrnKMJ4Gy5QlZU2Nl7AYgTkteQuS5QRz7PHRJc2AcyvuRHAceOJgAH/PwMYQfO8o91hGhdT++VYSrbN76cRIIlAffcXyd6WYkYNAmw7o43MR2PkVqDUZhimCScCF7MZrj7y89c3qMJAA3ZjfN74kDwfJXj6ewUL756DenWCFUkiT4W23YZcx7BFFsIU6RLv1Z6eC121vQ6Zxu/2qnWJwPH/nVEEBdc1pW3UvdxjBHmiQJiXSV7rzdxQSFe2ARaex6GrY5AF4TV9rQeUJs5/d2u21ujDHBNTmi/vFWgBN5Nex+ieFMZMPqZPppGEWyX/GikLFzjTldz75LaFCdSSQqzIYTxrQi9lgBQnMbsHUHme3cmsRnUMiP97O9KI5w4n2M98DWncZm4oGh/W6Rfy+RbFwDVlnPxNp1fmQh8f+ic9G0YmTkkDCcFzbvzInVAUX91JmH3ADlfXhNPWhNjnkB6iq3jOMZfAAAA///sXd1vFFUU/83Mzuzn9APYlZYtBAlqDST4mRiCicbEv9TEdx80PPigYKJoACkgFNLGbEq7lGW/pzOzM2POuefe3q1FfPTB+9Q08z2z957zO7/z+5W0Cj9EAM8xiYT0DMxyocsr2olyAJB+elZFVjRfuxfRTMBMeYn4ZqeTiQgqHCpBKkr+/EuhhJuuh/ZJWZlTtSdQJTwTwUFC9bWYDqni6xYA7WJA29qejDblRf+P7S5yNRFS8k/UHAUCFAZA0BOLppyxiqUGLAzNp2BVc2ehjNaFMzi10sR4s2tqmrnkvpriPxz00NnawptLp7l/I3WsBE/e6WQ8Rm//hXID8I4XIdQVHLZSIpmhMtA4UcaVqx9g9dwKzl9exzdff4WdB7eQpPSuEkjtXN2/TMi5q969J6+hEJE2mb+Msqw+55j6beEjLvuIygGiRg0JJfDkR0mUq2gCbzRGNpzBz3PRlrA+WnkedNaYhFWmM5xe9lDzAzg59fPHeNnvYzIaYenEIotm6UqjONQYehe7cJNPt++iWgnQqFVRJTXkaYS93S7Wem3Uw5ATFfohEipKJjq97h763WdYPluD41VE+O6fh2FOuCz8gDiboLW6gk8//ww/37jJ+gvM0M1m0M0sZEN24/sfsHH7Lj76si0+zRrwkUBAmBF2UqbP5er6mQZaxZ+X++mgGA30Gxq87OPe3bu4/cuv+P32HTy8/wA7nQ4mo6mxK6HFqaYF1YzYj7KPHAxibD55iGv5F9aZ9che+2z+H/+9cRSWyK3v6miF1rG2ocWJ2SSGmeTyfBwnEVPXe/v7GL0cYb/7HOP+AP3d5xgPh5hQ6w0cXF5/l2n1mxsPsP1kE4UzQ/vt81i/+j7OvXMRQb3G23UeP8X1b7/DvY0NzMYJilz15LXWzqDZXjnkqovuhqaq09WHS4tor61h1N/HJIqY6cPCW9ISRgFu2AjRWKjjVOskRlTp7SWaUK6OV7jyG8pUpRBKuCo4GSJaWECysIiDahlDqiwGPtvzkWkQWb3NWLXa4ySi0BUDk9jOJ6yZCGPpoIizJqlGFmHA6041duGnAT/nZHQAfzqDW89EXbqMPEmw1+1ida2tgiIh6GWWcNHrhh0wHDf0MTVkq4NHSECbS1KRW2CAfb+H31RuAtG/fWsy92v/d7Muu0J99VR6mcHa98jlFsC8f7xcmx3kzn33WYE4ipn+kcUJC6fFwzFmUQyHhIeZnQGzVnP1zFUWcCktOJkUwRNzAAAgAElEQVQqSNRrdV7LGCyXLLux2GD9CVp/qbo9G045XqKw1cnVupXrddXM94plQItDVqKeeRWXcIc5vct0pux3CxgaMSXpufios1Wfo5INR2yEVRfM8UCk0sgQqN/J57jNqZdz5R9hCZVmGWEzZPFhBn8Ocj5veCLE8koLvT981q5g5ieUOr5K4oq5l0QraWd7G39uPkJr/SIIrg5rFbQWl9HpThH1hwiWQpQrrsgbOXOxz78daj9P2UiTw4GmyRrbNCjNA69g0LGUKfYqJ8AUG5KInQ/Uz64C61MUT/ewv9MDRgN4Oxnnn9WsQHi2CXe5hqICpKUcCVUdCQDKlKAno3lUYCFWDFk6BvO6UYrG7fE1OlwlVOzHklD3Anl8uQB7HKOWFKBI8W8yGCEfTnAgPf9eqmI1Du4dpZdAOgSuY4l0QqwUiYFFIoixAnUp/k7l98NaAm6OyM9ReSNE1W8jon7+FwPMkgh+FhuXFHrjKWxPcbCGCTGspp1ddINHaL53CSS5Sgr9MZNWFTjmULXWCvE1AFhYvUj8+WqquaPmRi3G4th/H0kW56YWW//BFpGTGLZUlNgy88neMzza28Wl5mk0SgGCIsaC72HtrQu48snHuPXTTWw/fsqvlRka8nH6miE0Y0kQbN3fwp0ff8OHrWsonWmgIIcCt4TEtP2z8agIVWfGpUxbPbJ+CH2kLgwV3Qjj5YV9C6rvnD3rX19MsSvcGhzTrQKc0IugnB6HBd3cqPzbedOr5tVXDZojo4MD4xinqek0CEx1pT0Guj38yFD5X8r5HyXVNPey048UcKeTqQH8qJ2HnwuxpquBuUZ2fXM93levQ3QMym+1YJ49tGsdAwtau+EVg9sKpCjOoINXwHcUWHMcgKKAAbW9Po++d2YQyX6c48px7cF5cqp0IkzLxZxooy6iHxZF7cFABMUcpjVAgSl8TAB/sXdtvW0UYfTsxfba8aVJq9ZWqChQaCuCoLSQB16QKvWn8Sf4CyDBA+orqgoCpBYq+oDUKkkvaRvbTWM3iS+7O4vO983srtOm70iMFCmxkvV6djLzXc4ldAIlbmLKXoxyA/bmBcLpBwuLR383zLvk+cLzvdw7lSs5ZtfH2i9od73oWDoBCHc9lBZlvqDdZmGsKGC1qhoAVshBYNHWUqHMsVAOhMJ83MJw37v3oUq8u3duuEXVx8+hle4fSPjmhLSSgsBFKBwTIwJoM157JcLpc12Mt/rwEt8KJ5VNqLSQ8GRrAx99ti4VTle5dkMqOVmGfn8HvXe6qNZKIhjG5JwcuENQ8tFEuFpSRV4KsHrhAzS7XdSiBr79ZhuTPq2zlA7ALjQT3tiryhdpCPQkroN8sikyxG5dSXU7zS3/MilWsIuRttrIOssw7TYSQmTJrWHVkr7ZFPsZDLQyOR7JAf16F1kH32kcUzU/Q+Sg7EYrfsPhEI1WHVE9UgXZTOFomYWLwlbvjIXIBIERr/CVVhPjV3t4/qyP4XAX3d5pEZIRmFLqSRfRJzfx6WMsE9LZrCzgHOyqP/KzWfi+ToElqFjH19ev4YfvvsedO7/KQWcYDKTaGeDzfznYxY0ff8Klq+tonFwRW6I3JWfl1/xctKwUrzmagDGYzUnz2MbWxgZu3fxZEv97f93FwXgfGQ99k6ERhKjT01aqsqH4TAtH0WkaFHUUWgRj98Vurnacd2OO1+D+f/xHRsGNLsbRZ7qYupJHmshhzcB58HwHg50+Hm1uYdjv4+HGQ7wajfGCBYDRGOZgKj9zD6bS8r3zF7F68jSePtjE9uOHSNKpFAP+eXAfa199gbUrl9FsNPDHL7/j9m+3xaWiEdRUqT1LcP7jS1hZXdVClWeRRJ4jFxjpiPtpHad6PbS2H+HFzhPMuff6aiErrjG+hF6Ilhponmig2W6gOZnDHOiek8Eljk6/gPtnILZqE89gPwxEwX/a6iBh8FKraCc5mUlnxtik/zhuenmiTRkUQCw2BW2F719BNo8wH42k6c/OUsRi+8yIMn06qQINXygUPpXJpzMMBgN0u73iuWUaUB8VoVoYmZ/P33HDWFG6chHA2AKhsYJn3NBShwywNFffTeQbV5PdQyQosSFxCWkGe+a681nOeel0vS5bWU74syOvO/G4NMtyq1mTUwLU+jUhP4wJeZxhyk7q4RS+wDmNKoqXtAQYrld8q25OA3CPQleRqlMHNjap6Jswnql36I3eEWTMQZYgHk3UF730jKy3iVLVYp1FEWOUJNQGfQz6mRBUoJ7kUAuyJLU+8GK37ATzlKKT5SfF2x5uJlZlDrpNHrygXXyDGb392hVgOUBwpo6oq+J/s5cHmBzOUPGoP9FAfeUEEtozpyEq6Xwxwc3pHFqso0nmq/0x7t/9E+vXr8mZUg+rAr1eGuzIdblnmKonImqZV8BSNHl7+8cpD9dVjK07hmdUIcm3TSm5JoN0zjk7XmENs3SGIPSkWTFJ5qi0W4jeX8Xyp5ewv9NH+mgLk709gdSTH9+Zf4ild88g7tQQR8AkYjJXRcouIBtOXCOMu9jcChmfTIu1ygSdlBAKr9HSmtSSwK4FW9wRlGum9pOkzNaCqsTG/EwxufbDEdL9Qxh28YneSKz1oa9J9GE8y4t2jD9CR/dIUil4hVZjxPfCHIJeHoekdbTqqC+1ESx1cBg9A0Z7MPu7MPFcEvgC2Vd0grhqKaQXTA3Gm48R1CKcuPieUCVSn8gUqGJEOl9w0s7y/cDXnrmLZ32vEJwuJ/1BSZXVIXGhVQi/tBD97EhhMEeDFGLdrOq8nE3x95MtfN47izO9s7IGql6I1qllrK1fweUvr0oBK50tNj4cVVc62ESRTIBbN25i9ZNzOLt8QXncks/YBlBeuNYiovPX52su+XcaaOWEjkkeYe9pPLfTEqr3v4ivF9pmyBPHUjJvadZc+1w/jrPu0MuwluluHh0FwOVTrrNfzr0cn7z8unek2Rv6ReIax+rGY/L80M8bzG6/D2wRKM0bhIvXDay1Hf9W71HFN4lSUbF3im+mqJNiFKvjR0CtDaO2wEz85V7mc0VVOK0E51Bn54mficUK0s2dc0CB+HbPmzTEAgkg4qOlz8v/ceaVnEO1d1Quf/FZ1MreIRHk/W0hyOWQ0vkXVITmyOXh5kH/bnGv14a8Fk1cA1xyoxJ6g3uOy+cFQcJ4xu6b1UoV/wIAAP//5F3Lb9xEGP95bK+93lfz2KRNaZtWBVVFAqkSN8RD4iEVTlz4JzlxQkLiABc40FRN0zZAaZtssknz2uzb9s4M+r6Z2XUS4I7woeqlXXs8M57v9/0egaEczNAzbfXwDmwibRBnLhLFyHYTeQDhXPonF7oQRXdKNm/x3U2Jws1bjYieGRrMKPjugaUFCrwp+iXspKB7MsjV5G8Hx3XwefGo2b91i4F1J6HxFKDDrpscxe4Fuy5CnjHV4JdGNHCayHwioIiejN1QS/NlNG+v4OnPj4ChQuxF0BPzQaBtP+TMS4nW1iv0j49RW67g/BWGEUZZisPDI0a7EtKEEpXFGlpMz5JWMO6YAHwrnkSeawSlENXmHFbvvIt33vsIv3z/LSPNCjnGRIMMG8hLV5As3YLyEqi8h+HWQzTQQeh1eIMTeqbeVJYaOQyAQS1C9c2bkM3LGJPjcVjifGHqhEBmSKIQsScYuU57XcRE29H2HZ1rQhG40FFAN1Oo00ZEkYDlGJkcYdAdYNAdsikPTVSz23tTcx9puxqUU0p5v2EmWH9JDre1cgWdwQD7e0e4eTNFuVpBnknEFR+B0og9hd7eNuStVfjlqtE5k7mJ+HcmgLbmR5kemfuXGldXr+HTL+/j8foaJuSqq83HyrcPqycCP/3wI+5/9QD3PngfftlnTSTNezqQMBXPliEMxPmEWuasdTTutZK7hDvbLTx//hzPnjzB+sNHWFtb4y6/yI3ujzOSPavLtc/je7bE107D5WaLZj1sbuUmNHfiOLEFF/6hbPy/Xv+tMeD1Sp1LkiaxbVdq55dioFAI6/Gg1dQIlf7sn5zi+OAQB7t7aG/tMrh0fPAa7e0W2q0dnJ6eIk8z6MxQWhm45BxzExWVpiMMJn380VtHywsQ0z5OMi4oHL3YRevgAI+fPsO9jU3cvXsXz37dwMvf/kTgmQOwnuSozzXw8Refw5+vcwFG68C40StzmLYeBZSEdam5hKs3VnHafY3heIxKFPMeLgnNIsMv+tiVfMT1GI1LZRy87jAjR9t2vCyUqvTN9YVCj/arNEWpFKBHrrtRGaqccBefmAJEDZcswJczvc6FjpSaAdbU4Ysi7tBxy63kA5FEtTmP6nwNeaOEk/Y+BjIz+5IfoZf1gV6K0nyCoJQgJfqrFhj1x9h6sY2F5rI5SNCBKEsREvuqAFieL5494cRW7u4KFnvaZMl7jk2gTWqL0x5yjDp/ZMRU0ywLoKTGWSOn2U0Ia3Bmx0e7nhgumIB6BCgzqGDtUMW5Il/rsyvwHBjATvmcUGRo8AQGUQFBxRl9n+mdylQjIgxglMGn5AXL6OPYP99klFOhSsegUpnGPYb0bERw4COuVVmCwZG91mWavrWmFawQNWIsBAuI4hCHqo2sM+aDOWezW8ooyQTZQygwrtnSnZH0LDt8OlyeaRZwr31KC1Msu2EugTV907p4prJFhLYgrjaGmQQ3s1M8ydZCgUGeIhcSXiVEMBdDXK4hXKojWWrAryfsZ+NPKOVGIh9OGCSoX1lAZbGJbGcPkQe3iAqyEMswsC+qIoBXGxvo7u6ifuMG+lC4vriMl50TtNsvcdxqQ4QrqC3NYUypAsxss82ewgv2dCE6tzApmD6d24KGzwSG5aBslF2Wp6gkiTFXozhAAu0mkmUgLIGgJgIxB5MA/SxFbTGBePsaakd30B93oVv73HVPc4kRHcz7fZSvLcFr1uAlEwyDCe8vJHXkmDgyvA3MQX0i0tncJZlEOeKuODUhnHmdsKAPGdORhBK2eBf29VFRkI3GyPsjZMddBNKlLghmDgjb9FHswWAo75QEMI15ZiBxAj9XDLbEJFF1bA3aR7UxxONzui8wpFuo1yAqdZSqFQQnHXj7Oxi3dxFIwf+30ZmTX0Y2hZ0C9ujyoIdDnGxuonGphqW3rvMZ+Zi6vQE5lPs8985ejkkjnUMJvw82jRNnwQBlAQDPur/LQoefCxphWMVO3kS+WU4e4CyPeQ0pnwHmVGhs7uxifWUbt5tNRARWeIpZXYtvrODDzz7BowcPsPnkd+tl5GSgcrpeyUy5rCTGnRzff/Mdvr7aRLK6DMSKi00tHN9OcXNNO4d8m1ZWvJRlEztqvXuuGSpmik6uUWCM+nic2IQ0QxhHdk3oaa2k1azAPX8VG6SGNm7B/sksU/8MwGBrN8cSuLjV29qxkP3PSW3273TeMBR+82xJucxxh+YZJ9N6k6j9DigAUGgKG6CCClwCYR2zm9a3kVAYqToV+7BFscpmQEiJmpx2XF10YZEtRYbjVMOyRKAgQ3e/7Qz5pgCNlf6wsWFqfp9rRhtNOGVpsFWFYaY7un0R6GETSCmRxPE03pffAxXytFfYc0Ucl6epeWwCWBgjZlaQ+SabCc7eqfsdBiUK8Y8kl6AmDTE56XfH4zH+AgAA///sXVtvG0UU/ma9u76sY8dJnJTeoCoFGgkEPPDAA6IP/NciXvoTeEWIQEFVlKC0TZxe0iS2E9tZr/cy6JwzM14bCrwiMVLk2LHjvczOnst38VMDBYBRk7TPBYYiAnpysipuIpZhIYZ2xDsIA4vIzckucrUAZVmYOHpu31I+6ZYjIjvhS1BCnAYSA5lpgXdYCwMWJfzr/20fK4bHZw/YzFTW7MgyY82RZWYhkWSfPsPbVxFpCot+oJuKhXJwEUBRUKiRV3L4NR8r1ztYvbGGq+cj5uBX51vFC0IzrGM06ONl7wjbmzcgxkXzg0TfSxcLPZ6dn6GzscoZ2jIvZX7MFCd6spBK0Eu/ERSp2myiudpFLVpHEU8FwkgCh5UG8pVN1G9+jLvbXyAenOBFluDy+Ee0SLVAp+4CtgZsdI5p8cw7TSTrbUzX1hA3WhhZjhhJCBchLpIRQvZB3sTo7AyVZOJEiJYH0wDIMm98hVvNlgv2+ThPE1z0B1jtdqBJt8JUM8UK0XaXeCIIRykoOHAnAcHB6Ip9nk9OBxiNJmi3V7hQQF9INIAkTXifBydH2OpeF08CJZ3Av7cFnEso8jMvQ6PTxNffPMCjh9/h6f4ud41E5FqqMyQ49PTgGR59+xD3PvwA7Zu3haJCqskkQuP57jYjgmc5dJphODzH0eER9vZ/x87ODn75aYeh/YPzPt/0xRs5RY15xh6Lqtg5CZTdEwtXKbd4lJy9XBNOiKgb1O028O7te0DQ5DunViV/h/8hAP+poV2Rh9Kiqem1GA4/zRNSq0hTDIdDDM7OcfLqNV72jvF0bx8nL16hd3CIy+EFw/pztpmSmw9RvfxcisBUFWd+vtJG9DVjsSXquEdhDdkk5qJyaAqktH5PxlO8Oejh+7Mh9n5+goioN2khojepWJveff8O7t6/Tws1X0fTNGGnkDKBgRNR4s1Sx2lzA1FrBePhzAgmBVAkhpZKEOlXyXbMZ6j2ajtCnl8hi7VD3LhHy23VBeLTU3jdDS5szOjGatTUHVe1pEci0P/F2eHEqIySczKdmM6/D9QVoq026ut11NtVBEUDw4bHFDLh6lXYo5yKlTmpTTd8oBox5JEUAsaTMfr9c3S7XQla3kIP+7dDgnAPJYAdB+vzJN9ityxPUt7nmb8X8Jyt53x4rjYi/9NbTNqX1xPHpRQawPL7ltFR5WE7/bnpplrOvzLwaiqasz5MKsJus1GM2VUsCAASCrb8Vd4Pz9xOfBYfY7oVBbz1KurNhuvcchdeid4LQYrpGuH7TytEy+9gluYYVfqY9sdIqftNsNqZeMmTfgspA2qtnHaBpQfqpf3OmXeeOyVtRQgVXsulc2rAAP9I0PIZXZFxEDxVGWI/RaUdorrVhrcVIbjWhm7XUDQDTCvS2PHIx5gC4opC4uWotxpYWd/A66MeogVKCxa6sPRanagyqcbz3Sc4+PUxPrl1i2OJmvLRrkWoaRJju+KCo18PgGboAm/HeVULTIW3DtsNViYpYCoAWSF7Hge3tglEegYTUgxPRUGbxeVygV/PVIFJVcO/vgL/o5vAs+eIT4cIkxjTi0v4x0CYJqjpAk3SXFptQEUUC/lMIaAGGVNeTRyWmeKMPZc6jIW24YtAI1NdTBJINCsWneSGgaH1EGSfkin26c8QEB1WS+NDGURDbgtjZURNLmKP9JNfxcjI+3yaceErMNU9Zbrrdo2SCRIwumNEqIhqFVHzGtCKkIcFoxkvT19DTWIuQrDd4ILviAjB1qnDOU3wZncPa+Qi8c4m6l6VkZ2EeMzfgkBim0AtiC0YkUTu9nqCOnACaEbZXxmtCM/orXje4mJitQ8Ki6I088gzDULRB/BwkSTYfXWMz967g06ngwgVJDpDrVHD9uef4ssHX6F3eIh4POPCidVssRcsfUeoyFouQe/xC+z98Bu2W1JI46SWuvu0D1r8AVgU0nTuVaGck4XYgBeOhy6UZDmvyjpbaOUs71ByvKC8pOpVHdXabZ3WpURWc1OMO8VLVNwyvz1n6kroXNRmJpkuw+XLn1kYS7D35ZFy5ztwXX2bbIvembw5YAp39icI/cK5NeugLVDMm7omFl9K0Gfc/S+EAmHy0az0fnuc6Pq1zxlBaBLssiYdU+9Nc9wm9C4PXjokUdSQHM5SMDjxJxqZvE7bZfUXeJtM8k+vc75qjo3dJ5eHGot9bkTY88bbahvmUqARQcP5MXQ2jBQPGaQfzS1aHwM/wB8AAAD//+RdbWscVRR+5nVnNrOb7m6SbtfaqBWKBYu0IggKUq0tiP4AP+iP8sf4Rb8IIiLVpBZr42uz3WSbrWkSJ9mdt3vlnHvvzGRNivhJcEIgsEmYO3NfznnO8zzHNYl7lmVaQ+UoNFUfWEYrUK+0m4nArRV8v5wwTHOYC0ocpzbxuHIrjr3ok2gtZvCc0OQK+WH9CNEmPL98UIZSU78M+lFqoYqiAid4TO6xicwtbWzVlcDTdAlCqBS9JKu0ScaMxlEyAEaXPB+zNGH3XaacBYDfjdAeLGH3l120LEOirEy2UtLSwsfW5gNcunJVua3O3T9t9uSdMBqNMHh2gLbfUhpXrbGpX4VEZZQllWsyvT+CAdqLTfTO9tHuLOMgmTDNNLcEUqL1ODYSz0HcOgM3DOCtXMDe6B5SO4EtlGbM1SRwE3rTSHKa/L6PabiAWdCETfpEqv6TI71QngIFGQitrCAejlDQeE85AOiWMwn88WeOdInAEacMbkjLS4kIoVZeU5kh8sbObpamfaIKnpjS59p80BPdkemaro/dvRjbjyZYOduFF3pqQyCHXxs4iPfxaPN39C5egd0KzNM/VSNbfV6r+jH9NMGly5dw670P8MnGz7ryXjAwJhlwUNS7Lz/7HO/ceBuv3+rAW+zxM2JPANLviYIlDw83h/jp/gbr+de//Y5/fjx+rNpnkleF68OlZEwv/gbRw5SdkwKSCsVsEbV1USb/+iD0akAAnSn9QQsffvQxbr77PpB7ynzHrCnraeH30y5zBP8Xrv8Pi0GWUiVHm5AKrv7RZNzb3cd4tIWHDzaxNRrh/g8bePgbVePGONw7wFEcczDnUxBNjtD0Zav2T6p3L9hvg7uxwNKmfIJdiPfjKQNeF1bP47Vrr2K8tY0f1+5gFsdowIVPSLdDa4EkMfsYHaboLp7Bi6vPY2d7h5NIWguvXLuKLrU5sxT9P/ADQCYlhV1oShwnUp5Ab2kF/cEAv8b76iDVlV8OpKjCF3iQCw20OxHOtCMkscAR9coVSghDAXimQTBybXdljnhnhKi/jHD5HLdjzUSmAvayxZHFLteG4mnQTavcGup+OBQ8pEDDhtPy4PeaiM5F8CMPbmTDz3xEnRamw33tK2DBd3yk2QzicApMfch2qHSkdKblFh4Mh4jabYSOxwd68S/nd5lg63PDrNZCB7hSj4nd7KVVM5/VFeZyCzx5nZd3JeeS/nmqbr2yO7f1Gor/PLW3/vuFNrsSWg9taa21AfFnScZJfXaUsGSFer8XhzNIckGuB7TaPIwok5yoQRsPN5vsI2MzfdMA1AoE4JsjyRdV1Bk0sBGd6zLd3CIH+b0jFOQ+aRe8nmhOu8Sm0A5oVfxi6T2+PnZlMIxSaqFM7SS7htsaQKiZ5Z0ABdD/O8ynkBS70bnckAh6Hbj9CMH5DqxuE0XUYGZK6gqOJQLSSnsEPJD7uoeExhu4LLkZr9+FIMhevzP7pKOBmCwu8OTxE9xbX8NL168jbLcROC56UQuLjRCTgwmKHQtO08NC0GUAjMzxpDRdJP6Z7wwH0qgCeko2PG1YlmrZqZK4FQipXR3FbVoLL6g9NIP1EjOnQKsfYuHyBYidl7G9Q54mQzRm5BdxwBQhOxPcJSBc7UMutyGbNhKqzgpjMl2o5D8X5fsymnUbVecjk9wJq0riUTNEI6YCga1M89eAKwMiOjlkcztKHMoFWzB4QAwBYm9YuYQ4SmBNU9iZ+sxCSaAswUnleO5wpwpqWyrpF0IHUz+A23QgQoG85SL3CsjxBDJO4AtZvvNCd41yXG7UyDHJ4WSC0Td38MKbbyBbWUBKBSNeSVWVzqpNGgV76Tfo6C4ftmRgADrMomdVmNae2quDARPHeHTZT41Q5vcUerJU5tkYj/H99hCrUZPnJIF9ZE652F/GWzdv4O7tNax9dbtkR+WyZiyq2cwNq8HAx9effoHOc89gEFyE1YRiAAgBI0oSNQkAyVBFDRDgYouUJzOpULU9N1V//tbzwNIs4KJWmT+WW1Euk6VlMddU6cu2mTrBZK28UF4ndR+NOith/jrNi2H+ojOUK9tFXjIUKHYlZg6zqak9a5Zz7pWmVTG69CGAaT3oHq+g66T+GB1fqhyFGVc18MI1MnbN3gJQ0v3N3xv/u7+Ps8r/ODemGU1mgJp2b5Ocr3aRpIBbEZJUlz0P1H3XDQDZx0cQgy/FQqhy2zLHpUIerQHOwbW8SK8HAifqDI2qW8PphQAGmjgfpiKyjg+pWwsBi7aFvwAAAP//7F1Lb9xUFP7sa489nlcySZPQAoUu2wohKh4qSBQpa1YEib/IhgViQcUCKlE2VAiQKrUNJGkb0ozymvGMJzP2tdE59x7bSat2xQ4vm0bxeO69Puc738MTRAOWAWCaf11SSozmoWIAiImEmb67pUOjgAeivRJqhEzf65db8xJwLfJf0S6M/qm+iKm4E3YCLQT5u2ZjiOmg5uanWgyiqVEla0C0hnWUKbPmMeyQrqxfAU9XDXUM1lAwY5dO8zeJjaBccZc1aBy9sMm12eu3sHT5Ep7+uoVirO0Crn0htjXae7KNyfAIfn8Zuqbla3jGKIY+6/HBEU4Oj9DmCYQqN1D985WL1uoG6VlR4WJiMhQ6ixcQthcRuwF8jwyKNALfxamOsX+4i2J4jMVOG27UBRoRtB4Ssd4cXNbIBHKQErU2mSGbppjNUszdOfxOZAy1VMY6S/LDSCY5Wq02sNBDejJAqCsDqPqlLfWPRBLxTKNPNEvMeEFTo5EkpxiPT9HsauMcajeC0RjZ16pjWA2ul0M1Cp76RVHEOuNhfIKTwxMkk1PW7gaR0VcFATUlwHAwQHw4QK/ZsqZeypaz9UPvBRQTeSYki5hPWaaxvr6Ob7/+Btu7m0zRhAUoUoso7jw5wO3vvsf1Dz7m4n1nb48BnsePHmHr4Sb+/P0PPN7exuDZPiaEuNN6JcDL0iJ53WQZmnRoEUCUZ6zXJCMrQbhl38k0zC2qxqQq8M21traK9z96DxtffY5Pbn0Gb2mV3W+t0YAxSn8VHnLmaYjS9X/ZwH93VY1w/Zix+NwAACAASURBVCr1xtYVmZrO6TjhKf4/27vY2drB/fv3WUays7WN4eERknjKU241Tbl4DDliyzM9Lb8sFJ+X89mUKY/EkPJCl/0t6Ht2beTdMEtQ9AJ8eOMGNjY2cPPmTWYU3PnxJ9y5/QN2H/zFVDkvM8Vj32vyOUETpTSZ8rk+SSYIwhBvXnkbKmywlpLo2dSiN8pG1ex4RuiVAbkarRaWV9ewv7eLyXCEGQMYVoubOjx58wLSvTnodpuYTTQSiryaUeRebWpiETHl5AinOfTgAO7qMTq9HmJo9kmhm89rza4xX60zAuQ+awIa+rdIQXUVwpUQzZUWnI4LHWgUfgoV5IgWIswiiqdLOaKNgEwvz5CdZshGMdRiiPm0YPlBM4owGo3YC+Ct1y6V2fov3XOFaRqry6nurX6fRjQvytzyI7nWct+cuWYCXVi6uVtjCZhfOHcfhXumAC+1+U718xedL3JvzDBwKrAhP0clFmKuRNGyDwC9C+i9kprJfzYrEOYK8cGxcXinyWg6N7R4Boty/l3XUoup4SgpEURPDzpodEIGgYrS98G1GLCGHwTIUo05abgJ/G010POXEHXaSI5iHD89RO7MefykWS6pDBuHmIXEtnpBfS3pB/z+tVFRjng9PFeQW0p4UdGUc5bA5AbE8IxZnR91oFoKvcsXoJbbwHITs6Zjoid9BcU62AbymAzlMoMOex6SPMEUCo1+F8FCD3p4YJMaaryc2nudbq9wTPTwvbt38ekXX6J79SparsJiM0I3aiMYHWI+TJAcjFjy5y9EPEShbnVmC/s6C6Cc9hXnSghhfshwxhbHkqnNSVKUbqV8jvPz3RqgUpjaj6Qap+Td4AfoXlyB/+41xI8HGO8fIKTadp4gH8WYTec4jcfwdYqmvghnuQePhkRhw/iK5LmNypOQZMXnKj0Qls6wWaRp5DxlKO7EADRT4Pq3SX7KysZ2GSZhLt4N5E/heZWxNIEZqUkDIHYDsVFoPZHzv8tgQG5DjqV5FpmFmBMaDXnBSRIFMpUj9TQzQLy1PlTk8rAkpUbt2RGzknQ8KR0taNgS+g2MkxF8T8HPCkz3B9i8+wveWL+FC0t9jKAxV9I8y6DPar4tcALUJ966zn4vUz1kmRVuxYQtKEr13G6QZCv33MEijBkqUJtRgxMpftv8G+8sr2BlLUBEjV2Rweu0ceX6NWYBPHrwAJOjMVypAguJyrZyg4JZ/9h/GOPe7Z+x9vol+H4TOTG6XBEPWP+q3IA8hW3uCutYfwb2U24JqZbyPPtjllLDsAaon+GcfImEe8kEvmQxO4bZKcNL2VdUK8veoWFbyAkdnt3L+gztvz5YFXbNq8wBpbEWQ0Ax+CtqLwZhAACVb4Bjmdgk6RKDPJpaC5ghWv1y7/P/9/i5ZWd087r0fWN9PsswvJKyL1GL3NdRY36mF62kFCbq2njWES1fUuoo/rv+fGQAzj2ipzAnFo+l/9NzFSNESVQQWTk/h7o/nXi92J6He1CSCJMcuvwuzORf9P8crcrGgxYcoaFxZgb73J+zx07OMml+5lmKf0m7lhY5qij83Xp2O3bPI5nJdB4mBt8SBKMoQfwZCiqKqAtRBP+Bf0Lc60JFcBFwEQUVlaioCzcqvoPROE6SSc90T3fX68r5zrnVE4i6kFDMTIapqr5169x7zvke8b1PPfiSBC85sSxQRALokq/cARcetiTHlT3EWjubZiumHv+x2jAFRw5vVhq12orkWUaoMpN5JloKts7TnMq5hC1IRdWpzZ5Uifhh7UXhPYgZR5q0lSl2hQ2u7AwmxEEI0Kj2ofkWYhEmd4BiJHGEYIPIawq3w87tiRiIMNndZdBmddmsM+S+KAplnCNHZ90MGXI02yU2vj2Pcji1z+kNLqmba6psF1McOXoUi6vr6nMsvG+xqqkLWuywklvWvP7BAwNkeQdlow/dm2KR2nN6VtMUFlPrBjiKzKM3w/DSCH+c+w2b539CnkixpUAhQj55RHZwtLSOQ6sDuOEGhud/RlpdQe5nZv3UtHl7wy5Zg7IQ3n0Pvr+CbHlFGexZSq5r0skYyGXcFjo99JIYo19/gkjmFVXbMCGPqm6FmvSrhKHV5SWkVNKruJhWjaPP8ur6OnmZtCVjBTNpLQPFd5jIBBEpNDucyXRG/YTt4YRWjIPBAP3FBaR5xCqYitxFmBYlev1lLO7bx84PiNi42j1+7pkf/vnW4YGUizhjAFnu9nBp8yK++uILE8lJUfoKmTkny+L9+x8b2Noe4eMPP8IrL7+MN199De+dfgdfnv0Mv/z4M3a2rlBpOYWqQscsAkiwU8ulyHm+H7KpSJ0qewqHrfYqtBg6V+IVOrPCQ1i8ZIE+cHAN9586hYcefxRPP/csHnvmSdx88h5EUqzhiuZMUGxOhAje784FA7UwL7z1nUL12rddD/07D/evtfk21LUUiGsf/1WB+K+///dDu03NPx4N5pX8ax3R/0Q6OFOjD/ByenrUZuUSa7Kgo6xGQ8oMVlh8iZkqDPsKw+FlXPjtHL7/7ht8+elZvP/uGZx+4y2cfv1tfHLmA3z9+Vf465ffsXt5G35W05409eIEHlGbRKhMMS17qjYRjNnlSMidFg9fubvxZETbs1IKrr0Ojt97Ao88/wyeevEF3HLfSbj9S+gfGeDEA/fhjrvv4lwUgclqNIGYbnYTtVulvopXHvu0KrC8toaHn3wC6zcdV7inxGr4Vr8gWJJyoZdCbKTzkLDbQigz2wxSKvxaIxG+fjHFdLJDhE1SO0SCAp4V2JHPY3Kn3kjnkTVjJWbuTEu45SW4pT5m2XUoErWeiui17s2tytFi1RlNxgV/b8J8GyaM+VIXVd9j8dh+LBxeAnoxIoH8RyWqYoykAqpLBcZ/DtFcHiOWABYrV1XiWOkLNFmBdCGGW8jIJxaxRYlbi4sryMV3WxBE3Aw5wt3D92rDBEugXXvs9fM3WVWbh6FG61qP7kCJC2998ERW4T37uteXH3t+bhXD9X6aPeehZWIrJuiuOge1H9ooQ0ibNgj0LvdcP1A5PFEKiuJQNXEK7XmHYlLDzxzq7SmqzS0siBDkxUvwo5HybvOOFn6d2uLRMkzoJZ1Y7fGaGfpHB9h/9DCtGXeFDsP5Yt1qoRWYiBOpFAEtKHMki9DpddmJSjo519s6blggd+az4cjTl0Qxnq8z3pn7jttj3RfCg+d7o81/TSx9Lc0KRWxWTcE5452gVjyargNWMnRuWEbv+AALNx5AfngNbmkB6HTJYa9EJZ/7DgHbNOj4DJ06AXZLdCGifw5pE6GaTFCORhhf+BNdQqBDXzcYBtv6IBRDyUcbYLi7g2O334ljt96GK7NdjFFjY7yDrZ0x4krOWeG6vKP0Cnlv5YnbO+T26Bk4414jdLL9njXY25z2sFjs2kP2pNTJED0PE0VjIcus/GCCwnmUAbWg6TIkSYfxdba5jdH5C+iJHZ8Ui4oZUEzRTCbws13kUYROtwsv4yh7VrFITjLOPSV1moKSrJuR7jsjszBr/NxXnbx+2UeIU4BR+5jEmtVZbBx3MGHQd4ngE7H4k71C2SCZVhQtFH0LV1RwU6U7kBIgugPObPWgRZPQW5WxyFzK8a/EzjRpUGYedSqoAD3ibh95r8+YujW8jKYRYUBN0tkmqgqlhZGmIOcTT/YRmnKMQ4cGtD9uZE+egK4aTaSJe+RyolWRaILKDrcLSBzr7DsdQ35uowKEsXBG0zG+pe3/ozknPRyttbLFJ3KiVdxNEEFrK/twZG0Vy2mORLq2dYnr+4vIOik2Ny7i3A+/UlixsggU9q1s8LBVpmIp21sXsX7wAPYdWUMt+2yK6ql3TW0gH/leEs4mUANQz1EgAV/mXOs0wnXE7j6Oo9anP88zE1TXfYPA3B1t6lTXRxJcWpQyr8uvaowGjYCrhDft/0MjmNoZVkSLo7SNvc7N3y/iWrxrvfwlV5T9A6nSVgXX63jOC80JtXkqwuBlVTABVZvOIIznmH+FhnKIdTEbEDVzSLkW3yUZfUno3dymL4j0hSa2MzvK1hI10Pbg0RVx8ZY2oHRyaSLTdcCay5KY21JohTN9DtIM4Ttq+26Or004+R1/L+Nh+aXEsrKcEU0p9BCeR3QPDMWuyvxzC3t9Lp5JOmnb5CA0/Pwy11hEIXoh0ryaDhnyPsu+qkAmyX0x0/GRGCOIb0F1mk0h9RykuNN4/A0AAP//7F1Lb9xUFP58/RjHM5lJ82qnTUpLoW0opSUsACGgovwY/hGwZsUCxAKxQypCQiyQYMGmFX2kStNXksnLzjxsX3TOucf2tAjxAxgpqRol4xnP9fG53/keAS8a3Sz4PlOES6exsFYWGzvfq84qDBG5ibvm+TfND9S1UD8QRUSUaqLmfUr9F0TEcJSCHlMlBVS0uagEEb9G9SBgswpHwc/GWaX/ovcyyfPqRkyvO05Eo0rH1uduLvQoiSvGgXGTJTpRbLARhNWirDIanV+Aoj2E/Asia3gAQoZNyWIPi2dPYfPZPliSXdZTGr6ISJM3zrBx9w76F6/CI+p7hTxJhJB88JZNufYHA0TtGaHzusg6X3M/Pc2f9apptXi9SNfQ6XWRdLsoLBXmjE3ofAIuyiPY4QDp801Ea1cxd2oFpnsC5XHgTJvKl3SytDePhmMMt7YQzJODfgd51EIxCTGiWB+a0pOLbdwDk4h7S8DcIobbT7jhCRrbOXVtVYBh/zjH9tEQ/TnaUE94A0wLmJrag/0MJ9gI0AE9Lj5IXpxhFgCbyIQln57YRQImLYO9nX08e7qNpVNzMg2MxfCJzh+tgqcb97G8+goiyieGqWytZLJhpornPz3IAJLWCLlBf3jjA3z37Td4/OQR15YWKGJwXBX3Jzu7+OLzL8WXQilMjn4buSbKb8ANHNNni9qh20ke2MW5FDsvKSoGx4oO87qeIGqHWD19BtfXruCNy2tYe3MNr156Hf3Vs0iWFkSf4ND/Gowtq8++8oSfev/T5k9TG1n5VKd+7//Hf3h4zQg56RQCZ4gk13MhEIBjZVHNGY4zngQTbZ8YI48fbuLunTtMvSe3/r3dAQY7O8zUIZo5NXlt0+K1RZMougkzk4rqOK2YQhph1vVT01IUbupkmY3CebvjEZJWCyfm++iv9HHtrWt4+6N3cfn9d5g2GQQ95Pmh3CCpMYrbOHf9Cj67dAnr6+v4/quv8cuPt/iGFDrKYXaYSl0xPmZ7XcwvLbpV5BqfyhxNneHKSuPpWlgknR7ml09y6sf+zraAn5S0UeYMGlJudBnmiGIfccdHpx2gewAMJoBfrVSZe/PNvPQQ0OR4exd2sAd/blkrltR5V8s9zXl3F8OYgBO6pqOQpWBB0kK8MIOF04uwsx7Q9mFDD8MiFZlSAATkT9Cfx25vC36LnL6l2npMFbfMQhvtHiIgIKGTYJilCKIO3382Nh/hwvmI409zx3ALXPPzoja2OaWZHthMi63tC9rrppbW2GqLJ5XK7fD9KbH2v7MR9D6Cxr8veQKo9tL9vNBkIK9+H1yhVQPt0gYKB+rmbI5VMIhKjJZ0NGRX+4TW9UEKe5iyNtpvCZDP9w4TChDHzu6hgDj5mH0bWp02OZ1hbIXCbdwIUFkSxqvdcuCm79wc+kLVn1nqIpnr4piicdM2sp0BymzMaQ88nieQwqXf6GQ2LJV2Stenc263oikmIz9a27YoKoNEWlc05TdGDIq9JELSnYHpRIhPzsHvxQhmKa/cYBRI9rwMPwI3oCk13d+5+lth1oHH0TgqjpD0uuicXMJB1GJ2igA3tprQ+npd0qbAE0O6LBvht59+xvrNTxDHPm9S6b5Mhp350SGD3Qebz9ExJccdk8mhHFO2zwy2VIwH2/gOZ4JYG0er7tU0Ipxl6qUG1NSYywaBNl7KcuIJops4jjBBvDyLzmsrOLx4HsN7D3G8N+C1RJteMypZ1uhnKevho9Jg1gsRz87i2AOO0hQRmXpZoYCjFEYAvanCTtMXVJdcUeoL+SyJiYGmFNaZUypkZxQUIrCT/oDAzFym/eQZwBn9hXUO+O4iatQDBk2cVEbMgt3PrcbWOfYtgSVRgGhhBt5MApo7zqDEeOMBzEGKaDhxqUKuV3T9YUCsgPEI6e2/8ADA+Y9vIu+0MfaEvsxHYYDH9atG6KHWq41DvEZvWGgKmFfXomZ90P9X7O1m5Letn6s614Ws24kpkZUWf9y7j2vnzqG/GCHxDWK/w9fByuWLeO/TG7j9+5949mALlPUxpKStUl+L9kI+38PTHYtff7iF+QtnEK/2EEQGQ3ftNqztuKe3Ll+7bEipSgUntL7RYJKHPXIc3T/pXky/mrn81VE4RWJS6+VtnTTA9SUKZfrLE+LxFCu6pow3pACNHlA8Ourpf9O4U+PTWe5SaelLZkjBMb/l+UveW3GPw0kteUWLz/OiwTLwK+29sLSn7y1eZdguOn3jTLA1px+OfV2DHFLz2MRdk0Ne6O9Jeq3PLUCAGMYSRZ8T85znh8oHVIqgD2ET1CyGNM34byuWuoLEHKNTmyc2fRxovyqRjBTdpwkJtQE/nTsavreCFsa0f3a/o74E6qcgIGIt+2CJBAETBGzQnjnw8TcAAAD//8Rd22/bVBj/HV/i2EkTp5f1snVlrQobgiGBitAGE7wjJP5OkHjgESEkJCQkhCbxMBil027dmu7StEnTxI590Ped7zhO2m4gHrBUrdqk2T4+9jnf7/tdPI6AUCmjRhBKPBfkVPxyGsBoYkLQSeiBUc6yMRxzJuILeCFzx1oUphokhrIyEgMIfjAiHUCJTvJPKCXWgI+dEfNx98V6C/CkFtdEQop6vV7hbkkmSlEY8TX42hdAIOX7oYdLg00v2SAZiFwgLyQM5sOYT4AePE489mYiE1qrKxrxUguL6yu4/9tdjmMxHTv7MhkHakrT396+i+ufHKFxYQmZdkSOIAuqTC66/p2de2jMzSKohWxMhaLfWv7yjQ+bZEBDHdRDNOZi1KI6vAwYeUPWvrlkfpj0cNTexXG3gyieRbC0irR9B4LtcsffnENoVdQxJJCl04F+9JDHIFi4ACduYsi5r4r1W65Tw0B7UPUFVC6+ic7zLuo4Er26jIQ2HTRrSnc4yvHsuI+FuAGf3GORcA+caEmdzgHnebsVh7uPpivgsQ5zHC9p0DaSPZAbM7mNRrUIncMe2u021vurbPLiChWLunk0ct3DDg5etLG4sswdFMhmUKtzKt1Sx3dshqXh1qv46NObuPHxTXzz9Vf8dHhDwanJ5pm58rgowsRT4pdFGxExDnK1oa96kjPtslsESh8y6ejRGR2z4DILhdxMfR8rVy7j2rvvYfPtq3jrnat4Y2Mdly9eQi2OGWnnCSHetuRWS6Db+XrLXEoxR/rwdnOfT1D9pxV458Ml/xco8Lrzvu7f/2OH/5zz2VGbZFHnsD1aAo4I8KPFh4DK/b09PH38BPd3SCbyDA8fPMDBswPsP3yKfueIafRaHHPtAloL66xR80RbS3eSDjPz7lC6RJIgnmmgm/YxTAeGZ+AAwzRBWKthZqGFleV5bGxuYmllGWtr67h8ZQ0b65uozrY4Hs8ASaaA9rxIOksGJSd2FJoRPvzyC0SzTSSBg5+++wEppWUEHutDialCWSt0j+zk65gNi3v2y3fmEcdzaLRinBx3kbHpkMt5f15QRRA2kQwyqDBFte5gphUg6nroHBAg6bNsi+4h42QAZVJfRiMk+/vwVpbhr+XjzH3Jduf3XkkHh3PkTcQU03QCoNqM0JyP0VpsIWj6OEy7OKHOnDKsCsfJmEpP6QIRJQJcmkfv3nPOESfw1xHGATluo5NAvxzAjWjFqMAPFQajEZ6/fIGZeh2rl1b+1Xyc1tNP67gnYvr0NAgwpuUW9OxzHlNRqL2C4q/VaQCgoPkX3gHOadBg6npzASr5y0QSuJFh9lCxM+z2kdK7MUgxpCSL7pCLOerKM8DrmY4iA/iuRDMRbZk2yPUIcbPJf9fnzVMmjAgbqXd63IrrYZf4HCpQcAPq5FShQg+tZoiT7jEGRz0Mj05QoQjdxHTuVKYZlGYpltCE6X3kvRLRk2ntzVI2q+Q2MFHJSctWdeCGPlRYwUxrDl49YOM+kiNwhKVriq5caB5a2aI5Z715Zvcm9DXPxiA4nVtVTMoPgX/x8jI6sy2MnvTNWl+YxOYFV0tLXrpSplXxx+3b2N3+E7Wt6+yHQO7TZITcGR1CZQ7Swx4Gbc+kNrRC5Mo42kxTfM86zKMQqqzQ8MkfpOCvaWFcapNxboqPsRM67xe1Z67eHfGaeqz7aKy2sPD+NQx22+j+/AuCYcU0MDITc5h1BzjafgTvoA+//RK1zctQizF0tYJjYmHQ/KMCndbwUnKTOQQwmnbGl3twtDMhq+BnoU1R6GpR51GBT3pgmiNS/HPcIReCZr4oy5aycda20Lf3Lo0H9i1QELkCmHVK/lC5y+Jp1ssntSq8i8uIiDrt+EgePIZDSQH9E96fFGxJbYxUI2I0DBP0ft/BrlfHxme3oKMqcjKhZMkm+LtrGlVOYYI5sSba0XJLXX1bpIrD/3nfnn9ycKGEHDvtPWzvt7HZmOFYQ+UTK6OCxvw8rm9t4YMbN/D93rfIBinbwbryzbSnZj4vFdVK48lfe7jz46/Y+vwW9LzPTKdCQ2+jbK1J3xkGcq86qIgkCrw1jysfFgBQwoAu592Xi39rim7j0K1htD1s/UQ/hdR4apCZJajHEgb+hijfpKqVzDc9MY9nD4hSnWeBAU6Io2tJT3u4WeDCvKPu2PNNvOmYlUryFQgTuARG8PlLvnNB4J/6/yEeAmX/AL6mkn8PjQ1104ldEYamAU2N4H7fmgYa5vE0gMBjzt8Zum/yn/P4J6d5LnVr4SsgsaWGdGe9RKjGpXEZGla61KV8zfI77+W0iQ0kljExDCw4QgAEy6Udw2Qn6RP9SYwBcz0GeEmSHHme428AAAD//+Rd22/bVBj/+fgWO3HS+9ZtdNXGYNAgQBoSEjeJ/2CC/xUe9s4DG/AwIaR1KqzttnbrkjVOYie+oO/7zrHdLNN4xy95aZ342MfnfN/vxlW/yZmk7gfpGwxlgvZ2HE1GNAP94FHHv3QcbQalqpvJ2lFlV5PXPPhkLGOcJbkDok1TxBRCVfESolu3q840x154DhfewgRQFcvAGGc0b6pVoeDQUX364TQmh9kc7VBi9+h8hgnAmiyKYyuFXscUGu1YaRoT9HfSUbMrZoBhCxCdzGhDeQFyPXiRz2kAa9e2ED8+XVpj0AZ3PBrh+dNDdFZWWX9Ek63Q9L/asMXC4eET3Lz9AbpKDFDKRv4x64usustoTBLNuGxeXsP61jojcmR+ZFkZIyOErDgUURifYnh6iHxrG96l9zBSIeaYsB5WacoT051KWVScMkeY5xgdHwlynZcISJPuREgLhRm9MChuiDYxyoW7eglZpwcrpoVqwkW/0kh3DqsqIAknHyYJztMAfijdedrHT+i7RjGmyRTdoCtIVKGTIHh8GsWobWhARM/zuNkzGMZ48eIMZ2dDHgdC1cRQxdLxQzn7Maxevw63t6npWf+96BPDHnqxpXB7Ie7+eBf3fv4JZ/FLdugveexqYiJdbpuMFMlck+a+I+iLbnJfWFwWP+lITDfTlRd1f28Pd+58gb1P+uh//hmu7u4iXFuRBUc764rr8ZQ3VnS9wiZwKoPHd15tRcEtqwZVpTtf+g/v0CX/j443t69vjlhzA5VMx4jP6b1wjJNnz7C/v4+jv484lo+R/ZcDJPEEyXQGN1do0eKbixMzIYB0f13SvBYZ2pbPzSfz3IFdatuCAMzm3Ex8PnzFCFHQi7C2toLdWzexe+MGPu7vYXvnGjaubyFaWUGn06WKWkw7nBazmJjeRMUqsxMaujlC4A2ThJBxz0L/+6/xQ5Hh9egcD+//ztTpFul/ywLxJOFGbByP+Ry2ZvnIw6bN1qzy4mhqpJLMPv1WiG5vlVND4nTA+uWMGADKg+1TjN8QpVPCJ0Q0dhBFAUJCggsLM7OZ0XOBNtzUFnPiEazBK7TnM4zzgI1TreqpLrTOmtgSCWf7k6O5ChQ2rm7AjwL4HVc0zdmUEVFfWay/a3EhApbtUKPFcjxE2+tIVyNgds7pCbYx/smJkecjPZnA9kfc0MlmOVOayfzu4OAJVnsRur0O/yqDnhQF3mABvK25bgr7ZUetva+bAHajcGcfCCwWOCa2zcB59V0rGnn7yw5T/BtZgiaxNTwD9IemlnJcWAnduFHMFpvNMp4bnh8gjVOMBwO0aY0mP4U0F4NL/XxJ882uWHSlznbPtNZefGMCbgwwZVXHEleTtax/1NvGlsqM6TyFFzr8zlakQW7bHPOYj2dQSYl5nHLsG6W/MDs8FU03JcjkLPHLWfZCc5qbyMTUdFtMIW11WmyS60Ue3NCDCl12pydWwNy2tMxF5k4BMaU1RQg7cvt21aSxeb9ja7d4iUekiDQnDBGPXqMbBOhsbmJydoYiFXPfwhSPCwwPnY6HwdNjPPz1PvZuXUM2T3k+e7R5Z1sLh/dc2TDG2FHoEDOBIn8IPHDILd+qbCXqdISLSCcXPVxUSuPRWlCNcXmpi4qiYUAtRY7DiCyPjcq4kBulFL28guj2DtYPP8Lx/gEmkxMIXzAVpRzR/F/HSJMpxi9PYSUxvNkOule2YXs+NyFyS6Ip87mwAOr5V6ObjdnCjESTbNScj4yAG/MuoqJTtn8mDQDaXLccuyqeSdJBTWPDJDH71+pcuikre+Xm+WtfBDo3yQtKh/wjbEyoEAIxYUIE7hV0oDCmdYpNzaRZ6mqaqBEE+rB4XSLTwPGjx/jH93Dl26/g9No4madIHMUSG74mkmaVJh/d+BjV74FSLX9Z5DqBZVkBtuywFsxIlU4xeZVO8eDRI/QvX0a0toGQ2uo4+QAAIABJREFU7lUxQ6Bc7Hz4Pr787hv8+eAPHP61z1INVB4D5vkCN9jpWuMR8Nu9X9C/8ymCSAAr3tebJpkGLJVVS/4Wn2fTqzHos+96lWEc+4AZqrtdx6ebBoCRNwuyX2vPzbhyTn2R6QJwxp+mrmsi/ua88p11AW2Qf4NmL7IOAFxAuOlvch2jDh2rDu1vwPUZvWOJMUxgpzblM3UXy5kJnJ6L7NylmgVlzZyBLpgb716Twa80Pd7UgM1DWOxOFeHH+5YqO7+A44kZHx1kBG8QdeNnZ65P6lsCPWR8DDhMxb48y7IWi1lgJmkI2juO68bG+rgYo88SRv2eFumFaXAQ40P8EqSpIA0Gak7wb9fsBmqqcB1PZu4MWMvvp5EQ80NhmFrKwr+0XdtuG1UUXTNz5mJ7HKe5kLQJbUqTtmlLQagIAS1CfYL3SnwUDzzCSz+CH+ANCZBopd5oKKi3lJJECb7EnrE9cwbtvc8Zj8NFSICrSpETJzNzbnuvvfZaiieQlj9IH4JBXZVRL7dKq45BpD1WGdfc4+KZajwqG5q9WPs+CyFQTwmrN4uAn6VfoDIgNrmnQbfWB5L4o1TAtNQNRn+O+FNa+8Ia0UsrlBb7fUrac55wsnBKxUuY/vl8skj4wQZB+R6DA/RZttUIeJLKYHhcLc6NhyarfboZxoHC4tkVLK6voPP4V7bGshPZom40gcfZEM8fP8LGufMsJjSCVOcIhSXajF1s1M++u7uL+cUFAQDsMWIBAYOM0fMZJqlB1xQH/+QEsLZxGqfOnsfW7e+g9Bg1P+ADJEKG/uEO2i9/QuPkGtTicUTHzyDZTlGnSnXWhk8hhxWCKkRF3jWU0/HOS2gSVRoNUCtWoRbnyRUc4xHdXcjJQeOVJejVUzi8u8uWiL6pcXomzR4b/HcAYLef43CUY4Hoi1rQ7Ab7VSbo9/ssrCRWhgRAZYyaKTKjdY04JQnZ1kOzAALUGxEjgJ12H7u7e1heWUItDplGKcIiLrK0j97+HgbdDlpxS3xL3X+UFst84ac8ZsEkL9O4dv0D3PjkBm7e/EJEe3j9KKYEZqaySVUq3ykjmpLaDHPoCTlOwDEKOm0bBlVzT66ewMbFTbzz/nvYvPw6zl28hObcLBozx+SntF1bXrnBcLJmEhiilenyyvM/VlrLzcjYrkxRnETXg2jk2RFvR7NLmNEspj7zf76Kf13h/69fQrXisM9a7TDMpadEXWgPITAx7Q3Q3T/AkydPsP3sKX5+uMUies+fbvP7SX8gVRlD6Qt9CUMarmhEBLTx20CPbMfoEB1lcOn3p10OjqkTjPyCB6MhC+WFtYjF9tbfegPLJ1dx9sImXttY5xaREydfhaqRMnh4RF9BBGdYbyIz/XUq4Op5xvZa5l6rlkQUzChXFME08PZH11lP5fNPP8P923eQaaHWEWMnHfax/eIZLgwTqEZUGZM/Gz+3JFZS0hfVG1g6voL9vT3u8c+GqfjLE8ofRpzAjIeHvA7j2TrmEo1eB0g6vRLEtrNWqNAZgnGOztNnCNdeIF6vo+s5yIltREk/JTIqg1vz4UUNxMdaiFt1+A2FxkyE3Mv4HGBBK85VbdAi9l7cV6hNZcv3EC214C3PoLPfgUoyRCPTHhDEGI0TdA968GoJRlGb+449ooEHNX4yDx78gIuXNhnYKZ+Ynt6/HJtcmMrfFHiunb/VXHdNoG2cxEQwD3L2CO3aLfeuqSS4rJRXaP9F1dDR/tzkyxIomGIXVHYTW+3RKJX0ExI58pQpYIy4+u+Zf0m7i6Lfhz90EZALwG89jHoD+LNNkNKKF9SlP9nQrOmsKFkJysexhQXU41jWMrEDalHZnji512LqPrSp7HEC7IvlHzzxbSd2IO/uFCQ2FNzYR40SpTSDIt/3QYqgINZCyolczaGudPPEPKGxu77Lc4OuhSjaXhiYPmphopB1mzgIODxWwliQuaCmxl5cjya34fKcZHcCR6wRKYlNqC+WWi+zMQsUNxfm0aFzCRp11gzRZSA+NazWgk0XuPXN11j7+BqiuM5AWCtuYq6VoN07FFbJQKNopxiqLpSOgZHilgWKPfLCMYG/pJcW2LItIWxrSsG3Rtk6Z2P+wowFx65u9docjie4SsqMHEfWNfXlNkOkFOstN9G8dBrLjy6j07uF4TBjd6TAwIBUPHCo1cTJ0P/xIdL2AeIzXTTXT8OPY6RewC4KA2JxGRFNW5mcWid6Qln3uIfY+s3LGrP1cU7yiOafDnmMSJsloCSHxJWofWAkbDHPwSQ5dOXeLPtLVwCB0hbOM1VM2htYNFCuA1bfg+0LFeugEJMkXJ7HbKiQRB7a97bgH6bchiCGzrkUFhxxCwkKF2mvjYN7DxiQW373ChISnmStsNy4doiakiTHcsawgj7poPDeOYljbN7MSfJfqNA7ztEKucStvF9Z0EgeAH8vyVzcffELvt9+joVWi1kO1MZA9H2/HuLKh1exdec+vny5g+HhADlpdFUUSQh+Cfl3+5ghsG9niDtffYs3Z66imAvh1RWyahOA0U7RFsQsXQUm8YJltDiGMm9t46osaUvxtk5sNoEvC6ra6oIZgFJLi7MddxG801MCsfb3cS6RTxTn2YbQAgWmdds1zJLS3cBcF72f5TIXKeeSPdD02hvxPWpbs3aAIvNRZSgocSzIJq3gln7P1nW+UOzLvN6wnWl9EStdHAdyKeS6UoRIk5RzTG4BUF7pNmCT9snYEDAi7HF6seo+gy3UpjDtVEd5oHVWsMk8xXQ28Zf/8ozYBZg8+82rWtGfnrsGnKww4svk34wjO+0ZMUECeOje6G/USI/EtLFTLkyAg4geSlxI50LJqjK2kroo8DsAAAD//9RdXW8UVRh+5nt3Zz+6tEuhCCkipKBgjDGQaNTE+DNMvPEneufHhRdwa6JSiAXKthCB0m633c7szpwx78eZmW4LJnrlJE3awm5n9sycc97nfT58+wuT5+UJe1o88H/KKqTHdu7Lm49eo7FL8xfiqg7DIkn2A7ATnFdLAgCqIt+iLzauL0knJSuALti671vDBOpmMe1DzTBmliKvuZ8l+qWvsYkAUETLVQqZRZbsABY1UwZXXSzt+1iPgIiufWYkYobQsoD08AapnyHsN3H2ygqGd++j2M/L968fNDE9fbQhxawJmbI6TU2J+rrqaEtjuLW1xZTuVjue02qK27XcaLQwzxS1monBTTPE2fMD9M4tw4liOJT/Dolbib0CB7MRXg7XsfjhHQxWryC4ehNbL58DkwRtN4YpkmOoeqGbwjBP4R6KRII68gVR0Uli0V1C1mgBQQd+Tg7aMwQ96lC0Yca7mrRfack9DQEje6V9A7wYjbHUCdEjIxNC3Qj9TKbY2dnB4mBQPhy8CtRiTULeBIInNKLqEAOAGB/tdo+7jq9e7vKk00TEG2+rXmv6PpL0iFkAzf4Sorih9NwTw/WGwz7E4rzsNnx88923+OHH7zF8Mixdfnl8cqiy0S4hwqKxiHehDg+ptXtzgO5iD9c/eB+ffv4Zd2Wv3riO5fPnEfUX+PWZK5rrlNITILvzOnRhv3+7sOZtR8bdJxkww5o0j+cIVBa1qN0f/4GW938/ihqtk6mnRvwbeAEpxJxyNBphb3cPj5885ki+xw8eYXvzKYZPNnmDcXR4iOnhEQLtN9CYhq4vJpvkIO5Y93VFnG3mvB6tphTPtHhRh3mSTpHkM8R+A/3BMhty3fr4I1y7sYbL195jg82IGCMMapKhZ0NhFcP0Msqll96OiEGqyBnJNqeTDKKQ5wCR4njq5GyY/VIWfDSHRy7ufP0lnm0/w3DzKQ5e78EcTbioOTjIMRxuMuOLfQl4IVQU3DEnKbNQFgBtOF0XzbiN/uKAo0M5WtX6qYQBd0gzitQjNlsjQNxuotfJsDueIOHugqt58MIuI6A3IBrteITJxiOcuXABeTvAPudtOXB7TbS6PhrdBjpLfQZUKHJwZlKyO9XOqEgEXK08PDX+QlHSqkSz7uSIFlrorC7j9eZfcKiINQ4Dy74RXWRErJ39FHg1Bui5JyNF6qCpTG19fR1ra2s879nxqTYrcx/ZXKf6n57XOpTA3xsRDfHLtHNou1hvlO8pCCBMNVP+fOJwKk2kqRfUVhMsjk4l6M1WcKS5dGQzS/M/MbzI1C1Lcxzs7qNFsa8EUo8TeJOpeK641CUPUPhC06W1kA2s1GE9IZZfo4lOt4sgCnBEVEq6ylo3sg5KlOdZpzE7Zd6C+PlrTCH1U2H3MORyTYCaB/Yi8rsRYvLUYTd3AYvL+C6vkK4puYj7VZRcCnGf579jN426wtZHo54Iw2el1yJGg+KFIM7cLgPD9DMBAKRJJ1mAE7dg0kP47RjdM0sw2wk/q6c1aIvafUXrxMaDPzB8uI745k1mNrB2nOR6NE5TYj6Qlj1DtjfhfRV5FtC+CnGERptM9nJmQRS5zidOZZjGbumZzg20LlFkqbqXcweQ1mTPK4shy6CmTTTtJ9kcWqV4nC5CTQkXSFoucK4P791LaGy/5sSSdC9BoMUtPc/0VSTEpJzCTJ9jZ2eEhWmO8OI7KHodjkumJkOuDZSiOM4CqN8wTqbdeAZidH+ke0aH15GCJZj0FbBBpMgZaErKVTISKNAgRnnOMT8EKYKr+Dhenxxx4nedyuKYCV70iHKGv8SAkpQldwT0d9seonABQX4JYZJg8nAT4SxDaAI2AJR4ypznX/IVIBPF/fEehvfuMRjc++QW0G3gRTLjz7lQSazSFsTAzd4//37TcurhAsfmHvb/iFp4laYMAFxeOYezgwGaKsaj+2bx4gpuf/UF/vz9Pn75+ScGpSo+ZMHXS75fPslhETCz7be7v2Ll+ipWb6/hgPbwljTEcY+nNyRKz4c5/T0XeVz4ineaNeerv6YOCNhiPa9Jublm8yo/Np4rCwsSmMov41h3uwIrJC9epAXO3MR9WvKafT9YybM2WG3BbTvvwhJ0an9LOtyuTZRzpWDPSz+66ATrQFJSpIYjuTDmYv/oAgJmsFfgW5UiJudnZekki7Sfv/03/rXWlNaTwI6TZLBX+z422VNAQpL0tDNv5fU6dvYzlIL9uLyl/lnWAQA5L6mpbT1MB7EoLTghEgMxELbXTwwONoXU8bMeADzOsxn+BgAA///MXVtvG0UU/nZ215fEdpo0TaOkTZPmRiiXgigvPPDOC2/8BtQfgIT4KX2Bf8IDKkLAU4MKpahNSetcayeO12uvZwedM2d21079hJBYKUoatfZ4Ozsz5zvfJeBFVD5gGKgMCHDfndZDSaHi9B1uwjgThPwQarI3p4ebKEtMpUhzlGd88iIVZEn+ozNPAOVlMRWmYEzIyJXl/rFjsidmL45iYh+2nM7iHo5Jl6OOjz5M8vm14U4VhLpCk5DQFUKA6GaStoJ1dGyAB6u5CAzCqzUs3r6BxeVFHJ4+F6qk6wi6zTdF+/gIh/t/Y2XnHUS0CcjGGwiFlk2dAoWTwyOcnpzwoURexI5JClCeEDKPefPz7OSjbhaNYWVjGz//8CPSNi0Gmp3lQ0+jij7OOgfonp+gMXMNjdW3UX+5j+RpB3HS5cWQXsNmD2Mk2inQZATThzkeAHEXQfsM/cYx/NoVqOkGTIlojwnCqsGw4iO98KEJGCKphLHonlhqsS6MUg7OY+qMpkg4JqfPXUYqZlqvW4iiLmr1adb6pyxSc93uXAJAig/q5JQpYmtaY4aivLoXODo6Qet1G1P1KndPIKgoZZMP0oQp10ubbyGo1LmbL8vbJQ3iOF0nf3/5KvtY317H/ftf4uuvvrFRTrTIwMN4s90VciU7UXmjWLp1E7c31vHRx/ewtrONm1vr/LvZuTkuIv3QJfkbNqDkw5lbKOQ+6MLzmAGlE2f/pMseIWnzN2oIP7UbOj/eUQwQimqkg0GLK3WMA9LQiXeIbJCXeRT/TlP/f748T2JWfAt2Et3utHnEHf3Hvz/Gi70X/P2geYDmQRO9qA/Tp3sUQGkLrhD1MOwHmK5UORLO+Jq7+LTGhARM9fp8QFMM4xW6qcoagrbOOujGPZ4n1dkGFrdWsbSxhvc+uIs777+LWxubWFhatI7KSmVzyajQegMIzZbpsty91AJUycxSNrEE4k+gZIMO2I1WccoIXAdL9gsUnpDS/Aw+++Jz7D/5E989+NZOH3JfHqRot0+5qKA4PNbaj1ctY5fL1DacN1zD1WvX2RQxok4Wx2ZZc6GQjF6jMgYUc1Sbgu4pNOoDTJV8nMdW1xmK3zJ7bQjTpTSM0X3+DP7mFubXrqN2cwHBQh3BtMLUjAdVAWddU2xrrGMGGOx9Sxm0sHIe+xwpuR8krk0LtHZyhTalMhpry/D/2EfaOoQagvOiWY8ZVgiyRK/TRuJ3YOrHvAepsAbK6OoTW0wn+OvpM2xubWYFTm4u5mRz9s/ehM7ZpMtp2vP8b5PFsbmM7DeB25cuZxLnvVnL765Lunp3YHdgkvGyAxw9X1yoGtLsG/T6CdORg5KPdvOUAbVZmgvdHnTrHMn5hehHKeu+xHttKm7o5AlDc9h168g8t0H59ZUqusOI115tLssRJl3k/K5E68uHXVo/PZff7mWdTE76IYNhMuYMDJtJehWJdzJGctM96WDaaD8LpAwl+g/WRd3LkxdUod1NP3tS1MHJMGwLNPs7bPwnhelQuumcCCsGeQkVjpUKInQwV6niyvw8XjebvD8HYzvLmNcdj7XT6uC3X37FhyurEqes2V28XLZpSOyBMwC8WGc6/QENIKmK5NS3nhgCnLi1RHH+vTQBnCrEyaud7M6zLEmv0HnLqc4GKtQCKPhQaZA7ztMZbrGGcGcV3kEbwfExTOcMQ9Nj2ZIDdvjT01j1ABgY9B89AS4iBKvLSOfnoKcbLBzQ3PTyWLozenn5mIUdmMkACbAg9p7RWSefAC9OQdG2yGCGHt1PThtQWYE/CdhznckMoJGzNs8J30aGckeVJjvHLGrbPU6VdTUKDCI6696YRQVr6A0HiPdeWXNNior17LnAWsHZ5CLyBCgNE+w9fIhbU2XM3NlGj2LdyiVEOh4DA9WIxPW/7Cfwek/y1STF7quXuHO0jM1GCfXyFMPvzICoVLFz7y7uffoJHu8+Quu0ZSP9Mj2SBVl9WAN1CoU8b/aw+/1PWNteYSCxXzjy2Hi/nFnnMOFMIuIVwADJkudGaBxzLTTOAsh8ERxoJFR1YgW4wtVdaUGml/uYFTLyC6/hxuBAMghoxqzwQjY+CmM3UhAHBRA6SUbH4Ar/rBbMCm5L+ycA0ALfOgP4qN7iVKTAH2GaF8cAobcXgQzLDBBz3AKb23X1xxvXbnzZ2TkDKuwY6d+QxMy+t/ODy+tKBjBIHs4/56x19z7udZws3TIMRsfg/CHyOmPyRpOBA6lGL7ISA+f94NY6x6in0th5HrgmuPIV/gEAAP//zF3Lb9xEGP95xvba+8qDbeljQ9NHkpIKUCVeF+DCASRuXBAHDvxnXBD/AgeEEBII9XXoSxTItlHYPNpkH0121157jL5vZrzeJVErTuwpUdeNPR6P5/t+LyMB0Bs8ugBC0LWRXsKIQj7BzEBox0a9ENNkoA1Yyi+3zDjoI89qZPTK9zEksxDf1z+PhlNouqWuT7ouIqcysJmJmEYXXM/NKfuseyFJgelieaTfiKMpBoJKpuk3s7FdduLStTMCQDeF0ORETzjJlAr9bzDGg9p5M2H9Cn2HJjk3BkzXjaUKMoa3EKKx3MTeozbrxtJknMdZ2RewSiPc+e0XNJYuAEFdo8/Qma98zUI3QqhLRahZs9lkOu9kxky0OZZixl4LqWY/jCi+xvfRvHoVZy5eQuvXFlXu7FJMkS4ePTRRF3ubD1E7dRa1M0soX3kTu9sbEP0BUnUAq1azDtyaEaAnflk6/BJPn8XIBgPEsg1VqQFhBaJcwshP2T1WJjESLg4Ckwdb0MWbh4n+491D4HmSoR74nEFL95Yy/YkS+XR3D0HQhKQNMFMczUJceEZobrqugk8xTKGLUiBRq1cQp0NsbbXROLOIsBpOmjAqQyX00R89R29vB0E4zyZKL1eoFhBf83vmCTj1Er78+is8uH8X337zHb9IVWFhzxyL/ztYX1/HysoK3n7vHVxZXcXSpdewcLoBjxo9rsM6PNJjcswhGZHkJZuhz2XHG5HYsyu25WZfpv/297futuZqHB1XQ0gHF6ixAra2MdzaRdw/5DxRamy41RBicQ6oU750HSgH3JBLTZTX/63kP6kVWDzPWc3gSUcUx5i+3n/WQb/bRavVwpM/N3Dvxm1uALS324iOhrw+WblSSXi86fQEZfpKXjtLtMmVJXbKJgSd5i03XckTQ7gIa2VGfRzTIOwc9nOknYDlhfOnsXL+HPtBXLm2jgvrazh7+QJK5TKk73JKR2xmg8F8uDjhuCnm4ZgIQGGfToV0dISjbh+jwSH2d9vodvbxdKeN/U4HR8OI4+k+/uRTXFpbm8QzGcnA7LiOxhEqpxbx2Ref48HDe7h146aO76SCu+zr1IxM0/xos6wlKifPIH5PKB3IWK/Po16bZwSV4qmSJOLmKXnWkBeA8CNetrwgRbUWYK7uo0ddcZ4QksurBCp/UKiYrEUROr8/wPK7a7h88RyGCyF6cgDlRRhkhm7IBV6iGx72vGYzy01DwIopLMpF2nISJ1RqPhrLZ7H/pAv0Ux4QanISw873FeKeQtodIt7uorzwCkQ5gSr5KNXmcTh8jk6/h43HLby+tpr/SWvwmZroUsxs2l7qY/Ln9bqvF21beFoGwIlGgAWmWnZM4X/ccVPiIdaiT5tmJpxjLVm7zWPvuVx/UUTxeDTmWOFsmODg7x1OrJHdAbJnB0h7XYhxjCwMuVlPcg4qnFWa5ppRagJQM4Ua15LkY/UqIjUptF+q0fGCjzDvzjzLXZqwURXrDWOSGbqqY2i0huIuNGJJiQ82k9qi7xpEKTh1F3wdnOxkjwd9sDDzUnDRJzLHIFcpT1LaDxLVnYAqYhRR8VuZm+cIYNGhGzTK5TgWnZ+y6lBaNvjo5m1c++BDOJUa677Jh8iVmYm50/PTSSWvc+NIsbcGSTroWZZlj5t4OmbY4bFIjSu8VNPJFrboYWkpMVhlltPFJ+9fO7cmhbJO0NAMF0oFjAnxlilSYvksn4ezc8DsonR/Dx7vd2MeE27eKC2f8GOF+KDDa1yJdOQGMHGCMsaEpJs0gGIDxhb/iqk0ptGaZbmhHuJIJwMR25TUVCwxgzEZU7lLvJDyxc+0uV77rXw8hAZghNETS4PKs6mgNY0UKa9xCe2pKb2vGiBcbvJ4DTwXw782Me50USUElxqhJsaYY5KdDNE4QjVT+OPHn3B9YQ6nl5ewHcVaEikKjBHHNmH/w4epHMcfZuVKnIDhTCyMSb5WqtTRS2Lc2XyMNxpzOPVqCI+BGYWjZIRKo4HrH72PW7du4Ofvf6A8wxwYcuxrkuUo+poJsty638Lm3Q00G2/BoyaxMGOI4kZM5AARrL9FZvTzppawtQxJvDSr9/iiv2i0Z5kCRa2+ZTSj0AAwT+iULGRWijAugKr5zznrSU0Z6dnfbROK5pL2THN5flLTb2zi2BnRTjVMJHNmgqa/5wlyBpknnb2UkxlRPEdL9bf3QzMeLMtcIIqHCGQw5dbvGHa5DhmhhqcGlO1Y6b2PbijY8WVT9gLSrs9Do/vsrUCyB7pejtvTkg3Ncieptx43mxBAhb89/pgexIRFwNJynV6Xf5/msK2ZiQFP6Wh8b5I8LjE35C80YNjQnuRCpobm6xsn+AcAAP//hF3LbhxFFD3V1Y/p6Rk7ie3YCXnIrxAnAUQUsWPHAgkUIfEFfAFLxBaJDUvEJyCxQmyyCxskImUVFCUi79hxHnacOPF4nv1G996qnrYTYFZ20mpPV1VX3XvPuecQd44p7Mr0B9LPtHhIoIUSyyBq8sSzir+psFBFqGGsnKw4AQ0JoVakXsiqyKUcbGSr1DTeisnI0JSNVRE9fEAWO4ntRytlcIh2oj3uO6ODggbRtgaQMAxd52ld0R0qiiJXIE11iVoXHBtqjSs2dmuxDANXBXwfolGJwqLLIkLKKFAmpqBAk0wWiHKdLwvZKTEYjWQCBnZwAw4j+0UP08cOYGr5KPxrkxhsbnO1XCmj0GqU3klwau3WTWT9HqLoEIpENONL42vMLQ9KJmtr6znPTcuPkBramyPNb4YtUJiIq6iCjILokbqBYytncPzMe3h25ybUaAeujtGkHq1BFxh10XtxF3H6PvT0HPTCCia2HmPnehcqH7LonybLIvN9xS5OSSKfi7I/FWrK0QAt9pwcoHgtz6AdYTE0clEcJoEV1IIUxfinICQ0LoSCr7/sYTKYxEHu1YccjKrEzvMXWDq1zJThokgNIOlU69AueqY++QqBV6IZOmgEGp2tBJsbL7G722OFZE8HTM8jtLFMMvY2fvXoPubemZeiEb/Aogq+J4Cq0yj3C3jQ3NJBn4+gD0X49vvv0AwiXPr1Ny7ERO025k8tYH5pER9+dAHLK6dxfHEerXYLTqttEMKidkJjj+UMFaFszVgZerhVYa5tH/bbmVvo6t/3plEGBTGVAZnVoipkwKSI1K/XooOV+jOu3cbq5SsYrm9A9WK0wwDNVhO6HSI8OQN//ghweh44OgXVbpOGGYyr8XiI3tzv/ufz3z38an9Bb9/1bxN0LKpr94+djBL5ymvWJhFzxqzMq55+Fz7TeNmhIh4gHqV4uv4Yjx48xNO1dazdvof1h6vYePwEo52uofML6kLBzqTrw/VC6eFyPKak57RJlxm/H1kyREh9647sJ4EnbJXd/hADlSFOe5wIBH6ARhRiemWRxS2pj5/W1bvnzmDm6BwOzM2JhzoHcK5ZqzYhF/0Hxyww8ZHNjBVeiUGvi0FvF9ubL7F2+wGera7fwXGUAAAgAElEQVSzVslLQv36u9h99QI57fNFRqAXRijx19Ur+OHHn9CenWM8vSr7EIJl9jz6NLwQpZfjxPlz+Oqbr3Hol59R5CkWTi3j04uf8btq8E2DJuq9RkqVOKqxSGRGQi4IajSBmZlZ1k5Ic7EvJFS+EbSgwhiqmSOJd9CaiBD3hpieauP1Tow0yZHVnOwrxWw6h0ZdvF69g9HaXTQ6y2xr2lc5BrRfUSCR5ByUs5CVUwhCYt9X4RIYWrauPKmrZzFCaKTqTcW+6SOHkU49Q3d7gyv2Lbo/2ZMWpJ4+AZV0EG/1kEVbCP0mM85y3UTQaCNXfS4CPFh9iMX5BZFdoPOryPZY6Kn9yELdX/2tSXlRXVOBFXXUpRyLPL3tPnUb0f33fmsBoK5PwG0UtqF7jGik1mObg6uSxfI63T5C5WLCb+PV6hOobh9eZwBvuwNnewedzU12PlGTLeSh6EJkjJb1EbVaHCsQk4Pt/nwH0eFDUBMhYp2LYjmd/+UYwVVGiNjuIdKRVlae0fb5GLHi7ErKodqSpupJcjV4CtoXJpcUeMEtAnYa+BLHrX43MydvcW3N7hnPCvX/932UgRQ6Y8mBglspMkae0zhGkHuC0LtCje84BXQUIo0mkXR6COisq/DM8byWRjgyIk/5BHh1bw1PbtyCf/4CF2hoN8yTEX978qx2MiWUd1e0mVz6m6SbE3eQe4pV5Kkooxok7OmxQDTHF5Q8mMQFtaJtVbwtpJ2SWQCqNIxJxa0dikTaEoklnHSIQIcIPA8D0iEhDYKmRlwm3Ds/s3QK7k6M3e6Qv7+m75QnHC/SK+UZfSRySdK9LpJ79zDs7gInTiKcOwq/FSD2ZR9mzhHrR4kYtLDmJcYxzvGcWIMcH0xSzGNToLLyAjtDGFE5Rxgie/aWuoo7xa8Uz5jeedHlUMY/X/r8qSWE2Jle2OT1zgLBlIQ4uaxGApRId8AToVk6z4aeQrR0EopsHaHQuTlERPFUOuRWAvblT2Xde0ojolNmFOPO5d9x9ovPcXj6IErHR8/QwiWJy0Rw2ilM+xLlA28q31eoqk1ASximlbPn+cfIhl0Q4//XHHtq5KlC7nm48fgprs4exInZWTSRoUFaCyQQ7gCLFz7Axxc/wf2/r+PFow1ed4M4E7YDGcCQs1bpIFIe4jJF2gP+vPQHvjy7gMZcEyOvwIieUUveY4UPlRKGnW2jsuJ11NPN/d7GY76eiNt3VpJRbazFx0xmWxAQhzzRCCInkrxiBKhKaJCtu5U4VZF+AyPwLFZq9H5qbID9BSaXW6YK8eunQgWBVUoY2i4DGSUauskgXskWxPSAHjN5PF+bxNhoDTDbpIAb+FUxg6OuQrHzCWrMgoLzLEH1A9cWFcRBjRJ+x/j6U05iRfqIyWVzSNTOGbHRlnha9k4CjTOxu6d7G2FB0SUY2wHaD2m7yFiQsJ5954TlIY56XuWoJ6r/wnSgc4HF6vNUmAY1BgZR9Dm/rbXT2/m3xQlmH1DhgUBlY1U/ZuOPW01siwcXNlwSVicRwVTc9HwH//B2LbttG1H0cChRFqkXLL9qJ6iNFGk3RboogmYRZJEP6E/kK7rtpr/Qfbvqrl9QFAjQ7GrkiTRp4gR+RbEl+SWRFGeKe+8MSSlRk246Gy8kkcPxcGbuvedRoQx4rnJv1SNzeIgNfB33nzMGBJWrVKYg9bnlg8taGS/vTFmIgh48DKPcdk8q/ST6YH31SSHZVvdZpZ8tLcSmT4LvifD3sgwXo5G16jNTE5Puz5PYr0zBZPIsl4V+cL8mstFK9lcyqjSQPOBJwpwSFpWzWStaDOB8GZWX2yrMLkwcDCvDvOz6egfLn13G67cDaOK3lb6rbHhishSPt7dx4/YlxAT/9wgqn02NMY0nqeGTFgDBEwX94DNfdHZrzx0b6NoshuWxL/Xa1iaCVhcXF2cIgwwmFiVvev3NRQ9nR7uobXwFf+USWl9cRzzs4+TZkDcO2shNmljZPuH3ujKp2NfIpK9OJu/0ZwrWOZPbVRYT4dsJS9O8T6rgWRvnZKNHB3taPoxhgUNSQm8vdfnZWT0gw7tBnC80FaIChGEVrWgBp2HIwf+gf4LF1S60n6BeqcnhiXntCZKTU4zOTtEIW/yfIT5XUA0wrzl0Jj+F0ZYyEOdS/tH6Er774XvcuXMHxydDdFeW2JKx1gwJsyw2TsZm2a0diPGnueSwG2nRPj6EVh/4Nn9mbKXWK4J/z1JL+BNaNE0N6b37+O3Hn9F8O0JrPEGQCV/wQhnUu02kZyMkw3MEhFKgA8ZGBaoZQn2oE/9Dm3f0LRerXBfZ08GdzikjbA/0voX6DYZHPAcP9vex8+IlHmw/4ATA87+eITk9R0rwTzqzJCk6UROpyngjoXWFvK4J2s18Oq/KSU9Wbq1krOxNm8sJHR5p7RknVtMkRaPVQafV5spbd2Mdlz/dYleQ5dUV9uRfWVtGuNSVtSnLrJ2EBCsTLXofVeXb59WiXiupDT6Akjp3780Benu72HnxN/Zfv8LTJ48wODjCcL+PMVVRszGy0QgdQsdMEkboVIOQvZF3jg7xZucVDg/20F5ZszBnZdeE2cYmX6h1Grh28zpWPllEc6HGaxqJ6Xm+qFor50P+b/PXWnzRbzx21FBoRE2GbmfpWEz9aJ8hMbVaHboew5ATig+2BI2iESKCoSYxxo5DbW27FCd7PPgkrJrG6D98CP3NNQSrIaPOPKtQTdDY/O00xZrwvme3wvVTqvryCmqkKkGtHaCxtojz18cIMoFe+qm4LJBlmp/6TLsa7/agohBRI8SE9sV6wJWCmLRMDnucwLy6tcVzbrZNeWL/x1b0t/idMZja08raKbP2fSgd3DEH3Di1P2gXClvIrFG2uiEikJo1ZjycnsXWraiO0dEQ+niI6uAcC8Nz4M1bTA578IlrTpZ7YR0qqHLAk2aGHYBctYkO4TGpTzcips9QsDkm9r/RcznJnvtsTpvmM0tBojz2H7Iym722Vxp8lwCYf+fSODsKiA2SZ5EbPOe1IE8yRjqmnLxniymI4nVW8RATInJhAUF3GaN+ny0Wq1n2rrij7VlFe6jT7jbW2Ln/EFevfsnIGkq6u6qgZph5JlB6EskkFJ8H6xiUsbAjuV+QSGKVKICk00Mos1pFKKCu+q283PddQTjwbG2qdaG87g75dO2J0C9SsnBmfq1hCH6LguBE43j3EMO9PYRxjDbZol7ZhBr00X/6gLTwOShn2L0bP0giQBM9bjLmgIeOTAu0Rqwuwo9IXLXK77t7DZSRPvuMgtDQk5TRdpws0oKMEG//QtjNCXLn6L5S8K9mINxAoWMlHHSTl8RcxxkRoQp6jrHi0mWqkkMtkJ4Ba23Q2NKQ1n1U17uIxpvI4jGOH79EBwpRNRKXGONEDTUjJ8hl/+RogOe/38XmLRKGbGPE9oJK2GUo31dPzfePaa4SnKPyZoLWouqqmL/v2SIOJUtHWmF7dx+fb+xibXUTHctfp2vUGhFu3L6FJ3/cw68//SKikEoAGF6OiBLdLvp/UWLy4HkPj+7+ia+/vSnrCO3zLCLhCzKEf2Yr9KXCJOb0vdzKVXvfBttljj9cpbz03eKvygNDXbqXQ3lzUdVXViiurGtUJE8c2php0JYm4Fvleq6mexbZwOKWIgzIAXtJDE+pAknuritK+4VQci2o54hxlAJ3hwCn2EyQA/5UIrqgUdA+QfM+zSvrLoDPNVPyGNEq41MR0wrHU1KYLeAdhZ3eSXsd1xz1nJMGtB/TvmQRGKwFYK2zcg6/Ezp0dHe67nucHaT/InBPY0LBPovBlvrAiHX7rE4ckAof1Ig2QvFLOSamJICzazTG4B8AAAD//8RdW08bRxg9e/faxhcCDpiU0oooivqSplGlSn3oH+xz/0lf+taHSq1aHlqhKDjBIYRgwGAgrNfr3Z2tvm9m1rs2EU1VqSMh+YJ3d3Zmdr7L+c6xMdc0Uz7D7NgZl1EgGjiG8IeB1JIswFG0Nr+8aDGblCqyoclPqBPyxBquYjGLoSR3mNW7FBsZyezQWRKmx045MSH7vpwwSVQaxEwx9XPnXffOYr1iLQxNuCQxVbTE5j+zcOxU9UVHcIq/16/1ZKRG0XtvpYb25ire/A64loMkUwyUTN5jctSYNtjdnR18+fW3sGstJoayRFaCtslJn6LX62F7exue7y18X8yecJkGZynktTdqBrYfbuHe+gaiyyFcz0Q4GTGMm0hcxOUFgndv0Hh4DaO+AffBY7TDGBgHiE52geQCFUvWhjEk1JBQNpvhauUxWyAGKmNhyy+1Li9m0qg3IXB5M4Hf8vjBwWyeiiBqcPQOreW2lFQiqDBF7ynDiRkKgCY6DX3iCTTqNdburPljDM6HODw8wsbWAzRZ4kNGLQkBQgb25CbA6eEBmivrqqRlkZxjfn6WN6gZRCglpANJetVcdJ59gQ571RJZEIsJSSnAgSvhpWojKNYeFZEF82yl/02T4HzeDKS5JGsaVf2yHB7BKJFkZxc/fv8D7r0HOo1lVH3Srk7YYAtGQ4iTEUOurXDCdbVuaxnmygrMmoIM/08BgA8ZpSiZzWaePSPDKlUbhV7z11cBQz9f7/fxuvcK/b0e+r2XeNs/wMXJGaZBxIFKcvKpm3XqP722PDSrdUSGrWCego1LctRYicFMJdx1OsUkijnzmNkBnLrP2cfORhdr3S42P93EWncDne46Ot0HWL2/xnBYIhzleWGrnuhIi2VIqySVwQyG+euiSiNhiD2F1K6nQxy/HaC/t4/9Fy/Z6T/Y20NwfoHpzXvE4zEqhos4EKg6Pmp+G3HmoGLYsNwKLCLyonr2JIZnV7C63EEcTNUaSNmCS1F0DlUNnuLtoHtFDOuPnj6RGtZZysEONw/cKpTUB+aOqdRohD4HW48CjXabAybXV+eMTjIZRmjB8FwmUiQyM3MS8z306j4arRquCPGVCFW7Kg0Dk4W/ZMSeNK2vnu9j+NcL3H/0CVzafwxJaPuvoKqqyVpdwetjagn4TR/tzTVcvRoAZyETg5E0HDMjOx7s2CUcNsLzMcKjMzjNBoQlIfpUL0WSUcT/cHx8jIphodtdg1H1bnURc11/jY+bu895v4zFz8T8/31AAg/quxlwQJcTZuVzFI+Xlc9ShkhK+CTLTBIqMEkQpAmCcYAKHHYsx6dnEGcj+BcB7JMRsuNzhMen/Hx1lxpwq3UkXoWzcZTJrFA5HXtuNmIKxlIQqd1Eo9Vk2LWIJzKzr66g5Lwrdvli9l1ysZTl6lCqWZ0fjTsQTndMsI8N5CxKoanPNbIhidmRY2SLKZ8fU8TMgE/3Rrg222yV5hKMZhPTyQgO8RYo5EyqOWgkXyarGpCtQPLZvT93sfzVayxtfY7TNOb1Q6YS2XYUbKdkRjqJGCVESE9GirLDK5/NNF4xQqTTFGYwZURAViEiN0fyYhSk/vJaYYIls8OjjHtDcZykMtjhk262kMFD25AkmlkY47L/DifPD4BhxPwEUbWKpc0VOJNthONLxCd9eNlEJXFEzjJPAX3blOz1aRBBRANJTBlFsFaXYbXqsCo+QjOV5HCGJPSjPtp07Yki186UvLaaL2xHK5QkVMayWFaYj6+CX6OQ+OKgav7ZTMFSO/6ai81QgePbnFHdimUw9Hvi3TB9D9bWGupCYHR1g3AwghmlqEGiRmUVj5RDpqfRUmbh/EUfg1oLtWdPcEMoOMdBQuomllQaYbURCsx8nFz+4nzPkaG6A5lMuAiJbMiYO8HmPTIzHOy9HWKnfYRnK12sUvkCOYKW5APorK/jm+++wx+//IbD3gGDNROFstDLOlEBQV63MfDrTz/j0dPHqHzWxpj5HBTD/9y6LUL7b2t3BQb+aUmXPIe0J9kvzdISsTvxtTGLfA5bn+3gxQxzzv5vSQ45Wn/aEaZjp4mUoNMcZVIiz8p9tFSkCzat5qfQ0H+zoHRQHEuzROau5OOt8rFyZ31O63/eef/YlgeYdIBh7h6Nx1Q2TZJ8MqETxzOOPC5rZMqsme+ofeGi/6rfEzqBZn/uuN9y7bwela9NjRAPmu+AS0EoCMfkuFSCnsKjFahkAEUq8DcAAAD//7xd22/TVhj/+diO47hpmzRpKygtYkwwaZv2gCYhNMRfucc97V/Y+x43CSG0QbWtbCsZWW+5tLnZ8XX6vnOp08tACHGeaGns2D4+57v8LiwCSA9cWjQoAZArFAkltyA3yT5dHCXj2q9QPygjMKC4HFrBUSfpGm1wrlSYSUss8qUUUmGTborsaMz5PI6qDNHQCAJHd97T8sTWNyXn5F8HkgvXki/eZK05oL+jtomg70AVIHpBaFNgCz+ujMuHUCO+al4gjOeLxy8str7gr0Yq2o0qmjst1JrLmEcDI2adGwaQ5OCd9Xp4tfsSdx98rXhRxPmVatxWqWN0NjzFcDhE02mphf7yFNYaDFw1mkVS4MuuYLWxgtWNDXT+cDEJ+/y3lYqHgM5IsMqTA4wOOgh22rDX2qimX6AVz9B7JjDsPufKrm9N4HCSmJ0L71w4/0VeyzVWrguDrjmzzosex4MzNJbaLAQmqMqvFoXxaIQ0nKMoJK+I+UYaW1sWPyLetOvw/Kl5FfbK7g367KM+OBkgWK5D2BJqxvcskyrng24X6aensPwCTiVYgBW+yxDCNgUiSyjBPsXXk9eX8AsLDqzIE1kiDGSvq1jgKn2MUfYeLl8m30lKivYP8MO332EdHu7e3ITresx3HA1HcOwcQbOJ2bCP+HTGAo3zwxNgOALI1zqyYQWXu5AfexS4fG2GG6s7c+rfk14fo9EIB90uJ1K/vHzBav2U/BO0vCD1YtI0EQ6CHGgvNSREVikuu4pfRvOOvL19UtClQiJXXl2eg5S8R0RvQoFmaw1bG+v45P493Ly9jc+++hIrrRaa6222vWRhABJYpHWVC5q2gt6nXEl2ZI8MtumU5tzxV5OKkxjuq8YRkizC3qsXOOx28dvvu+jsv0Zn7w1Oe0NE4zECWtuJmkDoFafKkGCn7iOaRsijmKGC4/EU9XqAaRgiHEewfIH1W1t49M1jrK419ApgIMeKamdGZmyHZNA8pzlPhUTSQ6CAQXXxhIJ0vssoVBjOe47j8n0juk1I9CbqHmZzhs6Rdoqgrnk+Q+YKLgKQFkBt6MCbJSxxAQMPLZi+RigDgvW6pxN0fnqKtYefoxpswXULpPb7BxJ66D2KYLexkO4xK1ttTKYHwFQ6uvAztDxUiiUuXpAAZ3Q8xsDtwKd5t7mKwq8QX4SLT1mc4PX+P7xn79y7c8l733iql959lN6Ri1d1kbtfDg+Kawp8Jq3VnzX2eOfdrqv4j2Yft3Tgro8kd0xakjh4IfwKJfyTCay0wBIhbGYJJod91M5C4PgURfcIOOwRf4b1eGyyv/SqSAh1g3N1ay7KExWRut6+C3+5zkUeaaO02PF5W6D+Icd153of9MbbhqGJ0D4YZ6yITZojYI0lcoLP2H2ALEJH/TEX4L21BsLev5y4enm6QNURpiACtqyriRRHvSH+fPYc99ubqBA1JZnz+8X7OBUTaW1IclgktAVbcZJlkQyKNpkmkdT4IC2AWQWo2qjUa/BWhFTJZzqTy9OF1iCCGyvzHan7I6QtFl8nq2lbDOOnZNPNbEwGY4QnIwz2OkBvCjuVyvZTK0JQ8xFs38Dy2R0cnR1DpCRgl7AQIUHqc+VuQKOibNbScIL8TYp5HMOfx1gVW/CoNEtxpnJyEIrvT51/WwsYchWpUDGDEsC+wm1Ldz31/y00rBhVaxv/PAl+sIymBYVLuVDACAVhKFQX/rqYp5yk0LsZZRKB4a/UUb19A41JiKn9F0adY1jzHDUmcaWKgJhLSzTk8LMEg909eBsbWNpq8xqS8l5lc5KUUQGFE1UbH2CZLbmVFJotwELYnA/QyTOH6QSJXcOvf7/B7q1ttLY9NMiLH7Jr7VYDPHj0CA+fPEZ3/3vMw8IUuPk4CnGSq3lPkU//dYSnP/6MB60nqK24TMlK1NomBVVLiKj/WVdM8isWo21d8HqXz0J5zEtOe4lHn2bspqaT5uvOpfMllFAGxjJ9wW0NKgkWxm6O5kqcSG//WCGqpfp+YVDUEpp+LtgnlOieo8SJpYe9TIRl8VAWMXQ3vfx+6AKFzgMpSZfaYxKhoXMk3YA0IoFZxoVljb4097k05/lnagw4NtsaU9efBuWoNUXd0PmuFsyXnxWYzUKOHQTNb9YYUAVLarqT5ftsxmKPjIbPpKYAHUMe8+Kzl3mG9vg3NBH1O0kN8GTBtirzaX3vad8TtsB/AAAA//+8XVlvE1cU/u7cWTz22FmIKSFAQAo0JUgIpRV97HPVX9j3/g9e2pcuFKhAgqaNMTixTeLYsT1jz1adc+8djyEtPHUeEllKPNtdzvItNlvlEeffUlUbY92X6xfqe0pFMNUwhII/YKmOQ1qqYCxDjxQEwTH+kUJDsvglCm05A74wFh4kqwJSmSThkVzwRfMCE0ZLcJMoCfn6TMFAaN4FDQ4DgSnzYD4WRBKswhKunkRQD1xKTMO5ohiwdYxVeEES15QGBkNepP1B5YlYRQS3oO+jYoXvBfA3A2zc2sSrtz1VGde8IQPXklQlR4yXz5/h1r09uAQdTvOiq23uhzrhVIQ4ODjAZ5tX1GReSsB1VUoYmAhQC2ocKCVxhuvbW9jZ28OLJ4+RnfRQqzZYxMsTMeJwhqh/jKjXwuXb9zEjvsj2Daw2akidANnjFYxbT2Clb+CIEUOKkcVaSGz5eP/zv/Y48kJHt5gI9L5IFIxiuIQsyBimpcYEvZdkMkeHLBF3d7RPrl1UgZinrUV1aMLTYkKCT0HNwyRysL7awPB0hKM3PTSbTXiXasz3plthXQ5apIYDnB13sHFnjbuVufGm/cRjwblRRRLjCw9TNRRKzdmIx6UXBXgXVHOXA+HFQcHLJz7t98/CP7nPSTxHou9IFY2wfRktTqMQj77/AavnKW5sbsGvBAjjlAW4xEaDKS3hIIJcCRANh7DOx3CyBk0i5n4LVzJ94f8EAPAc1XOS5gfxOucse5cz38/SPsP0OxydYzIZ46R/ik6rzVZ8lOi/PjzEyXGPnTdCshjVqsaUXFWoGltt8P/TWeYhoUt87uQTOoY0YAn+FYUTNW8dicHZANMsgeNXsLF1Fc1r13D3wX3sfPE57uzuYr15iZN+nrC8MMhF1cyYp1tKK0A6uVYYF4x+mZvxw2vfAnYnFOsOx902+kddvG0d4vXBn+h3Onhz2MKg18d4NEY+SxF4Vax6AaLphLtlZG8az0LE8xguuVOQzRUk8+sGowGOhn0W0rx5+ybuP/wK9/Yf4N7Dfaxd3VRjis9voNoLeUn9htQn5h2qcIwCSL5F7ZlraTgQ++dby8FNnhvArRLrSYvUUG3e5H5A1IjhWZctZPmbKYgnoS7XgV8PMIfAeDyFVY1RCWxUKxbsCQqxUwlji6TOuQIPIs4xevk33v36DNvXLmPqCcSehVjqTlqpml8+/qvjkGuLQ8PJJRNB6Uv4V9YQdYcYR6fwPclcdy7xpLTnVpEMT+GJDGHnHeTaCvOhI1/CXW9oazviZc7Ret1mle6tG1usF0Eq92QJqUS9rEKDJTf7s2G+lJN2DaE2n8u0tIs6kBfc5SJh0EGXeRwX4ScWnH/za7lyISwXuXAxT6aYTkIkYYxmtQE/ynD2qo1KfwSrdQzR7iLvdDFpt2FXPMSZh0qjgbxSYZ/3zHJgew7vLwQxJ30AKqA49Qoa66ssFkbUjw8XL8VNZo67ZWl4vDqWqIgaPZYXz2gBuy0fH3zOFPqQxQ61EOeyaFcJTfCRJ/8pB7k0UTxHwSyJctF6kM8zSHahEBhPJyym6VKA6igxWhJQJD2SRhAgrdURnSVMfWPgqVDzyIwtoUWWCe0UQOL42XPs7n+JlXoDoeMgjBMkxnKZOeIRS5GSyByN13mm6IaaYaeefargBcQvz0NC7s2RnIXwgqoWC/T5nZMAqMgNotXiMe9WPIQUz8KGX/E59iXqA/noh2cDnB8eIaIxNJhAThP40oXlSUwRo5ekWPUkvO0tXJrsYfj8D2TRkHWYyLdeCTfrpIr94sGieMQdnnW6GJ8OUZ+E8K9vQqzXMPNsxMS7ZvcQ8NqVGzSk4fgy8d9SsHG5SPBRFG10h9Hwj4XUrEFLabtolxTTCVOaAEbYTzkrZPrvMkvtGqypIMz8XiZtmnHInU1CPZCNsqXGpLO2Du8uxVwezmfA9OQcbhhCkF6T3n9zrQcTEMFqGuLkl99xtf41wopERAiQRBU89S6hfeJLRUezKH9k2TEoykKEFBqNqEXjFORd71W5ElEjREbi2PirP8BPrw6wvdFEvbaGSRYzcqFm2VjZvo5vvvsWL54+wW8/Pi12tQTKm95kHDT+PQHUATx99DN29u+itrMBGUjMRMLzyHJ0PKiv0WYIuEqKY56XC4t1UVqTRUnp3qjUL+67RBWhd0LFzjThHM7WEHMufNqSadTUmHA0VcyMK2peUK5FOZVp2KrkezkOZtE5LKDxlGwL1oiLF5QTsweyILzaYY1SfVZqvJrzG4E8ystcuJpOoLrX9H+qq51ygqyQwXpvKvnxA8YFKyuSe3KMYXi8dgCDjhVVl32BsmXLUJp31Oxl+lNZJNF07pWl4XyuNAHU+TMuBND1Mbef9GQ4aSc0MlEklDd/lSyJqcDg2MqJgBBDmlJP636gUUzs4890fKW5p99u8ex4XJhEn/aJVDk2mPtiygU1HQkxR/OJv38ZDSGEwD8AAAD//7Rd224bRRj+ZmfXXm98aIJTaKsGqqQ0olVVWoqQyhXiore8Aq/GJS/ANVe0SFSICwS0Cc3BSdzEbrK214fdGfT/M7PeTdKoiLI3caTEnp0dz/yH7+DrQgXJLaw5nB8YDKa50r1HRjQyEG0AACAASURBVOYkpMLe9PZgchXIHBrhlT5AFCwj0rR8AAprb+EmkV6zcJM2HHplO7rO1zG1AaD7nQMTzywiFmdIs/ywLC7WfIF5BaqAmkMmslxBU+YVqsAm+sWEyng7mntiFAMdRP6pL4Uv8y8hBcx0WFFXp/rBIvx2HdNuXAq0OKnlMac42N9Gb38XV1dvQvkC41n5CwJr4UA6AKQH0GrVmWsEG2i4y1WEnB8llyUCs6mTD/jyyjXs9V9gNIq5i0g+2BWdIUlivP77Oa7fO4JabEHXLyELIzRlFX7UxGFUR/LyZ4jxPuT0GL5OUMVc9CqfJ5SvN3Uszvu71MLTSFOx2zvBwnuhcXlgpIThvxEkO3X3JQxEJrVFAC5c2WKOs0+LwgrqUYhmYwFH/WMcdA4wvrXG3T9REZynM0yQbEiSIQ63N9FeuUGy5KTIcf7g3+KiZ+rU0EvP54KSwvk2g//nlZhkSrosylB7kEzx9Lvvke32sbZ0BZVqCFUNmJ6SptoWLjQEdf0Jzik0QutGwfYNFVbG+VfoiXdxSasKT4dTjfQvkHHHhRKiaTLCbJLicO+AqSSkzr/5fBP7nT1sPH+BuNdnJXEW7iMo6GyKFu0JfGB6RmDUVadt8NCoN41ljecb7rkGI6OoQ07rloLD5RvXcffzz3D7/qe4c/8Blq5cRr29xHuHS6IU77vSJjxejlpwIo0m/nPFLoNWYc6h8wlnqHKG0WSMwXCATmcX+50OQ/y7ux3sbG5i2DtmsVG+P+EhIuVqr8ZJFO0YCzLAYBQzMsFUi1McDV4zyokCZ+qgr9xZx9qtVTz84iGurlzHR+urWFhqodpscVdWWe5mOfm/eH07/qzQzobKJEIC3rlJtbuUU3MWynLsyIYHbPN5iZApowGG8dR00LUE64aSH3KtyjxiOZqgVguw0AixMCDVccWWXaY8lJo9h9D10Ii0YneHnSe/4NrdT9Ba/xBDEoekqXdB0AVjfcMdWA93bbtuEomXImw34C1GCAjuP0vZ/pHfPwOq2jfCuBTMnKQYb+xwN5VRAMRZrEi+Xz8IOXHrbm3j9XEfqzfXELUaDONmKDd1D+j8cwiYQuKfoXAvei5QxUF0oSBzMYR/HuDB2Y1JayvskAD0Gac7Wmfebz4+FrWk5sAowQkV7+IYFbLfmgKj7S78gxN4u0dQW3vQWx3IXh9VQrYRXSysUDcDGXW6WDjOxhKE1BEaiU6hfA/t5UWEjbqJa1KH7y+IK/3LJ3yWQnbxmnZ2xk7z6CzlrMDnfwdFAGeXTFxXTQEnCTXPbCeaNJKyGUPUWRjXujPNyPmH9AACiaB5CdlgyKhApZLyvRRfazYfwvDVIbae/YqlR49Qk5IYLXw59wBW9Sfdp8TGlVLnooiwfGu2PYRJkDmBTxXrUxEykChoVAQIoxpEVfLxTY0A2rsowZ5MjNMJxbT+LMNkRJSaE8TsFDFG+ioG4jEqykMYhMzao02A4t0paeEGGovtJhofrzE9R7/cQNw7ZHqfz+VfXV7FKuPEl5Ba48kUgxcb8Id91FauILq8jAF3EgNMAyvNSvpPfH/SUiJlab1wYaAwrzpHyrhEsewI5UbDOnFK54VlRw0gJAXvCZb371T/lXDyQ0bjyRUJc0SPK+DRXkKdWiEw9ATC9iIaQQ1k5hI/+x2zrRMsEexfhtBqai1FFSfUJNDaozPqpydof/UlZr7EUAbsiKCtNWHwH1a4svGisH7xvkU7UyGe0bGkyeUbhIjQjmYqkMoKftvp4vZ+F++v1njuAnKvYgtRjfUH9/Do8df4648/MTocF57FvFAhXBHAA+KjDE9/+BGPv/0Gk4hQasKe6R7v/x7eHpb+Jkoq01+0yvMfccoOz+U9Jk9KObdi2P4pxClTbrUpmNFPh9Z2/69O7dBMlbbNY1ai96VdM2eh9+ddRRcBlyty8u/U7dMZooAcjEzxwjSIrduAa6ixW5wodfZN7umX5ou63pQcF8fiUDsm+aeiGRXCaA6tG50bWyl3dM/L0nKo2GYp89TBZwo8e+8HHCtzI5yScxb9Myh6mivKMR2y3eXbXNwgShQJQHLcUshj7RhozIRwoDngfNMV6Ll4bAoYXIiya581hITHQojjcWGPBvAPa1fa20YRhp/ZXR9Z27FzuFEb6JH0CKD2AxJICCHxM/nMP+AH8AU+ID7RqFXSKoEmaUrtHBtvvLb3HvS+M7Neu02roI5UuU5Te4/Zmfd4DsdMHnMAZlKxp32Swq3VMZmMGUrEfHxdoTCDjZOkgfiIwtLPFnahSqkE9gysZNaupCwKYcQLzDCJelIIP2QFBQFGMRNXQ6YNHKUMkyr4TVYR7cwMc7xGE2Cmg6E/z4gr8XVjUZHp9SDLQ5poVGUjCC1xo+udBSzfX4ez/RKTsyGqJrYixAGhBaBgIkEwwP7uLu7ce4DMstFwGxzMm4dD6tcgCOD7A7gNt0AmzIvrmUCNklDaNMhujBb4lfUulm+t4fVfEsvNBnc57DxmmH0eDpF5J8i9c9SX7nJ3US63EDsWK1OurK4i2dvE5c6fSA+30U49VOQlKgjxoXFVuKNBYYARxyr9G03TM2+IW4tUUZOa/2ZxvSXwL/lBW7rRhSQXBlIdpSKAzIuKNc9BbaGVZTW2+ms3G2i6TXinA/T7fbQ7C8oTVC8uQidS/aMj3P3SQ/2zRcXbKYmfvDM+oK6sLLTU70wVtOd/Z+7tVQmz+Z5riuJcPdScIWsffnapWBEqjhrOfPz208/wdw7xVXcDS26HF+UIiiNLYbDDokRU4nbZykyGI0zyWEHRqdLoCH421UbwqfULrh4UatmW0BobCSI/wKB3ioO/D1iZn6z5eq+P0T/u47TXw+VoxMEbnQsp/ysuv8WhXK3aYGpMhXmZKuThRVd3iPneRQkHFmGcwB9eIiA6Va2Cm4/u486DTTz5/lvukJN7BXWgUaszAiHT1pCFbU4p8QdMZ9Zs3KqwRUgYVv1VX8wq0cHgEv7AY8SCf+Hhn709XJx7OD56jZO+h/O+z5xZsuokpWJabePxiC21bKfO/Gmy4uKCa55iNBnCHyRIshiLnQ66GzexvvE5Hn6xhXsPHuL2/Q1O/MmqkqHfhLKxlDSoSmN1QFIunJbuVtmLgv+mO1imY2qKAKoLZrpf76JfzOUvPy9K7MrhYkV7qYOz8xNMRkPYNfJ8jxnV4GjLtyopmQcT5CwSSutDDcMwmm74UgWqVnFnCLYKjF8e4uzpCyzeXmOnGkoepZg6Xahzmp2eV6EAOMAo9DaE4riLlBWjnW6Ln7Hx2ZADDEtWICpV5UNsV+CExC8O+f9EMmPaBnlaR3UHdrPJavEsmIsE8XiM3Re7rCnRXFlUCa7jaAqMUDxY7VQhNYe1OF4xLeKZH5kzyQVmKHZlmD90wWAaMOrOpiovqJ+bDLZUBHhH18Y0FLRYKb1QkWvMFmI2qtKGf9RD83SE+LAHefAW8tW/QK+POhXwiV5I+1uzDtmoIacujVPl627E4ygQpw5ebaHO89ptu5z7Uzcynz+/uVHW/8H7OvoQM8nZ9YtEn2bMazwUtA8jJkXCzEmMbDxClb24NfKD1j9KUMIITqYEuzgIp+5ZJtBuLyG+GLDanaVMRflzbX3uKfT8kRbrAbhRijfPnqO5tYXayion/OXBUqVJhlhEai9xK7y+GCqeBuppCIaau4ROFangQgChAvIgwtgZssMKPUu0v1d1AcBtNXjnI2RBlGYITgYIByOE/gh5pJwQ6ItsDuIrSCOFcqTnj+ZfXJHw8xytpTYWHj5CQo5Qzivk3gUQjVFj69J4KlwJW3urSNgiRz0PEb99w8gB4V3AvXET7uoqJtUqgqqFpGLzWsqiptLStozzTbVSE810iM19Nb7u+n1Zi8M4b6muoUr+iQpFr5ZOuGmOGncjLoIJ1eQTZq2VVvHeskyhQvA5hnRjSOOm66L19WNM0gSTcIjhwIfIU6ZSOZryQImHw1Z7CbyjY1jbO2g9eYy00+JCQC4KcP3sDiKM/cXHYwo+T92gM00+jhNZOC3npK1MX2KaQBry+e17A/yxf4DNbguNxQ6aXHpX7jnNtVV88+MP2Nl+ht9/+RVpoqV15XS9sDUChnIl0pg4frrPmhIr323CqhKXJleFF8O111Tk6w6TlDJ9zvDyCxt0HU+YXEdTsiOKUWT+Xog/FdJYqDCbwvzLKvYfO0ZqwvI+bP+/84HOq8z3UQ4ktR0h5YoVbVVJ56pQHlP6paGXceJrTwtdXORJs5liA7T4O1OP9dygwms2p+dG60ZBjdAU3VmuPsH3aFaoYion7boRSQ5arDGlC08LCy4n4OZ5prnBf/TnMY1eu+xRI5oLL+8RNiwPc2z8OYwM1deDxDQcAuNO0QPp3P0GgP8AAAD//7xdWW/cVBT+ru3xLJktoSkhSZekqG1UJCqqCgEvIBBC/GSeygMCgVBFGkhV2iYhTSeTdNLMHo+Xi84599qeDEUtAixlj2a8XF/f851v8XQOHbKbNi9CSAQhFDa/UFunc8rftfmLMDupsp2RrFbJThSNhTOjxbc7HyfTXYIkV2wLLdnNOv7WxTHnGpkY00GhuHhTUgRLxc7rVtILp21WZcQIrDWWsBoJ0Y14HBGTp6hIJKLovOVrRm2EYQDYbEjqnFFMBd1Q9bebrO3sPn6eDXQtxoB8oambFAXYfrCJzz7/EoVKjanWdmC7hglMlBWKUiHK8uryilBHONkgmbnheL/ZwVJ8weivFBlGHbzte1VEYZ9vVJrIPUfBJ0nB8CV6e7+jtnITqr6EXkCGP3P8ETXqWL66hujGe+g//AEnv36PF/vbmIsHKOgJPD1BgRkBs0kAs2nwuUV9iiqbkDtHMS3w9AzokBngvGSfUw1WIU1LHOC4fcSAhPIorXUihhaGSsPjNBE6KQ1B19MpC6BaKeN0MMThwSHW1y+DDEa9xDEUccWI/2jQRWt/F2tLKwQbvnJx929stlBKH9Rv9BbWtz//06u383kR9HMwHmHc7eOo9RzdgxY2v/0OW9/cw63KIj6+eRsX5y8gniRMFaMcUdFHmyxmQv5pCVCdAyYEABD4lQj3zfdea6/yh5uNkWnd7+tstluuKf89mOB5q4VnO7t4vLWNg6f7ePKIYuwO+d4ZkyaYJshEo0rsJvYvKaBMACRLfmTS901x7ib5QnO6szIkqhaNOd/F4tIiPrx7B9c2NnD77h1cun4Nxfk6NFHjbA47JG6JHsbsPJ2a49nPyVQygdUrxpMJR+8dtw/ROz2Rry87eLa3i5PjF2g/20fnRQfD3pAXXEQhLJODrluDE2n47A/ookROsXGfI1l1IUFvMMIZgZDkjD9XQnVxAatXVhmwWL/xLi7dWMPq2hXUFprshKwIyVY+RtGZcU63961MMkwVfu3xCzHgSsExxV01qDh9XrBDuH3QzmzJzJiGARIr9QZqjToG/S6dPPYGEDRcvF2IXuz6Hryih1LZQ7NaRj9I0B0FZvEmciKJbpMxUCLp2dFLtH7+BbW7t1ApXmQ5QezBZCvkjTSys2C7aVNX2HZyE5VGyPEp8Fx0Bh2UqwWg5kOPC7xU1pwklyAcDJkRUKLXPxPmDWkWo1KJj8tZmOO4LhpztCzx2CwyZt00AV+NcRMX3llCsV5jzWuklGG15cLjdebG/6ZTXowMZJcIU+lM8cLJJuSo/OsnuTng/MixlR9zFbggGvb6GJwMORGmpjzEpz0UOz2ETw7h/nGIcGcPqt2GPx7xIpdMPSPtoUjMwlIFEY1P8hXypPs2jgKEjsRzletVppFT3B1HUKkkk9X8T7r/xNBbRQLw3wCn54+HZQchZc6T037AngqsoTesEymMJGItCUKeX5MwxigOeY4sL1xkdpVjUoJShmMOoKMVXDGWovh4/wBHmw+w/MlH6MVA4Kp0BmQKNIEPgVBw/aIvAKjK/Gpo0cXdajMvsySKj4Oi2xxJb5lEPNeHbsK59SPTjDqi7iHFu1IsK3XS+gGcECiFjun6KfFQ0Vn0ljbieHaq9zTOwphdzuvkFbF2Fc1mA72dPfR2d6DiCUpU9HGc3dSVlTky0CiTpUe7i4CYBpFivxKKDY6Jek0su8Q4lcdi6Jo3WWbmmZN9r1019T5TgJWa9pGQdBYjEaM1I6UQuSo1MERurkrSxplZn9smGv+vFLpseO35EjXLkHTCwHHkAY3lJuY/2MBwMsZ46xHi9jEnAFRZaiRGw8QaqRKIGsU4ffAb6vNvYa50GaFH+6VN40VSohJlfGVslK2dqvQsuJWeC6MdSDu+NGZiKZapORSacxub8cPPWWoGUE56YQ73n+7i/csXsFpvoAHNbNdY2pxY37iOL77+Cg9/2kJrr5UmQeTPPV3zMlVhOkLUA+7f+xGf3lxBoVhhaSpfkxTc+ed8nvPrUlv8w9Q8yuTY2wQ0z6QPSZF7vqNv2dVCu+etIIbC9DvHMEzsmLLaeTH581gy6ZN5oqHq/9U1+TuWKzVdbcQ8DAOgwClKPo9HW/zz/etIs0CbWB3rbm9N+SwLxgIKriv+bjBMUWE00NwmnnI6lESDlEXOMXvisp8ZIEotm0kvpq+ZfW++N0xccRqjz5F9IhGlWoXZCHytCMiUZ7D9m2Vd0JZGXtKahGU7dM8L4HN+s/tLx0frM5b8GAAs72nArw3gTwAAAP//dF3pbhvnFT2zc4slWbJkyXbSOHUb2YVTAwGKFgUKFO2vPmV/Fugr9AXSGk2UNrAdtYkDR9ZGiqRIkcPZinPuN0OaaWQYgiFYIIffcu+5Z+E1iGyRNy6D0pWzKazcBx3XH7inQpcXah0zxd+d8ACgPsQh3fQFUBOWu6mnx4JrSdlfN+ZbbfR9329ob+uGJ3xdQU1XK6zJk3mMPW1E5H5WS42U6BAy0wtdvHopCQLcpMgQN1sIhiraJcQpWKsVN6aGebrUMBcqcEMhzrwAS69wRY418nzAQo3dIuNCJjpICmJ7q4fd+3fxtvMVihG1taHw8Xqhhyo5PFyP+3jz3Ws8+PiJ6OvtJDKaCDXVYqMF0uUOTtnMzERnlXOm74pQHmD1ecdLl07epcXr8Re0QuDRRw9xa/cA1yevdVGxUUizHL3Qx3B4gv7xEbrPfq/mOebE1+ov+GQDbHaQ7NzGHWqXf/UHDI7+josvP8PkuyN055foFCN0ZDSz0LMV1YqFM03jlYAb6J1aon1uZOZqWTzzpWfO5XYM4GSUottq43bEjVJgUk0RtSJcnw6Q358p019evJ4hekJU/eVGCbR2DWR5r9fC7u0ehsM+Lk5OZQZ49/6WaZ1ga6oVGgj19r+v8JPDx6g22iqytdK88gc6WaxRnda/fti3LA/cVWnEMpbpXZJVTY1uiuNq+ZNKw5JS+7Ll8uI50dd0JkoMvPJLl25RYHo9Qv/iDFeXfRz/55Vy67/+6ljfCSjNz0fYAfC0eweHf/wUe5vbxqjwOWUppaDPFzbpCamNlE62kLHWzKswD0voZextim7rNyj+/y9kPWdwuYw69F1zwEs/0xoi3VnvJ6CuitFULf2MMMSc2c2uwaHZ5ejsEt+8/BpH//wcr1681NS/f97HbDLHbDpFhAAJL8KiQtAKBD7SMC1UoDqNr3LRYAk0RcpLXcAvDRWmUz+YLpLlio1L2h1s7O7g7vs/w+NnT/Hzx4d4/MlT3Lm/j97OnUZnmTfv386RQH/qqU1Nfs81qS1gkqM0n2Ew6uN6MMTV20tcvDmVbIGpA5PBEMOLc1ydX8pkkIaF0os5zVoQxDp3VKalBQaTt/IoWCws9uWSkz5JpQoZfG3c3sSHBx/i8Okv8PDwEX765GPsPbiHvXt3NaEI4kj3Af9mbsYv3o6At7JOLHfxiQG92GXUpSxdeqTEMXKX4+s7jxZeu3Srn40nGPdHmPSHuDo/w1AAxkhJM9y7T375CZ795lMBD3BFyaqhqGfx+c2+aOx5eKZHMXrbuwgvmNSQaTLYihN487nO717vFvLxHGk8QNKN0e5kSIbX6IYeZooH88QkSUvLMI5pgFoYkHr2rxfY//cL7O5tw/PbGKDS+hcgTet+eEvHg4bZ5DWa8CbArbK7ixr/wjl/qbCQOWIBdgrRVoT5JNW6j6oY8TRBMRwiHY+xQT1zprgHZJSWJQlaBE99c15nTFo1X1g8GgueRY7RyRluaLC6v4ud/QPRYSnhYdySoiProq02Y1yZMDYYZQ2IY6lBbkzkRB92/0f1gt94HXiBmzY3oK/d4SrDctNPc3Jh0xBz6mazxj6M+3QyvEE6zRQpl+QRiutrRBd9FN+cwHv5PYrj1wjPztEiq823KXVWWpSUl3QQtLuomJfMwpG7UFGZNH9MEbQ6Mv/j8yj8EvMyQxbmyxPbd75Idex4tdzDxlRxBXFl700JAW6vvFPvrt0H6zKX0jmUI/AdXdpAEO9H/BbWAbDl63L/XmOorTIWWJhWTPVgXTRNUVCzvSjRCROxJiiH4udSpmRetuhyJSBJKQGZPZe015Hx1bx/hiKdSnaFKlPTVrmxPU/z2HE/OMC4KTNcffkcHzx8oDqEmnE1ElGM8WIiVhDZBqSM51czIIzhJb4zUq3MJd41WUGT++caYa+WonoCL8IyEA23fviWfOA+V54fsp2HMwk0WKq5bYNY4wybItj5xd6QkYSL6gZXNIruBLjVO0BvawvR3h4unv8D7TTDe6zJCOasxqiVvgmMssoy+Wcp0m+/VSQp/YiSTksZLak86Sq9Z3lv1c79lZkkN4ZlMFB3tcZ4Rx7gW/O8StvnV6Hz3Kj/NfOyXJGD6Pys0wQsTNo+R1cbpWTiUhIWhw3Dox4acu+nQYGhn2LzwQ42imdI0wKT6Rz+eIyI5rdiK1mD5GeFdPLBbIb+889wb7uFKtpG6SfIYgLysSVLEKTzqoZNKa8YJhR5VYNSWmNpZ4wN52y6WrokEq9mULB5ystG2hCWyzMrpnGzdNc5Bukcfzt6iUfvf4CDbhc35RRt31JVehub+PXvfovjP32Bv/75L0qa8hzgINzGPXZ6KXUoaS2ANy++x9WrU+xvfmTU+m6AJGxbI1cWrnkstcbYh9TN3Oq+Z3NY0/Ijac5Xms6s7q1Kh/N4Ojel6Xe9lyji7DyKhSWFrZ8frK5qo8DIdxIYY32wtzFNuUkh2ZewMZ/PFuh2Oza5jlrqvRYuBaA22a4HmUwNqpzpnfaAPJPqoa8xTCjTMXM7X0aC9blVU9rrOL1a2sH9IIm6M1/OnYlfoejBuoH2DcR0NWm9LZUFoUF2pTWtdcw1lBe6OwTC0oiSfQxNYWvGom8eY/zi56R7W+FLBh4s8/a5nzzJwevGXn0lWbNi5dh6s97WcQ01FHBeOa7HbFjvHLrxQhR7lGx186hjMl4dGShvAPZ8BYEHk7QT2Fg9+5XodzPD/wAAAP//lF3ZbhNXGP5m8diOQ+IEkkBiB0TLWqBV4QK1VG0v+gp9nd70qi/Uy15UQmoEJRQItAoixM7ixHiLZyae5Uz1/2fxONCoWIqSyPZ4PHOWf/kWV3fKJzwRhYQ1ipwYoKVE9TQUwwg5pIk5KMOl1eJkvBadHGdQoQ0E8yBcPobvB4a3BIabqC6ugnPmq0X6/AhlkQo9McbPZ0r5lKp6WhzB0lBLJc6QP4/xqNM8GZvh/UIJONDryRaDqkpSdFAmtFojIH9e7DVrSwXL/IXW3UGiAcwuVTFzdh6BfyCFD1XHxOEfm4sAoQjw19NHWL1yTfmFW8ovUzJTC47UY6Au38HOHlavfGI8WqEmbn4bcJQ1GM0BqiyXig4url7E5aufYW1nhyFmJNBDiRZ1TMpZjKC9h3bjLRYvXIVLkDn2W3aY1x0SDM4rwC1VUK4soH7hMmp37iPd/RuHL9fQermGo/4hiH1NkGPqWnKwwXA9WlBilBjJ4cNRoCq9YOWbLIm6s72QiuYujrl4k8D2HLZmSUcRi7TVZy5J5AjDqiUqJXOccXXOkfx2KmSUSQSs5KFcLML3fbTbbZw7X4VbYMdwaYNHPGxS2R700WvtYW5mEY7lflQ3ejwwRM7/+bSHMBH2B3vf7x1nfDzXoQQt4wRMcGKsgp9oxI4JRBc53G9hc/MfvNzYwIv1dew2ttHc2cbIF9KzPpWWTQRzIx33B7e+wKXzK4xe4bmoCn4GfsgqvZYRcKQxHFLbtDqNcn0RmCmbhP707z7JE5dHtLQgv1LnFRj2hrzZBIHPc1EoLhsFhARTJ+/ojcfrePbHY7xaf8ad/tbePnPxiVdNcOiKN8XjXBcAKBmkuUodEBb2HI14fLpeiWk5ND+jmHjhAT/veEXMzM2ivriE67dv4/O797B8sY76jSuYW1rgBIGCEYKZpnmOpAqhbCUvp9eLhCu8AlEwQL/fRau1h06/g623m2gd7KHZ3Maw20dn9xBBd8j2WJEfIAsT7lCnUcJrgd4Qi14JtlXgTSskRfsoZgtMCpCHfk8u9lSUKXlYqC3j5p1bLED45b27OF9bwWJtibmz5H2euY65Bwny9CLrRMphsweBuX88LiIjNGTRQs1IqQL/jkYj5tE3Gg1svdnC3nYTb15tIj4KsN9soEMWbiPyz04wiiPMLMzhp19+xv1vH8Ai6zbWiynkxst4qcvMPBGye+W4KFfIDWAWyTEVDadkR4I9x2O2kiOesD9VAoohb9SVoospUkAXKjtgVJDs3UlfbgtFisbf9dH8fQ0rN65jerUG33IQ2SkHqZYe9+o8WHn4RABu6HAMLZav1zQjKjAzjNARcKc8WNSOzgogsxmGOWtRbypSCamYSMnY8SBEtNth4TM655inaZnXd2nJqLp4VMTIRni320Kv18P8yjIKZIlKe0DmTmj6qP7fqarzGq+S6QQFYyE/7Siki/56f4bqIErkg5BFkExWSxieSnsROdfQ+1MLAdF4ugGO+yFsUuoiG0fqTnUHTZEmjAAAIABJREFUsBst4HUD2NpF4aAD73gEL43lcRkFWcKINgC1F2uIdKL40DbN7ayA8vQ0jwdb2QGSMwBTmGjtP8UB4GSCffLq/J89Y6yT9L5I4IdeN/H5H0kpMDEYi4tmzPGPwgjOEW20Ccquh+BoKCGoJEwZEh+eAkrBxaQ0OJYFVEcnezZGlEhW5yHCAFnsqzE9iUyzlFMJrRhlKhy032H3yTqq38wjdD2EykJQenBLZCXNt9hPZPIdOXDLPBX4sy1XjjVha/7geJXS7gOZQti4EzHiiW6pkAUYoUYu6R3YyhlDe8AbKxMqrjPIIeJEILJj+GTh6Xk4s0RCrmchCg56L55i0GmgkqXQZqy6uG+rpYW9/+mrJSN0Nl/jzMJZzM+fY5jukIr6ap2lW657YZYwy5IRf85OUCfHY8UyiIl8h5ybZo6E/Wvff538Z7nkX9sJ8nmq/YqTuoKjbEmleGDe0tNSJ0lrXmwL+I6Nan0J1dvXcTQIMHi+gVJsMezfs+T6QlJBNk9VgaTbwf6jx6h99xWLqxL5VVAiZecRAJOuALITq0X95MWhGJD56I7uEitofqZsj7Nx0YD/zvIsJJuTRmaiWC422108edvEtZtF1CjZRiS1eFwPc8s1fP3D93i2/hyPHv7JWkOZ2vVjazJao/g+PIrx8Nff8OOndcyvzKKfhsa+l3dZIZQorILx/0d3X+cxOh6jfETbtzu68KESTU2x1h7x3CAUOkdLJyy6JA9eUmfH2gJjdXkqODA9Wtjqf5kDUcMhYoG7ivGXN3QnIVEFiXKay2uwsc5aOrmemq59rvCh43p9v7SdnqWE5TX/3xw7ywy3nmIP+lyC3p+kAJjP1KKaqkgiPfyJMy+/V54unteX09dF5q8a1q+uL9UMSTCaKNpRZO6DhvabOcpizmoOcYFjrNsgz02Pc5mPG726vE0407WknaN+6PezOD4VihjhLoUG6aaQuL7nefiXtGvbbduIgkOurpZlWXacOL6kcVw7cFokKdygaZ76kKJ/2pe+FCjy0m9oYbRoAt/jW2wplm+6kxLJYs7uUrTqtCmSlwA2KJMiuXvmzJyZlHRaVJgA10r+iJhTyByQvdnKdJAcE0/QjR8IOzd/0+YVBoOf6xPVjv8sxrr1uskkVHH6wKfIrIc3aF5b1+sMYvESG2hoRgOUMUex+aYsnNkEsEBfGsxUKMQvnmtk88oA/34c/eYYyZJrO3LGWZ0LlypmMHHvDmYWZrB+VJUpMUqi+pJTqx2nndABubutjXVcnp9hanYevs8Z20CYJ+viyf8Jbvb29nD3/j3kMmlx+teZ/4P5OMQOopHcY7I59AKYmJrC09Vv8WZtDX6Njv6OyOjo/EslRefsEtHuDmYfv4Cbz8EXqRglJQO5GRtpfiYFLywgu7iC/OJDjK98g5HKMc6336BzuA/vrALv6lRk2Z68GIEge6X68K62oHDBElUvf0NFpu3O1vtArdFAqTwmP+zLNXAz8gUoTc1PS+fOMQubxFmaeRp5Mck6Kke6qnwHi6NFlMZL2D+p4ODgCHP3Z5DLj5tNwhVQxhek02pif2cb5fvLSOczAng1e2AlaMZ4418LwJuKv+vSYFskRkPgH4nyUYOboc+KBt4JusnVQ7vewHmtJuZ2+8ytf3uA7fUtbG9uoXL8TljwHuecTVx81hQS0loxhjW3UMTi9Jw8402/i0xWxQ7MdK1V1FPSdIm9U7PgBG4f/WIWE4szuLW8CJTLmppVCh/GDqFhJ3Sr3IkLWUdymI+OjnGwvYfDt/s4OTrBxcW5sN3cYLRZZxql0jhe/vC9MOW//vwL/vptTZQAOl8/ELWMgF5Xq4s0kHHQY3QRJaKRPgduTi3ZIFwZ26EKiYZ+Y3ensfT5A3y28EAk8QtLDzG3sIDb03fgMj+cQNkUUVyA2bwk+NEFSiimgfru0Cmlhx50EXV8XMHu3p4w+bt/vsHV+5rM7J+eVsXYjEU3O/dUKfEzeM8I9mnTwLg8SrfTWb3x6+xdsv183nsx2Gy12+LgHfoexkZzWH68gi9Wn+LJ82eYX3qAhYdLKN+aFIaejUMR8StjHhrz+poBtm0aK8N1b4A2rhW58veGKaICpd1q4fL8QlQm1XfHONjcwe7GFk6PT8TMrdtoa38FJtEEkcgHOcveZJPz5BSvfvwJj5aWUZq9i7QyhTTX0zCpmrEAwxg5RXq+k/OD5clJdBuXCNtNpKhaSLERoWV2mUJBmLtO3UN2xEe5FKLlaQVNJ7RyfscwSJF+BcMQBd9F8/Uuzn9/jdLt28gz1tF1ZE2XQSID/j8+kcPMxRKMUC0R6rnmHFnp3ijgeOg4dPTtiaRZuYOmAj1mRJHTdoW5iShvpuWYw3UwJWZtYhCQUONwtIxgjwVg7X0Npcky8vmCFD5wHVMkDM7rUwafrKRYxUoAbaJkM8iFXOR1W2MlJy0O/Xy2vUYHQbODdr0rLBMPSLtZeXdTVPS8r0HtHMChEWL1DOl2B4rqO0fnP/Pa1UhOAAS8ADk/kFEYNqN9KZL1TC/lc8XiqCTD0KCLruw2rzsebfyfIwAyb60dKj/62GQjIPn92Uz3m27EjZMxiWaTk4ix1cuS1leJORrz6VUa/UA3A7jGhJT3GwBBkzY2EGnWl+r6uKqeol9vyF6rI0lDeazIYmXKU+ieXQB+U9R9AmAJAgjcYsDqyHqWZwRuL8K79U0Ulh9hbCSPK1kvIuSUQpeqA/Fg0r48jvGlkFi4QJuoqUCPy2hn9yietTV3NG4OukOA/0O3wmbju4lYTNZlmgBluksK6HnSKEa7C6fricIllXXhZQI4hQzcTAH5Z1+hn0uhuwZ0q1U4oVY7wrDX8bmFVnUAhPUmutuHyJenMLYwh0ZGiQIlNPS8GrrP1oxPj0YknO4T9XOEwdpoRwEs+LfgPjZRNeBf5uXt7D8Gx9rnUNZ+mptlUsJwy1pv3tvkrLL9x/69n1MoLM5CtVrwm3U03x5ihLVL4GnW26zZbIDmHKBxVMX5HxsYW/0SUTqLFlfVmIDBNQWmjZq1o8kwI0tRgtSL3z0zS/dhePHPQUoSApeej7WdbTyfm0CR0dFkikUVn4JK57Dy9SpevPwOlb0TnFVq8MOBp01CnCY1OA1Xq5sV7K5tYL70BKliSgNZN5EclfAokyydodFsGzEHA1hhgHkyi976tFkiFaaRG5gmg01BsE3eweeHssbaMQBN+PaHYvoGI7FJPzdlJO4WBzlG/s5GWc8w0EEMrLPyt1ijKFGqXvefGxx/nTy2BvVifGeIVh0jr1WujlEAJH3cqMq2jLzNvh82qmUtaZsGlh0f9rqz16sT4TQWlmj8/1jbk2Bf8CLJVDPCPmzyd+Pxww1nYzpoP9MS3fwObNNn+JzlO5KGCw3v9f2hwgQA/gYAAP//tF1bbxtFGD17X68viZs0l6Z3aASUlvJQCYlH+NG8UIEQFwlVqE2TVKU0GBI3TW3HcWLH9t7Q+WZmvQkBJAT7kqbKrtbjmd35vnOTN71TXFBpKuxSNIV5+cXJbDDMBBFKhGivHaFBuELRcgq6hxmAP3XNdUFusgnNhzESAXM/nDB5yQPAXKccSwScbRoYHwH5G01DNbnYZQMVFtvyZdNYiR3dNC8mDn0T+NPX2l3Rm1jK4IIvdqJbnFjSEMi0GaGON5TCE45+wCpEkPmXOWlTzQrqV5pwq57QmJk7Ik0RKI2/oquniE9P8OvP25i/tFAYahQTQrtI8ovsdjro9bpYq63osc6LB0eBNpkNsqVNYNIUUc3FBx89wMLyVbS7u8oJNFdeAAEdQOMYk/3fkL7dh1dtwK54KkpDPxzZUXeExmVjSsoNu950qL5ah794C2u3H8Af9IF+Byed15hOhhicKhTTnebwT7o4eOLAOnyFLO8IE+DCya89Gvc6E6zVc1Rp4oQxpqSRBa5kavZ6PYn9MotDtNVmEWhExYwhGRWMAeFG76DfFwZAr9tHo1mHxwYJlJ8CJQZBBvEBuN15g8ZaWGyo/+tMO2NydZ72Xy6wZhrpEqqeq4L2dXtP0O5fXrzA1rNNPHu6gdbODg4YYTcYCmLm6LBEvrxqlqeMUzg2smFQzs6DRHVr56KqRDTROI00b+rznNJDXpyDtUaRGBnz6FOaFzUDNNavI7y2AjSqRdyh9Q8IWK4bQPoXvGm1sPF4E189+gbPN7Yw6ByKVEM613muC161lheWLmOpcVkK5O0nzzHsjwTBqoRRYXqZZMpVPktnzwAa9jFLncV+5qp4K6LF1Eaz0L9+6ybu3vsQi8tLWLtxA5eXV2CxgyTmhm6hFRR5n+5Im7x9mA2X/DOV/yK9vbXLAv8tNrY2sdvekyhPGvfFnSN4sXr5SxwRs2S9EJ6n4mJYXI4SxYRKHEU1S+heTQqgdPwtiZwS1356mGgzs0tXVnDnnZv45OED3L9/F+++/54g/3aViLcrelZKc+iinlJ2qwi6aoyKeZiJcZWli2GTb1yem3ZpfjLOlPdxRI+NdlsYOttPn2F/dw+/v9pB/21PUEQybARFJOt3miF0PO0kHCP0fBU76PoiN3m5uS1zYG51WRp9ca7lBBoJsy8wOCvWkW1LYUujsj4jjygBoDTNiVVDz/Xh1epwowG86BTROEMtPBEJFx8lE/POMEZmTAOgJwizgrsD7H77GM37d1G/vYohY/lkhVnFO32m/f/7RoD5LBzHhCjrNJZxJGvFCysqE5uU9OFEZZsXyJ2iS+ZxLiwXZ5Ii9Y5Vk9LStryBj4w765AuxCa/TjUypJHXO0R3OBT9Y6VKVlcEK4Qg4f/2uMjszoyFGKIZuUZqzQwSOblSS/xGpvFI1vy0/UbcxBmBCT+Axw3g8QhOrw+7cwir1Rb033vdhTecwOf6EU2v7K6Q0eAlUrp/l+ZUjJIi+pwrfTFBDs76sBqh2qjLfmQs2f9pwUO62Hvi/z3KSP9/aT1gFbpo1djjnofPQTZNwbjlaYZ4dIpaEMqmncwqJrsECbXyQ4w7PSSjEQLbFcBArkWtNhHjqIokqiEbd2UdZ+ey5HNDM88yOb9pAwdHJ+hsbuHm8hVh5x2z2ciGgjhbByJnoykr5yrNyWLO89SRBoDtUeajmHFSfAqSM4Ny0xIToMxgKStLz9zfX0iwXS1mcCmjY4FAFhaNhydTaUj49XmMHRtDN0FesTChXPHhx5g6Dva/+wHW0THChL4icbFuTVM/1+ywmuNjQCO8Wh3Rwhwai3OIadBq5SJDyzQSaJqv5r7NdWaxnedMOfWXXph1iq/XDGww4J6Y0erGAEpJF0k28yeypPBRsbZOSFrxpLgvc0Ka52dCoXneyM7gz9cRrd/CwvEpDrp9nAxGoKAskKdBJs1BSkO4u5uMpxi83IG/2MT8nQBZxUZil3xxci0nPo+H6Bi3Yj/t2GcaAGVWLgr5XcmwtFzv6KabzFc3wGZrFz+2VnHt3j1hrwQ5k1kUiBKtLOHTzz/Dy5+28PUXX6p9fD575JffTTTBdCc5Hj/6HvPr11FfX8Uknaj9grDAqNNOBWjLjHZdF/Ll2qVckEvknAG/HCOfmj17JQO+otazSQdjg1fJrdOiUDZjKLT+XF9f6icF8nLvxwg7aMp7qsEfnsuim+cRlFSsgEzHGc5YTdy3yU82FVNHPkM1ipDbrkpX015w6bkGBVAy0TVpBKn6O1uaWgq0NocU6SWkX+qv6VQc8HmP5loGQee9c2wEwCnF6BlUntcqEHqajbuUGMRFmoCpfY0ngBlLdR022VVRznsw8gRjFMjvzRTx54/ZfD77HjVjTd8qiW/V92zkEecP1tCcI6xXjYEhpQOUSCRpgj8AAAD//5RdSXMbRRh905rRYksW8hbLSYizVDlJBQgVqsiJA3+WGxy4cOfABXDFYIiTGKJ4SxxZsrXMjDSLqPd198zYSQrQxS5rsWbp5XvfW7JV/r+i1CyYrZmAOGJXPKNHcTO0QTvo5+aCmgWgR2zJzbMteRGt6YJoOEo5lcfeBKSu1kllzfT/ycXPVTkSkojmUL83MZQJLg48abw5i8fpZKYLUXZii8ihMhMIzGewu0d2gDWi4Gv53Rg5Zc+Hpd9bpgNXM5EAkHZadtBYnENrYxXVKwsYvTzV79G3eEY/8+TGCLG7s42Hj76AcmsCYiRO7vBpzR8GwwHO+2e40l6Tj+AEEFsmRrYaaPqnMgh3Ypx0qVX+/MvH6O7tIOiPuNaLFi1IEzRdB2cnr+B3nqK1cUcSCSLePAZN5LmdWhNnorzxTMykmBrgeQrB/ByqlSq8pWV4dzYpmkM99CVaTjj9r/fRGAxwMjjHXDJEaRYWzkX+SKG9C0YpMJiwOGCHkFpeRwaXP0lFCrG8vCoUIKsx5mag5MSiq+VlEBqYgkys7Ao2JgmazSYO3rzB8ZsTtK+toVRTcFxHumjshNLMJwlSjHonWFhZBry6nNuSWzMDxpiCkLxW1CV/EGK2CLa6gMyLuZCZkKhPIrOBgFfJFJnUwNLJWnJqoynO+iMcHh5LV39rawtPd37HwX4HB50Ovc50dx+6AV8hmivFvxLQRlOOtZuiYyjIFU9rhBra6wXr7bZQgh2aijEuJ4jEME7Q4DQWs8oZjJ4XCSYqRlBRuPbZA6w9ug+nvaL1q9mmJL3Yvbi0cGuWjMLw7Excdb/75lv8/NMvOHh5JNpTbZB5cdwKCo2ZMAO2tp6gtdBEt9tD5Icoz5cxGPvyXWEmRk66kzSW71Stz2NuaRHLqytibEf9/vr1a0KHv0p3++UlKaC9Ws20Jw09gtfVNQ71jkXJE+msirkoO7eU5yRTjP0RTs96Er13+PwvHOztYb/zSowJSa+d+IF2hXXLmE91Vi/vhUms0faSiYfhInp+fo50pov8mXHmZrwbNWoeEfgkFc+SG1fbWL1+FZuf3sPNe5vYfHAXH2/cQGv9ipGY5AaLWcSTUzJ2nY50jUtGj5wb2LhIqRVk1I9s1XTWtWPVsoy9GY0xGg5x3NnH0cEh9p7uip/E8eERxqd9JMEEamoAUBappmPlmhuk6lZkV86EWd6PvIZ07RYKbqKlWP2zPq5bOdq/AHDFwpObl2ZrEZPREIO3XaRRJJ4ZlHkIFZia3vIcas0mxv0hMPLRnK9qjxcwNYDjKBWD1BJyejvJfI4fobv9J063drC+vopemqLWrCJMNT1ROmQqfYc+n17ytuFCTHCKzSweezgYYuoHMi5Z3GOmtYvUXQpFnYwsR5uU+WEMp1wR40Qv0bFNQT/Qsi+aHLoVRC0P/Es0i7WuqmxomCabHlNS6ifohfuYW2xhdmUFlSQRMzwY01luImTzYphwxa5M8aHXVJjCWemek5Nri2VNNkIfFnm66zJFyuOIefxTjHtDhL0BxDSGwtkyGTxlmcejQQ+eP0X5dQ9e5wiz5y+hOseohYnUgjRsjegKXylLFjyBrpjaR+rOR2M4b7tYaa+JHCyUHHM9Djje6wsLwggimEiUgKAUZW90isd75veSY028LjY4LmxcDQvg8prwf9gEFkzJO4QXH3I9CpvEd9YfwxSz/5cu97IX4MaUAEwYwQ0iRJQBKM0cYbpFMBkhHgdoqLLktYdHJ1CjQLq0BJC5jjDVhADxmKzOxjyaNzcwCU7FcyPbg7znoYT+nqCpXHSf/Ib2rdtY/OQ+JgTRlOhAZbPPYp+Fv8okgjMxIUyp5Y2VgNtpIlnKAgpkMXYCUDgZWmn3mzaNShntrLAKrO7d5ubT68GkHIiZIDPQo0SnAbBZNZ2KBFEb2RkgnrrsUopheo64Ng9VraH+6CHWag0cfP8DvJkDL0lFYskYXdii27IpKXdSNYxfHaJ2fAOLrY8QMkWH194z/ggG27C+IbC+QRyTmfahwPxw8jx/vc3Qmps4cxDMi389H2gWgGx5LUPAwjbcl3N/T3mR+I5Mc3lEFp+nfbSYjc7jFeYlEw2Ug7Dqot5eReNBDP+4i96v23BEClAWHyyYBhh9V2qewnRwjuH2LhaqdSzeaqNUqaBHAM/zTENBZQDAh/C51BqSX3JRzwr9xHgtmYJNXZJKSDHq6M1y15/ixxd72Ly9gaW5ZWnsxY5eM8vKFRng46+/wvPdXTx79reMEYLqUcGjTUGbaLLpd/THCfa3X+DuShPl1SqmsS8dWTYqxeUees5JhB3syrrriRdKlH2a/ZkUGdZFBshMd3whsmUlch7zRPa8durPneZFCsqCNknyZquJ2KOUy/4eFWom4m6TSSBjy/N0IllRoqA78kreI7ULi1cW3CYtQHwGTCfdxgnCRguaupLP28LXM5H09vO5t7OGd6nxJciy8c1rWKdKM1mO1TWJGHodE6DTzLO2qBdfOLN3LD74Gu3ir0EWvp7G0dJhF28EzRAo3m+sSTg2iudEPAoMa0M692SVG2YDxwDnPO4hLJPR1gf8yfdZpgKvfRQFRgqhpTl2jeB5C0Oy7W1inWbZZ54YXLfSGf4BAAD//6xdWW8TZxQ9s9nxSlYnECcBAomgVYRUlZeqv6D8xb60v6MvFCFaVGiBlhISJw2KyUocEu/jmerc+30e2yGoD7UUKZrEiT3+tnvuWXzRU1iawidcBZMNRW+G7dhD0BVPEEpfcrKDvu7fDrDLKP2Dk9I1GiuiqVYnwkWNnX+CDb2Uxs7wA7QAA0GDBCXqJR+46cbL36B5CjVsgtYkB5fRzTfRMCbF/+Bj9LpjIjZ8cWaOhp5rB4m94VxUQ8l2jeHzoBa7yF6bxPT1a6i/q8E6f7oDMXieuXq0t4uDvV3M3liRTc7mTo4+qtUqbiwvI0irIcjlzSa3Dx1zcLGOvXV3BY8KU4L+Bz01IyMFL++EqDcOcfDmOWa++gZOpihGaZEBEyyiPGqIJ2AApQGcKJRJGHM+J2IGcw5BPgYyHYwFaWQO99Hb+gvdWlXQ1MsePeMHQOf+bJBBMeuKDIDO5UEc4P3eAZZuLgst7VM6H6vh47wUvbeni1KhUED65AOq1X2srDY18o15v55OjsCYXh5Xd3Dt5k04flbQv/+jIdPfbGLl0XmO7tyRdEf0QC+6rm6I/cNdoYWvr7/F+pu3ePbsBV6//hv/bO8ohc5wFz31adTt0aDQ/FFKIu102/ScRDtoyemBOd9SelJK5aX7nS9NivGamK4xVoyGNO3QILhdea7MV6eHWniOmeu3sXj/SzjzJSCfFZMhFq0SffTZO6Fob+3wCI8f/owfv/8Bvz/9A53zjmif2eH2XXVJt+sI2TpkKvL+NMMmNipv8d2DB5i+WkJlYx1e2BCwzklrFGexOI6JqUnJQV9YviERdpOzM5hbKGNqriTZ6GIuJfo0y8aIjb+BKXU97bo6fQqhrpNqRshB38bH01Oc1I6xuVnB9vYWtrY2hfb+YXcPrdqZdLOlYw8XKRZUpMKR4hqn0Go0FNgk0Ei5crclX4xqarfqYlhEAI7dX3Ypc3mlK5fLZazd+QLl62XcXl3F9PwcSksLQNpTSxDRMarOzzIxBuMo3dFuo56IdG2Vd2vlXaGCDyL96sh72d3dxfZmBS+f/YadyrYAHEyTIJIYGX8Cjq2MG4jvAun3Mq9cBeksSYdFLg82YRQKoME5d35W1wLaczC7WMbVxTKQTg11Y20n7bLuf3+u0aU8V0A2X8A5K3oWB3QG76j8gwAbC+sgl4GbPkWQipBLc18jas+IPc6lWFj0qjuMZB6x2+zUzlF5+Avm761hcqmETtdB13ENPTbqd9pcq+GLLq4e4lrsqsM9O9QCgBi5F9dPaiQ5LlLy8y6iZhORmMxqnr96dHlCcSerwm03ZE8kYODJwc1HXMzI3iNeS8asSBZEroeu6gfJlmu09gSgyhTyAo4VJ8bhjakDs80tJgg+lEtuyVb2c+gfQA1t23Rt5HDWVXMmMeHqRALwhc2OmBLWT06BJoPiW4r60jfCG0PGSwuASUO6uN6F9/4YYeUdUNlBep+AQFsjj2g+TLMrP4debgwRTesIMhC0i7oI3ADNWg2dsxpSmVmhILuM5HTUcC+fzwtDrBsRMOABLDSJFJ8fYDp/LgcBLv7+cOcxGaeW1nvZ8y5jUv03mYnGbA4UkDyrcZ85ayCst5Aj0NLtSQeyHbeFKUNDv7FejBaNR6vvkeposamFQ6gcIYKenosmPT8KY4gmx1FvfUSe44tjG4mW2cMw9ZgeFjk4qL56henFq/ALWZ5cJaJSYshIGSbXv+cawz8Ia8NKZCKJ/iMTQNz85PMWGZ8XahErG0cSrWqLfzFN9rXIbRrD5gimyKb5IA/lPDOygGzH8AhGddoCBrim+Cf+Qxf92BikOX4k+v8GrVJ5L6YKGL9zC3NHX6P29FdE9QaKnpfo9+PkXK1Sqzbcs3NUn7/A0sw0psvz4kMRuj46UKZtFNvoUCPdc5J5Z6nTfSmuo1p++6Uxf9po0gJ/YDy6CVujZ9JP9Joj8c9qAqtzKRyc+9Hwejx43mdB1CHTylGJiJdN48rSAgp3b6N3cor6mw1ke11kYrEWVk8TqEcIzVbjg2McvfwTpYk8mlGIwpUCPsrn9/kRPxj5feF6PALQmTHRv4ciqTBeElYDzySwdAbbpw08Xt/A8r08UhqMKf43LQLCxSLWvr2P1SePhH0ZdfXkwKNoaKJEPVjJhwc/ivD8pye4tbaCsYmUsi9MESfeJa6VN0R9FuuQt9jAewvDsE/75v5sGQHW5BPGS80CidJMNLWUSJktu9qCStbzwq4bbtC/Z2Im3dZinK+ZtWAoDFJP9jBJMPFVIs3ajU1XerWFNGUlSGaKbe3m98Srrdtrmf+TnBS1JtXvue9I4d5VaXai7fcNq1c78kLzD/whxrm9b/Zhc/NFhuzrfZA+KZkxQ6yrkRpxpL5TbI31aeKBYZvXymTg+sCYXbIHBj3yLq7tek1BgIiMK4nC5+vS35f3ZYwf+Zrt+xfAUlINWH9Vu4IGAAAgAElEQVQnjXdb/yhYwuI/iRWUjj89NXi/OJc8F/8ydmW9TVxR+LuzeBk7tgXBhGxgqNQAAaGK8tAHJF7oE33qn+pD+2NaqX8ApEq0qCVAgRASSENSYjsxXmbsWatz7r0z4yyo85KAYns8M3c559ssrWWgxX1KP681GEdOOK8BoYsp1KCi4j88EjMwZQZxwsFdKkLnXY8fLmYDKK0Cm1tQPJWKe4iFpHHHJzUplAZC/55GNCgzKnqdO3IlZULnNGatQDV4stdP3SB9Q7XWIoxS9oAQZtppzN4ze70skhiaZwMZot2SDKB5ZRH/PN5ANJrIgl8xB1LnaIToDfax/uolLrRW0q6cqZgV8kTl+VImPpk5Ue611N+aqSwiu5+q+FddZE75sYC5pSZarWtY2+uCfKcTuBh7fVi2AyfuYbj7BoNuG9VmC5FFTugTdgUHcuYzHNuTo7VpbZYZIiBKE1F9qQBQZmzjiY/i7Cwa179G7f0LuGtPT53R9URM17g3CjFbk+9H7D/BzvAJa4yJWn1h/jwcztkcq2iTmAe/qcxweLIj1rZlZA2AYhFD18N+p4v6TAEGG7j5PDHR5pligj619zHodjAzX2f/Cz+nQzuFNfj/joTxeDUB000hFGaC3d09RrafPX2K9Zev+ScVW/QdOW83kl4PNDKLFM2nzCQNhfqbSb7IjzlzweLP0ZRIuYExRZIaiVGTwIGFOyuruHH7FqrzZ2VsJEk22E1bxmHS5K/RWYqL6o8H8GsmmqstWMtz5KImi381CYk8JHHskCX2eNDHk98e4acffsTaH895cXWKVdlM8idsEpSP76QOsBFJXSUlaZxvLeD+9w9w+eoX+PXnXzAeuhwP2ZyfY4nAlZWrWFy6iOXlZczUagBp94W+eckUDVSfbCrKUJsD6sxTMRwnAWwhkf/2wUdGujvbH3DY7mBr463M3v+wxykLVCRTFB/RXemmkWbQcaT5ZBioxqEVwv3kcrQle2YThT/wJKV/HKBQNrkhV27UsHS5xTn8Kzeuoz57BkutS5hfWka1UUeh4nABJN2LVGwaJ7nIXHmdQIBsX5NDpvMda6W9Y8TYhzdyEfou+t0uNt++xfbGJl49f4HtrXcsO6ECgjbFVOATi6FGSJdZQlxgW2U4lRIvgLrooHkyiIOpzw+ENE/0xh438Eh+U2nUsHBpCdfu3MLd7+5j9tKiTI6Pk8wU5xTzq6MHsQDI8d+ZqWLc73HBknByBhhdsQsllMoVFMi4smPw810pEy0wZjkGARK2avlEipEUqw0vrSTD9U1sP3yM2YUHKEeCvQDoFoQK6S6cUvzr9YnplcQvoNq3N0LoBVzL2BxBKyN3aXNSTCJurLijIdOP+RpS8gzJcgxiSrgwQ19SU8mlvRvJRnpkwYrPoCDKjHZFBtLIRvoChFTx+pTIGDj0XXgDD8FBH37jE8rnaijXZ3hDlygXacBMx2OE6fVY+iVk7tuhpiYyyyNB7AYYjyboHx7CH4zZyI/pZ0Ei1xKmahX52hTNIqPUYuij3Bsi2ulg8mYDxs4esL+PCrM5SKpUZNTfJ0lhtcKyNGGXpF8OzRNExaTmbhig1+mg2Wzy3D9W+wNqSpBfBmIXRkUodszxfcbU90y9J8SJQHdiHE8yysZZ1gQwjuw3NDo9/fefl1EJ4zhVND0P/VPJLLghQxReSgDwJohcj9kTWuLI/k6BRMDLJHcZDDH8t4NwOGRpknRLl2sIf2+7iMiyMS4R6ltAoXkOfv8QgTtirb8F3XyMeA7l9Hehr5xgVLz9bguFd1torK5iEtvwCUyyA16/DeUXoYhKygFTZ9Ul7AcBYmSSGa6tcsCp6WOZEv20s8JCZ+bzeai9bSGWjt+8sMbSGwHMjoj4d4sicDlGifwHEumNZQtuGCfcrIi5+KfPFMrzhlhgLnkOnS3h7N3b6HsHGD7/E8ZkxOPT1pYAuT0Ey+XIvPJjB4O/N1GaaaBar2AkFChmRJw8ZaRpB2qdzxdOUPsxjj0z0sKfxnesxmTW+lcFi5Corsh5cAnlccXXrqR8btTzHKk9vZWpLKefX4WAck67D2YIj9mNvATHcXDu5io3APrtNjPESIZIbDArCWHGUl9fETKT3d3ZxcGLl6jduo6gXOIcdT8yEKfD4WSTzSRf1H9m3Jzmq0FrE8njhIzV4qKp05/gyfp73Dw/hzMXLsKBTLoqiRI/AwtfXsE3397Dxl9reP96B0GYKNAsgn58eV1IJCAz3DnEs0e/46vFe7Dqet4jmWkoG4o53JX3/bHc/+cZwPxvhfALZdKudeB5uXRWpJonzklxlLGL88+TyAEH+v0sxdzihAI2J5+W72pwlgybpe4/K1ypqV3MGbFLZkuSMri1/j4PGuuay2fmjXWMZi+ZBwV1TsEU6yNRDO5Y0d5pX8/ourp+UkbwmQfkhEObxNP316Z7eXQ9fYZSo0AlLc8Z6uePvDE9nbs0UZRmtfJaS88AzcDT0Yrs5yEEs+Ppbz3P5f+nmpnGGR0s0SeGqWINyDpSNgHIPDUMAvwHAAD//6xdWU/cVhT+fG3PjM0MyzAkLIECIUhpqkZNHtIkTaL2qb+zL5X6UKk/IlGX0KYRkUJQCFkIEMgEmM32eKnOOfd6zNK0UnsRAiQwXq/v+c63HBP6URF8jMKgrFM7zXqGvqGjCq0z1vQOuhAcvaBN9SQGQhaUJ+k4ZjDVlXPopegve2XeMYP8CLJTycGBYkeeD8C1B8U75/TH2sBBnyhNDTEujKfoi3qbJiPTDLO/9Bnz5C8T5cDsT0ZWQIgMAJADHjrv2NKTbZQGcIcrzAAYmarjfXMLLk4PZsHBwtPVR/jixm1U6+d5fUT7aGKalNZRkjHazs42RutjKFEsS/F6ZcawTmuKtNSSs+/LwPkLM5havIRHv6wAcYuTAMrs8JqhErRx9OEttp78iYvTy/AmxmD5ZYT9AgJM17cwn9g8KSaaZiyTmMmiJJprQM65DtCzHdSmZ3Hus+tYe/wTElAnJjI4/IkFleJJtEtJRbEFLyYAIGNtMhfEaco+AI1Gnc0SYdBMq2BwYmm3bIoyZBPCDF7ZRm1oCLvND9jbaWJxboY7rWKIQ7pnrZtPadG4i9rkHHdCVe6699+Kf+OUHLXbeLX5Eg8e3McfK4/w+28reLe9w8ZpWR7/oxkXPIlJlElAUUtxzB0UpT0eTnb36SvbVmqnP5pMHAbtbBgP/zDtY3J4HJ8vLuPuvbuYXJzj6xwctCVqxLagSuSUTXE8ITpHbb6PDrqHeNvex9ilixhdmOTIsoTjVAz08C/8rzNgc20NP3z3PdZWn6LieGzyRbrPKO5xBGbFV2g0xjA9PYtGo8H0bXqWx8fHMTp1Dje+/QYLy0vMZrl28wYbyxG4Qx0DcoC3fR8Wu9CLFMAxwJhG+01X2dJmfYMhqBYv8MMums09fHi/jxfrz7C7vYXNly9w8E4i+ijPmbr47GYeRrzAHq14vCCmTicZqJLvgJMJ24Oz7S3o7FyFXtjlWJ5SxYXjuZhoTGB2bgZLy8u4ePkypmbncGFhkZkL8HxgSMsTkr6OHKKLG/Fc7Tg+koiycD0BT/On6vhINYNHp8/pkaJJUXytFjY2NrC58Rzrq49Zv09gB3WnXSpGlYMRx0GlVKX1v3T29AJRXGdFVsLXkTKztaksFQ/tbrcwf0DAIgVMLX2C+YUFfHXvNuYWFzAzfwH+5ARQUUgd6WZIZi6O/f0/SbTpZU3sK88fgesdIOgE7CPAc7s2SSJQk6RcJTL7dCyUKzaqoctxXyG/z8RHL9bsKcCwa4Bo/xCvfl7ByK3rqF9ZRJfAGzs7ZsyVnegyqcKdRrGNGS0mWgF6Ry2e9zkrmDonLDWT7kQpiyWeqReICzlH9JYQUSFCHR16uYcSY2oTNZA02wQEJCIB8si+wq6wh3XoUgRYlhf9lmexVpKo00TRpMmGKM8HrTaDyyQHqE80uFD2a0MSK2XJfKKcgW9Equn/KqeEEcNIKKNk6Ec0/O5hB2mnB7R7wpGNlaYRaypu2UOJpAtkfEkU0G4Paq8Fa+c9ouevYL/eht1sohxJw4BSK0IyI/Z99GiRVKuiT8dCaQq0cGbtpQsn6yOIIySdAOHBISojY2zYpWyRYRCg1bdjePUKRieGGYiiRIZ+crY/TXHYPN+lSM94I5xcGJpRNGs79TdngAD/x+COepxyJGbaDcWTJ4XITTo99uboU0ec/HzilF39O2920d59hxHPY1ZccCLbmzThCRXcYhcPa7QG9/wkOuvrzP6hZ0xpL5S0wECT6G4Cn1OObXyz8hBX5+fhDZMMEdJRpIQs2g+IIZ6VDoBMbmzzS01o2gQ0UiHDsV5UwBJ1mGl/bn5Os2JSgDJSJMXngwAPBkcYAJCf+fs442PIZRSWjpC0S+KErwt/0yyTwjhlJoByM9jjPqa//hJNK8L+w4cYZ3lfkjPjcnYCHQ9Jb9oB9h4/wdL8HMYppQQWDrlJ77KzfKojNVU2MGVFfj+pgQzAxPgRuMcNsmzwf8yzqvQaX5MFUi7+Jc7VcsRAN6Q0DF1I8YfWJufSlALQVdSpp9qUjKPVYorVDNCyLXj1KupXLiHa2sJBpwUVZahC6MgqS+AmmW6GZQi7AY6ebcCp1TBau4K+Rd4wVCS72pT248V/fo/+TZWXfgQgMOvrlFil1SGOJXzT7ODBsxf4dGoWY0TLT/qcVkK1iz3k4+qtm7h251fsvP4RYTc51qw021OMqZSRRgFW769g+c5VVP1zSKmwVGLNktsha+NUaWoWahPT4dbNTsNwhmYBmO4wx81FYb4Nro8SyaQ/uU1jEnnqXGJQWxGdXAzT0/w+MNT8/JwmuvFmO9zY9XyJIGT3+yTJpdqpjnJ3nVJuzsf+ABrkyL3nQvE5UIU4QEd7HUj3m2QDUkNybRpH+rzJflMM3vFjVJoBIEwATl1gYEt+v1j/njUIQChuTxg5ert5HTrYVz4nLGMdgDDmnmOJul4fFEEdiUaXdAuT5MDPkk7IM3cVxdpT3K1FixP9riEmPoMtxGglw26l107M2hpIyPl7y8JfAAAA//9sXWlvG1UUPW9Wj+3EcZomTUuXNG3VCkGRQEJIICQWAR/4ofAjUAWiYpHYi0CU0Dbd7LRxEtuxZzwLOve+N3YKkapITTvx2G/uepaAnCepwXx3UwrpmE5TKcgdvK3MXfOdyQGazqayuUgJ77DwB0I+okitMJxHosRQ61HNpufFQ0Yo1mxW1I01YZdyPU8naIBCTSI7XDjxf4XjYuExLOQENmmhSJWd5JdVjUzgoaQICgsrWM5JbtSvVkKOHa3yTecUl8mBIhNMPIXAlQM7kVJaAvkfxUy/K2dXVWiNcdxnT+Cc4jxbVoj5kEYe2utdnL5yDr27jyCaVpXb0VX1RJiv6PB5H0//2cHVdkc2QvLB8+GuoNetdIDycPcxLl2+olBvNnjSy1h7JVeUweUHvcc8A5aWGrj0ymtY/vI2nu88RUyoKUUuyhliU8CM97F350fcfPtjpMMYWRCpqKKZJxC93DyQCI9YsGpzzov9gfyJTYxsOsOklWD16g2sb7+O7O8JQn+AaTq0qscQ+AztVkoLmxoXOXrDVAoRN3YWiFNhtFnOK/Hz5iRMRgb2YazEu9MFOzZcRqwQV5oNnOmsYDzIsL87wOHlCTa3TiObjSVnEt0R0hP8aCQDgPV0hIiTtTK3HLTSTtFPhokTMB9nRcjT4ygTnoU3jiZiH/P555/h1q1b2Nn5Rwr4xQ1tgYVuHop68K1QZ0NM5VQzQmGWCr0S5WLqCMCgwQaUlndBJM8pTxeVlRlkzmxu4vrL13HtxnVsX76A7ZfOYn15RRpobuoS8rZGE2TDkfWMp3d+AL+IdOh0PMBPD/7Ah5+8imC9o+deLMhCpSjWhYlzVoCNJQ5Oz/f2CF998SW++/pbVKnqZkRxjOHoEK0kwBtvvoK3P3gXr75+E6fXNtBa6opYX9RoCW+X29wiVoXzdncV7ZVTukkk/9DYgByorY/oVXFLbhT0I8+151mCCZu8TCwqx+MhslmKfv+JbPNHBwPc++tvHD7bE547Ye4UwqIHfyD8vACh4aRbG7eo1RHqBs8h1fzz0USebUInCWmv6l1YiTGGWO10sbl6BltXr2D7xlW8tHUeF7a3cOnaZRGtC5dWrFOCt2Bea1MALZFOYIf06rLQzcYa4MmnrUqnAmX3EUSMZ2LLlw7HYr/36N49GUSRw/9k9yGePngohbHHJAsPq4ydUUs44WxIBZJK+DVdCapCXBTEQo1iqEEm90srPyZ15X4XYoF6duucUC/Ob13E2saGUDMINT9zeh3LnQ598Oy9aXKm9olw4ILA6hO8MJB+oU8yi0Nc/ReSF5a66zg6GIuXfAU20BN4XikUMXb37VYLp7preLZ/jHw2xlJCO1C6SeQSowvpb9SA3JNPXdE2rdBH7+5dDH74BefObmBpOcCYQ4easaV5xfXEwlUvNc6zWOMwhTB4ct+L45mIV8ZxS9TwWbyxmQ5t4UG0zHQ8lAbCazQxNjmyhPD+ACG1KYqZciILLTQapUFxcCAx3y8mCPNVYLmBoNvGlHoxpETwTE5S5JNUY00czWMXX+uzA6R7R3jyeB9RuyW8emqEJO0mokbD6uNok5XZbQ8LM24yRJiSwoVELJBbXzn5butnxgIlTJS8JNDRQKkjpY9mFCA8GsF/1Ee2s4vZ/T78/jOEwkP3xcHBUDCSA6+ogbJJumAAkM4RaxHFHN3wEzmDxtJPzGiMtNdDHARodlo49oxsq9LZMY6rKRppItSepdVleHQDkvdDd9dVNf8c3bnTWkPznivd3SDAWFHgCgsDocV8YcW/Fr9q1e96i/X/m313vfqn3n8LV2PpF4GnBbNHsVaKt00ymHEOf0pNnViGQOKpbssrbv6T3Mfx3mMc3n+AcEJdjqY+ktpdqsK/Lz6LogcTyNY5ADpdJAgw6R9huN9HR2zeNFeqMnru5NcQGOYmg5JLhecDPPn+B5x6/z3kfox90mkouhuGojwCmzcc2lCdEZwHfmlV8iqNybkKhknd5an4WWXRTYE5KW4py6o818+pnBPBZcstfGC96UoEWNXWywvEixAmgrioCDe+CiTPSJgWPYIKqanQMyk2NtfRffMtTNMZhr/9goTX4PuXZydeiyAbCc4ZHGDv9je41Eqwsbkm2kNHwm12nv68H0VWFb6pBYFhdV2cxocANDjUQ2XjdKn++HaHkQvkXmHkFACt7JKkEsG/QHJUKSJotpaSAQBqPZmqmgtymzmnoI4fRFZQAyahHhSF/LwMEy/E6pWLmD6/if3eHg537qMpeVQbIqIYI6IS/BJNCrEORjj67U9sbqyJblWPv49DYRNKvHHb4EUa6klNJtRb5kUY3KJomlmoV+bib0Z1mKgrwjozUHvGHx/08N3uLi6cv4iEuYn9AEVaEePs9jW88+nHuPP77/j59h2thRdMdIV+xcVNVgqycdRP8efXv+Ktcx8hxQxT0o5Cu/WvRQ7K2sK1sKLKM7cEZJPntBxc7ektuDxYnn79660avrvPeVP4/02v9Do2/rjGHQ71ZYE4E+ZHzP35/cgTmpjQDEJF7xSWPuD7avtXujNklOc/F/7z6qbYfUVxYKmiRnI/G34ufVlfcTBACqE+176c8UYjFCRhkrSVckDKnm/fIaNIPNZ+gkAlsvNEua5xir0DEfEy0hXUoQ6xnU4c/04HBRzUW00l67wmPxcUkNUIEycEPncq3C7PqrOvl4+Ln6dC/uXccWEty29dWPE77RWJCmVPLvRzO8Bh3A29SO43MFxycZirooeMqXz+6LIgiCWxxqSmkGrFCSLA9/EvAAAA//+cnctuW1UUhv+zz82O4zhpmt6iNml6C2lRoQkzQEggHoABA8aICY/CoM+BGPAMTCoQRUhcKpqmtE3iRE3s2I6v547WWnsfH7tqVeFJlbSNHfucvfda6/+/3+FieMqDQR8ebeoiRVCyQJTLGjghHQWKyYrYhyW7Bn24rjuO0yvSDXO/iZFCFN716ecXeUUkFwtRof0Ky/EkymDsuc9lIwXgA3WvyUPBP9+BzoYXgiU0ldG2J+UxMuW0J7po0tVROeJUuASpBopFPDEgWYXL3sihSEnsya4PUzBpepNmuX+fzz52BmfWQe3KWcycryI67KKsN16p9WxtHqAD1QiPH/2B9Tt388WYVuxUA9u0QgntToelxWcrM6/M+nIwobnArDyAjUvHletruHB1FS93HmI0En+1dOmJdDpE0qxjePgCztwi++yNigC6W2meY6ysMOArVQBOZLmsKdXJC4PEgjc7j3PXt/D8xTaSoJ1zEPLXLscGLi5DWOgGCfrUcNEHDtLxkmSXGk8kkb/gXHxlEctyi4Y+oLGXMGMQVLVcQq1UQbfTR+OoibnFGfgzOnhXCUCPJmq91gmGvTacag2WKk2Qd9/scS8+DBY2RDpM8OP3P+D+d/fx9NlzBipWXImktHSzwhwniy0vbuin6cSEX/Bs4s1kZxotTiz8T1h6R5FxyldYXr2G27dvY+uDLayurLJ/vLpQhV8mwFYAOx2h12jyZJCmvDQRhJ9g1NXTW50zShnZraCP3/59jH8aB7gXDmjVYUhQkgiDw8qMBqAAucwjexJZFCEd3PruPnqtLje0ym4JdhbDKzv45tuv8cVXX+LSyjKcWpXlzxYvfB5PKjNla5OBbJDM6aN73fNZEir+Bv0uciNUX7iW2CGI5EwZ/8cv99E8OcLB4T5arSZH8TWaR6gf7KHdbCHqddE/6XBBR1OyEtFwaaOh57EVRgQXVZHAYYhnEHXEcsKxoSXYsxZPPinWySc4WaWEM/M13Nh4hz+Pzfc2WZJM9yDIA8v7imhy+ZNWJQ3eyyY62+NHOu4oM28jkgaapztuEACf6RsTVJAaOHu7ezjY3cOTPx/xn7tPd3jCH3b7bHMg2j2BzhSDJMUOwzF8KR3HteQtljvToSJJKYzCAIMwQkjFVsnF3HwNa2s3mU9wa+MWrtxY4+l+VnJZVUIHGI4hTBMmDo+ScILoiymOmFVsgrzlQ6xbDly/gpnqPJR/BCug2NCRBi+Jn5cOE0TA9ykTfxgiIeiob/NaE0QZAk4+YdoVlL47lfYxU4Z6/cFDXLqzgcrGFYaV0nCbPbdWmtO5DJ8D+pDDU49hiF6jjVFngCxI4HplXp9NRjM3c4YR4s4p4m4PDgEB9d6U+S5A06lM6PoMahoMkUa6uCAZt20hoqYVFcFBiNLyEizHg13xMKC1gSZImheR6f0nn+rzWuLJvR+nCHt9YAiEp6foe45cX7Ro6wYA2ZiksBeAGi9e9HfMOrH5+6QOkdSZWGwBrsfWMD64EqU/TOAHIbKTDqL6EQY7T5AdHsE66aMSc8AhfPJYl23EtofYLSGmCQmpN2joQGuRJ01wJ1JiV0hkimuTvzuKkPT6iPpdIlBKskcqNHJqmlKUKhEJSdp65twS0jjlAi+/FqfBhxMKOD25MbuNhZxN9H9x/m/iCbzukR/nlWzSfEajzyWSpl3QG8AahZyqQL8fxbnyYZMaUtRcSYDguI1u/SWcUQSXgSIEAXblXMODEJcLReNDzzheUTF81ZutonzpssTOJj0upIqxaGbv4ujLLGOoZjII0H68jdLVNdRurqOX6FhNJUA5ep0EU2Z1hP5ZypLrlvkZJg1KpymxostI4QvnMrI+WNNripHsZulEI4UnxLZkjcvByRI2BV0zttisUv36bGtcdDFEkIC+1OxQFhpxhMWL53H5o49x2Ouj8/wZZuOIAYtItadX/07kg6cVP6rXsf/Lrzj7+aeIqrNc6IRKCg5oq19a8CDm0X268DdfRtZYgZSw4koYAHx21pn/rl+GRbYZem9VqmGK+hybZvmZLNPX1Ng9JvT+omQ7NEBsUvVSU2kUIMxkskqKjNBz0bOAufVrWHhRR+vgGINRgHnlwWUlkEAByf7ka3ti57iNw59/x8pnVSwsLaCRhLweeZ4AEs1w5U08GKkZ3v7+UVpcYrgZzFCxFA5P+3jwaBubSzXMlxY1t0sPpJTC+tY9bH7yIbb/3sGwE3DzvxjFySR73Tz2Y+Cvnx7i5vvvYu7uMqfOxMzdkaa9iaaUoeK4IejkMX3JOJbbQO8K8vei1WhC3WwirKcjMl+j0kZB5ax0oV98GNCeaShwGpx+bqrvKD2A6hOuvVIZCNO/pVpt0qM/5rSN1STy2g0Iz+GGTMgTblYZulKUMxyZCmHb8A6kwcHJbXbhHs8teaJCML+XKeiN5Zv+n3k/Wd0+pdUuql5Yaq8HymKLoPhEAVhTQc7pWXof4PqY3ivuWY4n93S/sT1BJz1xU4NgiLbNDWphDnjC5dIDdx46u9QQkZQ2+tokNhhVhihEZFBsmkHmZwPAfwAAAP//lF1ZbxtVFP7unbHH47jGSZSmNIUEkrZR6EKhoggkXnjnDyB+U8Uv4o3mBSgVSK0CbdLEcewsjuN1PBs659w7HjspAktRozSLZ7v3nPNtLpsDhJLfSPR5PghzwliDVZDICJuLGAQj/pwuqCCOJpuR6elyc2hGF8JJ0+lIAz3V3OV1GkZbYocBkxs1NQdvLqDjTG2IQiVJTS6/fNjcRysXEA8U87e0TD54gkM50OxiG136m/lIDXuB4IhDJTstJimCaCy6FKeYGTDMmh5yD6Ic084bs0Mdwa+V2Qdgfu0GTppdRgZjpkCprAhzpMzG4f5bDPrn8BaWhKKlJS4powkpajB6ODo6Yprmux7gK18KWFyq4u7mOl5tX4MaEo1uYPS1mvV5anSGxs4fWN14xEVtTlI3hb5JfzVpRsSYjjKVLVop7uHauMtyAsRcDZVbW0BtFWjuo4iuMWCDnWmaGaqgKINxgk4/QMX14LlmYY1SbsJarRbmFyEPr/sAACAASURBVBaYUp2/lledDZqyWR+AajXAaeccBwcHuLm2jIJXkgI7+x0Jht0+2o0j1JZXeIOKlTvl5v9/XnTcjUYdT5/+iNd/7/JRlglIIfYLb3hWNymFZJjb2GyRMPGAlXqFs+GjhFFdMqckZG7p5g3ce/wI9x9/htuE8q+vc6OpSC9Ozxk1+IMeOc4h7Iw5ltet+OziSxID5QnThJo7KuoYIVEJTsmQsH6IZ292UA+G2Gs0TaVUzCQnKkMqLnNc5ZpobhwJJaQmm7wFXBThc88e4fMvv8B3P3yPlc27kklOwz7Sd1LjzwiHMylKUkL3InPvkedBCAu/JqZ1DoYDnB630Tk55Ui6i/Y5U9pbh3U06gcY9C7Qbp+h1+vy8yU6rJgXb9aHUhPg+Zjza1xIB3GC3sUQcdTHcBDDK/riWMtGdQ76gyEiklsQPTYcwq/4+GTrPh4+/hR3HtzD+uYdrG2so1ipAk7ZwBaJUBPcouEISLZtapSiifkacveCnOwJesHpFWY8JH79Y6b0k0/I2zei4a+/3kNrv47mQR2DTheamq0w4lPms7FOGZqGnSPjAe3wGeXfFhqtYGw2PN4z6GtDQusS1op/tLWBu/e2mNFwe3MDt1ZX8d7CvCDLNM2PxlJYMTspQRqZGCRHcnFnJWfsJ6ImbvrZYae5/8+dj1mEFmaNJHlFpVZhBgnFrEaBw5nH7IlBhaxX5IKEMvGH7QsultkdvpxiFA3RJ01nqnI4r9C+KUOdWAD9V7uo//wLah8ucn5/nwobbUxXyOvGNkGGJcYa4yDFRauNPpknjiUNgii4dC8FqTDzJDd/zFnh45MzuKQHdAvsJ0NO9/raNYTUkDFNsojY6UKTkSAh7nRuIzMlHveQjlPW1DvDGKXFCsvRQt/FmFgyxgaAKPlU23h2z/UcY96oyN6M5RJ0b/M3M8vMmTzrkcTvZQuUS8fgSyxVJNn6EbEBHMnQdkol3lM8fw4+HU8QcsRf/LaJ3s4eksMG0mYLxdGY4yrJq4Ge/4gaFMoip7/leuxGzx8Fzeaf5CLPoy9CSRMxatOxy0UWDVaGvYFkuVdGSDmTOja6ZsXeEPRcUM9P6Klfq0GXPWYOxqbhimcWtXw5zEOfNM6o7vae/X9jq+nXVUOAvKRk9j1M3fuMaIXAKERIEZMU+RdG4hHC8s2AqblMz40TzOkiNDFl9lvoH55gTiUm5ljWU8Xot2YqNjEwmNHGjaNCTOiVLmCsCvA/WEF8dozwOELJovTZmbNDNEHmCyriQRrO2zh+/hxri8vwq/MYmAqA6zpjtiiaaIlwtJdBvP5cQ0nPNfw6U19PU+3tuZEIqWzfohWP4qGzZioVmnliPZ94IOBCuXLMNGBWZBrs6GwikW17PA0Xg7sgSdHxPPirK1j66gnqgz7Co2MEtDcYAUls13DGkoW63Xm9i8pf+6jcWUfVK6OtYkNBpm/2xIhuRseerY8255+Gd6ywcZBQ7WokC2RYSFp/GvjT2hdliK/O7i9lvBUnLvGXTb2vKoEkfUuYVwSYkWGzCl0GFSg8kFDc5VvXceP+JoKXbxDsHXBTV2S0OJZTG5tnWAN+nKK738TZi5coPXnI6zit+xSNyjveTC2m09xA5F9eUx4cagK8wDbNsHJNJQwgGnJB4c/dPfz28ftYuV3FGrRJcxBwrHZ9CV9/+w1ePNvG9k+/o4j0HWdJWLz9xgg727/iwUoVpeUyRrQvGqZgqi6vGoyy2/6MqfjGZC5GJrmebeRtU0vHRHscDdtj86H1f4ew7LW1/VRi2APWhN16A8DUzbYfsiZ0DO4arzdtGt6rTOJtCpF973kXfJv3bxMRsh6TB1FO9jn1n1bjb99H3lgvzYDZ/LkVVJ36g/zP8NVlgIviD2euiRl+MNMxY8MQ+DNJl6AXvV871GCZvPFbIIma+NyR5EYa/mQsx2l/Rhz+BYi3hrwTQ0cBrq35p0jxpbnneEVi8pqBCb1/+Vf62yiK8A9jV9bbxBWFvzszHk/sEAcCJFCS1GYJhD4UtSqFUlV972+u+tBSqUKtSoVUSsWSuDgOWRwviePZqu+ce8eTFCgjRcpix+PxuXPP8i0Bg0AvuCfwIAZHncJ8ok7sFar3znqgzDURwYkgKGATeT4NNHfw8e6EmFg738Liwy5N6FF6PAOJHQ+qiQeidhhPP0QGuO8m7VMBExEzDFWkUD3I1b7JHWwy+EWTICuUNcVuTfzNM5vg6s9FMHq6XSWygKryfP6eghZ5Zr352ZlK4mIrLpAAhdCEdipjgTAZsQJcWW+h8+iZ5FHO53W6qflyc9/Z28Lr9ktcX7iI1EZTmfvFIKAjbaezhbX1WwXEp4jPLC8gQV6eF9xsF8ZzDaB5fRVRvYH9gx1ElSmvn9PY4GgPG3/8gkv3v0Pm1QR+Bc9x00swKgtpKYpumygFhSCJ/bsVK+G1nHgB5lfXMLdyCztbj9S+Cm5Dy7UbnAd67W1joH+YoDETSlLBt5oLLcTHYDCQ6Sb54u87yp070lQozDbXmEV/0JMiMJy5gJoolhvtKh+z6VPFm81NLF5ZRe3CJe0snhJHKd9E3ncw1rvdLXS3t+VRvE8Y4WolAiuuwHNsCe3kOyoApkXQtLb2MKY1XwYsLS2h2byKL+7exef3v8TH16+K4n3KQp6ccUuf4TqqRIF4rdOakqPz6Pw8jnZiUJBVNh/jS7HDDZ9FECfrmRUf7Ozu4ml7E69GR6CPxfN2B/FRgkrN3YDfz6EqX680Js3IR2Q08ZgkFP2bYPGjcwjqIY45qYh1jYZW1GuSpNPodUq51lxsGtUZDva3sbG5ie4mXRSGaL9qy6S7/eIVert76O/uC0S/YuG5RdwaVabmZ+7lofCrOBVJY8XNSLNUOJEqtlQ/U5Ok/2g4FNsVrnFyppsry1hevYIH3zzAamsFrbUbWFhaVJKoU4+GL64KjHHtoDu+moo80o4LtvklHWtMY9cdDs6p1NMcQzYzevtotzew9bqDJ48fo9vuoLuxgeP+ECkpCYy13GDGBOLdH3o6SSHfrlAJF/ROJg281HbU+VqD0UCbG2EosbFweVFoJDfX19G80ZLmxplzZ1E/NyeTsjQZ0ztWGsdmoh3yIicy9h25kPiPJtNJG70CfXTqOE0DOPEfrGo/X5b0EhUDrIq/MzdGTf4t/y6soDY7Kz7X5KAT/UB/8sifiAgfkzOxc4ImhIy6iMUmN9mDQ7x4+Ajrd29jfu4axgSiUMTPWBGi1LkuGGVkJBlGB4cY7vaFe13xImkkaYxPZAIGhzobHCA76CFKbMM78IQP7EXKPU3Jl2aBLhoTEO0FTtZxFGKcjjRZYKJ2OMF4Yxt5b4BwtIBwcQEzi/M4ooVgRR1c4nEqk9ZjX+lkiiP21elHpjsVuQZib0utA6FKWd9oC6/OrIWa8L6dMLCNKWlwWQ4xqUZzpor6JIcZDZG92UX/2XOMX7aR/LONmcNjRBQ2pAaDLewzE4ivv/CvmUCJ0r8RRfbMTmuLgsUqoJtUVbYNFNVFOt5h/0BgdEH9PDwR2MolWQqJ9iM9aX+IrXGMi0RnYR5hVJXr7kYU5YkYSrxjz1KycrvX5sY5B71b4f9Djg9BAhT7Q16iKDDpI1InTnHYH4kIYy2KZP2S7iX5H/cG5jxJjrox6HX30HvVQcOrws8nlrqlopPcdDOiQwP7PQcfTCYDz9rseejxNRt1+MvL4u5QpTUY9XNkPdp7jM1EssxII6KaJZiZxNj7628MVppofPoZjj1fbTWhiL8kUTtfEYU1+VTbxBhbw3uFAJpXTPL9E0KVXokC4Ah6ee4KPifu7BU5Up5ZQS7fqf0r8oHFvTgsBnmhoq92axZtZsXVBCkZGgwo3JsmON9axcV797D//Q8Id1OEmDYyXJ7EnJXFIdFYL3/8Ga16DZdvtISmwgYVtXZS4zQR1T5amjClvDD2rG0p14ena4Nf1NjiOgqq2jCjSFvOQRhVwzlIyKY2hd474rWM9pQ1XtbAKhfiIlKXqJNunAjdShAJXgX1oIqFa01kd+5g400fw96OUJvCQJFCvl2raXaMOnniCdD9/U/Mn51FdLOFRmMWPbrlsMFYyjrcmvs/RMDp92PeUaSb0nrKrVbJznCEn54+w+2VZSxRp8iz1sqMOVNFc20NX337NZ789hjjvooJmrfYYvKc6x7w5OGvWPqkictza4iNsc0LZgDJW1uHDgFAurQr+uEK/VOfmePa5xaNO1WR99Vi73TDvSymnp0UKU3Lum7M2ajB5tBiha26+txzX4jtEJi1HAtaNh+qVZ3cx0TvBsGJazJFiGcn0AlFw0HyUIXj83+Vp/tOm6B8Xw6Ey5sVAomnr43j7ruakk5E6hCi506Ut4gd2vfmCvKT8aFaCyGRqaV1IOcqtHfrCGfFC1nIi8MX81gBoJHmbJsc7JNb1wC1JbUNDfsc7rMFMkEG7azLOYTW+juaiTCmRhCOpc4WmH/FE/S+CkSqlaMi7H1kWYZ/AQAA//+EXVlvG1UU/mbuLB7bWWicpEnqJGVpGyilVYWAvvHC362QEC88IVIVHqoGqhapUkNpEuJsThwvs3lm0Dnn3vE4VGKkvjipPZ65uXPOd77FMYgIT7P1pmma/elF5/DNBV9Yhy8OLwhM0Chbu1JWLzQ3S5pu4bju1INMdDhVF2qd51+JvFCaeWAQJoNulTIANaGNSErARJMkqG0+MfSjcyezDY0kcTalmkgPJoyFyfSfQAi6YMb1kq6TaGmE5QBtgEXGiNAu5ZyVSZrNKILvB/q9xEnc8hUG6RD+tTqutVtYubmG85cHnB1KG02tukC1idvLFzu4+eldqGBGm+tZZX4rO1Eq0TEedTpYo8gsvWjodqZab2lAgOmRbIFGYGF9fQUrmx/icO8dfDeF4zmsUwoIuMlGiC4PEZ91MLvUhrH7kIe4Vb6dsFKVIPMwkYYyGagiqynk4Uylf2grNOaWsHjnAU7++BFFRC3lJQzJzFDJdXiNSFJDYBmiC6QitOnUkJFZVxih1z3H/EyT3fqRCZsln4I7ZGNT7AVA+iig0aRYNR+H3Qsc7HfQWl7k3G1uGDyFplvDiB6SwwH6xx3U5+ZhBQ7TKknPRPe3elz1AKhq+vlMKP/dD5h90D0foE7rR2egS0tosREjTQhTiP5a/q/D6RBm06Fj85NbePDoK2w9/AJfPvoa7Y1NnlhNbVDEWKBNxQDdnsNMg8LWhY9VIIlDLmjIMI9zoqNCMpjJ5HOmgVE45D3h5PgML16/wat37zAAMATw62/P8NfuHm4tbcgsIzcReaYxd6Yol+x1USR8LRZm5zDv10Ay/pDjicBmj+eDC8mWJUMXVePvm2RxaWpD0hulxMyEKZpis1m64OfDPnaebOOHx98jvugj6g1wfHTEYFh/0BfqMYF5bA4acPFLlEJOIiEPjCSRYj9OODeegCxCXi/7lxiFI2742G+E9hNfMtNv39/C2uY6pxGstG9g695dXG+vww1m2E2ZN/qphSLTQnbxNRMoY6yqRB/H1F2aYnLMjge74rhr6Qdyr99j+cvJQQd/v9nlfwRynB51cEFpBIOQJR2E9VC2OWd/5w6/Rg+cURghZymDxPFYPBlSiOk6Ox7npROtn9IE7MBH6+N1TiS4fW+Ldfy37txBa2kRrdaCNui2yhMkvSMtVXL+tw0zxxhYFcUUnT8vtYZT81QpgioAwfvgpatMpOm/R2IpUFauqxv8BrqUd04SB1dor9EgYn8N0sFaUYr5xRbOKO4uGsOrO2iOPQz7KSL6ex87vPfkvCpFGkHjF4p1PNp9i7OnO/hofRUXMw6iOQ9hnuuIK5snyvTMSYYJgzGjbh8O0dqJdeEqbTgrRVONzKIcD1avL9KcbhfWaIAaT6IzeDOzyBs1pBTNxZNXj/OiudghTbwbonBCqEyhiEOmWI/jEF7gMsBNgEx41kPQW4a90MQHiwtIaoob/5iMgxh0kulakUpxRIAAxfFNPP7EjyRO3ueYL5RKYsVQugmnVNgy9aV1N1uro5nZcM9jpAf7GL49wMXuW2T/dFgCUKMCrBCNOslJKLKPps6crsCuywoZyQSLTGRO5CHgu9zwWMrWe4+ZVFkl5ZOuqcoTlrswW2DUgJPWSXjM6yPnfSBlDh7pcAdnPb7T7jULTr0mkWi0KjUaxcU9JmlJmY71vXpFShDgPaBxaepVkTOWP6vUUlVK738OnfevNHWY71smCRNJlCC5DGHFGWquB0+5UstxrOeYqdd1VYOfxbjcO0T39R78ONeDD4tNVD1XMQMr1lN7znn3fThewFIzYolxehOt4cxCNy6w1N7A+KSL4f4+sqQP38DmZRkiqT6FTtSYI2A0SXG6s4P22g3UaY2TyVhhVHlmUp/rySXbj+rm3ewl9sR4WVP3FSpNf0l/1o1CYb+39bNKeq4eeOmm2HFtDSzppAd7kqVfrnxLYvZscToUVqPKubIZz9Swcv8zLPSHOP7lCYpwgIYBXfW3Y6gqzxHQ8+D0FPs/b6Nd97F2vQXlWQgdB316PlpiaJwVGoBwRLfPC42wO0o8agT8e54vgC0xtnJLBip8E7RJNtWzLJOBNGFOpoHxfMKipMaoWpuLvnnSOltaPsx1T6Y161qSwPLBNMH8/Czfs/44weL1FlYfPkDYOcfZ020EVKqOI82KsHU8seJoSo8cz+MUvZ1XmJ1tsk9Ho9FAxAwHW3MmxUXLjAL+jwnAzaMZuLGfQTEVgccGubkwmiOuCRTH2pHz0u8Hx9imWMDP76MGB772hKLvPLe0hG+++xY7z5/jp8dP4Au0VAJO5fvLLBAXnRR/bj/D8sYq/NUm72l0Lx2/jiQdMStxMj1OeYhjDqoZ6DyJ0UqvU+1rmt28kMh0Ai7YMI+TZbJy6s89H30Oe75FFRl2xpp1Vv7o6TtH0ToyfaY1YEAI25ZhMF07o+OHBhJMZB71Iq4e4IiOXbE5YPV7XD0UDw+y0hzPMdGgNHjl75roeLwxM7mpDhxnWfn3nRVSH9GQr9CRiFeHo1XZNkdWE9DnOiwpNq/Te0vevjxbTVNuzsscDHRkMqE37APupysseAMkGJDSpAOYPcOAH8YIkA6OCab6TwMFk8+j5J9JJCP9jDwPzL5G5xDUA8Tk0WA+iwEOkVEwk8Ky8C8AAAD//5xd60/bVhT/+RXnySOkQIBAq3awVnRbi/ph2rrt29R/eZqmTZu0SetEO/WxDjZoaYFSCiEvx3ZsT+fcc20TDT7UVVUpjRLn2r73nt/5PWwahCxawOSN8YjzJJ00+1nT4iH5noaAAOzYqNFTGXhHDAJpk86TAczUpE8X+HEOmTLNrOjn7ntO368HNs53mi0jHSydWalREXPMwVEjknm5gTYEzFP26aITQjkeEajprlT8a4qFngA1NcM0x0xlBMmBSBaisbYWbYYtKQiKMzXMzDdw8vwN37AlR21Asg2t6mzu/PMC7fYx6uVq9j0GUnoLPax0g+/t7aG5tIiiawgliMZZTUpxblxTCqNBr1uYm29g5foqnm0+4tgvS4AZMsFxoyH8wRnebj9FubUKo1ZFJA+BmW64ZZKwMl8AvullIUxkIVF6rVjAGovpVLSYTV67genWGvzdY8qXg5WEKaqb0vVUIjsDEO2ej6mahYor4BDV++EI3bMzjKKmGNXEKsM1f0JGfvFXRX615qLWr+C4V8Dbt0fodvuw7SqckqPG0DZV5ncQovfuCI1WC4ZbYGorSzb+L2/2koO+e2Ghidvr63jz6iB1Ys+uuKCB1GkYUUSamoTpeZyensX6+jq++OpL3LlzByura6g1GzCqZW5xjviP2gxaif60S87FUJsE+hLu/NPzX1CoMBlxEc3W74Q8mfQ7fezvH+Lv3V0cewOEMrft7b/Hd9//iKu373L0liWo60WHAhmVKZ1bLGKptYBqtciUelqo/Ah4vr2Fl7tbmFtZUptKfe0ohs8mto1GSSMMfQ/+YIBBrwvf8zAzOYladQIHu3t4+PMvOHn1DgszUxwhRAU1dVFTt2c6hgPVgSK9FYF1NJUUizyp9oguaxGFyleLZcFGfeIKpqfrWFxcxPRMHcvXVzC/vMSU90ZzDrMLTaWToXEUu7gEdurlcK5bnaOt69cZ5Y0CdQ+YOvJGEHyif0Yxgv6ADftebG/h0dPH2NnZwZvdl+xVYIUxQm+ICskRRjEqsaHMPanADBXApDY26gupIODOkXRLT7pnbOBHxjTl6gQac/O40VrCx7dvYnn1Oq6ufYR6cw5XFma5U06FBJu3QnlrGOlvUW7V4wkE+fxriLgBGPeMyL//0sfp8v/nOFJtwxQzBZUYAMVKGb1Blz0agoF0RCwFM1IRSN4Fw34f3eNTNqMiILBYSlAaxkztD0kPKudviSqDluxiNMLr3x6i9dk66htr6A0jlsATPZ8Irawr9Tym/XvtDnfAbUN1SzgpRbol7DpOfwMf0fsT2KThJ+CJNiGULUyFRMFE4ioTTEouIBAnDm2YFSC0VISXU3KR+DaSgYqsNenzqIsximAHPv92Anfc3hQKvRCVK1MoT5bgFQz4BYMjq1jWL9pNWme5c6hxX8O8sJjV15iNtEy1caJ7rlGbYI251fMRHBzh8BlRgPe5418mCUDfhyNGxFzUkMaTin+hL7N+UuLd6D2mbSBybRiuw+epM8v1ipEBSqbSijNLwuF1PBoOEVIiwEQJZtVVrAoCEmI7Vdb43YHE4wXMbLEIBBCjHOVcnjl887qaSBfKyF4/59T+gV4A527rMSBA6+l1t5IDHihBIlDafr/TV54WZCpKchGSMXkeApKJxKrb7IQJwnYXp9uvYHWHbE7JTi1EgSYYmtgWEjHHaxPNywTAMFFFeV2oQthi0H/k2ujFESrNRfinHRRilY6SB+OTrH+g/AAioGYmONjfR/vJE9Q3NjCyHPgSlWskccp+1EW39MNSrXaUgorqqbfTYlUzFS19o8q7LjJAk86ifkG6/JGtfC+4+IcigmVyg9x8lChX/YSbVwr8HVLD03HRcYuY3fgU5fYpzjY3YQw9lv4V0rtO9tIIUA5HGBy+xu4PP2D+/n1MLs7BiwJ4gYfYNuCUCnAoRtZVhtjEgGUpGJ0XSzUsZrBRZ5kjYU29X5f5NzLOMU+N1KdErREfoHJM9+78eZaZZuB73hCFwQDVUplTOjpxiNmry1i4+wna/26hd3iAmmEzqJiI7w1kbSDGGgH2/tExjn7fRPObe3BKZd7bRjkW3Dk2gJEfzYuPy5g1Jq//IxRpL8TpECYzYU79AD/9+RfuNZcw01hknzJKMaDnpeDUce3WLXz97QM8/vUZ+kcdESOOfbYsUZTQsvPHFlqrT3DzwecYkZM7a7pDuEWHGzjsZ8YNgfhc05Q9tShtJwilayygp0DUkD0XNZxoD2MIeuuwhj4UBpDeF6vPNsWJX3W9VeKMBRUlSYU/m8yJmTSfl9SICRe9Ai5K0a5l0rrJTFdENU9H6l9de+b08DoRhmPm4yRzthctfb47z4DfuTSDbGxS5oCkwI2zAPL+A2l8JUU2C6Mt/35V39BanXkt6FhMfbAUQKQJGUgmjWzR7auak1gGmSce1Zg0p2qjRAbghIWgmMqOSjgIKBFBXWs6CGyIeI5XRoH0e7REgfcRhvJZoOuhDQXVdSHGAGAYBv4DAAD//5RdW28bRRT+drxeX+JLnKRNSkLTNE0vEkGtgCLUIFARUl955wUB/wrxwF8AHooQpQL6gJBKUSUKoU2jqLnYsePGjp31emfROWdmvXZcKixFSmwnzu7OzM75zndhE0B6EwwipCRvjAcB9b5CPTACVGOcZkWzLe9hyihRQDIeZ8bzSe/rFxZFlm5P+K/ExY3QVxLAwsuo1fY9o5N5VLMhaFQ6lgBESrQorPEg10Q3ZcwaJMZEYlHUkIkh4kIG8cZt8HmcMWH0JCrWdsVenSoSSpoXYWqmgtn5M9ib3kSn3uQL7jlWkyMYEFHPWodNVHe3UTx9Rq4FG8UpoaBmxceg1W5zJ5AmCptrGDBT9kJi9hOZPLkkE4CkueXyBFaurOLe1F00t5/BM46WrnHZibotVNcf4sqND3GEPAMANoXAOvOGPTuRxQhJIgEjTkkQpEkx390xGydoUbn3vQilM3OYXVnFo437jKaS2tQ629vlzIFjVdBoto8R5PMc8UFUdjpGOu1kbkZflckSb/b7Y3I3k2OFEw2IdpZxeYEkL4Cd7V0Ui8vinGxygakQg++jubeD5kEVFaIJexPiwPs/H/S55UoFa2vv4u7tO7zRT9LXjqi/SBGEEXDz1i0UTk/h3KWLWF4+z7Fw55aX4FAagckb70HMwhTfYAzVKLJZD8MOt0jc3E1SouQ/k/aaaFtunwEAdr2OUtC+i2wxj6hTREPXUN8/QK19iA75U2iXy9pOF/j2m9v46ONPML+4JAwA/sxBtzpK6NR5LDKYpqFyHq6+dQ2rV19D/aff2MiPlraNp9v46ssvUJkp48Ll11m3rYxGvh90cFA7wM6zLdR29/B4/QkXwI39fT7+62++jU8/+xyVUpmLq7AHNBrPUS5opvfSc25k5pZyYrkRjdPwmP5+yAtqsVBGhfLjZ0rITpU5go+K+4WlRXazn1tYQHlmmot+6qzA6B0jNp4yG1bOeNd8rHpoHRihJyboin2Ybgx/T8CDj8N6Axt//8NxfI/+eIjN9cfsYUAbeIoQZE0d3eSgMOFlOds9S5GepN8OjAmgLzeNvtn82fWN5g9FEHYCH+lcFlMLcoxLF5Zx7uIFLF4SRsOpuTlhB9gMbOoihQEzf1LWgMuRwTU4Ns1Fr5MEouIgf7sBxxBQcFKROHrPGZ3To68PkHnWwBrwJEWgmJtCYaKEcmUKnYMD0UJDkjO4cNTWvLCITruEw0aTU8RUTiEbeUJT1pqplx6v4hH3JBPgQQAAIABJREFUFgMDflDefG+nhvUffsHy5WVkiU6eFsdq6pB0KVbvWZXzrylmL5/LcVeJumjUcXdCyWd3udIIER624VTrSD0/REg6WttapoKfWFp5F05OTC2dvosoTLHkoE8nkQr4tAMvXxBnaS8F3XGguxGDmfB78IIe/F4P/cMO/GoTqjaJ9MwkJibzyEzmcOy5CLJ59A19OFTSEYMj2lx6kNty8jHUCY00igSWEvWTvIRoDO7W0d9rYv+vDXS3qujVmnBaHWT9gGnBRE3nw0/Lhit0pfiXwt7hwp+MdDnnPZWCS/eUDGWyuxJDZ0AAcZ0X0IdZiY6wqAgU8yiGk1hRtDnt+jjar8MJJ1CYn0WLItqUiY4z3hshgTZ1GaFZXUSWspddFUu0IpMEoJyTnX/EWnK7/Im0ang825/H9qLHPGdeYUDfdCoJZDEO+Tzfe5od2IlGTkBANpOW4t90h3Qv4HSGfCaHDDT8ehXdzV2E+00UtIAr3C100nxPF3d51+Tfe0wjp6/YdT3BdIMjXgDHaYXMzDRyS6+i82AfBerA0ZoR693tyZGfaR7SMRTgoPHgPmbPnoU3nz+hU2aTL2W7/tbgyx02OjOApu0Anyjx4nGaKDySL1u2gX3aAACRue6DNc5YN0e2KTXySY4n/khKClUC3GqU2vHKKUzfXEN4UEP4dBP6OBjqEttVjng9bq+N+vpj1D0PpQ/WUJ6dgk8+IykbBao4sYLmZCqbEQCAOp/EDgiDmMZN4yIdpeIhp2KJlHF7Z9bCQEceH+FILjtGpJT4jyI6KdGlNa3TaiOtUshnXHR1AF2exMIb19DeeIont79HLog4btiVmYfAxEnTWMxohVIAPN/aQevPdRQzOaTL0+ipkXQNwz51MH4+Jo9jyEhcj4+VtSBfOlRGkpxBT0fYarTw86N1LN04hRUnI5r9SCFAF+liBdffex/vrP2KH7/+ThJdaG1K1COaY5hlKDpHwO937uHs6gry5+egvRR87bMxN7nWU2OFi/YgSPy2RDxrBgiodvGYEm6vB41HSiijus4yl6meo7qs0+0mmqxhbF4HUwxbU7uXPULjl2Yl4XTGbSPVatZdU1D3DQDIRsLm/1WJ+kkb6rzVxjPAENH/KzUFA49jxlncAB4pupFg/Iy7/tJ0NoBK4rqMjvEXPSzQe8L7zfjJJFmOEqk48DOIJRYs+ZAO/rj6mgABOm/E9OEaeSTGns+VYbML2DKQJlM9yUyIOJEgMRfpPVGEf2m7st4mrij83Zmxx3YcOysBQgIEmgKtKFK6QyXUqhIPVKrUv9DXSv1TlfoLKvWxfaGhQFm6oDQIQhriJI7j4G3s2dA599zx2A5VX2oJiRgyXubOnXPOtzlW6gnzBTK9P9BmDX7YHXhBm3X0tiym0cuLThg3/ebF0l+kUEqSqYpIBpTEcozSIeKRDZpjI4wJIJkrOXoqFIXRyOJgE0M1iOhrqYKwGUKt2aXP48sEzUyFdHEcsNlrYigo7pYGqdHHG10kfXlCKoNbDKBI40RTm67vITdmo3hqCqWFWTRf1hFLKkyUcu2n1yJWxcaTJ1i68BabhkUSwWHLa1ETQwu52Wii02pzvJ8vjAYlhrV042K3SjVodOJ5IedfL198EydPn0b1n/vMCqAYKjaYc2K4vofgsIKovo3M5Ayj8DreY8jdl6eHKkkps2QKnuiK5YJkN1CZjlNx2bQclE5fhDO7BH97Bw48mfvGAx4OSpTx7SBCx4/YXdZNMSGIxnxQO0C5XOZYENp0naHiIU6SCfRJocKo4GZRLo5jr1rD7k4Vi6fm0aMc6Ay9v4iRzlBF6HotpuMWp4/DIaKanf9XhJ01zml0P9aULXIk/+TT6zj33fd4+udjqYE0AukqB82YNMc2MuUxfP3tNzh/+bJmulATIBIWLaMQ2hprUCNkSN8YhQkdUt+Q4teiTpbQKmO5CfJCkbVEtnyErFlEMcrkEfZ81Gs1eJQuwEyMQMfbIcajh3/g3uoqjs8dY7RT34ytI5o1+VokXYO6w+Url7By9X3c/vU+2l7ARZLfjfHTjz+zk/nNL7/C0rk3GOFvHtaxu/MCW883cP/BPfz9eB3ddoCeB1BPQx/h91/u4LOr17Dy3gd4Z+VdVLd+YLpwxw+Yzk8mZGTM6SgdNZor5JErFDBZKiGfH2PEe6I0icXFs8iOFzAxP4tjC/MoT8+gND0Jd6KkF5y4oEfpIoP2B46ulBucJfKHOBpoU4e1iQn6HQPtRoPX8cbGM6yvr+G3u/eSHH428OqSK7eNfCaLopNFZDmM7Pmcu2+zlpN9WcI+4ZDWQSD6uFa7xX/nWMLIx9TsFE7OUfTgEs5fWMby25dw6uwZTM/MwC2PAXlXYqR0tFUs8TR0aKbXhaaBiTGM7nFj8hpkP32N/F8PLf2yk/Vv0LnSeAnNYhlNNuBR3PBxDCR0vA9RvYuT48jt5dAm7wIbKJBvRqjQ8bvoqIjNOYevKo74e9nF5p2HmHn4GMc/voJKaHGR1260UN2q4LCyhyxN5kl/RIi0nWFdv0P3L/lD7tkueY80e+jU6lCttkZI3Sx6HW3qxQZk1IRldaPMDnxZ3ui1YS0FvDt6MKpUgderMk0yFZWexQaXZdtFTD4bBy0E7R5au1XYk+MsC7DK43AnpnjARQgjMQ3AJnw6vp8aDtdOSe6g9c/G7DBDe12jhaDVZKPaVqWK5kYF0fY+UD2ETYMUosHaDps0khkl7x/EFnTJNdzm9U2fz5JmjijYIUex2fx+FP2eDCiSxizRAGtNOCOETiz1gHaUZ2kEaeMbXTazoyFo0CH5m9b566G/YqkMSa8ohYRYG1zo0rCtWNBsp7TRbBwNDAHMwH1kyR8BVKSNr9IPI208qhi1UvpkOg18Kvy43/y32uzCTiwfYsNRvUTeFj4jgTFr/vNE0TjswKvso1vZQ6YXccHOZnGR8TfQA81IqP8EALDsgopTaj5omAttEquZWprp5zsKjZyNsfmTsPaqqG8+QUnpsUoiSUtKQx3rR9dGme5DzTae37qFE1/MgQJsG+RLMXQ/Mci1kmG4yb6PBcDQ9ac1sMcM770mldu43sephj/9/5UMZbl+lRhbGB1x2pMlZZJmPp9maGjepZPPoesF2Ag8XFqcw8K1q9h62YLaqSEbSnOn+nUVz/LCGGUE2F1bR92xcP7m58geK2EHIQ4J2adzwrGMFl+TEcsTQkmBCBFlsvw+2BDQHFuJLYfUkrH8bF7bMC1GtPRHqU9SEpaRf7PUQLQbDa29TAeB44KEgLVeE4WJIpY++hD7T5/De/QXXE4f6YwMg+luO0bAlxdg/9EairNzKOXKCJXP/iMB+t4N6Vi/WP03APGoh5YuE0O4B5v2jojALJJyWTjoRbj9bBMXz7xgf6ismFxnWcjbw+yJBVy/cQN3Vu/C264cbUgtHq2kRjrYbGJt9QFW5maQd10EVoY13CQGNUh7ss7kYCZ2lRptSH/ksJmvYuNV8nIztHTek6WJpiGAfk4DMkx1jyK9N0jUOelkk8i5hBEgVHhhAti26huwy/FC3meVeAEoBkZMs829VuAn7xdD6D+zDWjPjnRtykwlx04dK+T+lF7LliSowYSCdCNOsgDdbxgGQfqh2eiC/Kdy+A1oTA238Q/g58h/J2WAyMOFJBJT93zk/k+MQZajS8oAM1pM/8pGfFTB9VnsxE6lWEM6JybDn36X3gv9TGz6tEeBBuk1Q4DAPo7sJMSfU4MMi10b+9PQhL5HPmeJ3F36YMvCKwAAAP//dF1LixxVFP7qVnX1q7rnnaij04mQ0WgUBN0IvvAJogtdiAvXbtzpj3Gh4EYEXbgRlSCIiCIoJkKijjNGM5pEE6cnM/ar3vKde253zagDQ2bRmemuunXvOd/5HgE3dZo/kToEpUzzMRonEzHfkIWi03/7HRwADFjsOpqdGFkZRWnUVbiKzE2bWl52NTHg73YGEURInHEEF4h7PRdMu9WWf5ktTV0+f+ZiloXmMaKjlCbF0Zsks5ETbl7c0XiqKYFElWRoNS1tGsxH1wfL+RhYl1mgGdaFomIfkkwefl9lEl5gESRJo1NZgdNW5Gq45usUmQU53y+1w9J0cZrCG9T2EfTmUD+2gPg8p3ZGdNfBjC8gOY9elmHj7Fnc/+DDMIsWEfdSh0wWck88dRK/sr2NlaVFNMNA9Lv0JCi0t+NmEacuJUHRPiLaJdA7fgR33HUKP333BcbDa+LSbHwWpBN42QDY/QX9zTNY6d2GiaGBFlAJhJHFVWU4WmdlT6LDLDpYynsMZARRWDqmOEsbjPwQ4eoJdG69C5evfIOW10CmOnFMzxyXqVoIPPDX/gQrnSYCw6xnTwrnOE/R3+1jde0WcdWWtRsn6ksxi0Q0plQXTbpdU49ax2iUImq0cfXyVfTX+lhkXnbUFIMpNt0St5vl2L+2g6NrY3h10nZKpRxWfCz+dUA6F2J9jWgzM6ze2sMTzz6FN7Y2BVneZxQfTf1ovMgm0hT47MvP8VL8ijyXBDPYzORaCE43qUrurky1KsZ406t3qMmyk8TCRrHywCjsxKMUX49EfALozh0wYiw2aHUMarxHRCBhdaU19XMgwX08zvDe22/h8ccegG+6YkDmlU7zffh6uOLJdojhDct45oXnsP3zRbz/7gdCJSfDn8PCL09/hY2vv8fS/LKwPGj0SEf7JI1l/bl8/1ZYQ0iK3mgsmt3z353Bky+8iJdffQ1znUV8/+05odVzPXSjDqIowkK3g3qnhaNrN6PZibC4tIR2J8LSyrLk0i8sL8l1N622aF6ne1jlh7JSONrPZYSuZ5NU9BDV5BKIZ4UFDVlEW5f/HMlwjKt//IFLv27jwsYmfjr/Ay5sbmFwfU/SCzgRpnZ/vlZDyEhU39LDGWlGjSmdvWnylcexTP65B8alReM5/WQsU5zH9pD0DZoLbfRWV7F2vIcTJ9dx7PYTuHHtZtzSWxN367ARzoon2VKs5lvOR5U/OeJLmR9MUDngtTHl9v4P+6vitI2q1vZwzv9//u///pv//nKNkzelCjYaIYpmC62og8H1XbSaXcRZibSwzCwCIw0CggvzkqpC+rQRih6Ecj+KSwwmmfhf+JI5MXOLbnCRZiXKq31sfXQaD64fx3Cli1Gc4NLGltzrNnN5NUuc50Whe6InmfkTBDy0OSXdm0hDlu4NYChdaTbFALOYC+G12qhx74taGMJSUoMmtd0hknKIJB3D4yS7RtpqBp9TeKOTU0oI6imyegI/TpHybNQChUkitayGeLCD/HIfaNdRm5+DH7URdCMEUQN53RcZQNGoSdWaewN7vli1hTSejJubDEbY3xug2NlH0r+OdG+fBy+o8amTJpv7os32W+EUyDSNEKPSnpdkLAhozQKUkjmyXHiGGzsxycXYrJT34ClrSYrVwOhnJVjQFG8PG6foyxQlHgw13dfAsFhLDSb7E6FKJ7tD+MtdmX4zXooaWr/hC+tB0kDiDGmxL3FT6VwH0VxXzhGaS6YE/Mgs9Es5k7NC87sL5zw/K07twKmYsrVQLYIrsiDohNZF30khHyc2fYmnBa/3RAFN0n8JniY5Ctf8p1y3oXgm0Lx4nMQYprEwTSh56jJ9YXeM/uY2JhcuwdsbIwobtvCWuE8PLcbD0W+BNRCvK+nmYR059eS+bRrd1CnTayCbsmf3jTQKMDRNtFaPYbgzQD76E12PccPWINhXFo7dUi1RulZk6HoFdq9cwujMN+jddy9+CQphvdAzwMkBPW365V5Ksa6TQgV+PJfjf6DxnzGPPAmqqDTv3uycLg5P4/R1vpklNdn9SwF2F0WdK+ORdQPXXKB5B6YuoFnK1IWgxDhPsT0ucGr9JG7ay3Dxw49Rnwwk5ldCbKZRozbAldXPXJJj59wWfi8Nek8/guj4KjYnCXYJ4BV2wpCnIwsEIlAvALLAdM0Y1Wj6074FptSGRxm81pixEPCaL0kIinnWGFro0VPprGPJZgco44e/6KfkGDLCU8xLjP4eYRA0RG6UeTlGJsORU+u4/bFHsdEfYPzbRWEXUkBbKy2ELDnnOkCK+AGGGXa+Poej9TnM33AE1+pEaVuWXaMpVpnnTI3N7K5XwAqpgz0LEIipqYepiZ0zXePdTlTKXMJmyKfxRIZypQmxuTvCpz9u4p4bj6DjN9WVIpdIZj4r9zx0Px5//lm88/qb8qxWbbiMAgBSEmf257OffIX1u+9E0LgJfscmj8n562pXPfNsbGsmdW0Y2qz8XKTbM5o62Zz0YKGOXPYRspmNvYbcr6RHozQu8EVSIg0i+xqKF+nZQ7YyWcmSTFQKGxHKjkmSid5pf2q+56m80/aFhSU8Tz2B3DR8Zhpbunj0ShRfjaCvSAosYEYdu7tXdqipTbH+DtayoebaE5zOi8qEvUK9d/2kAydK9Vvi88q/IRF8koRn60TxBnLpBfp8i6u+YxzJVNWhZvo5CdKLT1WivbLtvUR27dIHRAaeCYvbvg/K7OwTnqXaS8iZYAeV9PAgUOMTpI4JcWmIO5MyNGKXPaoMs7l38CwmYFLWFOxhso0FX7g/O9Chxv64LPEPAAAA//+0XVtvFGUYfmZmZ2Z3ttttaSlQ0WBEQSHFYDDxohHjhfcmXnjjz/De3+OliRfGC00IGsGCCQKSAiUxPVC6W/a8M7sz5nnf75ud3QJeGDchaYDO7By+93sPz6EknZtsZLjkpRw6IPwCBvQZWIWFjtpPEbaQqy0aBWkbMO3DVlEGXzrLemzt7PCG54vOeBrqhDPNj2/FE6IoUn9FT5WrLW3BE/6L8Z63xZFnulSm+BcLBSpI0jvYiCB4MzxxfhcRSEgd6bwQJpga+wxVs7Q8mESOL3ziAgwqMN0ai2CwlhSCqhgb72OZunKKmogbwNzqEiqLIXAQq6tAzos1iQOX+qCPg+0dnDp+Gmmm9ya1Kp253QWw9egRLl1aE4XXCr2S7aU5FsFhNsnxxBZD9Aci4OLaRfx87CR2O214DoUgrbBhCi/uoPnkPpZ6LXhhLReRU2u/I3G/wIGZqGzPciBZBHA65nk+vIUTqJ05h+D2ingVq6fUyKbXU6UAL6kTUyxuiFqdASNRGLzrCgXg8LCJlZUTynOR4l8XlmveIbHSZYc85QTLQUpucFgWFEB7r4ud7T288foy+j0XYT3S98FkEu1mA+1nB1iuLspkxPXLSF9aplhUim1eqO8uIaqVehXrVz/GD99+h63Nh8IRJjdV1qIRWtre3cPGxgbOr63Ju1iEab3I/kk1HQzP0rGT1+lR5cs64bmCsECXjKAO9Q/m5ykqKkUAk0BJPBWwbEwadQO78ct1/HHzJq5c/USLLqEllAriTEc/ihb1ceL8WXzx1ZfYeryFW7fuYDAS4XhS/tHaaWGw38rjAJMYn6r50ClTtVpDf5gIP5623hTVYcJTCit4+4Mr+PqbM/jrzl2JA5VyRbr5FA+ikBA938N6TZX5S0bRxtpUFtjrTuEu54zi/P5PmnUwqKbUaEx4UuBZubhMRA0HvR4Om4fY3NyUtbrx202Z7h883ceo00PABmucoFapwo8TzAehKgwLnCsRkS83X3eO2mexqSfvaAn9pI9ePJRvH3gRoqU6Vk+9hXcvXBCXEDoTUCdkeXlZ+MxutaxCVhKzRkgwnoHQvRoG998Mzv6/j8RfHQ9On4P3rBxK8dY5rKHfHBhun6dJPfcDFuSBj7nFutBP+klL+MuB7woSIBok6A5T9BUbkQtOcclxCjQXp+jc30Tj9l2EH13G/v4ukvZAefA8j6te+yzOZELXTeD0hkjplczJPoMivdq7Q5REyK0kyvX0mU7J2aoGWmza+MqYYkZ5PC4Lf2laS3ZY0njnleH5GZywjIx2cMEQ7mAoCRetIMW/m3vPIJELkclUP8ag0YVTDjAk970SwKuERn/Al3XTpWOBo7xzNgEouCm8IDYCyOlpD1EWHQrSxjwEhPk7Oulls2XoKrRfY4+re4nRMBiLBoCrcH8ikzwj8Gfg3dLVDhX+LBPt0qQQ0YYSKQPcd9W1QNhqnkJ9mZe4I1f2wVLMax0haXapvAi/FolIYFgrm/xO9XBERCnR5vZg3JHmScmIq/G+i0YHv6ebTpguNv+FadIadJ+TIwTsazkdl13jouOZUS21M6hhosLAem08X0ZRxlRWrSSC7UZLmwQU/RQP6kCOw8KfiSn/bc4PUeH+33iO9sMddB9vA40OIseTeyg5FJQ2kbqeQWw58hz4XLgviAPD1B5fuF7ThGbDYEQzisyHt3gcOPUaBk+6KI/Ytor1ugrx0zGaIIxxfpaimsTY/f0GascXsPDmabHfbWW2ODeJcOqYabauRMfYUltevjz1AgXL3nAn/zOB+jsmnlt9gSlrualGb2H/NRPy1BQzAtN1tYnleBNLbaiuK1JXcxoerxNn2E6Bsx++j7j5DNvXrmGRNrxG7NU1VqP2Z8b6hXiExp8P8DfFBP11oRP2xhn6Tgw/qqhtIZtVpGRSwC5Qa1oiQ4o9jdQ2wey1FwpTq80wFgaDJ/mZ/D01XbmnsVhKjI2cd9QyLT9H4f3OXTIcFaTr9LqoR1Ucm4+QEBEbVnDyvXcwvLyGR88bGLR6KtYMbajlz8E8pfEoFS2Vw7sPcKwaoerPoRXTUladKbiXqY9/SZtFM+vrlUKcJk8UZPHM/3EsqpPN8JKPvpvh3t5T3Nh8iOVzF7CUr2ttStVXV7D+2ae4/uNPeHDnnub0L6IK2fj5bIRfv/8Z66ufozJXQzdTy87MvnjZpDYgCodyQ5mpd+yEt3htsUG5FfXNZu3vbNPDCtdNLN+HhnseTx3XMShx2Hpw5ngymaYyPukpsQ7gXMtH/rd0Ip+uW5T4RKVf0cMhgmDa7UAbVt7U7wv10HWOvJeWom1/r4hEsD/L5J4oMcY4QXrzvLqn5jx+Qxmxazk/r2mGaZ3MAmRCCRDqq7Gst9+NZY4U8Jzgc++3jkvWDYFB1Nx7azdIGrU2FYxjmEK1ZZ1Ye0Tr1kCRVyvCz482OxI5jud6+AcAAP//hF1daxxVGH7OmZmdzW42bWiatDG11Fop9LJCL0QqKBREKrWggr32d/hbBBH0QgQvRESK3nhZKcWIH8SSVM1u0mx2N5udnZkj7/OeMztJW11YsrvZjzMzZ868H89HdO3D1z6i7Z2HWQRBB6rfkxsfVQly5LtZAQ1ggv2KF+NztcUDXlkxWADqHHeqnk3bgqJK9ukwIJ1zz8GvcyoCtL+gUnfOz1MFcpIxmK862bUx2QA78uNgJTya2cME+AO3y83oCuFEoT4AxSfU+UDtIqIKrSB0Aamow1cM9aArlCbP86r4ESAi8lw55XogKOogr2fqf+5GGfobf+OgN2Ay7gEUutT5cbKzmDZxQWgANoXLlX9rwqLl+TLSQTu7uoq2FEqKmUUNvPe2rvRG0QgMGNXKUP6fJil+vv8Ltja3UBYjdky4jyINIvuZwcKlq0iXzhD647wl1pM3vZoEOx3loYcKehDtUJmXwm8p7bbyMbLNdYx3NiGOsVFtmSz8J+psSTGAWWw3WPVyVgsJ2UQgTymWlpYVomy0GGWNN9YzgRekODeqBQsKhg2eHHv9x1S9Xzm7gvaJtupFWO9DWhYYi7VGmuLk0hK7eJLAuurqGVT/Z/Dr2WgD+kDngwSTnVYHW79v4cH9dc5DUf3XLrtT5WoHDCcZbt16h84BXEAC+NAnq0c91MIemikLPkFJrBWrjHem4KcKhXVbD/c0gdLBACDC4XiKh48eYWPjT3LTDrhF2iVIpLN2UKA938Arr15n1VnqELQRQ7DIck+9s8gXx1g+t4ql5RX89ccGBr1/xLaacy62Qdxfq+/WhP2nibB2koSrWsLkDiun5/DuB3ewfOVl0ljiVgsrIjR06SKWn38OS8+fw4Lw9hcXiXDgRUmSbBsjK4S/7rtdgtQoRT0/rsQobe1IVgGj0SKL8dtC/32VzmAxZ2e3h19/W8f3d+/iu6+/wecff4IvP/0M337xFe798CO6G5sohhPEWYmWaaAVNTAnaItShRwbVhEj5TSjgwTXEAn4xVJJoHXOYTgZYTAeYiLEjU4LL1x+EddvvI4bt2/i7Tvv4a33b+ONm2/iyrWrOHvxAuZPLSCab9KRRE4/WtWV3gs8elYx6+j8md3++4r+LOClqf53LBA79vz/gJvmKb9fBRDmaAIWnDgidg8choMBJoN9uGKqtDWfuzjvDy2aEYKOG+wNFLpHMZ5EnRGEUlKBC6zypMtg3cR4GzuTQ5y8/BIejYZ03sgl8e10FCEj0H/hXmYFitEBitGY3XNxE4gEzSGdsK5CshNCGZ16r7fnEHXmYTttFJKEiw2hCPJGlGNmB8J49W0GwRF5PkSsKURQO7nOe41KgkAolHSXI4W/l16MVwJwGY907vPBAQ739qkXkO3uY9rdw6S7h7LbB7r7cNv7cL19pKMcZijFhQJpLlaTEdI4IZqOnfJCtRNEPE7oXxx/muhdHtPPP+KYaLfW8K/557b2mIWPxCelvstPyofxXT+jquDG6hrG5kpBKWntsrqAz9YCrQRiabPB75dzl/1oDz21DOK0dRqELGVtnYjCvhRU8pJWrnKuCpLCeD4xbRO9sJb8Fas1G9T1YSvrSzPDRVV3vkeStMJzmqc5EpOQspENx5wzzUwsVKY4HA6pWTEZZ5zLgmIRelMg4YwnY1WGRoQFJEgGh8g2exisP0TZHSA1EZqNJgtJVFIP/tMSD0kgLGtvmsK25liEcknkhYVDcybyBWq/W60mLdRTEKHLxpzCXnf3kIhItJuo2KWPAxCScTN7hXZ/bopebxunz53HFDEmAr+2el0vAvHIeQqbsR7yqhoGpCuIX7x92t7Vopkxx/njpoobj7z7uEaArwJUGgNGO4sUeE4sBWP732TaAAAgAElEQVQFXSnPee7F6jFOxKVMXem0SsHVOur4rK2tYbTXx7i7g1TOdSkUmEI771DEC2gNrbFz//FjdvROnV9D0UxwINQO0XmSRI/doCn1FmTj5BiwIFaqCGs4xjpuW1k4qy5AcM/SGzuqnv5AyiaFSDW5IurCxyGMJELiYo4KPIbmAmuUhHfTqwBp3MDJuRbi0qLTSHHmxAksJA30th5iuLuNKDQgTf064PMCiho69PcHdIuIO21qsYgjQj47qbw1sfHnmT/mtQuLOVYgtmGtcN4N7ClXoDAXCrluxg7TgwFakcXlixfQEccd8QlgwpawUNsUB6HtHTy49xO3nXSmshqWFpB8Q1kO2U6/hzPnV7G4cgp5bDCVONzOWi48hqTH4gjFuUI11CjPuUekhOIAaldcW+OEV4k27dS1OcpOeC3fq6vXh4ZM6GrXbw3v9hYKCEfQIUZjUxOKTnUKuufFOy8gWI9VC79WhDGw+VmzAOTj2r6wNdE95j1+fsv3Jon67VNXTJAGAq9n/KvU4EBxCFZ54Xfr+5jj8N9bRbY+l5QiILXQfDSjhf+wLTNNAMawpEyog4qKOOr2qeVimPi6foXjqJosfr+Ga5EvrnHMvnjAXJSiizFdQIJoo2ybvHeaT/EvZ1fXIkcVRM/tnpme2ZndbEzW7GYTTUQiGOJLUJYERHwQkYAfCCJCXvwj/iXBBz8Qn3wTFVYiSNAQQtzsmOzsbHY+enr6yqmq231nWAgaaMKGzHTv7ftRp+qcU+n1z29+EbI15Vw/FAZPKAWNOgGw8ELm9QOGAYlftLN+qiFAiyeNs56K8jKCQYQZ8VXOi14zSZyE1efg6oELYB+L1CPSROoXZ1q+JNE2FzZovGf4OXFRy0CndPXEDCJgzpUcvAD+Rb9hzIKgyUmjVoIxHUoMGkyTw8EWPSITHy1dIAXbODTaQnke3HuEh3/tI8TfLlQbTTdDYE+N9KVXrmJlpacMijRqsWYdTRJzqb14cVtbglRZ+QrzVt/PzXE0mojehmyG1W4Hv9/5E/29fXH+T+keW2p7SAYuk7SDztYV9M5ua7ulJK035LJePEFfL/QbnSALh2i1YZEdkYRKR4I0H8HtP8TwwT003VS6AQSrnwjaVody5jzWO01kTTFqEKMpVnb4rtbXT6OZteV7Xex6u5QR1EJ5KmBzQvp0PsHR6BjtTiY6aFKi1XyjNlFkwMF2YjSD8qziJQZ0vdLqwyZXuz/VcAfi8KmrotddhZ96/PLTz+gP+rpZNMLG5eSZ/n60h52dHVy+fEn0WaSeKfhf3s7/ewLAy/OpZ0Bp7BQJNcP/Ie2LB1YzE3ZCv/8Ed37bxTjPJQGQpGzRlIscYEQp6eNHuHHzBja3tqSCpGZxkRThhEvAAE89l+CFCxfw8ouX5DEOjg8xYTV7WlYHHUFQ6BbizWFb8Eu7gXPbm7jy6kv49PZtvPn+R0DnFPKZl2DeJS3rU9nUi14JNKqinlnMp1pCmaRbc+HVTLHhWqL1S1ygLy6iUVf9HW/ADkeDQxz881iYG99/87WA/W+//Ao/fvcD/vh1FwcP9jChW/90ji7vOS2wmmaS/V+huRYzz6W2U/KiPct17kERLNvzsVo7KWjcNxajt+e2N/HaG9fx9q138MFnn+DWxx/irffexbWd17F5+QWcev6MACz2iGAyazLTjgbzsnYsp5dKg3ThcpnWf/L8qf88OwEQH8DP+vz/TQDEninLnjahYheqrjIvS4/J6Fi06YX0/HdaRRavDfVKYUKRPeTJ2GDVqyXAPcV4mksSQBNGFthCKfC6b7Nt1BSH+RSd8+fRXF9D2WoKZb/Z7moYJ9VkL9X3YniEGbuPkCnG+T18ivLwKfzRCE2a1tHciQ6/BPyrXbi1HpJu17TwarIkEiULmDWmZdU7l+BdWUdaEZU+wwzeKWtqszViSwz09GpKddWliQHnxKrOmgzJ2EIO7IqSiGwoo3bVp2LOJbR+gtW8QKfRQocSh9JJMBieQXYangkERaStZnq/0jT9Uj1vhAqzE5dzMjEEZAlLR30PRFccDN4aiQVzWDKLs6ywVXRFzywgqNREV0TdDMEcY5DxZCznXW9trQqI+c7ZaYfjIL4e0iEn7JNOCgKcM6yu04OHspxyWojzPs1FyYSQbZBUbVI/5wrEUgNkpFjTRO6kixRol9PgM4XP59LWczw4gh9P0fYNMQ+ej8YopgWcaFRTtLI2OmQlJHV3pfEx55fHCslyT46R39/H8O5DFHsDZIX6DGmrUq/6fmdGik11lS8bicxf3zbwbx40qgF2CzFUuEqrUkqRIW1pwpYa8OEQ6XyqMpW4hBDWa+SrIO4WxQRHxzOc3thCzqqiMEZsvUt22FUGegF8SBxGEzznKpp3iH18tGadW95jXDUv4vT6Scw5ZyimDN2FmIzOUvVdEuDvpaqHhhmbcxlkWp3mYPBzExQYFzm6vS7Ond7A3p270q2D4B/mleBRF9g4JyjfmI3HOBgewHXb2Lx4QfT0M64L3ohxKc/UiFLckK4OiQFaV7XkDGyUkLlJovMMFk9rQaI0Fm1WgT4pHBoDQJm3J3iCRcMW1pMkUrnPTmfS+arXyqTtIJPdqytt+GKK/fv3RK7TTGGgt/oWe4ea8GEifDAcYO3MWUlm5lyPLjBtYDGyq1kbLgqwgariiorNrPhAikYmBY6fP8Y3pbgoe8mfcg/Y3tjAubUeuk7XLT0DmFwmu5ReIru7u+jv9+sZ7xeTI/wdydilHGA4GuDqtWtwXZo7mo8B11kZfFZcxcYObdGFoh4yCwga+NqUT2RH9rvEjJbUmMzh3wOe0cp0EenvizAQNRPcPDDiU3uuFvPK9g57gV/EbfWaMkBt91U/g2Y1r+Sz8/DcPmIjlBVmJRbSwq2OQRph0cAUKG3OhjguzEWV/DHRYcxow8J8NM798KKWDfpqZkLsgaQFzopBQlaWPI8WvSWpxEp9lFCR4jSZHPT2Mollha9FxhB1nYta3guGpum0SRw1WapjzHUq9P/QS8O+j+PEi/eUonSa4l8AAAD//3RdXW8UVRh+5szs7LbdbqFQaBuQqikqIBJFjVGMMUENUeMNxBsuNP4Q/4xeeaPcGBMS77wxfgQwRuTDpGJA2pTudmc/ZuaY533fszNblWTTdlOmszPnnDnv8z4f8dlPzn0atPHhwIm52HvUkASjumsm4rhChuJqAgXqR32BlKOUflJ4hw8QTkrp8uUEhQk30tdcEcNxm2lTNsDBJEEu8p79pyYWFBVl2Cj+pP/Wb7x2C7Q41cz8Cj0r7Xyp7W+aD0Bi5ofOfje2TkN9QMMYDgQKdDBpgczP1RTTJwUkwuTRyLRYcnhHWz1s3L6NQaYdT07Zlul5vE3cbjbA0WPrWF5ZlXWd5xWoL/JZIiceCaQRrD3xuG68AuvGgA4Wy5FEMxZqqJG2lPFA2l0jxm63xE8//Iis+xDN1MkmkpOqGA3RzRjgvIy1p08jT1MMfZjAht75CkyZvG8Pyag2LkK2JlHPsQr5BLXt8MHwaAfbG3cw7t2nutxs/xQhLU0z5YN3cgG04wgdurBTFpLohlN1Uwna8x3xIHCWrCCdTvgqc9frppCbdWZZy+QoPDa3tuS+UAe8b6GDtBmbFKaUzTF1QowT6yzsR9RqSqSNn1jI7n25AF3pywWksJBFfLFzEL/fvoMbN66Z1gja+yl1UWWxNsgynD9/XihhssDXAIBqwxU2MxW6GpD8+qasPsbFpwHKglHkO5ks8gKWcfxI7rHD/IHDSBpN3Lr5G+7+uYEMasaZyObPixnjTncXx46s4KVXXoVLWxjkQ6MdeolwQjCKmrpGEF0hN9SumWJ5bQ0nnz+D9dPPYvXoCh5b2Y9DB9uYnWtgbj7FXLuB1SOHcPyZJ3Hy9DrefvctvPzG67hw8RIufvQxzl54D2i1tchPVLBQPfGr1+QsvG4mopA9HLkpAocaTSlLQue6Xl864FOjn+12xZTw1+vX8e3Vq/j6yyv44rPP8c1XV/DLd9/j75t3UWx2McOoFp8gGRXSFZ2hySOfk+NCEg6oy6WBX+Kcxf6oRm+QZ+gN+wJK9YY90TwvLi/h1AtncO6dN6XD//7lS/jg8od47rUXcezEcSysLiGZb6FIQjy4PQoi875wCpiFMQl7cP5X8b93U//vf/8PAATt5/Sb068yMFCm+D313y+m/kNg2AQWz97je2D6XMO52yY6sDaE+cA8/N0Mg/4AKddR0v1y1Vxz/BAp53rA2pneEzSCIhOHcjCCpj1qrVFt3pyNosCeyfICfV9g/dQJjNIG8jRBkraQs2DMMiSjMfr3N5HT7T8biP53DhFG248w3tpBOvaYi5viBN3n2tOew+zyEkCq70wTbmZGBzC9AciOI5Bjne7Iih7tyFmryTqkQhOW+AYnhR2p9RIjSM0y/QLShlHZnSRDaNEd689pUxgUiQAPqXRTBDwiwEHTqFYTjhIEzr3UDIhiLfh5HCn8mWDAr+zeE8FLtfDnubDT7OX9hmhYacAq7AD+HEwMjSmQtFLVqkaqt46sS6rUuMi+GgBgo0tN8yKJP4vMaEqKPTNTFRmEFFBeOnfSwZfnpR6BBVBk8gKR/3kdX9RxJmGcEagc5QIEUEaRZ0MUfX4doeyPUJDeNMwloYPFPQs1P1Q6P0Eh0rcpgxt1M2Fe5N0hBts9ZNs9FL0BGjmkmM93B4iyQp4VkmHNe2IMScE6CoJcGTzd/hmjNiyRbA8w3thE79Y9DP/axFweo0kPCTLZnF4vb4WiyC0a2v2P6NE0m2pskKCuiTIdJZqxehVWFAjIRAYlQSevYEzDrmc+HKL/aAsd2fQW1Qotz6dyqvj3xtwZb/fh4hTN5SWJGOR9Em2smAxrN5RMQMZ3cj4kIgkESvFqdcJkZVHOtBNlnCQaJRnoyaYbjmod8AAQ+D3rVhRSQ6QIMFOvVLP3G039nmwWggElfZRir5gzE1ScF5Cf6RVifDmTyt6G5qxMcNkXz+DBxj3kw4EYINOjwNkGLrK0e1+qfxGLi4cPHqDdWUBrcVE8EkaB7svihfeH46pUWFJN0Gwv5pzGsFm3NxHfixRlrgVFMAbWQgYT6nJpUhpVVzk1iTTgIIktmtPVimpMAymSmiXx4hbJPR6j05rFvs48UOZYOrAf7dkW+ts7uHf3D5EANIAJW6SCJlRTzk47zZk5LxtMLDEgUej73rymIleDmWpJC8beKgNL0eSPjMD1VjAHiVUwf3SBeSlFu3ae2UXmc4JGxU8dW8bBxowwauRqE0SOgfn5tph03/j5mhhxkumZlxXVN/YqpU1tzPFYswvzWDx6GG62gYGw8xKZ68JAilR46mK9T6U1JyEpxq3JfQ33A0GSUSv+Q1FcN4IPRXhgWweT9iB1ju3zNwwUqBq5lYRADNRN9lzNa4sJrDMRZN8Bc/53E+m5mJBaQSsFfw0w8CbHDp/Rm1F8SLrQmqoC7CZZ/3bPi7KqDTlm5Blv8nDWgSPGHtaaCOHvTvYz4fuQghHWi9qrzpSQdYB/g0Aaa2kW9pOiPJdaLHT9xVzeamDx5KPRMs13TequDAUFPIRVwM8zZix2IuevrAOtBcUvhtfHxr3Q/cNYsKngogj/AAAA//+0XV1vFFUYfs7M7Ge3u4VSEWptliJJSRSN0SgkRuQXGH4nF94riokXJqKtJFgkQKEEbKXdtrvd7s7OzDHv1+zsFhMvcG/apCw7M3tmzvs+7/MRBQUXQ2gOtU3P6fdhfKwXZ/zFjSMfJqf/ReM++xtf4EyyJuMsLsQfBDlqATVoI08AQ7SgVEz6t2amZ06OqTrwuwkK9OQmQvUzFScWf2EaiKIuhBGXqfeHEwBGSWgSYcSfTT8tHi6bOk/vfT6BCMOosIjcRLrA9MsHI/iKR+WtBqpn5zDs7svmlokxSWS0H94QM2w+2MDq+x8yksxFa2ZNpj1gPbrkmN7tYr42f+LaJKkt5IAR8vEES8xmli+tYOniBRz9/Rh+eMDnS0g9XbeKz9B99giD7Rfw1RmmA0bR5P8PY1YGTpvMk0W93AxeJAphxpMs5yMMgiqq51Ywu7iKzu6fCLKehmzZB+jCVVocNaHdY5raAw2igdL0lBxb0wzHvSMuip0v8xTXu8loG3Hez3iSRNOncjlDdRRxJCDdgJ3DLnY7XSwSIhl7ibGiTTMKcXDcx97L52gtnMVMo4ksHOUIonPFKdTrIszc2JTPJZg7M4frN77C7Tu38XxrS3KZVVrB/hlZih++vY31X37Fp9c+5wK7yOR4Ey/DjG0TRCE4gB+apZDpwc2lt3Hls6tY++MBDg93WbLg/HiEQqf1za1b+PrmTZxfXWVKaWrRFv/yCosKe/roSoC59iKut9/F1etfoL/9EjFRtYkWrSgmUYlr9ToDSbNE5ac4NYojYyp/WcLZaBrpTSZx8t4zZwqjACo0xMcjMWBiqkjPAJrs0FrKkhGOj3ro7u9j8/ETPH38BPfWf8fW06fY+Wsbw/6RuC0nYgTo4hR1lPgeDkcSfViDIsRq4kOFID/4ScUbAvvdPSQ+ZeMhym1unGpi4fw5tFdW0L7YxuXLl7G49A6W222UGxW4Rk0KF4XFUqeiDn9S9xj415lU/v+vrKjhnNbkv6k1/B/z1SUa0LNzfIUkINTgkZSHfCfKVQxjzcp2stHWm7MYdFso12tM66fivR6EmKmVUA2BfmJlqZ9YZ8QGmElTdO5vIH74BM0PLuEgHtG8j6353WCAAU36j/qImNrtUKE12RUwoEQGrhCQPOMGugxP/jS0/3GTH/IUO8jhLHX19tL8E+WYIr3I9I81wSZ9iyRfn7Ae6nMjKiB1OpmFouVHErEJh6vKRMmlLFQURpxl3+fXU885L8Ci/Dq7wnqTqb0V3S43R+JFH8hEUgpMneyHAjyGOvHn5jRUWiWlAUTydzqYHPBxbmovdPk3E6iRmVGBJepX0lPE3JKTebkhTw6Oef+lAWpFJ90EOrCTfqoxvsqg44mmToG52cjGpqv8e5IxCDCyojRwSk+fipmzesmklWnGjtKcxe7C3PCXgehEqaeppQ1J9Khn48OSFuwpMxIISCiRnxFN0To99DZ3kLzYRfrqkBlIUSiwlVPZpCFkEk/lxV2erjUBNso+U1nqWDteeFk+fqD7Cc+gKREgTDAgsKDVQrndRnd3B53+AZrBiE0oUTBEsxf9XotUZz8a4mBjAw1ySF86B0/mWFxvqb7fk29TyNGrxKzsJ7HcAzNVtBZO8zkNCDCg523oOG6VwIdq6nI2CJurkqzNj89v+gStXrV1Rx4Q7NsRKfhDzT5d00gYAXxvBeqJQwCd6ox5XyV1TTxAUKrDlYhhd4zlKxcx+2oHu2triPoDuDTm2EpLVBHFrZh5zSZAf2cPD7+7g+VSGa0Ly8w06vDQhu6ROhI2ayPTsSHf/8RcpLVCRmSxOodbCfy6CT6t1VQ9wuxyZMac0Pc59XYyZkBuCFfoEZA3TcUFH6DXH3D88nyjgRmKNvQjzC6exYVPPsbe1jO8Wv8NZUoTofheYvKmUk84rYfpaE4FIXqPNrHQOo3mXAsxAbMk9a7W+f7jmLtIh4PB+BCm2aBWr09838XDzXT4UlyjXuSj+0hwf/sl1raeYflSE3Xqn0hqQQ0dDVAW5nHtxpf46dvvce/nu8gYMJRbGeYppGAiXcvevsf6j3dx/qP3UG2e4To8UyBHSi5jUxOGMsgj4sxJ3hWa/Ny3yE1GllvjWcztZxo6/dRm3sxK7f3cB6bpRJNr184kBcY4MMBIWN1Z7hdhx8WDTT1nWocRTJuf5r2fSKeEko+cZi9JAzwEDoMJALE46ALGU3w2GOTnxTjunQYuMZlYcl8kQCB73yUE6IhGvjg0s88oyiTp+Tyd0JLLDkxOpz4Cdu1ZbpBLMIoD5MI61G1VohPFc8G8Ayjy2Xo4khvZZ/BxESuP6gQCQUOStYo0iY+1AHDywMd7/AMAAP//lF3JixxVGP+9etV79yRjz3RnNJMFElwgBFQ86MGLEEVBQdCDHvzPArkI8eBB8SAIHhQEQUMUJInBLRNGZiazdfd0d1X1k2+rfj3RBAPNkElvqXr16vu+31Z6AJRRehAqHKPzFv+kTT5r9pXGYXT2gp3H1eDgIZ0U8xJLlN9FF1ei9HA7+QuTiegisxQCPgjViurhi3JBHO+DqOFvtdvSZEImdLwg3VwOYPIGYSbMP88MDOM8SXqtuNyKtsOa/1gWESwSAmpG6JNyqhZ0AGCaDmNW8Il2chIZp8wddu5v4WBjB2kmdwhPEX+6QZuv+3CU4blLl1Fl864ohNd8GJxc0O1WE/3+Kb4BhWNVvzEyRPs4d0MlCnS13sDWxibu3PwJ+WQE56YS9kZOyKGCItTQ6a+jefYCMl5oQY+bK/V/C0yA6KNt3QgNnsy2Co5wYSQypKx7buQJioMHGN6/hXQyIIK4UMVL11r5SYZAdEMkNKTbTNGupfCuQM1LYUQRgRTr1uk0RfcayVasTOTrrAjl2qPibprl2B+OsL17wBthr7eMdqvGzIlEhovMGBjTFLfdRv3kKtNUXYn+l6Wxrs9UV6kNoKxRKMR/ABUsn+zixo2b+OXObfjgVaNXqEY/cCIHDXRef+MKKo2a0IK8FMbzU2vV9mxBAvBfAG1Q0yLJxzYU3FgcommGal89I2+em6EkpLjz611sbN6TzRNOJ+yCxu4/2MMzz17ExcuXMSUatbm9I5JFGBuiJHbJ57NrNE/cq6y1pmFHu7uKpVNPYXn9LLqnz6B7+hyWT59B59Qamqt9+M4TcIT4V2rqjirxfByHtkDQj64TnQeX3hS8EDJpzEzaRIafR0Ns72zi3p9/4ftvv8GXn32O61ev4dNrH+OL65/gu6++xtbdP5DtHyIdk77WIc1naJEmuwiMrPmZFEJU0DOlTvdWYqmIjn+E0XTALrzU8DeWGlg7u4bnX34Rr711Be9/9CHe+eA9vPnu23jp1Vdw4YVL6J5bR7pUx8QX7A5LzQedC5LrmLNwYtaTTq/tCO1HifHNH4sCm//z59GNtztG63/oZvcYE0H3mMY+woMe/YQI0pMpuSCmk9EIw909Nl5kJoZG1xDtkuaTTULAyYtjbw+jw312HK7VJf5zMDnC4ViYTBY/RdRoKuoKjUx05C9Qdaiur2Fc8TxgmB2NiC6D7MEuPA0YjQ4+zTA16v9U4h6pCc1pf2o2UF0+AddpcGQdU5wRR5ApIyIRaZa4pAf1qJDkCKdmYrbf8Rk3BEndqZyxAVKJBGXNctUzEkxNIDMGaCBI8VQVZQipMRw9mMrvZVBKfy+oQCGUnuQL9Fn6PMnr96xZZqaa/i4xpF/fhzT4gYcBQvsHG6t5SdfwYiDoIlTOfpq+nve1VLTs/KDjQ42zSgm5PuHGymIMAU/zkimxQUg0o+ZVnDyQ8HAu6OBC0EFw011oxCAza1RnLZwi2Uu9E5Ev/Z6eS9IAKu4cof/ZjP2AZlNhoJCXCen42dyLGjlioyQGPoCfYyxFaso5BjKdI7v0HakJmB6NhXGUB/jdIY5+38Twtw3Mtg9QnWSoeYkRLXR4EBRjZtO3xNB/wBHqT+g/1V9emCAzq2MSzNlUeq27aKCTqKN1uf9U6qhXG8hHE0z291ELGarMRDPnGUUijdSvkkKqksjHYDAYoP/kGvJWE1NuTguxog2zMobRPotqLo6W5L4toNfvodlqcGIGx+XRuSzkPpsoSpw42zt1ELNYwpT6YRpAsW8WGVjXKvygBIqU6hBiFvBgLYDUZY6fK2uVZK5p6RNAMrScBwgcqegCUmIWrvRwtD3C/tYuXDJlpyS+qwWz3bXQYMcI8+HBEIc7u+iv9IClBiaExhKjg9YFraFcBlFsFEv3SR4YaXNIrB9jvc2wEJnKjabWToYUu8hbq6Ry68lnUEePUxIhocYEk5+L3gpZPuVaaLnTxolmE0meods5gSalngwH+PvWbfZEIUSd1kQe5kMKp/5DLMWaZnC+hvrqCgqS7CJoTaF1Dfs1iP9CSEwu6UqArgQF4RBhGhKnVzLOZgsyI7lWJEUhT9iGE7PxIS6eX0cvbbBENWj0M31mq15jH5Wff/gRQ0peS6I9J6gvCIOgckAH4xGqKy2sP30es4pjXxIZngYdBEgGKCU3lRJsPTeELnM8XFEsMAD+PStfz3k83NDj4RWZrymibHR+YwUYQyR+T6f3WPtOhtR7H8tLZa0RCi9ea4W+xikToMZMWx8Z5sVeBXG/efz/Eg91LAWAGeYqZ7B6hBpx8S7RtAW6J9DAXWXXdK3GF7+wEnSgwVuOmhMa06Ckucxfk7IJLwHh8l7MilDmMSPykYS9HJTZHZ1ZAZLAR99FzFj135TJQNIeY/mW7Ho1mufY94ihYMfK+rIQAv4BAAD//8RdS4scVRT+blV19TvTM9OZmBgDEyMGoogiJpiFceHCjWAWiuDev+Ev0ZUrEREXihBcRAxuxIVgMBtj4mQcmcTp7umurteV86qqHkc3LpxFYKCnu1J9697znfM9wsvvXXu/Nq2TDjCbBIS1WZtoIhzr5puRgFAQa19sq7XqqM8XWuQV+DVjBftCrPt4HMXU/kNmGmgMBFvQRM0XE4Ujf0cLNs2EZp6L6yJr6JsAvMkIcPVCFQNESzlwavwmqQhClyqqB6OioFYdHLdyzZylWUiXxcwVjfVgP4HwwcUIIgOSP+fY+fEXxJlMc9hgzTTsujDyzOPCxaexNh4jK9Xt2KYU2qFjQ5Yix/b5bdZb1vSrpiO8Op57id4SKqNqf5KS48gm+/twbik03ILKyIhLpYTMWy48g3hzJBss3WM1XwysKP2XytyMFbkLFeQKAEOeWJEBWitPkf5+Fwf7vyKEHIBlowHA1BeSYXjxmV/vtBGHBeJApjmU5UxLdzGfY7w15uusf/kAACAASURBVHXpNaInsDWnDwC7Q4cis8hymrx6pnNNZgvuEJ7cWsf6aCg01yDiooG+c5IM0PSwN9rkqEkrGGrXca9HRFTBIMASIwwEE/U04rU8nS5x8+tvUBSZgn8DThG/bvfBA1y+cgVnz50Tja4Wvf+1AVD5BlRLo15TooETJ21q00Rkrrj5GHZ2d/HdrVvIvTQAAqMneo+kpEz+Ga5ee5UlGOYTIQeT0s5N39i8HlgBynNPduEX3iSBnTZr93MGJwQa2igpbpTy212LdY+BHtzU8XJ8z3Ti55SaQJ+5Ij8odKJScswbAX+KBdu7dx/37/yMb2/cwBeffoaPPvwAn3/8CW5++RVuf/8DDn7bRTaZoe9aGPeo0x9hSNFZec5mZ1RQEvAv2TXemEBkClfy/To4nHCW/DxLcJgvEA872DxzCpdefB5XX3sF1999G9ffeQuvv/kGXnj5JZy7+BQ2Tm+hPegykMp8isIVzKqSKB/PRVFQHbgK9CziKNC15qwBULdEVu9/tYMev2D+8ef/bQBYsXbcq45jyZS13xVP6UlwSeZpIFp+munUoxCjLkjkIU0OKI94Pp0wcIvUaZ/2ib1Hc/lsMfTlKbqJGoh5RAh+mszRe+JxdNZGDOySyRTLhw8RzBMMXISODxGQp8xswc2kcJnL5NkDCZ1x/T5AufOjAVy/J1F3TgBwaBRb8/w4wrBwVWa5sUKkUAnU+E6k8tIEEFqzuusHArrN/ZI1+aFo8Jmyz+Z7EcekslCXfo8EmPtQdP1s2kea8Vii/OhvGcSryR8Bc/Zj4EaDvAdLBBj46/voZ5vzv1GvoQ7rq8upMZmB6bOlqUHXys2FUPxcCpU1yv6H2gzYBrZ0LpKEY7EQL6RQHJeNmupUEkifH6mOmNmDpR2tThvMOrUNlIJtkoPG5M81QFRgZk4sbwzUc0CppeqZX0k1I/E2MeYEn7tEv2XpwQJRkqOXesSTJZJ7f2By9wHCA0plCNAJ2F8dRSAZ8mZLSA0X/v4jkWSltFy6Lfh2xBTzXL9bZ/nbgTB8VgrgRqEppnPypNPzSA0wiqDqd7t4tLeHdpYgtskr1zoW8if7Rqr3pdeVJgv5dZBXT2+8gZK8CEjW5+Q85HQNzi0PVeKkpnN5gWSZYnhiiFNnz6A36CEmCQ1LIsU3iPZUWfdmkKnRX/RWlnEZenQHHQb5DPo71AAI0OoQmHds7Nei2Eim+3vxAKDmWVivXw1UkEFyKCaWuUbzBZ0OUsoFH5zAqL+BvZ0d+CxBSMwFr807I/U6Ya1QBcTJMfMUk+kMp89vIyKJUCvmGDPVgIkkgN37M3Flb4Xieq6pN5YNDttLddLP164yVFcNd2oAX9VS1gBVFkGzprb1UGqtW5csJdfpeSqAb9jvq+TBo9tto09MzLv3Md3bZ2aHxRRaEKTtaXEojabD2QLtjRG6ozVOTDmkpm4QVfU5vZ6ep+rccDKFdjbp5VmAq66NGy1HUg7+ZhpIIJv2BDVDXyYLnBwO8eTWmAcCFOPNrGVfoN8fIMxL3PnpNnbv7VTPPjcAlPXJsW1a/xGLYVbMcem5Z+F6MYg/BmtIOGGpcWpG6Cpwm6XiGdSj+OJSot+aoHsFpCvtPGoAcx62muxYKfvNhDaWg6vG36ssoCqzFOwboPaaxGYDXKOgr0zqSzVbJJZH3OLPMRZDqAkkHNlXiMO9NVy8GvVCcc2qtHX196BiubhqbRKWoyY1yT0MW9JaZPN3ZbGZGWJ9z1RO0vR5qwbduu81GTWVm79gSPOmW3nPZjys/ludMXxv62QT2sfI/J63ecWZZqbPn5Fn4qUXRYzV9YKq67VFYIkKRVniL7qupUWOMoqeqq+qq7tnOt0zk8kMLqJBDUQXiq+FKIq4EBSEgKAL3egP8e8oZuUiCwXFhcbgRhKF4GOCmTAOecyjH9U13VWf3HPvV1UTMFAkmVdXT1V9373nnHuOe/Gz1z/3hrTK5pp1Mzvxije3Ds0pCuSs8JFFQFBvZ8x6/Tx7f+ricpOKxXWxwydOfundrEfHXN9aTNqOkrJhttMGJNe2nqVfmOFLpA1eZHF6vsXsnDAzMalnukRqQ4+DytcbLZv/cGOEFINYY/+EpaOLuZ2cb90Q3pAX+X9wVOTstMUPhodKLlJY+GIzVSOrK6iNGhHQUEnj0kRJIY17D37mke/cw+LhhBJEMnk0IovJTMmpLolOZbj07PNMA6jCnWMSdG+giOT9n3/8PFYGXT1zc5zU4qNB7co4OMKDjIW8015ngFu3drB79y6S5RSuUtMIGkL7E+RxjI2LLyA5s61zm1GzkCVBHhoI19ZMeii942CUF6uhngjvShOAOJ+iIwzJg/u4v/M3EkgcTGEyP9TtdECiuSVUHqN+QrlgKj4AzO33ZFhHayOsDlZtFtbXEqsAANCRttKVWEYHZD52lpcYH0pc2xjD4Qo2zm2g03Ho9rpadIlnQVFiejzDaGMDw9E6Py5qCC5m9XsVeaEzRsjX5xyFosibeVUqDsld3Lj5O+7s7mjCsCgc4pTHwi8o/9z/dw+vvfUmVtYGnB+T/G+zyG9l//tmVw4faRnNeAP5fbBX9MFiEXVRF76WhZUoDeT+F2lpkiKTWdDS4/qPP2F8eGzwRFS/pvycvf09vPTyK7hw4SlUwlC7SOPrZDHj70A9EMKrBtwzsisaplDZ3NhiJduJFHti2BepUNMUC1ENWrDxpzIkMN3yXSKH00jJk3LG+MclChyND7C/t8uRml+vXcMP336Dr7/4ElevXMHVK1/hl+++x+2bvyEaz9AtFhhGKUZJhkHagZP1Q5gjmb1mtFbBecZirmMKMkdGX4nFCQpp+vMp8mWBZeIx3N7A+YtP4tW338A7l9/D5U8/xvuffIR3P/wAz0nD/8wlDLY24foZImFNQ4oHqtqwNMybS/43Wd7G9PiUqqIuxtviC/tHWxnQhl+iR5QBjx5kksO9HPKd2weqU9/TdvyNotMnU9UpH4/6QjTH/40sNCh/ZY1sOJrqtG2wVBt/lcbOxuYOYeZtk6NDvreSRXPFGeLUHN+zVJNhjo/GWJQnZIVW+x0WKtPpHNN8wfGARZBFS/9UBVknWNAlKwN6hoxnMxQi+y+WSIWdXXi4/ATxpICfzBHPl3ymSonKjR3msp6I+dqwj6rXQ2kNhdSBzpqmwKyFSVcXZprJkCUG6JnSxbwfWFgYA8V0gChqZqFtP3SWWMKiJrEZezPjY5Pu1CSODLSx+bAZXHCmX3NcRBXhE4vxo4t/ooewIaHxD2CAKQOcufsjjYKXn+l+w7mZg3scbi7z5IEx86FAk+c161KCL0CDGB+S2Y4U/PVobg4dZwqVnIEB0hjlc1TTgmx9t5PWgPsi7Ocl2ITJHUVlohSYZoKnGf2JXqfK1xgtkwksdo8sLJlhVUM0iobm+hqVyPcn+1XqUqb2OHoFqWFpKevPdA6f53DTE3SmcyQPZpj8uYvJnX10Jks2/w6qZqjMuV89L3QemS76psgQ1UbJfPUUpRTH3Otrsxl4c/CoLOpK9oZl6RsPBq/gMNmrRFUD9JkRXYWA9pnDw9s7WCUrpqSFNGjqy1IauKI9D32YpJ4Uld50ivWNMxicWUEuMW/dAebiUyTRkmE/txonjMUIcP/g6IA+RyuDHs4MVzEY9AgEJ/2UI5USKZn0BSiKEWURZ/bTQYa075D2Eh5xJ4Kzxj+Wr8kqxJ1SSjEk3Zifl+ZfBGjcr8juGzkSqymbM7WL5nfryAAsFjSXGWSR+w5X6DN0748dRMcFTTUV/AkmdhUVAStpl82vqEim4wmmxxNsb23D9XtwvS4WQtxU6vnCjlLUIwICWBqBSzP+jsQDIhUAQho3S/dShaE5juui26iOfAMAIMyIQxvomNdQd5Nl2dTsiRmTcSZaTLHF70SUKsL+OofV0Qhba2ucT+pnDpujNWRVhtt//cNzryyPP2iJ67bJ0pzkPA4PDnB2axMFwZWU6loYSyugfFRpfVHVjLgCbt6K1pCTz97SV5au5etUi7ZfTaWyYlXhBf+ARUQg+emtc3isv861NqHqynMt2RDgalngxvWfgWKBMHUTVHslmrpNrksxyzE8u471JzaBXqS+Tbw+S/7MOt6bTaCuK+LTks/nqrAKSVdxbI7xwY+rMWlvG+4R3GaDbNHwJudv1Muo7wVKzavqlKogHFTbWrNN8tOMWuWP9I5htp9+ZAY8yd8CAuR5bt4cDahI9TaT1hrPtrLUe46j4Yky5HJvybnJz2F/FdS/viRQw6Y3SWoluSaGqCdaIHHr12uNveuYlX5O6js1YRdimcZufG7Cek0VnVVVNa2mqF0zmmGvrUCberCdksbUqLAqsjgGb9+fioqHCjAd1whmznzWFBVUAt/A5LBHWqWk0aJyP8QR/gMAAP//jF1LbxtVFP7uHY8fiROnVaI8Gh4SCIkKqgI7BGKNEEJC6oIKWPALYVEQgq5AqKKw6aZp1ZbShiqQ5unYM5OxZ9B5zdxxKoqrKIniOhP7+t5zvvM92ATQppKcYR3qpNVczOgkrM1QLUeuL6AY3tlEvHmj/99u6STeOXTpIKYoK31DiaYhWFxa1IneXp/8sqYrhNdVf10XhDZ95w+NxZtdmDWS5yp6SU29KBVtmlbmFqXGJsiiFnAiatXZuCaJKJUexjQZXzMcKsqQUS7UMEPcLD3T7nmQ59rwKTB88Df2t/8Rught0lM9RCtUvMDxMMVrr1/CwuI5jTwJmihzkSRTvF4XqxdW+bAwanc4FqtmoVr8WGPa6cR4uj/Gva0tTEYHiIq8isOYlDlOqfhYeRnLL7yCCTEtDFmDAAAOtTIBz5zghUWW19g0mUJxVjRtBMMhkr2/kA+30SLdrGEGjUeQYJRW6dFvT7BAQfB0MLoKKOWNebC0xGs2VvPBEAAoUMs3So51dJxLmyYTjMcjpulRobEwWECbGjKN06HdOSOauHNYXlnjIpMOAjjXAABcacrGsnp9YAcX/ZxQ+ClNOAY4ONjHjV9+Qq4MFMGHIjWzKbC7t4v1C+t489JlxJ0ecmZSBM9paELozjaC4dNfMQCqVVBfphwwrkIPCaDh4p0m7U4MEe/euo0Hd+83jkRxfo0wTqfoz83h3fffQ0xJCVRolEavtgq4UIMl17gwa2KskeTiBtrAaOY6T2/VPcCbXCFUkBrLwhHNfoTRySF2drax8/gRbv12E7/fuIEfv/sW169dw/dff4Off7iOW7/exKOtOzjZ20eZpJiPYtbrk1s/GfURRZxkARnRaispS20Gk00nGCVjHCdjHKUj/p6mZmsvbeKNty/jo08/wZXPr+LqV1/iyhef4YOPP8TFd97C+qsvYmH5PDxRSKnINsdqc/6dec+4snlGoCIy6vczHXPzvmdvs/P45zIA/nsg/79NBmom1PMYAM95nMDhe5bbMMsAYD21Fo8tpfuSjwoBORkXz0PEVAyrRwOtc6Zkq+NykoxxcnwkQGTLI47aSJMCR8OE94G0LDUFRAeG4GE50tMpRmNiE62itdgX9sZJgjLJ0aMDepRhMkzgslx040o7p9g/35tHezAPv9jnZsx1Wjr5V2pj8Pc2zlF9C9gryikrNPHIc6GPq0zNSmkDApwCAfyP3rctGQwI0CyjSwHoVZNvkzNrxhUE4Jg+neTz9J8ZAbW+H8FnkS3I/Q24t4lp4aWIs+LLphkVk7B6y5teM1B9UAwXmS4SZtJtM52dwBgGLeJI9KGa9mO+BhWwbDgSScToI58iT1LRv0KmX2TOeppmXHix8RVHAE9F4sN7nfoAlM/wwpmVbiBoqqpkItlrIwYR5EPAGi+yAAaoxHAwPRlz80/sJDYcpWHhYYrx4x2kO4eI0gl6UYcbOipYqflnYLcCfNTUjtadLH5x+5+LUXS8yCAU0LH1UYrZj7JdtJZqBKdL5DFLSjVpiKVPVIISXZ7Oi/QUyf4hfHGKro+UBVEqWywgEjphNXXIWb2YMBg+N1hCf3UDpz5GQgU4FcNVEkdtKiqCOymyn+7t8nWura+yfp+wGTLrI0MP34vQnusgpmShXpvBAGr0o17MSTPU4HPz3434M039o7iAJzBA3f6Z9u8FluTn0DXrVWlgZL3z0KiwfUwkcGQSyuyXbsw1x5Lr4uDJDqbjDBHLQeQU9AoI0/loZwIN1vIkw9HRMVY2NzjhI6fYQAX8mRkxHEkSBkWPknmvJiXRdTEbsor11iPUdlWnbKyg8Q8TpaClng88kMIVX7FuS5kyGxWaM80p2lEZe+f7ffTJHDHPMB+3Md9ZRDbK8PDObfhCZcn66K6+OjFHdKX4GsQx4qUllk6VzoZM6tE1kfev/J1e/Lo0whfa75i8yvbXqnc4c/y5SroY2dqlIWKWYRADmxsrGLguWtUuXHIsMXlePLn/J/6491D2tLoarM1Kbb1MKLUnw+bFTXTPzYtPaVTwvmgdgRB/dPjq62dEmCZNlrV9beeFOd+bgZ9jd3mZIodyb6eGf8YC4B5Q2STh+jbzQDMKZNM7ko9ro0r3zDVBTcCF5iFt8XzE4vYst+vyfXu9nvZ38pp5ZV8ZSFHJyMN+z6tTfll7tpkRfayDbDlTmtHwArieTX2QLa32V+Lmmphi00IjE4N4fPVWEPm4rFdLlqAbp8OpkaL8Tqn5Z9nw4gFQrwj6PZL1rykG+nP2blCGhVyDiIRsxGJs/vDxvY/wLwAAAP//pF1NbxtFGH5md7NrO3bSgpOStApQDhyQEEJckFBFOZULBzhUIA6oEv+DX4RAQhwIgkJBlZAQagXls6KlLf0gTWPHsXe93ln0fszs2EHtAUtVVNuyvTu7M/M+7/MRv/T+qQ/Ci6Ex9XMD2zjyu8KSqQxKxSfnaPd+q4PqQAFxlCz8QRNy4vQVnjJm5o0kjBox0GRBbARH93C/MaSQiMbeet1DHZjOEehAg0/xRZFuavzJCTVKrnQOjBvIYdL95iSWjQKjU+R4vLSEgjv81vsTuHPDWnPrEDUrESSK/LuMSKMUQNGjq3kPdRCSDJ06RXl/Hzd+uwrybkmNaBVj3azKFZtgPJ1i48QW1jc3tcPbAACMWqkpBG1Ynzz5NJ9HP2HprO3MhxwtiDY69HomDRJY28Ifv17B4M4NxEz1rhgdpY3NaGqQJz089dzzqLNllDrpK6vNgbLKAMDcBR3KJRo3VcOLEecmW4Mu0eCqAtO9mxjc+hEphc6FubI0icR6DEwZq9BdqnGk14axdNORd4KqnCOjcX6UIDH1E7k7ncYbiIkHwozynMk9OS8x3B9yRF13pYN+f43HLqV8Xx5nIC9KFKbGY+traK8cYadYRhw9FR/KqfgvAEDGgzVHM4v2cgfttIWL317EnZ2dYJFzC41k8F7/8y+8fuYMOt2e6F/95/0fAMB4ehMjmIq+sv+HEZMoxKJozaKEN2q3b/6NCxe+EXBCOwY8yVVikTXa3cGrp1/DseObPAaC29ugwxYCV+EZmZdQWKXxhh7AkUZAsLkPaeYof78qOCt/MtrH3du38PsvP+PK5R/w9fkv8OVn2/j0w4/x+Uef4OL2eXy3/RWufn8Zo1v/YHJ/Dy3yvoBBy8RYJgkKLUCTnM2k6FogZgiBMsVsxn9pozSZljjIc5aNDMcHKGhzutrD8ZNbePGVl/HW22fxzrn3cPbcu3jj7Jt44fQpbD37DFaPrSHpZgLKaSoF99Fq6+civytUIORhVfeiv8chGPkRFfThcn+xC28Ovzz3AXaBYvDoh52vEh7++xZeXiykzAIAsshYsFGTI82xarSBoM0SLZx5iSrPOVJtPNzHbDSGnRZMN4UzqFWwkONFp8IUIBdn+pxWq40obmFvOMSgKDX2TOt3PTTS8NMGezaSqMts7SjG1Uxi2Wh2qAzKg5y9IaJagGPe4FDkYJpiaWUZSbcLqzp81sfT/elOQ0BJnVtHg3GLQz+PRCVipeqfnfWOsgFiTfWIVP/LJnHKIDD6nAPOo0Ro/2wepZ1slw3upHuRAwLU+E9eS2SO0UKI35c4MEDd5/WeF5whVt09GuDezXsetGgAAO58EHuKnd6XJFmAutfe60Z/P72xKBFR8kPtACL9WO1sEljDazBdO7Ma1ThnGm9qYnQpWUilDlyYcANgKuC9NX46rgKYxq+D7pZBEzPK4IOVY4jV+C/R2C9m1mnBKKkFlr+Luo3UJSTaf1KBi/+0qGF2hti/fhv5vRFHjVKUJDG4CKiysXPtlw6myD3kOeOOh/YwGRWiAujQWLFxY+Cn3iQgNeZl0M6v3NY1X2OSOw2+xolFRzI3ensnzdBOlzGg1J2DIdokMqRzZ5QlFmjRfYxfLaIzOt8P9oY4urnBjJOCunt0nzkpGLG+jA3y7mUuow3zYDjgT++vrbHYrI5EYliL5lKYELFk9ZNJq9Psc5JAIuwU/qe6frdmcoAs3V+OmiybnzkmEneTEwHQjEoyhUJvVB5S++QWSjRaXekhjTLsXruHKKfIXcs58w1w6j5D9rbTvGRQKi9y9Pt9xJ2UpWMEmnAHnM7dwVjGajQRkIkZkNI0o3hYaEoMN/sC01p+OCYtGrAQel/LeCmnTCdkt6rVARjp6gmrTxL7hbyXSMe/2s7Q73URVzO005Q9WHqtNu5eu4HBvR0s0b4as+AqrP1f+mV5VWJcVVhef5xZK6UxmEZGAXVhYtZW2CWxFolNAyNUcDaNGhPo3X0toaCZ98Iw6iUV15iMhqhtga2NDWx0VpHBMRQEvOj1VjB8sIufLl1CPik8gw8LKy+nXiUJ7j7YxfrxPp44QTGYEQOaNrJ6TVeqhxedOA+RmuMBgVv9QiHbrBV2rgB2jVTHBkuCyPNIm6tUjFstYA8v2MYbqccBSJBoQ5cT3agZ54CEuehW3bJExjccK43Gm07LJnoQtQdcaU0jrTutxZWa6zVFtcz1sa5RDigQ6Zd8j9PLh8cfnp+5BwW0kEShlfGxUaM6y9r+vfT9VCs6gNrVgc31GfjNcX2onnLM4p2vk9z/XeymS+Lj+PrIYDLJuf505oCh90GYTCcAloABi68BwL8AAAD//5RdTW8bRRh+Znft2EmdOGkao3JAKCAEqAdKJVTxDxCXSsChFzjwOwuhvZQLEU0lFCq1aUmVpFFKEtvJ7npn0Ps1u3YCKFYttUrqXe/Ozsz7vM9HBADsgDYg6g+txORGb5Y118zxn35OqIp1waPmI0i2dIe+gN4wh0YRrvmOzR2ejxnfYt7HCIrGAvLJ0o1MRXYQb1RSozIcZdeusyeNrjR7YX0D2WEqrDlTqj7Dsx68FA2KTVy6uWhqmsyPgM5LkhE07lCZAC02nHAN9CXRbG+JnTAdPpvikdaZIoOPx3jzag/5yZjNiCzH3pmTPZfinjHgj2/d4hz6EHVVtS4ECris3LiO/vJKoxEfYrc71gfWDedJP0F3ntgMi9jdeYE/tzaReQJ0yohUjkhTF1pYe+8DdNfeRc56QvlhYnqw6Vb9pS9nj4V1nDXfNKMxV5QI1Ln94zHaYRyLIvo4cnI1U0C6Nm0H0D6l28lAaeeZOn46jiAK6HS7mO/1uDh16lJsDACTPxj1nYq9Ip8gp41VUeDvkyFPrGuDVSz2erJwUNuANDeQHFFCY6/fGLD2jp2hXaPDExLV8YT6eoQaCGEUbk6o/Mv9Pra3X2Br8yk777rG4sa6Je9Zr9zvL+P2nc+ZMit0Lt8oGq8CANhwmGX92POTMjovGxOJ1KO4vmx+gTemFBd5eLAfjZd4HKt3yPh0iPUP1/HZ3S9iLvk0+aGWDEy/mkuh+R5b1187ckGouXTv9/de4y+N4Xvy2yYePniAx49+wcOff8LjjUf4dWMDz37fwuHOLsrjIarjEbreoedIagJ0W23W8PqzgmU5tHlymgVPEgsaD+ShRMV/XpU4Hg+F0k+smCxF/+YaPr1zG19/ew/ffX8f93/8AV99cw+ffHmXu/sLy0tslOb5GZpwsU/PmbfdrZqTMgU7xQyTyuOSZWj6Vv5f0X1lAODCEaZ/q/lx7r+795e9/AWm2NUAgNmXd43iqqmpjopwmVNMnuTPCxSnYwzfHuP06AhvXu7icG8PJwcH8Gc5d28Cd8lF6+hUr02bRmID0LguSF9NcwwzflKm/x8enbAUyny0El+fE1MSQ8pygXR5iQuw84lsqEJesUzN1DiM56cSoefnMrSX+tz5p7HGRnlZVneJgVoCcImpE9Q92GtMV6UMnFAjszArLPu3rZti7Iko1WJ3+VQYQc3YN+6CaJEDZbwl6gPA0XwKCFRWJGiRCe3YuKSOYEuUCWCURTMrjNRTPT9jB9pcTuZ71jHn76gRhHT8Sgva0kuEq48LnuxVWMZTqkTQFjFbHBFibBMV9MQESAlYJwPH0RmzSDh6S9ctMu0LdF+pGaDAvXXIaoDKxTFhRTL/qbzKDVvy/2gc0+aXTXp81OSSpxJ539B+jEz+PEUKnhXoVECfivzTc5QHb3H6+hA4zeFHJeayDgMhtBYGK/ZdEmnTtv5GoITfwgBwCgBwEVtVysJrdLbjOLSNf7O7qCRYPXfeWzX0wFzgtDu8pgwP9oHyHN0kEZ5XjJHT/YThPSr+IvM40rPnZY7VdwaYtNoYVhNmNtB6nKqJbs0LEiM4KdYzHB0ccfNlcHOVuxa8nyCaNhv4CfOFAACWprDLv7wriGeQvFMpLG3Vpb1BK62TLlQeMTXbaYOI6cyQeckpyB1U5jaZ5MqCCUzj7/WW0ModDl/tIWPqfBWpIi6C5kEMhKmgoOsyGvFzOL+6iHShhcKLDwLvaWnPSBphYjCOz7npQRGABM6QZMHGo9d77ZyLQGvwF5kZzvYzvHfWa6EGxdS0MGaR0bNNU877L/LdovmFfHOqCQMcqytLuEbFez7mvU5v/hrK4Tm2nzxFqyqQBQF2JLcnsbRzvgYEw7KkoJ2hoBNgYgAAIABJREFUtbBAAkAEooOrGXZi6w9RsAmAp3neiRzYQBwjKvK4dbWh96zfGFQmIb9caZKWuMQXkxzzcxnWBwMspu0IWDBIlIp/1cvnO9h59jyyxbRKaHIyed6qWF5W4v2P1pEsdjmkhecxp/NBIjWHveombaORMFPQ/hsAYEyAiSYZNZu/IRbgQuPnWsb7+FlOAQOm2FdVlFFbszjTWEDTrUcGQKi185XWR6Zrd05i1On7WWPZpAHRED6VwFB6tqhuYyCMGdYu+lvZ2mGR91Qb8fH12Fb7zcbYN+cyvuWc6CaML0l707mMARGJLzRQw8AK/ruOuyYAIAyC6cK9uYbL9STfMasr5ZrZ286teX7WaI7fwWLitXA3U3u6v2U5wT+kXclvG1Uc/t574yUeJ62bpjEVAqQKTogDKkgs4gJFXJDggjhw4AIn/kGWSlQFJOBAVRWBVAWKoS1ulrZp7Hhszzz0296M4RAQkeaQxLEz87bf8i0rBYD6xk0Vv0yoAKo20A1RdzywF3o9KE21RB44gj4SvMqLOJepr5fKn/ehUaEw5f1QBzKZimfJQV/btzl9r0qrQgLNrxN3phgwdKRWOnYm+lCuigA6tcwhyJ558ttDzFoi2kebZZe6/MTrnc9VEGNVfdkqoMRpovek5zSbCWRdICBZrY2gdINMgzKqanmDwXMimzFH6+DuLsa/7Ioasashd9AkkD7w4P4BLr74AvKNAXeZSq0iReXFUCBEG/6pMwNsbm5x0trpOHVmkcWceI/a+cnUE1U8fIFFscDP167zYbIsJszZI9EM+mUkL+j8NAYXnoXr9RjiVwrqrY6fcGJ8n+Da0Zkjg4C7KZXPlgWmt29icbiHzBFzu0LQtKjSWIPCARbEINX/TkAv86y+SvdC90w8bOrSUCGEeFLGWUr0KadzTFVheS77gCkFVxFsB0iFneFjQ+S5zP2gVk60NsinnUTdzp1/nHUAltq1hgakFlQq2SDNe2Pe8/MujW9FhYAWd9aPjye6SdQbQ4gZFwZ2747x8quvYHh+mAoodaZ0cgEgFce8dPiC9wm+tHpJAcA1aDWxFChd3svx684ObvxwjW0i6Y4EqqrdKfYonePSW5fQzXuSAKt3bko6onUwXeM/bR5/Tni2zrMiepwvmT9959aIE/5vvryCrz67jK8/v4yrn36B765cxfVvv8fOjR8xvjXCdPcAnUWFXhnQ9xl6PkM/tNln27O1UGABIgqYqDK9KObMIaW182gm41oUM076KeEPvRaGF57Ecy9dxJvvvo33P/4QH3zyEd547x08//prGD7zFLqbp4B2YIs/ARyXDY56pTBKC3DL1GnhogD78MeVZ3BiAnwChP7/JtirYxL/c7e/+fXP5P9f/H+oEQYKUNEpI2uHCnDGm4TpyiQVcYho2KMjFjR9ML6Hvd/vYLSzgz9/G2E8GmH8x21M9u6jnB6TSiijP4LuuZE7D/PUGe+22owsIueAViZzfevsWT4Dxw/2cFTUlppoFCGCGK3x3k2FpMHWOcy8w5TU35dysTI8Wa3mPVZbj92OdP5J/CwTjj37WyvXXTPj1WfVCARsn6H1w7o3KjLl1IWFeKKI4kku54XpZmgQZNx60x3XRN+Zr3+6GlD+BrQ/wf1N/Iy7pi15vf4smuWfdtOSDWktGiOdZ+2gMcPf6AeaqAeX6RkshQPiUZMyOzcO1CqwaoiccxRhXNjokK/1uctJ8Qxp9xi1yMpKdI5kRkviRLxkHrqbLTDdf8D7EYX3a4SMChm65AnPCBOxmWM9osT9j4nGZlebzzv7nVjAOoWEehWPorOduuYUY1ChkDr+JF5ZFQXW6VxfRqzPK5T3HuL+zRFm9w4ZVRKWQC/0kLFYqhdNBrVUlDEWiHCyaKSkllxmCG1CQo8dEv2LmBGMtlRodEQjmUGN1NCuKK3xTrfN+xorcGuhximCBKo5RJ+3dBUj6DprOTqujaODh2hjjlayvWvsPtr951iRu+CB6TpE2aLZsba9hWMfMeOzVHFkja1FdBUy0YhgccU29vf30V5rM/qO+P7U/Z4VU9b5aLVUZ58dcFy6POtVaOHK6/t6baqoXzxr50hlV9ZVo/yTcUdP3ZshnXve5bx0/ml9sI5ExtAhFr7Nujn6/QGODqeY7FIX3DP1k17rK5caBfQJvazNoraxWOBocojuZp8pRLHTxoIaUxARR9Z4oL84XiAWS9bOgh5N3NAjioYPihiNySmB56UJ//J+o/fqRLTU9mQTzyMUA1RAkO1IqXilaFOOPzOvyAixYZzPp6zNcLrfQ78rzcPB+gY6yHis926PuJAbG8LYjdmILhUXFnMuAuQbG2htbDAVoNQFx/S9oPsjaQtRXFJJsSNawlTVcHyo/kEzOUwFVm9xuZMYyCHFfnNUmBwd4untbWytb+gZUM/ptTzHbDrDT9euoyRqkRbLyrSufHJgYzHY4hiD4RbOPLGNIlSYlwsZo+BU88UWi7mrqch1udR4yyWYOOVPhmiwXIubnkTP1nwsCbs31P+tq228foGiawKsIqi0704nkwaS3KX8itEA+n1NLwgreRk3kZPlnwjzNYX/oF7+ljgTGsGo2VArQxj3XbACkpBHSfrT60Kds3LxWeer5LSS91pzt06u5Xmyfz7RTNRVRqbuamwjDWIpdoqloGhgmJaAUSVYR0FzU8ux7Uv0yUQE0LQZ2KLxb0gFQiLYmJgNr81XYaDVgvUsSK3j4L3HXwAAAP//tF1da1xVFF3n3DtfSUybTEwwpdCmtVAQbFHQh4L4oA++iIL6UAQf/CH+LW2gGB/8oPhgCFptQIhp82Uyne+Ze889svfZ+9w7NC36YCCEZCYz92vO3XuttddK3vjyzlda3PnKzLyPsWmIJz/ILrLYLHPTa81MtjNJ/msS68BMtLiLBhmYDTMZhZeL0An7GoAF5QNVHaBz9tUToI8r+qwARVwBDWKcIS1kOcdtubAQSUygNjlhXl9n8ytunyILgbia0sXdbDYis+7kw0KvpQ7/Mf9YGvQ4J2IFALCGUVbngvwkmDiU++OVHSCz1t4Yj399hIaYpUeJtbj2MzNRZFhaauPSxg04zDr9JwKm5IKuXrt+jfPt80xu+N6h5F5tuYoah0k+4RsYFYaUh/77zkMcHxyiyMehLCIDF3bU9+ijhtUbb8IstJHLIq4jACp7Q2XRO++LQRF28nUSKRRUDpTfn1IM05M9dPZ3YcwQzcSFm4wU50YY9EJQ6VZa4EIjYUUAx3gI20SF9+LFi/zhMVFpUHIDZQMdZoWcoHvd3gC9wRTD0RStuTrW1lb5ZyLu04T+kyfCJJ9yEfPSUpsjk7y6l6qJiTelIKAyLx/e3slTGBtGe3kNOzu/YXtnG826fJi5KEyiAqPb6eHKxlXcun0r5mT/FwCg+kB00z3vKUb2IRrGQGa3ajw7SDL5H+5/i4xizRCaJ8OxNB6Ev46GXbx2+3Vcvb4RmAIBmPxMATm7QVEyKFtVM3W+Xnt/n+LnH3/C1jeb2Nq8j82v7+H7re+w/eAB/vpjF53DY0y6XbjBiOd1iSUgM0kyvUpF8u2J6SN02QQTQXbtJaO+6YTn94fj0Ox3qQg0HkurK7h681W8/e4dfHT3E3z8+af47Iu7eP/DD/DWe+/g0sZlNJYXeH60QAayF6TYFs4wEAd+X43ikxQExBg+lfHp97NmeCZGGTzvNP7fCoDnG/Q9ow540auc2/zjXwAAs4+rHNFrI8UNWmiwrTD8xM6Oen30z7o43NvD6ZMDnOw/5lnazsER+qcdbp5y8nMowDF8TQKZSOZtBZAsQlQjMXpsZJsmQVVEaz8ZPI5HcPkUC60mb9fZYISTp+NgBDhT8kMFoLwn/dEIL6+/AhIhTymnl4y5yLiJwIVWi2dEqfkyc02Y+UZIvkiTGK+HarH3ouMWFW4Qnkxdrn1ka3UthLgZK6trrUZnlRJ7Ze+RqLy/lIXzuVWzysRWjPkE9K4a21XUA1UVQbXpj/ugQIEP962qkq9aOMqTQ8GZBCNBK42/M7NztVaUB1a2jQtCOQ5ccLkimgs64yMUEABjMSctxOyWiqnxBP2zDjOp9J2S/NZ5btKI7R4OR8FNWth8tih1HL0joECokRSQJgUSR4WSOWUWisRUDD8bVGOMM9TyAnNJDfPUzg4mwGkPQ4oQ3jtE/nTEniWseKE4VR/OkRPVXJQ6y3XJkm+a70XBALtt1YNxRSMw/1PvmMxhDyhymDY2XhtR6ab+DBWmNDKD53gAFQIEU1RmwWMtdVYp0Otn/TMQjF5DqSb0xlbWmappbMHHdTAYIFmYZ/f3KZ33SIYKcy0mkbKVfEys3E2PTo7QaLXYLBhyPRDITp93VpOwz4V6XRgZRSnBK2NUOi5RirZUV/Jx98UMsKWRetEryJsSGBdjRS8GufT/OasMUjRai0xGTTt9jLqDYKZIUaHWs7dOIYh6QoyoCYqzSUZr0jEWly+g1V7B2HlWjLoCpaTfCRoxzZH3elz7kYqW1j2v5LZXEsqfowAIx4lTr3xRQhEyUqQjA+pLQkpCG0cMbQXADnUgGdv5bIr2whzmGnUG1FoUHZnU4cYjPPplB9lwwOC6FfVDGXNb8HWjhuMEBjXbKyiIcEvDGIBK/um8Oa99j9yjZYzCGzU+NApBz8x2I+47BCAo1PMyqKGIqDRgpdhSq46Ny+vsBWBoJNmmkgqSsEn1/sNd7O3+yX/L9HWl9mKCKw3N73jseLxh/eYV1BcbsM2UVTD1pPRRi9e8yrQl7YWbxzQYfnqJZffaZ0kzrRn/1VlyI+y9enfozHou7L7+zoy9eAYUOvMfJf6lIatB6f9QAgI2Po8d+8WIsOy/SoJYCeG6xMHXpKcrxGdlJsbQlzWk3idsJXM/Ag5qbFlVpctxDJ53migQSJpwfxR6wRj0ev3KOHgYU6Dt0qZe7zdMsMlYBr0HKwYIkJORgbAfZf+tP5WYU9BERwGiYoONRCWZSPpyVdewX4B4BCiprz0+E61Jgn8AAAD//6RdS28bVRg9947Hj9Sv2lXVplAQQkKCBYgFrFhABYWKBagLhED9HWxY8BeQWPFbgBUSLJBARSBAatOGpmkejRM7jj32zEXf6864D0TFIsrLGtvjmXu/c77zncMmgNWiwf5RXvDFCgHA8XpF+TfvS3keuxHmwv7FN6NsHYFxuDLGj948dexpwSMWh1gMk2gwQ5Iv4wmIjo3OfAhyldyvSmRdibLk9Xkx0bHXx6Y/Kqe2zcoIAFYgFI8oRgM0liKLszaiPqhFmQqdo9qKk2YSZ6pZwlGVwBUh/iyPSRTlQ93ll6jnCXZ+u43iaC4LqCuL7cQLy07vhGb8X3r1NTROdaPBRK6qA2a88iV3nM6eO4d+vytOujWvi16ukv1Eiz+JSUv186WOU6vZxuaNHdz84waW2THXn+TQSZsEyQnHRYrWxZdx6vyz7LJca5SYoBzxr0jKffXCLl1F7UNk0KQ5wwAVOCmS/QOMNm9ime1QKnZ8vAtJZF9zzeUkz4R+k1hwhzqzZSkTGXNaeFsN9GiThxkeW1FuEXWygNN1ecKz3ZTXnmA8ydjAi2RbZ86cRq/XQVpP+HcCdAT6iD0nYd7ZC+tIW23upLAEFhZr5B6sbaUg9wXnAEtXXLLr22s97qR/+903GE+m7GcgYxFi/EWzrcfFCfa3t3H53cvoDAf/iwAIOlqy0l41L4B4jVqeNS2Q2sVK62i5BNe//wH37mxKQgVkc4GahU+yObr9Nt56+xLLKAki67xAOcNX8UtYfb0Co2qo8fn4+suv8MVnn+PnH3/CX7/+jrt37rA7t5stGcCxBxOtM8RaQ0AdbbX5Ys73bWKkHxXWWcaf8XQ+Y9O+hQ/oDQd45oXn8eZ77+DK1Q/w0bVPcPXax3j/0w/xxpVLePH1V7D+3EW0B112euacZ4L6JP0rxI+A22RFrteV3mOWeGEKAG1Ti0P+Kt3x0Dy906vzIav98uuhz/cJZ/IfjyX/3XvgvxwhHumx4B9PTACYfNbpaWULJ3KSHk8wPxzj4O4uDu/uYnvjFnY3bmO0tYPZ/UMsJxOW+KcM3ApWWzGQK0L5nT4aToyRWCev+e/OpHUBaFKU3WKB4+MJpwSQX0q3f5rDSrf3d6mhFq/cKpGltAJ7RYyyDGvn15FR8UxdlWaLo9E8ZYqr03/eSFnGutAOu8TfJSvqqio14x9YYCIQiSfSRXkEAQQq1tlEruZ1ntXF8+pRgnczV/JJacBp5qkFLOWhJAge9WX3vKsQA3Hdty3bAKUv/28F02pBVBa4ruoJZCZ2+ny5U/MzE0tERYaLkmUe+VKglliaDxVZVFtot7pAed/yQJJejrm+XqLeF9MpArnvT06wPJoCJ3Oeu2fpfiIFcj7PmCzI56Q0mvPvpE7hBBEG/QsGwORZJIkMgcn0dqPJhHadRipzMfdzxyfA0RSLnfs4vrGF0cYmxlu7wIziI1OkBDIoIcaJeoK7/97SkyoATkcBgiYCkMIkacnMOKsFnJjoUhoUw2cq0BkT6zk308ZoDBeiQzy9F+6OBS1Adc0LSnqyU0zqmWAgVQIZXlIc7nz/AGm2QMPpyE5J00uzSGXy0jQIrKCgEY6De7sYnB4iGXQwI7NLGs2he9prga99a+h3H0TXQUB5b28P9WYLa801pM1U/Be0nhVCCyuyjeBLEU4E8lZgowT/ha4b1ejRkupVTSDHXMoJZAE5A42c6wIh1ugcBU6EIZf+zqkBDveOMNm7j2aQgVCqD+kYTj0GEJY8wkDHwWyK0f4B6v0BGt2BRugmvE/xDHyiZma07pEajkYvwdmnYt5bS7XODisEQLxfbbfzSm4E8QnJdRbAF6J2qwLUuC8o4WEH5B01LDAdjzBYa2F9OESae/i8QK/bRsMnGG/vY2vjFkLImKcqgqYsuaVE6ZmKBo6z9mudLmqdNtBIkDklKpkYVJNuGAHpVUmWaHPJa01oka6r0vCS3NI92udKItSsZYOE1pJshKfODnGhM8DAr3GiFo37hrpHv9fH0d/b+POX6zz2URGyRQIA2kSg1I4ZCgyfPoPBuSHoBuHRFI2asYjvGFNos8umwNHXbCMZPtbiJRguKl37qjSdDcXr9dj1z5UAiI81MsGaxkoiGNaz0QKn4D7V8XGJ+quovVWOXwX/omx26vzvxWctL+IIOmw/UvxTxYAh1mG6VySr8+/2N5H1C3ZdqT2iWZ4oAcygsPoc5MhP70n8AMRrzfwR6FyRobp5DXB6QE5JeGIYaEr2Rz6nEh4SYygjDQb4q80XUwNUSRNRQZCPGY0SmT+dxWHKNcLP4xz+AQAA//+MXUtvG1UYPXPH9kycOmma0LoEJKAtKhXddIEECKlICImKBYIFQrBgxe/gD7Fgy45lC4hVaYVQoU1L2qQkrR2PPfbcO+h73Zm4KiKSFSUZO/O4j+9xHulb31z9FjheXW8GQGgalc7Fi4B5EDKkRzgtUB41ddoXihLgf6ADknkWvlW18U3wy5Vo1yAEElPXV55aCE31hW6yBYHiE4kG8t9+sHqzuCOuFIBuq0rilFPhg8A0nHOx2tP2a4QO6m63o+doUDcRbzDuh1eRQOP31yECDmPQVNctH2GGdaQcpHjd0GjSpuii61M8ufcIezt7sueEZqJyEkMFBwBFWWL7lfPYOjOUzULkbtWTPWH+Mv2Ur2TYJoh616AjjfI9q9Qn1hmo1SrDs4IyIQHDPMPtW7dw8HAHWUdcBCqtIhY+RTXYxssXL3OgUFZSSEE76KrbS/6z8b51v51m4TwxGBPm0AtAPp7i6OF9FId30O/MZVyYbUqd6MIjlWfS7xn0EpwgcYw0YbgujY8uj8kKg/V1Ec1QezkDt1n1nCG/izlbLFHBh7hxtMGMRxOGBZ46dRIbWye5I8KQN7YanLN1El3AiY1NftXKZeXxq3YIywUACUBrFvcTcRopSdB6Nxy+iJ9u/Iydu3/JoqneuI43SNEGOHy8j4tvXMDlK1cAE/JKEBcG22yf2yGOv07++6UCjwkaL1K26EodVrMMj+48wK/Xf6EyCFfpy1pEABcqgDYaH+Cja9ewuj5ouoJaGDnWSoh9neZne74Ek/zhu+9x48fr7JdOMEcK30iIK4dDnzYVCmIIwp2KLzLN9Z5aMhKs/6icYjSZYFF7VB2HjeFpvHrpAt758H18/Nkn+OLrr/Dpl5/j3Q+u4s333sZLr7+Gje0XkK/lqLOEPXhZaDARtE85n0U7GqeNTbO8pEDO2ZzWgFUopuZs0CTnEQUQk/VwbIFPsDRwnvcY4+P8P0l76/D//8nPPc6C+7b1n11DWOoA1kvD7VkZyObLacLlFA7NwR1NaFJkp6SpmGB68BSjvcd4dO8B9u7ex+Hf0uEnq7BQlFhJu1wMcioCyF1Fr0UaSswI4h+kO0vreVlOpRPYTTlQYU4iFQPZCcJjSmrr5QyLciY842qBzc0NtrkbFzPsHkxUo9sUpBuRwsCn7jGZz5Gf3sKM1oiVPnqDdeSkUcJ++Q5zGrMk8tRVm6mOqOhb0hoLlnZPlU94/ME+G1hEoJfudU61PZK0ve8H7WwqD181TRIT7EPD5a+1K+jMm9+47tYVXkIrLAc7zR/ar2bEL3f97TPaAQwH9FZwJdi/k2TXaxGkZZPCX+YT7bUTGywRoGuj9/N6QbofXvcEFfhSBAA07o8aN95jPeujJhEz0pc4KrAYT1EeTXhsUcJPuiV9pOjVRE8jlxvSFKA9LDB9gMRHc3LWIWRSUPR3qFmjpFPVqI9KVE8nqA7HKPYPMd7dx2T3MQ53dlHsPUV3kSCjbj8VtSjBSwR6Hri73Coa6V6JVmGKrpNsGh0JJuY91F27f7JusYZEJUlc1hEtKCiaq7Yu73JnVNGHFojaIw6q4h60wcCFmsWMEX0kpkkiuCjnmD4ZMXqrh0ajJ4mkORlT3ilyhdCXtJcvPEbjMc5eOIcF2WfWjbJ8EgtkSSzIc3FH5xBZx+7viTvAYG2d4z/aRxaqdl6bqrZr0xlaXe5WAcB4/5ZK+CWK1jJFx87BKgo+kujlG8WHPBYp/uzlWDu5xc+Z6CdU9OxyPCDC2nywlUwS4vV34EnwrwL+GR9h88wZJFnOYqL07CjVz8h1wGiY7DtHY7bk/ZuSsxU6vjbcXsI1bkFoWkVEG2i6kgt60kX/dYb927pVG6JA/dFbHOmosU/xJ3WGq4Dt4VlsrQ7QCR79vIe1lT766OD3mzcxL0aijxWcIusCmjOSfZDmcVF5nBpuwecdlE7sGUXh0VCNLiKNYudcKaRcBCK0LHdhm+S6DVl3KtBsDaTEzHR50nlU8wJr/VWcPz3EoJMiY1tFQkiSU9IqNvI+/vjtNu7/eY+bGFVtBeRElxfRIKJ1eDIreHE4d+k80rUM87Bo7QPHgqmIvKFGarAxBYWwa64k3WQfx6LB4w39bYm+5Wy2h1B+Q6/2+4wibVoBUeFeqQGCkk5VuE8g96YBkEAg9WyTWfl4CVY0MJp1rU4SiR7nTMRPOe2NE4n57weZj7qGkKCeobjtOiM9WwuXlsMZXZ3ul1HjrIF5XHPH9C0a6oA5KNDvqWHaRiCIvb6I/9G+bkgJfp/qODAyTekRVgAQZzwSIc806ZfnwYL5+r/sWck1yt/KuSA3BBUuZ2wUixAC/gUAAP//hF3LbhxVED19u+fZNsRxcEhCojgRhAg2CAkQQWxAgHhsworskJD4DX6KBXwBigQCKSCBrAAJcuyYwR4z7umZflx0qup2tycLbI0cKR7PzO3HrTp1HvHrX7z91Wq0lIsM7YVG0BhOJh+AdEjRT9SwBp3T/b5oh/g74sFjNBfJqu4pglhJHEPQIkAmaHXdar0CghyZ5p9AgrMmif+WbGVxMLbcSaKevjIjwSeLi3CyEGv2kscaK+UiaGISjYiIg54JaFC02AqkNgIlOnXQ26JWYw6dUSqpIaRuSrVOun5CjSGbARodFVBydajWYo/0O74/Vi0iK+Cse7bA/Z0dREsgdX3RQMt7j21zlwhrBRtu3rwhmyizoxPfAwpecJFs3HSN5BpvX7+meh+jg2g9YCh/w0AwR1uvhaAe+xR/7Oxg9/5vcGUhAIEYFXnqWSO40SauPH8D0agn+bWiEAugkQ10QrJMQ31buV/5Do0zAhrWA4uAFEA+2cMh0wDqORKi2800x4srbGTlAb9G1GH2Ek0tIC091qgkb0DRBg0Ra3XUr81QpGk9hZYz0AkN/78qUS0rufimszkGozGeubCFZDQUR+UhCz/f+lhwoTcvXkacjFkXynXgmy3p9MbfhBSFTFaoHjCRTXcNse/hm6+/FaMe6QN8hSHReuEc6Jo+OtjFhx+9j3E6NrmHBkYGc8kw6Yoa1V54LddM9gPosgoCBJlFQ4SzoruXDBpXUdcboF/H+P7uD9j/53GTn+s7WrZsdoy3br2J7ZdfFPDC1arB1ICSuuMYDYNjYBu6niSKSvcxefAQ9767C4bqjJOBTLqo5WfmNV1HCt5oGeHJpBFoZBuZGWQl8Nx89solvHLrNbxz+2O8++kn+OzLz/HBndt4471beOHVl3B2+yL6Gykc6fxkZcgzl0oDNUMpF7LHEXJWOzOdThPsDHppmlbLzJcsf786C1pd+a6rfQhD7DzD0gPCw6003/8D5zzxWP2qrdhrIIjmhTu+BY0LdW2fqbZ3ykdpxzZM/ly7IpFSjnmulpZYwigwTkqdFQHiJRGrVEQorpEW93Wei1Yym0xw8GAX+7//icO/9jB5sIvpo8c4Ia1/vkBc1WbCpmvJ3lYMwzi94JSFfi55jjzPlM6fz1EucmmCi3ppEXZeJsP0O+FzsixHfpxhNs2wmJ5I1nbMvcMXSJyXbPg0HSMvSuxOpjhalsLoqe1qjC13mjUh9wtO9Nz6EFvbV5FsnEM5HCI2luicAAAgAElEQVTndIaTKTKL+szLr8yNP9ZCN0zOO4O07l6tTX3HkCm4i3sFbZUY0tqRN2dKFIqbWNMHOPGTo1iZeWDYGgIjRRs4YcAYK+LUhL75Gb7jzv2n/Q5u8aotDp4p7cYRmalwkBYEXIsMKN3zI3mvTErwkjOvTY3oryPXpON01yM07z7qNF6WvS0T/Q7bQpl6VXPthmhXoXWbu3lk5l3h/KVERNLauXfM5yinM+SHRzKtd9kCvbxEnBdwnEwWFfpVhQHNBVnMMo0g14c/mYsZcHk0Q7Z3iOzRBNOHjzF9uI/j3QPkk2MspydwJU2iRoAb0k0PNfcbUqX5lmxf0dQjXUCpg8RPQteWdzi31pepP6n/rp9YfG9rBinGhE5NSsXBu6fmir4DVSbOaOCNsZiXWkfPkc4qc2Bi9ykpcGVd1WMhrpThNkhTBWz3DjAmU9QvhdnlraeJEY6fvhZlO1IPsHEk4zEr8Nylq5i7Ieqob9eEa6UwJt0rYqPNm16fj+nRFIdHU6yl6yLJGQ1TrXu9a0yC2xSbAMIFxpyxETtAtrds764kJgAxLQAaB4MDG0BpZRMYjgKAWkyfpOGwEd7cxCge4nD/b/hlhoRgSzMksFd3Kl+lwSLZGGSlUCK3cf4cxmc2MCWwQLCo7oBokZkA8Po6zlAez5Gzoef1xaEGwfX+ALWZtcEYsSFnv72Hh/0Q+nmc3oPUm8Gux8bzIjZ2o1gOS5Qh66qTRYk46uHy1jk8TT+KZYEzaYqtp9bFZf+Xez9TPSnAv6YYqNSiNqBV92iPKj8RFkp/6yzceioyCGFANDJdZwCW1XFyXVdSbzkDiULCQdSJBazgW2DDWH7dgZezNZid5HIMr188jwtrG4ht2OXt92m8WBYFfv3xJyz+zbS/sBPM2d4RhgcicUOBK9cuo7epyTC1DPCMBeFDhLJv77MdE9XahqFdyrkCogowaGli3mgmPU6SuOl/gqN/mO6HQWnr14ZTVHTxGZC+pcJwOJZj6yVCt2fTbwVDeJ2UlfaHASRUMKCQc87ZwKmyxr4OQKyBxN1mvgpZ+KGe7OxNodGOzKhd/oaQNPVbDhk9rkBmn2bv9xkjKzH2+pmVRaVrxnz+qlraEJnebmzslSXPGkb88RKavRu4V2nvFIba/NscCDABI/hoKPPWiX8b1y3IFtSnISTMtew33nfVJ0fBHYKWIdJVjp+ACREWTA+Qcy8kytWoqxL/cXYtvW0VUfibe/1+JU2UtpFCoS1SKUiwQQgiKEJig1h0AQtWrED8DX5aF4gtK0AE8oA2aRwnThw/r+17B50z58wdu66KsORFEsd37tyZOa/v+078wfePflSnz0E1Ut9aYaGdQMDDoIkh3qyiBBQKHyr8KwTFtY/IjQHx4HMuRQ6DYNXGgIPBCsvSBgLC64dA9ShwZ6pB9BLYPpRjb3wVQfkT4eSpmF/mK/+RCA26McQCOTES9PNix6LDQ6J7dE+e77L0WobLhBU9K+4yVZqoN2aBoXYRw56TUYLuaReD4z7KKQkEOgNpxfngA8gaXPd6+Gh3F1GRFio5vkV3qIswILdlsxZ337yPWr3iwahhBTYLHCzP2+fDIObky0XnCk/3fsfoupcHeVmKaQYM5gVs7txBY3sHEyv9grUyJFX6/H5XPCdfodG5cUbICISqFVdQnA7Q2f8F0ZgEf2YLgU4sR+VcUuYEF7vRqKIUZUwJIONE/fvJaSHHglRlFZ3ChitAu2SS9OA1yS3tnFkbTxJcUgWGWv7d2sTm1iaPQLlPZGAyO2MD3dy8jWK5xhuf0RV+ThcTAN6JkOo9K5Xzc6GxFXFz4zZ3A9g/2kOJnYEsNx5SHbi8vMCDtx/g4TtvwXJf6KIX1fPU8eDaL3sGK/ePDNMbbK26qYthnPO/Xl/D4eEh/vr1N66Q8542VnrvOh4nCUp+/Nknrq2YKfsKRd4CNMgYIaiGCz2BlLc3yg38/OQndE87aFXqbIyqlOhhscsE/eGAr0sIBErQbL9xB+8/+hBffvUYj7/5Gt/+8B0+f/wF3vt0F/fffYjWzQ3YkoEtU9CVIjVz9yYoHwsyLVfmg1cI0TeLPy+/o6Xg/D/MfHgh374q/9XieP6HFt8rrr70/cvjWnHB/DOZ/9ma/C9GUD5qE2jt0NlK/EVuwRYJHJdQFYI0oUoUOaz9M4L0n+L4739wcnSEk4OnuGy3MSQBtv4A0TTjahFxk2NpZ8rQQdIy4aB/zs7FbDbFbJawOvNcktFR5AykFcg/UaaIaz+dpbznh6MROu1zVgy/6Fyi1+ni4vlzJKMB7HyCUkzBf4xWq45yrYZZavDsqo+z3giW0F1URQjmg5PA4nhS4nf77j0k1RpGBBek4CHSZJzjAfP5Zh3azQfJIYoCOfVOoYDLiXDf4jRIPHmtGyxq6OgnWGhIUAGxJwJngVOvkM0Va/pFSMorV5wmDvSjmQqfBsmFSILZzN20c3pEtZ4V113fQhf8mzypbC0Wvl952n506gyLsw/RWnDK0EF7ThE40yNKOfuxGE8f5pIfwNSUmKG+lLiPZ5bX6oQoKucXGHV73HZyfDXAsNvD8PzKv3vtc/TPurgmeH+nxwmAcfcas+sR0tEU0cwSRhClqIRCXObkqKVkKNNDYknJBfB8XTNRkPjQVlvkz1HP9WKuL8F3G8SpRG0kLQPX1ajo6Ry+54xU+LLgwRvzIuJNF4ZSTPM/O7/GCMKiUBWNnWHCLVpr5G/aRVFAnmcXyXOCxvkADrnYJ9FeFNC8tY0EjsLA3XqCij37g0S/ixyV0Poe79QBaIL2sxNUGnWUKpU8ARveY3AGWrtqv+V4NhvY0lUvb0/Z/7BLXeEjpiWFrRCTCCjVamhUW+wTtg+OmBpC2hPNYpmDEaO+kPwTJVmJKkfaKMQjr66twzSbSDjUcWuGEgAeKs5hZ8HpUxAdkjR+IoeAVURTyigaeB2RUPMpnxv3vHUxmDCpbKTgJ4WyBVfFFFzVG8DOxjrqpDlEaAWmxJSw1qhh/48/0T09Z3pMFMyzDRJ7vJ0FtVzauIGU9A+oQurPgTivEEvFH5nS9DKBpIt+iST8XOCZd8HwsY4k2TSp6VW9CiUuCK5XC3j9tS00ae8GK6RWq7Og5/HePg72D0VQUM5FmTEteBkWA0x4j2zd20HcqEoxTec401SzfwbU1SGMy4xonGVZSKGKfFxTLOVxl6N7p/w7FpqT9u/ekqzQ99DAnz7HqKFy1anzz6aCUnPXn6dzjxBS8T8djxaNuVsEU3EZduJh/2Y5sStK/Mrlt9rm3YjGjBe0joRSYDm+HE/GgZilo5ZrRV9fLAotdHNKBCg9nk8csu/kgwoyhM9Kujcds5+jfK71fKT9zihj0QrQDeOFGuX5cGwgz47mRakA9CIfWKkPet8O7SF+ltgjj8YI/AQa43w+x78AAAD//6xdS28bVRg9d16xazd2EmirVpQWqQJ2iEUXLNi1FeoKgQQLJBaIH8kGVoCEKgoU1EJ5qCKJSuK8msTOeB4Xfa87100rQMLqKGoST8Z37tzHOec7hwEAu5FBohDFQsQXbgiL/YwGBGLhY1Siq8uQKYI260KuavyVxt2YRwCxG/RBaNFBF0udzpi2ipGRxZgGqafvZHt5ni/UuMTzjTnPmsslxwRmEqVgNymNHBUTpS+79uikIbZJJAm0LJrkQSsU/GATQ+8XAImujGLxPNYJDHkklNZR7b5+j6RXtBE92T3C5MEG+jVYPphpdmobHhqHWVni5StXcf7SS8w3iRu/ZxZUYkzAi96VF1Y59zZGKw1F69hFRB3U8wRLC8GkSfHg+x+xsb6BJKn5IPasbDxm9HvDEc6//gbm+QBdsHQQwepDpei7i2R0iYtiErXN1D2fsXEyh/Qew6TByfpDHG+vI/EVcxd+YZhzaqsmOcnDAhj1CtD4UuhCjsoWiCUi+f5weFZYizb27PbRvREVQ1N5Numqa8fmcJTuMBgOsLa2iqUiZ0kkuQVXbcX9fE5xOsNljFdXkfbO6DW65wIAMRnA94SYBjLqaRMMzixjfjLHF599rvK2pptAdQFGNY77R3u4cesmBqNVuHSpM/JEtBlFt7B4eoMXy0MRamm7rFureUpMMRBtilm6NRqhOT7B3S+/xuxwXwxwqEzFyQRKi4TJ3l+4+c4tnL9wISwDCBsRaXzX/uFagy+AmF4SMznMenj06+/45qs7jM5PacPfyiJuabCEy9dewfW338LtD9/D+598hA8+/Rg33r2N166/iYvXrqIYD8kkQpQ/FOFHCH+e6LPcEdxWd/xvX8+VNUf3+L+9XHSgY52eA0Y4//+Y9IX+cAoAeNoLwJ06AsRhC6sY1DHAURURkmaXcH2vK9X2iDb7Bwd4MplgZ30Df9z7CffvfodHP/+CzYe/YbL5GIck6z+aop7NQcij002W002alGM1smCgSbuVukAyS23ait2eSc7Zp4xTaB59LmAfeYTQHEQbfqoH3t3Zx9bWNna2Jtj8cwt72wc43NvH8f4BSpKeoubEkX4/R5aLeqvo9+GLPg7LFo82tzCtZbuYKAcuz7cwljRGz8o5xhcvwa2scs1ybZJ632WgC4CkfjKRpP5pACCk2LSLNYVeo3d97JgdsSOIeFxjUPLM4pYE2E7Ce4TRMgZG6rs7ZUN8VkT/5zIewzpdpwVAkHabIk4/T2I/t/ebX4rTnPqU8/bZ4d+p9D8qLQr9MO6xUSmCzXNBvhpF4lqyDHXSJhczOa8smSUR0IBGbCtt/AkcaZ2P4D3H/Y4XnakkNxDQ3nB9qWegq6mAat5iPqWothLlYYn6kDws5GimNZqjCn7WoJ3WIDdV1yS86c8c9TdKoumxQS/X+Ks8uTX7VN6wpDr+Ixj2kWS+4c+m5Rr0lYqoM2F/Qz9xi4CVRHiJ4SO7WaddrJRTwADJYkwWImApVrwFX4lISSlURiPRf45zj7muf5APMH0yRUFlXTVtR5soKk3uHDHzYVZzMp9UTYvJ/gSD8ZDr+eeUMZ8WnAff6NxurKhBSzbG8nnnM/4Du9vbDCb3l4foL5/he1mpqzcCXXG6gMkAAJ3l/hEAEGbcq7nz4i9S3yeAI/P2HCWYSRAhikGPyQxi6Z883kWP2okX/7WuFyJihTxy6LtVzW1KrGefTJHJ2NplekgdvymOQNHOdAoq+SX/q6qVcpZWUoAaff7YtyBJAyjk0SWOyL9EW9mFNgmlQjYWRFOK13JUasdyeozRUh/nVsYY5xmytuJ+Qkqbk4MpHt67z+a+eTCPXmxBF3gGMvttcXZtBdVgCSeJPCde5Bkwixrrm0KyWbygKUzEUZ2VFVZr4CIjb/088ZjjVKVUlsdIXIVXr1zGuaKHvs4JjqGqDOPBEHtb2/jh7rdMBBrmGq/XWPtJZQ3UN2d7uHjtCkYvrjCI5y1aRM0IXTS+WXlX/DJitKurFy83Ztk1ZY33bejKu2l+NHbfKdP/LLDZZP5CGKeiio5i61rdZHtvzv2nAQBw6UKjRF2qY1P7LD/R8N4kipW1tg/zQnSdqZrHknEoec8RchV7GYTS6PAQyvulDIJKZopgRMwJb7qPFQ87OQ8rtXmtQ3Npt/+jIzZa5L0hl/h10X72d0VlR31T2ovazYxvzQiQ2y8mBoyE57QGTfeCJhmxoWTOinBuB1JfZhn+BgAA//+kXctvG0Uc/sa7XjtOYufRlFRqSpoei5AQ5QKUA+LOoQcEQr30f0WCEz2EpKikeVDHjtskzsN2nPUu+r1mx44bJGgUuWmqtT07nt/re4w1AIyL7zeviv84V4hCUMeDLkgLcjW4YohIFIj+GSTEAkCNVI1VrZ9vaEms1nxzAcKfMAEKDykJxCPkjRZckzFkQpC8hIVkgVy46YUZFuF5Vvh7Zgplioz/o+Jy4ea0m2eejIP+QBATuuknO1ShpoDxZIoDSmA7WSqWihRsh8yxEz5XfjnC37//ieSKcQkCRdSDKdPkSxKzCJ98+pkosmoDINeOOMG3GLZfLWPtwZpYzEw0ALw/z5T5MDdZSlW82nyN/Z1dIO+h5CRBpIBI/rL9KEJj/TGqd1bluUvC3y2m+qEK/sQHePLnIJOkgoH43DV6790OmjvbcCl17Ya6fsWMURhgGXeEs8EIS/UEVTpM0msu0hkiSjoNcYxGo8H73Lgy9oTS4Mo9ooUoFqNU1PkvBwMcn5xzf+PevVUs1BsgKUYS24FaUdJ7j5ME840FVhbme+ULoikIAPiBin8VlNjlKrJXn5/Hr7/8hqN2C7Hf7bZOjnl6rU4TXz19irX1DeVHaZfxRgPATVxh+vpPvj6fRgQKquFv6d8btRr2N7dxsLOP/uiKk0tOOiEBiyDU6w/v4/MnT9iD2QS2ctzWALDJJbdh+aC8u7SMN3s7iJIK1h5t4Otvv8Gzn3/ATy+e48cXz/Hds+/x+MsvWKyv3KjBVcUTOlVlfgqGI2fyS5nXOHEqfiqKtf9vpP6h9fuvf25NHqG85Nv/h4f1/1uzYqpY3wS090bQ18LJJv5msVZSUSeGUuaZ/877PTjimJ6do3f8Hp3dPexubWHr5Uv8tfkHmm/2cHzUxnWvj4gm8qmoqnM/aSQTcUpQy6rHQjaNxlc0d4AiDuRe+4552xkJD6W4PO/h7OwC52cXOGy20Txso3V4hLcHb7G/10Sr2UbnsINOu4Puuy6rbhPvPx8NUIlyVMoOM1WKATkWlxuipE6N5ZlZdIdDtN69R7d3LXapmsg5tTAtKS+YCnvyVZnfeIRBWRAAuSY6VvxL2hd7yzwrZLnYC4srjTGTDQBoYRHGRYvv/jyyWWVWIPZ8IqaWqU61LqCuPDYJN26lCeOZ9dp4Ej6eFBcvLbxHdjZZLAr3ZO6HAAQHJf5ylCTi8x+iHpxakYXXKpZh7DnCRrcVu1Z8ZJbgM6VA9hijogW6Io0nE2RVEcERisYXuxBQQUXoPkKmxAmf6STKl+diTUs0KrKDo8eKK/N3QuJ9jBiI+SthDZ6EmzBJVOG/R4QqI1tWF8aVAuIribBGClOVL4nGTVaQ4UUQkHKwWM5HW48sdCQJrp2p8FQoJGXe1BkKn3CYllIw+Ajugu6zzF/TiyFz4ZKqIw4lvhXUZurMXb84PkGZhTqFYpR5xGLJl+C5oRacXD9Nhzg97eDOR3eRlqssMEiw70yHMJLvGXql5ItUvxcoRyIr4JNTtDtHbBNYm5vTdXXhp2ZsPzvlPBfv+MMNAEOoiiXg9DPcKZTcWqi0LwfU4CRYQLmEuXody3MLjA45O2wyZdLlVvyrkKaWmmZFOhqmuCDkVBxhdq5OVQGyuCT2kBb7KE+PxSmBFPl5PXoD1rkgAV2CZFMxIWfOyJ8n4VTY2eTSoPY6ubC80x6cHtAhqtYQwtfDAedzq0uLWKlVkA/7SBLHugQzcQUHO3s4abWUhx80EfWRzqUKi0SSrkDGOVW0WMewHDEiJHPFzbE6x6mouac/5oIQc7qnqbEne9TcQ6beuqKRQIVYLHt8pT6PB4tLbN0ZacZKhS4L7PX7eP1qG61WWxAfud3DojYDi6Pn6F6mmFuZxf2HHyOqUvNYtYdKoQAwdACjDcys0NMIZwM2sGQbWkV903TcIgQ1ANIgJpjQXxzHfpLsay+a+Ferwt0nzj3XSGXvlkYTdCpkGX5vTWBXFPFWN5mtncUvqlmE++689aA/9/NiUGuD4bDgTrVpl6lNukH/JWSoNKg5AIzRM2U/kUuUDbzlo1HYAjKMv1LmyT8Nq7mAVzFd1uRQxJM1PKwZIHx+yTfp+lyMB7QJq0WZt++HlErVMFcHRTFToyYUtRfkhXzW+HosfC9C9hbbffMGwD8AAAD//6Rd248TVRj/nZnp9L4ru8iSDUQNieKbiUYfTIw+GGLExEQf9C/GBBPjg0CICCywsMXulm7bbTuXY77bOdOF+ELJhlC2M9O5fOe7/C6sAUAHTBeL7Wr0wmR5Frvm5sPvouABAjQBGycoFuKNgr4Wv+FMF5CIEvDBJUA8JrOgZGoBJMkawhRlFeAW3ipzFRREs/tcRwsMntKrUILdtM1jtW3YIkov4sAwvEK7Lna8DFtVNUxLNo2faeITAi1NG4IR0SKCHgaGscDrTS4TAv5OnPhV7JVsVkskBrh8Psf44CVyDQaJ8rvNzocgrK9O5/j0sy/YA5kmAoUKFFaqN7CqCqzrEleuXmGeCkNuLekJC40uqF75zoYO8A55p4WTf5e4d+cu1stjdPME9XolbPSkxrysMbh6HduX30NNjQzlmZh2xCYw41zENJX0OC8P+xeKB9Anz+31EuMnj1GcjpD6larfxgaALZO1Brhh7jHIc2SJcmkT6YgRL/zC7g4nkBTEeWLjXJjasB9qJV7wlHTxqJq0ceoCJ5MJB2BCUuxduoR2TlOBFZQGJ9CnusLe/h7a/SHDgCkZfFMDIAL9ksb8yCunUK5IrzvAZDTB77duoyDVW9fi5J+73U78h88Kj/5WB19+9Q3DrSLc7s0NAOP+W+HrNBAFGNG5ZIR1IILA2LkCUONBd7CNs6Nj3L71G2arFV+DGXVIncD/KYaV5QI3btxA1s7lvswEbeTC5fdhyhhTp3hlaT87l9/Ftz98j5u//Iybv/6Er3/8Dtc+/wS77++z1zHaCdb1mvnL0gIrVd/Cq2+8KLxjgzcvbg4s5IPXVVnf9vW2EP3/YRdAGC5VsJZsHnss+pN4LkPyXofPNP/AikmFetZeUCcuifeR8P9EPIguMMGwa1fHZ5fFSIUfynoHZL04mbB/9enzFxg9fIxHf93D/T/+xJN7f+PwwUNMX47ZQo34+ynDjhO0MrH3Y0FHJ5aehJTiNQAiRFrwRFIWeW7a1T7GMZ0vrc5KzKcLnBy/wuHTEV4ejfHs4BAHj55yoU8F/8HBMzx88BjjERX7S0zHU5ydLrmRmJCaeV2i13HYGXawNcgxHHTQ6+bIOynyXsrqo4756C2eZY6OT/BkNMdK72+vU6RUG165wp7HywUuXP8Q614XSxIgrEsp4BS5loY00QWesSxZUVHLBX5gw3bNUGKa4DYTouSckFWgbRhCjXmKNNkoVZhJ95tIKSJqwxmvMy4qjsgaXIladFz7EO3/3OakLyDA1FaK13z1+Df9Ec+Q1DbH5ZyQG6lAaiu1wzXepLfqXZKGjbU8hip9NhTdFCfYdn6d+pg7Ri0V2nSgQj0l0VdacfTcmCsK0w4oP0jlmCtnaqAyhWdRQT3OWsUL5XhVHNbH9+CiLSJPVM0iMZEpWOCHQm3Kkug0xEiTtKVCjdKwoXyrpRBebtDRJllkkn7SQHUQLbeIkIhUL33LWxMoDeLHdn55GBMgsfb5mNRvnnsfYk+E0Nas0p+wEKMPrgukZbSuEgwG22i7DLPZjItBtmpWJJzkFrGJVNvlTVRzo1xiMZth9/I+XKvN21a5Z70VJVaYb7tRlEgQ0BuZnP6eLzB+ccRxZzAcyvkj0bFK1y6XhCZfyWKJGzc55xfh/rSiLvx+9dp9GrgaGrV56quwc9pj0pLnhhVqqgK9/hBbW1soJlOmjaSVR8e1scAaghtJIT5TqktFX60osJxOOYfb3r2IrNdFmVYoiMusNppeUTcJ0SdNJ4mf8RIlCV3SJNGLn7pXsVD6aZn4sU2htTDzpldiMchps8/HCbBvIADs/0lsdWfYx8V+DzvDLtuvkrL6O70ha238c/c+1vMVHzsXXdZsUEpll5trGVxVYXG2RG/vIipSbfeOhzTQwprpiZT/haaNxkvaisYnFmRVMTV2/2lU03Hyjvg+/yNj5M18OSOwDT6+so/dvKeRvWYkKu132O8zPYhy7NPTZcBMuEYDyKmAoMvEjeuDj64hIzFAV3LOQ+hGagZw/q0aO0na8Ni36fb5aZw2SLlwTaNAnIjSxcaecy4MZpuDTuGz57wG04Q5bcD41+uC0dH0Pg8563rjs8G0wA5F6RiVIrR9E4FtwnUm5K5NAmlUJAGhJJx9aRbQQA5eaG2G2LF6lrdhlEN9sdA7F9liv0iNIRYOt1r2XDyj35OBuKx7tG1D0Bm9Qjz/RSQw5thi08eUez1my91DIW86LFpTmsuAiQzS9yNEOzXh+JnTPDog6rTpw99LGwbBYYEad87hPwAAAP//rF3LTiNHFD3V3X7bQIAkMMnAKFllk012UaQoky/Jn+T3sphFZqRIw8BkBmyDedkDjJFNd1d0X9VlmzwWackSyMZ20VW36t5z7jnpd798/ytbHCSJVld8oG9YIh2j69aP4cJEWiwOVA+pqlHgZFV57d8vyrg3Qs/8cY99NDkKVdinGxv32NPGRgMP38VVdkXxe5vdRdz7sHzFQn+JIh02Xpq4iMaeaOJt/R2yGBxPVuo1TZM0mspWpRJaDQtrFCJwlWu1yKsIjlcVUx5zeAuPJE8wG91jeNRnb3NCClhVVquXVsAgpPrp3ld4srfPoi0PaoshLQASQiih7XS62Nnd4QN2lVhVWJBcsSWbbALNhsP0LsXh69e4GPyJxM/hyzlv3lQA+DDLUXQ/x94336Kot5jOGoQGlzDQlYOZ9WNGqIxdDMQwEpJwL9r08gwfh2+QFrcS4DQAFLaxB/oZ0EKJZg1o1Kg3uFB2i7yeqomdXkcOaIVfmLdhjqiIns/F156KKCTMcT2+Q7fbxc5nn6LVaUqSlKogDKnOTqforXVZqIdE8gqXqJL+YhJmo0wtzLsqGpd6qCNxzazI8OK3FxhfX3IiJH2aCOwCOkKcX53ihx9/wu7uF0GN+O8KACt3YinhXV4jSaWru3J/6D1YSJPUieHw6uUrvHl/JFohLL7JmmuYeeB2PMLPz5/jy2fPxEYpraiCAZtbYAA4BG6e+YxTEadZR73XQdZuYIYHdmeggEv9+2WsqP+oqv7qf8EZfPnI/Psvl1+i4P/fDIB/uzxWGU6ICm1O22NASLkAACAASURBVLqgLV7xc8tX3Apm+wDB7mY1xJ9WClLHB20WpSz5wE3+0yTI+XD3EW4+ZxX+KVH6D48wfHuIdwcHuOj3cdY/wXRyy4fQlO34xHufHiQcRv7bHBK4cFxwT78LImAls5yYxaS2U+RwYtxA0qWhQygJQI7HE1xdjTE8GWLwboCjgyMMjvvovz/B6fAM56NzXF1eMxpG8ZiRVxaUor5Rxw4TrSxBs+aw3qlje7ONzc02up0Gem0qArRQb9dIe41bABiRJlSsXsPoaoK3wzGmpSFwVcEviyLijKxW9/eBjXWmpeZqY+eUPcHokwl0Rmc2r3FuOWYt3H+3/EM8HxcLrtGkYcEgs4uDinDGwpBCh9d4R69QjRsvfyzq8ZFQkyS2Tn311Rs9xk91EzJVeRPdIvsx2ucJbeR+9iwNhdrQTxZp6iyqqWMFCQqHVW/9/IsRIZzlUfXJ+5AYJgyINInVZecg7tlWMbooIecEP3WqNK7JfKq0fBZSqwquTrUG/unBkpuGVi6xF+z3QgsfFP8K7SWn752j1GJryiwVl2nin4lWT8loZxmNN7JnDbENC4CGJf2pOUGsMDtWrbRCRLJ2yCQuMhgb0c6DLBHILu+len7TWB4IcMjnSF2pwqcI89eE36DrjP/9BVHI7/FhcoOt7S1kzRaPVxwSqv3RW2Et9G9Xgrx82pvPmEV4N7rA9c0ttja3JOHIalKATCoLteW9k+sIvnx0EygjoGxxz7AbrGtE0VyxhZN1JuKFpbTQEVNwbQ2bvU1MLse4GV1zLON556v9W83khPpNK/B+xn761Afd7jZQbzXZyrlkBqILMSdxEhOSTFpaDOnF7AHl9D4U7xpJqsvdRXPCV2yJqO0i4KsRgG71lvDwqMCgIseT9TWstZpoUAKez9Co1fBJr4fB4TFOjwec4FHx0tQlEi261ryg+EnpcU+09kYdnY11zKmQrWNC0FWK4poVtUJyLI5jXotYocTsKj2Alcs5Fbut8ZloejPB0+117G1voW2uQAS+ki4A5wc5/vj9JS5PRywGnXsfsTnkJzbt9o6Zwu2NNra/3kHZkLyBtDzK0OJbrRFjm0C/b5hpiQuJYaFW66mi2TRGyn+odz/eZ2yOky7AfDaTluU0DdR/eriA3nsVzxOHNFO+t8+0PDFeE3VyeVOWtaDkFWhseZz13nPuWBYcI1gTTgtLlJRz8p9mnHfRdyLL+eCAUkZnflIVI3FzBnslLtPfEEDLgEek6B+0w/RcJczuQsT6tEBga7iaD2ojqJR7EQakIroKKap9HwHE9FpiAtA9MmYF665EOgWWp1shRF4nCX7cim+xmJ4TZwDJn5nFb5+Z5/iLuStrjduKwp90pZFniyd2jO1AIMUUSkuhb4US6l/T/9G/10Afgpu0tWs3jpNmcbyNZ9EsksrZdK8mLoU+dcAQYxxLM1fn3vOdb3Hf/rD/oyAWVsB9HqQVcE9vKtFea9c6WUH2mhqHoPzxAmPtBDmOFos7cw8tp9/084ZMxIZWaHZlBe+AKG9KYLC3ku8YAgCsZWy1kM9yQaVWrsFvT/Jv1uuRkQOBISsHrNAwsNKH1xAxRo6COELvWSDNf6GolD1E9CAs6X5Vw+PUJZzp04pOd+I2lqMI56/PMbkc1vRQc4Y09GvJ8ooMX339DXJEmseubaLGNxHVhHSwe5/vIcucnx4FB6Fws9Yqitl8wZtdHPXx59Exzo4OUeQjdsB2SYHR5BazOEEedbGz9wXSjS3MXEunFQoEwSOj1cqBDGHxDLVLkeizIjWxaZGZyWyM0ckByslHQU8VvSjtYqkhFfsauAXQTSt0yCA5kvgwLkylTMaIHpjo1LABANi6sMNliZpGOy8oamjKGs7t7S0MBvdQOMnxJ3dPgYaXvGsOtncBmsjze+GC9zTQxFYBAIWqESfDE6PSYb29gbOTMzx79jM700d6COZrojiZssLlzQSPHj/CkyffNxgAURwFpjARmjKPuwGA+t6DArn6s/BFBYu6/F5/gPP37/D0p6dczMiBlwfBCvaXiwqD+118t7+PlOKmYn9VnwAAiFRb5xsFn5ogzrRUi2gqFNUDrEhZNOoyrQ78cs1BjvHqCD2Yft11f//+ah76/o8AQLOx/2cAwF61WY+ykvxnIZMOmi7yYZT2jWmOYjzF7Poa+cUVG/a9PT7Bm8PfcX56ig+nLzG+ukZBLv70bKgpLIO4dChgHRzqOFdinDhddULPE2AWGvXmiMZJ0VW0mRLHI59hdHuL4XCIi4sLvPnrLU5fvcLRH0c4PjzE4S8veII3vLxCPrnFfDJm8DBjZN+hk7XQzlJ0WynaiUPbUaykQ5/MproZ1tICg/spNjbW0OvG6PcydDqpxtHGcDRcJFZVq8WH5DRr4/3VEC9efsBoac93VFN5pebJZ5YTFXVrE+2Hu5hR7Bg/1+pJrNFD3vW/qutlZS7S/wUA+GR9Vo0aaM04OxtHUOqr/3kcGDVRYxmrvComACSV5pLZAs6M+VQOFAsd3aL5LHqLjW/ZxV/c6WnCSt8T1Z+0/qb7N5f5wiQN9mVnFLtdNQAwUpF92W3XGm0j/8VxiK/IXlX6wsRsBD60pjJNojMIGxDG3HjH2mCELs5VwHoQQ1GiAstwN2RBYPX7lS+SK9HBfhmjzr23GikMPs3E1z9Xmjgj8uwKAqciouIakKLU5aUx/KJmw24AgHkv8J4ZmCaa+7dRTlc1ttbQhsMYawbr9Vr6KOSaXVYGTncKcBWaxtHqd7gOUEOfLJZolTJ44K3QUh1qnMx8N2LOoJ/eXGMxHaO7uQFknVoKYAyZUnP9ww/HVeL8z9cfK7uJJniTnA1I1/vriJKYDdYMKLUzbPgStl7R2G9KbeJt7ZYGVgVPZL1AtVFmsIA8HGLbv4SxRsOHZTVnZkfvwRbStR6mH8lscsTJCWB2mBPvA72OiAlGJVKa5uc55jdXqBY5AwBUu5yjvTmpZRFJJb/Ha1rrcPAwkTicJ/EL8nNR3xUGCJ3KlSofXRobOBCAAGp5Gkz94dcVv7cLzCe32Or18HDzAXrUT7D52Ry9bA3dMsNvB89Z1iUG1d6Ij05dCSeCGCOwQj6e8lml7N/DspUyKMBmxYlM4ovS0gSi+txBTSibQBaFmgQKuEDNZ6H10ta6CxlIfP6XeFF6/igS0BUT7H22ix1HkpIZ+3rwtZH/WeJw8+4cvx48Z6masUNtHQgAIG7943yOaTXFzpePkW10sEzAtaLUWkEeJZbY4gekK5KFCrUhH3voFKVq0V2d+Q81Ao0Cs1n2T1NzuZBNxQ0l/b7zTT5HJlMSmcrJfVSgaav9Bdn/wUzaet9pxrv7AZoyiDhOPa3BxVoerh5wcwUwCMhgQuJiwf1gws0zNdKi1ef7UgYB1adOuyOmhyyhCIxygz3H+js5kotHSgNsZgNBG5xY/KAACfSSe6UBi9QeOg8J8CBPCL2XqcrHzTvBmA2hHN0+k/C6PAtfzQ+V/m9SfO7zyxJ/AwAA///sXUtvW0UYPXMfflFjx3m00IjXih0LxBIhNkjwpyshIfEDWkFLoLQouC5J46S5jh3fO4O+153xbbtiS6WqVts49mT8Pc53vnOYAWDCAWzzoJdX9j06okIQhWW7OM5F+fi0EJEDk8TCk261dUgp+k6pQeaZn7nkqmuhwbSJ0OxcYktCNoX3pi3QKYTiQcT1gG6hZBP0FtlS2wuic4RgYES8gFnSJIq1oQQEo8GxZU4uiJcBBMwAqGv0+4KmNV6s+/gcs2hfFz20VQiKaIY+R9jmuD5b4vz5KcrGiVBgopzKwAjvS3l88eVX8L0RGq/uCCHoTmAmk2rncXz/Hu6MxjzJo6DXtEkrbf4NfRbqjE1dyA//5OEvWF0u4cIGvcJhfXsD7wps6gKTo2NMPvscm7wvxV9S4yQxZ+eXw1saf9vLVgV+VgWmvd96jc3pH7hZzFkIsHAWoq30kcRuxKVhHjDMHYa0M6NouCG2s4N9DvItqqeslx0qLRVztewVNuxtDFTX1HBUmM6mODw6QFnKuoOZZfr6FhtaMzj6AMPxGIGE+ZQS105vEtVblyR8Se7JPmfIMOjdYf/xn3/8iWlfQQV+XCbmYvS6brkm2OC7H75n9eKQiPfFZi/r/ATeBQB0GtoOe2AHPNMq2+nEdn1T4cGDB7i8WjJb0GI8RFwXVXWJr7/9BpPDfSmEnIEg6AAAVqFbfNGK3KWfV2HTlLTOkqFFtnPn0pzSWgrGs+/cv25D9D8AEGnilGC97q5TcUWJiESKCExcrVm4b3V2jqvFAi9psv7nM7w6nWNzdYmGpkOrNdMec/O1JdEyjklSPHm1ZLV8ES2JyCGgYL2OXjlAUfSZDUNN2Gp1g+uqwsvFAnOa7j97jqcnT/H0ye84efwbTh4/wfx0jovFOarL1+iDmvoSo54wicbDIUZ9auyp4S+FgUCTRhKIpXUx8s/OGmYPEe3/4HCAg4P3sDcdYDDIGTy1eE+NKXt0lgpMFAPUwWF+VuHRyd9Y19CoILra/HnPnU6Nwer/m+kE008/xk1JlrC5FMxm3WcTQJ11Op2WB6UwwyzC/iMAYFMu6LSXJxDNVv/9jQvXFg/CMBPxMKGTO11fk+k2/bx4+kxNfVGou4BOdgr5TfT6st9DoQAC09hLAa2DrQOqOBXbz3Wubps3rLnQPPzGpNyAACT5xiXNDH0fH3ZXdpStYNMfzoX0JQR09EsGBkxNn41DM1FTb4EOBgCQPI5/BgNnOyBAQLT4pA8K85pcytaISvbQ6X9wEWGndQkG/elO6plDXZi8oqW+bf5j/HAaK1ogxGodZcO39yNZBSDBsly9q1NNh7fft3QoI4+jJVlsCTMf9WOo6V3T53LYY/FOAhy3VxUySspO9VtC8uwGAASlK9Pua/C4Wl7gerXG4dFdeKp5yN+bILksV6ZKdHPJ2uwr/u4haxhEIUYBeZVsaSVgvmAmxWQ8jToUeqjG5vMK0oUOAyDsPMja1a13AQCweO0ytX2N14Ve383tFp5cqLICHx5/hGHRw9mLf3D7uuL4LTWl0M05T2pjXHpysKDmfYNq+Yobj73x+xiNxhCOQAJiKRM0tMBOYKHGYPUFFUb0Oqihoebc9pDVBcAFU2U3YcB4BC2zyP7C+933bfHJO9zbP8C4TwDAGlnhmBE5G82w+OuF6lN5FAq22vtk0EIqJV5P87cNC0UOj2YAWfAVGesBEHBobJuQrLQI1Vz0EFg5qBEWBYt7erUjTeo5G3B5DTROqd8FryGvUdcV7k4n+GQ2Qx9Cuy/YCtJjOrqD6uo1fn34CMuLJedOY2LZqeWmAUZWx9sVpsf72Lt/BN9zrOdh2kppj2brGBYzrDluQV3dKze//1qFzgnkJvFSEwJsdMJPzAAWltOVaLae0/6pqevY5LNGQMPC25QTWOw9F+Fd6oNqFX1PgbNuZWKaPqkendkQQgdQ4r1fJgwBL+tCuk7AK4LcZwZlOGz5cZ9eF9sfyndl1wFyK9ApuzXoBirY5D2OruQVi0iqTLTs//N5keZYSWLkxCKQXjJtvhkwotyoDTo962AwbHtmfq9sASp3gJ7XdOQsrkZgIK5pxHurOnoMbNgKgqxw8vkB+BcAAP//dF3ZbhtVGP7Omc1L7Ljp3qrQGyhUlUBwwR0I3oX34P0oggpom9A1KbQlTZzEiRN7loP+7cw4LZVGVZTYnvGcOf/2Lck3P/7wE/E02Mu/lgsj4RqBpGinObTCQySwwn6HoVFeLanMq4p/LUpNxkulf1S0eOVJcWFdqZgOeb7mPeaI8MNXB71BlPQVwr/wnif3Jq5gAcXUHukeELTDLoYbGGjpANJpgnapW65W1/fcaSBiWwqaRiSmVtlok0KmFCzWUqsuKGsmFPy3Aukvo1Dhh1Yxd89USMerOAQLYyjNIijDi4s+l6gyLDVFUmp0ozxeYvvXx+g3apcj0lBcdBJstiKuzdkct29/ivWNW+R+L17cWvnYRIn4/WOCr1+9hKzIZAOLXUGb8LUBOTjhIPJtpVzXp9j6fQv7r98h5YeN1kAlnJuGAmuBC3e+RNkfKRfR8fnzO1o8UcFSOywguBWOmEGr6CEVL31KttIqoH98iunOK1SLKVw4VT92RMCTtZHYvb0ELg8G6DOHmMFTzFFl1EqaYzKZIOP1EzTJSaJtTQQE8hQl5d/R/adAeTSb8YTq5s0bUlhwQPUMHU5dzvzAIVn1rE+QDUcMDQ7OpiF6tmqB06j4TizkXGQqcfHqPQmr9PHwty389fypTBKd8By5CNZ1PjvYw7fff4drH32MJC1iMhR9uGMQMMqMTc5WIeyJwv58i7KNr4P5vZseWCchRRDbmF/u/4wnz55x8K31/tp77b47wL17d/HF119xYCYEjI86HKFziAAk+5ujFZiBoWSaEKf9stfU8Tq6CXQ7F2wRAKZ9EfP/lWbMubGhTlHEIkAOU52O74fV9dz9nVu5pg8f7j0f/3Ovd///Wrr2lWCJzoRJL4hFb6J1V72CxqHX0z7mO01OEokyqkyzJL9ygnsuRARqvsAhCeY9e47d7ZfYe/kKezt/4/CftzjZn6I6mXOjgOgAifLoJHZ5FWgT71yvnvMkdMbqxo3FHZqgFwwDpInxYlGiXgbMpnP8+3oXO8+3sfloE08fb2Hrz0fYefqCj32yTpseIiwqFD5F3+UYZn2M8wHWspThqZkT20Eq/r02NXrcVAT61ASg+0CTsLTBeC3DhQsDXLoyxMblAuP1HEPi/Q+Ejw7VFPG9jH37A9lUFT2k+QDBr+Ht3hnuP3iBUlNDS0bpvlAsmVOwTxPM6D5cvIjrd+9i5gLmjPERZXcbYcfVqcWEJMp1bLyZSn8X2tm4zqJwXQ7+eTwP4sTOGTxek9ouZ9m5FjnE/ONGUBzOR1xDx5jVzlcaAkyDouvnprrsy4SWoJ+ZP0+2+XzdUjQ1LIxVaXKtnv5S2cfpdmySuu6O0T4DZV3GPc43LhYgLgoXdp9MmVpCPcD5OfH67GkO4DVes0ATwWzpKFIkRAEjdCFN+IsUS7oWEgYMwt3m4UQqftKNbzn+tN4J8WDX2901zhGJVXZc47hP4rlTzKejccrD1gYI5WapoihYS9iKW3oWCTNjWidQ5wz9Hky06vwYIHQKdhkMKSUkiABWeG9fsmWnvGjb3yKiDDGu8nfbZWwZ48uayip8RwhHmm8NR+ssCloR/LxawqvNZqIf2zaToRPggDyVXKk+OcHZ8Qwb167C9Xo4qgJCr1AR6ZqFjb0jvYRa6BOK3vBexJe9t4muxKv57gF237zDeDRGkQ9kncGrDS6tA6HAceLfSttoxDC0CExjPoqndh7cOKDSWS5cJ1RLTk1ODgNUQegm9N/k2mUWZt578QZufophGpAFo/Y26DUZUgKahkpshelLJ3vU6QGW+4e4NJ6gKAYok4x58ktazMrvZ70V9oJ3at+nmkVQux8SHFuQc0WNQN1PEnBt5PxZtNUsDW2Ip/oUqyKIwTYmvYu0tnNMj07QH/RwfWOEhHaM5QI5EozGE0xGG3jyYBPHB0eSY6PbyAn8HCSN7MH9POPmZrY2QDIsUBYZKmpMpgVrRfDntbArtaj0uhf7WMsgiLaZbySnS1T3isXeFJXD300jcO+yOYVzNY5Pjrkh/fmtG7iSjbj4J02YXFEgRS/D9s42Nh/+gXIZ1EbWhCql4VJpPsNDqVDjk8/uIKzljAJgsVneZ8yhzXS4dN0FEzdXLTfd5/kzVHPL6fo0/rkz7RnSTaD46YXIRjGcbDOt+E9VHN2KfxPZ7k6rg/rZQznw9N1QXt1oXcO5geYHrLeidQG7I7AGS4KSnAU4n9fGTSO2hc70Ncj14WyJXn+g9tni62/8+DSKu8pgmvaaslKlfBa4lKGSOcDQ39uwq9/rCYVb30NoIIJUZpQ3fS/mXMCihPKoixK/Ir+JykS6MbTvSMeG61j6PFpH9IzRgITOe7EUEUJrGgiNoGZxfWpQUGPUBig8ND6n5cX6MXqPmcbCw0hpfCY+xX8AAAD//6RdyXIbVRQ9PUuWZcnIIQWYIjZQBUsWrNhBUfAf/CgrWGQRgg0UDhgiTIyDJ9kaWz1Qd3rdLcvJAlW5yraGVr9+/d695557TvDpN+ICYEr14gOpDICiSgppQ5GBqRYputhZLv0YLCCoyYvREugGJ6sF+9JMZeBehEAVHSvaAgWLpk5I/6fAlRJL6r0LLSlXz33TEYjCSP0pRWvAxAnrVJFSKfv8vqzyXHSvMVsjR1kJ9GJ5ql4Z6XGjyt5CkRamqmRLZ9NUFs0+MAMrgjBwY+orEuZuFFcFv8ukoIWnHXeQ38xwdfQXFldT6WeCpx1yEgHmOgGS9hbe/+gTgMCcYimJkApjGQBAk2xvf48rB9w3ZSj9naKgBEoMzND5ReBq3OnxSwx/e47FZIQoJKpOxjZbBB6lQRvxWx9ie3efPdZzYyrUKJirx7njHVvfAj0JAHKGnwIkJEg4XWL88gXGl88RlHNY8cPcF63mnem49n0fHaYlqf52kcnCGEWsohtFib7PKmB+I+CB9njSvcCuAHmB0eQG03TOdoAPB30ktIgUkrDSVSGxGapaDXYeINzcEqG0GsDSSDg980toVuQtRKUq2Uarg6t/bvHdt99TKCqaBqX2b5ZiiriYZ9je2cJnn3+BMGxpH/FKULFaYV9TDfbW8lKr60G+yZYUkGCS3c90HrPbMX46OMSPT57I/aoAfP0I1MP59Vdf0mSSxMAdockAsMqk9T02v2QNgV2hsK7OLQ/N5238q3n3uhr9qyv8//fx2k+75wXrFPvXqU2bJQ2j/ERTS1Ne8yhopr+pZcWjlg1CifOcC9qkeD8b32J+c42b01OMqMJ/coKz4QlOh0Om1d6en6NcpAioWkAJoYIrNo+lF7yJJjEYVas40J4ShyHayQYnSgywzRf49/wCZ6dnuL4c4ejgGY5+PsLB0wMcPzvGi+EJbq4u2dM6W6QciFI1igQ7SZ2dfidYgcSvaHULSwNpCg58YxJFKgokxAxia6kcfr5kT/+NdoidQQc7gx7efNhHr5dgcyvmoIzALQI0xWoNXI2OqZUlCRG3EiRhQgZVmKUBfv3zHIe//42lpv2e6iR4WkEF98P7GFFA/ugRunt7uKV9IYw5eSzUAaWCNas575Wl61rxFTb2saJ035gHr2ak2L1lVV3aazkA0Ta1Wi3M7U2lgubrNHXcQRQ4FBDQc3RyqZgyMVpiDFsf3HJTvU6o0U0NEpf0l9LvbkJH1vJWqgCi6MNAE6uK5VevU9v67tbklfGT9c5zqte5giUZJffkKEJziXQKNhIWUst9Uf0O24mIkiUJf26u9nrwTdwQaqGm4sbKYCuEXuFkOeHOX1gWnjk40PuNZaHFEerx5/5ZK5YEwqYpWcgwQppL7359PfNrVNmKWtt8iHWyzAlfNY+s19XYkGu1le7Z79243jleJchsqzunl5TUKNhEa1ZMcRrRluneT5eIqSXUDA7QLCh4VvGmoVzmmI4nmKdLdN8YIOz2KE9lZoTEgBkn/JWtm/AJJdGtqrAUNJOuB1n1lvMFLi6u0d3sotPqCCM09J0+k8Rfjcnd3FV18t+/B9RjyVWITZMdFuETkITAnSKJ8PY7u8Akx9kfQ0TZDC22zovFQUUN7kz+kpdoAgTmSxSTCYOpJLLX7vaUOcoKajIvTZQNlaq/fMWA3Sn4m+WlCP/QvrDMWYWcHR8oQSuK2vlai4AueIWCj/a8MiQ4PqIEminpc+w+2MJ2K0GbEvHFktmsG2EL6eUUvzw9VLDVzrF0BQiLMyJPKvnTxQztXh8eCSgGPuYF2Nba1+IJFPiDtoNYQcjmV6lJeGnsBkBbpwodEtl1PBOnIOcsr2CNGGpDe6/fx7uDHbRon2IrcHW9asW8R//w+DHGo6lYQLoGMsg11miShuzi6hr7H3+Azd0BFn4hwp95pszoyMGz9YcxuzkJzQtHfbcKPWoMIAJLLC/LVCQ+TaX3n/IjGglTpedeeKtMawGFgHGu+Ctz3NZaJwRZu2dRE3JHrQhrzm8MCJimm+ZcTP9XpkOoOaOnualV642Of9+DPsMY5pRPSt5bMVgs35PPqezxJe/SeEcZ4dbTb3slMdhtQTPgi6+dueap6xiPreWUbGlcY57Vfuh1puhfF/81i8A7a3FNBNg5+hVyTJTAfwAAAP//1F1dbxtFFD0z67UdO+vUNA1N1FaiCAle6AMvvIBEH+Cf8Dv4g4gKaKGkcT6VxM6XncTf3h1079w7O06KVHgjUl4Sa+0dz86cOffcc5Kvf/zup9ghkF0NKZd5NuPeDVog/Y0UAZBrH5jMFD78a2Wb+ir1w9FkJLbEb+RmqQdfpR26ISixEN+Uk/crq/nlexvxBqDJqxUsrga7ciMp5d0Igxdvdv6auUhapsw80SSusnOkY/IiZ2fjmigEkmBGqMNMVyJwqL2RoZgp12cQZUxwlPTZkOV4FeFCOhblA0D9S0Te1vMUw5NzHO92fT3XaR1A+6R8/fPqZoQvvvwKzdWMmcGEHxYIK2V4k6P7ePrJMzRaGUt3jOaeR/NGVQAsu08tr+lE3darFdz0xtj54y/0L47ZiZ8WJNp8SPbenzo0Nj7F1vPPWVqVW9/Pa+Md7l8QABoXR/2oBCBblTrS2QLzwSVuj7dRzYfM3vtDpgnViKh2gsosx1qjijrJNrni4WXHVD1pNJtsjGjCAy3zWg1hInDETKPc581ojLOrAbJsFZuPH/k8UTGEoiiW6WKG4fgWaw8fokaRg2nNkxRGk8FjAiCKbLpnJiOgI6kjq7Xw6udf0O0eCbgWMMqctZ8N49kEL7//AesfbSgCX65Caw+iQVlxCu+TQAWCJYdul/h0Ovxr1c+YFXYKJ4Ob64srdA8PcdDZRefdDl7/z5IwvQAAIABJREFU+hs/p2l0de0D7F+e49uX32CLzM+cVslV/fCBBIC+9gMs9u9ufjHw9J/r/0cAcAUuRrmhYhjBQ8nFUnWUkZ5ehq80dLQhEwE7GaK4HuDm7Az97glOdjs43d/D8d4OLo4O0TvcR797isHlOUbXA+6nJZkn+y+EWCQwSEP0603PPEnEyhqRJmfZGiqUL8+buWWy9+Z2jN5pD0cHRzjo7OPtm7fY/v1PHLzbw6B3heuLPuaTKX9mquCnxhMIRMoSsZsIACMsnyYC3Iwcup2NJJo5Kgz4pxw7RlW/eiPBSsOi1V5Be72BjzfX0VqrI8tWUKtZVKnSa8v8ciuKnUqVsv9T3h/TtA7nEowmOQ7PbvHqTQe73T4W5CjOYuNS6c39pFxZm2PebOLBixewm5u4JmBFgDtXP5i5JLIogFRSWCqrUb92MK76jwSAEkS8z1NvZ+qVcEUE6O4+B4mk4xSR6dB7p6/1gIiBkLSSFWE9MkvPdmhViQAUwgG+KCWsQPCwYVO94ETvr2dEFhoOKpHRmjcKNWFI6X5dXpTpINZGa4Osk+Hv4kfBwNjHZhGRzId5AqMrNT5sz2l+UGxZEiUoqHGl9YcDzc+X2AtvusxVXJ8uYIJiAMEzwfsm+IlOKSqELUjqz+kI4vyvEmA1VSOFILnFe0Cc3/uuTCAFXKlIUpNhkZUupGDh23dMAMhWjDhjj4h7kv9/nBl356MLMczhf1xZzTlKlJ59K6CZDTfJq2k8RXW2QFUs0my0uxZR1FfYBRaGiyiV3KLZbsNSIg1XmBNvpAg/aAmvkSK3DwTz8voa+NdFgcvTHmaEJ7JVGU9h5IqlBovltTmQFpLwUM66aARceC5Ueo8IIzpxGWAzZiPmz3QQqtax9XgLt/0bDE9OUZ0XnKJigrWiz7nnPBXrsWGdDqFzx/GslChQLwqO93UkXef2LcdFHqHuQkWYTU6DUWnE9vNpx7EagJJgHBMBhSQJFAG3BpWDU8UTfCsOPHnnWFnrW2WKxRhZavG03UaLKtjTBccBEgGQugQHnQ765ye87iOgQSdGhkKSknx8UWAymnLCB+GzRZpgZApMjRwc1StIjFiNav2cCZ2U2prlQ6Rs8NwolCwKbbpC4LEiN+d1MJ+M8ajVxPNnT/DA1Hn+qmKJ/JFobT16t4Pt1ztBARAs/cS3iM8/1P45B5IswcZnT1BpNUhwwHiczgi8RnObXRHGmirYfOiP5O0lW2furb82HEpL8zg+T1Q8pUL7nxZ3q3LoLoSQ9YZz6bJ7foypi3LtCKrusLyLT4ApM+spcr0ibv6K1em75Fh5MVfX99EDPb1mNBzya963T2nbO7vw0zMgcn0t9obPH/nisSk9eZGQ748UdVW9zOOn+zAPqS8u64HbG/Ll7DHgVRJlT77+sPpBSJe7v/r9aJGav0fp74+9AnQMvbKjHG/a09l3gMawyPE3dde2FEcVRdfp6aaHywyQDBelomXKpHw1sSqlP+Ov+D8pUz4ZrfIHDFrKg6mQIJdAEpDAcJ9bdx9r3053A8b4KFUDA8VM04dz2XvttdZu3Pv6q2+KQiYE97tU/QNX5Ik+mY4Fk4vCy6EHRVhYE0H6iyQJ2glmAMSiiTB0KTIdqiPp3FjQe9aQEj1QvS9dHPlGs2ENKfKFOI/bTTPoqKCAIVl2njFqXwh6b5UwfpvKRHPmT6BaykiDZqftiYQa59UgRCaGoVc+UJShYxbXfAWgSI8ZB9LgO9NlZNJmKc+ryU/9SGS8dlQwnZXcXTefrSPKPJvUmCkU09c0We6PMizd+hSznY70mm6Q10A4RiTgKTKk4ylm5zpIm2npQXAtC4DonrLRNBLpf43hBNZXn+OvnU0OWbN8INKQPMewiND3U1i6fRfN+QXk3Hv/UhDwXxgAdNxEI9G9U9BPmngyqRn00Ntbx/HBtjr850IRNZ5dJaWlr+3UMQ3YjwZI0lhMdLwEVq3paa6cQE05wpzUBNQrRYipqZnnxIY2xO7xCbLREB8uLmKm3WIzGJofPha6Lvk9RMQyuNlhgx0CBnzYHCq1eedqY3AZAGAkFw20x2ewvbWF5eWf5TB2gi7GTuifVGXa7+7jwYMvcfvOHa6+OqUm1UgAOuerlQQXrJO01YwaWwU3cnuN9+hd9Jhu/XLrBf5YWcFPj3/Ao4cP8d23j/Dj94+x/OQJzk/PMEamN3n5z7fr9XtD3Lq1iM/vf8H/IKu4lJX89wMA/rH6eGUGvzuB/78BAFb5d+GTV2CpDOAbCqyQgVNCyQjt6zS3B0PkZ2cYdo9xtLuHo9c72F59ilcba9j5cw2vNjdwuPcGB7uvcd49QNG7YL1/Qb2gs0yMiuiQZ+2e6APZ4My74P6ejDW1/ZA8+CyIk/B9fzDAxXmPNY6Hh11srG9ifW0DL549x87mNnZ33uCse8p0/oT7ocfwmQQ0ZJIUs2uv0gEZYBTVZ+yMrikVu0i9HxjsgO0RpB0eEvkEMzOTuHlzClPtJmY78rzVbmJqKkWSEp2xYL+02JV9MDhgj6VyQgy1OE2Z8eqSJlNlu+cZ1l7u4bfVdexf5GyoRaBrFQCgjWRAQCzRPefnMHfvPrIbN3Cc5eipvk8o/plW2TTNd7J/U5Uorpi0QXu9B+D50n7yPgAAKkFLhLLCyxUDX/4mtLLDYLfqMKN/WQ8+yO9KQydLGFgrHNXXlAUnHBPo8zLxqQMA1i6Y5QJq3pV5CQi93YNr1IIoC9KN+u/03ln+p1RPp+9vLsoM1qtEgP1gcmm7xHIDjsAb7AhvnQxI7+vSWP4Oum7cCA/yCSBWF1U0yUhORR2ScJs+37RXVW8Fy2IimX+m7TfGRCMWWqevnqnqFM9gznXJvxo0OleOcaQdIII2vdL/W76vsxzD/NFzk+cMKt5Q75wddQDgyp5OlPysxwwlP5KuICNKWqgvOO0pFDOenjOzB6gWAQxMl/VCewc/qCCQA4dvj9iY7UZnHjnFYtpSN1cZinO2vooAVNkJNqJkVpOrMaIVZ547mlwcn+LtwSGm2i0GJaNgDKhcSj1PAzJjp6q1wnblOFRWTzkU0aV1EM7xXPGDiGOQfs4N4dCcbOODhXl0t1+xHwB1MgC19tQxoqiR21ZyhRtI2QtFzFGLXg8ZdUfp97nFL+unqaqsFXsfDh9d1yYV0mJBAKbpCV2XkitiFbF5XM6dQ1wmazbmKrmCLWyiXIT4ndcn+244YVaQ+78HFtvTaPkI7UbCwMJEkiAdS3DS7eLp7ytcdCoU6OC915dr3yvlmu7zhDxiWm1EE00MyEmepc3ih1aoEyh5UrhqWekaACAwBiKnssUywrN5R2uR5he1NfU8JkPc/fgjLDQnWIpmV6AzrDU5ge6bXaz8+guyfl5pFI1Q/Tf2BA3ZyeAYS599gonONEbEYiEAlyWrI4mvKoWSofa1J/Y09eyn/YwqyvRz1uObb0Bk7VlFzscJtur7G7F0CpBcKePxis2srpL8G92fY3ftAlDdK8R8sAjAAtR/wJgC9NWuSblkc1zAC2MBCLPczOMLpbVHgTWQcvvBi9DGTxjddSDAcjn6CUsPKc7RKr+0j5dzSJJp+ZtZtmBSOV2mIo+XHJrPYAXTOe8kKRJ1FlA6P79E91PxixNwxd6jBoBf+qCxIJZCWQgvGQxXXy/nlxXC7b6kEJ8jThL8DQAA//+cXcluHEUY/rqqe9Y4XjGxySIsLggh5cqRGyLKY/AePEoO4RAkQEIREQ8A4pAoSEEydpw4mXgmxI7HVuzx2DM91ejfqtuDBRKORlHiWXqqqqv+5Vv8Z199/vWEFSgzHoycYFVppsJ9Pia0LpUqRqIJt21EJPBggxOU+8nqiwwPKTsF9FyG7J8KxIIWG1R1396LPo8Cq8HghA+5lINHF4UHDdbHRQdNyOl1tICpCxsF3LRqVB1sW0Sm1G8DpjF0tIsYK6yF+RRx4wcjBAgKR1ZA9LmZwl4MEkcHsrxWFgl9b17051AOohMQdNIJaUEdA4Kl14wjqVCVaHmY1Zl7T57Uve1XOOsPmTOU2yJVnl2AeBeT0dTHn3zK4iOno/LQNzuXXD3ub6ytsfiSQPRD5EcbjNekAdLMYTwS2HwxSVHzTey+foPN9SfcDSR7npTUeosRxmTZ5RtYvv4Rau+vImco+tSZPk1zdFP/h+rvCgHzG1aNz4cEdRrDd/vY72yj5kYAiatwt+z8h1nNPAuBYWOtWio8aObmjXnzJp4+dWBoHqyTZkGVdGUCc15pgL3qA1CxZ0BiZEfHWFlexuz8AtK6F/snTc7z0Rl35K9cu476TEu675OgpWgN6oOqqU/d5CUINEhHgW7ijMTLmvjtl19xeHggtf8E0Q05sCWfcMhu37otSr6uTB7sVHWmZqsQMQ6kuUinUCe6h9ja0HEAcPB2F50Xz/DH49/x84Of8OP33+GHb+/h7p07uHf3Gzy4fx+PHj7ExvoWujs9DEh8qJDvWqjINkzUUcUAF+fa+OLWl4wQgjkc8zlV/i3JTLgY6l7ZGKuiSBa4nxP6/48I1E0hMqYfKYkOqU6HU0u9izz0/++fpCjnBqoWG0VkKKmARZHyIP6YWGCK963USASqyrKQVOSidUHB1nCA0bt9nPb30O+8RPfZBnY219HZWEdv80/s7XSw/7qL44M+zgbHzKuknjXNCoEHaS1krAQtTitsecU1Ha/IJdXKYL5exntozdcjr43ppaMxTo6GOOgf4u3ePnY6rxkl8nRzC52XHfRe7uBgt89dfips1pIaMtI+oXt9HPg8coVp0dg5U8RAmgpWHFhwF3fC8EnqdLF9IfNmiS9InLmUk/yVKwtYXVnA0uJlzM02MTffwEy7hiYp+zdSpI7ui1IwyxGUW7l5iamFJ9YFdkjqMxhNMvSPzvB0exePnmyhtz9EHhxzcTMnAk9eC2xeedxU1ly4eg3LN29ikGU4PD3jogAHNCbzlKjtk+7JHNgSXYP2/iAF7dxE5fSMMZqwCb0lF1RYqysuurAaiqCAdnwUZmmWZTrX4hWdMXrMVbQBpn+qCTcqnO+ighgwAbWiKBOGyEHVDmN0BtUkNeqBVBIhS3yjJVeFnkBrkQImCySjer0+LOGneSFbK3Y1KURjpIpAsCARFfs76UzV4ghwoFhRJKHv5GuS+BM1gGgD5GzAHX5KNlyiooteCjxORPzEFSHhAgGfhV70dAwFwImG8oyt4y9q0kl0SbR9T5DVpSe1xTbTSCihlpRCsYUGRuZ0NFERq2q337nzyBN5w3Be2fvft984l1DqKCo0DelWjyN0nOpiY+qgauOl3WpwMZIs0UJRtaWWSU1M+LcQJRy+B710zSgpJmG/mcUlhCzhwn1g1KJayeLizr9LXMUlRdyFhI/sORnt9/5iZ5JmqynrjYovY+HvFwQRTnwsucck8h8FuySiVmLcWPk3VPyM0B1OBQaCF8RIQZx2l+CExKYvNXH1g6vovniF4vAY9byIPvdsOWr2h4m4KpgFBkX/yfAUx3tvuRA7074E1/RCgQqiPxIq5L1zksaJ3R+6EKnhoo4AvBgplhzlcKOcLV6F2z2Rc3xSlIXM6PahGjyJFPPGZ6dohAIfLi1ilpqTtD8nQOtSG+1mE73nHbx502XEA4uRhqBXKUi0QhtLaS52kqzXNDePnGLhVkuci3wSizaioORLqpAhiFXgW1C/akWp+YXX+SuLB6EUeCa9ruGQk/P3Ll/G2tIi5n2D0ZQs8A0tZuY5nm9sobvd1Zg4iYKJhYmFirQHjoY55ldmsbp2A3nDMzWJXAA8FyknuicY5dlrN9+zbS7rkygs3VX2aGl+OqYA8HPUoc2oAoiubNL5rwrpGaVahAVrvP9QPmhddGrgmlhfpk3QTBvDUCtATsSj8j5iAkvFKKZ9K42c9067cyJtIediAcUeXNTQHaWm9Pa49bBrhYyFIcQtz4xN67iuVQ+Mkmnd+7k5R/QUKuhUNBDsuilHTOvklCAUYnoNuejZeUZrqdVqsxuBIeqtGEBjT+9DMaDYMQpSwfZyo7uzwLBqANESo2tgy0MWcpTrZ6p3Ifpl0YqQrnMS8DcAAAD//5RdW28bRRg9O2s7dprEphcaqoIAofLARbzxA5Co+B38swoJFcRbAYlnBEIgHhAJRGpzJcVt3CROXF+y3hn03WbHxm1hpTQPjezdmdmZ7zvf+c7JP/yUbAArSj8l9DYxYmuQUAtVE0CsItQfUW80JroQWwkbbKNqpPYRLfbTlco4JfxCP9QDy9vnK0UegvhM1XZividCEhof+1qMOiJ9J2VEfFgoZw5BDaHCjM0qQZAdxMAkUvXVd9FpUmU9F56tL3Lp/zAdAVWFNDBkZuOI554mSApUyIJK6XQaMOYsiYvJYITeYQ8nOz3evIIKqzQ0OCz0yBpNCrzz7vvIG8uqFJ948hNTgZR0yxI3X38NK2srOh6zZ7ItdhNfYtEnJ5zARj1DWTjc/30TJ4+PUPMTgiNYeImSztFoiny5gyu3PkC2vDpbkVh0/j8vQlDLGwnSpIuWeoWb9Fzn5xgckeL4AXI/FJu/6NJgwZ8CAAFYdUCLgqqcDYaMJIN8qY7O5SvR0zPtQWKrHe3QjFqvmePxG43G6J/0uY1g/cYrIg6VlVqJIU2EgoGWZnuNWwG4X4mZBpqUB/WfdXOPPDcZXtHH3DVRzxt4sHUfm5sbEqiY0m1APNh73S4+/uQ2rq7f5KfMYl+2CpJEZw97F9QqktbGaITB6SkOtnfwyw8/4tuv7+GrL+7iy8/v4rM7d/DdvW/w0/c/Y2tjC48ePhbrnanMT03Bo5qy5Mw1KKlX8780F/U84KPbt9HutDXoSAMuY8QoePeMBMNsZF5UgXwRAJC23Cy6jOL2XxkH//f6V0U2oZqFsMA21RIBpVsSlZ1psr5gqiyKC4zPznD8qIvjw30c/7WP7u4OHu7u4qTbxaD3BMVgAH8x4cpapnNG/vs1l3GPLVXT7cersCofME4SfWrMdaownmvCz3vu1GMyvMB5/xxPjp7g6PERHtzfxuHeIfZ39nGwu4cDEg486uG8P8Dk6RjLrsGBOOusuDrjfcwGm0rfKB/GyQFMV6FWQUFFIeldC+UFyukEjbq0KlHCv9Kq4frVVU7816+/hE6nibW1Jv9fs5Wj3qAewoxbXMXsJGhRNYsFWAIhxOedfP5JKOoSPBoofB0jX8P5JMde9xSbW/vY2vkb24d9jAtiv0oyLn3WPlobmq0Xp4qtZbTfeBNls4mhDxhTddk8v3MNrH1WJcQUJHKs7rn6ycw9l3jj24KfcxyZWe/z6y3yw+RyqKz+FlUhnLZtEJgvtlCLX7CqHaFKZhZdAVUlP5sTKUwpo8+6/Nz9pSrz0H3CAjxvbQGY3RiyCFLYSOjeqCCXnccG2Fl1XJLMhM3lZtHs4EypX+abNQDMDlG/vmb04eTH/i6bmdMQRVkrSklQ3ER+5/GxdL83kdPYxiZ7qhRd0or7rN2W0+TQGItS8KhrMpOMbZhdUOm5UsWDz79ShkkcUyOzEJPHSwLoSqmeZyo0XWLKNonNS5dEMJSqbRRrKgPIvjcPxnKTc5+YcsQkyooSg36fCynrN9Z5L7vwBS6U/u1CSO59sV9jFqr5JwFgFrgrPYa9Y2Y3UWK0urIWY0JmzypI581iMhmz2SsBURb8jcShwmsPaj3JiSt/pmPbSYpc2u0O1q9dw8MHuxiRPaDKDhodyRnqZ+K+2ghIoG9eAsPTpxienbAIat1ickp67J2M7agzb2FFi3cRwZMvpSIRJfoUw05LKXhZO0RQgCERhK6WhyZrdPeTCV693EF7qcYir3UXuFWrTqJ0Z2P8+dsmJtOxguICAkEF/IwtR+y4nBnNItrZImeiWgMFv7d5BGXymMQnS2E+bk1ZV14ZUoJ4aPVe4lhxGpGqLYMWDnj7+su4stxiNxqCkaghICcR9gzo7h/ij183tBAg7KDS7sTuz+laqpd4671b8GtLDAbZOeO0PcQuqxazLSiE3j8ej2MV3nzvOe6ErhEnFXxr4bY90SkYSWBBpmuSksylOR05S5ylgFydLaa2T7niaDSMuZrkYTqOFtdr6xG3lnKrgbUOVIlzqfdMiXehgC+yRe1JFZuMQcwk75qdbFvL1T2nQDaDgSpuaO5utn8ZmCKCqdUHGruc7QmZUVSw8j+7yiV2/FVObWKKKihKYsYkomsFbhO41WfjMVAXBB5DSvj1PeOCkb5HHE8Ej38AAAD//6xdWW8bVRg9s3lNmqVNpNZdKGpBUStEWcQD/Q/8Tp6RoALxAA99o6hFQl2T0DopTmKndsYeezxzB33LncVpoEi9kqVoNLHH1zP3fstZfFmIiiokLZDU9bJVFgv5yoxVf03zCeeKiecWloDq6lke7LGo50gn3lcbAsPJPwUTjgpSCOLA8LEkMXn1hq7FijqwV6Vaz9BEWKQBnbNY4XHPCO6riXiWTy5zZFpNhqFQVYZeHPCWBvFQGA5DSQFVdZzT0DVHba/KhZHFIXN71vVZD1rqrCcswEfwnks3rmHv/mOK8VVlvVi4ZY8gy5tD7L/8C1sblxHO04pNlH0ox+EY3W4X6xvnUav5b70GgkCxYCF3gwmBFbAqKYk3X73ewaWr13C0u4v5aMI0DVrq/ACoz0O8fvYQVw6P0Fi9xMqkOcziLQluMew1lrddG3gZppMxf4sWz/UVrNy4jZUXtxD1fmOrPrnhTQ4zgt6J9DoxQDiZ4ULT13U45cWW7pn+YIDNzpSrbJ5XIDasmBRDAtmf3OUHK/BctBtNrK4s45Vj0OsdoHfYx5Xly2g2WkizKRdsSGxsGkXY7+6ic/M66u0NhW1Z2a53G7SxmZj0LiJc2FzD3a/v4scf7uE4HIiAkZFv6kEsow4O+vjp+3u4+cmXp2fYZCokxfJ8nAQm4zF6e/t49PARnjx9wvz97e1t7O/v43gQikIqfR/qkCQZGm6hPF5571JXzitBo8rBtKu0jJM3Q4yPhwqRSzmQK34xlDasswX+rOjm6XNOByP/Phb/v+w7K+KiWbnA+Z4pAP93OPALyzyQ5VLE/sLzyZRV+we9Q0yGIwwHbxCHJ0jCCOkslnWTN/JAOO359zCVYGaelgJPEt1ilwChmZBHfeaRy0XG7i1mniGZjjCLphiHISZRhNEo5ICCeHd0nPQC2NpLN56EuweizE3vTzQagq6kkxhJTUwurQexVLsFDWAHfy5vZr7o05gpanUP7WYdzbqH5aUGllo1tBo1LlYuNQJ+MsSf2GFYsbi3mCIoyE3hkbvA2HvBb3A4jMQlbmgdcexjPEswimL2Yn51dIBef4juXg9vxhF4OzISZDdUrd3VYi5ydxyZ8LB/jOPn21yxXzvXhvEbGERTtvVkwS6e8xk8I91QzyYltBfPU8xpobF2R//da62McvKHSsJW1chZfNc0VySW/S9FVukc2VFeR+VTChGmvIBlZ1kFCF2FcZaPV3ihJqt40i/aH+a80fIwUjTm86lQtPD8WjVoug8pHsn57ZoIOKJ0I11oVd4WcT6jCZgpOPqaVEkspbRJdZSRDjWkA+wUCBkDo7Zi6npSLnZofFHgjE1F6V6/tOgSaAeSRMcq8Y1bNBv4qtwgt/VC5T54/0MKOO/2/hV6iCvq8XTxxlEVdublWyV8g9TPENJ6VauhUduEV/cxPxxgNgzhxfSsSFfZwFJ4FNXAkGaDpokxGw1w8vsDBOkM61/dAZZbHEBPOPHT+XHcapV+MdbLUNnNibZExXozTnD49BUGvT46Nz/kBsFSq41xGvNvkWrM7WZmQejSolZNHi/DdoAVfu+oRoMrpHbpNmeFOj0JBRMtZdZw8drE+OCzj7A1+QZ/fPsdwt0uO5/4Waz7rAuLSSBFe7YoNVJIoNukHYWYd/dY+Lh962ME168gWF/jomlCn22Fms76XdXaVegBqRS38tDAiFozJ28GmTpjOF4mDQ5toOWlpMzB1MmwNxxid3CEa0TbojYHidHCwer5Fdz+4g7u//Irnv/5UBFIIszH6CnjIGWRRsEv8LyFIdLXfQSdIdq1FqYtH0lg1Pbv3Ue+R2WyNvtW+8sVyrRr5B7mgh8ob4nwbOclHnd2sHVhA+fYsBaIzYyFbNcubuLW55/i4uWfsfNiW559nvRiv7big4HJ8PeTLk66R1jurGozkIp4wvemPc8ObyGfoXWctKxoz54SjTkQT33K2+hvivntYJs8QuTZZJNzOKWM1wQJztaB2qWm+JpQF7a4UI6hbKODzqe/Kf7OEV2pUZpZof2WaUFAIPgBU/zoWMzq/S53vtn6T+kAvrUi1GtBbk9fXIO9JiqKUE5KjnWExH7bqHD0SSdvTi5ukttyfqpi8YvnWo2d/HkgBHFCrnsB5661GtEUIolnGNVgc1HJEen3KrRxfM3LLV1C3Agqz5vme1wotY1tbZhY1DwXI6nZ6Tj4BwAA//+sXctuG1UY/mbG49ix4zptml5SlbJAXSC2PANCRbwEb4XKArGtxBYhQCxgw6q0aqloqzhJc3HSOolrZzK3g/7bmRkniA0jWUokyzNzZs45/+W7RJ9+JQiAUINC83qsFh6o/ZCq6bdj9RMUGIJbqJhQ0EIJuiXmy71lhR067ZTnvophsIZKA6BQhfyWrwJJ5TushAcVPkEPK/PKtKEXbeAufFhZTzAUWTdWEySsOmyququ8xtJ7JwaVL6bONt+lJ7EL4oY4QSaAixIFw5lZRVJhNU5fZKByIrhMg8DcEpoIgKralBUputR1Ii7+NMX4xRbK6bmMNXO3hPdaqv0QMcCWlnq499F95qaaJqI3GgpF2ZPgXB/cvctV6gDhhTxJhOkCDmAjLVZQN4wBUVEbh3tvsfn6NdLZBEU+R1KqUFCeYV5E6Gx8jCsbH1ImzBX6+gQAKhpcs/+ERsLmC3KiRsR3kJD9C3FjBOAoAAAgAElEQVS+ghhhOsNs6y+46YTfO4Ef1oNOsaJj+5cS6JBgFwX0gWgu01jEbN/V5s25HlxK0KTUCOW30XPOOAGRjuXZGVkCzjFcvYpr62s8plFLeG/UCSAEAAWRq2vXsTwcis5U1JbehvEvETYhk4sIAIWpIaDAIsZSGOPJ48fY2hnxfcYqqlUP50kl/bMHX+DKYMBBtUDEpVOfTk/xZmuEP37/Db/++BO++/ohvv3mIb5/9Ai//PAzXj1/if2Dt3BJylXoNlqsREvjTcETdxBcoDaGUH4luEASIbiYINcC1kiR23c2buDzLx/g2u0bvDk58zdqwEdLfz//ejTzgUuPenJw2fheTOib3zf70/r3jf/7fxwLEg0LCIBc0ZOF+PDTtVDCTJXi9BxleobTMXne7+Ngewv7WyO829vD8dEhkukpQ9djF6LX7qDTFhGaVlRxouGVxQUlRAEXcRTZuow+kST/hHhJzwskScaq14fjI+y92cfu9i5GL15id0Tc/V2Mdw9wfET++6dIZnMUBIUliyxn6FLHiM7QKSyXuuRJJt2gEnxuKhAUTvaCnHUHiO+W8Yf+jiLi04W40l/G6rCLjVtXsb7Wx831IW5cH+Dm+gDD1S6Ggy76/RY6HbBIVisOuNhZKlQ6DmSdt0SOV0dKztiyM0YRUtK/hKTsYpZFmCbAZO6wM55iZ3yKzZ1DjN4c4fX2EcaHJ5hME8wSs8WqTKjUhdbYsbVeJDDLzjF5N2HecHfQY0E5VivQgIfXvrxUKzXxsaZOESM3SPAoE298oSaJiBwLkeocCt0lCJeFxHyxAFCH6Bv9b/EjfFCjl1Xq+ouQfI8iu3RiNme3P0WdIhCovUvVlPee9PXiuvE+uUFQ0ynghFrn6mJxoi5Ahfr+Xoe4I/B8TvsNaWQGFhjp+hZ4L/5SRbqMJuJMF83OX1fCNotFoy7Uf1sfW2WTWvfrb/amo7DieNYLQVGrQj1y87UsVbzO1RAAhhZo7n0cxCtdkgJHg7leWJGt1uvX14W19j+WySZFsODxs3kiVrC5oNPpw1ZzGX8vD3OkgcP7MiVvX/QGfdarej855XWGdZJ09xbEhtkhguGx9Dw6hOjMMpwcHWJ2coLV1QFaJAxIgZRC2Au/T1/2Cpsvv9Oij2NRMnI2iSlZnc+RpzkmB2NxQKG5SjGSdv4DRRF4vkIDmKLPOzJOfbXj+C5kUKESDZfgJXtDdSGgLmsQYO3WdfRXVrD59Dk7tzBqz0mSz8WnQMQxK05/qBQo2mfeIzjLkM/nfD3ErQ6JGmeWeAo/tkEqFT0pSMvSyooNLQWFIypHEOoyUHonAB831GEmqqfQYoRGhjvra1jv9dEOHK+LnThGt93B9PgYzx7/KdTJMoDJwDqdMIF3CSAr2DbHl4Qg6awMkPU6bAtYKg3UBt3iVY4Dw2bU6hNy5x+Vt5zzArQ6j+m9jFTQkbQAVuIA9+/dw4Bi2lJQcCWLKzsuQv395Bl2Xo2kWEFuZ7a2euqjijo7YPnaCm5/ch9ZbNcluhnyTpnwumpdaSJqc5TyF6GnwePGAu2QF4o2g9ISK0554SnQ9E6kmpw6LehQnkT7hDVi8xq/3lu2ewE+yU0yFfKj63G1NdMOzvWKwvvum8aLnzWlNIgpQRe6QuqvifPFWm7F36+hx9mZ7cKG1Zz5pml3logFuVybFSaq84jwoTwkE6S1TIzGxezfaWwp1zRnOEM3MOZZ8026NmuCe/F9HQtrtlmxhP7j+86pOVRRiA0ZJugPya9bcYx/CLuW3TaqMPydc8ae2ElTN62jJrRBpRJCLUICiRUSEgseAwkJHoSXYMGKIjbQdRddISTEig2gphJUpS2JazuxHV+a8XjGM4P+yxmPgxCNsnDaxp6Zc/7zX76Le/+zD77w3uQ80TciikdQ8UIVDKkIXeOVKUfQKPcgV76IdFscLzK5sBqSRcqvqXNEhx3zP5zn0soqo/diOCnBUixKtVtStRWVSrl33ipBeBiroJCpcr9vTPDizPISklG6ByiEaQ0O4oOS9dxOCQ08ebL0YBYsnEfIAO7gO8OLSuC5uvk9PMTJhG2hi4+u0FlbvicvjqWIBdZUXZIXnkJfOJFR3qO3z+PJe5ojJ5ur3GHw5BgnL86k6GJbk0Cm055SAIPReIq777yHjcaWeg0bhnQZbrSk/Hyj6BzX9/exc6WlfH+yepSAnhufbBiGVRWcxWTMrQ0IBlyjgFnD4eNDTM56sDblSRXHy6xAlAfItnZx884dBFshEhXYEdSDrqGKqGoVWuNcaZesOZMcFiTWwwJKamVBhTtJGEZPn2LaOxbrFyv6Bv7BFKXwi6oEBxaNJvFyoHCqnBEdWxtNXG1fY7hMrnBvY7zDgiRVRs8m5vR5QZBljl5/wDzQmwc30Gw2SuVsEs2hLL/gjVbHDkHyyXLQUALghHtn1/lzKFVjV6+Fo2eVwQhc2W5hPBril59+5omI8xYg3OiQ4HU2PMXbb72JW/t7GHU7ePb4ED8+fIgH39/Hd1/fw70vv8L9b77FDw8e4vDRYwx6p0jOYz5wAp1chpwgCGXA8dyZoPuu5NQJ98gqR05Ed5wRa8K0kElZmaBrHk9FT/vqJj75/FN8+PFHCDYCFnkk6kShZVFRGmIp7/6CTz6KdU///5tgOeOf4er/VL8vxntzMWBr59l7iTsjWinSpZYJYFVzYB1/UpR2RIVCcgv9h2LhqA0mJ3xFmeQJbkVQKgVszcAkcy78k+kE8+EQg6O/0X/+F/rPnmLc7WPy8gSzwYin/cRDpcSO1PBp2hiyNslCdElqTicChXKKqeCh2ENWd03hdZoAcbxEFCWIkyXOZzEGpyN0Ol10jl6i8/wYvaMOBt0+picDLKbnWM7mzBUlj+4gtwyHpcZDYBySeYQkXSBdkHJuJlOcKEESJ8jI0SNNuZEWk+vMImW9kYyEtngbk2p/huZGgJ3LDey1W9hvX8YbB3u4fbCL/evbeG13C63tGlqX6mhtU6PDsj2pdeSon8kzCCwnFHWCeC6XqFEjrdZgrZs0ThDWGwjCJmBD5MEmXqXALLXoT1J0RymevZzhj+cneNEZ4qg/Qo/oDaMpxuMI0SzFkqYkhd99lldxhlwRWjL55f1j1XJMnzKvqyTGq+EpwqLAle0tbFJybdXqKVPCEJ19ZCMFWhPktZ0AUcpJOdHB6F6DJjtkdavTRRE+VBX8NcP8ajJSrCbKZaMuXxVLUOcQLwpnV5knrR8N3qvfZsp8yFeq/9Z8qbx3SU+q7M+LWjTVz2Fs5eflvqo0HZST7ZNvaPOXef252NlRcca2lUbce7KKMNXFPxxbVNOl3L/+RmnTzPjiTP8uV+g+C33xNVd83r0InCbda4AGn8ip0J5Tq19bVIsgyVNyRRDyGecJXoU/sVUU0VYmaJ7fn2vM1AlZnvl8TwsSRnd6moS2smgCSxDUSgJZdQKgD0gFywq95S+nkl/9xzefyY7Ny/ncZ8tqK7mlI6g4CcVRMh0vWJMkjSNB0RGlwgj6hWIaHTAsflYPmSN8/mqBxVxa/wU7JhTcDC2F9JW6QUu4TluHcl1yOJlM0G7vYnPzEuLcICHOuRNahv8qXXSMIi+Zl+A53iKqIQMzGSKZlJoWBaLxDNPxhGOOCE4GnEuRjCnnrNycFVFI35wVMbqVGwVMxdPdC9tpvmA9J91/aVW6dEBiM0Qux85eGzutFrrHXSRnZA9oEVJeR2KLttCcTCbXdIYwDcAs2aOecQbxAvPuEHYeI2SB8JAtp6mUo2Yk0WH5hlo/Es9LP3n+7MatcrqLDYGStyRVqpXEVa/XlMgH+mEtqOM8TtGoN7Df2mYHA5enaNapOeH4vHny6E92J6ohKGsFLyhqNZ5x4UsndBqjnsuw0l3bRUyT0kLyeoqlMsBSzQSV7fQ5im/mlQ2Yiq2on0azyKGnYyr3nW0NkwTzxRy3Dm7gdqvNQozyQdmehDWrhp0efv/1N8QxQ8tU/0KeR6DxjWugAoiwxOvv3oVphoiXMdc7YdhgIXBaG3TOFcorF/s89X3yhb8fEHBIJgvHRNATrIel+mRGUHtBoJRZQnFnS60dhWLs9z1TyFWLimsv1SExiqCG1o408JXiX7QF6DUNeD3lgHOXwJXJla8BRDPFN6FzHmwKckAQ5Umy0LowV8V+oTx4+0NvyS6QekGmc5OGKEJcKFMnRX4voyJYB4+aqoJe5zrB0+ErVq+kl0fXSOuD9dsYfVnj5iDfZrL+c8rBVy6/OM5lXOj7It+jFEQjgPKyuHQR8IOi9XNXhgtLisfaJA8DcpWQBiENwDl31YbLPIrwDwAAAP//pF1bbxtFFP52dh07txqbNL0EEsQDAn4IQiDBn4En/k4Fghd44A0J8QIvvJWqqkpJXWiTNnESp76td9cz6Jw5Z3a8KVIlKlVJqnrt7M6cOZfvwggAXzRDhPc8BKQlkI7ErFo1qPpiKirAWpCryI6q4cc8D4VeBBFBEe9jRIBaBgo/xAoKQLsiIWDLVJ4s+divMkuDdYRy8yHK/5BuExIE7r/CSOJiXA/++GcqzOn63K1iD1wTJn6V+MDrzTfSANEEhL4jBAAHRiciXUvp3Elzwvtz+kLY2kbn3dZey0qpcKT6TzZy9FwWFtXJBEeHA3Kywhp1k1wmkx6fblbwoqv9nRvY2z9g4xcj6ticKkgBQM+g025jb+9AxYR9EEhFnEYDtTWS8y05MbGWVCRpcXUwOBzgyaMHwLJAWU457lOCTVJiU7eGt997H53dXRQmE99nCIy1RgEkYeqrU586Cwt8GMpdjDi6c8FlOBlcsw7rlxOcPx7AFRdwduYTpJiLGETeEu6qbnYMc8bU5iWTA6Lbf8OvHZ0+yc5yTq8A6aLS9N8HEprMX44mrN7d2+lhfWODOcVGphc8dSeYknXY3r2OrLOFlCBGrBYd6QqsFKCvmkjrJzCsqH6928MvP/2Mi9FF6GQnMolwoqPx4N4fuH/vLr775mt8e+cOfvz+B/z+628YPPwLo9NTFuGhgp8K5Cwc+GBVXu+jbvh7bx0nfC+xgdKDjrmZ0uSiI2TpJLGMihwrz/1g/zY++/wTfPHVl/jo04/R6V+DpemNQUN06epv/3/+qJilagagMc1pgpybiAH9t/q5JIEa8CpuZg2nD/152UrCu5XiiidrrLysfsP+VTwtLyuUBAWfTZEPhxgeUeF9iMvTUxwdHmJ4fIyXwxPk4wnylxPYsuJpOoNdl2LlJY1EW/nJDjWpaKrfardZwZ+gZyl/3eB7MM8XGE+mWMxyDE+GOHp2hOdPX+Dp47/xbPAMJ8f0fnNMR2OU84Jhjiknt6Q7YIXT6Xmd+pdieb4oUJXOF/U84RExTdoXiwVgCy6WCJ7fzgw67Ra2NtfR73Wx0+/inbd2sb/X5683rnexu7ON3rV1bK+nrC/VaZMWivX2fwTtTB0LY5lgreS4acuNaaRc+KfZOgy8BVja3kJuU1zOljgflzi5nOOf5yMMuNgfY3A8wouzKUbjHON5gbJymOUl5nmBRVlhUZDAkUVhK5SS+FPSWEYYkVaUsK2u6oSbbWQLdXEyxOTsHG3SYUgMNgimN5sx8oZhfonfa9RkSekgz5fICJE1LzxcmridNKkNkFlJpGv/AVnXq/vMRaJrQD2QW/0/q3ujuV+a/MrXocvEr3kVP/O/XtvcnwybVGEmY8J57MRO2LBrROUpebwec68+7TzM9CrJofmGIWz491NOqBRKOsHmGKPcfjqf2Ds9CddYQQA44Qqjjkd6RgW9lkQbz5E+guQGmXpup6YZfiIua51HuBjVIA9Y+bY2cmfQtdGMd8Aq59lDVH2hTtDdGhERIRxegyrlpBCnc9nZ0uuZuAI7mx1s0lqfzRneTX7/qa2w5Amj8q3rhio386ngIMgs8WmzDvKK4MHArMpZO2NNIO1LeZi6K6iJTi4ppsq5gXo2PEWv28PWVg85OU5JPpFJcRpj7XwTwF5dQUIrot+tlaQejUChr1hiOnqJyeWU8w5usJOQc5YJXFon+9520iaraJyA2kKMIo320Go5HZollXFYpL69fvP2Hgu1nj09hZ0ssJYumQ/vGwxpbX8oWCWEFpNH+7XyCnY8ZXQXUcrU4YUHInQviG7T8H32uZTc8dBc12TvygIOxagW2D5PdGI/LA6LlPsag4N+l6foHW6yWhYDpPNl+GSIR/f/RCsQHFwYr9Th14my1BItQpyRBWvvTVRUZJEGGlNOfWMEgvJR4Ub93CGGhUffyCdc3SgMOb1TXRmiFE/R397Ch/u3sG1U7983rjtpG+PzEe7fvYezF+cBHAGx81VUmROk6yK1uPnBu+je2sHaRsYyU55ZJNFFmqiqDg9pvqqeGf1I9YsOQFjt3nk+OdULufD7tUDlegYuiKBDXKuo/smEg04Tfa3lYtCZTv9bkQNAItbvOtCFTNy1Nqwi9IHuiVWUQO11H9ec3sq0CgNYpUWz051oHsTC9lTnxdN35flrLI31TehO8eflZsHq8/cNOdGEU/c3jtv+fpIAIDkaqTgt1RRxzRzHbtVQaJ6tK/dAaQFSwzMCg8Q25Zp6XUVztFot/AsAAP//hF1Zb1tFGD1zF6/ZurhtGmjTB1RRBBIgkJB4BvHAAy889gUkJCT+Az+xqFCkkrZq0qZpEidx8HL3Qd8yc68vFliyqriOY/vOfMv5zpwTfvrjl78Kuq+UJyuTe55UMzpb09fdizSTvqN0OPq9F0UgtXkV4bOqbOgDgv4uAwVh3QQxwtGRJr8oREiQaSqoRRjoi2M6mq0tg9z5b5i6uXcNd6EaA25hrEL6/eKrlAWhKJM0+VARwlqIwV2wqlE8uWRKCxoqXMRoThAq3SLyZzW9krVbuBZL1JNm8rXeZzRC33QxfzvByYvXyKepKH3y5BWanAQASFCwGN8nn33O4lV1YBWUn1Xqi4qL/t27uxgMuz4jWmVnVUbPqleBRy4pfGZsZRFhbRhjfDTG3uPHSGYz5GTXYwoWiqG/mWQVru3sYmP3PrLOQMn0ls9AObEiiTmVg+S9YIf/HhqU8qpmRaqaboANAqKmM/z99hWy831EdirXgU8DuKBXwZHkqYFdCy16ccgTBxaI4uMlBbqDATa3tmoAwK9WfU82UNuTiiljVSmI/3yR4mQ8RtSJsP3OTdlUAbxmAAXEeZait7WF0fY2++Zbn9SWi/N2AJGF6Ap2sesJog42h+t4sbeH3x49aqDOqKcQAM4uJvj9jyc4eHnAlDgRDKnkzJjupZjXsTSdIg4kk/5ANHNr73JtZcVizTUWTmBHi1sCEiJxp6BJzu3b1/HhRx/g62++wsMfHuKnX37Gt99/h3sP7iOi9aZAlDU1GLNyX658tHnTIiVwRfbyPXBCQo3kI5M9T4Stf785+fSvtVzMVl5pVkVyvJpyrXgOtf+pzxvXE7xu2BEaIFETKekkC2BBU/QJ0skFTg5e4uhgH/tky/fXU4xfH/L94vgUk7Ox7LUs1cQS8CTJUftEQDWW2MUJSyZNBOaS5zFN/MOoy4VEkhaYJxnGZ+c4PjnBwf4+Tg+PcEAqyvuHOH1zjNnpOR87yqcL9nM2BEaaEGVeIEtSpDSJhqD5BIbReTyeBpAaPwG5lcUiKdVi3fCdmEdlKa4ipF/QDSyGHXGGuDnawru3R7g1uoKdW9ewfYMa/gFGVwfYXOuh3wvR7xgWkeRmPxDWCU3OmCoLow4bck3ox5hZYFIqUdyKOxvIyhDzDLjMA5wsLA4nOfv3033v5SleHV3gzTE1/dTwk6NNgbyoOGaS+8d8kWCeJMhI9DC3LByWq1QoF2NBLdYUKgAgQE+d66zfWwRKxLBZjvJyirfPXsBMJljPM1yha1mowBKt0VKsXkxeIUxzRKTtkCS8lzg/xgHbFFYO4OS1Grb2ULvgbv2o4rfNuzseKErQdT3gnlsXt62923qsrQuw6rlNMP5fBVejsXSPl6pyz+42SuOHshSNTpmt2kNZr7AcarHqvqP/iDJumtcEDl2zpf/BhaAJlDYccoxHpbHFBVF3XMBroRhPTDaNOAtbN13GAYKNzx5o7InZ4rhqgNON99Y68+qmRq6QdN+Ns7JqgyptMAYerDdeUJFjHDUIKOvGtVK2VaNO/L8b7RqyjM3zS/TCHB/f3cEX7+3iFgl0EgA6HsOmAnKRnghNwqRxD7RRdVYIEdP1q+EG4uvXEV4doez1ucYh7DUujR+CCLYvrDUBQCwLoRqKS5MZpkdnuKJ2fjnFVwJ7NB9UCji4vBV4+rzmMushHPlerLSdIlYWSCycJZhfzjC7nGK9v8bXkCaC/ggIgRyh1gfaLzODQy11nLUmGuODlfvPrZ/mIKUT4cadHQwiOsb5GmYhrlIEIHeYuSWvanXownW2CVGEEkMjusaUfy6miBYpelHIgyTT65BgEXKjVA7X3NtlJ5IgaAuLtmOBW4Pw2dmDIuxkFSkAZVAmM9zc6GBntI4Bxb2sRL8/RMd2kU4KPPvzOdLp1B/IMk7o03n8MzvMMOgRq21bEPcQDYZIBkPMaegUOPCrjtzCvnUA3grh0tZVMOogY71toDB5eGhSEosrxQMCuNcHkLa34oI3sCGKxQLPnz7D0yd7yL3aglmyR3WikudZjuH2Ju68fw95VGFRyNly+lysrqODvigSQUqjDMYmAMCe+gpO8BAzluad+pnhcOibR3cToXhVmldrd+f7z5N0XvOiu+Oabz+9bpzvt5pboEAkT+61Eaea2/WD7ViVqfMavW8njpemCcc7p0dAzyF2B9vxUS0Uxx7gcE0567n53CFrzVnTO1tad4RBy0fVp5D30/byd++R96B+VtY86PWkF1Z7PrIGdD1yMwc621Y5ZlEzAty/q/JkDR6U3ENzfiQduKVY3AAVwgj/AAAA//+MXVtvG0UU/nbX3jiJc3FiJ6VCRVC1CASoSBUI3pGK1AcEEpV4QQjxP/hhReIX8MBVtOrFNPfEwbEdr723QefMObNj1y21FDVKVF92JzPnfOe7RLe+/eRHKLVN3rQeFoVoPFRjr2iKPz1X9MQ34FOUweYo2kOZsyYlYi8S5IWev/RiABmVV62+ggviJurfdDJNUgpPIcWPsgVyoXE4VkFYmT2oZwA32wHcZ5jZMYn+TBuaZElGzoGyFK2hpevqa6lTtwNEhH5I/5fQcVrEbgFElfdAIM9rytmiaHYDsQZGTBcqc6xEMcLLHOf7Zxic9BGl0oQpXV2iAOmKji4TvHXjbaxvtmTDUOdHG2nHcowsxVanjc1WGzNViJvIGzZ+U6ZFGNnJBxXCzWaIfBrhj19+x6B3zlF8xEJIswlSorZEMbtkd965DdPctJmzrsEsXT6pZTf6DADv83sYiZ6NXB8VlnYdmwDrBIqcHWLw7C/U8nHVTDpkpkKw6TnIxG6ZtHhstG0NMWgtUn701va2M5gMZGpsArXtCuUArwphomPRhDOZTtl1dve1XaaVMqqJwK1PMgAiSnybWAArqy5GKAjCF06gqx8Y7/qECKgRazQQmxA/3/8J08nEHnAqMSHfjUbMtM2lmoWAa7JmOdOckjdo4yG6lOTvhrKGVMMfiXN0Cb8ArCieqofjw5GGuRHQ3t3CzXdv4u4Xn+Orr7/Edz98j3vf3MOdu3fwwce3sf36FYQxAQQpS3usIVou1N6wotfOPV5hjiRMpf/Rmy6qM/QwXnTdTfVNNSGTCVBgaXT2EAnck4UC8EUaLcaAi6WiU6lcM9x582Q3ubhA2u/jpPsYx90uug8f4OmDBzj+Zw+9wyMMe6dIBkNkl2Pk4wkKmlxSw50LfZXjw0LGUeiAILO+mJF3opjG9qtWZzYQmeZMic5/mWA4HHMO9sHBIQ72D/Hk0VMcPNvH6dEJRucXKJKMDQWpyaSiuZzmiGG1cTQBYKChMJX+tKwAAC00dP83GstXWmI8fTUpcq8eYWNtGVfaG7j+xi5T+3c6Ley0W9jdaWF9jZp9OtANlpcIsKMblLHLP7j4q6jKtHjpswahLRQs0EGW/nWqQLigy0nKVdaRmyWc9KfoDaY4PL/EQW+Ev/fO0D0+x8HpBc76CS6GU2QF0YqJih9jPE1ZvpaQsWFKLIkRT/4p9z8taAUbJ/SAgI8qYqFHLGBaIEwsuFlUtSDp5xHtJ0RFzTJk532M9veA4RDNoAbODsmthwLpoKO0QG2aIaRpzSjhqMZA8+EpxScQZ3BNb3jJH4JOtB0+tiB2U53+ywWCfp3aBB74Pv/7mVd/iWRnnnWz6Gc+KBAE6mFRTbcV+OdrL4WWZlBrfrV/Xlfa5Bc8PEBYQQBtxCuJmpr9WQnhUmOZGTyItGkzzsuAJVum0guHCoYDkiFeNSeB3p+562h9g0p3/56/X+FMweoXoHbClbt/Q/fii1kbPgAAKNBYynooWGurbthaD0L0q4vu5/yDXfmXqF7qYyPM8dmH7+PTG29iLR0jPzlF/+kRoqRgOrqVcSqlm+jZNTaiy9mzg5zp66hvbGJ1u4PO1WtobbeZkV6Ox1Y2wzn4xkm1AlhGQGBj5jkFJaKadJygd3SMlcYqms0NaeKN6NohDb+czeyxozx9HVaEVfylUPVL2QHAzLEIZjRhn52L3r8Y9AdYa65aIzPWQMoQg161MDztpf0+0r+3V5g8u7Wgk8rASoNSokfHNXR2dhj833v0GDUClEiyVYbO84jHJrLGGdxSyb4psULvp0gxITPfwYDfF0kxKB0ApC/WNaWDfn8dzEV5vhgA8KBSU2Wu14RtHFITVyZYbxhc7bSwSsNKqu9RZ88skwDPHhKY3p0BAHxw3zapIYsrY/UgS3Osb21jsryMNLISEnvPKzA/MnBMiZkEgJcAACyl0r9sGahFkR0+BdkUV9YauH7tqvDSrOEuGXpSTbH3pIs/f/uVWXdu0u2dIQoAZHR/l+82yU0AACAASURBVAq899EthE1iMcBN1C2Saz+7jYKzvZYRZ3mtnyimXesa16Qzg7oQjxE4hjbtQYWnn+cYdYm0s55r1lSw0rUb11fqNDuUqb3S7nlYGtVcb2R7y3rlb6L7kJcuwJIk0fLrgJavTmnm9iVY5qb2cwRKkKeSxwTX76l/s4CTNRfURAPb73lDcIquJ3NEli88D56SzMP6Flj2AskSVJLAfkfCqPf/j9/Q+x4B/vuzv7Neff55pgN4HlDx9RV2vJg2qr8dnw95hv/4urLfJo4w/ttd79pee93EOQgYcgCFXqhUKpUqVapU9bV/adU3+tpnUPtEq0BLSykBEhqHYHzEe8xO9R2ztkPSlaIkSrzH7Mw3833zO2pBbRaorbVV5cV57RNwiBNhhfe7arJT5cc5k7pbBLr/yapKh+Hzk7q98/iu+PouaKlrAHUUgVcIEsApRjoKAX214hbvtDPkT2HEfiC2FU4V3qo65TwdQehJs8Z2hQi6Dr0sena6J4KkTgiKphANqONAreYgH/5C+0HpAHzPecHVUX6OQjg/rvPwwDJ2TtHa5w5BnB3ZZVcqRDSzpMpMik6vi4s3NvH4/h8cKBi14YJm4CM0ylHyCuw++AU7126yPzwFMrYjMrIg8TnglXjx7AWuvX+dd/ZooUu8bMXmiT5s6MGtCS0vpmjhAGQ5sLOzhd7Wdfy1+wiB34Q1U3hBiJA95d5g8OIxJkd9NNe2kPvOQlv5f3Y2MVV4tTMOR61w7GiuvmrbE09vef0SVm/cxvP7PyI7OURgp6rb7G5avtHkl1rgcGyxmoSIUaARNZlrRe1MO5P9oz56lzfF1qQUYcfTPvRhKCUMS6KMJZAkLSwtd/DycB97e3vodpfk/VlRw29EdaS2xPCwj/7zPfTaHaCdcPJNVmHcJxdqPu6+fbVAdGJ4wjVkL2lb4PMv7+Drb7/B3e9/EDCYLmooWSBesy8dUZJ+KwJKvmpLEAeowcsK0bQwygki7hL1f0F+GCibSwBpboj7UuDf6F3A9tUdfPbFHVzZ3sStT29h7cI6OivLzAuDC2qsnUBtTDzDkgXZcpMyXE+KQKqkDfU8PycJOe8IPBFNY9/4sxTH5ops53QwFfPUoqaDxerPxloV5VFusZUFTRi45YlSgvQSNbYx0vOVGcp0iLJMWRH/ZDzBaDDC4PUxOyEQJD5PT5BTEenkhM/TbiWCtChV8dtTsUXdMyQuGU8EBlX/me2CEb8LHEeoD1I/pt1rEpojm53RaIzRaMICfVUsn2bsORykJav6Z2SfREVLUvrn+OkhLYULSP2UEmHi3pZ8bsM8TOLyFyZjAdCiyFCv18RmyBq0ahZx3UOSJIhbDR4fxB8lvYy6qvdzv3Y6LRCoHs8/FIqKKfJSFs3U5mmRK+JFCsjNoMnPzfA5nxwKxGudkCiTKTCeFEiNh8l4iuFogPHEYDQWjQPZwZ9y/CSoJhWeiRqRpQWrNE/THONsym1JCABzquu4XuX+YipVbhG8pLdS591Dp0MukEmP1RZqXBRi5EApdLWGFqd9Qt+NDbw/n8IcjYDuGuLNHporKxh7MiCJCoC0ZBpP9nbEVoiU7NgoQNiIYKIa/Ead4c/V/Z6apxaSSu337wyfattqTukas7nTuDlPF3jBfBFAIcjzx8Kvjjd5xj2dhxY4/Xul1V0V9MHFRSbtud1Mpp4o99VbhM3zVHcG+q6KycarlMh5/ewLN5k/p0muge4Kqe0ujRmCorOORxiop7Vow3inYhHvRZQiJnzWDOi8sRc/M4eUs4vv0SX6LMxVrzMSjYWXrRTO6WiSTzSPl0CKvNXrkiTA9/9fAT0IHI0gQIB3VahZgEvXlS7OeOqTnRez/kjXqMfE0R2zjekH29v48OIKbnbbaMchDqdDJAevYKce0laMstXA29Ji7AcoiBZJxfSkzei9uN3hXb5uo4NusoylVoJmmsFurOKRSbHf/xdO/5zpOK4I4Ov6SYU6eQyVOYI3A2QPfkNceNjY3sLxUogB7xL6mFJsrGDS/sK40F5Y/SRooNnYYUId0aDCJs97+SCFGWV4evwrwm6Ctas9eO0IURJzwcF5GJQiGiLJryK8eHdXEw93EApv/mBqLgtUy7xgsgzHoQ+sh9j47iuEkY9/7v4E72CIkNP+gPWLaA1FLyjzVcuqdI4FZSWi16Q14us+8t0cwWSM5WvX4a0W8DoJCvJ/p/FhbCUuWLUOFTkCmUNknpyJYcyjBbRDS+KoaF/exAsidqtJPR/PBm/w+6sDrF7ZRue9ZWREiwpqWLt8CR/f/gS7P98DyPLWm0HD54/cCIqGhmBEY2c4RP73U2ysrsCPmzgkelsQYArRl6qFvtyu3qctF+kxtIYq9J3UNMkVEXK/ojXwDrMl5FiJ0Itw9HaAhy8P8Gw4QCtJmJLhe3V4UYR6p42rH93Excs9PHn4pBL081T/oxKXtUIxG+ztY7LfR7i0Dq/hV7vePEtZ55iWa59ajLFs4Ucxgzn6uSbYRJmNMJ2O+bniOOb/LVTryh30WTro75LEz+KCK7o2m3F1HZcLucBN6x9JZgWeH2ge5woDjnoehhEjxaEWqo7LT+8m0s8b1SEwainpbNo9dWsRug1dm+5B+ia1kaPh0DmJCu6u7Z6Nqd0g9X7SPKM1GkkmSV7oXA9Y4G+u2Moi+Bqz2VWBxPlK4fo7pw+X7M/n0y6/dTmvO+9Z8yIl8vQ8tOHscmFnaR/XY24vp4EwKy74qNVq+A8AAP//rF3JbhxVFD2vhp7SbndbaQ/BSWQSyTYJ2SDxAfxBxKeyYpEVEhskdkiAhAkhSdsm6XmsEd3hvaquOI6QqIXV7e6u4dWr++5w7jkBKo6A9GrkTsveBv9kxPnGxbHCLAo5gnKGxUI1bG+FhZzR/+mkGs2aZGDSzD3slsU2DIR0IXfOuEh2WFZHlKqy5YknfXESRIeBHWSVfyjZQzqOZbe1W1kaAiotaAeJJs1cWSRpUjlWS8/2wJTIGrTNoCyTwRkgNQZ20G01vTh+uvXe8htEy6giSZWwkQp269g77qPb72Hx9wgNx25q3PmnSYR1vMbLi9+wnAzR6uwzNNciO2w1ghzTV3/+hfH7CY6O95ATDI18pcqKVk5qMm+QRu87XR9nz77Czz/+hPn1EDlpnBLpBy2m8QbJbIzrVy/x4OFT+K0QCd83XwlVbud5z7NtjWfj0JSazeJstoeFD9T6xzg8eYaryVsOugppnqz0VxbiFZHkLTbYUZhTwg+XkI5Mp1PcVSNIJFdMmhGKYyzIDjsecq/JyHU6Hcw3K7wbv8fg7QCPHp1gt70j7TMQI0kLp59mGA0G6N8/5n4hL2gpY/SNl//hpsoFpFhAOuy1ThPPv32OH75/gfF0zF8n0rVUFwROXGQWXeN9WHVy0ypz8ikRZXBtskHbSXwdt+OHd3F6fo4nXz7F6RenODs/R3evh97hviQtArneJGeFZpg04vNkZ1kxU+xAmFyddiXPK1I1+pz8F/Ed+5tbqooVh9uhiT6SFCjPuUxl2xhazL2NBTxR4jxNONK9SVW6ipzDxYKd7cVkjMXkHebTMc8tCvTn0ylX7dkxU2QB7ZZQGbk6QwxV5QQoVWt8dsp8Iy0oNb+mSVCxW4GpYR3FmM3mvKhuVhHLytB7InkhBM96uWI7ToEA9+flodRiqLKWkhwke3oc+MfLDV+LHN8+PyLbavv9SOvfStAQFJ54JEgOyGsYtNkRb6LZqiPwMhx0O6jXPCa5kYBEbDW/DqRHnzg1OOmmpJbkmNQI1u+lbE/oNFivmRZcslFkY4hIKzOITZ0RCRvqN0wTltBbzdaYL5eYLTdY5gYTCv5nK4bzZ2mAJPUhRZGckwY0bmR3yZmeZhvEq1jWukz258AiH1grszV3hQcjdyGR48KiETSBzlUo8D/RPRgn78YVYq0uMXKAxvzqHbAi0sQlTH+Cdm8XXthkaB9XYLg1IEG8SBCbHPVWnblhEnKSY2XZNp9+pm6TrN1qT/OqwabZciS34/t8i2TT87bh5uXPvRLK72PVzDLy0JT6PLeuw5H6KYIQvisC3Li/T0OMnIqQTQJkVjmSqixG2ltIe5tJzhTmzS1jkrUXyUs/ZDSMvc//x2ZbMKqb5VWybV8WlWgLK0LqbLYIi1HSqL51LHi/xf1yBRS1FbSWtMKW66kVIi95HWi1ym7UnpdQ73+eoBkaPCZyz88OcLceYhqvEYxGCIZD+ETtQ5XJdQvtg0OEO7vIux2YOzto7PY46by/v89Bf8+ro0NOM9nfwQAXr//E9dUb5hkwbMvL65+nKo6iee/4GLwcYRZhfX2F0SpCezFF+/Q+0GtjSahWCsRVYjDPttlrPC1uZJVhzEw5CQCVlQRqRvp141WC+GqEt7MZ6v0uuod93Om2Zb33BdHDnAtBA5kvSackKXxN7wYeB3fPFBzH/mMtwMY3GHK9rYZ733yNMAMuvnuB9HKI3RxouAQ4NGVpFX/EH7DUmx75rlECbxhzEnOznKPz5AmayDBv3MGSCn51o5xMNyTveN5lFQ+gsqkKmLGte4TApF6o0Gdf7nK+wuvJHKODGL0gQ8tQgiZBs93A52ePcXjviPlzSPUlydIC+mcTjolySOQ+t2k1sxSrfy6Rv/wDO+YEm+4eEkoSGWGq5KDNfAJtWH1mTMmvKCcLdAxIcebXN5ecBHh42kbDSEsCJw0bAQ7vH+HByQP8/ssFI1W8G4aLCS1zYD1LMBu8x/7ZEdI04oREcTzfdq0XvyvFGLYqn1lovkJlRKPfd3EfB+Ia1/klGTpbWaff0vcSLt42FCmdcwxHQSqT77EUnvLIecYF3MIZIAE7xX3ku5I/Q59LPCUE7FyZJ0JutWW+xl7QIl1WKma74rPacVtxLzjtRJLPoWoqiPMyAtTGemU/kZ5Dab8UdIqNITnupeqrPpfkZ8h1BpxMIZ/SKEqrui66uVMJ+Is+/iIOpY3GkQJ9i1CgeyXcfJbPwCbq5fxoHkRRin8BAAD//5xdTXPTVhQ9kmXLjmM7DcQ05INkSAttOsMwnW5gOt11y49sZ/oXum2nXXTRXTtAGGggNGTSECc4lhVLfuqc+96VZcWmH28DeGxkWdJ77557Pq6EwGvki2yIzDjP2ldKf1JCHIuLxyx9vS2aJ8Vn4i6Sdla1cFdKR5FmyNfDIJQfUen0RZqhdooUrIDr4CuDQahpTvuv6E7RJEJACPcafBer4LubnF2ksaXI8cGQXE9HM9WMf9HgBoHcoIlzdJxLxSpIJ97bkXSgRr1hO1FQ+jW7ZJ7B0Fyiu72G9e0N7B30hLpuddz2xqSmZOwml7+O/8TzZ3u4/0VXKKvchEcDy2bw3VROOv/+y32hcNOkPp311QqnRBDMS2y8BtG4rZ2PsLy6iYvDpwiDRSRZZIs6cfce4NWTx1i7/xV8GuChJpNhsZOWzdhWF4v/Ihah9jHqjEsQgIvA8vVVrOzcw6vffkE46kl3WfkguhDrKfD9b6MEq5xcan5OT+ODwk5psplajRDNR8gAKPX9pkAJuXeIetbRarelyDs8PMLi7ZZop2yzLrEa+zHjgA5xcvQGHzbb8IM6vNw5/N8O27GsMSe5UsGDLx/i0aNH+O6bbwWMiDnhwzIKtLicN/IGl8g8EhvH6ybPRrOJ9fWbWN1cx6f3dnFrZwu7u7u4cbOLhcVFeI2qtW02mrjAdrSLauMVFRME3u8jWTiF4pypntVZA9pdkBRvxc3SP21Ar4zMOXHnWc2l1bFQ/HhF06GpVuS8YxbiCZXA53kTkIIdPo8099jl8Kfon/YQnb1DdDFA9O4cUf9C9PK5qYtzBg9CtwgptVELF0mZ8OCN7Y7Uo3+GsSwGSyrIpJBIhZo+Qn8QyXxBAIt/Mouf85qAoIlBk7GT3PWOKAmpIh2MxFiUCxA3ySa6lBx+mePTsWMmaQHB/NjE5Zd7YlpIQy56SITNFppS6FfpP4dGgxIEH612Q/7O13mLVB2Kz3m+KguSLqqWJi+bGdHzs3NvHYjZlYIr5oT6JlT+qiz4qSEYm1kWEsGNxAi7tx9fIiIQQiBvSABggCG7ZZyfaQBEfatfFydeUik57xHkoFuydiTGbpPC76gigyJYls24V/wSgjdR3Pu5Q3jqWTdp6Q5nlgEAR6fNk1A0+cVxPSrC78oQMtN7cIaaiYFogKzXQdBZwSgIEREAIOBJMI33RD9B5TR0xV1dcrXH/jx7Td1UTCL18mSbKRBu+vzKa1c2B4DL6YoF0LRYKE4ol1kuqUJJI/yf54JZ5zij+H8fYKij3NU1hYz+WQWepb36YpLL+5NgOCUIC9UMaTyw6Rpj18RwnylKL/73+c1hX+ZNDJPlMYn6Wwgg4D4r8jfXldeNsbEV/pzjmVzLbpuak9/XuD2gRIw5ur44YDsGgMaO5RttFkaBgRklWOt2cXd7G51WE1k0FNAr7Z3DnL0DvX2ZbsI5bGn1FmrXugjXNxF02mgvdbC81Mb15iIW+GzFEaLDQxz98QKvnz7B459/As56WA7oVJ/Z58EVshJHCltc0ste8ujdM5zKUzWC6R8h+r2PetzD0t078LrLuKzXJB5VPD+y6ejFibdE+alzDm6ecawN93v6Nn604vSNZphi/OYcvZM+4qUWmus3EHYaqLcWad6DlC7snnVjLzLPJk95Zerf5YY6x5BeLSziQg+9Dxaw9vUDef/+9z9guH+MGlKEzpdJtPcsRDNtvfj5UWxMppFIvvT0GF48EOPa2s7HaG9swe90MGCsXXVCr1Y9tQ4tYoqdeUuZ1++vUI3nflvHtJKLGOBkOMDB2z5OLmJsdVZsysfAoNLwsLF1E7uffYKD/WeIzQgBpWz5VZrM7ePMx6WzAwyYK89Y6ZcvsBCGaBLIoCeZpk/41qLPy67OEdPXwe5JMq/MG5sewiqqBHh93sevz/fx+caqRFJXyRrOYgQ1H8s3VrB9+zYW6j+K4Wx56CUWU+cYONh7jmsP78Cvv38P6LtUGig1XotQR3UnsBmIN0XiQIEZ8rDK9DHEBNp5r4nxf8W3TQuT5Z15yb+v1vJGs8qzZg2CD6z9tF6DNox9p4/X+LuCXp7/v+r/pYtvnCTJz64U2Po52VvQW67EQpPvWJJulwdrwvx4bBwSmFNpAGWL7jtz/uO5qDRCPCdUZjHD5ya/jeaA8/pea/qnrAFL71cPPmE7OcnHlQHgbwAAAP//rF3JbhtHEH3Ts3ARKYm0ZRGSAmuJEStwDBgIcsk5vxEgl3xdPiDHfIEV5CAnhi1ZtixZFimL25DDWTqo6urhcEQjPkQXw1xnhj3dXa/e4hVPzE7SXBgrozPVYu5njf2s1oNOuIgY28Xddvzta/NMRDmooCJITLaIsticf9b0O4UJwymY/NkLUliMUaAjWrTFIEcFswPq/AtVpAggKImDsK9jXYQUfoSmNBoNRJM5XdaY+hlQgYywlGdND8nJ0sgM6H15DnGpY0LnZekk88echfNJRX7ACBEdn5PIcxqZp6G9FPe32ug83sHJX8eIbxMYPMfoachNW7M21cQ+vHj+HN8/+4EjsBJtc5HnkxJd1/Pzc3z75BBNosTb49LLaYAsJ8iM4Rs1tfYfb+PR4Tc4+fMPLobAKQd0zDOodIrB2Ut44Q2crD539S+Ob35sXpiVO/8L18rS9mg8uUaXFiJDrVpB0NlDvXOAyfk5VKpKvbmCEQ6AYQqMYo31xMSs0Q1LxQl1Sm9vPzH4QmYz7ByqnBwBTPMx6BincdfhYqeR1LFOTIDRENcfrrC7tYPMM2irki+m+J/ROETv8j1anQ5PigjILCcxNPj5aF567la3yIbgLKHPoFar+PnXX3B8fIyjo6NcEWYox/OCuNz1516uXVgDH7WVCh7u7eLg0SM8efodHu4+xP7BAdY2Wmg8WDdtSflL0ohp2U6qcy8M7lqTlo5MWKRLbFDvzJghUhZFpnJXYaEFLN38/p+bfxQ2QLl2Ur7UFmq6QENefJ/ZRHta4nu0cbbnFIc0lYI5xjQaYjzs47Z3g8lwjGg05uJ8PBxxkgIV3ysMJBl9MtswWo2naMZdG4GpfKbUmoIo5SIijFKOAY3DCcfyhIMhZpMpj1Uu+McTlgLwJp6oaxWz6SbNHv0/m5FZqEIymvJvTTv3kHwFkhgBLe5klU158gTssoOs4g5Lqgn8pPlawwvIfK/C1P1mvc5UPtLl0XVprlZZR1mpG9p/nE05isn3ae1IZKOb8nkSO4R8CjI2bJMug73gngGt7CJG8zDRPN1qk7szCZk+0X0bTjGNUv53MIkwDMloMEF/NMRoGkHRHEySBNpUMJBHF7jGw25E6QUEfkSJKfqjGXdAGanXZs4s34kay4u0Aocsfy2fBsezCYDheIgczUZikSLRUcCgg69nqOoBPC7e7Xicm8M5hXuXhR8ErI1jpPRb9wdIhyHcZovndO3E0pEzKQvRVc/EHAY1pv7OaE2XeEk76zvSpUSh82+L/v9i4JSfJ53q0vvHgt0ic4Ns9u90V0TGYx+znT5H4luzTOfdZnvshoXnLIDq+e+iPj93fEnh/7m/8nHbCo6kJkR1VsLsYEgopUJCo+1q+Lc3mNFc0FgBWXeOJCYVd4ozlXfm5p/1ZWyo8oa2SCl1C3spot/TBp0dummsUFPEnT9fpkff/Z7iGBGgQycm3kvWSaaZSyQdhBFg94ZlY0DNm/gYTjzD4e4httv30KxVkfRuMO72cH32FjCSZPhRjMCbQve6aO/soOV7qFYCrFd91AhYuLzAoNdF7/wtLl69xtnfL3D97h1WlUItM1F8jFkvnJC579wcyJs71DMLQGeocvNojPD0DT4OBmg8e4pWZxNuUMWYozDdhc+03h9WwqdLK7pTHoKuFb7xnQCfmgITc78PJzH63RsEmy0uApvtFtx6ledj0trTbzeNZzlUme+l8xaQ0e87AnIoBqcMOEzyJ4on1ipFVnex9dOPLNM6+e139E8vmAlQUyZez8nd5xeLPTriih/ASSLuPpMGv/vmFAlFf4dTVDY78DY3EDdXkPqKx0WsTEqKvVbMosj1oEYuYFMDMml1O8WL6GTz4+DiuYbuaIaTqx6+frAJn0BrncJ3A7Q3W/hqfw/ttfu47X8q3GHFczBeKZb5mOoYTbeGWbeL1H2NenUV9wg6aAToQ3MDyTagMjNQhN2R5cfGoE4mYH/B9PXOPKkVZtq4wge1Vfzz7hIvP3zExu42PPFkoMzq9Y02tvd2sHpvDd3LT0vnBWYRwjDlrk7fA2GE+noTE50snZ8hoKaSCL1YmqxFGjqtz1SAGy+3hCPvbOKbnUscBwv1E0kEWbPOHX4/L3YNUCCAoETusT+A8oTCLoxboeBzbSax8jRP0Z6DJNB5zSaMP5ISUpR3fh04jt3s3U3Mn2EU2Bx9WC28GEsW6f983nRNREaT+9NZE1zW0N+V2KytrXEDhj6HmsFWl8+sRpkHbUOZ6kM6p3gSmnVYUhCsWSGnqpQ6/znAauXiMo/aZrxNdCm+jxn1xL4iSUz+nLme9n1KKfwLAAD//3RdS28bVRT+7p3xa2zn5SYlTUqVhIQmUCF2rPk7INas2PF/2LJggYRQkRAbRIVQqNqiyqkdJ7HjsT2emXvROffcGU8CjqJEbZIZ37mP8/geoRYegldct6KKyn7F2ZJFpDzv3/MKfFGAb8p7xoeSwNqMFQjZhVg7G0FSrWZOfSMsKk3loZO5rgz5kRpbFA3c5kzwGCcKweIJgkKw4mvLnOKg5pTZ6UNLlZmC6MxVh6iPwp38lUoRvagCxf+uRSQDpasBrQHq6qZpUvj40+CHApX2E8NBTtLigdBiYWXJ1UNOknsPHYlakYhoOLgLi0MQn32+KLhy8JVRoj8oZ9+Ss6WEQSNqYjadYePpFrbOHmLwy1sqjCNy64shTSFb5Cm2QLl89Qqz4QDR3gFDhT3nnmmHcl+jyxGurq7R3Wg5+L5xStL6brIuEFaGQ1rXWFzbBJ5++hQ//fAQs6t3bmx1wjZYbZVhdnuB6/Pfsbe3xzJgmaCvcr0C6y+KAO4VrI6frV5bCtMIjTu4Tc0grgHR/gGiozPc9H+FykeoE0fYZmK9pVc+M+ZeDeMcm90IXZqjNmVLM9oQyf7s0d4ec4Jpbi3zZZEsWy82R5+hE3tLUoNuu4Pt9ZTFECfDK4xHI2xETbQ6dda6YIuUPOWfnw5GuL0cYXutx+gA7oPq8tArwxFTAUYY8Rxmvj9VUlloN8fjZx/g62+/wVdffInXL19zAkIHPa0ddjigyreokrP1SLuN3k4PJ8fHeHx8iMOPTxlNcnp6imbUQr3bLS9KxQnijdmUE0qrqo2hQoxNQAB0ulofrN+hYRCce+XdwD9xe+d0uhe8r3RSrHSu3HqU/cOLM94VH9MusTdFN0G8eAVmXQgTqTJo81dKWVlPsW87r2dyB1mkbFc3HV1jGc8cn39yhXk8ZqQLcfy5yCmbK/HV6Rpt4q6mOZa0H9GcUk7kiYT5KICjYI0TpNwdMBn7KRuGoV9djZEkOeJJjNmMkARzzONbofFkjBDSulkEmxQEkL8+8fdyLghkjCawiezbdCBnDupOSKyEDvLbGda7awzD7UZ1sEsl659EzOrY2Oxwgl+vU0cz4D2c9k76yoeccYE/14ICi6jedMmmBG80DhQMMeKLhFNprWmFhiha55LwGRLzYl/dgJN3+n5J4l4LhWmcICadhGWKMX0/XyCeJ1imlvmMudh1WtozczAXsFEjNFTOyXd8O8d8NnfItkXiOvySzHhesBIYZfWlpYtTBn2+8+PpK1bmv9/L6DzjmUbUgqCGKQk5dR4hbT1Ce32XE+Jp/xxqcY6aGkNnWZGEKJTyTsRP9GBb6/ddEpTME5ibd8BsgmanC6trCAnyTM/IWiwIKn09RkbPB0vo7iZyjbD9+wAAIABJREFU7QTMCHViPA/dlPPfrTn9n8k/dzhXlta9GFZllf/3K7QotCuHAvF/q6Ds/49qOWz51aMjKr/DY2/kYBIWbEVkbAWxYb2Aqg+KUEWbUZJhq1zWYluQJFx5fbeCq6Dk0tYlMgRF1U71XFHib+poWo21LEHrTR/9n39EfDnA9skZemenSGrgZ8PrgzpTYjFcTU20WMjeG6LSPrA4D+9izW2hG6t8x1n5QDJjlALt20bQHpVnuVp89cWAwN9R9eEreehGmkS8r3IcVAaY3AyCu4526qFsG8eFdOWceJZphl6zhU8ODnC4vYWOMlgkc0yH7zAZXvN7bAak95NCTScYvfgDej6FHvQR7O7gulXDKM1xPRzg8u0FFw3MPGHR1C2jUaf6n1US05Zvwmnm5MVY5gIND/x6Y+VS9zvUYLFJDDPIMX3+GzrHR9h6soew3ULcaCLRoaBCNGstQc5zuxIfc0NFHKVWzHoqUqB8H1YsJqmOSKKqtM/3b3AxnOAi1AjXOtg93EfYbKC1ucaxR0oaLYJO44IU7UGsP1HjIrWPa6mwqrRh5X56BmRhaumZUae4Ucf+55/huNHEX999j8GLl1jPUkSMRQr5vdEzS3l/y4UgaBhNFhKNQWXcFOvV64hHQySTMcLNHjpHZ8i2ewjee4DleoRpECJ23hHcUea/pYICFUGNQW5m8QCW9CXvIlWIJovrF+kBjMmJKZmhP7tFu9tBzWaYwWKt08Du0ROs7+zgZnyzgnaxxdiX4+80jwglQIK5RBnI+0N0wr+xbhRa+7swzQC2FiDhvCZ3WEYbrk4rPtt8AZiKM17bTIkwYoHaYHcFI84hGjZVeDu8wZ9v/sGz9x+iywK+Gc/HeivAwckhTj76EJf952y/mBJ0HWXxqdDIyoDhqwskgwk6D7p8r1lQnWmuIOs49Tb3TiFOeI8RMQyTb7jkOXBJu793EruzK24rTHszIt5OnXCB6tdbERc2FtSA0FUEmGsuU7GQCpBlA9hb/vm9thSI1wXvP08d312LI0lC9sJ+DyJvfTkjdODGhi3LjanmViLA7l+U/PuigMttKL8NkVLs7tHpEhz4BN7/bJ45pDO9lssFN0EYCUXXdwrMTiyVCiYyF1gjQfJYokS6xhhZGRM8yeklFBQVsZF0ezMJQ5KWgOTe3ikvdRozrNlXaMC4wjmLAd8T5nVnvVIK/1J2dT1tHFH07IexvYALuDgYTEkINI2aPlRq+9Y/1oc+9bUP7S/pe39DowalVaqGVBGqwAQwwWZt7+7MVPfOndk1OGlYKVKQbO/H7Mzce8+558SuH4H7XCubtzviuKT4u94yq2aY+YoKUK0829+oCZ2MezmimCsgOYsn6FsIfxD6hnB/EzT43IIQ1nz//83zAfCCG3AJgtD9OcEnwZC4FOJwD4IqU5nv7Vdlb0ck6L60EHA1TLuBCGboi1ElEyqkx42rM66lACK6I+d2ghTu2rmFgJkNUvWP5tvmGFWUCstsWxJD13LUOwnW9zs4efovQmXXnCLXnnLpqKnpZIC//3yOx+0NxFEdRZhxL60TreUNe1rg9LiP+/c3bcx76ypmj0AUbpkGuADsPdpBp/cJ/uifoLlANks5v0vNUCFLz3B2+Bz3vv4WQXNRYGy5t3lcyvee1wor82bE74d1VpjWItRba2jt7OPkWRvBxQWUGd6QJxKkythQa6SBwThH0rCCQIEo3o6GQ5wP3qKz1rFJC/V1yhj5RSPQMs6CyJPASWOBE6n+SR+D83N0Pl5BHBsE1I+kbNC2QEjg9Rgnr4/Q6mwiXrX2RTYyiGQTmU+F8s8AKCnpRMGoxfjsqyf47ofv8fOPP+Gv5y9gFN1LyO4D291tbHTv4fGTz7G79wC7+3vY6vXQ2eoCSR1oJVycgLKbsVLjysko+J/6JD+4IeYDDgBvIII33mFPkyvrAvbPO4Jxd0XvbD+yrogLSdJfUYCmgxL3KIq8JSnN/XpsUcbp9ZQTd+rpT0cjpvlfnPb5O5RIcn+kyW0rgLb2V42Fxsx1EBWWBp+CsahmA+QwsCRv3iTISvL6msUBJ9dTXF0OkQ5TpMMx0/3ySY7JOGMmEmHUEbszKGbBsDUpC3yJEFWgxevXbizEQCALLUJkCGkLdY03UPbcb9IMJS2JBEtJE3EcoPVRgsWlBgc39O6yQnKkmelC/fpM46e2GT6HpdXH2tpahi7wjaXoIgKlYWRtCkNtpC96QTbPkIsg+TTnwCEn/QFlkI7GrLJPCT5ZiWbTAMPRBNcTSvgVxlMFJSwhdiKoL7FgIgd2FNTmVmCH/pGI4VVaYELBRaFQwY58oqgqM24+pVM0qjzOpgWrg3BpypeauxniJtIigAoXESy30VzfRKP7EK3tL7G82oOaZhi8/B39pylGgxFWuDEq8+rvxoeluuwvh0Wa+JopKKQ9QeUosjFqiys2Fq4JOjO2gaymMaQhqS3DNBqYRFQw0gjqkaxf6p336w5X6LjbvKuGpC6Huo1Qv2s++9a9UJrUjPEit+77VSR5HqXzg9cKQeyqjL25HxONshmtErcVEApGMYaOeKyiwiAxBTpZjuODA4wPnqFeKFy+TbHeWsXygx4yYk3QuMr5iV3kCsABr1vzacO6UgB9723NOJvcfhZlP6lwst6ju/AhR/W7ji0JrxYuYyVixUZ0K1gfhwLrfIK9nR3sbW2hTQzE9AyTqwHOjt/g/BR+z6bnU2fat8Llq0OcHh4iJrebQFsBUAqMqXSWad7P62IBadkuZSJpmWjlPHY4tPIYvH9K9vPy+Bo078jB5s0prii5vehj9dNHqK+2kZLdIAJMSHAzafJFe9ecOzA57GlL5iUl7CEhmcTkCg1UTOyltzg6vyKrHzRWlrDW20BjOUFjscmADrEhSZiVCq0TEpWm/4v9Ggk6814AO/cLQXXTEBgYW0DufvMEX9TrePHLrxgcvICa5liSapw2hWgCGa8TRM/dUEsia5xoFhlMAiBRGa6PJ6xlZTobwEUHQXcdSbsNQ45glKzpnOMXqshHQU3WdKuBY1uExXrbKfG76qATDxal9ywA+qMhji4vsL3cRBFagIm0EtZ7G9h5uIujly8ZHq/OCD3DinTwkGgdkJ89tUYeveakrAGFzuY9xEtNpJEwq0gt3nO37CZB+z3Hp87G0f++mRtYW0AuZKtFKla/OjvDP2fnWOm0Yah3nfY3GCyvtbCzex9Pk9+Qj/LbP4TSMtRkGqPTAVb2uxyfVw/b5mPZChzzkHVzoXzvPgSMZLYMtQiFtdlzBLYForoWVRNr705Cc1IY4laRvigTe2ORcW4NMqXFuls3XBLOhQLMijgzBOb0TEQQ/iaziG3/ksS6zhnNVsCO3u9+39+Pc0iRnIxAM7c+EnjDGnPOup5BIVtI+L/10rcriFBsyYILmSnOayPrPlkNAPtZEb9nAWTL0uLiqcsnCY8jpiKtCSGBMnZwuZhC4BEVUEQgvcq6q9L/WR+B4yUNrTX+AwAA//+8XVlPG1cU/ubO4iHGZrFZDKhQV0CaiIdKVf9B1af+6760UpdUVKRVSkVJWFMW25ixZ6vOuefMjA1N0j50Iguk2J7xxXPvPd/5lgceANXBQcW9XzP+9ZGofsGpOhOqEWAqhggpZzTTexAtm18LUwym9QQYFbogevT7fS6MXUXWZYEioMJz3cL8auJLaVzJTTSsh1CEic8BoQpO6T+4kw9rMJjqDRBX8FjqagUu63eLsZHoBU9iLtgPgEADQfymNxGpuFep+R9TUthswppcMOAg/gVu5hb0lvJblPN786JJhVZucBcP0Ahn0d7soLO9iaPOS4yP7tnIhUkYRRyNnd7o38/7P6D7+RcIF5ZYL8ubJKPFpL3B/jw+xrO956g3g/emIunwW/2bwWpnGR/v7OLl/i8AbuzYkSEjYZRxH6d/HGD1/AyNxeWChsXTSEF1/LDNB52XOqSMXBEA44FNuhxynG16WNjqorXWxe3VMQz63GVMxL28XJDtTypze/djrDRrCMmYQ67hLopwTq6ySyuc5+yMbIlAiHqVzcHFjRGqc2bdOokKdHZ6wY+1tVXUZ+u28yEO0VxEOQbXF2/Rv7zEfECo6yxM4FacmOUqFcjJp7d85caCn+MmcEMHX379FbrbXfx+8ArjKOZNQKu1iHanjeZiE825OSs5IIoRMQhogqBO0F2PXd35nbN4UuNL2ux/yPj+P4/q/a7jUhIHMjHdr7RVnKzogJm44oIu46uKft5Ukgs9IWJEBb+3SR1xZA0h+70exjd97ryPhHLPJqmC0voccWOsXlu7kxOLFdgcTDvJ9DPwasx4YifZmKQCffTIxOjtDYMABABEwyEzADjD3Qn4+YTy5tp1yW2BSMVkjc6ujVUBALjDB0uhp/+jzxd4lPGcIqCAhgDswE/X3l5soRb6DAqEMx6njtioh4TlK64rC55RE0wb9Wf3ZjSb2wg+xkON5Iyb8l5T1lTOn8VF7vhM52cQMnEwiCKMohh3ZLwXJ7jpDZniP4woXjPmDn8uf3Rah0I/LE1l6V4iSYB4GhAtkc0W45iZazz+xkZ9qcFX0U13Jgv+x7/hsjBDtEnaBK4UCm4pasHYCRFldWRzS2isf4r61i4aOzvI55dRX95CEDSQUC55s4akf4q/vh/AS29Q41fH/D4xgTu0nonxlZaCBbCrEpZEiil6v9R2Yk3NR402EUPSVmYci2b8BYJ54D8JkLhEP7ddSY/jPrW7Pzk3lus5MB0iOH1MAwSlq7907qa0srmZYghMaH8NfDGlstI8KzQ3xdprS0fOki6u2DzYs/yX430gQPXQbp6RjPgsdzn/PHR91PIc83GC/v4LnH/3DeYpHYNSjoYDnP/0I1obH7Grdp7Z7mCcjSSKbzI6bfp4TBb3LrDjXSCI+i04EoP4mEfCv53zH45dxkU2ySHs1CeeQ47IRg1pekeomxx73U2stdusO/edFLfXVzh5c8FyQ21I6Hco5lhie98l0ZiZSakU/SExXEh2xi7/Gr8n5ne6HlQkcZYDUHrQuJLv7oieWj+SfV2OWj6Gl7sIKFnk1SHGVz20nn3GxoRXjSdAGCBig2I6mdy54hifQ4EMu05klXGyzyt4HZPjyslZ1sgRMa3HAc/7GA0RXV7h5OgMmPERthcx11pg80BiJgQzNVvskeu57NO5UMil4UdzQEoQMAEx1uyUrIS9movW3ifYDWdwuDCH4bcvMLwdoBEYhHTp5DWSE3fRKYE9AQG4s8gFjZ24AgItrs6Q3d8C1xfwLlcRrG/Ab7WRLbZwHwYY5Q7HqVp2oc0YiLVFTrRCk8pcUjJw7JSUQTextA5cDAc4G/RwN1pBOwgloTFHo9XERned/7hxMi6/4zKvpWWOiMINYlhMDE/ynbhDdHrEpq3zxH5YX4WZncU9GWZx6odvwQaT8WdPTVY07NhkOrUcxXy6MSJzlpdJOgztZY3Br6fnOHhziqfLS5hhXfqYZRbLnSXsPn+KlbUVHP722ka/FlJGkTGyZBEYxhnOXp+gM95mn6sPPXQeZRM7rZcqr9U5gdd47eZrI1ZSAbSQVhNQXQ+o2UG1VpWKT99Dkmpg6hzV+YjW+TC00mSi1/P5/UAK26TwHVFfNo2kL0z96LahGpaM5MdWVl2yrMux4VpM50SWmZEZvkS8y56fHtr41t+1Rq1KE5Rx85gnnjac6dotG8QyIorx5QJJgRKJwJQtLBX4zIBniSjFLkvUH/sNlEBNdf4uDXof1s0A8DcAAAD//5xdW1PbRhT+tFr5DnEohJjSlJQJISXkqdOX/ob+5XYyk+lM85jpQx86bQGTlIspxpItybp0zjm70gKG0uolgbEsWxKrc77zXbRE1JTVRLumB8i/2mgU6ovRqnJkGcVouhmGksefM3LRlOm8+XD0PjPSR1SUscUPGGr+LQ2EXjc3x7KUfffLeXaS5Nc5t0z34D+cvPqdbfxtA8eAhLlg1FBWXgEGrbEnylL1baMvzZGujscZjyY2AxZUYOlEXl0IigGsdZZl1fCzn0Ah/gF0TnLvtgMv/zFVLpJKCu/Cw3Q+gy48PP1qk0GA3//6FfMZOPedczktvZqx3gKH7IR7hC/7/Wp6z9MrpjYWzNYIJyEODw+w8+oFm7cTbS5fMP6pJZBSQZcsA2jg5et9vPvxLaYXY1NY+BKrg4SlAaPhER5t70M1PDYuXKwAv39jBgBrClFJNYj6mvgKs4aHgOJ/NncQ/vELvJDkGDGnAixC4OkKTTOKCivQ7fjygNRgnfP5+Qjj8Rgrn63UoIxXI5Gl0SKIQaRCEkvGZ6/bQ7/fx2QS4exsxJo6cqMNfINsmlxfyv+9OD5iF32v3TQ6zLJqUu4jRVyn6RYce0NaPjo3229eYXv/NSEiJvg3Ff4i6fYLoe1l8aXch77ce4Sgas9kOqeJiToxmycFy/9x5n/IVt5T8Nbf945J4U36KmodnmemGSUTDWsWT+XC7IAtRTRDdDXB5cUF6/bp/7MoYqoXObSmk6iOJ1QeT1qYdMTOtQ2Z5tuhrVeg6TAArMyGZC95SlGgJcZhhFkYYTyeMMNgcnGFWThjsIF+5gi/Wcw0dfKhQJnwtDAzjYR4QEiTXya0NmYmRtGaJokRTVMrBE2ihWuehFGT3+kEbM5HtDhKvqCJULMZoNvtihZXia8Dl8XGyCoIXGdpGLMec0Zook+THyVApriRKqaZwoIsyrjf84NdI5ymouGPhNI/iUJMpwmicMpTf5qkZmxLULKModFuSYFTlkjinP0JKFKSrk+c5RgnOQMA9DNpAt2E/bxOPrtzU/8KQRa3pq7ua6l4m0Nz8x/6PTx+vofus12s736D9rNt5OvryLpLQKPLSQWUoKDLHWx/9z3aaYHph7cMGvmsDs+4kCxczxLbhHjOfWsADJpSFQQAMNAuIKZuBihjSfJBeYk5ThAQy0j1mMKaeUL7zY3EyPf++5T/5uZ+1pvvdYtlYDWmN34tz0fDpKuc1EUOUenvbWqG80z3bZZ/fUHqQz2gh3VJaA8FAWxhLAB4i1lcHdUCzeq6yRWK42P89u4HPEpjtLyCQTdylf80HCIlj4bBBhKa9GobEbn4JmVqsCkY4Tx37loTPUcSsOg1bmSxugM0WdT8u/WgUtdrJHs8C1BUEk763rR4ZDIEyZV4n+Sc2CRyFi+P8fXWAN/uvcBGawkaV0inE5weD/Hx+MTEGRvszeC7DZi3tOt3nHMzxPBCPDdyGpkc4gbB0MyMHYcNAQjL6vpL42/XA9+rL40MnmnfDE2KFE4yxGenGP38Hu2Xu+htfQGvv8wa/ZgiRX3j/G8YB/aeKbza4YOlLLcA/utboyHmYhzbTHKVnGjHtqtqUrfH+cZxdIr44AQn3T+Z1bcyWMfK2io6y0tYajfYr4oMhEmCmgZzAZQLH0Uy5RowNVNqlvp121jd28Zedwl/r6zh00/vMT49QSvN0FHiiyNmfA6bzoAAKCuSPrPielSDRiEz5tLxBOHHM/gbA+jBAEvra+g97jODMws0YkXJTiWbyOWo69T7Vmc+r1phUhYYJQnOohDrug1diuGjbvt4svkEa09XcTIcXtu3MJyretgi7IbUxtCVJFWjzjPE/OiA1yedp+gNBvDayygbbTauTTVl8CsxjiQJBzXGvkgwK3mhM5FVlZlonbNP90GmNMbzBB8OjvFmMMDyYA2zaYwegfUtHxtbA3z+fANHB0M0CchJsxtnxhxrDozPR1BpfmuARL1blmd1vZDPq74EBnilHi9OpsKQdr3XnH7KbtIjaZEc0qDYALaFksElNe8cLW32ofqSvbVKMbKm/V3XfNunwWEC2Ol9xdTmBADFfgfaSA4Kx2BWouMD0eCbQa34t/lVjycNveOTZYAH2+BzL0dMOcMukNfK+mcj4Om7JE7Km2WQ8sTepF9Jwy/7uYb5JJOnz8dUfVpzHDNF9n6zkgSHLS9SeAGOOWWMbJuMUb3cYzULQGSZco7svUebTfVjsD3w8Q8AAAD//5RdW28TRxT+9mrHDuDEITcgNCJUtKXioepbpf7wquKtD1TqQ1WpVCJASaBVyMW32N579Z1zZr0OhLYvSQRx7NmdnZnzne8iEgDSdhY32RkspDKAMF4gC674b27ATeMYR2+oTQDjWPSYfFOXkeiM+hwl3jd9nRhNmJtiYE6OYpxQ5TK55sVMtdT2Pi6j27PC2yE1pOC6CefSBfiZBXXydQySJcq8WouQqF0mxbRMJ6VzxnXafTiUq4HqcHyaWdmglDT1hIISZcZo0IdJc+RVhqDZjIvcSjdJPTM+zKndJRLps/MVSUeaaGlgHXwatO19dYAXPz9HPlO6qC8dCW6AStTKxPV1iqNXf+De/gECvy1dILehoQZuCrx8+Sf2Dx6gE0oKLOLIQ2rokzvY5fXhoqoXEF7bzx9/iZ39z/Di/LX8rai9gpJRPrwX8wsMjw8xPf0b8faWGqdYkRC4jJolcMEey4+ci/zK6ffscGD69klVYq23jvb2Q0T9fcwmfyHOVeLAJ8wxABj3w7Fwxo9yYDQv0FvRyDLPEDkWaKcnZ7h5s6dshtB8C1A0OuSVUZkgnX3+Xd7Pfr+Pw8NDDAeXQt1mLJdsjmLQAPGhzadTnL5+g83NLax1V1EGZd2toNOvbgr+8jVxh+z64KbjYS6tFPZcZMSxPYQvbtNKeyzyemvX8dfoEPV7qXQKK+ussShc1twX/7v4/7CbdM3v1V+8T3ZiS//qYdSNQ0mIjhIsa05WIORznKtvg+qxNMKOufbUu7F7wgL/cjCSrv5gOJTv4+FIzPuW9NHMUY1bSg00JknB5zluycJFIyWaQDqqqYKRqnHl+peZ6QuLedL6RctPev/kEhenF6KdTGaJ0P0554zbLgaLvIcs+jVudYFA02yR8T7UebIAbHPumvmZApGeRPCxsOe9Zg5st70i8ath5JnGXw2xyIpiTI/ug7ru6HMSq7yEG6Nf2MZpG1G1MPySjn6pDBjppIlJTaRzXW5mgOFoLiBrQrDtMsHZ+aVS+meJJKfw37V7T0ZEhU6rLdRgx2hKacJKCn+pztzjSYJJkmE2VylTLq7eDhAOr9DBmbP88fkja6yBRgGu73RLbKUxlQT1p8EUx036ZwHMESDxbuDWwRP07z9C/9E3aG3vobtzD+lKF5Mwwpy5ymUmkqU0DHGjdxutvRDb36Z4dzHA7OgXdERbO5Erl2NRGFRXugheo4AQ4yd2qYwNAClQ2ugQ3Csol6gQ+R1JkuD9zvI2Wt0QCdcMi9j1y/KDArQG2K3bfnUhXmYJLait3r+wheoDXPPlnvMe8KyDWC7tA55JH9xbqT69svLAtN3XoIjuvn1KEVDiPzBB3CHaW/4Nzvs0zdEKY/Q8H2uck4ev8eLpD2iPBmiV/D/tLIdFhtWgQPb+PW7dvS+HfUYMixt2Mf/Yu157DZcHsHQxG2NxkkzU14usudB8QDLT0rLAdNt5ZYaoTuKpkcVqmkUqf2VaGM+cs2GNieY9Fz1woGW4HmJL3aMrXa9FUuoRiB6jvxLh+yeP8cXuJtg7j5BiNpng/bsTHB2fCXDaVJgtKPraXlAj1UUOOpxsRT9ZXe57deRsVcfaloGeH2o5JBoMc/tZXNW95cejtBSjtpwlUhSTUyTPfwXOT7H+4AG6d3cwYIJTO8K4MEmWAVmlzZ+aw9eYbDW4t2T8EEhUlxt9SL052Vx+ZABfKSCSNHJyu4mjlNRGnL89wzlfttrBar+H/p1N3FjvIe/kwhSKJabbF78VG5lc68wvMGRhEeTY2d/BZvQd1vf38PLHpxj89jvy6SW6ttYSNggb8CjXt5jmkCYQcEwpIfMzHpc67uQEyeUA2bsjVBsbiLd30drYwOrubcw6LfEI4DUTa1Pu8ak50lvXn4W1NGM8BZRoKlsFGeZIcDQYYrznicdAj0bOWYWqG6O/sy4d9JPjowZzyKuN/JogUe5YzNCzGq8J+89xnmL89hjIU4RkRNy5h/bGFsZVgSkDBH1leZIPSO8p0lcKM7QFrsgBnI+HTQD6NQmTyGthHgQ4upjizWiCr3fvYCVKMEtn8GMfa1t97D3cx7OfniGZqL9VYIzcojEGsgDoh5GMJii6q8iNjaDsBufBpmbDzfWONUlSJBYnp/T6Ao7ZUSwVzzAwYKXTUak1z2DFsp+KJzWPvh/XgmkytVz7BT2+xVjLsgFyNtYzVxe6qEJXQPP14v3D9cUM+zKRdC8EPKV9PmewzKhhnlscA8F1+ZvyAX539StrR5UmcNxaozl2Nl/nTPFdrHvTJ8DJ0nmN2VzNC2WLCvhimf30UtCnesG8aJoOyvQQY6XG9TRAoAZrXFM7VO87kdpLU0/rTIIRLrZfWNNmFuhiBIMgwj8AAAD//7xd227bRhA9uyRFXS35Iju+AIGdOGiLFgWK5qFP/fi+BQWKvLRIEKdF6ktsx44sUxQp8VLM7A61ouWiBYouYMiWbIFarndnzsw5p3IByItFuyYsr6A+xM4PoiDo+0vcCtikuD4EXcltZVwsAI0WQFm9xkkvCRp4RfWBlzR73NaGaiFiafGIi4H8rCwqLe9Pr/EEoLCoy8KhAJbTTIAAqTpKhUGGJP9um75WyxwVZYXDTOBuuEHSKsL+/rM5K2hD7DAsiKCsWwG9FkUTtLwWb3Zi55YVBtojjistUgrwgzJAf3cT+0cH+PT6lHm0ptpsDjppfqZ3+P39W7z84UfoVsuoTGvD0ymczYlakCkZaRNXn/4+tYrzboHFtXAhdJcSkTDAYHsd+4dP8f51E1maIPBtizw5AsxjROcnKEeXUMMN5F7IB7OnVvOi/s2g5KBkoROFrNFGc/cQnd3nyC7esrpwzjLCeRW38Uadc3MiYmS4vsuwswaEJlTkRJFas2+vb7G/d4BW5wFLZnkoU5WlqivoKDMdAAAgAElEQVStM1o7xLsbfR4jimL01nvcwq19AyRRq3VKh+HdCKPzU/R39whpYfEzU1XFSvHFVfNvRl49sqRRKQrAUlnKzDVKoFur0jnxYv2barjtp/+0Tfb/GPSZZnaDY395ChQoqPZt3yhV8ckbPopwP7pDQlVmUtGf0GPErfYMHMyMBkqDFZn1AlGllkRCdH3PHFzaqD6TgAsL+BUmUePg1vLcphOTtE9iY883iSJMJwlX+SnBnYwibgOn2xJNxwwOzKymAFMy5vZ+leaeBSSaVxpfV+LZhyEdOAECv43AL9ENPDR9c3AxHcHXDAAEVigmJMtBtjE1kSy9h/YKCwDQnmMCVC2H65IjRcHBegU+UDDDPH7fAAIs0uqxNR+dA7xHlWbvowSfWvhZtT9JMZkkmM8yxEnGzyc2gQ+bbSMEqYz2QEpgwixjjRYSzomJfkEV/9woRqc0X4URE4VarvLVq816xXMCOEnC79nvXADAnYHMVu4Uh1ukd9DAHXVkqAaKTgeDvac4ePY11l98i3DvGbC1j3mzg2nYRKIVEiik1C1GYBol3WRLWCoE3Q1sHH+Dg/EV/ohukN7E6IDaa2ccwEkIXZYL8cHqrlT0BbNG2BWsMOdaTn7nBMSz8MQc08tLE+gVc7S2t5CrNsqOj8yHs0c8PjjI+bs92nVyKBf7SPU/pJYVjZVtf165j1gQo7KAZZ+5goEiiGWwiPDJvapfm154NKtHWuf/q8HWkn4DPRVgbZwifvcWo19ewbs4R4e87T2T/BOYRV/NvMDVb29w/PwrRN0WCgLJ8/gRxv/jYwnkeuS3qq7HWguMeEXLoEqwiT10VYWiuIQsg1n0WZm9wmgkPdSnKWuWgS4YUN0nrSzr3wTlxA0OkOPLwyO8/OIFhn4DTUyRT8e4+vMU796cgLbDQj6gM0Fuo7wrpvfAthGu9oSzzrWxOibeeB4Ag50+BltDRPEUH07OuGLW1Zo94eezvKILuF0Dcll0bzvUBJ5MkJ5/wOjmCnp0hMHhEdJeHz5pA1BMa4s6ulLoF294jdVeS+4Eu6q7zoFdlqKDWf3M15U7CRS9fjtBNKb46yNT/cKdLfS3N7G2OYDX8NHpdo0IMRUx6M3CHIp0WWZz3M4yDA+GGPTW8N3GOk62fsL5q59x/3mEJoz+i3bWUunU6909VMSAG8UMbRK1m2bI0hjZ/Rjjs0s0njxB8WkbansTveEAYaeNshka+1RY5wCqBFvef8EFJGVcJGyiRPz5uARukgT33QxzP+fzZW3QRm/Yw9pW78F2J/oXtSl8MLSls3TnQHR9zZ18lKeoeIL+cBshKdF3WpgGHhIffJ3igsTdM3q1vpc7uFJfaiQ5cBGl+PXsFN8fH6BLOVmWstNId72HIQE56z3c3N/z/kLLyd0/hPqYRTHSiITFNxEEpc1zYOmSsNVsxTpAsleI0J7YwRoOvulYpjOcKUskWuvQuOa21V7a+hcFGhMz5I59n3SXMiBmq/uiJVEB83rBr69Ty11700pPoOahLwUh+dtCRO61I/KeS85nit11K0OmuFv3AAIBxOYvy6gbU85le0YRUEC/GyyKD5IDU87JoolWT848muKLUOlTFhAki+PaNVSOdYvnRKtA5oPziTA0n411ZUoGxGZpau1XCeQTusNiXsWhL88L/MXclfW2UUXhbxZPbI/jNWnTJgrplgISixDv/HEEPABC4oEikApB3WiqJk6cerdnR9+5987ilhYhITFSZNnxMuMZz5zzbcflTmfToprwuPBHODp90CrGw2yOiVFMtVtBUDYlZAQNjHQk95Cg8PazeZKmnwddUiAhjutoz19W+TyzE82OknEbpW+p3IxLkZqZcVvqNVFJTqIOFGjbQqIADSbz65EYlFOQVTTy/9zfkpYAio3FWCOIwPDiWnNVKrsESLi1HAQxS6LRL5PAydc0/SbmyyVaLR9hoJ8v/l4HWzVHUt3JDi6DEN3rA1w/PMDwwalCmVOFjltafJS4qkB88uh3jC7Oce3WDRWskZlri/L28gRL/yz9793BHcmko9IlMmf0CtGQ8y/qNGoDgxsePvrsYzz4+kuMX0ylIXboP4otWHGE2Z8nmDz/A96tu4i9LSVvLLH9/2ohu0APJS0mmYfE9VDb2Yd/cIzwyU/ILsdAqsd7lCW0oh5xhWkbIcXVYoVWrynNEL8LMnyzyyu8uhjBb15/rRlXiF9xn9tKJN6tpWj5bXS7fQyHQwyHlxjsdOC5TeWXZuOEDI2ah+lkjLMnT9E9uotea1voTksNVv7bsS2oFDpvKhzSvFxJTSOXz7DXd0sMh1ZJbmxfVeD8f1+YMq97W7FX8PfKBp8z+BeTsQT3redTTMYTSe7n6DcYdoLMHJFgptJLwJ0njbxJ+vbgos5xavzFOCalWXFKZLWlUV0lwgIy4JRN60LbB5hlwlsW02x2o2UIKwK27BpmV2MJ7uMInDBYCSgoShoZL7oWRQkT97ltja2GsG8cTcpbURw4UABgzZEMJV57RRZWUwFv9MWKN40hqgSXcoWN8fLbAgRICKcUAsqj97qn2BbZvgCEukBhwyOWBLJEKcdQ2ZIrslgxvTsSWf8yWGM2XWARrmXMHtUTMb2j3E59cNM6UK9ZUrAyaDGgagMuxvMpgiSS9wrFnqYK9lQ3xZlm5XO0zEh7Lcu4ISvHspNVi9H8+Rusr43qfbM0JA3YQZBuIch8zOxtuIN9dN+7h+bBEdq3b2P7vVtw2juI/TbWlgqIUqC6LedPyozVzH9LJqywqFjVgXnXR+f+J9gfX+DsmyElYIrR10NdU90T21bR9JpbM0WFihdbKwYoKebQDqKcjgSh2bDiEMtsLccCrwue7F8f8JXv9G2n38wo7CoAoAHbDaKKUi4Ft1OzE+VOrTRqMy/M9L8JtprCkMARZbNOKaWZCoiGtlCZ/B+7JIPPi/fcnqVea67V/+XC9STA1gpiZCdPcfXDjwjOH6NtpWhkLhps8KiyypQnvZFY8C5GcF+eoXd8R8lHhSF3dGZm+k7LytuWskWgrHTJv8tUKQIMgIdSzSae1ESlHco4zzjIw5oVW5hUWMx/utATzRC3WKtz+DsgQbDXa+OLzz/FUb+PBiLUwdGcczx//Ay/PHiI5VKF5pbtTdZGI14ON8/sd4c/8r8hBS01YHDYwe6dQ+wc30d37yaWqxV2Hp7g16++x+QVg+/U+ye6aTTnEaM2Ks48jpAGjWQBO5xj/vMU4csXaB1/KOy21d/BwlEWQ2jtgsQOalAeqVG4FNk+qNwvHuO6mE1MSpk3lpYvSHhdPvVGMc2ZzseScAICrC9GGJ5e4LLZhN9tS0q+63vw2z7qdU+uK+xQanUPTpBgNgesbR/9D97HvU4f7Rs38ejb77B89hTeOhIlhPWGSsE8VtCDqc6MiQWoZ01KBZvLZiVcInh5CmfQgbO3h+a1PuzdAaJmE1anJ/YAEjyhnWGZJTKLX+bAO+rPpmQbKVZRjHPa63oROL+A+RpWowW/28Lu7kCumzrQvlJjGRtOGewxWEFkKTWso6e+NMMA0WiImFMhZlfIXk3g9frY6vckINBu1QUISGl1tVQdlmn1YFnObZbEVkSoK+dvW8DtcbzCyfkZno0ucLR7TcIauV+3+x0cHO7L39Xpb5p1Vwq2VNtHbT0yfD6di6pxO9hFSJLVznJiwbKzvO42/Vqmg+pyltkxNl/Vb0lw3YYqOi31QeW+LP+9SUPqqf7KkL86IT//zOx12f/me5j3VWGFSaXPFNenZecqgfxoM8DAhiqN22HWl9+fsYOXQQTT0Kux9kaJqyT5ZUOgsR7k2yLkcpJnybG3Y8/HIGQ1Wr8g2LkPqOJkn6l6YzUtwKx3eZ0r198SuPGmjAEV6J/I55EgNs8pMgEKwCVNE/wFAAD//4xd2W8TRxj/zczuxja2k9gOaQ5AIUehaiWQ+tKXvlT9n/vSl16vgFClVhQBBQokpjiJr/UeU33fN7OHDYV9cRI5tnc8x3f8jhIBkIpdWVFd8AJ8BYeltP/zN8xQ+lAXcDAvdlf/8mzh7U9BrK++FIGAq8CQ/Yf3jhReslAHSIivennoPzxH3gn9VVX+fXLPvAs4eEQoyb1yQlVZhVvnKQte74D5pg4qQtBN5mQQHSIQawd/v8uTzr+3cfARP8G8QIN0/EtKhVg4JDXIB1XUQhXwRKXEgG0NjWbPbt7ktf+84nW93mtjcLCLTq+N/GwulAQOhsupysi9LMfTx0+wc/Oum8iSCoYe9cFe2DmeP/sbxyc3WTQsTW1hafO+iwWYGHLC9B8cnxxiZ/8IF2dvofWIocbELaYgCdMzDB89xM4338GLsxMaMItXq/efLOJsxTbGONXV2FhW5W1dP8Ri/winwyc8lsTSzfMlMSr6bIwEyPHy3wRb7ZwVzsn6zawpTOIEp69eYf/Gjjxf5QUnUdWAfHBdUc0K7UGYYTAYYDQaYTgcYjzeZkVSrrZp+s4yNKIQM6NZUf6cgsGtz8A8A54bcvx8TKHbX179XboB7thSS4UCH2y876T+JF3pj7y/f6fK3u1LEe9DMqx0a6pQyOrzCwsl96ujf6jKvdlEkmfmGE4mGL5+xfD+8cWIraDIEso6PRC2r6laXTHKZcGJPxf/6HAKZQ/QXNg0vO6oc0/Po9oAJfW09qijTR7881nKcPSZEwkklX16JAQRPfKBk2vkVCAYx8wDJ872xfkFAq1wpdVigSGSbaA1F3XarEPRakSISHFfZ2y5R69DgTk9atarUFwQ0EosiWiPoPlnnFUfJclpZhmJ461+cj6Q1lw3Tw73xWIuCarWTmm+3Dms49hI0CvzcjJLmYs/nk64SzeeZLicZVzwYFg+CRyShz9Z8OUZe56LMKuGTUVMlvbQjOFwFnEy5gLKdJFIl598gYm2xfZCwjMtilaCm6yn+BaFkE6VXe6T/GBpfvtgu+z4+/6UdWKh2ilxB8hUhDmJmK11odsUkPYxOPgK7b0jbFz/HHprC5Y4rJ0OJioQLcmKACt3R0kgkugnWorRabLgDgppcV+Sa8T2LtpffI3t0Ru8u/8jgjhFiGmR4LBomTW1peu59qWSuduPiFOaiIq+FzFb0wvYy1jODEsBe4LA9mBsB1kzYCg0C1jZzFGq6gV38hE2rtDLa8jAWaU5DRlbL2iXZ3B9ja+IBTo7LIJIeg9m+lk5nZ7qVfgWizR16bX+gYtjjCWrpw9dq0Y09d4lg3UVyoKqpyxlFi0VILoYI335FqP79zB/8QxruESXNFnyBKGzY/UrKspS9DHH6PcH6F3fxkangfOsCt9dpWN4PTQ/pkqpJQRXfSxqzRDv25/ZWtffGlME01U+rKdXeFFkTjAUCstiEj+WGPHTDieBWMss9Z1i2n9bocK3d+7g7uERuhTbZFOEZorX/zzH44d/YvhiUfy/FLNz3gcyiHhbdYTExz13Z4QLxBWKcSSKITOxtUWsgfW9JraP93Djzi10D64h2t5Bo7fJz9398gBbe1u498NPOH9yyqJ3gUe0ZJX15+ZG5nreAa9ymg8WbZtg9OY13p2P0Tg8xsat27iy2UdCY2hC1iuKWe3D7TuFh3x5T1UB4OXvV1AR+cpBbioqp3TeMOTX+NcKOO5gGHeiGSmazyhBnOLy7B2a/Q0Wl9vorUP3OmiQmGiDUIk5K//HDYPT8QxXD3ZxMvge104O8dfPv+DRr78hvZgwssWVKLwePqRcWwoF+maRcXuVFD8opkrYYtfMNbL5FOPTM5h+D6a/gfDqALo3QNjtotFuYhEFLNobk903+ZlDqGcBw+wVI4VG8ykm5AaDnLGfs3QBFYVorXekiJ+4pLXm7JGXaKraDqCkAFQISMr8DaioOppBUfGeNK/WN6E3+4h6m7C9DZhuE3mnwd95ZiIpfikRX2XR9P/bl6xGo9nB2+kcD56+wO1uF3tRALuwiIzFlUEH/f0tBGt/II3LGF+5hg4VAExuSbYA2WWMNWoyGOve2yt4W9eN1qIB45qPXutD9gN5XW5ItpqIYxHgK5BdLs+o8to9ilpVcsDMIaEpbqG8jinklcKjT/4L1Fe+uqcRtL5MeksLPvmD7Eceup9UOPlSuIgEvs85kyTx4r7mkAHufn0uR91z1v3i5F8Q7pSkTyZTgdUzXb5C56BE2zV7ec05tDldXrDP56xFDszjIHssUbBk/NICEV5HQNQpAPz3SrHE28cL0qQcC7GoLy/vBED3I2iGFADwHwAAAP//hF1ZbxtVFP7ubPZ4t7M1TdMsbKJFICQkXpB45MfyDDzxBOIHFEpKVLpQtTRbEye2Z59BZ7njSQgiUlUlddyZ63vPnOVbPBIPIj9p7nRQFwqW75DJzShcgLoVYtFThyHmDPNFGlc5SaKCXV9yJRuPePwecd4WM0mIXVMrGZLImKMFNiXddKD9ViCKlvzhyXVIZyZjgQ5H4WgsEKjcVbtgjvouGoXhU6IMFdn1Q58XuVK7EXYKqNQCzPEEKqkdO8+Xn3kt2TiVTslJ9IN0EUjQkBwO7ESkVFsu4mhZkQou2DkZR73gvLFYjTVjYbBAbRj5w/A9hGEHUbTgokQg4y5PFlmVkj0gfSTJgl8fBi0s0gSre+vobIxxfPIKIQJZwzoRdtkvnpL4Pw4O8PlXMdywz5NQEnC0/B2GAJaGp5M0/Z5srDBcvRZ6NZKM08+KYslNJchJVkiyur+7je3tD/Hn46fI4kuGKHVbbZQUqHISgDnE1du/0RtOcDHPUAa+dFbtdEv/L3u2b/Iz0Ugs5eA6rDFBhzAjqHIbiAsP7sYGvM19lC83kZxfwC8j4bLq7/PBJ6UUA8wZxgdMoxSDdkt4XzwBKXF+doLTE1kLChrENONCg211rM2jJwU7BxbhKXW6bYzGA5ycHLGY4HDUVwg2deSoQJKmTj5PcfT8Gba29+D3+lxAtcIeTwU8PWP5DZu9RljUNSob7Wy7WMW1QqgJI6zsr/4XjPYWeOn/WWTV76P7xDZKilsS/2tvrJ3QWugzCPiM1YqlVcH8WuHG65STNmEUI5kvkMfEpX/Ln1NEkLdoxjZHyAu1xClrmCg/cFxTw+XsqvrdQCZbROEwPjphT7hvFKALUqNf4IqoMfOYOfzxPGYBKIL0JzzxTtg3mIpaYz24aXOkOdysRHQVgcWE4zlP9UmTwDUFRn2f91qnVTHlJiQFft9Bt9uC61do+w43V0EuE8TZd9xr1i82YaH4QcgBophwU6vMOd5Sa5wV/U1Wc/YoUaI4RFBq129xc7XU5hH58JMHte+1VYCvYvtKCk3ESqDGxwUVO6WD43fniJIUi0XGgn5FIUUDayXkZaNh43LDIctK1gVhLj/puaQJx+Fc4d085dfPxKPutaaRLAbXSAaadGcYKUt9pkq4Mjm1BamxxT9UjcCxhn2S7FRGJ8k05ggktjk5MqdkBeUUZC82RNZag7+2B3/zPsJ79zHc2kJva4en/RhMkNIDlzQfHKGBMANH9y+bnZVmaZdVGBVGMyL+RRffJc6rj979jzBIKeFoYfroexSzl8JbhlibcSpdOTXC3rVNj1uKRTZxqIoaIFHGGQY00atSLLIF8iKCyXdQsP73EHMDZNTEp6a4mzPns1TUEPG7ac9YZwv2zK9kiiNJYombkYEaT+J+czuN8GbDkZpTno3NhUI8G00AU+Y62RLLJBEOXTbxajs++x5Ggcj8HHcakpC3hCHWcqgUj7hEucgbOSriqeuuLh7ksx16bXaY6VAz8NlznP76K+avXqDrpOhSyylPhSPO9o6uzokpL0rQLSpcHv+FzuUphp11xE7FCuzLazLil9+A8y5jqLkOA28U+f++N9Tn3upDwBaclsapawDdK45CrVEuUZxMkeHnvrwuL5dJPttYsd7MsglU3UAJeKqJwoK5Tol8NsX7u5v4+uFD7PQHGBopnE00xesnT/D4l0fIp1LjFhCLv5Jb+NIosdo4XkM7htU8FNZME5KE9TTocyLthYLvubPexnBvHasP7+HOJ3sY799FGnpoD0OkVYTK89FZGePLnW+w9fEufvr2Oxz8fIBeAXRcRfGUS4g9yys3cuGyNrSo2NmglUaID39H+uY1i4Gu7H+AZDTGRSuAGwRsGZgzQFLE6qDvyjduZOUZ9ZRX15069GxaF5OyfvZbzRCjshzSNLF7RaisHjeDXOPV+nrFNEZ0dYQXRxfoTUbY3LuH0WSCyVoI33UxHAVwqGgLA1zGMdzuCP3Jp3iwu4W1zx7g8IcfcfrbE7hpgjZctKkYyhNu/Dqch+qgSMs6p9HKpOhRGI9PiDR8c/TpWXH8FvnpMWZPD+EMevBHYwQbq3AnY7TvbqLd6zK3nahUqSv2mz4pw+cxzqbneHNxivd6PayOhjxi99sD9NY20FlZxfnrY97TtrXSFIU0+rxoNjHELamqMyqjh0u0lcl9i/joc3jn7+Ae9+COhvynWh0i6w9R9CbI+TnuIaN4GQb8rCM3DN6lunEKct0hhwnfYe3mM2Pw6NUZvtieMcq3T24IaYbxnQEmmyO0Ow6j7rr2uu3EhakZQJAAi6MpylnCNUNKQwLfYeQiDRho0MEFe2P63uTQ11B+gv9HMQehZjz3VA/AiuZZlzhbgxXFUtSc3WxsjUN5DDV+Xa17uPYr4CpnvWpMqh0VFKS/rS4BFePNa6RnAsWWNF7o6+W6yT2B7odqKb6PW+6N7luKYUIoJCKopzARO4ylMx5T0z6gfS2+/hZ9Y8OwtTG0X1aTyq4rNQfsF2tCqVAf5ZmEfqS1pOGB4wWIU1H6tztSqBL22+vUCPoHhvIz0lOaDdwUiGNxxuNaWZFA2tyh11FdTOuYpin+AQAA//+0Xclv3FQY//k9r7M3S5cs3ZRAgQtQIXHgyIW/lzsSgkqoQoJK7aWVqpaGlnQmyaz2jMcL+r632DOZsEk4ymGS2Hn2s/2+5bestLCr7r+21yDxPN/TAn4uV4m4CABxJURhnQIAzd1TIgSqg8WKzSSkIIyQVLU/VVPWuSMGFkFJseGc2P9RquqJUjV0LV+D4ff0ucjsuAxK4KoxoqZPgDWuv6lYEceelSupyi/UAqsEBEsr8JdbX0eXz9N3PSuCWOiHxthYEJTW1fsxFSJX+0tyKChU5Zo6f0m80FWuJXN9aX9f+szhcbZa2D+6g9+fveGwjqxqaqARzT0rcDE4w6B/iht3WlwY4XHo85J6zuPRBCevf8MuJb2yEsm5tOnEPTfBRgH0OsAnnz7Er49/Rv/NKyCnMQYIZALkMRbDAc5PXmL/9gdMZSiKOiep2tY/X7XRgizVDcu2NrSQLl0PXnsL4f4xmgfHmExfAos18p6p9Go+Kv36YpaiGzjwOi7b4rAQZZZjcDZg8RyaS3pA2SpvZTy6cKYhnKzAHnhot5sYDj2mVJBNorKwpGqq5kGRarf0GS3x7tUrHGxvIexcqxTlzdEvdaj+6bZ2wrXt/wTGmuS/cDbxr6u/MZvUWiLQwYFjO/2lSnpmc/Y8pwQ/mYxx8b7P9+hocI7pZASfCozpnAuCnpCW923DohKrFfdSiQdJV/GJo0AJgHJnMc/ZQjGOZ0yHoWcumS4wOh9jOBxjuSDuovlWavSSi6QZzy0lSiHbyTjKgWBZIh0nPM9umaFJQWYjQkCWShR8uoIDpkYUcOLv8Xs/UyJ9LnNRGPpIxSJDyXItD1dqVWwVQJW6yu+FAUQmmCKUsm2Mq/id2nucAx8S/aSkOy3gRS1+51DXPc8d7uhTUk8cfur0z2YJ4lmK4WTM3H0q9hE8n5J3KgZQkZQimkIrGpNgKYkfkkJxXiwRjyjpJCh8xu8zWkxVwq+75GaedGiYazhrPXiAvqdUUqvhlKh7oova8yysfoK6TFI/n8paj64JwzIZyuOhEBFD/OfIOKBEtwMnuobu7j3s7h2jd/Q55I0D+Dd3sIwiFK0OyA17UjgotBWiiuM0PLKsbKsodZGlEUTU955J3EsVoC98F167i/DuR+jQMZILTF64WE7fw0OixVxT/dwIeKTAXTOvWu2GFlwcqG9E/5RclElZJHQxoLVVwi88Rl857TaSUGLp0bgl0wIMp5ve6VQU1jOh0f41zmZZriiZ/R3P9d9sVZdDz7+BitbRiTqoQS12KWvFAD6Bv1JZd4pLBQl1kIr1XWoGMH0xnz+ngrEDdzpFfnKCyZMnwNvXaGYJi/5RAcYv+dHV7yHTLzaA8Qz5IsbZ0yfotb/CKIoQ6/uRc28S6YKwTiabNA7/y/vbxC9XFXNtwi8NImaVj2vpFLYNXiDbeKS1sZZaRJkE8+Yx9noNfP3FQ3x8cBvbDrUrRkx7Gb79A89++gVnb4ZgYxNhBPfU9d9wGWrd2pqnPwX1UtXlGUXTETi8d4C7n32Izv0baN7fRbEbQe60EPou4jiBCH2UMsc0S+B0Itz+8gG+2Wri2q3v8PjbHzAfA51Azb0oN69rdo2mQiuhSUmJnBpW8wzxOMbF6Skaxw+wdXgIGUa8XiWuYJvYgh1UbEWmunaOEvKtClA17an1mKlOHnA2/43dF5U9GMWPbJQzW2K6GOBF/xzB7jZu7e9jj3zvt9uIyH613YAMPdZ0KbwAjcM9HF2/jruH9/D8+0d49uMjjN+dIiWPcv1udqxoY2FHXkdRCN2JhqM660JTLYJCNxKocH46RTkaIjvvI200EPRP4V+/iebODqJuE0nDRb4MULbImptQNx7mccKIsjRS9qgyCOG3WvCbkXajWdUqqEP/15+OFYSj/ZkuTlPcnyYIqbCyyCBmMyz6ffhbPaTnXbi9HkR7jKDdhttsIg98ZIsFMrKupGan6ygxSu3IxFBxQvyywKSP6RR4fjLAraiBo3aLhapFI0CXLDOjEJmIVxYAM1Y+lwzIk4KtSRkpwSjAjIVADf+e7gFXXIbym5lSuVKlUG9yp6p77Ck5478AACAASURBVFrkpBRiIyQda/mhEUM3dHPr1uY41o6aUdBaFJ7XAVnpB2yioVd8d5UzGrs8PtaysOJ3orYPNOJaIb2VG5YRordjdSXmSQIfRI0JOGknZGd9navT3y+Ny/D+zfnpF6YppFCOYcQBjRuCQaerLj6hxwm9s0o5ryPdbWFXozzpfjCIcy5ocJ5BtHT6HymjkUnfhT4LIfEnbVfS27YRRt+QFCVqoSzbkrwkTdrEWdFje+ix5/7hHlsUCIIi7a1IGwN1HDuxE8WKbC2UuBXvmxmKVpzWCFACQWIroqjhMvO97y3e5YPWByaUPJUVtAqdqxjpn0sDZC8IzQxwir9XTRmsmQL3zwG0lJByrJrtnKxeOPydL7oNak3nhcGCPtklzconLj6iTEQ7tPPi4pJ+Qia1ZEmDs1qQ4uSpvLgR7ATKQeUFRa1vLajJWLFrb8dNkBhrZGQiGvi5ltpRcU1UhgAADrL4Mnok7t6OifoisOF4BrHx5TVrtsEbmrTjbJqj39vA+u0ewu02pq9H7F/pKVGoPSYSBwrvxwMc7P+J3Vu3ddoA2QUEYsRfQDvAc1yOj4/xMHqAeiX4qFuM0qIMKGVsG6f8vQe30dvt480rF7FEDCr4biJAyOxiiIvjl1DTEfz2Ombp0jnzszZlXIIzS4En5O/AbW0i2LmLcPsu0lfPoKKhxA6hNAE5uVNMUFxev5/mWG8CLZP5K4VMFOH05BRbN3bRbq4tXTrZNclLvWSzuOfNS8MVPmAZAcji6/R0gMHgDP1eFxW/XkRCwrgnk7p+8voIG/f2ENQbIqnQmuHPH5b/c1sFI8p33VVAhVcG1K6gOUrnnOwJrtWjhaagT6eYnV9gPotERnE+PMNoOESymIuLv5vZbmcu8g92Tokeq6pbuIpb4qFQ+aHPD+u7wPdN/KU2UyHaHkexJDYwZ5aF/3gywYfhSAwxx+MI82kiRn18I/08BCzINIU5sR4d7I4qHfVHqrUr1EQH7RqdbAkcVrEW1uF6OYKqZokElHyIZt+TXH6uAyu+9oEXjZibG62+Enq/dH1Mhaepwaa3mJslsPzOFWdcgo5kudA9WJ5b8vxS8Jl4kuYa2MuUUAWZv6/N+VJ8GM8xnSU4H88ki5/fm4AtmQ5WNycMJoOG8xgIiYnDbZ6JFEA6+/RISLhvTfzMBRLJyktY03GxJnxO0StCabH1EfioTAfcIAOpo421qKF0iy65a8pvSCdK4kzF88PDLK8gVh5ish+cJuaqiaCzg7B3E+2NLsLdmwh3dhBubyFnPGItRNpoIBFWmitpBIzh0owPMkpsGbRc4pqQOLOwLDn6l+iXsH4GroNF1cG03UDzq/tYW/wA1+9ivP8UanQIlZyZ/pjer7gDsGuoq4LL3eErN2005qVAwNQSFq7pG9Ep5pTH9HfgdDqYQTtrkwmQGwG/Jh/FpfLCmrbmyyV8WioDbUyfXUwC/16AX7F96lsUa4RysZ/nn/z///k515AHaMDGM064jsSatZWH5niC5PAQ0xcvMD04QD2NUHO17a5nUiWwSicuZBs5KosY53/9jd29r9Ho66QIduhEZiDziqUkfyx2sNTVYrdlbHPFNEu/YcmWcCS/e4UxYF3ni3jgJUKud6e/TRkYuO6WGUoyDSrTbIqal+Dbh3v47tEDdFkEC0MiwWR0hue//YFff36Gk6Os6LYm0P8WQNUx15U1djbPDcewD+yYz817Gx0f4c4mth/fwdb9WxKX7K83EYcuFkGOuKqEUZBUKZPKJPo4UwlmyRi562Pt0Ra+qXyPoBXi9x+fYHJ0hiCVkB6dDnCN+VnmKK4l0jkWJ0eYjN7Bf/slNvYeodXdxnklwEUGRCaWU3rCwmDKStef9QVa+iDAJCBgRQKSGTxOz4GmyC2uDwtoZcuDK7P8ZM2qn53zkwEO3r7Hu8M17H6xjX5/Hf1eD/VKBZ0wlOhRpgVMlIPGvXt4vLmFxp27eP7TLzh48hQtdt3pTB7P9FrW0OdzQz9My75ehXzDFJtKFU8X+ZkxZpMISbRA7g0RvxtAtV/CbbfgdTuo9kNkmy14vTWoRhUhPXKiWOZl9um5D9YajVYb1UYLNkFRxsjcX9c5l+UtM/exsC3YaeXDOEuk+dYhmDygN8AZ0qAq84ZLj6d6Eyqoo76+iaQWQNUDZAQECD75VVSqmU5v5uMmEWs+pBcxjo4/YL/WRuNGFTcaIRwnxGZ3Fy7X5isAAAwzxTFNNdYN/JNlFSmQ6cklAINo17Ve3UJnq7rzqzZbB5WL8XJBztfEx8XztPu8iQW0r1kJuZWPsyaij5HQ4Y323u5fClQTh5eJQX2lSEtb3SygYY9f4vmMhFukB+lSsi1d/RIQKmvAhDJLfuaiAD3ts5Q1nv6u+hhtnWk1/8XYmSSAgr1mYgDJbpD7y/VEgsPagU0Ty5QYj88RsClEyQ3ZeHGKwHTnxYxQogIvj3H5PGlzP8NhM151wlKmNwQNq8n+kGtAS9zt+ZEkA9fFPwAAAP//rF1Jb9tGGH3cRO2LZcWu7aRx0jRFc2kvRRsU6alA/3GuvvRSoGiBBG1hJAWS2IUdW15iSRRFcli8b2ZISnHSVYfACmxoOBwN53vfWwQAKC9alRPJLjyRHs8tCvaksnhWWQB2UqqmC/ZhpYzJDG8AB6L10EGRGVudcN54G5un+ZtWK6JjKHgDubCIjEAWmioQqtRkMFL/QFSH7zVlPhbKWs38LN0/M5G5V45dMjAbOiawfMhWH7b6JseJ1iwmRmfBa7K0/0To4fr6F4atIPGHqUGYzO/qPEa38CaAkQBo6otvZBdafhCYxc+/oxZFjL3EnCSTA/A8X6C12UN3ew3T8aVQ7lPJYdW9SNcUCPyLZ/tP8PDRN3Dc2orDpAZvuEhn0xmOj4/xYeuW1k1VpChLGeq5jhKUbFs+oAPg1p0Rdna38cvTHjxEyNUEdX7x3BxBGuNw/yd8+uhb1Lo9zMlUWDmI/eMmkmM07jIuV4rn2K/B6w4lDUDd2MXk4oCCqGLc+jBWdow4VyQKXS4UBpRlePoLSnSU5mUsQunA+tbhqXhpEEDgFjI24BoWQBsvX73A2fgMw7Uhoig2milHInOsm+jp6xNcnLxGg1rEsCadOKEAOv+2+18Z2Ype8/928b9ufPaBX6Ww5qZwW5IEsLtBA7hojpPTsbAhJueXyGYzzK8miOa6+KTURm+qmYBZPPyJ5ILrNVWSzR/lsRRkcuKogoFuiXEKFyb3hY42p6Y/Xsjnza50x5/dIBaw3COYTU9gYHLFoDdf691AelWiabHm8zWo56Auhnw07oN8h0LfQ6sRSiHOhxdve6/blrVCDI/xfWTy+IEhSRqjUj/k4c6X/U4itHTwgFyS2Zb11Nl/BPyy9OdSdyuFclDXx2NHM2QIAEQJBKRgvNQiyXFF9/J5KokV0yiRfP54ocQVm/soixDR1UnkUg0ZC8fAQ8w4RA8i6yKNn4Z9BBOn86xggeh6USvZrSGPu9LFcvPy8I4qVdSsk1U20JLm0cyBMtiHUISVLvRJLaUz9FRJWSZKXRb+/qCPsDdAd7SBev8G1m7eQ727hfZoC7XBOvJmB1k9QFqDuPhnnFui8Y4jDAjXCQrjIUc75JpxOMWAHDP/toNb6rh1JwaWpk4tMOmrrod56MNvD7B2/3M06h002g1cPv8Byfh3qOlrHfHJSCJD7ZV8YwOE/J0cf1doojkaSYw4uxRgXBGwZlFDxtmwB5cxY5w3IwfUJqul3lizJhxj5GjNxqrUSrspGCOj3Fnaz9+1ly2Bne/ZnvS5Il82SjIu9LZ5UTWG+697J8wzlAwbzlErSdGaTYDDQ1z9+hTRqxfoZIyvSxHwOW3AFq9yTZaLZwNvWDi0CD5GcyxeHKLb38QVgSufBYUv5rS5WpgaUL1l22KbIvZ6q/5LhVt2FSCwGv/iIO5eKxuoejLJGdBzC9Zk4ackLMnSLJpr4698AeXc5itkUYTPHtzHd19+gd3hGlpQqHN3UDGODo6x9/h7PHuykDWtDFqSmmFaNlk5p9YfI1taLgklh2se+jc3sPPgLgZ3dtC5vYHW1kj0AFk7RIS56fgrebbwTCitZko76K8SuFIITJwU659s46v2EP3RJn58vIeXPz8Xc0AJfs1W1+31Z4OMUXmpK3Ivj4Dy/m84O79A7e59DG5/hGazg6kKEQUUiND9IzeYmdKmnnkp0VhaDNd8no218yrvV79PJV647CVhO6RZrM+vbExND4+wPz7FeGuE080xPtgYIe72EDpAn/G4zTqiNEZvcwPbXz/E8OYOdu99jKd7e3hzcIjA4zk/EeDMM+ezNLcCryproeJpkGvOjB2bbwHhTAMUWUYwIMLs6Aj5QYCcXZthD+HWOho3BpicnmN6O8asOYDqrCMMm2i0mmh1O+IDYJ9LjhmP+84z3ftf8lzi/maSHMSHjNwwpaU+EEPimQAOi/MTzHIHWa0BtAgEdOB3ehoEYOFXD4FGB24Yotlpi3Fm0PAQNB2czy7xB6n/b6bAYICW66Nb6wvyrbLrh2il/mw8so5YUPqoFsjoIxB4xiDVdNNNQsVSEVuJ+bbFpDYO1PeiGpEu3miGlWibxdYY3nazq2vMJiLY/y+MXa02P1NFjB3PH47pbis3KzTy1ZfN3beMb6k1K1p63RzW16IbtEHhBSfLjT5JlJ6auGgdCa/9DKRpbWvLQvr0dqf/OjC5bH7ruZC5MuuE45WGFc9UpmHM9wLSGGm7jg/UPnKrxoAFm4teQgQ6GO1qZAV2LJLqxwYva18zjiLpzkgfPM/DnwAAAP//rJ3dbxNHFMXPrHf9gddJsJ3YxlAJIqASUiv61Ieq/0D/2r5VqiohFRWpSH2oVBA8QEgCCYHg2Iljez+rc+/Mem2gfWhXiohCsrZ3Z2fmnnvu72ozIGOKoJQXUdoB5noSXjANiNMi+K/4y0W/6LFvbfSpbNItGCJLCzun+0ptbYQsLr4KA+4iuHWLmW3fvkYgtRc64CT7ZO3CK8A/R3W0CpSAIqh++Fq3yL9xNSvOhl/8rVcp6lUqokYlxcLn4BMO1le+6VL3wrrweVKoTe6Ii5r+oLi20gQnt5yAPJHr6rgJDkqxvEFZAUYqv2Zmqd6wag8Xq4B1N6nBxvUOursDHPz1slDBCSNKkmQlp3ZytI/5dITq1jWx7Qo4PNcaUzcHTyYXEvT2hz2xLKe2XsxYO7qr9XbrkajHqZGM31YH+Obb+3j08AEu3r1Bwwuk13zVxGiYBNn4BOODpwi3umK1/cje+C92Rze5ZQVwxII87KpCazOJ/CRym+4N1LZ3Mdl7Am+2gGGuf42ybz+aQHI/zGNsRx7CKzqR1IMA44sLAfoJUKROZVEvRPFQG9dOQVcVWrcZYFHR29zcQv30FMcn79EbXEO/1ZPASrK8bM9GKBAX3EWMd68P0R32UWOJALkciaqe//fxXwUBr7S51slvacdVtkKuljAG6oGnVniOUX5OPiME50kLvhnenxzjbHSG0dkIKbtvECfPydluEqRmSW5QYi2Q5CT6UqOV2yw8g1LWqOWWbp0yS8+ODLWqziGZskNi2tbjGKcXI7mfJOQyux2dX4oLY0qo3SzSspwkt89jjqYVGVMh2NPam2svZtoiyYyoqNjTbARi6/fFuVNFLeA4akhNH+dFEe14PWy9G8cHIX4CxTFq8c89zbCrrdrmeowyRYxvwU5WDFTeSGqhrJZ4S45J0XaNtnsjdvXcBPLZL9l7fxFjNJrIuY/ejpCZBi6mbF84lesq9yCzROAoEU5IhUFvXsH0PJbe97PFTFwDUTITen9iRTS3bXBChFcK2B30rTzavGIj755Fi4oqLKzr4Y9VuWV+VqkgkfnTR0rhl6UGfh2XWQ2x10JSb+MyaKLa6WFzMMDV9lV0rt9A2O6gs9MjxAbhzjZSgh5NTQSD2NN8eyRZdoOIjo7IyMY1TXQDyzfIjg4y7yW5iDwRmSq+p5mNmnZOoNAkLSl1t6gL+cqzpIUPbBPKcxJuNa7XULvxBarNCjZ2tjF++gjzw2eI3x8g9FL4GYsVEsxydR9IgPcPZT5piaAu94Rrer6Ax+4Vixg+x/x4LK/pDfqII4NKWJVNKEUdebyLKE/voRtfqoR8YgOdW0dHlq8CnT4z1Ti4nYybdJmx1m/W7n/pVOI6/HiIrPzup7b3ub1mrq/95w4RLJMEdVMRZ1g4m6Oyt4ezp0+QHL9CK4vQoDuHQnaufbmXMhAs8GztPUtDyQRbcQXTZ8/QGt7G9qAp70X6p7NUJ/PVsZZ7q/X1BftgGcQXJTKlaGDlIxXgqGwFzuXOY8xyLyRQQCcUuFaZdt/E9xelkdQOy/97ykpaL6d0exzOvYTdksQeXZ7jVr+L7+9/jS+HfXRofZVgaYHR4SF+/ekBfvvlTxBtZD0yywI220HDicqOCZPZNcK3QW+9W0X71gDhzT56926hvTuUwD+loCpdeigQxBLwkH9EdxXvK+HIrL2WQJCOGJuyJmtqQs7D9S3c++E7tIZdPPrxZ7x48Ie6EISZkuo9X6Eyrl5jvobySIz0yA84Dx+/wfT8HaL952jevItWp4+N3gCTeoBqle1DEySpSAHwak15zDSZxhrp1PI5kuWgKv1Lx5vagd3+di1JV/p+XUzl5/KNBV7L/BLAYz36q7cYvT3FUXcTw0EfVzda6HW6CP0InUYDY66HrToad3dxe9DD8P5XePnwMV79/hiLk33E0zNJ+HnCoVFJbGFiRFlJICs/m0VlkbHtV5eOEGdzoPCZz2IsDkaIX48web6P2WYDi+02gt0DDGcRdqIE4c07qF1piQig2VtP1pWqfV331JiPvkzB0PjUkdvaVcnq2neouE9ltxAgSb4Dd3BBmqLOYC2ZYX46Q+Z9UKcVE0wyKVSw8FiOVkWDzIOajyysIq/lOG55mDUD7LG71JUGeu0dHL14g2yewnxm7jN2ahaIuBD4tUTQ88wyiLbdVFae3TW13QXsAnG39f08n4OlwwWaQVBwzLQzQapBfNXGH+XA1QrmtKFLDXqtLj930DoHTmf2mkEtxyTLrTn+wzC0bfn0nA6258DrRSxYWYJK6ep0ooFnhQfn9OY5NdGq59G41zoRKLCLg9vOdy5hXALwMW4ru7HKpRLla7gEra66C3ho+YGWMOjvubIYt3pp8t3FpeXz8XBMBGEqGc5Hdr4Wh4euOE4scO4L19owjmP8DQAA//+sXe9v21QUPc/PTuwkbdN2KekoXTtYQdOEhASI/Q38wXziA0h8QANpbBNCwJhY2dqsaZs0seP410P3vvdsxytjQliKmtRxYsfv1z333HPc+glpJoCjvXaVVue3aA89J4ShiUbQDyhqrgDUOMqafVqsmi7m+4GmH7BSWtXIclM/DxMwF6aG33U1IKHFFEy2ttZYc/sdRoHRouLS6A0opqFmHJBdJ0Zkqdie21rxhrQNXdRsZaqJd7XegxqDZiN4JcOBbMXyhvUCnYttoMwSoIAkzfgY36hA/tPWbDD2uUbhXfg9H/NxBL8nsbG3jXbXgYwLHgBi2ykN8kQD03Q2wl/P/8BhbwDHaVdSceXEpRkfp6MRjpIj7qjCZulM0L8CPArd0JTZSYD1Bx8eYnfvAI9PRghI04Gys2yFlEGEY4x//xkbd79Ai73U35ypUajTX5wyC8rAjZa6MaJVmuKdm/o/GXQgtwZwbxwgGBwhPp5wHayoZRUrayoNAFxlCtM4Qz8B5wyFYb6cnZ3xY3hzV9NtiBtb6IlfMycrEIAmpoKEpaRAtxeg1+1iNgs56OqTmE1LcvCi+5lEqyWYUTJ9dYqr8SsMdrZYfMsxaGy9r/yXTanXB/X/a+NFIwWhBnzjRRH5jbumTRNtXBVIFnOk0QJX55cYvzjBch5x9p2y7VwfmOtJVGZay0MKWSodCzNp20UWf4+rqf4cjBixUBoHSNiOBzhSY1+mWEZLJIsUYTjH9HKCaDbH5eSK/5I/v0pzTSU1aHhibPtSU5YjHe1/S4GdT5l8B+j6AQf9lN33g5ax6JPo+G22tSOEHeR8QeAc0/kLLZBDYASNp3RvqUzFc/jamCYH47FtAQCgtC1l4NURZa11YRaf7PNPAAJRHYnlwBQBV1uXFppKRotYavEkFBpShj+KmNEwnc54/JiFJGAYcoehe9gSlOXzNNOCb4jAYqGt/UjoMFECMQkC5lrdP6uROVcyS7UEValyXY4uZgxt1F1alWinJu5VHaOnwpxFcdraXg85A52ZG3B2JVUOcj9Ad2cfna1drA/fRzDYh7f9Hmf2eztb8Dc2EPT7nNXnecoRiJyMX+d0vBIMbHD7IeodiSAmmhlGoB6xzzhznpKTg9ICKTSWu27JTGOx3JZk3RZJIIJbsJgWdTtpLTlFXuW/DPBN9zl1gLnvIvYCtIM9dDe76A36iJ/t4+KXh5gd/4p2IiFVDCEz7XBCQds13nEra0NhBK9qWWlJlNUiRjo9R0qsNhJOWy6wNhwioyxES2e+k0IzvGAYAKzCXmNfMKtGrAajKOvyxWoI3hh37TGqtr8S9TPtveb4Y187b0FXtZ9dKX2brzBuPpai+ibyBIlpeUmOPhTas0vEz54hfPIE8uoCQRqxyC1T0JUqg337cG3WunY/XKMlAGZyLBFNLiFGp+wE0u0HWFI/URqwIxYA08EbZZLltQm7xqg+X9X1GRqbrg8tXiupab6XnVLMGo6yULmqMn2OzfpfUwNbPy9KvNDfLCf3nRjrvsT9e/fw8eEhtqkcU8VoCYH5+Ss8+u4Bvv3qG5ydrLIdcqMx5BiWoTQCbeTF7XHJodYx8dY8vHv7Jqv6rx0O0TnYgbezjmK9haITYJEujIjqqhaMa4NepecRKrUqShZrwesYMpObFjOs9fvY+/QOvhxs4tFwF4+//h6Xx2N4BRBAaz78W3PUZQsatPDIjSWKMV8uMBqdwb95C539A6wPdxFsbyFsgbO2Ed0vLk1wtZSJyrQmRdEsO6ruBSfX6mubWv9EI168TmQZsO5autQBhSnvXSSYvBhhMr7AjcEWpu/MsLOxiUVnDT23jZ7nIVQ5ums+Orf38cnmDdy5dxfHDx/g6Q8/4vz5MTp8KgnapNPErilZ2W9UOcZbrRfU/msFYs11FYbkpwC/0FUzSVIgi0LMRiFmT4/x8qcn+POzx3j5+X18dHAHs9MLTi7oAM7OQdf3fseuMxxhRWneaitsYsQ6BhgnFl4/kygvBXpcepehyWbP+eGimJwjIxBa5oiQ4YLargB+M4B6QGNznKPFbN3r7521++S6dWJZm0QhCQVnxiKOTkprL1Xji81mNwFlRzor77OW7uRxL03AX16HDf5dt8w+N8cIZhRJXf9OCQ3qo1xabXTYJK+Lydrb5TUaW8JnmgGgvfWTkpHOpeS1Ovh6Nl4ZkbyqVF2Zcmi9NWMr2myJAAFhVpTa/gZWb4DbTs36z+631rN1IMWCpwyiGIq+PZ5/L2uxb0od7D62FzT6DOX51/aXJe8GPOl0u4jCsAKGDZBHpaN1ZzuKObQO3wJpmuFvAAAA///EXV1vG0UUPbO7Xq9jp67TJI6cxCWF0ojygJAq8cQrv4F/yDvqGxK88EAR0NJGtAgSPqo0JPVH48+1d2fRvXdmdm3iQp9YKS9J7F3tzM7OOffcc5gAkMg6cae3pggSyRe4PH5nXGAZ4RVmesX2AL4pnnLVbDuQRSbE9pNIf0fgvs9W8T1vEYDbz7mB+5eFV8C8l/flLwH61GZfFgxv7ATXxqXOZlUWr8F+D7MzTHzkJEA+wTzDxGgn5bB/X+VZsHwwEbG0CLFkhCUe5AQ6RlCmQa1ivdVAc38H551TXlDoTCHfL3GVt0Kro8c/4ODwHruAU8rC4viJ8qHb6XCWPcnYbYXdmubZdbMQOSvgX0lmd3O/ibcP7+KXo2fAfOIc2Uvk2Dm9xNnxM+xe9hDUd5CYvs7/sqHTvCk3pyOGjlyFjdmPl8rmmjar1EuVrXkIGg0E7fcwen6CwfMnCLK+2YBpVjW49VOJD8AgAbqDBDtVhVLEFrx8bdNpwoqI+kYDlUrIWfPSl6gc+yu7X1nYCPAQQKtWq2hsbKLb+xUXFx20Wi2RKaUmd51iAyk3fB5j2O9xLOD1gza8dZ/DirXSV1b3/u+D1TKwcS9my6uNmoX6QCgWbzDA6PIVhv0O+i8vuNqeTGMG/+S7EZVClOnZItIsEMdVSl9wzs5aFcydCjsXqroQGC+VnTwLTIhpxJMJf8/wcoBe9xXL2jvnHa7gU2VbJ7aXnwyHxFnfvompWstxgcQQZ8IMcxxfCdyfX61UWNZfq5a5qls2VXw/VNxbR2Z+5O9B7QA+QiYJABv9A4l59EwnN83dklSJyazHM7IwIQCcJ7msHcomIphnoMjSs69ByC79Os74ZTWOUwbrZOI3JsXDKMZgOmdVlfTla1adiNEiqSlSBqbcpa+FHYup9YKMlNIUQ/IJMBJ/GmfGvRK8ZayezAtQ+U7qXpyx1HqQ+JmT8GrY3GX36KEYcrc821UB/GtVwij1Wd6fEvD3I2RbbfgbLWzdPMB66yai5i7nMlc3t1hm6VVryMh3haR4XoAp2537mFCFhEA3SSXZlIgSCRSnGNA7ajKbcGSUHmXIZsrNX7rZKfWYUnsXgX5yvw489shhmZ1OEAeKlVNsOlVZhw4j9nChJBDpajYeAJzAIM77PhMqQGwUIEQgzcM1RKqNsFbFjc1dqKf76B//iLT3J/ykx5tp3thdmXmf5VJgO3cs0eJenZQVPIUevkQwH0GP+/DjAYJ4l1MOUlJ/Ud+ojyWwkY97ZpVYpnfXAQqVb0Tys+cb5FWH+xsBmdcRw5kBB2+YTe8ZAl7Ml9KFNWT5oA17IwGiXg/zk6fo//QI0XSISM+kApmIgzu3YBbanZa/nvlQowAAIABJREFUMQf/uSmgwhxhOsH4t59xbbOBWi3A2BdCKOH6/xVFC04H8F57X97ksF4Udow8mxm/4tBGOaHMpn/VO5sTG7jSRAAgxuGtW/j4gw9xp7mPko4R0fM37eDhgwe4/9l9HD14wWsYmygnSW74aVQYfsGdnc4YZ8BaJcSNvU3cvHcXjTt7uHF7D6oeIYk8zCIfcRLDi4dQgQyK9vKWVY+VamadNWsR7UNS7r8XYERGwATUAp8iSvvwwxLq72zjo08/Qb3dxDeff4mzJycIJubaLAnwD0WM2yEsJP1XaJ6QKbA3x/TsGJPTE8SUs3/7XZSaTaTbTYTlNYzI1M4z70JP6FOpEgoRoAstt+4VaQ0AMhs5V6wiLK69SudIdLHlUJkuIFHxgWOoU4B8Yv7qYnTeRbe+ge2NHVy/VsdWvYb1ssS9JmqG+UYJlfW3sLddw9b7d3H66DGOv/0e07NTeFTBhUbVExrY7cvZsyXfp8L0tKOw4tj1JeUIO+X699l/JxMyJh4Cs/Elvv79C3x3/yu0W23Uoipe/HEqRCLHsrHcqNjdmt8T1zKzeqFShU+6Ihry97T1+9CGyLDXHRjqO1iYEcZM284TU/RkBcjckAmB79RXvhY1xFUrF0vgtQwXEYtUwCUFAEnoUyXgWp5xbaT6WInl7Fyy6mObQmRBaVCIALS4yFbwYWJdUcBb9H+WSJwniTMg54KvDhyAZ5qU9kFEVtjCBz+zUiwmIzvrZG9xmgXixQSZzCjQtCm8lkyVncF2kVgu3Ej6LLXkWdk8mxZbM8KlG75c0Xf+XsVisVFQ0I8UgkXtbsk6d62Fz1nvA/l9fq6rMKP0+gtup7GRuEUxWbS40ybfCZ4mbw7TGjKb42/Wrq23jSIKf7O7XnvXl8RxyLVNQluQQCoFJF74DfxXnhASL1SIh6IiWoRQoUBbtWoaXEic1F7vxbuDzjkzu2OnKi+1lFhNGnt3PXvmXL5LoFY2UGW9DCsDzfcsdL9gTp9dLKXpJFk4vH223teWz8Eq+IYDzwgeU3CvbjZ08SjBpufCLCBlbPA8pylA3R/b0ZAPflE7B7hdDqVahkeS1jcUF10r7gW2uPe8y5oGygjjNLwY9+fyoAtN70eiCjA8E3telnrgPuj3LGwYhksoA/e1X9fBl2ZCWVvq8DF5GmmWIgojTPM5+pt9vHN1Cy8fHEPNhZIhIk0mSYdmGNqjh39genaG/lZUi6NVhqOtrbBSpfD08VMcHV3j7jktfqphVvoFBlKlm6DtAYOBws1bH+GHb28jGb+oPeqpCRBWOdLJGLPxGBvbN4y4UJPUuBBzLPHEGv6NTM95QTAc1ls6Gim4aH8vow5aoz0Eo31Egx2EE+qpTuVVnchvIcu0RCeZIAGCvGDV1TjuIU/mODk+xsHBAaJ2y1grGpNyzx5hg/oQFIASFEAco99bYxu588kFIyro2HmNGLVpWgtkk3k+HiM9P+fNimwNqZPxJpHEN6oRv4VH81rekhd/3e8ojf9jnrEwEMHkT45fMLx+en7BXL2crD9bwruniWI37CArU55aUkFOdAFlLFdaflDz92ltEzQz7sZLJ8Kd31ysFEkYaM6w9gxnp2eYnJ7i7J9T7jxn5MufUlFPsabF6rdU5LaNTSjFo2KRsoOAbwRBqyJlkUC/7fPmErZ9RJ2YPfm7JNrXDsWTnzVKZHUGoQ/Vok0jYB9/2vFbnACXfG5h3Kk3G1La9wW+wsuFpxq+mZRSLGAYtBMvCFHhiq4qgR7ysRO0rwKfI3HTZ+Z8ybkgyVJcTGfM7c/h88Ser10YsT//ohQ9g04nRpLN5FryRlcimc7Fo7/USAkZQ5oaNOfUAs0VfruHxqDPoDWcfqyrpqxNUmTh/7YIcu/Z0vlL7dxLNJknGCXB8gsVIvdCVO0uesMtjPYOsTvaQ3jwPvzNK2hv7kD31lD1etDdCEnoI6epS1virFeJhoQ29nQZiZKSyCFbGFKDSLPn/XyaikZEmrAoZTXN+blIUv6iBK7KUtat0HkGP5+jTfDiIuXmbpolPGkhEdDe+hDB+gjd4RD+YAAVh+waYZW9tXEOYRSVliQjr0QLYkF0KRaOWEfVjtDubmBzbQPxzhb+fnAH6cnvULNTdsgIlNjGSbKp6lZKWaf+ulZSr+q9qxJoNf2tJs+oBLpIME1fQb26QLh3iGCDlLYHSMiaisQWaf/neLcwe5SqoYrNnmWDqrf0z9fFrP+LVbagfpsxzaL2COHBExaObWa4oWVqR3x+FvzLK6hnJ5g/eoL8+V/oJ1OEyLjwt9SVAsutkRr2r5v7wMNq7ljVVIDFv2Ookxfo9EL0+j1JInl9eLUdprJ+/cbeje69RQ2xKR1axpsb6TLdXhnYMMe/aQJwwmponYyyNDa7rgWVcgqD5eKy5OKU8n6a/hOi5N0rm+z5f317F334WPNC5Bdj/Hz3Dr758ivc/e5XGFdjjo+1+KBqrqfnFIAzAMO9AW58/CH2b76H4a0jBNsDzEMNHfnc1KOmrFd43ITPq8zyGaRJWa9PR/eA8x/jfMVaS4bCYh03AlZCQVJqhNsRPv3ic+xd38e9r7/Hb7d/xMXzV2wLR8iE4NK+rBv+TY0EEMV7+n9Eo6JzjA26YfzyBP7uPvwrh2jtXmVLPnIfIYuYXFXsf196Uj4WvqGWOh+p1k4DR5n3t3Qy3SAqtWNjtuo0VL9enYv6EvMpByVL6kSKmbNigvPJHJvDEeZbG9gdrWOuNPqhNMejlod4fxsbOzvYvnaEDz77BM9+uocnv9zH88d/ItSKkRg2v+dsu2w+a+04Cdksq9H4EHFVaUoZRxi6d8mFKQBmmVx3QhU+e/iYEVzWbrRkpzeZjtrLZV87sDm4J7VB5enGjePSfSxFvKOSwsXrZTKONvG28cjXlQMXMmgBwdQ1x8J8cQNBF6CRQbzSXs523Hp5J9WOQCoJCkc+D/loQMHMFl9ERlkdvqZwNrQrru3ssNHQCiuOlw3UXRshP0ZM5jmiOGalfMt1p99TjluuNAjt9JoRRtRE4LrJq23xaE+21ueEUmAko7FzhtesEd969NfaBQ06lOnn5ucWxc2D10L4/baIdutHe072WG1zmNHslI8a6iUj3EkTibUNpJFAxyxDQEEGcNPTnItoOzWfh+gtsPGwc69Ko87Sr6TGa4KHaAU48H2LFnBEDOk7WySSA1Wvx/W2i0AQS0CDeCQ6rKlX6f3iOMJ/AAAA//90XclvG1Uc/t7MeEm8JM7WuAt0uVRtRUFCoHLmxoX/kiMS957g1FKKxCJoAdF0TdI0dlx79nno+/3em3HSYilyqjoz45m3/JZviaxTnNYgzsrvRZ4KTI7JKiH8Hv4g9gqt9nsTVJ6YN8w/fJ5YVAhDVboPHaS5Q79O5xNpXWDo+aGMYAgPYtXWUw/iInciWoSUVQLLrB+idAlKKVZEzoeSfNzKfQ9CejvqraVUBKslleUufikwVuXH8N0LBvpqS534nPGnbDjgfgZHKphDeLLVAWI9DNIG9Ts3JX8s9dH19AO3SAtKotEQkCqR4+rUgbIFhr2eQPy73RCdVgdpEmM4WsXuxTF+b/2MIobcLy+ZIShia6S7MDmZ4uDZE6xv7MhgLhyuSiBmnPCs+qYWL/deYT5N0V9b0eFh/MLg+Jc+BiHERThpgfC+KVNw6/YN7Fzcxt4bCqP1kbPaSjh1maGYvsHRo8fYvvwRWoOhdphqXL674FA5ocaeDrCM82WWxIgCVuFpUaNCIKvatQp6q4hGW1i7cA3YuoSTyTNxpm02Pud5bZru5IkFXszm6I26Il4YlYGI/qQnczz/dw8bH98SDjd54rkELJHbMCs3nqzysMVDy2BtfYDt7W08ffoUr18fiz3g+mgNea7wqMojUbIck8NjpEdTDEZbCDqEyOXStfxfRwDbdDD8Bm6WqviaD7jA8MwxasuYoOE8cWGGzPNci3u0EAlautFY9SRXD7dSueJFgsnRCxztv0IWx5ifvJWOIJMjEYQhT54JLRFAhI3TBi7TUez7DkxECddvM4F2iq0Mf7vdnkDdqfDPucEFmdd5PJlIkjudTvFs7yne0qN/thAodJ7EaEWNhVbXqj0dPM+e3M48r/ddjgTSL6JOSxLxfm+AtUFXuP39fk8KXoNhW/z7iVKAE+qM5BwOYtZRQc7IWTbJuf09N2EN4ecz7rjEg3BTVscZXCtHr5LkKhJXAFV+zWUD5MYQCg+dL9rvMWHlGkUtCdr1Hc8SQTgIXYoJ7HzhYGe6pkTtNlYDDeKrJBMOuCHMnbagdDhISykg8Jg8p6r1+x610G0lSa292r1sk3Eesz7IdEFSWJ3h9dt3A/plMcNKpQsQZ1aCEcPxZkP5iU0LyeoA6I+wQh7/uTHaG7sYjT/Eymhb/fjptdztoVzpoaL6Lw9CnjCD41aEBeGWaSnzq5Jxq3oSLJYsZgmqxCJfZMhmcxRxjmQ6g8lK0axAFiNM3yLIF6JRwbFNGgWtlayI71ik84kmxdznhP5QIqS6c5lgFs/QTt4inh6g2t7B+tYGOlzvTFN05X4VVJ7XZAR1xECj21GYekJ9gm4kStGD0QDrO0OsXtjG60eX8OaPByj2/5FES4JXSdLpekBuqfr3h1aTTZZJS+PhwIr4UIHCQt5V2CwThFbyMoWd7iPaOI/2pRvoDjZQDrvIWkZgy6KNE4Tu4YaNd7OcG7XDiYqzFrXg6tnXci5ai9rV61iTcAZLOKjgTAHfnLGFsnWXpOGye1SofJJJlBQdQ3lOZd5CaLp6n9IUm2Eb3ThFNImR7+0h+/tP4OAVVgg9D1TzwSf2FqfH+zLn/+yP8egLh8OoxMITCOczlHt7GOxuIo2AhHQUBvcUmYBqqnC80haYYqTcryos2SSeSjLwXoG/5dfZBnUQnr6fcjS3Bsl8DXWPZNwnAsf8FlLI9A4MywVLK+lPVWbIsxkujzfx1Z3P8cX1Gzi3soqoSJAtJvjr4UPc/eY7fP/tD0hP9AiVQ5P4fhQfa+jmSORyaNL0Nm/uYnz7Gq7c+QTd8+sIxqtYtDJBA5ZWBfQYOsqdZqc5dKu9DdzDieQ8Ve3WoVauPK1oXkATIq+tIXENKVuBOrKwGMB199xnF/Hl1a+xc/0qfr37I548+AX5opI9p720vzY1l2bc+NEZuIax/85EBGyxY3fwHOnRS8x/+wn98QeiD9AZX0Sy0ke+voGYCUqgSV1sCimS1p0ZPwD5vUun0SFjiCijBn5T2DoAQKP55gSj/bWbpcXauqy1iup5S7HYsMqwf3iA6ckxDg+HGO9uivbN0PQxiCIMac1M6tx4Db2dPm5ev4Qrzz/F43v38ejefUyfPIfh/k/KRQmsUmC20FjdeJ0p2xQFvACkikVqIbVS4IzqBGT6YVpBltCmjpVYnXQ4FdhOXXxt3Bz0z8UXAFj4ovh7px3BxoUUJayzpljCPLpZZ92MVtpc6bQpKjc36SSm8aEvwlTNc1rq8Nbzcel32YvNUsfN6COI/PMTxG0zoriqGEGglqDe4Nb5EWynxDxfaAGlpZpIoTldCLS1sGioDduWKiQwkRVl/KoR7VPEeFEn0bzBWnypB5Hy2bleGU2QvXW77/Z79ICo+wchVjp9RYBbp1VSOXSE5BWMPaK6+eeLD/x34QTj63yKdOyWCq37RvWymLpHC7yDWnc2gkyMxcXLsDmi3HpZE0VAr1AtJOdCwmvj/sxzif4bGz8iAq3FEqKEeU+9XgLjRPm8o7lmmTbKhdJEPbkamdbR+SprtVtnmTu56xcNAzYwEs0f+Ld0keKrLDOhF8v3dQUF/h/zdt7SdodaDSrOKI3ywOA/AAAA//+kXWtvVFUUXff9mOnM7VBti0BBgiI+golojD/Bn+snPpLwwWjQBIOBqLwsULGllM70Ps89Zu+zz713bGtIvF+maZrmzLnnsfdea6/ViQAaWwwlCBv1OhravxaFQkdUGoeP7Ykgn2nqg7dief/20vek567zY6QTz4qbtkZrwCYyJMZlvpShmijbCyHjYHE/QlqKnP+egnV6CUQpIQSL0VTPN0ISbHfQdAUDS/XH4ALVktATO8BaU7SDnos4ijtKC/eE0OJqBy0QenkjdRtZ/DaFGW5Ey0hQ0DOiE5bi4YutFjqUvzW+sB2tcpmeQ5uTWBCskMkq9dSp1vDm1pGH1QvryN57B3vzv03fiehuW2qTKUhr3P/1Lq5+ct34eHcJo8tWUByMKYV8XmF7ewdXp5cGh9CQyGaCGrMpldEdOALchMQAI1z9+Ar+vPe9EQXRhskReRp+mWPx7CncNwfwR2OUVOmSgJR8rg0y83aPK17cbdeH6nYihYRataMRgrUNrJy9jHL3MRYH1JJQd+On2WkHSBMVjveLBm/yCiMv4gMucAyN52B3j+fbCN+5LNjDvbMDwpp9j5Q0GfV2QgPTTktgc/NdIxLZBbq2xK1R50fY3/kLs42zHKh4cXpq8n9SQr9UxT/l7+zT+/T3Pvw8KBYzM3R1SvIbXTNyooqKUeZXz3dQzI8Y4S8XB1DNHKos+P1TsY2LflquZkVCcSXLsy85jAyeKIoRxIbGRPuVKUwy+qpsmK5ONoovtnew/+oV9vZes08/JXCE9JNVJYn4+a4pJnDYxr3KIoQkDhtK6Ojk8ADHeoorpLGHyTTB6izDZDLGLJtwgk9aDUZAVInWgxk3aw1YalvrsJAjJKTX2lSjtSRZjoQoVh/BDMQVBknQtTgR24MCGm5VaFtOyPOS9Aga6MbF4rAwAn6qZR9mUtun70/UfCVWR60IMDqkg0C/1+Z/kkAoa46QtkHTcLWeHABqZQp25OVPU6REvkhc6pe0N/q1bYIMS9Ftl3qcWwu0nfxog7IxwqiI6tlw241LF7YXoST41U8QxBmSlQzT2QZm2Qze5nmocYZktgZvNEUVpPCzNVTRCG4ygo5TtG7AxRQqxtH466JFNS+hVM6IPF121SJHndc4enPIPuO0thV5dO/OjVdhXnLrCp8eFImSDVFTIVKH0Krku6eVs8AntXBCOgLfWDiOAhYoCpOYxaYooQiIeUBskvEYLt1JKX230BRNXJOM813UiPWhBKnc3wpTIeOEj4oh5OMbRpijRra5hdHKGMFkFel0hp07t1C/eMLofdtUJrGXrUxnomcRIesp7kj6qYd0fIuAt4gaKtJSi8McxXyOZqHhz84hXF9DPJsgTEJQuYGQ1qoVKyza2640anSWZZ5B6DipOOUQ0uiz89OWjSyy/6Nd4gy0BcIooYZhLvyzlkOpuYUjdRykOkD8+hDe7j7KJ8+QP36I8PVLhPXCoHHtckPWkO0y/Byi1r3OxfHxe6wor1HuvUT+6CHi9y8gJaErspvkWqsjDh/qmBTM0HbqPzoq3voZ9o4emz/X6ViNrS0SyNM3g8hD6F29wMZshK8+vYYbVz7AufEKpjR/dYH7d37Cre9u4vbN2ygOjhf4tZCJbKGQkXICo6Bw7evPMLtxBasfncfK5U3UKbDg5H/QUG2Rds+K0y7PjkXRXCm+k/BzLa5O5AjAiUhruE6cgDJLU4rWmgobJSclTRDDO+Pj+rffYP3iFn65uIF7t37AwdN9pFR89oWeToCVdk7tN3ekt50ZmFT4VqRLozBqDKuofPQA8+dPcfDHbwjXzyE8fwnJZMrMnCIIOfauKNmlc4LWtCtvhO4b3+sz10acngiMco9HVyeBerIgzIc2eh9dq5GcG1S8bp2aGcJFWeKwzLGaTZAVOaZJhLUwZn2ANAoQ+RrTMMFkcglfbJ3Fh19+ju2f7+LBj3fw/PeH8F0CCSiOMOW1uupnqR0k23betDi/OPIJq/nR9iLVdIaqbv8bppVy+vhHD2SWArGEphmMswQr2RguMc8WOd8b9VHN65NZQnZqtGXOmqKEJzaHrgiwUizS75cBi7ib95OnfendDH92hr90Ovtr27BA4E3tA0EWIjkz4sKYvbvp+wZW6K5V4kQGQe3Tjr1N+VPd9ImypcMbQLJlEAUioEexUDjsZaf4JT9iYJHZ0I5pBbA5lCcsbBtDVUW9hMZbAfXQCzkpVsJ8oASeRfzQMwtcYQMoZS3rlSlYCNJPn9ZlzhehdUhOurTEWRyRXI0E5Bi0RJiCx0AAXu6rnklgmO62vcCO1ca7Nr8180ixtrE9tPaCAcUuAz09mqeuSELq/oToi3Cf1bmzDHqrZUN5KTuacP6tOBend8jOAGGMJicwqYEWlwH7TpumwT8AAAD//6xdW2sbRxT+9qb1rrSybCeyncRxUzBpTANtIS99LfQ39A/09+UthL70pU+FEEhD2iaGtnZ8iRPHF2l1nd0p58yZ0Vi5lEAHDEaWVuuZ2Zk55/vO98WYa+TTTwPGgXBlvAN9WoUReZgFwXSzLBZIqtCS6fGbX3NHhyje0Oe+NfJo8vQ+Wy/PgxcZS0CunScR8bIPVc0oFpPprFyAxWtI+Go0dCq1iaBsVI/NSQjxYOTFUqwSbD1KHMWO7mJEGd6th2PkW0Tg5pv/wDD9xMpxus8GLjvl6kU8ukYQ1q4GZL7swH4mqE2wxIMbJO6aSZQwLTDqFljZuo5Xz18jJZspGOSWA+zACOoQcfH3Z7/h+/4Zok7C3q+hvrzQIDT0450XO7i9fQvkVDKao/+zRooshNSPBFSKwCgxV3H37pf49eEKescHzCpIAlMuQL64Zy930Hu1h9Za15hbSVDB86OWYO4TbPB0fWll5MaIVytHsrqO8OYdBC//RH2+y2I8ta3DnbsO/T/9cY2L0RTLVMNbmSxeXFU4PXmLNwfH2NjYQJCGHIhFMCivdgdpqWPSBjWgREDezJgZc3h4gJubN9BZaiOKTRlD5ZQ9Tcbv5OgIm6RculhwlhAkEvkeL227EVhndb+vfEogr/++CJBXL8h9XnkVdwNRgC8H6Pf7KHs9VunvkUVer0SgKn6NPNcbQr3ibLJYZdF9VrwLxjwJCPEnibvIK72JPbcMus8kNxwVLueZKl7AaK7T91L9/v7eAQ4PjnG0/4rFFInGzkkL8uMuCujplPtWjacc1Kpau/q8mK85YVogMW9IEDSMKkZd8zxFuhAxuk/0/sXFgv1Y49BYWvLmU5uxoeXJJufiOHUJEy3ZaS4f0HLw4jFPRI/C0KUVx3emipUYHRUfpFhliu0IS/LaH5sk2Vl/JAkAI2CoypI3SUL/OYCOEqmlM8EBOWxo2dwr6ccxHQKIqqk0xpMZQ4C0SkjQr9ZWbKkSvN/OJZMENIC0PUDPKKY2LRdJsp+ROxcwhI5iWrtriUVfwE70XLs/pjLbMEUYp1CNHGhfQd5dR6ezjNbymkH28zayVod9+FWrCUW2nlkGTYdu6kfa8CjxTMnQieYDvBoP2OZoMqzYvnFUjrkEZTw8M6UoZck1/PVwaNB9YpZROcBgbIT02NdfUDoLjtXEOhkapweqwUwbCOMESyQqWLSxuNJGmNZotBrIiybSLGMWB+9ZhEzQvGfRW6NETpqBE9JhoL3JMYekb0NbExohjDLWZmHqH2TvJeRaB7gIQuTFKoIoRxYsoBsv4fyPp+j9/QzV6Us0KTynBKcW1woZBxJgVXoGMWkh8xjv+djNAEZhgykfchdUDX34HNHFCYKzdei169CrV1AVGalRQYcLnAgwAf/EXcNPOn5ahb7HuKsNk8qgXmZWva8G8sPUdy/xATgEOAwb5vkmtmEVoxVnKBSQ0gGKdEv+eoFybxejo31kdC4g62NYtmD9Thj/oeDf//sM+Z9vtH4oDGmO7u2i0cyRkvhVkvG4q8Do3BDDro4+rp3wf7XZGWbWv8y+ZMeR+f6vpZwBfJ/EM1GTAfI4xvbmJr69s42t9evoUppjeooXjx/j5/s/4eH9Bzg9UU5XyPWVR7MOhF1BZwaaY9fubeO7H39AbynEG5QYtSIMqgG7rlyaP6FnKhpeptTWgixaEcnoP5JKhkYcOSCsFkcoCPLH1qdxgLVvbqK51sTV2zfw5MEv2H+6g0FZsd1jbhSxZF20RHFAWdMlmRahsKR4+7TMB55PU2Sqxuh1D+r8GL3d58jXN7BwbQPZShfFUhejLEVFbjhEfadAXFvIWnqTnk8L0mjrtCAJHZvM9d0mXAmAfeHjk8sGPbT30FlhMh7i9Pwtljst9IsWimaGXGfI4hiDtIFTrXC1naFz9wt8tfUZPr/3Nf559AQ7jx5j/+kzNJTmW26FZs1U3i6lXTgrq6UkkGyQr2Z4iktka2slLkkEbQN2Oxby3NrlkTSMG2uLWLm1gbRdoCxHWDg5g7oooXoDaBIX7pWohpURk7RjSOhrZRIlrtTC6QDA9fdH+9L7vRYwI7h0pvPeoa2oKATKAu8t46jG5u0tZKtXMfjUBXiu2diP1yBmL0ZGHFSQaDonkm89PSOD4RA5McAl4K6qgMX82MpZkHAXQzqXsxCRWMOD3QFyBncpriTdIkv55+QVM8FjF0MZr3wjGMglpATQKlNDYpF+42yXwGrd8fVkTaDfraYdC+MRc1Xo9QyHeGLvfKdiiW8TFj7V3r6X7o9YU35Sw29mD7usg+fvYcQ8sJaGBHDZ5IFtVjOP/hfjtkLfZ38oKUBOZQRYGFYv90ucsBAqXdfGEvQ5rTX+BQAA//+sXVlvG1UU/mbG4xnbsZ2tzVKgDRSpotDSBx4Kr/xgXngAxBMgFQmhVqKoglIauqQlcRwvsy8XnXPuveO4boUEltJEjeWM7euZe7713CjOAQj6F6brleSIftfnA6E3hJALr26CAE0FHtcDOq8qBGjBcjhSKWmOtBh85dugA6MIIM+N8ZdIB2MpVRCM6sibV5tqCZa+dxhpcpc80nSCpuOhv0P3IckFhUbEFJanvRu1DubjJGDHtz23jCClhT4mUR0YRMosJrMJaS0EXIidQS0wqRKGyB+SBSa/lm5FWUwagbaV3FJ8AAAgAElEQVTeWY3oG/WE0nUUYrmo7Ya8QekECWKgphAGZl4k6AwC7sD97bt7KMeKUWXurrYGAnn8PJ3h8PHvuPrxFnut9VHLvyYUyHEwm89xOppjl+RnBVW5mclT2e0QX8hJmtRi1Sz7Insd4IPr13Dp7QM8PJ2IrYR8rXWCjkttcGO8fPQrNj661QwvFpmVC4DUvazeOv2bGykAcqpbXBvAvfgOOpeu4eTxz/DVzIrQTWjTIodPv5kkFcZpho3Q5/XJrRRZgefPnmNvfx/ddpuHNAF6PBuM0qx9lwEdeiI0fJIV4MmTisMVd3cuwA9crnvhtcaMnFAf09EIJ0fPsb+9iXYnMNl6r7/pHInFC4thvFh6uxS65S3TLcQWxynGJyOMRyOW789nM5aSF2WGNEpY1iRgVome5+tU5po3UFx6o1xmPudRxD4z9kgx9lWg3QspEs+ePL2FDVrtVJjFEZ/8M0qon84wOj7m8Mmz0ZiHgNOTCeZ0sc2BYWfAnwNSrdDntIxTlDTYEMutLxplXtghhOCvfjdAN2yx9YK8/P1Bh0P9qLKPfIq0OaNgR99YhQo5n3EgFQjFTizqKpaExh6kDLOjX18ap6nuSN4LYWR42FN6y6J8lqeWOaHkObKiwHR2hlk0RxwLwz+ZxjIoElhaVAw88XtG5ydWVVScE8D1og7JJR3eiNJjEQASZ9JkkPDAL75t2pRUSr3CP1QrGIlVN7tmVgS4WYZZe5YVs/CiJCrpi0OhdC+/08Jgbw/dwRaGWxcRDLcQ7F6BP7wAN+jCHwyBcA2lRzV0PgraRLQDKFJNedL6TQGHhKjMopxhTUp/zuIS6WyOKqJ8kYiZfZL1l2nEFVSoUmZ96YsR+Djm8Ks2XfyTXGR2OpuBvfiOYUJr7O5sIKQcj8EAnd4aButDrA3WEXbp5z7c0OVKMRPiSF/SviNrJiNEPpC1lWqwWkAWa2600nRwdWabQTLaH4WcYOxIZY/ZxBKzwi6HgCvjQq8Pt7cNr7/JAYHx8SE8Ci1zMlmBCyoNVzNOpl1RafZIshcEVDKzqjDXBdxqDJwVyJMI+XyCbLoL58I2QrIzDPqIVQsFycR5oMn4OlT/T1kkRtWk0IAAbwrta3yqr7LZ9niKCgFZx9DC0PExTAr40znyF0eIXrzA5M+H8OMpOnmENqdB+wK2wdQtLg2cVj7s6J+VBgOa0D/NJ9vvzY0YyRRdr4389BjpYYj2sIMeNcVQqDDZsyo5t1fKeIj18zMy0f/+Mr/xJl5Xr6mdW7pRCk+tVSUkb6Y2lKt72/js+oe4cfky+uQ7Tc7w4Mc7+P7Lr/HtF1/h6GnKii3OwjF1oarxfBs5tqP/f21rAzc+/xTO/jqcXg2/AmLkcEM6rkKr1M+vi9cpRpTOK+LmGk/Yf1PhzPubFT3ftQ29lnAt6Mprt+twA1JUxei9u4Wb27dx8N4V/PTND7h/5x5ePjjiPBC3UDbEUB606ew/ZwvQlxKjrDJyfAIn+/wZiDGJY5SzGU7+OgQ2dtA/eB9tCjzdXEcQttEJAySkkKW8rEppx7inhw5DnVc6uVJIrrpekm6teOlW5Uesug+RgwlVY+cJAwGUTE4ESNgL0A8DTIIQHc/FuJViw/Ow4/vYPHgLty7t4+btT/D03n38cfcuHv1yH/Ek5n2uW0v7U2WytdAkG9iYZEctqBobdn455m9Z6VA2SBd/ozO0FwLt7QHWLl/kKsmgLDGMUvKpsUWzJgBgHvP38bO/kU0Tzniik62jI7d0mYS1DbxuD7t8RlnUirgLlruFJ7DiUWo9/NfIfYUiAOdjeMMQtZOfuyeTqq6s/RarlIXspKGbZiDOKPNVozzWnwdpLpPU/aa2XYODRBR7RKRIXlNLk4c8pGcZgwMcTKez2IicNUO5WONJeq+PT1cARlHMj72YiWbCCM1gbbr+2ZbNIGXRKKOg7Hox4YKiKKhtw4NUr0qoNBMknP8hOXRc6WhCCU2gs7ZrWxUAVQ9rgIEUBKICaFL7LUBgLD5awm/k/uZ1NDOmZA+IApdf24XsBZNzJ2GMsv+z7QgEFBDAwWpXeX5UuU3Pg6sUmSiSEETamDMQQGu/LPEPa1fW20YVRs+sHjtjO7tNWkNUSpAqFYKEhAQP/GAkHitegUckKEgUWom2akvaNIv38XgWDzrfXTxu80gfWtlNMs6dO/fe73xn8Y2JgulCGpM5E7MQBZF8aNNpJwigHHSVSaCRBSh3SVXQe9oFVh2a1S9vtBpEI+oGgeb/hN7vuRtZ+K63jvXj66KWncGBDkQmsLkxcYHONe3fTBYTP1jP6nd1xFupKbpCvdfGDsIk4EGbOuawYRc211nTSoy5gjXzKysk1Ic2I8V0MCiT7+tisBIvBD+sfQao1d5MlneNBvlZOO4GgSbStnSWdnNTOg61tRTU/bRbAhu3B3uIP9jGeDyUw7ux66q0PkltOhke/fk7Tr74SrpbArj4IWZEtXM19gQCJpMJzs7OcNg7ER1wqc2TJPO+0tSsYp0OQICKZ22+PhrsYHD8CZ788RiuHynqvRfCXWTA7AIXzx7h9vUlwqNjZBzfQBc5xnTlpjijG1A11DZ8Lj6rdWqaZM0GNNLqDYD+RyIFKF/PgHIq1E9SnQwpZaUZAJyVs5IgQIE4CtEQXbePwA0xHY0wn0yVmRfpr76rdWOVBnDytQEJF//AER1Yq92SguH88gq3ZnPshh1138qlIP4sQjiHWMi+ffkKR3fvCnfDjVqK3mZ/0XfpS0oAt6KWvCyt5wW0v8VSL9qcB2Jups3MyGyYDK9k8WC3fXQ9FCq9xP5Yll+JhqO7Wo5y+BcEcqWALF7PHp6KQjrxMiZeoGLvYt0VZh69XhTzZSosI64j8+lYjPuuLy4FcKDzfJokIpXgz282ImxFHalRluVS6Pyk5edlKuOdsWsurBlVfhbLKTrtJuJGiPZWSwr/TjdC3ImE3k8ghu85Lteate5NRaWodSf0Q+2kqw96gWLZuBoJV893IYuo0n+FWrLiKK21FH3KdbVixyPluMRI0wxXl9dIF+ySMK2gwHiWYDgbCZOkzErJkxet10pFaxIACcLA9jEMM4kAaErGVelgSonAskCSpshXhYAIRsPvoJ6zXJ9E5lBR08NZh+y60RLkGbdHkMr4AFSaP1BasQCL85yJFgiQSbe1BbQ6Ir/Z2t5H9/BQIvg6+z1ZJOK9PSDcgtPowPGbcLjOBg35XtqjSRedUVGVi5Smj5NMxiiZLkQWspgtZB6z6F9MJ+LR4RU5svGE6Inkt0uif7UQSM+rFB2e3f4WN2CRjXjCEGPUY8r1x/fQZtIHDzKug9vHA+z29rC9u4Od/R15lkN2O6gF5lpl12w9Lo5u3wkIoDo/9GAodWQl1w9jOAkL8uZC1RUPG9nruB+RumfMjSphnAnTw1FjLts8QfT9fTj0OdnuIOi0ER8eInn6CItXj+GPXyPIEwW6VuW6I2U6jeYerwXA6ms0xdvu2wKkzcRMyxvP4UzO4V/24PUGcA9uwenuomiGfHCQ8yBVLSXjO5cIuFzYE55zs8M06hIlK1XYnKNyoDLyONPB1Wue+jLHjqX8qxsXjuhGXTGBJPAi2dw8A5Q5ospFTMr/dIbg3zMkz14geXOBcjhEI0uELeFWjnbxNi7km+1Q2yk3kV9Q7tX8XW0RUvv7/Wdwbde4Khltt8Lk4hXwtAE/W6J50BMPm6rKBFwv7e1aNxDwP9H/b/pjwBc571D7791UYK/Ec4FAL4tKepzc6ffwzf17+PLkBF02npMxnvzyED9//wMefPcAs+uFsMegJVpODZzhNX3t9WT2MT4DJ6f30P/0GGOXFPMUZVgJ2MD9Um6/JBfV784mG/NdSq89oOucfDaSOL94QA6Ctct5Va3eKxilCeSpiGpHQMlMJEFJOkUUN9E9/RCnuxF69z/GXz/+iuc/PcT4aiEmf4Fm5NEr1tNpwoY5stIsTQuP68v6tZec/l16HJRLNKYVsiQX42BsxYh7fYR7B4j7fTEdJXNqyIKFZ1wyDb1Sm0vmuhFVKGDDV95VypR4Y+KuL2yjp0vrwbE+h1XrKEoTk+aoeytAwGIBb+hKZ5jRuWTcdZpbGDUjvF0BSTvGqOFhfytGe9DDneM+Bl9/htPnL/HPb3/gxcO/cfX6XM4GJtnK1yZtHLcgCjBnws9mnW+bSu9Lb0y7R8WbWk+bmvBtb78NdBvw+jFWB03xtWq6uwg5Uak7Z/rrIkU2SbH7ZohikmJyNcJ8NMP4/BpTSohmih1Af1XxFtDyt0rXMDaOzgBMNkugvr4Qgt2M7ixtisj6HXNmzangdIHPvz3F0clA/CFm6RyObnYIRTxdKjp+oeTSrKGyVSadd4nV83SEc+2iqsse2mdqPp+ruen79lwknXNjb2CaUmSAhoF+zgwNfjNevRRPN83G1p3qSuspOC8Jnme66Wnk6OYaqK/7Neq9r+e0+Yx8PwoaIu8RSbivDfqgWASGpi+RgatK/AAM013Og3qumxpWGr4aZDDRhaphpMaKRbwBGurRg6YJpupkVdNx/BXFX302iYyWodLPJGcE5cGMSdR1M++XkdObseDP5bk6DCLbJJd9KVCsCF4jmSdi/GyYrEVR4D8AAAD//6xdWW/bRhD+SEoUdduybDlxnMZIXNQ9gCLta4v+6bwWKNA2QIsCfWuS5nACO3V8yJZkihSPZfHN7lK00yBpUb4Ysk1JXO5ydma+4woCQAbC2hDIA9MtN8KOsUvggFQFemxXPTewDCb/FtIvD9JcVZJhT4sT5PozAto4mYnCG8xk16ov2kKBwHqMBoFft3DhJefENTZI5XIwHpRplpXceumqK5R8EHsz7IOiGhTE99EoJRLCzXPKSeYsJ5vlmNjCAP/G5KBmVXMtnQFO6Xxg4RvFNVpAXglQ1UBLGHn9mt+khVDztU3+S/g3bfGQC/dn65OPcPrsHH5aqT4ywNZdsbeicsDh/nNcnBxhuH1Xe15nGuGgcuO/7GjRkD8fP8Hep3fR7npYpIXwlB2puBblvLBiX44Jbvy61LP4+LPP8ctPv+LidAoPWk+h5pHnNsP87BVmx0fobtxGzXfFg5vdZlvJfYuW8B8OvldGgY/+APXNbQSjbYTjl/DIb6dNUUXPXJmNL2FkcxYA4hTrRIrkBaifwu8W0VpuPEZ3sKILWZUHdoGiRHYUZv3UPNcURhpYHaxi/8UrvDk6kY40+cNaYdY4GRjdHgb1+fgCra22jvrXCaDVNWsENCmeqa16VKmI45lAl8xmEkCzMML58Smi6Uw4/ekiKhNZoi5aRDkkqowupWapFb8xMCrRreBmydB/fLR0tdYIceameipqrrSkoz/vxUQCx3g8xmwaYnx+brqKcwlKVM7npq/f7aG5GQjdQkRpQibHSroAFJWJF6G+PibJyNHrtATKL778DQ8bgx7afgO9TgPNVgO1AJL4c6xFodq2sx1teycJl1sJUMqpIGLcMkm2AYcwMXuwO0iOvsCMTREgk8JlSxL08DLBPCmw//o15mGE8XiCebiQbn8cJWLVxwyLn01bRCyU/inIjEwSzDBWIlrEgsEiU4IMoIgZuZdMli8znuaIL76dw66BPjuGJ2hV55eTxvx0rnb17ZpD5c9eOQpaoV9jimpyj/msWVCEimvWayGttdEfbWOlv4HVzVtoDm+gu3UHTreLoNtDvd2UpCbhs7DT1rSAlDotjr6uRG/KODaz+SUWcY7ZZC4Jf3wZIokSzCczEeTjnKE6fzENiauHJowqILyE77ri0c77nnsZcqUtILm4GPQKxrcoFoSB3+lgMOpjsL6Bzkofo+0tgev3V1fldaMbwKWPMjcSIohraRGpTjDNCJWuJYUWLhL0mDIdJoPCZfFBCo15KqKEjFUBod2poztHegLqgnyhC+IsJklMcrMSacDQR+SHbJ64WWk2sBiOhG4QNFtAu4f84Bni40N4yQQ1FQmdgcmkU6mr6oZ/bjQcVdmnssWjKnKAdoEeaWdFiuQ0E2oKJjO0tu4gJ8Kq40vnKTZoQbaq6WXODq10rz/Qu3+pNq8qv6qwaD+QDiBoI56XKATm5vh5hqHfRItrdHyB7PAI08ePUByfIZ9MhBrml1379+PObPLvmo6/dJXtd3j/lRoJOgM9LlL4qYPLg1eybwnqTfmfXt0TGC+1zbjGlVE1dP6H2PhvDwuPXSbSrAlqEelWLcC9Wzfx1d0dfLm7i/VGE/HJMf54+BsePvgePz74AdPTSJAX+jAplxX9s0kb+bR8Tb2SQqF3YwXre3dQX+sgrCkUpHJ5mvLIQm4iHa53X0h1r4pKYcvSKZ2Kqrfd3NvzGH+uoKSEglXxAOf5LE4nEep+A2EWSoMj2O7j3vALrG0OsLNzG09//h1/PXkuIqPqEujWdFebheRGZa0VlbVnD7e6HsuirEKDyk95hkDFWCQhovNjzFtd1DZGcAdDNDZGWB2sIW92kPg15HUHmaeQenbO6WsTPrwsVz0G+qaqt5sv1yy0l4Wofx53SZqM8xb3k1EYI4kXsk+ZTyJMGwGGdGyJU0yaNZwmMXqBh41WC4NRD4PhHjb3dnD/u29x8vIAz58+w8GLfZwdnWJKdKCn84l5lgjFjlthcdyK83L8qk2ddx/V54iGj7fXeuiOBqgPmnBWfKnYiBsGS9NuIDvGhuogSHL0ttfgF54gzhaTOSZvzhFPQlwcnWA2nuDs8FzuO/WT0kWm3YDN3sx1NJIkN80UIxRvhlrbUmYFri50o8noGV0UNlbo1rPwgCwAdr/exd4399G42UXcpOtXoGlEFGaPIh3TK1pubGTCiLjDFhaBUplSNyZVOec9498PWLv0pb36FXV6K5Ku1JWk/+ocKiRxtuhwadSaJNu+T2oaz3ZdwiS81XVt0eKkArAL7hqXJe7lbE7L5L8wooBOxSVAKD12vhjOPbv5PIcIchEwpG2z2TtI197Y95V5o0WnSXNY57B6gDRitFp4tMVFe328L5Yie10jy35ffgfeA1I5Jacs35NUeFIi9HsyP9ZopWXObS0PtU2gvm/8PCI+6vU6/gYAAP//jJ3bTxtHFMa/2dn1rpeLbQwhgaQUHKKoiWhVqS996d/c9770oW0eKlWJ1CoNTQoJwVACBmzjvc5W58zMegw0jaXIAhHw3mbO5Tu/78YIAM9fS009tFZzVqZvg2BLwi/MSbVdf7splzVBVuqkpnAunnOgFlTgSiYqI1uwF8b1N65JkJ5RDHjeDRtgfigIBkgnrigQsQVhMU3arfTDfCaCGElTqeH/S0UCpjoaz0rHLga1TGM6FmBnZLgyTHTpIq2rZZmxNrPJu2eAG+7sCN10pWNHUd8Y124GLeUwgDxTVGFrB1MAYLAL7aZJibg1h80nj/D7Ty9Qns7yCtJc1UH9+eADXr38A3c/63FQTjdIlZVIDNjOBlGDwRkrAaJmx6gjCseyx8DBbDKhYz/u/jTiAL0vnmJ1YwsnZ6/1vLvkPRJ+nuDirI/jvb/RefwNFyYULQZ1seV/c99PfwUeRKuFYHUd8YNtTA5foTgekMBb23pBk1o9o8dShjg8yipcJRkWgrCW3WRJhv7hITZ6mwjjSFtw8HXTNGzPLLb2ftUyHsVz50udJbzdP8Bhv4+791YZNhf4ipuGtOlyMatULMXv7++jt3IXiiB0RhJ026vi58eVZgua72Df8ixLMBgMMBmPWbVAST/58FMxwNcPJoPJhKHGZ6Tu8KcLFoe1pptmC1723pYGnMmdfqWfmzLVKgTq0hKln2B9pCxIxlf8NRHUabyAEyZaRMsc816DrWRogUrHKc6GJ2bUxEcymsCXEY+4UJFC+gXmmg2W78dzEb93lppoxoGeM4wjxI1Ap6lCV5F88gQySTa7PlQWEKNBpMLYCXn2eKWs7Rn1M1nOqC5mCnTKh6xC9o8na8KkLDAYTjDOcpxeXOLsfIAPwyFb8uWGkaI3eQ09JZtByTYyujPNI1UT8PGSz3xSAFeV4ndKkOkfFQFsUKOceXuXZMzrVH2/VHXwJqzFll0QrIWSgRdZ0BNMh8LKl3V3ivrpNJHa4HcC76V+AI865nfuoXt/A83lNbQfPES42EXcvQM5v4BGPM8FgsonurlEKioM6TxIgWxMjgQeMiqUUKI/muDqYqyhS+adpf3kUDAZoyB5YpoAiiRGBc/wB0oHxEJXLbWlGX2d64CKeAjgoMWHCAMsdtpoddqsymh1FrG8toJ4PsZCaxGyGaLV7fAYRRQ3kdJsoikKWx4Md+0qaZgOdOvrgqUyaxYH1XauT3gIuUikUFHCnybwqxIqmaC40hJZxZCfwnBEKq1oY1tADeGdFInu8XgZB1u50qRfksVkIsAVAS+DAGE8j4XuMprxAsLOOsadLai3u8jf/Y58+B6+mMBnnX4y49DgmWTXymlh3j0GEMJceWVo9wWP1cz5BERMkBwPUA3fI2ivQrZXEHS7CNotiKYHQaojptnTZcn0Pu7sb9dfYpqZ1XtrJSwE0MCPHPDdbUUAu25x8Z4YaJVAQwWcnIY+Qf4UwvEI3uk5Lnf3MHyzh/LkBLGq2JNcKF0sK91u4qyKc/q3Ppp9O+vFje/M/lQppgRzX2U8flAc9Xl8JsjXGabjxQ1MjFQ+M8qSOqGlJ5UhfUWdlN/+WT5tGNiNOW67VMIp5HC3jtBM0sfanWXsbPews7mJBeGh/+Y1dn95ht++/wEvfvwVyRiY80OUhZ79VY40WjnrlrU/oz2JRk97336F7k4PSaCQqlQ3ZMrKJOKVjqn+Iwl1VQD2xa4sRvFpRzJctoFt1mgHl5tUU9/MDHOgzQBP3ZUrJLVUKlR5ysoskry3n6xi5fM1rO308Nez53j583Oc7R5AZgKNUiKion2R1U+edATh7kiiPghznMqu9Xa8tOTZc9rz8nGC4uASWf8NJn/6iJfuwe+Sc0oXkiz6Ih+KxpHCBqutSsbbK9St28r5Q/amVGpaKBbT0zEtyn28UMbPrdIcC5FLjIsrIGqiIgjr6BRZFGAYSzQnEotxiJPgH6y2FtGKJBZiH0tf3sfi9jK+/u4pHh2fY3B4hKP9A/T33uJo7x0ujz7wqByJS72s1A67anasU7+uf0dzmqyNnmeuAdVPGSDZEAjmQyQqZ76P7dp6GrTDsSKBgoOuj4wA1x2JaLWJaKsLWQok4wTDixHyy4z3sovBOTdeRqfnUJMUKRe0cwbWUmJHKYVudOpTTvXqyrgszxTl7aWpDD+qCfhtD1uPt7H+9CE2nmzBW4lwESTwmxGrc5lJYPIOit9rSbuarqGW1D9lNJn1xRP1z9V5XQ1BNnL4ctrAdDve7t+4rQBgCwQ6z5omrNwpNyPilbEhvG2eHmY0wcakbpEAmJ3dp/jLu9ZgtZ/B5p9aXq/l+bSw6PNhO/v6d7ifo07sqZnkzPJTXmu78vZ4r48F2DzO/X16PODjGY/lHlg2goURWmU2xxpmfeJrZbgCdt2yeTDlxEII/AsAAP//nF1bb9RGGD0ee70X7ybZzbIEQiFcIlQJqarED2hf+NV96eWhL22RqNSiBgI01RKVJHu312uPq/PNjO2kaZFYCQUises4npnvO9+5/MsEEBYFyvT1JxyRIl54S4wfqovlJNxNw+s/uFJVeoCy2o86RZ5/502Ok7i8OIca8Wuyrhpq93CIpsSa+HnXYPUyrXHvYfX+cm3aOSjWrtG73OC7BcD/TxQ6cFN7XZRITR3RordAu9WW9+fPwUaGQqKSIWDNGIzOOS4pHwZ5VpdQH6MHyS69v/u+AyzIjHBSCIkSY5lu0UCh5LP5DhXCvQj7T+5h/N1xmcHP+9RwZuQ5ibEpXjz/CV99/QwhC3oLVIiTaeFZhoePOFnh1atj3Lrdt9nlgRSouRStlczDUxULoKBzdQ4cHPZx7/AAR793sV4uUEheeibTYT9b4v3Rr3iSPAMaXWRC/XWULHPoqI8WW9c8v0VVkLNOl0lc07AAvMEdtPceYjn5Cyo2AcSe/QwLvEr5S+oVWQDzVGObGbIqFQZA1AyxnE5kQ+8HQxOjmFWAkBwSnmnNChtHSfO5IPCEhtWJIkwupkIH3+51xD3XbxjjORRGaUpewcnxawxv38b2wX0Uvl8VzldjnrQsSnEopws4G382+5OLM6zmCyNX4fQ/M5RnauRF5x424TeNdgl2syLdvLgC6bfCtjBNSqaNjRkh1Vyvc9FqsVllKgDvyeTs3PgILOZC0aauXwy9dMWKCaxvh/Q6jIWMU2mGuM5JZdc6xXq5sQyXAlGzgajbE/0+Kfxs/MmgECCgzQOpsI60HgKvsPpOY9jJZ1QKZm0yds0GHFikuSrwuImrGqW2XIOe8ThwBTThM8nAzWgQp5FSyrBkLN8K8yTByfgU08US8ziRyX3KTToI7EHVlOehGRp5FXXc9BjghZlYyxw6NUaIQksXAMB4UuSWIlpc0QV6lqfhOeqx56Y3VxaNLeKUe8hrawW1NWahSvsUQoBBp99nDn/aiNDaGWKHkXz9IfqHh2gMBtga8t8jbMIIQXcXWasLzhuYIiE6tdUG68ywTSazheyT8TTB4nSKDTWU05k0/NlsZSb69o/HwoTVEAvzIkeDbBkyOZSNYBOqoKHPZYVpJ7hnNdoNieza2xmhs7OF3cEQUW8b9x7cR5PJAWzO2zTva0lOMu9tkq6x8Tai609hUHdjcGL9HiSpIbcZ72YjzZUlZaqKBWBiIDUCrpE0Rr5aIZ5NRUP/YXKOdLXEakaa6AJ5FkvzluWGikjfDd8CqzSRzOWzmRqSWYNR7skhgqCFgokIWwO0Bjew1+/h1v5NRI0u5uMzTL0eztd00p5iWSyQLkzzrorgkmyuuPR7N1CAY5QZzwDfNmimESBjIWPaQJEi8ijHmEOvGF96ivzvXYR37qK91UNzpyl61Mo5O3AAACAASURBVDU903heSOCBrpmV6msbt+oe1r9ZCMDt1eDgvEablTPdUaaV2CZK89/QHoYqQCdX8NcJ/PkU6/EY8bsTzN68RbBYopnliCydMqW7e1GUZ2W5RkoJgJMjXJ4oi96/zLv8BMcaa/7GN+94wHx6hlSkChoNpjHt9uFHJn4tt9T8qnH5v9enuufU8tfdiN6yiApVr7g0ep0Wbg238OTuAR6ORoiSNd6/PMJvP36PX775Fh9evAViiMyQw5HrCk5lnfApNxGTL6bHUEG2v4v9p5+j9/Ampn4iRW7AAoZnqtLWhFh/VJuOK9Rj92JTGgR+CQpwGBNLprlf5nJf9z6wzY/IRD3LDLReWIqxW2QXqg0Kxm7Bw97TRxje3cPjp1/g5Q/P8ebnlxj/cSI1WKgNiFleU+2rqgEjQgZmPDNqufc29rgl8hYTfZwTbNsQSM6hyTp7+9oAdDcHUP0+/O0ewq1tAWfzZoA0VMIKIKIiqUk2x74w6Ljx5vKsoN3LSyZCDmck6JWSsDLRqPZskqlmTFbN7kJZ12pBX50EaxqdxSt01j7aSYBpEmC020EyO8eObqMVAOc+fSWYstJCsHUTDx5/hkfpl4gvZrgYf8CfR8c4fXeC4+NjLCcznI8vEGTmeSK+sXGAHup+217tGvUlH4Zoq4vd0Q2RUWgVogg8uQfi6eKb/oCyBkpuRelG+Qe9j6AQdTuSniYrJAoRDgZoZgW62sNI7kMhiTMcxMhZF28kbpsAACeyG8mrz5CzBqAsMDNeNvX6lw0g66ROuyMeGKP9G2gOe2L4p7ZbWBZr5L1ApFiZXhvZrzYNtTTS3FMsBV6nutZEGpDc6cN5zsj0vGHl3Cyo8txm8FeDXuVXOvX/Anfrr3qjbKb32krK89IhH7bPcwNf547vGNf1dVj3I3BGgpQ3SM+l89KXTQbaSpXfk/2gljAjPghpgk4nsv0Nfy+k2ptkEMMer3kIXGE6uCjtcthMUOgK8CEMATH39Y2cWphxVTKCe9XlSuwtHBvf3R8nNxCPBZcaILUDr9EvWRvmM43vnrBj7KtkFmwy/MPXdfS2cYTRt5Vc7lIkZRVHaTZiI0EQpCHX5B/kNxuBL8khhyBIQ+ACy0VWISWW7ZwJ3jczy1WARBfJFrVc7rSvvCJXatr2ViLqLBv6UAv3XSZPuLvJIDZ8KOXsGYLbx6dudQcvcR1E9x5irWQnqNiHRTt1SQcLyUYjU92wGzSTXyY0bhI7njwXhPA5rLK+iDhwEFsLZbfQbBEz82XUjd6B2lEZVI9WIPyO4VBUkQXGhK1AeGATb3Y++aDjxMBGCN2lw4AXafs87OR0AYqlAPT5n76IHBpLOKmm83ph0I2HVKu0WbxJmJgihIRiyk74VrYvc9tGRC4ehNhslsjuT3H08QlePX4mitCDeCgHXUFIqQfbmVFYnL7AzctTpO9/hCAaoGxWpnrFppM2FIDhIMPz5y/x1ZdfIxlbn13xNQ/EC9Zt9t3h5Sk5mAhbHKXA5198ip8eTdHk19CqlO6ZEq5ljvbyCerzv5HNvjAVdEnEPRFAchZV/+mD/z9iU64IIMIo2hQtRpMDxEf3sJm+iyC9g7aYSz8ztLB/sSG0B6AIwEHh7U2NCcXjhqxkl4iUL96y1xeXmMz2xUtaR74k8lIPU9YXRhkeXEhiVuhT/03U6A/3p/jr4ikWlwsUhwcYZcbTVbqKFCWqK+laXr08xfmL55gcH0sO0lA8k2uHGxqTncb4mpPXv1lucDO/Rr5eoqkqUeyH3RAcR8l4526Fnx+ngfAsqdZKA14z3y3P1to6Ej4tIjEEq22N3gTX8maVY7POsSSkf11gvdxguWBB5MrYz5WFFCKkG8uOm7XJM8IrWjq4ynY7PcvjX9EuRhnbxHRE3n+MwX4q6z0jrzIby+FKLt4oowq/7lTTA+naW/01uYYxy1W2U851GtioXTb90Hw+wrpZnOw0NpQRaUtHA+HrU8mVD14ay1vBGwpkP68bUe3nz69enwunfzFfoSjLHlzb8uL8gVAPJEiMRrJeuTsWeSXjdj3PpZNet0oSS+kkURtF7Tpj0hNytCXY/Vj3DxYLQdfGyE/sVBn5eDt/aRdAMIYLe40b3U8gfLNPUqG/aJU4EnhxhirO0MQZosm+KPSf3HuA7PgdTE4+gL+XITmcSVcpHKbwojHaxsey9ZGvWkEssKDD/Zrdj2ZdClc/n1s0yuIa3noNLQr+lQRI5JrzHqsiR0zee1kiTYYC9eXeV9WVmZOErMIXG85U9B4GmB0eYEZxuiyVLj/t+Y5PDpGkQ4ySVJBhyiVvfIaeQk32pMuHiUoojWdyJ8rKOaA9K0bnCwVOKDHyH4GVw2jlTGBFSzzQizUXrGgT1FcXWLx5gcXZa1SrBerNAs36BvVmhZBc+baEoqZF67orQecV7TjYOwSKCb4U3ysaim3i/nsP8WGa4H2vwbhYApsS3s0c+cUl2os3UPk1QjSipC4iTDDCqi7idTFThxfRzte67YlR6d2L1K6YxH8MeTI2SwREBJQL5PNTeNkE6cERhrMpiuke1CSFTmKUukVFe0rf+vX7ruNu1nO/IKCsbXtoXRD4WnGysaKJLO6wsEaqDTnl/JmK8eNoiNgLBOE0aLaY1Q3a8ws055dYv32LxZMnCMj5JsrQs1KdPYSi2S29DgnmHlQ/UXBCiq0V5eMdsZhPDQ+6ghjLSIdsdBoCLgHZCQx7vbW5teKzum3kDGpuFiiJhFrlGG0/QHB3H0giQSeupCioJIEciNVbKwGljJ2dL/9mCvu7EXbLv9tT/o0R8PXO9m2rrUWlba0qGP0UjtfBNMXJNMEn7x3jwZ0JJmWBZ7/8gT8f/4hfHz1GcbkyGkQ+bHfNQ59n7u6OrxG0Boz9ME3c46MMX3//HQ6/vIfloBLbUJ5JCLZdMUKULbz+p9yJHPsWSXBLHFemkaOnuvnewknKSZGcRWTbJeEZq/3bHbmqUy+33Fume6QtcI+gu4hnNFPoNMKScxQMkasSwdEA09mH+Paz+7j/21P8+sNPeP7z71j8fYZhTcQWhALXVPWtkeuS047yIfgIRB2JwjPxigiUGdcEDlnCLh/3JYSolxeoNldSVKErkpelGMz2EGcTxJM7UOkY3jiFSkZoIx+VwaShYSiTROZcw7ZD1ojUiczryMbcrgOkjeqM6+ZCYeBZjS1/V2Ik2lMSNA+YFznWTYBh42OsYpl8o1EgSJeMRdyyNG4LicJeMkI4CJBGI+ydzDC8d4S733yCm+sbPLw4x3Ixx/zVG5w9eYbV6RmuXp2BHDmCDsjF32172o441Wa00DSj0AiR87wOqJsQJiiUjX+sXgA/RyG6W6YcyILzqi6lq8Y1s1alwebDFE6Uv4UX+V0hyWh+BYj8MSKdQRflLUo1pKPddh1091xlH7HJMGHeTohY2WqMSBOwMMvzRM6s2nSSlWmoastVojUwL11UeUd9cegAdw9s7DJhFGew0MRSoqNAZwbR5/EkX6ucQr327brqIYMkATUoGr+zHu81WvXOUUDiI6fCz9iRBYYeLB9WrK5Liv1d4q67gqv5HZ2dzPo01VReW9n8jom9xLBadX/PPXgQEiFuxANFI8FC/jld5X17WgKyzOyBSQ0rx+k3e4svYp0yzrZD7z6vs8A3r3NK/2adu0Zxt2YsvdUhEWg13v8iSrufp/L3zoEsIsJKLPGNSD4/i+iMNbVQvE3ubd6H67aua/wDAAD//5xdWW/bRhD+lqcoybYU30eCIAnQC2ge+tiiQP90H/sDWjTphbYPRY9Yah1btqVQIkXxKmZmh6LUFCjKl9hWIInkcndnvsszRpz/mdpt4/10coMWzFu6jfWEaho0Wm8+X0yLhBobB6EUDnFZdbjY1ZvJi4xlAWihr8X/Ngqun0VmY6qnUNpHbV0T24t5e6L2bSHULsA1Q5ceqracgbo5pOcvGHla0/MbTwGrudBrpkdpafp08aE6KQctCYDNqLe6DMmDt66NRgzltg+nNZC4K1abNfOCXCgLRaRsAUubIpOg9IHjZxcYHO+gvJyzvp+/v7GkT9aZ1liVMb578RU+e/IO0mVuPQlalGDHZ3QqT0tMJvc47w2b+L+q1I2yvc4tN3oaN0UtUbRPnz3EydkjXI/HbKbnmpzvR6cqEU9HuPrlG5w/fAK3uy8b6pYu+f9GHxlL4+T7TBsuYtt1Ijh7R4hOHqMenWL15gp1MW0BoqZlyiPnSCyAaZJjEBJyC3TDHheB5FJ/vMgQBX4jkamsVkp/L2uZWGhFZlZZ4HEh2+kEuHl9jdnZEaLeQCTfdnNEph3kTk6F088/fI+Di0cYnp/BpbGeUPE952KT/uXCimh/2UqyzslfgRaGXMz5WL6iRY+Rio82yuwib7uIru3+EmrOC7sjrq7lMueiK89yLvind2R+mOD25g5JnDDiT1R/a8ghiw3HURqmn7PxF22KVpn8zAwCcebnBAFHqKvoGPR7O4g6RO0P0etHfJ1Iv88Z6x1pRtCCxuZr1qGOKdMW0XSNvLfEElatASAUKKMO73ZsUnIArK8IYxqez5pS6gQlRKFyOzBegCRZIp5nnMdPBf/V5Ba3928wJYR/kbJGnQpll1ktPhBE3MDjeYXHsGGvhHwlZozk6E1zC8sdKLYwl01EUdl4olbcUaP7bJmNodnAVNbleB03pH4PaujKsocWg9WxOcV1k9zh8j1YEgXdBKidACVFyNQuvL0d9EhHuneIk9Mn8AaH2D0949gp//AU3u4Q3mCIKuhgUS6RUgoBjZdFhvvbBdKU/A+WvJGgcV4tV6jiBEiJ0pCxmzJ/meUcYU7U9Kw5a89GtLm1NASyIkUyF11dr7vDzI/BYICTkzMMh0McHR0wrT/sdVnO4kUhTYLcmCPTPtb/VwWbjBYajWXQlEDVFkrKY0jpjdaAx6hjv43f4SaL9c1YEkW/FlcErDIU8ylmV6+wuBshuRlj+uoPxJO/MJu8BgjdZ8O3kv8/FR8+sg0zRrPE1vfZ7HDyXO86QjN0ZfO4NCVm6R2y/gM2nby+usfo1zHimxHK9BJOGZMTCDyL77URr3a8FjZo35sT7zoKcnOOFbfygpsWbl0gICZDmaGY3mLV68OcnaPe7TPyuNPrISBT1MClaod9KvKamjCFzDl0HQPfzlf6ubWNUZPPIzMk9hmi/lxeomccBI6LyHjkRIIgyxFRo3OVo57FeHN9jXx8heRyDMQxwlXKOn82YaO1tVyf5xY5FG87DK9ra1SRDj/yGAAISEteKsrlMvW5TUsVtmzdoKaU8kBzY7oqULRQX7pPZDyLhCKPr5DS+WRzmON9BHsDRCElxftM/2Z9LqSh0mT1N6dQvTVC9r8cIisUZljO2vyc59zAk43kXq+Dx8cH+OD0AM8eDOHHKX55+TVefP4FRt/+BGe+Yrf+TULZJvOIs++bXHVhXixpVg9KvP/Jczz9+EOUxCTxsmZuYBaUXWdpQPzT5O3tR8PYcDZNAbH1jKnflP5MANe/vidLUUproicu55QY0rwuGhYUToYVLVweRbQ52H9+gU8f7ePdj97Dqy9/xG8viRHwJ3puwUQfz5IajMUS1mOz2rCjdCytXc0kZWlcm/iKY4thc9iujcqbT+bA1EF9EyALO6gGh8DOANGDffZqcToR/DCCE3aQsWFpwGs7N0bY7FAkSTQ2aG8fIBATaFXwNHIimxBB4B+xBlvdPZZKajgmscroXKkrmAidm+ZpTnAitJPWpVD2b/L8l1h6Obq0H9jtc9OkO+jj8dML9lVZTG6R388wuxzj7vcRbi/HiCdTxDczlIsCWZzzup2SgTCndMlehfc9zrqAo+eGzLBDQm6aWdIRhNWsnRr0tErt0sACmDROXdP8rWmmEgpsBEknXKHwa7ufsXv82rChn45BZfoYi4jnlUADldlE3JvGtrsGZ6VpJHnymtbWPDvAhj5/Td+XJrTKpIlViS0pNhWYhEKLWXLVvK4zjf6treWvtpjO7edOJTlq3qcsba2zNOu/YV9jsy7U91MTvY3a0AKo3IA00tgyrUlJGwJaW/L4s5n77XSQ0A9576aafgLjNE1AD01q4/MlMIzWRFqrPWIJi6yd1g9OwiNfMuuhQK+pAX2oTQgLGG9LuiStjvwI6HzEB67dPFAgnd6DmwG5mD1qigMdzJZ1PUSRh78BAAD//5xdW28bRRg9O7teX3Nxrg0tlHKXCjzRPiEh8QISv5k3JB4AidKK9KKEUjWtlThOYsder70XdL5vZnftJCBhKbEUK/Z6dndmvvOdS+DMEKonpzwx5grBPqtSkLnBTEvdHQdZorjYmRTHxVRcRiVWSzIcr4sJvJ6etXCCnZYjMLqBTmMBAZQOE1gjjfTG91j4PKGd2BvdV407T74DIeQkM64wmhb6D6F1+56gVm7whVpDzYYpwZJCv1IABSg6AOUxGM2Az7PiOK49VvuePC7HoOAYVhcr30XIOU1WrokHZEMIwndrE+/d/wBPjx5hTvdro+cJVi9orHblt0e/4OF3PyBsriDL/IIKygtKDN9yRfwODg6w9+5XYrgiy7VodHBlsySIr5WFMO98a3cDdz/8BPtP9pHGlzBGOxZ1nwY6I7zef4ytB9/DtHZcamtlwfv/LgBG/Bw90dpLNHvdoLm7h3znDpKNdzDtvUCeXqr+yzFaBBEtY4g48heTGMOmjxUaVeYKTg1PBzgfnKKxQgfzoJhwNQGjzPk0ptTd0Aeg212VSMC/X55gp/cW3e2WJCRkie6m6Vqtsm1Psu+f/rmP96YzuQZY9HOjLPTpSWTRzhIgEmSwHsrC4gWe1OVCZ9SrRX6HbQdO5YWZCRdwkQLMEjFYoxM/WQR87vV60uU/G5xhwuibWLQjBdPGpGV2umjsWewJvbf0BuHVxCKYG1JGAnHy4zwhrvzU7jfraLGAq/mot+oFKCabvtCTbrxni7YCEOMYS0c8U4KPUYaBsnvsVprotKnbiVk3JiHHR3ozqV5l1KXDwzhiEZsjijJMLucYj2fon15gFE1wfNpXevg8lc2/TLp8r05bu+rUlxPsoh6cqDFHYJ5IYc/8fgIIzPbn/0bsfCfavXO+w668dB0KU3F/XgbAvAUJiNWgelnRJXau/8KMzUtjP9e/THMtHDNm8psQWWcVweqWdGyDzrqY9pFS3tmmhn8Vrc0tmEYbPrX8ZAj5IWK/hosUuDyf4/xSAaLx4EL0+sOTU6Rjdr9JDZ8CLPy58JBayGc7ZzLRoUmYPR4udLyHkxFqjboaw4ZN3P34c6ytrWG9u469W7vY3umK/wNTHdq8lm38HjdI0SyW4p8b3gSxUM6l2LKmfNWHW1OqnW/YRdzN8QQOctnwGWVMQfXOuYsppeEq2T+zGNnFJSbHb3B8+ATHfz3G+dvnGA+OhMHA4mZFiGe5FODiV+DZVAKrsfeW+PCusPGv48nbpAgvSTF89QzxyREGLx6hVmvwFhaGynDEoLSpBFsFNizLRdlVryAnFnGfUjRo/6OuWpSM2C54ruwNrqE5qZbJCPG4j6TeQN7qoLG+gU53E0mrAdNZQd5uIm/XEfN6pGQMZGspCJY4EMCjUZkWNZwTaPBZoySJzYWMUl0PtSRDI5lJx5+0/ux8hHG/j9nZANHbHmrRDCGd9a2wxXPU8dROE6VNxpVHAQZb0JvRrpS2EURoN3yJamVHpy4MkFziSYV2jOQKiOLOa2YjOTe2ttFsNfCGEYTjqPDmSZzxImUPswniHs0cI/iMLeZnd9exEhLoD0SyIiCWNSK1vG2dG/6l+F/wgagyLwpDYU/mFUlaIqPLeGjze4YGt7c2cGdzE/e663i/FWJ22BOzv99//Alnh0cIU937hKERP5ObQHzfrrOB/Unpb9ACvvzmAb749mvM2zWMpyPEgYI+xldJX8mK0Uix4jt5V4uVhbGXfabzp4ItvMrXYAsAJ1kVyu+NI6iP0KYGsOjh/ezYs+4hjSej87z4NQVKG2ndauJO5yOs3dvF7Yef4vDXJ3j+8x+IjoaozRUUURAJAv5XAqaL3zd8y+Udu7I/bLN01bdclpi05kuRC+Z+HZEwextobCq4W+uuwmOR092WJoffasl9ExoFMbKazoMmDSxFXjlDBAZSF+8oRd3c+rOUR+XbrqdK9VTORdJFEKSYxJlG17JVMGVUaypmpwS4AvlMathDmCCU4t/PQgRhUyRfpMx3ml0EewnMvc8wu9/HycEz9F++wmt6fvTOMXjdx9x4GOdz8e3R/a7TI2YCdEjjwffEo0g3jlg4dniVa6x677hiOLsmrtQ1xmzMOYFANmMKOr0tdufpYqqZT8Ms2xzKUx1fY1kmvPbTJUmo3LtVeroxRXQ4m7PG+MVrsLnywsZOVZ5H1ksgBaLKtdn8K77Cco3oMvNtEZ5k2UJNtywJEOp5UMM8n6vXUmXd5ZohTWCkRQFfldcqpd0vGsdlHaS1oxs/93fXWadMs5CV285+If8mA3XGtBrHbtH/kXQ4ypCs3GL5oRT60jh08XxpU1h92vgdyutHXyOwEGJMs2LeX5aJwIaDcGpc3WDHhxKa5THUH51PxL/LeZIQ3DHKQHMefSI75brZ6UiagpPWsy6YTqf4BwAA//+kXUtv22YQHJKiRImyZEtOYjsPIGkvTdtT2kPRW/95gaA9FSgCBEmaoK3t2LETxVb0oiiRH4vZ/T6SctwXwosegCRS/B67O7MzDUHlbaIi9JMapQHYTM7lxKBIp0M8RZwraJSBuUt85D3bjyeUuNyUqL6jdASFVitc77yggoEKNThbwPqFy4mHjoqRl0mE6A9kuVywozyXA7bQG51ZZcSwLjRnRQ75vlR+7ORzDAQpKmQaPLKHQn8/1E3R2hjytwNbVZIql6Xm18/BC6qJk0n1LLT2hr4VgCrKQXy170z+g6x6vl6ty/YBImTO8702yrQtnHTmfowbD/bx285T+FO7kNowwy9U/ZlEtfejt3j5/Am+/vZ7sdxSr3W1Iits/wn/yqOjI5j8GwKmimZkBa5DSowVz3F97Z1egM8ffonOj48xeXsufCyZaBwn6RST00NMz95ga+e2UAaMcqVKFP9TDk/QOo0wqIKbxzGK3g0Eu/cQ9PeRJhcSuLqEtUAVsLhmlskK+DDPMYh9ZGkiSBYT0NGbM2zt7iAOeyXqX6rGu9fWDFbis0CtJ4fDHbw5fYez83PcuXtTEh4ZH7km1SktWlptdBpNvHr2QpBoTmin2Fp9v60w28XOc2qi1jubm0HddlLGtlUfL9TzU5Bb9rQt6IWdJBiPLrCaL5AwoUkWGF9OpNVA6JC5tkh4dlwU7Gey5wzLMAh9J87ENaCQBITXHLXbUgBhws/XcRzJa9ItqY3AjVcKa54WTyRuIsoQOjzB2k/aAN7ZEHm2iuo5JkMAW6nXQMcU2tbgWX96qlZlRjcEIlvT3GCeJELjJyV/Nl1hNGI7RYYPixkKOiNkqTCCPF/XNBYfuVaQcsW2CF+s5JYSxKxSLXxyXWU/IJEG9viJyr0SJcoArZ74+1eel+vHlbFfbXsVhhuU86TCdh0Rlh78hoECqcloojvcQxhvIe4PEMTb6BLhZwFgeAvh9hBBbxd+t4+CLVUIMJO2CYq1+phPUkxmUyTrDOMJhR2nmE2t4OR0AswWglpilVD2mVxDYJWj4TZnMkQYXPkNLPNE1nvSO8kKcb3htOHbP7iFvdsH2Du4g93d2xgMB8IQYbJEJJuoPgP5uVkgasXiMkGmBdf4hqAv6j5jCvOR83r5P/pa0BXehanIob517WDMSjolaZCm0FYAWRHY61foeGyYDOl8jGR8gcuTQ5y8fIp3r56Iu0lUTBBT/8CksgeG3CVscVDbM1QFOjTKlHH7KUqCalF7Xh0NJz4o+0YmZ815myejUrchs8hfm8hPlpcpw8cKErUCiNs+PmG9lRIDmWZk6TE5MmtE61TaItjykF1eYH58DC/uIRj0YbpdoBfDjyOxXuS9a7caalvGbY8JcOhXSDGTfiIzXAu41nA/5v1IljDzBVaLJebvRlicnWE5HqNFanaWg7rdLdkCFGXOC9sfXC901K+7qGj6qBU5jFdJsESdANvbA/QGPSlIsKWHXuC0KHVBIdG6wMNHLWyC/jdb2B4OsHewj8Uqxzw5kVYSoxGWrgN5gRbZInmB1ftLpBQ7y3OxMWzt+GhGoehsLAtNBDhEM9taoK1A/08DwFiWgqvpy/5BzQnfyPzb2ergRtzBZzdvoYcA4fkFfj86xovHP+H4l6doLFhoAeJmiHWg616j+GedArdiiRhiF7j/6AG++OER2vcGWMVaDmmS0RNYL3hkZfK/8T12T8xriabTcLnu9d+BTg5scc+dZdh1h2dbyGDBn8LaetUP1Uly1V0jffqMuZYsbm/72OoPEO3FuPvwPr767hGe//wrXj/7E4fPD2GmOQa0Hs01NthkA/zXo+rbvzoO2QLTErP8FCZdIsMc2eQSi6gpzgEmjhH2h0C3i6jfl3kaRC3EnTa8KJICd+irE5BHRJiXyD5lT+cvL7rFViVTbDBlnXWcUNmh9HktHnJeeMISajV8UL/XkMLPQizZEc1cGaQNpY5HeYB2GAgDkvtwi6FespKi6+ziA8avT/D+j1OMT8+RvL1EOp7DX6YIVms0eW+NZ4vErJmpnR5jEgo48pECr5vFK2NbD72Sh5FfU4ZRJnOVaOqA0we1pasAyMJXu183JhthWMZ2xrL84Jgr/xIOey4e3EjWXY/9uvzf64eKWJtSA8BZpksuVL9ndj3MbQ86gSgm8/X7KoBSUCXnplYgKM+xpp7PR84fz/njW+aB8+Ovn6tXY6IXZpPpUHchCGtidyowiI3POQaQ6B5YRjZjQ9Gls3Z7PtfckDpTW5ok23vmtNx4zSz6ut+oX4/L/UQAnA1mtNCnNjAq/gAAIABJREFUGDwtctNUro1AOD8v4C7zR4lZ1BFAROjtWuYo/PWD91GY6Q5orQn+OU2Adofg+NoWJ/W8HKtA2QdNYXQFQYC/GLu63iaOKHpm9st2PhzHIaQgEYEiWqk89AGJt/6D/vW2KqglEoIWKOBASGKvN/aud6c6d+6sN24qNTxEsUhs745n7j33fMRxHDRR/saGiwRFUagb6SI/LN5p2Ne4YHJmvbbV+RiGYGIXFmGYAopxVunzC4PxRKYxYkEjEWmT3QUceKFy5vVqxIMM7RRIEM2scS29hW+Yf9NrPfTxOPPITydqIdAo+fsxdVcS/VC2ru31aj3BjRXpCYumaY0vvJlGHKcaX0GziGX7IfDFntuIMzItDYexXkZt5+tgrNGhpoVrwMeZocqmQqb7pG0pJaYMaQRa5EYKftQaT8MdcXg8xvDBPia/nWEgk6eWqyVbRQaDa8xx+vI5fnj6zMfw1UYKXtGeV5VSsK0U2u/efcKDh0dSZBuljaMDQrhmzTsWfSGnN4nF8bcnOLj/DaZfTuXQ6Pd7gkIPU4uv+QW+vjnF/skTrOL+jUUv6+H/RkjdJhnQn8VsxMYoTI308D7SoxOY969Qf36F5WqGREYLnicddQrvlRLAGLeWVw4jGriV1Fj1UFxdSn59MqAjvV9HkW5wvI6s/ii98IibFeo/mw1OL3d2ephMpric5cgG3oVcgC+aV6U92WDZFLCxuTj/LOua6zuYLvqCyIq2R4hN1vtcsPEhHV3oRJSiEMDShpTT6aIohN3CZABuBtf5ArPpVCYBLLLpTks3f8asEbVPlCEjruqSrW6U7u+n8FabLm+rYUWnT3M1NvXMMt/a8rT+LRYTiRVKJZt+T4EyarRWyUEnbMv20DQKnIRUe6U76vtO7KDd0DiRJ6Xd66f84RRJVGEmmmOhwdke8qJEOSulJCINcHJ+ick0x98fz+TzzwKe90eYE1GCwe4IjauwHW21oKZTJJ4gyOJ6har0xi4sdrmpzua5TKJJqHAd8qDZaPADw0TSJ8Ih3wECNr/CLpJEabunsGEIrSvBukZ0uokUZlGcwQ52gf4I/eEdyd9Ph/vYo3ZfKZ8EAGjqsUoYdddHHfewNKk3H1w4cbMumwTz6wr5VS7GRZfnlyiucixmhbjZo2QMXyHJE6S4g/r3zIC235xSM3c9mCty7VZLKwZVjKx0tUE2HGNvNMLR0Ri7o108OnmIvfEO9scjL1Nx1pvbsPiIVkpjU3dPxJhxnTIVpvFTIq5dvxcZkWasVq6dKvj94Gb76+S8MW2GsIx3dfJi0gjXdIFWQIkMD9sssZ0aNMUU+ad3KCbv8frFz3j76jlW0zPEqwLbzOllE84zwnhNP+Uqrlm1d1e2STH689Mc39jccuM3mhSaKkLPksbYVssqa4gTJPnnM6FpCEa6ltWJcLNhat6VArhbns6tB4e3NLHrv9H93u79SvHmVLcW6MmirhboNdQezlFOJyj5WaaLZ5qhGfRg0gzb4z3U9EEgEEADqswbCLL5oc6ajt9kk1CiRBaJOGpPZ1gSgFpewxU50rrBrsgSfHFHgKVuo/003z8wvDbeVyPHpvAZRHfuVCpnnG/AuPeO7uzh4HAsQGDCOoISrMqfz6Q6V7XXwEpEMidrN3QTXsOa9Xo4ODzC6OAe7t67xvnkAvNyrmGbIZrW+dQI54HUOp+ifOvNV6N7h+iNh+jt7aGILIq6kvQeSTQKJOzarMf7/wEGxMwBD9nkrH2cN/7i41632uCIBprG4mhrC/s8n/78hPn5JU5f/I6PL57DXc7gcu+lI7JhMZblNCtIRG59an1OfyOiAfDw6WN899OP2P/+GNV2jFXkz2NjNWveKPjr1oOS4BPUsqduYbK2a7Zj+gVtRGXwFHsJnGR4l0svReFjSSLnKzqMzH/9vfa2KgDBM7Jj6sXfb/SzyH2JslGy8yqa9UnzW8PsWDSDPg7uPMazJ8c4fv0Bd395ib9+fYmLP95g9qUGsZBUcfYE/tqGkIKb54U2Q9oLbvInzYanh/IDpNmtjRVBkl2WiMj6WNJP5Mo/Tp05Ncc7O8IGyHZ3pW4hmGzEUDgVCWs66Ato7mJtbqO4fYUhKcwGVi0lcgqQ0T8rpQ6b5yxrMDKImFiVNIjKGRZ5jsmHD9jOMlxxuBDHAmAkUqTW4inDfSE/+4KSiUOTz1heXeHi4xlWswLVvIStjaRc8RpmSET3XyxLYQVWBGYzg3RIc71YjhcxFY58ihAHFMICbjqGz3ZNVW99yjoA0I04Nl0+IUY4aMTrTmJU9w6Kv0UXv3KuNSwPjGsXWNqhpA96/Y502yS+qe4as99YLa7pxGDa1nBdJACaRR/y75mstmgWLcuFv8M9MLCUpX+yVgemsR+QhtfLJlR7mFiHlHys3x/Ic8iQWKf0aZS2/U6qw9aQ1MGfvYRSTTfpI9BJAOi+P0kxC4BA4xvlpO1F2XP69Sh7CcEm9mHce9W8jyxbfgVQzzfka+PB9TVcx8J3JQvyfzXSnl8Sga+vNcgI6DvC7zXrWH2trHHCNU4SDrkV9O8YaYc1yJYufP7TXk9eM9+b+FrpPQ1GgezNZXilzHNjLP4BAAD//7RdyXLbRhB9mIG4S1y0u+KkHFclPuSWKv9B7vntnFL2JY6duLxIFS+RxRWksE2qX8+AAC05uYQXyzQtgiAw06/7LXFYyLQzY9T4wTcEZIJVmubGId2H+rRCLg6h92onaOtOGB7yBZAS6PUJIcufF1i5pbery7jOXOsLq0y85b0Cxb/wDo+8qGSR8YZizjsbBvAfVYaDTd1JgyZiTfX6cNPo9NF6s0AQUFl/MZO+Ihe1v/ikG1MUuhDIxbHNdmx2oeufR3GaGpdRJ+Ljv4y/6Uo0Ny55LcFbqQ2HQEsJ8ReFRxrOb5AygWS0oWxC3RiDsxFZAO+ffQCltuG9gqmMLG5FhDevXuD60wfE+6dkAHhrmYoWw6ZC6fDqz5f46v4Zc/t1b/zClEHMemQhb8eYnE/w7aOHePvsF2TJijnH6XqBjpyLzQqLN3/Aza+A9jkKn+0T+bgjW/ve/msjYHvCVftmQpp5tws7msAcf4348D5MbwibTXXTD9TJ2tytYOkFrDNgtkwxnHhTDqH5pCkW00/oj4e8xjWhoUkBVOdOPe/SSCk74PR7PBlhPn+Hi4sL9PZ7XKhb3Y7YjPlM/bg6Dja62JTKfOyTUQNLLqD96rxQXtJS/Y80JqQzLqBNJrTL1RKb1RqrxYKgWRICxENAwDPNBJmlrn4SMs2Sv5e55p5zghnL744YI0icLptw5DA8GKhhYLtFgD8YDtDptdkAkNMpOiOZ+kpzUAo5oVULu0SynCs6IyduqlcNG2XkcyXjuAYxhNIfqzEPr1GC8j0P6mI/vpRGZE8X8KxAZlpYLBKs0zUTl95/nGG5Sqnlny3WjKabLRMukO3+SDcc75LOTbNU0xVp/All8IYGjAUNA/PUYbZQgxVpOuRuG8tX3QLbo69i+jzD1muoo8aMehf8hwlDYwoZfjZeOSsbqmkht3voj0+wfzDC+OgMvckZDu49BPpjtPeHiHpDlGKGF3eRt5R6nUpxJxPGjWMDY76Y09iTUoU0wqdZgnRd0Lm+FP2+uBhLlONyTcCFYql3iVDa6eGVIkpyuGRBzauYY5JRJEWEjXF0ekafi/HhIU5PznB8do5uv4/ReIDuoINeryWCEbICynJruEWjo0Kppkp3u00P6P8sfBPbU36/LA0zO2TaIN9yBEaqR1eX4CgTGnaCm3yO6cVzXP7+FBfPnmJ1dYk8+YgDqUjdjXpcOG9SG/Kyg+lYVdCVlYb+Lor0XfFmCPuKwNrKpExFHoV36KbRnpfNVCZvkUq2yppla73d9n88KI1x/n4SQFIYeoR0xEw1U9PFQopGma5Yi+lbS0mV7bToE2C6bQ+gfDyhgGth1SQbGooa6VbROK/UCX9RVIZ9CnACq2JLm1ZWSO26qX1uGwU9bakiIVIpSzIIOu0Ozs9PcXrvBAeHI9Y8y+k1VpQMJerkLdpiNkrv+N58MS7rjERNitv4cHKCw9Exyg8F1kihziS+JvGSOGE7uDxHMZ1qPVAkiG+OyKax+wPWKMJEzDi0UYNVQRCMeqt9w/X9k6wbIjA165Ihxl68ZZOZMseo18EYFhMxVnx3hXS2xPXrS7x88gSbq79h1wXZHh1KFkzlKlnp0D9P0mucd+lRZHvAD4+/x+Off0Lru3OkwxZuZE4e5WRoWk/5d67eJNu1LgwTfjQ+p9uZPjb1ya6i+7sqBsxuJ2tSsBtbRU/e1gS47RGGRFWTLgoyLJWyUORCI0c1NqWTQFzCmRzRYYzjgwcYfXOCRz8+wuWvz/H26W/468VrLK9TxIkC6fWmIB3f3RGPBmwj4z5vAtTqc1acKh8tyQhQpgzZorkGv8qRk5UjtWgy5+sT0ejL/+v0BCGx7pAGdKff5b1MPyuzx7XeRabyBOPQz6gBLwFzrJLEllDOrX4ncRR53yBhrW402UCa3SILE5AkA7tsw4FEKcbcAqgkAlDqmMWKE37L9JiSHgUC/FtkvTp12DDKkpLP223FxBGC+M0gxv7RkPF/ZFJlG1g5IxWtvu5LplS+0tWZDaZiEVfP7dSr8V4TI1XeCbekrrno3xfm+h4RcFkA/xzSZjWJ8M79H54n6KwZtSfJwqckmYbWv+AkO0bqj1V+buAnD/5ZL3kmZ5AfMIav5mdGrGOcT5rZPkcwXOReO+/T46xRPw5rfAye8YNUx4l543zs+AvUPQLgwTuNK8uQHMDdkv+2jYu31XuTXS6DDv+Q991lDwXmgDxCoyL4A4QmhjIn9Ji5B8TqS6CNhoQDMqnL5TwHWUaFHetEkp0EApWm16QXwpq1lswKacLIfSafR363DNNVgqANnyzL8A8AAAD//5xd2W4jRRQ9VWW7vSReFGeZhRESA1IQ4oEHJB554AP4YsQXBHhBmhmijJjJaAhZyGKn10L33rrVZcczQpRk+cF2u7u6a7nnnnvORhvA+GdWELC0M6N3ZCMTGl2YqtvTnzj30UPyiTWBnlkXwTbQaR3Mw4ortRbkTnN2JZhOb4oPIoGp76RQShKFxaZpaSDheIPRINTA1CvXp777/XAzqFMl0+/QGw5DIN7lDC/VeVXKoEj8LKHCf53UgmF1wu4ENoOUBNQMOKQ3OhUnZM0CF6ikBB4UbS1NHW4oZZQiaZoolJMuDj57jN/7v3IkS/0RUWNVMu54nJ6e4PjlCxx++0SAkHB+TONxylQwOL+44M3OmIOsJlB8Hg40uVjLXvB+mGF7B3j+1ef45ecprm4vQ6CWMQXd5ktmANy/P4Gd77M6vfE2BIUPUUtsmMg2tSZS0TRGEascs72F7v4nyPY/RTWZo759y9kpvxaI+dBHlCUiAOCGfFvrjGPNjhca+uXVFWZFznXJRtURk8ZiiqTurxmdrmOBu529Hbx7TwDAOSazM3R6fa5rc6QCZEUvg7udani4ztkxO8AFBgyNy0iZykXRkwJ2EucjpsbNzS1T+SlgL8hS7u6O332tdGwpH+l1xOmCx0bteRNLjRZMAv+s0p1rWZS3pn2m5xGFlQL/6WzMWX2io9L7cHvA7zYsIGRrxvOFk82ZU/u9BFi0Xseo54xa68MfygiMqkJYJlOzEE/IXGQDyRKzen7pWeWZxvItCRcuFrhY5ri8WbD1nG8cB/4k3Fdwptdha5RhaASckeCfslc1Azr1kiZ/Cv6pvrzk39zlFdfwc21/COg3xW9WMxtYXcTjuFImgLcra7xPPlcGQZpBrKoiPv+V6cFMn6A3PcBs/xGy6RwDruWfoTuewGRjLEYz1DbDtekyYNBUpLYLLIilUC1QMhuiZIvS4r5kbQt6jghIJCCIwCPOilN9PS22yyVTRrk2lahy1nOQT/3Fd5Q2zaRxkg0x2R5hQuJv0wl2d3eZ5bK3t4ft6TYGWyOmLfdGQxZV4rkXFZaliI1RTaZnDRKxzIGWyGgON9QHmQSENBHkJX0W2XhrIJTS/OMIX7Fta0vfJCOhLisOWebgSN/lPkdz9RfevjrC8dFPuHj3CsXiH1i/RB8lbGUk4KcgnCirNIc1waYxmHjb9Hz56G7l/9MmS92HwQsG6+omZIbCGqrhb/xZw/2r/dQYDcoSO4j/0SJoYdaPEs7DaLYxBD3qSGEkOO81osFRkX6PCRtMTjp41EuP6krsO8miEWEzW3mtG3fIvIilMRsJSCzIEmtDo2fWgiDer16xX+8BWhNr2URTsoLG2e7OHI8fH2A+n2M+nzE9OC+WrAFDa+HtrbCp6NWULWDHIm4fXaYsB1XT2S6ePn2G5Q15g1/Ib8N9qhJOEAEpRNnOF5fwb+7gCXDwPdhH++iPR2iyTvTVrhNtHpPU0mk2Se8RqL4bkvHuspORODL1Oh3WTJhSBvD8GuXf1zg/PsHdyZ/Iz8649IIYhSzaGfSIfMhSKkgZqecfuHqm/WfA4Xdf4Osff0D/8BnuBxZLW/EzKyK6jViQabCiAqg6zq2LQUza1hkAuh9LA36siZSxCK+quBN4Quy2IL6mIMB/bRXvWx2/FHCjrLYpW9E+nmuMjEne+xKYQwG3bZDtdDCePsWj5wf48vtvcPryNV7/9gfeHB3j7MUp9/nYdNnhw24Yw9HGMXnOY78/+LZYfCprRzUZYhGSUceKOiRjRLemT9+/qRjkUMZrGfbNRAWhdbrmTHLL2MgDe0NKNhzyAGDQfobp28QGtloiZZkZJXuTSty9jAqhhuuyAVik+aACBk7OvRuEvxmMqTtRMDKvl3zupJpP10oBJ3ECqcyPPu/R/mVrADvswmUu1NjbKPi4/ow1vhWtM4lvvLb1ADUv20B707s3bXmKt+bB7O/D3GDUIWZNlN2ZVfH0TVaWaaN9I1HdJastmXEpre6u6FloEqRmloCA2wXHH23pN91DdcmojbCa6bis0RbKwNdBtLSEQCj2bbwjzAQ5p9SisBeEt9UxbgXUXLMZjCURFMuGbLgPDmsaJ6pwfKr0r7aDmm1P+zg9fjonMLO7lHiYWOCsqxWYRkVTRHBDEtfyO7oGTegysMFCiE0EBNYfgPV5ToE1ZcTzfSmLqE2iZQmRvZqUR3jv8S8AAAD//3xdW08bRxQ+u7YXbBzAQENCQFGjpImivvSi9rV97v+uVKlvqZpWipQ0iqBcAoYYY+9lpvq+c2Z2bEgt8WAJsHd3dvac73yXbvinmZklhf8fzCKY955cJHwIHfIT2pizD19GRlJthxor1aQj0sU4t5NthgUhJYAUlBD1kMoIjIaCHSi6Q9JXQGUCyG8FvQYnH81TjDK0SaFL3PwJKBi6jwWbsgqCHCF8lylyYa3JJtDhFOHvGl0jUC1aswhnk/1Fsy4xMIDGMnWrEwmAACcOzi08LPmdffg7RXpIZHSupeokRa+yIAr9jq6RWe1INd/a35XN3ZFcXV1YHEdmG7kWmRyWiZO/Xr+Sr3/4SY11wuQq19goKhOzHnPez47PpD/clw4MsAzwjDn66WLFBruyqnTAvsjzl0/li70DmV2Mxc0vaOICN3VovtzsTE7evJKDl99ZcZmZxVl7/j43yQsUHO/bQkeW2bP2cANVk8Xd5o4MH30p1eaezD++kw6o3808luM+abxw/IgSvAYIMK+oze/iMzHNbrxcj8eycW/IX/R2Lnn+gvM+N8ec+kzvS57TjeFADh49lLdvj+T92/ec5IP6T0ob1QNdTr+RFS+2NnFdCgO7YNCHRu16PKH52uXlpdxMrqnlr8sZ7wXk86tJnxrurIT5s9NRIWJLHCjbfABrY96lp4bTNeoq4A904l/r92W1pykGcKEeDFY55ce9l6sDHp/EeU+lD5B9MGGgUsMIsmoAYpAhoaHPsWb3uTZ5Xl12cwMACGZFH5Bcpym+ZwWVkmXLecnrdDOt5GoypV/C1dVExpefaN44KRs1FtOYfUbMAEhBukVO2UchfeS+l5VMorGiM5bETKq5+gPBXK0K0ZL0NzanX1Etd5zoR1qmThk7VowlcwM7lmD6F8rDPGn4zXQO8gvMA7M80r2hx0ee/ebOthTru7Ky+1SywZasboykO9igSV+1OpQp5C649jOAMI60a8hgqhoPJo0ixLFW8xvulZioQvbhp9c8SNKQ8YHQ9LvGboiGxmQAApoKerZK8sEKTUEHfXIm5eDxE1lfX+fPaGdb9vb3SZ/k5KfX1aYqN3phPWd0Eam9FqmFyROKmJ4ZawKYCIkVAD+UTucowdDuKm09M5OjOTYOzoUCyYr8rP3N8L4107L9jikolilcNSwoe2DPjM9kevxOjv78Xf7541dxVx8kdxPpi6PJH5qozJpRXiffGOPDAIAk4buduudttFy679+1x8W/0VcTFP1Z4gAd1lEWjtEtUr8Xts/bWffhlcn/07bvesWGI+hWY/O99BlmuGeiBO4HmNBhT8QEuQzsG8NrmjDB8qHRFLLKwt4eyu3at6CayCJotnjUi8e7/JQug8Y/zzihf/HsK3nw8KGMdjZp2oV1D1D74+kxpVnnpx8JnAE4bWoXz3FLRdf3oUYNtQ3uOdQsk8tPrDdG6/fk/vZIpodj7lWdCF1Iu2a8SB/gr6tJGa1OTmVa51JgGLF3X9Y2h9JBZCYK7l7OJtT7ZMpI74lufM/mCYMHAgCFrHV7UkC6UDXSmZWyVpUyPzqS6vBQzt+8k+bkXNYqR0PLzGlMpOFdkal0F+CxyDVRQ7waU9iuyItvn8iPv/wsg+ePZdJHJr3jZJzmrlkTkSP6XdxqZm4LplI9rogsNQcuAmUa8alUZRpq1ToA6q7o87Whv5WnXSyjKJOaNL2On3spoOl1Imu098ZAhuAVxPXvgwujGkND8tcgvnelI5ObmfSGhRRrW/Js/748+/4bOX/zrxy+fi9///ZKzqFvPzmlRwCbYKdyspRRlFlKxPJZu/XyGijYWfKUciYpwdOnsGhZb89SbwuAO7fXTPmK7CeRHNb+kma2KzAwdz6y4BjFDfAfzRk05RikleqhwSg8TFCpyc5o1q0Go7qv4rFhc8i4CgAIDvKO7rWVlxoNKnfnRqUIwCU6BZ+tnDN0nMzh0wL/w3sD6e9vyfDBlhQjyJJyKWE2ThPAu5tol2zc2rB2otP6wu8l3hO3jNCtIV5eS2m8ZZSTJD1Fur4/VxdzkNdd/LzlNRwk08HAPUgbItO4TmIvWX85xpSL3U+QWIcmXu8vBXgAfCBOUfsjR106asrKHO/jcQfZs91P8HsIOf0hVY2+bXXTgnXW2GrfmLA10+P0SxVX3gIV+F9Kx4csd3WhP9TPBfCn3nRk9iYSgNAnpixvNZM3CZBp/gGihn4xnhPc15SKh/OHfTccq7EQbP3gmqDeh6Q4ysKNNZ9eD9beyQt/F/wJCkQr3pR8r0wNnC8Mii12O8/lPwAAAP//bF1ZbxtVGD1zZ2zHW+x0SZOS0oKE4AWohMQr6gt/HgmBEIFWbQOFpK1InKVexzNz0fmW8SSp+9K6jceduct3v7Nlrq26SZ3wwSx1VtjQITgoeLiov9TKFn6aSAS9Uc1owFWxQo9aIdLnebgmvc+0V9T167V1fmRG6VcKGg0q5mIikhiS6rQNmNnDMl+K1lWk7Uitux2k0BU3ZxaT2fVNoNlQkOYEkto4IlGIUhaOLR6wubS1MzukR6X7bGalfudUdRzejdKJxez8tmVlfmTiJtqlp9YlqdTEUGq10qI4MpVK6EMzLaPh+tI1NVoN3D2TvgpFZS6T7gsQ5Rky03xwb4QnX3yG3/6+QLKiviogs42510mFKk3C+csXf2A6u8JgZx9T5kknikKnthptpZlEfv15+BwPDz7RTaPuHCeCcsXYtLCC6LCXy7XkFx8c7Imr9+vDl8iSS6GCZ52AyKi45Skmf/2OB2dn6OwPMS/US4GbdKhu26I1Jb2ubeVmcg1NtQoqGhOgkGB+FkYJssEAnf1P0T/4CuevDxEwQ9tK8apBrfLlk2Sw87LE6axA34zriFZTb5ZPhih2czkMxcT68ZYS4ZntfJ9ZuIwmo1/AaN3G3p1tzGg+dznF2zcnolke3buLPqk77YhWDBKJVorUxOhCZYn5bIbz8ytBa/OLOYrZQs1c5NCS6zODZgtH1xsZHchZMIKKii5ZDwmKXKkLrkTyMQ6ou43uIEXGqL5uH72eGvlRfycNg7hBWtJUo6hqipIhrt12t0biZLMOLRkwGjEVJbKQCxUPfYrWVlL08zp0rBfFd6srMoHVusKqpMa2kli+ycUVZos5TicXmM5nmE4XKGSDs0xs6lXpg1DCEgJK0XVGayByIZ7O1jJHpCDPV1KUS0Zqo7Hl20hVH6wg8yWzuQ4rtFzbH4zVoFpeR3vTuhAW7DNG82VX13OiLEUImDGRRNyUFbEPvTvIemP0d8bI+kPsHBwg9IZobw+RdcfI2rtYxwyLSuwesCoiqukaV4sPYnhYrufIKdFaV9IQoueDsKXoAr2YIhZMdpjLPenSoXixUudqbsZr1eZxvSbLRBu5aoCzPborkpUHjx9ieHcbu3u7kr2/IwhpR4wthQrdyuoIGqJDdOj3hAKZY0bp83GjBUoUHxJdS9tCQFCm2BY8Mon3jqY61J7qywtdO/RalFaVpPbsKpmDLTE0jFjl6vLLucj/u/zifpAmYvzKZ9hhtvtyiauTI7w7+gXHz3/C+9e/oh2nSKO762cwUUqtra2sGOWfO4LyV9DMirReURptLRtfIk7Wn22pFjuahpJMKZGXrDfU8sLGjaP9LoWISUMLacZw1161BKG5jylky+9C/5DEipYqKtMp+QiSFDylxgz5aomLoYOCcxryLFF+caNZ9kZXHUFIBoA3XeLthoibmsZY++HW1ysae0Jzf3Cmxc1GQLh1HIqN1gzMjwGYlSVml5fWCIxAAAAgAElEQVQIR6/w77u3GAy6oleVqLr5FPPpB2HHkGnlCQ6b6Fn9ss3Gn28oZNPxWRGlOfnnjZiQ3RmP0e2m2N0d4XRCHedSPoP7y9oZgY6yS8yyvpEVBZKzM+RsBl9MsPVoD8ODPayYkNTqYC0ado1VJNWfTDQyf5JOJkVtu6U1BL0V+LseD1DLHOv/zoCzS8zfn+Dq6AWy+QKdfIWO+LQoy6U2oAVqVsn1J9C8wwHqYx/kUJ+nFao+8O2zp/ju2Q8YffkIs60UecglOi0xJ0JBlStrnQWfXcGSOsr6tgq6x/qSBXo9rG/H/QkVVgpr/ffq1i6LjIkuotY6NgLbLZqU2tyNSX2IU1likNokNjTOPkeknnOUTSQfNr4kVcTaw4xXdDM4aUircbPuf4U48POSS4n1K1BSmjEOuP/9E9x/+hhPfvwa718e4/jnV3h3+BeOn7/CcrJEl80c0TFnGsvLhk7YGIa54VyzHeNj35tOLilV7w8FEDZ5dzquN8dKk2HZ57b5N7f8JnxiANlN5mZiC4NokwoZh3DktgS6/uwsH90IQXq/zRek/kTWeXnjgGRMAFnbzayR+wWNUSkvYgQuuhHLrMBgf4y9bz5Hdm8LeVhLlGl/NBQ5gwA7RqpKswbCnyiCrYdm3d/TVPXhzlxILBGLNZWDCw4W6kHRPH1Srf2dou6vYLF9lTF5XNctkjv3TPPzRXJ9cZdrU8btYF6ivmu17JrjhH4UBMXkYKt+G6vVQg7AlFmwziud9R2UaVbXfESrJcJ1g9rTnLFlOv1Sxrsmt2V+cHWQLN3slqVF9PF+kokpK0aqcew+0rxBsPGn0/fJwJbIXkfPbzAAOKcEpBLwaSPPUAk3mY7qAeKNAT4DHtSdLq8MB21uyWcafd/R/I81XyRxgYxIo/i7X4GuSQoQu3EfZbMOYPp4cfk6myW8h25wqulx+r35ObwOG8+akKLfUxsa6pvE9+jDVZWMtffzpJ4vBZgIAf8zdjW9bRtB9JEUJdKi7fg7SVs4aBH4kB7bQw/ND+ih/7i99phTAaOG3QJua8duZEeRKIlfW8zMzu5SdpAQCCJDBEktl8uZeW/e49lMVYEkUKqXioixg+x/IPeYWKEGomPS52yY9QZBBfrchGDFwZYDBU38dUEO6Q+s/BjFAZJrLVksvUutVkIlR6bsGuMmOB2Xe0RsW0FIT9Hv6eZpQUOOK6iNOhlETeN6/TkQhiQLja0Qizejv4lqK6MVM7auIPsQKnYkQk8Li1PSZ2Yrwq30gKlSZkhPU3XZmNsARNRsYEVp1KsSNjDTc7M6pEOtZcFNN0jMaoXdLw8RZQMYoqB1XSBKxmIEtFzhbnqHP05/x3c/HLgeOeeFbbUDiJJ7N5lwsnVwVLC7l0M34L2hNYl2/UGEqmTAyatv8dsvv2K1vObfQurPi2iOsp5iev0XypsrDInWnKeMuJpuPRx8uPn7+/A77hm1nsawSAUXp2kebG1j/NUJxs9fojy7RYUZiyKayON1iVJ1aJy7DvPKMA38SSaLX9QkqMoZPkzuUQx24d5QH7lOXSSRDbA53sD+7g6qssLk+taNFdnGEfpEVHoKAgl1YpS2rnF/f8/oLfX0d8sG8arlXrfI+fG31g/f2xryC70WtXV9jjnposSuW3GyTZQjUenPxI6PkvIhUOzm1JHQ8z3VKrJzwNB+/FjFUHxbj1Ff9Vhdi+29iEXl1gxaSWJIkZd8vTcKdGaFxlBhiir0A5Rlxeg8Jf3v3s/4MyX/JVkOxikn7uJkkmGYDQNNhIhp/9QKQ2wHekXPFxVXWWU8qcgogoD6EquaxrILOpfSrScRUUA5ji1rh8fcof+xIBj6fMlMkuTVdvW2NoFThL8hrRSC0jdzZFs72Do4QL59iO3DY0T5JtJiCzHR5TfGWCHGsjOYdQnqBdnQGYvm21YmsoebTkWocF6zcnw5mzPLgmj9tF9s0UQqAhDqEhspGHbLFTMmRoMU45x68gfY3tnDZlFgZ3cXT4+OGN3f299HsTVGlA2Zpk0aEEma8L2gJH/RWMcKtrdpOQUOxzHs/WP2KwssyYg1AXVPbXRYrCiCmje6oIfX8EiC6NYmJlzptsiLsWJKGr8So4tt/TpRdGYdDCOoFSW7mM8xIgGicoHywwSXF6f49+wNrv98g3Z2jQxzpEbTTo/gSwnAizIquyOyd37IIpX2HRAk0yxAaARp5CSYkpAm4f/JI39IvsGEivnUxqq0S6bZmXUkX/frXPVKk7PHkP3OFgvZP5gdPoz1r1U7yoH8SleE1us21uouDjI+39oQOwFBGQl5Lxj3bIXUe47tbYDtHVj80dw5Q2TShPt8bPv0Hr1jG4+667mu3k0wwIR7jykAI4V7ssVjm8imLxiLXmLlEcKe7KSd81RovDg/w939hF1ldkZjBiJkzU74TUXJf7+0YZ8JHSM2YC8xosIaOixWJTKije7voNjbA8abMMMRu3lUEc0ng6284GIAFZsTEuHsIgxpbVwuEM1mKK9vsPznCuXVFeLpe+TVHKNObPPY4aVtHyT4iXn8b6Za+0Vffrep+eOPP7/G9z+9RvHsGWYpsEhWMIMUJmrwWduaxeFysXCtoIm1WlPRZg3wCSCq2rrHEvDxZGfbf/x8oeMtqlKsrkORts4jiY5ObO+dqpon9j0oCKqPT8X/PbLK+L53V1X66V+aZaIczgWaiNuxCLKmeHFJq3+WYHC8gecH3+DFyUvU/81xdX6Jt+eXuDy9wO3fb3F3M0FctcjJjpGtBOWBHEWuG6+3KeU/TCEjdYQw/hofj8T6a9AnwjW3xZ+zs0PYTdg1KBT4wK7Z776GBCv7RYtFNPfzEUqKnzdHqPMOT754isNXxyi+PkRTxKhHHSdM5Aaw7HyBkHu6A5eIyDoZwHrFGxWPZM0wAeTob/qOABqNSeqgDUCTXxZkW9OoAMQ2kN1qIgFlw3ZsFZNb30JWACHvzAZtRXSc8pqeRlncR+MR9LkrGi36bHJt2gqd2zbospTnTvM2SlrZIcBS9ul5EA0A70EfnovbPklXgOd76nNHyhk5tuo/e+66XVGD2KapS7QVGNXjU0JM10FtfJpHAnA2fekod8VEinEpoXYt5IGjQJjjynGs9hwDad5K360ta9es7gFs/ccxvTDMqYBBrF7ex16bOvHxuVjQ3bMEiKlF7wYaK7pWjbXDe073iGIHBqCtpgkXJFphYqjVfV03+B8AAP//pF1ZTxtXFP5m8XhnbCCQljQkSlsh9aUvfWml/v/HquoiNanyQAvFLCHYeDy2Z6b6zjl3fG0MqdSJFNkGbM927z3f+ZY1wYpDSUJzSvQNB9xWVqvXfcf+Ovu+WOUu6iC7MhkkpYLdXD7f1Mr429rnVqZ3dRe7HRuNoYhrSoQ7Ae4CkEhBo7KsXzjVOsK2sX/306l3EZWChjlTiMBcXlHTPkLpmMoNYW6WslA1kzYHJPg6M/69uwlEZhA3V2i1rRBdDmW+yJHENgCI5KGQBSN/r9fryn7kxtLYtrHookZxPx0g/fwQey8PcfnbX9qNdpO0oWKaWlzg7a8/44fvf0RmC1YZQCWqRI8dXS05CN5cXSEd9BC60+jYAEGwFo3iUDT+rNkGTk6+xvHrY7y7OxX0dpZNBTWeB0tk9x+Rjc7RfzVHRTO7QJeLVfW05j8y76Ft4LJEqBYK9GgnqVJ6NSeCforw4Bjx7pEQ/fpSIm6SRNd1X8ypZWG6KAO0AwWI8myKu4+36O0PrdMVbsxK+lxYLKS60u6+1ZRzuL9fSDf2/OIC99c3GDFvuZ+KMVpsEWRStEnBupSJhAABwZ44aKh8xTr6QvezosctSovAdRhdQRVLh5GDT7NBtLaLdqehHa4OC76mTVxK4xczF4vmlAmuodejHKHKupn1gFVJEQisg0JSlkROzBHWgIyODUQvm1oYBBVuZ5omR2T2dpLhcnIvGn5KHAgAaNdG7x92+wlqxa1Yxh2hjQsndSkXxLIKkOWVOPLLMVtot58dAJqL0rmfAFa1sYhwvXu3betuKSunRGRLjmBtoV+uF0sOSOD4ykJfDEZD8UYfHLxGq/8M3Wd7SIa76D8/QtDuIup1EbZSFI0eZstK7nPqJalPJvBBxsNsNkZxz9ijOeZ0QM/VoJQdunw8UXup5QLTfKF+JfkCrUYDfYv5ye5yxI0eoqQt1wM7+qIHbLdE70w3/uF+inS4I68Pd4deHE9Za305b5Eumc1Nj26gEEwnqKwg44868GhNrqPFvwNN/Pvdd10m2MKuHM0KNT9XTUblWrBSnIR8BxDX+niPJuccfOW7F0rRJwNpMclQcpE2z3B3fYGz07e4PHuHi/c/IR//AxRjMfmLJJEgsCVzKKBaaGFb7HI2pANXmGwK6CSROU8XSKJIKJOdwQ52Dw7RHu5g9/kBwpam15D+SwBqms9wc32N25sPmIyucXl+oU7zy0XdcasZe1CJ1mb2uVLGVYZSF9V2yOvngR5s/ltYDrHoZ6GmWYk8WqdZV2ahF9qxLsRJXwFkFcZo0araQmUqOIaEO9eFBay6d3Z+GU7SUD1hHPfYFhqf5v9sXlN7dRwNaMm5/qDRJ2nFpu0PPD8BvwsJV2xs+Tpujuf/ZHMtRyNcAxjFTXRbbQMgoXTnT2AXMVTWxbltOh6jyCaYkLUwSFEMUjR299H87AXKTg9xO8GsWqKT7ugYynhONikm9yhvPiA7P8fy5iPyi5F48oTzHEnAaDWuc9RDovIAiU0gaaXLX71WBOYzwLmvKGthVLLXxavvvkX/y2NklGvy+qmWIlmII7sqwnKFygAmD1utCeHywk16yphZMuO25Xb7W6fTlbUVARyJRqPkzFI+JDnGmX/NF+b9FJsp9OqKpHmZGGx5GegLMbq2CK+6mVbWxmjwaOKx10WuCxIHDElMV6P2peKYEBkNh6Z4lcnZyoXehcmzFMneHo7epDhafIOTywluz65w+vsfuHz/N85++RPTq1tUkxIdzv+FMyRcJQg8BZOF1cN7AlukNE8rzR/f/ut9vmkmWTeaPsE+KcKVhIiPM/EeaWDSLBANetj76gUOTr5A+vIQZSdG1A4Q9hIBscdkGAsIUz66h2wAsj5ImnFdNLNzzmQBjWsL1mVqD+op/71MMhJFDz4t9AyDK8uNh7BKvX3fkoDhmoP0xOHa0fma+F3ywKtP6u4+fdDEIiSRIl7rL30t9vwBpOkZhjVQsbRahfcXa51uty9rOb8wdy75vD/I+naR7nNrmvK4ue8gkkAEde3nCm63CYXezDAVjIuU0feIOSaZP5ycXPPVjQV6bnQf+VHOiZ+u+b53XC3FtoaoK779Y+/70PF9tOlH6r823pzPgvy+V0PzsQNT3Plk8U9QhT/jvso5tAaw1olaF7v1zjbPB/W00310MY9MCwijEP8CAAD//6Rd224bVRRdc7WdcS51mhshiSgUKhDiAcF/8I9I8BHAMy88FFRBqiJS2tKmdVInHntsz3gO2nuffeZ4UsRtXqI4ju3xue2199prxc2TItdXof0XnBAw0g8h4jINlYQyR0Q7VxsVrhRY4K83oBZyKrigXySBdno+UzyC2oofJM5OQ5VChTpaOUVG9Z3UbA9bTngKiJHTLailolet7lyBtSQsrZUSvZ6xXwy9rvbBhNaPUxdP4NG7lPJrbPW/tKI/KhBorBesIVE2m91zVVFTO1aA0DVICV9sIHhimYaaTANMfydaFKm90qIQkUWpxCpVmag0vEjZmi5m31l/kyHK86KskW73sH20ixenT1kZ1G1pdZMzJYrar6cPkF8OEXY3BKjo8ywtT+jDCzx5/DuOTo7RjaSfWYLQmwuOLfCiRJRXDbC9u4Xj907w8P73iOIMnUQUxMuqYNrys5/v4+DDz5CSEmsYO+Ev0xL10UtxREPFa72/F/wuLb9UKm7APIqxsXuEzv4dpOu3YUakcFs6ROgfLKGd+3QP+QLI5xWyboxOLIAkvxqx4n6W9Dkolj52w20JftDNSQArMFX1Kty+PWAAvyinmOQ5rl8NUc0KVJNMbDhLoXipeJ8o9EulMewY148VWiTGoluhNpDVnGSgOavZaAZ6acptOZzl7oXMMiBWAoF+WY9WZCc01iqzw5sPzcFIs8Fe9tltOoHPxgi8XmSK3yKXCBG6cyTqyEmI2dKwaN94MsPVeMYtEVfjKS6vJ5guSgbsobVN0VwDraM0SjBeVOj0Mph6xj249FxmTJA3fbVEQRX+uVjKzBeND79WILVCG8Em+MzNg8OfUqH3WGiBjv93pfkrx4ZGRFTOE5RBjPW9fWySHd/OLrpb+9g5uAfT2UC01mdF5QVRAIOIvb1JZXk8rjCjTHpR8j2Mr0cSZBDgJ0r/6BIRHbpU2aIe/2LKrTo175vUAVmytzr123fSAFkWS+UkTBHcoj79t5F0N5i+v7m1jq3BAP3NDWxsbbJ7R0Bc9lgCiTlXuBtqLc+BWuY493Ia+TbZDigQgcpltbC03VV6Yjuq5OSml/l236kR7yuBsmKbh0B6Zxksuv3fWODQMLtY6JLZGDLatIZJw4AYD6R3QOvMzKYYv77ExR/PWdF9+OQ3jF+fYzx6iaq4BOpLdCMS0alA8hUN9bXpIhcdbQnaaE5GpLFiFcsLAv8xcHL8Fu7e/QCffPo5g//Dk3ewtbeHzqDPaI/OGz7PAmFEUHZ/xvvBBV4/eYbHD07x3Tff4oefflwJgP7+WqlJrySqbFGQ2Ruk8UGaLAfbO8jiDm6tZejHPaRBl1vGtDp5MRxyMnJm9TKuiymK5QJTTOzcr0TwrPW5Im/NtUffVRa9M+S/Agq0KmD/6lrpO5AffjLb3UPLgs3nSbbvu32p9hBrnizFe9xYKmte1Ox0UduqWO3FF3/1Wnxe0bwjgEyN9eMxz+v5qwvMs5eYnF8gHuwgHawjpf720Qg1VStn4pd+fnbGSYDqYoRkUaLP554wNq1lhLu3pe3xD98wRn6rlF41GmE59e6nVZznOb768mt80U9w9NE9JL0UqakxnVwh7FnbShfI3pSs88c2sIG2MgBgYw6t3il4X1qQrgGCVNlE4Ty0vwdWtTxby4jLbiv89mcUrrw/JcaXXvCul4qpLV0BbLV6qJW8dlVRL7oHAk4a3FMBai3LUBQTactjpyEBV1VUYxLmCIkJS+wFss3rdnF4fAdHHx+jviowPDtH/nyEp788wotHZxiePUWeV9weSKEX6QdErbHzuiDc1R6N/7M+V8byHyQBQu+81etN/9MuhPFajQT4s9sE6UukQHJrDYf33kf/cBuDdw/Q211HSfSWNGDxVm77rUUfwwSr79UWhROGcC2OaRYUCnCtmdWmQFn7sIOWiF7s2YUz/ZxBYIOX1FEC0HYDBYehay/wAacPRGE11lTkjuaOL4DeLvA2PfIVt+zSmUSC0pIEi92+Svt/YpXtSYONASozX+SzCdit+X+Igq8acO59auNo9ZTMogp4bV2tYlvNh21D1zjTscaV7W0LpuqQxnuq/YwUJAb2XlT9PnCaAUsnWKmvqePBCvkkRpnEDl85RgILFIqCvjgd0LhI4YnnqFeFV+V+ZYzTRZ9N173iRAHyYhPuMw58vTp+nMbWMke63TU3j3wGkc4hfVzfW3TyBL9DRQ6JuU90bAB/AgAA//+MXcluHFUUPTX3UG67PWAIIQRICIIgI4sdIBaREKts+Rf+gS3fA1vWbJAQCkNM7HbH7XZXj1XvoTtVV3cMojaObMd2Vb3pnnuGuOlKbwOsHjxVqZ26zUFCOn7ad5g2mMSvLGZGX2edRbVEEiTczZbcxlDdfktFW4XiYcwBow4zRZcQWi9bLGtRGJQI65vjl67dHrtZzmKP1sZ/3Hkg48JUv07mFEbVMOMF/Ui/gxfeUrqFTosu3hxM67sdAaEDKWnEe6waDIPms2s6Ntrz5fiecE3tsU5votrZLI35b7EBzF1hJ7FwiWpFWQ+U6jGkFO0mgyEEOGQt3hzyOwc4fO8N4EeIsZkXoyOaKEldoHqMR+d49usveHT6OZtoETLPA82L7pOKT/JlGF4M2LU4y3a4KPMN/WRg8Vt0mCFX54C6lsJ26PaBT05P8NOPP2A+HHAX21UzJNQBXBZYnf+OeHyJ4OCQTcwC0kLXD/sWmr9qvesFYksOFaqRjRV6ZifAjHnqPuR99O9/hGL/HiajP9llmTtZ24izfiSt9fW8RBV0uUMTuhUSioGbzzAaXKDdbiFOJCJRZDTr9x3q6VEOEKGYomUlerstvPXmEUZDibHkWL5ihKTVhZ9vFqQEALQCMfPwi6VQDENJB4hZ45WgnSbIO20kGcXySOpAh+IP45gnfqxyl0jddjnfPJJ/07wMWC/quUgnypEhmTxXnJqPxFLo8eYSyPykDY8RTpr/XrLoScJB2u+YDzb0PDIuaOkpkwHkeFbg/HKI8fUEg+EIq5K8PUouJikVgeV6UaYmgms5UElxW5St4ENcF0OJ4XNgEGXKplzqAdFE2Lfepx3WWVP6ynfcfrGzsEW5UNfIImS80PmZ4cDGIxEX/Wm3h+7uIXpHd9ml/87DD+GzHXR2D7GMW6jCNuarABPW55eYzSfMMJlRysCykoQHAjO44F9wR7+cF1zExkEFV4zYS4E0nzQHqF4n0I/kHeSxQrRlWtPovZMjf7+/h7zXQ57n2Nvvo39wjLTd4Vxyki5FaSKeGRqDxoDK0tWOziZ5Mi1p4DcnpCHREmdq42dtmlN3x9godbW5ljY0ehIVJVnMtHG2koznBTECKKoMTKkDdrp5vVFzrm/NIqhYnkNRDSUxJKY3cLMbTKYj3AzPcfniOa4HZyiu/kYxvsB4NAScMCnYzM+v9fvSRArZmIwLAlb+i7bWM63So83uWCWySrwBCEtLOsCDT0/w2ddP8P7jE7z9wWO0evtIWrtAO5fVyS/EQNNAbKKrpB1eh3ZdiWMCEm4KnDx+huHlSwYAYAZxjUhIA33t0MSHFKKAZhmK+VwNQEWa0slaONw/wLuPHuLR6Qn2j49w9Pox8ryDfr6DDu0XBDTPKmTzkBFPShShGMjJyxFmV2PcXF5hfHWN61GBs8EFzsaXOJ8MMCyHWGIpRm7qlQEYu0Pmh4Mle+hB0OqNRiFS+wNgk3ccNgDGYIteH+scMEqnMQI2D7qRmFUZddMYFIFFK6IuNVyw7pbCnrpfrx23FUGVAb1b97Lt5+2V3mo/h37HolrV4GSpbJponay3cW2bGLLK3jvkgRQf3i2wGldYTApUz88w6aTwqRwwOT1oUSKlMU7GVDS/qhJJ4Hhc05jPtDQL1L8BDQnJWvby6tX8HEtfaL7Qi1KEgBsGc4eXP1/g+2+/w5NvnuKLp18h7Cfo9fYwL6cyTl3MrvNeDfNuA/8tAaDkc1SkDadNirHQkqW5k6iu3lgYRtO3Azd3L0lOsFrWptSxarq5sRNbzLSY5IaqvQ00josO1nxmbXTwAF+fRWuWrHUrFXRw2rHkMRFFXPDTRR5YxLhbUiea/CBW4gllbuj0ORcuWcYnUQKi1S/KAp1uG2ilOOjfx/FpintffozRiwEufvuDmQHkGVD8dYGbF1OSwYuZYyXgYxIq/b+kM7EkG5VbgpwmMUBHyi2j4f9d/wUmRLh9vNVAvFfmsk7MBWmmqdiCw5TO+5UD5RqlRzF27r6G43fuoH3Uw70H99Haa6OKPcpU9OxUH6Vpm/edNBB5MR2MVpUI9uIwUUBwa0IGZvQoDQRaRYjJ4hpMNiqSQ/YtW2i9U9X1ABprnzUcQ5Wh0piMVQoQqHST6oEw+neokfb76XSqTRtJNEm4KK/qKHGuLbJsHYvXmC+xAWmVY+YfdYsNlGI5cmy1jhjtirGhFPlNuj/9Hx/aXIs2aPGmwadnOVXWdbN5xFn9VKttpcqZDNWYNlG8ZjR4ZVg3L9PyO7esv6/JXCdGADEUmJ3OwA2dPQVAtL/JDOEJKDCggs1TNW6dz8wqP2f5hN5nE4DgBgqBi9283p/o/tm/bYut0JQx2TrBTXL2pdMaVb9Wjx/z9lBWEjUY2ROuWtb1aJOJzuCLq/APAAAA//+UXcluHFUUPTX14G6n24ntjDiRQIqACCLvIRI7VogNG36An2LBgg1kxQfwCWwisglDBiUOxJ22XW2Xu7oGdO69r+p1dwiipchJPHT5vVev3rn3DLHbfCT3v/CcIG2wcmpGIt2A+YDVaqvSlMRMIIwaGn7t6f7dhDiwwY6/GyxHgdKJKNGNu41+wy1Q0XDxgB3HVhhoqfBLG4S9v6sErb4quYZIBoEL27n3uwqtqw7BDD44YYldH9MOuPkG4boUov132wWtPS8C9/utfh9/voIvu/lD1QFxnPo8hFthRIBgrVruZlzNGMKZXqgJSFsh5yKIwqhNFqCJTLmQDazTCaTSOb4ywumfx+Lez60qdlpPS8WiS/2vD37BzffvIuxe0KoZDDG739ii554/fYbxxQ9UBlCrUz4MfLOyqWBbr5UdZvMRkc1379a7eDQ9QYRMD9N1gB7X2+QAkz8eYuvqHqKNizqOa7O6Pg+uQL8ol+egtvaSsD+sE+AqxQseGDfG6F3Zw+aN20gfP0RVTRBZF2uZGqd/W8gBAUJLH5I6zcIPO5Ts4p9m4qYe8OFrVEb3YIp9/VqtjArS+xi3pFrhSuY6S2dYsNtL3dZZKoRi1N5mL9nElTyYOb/DbiyAr9/potuJMBoOhAq/0euIwWJvGGnEXaLUSB4oQlk7HsWdh+DIdNadSCN4+B+hqZw9npkUBEOLT6oFoTX3gcClSo3b5Guh2cB8HrAmMM9rAWCTaYrjoxmyYoGjlHn8J2K2lMR9BMzj5T1vvgK9rkpreOhZVFrNJihl9ZwdfjIE+KcotfBFuSSXf+Hp8cNmJn0zTneCaSvn8vENa2ypqxW4KLFatOqM4uMYVKFm8Y59RR4AACAASURBVMcbQ/SGQwzHW+gOtjC6fB3xxhZ6Fy6JaV8eD5BVMaanXaT5Aml2inMeVPJcHtZnjG4UiUIhBj7zkxMxc6IDM+VAeXqCIp9Lx58uxrEUVyKR5jBzebR7SQz4tncuy37Krj79HTY2hxiPNtEbDoSeyHuS/htytCkK5GWurC4WVVjQkgKAdiTFBCtwe1lg4F/HqjHobLZDo+4aWFbJkrIDCPilsehF1gDwDgYtYAvNO+VcDgcJ8uxUiqF5lkmXqxsljJ9GUs/R7wZSUCjmmcofzk+RpamYo50cHuP48BVePnuM9PAlJgdPUc9nWkQpUnREIc1OjHUoxd28svR156HRShvKprut+neJ0hTzq1KuKTa49+H+HXz+1RfY/+wexjffATYvAPTLka+MFYiabMARPoUS2emLrIGHvISFgaLAi98e4cdvv8P9+z/oukMbcbrqt9UcCgjuOiy801snEV+HvRvXcO+TT7G/v4+P73yEyzeuItnZphmEIU3d94QqczwDpjPgMAMWFfrnesMMmOqySdZHiGB0CdPXM6Q7V/D47+c4OBljcraLV9lrTGdHcnagPMAEILLWCtlDK5xxnjxQ4TMD/CP2/4EVdd1Sdd0YyCHcOrFyj1dla5i41n9chyKV7R5oGEO1uRi0wOTfrtP9Hkudy7ewE2on77D9SaTi0Kg48z5+43u4l8ZNaiGA79ohqEehSR+zWpz3QwMXSWlsNMewqWFGlqXXca2bgocbnbeB/9VXZLWboFKrU/ESLoFeIAEzCKbAz9//JM2EL7/5GpWx0erAGee2Y4YlUF814El1ybEUwiNjqflAgkXBvNSOV1mZUXKgZ109O2kxSLpkpV6jA1jq99RGAEpzKY6W8uDdPuYYAv78yufMrG2VJuy+1rnC+wf6hae9rsNqKSPeBy+lZqno99mDKU56AtbPgkzueUZWM88/2U4wGO3ivVsXcae4i/SvIxz+/gT5wREmT57jxbMXmPG5fJgim+vCIg6kyXconkJ6foosHcat6aKqUHnlgFWK+3+9WEB+m3Rn9afFgUoqlu/iWvZC1j8y1nzpI5EEiAddjK/tYGdngN3bexhe38bmtS0syOjqdxT809R2oPijL4zbSrw9ctuB6ClEpo5jLhe181GyNbaihXF0dGGGVYWx4tDIJkkpd+xll9xVm7FfCC0sSee8LOTM5kz4StPWu45yA3ptnfhrSzCGsYbpI6FNyUVjABhI4orKR4t6Gbxq3KG57Efh0nPayZoFm0CLVcRvvit/m76mjE0+fyi7odxGAW8kiyeyeHniK5EohCoFyM0jTvFmuLYCNArd4ceyGcM3JSTAAL7/uSX/A949oRYGtcC2nuBAJoC7Pmfm57+P4FSagUtsYNs8dx91DzEsbGPX+kawcOmaHWoMKukJJoNoTB6b/YRFI28f9OQQXJvS8G4anGTTq0Gji190TPZm7QYh/mHsWnrbqKLwd+/M2B47dhKnDaEtFa1ERSqWrEEUCYTEpgvYITb8ItjxU9jTSrBhQYVUkBoQVWmTJvFr7HledB53Zuykhdmkbt2JPY8753zne1wQ4rOJnvWRBpIP6htUH+VHB8GjrY1+pOKbmRZINhxw4nZZ5OsUrs0YBTbWUF0C/d2qWNUICF9U7tX4oFMqBpTq4vfXPkEc76I6LDqAeUtf4jU7HlENFcEqNJNRblQ1itnIt2kWcf/6Ih3MmOagNzF9YS23AKNABRfkYP+phFGmsIVieydlNohgeUHEzQ9H/BS41CCDH45W0GD633S7kvHJ6GCMg+tX8eTPCS+YNM3ekshWdK0gvrS3x7//hnvJEr1oCBMadQC1vDjy96EYr6LC0dERbt25jR2OnWiqNk/Ltz7KjG6SjmVHy1VucWV/D7fv3MXjX35lXSxT4k3ISDSyc7x48gi773+EMDbYtARai5tC8/sqVSnUOb7aqIkJGBnIqO5XJxGVmo+VUYjR1evYuXmIp4OHcLOJEribWVBTxEl8JDnzTmY53tju8nmI2MSuxHKxwOTsDHuUfcoeCtVaOWtUSkA9E9N9ndWkiQDxVszFz5LO7zxF1usxDbgKLNrhkHER1nQnutuDfsQLCzX8HM/X69aZ9jQ9JdEfUZBtnaVsdLFupChsfmX0MczIquiq2gupNy7z7BkJhqDkjx4DAZXGHvG1ooyBZZpivspxTvGESY7JdI7T8wSLJMdiuZIJGzGIqImmIoOkBjZEVIm8iB56Zeo4g5/eTxGOy1QAAM7lZ1+HiIEnXzwHqpNrIJNq06JIz4X6NLimvLcbBXXz3Zs/LwtZ6Ok6c0GMtLeDYDBGb7SDbn+E3ngPpttHZzCA7W5havv8PpdFsLnBcrVAsiqQlwbT2QJpmfK9TUwpV4kzvdPUh6CosN2JYVJJKVhVop7uUnxNv89+DTTRHw63MNoboz8c4ODaNdhOhN0rYwYGYnbAtawrJ31xdzhgEIfM+ki372qTGzH3IrNIMr1yCpRx4dIyuPHrksR+2iaIjQ+crvXeyMuEkiDISSeCIXoNfqkaXtm3BxG8cY06xxcO/W5HdP9UzCJgTSEVpGWesYFhtpjyZH92doL56TGOn/2FxekJjv/5G5OTE74njY62iK0jfuTUrBvElJulyTIySQo9n0MN7sDZ3JIgoC9Lb3JHxoGWC2CaukZsDJuhs9vDZ1/cx/1vvsLB4SEQj8l6ur7qjCZDlNBCqWKuKTepBKpyNrkT0670dIo/fvoZ33/7HX588ACLVcpgg2/+vTt++wlJWvWYZF9UyGYUxRTj8N27+PjTT/DhvQ/wzt1DxLvbdCK4wifXbENOxFXKjKJwtQQoCvL8GDieoDx6gWCWo5glcEnKrAAsM5TJSthgfOpT3N7uYj/YwyzuYbocIhntY7ZKMEkWLEujtA8CZ+dFhiUKzJFhghwTMuZkWKUdyfj/qMFr93MNupf1M5eahYJM59SkvHTegvM1+2g/w30c6YYLAjS943XA9KY2eXO7YMaoP/2U2OozLFMfm/IV7/dbo8W2a6yAHkfWljzlL3wWfmteK+w43+W72ggx0mvV/6b2JPZiWY7aM2XzqEQqNSk3GATcD1Fm+wJ49MNDBvc+//pLRLHFkmjF6s4fmAb5aAYsLbotN8DN2rQ5cBEDsK7UtVqoexAk4CmkgBNsHhqI15OP5HJayHjatKf2ttdCGn74qRuUwUmNEa9zJHssm9ztTcr1Zdv6EMtIlGn7aDuJFOYBFtW2PvUDcrwKUyJnLXPEP8tyzg1tWFmuU8jYNyWm0tsD3HjrPU6FupWWSE5nmL+c4sWTpzh9doKXT58jOUsweT6BTWldzuCygg0FyclfIgfBTDO0mh5/nf7X94SX/pjqtXd6gVZiDB1f4w0KrQKKDlXgkEVAEVn09/cw2hlifOMAO29ewe5N8tfZhtkKkZoMRVDygKEyOaIeNbwWpmP5kSVyjVJ7nuZDSukkgDQld0EZZmjVBm0PFlMzQCzLjema8jJKidxrNaQmb8mLDbqBRo8TcJVL7K2fag/6felfbDOgRStasI5HVwkMT5F1qEs59N6AvTZqhwDxXvrs49D9dc4ybAUMqGjl/VuN7FU2pmslQXHTCae1rXwGav4JkBBzRF0jKqeSa9G1+0YX2g+1dfBVdbn097JNJt/rEg2m7OsAiU3/Nv5dPoM03Jdt3lPER69vynkEYBC5tk8FaK9F9NqDjfJ++b5+8wAKH89aji5yEDZrX6P4t9iSbVBQAaT2UI8BAZWPrZs80vnTms05/AsAAP//hJ1NbxtVFIbfez3jmTj+SNSGNi0QEHQFGxb8ARZ00xWbdoHEAvHTEFs2/IJ2waI7NkhFRYpoC0kaO46dmfF8XHTOPefOddqCpchyZNnjmbkf55z3PG/C0oLUCOgO0RvBJybe/Gp2hyvnO75a7QmRXtZPf0SZV1aAl5a0vKFk2mXnMx0xPdVb9fUke/5eCgqEkso+jBEd0gpgj9/HGacqXJgkTSL4oAk/XiX1nVAsg1yk0wycglg8oNBTPOsg4VIZjn5efPLbyAmAJSG2l5RpluuNi6ces5S0aCljJz051nh4BsOuhnwM9aYKkhtWMjSNwDPeDVHUm48X98QImM7BTlIcHB3i2dM/OHGRNl72FRNVafP9z9krPH/2Oz7/8obPLFuBXWiwRBBHAgxeXuL05DXG07s9oVlLUp3vZ6VBQZUg4gCQvc3OMIcdW5afjvb30ZwuvWWNTZGaBlW5wPz4GcrXZxjO7ngp/RbopKflIu4Jisj9iCfmWNztov5BUl7A4LLuMCL//YMj7H/8GRa//cn9lBYqI0X07LeCNFVcbHgfzLJ2LqfQREU96Ms1mgkBNnY5aWLZksyGSoM+LAOCHCeoKEAfsqf+kKud9W6FriJ42xXaa3MfnSu/oKRs4TLIh3zNhjyxeN1eqhA/tlG0zIlQUAuPYbG10R7/wDvghWXA7zciaePTRpOLsyI5tiLj9T39dW0Yxsdj1bXsDkHZa7LHWlyucL5cYrXecCV5TQqJ1vSQOA58hkjJzqQrcVW2wfaSFiuyrCNCf8WS+BaVVOxb4a3zH+9dPalcawl6J7BFWRRMWPSba/Uvjq9s8DCH2iCJ/77p4YVUZSdybD6ewoymSPfuwOVTJPkubLqDmqTqSYaS2h+Q4aowbONI8k0KtsiXlXo1SenACR5eHChh2vjFgCFzfmASq4MUATvJELPdnBfp24e3kI8yhvSRz/7N924jI1r/ZMzwPrbXScABP0vQNhtWWDnKvJPCpG45AVBWDW/iePHRTZvOEypfps2E9vcIONRLr4PwvE+gCGCTx5vzpWkXqr617+12PvHAsmpZ5NSGkjeTrsPeeMQbrYSp9C0T95urCx4vm1WBs/kpcxBOXr3E+d8vMZeA/+L8BO0V2fOVoDp7Zj3UJ2+rSH7d9eGRuhJp0w/1W7capnRBNUL3Yyx3jdkg9DyS9cjkFkeffIRHP3yPrx9+A9yYoU0ytGaEzg0wZIhhKwoJ5+cFVlV41QH3gxdrsOdh41As13j6+Al+/vEn/Pr4CSd/BsJQDHMtz1PaiuH/Twm6kir5A4MPP72HR99+h/sPHuDwg/cxGI+oERSd27CEcdMUSGkM0vtJorMugfkc7csXKI5fwJwvYc6vMKSKYFUjqZn2yDA8Uk3UpuHAjV7PaOPatpivC+yZHE0yxIL2BXt7vtJESazWKwDWbYXLtsC52eDYrfFXU6CoC59yMf3JtiEIDbM6/uuhLgrMIvHWBphMbrIihhJhqQCraB5azhcM/N2q+hhlhHQhIcGe7c6GdURnjMG1I9LXsTTZYDs5865HF8szNcAWhoplCUMiI8ltfafek+bat8SKBbIodqI3GQARjFETLm8mMv7vmOP2KYSEgM65/bHFoDkXJT2cJAZo75HWFs2iw9NfHmM2nuCrh/e5ZZC6dxrpjLGsIPL2qLyJjjfYUpnPxL/fme1kJVlgafDPqpo86yFkYhfN0DWpwtVSUPL74pTna62GaiuclQS67w12XGDSPWci/cx6X8XVfvcWjhG360QtAHF/LgdOWQ817Nt8aF9JTJgGJtm+Whu2Du2YRZJaoavnCWdfWYaeDVHSekNtikQEJAUj2d5PZzg4uom7X9yDJQ/9VYHqokRxVmC9WGFx+pqfL07OUCxXWC0uUC5XXqlI3u5C0w12nzJpvvVeCmtG984kWRx3dLoeU0KM2giJ40Z98lmC6eE+sukY+7cOkN+YYf/OLWR7E6SzXThyZNodYJAnKLsC2c4EbVcxTLGpSj4XBGela873BV0fVXIId6wR9Re7/ETwO3+MXQj2w9i4pvAJwG+RgJNCdzKeBPq/X6dlXbUmMJ0oZqG2Tbq3tS3AA/Z60Bs7XEj/ulbglaHGhUV2WGu5j18DdAo+tahqueq9CapvsqhmdQUFj8FFQwL+QU/55+p+mkqy3m5VqfVYmqbpe+6NkZblJKz7EC/+fEftzGtpI+2d0OTTwmsdP7GdHyIFhL2mBICMIV9QtsFRKAblccu18y0RbwOIMstA1AGBMSAPLUAznK/wyu74ob+BfrdzlGQgm+E+wRifu6CcEAUJfaYWwvU3+SKw/OYovg2OU6LKpf2mBvtUWA/Hel1CBuBfAAAA//90XctuHFUUrH7Me+xxnDiyYwMhJEEmQggkNggJKRKLiC0rFvmAfBcgvgCJJWLBAkQIuwgcKQjHinH8Gk9P93T3vejUObenE2CkKPbImpmevq9TVacqFSds+YAa5WWO/WFwR7YB2u9iCkXDC1+SoWMPMDTTW3o9+aGMveOLJ3rh2kff0Ux0ibFLu2aal6KKSs5syQtvbnql70s5e9dbfiYa+Ut4sB8FalC0Oh5TrhGF4tAbG2iFMlnotjzLevt1wR0QbZPfeSg35EWZeGU0tQdWWZ8AcMjfdzvx0pCQAIVFOnACpJRVmnBWD4oyeSz2YkDfguXnCZ4DsuLRH0B6zCjb0UnXGL61JGXtDUaJaB1cJZUXMVlVydsvqhy9UYLxzjqGW6s43jvnWdR4YcZokdmKBRUt8duvP+DOe7uIehPApS01g0KwGoXkcXp8ijzfJrIsklyqErxKqwQwkM1qYAuTGK2Vc9mcYrz5zi52bt3EkxfPMBhNkAkbWeZYkZjBs0PMnx9gePUG4tWhxnbFBlLY5rI0Fwqbxf8ghT5uXMHtieYavCQ4CBMbpxjv3ER36xbcH6uos3PkQagbhcN1OL1oF5hs78dZhatrfd4nSnkkaukiQznN0BsMuM9JBBuLIbcEmnjgj1X14JISqfQWpUqRChueCDItskU/1nFkDsXaChM1bsXs1W43iIrcUPy7E+2PlYUk6eiRlTIyV1HirwVt1Yw9NQ1MmGrBeyySc0GenbEbYtgZ5MrpENP5gu75jCOcZxz/J2dTSvmld32WZ8jynIyvpsGZxCnqNHE23JxEtl0Bs5OM41Z6L6UfTNh9ISKDjL8ODuE6U+xi1am/s+Sy1LiKV2ZzYilUbzL5A5+ShnUN6iER+5BN7pkdH1kOv/wTg77+aIykP0I6mqA7FCn9hKZ+6fgS6oi+7yIk5wFFbBlq8YnwDrNpzRgnuugyA98zj182odn5DG4hG2OfCgD5TjqJgEAjTCYTTFZGWF9bxebVDayvr2Ht0hiXr6xiMBowrlEOJ+Jl65O0WeDzMmePrzP5W77w/ByyHIihWGq9KB05goupXZQ235/Oo5pSYS3gY20/8WnT+6bGCtF/KnHU+V83MJn/C9kn+l1NAmDMToqO72KRi2x/SBBRYBwJjohFLilGpkUGX86RnZ9hfnqE7OgpDvf3MD07xsGzP2nQVxYzlIvMYCg1NRywwLGeffnfZJipmY+11T8sYGTt80FyXRPWi+BsBIVHHJYM6zd36PcS1HmNNOoTtKkEcOsB7979GPcfPMAHn35GWpBMiU/5/XabIRrcNQ0AcLmOuHnGAjk/OsPYpzjeP8RP3/+Ib776Go/39tSdP46ago2jP7iiR7b9ewXgpN/1jevb+Pz+F7h77x7ufPiRqjTMgFNdsTuEZbpyE8sL4PQCePoXiv0DuOfHwMkp/NlUDcLkwL2oyCIS8HfKokt8p6wbAkKO5PCc5RgLg9obo/QFFTu9eMS9Qxg32VMyAcGksFpJsUjmeOamKKYOR4tci0WpU+pl2ewsUNNCHdVuMVbwmYZn9pelHaY2rm1i563ruPH2bWzsbGFr+zVsXNsmwDgaDXnIl0Utn+U4OvwbTx7/jkcPH+LRz7/gcP+A9yAU/xLN6RrWORjLaMKPmjxan79KYbjOpM2aY8kHZGXMY8jbQTW4SbeUezynxMriOLb4ebuuSOenXwIh3kZB/dJKGDfjOoC2lX3e6F+GjL71vsunwjxeyvyXCkcfzBl9MEyVHumEEZWRc2ayqWecks4sEQobqa/YsDS+FdL4IorRqkowRInpicN3X36L9St97H7yvrr0DxI1EJbXsuxzGrMRHFVpq/Quih9N3UrGEIac50srvqRI5sdnO1qlwIq0pSZxo16rW73BIaZW9iNYkaeGz1r8K4PqjPHTNByehakcTYyhtSFj62UUwIw4FCnqg1E51yAqBOp9xLMar6OnKUP0gOJc06JLAY+etay1tG4h3lnqq0WudzJ4D4gJnqgD6gULvSKov2T2yHxKYuR+zvObdPAllyMka10MtscY+i1s4jZfjwV/ob40dbHA7MUp8osZ2wfy6QzVbI7iIkM2zVBKfO/ZBZlIbeuteF4p6G/jqGwR/CLU1FJ/zef683CQcD/vDbpUr/bHQyT9Hl7f2sRAzGo3LmO4PsJwawVl1xEEl6QhgkRU58WcoAIbFa5A3FU1ZHAk6fQH1i6qfd9ClsmZB43nhc7Tyi37sAuaPi2JNznvxXFQSlv6l6VWkXqwCDZVutVWqDmmBMDAsgY4SrW+oBFzuKcy9hK9VzR/pHm5jlvfqIyWxGgbBICZsEshLsSSPhc3hSEMfGLimxiHoxVBaG2zsnaVi5qRofRoS2Ilj8SEvVQiKYCmVCnJGacdYSfXlkZMTiF4Id9RasGpkZGzhdU0bKvReNKXiuzYNebo4fpgpuux3TPfct4PsfIx1Q+VApJBbe21hUFAAVg9GVI/2ikF4b207dqiRZmQp4aPwWxeC/pXTPtCPq09AhCjoIkR1EYEcj9rtXeHqHupi9t+V813QRWCmgmywZa+FXq9DaldC5CxjA2kLZwBJm2vOXmurmr8AwAA//+MXctuG1UY/ubq2I6bukmVLBBIpZSWgpC6oKC+QFcICYHYZIF4iL4Jz8CtXVRixY4NiAdAQqlSNWmhSk1zcXwZe84c9N9mzoQUMZKVKImcmeOZc87/f7eUT8pV6gzJO7EmqoYnRtG/GM1HOp+Sm23O/bUOQ+mLcdBhKbWQNb+AYjZjPQiUIUDovw0QdWPMSdOOphBXzVTamA5yx9Z0UwGFI+y0srNjLg2HRDs8LvjAEu1S2d9bF8hohGw8qJ2d+BwDwPB/MS2YNtuaXEDXyUrPKNZXWzdGRU+Wr/ANKW6NMkYLNQKUcYm5YVCeccP8L90L6g6RZ3SRFxe6E/IY3a0h1t/YwuGTEy4ABM2IeSKhq5yXC55cHu38jtPxCL28x+gfb/oUtbIhoMvZe/IUV2+8g5V+xLQ+QqAqZkKY4YaHN7SNJhWKliPpwbCPN69fw6PffhG2RZJyF59lBvNTvHiyg7eu34L3K0Jm1FityrfRBxkTvPJoSULiqN4gcZeeN2MJpqT3W9tA7/UryAaX4RYjuLIQSUHQfbZr4HsXMY5mFNnl0E9Jcua5mKHNKTlkp5M54l7G9FpufCkOQkgG0+uD8/e1bMF0T6pvIgf+KhXdXWLaHduMyqY/idtMBe7wqkGWpCMo4hi3GRJ8PybNW8nEHqmcIkPqM44Gozx+WvgIMaZ743R6gqOTKWYz0u9PMJmO+f6lBYE27IRAMPOBnWMzyYp3srhIOodDQQV+UbBp3/h0LHR+nqwrLCTBj4v/EEU6ezREV8PMqlYmd6MhjuoYmZhZC6KbdHUUUs6fzZIX5BQ+W0GUd5CSSRt5PKxeQN5bQ746QJV1kK8O2aV/6hPWWEY+Q7kUxIfuGUL2l2w2Sn4FEWYT2aTRor88PWHJQ0UGfmnG6OlwY4hLa5e4QLl4ccgZ+4Tub25ucpE/GJB+v8dzR5rJiCzLORf6xLSYU8NNGVJGY2sorNwt5BQQmX8S1uM380PIeE5ksWXGQxUU9rFSNaENTvmpMx0qiXm9Spzobyo1KdVN9aQ4Efo+FapViX6niwvkTUFazekx3OIUKKcYHx/heHSAF8/28PLgLxz8uYfZ8QjlyQGq+Rg5uw1PuGjNOG5OmFARk+JjpTVbtJzFlVWq3w+gR4SRUh7CA1IDp0DSBW8yojZlfDl3/B8TpYt2uhHufvYxvrp3D1vX30NJjQFipGiTMip1g+SFD0Ei6IjiBCaHmP79HEcvnmN9/SIbY5bjOQ5GY/z608/48f5D7D97Wp9XeNRNbvia9jfFkmUn2198is+/3Ma1999F3l/lwolHRXPppFgrgekRcHQIv7+P0R87KJ6/RD4u0F9UyEoyh6sUfU60AWIuYb6WcICNWxl2ZPZT5Dw3A6hp1HUJCr/kPGyKoCKWkBnLkZnky2qBGUUu0vPvCzDJwKJk9b4TI702olPyGiNFEzl8X9rYwK3bH+KDOx/h6s0beO3KFQwuXwZWu5I7WzjThomMzUmU4ttJijvLJbanc4x2H+P+N9/hwfc/YPfxrjQCz6AlBIDYnBN42tXPSaRrU8y8n1TMD73IlazpGKkpMcdU6ZXlOndJM9ahEyDwKcvNnM1gKFUqkSjXqe2KHrWQfysQ/oevaYtRd95ca4aGNL/S+dGK3PUVOt5jQGuFJmFULAaJMIfnRtSM10lB8r1vswAqTV6hse5R0kTkcDwt8O3XD/BJVOLm3dsoyEXdS+FCtFVG260YiDVi2q458P4xoIV/liT1flZYgpJeQkzVhA38GpamnVccsDYtxckkqbbvhDadWo2HfznEI6BK+9aezfuGfRceJs+DmkTTHhtGm1aDNgGRMqb7n/fxRvXAVOhkCbPPYAkDTpkkChZFLNmlvbEATT4N3jGmQop8W4IdFyHvxJqIB0h9jHW3gZQkBhBZAH1PTW2KpKWmoSOdqZNCSGoF0Zubxpl8byzvUhBp+X6134dPPNJuJg8ExQ8TGtPJ+Cu9lpnDPFswvX1mvhDsj+VrzxpOLHPicUQv15pMrXGWNI0uTeYQIKR5uKPzHg6NjEtUksF1xTmS3FcdDXVe0j4kWrcxQqeCkxrMHN2n++kwI95c46PAZPIsA+HswWbplcmRM215S01E95vJa3KVGpsHG6WUGAvA7kf+GlX1MxLGzdnBpuuMnAtLPNHduxWtBPzaUb93IgyriwAAIABJREFUUIB7Nd8kYNYSAghYrtPZAslJzdBhrzmRcSdnYvFMAkHFr8SwN89saIhvf2vnI+Mteyiba0Ljd0sJCGtXYxGZPJ0Y6mGdJobZxJyR66XPxpoT9nuO+1ajQPvMePzKUg1J2yCwJQyEUYsh6E2eZTyG1K4G8A9h1/LbRhGHv521vfUjjl1CgbYUUipRVCn3liIhJJAQB/gbuHDgwoELfxQXTiBOVUHlgEQRVEJAQLQglJikrWM79np3Fv1es2PXAktRHitl7ZnZmd/jezTsQrohi0rUNo/mzOsDFSoxmqTE5Q4RZVitNMQbWF7kQcDBBWG9muewCaJQRQUBDnKXWk3i5M2rmMaqt//6Z1hG9IJNE8yd/YhaUN9PJi6+Fl8XKEsROGAEuTKKQVCvJLEu3ZycHk4szKCHFE2i2Gmkqj+wCm+hbiq08CLigZpYywcI8H77PLEYoXXIpTKXMjS4MWjjmd0LuP/Nz3C5VvyTRLt9Hpl6hE+nU+zv72Pv7KWNPC2v0PCj4yOMRiNsbZ8L4mgMAbP5Ze69D7Avqv4maKK3BVx5+QpuD4c4OZhx2TlrZux3TjZFf+/fw+74EOlwOwp4dU0k/wcGjWCydngmUHEWnUMn1Uw6exYEs+lvof/8C9g+/yKOR7/wtphF2gJOeaTxKExPC4wpaG620WnQGvLIq4L9iNNeG92sX1dOn1h7JjwXCQqpawAvm1KcJ8jSzulzKOs1Dc+ddBW8JBX6xlKnCbFX4SttLwTb9coFuHBiysc8Fg0uwiyLhOdoPC+Zqz46GWMykw7/dDrHeDLFYr5kdEueC+fJs00f6VOkyFpnmIrAHDTqz3rHQfti4ZGXS8wLj8lsjun8lIt389xr8l2jf6u1uLXacPbK+jcIYT2v/NQlNSS6cj5kubyKLXHlYhBpOHTgmj10ej04UmhtdVG1O9ztT4h/71qo0hYKQmm4FJNZycWKOXWoEukWyWFS8nNGvrVkicdQN8Kxzqmr0ETW62HnwhCDbhe9zhlsD/rYeaqPnbMdDPpbbNdIXX9T5qVDsyyEupQ0KlbiJUs5r64cy1JoRBxIp8LjrUyQqlRl9cSHoo4JtfqI7oRonBnGComCxHRP92mGY8m6kedO12dAcWpR0Ot+mIhTSct1uBPT5wCsYLs9nE5RPjzAfPwIR48f4vHBXzh88BOOD//EP4fS2S/yGTwpJRP83wFNn3Pi1fQOWaLdRuUeQjXLwzPNU19ExaE68Y/jWkuOvFqemSt9yp1ySWWEeuP5/3PSJlKI6KZNtKoSqV+gkQHX37qJDz75GIOXrmHm2kipG2jFJeXyc2RMv1Dn5/ABDr/7Fvt373L3rNPpobV3jSBsLIx558tb+PyzL3B/dLRJb1qe8YoNzGQmaK9Gid1XruL9jz7Ea++8jeGzTyNNM14jhDKi9184hWn7HKA5uPc9Rj/+wEl/+XiKbtVEhzpjlVO7RdH9aJhWRgR5FFK35zpCSSK5hWe6CifGrE1CKvJSOMr4bD7lLmDGrKElRosZ9qsj3D05wB/VBMeUOCaSLBrGz4VgzAqcUtrJqJNZeFy6/BxefeN1vPnue7i6t4fu+YtSrOBuZ0OFYRryD6UOxFQFJC3B/ZzOuWNIRYKd3Su4fuMmvv7qDn79/bfVpCqpof9JQJ95LSTrvmIZvmbepB/R4t2lyeNAq4es5QbDAX+nQJCK3Rx80p6RFyjmC9ZsSGY5ysUSS3reyxLHKDHhr4UiC1ItHCQK35f34aLCp1ewCZ/ba2fnyh6a1N/T2B4S9YZL4rxGH6AdgbwrBkhxFk0MkeJie4C0EKHhU+SY0PmHAuNqiUcAjqg4FdBVOqSKxvLqFMEuRBCU0vQRcOvT2+ic6+LyjWvI6UoqZ2GqFslO4BQSdymyzgTKakcpOSdJBK1UWiW9Ot0Oo8xobAj5SWfdKm+3jvcqv2o7lKhYmtEvKTjPOi1JYvnsTQISyxJ+tjjTzqDdhxNGsw+zOViDUENjPvt7rCzOlIVUmjabbGv/62VuCYiSJqdCc/x7dNLSGJWuCDoD8r5c6FzTwuEmcNOeWSAjukFJyJUmEu+0gCy2bI41ttpo5CpyqAiM0PQohZJhcOtFseCYgpLgojLJwzLQ9agIQGN/JlNdGULKVumKMB/nB9bMLMonVFM5RorCMxMANyj6JmG4MD6MdNVk1amau/crTScTDY7j0Vo/XB1ISqEBWic49tjnmivbQEviGzsH1OvEBRrJ+rX1F619y4XoPjSeZkFLCE0To7T1yes2qQINOXwGpUJbwzbw2G1fMUtbzW3M/Y3mgH42u3VzxQpjuuYDW+c2tWOG5FNCQyDqCQs4kj6C0izMspo76RFFJrbOCwWD2LFtg9h7fC0WW5RxF3F5s7nne7ZEod+u8xqggn/UMLYCohQzBOJPX6bREL+seU25C33ek5OTIBhoWgJc9FRKRdhjGJVMaMxoLap9vt3blx7/AgAA//+EXcluHFUUPTV0VdvtIXE8hNgJCcoCxCZCYgGLBJQVGzZ8AUsWiD3ifyJYsLFQVvkBi4gZKWJIFJShbcdDzzW9Qneqft02ola2ZXW/evXqvXvPPfec2PrjG6E6Dy2FiglIb5W/uEJN3EOhuevVbGph2FiEWR+DfWaowgmm+k+2TpTUV17vPiOdmtj7Xqv2ggjboG6Sf1gPyRwCKxt2wWhWqRYYdI8+SjNDoTfAQS03TGCwqfBbv+dU+a8BD+y+TTuA7o9RquZ7zKNRe2OqqkHwYkWSSl3MIvImNDMW59DDiDY4HyEMg8D7fO+gcCZCIj3ytSa/jnrDVxawtrOBi1sX0Rsczy9zDhojpnxXePjwIW69e2emDmv9WFxZqgVweP7sGa5e25RuCfa5d7zPzvuyQmkotByozW3n9SvY3L6G/tEJYpdzVS3Le0ijGoNeF4ePf8drV28grJMzzJD6/Pf0zOX33fsvvmxyIoJUhFRBC9BeXcXi5Rs4fnQJCyT173ozHxd6cJf1TvZGJVY6hCpKT38Slchdwb69QdrCcjK7aUhFcXajCRphvrPjd3MA2PwlNOBpkB6oUrsBCVzR1URRTsJkBkCJSWG9qNAfFtwGM6TKfm+E0XDMTgfPD45Q1BLssI1fFCp1CFy1arcSpO2U1xod0kxPI7CPgC9XY3KaYTIu0J+MMSL/eg0Gcy8gdBrMzq9FeFTUszc+60ft75tB7QVWLlDaacxzUTAS20aSdhDFy2iFqyzW11pcoeiQvfgLan+IE45sKJmnuKEcgkOPjKuZATJmKZSsnyLKUDEbIlDAQnPUilMGDy5duoKV5TWu8nbai7iw1MHWxhra7RQrywlarRLtllhZJbrZT8oBJ5K0P5CFGx0qGYujqigU7Q9JKv3Mo77UB2nPSr3DJ5Be0YrGqpamZtmqi2mG2UI0QErq4jj0wOBpxZOTJl5aspc3FoqqMUJ/iJwAwxWxE8Z9Bq/Gwz5b8J3sP8NJ9wUOnvyFVy/+wejkEJPTQywGOYJ6zEnGQizsMmonIi2E3GWaQAlIy1BWbXt8oKlEpcZlrqGK25rxE+gpTCBMmEpBDGcBqksULMsbL3tbW+bzzq9nJTTsJAUuv3EZn37+GdbffBsZ2ixSWNnQLKEihk6dAwcHGD35G789uI+y20UwzLCRLvIzzLsjHHd72PvhR+x+u4vjkz5/X96s/3PAeR0TUa7f+/A2vvjqS9x85xai1WWmrzPGz6IBqg7OOgM56sd/YP/n73H66BekgzE6yRJX26pxwb02YUuSaGIlsRgkBeUu4iSA+0JVUJUZgwR2TXL+nf6XK2ZkVTkp4MYZahKzoj19kvHeUSYRxuEET4sj/Do+wE+uj0MAA4iCt9UT+DkGmAHuoPoenQsXcPvuHXz0ycd4/+4HwPqGgMtVqcl/qsB91MxTowlAYCuxdJKW6B4QW2f/Jb7b3cXX9+5hb29P1oSDV2HXIoU+z6g2CExSpaYCpWuO3msCTbbWNrCzs4Pt69exffUKtjY2WZyVWhUJsCPNFu5lzwpO/ov+ENUoQ34yQHE6wOmrYwZb9/tDPD3o4un+S4zKHCf1UKvt9vzdPNzFTLJaS+7zdrb+FdZnz+jAZk6ZdqynoT37VPm/EV7EequD7c4KNlsLSCcTBBgjQ4lJFSNPa/SrHKduzOAFORHsKxvAvHUqfmvlXSWgJHM5AzRL5ABVFDj68xgPvrmP9soi1t+6yUwApycE9e3XkfTKOrYxDhqKq10Sa0UabEcqOCqzRBU2igct3rUK/dS6D9NYNAwa3aCCxaKLGXpuzD7nZRP/+bGqxbKlJjxSPVS1cDubWVQtmBv7rIiY2Z7VSn10pghvWlPnPFy/CuxbI9rPRhOXJED0vAaDAetk+EwKrnZqocBikEYsTY+9mhOYKTPDxWHDEpJFGjVVX7qPEcGVmoRTHsA96LFoHpgSfRk5bgcgBuIkLKQ9thb2JOCx0ZjlUaDFIqsCdEc+L4ZFEAtRQyetHRLxi2dzBGZGepiAMW3t8/+vom5jprOazteqOgsYyPPT50vnWOQXSGNkphlGoL9zUwaIFgvb6g4ma+N8PYnzxvlf8aJ56/u269wGU03znUbxXoXSO0tL0+TRTXMNah2me+e85T+sCS3ejpqE2GeMh2cE7fi5aB1L2N3ivmHJu42V58DR+l0QK794yuYhQIALw4UvDj9d2yaEaHbG/lj9+fVZ3vOMb2Osi8uMCPz5l2kH2HdR3MzF9kjzXLVCNjbDPKtb5kpa10mLiecwjhlUNFc8EufkPUk15HhctFeV5CIk+5zlxfQcOYbUdRSGEf4FAAD//3Rdy28VVRz+zjx6H33elrahBbRpMNEEEtFEY9i4Uxfsje5cuHVt/FNI/CNYmMbgxqWCEJVYCNgSDNS29nG5r5m555jfa2ZuRVjcUNrpzJnz+D2+RxKX1YganDySgDxyquZI3WPb5BgmIt9nlSeaoNT1tMG1DYshH1HlF24wEYEuaDXCVV18grqwh7gWGdhblSqucW1BqCd+XNskzZuSO6XxfytV/P9RvRLkyuJCPamMFcJCRQMJ4lNFNUwmn+UkisSmUKwbIj5c7NosoMiQl+rP2FcwfltQ3JmInaIDxiUnxQoNxA8nbqxjocSxjn9auic00klkQzgzoVnZk/luCQtrFUmBmfOLWLjYQffZEdhCVjtq3PfjSEkS+6c7f+LocB9Lq2s8DyhJoEOBeFGU/FNyNOwNsPtkB9feuYq0GVfws7IjDelaj2UMQ+oYMk0dyAuvreDiG5fxePsxQvYSUSQWiBFVwvp7eL59F8tvX0ey3GYhIKvUelf9Ao8KB1hPoAs/OZ/rb68s6DiB1xKUtEfWKHMLSNc2ka5sYrRziCaDMAvpkPhJFWSvAfpx32MpizA/MyWHIBW3/ABumCLuE1QpZsX2epVZBFJC6QYRgtFEzmzkWuRiLQh7OO62utp6jRTarmMzVqhjpOD3aEpQDmqT6YrABxDz7YcZulmBbn/EInsH/xyjN8jQPR3yZ6I+orJRxGikUpiCTjmRN3DIyWc9iA8/qeT3BnS9TAosuQR9RY1fPY4qLihqnF+8QoDK/U8ftN7VcgqLLQNfV6VvBa/dNiKCmsVtzLY68PE0ZhaW4V0LSXOB0Sdi45eyJkSRUaA5JV7+KnzISRGp77darJ4+S7C8NGB+tsFQfuLZ0UZ+7twSf7bbLaSNFPPzi+zGQMF/ysJ2ocZpLribaSq/o2yoHSSBSTv1yc1G/VKEj8Urg8DNqFhH/Gq2JtK4zCvXjda6WI62tGs0ObJjyWTLygnDgCnQLjK+VzDMLGMVX2e+6XwA1QpW1KVI2xiQy0P3iD3HRydHGL48wf6zpzjY28Xznd/w8ngfp8dHXFYkp5XEy4yYJ9pGKLSnyf5b0qHhoqpjgT2DH6ch0fvO9TlFqDMR9iCPq9M0vVC3Zj7yI4XtBaEewTWZh04VyPOXLmHu/BIurL+OGTeDB3fu4I/ff6I0QbUOTEHCc3JPcyyORPSS7PE/+/ILXL72HqdHDSYmBKYCCe82kRvonsI/uI9fv7uF7pMdLDVmsTK9iGR2CieZh5u7iL39DD8/uI9b32/h8KRbvqPYeKL0V90VCSmekk1sISNx/cZH+Oqbr/HmlatMXSHqDHXfeITHInrLDz48Bh5tY/f2bcRHB1iAR6fTAVX3SBuE2vOk2eKzQu1bpAMo6C+xR2MfYlrkFFR7CZ7o35xk0nTKx3B0vYE4CgTt9JHfvE8denGGJ+ji3mgf9/wJXjB1QYuBgVG+VUBGjLUppYR52QOuvf8ubnz+KT785GPMrK6CqzCSDYIrkkazcq6c2kFtJ007wNF5Sc/QG+GXH3/AzW9vYmtrizVLck10TRTXVpTTrydak4hr54Cp2nc609jY3MBbV64wtW35whrWNzYxt7yKpNmSc5055UFJz7m8F7JaJNgnCTCSqmx/BH/aYx0Z38+x//wQJ4fH+PvwAH/tvcDD3V3s905wgB735QdUlDRrSCuqhlDGHfZpj0PoHDqLfZhEWRX6TE2ddPRM5EZPRrxLSLEeL2KtNY/1mXNYSNqYjqf4nC7yA0ShyXcwjhL0sxE6lDDHMQbtBJdaER51j/CwP0TO1KmxiG5GcSnw1wjSOaTcs0MQ7yzH6fYx7m/dxQcLy0hWZlm7ggAdQnnxTH/yXmgEE40BHypVdU1kTLTPlMeJf07JGgfw6mNuRYAwoSUQM+fdRPkStQo0YS5uSKXi1sNJoMaaUPSVbKyO6W7iGZ7wPCAEGV27CEJFoGDeYtw8SDxcIg3U516kqKQJZFBsuYaXTq52YFMVIbR7LIqibMLV77tEMejPc+LNSFGd9eNC9XDOnLtuMsnLa5BvrsP5QXko87L0FDOIzR5Zz3GxRru5BN2nCZopd5yQBLkXCuGoyBg5Srx3Qz0YmtfWJu0ZrWbChQGm0DpNqFItKFDSTGdDGov9MZ1jKm5HcQyNqyS6kXRzixzNM0hhin/iUtNBqH6tdqtyHYuVnqqFIzhDdGpSr9bTpFEg1t6muaQ261q4jKJK5M/mLommN9lhS5PiGsS/3k22T3uPQOUmQRbAhOal72m329LI0QJAUERNHFeCc4Zm5mIQ/w5X2qOjRhlkoUDa+yPbV5R3Xls/ZwsQjHBW9LNx5Q1FABWdN/sF66pHmt8ZSrpeHKOv0X2OtdvPduNclJNzxxLeV3X1IxXlsLj6rLBgOafp3ZEOm8XPupcwvZuoBLyXyzXMEYCRQQ2Z8/a1akwkfufiBuUcKkwoegzyfq1QZ2gGOnctRjSXA7Zu5j1iqnSps7isdFoiCglZRpt4Iue79I7lfWVZjn8BAAD//4Rd22scVRz+5rI7u9NMkm03TZOmjbWJbbGoYEB9UgQffBBEBB/U/gP+Bz74v9g38d0XoVLoBY2KFKWVVm2otk1vuW52Z+dy5Hc5M2c3tg6EsGFvmTnnzPl9v+8S+k40w/hRcre8pitAaQ1SdBOKk/EC2u/vaSakbMsswmMRH/f1kn0o78noqK/OqUrfoJu+UCIKpr3su2jOYS9s6DAMxnUc9rNdhoF9DEfzVS2gYe1UKcV2TevCf/gTuCyBigkQBu6Hj1DCKmaFLiC+FufyZYr92sOirAYpTcTAOQ80MJ6l8SN67kQc8w0nI1phOkBMbsidGAcX5/DHz3+yDGC/ck3GA4E613/7FW8fPcZ070IuAvxSM/4LcIFAUVsP7q9j8cQ8b0AtRYx7d1bUaaTzxpOZ81EjtA4Ay2fP4odLq9jpPYEpBqLvaRRoZdvoP1xDf3cL3qE5ZVsY7mo9TdvIEixfYzFsfOP/aLI8RZTJ+WDYihDNn0Q0+zyG//yOMEuR+f0RFa7LACg4Fg7Y2B7gQDMAkpAZpqEhWuCQF804nxCnUGWVBDRh6cZviqd+p2cexnoqWymOmjLasakeDQyyUOFP6DfR8Esxptnp7XI2KyH+W5STPsiw1Uv5+lKuPulEqMBsNGMEtFiEERdARoEdyv8mwzoaU1R3pnsDlgQMslIyvgvtoZoaKLHKfC5gvFFPBReZeZYO9enXL5SukimV1t4U1gPr+j204in4rQR+exLNaApB+yBMOAG0O2xouMca4QZTl8lkidayVouMJwMkSSLgWTtCRNTdVowomZK4wnbEG4fpiTbr05tRqBEvYujFmlHSrZPxGY2ULEdGYKeRCDmhcKoBmKmdaY3mcge6QZYulNq/GQG/St29y3PrsVRqV9/eLGSzWJ8rS/uCw6AJYG/AosUk86iGafCmgM5sI5coVFpiiaFTpD2O4Bumfc4Wvvd4A5uPnmD97zVsP1rHI9Xubz95AAx7aHs0f4aY9qTF6xur0S/HYsUUobfyFBvN58zz0jGltd4EnrFJ0KigoEwfFRQR6YUwYYiZmVnMLxzHy6+sIOl2sXT6DLoLC1hcXoaf+7j8zQWsXl5VWYDrLyEgQCgWSrwGERbx5nvv4K33P0DYmWXiOnU02SDP197ssAS2t/D48kVc/fordPsDnJg4iEONLiIk6A9LTCWT6DVi3Lz5Fy5d+RGPtzYlbUKLztL58ez8oKxrovt5wLsffoDPvvgcx069wAkUgER92Z4wmw9S0bmzgezGNdz47lskO5voxjFacSL3QS3u+f8m7CUo1cCu1E1qHYFoXekrLTeB/AR+MyUsgJ+VGFJc4EDYJLkuAgT47fk57qSb+CVdx7ViE/eIPYUKtxIghxJ4PAE7aLwN1SvoQDKFT899jI/OfYKZF08DLafwrwqSWjJg2LcnEBkLaZithxG93c4utu8+xJULF/Hl+fNYvfYT9rIhfw+jenVb1Nt1yHrBhDYpR4FtmlvLp5awsrKC1954HUtnTqOzuABMJwJkxW2YQl9BG8xcRchUY/RTTq3wyx6ZYSDt76LcHSBiwCIVNX1Q4NjhDg7HMRa7HZw8MoNTC0dx+/5d3LpzG2sbD7AFwyBKqkCKnR0OSXHkMHnNtQpVTuKh7vy3Cvn7NJo40kqw1JnFfDPBXGsSk4jQTA28oUGZkmknxQuGTO32FFRoUpFEhnklpVEAC3NzOL70HDrrd/H9rTXea3DDJ/DQo466OnBYe7aG8RBD8KpbV6/jzKsv4XgngYnE5ylwLgq/woxHQNaMO+7+GyuT0mLC1NRmKCXeZX/SHqs0takWy7E0PafUQtXN6LYNqxFmqHPwJp2193m1b/Mrw+igjiV2Os42EUv0+qPrt3hgldVnsm+Uphi4juH2t+0u2uJiPO6MKczq0TUClGjss++N0snZMA/CZuD7lC4OppIu5tVsVBwRuaEGFsUf5xUbuKon2BjV8Dmv38feoxQoJ7M9uUlyIQ8L9emenmUQnuh8ZC9vs/r3SyR8LbalQBryOmNrg0Cv7ejznZhaLVLzLK+63kGzjkJ3mSCWFUGMKopAlXj12qBv5BzYYtf3tbmjTvzkJ0aGvlqHuR3iKibd96vi1BZ+bp1jO/lGZdLuWPBVLmWZJu5haxZrFD0ePWhj54jBbc+FsJXrYlfGnwBLXNQq6GSNykONVKT7TiVxUS29yEpLeA35nmEgyVecKKN1GbMCnOg8MXEXwI6+D/0mf6nx/4/9DoxlkNvzWc+rkTqNuvS6Z6JiXs4bzSN5L1fubgt9ib8XoG48grDO49e1gGQsGSV6CGO8MjJUUIPnNEe4FlXxT8+3EYruWBoBh+z6RueIHxODT+aSjCODMAzwLwAAAP//jF1JbxxFFP66epnuWZx45CUeQuxEWVA4IHFGIgpIXBACceTADwgXJA6IGxf+SS6IHJEQByTggEAI4iyWSLBkmdhO4sSOPZ6Z7ple0HtVr7t6SEhashxLnkm7pmt53/sWfofp4p+7PUpQg8yajJWuQS4dOTEpURdyehbjP2VF4slN2g8HI5FMKU75S0zvmDqRPlt7M/1+qVVM23+8xPJNv8a+BPGy5QTCMLAnk/ofjwLtoaCM+YgNEOjFxjGLgf16PUaKD5RP/dsMqiPjIFrymsmEkQA8i6JE/98kTnjxCFwdGZf1EzTDCEsXTuH48hoGa/u1Ypo7/UZRSIvn6uofePPS20wNJp14mmh2hMMnpaw0Sdy6t4Peyz2OaCEdVnXM0C66JWWYEXetqZ1kLnqnljHXO4mDrXVEZESTxwiLFON4gMPdf7C3cw/Hl86zUDAMFXd0OPCtzlIuL3sjfl7xr51eWTStD8GNCE63h2BxBW5zDqo/BIoEucqMAzqM3hKsNKajNuHde4dDdEIgilpsmEdO+/T5xsMB+kcN3gSUCvXzYdH0p+fDi1/KYuGIhsg4zbOGTktJkqxAP1Y4GhcceTWKR+iPhhiOEhwNB0goMkhAK8fnrjVVFpTFLzGctL6yc2+qc/fpdUTjJ7CAFkGa3rRHpFMfRWXCB7udBvmxpjdFXh663f8AAE/P25bSrOBS0uceba4ipCqC1+ig0ZpFM2qhoEKHAIBwBqrRARTFzEU4ooMwpRL4tN5QtJ8HFSjMBQEbF9Lm0Wg10DDu4SF39Bu84esklJTntUeFj9IHF+I4cAeI5iodiMco147MxNRkRq/rZVLkCaJdrT28ZsCg/ZbPCm9QuUGRC2HAFMbsUX8XupdSVkSfPfaq6t6b4xkb63HBrxTaXsigQJrFyOIR4v0RkniAuH+AbHSIR/c3Mdh/jL3dHRzu7+Hx/YdM9SfgIJ2M4HGE4YTcFZhuqbQ5gKWllsNalZUuIKw8Jjrpo37vksWfGwApM2ABGcw5JafCg+9HcNwGFpeoA3sWvQsXsbiyjNPnz6K7SM7RHUStFqJ2yOVyEXu4eeM2vvv2e6yv30HgxOzclzuVXFRBa+5dM2KLywv46Mon6CyfoQwDfvYVJCrWZ1ND/H0Hf35zDYc31rAwTHHmxGm0vA7CRoez+jOKqIpCbD3Yxm/Xf8Vf23eZzh9Y9H4dFYrKAAAgAElEQVQBzaTrnHOHEEg94J0P38NnX32JxeVzDHTlnIZQsEGkZnvRQ5cA9zaw8/NPOFi/i2PZGPPdrpZame6O42hogyNbXYOiMoCaMr0zN/IidnDmNJEMKtOdNCr6eP0hE0BKvRgkyI/GfJP5RKdxkJSmr8DF/+3RI9wqnmDLdP4nBiAmM7HAZPQbeTcDicTMml1awKeff4F33/8AEXX9GYj3ufqm7qM0MISpoY0RwZqdfNDHk80NllsEhYdW0MTD7V38fn0VV7++htW1W0w/5wLRczjBwzdFSwlGqnqnn3wM6N+vvnYRb1y+hNffusyJNs35Of2JUayVI5+WyYcnYEOagsSwGMXAwRGbMCZ7j+AQ+2AwYgYA3QPJAop4DApISlLF0zhse5hFhHY0j4V2gPOzx7CxuY272w+wmwzwAH2WUiQmFUEY2LllwCeXa4ozv9BYBHX6ZxCgDYVes4uXuvM4cbyLjgow6zYRZR588h8ZJnDGpIcasxtjwQxPn9dg7Y9QlIa3YqrmjhOcOdfD7CtLmDk5gx9/uYm9JOVDv/Hd5rlM+9DEuPz6VKBQPPJOjB+uXsPHK1fgLDSR+7oI5KXP+Pp4xluJz4GZ3oW0nlnVJH8S5yV09CpaujqQO1bEWHlIt7yDlOvW9uvCMCdtY+rpi0Bk0u2iNL2umw7a7/U8NX/V/ZQoa+1cUlsnLZNB3en2aoXjNMWYZbiGnpwWJgXKeH3QmAUMtlnvz9GjSoPQpgkCI80AKiDbL+WJuovPPgPk1WD5D9AaX8aZGX8BGQXx23AYZChMSpXLLDmYddGx9gw5Z4LPQuIx4NS8u3h/dKuxy42nGLFxOZJvpGNRUWs2FrXoPQFIiqfsrdO1jRjGaeBlUkoFSsDJRFiKTxrVUM2orVnXhVs1Uh23ZAaLprt6rrPSJM6m8EPOAJYpcCVzcWpaePvKpiL9GIgyzGuWURuGRJk57+hocplPEvMutRhHqNOY+z7/nnTHlTFu52h4t+5rYINE5P8gUYTTsgz7O4ODpiBmJoTcp/hLvMA52/ZPk0vSAbhh61UNbDYbVK6J+DMgnjWmtjRAzAJtoFG+OM3DMHakoGfjepKDTBkq6vvQDAoeC2GrSbOT6ipT/2oAh9j5LX4NP69EFGYZqUkkg4t/6bq63iiqMPzM985uu2XLlhYkjdVQCiYEo8TExBiMJnpDvPTKxAsvvfDCP8Df0T8gXJDojR9BVIgC3Ri0ltiUsnXbndmdnTnHvO8573ys0IQAhc7OnPPOzPvxfPgGql9B4V2v4mSUsAU6YCnfWlTwdwsdoc4IFeHtqGXh8tYX1W2qtTkWlydiZ7QwWTbl3wOrbsoFpVtBnOQGlnOsB6wuuRc1hqfrNmTiJYALa6VXbXYVPHW9AQo2Oh9RnJRpGnfNnvGQn+eYywYI5yQvFbl1eU2w8KQgDviGEA7b84pBekDMIP6zbhmE3GDJi+f+nNkvW+Ra3QY/IvhdDtUP0N88g8MHQ67ejG+xSC3pcj63++cjjP49QG9ljZsiNOFSPKmB8bakUtj1sLOzg1cuXcTCUjx3AhW3jrn/bJto1oYE585u9HlyMvjpB+6aEdWBrBZjjxRlJ9gbPERv6wrCbrd2tLlPcM1gpZp6VOI9z3rZNn5WG2g6owAcD/GJPqIzG1g8/RKORo+tfWXV1XZqCbriKbPCkQbz5Re7ETp0E8cGBUMiNno0Yv9Yok8QtJogmM58QdxoUtmja3HecG2CXhV0qhbHo+PUdJhz02nMZwV3PQm9kWQFnh7nSGfKKPUT5cQ1MDq27ow6/DKP2jF3mgtS66dEzzGNnSRJGS2Q5jl79Gc1MSdVroFdc1kbaUzMgTTmoYSeqloAz5r8S1qvStC8Wyqak02f+Z4PL1wEwg6CVpf/vHRiFU7URRifoI4Mwt4ytBfBC1pwvRbSNOfpZ1i4XNS324s8yQ/p/4Ye4oWIkxaiI02mYwRxFc8zdimY2D3TdsLhGdE/6q5SblzMmBpBDTO6P9N0wkmFefn71mLHKNOLV/L/KQ5VPGjlWSsplMZaWhdzL3mvbHYxNCw3yruE0gjJBlTDJosOIt+I1Hlid0SNo2mCLCX7xQST8RGmk2Om/hwO97H/eBfJ6JAn+tOjQyTDA4btU+R7lm/Pgn22DRNQXNnnry5SRpRUASJCss2rlTjiS9Cuvc/KUZ/ddzB3dKryikLCThY+1k6vY/PceaydOYuti5ew3F/jBkC7dxLt/hrcThszTyGZjXGcj5HqGeLMCPoVwwzbP9/Hvdu3yavBkFWc6kYXDnWJ/PGBjz75GFuvvY6JTKFLaz5lpu3b2/jly69QDB5hXUdY7q1iqXUSmSJ0TYBxUSBe7mKoM9z67hvcffArHyPyQ6ZgyP2i5u4LDpcAuPL2W/ji+nWsvLgBuBEnyEoZq0DfNp2RDIHdHQxufA13bw99x0HcahvbJN/QIUit27ENGS2wd8eILEGEXx3VfOqyfzq4OCU0QEhT1myG6ShBPkrhFS5PmQkZqIMQqe9gd5LibnqA+/oQ/0BhzCgN85xjWoVtjtF3iNKWFhkPyy+/8So+/exzvHvtQ1b/Zv4JquSQE2x7WgE3hDLDORof48n937F95w78aYa1hR4WgwXsTwr8tv0Hbty8icHgISbKYEVY8TovEPnWt7pmdydWsCymC+D85Uu4+s5VvPfB+zi9tQX0lox/GbT19vYxUzlTcMydOTEojGTMU38Mh8DBEOnhU+h0jOzoKTx6eWUFT9IJMk1oARL75P32jAUgJYdR7iD2A3T0Al7odPDy8grOndrHo719DPYf40k6xkjNMAYJ8ZnGRqHr4ntyXcZcsQUH60srWIk6WF3sod+KcardRcvxWXvDmyn4Uxd5YvQJWCiQ7Uw1O3oosaFzKg1E9lLRIVxaW2oOHyXwZik2N9fRv7CKpbUubtz6Hn/v5bw+mTQs3OocQ23EKNV0iuSvY9z79kdcuPYmJQ9Gxd8iTqg45HTPNTBrec+zG5EIGcw1AQTNIlDkwlITS4i5RY94dhKXjpNGoaQt9198zumZLMJt4nduLsSciyAAxMqP4cr27ybHVA30F8WQHI+Ld9XUBECtiGcOcWHEZ0VIrP4lRaEUivRLCjX5PM65rM+7w/BgMzEkTQ+iKc4P4ngt6K1nOvuN6XhdcdwznRP+dyriaOjDrgbzPPGamJPjitGILi3z6s9fzgb85s8XRV13wexdVQj7lX5C2XQ2tYvRJ1PlXlAOS+98V+DY9jyrhoqyBaLm4jK3ObgggGFrodyq3lPzgXJ98vmn49IQuV4Yw8LoPSvoKLQMGtK4jltO6WWCX2kzVCrvsh9C9eDJc61eqZ6TzZqpThtgdX9GojSLUzm2NASYplLuk2hWuYx0pfMTH/2yIK3HmBVtJ60JcYOARTwwNbh2HY3QsNP0us2dJJjlYFfWkopcq29RxoYtlOvIx3q9KHHGSKEaBaC+tiLWzZ/pGSoED4yCAAHtaw0lXqLFuaA35yGIBKEN1J9F9EWijHX0jiAAhE7Ok376LLse8lyQAXW5TxSfc8W/xKMM5In2ROEaRgEm6QRZluE/AAAA//9kXcluHFUUPTX16KFjTGI7cZTJIlgoG5QFm7BADBJhjfgIxDpC4ndgwwJYIBA7JCTGKIiEkKAEEUIcx0O73e6uqq5Xhc6991V3giUvIjvlqur33p3OEHMixUPPi5t4kTeYzzBFLeTGqtCKaf0wOWVwxlHlxVn8SxLK4G+Ho9jVsMscJTKJ5liinOkA8bBsS/Gh7gA8bJx1k3zhLWJDtaWLClTl5qMtHAq576h+YL+w/cEk0yny4MPANlZUv1zpvhgPyDdA/OJwxp3yWZiIhfBZEl2Q8CIwPNzEMqSe5QkvV/lmxqGR98puj8KxqOjNS9MfnCqyXlxjVshN9QKgiQQXU6ELdjwambhD8NRCrTd7OO0uindl6e1uNBhQ9G2EDPFaEwsby0jmgHA/FDhjVCbIrNh1Bg9O0wPc/f0GLp84gYwcT4rdOdW2irxoYFP5Kru7ezi2fFKCQ15ME32zSjaBHePSmdVYswW8+NJFfNt7Hke7mdiqJckEw0MgIOxu+wEW0gFGXdprNVUtflbkzZIHFVcJa8tBf+Q9S6n4/5cmMES8TOIAo/k5BKdOIVxdh3vYA0ZDNJDrBjMhNGdIgArerxnoZ0Brf4y1xiIOBxk6c5Vw/7lW+v19FK6Lbrctk6an4FYRuYOVcIZnA7wqyvJZCQci1FYnJWy0p1TTFy/dXAr2o1GK4dEYE1eJcj/59/Tj596mH7cgQNiYoOVmnNRQo4xe2o05jEYTjNNCvcjJ56dNT6ndfa/Q/1Qx7wMBnhHdsals/a/ZyiWoncgMuj315Ect5BeagrpOyiub6lZowwVNFFQ2pxRVo4uIon3JPDC3hLizgG5vWfz5m71lVEkTERcW9zfXmhefCoDu8bYIxFB9nZ9Du9Oa6b7SGlL9COTtmW94UCNtpgHKnzF6bSfIFudLVxcIBJZ7rhG1jXsI5fvB2xTRzi5AXGLqoy1QN927U+/Wlindz7RcQu2IV2FgclqmlFCWaHe6KLNARAibrRCRIwSe8HQn6vUuHyEfDNDf2UF2uId0dxuDvS1sP36Ivf0tbO/8g2x0iKPxAQK6S5hHsBRFVYmFMK71MGqSxwwsvz48asG+WaxHYH71/pxTD29JdAgRjBJLSpyKEgpAmE3lWBI3Nlvmjy9haXUFG5sXcXpjA+sXLmDl1DpOrq3L/51b7FnAN5SKCzHMxkiDiXTIpYislHtXjQvs3dvB49t/YfDoPlrCqC7r9eoRKV128Rm0Q+DSlct469330Ogeg3oVTMQIjQURBfDyWzfx8yefonN/GyeKFuY7Pcx1eqINwrhwiBQjOHQX2/jjt9u4futXeXZqr0giz8ZWWNYIgFhiUkMQOLRXW33hPD746EOsnN9EGaiZj8B0/ZSHd50eAXdu4PoXn2OpCNDl75mWBRt6MiBjzCTwOnSyF0PfcSiUc18KkKXQaVSgCUrEM52nPl0dWLmlJTAqUPRTlP0MQaoe3HGYYEwOcZxgrxjhXn6AW+UYd5HjwGzipHAyk8OwXt2V0P6COMErr17G+9eu4eUrb5rYSKGNWDEq11SUe7URNhCUueo2HOzC3f8Tv3z1DdxuH4tRF8d6K5inpengAFtPnuCHn37Ezdt3sJMORRSXXGfRPbCpprXT0EaCBnTPcAi0dm4dr799Fa9dfQerZ85h7uRZC2ac1KkdUxR15DoNwpkFHjUG8gPg3wfIt3YxfrSNeDgGhilKEUgEWrHFehNVHKdDoRqEnkQt3+QKpwwVqnfRimQa32oFOL96HKsLPVw6vS62pKSHjNIMw8MhhlmGwzw1+URFurHBQqQd+cDdRhO9ZhedMEaT75TFKZ8pdyiyVBrLpcD8KzlzxBYy1NNGqCCBqiuKCkektFDGl8Qx58pEIHIyyJDu7SMv+njuzAreOHsFndUFfPbx1/h7y1kbSKlMtIDr1EaeFTpRjKP9At9/+R16mytY2jyNstmRcyCUhNeQY5L36XTfw6hrmxtU1nj0gcjywsLZdG7qjS6Wy8w9La/iRJjq7jrctoIqUOeg0Li7pMqw4aqopGqmntXfJ7WO12w0FM0Zm2I9UWWVNe7EPWBGYI/xl58PkQPMF2K/3pmns9D0tAFO17OxXJMaHMqxdpLf+oLQ2QQ2pPZDoB3NwFthB0Cn1VG0oOXAsRWbKrpG8dDgf+roer56usV0qFW4yoTNSmnMCutGrLAtfvAMDLVQFqGyfFLzwtvtttAWWW94frbyuqNaN4x5NJ22xIKcRacrFIOgwdnYpmWNPpURQaC0OS3ANKevrIHM2BNWes7xW3S7zAZ3wiakcwarn1LC+MwT8bSH3FtQubphKpPc2J9mYT3hlfdpyIpZVXZqFUwHhqHWJ1Zl873xb/sJND8P4YRHfkiL2m5Xfk7UKbUQgtLsKXWI4/8GrOD101/aP5YSW7wtoC94oahsL7gHXzup0HDlLaVLpwMlW/dERo7zrBaZrNdK6V05YqGKEvavtZnpKoRKe9ajxO+ZydQ+M6vqhohM2Ct1v6jzTDYhSHVe7Gmx66kQ0HtM6liR19f0lEtpfvNdmcOEWuHz89UmHf9EK9b1yfuf5Po+p8iKqdiooub4rA5N0084Gg4FXTL7JU0TowSIth5zSNOJ4JZknk59H7XuVQ0JLljGX2mgJd4nR8+zqc2orjkv9MxhIAVpWZcy15G8XqhLDUxcJvW8cw7/AQAA//+MXVtvFFUc/83Mzl672y0trYBYREwwxAejhASviX4APwA+mxhfjT4av4sPPpsYffFBDV4S9QESQkGkBQsshd52Z2fndsz/NjM0NbIJadh2d8+emXPO//K7NIx7Uq9C1KtGXH3S5Foq3H5Nd7aqWvIkEH+NISkhVzsSXeBRNOHnoJwJ37PKYV525rnyTlUlvYHMmsIPK1E8S/Ct4kSBBsNP1GfSLAWl6iRVo4ZfQcHZBmEaqaiDwKSbnW4p2MCfp8WEMrmuVcJQ86+0aoynSpV1tXaGT6nQhacaB3Rzmr2HHAjN8j2oopgm1Q1af9A4zUIQxp9TGwxGReDwh31nWgBSxS0Q0iIlMQ9yaun5WFxdxsKJZUy2Rxzw0KEaSAipgb0EDT9f/gGvXHwHrXaPxeKcQhppqBRM0MKlzXV9/TZWT58QGsD/oe/1QWfH6upJrDx3Cte2Rmj6IUNzqWvayj0kD+5gb/0GukeWEBU11WUnibid81Z1tIrv0/D/gScFCwmCWHSbaB49DnfiNIIbx+CmDxiu6Mr0S61vdByZHvVRDmztxmg2fKwsDRAQpz4do9HpYJZGiKcJpnOyQQZNEZj0+TCL+LCUTUXQN5zqa2WbPoctcCiZKchXPeEOP1np0T2bxCkroHLC7zwuAMBEA30PnV5fIJHEs0spOJhJ9yOX5Hp/+xEXAkSQ0mmy75UaB7nyYmt7Dj+qtK6WFB9AaBi8226nsgBQ+7tc55R6yLTR+UGXAyyCOlM/NvCGnOy3B4todwcI+0vw2+TLP4TX6aM7fAZeq4tuv89Jv0coJNoPSCCsIUKiRW181OX3lOvI+4TvGMWS6B5GCA3UxmzdQPnuNbFCV2FlDLWRK6SZlKkDiRBKIR1RoCsYBSIIEEt59K2toGUfb0XYIi8tD5kO4TnVFRF/ZbqOdB9R4EFJZJBn6DE/NsNsHCElMbY4xnjnEfYeP8TW5h3sju7j3sY69kb3MX38EEERk4Y34Rv4dXQ15gNFKtD/HdTKic7rVK+fX94OkiQeWGvOL7s29sjVizL0Ze/LmL4VcoEjYxhxh/e7lA+yHjq9Oawsn8ILZ87ixXMv4cjyCk6eeR6LK8cwXF7krnBGB14jZE42vf1+7pTGJFZ+VNjMrC7FTSUfIYlx0SaY5NjZHOHBxganpZREKoq59EbXfjMXwjoLc7j04UcMuy/4fhVN85CKC8TNv76G619/C9y8i6NuDgvhHLygzbanLJjqciS+w9zyEFuTHfz0+28Y7W0j8wpRRneuFJ0sKQ7KZaVQt780j48//QTnXj3PDhWMOAlEU71l6tZZhHTtCta++waD6T4G7SFbAVpwRTcaO5gUYh8KgvrnCoWm5LsQG0mz/WeeP1lU0bySdzoFVHSNdmPk4xmCKGEFe8ae5wGLWqahY2XrKJ/h1mSEm9kj3MYED2WGlQbT4NVjtpxO99KsSHHh4hv47IvPcfa183C+GB766gYhm4p0Lck1Asm+PHf3Fm5evoyNX39Bd5phdbCE+WYf3ixgccrJfoS/1m7jz6tXMYq3ebh2PHjl3uXxGKTklvCY5gch3nzvbbx/6QO8/PpFhEvHRKSTOagtITJQ4UpVIljIks758Q6wPcL231cw3ryL6b0tNKc5hr5019ndgkTcGmK4yTRBSjjM15kDcLHg4lVDZ34h1AsSYQRTkMge06EfepzI03hImIsSsWxRRFkThjrbmszRpsRVz0emcVDBZ0aJVywaHfR8JmgE6fRL4s/7DZ9HhWohWRDutADocaGmISI8/HxYZIgnKaLRY+z+cw9Hnu2hf/Y4Lrx7ns+br778HvEu0Gn4mOQFupTcKDXK1/2XrsVkM8a1H//AW6vHmQOeUEOD96Ocu765ouLkzJM9v9pLn45iJ1TSVMRFNaFl6HLhHWrRV6rQG/3qECrtf31O/edBTryIcyVlp48S4kyVMjgm8K1zK1RM+F4JZxeROcfxMKFaDN1bH3tR6xo6fQ13wC2ezEV/iwva1K0lVxYI2pdeE3EDShCyFMvEbOdrKFeB4fuqY+M4AdP4PTd+dFDG0BR3eypaVhfQFj0CgVlLkVKSJtIngRZKnNIWaH1wBz3wypip3v028UP6Z8iKuqc6oZdK4TzWXMhLwUb6+0ITM0MAHERjGHWhPqeGoo6TWJqBNS011LrzXBAKKorGYZB8aPJP8yNwcUFtUCzPc5GnZSxjXflK6DEsO+CG2jYkis2PdwBSD9XpYj5/Vgk2crFBFelN8Z/n05q9VAxpeaWYXaB5FNsBuqrodthaoPFM2Z2jqfSdGhqdhAZZAF3c3Orrx2wH7XsVNveaDDP6JEvVba7qsEsHnhw91OWACzQ+Wp0Wj4PsQZm2kZNIs1JWuNnyJIK8Qr9IR8ToHowGCkgwuo3JZFyKCLIiP8X9qtjP14ptR0lXgn6vc1ZDRBhlyPQF6tfp4L1i68TmgAUe6UxT6oagVFXU3g/RbrfxLwAAAP//jF1LbxtVFP7uzNixY7shr1KRVq0qQahUUSG1KmIDYoEAsYc9LFiwY8WfYsUGISF2IJAoKI1KKalTKtKQpK6TOvFjXui8rq+nAdVSailxGnvmztxzvvM9kumHqShv9Q+Jbin2U+c8z3WynM+4k9uJoYNHDX+sTU2hlCYzOaAbqmiVVRvjY6tCY4SYN6DIJwhkatCRcwFsmpmoks8PQ484L39KIg4/U7M5r7Qai94TWgYvdovh8EYZEW+A4QZAsSX02eymkRf/71XAkWhEuS4lC5hRXY0Kkzi1GjMC6P1YokB4/KsPAxOyU/QhVSrKaQ+7idBXZ3kBa69cwObdPbg05eIgZld2mcrYYuxub6Hf28fqmkw4qADIdHxLBRtoklyLcXBwgH7/KZZWOqIBVMZOGTTZU0OzwlPIls6Sg/I6un/8iXx0xKVhRLIQKnyPj7C/fQ+XXr8hqC1FaBSiA4yV3miSkqIoZzZhcRp9PiRCqD5iZDS/uIrG+as4Wv0Nx7u3efJZaqsr2munRmazjSwlae09OeHzu+haPLgipTFJAIZjcdonBI5ArZreCCRhY6I3PgO7Mtbj0cYxmIzExDHNmd5PQMJIwSta65Ph0GuRaP1QxrxRGumzEzDAyRbDTDf7HKNJxu+Fhj2jIvJO46hQr2FY9n9kDRdutrziV1UNtPQ5Dn5mr+W/SwAVEuQ05Sf7p+QM4sYy5jsraDeX0V45j3qLtNsLqLVaiNttuHoD8XwL8Rxp89ts3kfHmJ5HJB520uQLlbsS6RbHasJYepUFA5i2DoIUEfcctWOhGtHA7jT4F96bnqLUBHBKZJLGm0bOxkip/qHIiReDP3L8cudd2KFZ9WzIRwUYNR5kckeFz2SM9OQphsMDHB/2cHLYQ293B7vbd9Hfe4SDvR32pOj39sR5nxImtIEteKbmxEnfdBylTUNrnhouWmhLik69Ol7EZSZT0LXiMg/2OJ9SbiZJjFWj7upIyzlqFdBqNHD2/AWcu3QBqy+dw+Ur6+wPsnbxMhYWl9HutK0bRhnLpJkE24UxYxSlok1vWlybNnW6fqmYJVCUtIf5eISd3W1s3b/Dk/woWMNQ6jdPiJw0p++8+zauvfEm8qTJd0i+znh4OQG6W9j57nuMfr2HlVGMzpl5JHOSGEFMjVxTMKJGAjcXY3NjE3e27un3g+bfGgo1iCRwZ0AxuXXgk88+xVvvf4Co2eJmjYjnie6hkyhBPU+Rbv6CzW+/Rmd0gsVOW5p/Xue5Hp9wSikIl0yhJLqV01aMCkoFTakeNhT5l1IzMMcsv/gkQ94/xnAwYOd/lE1eC6le5OM4x874CFtZDw8xwCFS1v1PeQpOJskB2NisN/Hqzav4/MsvsH7tOt8LbJ5XlAJNu0KuG15/NF3v9/Dgp5/xz60NDLoPsIQEL3aWsNhcwGRMhY9kUf+9t4sfbt/Cg6fknw+l+mYe4LF3VlNvF9LFX7y0jA8/+pi/VtevsEdMgQZGLpPrgBgyooCX9Z+O+f3kf3XR+30Tg4ddjB8/Bh2ZF6Ia5sk8NJO9hhlwZu6l0kN6n4lmVZdqAOcnTFnBdNlaLrx+Zgjlciwca6vB5odpKp4htDbrVGiOpYHh65D+39FQ14MAAMysLCXNgRlumVy3iRknCg0NFsQnZ67gyRV/X/RFzI5hXxsqbAmYKWpsEFjPHEb7xzi6/wgLL68x441iiG+8dx2PDvfxzVcbOB4WAoLUNP2klLtmTVSqGPRTPPyxi+HNJ1h8bQFRO2EJSekEcHKu1NhbO5uV/SrUa1dxSt3PS002oiaAqfM2wHHxqXUYAqM0BM1/NW3lNFq+fysBc7OomAhajjldlGYSTcwgBjfzqYs61Ew7VmNBeK+C4pkasUrvdj4/XKam0Mgyqq+S2BKKIk8lzovCNzNzOpW3wV6pQHdYd3LzrJLe6WS48OC3bDaxNkeanlWTqOxcGzySJJiZuD1zcxvs03HYg4SRcmbupyaOZqpmP3POzerP1fAv1MrDT1dnY6TDB5u9afNHjGY+ViiE1cC1wawZehHo7E+jvfvjqfIPbviTml9j1PwzFT2KvSxBtPMCPBCTgVOCuHdTE0gbIJKrvA5MbVAZrkVaD1RLco+kYJSdu1oQIWi/YxF3ZsxXNTqMtMG1BBXS6jkAACAASURBVLTqw/ogMc5LUcZTHTydY0pPoPVBzSrdr01G4c9vpb63wShjY9qf0u/nCmqIdCf2DCCa9nM8HzMnQjP5Z4u/cHAkDPFpmkL19cKiSXgNmEHjkDwmdELvgUQFrQQMo352Kuk2sCJs/qsPbwqpZoRsKq+9uq0davoTpo8FshACuaMI/xJ2bb9RVHH4m8veut1uSWlZWkDAWGNC9NHwYCQRE30w8YE3ozHxzcQ/UMKL+IBiDKABLyG1JOVSWrZdd7fbzuzMMb/bmbNNDftEaLtzZuZcfpfvkno/UIUdH4f62EWn+qDohadxOrvQywohkKgVH1dTeeCpQo4TUf2n86JwMwuPJqo9KJjQAXs0Uuez9LSA6nqF79pX3X/og648XuX7qocdQmutomQvkBNjz80pfcdO+w5+g7XkPxQ4nBHm85OIxHvkIKGJTNel8VplyV40Hf5WjAgnmn3oZwxLmTqvTzDVe3l9hxuVyEgkFiae7xZHaHfm0Vk9hdbZORTbEw7KecNycsjTIUx9kKYr8fD+PVxbWYVpeIMh/CXzYMSarMBweIDd3T7mux2ZaxZAGw3g+HD570koB7i8/jZ++eln7L94ChfrhpM4HEwG6G9toPfvHhoLHfZktyBdOqMyn/4v0fccsBM+VpiwZgZ93zjL0Y7raC6fR/eNK9h7dAsFRd/uUIJGecszolNOE8E8EipA1B+yF3d3YY4DqzTOOb06oG4s29wkwnV2IljFha5gcVLVnWFJDOkk6E6JySTj5F26yabOSjSWlsz/WAXxyNaHBO4ygUONDjJeQ+Qnn4k+l+fwlzOpsXyCVR38JJ5JosJfLo9B+6vk/6S/SVkqTbQTYuRRg3nUjfnTmFs8w939xTOX0er2sLC0hlZ3BSmp9tfbSFs1JI268L8TsTm07ksBgVHBCj5ON0YOsrPg+gQZVUEWP86Iu5r+UAuqrJyiuNLDWf6vKIegWBbpmOw5GkQvcjZf4K8PBJ1pG2FUKrpAxsuuKJxoSsGpSV7DhCYaDzHJM4z2Bhjv99F/+RyD/jaeb25g99kT7vaP+9uI3ZiVuVPtY7c1mI+1S24QGO7yeBENG2PJHZzY1PCsY6qIMO70KKzW1k/kkTKxWhcapDfW/xOY5amlZfTWLuCt9feweuESehfOYWX1LJbWeuicPoVmZ57nKrlqMDI9pJZID5uFSCOlmtkUJu55FcDFDHczhWgSJ6Xx1Rg6L+JFT59sYLD/ksgfKgir4mXMqRfld7qxMxcX8OEn19Fd7oHSRldO0aTbmUyAvVd4/sOPGDx4iF6RYrHeRkQAchcznNJFgkKI0jraiy3sHA5x++4d7I4H3Nk3DjQL8Zl4kJ8PIob3/kcf4NMbnzPNhYpITQryuaKfMc0E+QEONv/Gxu1b6B6NUKdnR0ljau8poEOV5uUtyQTfNNcCKtqW+Y0TPiOm4krmOJnEcAjXHyHrj5DvjVHmR2JLG4knOHNwWzH7fW/u7mATA+wgx1Ct6gxRJ+tBoKp0yXbawuLZZXzz3bd49+pVuFpLihK2lejEIkpfQkp8hyOG1v9+83vs/PEXWsMM52tttqiruwamh+QF3UF+NMWL7Ve48/ABHj3bxJBKFGlNrahkJtV0X6c10lJtjEvrK/ji66/w8Y0v0T5/CQXRBZIG30OdTCFZ/yOXk4Ce5/gAGPTx6sF9DB7/iWxrE3NZjuWojmbcQINoSXElIifJfSlieoUk3qyvgEgpGAUn6ETlgXXrCaGhk4lRG6UUIkikVhxmnCZ9GrcRbZNii0IKVXTuMDKylO6QUB+gxSbZv8mH32Ie9uhWMTaTIvUnhTPNCPlHpGJ6LMhH64sND2roJnMoJyMcbe1j7/FTuNUlLFxZx9o7b+LaZ9fx7J89/PbrFjMmjnLnkYN0UlBCnkQplps1jLaPcO/mXVy/eA6NOaJu1rkwx3o14n0re3MU7LGGVlNe++x+bYnw7D6eKyKVk8pY9pPXfcJYLBSgPulzXNjLOM4IAn6zJRQXgCpmlfiv5ptyJtxHc6VGVsOuZG6vdTrDs6r0CWfllGDQ4djosJoHeFRuUQYyf9qVLKrYm5tRBPFPUs9D96LampBKkyfyCAC2NVMEr8XDBKumezIVed+l1WQv1vHaPVtywx3PYloJkwcieNYhtmcxVQE6QzpXonXVmjRNM5jSehLazsUnJoaCMk7UcSfl559oA/KkHKkMaYQBosDnT4E1tL0P8+svppWeAxcE/PkLL3xJ78t0KIQ+IHFmGRSqpMk564zmx5Soxlgq+mumzWbXLRU5YegRop9Qkjk1eoozfYpCHTUgSO9iOlNcCecUxTh8LUVFp5orclFArWQztdIM6Shc1NHrW2GKXRqKsiqOMVqiznttqcLWZNls+SmN2dAKdA9WzKCclL6Tmizi6kANOLoHnZNBvE5npxdpDJ4z24w6QsTLvKV5Z44Axsm3/ISo2TznTKvArPRtDRxbzyd9DPFg65H3M9VmYEFP2msI0cPI4wJZluM/AAAA//9sXUtvG1UYPfPyI3btpo0ThYS0tAFaiQWwQWIDAiGE2AFih4REFxUL/ha/gRVlhbooiIhS2gSVpoSipEkaO3b8mDuDvteda4o3btpmZuy59879znceqU1GuxnhO4K4CRuQgigUc0in/X/ODddurMWPlBqnBzXbyXSS+G5/FPmc1bmB72QhIr1uodKE0ADE6PRmuBBGOLD7J3WlNcfcX6fSxGvqEEk3ulYX2kcSoH5lYDbhQRD9dzPa4EW6eL4oKgPEkBYXWyzpcxJdqqGZwBz1ktVEt6NInFMZgk1elkXE4gYam9FDgEJS4RtGQdjLG5ew3seJ0Y1SdozGxWYcaYbFyz10N3p4vPcICRVLkSRqS7wLE10Zkb37yx28+94HSLNzyC2GLp5p5ErExQRdL5kBbm5eYnp+IaQKXyDPjTEqOIh+7QSYWt98kR2f+wcNJE4WlmxSIhsPcfrkTwz3n+D88ipmsThTF0FpKvd1/jsgJHk2dV4eUAT5olAigjYt5EGvNGwyyCCX7WhlDUuvvYHBg9cx3T5FozxBnp/5HnmkueDQb2OqRQqNrOMR/XzCVP2lXodpnY1GipRRTjHsS6l7mUtHP9y0FEomF2Sw4GNwNEwuTrhZWmNDHXAcohjCUab/ZOKYdkvrJZn/UeefF7y8rPKhg847LIqvxP+6xfv5//zo8n8yjo03DQ0AA44SS0lvNOMi2LF/wwJmaPN7vbuM7vIGlhdX0V1ZQ29tA43ueSxc7AHNc4gI8SWH2ChVI6uSu4u5SgkqtkGk1RM0lkjGq2TAOpSJdEfovmdJ7A0Yn3uQWweHOm6FaJQT1fjnwcYi81RqLfrtgReaH+nLcpTpV1KmxaUcPZTWUjZDEoOXmnTXNdKxFiUsI0ljjX+hKKDxCJPTPhxp84+PMTh+isO/99A/3sfTv7ZxcvgPnh091Zi+kRi1Et2XsxGcmnuWVdQesa8CVo4UiK5qymjEHgs8XAVsWCprorIqxlhKOT59NvpmctY6ijaYtECTWYZ25wJW1l/AhRXq7F9D58ISNq5cwerGOhaXe2i2m2i2FsR5PxF2Tx5VMp8QIPFaxQC0MqYva+gohSYvMZ2N1VA2QWuhwXOE5TdFjHqUotOIcHh0gkcP72MwPJB5zBiSDC7uPFHHiz5bAk4RuHz9OrJmiwG2BgHP0zM++WBrCwe376B92EcrbvPaQJALARipbiwp3zuuJZigwK/b97D14B7btLlIequTUsZ2pIVo3T5hXDIY8umNL7Hy8lXUm20GMhis5/uaApNTYO8Bdm99h/bgCB0q6Mj8kR2rZ56CCS1AeDwSpTdNWHdtHQGoMZUVgJZykRErhcbBaIrxfh/5QR9FfwI3cUwlJJ00khqbc7oMGEZT7E6eYS8e4aAocERyFGMTxdEcs6Y0M8B2ihvf3MTb73yIxrkeCiedJJKkiJwmYvf5hGL9Tkfo//Qztm/dQvn4MS4Ox+jWu2jFTTSyFsZkspjVWS41PJlga+d3fP/bHTwpz9jlgbrGLoor1lMEtMko1M0Y7L700hK++PorvP/J52itvUruPdJph2MNvjyHE5GRuBG7+WP3IXZ+/AGDnW10ygKLScLyuGbaEGf80nnjJ6Pf+80iAzk5s1VoP8J+AHRfiHVxdlbJpijWlYwEGQzIJV0gkjWHVnmK50xVSyzMJD/B5TnJp0v594npQXOFMvejQjqnTPlPhcJfKPjCUbAkyeRulxgKM/8tkqQoWgNpU8uFJRda2gxy+oyn+TaNMN0f4+juLtKNRXSurgJLV7B+7Ro++uxjHB5+i8F2X/TaJiswWJGOyz4EwM7t+3jlrT+wef5NxO0We/YUSROT6ZA7+EQv52enarpL3pNKsZLo3k++F2MMBHGARDsvpAgjmYEVuLbeJIlldM/HxJWFMQjmViO/N2SZRyG+L8TaSoIuMI3vyWzq6cTWzSRtuTFAvH1DYBxXqtE2MQ05sUW9A5gJQPR863L7wrKSz4aFbLjPt4i4RDum1GGm41C3ma6TYm6laJhyZHcVL6gpRAGwwdKFXAz5GGDLsjmHets/W1dWAI2I2bRWIHKzMBG2DK3lsnbN/Jj2lPlCFn5e10hsVa/5yD3r+vNzO8tUUlGZcrPbepIGhozVwlSlNTiNDay69iG4w71C8lJot0WCITE9yhxQ0EWN8czUcab3K1HGsT3XSj0Wna/O+5+qIWvPYf8dOmUFhA1Oi7SL48oZ/j8JZnbtEv2Y+og5OwabuyuzmudNJuuwZ0YHCQKpT78o/B6rSqgoPSvCzhdevzVFDTASFkClHaZjSUEsufphA9jXm3z9BRfS0NpM1iEbI27u3a7L5CbV30mtSOarBJLTtRBT3MAAWyd4HOk5wjkZ1hc2Nk0ixA1cBnUcM9zoZXIAHyEfC9Peg1t0/w1kUzDQACSR64sfgLEtqOPPxt5kakkACHnp6fWwBwR7G1S1NY85ivPOc/wLAAD//3Rd224bVRRdc4vvicm9Dm2hfagKiAcqwUORUF+QKp4QP4CE+C8+gWckBBKiQggJqt6EqJqkTdoGnCa1HScezzmD9j57nzl223lxIlsez5zL7L3X2mulSr/RRRJSUnigtb+DN4dkpoKlX6g6AU7cQChnMghajUpFxCJemF1A4UDMDm7CgYtT6HRVrFSC5kSoKUlAkdCDF41MWLrpeE2wHx4k9MLtBeyzuOD6f6ytfCFtoDkg53W6BmP2ZVR6S3VTjGcEEPquk5wFZkRQxJpqIc0Et9bRWd11qX+ks46JA/qJahjwYOezD6R0jk0Q2iDS+XgM4hiNep1AbTQ3FtG9sIynf+3CnAj8xZYrha/4Exp9sL+PKSlWdrviPTEVqrUnOXM4+u+zAwwGJ+gstXzPrwYwFk7UQlFRpn/SZpilWFztYPPtc9h70MDZ6TFqCw3kxQjNGglajDB8sovFi1cQLzWRC21UrfTiOepURoIo02rzCZV0tVqv4t0lQqp3DEvxNAXQjRQr717C4uUP8XzvH0yGIy8Kpp+tXq0nkU6lBZLiQpSnLD5C9OZ2myhhbaZHUsGLaXTSA+fVt2Uu0HskLOQot6mjw4mADBUMWKeJBTMNJmbCQoxnwggdTx0526Ntus50jr3yD16P7gdH/Ib3I+l5N/KAKVzajyxq8N9DbqvpYBqlyOrLqLXX0du6itbKFrqbF7GwuI7O6hbKehtZ0/XumyRGHrneVcNZpxPThKxlzFWQS+0FlQCZ1LOp6hrFVlSDXeLPDydUPsmvKNErWlQGvZyJ0qX0MyULFyGcM5HYTpVKNwzXn+NYsLKxdYkDbcRUpCClawbEWcejcL+1tKxRwvopZCF5MsBg/BJHR330n+9jeNhnhL8Yj3D28iWm3C4zhGuicMl9DU6l2c0rowR9Cfwq+cY4vIgo9NuPfFombpVubksffZJkTpixVFKwQ+kipphlWF5bR3dtBb2t8+iubWJz6zJWNkiV/xya3SVG+ZN6A2k9ZWSb1hslE2dz1W3RgZrVlYxmOfq+gKUBVCnq84JqkcArMcRoPyCNCQr2LKEb5IQxBp493sPzvUds5hkzFd9y0UbXJPuii27E+QuXsLLRw5R9jzMn3Hh2Cty/h6e/3AJ2D7BoFpBxj27pkF2laMaENDQQZTUcjg7x54PbyKOSLUSJSl2wd7pbs6o8rwoLJ6bA9U8/xvvXriFpzgoKcXsbBShHfez+9ivswWP2UE+lKGe1dUTGPWJhWDcvqTAQFbF/hkMC0NK3xpTOipEs/canwLBA3h/g9L9jmOMc6VnJGjwLpOwsdOyC2Qol+tMRdvIj7Ngh+oz+uzaKihkU7p4xJjD47ObnuHHzC7RWN6A2p5zkMLMndzsaZYiDF3hx5y62f/wJ2H+Gt6YGbbL9JCeQrIWJiZA1OjAkuDga48H2Q/xx/w6ObY6BtGH4VRC7PYOvvXBCvOvLTXz97Te48eVXaG1dgCGkWTUvCD0pC3mmWqc/cPAUx/duY/f3WzD9A/TqKQvZEXOGmJKRshqDbcuJWFEST20XglJS4szU7twh/oVjAMRFYJvKrA7jC68cV5gyUBIJz6HJtHUWzlJIi2MDle1ntC1xqGGpQnixFPfpmUNxEPWxqfZO0MIlzH8WdqMYxTK6l7LoXeUBQ7okNdRZjyTC0cNDvLi7jbUr7yBb7aHTW8d7n3yAa39/hEd7PyOaAJM5xVmriTxpaBzm+OG777Hz8AmuXr+OlfM9dLsd3neISUIAC99nQkujRMTaIv8kjPxGb97ICuSWU2k/LcsqxiiK11OY548q1nSvVTzm5oG2g/rPBfRzeNCmArOigCassTYxYCjmnJCwtrfxrSyvi8D2LZpTV59n+EKSM02KNAH0iLIUCug7VZjbJfQFJx6aQHFPs3VxQCaU+xprBaReyR7S2mDF9izynv2W72+r3eL4JlSp19/sf7cktk5s0DAYYgWpJoq1Xpf2/L+SzwQJbKi5Nc+M8Pc/SKR1nGY85WXM6NxpYAnnXzk5LISOniAv8iqpF/tx/VuvlxNIGT/S9vGskvA32Fhc1hwyX8y4SVhPf0dYuFCLOvr+yDCLdF5I3NigiBA5YC/Mn8L5w/cKlfVw2GpgtO8Is8g1I+EivK7ChvPW8jqfIUJ7iTACFBT1nxE2B4LCWFhc0KKEQ8QNF/GMCYs3oXWiWoeqjoAWNhwy74Dlar449nZVANB5ouyA6n2dX3Quy0wGdpEg4VCaV5ljB/D1BA58lUip2nJK8i5McmaCS79/ePg1LYUEArHovLReSISacghqo6Z9LU1T/A8AAP//lF3bbxRVGP+dmZ3d7nZ3FpaFNoBoAcGoPGBiTHzywfhCojz5pPGf9FVjNeFBIxARwUulpdTYlrpbum13d27mu52ZLsXgeSEtu50zc+Zcvu/7XWr2Qsx69tsDZth4VA5iZPA5hbMkk8RfNGElZ5sEsglY1Z4FKfLCw0tssGY3r+rLyjAi5cVLBX3sM4YMa9AFKatA8SlJYL6snGFLnufKV1uogoOBegob/EkyUKKgyvcVRR5CZJlFVLJu/qEfgbkolUEpCVWoSaBK/4QAYPuRoOANjH1dg3KCUUaNVVwpYxcW/t7D8MWQkOoiZoI2trGwgB9Z7bESfwK0HPpLi2jEDfZxdq7c6E3lntpwtIXHq2t47fp53ujpoMdXd8p/doX6w+ZYX9/A1c4VVr49LvfiVFXdmX1PDvQWHK5eu4z7t9o4HIRsVUUTd24ux3DyDDurK7hwfR9Z3PI2YNTPaObvGyTd/5wdXeCMYytwQRVZVjgWBSRUcZzQ4ljP0Om28Oq7H2Cw8hDjhxtoFSPlQpawZtOBZ8IEcxHlsERzev+wwN5BimZthGZzjGbzkDn6XHmh6uKcvlNHDjwCpWOOf5ZifzJhvmOWSoXwMJF/2Y5Z4+E0V7G+kl33XAt8kBd467lKauiF82NW2A8z3+LsLfXPNZAV7P6Ow6KFxtxJNOIemmfOotFfwJkLFxEvnEOt3UOjQ4r9XWRU3SebuzAS/XWGWkk6JffdqmZqMq9HwMFPEZQVdyfJNBqJQMeVKwJOPuMC5+8bPmVTab4a50RoS8Ng702P8gACTWTphaVCpmqzTgfTKYd7vlETcU2uBge8zkTkskCK8eMR0vE+pgd7GO09xXi0i60nj/jnwc4mhoNNDPZ22M+dqntEH6nxwTxDSNVZtmPKuPIvAs8iUCnyGhIoMI8dYrNWfc/kQO9mxtaaRdXgsS0c6SvQGkWKuKxDjvjkabYGJZ5+t9/nan6v30d8+hTiE12cWjyD9skuizGS6CVXwrIpU4ZoP4Fqd2SBjodl/sunKkGG2fLp/2auxJmYRz5MTJLWt9T2j1BpSEpM0CCYD54FsLM5xE937+KvjTUWAKT3gyp1IipaBqkxJa+iJi4tvYUTvdPCcaa3ZzRCtrKC7a+XUfz8O9oHJLgayfyvJQinguQhxAdRw11nnqvOq+vruP/br9ilAzUUiVMU3orUz18VI6zNAx/dvIH+4nki/KhdYip+3DRZtp7gz1vfYLq+hnYOX8li+hwdJqLQU3RkbRdUWK5wjsKVT92E3vh7hX52kmI6PESy9QyTrRHyf8YsuM+pSeK4Rg1OQLKqNxJMA4ed8QCr011sWPBva6yUJBVhoASkyOHcK+dx8/MvsHD5TRZpNMVVZ/O1phZ/z4bYXv4Wq7e+R765jU7mEMfE+q+joKSjq4tCfFjHNM+x8fQpfnj4Cx4N/uZqMaPsUe4PdIhm28Qi5cRJN67jxmef4v2PP8H8uUtA0OIPsx5mIHtxaFmpwTbStVU8/u4r7D9awVw+Ra/TRJMcRXJR6yBYPO3rPunoRCSZDu2BLtos7sdifBknO6lyzRX4RBMACt/PNOh2uXlh64rkRKiPn2vuNK0ulrEixpYKXUa/bxOM6R40Lo0aO8wQa9kCKqfrCd/q9Hgyl1QVZXy8o0tRJgZYZZophZR27aCd1DEZ7mJ0bxODK+vonl1E4+oc4qUe3vnwPdz58QEe3N4UvxOzFVTrRUYTUuGDktt/jHBnbRn3vryN5okYS1cu4vVrb2Dp7UuYP9VCMd9A0Q6RNnIcpFPRWqh6m1fWDx4TE7Cz+ZALBS+YsaszHu7RBO+LW5VTXd0XLPAVNIVjNx+/JjMnOTnijR86OQ+aEDedC8RFK1C1c2lWVY5mEKFVUe/jRKb/qwmNVnnVqQhvEiS6hBVnvvIvVoJiWSue9xp0zQR3vAdwLJDxM6FiCOliUd8IGSyQfykcWhxRhT9bnMJjUcg9UVxgPGtLMNj9onIetkqq/S5QwUqrhIfR88+nWoXncQuDoyeHmfCiTKrItQnhQQGfiedVkRfeDu8lFbOt/yzQaPB1pRtU9SgM4i0V5LrXRKsKQOZWVX5JKrG142KOahE3NbRJXvrQl/3PUYSBF8mzYibNKeprNkNBB2vKCfc/Jf0qC5pZpFESPGme/693era/lpgyFDzFq4TAMU0DgjFLPCkFbtIpKe9Pr8tGSHrG1GQCn0Rp/pC+QJBLhV+R3FStp7/PCY2ZfvE8z8j1hc5KNS+YaWMldAah2VeTe94GWq9hVAlvg6jUGhHYFAe+JJ3iXwAAAP//dF1bcxRFFP56Zva+hMiSTUhQAgS0vBRVRq2ySkrLZ/VZf6g/wBIftBCMJQgiYCBQQgKRze7O7s5Mt3XO6TPTm4R9WaBCdqa7t6fPd75LUhkNSOFxeAK4WI2DA8KhBS9aEUkH4MEMkFWaMHY9jAwbA2rRTtE9Ydc8LPqVHiEbgSnzVQvf+ReDBynUhX5UiJaPHoyJp0Z6xNS+1iivQst0c6PfRWZ8ZUakjzNxhS2L/hCRUT2UoHiq/xDa9szTxOgLymWij7bi/ARPjSE6GGn4qPif8eG+kiYoIkYFvw3oH4XX7k2njukyBKYc9g+Yu9cokAs4uR9yprSeykVTXe/UsXimj8WVJTx5ssP5+0oRVs07u77mBltbW7i4+QVvvC6OvLlXzHoifucH1Aw7OztYv7iO5sk6RyAfNwfsNkx/rkVczNJz7vylc+j2+qxrztKnaNbqGE3GiLIUdn8XB0930FnuwSbVodaZuSXn1xDluIsE4AjCXh4EAoaA1wKIds0hI3OnOpDWm+isX8bqJ5/j0f495M+niIqxj5rxKC2qw531XUeeXyNxZ/RpaQ6kBzlqwwFeJAM+JLU7jTm5iL6KWQ5vAs2d/EkhIgPV7jtf6DvtgNrQWKsqXvS3UvfHanxhqdWPcHgbV+OkUPI4B0yohpvnXN5JLTriTPsGR/Mh6aK/cgEnT7+F3uo5tE+toL60hlZvGclCFzNye48amEYJUicOy5QRXPNIcVZod834mE9/HVzIiqa8YN2r//4alPpmurHCzx9TXimH1xugHb7XOT1oSY+ukN1SLhIMgK4bpYSVdHgukAu+1iSynLPPnvZc9OeopzNk6RDj4YAZNJODAdLREPu7z7H/8hle7e0hPfiPAQB6T+yUajYYitLCmMnk1L82Xt+qB2xTFvbz88QShcgzb9Rc0CmQZ6SrW45qNac6AqFlHhVuUb2OxaU+1s6uc77+xoV30V85i6XlNdQ7HZxeXWP9abvbQa2dsBSGmoaEh5DdAq3haSGRpo1Gkw/kSnuN4pDeXwVKMnjCQJ7QjiNXBN8047uaqK47YG1oJ1PotBF3XNifgwyuyJnXxmxwtn3nLu7cvIEiHzO1m1MybOULImwfixZJbqIaeot99m53wzGnKowePMSLn35G9ustnNgboRt1ObLI1AphTxnRWufjGT/Mo3aHWTrX/9jC7mDCndcpP6cMJwQ4D3JFFcbE8/H25ke4dOVDREmLgRcaBQaTKA6vmGD7+jVMHt1HczoW5gDtP5QM4A8pMcQFXmeZ2BbcNfZu3/wcYoqKyIxoZyE8xQAAIABJREFUM4lojHIDmxYwgxyTZ68wfrIPN8iQZJ6SqAdhSgQgynU+w9hOsTcZ4TFe4qWxGBqZf2a6FDrVthT10340sRZffvMVNj+7CkfPbw/Yi8DKihmDy+D+uY+nN3/Dwx+uoTUYoVdro9tqceff2ZjjHoltlXQWkLoZDgYj3Pn7L9x+/AD7yDDMZQ1a71sSWWFbEIBMR8B2A/j06sf4+tvvcOriJSBukrct703OF968807GQDrA6PYtThzIt++h36ixFwsD9R5k5ag4omSiiowxTun/UpQmhcRa0Xywpp/GPxPWoSGTqVwYQgpCOt9k4JQKRa9dzvsxu2KEIJoHQ/k5h4Al6NkLUrRztqdQ7XOBj0VOGfH3T0EDAkqcelM4NamUTjrF0Lpczlr2CJoYgfJFGrbGnhUncotX23vY/uUu1jZ6WDlzAlFvFeff2cCVzQ9w9/dnPMQu8KkJT3CE4S2YGoqJwyQdY7qb4s/7/+LG9z8ifqOOzvJJLG2s4s33L+D8e5ex0F/kfYm9dYktaTPe03JTcOHAQENZDIgEiBkp1G2MhUpLHgrUXS00YjpIADriaaRnZN8aCJ8XCMAG6VwaLuQ0dUrPaXzWC7r51kvbylQg3zhS47RpLszUWGOps2y+k+w728e9wu43FVrOd6RTX1DTep5NZ0LN9k081p97BoBmjoeABQGLifcp0OtRfbYW8txcK724Kj+D8tkbV5pquEDv73X8+ncFA9RHgTP1A4BAG5vV+Ff/VsmWxQ8rzyOEcuiSpWEqx/mQiaBzofejlO3DtPD4GIluCAAoCKBzRYUdXZNS8ItivijWz9SaQ8efGcX+Zwp/jy2WVs97AISMA2Mq7xyde6P+C4EE4HVrx3lJTQV2id4e3suI98FivqbUs1Xu14UkxUVHz+fBS9c6vZrtpi+mvR8CXDkeJvBXK0ERquOMgkJH70Xp/1T30bvK1dVkMwS/tHF9+DpD9g5/Nv0cSz0ytNutch6Z1e7vnyQGLP0OTQ2D7zjL09k0X73iZA5F40/fS2FQHMfo0XXC/09TPco0B9rnZM0ncYz/Cbu+3yiKOP7Z2bm9vb1rrxzYIoUiERLUYMKTiSa+mPhofPHJxL8TfcMHATUxDYY2RVuRItQW6JX7ubc7Y74/ZndbTWxCaELY9mZmZ+b7/fyylCtYFjPe7OmCFozywmZFGoJIjTziKD71Q5rRFk2ENVJdozcBiY60O1dKbiPFIakms7mHBtOJ5vOsUrACAhcSAAgtbydtvvCS+22SJnVB5QuJ/+MLiKleajHvk1gOKpRK7u4rbYQ2lCqugfTZgsyGuL6zBonUdUy0GXBKAnDKlVQpwGRTFsmCoI127grWNfFEF676TEHXQRO2UGOLOBj5xbZyYa0bBIYpqacXdI1u8/cFqiZCpPqrkLhA8RpII6SDPgZX1vHH5j4iN5N8cqVIFjovhEI/2t7CZ6M3aC/1mc5Mi6lla9gqbE4HLw4wGU+Q9ZKKUdD8CogCd+d5ncSMXqyvU8zXLezu7MMUMbIusT4i9DsJZsMj5If76JYfwLlWRWks9LOaULDqqSxMRM0L1oQAWVjyV8jZlBdXgKeIEUlBPwprcEKuyxfOY/mjT7A+fIbH3w3RHv+JBDRGqqtEXWyJAdwZylRANCKRFoTqfTSc/29AEY3RvFGY6VtXUftr6YL/D7K/Gmx5yUD2Z54cV9fxEgnpd+MIM5K5tImWteBLWNoS5Ji2AkZhohab9pH/uI0zRL3zWFm9iva5NVxYX0f/rUtYvXwN6fIKkqUBpnR4t3vIib7phKlA/gckgXF6oaQbFa1hOWwdKj/+YCgYUKUoHGCx6v7/PV42xIWV4ebkNFItDE3BFyaJIvWi9yfE39XZB567y+LaTg2JtJNgMZtLc4EPZ6E1WtZFUw65hZvPgPmYvSuK/BjT0TGmwyO8efUXRkdPMTl5hdcvDzEevcZkdMxGXOViqlFJvmqrLPFh5hCXod0SWDZ1RViijt03ui9qy4S/o9+5zRck1SdSsRjLvxXcBbaC6lDBbWnvJyOaDssvnE2Yrr8SkP21Aa7dvIoLl1ZxeX2DI1O7WY+LxiRJVbNfX9bzgHKG6Eit9fiSBdE6R+xOrnt1KfpKpiuG19P4yvCNFa5aUAkqKIaErlns69xZI5l/VLwQq6pQzTWxFwgtT22GFr9QBZ7sbOPBnW/x9NFDGE8xnIQWCiLPI8XSiRgZ0/9muDjYwPnuADicAIsxxr/v4uW9B5hubuHc0Qi9udCgPVcaoo22lnLbU5aYWUuJAA7bB3t4uPsEr3ygNlo+C4IXPn2OJYqvzOe8cgsb48OPP8XS2lW4OCMluqxwohS4CZ7/9D3Ge4/RL2ccL0kvak6mh3p5YfmHE0f3UimIaF4iCUGi4oZy3wuPMvfo2x7MAnDDHO5whvxgjPL5FNFxCU9dSJoTE2MRR5hyxneBPJ8K2yGJMFzkeOlzvPYLlgExI6tQPbnuT3JVjblL1F3t4/MvvkTcyzArRUNLTRc3n8J0rCD/z55h7+4PePLjz+hOciybFFmrizTpsTqAkjuYZdICpuYEk1mO3b1dbO1s4cQVVfpAU+YDZRH16OLngI3rF/HVN1/j8o33uJHpS8s+HNWOSuNazIDhIYb37+HvXzaRnAwx6HSRxhqzStcbYkBCMq2ZCbbIq3PJ6QspMbpCOTWE9BMKnHs29yRjPmIDtFxgodgQD8J/XBhBHz6QNsaiqHG2KeVfNfpe23xVw9pIwzdiI7AFj06aWGmQ5OLpQYUcSUSMl3kyRs18KJGGCjHS/ReCAJeaI05JGtAkG5p3y2ablotrosSRZCR6E+PFr/tY3tnHysbbyNoD9JaWcfv2LTy4ex/bOyMp/Bt92TBfxNbgPYMaNkZyzGlPSQlgOSkwHx/i8W+HeHhnE6ZD02hx7cZ1XLnxDt59/yaW1s5h+eIKfJaiaJH0RhoBpVpA0rglxJihsS8lgpli3ApqQBkxjFMRP8+1FFqtBoLqlH0F/j88f6bWLtPA03saUOu4YSTGPj/UjLJJvbdxc1mahE49K1geCrm7LUotssgUkowOS18118IzW+2OelDVclpTFY8lnw0iJ/HcLKVxIIZihSYnHSkejcdoKhGAoju24pnELEZhj3CRH0uOPjWWJG9e7iFysoukmMac4/EYdHQiqUrq5kKghVOhw2Mvzg5SVGrjUcMb+DnguGthk5ZaUNPvSndt2r8lchlaYMvhEhzcy+AmbWTOqHntQwKGeqMEZgG0SAtNBDZEbwvTgZpGZeTUF8PLvMWeE2eoyC28q0wGa8Te8XyHYjygukYbADIBlseXgD5GyFWiElXR7ZK8MZ1MqrhDp1GakVEer6tjzecL8VXzVeEZVWaTAfwJ9QynGwQ2RXgdm0wDTZtoMktOyVvOFNLNr5ZGLJJchPY9uFpuIUaDIR5xgVbbNsBciVKez0VunliVBWhyh6miGKWB7Bts87I8499Bz89pXcm6DXVhuHuEW6HMmbAAQsFOv39ogoXPGbT/TP8F0Ov2sCjmVYOB50VB2YqlzfKSwIYHsiwTIDqKMR1TXo3UvDQnLP9RBlLWlTQ73tF5vVIShXgXyfMpDcCyCbIU/zIOgSFEd3wA+AcAAP//fF1Jb1NXGD1vsuPYwcYkKIQSxkAkxJYF6y7a/oLuqv7ELrspajelLdAqqQChUqUqCgnEcUKwY7/pVt/03n0B1RIbG9k3d3rfcIbYDm2gliA0CRTkzuZpBfOxTeEn/KYF4CtZwoO+wEQB83rSWdFaAxHRGxC+ZIVCoI1OSThXXhPpzAdysO03aLwiCJjwBreftipHZYVSdfqDqqjQrAbKZqm6fZ7XP02cWJzU1TvjmzhV7jfuic0bFA1hFAnjpLA/tcfhCZSmYMiBrGxuSqsYWrc/Zo/rsNpsBT6GyfgvoysYmqIV1ogFn3tUrWMAJIsJltYuoH2+y8rOsUFAdczE2aejMX5/zInM+nAo6S9xwOaFJuACy2nHbcyzGfb399Dv95kGUM2hq8X26t+XBJUC7qVugOsbm3i0+DNOxhQIOiyQcIaLkU0OcfDqOXr3HyCIOwjioHIBgMERNdH2RabOwpuqqqXzut3O+yJNAumteRRiBGB1/TqWH3yO0WgXbx59h36RoUN7jxJmVUAPAg1wyybUuhY/rANQP3f9P5FhB+kO+mB9/2UpfLPnX30zv5958w4J35XX7Sr3A4IpuzLmS6/IIg5aaL0nuSgxU7kgaZ9De2mI1ZXPMFy9gotr15AMVtBb2+BkvzMYsFgndflTF4rqt4tEmwDQAMexnReHnxaM11iFT/6NJIhn81k9ZBrzoUlNBQTQwLkMG/xnXVj2SxcUjtqrfDRtpT6MpZBXkO8xHAeG7STkTh15rdNd5bIUJ0cjuPkUk8O3nPDv7bzE9Ggf473XyKZH6HAJMq0IGuThEZNFXmjWLqqvoomR5L8MZPYUt028MJJgVZEvnPgy9iZWUzWRpmQb1VCEqwiyT03VgqkRpAIbc9GMPPa7gyFu3LzNnX1S4ief/eXL6+j2hxgsr2Bx0EO0GLCQIqGrQuNtknZKtW89JM2n9rJCuQPUgm9W0A1CSTpEjV15eMpPrtczslxGq15C3GadBzp77L+LytKs1SHbQvoXsyAnOWCcjqcYvz9EOZni9N07PP/tCR7/9BDj/deI4oyVcWsbTKe6CdJp74UxLrUW0D9JgX/eYvp6B+PtLaS/b6E/OkFnJoKpBaOulUNNNJ10Cucy/oyKzJPpe+z8u4Pd8WFV1Ms4+Qir/cw3f1qqOn7JxZgrt26jf3EVaSFlgo5igA62f8HuH7/iQnqKtnoVl2e6E6XR+wpDkZ3RvyjFpssxFD1GN2ojpErdcY7y7QTz3WPMdg/hPqSICqGwUGBLbukZ2SgqVCngd1LMgwiH7hQHmOMDCqT67HDe6kOt5LjA4Up88eVXuHn3rqAI6JEShxy0t+gH8zlO/3qO3cePsf90C72TDMuLPbSDBFHQYjFGbkpwqzrnIi7FMkfHB/jz2TZGJ2OcIsO8oWWu+wqlKt9n6C3F+Prbb7B5/z6CwXlWsYdBl7n6SgHqHDgeYe/hD3jz9CnWEKPDVq6BCCxZIJgbhMM15pk/L8TLH8phpoqom2UscsfPUSoK5UX9DAkj6diHgYdkO3sXuoqr3XgGmO6DiQE416gRs2zg2cvPie0aIS6iQoUbIC4CpbpAUWzG9IQ8l4C7eqYFlXikPdPM0STQ747KGMP2kPVM9rdfYe3eBnC1RLzQxeWrl3Drzg28eLlVd/5dfX2HaIpHBno+6XMq7FEfolWESMoSi04cGd2HHH/vvcCzH18gWfoe3ZU+rt27g0sbV7G+eQNLw3NodTtISI8kKDErUhwXE75sog4ZQrY49mDLrFji3DkVpjRJ40Ta14yBNbzqgUqn1m5ygQLnufDcGc7fEQHs0rP/smTQzqpTXSmj3ME75xa/uihsJBb2XZR8kvA0oxk0kW0kaHZXGMJNfeJD7ajOlHJg3vA2vlBjYdP4Mo47FPXAjgXthO8W7vJHwkWWsNlrkLkm596cAWCw7LAJUW+pn7k1WgqNn2vKq8xDOxR9JbYv9zzc6XNJnFBpMNk8lnktsu3zsc2S0YTH/XWyDrJ444csIJlrUYzzl0ST8vJj4UWar8xDNJiNX+kJJtqYbX14LdSSEYxEFAiob29oY6TcjdzVTPSb8gJfTI8LOZQraIGAxuK8HKgxr2FTH6Haa6XkMdTQtT1x9uVbVtq8cq5JNIZA1PBpnvgMhKJ3ZcUSik3haTeQ1gKLUhoFRYXSaX8b+sPWRfZk3fyLvLX3X9ZhpzFWzVU971JM0DNSCH2bRHELwuUqfcQ0Ari5odx8nl/eA3Ku6ZyI9pdogPjn3S+SsMimojoiRgBIg9mQ5/Z3pqk2Ght7sZnncUNZkfTmOkb/h9aZx51l+A8AAP//pF3JbxNXHP5msZ2x4yQNCU7KEqChoT1Wai/tsT1USO0/27+hEiAORCogECQkITsEO/Z4m3lT/Zb35nkC6qHvFilxxvO23/Itsc+JYU4/QTLaDfZw9T0fqyP8AqzIH37yTZvZejXTIqaJFBs+6XAXReGEAmnyxhbC6NlQ2E48LU5WKY3jmarODM+eF5jhzqXlc4mfpNim5QpNoc8gyBNPjqcOaYdPI/CpAFZRlB0PmqLuaD383fPQRV6LXZXcHvpQNALB/6fD2QLAWJ0A7KKi7xEr1IMhM7qAUIUy6yDYj69oaqbmysHjDwri5tsJOhtrWFhfwHl3wHGEJMkCBZzqGukOL/Dy+TY2H2yRZSwmqpHA/H+1VKL3MRhlONjbx8bGHe4UopIAQzddqFBP/pl491GMzfv3sH7zBtLTF8x1JaGbKMpRn/QwPN3H5fERd5xJPGySG+9y9T67UgSAVwgIbYKhqIFCkymChGZhWRgwCpkfZQXSZhON+9+j8+sfSAfHyF8/xbh/jnn2jdZLIi8TIF9h/f+OyDnJf37kDoVgh0et4fBNDnKr6s6pTqDV3gBM+aD4li6SCAmyvI4JdfiTr7B4rYOV21uYX77OKv2Lqx20O2sMs42TeWTEBwxZpxvDPGO7Qu5WmEAT/hAZWR+ycI5wj5zoioOd/xcO4vMjKK4Gu3bumU7gJ/9BGahykOs4ztUCkeHuhzwX8W8N6nGAiJKkNOVEPxv0kad9fDg5xPnJOxy9f45+9xh9KgRM6HIa8ppoRAUagTwQW+xBhAwDLb7YolPhIVEEtJ5pD0ct0EQ5QNASrLBg4b0ayBdW2186hGQ/l7FtAnUlyQdgCc2lFbHY66xhcX0Na7dvs+0eKRd3vl5h7+L2wgLmWk3uYhdBGcQLfz/mXWqFAI3jcdt3KkHaF3S1ZnaoO5fCwHVYeFcqYiHwqD2OrquaBigRi1ooEFVycRckKELEomn9PjDoDjDu9XG8+x5nBwc42N/BqH+Bs/dvcbq3i5Pdtwgx5CS9KKyk6CxcqVYYXIti3MoDzL86QH6S4uOrFxjt7aN98QnLFMBRMsTWhmBV/SAT2HVB1I+pIC5I0X3YvcS73Xfo5RmG+vli6ZiVonQQQUBLvbr5zV3cuHWXNQi4VEDRdPoJ6et/8OnZYyymF6hPTVnEcgGF0nkYbSf0AnbEsMHcTGJqGIJO5ZJgGsBo8j856GJ8/BGTXo8nnvZ4zHx/ERJiLqaYlMnaRo5xMcYZUnzACAM2yYtnPNm116ixRo6l5WX89MuPmGvXVXMn425xvSZrAudHOHz8BEdPnmKum+JavYV2vS3oJhWrJTGrMBTkDJ/nwynOjg7xZn8HR1Pwu870febecgrZDlKKRw///A0///4Qc+u3UBBCxt4VfEZQEjIFjg9x+uhvnG0/wyppeyQJw/TDyKiApEc5LAI3HYRsMwr7p0uC7jtKoA0VbSY5wpQKiWKTxd0gOi24mBRJB89vWgTw6C8a+Km2h0VQXRmFLQWXZ165L6W5wjBrvvRCgXpNQxSjDGY0FdRRLn7SFIjaDqjlytjT3HXLvP8fBBaiHDKmkOgWSVZDy9SQ7pyj++YQ7R8y1iG6vr6K+w82Yf7a9nU+vd3uwaD9+bHnS8FGDaIuT5Q5FcZtUtGMAva+wSjtYXvvEZ5Gj5C0E7RWFrD53be4s3UPG1ubmFtqobm4irwRIiNEB9kQX16ylVEeqnYGdQIjW08RFXqnVYFq3BFKp43FFgSRljQliaZCF/RMDYPQUVstTJltGrWoYyH2YaWBE6g1XliBpudeoCWe8AKdZ5u9vCwEil6V/F7E3V7RGyjU59y4IsJE4mNt5oWRONRwEUSf3ejasArmUORqndw1IqtcblzBANa1YEaYt3CIW0c1UBSjHYN+T4svSieoWDwGCocndx1r6+avHfa5t4jbrEy0fRi2IHU0qbKK8nonWjoDoRhIx6fRqAlCtya8e6uoL+r0NZd0fS7+jj2dCeMVU+ChiOn+EDqBNDgJWcvJrWqdTTPxuGfoviKELTze5itWdyL33Bq4A6/CjoHTQzB8Z0Res9OtZKUHlNbrJf+cchJLZf7S8EU3RZNA6RpZxkWqohiryHxFBNOCH/X70HebSxJ+bkZ4ZMZRzU0Fic3JLiEekib/PBymbr7td2INBuuhrwm4W0taCPMHrR1679Yp4eqclgUAtg6kJi5itFrS2bfaB5bTXx1csFfuPgnJRqqlYZX/GZWk72FGnLJStLJ0Ai6c8llDdzahWgW1xX8Hg38BAAD//5RdWW8bVRT+7sw4sZ0mxdhtGnchpBVVn1DhgVckXkCCn8svQAgeaJEoVVWRLpC1ae3GjR171ovONr52UyHmIY4Te+y5c7dzzrewCCDDuZxwacj2gzoZXfeiiqbTBhXEAMNq6kXbL0xAYcdhHaKGePUb5KlS73uD7McB7wSaIGCIvfI+6huiHdUSE3KzKpkEicM/Pa+5DnUnC1QoLdQ2X/3YiY80wS6MQ2STT/370uAN4S/CR4rqwF+sHaoaXRBp4B5OAuY4QN8912wrNHkh1IPSuBmB4IUMdNroMIdwOboNjkonb8tAGofKafAVh5MO8dRJ5KLpsNprYXOnj5OnR3qhEihb8FJyrSrGn48e4NsfvteMVosHMEvgEfSkkkqaKx3GozFOh0NsXOpLm/slPp8XBWz2NVZ4GI3HK1c2sLV1FS+TFvLiHI1olQsgaZUxrHpyuI/W9mfIiKhA/eOCpjA05ELCwSo0rta3Uos29Y2vqxZzQADX4hKHMe2LOl189OVXuHN+jH+QY/LkVzSyMW/4G1q9C8dz9OFb9L+P91McVf0z+kAI7YJXRSJJBTP4KhQFUbJvqGcf75V2B821Hm5v38NG9yY2t2/j8tYOmr3rWOn0EK02MaXJOkowKyswOCkRfiQ5EpBtFy3GhBySLLb0GRbNUgs8xLIhCtVq/0v/hoVX/NxVJLxAc0+wNpHANV4iTFS1EjcLU+Upt0eDhPuSSF0sFHLPglxTFtzLpuRxPsNkPMBs9BZvDvcxPDrA6fEeRq9fIZ2N0CSetx8iiQq0vVgyOpUXjEuFk8+JCZK08FW9GeQ2QBGEJQHWwxkNQr+7qWpHThM5FdcwyQ+7cOIUQTDRpNnC5c7HuPXJDvo37mD70/vobt7Alf41NC+vo93pIFlrYWUtYbRuFakQJsGBNfo26hK0ityINDQu/Xs4EzskILzY/3p5uoqUjC2bKq040GKng9abtkLQFLTrXtjwK8uD3j6dpJicvmPI3NtXA5wcnODvFy8wODjG8bOXGJ4c4Ww0YG/xyfgNP65GJVedCw6M7XPmCQCnNKh2UaFDVp1PX+B0uovs+BCtdIouVS2ylJOEPnGipu6Nsl5KYoYSYhHZu2Y4LVLsHx4wHD3TaxhT1UQ/M9E+TLNp00kyZat3Ff3N6/CzFI1yhmTyFoO/HuPwwc/oktc/2ySh1rFwysO0g3VsEgnCef2xzYFxu73ARFl9YepRvZvBvymQHpwhPTpFPjpH4qi2n3MlOaP1v5IwOlZIv2dPlpgD8Swiy78pRlT917VoeW5iH/M84/vb7/fx+Rf32Ukgzae84VkhTH+WIn+9h/3fHmL46A/m/F9rb8BlqtPghO7B65oQDWpR0KP9I+zu7mJEboFKocqX4slI7Vrpjzt31/H1d9+g1aOkcpsFoGw+4fE6myDfe47h498xfvYUHZTYoOpUKRaekU/VWTMYu7YQeIGoW/AfsSaD/N/lzIeCzyTRyBZ0XhJanvYesdjCXbTUmyJ/OLY+vCWIEPtEk45V/b1MaZLnPBZGkGo2Zhlw7pFPcuSzEmmWLpA35iNyeZyHCUF9cOETmhMTrLgK61UTZ4MMZ3sD5Mev0eh2EK+voLnerpPxc2TcxQsEryF+3uYmJ8LVQYKUE+2pLAXnobaESemxlqxwwJFPp5gMpnj4/BV++fEnrPc2cHX7Jm7c28Gtu3fQvbmF5noLnUsbovhD9LSoYD4xUbi4kk6ILpfo/tCpk0+kCC0L4Kw/qTBYKftqLvTEDWRUjdNEIIMtirkrl93YKvR512u2ohjt8wrzitcgb15RF6oNW+pFMVeCSYTVKqK0pqapWOwRrdLs8yzRIBVpCWStOmxVY6aSVlVNFUYdMEV18Y1Rulq4osDFgnsLfMmRgu2NgyQXtQtVrUu1f0O82LGNY25BFCGGzfXL/l6aADiharxUbKHIBIpbckVMGTrAV3NRtzB+EcQiVG8rfw9dYXRdU513qkAvgnE5B2zk/GRCbiLqViwkLKw4WWkgbue372Vq+XQ+uiZBYxT162qbQ9VXM2s+Q2nQ+4pSOPGcxAkCXGq/WlScnMa074RFWxbAMz0CFWO3+IsTCl76hwiIxkG8ePFh2giWLIrq+FCr7Xxd0dyFLXAhsMIrCzYmJpDn6vtgrwkPSvIQXRzmQJAYcpveQ21u40QQbSwIGZxrnowQ63uaO/h5oPRP57SA2wq8jGpXBzl6NOFDfq9W/JcTV/UjS7uoxoH2K4qH+byKDqqqbO48ENg+WlvJPCB0SUnuSZ+0PseudkmCfwEAAP//jF1LU9tmFD2fJMsvbAcMJJAmpANMp02mTDfddtVV/3e6aNpsmnSapJ3SgBNDjLFB+KFX574kGTqdaoUZsCVL+nTvOeeeE7B5QuiKaAaolJ1ubNppiwYMNK7ADoJvosQQt1W3zapUxCuQrDJSxG4IAQQqJ5fQWydmDa12W6UiCSM8UBOSmhqMENOdaTyCr5EtpWxqVVphW6AzK3mB0OcqI7H5eDJtaBc3u1dp3qFIqO1rmSea6QmRPEpCeWoV1QKbx1CjWROEKtOf7fMMdTIzv7qOQJhTKt2cLBujBSUp5U4m7bCCpYpGlXIof0WpYeqI6tZoNzCJIoT9Bjb2+hTdTcpLPisNloKnzJQkzDSmOD1+i0U0wfr6fcwLhWbQAAAgAElEQVRiKlgTbZpFmssyVVpoFksMT06x+2AHzbYDAeHOmYGQyqszFOwFPzcdsN4Hnh59hd9/fo7J4BgtLrbmxE1jGl1icfoeIaHyzT7VrGXTbUbxt5ad2y6n8nAVyIHnzyH/xJ4GyroGrEyha0N8LGj0leaEZ50W2t98i8duifOuQ/T6BTAas6MzSZmElTZp5u39QGUf8L82V8hmby+qen4rr1zlvW1dIe7Yd6UPh4+QJfosjfJD9LZ3sP34AGubO9jd/wIbDz7D7pNDeLUOvHAN88zhxvmIcvGOSAgBJkf6XBl+ytPW4VrPmhCaqWcTTxQGNHIfx3ydhDoik5lvxJ0jK9eDf9uswKiFHq9HIm0MWIbLciuUpjPUZNA8cbycsww6lAB0jdmKkdNcbzoTk77pGHF0iXR2jcmnM0wuzjAZvcdk9Bfi2RQxzT86MQxrIEWHWEc2e1tK06/OW6l+D2w0pk7czsyf7FzmZfynSPsNkfVWGFMGTz1x+U7tashVwkeZ6y7APPOx8eAh9vYP0N/dxZdfH6G/s4PH+wfo9vqor3XZwZ8P25VGksxiuVKtkpvqgR/SJQBARUEaewwE8Ly+AWtW11dMj4qdrmy8jlZ+RfN7dM2IcV+CkOa8IcdI71APiBUQaXnADy5O+eKvjFVH1B/eAONxxADj5eADzj+e4P2f73A2+BvDwTEmn4a4HA3hE3hEzWZurHqGljlquIxNG61dtta/7tcRcJcppq1rQQPBdYSr12/RTAP0yKMhz9mEh5pi8k5gFtAz0EeBqFjW+nqjhSTNcDw8wXB6Ufh55PqB1EaExWS3+FhQzdsLQjxa38L2Wg/edIpgNMTpy+eI3rzGvWyGOu0Hze2m2QoEWHWUzivPLJto9HPLnRcGgRqY+CpBOE5Qn3pYDq6QD6+RXt2w4iDOpSZgXwW6ZyhZg3k7GTwJ0WCZ/dJlGMUzjLFkcLAEb6pNIz3fqHBb8BF/vn+I7jqNNzhm/gMqaqYXiIenOH35EwYvXqIb0RhGjZt/ApnJZJKekRyvRqw5j+TEDOTezBcYfBzi5GzM6QM3CgAY+59ro2iGiJ0u8N0P3+PJ0TM0NzaRu1BYXZqbpMKc9PxX5xj9+gtmb35DeDnGBvnyGEqcJoVixRKfVvK6eTbZl+cIG/tREbYQlQgVkosEAc+wQJkoj2d+nS/MlJkue4HmY/PYUTl6WW6eaODp2itc550yz74y/JkgZlQjURQdrZ2LFEHuYxEtEFPU4zxl5p+/5JjuyYDCM/9zPbYtKdJZnEY4Qg26WIqiBsgZmp6PHjq4vjjH7GSC8eADtg93eGHd3N3C3pMejv+YyNiawwp7W3yvTtIbCFBm88Q814BHAnbUJ8BlqBPATcpCPe8hg5gJ6p7M29MykyxlfCf+OMXg/BXe/viKX9/buoftRw9x8OwQ+08PsfnwPrqbawh6HcyzOdKQ5qkX/FRlwJvqViIKPPEUSHXG3FKBpMbxZB0j2Xou5BnX1WTOrG7ntM4a8cVGer6ZCaZot4QYy1Q9yc2w3t9ZxbgNlQbESLaAWe+wbDCp7qRmu9Hkz6H4Rk+TbOhabrebmE6nAk6oZNhZs6oNoNWhVP8yYRfYuOnq9WJNk/2OAUC/9Bko1i7tEei96Geqo6N5VMQm80hbkqqXVyn3tnUv1lg0p8Zt7JeFWjG/T8dq7vkwsjJdJS8DlXDb3xEhmlWU0HFcHovFeEtZIY2jjCKXzLHV27Qv9P5ijqiGc3lp8l3tnQBLo8griWlifG4ASqZgSavTWgEsxFvCL177ChBY0kFBhhaghErLqSFkE/es6M/yW6aJ7NGm3g3W1/nKeBNIkqg0X0zGY41FVNIzSe80qTRywZowbaat6bceT7a7yKaMHtztd1aAM91CVaPYuS0JXCKSS4Cuqh6oXg/VzzBAgACK4u9UMSMJcgqO3VKCG0FN24rJoI7Fi5K8NK/k/yliSGWja4bvgZqsDax0YuBLQA0eg0jVv46NMek7pCbfpP8a0am9JytyvQD/sHZtzVEUYfTM9OzsJmHJBQkBFQiKIg+UL2r5A/zV/gBfLC21FASJJZQxLBuy99tc2vpuPb0b8MmtSqWSyk5mZ7p7+jvfuVyyqDTXf3PZtEHLce1KW48vCut9qAhOGk18PEEMEUrT9RgSbw6XFo+ik6aslPJTp6ErnmXNQyhGnwLtwR4+arDACyt1zTmzeTMWpWpo9rSYOBfcP7nTbuAEZ0g6ySGP3u8jt9VEHVmJfiioXB3o+qzbYc2I6HXo2JwDSnQqduKvA2r3tq4ZDRSnBiBmCGg0mE2UcnMSxIyD+NhCGUnXQAD+natRdRLs3drD/vUuZpOxaDR5gwg1GpPNP5mYPfn1R3zx9Tfs+I+0ia9KvHxmjtQrS/R7r9lALXMddUlXY7JwSpE5US29zvYWcPv4JvYODjE6PdMtnMSddXyB0fNnGJ+c4Or+HqpOzsBCoN7HnX+PSw+i+GXeEqRxZ4Amky45jdOMAAp16SXaYkYc+WKIqpyw8WH36AZ2Hj3Cm2qMwc+/wE/nQtSnzl/Uz/0/SACNP/vlV8PN0U0tj42EqbpUoC9psXHbDLS49hby7au4d/8z7FI++/E97Fy7iffuPoDvXEW6s83gABWUtAcs5xUzBJbc+TMjIo0c9LDYAyl+NlwIqKtkEgNaFRZFxZGa7DzKpi36cKnqkMYQFt3ok/MaSfQnTUWwF82/KUmIGEwQlgvRP1MyYivFAJTmNevjVzOkRN8nsA0ey+mYaZ2j4QUDWf3XZNLXx7DXw/TinAGAmrqRXC5O0MYS7aTEDjFxajMaVLZA5F/gA+gANWyS7o1jnGkTwJHqT6LZvFLglamUttVgUyhiM6UFE0uDNu/t7j4Ob32Aj+4/wOGtD3H86UPsHBzg2tERuvsHaF/Z4Xi2NBdH/lqNPIs0YqUksmEV1MIKdDUORcNQaBIDjNn17vkUZ+KuxQ3Gf8PPEs+bd+fE4Kxayf8iBgBlfdN0pw06FXSEz9D1nC9W6L3qo39GZooXePnibzx/doL+qx5OT04wvbjA4PwfBnOI1u/4nsk9ynQMunA+qo97x3zjB2o4/1QolqsS7WWJ7UrACPYK92m4R2SgxUWdUw8JXYs4zipdYbZYoD8eYhbBO8EvwUuhlCnDg7PvfY3dJEd3vAQen2BRFug9+QnL07+wX894PNIiVTnR19dvo37r/wj0YaWKE93fVRI1RIfBskYyKIHzBH5QwJ8vWfPfYn8Fck7n0k2YEsppSWREqryICpscK+cxqSqMKI/9P9a+wWQqaQVIcXR4iIw2P9MptvwCFflo/PkMo6d/YPjkd3R6I05XaPtMaPFOIzrJvIw+B61LBRU+sh8YjMd4efYGryZzBgDoPBaJMC6qqBeQO6H+H9/Zx+dffYkr12+wkwZJ2tq5bOYYXCAg6fvvMHn6G7bGQ+zSWFL0isNPbf7Wyq7wfg0AEy27xPmxASY1UFYenrq9ZPZHTrW+6UhxgRho3uoHQhtHiy9gqq+O5DrSqtkDL1IBiL5aaI9eUx8SjhdccuFXLkRqNJ0XbAJZ0c8EWFa0zpFMSswHXdxBiQqazeINBiwmSdgPwJvUSce2sjSu5LtIJj2Mzt5gOhyIYL/dQrbl3gJ2b8xP3jNIp3FRF2jbeCSqNDdcqibykEC+zQMkYpgl8tkUhbM425THepu8DmhxOB3hdW+CFz88xreZZ0PU9z+5jbsPP+bvu4cHIP3+drcjVgm5MDbIGJMAVJrpBBDkToEZRf7mxYI35WT+5sg5vlyEZk+L99artUgy0gyLVFa6gIFiTmv66jLl2gqzTAvsQotG2mtXmkdvrvmha0ygU8uKs1oLSZHokjEwFX0r9cQynXdTsPqQIsCm1EWh781V071OoTZ2KndgKzGGDPOltv2+yGtNbmtFrRinRsaJ1mmvxUi71WqakMKELfgZEJqWtrfPmmjskPOfSvee1l8qFJ2Xri5rsgkMIOq3ShnYvd28F1RrXpRNfCPLfbWorbQzzLVSKSyINPoM1CyjesSKM0s5sO6wdePt3gSfMpLlddI1X4K4ZvNqsttcK39pzibB78BhNp2unZd9cbKCc1jM5/IzAVXLZWCxSNHfUnmBXC8ZdzKG87wdZMxVJDe3lwBfNafEdbs5M0TNf0DGwzpAYz5EhY6N2NnfX2JrK0fWN/fA3lPXVktFEnjzg7PxYRGhFhWpDVk+N/tb9RWg30vtuV7823nFrAKrDWNJ7KV7E5kFmm9ec12kac3jg0A3Nu5vvPzseFQzzsYTPrfMtaQxq2OQr0vt8S8AAAD//4RdSW/bRhT+ZihSm53YjlHb8JY4CYr01EvR5ty/3UvRQ3sp2kMMpM1mA2nkXUosWxK3Kd4yQ1JeoqNhy0Nphnzve99y4/7YUifKdjvBaDRiOo5RB0V/MMOBveGg1XyxsYVeBDuFFhXSVdF+qhgRMeXyG7UyOZgvOv178M2gZt7ndRkdPVRsFFFbo2ieohCXpP8+fND+5pMpbcao30D9FuZUBhGHqBM1i2AUWJqaOLaBEjL/4uzHogwbJ1LKlTTmaoyhVBq/cT0rgPU9eX7jPec3W0OOMTeRuxE7R7ritsQ3rmyuYn1zHR8OLvmBOHOpaEOtaNG5cESKP//4HT+8/Jk/X3ZubkpnucBPS4fh2QWOjk6wu7cDGtjMdOlO6b9RMIcyoiQtRRO3vbuG7Z09fHz9FkV5yQALVfJULLrhMcbv/8Xiixew3e69n8XXXkydakl91bZSLFPzTzpisq0viQZ+fYHp5REm5wcoR8cwX84QDU9gPn+EGV8hftjneKHpeMIThsSbzXjpsrvf6O+ra7xVAiAvajAi1SOWOliObQ8uI8O6HjoLS1h//h3636xjnSj9mxvor66ht7TEYMDMtTB1MXIXI5sVrJtkbRvEHbdwuTAl1A+CSn6nWdOl2jRXESgl552SuZ1+y/x7tA4ycqHiUuJRjBSJzsfUmeALDiBY3/ntxGj/3DHygGAcGfRbPSREW8+n7MbfiUrW63O+fjrG5ZAm+QOeCFO+/ungMEz8Z5NLpu9TQ2EYaHDoMExAU6KEc/cTnmBLSoV1Yg5nQ2MbvuUKgPPGhmHN7k56rq03JgW5DiZwFGeWE3LdxcNHj7C2ucvN/dbjJ1jZ2MDW3h4WlpextLaGhQdLaJHHhpWpGzsZk3ayHYkzPzUZ3shU48yshImjFejAldmg36dOhfVGgQFTM2q67Roa+9U16ci1nBgG28JnVIr0gCb+jKgXouFNrx0+X45xfnSGi7MjHLzbx+GHN3j/5i1GF0McD/7jGMV0MmXwx/KEMudz16YiNpuKj4LLhVXkKu23CjEkX8EzhubAV87u1eT0FCVGRNUvc6a+03djFVAulYJMjSKHETnV1NffiwewBcaTK3z6cs5NqVW5UFHWgMsg55FnUOIMdhZX8DSLYX/5DeOjU3SzDL1sgk7XAolDluQo4gJZ3GyZGoCvL/JUKUPvn88yppsTYBGlFtk5Rf0BdgjkY8DMHO+bgqzziPLMn6a/LrJFk/m/SFvEgpI0hlPrMFLafVUCqVFjbX2xDgIoXWh9eQV90mUeXmB2OsDJ/t/A8QmuPnxC57pE3/SZoeBpyY5AWgL3rmeIyhSO3LUzSbMgdO7L+TUOz4YYFDmuCMyk9tvUwFjPOCqBlR7w8sef8Ozb75FQwkOrJQ7n9CSimKnBCSb/7OP61Su0T4+xQEUUNZlEb2bAb8b7lu8FGhfMZ2Quepin/+QTQTpX8mvISvaEIPd/buKNGrhFYvZnlEXgH6n8fdIFEMBED1A6z7R5MnVXLROlOOS8BjbpK4SqTfRq0r5zxKMaEGYkwdL1+hPK97VSzzxVO6SrtraKAaxdTzCy9VO8cLp98lD4gdZNhZ468F6ZpFMGMZKoi2yScSwqRzlQAd2qJF3z93y508rkm40rrQD2GZ9U8VkwxjQAZOvKBoO8/paFiqvYxUBZHGQgGOkwig4nxwFSEgiBDQfneDcY4vWvfyHqJVheXcbj50+x/ewxVrc28Gh7DejFiB60ES900E4MN/k2dkzXzZlpmqGddEVQSa7501zBu1yd9LWOjbwPQCWVZfZt3OJ63MfNMau0KO68N0Pr3Ein9BQf7ZsingpTfF2nww7yFJlMdSc3DZMJm+XyWopCmgZlAtuahFSaMd0HOv2mZn1xcVGi2pip11yPUVCJJ8kEJuR3r93T5ul5z9PuXjeYBFbNtQmUeRar3tOTBClszbRb9oze3Yw00HRGWF6QxFxjUU/H7CfXQnicGhMmTp6x6zXwgYHIWno1M7eVBDrEJmoP4L/3rNY8BrZEjXXc8IAoq2m+ZzxEal7uNfzeq0GA6tv7ES8T8PKM+V6L/tb3Up4pkHB8X6qsgjwYRI7TcYiMFJp+dOP/+cYWtV4KCgRMJ1MGXxh0KSSyPE2njXV55kKiA9GyuHv/VLJzWw2dWKpgawBOjYFOtWatnxT3fQJdpHFp9FU+FlSl5h5EIlaDv24ZcMla6gCMH8xyZj89l5U9cGNYy+Bh8+VZGb6vI6NNAkPmGeDe64KT5NiJXmpD7wtB5shxkuB/AAAA//+MXWlvG0UYfmbstePUNj2ImwtSCh8QIJX//wcQnyhC9CCt2tIraXM5tmt7Z2cXvdfs2jUCS1WbVml2Z2dn5n3e52ivF/E22LPZDP1+P6FWIfzLAdD5BAQ0bzBdbCU+NrbgmKxAJleVKCOlUk/WryWqwQM/fDbb6PAEz6kDz/SVejBcSw4IQJ0jGtYKZjOwyDWLuuNbjXsMKWXAqV5/FVGSn0OggCF1PMmIghHlkBKU4kGIF5ucdGo6jjk/smFFFNTSNB5JUxNLNowwEIJQG6GCCSIpC6CvJQCGEm1gBUBfOEMPP/s4iShsdWjRp9gUYO/+Po5/PZYs6Mr0MPZzBFl98uQxPp6e4Nbu18iLZd3VYn8G6jQ5pmvSBD89PcX+4QEXJdQFFnRtA63HaOsZGAmkzfXp7/u4Oj0XZgEDPhHd+RiTv5+h//o1a50L8SzS+7YiRwvvUrprrUaMiZPo42SKR1pMMnMi2mc7BiwnV6iWcyyvr7C4Psf4wwuU01PE8Qni5COq6RhbMUcxPccAAVukoaL5QJuJ5qG5hnabNglzo9/oC/Cf6ECja5iy25E65PMi55zy7d4A7c42dg/vY3T3EEdH32K4c4gb+/fZNLE12MYcjrtiMzhMoxdDozbpb/X96XT58C/pA+rMTvNTTeacFrN2Jl19gOXKnyWf3zMDpMjFCElo5G12RmfGhGonRYfc/MQU/+Tykjt98uxK1sCX8zH6tIYsF4iLMYowx2I2xnxCz+s9Jhcn7DR9fXGC+fSMI8UIICDKdxXJ1b+khg3rwL3q8teL9B4zaPV+tYNqxX0NypTp+dhT9DoRzcKvUos0i7Iz1aoZ7dF4EFV/Z7SL4a07+OHHB5yxv7d7wPT94WgX3X4fg9u30On3uSgl48WoEaeVxYHrfJbNTYv8rJViA818uaX5+MlQb6VY9w0QoHbvTy7iekd2P5v1yfYy2tf1vzEJtS3DRnsqLS3js2tcXl7i3Zu3GJ+d49XzZ3jz4hWOn/yFDyevkc8uODKxiDk/+xiXyBioI525dKU7nCHiWEebMZBaSNpmqcAeAy31LE6zl4qUqkqAjoYmQYQkFXOPrgFMKiqHqZdreLlXerXeaimxTzwmKxuxDOR8GTCeLbgwNgO6iMb4Nt4b+rsuHI6Gt/Fdd4jit+f44pMceilyygeP0KkYBHDkMtkpUfiG58XaAY6BbDUsoz3KLXJhK1BBETIUb2dozzO4eQcudwyo8P7K7LUcCm/o7PAsAKDiv8W62gyxaqGggycxHdTRokQdDdmoB9NY0Z5ysPclvh+N0Hl7hquXL7B4+QxXfz7CYBEwWJQY9m4iI0CslNg6YmRxShAB9/MccTbGcjpDKDJkNwZYtIHxeIYPkxlLEALnbUSY36cAmLQvRQbd7u718NPPD7BzcMSxf4ENyT6hVSwQTt7j+o+nmD5+hN7FJfpkBkoaURo7qlK5PjR9qmNWhYu6jqxJANgHgvYYouOQ3r9waBfEnPKiu2fPoqyeUyGugmrThXSsQ8CSDsjMrqP8/cDsGU97dJDC33TWkY21cpbS9Fp9KbKsY1UJoOlsxU0Hcp9+CZHBCZOrEonJJir+//pUBujKvpW5beRxhl67x1FenhYBNvgs+CwB1Kk1LFdJb4xXEIDee4lXG9y5jekiMH2dgAWCmmhtcOqz0tY1sYZp6z206ZLjG5KmLUoXKjgUjdcSAv7I/6ZgHyZxQlpe5phffsTD41M87PwCv53hxs5N9Ec3Mbq3j7v3vsLomwN0h9tscEmdge5WxvszUuwg82rgt9rsoUN70zKXJs+iEL0vdU/ZFJO7i7lo+YsqoblsMtrIWbbilgsRJwZvUa2AvRcGgBRxktdOZ9gyFIlNS79T8U//J5l0+xQ1Z87oGs1mRSWfgS33XyKuLe6bO5Pu86KTqeCNImtTVr+xa3ksCND1RgsPn3V8qfiKWhBxZ96YwdxpbYtBp3ZfrWnnGg72nG6m53yrP+yayRA92+o2xsFzkeo1bo/rgChSATvHc9HnzbOhleoJNGS6ZtJIQIgZ6KEhjViloNcSB6f6TtZzqw7e3ONDQx5g3xsbiQ/VmneBfR3UJDCoqV65BmBmylgIzBQR9oexQZiBomzxqDXUupmlMRvMO8432A1QgIN91Fh+LWZ9IgUIqUvfpMY784Fr1F/N7v7qfCsTHrup/pEGqYEScr2W5sBz1a6ZC/RVprbNIZqT25S0QHG/LK9Vk1sCYTWKOqU72PgrAGBjwcwlavyqBGfl+rRZbvPTUjAsKSCNib5TNPYEjhgTwVgrfJ+cYrIUc026tjzHPwAAAP//dF3bThxHED3dPbO77C4OxmBjI0JwLPnBSR7yK/mESPnPKFEeItmPfnBsbEMwAcxlgb3NNTpV1b2LoyBZxAJrM9M9PVWnziVL+velRpRfKyuDdLP1gQyGpDRJl676TH2Q4gIHM+dZdvYcj6eyuZYRq7hQdAmXCyQCa9MVZxpxon/F8mQ5y/WAsYuTz8xdyg73MWe01XxXGqz0u31bKH3wfUwF8IakeN18RNA7PUU/ZcEbpfMX5VzdPGNsQ9CpecyD5WcRyRWtDW++0Ur4kDPaIpaV8buaC2KB4jhFaeP9EASWOZDMGA3BNrBXt+lWjfdiPKAeOhFVVIT8jimLs6YtaDOsqJ26xsoLoKykuWK0DZG74f0e7m2vY/h4FSeHN+i0zMKGNmB27vLbaDTC+7/eYPvJLiYlgQwP1/F2QGuaRNsEQZlO/jkTLVnWuZ9YF860xILo89prLahYnPAl2Bt08OLHH/DH77/h6qqD2a1GnQWuSX2F8uIjrvff4qvtb9HfGGJszuqytpnq7trGgADuLd5nRrxQq19pUSaGJlWBcnSCYnSGydUZqtsLzC4/obw+lwY/bwuUsyt0XQE/HaNPNL+Yi5FR1u1I4+HlxdiD50RjMpPnaD5TEixnZS56HhjfIb6+svhfMa7pzott+cWphFuSGan5rhnlxmm07yD0h9jZ3ZNp8O7eU6xtbWJ7dw8rq6voDldRNETZhxhPWSBq9i5z8GvzKqhdK0UymyNpkAjmkPomFW5jBpJBY+hiyoNN672rDX1vLKdfp1RB1t+kPiLhydDv9gwAiE8pxOwsNEi0Z24NFrcSv2kRdqLeYtHNs2Y+gaum8n12fYmzy8+YXZ/h8mIf4+tTmRbL1H8yksiutimQuwa9pkqQiauXNKVRXysu/dmdBl52J5FikzMYTLEAkQz9b625TlymBmnC7KUczWStSnnVdxA6PQw3HuD+5gZ2nz3F1s7X2Hv+HOuPNvHkyY6Afd3+QOl9FlcoNP6gbttjuWutxs1JzrjRhJeaTvFsEfNPjVBsw8LY0t+Zzvu7gNQXk7cm3jOYYU2KbnIpg1l+XpjOmQBuUQmNl9vfu8W0O04Sby5vMJpORX7x6fBvHB8d4NPBPvbfv8PRwUecsOGfj8WzwSVTxPj/oYh6QByctoltoyIHfb5qm3BF2EX2tkzjW2n8XDLRikCgSzF1hV11Y/RxNpKc2o9q4GJ2g4f3+lqw2r5dpI0oxftLPITNQlnMMWfzWi6Kh8Z00vqus5bEaaQtPReG6OKbtU1suj5m0xGySaYTn3mlf/IGmcUzthnPdPXPiYUdp78JQOakhEa99CSg3II677lOkKvCozcBsirDwGue9/h2mpgaJZQN0WrLj4AeMsZrNRJmCbQdVEw5GPSRtXOUt3b/2Mc2liKXpshW8BsQ9GxjE48rj5tfX2L67gP8+Q22Lj1WwwA516TkVJw0/1qKQe+1mYmGTnwuuzxX5zO0hcPU1zg+OcGomCrlXyCAoHIluwax3KQTfRd49uIFnn73PfLBGso20FIWjg3o8SFuXv6J69ev0R3dos/rJqtqrpIVTq/T9meBSso3mxoz8hPwu7X9QfkeC8rKyc+yKqCZlDq14nuITADmvtvzKk09m5iqRlGXcl2dIkczb9Mk0EcPh0aBHW9Gb+KyT9nkRKMze65vzCInf0/SPwdLFIn7L9z182jVxtQnLR3EdDjCfv+dIv4fP23x82Yp7FXYBVxfAoDzBk0xNc7ITM7uuL4dq5oWIJJPprfdkKHIM/z08y8YbOzi6PgUB/tvcXV6jPOjQ9ycn4m8S+qMxijwEcSgpw/Nv7ia0ZepXjYMbmMukQ5HxApiIu9rqU5bj4Hr2PPdilKEHhr1+DPOP5zi5NUbvOK69ALyYRdrO4+w/ngdX+/tYH3rIdYfPUCv30Pv3gry4RClsIYyAQX6YcUc23PJpBfQIuSYFZVK4GRYpZn/IkyNB7FDulsumsQKbdnrOkJrXTGQsxOFvrAAACAASURBVPi1xRnVLoFA8Q5AZJvpvJLpfiUNf0gGfma2bQ91j7LD0mRjPNM6QXwhMntPCnBQVZKeIRNISm5Z+9GHpakXa7FkDFSXNgCjKW8RKeV5mvo6czInw5DeMrxeyrWiPtqbAbGmIJSYl4U4wkfmrjZlyvoS4Ni7ZKoXKfvR9T6CH8zQj2leasgYBICSWt1MwbkulDoqHV6rvtreGXeHo04YfI1dS8h1qr14OSx6ISRjtwXVX9jamcYUiiO+6fhjfyRrnmuvpl5QUcKsQ0+YCawMQi12Pe2BJcAgsS4MDIoNuTNpEmWzieVg9y/ztQx+yIauSU+P9YeUGm1iQQej1OdL+vzW/DMqMcS8y0rgZ8fPaCwpIsoOpD5YYh2o5FATGrhnlPGhJC3Wtfz3ZLoTPI30/dj880uY5MVU11TqoyUAwH6NTBlm/ZPdw6NUTeqjhxxrNTu38iDgJL8EBKORfsdkOhJ3qb8XWQUCDMTz1jSF7Dnkd6JxuZzNyrzlHpZnP7BknqqkiKwfnrOMsJUaI5cel2dYf7iCsijwL2FX1ttGFYW/WTx2YuwsdhZK09JISH2gEjwgBP//qaKIBwQIoaYkSuI0m+3xOp6Zi842cx1DsVRFch1nljv33nO+LbYOCzzU3NB403n4pnZ+98jea6j5B1Pj1WVTOtEy2RCibREgdDFN084XzTOa8G8cGxwUm0pNohitPMpKPRGsv5gy6DUcTNNvHUx7nxYcodjn1STJn8nEzZwjCzlyUGge/gAB1k3mfAdMO6an5hK+5oQoHv6CGqo+xExCjHJTX5fatZMSD9ZTGhSJwmZqgTV2jE5FE6qkNxiyqq6YUYi9kyN0T3q4vUk5m5gRD6dIqBMrOTrOX35+i+++/wFbzQZTxklvrslMqi8RdIRkJIObG+zu73mVUp3TZzJGqGav1UrYDXz/cBenX53i4vd3iNw2EzppMgmjAg/TASZnvyE9OcV+91tyZeNNMJRaS4UejXlyc2/R/oqcnKdTlHNCimdYjSaYPlDE1R2y0RXcbIhikSLKp1iMPqJZLrCNJRohIRQrtBIq5JaIVxGPI8l0lS5cM9nhJlaZlAjiDh9DgxYCZaVw88yThubUiHK1C7ffFawHgmrkApmEWttttD/bQ9LuoH/0AtudHg6OjtHe7+Pg5CWS7g66lMMfBli4nAuZlBzOpXJDac6wkELf6aZYNoKFFlQSreWUxhkwVV/N/VxdAEqmaJ2kwG70gRZa6upvGzasFZyE5Iesi0SF6UgTIHI5O2FTcdamyYy0ZdmSkXtqxGSje4zINGr8iLvrcyzSIcbUAJjcwRUjhMGSN8IOpAmljX+p8Vy16dc6LqfnqOkIESQNIPJznLXwj6qyTn7O2aU9UraP07JTaPMlGapR7j57VpDnQgdHx885a//1m69x+OwLPHv1At1eH7sHfTTbW8hp46D5s2b0kpkBj/pU+LQ53a8xkk/XNmb2Qj12+Bw8U1b+bLB26l71rj/c+uIGJQPz2NTkEVmNNPpG/V74+hYR30NCNMtVhGxJm7uSkyam4xTp4wOGdze4v73B4PIK1xfnOP9whvMP77GYpIzuL/MZJ98XnO3hGLv9/1dQFQRyEr7sAlW2vrVkSp3oQpVTR4E1O5yKCGSMZHqnC0iE3CP/K5C6FdJFir2ks3aNrLECb8NkzzQ1HcIEbLRmcafsHBGEWrjVtyFQz4WYvzPHXrONiJjRRQMxMyYy/h1CoKjwL8YOLiF0YaVeb2G10SbtJzlj8zMVrXhSJOSQkf8FEOUityDflZDunxN/moAQRadItIpdCuQ6MiLWWRdlKM1Ml7D2P6SmZEGecbkg7h5NnItVDz025gNt+Q6aW+hnQPrHObYHI7TJJHYes/EsfcGSm100D8zVJ0THtBnh2rWjCL28xKyRY5xOMWPxgjQvnMVs2tyl2f90OBRrenTykiiBWA6HaBCb4uMV0p/eYkbF/+0DOtTCpTWn9NZ8YxtCNPWuyIROXwh7g+URpbhSu8whWjW4QUADKyRjvUnJOnuueWkPTg2vZc5FRG7Z5rr3YQp/RqaUMT/jtZ9DKA1xPS+fZfMU6eL1u7pg4eb/eyp58f/wUwa0UfUJA8D/Yp+Hzu543VqV/YFT2ZE0IEm2hXzOcYuz6RDZvERYPVsmMzDOm2bxB2QY+Bxfvn6D029+lKje8RCzxzvcDy449ePy7/e4v7zG2Z9/YfI4Yl+jgjyhSlT5/eT5IMWveB059VAI1C+lrGQMckHk2ZB516kpK1szWCwXSR/nwj4qqdE2nmFwfYarxhl+Td7BxcBObwe94z5OTl+hd3yI7uc9dPq76Ox3EbVirCY5R69GcROrYCUmhsyeNbq67Sel8VNTf4O1ObzaVwY1IsxNeHImj5vSaG9Etc55g737aXmv/U6me3kufFjIqWZ8hSQPLDRa28DBIl/f07O5Hc0dmogV+eegLvj0PpvMaf1AII8VpaUCg5bVb7UKHUOuCDijopR+4LELoEBUEiVVHVMbn9epZcb2LdWEEFwQ16bkDKDq/p/ZxUrttlpCUo82nx9DbUvvOvDqoKBrlfjgauaAfd6SxLhhYjHfWnw/pfEbq0H2F3bfygpILbxFc0OH7hXZBBgS8m+AsW/UaOliJhegV6IoszVS4PsZqEdDCGzE7DEC78UyPh2XjHJrE4C6cwJEK2O7EW14nEljpmBpgTQI4o3vNZ+4ylVf/7axxNcl6/79onqUwFpZPy2hjcYFMytoP6e1Jh2DjXz22SvIfLQ21be/829yd6rVuOHDDYx1FgV9l33OxqExI4RpUr8nNSyxRcQ3IwwC/AMAAP//rF1Lb9tGGBwuSb0du66VJnDSOi+0RXLp/7/00J5StDm0yaEJ6iS2Y8iWH3rLIrnF91otFaPtoQQCw0JkirtLcb+Z+Way2G0wVZM6u4lsMuMjBgDkwqNcxbSuEJC8Te1rVDDBDEPM1dN652IQIO6x2BwQeq3b7QbZPrkTp2m8iOtyEYs24UWqn7mIJP7cx04mI1mmXzCreuGdpAFlEtBho8jfAMBrBntBcpOqoaGLWJpCnTF97SaghcPoTyKZovSlTRPH0YUr6fmW3NE8TGK8AOz0IUfU/AkqAWA2TRH1USyLlBSl/Tu49+wbvH15KF4JKo829I7zwH2JV7+9xNXlAP39A4xn0uPGhQptHF0ZQIfJZIajjyd48vQp2j0qkKJza9wVVexMOLOESZ5te3sJXjx/jtc//ozh5QyJn7IRYJmBVQCzD69w/Ucfnd178Lv34Vu6GSGlxHKOiowMp9e4nA2xvB5icnbKTP/qeoh0MQXmBHCMkJFX9GrKhRS5xLcg7uCNXDh7VrlUkoVMm6UlAUM0Xy4T9NdnyFs76HW30O52mHmngp0y1hsNUgbkNbk0AQDGspo7cHzQQ4Nc7anXL2820L2zhSbntO+g1ekha3eQ5S24ZkMYgUpY2RFJQEuxSOJiXP0USMbmXI7MuZBxy/ebnlPY/kSjJVW542VenBmMJeaaloXNmxDo4nROKCQtVY79c7mCbFIwushIjsyRthj1lB5Ikn+2qeBfTLGcjlDNx5hML7EcX2I8HGA+PsPg+A0WswuMry4xm47E7NqXKjZeoUWCaS8e+WliMv1o26n97NnGRtXpJj43bsnbJtOqYmUsFcG3t1MqBQMeJB9Eg5MSMvSQt3rIm108evwt+g8e4ul3L7B/cICvnzxEZ6eHne1tlnCTq7IjVJwYZ56zG2Z0aA5ZEquIvFeVDDPEkVNtAIT9epMafwVVHEWl96yNxr95tdxmvKWq/7VZnYxju0ksi/RFkjfm4nqF8XiO4fkpri6GuDgf4Hw4wNnpJxwfHWJ4/hEnR4eYTUYSgVSJjDNNhAFhk0dt06nMGv9/OMJTQ9eG9TKHtWH3IEQplN4yBCtVAAyKOcZuhXnuseVsnXg2m6QN8GY4os1HqnKCVP/Z63FfdfxOej1jEb5Dl1QzxBpnqnPgDR/Fx0nmPX1nEhgqnhtrk6NKTQhJtZXSZobWV5mo+sOx4dvaw58YOFKMpAxWSJufQXNZ1CctYBl9j5CyK01aaLg2/06b/ll5g5tygUJTJFKvPgdYjzFCySIKgL2sg+xiBnd6jfY1qaoyVEtxT2cWnFnLAiUVh1i7fW8ylSRhvnEe45sFrqYTGJ8sIIAPn8Lp3ZAr27T/7Bm29naxGl2hU8yAyRkufv0Fq9//RHMwQrNK0SR2nqIHkzLMj1cwnMc7kRg0B/lZeVFKeC3esSzhCL9YlKjIWZV8ZUZzVgQIAOAxX1YcxXpTrGqkSjBXrXzInLc7w0UsYjy+dp2129jX2yprQLN3kftKZPAXzqQtM34NoW4W/H5jDcOea/+lYyBRzxhC66cTDE8+YTlbXwmwNmBWeIv3qPOyQO+LXeS9LvJWzkDsdqeP/sM+Hv3wPapihel0hMnFGIP3Jzg+/IC3b17j9OgIx+/fYXx5LqkuRAiVKbtcEPnhbDC9gB4xaykXK3cCBzdU6q2RrBVi9D7q+y8VxLmpKvQp+q0geX8lNg7jEd7/NcLbn96xGmX3bhNbX/aw//gA/W/u46tHD9De3caduztAI0F3r8vJWHRPFNVCgD5XMHPOSlIk6stjhrr1BeHjetsLC0hFabPZZuZy8/isV/kW1W585FkWmYWvQg94mEWNKDNlcMmKi2o9xWEfKGD6ZgFnr9tnMCM/I+qgMnLuIdeoNLq/Q3Gq0m0qymlvzWCF9sbLyStuwzNJeVDmOvlJz2f7m1bYmUF3FRj5NLDnhca3hXi9DWITEUD8j7eGMvZlzLbHU2kJAl7qJnP4T5TotOvZfJwKAfu5UV0Y76puykzRkSTN54Jf6yk6N433beuB6ibauxbaMmAZ+7YWaufiNJq6kWWamj+FFepF7Ty5Kq3p74sh/Np83sCa+DAzxjD2lbSnWOEc2jKskA6x7JrcEtqLbwfISFEi/1euQ5QhizA+5t9mnhidrijSwzxaJKe2CRhRZ3NuXnBsnk7KWlLiRJGVrAZhD5n15xaFtShfOq0er1n7DFlKLR1iZJlmOf4GAAD//6xdW1PbRhT+dtcyghBwuATK5FIyTdqn9gf0/z/1rcNDJjMZt0OaEMDBjsG2ZGnVObeVBG0nD1UeyBij6+rsnnO+y6DWG2IPX+DvdToB8fBsJyezBUzJbWgF78xewwQIuBhA8JkwYE6RdLhiUoVkTlPvpjaJw9Z9SbpdbJg/pfc8KGkCaIOUT3/Lwic0va1b3oupKNo+CRJdKiyIblZZ0eCWAUtQGu7+L+94INsD7Y55q9q1L0+/uplURpuo1SefHqgVIHBPwZk/79xniubmV8qwGd8mBf7ewp7Os1TIW0xFlHa/tE+u/BK9gOxOiH6hY5HmkHWIyHaGOHrzAvluhuxLpeJRyq2Xb7JkX7m6xdu3Z9g7ei60gkq6lXJMTZpURXRyfY3ryTWeZscwmotT+EpvpdAQjaDmxJrWXqcvn+PV6RssLi4Qiymq9S0H4m1qIa0mmL39DX5rF4PDUwwfP+Lk4uvVJZrlHarZFSf+1CUm37BmOYcv58jqJQtIDeoVpe8IvkCsClHJ3NhiqgV1v5kqQIlZDHAktMSw9iH7rjP8f3OLhawOnxxib38PT49P8HhvhN3RHjbJb53t1zKBdWnnohvCg/d9OHbyDVZoXZDMxAKcccYJLldnJL5YyYRHCtiVjfEsdY8ic0wdi6jkuVVeYwps5tHMnZam5SZTkhGVK9qecEyiZymE2984UQhnKBglRUz/cCJuRx68sVXM93XFAnzlaolidYdmtcBsOmH6xc3FR9xOJ7j+NAbKJaM24vorHKYEpObEYWTdRLWTpH+5Io5o/7kfSOEBVrRyadHWDbouJfue9QBMiLJN7QTpUjMcdsB9Q+Y1e1G5pkILKUDvjg7ww5tfcHT8Aqevf8Lhs2fcWdw/OsHO3g4J+oPEtMtakkwa+9QAoU4UXVBGbiAqsEPHFa9Y89yGFgI7glgNUgFAkpH478057Zratd6PM9+yeaP/q+o9vQPFrMbV5SU+jMeYXkzwx9k73E2mOP/wJz5/Osfs5gtuF1NO3mJcIA+0GBYYXWwKBEr0mC0iFqlek9F1s0498v9rE72GJiFBHDrJeRrZFh/bxNyi+FoRAVco8LkucNIUGA22Eeom7Y+pMZ17a3MptPjEVCTBmXZ60UjPuL+JjWqOTS1IyIKOggEViagIQGJtwQnBxIj2tAikLjiPF52DmFbDrgprEXlzSsaoAscU2p9jgTPHKvGVr1FSty7IOC9pPNaeD8HwUVqgkHq5z5H5ITb8hszrrMJdYEVFgAelEKTFuy3L7O7kBJ2+nGJ77ZAtxaivIr0QhWMynNTLeVOxz2hyD0RsFU5ahhqLuObjlHSZrn2OPqHz5B3fDDmO9484AQ+3N+w+cPv+d9TjMXKF/Q98jkhzmm/fsUafoeKG9R0T72riPbCQHs35ZQNf1kyPwawCFhGe/PWXFerZkk/OsQaGZ2oQvdTkkR+5ECbIL6e8/OBDy6PXbC6hxvT6GktAO8m763TQuyiM3kLWidwlmv7CHL2iQB8B9V+bxGTlI97bU3eaF199+f8G858divkC158mGuvCAxcdISbI8w7DDKODIwy3HmFO88hwg58DW+kHolptMVVy68l3OP7+R/z8a43ZlwluiCLw8ZxRSON371gn5q/zMe6mX3E3n6vGjAo7Km3F9ATai2h07rPP7Lty7SQIPCQBWSfrMxZ9RExxZRCHHPsq3k2NeFlgPilw9n7CjhXZyGP7cB/PX7/C05cnODg9xvbBLkb7O4xGGT4eog4VO97Qe+pqKZM4jqtRaR6q18QoP98RbpTxw4ms0Xp7iX1L2033/Rs8iy15EoqBJH607jP7buZDa2JsxQJb51SKFmZxtyjCw7Z51Q0zJX3LAYJywL3aehsSVtDIg7QuN8cBs/ojUbnKrNqYziBQ/jz3Lac6mF1b5HOjGGedV1ae9+JWZvlHCCKyuFYIvCXHpgnQn6Bjr5v/T/c4qlA65RJUUOHYbXpmarfXpYsmLrrmRDwvKarbiiCiQ1ArMkHyg8VCiiG9hLejF2D7HahNoFHMLDZ3i5XWYKWfG2q7l+kztcYjf5b1i7j30dTQYk6m2m7drU2GLe8MysJ2qfBddWzS2+arUH1MHBGxLWbR8Q32T/eW87xNEZCnTZT/Jfe182akT0dYneyoLcGmwgfb0/L4ke+RCDBt3Dwm555KnASM6kWFCCsUMQHmnqgh/Z7dKajowbahZMepiBVt7CZ0jYroS87Zag7IM9M1hNroMuLGO/wNAAD//5RdW2/cRBT+PPY42c1u04Sk3SaNUFqB+oRUXkDikZ8Lr7wj9QkhIRVUQII2tA1py6ZJNslevPbY6NzsSRoeqFRFVdXt2jMen/Od78Lf1iIbUt7YaWuMAdPZa/NsdAtDWmTR5UumLr2CYkgshtOpT6309dBOs+hnv5+jmM+uPACxDiVGHb06nmYrK60Lqk347QCyBzO+aH8tejBGvxilW5GbT9+PHRPp2khLo6Z7UJQo0cIknupDQQBr6G9CSWmSV2vDlSlDIlHjQWrmVnPfNmYxyGHMBdrgtj4GJlScf75ofRXsQGgUDWxuAE/aDavsDjuQJZYv6GYp4VY8Nna3sLO/g4PxS2xyDrlQ38T9WRTcdFD/+MMTfPnV18h8XxBxpiYRbZNcueX+ULwXNf+TswuMdkYtkCCgdcPv1pQLHRll0h5p1Ehv9+NNPP7icxz8/hQnf7+S+7KYI/UlehQdcvwbLn8OCL1bqHivLdjpPSmm8IspPEp4bjLEbIgYBJ5zvCm/vdLc88CUMjJ8W3JShWOqa91k/FJNsyE3gCs9mbjf3bqD9Y3b2B7dw/rGBu7s3sP2aAvb29s8uV8bDlmOwC9AOsTZwFDpS2qMZwdUUAdfccTvZCSyN2puZhPNcJbGXCfuizn/JI3PknT3EESU6fW63jzvSlKs9fp86C+XtsdEtE4U4aCROMxEgeSk0h7lNAAzVMwS/nOeO9YfMtU1IQAp4Wl84nts1MOHSSJTNspADwwWVHDLc9TTU0wnJ5yzPzk+xGR8xO7858dvMDsdIywvWSudavtNeyxXoMkpV9YK4rYsTFXbSjFKZswXFuwynujEihqgUlPATZdrLw+oU60VxlKieQY6yNisZJmu4+R4ZCtY3/qIKZv3H+5jdH8XDx99irt7uxjd28Pg1joGgzUpnzRfX5UT/Hw5NemrGqkvhBUiTtyZ0uKYzRMxgazJZ1aNMbTSTp/Iz3jiYAr2NHqZOkXem6hRcEbbT4VSJqysFHbcJu4Gpq/e7kKZR/NL4PDFc3z37Tf46cn3OD06xOXJ8RUGAU9MEgGGyLyJ3YD5UQ/czAUtlGuNqJPautKS//83/0lylQLtrrXV1vxnsDjAhKdg3HTROmUO07DsJgTRv210knwBh4Nwjs3SY3CZYS+/xSP9xaL4QAFtJkK8Vk6mtsV0jn6WIys7SYp9fusQY8COiHEwn1ygGcxYW256QCiroOL83yU/1wSwOzV6YKCBACttlGmKTCkuWSPTA2j0DzlTF8vAcXhZ7Zm1QyiV57jImg0Pz+oFZux0T1nxjdgiUrJCJhPvJRYShZhXmGGOSU3Re4XQn52cfby+eva1TDXScNPZUpQI8wI4n6GazfWGCCAJ1bnL86GrWHeynHattFGmd+xpMcNpMRX9fyK/a6Ny19197xHzYVpgnYaFkxnc+7c4efYL6hfP4c+mWC0zToGhvH7mGeWuBUedjrvFUT+wpjlXjxmm9bO4NOVGP6GJ/3kJnAWANOKLkum6ZLRIa8GNmTJ/JH62o6Z2FHwFTlq9g0kp7MzqZCjdI9C23O1UGFem+tefn5to4//9HH5Q30Q6/VrXxEzX6phL0Bgj0TE44/urIJLLcLABlBne/vkPDn59TTY0alDYZfvbdREIQOdyaDJsjkbIh0MUVLuQQSi9q6mIpvccgTIuY3PMvOf5bB8OR7i9dwcPHn+GUCxwfjZhxtLZuzHevTrE0cvXOHr1F8aHb3DylpJjTliC4uhpaNQzQDR73GjLOdLVXYl+a86YohoZUi8JhV+AL04fqStm+cjtUL8q9UGkM7Z6X+PidIxnf4zxlPawB3v77D96gJ0He9j5ZA+rmz30NwdIeynytT6KIBalpAV2ucOCvXzA/liZJ1lCqdppr3po2TnU3IjPj2vXEpoxbqwiF6VbepdqnLVrTQKpTiFDRo4Uy3XKr3Jao1PbYND6BHa+1wk81d8cFx6ZmpmhGX32ql/lNB5oMxo4plGYjHmaMrWfm7ssExO7WmLEzWiNK1Y1oqO/I8M2kvTaPo4HnI3W33KGU3+yJjtPazKm9WcrzM41WQLdD6vVU202wfU7fWbBXgCxKR50QJrm/grzubIEAdf1EPz5UYwdpUCYxt+SUYzX72NqezTFZ6BEWcBQJkP8LCcKMgeVRghwU+k1LFumRcwEMcr/9fMD0ZTfGAlQQ/TkGuCR6/XHGn5EKXT2f5rZuo9SCjihgZp68rmpung8WjcDIOxXZusTReoZtZ8HJDo595T3rZ8RX5ewWaXJNvBDPDithif/N/KfuDnxoDW71F6SvfZKZWu3A+/Ag2xmdFA6iCa+0ZoN1gatuWXM7mKwLIj8hnts8gLQvdQl6dFWIICDom+p5pEBKwEWdN9CCPgXAAD//6xdWXPTVhg990qylTiJgwkJEALpdHvoU/vcn90f0LdOH5jp0BmGUpo2NCEJIWy2YkVr59uka+PhqZoBw3iRZd3lW84S2wWGFx3eLBOcMIhFqNZvvI/lgwerwt1jrZSFXv4sGsETuVqYBG5JITI8WHlUhURskMqN5xKZfFfljnjjJxEPA9En17Nc4cyy606EggNWVnwtOUDuJlLdLJxj1WFWft25IoVQqmy6DfSwUFBYVdH1VAl7Xau8rQ7eoZuPTWIWKtQqqH1etFSdC0OD8Lz8yOeNuMNTcSCji+Vmgvtf7uP0ybFwFwPobBoNUdQFcyxfHr/Aq7MTPPzqO57QmQr4hGOIq4BljYuzczw6PES6nqxqfQW/mQYOjcPaBvD9jz/g6Pnv+PmnI7ZS8vT7lhVSV8LXGbLzp0CSSgevLpBWOQYsEFUzn9iCRLI/466IipaIIEjM3dyWPZhjtmGje5/EKXf3qXt/+84e1jc3OdkfjTbx4OAQ4+0xdm7fxmh7Cxs72wzt5vFTV0prqVhBu7HunAbB0pArYHJhsoAs+rM2tdxXRpNQgaR2gVOAckQ7i0wvXP3GFnPj5reink0lDtq82qaz2IyTfoH0hlJpZJzQ4zyfI0nXMCToInVxC+HzMYSecf4NJ/oCPaIE7gYbEanS5ihmGQdXRZZhOp2hyj7i6t+/WDH56uKEO/3X7y/Q3syQUAusnmNI4keouw58GKgaTB8w4argOZ5mdaeczlQatrNSVXft1gzM9o2nYIyWkp9KeJrepcwnpXtPThg+GmBzMsFkdw/7B19gsnsPDw6/wa07e9i5dxcb22Pc2t2BG8SIhiRgw3beHKZea3LTqvhhH7tKSkd5gXHx+XUCnwgEBFeve75d3XuzdTf2bhHWa59nWg9c4Our4VxUUl4wNVtSTaApxqK5bwghGJyR0DBxAh97xGWFD+fnePn8KV48eQzfXmOwwCK0TrtXpEKj6UkTpC0a5LWCfvLWG3Z9R+3/OlyQ/Mequkwh4VosQVSSrCErG4HFNbSmLUJiWRPAOUzbBmfIcVxNMS4T3lTX/ZCF9WK/uP+1IowhXREqSsYJzgiijlL51nU3T2GFEGnhahFA5jEJIZKrgQjMVVxAYaqLF/SBFFIsQBekgbX6vCG/aB82tC2LcIrQIN3/2InAZ0TXzs8J33gel3jfZHjdzPCWaVdy59LWcsjvHgAAIABJREFUYdQ22PKE8inYDpBiIbKBvcQMb9o5ck7ZJADxTj3yOTnyHSzcaVHAlJUZX6IF8jAJkDEhHcIwIQ3nCb2HXGXq2DHKJneaIHbN2vCXltWEMAJpHeHm2TFwdx/5yRHcq1PEJx8RU6JE3GsWppFVOnI9OoSKLwUVfRpBWrC2A/3wDDuoBTJCbehZjmp2w4J/SRajLSCUgMYhaoc9zcLg5Q59F165sd2SH+wd5rDRqKPMyt78qr31swl9gHlZ8d7Pw5X9wnrNI1L/21PM7HVaIFBtEdp3o2SAya07wLsKj3/5A6d/lkvLQMTNCdPqsL8JBr/34ABr4wlyHuexqnLpH7Jtbb26eSiNjdc/2ffj4RjbW5uY7B+g/bbEfDpDkxeYTzO8OXmFtxeXeHn0D7uQHP39DO+uXuPdhysWpcvnU7aIbbiLnyMlJwz2B/Hsad82PUouRB5BCyJhtZKbQkJAkAJxre4gqhPSsotOjevpJX57cYnHg1+xvjvCeG+C/a8f4v6jfew+vIfR9gjp1jqorlmTQGiaMHIlzwvWTeJQj2iAkcf8Ou8SGe+1EG1aUKx4s6RZtbQv0ZzNq4oTTkqkBE0g3VOD4PPnt+KdTvcubDCG8H2OjepK1wvXIXc5MfN9/Bj+O+YGVsPWhZU27njd6FAF2pBbsne15kepnX9OkkzPQ/nRYpV4w0J/TkXhhmp5J0nnJ67p/P1DLj/z6pkGnXTIBVODt4MpCppAU+LPxQyy+K4XVfv5ebWg89rQDC3fGJVYlPrenlptyFt0+U7TFU1MABxdPtEflh+YhWBI97bvZI2rENa/nE85o3I3Al1fGE9L1xfaHPJjtNgMW26sij3joNNyYJtoozsHzd/wHGbv59Tdwg6Lie1zja4iFJAeMRMe5hZnv1OISgiv0RwmaJM0u0kuwhElIvD4l2KOzB1DK1AMy8+TeLAiQSw3NOSAXZeNBZqLXWff4nPTJuFrlLWRKMHc6CNB/cEA/7F2bs1RVFEUXqcvc5+QgRCighQSfRDU4h9Y5U/w/1qFLz6IhWgVPogUGFCYkMkkmWQuPaePtW/dJ53Ak/OUpGomfZnuPnvvtb6VsR/CrZVC7KoLsz5IZS19sAxC9dLDpOHWQWzcLGxCT5008htZZAl/vvro2lxsfxj65DTmwlXQwazuNDUXDY2XbX/VMWtMeeiCIkih5XFm2pFiCwMDMLLKj2JKBkQeEBcBt0IIF6AW3PclWV9SyzuMNEon02meZ6JfjA8eB4WWsH3Cez7ZaXQBGjiw2aVvHstYxVDqYIFlrHyDXqM/6OHuvV08/fFnhDeFPrYFObT0C35E0KODHoy/PnmM3S8f8D6xZaLwjf8n5Nq9vT3c//ordHqbjQ0yeFfdUZQmANjvv/N5H99+/x2Oj8Z49PAH5CT1Kxc8VaeQhUFYoCDjoFvz4lggiHXUX57IQjRhKbeTUpOik0gKm7aQd4c8xe4OenwDvba1xb770egqesM+dj6+id6gj9FohGG/j9HGplC3MzlntBEsaSxXUoxTM8aLXpyj40hGZvFvTqBH7G9tXDOS41+es28wZCpaZLGHl9QuKusLCvwqtYin/aTpB2cMB6Ebp9r5Q6OAthc16PhGA7lh0INLVD8B/VabgUEU5Zf4wERrIsv74hTFYs7+3JPpWyyXx5hOxuytHP/zAqdHUxwe7GN2NEVgSjaBD9cMeuoQ0b6c80OCZjM9ukEKCEKAkNGkXmjuZTUZjf2qLp49ubpBlVZLfacOYJ0thww+7WCwcR1XBhtc3F/Z3sGN23d5ur9z6xOMrm1ic3sLWTdHe9DnLP4sb6HbbvF3slApv9fzVWFCnN6DVLYdgtk7CAyp6SqZLEyrHGadDnOTyBqwiavk/lVDp6Hg0SHUe9nbToFlPNGnklPXxpmoPdm3Trfb+bzE7GyBxXiC44MDBnVOp4c4nBxiNpvxdTns9zAYtvka2ProNjqdHraGQzy4fw8vH/+E4+mKVTN2rqpXqOgDDGasQsAqyJ2B5lwtDv8fC//4lSl0jv5bphI4OpFUwIq1h4qzVOPtnCS8RGoEghmesQ0g4EVJ8u19vF7m2ECONi/6cUG5YPdgah7MXIpxmuDVeoYFjEZek56dcitEyeBUrl1idToXQFohiqWghgTvCoKgwFOKzVoawkyZj+atQZ+xzDHnBJikiiHlGE5qBKWixmOIGYPzljgMJ9hfnuDfcIK/wgTvMEMIQslo+RnaPsWg7KIVHLpOFjULX2ISlngVTjDhT9L9imDWoWriSUVNk7394ylWt2kCl6Hs5ApFrWmpQStjssvEaRUui6Yg9Huewec0tSsxD/5c2kWiTdLE8voRWN5/JSQ4/eUpUORYjsdoLwtkhShD6LhwYeaEuEyEcSo4ElWldYtSGwAarbdKRCay8Oz5L4/m8ET6p/SSkGHFi8yEJQmJ5mK4KNbO4/3FeUwzsboxQfNaqctLOSh6fKySdh9S1ly0IF60A1y2Te/7/dKWRA2FtaLDiaosb/WR5Zv487eXePTwD8yntkdOtTprTpuJrTt0Sq9e38LNO7vMXFlSRCbxeEpptHKn1dUWA0qsSKwB4KQxvqZIB1a5Soxa3h+gc62DjRCwvXuHr91vZjOcHR3j4M2YIYJ/P3+O1y9eYu/ZM0z39zEZv8ViPsWqPNFmA7jRbqbQxPY51BaupDrW9RopV45LCHYnVMNAMK1lhgFdM5wQ6eHfrXA43sP49z08yYHRNj2zruLWF3ew89lN3Nj9FNlGB+1hmxlElIaxDCuOYOZiNTGJcskpFY55TeHc2jOo9ezcWa5k2ymztKgIE+icrD9Y8RRZYK1Ay3QiCW1c2XeA13mkBilrW0sSqVltHU3rGSsSuQBS/z0X5hSh1+rzUTJb8GVraHuGmiVAmFoC3OVmdyS7tgIPqqqLPfjmn1838vrNqhDXPwJrkyx3KQbrIWuSirSch00EJyxrUBwVi/EzP04A8MoJsVqm1J+5MRL530XenuoQ6PyLP2exqKbH8aS+GvJqPKCtRW2qbokIGdu66+2Mt1fgpbGKux7ANov/WKbf/HtcvFuhLJGLwjdINYYwUUsGLrFgO0234+/j2kcRhbLNTSClvUewSVLr8spdp//0nvnZvJr282A7YqrFzVJuKGXUwKQmjwDX6ZoxOwyrLehcFzL1Z6tFxAOwNWFONg1HA8U1D2Pj423Hlb6z9B4GXaqFpLJ2qDXQ/KNs+1AY/dp7/AcAAP//hF1ZTxtXGD2zGQYwBGO2ACGblLZ5bB+rqv8hr33rr6zUp6hq+hBVSipVUaFEohAMhoJtvGDP3Km+5d65Y9x2JB6A8Yxnu3PP952FYwAZ2AZisMKmEprtX3iaO78QYDMw7UPuNBKhUMvps1YSQCJY0XWIjsZRLELR8hilQfg367T+P1TTB+uEmqvRoK3EGI82VFYRS/1Q4LuoclfEq8bpdmzFhLukHCOS8UWhilGaikO3nIOwQtmftfh/Jzo8VVwivUmpApOxfkn2Zde0eqnc6+CXtOeSXZC5amqIRL0L4O0z00KNu6GnijKRHptRz4ZcbwyJMZ4INXEuR7qziN2Xj3F8ccDdVm1ScZWbBi+6iuRW/v7tW7x69Z1cKy/TvtCuBgFIqtKRGeDV1RUa6w90NjM1OAU2uk9kCXS6WMcZB/jsyxeoz3+PzYebePPTD2h9OmWDHSjAx4Szj5iCL6iDg1jlZaovnUzJ5dTNn0+XUH+winRxiU0MSa/faK5hpbGCZnMNcwsLWKinSOdTLNaXZTCPJFos8nKGpaon1WcG754ReaBReHJOQueOzxnDfpNLDT8KzdbVU6GdITK9GeukTwoBZBjFLAglf2b6cuRokMD69eVsjkmDAYE26j4xtf0eyjIYDYYcEwbVPKXJPBbopUWRe7ddjrkyvRsMx0P0e9fodq7Ygb9NefudNq4vTzDo3WBwe4M863NEIgF97pB5E7dAgTyZfWVK8acnoqYUWOOo4foyCARERzp5jyrWflaXm7juPl+LIHSTKB4nghAbe3vY2Ntnjf7Wzj429h5hubGB1fUtxOQfUV9BUZNuPs0dxzyRk24ou/ErSBJcmAuIhM3W954zSESoTPb0mEQk7kzEFNF7z6b6g3CREKi24PzOpXfFeBv+pD7RhydwxoBAaWpXC4i6P8F1r4thv4/L8xbal+f48+APnH08xsmHAwy6lMX/N3q9njoX3/H2Kbs6iQ22d/bwcO8ZXnzxEo/397HbbODbr7/BLz+/xvnleeX7yXhU9v8qBcfpQytmm4j5yzTcsGfIEzzotkIXp2S7oxYOm4DzeTAJIjHmTBbw5MkzRLUl1NImTJjg6K9DvD/8jcP/Aowr+83UDPCsEOpcy9xhGTHSMGEX+umFja6YQAx0UaCDEGeYYKDKYfqmdliOcN8UkH5uzZiTB+aQsYwJzCDIXSFPOgRUzfFkMTMWLuzpScutq3msE5w4x3DSxyjM0EUXLXRwZNpoYYBT9NHhksOYt24LKbWsy5F5NS3J0VPepeIBCj7eXH1FSv8If5GJHa13dNnCYC7gqLSAtPhiDME+AHwerCNbFFdMLCsxT0wnL/gUkO5/UpT9y6jQwodHmA+1+LJAUW5XY3R+/YhgNOEcf4mkCmHisbb7CwYv0tY3nMQQWOYRjZdEu7wrOHaP8ORkMEbOkaWGvQDIuZ87Lprx75XwPG97a203C0RP3+eznhIzu23vg/qi3Pe/GvP9L+j/r8W4jH9fCgCUwNbB3lBAIF2vESUsxXVcnvTx4+s3+PB7z+URFLgfqQk9T8Q83NrdR2OtiYyliTGDfE58CqdHB0kayItAmwAyWaZor0IBZzRXQx4bmESc1WU7EdJ0FWmjgfVHT7n4/dXdCNnwDp2LNq7bF5xi0j47weHhO1xfnePTyQlG/SEGt33XfKj6r1gvgAyBZfzovyN9Z8R6h5ZGnHT3EYtVfBJGLP3MsETNqQAY9ycYHd2gdXyD03dHGEdAfXsVK7tbePr5c2w/30Hz0SabL0fEaJyPmRVA7ADyPDIUrUkaZzIVzOXa0NzXZ2oB1fGNXM9pnjW6GzDgkN9rLpmLfbmSuAIOLWOWvTq0U8ngP8vcnCTyqONGG4w+BRyQuDv6LMVKUzwg+TxYenehjINpEOgSWUyunjrlQxB5dGlJDcid95ZICWJXrABK93x4jvYsP0hibaZJt9Xq7ulzZCTKuEG7zROl5OeKJXJdn46NAaLJvf2JT06kgD9Q9/9IHf8ZTEK8EMih33akbfffNixDLVLQevR5qzkXTOF5LkQiz+DOsYLlRP8GlRnQNnNjKt9xepmm+9v1KvJFu89QcuozT2LtdOxGChE1LUDUNHHAGso7IJ+XzeFpSZMUCyIX7e677jNW9IwJBehLCc8W01kOr3hSZDSltHJWJj9vxztONydhf6pSBuAv9j52xSc2FyZ/MsLLsiY1pC3WYxmOmhtyESORtDD77Dn/N8t2dkaufFbkGAljAfgHAAD//3RdW28UZRh+5rCnAbaLPVBMaYENhV6QkJio/8D/4B/wHxnv9NLEeOOFV15pNIQE4wlTqVpoC22htKXstrsz882Y533fb2aAWNJ0k3bpdOY7vc/7HGLJBTcDB5hmgRmZ03QqjoU0quHFJD2LDunoMk0auBMNok4EFrlER3hhSS8RCrSYXpT6cJyY2bEDZIYMiMwMUKMmmhEGpDzIQkRdMRF+l6PViatBQadgQTaayre3BpaZBsXq5CgTRTJoXa3hII1rmlcP3tkkLMvADEZcRavwYEhTywN/Fkdo5mMeyfIDsED//IWKCcFFl6u+c6b7capyU2MPD3QohSMwRgZ/goOQVF/NelTdmDyrtzpPhejXNV1A7ydj9cbjcbWgCkGXB1cxqIjgOTqR0R075zt4NRqjfSXB7O1F/PP9BnrslLkAR5jqoStWdDEuQjz++y8829nEYGmItJigDM7ULCzNRHdOtjEz63kPyQJYGV4RPYo8d6LeWV0NiM9cZWKjW6BQtdsxlm9fwcfXPsGN9+/g/r37ePDHBna3tuDGL5EkMzLWJMqRCyTjYKjVooFLMoOZ2TnMLsxK52BhcR4XBjOi2x8M+hjMDjRqT4xbsgrtVNoUagqTvZDnU8IMlGoWiujECjPaM8RXtP9RW1yKObbo9Fw3TFXrWQM0qttn8clFnwV8YNQ4pfiWoqsvLde8LBQECG3+efRQnfhpYpVL969MpwoaWHd/PBopyyWbossOfwviCIyMFMhjRM7hRDwbDjE+3MfhwSZeHu7j2bM9nE1OpKuf5SkyxznsKp0piwL6K/hM+tBi6ryhkhiX0R08L9HhkiQ6ydrML/RFbMNtWgADi+pTzZQWGNJsL7TAitDXjbrTQZwkuLRMauQKhmtr+nr1usbuvXNRDoJhK6pAAyceAfosckky0PsumcKhHmIiMVIyYCbSLhKqja1eb7wG3+v11dJCi06hVvqCr/m+SKMYW1G9eXg2lI/RKqwn3DRoikKfaatJFdwX+NsZeTk+VtfkF0cnONjdxc7mv2J6tf7nb9h/uo2DvR2cjo4kcisynXhNdePBp6WQAsfdROUj2+tH2Hr4AHe/+xbzc5ewurqK5cuL+PDOB/jl15/x/Pk+Jm5iBaHwW9QZuToA12kQYQMcsJvQgH98ERHYgVjvfwhUDLVU8m0jOwh0RctuKe6yVk5LzdPu9/tIOl1cW7mKy4uLWLp2FYP5BQxv3sRgbhHnBmTyJBIx2go72H78CF98/im+/OozdKl1DSyhRongoos/RIRXeSGwE8Meo+KMdn0NTX/52leCjmOQQZCJO717rTSp3vRaCcciYIQM60d7GC4tY9aF6KY5LkQtzZp36u0RWuJKJKNMAfzAiiC/t+ljFbWyAvqkoHdipNw/2yGmQYaj8gRPpsd44kbYwgl2cYoXyDEy/4N6dar70WHlrh9qVJ/0apWjAJ+XbnRwZzM6sGpHCg0AG4f7uPtoAx/N3cB0fICz0UQBlbafX7opRYE61RcGbOcGjHMfLAWYjUW6cXKWojDGUOgNQHldQQ2Ic49jiONiNIO56CJ6p11QA1RQ718yx7mEmJiTEcmdh5nxk9TGpRVovI7MiYGuY8xf2RX5jJuSyhNJwyMUEziIHCEOEwUAJGxegaFSimCzkePeyqx38TKJGxIZPxve7mr5daBpFuALnXoW2brbUI7+L9DWAADeBImDN94Vhd6BvLCfDQSo9ya13giYZxRd21UNLwA0wUgCYXxvt4tRHuObr3/AT7+vC5uqcZqrZogPeOIq4IJYWH7XV9fQH8wjYz5+6Q2Tc/ERKhuKOUkWyTM735XCsCGNn34BXjstNPYoxuR0rGxPJmHldhgvzEGexII4QjtJ8O7CEJfLq1hz78m6SdNTRh0/fbyF3e0diR2kn8Dzp3vKEnh1jMLp7Ods6UAbCdwrpYtbwDT0EL+aODD+mq2dbY4Jp35AbQ9h5T4+ORIATNgDlKK5EGebxzh4dIL9Hx/KdfcunsfScAW37tySdKdzl/roDRIEvRBp2+HUnQrgEcQFMhojhwYYOTubWEFUVEVPXMGUaTYRE0feP+6b3IhKlyHutORT8vKztGEObR3xoJDYaDbVWvwbaA6cp1XnUs/Lk8pLRXxL4lgjwNNUin8BCcIQvW5ixSDEwNlTvSsmQZAZk6eW8Ko5GyrAgOPCNyOlEG+paIzv8THgMBM+X+D7dAGuEWdWfFe061Jrk9AkTPx/JFKw1aoYxvx9Al7EWpOw5vLMgybgoNHKcbWn0JOJ9U+e1Y2/wuo33yxtfgg71ftCiZdbnSWv7Av6G6RqiJdP5XGLt0xbfYTIHClMXkCjQX6NTSpdPdOgprTHdm9K81uL2m+AAUEtXxTKPWozVT3XmTEe4xnZBMwDmedyHhAwJZXIVO5lgc3r0mKMFRRxVXS9MEjj+uzUallxX+q1sDZibcnnKgwO6YXq3+Wj7Am++etV5jvBGnXUFwp9h+dE7aZXQKv9k9eFxq9zPPrC3+v7fT1LEE3HV22aqewMPr2aFSICRvpeGADCD9bH/B7nhsRmirRRjWVZzwRmxi8JKgIM2VmA4yGO8B8AAAD//3RdXW8bRRQ9s7v+IB9uUpc0NA0KDmlLQZQHXuABwQsSv4AfyS9AQuIFiQd4KKKgUDVgWqdJ3BDSNrEd7+4sul+zYyesFMnaOPF6dmb23nPPPSczgQajUtCCK9hmTigWRrdhuoCiY9Z/z8mSImgmlMAoH1UlrfJKyXtWo2VMu0mzGknRjS5Xr8P4kIVTL15C01iZMzgTu9BnYxPM/Pqp6saoSUSLsX4jRA/MJFpsXgcyNWuF+WRfvULF2iKyzaGNo8yl4krK3lrNZfrQWN5vtofSFyVAgkxI6MYqvVRXHXEVbf6IES8TU8minhP6XNowDTFkZIkGNRVKWXA9039PQElBRtGNFNd76+i82UKxn3PSvlQ2cBIZ89Axyk/x048/4Kuv363HQynv4qObsMgU3YfhcMjXwFSlygdAQq9e72GiFbKKH/a8KVBvJylQdxJ8+uUn2P7gIzzr72Nvdxf/HjzDxdlrZmpQUkD/m2wiibK/sLSM6+vku06++TfQXmyjs9ph8CFrCT2a+mwL9nIupPWgmOq9K4P1WfBSlokjS1v7Swvtv+exLyUoqlTMg3v/vThf0IYibhkIQJJXn1ejy3oFgXxVRJTHWu2TA/iG9HuxD2xZ1sWxsN7E/Eq84jMW2TRSBCECSxl9Ro52VqKVTJnmeH5+hpfHR+zZ/ry/h5ODfQZX8skp8osTwv0ZivHqCU4YeFsLLjOipVVcoa1qITtNbIyGaxV9E2XjBF9Tw9SGVl08iEZLSuXcn06CdMzCaMI1UqzeWMfG5g42tnawfe89rLy1jtvbPWTLy1haWUVjeQETeli6Cq/s9jlt4zFaZloGGhePMT/YnFxdsNEJgzz3Oq62zVFxXe0qYOeTK5bwfIDtDGDQARWGiO5xXthZTnu+BWwg1XgyTigxPDnF7qNf0X+yh93fHnFAut/vYzp6xQFu4qZq7jZFixKeACHWVxquxzyxrWVBAc7jg79xcriPJ901bG2+jfs7d/Gs3cZgMMC4mIg3NQU+vtDRcsHJIlpE4ZVUi9MIzK143vLDvSrRLLXtQRXAxd5Gks1G2kD35k2s39pAr9djIc61tTVO/un1teUOtja30O124ZY7YDRyIbEJWfvFjYGdhW189sXn+Pa7bzA+G2KcX+g8dVoDTrVNplYI50IxypkEPr7FpTYUFHq+1HVZVZcT69RsCl2KiyrHk/ELfP/HL3iwcgvvLHaRUlBGYBGrzjulVkr7s+dAYqabE1nWluupuLCOvHKclFEjwric4jyf4qycYDA5xAHO8BwTEAP7GAXOdWjmbfxsLkdEL9Ga0ETwKqG5+aIz9yQXHi+rHA/7e+g1VnFnbRVpayzff2r2XPQ5BOg6DpC9CaH62rdcAFGI9Z8PahJhTK3GXkaYG51fTJtYbCyh6dts75r6VILgvEA5lpYtsHpzhmaeagIv7QkEYFCu4/IESS4oRUJWsK4tDCAqWLCoaoIWBYve9HYgvtUJtSpc4DXGnPy13RIWiNpMgFPiwvOgiqnM7rINooQDaV1ljieUudfTeGkFPKy8K1kA9X27BADM0JodWz0aNTinBCVRwUX7oZWsiRDZnlBrDffhk+dOUuJ1nmPUSvBPA3h1dIiHwwFOxmWAOuqZJFaX9XWLpkZzsYOtO++z1W6VCDgkQo8KqNvahDigMCam+4bL5hkCdY+xxXvGDKCBY6tSC4zUVYIq8kyDJ2py0sS1xbfR2djE7bv3mQEyHY1xOjzGi6Mhng+eov/4Mfb7f2Hw9E8Wwj09OqDSFya+ZHYWFXYIaEgCdFaJu1Owcv2fQ/eQUp8zbBFWJXijcBp7CUyXH4zw4nAXg59/x0WjQmezi7sff4jeg3tY27qJlZUFTHzBLiy+nMCn2lbkncaElYJ5LmJ0zV6SxfQUMzE13NdtxFZl5aRKaeecJyjFvNVqYHomnulpcjneNscwREJ30DZajtMKAei4YEgxlTfAT223JYGY6Zuft9E0+n4QDgy07kKty722Asv78ohyb33o0PjBRAATfU1AYaC2e4VInSSr9HM+HnE8NVFmgLGVbb0Z2OkjL30TYIcm0QyGK53fPotyt4apy/saQEWUzMbii9aGzGLt1GqQV2i2Uk2U2/LdiEGgSWrQbJtrM2AwQlkD1k6Qmd5BWc5oKsh3EL0I+p21dltfv9OCqLUbWOG0qqrQV8+AhX43y/Xq9gQvxbO5CWvjapoLNr+sBSOefzzfaQ/U06PROZ8j5zgR56vvQ8xusH1aAB6K4cnSVt5rv/NFva/X85ryBcmZc1KsUSaJjS2xboImBRd15Z7ROhEdg1qXz+Zx+PtIU4HiK196/AcAAP//fF1bbxNHGD17sWMnKQkiQIE0xCEihKIKVaiq+lb1vQ/9m/0LSL1JVK2QilQJEG1DQm7E2FGc1PZ6vbNTfZeZHdvQlSyiJGz2Mjs73/nOJaWHhNCn8AUjmh5hAxhGSBPuGPINSiYXc+JSLU71TPvXotllLXLEByFChfHuolxolS6H0cULpsGJygOCopgwxjBmtkAOtTfTOia68FSQ08Bh2rspPcKY6HGGlKFwX4z2sTyhNvM3q4EkHQj+mrrP6iDKQATJJBjty6ZoKZWMoIo2EgAlNDzx54AKSJkGSN63xYFpBssfOK/cENTtIyrc5mia4WaUjUG0ptX129xB3X/7kl9WhKi7POvYypFR7vFPP/+Ar7/9Ds1ajReP9BsmFnM9fmgposZGODl5h3a7g7XWLS7ERF85a6zij48QSwUSoLpZArdWbzdx89YmHj7axHgwRH/QZwDA62bqdc3Tr2Fh/iMoqw9OesyRj3l4UVjLAAAgAElEQVSOfGQYIbRqEMNjvzDeaIMZFUlNu+3Q8TIpVSltlW3LkxqEAVC4ODwzYgaA/LxavJY+y7M6X+pAcSfPqmkXu9/HuugSN6rSTeYuAsTNTOp8v1hv6OBUQIVRTMspCPQZnfdgx0PuXBwcHeH4YAd7/7zC4f4essG/GOQ97qdKL2rMX5caw5c6cq/TlZLEg/aucXNuXPByzy0YPKGx+iDQSMaq2yz1+S0VAKDrl/FE38CQzrO5gIXlFaxv3MXqxhbu3LuHtY0Wlq4vY3HpEhaWLnFCSA7pAlE/OoN0fTytK3A19tdcJ3en5TO+c+ZKcOslBslU7OcHRq3uOFINfEDlV9DQLcJjW33c99Lqv8tY1kIvdfRt6pTl9PIQ4z6TDfHm8BBPf33CQNzLP5/h3fEerBlpEeRFETynU15toZ1IvibR5HGH/i/KhJ4BKWjcH3Z20e4c4uryFVy7dhV3tzbROe3guH0k3R1d0CdO7qN/J5xuZLxYr5ulTz0R80mrmfQlj7CGmNbUEqy21rCxuYGt7W20trfwcWsdN9ZWsbKyos+W81SJVa5jOcudOOUEHND5ULR8XhTotrt49ccr7P71Gm9P9vHb77+gP7jAqBDa+1wq/iVSjkghmvoF+vvkCLNkfBvWZoonRYpBsEFpKUVfndzx6R5p7OIpRnjWe4N2r4MHKzex3ljGWvMylqIEcyZ4qTsqoKlpkSru+dSNYy5GYpHZAhdU9NsCnbyPsyLDWT5Ezw5xjDOWKVDHP4ulmM6DZ2SKUCuw3tRJhky8gIOnbI5yBgUoVe/84mgHP9oE/Zt3cD1dwFw+RqMU6Q9P5dQpJx8EBgCMp+uKHrbg4prkG93UIFMX7djfD+vHcKA44fMZKihINvRRnvBCkTgeEUVRsleJUPx5ccq5iOD1C9OIxxJdTAcZUayVrTMgyQVXKeCVjcW4jkBKKvBykyEzYwyiDN3iAt3oAu2ih5EZ4xqu4JP5GIuLTTRo7I9U0hUBzvkewTxiXJPAddGCJkS48fgIlmof8heans18sRK5ezUrcXHFA0HCQwLn1bOHTRl5HVdy945AXALxSZoxJK8eW+I8H+JkdIaDQQftbh9nZemffRsARuznE1URdrxgTxI8+PxLtO5/xgw/AukStdGLNUJTwHTrZTXOd2rWO0E2knSlyiahf8cau+Uc68P1edjwsaptGNvC+2Ol83U05+cwf/Uy1h5u49PhGONsjP55H/u7xAzYw+uXz3Gwu4OdF88x7J3i/LSrmQdjlh6RPCXl1ABdC0wd7wSIbJ2qTN61NAY5stOPdAF0aE7PMwMis2R/t/F05zGefP8YN+7cwBfffIXWo/uYu96EaSxIc4HeN6XRa6lNmsjRpa2H18Jr4STDQh+XKGKqBVI11JYu/qxTOrF9neyMagZpplXGeqVfj0vh6aTHUMmi3K8kMNVTfXVcvVVcjRKH2mh3Lz9gvuu2wlQeXWWpxe1g4EGBiiAqxelYJZkOHKA6h43JY7lGrgah55iOsdFsCs29VqUCTGvko2BN7yj6qebhW+dbpt932vhUu+FGjyMOJNCuYJbfr8CLwl9jAXFknwJUOOl3dV7TjYtKk077qWuzmL5VKFiRJrP338vKJ9LbBNSoacTidATs/8mv3c+ML5DjiZ+56xte43Bf0gSX4nja4JA2lqtzjGKfY/+mJQ3uHCrQR+fpRCISB9SQc7F879k/Hbd7HuRvie+B21yev5PHMNOZxjdL6iUyNtxneH6Tx2pgbYn/KLu25qaqMLrOLW0KWCi0ASnUIjCIgsr44KjvvvpHffbFN5XxwfFBBzvDpQyUtNNLml7SJCf7XJzvts9OgHHMS9qmSc7Ze599vm9961srnbagi32POdRCwQbdEmFJiiRZYtuFrKU0lIovYE6AYxFyc0xHyLRvRq07tIfGLCZiPXi7wIwaAUuwXDMArDYabCIetAh8EW2w7VzI7zK0BzQ2QZIE6E5sLQPNzW7WuiL8TkvkIhUWCS/UcNGZDoHYd8W8YYxHYySpLDBLWOkCHo6kLy2Lm4SYN5SisXbg4wz0GWb7XQDpBRGmhYlrVYq6OWY3CNW91DEQdNSfF4EQShVxVYl2ew4rH6/ixeMN3pQFZRfVZtXK4ArLq61n2Hy6gRu37ouiuK8GqKBPLYHUpCyw9foNOtdW2KJGOP9vgxrGApDXlCJcS9DlDKlNI5ybBybtNhY7bRXbgKfYi82xHG/Eibn6oBZWoS8k2SkkRfXe8JFeSKko8tdVPRU5VME643Ws7SEGAhgDoKgkaa8Kkb+ulSLE88Y9/1LNKsKNlAS/WokK6+hmF5d6/5WbvFO6UEL0bxIiVME56XEkKz5KACYsukkCfLQ+ifbf291Gf38H3c3n6L58wT8fHe1pF33lg815FJij848EaEippUTXO/Xvl1o9jyOl7LOVW+TnLNG0PtJAoVLqr/XOe1aFkrsdiTMGFNITd4YsaWFu4Rz7Oa/de4C1u/dw95MHWOqs4vr6HZy/1EG2kEn1MwUnbGeR0FMnhYAmTG+KIh9UhjcoBAEx0aQ4mFbNAQSAwPtYN//nEc18RB0EcVKxSlXrADPjJE9EyyPl8bOznIXFzo4GOOkdYffNDvq9Hp798wRP/v4Lr18+Q0RtV/VI7C9FAg45QyJCF5e2Kf14Pv347QQgALvCDmpd/UyXZ+SbrPuiFH1ydhie4OrKFdy41sHND68yG6B3eICRk6C/gTE1YJ1hVtkKpEoigTgurzDXbmN5aRlffvoV1tdv47MvHmLt1jpW127ig5VlsIddS6YrJ3TdwGimS2q1nWwiSZy9zLG3u4uD3QO83upib6eLzc0X+P2XX9Hr9nF6fIwCE6rLkQGfzD31tBcli8bBmCMG4Or8xGgU4v26mr1lvGcJzVZiG/6Iyf2BWweoE//w4Bhb6RJuL67go/OXcTFZwPn5tgJHlQ9saDDcyGFCNMkiR+7GGBQjDMoJTsscJ5jgFKU+0++FESAwIoeSWuZArg3Zm4vKTR/3f6g1zr46e565E6AwzRIcuRKPd57i1f4e7ly5ioUqxiL1KtdNAqzcZi/GlSaNAG5OmgFEe2y3sD08xZBT0mlgppoaW2E29NwQe+UIqxc6yJI2MCyQuoxZYKwsS0E8WaoSvYkqemTfFxeImaeuVabIhNparBPiLR+J9J7Mc5/1sHI4dgMM3Aj9aoC+O8W26+MkGWO7PMQQNa6jwL6L0apFCDG1woQl4AoI2IP7P2sVTQsAgBC4m5qPun5/7/+7/t8Lttkfyql5tXsdJyO8v5S+cl8pcFvw9V6qU0XGfftjOIz5FZHBPE5y9CpztGiAspCRZLMo9wbSe0jx+Tff4cLlDsauwITsaeemCwhmyRc+IgUh43esxzgyf/PGhSrRWEgAgOYNicZmlYJQtA+STdcwn0iRi96nlHBaRkk7Q5RlWLywgIudZdx/9AgpfsBet8uWg3Qf3vjzD7ZSpVatk8N9uNEAVZkzlZfAo6RumGMGZoW7J7NFPNhVqt1rU2jIdGTbSYZzaYRhUbF1MI3n2cYOfnr+I5Z+/g0Pv/8ad799gPRShrhVS4GmclrRFou7mNd44dt/mti50eiyJIOBhLjgSiPT66PaJ7BeI8Bo8CRgRu5XpIhvTGLTBagb/auQas4V/UAfoA7YQeHaN+X7WZE+KUw1eYZfDxWUt4VGP0xzh4JtonMuKtLPXKmdl8o7LN7XxDsyz/wk5rxI4qRSxzHhc/XfqQmvCd7B9++/DQR4pXtN/mHuCMqOYHcb7k0vPSjB8ahWksM+fKnIK2Mhhm8jK1zh/efrUBAw+LxZ+j+CBJNZrHb8wTFLPtf46nNBma7rPMcC5SUKQth3cEt21uJ1R/kL7X2zTgmRHhdrvMWxBzxsbEKgwnLEEAzlsdekgeaKXRaoHYIAdGLpmGNCmFSTfgm3hhfcsmsaYf6YgtiRgBDKg31x0lPyG3e4qTXLOhEyRsKkbwQkuWKfCfOe25bIsYudACT3MOYxjxm10ehYTrWN6efwPCUx/gUAAP//hF3LbxtFGP/NPpw6cSwIhZLQEEBQNSpC4sYJBFLFQ1yQQL1yQ5w58b9w49I7d7hyQEKIhzggpaXNs47jxHaSXe8Dfa/Z2Y0qIlmRHW92d2Z2Zr7v+z3cVz9/WxtHpeAqfSTCZjrrsEgeQQ7q0mdjzKaOHmQKWA3eHKolMmiSfPh7dsPyd9IJYG6FZplqPXcIzbcEQxGoNIbZu7Cx0p7QAownxFk6hbIsNMtmXItUuRPWUIx+iOOWT6idkwUwVHWUF4NAYEQgTjLYaVEw2Eocy3comLekhYsCb0xdNFxHsMLER0oVObHFhT1Gy6z1fUNYUKfTAOwlSWtwVoGtY6Qwah9Mqi8rUyM0S8vtZhCgRGBUNjk9Vw5x8NMOfvzuB7jdMdIyYg7suW5QK4gXfYEUH376OT679yX2xjO21qrVDotNxGlQVxny8gIbmy/ig7vvoz9Y4skn6iQAQgiiQLVFhI0FEDtZxygScQuqwpu3rR0n8KZSEBAK63ahGmsn8+szdWFwQuq+hfzfEC5VMo1BxBwRJS2blVw5h3Q9xEmjChF5b9qiwCKMtcBZeWy5ZmJiCauqUMFM9TtdkixjG3Yrz1NCqtXnJav0kz1Rns1wMR1jcnKAo4NdnI1H2Nt5gNPRE4yPD5mp68itgLWFC6+1rCNHJ6jYi9dxFWvRlqhywfba+MApc5GhtIZcFfgpkFEkUS2vmuyZHFXM+qhdyiJOGX2epLg2WEZvOMD2W29ifWsTb9zZxkuvvIzr6zfQXx2wUCNF/BmJb0Gk7eU6RWgl9rAqhahpIipSSBXUfsddweHrfSoqh+7boFNdOFeskNPwh23ZIuVk03zeUZaNgowwjbFYxY+SRISD8kxiWYrds9kC89MzTI7HzCE9GR9ib/8hJqMD7D9+hMnoGLPjY2TzGXJKJFLrE1JJtRgcQ9IWDULDVSpI12zQmY/pNOXjmrHUjK26de1LOkK6/vpOkSo5e/iDq9cr6Qo2XljH9eGzLE45mZ5hd3SESxYNzdmTvlKxNuK7EnyNrPhoJJITA1XyX7t9i/t+89Ut3N7exsb6TQxWV+WkSYCnl9ygQsGD+a8ovJhtmUf469d/cP/7+/jz91/4mSCP7fx8jst8jhSpMvgj3vSJHONCgmongX7ClmI6TshWkq0bm+py0knyXC206rj0ba8uEt5aTvzDe97BwhQQ5BYHZDRCUPEaTPVYdysYIOVAmSrGLkCFEWz8MsuEU1sumJ1/wSkNSm+UCmF2HJDl2pS5BsWFwf6dejaogFE3rOwmALrB1tPwMSEPXQHe/FmqL+j997lPrHspAZNyesihvU44X94uOZCeoMB5BJxRvwdJmcKJwgS1N8kLDCqAsCKf3Hgb723ewc3eGvq5iGZSsMW2fqWSqk3FkNcyEYSp9cXBbRUz35+g6Xm0YIg7aStMF1NMszlO60vs5afYnZ1g93KMKUhsccF9YvoKfe3rRYBQCEl2cSfg6yEoEPj2r4J2af/8Xwqz23/dPnNP6VXrQwvaSxNx9e/D7zbv+/o7U1FAY2PZsQ5GIWyugtYImj3eufsxvvj6Gww3tpAQeiNKeL2Nkx4nf2Vur3RTXDDdJFJbMQu8SAOG9oDLy8uBbV3k95w8Jyq6zt632kTVu2kfS3sf0hPgPUVkLjYiSsnyP5SQr2MeR4we4epe6udmGnNnT04wHU+w9+8O9h89wN9//IbRwT4OHz/EbHKC+egIcVH6lr2mmDw6Lwu0FZrg9Q+YqcbUDWrE+oDWIZfK863rJ9G2sqhCtgKs3drAu/c+wuD15+HWUsyKOZ4ZDlFqsY7WFhdJ8aRWS9Kmk3WfrRxq2mPSPjJKrqrAO9X5Ms4/C28HhT3boyVxM/ptX84OWEUjlMflhk4gHwqyCb8+abkEWBEQiigotIhnfzfKrv2vQt3AOD5Sq7Zcq+yU4DDUb+SLjKXnwpeLxpteYO6pt0VkxEMkqvZhEGsVeqowX2hhsBv8o1VdbsPW2ftfkwp2jIkPWpKmKEsVBoTvE9v3GIpBhMqdpzWYFpqHtwcV7G6xxGKOpeW+jxeFWh23rP+coroM0WAJ3oVWuQmBG9Idqo4AoS1/jFLQdgxdBcjm1gQGja5hFXQRpxfkhV2PnSdsuy60P+wPdk/TvuX75lhR7QHZdpv0z0SIkGMCotcr6kKuW/rDjuPPaExofBeayjVJBUIGVKxNQRbGFsvS8XlWMOXbJ9euoAxUfJ42KgD+AwAA//+UXU1vG1UUPW9m7HwoThMnoU3ippQWIYEqNmWBWCCUDQsWbPiHwIoda8SKFaKLCiFV4qNBJA2J8Ufc2IntmYfu15s344BaS5Edx57Jm5n35t5zz7knQ21iOqVMOfUdpOCZB6u3AvPC9OqD6BUpJUSC0Amugqq2ww4EIyxmxZIm0eSFThiryidB149QhS+p+jGCZ5NdwAmt6qrOnitUSrluamdN6bAZbzcLJwwRJaihHT2hkoP44IWTT4tEgYBuCdtAwIOYpiI0D0Mi84Vt2diyTEGCyFuVFsjl5XLxdJVFraRb1REnbnISJSxpdIMXX8kiIEzcaEKlDnye6HVSpjgTP8f6/hvYeWsfpyc9pEQ3SiQgtVsS0X0paH365Ed89vkXfB2QdpcCcdbxQ+3wGGnP0O32MBlfY+3Wmoz/FYusPqIKQ4OE3KrpwbGi1CcKylWl+0C7YUrybzOrqDwbmqt7EUVi2Cb76oV+EbbYhuOnABHrxphClPH8ySNQiYIOW6gE7ApnVTTPzUySDEpiHNWX6CYy48p24Yn+c83b7/e7GPT6GHbJcq+Hk7+es46/d36MYjphMIAadK1yaykKHLzaKhXqjC+PVGnyZYSea88ASXTSSiAYJ/+WOslxIiqmY1sTsy8Cs0nGFEsz/Uy4Bq31NlobOzi49wB7nTexf/8htnd3sXu3g7XNW2i1N4ClBhrLTSRLwAX1dnDAyEsY41OnPTRKan1ix48WXFYolF7rCTXe1KCZpE55XOGO4xdf1U1VUPcaeyC+Jn0IJtLA+LEKiNzYmiKfSGSx56o/Jf5XOYbDAQbDEY6PT/Hs519w9NvvOHr2K7ovThkAYE2mH8MXVxB/8DlWXMa0+gZFvLlnloPpeAo+v9BUT9g/BSJrKq9+3L4IiaqvB/cxS2JhbupnXRH+2NT8g4LN0ewl/jz+A38fn+BOe4fvBxsbbZxfXKDVaLFlGwUEBOjsdvZxp9PBg3few97dA9x/+yHat3f4J13JeF1pEmATJQb0M8984JcQM4V7SFScaNR9Jhfd/vff/YCvvv4G03EfKF6SEpk1uKmyVcxQkq9Yyz5e8aH400JFrnKNRJuzXgZ1zpNfWIUESHCqb586eSbLsAt/yUDA0lSu6jTahg/9FKQKa0yCebTDvBC4KI/2a/PVa/Kfa1M/HxpQ3vy/lu8sjge1SryP/hbvb6oHyIBfxxBFObYmrv9TB23v5zbOBdcB22kSuC6UePYB/HT+nCu3j7bvoeVTrGRNrCYNLNN9itbA3CsoIOsJy2ZormdSzRQNvGcXhMk8x2V+hUtMMBiO0bsa4Z/xAF2MMGCmRc7SuGtLfKM1dRQdDwZioiZ2iS87xJePeQ2Qff1H/fv/t43kNfZRxOdZk/twe0tkPJPY8aK4QePuomdvMsgE69u7ePzxIVpbO0iXqPnnnPuMVCSaPgn2btJoS31btfrMwqc51O99Gjy5F/4FpdPW2X9QCi7rmqmhG4H55PoAF2x54cp5DnXvkPupZ5BiRkm0MwAswerWFlqbW7h90MGj6Qf48JNDXF70GPAlIODF0RGGZ9JPoH/WxXhAbi5jjKnqy+tuxpIBx71xaB6IXK/BkjWR0qTR+uAVGE/1fWpytlzk7BQzeHqCb8++xPuffoR3Dx+jvbfJQPNM7QOp8k2SVpEciLUwy/booJrdg9NEzRf6XCsgaKO4OBl22nzcLNpMt85d2y3yCDZzJVMz1y73Xr+T3kCptkqqMF+lEMCyZMoVaq4BfF5dGpjL7A6WpmgkEqtn6p5i22Ht9SyWdUa+9fqaPegTAZ1YjhyzFrxo1G18/P0oobZk1hJ807gvgHzRmAOYQD0GFCzIlP6fpJZsit7eCrVJYDjMaixqkZ3exISM85JK0SCi8nvtqWayh0JZG/Y5p82+LV5yygAIuUyU38TjtGMcF1RZ7pDnlThN9j9RkCfntaIoynyJ3pfm7JK72u8hYeeG+GVhOLZ+p2NFiTg7x9RyMN43Axs0Hjnfdm1bI0D7PDe1XFnlJrAGkpi7nfQ5qK0/zFAQ8EaKxgI2GVvf+kfYPmh7DPZwE3By6dCmtjSPAPwLAAD//5Rdu24bRxQ9M+SStGTZomwqlB0YCgwLsZAmVdK5TZEiZZAin5guTZo0SRG7MpwiCAQ7jizBlmS9LJEUHzvBfc1ermnAWUCgqMdyd2Z2Zu49557TFOGMCQ9Eo6sT+k8UYsvc2OCB1uwY4ikniPMdH0O9cHCuQ0xwK/ssmhDHgvp2oQwNM4XfC/NFR4OPjt5hA9gCcMv20ETshQatroRi/agZRt7oNxYvCNUAN39SHQw11BmW2Uul/gw5EAWwMJCoH+bRyQmIME/1n6P/x2qRnKOqOasL/3u6v6ZqMlwNhtx38+dOgmDSREF11LMJrneX0du8g1e/P0Nb7cUKJxLVKgJGkxmrix/u7+JafwvNNOXNOW2UClpkaaNOmXKiA46vsLe/h95GLyu9wyV0/OwWcg1g6eyMwtym2ugsSZM1SVZiXvxLRc55G5uiQzFFSA0aNAW3Q63XNiUWoAuZUmV/Y++nagPiNQBonAkThTaPBbcpPdScrHKilRSMLxNzJAikyX7CkzHS1QCXFwMMLs75++PDA+ztE636kBXXT07ecgKA7IxGkwEjwHEmS3yLvyJucCggSmeJEQPZ6kXVEjAUk7F7Z0mU276U1uFrs2gayfm3y0F0o+FkLPX2k4hQLGFcRnRWbqJ7+zb6Ww/Q7W9g8/5nWO/3sXH3DlZvreFmdxXNVkfYQEVDa8VEaT8Ll6l9YbLElqKlQr/2mKLSPKMmN0KZXRro+Z/MrN+ac4r7WBCwRXtebJGymsEFz2lQgR7PAGA5Q3IvaYr1I23gCd3nyo0JcPL6iP2kX+68wNNnT/DnX0+wt/+C0X367KKEJmhEdXzGagYylxF7YEiK0rQ4lJxyUVVpob1GDUxy3XDUOQjIdaGGLEODi9LV2daPmOc3NzhUmCsYu0np2rb/GzKtPOHd8T7W1tax0lvH9vYX6H7Swz2q33+4hXubZMv4ADfWVhE7nUpJslklotoQZWyVTuAAT9C+gjUx6LpobhmRMnGj4DbnSo6mCCdSoEaX+sOP3+OPx4/x6y8/46oMjKAVnIiZspNNQ1MMpWWD1De+NN/8VAVBEbX3H5G8DKmyeZOpdgbdV8mYtFIUVc23UpDSmqL0Aq2CaF9QDaKe3ycAhNFjJOpKmd8BXhltrScdDHWl65gmqUhOC/Dh96uS54+y5ivfWNBGKVvCqVe/HlVpTGA9HRoAo3yflchg/ZR2L8o4lfOE6r5ggvlBkik03HbKM5ycjvD3+R5uNJpYbnVYHPB60WZr0qKMaBGqYgkATgKU4sWuRHYScjubTHHJ4opjXHLJRsl2jyNG+aX8xRIuMxdwx7lAvCrFCRowTV0ZHbIOzvte1x9KjtgRFvyN78H/E+D7w8adnTtYgOkSGFlkSG+aNS+ypbBPQ1epg+AvkOdPKV969M23+PzLr1AyOpbY4afTaTPSL+ymWCmJK7qdMiNHOCRJJ6qY53Rp4Ax8JcxtuIOKMpY14IYBJQoMWNwxaN+mHNBAtWakjG6a2bB5Li5Fi4QZhlyipLo57Ra6G330Pr2LzYfbvHYNRiNcnJ/i7OgYl6fneLnzD96+OcDrf1/h7PgAR7vPMRm+w/DyAsPRQIQEo6G3U10LYtUh+nzOgoocq1DzSuqgPZ1h8GaGpz/9huPdA3z93SMs3b+F1BaUm8SSiZ1YtUVD9lkz6UMLPppaMx7Ub9wztKjdrBTV++mLcLeCPJ6q7Cj40Vm3mRWd2Wt7v/65cap18ew8pgmJ8XjIATAH5YSWBhHLznZ3GvwbK9jYgfyKWWYCcBkBsaCd7Z+nwIesxUXC1EvZTaDhkGXvw2+0+cwkYNu6RmVx7tBt+3/9xw8+pxxQq+Cep+zntnKfLSyJRhbYS6pRZaDYokTAxxwUXFcJm5QD09KVEdje3YsS+mcObm9eD/LN/nBRbHVNrdIpkBdhxJgRdwKFPTvb+p+voaY7J5oU4qRl48b6yK5jUYxn7HBqWzqX2eNzGQszWWSPagwBiw/q92ivNB64HSxZxuXl+pwpi4TbVRNNdn0mHEmJPAaC6XNSwn8AAAD//4RdW2skRRg91T2TTGI2DLm4hLAZlkV28UWioCAi6rv4C/w5+iKI/2Uf/Ae+iAqCeMF9MDGTyybZyWSSmWS6q+S7VVV3os5DyITpzlR13b7zne+cyAAw4T+inFAjjfrCKJZmss1X0jrEGmsIjg1gr7RSV7vowZhPjLxh+SPLmQDQRcFqMFIn1/Gz/B21rsbrRGPhBB/ixDe7BqF7dJLSpdJQEstA7it04Speb+Jh7cHIVIrgG8F9qYInJB5FtG9B/qYq2lFGxDM9UEOvPC9CTN1RsYhIkWoN6sZgKIoYsISWBYh9jmtnOkkZ0gZEqVQbGLVZhRivrq9lgSIPeqIT9xax/mgT/c0+pnsjyc4QWSEoU3IeRPCrmuHHH77HJ589Q1l1ONgReo8GEWypVjIA+OfvLzAY7GBraw2+tcE2X622WyAaDBFMwIsMS0W4vfjve81wRn90LwrawXsNIH1UhQ9az84+1plnpuhqVUk8BFIDSbY3dBDhuoiKFJwAACAASURBVLBgaKRn4MxAIqLm31xfwdeiKEwWmCbyZmJ59dUY48kIl6MLTK7GODo4xPiCMgBDnB4NcXV+iopsqqjkIEidcvp25BPuxZO+cBHVL1ScMYnwuVi+41k110C0HMlFnHNOPb45nNCsmlOf/ds6sz8kyzISJVvdwEPyit8Z4K133sXW9gDbgyfo9dfwYOshQreL7hIpJ0uWjkQRKTitiaZEOT+u8xXaIGkjiG+tKCT33ELKihIVlBFMDdpMsdmJ2AwLc7F3vx4x1SIqOKMPdmJNa/uVbwQ2PyT4N6AvvfKylcVSMi1M4CkESJnPwJs9KQAfDk9wsD/Ei9/+wNH+AX796Wcc/X2A85encI4qY0dw5Mqg49NxTkegqlrDMF5N/Vwp3IkqXiklu2NOCsE11wAS4Yz19xFqa7S8bHjmNz8h86cwo7msE0QMLjKyClXRRonX+mtYXe3jyRtPsUUuAbtvY3vwGE/ffIb+xga7sxQLpVBmg0v+oyFGEXpPCRZuLm/54DmeXOLVZIwLcvyYzVj1eH19E6+vb7C/ddl1kG3DxVCCBPC2dpbx9Tdf4csvHuDb588xGZ3g1guLgNgCLjTdGQw8iWKncQ61U/t3x5C/UwLgGGg0sMBrMGJlJ1H7wjKGLgWqdk1bif8mJKfwNE/1WWbveF924Dr0cGclzZ5vBt4wRygYndvFMoXGNf8TLebgrAt3GQP3HlWziyRYCMlOU3+GVhhrwI31jfRqHR0WfPwbYPXfIRPbPCcKJaY49lP0PLA0l3IXOuAvcl5U5tSC/s2q18WYSVgUFfujKDilc1Ok3BznfcWmU8qGQjZ3zL3PZy1s9kcR69Xt+9r1bWciW7jvI66YKn6cUvdus64xlJt39//6vG3q+zjbXMSIfTwnyRktZjUV+BFdSJtdrV7I2suAVLmA3fc+xO4HH6O3uga/0IO34KsQZCGo/gKrhvtKKNpVxWy6GlbrLSVLtA9OpzN2CjJBNacuWNA9pnmA1+BD22ACXVALQaIYW/u7zOCcswI8s+FqUTexAzpbo5rGFt+uxsrKA0xn0yh8TQd0SbwVcL1ldLuLWFvtY+PRY3SDw+77sleOzl7h/GiIyfkQo5MD/LW3h7OTY2YKvDw+wsnxIVxVoEOlu/kDtofkBKAwtlyHTgxkhzd3qM7m2P/uF7bH/OjzT7EyWMeMbcxueK0W+R/Ltqezc1BwJWoCkI1c7WPpqWXjg9akh0zTw6l9ad3K+BaFi8E+BT/EhiTaPXxiAbhMG6DJ+ERM0BgTmPZn0pmh50Hly+adLnHAIt/Tgv+gQtplqfpjGlzF8hA681HQTExa33TqiAxdTS76MMsCRAvwqzjeI8MhC/K9et7T+ShnDjRmbxbMN6jpeh69j8EcssBbsuPzTFgxFwuUc3FOhc8z3W12srEW7HcL6E2k0eZQtFycV+gxUyclT8v/aGP+v9L8LBq0/nab6flK5t/GmMVBNXoaZxrTO48/BdBJ5SVcTp0xB6zkPW/rfYKSZicoYKK5E0gyNpSiP8CJ7qmUitCaQudgKyOmc1/qBwEgmB1DsVuQ99R2YkzSa3lppQH20O8GVlgfMRhZeFR1jX84u5LdOIow/PU+MY5QUGziYBiYIBNBhMIVcQGCiATizAWJGy+AxANwRihXHoUjhySCa0SSibAdAjFJbA/y2ONZekH/VlXdTpCgLz543K6p6qr+l2+Jvrr5TbNgNUGBhDAcYSq8E1OxTzQpJQG7OEncoRkm82HgaUKC0rXy1TxbQBP9oPsJp6hmvgtzF+ciaGH+rLl20+sqCPiNT5N5NEEVjMXBdhmNELmHzv2+hTaoffUkjl0SnyqfP+QVmVBMEyhSMpxKxSkEWibqjXSgsPtAWTu4E32mtVlovnsifhKKkvhxCqfKqp6+eLHg+5uQIq2TUSHSQIgFGgQYDMQ2YqkwHBrrqVwOL+aoGsRILYmoC1dMEmB7gl9++BH3bw4ZHklvgONI7JVmlQQ+RZRjtf8Gvv72GvYnJQ4mB6gXDZJ5yhXKWsOyo+kYSVbh6idX0H/tJWRp7uYRQSDjoP6VbjBDkGRUjZbDViwb0xany9bGbKOki9aIICApTNcS0JcLkSkimHkdic8u7ylV4Adv1tLbDOm4puyrLwJHtLbzRcxWUlwkKIUbR3NNYWOeFqwCTAdNNZtidniIaDHF8cHf2Hu0gye7O9gbPcTm1hDj8RiH4zHrR9SqOM33CIL6RkPQmq3cNAmGPzi9BVIbSWlBNH8u9SIusapc2zNtUCHmtdFLMHoOZZOrDVosXZfl0ziztooLFzfQvzDAxuVLnPivrq0xT78ocvEVjpRjrEmMdecIARJnqYN3ZYmHPLH3a92upNLZFCViK5WqBRG9NwVlYS/LkNMXuyIkOzRUsdgHRSYiKudWr5dxAYf2zdJSIaKlc/M7luBSVKXlLOPAb7rg75dGUnSnM7eeAbMJcLC3h8N94u7/gSd//o6te0M82nmA7ftD7I8eM10DHYQBpwtx3Rq/K7C6rm/7pWLwflvfrNOljbXwYwmQ79Dpy87B+EX0sFB6hEDGSxaXbCLr5KY8f2lcYF5PmHcqZz8pZ/cQpTFW1s/j7NoK+v0+Vl48h/V+H+uvvIxXB6+zO8PZcy/4tqd7KO0lLRxD47mRHuPBaIb90Qh3bt/F3Vu3sLN1Dw82f8Od4ZAT/+PZ1FHNorzA4OKb+PDjq/jgykcYbAywvFyw21+SSNBOReiCzqlD4PpPN3Dt++/w843rXFwqp0fCSW4WmDWT9hCD7qj9ZJ6dpqKRQwKE+7Od3gpVLNVijvWv68AuTRBGfv/W/t6xFCGKgO2OQLPD1rMbhLmCsJo8lnHcSg7LwEnHniwv+BZrctu4opD9H3c+dyG2/1IQEDeNJjiDfK/XiiGW2D8twKO/z9Qi9OlXt5xQt6wIBTGhqxJZ4dzfO1aqQXedw642WoWEzrwF6AP3+1g6RTYvUkh6diLdojVGNr6ow4P//9eJ7n8nRj0RULd+/99H0IXUe5tb/3zKPIu4L1X5nGI/zVceYVY1TBWgNPuty+/hs8+/RP/SO0ifP4OKXG4y8cJmy+r53MU8iVbXJRGfcawAFZ82qzaxNBMBN7pHpt0wS1C7lyuG1p6j63i+Cm02dwr/HvUCaola+5pLFlvlua61NrPKyrllcfc8pLvGkjiZZlGu/GHTJSEGBFm8Umw5OT7C44d/YX+0i+FwyO+g7V9vY2dzC+O9XcaT0d+cRoaC4n3yCVdRS3uOydmSijTk7HCcAYN338b7X3yK+nwPk3SKJKqQ9xJMiRaQydiqcqGWzV4DgL4ixZNpVjhoc9josQYbC0/rmWQuAKZ/xYKBSaadUmkmUtJYGQKDkr048jZule+SszUeJUuqMYZgr9maRXFX0aedxFqDrXuVge8+VVcICm7i5wgSVvoOrDNN+ZU2Mo2f/6yOsaEKfQJ/sgkYIgyIsiCOFXErBzI6BDVDOPlWi2xYI0SvTOe57hRSbC7YkakstYBSP2UMyYnmSXiF3XuL02ldGP7Oe7DrKhdjciQK+0znmZdurWwt6Sfb1C/kGUy1C15qIh+O3/ImLvZR3pnlTuOMP6c5WRcd4casTnCGfKfr1NKSCPsRRUALYZbPufkxsUoqoGiib3NmRRZ6lkkTxJrCXDhT+hLFvdIAL0Tzgr6/7gPLvdk6UzVIzALdbBa56EDx81wKoq7jr2gMthGvavwDAAD//5RdXU8cVRh+5szO7kK6bCktrQq2NqSmTf1Io6m9Memt3nij0X+mifGy8UcYvW0TIwlFS4Tw0Vi6WwhQYZll2Zljzvtx5swMmHQSArs7zM6cz/fjeZ+HSgCMNBLVOoQsiyq7k7HTSZM9INNQjU7NWCvBhGZA6QbEkacJ3kzooWmRlGw3nRqo+xF5kxIqCCzFR2GqDrLKc7hNRBZwJeSAK2XIJTItjKNQeQ7lL8gZKpz7zjeeNZQ1HsOoXtn5V/gKZb8kO5qJfAmCxUYHoTr/1VoRSKDEEI9CmR1UnzGR+g7tWA18NCRKScoCMTNgKvmgstU3gmAHQ/zHLBOSJEQWAV8Tk3upEMgmdzoeUQ1zcqGBmflr2Fpch00zyQ0bMngTyWC5Gslebxsb639jbuEODl7vs3ySHQewUcZ9jtIR/tnYJObwpNM8F8dIC0zlw5DsWGFYCAxIIhWijHyBBuDMPzOcF7JQarYZqd9X46uQr6JrZYV5R7wDbkzmTAzpMtlZHpPT1HKBjISlAwhePEwxGhzgaH8PO4f/Yu9VH0e7O8TW/nqnh92XLzA4PqAsb3o6IOdqZE8pc9+AkDJaSKW9bxEyzxXyLSNEnAbjM/7hQePBFka2u2fu45hg9lzxz2EGZ/gP8iFM7vq2TZncd+du4/p7CyS7dvmdt3Dr7m2CczvSNkd4lbXYYHBBmaxhcJjZks5+HhUQS7oLCSASo7AV2LzOMSOkVHkF1SIIjlxSeFY4AOhHa8A0cCQL8liyiGpcQoIjNosIGmkzDky5ueWY07V9aTMRuD3zXcRkKCVZRH1zuHuI9HiIfr+P/vYuNteeY3vrBTbXVrG/08PBq5fI0wFOh0dEv9YQNoSWlJvU7IlaCb466DJjfJaFe5/nXXEVC1U6kMCof1UGf+q4jlBxCKGlMTyqRsLbYV0wxgU24wTNqS66rVl0Oh1MX5rG7JW3ceP6Ai7PXsP8zXl0LnZxZfYq/746Q8PNJDwETgwn+Iv5yySvzog7SVPs9vYIIbH89C+sra3hj98XuW17PSLrm3KOvCNCFdaJjOD/MZUBwDSx+OQxlpf+xI/f/4D7Dz7D1999g4/vfYjpmWl0p9rImYMLySTw8IsHuPvRT/jtl1/x86NHWFl+iv1+D01HPBdNUulIlg9LzqB2ha7/Z9VLBNt+KWvqtLTZ2OMxK4KsgqoxpJ6BAAjNdbW1AVFCG2TB234EBHXVY2t9IMJ9o2PJ90HVCKVMupJAeiTpGRzset5Zx5uwy1evWyV/1Uf0DrqJimAI6szuclY5eCbv2WCFj6ygMvQZ9bVcblxqy7OOOqouTERo++tL2T29o63PUCgb1NskzNBbxddYIK6ffk4b/N9RH68G4b3XP3/Dbi1fuxpgsIo2i0qBlUhWJFNUCDAnRBZhbFwQIMf8rTv4/MuvcOODe0imLmHsFKcc6W5UJDmI7iMvHBSCOxuW/aVMl5sNOSO6nF2ZpscEB1a1JLfbEmozbnnugGpjMCFZAdulbGIm2UZSqeIgX0tIpp1TxvtVOSDibNsqCZz7292LksrVDkliRF5Lv2wfHp9kSNqcPLvQ6aLRvYg5Y/D+p/cxHBxhe3MDz1dX8WxpCZvPVrC1soLDgz3SIGe536i2glF52Jj7cv3xMvHyfPLtQ9h2hqhtyVbKpdNsxvxOfj/2cH2LmJzeiJyoKkGfDfiTdF5pu3jIf1jKqv8Tyna7JJtIOEMQtSqRp9+jBONh5j6yYoPXIVtnom6L/uO9SxfhyYkJjHJW1zKSpCAnLdZ1v9iBbZCZ5tJRrsMPYe2akfekeaS7Xw5qhoEqb7dX4OIlJIKoUkXSLnqOBkq0DCOWUgME65tLvGQBxB4ix0jqbZ6XoEzKdx5q2ap6lykSx8zXVobuO5sgEQlBRfYypJ0DS26uxHEmcn2OFHpEC6WqSaivWT0IiS7Kdcr273wg+i4t5x2Pybl38oe6Pjifwfm2LghASFVpg7DEIzyoNr/ZJOUtRq9H5J/pM3EQS9AFMkYUWULtKaUI7fYEtdUw5SQv+cGCJCd/VeTsw4OQCaK0pySGlLQQQkDlDHDIA/LtbY7/AAAA//+kXUtvG1UYPTNjO7GT2HGTBtoqoLZxEAQhdiyANZUICHWBkPiPVKKVEEioGyQWPFZIpWmSkjgpUdJHkjZ+xJ476HvduWO7FYKRrDh+jOdx5853vu9855TY7kD73014wy9BxZqFI0ZsKkS8LtFMTlkpVcnYgDA6A4IM8UCp6TKhOhFHc6mKtyhlJxNhL/ZVT2XipQxOOCnwidfeIKhCoil5MjAYuIkny2gSQh82+k2q/bySVTMmwasWAqCdYdf37cNPVM73D9EAqtaq3uvUgpaErRrOg2SB88kTW0xwgqv7pTyTZbYnRGcSilE2Tg8MmAY20Zr4SaFvCZMprZARjUq9iqXWMuJ6Bf1en0E/NLChDFiq1j8Een//9WesvvueJB6YeeAKVYdSQj3xMdo7e7i+cpWPGQm+hTp9Nr5EI6JY5UrVmo+y/bEmACwpIxONjIWhtqvEapPDAUcsIliSLaXfiJlhkLpgslYfTaeskjioozpNupTKWo1XD+9hr4/u2XMMOh2cHD/F86dPcNDexeHB3zggUbSDPTx7fMTV5N7ZCVP3CcaVdL/KCuKnw45erRK7QOROKJXSn5QE58DqvlAAnCcs4oBZYbQzqJsCTQw1dB3RJCuoVucZ1K+tXMXyyjWsrrVwfbWFK5dfR2N2DjNzsyx4kkyR7R4FaqTmniIbJFAWJPusj06IojORB8g05hMIxV/lGgJamhMXBjXrlwpKUhjHxhDg4QXjokqQxArmBOLijMckBZ0EwJMs8WOKlJMd95jb+STRr9zvmS5hYnj2zoB+L8WzJ0ecvNnd/QtbWw+w/XATe/u7aLd38OLklEWgyEqQ4PYUVxZE5iuBMDhcAfaMJ2jGL9hJL+p8MeEjIRBEAKxMRC7v/sy84E5edKRE7hS6HAyUMVNvYKbZRH1hAYuXLqO+0MRUo4H5pQtYWKxjcfEC5uebmJubRbO5hHptDuVIqnEkWEo5sIGTbbIwjTqtXpz2cHR0hNPTY04S7j9qY2PjHg7aj7B/f4tFD4+Pj1mxOW/piFDlDiyznYqQlIUhEkXkb9znalSJ/P3PujjpHOKH27v4/vYtrLTexvrnN/HJ+jpW195Co6FHJwIuvlHHl19/gRuffYqtB5u4c+sbfPftbWxv3EfVEs3sBJDmx1xFtmLtz06yYnKgePpizxiiR9+lKr8pf22tTsF+Je+elvUxVTArzJmTAXhQjQko2bINOQAOe7JTFV0xhkDxO8XK9vjaXrLD/3JxY6sYYUv4Z6r4HKBlh/FKdf7FIAHg8n3xb0cGdy09UPxAFL3i3je66OeYhZHl3zfQBIwnE8JrcJLl+Ci7AHhpPvw/LJN3LCT9jx/V+H/9fuTPmxv5GxUSawmKCQG+u2VlDKIyeqnDm60V3Lj5Fd754ENUmovoZyUkcQU0yfAvpGr/FVkiQe73RPvPtHeZ2AFkF2wA22ynzd6N+9DPewUf+tGFBcGIiUpBfeeMP0vgnxmeTqq1sQbYFMvR9WtVQa8v4pyv/nOArjFsmk5uR5u05AyD4ptW3aY4uu/6/nUCp/RYuPgalldbWPv4I+w83Mben5v45ce72PvjHjqPDzHNKvrnPn628eo0mZN0HH67+xOW1q7g0vvX4CoZzslrf1osgSlGN1aSeffHpoWgZ5cZqMN0DNDbczse5uAVxaLQbhXPONjHWIGTCOZFBQDPVdVhrt5vbbQEsMwJwGL6VEFwuZInfLIRHQGJZXJQDE1gU3Wak0nEQK0kBaHDVEEet3ukQ5/RDAsaDMS9NllxoW20wp70rE8X3jcGMI3dAbeglFU/aTi2LmNChgmkslqOi43dgDfP2qAZCGf5fUjcMSKvsE+gn7ct0MBisUEPuoeF3/b7rS0gfpsClzKgGDPaMTL6em1mlvGluW6Z1g/9z9ezE30KYwUmI/hJXN/E2cm0KKTyTqCaFEGLzHAC/5Tw4L58YiBMOK5sVcisCm1NsYSVFpjpQS4jPEbjBFPUWhLsv51HFoOmMapgnnUJ+PgKi4huhbRfnW7HV/QZo4fueNytnbs7WEuEsbkpJqb9rFVrvnVJEkIRoizGPwAAAP//rF1NbxxFEH3zsV/a2CZs7F0nBEcOMcRGCgLHQYI7R4sLnJEQf4KfwS8ABAeQOKDcOCAQ4cTBkqWYWMjxbgiJjRN/ZNfe7MzOoKqu6umZXUd89cXrbOQZ9XT3VL169V7IaFuo6texpbcoCqcUCu1BoT9uVM6H0iMvfvVRLGIZjojF0LQW8IYVdwBFk7iaTaY2paydgDa3igMGMsGpQ+8uJscQRU++ptMmoKJSemDqpPP1hQ6fUV5SK/xHE0sb2qWEuNctVv9NP4XHiLJaTehJYFX/JXEfxrGdU9fXtMIvp8j+/+KZwIubPM0ddc2QffoN6k33RkCTolTuIrMbTiwp6N7YNjEyi3QEqWOk1IAW/CKrkGBLhGpYQbU5icaVFtqPnrBQGRy0P7SVjCE21tc4ySXq2yAyfrLmOr5UYz3U6xPo9/q4t/07Jieew2SlzNVfvW1O6k8JXhJ5Bkw9okU/GOYEGJM0e04MxMCc4b4oYFvXAFvRzyr/WfKfiGCJZ6mDqiNA9PzB0xOc9Hron/TQPXqMnZ0HuHd3C38+fID77W0c7j/Cwd4eBv0ukqTHyWBm12ScFDhJGpo+7pKg18GY0EvlobLKkmpwpI4YnoI/gRQMzT0TGNCPU0tJ5TYPOuiDAM9PN9CavYSFhdcxf3kJVxYX0Zht4dyFFqaaZXhlU5FnV6wI6KdMqgG1ARLbg6h3tEePeic4E9Ys8hsURfaSU4Ji2xqQOTWkUr30BMTwJDpXUIfPiFzwLt3pYlnmSdLrWWAkMerIQnOktVFli6gQFebx0/pJEaYJut0THOzvs0tFp9PBxsYd3N/exm67g4ftNp50D5kRk4j7Nffq+3RYD7hPmOWBEpVOi2yYrSHEs+y2Rp95Nor7wCskDH7hL1saemrYM4EnwZUSpH2TCJpqcIiZSy/i8kuLuPrqEs61znPffnWyjrONaVSnJoBaGbUzVQRhinq9ks276B0EYvBCe2gQAYcHx+gSFXVnD7ukXt1pc/JPAMru7g7ubP7KoMrxcRfVIEDwNEaZHEmkFBgnFIwapXMOPJLY9t4dUwsHg4hy4pClZeqjwnapAxaRpLD7t9vr+GRzC59/+hmW376Bd99bxcrKMpozM3xeU8w3OV3CtbNX8dr1j/HBRx/i26+/wVdffInN2+tSbx4YPXxlpTjU8XFDae1DLwPetOLebDYxNzePmdYsLl6cQ7VWx9ZWGz//9CMe/9GxNFxLj3aEBsf14bsj0TNu3D3Ze8h+h+2zzyf96ZiUTb95lvbTuJ7NfzL8kfTXjJHKtDPxuflIRz/mvk4TAUX//+E/Yz2M3OcpyT4K+32If42x/O3hXs8bARyS/wRBjAN3UHjOvsNCCPibgJloA3LN8St44ZWX8c7qKq69+RaqjRbSUoVzi6BUy67Ddqcx04tybZtD8+4majG/L6Ri6lbXQxWFC3z7fmevdqlOugmLL+xNYsn5wgAwBR7zuaR2zxK7ahGLYixOSiSYV+tlDdShOjPc5haJ6PPpgEDq9Gzn/t032lcmKY1ZJFUr63z/JR9TjWlMXTiP1vwc3ri+guWVG1j7/hZ+uHkTdzfWUE7L8NPI6p/o+UPtK1Wqrh4l+OW7W3h/aQHdQYzIT7mFauhoeHEMTyKZRDkuBzZvcG2vudUizObLbbGFUOs9qWBCLdLifEIeCvtVq+RhQSOM2bQUV9MzUH9+X1mDntg9ZutbKflwKOxuz3tSiKX53UlFOAESIgGWRsQ56bth4SQVrTQdI4LTIvKmzy8Qxyl3GCvJCieqZm0nNu/iwpbDqODibJyBHvSTkn92RIgNNRxxJnLIhbNY/fYT4YSluYSYwTRJLukzqcp7Xl4kMMfYcFowtHUmEqa0yfvyz5dbYSjxr5m9Tpp0GluqlptxXItyFnda0XdV9vWnghyaPGuhlq0d1e6RQAdhpqtrhGGpk3YbsTJMC4Bpxzb7dkAWnHRuuNR/ZZbLGiUqEjvQSZsRzwG3lxvHA7IptSKGAgRQzGe0C4xIITG1TZGXWlerDPTlWSAm56bnT6CU9v0zU4E0tZhpLzaBAjzxtTwPfwEAAP//jF07bxxVGD3z2Jnd9SbZAFIEcZz4lZCAeEigCJRUVAgaylDwC6CIoKWkgyYNDT+AHoqUlIjgKkgQkzjyCwcS29nE6/VmZ2fQ97pzZ9ZGjGQltuzdmXvvzN7vfOfBHgCF6v3phIz+4Wj8oVB1TCNvehIz1oAiIi67k4rV2Aw0MqRebKA/0c7tMCycZocukNBA32Qj8Ap4+j0riGkQjZFQxjRYoZ/hWOeYarEjpn0ZI4AftHo9Mti+EZ7cCD5aaWNhFBP7mUsjiOUm8ye41NuHFfq1HT7AQK6qI17MkZMJVCfXdB+mIwvd74aqoxrpTWETawd96CRxzDfRWPUhskBLIKNuymhUa+7EFSFaaQdFbwz8c4Dfb97Cre9/QmMfSGM6H9XTqxkSJZMH6XF89sWXeOnsJTx6vM+meNIpF3dt0blmXDh1T3Zw5b0rnPXuulQo9f6c3UzRbVnB9BsBnUotlYBOkQNP+GGjJjpBLHEukconpOWvlHB6cGblA8cMUMT4JXdoKBV8VOwfPN3D3m4Pw70+Hm5s4a/799mVd31tBatby3jS32UDPwI9cue8K5uehOmA5Rg7Tbdu7BtOhxpOZq27jkng3ImfUa4tFd/kwUAs6EAs4ci8K+MOo6iUR/x/QvamkLSncGb2HE4vzODc4izmLl7A3OICXjx9Bt3jz7FeOtTcrYORr9EVEGCkUTe0VuWBL6gnvXdmXhhmlKJADp+bFuO2JJ2skZ1lZX5FO2j3iDqvh6EDDQaDIT+oRTYkEg5b4xwBpy7pWSGMm4hSFZSN1G6ljF6kYSwSB/Xc6fXG2KHs5dVVbC3fxt/rK7izvIzNjTVs72yjv7+Hwf6+ZjXnbvNaLbXMHM5XN5c/L8Eej+BdTv3RR+F34PKJGJj6c4RthpxRo3wNc4nnk1g0Sg5vguwGiTrbeb6LuQuLWLj4Mt5+7BfNvwAAIABJREFU51288vpbrN0/darr5tuOzLK6g7IgdfFxY0n0GfQG6O0+xvr6OrY2NnFv5R4X/HfvLnMc4M6DB8gOBmyGCv08CQyOoI5EEVSKhtBJcxwvvbz22r9yaJyrih9y7cJTb53ALo4NTFIsLJzH+x98iGvXPsb84hzaacA4sUaHs+Hg9sOnuPnDj/j2xg2s/vkHMKbIvbGUKGwwlmMqTpniS5t5ytoXuEcla40Yne4JtLpdzJ5f4HGemZvF/Pw8pqdn0Gl10GxOsdyHolBvLy3hq8+v49HmmjN/jBS0KlfV4aslRFW/Wtdeu25+UTijNt+Nu6iOcmWoiyqidKQE4DBgwgcEhMZeBajiKGAnfbD+NHIAv9uk1pkBdf2rele4jbEyAOzbsddxt6z9uoEgKsDaJMBWu8r/+NtJc8gJmeL/ZRd4r1thMNTWfRLKRtYg8qDiQjF5xBUKunV5fQbA0Q4LqI2/ozBXrt9napRnGjm5o23EtaEEmWdeFybTQwN9jHFy+iwuXb6MN69exfyrrwFJC2HrGBA2EVEXrdDosJAK6Zw3z9RgqCdIVQAAbTBZJjYzDpWOywVhUOieUj77I9Xcx5rPPRgOtcDL2f+F4gOt0cJNF6VsW+fR/rY0CcudJ8BhGmnae5hJF236jY1Q7ktKk7NQYoWqc2Lr30CFuDoW9C0ZIyKJkCYtKV7GY/R3evjt51/w3dff4M7Sr0iKA6JMoOFeV7wsSLS0FwHDF0J89OknOPHGDJ40n6FoUbcyQBKlzKIQdurAMTMtjWw4HLluKz/vqWMc2+d55u5fK+CghZOxMWj/blnpBKo0VD9uAACZwfoO+fYcqeuxbW4MALB9ftJMXdxf6YFVSnXtGZfVIubs98YG3nrO7r7Gm5mWCvRQjWN1lhW0gZoOBmHo3r8yf7EUq3leplAlKjWho5mkE3WbeQLQnjnLR65Jau9H12IgQ4jJ8bIxs5QLO/fA05+HrhYs1Di91PbbevS7/z7olY3KMSPGjm/gl+l5MRNc5Y/mB9Fut3iPb8U/XWufki/0uk3jbzWizbnsBdvufcRYUaUPLBGSe0pY58KSNvDINq9+dr4PEBIjkdYgx/OpfNw68lzT1iXM6hEidSitlVISUd/byZdFN5YSEjMCJGlBmrYcAECvSbWepXEImCn1sd1bXOtzVGqGKI7wL2XXEhtHEUTf9M7+YgfFWP4mxMSQIC0f8xNI4YLEBc58FCTEkUvu3HMDJM6IGydOIMQFIbghIcSBC4kDKAEiMOt4d7FNcLyfmZ1BVV3V0z3etcT4YK3l3e3pme6pevXeq+it797mT41lk4GX9MoZujYQqhH3aQy6uJW+U9aBGGRHFk7uGaZQUsH6p2rs0NUi0Y9Zi5vIuLh6Lcmy6iE08dMOBToeRndSCwAU7dtUO1JMkJqX+JuEUjF8w5bUS86V+kF9PVOh+ruFI0ADU8po0nMTVDkJqT24e9c9tDJxJbe6jZTPJfbMZnR8bry+wYgmX4HBhr25VWvLFH1PZ6Tj8CUZASUr4IWSGWAVtayK+gHwx7eb+OGjr9G/dcclc7EkCn0OuEi/V8fF51/Cq29exlZ7zzYFI6pcHsOkEd8PMYVkWYK4bnB+4yE82DqPerNhH5JatXJMwnBjog1HNzA2iIMsEMe4sBtxf2SpPE6LmUPMADPbmzUz/PC3Tsm2Td9gcMgLaJQM0Ot10N2x/Xe77Tb3aO9t72Dwz79ID/uowqDPXZyHTBeOpNewVugjU1S6mfIYhYliLp0U4kyNrgrEUoEcCnapz6x2sR5LcD6Ue4bM2aiVXn+YoNZo4p65e7F8eo0rjWfOrWN+aRnLZx/AwuoqFldXUJupozbbYD10wgFHagM0Y4Mqd9l5zm1iRQCM3t+6GVkAwMbGpP3ng1BGb5n7AAD3Ic4LI0CgYHtYhsh0AGA4GjpfC1sh8DbJHNyyi4NKH7CDHTM9XKiVYjpM0O3+jdu3O9i89gu2ttq4+uMmeu0t7Ld/RZT0+UFOXt9V5bNEmfsdurvKxh+8Cg8/JOZ4TIIca4g1Pdw2ykTx3h+plbdeG68SbZzzu/VASKTKQTpwYjWltO7ik1hYWkVr4zE8+9xFtDYeZVr8/PIie1YoTVyN56wLfV641EMStsiCazQVg36Cvd1DXL96HTd+uoatW7/j5o2b6HY66LS3MaR1dNhn8KUytgm/PQ+l6k6vdB21ZSqOSSmbSnSsCClMbMkAj3q1jxhUqaLWmMHC0iJef+MSXrn0MtbX1zBLQTEH7KK8SYDedhfvv/Muvvj0Exzu7vAdUaPATfdbMf8isGn21AnMLy2i9cjDnPDft34OK/ev4czaWczOnUT1RIOBspjGEInl3HCEfJBg9682vv/yK7x35Qr27+zxXm1IBuG5pqTHJHfTZqqsNfcr/i7JL31GeW6n+QCUk/4yJ28aAFAGN20CaxsNqvkuu20PQ41znufB+VSNFhRCAKDQUMo4pUXpIAmDauPgpmlnWj6OBwAqRwCE/1+/Py4Bp4DWmjyltuOH60+v0rayZLCcpBQVY52zcqAZHtlEYKcsL/SD4Wl/Z+YFG4IUhR9iLhaFIGI2zmB+5TRazzyNC08+hQtPbKAxdwr1mZPopxmD2MaQS4cCADnTjiJ6cEapZUBFRmjMcm05+ZbxxAJWS0yp0sdms2ErcenIsQA09hxLAYhjpNg4Crtv+KdzF0nV32qGLThACY4Rc1uKb9W8jhPZSTqQ0vwp9Z3nKxkHlXSKB4NiWhS6npcBAFd8IKlbXBPzRLtsen928M1nn+PjDz/Azm8/MwhQEc8BB0PGwEE2xn4FaL34OF64/Br2myOk5pDjN46vJY63MdiYx6gAb5rmzrDNTx4daBPZRFw7dKmeXinR3EejUjCD/SSUz98U+Ygxk1fSJBNACNOUigVKb9fEHN66yCW3YBBoPC4SQzlyAWTKBoCaI+S5JM/Sjz94r5cU67zkeUiJJwAgFZM4/b+KGJTnIhXTuYg9Dy9lWNAPAS6paMiPgFBZ0ZYPJZCE5yjPgrHBWyd2rKGvmQ+eYML+4rM9lYHtF3z1OioL3I85df1a7wLLsNFncsFyMALomOC1ZRakjj7PTATqwU+tRD3GjAI0msyrh5UteNlz0XuA41S5L9XA095XVi7PXeikeKaHSsVVhuHygZIppH5fX/r28/exbKnpTLPZlFRYy2XgxXoAUIGZ2m2KnF3Wle3OkaJiDP4DAAD//6RdTW8bVRQ982WbcUhImxAncROTSnRRsQkCFixZsaULfgiIP8AChIRgx4pK8EdghaiERBshBAmhITRtyHea2I7t+UD3vnvfvBk7YsFIkeMknoyf37x377nnnhO6vS3uwgKl54p9gk4InlSOV6H2UxV+hEVVmZ9n+TiN1blptS1gJH0tnLzZwTETtDk1xd8SUEAuBXoNijy5aIluBoqY1Bt1s6j4Rg0840V1yIuNQXYNepY5iJWeU6kemVgN0qRgZDI0gECv20NQC0utCWZMpMdkWNjE6EHX0oxjfjSbSm5t+Fi0jzYLnaSB9k/7YxQj98NWatMkOz1t6bCVCd0kncWmBAA492vGNosmmY2mQ8yvLWKxs4ydJ6TwbxJ/q6Lsm/6/Rgj8/NMDvPPu+0x1PesaR4mAC/BkM5OKMEuKXq+Pra1NxDMxlldW4NVNsKDU1EwQWJcGpQwARrLy3C4QpMSviCEzK6TdwxcxPa38k4jlqD/A2flzFhm7/OcJnp8cMO372f5T7O5u44BE+o4OGOFn25m8qCPVxJE6Y/mgFCNfnXWEXSBVWe0T1i1JrXioZwsokmNTs3cXSeNewCrzTJAMuUKSMhrvY2auhcWXbqLVvoWbrRZa7Q5eXmphafUWpm/MoDkzjSiuoTndRBTHrEKq9ohkmTnIEgz7gtL7IRJJ5K21X5JYhwGutKUqJGkSSxJX9AL3aguxnkmH0prTTMYjKMAAdxzgJLdmIsp4CdIMHvFx2lxErBYj6AA/zXF5do6rbh/Hh4fY2/0bv2w85L797e1tnJ4cc4U/twAKhc8DU/71jGhb5osqcqYeWrnhukOq8xpEW1V9VOq0RQXfggQKfHjWLKsIWiqAQDUc1wq/He/KLe7x3DCfL20IvSxBc3aak9G76+u4+/obeG19HZ3VDuIXpwyNVHSMEgkqOWlTYEaZOPrIdjkBrpIUR0dH2Hj0G77/7gc8+HEDvz56iKR7gHxwaRIuEjL1jGhirCCyB7u2Ijeu6Ncn+a7dmwIt48T0yt1S+p0CGpDe4LoXmaSR6I9Xp9jf6+Lzzz7Bt998jQ8+/Ajv3buH1sICaips4gMLa/P4+MtP8ebbb+H+F19hZ+sxohca7OU8O3cDs/Nz6Nxew+JKC507bSyvtNBut1kbgeYjJV0mYc4YUMqyIdLhFZLeAJcHxzh9to+/Nv/AY/ra2mQQmJL/mi/uBtAgvPrOy0fuTbZQrf6ounOo9aD73H2N/b8TctkqEDD2HHYYy69TjQoBW9LckN3pbmExUnpOrhpeOUnKKy0IQ6uXIz+osItY10PiAaKqVl0y9CjW3P9K2Cf9XosbGPt0/i8AUA2YaT1WPRhf7kcPKg7rAscFiOqemfvmlYVoGQZSyecuKA/VGeQ+T0q2dc77SydfL2OmxNKgVjDaKIheHtYQEIsr9Nm7v9aMsdRe5r2r1XkVy7fvYGltFSnRbeOGcRfKA2lXzHjlzxEWbg7EfguMOk7ITT+qEyGsMC4MpWI9ljBrzTgzmRiVkn+TTDAVjQPkuBlbnYDS20mLnlu2LWs0bAWTNayI3h9FHLNScYdAAGYShIEUYwa26qcCdr5X7oV3H7UIxyCC7wsQMbJ0bwgbUCnt+YT7v/RZepGJh8ktKfdxctrHxfklLk4vcLi3h7P+CK3VV/D0z9+5RTKqzG661tBL0fCAw519jLojTM9O4fyqxwKCQ2klJTYopGCqeyfFy64om2HuiuvUNe0OnrS4pkKJZu2EJC3Fqe57rsawbjW7yDEcGjrFaZkpZrI+csW6rhwLexLzF3biISouAl42MY7OZL+rRXWbnwQy/4i+nwkbwv79NV7+alOoLGk4hUwGAZzXlbUIEol/nXYGba0WxoTG12NJepZbtiPrewl7uGyR7PPaVBMNBUpKlbmC0pwu2hQUtLBMotQUWBRM0MIs37fC8BgMruz/VqFPm/zTY13zAWn/zgvFfD8KRdy8yJ/UyYNdOiLDbncPK4poffZNXsXjVVnvVNSQcxHSVWOqPwnjG4YLuRlQgc7OJ0rIAypiG+FQI/xpGCJ2PPjEMnc9j5kLtG6o+Kja2fO18nkoxjLz1BVUVHY8gzWO/gCdJ/WM2H/gB/gXAAD//5RdS28bZRQ987CdOHbeJW2gQShCgpIdEip0gSohAQsQEmLFz2GD+F0skLoBIYGIkoDzaJOUOLGT8Xtm0H198824XTC72LHH873vPeeeE7vO0M4p2eUx7Xwi9lwaCBNVKo4LNJppDqoH4CP/qVpfVCeG+SJCBROoASyz408kG0yRBtTW4OYKYCh5aTFQYTy7IlW5zJUewwsSd06ttHjae1U7F/csbiHLnHCh1RmNPUYCtclAhWKYzh/6k6D4XVJ/FuuANMpUiJGnjpmr+CHCvORFy6if2g7aa0a3Cz0lVV48KVOYS3YrAxybwT8kzCMA5YuQYXpG1OpobLTw8P1dHDz7EzRP6h5xN841yJyMMZ508esvP+OTp1/ghm0MIcgW1wmPyVyQya60gfevevh7/wjLrRVEmxvin+sJV4X0DNMZppmg/ly2NEvlOWeaAVZLi4BdD4ROxlTJ6QDT8QjDZIBe9waDwS0uzy9weXnOiYfLk1Ncn3UwurvBcJwwAtysNZgBQAsgHR6JPi6BS8bBulEundq6ee8HJhCWO3upAiUOHQ5WC2L1ZrYTVY2P+1y7Rd6cNNYadT5o1BuL2H33A2w9eIi3d3exsf0mtnfewfLaJtrrG6gtNhGQK0Qz4rPWkJJeVLITZhgFGSYkPZYLo4Tk8LKZaCc0myGGSYaoFqpYYgEyN3RTEtEz8GccekdJFkKiiLrJtXaQ5IA7HBYovwX2mXJYeexGYm+Vw2zmFKGwm3uK94WoluhscHCYBk7ZW9dJ3Pb67Cjxx2+/4+zoCC9OTnF23GHbvf5ND8ltjwXjGNkiE4rsDg3qg4i0QKZeAKVz1a3BkfCKg8w7Efv1sdVKab/+tUz7D7yDc+g9ajBXAx1qSOuFBHlUCsRSszPT/0/DBo/K1c0NbL21jc++/BwfPfkY7+3tYfX+OvKY+TaY6NjNlbET2ibno0QoRCOrMHI9rmNlZQ2PHu2hUV/BMMnR2d/Hy26CtmjaI2MF/RALHPZqWRe/l6thZVZKjuRzrWht54dEofd6haaos+j16QQwBVLYOmMWfkxnI0aVzk5P8NMPP+LevQf46puvUedNVbJVpHFRa8b49vvv8PjDxzg+OMYonWLtjU3c397GQnsJzXaDF8AsypS2D15r+SsINZpMMRmNcXH1khlEz4+P0flrHyeHh3hx+A86hwe8LhHDhxIx1F6zdOIES223SOfMBVH0f17+O8d8uOp/Vro0KJUCpJhrVvncK7YFHxl2/fia+EOCtZADev/+Tz59ip2dHbSW27gbJPw6JfJpPSemCVltwht+d8ld6XutXEv27nL5GjwEjspQSL8jSxLUqs4K/+sqz+cqjwGV0eq/b3PUn8/VX5KziG44V8JhAT1boFIwSeKzLEZXE8cgRbyppMS/2ObOzWGqH225++eVwIiLm6LA6+v5RK6PWqaV5CXUHtW/KAimcxtT7Uk7aLGN+kILS8ttYfktNrC8sY7V9TWEjQVES2uYxnWMYymmIBFRCeBDzCZZqUF57xBrJzkrkto6zxwNKjIoZVnOWxIMym8y1NLsgQ1I4lUkKKyoCYhi5mcsyLMFE3ToDqblc6ETM1PhLQmwQvbyZ4otl8QJQGGlraicucaqOA7nWV53FoPGQjUbQx77oTmSaMBaSYcSs7G4BPDo347QvenjutvD1dU1zs/PkfQTDPo9JP9esp5Ba3kVw+uBN26lnQkkIEcA0n3qnl7gqvMc21u7iPOISzgadCBjDTChpBPjItUSU6ZK14s6dqanK73axPCs9pmenQWWzdLParW9CeMzWKvJj+AVgt2BWkULU9gDKCEURQnkiwDeD6BLdOs0c0KPfB6x5D/1f1QAqAgL0BMaV8xUY0BKAgpPd7Ppo7bIlWFQRcftO9xYUvo87aMy3lJnr2i2imQnbcr2dFjOvRKZkn0gxWuh2GKnaVn83QQSWRW/teTmOSW53EhTEXVrE+rbZnOJwVU/mE+dq1yZYWrsakuMmMh8pu4QbIeptewGCEsZSaFyXyR6Mhe/QWMf0ZcorDpTBXclkVCw3Um402rtTTnfH1dmx+fq8z32NLELLZFsv9tiYro4pvUSRiLuJ2OAxrqw00UPQbQb5DloXvFr7Puvfad1/OZyZ2UVZuHvJ8eMQWCJNtYDsESufRfdIwrxHwAAAP//hF1dbxRVGH7PzJmd3dkqtIJQaEUMIkKCjWIgxohe+O+4kT+g8V/ovUqMidELvUIstKW0VthC29n5OuZ53nPOTlvUJpttCbs7e+Z8vB/Phx1myjXCQQ5P+FApCgsBvKGwmAYeKsXJ4hK1WPM2FKm2emLVjDsvNjEuoNnNt4T6pboxdip6x8paZqMyf9KzrAj+j2ExBNh/uEkBWsQvWVWRIzJTpqy5pU2rAw9VGhOuRA6Nr96lRAeogET0doWgCeFXVjt/4BG3TnYnL5Sa4AU60MGDUIl4WFVuh+R4Us0TAhFGixKhr516SH5T1aw6I+hpIWDVqB4CQW8ImhKF+SNArLxoRiJeNKZufaKl2F3Xo13Aigbj0HlYPMa79VVulHetr6hyM/ETvv9zGF6rCRB0xKpuSvh4ceE1mX/rddn6bYscYMtpnLEYYCmPhveo5Nfvv5FbN1dkzhZyUMPlYY8JdVtPZRf+23bI+4CE8tnGX/Jw7gGT0/H8SXYKaOXjOd6uNkxk0c3GGENcJYeFTtuwEJFKLq4qxTSVHOzvyWRrU3aebMqTtVXZWluVtYer8mTrsezsbMvz/QkT/KoqoxiRpseO11fXpUKWg3Z05wXJYnDn4ig5331I2XXyFUEXoK/hkfF7ieenWme9siiqhwOZukwSO5ITpxdkfvGUXL76rixefEMuXXlHFhYX5cz5JRmMR1IUr0hIp6gnblSF1xlV4ydcG/DAcCAZdf2llZtTe7mgurpXtvRwx7QdHOnem5BSGQ186bHsz4acA+bXpW9M171g3QXOXGcE+xa+duX0GareVdVJniWcvxAKqqup5INEyv19GY3GkhdWpqX3QA8IwdwSDWEzIwdNKoOh5drhIUCRk1J+/vEnuXvnjmxvr9MgLngnoG80SqzYpON9JMSa1JnWi8vNFLyP9sGCsI0cTYj/h9Sb+MwsCUUUBqhGQQSm89B9X9RDwSp+oHpXBeE4amFApNBkpFM00f7OSZJlcvrsGTm7dF6urLwn166vyI0P36f//on5E7OiRuI8QFgTdPAxR7nu4dgOUFA52J1EGCEpU4kl4moACf5UYbqtT1wGuZVz5+cZvC9fWJbPb9+Sr7+4K7/c+0HKaldGkpMyYr26LUpQ2BlmsojeFtJpivsyzrl5abLWxVvRLwOEwooWE8JvHZEq4ikNQ96FqYxjwUHf5WS2IJ/e/EQunFsiVaTxe8HMnaNlFW/p6rIsXVlmkRH3xOY2XhE+Bh0KBLz7u89lsr0jG38+5PPq/QeyAeHD9UeyubEm64/W6BbhAo0ltKwxJxLt7LaRr2rit2z/e7odE/H7t3KuC8rXXigiIn6OjXdAu3i+fUACBqRX74F/G2e5lHXFeUlOITRYSGVrmVwam8ubFy/Lx5/dlg8+uiXXVq7L+OSrfOB101rVnUNigCAqdFwUAl0furrAd9VYoT2GjCuGBc9/FHx/v/edfPvlV/JiY11f2x4XLZwltfp3H6Tbx5VECleA7RqFp7b+bH9Z55+lHFPwDEbAh2S+wNoa5jz77XAsxXhBklR56UyAEBtZVZ0HbDsbj1gUxwMxE5JUJv+MQZLY3ZwhMNW+i/t2kpAapkXYw8gadswovhc0FNyxAoDq8cwC4jhWPYQG3I36P5ad9pT0GEfbrkJjJ16PoaAVYxWbUAW7VCEY0mSCP7Wp0eHHHundYAQNgJprZZzP8blqRPJM+eeZj1sZDyUqRsdn7jV6fmhRQOPHrg9/gYiyT87LqtHE2qhTDpJHFlRoCd0THGvqyFHn+csYrpHEpT6eNCwiGm/1ifsakvsAeY5ogCzluLKzlw+Y3MFCDJarFDyr2ih8N6NXhERYmyFDdvtUIwqQY7x1WR6w2QH9os31x/J08pzFNBTYkKQBFQUAxKn505JXlfz9x32pnz2V2h3wXHRGY3PEawgpiPTcdzJ59Fgu3Xhb9kxO0hXmJOIp4+2wca0QZsa+haJJKqq1QipqpWsZeQbjY1Acech4yqNLGDurs0AqdVnPvnsvwQnwZ1qKS3fIVjHwnTvvFY8YM2gxdD6RY7KHdduFJNtJPrCStQlzgBkduIv3vY9MiHx7zjfrIeQmeB5zHYVcCY0kpQ50sRMunhKK7rltdA0PrBaQSG1tWy8OXlF0uhiPIzUFsyaHl32piWDXs03E/y+Cf360a9cGjfEC1n4wtSiBOAn0gK7ifE/6IpOYt75Awvfu0SOOQviN13KirHCm0HogYdR1I4mUGPHNy5BIY59Wa/ja/93wc4i48NePscBekg1zsZ1TvTVRyilRHZ0qENN5I3FRL4NjNK2471iv6xFE9LAWcS/QoM6yuUjvnja4Zu3ehzkHVB7WKF5DG0+sNYwcha7QANDEHPElKE/Mf0NjmbEzVgmEh5W+HrOI0GlyKCwFfQUrxQiC8jORevwEhxJ+N1PF5qcOg+oB8JZh4TsV+6MVeqsFrIAc0EIHxl/dHdqmkX8AAAD//4RdXW8UVRh+5sxs96PbT6VUWyQQisWqYEjECBdeemP0Bxhv/GFceKGJ8VoS463xxiuNIa20BixtaaG70G63Ox/HvF9nZpaik3CzDLvMzJlzzvu8z0diqEcVATGnUl6Eo9IF336oGlsHprJI8Txhboc0yGON1RvTiNDNogGRO438o76roiwZL/5CszcUwwacDdzg9F9ddFTPQS/36WAorokaG0iLdNKQMpVuZLgRqvFySvHIRnXtYTGGLkZq7GDFv9E85H6oBkcTEqoFOW0Q6TfompiCzptsXXuYVVFucJKKNwEjjpRx6V1NwyTdf3VAVWfL6pEaIqfgCM3eXt1TmXnQbAW9zf91/2XjowsB5Wk3Crx2eQHL71/B9voTNDORCTCR08vWuhu14Pwpnuxs4vfffsG7tz7lF2JAplkebJxVpDL5RlGLAYTD/WeY7OyhPTmFhSiBazWYms61lmtKB9qJZb/3GVLyUIATXvnI4+DpM/QP9nCwu4NHD+7j4eYD/HX/DxwfPkV6coQ0O1Ydfaa03Eo2uSYTBMR1bGxV79B4f8TO5MXRC5WaUdXQ5aXFjCiYCS+Wp8iQUFEXJ1hYPI8Ll1awsnYDSxcvY+WdVZxblui1pNtGTIUvdfVp0kOBvvehMJBxl4axGQ7LLHtFIVDt6kmX3ldim6z97WvRWtVue+0zZY1z+oZ+HqthZ8RUeQVryLzIPC1I0+nEgJGmiKabQJdc2RueWfjDwwHnytLElbLJY4pGHHGBNj09jemWfE8aN/X3Ysy9MY/Pv/gM6ckAP3z3LTbW/0RGnehY0e1iyJM4eyfkIwFyHFRvbcXMGVWWNpToH77KBC2cGtVxAVfpDCa+CIUrKnKHxMtmIXRVyVCRzBsLNjvh8Z7lEVpTs5idmuHi/s1atXLjAAAgAElEQVTlt0RrvnIF19ZWWQKSTDV5nBiLP/Py9JmBa7+WZXjRo+5Pj6UQ29s72FjfwM72NnYfbfPfvTh6wfMF0divXr2GO7dvY+3GdVxafRuz515Hq83SdS6qqTGztDyHpXOfYGVxEd/f/QY///Qjdv75Gzkv0CmzLCZ8yW9wkYFSavPJ7vVKFX2pszxelL7MuoiC/0EcjPikXHFIFJyTOUaN5Sge0gNLi4v44ObH+OrLr3H9w48wf3EOhSuL2ix8v0WHFnzR1NnizOwix/PDHg7299Hv9bC5tcVSk631DfYIebz1EL29fQx6z5knBD+smXn6mjuxD9Ih6PtZNQnFGXT+/zrOHqb2RQqdeCdAYlToZ5U3mwGqUnzAG3GmAJuhUo7SrlS+95gYDJBozdPCYXp2BhfOL2D1vTWsXF3DzVt3GMQ8f2EJ7akORpT1jgLEscomGugQkKfUdpMDWofIaJ91zK0e+1qMOW3zppbWzpMh5udn0Dwd4dd797C5uckFyDCtO1bb87DbFBVjgKgWprSZ4z2SboSle0W66gavyYlqU2lPQ0Vvt9tFq9nBwuISGs1JtCcnuQM+PTfLumM6j9Zil3TJ3p7XcvFQKsoOP7lvkwdTXCKiQfLnxiR/FZ29ePdoMVwDeA3EKBkH5ftZkTF6kzd57kJVO2IcrxrVi7JQGHBxJc7emY7jY9PKKmOBbj87X+eO1wf2TJI+El9CbBCMlw09rXNMeY+teFHZZ2Fgsw9O7KzbZYPkIuT2u6RawCW6tpWgUaoxf9RlZBpvQzO5dT9rtF3bQ3k1KDNJKM832pQyszqWINp+jxlz5Rg187aQye7MA8NpmtYoGAHSe1c4MTHLnEoCFICna4nUqZ8AcTqHinvyuun3+9jd28XJ0QCj50c4PRly0UB7z4lGC03EbB7HDTgC8doz6HRmkMQtZstZcaK2LbyWJMxsAp493mM2QLsziT4nHNUPvi/sveTFoHooMWcmv+B4P5UVe60dUtRBvkI77tLBrO9Tc/b2UUayN5ZCKU+Gso+5s67vUrX+ML+RwktqhPllVY30ylcqCiI0qYXKfaKda53waEz7bhF59m3yvikcr0zjEQMx4slAxWGe1/0chOWjBoJZHhzui7z0iBD5hTKk1fjPjBwFCDhVKXH9/2dHlpXsahuXXIcV9bQzX/Efq/5hgKzCpB5QNCIBj8r+hgLDaWoyglzmS50PSN7iNTY9y7LwbGNnjIc8+HecJQEp1A8tNR+5vOKTRvNpRRJSZ3aX84KNsbNiQC2GnQEDpdXT9Zgclfa23DjRfH8z2wv3l8Y6zWVJnQlvhxl/GsOeGid0HWZILk2ZUmpEta2lGcj4lmcrz47AFBkb3GjXNUIS9uzZS3IFj98owr+kXctPXGUU/93HvO4AEhaU1wAVqRBMTBeUyMrEnYsmGlcu/A9cu/FvUhdtXJg0UWJioiYurIW0RQqlA7YMw/AamPsw53znfPe7AyEm3g3JAHNf3+Oc83ucUFuiuBqL/oFi6VUFGpkaT4SOSUZqEXxKLFS7oCYekAKA6wmghga62OoCac/tmK7o/xe3aHE0lJ7w9IBse8JyCb3uhTWDUD0SL0JJzIYKXGWTQakLr93Y/JxWxINe9EC+FEiy1HHST0wAo5Q4c47E6jWMi6d5wbq4cbEA+eBUvUzh/h26U6qdFYQuxNfqxm9CF9LJxRSPQHUwgWViuHqim4sAgbj208Ipm/BbAabffwd//vgHLnfPBHNzjYNUw5ph7dEjvL24guGRMRwfl3F8emKofUmMy+4pYtrsfKM3Ii0stYSM6lXW2PLgp3dfLTGSQZFD3D3j7y5dXuCk3cb+yx1sbz7D843HeLqxjhdbT9n0zc+Mu6zvmR61xgpFjKHcwcMJiiS9FtnJTd5cfTpUj+0cGkYEXA0OebHuJYKkUCBE6KdXR31gBNOUwN2eZgf+0clx/klBcTQUoRpFjHDHEghR/HWRZqb1CEtEPMsi4Gpl4Zr+29H/ln3JGC2V13NM+rSXfGaigP5zJD4cpLCo2jb9RcHJN/kHDJCBkySovSwAAaidswDn7R7O2220Ts7wencbr5ov0WzuYnvnBU5POzhoUYJ1hMH6AMbHJnD33jJT28ldvTY0iLBmxifVz0Ynx/DZF58zwvj9w4f4Ze1nNLd20O0copp0eTzQNVORQXVxfuaMWaGKwkGSld2RFCjyxSMVpCSV5xg47dv0p2kBWdRV8nVL4YUSV0oivHIFXljFrbEJNm2ce3cJk7PTmJmfw0RjAo1GA4NDdTZyNNMs5cqD6t0ZDZK3cnR8iWebW9jdfI4nv/6Ovzc28GT9MUtfSBJByGlGbnccRIdWkkVr8eG+j831v/DDg2+Zort09x4+vv8JlldWsLC0iGigws/+/JIBSozP38aXX3+F1Y8+xINvvsNvP63hcH+P3fQCQdRpLpZlrhlP/QQ9zzxdDhR1Ol5L5++XBORMHKPJE6YKy2gI/SwxXZ++ldb3icYU7iws4IPVZdxZnGdmDRVSqDMGlFYs501ES37Ri3ljJpSFTD+P3hwwit9+08Le1g5ev2ryetVs7uGg3WIvGDITIxSHExMZQdpjJrBeFr4UMfP1hubF/yGo33x4jktLepXrL4wUewijyP46k4RMPix7VZb+UPvScrVqTEdnG2w4Ok/r2dQkbs1McVcXNh0lozVtTeqZTjGxsgkoSCTncNF6mpeRMSoMu/Z6nLS7Qbl2xdHgnJAMNxGma6OJGNZKGJ2dwer9TzE59x62iQW2v49W69AguoSmpemVsVVSmRyf0mePDU702TzYtz5FDIrQZ+WI568WAKj/M/m80B5Ne+/w8Iih8VNSJDRe6FjwVEoVWO8dThhpPfKFquz7OUrv3GfsxASw8UnOTGNZnAlLnEO153kCn2uAYxsYqy+Jtgt1Xf95j8NVR/TcMKuYEvqhGX9UrOVkKpX9JRBfKWsMayg7+fWoYZXLSCuOXTYmLZeMmRUhd3Esel/9o9QyJRnxSnsW2IIE8LXImLvVahVL1TUxU2Z7i3cvusx0UKd6jhmTlE2g3cNNKPKWX74YrIoUQDTBmgx7PB88y5il0IXOyyhfiYyKU0aZaY1mg8HYFDyojSqtT+1/WmgdUCviPXQ6HWaoqsbbvEQxyPUClGsVTnI4HiQmBBUEKFGoRxggScQ1TveZrFGBZ3wVWoctKcxX4fgGF+JkE9/6lk3bf6hTPndS0TZsgW/bvKVs1BxeC1Jpq8dUZLnd2AB+dJyrhILyD0Gdda2wPeDjROja4gNEhT0xMAxu8FToLyKkkrRmXtH4rlAEEPNc9CWf5I/B90Bs5dTQ+9X3S4FP1aZXKlUrh057bnKbF+Z81c4zg1CLIIkAidfejnlXaWavX3MSff70WSQsBFc64N6f53hWWGmBFEpVHkAu9RTHlkqhRaLDkGQHwmhIe7wmqh+Cfj97L9C7zEwuVY/q9lx9L0Yk5KE12rTjMDCFUCvVsW0TcwlP6gvrnMaKgmfOmNWOA9x6UfYiGpvaelGLJBRTsjF7n0kTxSAKPHObTscTgw5igilzRXNCmhdajLB+cj3TnlBZROYZXy3qMNOMWfjm+/R66HO3BSKDf56HfwEAAP//rF3fbxRVGD13Zrvt0gppoWxrK9hSlUTkVxCtBBLBaN999M1/0BB9wEcTCTwAogHCz13ACqWwLFi36+zuzJjv152708KTk5Cm6TIze++dO9/3nfOdUwntM8pCFEzfYBQ96BtT785QK8A8+6XiWdhFwERrSpuATdJArezMApB7rYIqTFFpMkQiKmR+/bkqPPmkOm3en4y4V6vcjz/CFPiMC+g0eJvdTWEA5LHv9YJawlFFLrxXfhmMqT1iJkk0V8cGAy82YpVN+ntfPxeyF5yLPN3Lj2tQlS+qh1bFLBQxiZrW6w18gUMS+0K8jzeiksQTjQV/X9UoyPtCqUw2N3kR5Oo1mgf+p289LBlkI94USTXH1OIMFg4v4cb6H6ySWtUp4SCa/WQFQWs9X8MvF37Ct999j/ruXXyvGxsdDtA6G/8g6fQxXhtlug69Bu/ducsBFNH76cElWlK33ZHCRpeEa1qIBj28eEpWfA00793C79cusxd/lvbk4cwVC8wLOzumL2uSZP3sZk9ECb+Aplb1LjZsp8nHVnV23ykmYmqxiLRQQLhnbhb1d2ewcOAD1GfmsX/xEOoz72myP4Hx3ROki8SobSI5HHqU8HPyrzocrsIBC9F7yore1dIG8ibxmC2HIflRUeCAR/ilzz/Lt6p888Ph2RLWIx4kZbkGkbkgBbEiBXkqCrpJsoGNJEG7/RptRk5baDYfMSK32nyE5w+bePXsGVsI9fMEZmYoQkeO18VNjOHnH8+jtnMCx7/4DF+tfIMz575kG8MdtSqiGrB3ZhqT09M4cPAgzp5bwZWLl9C4fRP3b1zH2p8PGdngZ0gRYQZ2KSV15RkdTjAjn85vM86qlB+byGQ+nPxXUNhs5WrPmKnQHWtXOGDP7DQLyn189Bj2Lyzi8LFPMb+whJ0zk5w5GiCZcYIuKHYs0LR3/3j14m/cbzTRbD7GxcuX8KDxELdv30V7/RmiThcuTXilihki7S8DaQtwIkLZTzalrYT364itK2ktJt0erl76FdevXsOe+l4snz6Fsytf45MjR1Cfm8XIO+NwNYfxiZ1YPncWJ04u48GtO7hw/gfc/O0KVptNVreXsSH3j4EweIhVZEW5XIotaVBQy8uDzHMRwUoFoTgetb+w2u0o0flGcfT4CZxc/hynTp9hz/25+XlOEqgXlSZEWFBS8OiqXSuHWqkEHaurjzlRbDTuY/2vJ3i93sILEu1rNtB6sob22joiCuyIagulEXIfa8R3SHu9IaHSehH7xJoFaH0fsKyXOAiyi+dx24H4H4+3qSaYkKLQIlw0ypTjqd1TmJ2bw9KHH2Hf+4vMQpmc3ov6vnlMTO7if0T/5p7yWGi/nbSHWlW0QnJGQ8wSSpJL2h9iu04QM+SAR8MNybWD2oj4OSYqYyQOQGF4EWkbAtF6q5Nj2HVoioXmllov+e/Edhmk8k6VtoNBQI8XNBW6L8irQFoAXUnBW/rDxbc+LJHKPRc0V0O3eRnQ2UZ3SCxl9m2+AFS0uchyVDFSE6BSCjH3hWsRKU9FvFT2gcKamZXpU9GTcXFliMHErHpjcvKWTv2gwUJjZk4RU6Q6FiImFjEDwCkFzJJ9S/5Ysb2k+WBuJd61hNEzV3wuy3X+RcCL3qH2eacCXpHpMLithQBKlKo7JEmKYjdULKD7I2SfYgoo+k7MjEIMbeARPUqqx0bGsNnrepQtUoq1AS4W4JvPP2CtUxLLUpFD4lnSfxrh9e08s9apW1Xqi0l09JMUWUWsdumntZRWWCsoYhX4kShnbYLWqw28fEkJfxtP19bYfpUQ/n87SdGLzYUH6PcXporF1EzJ5r70cB3HvEa4wMAI4pv7iJgJSvpLxOD1yukBw8hlXoysaE+oaqKUqQaRE9vrUgxM5+1BCiuM8rvqtuAUjXNNgTsDDi155lbiONY9wwQXA0Rfr2kFnjCJ5lbiqGDWWHxvRZFQJd+U8uUZS71gnL+Ovps5F3HDAJ4VgkVbIpM17h3RRFC8r+1Qkhv0+ZnnIsBI1bMAaN4MrPQtAP2ev779JI01uf5giKkQfpcQReZ+fLW0y0og8DCCPiyaOHRe3V9M162iummUOBvC74spyqZmUUH9zsRiSNX2m5HsMUXrIxewzy0flbkwnQQrQLH+hOqKlBkDnONlRdujuVLQOcqC1sLKIWaCsLTMpYKGmP4v6wWp7b13YAsojSJYL4m/MemHwHUG+iTvtHYXS97p9ygWW0NjsmxXBDGhVmEAiCZd+Tqsh5f3/T7Ba37Qx38AAAD//4RdW08cZRh+ZmaHYalNWbdLmw0FlJ5STBqSxlRjjPee0hsT/QHe+Av0B/kf7JVGTUxNSWmwpWjRlkNRKCyw7LLLzox5T998A1L3Bthddme+8/u+zyH46t43+ZHC2gzenmo1mzsxGXICC4WSYsX9zfAgzb7YwA/DIphNkrhUVTcRPVsUmH/pCWWkHi/dMtR9Ve23xVU6uay8L3yXQi/AHhXlzpgtoMsuenZ7sOxZlp6A1LPkh2f/YAPMJt1AxStMv6BspxHxxMtc5lD9QXUSsx1D7ndYoeRYQG8CPmQaxcEXupBrNq/7YiC5e6I+DcpQQbFME89T6sfjKpgmNmOTkDLWzPMh250swKCTop6NYvnuAr7/9i4663uo9MSMKOa2Crlfj0TNACmG8eGdzzHz9jvoBRF22m109jvIDw/R2dtjzjAnaVRttN5o4NLEJYbI0/3ttQ/4kNDbayHOB9jZWMfTxwuYn7uPzY1VWvY4qJFAmfi/5fsxffZI+fkmyRR46IdM+fu8eXqJJwpZ+hz/DmktFzib1BiG1zh/AWPjTVy4MoF68yImpyZxfqzO1dpztVGM1ke5Ikmq4FA3pJwpEJqU8InMHq3mpKr3q5M0/iT3NyFRiM1PJN8czSTPnKWes8LUrCIsQOGG6suhiukMxGWP2E+fPobXolySK0cdoLN7gIPtFto7u2wH93LzBdZWn2B17S88X1nB+tqKVFZVg8FsGMNSSKebiVbsM64chS6ZQ5dHwUN9rIHb732AT+58hrdmb6HRHOOzOr2n2+1hf7eFlxtbLDC5/GgR93/6EavLS2hvvWALymQ4QvewLSKM3oHcoFjF+FHorZNGylko0RKXPO8hlALmCBKvjSBrlMBj14hEufsE54xQbzbx5tVrGJ+exo2bM5iZvYHxyXHUajUESVUTnCzOoOMCDqJOr+zsHuKfv7cwPz+PB3NzWFv+EwsPH7Lo4c7OFnIWbVR0Fgs5pp63vq9SnmlaozzeQu8dHLTRHA69ZFoUMDKBguyPPv4U16/P4GKjiWp8hvm2dNWt7W2sPF/G4oOH+O2XeTx7/DvWnj1Ft72LQd5WwP6A1wja8hJhQKCXivsAGWXQMnxIPF8ak4FU9SWlMsRcOxoXJMo3c2sWt99/FzdnZ/HG9CSaE02+U0FeeWNfY4h+Tz6fxhfbl/bBcP6lxUdYerSA5SeL2Hyxyn+TjgiJ+RFlifolMieLdOBpEZSh1CdEuf5j+mZiryxJMw81Ai8RUMzv/+GfnPooe+/YCMhVY4ITV7w/0EEgZRBuFJBie4KR10ZRb1xAc2oKE9eucn9fvnyFk0CvN2oYOTvCIn5MWTh2eVa95e9k+HrgkmoOnu7RHmxPS7MyR/a0R2jV4bxodTu4+0vlIXWZ9hu5ggg1L+MK6itbjdd+QesVyU5BHmTeWi3VlYitNn2RP4bj+s4eecVLIhsnUzSS+LvCItjIS9X8zNLPzh6YA/3+UengDT2HmWYC85z1ObHIyrSilqpQWVDaU0gMT9ACmQrC5qXXs6Cch8rDyFXnYecjb++peK5H9L++NRl9dpVsMX3mQiic1Uh9vIeHh0r7UpJEJSeQ+BjElqG7sRRzqI+r1SFOJlslDJ74sRViDJ4vdElBJFJwBQ0STXHbuOTUZyZSB49rTRVBCUiHnRYVBQHdbofPZDHtB/o8uSBQEO9PFzqsS2BQcfMgVqE3OvNSUYuq+rSerq+vo9VqscgbuRpwIEIOPaRrEJadqESzKnBn6kDRJ0ZFNUEz6jk6f6UH+/jj3s/49Yfv0O+1gOBIkjI5xDGGzuBE1QxTnJlt4Iuvv0TYPIdO1OfxS/t5hTlnGYtasxhaKIiyRH3sA6XQ0nVbsCiBYhn2Di/IN6E4QwVb9XIwGDhxRktWhVFxJrd4xfrSeN+RZ6/txl8UngiURPQ7UoE+aUezH7c+znS8BTq+fXi8H/BT/OOEyKMiMOeExxElnaplC3LPci/gIl61QGjHQ+5s4scrdj+WyCINH6aQqN+j337HrRCzUjBdcOStHSue9bvRDWLP7o761AQCzeLcUAAca6mNITRA7eu12FxktrjC/Sku6XY6TlCTEwORVMcHDtEgcR61Bc+B3GKh0LWJ3Qtf9wkEwOkID+sHg9hznDaQJD89RDyQ5qwkGPj1UAqtnEgwpwlKYmnl3myuLfHHGgYae7LuB7m02Pd7NC/+qXuE/S+vXTG5B0i8LqgEiYetUE62f/Q7ry0ap9vYk7Us4TWHxSLjGP8CAAD//6xdbU8cVRQ+84a8LG0qJQutCKyA0KhNNCZqkzZgrPG/+A/8R/0HJv1kiEk1WoKLrVVepKRGs2Wh3YXZ2Zk75rzde2fAb+4nSGB25r7MPec5z/Oc4Osfvyk1QVcKDnjoDjqS11EX/4Wuff5xQkMPrbcHVMALVDef3RwqF4jcpqeetzUGgQIAOsj+INDixEqxhwD6EoJAzQm9ydeJ1hc20StkUuo98fkhwwsHtP/8hHBFEfV1xEPBBxDo7zzEun4QRUTZMXbi/X6U7sOLLZFnw80Uk+4wFHdSlzja3v7eM8Sho0ERe0DGN5bWJvXnVRZFkTvtGgU+2HMX28alBiaLBhQHffj+wUPYebgN45l48eIcUtJvSAPINcURCEcm4LMvvoL3P/oY8iihSlD/VY98F/r9PrvcRmzGg6g50mIaEw0rSRlHI8neKzjrvoRnO1uw//tT6PzzQsjEXrIWmIqEQtMg29IGAwhpw0emKFixK9nbn0wG2fmKAiGsGqKD8ezNRQqGl5dWYH6+Ba3FZWg2bxAAQD2+r41RBoOxQSRfZSTIL8jVuHCmIKWHFFsEoOZzcaHwF1zqO1dfJpWg0GPq1J1x1Z21LI1X7/NpbNpSU7+eE0jaSSVnTcOzHM57KekNsTXccacDh7v78PfRC3LkRy00AgBn/S7EUQqD4jWw5VRAK0Pp0UFQFc/r1EXg7sVnGxhNa0T/N0BoJrkGs3Nvw531e/D5l/fhndUVAo9Yy2YgPTcEBPy1twv7v7bht63HsPesTVKDLD0jCl4iB2WGDvF0bWY9MB01rI21sS9jY9jkLxamRlZklACOjozR+OJemn5zBq5PzcDq7fdg7YPb0Lr1LswttWCq2UR/MLtedCWQrFFo/fnAUJulTucYtttt2N5uw+bmJuztHcCfB4dUiY7IVI4NDamdnMAlLumvsY9qqk0m5VdWW2Ud5oGrUhKNu0ATQgayGlcaMD+/BHfvrcPGxn1oLS7BzMwNqsSPjkaQnqSQvzyD9g8/w+NHj2Bn6yc4/OMJnJ506H1iij6xAkJhAGS0PgMoY9aU55S4JKRDxj06fuUqtFbW4JNP78Dd9Q1orazC1FwT8AzNCjSs5WtoChNUzDvlmYYAvdMUDp/vw8HzA/jlyVPY29+lloZHu7vwutuBhFgdYhLpd4MsXaeLeppar6kHtR8uYcLSdZNa1f//BAD0enSNkA2rcCejTKkgWnJC529j8ipMN2dhee0WLLSW4ObCAskkrs+9BZPNaRhpTMDoWExgRlYYqZAbSjJKaYVFwLIwpfznMZG3ni4BAMJKPOAAAHvGahhhq0YaRDugsuQuoISd4dGa5UPo9foUlJ6ensD5eea0ruJ3lIjjONKiQ2HXUdIm2ks9V/h3BvrUjd2U4nNEspa4khBXP1gxj6R9qIwHnvGF+hcU1lSyrAEA2qKLOrGI3wH+bHtQ43gU7PJsPE1uPsgq11C/oELGtx5fOK2u3B9A5XmQwu9MXo3Il4xtL6Zgh4v7oovX17kyjoKqH9LTxxz84vOpHAnom0qn+dfvC6oxjp948T3mnKiFXsEqUhnmxTVWGhd4E905CDy67AiZmWllTinGGFxjPFZINyJs68wxU2G9lsj4EauH6aDSDQuBYipoxcwswXjuDamS4//h3+P7HuVFR0dH0O0e23srMi1uKC2shNjwO1113joHzDIACwCUEtsqi1SLaxUA4LtvYXDelTHn6C0W8DctIzgOCmh8WAUAgPTrA6YlRywTwG4midLqIbaMC30OnWPONYxNfnBNaWUfzeH0vaAFs1gM5NRHjKqzZvifyT+IJ5YmcNyWO7Y94v2YXiv/9d9RUx3HrpJNEtuIfSLoeiOJ3W8uKctoPbChp/hACENawc5QmCfYtWGYK817aFtRalVbjZj994vmGJalUMs5tCDKrObUi1cKC3SBgAD+uWULX7ZbWnnhfUEFT5FB52LgGnvtDLVA6jwcXFHLX6MuXjWV+w+lm4EWKNPBsJIPao6mndsQnMfEXLX6dRf/un+TXxTDOdH5si0OpUDNwGJMe46ZVQ54JA87BTDQZwE72yUsYdd1qsaC6HmG869MFS5usd8AGc2T0SWDlSpt0XGoMCwEIPRlMgzwOVN8HnveIzj/BByJF4Lm33r+0jybAv4FAAD//5xda09cVRRd9zEzDDDA8KgD1IIgFhtbS9Q0mqapn4z+Ef9Bf42/w88mJvihRqW09oVFHgUKDk+BYeY+zN777HPPvUM18SakNO3c15x77tlrrb2W9+3igzQwAyx2DC3UCDC2kuj8l6eDrRR6ZuL0rXogj4iZgtO4/LvGfqkT5aMAQA4FNxI6a4pietujyLDuZpBoH1HgeA3YQa6sninwFf3VyV4l+upV4LY2JGbB4htzN/f+uJuiTdZ10w62bsma2xIgfXNZQaHRfvn/L5MOZVCfnkpMiyJCpZI6mme9Hu4LlF/YTiSJZ1ydxVUykym6W+CYG0I4dQsucG9gHKAclTGQVLDy4xP88N33uNg85h5fbgfwMraWC2k+YglpqYzpG/O4fvMT1BsT7H5Md+acJj2KDqF+NE/MaTyTJtFDL26Sz0RtnDX38Hr1JVZXfsfem3WQNR6zIly8KxtRZDBTLm9Sy3f69k+RZFOETQ9q9VGMTYyjNlrH6NUJjDSuYOb9WYxTVnGjgeH6MIbqNVR6kGP0uEjxs1o+1tQ4lX4Su4Y0ZyDvGfM5x9fSfFdmn10T1mWyfOff9XOFYj9OLgT/VZkAACAASURBVB+rbqwT9/d7mSkWLYZIkWMtEcz66/jwHM03uzjZ38feJkWarXGhv7a6gp2dDezsvsbRyZEGMqESlPlcqKAuBQk6cctmJ2hB5hZERTAjAGyrSxEAoOtppW2Wm4pbvmQ4kEv+YF8dH91awN1793H3/pcMDPTWRyTuKorx98EhtjbXufVgeelXrD57iY2VFRzsbeMobrJEXkZIbOzgJOYlsEJ+HVfKppPDfR+FO6JSraJa60e1v5ej4q5MTqAx+Q5mZmZw/caH+GB+DtWhmqn6RP7vGXZFvRioiD0+usDm5hYeLS3jl58f4tnjJWyur7KTc4dUE6bQ8kWPyQV+IF2/lziRFwGA7iKl+Cnf+Rv37DsARWp6gqFMcuJJFE4Yor9Ww82Pb+Prr77Bnc/vMVA2Uq+jHAGt4w5ODvax8uQpHi0+xG+LP+GPx0/RiY4R4kyeZToP6glns1BhW5OwgrHpWcwvLOCzL+7g1qe3MT03i4HhIe6D4DFrZYdyP/WK+Zknpf5ZjIuTFjZW17H26k+8evGcAaAXz5fRbO5gu7knRjwkwSMjT+MN4UPMT/V6dRov3sG3PZo6vv3Cc158loPCDruMRv83ACAbg+JtdppAGPQCZLxarmLy6jW8OzOLa3NzmJyZwtR7UxibaKBSq2JwpA6/J2QPnXYa2wUeAWrscRDIM8HFfyDxpZdtPNTTbL7hBbaXd5G35kRk/ukWlqo48fIpEWVucZMUAKrp407A6RYEJNN77bB5xAxsc/cvKf5Pz5glYTOlQGWxIf9QTnRloB/Vvl42GSWp+EB/Ly/4JTee1Hchg+yWTXXViayaCvOMv7PRubejxGSSGPl9HMsLIxLAmdph3CHhFfblKiX4+Em29hIlQXebhKxXzELcRLCKqqGbIPD8bH++ehu4MaaOSlLn4+Ia622b9SewYHLiAN+ZctMPMg8D32HiVL/nHq+oaGOoUxfAiSQpUWFCa6Keatmy7LBFR+AslmW9p4SHMPxGiRrlzd3grHuhhFIiRaHGEnOuNo1P0+POscTk9s5xd+azKUXTXRg2tYPWeZul/NvbWwymU3zl6WmLgQDNgM8RPqkp8LmY8hnwoXYBLaCZSaXoPl9Abfk6s3um90IBADLZdQGAduuQ5+P/AgCC8UGchqIAkLElhQy1VdDv9NxwkZI6KRJxZuwJCwaEOYWKKlkUAACQIyD1e7ORbUGaY27zEujE+nzBzIWWIdZzijKfrljbd01xKeNT+r21F17nQgLeXA8Al/3XrP2IPcFKOQBAWxw0GYT6+rn9pNojihIDBigAkMSplc3T/nS8wikS3efTBcY4a77TstfX6XS3/boAK/20Tcy6Ztpftn9X4U3nQgAY359AFAguAFAER101Ac9bvgChiRPHKLJ78QZIPSF5Q/sMJ7YeCY2PRWiKaWXnc0SY5yh9lSD9FwBA0wHYeI+TIsyxjCeFmtDTsem4nYRayaRFgK6HWswVAGCQpyzAsub3M3Ft6liewzsy5hVwYJDAuV65r6ZmdvzwrGLAKegVAFD2P/sOsoj8IJA2BW4niTr4h69r2W3biKKHD4myFL8dy47jOIlr2EDqFN2lBVog63bRz+gf9Gf6D110USBdFUEQFElQBAngGnBtp07SFH7JskTRokgW987cmSEdVxvBssTHcDi899xzz/G+f/pDIZNJaP9s06eTeWNBpyla1VaAZlRnpJ0WPDpoqcDLhSY0kAbTrbTLdhR1Q1X4A03xl5tEFgxll1FX1P+8KPXnwEHBrnqJR74syoICCoIiLQEyIcR71WxbezJ63FeSK3sKDZgoxWI9icSf2Omd4YnuF4b6X118eKFB+SZD5QFdZQCggqQRwiiqjqEGbdztmMqDHrcstR6b7sNNXqXPqaLuKwSZkEru4aIqduqzVc9YN8DjH3/Bq0cvECRAKygHuLRuN6hc6Ac4TxPyCALqDbSXbmFldR1TM9fZDor8grkHfZSxrVSolfTzUYrzk2MMe10WdHu7v4PDf/5Glg6MMNIoh7HPYhsvHaR4TNkPkRjhMR8ZAQzj45hvL+LuJ2u4vriMWytrmJ5fxNLtFU78p+ZmMDYRsNDZRUoIuU0u6LmSJBkHhn6gFGCFJupWv6S3lymyUriQwv+ocBs/bSv9FQCAZ4Kfyg/0q8gtfcwETl7+EbBKHSMjgXqTou7LY52p4LQfx+iddXF8fIx+N8b+7i7eH7zFzp9b3EtPtOjO0RGPszIwYmkvrcGuxFBGrkAo3f+BrdilaXGlVZmd8RYAkMRbCPiikk53W0TWR0SB9GqqF1xbUtK13ri3iQdfP8SXDx9y1Xi2vQByrKJYoB+nTJknIIA82Ynuvb31GienR9j7axtJ2tPa8opOH4jgHFTiTvfixNQ4pqfnsXpnkyv87cUF7oOenp1lBgLRpds32picaXHFXIgoIyUqz2MwVFgAzns595j/8fwFnjx5ilcvX+PN7hv0zjrwvSEzawLD2EgRkbM9O+CMOEBjnRat12I1C8wdXRldN8EXorhvPnHhgNwrT1XoPm7ZSiqgDlVk6GFaD+GFddz/9HN8+813+OLBV1hbW8e15jhaY8TxB5LDM07+H/30M14+/x2dsw+kQgBSSI+uNVm0b2F5CZuf3ced9Q0sb9xDY24Sxi+xpoDFsBrI5Gx2gPN+jE7nFHt7+3h3cIC97V1uA9ne2sLJv4dIzrvI0z6KgtSKc27VCLVyeaTPowbbm///8ImEyeVPoGNu32EKXDXnhQVjKuLuzorL4Fh5a77uP3e5PDBrUqEp+FFzDDeXbuPm8ipb8i3dWMHdtQ3MLSxy+1I00UIY+axLQj2NQSNQlTW2Cs10i5kS5OO1mVkvGsASsTqnp90cJVUY80AloZ4FkErPKCiGTbU6Cw3aphy828/6cZ+Vpinhj+ME3ZMY/d6Qk/04jpHEAwaT6Z0rIJRoa5qkAugr1aEoYIuppvavn5ocZ/bZ5NQkWs0GWhMtRI0ae1xTRTjQ9FYW9AvDEp3YsM+KzBy/y4AQi1Ra0wsNAHCLhDMm2bAcIyir5EC7BHhGqMwF7xkU9P1ScM0gDSutoyQIFUW2QMAWwpmId6lEvNIReEmD5jJDxTJY3OINKsmF/b13iS+jEsCRGSM3yQ/cuV5hotLrglquahHHXRdD1SdN585CdbUa+v2B6bdnuzUtEidVVKbq1iNTsSVLLorT6HpLXEv7pWScHFLS1GozSBJf0zR3dY2E+kzxkjofuqb0fdpGr9dDt9tjOv+Hd+9x2umge3qKOFYuBANysWo2+XzYFlL3M5eLCLZlAqK9IPGzYcZYEAVOkanK0CUAoOidYefZYzz77VcMk64FAHQLAI9zEeDILwMAg1A1ehIIkI4uNJtE2XMSq8MFADJHub40n/yixBwWFy0BAKQaa+eJGktTyQ4sA9bc485+hJrN7SGNxiXqvLAi4FTWwyAwYtoU/4syvswjV7CPxZ518upp3391Xr5muyg6uFJz9w0dW5I5F/Bzkzsbm/vGHhN6PZBCZebs152T9D9uU2m1kCRxebxLgqoFxwzQOZ+Mm1ThJZm/6rdSNA61bSlb5QlwYpzkLOs0zy0DScCLoijHJ6bwrOeL217lajRQ0k3tCsiVMLrkePI9A1I461XmVODdc3JZHzKX1N8BC20qMEYBS8LckN8NyMpaC+BLlV4BIwrIoQVAxpTeaV4pIEC1HymRXFvlZ5FE0j2gtYR7/imZVxp7H5snlPC7zwPSElFuC6p9w+gH6GOj57h5zgL4DwAA//+MXU1vG0UYfmY3thN/xabBIakShyKqHDghEBUSAoneuaDeEX8B8WP4DVz5kMoBoapISHAB9UDSNC2kadJ82Wtn7dieRe87887ObB2JPSRRsvHO7s7Ovh/Ph/rywdcZ+zHSwmkDIfMXXVCazF8yAkPng6jI+enT5GdonS0EiAonV9nKhicvdAD33YrnLQg0J8tvjEBllKduT3xxsalQVknpugKAKLAKlEiOW4SciFo+iyKokDMSWzEif5NFpQivFhX/sCKtLFKilItBWP4ZLyR2MkrhY2qdBAQqlc0mbgz5ArXgKA2RhSX5k1msTejYJMKirFImi1R4vspmAnkLqDbhJI2DVG9H6YgfIPLdL1mdgWqlysEXJV3trInz357ju2++xfDJMcpjy+lB/o43SVNBXIrF5MzvWq0WatUGWu0WGtU6q8cv2JcV3eekd4p0OEDSv8BVmppMVYJNucYUaEUm0CwTIoJ7l0sgk5pycx2blEjc2sTm7bfQ3b6N9e4Gq1XT1lysc/WOitLa2aj5wUsYvedTzZ8TPuczt8lDEKxcs39hy4IKgCBISK1UuKWm48QvafYQJW5YBVSYpmnLi1yUvxQYCk5FGwvfJ3cOet/xGK+A5MUY/bMLHD5/ipMXB/j3yS6Ojw7wbH8PR8cHOOsdYzQeYpQO+V4uRMpLVjRzuVEIyvxShSrwF7Ls+mQo3OanW+6rkh9i12HTrkxgklpKh9fWuvjwk0/x2ef38Pb2O1h+/QbiknIFpF5viH6POoYv8XR3H4/+fISD/WdIBymGyQUWyhq1WgWNdgOL9SqL9jXbbe7udzqrWF3pcPew1WobC7Cqysc2lcSfgu/Iak0YNXQ6+mWq8fDnP3D/+x/ZMnNv5y8Mz05QJt0PVDggv5qNee/YaVfYc1S2+1BYm7QvzDT3qnoVfSXzWaCAWfDCNMl/saBgA4dMO5yEf3eUPeUKyljb2MK7dz7Cx3fv4oP338PWzQ00qhUDe0hHuBwmuEhOGQ5bX26ivrwMkLK2tmR7hLxu7QnC0npGYn0vj06wt7OLx3/vYWeHrA3/YbeDo8NDXis02bBm4u1gtsg6lZjny+vq/Y+56V8J/YrKvmPaG/qByu1R3SrgISjgIS4EdcD3OMqRAbx+2kBKZ7nXP4mMRVEZ4yn7orjpVqlWUW+1sdHdwmp3HZvbW9i49Sa7SHQ6b+C1lQ7zStnv2BZPZSzazgexAdMqHLN77jkOyLkLYZLowVGz3NZN/ndi9X5ia+06MULlbl2lAtl0YgR5SfRy1B+xZgwJiA6HA1z0eugPEiTJgDVCJpfGK1soiOQC4MaZGSFSB7nnRDjv1lGnkopPJmkxyYVYPdVqS6g1GmjdMEU90j5YqtfM+6rZwKL1vxc+bD6PNAt/yXXhjnORQuklzMUkeTz1LdGsIn8mRdA8CVBeohdluVXzPIi8v/nBY3CvJA4pohuLCJU5oZa/xM+D3xY/0z9uMXYrJojRnM8u7qN1mJAIrNyI7whFw66bnrK8FKRM4K8tZWLmJSFTVCtLSEcp2+dRHDYi+O9s6hCYFC8vLRJf3ACyyLec1iYqVBG8d3A2RNLrY9Dv4/zsnOcvJflUrBJ9JmWhvcShZjtCazfo32c5Y+5OxlGgJu5TC4P7rbQ7b0YeFpMfoqkR5Dk5xePff8GvP/2A2TR16xjtWbK36hIRTiKNlTs3ce+rL1DurqCfXZoCQGzWUtPltMiDyFxfQidIUiy003DyFN5f7lnVgRo6JVSkBE/fRYCRG3qziUXCZnli7sHE41hczmYuERK0B+clcewSR/o8iZFlntB6JKhJis39GFrmnOwrnXpRfFcWkWFcGQyPXZIzFeggwDVchWcu18y5GkQ5bTmzgoFU0JplOmgoyvFiK1iezUwB17cNDWDmKgqs1UULy9iNT02zIoqYm68sxSFAEkUh5UdyEX42eJxGbyxlNEvJom5iI5op4oU2yYWnwcBIjjgO8jHgVQSQbFJk4MaXNtaDwpF3z7qXA9JYaAxEIZBzdjEzcfWtraDfKJaiojx7xrEln7O0v+SR0uimuSfz1gnlW6qQzDuiPHPxhMdlUAA+GkJyQykeyc+m6W4oAYLMYHq7pZKbIkhYOKX/MQjwElSk8B8AAAD//5xdyW8bVRj/3psZ2+M4zU5YgqgEvbWV4EoRF3rhhvgjuXFBQiBxBIkKkJJb2wMiTerQLG2cxE489sygb3vL2AELS5EVb+NZ3vP7fd9vSdVwgSe8OjLG85QP1VSx5swmHrhnnRa5WdaauygAFJS6YwXcSgXaVbdkkGrsCtFiKK/fOrq/GnFE/axm7iZ4RkDIBkgCQwb9wdAToODZmSzgABAqdDNX2E1MAah3F6NROYOnj9BEi9OiuE0SZQcNLGzlzPrQ3IVjXRLSK6qMgQoc1jj9sF6MdTDIVduBlCEyQ5HHGeCLyz9OXLUH0nSekCZTxekNOojDAgcZjaQ8mWIRYHg95oxxmXiG10OitSDFC+Ovlj/YgIePPobfjn+CSVFCW1a7VuJ9KjJ6k0kO9Dm/vZuzYyhOj+HsBe9HB9kAThJRkK46DTSfIJ+hCx8jfbBKQtapOty+A5s79+CTR1/A/U8/gw8fPIS1rXVY2V6i9cAk4c48HrpUFjCTANxH64tbEcG/gPiwaDC3NrVYMcC9Fv0XXHdJOoOg1X/O2y8LEGpPFjmKpxi9l/DzN8OCFiPDqxG8PDiE/v4RHD7bh/7+Afz153N4c9qHi8EJmLogOFERf2JMR7elu1RF32zu7kWa8sXYogvcAqqsCe41IcS9Qr9gSdfby6Pn8O03L2Dvj9/hy6++hs8fP4bVtzeg1UNvCkwQ6MCdfBWWN1dha+ddime8GlwRmwA1q+ubXciX20RxxwKAwYzWPKOuPh5njJWsK1/4qrWzb8n+glenyBzCebEEGBYlHJ+ewc+/PoHvv/sBfvnxCZyf/g0pjCGHAjqkKq7ZdrLE1IKKdK1KzC0FBlS3OLnrcrFuPLLoTbu1eu6smXeSDcW1EU2+qqKCD8g47y23YWV1Cda212B5vUd/ScfwMUF0280hX8mgm7/FrI7aBF/V+X4zqjVoMHlJRli7e3vw7OlT2N3dhYP9Qzjq94lCy1TnCYa2OeYGeX4IGPfgv9nC/P9XpG2M5PCIM5Vdyyrzb1ootMGFTb8z0hTBNQ3GaZEBJ0mJLJmwjVBXiEWiugVb77xHjCaUmdz96B7FZG7vvE9RfOhRkm/0iKafNrQG1yznngVYwfnWayEybUtmi3q3jXE7pxaVBXrRSg4WSTUmHFk3OL8g4zOkQl+cX8Lg5BLGo4ISfdRADMCbYKFEqYOSo0xNMwOAg6CjYg29rgOwQ2Kc6SAacY2oEFBT8SuB6U0JtSlhVJRwczWEk1evSJqCgB+7wsjuWdtklg8Wrbq9JaL5It0cDetSmwh44YpN1jKuMMn0c1+8jtg4sr5oZ0m0xog1ECnNBaFuxBcC9D26LYj+d69vPO4ZEXp/+3zxX+C/uT0/lyw+BzULFou808qFxsAqPq7GVfBnv7wJvG5US61FBFwzUYwzGoxQ7R39WGroYOwgRhPXfM1imtLgzZjiJfEaRRr/JRasXr+mxKPByTmbUcoaTTPQyeXfWMgzT8nHglcL2QQ4DNGwLw/knHKfZt4Dg5t1cSMqNtFEtt+UY/ySeesMAQjEThgRoyx6tp6d42zm/RQiA2NTi268cgkoiZjdua74HJ+MWUYAU86MJBgomLVB+tW8z4m604I7qFiqWm1jA/CVuUhHAkkyJVnpnJdCwybKf+Ip99pRVZBNhYdQkhP4cahhIOMVxgVZxt4jGj0OIsmYTrzOXXPss8DE0u1TcLyaZueg17AklJFpZSqUchPSxCvHnsAia4om35aclRlngI9Z5+3z9lS2EXbx3f9N2XWAw9RkXP3PlE1BrO7p1KW2sVzBRwoq+FfQrSAccYy+DveDmp1BYRB/X7DYoEwq57EV+EKAUOuJpk9DCBfI3MHH7eA4JjAtEUzKblBPsnAOx00rs5y/u2c0UCG5u8TeK7J9PNcoS8Ft67WMeJCKLiInom59yWBdpekcSS9jX/ZDj4+aVKZJmwuKESMkPi/4GDIn6HOthX8AAAD//8RdW28bRRT+dvaC6zhAEIoUROtEaV+KEAjxAjzxAoiXUokHfiKv/AZ+QFECQq2gRUR1a0Oq2PiyXu/uoHPmnNnZjVNaqRIj5eI4Wq1nzuycy3e+L9F+jZiD9MsL6Q1QSGs4+BdDD5MHkUAj/EJkbTk/7any8AmCSkRSaSZjNYmb5CT1hDxsoLFq2kulP3gIKARHe8fq4D3dIAbbZfcgDxs+sDl7kyKiXq564w9VZRlVmJCRzI9mc6y9HFB3J7s7tKejkL4fyt6qkdOGaPqQnEHGWvHTTJQQUqgsCLHLcg8rS9Uo/Cbxhrte5bzglFkOna+rhs4h9VGWm5Q/cxLAY1jxoRKZDgv038rw4ecf4/zRCA9+PIUtY6fWIyGZ6ZYQtJKpRlpHQtblanRFueZecp5nlAR2dtexkNaNymeII9XYZjK/kkOnMsmwd32IT+7cxdfffod3jo+R9oHeDqCAC8pqlzVaUoH/17h0mIUvI8VfC8yX+ChqXUNZj8QRENIHKaOU5S7pWbRcWdhVgeLZDBfjv/DHw98wfjLC/V9/wdnZI+6FX85nKDdr/iLdBuOhzyVX9q30lxsJaGr7/IDmVY4t7honk7qjDrISWlELt51hqHqOhw/u4YfvF3h6/gQfffYpDo5ucM9zmrr9QXa9t5/h4MaQK7cMa0ud4gA/a7z1ukCFgjPy60g1zEgSYOU4e5gMcq2V2towMiMvVvh7OsPFYoE/R2P8fvYU59M1TNJDEvVR2ZxEkKjuL2G+c2aJUtMEEPHa61q40YXoXvbHOxXA/2gBYJsK4w+LrWFuLAR22n7B7WCDAW7dfg9ffPUl7tz9BtePj5Be63sgRKXwGrdpERGEWoPyyFWj6e5W6xyPR48ZiXH/3gl+/ukEp6cnXEEbTyae4diKXnDEyVa6b5cacRLrEbP2m62T8vIjzDm1Z7OS9XKZOTmSPA6l7gROHuGmU9HJNl7Legxl5uvZHja059GHMTuos9fw7nCIg8Mj3P7gfQxvHuLmrUNWHyFVjGwnQZQ5gEUp6hGQCgWpJtCzoigahzXw71ojdCCueu/qYVqf09utBgvClVJwlcTg2fkK8+kSE+IYmc3wz8UFn1nkFG24chcxioCg0IO0174v2oRxwzDu5rWDVtmUwuTtngtZ7FJA7vyuEGeGAx9FAGxEBpB/Z6SjwWZRcBJikcwxHo35rO3vDjj4J9nX1/d2sb//Nt54cxeDQZ+T4/Q/5PBThTKSFkInbdqsNX+vm+S4bwPTexe2yXAdTNQ+wxVC2yxL49u82Ni+xh752Xn71SV0X36ELQ7N529ex50WyEY7JYDPGttKjzoeJtm9UdM7TS1JtPNSy2V3pCwhCuTLDWarNUP4p9Mpo5BIe38ymbj2lEXu54h79cVPJW6jjPxaRtrGvoVJCW8hxS0mDJSgl2HZAWePRwPUioR6gcXgEu4VyQ/5nXyp+WLu7N1vH+NUPGwbvcRIXnY2Sj4AGlsJ5axFClCQr+H6aJtxF82hPzmmCBCe3GKh7QB15Yt4eE6xzq+1avUH0Piq0xLnuEQahIKSYtLf3Hr0Otek6zUFRKq2aiW/lEA/hLyXEpCbZAvB+Jah8ZQSlYYKaiF8XudRFawgvrtn1Bf0NkueS3znlERchRg+iRoQCgbJJCUMdWji2kv6KTIbaBQ+oi6RjawNE7QLiiMk2gxRHt058QGv2BWhK5V0j67DCJCA0FUr39oyQHFcVjdqanWlic520rQSpAI9p9VuFd2ur13C2HGIUGBOMSDvPXkoamsOx4FS3GV5Wyl0Oy6Jiu+f/Eu+/wCBHa6pzpeSdC6LJcdOtEbavq6KGG17cL4qJRXynNqImv3mlCNkzkRaUu2KExDW4l8AAAD//9Rdy28bRRz+9uFHHKdOgksaUKG0TXpIFSFxqNQiqtIzfwQSEn8nBy5w40RSCYlQ106a2rXiJrZ3vYN+r9lZkyAoVIiRWlWuk7VnZ2d+j++RGn9CICw1D9GJY7OxaKiNRennL3z+3E+YqQxaNWhRlFAXb+8XuARYNY++tIlrmDgIbYgM/XeFcrLmHgZDQaap3EI3lGyxzHEtDwWnkK7YlSqYdqOXDxJTG5UO+uVJvamR2s26OvmPmQfIc4GirO4E0CG6CQSxj9JYfTLF2oQg2qb02EjrcPnce3WGCrUGDbH7ZagJKyZYtdmKL4mhKQIRRumiVw8Hqn7R9b1aL82Vf0Ccp0lwIShdYJJfoPtBBw++eoqz0QWOf/oVqTf0LoswlfmpQG0Lz4ORdeJ80YP+JoXcaTZFppoANvhgdeX7EutWNVrYvnUbsyjCs94RVra7uNbsgBD0qQbEiYrPs8r4X9iU/+sRa1BLyX/kSoQFjQWJKJ7lmEzOuXN2PHiJXq+Pw8NDDH7r48XhLxj2+3g9PEWRz9TZWUDodU6OJ1p8AUuxCU1DqCH0HPAmZME8c+6Lv9HP+XeG5zYvp19LH8SwQi5I11mUsBZjf/9TPPziCfYfPsLO/T10rr+PtfU2v4uq/LSuGyTq4jLUo9SnxYxg0USZkovFNONnbHI+E0/mlyMMxyO8Go2YKpPUaiwESHaW3W4Xm51NPsTW2quspr4NYGf3Lh4/foRvvv4WvWdH+PG779U7/wcU0zOGJRf62RPdE/5MCPJtRxwgSfQOB/++XHNi+bWV1TXs7dzFk6df4sHnZMf3GTa3b0hCH+VMYUjVeYP0SjDXrj4lqJnD6M0Qk4sJBoMBd30PDg7ws3b4T3p9LmCBPNsp+NPgbTVdwYz2RWSoEcQUGSe8DbXXpPgkZRE0oWO/2/UqnbDwGt5t7ZIRvmwpgO/E0f6bJ8iwgkazhdZ6F7s37+DmR3ewu7ePDz++jU/u3cP6jetob9QYzVRvSOLIoqtqg0mlOxKXiDX/EbEguaad9yGE+J3MCiMHApVpvf7rsSRPLwZ9jIcTjI7HIJYLwazJg59oXtyto0AlrnNwyZz5wvliXKIdI4bbUjfI20DFWGQBvY/2durYctFBO0UEBaRlQAAAIABJREFUly6Mc54idXVvv0suGg5vVOnfsZ0cPSPk6kFxBhft6Ww+n2N8PmSk0NHRczRbDVzrtNFsNfFedwMbGx1sbW1JQaDT5i5QTYU/K7EFF/kT/2x7q9FAVHGeSUf78uThjwH024yruqr/x2HdWT+jSxSpKl+hjIUsVuVOpxMbWlq8s6nDxZnY8Z2cHGPQH7DQ5OmrU4ZFM9y2KDtr7caqD/7NqplWFcH9Of6LRbGfBftUaIyKA2bNzEG5xl5UJKvH/+w5ja6q8ukonBS7mO5JZ04ROPO4wObTihrUAKJ1a4lqKtRCtq3kBlMpSMawe21wheOq5B+a1AlrUfhOFo8XUSkSV0mAlgvgS1U0p2vAnBHiZOFdHKSYkHhhv1DE3OwmTVsLqhFgSbPtPVzMoZ/j+YgqzmSSPFabj+ZyYHucc853niX5ND/8kqpczlPgQKTNWJszyb0K3qd4DaVCfXCqexHCyssOtiAJjFKcMgIi83F1OLj7rc4Hzp4vtawMB6O4Y3mdERyU7CdV2k0oCJ/oNfNI88kirxQAiCrjqeeLkhYRrm+7Hp0VrNuhBZBcXRRCW3m+fiLIDaK/EH1Migg8k/z/ZI1qjgKsY6X5LN+TAFFuv5PyK6LvUO5Uoebw96dnWn5G6D2Sm9Ec2Hei84EarqQPRtez70fvtfmhYc4C1QKYoEzoDxUBDBFg68UKBvRZyL7a0BqkhzGfZ/idsnPpbaOK4vh/XjZ5lMaTGKJEbQQL3DSKQEUIIegGxKKfgAVfgO/Ax0HsWYHYVCCxqQCxRA1NaJ0UJ43zaJ6O7fGgc+45d47HjqvOxkpt1/O4c+eec/7n9w++efRtbgEXenBs62HsI+iBGTP0JvO2BRzIRoV3v0pnAgOx0PfYtsPcDOVANPcSuIrIcPpCiQyGenDiYPh7FPm5LEl/xIIvlCwnVcoVLmJ/LxgDwcvzYcgGpOfe9uDb3v4ykNBuoSRG9LdtZt3/bmggFFFB5vdSEgMktPIu3Z8gCj1ZUjdWZwgZk+ZR8uZkYIZ44NpjIQsXzR7RILdemiSlmapOe79bf06pQkoPArrp8hAzmEblZAqt35/iz+9/xvHGjoOD0LkX/317nm0wo1J+/zcHPAVQqlyFsrA7dogIHHgmoaxZPsC76/fwzvo9YG4B/WoVN9IaGqt3sHq3gfpineWalSnXw0qH2ekNuAqkSe0ylX8c9GjiVlJSFuuN67LVk1oABtwSQ0F+NUh4QX9x2sHhfhutnRaaW1toPnmMdquFZ8+eYm+vxVChTscRsdmheTDwVp0OTliE0SEHmVdQrn0uug2FFzqmgtoQFtX/14lFX9XgMGlznv+BgZq5e4omZ+2sjmJKSjlpca9PAXOFJdP0ME7rKe5//hm+ePAl1j/+kOn8MwT7SoqsfqbBveAGVUDKFo5XZFd5irOTY6bw7++9YCji9tYmE+Wb/27i5f4BuleXuOp1OYNObgAUqqb1BSwur2Cl8T4++OhTvHdnlSvitXoVeQKwO5ioUM6Pu2hubOPRw9/w648/4e+//kDePUaWnXKShipHYSaLKte1jJ5nALzeFci0YiijgGwx6d6meeGCQE6SNKSA2z0+q3yuiRFD88PtW7eQpgtYW1tD426D7Q3J8WBpack9MN8Q5ZcMMgJ2UlIk7/Zwed7BUfslnjf/wz+PN7h3//luE082N1jeTw9I8qf1cyTFsVmppUSz21plVwVIIEoAAyUr9/SPyP95K6neSq+Tz6btc3avap/kCO3SzhXIw15gjQo8i8k/FFVEmEbtrQXUFheZyr90e4UtDtO36/z3zdoc3kyd7JhaT3LjTqDxzUCUznzPCH2MF73EWzFTTz4094604MpnjMQzwLXPSogCqddzn6c2AwXJ0SO7S4H9OXB2doUXu7tcJT1qH3LllBL5LHPM4uEUFAFqkXuVYeyVxu5alxMXgcgj/QKzdIX6hmQ9kGJB+Z7R68U0c1kgO1ZQnyW19vM0Roe+F8BT0Jk+Q+ukxAHAyEXhRjrHc8Hy8jLSdB7z8ylmZ2cxNeUYH3SeRNXNCjVaImUyLwTipEP3X98oKGEUebnY/V1Hyh/tvy9vA+/3Ta8OohZKsWSM1PoV8035eZ0Hk1Uj41Qm1/3euICx/F65Wqq2hEpfJ2CfFnpozusIwZsqhbTuJDXlxfklDg4PcdQ+wN4Oud+c4KDd9kUvpu5LL7MrlJTbKg3lu3TokfShR1E08u9D/4dlPEiAp8onXRf7Y5/kylBiQtB1jaWvngoqM5UE7eYGfvnhO5zubmPQ75rv5X5e6+cRDpIMq199gvtfPwBuVnEZdjnRSEleHvfcV5zzmpILDHGCJK444J4UB8sJGZqrNNi29mYjblz6eQOpDqRQob3/6shw3bjIRT2bmcA6kapqQfd3feJ6zrN8eN5TIF9gLBUHwn1IRCLuA3JDzbdqYXs8lg+gvf4KKY8kOdHr9bwqwFe2dVIPi/HRZcB5JDFMxGsi5Z+ogttVmZPiXJr51ILudAw61VLukyMZy/Bjvw9hXHGVZ9OyoBaNLnYLPYS0eL9oe3YF5v7QddFj12O09u4WdqrnOjbKbP0+JKETBu4aafyi++aAnREzEvT8jBsztH+UJKF5wTI0PGFfLCkVFqp8EPouFZUIKMsuZ74FwCUENIbi60At4jQ3ifuAHqtlwen+e9ChjD9SdLgxVNzn1qUhiiiJ4Arpyg/QmPqy08H/AAAA///UXc9vG0UU/nZnd+3EMaF2W4ibNkriBiQkwgGp4ogqVb1XSBy58TfwN3Hj1BOUA/2lEqkqIrSuFSJKwYljB9K0qfcXem/mzc6uEyoEUoUlHxy79Xhmdva9733v+7zPb3+RC11eGWsRPZnaJk/7Uyb2NSvfGkENRt1RbHRBRzynx18Lg4TWSkFEEeh9roD7xQXCiIbTq1FY9wWGTpNqn+4sLZJlL9MWLCooLZzdxGZRrWqm9OxUSjSyOQNj2SBAgPzN3WDug24i7oK5CJtc7II6ua4DshHZd97Y0LiHQzH+4qYsG0c0FphaE6qSsIoEBJLoIytrJMj6ipoqBS8ibCJuC6JUqTd6aEUXYWg/KijmiFUuJwphPIf5wxpGt3q489XX+HlzCzXy5k5NEun25Tnz53t5xQfbK9FGs79JNwl8oJsxKaSznUxYxwcfX8HC2ntIG02kKsKL2PjKzoR4szWPtXe6WFpZQrvVRr1R48ohLa9nqN15KeB4nQBAZlSjc2ZIkJf9vbt3cPPbG9jqPcLTJ7/h2XCMo/0he5brsZn9yeI/8r+URblYMEjjoqZCHjsAgMy5Z6vrxwEAx/3ckx7/FgCI7Vh0C0SK3AprJWxSqVk2oaKD2kd9toHVlYu4du0TXL16BReWz2G29QZipXsTRaCSkvXAK9aJpo72yeHBAUajfWw97mN7exu9nx7iyS/b6D/qYbizi73dAXw6rOn8o2DKpBxFzcnMNQUGQYSDLETUaGOpexEffnSJq+TL3WWcXWij3pxDxiICChG5gz0H+j/0ce/mDXz3zXVsPtjAeG+X2S0+EtT4NEi09KKTub2aHVCsQqoN9/T6ExUu09JzxPrQ9nseJjn1qc2y4Fl39V1W8l9fX2chucXFRZxun8ap1ilOcLKapgB64plfEmyhiTliC8l+7zHub9zH93c3GER5+OMmU72piZuCRy3OUxm1gHDO3+QcKYTrRG0002ymvAIw2hk4KQn5bwEAuuFKRZDeDOn8zNjrhenb9HkSl+ssdliZf231fbzdOY/z3RW0zr6FMxfOIWo0EDUUV/jpmcqAPNrneXk0uVdhwhifaQIAiEtFANoJAABO2DtVAACVfmn7XqZZVUKvp0Ifrf9o7xDjP//A4OkQg1/JTeQI++MxB6Osip5lmIlqDGzWVcjnuG6XSKzrBPXds7q9PUgLqqo7tikAv7JCWV5Yi530ENZi8ZmssKViBqEJrmjscWJ7V91eUAYLiCVJ7aSpBswpeZ/4WqiXxZGDiNlA9OwsdHCGWjfa88wUIAtCepD4IEx3g2/WPjGsFg0YZvYer+dDTf2qf5Jw615yKuro609ijP8LAOAm/G78p59UGcxKQTG1IfnKM/s1ZgtJincGg9+5ur+zM2Rm13g8xotnhwi9kMUmo6iu2zr8wFYoKTaS2M/MJsdHYhd3XGuhjNeOW86PKgAgnzOCZkJHFmatbsHMp4CD6S8sxx2eiZ+5J52Kd9Ru1XuA29e/xMvRALnVAZCcwLzKA+yFCdY/u4xLn15GOqPwUsVMYEryhGMPSjopZI4NAMBtrZPU9t9zUuTEqnoPZyWXBlsMOyZZhlDVDbOXEtqwFpRE/F7VFsDieW6hMCsSXJpLsnELnQJn7qmpMdnCoAHjtP2c0dsSBrVStmJvwSBrdSfJWllDTFgBovMlybqo6wtdXR4CQEqbifwO+S6K0emcjR1rjyqQm3s+3Pyv+pnJ5MgyCridwQAL8n2xKUxQAu87iabQ3pXvFcxqvxBVl3wmNraHxKYRAIVdGLgorWzuJMJ6MC3dbgHZXRdvStVf50507YgSvvw7voYdAI1ZEGa+ObkmUT7KjYwgoIAOzKY2ST/d+CmRbjabDGw851brcGoviqA8tQm5uSA9aO642GqKtK6QIu0tmicBhSR3lDkkAXDJMe115Yg8Wocg0zojFqn0em6ugb8AAAD//8RdS2/cVBT+7rXHM5MXebXNdKq0pIQSIiIemagbdvwZWPCbWLNmCaJVSbugqCBgUbWV2mpAQU2mpE2aeXh80TnnHvvaCSE8JCxViqKpJr6+ts/5zveIwweny2/IGC6V7ocdNP0GoAufjo8jbLrooZOiUv1N3eTgABtw+IxEk5kSI0BBA5rWMyU+yxggiPxCZZ4q06g3+AI579Ia1aKc+qByhUxRcW+KQY3twYFMwasREKi8PFhz5KMA84t8ysHTs9wYZZzf1HnsniYGBLQMznf1Zhaxdw61PvdTN3OOAPs3RNiwqzOqaLaKh4s6d4aHygY0pxMVxNjkgIrGtYRRHeL3EHlUkOM3xqL3VdoQIcYDl2Ic9TGasbj44So60w61rxI8vXsf5nepYEIVtQ0KebjKhK8U/AGJrQhepCZ3RPY3FheNGQ6HI1xYbmN2eRnJwnn0TcIRGZMN/3C1Di9fHuHG199g+u49zC3O4crVFay8scKUHyrA5EEX7slTL/1/ehz/Lil9JxqkOwRu3biJTz/5GFn6AjZL0aw16W2DGaISauOfZwqK2zu196kVml9VGxtSvLOgfRU/pUD4B3fGSfPpR+gh8HeOfNrpR/NjjgJNqdSCMxMYkYP8/Dmsr69ha6uDTmcLm533sbg4z2un26ye6d4vmlR6lL16nuIFxcY9eoDHD+9zJCABLOSV8OzZb6zdV8SfJAI2G3IihnUpYsr4HQ5YSqL0XYnkIve2lDuipq0hOxrg8Y87ePTTNr74/DNcW9/Ae5sdbHywhTZRukmOMNHEzCywdv0qXn/nMjY/uo6fv7+HW1/exA93vsXznV8xdgPUPGOBmxJ/Uf4aZCnWnSb+yjAaZRFSJPwvqieYPbeA1bffwtq7G1i99iazZi63l/DaxBTfHzLxqOxVLWB18u4kH5CYKPu7u/ju9m3c2d5m8Kr75Cn6rw64UQI7doikJIGYaSU2KZno6PS5tPX0+Z3v57Lm3HjvhPA//RsQqvhaG55u8HvlmlovP5CNatmOsIa4MY+l820252tfWcaF5UtoLV/in6dnZrj5a05Oyl6i6xI7RDWLlMAvTdmB+r4ZptX7gDkGP8a2cobkGWCigsryD+7bcsOm0389X+RTfmLfH1Gs5gGwt7uHvb0eur902QiNNPzsQD1wTC2VoigWoCYQ6bhYmn9hbpg8c8Kql0JUvs6lCaI5yfPi2AWSYjNwuq58AM74+9eoKR7VMQKeRyxfyXJDtMiOxUQmcximUojJ5J+daHhQEttEHKTJzDOTRo3G++Swvj8corezgycPH0itU4/ZB6m11ELrYgutpTYWFhc5jpAd6ptCh6ZGXYFQBqbz93R5wqvrdNK7y7myvt8YjYSqDEMCRPP/1PxXj5Okm3qETT4CVkc9iRiYGvVlykp1EFF1SW7U6+2j2+2i19vjFJgBybt8SsX05BTmpmYZMOe89jG8MWDK5qxSSw04UQPhQEnrE+Ohq0oDntcyZ6wtKIaTo5dpUOZp3TqIq+U057Mfsi60n8QF9PDgkJk5ZOhsslBk5wcEzp+SkyQwMsN0Xp7AjT/EIJEFa1SjcrS1vAis6uL5Zx8Xe6wGcPnwS6bGvpn7E8M/il0T2n6EmKbGo8JQz4yLz5404LMVX67C8V4c87ke982tDfuOQGNfZdSkqbIB4pyWL/4NNo8t173I/lVB7U3PC/l8MYVnmQiZ3mmjbY3X32el3P9Sw+cE9tQpvUouaI+MA9M6BSOOsZCDNVKHeNasEwU9lgQA+m6KpywDXp5R4iVTxvdo1PNQU8v9TFKcm/M+DiEIEHmZd+w9BqqHUfm4tUU6Wb/PTbkCBgW7JWx8PWO8Yn6pHg854Fthz/Bwm6Xt3mMhMJHU5VJwQxJDatx36jBbQRq95mruTma+7GlGrBim/wsAQutJ68TAXuW6MNDl/85aIqyFQtYtf4vGz+t5n/Rs1B5UhvA1NHwyxmiU4g8AAAD//7RdXW8UZRR+5p3Zz24qxdqvlWIKq/0iVCGCFwQvjBf+VL0y4dKgXkgRMMGSqoDxC9yGVrSy3dl2dz7MOec9M+9Od4teOElDCexk550z75zznOc8T+AWfIml6GhABrZzr3MMsUUe3REAcgDg7qtFeJgWrjMtSZTNaFCWRw8JLZRLKSyiudrdZjCgXMoAB2Mzz8RSUGijJlXeg15HKGzOjL2xQhV07nqtLnNWheLffYjcuQ5mLcSCYilFY1RQ6ufp2vSBU7VKXdPEopK6aahiZQaCqIYCI0I+i7l5jidqai1iXHFDdhWwd59pHL1QEisqcgg4KQIAfj6C4NrK5AEv3Q5BrKxip6WZiR1KrtycoXMc1BJEvpcyrZ78wTuDA0S1MuavnkdjtoFHi7N4dPM+uk9ewAwSFtSpZElFoVWe3RQ3mcXYDFYTRab3UAcnMHiteRb10zPAxCTSAfNDuRBjGk8yQOBVUfJr6IYdPPv9Lzxr38WDe9uceL2xtIS5uVlMTr2CSqXQVfsvQMAQWDF0J05gAYw/Ot0UExUPy2uruH79Gm5+dkMszCgxoAI/PWSogFWFfW+EOmySdfBFSyAXJ9PVzXvYbDoGt8n4sks/iVTtOaVJEdjJvx0yer/YQyKbhyarSLrKSDv19O9+ymhrq9XC+eV1XL72PjYuX8EiF1SGw4eKJd/61JfcL0TiiGHIzha//tzGTw8f4/sHW/jlx8d4+N029nbb6IddxHHPqsiLwCSJefF83UAcKQh0O+KsUvrxcAAS3xfEW689SGg+Padf7e91cOuLNu7f2cT0wlm0Nt7GpStXsbK+gvULq9IhfDXAxvQa3lxdwQcffoS7t27j048/wbd3NrH/fFd0GXRN02JUGefv5phF20E8QBkG1VoNtXIdqxffw8VL7+LCOxtYeuscZs40cXp2MgdOrGqEAnGHEXWhDa8DdybjlMFc2HinZLL95Cm+3ryNrW/u4avPv8T+3i6i+AhVSnaIEm9kPem8dUh3jT28fQ/9JBe3omJX5BAdUK7AqBkCD1NVrs6V14fBxZcfZsz/9ZzEXvcoYcvYMQRPIma++ToWmmfQai1jvrmIc0trmJ6Zw2xzAROnJuHXqwhqPov1UZCGRxEG5JkdKNjlSeefzktIPz3X7pWklr0xVFgc12vw0vH1vxmKmJPhkYy7Zdc27IpFH93nnfYenv62j86LPg46HausHFt1bB+Nah0p33fDxQvnCCxSJOK+UjxYmiknMEG2V1HBTsBaYIYTSNjECeN20zFdV6Pc+hEf4J3PxiSD/7HtUBktrgNZM7aoNVnSaJISBlQQWh97FhVMZCRNdIxiVIMqJ5P0nudigaxpK2Xb0SVxpj66+yH+aD/H9tYPqNcbvL8R04asRqdmaPyjgalTU9IRLAsIRyCRWkOm6fC7xnNA9ZMEblOrEs2ds9hkyW5mOJOmQ8w9PbQ4crtY/99RjM/i/IZb9INtvygHpY4arXm/F7PvPtH5aY5/Z2eHx4zohxgoJNqn1sy1ygRqFdqPpNNPNn40qkE5LuVnVHyo53++GCMaRJbRImNJ/25hitR4HV0oslp9WyhJQy0a2UXOT5Icy7Gp0NUiNyYB4N7f6P65i6PDEJVjErHCPPGVaUW6YKaEwyjAAY3ckvMGFTbpgJ+fIOBgQhSX+K0RkZhiILPT9Jz0eYzFGzp/YDxH1C3gHxF6TiQOCfxyvhWNCFPhnLIYnFxXnBV+jj6AfUb5O6FQ5+n+bfcaLnSNn9nT6UgC5cFH3R776dMR0igt29Tmp4ps4zG3/7YigTZvF3E9DD0nowQ6uenJ4wfaXRdLcHq3MgPazt+rOr5eJwv4ExuC2Nja+bb5emQpWZ4FQZXl69Zf/REq+7CsBvop2XEm1RVzY1LjjT5DtY2OKhRZFu6havoUu1rAa3zr99LuvzvuULIOEwQsi6Be3ozOQBHL5NJxDmYsmCB737n1pTrAcb5QcIzjse1uyPeawR225stn61md3zaFOP6sYxr9yWMY7GAn91HE+0S8ne6fT2tlx+GZ2TCI0GhQfSJMb96LnfhQC0EFPFQ0Ni/083EYeV5lX9bfuVRg8Eic9lgMkOo3es9FMf4BAAD//4RdW2/cRBT+bO96d7vZbJGSpmk2lwYqpREtUbkJIfHAA5cnxC/ggb/AP6p44QnxGiG1SFVERFMoqIWC1L60CQ+Qy15tr210zpkznvVug6UqaeKNx+MZz5zzXY735b2vcjHbk3qaXAPRdJKW4dOGqY5cs0T8fTzkz2mtSQ28lcZR8fyJl5guxkwbocmcjSfKYJSpXPoS0wft6u81i6KLqbbZPbSb6BqUMNASEm4mTukZmm3JnFIclIFV/Z0a8bkDRvtFtR8wWSNtK5cCchMmxslUB7tSukQqUeEHQ23VrBDdv+ohbXvVlI+ybbmUbrSU/NJRNW2lZ+Zmp/R61VrNJgj0HHdC6sCkdrGJRSB1MCnxoGYV8nwk8TEXXkA6GqNOaOlJgrPfD/H47gGeP3yC/rMBaokAKNQsSrKx/jGfHCO+s6h7JqOsDBBBioqFitY7KmkV1Ofx/iefYeuDD5HU5zhQoYU7CEJDeJdgiXVOebFJikeRLVeU+hlW1zu41LmMldUrXPqNPk4vQa6zb9zfuU9C42tBE2ucI6x7SONcFiFLmfcnExoe7MLn+aVkx0sO6haSVY/7GZfr2/3uW9zZ/R4PDx4gGw4R0ljNI4QkyxjHjGAxAJ0KQgg1z1Gt8AzTNxc9ncTbHCmLfi2tXXKvRagR+EXyhH5XJ4SPTUqKPrAsGeZveIx0Eh6MSshu5XHmcXBJ22W/UmMtdGejg+3Xr2P75hZuvHEDm9fWcWlhETXdgOXiLUfvzshQZukYncX45+8j/PlYkP1Hv/yMoxeHePrkL3RPjpHEI1MfXIJ2yhhLJSkJIXVhZ4RjhiRk1gbPZbhoUZ0sEIPFKBOTRbr3lCh/tKGsVrD56jXceuctfPTxp3j73fe4xFizFVKOgbO9/bMh9u/9iG9uf429O3eR9npIo574PEC7QBImuVny6BoxxKG2Nd9Au93C+kYH17dfw87OTey8eQsry1e5/n6lTp4HKZf41C6NaeEwZbTGPAdJ8ulxHJUlxeZrFCc4PTnF3t4eftrfx4P7B3j062/on57AI7YKBVB5gnajhnjYR4Mqi9D8T2LjvFBs69NSWJfC+9+0GdMgzbwzqiSLnLusE39GOEHDMmRaryzkgdl80b0GprpDNQgRpSxQxzirsGtGPZxH62IbnaurWF67wsmay2tr6Gys4eLSIl5ZWmQpQLPe5KDRNwZ9aWYSB650QGuUG7q00DrlfoJssocICfbVLG5KwK/BgGxO8kyCbA0SeQ2DIPD0Hsu5lKNn+4HmqNkvI4nE9TwaAb1ujEPS8L84xL/Hx+j3evyPr5XxH+LKGe6h6zDdh9T89w0TrjgpN4i75/rblBHT0kbSc1HeWWPhJSwju68oVwkoU9YdhG1i7OTF72fXvZdzpea4ID8esfUClQfkGCeClnFw4EgO7ObN7UPTznqzjgutBpaWl7GwtMDskeZ8E632HIKqB1P9UN45uUq3jdTCUIRdJ/npLYJ6AFRsAsD1AZpGCX1euzJNkpwb4GazTSacQLVMaVbjNJWYwvZ7Mbd5DqW0T/MwGCTo98hY8hT9fg+Dbg/dXo9ZKBTw0/+TUWRLSFKiscIoXJXXTN2o89g05pi0pqscVsame5OlN8hMt8/z13XVA7sI95SURTs2Vd2x0s4NQq5lHM9NwEjiQgEjyzo1ZbfzwRm6z/7A/R92cfT8qTFFi63+v0giesirObrtGra++Bze5gr69NMmVSkZ8JrR4Eo6AVPGW60m74fnWw2EHo0tus9U/q4nDrA07wMFG7JibmrwyIyLccR15Ok8Or+IDTI7P3n/nBaSHQ3+7B7EfI69hFIYRk+x70kNSFmWGJUZNS6ar/ENxUbK+lXEWz0WNEC08mYTzKrXBgxFfWyA1ZxBTIPupmLazXtec27qVB2zTF6DohdjZhLpF4k0bODP7BYENkj2HKRbDOATKykajgbiwJ9r1a3xBFUeJv5RppOi+Fqdx40zCCBUk0tOEDOzQeQyo0HEgTrFX+oDoONTwWS6rkuTV1Cz7CNH67cY1CdFkjKfRMWV5aCxF0kY6F3A72uN+ZyqEBFLQiQupmfLAb7x8VCZkSLrGsfSPYqviNDuVcruxpwcQ1N/1SSxoQkC10vBAscmtlUpELeUlJs3AAAgAElEQVTNgPSi8p5O8On3lHCm+U9tpmdF70GKV1mqAuA/0q6mt40qip43Y3tsx3ViIjchrZuShhbSLlhkwQKhih0bVCT+Az+Bn4TEhl23lRAIEIsQlKoBQU0TKU6aVjSJ40zi+UD3vntn3owdKYjsYo/Hfm9m3rv33HPPMV/+9FVa7vli9NrkSTZPbhxlyWHs0C5IKVcRpLRUqebeE7mgELq8CqdkVWw5t4tiEILFfRjUT0VVzUhZBX5Go1GUiyZPwYvxFDpUvZojWtrHUdYB0AVZ+//1PWsbktPijSgQlwEJl75Cn1e0ls7JSLJU/vnhleg6u8i+lyFrStVIBTSgsdGimiG+EjQYR4yPHlA9p/WBrzFaZbUbxkyRsqhfIg+2FbMgNImpLLXc3iOZQJeQXe+KIHI2CfYkoBmjEuQggAV16nYxoIf8LMa1cQDz+gyjvw+ws7GNg2d97D8/xEUIZgRQu5gnTE/62jzmssk+taJQDaymN3ysldncIW+UeKi3F/Hw0Re4vf4hwmqAC/b5kx4gosVq8EAqp7C9XwwCxBoAx1ZPwkRsKVifmcFsp42FpetYWLyObneeFzJ2niI7rcj2TaqQG10CZs8Yu0Hlc1gpkR0S2QAng71pf5QaE9WPRu+R73AYY+fP59jc2MAPT57gr61t7O28wMnwCEl6weh4RQJwqmQTZdWINV6SloPmYsXQm3gVWeAxEWZIzu8moEYCfj3WN1bQ0UvVzp2e56rdjAn0IttHTi6NrfTDR7szj9nOPO69v4b31h7g7tp9vLN6B8srPcx3yYffVvZ9sZar5VPKYzt8eYS9gwGebj1jcbk/ft/Gi34fu/0+wuExktEZmhT40boRh5ZNMXXencvjshquAAAgA7JyACD1rAGRFTZExnBIeWMwCFmIr4be8go++vghPnv0OT5YX0dtro2gWckqGIOdI3z79Td48vgxU+zD0xNOYCvVAMaroNpsMk2z1Z5DvdnC0nIPCwtdrL67gpu9RdxaXkKn07LuUIVeG80OEk7W4vMzDqjJ3/rlq0OMRucIGk0sLi5hbvYttNrXmGBD7IyzyH50NBxieHTMYom/bfyKrY1N/Pz9j9jf3cP56REC6mEn0ScK/mJrt2YdAfOadOTcbw7Beeocu1OfBelyH2vdWJOqaXoCyEABy5QgSmutYgMldkQ2VQtMGR+VOiVhN9G7cxe926u4d/8B3r6xhN7KLQStJoMB9VbA4MBYwESmOCLXRkhVNO4SwTZIRRySV1gAILdlTIylgsO4HB4PBcStAAAYC666bRuJO69iP+fYooanJHR3zm4ig8Eh9nb2WcSPEin2tI7z/SYV5XN3frUN0O4H0j7GDAC/8FRl455Y+v5bRbkMSE5UUp3E/f8AAJcdb0oUUmu1ZUWvqEpJfdYktqYJv8YwLlOrSCsursIX9JxQ7EOJUNXHzOwMmu0ZZgd0u112G6g3Asy2GqBLQd01iYjZGm4jAe9reaV4Ygazqpcm9cZz9+HJP3rfOhH5Mt8Z32DKwZefyL0eLgjk6Torv5XCSKpJUWD95vU/LNJHyf3pKMRg9wDDYcgWoWRld0G6Io5Pes23jkVussDJPwXaaiEt7+fxnVdoJyiO7SoAQOGA4pglXrQJwBUU/nV+JsQ6SkBZmdbtXHNKIrlogVR60yNGUUavBuj/8h36TzdxfPKG2WuMNjsAQN2vcfU+rCY4X+pg/tNPEN5YQOjXuL0w9cV6VcR1LEPFoEkil16MdiNAo0qMswqCOlH3KZmPBQCw7k1qhUivqZg36WjQjdzg5NE441UtopiTZuNYwbFiesFxgNjJYhcb23bSimdFG5MScFe+TzX/IZ0HaFEvSTO28Vg0vNyedfV7p8rxeBwV1opysq7Xillfju6XEd00FYBLoty6TZ0C3EIjyqwPp9AKjTfEDo7mhjsHjZf1+/tS/HVGLo5r9vORjCkvJKUZMzoSir8m+nRfK31eAZEUceH3KHCitucmzYEw42i3xSVhu3LrggrOu04CtM8w2zeKRGm/yvpZuvanoqcxlh56zrFE44H2Ns5LxYkjn43cyY7Z0tJKxrE+g5S2N9/Nmeh3cLs7gSPMiBGNCllT6Hu06KqBSlb8LgnM61zo/9q/b8dEY6B7zeasJNSsovv5mpDfG/o6nYfBqiTGvwAAAP//pF1LbxtVFP5mxrFjO7HTFJKQlhAIoVF5lC1ih+gKBGKBBCz6HyuxYMcCJBBIRW1DK0ulCbRxHk0TO4mf8dyLzjn3zNwZO1IL3uTljOdxH+d85zvfxwwA6ylM6hsThMGrsOuCFXloMY09UVsMkoc2lfSeWBahSCnrhaQCzslqscgAgMkI8CARXuDPsanAH1dvPYFBRjedvyEjh7HJ2G5AExs3KH0URo+h56Lor81pGegCr4IOkzQEEg9JJzSh58a+kSOTAQAUiFDGgSLvdAwV0PABABasca0ZvqepDoihew46qOQzhqyLwMeDSSgp4t8vE1KF/0RZPYtG54McHwCgnrdUlTTiXjDf+YGCTp1MZhCjMApQK1XZk96eDtDZb6H9zy5OmofoPDvG2XEL8dCwGA9t9J2znihfERpsQpT6AVrNI5TpfposrVzHX9dGqC2t4rPvbuHVa+/h1IRsyUYKp3TshBpsxTYvSITCwgw3jAIlTurZk1yFD2XCl6sV1OdquLK8jPn5OdTrddTq0yIgGLmKc8G5M3ghtiCqoccKMJnNOUGjL6gaEL5yLnssAyYU4KmYVvu4hebfO3jc+Aubdzbx4N4mdre2cbjXhDEUCHUQos/9rJEDV/wn+zKhtsmFpkmc4VKqKPDZGSniIWGHpHlMH6QxTP3R1O89VcDswhIuLy1g490NrK2/jfVr61hdW8XKG1c5uSDMMXYAEd2H6QjoWcnkumdAe/eI70Hj4X0GQhoPH2Cv+RS7T5+gffKcLSS5yshWYiM+oyJvcq7y4FlO5q/Xf70oAJBSyHOVs9Amdm0aXMdsqyiCZ7Fj+RDUE6HANOCbn3+Br769hfUP3kftlTpKZam+E411b2cfw07PUeojpobSYKxWZhMAoFwpYboYcpWQArTAibVxnOeaxGMrVd+jw0Pu0W/8uYn7d//A77/+hifbj9E9aoNOkoItS5Wz8gyu37iBL7/5Gh/d/BTzb17l9Z6uuwoBNyLu1YzR7Qyw1djGzz/+hB9uf4/GvbuIhj0UbB/liCyuADscZO7UubvXsQcCXDwmdTUIJbjl36QAIZIZF2b+S1+Rg6+s/18E2FqD2blLuPzaFSyurOMtAqI23sHK2iqWX19GtV7jqqwmWSPXhhHr3M/sEUjmR+bcdY29QIxWRRUJAIicboVNetS9yqotZPwwjccooN9Phen9tFaez4h9+EX48uTwHK2jFif8VN1/dvAcZ6cdXo/Zuqzf4wCd9uSiR9mE13OYCX48wa/UpQFOS8cDADQh9VhR/+X10gBA7mVzB/g/AIDGFvxs6flQFZC/dVW0pNVSKn5jSduEzzKBqx4F4lJAcQzZBNL+Sl71szOzqF2ax9LiIoNQC4uLDLZUK2Xem6hOYpyjiwLB2deLAwB8bwOpKmvRRv4wmb2BsbmXdwAKU8Ffq4BSgPO+uC0MBwan7S5Oj6VnX333CYwkBgqJiBLbsOAlSIWomAbT1D9NFbZwPIHI/xzlqNXJNSc/TgYALnp23hWPvV/ZnRQvhtHkfT/5VKdzMa7howfMJsaTzoeKJ8zEMQbdsxOMhj3+erD1CI/u/IKTgx0n5OkELx0AQMn5NDHqqBWxCFQ/vI6ZTz7G/kwFw1KZgfupSIA+Gd8xU+6pak9jfZpi8kGf9yiu/Acj1GozKJYClItTzt47ECcMcvOKKLkUtgAXUuw5AwCG22dELJZaAMJQ51naHqw6W5LManuYQUkLaEbmuoj1pVwwa/PKs7l12qSsZKu26ARSxGL9Rq0kKv6tRU/fTjBdTyasfZRbhan3vlaBKe4ZOXE8f33R+D8RtJxggZ4ZGo49q8KUBACwi1vBdxtLr5dbrl3VXfvaTWi8PSn7la8tTCv9lHCr+HiQtGqZ9L1eLsHscJpzNsw4qSG3VvvUdhEfTFvAlJ2s93yUq5QzGDCMx45nndaZPG8pSPtOC/7zIBZXhlLv3VsBa0QzQC1EuXDtxPuUBaAAgPT+S86pLAFi7eoaoH/j73NrljrR6X1SsIDaJ7VorTmdD5yopJI+Expb6kpgTIx/AQAA///MXUFvG0UU/na9trd20oSUJLRFSUpSCaqKgsSNA1IvqCdAqlTOSPw7OHBDnJDgAOqhSatCElIiJYIkpK4d27XXXu8sem/emx3biYSgB/YSRXF2vTuzM+9973vfxwwAS8soj/Ua6AVL4h1oqUM2rNLkUp6fE7zQGy18Ma3/6ST9gQXvBHWie3fVZQ/p0CSaKfCCmPtVeB9J91XuJxURIbaF+hBVDdJN+nJFPjZySBgNoAIamGAe+EdYKtT5CTxgcT8BSZRVQQCA3wJAKqNEY1HBvjQdjflaqsqjihoSDSr3Agd/8vFmIjQkshbqC2vCP8rCMNBJpgIcCkSAAZVQ+smmNw/3zIWVQVVK+r496sUhNC3L3LmtBoRxlSEW7zBh0VNFNm0DgxpRUzs9mJcJJzGU0BLgS1T6AXFtRf46TiM0fv0D33/1LdAdcLW3agml7qBL9xFhbvUmPvviS9TeWGVAQO1bqI9PE3AFAFwLQD69YcaXKjx27Do+0ufaRzIc8PgrskjVF1JwXlyax+LSa4hrNW4LKDECniOIQhHbKfqj/w0AAKn6BeLZakSkiOcZuSyQ3VYCDF8atI4bONo/wNPHW3i2/RS7O0+wu/cIvW6L9zV6clzBm+oDtsc/DcN1ho1vCKF7rtqgkTMFPbBVVHoHSmX2Ml9ZXcftd9/Dmzdu4ObtW0xrXVqy7RaU5AeRXVcCr0JJ40y2Yi8a1Md5gp3tHTz77Xfs/bKLxvFfnPxTD78Z9FiZP2dbroEVKOJgPGcWQl0oXg51v+AeXxUA4ATPvOBbR4B+Mh/FMZFUBM3+/vrV67j7yX18+uABNm69hdpsFUFFPNKDsEh/XYW4qHzDI5yoriVT3CMKBAYcUJMA1tbmE2w92sTDn37G8eEBeu0zFi+k/42DErtAhAKTBKUqEqLeUh93XMb6+3fw8ef3cffePayvrKFWgrNSNMrSSYF2y+Bwbx8Pf/wB333zNbYfb8IkHZTNEFGQsoiltv0MjZWkzDBeqT7vkKYTmScKAGAMAMi8JMQ48jzGml1ISXdmfgHzC1ew8c7buL62xpR+0hRZXNnA/PIyKjFA7pGD1M5PExQuIdpCNDk/HLhElYcLAIBJUSkfAKC5FYnW4xgAIDRavgf2lJTrTS7fAhhSUSwZ2v7ok9MmGi/anPA3m2foNbscJNG+b4O4agESRxGPTUUSeg24QqVon2NzpvsS0y/L02B58Xvo2mz+y/F/BgCUcVaMfQHiGy94D6aqzXCftzGYja+o3ZIr2ErxzNhbAuW4yuwcaucjMLV+eRZXFpdxea6Gq9cWuPp63l5XXCN31fzJQsAkRd+2bITwraMvBACEgecP8uQ3IGY4BdGDwZALJe1mi6v7tD51zro4OjzFKLHCyUk6lAKQFQ+jxD/iqm6psEU0RfDO62rFtp/gApq9JlEljyUw9plXDADAC/TPS/59JiaEacktQXkoLU55wWbKC0DQkYB8MI5ZTOA2rLTfQ7/TwdnzEzROj/DnwT7az0+QdVowaWLt2rKU11HHAJAKPQEA3bkY1z76ENEHd3BE1eT4EvJyBUE2tJbhFlHnJH00TFCfmbFFPD6Vtclkx6nIMhCoMkyoD7U00GOvVEO29KWfs/UYM7NVBq4jAgMoiY0Cfg+oRcG2QRg+LzF8WeBTKrPUrmm/v5F2p4DfURpmg9yp9avGghN3DW3hasp6Og+nqP8q9KftPpCch3Ik+x7ZYmW9XnMigSoC6LNLKP433tzTdmuIJR84fo+8NcmCbxrjK+vAZwCo1Z+20KTqYU+MS2YAWNZEyXnrZ7z/ae5DcaVl+hq2cySGr59vqPYXpOiYisK/AgCQnIpahC3TOxUXuMxR7wMWhZVkeFQUn+kcFG87FrYHyFFORMwKOo+f8DsrPdUDEIYCXZOt+0w4VqD0K/lchI6t+wr9P30nbRHia9LfRQRex1SfAX2G1j8SDlVGO+cN4pimY+znvvSOsGOEtMrz3s8pWGHvp2M9uRYpq4DzYm/dcI5D3vqh4JN9RrYAzPcoDHNt4Q+CAH8DAAD//4RdW28bRRT+dtfrS1LlgpXShDpVlcZJi4RAiDck/gAPFCHekHjiJ/Bj+AU88gLirQ8IEZBAoChKaESISltaY5zEiRPfdgedM+fMzq4d7ChKZFvr2fXszLl8l+CzHz43FiJiFZgddEK6wqFA+OjEVKDCt92wnp8WFeC6yh4HpBpbD0Pl1bNapslgDNVK7PgIFpY+yiomLPY3nLCpszD7UMSGso6+FgP0f1ZshUC7yIqnFDsfX70oWnBwqv0yORyU0ePbmIKQnsLW1DdYx6HP8w1vMlHCjK8kCpPOriKa2Gi145+mGT1CURnK4UmFlM4q/nStqOPv+fjS4qMe8CV3vqGDGYWeOJMqmJoplkl609rX8hOOq+xihWi9ML3zCKyvsz4iRrwYVOg7GSbciSVgNHEj43IVyZhuFpprVuCodlVCe+cY337xJUbPu1gIAxSRcESx6CYGr735Dt7/5FPEy7cwMCWBfBnX6deE/6rX40U1HWWdAyfayAu0RUtAvn+q8rL/qcDWrcij4cCOFrckveQAa7lOlk5LqN+s48biDSwsLfJmRusT3S4s3BQJ4CBIc9xWEpmKpmGTgYwB7dFV/DdpzBXK9aV9lWKeq4uEhboODvext/srfvlpB8+O/sTx/h5X5Cn15N58YAOpNDWuou6XkMIwE9lhH27PWoQ2/lFqlVDp+hDQh1LHWjzPkP7VxjpWN+9gY7uJZnPLeuE3Glw8oWSWs7OSRIWBdIHEBowgn4TmbD17jk67xYJ9T47+YO5++2ULT4+PcHbSwXDUZ6itBuJpOna9YbvlT1dJvgbQOfG6P5enPf5P5Imu42JMiJkBQ9s1oSVERIIKUx7GKHFRjQKm5aUlrDVuY7O5wdepce8ebt+/zxoI9ZUFGLHMI8V4y+0yKMMm6Aw1Zo6+8LlT66He+fsf9E4vcHj4Ox4/PsD+wR52d3/Dk7+OcXF+gfE45WsXpsYeh0eXMu0mzJge1o6MnRwiDqvoZxSE6McxXr17Fw8//ggffPgQjTvrnJCUxdaPEBzUaSY9tf7ZJU5etPDz9zv4+qtv8ON3jzDstzBPtxtHaIkrhCWBDWrHhS+iVNgYqWBQIdQEzUWToOK3OUVUjyA6iRQFmVBUrqC+soqba2tobDVZoX9jewv1lVewtt5AdaFmLRq5ahNlgpnSXU9ljvoWZxO3rw7hGo9uf72fNocYsRF4vG7h/FMybueRpZQEPJeE4sMUNODqEjg/H6J70kWHEv52hy0sCdpP1mbGZBWLkvKcQ4GgmgzlxrSswp2gxezcfnVtDjRFYb5YCJmVP814FD97Yu8yk6/l9q9rBuAKACYqPJ/vaGkh1U/+XbcpTeX7U5SRKkvnu1358WphICv227GMJXCV9wV2M2FkEwmpyfynDac8X2P62oM3Xsfbbz3gfUjHNllw0s5YOMH7L3bh/IKAz2Muak/o8bTXSodN5Jfmcr8/YLg+dRgpyT89PUG7/S93+Gl/5mSfVLVpbwrKJJtoj5uLu+S3cH+ZQgc3jMMcp3fmfGQhSBuzMKV0JsR/VhFgth6Aj5BlJEauABBwl7gkKI5kMOR7NmJtjUwMVItVFF9SbMdK6YMehr0OemdtdFovcXl2ivaLp7jqdTHsd3nNijkKg2tOFAsAHDORNtX2JtbeexfdW8voVKoYlKrsQBIQLzEYy7yS5oZXOGMBxSB0Zh6B13W3AtfyucyrtgUmQqRxYSBIUCsDtUrEQmm1OWoiUMOMxNz6qBElJojZbyWMrFYDFRrUBlmt41ggOTRurTFCdbMxtZ1blLxrUuzPbd6WZE5QPE05BeVKFCtrEc+32XPzSBqPCg+3tFhrXxwzJTewgnYVu77E8l4/GeaOehjlbEyLPvg+7x+e9ooK/w1Gw9y4rNe/talU94OxNP+YGiOe+/wcfVbBGlA/F1K4iMp5G3Q6J/9RqcauK10SlI0TbaTjyXrmK9j7xVofnawoi7HA3LUoYFE1I4eqdnaLYqHtd9j1WuuYiZJKSb+ivynnpEIJUSa4IS0DpHPr9Xr8Vy0RVQNM90tFyee8+qUows1qQm+JSKLqBlCRnAtJkh/TsayWgO3WM3rcsy7k6y7C8pbKkPf9tyiozEaRCgBz83P8vTD9gYUIpfiSpPgPAAD//8RdWW8bZRQ9s3nsrN2iEBM1TWgbRCtoqkiIB5AQiuARfhi888RbJSSEhMQDPwLx1EIjEkIa0kASB8e1M/Z4FnS38Xhp+oJgpKpKMrJnvuV+dzn3HL/cTyIVeHfokLBDgSdN+3Ncrc7T/9xznqbForUH5YPBUQ3Isra/LVjT/tTP5N8liZLTBTohxgI5kKljtnw/GATansD7pdLuFwcZQ/qpsp7lBQsjGUWbGAvkbSBtg5veJrQa34miAnHARsNzxg5te5+C3Iwhf9IjF2im0KD5NnY0sd6IM2t6mV4pY20IBUkISE8lPSNJc5AsB2lMF7qRmkBxHBSLyclHnDViZCUyIk7epMxQbhvTkiyZzqc5DDJe4/AXKBmNtU3Y5ipf7HTbIUWESC7QjmNMTQdoUesFGZCEsoYeHxZWGGG4VugjmnYQV9wxDztzSsRMwpXDB5JnEcvw3QO5MobrizQHZRkynQfexAFBgaSyJhUqB1GvX6wzjzLeXJ5OWeKL5PjSjOA+Pa5U0L/M2cbslRnUX1/CwuINXLk+j9pUlXviChK5kZ4tTiBlA4Kl8SvjebQApPxeuWWTKTjMxWB2cx+Vax4Wppcwt7KEjfffwyeffYrjgwPsPH6MJz/9KOz3u78h7sXIUnMkHFRdr6CQcyBrruLJfDN0OJWKFGlcd9KM+0+p0WThtSWsrd7GvfsPsHZnHbdWVrG8uoLZxRuYuTona8M3rQGt8Oq0Wuth1O7i5KTB1Z+fnzzF7s4Ojv44xMH+Mxzt76PTbiFqNhn1QF5lP48GJICwFodsaHwmj+Z/d9F68p0az2ucy6j2SHvfDeFXanhjZRVvP3gHm5sPcXf9NtZW15h3Iqh4IH61OJBxctk+OMxC7xsKhmxcliNqtXHw1xFOGycsZ3X853Nsb/+C/Z3f8ezXPTQb52i1mmrjE9Zbr1VD+OQMpKIX73JoLMRMjiYVbCvZahDHTf7G99O+jxM09vbw5Ref49tHj/Dhx1v4aGsLmxsPcW3hOvpdnzMhRGQZztawMncL9eWb2Hj3A/zw/Xf45uuvcLj7FDU6GJlpPR4EP/kwokF+Nzx7UxwkaDUn53oP+myVlAzR8eCGVSwu1Tkh9ea9+6jfXMHa3bewUK/jan0R1dlp4ULxxI5QcN0zezFm6w1eamtZ92XptuEk5QTYZKnCX7pFPp0SN8T2rkkxX+1apiihxIL9zGM4/4s2GDV1dtbE32fneH54zKznp6dniC56DJF29KyjZGnFV1k7V4NWtkkiEyqtQg5DbMUmjhDTQdqdHH6HfCz4nhRLe6NV4bFg6fIA6f+4Xl79v9xyZCOVmEI6qsBh2rteDt0tf4ZkRYXFmTvWEknCM3VNJiRh/V6Cdq+Ni37ErLpz+Tym5kPuuXa9YXjty67JEOXx5ywccyXAsnUvpLaesk6XKEUInRalDJWmquALIuk7b6GhJH20VsnvoACMHFJP/aOpQJjXPVfkfLm6Nmn8S5nzSYkoQZIO78F/+xpFSgyN1SvGviwz7WvbZ/nqm6oW+R8My0/4lUM6B9w++y+9KGJ/kPxbGlMa60ajgU67gfOTQyTdDuJuB0kvYgviqbqLncTSDDb+nLTG8rCCi7CC5TvriGZm0COiXiVMZBSUJe/NXo7Mg6ccU3GqaBZHUUtsQZLCF8q0CMbSgaXGrja1IDkxvOYFt7ME1D5QCxBUHMyGLrouUGPIesBqZEna5TYC2jNJ5rLihqNIGpGIdQsEgsUWBkuXanhF5POSRPv8tehZIJBdZeeXn7kIqX3yfimIN6SBEXhbmwBJjooygCOJJtcZKrr1lZXf02JcEFZ539D3B1qYZeTPpBjELaEVVJ9fCGXLMP9KEWALX0KmHAtSPOl2E/b5BCUghMWjCGR7N640p4P1m01QWck1Xsy1yBrS95cKvoQ+Q2FPBq0RHFOmg4QIzQsndEoE81bN5oSMFnnjKB5DahfPYu8dyz0VRjAIetuQHaZwRp/PBWhCSvueStIP1NEsmJcWFh+xJhSs2GzPIAXtAQmfvJP8ne4tB/8isyykgQWqguK0kjSyvYfJZJoKgH13udXM7BJJfNJ3U/BvY0zP30/6+AcAAP//zF1baxxlGH6+2ZnZQxMNIZtDTZO0ObRGGpsgiiJ44S8QvFDwzv/kZQVBEO/0xltRKCiKF6mCTSO12DWJyTaHTTa7szMj72lmdpPGIAgO5CIhsDvffDPzvs/7HHwoepQ1n34po98PavNTjbATw7xS1iTZzWAUGSg9DZaLXaQsXIAqC3W8yg88unGYpu67bPNnFDVvUHfoCguSZM29OLqKMZ/dmOK6L00zXVwCE8xwg6NgalXRwThB6C7KjrLPQ+GleZmDFp4+t5h5bet/mYPp9VlOZaK6pAjdk3bBhIlu4JTpUcXDEg3ya/Dsz0w1ytClae48GqfZ/uCmmR7YusEHiyYqKoPYSZybJ6gySQaCahmt9rF4PRAtRi23e5qp7DT5oZLeCJ4AACAASURBVOcCxNUS4rIvFNg4zUunVMqoIJUynIpkzsT2tHXJJmdx9v901GoV1g4293bRO+1wxjk9QIJKFUHoo6svNadtcEozbcdES1Gye9r+hFToU+NURsAShg6iTsQFb3PrCI1H22wqNjoxgtH6KGbnZjA5WWcn9nKZDHF0v6j5lu0zW8J8OyVZq1FKz06MEmcIr0xl+f7ge8Bj/ww/TOECh+mFacwtzOC1N9/A3s477IT/y0/r+PHb77C5fh8Pfv2ZmxkGIngCLJ7yFYpmo3UnWQMhvp5MmBbnFzD34jIW76xhbnEeS0tL7I0wPDyESkVicXpM7wphQyJPXfBZv98RZ/vfNjewt93A482HDFA83tjA7pMGdhp/sMyEtMgSqyQ0wpJeFdILVniP9nh5Bp/59is3TwYWpVKEm696cfLxXxy8gs5HJyXmEk1MKnDVYdQnx7G8dhsv3b6FldUV3FpawMT4GK5UpZ61S0+SiFC15a6XMl3WlUI+l639Qzz5/RHW732PH765h82HD7D9Z4PlHt3TE5YO8aQokfu3bC9Y37HXhiPUTQ28OPoxa2nFF2FwRYw8L3kIDom2pFUuOtpIjjvY2Wzi04/u46vPPsGdtVW8+977ePWtt1GfmkZEjXoozTJFmM2+fBUfXP8Qy6+v4fO7H+PrL75Er91ChTkNXdWinsHK+utpjfxjAI2/YcgWmH5Yw9VrM5i+MY/51RVMXZ/B4s2bGJuqY6Q+iqBW5vx5AzyhrCpiQxBjyRkPoVjJqis/F+PaHDHjxpNnTdb8Dmh1zanfhEvGcOCnqctfL/Y6o/edKwAMp2wEJ5N9qtcODyI8be5ja+svHOwRpZeczttcJNJ3Oj45YRosgXRkHljheNlSxh4TLwopMvi786TNFjWFqMI8mQx7+fshB3xj9QA5S/8/74jTfmp4aWCiDu882vj/+xh8BqcDUb2wukbPx2myRA6nFc+xv7jLpSQlZa3J9aJJDrGrEkeJFDHL/ZgSr1P8KyPPY2J8FhPX6ph8oY6RseeYkUY9+rNkJnbNL3tkoIaXmwx6atJHezPRxBLS6LdaRxyhdrS9ywwkMukTEKDNMjzJoRbpKdddfohSuZ+lyJypoJRn68O7sEayKNm+7cUaZQUILxFbKE1hQS/8L3biZes4+98iM6MvxqsHDNWGpIaLKa2IBHWniI5bODh8iqhNpqs7aB3sY6/ZVEDlMGMA9KJTVDynTjyO6fSeatGSgcLWnQPFRTSsCRymXlmFd2MOTWJDVnyOnKN3hGcMq9ySOYdHndXFCgg5T6uYgvus83MKuxoL2feKU6GLeL4wk7s9MS9xHYfmQcImdS5uoUZDC58c5D0GBwj0IkYm+xAkMYZrcZYiwAkqzDLQGpmGdIlEjqb6N0tAYyZF1EU5zLPzuedRSneigzpmTCtlnBpik8awT4aZlyf50IxkrnEi68KAAdW7OlF2hf1psqBWq8UNKTvp/wOAZTIDaE8nU/X+noslI2pmSGtvgEBPI+yYdVAwdSfjWSmu7CffJbZe+d4VXXt/NKXU8gZcmMSc9xd9ntOI8VQ8moppCdAkBGbdqkk9rYUBHZ420JGLBLBRJkaxPwz9MrM2qF+yAapYf+WyDmMlEPBD60FrzrIMlnoYK4TOTRjozKzWhl1SAWIGE1jSoVGONGix+5vXWOXDAkAJ64evl/Y6nBbAN0rOouI9VfTc0e/C52DPD5KNDgAAxR+640xWbsAWvVvoOvmBj79Ju5beNqowembGcZ0078Zpkr5p2lAoKqggqLJC/A42FX+oEvsu2VAJFghVRajskRCii7Qq0DRtHn2kSRzHsT0zF32vO3fGKRIim8R2NJ65c+fe7zvf+c7xNoCZekAyKqBJviE6iXrs2wG8An9etueIg8q1VbIz7dOIAluIWPtg+IbG5eTZkn/nlenTgj5vtPbKg2CWKqbuyJaEqksQBecTTlxUFuqBarz2S3jq9RHARdUWozi+jkNQRbdrMDaAPaROrQHD45eVMFNNuGNFHJVun4hvKQUBdK2h8iZNTG/lk1uPW+BFaXQXQi+V2o9g0bHXMlEzbwMoC17fU1u470lZG/xwsE5CeG/IBUEDbBITqUlATNfElGV62IeGcZhl3huUhTcSQVDH+iPYvL+Gu7e+QbzyApNBrGRJHVWAd/IIc9epBeAmjk0toMfcYUPgRdjGnABoPSORvJ9//AGvNjcwOzGGmZkZnD5zAZPNOTTnz7BykkvqTCdklyv2WnVceakPjUhQxwu79PIQy4O+g2lFuVgBEhjQ6bZxmB9iv73Hz9bU9ATOnz+L+YWTWFiYY3pUo1FjZDupIWAIVFsAZAPnTbVEB6LmeAM4ajr24nrAyHNMG2gsKVuUcAXQaXM1LSEZgZbtPp7/tYqVB7/j8coDPPzjN2w+e4KNtSdcbaW+QOoDmzt9GmfeuYiPP/sUFy5dxuKVKxhvNjE0eQJRvSapIffnScBR480dssBnYifW3j/A2vo6VlefYuURJawbePzoITbXn2J7a5P799PWHiLqvXJQjQnxgScwgyq7Q4nYTTo/wwY1qF3w2lUAgEhbQgrNhaNbBKo/bw8bBRCC9ZhH8l6uwWhMbIxj4zh1bglnF9/HJ8vLWLr2HpauLmJ4soHxcanysuK7K3QPbElJxYUfEUnLpzEzUnYP9nH3l5/w/bd38Ou9++i39uFwiFEyl3c97t1n6zlaC8k1gTx9nfk5x0GQa4G18+Gbq4S8vrLjClE+p7Myewvfoi8TF8cnpnDj8y/w5c2v8NGH1zHdnAEVvGi+kzo5EXs6PWD3xS7u3fkOt7++hY2//2RtgCTKVJpPeqkdW54KgEDzPNdxJlbKielZXLh4iSv77169hvlT5/j1iYUFNGamEQ/LM9yhfSUWWoHlodyj6pXtw+DGxkav31e48tLVelrpWwCAUvBlx1KmjgsSfy8WaKrnqST+6xs7eLX9Bs+fb+ANJfw7bU6c2O+861BLwWusuJCIxgODYlHKzAjS/DhWkyocO/Y0Ch9zOndhuxnqqL2zlrSrzSyMch78+H2wEpMOtDNUGAAJKpT6KsX6PwIA/6sFwA0mlAPVf1e0AB71HbEWHEIAwAUnJXuOrMcGX4eV9QFAN9AyYnZkP0Wvm6LT66KT9ni/GZ4YxcTUFI6PHsfS4mXMzjcxe3IaI2MN1AlErFNAqeJ+eVyy1UUJACjfm4J2a6xQ6cmq5h0sJsmiqhEOWj30Dnpo7bcYsN3aesl+6ZyItjvo7rSYZcRxDpxWYmsao8Tezlgckix+1PONI/TZVSYvaUCVzmUgJypfK9uNarHEWI9Hj0UxBiGl9sj2FvORD/HBSEoG/5r8HzG3aSpw0hg5TlppzWNQBGIlSZo//W5HaPvdNl6/eIaD3W28eb2F9u429rZfwmV9cS5x5bTezsTL3umHubalChgu67nXrqF4nmK0yGG/nmD0gys4tXwDrekmtgmdHqtLocXpHofCariq1I/A+YsBLR87R5X/V80fEw5VmnmW91lEvBx7F1XfPiXfeapK7RTjOp73ppNCYzpSj5gZQLEW/SbggJJpek0MNtaV0hyGPnMu8+LPnHDlzivle5v0Xk+SyUQ0lZIkFNXLRYvHtw5HDLqE+ZNcrwILkQA+otOV+FbcXIW0nbc4lCp4mBBm2ndu2gAIKPOleRiHgpfF+3SsVLXGYJXlPPMsXs6BVFCvsP4LqOjEmvBWwcVzUGYcF2KIqfWmh/Z9LnjWjJVtzg7eUq/ODBcDDlL10bexpPfN2YwARnEGELCme9DTyrqyWDUfpfvJLmv1hs9LpcgsbA3uk08EPDdnANYVoNYkLi5LAZzyIWsZEmE96bm3v20s2BEuaJW2IjPlQ3R+rPWh95qvX4Gmqhhg+J7k57Ju2lgVbcpiS0/PnV2PAFAUI4jga5ql+AcAAP//lF1LbxtVFP7Gj4kdu0mamCROQgqlUVWglEaw4F+wqtiyQmILQqzpkh1LhNghwRJYgFDXrIoQUoWqiooQEvJQXk1Se2zPA53XnTuTlAhvkjhxxp65M3POd75H8N7PHxdSAGxjYZiTLyWyxEPCvBiIsibFFoav2zDkwjZeURqFGYfYjhXzvUpBE0XTCTPXOy++j5E4kxMYYEEmgyMzS6s7jb6jtOsOpBOX4DjTqNjJ45smwKNpVSt5MZDogrX8WP/hEGxP08rfq9EOU0xGkm5ASGeZoue7UBqf1Cj5/iJgx00FS0zmYAib6WHsYmAmjzYJMhbCIJGv/nP+yUzMAt8Uw2KsSHsjphRVRS8FmeKmWXMv+WJWCxksGMYDfo7WFRWioZ4M44QqE203iZ3pYi0M2cF/vBfi9P4efvrsG/R+WcMkH47izZc+N5n+dW/extvvvg9MP8eUdPbJSsT1PQcAKnxD/evR7/j2qy9xur+JkC1uUtQbbTTa07j+8irmlq5gYflFNCc7qE1eRn8kwEa9Wke7NcGUS1eMqCEXn4gso0jc+xMTqJgnHlHUY706MQXoZVOXJ9DtzmJ+cR7Ly0totOpsfEMNWKtFecVxARhj4DJL8+LRIey6VhxZWm5a7nmvAHfJB3Z8NcZPnpe2jrLxD/f38c/WJg739hENeujMdLC4uITpTgezc7MO5RePB5nJp2pWVquaazEw7CXYWd/A2h+P8eC3B3j88BG2/97E7s4mtrfWkdCkYtTXvadpDdqAmPY48Qt4LjRw5mEzNaf8D7wP6J9X/zWYyWxCW2ogeD6eKfYtYy9JQUnRS6nIoPi9MXZUiNiTI8Qoo7iuKVxduYbXb7+Km7dew+rqm6zrv0TJESE4zlBVkzALUCI7UGyn5ArXxOBR9fw0yaHs/Yj+qFrH7tER7v34A77+/As8vP8rhvExLgU1TNS440eTVfwJYlqfVWnU6Wyghlku09bg5pObVOf6/j70i1w/RcKx173GVwAB9eIPBBAZZkM0Wy3cufMOPvjwIyxceQFhI+SJIVWmLAvJhMa+8ecaPv3kLu599z1q8RDjVFzEEWs8KUGCU22bbczMLWDl+g0srlzFS7deYQYKUfwpmYOiD02yQ2uHTkdHVUXqNey5zCBThlOFgSZdK9aY66ctNwoWy/Wsgj8orT2m1Ov3ZshGfzFSZ37CDkm7/+TJCXZ3drG+vsEa/uikrw7Y4rMTj0xfaBNiv4ktFeBBWrJMTQs5w/mb9Yu4ovY8TxuQgr/82qQ0wS6bHZabnv9Pw75AQ33Rv/O279Mj4Y6db6h01igwNxEsNndnGncG631YUl+f6tUtkUbJcrFleha7yWI/EiYXrZOnTyOueQj6C+o1TqDpzM+g2+1g4fl5bvZnuzN8D9UUxuJWfTZZWgIvKhXv55T9cOi+bnHFtL+IoUZHNeqLfjvT1AhSGlIhTjT+g4N9nuz3D0/ROyZg6oTrJ9LJWrFNju0ubreSObDnPN+FMqDkfq4EhWNcrpUuOv7cUnuyhaTEAMhKAFUZADDgK/V+D/WVOgt+aWJDZnWX5LlbLjdLL3UCyI0UpdqETZFhZUNU0hHi6ATxsId+7xgHu1uITo9wsLfNsjii+1PcbzyIXIStyJ/OB6ee/fDWpw4ZqE2lBnVAPmCVBGmjhvaNa5h66w2MZjvok0M81dJhVWRSz9jvxe2napaaXz8FhDGwrOhJEajZMXQCb4CZ32MEqYDXNplloGRAzvmhGuelhetfyIBoorR5qam44Q1StMMQLQI5GjTgArMHWq0xJOlAAFSSFria3wzY4EzWiCUZxCknGhBARyadNAnO9w1d88f0Gp0nJTi/hKL6q+AvZg+qA4TBnLiUMwMcREOfN40Gtli6GPc4qtG3de0aUq/HKMfY8bWJ/0dugIdqDizUdDJP27KG1h/6+g+5Z6hPWpqqkZ75zgR8flrvYs259ZLkv2WybXjggm2H+wovl5+uTdVq6IA+9lVQkMCGwoNo5D6THU+fCSBsavF6kPUmkYkGQMp7E9CHtuOz002KbX5rzLbWFBfb9z4Awb4CUQ/jzXGXjuf3y3yctFYwXwPqxQyAYjNCYlFTEpvnzSdmg0PUa2SkSUwUkbk4c31lqPT7PfwLAAD//6xd2W4bVRj+zownjt01cVaCkpamaVqRNi1EwA2vUYmXgRuEhNSnqFBAohfc8ABcVIDEBYlQWxCiIQ1kqdM0kR0vs6B/mzmxHaiAkbLaicczZ86c7/+/pZSDdDpJevUxWIxFC2G59qZtoJ8tboErjpnLQX3qGeUBJ2MTbGJgJ37SXWsVhC6MPP8+y3BMOiWirupB7KixnWlskqTo2NkAMuBvg9o50dfwSWf6iC5mEqVbKWJgTYT+L4vmg9JBYY6Yp7g12+v72hXkxYFC10KDx4obUCMa1pN42q8+RoPuh9MYIKgZm1MPBDOGoK/VsqwAqPIlJ/ckq6AoxKQ59cQ/n2y/f8pm1TDL/OeKYBQquPfiQXomLY4QIe0WddKd2p+5NKe/EJCGxo7w2IPoXp12+ZxqH4WmGiKiKvAA8iR0gqHfd1tt/rDyReb8yTXoB77kbo0Oyhba1zrCcdzGt998jcrZUXaqn3njGiYvL3AhgIC/oyzcw0MGUbQwoMk1IRdcrpqHCoqtQCFQkvTHQUAVy2GUSd9FwCSNWV7y26+72Ph9B+trP2PytTHOaaeP1nEoBoKRjWeFaZn0aANX0NihlXyf1O63bIruT391no5RtwcVVybHMDxRw9TiVblWcmwhY6kVeqpsus67Ylhm9u808o8OWvjpxzX88PAh1r77nqMJt55uIiXtFVn5MyujixJSDNMy928XcZ42NRtEWC26F0ab9t/SaaDff83e5/i7EzqpohKYZUZOFqBFEzsTC8toMfAHRkdGMDc7h5t33sL1pVt4c3kZM3MzqE2MoFqlLoPse5QT7eXTEem2d/fw6NFj/PLkCTaebvDrzs/P4+btZVxZXERttIaUPAEyh8qZIT5vU8MjuPvBXbz/9gq++vwLPFhdxf6zLUmeoA6bk5sSufhTASEQKpQUqVzCpmLFESuuDiP6+VuGQtfbe5wKnJvm6QWZjTvK/SfiQrOBLz+7j8fr6/jo40+w8s57nKvPfxVrXFclxKUbV/DhvU9x+90VPLi/isbuDqYvXsD0+BgWbixh9ipFRC5g/PVZjE1MwVXLCC+GaHlS23bqdXGdaGkGabdPxmplhSFF33bKACpa/v0PpUKbpH2gOSLk+4QcYzFoBOJOzB3+Fy9a+HOnjmebfzD4397eZXBAYIGeHyUBg7OIFlmpUPONil3cN/LSgvcGe99zKv33qOi+yNOyEyM+B2l9hE+5TnpBj5+A8G+2fwIs/5dsezD49x4fAP5fbfPnVafjMC0KD4Eyz4RWoZRbsNykw+ayGd/XW7H5JyUoVSLMzV3C1Mw05hev4XztAmpjQ8wSI0sgifPM2F0zUfEOfGCdGbDLdE3nFYGDYr0khQkakCEXzCJiEDkx7ex2M07Q2a830ThqY2+/zl39ev05d9WIzk+Z+1GcIXIiDaNxORREudme+GPoglap1/3npQeA9379j+ffP+ev4oXQ9/f8uWeuAIr7PJAnPiBwGqOm4JZ8n6hjWC5zoaVMa6A0UVo0FYFDdBv7vBBvNw7RPT7C8+1NvNzfQ31nC+3mEVrNA2bWxWlX3Vdkj4zH40fh4cSZLvb29HudMekC1mgfJzEaYYbsXAWX79xCbek66uPn0ayQ7p/WZyL/MtPeDAOmzBMnLMgp4LbJWtnCXnvYF2nRNBR5qXW1BV9wqlRQFFeZ1RSnqJ49x+ORAGPv1tFCTOZEvEbr2GaHpMZncNxOcJC2UYlofCZ8bYWllwhLxNYNUR4q4XylylHlpWiYjQmdMheo+88AvN1AGFWQsPw2kmOZN+ogksXAhHaaDjTwwPWvo6H4Jz8GmgBgoJ3mjtDTgAe6viYcQ/IFkgoTgDaZhVM8Yo1TePOgFQiKfeeKM6/hY00ksGx7S43rS1zx4vzy+0sOZgMeq8YucCojDp3LzRQJD4TaHKXfmeu9v3FcMj3mgjw1zo4TewrE8t6kEFc8LpLUNI8IRD7nCy6yOTGOm3osbS71GBNJzMfUOemo01atVpj5xIbzJrPzKfkDzjHNERwRqAkNNK4NA1sqRW4q79H6xdi+rfIDaYgzjlaJA/0/K/CLtErGTTsRn4FAGQ70PWPQUgl/AQAA//+0XctvG0UY/83srN+xozhq82iqgqjEKyogjnBsoUdOVm/lL+CGxJUDEv8GJ6SKSw/lgsQVoYhKVFGLKCqHFoFJ0nXj2I69D/R938x6vHbSh+hcEq8T27vemfkev4dxib9LCrWa7eizAANDLySxd4m+u+GeNvKuPnM0ptUXOnHhfKV5wspKkZbjwRUsCgwhVR5TEmsJ3zJv0QTSVkxEhB4myMxUpEN7CaubBNSd5Yt1QqQx0433oHundTIchI8T5zgWsYnJmFEUp418g/KEFwdka8ZQlHChTQ0JPDh+ivPKTOz3pjzukpssXK2yto5uYvsjLQhOaOq8jSdSQbKLB910rsooFIFp4YQU4WlykEDhmPzp6BgrxNPGKIgOZSkImVO0pk4VBxBkZzeCNnIe2oRIyG6j0WQ+GgXModfeYD6xtQAbHvUxHjxBjerGylpwKVWIz/VcR4ocCYi3P2EExBh1XUIyfIz7uz/j3u4OVlY3sbZ+AZvnX8PSyiqWVjZgKnVUl9owJDxpuVmKK6608Cb5ezG6OJO2OEO+dMgJAG3CVVUVm5GyxnBwiPu/P8SfDx5yJZq0Al59ZQvLy03UW1XejGqVCm/SlLhwUGeVu2chmsXuxqm3m/xHoSMyttVk7ew47XEVegGPfXG5zyUgpfMi1MJvd+/i5o0b+OHmLfzz4A9UjmPu5tKtS44gw3TA4j7gxNrYBPLZRLGweN+cGSZPQtO53Mx/qL2LowrP+iUT7iLzhk1BcgOTLMQ4BZZabayur+Ht97fx+vYbuPTuNtY31hiOW6vVoEOxaDReuEOjexAh+reLOzs7+PWnHdy7vcud7739Lkq2CydCQAFqjSbeuvQePulcw4dXrqDSbsFwMgj2zyqXFc5dPI/Pvvgclz++iu+++RY/3voeh92/EcVDVFihwiCkYAHCt05JwJIoKrYz+CxXfpGW1YKUU3ihViNAkiCioAAjlhsY487tX/Bp5xq+/OprXO10UGtWERCHzepgUPyzvnkGnevX8cHljxAfj9GohFhuNrDUaEFTd4DWHKq2Q+hZJP6a2bWSIZGwcL8cZvh0fYfn70p718NDQLhBb62DqYDfIKYOv1jsRr0eI2v+evQI+/sRjqIR4uOYu2K0Bmasmm1QNyXRiSGxI4b5CVj3JL/y+eH2Gnf+DsVm57HtyGQFPZ25PS4tcKoL90FSPDYHF3+RpPr/HS+a/HPc4H636hd6RofFwZ+THBLPha/MWZukHIMwssZeVgpCk1joZMSlHqmErWfPnqWi8wbObZ1Be7WFlXaT93Sq72tbPJS+iwicZYm0kDWmnzEpQsyd3az9TlznURHUOZW9pFEmZxyNeEg/Y+zt7bEav/juC+Ukivps0yfiWxMuLtLv9XIdKki4QOUgwk5V3cV1yuMeLxTpK1BC/EfTZOLlaLQsGjNwW6LQqALJzCt42hOQc+UiXwZTtnyuVNAftbDK8U9KnPzREVRyjMFhhOigi36/h8fRAY4Oe+xoM3zSw5gQFPydTqw2i8u3XYm/0Cw6ZRlg6qJDVGTIXV20Z4IK1hlJGWk2KBlUttax8c6baF7YwlGrgZjQKoz+tZSv4vyGdxkWjJPi6pPWrzidopGUse5NXp5BdEROYOh6JuKVPySEcqVsLbHn38ftB5w4KUmYqJqWxQqxDjBgNHPCOjvGZOzuROiDIB2hWdUoEaUuFPtBstY0oUDDa2V6vTIO+scIyw0WbeDCQCJrghQLYkYtSDKYWTvghZ0MHs9TTJX1SeeJO0PfTZBTJBj1bN0IprD+eAat7V8jlzMwotpSaGnPonlIqvi6pPImHjx+uvKc1Hz6gTQfPQQAJaGexpwTv2YklEVTB2ZW9tdHFPDr6BSJnqdu5YiIwKrbew3WzPtciU9pNlREcFaKrlAwpTcwWsSUWG+FjlerNREATMQ1gI5TUs7I5qC0sMBYLOrQ3wtyQNBB9LTLrXwRRaf07xpvNOgxadRR85DFCq31vGu4k36eQxK4hjrleFysCUT3wdn4cvIfBPgPAAD//7xdS4/bVBT+ru3YSZxJOo/OTOcB7ECiqBqVqQQs2NAda/gDLOA3IfgbXSBVlJYKFggVMZWgouog1HkoMxlCEidxbKNz7rk3N55HZ1jgTUaZKHbs6+t7vvM9AvdGNJ1364ToREYwfVkKTcMACISWTzvMrHZmmmFoBqMxeom8SOIPArsPclA331khmhEhqL42XaCFEeuJBbUxZgquBABC+QeM1iuzEYaEPhFoYOj+hv5viv88n8YGQvRK2sRBcjYlo78cAeg7JhRl8z+3e8/HKOiWReOkgNZ+BYWN2TAXmKghnqORMfqc3GYHZzMSgHGaWO0KF83iZlrOmTVMAJoAPMsACOClszNmmSJHx8l6EkadKpyH7wsLQUnmmEWpyFxEkCyNMCmuoNhkhY7dIxdM0tKE2gyQ6UkJfK+izc2Uj2oz5u55b5Si10+RBxGKah2pFzAlMjBdy9JEORkm/IDlTHGiwxghvaP3zO0E68HYcdHirErAiKJO7gRpPrY6bDrb/fYunrX38HznCSq1JlrX17C0uo7ltTdQb7ZY10+FWjzXYhAg9CPd/SdKNLs1B9q1mWtIn2mRTMmiaJ2AxlaKuDbPhoHUlSXjnr/+PMLBy2POxW1dazD1c/3GGlNH5+Ia69eiKOSnOpvh2Mvsann1bytOcSam40F/dvZ9S380k445fZnRyTmur0rruekrkgKsTX/0Kp+UWQAAIABJREFU+DEePHzEQECDs3dTbQRKKSGjPi9qmNrKEzLOvJZX2ax2sdxNsO+XPAGc0vVUj1RNCzmj5R/RcUJhfn4RK+uv4d077+PmrW1s3d7GysYKaq0IYQMI/en+Mun0a/8ChZPDQ/zx/Bl+/fkJfnj4PX5/uoO9Fy+gxhNEacE0wxY9ELMUIZndiLYw7Rzjl28fYOfHn/DmnS18/Okn+ODuh1hcXUIt1g/0Co2DUGHrvdu4+c4tfPbF57h/7x6+u/8Ndn97iu7+HgMAZkx4rLLJebGaFpfI2j+No1x6o3PRnwCxr60WJpig1+3iy6+/wvbdj7C5sMGFkZvVTpngUaOOhc111ueFgeIiuMfUOCUOzrQqnDA4ORwM0GzOcbeS5sMsczoYcp0vs1kjwVKusovAlxcJOKND7XvasG+YkLwlw8v9A5ycnDCtv3PS4b9pjuRnTVqg6odsgBZR/n5WoBHHrO8nEIAzoL3ZAulKYIWa5UzphfTsws99dWV7522n/lcuCE45MJfuS2cf/wV4uepWLv5PmcCV9bL27bPvilyVocJcMjEK7XRdGm8jAsGVBltYJpMBcb2GpcVljvdcWLuO1c0buDZfw1xTpF7ik8aq+UzBJHkFgZbkcQQyUVC9kFlvzlHPRAzCAW5tUUWMTfOYII+J3RRHB0doH7W56N/f28dwkDCDT0fpkut6jGa1wYvWWrVqaaS0+ZXI6no9odh6kstvsbGisOzS/3PTAMTFY+xV490wDI00bUrdlrWnfYwW2nOFWBnpGKOkz/4No16CYT/B3502up1D/NNpY9A7Rq97jEGvy3OikkZG4PTFA5EvlD1Z3LUhBJi68Pedwdoxv4IBbl9hoAqEy4tYfn0DS2+/hWhtFZNGDQkB+5GOVtJrYInpPeeUKnGGvGgeOfe+kvvQJmBZ0xXFYKUBAQwjmRuLzrngRqaT828242mmMG1shpUqhslIm+vVddpEQW7sZCFL681Cx+BxysrQ59hkLQHIsHfU5uKf1mJxndIqcizSGsBTaMR1ZulQNKKi+d0b63x6fsj5l1rnlM8b10Yc1Zdy8Wjo5ybujdznXekyrc25q2y03ulYF/Iic3a/X9PGp55u5u8inwLN9Mox2NKgrQRaVm2Z4U6Byzp0xz+M9lkLY8tYNkZ3nlwXTwyvCKwwzv8mRp4N+KhQnkzHDPu7Ufy5fAYiQ6fFltG5sz9QrtluubCr4NwvgTCkCdigxoxm6xg9/dTPTX9e+3qZ6HZd/OuakDaqZ8145QaEMBbcMcxMOjbdEBN9qa8JTKDvGoknG7Oms6Gl/zNYIQwPc618Ygyxl4SONuTjljKHfJ78XGv7uRFCzUY5HkP/J0Y7m1YWZJIZYJgM8S9hV9PbRhVFz4xnxp+JXSd1GtFKFSKLFtQiAf8ACQQCNiD1F7BCQvwAfghrFuyJBAsWhUWyKAhooyJRqdBKhoDTBjuOHcf2zKB7371v3ozjZKRIkeJYM2/ex73nnnuO98m9z1NdJLpwuRc8NC8eQltn+zRJjl0AQAcucdAgHUAWlJD+caWF0WRVujon4CUHpStS4fkUzJQV2ZUg0R6JvAjEXNgFc6FCQJLxPMCRn7Ceg7C4gYv7GRoXpeHQ5xuNhjkcBU0pAgBK51DbDwir4VQWqo6VCotEhFxKJZ4Wli4AptMR62F6YkUsXB0Ai4zJ/et7oN58erHs/SiCGDlUWxZmnQPNKW+wrv6DjlfRBlB7aBhl1eoReZpKAKDPnjLwY9Q0abGNj4fy3gND5682WFWe2ACs1BqPGblKSiGGVCXzIoxmKZ71h5j0Jqj0gN7dB3j01TdYHU9QI/s9clX3so2GwAPqFH7zw4/wKlUOowaStMLJSyxKySx4Q9Xc01Ps//EI219+gflhF6uMss+zXmgvOzDZLT9BponvGeycrMU0sV5rraG93sHmtessIlhrdlCuU+W+jajWQuKRxkEkgpLSwiEKoazSzpYyKhCVCDAlNiOIMT05RhgY7QRqHyAXgU5nAy9cvYJWq4nGSohKlRBpOx0kgIytSNt5TIC8N+5iglEqnFrFv+smN/WMlNA/f/2LvR9/xQ/b3+KXuzsYdLtIZsfMsojTiVEklgrUjNaGl0dqTc9gFiRcVPvxlyR4BCZxip/Gls6c2B+KskOe+ySsZYCBgOUAE6LOlwK02uvY2trCK7dfxutvvIbbt26xk0O5WuF34Us5JRaV/kgDlIRb8PH4yVP8dn8PD3Z38NPuLjscHD8/4D7PktByqWeURboWxlcOIwYjjMYCuVNMA7Bv/dvvf4C33n0PL964iahZ54OMv5OUXj1T9hkPJ/j94UP8vPM9vtv+Go/v71FWiooo+M9g1GBnaSoygxIQFmij8ZIA0hPmhxWWooM3FeDNM4dvzF37KdtIhnHACX3z6jV8/NmneOfOHdRWV81cpbWQGtCUqvvEJGHAj62uBMIRgbqS575JI3h5vnDc+QCAq1isv+szsQCR+HIvrbo7PfJ0HfQGePLnU3S7f+Ogd4ij/pE9R11tHLYF8n1UonKmzZESAB/JdxmNjaKWwLJ1Wtzjl1+yzy0RtSsK1BnRaCflvUADYHGMFkFot9p00VUUHyxeF7GcEidb0f7N3JldEAJU/aHEjnPW36qfywMKM4kfdPx9Q++noD2eIioDjUaNgWJq5bmy2cHG+mVc7qxxTlBbcQdP0co0Yxe47WupZ92V+ExNzfy1IGi2dQigBcwlKSNJp1E/ZqvVwcEAvf0DsVx9znGA0Xky7MCSl3lLG6s/P0ffdy2BIYJVy1kpizThbOyShVaVBYZJmp7LAIidBHjhu3GGKGXxIsvLIOD+Ye6pDUOxUvZ4vxpR8YM80z0jckvxBIHw1I9P90pgHfXZkiL/6PAZpuMBxv1D/Nfbx/Coz6AKFaGIochYXjy1XvnuvPOdKj2cc1cZEnYEipoFZwy5O0/LJcMInct84PXrm/15TKN3aQXtreto33gJ0eYGZisNnNIY0DORynqQsIBzFkf49mywsaKbPKW+FULjnubC/boFuBy7FlmCBCyCksVns+MmavuxVY8PFz4bJ67GyfKWSLmZ3J5VshBSvs2Yriikyi/5zkxQDYF6xUezHmD9Uh0Bpgh8oxWmrKGZMBbGJyOO05l5hLNZxZp0+mLBrDZ1aitonz9Fbm9KnfZf1gVIEpuwV0QwRM8jzQ3cwq2CMFZjS1oAYtHB0QKfusBxcs/V8apY3uWfpxSadnIrhq4V8zBiFjLdPwP30tM+n+dFmWfiTGBauRNb6afcSb+H7qFeq7EDDsVMzLqm3ngRRHfvh/YzV9uNWB2097EQJ7cbG9cJC/qTZbOeW7blW/MdI8xIz2H770WAjz3+uRBpirGcK58BwOg4q0Aggzeih8YgjroHifaDqyVH75Vs6pWZbRkcUjA3/2/EVrO5YdYCt6kD+B8AAP//tF3faxxVFP7mzs5MJr+62fyomrYpKVpUlNIHQUWhgvhgH5X+Yz776luf1FLFB9OAqAiBllapLUZNpAWbJpud3Z2ZnZFzzr137sxu2lh0IQSSzWZ+nLn3nO9833cYAKATMOZwYlCQMpVFitS0BgBIYSgB46uKjth8UI1pgWjIC2twQEFogkbeV2nSvcaIAz7oIrMsArN4uACA7d7nI9utd11fea6iNtAwwV0DAcwDpAvpIGhZygp9p2KfClQx2KgWBqbZ6y67OW8xgROHSjaToGJea+UZjaGufRBah0b9R9bogq5NqXX6JiBUoE0vfEFtErrhZqSIXlwMZRs6aRWUM5y4cRrmg6CEOW8M7J6Z9PlnVTDVJxMYDZEKfHsvTcLjPmBsfqfNF9ndNOmzLMCPplgrldJ8/yCiQJOxW4RoBgH2ewPsPNrD7qMDdNMcyXCEOI9wGgvY27iJe59dw4nHCWJOiSoAQHQALdYBn7twEZc+voLF0y9iWExJQZINtQO8JEokZzh4sIOrn36C7s5dzBFtr8wdPZy+Tp52q0WrKqS1SVppcXele8pEFYxQqAizCyuYbS9i8eQq5tsraC+uIp6ex1ynw0wBL4y46Cr9gGPBp/FuhejUxihEI5nzK3Nshe6Z9A91nPqI4wjr506xmeDJ55YQToeI45amILMATVzPn8ATfBrl7OkAgFA7M00wpK5S3s9x+PBv/Lp1GxvXv8aPmzfwy51b7FBPYIvS9EbVSPCfBQA4qsAz3U5ygSZZg7D4A44/qBDDXHRkwzLjWcFzJzp49bXX8cZbb3OX//zLr2BpqYOpWCEOZVaAr03bAt0FzMoUEelmixF6vUPs/LGLm1u3cGNjE99/9wO2795DQIswjRNiU8icfQ88+jRVTuiW1l8eq/mVNegjOueA6O9eC8+vrePSh5dx+cpHWD17Bp2VtkwByQUQY70/LYNphu2fb2Pz+jf49otruPPTFrw8xyAf2GguGAIo/hUAUN0zjgLxSIAAAIqfB53A+sDZM2t498138N4H7+OlixewcGoVIxpDEwXcHFFmAgIlSTT1hZ5b6jyUnpkOxe1Kj92O/x8AwGysvl919Us9NcJNkDyvLofgiSbMlgN6SR9ffv4V7t//DUmvz1RpogAT60fm+RbWMIn2Od7UURWalURJsTxGDIQmx8ixAYCxqQTapPQZAYDmq5ngjx/neAFvAPDjgAD/FQBQT5KdYy79ifukKSyzrLAsPQvCj8RUzHS7KhA1Z/kPfc3Pz7Oh2NraC2i3Z7C8tIx4mrpzqMboiW2ANZ6UeDPX37C4DABgWI+uIaESKZaOWXreyaidPoK6+N3DPnppnyeHUGL81+8PsLO9i/5hykAAgx1KknTTPSxHTUCnMhyz19RS5OvNm9IbL9CaK7hLYT8OAGBMh48CAZ4EALiyzyNfyjS9cltkQHcKyb/jICFjtxZCNlzLWC8+pLnseR/9/S66+wfo7u+xbn/QfYyHf25jNEwwTHrIqKPHnj2+eHcQUMJ5lQbqG1eoouibu12BP8cBAOrNN1nPA6/FjMRMj0mmPreKI8wtLWCGGCjn16GWF+Evd5BEPvaJheUJQM8jdIk6rNw4V2P/rwkAlNrIjPPII0RmriG3q0lvNuncszXvrZ1/KQAOjw3PUu7uN39f/xTlxNiEmCqa6+rk9cfTBoS0gZGws+XnCP0ckUoxExJrRqEzN43Z6RjxVMj3P8sGDApybdXyWCLbmsDwsrUR5/IjDbAp20CtnZuuL4xzvDWSM07yTs7PY/qC0NYIhi3RZG4zlV5VMjou7IvC3hehrsszY8AJV49fqxv8apy8e49NMUv1kQsAGLd6OHEla5NyKOy6E04eG2nGYIr5O5k+VfczcI+pJtVjMzwxazfXoGJKi1kjy1V17BmZAzd39Vg/F7Qy9H5hMgpwYc2GG1p+uY4kaahqWqv7dxjubKLaAFgZ9NJebmb9c5kILiPbeIDZxoNTEw+HQ/wDAAD//8xdz2/cRBT+POvd9a7X+4NsKNBA26hNlJacQJV6ANQDElyBCxL/Gwcu7YE7KjeEKvUAlASSljStUApKGja/mrK73rWN3pt59ti7TQAVCV+SQxyPZ8bz3vvee983AQCkaEEBmRIAYFopZGoErA932odqT0Qmd5DPaCSFkrxq2U0JFiR7LcQLrkEZIdkao0FZrABIjKTONEI/lfvgsg0nyFM6DhPQu0aGj96Py3NMxsD+n8JASe83Mn8rqIwQRcRGboNl/KzFozHI/+US/2iY2zD2XLGxGsfpezNJivkwGf0z0iP2JffKeo8Nu6msh0gTykfrGgkpcTpSdnADBlWrtdyYVCq5oY2X59XZiRlz6FeCqtQwGEbYPz7G/kEfvZ1DDMKEJd6o37/vRAjp2a4LHzXMDjzEK7/i8Y1bcLeeoBaPcgAAM6wqB88ISKo18c5Hn2D52nV4zTNwVAXjcJBJvxmHvr/3BLdufo7733+LgMhf4rFl2HK0V2lJp3ZuIhOgGuI6J5N6iRLRR1eMGXMJFUrwvQDN9ixeemUO9fYsXn7jIirNWTS7r8IlzSYoQ3LjWI62AXRoPRMNghEQQMEGOSGECtMB0+8f8++0LepND+1OA0tLl9BsNdDttlD1K3AqWvasVKiGkeufAwAFg6USEzCaPRlqg0X4A/1+1DvE5voGvrt9Bz/cvoONH1cQHR9hODjQkmfOMFfNAZwMAJwm+xRZZwe9G4EtrCUMl4P3PoF2jgcvaOPCwkVcvXYV711/F1euLOH1uTnWE6ZsGR0hFnjMp2HJ9PPTbtk7HGH78W94uLKC+6t3ub998946DnZ2OMCm9fLIyI3H3F5CAVfZMESz1msafjsnghzFCgc+8AmYJeknBZZifP/DD/Dxp59hYXkZ1WaAqt9A3yC9NTKKVBwwiLD1aAvffPU1vvziBh6srsGJSJL1T0RJ+K8AgJj713Txqr5HoeYH6Mx0sbiwhPmFRVx++y0svnmZlS7qQYMd7pB6ppXORJRpXyaZVJlU4NB5EFMllSpzaa3ebLEGFpxMnsuJTw7w/w4AQGZrHL0YAGDl7ho2fnmI7e0ewn6IerkMv1rRZYMqA8oFxM7LB2YAQEqgpfIO7LTAX65JAGASHJkGACB37/8NAChm7orPP/F2BgCK85I7X6Lp78c2z+zpyLKHZNtTJu6SQqVRhd/0MTPTQRDU0e4EaDRqaHdaaAZVzgyWtLhNqp2vxyUDkOeZn7ABAFm/7CUJQIiM3j6T0QopYAiET4Gj3R4Odv/AvdWfsb72EzYfPeCkxPn5Szh/bh6j0GFGfwLXyG/gmSXUwNaIk0IEBqJKE3369tzbAFV8CgAgjNZySQKDr9SeF+7+jwEABj9N+6SMnVsjhWF9HHIJ+Gj4jPvzSXqP2PmPDnt4ur+Lvd7vXOXILY9O5htLg1ka6CaxyfJb72waCSwoLpMBhixC4Rs+tQIgU8ohT6lP+7hShwpqSPwqvNe6aJ09g5lzZ1FutzAgBnvlcNA/LBEpsELkOqn6QjzxfZ8CAFhAmYBCufE+p9J2oiqgAGw87zsXf1zOlOkVUkUQSh6a9/n0WVfgwBJg1oDOIsusiWsoAI3RqAXskxLwQ20BVA1C2X/iAJoJPDR8F36jzlxOUCFXa8ax5iirFDwsW+YN5jxO/e84yfnzcj4LAMAtOIacTrjciDNBS9yZ8m/ilbHsmS05nps7VagGNoMkOyYZcwrY7XN82tw7xs5xEjaNb8pZCf8wNABObOnVZypsutU5S8pSwK9bA6J0v0mwz3x11EpsJNDlnsTiAGCOIJXtWwFY+HkmgKc5EvWziBXAjMw9ya2PRlqynGT0DPu+VCjY8ZLICnJLsRVf2fPEsZb4WYZTTSo4NEF+jDrFT5zA1i0ImoRQcXzKUogMKGRKB3aLOhO1m4Wz+VTkOcPhEH8BAAD//6xdS28bVRT+7sx47PjR2Clu4oQktBE0ioRALFghlZZFxQKJFVv4cYgFLGDBrjskpK5KQS1JWuWByUNqmyZxkrHjZGbQOfeeO3cmdmFBN7XqqT2euTNzzne+xxUAgBvsGpkdnFujAo0c6Cm2Nqgq2W1dar8cyKzpzoMIAhIoE4dATTV5C+RQ5KJBT6xpHGy60O/bOECaWus4hIT/TSIY6HWRASA/XEn8oGm2XJMz9+IjlIym8nSihR4vDABZxBBahmTZWoTHIMglrcFITTajpnZoTYl1v/d8bsDdC0fr+rNIIPjGHZ/z9i+sHMAiagYAoNeyz/Qd9VpdX/ClTNqRFiI/+Jz5PrMcSNpAphaykIUxUatVjfukiSxilkWaZf6zO2nJuO4Tal62WtqExDlpwNOw170T9M4GOImGiAZDjkxLUqLPkNlfmacQhDYTQu2HAdJAIRimaPR9NPf62PnhAfqP19FCSraQiE1WLRG96SI4Z0ob0Jidx8d372Np+SO02rOageJktbMLZ3SKjd8e4tEvD7C/sW4AAFiAwHMmFXKB0qSOj7cyNH0xxSH00PHgVyqjZ3qpaMJp5kuksBKC6nXMLCxh4dZtTLXnmC1QrTfZyZaOI+XDJQ7NLr3Q4XbMAKDTTakNlH3r0Rrz2EOBkznigaZIBykajRpHRb29OId25zoak1U0Gg09KfINa0Fu0qpQiRb+yHb2739xHaK3yfCMMnxpLfh0878A1BB41d3H8z+eYPPJn3j08Ff8tfUcW92NbB+S2ND2E2QTsPEFj9bjepaWyOtbbLGICsbTf9K6J2i12pibv4k7n97DJ3fv4b3lFXQWZtihX5p7KXODrPzWhl1xjMPDHnb29rG6uo611Wd4urqOzWfrON7dweC4h5JHMoAEAT3UCS2me6fSpmAEaCnPM7SrvIY0xvjiRv9gz0yFPFOuCripa3XyXghCH63pDu5/8SW++uZrLK2sgDoPchmfoImIIYGQSiqIge7aNn7+/if8+N232O2uQWFoCuEk88kg4yrlmQeHV5DGmOZfeWhPz2J+8Rbe/+BDLNx8B+/eXsaN9gymO3OoVGtQlTJSYlCk5mxexpiYIODzXE8gktSYJBmypTGUJE8MOpNB7OkSyTT9wiywAMAbSBQuQ2lco+kyAAS4HCUBwBgAQApB/YU6zu/1wREDALvdv3H08gCDs4jvrZdJzNNheV7Ks1XOs252/FyR7Rdc3EcCAAKgGfpq/hmabyD+fwAAb+DpXPVScF//NwnAeACAv3sU+0M8UKSZTfMDC6spTbQZXy5b21BQBew+GUZcRNNzhHS/nc4MarU6pqYm+Z5abdZRnghRr4XcnMtAj5ZVybi1e6YAE8aAZyQyfL90pv92H93oRZkFp9lRIMLakFN5EvRO+jg5ibCztYm97W08ffw7e4x0NzZwEUXcwJJ5JqVn3Pnsc7w1s4j+UGl5DTFwLvNGwFfPiZnqqtHvJ97odeRskf80520BAPR6yApxu+YKE9+RTA3XzNUFI5xccfv+iGWsQfUYVaZkXzDFn6R5VJfSpP/04ACnvWO8erGHw5cvmNo/PCePhCOExHZSw7wkxPTvyui0eRiT6utY1xZpztRP/meWqW+ARxcYHAMAsCyRBj0q0+ZHJOsMPa6n0jBEc24B4VQTjU4b4dQ1hDeaiMgEtqRwWQ7Rp7ss3Yc93fTHxrjUel0UKfzp6GvapTlz0pfRKifImG7KJFB4hVrCnVja43hlGY6/VwgbVuL5YJ6P+Y0KayeVpt+R2PBEP822J2DaApiJlW6IHI2rRK/CvjVUH1Zp0o8Eg+gUZR4iRpiskGb9jCMGm9eqmGyVUa3o1IFaOeAYQcvxYJAx4ZpJN/Sw14AYe7u/GQVQLQOwshx6PeDzchGAIgGgxjrhpjWwzbW9vk2fJpIYiYB1m2liKIiZnO4d/BwIJJ/DceeG1k7rRGju/LxNtTxczAqpxxPfMzvV97M+jnojMToXyTQ35EYGQufTN9Gm4l+QZ6lnz1xJ7BDDP9on+jzuS01MH3kLSey7mAe6gAD7HhitvUgtiOFOPSQzMsiTjnzZCsCGnCdZ59IPi3zDLnue92i2hIBcfBzIK04pVOpVbYjJfn3GYNHsF7HX5F4q/a87HPeUwj8AAAD//4RdSW8cRRT+umd6Fi8ZPMnENp4sCgYhQEQoCcsFsYlb7pw4cOUvcIErvwiJCxJSkKKIzUgmXnBix8Rb7PEyW3fXoPdeveqalb5Ylsbj6uquqrd8S/D1o296PgTerQ9bOSHFS61eyEPLoChMDejBKQ/6KACGVekkWk6VKBMOFAVMxksQT3+5YalW5Zz3JbwE3f8Jb2OB7ZL7h5R/4BifxzcA33edGVXw9zwZo3zUFzzQHHRtBUY5KEDmM5uznXQj7QV+4OybbxNpXwvABP1dEBVf5OIBbQa5grWOiF1RwUF1aGxRzlWb2PnAwl9oE+aKoC0miP+wLCwqlgRW7TMMpfqmFcDI2hXSfdGiJpEx5uUExqr+ZxwdNhwrzKCTsqcN2l3yLS7htBnjuHGB5jnZBbVgYuJEyjvU0/eHu7IhV5x7sPAlr7NnrMBOMQlROwtw9sOv+PfHX1CL28in54g1kbIJA+2iCVE2DBCVZ7F0Yxm3736A6YUbqC7WEU1PM6SPXSHSBM3GCfa2NtE53MfF4REOdp/hlOx3dneZpw1Wgk3QQcIc5hLx/lOhv4S2422gB1N22jhNjD4oX5asZpBOsEDg0vXXML/0CmpLt/DS5QXkp0g7YJbHS8lhHiVOTRNKZJnjLRSIgNVlu6zorAFUatcZKZsiFTvK8kyRg9XF+iLq9QV2FSDqQHFKbEK4Gk1BCvG0I/V6Td2YRdE646bL+jZeYOdBqgaCcRZQsg80sAWRtGtgYlJCPsfa6jr+fPgHHj14iJXff8PB7jZM0gI5vkccKhFTvcuTmPc0SdwGbnpo0vOOphiBIR3+mAtPhUIZtZcXce/99/DJpx/h7p07WKrXMXdplu+T3hu6g47Xb00gnbXTkwvs7Oxg4/Hf2Fz9C1vra9hYfYzn28/QbV6g14k5kaXOEFX6xeHLuO6O9vT5fnUudc/zwJ2YkDplV+iSf7l0DrIgzdhOHQWD1as1fHb/Pr746ktcW15GfnqWeeZNElTtAVPFPH9FfN7F2soKvv/uWzz4+SckSYtdMNj7lw6cNGSaBPhpSO8jLBRw/dZNLFyr4613bmP5jTdx8/VXcaU2j1qtxgUx2Zu8INEqIGt1JdA9Oy/JN3UAdB/WbrHPK6fPa49kFFplUhLpn2fjPzcMhVff7oy3mHH4B4vUwtH3+dHe2EgY86SLg71DPH3yBPv7pPzdstBB45xu3BnVpwHgJqBvtCQO6F+5MRoB2e+DqDx79nhe8IN/5wd5g9cQbSUwE1FE4SBCIzBeMBaM+NvxHUcZXH/XLk3kPFbVZC7+8//oeQWMTESM3mkp5MMpXNPvRK0TqyQR0apUKpi7MofK/CVUqjOYn59HeaqEcrmAPHF/CwLK+1O/AAAgAElEQVS1VxHUnE3m1KpUAy8BcChk3iIoQ/XkzrHIH4UPNEZCHzGoj9B/1NRIZDYSa2/e6/Rw9uIUjaMT7Gw9ZQTS83+2sL25hvWNVXTa52icHPL5QLtZzroFEFIgmqri3Q8/x9v3PobJl5Dk1Ro5GOrM93X2db7HID0GRQ/95wxvvY/a6XybWS6mEyIoyllhxpQLZqENeANjRnxL6ApmQaB0NDmj01RopqyGzrGsxJoK6VXzRPLf78UxOhcNtM8aODveQ+esgeMXezg9OcLx0QHanSbidkvelUDHbCw1b8QaGbVPaV45qWIZCLrD4S2kVi9r2Go1xVbEGfyE82iFEWLqWEYhkkKI0tUqipcrqCzWUKpWOPkPiPtdjFjpiJ670gEk2RcEpSbYOr+TxP6Ghm33SNofyXuc4mGnRB70z9GghpWvJzBuz5m4x49DpxnFsPz/d/jv+ND+abRY4Vki91kbemgtWk4Uo4USmxP9UFwcjI3ZuiiECaqVMiMFqCAQcf2WkjdqGKRiF8ydW5uw5bI9cvA800aTG+sIvQRf34tyBO0uw55nsUldoswUwjhxVAG6Wl3pOlPCKbmB6Wskqm2sa4SGPdcg1Ln1EViaayoiWteovjNql+7fr0+9zmzyFBkxTItQkT4WckxTd2Ypjz62loH0k54djVU128QzP4s/qOirVHCNC/xLk3sat0M6WHSC2KFT4V9icRqXFgaIcq05sd9QVjs/KQbQeyCUA9WhEyR8plcUE4XCFkIGCzQ8FznRQuDv5zxZkOdMcQgD/Mfate22UUXRNePxxI7jXJyLUxOlEaGKUJGiIqgAiUc+oA8IwQPv/AJfgBC/gdQP4Ad4Qgo8VIKIQIhSqhAnjeOL4jr2eGYO2vucPXNmbExBjVQlVWJnMuPxOXtdnS8OvlQiG3AkXMFCEWI16Y9IXnzSKx2MtcTVCvxL+yvd5A/T0vYgcwIpzZaGW66OK5eTRHMJwxMQAGa490xlHw2neb8QrBtd5B82g2EzEHKR8gBA/iZTBgyQZHv6G+hGiAzSKY+nCy0Ijw0uSEiHlt6IzNRNUjmVm9oS7CRUen4e7L25ZLhn24BpTNBhjGPD+qa+F+TfKMxx2N2djAwmiZWe8cIUDGgTZG4U3qCaFz579vlrV0vvFLH3C7jpj9Hq9XHV6SOIHAxDh8EAYk9d+hnXS1oYbBtGaBYiNYNZVuMAd+IycHCGZ999j3LzL8yrkWGGY5t805LvyAzfng9nbgFLW6/j7t5baOzsYHF1FdXVNbgln6maYDhC0O0gvr3FaDjgz8HgBjftazw/P0e3R0FJlwiGAzjDAMUYqHiatQzj0CQ/x8kQwOddaQZaZUY8jew7lh2fP1GoE4e8+ahUN7Bc38HWvfvY3HkDi/VNBDEF/82zfJ1867Ko0aaFFgs4YWIr8WVoMUAO1wVS3WM00qod8qXNF7G2scIy1Uajjkq1hFqtaoCAQuIllWRUfk15k5L/LAAAy1c3CQCo3OBmI7J08aMXCr3LNk6OjvDkpx/x5OAH/Hb4CzqXl3TxMQz7KNLGJw5RKur8EBlelOthQBs7stt4PtbqG3j74XvYf7CPd97/ALu7u1hfX8O8r737nmNtrozQgBDlq+sWjn8/xsnJKQ4Pf8Xp6Skz/f1eD4NOmzfSRZbSE8NP3fqkQpHNyqSPNfsCzm4o/i2VOv/hZl2zkNznREpsvkNhL9w+QWCfq7B9bxePPvsUjz75HJvb22wb4Egx9rzpBdoLFUuGv/nqazx+/C263ba+LsqFTwn8pQVs7+xi7837ePDwXR7+17caWKmvo1pbBu1wRrShyCVRJ+/BdM4jPcC7FogLs9ilcmgrdGdKmNgstnjWxs4Oe7PrTfPyUPv56f4plUgBFhh2gxb/EUqluYmEdUwDADL+e4cBNgKVaDkkHKHb7qJ11UHzosl1a512j99XOWgpjlEpVTJVf3GYl6T+PwAgHdxfLQCQZ4AnPnIW4Dwz958AAHv4V6miKx1gXbMREn9l6tOUAGGS2MvegmqgCPAivz4N/PXGHTQar/H/azWf4gFQmNfTvRT7pXoMnQTj2Oy8dWocGdxI4ZOgf0KkRAgpfJStAX6yiaXAfsbadXMs+i9GfPzd6x6aZ008/eMExz8f4eLZGf48fYre8xZwO4Aa3zKjSBLjML7ldYH+MXsUmzXRr+Lu3j4+/OhjONVlKL/AQbyInUT5hsxAlbsOrwgAyNcxpmBunARbIVZJuOLMgRkugpGuz6RrSevXOBhy5ZXHLQka5OH3H+4cVwx2R0GoW62CMbrta3RbF2g1KRuhg87FOcbDHiJqVzJrnZZhpwn9Cbmp7FaZl9HBaOXXzMHaKADkNEVMspR1ZWQ05tBaUqR4pTke7Mv1TRSXV7CwsQpvaQHlzRqGvoNozmNQgKT9POxbqkXlWMfqpkOc/ZEfrKcdcypldi1lqZshE/W10KuuHRAnOVbKnd3C8E+/03qiqT8n79WFl1AZzXp+sezCkH/ZGtDJx0qmWELSKW0HcTj7KIQKb1EuEvNN7U9FLFVKWF4qY7GiA7EpY6Kgu/E0606qiinqG5nJWDeXU2lOC/kTAEBC9pKZzhrgxTpMX8uAPDatOh5bsSMmYlQs5GjBVPDaqrEoZ+3KzlhyXFEUJcdHygEBxSlvTRj3afuBfOghgag2oeqYfAGY3n6ZacH2BZvITQFOCa3kx1gEK+01CQCwiaf8fCiWMJpR6fm5McGoXIThF8CBSXIza9te/fz54fMtVnG2WtCAT1XaWXKbH0OvLlNvKE0IDOyQtdy0kol6W+5T+v6AAhNdF38DAAD//8Rd224bVRRdc/GMp3acpGljt2krQkCCgiJV4QHBAw/8Ad/ALyDxiPgaeOCdH6BPRRVpBIoChdC6aaPaTpw4tmfsOWjvc/bxGV9KS4U6L5YdZzyXM+fsvfZaa3tf3v1K+Tapn9A3Ji3kTJ9+U/0X2oi9mUrrQjzTe1+S/+KkYDT0fCDFiIAGME0MoXHFl+SDBqtGFkcFAIAuOLdiIDM9xxXSNRNxL6osyq6xggAS/jRbwPMscCC/Qxu1bNASgMDqacYO1UnOTx4q7odvuIBqPKGWivECIWqCmCovLyyKgubAsgF04MK0EtMGMTTtFTXLQDtsSivAmYDY96ymRQZsiY0eM534IygAAK4TpR2wQcQDjQKJOKmhn43QH6ZIBz6azS6GmY/BMGM0akhu4KRtYdOMQNcvqdLhT/cH9Qq04nmLEAxFr+6VsdbM8PjHn9C9ew/J6AIB0yhTS61TuuMgr6DaiMxjqzmadlUQo7qyihtb7+LqrbdQW6+j1qjDvxQjThJbrefl0cg0GLnrD9E5Oka7eYTjw78wbLeQdtoISYevxhwgcMAlD6NEiNDa0cn4KybLk1fpL8B3G2G0hGCljs3tHazd3EKpsoxSnGCUE0hzCUl5ias5TI0IMhN+ldj4hJ2KHfoVjzcPiOLEoL6pbsOnUq700sRGtLSNjQZWry5zhatS0ewAMj0Ss6rQgytBndEkF8+zcOcmrAfn/zWzJ7TMHqYUjnJ2Uj7tdHFx2sPhwz9xcPAHDvd/x8HuA650ddod/l9y0KXxtLRURWVtFZvbH2Lz/Xew89Ed3L79HjZuXENSKXMAGpjKuATvdKS9E4XHfzfx8737+O3BLvZ37zPY8/TpI/T7PQ4MOeAL9BglIzdedAwdnANapTs3eAoOHXB2EwmI/x8SfxE3eDNk0QnN1A3kAgNtkL4+imKcpUMOTre3P8bX33yLnc8+5fGuIp+ZE/QwKzZlLeH4+Rm+/+4H7O39ikajweaHb2/dwvWb17B8eR3lShVJJebGCfSMZTlsYDDGYjNDOm7WPyu8FgCAF4AAbx4AmAUrJm88e44aWJPPdYBP03ynNUSrdYonT47QbrfYNdw6yhP6byoxspWC+XpsezxzvHeK9+fNAgAz+/sXDwHNrBGUlxL/kq26cSWUtEXcy9ljwzrxUKAKEY3NizTTa5FP671in5TlpQT1xho78V+5soLVy6t8n+VSB8akjw6dxrqAFspOhcp2jbGMwun2ggK+UIApVH9meGjg0Tc74+5gSrfkI+JZ53iA3mkXz46aeLi/j/29XxgQPWo+Yur5uKcN6GgUsMN7lutXaiFLn4cuW0jPqxT/Zn6EuFbHJ59/gc0P7iAva2YP24xKLKzcc/p/AQAxDFRWj2v0qWFsWaFkquj547nzqwDOngHEtP5eWc00FZp8Ah9HI2QXPfQvuhgMz9FpPWP9fvv5Mc5PT9A9OeNWijmZs9Eq7OfI8oG+vqE2g5n/3Dv3eM7mQIKFmd+Dv7Bxn21D6+t4luKo/ihESkWvShnhShW16+v8mqyt8CtqFYxJW05SzyjAgJgT1LYv1Psh5qXQt+n9tHHlovnzZQAA+10nuZiZw/2JxCZwClQ25vUXy38X/VZhe5EkcYHs41X2/yoAgPt7fB1y4wqlYKUDsek9z+wAek/5RZSjWtXtBCl0iWkCMnT5IApeCgCY97fp4qb2NssKwECUlNE7P+dkXqj1lONQrsGgwFgVZMTMnBSAwQAAI5EHE3Atc6XJoagrg+QaYhbIeRN3ntN5jBQwOUd0JFjT5wxTMBbpt5YGBIWE3wVfZDyGpjAtneLcIrYrmRPWt7AQNBuAOgponwm6Ju61lZxXPqff1d0WNIjBReESsVG1DwMXkY3huxTL3Vzb3ieShhvJuQBKLK3hNsfFLgkkgRKWvazZ9B0yGOdj4tazGlxl80ZzjFxUTlP8AwAA//+kXdtuG1UUXWfudpwYYydREypUAUKClz4g9QnBMy/8B7+AxDMvfAofwC+gVgoXqShVJCSaNJAOjuPE43huaO9z9pkzEyctiqWqdex0Zs5czt7rrIv65um3tbi+wymaRAIgKDk3nL6vURRHk6LRVc/Q+5tMRWlwaYWNGl5piLsMAIoBox2WxpRuksLE6Enz74ujKK92euZklq2Hje9m3rsPbEevIZ8JANAGOpxfMSv48rcAA9rzwG9JAKQhr5yLSHsD6JPItDPPa+k4aDwkos81WZETDQdVJQBAXCdDY3gCox+BQdxEgxNIhicZWRgJwOXiSmtkjCaO/QEGG0wL0akJaEkAaLuU9av1Nz43/0SzpFZVBX1keYXZ1QrpdIbZPMcqi5GXumIiij1PMHSunXElZ+PKuandiV9eXocOyhOC0prnXu7hvVWC4rc/cfTjT/D+TpEEFZutBawVdmZkwOppZVta4UwTb4QyijHY3sVw/wHGD/cw2t7h3PHBaMQGZlG/x9FJ3GgTxbNQqBfXLBNYpGe4eHWC9Pgl0lcnwGqJbH4GvY7faHFdSqVMCE2D3Oybx8aBFfoG9adAmaI3xKPHTzB6+CGS4YhXCVcZgQ0JRsMJwqTHLr7BRsQZ4QoUt6hZIrWhULP+MNAZ4vbfZY7A0xTG7GrO2k9ueMtrBgN6/R4bWU22x9je1sVxFClsDmJexWTbD9Ue5hsvV6+sJDrIaxWJymQb055fccJGxHpWWsWhxidiZos2ycoulsjOppi9TpmSP52eMxWLXrRKN9qZYP/jDzhLeziIuRYgCl2WUyxPiNCQx/PFCofPD3Hw7ADPfj7Aiz+O8OLwCJfnU/g5NcpLho0CvkZWml7vaRMWivXrB32siiXvY3NNGxqdHOuaukQZd/v7AQA31c8WABAApvasSy3QuP6Wxnfis8+/xHc/fI+PHn9qVoPA2kO+5ynXN9JFKY05/aEek5kEJQEK4Fi+2uQMF06RZ5+NDirvFnLWU+MWAEA/79opMHcVV+tAgC7lsft+3fe6o9n9PeuOvEYC4P583X7cVrjIW9LlxbHHbu3EzKMeg+nouV79TdMF0nSKk5MTTNN/MZ/OW0Uszz93pB6olmbaPG/vAAAEkO8CAN2f2c/uCQDcYCisPS13rKXWQcMAYJ3uNV9DZVmb+ZKimWIuwsI4xGhnF6PJGHt7OxiPt9idu99XiBMNyLARPTl0U3QUMYmMGRTdTwEVeFSXmLk2Z1Oq2hqN1nXD/GIwrtIMG3sUlU6RkcOhoSLyGZVANI1XRYWry5SZRsd/neKfl6f4/ekveP4rNfzHzEZbXEzZ4S9SPuLQQ6hK6B4/59qKgD8tiaytUbL7IrkTg3VBD1md4NEnT/DFV1/D29xg6V6gglbN1xzX/wMAbtybtwAA0gxaqZ8YcFWa5k8rVjye5RsAAOimimuLItcMSYrpK3MGiWezczbtm52SO/8FSyOyxTnms9dG7FUIwx6RCu2qJNevtWkUjB9Maxg61+ubAAD3U435+B2avZZAFoaSf0lzYRIh7CecnDTefx/xeILBzrvwtzag3ukjjwNu+os4wEKtuOHXK/maKVfLggoBAEvTSASeXQByx9/ll7VWI98SABD6vwb1G3d5iXSTbKXuc9kuIjp+AHfS9J3tvd0zxHz/ngCAKzOGu6B4CxjtNmx0DSdSBzv3T5WTF0zMUlSsMiQBsVgybv4f7G5hM/H5HmfwIGwAve58JgzjbvPvNsDu97sAgNThsr/EwJb+QnT17ANkPqPmtSvhrj3VARxEmmvGC741KHfHWOTEcky0LXpma0DAt27/Enso12Yvihv3fZZEV9aTzo1rl+N3GQHSf9F1STHo7AdH/mWcLqSN3+n5JFJpYuXRgpB9L8kATla/7JfQ9N0+j7dJbDQjCSfQQ9jnYvQu793/U9INuI8z4y/yCKlF7FhSj0Y+IIbaT/Wx9QKg7RoJhoyzyMRpf5VS+A8AAP//nF3LbiNFFD39cNtOHLdjZ0aMBguBkNgMQkJixXYkYMWGj+AX+CGQ+AzEZlYgwSDNQ0IiGhSQY8eJHdtpdzc6t+pWV7edEOiNk9iOy13V1feec+85wdfPvik5YGGlrfdg4In1iZhFllkFxK3z/jcIjkVfvdL3msKkXfw6YUQ9xE3AT3JtTx4/fyuCeZlFMeo96bDCB2pfp6y3Tqwpl28JmqSel9Lj4dn7FXYM6tvIz9eJ0P5BXTSuj4SL1Cr+a6+/IGPW7g+2XEM1Egqvz0UmUyfCejdqhYFeCAQAlL3XydFzoxeJLgwt8VAExy/r0coLnhueA0WY6DLgt3johZE7R4fIWSPq82YRc9EFwjxvMm7YLVytMkxm1/K4XOUSwAZht5bU5h7Cjz0bP4BaD4ur1Ih2kXEGl7SgIZLfyyIM5hlWPz7H6Q/P0Fks0FqvcWgkVU3AINx/tTE6ECCwSBpo+5YjI4ATmxtuLx2gPxzh4XiMw5MRRo/H6J4MEXW7CJMDKTvfrG6QRC3kbBmgoNfVEsuLS9zMZ5i8fonr878xv5gi36xRbK4Rid1bKelky/kpWxvCfOt86Tm8JDIsaVyG2CBCnj7E+KOPkT56F53DFJM/T3H66jWi6zV6na5UMsRHKeKTEVr9IboHA7Q7PbEYFHAgagvjw407TEzyz7sJr2OyQQyWIstKUOiTwTOvB4oJSlkqVY/jEMNjggEDjB700eu1BRQYHPdxdGiaXrn0FRyn5ABzo4RkPkyZLYMowVCC5HaWyEtA4ALJwArQmXtm3Kgu8AlQv09R3Q61QIExUZTlePHzT/j+2+/w2y+/4tWLl5jP5iiJ7uSm8oal/JV4lPYA7vaF3xYA+Qr1zYNrroWgFoTcJ8jRscD+j+Y7Kk4ptK4Tkay20AoN8ko47qV4/8Mn+OTp5/j0i8/w+IP3kDGxZ680x1WKHq6IbordXuBDDUWlMBuGNWeFfa50AXb94QG/79VLrn2FYKtdcRu7f59DmQyyF1tPBAr/AwDQG2WbuifcT7zWNw1woX1/opsR/avK+G1AQPXp9eMwAlUvsN6YtoH5dIGL80ucnZ1hOp3ifDJBHJq9XUF2QfZZUUAEoaz21aDRVysJQNaweWuKbN4j+a9ZCO74fPtAvGHv94EL7l4kQqoVeBVYUUP/vAmXb732jZBUKUkt9y7GEx2K8PUOpIyfFU1pOpD9qpf2JNGnNTilL9R6rXRj8Xuy64AtNCEOCpfEFl6LV2XPZqykSusJr99RmDna097kpo3xBlgtlljMrrC8XOLszV+iLfLH6+eiM/Lm9Hesl1fC8EdFKPZgFajsAcuoVOT5s7SC7a0w0+9AACMRfZxVHuPk7Sd4+uVXGIzfwTWrDnKdjzoIIP3QhbcWAj/Ir47CY9BMm2HsEopCelDrr9dqTtj9e+sYwxwh+1mjWJj3m/UKCePFUJPF3MVVDHLp+U219Xw5wXoxx2w2EbG+i/kUi8UCi6tLM6ObTKq1YG10A6toUtde1xqrsGkGjDAwd+tqL/PeVe6e78zKNgoxJhUpga0XKa3ZaihtmQUMuJpH7OGPRKU/6h8hoXvPKEX/rQfoDo+RDFI5R+wF5+PWiv7xdwFzw0qDo9S2O+++qCKJsnbCwAmQBU49PqjNSzOZdtfpXUk2K+XiWMqKNS51iR3Kmnc6btlbmp931/N3EUn//bgbwGyOtZlwu3GF1f5RCVuWOxUDYiPH2JzM7HaFdmxsqAlmRdhINcD40RDdDq+lHK0o3B9baLKIOnjuuyE4lncPOK05Xg0a9hhiTUQ3WyOyrnmRaqvwWufzibXgY64iyWejQk21BJridjoew3hbUtcq3TPP0XxG2W0lTtm2438P3qI7lrCUMZZ1S7x2t+PE6vmoVepufmxuJq+3Vc9+xYP5O1u2zN4uuncewKIihJrIN60quT7FAtgm+UoMMz/TvFM12YS5T0jomQoJOTekpqyOgVoIO4CJOaaIsBuQQB9N5YMh0gmoqjWheV9F9sdxjH8AAAD//6Rd227bRhA9y4skWzIt2bEtx22RIi8t0D72LSj8aUV/oN/S9hfaX2iRFHAaI63lRJEcmaJM8VbM7M5ySVuBhe6L4IS2eNnlzpk5cw6H8Kz02BLYksGCdEVdJSgMSBaA/BD9s009EYEFfWzVmBSyYUgbQFqsrX1LaZIHTEfxA/R6vqVA8P8TtdlQ9WkS1PYPjuKwpxprXH5fFoBkoRRlTTyaQHLuGqSKI0Dm0EcKMxktaPeMyIzSlR394OsAvmrYCGlRDdEB8AyNxNrWOJXzwmSSdLtDYQB+YVsRhDKj+05qWg4rYpoAla438HSCQSaaC8SJKqKc1gd9jKfdFsIublMPSVrhZnGL6YcYaaawLmgS655jTznAXZUNqrK5YfoDrg2d12jJaMyjB17o5A6QVBm6Ax/H333LGdQ3v/2O7vqOBeV2iOZNFCPy7GebQCO1J0kAm3AhVWbq5S7QyU3bwPv3WMxvsHj7lr3J90/HGJ6eITo+wv7xMSv0hzsDrEjUY6cPtbfLQlHRcAh1d4LhyREnAhazGYpkienkCuvbGDFVHOIYAfUBM2TT4QU9C9/YwNH5cKBg7EnCsI9oPGaQz4KFRBUjZeLlDMvpO7Z2m7xR8Pt78A+fIBiMcHjyFLvRIUYHx+jvjdDtH7L2tN/ra1BACSTeWnSfZWDEWlj0L+igIi9Xn9g9PeR5ijxLeVOcfrjFdDaHernm4JoYAcNhhNOTI7a4omQA6Qb0QqWpsyTARyrzoQk4lL+R6vjw0I0Y3CpSyhoCMrP5+SZAFQKUcmrqmgFiCoK0IQTAalng119+xk8//oDXL//gALJD6zkwlH5lqPxKNaasVPV43qnSljA9OaFWwFcDwPub7Oa0x3Z3xU0BEKWOgBAtl5wDy4A/g7CHnWiAb776Gufn5/j+xQt89vw5vNEIa6oUVQWSLOVz4jlgpcKUFp/i6yzqZG5rJbeBf3uVlo4l0WPHpmr5NqMyFl7s420Ecuw5PuLvVi1nFL0X6Z58CZRKozCtewUDLZ5jApdPBbOPGe05kuT6lUkObd0OEA0GGI8HePblU94LFx9jXF9PcDWZILlNsEpSTt5RApTnhk1moJFshumL1f92H5Bv/Lld8d9gx1Yf30qetVryGkCAAH1l0qEOSKCtjCq5LJ5kwD+vRaX3wr19UuE/wF4U4YvPz9hia/RkiN4O0VhrAloAt2dfWDOVFeXjb2uBuFa4r9Xp7U8+xwkwW0phPiuzt3hlwFW8/I4Kezn7fifLGLP5HP9cXuLdvxP8/eoClxev8erPv7BazLGO5/BJHIyEBSst8qpYWNTYV3lVrUjuJhKZAfHJR2HAh04UhBQQEqvq4wzLmxve4wKyyfVFUKtstMxsOzatA1fEuayqewGy7NGhEckhMOSTKn9QIfRzVlSnQs7dXcKJ6uvJNeJljBtigxHwv7oA1ksW6uNYDEXj7RWYGrduCtQeMVqYrZLaNMPyygqtPu5dVCdh9BDwLZeWcUtCyaxDtpJU4sNfoOwE6A8j9EZDdIcHXHjoHx1wEgDRACkp9Hc8xCzYVzHgd8FaaZh4lkHgVpc3nD4bNlkNIQGpzWPcivw2Q4CQFOQaAB2aMeN7zcRkG5RuO9zv+D/7x7Zj03dZpkDrujIng8+Jdz9Emmdcme0EXWYc5ipgq15i7K3WK1xPE5yN+7rYqgprKen+fXsfq/rZCfjnRE9W2Fbi9u+55yw2muIuVooguzlGio61xbq2FpfiY2oSDPT+kEp5475UZUODrW4rftiWWuIpZjWZluTA9y0WbIsekr5YluV2HuxS4deI3tH5rNaa0UB7H8UH3a6yrQF1K4QW7hOhPmlTFcq9FIRd8C33Uq6ZcTHTeDV2lYp+VhBu00kNuR9SHJb1Jkxyur8E/qUgz1aAFteJULIRPGWhG53gkwKwJCrIaYiScaxXRyLvZn3KM6O2KcaLAP4DAAD//8xdbU/bVhR+fB0nJiEkhLDSaqPStmqqKk37NG3/fepv2Jd+GXS01dBaCKR5ceLEL3c6555j34SUlWmTZgkFEDG2c3197nOel4bmQ8YV7XtTF++Q3JKpZpq3GKhOgRYP21RuX+eTl9XinybZIAwkc1nQlFBgeepC5aYfE9sAACAASURBVIqC1DEhbKQgF14X+/4gKQqHTunAquj3odPbc1ebFlkN5x3AN4ZHX3WygrJCRDTJgLtfpTN3U0qKOlW6nP0Ca7px+aKSxs84rZhQW6quoedyq7+jG8lIagF9wNTlZiaCgCJ6w5Tllnuq/KxeCpnQ3ojKosCMalesmHxRJdVudxh0YDS+6YCeMDDVBGKsWwBp3JpSQ2hL1xmubwpc3SaYzJZOf0mZXrTUpkHEHd9CjPACKZiqkSAnrlSAO/e6/1c1La7wNDb0WJYCkTTZSaPAx26M4U/fw0Y5Rr++Qn45QkYO54H8D78+Der954qKW+t6ptKZ4vIup7GakuUpRuPfcHt2gWivzQDA0ZenOHzymNH44vAQzfYBL+IjYqI0Q4TdCM3HA7QWX2G1TNFJVlhOEkxuxkgnEyyvr2CXCVbzKdLlDJFds86QWQI2Q0RIPk8aTZi4BxN3EcRthwQSVZ4CnssUq3yBDG5CL2dTZPMPKMIQ71+3OEpweHyK/d4jDI6fIt4fotc7gem0gYM2QaTi0GqwpvFF0ZKh6zARxajBmsOC4xexckUvR9Fwh6mDdLnCm4sPsPYSZ/tv0Ww20Ot3Mej1cUKAQP8Ah4MuewrQBBs1nQETMx7sjhY2f6K+FrH+0DhJwDNV/FQG9cbiX8dQwFJIpDkwS1P88vIl/nx/KV3+BhfXTLtj2ZJlba+1+caeuCysxnDpivwKhK+RCXXmD+0Wvc9uHteuLvjnbS56i92xgzofflW4a9IwLnPs0dNTnD57hh9+/hHfvHiO7148x3A4RBxG/L40sKz5p8No73UqaU5tKClLJKXkVmWxOwtmVpTY6DLpa/UZ2Pp1+yy3AZYHKyH+w83dEwoGi5eFLvrJCEmYWRXFdYfO+76IPOwyoSo/XWMbT2JjBcwqxDug3aWvFgZftHD69RGSxbdIJinGoxnG11OMbkZYJAmm07nX9b+bs/+QgntXx/9v37MNLvgZzEFQMRS0S0Fj2LI7v/tZvW24IA0j9A8H6BzEGFDO/kEHT06G3PGnqFOi0VLDKRDNvvHmew1TtDJ+q2lomxPsySl2Lp6slt9G2EmSUEMxfyTjEOkML/qTAlfnN1hMZ/jj4i3e/X6G1+ev8O7NOVP6KZYvmy+Rr1OeNzrNCC274nPI1zkXa1wYW4gOvnDzpNVnYn281hg5trugpJxNbTxrVY5UIk+XWEwnvP8Gxe1qao2AAP/2pmzOMKwzx+GxAlS2FlLyS4MSYhZIph+xmE2xnE84a38yvuUEDZLDkV6Zah8q8otyhT3q4CEXoKZ0u96gcRiek2t+k5FnTyAMtc1nUOCDQ/dQyMugnvfohWqhTF32adHL4HWALAgRE8vw+Aitfpez96nDH/e7yOMmsr0WbCvC3ARYlTlK8nPQKD5obO8Ok+TARfbl1HwShiOUEyaftxVpoR6rEcp/BZjDAck+W/OfLMe1S6vNOvgLVO+wqy6kzyi7R9L1f9t2NQvuMGKKzeDiMtQnqfw+cOCeYQmKe0ZzvDMlHfG+YySLDJM51VEtNMzyQc9MVzPVIIST/9bO/77LPoSpUogpOIcSi6eayq6dDJu+DANazHYSnwAG3b393WERYdOA/XOePUbYC4U0cpmpTWvAUiXp0dYJm6rpS88UlkILNZW+LyWZyKWvhdKELar3UPw5zU8c1R61HMud/bRE9u6x4d35bYIxFUNGWObahPaBAn9TqbVKItQTIefxQEaMJIeleG/HmmcfCWGR+9dWrzWDIwLacK0qY1LBON902wE4br3JyQ9Fgb94u5Ilt4kw/LUsWbY13mYNU4TKnCFFoIob78QNHoviyhNwAsKBggsJE8Iwicexx5ZnbMtq6l+61bINpDhEqRzGtiyrJXX/y7fsIADCk+MqCUPERZyOEs+N8vMrmEgVoDtep6twuMHxiv6JQBvcyVBF12qRgPzNCxZIsH7S89c4+E4+ZhLX/mbLnHXhiwEmUFeMgu/gNTGwKaQ3CWpX2oYX2OOEX2EaCCY3+t1SyICnDTjOintdukcVr8WWlSAFgsnNwUkoyVsW9x42xd6pBOlgWG5ll1GoPyXzqkgvYb0OeClyTZgPqFAPGmf6J3yXqgro+D3MDY8EXlLFDhpQWOLCbDDLZxhPC/x5s8YmylCajhRniAfteZgS9Vu3cOzP9aprGFIAynpFGEHw6ANGyEpmGtK7KRoNTJIS0VEbJ59/gu7ZMa6/e4r5by8wX9whLQt0FFIPzxPUBc5UWYspXYBYSawRW43FWegjRO+wOebPn2NyeYmkN8Dg/BT9B+foHh8jzQ7QGwzRbGcoaKxbKdqDFuKsh+woxmANHK0KmNUG+dVLKQDkUxT3ORZvXmMxHfN/EhIs7ApltIJJugz3656eID3IuOO1Wt0JdzGfgkpO3JwtpaqeUAGhiFiEMB/Nsbi5Rhl1fCFgePQessEJ4kGfixf0ew358qctFGmKRiSImQ0nCYK1J8eGpkmxXq5ZUZofGJ4cCV0h45PPLJYx3R9jvHxxg19/uUSbuLaHXQyHXZyeHWJ42Gd3ARKwaWZ7glPjro6z0HM3CTwSQJKXqL5LdTchdFKOfKCm91EMtHsZvvjqS3z28Uf49puv8fT7H/FmPEKLPk2IkRD+W9Z5kTvex+5+si6EQn0h8ElEuZP4//dW+mS/0q6IvHgi61GYyL92dHqGDx5d4PHjJ3j46AIffvoEh++fo396jA3ZGyYxZkQTSsStgjh/B90Mq7t7JIQIWaoGi+vI6O9rbMuzGwVLqw2fcc9nVC14DoKIf6AGVF9lfHG1dhWZu/y246T7bAVdPG8WxV4KwL79wv2tZtmyNihH2SctdV5rKE5UaAIrBfC3PwEbJP9lucerWp8F17ktI8mVNprIWhEK4bHvdJroZinOH/SxWQKzGXnC3+LV9SsuAtyQf/l8hsViWTtE5WsdHDPUFKgFaVYt1KrXdigNwb6uW+4/rx3AcF6H2gbTmkUWVKtizetgm3jPzSYuLh6yvz4J83VIm+Wwi6TVQJa10GpHyFJ4CpWQYdigkp9K62yhNFne2Gos5cfWn2t+Wrdvl637mKVE9YANK/z9YgXkd5LwzG8nGL8e4fdnz3B1+Qd+/uEnjK5IVf6aOfyrxYTXFO7so0DGz0/BZv6GYJ7YoElWbhuDlJsxa9HTiY0IXhXL2uwnBQGfTvxLRU3XZ6JTockfo0ZF0mwxEsBTp4KbsNyKAf330E1nt6HIOk8zOsF4xxcnTFoaN+6CQrFqfyzjUNEaitUaC6JGTG6wyMeYjK4xHv3Ff5M6//38lnn+znUnNqKi2HCd/NJdMp177RYhworUYd1NJdq90A4xERQ6a3UEI8Z/iIyfo1lVn7v7EVvrEcUq7nWQ9g7QHfaR9HvIhg9g2hma3QyNjNbeBHemxJSaJyTI2opxr7Rbcl6RWFKLZIG+RuS7vVUxKIT7uzVQhDAV5aqw/6i0e0tE/7fjH27Oq502SqbCrrPbQkV35kPr6+862X/XaAEndMmbHpae55TifcL9ULxPPHbt6vJHCX3biHA7XaCfEcJy//ri42lbPcMRc8ELjv2ZlpGoDoMiA0KxObc5LTen/k9raKS++FbRV8T/ryDkjlcv1DOos1esdIOQox4mrv41tbOsFQN2aIHynvjuxz5H4O74zhylYs1xjDzPWSOg1GasxDTyPnPqGzIOotYvVAeXv8mxKyq0sz1kO3YtxtLzGJ6TGwumESgawOVY/hx5ypDczqGf/FhuWdGHWnJOOJBpdNSwc+L0hNBmBIWePQmzaz5OMRDfA4QIIJoiow9EpNCJy1MsT+g6RgFHBn8DAAD//4ydy3IbRRSG/54Z3Ua2ZCFjW4lxKrCB4rKlilfiFXgzWJAVlWIBJCygKmziiiUcXxSVJXk0N+qc02e6ZyQneOOSJc9F3dN9rt9vvn/+Q8mSULbvWy9cIXi0EakxpP0FeoPGmNqmELIzXdQ09MnIDiwEQuXr/MF2cEAHRKBBp/9hIn07rDL/+iXBAhn4dVsJj5l8CWFUP76WYtgIWMv2bVaAJ49QqiXyOhA6QHpv2sdCn63AFIWLsJSNwZMgQ1jpSBaeRiWqBbCoZUjonuNej69L5SJ0stUmlo3+UDkOtSioOoMv2ajnKCwFMrC9qzSWXHFAkD3qA2ed9T2QbxD3P8L59AbT2S3u1lR+1mdVdpbtMJEj1Xr9Zr4m/IdknXwjvLqPHfKF4hyINez6vEW1gGXYSDKLJOKnc6xfvcH095e4f/0GoxzoJimCImODTWdD7l+X9mbDK6tzb9VeF3aD54g+ARIPBtgbDVn7nDLv8dEE3cEI/dGIWwVMq8/6/mz40JTbrJGuV5yFvl+usbq95SxMul4iT9ZI7q4420EGYBTHODg9xf5ozPOmWC1w+fcf+OfFb7b3qU4A1QxGWY1JgJTmmInR7cSI2jHGR2cMExx+fMK/u+MjhP0hOgMqme2j021xIICeC448rjecFaI5kxFgiTJENBaFzJ2QYY2UdcjE+KaSZTLomd0hpG3Kro8PxzieHGN4fMDluQQYbHdC1s+mvtzAykq2I7NF1HbjFFSGrDqKxtXt2p5ODy5jzUI3G4HkXYq3F1P88vMzPPvxJ7x8/isuL87RN22uwgBW6HCZVCYZFyYlp9Lnnec2vOCc5VrFQQOi1CzY18+2I3nWOMAXyRqX2bsIRQSBX+d8N1QQTN9JC2HYxejkESafnOHzr7/E6dMnLO83OTvFo7MnvKjzOkwbdih6zuIwiF5uxIyVTMaPosJU0obdkelmIC60kWVT1Km6VCWiEXMOvoayAWaWibIrys8ReA90Q2sjrXGbNN02EHYyQxpl6FT5xeRdmyVoyB65Y7moedkoRffP5bcACPDWSaHCBhV0PVb1Auql5zXsAwGAKJDr141YrlPK9lga9T2BE1lfH87KmkZZODjYXnI8a7laYvFuiZtr6o9ecAZ1Pr/lvUL3EJr+rajHEFHaO1IPYpRb8BDLi1bXUNT2fNXIpnVZ97JNmojhZaTknBgzyX1anZPOrxmKIwqqjg9weDjC5NEJtxrF/S5XGHWso89LaWirI+SsUBnSoNJzD6oAYFPSrgi21/aqkMdm8LNUnmSKmW02JeKOQXIvUEbywdZLYjEskNytMP/3LWbnU1zPLvHqrxe4eP0nFjczzOdzPi8R5TUwxrZIktssfMHSfKEFpTL7xBQ1iB4ac50+2m7sp/T8piQXQC5EK6xKr+l75v7W0M6xUiKhxrSwKYgH04WJ9zE8eYyvvv0On37xDcpOVwB0hajtiE3j9hi5Ft1BrdytZRKo3Bedg9YdkRuOBEJHrR105LxEh96j3loqkcgSlNmKOTlE5SdH/3o2w4JYOldXSFZ3SDZr5tTQ89FiSHTuOCu7nhG7/vuPgW+DSFWSOp1FFcyErfaqCDS2KpKO5wDCrjgqs84+JSFySrRQ1q7VQn8yQTjcQzwaIiJI334PwaCHqB9Le4Vo7PIaXdosf2kz/MJYAUMqIq8kWptOygYLYwv41tDqF82lopYlpPHcCuB5Mn2Ok+TZXL5FZyslqzWjuRabell/832+V7VdTd3507XkIRWZ//PTtDf1WjMraaffV7Mf3r++9/00A/nNZJWvMuYzM6rzKDvDfs73T/y1W2HgxC2Kgwx74T0+ezzA/gCidKIO9QMVCPqbWhw5WWnh5HkDLO5fJ/s2xq33esyIWQDCLCuMfqchJxP5uFbzPsvq+7eAxcMtaC79P0sM6lhwstUFhbSNWdsC6P3A/p0Curo/K81/kyRyDDvPxT91hHw/Advtdavj+yw28oHYWfck6rUFmnlvlnunzAz6G/lwviqEn0ze5bswb862d4uuv/jAWoWh/qey3pTbpuMhvpudKw07Q89H90XwWrZVPQUE52cJEF6ZfQwqJP+W2uuyDP8BAAD//5RdaW/bRhB9S4q6LEWuD9mODBRwDyRBgfz//9A2DeAiRQMEaNpasZL41GGLVzGzM8sh5bgIvwiSLYpLcpczb968VwMAyoZavqdcbKp82glvJ/BDCJOlIdrPbc+7XRS0t12r8IQcKx2FBqGUdq5eZhmysup70WQlTDChb8CInLTMibQAgL8JknDi9TNvX1FdoLV440NAAz6+lremYHEJDobT6uZ3lQKkTejt+bHoqDIxVIxCb/6moqd9peO7nd9yUh9bwQejC2AXcD3vCVcJMxZU6vZGWK/bmH1e4Wx2g6v5va/6x8TOqCwiNxbcJsPV0Ml0fJCgV7dYLB9VXKQQhLp5n/A3Y0U6pW0hTLoSnSxCZ1VisMzRml3j+s1bfHz9O3B1jWIxx8C10Mk9I6BwRfBkhVBEa4Xn2hWptki+UUoQsGIgxSHqthElPYwOJhjs7mPvcOLZAcMduE4PncHIK/PKWDqtLgeHVMEg4ct8Tcn1HbL7a67UEYODkzhE6PT7XlTq+gKXb0/x7vQ33C3FNSJPwxj0uCwd0VZ0SX2gIAvBZIA2cYi7fWztHTBgMdw9RHc4xPbuNrczED2809lC5DosXkV2TFErwT2xdCTSoFcNDyg48cJNYK0CDiCZMrYWES9fLS5JI6Cb4OhoD0dPx5gcjzF80sNo6AW6/EETqOYEBdfaXi7XPArXq2ra1URb++N8IO1VFhKRYRJqJpEYUiBaF7iYzvDHq9c4/eVXnP78Cn/9+Qafpu/5+EukSJz3iqYAm1ojUqrSeRnChuweTAUubgScFQgQsShUjljCTh9w+p512st9tmaHipTXooQBpP2nE3z3/TO8ePkSB5Nv8cPznzD8Zgc7B/ss4NcddZBS4lJ60LQtQjG68BO6q/PPCaVVhXFswGDXoaixnpSi+B8o4AqSap+gAAAeRC1De9FG8FcT6zGtPcabeKOivPG+/uCjh6Mq9tJa0DbsNUu/09/XtY6TbVdVo+r7LDbWVH6+5FnwEOfKCj1A07WxM4r/FwAggFUtYu1vhEpKo4K7ub4+AgAAG73hfOyxVAhzzzog44zFcsXJNyVa5+fn+DD9gPl8idU84/nhK0Z1K9lIK3ZKlHGouwbQ/KwdcBFcfuhOpx7+qgezYJG+k5MTjMdjHB8foz8gUdMW20sSNiKkvMoH3cEknTLmRhYfOz0+CXwCKCFJVuTnIAWSrNMDr49AObQmfxS20LCy+xxlmrHA6/J2hctPl5iezTB9f8YCoud//4vL849sDUs2mkV2i7ZbkBt9GCPFAOH8ULBctKrKrauS6MLaIxihRK0AacWXQc6y0sbxAEDGWgQUH5AdL4vNEYhJASy5BcXkgkAAcBeD4Tb6W9sYjQ/R393B1s4+do8mDAizTW7hOIbSoo0CAKVQtX0AGgmAIcl/XEphx7HwobaNkpgqC83K+kAgfLZacesb6R3cLW4w/ecdFlefcTGb4m55g/VywfeUb3fw10eTcRJGaxFb8FGhNhN4m1uxKho4Q4+v5k2se3Wyfotq/oLsU1lkzxczyNqYGH7t4RBRr8fnkJh6T/b2+DWlYk03geslbK24JOZeC8wICDR+2XfZSLxDEkmVTnV1Knxx6iER5Yfe1/8WhdigEpzOauuwXeNLQ8f/EgBA84nV49Ms0I3t9hgAUMo4mhVTO5amLfjXbs31MgDT4lbGgH5agQEPARSPbV8DAACbminNe7dlE0j6fhFxZdnjlwWSHOgjQze/xIsfD1gM8CEA4Ev3RYQq+Svs9TU976HCLm1W1gUu/E7sn//rPBV2SrtifRuhv7IJMDhjES//lwnQnxuGnlfwz4xDWcG5EyXlFB+x1o5zuFutg/ub5jD0LF+tlmzP7tu9vfsKvRI4oCwDZ+zXgXqirkn5kp0NpD1anOXU5l2vp8ZDCgY0z7sWy1UEnvJEBVoYhNEiLgHqch51f14Y0OeFCgBQrBGKz0bFX5kOdK6U9Uib1z+qwBZ7bYKeVYOByUzGPMN/AAAA//+kXdtu20YQPSR1o6gLJduVkwZw415eAvT/v6LpS4s2VyC1U1tx7LiMZdm8bDGzO+RwqcYowidDtkVyudydOXPmnJ0AgAR5NqGvWgwA/yTtB96gD3JS7nlRFd7AUzGU//MDMLE+oABTAwBEu7cCd7avnzZD6y5g/0YjbEDjMS0AQKQWwV0AgGYbSB+F2P/JBJFrpvOSajpv/G5C08TVAAChuQIgaBaBHGTBpqkzlLTTPXJ7RKWeR9UFWljsz1WmIjcZZHwl+JWXwY5nWVNJWLDQ2QUaXoTGuLrK8e70im3+CtNHMCCrICnDuPH8SgDAOKCm5+g1oepHblsomc73+4seqSXjziAuQyQk/ra5Rfn+HNnrv3D56i3uzi6QbCv0C8sYsH33DwUUTUghSVzlvHsLjdwbWz2g9ofBKEavN2DPdNINiNMl0sPHGMxm6I0nnGhTMEbVkopvqGd72ymJDktW3yexj8C1oFAFnvpEqyzD9euXOH31Auuz99jmG+cuIGrGAOoKdeXdQ1MHt0ls5CSQAl706ZqpJWC+SJFM50j3HmE828dgkmKYLJDMl4iTGVFsOKMInU1fYERFWKjTxtme2ECD5vPtdmM9b0mEZXvHGhz2dSgQj/vcz3t09ASrxwcYzGOMxiNME9tqJGPOa4VfYVcAQODEniRANkLLdHVB4367oUWYNDYc05+o/zfXd7g4X+PtH3/i91+f47dfnuPNyxc4e/cG1b3VXIideEojAVYpBkBVj7hmkbQO519OwXnuNFAMC/bZan9E6qzJFE+Of8Sjo6d49vMzHP1wjKPvv8NsmSJdpvyM+v1hzRK4LUxTFRZRmMq0KwkiWhgEbTBUkGH1ma7MAA8DALqC0AQRQY2uSxtWax66tUjWIHgAYGfYvE3KrzoJiv9fAEDYvu26+r/zESnxU9+dZRcAECpwQIAIG8h/oUJZ5B0AQFfU/HvuXuQDfdk7LAGt/69NCNjS0YjPuh0b+v3mZoMsu8XHiwwf1lfMEMhovbm+bq6RRFOjYQMAiPd+nUqF3MNNz5+YJ7wf51t2F6FAJ54MsH+Y4vDbQxyuVtg/OMBisWDrQ1bnD11vvsjFmKafH3IWrUSvx8pYR/WgY0Mob6jdB0snaFX/G6zlIrksVPfAfbbBzeUl0/eJKfTh5BTn9PPJCdbnf+NqfcpALbXOmMJW8wkcHBKDjuxPgoI/b94HK0QpCbX3ZJyqPLzEp5kLxpg2AG084J2s3crcVtjJ1hZDhOEY/XiEXhyzo02Spkj3DpDMEiSTGPEkYRAgGg4ZmA6IORSNGABgC+YKjStQ5dZeD2ip4zKGdpr7HZCvObkq3W1g8luU2wzbzPbu32w+4+OnNf7JPuH64oJ994n9RsAATNWCvuys6rUr3mp9VxNePWVvdHe8Rqb+dqeH0AL+Q+QkHCwMP5JkCysMkjHGsymiaYzhaoXefI7J3gL92RQFFYl6IcyoD0MTuR+xCGselCgoFh5ETfIfoDMPQo/tKDGxb5Oq54Y+OmuF366mAFPrW9+O2QV40Ofp6AuoaILAa2sx1tuZAGkAoDmvemfDNmW6OwZfpzvhW0fLeQJlTyj5hjiY6eP/AAC77lHcFerPZVy9yr8cLQDAhOr9tnN9SEKn5T2Woxw/HX+DMPzMAECds3wBAKhjJg30hEHNwK7HTOlsVU4UVsT5pBXABwCowi4V/4b6bqvpmoFH65q0gYjaPjsL5HnNcuGEVe1/u8CZptAc1fs0pDouWnAq39TubVUl7QrtqjgYjGjc29iO3QHUlMtRfqmTcp3vSUzkt0oKE7y+JgfmSYyg7eH5Wh0zQLfOCEigGQAUH9F3UfynGRLC+hRGIe+9bmz5/jpOSMQ4tfoHcn4pYJRFiX8BAAD//8xd227bRhA9vIgUdY8q243jpHHy0iS/1l/oD/axaeM2TuG2thMgji+xdbEokSxmdoYcUjKQxxIwYJgWtVrt7uycPXOO99MvPxd6uuFUjoUyIBQIpXpZAMAztMsaACAbRKX1u1q/VXnKjwYKuA0EaC6WXP+1rsQplLpPCTJ/KIP2aEJSbmgbEzMXUQUtQ1DrP7XJW0mJQr2EoTrxsgu1ojZ+kW+0W1EeCIXclhdYnQTno208UU2f0HeiNVU2oWfnBLU/FGp/ILUfFqDRdsOgwc2FngZWHCeAF+N2BpycXGB272NdxCiCyClMinZuOeC/EQAwf9n4f9tfLErTSPwVzdv2fPtaXkDzkE9vKMHveB4GqwLezRQ+2S2dfsLNh1OsL75iefUFLQKQaFMvgdGTBbVOxap+r0TNHAAgkkyuTWLpwRMxbOGetRZC5ESPimLE/QF2Dp4iGg4xfvw9b8Di3gDJcIyCASs6YY94o8B1SYFLdYk2SUwBUj/2lymy62tcfzzDh+MjfDr9F4vZrbONER/jit7o+nolwIBnflD7H+fIQEGBTzwyMh+MEURdeK0EvfEeesMddhegEofhZI/BgN5gDOdnIGUeyvzJvRoAQNPcTf+cqbVsMyn04CxP2WmAXttuR6x10B51sP/DAV48f4ZuN0G/1yLGJOIWynro+gDgUaESTqU1Vjm+zCfNiBariYv0BB1Q0jrLGhDkcz9PkU6nOP79CH/89hZ/vXuHo7e/4uT9eyxmC6QrPdF3wj08dgwYUAruKBfBuGJQP6VsyxcgSjpI+j28/PEVDg4P8frNGzx++hz7z15itLOLwWjIbhdh7CPNlrzJDoJIxFcDOb2uTghratrWdgbZRkC16L+XFxuB1s4tmGBXroOyrtsNYLmJk/fTwNl8pt5TD1v7Hk3Qd1s7mvfUEqfFwa9yNWkGes+UGtlTANsf+rt9H1sCwJ9byicyVUeW+LPSWryWAq/+VrAhErpdRdV280V9stWzd9vlYlCdyWA377yeN2z2PLETCj0nyDlfrN0Jsbm01M/Xk+81MJutGQAgIIBKBshpgJTWybZOvkn+iaPEdPocKgAAIABJREFUiFIC8/kde3O6TQ8wHruE/8mTfYwe9TGaJOj323yPhk9Qrg+iAF844U66VllW1TrLBtpR+hUh8CvdBGUIqO9nOSvNJUwCovPf36dcinB5STX7Vzg7O8P1xRd8/PMYF+fnOP/7H3y9vES+WMBbpViRxWzoIQqphGZRJsiAU/LWuWFLGqukyhehJY9teGtj26+swWxc1WfXbXR9B87LmqvUcepvsrdKOgPsTg7RivsYfvcIvcmE2UKk8xJ1uwjaIdpJyCUV1HdLEr/KfERxwjpAvPn1AmEAyDoivttcbkd/x6pkWWk7CeChDSyB1PPpLebTO074F9Nr1rhZ3t3g9uoz7qY3vKYx2JHLeplXcSmSuvpUwYSmPoX00LcCAM1ZxDFbNFR0H6Hxm0/3aV8WxIgHrqwvHnTRm4zR6ias0u8P+ihGA8wDJ+yX0twKPRb6y+VUn9cWn8pdnP0qJVwqLNhM8oHNJLIUUH0QAKh/2tpa8QA4WBdjy8vxZi3zmsBq87IlADbBar6mCQBsPNOwILcd8jWFSrfFI3uvxiCQGFiVbFR5iCZM6li2jf6P/xEA4MpT1oi9NVrFPV7sDbE7IZ2v2VYA4KE+CiRGQWIZsbCacQOmL/MGw64EpPQ78qp4WdqwS9wNAik/ronfZVuBHisgT/dVMDIT/3prYafADR2qkgB1VArBu+eqVpp+/yVDRdZiO870oEHbV7K6pWRAXRBsjkaX1sxr+ykfa7oclGL0hi3AfSbxldpD76/AEz1zvpijQ8yFMMCCWL0m73WH8CICr24JxBgWTSJtC2kyUL+rkJ+WLGif1+egY6RTX+ozta1FUeA/wq61p3EriB5fO04cyJPHKrRsF6SqqPvj9h/0D/ZLpaotu+pW2oYCJSVACHnbrmbuzPWNY1p/iSCRH9f2vTNnzjkTfPjxh1xb6Wl1Rasb9seFRh7a61U0IKzRT6zL5FoulHbMpgSy8BEAoMiSahGsaYJhypr2e9T+/EEQbCE8WmkMRM/vHjQZ7BSFJCGXvvvuYfaCJvc9PEMF7zhGAkW6MYv5onhhPWMGfyIzioCla6GN2Eq+HejUUZFoCVMDRb3BelwbVK/F88AeX80H3QsdWr8DGuukmbjr5hYcbDhhmAqiHRyUjlJ4OIT8AEAoOfrC2IU8RbLXwiaN8efVE25vn7HcUFUh5tYktiV7uDVJ7lBeS6DCaxTW8sTugnOiJyujIc12wIDXJ2itaIrxIyUFZKCSWRpVnGZoUIFmPMXi5g7zmxHWf99hNvwL6/EYe8agaUIsZwvUo8BJSvzDGTZ+8oI0b2EsaPf2uigdJxMgZgtogMwV/pwTP5IJkO7+zdk5ov19puETLT9pdXmMkzhBI667oCBPcw6wDLV4nM3wNB7hbjjE/fUQk4d/MLm/w3pm3aTBE9mGCecRV/q1VSaNeyh9iHXUZHIsboartdB522BT6fQGg7dv0el/hZOTb9E6+BqHJ99gZSKssEayt4doEwgLQEwyqYOAAAB8NEJw84KhYCnqmRvDFU36RH1r1JAkEY4Gh3j37hTdgzYO+1006mSEQ5U1nxYsLtxi2hZ4FbWirXcq8ohQbQItZLATn6Q8xxhZjOfTBebPM3z++BmXl5/w80+/4tPlJX7/7RdMHkYw2RyknI2JApsT6BRz3LyE6IlR43en2W6jd3SM04tznF98h4v336N33MPp+RlaB210ej1Lod7kRbtKmc+23pncbFHBqswFg1KVVPvY6rxaGaDo3xVBoA8A6Luqerh6PcJ8IWi+sRROCgTWq9WW/MiN7ysAgL/5mn5UAACq8VMNIq03WlXXTfsHKxqvOrdQvC20zaxveuSvC/7xtgLWLHfVCk3+FU1XjSRQVNvJxM0Huy0AkEobItUgaiCUFsh8+bh6PiZ3a6Jr0ehVE/Kqsuf/3N/iS7PjAUanTkv3crnhgOj6+pZNBcf3j/z5Ml/gefLCnUuI7dPu73PSPzh5w5+dXpvBvUYi4+JoqbJ/mTPtNeYlYLKYm+xzlAlIUCTWzgVf9kdF2FzYPWx3kVofhMeHKcZUdX54YlO+66sh/vh4iZvhFa6/fGHqObny12hcefdWThS5c8zER2ZVQVPeTdz9LcsUFBSfiGAbHADHBalvGWrbpvJ8uPF8XSJEYQeNpIVGex9Rs8GJatJuodXvotnu4OhwgHrSZEPalMYrtsAyybi4Ap1Zz5+Aiwo5u2nb+267+EwpNqiFsuZkBQhAHhfpEnEtt+a10wl/zim5fxzjYTTC8/MjxuMxV/hfJk8snwo9gz6yy3RS6KBoPWfnsCLxKe7nblq/ZcRXmldCcfSl85alwUlqrNyKIVssyFspSLEg8KWVoEaafZK+ddpIjgdIul3s9TvYhAEb9ZFzO/fZDyNM6U6ZbT8ONTzU5NeZuOoVeWBD2enTn+P8Fm76P/MKCFAu3lS1bCw7hNutSBwqGRJlSnzp2CbfTRB9mYpvJlk1f/pGeGWgwK5n2avrU9X/tVjnki7vd35lW7cyOFD+/r8kVqgAlcpAR1nCtbN57QFZUhX5HgAGNVNDSh1AiJq4mSPMpjjqJjgb9BEb0i7OuEOTbnQ8za1iaeHtb6HHatZ2fpqbuPOQtZwr2rU6r90qafMNG5XBQWsrdRtLpeCYe8w8zRnZPD00W/IAsNH70nk/+MAPMwbJoFBiAtX/q5Fe5IqcuesKM51OOdlVPwLaB1XxKclWUMJnB/qxhx7XT5bp9xsqpgm13gILNlYochR7XsoW15yyaj3WhJ8l7JJ3+eCALwugjdZXZa7bHNIm+/p82flAi+ky93gSRo1taByV/cBghfi82dZ/VmrAYyzxme4/SzP8CwAA//+8XVlvG1UU/mbGM57x0thNs5RQKlEEEohIvPCv+An8QJB446kgSkMKiRMcZ3Fsz4rOuffcOXPjVNAHLOUlmv2u53zLCb778fvGINxVZ2NDncYg0/ZkLwEgLxAlJpg3BlctaiSUGzrfvYwrtWSCf3E0lIYCWpdIWFo+l3axpnsa2ZfOVHkTWGifi9/BSgOkgZjaAdMRjZt+6XStLuOlzP9CRRGt6nr75FSVjpohjpt6oiB9vZg/kcRgZTUnrd6qPX6bRIAzpBZ9a6z+RjwQAjb26ruSgK4Oq0p8+D4A8mMX5qq2CYAYJye3+PPsDkWTcQKgFrTBy8p/aALAHa4yXrwJLio3IITWojf2lcoaQi0ijV1xBR3q1BaG0f3HZG6/LjEJekjIDXtxjfzdDPdnZ1jOLrCeX2FFte7zik0B+6R9J3Z12fCm0JRreb9RtBQVKmBMggSpkfJLFIiymzsdQxUU0hR90nTvH2AwnWLv8AXS4RiTJ1PEaYYkHiCKE25XPo+LYhcmEbBZY7VYYLO8wXx2jquLGRazSyyvb3BzOzfH1Csk1DeagpGVyLEEAlMSJRD2BDr9tG0v6XXm7dbEOAnHyLI9hOkUnx1/i1fH3yDbfYac6LC2vmJtTQCTfg9i0mUmz6jjkt+6xBrdPk3c1KeKmhxZl4jp/F7NJb4m0x08P9hjg7Cjo0NmCIhWmBICPoOc1ys0reZWWiiAc6qumhYBMtvE0hKGQ1M1urGO95Vx+y42wPxiwQyMk99e4+effsBfp7/j9M0b3M7/Rr3MGaUfUKmnZ3v44vhrPH/5KT7/8ivsf3KE3aNDZJMRRk/Gxk+L5rqwNpt1Mvmq0AlyOsk2vXHykN7WEKpdQPzN1TYH3n+TAJAFLvD0gjLOJCEgEi+HTmwxitJjfdu9/EU7UjpTQXLAi2tb/keX/ZHa/zVT6HpOEqWpcMIA8BMLjSqfKueXNnmbpjFW97kxjbXroq+TDGS8eyaD+vgQQketHSVSrsPMjtBq0reYvJpysSUjuKWirnbb8CED4GH7dl1Nuo39kH0higa6Db0K5aTzApwwXt6tmCmwXK44uHz56gUnhUjaQ0NXh8osxGmqjr+L02Nv2ze7xxT9Zlu8hT5ZXXuTr6XzUwB4d32D66sFzt6d4fL8Er++/gV/vD1hZP/89BR3iznr0QdUKWOTY5T2mY6eRq1u2j2AQ+9qY/ILqfVvEZ73JVU8On8l/cOUzHF/5j+mKn0QxiZYjwKk4yHSwYAR6Cwd4+nkI2SDCYbTHaSjIZJhxsh+lPYR9xMjLbPMI1qrG6aMtAFpw9V+IlRFiXKTs3SBAZQSjPzngdWPkkFVvubShpt7CvjvsLm/xfV8hqUtx7cmhsjpW6b7UwKFHEziwLp0O28dKxNzc5dXc/6RT/d4HuthANqoi4QW3TeSvAYhmZTyrE6uLhGCwRDJzhRPDnbRm44x3N8Fxil64wHCEen3U0b2uYQf+b9Y+j67/dP4C1UVdusjpMdT46pgbZHiwMz3rR/Bf08AUALQR77RGefe/kzJkXjvGlhp6SN99kMSAJ3r2Tm7VDrkzvFeu2rGFqz/hi4FqJ/TZzvJPp0AMQHVauVb5icAdNIj2OJRgP8pASDPLQCj/Ojb1oUxyqzKFfpxgaejAB8fjLGTJShWN4iThmVGcu8IDxPF8n3kefT3FdaHmM9J3CEBLM1B2ghdfyOOhdCi9z5rzoCIBWvx2bx8kDmpNRQDxYF97GFl1uHcBttRFHWuJ4kBeRaSnmrgQHujaeM/2PUUXpKtfZbGnSNAAsdIdnzRjwFcy6ZmnT77rCSM1BP4KuwBAVZbhrXap6nYVN9bG0SKxECY39ImWxkqJLuV/mP3Q8IeNCaJZg+kWQ8dqb7aN8o4kfYsiwL/AAAA//+sXdtO41YUXceXODEEKGKmVdpRH/vQH5inkfo9/YR+YP+hUqVOpWGAKIGBpIEktqt9O2fbk/BQNVIEmECOj+N9WXvttcOvv//WDTfKkBjuQ3cAwKEKBVFVLfm1pNOLbliAaBeY1V2V8tE5LQCPTvR6htomUSlUmVtm6UuP5vD27ZRq4QMtBjgUQGg14DPNA+uNMXqnT/6HxihdlGSUioCItrR+3AlXyDKewW3MB+srsYvtg7ND9CJ5pGqPCGSUum9SFaOKE52vBa8xsVa6h79x/Lly2wCrhAZlAKxxfbNGgxptN+IkRcRxcjee7ADynIVXnHffwPrzIgCIRx46gMZuIBxwRCI61rLDj2gz0Ud1nOCeEf80Oo6p/Y3Mac8pKaB2hzYgo4o/tQk8P2O7fMDqeo7N/B6rmzvgcYOaNAW2Hapdy2P6giaIw+sRz2n4GzeeR6rNtnG5igqpUwqiCkxB3cWbN3g7+x4XVzNMLql384p1BKiVIGOl8cBq4mSA2r3MPKbPwst6g+enFStSf1ncYkejGz9/4ioNBWhU/2i6bQwRcu3ps1WpIoAk48ayjYGjRb0Vt1kU3OteIJxc4ef3H/DT+1/QlicUtfIoAmkB2KMc5cwCIKDBKtc+OPIaG2QbXl42KApZw46Ry6C9V4Ji7jPpa6/rGmdnp/jh3Qyz2XcsJEasgel5CWrHHamA2N5mPndf0+9krr7aBK3oND1uRMZJRstUWUF/MxZdsd7pHXYvQn9dLhd4XCwRtqKmXtUjnFJFaTpBPT1FWY81AMxFpT/e75o0mtNtHW0+tH3wIogKf66TDezv4/Z5mxFFXrJekh4O0P96e/IKAGDUfyhgCNfmZU6QPzsHJo/4R3AUUr92nzAfAwCgNsfGmRoQYI6f7N4uKj4LWDsEAKzi4IUH/TE6l6oaRfDgn82GdVjYxob8KDPBB5jed6Xvc9aIicI/jsGGgS2V9UPXexwA8EJdcp2PJQaHr2+y1X39h3hU/SRT67siji7kp/bn06Vo9Hg1lHFQ4T4p8CdBOUtu0joHfkQTjdL2GAmsoySf2Or8vjThYEX3H1WdV5yQLm5v8PHPP3B3/Tdu/vqIxedPWH95iIK/JQVy7DuAQlvAClpPK3aGh+oFFWBzX+Ua9AHTdtAHfSiBsD3fa285T/ho1IawFa0wKsfIRhPUl29RTS+Ywk9MMarsU5J/QrakrhkQJl9hhQoaG8ZJYXQr4kfIVtHrmk5sQKMvEKrtWBID1ZmJhZ2uwebpUVT51yR8eI/lHfmPezws51g/PeF2Pmdh1+Zly/ZvLFYyzgawjYlcBgWdIxHLJVHeHR59DMxR+rymNpBO5QK5ha3doS0yhHHFYnzZ+Qny8xrjy29QTKeYfvsOYH2ECmFcoqkKbEPHT5pyQwK4rApE7ItOxG1tooox4pLGTuto9xaz9EVgvSaHtDu6exzoFTfsWEoA+tT9wU709uFQsiB/G+KrxX7qvPGjyMt/AwBgtqLIeyLhX6mVHwEA4s9Z32fYtK7eGkxkMFK+VWeL37vPuGoxFORL+/V/AgBpf/rHh/9ftJDTte0DADIVgHSdKNk/m3T4cTbB5XmFfL9lAdmc3V1aI2vSHAE84M59eK42vt1ygL3S3YkplDk6vQe56ThpAJDPZZHzMgmc2jPP05SzXIVJ+4/DDGADAFh4tk0Aus8LRVetjfnbSCe+cbygbHGKFaX9LMVRqSBh4EKKUShZ9gDAjjQOuC9f8ifTAqBckyvrBGNbvkV5rlb1KaczJuKweEz5GL0njx4cTL0zJoEX5TOh+bjWXq75OgBguTpfU520wP39Fv8Yg1Q/L8JMEOAgy3L8CwAA//+kXWlT40YQfTPWYWxYy2zMEbLZyv//OfmY2qrdbNgApowNBmwkjVLdPT0aCRsqyVRRHMa2LI1m+nhHIouNDVB3gh7H0JvQafccSPQCvQ4f0f+NJoEq5qNzc5dRF8SFLhN77VeldH+jRJV1CfyBOreBYxrBIHR0OKhK286QDqnetMGrntBg5aTdH1d3Jgz/bFutAT2+OJHmc2D13Fiumqvyb7DOCkl3je0LbVBtYYD5mTaNuv1desWr4FmrdXYQFsIYxhIsK/QGoImdiOgHcRWVexoEMzh4F3s3hgk631mpxauXRZXeWBT7C/p7HKrOZ4kWcuuijTGCwfAeu7M9JIPmg2nieeghMT5I1eOhDitbfFAQahpkBwesmGySIYYUSG1zJMURpr9cYLapUa/uUS3WuPvjG15ulljfrpDWJQYVWDzQeh/ogYtTsNebue6zzv++dWok5ziJTvz/MEyfFvDVC+6WC8y/fMERKfQXP+H4/IKVmseTAsezEyTDA1gKcMj/uyC7xgpmPMLh7BS2Njj9TAJMJZ5WC/4q1yssb29xv5zj6vo7Hh9WeLp/YAZ/6n0NOOjlzozr7HIBGaD2I67m9DNnObwBXh5r3P/9Fe75ETYbsQiiVJklCK20TWf1+jQihan3WHxpDbjTX5IIYtVg6CFtyYDmp8xNCuK3ZYnVYo2Hu0dcXc6Rpr+zovjkeIKLXz/h5GyGs/MZowPGI99p8a9v40g05tAZ/fw2wEeZh2cTpJkoy26ripEJJhE6TFU1PH/y8QgXs4/4zcp50vVaRAMrTpTEJUESVOG1ERhV0BEDrspip4BbZz7p6TOiYuAin+p+Mho2/EYgZo2nAAwgFIB+9z9e90wPBq/JvxRz6yAwE7sAMKUpHYgloIfw1/Xr4G0XEqH/OAUX+vw4+W83bXk+BSIUaKRerd56KKhuplSEQtTt0IC0YoHXbmLeipOKQ0Dpff5VHVg7aWrJo+8XiwDx33dwYOMgn1EKtt0zBYnQQ2YEYVyFVCoqQArjlZ7jNEHJYoR+Q+djfGcB1jn2npigUVcCfpKHe75glGdcBKClihq7hLzJMwSlftO0lBxA4ftiaq2zrel0gK3nzXrOfhwvS8OCk/2tT/jv7pe4XSzx4/KG+fvlM6nzL3Dz/RKr2zlu/voTi+tr7lAnbgvrSlBKN7WOEQh8DzJd8ZmLqI41iQwXKRKbdDpW2jRwek18EcJEhZKS6QAxLcyj7iJLNj3lBI56IiHF8RiTD8cYjQ9xdnKO0eEHFNMCQxJcLaZAlrNGCOlJUKIq6vFS0AqNiLoOgSeiq76hwlkinTSxShQ6nCqRELXA0j1CYsXlllEPVDgm2D53+G+uOOGfX/9g3/31cg40pSAfrMBvSQk+bUQBx/hCcuKV+hujXSy5o9TkWBP/eKY7vcZ7pqyu2eHcegte9dt33v3EZAnS/AA2T3H0scBwcoR8WnDib4tD9tZvDlLU2RAbapgkOSf11NSgxN8Z9fNPWONIEqEBF4Ua65NIRVVUb983sY3eW0PPQ7yu/Z+xqxm3ryjQHx2EQfTYboTr/tfROFq5yP9mhOPXQmbExY5Hxzu9VjpU1aGo7Ru876GLStt3njRHUMFx16MT/+fhj0E+q2spmIow3T4zDfF0kuPTz1PkyRMbAVduw3FIn35ETdnM32X8c5qFz8Xf665WDF0X2s9MajpCgLoni3AvGGpOa18VF3GcxgHSTOwX8eGF/rgxGSjJ7ZC8Sfc9n8SnYime+oIR7f02dPttSGoFvm4Ydcb5Vd2+jg5J5ls0oBYK1PpdRQr1+mvzgD+Tkb02Iz0XnhPimKEUbEre+X+pOeUQUA5UBBh6jTwqSHDBKqICKCoivE9csPcCrzpv9ZxxASMI3UfXiNcpymPpMaKOi84W8f95DkV5dYjhfH6oIoN0ybWAENxZ+L0MnKvxDwAAAP//jF1dbttGEP64FGVLkRXLrmTX6HNv0Jc+9qGn6RF6wN6gKIIiaIGmae3YEVPRskTuFjM7sxyuWKQLBEEckSLp5e78fD/FDz/9GDgplURalewh0PuQkuc2BS9WbKEzQkU67MtWohgEmjTBqIpC3A32sD88p0WRLpxEEpIgIS3KIs6gAZgrToPZvGvMSbPZ2HUTDRIcd51PfFHqqFLAGLkk4v/synRNZGtkA+RCoPpaJdKuO72ItsOuiwrfv1YocxtFgcSokBZNOppUKlzBn0V58uKV8tLx94f+2QThkTDNwCv1YMjN8oOFmipwC5Rugb8fd/j5l98ZAdBiimOI6IVqPus3OfTdbX0WaQOS04Yir5L6QYXc/p9TqzKZnGMdRNvh4usX5EAQYQxnoD/MqrTBcSsoCBNkRtX0GMiQVgBB2Bn2r5SB5yO6bYP2Q41Qb/Hhza8sxNdua1T7Dgv2do5ez1S5paCSLadGKuyRK+giNFETa1MxdsHo9xOvibtFBXsHT18tsLhcYX13h9XNDVabG3YUmF+t4acVirM5K4ROaDOgAI2qiC568lPnbd/ssN/9g7qusX18YGTA7uE9/vztLZr6gZEN3dEzgoWug48NbsAnZ1B8UXHHrEqdhDN8/c13+Orb7+Euv0TbUbHvXHzuD8JZjtzloWI40jsBk4gfSOcgEwKKVXMnCc7Y2tLzRunZTs4m7GZwuVri9u4W68011utrVOeOmj9cGLAOA61wXalQxoF7puLOc1jwEQexMwvCB9OuAs/D5OFt1hpRMk9z3iT5p57vbnBsXlDyIYwck80x36vo0tpsvXDHOu4wVXDrGavJsnb6tXLdGcQSbTy0bk5ZzCZ2yVkHhtwenptUiVYoXWECRCsiZdcrZLA+rejrNRaGOoZsb7E/G+sA9Im1it4Z9X7SrRlxLdD7JX47BR/6PQRz3+1eeH3OkQT59w3XMREuIssj7t6ae6E9TlAL9tomxD9WGD56OGYpAZIiziaTUxeFfIxpRmQzKF7rCBUAukbb9dOF9PPB5+VvEs2Mej/xXeuScooTBFcZXTt8/ENJ/ssOqOsDmqbBx/oTnp4+4p445tst02yom90cjjg0z3h69wf+evsGx/v38PtPOIheD8vV+ojYKojXqfStIF6jamGHiKDyQk0klMMgoRerPlbPpk67zIHobe95fSbNFo4PaAdoC3RCryIY+XQ+w8XrJa42ayxWK7y+vcPFao0vNmt+P2avFiinVRRVppS6oCJjx3std3uYhxuQysYhIoAmwkUtjRUYF+hSYdOJ7aD41r8c8PK858JH0+yw2z4ydWx7/w5N/cSIsaYmDv89PyuFt/PabSgROcJkDDE0Nm+gHU4pGuhR2tu2Z4mdOI+9IEC8BMqhLLEjG7rFBRzRv66WqFZLLtxfbK4xWc5RzknskByLKobvsz0qOZPQ43Dxd9PHLT5BovvbGnbULWT8NKn3J2hHnwpr40XO3mFFEqnQU07pPttwHHzucyMhWRWpI+cd8PLt2lgMiwSnNnX9+Bz/Ph8ahycL7gzFiVNAx+g58u8YNiCHTjDB/f/5mKNqbX4w0OQww9q9RdSSHz1fPl90lM42JD3nL17QazNaFNmViIpqLc4dcHkesJwVWK9XqCZEi65FeLMdLZyPFS8SetkzoWgAT1cRchXdg4nBojbAnlEcY88yIi2iyJwmn8q/Z9oHJ7+9XTrljrFr3yWXtInA6fXaleYbEiK8z8V0P9VrZb581bs45FD5IG5cwFBEUwX8IkLb2J9nsYgWCNJvy/DrNV6gNUOLAhzzU6GVXYxi4UL1FZJduxHa43/r+mxyQh18LnWB+I95nLTmBB2gCHIdZNNNhQ3NbbV4FY8tcdjH+IyGxniaW3ddh38BAAD//7xd23biRhCs0UiAb/gC9rGdTXLOJv//OdmXzZOzm8XGGGwsEKBRTvd0j0ZC9mbzkHnh+IKQ0Khnuqu6KuWDlVHyHOwWnD8giZHxGw1v+LTaEPQCsNubOCaidwaVbEbcfZIfUHyhJPANl0oWi1ZJjz6dVyobRU22nSx2tsM1IP78NBY8CMJ5tQ2IUkoZMcs8Rd8k9Xl7yr7d29yV0iNa7urE2zMXfCuEWvNBqpmciMtGrSBlUvFxdAq9mxrBiqlCQThrV9so1pOsDJXSKtIFsDatF4hEg54LAZo9UUU1ksamcLzZpGrYIEtxcX6MycMKxlJCOeDvq9lkkTSQDt/fV8+brurqdzSqwjXE9+69kbR9wRFb3kXHFAFB26rOK5oAeK/elIUm/d+oCEAq7OlxD+nlEIPtNX79eINkmSN/mKJ4mGHx5W9uHdgtV+gbg4NS+uzFj9pErgLqRR3T0fXiiZILAAAgAElEQVTsrRYCtIuP+03BIk0lVYA3K8xfHjG9+5PthoYXVzi7ucXo9mf0T89wMrrC0fAUNh3AkD/8YMDPUDbocxUxPTnCwfEhjm8/4HKVo/jtd+zyBVbzGR7v7/Dt6x3m0wcs7qfYrQqsi21gKGT8yuQnb8NJOJecL313qQgwOSk4FbQQkJBfL/WtAPCwWaky3CJO0zV0Lur3FRcITIDW4wwkusfGMxR2K4fH9QzTyRM+/fEZvZ7F6GrErQIffrnCaDTE+fkFV7rp7Qf9hGyzg6hgE1FFoOHTKacQ6ztBRf3zWQXGgEy26MqSTm/27tFF9fyxYaINpva5x4noW0UA/VnRcs+8qAXqQgyXBZdiC6nPcoVb/Hud83ow9ErzT49N64TGo7ZNEDqSd/p81WOhBNtXuWukv0s8sCvZ9n11aGxQ2NUm9ZS8WqiwZhZkmUWee+SC2ChBINChEfvX661cq2toyrTZE3FRVAddk/6u3KkbjPX0ST5fddnxxyCGjxVKoFFoXdrn/v/Rnp/tjYwLUY3QrSwVNtvOP1+9jOKEZQcAV1pm0axecyzmL8iXWzx8W2I+W2IymWD2NOMik7IAqRg5ENontU6VmxLrxQLLr3/BzL5gaBP0nMZ359EyZvbswvNXUoIlgqwQ6T2+/+K+41y8Pnj0tyLWR+mRdI9kS6+syVBwcmp9YpxkOBtfYnx6jtH1FRchxz/dsEgfU/qHpzCp505x4iL95Bs4707CAV83qIY7JgwFJpRcfKJ4NMgGvA9ylbcgDCHV+CImzSHak5UkhFWsWRg2f15g+TzHrihwfz/B68sz5rMp8pdH5E+PSKsNksqLsfZDDEO4h/FoF0e7otW++0IS/XcocQvvTK0EvY2utRlWZGtI+4o0QZ4lcNZyCwR57o/H1+ifXeBwfIbqqI/q5BBF36LsW2ytwQomiPSVleco8DOZtAWE3Z7ieTyfq3ay/O4V//jQJJ2dFcoqAOtV8u+Re/CeUthYCspI8dAI8piwVVkd42I3Auwlv82hSRQiNPO9c4vRzRAr32Fvfu8Y7ff7PVyzHax9Pf9lvFnQEEZzY21pMe66R/S9Rf9GMWizXuGgnzFAQ6KiZDxJFsNHBz1cDAe4OT9C4nIkdoP1+pUZuJSPExORLX1b2j9vnoEI/in6zyg7tUobvz5T3hEnmYlcq7ZwGGkL3opbAiXytJ5SCwCJoquobozAc97ktqG1oHd46AHGVJh9lGMJmKpJPbU1aaFgw+h3Kk4APQaQaOg+g/KSuNhurNnbzyQtljdzSRT1pxjOexvfMsiMCDT3EsEdILjaRTbqvE7IXIwchTT5VweDxjmpVoWA1SzqHAkIK5uybhev3YM0D1ShS3Zui1rZvch7U2OJ9jasXyT6DvE9JtCetfxajCNvw7xBkhj8Q9q19qaNRNEzY2wg5dESkibdrFrt//8zu/1WaaWV+shGIUE8AgGMvbqv8dghJO2OFAUSDIN9PXMf55zbilWNeXEwqAWfEPlykqHJ2SmTk0HOi2Xk6sZpkHQKYCmIP2l3ahM2B8j63BPkigIXgy0Yx4GzR2S05KBG4iJcgSEHoVHhNyN4Uplw4rzHAoItTT7EwiKFvg8F75alIgM2p5rnoIbIFRhX9fePR62lH/PUS6zXazU2H7i/lVFFxpz4UFErVSTRBJFiIzQn1d6THF4RxNgHI2WIN6tPO6ECEJcHcl5TTUiIo0M36QZZO8G70QDT+UoTPnumXMhaaRoAPvTSlYVYEGLML3QC6/yZxbmpJutVGKN2/eLYryE2BnVQmkkBNGz56BxQBZX7BNgqjJJg70tXYHAxQFqcIL8awD9cYLT4BMyXWH67xvyfHyhmD0hXO/jtnnvMtzm7q+/HgWLljMb18Kfd42USLORINlWIg0cJAZ/vsbr5gfnNNf7+60+03wwwGI6QDfq4+HiFwWjMDihRBXrjU5RJijJpSyscWlzaDn40RPauh86HS5z88QlniwXmt3eYff0X99++4/b7V+yXc7jHFVqcnfbIXKEiXqLqzAA24pOm7Ujcz7/KSaoq4vo7bPSRA8EUi+i8mC08V8bU1ilpSzjLVKknXiu1UpxeE+rhBl8+Z8i6Gfchf39xjvcfzjEc9tEbdpF1ZfpeRQDlvqkC+gBvhsD4CDpMVbqyLOvI5Yi7eUid+VcHr1kv3E9VUF1vQeee4Tw2B23iiW5mxqVHFKQbukCC/YQDE1rbU64K7IKojvXj56RoaPX5vF28Zm4vjZj3z+gBSyIwtG6r3Drh8pVRy7aYZrDb7QO3cLvNw1pvYoCV5sAuKBXbOkTng445Nkyh1xwMTpwoEosCFkqmkf4AzdcSHjZkD9hLssCLnsMhjuz/HYd4o5XiuQJYbVFragwUUt91kU5MqXQB8luovexy8YC7uynmsyUmkykL9k0m95jNFnhc50z/EZpMgX6/L/ek6vDYvHwuad45Vc+pg33+iLZrsYaGWZnpeZQRWq0ottq2EFUIWlR9UUqfC7ychfo8K+WX2imIxPk2LOTY4WDfpRlOLy+ZmnV6fsZCfb9ffeQ++xT8d/o9vkamIu8UgplS4p38Ci06GFpMKBAUrPlQ4fIiYyo+2a5khEGim5Tp0VDVbrteccC/WUrAP53cYjm/Z+0X7hJD7fjWj3igvvu0rjpRXC+LDX93g7kfD9cOFFcOvMpHr3ONe7pQcdVC+yywpgOEf09nw1FyjoQPT4dc4e/+dobueMSPt60Eb8ZjRl1sSAOn5dnvogo/pZm3HFAl1XX3gp5wqj1VxN0X3DPFiHi7cXXzNl+nOdhXsReG448jAV4azf79rx2J6ktZBTBck9BtpJpbCGKSuJUywv9+ZTQpwD87ZPmIYNLR8a4VaQeZ31zWg/GjHH4Vzw1P1d+vHX/AKGqIiQaFrWggRuSFSbVWheqY6E8RwrLNj3MkxSOGvQxvuw7jt130SCco37Bfke83jDorsQuf9BJFMFwzo9WW9RbEpYqoFlpAjQNR25/TrEqyF4rc4+eMjN4F8XCJ66q9Z6dVfZ96/ew6hB9WsNTg3wJ9qz7T8RTo0/4ZAm7l5TMiu9vBarUO9L9DCRinwjQh4NcOdCLi29E19Wkiq5pfU9RXfujziUJsMa51nbDCdDxfa+XHaHVFZh+yJSqAGZJB/AGJz7hJNCftBDFhiQcRna9a1NNoCsRL0cMKx4TGr98L9LdOu8NzMpSCtUTk94HDfwAAAP//rF1dcxpHEOz7hANBDEbWl12Vynte8v9/Rh5c5XL8lHIsgY2FQHzdXapnd/aGA8eoKvuCSirBcbu3O9PT051aX2mbCMOITHAxcEErdUN7FeVvOOyj1xuQ+L4Gq96eGqq/XADPuGoXEAmljQZUu3TIDBcKaWxODOqYZm9f7YMhiE9dhbYBLmBnIxGLHznb3Qk+EIzgwlG7PFUYtRNY2sQ90KSrhrKS5UEIUBNUT7E4aK/QvzeI27rx9jZuBEqjYcVEhwIKsimJpZ8XUEwapcxmLuKgMaDvx2RJ3tNU5OjpW5e8Px1c9HJcTYZ4mC2kIiEWjmnh1dHjBs9nhVMPVBFSq+V76new96A92vNWe7qf/r5NYWuP9kZwKvk/d9Q4Dgq453JTq9MYcTfBI4MVPjxpjKx/gc6oQFGO8ea3W9z98Tt2n2dY/H2PxecH1M97zKffpJVAtAKYNFXOJ8BeZWwCKaVDBvX90lV6BFRhBUwFBSv3+w43jfkUs/lcwsFP7//E8HKCyc01JgxOx68wvroSUIAaD/3ewAk5il8xbU/oRHCBbjbAaPQO9fUCy19nWE7vsfo6xT+fPmLz7Su2jwukpMnulk4DQe5VioiiVEnuFPy5FoVGncs30RYAoMaxHvDhaOY4RCDyYimuYd235sgK72gfXOQ97tOoYQfFyLBZ7fBMsGO6wMcPfyHJE/Hcv313izc3r3F19wrDYQ8Xg767ZlnTSfAoDwiwzJugBajqKPRAH36H/y/5P2dEhgJqq+EvGe5AasBE3T9EcNII7zgfZW9TmTRsAxXUcZY+bo/c1rvQ0qTWQJZehxbAYHv2xQo0igKLwNoHoRWo1r4dJFQJfJ/iNjjQ1CI25Oh8/rwySD8TeIqoapLPCrITOQSqnQbN7tUyyrRNYL+PTtpf2ZEbjRqlUmqgEXsGgFoE6nV18kwSUVEk9mdPWR0f7qf2yXOpxOF9WhW846EMhPAf7kUFtrQqXbkfl09bLBa0Lf0ujgEPBBnnC3y5f3BV/+VaKO1NwJVKUJIK4J84KU6vls1k+nmzk3My8X7yZGmIJRUrUlsGiB3R1KAXuz6QlSZptY9PjDNI6atEPM9Kti2x1Y1nHe24alaUd4791ilEYf9ucoNfRmNc3t6Jx/717Vvp6e8PB8iLrgBhtfeEFw94Zd7B0VPLaoNMBF+b6kyk7KUaTQCsLXAeFIp8i1m0LrFZPWG5esJ69Yhyv8ZSRPqmosr/+GWKzdMSi+8z8eMnvyBPEgFvudZpd1v6OKWCs06N7Nz/oBr6o3EyIbYUf2Vj+IJBWVOVPxWLXDLuVjRK7Q/EzrA76GH89kYs+fqXE1T9DvaDDradGGsWQ3imdDNsK+ekw2rllozI1LXVbTa1d9kzuhxtgCr6SX/+GY+LPY90Xb003dWiDGm5iG1bqnqNnwaPpa3LJyqqGwXznOt+iQCWmYTXO2no/Tm2szwcbZp8YO/+h4BsiDlxHuAMs+dUat/YYg+E+NoAdYexrfn8+GVA8jEz7rBlQUXABSf0/dI/G7FwfFwhJPGiytyOGDcVeYkiKzEa9PB6OEKRQaw1M2pN7OYiDppwD2HcFycHBUL4ed6bNjMtUlqQQluN46hh+MYeUM3IwNp5YTrmQ8J0jgNjcEkrVBZchXJfHZ5P0hLoQHB3/jfFRqjdcFQF8Tmyt5jj8L0S0/Yc+55+XoPkejyTo8j3qTuGnlb/4RNdJv9Wc64NygQVf19h55lcesF4p/nj2x0MAKAxBnAM8nC4/FBjAeZWTjehEY2vZC4UwOD5rc5D/BwyJXQ9yud6rZGwtkyM61q8rUMWW1MbgMXlh74tvHDOaPstNQhcXKPXHtMBgACSv6ftmMDl0Y1YoHOq26NXFACAfwEAAP//jF3LUuNGFD2SJWIsMNgwQMCbWWU7WeWz8gX5u2xSyS6bLLOYIsBgxlMY44fUSt1Xd6utQFRFUTVjC6nV6r733HvOyX7+7ZfWRPMKbRcQpX5R2R9WFSff/KVR5YM+mlwUtFhLhf0YPz7TCjkPVMTjNDEIPygIIg7GqTBLQQoMybaGE1VViaZB5gk2EDBAEJ/GB59+ACPFUFtcbRLS5+k8sYIj/y0aIPJUr6WlVTivAgbE3qPxYaJR223QCiC0jVtuWFiv8d6f9JBiRDEfDLR10flA3oJhQ2m4AhSNXZjMpYgM1mtvA9EBW8w5oZDJQ/dSMsAiG0qu56D27Qz0YlLL/wirtcOXh2/48viE5cZhQ/Jv1GbOKsOF8B4z87sPk9VbJyUK23GHSAxwuDblyu4fPFZJUtX34vYdvjMgeWbpdzKXd4Ia23x80sncSKkcMa/USVWduJYFnftlx1ZuWK7RPD1j9fcd1ndz7B4WKF/WKFZL/hwJDJV5wQuzJBWSXTp0F4l4JGjDbhAJTGnHRavaPLTd1G3JFSwSn6MgmDikp9MTXN1cYzw9w/XNRxyOJzj5cMHOAo5pLSV26x2qgyFbYmWkaUBilVRNmi/wfP+Ix3/u4Z4XqBefsVt94/mzyUoczj7i5sefMP3hE5rhKba1KHdJ3OEUAHBePduS4l4EN7LB5CROv/KetU4nIPMouM4/j+oq99S5AK5kDttmG3ibBGoOS0ymJ5jNZjg/O8flNdkNHqGqChY8I0qfi5TQ4+mTTj9K5N6jvOzb8L1d7Xmfwx1VJyKevQ+qepLn+L0zHly8tpjY3XYnmz3x+w1Rt/97XW864nxe9Zaq7oWssbQO0uegCXR6GAXM052SNjy7dkLZR6TuqAAzixoxn3DnE3O7hvi6g5CfWOVIR5TTzVA4/aXSH8y/N16D7X5r9eu1azOOaKldawFVD2BEGPsAfBTahmlWSBSIFaygvPVrMxeroykhopLdzjEGVP5n0Ju+S+HadE70uNDAuP+ZtBpT4Zr+HG1DtJUxbYG4+xuHl2WN1fMa8/mcE/7b2zssudL/xPzz9WYliUdL8cV3HFQVVLmntVA7KmROiRI1gXnOWiLJutMEKFmjpcbd579w++fvuPvjVxb6s7XAqbUe6ajQ/kYWd5yAq6Beo62hcYLUZAVeW2rrL9iN5Xg6xen5Ff/+8P0ljqcTTC7PMB4fY3x8ytX84XAk4DgHnS3yUlTgKTCsLcFSwInu7fX1BWWZM3hocRPPQ7P1LTLRGWga5mu2BKg1DVZL8d5f3N+zo8HXxSNX+BdfH9imb7NeMkBQNhHFzHj83sTVxiYcbdTyjp6W/9QmFirP5mDdfvY5mNarKq+L40HTip0eNd8Rk3nTlihPzjC6mGIwOUI1u8Tw4gzV1TnagwGLHhIwQB0TDBBQJ5Ja8cl5Qxs4d06o6n4otCYJYbu/pkoDxX+ss2+AtjnEQajv/YDuy02+3/b91pGjq9tBGgDWSTqIbLgB0/0Y9AIA4Xklz8/0kZwIRweXksTfXY+ss5/t2+71xVipEwkS+kA6Run3fAW2CZoK6fj6RD1v/T7RRtoxaaeSv5/0Obn99S++pzwvdBy1C8i1nX2yHGQdy7l4nee4OxednpbU5MlVQrWYSNivKoDZdISjwwxVNeL4cUDzvN7wrDwoJMeiOJxiTPr3PNKNsWp9rUJ+nBdFeQ/lEyYcHosnmgaaVMC7zlpWbTbgIB6/eGwNoC4LcbAJgH2yz+WtF1ePO3phwvE61CH3crrfbpWbHlzA7BnH8UlcKIjnhQeJ8szHFqxP0AgYQfu5LzqrxlBsOx/PBwND7Pxez4I+W2SsqRa/m9KKb7pL+7pGnfdLKRn2POkwCjyPH9GBesB9f68KdMTvuekA8JgrJcbGg6kV+rw4pyeh0x53Di7UA/gXAAD//7RdTW/bRhB9S4q0TCmSbciWAyNFgQL9dfkD/XU95dxb70Xh2I5lO7L1ZfErmJmd5ZCi0+YQnWxRoihxdnf2zZv33MdPf9RK/aSJiHsmmVYk6oSvReF/nCp4z7dQtLjd92hvGgcmol56ahifkbgBqJWgJoHBU7QSapPcxCTYKfVNTgcCJ5ELyBX3sxeN53xRSB+9igzGvndKURgGFkoZlHVdB1GKg8XF/xbqI62B73yrAInx6HdhSrbaA3otBfV5JZbDerUWaq23mqCbnqTDQLfRY63BEDeLROmTCrp2usFyT0XlUoNfRQAJlKBA3PH56O8jFkQi9XXqt1zcf8W/d49YlTHVRBC5VHDOeMiUytpryUt/dHuBtYOh6pmgDzbhfYtr6AXvV8z+L9T3/wIAvHk1VD+NIV3Ya2/NFgAA07fNyQ9VEOsBRtEAR9sS6SZnK0ECADafb7C+/ozd4gGrr0skOVX0Y1TEGCFiKd03GMEZY2EHDwBUDg0IgOZv7W6o6gTqKy1wmhcsiSXJm5zNWT9gfnWF6WyO86tfMMxGSI5GSKJE3klji2hsJIhYOBTbHI+LBSvU7h+vWTuA4riIE2yyKc5++x3p/APKZAwRm2gAALVKCl07PwAAINDu395Fh4Q/JDYaJ0oRLFtezY2IlfQHUyuMfJAXZ6NxGIvNFsUs+fUTAHBxOcfs/AzTU/LwH2FM4l0Dx6KClRZcHHzftsYO/Rzfj8ufCQDAVIBsca+vuqSYE23QVXSP5WA6lXqtklMlm86nvflaQVehPLtQO0N5D2I6oaUJrUW4b/G0AIBzwtxSoLe7vsDEQKBRx1HYuMMnFnQOtQvqE+7TJK+7idfz9ukXNL95W5ionbT0tGbY6kjt2SotO1SzSYWpCgSnl6r3f/ucProAwAE45NobnMgABMxOyEmXR15GRMDNpuSE6PH+AXe3X3B3+4SX5y0WiwVWyzXHgyTVkbgyOCkmEBA9iFNOSIUymfD87CIjiusLCJVvIaH1hvVa6oiZVHG9x/rlBrd//4V/Pv2J4+0SUbHnsa8Cfbnz/vqxaG6/MiMF7J7AZDoXY5gdY/RuijSbYDL/gJPZBWaXl1yVPj2/QJJl7MefZCkKV3IvJW00Rc8n5V59mlcq057H4ENdtXQaaCqQPCriOTbfSQVHMNKawUoSa81ft1iRU8vqGbvnFZ4eFri/ucbqeYnl0wP3EdNr9sUaw4g2HSVT+qnVKa4Oq9HdrVjfDKMR6TrvsABAAE6hiv9gwUKtbMkcPBAAmo5R73I2xNFkjMnsFMPJFKfvf0U0GmNwMkL17hg4GePFlXipc+zqgvPLKHFst4o0ZvHLItCXBXy3levGd99fm79I19KM6SnUvAEAdPOL9jGIQOJPBAAoaq2tmI7P2OTa3ar/9x7qkQ/d9JsWMfQVQLrp0A+yyHS+ffO4uWS78YcHDco3CkHNPNq8tnudoac79Ez3ABbm5vSB4eysbwowllHKjlMGNNb3kCUxFURSFl0TEeMBuY7UFSZZihN2/cgwSoBRvGNBP/1s7QmX7+R75fO9CGYmg9bm3z7UnSBcJ+t+Nfpr7G6m/eUKpEfSsmhp//rdddNZm/m/uyYL2F179nQe6PUw63ztqhab1xY4eU0N9odq3TjAdrMJWgDsP+CdTYJte8cG+HBNbZ6rTLHXstnUwS3xrQ8qKqyORfBtDNRqwPfFx6RU9q2mQ0cY0AjKd+O2N/6UEeDjVUWHQ05BLANiW3oBYAUWdKzTWkt7Twuw0NygbeqvxJL0+YMdF43tvewHrTOBsjyKosA3AAAA///EXWtP20gUPTN2Yps8CCG0uyuExP7/f7Qrbb9saUtJUwohOPF4dV/22EkAVZV2UAQa4diesedx73mknuFivhGPoAvb1gIbqBViQ9yEeKEQv0i2gTnUSXyTr4xZ5ptYRj6TdjN0o8RjY45c430vwQCD9iOKlB0SOCEoqaknxlEyE7EKCmmNhVOca1VNLTAR1IbH9cT66OXfmrqiRmwNlkrHGTfkWKHOH+qG3V4CQyHw+Yd550jLsNtDxRZaFEH0bUTK0AhO4UJQuI55a7pIbdMxx6fmhRp958PjD0wnc/z+2xlD7m7uN1itt9iFrdjvOeH0iTwazJG3q+rbW2R3+jscfo7i8tok9NIGsXkG30ANCFECIAkizLf/DHkZJMP+9zEVJh3yl5QURcwd8xbXdPzsAoPrOUabaxT3a2Q3X7H+9xabLyu4b4/YPmx40ZhUJaMKvHJymnus5dy8ANJrVb1O/QdpdJJppPMbr7RRDK1kAtvcfcGGKAMf/mZO6/T8AvN37/HH1TXyyRRnFwuGuhbFCGmeY00DfpEB6QzOzVAvCuB5g+y5QuYSDPICyWyBUm3XyIWg3xuyibJava4DfccBtV5iuHZdGEQ/W9GIJ1kfuOg4AfQJT1D9sGVO8U1bDiCbHhYxJOHCbNAKC+1qbFaPWH97wOrTHT4UA/gsRT4qGB0wP5/h8uqK36XxOAcFsFlfzEcX+Ep5SYTp/ygmumf2Z/1iYniVUgVk3LQo/mHbP3vHaVKlwEHMwa96Puo2DrTKvCKyw4KzKtoncDkZU9lGKHQRCxZw4ONTGXvMUQWRtVSs+ms6BlB+v9kd0XEEM6c1lHkfxzSE+JyI5r24vou0qDttgyOoYw5QKMzwV2tJxKV1fmg6QNqmjwzQQafeAKsfgVX5aZNPv+mzXN5xWz2tS4bx06Z/kLS6ILSwTgZDhjGyfk4i9aSSLZkjzdokocO7DtCBTudYzraEVOy8SCDq7B3ml39iufgL9/884ITHwVKU+J0411RObAt3tcc6pEhOJpicnrKzyoKRUQt2V5mcL5g+lY1HImIJ0WWgoAQj/vSHg69eBPvWwTK19R5FnviYKdGRQt2g/3gz57xacSYYVo6z+6vlkqH835ef8f3rZ9zefGRY//3ylrn9oVIuaSqaR7TOKAg5wR6yAid3IYkY+KH5VA3iSS8smlr6bjRRq9sDIYcoyq9i1J+XrL4Hnijnkw0xOMnZvnD8/hLpZIpiPoM/PYGbFKzYTwr96ShHSWgzojpgxxZ8FZ4140+0jQw+LXh+fWYERUDQwHVQdIdTN5pGWFf/NuedoIEIqZOoZ4ezHVM33etDdH8Db8KAVs26PtH6j1vpFw3nsobVZFEvGGB1wMuBALPUtgygiQSa44zvoQyau/hJDYC3QOR/tjiF3dl6cs/phRBJTduEtg3fSIPiedjVHa2oqkeToGw+URxjvrgg3Qix9oQ8KTHKPWbjAuMsxXSUIUs8Mk/rMlpfB46i1rANnCQd+VyVUJITpygnFq4NusG08bhusv5JhBxuPN97mjHxvME+/jtBL8f9Htva+qR11NopXN+0bqiekHekYUbXabRAdOYRGYuaOTm0AWbeQ6Xd5yMoRWGrlO+ybHntvF4Y7tu6Hyu8wW9s5avGh9/EAt/ybJpDQR9BbnXkMMX7xyM2l3HCIg6uHysNOlrp3GRFSwFQEsrldjVHB93TkiaOBTSYvqE6BPaei25Qa4Fo32EBI2pjctexoKCsm+gaUnjv8B8AAAD//7xdW0/jRhT+PGPHIQnkgoiqVlUf2of9/3+l6lPVh2pbActyCU1ISHxZndv4OMDSqlX9AoTEdjzj8bl8l5xhJbxQdN1hrkjmQQQPaoMDCYzT1BxTkhe7hNTgM4lvWQk+zSfex12elrlczx3U0vwpSdU2CIyUKxpUmDhIBYU72swPjS/gLy8G0UE7CrpoSiWg/ez30r4TeL9MzFoTcZsYyeLQHYcvdNvt16gLSf9A6QJ8rLxIi5Ndp2gwfS4uCDw/BavM2y7Sd6ydMJdpCEDRBJz45yUPNk+ayvwlc6zXG548u4tombcAACAASURBVK2cU6HijFJNUjgVQUn1xpPr1GJ8UrJSKS16i/kYw9kp/ry+xerxCYeaEoGMJYRESCjnVnPjzFJYSimKAiXDPPUfHuqV6QStXaDsxWjS3v4HTrV3NHhL9EdEEJueDgJ/JqpFFhUAqBgTpYp74KpxQMwGGOYjtJtnzH74DsunCvFxi+pmhYc/rvD06TMePl2i3Wy4m5MTxJREG52GgJ6lU2l2STC/RiWYOiUV9FyP/JCJCMTdokByT/JLWzTY4nH3hJuPv+O3X37G6fwck/MFFwSI23o2X2AwOuWHVSSyWhggljM0zxWLcIUwYBHAOhYcXI+GQ1S7RlASr1yzVL1vO95rb8uaFHC+BTf0mwVwXWeqP45Bx6JR33x53Y0oaVdQB62tNbkQF5MUwAXZPxU6SJhsfbdBQwibwQZ3V/ecmEynv/J9tVwusViS9eAIJ5MSk8lYE9j+vIIL0dO59r7UV7/yP9qsY8I0q2OxoyO7m/qVyrVdf0MyUeJuwn4msJeZUnLMepV6W7+Fb1wn6xmyC4xa2bYiQOOCBat423nUCm80aL2H4VfKZZOOQcPUAHovrW1ZJggsOmez8INek/3hoLY3VTpfUblW6pV+n1Y1D+izlJCfDMtU9BWqV86wd5/8mxCgT/r7yAQXEDWq9u+oDrT2DocF4aUTwsFvvfUoBblHSAD3FluP3OTrbRZfJdTK0c202zVsHXp7e4ftaovrj3dY3f7FSf+GutU0xpWgyahgUeajdKCMtRsKfWYVnFRzwd53ASHJCNtwMFpIhO24o6wCSGxH6pSQE0uKx6rA9OJbnH3/E26ur5DtKhaslS50jlWzR0EaJ2dTlKMJPvz4AZPZOWYXS4znc0zmC2TDEuX4FLEcYk+SdCTeRDUKttE88Jjt6fleN737RlSppXAY4wB5EB5rtKCeIL6k30q2xYeKf2b7LScMJHy4ur/Hhjv8N7i+vORO//rhGuvVZ1EJ5+B8BzJ3pWF6ZgtSPrJ0edq260j3fUhUVFYA/hquuPN+ZY64rYWh3UJKqJnWEALW5AgzOmFEBFnufXOxkA7/+RzFfAqMZzgUJeoioBoErOpn1DFgT0FtVnNRpA0KQw4hIQfY3k21bZpM115tKbS2JnHh3cnr/c21snk57d/16U+fzdBZ4aaO4tG+fZH6X67f7KSTF4kCYPRMKwa8B/k/3jpfcXUReUM1PyWK7yHQ/gOxVttMeNsoseyk9c64JFTQK6gOGMz8zRxAOOJfwRN2HXSLQ0J3XBaSJEQT3fecsJKwNFmGDzDIC8ymZ5idBgzzGqNBwY4nGeUlEFQSrW123lEtqmu1Uoc+H5iaW8jf9HunndU9Q6RwXSVovzmjBeWf+/EhhB4h2aLa8nl7RrEP7zrBcLRB6UYrn99p5hw0J2PKA80rTbJTQcah7wD00BQe+U1df2se1CrOJ3lTnj5rOZCPR2zOeISgFCxkbR4qpbuq+khE07TrLB3rpO9gcYCnoxyLWKb3aiHOKAwi6isaNR4BYOfq45neTFNHAMvBrFDFiHa6rtasdQU/LtaQFpyza6ZjWPOa578izkzcnsaLaAfsbkBuMiou7BuyQodsEGOOL5Rdy3LbNhQ9AClRkSwpUuNOrS76d/2Efl9nOv2BbLtsNnVsxyPLtkQSZOe+QICSPYk2iu2IIgAC93XuOe73v/7oO9XFH+CQgZkpRWu4EGk+b7qNIetZZxbIpKdDAlCp6NPNm9OYktT5DK5zvrFTZypW4JU8MJJUECyFqjVaKeLqu2Y9bKPYYVlwpqmOMoA58VEOQZ7E7NTAyDx2zOSeBLYBTU5Q7yId4mWRV/tpLWljm3Np8k69OjvsUOjiFGlWzWCsba1Jlwkvqh0S7FglzJfPzwd5MFleyseNSxAe6/uRRMQAJbKeJpZyOzXqWEvbAFhjskMxrXB4PeLl2DI/wP7phP3TK0I3wbF2KKYLDrI4o099TE77ihSOVHZeqkIjw8/3kVRDBWIv76LTr/eKMqPQGxukcdZtbKzGP59pvtt11cGwZESENfkcJGlkUnF9++GvZw6KtQ/0wghL/ZpTYksleZK2QxF6NHffcPp6zwmB+vYRz1/+Q/XSYtYAc8r+dieGoZmMHieGklYATib1g2Yxk2j1ESAgsldZ5cPmSmCbpI1HUimzxRXWmw2ub3Zc8f643WJ2tUG1ukHXT+NauGqOoBrYnZJDOkaDaKDUqoxMCqvrpZezc+eQwBgsdW+v4buvEYQZXch+9kwMJ9cjwxnq9s1+UIbsUktMj8gi7WPv+gC7ZmJPMgDeY7mcYU2cC7/8jI8/bVl+cL6seJxUYA4q7WhG33q8BekTovG/9MprND8wJW+oEsTqN/cUWpDcaSa+jrwieQD7/vfb2WXBtxlnM+Yh6T9LDTSSnkMk+9jsA7dlGRIskc5x2hJgjoNpBUN5XMze2Lg5QFNeAroMjTn9uyELfCI3y9cK4YwfIb0GNMFNbSHj+8/RAsWZQ5DNQZ+r11xyHsZ9uvH/OOkphVaziAGdCQS1y4U5LEo9K5Soj6aKOiOaVuD9d1+fcHikoPSBg1SS4pP3b2iPVADwMLF5mo9C59paDVrtNR7mvRgSPmqL+7Nx+bgGrszH1mlCPu9ZTJ/hwL3v91/+xee//8TjP5/hmxdMlkvMt5+w/fU3LD5dY7PbYb66wvp6g+msEt+B4eVii5jTRoPTdDEocU2OPiV2mMeHqvH0vE1nzOI/KcXHYTtMMoQQQqjuWKM+vcr78yte9k+oD3uE/R0OD3e4vb3F4/0DIydODOdvOJA0dn5bT1ECUJ+EgnAkWtJkR2Km3N6ctGCplXR6Uhf675AQQ1lYURhhm3IXcJuEE5K+4wQiIbtZwa1WqG52WO12mK2XcCQ1u5xHuH9DFUaV1eVreTngYjLBQWWIDdba5/PtuqyCSUayT3lU3KBrzvffDBVI1w32JCZ/IZw+9lmMEp9I9tvwQBk6KHnGNGjoOfAwJ99nwXiRtCLk3zHmOnmfeA+WfLlwfiAJAKF+qPfj6ydD0Qr/eRIy5wAw3z39jnfujv1CO0e/t7o+vIbi0KWx2XN4eTwJ+s98hajqMJScxt8XP+9wJqNnMtz8OyUyZfSIE8ljZ0KVLLsZOND3VLUuenyoHLbrBZNlLz9MuRWnLEP8DF2nDYP/IM9aiLDvphniLDvv6+aocO5SA+KKzxayecZ3I8pok4jKtjYjIYlVjgJKcCetCkaC93ISkj+2Xyq9ZwF+nyENXIzvUk4bqF21+CrOoyEHIMgEayNP15gTuKZwkhZ9FaLOAfxiFsnT7bo+QS7TlrPYycj9aoXpW8E4jafMrptPUKpKht2PPMfyO4prKyIZ1VjVEg0GtzeiQlkzGmPefp3u17HUsb0o/mL0tQbuPJ+GrlfFgZRDjvzKVEbe+v2tMMIISSVMHO9xGo/x71mhnuaPnhdqW7E2AJuvoijwPwAAAP//vF3tbtNAEByfHSeNm37QggAhxAPyCDwg78APBEggSBtK3bRpEvvQ7u2e966hBSTwnxLVjS+Oud2dnZ0pXr9941VJm1EjEfdjQQrZbOjhcmWgWazZvmEahQaIvqA3oDR2fSqk5IUWv5bO+yBEUYrYT5d8iLzAU1FA+3v7IRzSBEzpMmpH6LL5SiBLuEzVlm84iBtPmixCqVb04MqsSV3X8cbbg0UERfxHXQ5i8e+DgFou7qI0kIACD2+mGglMS5VzFCGy3x2tNyhshkRH701AmnvjYiAboKFY0YagSTAl2mr/xz7IfsRF3+L7Eu3yFu3VCqut42SSEhVSzvc0LkIK2fJ3bluGzrkEay76i6G4UQ9nLf5pjup/AgD5UfR3g6c9hmQ89iWS39/tUpj5XLXUUoSx92iIVr/uUK861DdbXH/8Cv/jGtdfzrAkD+f5F9SkvEpgzNYzhZ3XIEPe+Ux81BEIvWBYknYEMfTeSILoBZ0s64rHWcZ7E7a1GjckgvUK4+kJW1/tNQeoxjMU9R5bDpZVg034UkMwlaAXqGWpmr8i6nxdU7THDuQfsj1iHuzuBwAUOISweip3//fVS3EX1xoT1j7eWxhaeS+NLSoYqJh59uIZgwCnTx7j6GSGZn/KSrxUjEWZAq/aAV2y/+TH3wAAD1HHNRHUAM/K98QE2uG1D9sh/uX7pZRA2p+Ipr/ebESFuEqCOwwTKl13uE4UCxLhnn6H774FAOya7b/zOcJ4Xdn7guZDYAWMuDMyjKBZUSBksenumu9+lvSc3Ql7vG8+P//hBFuf/fDZ9H+4AExwGI9C11IfZSKzUWefYsLifIG2bXF2fob2comLby1WyzUzxtY3K04g6nIsf0eJ6YSFhJiJp4Wc6ZxUFPfMa/+LOBpfR/BdQIDSFvfps7TrqNgRIADhZ5/e4/LDO+yVBabHx5idnuLo6XP04wkceUkTjXwU2Gh9N+jj0OPUq80jdWMoZ+iDgCnF687TXPaG5/Zn9QR+fRvzEIpN3GXlBsSa7fhWpMJ/8QM37RLt/ByXiwt8/zrH1WKO6/lnoLvlvXhD9oXMFwhsg/S5EXBuGG4KwLpXAKAPBoFZNz/sKUUs/ssw1cyjAszucy6KIJJ1ngr1kUYCF+51idHhAZqTI1SHB3j08jnT+OujGXDQYDPdxxV6jKYN2+6RLSK/B41bFEG8b9giXOIqEEHdYvDytiJn0FzMAK7eFHjaFLEJMZDqlOTb0+8AAMm1DQKluUWqQzV4cP8LAOAh0dj8+NPRIGuRhqzrOZxzPwCgoKwd3/zdo38gft0XXnbm47FjMxS7SZ4hDRl9Xx4Hgp4j1sqOxP0qBvKJvcU5C2ewW/7JQn4jh7okav8Us2aCw2aCUeVRdCsW+KuZBbKN2hKx4WBjkIyvxFzE1CBaC1EJTXk9AQAQkpe65jij1q8itip8C9UxM6K9VISrha3+pPDD+mRcDHaxTtOYn8d325SxcbqI43nh+gpIsJGdKOPvGu9VjRv9Plmob7uJ5/P6ZJSZwBmds9/GfMRFkWBlHth6i+JAYWfglYUur7W4ViZAGPd2BixJXex0/QqqEINRr6VFOLOWJC/RWkyF9vLahLYMy6CwIIgFLvZnM44rvP/IWhX45Oa1OC9o/NSGu9aOu9gIml+n9Z1hJPY9fgIAAP//pF1hT9tKEByfYycQUgSoUqtWT6rU//+X3qcnUVSROhQaYufuafduzutLIKBa4gMJxBf7fLc7OzuTAQA5ARNltVIQ33hVcd4m8aQqVcJdngCiDq19tFTuT0q+5cWyAAAVPceLNbWwqo70UVZJUI+HFb/IwZBBurOmAJFjWkYcFRsZKz3sG1UP6MSKUJXOdPFl4g7JIYAWVQQA7MS0h/d9pqfYG8Qb3zSLrClApMqOUfYgteHod1nkzwIAXFjkO1v6T5/RsRGlIgCQH2gFbjCZHJEBUAIACdFX9kCtdkkS3ItFk1RVNtLTuHnCVgVD5hiU8CTKUREwoGBSBgDgDLBgKuWsslJsL/vM4+C62IfsPb+fAgDq4ny+oOBp77gBkE71zrkwBQDGz/WpXzEKOQkbQBgCtST6AtL86YHHRzzf3mJ3+wObf//D/q7Dage0AzATq8AwKudHYcCQq0hVeq0cXmVe8xpQx+BX7qPENFolC7FlV5OX4DA/F9/8G8yXH/Dln+9oV9e4vPmI+cU16uUNvIoJuhhiMubDbPKd09UaK1gMePMGlCoxxf09eX1d+UxzfifwMgmBIul+2GCtpMKSAWIPK0BVBSvQSBR7yCCdtkJIcLFocHFxhsurS3z59lVdGa6ur3WMZ8sFjL6p/v+EkXASCHn9/bcAAAwqFOCVwHu/z7aih3//hoTUrH9c3yhSg7IPN1WFnTtM/PI3JFIv7CRDd5PxsjWAm3NjbPa4sfLzbd+jBQRCGH3ndb1XFL7Nnv08aMU6cbDJ+xfBjB6vHe8FAPL7bvpc2MfCkeI9sqrzIV9TRKa77kl993/d3aNbb7QCvV7/Qtd12Q1Bpt5+O8QEX/ZX9uk30R1HBIZkr+MYJZAWW9E4981cce4g0TrlD34MAMALIEswNOZZ0rvR9U4KFyEK4lUSk7SNJvTiHCBj3amqNkV6h1z9lda0RmIVARKqKAJKhqPQe1V81fcK0MqaLBV9SeJ3Tw/wz094WP/E9rHDZn2Pu9sfeBB6//09fq877J93yvAS8KBK8HXQn4B5PVfGxGt2bNL7HqvghjXDNTVEBh1oRRdSz7Mtoht4QJL/PtQY3Ay7WYXtTKRdLvRn+fFKE/7Vp88IyzM0q3O45Tn8okHvPIZk26ftEVK0aVwUAISbVN73ZnwHa5MBhnM8g2qy3nGvcgfr95g0lACAtxW/up6sH+8BAHjFyrk3jdWGvKYe68s/PMdxACAzwIr5TcDnrd7/r63vpdBflVxe+NpL53gJAGCCRIHUMhZ6y/E3AED8gymgn0WFCST6sX10vLexqu8Tq0ULDrJOiD9861Bpa3M/Mm/rGRbybNQDztsaq0WLD6sFlmq/1mPeOo2TIig4ZGaKzrE8juPxS4VC9HDYF9d7qtHFPcwK1UV7u1ner5gLKRvax+fDcy9L4JWs23LIGsikf59A0JcAAOZt2qYhDgCaU2wneylF8rgnDmE4CgCAMVKyIAQFl6vxOqnN8CLmLXViKVgR4Shi3maaPD+zSlR42ybG2IPVcSbAzDkJEvC8FHzXfSEBKPp/6d4w/mCuRdYM1554H4XyL4zr+N3JwrCHtkGn/LcU6mMeSFYI37OuHzI2ghwEEWxsZcdtASYyCQSELQG8HM94j/8BAAD//8Rd7W7bRhCcO5KKIkuOHMdObAQo0Efo+z9Hf7QFmgQN0DhW5VgwSYkiWezXHY+WHRsp0AMM27D1wdPxbnd2diY3C73OC6Wd/lnEBbIgCiG99oLeSL9F/DAz7QW0N29qkeI3HwOq4P3ZSy91TPq/X4GHVpbkgJ6G4IOBhTraMHWDfg2m6GrizzRF7r1UhfTBa3KLoSJNJvZAit+MGrVCfRkGMblad1i1n3qtKbFuXRuAkGQjcNECa5w42iKQNr9U4XrYU8P+2Frp53mgAEH3VUbOdP7NlmoC0WigRVKVW54DQQT3UYXZx9YMmjej8I7BXZpbWoC0mdLccy9PUaBqt5hNBVQ4PjrC29M56qbD9WqDstqhqks0JARFPfCuEKSKI7mMqyHmm2qERz+oCjDYoHzF/0pg5/8a3YFrsOCpV7sj6p/M1E2WW0pIuOXVBDO3wOziGGf1z/jplwr156/45/cP2H1ZY7Nao2gzFITudjE57RhEclL/6c0CKb52ILRrJaltpX8/17N2mo8qq32DvrzBN/Kgdjn+/O1XLJaneHvxHovX77A4f89OA8vXJ8jyCesO0PHI6rDc2Gkbt1chL13fiVCaD0Gxzw4LZj5UhX1s8F7QtgPl1ZT+jUFgbZ/LOKBOtF8UPGH6KSeVhNy/ELtGBnRUzblq8K3aYnX1FR8/fWQ2wNnZGZbLE1xeXrCd6nw+4eSt935EYjwUMD0tOHzq8AYW2bN3CuIO7OkeYgSMByvXOoQWL1PeJxG/0Gs3FPob9PPZIZ6wuqxCrzTydnCGEOhKQQ7tcV2eh55CoyPSlwVOfd8lAWs8T3zY4wLtv8iT5P+xilgMRKwagXuPec4afWBW05sWEbSjl0/W5w7YlCVu1re4u6uwulphtbrB1ZdrVHcVNqtbEQTVijdR2SkoyTmJccimnqvR0MoIsoKF7NheqZUqg7QXkP2p3bsSqO4toBgzMbxLKv3pdaiN0shV4aE5C3ul/r7X+4zs94qXMxbQ5bXlOzRdg20jLQIUmPL5zBZbCPfVi1xagmif7Ki9it5n3zCTkMBCR4K3dYW6LNl3uSlrbNYrlLdrlOsVPn/6A7u7Da7//gtbOuN2ksDmYoiECWmMGACbSOQKWPjURA8GSI7EBp2GTJlRAXpt5SLWndeKp54rjcuxOL/EdPkKb85PUZzMMXv3Bi2Jmx5NsScLvmIiwrW548fsyVPa9VLdhyQXfpJxK6KsfWXwWaXe6xUm7ZwxCe98rNBSDNkNLsZWBjPRgkBmH/5mwbYbxEyHeuBD1Ytjy6eLwB0aj7EJ8QP3dmi/6tJrSqyUD76f51b87xdEnrPmxsMo4bQPi/BdKvx6qCDz4/tfOrwCXbLfWpHIHVDXQXBpMhZkppV/1zVcMAEDni1X8TPfY7aYYzYtcDx/idl0wgBAoX+nL9o827Zk1hDrhjllLCeFjTiafTo/hVbi+Wd/X5iO2smyLN0LQxsy5TVZbFGxM5QszKFnEWuBUeyuQJn9jzmJUfhFeyAn7n7MOoojMLrULo8Ku8JaloIi3e/kVmAaPvtG/P4ZrNDcwUAGuxazd7UCKou3q9Zarer2reZmVkDuR1WZ4Voy0cP4PQJzounTa66To24qjk0oP+PX5WTfBybBEMALOeZAHJHiIbPrk+ePLHR+DO97EZQwQcUhO4k/C6Z7KuA+aM2gfNHuFUvODWAIQsnUvmfadF3LVpLGSKBBrH2bR173CjAZqNV20lZA10JCgAz8DNaAcw7/AgAA//+kXdtS2zAQPb4kcR0uDWUKTB86fej39Q/6g/2LPvQGaYACIbETd85KK61lF4apXjIT32VZq909e0726cvnrgn69EX40OFJlfSBDLq/55xzoJT+BdrolsIddD9bI8HBQ3ZJOWYXMyh0MB2JiatJtezLtuO1iSPsO8tqQVpNfi5qLOlI2orSZcP4kaTbNfpcGCkrm4WSczZu4I9ptMJnKFPDFfUgy1CT71AYThtZ0At+4sgLBF1LWyuSmfoTKXcw6AGBpKjkYRfhLrJIh/uAKTvoMnVtgNplUnvrpTjM/du295CZvTJ7i+OwFwlBMuJvm050rR+bFtfX97jb8jmctCAZmsk4n3Fwdhm2rYM5Cj8A0gj5EKr9Muja+D7PHTPGEmwNqLuPlxjlofHtM9ebjDRiZgfCnwDM6KAw6EOo2mOD2bZFu7zF5vIa998ucf/1O9qraxR3G9QoUWeOY0B0sOFIOLnwCsGlhIE+lUGyGaR9InPULx2R6nFBexyfvsX5u/c4Or3Auw8fUVRzVPUC+axGR+kvcbrcWJTAmQ+SqbFhHXWMNGchohv7/99GIc0Y5ck+2RMGBR4i1u0SHXxFSOjiyfRRWNwb9JL9jdJVTg6RRpNSM+w7/jK4uDhZ4OL8XOqTD88OUUxzMaYTw5ibZRHBsR/Rtn6qPZclEqNm5vnWB201eKnzuauXTI9Ps/VFYOuHDybw2HldSxlA3K9veCwcP80SW8SWGjM6/1o+Zptlh7YoBM3ep4Fkzf6rbbGlaspZ0yU1tOn57VhKS9iQjLEUATDov86Nef7t5viJkN3Ke/D1/QoqI5CFXC2b9Rar1Upqym+XK0coxwDA3VqCAOIjk7y3y1HNDhiGDTJRuthgTSBXtcz+a6YE+jXlpSdm6wwkffhs6f8KhbS1mOm4TTOhqQPUQ0llTkdZgqhmTtBFHvtWSD3lnbtM83pz52ym77tm5wiNiSrbNRtx/KsyRz2biuIN+QHa3RbNwwP26zUeViv8EQj/T/y++oWr5Q/c3Kxwu1qi6yiI20mgQLS+ERlJA4Gsleoa76jR/tNn1/4OvCU+uJB5ydE9IlFZJ3RjEzR0BGYlttMc1dkJpidHODx7g8nJa0zPL5DNa9Hbt8EBkv2xjp9qLrsszvVaoqdjoR0xiCmMftC6vkMT9h/hXunZG8uNoSUDHs0Y5uYkGKC2SdA53ZCRfyB/GhBcei9x3sJo+clwTbcTyWfNiA8RPql96qHOkkyiZpDzBFGQ3ncfFds/n21RyWrI/TJ2zLMytKF/h/Pc8FnhfYUyImT/AwEgZaBkyvfyrKptr9cVO+Idk2zvnPWDunLfMufywgWWqOXPIF9VFqgKCJx/cTwXPpSDeRlKUNleTYn63YpDSz6jqnRzPLlP5Nsk8Wfrwli0G4pA0HHZepZ7+Ax9NZkKi/7Ew8jl/7D+mQjCQMc2nTTaYUVbRL6wIUpat8EE6nntwvhMtCcMjE7KSKYrCgLm+unrF/9pswn2QFEH6r/x/jQAAaMCF95Z7uTl6A8Jbxli8sXa/PD+i0gcz/uiPKBA4T23mSoNcR7QGnf4YEJADPgktPpGthy79Gg9Xr/xfifXmuooCwjSzCsajFBnXdGj2iSIbvziSKzukAgP68i4z20H86PAAWe5ity1hvxAyn+gaxP6aRockOv7xIn1dxU1oH1i7bmQYgvpskPv9+Y3AH8BAAD//6xd2XLTQBAcybIV2XFwAiRAkSp+jz/gB/kNeILCUAkhtvGhY6menVmNVlYSKPSUw9axknanZ6a7k/cfP7iQreGAT0X0vC6AVkb4d+HVOxFEwkkg646/TYsp3yQ8HNrOojfMRRwkL06nFT/izxQnRXhpnKpF193gPiwoIjDEgNZ5MTs8LMr9J8MlBai3LWRZ3DIqLSxtFrm7CIWBkk4IvuZSHAjwsIvKon5fAywVLoSgEAYebS5MnxhnnbFgn01paeFrkAyrdlXUrgzqknHbufW+rI3uAfbz+/eGP5dPCv6e3ke2f5AJRI/vmtYaRAPWdmJuWpAaCfbxNIgFmicHLx6I/YMawGrXAIguZ62A27s1/VptGfSzABWPRU51OvZez/IwoEOBJ1qnHGsRAjviZ/2UbPNjCYAk0hSI45342UuaVmiHjiyA8Rb7D4dFvDO+5ngmSLEt5/xSg66yr+ikIgb80A2g2zXVN/e0/vqD9t9vaPVlSWP08FdeT4GSgwjc+MQA0w6i6wzHMOOcypn5FjoK/DntfGvrWp6F3IwmTAWYnIKL+4qu3ryjs4uXdPX6mpM++ckpZZMpfwbJIPaWzlJxofAcOB/o9QOSXhDXuTcPJwBcOhywAFRkllcqglXhK05bm83xO0mQrngXz+NC9gAAIABJREFUg/+mDkEf0z8kScm0qqpmsIz3s5gWlBVjen59SfPzOV1dXtJ88YyeX5xz0MULEwqyEykASjJAdvmEwO3xVlG5IMmcj4I4UlcTIA4w+0DXAmMNZFWwiCSoVkB+bD+982tatwDMZ9Cc0e6ufgLCAwQ//5fSNjjqiBLZ7WBsUy3opyDqNyyy1R/H9hkYojTECYA6shMCAFchv7JCB0nqffcByipf4d/tSvp5d0fr1Yq+LZf04/sNLZdL2tyvqNrB5aPhxMBsdkbloWKFety3/QGK1VOx/PE0PqzbuFd5lnXm+/Z80+DD733Om8E1kbdmyP5Qx+L/JAC0Y41MAsBfVyZ0jpJFubjKjJikOnixrDRhAJHA2rjcc0C/Xd2Rayqq9jvabjfsv//r9oa2P+/p6+dPtFuvaQObw2rLFWnQA8AX5vk3VKjdEQH1NFqljsCfR9eL2Ou64VcQwBwsZVYYQvdDXiAap/O31zReLGj28oKyxZxGL86oOknIzXIq8wndp0R7I8iox29CMqDp89BNwhMJgId87p1x8Im3XgLgyDaUABhJYE8S7A8VURRA/20CoD3/1s3EPrdqhRYDeD124N426mo06sUS/udWuE/tu5TLzN9PFMx2Qfm/JADipPlT7ET/JgHwlI4ILTQF0boBClQ4/kOvA4C3q4KXfLuejIIOCetZAERjskQnD47tKmYz5QD8xYTm8xnNQXNJiBZnp0zLAW3IETp/9t6JxPl3V+NxTi6y1XjNCb/Ndsc0IyQCfOFK3HI0JjaU3FS66Lg6L10TNsFjKW3AVTpWWmTU9nfVutFuOX0HtHDCnWu7fUfjSMGv0pnZxlTAbC2dAZ37KI4rttiqYroK2JG8sA46CmBZiL323H2lkKs2HPbFtrYQulbAK/NQZcTHgR9t5wCKwMrZx1hMp/NAf7bPmIJcnddsAsACcKW3q3ucYsos89V9pmDymuLfX/zfYjB8PxxPqD9arMWmBWKu3KsVsW2xh2MWC8b7RArTqs39j10DvBVwm1hQqqb+TWkP2KelNBwF/3J/hzCPc47+0HZty40TUbA1cmxJ60uyAQLUVkHxuP//MTwCVVSFkGRjYyeSbc1Q5zYzkk2yD0FPG29kK9JYOqe7T/fEmt4ik6RzHI4iSoUyMVXTyMxJaWyC45iSIkiWJSEfUfqvBdmYEeeFOJny4mp9qxdemn9hnJKU07Gz7GnGMu2TFAuOH+6ecoILx2ZbtgiE4ZKGv4iLVxQOAxQqMxPhxTOSIDMSczxEVMZyK+3LGQ0bMudIIDWoXmXZLIn1/aBp50LXXC8Lcbs1p0nzTqDfIRSIGVJFkIje6XtzMk03lV7jt7a7rZhG9KeKB/4CkFREF7YzKSHPSQ3jVJjtdxbNJLOe7GDvrdiXm0fMoC+B7XaNpv6gM6Y7TMo9VjWwrOfov1/ipeux3rywZ8D+0KEjBQh5CgSR/nOuPoQx9kEz3c+waF/D/n/tll//8lyRAZU6UkOuX3yLYfrP4qew3bL385lzaGRF0j6lCtdc9tmH7PlNaOrLocWinOKirtDNPLCoMP3pB9Sff8Fss8XycYv27hGbP26x/fse/eaJFQQEBlyoO3/uH8BFfhaBGLKAKfqZRgwiI6Qdf9DDNhCAVbTUqfR7tOsO7eYBd7/9yvL/5XKJq+sb/PjpZ6y++YT55Q2K2ZzjBgECDSRv25MZk8qqfCZb5OscRtL92KCHyIYNvfpT4WKnNxYa8XzLvPNRdxBppjD8qUjso3IBcfeElniXvanmVlOOMKsqnBr6FCKZps/p6L5Y1XyMu5cO/XOLu8cn1M0Mvy+XqJoaH6+v+ZzRyMBi1aC6nGJS0ThPKQZgKgEP3kWy8VwRF4s/A6AiK5dMAPlBRL9C83B6v+G194onQDwPRSqczaDI3p8Y18PexyIiHdMpePDW91iSX8RQkPL5LcborW0M0NnPViAJSJvkl/bgHBfx772NEXhi+Q2TFgC9x+55z1F85M5//+c9vtw/4Pb2ll8jVoNYkRhTdPRYNEsyEeE19mFxha6VczRfzaMM0woNSyWg3HVHNHb+KAwCijl1bD9qSk3IgLZ843sUn94QZxTefWTLSQyggAB6z2VDQomJO/iOGwCWaBKYTS7cyh5OaBafCIC2xeFli263xt0/X7BbSwb/491feHp84Fi+3Wat4KsXEzCqLUoBsjiStUggAN+f0lnLDrbAWBTsTwZ8xidoSDIUmd8BRxvOKjwTxDpvUF1/RPMtMfyXmN98h9n1FY71FEcaySMTMSqoeXbf4+CovemZIQ0Tux+GweeJm78beAxMvFgKmjHfJBQxJlD2GQHqr3G8+rfkZ+DEdDV7tofB60hKKyd1QJ8rc+JOWW14rtkcMY5jsCOEzMMiqwOCZf8XOL1ier+UxklZvWg+m6mOtHY++NRkdFx3iWnzpHRKvJy/f58c5/+6KZAZiRcDF049jF5T573nxtc0KBKazTsHT8+DwPVpSYZ8zrNLP93KV02NRX3BLv3VdMJ+PGWpS4hqeL9jQI+GLomcfm7FtLvAQdWXmvJTCgjU7alG7VGRPwaNUSH5OjF9ERd/ECxKFbelsblsMnsRm0p79iIDVezZyWPLMZVimGbjXGrwrPlnhrhpIktN/6ZjtOb/3GYqAMDGwobg0niOn8eFeQTAFAECkhuDbg75tF5Twk5aHxY5R72j/T8z5qWNlaRjcZp8YJ9LzypqtlkRqMln9Le9tR2zvseACfNJKDLDQPH0UPJCAYi85rd+io6NI5HZrJGOPSU0DJSFbNAu4872mimxKXLe4gMv1Hj0nHqKriUpRW19sMKSxtXUe2j8fYtjUmwKft5zx3rlk5ooBPwLAAD//4Rd7XLbRgwEj9QHJdnjJq3daX7kV5+uj9AH7LvEbjOxa4qidGQHOCwOPEq1MklGIWN+HHkHLBa71R9//TmdQa9UP3npaY+DqeMmhClTHlBBSQ9L7uP0FFLQOD2a7b2f84lkhWhTudfqhFTwS2qDQ35EcVrRp/euc3YbF7PNEwEJDHhcTrS19shczmejLvkPI1LcdwGRDUzwvB8jY6yczEwJ0km77AHa7bap0hSjAQB8XYbQikheEiCE4ATaAARFa4L1uOJaYhzt5/H+gtA55UixxhKaSpwhQImVkV4+frHEIsOhSmmycUg0o9TV2RLWoKI+oiMwJcEirkacI8a9pqZKdK2uOymV+JQqNc2aqnot1H/2x+cqMGsGPH9nzYA+JUSsDxCVNhaSkODIf4t3Gp4jnaym/AzdQpHFz9ixO8ptVCxmaDNYBikuoZhhAnPU9+o5TEsQbPFR9fx07LkYSXTWeTYGnEjWK0F/pyaNGQMzLCC4HSZq3gdquoGa45GGlxfqWfzr5Zn6H2/0/vydmkimHRCm1CdX63cO+BBAU0qRLdzClURaBkURgEClgo9TsnyCGM80rYWu+unxCz3+9pW+fP2d2ocHWh/uaXt3Lys0W2yNlG2k+Fm5qFUPPgiS/RhUYOhcCaS8axKqLbpF/uSUFz3NSKo8s0Tut1Oy9QuksTvgfsDhvswfCVxhtggP/yo0RkcTn1ZdhDiB8ewkqfrXtcw5d3d31LYb+unpQJ+fPgsg0Gxq2u/2IsjF+N5IuUWALEgs70HRl1s8i3yvUTEXWrUwqgazX70GvuF9QlWf0XD0OXr7PkOaXUUfAOj/BZF+fz/3ecG/8nzK76VzgJ8DvLgfqh0Y27peLrK3PrNq9bgMlEkZAH4+kXZI952nznN/FnE+/s1++6mH/5v08PevPZ26wRSewY7DdbT7A51O2n95mWjP/vZBRWvtXgcTOpL/rzoKss6iIq/nxPN3LQBJWsfEzSU44TYwYECZXgzIByKVaA/XeXtUR5igAOuiorhqbPwQAEEcia/teHyTBCEJe12of3sVxg338V+GjvruXzod3yTJ//H3M73+803898WulPePHW2rldCEk85QbnoA/6W27xUlCdv8GWk+nwA+1VlcfvmnydvgpesPkuiPCsQOLCLabqU3udq1dHj6lXaPn2j/y88UdxsKD/fUrQINDBY1RANX+WqdT1jwlBmU3PJQF/eyAAJxfAYMwHHC+lKPWRAVDCrTYkAsAYapAJ63x/sau26+/5w5k5lEYfFvsVDa9tvK58YKRx+8ylOBCJSV9msuLSgkyTGn+urx7edTFhEU6r+uMfl44aZdq7+WW8fwIn92zlW22f4I0MzHAgBAKbXNZJG01RXzGl0T4mLuBhsqK73HMjgrGJG5BXF+HkkYeqQt+7cPKSlcrQMN/SBxOK+R63Wgu8OW2g0L922o3TZS2GCWD8cC/P5zcQHK7+QSJmNvqRVoUIajiWtOeY6qPIO2qWY2fNOCqdHYdllDT4PQzpHYTtoiQWgFqEbLqSptXQODOtH8x1nuxJonpAw7vaBF65tP/vvLyVoAkGMh6eb3qW33kk9clKkNJzGwEpCwI7czZoFWu+t1YgteYu5p9xXmMIbZ+kqugi/XF0ZjDeA+2LMRgrVIk67l5Oj/9rMKBoDfBr0z0XfTFnW40DFQEDXfQ5xQxhPeeQSsBNi0e/r/LQYAA/SpvTLb/YG+j9hvFkcoOwhjONfKyqxvHFPO/YpIIfaVd3km8u5EAMeR/gMAAP//hF3bctNIEO3RJXGMs1SyFLDFVvGD/AGfuL/BCwQSSGzLkqUZqk93z7Rke/GLq5xYlkajmb6cS/j03+fUqzckIAFqs5M9A2nKG+5yITFOg08+qyyaYAFYsUzhAS+DJjcgqE8+wzyN3zEpDQCcxcj8WFFqLj6NtYpwCZTHqmVWUZtmMI+yeE3OUspUMkfewIIkAaMG516l2iuDSxDSAMY7jpObfHXm1foBhs+3UiX4/5kGYNSBVqGY3FHgh5LvwXp9M1P2twWoUVeDpIqR4/GYCzDX7QrjZc4FqDC1rR5vje+IoqWgIfa7vXTptAhhFWw+brfvMqzEJpSFQ0HHgTlSfL9QGYulup0fWoUfTc4fGpM1BlS/BZ5KZFYtAf5oFXXDkQ7dSNuXnva7nvaHEYHRIdQQnyN1IBA8pPA/YXaUpFPlCwFR4UkJlBLr2EonGwF+mAcwdj6Asy58AP68kf4/hM42lNJFX0CYL3xf0DgxQ3LJB062cPBcVy/XWu0BuRDA6tXE3KlhoA2MyyeK/ZGqYaLu8Yn2P57o15evdPj2ROP3R7oeErWDOPvf4vorJK0Qy5m63Ok3Mkhy1IzK8efMLlI+le5BqkayEFOcIOxvEvi++/CRbu/f0Lv3H/C+uXtL9fUaOgIxMEVkTX0ULj82VN4IycTlSvIihYACARW3AQngQigaE7ZhY47Eos8hz3w9F45L8wBxuTlYMFP0KSL0BLKfNxcOFFVgL6x5Ubx8efObc6Ujxr4xpdemplc3NxBk3bBi9+sN3b9/A8HFu7f3tHp1Te2qIoBmgnDEoeNWyxRhX3J+XnG9Uwncl0UzWbsSkjDSolXtfIApj9hpR21ZXT59Rqq8LgWn7ktmy9icij76AoCN96iBTYzng2MOWMQFpVls5HPePlkXw2yIXNKZFl7HOMd+zNz5SpNQ60IUHvAcxhdUnR8UjiB++0mV+7c7FnESDv8v5vE/PNKPhwck/Hws7vJzEAnOXmRY6gocfuMyBhXX5T0Xc5c7HLov1XWLAhJZgSqFk44AoKUqjAmBr/qUAsAFgORE3vwrBx3aISaP8KAqO76UwlEJ6MvY6Fysk3jHa0HI1jBya511Q3Be/IRPXDQ50nA40nE40NDv0N0/bH/ifdw/07h7pv3LTxr2z/T92xfqdlvqdi+aEGrBTX/IEF8xF8Tmto71Mum64NtmvfWUbfikXLClQQqUVaUOOKotBAByoGO7osC++3+/JvprTbf//kMtOPws1tdQZBhoWwF5xgWCHkX5SgT7uBas4n3uBsv8rwTdtyQlzM45zC/HF7+Tp19m+9Yzx4jn9kQ3XBeSz0tJ6Yzy5iC+KaaTQJbOFPJt7pYkb5GgLX72HJzeo8+Wvvu2J1+C1/+Jb2/H5JhNlM8LZ//sMatFwnlBa8TOFzQITwtYXK+nXKSZQOAZ6h1TROxzS9RjgNAlkbgFkf92mHS9PV/MKIg0QT1wpNGkVmNs/qUBYpNG5eH44259BQQju3Mwv3+zvgGsH8gwFKpDPqaIIA9yzaFcV8quL+zn3yCJFlpsj+cqKYc6RMezt+dAKTmWYyS1rCMV62P9Ho6H4Z5iOYMirtCZn+JMRd+48G17lWlynAh3yh1v2jrD9G2PghCnc0Lj+SCuABMa15w3WH7QqF4C71FilTsX4pUEuNGGp7gBTEpX9gmidwXLFqhO/8w6+GNyjmxe803pdKyBYHToJTpgUupwnituLYm6F3ubRe824AtpwWn+2LkYlYBRl7C417GzBNxc0q50/+PxyjmVUrGtQYq404kReyq25+ObVgmPP/IjaDTI9yxOsnG2+8ewFX88nluM5ODf5WtAfsN28znOkXPicxMKiMQirDNh+Z7dLxQsFnRlH8PGGOk3AAAA//+kXe1u00AQnLNjh6RN2qZIFCQk1JfjDXhE3gQBBUpbVfFHbB/avd3z+uJ+SLj/4rix7853t7OzM+7z1y9eUZ5O6ia19jI0RBsDdqXesxBEXctLUMxmcHTSthYwqfATZ2CkBkOVIZUSD1HULLJCVP3HQFXBCR4UnQhYic2gEwE8CABAIlyl1LAoqgURwODfMNQcqyRpAQCd0IbEYxxJUKABPw2AUhT5deD2SY2GZnN84pTAzyEZG0avJJjPzcLXidc2L4jIY8Ae/4d0fgAaFpOFrTdqlNxPbrSoCHVtUzHB3lDdvYgq6suSKprOZcG1/kVdCVJRjbYnKs2KgQEK8ElVuTvQiwCuebx5fMC+7VBXBzQNBSZvgjQSiVv4AAj04pXMzIQiD5s58VkexGonvmS66cn0Gpn0JBuQJRmdaNMyqcscNS1IxOSp7L8Gf/8LABydm6lJ9HP10ZzZl6CN0MluALVe3vQo6g7LZkD1/Teqm7+4+/YT1c0tDnf3eDM4vm7pB5wMDXtKj8z5YF8QvHWF6jZtqTHYDj18LJVrvn/g96uAK0q4xRrvP11ju7vC5bsPKE/PUax3KJYbtveielTHqLEzwpGa4Q20VWdVp1m0MzARnKln176wC06WKPFq/ykAMH4+bfs0QFBASf2tlTUznu/iu6STNW16aJ6id2VJC6bWf1HWoRPvYlrcCof16QrFqsDZ5Tk25xtcfbzC5mKL3cUF1ieLQHeU4FMIWlyrbDeudtMf2iLNwjzVW8cAQHqkY5DmF/vOpC4AwLwI4GsBgDFjmB8pVIfzx8CEBS3sBnkOAAjOCHmskeT6O7VTkhwxK+rniBabtK7Tnp1utW889lXDNnyU3Se1/tvbW/z58xv1vkJft6GP4xF+h8ZFWSwxdAH8ZHDKjbRAtYOy4qm8ORDnGp1nJuJ+Uoepyt5MT5wT2nXZ7Jw2ZiNGoE2ZQl7prz4PIJuXLGLm4+Y8AHJyN8R+oQy0GyJQTJlFFtfjKLkX9W/PjCcGPLqWdRAacjd4uGPRrKZ6RLt/RPXwF83+Hve/fgBdBbQVUSu4LpjmAZvVhwAREdSVe/ViaWcp/nZsqo3gZNOazOBeAn9e93OHJvNct98S0E+A6mqJ1fYUZ7sLlNtzvL2+RrY5xXK3pTo51GWOR8qKLRzaxehjnjKXtM3bpEbfGUGr8O2nAQAACRA4ZbTQsy6Ol5/J8ZJN64s2rjOaEs/eb7rXtIyKxBMewhi0x0sAwHMB/GuO11xvfd29MG5b8UE/el43WhdnR9nm6bOnwT+eAQCmwX+8MynrMZ/Leo+YzMhiQs8SasN9dhJwjyB6LtpZmQDxxAgNMYEHScSVPuw1qA6fPtuerVGscqzXBSvyn61KrusnwI5Kc7q2ZtFgL9aelqEy97wKxusz63xH84mW22qJlG1Le1gAIMtcTDAyGxchEUhuW5q1tWBBJ2LmVhuH4hBW1M/HNU6vORxq+R+Bql+L1W3QZxsmYBAkF6TuYJkRK1cAgAWgxdVHWWQWAIjsAmPBBxMsEquM9IporSCWgJ5XoUL605IEdSRQBjMnOU1CF3GNVVv4sE5ou9E9E5hxEDY2tZG2rzMlhxTQU8n5iuzYTeJTg3eNMbif/SgGH5neGkQTo4ws1EWrLtiph3WR+4np/GFcBFZ5cFdj4EPiGhWGt+wEOjTBTGtW2sYc90qsvSD7YYlnqZ8pCcvPqGNJ9Jhstl81SLi0oQ3ihqoNoQBjLC9RNq5xHNB+GIYB/wAAAP//pF3LcttGEJxdAARfFsVQVqJb/v9rcsrBObkqjyozJVOmZIEUsUj1PBa7ABhXHBwkmyLx4mJ3pqe7pzTaAn5flOZSK82EBxsOonSZIFxbrppTIUCB9Usk1UzADBAtDlq9QRiAqbESFlTcHOdEr1+yqcKbDhhxV/RmUKdttULbuzYPnci9uj1a73+TAcQJSJE4qVi3UfdpSTVTgIyuUuTsAjbmq2ZZO6s4Lw6qhbbxpKLXlmlMvQQGqUdAOiEYsgMmhCGSKZLdaVCHB7jSig8oxs1LEytA/KBo30fr5SmgRM9IwOeDgRZ4/rjHqBPEq4T2sYwDLqgfhFyAfPchQbLwAKULvCFYPSOjd+ie3KAxrPDelh2W4QeBKha+y+Wq4Mr+zf2OmtMbvTZnOjUta4DfkLi+NtTAj4EW3G258yXroi/o6xmbwfg+0LPxx8GtxBnDvu/O2Q+SUM5LgI/3XRIAh7//0iifYbQQT16qVaZpYDroc8pS3I8xLxK/iP4880BFfBxcRv8hWYqJSRMFO9ZIz9hW3EirRU0nLOi7JRXNA908/0y30B5//Iva/RM1v+/p7XCk9pWoDhcOBIugSTWCFtdFxWseml4SAmz6uo2R/t+4tDlfHxx34Rlxpj9+/YX+LCSxWW+3tHv/QLe7HxkQqNYbqlYbKucr8nBHhYEkzXgRsWEmJpIaCAMcCqrbT9Hn0EVmQHpiowq/AjT8+uS3SleTZp6oE7+A+LqvtJWX7BPjFTQpmHpBaQUHXoBuyAkvmnDgOStKYVRA6tQez/S4/5t8XdCHD7/RYrWg7Q8b2ty+o/v7O9puNywZQHWiK7Xa73z0eSiSU26tT/KVaxkFzFfvw7c3lxh20RXQhSYAgaltXNUft/GT/w+AMcg1uDfwZXQc+Xh/D3i9k85nsbUdr0l1IS3zWTKjRn1fhdKJdQWGfUj4D5+f6HH/RMfDM3358sx/h5xMDJ8qDmQAehYcKMmax6+BoVWIV46ry2hGidluWa8imCLUVc/zJP9d1x6eD3x+L65tU2OeQaKMmj2h/x98RZ1OBK25FXv9jHeaWJD2z85pwLWbc728aBUoKIiDfLBXwqkh9/JCp+OBDp/3rNs/PH6iU/PMXjNoNQtGG3uEaOsDSJZAA2ZmEhhfRtKPlWXqO2yQ6tMjPb73Qonq5xFg248RHOXN+0wU8DUIDSfMSrqgArdaUb3b0d1P72mxu6H1wx259YJmmxXRshYHf090ZDCkU6f+QuQAEVxJArfBjfcDSdT3bmMQyEV9fT42/s8MkJ93djwrGHn3r6DBMJ7I2BrmSaRtvzimoyJLiocshrhGOXVnGLrq/8frGj4pU1NZ0NfZ10ILMOII346q54Eoi6/tXIeMxPANM7/4PgO6OkejDgZOGL+Z5K7rYyCWFuh5cHHBqV9RjPN0EoiJJBhxQEPPIq3pWlrVFT/jiHcrF+huNadF6WixnNOs9pKwloHXO8SlXXgVGV+4SLcpxBfcuURAwkrlt8ZIbCc04qmB9lk1/zi+dcKyBByxuhU2pzZJmiiTFLtSCm7w8eGWbNU8xuus0z9f3d1ok89UnOhzEZb14AsFLC6cwM+0cGm52lCiN9y4s5eCEO/Wa64UZ+NhkJhSUuSye4frS6VynJ/oemuJZ9xfl0ukjF2QMswB3HI+N3G+uC7E/zCT71vJpuw6yVWEATLOv8wvwACRwvsI2EzNXcgvsT+szWB0WLxlLGrEUONzFIAAYwYmu+K/pmsCGB7aSp/HC6Qwem/7Qq/S94PIH0z2IPNAKcA+5+W9/IHvJfKyQRIvZorCwjcgBkxI5JGct5qUZWpOJaJ/AAAA///UXW2T2jYQfiSZF0Oag97ctGkybf//n2qamUzTDL0cYDiMsdV5VlpZGEiuk0/1lwMOjG2ktXafly04CXiiub6qiwNQ0Cl/ksqPGOrGQFRVO2nzFHZ8HpRVU67VBpnsqnlBCMra8xGppUpwaGzj98pFbMPEZLAhDVDZB7nBg0gPfEAzmuYcue4vkD3T9vO9qlFS5JCLcEGnnEnJP+Lg73uHx4qYuj52bRqAxYBGyQKH9mfkQOCiTtF9vcYaeFQfon2l8+oVok5Iq1rh/NvUE/WaLlbamnmPXVWlQddmzIU2c7zlOUsHBiZT7K0dB510K+C1uDLBRCdcmNRjOaen6IDMOzGY6MLM95Dm5AYmi6x4es9KG903vTwvp7Pwvu4Ed7IoC6B8NQLmQXZAOQHprW1rUe0abKsG1f5ZPAN2z40UBJwPVPMutjUK2nJmOyd57DJPgXyxy7CktCOdfK1qVK847g4X0N+zQNKiyXDR9dJtWAgwMQlNKIkzYgjF1JPUIOsVHfYw96/gTh4P735CUdXAqkL14SM2f/yJ/Zc1DusNxjRiMw6TNjjmF+ogPzg+G62v9PWcAZFvLkM1FHGiGU9BXRxjzpca71cfhFVAFgCNAx/e/o4f37zFw5t3sOVcGAJuVIo7r7QbjG0H4fsWUfChTZgboL1moFeTpAr+LDH15rbR40u2TpdFGRJr401AfhI7lSo0gzXn5ricYx4r5JPZHM/1QW4IvKbsS844MSpKSXaO+0Yaga2eNlh9/EvmHYsAd3c/4P5+idniNRYPS9xBITGzAAAgAElEQVQtF1gsFgFNVemG7ztU5BKOb0lavrZdG/uK9OcSAGUCMO7nrQL/6/7TGI+MNcbdNmuLFP4/+KzQ5kMMlrH3jfkq6L9xkZUVVu6cM9X+iP12j3pTY/vPOiT8T0/4+/Nnif17Jq51g7a2gZofF2rTgghXQPUFiZ/N4+KrCE73sXCL6EgtTBAf9IcYsB9aYXIVcFmnmx7BOfdr0K27kdRdxrBu8FyvR1ZY0DGdPtrFdDuf/Zp5RxaAjSZahkm7gzkdRLN/lBZ9NVabR2yrNZ4eV6i3a1SfPgmlf7t5xGG/AXwt5Hm1lpuOXaKHc7csdounR9QqsR2gyY7jWmhNtPfzIw6sMN9T5QNjrI9lTP73XFtYm1z1Z8t7ofMvf/lZTPqWv/2KbjqBmU3gyzEq36AeG+yIZrpOTF5bnGtanWp4eW/VhaWO4wv2zv9zG3rn6L32VvKf02TVTVxfT7JJod8ojdlFRsBlsnxru4agf+92LVFXia3eZ1xRXCT/SOyBfl6rabTsY5D4vfS4e+T/euKYSx5s6jYTZX4+AHJtE6j+pE+TpSacS62h+TYxfGSee7LaLMpyLGvTxfK1nC9NbSfWYmJOYuQn6gDToT4+Rz8dylEMjs0BjsgrPTqMOmr0BetkrnfDilLX9QpKzedF5lRvk0SAaPOx9l8tPgtoSbBR17dkbSAwW7W1nkis8kLslX3wu3IJgDAIogRAWg46l9YmLqLFEOR7lOj/iL5pNCWfzcYpbxtKViRXiUh/6tGfktWeln9rjggrcaIdw9oLrTzvO5rvQH06EoO7CQzYLHfiX1LVFXAejXpWX16Akfl7CibF3py35RXGTNPnSdb1XYbUnM9HlLyJFH3NO+W4owxDLqsN7+si0BwKCydMeF8tguSBY56P+TrzBgWEJe+kQXGUg/N5MS37MUkvtngv19+HY4djha8L68eGQoOeC38vPQf1NFD2t+ZnIYfkmoDxjscRPOCUASBM67oW5sbh2I8xPYZ0PF2Lfym70p02kiBcc3lsIIQAipL9s6+3b7CPmNeIIiVRosACtvH4mOnVV0dPdc9Y2bWEAGHGPd3TR1V9R/HXp7/ZBtCE6UwPwCCFnhNng4Csjqj8Dwyp4c7PuFlm1cc2f/CjZHVoqVIzt0JFQppW7L/YGkJ9hC1zQ5LkSz7brC7sQQjDaDM46M0PmQaBh8CHjAMBDtCu20URDqM6kEIygh4oLUjoFSZinH8PB2JrPdUiwH1YP5VqHUGON2rBM3nOcTkuGkYZQNUHB2WGh4AikdlNCSRLgvbRNsc0GeSBMA6O78daURZ5kG/wVoyB6A2kf2+UqmGH+thed/1okRMC+55vX7eRN0W6sUVudiH8pij4odZUzH33lItggiAOplhIGyEoeDgGrpq+rHfsNLB7PVJ3PNEGGV/2O1cxwWLBP/fM9wdqoBaYkGWQDQaawyrPBkZpvyaHZaMAuHdPOJPFkCzAOcTZt2Huc2LgOlelmwvIsnsDvzjy5geihYpAIViG3WB4fKb9j1/09OUrHX78ovXnr9S8bOkN1HKPSAIEFcYKvBlqzZUP6GhRU1Jil2WWZ7nNY2xfhGXLZs8Hax4ThRVTTUcI/Syv6OrmjhMCsB1khMDlNS2v76hoLihULf//YrVgUTveSeJiPMRp59eCIkyDzGIiCpn28wzAM+l//7xG9IijeADiBSu44Ggl8VCMKiA2USQAlN/IVVEHqT4wN48Ugo4N+cSVEwSGJQ5eby/p+uYt3d7fMVXg44cPbDeIeYNzjN2uP6sEhbKl0ONpFj0/NMwFnCza6SD9RCNFbO7lDxexCuEy3vY9r1ak1rIjHK9uxoSrbY62vmN9RMXI9jqDeAajaAyCxMAhC9d+hEf8esvB/vdv36jbdNSvO9qvX9l2VeZvETUl6hquOEtBI5nDTtMmd10h8Mf4qsaAabL4Pj3X/+eeQJqp0PeOEhCpGEURbfz8upMrBnuNH0bksfaIONEsVg29dp0K2Ip6viDETkIt032EnYWOe67Ow36v221ZnX/38kybpwf23H95fqCnf37SdrNmzr7A/6HOzZgY/mqojMFFMamwTuHe45w7n9gyIbKod0MyftAbkTxCRUMtyeQNFMhZrG+grqpp9f4jLd/f0+2ff7BY3/L+hsrLJTVXF9QBHgv9Iuevj9QF+/CrxWKfrdsl9B/8XAzZuP9GZPG/vuK8dmgMjyybQ4bMvX6LMPmfGgHnqCe12kKbZouhGf01/DNriYFiQuGaQudpZi2be29+nWk708KBzLFy8h47H3HCL+Yl5/vbUGQMG+5Pyf/Orbe+4OOvP3cPxsP3n8aBzmkvfV4ovTSMyBemEIDOsj9Qu8Cc3okOl56z27ahdtnQxaqlZdtQFQ50++6K0aVRRajQc10Q/34ppEmgJsJ3vaCMaWD9Gy5SLVZioWZifFSpmr0UC4LSeuuyjDECV1SzgpOI5vUxMZ2/fDU7iWeczpi3OUQeRhxzgo7PSLllVC3WxLqOOl9WHKNs7xp/72f3Oxtbfw4UFK5YfgtyeIhtM0tcICl6DbRPWTU+j+vS+5X3NE0b13F/JielbR+go+Cc2WpFHeM74pW2Tm3XET8gFrB5jOS4bwuLu0dHIU3eVGkSz6zdzdGHsko+2lNVIvRXOit6MhtgIK4VcWOCllZcFhs+oUqjcIu4zeIrS9qZVz/2RUOzw3kNlASLg+xeRKNuLKyzKx2LFEsCBPuCrWNMeVcUvB8bfAaQGxY7m9ifOK2NdAETaDSNIk6EMIpgFAe08cfzUdcN/QsAAP//1F1db9NKED27jmu7pWpL0kKExL3S/f+/6T4UpRVEiDQEf9toZmd2104qIiQe2JciCI2ddWZnzpw5ZzEvDLVzr5R0SiLnwcMmgfqtnpBxMOIg4r0k+4nKNlM44DruVPyx56Ncg1rtTWnyMwQ1/nCkG+MfWrbIaOV7PnrUSZdXT9QOv3XdgkJQG0Y3xd5FVyK+jJTQ6EGkXwRVzExl3j9N7GTexc0+JV4BHNGB3ndBDfyI9hXZOoDpJE6ISoOa1ZkYRrhHGZU4UYrMqC9Tr2pCbY//Dz2M/SvK+brfet3z5RJ9OwFaDpIYhwdfxyscmpVdFdLBCT7fJqIkE8DB7xQVhX5vqChqarYtos8+tRaXq0tO2gn5ozhCQkvEDmBgoKx5doiCAo06VCWNeFyjEV96Ss4TKTgVCPiVj234PM9vE5vJ3OJ8tGQKpM2D/zxo89+Z0RdaiJ6xOJkyUSfLSLeKXz06ei4lAp2Nkhhr8GMAivwG6bLA+t81srrH4f8nlE+f8fLpCS9fvqIhGzsYTszZapCZARYXJkE6iiBebJrl/zh4auFkDQjFjljr6HW6rsMIS+NF1Vfsn/fYfdmgGSyu7pa4ffiA9//8h5vlmsEB0hVI2pz3lfa8JpswSpxEpIyAn6DanbjrNNM5BW4qRUmyHQ2mRf708vUr5nUZJqKB7v4HKAVZCkMEdVn+qd0UEUwMSZpFmhcyhiECrcR46J0wIo1RcAHRDijpkDUDttst0jxji0GyRLpbLbFarbC8v8fbt3d4eHjguJdlhnEyysUMKz27UZk+ep7ma140alIy/S6YYBuklL4zKP6n1qlOtQInlCjE9kT6Pp4KuFj4cTG9XrbtSVLRfIEfDaqqBvv9nuc6N4/P2H07YLPZsEo/ze9z94BGq8YESWf4pzGqKWBhL1JhmqWoOlf055eZS46OZoQTJxhnHGPFF6F6Bs4+h1NR5hzrPS38fYygmGtPiNzNYlnMMGNXnj7YlqneDAsjlhUn6wQHFlmKdGGQEbuubzGUB9RVzcr8VOj/eNlht93isN9h+/yIpipRld/RNgeVCoVMuIo1aUecLufJD6ehYZRJc9QGP0fPQm/UscJ6gSy55KA4m7iHoTML7JsOhpLYnCj9Ca7XH1GsbrFcv0O+WiJ7d48my9EVC3T5gmf3K2IwyVnVmo5HbKy1U1BG1aXNdA9f0RgM+/iHbSr/hsWsUZ45DudcDCS81nk9F9T43aVi0nF8Y0aSdU0RPsPHsH98PdDm0nAazDPT4h8KMOjI2wlW1K+WB8XUSSnqqJMoKMttjg5UJtaZnjdUbVCeaZh12+HmqsD1m1sGm4v8QppdowOkeZwUqMsBedry7D8B0zHgRN85itu5FMXMJh1ax0BlINZ48TXH4CUHKRcZKLY6jTEpioXxpNTxQWa75w2VTrTCuMZJjzUX4jX37o+Ldb+/wxCabz0cbVxABx3vnM/t+62Nuu9aA6hnPqIOvb4v5dC9/K5GmMHw3vGDP+sGtRtPjKfgx0J81jPMuqPries4I85uo7AH3N4mPr/n2g2DL/jpHhrRNmiFqWDmwn8ewDkdy1g0HMExiDW2bFDy57xKdAxioEQbjjZiY2shr8BhIiKBmpuxzgDdQ5QzNL3runPDtSTRdjofCAwgbQPJzeWe6N+oGepYmeRY59jhfv+IucDxIIw7qKYD7SXVK2QfqtpxzAQR5nhw2XNME3pfbrrTPsZsMQKm5XXswubFIZ2zg2oA6Ot1ZRcZ6qbGTwAAAP//rF1Lc9pIEP5mJCQghDUJtbEvm6qc9v//lT3uLWXIOgk2IRZYyBptdc/0qBGSE1KZizECASPNo7u/RyqievSmKqjLc2U+KAnqpk8kmYQ0G3GFX1QvPRwmiEIE2wSp2AtknRMBViqezUlAbnU1VIk0yY3kJxnP8fBB98uQHYHT9P0OecxBuPOZU81bZygIcTLrdtNkU38jJrxpzpnTyRefODrKhoIXJQtvt0cXhvozQo9aqLex58F/HAwJA6HiploGs/D9Wdgi2O5Jlks24lZlguUzW3/K8DlNfbZYUjLDBEoCIgytbSKeYcKA7PLRTXCBiIMgQHBEM4H6ryadAmfDhH2MCyBrLvCkJixMVY03p8mMeF+wAn5bEaWvwv+z+BswsQaz3ODdYk6/DmXVsJ7A477E4fCM8viE6tn4hAE5J5uUgyhKLlTQ+O+h++wyjmSfKnfbd+dV/vjYCEev81o1PnwioImJHS34ZiFq+cqZWiy4oB2inZwQLjU4JMCRECjjFGVtYedTjP9+j/zpCPfwiOPtHaov99iuPsFtdxgdSkwrxwpBmfFJGguFculU000nIHKqPz0hwF9H2SBXpKsBCQBo0Sv5u5f3a9zer7H69x8O9ueUEFj+ieu/PvDfq+U1svErIHuFJhmjsRlXJTV30oQF+CVRx7ppe8pCl85bxQOe0zoBCF0Hy4tHEhcR6Yo60o7ciW2cT3aJBaYLrhks6hAq94nvYIram1FU/aNNFAdeJOA4ytmKptgVwHeHb1+3WGcfMcknTA2YvJ6zINnNzTUWizdYLhe8gaO4Lwn+4Y55uTZCB7t9Eh9be7KFbSLX9LJ2ktwa0tQYOCbVAqixZZWwrHj36gJo8VhzcF8Ue6zWK9xvNlit1njYbFikr9yXIfuf8PyFsOniTQ+h0DDi+dCEDYzh572nMzu7EGXJkvd+cyb01QThLdNxZoi/rNt9Pd2hg0adDDhLFvboiVzaNPeT+oOCZar4uWzMm3YK0KnSv3/YMWe/+P4fHjaf8fXTGrvtN2zv7tCQOvNTgWeUsQKTBPlQUvDwCvo2BCZS6a9jAo3nsTBpNU3L2D+Jr2P3DScCvPVeimfjq/2kvpFNpzi4Cul0jPHbBd7cvMPo6g/MlgvkV6/Zg7/OUzRZguPIYpd6HQAn4yShxIFFAAQzXYFXJGV76A+1czTU7NFNN8fknxKDk3tgaGj9SpAbRYTNBQmU39CG5lrdfuY17e8Yprf0OVn96P19x4fQBPAp7fi4mwzoNj4Oq+wB+z6wH/EhlX6r1rCXaABnSUJGXobvH8S6Gb5Pczy5ShGytiIUQMW2evk4Ca40Oa7mU0725aOECyaiut+4p6jIT6sbnSpLW4QdAtpQrJENBOof9poIQV/bg/68bG9ZcXU9tZ5OJQg6L6jYCqRKwlISvVp/7GfbJYmi7r0wn88jotm/oA3kEwUHP79PXe/zEvSLJoAcZ5V7pm57Xj3tr+lvURSYzWaojPD2z8eDoH77AkNdrfbP25NxE4tLQXRXrpbXC0MUcc8mE+9moCz7+hAGuvLvdPxiPZFU7880tbVbDOsrDtQcc+55TqOEIVX0xYHDCw169DTx/COyiAVyfewrluq6SRGbXkv3JdGb5T1DmgGyb+JCaIjdovNCmB8YAU8FTOLuB4SPiO2zLp6yI9T7o0hwE0pG0MuLyX5GhwYkD9FTmH5vOW6dTib4HwAA///kXdtu20YQneVdoaLYclwXSG9A+v8/06cCBYoATW3HrqMqkWwx5G5x5rJc0lbRJo/ZPESwDYrcXc7szJw5p5jApjT4NwUAzviTbRaVJBsGhU8IdBsT0i5bzrwB7s1M/kklBpIGyKTgZqBhjQdFoBKr7bkgAux6cZPaYpObZDzTjZTZKSCBgVmywcUgdNrLON9A+IcgnbNdM3Z7bMA+SYIUGvxLz74EwthUgH/4pNfEBhNQJFkcg7843WjCyCyEZJkuXgzWFRnQdaLjWahchw0mkgAUJgyPEhqWUcw0O0fzQyACxIStnBInW6hmKIIGQRBkkekyKPkH5qdQgryIWFBSQcvExXvJXKyOAZpiBtmkOAQiLZqgqBrxuniOk46MaXUbTNkMDQP8B5WBxlFmLRhDxzql6OEFxwDvuzqjRVnR6aphR4J2AVSEwR3w94cd7Q4H7jvr0FNDJYSoGXauZksOcBMt5amB5fn+AphmqlaAvY8+H55bbd9+6gCTGr40EYCgzX7jLFZ1wglINpPOfuckW0mjccE3gWWaKwHob0LFvAE3Q8OOvH31Db14/R3V+wOF7T0dbu8YHbAHQuDPK3qAHOTHLeWolHJbgacSCZsgn6UXOEyqXy4EPTjL83O93h45UKyWBu1TLrheIdnWkp3bjrkkdtdb2t9d0ptffyGqFrQ6eUnf/vATvfrxZ3p+ek6r9Tllec2Sg6M84Sh75JOqe+xmdjRV9ebnsKqGBCGD2hSKQf/450z69MSapxrb8VCmaxYURWFWrPfhkU1zKueTsw2BDFJOJZMjNqS6aeyI2anjcl1G3TDQ1e6WendD1aKh3397w1wgQAesT9d0cXFBJ+slNc9LdmoMpWfHYhsqvQdFeBkabAbLNkmgY+0tnzvMjvtE6imtpuBAW3Frm7Y6ePkf1WgE/CDmu3x7Q5u7DV1fXSvE/wNXhNnWQncZhwcQ9jW1rEWuGuDcegXiqiXbkULXQK1TnAMko7C4XpU0fJhyfDjbJ59RmDwW+Bvr/pCExML5oN+ZvlBHeoFtmKKMXENIveAeS7SQoV8V37PdMoHrZvOe/rp9x5X9m6tLur15S9v3f9D9fsPSfWgXQt8vvr5ynhpOqHVs2Iyd24Vi8r6TonDIjZKqx8ajJKa+x/Z+DYp8Gj9ntEdSZrmk9mRFbbugZ2en9P35mlZna+rbhvzJiu5BVFsV1OWOPrpAn4D0yyXYH0rQDlqLCeam5mBfmcs4wMFZhJVI1AanKI+QkKsxkeG/7AMJ8DImWAwzdZmvadjZoUiQqEK6enz8l6Ti/x+e5guWFkxyRffwGdCPfkFauIx/xUuS1MvmTpMd3hBjIH/LixEhq++zVOW9+kxSJv0subb9rSX1E2SlerhcEZdMdksD1VkN1l+qipoh/mcvaqrKwND+qpTWnor7oTuqcpGa4SfzipL1wuCec5UdiVGRi8PPgyLm0mAN9/tw2Mt8wYYmCAn49EHPnnwOL8FNNZ7jR9LjscoMAjQj/C5ncHuXMKXzGfzTY9WYCaFdUshKWwCm6z2uF+Il8KNRlER3ytw/SKygCN550sAKfMFPDZwFivY5EqEr2bZUe0c2f44pODD38ezNCWetxlsbgiVJnkKTUuJXg3LoWPsA86X11jIn89HUIrcnVWdBHixUljDn1ufD+D4AAdf3kwo3+2Zva+ljAcbIPPksm40truaLuAhrXAhcSfex/SBdb6vMY26CP0yQy1yUZH8G9Rl53sUzidGMEB5SzZGbjs9QAzk4D70OigYcJytXXBqgcxslSMl17eaxmAT2ojCEdWnbVngDdK36B6B+xvtFbJ2uEc/vg8D+R6S52kNFK9i9Y+7hY+294VbIvqd/AAAA//98nddu2zAUhg81HMOu0+wAHRdF3/+10gw4RjM8I6o44yePaDW+KYKoMUVR5JnfLzKAvWMA5HIC62cPWkqg/fx1kuGDHBI7O4hy1kY3lPKbSZUerI44b8+AGgh5Mzg4QxHJQUYbkgleAjA5yhaEKD8HkwfciAPdJiYBMv5kUafgHGFkoIfU/wyc8RmULKcH3eUM/yBrHVAKY5U2IoAIgx8ztMQhL+UkFAUqUdWpLwYlrJWrasCc+dJ9bEb8HbvukBagbLbbTSKe4v7wQe+Q34DqIgAAh7+2hcuOsoIctRJBN4suQQ25jxPX8n3x+HWR63j7VKob08auxvR4tF76WmJvrIKoETimlAowJCQAZTBSLjuv+722nDQnU513a+sQSKHMQ2MWuJbkHDr93UdsaPm8oe22F2AIqxFw5pjPDaa2S7Bcgli1cQsAOcvRypLG7Z8bZKW8A1xZKbAa66zJzdFIlcGBpJaX2RkrG/QBGM5Go+d8cE01zDhqKXA8Cgj578g9tVUyxhkIyPBA3ncmHQkoMK53tH19Y1Iare+eaPuwotXdPXXPLxTe3mkRG1qEmqYc+DqstQ1Bstu8njST15COTzYxG0V0BlYGd2WTv7c+Xm/0I62SHHqGVE5n9P37T7r58YvOvv2mdnZOs9Nzajn62kxox33ckxPhSkhJfIxOx9wTkpkCr2scJH0wU1LlBQw1J9eG5yNrJQyNiL6Qpqu8ZxiPMwRlokIDN50cbPKNfHBHdU7YeSspx4hAg81w0raSXVgs5jSdTeni5itd3lzS9e2VZHo5w8GazPXEKMihKOuMfYKaRZMRwrsxZnz3TucXc4r75rXL+5EaDHXah7pUFtqJY06UORM9JBAZPr3r9L193yXd/eX9I93f/aGX1Yp22wO9vq5t3qNpKPfuvaho2up73lv7mLRceMebe/iZ2G/7m7a2+Wj1COMiBXhDcgb9/JE7az4r7/drDJU0aA3RCq8qVZCwIRPN+cec10FDbPhjfr/Ch9c/78d8zHFJb9ytKbLCzY57+N/p7/MjvSyf6OHhjp5XS1otnySAyjCvmrg0tHNvXzzS+c8zjX+HQYtx2U1fGVicE+JoayVYNIAr1xQcJhXt20CbSaD2fEHz6wtqz07p5OpWYH2LizOK3MIg2f2GIxwC99sy5ydUab/U4EH+maxdQDXOXclwyIEWBCuR9fpwLVqeUxBGKjNKZ8HbSZIdCyPScb6qqRr/3Zg8Xfl+jsnQlu1AHQ0douPBfB4ML/eDscxrmd1LigEjf2dwbcwVSP/L6JZZxOP3rWjZcfuTBHwJRn3t7hd9YJkfgzObZWCpgK96TsyghDmNcZgFTdU3zk6G5DbuRRxVziQKMFDXX2BljnBImfUqHui0aemL9DH3su/P5zPjw0yk6qZpo/T5i2yf+QgsFQ1mjowlYTYBxW7yuMH6cesEc47rsjMYnVOPNiXrmxYcSKfgQbERTV+e3+4ms7dKda5kW6Hs23yUPMbcmobMOOZYk3dgmVXyf1SufJOSeRRz+figktmyrtGeLZ9Z6OVGBTQ4AvgZWV4+o2ezubZPx49BqXtpK4BpAz3/cp3LedX3qefbq+XEmBMLOShQrLU+qzwoc6BNyUwAItlXZLuenwc7sXwtetZjyLKL3jdBopDXlZ83ctUb8Es7SLNj3H0OlEHSFh8kXH3FH9rMawPCd076XdNH+cNBIR5bBglqEle4dY4BACl0tJXLMy4A3mDsSLDS+Bb6TPP9ssw7J6B5DfA4GXgvrAhRA1LZSvhTuB+AjnV+s0oIAijiW2C+ol4n48X8A2K539M/AAAA///cXdlyE0cUPdOzIFkW2BSQkBQUxeflD/KJ/AdQJpaEsRJhSbNQd+1FcoqXvGRerHJpSjM9Pd13OUv1x4c/J0uwU1VIs4WggNYGLIQIYQmexDf+v5TLTRXDTODFAmQV0bNBnYZjJkwBq0DpIk+Ty6pmqZWCd7pNOIsU+1Ouh760Qc83BUwubCQbCMuKqe2EuAn0bvMx6gTJvIBD7MQLEuKYqTva9bPXJItnNK4j0CcOCc73rdT+oan9/zTel8slex43VXCvS+GqGk0idt9NryEViDAriYMWDtzL1LigqgJJIiJW4Ck3Vp7c3hGOUH/fhILwqMeCapBBfXSXK+kHxumpVdyQoLI7UvLXSp49TyCHzafPH0VQVGop2HX7nNaA2wVLSCSx2PGzhGxqQLacdbvA7mHPgl6r9ZbRAnTLu/2B/Z0jTFtmFFEImJhQSXfIVZ6n4IFCjUY7+wNXiSVplGBydKh/4Co6eX2KmAi9F4Nwxp1r/XiAZclkCrUCchE2B64Xgf9o78fPWLJNsTv3RN0F6PNsDOh2A7r9iP7bPYbNFvubFQ7rDbafbrC/2wD/3KNTwSFQBZuFBWXeBYMFJgl+lTk2SEc+7YkLn9f4tnnwFqaIeiBWT9POcWiXuHr5Br+/e4+rV6IdQHoC9WyBqpnhOFT8XeNSVbVslNbdD+RUYVdSTxrqTP57cXo9XgDwcTwTpIbkWZx7HucKALD3g9alEX59o/IE7ZgUDihV4l6DRnuvJBEmxAwl/surJS4uZnj92y+4vn6K5y+fY7G4ZNeBWjmfYomke4W7O+TzLwtgqrwwXB5y31EQ1rhyQisTi0dYd187xXfbv3ndXa/X2NxucPvXPe7W99isxHf/+LBnvQqhjzVM/WFOHhWJE20TQ/p03YyLGCbWE5ouu0rbqzwpQ5GQ/kcFgNPuf0yu5dlrEG1sensf6iwmjlgAACAASURBVBJBIkmoIWvqKnYpXXW8P2CgLt3xiNXNR2y/rrD+8hnbr7f4dvsFx8MO+/13hvQHc06sDG132rYv78l4/AH/ZrepkOFMlCzqabBuS8g7/EThunj2Au2zJeaU8F8vsXz7K4ZFB1zOMF50GBYLjBRAtg2jndivv7biYRXH1HJKE5VLikSTir3Jeq7zJ8RkzAoAlXJLab+3PZMdcob4XSR7W/n5bHIcikQwgfjif1gAOAepTxtAZQOp+snff7wAkB+xAJCu9Sl1K2RFgNRylYsAhObSYkDQQpX8/ik/nP+Oeo6hd6qkqKSUL4Hzh9PzCQFFVstB7JabljqcLa+dtKbP24DLusGMrd56b8oE522zigWfC+XoN62Jto3ZOmNCaUgSOUaSJoKE9Dn1XBcnGN1P1T6tpHtwtKOJECf3fe9q7eJDXxSHEsFvFAUAO0Zd8wfW8To6RNp+PxWafNLN+TrJn11cZnrPg1jIHKcxr42/FAFq3sdOEm+9f1PQ53VW8y8Wl5uLj/zDw85pzMMQ0bVpLkS/0yt9u0TZUf5hCvFp8dzmUK9ubxQT25j4uVVc/0xcEAkNjBNktcOmNccQDlBBO0HlBFfWp/3ERBAp12L3ubGPLnGDIBRoTHw8dW+lMbImAF2n3eugyGtDUpQNrLJgUh60PqTfoeci91W6bMi8oOs30XujXZcFACse8f0mgoxpIcWeIeU/hppPxQUtiec4WO+bihM0L3j/MPH5TgXpCfWsyX9ZADAEpqEn/ADwg7dr62kjB6PH4xlyoQTRJSytKlUr7Uv//79pn4q028s2gZY0DZkZu/puHsdJoC9bSyABYTxje+zvcr5z6oH9WOrqk+xMkp8JyYniiIyyFEqGmSmidNDloCdCENHy95yVoAnOW8yImxheocQVppOfOyfMxNsND4UDG7bLDgUm/2j75Nw2aNCFbRp4GeRq50UiiFGt/yt1NDGReEgww+0dSkGh8BS5oWyYLZxUF0MbiNW05Acz/17JT0odcm0C0al5w2GSGzWk8gVppCOWCA76PIYSMJI9UVQoXoAgz8WweQ0A5K2ETUGNCSGhkU3eIOT8UkM2ZkM/2AGR7jX0SsZhGraDSoAteK51+bFRokS/s95QGCZlUCDGYb72sotsDHXJQO/lrUtrTbKlw4FqNfNDEKRlhEffPXDdW7dd49X1GNvOSOU6lm952PZYrzdot6KzH1lW0nOmiIIBfdCqOF6vlUYdqyHET+OhUPfUtQYKqlipXFv6sK55Q2RkcyUjlK0TN5QA5IdUYRPZGsmDKdURu+mgu+YGMqvWDN8QcV/1GM8a9ARlmk4weXmGkzfX8Osf8N9XcOvvuL/5F+3nOyxvPiAsvuFZ6zBtJaNbEzyL2b9zocbHYeSWb/CHXAmCs9HhTcgVIhxqN+jbDRY3d1j+8xbO11we8PqvvzG/eoHJ+SVGz+eoJ2cYjWfoIsnKdFzj61wuSKR1j0EsRG+GGfd5nGiIxr0/Yuynp33CIC3bEAxzov3vjdVeUuO135UNZYbgyilsU0h8KOIs0q8tBz++rag85gs/07t373mPZ7j0dIrr6yvMZqf44/ISZ+czzOdz5ZAR8EWlpSv5VpfWrMMOhDYRUOoHCEAL3pPlOqYy8bAFVpuWS7YWi1usVivcLW9Z+nSxXDLxIUnyURkTvZOhlfNtTDWAFHqjMRhJTSBxhEDhqlCYos6OfOeAccclVww5PmRo/w8t7UFHrr/vqFTs/HK2HwKbNGe1ylAa0ZBFup80lP2jvjhb2KGmPV1J+Yit/3ZJJIj/4fPHD7i/XeLrl0+sbYxug7Zv2URnBRCqz00oDs1Y2K2XDv/encejfytbHksIWqJE+yyx9G9rYHQxw4gy/FfP4S8uMP3zFeLpBM2zCcvwxdMRf66vHTovY8YBPg14tU7GPAVYyhvyNqaVysaZzKw4gWVAizOMWnt16P1+qpV161YfmsYgI2VECnjnvDJln487xDlS53dwDf7K+/PUZyxZsI+Ocgc5Mx5r4cj4lFKRUDJYmwmrxpVsfpUQfsZbQQGD5JxgKBtLTDBlLUeUIFzjRP0CcT8Y5AhdEzZsS3plPud9bjzmr1FDEG2PxhP7uuczPfQPnJRh1v6KSpw61WTfcumKT1wQco+xz8ocXMiUmSqVRo6JbC2deYWfkdvvdL5Ycq7RjDSyDH1KSOQOnELBYYEEOp+sxt4NyamoZTh5gs2unSfNGL2TiMmVdT8rSSD77di+C2WSt+AFBUcPntvBgu2Vzk2d/BJz0OjnHJFnzrHIlHcpG50QBTEmZa+Q+Wr5OPtCkjwoepjKMK3v3K7OnX9DV5u9nD+L19I3KLrZrpXznpnfx8EALRMnO5XmiuaMoOqmhEDQeeqHndlanqNT1bSoSHQ6n1tVk0m/j0MywHzF1H/hG9i6oz6dKYYpwtmCXIOFvOtbynMJUaT5KWwfKWmgSQ9ykPTkhIMYPG8q5zxcM1P5KkrZqVkwxRKikjwWxRPqjwIIlgA/RFppcuzMB6e8ezvzb0lxCxrlAVQAPwEAAP//zF1rb9s2FD0UJTmebdhJV2wpim7//y/twz5sWIY2mYvEsWVJJIf7kijlsaAYsBEojAat7FAUzXvueZTmDmmbBy1aW0RsPBG7SdxC1/dKl/RDFIGhUV7dlkPbCoW6l8zMHNXrM5rPtFOcFea2j2jxmaNd8wVv31IGKnCmfRzpFIfjcczDpxuXpRoYgEDFJ3VkbIFbZJ/XfGa7kVBNpPgMyGLOfwdLBrCf9Z0Yl1hxiVxzr0AAbapmkkeL09gRyZIA0mhcZQvBHPxt/ume0LzThiEmemFkDWSHBdn0Rm0+HQOt+w+VAMw3laD6JfuC9W4sFC0qrC78UPzbgaTwOe13vFZk/RAGo8ioqDJ394bFGcUd/YW4MANr8pGj0s65QbLAudOG0BHdSrNsbX2nAcEVoOviQpw2DaVm9Lym/NcHPuDVXjYe+rkrOny3KZhimi4XCMmz3KBre5ybgKZNOHUtuqBSbGjueCr12FsM+m7vBCRwCgwIZc5r8asFJq/Fsevv1NHfOkw6O2/qqtj4RkP2J8M07Pze1N2sBMg5nXuU64rdexsyrKHwxe0KRbhAFa+w+/ka/v6EH+4OaG/ucPz9M843d/j6ZY+a6F2tdrG1m04dlYnR3KC6tr/r60ud0zDS45P2R1Nq4foWCB6nzw1+ub3Br9UCi80O24+f8P2Hn/D++hOqeoPV9ooLjlAU2n0sx5lP0FSFNHRkXuu4Db/Dv+xOnV8vBzvzIc9mSfQWnjPqhLcsdSAX+xp1vcQSianc6+WWD3p0WOn6M9oj/XnAY33G7Z9/8fNLe6KvSmw2G+wud7j+8Rq7yzWu3q358Gm00sl3GPtVZowOmtc+7wI7NIcOj13kIv94OPBnoOL+636PPb/e877YkXdH2ypdTiRGi3KJqkqolmIsGnul9oXAVFfau4hKqu/+ZI6EXlcws8NA8td71G8fBg6/5XLPdcb+cSQzUY1sTiexeRElHb5VtsLu0M0BfdugbY5kjoDbP35Dc79nl/6Hwx5fbm+QwlmK/tijcgLq0rVqJf1K4dNKFJfl7utWlzM09Ja+KbXARrK9xbL4Mzd96tT79Qr1boPL9+/k9eMHxM0F/HbF3f2wXOOxSDhxLzMhlIl1+9GPPg1RC7bErgl+Es33ksbeWFpT1/6hfJH/m8LkuU5qhJw0g9ypFPC5zn8+rLuFjEmH7IBbuOcBcH3XJ9f6FiDi/z5M4vlfjaxcUjC44Gev5ig9Bd8QNBUnE7W5MJGITViwIHZZgxLatXVSJFLuN3t01UC9WLE0h/dfBXG9JlUxQFEE9dqRz9VD5YRMDZQCgXL2vVO2T1RGo8Lb1P03WSidD89nNYG2c0dmXG0UayuyqEBu1NXcBse1Qbr4Hbqhs/ramhTpQZR89HJ0Y5eCyg2SpuH+az3PDbmuG9kUXFxVcNphjfocei2w53JiPnNngEXKfAcoOcyirZ97pqwgrsrx2WTHeTUqzPcFo8wTaGO1WIxzOYScqXMjQOlC95PCeb6GaA7MoM7WiMlRGOzQ+Z0bvttg3y4/dq3pfhLzz2l0Lvvs1CrHUB8A0/mnTHaRMgDMqPRUA5hUGZkMIeq80Trq1fTcOupU09m8+ywecBKdl/lEmc7e6rtiYLirdFvlujZf9aIepMqDh9uMISCfXdIqLIlBIggFsDHJM8uhz+InwFr/nA5kDIxOwAQaZsyX/yuWKWfMkTlIQwxxfn+qrWaJfva5GKjSz02N3yE2sO3wNwAAAP//rF3rbtMwFD52km3d2KpODA32i+fjDXhE3gJpiB8V2sRuzdrE6Fy+Y8cNKz+IhIq2rE3txD6X7xK+fPuaVNm9nfDt8YHRfJQzvGN0mAd/QbFtsIHiig064GPKCZxXW0L06gYcA7b9y0R4L8PTswUGRC6cg8TQ9q16fHYiLDH4+UimCX6RNPXZDAbZxGSqBoEK27GPI48F4CYcJLJIX+mNK7xT57/owQMsHv3MEzKOzFBcT/lAIkDFw84BdWvfD/wUVJDURzIo3MmguphcVIwg8oDvCEiRLyQFRKpcqFAxY4irPJBGW8C4IehsoaQdpwKH2a6wUw6/FSGCWTHy/LIAZDSlVhU01MULkCDZGFAFtBu0fDjKmzkUlWmxizGqRyyoBamgILRtXkzAHVaVztbnTOa5C9mhQLqNKjAEr8y60KAKtLxRGCIhFgEcoMW24fWv3MY+FcrAE/Phn7moEMUBgQN0DjeFQiGKpY1a+amxrNkPKpTQETMHAjd5bsI4uV/fEs0iqkTtJnw80w+I++gb/Hzy2dZJFd5tJFm4dT6MEmDCZMJJNAFAgR7zfTcSdUOkEy68P2xod/dAz+s7evz+g/rbWxrWd3SyGantd3S03dGiOZLuYyBQVBJBYqkxlf0pMaD+zvoXuFYfAeveZF0BTvI7KWYsLpa0XF3S9c1nWn34SKv3nyguzqm9uKRXhoozlOu1p6NjDgyyrV8wbqL7wNsijLVhI9SdXCzbv9i3JzBW2VSsEtlgNkWjcxXL7mCGqsr64uJkjeuzsOBFSORjyZBJBJM4ttutK9oCJqqw+iSb3uL0RLQDeHM7t1cUNRlCyArPgjywDZRfhVPYv4rSMf+fCwBsNVcKDgkPtIIki05f23oxOlQcP/Y1Bqqs7Y5pTI08i3WC7XMRsrCgcOzM1svdO1LVod2D9M9nkE63OlCBa2zPIINNTt67CvR4rWbkmJzbqErxhrai2M0CfNrd7+nl4Te93N+LWN/j/Vr893+tf4pq/27zJCr+3CmUNQCBUhpdUCyAkBPmKChI8G3NqLna9pspOKBQM64HgBOQwAk8UR8TtaslHS3P6N3VFXXLM1reXAu0v1tdyO/Hk452XRRdlh3bE3IQb/cr+PuAN+WpmT4zpSZLsvuTbM/wNbBai3H/xIIGkCqP73Hc71Ljs+okojwPtmZz54FjO3fIOhjmdV0gutUUnzcXH9WIF9qjAbyNyDqEOPifx5wugCDo/qHg4fN3wNWnNRRkMIh8tEIP+NDkYztQHJLQ25pChE8Kb0lpfFKIY8eJSA5rhgU3xxBieRt76eTzz/gfo64mB3fw91CAcEMhSYA5LidpbG0EvfW374fngWMbTagGT3DyeJKjN3FA3LnW2ppcT6GRQt6MmaeGxSJB26VpR3M/Bpq//7Amwt2LLGZGN5pgORdxPmDcg9NQNenM1ub89xBIh3B4U6xYkviyAKF153W/7/z94X/fGJWXKIsL8j6nEHP1ce8KsUK8ws4PBQQ0foLRDaA2XzZOGytwl+iDer8KdeGjiPlExNLg/0IRGUZ/r2RU72RWh2g2oIChFHLdHyH6Tta1XojuRJR7UvbipnH/+onWGmn8Uo4LcqhaF0CpIdpMbJw7n8yStymo7Bqn656pOYucx3D9wm4TOgXIb/U6tTCB3LbMW3AeKAKSi7KumOkvlM0g2DYyohSOcshphZpisH1oMGhzNs+fjv2xxCPg/gMlrsgEs460BrY/P/Zsyr2dRvoDAAD//8xdS3PTOhT+bNl1Cu0tlAIDLO7cLf//59wVTBkeKS00tElsS8x5ScdOWhhggTZJ00xiO5J8Ht+jsWDKJphAPXSBEBIgd/bk4KX612XogsF46EtHgkry75E4jI6GgXKDk2P1z/ee9jY8hMUmFF/oIWY/TV4E6psoj3UWjrhv+AqRH2wtyBUiOUdOuFPSSTLVOOBuuIpEWOK6Tdt8cY1HaouIJqFNUussWJJOn2H+mWTbRc4ClXJI7KbVKgREzrNsmBOuTl2qmEM/5A0jcGLrBQ3Lo6hPanKcE7xSRcvFjPUm860a5S8anIq61hsn0mWLTs5RlEC7JuTvtQmaTGSF5gxi3nx853KOXPBzpNXqImsuzOILWVxFk8ASMQuefUdHXC6KIAjUBk7sZGhjIAjSrqCMKebac2/FQYq5BKej0RG1tBvRhRrH3QOMJ7Qpdiw+dnu7xu2mx6YfuQgwRCsGBOERj4ELBG1YYBSSrnr9V7nbPudXliSyMGTrPcGqHzWKGODODXtWPbDNp55pMvgcZ5rvlEC7UBnK3xQQjRk2XKEdgaOjE4TTh1i8OsOj1/+hWn7GeHGFm/NPWL39gO3VN1wtL1GR/zrdGKK4PgiMObEqPwVUXDHP9mDRHZGkhEaqqLNgn9FBxuxAkFRCLPbA+mKF/vojPr75H/XBIZ48fYWzF//i8OlznD5/icOHxwjtgrukdRKueHPQYXXzLV9XKa4UiD49b5u7KQJ/YiTlqpmAqs8VVE+t/G5JdE14jmnRok21k1ePDoamiKitoJwskAqtKhJvBozbxJoVt6s1lu8vMr+U9giDUG4JkqrVcis+WfGYf71+un+JDWpgtXWG6KGZhIDkWEBBD++JnjqmUFERm2zUc1/XCr++rwBwFyD454cFHfn4jK70m93KSSJKN/Qt99XQVNLhb8VDBFXqEcn29OsXrC6WWJ6/w83lJT5/+MQCfuPmGkgbSVh4rQww5QAG/zIc1uhI99vq1ebPn6q94l/QaURBZdDgkPY8LsLVYvnJlnqB23cYQoWjx4+xODnG2bMzHJz+g+7ZKeLhAjVx+BcN0qLFOgDXTcCGmhNBknZzZKCep7eRRZrRUbRTikwvmPn17xmmeXLn+7Kwb1UC1Hi/Dd2+RCiLSmqQGR268FfGHEnCSU/aLUr8aMytf//WYRDfsIcHfCdXeHZ5uVvuXmuDKOEzdTUJnz8opVPijphtbym+ekAdWFZSD5IktwLFDyyqmVCNPavqcyxIRdNQGi1sIUlzLaj+CMdzTsS1Ut2PfHru/q1IwjrQXmqJ1VQAezr/pJjOqKemeIOknQQ8umsmn2UdxQxzdu+1OSdOB7IfDorEqpz2l88xMFkPc5vp+Vyt3P21eNQnpemyuKnpW+lcz0W5KIKcttcnJ6pHvwVYJLrJBQ8vZM1JGcWIlPQpirrW53A6CP5aIOdPHrY+5Aao6Rw0jR2ndvw1lzCUtp2vNGXXei67MTSAiT7Xvv83WhSxptxcUF0cGAZNYgsaxD7H512GIO8NkRBLU86KDPQZ0mgdcrGoPWiErqy0EEOQUDeeKAA0h0z0277P8gO/joNquJmWhTVqbW55kXNDBbDFOzWsiAZhIsAzKqK5nAm9eroe7Bw4RzU9ADLKIoQLxS5REnVDWtMeMJDonxaCRGhRisPcqdeig2+G2nGbjpuhSbgRr/NRtOlGdmAYyAJSY6y5ptuE/pxqfAcAAP//rF1tb9s2EH5EUbLsaquLdCu6Av22j/v/P2Q/YEDRFglatMXipLFNUcPd8U4n2U5TYPzSJIUdhqaOvLvnJcbCKVEtgHNQFu18K2yGoReh4TenDrZMGJzEqiDCBPNPbJUmPxc+EVU6mrGRJKvw/q1qWClqoPAV3H5k5Uzukg+GBLilri79LCUTzrg0ZnC8PD0QWklKHkIOWKHCByD6UCmB10VnQZdhNOFApQ9MH96ESNAP1x4mhsI8OmWxh+ifSfUwzwOkiFLFooqfCuc/uK7DKbxQu1n+fexQcHZ+ocD6GR6UpIqslSWFrIsgYTbxR/Enz9ZFYIpAQBFUSYZaOBYxxJEStxhE5VVpBRawnH9ouQShCC8uR2V2SvPDfPmwAnCBV9aKZRYudVC0Y6TfF69q2IFPP0kleSgc61yb8jBxjQ8PErD4EhAJZQLkVYOhp6R/xRdgclJgysAxYXd3QMqBCwLHJBJ4dJjLeon9yDCWA7USOoAoj8scg7co5DmVIsWCQ6hDrYagUN5hZOGaYPJ7i8LAQsRtcLZW3hKRK8djto50VTjB6m4wBOFAqnYAo6NqYEeHEQnKrSMe2gqr528Q3v6O7q8/sb7bI94d8O3dR9x+ILvBz/j35isiHSbHATGN7ETQsX1bxVzkgMNJwU/nN5a0XwGa1gFhey3BAdBFjbcRFRaGEfthj+Gwx/XuC97/8ze6TY/t1Uv88uIVrv54i+3VG7Tr5+i3vyHnnjlcdInQg2JwNjWDs4XRDuFyLDtSPxpenAxcKDyiITcUtf+Z/Y5Q6CUocNRi9cZVX/HME/i42y/OEYFeQzFX48/AF7vGOhVsGcWH8DB7nkNIFicULZNV1GqUHUPaBXJY+UIgnVNFHCcIesFrlsBiWBFGG6c7sXA7sxQC6ka6Y1kKPpUT/pz+1sroOUa1ubj2UxK5HB7+ml08e+q4FJs0jhPHMjJXMTGHfxUSvt/eYvf1Cx5233B98wGfrj/i86cbHL7fM4+/KsrgxHUNRWNDWOzzeqqVEUe5AC9KJLw/ZtdcToxVvjOUZGiOxKELJ6uz0x4higkajKsOVd8hrSM2r1+i2j7D5mqL8GuP7sWWKvRoNh3GVYMDdfipSVEs/QZIEXng2FKzw23i5kMpNGJySIBy6hfraJ9PmNwk/BoEFx+hNM6yHmeo27MlmrRAZDNWmIsdLxEgvlgrobIyEVBvH2h7wBdw8zl0wnyvmYCvvseZjvdjfvI2tycWAX4kIvh/Dn/hNR5wnierGod0Vsvna+aMw2i1NHXw6f/3wqGvy/lCPvktfR/FcWjgmBdZG6prI9Y1+CyKjajIx7YuwtFSROjajZ0FdFduW7GwE9syakSoyCiVp9PjPphn1p6toFWHixBBLmHzXGn+1+kSTX7w8zvUUltH4lBteQIW9wW9L6pVoUCQW8kB4uldToc1uH6So+g7vTo/Qpn5RDHEKXkUJJmK+iVTYCc9GTpboqJh2Fo8W4LalsbjmJMVrSsVieMucCqd2/bis6JzpQSbXt/3naFP5bW12RbmAoFfitP5jrBPtp86vDAj7c9lAeDAHHMpWnvKsyEEmHp8tK/Hco6PZj8XuXPv8wzRkIsmGOwHOSwoEpm+btdrppzJutT2Os6lcmUI82AilKeIkdP1CZyvMWWGrQNFdJ1yLLlLT+f0koKszQm/BhpMpKE5b3ZSY0r0lKQowjp7JqIuqHNaD0VHa7HHxCgLQoTnxej7e2tYc/65uHd4lzVu2N67fJQZnu7vAfAfAAAA//+MXdty1EYQ7ZFGkncxBAMOFMn//1Ce8pKiUiFlwEC82HuRNJpU32Z6ZgVmqygKI2t1GbW6T59z2qtZhSJjlk6eL2BODejkxQiH6P44AqxjBBO72rPsK8ymE42O9BJ055lN34h+T+FpMd8jSXAozWgayDQ3GkEo8yTZ0b8VN/6QzCnszapPuAABKDiJO795kLTw76vkEqSo5HmLbXLvJyp916cbGUR3gUksB7xGjl0XQTY+IVSs5cCkSE/SpMiICQIbtKgV91AQIwy3lNfPG0AgFCOtrJbQAAPYmdCAGGYYNjxXn+UFKqlokhZK6VC6WBO1K8TU/VdXUvpdNWlZ5hRInGO6Cml31fGyGt8CJrjV91CpVGu6WJ4Fmp1Wae1RAGGkrBv6RCFGIKf+cIBh8Ieon9VLKooeFQwt2n44IPJ4TOpstsbAkMCikV7sBH7g2MkezchaeIoJLngadYPO8+MUYJwjPOwDHMaJ2ALqMOyjl5nsjgzpaMa0W6EbS8cTM1tZMWfHW06ZK3+fOrRT1rmtfRaD0dmE2IEat5lrFEEopUytq1/uDKegHALHu/VwOi1wjzTIoafCdPt8A8Po4PLNS7g6TTAcZgi3Ozje/gdfb27g8PkOdv9+gN39keQEQwTolg66ZebRguypWQIhppvnRLTc6LEqnUqkBmiI1NG/YiqY5v0Ovux38Omfd/DXn3/AsH0JL65/g+u3v5MD+dWbt9Bvn8Hl5ROYUergWcOJEo/9ccaHj4CSYNDyxoBZi2MzNx07VQMCZ/lgdZvwGWFvkbr4B1m/ZYKumkkEgRBRp66AKWQYgMsdU3xGMO76oYeLLdP4mmVJ+sAlckeZabPM3rq42KZYdJyOWZfX8tSLKCZH9AJufaI4KriskzSUfVKvzUXmFwMl8dmmC5+ZdXMIa3Slmz+eREWViwioRfuxS6vSJuoxFzF57WgSmJd/xiBeNU7PLdA1HYyHe/j2cAdhfw8f3/8Nd18+we3Ne/j6+QOcHr5BmEYIcWKTvnhiYAvjhotEsW3MsZxz9rSILv8nrZpYbplCkHTTiezcsN5+xsuPna7NAAMiodsNXP36Grpnz2F7fQXti6fQv/oF9th88w5OHuDQX0CkliTr9mdiDUVhcAR5VthoS+MgdlQYBw3k8hxNDFq7tvbndQhdK4V/toRVYDYWSeP6tjr20jZhVDJgJzTpez6B/NX+lqL4Wr77fen9DysxUff1GBOCCpsfbwPVtbbbP7b/n/ss5f4TpYn/QsCJY2RCAgUXzB37dD5VkebRFDOONOo1/Qz9TkSDj43vzk2oUqGiH0EAomdjp71h9kBP+asAbBF9NE7UNGk8jljB+BXoQnSd+hSNkreCfg8QxQAAIABJREFUyAWIOpruj/crHSMF/fXiqiae9FAtgcCUX7YdgWWw8j5XWQPm8FQQe54oVQMqtpDmHPG8OWBBHx27BxIPO3mngBQrmkf61hc0/DW2ru1e127/dpt8Tg6GniUM5D8lkwaSB1Tqvsv7xIABWPy3TQY2WA6zJJAJc2bKy0G9sVyqTfS7a0M+EK12HsHN8+l1uoAaApK2X1z9g23qNZCk0048wZzxXtIOtNZOSt23zbUzwEt8SfC8JjOlTAtQ1+SYo+elfzBn7wdfGBKS/M6M8nMxb4/3ABm1m802+Z1NyOyW6465g++yD5lPowljqu90Lfa+LxqrHB9jej60biKZk7IsTc2gvnBkgIgs9jmk0X76nbTe1LzbsLLtOuPmZslQUX888mQT2Tqes7IAVJJAzv7JdB/XwUa8GnLNwZJRltjgfcrT1JihjmOQmY2O144BHPYKKI9V8y2duEMycwD4n7FrwW3bCKKzu5ToSIXQNI6RAD1hr9AL9hwt0MZB6ySOIFsil1vM5y2HKwotgViJrYjmfmbn994Lv/z2a5lc5RtXNPK0jMHv4uIh1bEcxXBhYoS0YRgss6Ibv08b066PVY4CG1IYFl0CgKzdgQO8OXAbZXHIgmEcirWhc+aEgxPNMF1kcCuu1Bg3ZWEn5TXAZlSd+rEGyzRNFdeP4J41ONGegzYX/jkbfmC8MQHJ2nf8YsTzYJLBxIhnlJaQYdBMWJrlH3xXAgxjccaXg1KQ7ZGRDHLXRSVkzJNxCygJIF/7u71yAlgbIT8D5FlkkVsbC+6L7gZAF970u8ppgC4RXpCs98mvp/Np0fUBXD7kCvM0Y4ZwIVmyNlZkmVEoIXTWUnzNEZFrAABsF79uthtpS84r1X+yihwOHmGUzfMBJyRkZjBkHTP5SJNRnPF2MzZJ5EyEtbOrBgw4ujvL4Mp4N4ep7gM9TKoMEFpngwb7oyQEVF2A9+zztyONY5Dvv7Kue+BD3fYbMOyGW+NOgbR5I6SEsrc2sXZx5AmkL87FFTwzPGSVr2GMIa04mkSzJnaG/+EypoDDpLysAAZjvkfW3EOA1jTCvaSeSAuybSkazPOfnoPyrCSB/Hp8/IdOn5/o6+9/0evnv+n8x58Ujy/UDRPtKIlDJhXIoKX+ZIoBcByjC7KVJyBcV36dLJN8ls2XsJEnpW3k1mLWF/npxwc6vHtP9x8+0uHdA+0P99TvD9TvDlS6LY2xp8kRjYo9RCWPJUKzaul2ARXVmTU92u8+Zk0OrbHUr63dW5cmW5d68GuBwdJpXnYXqU0tUuXCe2V+zSkdV6RocOFz0E2V87WzKokQJ91TX2/IViCZgvnivSHdGHAsLIEwY7FTHXtyHAtt4li19cO8X+xe1UGutqyji2X/JaEYlCsBnwmsH9mZyBwFWc7jYJCWSVqMhaRLFGsKnU/f6XR8psvLNzqyDv/TJ/r0+EjPX57o+/NXyhcmTzqDZrQyWng9/jp/5ogSUhhNVb/tfAjlGsMfrJUeEqrS1m9ynLnbUrnrKR521L9/S/ufH2jz9gfaf7jXqv9dLzJ8hTvieL+lIIkCqXzHYHr7LrEQHQghTNTKlWCuiyWtQrPoW7b4W/ulTut/yMhdJ0ZvfF4jT0dwQstcdGnfg30YPA64weouJR2vq/1ynxtV4+DgYgggvD32LbCpgS/M6xznxhwAuN9AdcxXbi8+5/9IAJTYCVkxJJDH8+A4OFSmLrizfhEAFj0XuEjCyVuvIKR2gb9cdE8W083v1Iax+s82RtonduKT+EXAuKMqJ/CAaEmoq4e08ZAQYunjeogimY2AwlJxpHqyXxvehqtnbHhd/L1lLm2c2D9SyGknldXRmMyTC7Jo5YxA0Ox9V0BSBQe/4GGa26cRoOv5NJpEtdl3KyAJ5wtNC4Z8r5muhbJpIS9XK6J1LCaXKJshAFXOsFCV3iyGT09ODturasCnKy4hjzEGkR4ge8m073FedBaHCBG4SZx7uw6uNHJnoIxXzgtMP7DehG47xFtWIGttBI/TOA6VJw0kb77rYBzg/ylRODT8JdnTdEdoUTXOkIKwTPqo3PlYib61EzqaPJ7eZzAeOcgZArqNDmBPAn96vVSCYPCIYR6Um07lGAEdRLd2tkIo7JL/N1nygLs42iIu3+vF4iH+OysN8f/nNYrkCpJWUCuTcQYhYOPnqsqZ2k6F6cyQFplDT5pu5IY8bi9MTp8S7bj7zZI5UFCowTrHWpL40DULfgq//rdJC8rgpoCMfJUJ7Da6RoZBZSsladMrkSIR/QsAAP//nF3tbtNAENzzR9ymSlPUAhJClXg7XoEn5DUQompBpWpFGxrHPqPd27nbOycF4T9pUie273N3dnfGffz8aapclZF0IM1TLlShhqZcdHRTq6ZMxxEkUECQeAFIDVurA93GQXnUzdOAEFmPi5CJ5FKx6SIlf7N5ClH3ykUQQdAspPcoe3+qIVHiwcHHwSI1WJqyz40Zan3GOGkRMfZI8dGUH+j7i2xFUSMTJ7rKAmJx40kr/zdOP5xbRMPgoJNJ3SvrOrjG0k4CmUhjIvHrmgCUhDaso8ZkJPooo+s7TFYFNnwa+FgIyRAFUj0l0sUx1evahdou1vzs6Cv0KQYoJr9FSXmzTItckyG+fP5OHX+7yQR5pipD8zB5WCWCGVeB4j8+bqLzL+cqoSGPBX495E+BWBAp+KUUEyGDg1y8fgkAhO8lRHJf6iU2eD5P6khZVpABgWGirff0a8dKAwGMkuyB3agAQDDEh7EJLAW29k1JiuQ3kTSl2sUWiIARTaZ23wLu/H4IhYZxjKb2CXM/MIabdjPlQfkzHmrn3CJpDcIOUkFIxLGxdzRV1D4P1GxH6p576q9v6enmB91ffafnnw90/+2K2t0k5y4mJwBCM6b7rdVJSg6Oz9KsZkYrFnp9NoAhiVCJ+3YhmSSuWdK7yw+0WK5pffGWVudvaHFyRkerM4mIMoAD1RASEcqa+qqJTgqIE4WYUdK4Q2oos9tLZggDgYcijP8QqQMAYJ/TbmR7D62PRB9iDCcAIHcy3d9IDes6Mt0mqdn5MYtgHdKtLM8tHbrKKScFzs0BADHC1el0WYlclb9yxg8AAGeiklobKEC096KqIMZ+G0Cd35stHXOKu0abFkoaywAdt5XvtxLB9/1GyPluvn6hzcMd3TJp38MdPd5dixQVG0njpOsvQW6UjINYvqa2iWVDljAO+SEu73uQ/PFpA7dHIxzltPUD8c5adwtarld0ev6KutUpvX5/SXSypO5iTeNJJxr8HOHvFxVtWV2lJtoVNb6WhGoWkZ9FLvf3dQngpPn4fwDAofE/lxt9eRza/VDWY+/i3mwdDut8u4KINa/rnM8n7NfzttrnQNZ7PkvXgmGLFOHSwS6fOZ+XnM05ZNKIMxCEXPb/2T03yAgKwCh02MU+kfr8XQaC+MGkf3OJEhvPnrJ251prsT/akHPWLhwtO+ZsCVlKvMXwfGxYPm/qQ55Pcd94lpKEtTywnh5S8YgM+vX+1G65JqKEBwGAlw928sAGDtuQbSapRy514/eBNQYEkGi1OmLIcIGtDvlYa/uFtcJnJM5xjrIdrQAAgRhQHTNkErOSmFPiaN4Xyme3c8YG4WDHwl6A6lTZfmU7DlqbDrAHBLetkrhJlFizg0VqezAlxEpGXhneHbSVh22OwJva+k2VmOx3yiwPAsDE3F9nAECmI6+2MVLgYU+LxLAqcqX1JifMnpRE0JK+uwIAtOteFckGp0zG2/YNnGcGEvAZgo8g2cO1gxR8Akawbkk9PtTjnI/OPe7B6XXxHsSEGCcI3O47oLZGmi3cVoH1n4ONgTgzEQKmyHnIDkCE3QINbP+Uvl7iMfLUHR8H0kCTtQUHX/pPSRajDL+utwCrnJCSh+/bvsEx9oH4EL/H4xcAW+hP/XsMmRYAh6QNx4H+AAAA//+kXdtuE0EM9d5y27ZJoVKRKvHC/38K7zz2AQmKgJY0aZLuDfnYnvFuNg0SIyFUNd1kNrMz9vHxOaMKVInRpDAJVaFVP0qbZPwwrm97JLjLIGoRGQLCHkh7Igd+2CKP1aA83DyrpneuJtFpT70ILTS4oUjwJsXog96zOHytcIiZF70tslyRLRx8Qc27DQ4HtVrjMXoD9gHTVWsT+SiitV5qD514l3Hbs6F/oCcxyLDb9z5npzQpIDkOXbKEGFYoqswKMKXIwqIwgcLeg6IPQ1CqdIGGVLLid06OYsYPVf1a0Syf9hDKsNCUttP5Cq4LcHzF3zZ/2cRaWIVZrxPpA4+Em9sWuKKrLR04DGaTAL6Iquf4erVRG63rREKAg0DX1Hq9BkIWkhYoXJ8RZXBzwhzVSsY2RlMhBTujarBGwt+MiHIgABwcwq3a9kRGSKRRJYX0E6IK3iW04AQRAMEcc9ofKoAAbNdzgB1hjUOK2wjYF12qpyk2BtRPuPrc2ebVho3NEfsCtRcdVunwN/3e9dhGYFV0q1fr5t40YS7pgFY1No4qEq6K04oCg6qRS1K/40CnEBX0YlZQtryl9NM7uth+pMVmT/Ov3+nw8Jue77/R5uGJnh+fad4lNMsKmjDjg6sa1i6gPgC+a/hU/ppp0pBQ7D3mqU2wp1SSpLcV3X/5jFdPpyVNFyXdfLijq+U1AIFZeU2X1zdUzC/wz/p7DVRIneI8dCASsY2syYybYrk2HSR6p+ruR/c3+FLrz2fiyyz1wX969jsNfYInBgdVwVoHGin/9jz+zzgHjrRmN+W1MKjtgwn+Gl28+/gTtCVVAAEY6EH1UK+yKhcCEtZ7avYvoADvt4+0eXqk3XZNm80jrddP9OvnDyT+2z9PUA6HV7UyQCg8i6mejRLYJVhpTTgvW5fYWvNHFijK/TkEuMBjJ63Q+JFy5UQH/i4vVjRZLal8v6LV9ZKWd7eo7BeXJeXlDJZ87NW/1d78KolV/irRT+Ys+YyiTSPvPzaGcd651eLPChNE8uOttTk23mLc0Mja6oNIirB08py3rk3AqLehCKMvx5E9AGSGI3zHSazQy4vj9Y8S+fCjA0iQoCQAniYGiAfGTRItHTvP/PKiTS01mXFETGklguA5bF2ldzpct3FAFQMDr3uNKcQdacI7XpeJrzUlNGcWaRdp72L5qW9PNV0tJqJz4eKUgt2jlIbLFfwksc8v+73YN0pxCyBc56xUjTFk92gAbhyvH3vdEIxxoC5ivUMv7rWRqxC3fiGD/8cWwFBzQRNUMNUadXeRmAMV7MySEovt41zCFVMRwrGWOEtobb4W0/q4168hq0ZnqoUDbSjn49+br1pCgxI+0NMiTwsPTgMmuJj14k4rtJEp4mdpsJzzxZqhJblV7dGm4FqRpc01OnIg+Veff3/mLcqFsIjnC2ESaMxiInvnABv73JIAjlP2PTPOmLBC9ze7vhrT9i1EpLmVVJsrFcXLUYy1yj3OZsd8sNzD2LyYY9OEtcLzR5Ue9pPC0hGaeoy/oS9AksAaizuwANIOrklsf8frgWnylv9ZHgLHJI2bzT0hAmMdZZz8orWGenptltM1db/ttR0ULPh9X3cCoBhQEZXyYy5l94AZM4Ehgr1LWzQC0NS3U5TCZGwJkPtqTBPZG0POpMk/Kv/KEDcR9VPDLBpFYLGg2VyYKMivwBYX0AL3VPNavs+73QvlWU5/AQAA///cXelO20AQHq9tQlyOINQiqPr+71W1UoG2oQ25fGSrOb7x2jgC/tZSRCLixLG9szsz31EEv5h6w+N12oHOjO8zFVxUKCp5TUOdgM12o/B5676zsiNuXhkUpmI5hPX0FoKo+DZ17er64vFvKvMQk2rbzv0s9QSq2AjDKRvjdqCzJBW8QqtxIfYFDVR3GCJSWiCCUAfs4URcARCmVgU0VHsgsV9LRCKyxAdfUAJ56VQDSXDLE+fXY0sV8FNYnkLrcw+4WjmN7vk6nkDkJrbzk0JYMrOzIINYp9Anh++Hg3H0WyqtM4egNxYaTGGwveJqWqkdTigCdwm9oqhA7S04ij7EQat+VTUXlVN+L/ZJA70Mbp9f+wUTIF1tIgYj93WwgpFVwxXN0Cf/cv0xCTki4ThkWW1MAK3LxWOXz5fA3xlqM7JOnP6Mvho+1TyKxmdG8KubzWC/zDqPek44kQ0052BU8ULojAR1nKkwIVuG1HVLu20t8C/mRK/Zco2dCFrY6DUjkLkWGIItLAfJsAFIDkY5EN04XBDnJeKH2ksbU0wpkms2Ep15MeGNzofD4iI6fQolLczTVppqrLvAqQ9bfB5qKso50dWM4npPl3dXNN91lD9taf31nrbfftD6/hc93T9SqDtVZzZKwaxjDQF9TjTunU5cyzgUDdMhjSWv6j7MkDzun2izX9L9n5/0nWGK8zNJ/i+vb2nx6TNd39xRUZ0JP5rdBAJPnATl9NyLtO/dxkXascjfW7fMYfOIddrrOpb8j8XAji2EFBU0BSee3l4bX7ygyfKkIj7+/zuQKIPOcR859JmrzKfZWT/xdk0ntl5M9e2anVrtNZGetzU1mx39/f1Aq+WD/N0+L2m1fKTNakX7dmNmxZ2NxuhWfNF9+INy+jEmEvhxSAwxA0HgkpzwHywFxns6K/ZJb5THEs9/Qfdp+XFSULW4oMXNRyquF1TdfqHs/AOdXl1Qfl7RvsyEv79l6GaRqdinCfIJ+6bTIqnQh2xOp5d5wNEtRWv8r5tqX1gBP8YejfQKemaALPD1WTruwoso9pqmnCDwiiD2n5okR6Nj9UX/kCX2YiE9TkbCNHa9Rt8bVF3/1GzygGQYCzlX1ak1MLTYCMFgidOsU2LUsHEnXh2T+Lhqyqn07l7mdrqtPDS5g0YJJ7M1SaYXVSQUyX6WWhSDoiWj5W2iawNPd/mr6woRSU2sr2HZ15//6VlnuthAg8hEHtOCFOa5gMzzPjdThH7L64kOiFVY5U3HXBQBgOZ1G+dDz6vm9ei+3UtxJjdXLRZFVGuzqEUbXjcfNIHKJ5o0sGMWW1hptGVOAZDfK0Wofu2ZnnusX5EYC6JA1uiFd3QbV4EfWr9OoW8Q8wUN4NZxqp0Cva+ymLnGFSUJoIjZmSZZic6/jWtCM6iLjkwm2KrbPjH2wuI4FqAEvKHaNE5ngIjckPN/GCCeYCcHhAGO15PhUbIs8Ye/T0TncnneyXxmM1+CagDNwtHeQCrkfTxKIfV4aBOz8Oal0n/Jnd047gD5m080jdOCpORk0HHwXGe4T9MoMhzOIHIfclNUmnfmAGF8e1gO8ich/xt/Z71VCgMKJ6BisA4NBylu0oBOwjGIxx64/HI/MeKcG82Mejf0I64v35+a96iAKFDMg3FJikbh9ymlQ+9/OZ+2tna0QbKekmOOkf4BAAD//4xd6VLbQAyWjxib0hCYoWX6jH2FvmBfpNNmmASoy2F7tyOtPq3sJID/FJKQ+lpZx3cU33/+iPgArOnkYtUKXSa1ZKrSTcje+Lvd3uDoy4uSrCImE6qYHJwTCoVYWByEai3yRblQp8CAhKegXdriB8cf3HsUo54zCjHCGHOigQ4IkASlu4G7JvkvTmpRgULYWwumolSbAeNoC45/Z0GrqKJVS15zenAVNtnGOUOQ4telAcAc+zFzP/gmicqnEhElPS6Z8EpzIjs2cODmAPOv7+1GwMReOpFn506cL/MMwVEa4Jk5TRYA+Drgta7pFF6eA+dsAdaFBSNM7i1oaTPAQ4/oSNItnWG3UDK8Pj2YDNVwxPNf7KIU/h9kgq0NAqUBkBb3/PNKoTKi1qlem03Tzrqk5IJtVF/9Y1t+8GRYj/3tjCPkp8dBRUBWds7egmDi+KNSbSrcNxJEkXSh+E4uAYxoyEkfpyc5oZACniG3Q0KR8MOfrz+fXhbnnBxSgBEE7ELw+MLe59o0Omv0QaPFO5U0wJUgpEZXs2opTKV8X4or84RCoFTolk7TgdXgcrOHMaZax2S61S8d9lwmoid86wzJZihozfe7FvXNSFT1T/Sy3dPzdkf9ry31jBDY7mnc9/Q5VtS+TnQuqvOJZhLUnq4silmykA8j2m6JxRjHjJgSz2DWkXlLOgMyi9X5E6M8GrpYb+jT5YbWN1+pu7ymq5tb6tYMq76iUHUUq1bvncRvZbE8qPnyfT1CBGvlOuaLItZOoR8ovaO6vCy+ykUbojLuYaaNEKDjZWHnKSpErihP+5h/ZHuvGATHE7F1aex3AKlb+NEj9o8xmDhsrcKg8PfN04qBXoeEHGub9BwSi1QufIcnGp8f6flhR88Pd7T785vu7+5kun9/vxNPfobyE0NewdePZPEHU3o4ehx01vTdtAX3myZ65EwRikydr6Za7qNJG2eMoBEdCxawrSvqWefkekMXt8mGb/3tC3XXl/T5ekMv7NF/VlPPMYqb24zC40ZqlafWoYZrzPHzfmzCtdyWMFQfMk41aE9RAA4+d4qz/wEKQNrXefynxTrzPv8+MSd7lpYzYd+l8nRwye0xG8BjFAC/H15Q9K39xHu1g1FP6hLBAndJ+LgWCkurOkJYB5bjgReux9oUgc7iQKsimOgWN/VH9clum5Kuupri8CLrCvkd9i2IWF5t+yZNqGk+Fc7nFygHICxxkOOs+cB5AIpALt44B7XiUjULGqxnoT2woWZt1wDq7kE/v8x/kbuK7aqqxYO/nnjOJ4SOAUHXXAY/L6kDpUL3pWDQiXY+HkVOhsNrXFUYWo2z/IPXKzSppBnhaJy+KLbJt6MDQLfAX7NR8xLZF64fVGQNsZA0fwMNAfFtNiByDgGYWiO35cEfOM+jE+3D5j3TpWCbUn6MosrE6dxU1wvwktM5wNQbcHYUYVGpv5xzs+Ws2EkrYhX1D2xusR+g33oVf/l+XQtWpLHPvGibpVqEc7HC6YAgPoA2wVQ70AN4wiz8bl2DKMaxTvl1WMnBfpAbXihK/T2DqfYwwcknmnYaqHmov/zf4V9cF9/4wjFgGCyfa1rTToB2XB7+Bst/geiGNgQ0Hub6BSutkZ7sHjfbXacNQS5/YywRhopCT9D/O6GEEx05HbMOTJUOAuFEtgXlmIBGDgalOGaIwPrnHd4T4UtFPUKYnO81EUruOvnepmup/9ub7snMCU4QCKn+hUOEP9d8jrk+TVaOaaApMUBpLWVZ0n8AAAD//8xdXXPbNhBcAJRkKVLcZCbJQ176//9WJmmTjONkHFmiZRGdO9wCR1K2p30q3+whRRDgx93u3a5qAHAw/mAm/AQAKMZAdIGJuQ/gq1KoPQh64v6hoq8cfBHFK0nZdnNVxANNdC6mWNl89mLzoZVFYHkMf88niwQSKNSSTQWf7G6+0EexsBuKyvciAEgRQt447MvhPpWRdgIs/iU4Cm5CE5+ZzpP2tkz6/vmSSXYOCkbxQyNj8ABAJPrnPId547OH34uJUACPQasPbFplAZVEYyk7dsDGlOHzAMBT/TfZRP5k3LRZYdUDHRxqUulYjLK+j1XQUHt2FotqxUGRRH8/nIfGRpwNiOL/vIImalCWZmOtD2++zMoDzwMAo/1eAAAuBZDTbQYCRLOQC1IC3JkIE1wff3yiF1XY8kG9sQtQch5fR47YH4/6UZPAJ6Yr7OUbmhOOh6O21shLUp4PWcejlE9pkTEMgEil50gKNYMx1qZfQAR8MAsY2L0sAEFlzCelqb4sdtqTXvexgykMyGegJDoFAGDSNGWiZIY2gqAK4XN3j/i7R/7xC/ffbvHr81f0329x+vsWuDtCUBAZ9TIkLAcNCYvQGwOYzN9sjF0KqQkC2hq2VRmXxBZvgSIs96gWaUMp4g5LrLeScL3DaneNdx//xGL7Brs/3mP9aovVal2E7bol0upKrSTFtz3Yh08SUphtnu9/43bJ1um5ouaXAIDp9Q3mAlLF9BwA4M/5X7eXAIDqFmNWpAhPVxVogD8BAKpYFBqjQK2FIqg5aLIv5ZeQZEfK2x+OqtHQ3x/Q95L4H/Dj21+4+foFN18+4bS/w++fNzj1B5zyQUX+IjUt6vc0T9jZmtE8Md+z2ob2f2WtiiWrsvoikJsLB5nFUaRbyYcQ5xSwevMay90rbN5eo9vtsP3wAXi91eQ/Xm/Qx6wMfwEJMu5VJpWgcvFfDi0rq9+XVEuex+s976EfbzNjk+l7lorn08qW/yEAMD6OwWCYJf11P+2RDS75vGBr+1IPer4ce5Tgt2gQNVBiGPUkK/uPIzpTH9c2q66B9eobb+rbyuKpj32nonlaFRfOWOOMZSQA0Pqbi0NOxFU6aSUIyQEf4AYTlPRFNTldvt42vwzwo2la+Otn/GlzI6K9aWl9ySylPmlbpewrrXRd7IoHTGgaWeOxDqO1oxAd48+EcSKNC+++fwMAqOMFGcpuUWMeGMNaNImalgdtxrjGZxOdg8Uf0WLJopklFUrt/dgSulZW3Zkry3SrMVhAjecA6oXMSZSq+I/HmthROJxicPI+kZhjof32w6TX3pf+l/5mJfQ26+pApmPKGPWYMw4ciy3CYs1sbG6urDaTbgJbfMfVqoShxdJeJI73cSEkD2V9LNeIVi4v4xKbaCbYnQEltM1WIg9p7oJlVaclaY6tkta5oHFePEDTNNSii9OHmrT6dQ/s97f1r2tvvvNemM4fVwEnAxD2+32dx8HAGJIphcBLdY7ZHlK0Fx6LngB4b7c1nLbRyt9SOdQ7i8vpMWz98KKAen7TYNE5I5Hs8ga+66hfIBuBTo3l5TtolodTBwGdc9XNKvcVGXyvucAKWP+cs81B5vhBq5UlJywVM7P8y8YvwA/dELwmg8TjnrjW81pVSIgB/wAAAP//rF1Zb9tGEJ4lqYOUIdhwgBZFggIB8pr//zvy0uciCOq4SuRGTiVeO8Vcu0OJSoA0fLMlm8vlXjPzHVWph0J0G4k8gHuhhQ4G5YDxBEHlNsB4sfmmF1jlAWE+lqYKaR1h6vUcsFmnqULGY0URAAAgAElEQVQ8d7zjC4Nm8KrqOrSaM3YOBhRdm84DccuKVgzxkU5K2SWdPIUboHM2GmtdYL3tYWoLL8RZ0O78/jYIRSE0c/n9gEQd5OPZ31qbwOkWWHIAHXSpP/WTjccmQA62Y6pAWL9apUvs2kRgq7IDjWs3XQNewobSONBMo/HCQB0AjgpV8Wcvj7AwEclRJ2wxZF6XZetTMkeVN43vZEKQNsij26zPN17mzM5sThdVZpcI+j8XuwxcZWNfr9BKkgJ13qlYHWsOFIlDCioSWE5oB1H99z0vUwJTWdzEJ56BxJo8qBaBbYoQqZLcw4o2q2oJmyVA3xB3sk7VWzr4H7sWOkIMnJRecBIYZd8fgWLRFmnTWAi3iay9+o7Flfh5uQ1VEiGLLiAGCx5LVWq3PoqXn/PYGDjO5YSL2fpF5fKDBR7oaqT6Dw/dv9AsVhCaBbdvfVtD8+oFNG9fw9ePe1gdBnj+sIP9+wcY9wd43n2Bpge2GSTSh1BcR7FtQuHpBw5skEnTpVrD2bNZCsDA6Ma5l4M8MryQD+EgSZMBWzgeHuF0+Mxw7D//eAfrzRa2d/dQb7bw2+9voN7ewu39LzB2DZSrG/FDV8oHcewG7DmpgL0eACwIwBlRQ9UltTFUhh+jCOSxa1DLKQphAlP+yddknn/TzcC3cz5ClEpIYKSaocPSATpI0pM99fuWOfwRW3h6/Auen3bwz9MOPj6+h8+7B9h/+hv6tuMK2zKwrrmmx5Srz97ietOUTPLXefunX54jhAT1ASAjjp4SygXAgdbrzRJW2xvAZgO3v76EghJJ2xsImzWs7++YPrS4qSGsl9DROkx8fdqDAs3nkWkjXOVnmHWhokMFKxYHdU6xA2hKryr6I4JSmjQwuhaYpyT6GasC8xf083kodLYkm3x9po++j0D4mZdf41E5oN9D3fx4gszW/oy8G8dcaKGOrSImJ48gL0j2fn5HHdRVhFU5QlUvGBUKSgc0MSlynKCA2YoSS/VO5/lNgczpqIlrDaCHLsHP6Wa0H4h0CXIQ523MjELlhX+KK9YB7tSRf1Z6nPwiUxUrdRJhu+QZa1x/DSaMBpiEVILqWJkdBrp9CRkVUDIVkM6htEd6/3P7ThbFg4nuBTrRTQyXiScuBkRJEgeU86Xxj0dFXjFdwRCMhQQ+NO+YLldEnp98/iskecMw60oqmd/M/joEqA8mspsTMEfa6JlsCcdQ5OkaPAlIQ+bvg4PQsye7wtntHma5bRD5OZ0ns8ymzxjZ0HZJT8u7kHnYvu1HkR3BhiQEaHz23PeoZ/0RWrRg0yX2IiaxTF/pT4E/I3Czr/s4Qyrk5BE9dwyqhzVNWEuxU4ow/PwlTM7vp5M5AkwLozCzjsjPUhEuiimSwwJ2c9liegwF7TFozFQldf/0nM7JgvqJ5kCtwumE/KybJvWRxYTtqeOkDVEjLIDHXmzzEHN6NrrKvVHOudBMyQQrLtmZP47QbLSQqwkrPHMxSf1J7173r5T4LKei3tYn3JeE4rBYTSnFqZruCr+pr1UQks9ypmfgkBJJX4DXx4LbTOsgBf0+EWP9eS4WSs9MSRVCd5C9NAsJ6lokTgzWJ4KOTuhzsmTseviPtWvbjdsGokNSq/Wu140dAy1StOhL0f//mT70LS9BA9jJ2pu19iKJLObMDEnJNtIWFmDAwDqOJVHUzJlzafiBwMMxj02zBrGis9tiCr5VF3s/SeExo4aodAqj25s233IsC0oU0CzYxtg0xUjNWARJtTCj3mwezEtExFmpTQXNsuix3HQSZQQdG3Z17azJBsKYDWEkB9UeHEsj8KrXqHVLBlgYdcbOyabdRpXChQ/TTTPTUmKPhwwRibpBAeVUsAKokU5XxvGkJhfTRWxaFSLLwywOj4fDgDfIHAEVVEs34xA0t1Ze4tj0FLCA1utYJvr9zOACi2wx3YTrPH/beHzFXjAUzu4RI8BF91TQdEO66jgW0es0ExkJKGc6YbbmFzEliijyZlwnM5i8wiQX0KUqG8Um9E3TzJDN76m/3+awwiJOpBJWEBGMKMkAitEm37Im8lrD2nVksV8W45fXPU/KfZN9OuRe9CIBGHvk01N24vYwSerPO6FBwbXU4iMlY3rTJnLLBsZfaDZGYQJwkTK6hrbfjnToJeMWz0o8UtApLGpEVFUlCaTehZITeUE9patNpJJ6WDgt6rgZrz0FfNXw182/fcbHxXpNRzzn7NKeaGBvguWCVhdXdHlzRatToJs/fqefH/eUtjvqPt1Rf/9I+89f6Lh9oKF7oBDFI4GlBfAMYKkB67JjLFFsTs7N5alh0vuj94XEdJCB+IVXw0VmKASLYh3wlehE/W5PD7s72oaWPv71J/3wnmMGf6H3P36gq9ufIBXYXN9SyxGQfYJWNvmKlq2Nfx0SVw5Rl5NzRC8UKP/2yDrN7GNCWT7xGiXu7Q5bRUGvsv0taXq2E2DMKQhWNLQoZM4RBQeKm4AKgFwU35ow9rR/+EbnY0ePX+6g39/ef6b7vz9Rt/tKT/uv1IRRmF6OaBWM5SIqfdRvXhAXlmzgSVCwK0+OX1Ru25Wl+Rnhd4xqHMlNO5O4w3pNi3eXFC6X9NuvHyi8W9P69obC9RX5zTX1i5Y8m0EtPB24wW8DHdqAaL7udESBJO9BD2aPcyUKsGcNJ++7fBqDanBJGBKvqXvQnL/VLU+enllc8n3Nxe7/Z5d8//hvgPBLk+ApC2t2uKT7h63fGX2cm00F8Z8fBi7Fyec84A1KNWZwt8X7QPw2uE5bLhfwU+Gik+n/qzDAdJLzvu0Q7a94JI1npxNzpcxjsUZ4vSRM/welr8o77IQc/CUYIfzvmaG0bFfZE6a+Toj8JD9hjdS+PqmK2Kpjz147rJn0jUzKJaIwggYvTWD2jKOyAxdKdKqkgQx+ZSBAmZDZNMyKYgbKNBJNtO9jri0Ly2IK+st7uXxvmnH7OUhJfTFalmGNMpwyQ8TueaLD4UnPLUw/0wQZNh012SkGDS8wtKxpsPoD//dQJpn1te+tLwjleoMuf+iyDr88B37iD8X1pcRYR4lqU1o4T1sRX13FP8+n2qWRc/l3c80hDAA9j+Az1bqO3UwqZwg65TWXf0kBi5Ns/yaUJAGZCk+ZBADAlD4OAzseKuh0GjHVF8LasHVs7DTIUt2QpdMcs226/iljKGKY8tR1tNlcSu+jgJsNBXmYK8NAudZDNUBzs/c6N51j3+dz9Kphty9LNLB17VV2y4xQm2rnfUENZTMtXwe88nNlqBlPMTvVW6Q6YZi6yr/LJtjMPDe/MEsSCHrfM1iorASwxzWGXny4nu/PJh2w7wnTfgWadOjMf2/31Al4lZlYAvwICFQlOeAZEuo+X0uTp9sazWaXlQH7M9Nv63E0BYANV8+QzpQ0CDA+2HRxBrrwJmhDcb5GkE1EiaqHKSfXz1oTA/AE2Kcxpj7QPwAAAP//hF3bbttGEJ1dirLlxLkgroO+9q1f13/oF/YL+lAERYMigR1ZZkiKu8VcznCWclC9RLBjkdpd7s7lXNJvf/xehYMuQne93XTg5hp/S3kw40UXNfLvIwxdK3VFDoPeoGFI0pDgZBGOKhuO1PnC8s8T8KAUmYw7vlSFNUmX/Lw0FcpaEHyvmwJEHpx3VwG3UGVYwM2jIEYycYnqXo+dIwWm6bt7R6JAAC0D2czLyjWazQ8aFZnFDklAhgROyhwn4xNRhDIGa0BMZgnVJ8CQwPcQKBXDRzYcbNgVYrzwsEXbRUCuVChO55jHBxXYnNYHDmOBcYqHQdy4tt3zYlW768PeIV262ZrgByfhxlcD3ws8H7FgKYvcH4l+gG7sQHRgM1TvW7Wc5DHdGS0CapwYXxw0qCxzJa2auwS/n02Nlt9ng2NyRTMFCghZMQb2MO7paescVT5oYczzfNH5iTaAy4LnLFtSv9k0rHORU1t5rKYHQNZVvuw4GbRSuu+8QW87IJuCTrin+DlSLBGIuTl78DrLqdEfEMGu3Z7m8ez6AWcrshyfjnKf00hSMDgej2ZLmAVJIPZ5uysaF44ket9QG09fp48kCSg748xxJxJ2RcyrBtKlhVPGrhhbQe2kWyCwO6MK7Eqm3cKB8p7qMKkWwLlSGUaaTgOl00CPf/5F45dH+vL3Zxq+PlA6jeIqcKiZrhIjBYp0j1ZIuWVonpC2SIDtbJTQBcpwg6hICDLNvO8Y5YPH7vDqlt68e08f7u7o5u0d3f/yK9Hhlq5vXtO5JOoPtzTMyoXvxGJwvdYlQuaSOtH5GFpn7AeJXHKRpc26rTV0Z/8/+f9hErl+ov/rCUCCDB5/g361qSzKyZV9WSgZZ3tei4mh2rwk+HwrTPo8jTRPz5TLRNPzkcbTAz19+0rD6ZE+//OJHh/+FQ9+vlcJuI2/z8lFVzdFnpQ2Ku4BYWHnlShnW/8epbE4DIoYsBSvKm1BRDBzomOZ6akrVN/dUP/THR0+/kxv7u/p9uMHSq+uqHv7moauSnefrtXCr0D4z9ZaDetOO/0vdKHtnM3UzjEXZNc9YxVdRDyRrDCLoLfvLm2Am1fN7qXc/LhZNyUkx0pBcKTQZo9tO6oviJCliDJC+a5Fq0TeqWu42HkcBba8q05rsQlCYjiLKAjmxb/D85WlhLNS+JpnlD3SRbBuNsVnFGrU+o3hqexlv+86/x0XSHuL8zipr9xY2E4tJbfg6qrycF+ysV0T840wVZia0oxFMgqYXh+0wVpSox3k388Syfn7qsXUFACQwFgALuftVqNos4FAiRzvk1FOyRIkhc+eHZGIOAVURVgUtxBrbVJ50tL3jhjF9wB60ZExu53HeKIV0O/dZSra4nFxBDZiKdAFEE/NZ00Oso2nuxNt1kveeN17zFBqg27kNSl8fRcjbKmZXRAXi68Xu6tZiyyLK6/n5lpCd7jae9IU7xP3H5EG/rnGu+b/ywUnJNTcbR4MQs/xmeiZ1Wxd+U5jtpw8Bsd8YUzFI34YGnQa742wBAeCFhbYjpK1BgwFbjlZgrlMi9MFME/uBJaVg07WWcYLKAW1dFu5/Fg7vv4DBSnCuktwCUBzD3MfG5Ty3vQNEMNz/hHpEXyGRXvAbUFCz01tqKlOma5t5HQcYwBCP5tLhKO/mVbQ73xMVHh9pcAIdYLdnAJl1MUlTSsOTeIS8iLY9MkZTisioQZtgsWKXs+nVfcu6kPIPmD3K8+kXQeNRYw/9hdYJOp9asFEr79S37fPiBSUOL+xseK8S4T8xDVI9S1U04IRJBrnQiRQx5TPEM33+G8noXejUL/qzThdWvbv9XfjONJ/AAAA//+kXdty0zAQXcl2nJS20KFlym34Pv6BL+QreIKhMG3Te5rYYvZy5JWSDA/1CzMEnFiSpd2zZ88JX79/S9jskOir+vvKEi1LNOJ+gSj40EOkA5dsRGMqFk6djMzaSQ0eFnrez3NXn7jv9Sc7ALzFGmjugqBV7QmwEcECZSGYXKmuejg8clr7vMthMExibB5JBAAgB97aQAND1jCJZOgfRG3qNoocDHj/Szf+W3ZyO/5OxnpMxQsLZoGAICYqyJt9RvmcxyZ8XokoH3r47aUVYbclUOHXQD3n5FBliDiVVZGxOMg8lQnAD5lYTNv1W5uSBwD8/RuHvhNNPrT4juSQSy/whc2foK1gn0fruSOX/JOBR9hkOeFAst/P9IAJJsrjqwq1aCESaabIY5xG28BhuaKiLEMWLQlOB4EseQerAWsCYAk59HnfVQak04XfLZtRr2CJFz4hF2hjTbQ2NkopizJ3MXY0brgFRkECBhHWQzIBQQ5wO1res7CarlMBgqRNJzmLmzaPVTLNErI+LQngqz0nDVChLYMkPNO0hkdJtOftXKo4PI/4k8u1fJ9uM9DhKolGwOrmjujuie4v/tDT1Q3dXlzS+npJw80tdWu1k2JB9Dn3wTI11Rwn8hhTKsJoVH29hFU0WreXehuit5zDfOm7vw4tHZ1/oeOzT/T+42dxGVi8OaUQe2r6nppuIb3gqlOAe1pwyGsskVUQp17iYK4Bft2ErT5jr7D8MvbMSwCAUQLOXryGZT4l8VcV6SYkU/1eScLTtpNK+MC2Qhvtz2ObVqYxL68u6Prvb/r18wet7pZ0e3NJz49LCkYF3ZVvSvXJt52Awlg8SCj+vVAs81wzfJEqlX7KIn4j2/qERvz3+f1qDxf06vwdNWevqf9wSuHkiJqTtxQOFhQXvajys+/+UxrEmo/2WPHiEpZIrAGAqepHOxIs3/+b9+UwKVGHMeVqk/QjxxIAyBoRNfU57gcAgg6c7YU6UpPuTfMfsoFbSa6irME/PvczWH4/wNa6RUwBpOQo+OM24Ct7vrZ01b380Zx9jo/mqkqPINPiND5zJcGntcRQ8rtpMFtgjY34yUUl353BEOybGW000bMKdIKlWLdzUklZ3arS54rxnvcc7V1uvvz81+CKP6cHc77w8SC581sSytzisQ0mcpsat+/4AtPoqvASHwQXX2w2mSUJ5mcx145WzWcYB92osAMAEK/tbpYLY/zcItgHwUTEME6R23uZ++/Q543ZZWoQcbA53d8/yGcag00JfZ0so6pJBQBQFfB2AGsoYPj5q+9fMxd23VsKJesnB1qErFoPETm2RfVj5CumPv5GwqqJYpuBlmDPJ64EJk6J5IbfExZ5hg4MROwap4iOZN5XvXPyxLFCbC1+n4pvUINXi8bSDpGryR5AAttyJ0Ai72hTjCknpV58nEU3gxW+an0tjcHGrDOAmFzFAzcSYx0eHmSqPsQMRV9tUBvI2Vz/T93LT6h8j5ts6+eBAMwPvz/wyPdjh6SUbwtWQ92jn8cgNhkk4ntB40Ji2rZ0QiOLtfGsflx3rT/sTwAAfG6olns6JnyhuOS12LyFI3r/S0a1xuPC+OD4sIOmiLHc9+yf/ipzH41FwVIBA4XX6+ODOurBNQBFRd3XmHEyaYrhgqMait5cMMBe3cSG/gEAAP//pF3bjhNHEK3uHl9XEOIsIMhb/v8/8swH5CECBSRCdmPWsT2e6UZ17erGlpAyL2t5veuZvtXt1DlDkZ5vXmAzBTYcxPOBE1OQzceauT0RHDnzoisZhdxBFw9IxUir/upg+wc+n11GN0sw3BH7WGV2SEYCMQvRCfYAV53IZMHNrSsIBD6Z3mPNdnk9WmOblFYGTwJjWpV0MLRkgcY2KXr2i4X2/8+GIlgIXGRyMnZemaAxtK7dgPpGU4V8m9EsUqV3yAl9Bqxyga/MS8sEES8KO2l/aTaRsp1QDTM4lQeSWJFn1IWqh8u1xX3tUoPHzy/jOBeXKb5i1A0GxnCg4jZ7EXiOjV2WrusYG8ISzTCCwdCCHdgaROfsM+5R1Ag4YNAxGIZChHk++Kex0ASDrHcv26LjFRwpJhviaqApcKdQbBA5o+pcafDvUSPEZeA5PNSJS/KsastlfPR++h6uZt5uoBO4v/FirRJajedMY0uyAsL5gNdJnDA68AeusmNL6Rn40IoDS2yuorbHIOqmwPOf7mSdbG1fTBMbL1QqOJ8KjGdOEPhKwnk6cgV4YpgZqPwkOmKCXyaUkpDDaK9nK5uV4TA90b5dZyZWSWMQDoaB5j8vEsTtGuL9itAB2992sBkv8Ow4QjiOsP/wCaYve3j6+BnGv/dw/nKADUpchgRrPK+MlI8Dv6YiLEFgmxgo5vQm0lfLhnauyQRet0OZ4OmvP+Dw8T38+e53eHH/Cn55+Qae7+7h9Zu3sHq2g3T3MySE4C5XhCQoYcE/ybFMhlAItoiApG38rmyC3hD/d/vAtatPcrbqHNpbK7eYk0xxhDkxdJpiMZccDtSiNROB3zwdIZ+OkMcjXJ4e4bD/h0j7vj4+wuHrAfYPD/Dv/oHZmYO2bmDwNvH4hErY1xx3oUWnD2Jj9PTh9ojQJHgGkbkL9k6V8bOEEJ4xywSnZYT1r69hiyz9b+9h82oHq5c7AGzHWQ5wQAZqrCyipFyaYEK4Is7toLamVqIq92CfFLAmmh+bp1BZ2+t4VGQgL1GBopbwncNS/49GdoIusxhcB9p/OhPfBn+GyT60EByklejmVdoEQJG+fN1JLSYnNxVogBpcRyLFisTzoARZQ8pwtxnApejIcU2JK82LocA6gPs9dD2/GYZlh7C4KBQ2EIHx6b8TLDF5FbPYBJFVliTghI5u5AIEzgH2t/L9ckIy0mrMlUuhs7m3qn/X58z3S3eoALcx1EejREBpVUB6JEADg3fVN/uOUP2rvvoPUrEecrLXOJ3ZkeZ5dInKTPsgRuHLs0G2mWsJbQ0TwxXxnTUB9AP+Z0zmY3HfNlchSX5aOIx4DuN3+wNt2HazMT9wFBntW1eUBFsdYy9HKCi0LqnDBbfc/V2dD/UjPG+VftYncvz7CovHQJF6oYUYdhIi1WmqqN7m+8RH1OAoiTIYtcTNmdBZCIUHKUZpocr8uLktAGl77UWY0MECeUbocisE/y0howsnazDA9uhj9cH7mmhRIkGRHCTitlCseqzVadCkmLf1DlkLJpcdGckYK6+KT1ZEIXBUu4bjPEofub0WdIGPver95oYpv9nDeKbMVREgdEUeEKneJOOofjDLYquUHVg7tKJ5l1LpVsSAriX13SuSNotu/cakIUFsOMachPLsEkZ1zRTzpf2lySAQFSrcBJ4UUxNEHsWMmvlUYZfvb55fOPTwXhklIHGukBlabOkKk839SL+/vtZisecV0POyj610TrGoWNtnriSa1BZTmywi1eX9GOEbAAAA//+kXV1v1EYUvTMeezfZCAGFqmkl1P//j/rUh1aAGkhCIcvas7ar+3FmrocEVcIvSWAT2eOxZ+655yP5CQGH+GGYDY26ECaAThBzAm2iaORCpQA0ytJON+xLQOTV9qZgYCoiuKUYeX23RxyRyf9tl56ERqjGQ4qcwBXfSxIwsTVv3eghfZJMdLIXO/TlrEeTySP0IaP7SG5tKJn18m8hFN28ToBYOte4hvE0Fmo6jmy6MHW5XMtEksk/T2VhINM4wwCwLcoAZsAkEJ/zY9k3xa7vJqj5YCxdfBTIxRMhBDOTWaobuxR+XXHpJIvDAmCwGGrmIwfLRHT0rormO70wzCsYTZ9UktIZRY8fsugWiAKYuDxiPPBlEZKYjqGcS5GgAOXnVALpRG+dbxVZC7bAwuui05RsjuHpkn3lxXvaFL2lMyIJDGqWAgYBXoAeNAF7pYtbIEZ/1mx9sANiM07I16WmmMe4C5Ng2ZoaYnzAQvg/DAD/fMJnANon/K2h7zcAGA7o98h1YMie6UxZDaPY1OY8illdNlddRaizbHY82CUdgP2O+j7QftfR8OJgngN6f/llyH/74/2t6DkfPk8S9SnXMc+F3aLvHh6bKFICeQZSouNYX/JiIsgaviFRnk6U9kYfF3r0TFmMKs+iDe96BQbS1YGCubum80qv3/xM679HWm6/UPx0pPHtR3p4e0Of3t/Q8ZQZAVHfAC6xLZ6Q/GZ6/danvDZdzWOgdGn85li/zpTlOnt+L96+o78+vBMQ5I80SLzgy19/p5e//Eavrq8p9Be0PzynlPYUmPEQthRoNWPsSkEVGlbUZt64adUCxj6K50eONdTAu2jvAnTOiaCRPlvevXYTe46onE6UT18li//u+IU+39+Jdv94d0P//P2nRPYt45EW6ZCukiPeS4l0Foq7H+BCcbevTxkmwm2hc9+vZjLG61FsC+yoGfBz6KRwP5uDfzhcSgzfi+vXFH96Roc315RePaf5akcP4Uz3Q2L6ixqBsXSOdY2xngWvN4Pou4M4DOMd/9h5L1ZILm4dL/e73PcWoK3v483nC8Bgzv9mytkyPOQ8GNwpFAAFW9YCRD0+wMGAmWBGaNxZn81w8HtFWftsLVTlA5pvkDf/e7Uf3O8upaAXmWPkd9yz8nPPZlLLJO83HJ05aWuc4UppyXLO9Vlwhl1BmUZetsCFf+Q5yNImMyJdplELUTHPdVTYEOhi15nJn1FBbe0bLb9a1/XvrQFLkTnwWtx28WLonu7+P3LI/snA4GBFl4+Tg2EbgfXYOSbgI4wV6fJz44PH0rFMUfih2Kzf1wZWMm+CGsvYFTkg2b5mQVfTirdsf4PHWgzr4rpZH6WrGENxsxe2kTnco7Dhz4t80dZEGEn7SDuZD7yHoK5KAIovjzI5xYmcTUmHpOCTdaZrjnzaaOyJ2iJpKSAA7jUXH+KbtOq899T78IQBY50rW+CImqKF2YyrY3jKvsn02ygGvWyipbvzmPJ+gIxJIfcqKbUf+yod41jqBKQDoEv79TiWbrWkIFgdkiRGN22uQfc1Q7mPiPPGfY4mAZDGnoFTqtvXZoYwa0+5xArCVwD3QECgxgR0dixa0atbvFvv0tB8Fz6D+WDMXgAILP1FcwOgYt1DQWrimJNmUtd28qN9PjSRfzg4ChENFgAfGutnzvnnWY3fc7bmk3b3uahfTcLALANcDwOslxeXem1L3jCLEauIKGrk3rfyi4BoxwWSrDqm2TL4ixN/szRgbvJ5KHhTG0hw4fdyg5EZhNLUMtDJsYU8A3XDmnByKGmou/2QH2MGNJnWLyCk3TNIAFB/4kDSgux6XP3VHjhXvtdTnug/AAAA//98XYtO3DAQXDu5AAcUJB4V9Bv7Df3DfkSlSrSlVPR43l3iah+zXuegkSoKhOSSOPbu7OxM+vz1SxG/+OWh3FAgJNnUJYc90LG2jloKfTclQ8uyozYEIT+nwwxSoYovsV+4oSEHewtPoNFXE/3jS6k2ernLNVm0RAOWchBC6W1CQPtA9N33F8sp/53akCVYW/ReCQZ615sdoSBOB/uNMmgxazafFEKfCMFPnzpXF42ojlRSBQ3rve9la1X1SAXJC004I7oZKUIQgsHD3lENnSUUOFcVzTM6iInlRYEMSfb3BtcUwPmzqVXG50FBkNDRL6YxPr0AACAASURBVAdutAeuCwIquu/Cex3JAgynJqGiHhZ9aAJESh+LZ8WBjoWgskEmR1ax+JZA+Y4Mh7cQuhKZFo34jE6uiVr0FPQ2tRGZpDcXAAvuP3owfULPQUxonhSV9jOBSYP7wNRlUCoj4DKOLV1Sxi10IlLemZTwN3z8aJeI74v5wOKZVPEjBZFEcAdtMLyQ2rV6wOFUTaVKwieZP3/bMxpn5Cx2hCIoaM4gMk/EijMp1R9QfLwWTlbXzzzWJhchfFg9qDCogHN8vGy1WfK/T7aQC4VvyOJ0AARagjSotprLQLIqFl+HAGlrpb+xDcLAAMNUBQI3f1a0/ftITz/v5N/q2w2tb+9pun2kZSFasmYIL/pp1/KF3qmX/i/8Ll5BrjoBSOC5GvzMLV55oKOTUxEO5DaBs4+f6OLymrrlEfUHp1Q6bhcYxLNXaOdrnaulj1n66rP7hDefS8SyZpXAnN+tLsVtzoTANpqNpMzRzGQyMSB2TuiEwj/RyAJI/P6LZs1GwJvx5ZGmzQs9szr/7x/06+Y73d/d0v3DitbrVwEFuN85FbZ7NOtI+ZoMZqH6FcBDmqj34OLtxHRbdHQh8e8INovFfPlTpdqX2gYi9q59oqcuUT79QIfXF7S8OqfDqzPKR0s6uTynV77v+x2t+yr8h35+wjvHAVAK80Yemvu63m7MmimbwvXU0GOJ19dtpUjuPqc5BbOdr+KY8LUIQc40tRojbhk2VXq3+4TPxNLmrjjjxinw4EuUpoHGekDtGqQ3lp8NK+GHlpbj42Pd26j7vGQtBgUJ+fuFVfcR/EcAg8/fsHfQmmCsQfTCzj54YxXo1UXbv1+0wHDD1gBgXcjpoJxkwW7KPa1lXTIA1+IsiYFy3lGVjs9OE4C2dTPuIz8ba+tNo6SN96LkpjIv1lboD+40/prCMcjmDdhSzxpmPMF2O+Oh0r7xuWKLAbvcxA0MVreCS/B93+zMR21Ca4KA1pIabdTmm2oXZF8Xe6vqOyvWgBToTiHWim2uAIl4GYf2FVehYyVZW2ZffUwj7hot1uQkiynib224Np67oU7OcQu8wrGec4ss7Ah5zkWSCaDkrSTDQX6JU6pmgOgHWCwMzQa4IinNWmNFZbmoIxQzLCm0TuD8Lhyeq/g4WMxklHYFwRDz1GcLUED99DtPVpEERxHuktsWUHleRgsv1gMO/SpRYw8Vd2kjIaVr97O5E9X5qIHiwuWhAKoAlR4PMWxjIzcle+ajC/apYNxkAuydsx0ijR/n4bmdxxbcC5DLwa5wb1DqOR8TWgaaA26k6MMisdpSrPvxPUDRS9/D7JbmWvl/NtBUxR05hwT1n38HMXLEid1QczEI+MUYHvcBzJpo0anC8dkBGFwz2iwk/t/y+8wAWnVOQEWf98N7gHHHW2QJYV2ZM6Twfy4+oX0V41zGoxWr4zUBWFQ3usjkrvOZzo2t8xmuTdzaOgVdQPnH5qwiLuCgeJ4S/WPsWrvahmGoHCcttIz3ONuH/f8fxoc9DoyVtTCah3ck68py2jPGF6BNm8R2ZOlK90o0AHBBTVMCYQAARSm5iExYgKsBL5xlCAlOqqQYlFNphiEVbh4WW1bC19e6wpPygzi6XokwfJhkoHgon0DAb0EGqgEc6obzZMXIhWX0W+XpYxHgf7SnQSZyzgHxJRZoxQfjOPVFeR9GsdEHKI9RssAfDx0Wt4hiJIg/lGAquqA4uPL+XIXQ1gHy297mDZ9nY8ffzQ8cNsOAtokzByAq0u0BAC+aBwDAl8H7PrjH+PweROmWhSPlHQlQL/AZVALMUWHpE3yEo451Cscn6X1iHeI1BKZFk6BGgA0oGAc5/3q9kvXI2QF50JwBHzTwT1MRDQm+ogXtOGI0g4uHeH5eXJ/ImKjDIMenIqKUOzbULdXmDhyfywdnqDiAPgAECskpLHsOZqebKh/D2fXVKqOz/Dc7GOxA8fpARuQ9AADPgJxjgj0o3G1b2yHrILRxKVnF0TuJTQEBcxtRMiAH98/BIYNvqWdk/zSr83Yt7bY7mZvNZkP7t4GeN3sah6DaAqMoCfdKjRFHhDezMQtH8WYptoONqTri3ViEvBrldqLMjTUDwjAVBz8RncSOGq5u4dv7/UrNrzd6+fpA2/vvtP/xRM/336jldn3DZFUBDAiIE68tu2pW8rHAM/iwp4x7IGv3iCBxUDFHnvnYLWlMkaamo7PzS7r6+Iku777Q+fUdXdzcULtY0XJ9QWFxIv30BSxtFzJ25sDNnGjf9tKva/oPAICOZNRRUQInjUuaJZCTSoiJwrinPy9bmsae9rsd/Xz4Qc+bR3rS1ny7p0camZfav0r1BjLbodGx9dUy1Xg22nWiFpKL7wAAqCRCUYSARqhk4iCf62B4j0kkegxxSXR68YGuebyvzuj08x3F20vqbi9oOl1Qv+qExy98/sA9+WPuyQ87hr1IL8dE/FTMkQEAP+piI9s8lgBl2zbbcckUSXeMGrBJLjv/rzk8mFMFyMCbrYNl+AqldzuXoPoAXu4PrXshZDaWQIDpimxW2IS0ApxnCgG/jmoncEeFwpGI1nFxEFATaIiiJdHnc6ODz6xkIaQ6UJz33U+ztk9hJhw71/5hDnGaUfwO9qRZlxgy/aJGOadBMvsGtGkbvsZTwVTM97DN3OH9+R/eBysebYhV1vY9AMDe531PQNSam842ulctKdnfjoj4ofWVnNdVkKLFYdsVMetp6u3abI7UP5Cgqc2CW7yXQZ/n2Fj4hJOI9kn3nElU9I9RH7wOBnwRaF3B0QcY4QM//xnSGZUEggWcwcQCAUBgnpEEgx6B+E0qwjafI5sP7b7UKZCC84tPL9e5NLohssOe047fGFOiug8+U1DrDG1jlQZyXFOoo60Hh9RfYUFgZH5By8W9i8+WBhMgj06vq4xrrTEBcWD4paPReVvjcQe00GZV9VTWM3xE+KJZJyKYsCREIr2viwAf/HHPKZf1HuruGlTZCTKRcGShvQ5AjhNysIzgFFUkQls8OaGe97opWdwRXSJOkqQuMYN5BD2YUEWnQCHvB7gOgEX9OBiA4tc+Wv21cWHxDdve7W6bwQQV2oZvi175MuaaPJY13JXYDsAN++AvL68G+viKaz/XIspOwcADAAFRqerij7NMnfrgSJDx+9y1Yr3K1BJ8N64Nx+b1rJXzKi6J9YvnKJMRy3eI7o0KSeIY+O0C0ENk0lGvyvOdbYEHgSAO6PfmeQWAFwHkKkmpiuB2jENPfwEAAP//jF3Lcts4EByAlKUoUqy4XKldV21V7vv/P5JrbskhlZcdx4peBImteTQwpJnU8iRZlkQRIDDTM93dAuUgCeoh2NFrs51MsNrkWFCEOP5RUKhMfSyUACAUz7hgUauHGABhm2ZtK8dAYcLCFrC0qgy5tDmRtQO3YlG0oABvSVavvxxNzXKs2Aj0Fl6jwnUyRDyC98WTDUi5JYA8WdHq7xenmNSayy98AD6EZ88tNbjBjScYDDC5Wixsg6rvX5iFCDjWskjMiB9hsKvv/zxFgOCsYDcIJu+5P48E+3xVzn9+M9PywzdiZ5uhCrLEUfJPrpUOHRaKePcloUZnhQJAfVlg66bSF9ETqZqEWGkQoToeyMJPeewqYQr32dS3s1V3fOVFGm5jiZhLsDRX/a92l4391q78xuWyLQi5JMGwi3HUlWg3Lj4fCywSaw8yzIkoigpyOguSy104KuDSyXulNcghhdlaufy1mFZb5VzyUMQBfYKGhcIfaM8DstxjY0mdqShXhJ3vizRjFekPjueuYms2oY0FmCZ5Z5UsTf61CjdY+6/w0TBHXd/1arkybYZ+BEi1SRW6L+J93FEirfa3qyxV4Td/v6bDoaO7f15R34UC8Px8/EHHg1ZajkdVAaazKj0LH5+t+NixRRL0Vnj4bfGAVUGvwRZ+lRToS6s8n9n+tJd7fLleUh8b8fDf/LWj7b9vxVpwd/9Ex8/f6f7DJzp8fSD6eaJV0jcLnafv5PIgeRrouVc0OQazfHPWazqgouqm+UKAKpLKOVdCz4kR7wsdvu3p6dtH+vz+nQADL69vaLN7TW/u3kqnwO7mluJqS2F7SxR0Q2omABSVxKTOT/+3/9MJgAPzcvNyU3mc/YnWPOePv+h8fKJ0ejIrvk/0+PCdfnz9Qo8P9zSkToOvnGgRTOxTLNaaUlkOpNV/m1YlRcvkbSjV117nbC5jOjrPmedDUJFBvv7iIc0JGXPyOTnfrql9tabdzU68+K/vbqnZvKD19ZaazZoumyUNTEEJmS4MaoSe+jbQiR+Lt3cj4IEZS4hquFSEbSlpwWsvwVmdO6I1ADCQk/KY1OYQawLvP9y5MhJto+JC4cX9plzLKTVArfmI8kWrZgBTcO9EO6kAF7So71m90LUBc1wrRiQcdgYB2KFD0sgmFAFAVs4WMbyoAbJaaA4GaI6DxJy70fMQsZ7hOa7bmF6Hx9kNutjoT66DaNoUWyiMhQM5J0dye7moB3A1cRgn0O4E3JpnpBLzeo7R87V5bcs0XDrjMSdJDLV7YHwOf2awU6kC4rGsuwVED6YhUBs/m6n7j3H1IYrMCXoAYM/nKt2lRIfj3vaqUIAKX/FXUAHjrU5AKdmaEpSyKDEF1mYPshuAy0iRcHAX7ag1e/Za2x4l8WQis9+LxTYQFmv4Dp/Y+0NjvIb2+1+l0lnuIa9vUGgo1k1pFdzGvOQRX+nXOY2gxiuAV5HF8LsOw5kjOL48zqu3LoCzFfvwOaWwNijdsAABAxVgQeJcSxg5uZFrbjlANurDwukJSTzqhQjdURPv+prch7BFnlApUakfrHqKym8wCiBZnIuWb/Cxg+so9KBd6SIdalIIsKApgmwVAEhO4yx13ei8yWgpc/MNCeHV0sQ6XfH0T/smv3ZlIOdF6ABMdX7eIYoD+VbOqQBP+juskmy5AbpYJb4WbbimFNWUClpBHRH0m+iCsR0iYkkyIEM6zk41gUUiDVv0YPQcWGM2ljuwCKZP9ktHh+WiEGaPLu5nYCdZJ4Tv+AAY4wEtAcJtTAu4aB0WY4cI1biDJSpbI/pCK/YHH+NPD71mdWyVbvL7/+f9D+OMQtMU+EB8BKo903WR544iFCL6DwAA//+UXdtu3DYQHZKSFrvx2kbcpgH6EPT/f6dPfQ7QpGkCJ3tfkVIxl0OO1i6KLhAgsBMtxfucOXNOJxZYEtxqbQHo2qCeFDs8xQ2gLNVEswlIaGBgKonT1Q6GsSn63tLKTIRIULdprP72ubzM8EazoCOryeqobT7JialxkA4ULIFe03eKzFXKm068SnEsejDyolclTaOzmNWf1rqPtW6lMgHKciFiMc7kEFqrPwnu8IYQ4GCb4myqlMHRwX29m1D1TcTO0zoqpSoiK94u3pxgQYCsyJhlhWwxsKDFxpAtaf7cLBQJB098fXPhnx1EiVIXFSNxfJD54L/a57wSsEuZgTEyoOQJ/QAgutx3oOj4g4afC8BjoV1300xG5th6BahuzWrzWFrwLpnvCWJxY0USUXu+zFB6/98bkRQTeqG6kFF/KOpK1e+bla4xV8BMmY1e38WmxP+aC4V/j2jIqlzYTT/At4WoCThCsy3nXB0DMNe8Dy36A88INx3amyAQaFzcxv1+X9VbL7YJ8djIRvgfAMBstYxztvkKYMYot7x5IztEBg4Uy1LPwYIQV7ilfVkkE5NzqQcMggEusSELNxju4EBQkNrxKEHDilW4VtzvOocfH4YqVNQPKxovhfbHk/T7/nik4/lKh/NJLWo44JesvPPClTHMplo2URpCzTJzkwbOmE+FDnQS0/dLnqhbJVpvV9Rvf6aH6T31l9/ow4+TCAiydsDuzy/09eNnOpwuFPi/FS0ngGo8uUxdnJszfEDq1wKNlnFtrASmwPFfB5GVv0rwl2zP4Bp0BjkpH2h3eqbnT0Qf//idhs2W3v70jrZP72n7ywd6fPcrzZs70WZgu0F1ElBv+DyrjkCw4GA0tgg5PQm6qQWPNVA1G0JR8Nea6PG8k4z04bij8+47nZ+/0fH5C337+5Nk+n98/YvK9Ugdl2aNF6XcszCTSgEKGKPHoLGiSDOq0YktviaDN1Gzc/S/Dw5omU1DEnZ6/OeUZ8nq95tAaejp/umB1m/e0P3jg6j290/3lLZrWt9vqb9b0ylk8eOfOBPKgGNS73S5sPaBOinL63jjos2qp9FEIXNE0HAVkDl5QFjGX/eULqSmVxBanWtc8Z6SjEVme1XREqnUQ+tlEuDaCwPeCq8pXbGdi8j4Y951YZkpXMFuzP4NanyxH/Qr7f1bK0K5GOZCa34+KO+zo/xPKmCV42yuD0EYARDJq585mp0cnu3oOgugYHnWU903m+MFllt9tNPNYSG7dlGjf/1cz5eqUl4k2x9lPGkB9MUX1HNQmpUpiC9YttkLaTVAOFRwPS1sCV9+KuhvezbuHv/nI/cfR2GVPYb3e/uZ2G46cFsCCsfUQ0AB1tmZ+6tTEbeFSnlEzbpjbEJElp+bYU2WX4zvLbW9zbtmGch3RcxVHwyDXTFN7V4GxqpoGsH+rIPVF6nYqnN78taJ3H7cYZdJm2T39uKysirmzWOMchNhuRqt37NY8cFZp4J5zanCW3UmY8VJ8kyys2lxZ/QZyMn0b/AOPIagP0e5zycVQ4UgGc12H7HyAwM6qjWalUvOdodv9GsL5JIKL1Zqu9uOoJUAGzjMmcog4KyylLKmhWaB1HYbhZ3ZUKEKQ5ttdr3DjrLWhPlsNoPDEBY6Qx4wg712sbI17stb4NQLPE+eqm12k5NLkKYa6DXmF48nHMoSgJTYmLvFCflVkMG0CWpbY+s/lKgUV7aNxJW6aM1VlF11LJTVKhZ29j6+7LXeT6OObecECDFGd9utJGF8MirYfWrRTtLyrFiU8QjQy9+fEWcA2MEcR7tQ3sJ7g4wrxyvGQuKZin2b351LwHnO8/iJMCN/FyfmeBxTpPWGS24aoCzvK7ahOr+qA4NZ3csct4Afa1RAGwMaNEGsjGGsJZSQK1izjEW0JNjmK3+/6YB4oUTErzJWqaN/AAAA//+cXdlu1EoQLe9JgFx0o4gHXu6/8Qv8It8CCGmAEJOZsdt9VcuprvYML4wUJcos9rjd3bWcpfnw6WNGwpvN7xCTXhL55VRx7FFRU+/IpMFT6NCrN3xJZLom+0aBRQIiaNk4KL6AtgW+QFYdG/vAB4Hv/Lo6DwuJMYXqYGMQS4GS8aAZvL5wkQLHEZzmAAFXyLR9DoNLWRFUjt95ZWnPz40OBFFdNHdUnS8qzbBLjBCRaEEBdc5lU/0B2D1gEfMJCIuPobaZQcWHYZVAAXTB/gZVXtjgYWLELjAWnha2HCaSAui43KCGKkBVVoUgJ6mGAcVRTQijKaCwMoiOgSazWJyQXMr32RaHq/P9gG40BRpJQWYUq0V0wBcTGME9NJilJLQMmpyudr49kae2LHyoGMIGxhVtMSFrq5LOEBAYK78G5gyAhaqIEF12RitrKg6YbxRqpUHGFjoB2RN0nieR1+iqx7w4J/Jqd9TTwCaAuQGHDLLiBgc8Avk3tVOeW1ugw1AIlqu5YdcExcXIxdpXLslY6hgv7VjXlf595yE+cs4Xn7ePT5v9htv2TiMCzLK8uaXp9rX8BheRNTl4zJcluS0hI6cYksbXT9a6VZ/XCjp5BRkFJBQhWCvghrPD1ZBS7A4wTMpfP/JzPaX5TPRypvyS6PnLgeYvB3r6eqCnz98o/TxSMy80ra3afXGBIbM1GEoOVlRpCgSdKh66Qv/d/z2oQyPUhEc46AMQ3dwcMtjTON3SW6YLPLyjx/f/SYGAEQPd3T0t3URbO/rGtdcJQKuwtfOfxG4xybXJ65k6Fqs5zTTPP+h0nunp14F+PX+nw/dv9PvnQX5oOdo6uNHg0NnLju1mxTzvWII6oK8sw767r0QhXSrpm3ZIW4N+J4Wen1nbgf8/Ec0Mc389UDuN1L+9pVfv/6Hx4Y7+ffdId/dv6P7xgZqxp+HuRjn7Xabn01H3VYYT8jo9ckfyRfVXJDlqzbIzINpwcr2pRDe634zW7WmzWW7yesdwd7sunCBE6P1givQRBYaAg/UV+PwqykMQG2NEFBLGSA281tn+m0c2fnzOf+5LXyAuLkQJ89W/W0ce1AgwhboWW2KgwGTfWdZKNfuaqvb+ca3rVpFLdraI1zj5oBnsiyAoUG9BJFi7k6Hwg/GRPbFAYxuDMpPFTWRd7LT92RlmD1XHd0G3cH+tsW/Fc462WJJkJj1ncG2lg5oLrXK1zqQE7IC1m4iVxKq+hyanBiA+g1Uvxizuv0iIAZX1JMZE1QQ+LJ3hRb4f0wOiKHHk7kcrOApdPOylsTAR7cxUPK7EDnIOafVYLsYlQHOg24jXKsy7dDARbyHxgQYBXx+l9wzyPySaFR1lx2VuDJkTu7kUKJnC8e+H0rmX2FULGxwfIOFFUsaNJ6BbcTwk8oixRDfLtBMkHsqpOgbivyKEPLqFHMasorGG+An3OpAXOXjc472xkKEFqd4RtPhsUBm4CRC5/R5TB7cppgDFphcEIeWY59Vj82TzBzQLAgI36zEZBRCpz9nRpCfPC3hc+O/59yzFKdV0qYs0eytxWEhDGyxaUzuVIjSXoL/j9/qWqsIR7DGP5mhBlm+kkAMCPr9ZXMSJMz846Y+uZOigu96DNeiiar/1kqsmaL1otRex/T7HAf8/oksgJL9HQYMe7o4ktvai8QQnAVwvpaRHzYZSvFGUs8bs0NfSOdXL2iECi6ZnVjQVdH9Gw1yMJO2coUUheQ9bj4tweG03jvtAaEzjSP8DAAD//5RdTXPbNhBdgKQoS3Imcpz60Fv7//9JLj320OlkculBThwrlmQLgDL7iSXoNBNcPJ6RSAokgd23b9/rqQor1jL0oOZKXzakwPUBswCI0pE6FqvSIE4QKf3h9DIFsEVTRxGKNmsM1Mk1ATyxGIuLSCq4un/QpKPSviTAofFrxfWWvksb0tnU8SdobgwTtJcWizynf9v3YrDklK7pfxKPFhgo0utWxFKmiACF9uyoZVxwfSBKPelF+E8DO6UvMYJcldTtPEqj1wo+PnhYiDbLp6q9oC98pcm7F8IlsUAq1Zn6mDUB1nujapQX6SXUTTiTxUqaASQ/Gi313p/bV+IHQs87q4hH2bz98wjOTcG/sMrK8HQZtXOhRb+rn+dFWvpMCWFP3DKgi3uqNoOGZjZDPUw1uVfUFAT8Cq63h5FerVrpc6OU8ThR6QXn1KH3G+x9kk2j096gumgqY4IDKaSWTmluSDEl0EsDD5v3qqUwLri1RQMfHFeiXjx7D1wVKaugFy58MK1ggO9ZNusjQXIz96ddQp4k7a1NVDvaBP9ndnToJkCdbiROdGpsMSMckFpOi3qwAJUR2gGWiwjnPsBqvYG7/i103QCPj48mQIPXun/Y09qnwjpEpcPnq+P+NNwjX04cZJKtYX+Gp3yC4bqHp3SE8XqEmAfoUoGbP7bw2+lP6J4yHL58g5fP32D373/09+vuHp4f9vDw+QAjZBiRFo0BE67TRbT8pVQdnaY66edfwCrjIMnlLGURqmndSzk56/IZ0uEI9x+/wO7TP/D3Xx9guXlLYoKLzRbWt3cwrN/AZnMNq9UVbXRcWek5qb2IFzMmsajD8JLIqxz998vzCfa7ezgfD5T0n56/wuN+R33d1DoFiUT4vLWeyUlE92OUgSE09E4ADWrPuVwcwX+e/C8lCX8uCc44T2Mkuj2y39KF5SiW1yNs39/A1bstbH+/g/XtFt7c3UJeBYg3Azaaw2K9grAc4IjJ5djTMdCBhHrVTwN0yqKSaskqbmA5LAzUUwBgqT3sMrCiXiyBU9/s+swnaaOJrj97+nqw0F3JyTyOTawV53kGAASjzZNAJ8jaww5yv578N7aDaWbj23KSfjZ+7dOTM1lyOGViMbCtSR5M1t8Q5jTl9pjzMa02T2zxXhsxqB/wq8dvg2Z/DyogciEswAeCeO50rgWY1yjrk3PFSn2ux6/sRG2Ps2Sjed40wdFYkINrrVxKctOAyGwdx6B71RXSWCcSYMHV0UguTMwqKCZYx1T93mi9uQFtbK+LpLZDlH4FtikWKkHYsZ71UBzzMlklzhJ8Y83F2fnAPeNBmJn+WqjSmiug4MVgg2vpA01GxHO+xkBdPbaAWHTfshbtioEpreUet+cGiydZfLBarVUQTG2up7bTFGNqb7/aqbnnxccuFcjHYoUIGiOj43gyDS06fjpbQU6ZvNVCkd8dbVfIUpSw3yMFFK+R0Da51LixulC0bB+tEGvVVH3qud23afnxuQVpaoHpcvn5pjnoquOFjyntHve8+uH/WjBMaaoBQOwQJ5JOSvtdby0oCijocUfU+VExZWRO9xVsyqFeCyeN7FSin/fXrr+VWj8dCGJgRqlC5lTM6yvApCCJ/q/sZ2s50bmQ5N8XeEGSbHtfMlfIPdtXRxcjtHy+IgVMsje0YmsF/2jacd6R/SDAkx9qt6rACe5/XuTdJ/02967A95K4kEpJOAlzY0ytxVtuudDWF03+SdxPvqPaCJwHITCADB+vy8ZA2cyVSe4r/k6MNftLDyUX+A4AAP//rF1bctQwEBzZ8noTklAJBCpQnIBjcP9T8AMhVKCWsCG2JGpe0kh2XhT6yaN2vStZlkY9Pd1ekc9RVP0z9VoQK4zQeuNtzhNZBGcwU1sNeE+2CJQhFmXsOZYssHa01IXOVWZUOxliEATDEXWvtXHQg33XIFprTW+qHnLtpoQPprf1GqmgOfq+OEfxVyyU66cebulgLLZxdINcV0oTBp+zMVqfSGCMIHGcje05cBekiUTI/Fj1x3tGp/F6mIUEzfB1jOYTPWVgBF2RQjB2XJb+qAtgNeFdLKISEiDwYdHTpNexwoeTyit6ny0rLNLqmoOe3yuAxQAAIABJREFUtjKmhYGQxw8Bp/0EaUi0ESehK4EslJQFwI17HBb+wHqdSYT7QObCMNTlClOjJr2RGsNyv5cPkgZcCljZDZ6pQTH78pPabSy6GLogWAs9FYrJ13dWhX/OmWPbL7UjRKq7gmbMkPGEFpeSg7koGKe+QkQVxcR5osHVYxktLAFRr1wLGqw1DqpUeDERZfexlkS3YVnXzm0w5SZ2zOz4P6eh2AuBYoP61tZBOCOovNGobRYelqb5jjd4F42DA1tDdpSp5X5cvHttNApiDh7ZrhDrxm6gE2uxccsaIEhpI8vI4GByUs8WEgnbbY89HL7dwkk6orXp4tNHuLn+Db8uv8P0Y0digtefv8Du6xWkmxn2325hi5l1cLAlmr+oJPPoiYFeRxlz1oOImebO+gHr98JqEHRymJ7jHYzewbS7gsufV6zBjuMnNkY4X9Gzmebu4IsfrwAA+HwiBToJYBKRXQMiVEVQUkBZRxYz07IGx0lO3SIylpfsj+oPfp0wIryh8XN/NPhIBCLskU7bAUyY6cd+HvYwHwxwfHEOpx/ewNn7Uzh69RJOzs9gc3JEdfyoyk9e+2MPcTND8IFqkfHQj5aVVJOJlSdhI6BaTzR73C8O/GFmcU1kccZsuU4AgOjN4SuJAaIrAWBbT0EAOkFvMWvvVPeRhNgCrVdJdSLEio70N+hsb4O/Zp3FOWPmh91fVwGHf2j/6zpPaWlVXbqrQGa492D/eHvu+1rGk6viFRUnq5ljDzUVqopCt41kbWtLGh5ufWPFF8w6kBkKWcBs2V88TOuhJ9e9SgaXDo3JFQcIBRhwn98UDSZyhREPDdLGEYZnkFJQjuMY2MUF4nZiUB/dXEZhHGrCoov13OrEJjiX9GGsOc1Z70DF4FR7Qa9HbDApXVBRavB+GR8Yb3oO9OsY1vf9Qk+gGu+Gpv8U0IZ1uYpYIzF+BaCZ5/vfz8yMvcnc+sVr2sTeNJVMcKHC826iws5ZcE6+v9Yya3Y+ibo6xcDOuDuI9bJmjtlO7gXsdjty72iz//T5XbGODuF+dsta4/iL7zNXx4hd3p+ZP1vqsbVpxrxy0hIdJ1ARxK4puVHSlGix8HNQklnIJMzZ9hBW1g9N/BSHLbtOWdG6Vh8BMmu6xFFWuNkmO4uVdsygorIibFKNM9NcqhEMONSZdcEyKlxfAJfMylhhcmqzGgv0jEj9foj12LT27/n9yOB0UwbmtP4ff+eS5Dp+bL9DC0fzd1YQYCmC3DZaH5Td7LhcS88E9X3jRAmNqyTftSxE+47/Q1Yul6tuqHxg2f8Hvg8A/GXt2nqiBqLwaad1WZYEQ0R5Nsb//4t80EQTRY0BEbadjjmX78zp7Ao8WEOUFXbbzqXn8l2G0T0xZz85FzHjDTJ1br0k6tjGyYdAX6ZlpRousK6wqaozADq38DTtnNMNiHAUFvRutXSYK6djsUWTTDugD8gC7fJCmEXdCCbjs7QQ7/Z7TFx0/TebVEVYhMNU/RwjLydOEAiUyQJGtdYQACIGYgsNPH7AjfnXJ0/KtcPMfzghUS9YS8z6YrD1ZCIcvU8kngSwCZzntSokIDvZFCwB31x1DSwRPCYUw8mo6BlAFdXEMDBGKMiozV+dwIl654Y/djj/vIG7kUGnkWzKAltmqRCjCKAbjAVpVKF8qwk+pGrFE7hcHWxDmiTe1U/NIgYJc3zfOPZikxeSRgigCMRmVIV0bISpJP8d5ie21V9XhoXmBW9OLj51yEEt5gU6hTWgCsDkAUrsKon7wF4FoDDvFys8SeGPS0epXqsE+DlQANJW4EkYexQMfR61FIBMtNlW1d0KQaqb/rzUn43X53OxXwdC8xPz6bFkQb1T16+hol+MQsEiavFg5H82NxS2XBKuVtGkir82otqN5D4LIiy6V9w/3AhagMeF+WoccDHk7WQ7yDxmxADfR3YlwDhAbFIUqqWIuggVqrB7QOlEd2FfZoU/cvL4+pwu352LWGD3+0G+fn39TndfftDNh2v6+fEbXX/6THd3D0SmISDdexZ4m3WtGkvcCwCEAsAT+QrvXCOq8Xy/5ntJqgeA8LnDP7Ebipqy3d5adxWorgYxRQGBkEyOT4Q+w3mVHB5uve25qEhEBseRadBezhL+5reduNhjXP6ZO/0viHYXZ3R5dUmnr17S1fu3kvyfvrmgshupOyvUbXspEvyZ97QfMt0zrYi7C9Lpx95uEN7TjRRypUM4drqeutGRQXPeS3KzPdkqxYqLIMxDTHr2OaKlDFNjxATlY5Yg8tipUEQX+IKtl7NohFhxUoPwuL4OE8J1gD0ftaXE/tG1i+0ZR/RCLwZ/P3b8r6LA0jwvYlcfXs6KopqO+mD/63ju+UXYf0sBaJPHNphDl3YI/FZwt/H/0X2ITIjM92HTYukMJVhCctkerYtR7FiC/njs/qy7vRo+471QEAf9ynm1pCJ+ldc8epxXAtRXr7/GY3CB4oI67IS7NAp6rRi946DIXSpiAUmJCIZaN1xiI0OAUIS/m6d5MceGzkRQhYrECEmjfcbPQ2PEqQFSCCj+PCYrishYBbu/g3satCU0Lj+GfCP/zMUU0HOuDgLcBdTYbN3gyKV2bhcT8gNsPefYrDNVdqMgkiW8rDrPz7e+aJwLcTxFYmLseJ4Obn1IAR2gRQmIs01OKZW4SooIdS3Iz04T7XY7b2yhkIQ4nAIFUnnV60724Rpd73nK69fidV9qAwy5EuioGA9o3cQDhY0lIDuKi5yvBf3yUjW++EGK4gjiLBEPD+fN+RmfssTacMgYB1/v8d9I7tE8TBHqzkV6i/ERR5cj0HlpTJiYHkl81Lt7mP8eFS88RTQ41tdqTUQECT47Jrkhxxus0x2/V5pO5crjvfMCakkVM5d5sfR+j5H0i2YGx6gCy9cciz8DIoBxvvg9MpF2pnCJ3aDRGnDegPvj2vGaomj0/uH6eGy1mKXPfH49CqvLXmIuDHg9Wn/L2PI6M62OFaq2md4rDYCU6C8AAAD//4Rd227UMBCdOM4uKtCHQqVWQvDC9/EJ/CJPPCOkSohKoJZCu8rGMZrxnPHYG0ReEO22TeLbXM5l+PDpY86d7Qw5GDMHo1BKRTex+I8WWNQ+VjgHkvcwVu9F2LjwQ7ICLaDw/ML4M6zoiIUr1VSthoCXO8Zonv5kiZmzsXCCeJXHE8yvkg83qPPzQGMx+kFtF/xsVm5yPwtUIZGUtUmbTVRnRQi1U6lAjrmBY5MTz5HfkepE4HfDUJ/kIP7MA825bpQywGoRiI0IyZV3T4C6bMiAliX7DCblqJ5JgFjhfQAyJ5sv875d8plcgYEn4aTCQihMVPuW2cSMCMmkwdRrtRKJAAQvSDdqcMZZ8X7UYtN8nKt9pOpQFD7R9uEnugHragsJixAdNumg51RgySz6OEUTHvK+mWbjo0J8ffFnUd4g4PzRPV9as90z1FQBIweNYllqFfKEr+TgnF6As849172QivpgHFYU6jBn5Os5NAGIh/lLd1rnMAcvRxW+BAWFeWW/mZcUK7IDYjMQMVk7RIVRAHQO7RDobYgq2jO7r0/7SQUGdw2/qv18hal5iypwywB3g4ZD87MOobQoHy3p5s//xv2ke8ZkaxrvVN5LaA9wBBAD+LnH3ARZvW3foJxdD4lDQSEJHKL4uJdCqK69XLjDDdyaESArCWwcVoFiUfgw03x3oJ83t3R/84O+f/5Cv77e0uO3B4pPRC/XQDEX2LjwRCWBgCjPqQ2fv8zeEPNvA0K/UosgOEGg+7EYTjXIov3+YOJ9zfuzForSYf7xt5CL8lDLWuAEYeGASiQYiMOrAwOt9kRnr1/Qq+srenZ5Thfvr+ni7RVdvnsj6vvT+XNR5GfRsvunOxp2iYb9IHD+wKgoHsdYUA9yT96ytUE3jWZR6q8iDlUC8J3yaf01+S6OWtnVLWBtnEVCqInoosK0fVAXuv9L4qVfSxua8H6Ni890nMyXG5xq//1+P2iKvDquWxfW0zhUGp8Fvdp1Gl3R2t+fIEnUj7tf7/1nczNfsnEwSQOvvcQfNclMG+c/bST8g+PY+yt17yN0FIjJ3IHagm9/5niV6D6R8QUFuCzARthbmBVaVmpsjf/XwUpdwTx3tnL9lZ19q7cay66R4n8eVALh0Yfq7Y15hHk2anzA8RUaKHLO2lmmDZyVz60ziwd73QZGHAWNv3C+IqktyWhJvNAdLLD31YL4aVfPesSB1tCJsRkjfiYO8tFJlTHuxp+TTVDIsvLqcUZlFWEkN//A7ScPkV6OVqQB+pRj78fHPxb413uuAs2rc+0yzYRIzfvE30bndArRcgMyymE5y7yVNkQLEbdhXxOrQaNXHE1XAOsJmkAQa4OFMKhRsCQ1YWV4pUujIklRlPcnLrLze2KUrPnML1X7B6KDo+pvWSFmIU3Mlibh7+Hh0PWhvoEDtzGFaMOFwGJhGqxoF7T4gVil/J7QaFZRrxGlmh08b3hs+Z7Yvg6JctH1WCtn3V0+0fYWiqZt4Wg/2OtJczm8cxQdgK5oNDhcsxHOX5zjCG1Xqbw+F+N1D1c6e1alcAj1VBu8vgBASjnA8/u1UZ4vWE7okQcSE2ueKueX5jUofsl+IIk4a67Vppe/ZH9yR7gIcCpyG+sOWiXQBDPRTdUBgL4N8ilutnmLwMNhFu0Msx3XfcBbO/YNSrkX3aegB2OyMK4AFUKgvwAAAP//hF3LbhQxEOyxZ3dzIIQgIkXAD/ILfCJ/gMQBIYQ4RJESQWbZeSG3Xe2yx6sdKZdodx47np6u6u6q7tOXzysAIQf/KSkbZjuccp7ehFS43ZDApSrYhypkUqTsq/k2qPvDLm9HHqPsGwqwghMvGMcpBgX4OuJGowKrLTTzlKxIJqvygdHkRc7XDbZOQdBxtBcqhEZ4kbmkJirG6GbRCiUlunlzHFyLjjGsYoutFqHQwOB9AfDxAgS7rAwvvWSiSGP+fFBZhvKvWgwmvQc8pPurgwmshOOjjWqP36zBQDMIlmXr9S8pkALsyhkCILZQ533WWyQeSq96JjOYDGAABdFA3W+fz4PXkCAJV/ZyKSovVpHX9ZWFUaDN0KrKoKNiPI1FoIYIoBEWSV+A/7QFel2aLVqxDbf0oeXADRCRXRfK61gTodaBCS8IgKWRkIvNMIHFVOeFRIzA9sZ8RRcQQmWnhO2X9ik2w+ZMCGchxeDWtiYw2hpRYMKEhYXC+mYij5OwcsZ/SwBwLNSXhiwFARDmTGfElGAts+ZgzZslaNNaJHlbAsA3CID0rIfPrllIysgFrSbHGfwltWvbaMgO89tJVC904oiT3eilH7zI41GGX8/y8O2nPP14kN9fv8vw+CTD8xDL+aPIlY9V/W6KAPwcCeDWsqLegnKXBjJ47n5Jn7f235UJgDiw0CQAiAhhAsB1+csB5IfuVLcXOU1RNd8domDf9d2N3H18L9fvbuXmw71c3b6WN/d3sn/7Sv4eTnI6iKx7r4r7f/4NmhDGbrgglPcifu+1zRiVWNfnOdy6gqDkTJcIWlevhRLkgcDlbVe8RxsV+qR9A7td+OobQV+F8xrwzVJ3t22PwSBUqPMKzw7GcHzvLxAAFwREQ5LZ9wUBAJ98iKDCkQYbhE/r3/3s5srP1QTAjuKOK7oG686BMjahzZwTXLlAALQq/OfAdb1WWt9RsdkuJrO6XknELM8ln/9p6s3yDL72xjuLzyVaNMZrbIko8rXwefN7RVDsIT90i5VdXhuwoIOKeqwErjZzHL3aK3/tJZMQRes2+exLba+XCl2a91SOSTVQ5v9btde55DQVASx/B7PbeOfDWjeAgFPykWfR7Q0wnyKIApmTiYoIcrWS7bMuVO8zqMNIKe6LFvsOfXGc+tjLNCXxuUjUQ8SQi0EzdRWFAlfUbcq+/s5xxw3NiofvYxxqHK2qDD2AkIsNL0cD3rhG6wDQrmE8u37jF481iSIakwIYVQiOUhhzZe0u/I9zb29aECDUZo0vyOchYg5CS88TjWuN51i04n8o8MRwPEbtNY/qd7y/AKkgcfrkZsD7YqJB6Hm23yrlg4gTU3J2MtHQSl8LeCq7S80G8nkUoljbIFKn2eK5UKeFUB6m9ydhxzEJeu4IjGv1fHgxEoeLsGI4zFEBbjYCifEiaxwAGxX3EIRPsGNkEl9H4HOOjWcQf/wejx0u2REt45k8DmTxhcaDQ3xAQRRdMhCn5cIt32fk1bEDIBMpm01E/gMAAP//nF1Nb9swDKU/kqxLsx1W7KvADjvstv//V3bYYdiAYdjXYUW7JralQSQfRclOGkxAgAaVHVuWKfHx8bFnQxsVufcUGkXvE4bGJxwyCuUdisaLN2ieSDru7iC5tanu7nbz2CYRv0BwiPRlNbZALQKBckbOcQNqjf/7SeYpvvYSx8aMDIRPQLdMeY/eaeU8akdjEyOVhWdaFa+K4bjTMjlRO+7TlJue1oxApo6gwflnJ0upNm2bHQKCWEnbmHAjI+HRCxeFoj9oLECEQf3hax0OTKkXQx0MGe2VgsJODyG1YY4ecrQpgO4z2jyAGNBS9KXe0ICK0/TzRRSOPDvzgQoQoHH3gxqweR7ka8aCKIY7lxvE86UwmfYEGmiwgiKX199rzWBy+ZR8nQdXgsg1VB4Aa+OcPM26+YWxfgaowmDobpxvQjOy2WWF6BO/k0QBE7mYUxh0kWM9hmFv84/tAKf/YIMg6QK0kHf1vy2qMJ3PuazvP4u+qbopC6tIvpvXaFh6NkvNaLRq61gVW0uScRm6cTK6IYOkK7y/9bnxfSpFuQrHoZWa6lFK1cGJsg0gxYI2iY85va6mOwyfz9dOfQ5hon1aFGlFm0cb2jzvaffymnbvX1O8PdC7Xzd0/+MPffv4mX5++krfP3yh/e9b+nsTadsnSv/yOC2BArqU2ffzZnoscvD5r5hF+oI7Y7AMfXeLJ6ZaGupJy6gPSWwx0flfXNLu2VO6enNNT66v6OrtK2ov17R9sqP19kJq8697ul93dLeKdBP2NJAIfTE9eH9L667R6H7H0fqYbNfUMFjac8hM7Vwkq8dAxXrVsjZMrEcoqqPB0aNU8rZxC3fgaDgAQT5/UzuTMm6NMF/FdsOAcY5px3a6GKPqHDaLFDxp45zK7h01vlctq5QjitiILDiHZp8qBgAoqxVARya6F6QPvy95o5PGv3C8J43gaNRJyrydeu89oEhalQLXpEJYmptbYnf1mCycOsZZhHdmgyqRPDqyiaz7nAIHfAsqcok1onXrs0STztdMsb2WS+2YlrdB0j89h+iqDDCTrKQAM8BrGh0ZPE5zh9l0li7QsbOPwM0EQbhGGHeIlM8iYQo2pLWsUQZHEQWzSHnp2BoooXutwyDrYSmEKBbKnolz8Ot0CO7v9i8cAWdQ3feZsykQiEIQRyokafUGl8JHxrK9sDJsqN0O0AngCY4/ph8gzEvVBXpAYwBMgXQ/wtCUCkFg8yKFAvvspCkgQSpE8bsyINPkNAVei/11pTmszv9KnSCm4ndSrju4Gv/jlOu2I3jTue9onCLLAugj5/vXbaXVuxDQqhsc/14rHrCGVwUq4gNBSlZu6SgL81bOMY6TvYiIwDH9e8gim3iGVsVCP8KWbRXsmoz5g7lEDpSHTQg+7VqDhHWwBIBUEp2DXpKvgAVwYRwGYzEgrSzWDOSuFJP2zv+gEXM8I6QAk0sHxXFgekQt28hskiOaVP44opxmDAcf4wjnH1oEmMtJs6neQ9p4KjMB1TY8/R9AEhjNGBfsZcdRqmUIKJJ8KE0rMt0w0SRJgPM59h7jK77zA/2J6B8AAAD//3xd204UQRCtngvLspAQifEWXnwxPvv/X+IbMSovhhB2QXa6x9TlVNc0g5MYZXHn2tNdderUOUMU9oCVBJAcCbo7nbifISAyDPISi4IsV8Y2oys9pkhH+GsJ4Dw5PYaTzdnULwk2KGLvlhxR68eqkEiwVAmVRQES5oatYGgOKDCwmcBLt0UCyH1MjFI2+1z4TXZAfypl+XA4OC1IKFxJ1TGlvztMJkejcmPi0WSvUm9YnXZjSFJKpv5oYEIOAihQtGz7n2XiM3SVkUAAGZqUzT4YKYj1TM+KcIKGQmGCF/rYidJwqm0fifAIXzd/zsI51CTV+Lf0/SlJXr/b9VZtHxfnPTfiQjGZc0TZeuOjwqsgX2Ydh755ABMVwdd9wiGgzEuKIibuLvQhxaTYw9FQ3eihZJuLe/SKX3jpFr05oPXwvviZqgBRE4AMlf4vvqOGOOP7AgqYuB9rHKy1ALQLg49Vm3hxruSaG1VUUKvng4/LqRE2bDcVosxiQXIca//ZaB7Gftyk1mhyHIr03N7vow2YhQAgdCEmpzm9fi7Jqldod6l9izUAxnvtKG8jQAb7y8gW+N+GxSebU0k7h4pQ2/bMbFRG9THmcdK/fD66BW2QuTG8n426PlulKSnJXfu2VaEe/u1abbK/A8izACzD8bMBCCy6x/Y6eSrCRnoaOjrkvVRG5l2m092WNu+39OXrB/o2n9Djzzs63N7T7+839OfHLd3d/KKnuz093D+qan7RP6IhMFNDQV/pAfjP9hJECD0F2tq42LekZl24qxaDl1RFyHL8uSN6+4kF+i7p6voj7d69oavP1zReXtDm8oKOW6L98ExlTPTMQWDf0ZPobmRJ5ieGv4dJ7vugfRd0fnEqInnbsw0dxE6rrxaHYjRv2gUBBAB4DKcFCfSba6+OHAr2oLLgQQcS0GSJ8EowUBrLKwpMvde09NeSzNc2zCFx/jyaRV5UYY6ByuqcG+ay9jJaEc8uMrPMezsmQa0/eh/A3Ckke69eUwDd/LPm/8fKcLTci9eYGnq50kiXrkAxZvFkf+Uexa09//hz/Dw+l1hRVxA0zBG5eKVcGIhdVb1fu3bsB8zDF78LNsbt+SgAXfeJKl4UiCOLLaJ9Wm/WVTIlLu5H5yyCeB8BBGscuASQnKlqCXH7nHy+NFFpVMJ5LUdhRH5vyV+eloK5cm9TTfyhDh+v0SvaDkjV54j1UkXg6rPLgb6bTWwZLLy41qBfGfvE+uh99NBVyGqxV3JpYmdd50YTP0ZrL/l73ABQBpB4myofZ1Q2HCqv2iK8fI/RFouqcdSbmps1G6CCzC0NIMgizkeLn5V2Xu2docQuQoEWR3Jcu9udUzI3oWVv9dEBCpm/LTGrLQBZAF3OHx4e9gt76lIqVZ6B1nGFvUOW0A79bPcFxcTKAEhgoIT5BPoFfDwWOOQkuG+Ai2L5xzAuC5Z8TdyqiVaFZHoNFCrrzha064F2GwUdNwAQopHUkfv8R1DAWa9cZMxgCHDSrzlkNiaPP7tg58gFlhPOLx4fFyyuydy6sJZAk4PPu8Z+xcc+FzGlpXZObo9eY8ri7gZrrU0APvz+SM+jtW4YiwiAAop9upYH1pYw+qxFOGgGSNxJxkAfdT6MWg7KfGf2hor9IfEHiIgxBMBSdcx0nPL4l3Eb2KLO6uHvwKFNnjNiqpX1n4j+AQAA//9sXYlu1DAQnTjJ9qCHUJFaVUJ8IZ/AL/IVIEAVUFq13SOJ0RxvPHZ2parVdneTdWxnjnd0n79+yehMOESLfQit+sA+k0jI+SRVoKpYWiTrmKLLeTjsrMsKDnpyOFKEshSI+OhQIbxmmYufofBe7eLDYxSbqXppz8GzdbbkVjc/1wEIFbPWtky8ksP/IKIhwodW0RF7ku326ABG2yRAjDCeMnmmglaIN+7oiKB8e0UbFFvG3mBPufLvj2J8sfOL78ABEjg3fF6vu6139l0NPiARwJEBLwcLAp1ylu6KG0/04awW4jTR6dmpiREOntwqr3ep7E36vghN6sJhSPVYBQHutd8p3WGd2NpG2i2e4KmOQhDdS70XK/hcpJBgPvYR0eAIk1zbZcX3QgOAwg0dz8fv0gZQzOPm4/FGyoUz9zRF1wK0l0YQMObFyqMnXyPVAgbEJ1Ig0tr7E+c1mg1TNq2I1I2u9Bt98LNRFljET9be0Lu3aKTPwBe+tcAcDSkxWIU553UhQ+aX2KosLlJWfbdOXQRAC+LPiBoCZNw3XHPY8vBYIMjgrvG7iwsJBCAoVHzMB7GwgTYInquD/KXwTo3Xtbg1qn4O9jdQeI59j2wUG8AX/WFdxhr2VcN4yW/Y+iYUR6WyHPVMOmpEN0NCQnqsjUB/NSgUGxsW0ZrUtWXDdJWJrQMHYu265fVAbz//0e7xhf5+f6CnH7/p8dsDPf/6Q9PTC+2fZxq3CtPvqXQ0euNuJ6qDO37sAbWzM0zQDuDApFMhwTmXxuiQNcufDYu0dKYVYMn+nkVUWcrkjGi4TnTz8ZYubz/Q3ad7urq7ocv793RyfU7nVxei5A8bvqXvaDvvaZf3bmkrBbJs+13SImTfd94RkUJT15dEt1q/yttkiOthq/dAmavWIUTHStWKB1svhQfbVclhCZoczi9CZJMUEZILC3FnqPhoS6F7/+Z7NBBOMSl0eK8dTjo+k67z1vIIcwgWuPr7xNW8MTcj5LJSjpZmQl7xxttzaZPeuL+zgCbsyYCuw16MQmpMPuO9fgkaM0BgvZlTDv7PDh8xwV3vUclpT9M8m13nzq1ojyWTVYEjr79f/SjHbPfQZHofURsnHudYwaBNprpoObgS4FpMS1+vbw7wWKJaZ2BuiilKdyk0sbrgn53+kRpq6ZyLQJgWZ0cfZ0m6bA+W1x6mSuwqFjhcyT+X+3/U6GnnW1ugaNcEYtb2dRsbF0+kLUH198JPxVGfi2sRiGByKLxBSA8dZX2uFFjidffxmmk1J3GP4c+acqFDxhimnS9xjL0AJM4r2fe+OJ9FAwxUGEsoJLG2fY6sGcQ2Znh9Cjxr16naanIOC2nE5n4uBHRt8iQK9GPprBuKCA0WIJMFmSg6OTl40we3JMyXnCpOPvjiQNr2FlsCjQu6n8/HBgJaOrvoFiV4AAAgAElEQVSg/Qb6SWhqub2mXR8cN8LbneYX5mQ2+i2oG6eS1CK23xc9AFAoc+eICEDCY7Guo/I3jr0xWjByvFjQSaGIJLEQ6tImHNc+hlQ49ooQ2LmgJ9l9HXMfTWCimiZd5QLmpAENOGiaQX8OxaFRLLoPbhnJ4z07daggaXpz2ajvr2GPXczu02gJvG8B2QBUPN4T8xf+0YKTIp8RA7gANK91G4NYsPaiYCjC6Dho7iMWjqbf4DEHXCz42ottssa/0C6p1jY3KnkvtKbiItcFzTlYXZoW2jzRf76urreJIAZ69+6SUqClLVKRgAf4//+JNyRUoUKUlPQ+9pC9Hq93kzYvLWnIXS57a3vsmentgrhRK14gR+kwky6cyYowGV+JEA6J4tuMYnvVUdXKVo5yZwTIPTbQ7MueFzf4CrPyqjxPK+ji4nMRNMtdRAEDgHS7INoJ9zcZamM3WKxtC9PqEBIE1FiCBX8RQGyYFxgFWTy1ifCItOfA8M+h6ytUp73ZfVe+791CPsMlE25OUygCpLDCcujtxlkUKV1dpwXIcFAKh9jjcCcLIiTy3Na+n+PzVJ136b4vlepwbcMHgYsklawEiqE4RZCjFDB/FrQEBAm5DjQrz0m5MWmtAqeJ1ThEtrW4wnFgKyk2MkDcoSKroIrw29lTc3OGh+94mwI6zWXMh14ZpcNDqC59KfyNp+je13cCguMecorGRTAXC6eFglNAVnCk6oaJWnENPOEnEEiiEgggfsfXIwfVWBWUw1D4t0hmAKzMTuwQayL7LpdOP1s2ovPEH0MQcQWfLjdZpLMFUNoHNulgQkxe+VnKR1k3XIjJRqpTQVlBNtk+QUCA58mSuxDiyfFt7RGjwcG6UsVaUTm1XX82gayTMO6w1AJhi9InuFuYwQsAIprQZON+nE32PJZ9bbJiBNeXfGHdeOBakOOJJLYFVed8Vr5deuXeq6DWPi60bhOFC6L3tx/p7XJPd+M3CoeJukOiafeP5t0T7R4e6fePn/T0Z0ePvx7o8HdH+92ROlal5tF4HsdeSGlcedomDhk1xyXi484yur7mwj9k8Isn6flr2o+rdOQnLfjXDdHFVUc3dx9oe/2OPn//Spc313T75Z6uPt3ScHNJyzaKkMG0YdODkQ5don3M+xhzCll0m48jiP/aic6KJFV8YmM+uYDzgM4Bph20U5c7htmXH4rBXAzza1DAYIKkAIqgNvm4k3Tqw3Vu6eVubH4u2Pt7nRxZC4HK3mtj+OnF+yopN9os1lonFR6xVqFSFGPVHsRJGxVgObnu+KIiZ0hQuq4uQNvPGBzPPu9b3DXJMXzSogDJIXi7ECFFAbC6UU/fjUf3z8epqGCLTP1Ma1XwkosRECWDNgBGweU1a3AxtgY4qCEfRJeI5vxCGy/62XrtEAVH2aNXpr9eet7//mZ7YRa9vjCw/xOS5Gj4N8TdkI8ACEajgp/DeujP2ML5dYGH5xqTo/1hao+q2JSqmBPd3z3wftQJSO8JbpNeL4Ai1DSrvHI4Hi0IxiKBKFhh+eULEGyxWAPIa1pNGnIiff78/JRAcgKTaMLx28GG0Dz8XWExxMGaGhlwqPMwy6ObNYrjePFneMwH15HG9fLfd3TdeztfLUpZkmZxjSbk4NI06sjABgAuaR5N5yCLFg9ZTG0azVIadF5yHvDm20/npmbKBG9e235CSAH4tJwAYrBxyzXI6eQquThaPnuxduRLKYrtqbMGYq+uZPM6ybqGyLCcy5Zdgp5PJkUAqE5aR5AHhM+KJqs2k4oxDkPRnRI6naPWQMcJOQ1RaRrg2njdLnL5b6tnIq9ZMMavky9db2LMVe0FgUNHVzBdsKU0EyHCiL2CYwZcvODAQRC47nIOPi55fc3Ks/cgMKVCO/DcfqPVppxTQtcBkxM+TrQArK0laTbr9BQ3I8Z8fwqwpnmqCSLi3m9Fd6Hb0JcpKeTQuAZ+GkLiAecgUlrV8cZyVdSvTJFRjTdeS4ibIrbJsScG+g8AAP//lF39btMwEL+kTdsBGwwxIfEKvAbv/xT8gRDiU2nXJI7R3fl3d07TDSxVwDQaJ7bj8/0+TkYUpUtw45hM5lRqm7OjV3JIbx3d5ANOLs7UWNzaUaU9YXIqDWa2FzlQep7jUwr1ITFYjbuygp0wl0MyR9PbgqaAGSATmBMOQk//v4aJozX0B8vGoQljoVvWIU/maLpGkXuuYbOfUjIqU1dtSpEq55ug6+0HM+6I2vYMo5oF+KDjMLpmJc3m1Ho8neju7q6U9rnUPHn2KFmyBL8rZhopeENY1n2u0PaKqj9nM6vC5CVkuTmzx/fzzOE6Zt6XCMwS0f8HSUypSVxeIk2dtECWfXnt/2mgzLL0Igc63HIxL9s1d+an0aXLpnKIjRmJzIUaCAZNR52+xDhDyJS9hkxP35oRkpbjkQziprMNF9l//o5UzGie6h42ApSwWQto0eTQlTXBxYFXBtJiZYM6q+CgOmldT3y44+8/nY7m+GoGL4wivnhB220W3ZyNQchIj2kszAJlQcVgyvrWulNv09SBA29eCCDhVJzNxEzlGDFjvTae8bnw+/Z89tJI1zRv6L8lJEJA04Q1IVp0BCBCW9YkJydLu8OG+uFM03ZHDau5ukyH+z216UCH9h21/Xt6+PSRxj9HOv38TcOfnr5//kLnHz39+vqNhp9Hevx+VCZB39N0ImqHIiEoMQ0o+/oglUrAuaz9fkfNzY7u397S4c0runu4p/39S3rz4UH+vH33mm5e30qtfTboYx3+2M7UtzONm1l0/1yhQdH04JHSslxDKyvwZcfHQRKe/C9hkBWECe/lNUlDHP9jQZSlPO1OE2d9r3uH6hfLfVri1o3YnlsfNoaNJ5nZdT3lpryj+OPIjAQ45Ohga4Fw3JfKYQwJmKzzlj1+JMAT7Yn/9pjKwGRNKAH9N9Rr62gYDo/XmtcDR0DVlEDb3/vMaIjBIUtXRI4mCPxkQMPcpKoij+xF02U1I7J9KF1lHDz5/BcMqnkqe9wUfD2u6PW1JHKuDAPte8ra3O42kiRlJEnZ4Z4QyuWAge4iOVOVGsv1YSz2icL8ROKq6p94StTyhYg+ImmOZyAu1uHwryUk60NBNJiLezqptUz1TPWZ6c8g1cK+ZM81u5cN/q8yUDcXrIS1w/+yxWRWRLXxiRWDaKHRRgOgtWwWd0RDsJU+QGbLsew2GCKmsAdsCy14ehyrMoTPgQ2xLedjjgyBGczMZA7v4vMznKu9SIA5SBCmWuKD9UlhCrSGdDqLF4kafrbiqzQ7yEcFIAGjjuV14hPQ7VxPHdiWUUO9aZwtFWn7VOYf/+xmd2NjF03fnL6v8uElsGWAy0opPJGdrXgSUZkbIkNKyvYbzicbc75/RsDBoOW/t52zp4i8nB8qH03nwecifC5g2Ce+Epr0kjj8Couyiotb9znK5WCKcXapk7MBcmA0r90vXxJJB9D3KcoDkstaFcBrzcycO4MKC7ye2J+G9xP0T1D/Sfcn8bc4HC6uj3gaVSFiBTT+DKfHCvDJ81Qxlhhck4N6YT7B3wPPVKSSC2mVxm/Kmtq3mpDmhpgsrjc5jIfr4Y2As5OMg6xtH0ceo8jOgG+PjKUgEbo3aFlDTTBKEqMkkeVeeY6TA8y67rxiiDDfmob+AgAA//98XduO0zAQHSfuZbtFKyGe4Af4/3/iFQRadpMmsdFcznjidskTEu22TWzP7VwyFl8Kvu4Q8OBDYZrN4s0g6stNb6gsUDrKT3qdXzXJHaGiaQnmVh0BgORK3stw8fN5p5aOLpokSInF/Bq0GYWl2HSdlQO/FrMs483GCckK7pMW0apVMO26NrDwiUFdJqwR2mbF0L6INe/Wdb3rCvprTEAQ03+3Rqv3OWRMGJjPwT61sesHKyA5OE15nroD3Q9p62z1qAEKwhYEuL55dGKT8H2fptknSNfnq1MA1GIvP7SdAWKDD2mgB2q4VzLFPx7cji56S+OwgQoo/IMhFsLPbRHV24tBbKAonVuzJHRM8f7B4N7S1bdDUTqdqUGqoPYph1M1CJtNviUw4n6lfZCL68U5TDYZgtBc32yI0ySGRPEznMssXWLx35SJ1OzPBom7owKskRbcz/U+fMBpXdfm7wyUxKNLi9HRYfLDaLZDPgVPu4IBGgYy/aFsSsGqGcH/5j2mQjzZRX0wUUsMJR+qwZmKoARS6b9/9eQAIij+P13TRiDP1kQsmzb7TqPyyIBYKNTgxtfrld7NYxVNKt7fEVIVn6c5+jVdCpsuRBsefe1g3K28cxeBSu1uDwZOKuydROhNmnZZeJ613qM09HORuIy774vnMQRl6ri/2ofbBCRYrkkQzo2HO+SjT554jwlaxZIltiBdaKIlK0y0nIhueaDb240OXGRfkrrcfX6m47cLPa+VXr5/JZoXqtONhlulPz9+0va20Pz2TvV9pb+/fksDwAAx4p0/HrMgNkbm3XID9Hyip+cL5acTXb680HA50PHTWcT6Ck/2x6Jw/qHQxDahZ4XjL2WjaZvFei+NarM3bNXOYPvAquKvSfYSnzec/I0CZdzWqqiA7ur54ZjqRctVxAUkVGQJD5laMwI0mhGPRGTjOdMoNlX0ZvrXVUMpsEbL0/G049h+VAR9VJxHvZkorCvrw2hVYpG6Ngg0r3+Bnd5YB2EPSXfBWbkv5Ir9WjA2Kz1ok8S1285dFLZG+4Oqe+BDxwu6OLlTOdcp4rb7XRCdAwVAJja92qtdqjY+7uIw4gl1iCvq9m8UpavmWd+/DhN/nBuYcKFBAJcgXFEzxzWM/qNzgL/bf89kOUP06CaL1bHgn83WqprgmkDcrYjur937zD4vCjZqchsoIubWIvkOd5qyNoWgGi+xoLbCFc0PfC9M8qN2QCl7ukmPyoLjD6iiQDlI/KZ78T7eV9w8BtpN4Ma29kpHr8FvwtoQ27SA9PNYYtQrPJc4FfW8kO+B5D+avwjiwYTmohJ/hOQ/ykOA6MNvR0wFvRFTfY1NEdU22H5TSHZzVWBryexrhfOUsujflfwgIlxEGLh6zgA7PoHvY6AA0T4bACDWMgJgSK1IEsh1WQOiLjbgBq8TwLMns0SWMwgoRIvhUeRu2wL/3R0JbPApFIQ9KkgHFeriIPElHQisv4gQhjf9wSbaIo63NSolhfxc7o81eZRK0VyjhnA/CVPf0ppi/DVlck2LWxSDiqU21y2msYMRCQqwuKq90Ay4FjPaAop5gmvHkIIDxoOzzlyisIahsRAp074miulQpKYzgCFjHke3+ouXOJON1afzyG1TWp0SBiqAIPGC3SnF+gw6J9L0DIgkzr+EetAGUIhdHONkUBAQKKg/2l7d11leXxhaNVISEBPu9WMazB+X0rEbFYN/GywFvZHDuk6WrQu1UGLrKmcs683pvgY9RfNJ5I/yfJeF/gEAAP//bF1bbtwwDKQt2c42P+0Rev/rNUA3K1sFyRmKctdAfoLdxJZkiY95VIPfPh5TNV03mq8/fyAYU7AB8AXzCq3r150WxGYunm4cG3i59o8wgBsqf5xss687XeyoAi6iASAhRz6YZyQADrEt1qU27jK5z1YFyeI7xRYfJy1XfziBTyTdGmzqZAbsA12+M/maG/ykuIMAOUjtNZIt/hyPw+43i7VYIeEmhsJEh5feh4CeYBX4Qr/XNjoh64Ca38VCgvN0dficY+wyFB9Vy5KUKClEwspnLDyjPbTgXfL/Fto0wif0fPlm+fn5w8aIiIGwueCCT8EO1dntvnbSSHwTDs0AdM5mBfthAycsZiAgWbK4T2O3y3SPZatHdILNEeBynYII3hRu+HxN+gNWdYVH6DvvT0FC9o7rs4BSwITNCw1QRoWug9oKWjB4tYmzFgESLnZZ1nXwQg0e2c4pgTUfWVQLbfNHgslOP6Gy5OF6QeccY0n7LiSk+TJPUo3LrENweKLQvaD3eHzG+3yCfhEdeQoR6UH/asEH7Oh85/yE74wVvCBEtIIWUNBhPLs/U4Y9MXgg959FDT4/D/plUuS9gOK4hrI31jwmzJ8H1Xc94Pe6A/qai0LX/D3QI+QNrzlDLCUF+GuiLfFznCMWFqwr8hqdpntixvHO3sS8r4lCtC6JI3hYUcDtB18TpekEBJRV/L/aDfqooiWBbsGRuNvHIfJU+yHxhFEh68oFrVqM3BaplxoPHrY2f/3+6S4z3Tv/GixqW9ks/tyU38dndcX7bf+Qemzy3drgpVqfpstLu76L7s+X/VzoAPVNDEqpHfhdk4AFCX/k/GMNVBkCfDoG6+ag2SEuNtOZ8vyaWJYhUFyR33VpxjtDCkkuCmRxthwc8PNu09dN+MCCts33QwY8Ov8WyFb39e/gInbQeNypxcWDLADl3INqUysddPyhD8D9dU3oPvv192ug3uC1PSWUV5cPnFF9wflvQrzs3KUC1xs9A0GSwaBbx5dnFM+nzDm9f9c40EDiFCBUcvKfC7M/4LHOJgPf/Tj7o+vl46Znc1eRV3Rhzv6/W4g26IbmTQ8hJ8IyiQqzNcP1lhJO2uBx75NbkYDFBOMkA5lHrZBad9OTmPbqMubHk7Ie+ilZ1LjHHjSCWts37pTCGz1E1x7XqSVhKbglotN+n92gKBC8jjNTz1QTNt5rFIlt3clc4M3J5Yr3h0Vgh7N6Qmsik9JiDDzOauYh8kKyVco1ik+yTgrpvD8T6Uy6AvRlz/eU55axBT9Tawkk6FP3qDrvFVOX8KYBwIti28KzE3s86aOBOGMhhMiIa8SwJQruowByTUkxYMRvaGmkPZ5wQDKF+YRu097higaRFoG/tSPdmuzgow/ElqMkrZOoyNLvERd7B/+Spc4oSl1fLCjafMsoouT54FnHs4sJ5ZK0MuioQiFAL9Kjw6lnfF2HMwOf7aRv/u7WkNDH4jhLUCtIVVwHiqu1sECWVNDR/UvjSs7Zhr9/QWDRrclLwORzsijrOG94xhClaLFQolsQ6WuaUID27skhIqzWQYNq7WkubHxeIrSiOYZud6ZGcTx41rVUOOQexjPOxB7h5KbPkp8t9qI6U44ydVKSMCKvjFKyvEpjO9yvNgmYOxHxUNY93Cb4nWzZyYKJJOSjAAGi3XlFkPO9icI+ncnsXm4uM+ld0sZT2ISqdsAbBJwhVWoJqrY1wxBz07Kd77DlFcjpOCd69vvceHPUb9TnWG/rOPzvqhu13okheGhLb3Tu3ebQYhJFLiWk7bIu8g8AAP//bF3tjuM2DKSsONtir32e/u3r9CnumQ849JxYUkFyhqS9DRDsLjbxhyST1HA47H/98/d3y5QrNQYZbnNAOx1bu1K+ug8wlQtboZo21PDRiFr2UK4TWtHZikobEkd1cQyyIf8bxJ6ZlQcY4P3UvQavbjIZNFZD3EDt70B7ta7Qg49uYAA/owuadTdERClMYvcPzYGBTB5vbcHN0iknOuf1vCuMdjoeGuaL3kFBZvhZBkUENFbVLCg1hgv0kh3tbpgxNkOEDWDUF0MszPtnfjj4cHNUKxQo/VCuUsnexs+keo0Rxq2B8uaZyZJFldL3/t7HGwaIPzO4Hb7uLMD2u6MxnYVOO2ZSzydUSu0YsuK7ZAVwznkO1uPX2sFKAarUndAs6LduF5gO1sDZ/4Wib47gE3gJBV0TnRklO5zrwZyzaWOA1sY+tg2MhQ4BGHQmmCP7KhMw4LPlG//TUMoONX3W+ZEC6aIjCNoKSMeX9dY9z3CcHXNNRhDF+Toy/1SZZsaMY6nj8JsBhevyjK52zdYIAiQTHZsT1+f1SlRWvxjk4c8pxZWqAwhbyXkCOGGiokrhbBkoV1ViR1xPaCicsHeP6PJh91xsi5QA4/6WEhS26Ge82fd9w+3X+rLAh2PfQuxTMwgprAQ9DKwJHDX+ltKNobEuM2zGQoAh2XGlP76yhlgGMCfo4GhXB0ExH6Zhm3LrUKGdCbrTxlVDQGn3qilw7mLMgUPf2oJvX/Lvc8n682nq++9vm8w/djl+b3J8Njk/u7w/N/m5n/LzOeXHdsjx1O8P+bUNOR5Tjn7Kuw8Z+t70Gt64hpntAuATJLc+3rUFrQXMPi1vD5sblyxXMgAAtmJjzV3L4MHWDtYBxVIrkGeSarCxFqS/X9a+ycQa11XV3p09A/cVtqW+KJrlgUiuUaM79ocDKM07zAx0GVgA0WA1Yc99vdozvlK4ba7almhFhpMstufHR2SKbLNWxSrr5roAxvV5kFJH7ODeV/tPfYD2P2wWm7Hmx1c7upc+5ey6MlHrSptiQThtWfjO9KFZg+z3cCKzxDmvdb7BSqJQGc6lY69zWn2bIBt08XErkxetpY2jnXLqcmaAPTM9o/3YAtvOQNTHfqnT5jyQvr3QQrOuIf42ilgf/2/BfLvS5wnWcl3Izc7dS+08w5pAbK0Zl5IRY52tlpw89qThU4yNukTVGtkY0T6+0GUH/qN8KAACp/Jubl8R63wpe6i+h91eZKWtXBmviDFi3xHv0G8ugpfo2FJfFj8U0OWyPuCXjWXatwsY3qB35WO/EHvq2O0GtOnmJ1gX3ASrvg0Ceh3TVP7++po1aQKQ058jAtCPy7wFSwLPvfl7MNwGNCXcx+T9OZvhLqSc40ldidZ8T2GJnnFlh5JpF/ME+6Hrw3UQhn3vbUmVEzYh9wPw+CVZlKyUPEdJDt6SX3cwiOPg4tYbtJZWsZ8R/IfdJfBGf7CiHAzXQXumGzvGa4hj/Plz8MRi/1tssW62dZSYKPZOjDmaH57ntefuncBofa5Dqwa3E4J/N3utMZyewTLSOi8KiCDTnC3TZ7C279luCebKumii5KDL5fqocfM6Xg4a9Y6Y3u9zQ9tcT9gKkj+pM9GxgeylNecoCWNNeqm/cLH3LIM3X6VgLOJcgk4RF8Q8ZLlDAHuVhEnWe2F2x/0hMiPo63s+AtQUo/a1auBtYSG4DpG3oT40vlDAFWLaLoxIn17G2K7Vx9D2fNsm/wEAAP//pF3RbtswDKTkdMvW///SDh2ayNLAI4+ilHQdMD8MKBY4jizTJO94d2FXWx9ytf4iHZwiDt1pNzqXYzPjLabS+eMwItjpWylxk8fmvSgJIZgv7kSR66tSPFCQfkNiw+7JZ7PQPMfLNhObKQ9C2xNHl27v7yIb2pPRCRRkjgpnaszfvn9vcOwqwPyd1YP8fjDBqmUKQz3rkOXEPZDEf5Qg4G/ZEe4xVjQgn3/ORg359qIPyExATCXWEEzaAebzsJlhjYhzO3cPypAleUmoLzqtNZLsM70wzAfYhf7Oc0HX4jNJNJF0f/FCtvhsGWn8PIpT33h9QYej8GFZ2QE4Vy1xHgZkfN8uwvDFYTaPZ8w2URClHjN45oNoAVwc/KXR2hlFDK+F9ChJ+xQi3r2FuBUKmy9mDLNlzFQitaSc6thU7KXSKOmWHx/lkWp7yCLGtIoYHqGeTq9XFdHJ90nRIDZ9oKj9hK69JwNALn2d5aiLqjID5xjGUNoBnMuxIvr/e/BaOIdJ71nxRuc+P5QFcigQlEcE6JJgNMsWHXT6ges62ciEIcF1QaRLJM+Kjl/AqtFbVLFXDhQ5hDnpTmFjABHimAxpIYwRmwvmlO1V1uWuDeZCgcuOggBJRzcGwInCs8B7X/8GBTMl2T1/TzEvfGX2AIkl6F+syA/HAM9j5mmMBVDdBYZz1Ca+OG1vKRaVi3xaYs6GQX42eiAhxa1BdZ2vrrC/s62EnsxMTHzd0GRgoqD3o1BQb9KgBxTADQXpZTa6iP4eXhCCwpjQkRuYG74uiWH32YFmnDcY7472hEBTUn8+E2NrsRlzVe1s1ZUPY2Um2nB6fm1ZZvJLxwIyXejtTRG97kJqGs/YBGhbIcsELlyGeg+7UdnEn8S91o9uI2Klz8StktXoMTP0Ns6p0QMkifs2mtSJjt6t+UTkz+jo3e2APYne7stDg+SJtenOFIzP+5zvHBGD0eVy7qV5kPKPHJtz8wGuAaPFPea7yLRaLI6pUB2aGmole6YxRy0kNX4DxXSE776K8CnzEAxD/Qxp4kRkcU/qMgo1iueivu/PJMIH0Mbji8Tz5uBG2LTKDGbdmDRWBFk+piM3pstBcGNb41KCpkuXjPxOsuK1YV8aXbtJtuLeG7JkadI6Giy31qPY++6aVKrhwRgl1PZI2jIi8hB7xGe0Dx+jhQPD1RgZKIrakNefr/L26y20r4zaPvfMvbst4r3F+3NwRtk0LCVHyd1xoW+XlLdtGTN+M4brP7p2BczLO6xyKW6ZC3iOu9Y0ktQSiNGc7STbqHGe+ydbz8ZNpmZTDXbFAQ0kvZ+8P3tMFOga/Ig4mhmiIyHPLC6N/SMLsyrvBbIAxAW7Y0SC65kFN4Gg23seTOYn9Uu4Y7Ue/09EH82eLQHR33kSfb9cvOlxGCjgdPffzvhBg2YrSnQfGbNt6rmQQW4MxZfFv756k9S0KE640OW9BAaBzDyX+g08rnw+/F2eD6yZ5wjYr55z6nXpc/rcFcf3pj9/dCiwZtEU+MZnEvNSYwLG47PteRLRNs29VexRR+vA/mPD2mMfnFT0bzgW2DuQew/PHB8idSBTsMPZXzZ6zMZnlzGG/AEAAP//bF1bbtswECQl2UmO088epzfprYvEEllwHsulEgNGG6S1JZHcx+zs7P7rz++/TUgphAL04SNgN8Xvpf5WBvKvRCEnxWkio6Q2G+WjQ0zokh1w7msxPTLNa83V/F6IkCPgVDXdaBtVdFeUOgf9OQHqZfbNjAMZfVqqkPM7e7AEvGngHFIlHsa690ARsehCoGLTbntQh2qi++Iefa0pcV8QPY8yFFJMVdxXJElNdHEfyyxwogex6AFcDhrlmKgSvYuWtC3j+Rzgxn0JIG1ZGKMxKUKvjaoz70L+n0aKRUUlfXdWtlx5yi+vEWncogCmNfX+agrUmp5PcTKs/rJigZ+XqfNbiMIYyQVFGg8AACAASURBVC1p9j4oa9KrwHx+9LPN62mJvptZDEvVx/T7fVZBRvW+pNFNqJu2SxTdTZWcOVGCBkFOp5aoOFVlK483idNcc66qGQYULNxjjZxoN1RjnkKhvyeqZPmc6Ek1esvgqARq7fdpY7/PPlAH8aYpb95LEuI5UjXNzBerGB/HivCD4yD6clcAD6FP7aPRG+pezaw6nZMG72Nco1saEhp+f5mpgN5W7RvbC1T98d2coGDRoq6KaBakuoNzP73uv/dZ4LM5oiJ8uPLqJL7RcFJd+AiaWJd98fMuCczCz902aNM5fS3CS2O/LCBpqkDZftgWwMENwTlEYa1UEVrJNXDPLNHxvR6qPm4Mi8f9of68kYK/yR6KzoZkZDiwLqFSzsMqVz/JUNL6O6FlIOj++o7ocIMd5Z4BOC1/QAYAzywS4K4z1vWO24Z3medcVdLn0D74eoUNySwZ224mbI8UDK99xpdUpq/egu2TVfT9vL+kaVFFc8yCqMHy0ai9U8Atq5UWKRLgsc3RRJykoIp0nVMX+o+Ms778vaUq1qlpJz7XBsS2W2Lo/Xb3Zfy8ImDyEf4tv65kz9cRlv6Emq6Z2xvjvNocB3zlvmjdo0HNVnrof7jtzefCftQ0dLTjJZux6ZmEXbVt8jhCxzL9O/gfZ6rnft0VnPQzphgiv2es38fHO7R5qkZp+oKsVVCTv/B+66UvgWfss3TMbdUdg9wZAFH0UHXeOkS5Hc/7I3rRxUA4gx3VFpZdEe8GSU+qVnJfcV/aRv1krV3UgZJ6THyYgN2lOMPX/+KYFf67Yd9zvGB6f7TRtGBVTRswe2Yx1lPJia8R7A/FF/zcdU1BYRcTA0lmSmYch5jtQr2QqWjfBbI9rUOllpkp+JhazEJ4lsmfe+jjXstcx5L8EPx+m6BxE524iO0COxFJHWMfrys0aFAJ3xXvMhEeyVLv01dmhkaNKU5iaoqdaVq/2Vf5GYXNGW+JgF6K0cZ1/YOQ3lNxj89y0sXo32PrEP/TKDwI+qoKek/+/X/cVljLzGHMkHP+U5MyPQXtpo9q9k8C7SEc2a0tRHt3Fy0liFHERj5jxry3mdnBvLYWQKfjdbR4pj01igCnkm2z0AIcrFMUs/vcyj42VZOzILLPr+MqsEj1jLL9Og6Cf4hLFBvbp7kCbhY5pzVxTwMAFMtaRwg2+fPTop/KOfpcizNGxq/AZKxh3UK7xqwBv8ZMuOlbUs4h5t9ck7Wt03+aJR6MMoPHKQZDgfPBeC4E11OBHCyIaNdj/mIwAO0maCHjdSIewvOc02/G57t1Fjmy8kOcAdS3GKORBZ185HhfV/nP1bUlu6kDQUkI7OQu6C4gu8kqsuxzDEip6ccA+XDFZfsQkEbz7OlZ/v/9688BZd7pMoGgSJlvJATIPAwkBVj/V/wWr6rsiwIbbmxnL0IozNpxHSyomGvnLPl+VcYECyBo+VC2ZyjbSEUVgdemQJSjF2apCeE+HCyXKSgEx395U+YNblHEuD8F3eD4rSDc+M6JA7gHJAManvFusB342eGrbUg4d5K6CYYCotUIPsWybogVN2cmzOvet1NVkT4l1FCm65JGGnDpRqe2CFZtOHJDkzId5S8p6XILBO6OWc2qfRe8kM7EfnzwPhzgMQ85oAuc4e31prGEQK44WPt+JkTbUMD4rkw5p4MKEAG9DA2UQmF/HHgYokqu/ltc80NoV50zK0+uwFlpeQ7vBmbYg0ZJ/ckYLSnFW25zoG2YDOlyxtYBfUL3yxOyNlRhpEyyKhh96V+fLwYhC5mz0VNFi0fmUFU4Myi6VaKAlDDnRszRbUpEVwYkri7AiO9sF7A6iooqdbHgteeZFT22BjScgTAM0U9cZ5MuU1/eZMUzlEYYrLhenCciBgx1vgi4wrig2hjZdp3fkA/K6BSZHI0W2HTfGzPfrWaW/d4u4rW1QfFzoCcdLP/B+M2zHlu+9iYn3KP3pmDWPKcH9pGJko/eP5IYhvS2+lDMqOIyvMAs4pIyw0qrCz9LVR+hHKMYN4gq48Iq8EfVrPvZegYB5IGI9T8NfasXU21UqhH0hT5rHS/01MdvZr0lE1v+nWHqmrT/qJJy7JuIZUJXhwMvH68lGZS0oXooJ7L5K6psGJPX+hWIFsLMWqIsDMnueC11hSHlMyAlUAR85X1qh6nR6fCy6u8A14HK1OljIL4t7M2POfwgwVMFHIFkEB9FZn8Q7r9U3e90goLX4gi/qS7Ra399tqJ9oE3K9grkEcdJoscXI5z4XE1GlwSS240k84JAgw19GrWykY0X3+XhJEQv2s4+O/cJxrk+9jSvaZ4J6XT8vBMNEUl2JFLqFOxxge6eWld/7jWw3XPSpeTp8BkR0uD6BJ+BnArongLbjLO/vvLZ8T+wqTyrKFht2PslkQhXsk4oHekjVNC2F9ZuKNgP/9MwxVmufvZFPcuoqoTzrwC1OIBIRIiSHa7sjCp9O/KeT9kr9iBPEc9Rn+zqqy6quEEvDp2ftsgmCaqcyaaa+5bfgeBQLNjKpMfaN7chvjb4SE061QmOuNcLUXderRFKCJkN3cHkaUShEBDBlVCVlK6cuSBZ9xqJCA89qztsQdw397XiWV9h6ythooEYsfw4WWr7NrMFUyTIfcnKPpB8sKkuNohpW62d75//CZ3ZhXSjP3dy01NrYP1ZRuHEGbRETRYgYHvpXwUKxPdXyzXyrObITb5YWb3+nf9wDtzt9Lwl3P2ZyYpRxTzODP4yiNPUnCgEcCqWZLJw/V2cWZXkhZ0OW6Rq9Ev7cA4JcSnJaUOkFIsiXSOSHXhdekMJOSddZFdnbfIT1/T1S23py7J9smcRwNca6j0+hPx7/XiTLBYEyzzv+8FY4Rttddy7IV+CJIiaohRIt065Apleq4+9xu9nTZ1ZZUvcOhVnitMXqrjISvkRo+ciJhBj/Pv15p6pJQhcKNK7eMaV/uqiiSdtCjEzifzKFRGS1e2z3v9Idpw3pCdaEcDBM0XEPIBKY0tzkX/IZ6yNSe4hGT+9RvBRloyr6BCq/QUoUiEgxAWBokz4HEAyfFQdZxIEvjtiLl4G1+yLWrovNEZVG6kTxlG8K7fq8vgXYWTxVlIxZPg7eBmMLhT5YFHM1UUM+DPWK5JOu8m6tZ+F/BHgETpduHgypk8lrJBgGiMTb4f0IhEB/RGgu3iasd+sjzVET/5C7jfoNOk70PDEhBedJdso6wifeyewEatF4kXEihBTJTpyrRQzoM084smV9gb+TxDddwbwJMhHqogBPPaNfgIFmfw7ngbEtWBBhZxiUsY685Dv5LiyLgvbEn8fsi3jWFr5CwAA//9sXVty3DAMoyRvkhP1u8fpMXrurm11RAIg5SQz+cs6a5uSSOLB8evP77/3TOd0Fkukz3jg3FGYcKNTZ9eLR9JtomvFWe4NdNIDqBwT79phqxQqoshZZJvc7dm19sR9acVKJ/sNTQsLbB7gdLlODTMR9NT1OHXInWh3zT07iDG3Mkd7MACkOSc1fjOsm5vGyGdhy4XxTgfQ4gmQxULRKbIr3agh7EIgkpKXdB/qVKkhatBbXee5ISDZ6bdN2zqhdfXZkONAwhPJ2oszPXnI4dCkZuV5D5QSrOfz9fmxa8zhov4FHfLEhIVwyR7qRjN+6s/UnNAZUo2GUXT+7g84uqZzsCnJNcUfY1CIBd+dtU3fWDvpUYAO4YZs4rA4o2Ebv1evCExHEY3i4JQDbHhoVA1hRZFe0OcLLUfCWvbiOLCATn2gCxhOsC+hma/xoS6+EKpsAPvYLVIoGStGTdWj2+oJ3B3aL0dKXzGayxM4xKKjmDAU87jl+QGx3LSch03UgxRcJm1kMbg5I4qvXlxdG9YOWUuhMT11GAxOHekdDY98aERZmbR2JAjjB08OK6whvh93wQaK7w08MIPo5syCtqwI7SeMK+5dEUc7B/KJrLKjXpt2cz50sNvnd9rnbLvp2IbSTszeJ8IDzxPfl0Fxr7plPRuYbPLejEouPedSFNn+AqLBXObq1gN/hmRqHV4r+ZKaGkmvH3B0hnY2EEoDFNrNnr9o5rEhYGm+yT2K/4MMLkog1hfzaTWfn0FB9uIvmi6J2kzRthtd1XEN49kFdouVEaMDumdfz+37/mmWoF8auu3eM2+nT8bfr1iv42n1/vHB9rj+hmQUD44a5/r7md+nonV1f92uN5NNQFkgn9HhiEbXZw6MY3S5CpFDItMoKLWe34U+aQ/5BW6QcUrXel8vcIqvuk0fMctzohU/DzfkImIZRZ4XFDNm5Y8jKZTGc/eHZ6q9DXRzJqM0HpUHjSPUZD7muqXnyF007NqPrnTuJwpP/e2NwnjgbPaCY97f1j2lFJMIc/FpiHibGBF3i3Folq7zmhixkuE7jW+ZyLeWvlHzTuTdzWHBoryuQtcWg8LEwhOwYZVhEQn6iabrLVPOf/Lgqed67j+5v3RoZIPdEIUwGQ0ySbP0BCHgQzbQ+3zLU+jJANC+Rr+Qh0CAqDbPYxONOeWYzFurxBC2E4i3iFGOQpxEhY/Ms7cY5DVyQ9jeZ+tZfLN42Vhr0rNznTd5M1UmzHx+Dvf4Bs3bG6MwOVy5DRvnZP41xMVoaZrqZzuZCESPC1sJD1AsnVF8qnjINpzvHQw05en3XmwqRxcDNMAqMlpiXcVaI2Og5o8bALrm4MPv6KfzfdszYOY7wOC6wPhzw+XRZcZoqhkO7cNh8tY1qYR69ZDjnDIVnUW2x6K+7vlTMt1kT1S02OhtUujt4R8WrLtLbOwmPxbDebHa+KwJO3xrmnzULjXEFEd7uhajFCG7aGDN8H09ZRKt3A9zWn6/XqRpYViNuFvfECxgSojFJAH5Rvndg90iIKW8W+6R0VjMerfWhDEVK/Z/5p68nsvXwGJeAPIq2lcO4o0CZ+RhUo/XvCFf3veYlBYEIyQ9Zp4/rTX7DwAA//+UXYlyWyEMFPDitP3/b21aPz/oSNoVAtvTlplMUtcH5tKBdvcYvJUtJcqSezLyESCq4TnmjWxu+dAMFlhIOvBwDW3JNh1tG2TiFomvgQHmoDR8lmVK9b2AQzSZKjPuD8iDnXKno/sCi8h2JBbhI0grpkTE188vJDZaBGIsPT+TDmpFgFqS3NuyELBBK9jI9bbVWSPjSYm9t8dvZt6iRBzlXSyfFuGN8uRDmIz1nvDQ51NPlfJQIlMF4LxPiRXyKjBrRox9sKkX3HgelCSkXN2VjMJziwADpXb2nr3M71Mm2ZaxWbPfP75bQsZgD5CH20vEQiP66iFdJsRML+uyW0ZUHQ/d4GQ+pXzQDbI6cbB1iUQX5/EB5tdpsKcR4rjPpMHEA7GPrd2eB2fbO2yvpMHqtr5G4s1gHx1j7HNTYHSp3WuQjlbnvGGPOka7wOj0SGKYwURZ8mP0wNky0dFxsH3cPgKPq3uGJb4tafPrz7ePZ6K5dxjVPB7s5wmymYHSVOLFhGcJq0+A2bf1jbI4y9aW1Uhof4+jRXlfxou9aiXh+gRBnJednZYA0dJ1lYmy8jVdh20nMpP093om2fqVtX8jG0NknolF2/fCq9Y3HNnOcZL3a7EkypTuHCSJSiSX1/k7jXeLs+rteO2JiZ73099JSkoibJLQswcDsrCySMe/QpLq9Tpa+zSfU8c63iyxrLj1OMEZQ8gKmf4bsH56ux8OQrKRJHUK4lBq/SOxZnwGkKgL6VCdq2N3ENe+sXLlEvKvOKHclZj7l9cvvjsj46QkEhhc2A7ZmdLdiWbZpCA4dVs+A1sy2pcNVrpjIG+qHoKkoPMnzP1rZbTUtCbuVm3c44qAWSu8tArLzp0ET3x3hnC/eFnwv5HihB5zn7Jp+u+bMkwTH0o43Fhl3fJ+tkfjtpDQOtj2a4SDxzHUah/Vt/ifpucspbMMjrWdX/oY50tZwD833G/AmQi1RIDC4FQANaBtf3dOCxO3xat+LDnSp5JNQEaQ1C9eLmDP0/67dCw4cmqJ8uMI/imrybWCuoML3Dhul1zxgz8FZxpbHRL+WejSt2G3f1YXgRLugdcLnXVos8uJNZoJq0uNRBE6tjjh3HMXiLR3fiGyyI8+bxXzmUxFg0Qe4Ym+4VAqqhBocHgneWL9mAEbYSbwqUuCAeb9MBDIjqhc0cfAP9VaVNuQdJkXDTG3dX5OB/R3fg//Pz2vP/UGWAPmMeSX8jtohapyo2iFVM0Stfi6W06cHACsMGoyS6b9Q9aEN2/0B6+7a/KvXgRLAh31CF4jic4qm2NitPH6lQm/LUl3KmGpr+8XBc/2ncnikPt7ONyswD/mGeSJtfUMc7I6l0LX97jdDvOTba6682+Qx8yhOTNOWKCRYzyNvSQftLyYm9xClrsyzvF4yc6mvJ6hUMSE5f1yX6aCe6mXuS47EgXZX+Qtv/qYGhsw2cL4xC4Eu0sgdqo7GFzkwhjcQlK+QGLUvhemxThCogouXWhwvJCUMwJ4xEcm94wqtbvK4mcyQz/6Y65183rgzrhB4w6fH/XZqbDH52j/VL7aoESIVXQMqQxjY2rJHSiipPVl8aomd0WTlOT8monv/NuaiPwBAAD//4Sd227cMAxEJdne3v7/YxtfVIicQ9HKQwsEBZLF7tqWKJIznDEGwCWhLjvgtLgncseBkZQ588y6BPVA0FB/PGTpV8tUxrUFnWzuRiAZSXQTuuWK9akACGeBNrts6sagar8pqWKmryUkxjwn9eCynRrfH2ElaCUjYLvX6xbXa3T2UI3fopPkn4uv6BXB0QuhGj7rg+aCdRDXkhG4shSA6AQUdBjuMzasUVWlC5BnnVEo5z7WUuUZfobnuDdZEJTxjvEdc+paPMcxhdCK0z7/ytfzls3b9EPuqbPaouOb//GdSTadLnWZC8OjeSxH0Y7UTZ6d+n3Pgo5ZcHCPRH2MXhQVyiQFE1l4YkYoCn6xXR5ZrNCMAoWKjaEDftD/N2bB6lyHXcmcFd5qEOT5PjrtsGMMLQkV8BoqxTaDnHzBA+lJjhJxBwJ103cE2RL9HqTFuvNKrkEuCRx7zGfy3grEUbj46zabDXP6J0WzBa+fn5h76tJUMCvE+w5qtYtMIqZ5x+f5fXtec863NBpAkG2fHbvmnK5ybFuoNKuF/+pe++yTPxMTukn6D7Y2NUfOj1HlXoI5s3u+ourEmg7SSSMyqeQPRoT5hJ/evLJmRdpTZDM8M0MxIdKoAONaYg518YTOcWN9bYYxULEvZfqIo+tCrKkp/tRAFKbCPWgnz4IOeD7QSpm2pU1NUGLht2boYk1VF9uwjMLkxm9JyUhmjdyhZdCExP2vAfAeyTiE/vJTRB/f5GhjIkT2N1xv/DteSrbvpNg+1YofO9TN6/rrSyNV9UUX9Ne6A82w6gHpW4VLcxINQuSFeNd5+YkkkEbjiNNYQa1oP//3xOAowRqbFlc8t1vNtibF6y50GTr6jK1an98YDIsQJ2J7svLMCd74/bCaRL2d9xzXaPGjyzZM/tmcTZfo+rCqolitWS8g2R8uye513QFOgOCE8nNLonKPiwD3XAAmNKW2+tqvAWik/WIMocQIG3HmB408abvknMCR8RLjACuIwf6sYlAyCgg6SSzlDCov1p+DLIPVgGAo29WK6vOMc7iKKZGt5UDdeK8mhLLiroL7jc4g+zxLVJ+I28SM7PQCM8aKhaWIzHhgdnP5iGI/xhg+5k7xzEJfzYxBp/28GJOwZ9ySF5eeLpeceK5cR0IuacRN8EHipbk5X6Z+0dPfyD5/55ICcezKGfW48uvRfKl97jcG0sl3HzGM7mQ33WuOI/P8qanAwS4UzLVjW9haIN/ou9wq8CxPUiHi8WCPc2C8PusDFelv/Pn1O2bKbdwzIdy7xgtfYnjPFBR9pMvC3nENIGdewhaOfFtosuv0LGLcNLyW5jV7nPwIdhVaW133x88CkOfJTt5tTMzP1xE3rYZQPGefrE1IwMvw6hfLgX30JFu4Jh2dzAA4zzM0Sxq202Hh9wkRO87KDiK+sICIw5wNmT2RX8vadxD3SeuqT8c4RKTP0+sEsSKtUQKzZZ8M85qQ8jucYXrc41jHnLNivdhnbTB9GAXZAyAiX7kTm4baBEaf5e2H6y15Lowukxpbit8Ghkko18eoHRQYa8FHp0Hz1eCggS3WNPdu/7hmXPwuO1SpDnZ2gBgvyi1Zy4MBgAuQrz9GMckD3/kD+WroitgYqYMTaA15LlVKa638AwAA//9knVt22zAMRKGHa6fZT7+7m26jy65jSewhMBcEnfzVtY8tSiTBwTy2X39+/83NVw9b0FegE8tYSJIABhqzuLUUEFWLMeiio+MHldWk1UrjQDlOLkLhegEQhhWjUMAsJzrFhxbOfRi4lUKHmIm6ee1yIK4O2vHdr6RzYbpHZxoJQJ0QJvSLCC/XyhPBkQWPqYt0d+Qf6hI0bdgDFFZcN9dBh9qNiR4/tPEG9Sc3LYMSHwBE18nwPjaaeHBmyhTGPvH6WNB4DwdYEL6IQRRV/83IqtIT62GlLnqfnx+5WDeM1Ar9zxc70QWHlnmdUFU2iEUxeCxAZGxiWsO9A5H0grs/y5p80D4Zp0t6S8b9h+J+pigb/96hvZYYJTeMKuNoeWg/h47edECXTMG7rI97mNE4jUqsmukoZykBmahY/hzvU2G4KPbqKkaeVsiPt+KjwAZHd5MN1Bk0R0SVdTZBNSDrGqO4JlMBcEXXpBFLSPdzywP3oNsGfzEWzi2705mqMLmQD3oimb7+zC+WVMqtuJjWriXX19kedR2KYn5PzZoVqvcwtZHRFCCOgA3GfDr8UrxmPvPq4+FEVR18XC/tsVyb/9+mA+QA/Wz6zVwbh/pqugVdFTkOdOj6Pp+zO2O+6LcswzSRr0zwZFeU4ys0lmvQ3/rYBZC0ZRFPFGL9A7jkHvcOzyFWRPVZyHW3F4u9EH/cvfO2YpxJpI30iU9li6eefOE3W+oGZT+QMix3gy/a5iyiiQp7W4u4ZxS7xLriGo856lWeIa6nHziiQKGbUoGUYQ65CeC7zHL/8teWAZATj+tzdv8ef+efEWC9ZTRn6BKv85AfRrATcEzaZQKFjpOC/649h/0O74s2oKLpAJ21gOJRkSInVVN7qS9rAibq82xvWfrIbAIkvRIQY231KLACCDEOsdbEPk+tANC6S19ejXgpXlupGfyzt5Gf3msHDltubiywbhMFt7XQg7oWlL1mtfneLMODBxO8o+RGZ0ToYkOLL0M3GHSHmia+FqvQ7L8hTNGIpJX5bsv6NWqePX6/+51YeCeZ2bfaC1B3sRlIpMDkfQFGy2/GPVuKVML1/tdYK/XcZQRa32ct9lQMcDFjTaApI9qWBHfCgyBkf8ZeX+RRef+KbGjLGkgRqs58ibGPOXXzNe0mr6ibgLImw7vcN67wDDAYl2dT3bN5vZYgIwaBBfB6j7YNgOqVkokpB91ajssq2dNNXlCXQI/nv+eoXdVxTTlFw/zulFy3NN2kd8JLwNlJnTLe58JtGykfPj9XzR+xQnzc2oj01LU5c0TfCwgTVPczzU5hLNTIzAS21zXBkkq3N11TP4j458yGZ5Qv9Gdel70ZY1s5uOYe6droZwJr7kEheWH6RTibK/wFgqaOJv87WExzKvZIPXtMtyL1wkSNNdJkJPol0IxkgPQ2ajCbZwA9PAQGy/rE60XrXYJpSHVeX35vdu1R+UyUBgY1O3sd/2YNuEvfv22zXp66CAmxFaCdPzewE9hjrc3d7uJPgRw1ZaOqBbx+WIZJ+QyaRsz1pejMAH3jun725IRzsNAuxVHuosiTllIlmqS0Lao7kAMz9rXGHt408SpnzLLMq9MfjVKacTRn+73CfLKypFzmVBPyVI/hGbPv/fyKr0TUuP2WPO4fafoZsqn4zDhvUcfE/BvPY2H1aOyYM+wlUTfWqMGYg8fxsv8AAAD//3SdXXLbMAyE+aP4Pn3vbXqRXru2RHVE7AeATOuXeFI39pgkCCywu/3Hr5+/4a7mC4T4e6rQzRf9NYYLX3Xno3xXSpxJRPqAKG8vH/g04TYf6+9Y4FziOgT/9Hk+/SAnz+UVnC8FHrO8as5be0kpFC7mkYs1/TykC/BS8L6kzMoByZcHvuRwFbPHI5eucfxtAmICFJ8YGffgAdIpJccqv9OhYonXToT8tte4tkFfO1hVmxFefk6ACF68bxdSXLeicv184aFZcDTYpxMSlcML+d4WwIb3nTx/FZQ9c9pRgVeXLBd3eX/k1aquLzA8GayteOSuQsdNAM0S8bc4e3CcsYDBtghlfroZ8E5v8aJrWydfIkDki8mCN3614Xt9ecLRNSkCSkmCcJdIrHnsvE8/Pz5lIF6UEmbjykmxXNwfAJopJlfX0bAhBdvphPCm62Jr5RNA7s0tHYjDLm9H55lOqFG4FwfWIiHOoKGjmIhC6rJmigSEFDX/GStSR29fg1kUiLda7tUikdedEqO8U1eg0kkRANBVBNdkl8IkkX/HihN8N/z+NUWHhqPKjCBfbgfXlECk4NziknyKcJwzcpyj4C8U0ek12OdYrD4drLsyRUnr9z5PLzr6cfh6UlHUbbIg9mBTV3wdUSXOzr0uay5AiQywxkJsycbGi/XT/R9dg/x61g4gsrZIXPIZ+UKFuPdvAIDHGG2BF2rxPm1D4vXxO4w1z4DCUiynhDk642tcpbdYxEGs6OvUtVtliV/38c9RYs+V7XtChJMJDwrhmmO6r7U9sur+TLAEQIdOzO1rhmgvnUHi5pClmyk6r7GwbOvbfBrw4/++nOfNoi8DfBkoyuvHeHlNXNgisKGrUzSdE6ZnudHint8/lLhTHuZDgm/EH/72uSXZs/GhmHTIa3okTSP4nM97PIUJopFwXedac4/q7uf8YBO4CrkFPcNC5koJwu6WKQDcQpa8y/9Glb5jc3CKn89rHsDBNC1Cud91APRejzgVHbXDNWyg1c7AiQAAIABJREFUwPXZ4CibwOuVz8GNeKtNvf3RuSxOaRKol/6P6x8pOuzgClFjAv69Oe0sCx/XGiJybjWps2XaMl1aMDRKiuL25U0ZA6BzHF4tprXp7CxeMVFYpT7ue7jjzpNckGrY3LKnKf45azcixtXU9IsEoGuaunryw2uYsCLARZ2K8xLElRAhqt9D4spDrkoVbR81+S412jr6RsqHJy2kmIMWoAX2Zhmher5bqIJfAg5sSjI6tRQiU9fD1fWtYMNRCBABoKVQPGrKwsfZr7Aar+ne7+TU41rOxv44WvPijN3lII6+O3M5GM7vdw0Op7fKspupY2mPGZBuz5uoidDo6MoXjcazH/IZnmDunOiV4vwZE9RE9XCoDN2K/HDry2c67ZlC3mNF6l7f4/72Hb0/aYL3Hw2BKUqYgBCEALlTep4y8ylC3Q26xwFzZkxcGjXrnWDF8qXmVQvQqcdzz6sSSDcSeM3ULNaX6FvYWUWLRZ9Xgnu5IWPgo51ly0FyKNidJzSlxV4CdHQLVfssPs0u9yvyxJiu1v7X/TTXQ+D2TmtZ65LnrAVdJe4VTcaVWv4ydoXrbYMwEGOnW9Pk/Z80WevEeJ+kO0ngNhu/unbdYgNCOu5Oy6IH4yfojc3psEu1QE7dIjUxckDcbrfyYL/+t8XpU+PikYcWip8EDStA3qwtA2jBBcjGBnRHdQ+4UVcwIBX/fDhD/y1pI9VFeoGzuF/Rg5xfj8k8b4onL0qaG/OQFlXxueChM2yItSxthlGDFFw9BYMaZdOhxGGZKUijJrqiB2utIWUgMCAfxgLtApnEUVNUQX8PozQmVc2fkbfWpqWk50Aq3j0JCx2OGX381qC1jDeijf4QuBnYYk5ZONK1nQFGiqSx1dMJhy91/GMf5jHBzp978j7OVrz6pkvvN5tbEsVXP4OVZow1Eh4JLmuggLJeZf3WATDhiCIgnnfbQnuviQX2xgb0dFPksLgLs6KCqY3RmAgH+GTz8vVl7/j9fAaCL0n4jqYm8+EAUMRc+zKf/KDkGtHb7nnyNp8MKGaqZx2idxTW6x4t0giGNS14zfVZmRSSnJ5oUkMn4d4joSDZ49zkPsAHwEOSqvT9oAcmCcwzrXVopjqgpgYQwTaXZiCJPrrpNozz+QASz/YteSx4nwV7nVRa3aNgsxCJlnfCZ1+Wfh2+0tZmBkMpUXAwsXe2hSbhb753NNGYZj9QNP4IaAoZj+nYCDLMXrBW6DtzQRussB4oXAA+kTKc2+Ao4+DQ5rO5hk6fZ9R8NqMJLsnd/KcxxitLnMab8+oa4wfAj/ze81kit+/0dTl5i8nqmk+VwgwUuzz4nmjsmVvI/u/oQBeYvz6whqxNWNzIm+P66zGew/tA4d6Tk/EM1+uSzooMktF0TbSlBF4agC1Kf/ou36Fo8/WtxnSrggAPyhQSoO6tzNQwNIrHMsSDV9/j35U84PHI+09i8bud61tLXkdI5GWvpNaHdks6sIsO27RZvN3BgIFnhqy5y8dFO9IU7H0Wfvp/Is+Q7hDSJztfRtgeIuA+9ft97rW47UBjPoJmE9hemqzDhK+BpcBYRSagFj+t+s/6udy1009+n+MgE2cEw/yzVGOR2b8X2vkNAAij63hObyk/5O3hRq0z1+K+e+N4anPjnT4P06cXS7tp+wtNOWt41vCG9sn2bG1PYFqNS480H+xURG2zM5PcbKz3YGD7SjcKpKQV54wW8PvkvgO8kW1g+vBc5XpRZt72dJq9PI+wqYQJoOsfc6O/jU4MAlSdz2c746GXvl4vEReqeQBoSzIFz8DWAnOM0lvWDBPc9HWNrJ9WXLVmcXSey+Vy9fbLzS/OzCl+7M3+arDY8Zt2MB2ZL0ee0bc7q/Ax+UnzXrPB+eAtIl/zPNF9AxNMu72dzZXAWasAi+cEGiXj5xMKvPGMID2e7z/HabKBC5jBWzIGNd+yAKC+85C6XD7K/f4HraERt1vKswGO8fd/LZZPNBaNpPIDuGzDfGXJxneDPi9drK7BfJRuBvf7zS9MKPViW8txPJ89Y+SEeFYQi5WZjnKnKRDVX25Qy19dzpBbchpYyDnQORUPGvyZNZx4cehFXALouS7zsHPEvhPxrF9bnEfNnSHXJJvE3u+/PapyXp8Zw/Iz5hEWy4155nG6lPIXAAD//2xdW3LcMAyTZMfbXqnfPU4P0VOnycZrdUgAJOXWf5vMrB1HEh8Age3Hr5+/0yv6FZ3LjXP16g6L0vP+/u7FR6NybKK7I+hNunzRHBBhk/jLvctlDACzg1NyhiQ+C/y9IDTbMj9xBaVDQdiRMdLZgqrWOEMhsb8yw9Y5QzM8afyIf1btlFQF1OzKSM0cCVCovkfBkeqwln9Fp4f+jbVDNAplWs8lqgs21/kP7bhe3hUkQqhZtvy+pOsJoV66Uzwg1UEHfW9fOq85A5eoJ64UuuutL4u/emrC5US0RxyGmn+fBd2VJ/7SZLglffMShRaFrtsGvTDPl/6r6aft7IOeyYWCrDe26Lmpw0gBz1kj/Ixm1dXaTRVYNnOxZvlZnWy9n06bkYPOFR88qGI+0MWIXoGC3De2LlG9RCXHHLA6e3vevwgBmSWOe+/6HOpBL+/JAvVB1kkWvpb4NN/ff7yL32YGou+Pb+3r86u92T5rdlipiNCMfCnyKdJzSTG6HJBC22uBmxoAmdy4ei2ZGv0W0AMZkuvFDRVe1osH0VlQTXS0XcBlaM20nEctnd2dc4D1gI6mjPaCd8UvL2xqohcd9vJ53Ap+EzabTRT3EarU9l0HHSCadCIcRYDtEQQBJ+3knhxxGBhTKYJuU2uG40ZAC/b1PRIBRTNqDQ72M+yvTPqVmNvva8PurA2TRakZ+0CF3c4AWs8fT8rdg/1IhKDug7Z29KEIjOe0ZuwdkWgsbOWT+78OunzUB5vMotNBRwXCiRhp4EgCrW5dLLOwGPRudurG6NmjqTWJMCzjQ7DW83PqeRIV7m3vQHXdt97W2zUDoWhEofGdmaQId0skIRPIeP/ybq5JAXUO+tJkSqp3bQjb+7P47MrfZBddZMKBTdbKuBZnXgvt9fnxGWNGYA+sRfssTDoIHSb6KKYKRAChl2I33HrOpQot9NlMKllfdBHALOoW5/TF+U8Xaz0hkAQrKuYspPZageR+y7Jgn0gcpXOCh5ewnXIZFPLL6HrPM68xCbTGs5pNQ/PW1DQSUqN1JC2eqmGCIgAN18Eiqo5hKZFFAj2c4eF05TObkTof/Bye2JsbbeUWCqvDkuXP4ciSCzPT3s1sZPfHEWMPdp67kLPvK7JMwkZxx/0cAaaw7iDzpIHNJFeOOCNKUit9oxDsozWsnwVEmYV8+4hTh01qFMtFpT/Wd8vcylXqz3R5cgaJ6yXt8T+7I27mctRHj5ltxXYVdH5PUsKRh7LgogaP4lxjMwGMPLzvdHzBXn1x1G9GwtAjnnrzkXoAEpC2te/3vzJPAQKbBX0j40Ajfkh5k5E3O/xTTIxXdH0b67CRg1ZZn7HuL//d0+3lUGDNK+O6o+P7W1hVpxD3FQAZmiQsmkrTV8X4FvoNsOUVolvPFYFTZo+6M96LiReAgt33lfRu1QeRI9MeW3WFGmujNMilFq9opUaHsY3kgiHmq2JszP+TzfuiHpbyF2dBk40RrhBzLvExz3jGnMURrDaKkXu4feIsul1yLBAoSSFciSdrv18UqxTwUOOznBlCDLGyb8rITb36TedHekyD446H281ivK23FQRzx6ZgrFWWclXYPwnoakRizbu2Ei8A2uWZCH0g/Fz1jepGxRk4YKR+kNxSFDPv719sT+0/vRt7DtduC8vX1F9YAFmOswuMwfrEnhKQ42c+4yE04iqTDiwQAVAa/fWrtfYXAAD//3RdW3LcOAwEIUr2HGi/9zh7jVw7GoncQncD1DiVj1Sl4tjWiCSIRz+2f/7791dBt+4l6NDku1riS/JIDJ6UpSduiGBoqh6d4j/ImAgcJ3lgnVZ66BZVgakHHHm5K/lI6w51oHKRf8LQryv9IK9KovPlNkEP+xeDYIi5AQY+bvGnBrqk0BSI7ljAfMTlin8bloF3CrJp9v1iBy0vXfCm0e1d9hkm4aJb0OPweozPAahn+E5vTbxV/qH38VidRVkjxfef8hW9FfBxucQCK0hS7NBxsQa3xCthVKE+Hz7NllAyFgO4MJrJOzs1FjZ40nKKcmCtz/dvTXRVAJG1g8+MQN0blNTjc2JmXJ6VA38P32x6UA5xgnb5yN4KTiY7njWtcv+kAzx5kYkuSF4Wb0sW3unbHHs1O3jDPi9aNJj6gsKb087kVJMq30+Th6xJRIp2RFOw2FGc1mYraERy67L8m7ILG1LSp1ezYEfNpLSbz28qmKdEVfbSHEguG0precXGI0WihfCv5GXKsxcQuoAHYS03G252NybOkdQex8s6GgAb4GmgvkitNb6eXcj4+VDdj/ULLrvv8Uvhqz1HeMcfVCBtN2HiwfMFDKup6OEljL1g8jCVpymzIOUhj/thKQ7z2Y+HiGcFLCF6CgbeUlTRxD9etAVcvnuvxCneeRQzKRKVTcWExD6pHuuydRUt/Nmwzfvw/GYSXzQEX8Z3hJyKVzeZOONrPu12xsEoyuMM71Caj3i6mzOTZmG4tXLs2L+o3RBd84mExpff8sN/Gc8n2eQocG6Jx6XHNuK3fJbNNcNNOKKaBhDPvHieVzhvVRSnjzCOiUR8Ig7wx8uL3qUXUFw77lvsMQlshqp9enJf71NNOsEs3ZZ/ufMyxZ42cueRFP5lJL4SJDVj9GO+jh2/M9A37HEK6p6xMcT25NGLiXIghgLl1g+dD/IC6UFOrRTaejUJTjKpNnk4452m97Mv3/jNspHF79kGLfdYCDcb7nWGBOZWAE9fYMMkWqFBEfmTM8skdqsmxiV0j6vhQyjwXHsGz+4P00RSCKagi6lgX6KlP0Su5ljnOZNw8K0FZx0JaXZhV+MO1gQm3lHuTzS0Jvmbw8MF4M2JqKXAUTxrL4G+LNQvFDhenuqmd2cpzgdLX8YxlJmjjCZtxGdq094IGtrTjf7p41GELxqT9uccBXE3W3olvZqRq3jOhDCfGeVpW4lwagXkeVON9/HnnfxhnUUm92dNZiGOp8QXz/XwIMdUDw0Evucuu2CXndyt+3DlC02Q8C43CxXu7xuTQsSQo0PbY+j+iSuty94N6v7tUHNLcHw0bZOb2+ESABSCsbHDuKRmEqMK3nM0h3De44xp8pqagENq/0MiuyjrZUEb+/1Mr/0pzQS9EzTz1JhC0x9DlJUg78q1TOsVRSt88XfCqTsg+FM6MO3jHLGhMYXA4EImNSXtg+NeQc6kNQbv//tbRRGbQlvzyj/ISzad/6nGO1FQFO8cyD+YMnT57Q/eK9CO4LuPAcBbE9/0SD/PizlkI/3O5Rc+4x3IOx12eIEqiwl3dzuBPNi4ZpOqQ+gJxIvvin8PYj3ujM3rjplCqdziglvLfap9iHjBdcW+kyAxeO3HN5skB3Nr5FiTxSh0UjbmrONusotlnviMbRVVH0OxXtoU5L/P9JaX1kQWn6YC2EX9MyG3mMPzLONuADUjEV1vDkRMHvD3VZanAnhgnUHz0R484OqxVVPsp1g08grzj/OV1nZo1jm/kmjqlzQImhAJbMS49MXYeHENfIGWjGaxdCQyF46mi8ltihogzCU25WKtLiSKdZa46FiOB0t8cVvc96JxLivyHCB4il0Lyk7hddaCoalFStVdw2uX/kK4M+Vwp1eel3Z/a3jHPCbWmZSHWJ9yqYkYFGxU6OKhTc08JR4p3F0CBaqhnJaRSLnINZXrZp6ZOmQ5KE5Lx9KQizV6vaqWRV6B/8d3iyaqzhTiSA8qYbxDPk+IDkK/SbobXXUq96wsnpnCWWtm/wMAAP//bF3RjiM3DJPtSRbt9/S5f9P/6FcXm4zHLiSTkjxJDovdu+Q2wdgaSxRFtr/++ftfQRfjOHaFwQIKWk+WJkTK1qKuUDJqOm6WRCSne3+G0F9GWwQIW0VykOc3JPndSqKkNohilNQFjOwjRArZGaAirKF4r/c250YEnBQsSR6hnA8roJgTHSuYS7o6lOWTxya7fFo4E8n0bgOosg3q+TlBWyDBAcGtZLO4KhArkuhMkD8rEcoqeS56bt8L0CQifoEKYR7QylTMjmOmXm9i1+aRP1whNDMAsg0HacAXkKgtEReI/KHg/TGacnSeOUNOunRNFoxbdShht8XgZRDw4eBVmitjx4rqqt7FdTGXAs/6QKJDPGPdKLMwkga/zT1ZUB3wur7gE31stLMDYxt8FIjmEdmkt38tMf855y6i5EgiDihjx7CjjGTcTjEqV3O2G9nj8GNOi74q5+9poI9trA4O4TnkkMNsr+pV7HX2d/2aD6PZK6jSTz2YH3boT2aoZaAIK+KpW7byKSGKeQ/ZFdtt27fuCYu4azdqBNHwXIAwFtjV5eG8hKmemNWqjlhX19TYZ7i+P8oWVp6w36mu7JYwmatM4HEw60GHJMSSJgAHcq4Y1Gt4vU55ajE4l3bKQwsWTZJPkaEA7Khmq3adS7xqWUxWWy/r/g/xLrBajFnnARWX08cpSMhO9aduX+y94gzbj+fEKfUB0IwbFTAj2t8pwpoEdmddsEt2Z0Td/18wGOZXAODOQBAJwJXAxRuiWXpgaqFfMKPdAbxYITkLwJ9mINj7t9uYjVKmH9LkmAuwsWtrSXBDbFnfUS4r8vWLXYUKIGJ1Jm2/OHusACTTlw0HIir+fG7Cu0PDerbeXA+CsRQd9w5L3eWCE12l5iNyaRRACBxHgkKw9h4DO5i3f455u5s37P8q0MTh76c4pF7POhZTxvWE1A7qZda0BtbNZnGlq6Gg5GW1ySFyNVuLNg/5qT9Sr2rP67+NrveQNbZlA0a0gFMhVHxKKyLR7Q720loDs030ufTUYQLgVj46cHEW37eqvRuKCosR0+jpwSRJ9px5jTMzjtogFRozte46QPc1svzEz/D+MUKQY87yNlwPAUBAsa7rtYrqdx8ouJs820Nev6dC4msfnlOaWpvptdd7ucWOtXYV/ZPZL9NQ0RrYbJbfyh54yBrCbN59LgRW9Py0QmoYEFLTWfp9zy1moZ6Z1Mwpt+5pFi2bM9gtE0KiyjIKpt2anxcIU8IXclOxFzYPsGCcp6+1+lbJrBsczf7Zg1EYjAv+PHBPiDOoesd/AUjojF/43RdcumY1Zsf7v5cM3SO9yNSCf1apl8if7Q9bl/ke8tQzZWhOpwWt2IjZBFpPUKO0ADg0Bm3/zrROeo5Dm6mCL5XF8HyfGVBWN/2HPHJlhbIzklcO6jaTM6xUQ78lz1gLqOTh795hD6xr+DL9i2KAMMcnBA2GwfuihB4KWTZ5ht6YQTj/rIEiS9eFY7wn2IZjzGD4uRL909ZNWWC8ObIu8jHs5BiV9xcfvN6FehyJ4eOvgYpoiJ4HpZx6Iqy9+DNZcgY+wCP/BMA4OaaC98yejd/ev2M0mYwsgXOLayVB+62ibgzntybEccmg2OoaH9mKc4jvexhj54HxvI4Yn87UCyHCiLMsJBtsWn3dYr5FsxnaQNRPgE7O5pADoGMxnOB2lcRKqS8TOm7r3sD4Xxai1AaBC4VrQAXzejEyY4yV6xvaOWrjvOpUq0Owt+hkV0uR/wEAAP//pF3ZbtswEFxSh480b/3/n6yDIhaPYo9ZrmTHMFD2oWljyRLPPWZn5t67E44AIg2iO7wQR3G0xnXymm2VHWoS9cnIgNVw2PmEA1RBidkUmnUwHMIEivARoATG7yOx1oBg5gAr5mt+fX7Q7etL60Dr3Wt4wCQJoheVyNIOijIqxVjpq9UOxslMxxpUop3Ty44FamLud43Ic9SNgiYmnhN/N4OrAgIdPxMPtegYAgJFBhWkg2Hg90mv62qheYoa09mIafAsHL2MTernBWKvmQcAr7pLjh1ISJyYjB3dRrfbzWuZ5iAdBvjjcT6gjEP7uXuggmyhCYgeJEXhetUPHQurH0oLIAfYe/XPCnGUZbngzCR6PlfRVJO12kFUxZhUQhvV++bn3dX0+AF2gHs6rHiMfRw3wIqbEQI1q+2sVvAEOS6O3Ov/afbunM9iABCcxDVJBFf74E6f6ye1ZjVfVesDnfiQ/xStk/2eG21Toy8mVXSnn5xbgpChS+NZOfufDp95UlQ7fiPw3lA31sqONDQ2V/MIpDyPTnl2+c24l/F4Xy5X4/z4ucYKm3ts05O962jct9AH6PuSyJzBLhmxNasTeae/KnvGexAbDt30q+VQWanXTKuNr2jQcyYqrXTnddkW15iX70qKMpFAHntDjHYh1YblAMIMfXLeqjlIHzPk3kePNYo/NRjSgyRr3ukHS0Cmk7PrxszJIHg1lmpeM8vIcNBhP3u3HeeBYBpSG/rSfFZMWoJBEjACLJa7ZjLE0nDWT+uVVj4PZVxZI7PIuGUpp+FssWDl6MzBXg4Mcu2rwdXZJCyW5ZVQXNsM9bLpvRjpZs8m2ctu9eWChmu6/tJeDefV0IiRdVp3/8beSk/2lKf36MaJE8aAsxyTlRrFsX3VUJ7zrC6VLJA3kRr8PWv2sMu763zGjpGzkZq2WazByzTTOZ8kGNa2Suf5Sks2I35SVReUTYrN0YxwbkoO6/9mA42zbzweqThKKUGT2h65GEILjpjt4Bp0cHWA/fvhzBr9Y8782zP4/xqc+mcBSkEMhZrSHjgx4vij6ZrRIAwZYqVawLoa0kocv5Zo7rPsL79PKy0c1K2b8CFMLnPaPNiKZA6jmMqddJ3kE21ropLSgKjzXOQV1A1RKO+XBGWmyjyTwNJfNbyjlIXktusbSR4AKlwhpWjB5J4f4P50sOEIuvRpv4f2kOh6d+/qTsxFnsWU97U+Kz6DgnSqoFb0x0aKttO+y3aG8Hq50nla9LxmW4Rlxdos/S6uecl0uSxU0kyVk32bjgd/vQAl+ZiRonHNhLZUaW4LLbyvMiIwI8mANWv2jAl+/ITQetWA1syGmIKENRIrnCG9/bkpOR9Vt+FFSvL7vruzqBtYYu2oqR8bgnA6TxXtImMShs+DFJQ9009pKOe8M9awP1C6AvWz+B2bBSpK3fOhyDOGvQTk7SnwibQg1YcgV7Ok6LNnbFZyTEbqSG4fdzpxQFL203Et/CRBdBtKNp4xxyb+5bZJJr4YP1YR5EN5sJtcKcDJvve1sSD8Yx/y43r14ByXW+zVv4aaBDjPWghOACkwEoGj/8BtpKWWcoVcj8+DJ8WTlHwvRnTaHnPkAdB9btwj7r/wGWAPRR+Iefk0gaz8bkq6a+oxYeyQ2ERShPtk4QA5rweep7OhmZjbRCR1w35JRP8AAAD//5RdiXLbOAx9JCXLZ+y2//99nbbbZOtDsi1S3MFF0U66M2Em45yyRZMg8PDw0GTNolFg3xBVfowPCGUTrEZSNmUcYlkw/DilonDu1HEwhEay7V5bCSa5KZtAcw6qINqr6qj1a2dKW2jftfip9zG9UbudiIyYGILV67LzH2ZhPqauqKNK1+bJatoi2uGsTjzJ6+F6uLqvr2brLatri8GU7m2RWTsYWphZa1XxF0eWhVXGOxuz8T7XtLLRS9pZvSD2c4bdsv9ejdGzgJY9lYnH1awMmPPOVGO5DxEtCmWTcX3qU4sn+n8SMGI0NHgsmxX621BQW0ZP4yww6PwsymSZQhM1MZCEa0mLAFvVi1SDi1Tq9gz4mA9g22z2PkxcGynZraggBR1eFGA9H9w2H0k3XW2QaS1Zv9vgZuOes/WgHRXJixwEBEaVWxVSSXoPvtCduPmZXkME+WT91cAAagR1yo8xczXEgMW5lMZEFs27YhEhz1nkNnkcFjs0U8M/o2B0uiV22Kg293rJuAy/cL9cMQxXeX+HQeuxWqYb7VcHpgy7VYPQNTisl4heApTImUqPFOTr5JOSdIWw6/IHN/GwB947WCwqaA6bGbgaBCvOm9kovZIxhqrBDp3uTzLE1OKwv/TFqDpFQacPsszPc/6ZIHQevvqcEOhtjR6db7GdFvzYhC1nKIfjGX/eTvj98xf68xn/vr5iOA6YriLsRGt8vd3i8PULdoc9NvsDlzc1izUDPuQoRpdw9yMDNQQw5CbDsfgZ6V3chK1jAAWsTPnzockj0j87HGyfpsoZTsaomtcBgXXSDjUp6CwOVD/0JSvgNbtQA6B1HXX9GurxDgRih1jWIu2VSA4zZRQ0gKEPKl1zyXGmsk3AZrFGS/tlatBQkEk1wfcR/fmC058jXn/8ZhBgvN5w4z0jwm6rlw269Rrrlz267RrdZsWHftc1yEyHTfzc0Y1ITH1OSt/12jFbwT2gMP0BSzJK1t/9XY9Q7tsLAP1/a5V+J7o8wmByypTJFXMJlb1F6eHttaOG2mM9d1DZ+vp7fCB2+zxYgI8cQTqTlME0KT2VAzUCwSiAp+CS2BaTx2p5QJMaxGvE2N9xfj1huEWcL2cMLHZVs2ACi2CR/V9tN2hXSyQvrcHWyy18B/T3E6KPiGTDsgY6zu7TRLZmqgwvb21/R9mherCejgWBmgwJzeN8pvx4pjLVdMoabM5CpMXmfCBcVg87r2ZtHNuTQbsSxYf1ILpK1mbYPQT8eNpXnBFn0EQZY2jQugZ5SNiFNfLg0JGzmYTOTY9v339iiHcM5x6X0wnHt5NcC5KZ2u/37OtsNht0qyXT+f1iwe2OG8rGdguMXksvCJihANNFDrX5zCHdD2YRCtjTPAV1s/gwtC0cypnLDAliLVbnEjM68hxcWxckztipoJ+dD+YjsjgwCWe3so986fIwd2KxweeYe58Z/WhYOYeBFJxVtOs42S+WKBCccIKU+GfQFIXksA0btKnhs57sWR4n5FtEfzzhcjzhn+8/4GJme0aCx7FPaIkmveyw+3pA97Llx+23LwgLz4AinS+3IAmYapxRAAAgAElEQVQAul5QQxQ4AeOKEB2KJZtJV58dk4IfOc7BWbH5qotCc8+tD9mnq9ZvQKmnFnam+HzWlcD2oJR1qfj0OPdxD35mGdieMeE764NvdjIUXSjgNt4eNFisExS3ONX1QNfhrhslGaVgfOW3F+aoMgBMvJzXQt0asRaV86qxYMwpFZItv8tzj3wLYC24ZRFHTBWAr2W0GiPQPMW7tIeuwVzpFmXMtcfWzA/6M3rec5m1dZjyU4l1bIigeihaDjzX6uOy36QKkwyIaDB86Xv2FTmhqx2O6L5YiJtYFpqRNx0gmgf6uWiSZG0jOAtGW9xRCxqasKS9PmGVip21/czA11MCmb4niIzBhEmT6+bPqhijJIjvnIgigMBpnEafFGNtNmtJwJJdZ40zBcR03bCvowC0xRCmQ2UsAi5/uspzcCxcCWLz3+WM/+i61q42biB6d71vYgIUnPAKSaA9aT/0f/VH9B/2e54NIcEJySG8wpq1tavtmZFG0jpUX+AYsBdpRpoZ3bk3+uufv3thifYJduwqLZTAC7GFg1REHm7bzGpUVWmMITKybs5oR+YGWRJQTgQDR2SDaj35hrx/YvXS6Z9IrTPA9tVFtj9VJEbCWw0h15Dig+EWsBC5UTxgNxWHXQ6WRAIIcuPe+00iEQKG4NAMk0MEkHT3DIG0hWwEAh8HH07KGIQ2iajMnThBkifOucLbdQdL17EzOgn+wpvuftQP2NFDYkU2ij528xoennBVUQ+Xue9GTqqPQmTink+qeXpIOmgkVXrbw9PaG6/g82w11axPyzYocB+ZX1l37jG1rQUGXeLl0SDMqLGHjXFfOR3ed41vNYGH73SWRIPmRdo3kigZIEjmtHZxPChkCcu+KTgNndGxcsqtuIXgipxWaBuxJV9ju8+MdFYYMBqfNEUrthXLxkCBFG2IlE1lUYqHaYGiBZJboGhK1N9qnB6f4OTNMS7OLnA+/YqzT1MOlps7IQrhdkxYmWA3EnOZg9W1DFs729g+3MezF4fYPNjGxs4WVN5BlT2aRKMljqPc3q52ys5vNzik46UELVSsEDTKYPT36/c6uZjY6/pHlqhGyB15XWyymdrWEyku0IFkkDmepVb8XoJw3muUh+jed4NKB+DCVrYXlkchTsRmSsxvG4yLCkmsUY5S5G0Mfd2i+dbg9OVHfH49xb+v3uLTyUc0tQLmrn5i4HIEN418HaE1baUg8yvGJXb3nmL38ADP/jzC1vMdxJsZ2kJjnnXoU4MimNU1ojw1KOWgSELoF44c7YEithraZLR0wyaEsRAS2Mgc6NzGRG08nW+rEkm1wX5kfy7JCpOcBklPt3wjqVoX5LhnCrkaltcjsBUq/xT5CHdqAZ2muKNiZL7CSXt7NwcWGuOswni0YtblRmH+9Qemr05w/uEz3r86xvXFNa4vb3Bz0fyEY6dPSiyKV1s0JNMmrADrW79gbbKJ/aOnmDzZxuTpY+QbJdKNEl0ZQaU9F82qKuf9SGmFKDV9q+IvJrFIAvZreF+KfMJo5lZgup0r4va9Txhof1KBdKiMLEld+9Vo6XaBYauWtye1fBxDJRHP/n0fIuA+hvpwGAlY4y8RFaG7jovhJfVOzhSqUYYqztHXHebXDaZvTnEzvcKn1yf48PKEf+fq/ALtXKNfmAQAvc/XzcTA81jEwNruBDv7e/jtj9/x6OAxkrUY1WQV6eYYixyIH2SoFzPm2dBasRqSasmXU/4KLg60Fio8TPbCufB2uGTPnR4G4EpZxJ3XgBf1JY6JerizCQFEfxQQ3/qCnN9Pw9dDn5Bif9sqpxEu6gwES67rW1TVCvtns+igR0ZjnhJKQl5UyJE3gPp+i/a8wde3X3Dx5Rzv373j4tjN+SW6OdA2Zjnkk+URwlo1jdXVDHGRYOdgF3u/Psfui2fIttaw8mgd8cMKC/IT5hdq0VIQH2vM5recnLJ9LqkkCAGe+T6yDO9+DcKEL1yzcK5oPUSqU9QGKB6QBC5MolLbBigjvIXsLQFfv3SGy1nFCQWG++vyfpZa6WYUKcPNic+ANNLVj9oUXUiWNSqQqhHiWiOtI9x9q3H2dorTN8e4nJ7h9uoaV5c1vx8dy304JRqDIkM5TpGVBTYnW1ibrGPvaB8be5sYP9lGvF5CPUjQVwnTN9B6mMR2hoWmwgzZ5MLwRf1v8r+kUmRjJVH0kv+fYddKIWdiWeNnIhXeWylB2D0eouhgdf9h42Mmd9SRa22KbIFF9jougPatI1ETdGvXeiJb1lmytiC3vj7BjjCzCmpyzol9uQvLQH44TCLZ95lYNXdFI4ltw2HIHa1mvkP8Jv42WPvilEFZJwO1MaWaQewTWflPkZ8cEf+V2LLNuyTGFA4DUVCS/UV+n3wkSwu3btKOJBLbBk3rb727UAbTjg4+KTWkhJ0laTVxNhVIWyajN+sgz4WAIX/Y029sw+SzFIP0A5Um4OfCNNsZScgLeiB4XrJXU5zwag6y9kwISSjbsuAznAmRiUjc2iCNeWvUssz8erUUKSTJEOQQvVco5yxtEW6+bEwlf0N+GBas5HVXLOJWRjMnsufRe5Bfaa3xHwAAAP//lF39bxw1EH3r3b3b3CW5fDSUplFbUCulqK0KQiAk/n4oEghKaSANCqSkJKEhUeh97u160Xg8ttcXfuB+yemy2azP9njmzZs3BgCoLG1MUB5DU5lLX2x+GEIk6OGvrq5YpMu1ZmFkgVtm+VoET7NqOKCiCdGL7a8S7SlzC1Qq2UCBEqiKrmmhTbJBAkeGDGzrfkENafhqovIDCKW1gaNpIDg4/LOGGdx2XbospPhQ1roOFnvuakYEGWotAOWVa69zeOn8kIBaFl7Y2koCYLo/tSmin6LlQEazyAqnmM10du/UJEmy0GYkVqnUkfMnwISAFZRdayL6vTPexkmV1jPKtYeJW8iF4EQSlDeIsZDrSlvXLcE7/Z4OKRH9o7FTsCIHOX1e1r4kxWxoq0FglOhJNC/1Lf0Mq2POB5WIPEmmsrJ1XzqR9eVrbYBWqZTL1lwHALj3QfvA1noL9omZV12h1+2j22RYonrXcYXqYoTh6QXe7L3GwbOfcXZ4htPjK5DZyCgLXRvtPr6HFdUKAwMxRjYH5nxqepV05nSAbLWPze0tfPT5E9zevYv+zgaS1S6a5RR1VpuoVRs6b+XWMI8xWr+JjgKFqF1KBACE/fLtHVu3c7X/ArCI4xnQz2FRbAZxPLDlyj4CAEBZET0BMcOShNr0/y5QNbVT1KXMsPS0LdIu1tJVrHWWMHn3DudHJzj55TfsffMTXjz7FfgHUOQozxl8oa2QWuHtjLQ/Gg4wUxu8UH30bO4hFUrE0G6ljJkmDHYlx/3PdrH76SNsP9hBPiiwvD5AvryEy2qKka6QdFLfFJQyJKr8XwCAgFcQZzr1gImyfef9QcMotBxQBlybTIMuL3MTWIlDcW0QqX3/cgGqw768C9dHDBP6HkmoaUj7k/QT6F9Na/STLm70NlBdlvjr8BiHL/ax/90ejl8eoroEujTsGZArqc/kZGxqgxll5ye1X5W2WgozZhNzNj83/wp1B1i92cNg5z08/vIT3Nq9g9X3N5Gv9dBkGjMCYUzpOgvF0n6RwESlaNEuHTqUhF68crRp+tyoiRNLKeXzK2yRiijYITqrlP7FbJgQqJfAFIGdMmVDctYF1MJWG60IBBC72dj6ciOiplkLhJwVVSps9AZoxnOUfw9x/voEB8/38cPX3+P86IL3zAzISp6LlKXkXKlWY62VP8vtWrRlORTM6pQFG+dphfWddWO/7j99hPV7t9DZXEZ/a4CkyBjMzGqU9cTMt1Gpp/moOStWm7Ojbc9UE49/8fctP0W3W1MKEODa3+nGsWV0AORLaRMgnX/ambj/euXmubUD6EQPCRa0l7NRbN9sWmOlGKCLDM2wwvx8jD9f/Y6Db/dw9PwA07djpFOL92reEzR8ZUuZlEUuWaBMWCU++uQkDUCajyiAWQ50Ngp88Pgh7n38EHef7ALLBborS5hgiirXmBPzrNtgNB2hk6kFEMr7ak0LAAhpwHKdCkqZ5NyeW6HnxHYSEkacULezNHMAAa3/xs6R3D88r+LjTso45XtGxOqJ544yvwRGTYyYdorJaIx+2kGH2EpJgWacQA8rnB2d4vTVH3j51Y8YvrnE6G2NZbJRmun4ypUZ+araqMKWz4Vc2Uwtv5+QH9cDBnduYv3DbTz44inWbm9hsH0DailD0iUbV6IkhpO1XzWYOavgSwUX595+DuXKSRHYb2kZmEk3pyBgkniB/St7dgdBUKi9pBrve3MCbO5o940RtFOuBDos3ZC/If+Qy4Y9wyZsk60D7TABd8I9mDS+9I3WD8VR4v9yXGEFdy0tXdjK4XpQtkON6LZwq0oGbZMGLviPz2/zDIluabsQK9noIqmU3xddEzuILy1t4zgR6hnQwsh08yZAVuLteeg/ipYC2T+6j5QAhElCc621WyLczsk3ZoHmRmCXn0vsXRp0fIjbggs7W8RQE8tc8gzpRY0iR70PkqAyPk7uTdzfx8CBYZgSg9DOPcXMNMZ+r+9YR7OS11Z8bxlv2BFLYh6aa+6K1jYOMn5JYpn1qNolfuH6lfXPcbxl0ct3RdcC+BcAAP//rF1bb9xEGD1je72XJGSVJiohpCitCC2CBNSnvvBz+BP8K554bSkVQqK3gIpQw6oV5SEoYmnS7MXeMfpu9ow3hRf2JUo2e7E9M57vfOfivvzhqypTd0/T/hs1vtJceENAWeusAIEVZJ4RMzFKsBNZU7oVQGAquGZHt0+iC9HbViQR60wQF3xhtz+9pAtkJ9IKXdKVtm+MNTihrIBwQCyCPHvRQS9rJ9toS/gwimulRontbF0YJU1RJaKQCytgEdFQrCtmCLFJJNoPrx1KWkRyRUuNXcATWBGiaFFUpJB+Ts6n0fVsD7j/AgCqVvEfooE2AMMNhi3AnAjB48ZimmK9U3vSXJYnL7n7vkZfEzNjsYnELjaxxslilOi9mMJXG/j4OouUOiL0v9zZhJw3i1mibm9Ih7LvyQgiLRi1K7/mTpvmOdKSiVsvL5CX7NUsNi3MyU/SZGncpWIdjI3OCrpnFc5GJxj9+CuOHjzBy+e/Y3EGVK+BvvoP0aFmqm+EbVb1HKctmiLPbdtOawE6V6l04YSuOCOKd54iXevh6t42bt05xM4ne0g2B8i3VjDLSvi8VP1gXDyEnQAxQdFxZgaOBqZph/7t+r3476Wa7BiYVmrRbosfrW0EhImxzVzc3oPiKIxSS1WjHgIAWaeJ0mPTMBpbTFkUbTh19HLSKnf7WJ1l6J2WOLr7CN9+cw+jn1+hHAP9FMiNykdFpm7EOpDrk6p/Ax17x8nv5q3A843W08UCs0IQ4LkX08Gk53A+rZD0gJVhHzdv38LhF59hc38X1dV1nOXApCO60tSLFh1uziyAkDoYI9PLHaooF9wFhlUaD5gGPhq81qhJVVIJMGibAPmfsgZseGNdxFIdmqM0F+vP9U23A5esvzEAIAAwdSnmtKlJ++gVGYZugGxc4pcHT3H/67sY/XSMyVhAGGpu+ZkAMKnV2YEip4Om8OTPT2Jwb6YgDoM0KmEkM7MyrTAn/4YE6A272Ll+jcGArcNr6L1HRecGZigwVU26FfpEIZeYMq/MuEUEAMjxNwBAlsmG1rqYRlVdaPzWEsOraq63xag14z8Au4LX/R8AABegdJ4y0XP3fY5skmK16ODv3/7Es/uP8PjeQ7x4/oeYYBZAXilYpnOlm8ialgRCUR/BlRZlZs8pPVLXtYLkU90MU8pLH2RY2xzi+sFN7B58iK39PeTbK/BXKlQDPWYqbnzBhX+eZ8wIaBf4bY+Q9vzhgiDYqLugQ2wgbKlu9Jx04uJoT2PDWaZz3SUKjNT+jXkR3lurlultG6jPyhT9og//1xSvnhzj+OEzLvxfn8wYSPNT4B2nTCWaG4lrpCt2L4eriwRYx93WDDpGXe9LV2FGAMIgwWzuQaOw6ADruxv44GAfn965jeGNd5Fur2FcvcGEmGeYoxewUOrPqMdYITnzbtmwsr4PKaiS1HRfWX9S7ULaPLAisQ2kVeY/lKZR0+JtjzRrut20VlLCSDxe2gcjXVpiMXWpiLuYYZj10b0ocD4a48X3L/H0uyOcnpzizZgF/Og6vacsGpDS2BiudceMNOVq+mp7umIhZnrEbqK5OqHnVoH1nQ189PkBdg9u4MrH7yPZ7MMNujjzU5bSSLRxyX4DGaro+oRDk/dc88bnh9Z6k8ua3FYAC7/UPbYYODMJDuWxlYLGpRogIrinSVRaAwBQ/SJ6dvkO80BCRc/3Bn1cTCZSawTvb3vhKtDAh6+zcZIFhtI0Z20O2z7aodmrhzVNOB6sGG4zAJxKhEIAYOFjrb/3zWe2m0eWqoFgfx3Kt3i/40TC7VnLr6wYvV5i5u2ixomdV6sDjSUVvsYe/J6+Sa4J9wyc508xkZmr5bgWcWoNCGNXZ7XJowErco0NoLB6Clo3WqQnFdoc+63SHQMEwu8jMeZqUBjo9W0M0vg1g3w7B1bbcX3CBsHS9LQmLP+9lhooQFOnmzXHZcBuvD4QcCs1Kkdo6vjjuXUJAGwNTHrYdeRxS4CZc/gHAAD//3RdTW8cRRB90zPj2fVqnQQUGRMQVoLkOAgFB1lCHDhw4cDf4Efwd/gBHDgiAQqKRBRAAQciORIfRgkcEMEOeLO789GNqrqqp3ZifPHBH7vb09Vd9eq9V9kHtz8MrFlJrpNI3eGYROtovZy1CRHNGSU0bbSWi9tmkwz6lGYTi6ll0k4NDRIUgbUbXmUAnPBRR1v0PMMgaWQ+63BDKZVEdT9etGda7Eetu5EyWLTWLKAGTSvARS7mWiuu18bQzV6q1oxueCFHOUV0qSTdIlF0dRYqvc7p6SzpYSAJ7BB5s0AAAQCOxzOuJa2K7TAQQkQHoaL9pLWNxaqsoYzhKM4wEslEAoAB+LLCfpAZuFogqf6JjRaFYYCBVMIGmSZIqWsoNPwoVegTE6VAMjJsqD9MZ2FjkS4dHLr+LKNAl/ZdJ0HI2izRjLtUrHQJAODDR/wLqrJKz5npVQM0kQM+yQbK5Cmgs+yDJMY+wwqYMQQAeNRI5pLuUP9fcH03hoKWDK+ylgpDh+naCG4W8OfhEX766h5+vPkNTn6pUbXSoaQEoO27lNHIyQvuHg9RLfxXkugQpTP0uzTdg2QPteTVQbTARB2es/OtAw1HonuMuv+jrQu4sn+NOwXPbV9EmGbwVewOcMFsu7xZ9ExwltUh481SB1Tey7A4VUOyIu8BtkSrNAwAruTMhafdg9Sd9v05wFTExhZAVBw0PUJt6fMkXSKqPzNtKrSLOcauwMSX2JxcwNO/nuD7L+7gs48+wb9HHTfa6XlQR7+UDr9OBKVJKYtlF4saMfrRiYmleU1am5r2QBH7WnOazMCXa/x50yIBNiRFmAWPegq8cmMbN95/F5fe2EF7foy6iMUXj1ej7nMWO5uxo+FTZwFnJaTwKwwAH1reI5mcyQoGazKi8hktLoPIt9QwtKmXKTkIOq7N9d4MTmbXpqSmi2MEe7BYTRAF1JKuTOoK0vfWYWNtinJZIBw3OLr7ALc+/hSP7v2OcsZy/Fi0y99UzszzbaORpRb92QAAUHNBZf/Q1AAFNYmtIUOZGBDgYXZFjqcyI7seB5zf3cS1d/bw2lt7mG49Dz8pGDjrxAHflQF1V8u6C2NK4gboTSbts2JvM03wqMARzX+KE5uoCsVcGWBDGZXGpgKS1rEbAuBn6ghtmF/9a8lkFmdmQvsoWWCWVJFjQnryxzX+OXqMg8+/xv2b3+H04QkIOySzMjruc7PuTrr+8fyy9CqVdZlCYcU4wfH57BHjpkuwpIBx1G8qc2YBvHD1Crb3d7B5/RIXodXGGMWkwKyZs1yjrAQAcKsSJwUAvHbvBt1n8pPQpgCtdS65VQTx5S5rWpmF7lCaqQxB5GNA72uk8/6BZxsVMOayule9/N9Y7MW7u2QZlUOoG+Tks5CPWBnUnNR4ePAb7n/5LX6+cwh/DIyaKEnikf5ynukJ3KW4WM3zzoYjvHADHD8HLkzp/O3axFAi/4EnlHivA/m5Ei9f38Hee2/j4u5LqLbOYZYtsGgXBoCLtxbTm5nauxSTwP75xKlUPeuMvHCoAaIFv+96wFgbFrED3NPAlY6tBZiuuWUFwoBiCVQfdEljDPne8G/gZxgy8VVqAhv55UuP8rTF37/+gUcHhzi89QOOHyxZvoTEPrGyBjESDXpO+LQfNSr6yIlAGbPa8owLl5pMs6FFRocaAXN6n+S5uQ74jTW8+OaruLz/Oi7v7bJEYDEK6IqAhp9EG9kHAYmJwXtPGE7sWG6o71beqR4LmeSxneia+zGXSAZveCZndYkRQPmtNdNLcaHz6uGT9t8W6PqMKE6UGm+LP6XU6zPSOewWzKOvcRU77J2MCNRilmM/j3FnGarDRkcq3jOXPhetEf39+mTC9ZE1BNd9pUxJvisk11UvLK2DuB5YzhOtPpOJWFqH8OdufQLIVB6h8cGAchcBS53kkyaCda0wCqJclryXVAJuPxv76Dq3suac16tJoNxz1iRv2ABM54xlrLFjfxeNk2UCAN2BrcjaIAAAxSito96BCjRpfk9j7C1gZOU7+pq0vioDoDUiaSmPVSfJbhPZCCpN0sanTlsjIJljX/0lpLahvaFeSfZLWZC8VvQ+BQD4P/ZXavYZCQgbClI+AOA/AAAA//9sXduOFFUUXaequrqbGQZRrqPGKw8CgsYYTEw0Ev0A/Qm/wX/yzQdiwgtRRDHGiKIyRqISE+IFmASmu6ur6ph9WadOtzNPk0xP3+rUOXuv2w4ffvlRZOiIjZKhj7xwX+tC/1F8R3JTYk2OHF0ixeaPIzA4rz1nFIg8sMni4+EInhxGBw9srnjS2naRGG4WhZQ/JBnOWmgDC5neX8sa/mV6nsrlKfp/RUzsOKVeySekHrxsgXlgXw6USPFlCgmTz+fqBxtjWKwUSGnx93GlkeWCjkmC7I8vzULBxpD+WxZa3OzZpNI7Pniia114JjPqPeykSItMnn990Shy6kDD0LT3+1o4+PoM3+NGwjAvrh1aHLiGVhbpGuLJTZJ/o/qgzFhwshZ7cwuto3+SYI9+jmWribFDiuZgB2kdOCDj26+Fv6T1nUmFKK3VAsNRwzQBww/8dZCE11N9SK2pBxbuj5fnqeuJXV+lsgqbo6vNQ6PvXd9nPbWSaBlQNBFbRY1DscJfN3/Hr5/dxDeffo69v2cIe8DGyIoyeBIvD2D/RHbPrHEAJefHim+uHxoFZgxY1I/NJ9dCIZP0d35IykEoUvRdYdlrYHr0AE6efhbn33kdh54/gsnJg1jUEdXmVNlrATI6nfs+VxZNgRgPhBzWlRUswrrRV1auIaId4or1hkyNqo06S1XPkWnZBzhihQcQ79f9wgDlk9vIJwtIlYA3CYYLyg6NMWsKzYnYqkbYkuiXfxt8e+kLXPn4Mu7/9gDlnrExqYFxlmXEJr8zMED6JCm6x7RpUPmhLGaZDrd525jcuTAduhRqDJop4EoNC29GWwLi/Hwokx7HwPGXtvHG++/iyfMvYLz9OGbjiDAq1CbTtA/tS6+sUGOKdGKXAwuMrKAONr85l+KbJ9alvZm0WcGs3uRtBJAlcFIkvH06dG2hKnDsexgBKu71Cgw6wKD3uNxLhaeClwbYTKYbWC5m+lEOhDEOhSnG9wrcvr6DK59cwc7Xt1DNgWlnbFmZCmYHZCIScyPNurxSLYCa7C/doM5w8jM1krpXkCVKoR/MAOktcEkbHllrQYEzYZcfxh6PPbWFs2+9hnMXL6A8voHxicNY1h0WofEUdgF6BcCc+bVoLegtTNG3IYU5KnjGgKmMjWTxkiuJgnvAG1dtKEhABqjvbR5xO0wH0pnwJRLDAyAVprKva6GaE5o6as8nPMg9LkogyYTppCwfoe5HCI+WuLdzFz9cuo5bV7/H7p8PFMCsff/qfS+oY8hs/ZKfYL9XfQ7KVOIURyneCy3IGx8oB2faSv/+IxYqVLb0/0GQXigT3cs+UgW1Mh178QTOvvkKtl89hcOnTqI+tolFuVQrQdPNUetwgi6FcHH/5B5ZtNn7XvO/Bm+sVq/REOgFry+498k1EX++SnezTB9eB9kHRWorzLKpMwplYdPlCDa2TPf1QGthqWolCYIVH/lkVgG7He7+eAdfXb6G29/toNyLKGciORdJuQ+xFGmxnB1xvyBRLzppxYjZ60cbpSlz3bUoFvmxsFpubDKcmWBwj8amoCoI1I0LLMbAidNP4+0PLuLoueewODLFYuQN42SELlD6DX1uAUuFhDLFxlIVMsaiLVcKZ6pF8tpVg8KKKq1tZNY81kJ9a6PeGrUMlqnmyRPNmRFUpAa1HEaFBQMcZFSi+JVlfKs0apJDIfkf1bLHuCmx2Yzwz8938Mu1G/jp6g3c/2OOjZLnezFI7SP+p4jQIF3fn+qiGv4eI6Zy7majdQfdn4MC/nv0M6ULpgZQNaCs/UmBxQTYfvkUzrx3AU+ceQaj41uIk4BH3RyST9RJHTay76pB69OBTJ2kkw+8hk53oc9Ih6uWltm1yjMb9lO7CMDc+prSM8cbSeY2sL6nTZQNFVVmyJp3Xkux+LF+pLS9VHa60pA/Ahd54GaqU0dlAvRIvLGW1nMvy8QhcZk8+TpuOq5IxqnUTUSaTy1gjoKqa/15pBeQzAjuHZzElhNRYlmkMrvwvqN1lasCImVceW2QiPVw4d4BASrOkDXiIQxqNH6/2gw7qKmEAYamfhjLl6l+++CEnKtE3OY8fA+DnRhZHwSvGaS+JinBEMA8UFiadQ399t5A1duZ7SrPiNIR955FQIWp7A9Jbe7XiRJ9Wr1JvMezBYQAACAASURBVKrC3ntR+VFQwvcKDT/M+kFakNO69uwIqgVoOaUqgcAC+ySq3SzY1O3Ekqcmowdlh5X32XX4j66ra62jiqJr5sz9SppKEySiVSkVawoSg1ZQaCm+5dkH/4W/wX/kgwi+SVtFBNtUDFZBkFb6IKZoyM39mplzZO+z15lzx3rzEAL33tw7c84+e6+99lrFp0efBS1AjErNeRt5qGBbGW+4+iCWHQolv+X58/Np1oGu/zPPlo4EUkwz0Qo+jwCCLpAqqrXC5tWkOOBNyykyDKLJrq5tEqrlrFArjZrNgrI2BChfAB6dJ2N+IJAm75tVWnxUkncZWiVJWP8GsPiPB/76DBIpPd1cjk8ihzn6lwrLMqSAwOI/D+xoKBDVzQHmAABR5aTubNea16X2q0SLZ5CjDaI3Vwjeo37xHxP0TiCECCopwnKQgeqdPeFEPvrUPN4DBo0y89dkEEpIrxQRq2UCcNhJZJG4ZpUoQcaEYTjuEsGiKtm4EARKn80Ui9Y2pr42eu9yvRf013QdsqoiKNaalSBIUSfpzHLswLGAE+Ao+DSWIbQsHkyi1CuHhNj5bfgBNpsB5n+c4PGDR/jhyzt4dnyCyTJ2LQexoZCSgOJ/zATiDDMBHpcOk+RnbNaLonEqiVoL30uWYNZMAG3l9HVFnBlceGAmaOUE8C+UuPLuHg4+uoFLb76Mye4lzMtGq16Zr3JVnFMrCWyl5VBG8C3USgPTws/1139Yo18jW09EqUlByylqOTV91a5nS30AoFLbHjvYZD5OOrESX6bnGBUjVH4TF8oNVOcrTc6+//xrPH34GMNT4EKISZR24YpYMHM+VoAA+eoyo6nd90EsQIcE9DJ/ftWSsjEBRxpxEd9ZS9Fa7lWdOcUXWIn2ilDSfaXU81VoMHPAfBN4af8ybn18iNfeeQuDnYuYlzLDucQCC3jXaocmAUehMiDA1kZSIIjgSv/6C2Ww6HUxmp4ydpnFwmBJg6z189m50dR90g5QDQijN+bIOyyuSPter4MkYai0YNUivgnYwhDjpcOfx09w/4tv8ePdY2AK7SxvSJJRy73MF1RHlx1q58uhcQVoZhl8pDzmbAMtbANSQcWiU7zQO4HTbg6ZxX9D/ZQiKDOA+2XrjW28f3gbezffQ/XiJurNgGWxRBMkdV6iGNkmF7RIZuYbGZ0Y6XWU7mYb6ux/dms6T27zeJpE5owm2a4iQCYxbD6bqZAlz6vYpWgTvTOCOiHFNwE2S1O9D8bKGA424jWTvELOgUWL7ck2whQ4ffIMj+4d4eirb7D4/R8MFtAxGiexkF0+7pfkMI5I61SLV6ftyDa4bkTGwAmNDaslxlWBgdAlQ1eItmrRKNe9tvgV2IOOr7NzVEZlTmUccgvYffsqrt06wOs3ruPiqzsq4nhWTzGYFLoGiUtGxl5rFmheO+ouW+/IZphh9z/YyFxLwa3cDquJII2AZTljMddkyB86NlDFIkUs0YamAxHM+aMaxTN+KY0dKTiLCq5x2JJe71nAyS9P8dOdh/j1u2Od7xfmkoAvY3G7EEtRluf6WUKME7beQj7WRbq3557Pthm/R1LjL+0MarKVG2NLwzGPEB1M5sLeGAOzsce12/v44JNDjC/voLw4wt/LKaqJU5BBd60y7LyxjxaW59QGurSpGdIa0MKEO1dmH9hYEtljHI+loHC9mOvz6iTkFs8V+Zv7xNkMN63dBlXUF5AOudi1lmVU7ddapjWbXh9Up6Q4rdH8NcXPdx/g+N59nP52piyMDbXCDPpdU1wl6yn7O51l6rvvkx6mszZAZc4C+U9Y+ykSMNMaQ6CxEac2xPdZib3zGCh2N3Hlw33s3TzAK9evYjUpMXet7rPhoFBL7kLP+yYBAAKUtm0nDN6NlNkeCFjLHfsAQP/BmfiUI8KvMXUZt3Vk1tgEMYa1af4dZAiYxSHzhZA5QZCt41CuiYSThau/BSStIiuVonv87Ik2H2iLyeLa9/Ljdep83uzUGFV3An60WNdxbR+1YAS8YJfcJacV5sSVAgCwwlpeT6YXlf9XBmhyJBkc/Usz8N14AUF8FsLMl/l55f1huVk6/znenAEA+efzbTf2y+ZrzhShhhTrS9Ldwfw904B43prh2cf/SdeHlC8KaJ01IDmGoExnaSrb500A1fNY7sY+p11hvg7YwZc1I+4sHVASRQzzM4Ni5zw/5Pkq/J7plnEdRjaifC9jVYgzgdquyl4UUK1BURT4FwAA//9sXdlu3VQUXWewfac0tDcp8Bs88zf8CN+AeEE8gMQTEn1ATIKqIKigUKSWVoIOCQhKC20p0DTJHW0ftKdj54ZE96GNE9k+095rr71WeOmVl1+VBDmqXZsl6Gp5RkI3XpC6Ids3qC2Elx6b6F22XKMBYxTUd6JQTW8xOlXJNO9C3iyLKD7Qiqg5dAvCqR+kLbo2pRzkcvB3ou9Er/NCZm4VPYTSu9Hzdve9ATDVUBPD2QyWgtJZanthvT6bTrjBqmCdLYQMdF9wpQsC2lzll+SSKi0iMlP3rhW/10Y3+M0e8O7+JPFMWQk0KDPBRCMEWaT3XFpiqnQYptIGp2iTJJ0WmDDS2XTKooJu+xOosCThHX0H2c0h6EZK7IUV2071n6//tVn9j6pKLfYWRtdzeeOyQCm1UuFi1XVvlh8BM1LDh5xyTv2bnfqXMoKr/V423nZfWeCt36/GG8xpIAtG87OWE50HTAWj90NCLeoaYL7a9jyL5YLfP0VEZL0HptvVXIkJquwfYynrjwLbpcPYD7BbTlD8vcQfX93El299gKsXrmB1f4YtqmJSIJMcqlgh1VoRMIvIXkDA9x3FCo0SkCUFiVQJcw1b+RFNf9EkrCkgJoonVROjzkUVETDdIj4QkHKFjXsNiX7pJUik+LxsgWoeMHtwgJuXr+HozwPsbE9Z+I1Kr2u/RuCDRiXUk96tU/sjJwisVysy/E/LjlNqWmsAilpUdn3mvbHcmHeMgm5US1w/EHECZnF64K3647jfv4wlpsNtPLco8Oj7fXzy+nu49OZFLO4dYLQCBo7YGB5lEi/+QHM7OZTJM82/oPFi9oWq/LfSg75qwG4KqzGYvh+mI1ZeXo4cf+YkqqMis+yTzUmrF296Dujo26NIISezZKNTBqKRAmEFLB49w92vr+HJ3j28sHseg1EFP6y4Ktqw7ZaKG7kuLBR1P4illevQpT51jw/TJO1j9ilKARdbrVQwDVL1JXgORcdsF1rHzgfZp3Uf4cMzRgXhCEhQlgz5WnMCVItPvpdKc9t4jMIQZ90I59Ylwv05rrzzOd5/7QKe3H6McCyahyMCKGk/SCryZ2wMBWwip+807iVmTcIiFVhiiGM/xFEc4zBM8LSY4CBOMPNjHPsKCzfA2pe0euFSIYmsVkopXA4KxgXzDvfSkEMJyrAIDOCRHsT63zl+/O4WfrtxC89v72IyGWI0GknFlJR7sze1rPFUO7UqlflqwUs6VZU9vQ5YY6QROmlVDeQ8Lyk4aDIASPu79NRG+b9W7dWSOHAkFYqidQydM8nJHKLl7Ml6N0kgHWuPnXAWxV817nx8FRffuIC9i9cxfNpwUsNvz8vzyCx2uUfWHKP5bbqI1lWo3RYO6y3M4xRH43M4nkwx39rFYjTFIm5j5oZoygmPS+sloA2WGOnuSHZy9GSFNkUJjGQ8jQYV7YMrYPboKX6+cQfzfw6xc+YcW6IOz0xYuFHEDCU5SnLwSvKbXAZibROma5wqspltrI1LripmW67IVr20v1mBRaqCEo+UVXnKx18EEMFrg2I3Wq/CUKG2nxa+LAR4ooQ+eYwxxtl2guWvh7j+0Te4/O5n2P/2F7RHa1Qt2WJGDF1kEICZMQwCqKgfPZ82Gdgn9DQRVKQ6t21Y8slEIwIP2BqVmAQN/ztq/BT1E1zH7ih4ZUmjRtUUSKuEh/sPuT2BeuJ3XjyPOCjRUGUMAohKe4bLMVxQOy2O0/zJQg5fF8RGog8AWIU2A5Mh9OK4lrUOaq0MQ9sA6p57BheEGJBJ2i6pinxOleuD0zUrsRolbUMUOEMN9w+eYe/TH3Dp7Q/x0xe3EQ5WDF4yM4YTVmkL3Dzj8/tnWCvxPiO7mTBrhvCYIGBCLBxeYUnPcqH803lV6siG/DMFdJyeqTkOUC0iatc5XuPB3d/xeO8eBqsC08mUHR5qAopjyeB5CPL36HzitkYGRHvMS2N8WY+0UsJlrFzWltj8yp746Nr5nIEXOkbQ5EhsMF2O3Tn/yeNq7lcq6NcrmjktKLL7RCkgTXYbUBA7tdKjbWKbEtPGTI3PRR7V9DrRvJROhJ85vrbcp+0BtzY/y0JzJy6WqoaRxsrcxtor3BrQwSwAL3F/pe17VlGWWF1s2C0GSxl41bypt18Rxd7nnEH04zg2b7VdSR/IWqj53tsub3OhVwitmyy2aPdnxVcW/svF05BFEWW+yN/jtW0osd0ourzLbcSPlvzzVbom7ZfztRr39MFBe3auwBMrznr4T2jfaN7RdLZ/NC6WbxhLNZYi7Mtt061YplvBwPZ4sze09iVuF2bmJQFREvcyIKJ3z/mQguE5/+RzVS1nVQehbhr8BwAA//9sXUuLXEUU/uq+uu/09Mw4zozJKIlC1E02STaKhCE+shEEQUF049r/4M/JUl2oqxF8EAjBiCKJxIW6mBgJ3clM+nW76z5Kzqk6das7uTDpJovurrp1q87je6jPfv7cyGLy/DDHrWCYWdzCnqQS4juFxh7Y7N1dt1wmqVasdvmFAkDBHcOiXKdeOrYhXMxPZGSeXlENvCMrb1Wh2k5G0/pNKgdnEdqAVM+4M+0gWNTpFi5P6SpV/MA7D3u7OC18NUQocNegbjwCQBarcoUH0yj/f3ACDzJ3omMgnA6BhiixHKEkcTFz/phSCYycN7p9jRFAOr2QWdVaR0XJEkxK4FSssGlsBVkSaNkkECipChIg7LyFC73LNI16ae2EEBZ6T3M2m02X1sjqpQKOjQh7MI/GFZbEnzUUImSxx7paQgDIhil2j8o9dNKZF2syhoo7sRgEFAC/DmWMAQIg3DxCBIoJ1ERD0UeB/9H42VomsRxU44L48H4RVYPEyibzOft21osKSaWwVmfYMB3M/xvi1tc/4O7hTdT3NbpasSczTWfjAkR7mDU+wGV4a0TJvVPAduRZlQNZL0Gap9ja3rI2NnnmEDe2Yl0UM2hd4Xh4gmKqsRjbwIOSelEWDikGsTu8nGaaVaZHjLJR7HteqBKzjkG1m+HyB2/j/NVLlseJimGBtptRWvutqHGHDiVO1Dksl+gX4SW8VgRUGlobYvsSivw1bk8KvWrr1Ra2DwgdtC5NW4imsy0jLv9mnGN+dIxbX/6Im19dRz0A+nUEVRv2xlbQyJQNZENIpiAcuCkaWYGlhDq/u32s7/bx/Iv7SPsp4u0ccX8NEVGvTGOt7KiosSixOB5hcn+AajjD6N8R6lGNerxAUlHhIWPYMX0Bhf06qqBpr2kshJMr1ATZ1hVmHaA+neO1D9/BxfcOMN9UmKYlNAk5ubM1bVo6Bp6CAAiFW+kZIwiyPT9qf/jJvK86OPA8N/VSB4Seeabt0HhF4MgsP3uh8jDfV94LFdJSYavpojdV+OfmHXx/7VsM7wxZpVzExnifI+1GFkx1XsQOqk49qVJRspjBxBkWaYr+/j56O3t4dv8FrO/sob+zB00ibM5+krrLs9EIo+MB5qPHeER2jsMBysEQGSXWKNBpNDJCWjH82fC8CV5DRHDpX81/ClpFGNPa3+ni4OO3cP7KJfTO7KBci3BspqhictawHbSYIOYclNgOKr1KZyTcs0IKgLU2c6JPgYhZeLH9Ku3fiD1tzwZM9TIcUlfe75gsN5mOEqxz9iNHB7lJsK47eHj7CDe+OMSd735FMgK6NTjZ4O6kpxVYRwCGfVOHEYr3Ex0nmFBha2MLa9unkaxv4+wrF2H6m4i2+4j7ORRBTGm8hUYzm6A4eQT9cIDZg3uoHw1RDh4gom46IbmqOVIzQ2q0RXG4HazxhQY7Dq47IcJcNZhmQO/sFg4+ehfnLl9A/UzMlpuk2cDwc6IcRTUnwqxQ7jQk/PnpksBWOyHoCDYWwr/QtovVyTqoFi2sk/e0OPZ8dUbsraAAEu+H7UQC48idNYm/H/SzsiZGXqeIT4B7v/2FG9/8hHu//w08Nlgntfl5zUWpxBV3cxNz8u8wR6Js8MTe+dypHrJOxPaWaRah14mXKAAsPFwUGI/HmBclplOAhluJ/Wy4V8LukcbtQZRqav7uFCZOMa01JiSc2QXOXHkVb376PnovnUKRVSgwYcqJF2bNrHJ/VWqLuIoDHrdDaiYuUTcBFaxxCVRIS5KLBf0Ka69H903E6uRz5X7DJUD2/rUNE7pP3dzeYxrfWtxFRgv9WOPkjyPcPvwFf16/i6Sw9rwEoy9Lit1iFjXtOvGxyImNxkYcMaTY2HBRa7u7gb2dXWz1N7DezdGJEk78GL7caI53i3nBsdFwOMRkMsFUj0M3Wn4tOc+3+hn2vS3ylMbpzmQpxhUJmSrME+DlNy7g9U+uonduF/VmzkgzwnAQAoCpO8raIIqDAucByjZ55JmgPS7UlFGrNrErdmqqMb4xxoKzpV7qjgty1NOEg8SeO7qB0J9FCBvfHEtcrC4aV/w9aCkf8plh4xNRiygOxWt9bmSe5K4L4tfag6ulRBVBrExFoLyT+vVFybeIHAoCQDj+gtzGqluaE8GUJFMg67xWqQgvyLZAtysUKU9US5nmLrMTmpV8ScYR8s8lB7EaZZHPlYRGHP4+OgvE4Ywp5aVmZDF1023M22oEQNCFQX5CIZsU5YQiHlLHZRyCIpf5bbU+LH2ALsnPpCDLn+9ELMUZRKin9F6Q8hT7r5H7AyOkl52/mA7jYlPKjyydw/5eoaqLY5zknZL32rgqQCM4FAbHeE6TaZUCQNRGKV4YY/A/AAAA//9sXUtvG1UU/ubl8TiOHSexmpI0j9I2IFToApBgAwuEkEAsUDcgNiCBxI4lv4U1q4odolJFhYRABQpFKqA+KElp0jZJ3Qbj+DH2vNA5956Za6fZ5CW/5s7cOec738P6+MfPMs8ropXoQZTrr8zUPDa7kfgGoTeIUyZvikTj1eiRqYF6HM3b0dN5nsZqyrlpnqEKwvELvDIV5EZSTAk3LhbTrdF8vUz7AOQXclLQswRIkAW23II2MlYs6Yu27Ht5MyF/y9FEx9EHWGdax8W0Ps/01C74is6SjL23RBvzmbEgposnJzHYad64Cj1H0Gd+D5aTa1Kg6Tk5+MBFnzU2pTPXhJtYK80z/Cdp/pneHOT4SBE49jwTgI0geeZ5IMwJMz1A6CsS3TGZ82/+LJqmIv/UMAGZ+ExiRDImG8g1+kbjof9nasNIp0MunXLz4ecRJoF1mIIMg2ou54hsdOrzKhNAdjLnKafDsStEy+I1J/TOtrUfQYAwBgbUNHllBEMLtVRNAsjg7/svL6B1fRfT1ORFNuf829wwqMI5Ei8DbcaUMN0TiEqAPwc01xZw5MklLKwvo7Y4j/nlo6g0qvDKHut2SS+mGBZxQYmyUnQ6bbT3Wtjb3EF3p4Nbv15H924b7XsRcADUKAeVaIuWBgQIbCNgirSXFN2WKLLfEBlCK0OH5mVVoLE8izc+OIv5F08hbpS4+R/FI2Q2mbqJMWSqo4QOG70I8ZQKCEK/I22qY07E+PrWeJMzxpIpAIAsn02luZdHrsHzSzytpuNbtktc6QRWCZWhhf2rG/j683N4cOUhT/xpGkZ0X5/1zWr64kDJGyytz6dc/jAD541nNaC+1sDyc+tYeHoFy2fW4UyXUJnxVRyWm6KbhEirPnpZzMUun6cEDA4ipAd9uN0Mvc02OhstbF+5iUfX7iG9H7O+PR2BfQlcRzXsw1izkZhtYXPTTLVmxxqyLGD15ZN47cN34J6YR7uUYACVKR9YakJ0KH/ezg41ALIPi1ZykjmTJ8fkhjcZgqA8tr+ker8Wt/SRYV5HwAA1DzT1VxPRBNFIsZ4qJQ8ziQP/Tg+Xzl3ElW8uY7QTocIglZ0XMlSs+iz9SHJfiwguQuJj1I8gaR7DygsvwV9dRXlpCY0Ta/Dq06jUplWhWy4hIyDPVtIeKgBGccRGmYgSuCFRdv9F+68thBu3sXf5EsLNG/C6LdSzEZz0P/hQTCTel6JEAxBqSj5g6MjmuE02A3QTHHmqiTc/eQ+19SWEDZcbzn7c46aGAAg7UQCAuSYZJDK1METNDJBSphDUZQsVWvY5uQ+xuVG5oh8nE7mCUinXEml8qdHkWE1qcPXrhOEIVX8K9SxAsJ/i9ws/4dsvvkL3nx43/tRY+pajr74izo3BW+2rECPA0K9jEDTgrZ7C3JnnMfvMswieWERWm0atOYfUtTHylVwjtrI8f52PyyCE1R/AOuijdNBD++ZN9G/fwf6Na4i2N1Ftb2Eq6cKlgp6o4VC0zliTktLEV6wfhilTTnHo0DlVt7jBef2jswhWGiwJ6JMpHTU4bspsHp7tsIuhcY9ytYM/NWvMflLFvQBmruGhwzWWqyLIWO4WhhwjJj46yrQ20OB7pv+W5AMXLgKpNpgK2BchHkTIwpgbQjdMEW7/hz/P/4Kfz/+A9u4Q054NJ1KsIkszk2jJKXaObP99ldTHX1T+1ucCLK0tYOX4Ek6cXMNMo4p5yvCvBqhWywyE0PE0AVD6XHS902cYDiO0dvexu9PC/Xst3N1+gI2/9zDoK+++UKlcGLx0oTLZoXcjpqMTmJDGGBJjitKeFqfw9qfvYvb0MQzrZfTiHiqui363g3JQ0rVTDDNCM0lM4zR7bPoP8RIwUqFMGrFQuBOJbTTMTPPHeNZYPUdrKBJJHg6ljvIWIf+rzMXg1h5uffcHrl78DcP7A3hDBdrITsvnJNXpVEPRnukUkb7Ten2OOjNYnG1idWkRp46vYaE5j2azyfdm2kNV6o8GwBGPRdcRMNPpdPDw0UP+vnX7DrbubmO321KSMr4SlLxspP0AeD1SdW9JaICg97GBmyA4NoNX338LK6+cRjxXwoCNTSmRqQfXSXVOfJxLvujY0DGSoSDFjIt+Wyjr0nDljbABgrFRstajW1oCwMO+uAAupRmWRtPTQIoMnjLNOsi0L5NIQ837Ws7SscZrZnodYdfymvulMQ3+oa90InlDewGI7IQuAOk3zAYceT9V9FqOXXhX5IaTj4nWjY0UniJu1s7NEGXv5/flZPnxU7Jhncmvex0CAKBlriWOFyz8HOS8N6WwmfbSkt8j3eha2nRbrg1Hexq4jnfI50GGjAQCUJ0pbHHpO8w+Q+5XyYSfBLREmZ7L9KKTwV4+9NMSgPw5jBQoOX7qeBTmiPxeDJN503dN1qVIYSj8DPL3LJJ5LXvgPlvfD8zeUSWqqQEs/8+IFifvCQUOFuvBPawMOekzZhn+BwAA//9sndtvVFUUxr99LnNmTjstvQgNFBoHKIUigYgRDZqYqA886ZMan0zUZ33x/9FXTfTBqA9oiMrNJopYLoUClWKJlt6mc5g5d7P23uucPQdOQlomTTtzzr6s9e21fp+sAOB+Y55M3B8uF0RhnIxa2js9iop+BIagmMGzmUCbyXlxwyq2EeZVwEz0wHUkRCPW3pRuMcDLwZAVFHt6eKrfxnnihJb/fszwN13ST4RlBiGZN59/NxFR6aYzWIcVrnISsqe17tnmEhYGWWToq4Qwv/LrFDgV4B6t/rCbASm07H3Nqg8MCKDQ5Zncd8QLJf8sBcmmDR4B+QriJAULur9a9scZpWx8sfrJJfJceQDuZWRqtwbwKRZDIv9OYlpDPcUiJTUAITw5mLjLiwBdFPTzM6pSQLNKRQIrcbGh+KKS9JtChyWsIvgyP3uhBKMEXfHVJzYZHAo6uWEBQm34jiy7kSwFgmTWPRkcSwiTnvA1LpCkZ03JISWRkYWR0MFIAPz+3S+49PVZdFd60nLJSy04MnjWi5Jlo0MiCdTpfihU/31jp42DJ6Zx+OVZTB7eh13P7kFtzJfk8XbeRU/EyF0hA4DEOJEthTMlAFDhCiX29cyFH7twOhbC1S6WF/7GwxsruHlhHv8urCDeCNGk/SJUYDuKeQmcRp8n0YlWRBURlLI7Nto0p0eB1z5+C7Ovn4I7WkeQR8jcDImlepwFLfQoy2RREQAUA6CcF9VnrdYJJZBQwqPak4zNRCfCeiWpsDtQ0PmIw+CmFnbWhyE2QsyfvYhzX3yD+H6OHWTjl1K/sDpZdnOrQGBlsuQxkx7XlFBQD/74wSG0Th5B64WjmCAY354mwqaDbi1HO+kgtRNZl04n948Ro2PlCJBKAYBdI6TNoOWiSUyIroXR2Ee0soXNGw+xfPkWFs/PY3VxHXUNurO0n72UOjK7APtREtvLY2yTCDgM2PsG8fZnH6E5M6ksA0UCV6TqNhT+Xhw8Z0+115L2NLJMOS4C5lwzVorgJON/eSHs8qYurXW0MCYrd/RaoMqfvb55TEM07KQYqQ1i3K7hv7/u4NLnP+DehTvwQgEnErr0Xp1ayTXFchER4ZpO+xsDCGwf9ugEDp18CWPTsxg5ehz57r3YHBzAY6+B2Hck+VoG3iRIOQKOp8rbIwm+tWQO36Pkkfq1Ewf1CPCCFEPbXYyvrSG8u4B/rs5h+cplPFr4A25vC14aYsi14GSxnF9SOIGQwTNhB2MqQrcyhFksQWjpTuCdTz9A69XjCHwgrOfoRgF8SjRzFmVUXzZEVtrP5f3rFq1jtDYWa11eVs+hsrbJ/4sy4FV7utMvoBl9seTIkUl+jGqvIu94P6pha/E/XP3+Is5/eQ71tmJj2JkCLZJIJgOU3EGui7/pBLHjCHQ9H96uFkann8Oe509hYGYW6WQLneYQAs+RnvG0fxOoikSAXDNWFBhUe2R3QzSo7SYTHAAVJAAAIABJREFUaMYCjXaA4V6IcPkBglvzaF/5FcHiNWzdX4Kf9jCYR3AE0eO1mJ96itsgm6VSxDakXR21UUUNG05rBO9+8iEmjuxDzwfWszYSO5IVGkI8aYPGnALJabG18CgD7rQIDmncU4Isy4X18+MqNvbqLvZkW1VuEU9FCTtpMcck0b3ekFbD1O9vxcAwfNR7ObaXVjH37c+49dM8sBHL9dq2BUSiSqlrmlHi0SlfpgTNQdpXXODA/l04dmIW+w9NoTUzheHRQTSbAwijQLrPKCiirkoRcb9QaJT/0lykBDjYjhD2UmxudrG22sb1a4uY++0K7t1dxVZHtUbRewpo39M8+VxXB8Sao0NCbdvO0NsNvPL+Gcy+cRr2WAPdtIM4C/X70r7xhouGOT8s3epaVsRqIaly6NTn91+BOctqP83MyvOSyFe4OhgJBA2x5HGOHbUmGmmOjdsPcPmrH7E8dxfZOkBbgcfgNZ34S7CZrZx4XC3EDAAYES6mnpnAidYMDuzei+nJKQwN+BhouDoR7mdPqO9z1T4l0OeMUK4XmbSJfrS+httL97C4vIQ/b16XgnSHBHstAsTqsSrwrGyeIZim2usp4U/GXLz43ps4duY0xPgQNtMOcgpJRaQhmnyAUrphODaXNXOcrb3gdTUYx9jmYZecJxraaLOTVpoU1be8j8A4KeYTU66Q4tfYMo9iI3YNMwHTVT91vrjSgEn/dd8vxFZee83LrytRG1rg5rHDUHEJ8TYqUHOD1yJfQ2mr29dbb1QclbyRJ2Nh08VC6JZhs6qIhXPOB6sXMUQi3RYOLTRXE96CyWWcihc/a1tFS7Kle+yZRac+X38+wu5YjubPkBOL6foFAwjIAgDnaia8vbC+1a8pJoQ6DCzmthYAGBZpwgr5HlOrL733ElKsOAolhLq89+yoQweNLJZQBTbntvQe+FCY9lC2z6fveYzzveIx4Dj9zAIWtui+ys9REQC44oO+hmGI/+m6kt44iij8VW8zY4/jSexYRgnZsEIWQlAIVgiggJAIEQfggMgJJG7cEP+FExeEBCeIRIQ4kQiRBRKFLAQrIkjGsgRks00mnvH0uLsKvVf1umvaZi6WE8nq6e6qeu9737IuABCGZY6zUWsLa6HRhw4AEKpzSdcuNe4+HUoOvnKDGQQB+AVco9W1BYZQqYub6WIV5GGGlaLEp3oEA6Z9qpjIc+EJ8T+I7XTJo9vTwqLi1wcAfKM+S/2JBqIZxHCwKIxNWQRX6T+Bc3/kw94hi/Jis1YpjvGo0y4QS6GuwzWu/FAddYWTEXxtvxgr6sqC9xpa+i7dtFsgYNXmXz7rSQAKKYL7Z0Ge4LRQdB2xt5CNR++XKD8jEVUULyKLt4Jwijsm3xMGKbL/BQCMl4lqnPYKlYxY34VVilfaeAfMQ7yUC128oxY0kA1CPuIgK8/Wxs+VCzJ30hLK8qVmhn7mzryuKLap+c/JUDGBTg0mzDDG72S4euoMzn/9PVYXc9QD6xCfeK7l9N0pA15KLHIUjyYTHHztCHa/chjj+7ZBt0Km3sWNgJ2FV9FDn0i1kUZUSwauFcAgXVVppzsyPEUlB/Qkj1l6QBt/QzegFnPcmZnDbxTfdfYKlmdzbKBCk3PVQp5UUIGmnWN8h7V6AZs5del8bgG7X9qP4x+8g+SxFh6oDk8+2VjLyFy0LE7Cgcm9mG7porlUahB0ZKqnQ+/9hlTWppYEFOXtF8UBBaZYNZMmhtlJPsXFz0/j7Bc/ICFX7Nw22LH2zAudlIxNwOlZkTnSBmDy6W3YMr0PW6b3Y2zvdsQTo+jGfTxCl2P5KEOZWCJsska6r1CjrTOsUOHjmhoaVylniEbNU431nJqbGwIokjTAWL+OhVtzmL88gxvfXsTyrytsSNiKLMe87giixqbjIQtzdFZtgbnaUEjHE7z10XvYNL0deixCz8VycRFeUMtLAKDaMMKZx9J+4jeH/rqSPZDWPLHNhFIJBzjK77xuQgtI9bPMGWzFRSYxTQWHVYJWmuDehdv45pMv8eiPDj8Tal6GCDR0JkfWBC1ASqZTaKJfG0Ftz0FEh49h4rkjGN1Bz2QTOkkdy4FCh66PDt4ARVRc6KjDSd3qYVe1djRWa6/Fzv+ZYmMk0lg3SSrSy9Hs97jAz//5G3Pnz2D+3Fl0b1xCy6xgJO8gJvG/1o69o2xkoHLPhArUGnjynIbA2x+fxL7jz2NpBFgJemiE7F2/LgAgBZC/n9HHBwBCZQbO9aLZKZhPrkDSUvSowf1RZDdOBqRyxZN3klhQpv/CpVmc/vQrzN+8y+slSoFRAgiyVQwTG6qfOp08KcHr6AZN3AtqCPcewMTRlzGy/1nEO3ahPrkZi2SYODJMPo7sUZIxZTyzWm8CADwjKuO+S5Q7HxQCyjODulYY0pZBVe+uoP7gPrq3Z3D38gXcvfwjkjuzGO0vohn20RAAH2Skab1R+rAabgJ7ukR/bgDB5iG8+v6beObEUSzVU3TilI0bafrdIGDcoFgr2mllpTBVxvrZyP0XOVu9bj0ZCHwUk2Vp7gUMkD3KTolijqyyLD1r/kT7bkRRsSZCkIVIsgARRfv98juufXcOc1fm0eiRHMClJzjGeuj03Q1jwRpagcMRsPXxJg5N78XhIwcwdWAnwsRO5fldIsd+KlYDe8ba10IXsZXV9S/UZnIUyKkOiEj2Q7GzDf6/f5fauH1rFufPXMHPP83gYZvJ4yx51E6owY+f0mRY3rTKwPdDd6YceuMFHDt5Ap2NGbKmTQJQztRL9i4+P7Jy6FOtk6Re9etBY8pUDHb19kzVpBHJc134/5igjFuUWkPANHo3N6CJpG0wTz4yn51C+89lC9pmihk+ZOqpjZdQ4mIX6YQag8JWxHhq6048+cQU9uyawuT4ZjRrQxhKajw9Nyqzz8BFbkfOx8n+Qc3vtXHa8SpDlH1GghpqjSGOZ2wvL+Pe0gKu37yBq9eu46/egp30MyvASpiIVcZAgJOc0VtK+1bWijH14kG8/uG7WNmYoFPLkEX07vdgdFqwSznW1WN9CmBUOMlLfnmgBibeuTeR147+zrWaKaejfsa9yFMluYvWm2+0KXWmEuO8ygS/aOwqjNDcexeY0p5EZSRhJSq1GoNeSqxNafbmxZgWzb3fsCsvlz7wAABhAaxjDuHXz9Brz2+5Xl6fEdbQ/os1TPeRZDkeAOCzCHwgRf4u1VY+A0B5xtkiPfcBAB+ggzfJL4ewegAAqBqV+wCAGBPCgVt+beLLDFjCwKlpLnKXwDZ3TSL1KZ4Bk+g8aakbkkv6gcTRy/2iPYT2AOuVQJN62zNLo89pJi4poZoKJ0MV3zSeZMOSQuCDV+w1wwP3we8/AACkKf4DAAD//1xdW2scZRh+vm9nZw/ZZNMmbW1tc2ijIU1TDSk1aYNaLRSkHiqoCF75C/wJ/gJvvfbCgnhTsAgFLRS8EEsFS1TohUKqtW26TTaH3dnDzCfv4ZuZbWAJOe7MfDPv977P+7zPU1j89NznYZhRu9maQTuYvAG5TOQgC37yWboy0rVhUSAtuEy+6H727soxA+KBE9Su7LMdiLTb7x/CbJ6XZyIUWYGiOKndlHpSF3OWX/4jr9hP58e0HoigB3u9wykdqcg3ly/wjHb6RRRPi+yYKJWltAMuqHxOGCvxnezMLzm/qKLmGGSzSMoi6ChVLixJN6WvPqLZQ+wVPSVYMsqYJOkaZLRNpICAFEGKYCXqH+qE7xcWM1qoT9w9Dd6oFVqQ89/265zopigsAHlxAFB/UinCs+JfOoTi9GBVvBFaeIo9W46SF2TzKnxtSmFOSDAL5v79oV0Vj+rGChB5GpIHTZyqrbjcbJbxugI+YOk8Im8Qzml3QINg7kXXUYJDnN6XgQqWMBKtNEw5N8t0YQcRS+P7j84zFLuXigsxSkX1+i5uX/0ed67dQqllOXEuyWVMhZFiqa/RCYRSTt2n2QtzePezTzB/eRnxZAU7o300wh1sFyM0sYek6vC0uwkXkldvH1G8x/ZLsZWKyRUSpuLT1/yiBCHpoEdov4nRpdnjikHLtLFrI7QoyS0bHJ45hvnlBaxcPI/6eIj/Gv9iZ6/H5+g7cSz65BxqdB1Uu6JI3Ywe8Hh9A/f//gvzpxdQrFZ4Rp0LfpuJsKSFtVeP9rP0TjYCL8KpnI10I+d7kW0tCwMBX0ORaCF7JwsWJEIK4CXEnkkCjJohuP9auPnVddz+5hZqLaBGx9OT9XB6iDDSGaQmO9FS2yVg/8kKlt5fxfLHl3B49RQq80ewNWzQrPTxKG5iO2ijmeyxsF+xEsqpsfI8BXyibJVRiEMEpMZvxHaHro9VhNjZGJ1Cn7vErhzADAUYOVrH7OIszl5YwehzY3i4/RiN7ZaIcqmquhdpCwPH4xvFxCKMA3S3uri3dhf1fTVMTk+yQJC4QOQEoHLX+dkI72O5BxVjFakBsiTT5Ea3fOHvv2Z2mac8WgsvUEtcOWuLvEasz9hLUDclVHeA367/hBtffov+egcl6r47GUXjmKmdwr4N0C5U0MAIdofG8eI7H2Di8ocIVy4implHY7iOB4UiHgF4Qn7XzKyRmXxOMyzSz7TmJaaY91jAjEFyq5RUSnhjx0Vqh9axZrEdhNgshYhHxzCxsIgzF97E8cVFbLQ7+GfjCSIjonqDExUqakUxNTGs70Brd/eXNdSGq5iem0FYpe5Qj3U+WLDRD/+ygrqT3M5h4PqylaXqMkhSkHseOHEtpsmjZ2lIN9knPX7dPaiScBLHiV8vRqFrUHVFlKIAf/54B999cRU795oIIzBzaciq8GVBnAFEAqmAjq2iWRzGRu0QDr56CVPvfYShc69hb/IFPB0/gI0wRKNosWkdmnRfFQLsdYVdQyBEQvcpPcO6pxpB/rhMZAYSJUXUgaO57aJFq2TRorg9sg8jU9OYXjqD5+fmEcFhJ4qQEF2V9InY6k4KOWdFqZ32fC6QaW0IPGv1sLa2xqDcqdMLDEQQIyjh8RkVJda1oU4178cqHpY5rmTq5PlmAQFJ/pnySXEUdXLsShklcCrQ6pRhZhWtYmcRsidtOSQbbfz+w6/4+dpNPP7jIWqxRTkpcA5UJpcatvaTgp/MDQgAGLLA4QPA8vIs3r7yBlZfX8TRmYMgbroJqWtHCXKbVd1LJcv/w1oBbhkeMH4gTb7nZYQlXCoV3YlQaT/pCmMKPYzUyzh29AjOryxjaelllGshthpP0NztaOmv8cgJnEkZHIHjVBwnbeDR+n3sbG5h7qV5BOWiqKFTMViQPzIqODvIKBqcs073gThJcwrPwvCdZyTIOoJO1saLXEsHuTcgosx8JGpmOIu6qaL0tC/ii1/fQLS+x/GrVqjqaGAXsc+NEgVkAIwCmAiGcXZiBldeWcVbK+dxcmIKx8bGGbSq0P5JhQc5HzCFO1HRRcesOpEGF4eVgn4/JC2v3IuAf5kdV7FvA9RqVRw6cBBzx0/g9Ows9pVHsNVoIuq20hzOgxXICT8ywBcleLj+AM3NLRw/MYX62H5ErP9lNB9XUW8rIDCzXjW3TCn9Kp7pg5UIlefAGiMConQgYhcbcJzxwo2ZMDQGuqWpFWpqjy1rRIVYoiNt3OAz0DluN/Ce0nhScTUV/+M6BSb1yIcHTFWg29/CMrqoLmPeQl33PavChz4Wp8ftsnjhtbEY3NC9Oc4xIjAAujkVscvstv319O/rmRE+n479vZzuDRnAysfVl/3cNxC9tozJjd6mlpl67lxf+ePW/0OaPyKiLT/nAjhO0r1mcI+ScWrj97ycvo/JrQeDPCZI88ZCTtfMqmA3gxc55oSPuwIWyDMsBTk9E17fS9ef7hEVTPS/S3VGapurTO58hsRxnEe5pQnDOl1p7SC1qG8CdzpROnLiR8gZVMoJnxMjz9sbcu3BYu9h5tITZ2C4r2u4LqKxAWPwPwAAAP//XJ3Jb5RlHMe/z/O820xLW0vZxNISS1vBoBS0CgoKRELQGONBz0Yv6sGTZ/8C7568aDiYcDNELibiQSMJgQQwjRsWUy1dYJh2lnczv+V5Z+AwSRnSzvIsv/3zdUc+ePkzaVsBB1jSrhmo3qLRNlYJbhmaZnmyVeT2lHTvCflMzH50zrz0vGJTZUI9+d+oM5dr8Gr1chRD5y9nkQpxlfyDYAL8jFxFJKeFCoRPW3oohxOCN3QukLXimXrf5dkRem7LwAC6na5SeUUrn/4OZRq73NIdcgudZN+NBvuBZopkQ3sH17exVME9707NSnlyti66/7fPHlVZsqoNST6DtGcbRKHKGdpQ6aI+K6zBrXX83tg5MEqBF8KQUEg10+mJpH6dWQiRM129yq9fQ6JPl7nQJek74hn3VPZKqnISMvMpLSd8aQWuIucbvlDQk+nQS9H/DNODzKDvYqPPz/RLTuLkVVuwVwTojWo4cTIooDTiWHBCxGrl3Yob7QONh2BkRonfCozxD/q88LI0dMDjWOeRexKDHhgZaGKHk1owFdCl9PvCCU+ajAcFbAVDYRxXMWkvdShBVUsEYFaEeCyvI769iZ+/uojrF3/ilvswEyfSs1jJbndK+d7aBmhGwMSxcZz58C289N45dPfWsDbQQjPaRMs1kbkNFGYTMC1keQtBQN+htNZJwJCpmj4lg1Il/RbVQ4UQpHJi5AwxCM5qhaO02Mhb2IxTmLEYk3PTmJx7Ep14E3f+XeayzWhtkCt9ImFXKPm+5OoYyUvVYfHg7j3cvHETx0+eholiNLuZAmJElq40njztse3SVgnz8LjRo9XmXKtutELc2cQgUYE7Gvjqv+HAjoI4msOgfV0yCdlhxNVQ/N3A5S++xfULP7LkIs0vU87EekiYAhAZVpqXHIxHk8CRdw/glY/fwa5Tz2LomT1ob4uwGrSwGXVZco9ahSnRwmN0HuJGYm/NTWT3UwQNi/pGjMEshqX35STZSsl2Rxg5StYUXXbwqIPBKMk5sxnaLkU+aLHzub2YOX4Q0WiCxaU7aK7nqLO6C1g5ImISN5gGHRmD4ShC0Mnx29VbcKnB3qenuc2zTTNtZBOoksmvZeAVwOWVvXqD4YqekOTlLDDcxninOqgMoXccvNEVQGcilOZASP98J3uOdUGApAI2s9hRH8ZAo8TV89/j8pcXUd4tUaOW2VJsjZfuI1NM56XlEqyZGOWhF3Hok08xdPZ1NKcPoLl9K5qxQcsadBQoyIegVPWDwieKUBHKo7SDsbyNJ5IQI5HlltwHberecBhQJ9qFcr91M6mM0VndsCUazmItiZDu3oPJE6cxfvgY7nWAlcUlNmyO5aJKPh9cGWVFAlKOKFkikiCcv964hbGxEYxt34o8sTJXG4kiRlbm6kKpVgt/lt69HuqIjyyXEPv9ujFU1a+b/DJ37vB66z0QM5VYdNX9fRQzrb6EaZfYFo8gaQRY+O4aLnz+NexShgHV9adXrkeO73QKTGTENkHbDeG/cBT3xmcx8/5HqJ16De7wHO5v34ZGPUabOD1GmAAy1kqBuFGbYTmJWlQXlVaHjUgz5kbuBhrNcZVgHfj5NCiQuhyNsMAqVWZ37cbU0VcxPDmDu40u1tebCKi7j9o0qR2ZRj4cwdPoEXEQR+cnEHgDFq4toB4meGp2PzKihFP1L9NKtdK02Z+ivU9wVNX49vYPKqHpiJhOdowgr2FQKaCQPTSujzht/NlDRYXm1SO7QzaGKeBd1HKDeDnFwqUrHGw++GMdYQomvrs8wxaCxRQCdOZ9VgCjBpjYARw9OYGzbx/DmTdPYGLfLtSGIu5Nlzir5A4MTiryMDyxDciXy2AJBknVa2RKy+8DuClUUSrRPRq6OOzehioILjAYe3wHDj0/h8MvHMFmuoHf/1xktZRCe5nIIoVOt7kqewQpsPTXEu6vrWB2ehYYSJBFJVJLYFztRNXzIAGN+FhcYdazT4keqxA3P1ZYjxP2gbwfYPsTaF4+2vUKYfweWY1K78ZcumSGbA3RaoZfzl/ClW9+QL6SIuwGGKQ1z8UmE8SQNj2d+2EAOwEcDIZwYnwKb8zP49z8PPZP7MFIrY4kiZgjwNK5GuTT7xdFh38u9TluDa6S6uKDGuMjUh1nhLK49HuRYEf+hilFlWfL4CCmp/ZhdmoGNcRY/WdFOpfYz5fYIVAdSKNJewKWri8uY/n2P5idnsLIyBAyTuR1WD0oSWg8qys3F/nqRpRfij6/z5leoakqLvUllUn6UjpLQ5FephhA7VFGjBYOYsEKBHmhSjbahl4YpRlauUtL9JRhCuVwWPjOFdHp90lGf99yh2sU8e8XkAq+dCXKo8t+c8zvg0HrLoSvcEh12nCVWeb0DfufZR9TzfRJBbI/zQUDq+sq9wgzRfTOsDpbL11H4L/nx/RELaSnrpTp2BAnndVHtr3oTQJ2CihzcUDpnNCsuVNQMrewa/GVYjzR1qfnqXs3ki4yLbLQZ41Jg5/9dMed1CIH2Wd7IZDUbtrR5EzJcZu/RIgfVGoFvstyiKYK/I2HsTvD/0dym0b3PEsTWrKvlLSkrnJJO8gomiQffPGoTq9BMZrCXKnjmhK9fiTEF/78ee9XO5PEUtpLPGmShfcxx9FSCORxJo5zBHJP/qdXG5AOCOmwpzWrJZTik4K7309SqBY7wcoAVPDS4qyMVco5YbUf6gwizlgtQVbk+B8AAP//bF1tbxRVFH7uzOzOdtvS1wCW1tJWICBYqRQw6gdISPANY6ImavSLYvzsL/CH+I2PxggxJiZETSTRiBiIbzFEMIFE2tp2u9tut9udmWvOuefcmS1uMgkB2p3duW/nOc9LeOL95z7WwaaDz5hc007GXJlVR39X5GtUG32QSlyW7lces+eoC46Oq0gK/b3LcYxyqjYhbUkixauLiqMYt0ol9kgcvZcCENrlc5oIh9BpFCAPECk69aFw95U3IpnkouEICpp1Kw9dYQu6d11Y6H2r1V5vzBGoZkip/Gq4oMVHIE6bJj/gPmRtW4iZgKDgnmIuDuzG5DILBMZ7AKjxCXcPaACGgTcNYkaDIKJK8S8WRChseJlQnvh5obsrytoU6ZYqSEPPUiUOThsOX8ibQAGPPNqE9daR08KrlsvKxNLvziVHSBVl4RFH1UrphtoTV/yCxSixQReNRwsLCD1ImRv0GWgcdZK06/MpEqzfSSiJBS4bs/PwvwsjhCdrkndnFAn2rAyVjQtLQi/njRN67aeLXHHUMqas0oKSRBimLvP9Om59+g1uf30D5SbRZQ1TmU0hzsftPECDKMHDwPMfvoBzFy9g7+nHsFzZQK2yic1yG51wC2nUhiUBOLWqTSpuQVnXVdz8dTN1hb27UPizz2mF25T5IjCIaOThNtZNC/V0HQMTQ5h+Ygp7J0extPAAteUGH8oqxh2AykZcimk80sGAuttJho3GBv66exdz86cQ9fWhvrmOMBb5AH/N7hDP5m0+M1rppcU5l7+4e0ELZOicswNPERQphgBOqaxVMcXasPIsQA8Jfhda+O7Sl/jtyo/Y1Q4RCdJuhOaYOvkySzFahGT3AScvzOLVj17B3OtnER+dwuZwFathB7WghWbYQctso2O2kZlEureWD6X0jAm4qmQVlFZDTMbjOP/oWRzvP4qIisd/l5GaNkwpYQSCle3GFUS0MYVC7advhMzQWlGCZVtHOFTG9JFDmH3qSTSbDdz9e4HnHUeuZQ4A4M2cGBlkmEf0Yipo/rzDxmdHjh9Dua/qjO5C4zvM1qBrPQvDXGLhKXGwAlbm3RplUalhqe+0ZXoAyFdMAjy5KI5iZgAQJbqaljDaDnHz8jV8f+krlFYsU7rLni7ouqAJmYTZAA30otkzhJk338Ohdy6iPPc0aiO78SCMsG4MmtaBBKlqtAszItN7KcT4DZsUJ4arODkaYk9PyPKYVkIdFcMJEUakI6yL5XQL52JP/hzNyKARhKiVSqiHJcS7x3Dw+Dz27J/CUmMDK6sNzvUPiAaOQCQfGT8bBtMzduLCzRu/Ys8jI5g4MIW27WCLikOJFIKAQS7acIekLshjXKFynx2yvOLL7nB5TSVGKpSUFjpA8cGN7rOZoryS4o+r1/HFJ5/BLKUYsBFLVUJR+MN3gYjGH2M56cFCeRT7X3oDs+9+gOj0M2iOT2KtN0YtMNjMMqbdpwVDKyMMICNABV2pnJUYkLICEmcuAF9ZSMhcM8GxAhwIQPKbFnmSlCJs0JiMY/SNTeLwPLFnxvFgcRGbLTEFpX2V4zzzMU8FF4NCFOOaGfxy63eOdpuZfZxp0zRL3fplmW3ltjmRizAltOM7PK4BAzHScgZkej7S+aOdP3dIjcQz2Q3OTOQJTq8TcYxs3DGI6yluX/0Z169cw8b9dY7CLLHpYsb7CxWOMen/05T15PsGgTOnZvDW2+dx7uVnMX1kHP0DPUioOAszGRPelo4BSB/HhUyi2qzv5kENYoVxpfGOuQFroTMrDAH+pLzGBA7cCYHBkQHMnZjHyOgA7t+7g0Zjm5cjKv63VNKvchRJDvjn3iLW6jUcmD1MkUXoCChkJL6QTRjTVAow4+UY/kyR5uZxDvR3RVpRD9w1vwo6ek5g4CKpJLGQATqtDqooo1q3+Onzb3Hr8g8I6nASLgoftU7Sw5CnJWO/AFVYjCPCsf7deHHuFF47cw4Hx8cw2NvLDQw2yU3TAhSrl+7xmf8+fdyZggBdk90WktAcOJMaRxkzDLSnyIl2bk4NDQxifGwCE3v3obG8hkZzA5vY4hjPhKFb97uoExsSMyvJsLq4hNrKEqYPzKC0qx/NZFsicNveMyGQW8h2rEf/w2jvOucGhc6tFVNxq+d76/y29DkFctbrMsnecVw3Nk9BU6BBowCJrZsp/U/jA/V8Z9w6S+8TCVvYIk9iMTB+n3Tn+kC8D8SvSLrutiBxLkkdYAuacq1lvOeYPENan7UY1f01kfhsXi6sb141AAAgAElEQVREPoGC/FM/tq41fF7fyfFTdkdYYIWzk6arHej3UfOOftYVpRqlaPw80sjF7U7Hx9FZSSbz92Ktl0QZ/36hryvz5rCVOet+TqXs2q1vS6NYi3UrfkSJSAodEygHV3QMuXvIkDAj0dWqCkLof9bGsz4LZRFpneBATZeitvPlnfmp3iTvOgLBSiVhYLi0AwartCHMHi1u7dFaT+9XG5u6hhafE3mFFOs5NXtntokx+I+vq+mxooiip6r6fcwMM8jAjAwT5gsEkUEIkQ1GjRoVjRBjoguXbjQsTNwYlv4D18a9iZHoSiNG48IYiQZckfARAkjQcYb5nnnzXvfrLnNv3dtdD4wveSwGeNOvqrq6zrnnnuNOnn3xYwU1bDonwJ4OZ+yQ2KhLL2YEmLXqyYC3W06syh1KWbcwZpX0pjKcsxJ3QTeRLtBc5OylTENy8mMAYsTtUQEsdHDL3MZKyhWk/UVPhr72PGeS/e6FiIhXuVMZubXotDvlDVf13+ghVzeFCHyoNFmlPyVgfbjXxkiPZQxawhhUiQPKxLF6QYxN9AAdpB3SC80qjOBiWcmffdkTWfYsRf3xzFTZyiE9Jg18z03he3pSuLotPTt68+q6gRoWpZmsj5yNMhwv8lTM2CwrFXjvlLFWAkDnTaVE9DmhdcGUY6nfjVUZqAxRiJFl5jcJyQh8MIy9C3rIkHAYNryBVUkLsQxIJVAqF9P/X2eG15RzEN9wPRIpyYc2ifRF+SK4msv4knwq2+piOBnA0Apw/cJvuHz+BzTXPHynQB89GDzbgZV6RzKg2iLSeMLh7CcfYeb141gZ7mLZbmATLeSuA59k8DZl+aV5iIDqfWmvcPkuer8Dop5aL2NVtoeQrNLkyGyXJa9dm2M9XcdadxXtZgc7pndi76EpuH6D1tIa0vWMq8qcVW9FxSJr0vHB0GPu3gLuL/2Dx48fg+uvsxkefXZuQwWF5NC8DlGULTRltRPV/VmScmpcow8BvvZACjGIpTUq0SsELJhBLkie2URjpcDFz3/Epa9+wVDq2LGdDf14uwgSY+rR5n7pBrD9oMXLH57Gyfdexbajk9jY0Ye/0cYiUiz7LbQMdaoWyEyIPqJqLVfIGOAE4JJudbBxdw2Hm4dxZvI17MVOjGIQB2oTaDqDO4tX0bbr6DYNaQi4ksGxabCS3Gz0LM7+Jj7x2MhayJzH0Ngwjj//NOxQDbdv30a6QdF0CWyRSK+qFbtGiFM0cOv6LSZFRifH0U0g40XeAUF6XoQLFwJAs4gLkU3WeH820iahD+ZEWns0d9s5jSqt1h9XVTiCg6osCc8RzfSAa2I4S3Dz29/x/afnkc557ummdpIBMlTqZiGC0gAdm2DDDaIzNoNDH5zD0Kk3sDI6gTmT4H47RSennlUX4qyMStp730TsKDHAy6iziTFkeG60gaMJsFfk7PNrKTY7OWxR5+o0S8XZQ8wIGSFRnEJO0LtjDZbyLlb6GzBT05h46hm45gjmbt6Da7Uw4HOujNkIcDUohaLWRNHOceWPK5g9OouR3SPsqUGkjzOBdCEg4bwoAKJDcs+9/h/vh/YH1VhCJdNgpRlHvxK4SZoMbKh9ZHveh2vf/IrvPvsa7YU85MhLzr4+S5oJqQASdPICi3YIy2OzOPH+OYycfhPrM/ux1LcNqwgeDCnvMUZIchtdhwLFqgmliOaOvwYlAOQCADjSS8g6BFBGfeY5ATImGEI6ROZDP/Oa9Zi3wMD+fdh95ATWunUs3JlHk0weizZnmpAfQKHZ9prDZsNZ4MaNaxjeNYw94+P877qJZ2PTQqLnPB/EIbn/rmw5DIe46nlOP0/EY6hBfgndSn5sZF6sl/2Pqr02mMKSzTp5KvRlCfoWc1y9cAmXCPz/uckKKmsCjRq4vPB5RMbuMsCTEzW8+84pnHnrBUwe3IPGYJ0JDHa17umvlaqZ8VI5DYoLnQ+BY+yfQMajgez1gcD1lD5UD3uoeaAgEpP1cuAuRCZLe0r/QBPT+6YwO/sE5ufv4t5fy3zmoXHyIi+Gzgvdb9RitjCHwaF+jE9NokMRnLZy1QebIWc8H8ZWahl91aXAReSxtsfSb4nnoud+KSXQQUlECQbGBRBD67Hf1THi+3H5y59w8YufkayHNAwi0WoJ7R9SaRRH/0fg8RjqeGXfEbz97Es4dvgI+rYN8p7d7WTsIaE6LCkLxldTqU17xvT/XtV95mVfBEdaakdeIcRacGFgM0Ln8OjOXTgwPYNitYXW4irvcyn/Keow3r8LPpPQb1iam0drYwu790/CDdSQUmxNeKQGQlyIH971te+fq5pVmomus0ptW5GZZT98aV5qSxBq49hxV+2LsTm5vmxJLJjyd7JCkBOGLJ+BfOTkH5MR4fOES0Hlh1ORAyGbXTGOpkg5J9F3jYYor4uyOo1Inl6uN8Exau5to2z9gKsKOeMG6bsCQMYaiSsl/85Jq4oms6lXmeA6Bu9Jrfx77kl3riIkBKvQtVPxLc8r7zAFpzb2beiqWXZNMMgDEY8y7lwQFSDrfSHtAXl5r1mJEdbrCj4MAZNYVxWX6QKajWZZBA3fLSpaRO3oOrYBU+meHDCdtmP37sXRzsjkSZiDGIc9SFSFwnk4U4dEmEC6qPM/K+FJ4S1qDS0UxyQQkUJ6llKgH79IMaAkCKcFiFKVMZW1+BcAAP//nF3Lb1RVGP/dx8ztDG1peXQKpUAJYEOMiARICcFEowuDK3duTIwGF+7cuDTxbzBxiztjjDtlYYSNSkjYiEh4VKIIKVRgamfa6dzHMd/r3DsjxsRJJoQEOtN7zz3n+37f7xEde/fFjzJthm3qTWYYtFjoS9AFNPo43UKmKWgkIDeQarJBF48+iGnhlhGpNGl2Ws9yT9s3DbZMstMBxM5ootZoVC/wYEarIXaVBaaVZpUuE8Tlhlf+fGEOxD4fvl5qxdXMImX9qGZF6s1O08EG0fnCN/TIjDTEFgVYaaiH6Ov2nd1A7IzTm11B5sxg0SJoFFCxG8hMgMDoMWXUoCvKRq2cjAb80EZKF2FEDM7LAmI1JKwa5vXVdTOrNPhidCH/hw9f/Xms2Q9LdM0oWwY6uArdiIt/GWd4VM7urWh8TLsf8f0x5MrHsFgUYyzAlZgjOtX2oPQzqGDGwZDLu3lO8ETZXJh15+F7TNTnisEfbSTEUHGaVlA2zeUapIeXYxU1C51s9Asj8JsxFZlOUt5qQJThJpIVh4ff/4IL575C+CBFvFEgCUn3lorlUagbBWnLG8DU89vx9sfvo3loG5aSVbSjDvJaJm8a74TSnMEDAP98+TVnshQ/CRzczEKU0oyiirp6kCNDrk0s/Y2ysIt6jk7QQTtfQWNqM3bMzWK6NYNOex3t5TaiTGKyQj2zSccf2MQuB5aW7iMebWL3/r3okxdBJMUtrx2mOVr5b+Cd8zBHeRArxTxL+TAynwwzlBQZiFKHWYsay5tp3GQsF+PqNz/iwmdfo/4E3MzQykqVZkeNEWd/08EwArQOR3j1vdcx88ph9HeNYxkZVmLgz3Qd5LRA1NPUqMnQiYpRM3kqFXKh3Flaw2RvAm/Ov4Hd2I5JNJE4h7EgwWTSxK+Pb6GdraIbk4lSyFNxAgCiCgDgu9mQJpM1BlDWixQdt4G1OMf8secwOzeLWzdvoNfuaUyeTOpDLWo4RzktEOUhrl29jum5WWzdOcWfyc2MsUmywqPfdgCZQRk7Xvv92UAAYRN1u10P/PqJCQNM5b0Eu3vLtJSmk7U+0Og43Lt8Hec/+RzFvZS9GJpxAmonmOrHjBTKjI/wV30T8rlnceLsB3BHT+NOfRwPghhdknDFIyItiEX+4YJ/eWdGCyUdbo4Jl2K+EeKlqTp2qR6X8tIfdnMsr/SQhw1uJissWm/EVOhUgCcCuayFjXqENQJER0fRqzVwYP4oWjv3oL+R4smjNmLWkZPEKuXnheRpWT/XibbDpcs/4OTpUxjZPI4NJ9TskJ3nVef8lJSGAYDvP14O1cZbikT63Yh6OJI00VsvUKwVmCyauHHhCs5/+gWiR2DPgk1UcIVCBXawmiDGShFgORlHfOgEFs5+iLGFl/H76CiW6wlWaUgQgTX7MEPPyudXQQDrAJxhxzzkdOyeXiN6fSFafbhAG4rSzCErDDBQC0UnQigCAMicNKMUiFoD9S0zmJs/jH37DuKP3+6it/oYkcv1o2W6Cr+3C0ODlv+1az9j/zMHMT61Bf2IAABJLKFyhKOYXKG1ETzY7XSa6JxQWnMFz0NlFnIBarpZbS64QTI5IV0rKgQdGf7V0FwNcOfiT7j05Xf4a7GLsVqdJ+8sG6R15TIGicZDcpEHTh5p4Z23zmDh1CE0tkbI4pSbe3om6WxvNpr+2dbDoxwke3aZnhFcWNOEtM7cj9AzNyL1cKn55hJ4OgDgpEj0Ur04DvTsraM1NYEjLxxBt7OGxcU76KWyDxWeQWAsM4CSGG/fuonW9DS2ze5gTxCnezh5eAjYYjXJEAPGhh46bYXGaNJXM6PGan3p6wz9LinXNjVeF+R3s7Vo4Pq3V3Dx3Hk+V0iKQRIK2iqJyYBcpDLEmhkHcCBp4MzxBbx2/BRmWjvE8IzqkUxrYGQVDwI31OD/HwDAKP9edCggLhQscoX/k2BM1n7TVDwMMdHchH279/Bzd//BEvsfePcHJ5LCWiLU99gFuL14F7WxGvbu34sgCTjxJKwppV4ZPl7XYb9RXo35dQONlunk7ZUX+UDjZX5RzPrMJO7TPJ9Mkx4OXZ9hyEtqIQERbMhUvfc2ZfbPqA6nCzPFG24WXTk8NLM2yfCPuE7vVybYsRpMDzSSUTlgFYlt6W/ARnM6mTe5stTmgQcEDHi3dWv1EVDx01IAwBpQAYcE5AqVHS2s8ZT7i+qgyKn0u8qUZvNuHgbEFRZNeW3M0yk0n40AKhWU2t36nDL2z4bTwhSWBAVNsatENtrwlH5WYuAKocL6GjR51zOS6g6KUzYfD9E087NvCWLyr838s2TWSE9R9rCDTGQ13dX+idaqmR+KdEUikAn8ZpmSfooHu5Q1Zqlv3OBX9mYvp+bEJ0mOoN7crhfXXWGIvwEAAP//dJ1LaFxlGIbfc53JnGnSNJEm1l5stRcNbYzUtl42KoIIxa3grqDr4l7XihvBlbi0iq7cCu4Et7VCDRbaxKYpNcQmbdo0Z87ll+92zj9TGgiTBJLMzLn8//d+7/t8HAGwjVuWZbwxo86NQe44+8QH1ZQp6c4L1M0ABmAroFHtqWgMjKavM+ste+3bowO1s5s6YWNYmmI8jhrbaGtvD7zHiG9EloEwxcrf2LAVvSy5oG/p/KIMUpaRiIytqwGstMtYuNZ6Yxe0qYFRQwZ1jY3IxlME3sFulclWLLCba+umGF34nKpclld0/Jysw27KIccz8gGyXq/Z1PlZT1O0nNrSrctuJ4sV0E4tcHYDlZPNBJRANigG6vKJnkYy9bK99DOzltD3DALTDr5Na2icG1wgCECjUnhjE91QKKMxJ8xJYA4An44ZKYTSgF/WKWgvhBbw02STVKCAugbE6g61ZkFvfpr597gWTSxC3SpOqZ6BAQT1fDaeAFn/cxoRopkyBobQaw2F8JpUEcaLLvK/1/Dr19+jvrnNVma2StL0CKj1PZKt1VYEzJybxYeffoz42QxrwV3kyQ6qpEAZ5iip+KbuMrF3ySLvjBXx5E6fd9p5y5z34S1wdV03YBa5fp0IgK7UUVMFkl6KvKIIQslwwrXiIbbHQkwe3o99Rw5g6/Y6tv7d5O1ZXjq21fq2Kh5pVdRYWf4Hx0+cwOTMlHQTSoItxuJwNq5GiGbxIBYBZ33TZEiAYouZui5qm++ri5eJkAIclGI6riNMVl2s/nYFP375HeJNLf7NtqwMH+p8U21YxMDhVxO8+8n72PP6EWxO9fBfFGLbJdxhrmInImRo17hYoakjlpLluCpFoSUh61GMYL2LM3tP4+X+CUwxHYE2iBFvVOl6fGrPDP5aWca9qEQeUUQmUzurVZly3RIMiUYikQE7DTs8hpDmP2yFO7gXPUR//wSOzh3jbvPGnbscB6CRoY3ISPdVRDzxgfLK1xav4/ljR9GfnUAeS/eXMvo8w9qzv9m1H8ep/i1v86bXolluRUCSkVYFd5TNEaKiKU2bSHssYlA0Yars4sEfy/jp829RrOYMxWKjn7rQqLajDeQjF2Mj7iCZO40zFz9DPncOq3EfGySGEMWXIkJaWNbRk/0xPKvdSceW7vVjdY6DCfDavgxnO8DTPIKrQoc8Ov0YqxsF1gch8jhSMUWsyAEjM8TSSzloyoxTVICOaygBauRVgSKKcedRAUzPIDt4DFVnHKuLN9gCHNQDJmSzrVyhf5z3HNS4+ucVvHT2FXnv6H8bI3Oke28RP8tK2po79Jp1zZf7YiCzvUsTzWIWJuj3d/XH2QqToocsT/Hg6m388MU3SNadTMeAZJeZL0EFkJMs9L3CYS0dx663z+PURxdRHF/AnbFdeDiWoEgC7ERQsU8gvSzSWF058ukCm1YgyJKwKpEFwhUZqwP+/wwDjGLs6Ggtavc7JZRXtmQ6K6KhY9Fi7NQ02jHA/QLYIS7F7DM4ePIUbt1YxvbGJrp0fXG2vZSC055HJcecjsutlZs4PPcC4qyLQaBuOydRrsCbvGCivQlEZvlkoBSDpMLG/WdOACFfK8MB1oWXEWzRIMbuQRdrl5fw+6Vf8OD6Jo8qpSWBHJspv+6CH0nAmoqA9946hAsXzuO5hUM82qSKB8otEHid0y647W147aWGQk42XnFvVcVAORT0Wug9J7Ewgwt7cMwkUIhnKDR++nSj683I2mMxD+twUweZnnsQVeiP9zA/P89Z1sXFayhKud/Q8+rQ9BqaRqGxDRIBSFh+cWGBIaoSv3PsgqCNcWKj4h5zDLbFUah2burkM2iaAG7EayhrdkkJcLmdy0339aTbRYcEykGAiUGCrcsr+PmrSwjWRRDox9D1gM6dkDkixJXgvP94hg/efAdvnJzHxORuFNVAwI5cnIca9amGiifrBkvnW+JljdXO4bECd0ggbBysroGJhg2U2b42iJ2Ia6k6xWplB2SdDmZnZ7B3ehpLS0u4T3sB2D5UOtsWTqBl99bNZRw4tB+T+6Z58k1JzBGzZpfCjgiVrUQuDxGL0TbZIHtZis4ZZd4alD44L9B8Nq1NLK4poLqspflpDtRGiNI1aCgBpV8bR8UcAfD296kHhIZawJuaJ2rdWM3vuGHxy5zU0L2sjJWsvHXTP1yBCDwjP7NHa8z5tZGNT6yU7eV3jZti3LZjKnhFGkGyItSYDFCODMHqbEtJ64sA8xLdl8mfY16C7qHtfaLXx9O31D1oc/Qrr2nZ6aYy8cerYSw66Jo4VNg2FZv6Txtz6m5oa7K2icjHh7hP1himePqIA4TTR82ENqkd7FiYqDNUD3puc4YEkltYn6dwH0hwpFrGhCcF+6nTQ/bn4gTj6WQDqb1NVLGx7HIsCfgnRH8ZV9qeA6atSuS+lriKjfPXU7koS/wPAAD//3RdzW9UVRT/vY/56nSatoQWMAgCUhRIFdCQEKM7oyYkSuIG40aNS/4AN+5dsXLjwoUbw0qWrHXjxgSNQatFqRDolzDTzryZ99695px7zn13pjJJ0yZt5715X/ec3/l9JOc/uvQ50z0DnYBS79lUbjTgxoUK60jQWD3Y4ZRfp9J5XuUWGtkxO5E1GaIhSmch5ChsPpKAjl4UOu1VqYDxgAAhtOr0z9P3iZtA3SeVTsKmINbd8FX6QRUtUooRIASACG/gKBp/gEZy4UKm5dxcy99FwYUJzaiMKkfMirGgPwvdbYL1YMVkUWMenLGhK9LpnCiyFwVFgqK89B5NmVSrbABCL9QbnihQISij5naM9EduApyKpr7S3Gi2d8UkyMUAsUJl1ewikuMeeyd9j8gax5ZQ+n14bWhDofGOinxWk2s9RoYZK0Tt0fMffqkWySO9pfEaLisFF30ejdYIb2Do1G6CPut/p+kBcbxHO6bnLiJoX91QSWPZavFxIyZBu6xjdPcxbt/8Ho9+/IMN5rhhgJhyQXStdecqf/DlBbz/2ScYHkzQa2cY1DIUNPWPcqbikyO8Oi6zgZ+toJynv+zEfk8CABOAAeKACurn7r6Qy/IhDDUNXAARU2QG1raRlWT6MoOjh47g0YOH2N5+zL4AVIUnwfYJSGBArZ9j9e+7WL74Ck/PaJJC8Xhs0hhbMaKzPu/c2gocdCYoga6PJwpu/5xRqQIHYkoZObfYhk0xZ5vIVtfx3fWvkf2VcSRTXR+asp8D60CZog0cu9TCO9few9Srh/Fo2mAjrWOQNlizTh8wTixrTt2U0kAtCUUEIjGGxGxIYLoJ5nfmcfn4m1hEB42wOxV6LTVcm6Me7g3XkTcpcSDi93eUPdHYRo7mSwyTmlif0XSYtOJd00e32MXWcBuzi7N4Yek0NjY28efqBqcBWGE6VKZ3KTML+t0d3Fn5DSfOvYh6p81Tbqfhi31W8/hLmk7jppPhszAK2F7q0aHrCYI1grbL8sKsxExRh1nr4taXN7D18yYbMbao6DalX/jyKMZu2sJG0sLMhddw8eNr2D58GmvxNHp0fOtNnpDSbqUe6ds7W/ZfrMfW+5wmcgXOdmo4P59giTTJHJ02JIiFNejrfWC1m6GHhjMnKlShZn3DRMaLBCq04hQN2g8Kv6PJGG8wwS5S9GMyvutg38JRHOws4O6dVZiCiqwBF9tjJN0R8OTfPja2HuLMS2dgmzGDTs613vh6Xs2E4gkZwCQAoM0/rRcOLNM1ygFliRhr0fWWZyUawzrK+z3c+OIr9Fd20KaGX5pgTvWXNS6ptdBLm9ieWcTSu1dx6oNP0X3meazX2uhSZnYcxogpKykSPf9THl5WGmjSTw4H6GQDTPd6OIQcB8wIU6Mu0mKIPOsjrpMhE91GVa46O1yXqBpMff4Jy4eeLASc9QgIiGLUOx2ceO4YVn75HUVvhwEAWMfSsvJviXX0bboltp70YOoRlpbPsAwgKzM2iAx9V1SbamSyXBd6qjpde7aSldguoblH4oCtDBMrBXmeGcxG08hWN/HDt7fw4Kd7aGSQPO2IwSpibRFA0wGw2AYuv3UaVz98GweOzqGsjVAmhcv/troWxf8bJ8aeQkINp783LNVpYWTp+TCLuQOnML3/GDr7nkXanMXQkKmxMxujhAVoKtFYDxpNbCISUz4VepXyHKXCuEBtKsXy8lkeWt2+/SucqtENeFJxjeH3oZz9bh+7wx0snzuHIrEYlWIGXeUKjLmi69rhmYHiQB2uh4XIB8l8zp1Ly+Cn0/A6JqvNCsxjGuX9Pm5e/wb91T4aJTAVu2slluOcmhgNGKb9X1jYjyuvv4Hl4yfRJrCNO5G02j9/tZa+h588dhU9Y7yLDQdPaqLh/3OiAYZm5kMBGV3t5RoutfnQuO4RmvUGFvbNo9VqYO2fNWRlzitEbkQ6J3JGAu8GOwb31lZw+OQRTM3NsMzMRE7aopw2KGAfrA0qH4PIT2nNa0213IouXlTwUpDqs6rGnszQuBFt1MR9PvKsz7EGcAIA0CZYGzJfYQU1ov7MPjejYs+5GWv4ZT8LaQzDKG6t5d3Q1TXUpdTEVR59ENNugnSxyA3NYq2jhbHrBomuLqJ+QfPtGbAio2+tf5VdVdqxhtlFKwYsF2P9dZ5KD2nkmRVFWl853wSXFJD6Y+nM5/V8VTSucNjq4hhj32vQd43artzwjRi4l/56V4DCBuemusUr28ZRVpkQ0/5ogpu+iG3E8d/D0R4ZlJ5r3VfaFjODdcAp66i+pxoeq58AD7AJhJS+Kew1fP/jZRkhy8ExLvhcCsil/RptU9cGBhmI/SaAijLCdd+NKfEfAAAA//98XUlvVWUYfr4z3Lm3A20vBWmZSi2EUFFrXJBgcKEkLFg6rIxhZ0z8BW78C/4BEhcuNNFEFw4YdCmJxCAEFsWmjI0tpdMdzvmO+d7hu+dc0CZ3QVvSM3zT+7zPEC5eOvspbSzg7Es3cJgykolGvO96GUp8QiqSAaZC8eBKRB9BKHW53B/oSicZcOnWi0h9N7afIjD4e8bkTVeK2nvWABtPzWHTGYbj+Wd90zotJBMfDzdI25LBJJ19P1gLE7cIZtCiL4gjxDCPn0Um/gI5epIxhcnDh6rQHwbygwBSvLpJqs86FCMzKxpb/ttJAV3MP1vkutYQSoqPGVLQYcDkyUkA1JBC6T86QYjyJBQc/duQ7ncqVJn+w5KDikwKt7iwkSA7f6uxn82ZcvSdLAN/7ZA8XV249MDaX+iYSUAInYA12oEPGLHx39PDVh71pAkTBAJ8GU+F93RMFL8C+V3vmyDmh95rIT++DW9maa7I8OaBNkOtbbB69TZ+//pnBDvWNb1ke1QLH0MUqy1j0ZwdwQeffYTwWBP37GNsmm0kJQsmlqd8hKEs8X7X32Z9Q6z//GDwZ0XGgPHmf3mgSuizpJvlTrhD7uk+nWY7jWA6MZp2AocrJ3Fiz6uo16bwaG0HW1GAvUensbO1htV7a4RXRD7OyXUJXefIUuG3tr6JqBnjxOkF7CYddrgmV3Lp+hu+Ph4P/fGfZxux3p+jV9Q8hkBEv0mwgV6chRhKYgxvZvjm88u4fXWZctxjic0z2kRxG7ID1CrAsXMtnPvkIuKXX8DdqIOldhtojFB+fETAl6w9rtigN5WyKRj4maZGTLtsCNMtwT7MsDh6CgvDcxhxFnCF85wan0WoDzdx7dF1bGTbQDmGDbljEorjMI11hNSdqciRq21T0lRbAS+2km08tbuIJoZw+NRxPFhZwf3lJ1S4lYIIMXksuEObQdt2qXu9sbWLjfYOjsyfgKnXkDoH4ECT6/trDq3r0iXKrBpNFtdRfQ/OHZhB3R45lhMin1tDXBnxZfUAACAASURBVMFWsyFaSQO/fvEd/vz+GgFl7v/1KN6RqyCXdb4T1vEoHMLomfM4+eHHeLJvHg+SGjZ6ARVItE6AfQwprATcXWWzvGc/zFRmmMYdcMdsF2+06lgcAqacvg4Zqoipm0xme+UIN/7p4oll8II9TkTHGBrWGWecVFA2BvXMYDywmIhDNCN2+W/3MrQ7QKfnjEOHEFX3YXR8BveXlpB1tokNUBKTMAcmsOQqw/rqY7SmWhiZbiGpuCnI8zHU8StMO5sVo3cHVziVXjGIFpKZocpMeA9jQNUdloLdDHs6VVy5/C1u/XATY8612kaS/MPiAdoRQoOdoIb15l7MvHsJrQvvYX3sAFZNFR2KmWQIyREeE8P59c7dPxFhv2cdP+fj3mEjS3E0jvBKs46Lcw2c31/Bm/srWJxsYLpeQ9bdxWYnhY2qsImhQsRandM6sYVO4M0DJTvERb+lllIcEsdkaAzj4OxxPLyzjN7aBkrZDiJXjMpe0QczI7qfu8t3cWj2CDFnnCY6MiklEVFUoEsXSFKUKmUBM/vacqJrkn6VZYq9Lu9/ym7y2dJaTIBZY7Hz9t/o4fpXv+Dmj38g6EAkU/xO3ApUEnr5nhJw4e05vPP+W5g4OEnznJExLfgCzr0wGpU6wBaBdvHBuvq4AVtuoTo2j/GjZxGNvohgbBqoTSJsTqE6OUP+GNTRc2dN58wd/h8AEJBsQAFx38g27JJvgx7CkqV/H5mdQ61Sw62bd9Dupqi7uU4mDaH4cHCxsrJyH1P79mL/4QNI45SSV6xJC/udAiup93tS0Ba+W8gga0Du4m4apYkVc1rI+0n5HaY91NIIU/E4fvvyJ/x15QaaBMRI0I6YAwZS/E/A4sz0IZx/7XW8NDuPaq3BzTXJ9CRwNktzJn/P6Tz4h/kcAEDJrjnJCVBkBhrPHGLNf9FYUIp/LaJECuBMfKnALjGjslYuY6zZxEiljJWlv7FFsFMsd8CAkZF9f/Op82PZwMLpBSQyN7zkKIA0jlhWaQoFHb8TjnWTWE1wxzoVn58gN26pEeaK6TD0xV6SJZ7ZOHh+00eYf3baSPT7Xc7/ixi2UqNQh10ajiqDpuvKsQO0g6zP3J1ZtDnlWSTtNq0Drsnlfb+8jj4rsD+CXLNMI8GzHP1dz9bkwRaonCsTX6TMN9sK81AKfGX8KhhJDHCSsZmCUR8lEKT8TN21uz3X3RNFYofMvqB3Jpr3WDrkiTB3lZXgQTaNwBMpgN/HBqQQCgZDDcX1HoLi/VDxL2d897045NrBffmEHH3dUiQr6KrmhR4qfkZawq78bPjoktM6/A5yBpI6Jr2RuXpZiUyezReLzWCOIeTxrTIVz+JwZ3BiNnO91geQRLYrnkp6P3TmEnmJMQH+petaWuMqw/BzLnPmPpPESZuYxhbblFYjNphapQhSKboV3ZS6ExR/gVvxT7gVN111IeIFF9JFKSgIKpZQaqnVkKaNY5sm6ZyZORd5b+d8k2JgIKTNZM53Lt/7vO9zCc58+PonBM4Yqzv0ewNpNGEzABkP4wJIQwElFW5GwbZFKTYp7U4YQN0/XYWadQgw08z6YlJcghExjiqz8m0Sz9P5wDG0cLpn7l1r3SDWvURRAfYsi35y8uyrbCEvClj35Tkg0VwpR5phmbGZg2vYULIAcr3wjOZnFHPPkRi4J8l+jyMrzFhPKXgRF7LqRaCGM8xe4AtERhpGube/Yd0kXifHc8HVH9rDyTT4Rom393WLRpMpGK3fogTtBrQ1ovNLNB/TtxQ0FN1lvWDS20D+sQQJdKzGMLEcUuw3flF6oumb3E2RJ4yOzsvMJwuWgkpY7JqHzbQLsxZnM1CNv0kU6HtjTew3kJE19dU5XUAmHQtF0VAF2vJqiG/9i2uffwN/cyBZ7DxZKxsHFH+XBBlGDeD9Tz9CeKyDDWxh3M6RBJLTn/qJWoopKLbcssIYCP9fPesG5n7mSQZAhvInzv1hUh2ISRd/VqbqBhjuZPB2QsxXF7Eyu4rV+mkcxDzmwgVUug2s7z7Ao3yEQ4cOYvvhBh7d3+V88Ioyz0bcUJR4UPrD6/fu4tTqS6jPdvE4HRAnm4uHovB94jNL8WUmQIl2kBPdkFmy4TBeuLNKUYRpBVOjKq5/fRVXL11BYwREiTQAPDWC40I1zLEXAMfOdvDOxxfQOr2IO/4e/tjuY9xooN7pcExoQESFxEeVizsBXlIqJRpPJi7knk7v8riCdHOMc4dfwZFoDpG6ZWeqcfaMZaRJ3ZtpHxvbW8jbVXjVgI2YikQOuoc9oJn7aI1Ddpimyy4RVI7deBdpmGCQJ9hJhgiadSwdO4GtzXv4584D1IiVQ1N7JkLlaFDjjhhd5M9wbxPTvR4WThxl80fPdxgYxL7I8iJ6U4CUmfVgYlJlzaZMY+ss0UTo2Ao4KCFimHE85q0ffsGXn11GM4bQr2kKkCdM7yWpQOJHeBh1UHv5DSy/9wF2Fk/gz6SCUdBE6gmYYmowMjSyMdr5LhrpHlppgho5OtPmqVNyW29+hcIyohKnlzzG+bkGViIBUCE3UjOOU6PDyCvA7ThAn5w62WcAbBppx01vFQzHaKU5emmGuSzG8lQNxzs+nqkH6FYCPHocY3eUIY4p3q6GOG1ianoWBzpd9P9aRzDcRoQhzMaMlpg09mQounZzDadeOwO/XcOYgJEvrIO8NGmX9dKTUexLzkQz14ma0B1T7mDIlDQX00/aQ6moiVNMjatY+/YnXL30HTpD0t0LY0TWTuI+m40IO3mIfmMWS29fxMxb72JrZgF3Uw97xGYLRJtPMinO3PYkPcEeX/tCSiZelWyIdjbAkTDF2V4T5w97OFMDjgbAogcsBMBCHZjvNTAc++hv9THKqkhIepHrhMTsBHMBmxNdX20UkKwkD308TjIM/BC17gyOLy1jbe06vN0HqBI1m93voa7ZtG+Qxj3AYDjGnQ1iMq0gaGp0MMs0JL/E9o90XD6nAq1pJHkmEcqo3je0z9H0UlIC5NnLdh9mxJi18PePN/Dz5StAf8R+CCZf8rlhJVnyvSrw1rklXLj4JmYX2hgkMfxaJKlA+r/ZqkAHFOL8Xz5nxazdQy2ocENl5DWQVp/C1NMvot47CURzgN/idfDCOhA0kScBopkegizFcDSQ/cUc6os9Nig5OCSD86TxyVe7RlLKpiSNVOpYUlJVu93F88+9gEq1it9//Q2DYcpMktBzJQQ0yctx6/ZNrLy6gnq3gUE25OZ14UWg6RliJqnSQEs0cGSWJl0VKcC4oPdCfZmq9TrvG/neCNNpE7ev3cD3X3yFdhygmvrcGCNQL+ktGWp5hg5ynJ6d53i/1ZPLLB1gOW0gnCyKHwwN0PMapGramhemmAJssnKE4JcOGnRjeQrefAO3ytI1xpM1OUpue5na4X55WabVRsYSMa+QUQqYoWSJVjXCgZlptBptrG/cxyCNC6NOZs1k8kykZizdm51uB/PPHsI4lPQH8WUoa5MsNRZIOTArU8ACnbiPC9avS/e24ZrVvpFGnrN3lMoJAjcZzCbqk1CiMNgzY2+rsfnnjibcpLDEMk7ZLDsp6kuXRWwMAMMF3OTTpJWKpgz42hywFABPr00ZPjn+TVbLeeYyL8Befs9tnkBN3ku8YsDzCRbJhFzZ9V2QVLVUB7H8TCrizIXiT8NLYsMQ+Jfpv19gNGY20LPNmLd6rhJNDrMGTiUSUG7sBFtbwX1JSf8Pw4I1BdcsHKVRegH+nWGF4VnDEm4ku510GxwWe6Y9AxXIl6lzcg0W15rKFggfmc+aRMXbtUPSx4SP0Y6Nvfb0fcVzThoAtgaGS/l6INk0yQcUnxOwN0xnUZGGoQ2PT8hW8hz/AQAA//9cXctrXFUc/s65586dm4lpMnloaq22edg2xBapKQgtFrRQEJEuVBDFhSvxj+g/4EpcCS511aULC126VayCpQ9Cadpa2qTJJJnHfR35Pc6dSQkhFJqZyb3n/p7fIzr39YWrPBFQf0OGjJdyyKghIY5MmPBQNrQKLfFVUGUs1eoiOtC8Bg64VzGIwO8IiSz8ZN/IUiZ3DJ8wGIq68QVXLpOX0MFbokjSLDsK0MSxCgJw6jtdlSqyUKndjuFthotlAy1WqZWKDB2cKNLF9jrc4M+v0S/AwGTbLBeYGs4wnAgXOQgmjorvSfCq6kmRV6G7gHwYvS7Bs3F0whkCdRILRJAeqErFtwov8MNSaQ7Bw7RScT+CYbEwh8KPg6qmUY6XTNjli5sm9cOliTZZcLFKKgUAFWHj4lgFSayemzIIqozYywYffUrD1oUkXiFJk3oYxN9emmP5/1WdkASW5RnmF6oxEzhodQKQIoiKIkYsyBsfEPOiv5MKVjo3zL9nW7+qdgooK18Ho+DJbMJrcIA2dfJkJVK+RjoZZfiiKMeHc1WwPUyztj+JKDCqlgI1CcTHbmQRpvpN3L7+B+7e+AvNvojfESSVVOV76tpAlkU+Ba588zGOvf8WHtnn6DT66JqBQMfrtWXJHNCDll26ybGorcFGv42egxefRzPEDGuglqrWqw4H/X2ka1AyD9OgV2QgFmyVA9muRyubxGLrBN579TxWoxXMYwrTGMchJJiNZ5FPxbi3+RAPes/QnGoBzzex97DP1oC5D4UehrDuXoadbgcLayvIEm2gufCNWE2a/QO8DsJo01PkIqKiApsSHwQdUnoZgrkkrv2fqWBLSoc5M4ns3iZ+/f4Xtv5jjrZu9IRYYdGnmGOA6RPAZ1c/Ret0G/+hjwedbTzZ24NrNtEYi/l3puNppHmCGddGWiU1r56LAOJCwqKLAf89eT/H7tY+0r0Il46fxxwmMPQNCTBMqGQZg0UxNX4Y/9y/g6fRDtxkgoT47V4QCoOihzHyji5jTPQTtKNJxGggH5QMVS3KjKUbXSyCXIYSyHiKUyurePD3XexvdHggE7zbSYCP+Z70XPQ91u/dxulzZ9BoJQypL/izRczBTcjDuAwT9WjEVks+ORceXvyRA3NG8Su8M47YntGgYItCuS+dW49w7bufSFCCGxga+pC9K3PcWMgvwQ6hfk6ewfKX32Jw7DS2XQtZ3IRpOH7GSUzQ5gPM2gxL48ByI8ObqcHimMEr1qNJokl9gj9HbB9IwzfPmz0PT2KIPsdyy+Gj+QaOKnya8lJkpDlOdMi46SzWn+6iiwRdLcrTMRX3KitMWYfXnMXaRIQPXm/g4hSwmgArDeBICmzBYGNzB2VF+ikWEfnme4dm6xAXcVsbt2CLHdaE4P2sdXUj0ssq7GW7OPvuO+ggw35FnGxXW54ZRVSJT0BYqw99lwWuqcK9sDU8m2ML67cZxGnCNoRtIkSsd3Djh2uIHncRFxrHmcsoeiyO85JFJ23jjU++wuzlK3jePortJEWeOobHl17QGRUCXc+reJuA1m0lqKjI6E85MNzcTJguVsczXD7exqUZ4IQFZiGe6ROszwB+Dg4b4MihCA4RHm/vYWeQc3MowMdI3jvEQi+7chELtHVc52cwtuz00CMhxtk5zC8u4eGfN9Ho5YhKtTTlT+nEAI1qoarC5rN9jE1ZLJ9aQhaTK8cArikCy0UmRR69RZqknLBIfJPyFA11xO88Ym0Htu5kSplllB7l90FRYixtIcotXho0UdzZxu8/X8fWv0/QGABJJANM6LM8Tc2/AS5emMPnX1zCkYWXUbmgdO2Hej1BPC2KVMZNbSV1MBnoLKwwblL4ZB7TR8/CthcB11b3Ds0fXEDRazXYocBNHmKqyrPOFmwpFA2+994o6NuyhaHXIXhpg+1oVQseYsStwwYqUGSwvLyEXp7hJtE0VC+GLFTDEISmchkV4siwdHKBqRlIHedT1uMQ2Jw2ZFb1GsKQaCiCxu4rXgatzggSkdEMitprNMeY0zJjJhE/LfDbj9ewe2ebI3usJQzrtxnP/24DWGyO4cO1NZxdPsmvmWWFNIilIAZDHcL1JTfcJcfmYd0U7hPLD4ptX8lFiTz7hBr1KhDKLEFyyjBDbb9KHZX8yPKgLiVsrTvCX8EH3hsVdxwijFCL8XmuP+amZzDuHDbur2OAghFTYSiRkKo8aVN0PTYePsLC20tI2y10+zkPcwCjYuNg616+NwjLFl3SaaMbNvlBNJObeqXl8vBda3CuXZ14rkfBzg2KJDPCxY6M6JdZFXGGNpmMgCbedlFgFBVjRhtoM9y4OxvqY+Fox4yak8UT5b8sH2gzVnE+Dr2OoKFVA4HOmKIgfKkIokpjxAgi+UV6crAcDDcyiPVBt+yjDb/Xc3UQoayFmFIRvHL62VnJiJ0qXTn6NVGYtwrrD5RY2dTT+9AgJHJCLeZNuSIxDi48rboHFHW/FdAfoWEN6O9KBxOEnvLKZxd/f6Esl6pZl/UHnM9oQeLVoo9Qv1bvu+it6BKCc5cgTSiW0GeRIyaUcNZ54/5heI1Zc0o1CUhTju49CyiHpBGGj1oLiG2uDDlGe1Z2lFAaNJ9Rhf6TjhMPg8OgRPsqca2i4UATMcc/etbI+jzlQQG9T7hW4WzQa1OPHbT8vPf4HwAA//90XUmPFVUYPTW++XUz9MAkoM0kKiigEAwBN0YTN0aNiQtjdOEfcO+fceOKhQsDicqOEAfQBDUEEbAbGrpFuvuNNVzzTVXVtL6EKV2896rq3lv3O98ZghOfnPm8UjVIV98uOMpClU+WUZZIESE5njQ0vhpo5EqZME8BHoSZGdRBOqZeiSZBnTrpZMnwgApbl5dxHIJqCK3EohsCRRjlM2jwqY5EFypz+BcZgqC+3PUPSjPAqg69whyWh4pR0LU7ypPGdP06cSwNIFznmxAU2npjGdhnGCgQVCaoDWwxtftvp0i7BsZ0sIgLr+KRgCd0R2YYZKBLykwO09mW97Lo5q5DwCrXwKL2cot5LKUMBcqUyoLkKm6sUDdM8YHIC1+C4nhI9qXlyPtemelv16BkV7iC/i8I2nrHXf7FJj4xv2dQQf2qL9LvsDFZIK6qRt3ylGpm3gVFUVh5hYF0wsyZtRqV6KmRWHWSsZFiKC6kYuBXMhU4VWLsEPWA5OYyLn3xFcLlEeI0KLogQ+0203sNfIc9x7fhrU/fxVKzj8e1AYbhiE3A+D5x4HG24XyrrycBLqNQrT/G+9//D8/MbkRSIBNGaN2Mrka0QDmM+w71pIO57n6c2nUKc/4eTLsuWk609WQmx5vHsIbWzASWBivoD/uY7rTxaPE20lX2/ZJ7q404DqUbAwsPFrDn6AF0ySiINhC0SVaquJ9XKZBOzUpDmKTM6Rrj6wPMGCe5xn9SV4G8GKZGDfxw/jtcv3iNzZkslTJXKQZt6Me+Q20n8P5n72DX2b1Yrg3wdzbC0qCPNdpwxBHa7S66fgftXg1TyQS2Yyumgy2opyGSfiKxY57DGsYY5JLxTQBAuuyww5/F2dkTmEBd4rL0nErNpbwoTDCgArOW47feHfTiER9N2d6UxdwcRZgatXC4/QyO1g5gd7gdm8NJNAg8HPQF+HIJchqjac4Fex7HaDVb2NWZxZ3rN+CtjpiqHpbDQKQpND6HGeaX/8LRV44hiX0k1r2FxC4StdljFobEbBpVERUn+NDMOwn8tc4Fzx9f2CTURUgCtB7luPzlBfx5+SbqI/VjMJUX0z9rWPNrCPcdweH3PoR3+DQW6102Asw8jSWidJbhGK1shFd3T+K1uQjndjbx8nQTz22tY9+WOqYo/51MS12KQTLg7nlUpzXHQ5Q7TNWAI5MxznZ87DBqu5pI8qbay9gRoF8D/lhcw+IQWEnFFp6lGckA7WyE6XSEkzN1nN0OPBsB0wA2IUEXGRoEorQC3H7Yw2rfxzAl6mXAYFcYtbGl3UH/3k2Mlu6jFqTMZhAJgy/FAID5e/dx8MhBTt8gSYL2O4r8ev6uMrkUkIZmQ29kBzFkTM8vApl9MwHM4NZyTKUN/Hj+Em59cw1NIjlBOzFcLAnNnMCUXrOD7efexO63P8A/s09jOWhjNaTkg4xjCy0HXgNASsaR/ublpbYenO4iwFwz7+HYTAuvP9XGyQZwCHIta+yTkXFyRkTMHvL6gZgSdjsRHqcBFpYecfyji2o83uCewEfFQsW2AMWXYrwwDpEEAdbIFb87iR2tTbhx9Wf4gyGa1lEqedbMzgjiDAsP72Lu8D40Z7dgROwtJwav/Gx28sylhkvoG5tMWX/JWPYh3FCReF36N0cxKs039mLUkgjxmsOvF77HLxevIBoEiAkgdXmRtt/U1IrjByfw0cdvYM/BGZFumeTNTMksWQB+EcVXrgLlZjbnYjpGFm3C5M7n4XV3cvHPwY9G6PMUZCr2FmLMSBGv1BhYebiAPBmiRmyQJOOfSaxpIAbFmp4Az214zrmy8SnPI2LjNOqY2bYNCw/mcfv2A5Y0iS+DrClh0MBwPMb84l3s3T+Hmb07sDoeShJLVha+TselFMxlY8PkChKZKgCDkdA4VYBkIkHEa6rrZZjox/j9259w9esr6GRA3QX6flLA0u6HzEz3hiFO7z+EM0dfwmR7Avk4F4NVXwCXohG07m5QIZ8WF4ILYUjMLdTcjiYVO50rWuLMk8sc6u2+K+NWCJQakVF5rnpaDxS08+ImbHTNN4kAgQFUnNBaPzu5GYPBCLcezCOBRWhKIoVgkT5WekM8zh7jhRMvwm/ESDRyMXdWYFvRKp+Ru9Lkz/aeVUYjH6uMHotJK5jCpoPXwvPJPTDURI6KSSuK/UoSl5kGVqW2JmOtdssjlYua0TWfDzWJqD5Rti0Xml6pZ68yhLNKl9vAheJPOclCCm0SaV+TuDwznkuz4hpU97d23q6QAeTF7PYrhu1VhqgBC7bnT5URZuylRrOpNV4ZS1jtrvvq1cYpYpWaKGXZQ1rs+230iZdcrvWL1HxxUV9JHHmqJsBmJM4O/1pnmollrsZ6xmY3RsIGbotKis1ojxucdG8TavZKJ17kxVrTaHoa/d0M1lnqodecgU0GniT1hb6rsY3F/V++u9UoZS2n64/W0pwGwRITBZZV3koGpDxOVD5BP1tngk0GpxWDdaNi8vjwPPwLAAD//3Rd22scZRT/zTW72Ww2xubShCbpNW3B3iix1VovIFT0xScVBFER/Af8U3xTEHzqg6gPPij4JD62IBaqtkopStOmSTabZLMzOzOfnO+c881MqguhD0lnd2e+2/md3yVY+agEAHgglHQGmvDkvF1DhKQ7bQQ1Ugq5pZ1GmucoevMsY5dCceO3hyXt/FZN5wjJThJGt+V5OEM7h8wUbqBCBh9tiGnGDt98sJeIupGYHVgtdZWpEYX4DXhCp1E0DxUDK2dW6KHiRFkxExO9BevxfaFvxBK/YCrf30jcVeQysSFFexCoFscTV8eqTqfUb6ACCGgchyJhOtGVzqHPyy1gcqCwBSfdH9mg9i8Atd1EFoT9v1fDIYcuipFhmTxQmi0qLcsd4DxxDhZtlGr9XQHuKXGNu+t6LZ44zDSh8RXLhOT7V3FVFV0MXYImaJ2vVb5K4IjBAZ3I7HTN76kmi0/cnwqIoT4EjDYbifzYB6AY1qQNRbME0TgqhTIsIoynMW59/RPu/3wHo3lpAkRoeiPiMZ9QR2nGx1ufvA9/sYVuNMBuOLCUf5u/rgcj0ZObCruk+qPju/oZaywKr+6dYSrPTk+/VrduHzUfxLygsIo++yx9D4PtDGExhqXOcVw59ByOeguYRAttr8EMCmuAFlh6cAsBpsMJTM8dREpod9ugiAw2764CO1wEsBzEt/RTu/gCWNtZx4VLF5FGHBNmv4Fn1KKqkgagvhv8DbNCTD1lsc9kIybgguLUKOZuJuxg+Mcavvr0S2RbmdW7My2ZzPPYMIzM/IJJ4MqHV/HMm89iK07QMwOsp9t43O/ZrnGOCKHXQjsdw7K3gOc753EmOooTwSIWo1lMNaewur6O7t4Ae1TGxwVSP8NeL0Gz28LK3AWca53EGF2Hjn2FaBirk1Q6VE0vtofoGzt38ff2GrJkgEYKjG8HOIl5vDp7FedxGocwiSmMYwYdzPpPoTApdne2sJf0kWUpmlETZuhZmUJsQswdnEZYeLh/8w6ioZFcZjFNswUeY0C9bhfzSwsYW5jGIOQuXaZjiVg7tDGKKaPOMX0x8m5EopFLHFjAiQASzUha4dHEx8aNP/H9F98g6gMt32d2kFKQiS5pAux15rH8zseIzr2EbrODgXRg6XNmwtxBMsDh0QBvHGtgZRw4Ai2+gYM+cJwMHSc9tFsh+oMEvTTH9pALgUaeYCFOcGV6FJdj6qJyEW07RzJhbBHn+ZZevWYi3H60i90isnGXjdBgMs5xoh3j5blRXJ4EjlFEnqGoPNL+51bW4EnRsZn6+OvRAL1dcYD3qBvsYzxu4Ok8wOa9e/CTHiKTWGDNUotkHSWMdHX9Ac5cXeF8QqFLh04vynQScaKouZ5XD65GAIBM/t66zhdAvzdAB6NIfl/DD59fR7CZ2RxzT4IoKVSPYAcqxLcpf/nii1h++wNszCxiPW5jy48xoDXDZwkTdSBtp8hU1iBP57eKj0rjw5Ri60JguZnh2sIIXpHiv2M4drCQZxMoKdru5dxtbdPhrhViLyvwYC/DjmWqSCzd/0kNamuhgD5aI+UGzQNTCOIGNm7/injYQ2SZGUMpN61Iyl6+S9KopsHi2aMYRgapYfDUZOzUXogBmMbtupSZfOjitlyhWXB8VGa7aBG8zLfP5PFv/+DH698hedi3jAR2xGcbvCZ8tGBwagZ4793XcPrSMlKKi3V4T93DhlcdmkORvZsULehL4WVBfJL7eDH6fgfNqWOIZ44AcQeFDeTUODIA+9wDTeEJpT1GozlqVeFZfxcj5DNCO43zHfCcE71S8WuPwvmUMTwLkVPRfZmYmMDs7Cxu/XITmxuJsKZ4BA1J0krSjN0c2/0eTl08izywT4lZAHoWpNJoawAAIABJREFUEt8Er1Ls1um/voBCLGMohPpsaf1+CJNm1nwxepzg28+uoyA5RsFsAQYLcpZkGGZlXJo7jNcvv4DpAzM2ScIbUhdyxCVMKE3fGfY5fwIGEsgImK5pO9P0mXKiQ7OvRSnt2/djfN5vCx7Qdsy476T32d2R2n2HMiz/0x3SHRWtdMz6HbXHbYLF6oOH6PZ7GMj8zkwuDDDP7h9rGxuYX1rC2NQ4Um+IIX2uKKywP+EkwFwb6LmmnrGupttqfJZXGlW6xjGI82TzxMmXZX9yju/C3FXJcSTnffWB8vZ5fdFrhEA8MtqLItfws3Hb5H6PMpaQ6i7rbi9yAAUDUImVUwBE38MANYCu6nFU/k3J5DAwtX24XOAU9GK/Lu1GD50vVz1pQq+n53ptqkYSSwcYZ15XMg1K3wKVYhRSoDL4oWbadZY4RWFTN9smNgjjmuMXuXYqKr4pVfAlkzg9jaA3pm5EnIvUqto81f9rGcNy1rcnACmYNY6vajCtxo1a4LvfSd2q19V6xaWnCctZJSVaP6oZpX5HYmLTe9vYQWGMW98fARKiiOMMdXxrZ18Z+DoO9F+NmrQ1qO/jX76u7TeKKoz/zpzZ2Z3dbltpS1tSCoVAgQQiQojEAIokEBPDgz745qt/lK/6ZMIjL17elEgiRowXFFCk3C27C+3eZs6Y73LOTBu1yQZSaDs9O+fM9/2+32ULAGBUJ02NkUT4SQEtkTPSFDMyElAgoaqIF0CmjX/ZUPMPHGcynVXUrYogeY231+nS51nLPc40vkBc5OkXIRMMr4NhtGgsmfv8vTV/PjQy+gZAGyuJXsiCwV5okJwLSJ/ftC5kWOZK1xDdunNVl0b/EDBq9OdviNKVs5yWu9DoeqSyBABy0bW7rWtW7cp9Bn/Y0FsOflPqfvVPjxT5hjicD0V5gFZ1n9Xi3F8zrfGIETILW7Phvti+UYwaSmxvvGmT+lhEqpCremwUJV3KRiUS69dXkhlKp0rZ1K4SK1LJTEbgRgdfhHCIKzUXeqjRz/bGiWzeQ2vKaKsUf0ELVn1AaCQL06NyMevwiGWIa9kGmvhrzrxpSRR8bDlvvZnVMP6zi+ufXgWeDNkJ3AanY2XgGIqeAt764G2sXjyOx3EHL2p9bEYSE0APegIAOAIrGAH910d1Aost/7dQ34/yHig0HknWVeADb5Ck62oVqCLa19hhSE3KoI69rf04vvAqDscHMIM2ptFCRgY2LB8Saicdb2SalqKBJEoxOTeJYkJiHUcPe+iurbMrt8xWbDmVssCT5+tYWtmN6d2LTMMfG2EhWJ5elCJnoYaBmSUSJakJIN41WB/UjD6TRt7UkfYKXPvkKu5dv8v55VBaMmXKk1I1rwFZAhy9sB8XPrqM4XyMLvrouD5645fo9Tfg4gaKPEGat7Gvvgdnpo5iBTsxU7TQhEXTpGhjElEzQbfTQ6fTw3BjCDfKEXcsFjdn8c7B89iFNhfrkfOc5G0O++wcHCMimrWx+Ln7F3699RtaQ2A5nsGZhWM4P3sKq9iPaUyw/CJla7AYTSSoJxaD4SY6Gx0GSaEsGuIBMyvH5FhaWETn9mN01p7xexYVftJgGNAZadzWL3d/x9GzJ+GaMbulc9oBUwTEpC7WB5bn5PjzUc5FYRMURopQx2cZTRSdgBGZwXQ/xlcfX8H6T3/z9JK6P1uUzWCGBgaNHVh84xJeOfcunrbnsGFT5JEYl9G5PCA03OVoFgWOzDVxacViJZJJ6CTroXM0ihEmncNUZDFNvrZpHc8HGbovXqJJOtakwGuTEd6cTXCAqOWFMBuELuu5EcLGosJ2nFh8d5+SFijGyWJnGuFQO8LrOxOcSoE9KiFoUGxdJDRi6zSrHsBmrYab9zfRGVEBlTA4MiLHfVPD0uQsXjx6iM3Hd1CjVAB5nPvOUMwze10sHVzG9OIcnxdiYqgYmDbJDAAwxdT8axHEz3vNS5ciM+Jm3Y4tJgcJvr/yJe5duyMpGfwlMqlk2Qw1QiTlWNiL5fc+hDtyEmtI0bVNjKKEQYXMG40VJbDsAuvG/730LzBOxq/ULszXHM7N13GOgBQCcegatHkJjaE2J775l8QFoGmBidkGbvfGeLAxEotMZ8MXblNAaX3so8/o4BEPETkjLXq5wfLyXmSPn6B7/wGivI+YPBqMGEfKtCbmSdmj9UdYOryM1vw0Jx40JihXfyAsOqYdyzU0m2k4tyXdRMBOKfCUkWdJrpmivzlEPYsxsRnj5hfXceubH2FeAu2kIZRvDgI1fJ/TPff+5RM4f/EEirRAwRKdat2x3QFdDSD5HVWtfiH6bLpXR2YCaC5hatcqTH0KMC11ftiKmZQPZZGRyL/U2CcjaTUx7K5j1H0Kw2wH8e43KstwpghN+HYsJjSrPm5U01aIgTQ3N4Na3MCNb3/AOPPfMUKaNHjf5m6MZ8/WsWNpBsv79mBIsZN+xK5gvVH9f/VjCwAAkTUalQnQXukPhmjEdURjhymX4OvPPsfajTuwAwKoIjVUdKz7p31DMpXVVhuXT5/FoaUVrhfYAX/kKsVb5XfXeslUtn1oKohlS/VzEYHglAEs+gRikxu5voY2Ll8kRaNaUc9pNvGN1L5Taxv2ZKj4P3hgIEAK/wMA8CVmQnXnGNXmBNK0hT9u38VLYqBVFP1SrBoMBg5rjx7g2OljqLcb7KFkanFI9wlyRl39yt265RyrRkqbigyXo5grDGAEeTFCk2tMSV2PKjR1Pz32wysPLoRBmK8tstLor1Bavdf/+zhqq/o3X1sTyzSOy7g9q/5iUWVfGgUnfMY90+6tCabjvgeQbHirhny5GO2p7n9rVB5K88PIaNKAp7zLU80b8PnI2FylFXSRuZoKx9rk5+o75nTijqIElJxKsz0rgiPoVHrrtvVMDHRYYRS0263Qj1EPQH2F7xfofvDTf/+e86AwtsEoPfZ1n6n426gHnAckvF+AN8CV9RdpL92/7OOgA0IP1viEsiqLIIBKeg9Q3+qZAywL4F5aJAMMtFCNmQsjmT5P185gkSY+iLeaypV1MO9f0t9pQl7Fv600bJdr5DUi8EKlCyQHl3XOEUUR/gEAAP//dF1dixxVED333p7u+djv2WR3djcbCWQ1WZJoQpKFBANREJW86EPIiz/AJ/+NP0BUfBeM5EFfVMSIEJCA0Rg3Kkk2nzuzu/PRfVuqblV3T4IDAzvL0tvT3bdu1alT5zAAYMSXUZGU8oR96RNvQ7EXyYGMeD2STcJI1QldKaKhfpi0kGjRgecV4oJ+q6Jt7JMoF58FbpKksPWD1HeUqKqavpF5cSMKksRQ4AXE6FnYQBUNETitUL7nMQChaCt6l/lU6DFRSXWSa6CbbS4WhHTedH4aHOhYzVaTaXmjire83pQq4lS1/tNOvKJfGEPfX6S5qVhHXhkVULSIqScyc8ILVtCogmVhyoBV3eTLZE+pQ+H+qaCE+urnYuGliGpBd1E6lR2nxOv/0Hs4EtE8I+MJamVI58oWJESZs2E+J1BV0jGBv+powPMJavGAVGaalJGiNJ1UAowCTPS8qbCiCkkydUt8SDUIFduKBLpiQ6tuHmP8kfDKxKpFNwpeuDIyQ/X77LCOX6/+gNvXbmKeCum0GE6ULShHPwKmD0/i0oeX8Wx2gCdJD3vRgDs2xgTBv8zJX3tfwF7KBhl/leAWpLCvZlE6cx9OIRQxUS3YuvB1YqpTSKp4s8lyAckMaHwt203QiZZx8dAFHI0PYwFttNDi2UMXVcEhK3t3WMPU+5lzs5iZafMavn/nL/yzeRtmR+bOEbKNOArxJB0A3f4O1k4dg69H6OdDFmhjr3FOWYKae5j9R0XMyRfxSpVTnbAyEk/d/0nkf2/j64+/QLrlEVsnPTywNVlOc78uR+d4hMsfXUFjbRHbUYoneQ/P0m30hjvojzIMU+oUT2De78PrK2dwDC9hlkz7yMtemlnEgliw8zg8cwidmf1I9hK0sxksjeZxvn0Sp6deYYXomIec5Y3y2ahEBS5AiZ7Wnm4j29rD2y+fw1tLG9iIj6LDHgIxYgThO8PztKEz14TF1MQEHu918bD7mKnd3obkNXeGxxMmJyYxU5vEzZ9uwPU8GmIsr3GXYgIJfz3ZG6Cxv4mlQyvokYJ4jfYHy1oBsXo5S9soCANaXu+EansRfbWsM2OkYA86BiRa2M7ruP/zLfz42TU0e6y9iJjofzYSRewIXdvCYGkd6+99gHR1Db36BEZEjbauEFeyNQc/2MOMAU4tN7ExD8wLVdyMgAYdkyj2NteJX0zEQNSIGfhITIr1dgsX98VYt2FWNzEv3hP9FYNXEXCrn+BebwcN5/Ha8gQuzDqcjoElomHT2DHRlW1hLRHisCQfXQDf3enh4dBxpzVnwMexeX0cT2Cm1cC/N6+jke7C+SFq/JyE71une5MBj3Ye4+TZk8hrlOBnwXbLQlwoShVvFGr4zz1hsl+N0rBf0t/UUoNpsvS88wjff3IVfqvPVmZW6bxsQZmz3WI3nsTau1dQP/8uHkwtop9MI4vrpc5HIdQiMK0AjhzdNE5V+3M8p5vB+l0cm6vjnSWDEy7M/Cc2KLGzNkgZbYrREiuMkYivTxD2xL46bvxxH2nURGbioug3hWJ+peLS9pgP1lmZxNJgwekQmRoW5w7iz+u/wA+eIsl3OU57Iwr8omdA137oMqwdP4Jdk2JoQxJJeUmYS7Xy3FppFAQGQGnrlSNO6tKwIFE4zzoZLd/AcLOLbz7/CsN73UAz59GCwACIkDLT5Y0zy7j0/jnMrrTAKghiEzX2HI/lCLSGg1K44+OFHIGp/97had9havk43OQyTESCf1HQU3geAMgrH0z1dzVGZxJk6N6/CzPqwxE7S+bQWdzWpyKgPP6GfA45UBZmp0W1MXIhN+0sdPBoaxu//7ZZPEl5pUNLADaNCpw+f5bvRRYbAcANs1hsJe/QfKQmc+ic33GuxYi1sF8sXC1B4hI0abFt7eHbT79E+mDE1pgNbm5kfOy6A1oeWDbAm6+ewsaRE2jVm8gHXsZeVI9AhMv0HRLCIrfOhjmD3emAnCIyDFKL7VGOQdLELtGxD6wAnQ7qB1bRWD2I5MAqassriDpLSBYW4ScbyFsNZC54i1BcH2XBdjeXBg818XIpgKx2k6ssmf95BUkmzeEMx/r21CznWnc374orDoQrE0AUyi8IeJ3rTGNxdRHDKEgcB0G+vMiSIM2b0re+fI6rYmxOnLQ0Ny6ykYLZMC76Vv5cNticNLm8H7f9g+S5Wmj5LMRKX2kKqhaBFSavFcu7rGLJZoTeziCAiPJp99Zi/Nxysd82yq6TJg5krDiV4l8BhZq47GiXHcrw4gI6CNvFSVIAGcG1wAkbNBdlei2UTWHBp+dDIn9an6g4nZdxWQhrIbAofGH3p/WmF1G8Ug8tnBtb0QptPa8ANL7CugB3/oOgHuWrRgAgGiU3KK+DM4EqX1okBuZ4YCPL+Ljcy8JaUu4xFeL6PXiEuEYjcEOh24dcudB1E7eEfn+vqLeU4U4vBj+kfmBXtySMxmjOro1ivRa6ZijeFM3SyvVRJhgBmvR96HzqZFnIrO8ArjBrSNnSvJcHAEgb0VmW4j8AAAD//3xd2W4URxQ9Xb3MjIexPWPDYCAI2yCyCByMoiBBSEReiLIo+YP8X6Q85CEPeYvEEwHxhBOxYwJIgD1eZ+vuqujeulVdXkJLCGMxS1dVV91z77nnJJ4SIX3ZHtg44EWLrDRevZ0VKV2WQWts72wzwE+5F7jwQNmCqthXYgigu74KIyIHFMDT75gB4OwHy72QilUQRXivEDGqQiznHEWcXpvWbfaKK+Ah3VSRH3b17ySu2AxMpWOho0p5kXd9HqiEa0y0cDOh+cfOVkxFfiwG/YFsjFZd3rUHOIZEaE9mM/pVJsduXioA//Dq/VXmz/isXnhfVpXf9tOStoJdwdXnOLuPUkRG/PuLEwJdOc/HwR28YH/vhMdZIehXcVkmAVK8QaXZvvkKaaTatnXsu1xPDtuGBLoJIfAOLwvSc+9BHV4kBuYYI7kIwJFuASuv5pY6Q9oSzprSjRWrjse2D4mTAs4BQAc0SNcz49ZOUmUKrZUk0fSyQ79zeDnxJKpqjl728Oz2CvsAJ1ztKH0NXwvVepwAN769DnQz7CTrGMUE/kmgLIdyAtniFqD2WayFayecE8+8CWxsXKUNEiBr8aovaYyEpVMwDYkSdTYkKvngjTEal4iGKeayU7i++CXOJfPoYhYTBO0LiFuAOZAiYSBR2rVasmDXEUx3ZqDbGY7Mz2Dr7RpqudwjPZ/Uh65tD+/r+8+w/WIN9dYJJLWYxU7AB08sYFl5HRK/DlW1HlMK3uEoUSWiMaB2h3hyZwVmO0eTRHnYNzVikTBamUNTYtwArnz/BSbPzWITY64WjVXJlUyuptIazjWSQmPh+Al8gC4m0UBGwnOSIKYpqXPdi+yeJjGVXMD5U4tYxwaLNC0mXXS4Wqc9bXvvJLoBrH5Vh8ICOvj502/Qrk9xD3mDA37FwRxTX3X1OmrCIPbFLNo42ZzDo7VV5GUPUaIR0bNArhO6QA9DHF06jYWvlvDqt3soBjEzLRhEwvb0EnuiURS49evvuPz152i3JrBJ2gQBZdFVN9zl2sQcxZmEzTjE4dYBxdXOuqohJaGe7TFW/rwNs2F95W3rm/aMDqgMO1GGuaUrKI7Po582oNMajPLkb3tWUAW4NAzqqbpfg7PalO+oHdbUqKPAjNi3XWgCo5ZCTxucnjCYjyOm6mY+0ebu0a9skX+zKutnjiV4uGYwO5ViqQN8EtvKP63jLNJWxZ8fD9m0le3VpjXifPT9O1NyIiOHBbIEBaZPnsHM2UvYvPsSabSL0gw9C4HGkFo3Xtx7jrd/r6J7dZFpz8PSMrqkSxjeLOWQfcItN3pWG5LINYVh7Qc1yPH07j94t7qB9p7XS5CmYqyXESY/vozJS9fwrtXFlmpxxZHo+6XVNJM9UVgPkb137an/7hwxPglA+2KdlMXNAOemWzib2kROZvkj/D5VrVTcUPys2ECCfpo0JPoILCjgYncKd94VyJM9g+BboYzn+8OfA8aRLRTnYxDXYqyPU2QnFzB18yds/vIUk0WP/2PGqUSFxMSg0CwdaazeeQD9Yx/1M01sUbxA/tgUyFLyMrE9/2XA9ksCa10lbXGuGMBnLGkyDHM8vruC3vM3rJtBCTRjcknM2Mr/iSPA1c8+wtFTbZhUoyDlem9BvFc8bP9ltWa19MkrjAuNXWozT5pIJjqULWPwH/kmFgjHRB26zvbsadEU4tYxIGthuLuJmJkQ7ix27IfDX251g8VnVXRpoihHWQy4ct1pt/DdDzfw6OEz3F/516YnjG0ZoPmgZ633dAP3b93D4s1ljMoRr8/3XSH70Ah7yrpHCEuGYsLdPpomw6snz7Hxus92solQkak1MJZ1RKym+ek2ls+eR4vEggfkZ19VmX37Xjhk0gIbaStiSZoym4MRklqGLfLbbzbQ6HbRmDuO9vw8cLQDpDWiQRK3udL4oDhbj5CVObCzA6xvANt96PUe+vRnaxOFzjEe7qKZSkLV2adVdZf3cg+tkIa2SvUo+cyYympYXvwQKw8eYuvNY4w52W5436SvRWw5YsX99cctXLy2jDhVKP7n7Q+0qx5i48fYwqiDsaWq/gp74SEV8BAXQWKRA7enIt8S4MSG4VzPmNlWvdZhBvc8J/JZVNHm+JbU4YO4s98fWNvssvSf52I7h6NSia33x3uEwzKJ8S0T17p6UezrLdoJzKtEqusVLZ1A4aioWpYh40PRmq2yF2LdrXzhDoJHIEzLVDBao16390dYRO7bxWZurGOvlaZ8i3MUsLT3J9oTsUKni2J7LaJ7NJFlEPc5nEIYx2kNuDkdDoZ+DCzeDAp+zh5RbM81ZdOlJZ2m07oV2ZZywhfO4Y7tJxkfWOzn2Bzh5XAvnXc0LraY4gqKNkHjdM78/UviKbw3N1ccRxHWHhVoNCawu7Nji+/EeBY8E7YBRILJuSBJ50ec4D8AAAD//4xdW28TRxT+Zncd24lDgmPIhQYQoDaFVNASKag3lapvFU/9nX3lrVRqRZEKiipEBYFCS6HhnhRInOxtpjrnzJldO67ESCg4l117ds7MuXzn+xIlQNOLC8u/rcn2VTfjqk1kBoJJ40kSKNPMzJW2khyQ3h0TCBm074C1Lm3JwTMZEL1WgoQ4qbJ0ztOTaiAdR+LcK3sjZcA5cWFsCEhDxla12WFrffw2/Exfw+swKnnh8NCM1XBGz9X0Kcmo45gWRC17Hu8PwrQ9Iql9Rl30ajyFNySVFxn3RkQPmAxYA2YxWss9IMire2gwq1Cj6H8O9VFDg1uFxdB8K5pCK+t7rEsqlXwywPoJUN9A4TeOSNUYaoG1bqqJJ1jUwYiA2txAM4iFyuwU+4yKnkGzIzqjXEXxzymgMUqB22hvjD4fhfIA0g6g0Cr9W0VS1Htk6+0tQUbQB9Y6ggM9NOUEXW4VwPOb63hxewMT1DtVqzZ5HlJkxuLQyS5OfXkOW2O7yMkZMtRrn7Pecc6yO05kpuhrPAjd5HXme6zqI+jesx1WJ7jOSYmqEqgOKGGGWXqoOcbESUk8xn2JtLfkhcHh5mFcmFnBSuMsw9ubaLGkH1+59hhLdc0jJe0rIe5zhl1s4v5f69htOjTmunDjr7C3peoLKt8DJonqv01x99pNrJ5YQHssQkzrryhqnAbC65AX4qxyws5XboihXtgEau0rtGtt7mH96hrS12A4ti2cdpUyyRalz44tT2P5q1XstomkcZeTTnAK86P9UsgCkn6Jk8dnQQwIbYa4Fj7YkoDPQsioWj5In0QHCwTOTUpMkW6/BoVuvxOodqYwabWbGbRwsDXPvxD7w1KqmHGo1oRL8X3brCU/e2AOk/Ek/nWvWYG9MCyaxQF4P7PYms5x+tIFvLz+EMXDHYAQFwQ5TKKAZiBW++2nFveu3sCxbz/FWNsIMeUIr3DYSdFBrTKUCCAn2pGWNulhp8Deo+d4vHaH++QTiI3Z0AueoE974/wRHPnkPNCb50ou9Ss748m1rAQgNGGUAJ4eK9Fry7JUdx1Geplpjsk5TSipQZDySHT+z005ZDZCtwnMGkkeOL9yq7Vdad5rsMrydwnQjfo4f3CKK9XvcfAva5+SMw2bVDkeI8ZRDjnUrHJgEt5jorbca9cBvdkZ9E6fw8baD+hAHC6x7US0y2ltvgGuXf4R362eEnbzUuajdD449hrCNehQ2A/Y5vzjIgJDSkZQ0E6JiXLzLW79ckMUIij56Qr/mWV9E4lpeuAgFi5eQnH8LF5H48iohcE5pOS8Gj9nAXperWtd2wPLp9ZzTLKPRydinOkJkqLD826r4MuZEJiIrVtul+Ew2JPN0nZJsGvigFiZm8KtZ5ss6zkwwjkhlR2BbPtmCzoD2ACi8P77zuBNdwLzX3yO/k/fI/tzi+dsjA9m2X/IXKm9KHuW4cGvd3BscQUpE2dl1VoqKxQhfRDid2DdE99jy2RQdJ4lTSkIF3QKNJDvZLj/2zrMdolG2WB7yb0KAwWZTQcsn5nDqfcXMDE5jtT1PQGh9QpJI01TLVQqWk6QkuRz7aUWb9IIrUMdtFuTMJGoK1kPyd5n/vVvDiABKIudA60pdHqL2Hj5BM2CKQQFseWEfNWM2E94rbB0Y02b28urGjon0x0UEbB0ehEXv1nFHw8eoywMMlbvKcW/zUQl4ufLV7D42RnErZiD0SDp6KoEObw/w3r03g9wURl64fXzMZSXYL1pht+vr8Gl8hzob/MyD4lJWpXTSYSPP1zCYq8rrPCkvlRKW6mNhKE+HjYIlfeioMA5bKc5dqII/TjC1AdLWFj+CM0TR4HuJNBqSqDPlOex9kxI9oETAC15c8UMcHSek9hEZtnZ3kFz4wn6j/4Gnv4Dl6WsVmG8ChIsQrsN3KCvE2Tx6s/Ekw/D+9i9iQ4uLp/HiytbuM0p9YjRAMaj9QhM9uruFu7fuIfDXy+NwFmOHu/q5+oIRI4D3EijRx09UE9qU2uyCQzxjYCW3ncvH2PkPnhXRDArn5GUdrvlCaptKKTSfhB7ZJjOa86Q8iT83/g4DRqbmAoFRfcbb7f5vVmujo/ve1/KLcYVYVsE//9dhvMqa8ZzJXCvfJ5zXGB8wVe1/2NPzM61Eqq8exQ1I6o9PxurujH6PArxAs0pXVt4Fwppby6qmAnJoJ87UHBg9TJhp9HAXuNYaGGR5KuG58MjL1lFysvhMqK9kBYD4m5hxLBHTte501jtLkgN6s8qpIcgrb3mP6spDD2PmmSlJF0H3xutk4qDjSRIs1Dk1ISAJpfo+vTsdZ7pn77mdog8x38AAAD//2xdWW8TVxT+ZvOMtyxAGrBQEpoWCiiUklbw0PLQl75Vqqr+y/4BKlWqhNqHUvoECOgCpRSSChJc4tjObNXZ7sw4Hmlkx7HH43vPXc453/cd3wwHM+IGdsPzBhXdfN1ZsvdQQ5khuMZUBUSDRFBHUCPS6/1+X4VvMjHSvGicVppC6kVWGXAOIKgj7HkVNKIOt+dAhn5WlCRFICVT6BTUibYGl7qYubsuK2UrbMWU3ZlXMsPXZ6g0RZksclOUTvACbpAcjwTVr+GMgwwulAFg0MDpVDL4Y1LvVoqGGYhpMjBEU6Hr1i9moLNBDV9FCOswpfpRsF5D6KD4FrRh9WGgMdm4e9H2Fa5PFeGbhwCwUi02WIQGEGi2Y3YnBif2Yf1vKIA6GsB+M00szKPRAIhEAFN29GkAW9TNKBPMo9G2z2YRFjP/n38cb79mXwuHjiLQURYiSUO8uPeExdpihprnjaUtDTMchJRtvonoTAeH0ZSz/yz854lqdM7iXPVatfO+F46PVb9Hx/ty/NJ5E71kUghZQCVrQhNMJC2YDZBDAAAgAElEQVSKrMCEUj9vI5woTuPq6sfYXt7GKZb8S1RsqdksWa1cE+9l6Hf4mZS/wxSP/32A7+98h2F0iOTsMuKVRaQ+dCtQHSHtMibA/R/vIH/1H7pehCCX8kaS9dfgko5Diu0wNy6XUm6+wqss2k3Xo2zDzr0/sPvwGW/YWTxZgKfcM2zxXeDTL24iPrmIEWkCFCmrExe8haPrBSRIAH9cwh95OB2R5F63kQmrrEG2yZSJSjRTvMwn56qZq93gRGvhP/sbNY60LYG0ByXERQSaR4+kxFMJp1xd/27fFfQKcCo8iZXuMvxcHUZamDQgOhy/wTA4RGtjAes3LuCgnWLqia2Sg05nUFLt6hK9CXD721toT3L0KMtJmxCDiXrNsePpBsFElNixEbkc3qBKhYEMwbTE0zuPMHkxZZGswOC79rujGPvkmJ+/jMVz5zEOExRUXiyQfiWpHloEW7SIEj+cHKEwQz+G24Bz6CYoKjtjIThfoeIFlpBjPW7hbDvGki8O1T6hUAA8B/AMwF/6/Dk8vORT3vMGwO7rEaLpBO/1E3b+e9Da18qmbhwW3AFX2GPqSU70Ja1a4WspTjKaYTHGnpejs3kJ0dol5vnavADWQkl4bqF2e/TzQwyfvOTAo5fVSoWVdYuo5ob62mJtQvMnIQBDL0Yn6OD1bzvY+/0l/FS5nbX1JfV9TJIeznz4CZL3t7CXLGLkR5jSWColoJar2n/h7Nur3Yuv9t+8N7P9qMiweaLDSIqe60cNv5QW/MKMwyDzpmMcFBLIIfTA5ZUAUXnEc2vji6BClJX6JTtoFjCG0vaYXkglzEIfuwRVXR1gdftzDKNVHKHPoqBitzn3fcgoAOD+7bso9kbohzEHWEngj6gqxHdOlcfqav+XwqO2NQ31bGRRoN/qYP/vV3jx+CnaXijzmCqJxzweCpxoAVe23sXKYAlpOmXfLwwSLjNHa5ON6fphFWadfbBEX4Jp0cI4C/CWDJWCbg6hoKgWVzdlph8anADoSC6E8x+0sLB8BodEKSNkGZetyx3svSy8hn3yXk8F7rhOOWlT5J480u8g5yOdYDJ5Cy8Y4/qNLVy6uIEsEy2bTPWQeL6goPyf+7j/06/oZgGj0/yysj9/zhJZ1ODb7jW159FohLYfY7wzxD8PnnFA3CgoBfeJj3YkYqHvRC1c3bzAkq8UYCqPtFwfUI0FK0dZyHikUok0lKelh1EQYJcc+M01bH31Jda/+Rrx9WvA+gDlUhdlJwJ6EZc5lIhdKY8kDko8pnYkqIBODCx0geU+MFgBNgaIrnyAxc9uYPHaR/AGAxzEMcZ+oBoG2rfcjnmN910etxujtCg9j0Spu0mIi2sDbJ1b4wBmyGNDguJmKsUBcPeHXxCnLUR5qH0y75ipQjCz3hh8mivP6Gl7QKvoNIvqqD+6z4ahg6XbYYlN8hF63Z577rjkminHnOCC/d+qdFFWOmWnOVVHOXe+RPV9nnP+YdndsvI3rMSh7XWt5C4LnqvzGUUVxDzX0tf1dmMHkspYto4jW40iAE2GGRK2Qo1Lmx2Ox+5a7E8oXZpeN6HtUu/blaMz0TonYiifE85/857o0Z6Ljyhzs/mOFjyg4Ak5x4QuNoF1bm/znzSgQN9tJ7+H/Fiag2o6AZZQ46SnJhbpYOF3dfpFlJWSmlXApp6Ys8QqiwUS9TAitDjZo/aHy/7Lb6jbJfl4Qj833QnxRen6jKJPhc5AvhTREExc0BLvtNeSgIzomHE1pjDE/2xdWW/UVhT+vI5nMlkaCCVsrQJFVVGLgNIgtUX0gUpV/2el/oiKJ9SqSN0ktrIkIaQQICRDMmOP7XtdneVem9InsgwTj33te853viVuL0Yn5kIPmg70IN/3J4/QB6anjCd8IiaTMcfWuIthptO36NRO7+0MDNiUQXOLuQAkrUckGfOuYXQ0l0QXcZz0hPJCpiV6c+RTQdZZ36CbsnOabHyEiVCzwg4aF+uE3VF+BBGy3KQxkNB5Pb2mbkoxJjSVP7YuOOLYCHwhmkBj5OxbN7vQ2FrjOGE1BC1w8R90U2jscpwSZyEUfFqcjtbByJguNDKREBq7GGSQuU2k6QYc32Rl540d+uU0ZW5CH7YshNaBuF2IvSQVOYE24TQR4tc7CmdjPGL5f1qqeloKfUwjj2gjSJSiYuh69jNfoFkP5MC7rNKExGjOP68jWEXenNGIo1i3f9vpZDj/MxVtpQNK3MOZCltaw9TUOrZL08nNdHmy9LxntgCbY6YCEtkWhReTHH0ABlDTushLRsIwRWBizKVzKF+/wubdJ4ioeCLXXl/8BoyAE/V/diXFydUV7Md7qHsFx95VHPWnFDwuxGQNRS7P27oHFWQKqS6+/IM48Jukm2Y4dq2LQXRFcluUySSFpAA03SaKESVr0LBqslNhOVnG6okruDx7Hu/jCHpMbA/fmfyL2Vijk2etmemBRYUSSmxgCz/+9APWJg8x/94CTi0chb0/xsaTEeJSp0mqn6VYI6Kympd7qDa3kR5L0ZhSNKOsO6s0oSPiNe8NHEMurRh4cGuK9IyU2z6LBH/+/BfsTs0yA9IokneBcAWkWErngE8ufcamZrkpUFAKAaU0VIT6U00VISJGxKhgicd875CfBHPREigLyTpNXKDWiiVfy8DQvQX2Tq+ZLdDw8dEGS/KLfpr4B75MSUOFjSS/nCldVjwBYieP0RyzlkANnTlZndNahihmabpLsiqaVlLBEVGnmGM4n7CsocganP32HLYf3sfo91fst0CfI+HPNuX8Zlpazx9P8frRJg6trqCiDblj0kQGaB4sVn1gEgsDzGgqA/UQVONyI2RrJFWEv3+5i34OzsjuhvXQM3vXhLDzyzh54SpMtggb9CTmy8rrwdFf0hgKEEJu8wUNq9WkTs5LxCkSlJUdCtMsaJDTNI1/W3svedf4jyq6J4DRGNwA0fUgU7kstFgchlgciH/Fswmw9oL0iXNY7Autn6f7TcT6cx9l3t6afGxERSdy4lYBjEzFcXN8/7LkouGhs+lHyG2A+WOnsfDxRew+uYkhedHwZM4yZZFd3+MA9bTBvRu3cPXEd9ijzzNIeL9u2F5CTbPc/mMbT3Zy2nBhAVGxkqEugOogwPpvDxDsynmO44CBo7KxmCFaZJhiOlzCh6vXYQ4fxyiKUSSWpSUmVICF4tFCeb7w9WwiZLFQvQuKE0wDfubqNsnqHp5A12KaeO7QHINmoT4bEETeAM7vPUK8V7BHWTp+b5AeiLwDiOWxtDTA1n4OUw8EwOziEBxDqMT2oJYBqqdryYXkj5XKs+9N3MORS9/j6a/3UP5zE015wMBexOBZiJQmnbXBztozTNaf4+jxOYwDmTpXGqmaMmCc+IjAkM2vYqaGsxbaNJ72miUp4l2DF3fWUL4cYzCFxOdp/jrdn2R0+dFyHyunTyCZlfcV2UmIXtDnFJTAJS/Y9j5zbMliWiHtzcCECRvLbRc59kvgxZsDLJDZZpz6s46OBKDjmoN3spade53j4xA6RM75NsR0MsFsmEpzEpPXSIQmpgZBkhDYp4pqI/KOMioTg0y0KdKU0Z0kQsL+DBaTcg8nTh3Gta++wON7GxjlwoCrFQggI8XM5Lhz4xYuf3kRwUwFkzrOGjVMoSYItOuHtPy8Wzayjm3QtqFcWE8DPL/9DMVmyQwDcf83fp03lWUA4JvzF7A8ewSp7emwQBB9OiuRA+o8MKPxyazlSrFzkGOnH2P49RWcuX4NmJ9Xt8tU1m/nnAd4m+Ej24EbnNWt0aFjMmQxQKaOwyEwXES8/AFmHj1AsbGO0fY2MlOysaTbV1q/i7b5r7T5p/UV+kEisRqocSk5kvPzT8/ij63HmJRvsI8IBSz6DAfUvELWb69h/+keZs4soUxqBqElsx2dxl+m0E6zz9R7HfgI4U/NnVW6bB17opp2miSr/+oAT1mVobImuIHqULNJl+0AIKpv4zBDMcm16RSWyDQvZLBF70sSLpb3VP69nfcSgdAOOEjj1NPsXT3LwzdvKFf5ASTLdNPUn3N6b0ocEM+zWnPvmzaBoBFDO2LHOFkA09nVLNmlTJBxbyTFOq+/sjIMGFK+vPQfIXtOGMnzFJZUR3Zq1WvNecY5MAIqE6CvqfF1sebUXxBo5rXp+nmMauqrTr8GP6yrNEEtbG1aOgNr+ptU73P/qJKaQAeFWdr3jTCvA++zpJGsKo1w37OEJAoxHk9kcu8GnLpZVrlcG+oDaN+ioRldYk+z7wDqrll3cX7CwBKfBdezMCPENMiSjL+v6f6k/0dsD17f7bCdjqc36Ks5pqwVev9sMBCJuBro09ogUEAYTGSEqf53xuBfAAAA//98XVtvHDUU/uyZ2cnesk3VEtJKQaGt2qK2SBVICBASICQkJF74dzzwI/gL5QWEVK59aCsgommaNptmN93bXGx0jo893k3ovCRKVrMztsdzLt8lja38sNLhJU4UJJHnPKM2wnPPAq+abBp4oNMkQAz8RLgO+jKiwPM1rAh0mKoI0AW6FgeJMSEZdcmvdIgzV0xwoho6QMljCI8vAvhFudq99YtPe4hz1WgbqOBRmTFsRQl8WAdfRulye8s4E0HVjAkaAPFnSP3X8254nIIKpzmTcuBERMTSQawMldAy/CQrEdNDoAIgqGGmkYif4+w7gSGeF708HkZUPP2hoypgGFdrRQE0cXZ81GVkYRUdCgVe/yFwknSjvLpa+fQiI/5+fHXKrz16iTMqIEtFe4C6I3oJts+cSfET9wgFun9K6kmUkXzyfVWwZmEVsedIEc6hvCsBdFBtVWcIDSbBbtB97yq0Hh46L8NKHTvmhJGIZG05EVE18doshrsHmB/PXAIlFk20hVUECtbAXAF3P76D1uUehjiEzRMe78qLUIXOv8yT+HvLbMqcrUCiAlxRnYLr0UbjnncNrBSi+EVLL/BUsZ3QfFagnmbolQNcu3Cdof+b2EAPHU6egTPivEjCxsfNBQk+YYohRvj2+++wN3uKzuUOknbGooKti11UKQWvGjkHakYSQMcTrF4ZPLr/K27ffhM5Bd5JgmmxYHgwFWi8kCkjDShxarnwrZauD69TStxIQftohIO/96EcJYw7K0ZUGTj5yICdd7bQ2xygXKMAWGFG80FUJEKgtHKcTIbuGawM6nnBL08vYsjK5QnEVcBzRW00Lq74RKUAchWgcg8JE9CY12ylluEYY7R05lwReM04EdYSc1IowXmsIxO/Y7Xk9tAoG8ddEqfnXfHZjHWKutRtc4GJYe5wxSvOYp5k6F1qY+ejm/jt0T0sKPELOt/C4zYa3dLgj3s/4av3rmLkv126qkqsZeELIisHqzIztatCXRgMVI7D3X0c7h6gVS3z9elOirrGnKy+rt5GurkD0+rDaum01lLvkpDdyDXyc93KiKrsS1zu2tjhQDo+VCSkF72I8B0jxZg6+hZ4fFhhpBK8GE0xPllgTloetZOeTLVBrgz6mUWnlWEt7WBWAv8MSwyUsxJcJA6K7XVpY36/FVtFilPoz3sAHhzOMKbnlsYmSj8okba5wqtSYdLtYHDtJo5+GKB89YK5wK2lBAI8fg9//B2ff/MlOoM2RhR8JCJmZ1KG4Vutg95EvAsEGl3tArx22oWdzfDsrz1BnLjz1KbR5RnVFS7euAu19TameR8znbkEiQma/l3qJtJozx0FijntkSVF00gWrstF+xU9b5WIS9HEtjOLnmq6/0Fj8oyjSUWXP0F6ChYOJdKHQp+6oCeu45ynLgmrYi6GVz0X5esl6A1blfoEBJioFIuL2zj37gcY79/Hed2BMgXD5xPrqApURKvnwMGfj7F95y30NnKMVM0BHqEB8lbbU635p+8e14KmSXMnCkVFQrKaK44WeP74X1DtrktNgMLRnLRsPTRWN69s443N88jaLSwkgdLGLTgeJWtEhFExx98yNJqShhSq3UaddxhhM68TTNQxno1eYjim7tnamSi408frINxWrGVcDHX0coQ19GEp5qOif9Z2+yZjh0u084zXDGWcNQfT3qFGRAHFH5SLJZKoqWyBW7eu4O2dS7j/YM8VCJXCGhVVSiriaUyeHOL5oyc49/42bFZGcYs5FauF/8XQd9l12mmLUQT7D58imcr+JWJ42orYHYDtROHG1ja6ZPVnPKokwgZZEb6Qwj9TjyxwUpQgE73pRh/XP/sE3U8/BEOb+F3TJJehkKOWZ+gUoMFGsxNQGoJ+oEIA0Tv668jO9ZCtd3ECg8nBMxiKzZhbbXl+gvOdNLaYpsgUGrEx1YIOEaQZ0ScubKzj+tYWhrtTnKBCW3cxM5XD1qka4+MSv9z7GV9c/Rqz2QR1WkFnr4f5+1zGweltQLU5JK8KFF5u6CTed73hutP6SSSu5A40aadoF6mV0mX1VuBetByyXzIyuXYJGyJROxvZs0E62PB6ZdwUrP/3fjjWFYpBzGP3YuhJ1miE+OtyDa4CnU4XE+kGp2mcd0Rxrgynf0f7br3/nZuQEq87zr8VK273TGjRZoM0WLUU+q2IrxuiDLMGQOqKQuL0Rmgd7sLTNcs9qEDblUaNoDuDOXqsHbCCXPC/F4JU9vNclXVjNx/F9lxwIF2z0qEV4nPExYY4gI0Tf49kIKc4T12IDy8SH48rjR/Rg9w6dYVLGkuKSXkdkcmX5E6+UOA/G6MsPNWb0RFZ42zndeKaPLSxH6TkJzgEcAGsBAD8BwAA//+MXVlvG1UYPbPZiZe4cZqmpQgKrUpLmyJaEFsRL7ywPPHID+DXISTEP0ACCQlKKSpCaaq2SRc1TZ16iWN75s5F3zYeuxHtlSLFsmXP3G3ud77znRMzXV5RxqI2XmsMmEqmdPRM0RAJTiOx/9OJYoGg1VjYZGMV/Tnl+Rc1m/Aw+7ZcxBYosLNSAVZ9DM1Wb1bDQDbskk3ec4JoOU+KMihRzohTBpHAB1vYzk2K3wk1I2LCFT40e5Cp5V9hS6PXl7AlhUyCJI5nAIqyIKBdGw3caCQDydoKbtrH5c+xCJz3hWYCe9rrfVjwbwuBAuLDxoBfF+qYUQFqWJWr2HEY5c2xJ6vVMtn7FuxG4aylhi/E2BSpK0QOCQWUTYOBgNLYWJBupRDSp8oeYUpQpDVBUhOZetlUfSr9UG/URaNAwQGUygOK34gELLDSBKvnmynFKAEAvPhKrACz/3P+uUfpTJtm2z3XzmXPBti6uYFJb4xaIAeQSFWFKdtKSZBaE1j/6F30ghHSKMdgfwCXzNIN55kOwgbwBajl7GFSHGBL/GIZtJnvKQACLTYMDGQIYvXgp0AxQrqfYeGggQvtS/js1FWsoIYlllLyysZ5vg/0GKHe8I4PywcYYxd9fH/9B2wONpG0K6gtNVnhmtDmxbUlNI8tAds9PvAEVmqjGVAqv7+3sYl3ss9RyWNR5C412YsMeEw5u0ugDN2f2R1Slr/qIuzceYDtrSeoWKmVd3y/Ti+eRKrPX15H1KxiLxugl/cxjicMFJB/cZqPMMwmSAMSBEwxzvbRHT5B2jyFRXHP1rmjfRzkhSgZCxNxVYPHLp7hr/0N/PjbT9jLn+LoyVUcWWnh9dWTaKOFlYD8BKqcvR+SasLwGdOFV6I2PqxfQYvy+Qqoyk8ZoyNnwMBo1ZGq1NODh37zMbkAaPAn6zXlmxZdnBzjwGO/UcHxS6dxa+1PnsN5kHFwWdTS+4Ct4P75+Rq++e5bxIsh8xucHjyzksiQgaLT9R5Mg3TNlEUHKXbubCMdjtj3n6luGgyZJBatlVffPId45QRGtB/QmFmhuC+xifT8TO/vI0Q3F4p9xuJxAdcQU71fHol7/FAp/PR3NwU2ngL3ujm2egdI4wj90YRBCrHgUNNZZj4liAcZr+OkmrKgYi+ocHbkVgc48YrUnbNifl5cpvK7BaCh63oI4IYHfn88xBAVdkwwsMDrASlIIozcCON6grXzb+Hx2msYDrYR44DdFyxAtf7c3epgsjdEvLSgdfFOQA9n3upedBtKgO98I6YWBa67j3bw4O6WJFkpq8TCVTIX6DaSegtr61eAtVMYE8uD1OhdyA4OJZkBrs12IVQAkj6Toh5M0KgyyZz35kEcoEPU2KTBmh7Uz0klZNbygvJZAju/vvhYMdMMEqPvaDdqiB92kPW7CCotcQxSOiglyn3k4CgocLE6Pupm4Szr6NnGlbqTnTEaMVrrF9D/ZRXp0w4RYhERsJcLC26RDoFjhzvXbuL9L68CCxXkVcd2xzFRPDMNAhWwnT5nSutG74HGt7/bwf3NexDpjenYWdUIxYZnz59Bc7kpGcA4UItRDWpNBIvTVsRCqiKoHEGycBThQgtBrc5Cq8SEiEhcbLKLbCfDKB2ppOXhAMDLwAIysQnlcxrnenR7fbSX21hcWoWvNZEldZ5gYdqF29/jEgEwtVk9v73s16HX9agZNSlzIx2FkNkAK8sNvHf5IjZuP8DBWJA3PjrRGYvsbDvAjV//wMcXTzDYxFoBscBIdlg3vStbK96Cexsh0qpBiFG3i7u3bvNUYcYRAem6ip2TgObt02dxrLWsTKC53rIxZwsiESKg9ZUGHpOFBJ04wumvPkX9kw+Evq/BP1vuxVMbRgCH6ie8dKPNajFi4AXtJeDMG2jmOQYEWj98hHA0RiJRnVQrBCVtjILbqILbPtfgWoW0gwBHW0dw7vhJbG49wn3fw5DrsUVzgwATmpL/Xv8bX0y+RpwQ6OrYVtjYBsC8RoOU+QVlKz4/e/al/FumjFKq3zc7NquDn2+RnnF94c0/26FSRqAMX0r+TCTwNPX5KaVdE1Xp9BzP4tXV5NDRMJ0zqAuVBeaWgAotoCwEAacie9TqjUZBC6fnbqwOW9BglBnOlNCCm1Gy5+JGPTtL9luYx6SuT/1VFtT7P+CiPCYGEFRUMNwSnJECmfR+vVbjEgFzb/C5AgvGhNK4gxk/UYntPdcoOW3jyCUFJFzMLgTTmC8zF7BygK/NdO2o2f4iyUfTZjHmtLy2ckZr4pImiTkpTS05QqilfpnRwIxIEmlU1orFOdZ39r81Ti5rSTixMqyM3TTw7LqtDydFInjWJpNfe4//AAAA//+UXdtSHFUUXacvc4UZyEAAIYFILuUlGsvyIb7pP+urPlhWHlJalFGTQhMIEGQqw2WcW/f0xdr77H26GbBSGR5CQZjpPqdPn15rr71WUF4cswYQXGXPE1cNUBYokGx6mzdZ9Bpo9b8MqsqMCQSc6kGmauinigFTxEcQk+NLz44nDqoa58ag1kgSAEc5wEmzGQjLhXldj7MeeyYXYFoyDvR86xqZCYOoNwcXPUgAOcncDcxeAJatsnLxokevXKHXPmqWhfuzhMWMgZuyXsogpTaRQBeeSkr4X5LvViTVwBS5j3ohsJGdwaXcydkxiaJx4cRJcKHEFNL31EvH8yCAnOZcz8f1W2epG1d4xQJ3i6pkdKgkERmj0QU/msRu/Pj8p1a6YmVKoVsQZb8GjexTWRZ9rzJ/fTFJIFF0qhbJxMQmE1UGKzSmkfQeZZfyW9370DnJ+ZY9CtwczwJQiTOMea5JppjDIxZymKC3f8Rgs2KsOQltzuNEys8hsPXJOhY3O+hVpuw0T4ZrVNm+ZARyTW+Ru3ZmXHDL5EXx91rtu8qgWoUBbJsBkyxU+Y8Q5k2EozrWa1v49sE32MIamghY+H/d8wsuvaPFJKlJuMJ9gi5+ePEjnrx8guBmleXAU0zhkXSxBoQ3qmistjA+7LNRYqqbqDxMUBtj9+gEJ3/tY+3xRzhNEoniIalcLOORQwQMnEmfyQ2XqtxkXEYgsxKBFRlEyOoIpSWbQPYsCoDtRw+Q1HJMQyuFo6o7mQBSO8BgMkSUxkhMjNhLMMQQB/1D3L35IZpmyZo/qXJDPBzcaFPaAzL0cIo/x7v4/tl32Dn/BYNggKAbYLA3QrvWwqrXwUqrg8bcHFct6D1GZPhigOV8CRsPN3kmKG5QTQBzdkTPpAoaaHnK/k7aAPZPX+HNxRukTfUVSZ05tEoqSdo9qfrorLex8dk9/H3wK9IoZ/m3AZzbPkWrDbrA0R978L9Yd9Z4FtwXe4pl82fWF5nqmAqv6bofoDqJ0Hv5mnvMrfmRjfZMnYLEoLa8htat+/AXVhAbU5hM2ShpJ6/ku44PRFmG3iTD8QDoN8FAPxTywm72nJTP8vtuBuycTvHbyQSvhwbdCIjDmk0pqNSQ5VP4IUWXBVY1IE+60TjDIBpbfzif7js1jGHw9KCP5XYLhKPov7a9nK9h9mIw1jQxlsr/7wB+eg0cTQOkFd/GvMm88bXjW7SdhT4bzyXtecxt3MXgYBd5+g8yE6sXP69Mnqcx8PzpM2zcfkx6RTG0N4XJ2f8vXRdRRL4MJo1xdnBs0y48qyRhIsUnVQat7wCNtU20tj/FeaXBhEvmea4c6fm56/3PZcyrWcxJEh/UAny8Mod7K8Bq1RIKb8lbIQVeXGTYPeujm8SoBAmTpw3tNMrfDf5nz89Injb9MZFAa0hxK+nD9w3WFlp8j78YjtEdRujTA1QtxNQPkftNuVeqc7PsBewEnTOZlAQGg3qA9tZtLN7/HL2f99BESFSOS30giW0tTzE67KO3+waNlW0McrtvswkwR+5ZOb5NBgicQoO9SeKEVU0EbGt+iKPDLjCcMtCMponIyAvlzI3lOto35lia6rlBE+Aq1VEO0MsrSEwdadBCpbmO+tImDIFwetiWiqiJIswnDdR7QwQXEyZ43gPqXz8/DKyo0hxiklcQzK9ifv0BOpt3gfYS0GxbWc/oHDg7wfnxHkb9noAC2xtiSmZZ9tlDCBQCbrTfR0O0FmrYvLOKVsMSV2OajtS2ktZ9m2rzauc5Hh4/xnx7le+vAa/BuNRAUkrUkex3Z9FCc0uAP8vx79tzDN6eWZLK+QhIhZ98Uyj7/842ltodW/0v+tA5trkAACAASURBVC7KsSLyYmMa3tvjwEc3j7Dy5SMsfv0V8noAQxudXwAG4B0V//d4pQxkpBLZqAB+hx6gMRf4GJE0/fAE3mCCMJPoQu3qUDXRzIfnWfHMwlHSmcGtxQ4WKEUstuocJmRk3EjR1N0/wfnhMapbLSRksveOM+L0sSAogJQDiYXxmbbqstJIWoDzEgjWglcqKtEyWIMASxuB7SOeREWmu/bclwAii5ckKUCBtevrroRXQOwVgoFIDan2EoC2hUBSKljcYuPKLaDVc6PrVYuY3EokuG4qrvW+713BAkUR1LhjIrwxnlh8oJV1CPlAP0vFU00xm1MCiApAC7nq8aXtzeq3RrixzqqJ1OX7Q8gMNtsTZa/FTFYhbsm4qy8lBJQocMcrvWYW7Nt+f/0cJvM4UbCYA1YtlJ6p6X7NEY6CcV0koVT3idBTk3F+TwHinFDHiqSicl/2FFP/Ce3p50QDUSzTl3oNqLG9Ho8SkPqZlIyk5EQZ99mWZ/G7KBtYCj5hVUkc4T/Orqy3jSoKf/fOjMdO7MSO06RNmoVEhS4qIBBFAiEhxAOCF/4BP7Is4glVULUsTYsCQg2kLWmjNrg0i+PYnhnPoLPcmWkCCOE+RIqr2L5z7/ic822++8PP0SuUcu/QUzetidWln7XmmuFvPZMbtRH6mi8cxUHQwVDKh5vcuCktdAJG09l8OqcbK1HqN9wUyti8oUPpRid5jIVEQZr/5w8ULZSjA7mL717LfWahuIjpRFy6ybtpEP3N4TDJL6bTnzAt3jXgSsF3Jhn0nGhfLJK+OOeLQ3kxfSpnX7qfNIBwEzbn/jlSOYLzR8g/A1/gk/EnZR2M+BsILcQeO/iOtuQ2Dh9o5yTpSZZo2RAw1qiS8nDEuiGPV2KQ6I20LDlwg4skGeYamHLDXt5/dL2tX0xbyzIQdlqlg6IsDueoSf/o/7As4NgeSFWSwQMezg4VCUXu/l/KNS1fD7eOaT45FEYDmUlWNF/1+IyJ9lGkeclOm1Ufhehvd9DdesLaOUKGHVWNJ+TUQPjAi6+fx7CaoG/7SL1RESNTur7xsffqRvzlTFm6XrJOqWMFnvhsqUOlFdkgbTfvE81G5ds41R6DFMmhwUKwgvfOfYBlnEaTyekeazCt9+8VuKPjk/9xB89wffMrfLZ2Fd3GAKZC14sQwooUoRSOPO2hvtDG7tojTDAVVWzrrDZ65GfU7QH72zuY663AVGVQRlIkopGHVadJleKWB4ScBeexVCeOM47nM/0Yd2+tS9y+rFBpXEHFNDC/PIW51Xl0McBefICkItzniPVUdEZSZDR0oBquYfBnr4sbW9/j/OolzJomO717jKwVyH8iQYSMUO1hH7f6d/Dp7at40L2PqYUA02ETA8Roz04ys2U0GmInfYKsK81TUA1hQmE1kKzk6uYX+Hj1I6xiGpYyoYMx/fsl5arJuzn0MMAf6ODGLzfRNV1mLwh6XhHasSLSguoYxEGCtFVD68ICjq7dRjUWDbXeuRAaHzXyChlkuP75Nbz/yicIaXjgtLFexjo8hwKRlMQxqmDly4k0vSxHiX2Y/T62f9pgn4zC7dcwnTSxPvpZiNbiOUwsn0NUq7PDfMp6w4LCmipd1hlQ2to49pIR7mzt4qV6C81xEalOBWqYZsSJhej/DyLgxvY+7u0a7I0qsI1xjAKRcNDwF5QhnJncm4JBukTYI0QhZ0MHTyJYM1PB3YMugt+GGHs55II2ZHprxigsR34ai4eU+w/gy80IG88sekmNdc8Vav4SPbeUeqMeXBk1mnRempOYXL6EnZvfwE87CEySi0usMgAoROTe+iYWPrzCtHVK5uFW3JpcfpAyUw+5EROxWxL2E5DmbLxShX06xMOfN9ikwGYSp8rZ9iORcA8qdSxffA3Z7BJ6tQlEVPSyplI0kSNlpUQVT36fRGiYAd453cBbZyq4VBdDzLpDDQEcesCvUxZf+z6+7WdopgYzOgBw6KL5DxSAkxi6PMhT5ErdQ2u5iaXJJs62xY9jiAD3uw38uB3h1uMD7KCKDkXEEdMj1WuhBTgXlqkMFaiXo0SB3kSdYxAfra9hcNhFLevx6xHjyyio2tsHNn9Yx6tvrHBzfkT6z1oNcX+QI5z8na+U7JFKv+jlIjJLMBbDwwide9vAYcS085AMoEYjVHwDP8n4nM6fncbc4gwnQSR502yESpXp94ZXxSCpI2wuYmLxIlBrAeEYsx2Nc8In3zi/htZcBSvWYqzdRtiayO+0/3cMIPZvFqjP4OzlNzGWAu2lFeDUvNIcfHm/wRTQWETzzAVMdrbQebiBo70dVLI+o5iZyuGEoqz6Wqqj0hjDqIvAtzg128ALC3P4bvd3SfQwwkAh+UzDWjx7MsTBox1MLjXhhVTniHkjlCXpmnmjQAadoSSL1ZHFR4U8Lo4iNmQcHgjrJ1RufKZUZtrf8/U6ZlpTIh2MC6mB1LFlPT6xGxOYIORovC75bZw5hYV33+ZGXNIXiofx7ImO3zEAXLTmCdT0H5iMXF+6DEajzMFaFWhb4OIFjPkenkYjjPrbPMQTLbmki6Q5Mi+L9XdSV+iemWu3cbY9jeDxUzF+1EEZM4v4JgBsrK3j8vzbEkHsO2qlSJfKTXCZbl+gqDZn5hqNGpffF+bh5frKarPp6mRqxKhRSp1UWOtWxzag5z12W08YTAs0Oz5Rl3sCUDJ1wCcEXWK4A+2pPEWn07zpDY6ZZrtYubIsme6nVOeycboz6VaXfKF+C4DqB4KGFylnJWq7kyK4ulHZv27dqN+iGjcMC7Td6fuhvYL7KXW5X5gP0nNKR7faCzFQPBJAkz5jFKlEWjPr6bvH+b659WKAWZ145F6Vcb3ozmCWlZm2BVPaufdnOoxBSV7A7197Qk4XOxYrTgwCZq6X0HIxW6f1FDNFtz7C8CbvEgEUXbPuJCjH2brUn9CaUg+Sy465FypS6HjgQb0WsVRK0YluL/C+02tPj2q1FPnngFndE2XvgeJ9E4tCzfHTDH8BAAD//6Rd228UVRz+5szs7O7sbrf3FlIqUANFCRJDxPhi1MRE3/QvVd6IPpgYfYEHCBANl0INtBh63e1eZudyzO9yZqfLGknsS0NDds85c2bm/L7fd+HZc2e95ALr8g15047GGfkFMsJFfcoUBDIRQakb7CIA2bmf0Twx/OOiLAWielRoswVFGW8qT/Pu3SSo20KaIsqmtqVse1c8cZwE8gJhKj/cygUPjcVl/ucTWZEVRbJckez+RmMj44RaXR05rWi2y4vpKCllc0CXq0nFAYMYpP81DjXOCzCF16Yorg1vMEfjLm8cYR6YgtZilQVRzMGXQpZvJHWjnAQDyk6f7kED5+wej8YsBxcppzc1za+qfg+k+RHkM2VmmCs4J2MkC42R751KQ2BXz0l9uqL1PHY1pXD7EQoE+BxHOJYVQM0py2jqNKaHG1vx0DNeAQa5NbATLvnCABkjnZ6aypSjVaiwDxR4sKofK38/U5iMFDgBHRgpXqxncbj7Bva4h1C7b3CURZpvCIyqwPnr76NbGbHrP5u4cRs7nzrH8R4+/W+rL+tM36Ke93bxf+rzNKtf5GASmUWaf/YnGQHxfo71aBWfX/oKl8PLmEPEIAYPzTP/2YVLshwDM0THdHH35R38/OAn5O0YhtrGQa5WUJa7hTkl583VMHtxCTtRgHg41pu7ofLjIQYOX71G0unDrzYL+Q2j/EpvZfM9AiY9NaXLpeCk6z7vNZEedXGye8jmYo4TkTrLwkDei2sXzwGNCjq2gxPqrvopMi9B2JQHbT/uolqlvTSAaYTI2xked7bxy6PfsHxpHhvVpbLPm6w9U8176KCHR52H+PHhDzjw99A8W4OpW7YDI7pxXg2QBaKRS0tpEXmgUax0T4fA8+Q5bj+/je8ufI0z4QJcHKC4SzhGgGUwKUaMAxzj7ut72O5so1/vIfQilWnoc9GTrGl+wRqD7rDDxkyVtVk01hcw6u4jSsZVFe8tOrTGwLP7T/HtyKDRqmFIBmiBsKKYjm7ksO1Q8PI1dXOjjnWydwRzkohxlvbepHMsAMDQb2J18zqqC6usy88Cafur8kGoqAS8MZtD3NxzE6A/quLVSY7fn1IGe4RrDYkAq3nCSRgp9f/BzhBPjhIcJk2kYQNhVUxqaZ/QgdjS848YRFpgGzZw9JHR4SAIMNRuJI03IcPcLMD9nSOOc61dbmOGDzTSRad5bVHXvw/cenGMrWENe90cA+szOMAmWo5aG+hvT7LsaLz9IMDie1ew1T6D0Ztt7Y6N1e+BvHLx4tEWPjsaorlcZ0ogU/A1Qu8tezZ9P8p7Q00mqegfptj765XEkrnno6sfKnX06i0sfvAx4mgGCRkYGfEskBqAxTBsdMeyHptgKUjxxfkFfLMCXAWwAinsWSlqZXQDr4JFeGjMNBGFMWq5xP8VyvN3oP7/W7+QxkPF2Cdtg2vtedQToOVL94rW7EIL+HAzxEfri/h1C7izu4/9vAIqN61fhbF+8QXCqfHVYM8irkaor23ArG2g9/gZZrJAZADuutCTNrZ4s7WLMDUIPblnB8MhgiljZVtSTyjG7CviKbsvjnHw8m++Pr7VhA7PnVUAwlOXV2fFWJE4LkZ5QRoFbxmQ95DkISqzZ9FYvQK0zgFBTaV4eeGBAH231OozWDlTQbUeIYpa/6v4R8EMJb1/AysbVzndBbUmYBq8/8VLRKUitJ+CJrz1FpbrLew8u4f0+AWjfb6aj3r8OxcpOhvAEZ2cQM4+FuYaWFmaQwPbUN4dsyD4PrA+gjTHzh9PsXlzE2nFMNhrM4HKJ+O8Jn8EcCMkf4Sudv8rhf4+Z84RfQ+BTjcuXcHK/LJIlUp09smzmzRRgGQ0wMBWcGgtzt+8ASzOMzDCPhClJKdT12Gy+/6O0W7TL9LYi9AQwO7PAhcuot0b4PjgAKHN4FPSTi773xbESGXj0f1MRnhTgIBWo4nlhXlEu4b9Zdx+ItkQyY6qCbD95xN8+v2XGPiUG1SinVs9m2V50fCaOvwSCIApzEd3XSe9HjxNh2K3f3O6O+3i/ogBXGczaTHtprOyNBopHSwtGleug097ivX8gV+wUt2ZXzLbx/NjHT09jTJopzjjmss1DiWP3hT1iEtYo78XjVrVi5fd7E/FopeleL7HNY9zmyepmeFobYlHNhMFLY25Hkm0IAEZTnJweu29QnZNhTVT9MmJPpd5x8PYudFLM8A1qFw3u8S6LaeWOW19QZ4pMc2nxTBa/byBNqkZdAiJITGmzbs6iDP89fPEZyxDSP4pup7uOogfmdQuLMHUzjvtDccS4QQfWYhiXtz85TQGYTFTLUxxjS5ukBnuJOfRupv2GP1Qs5mjFrXWdqBDUX9OrD39Xyer4Dnr+ko9aWCtxT8AAAD//6RdWWtdVRhd+0x3OLkZbpqhbchQMY2ttOBDEcRXX8R/Kj4JxQdFlEJFRS1Wq23TFpKY5t6maZI7nmHLN+xzz0lTqHighDS55Ex7+Nb61lqBV2HCRTtdyZH3XZu8VzDShIjVIi2mItnkZVlWtJcUrtW5DBhXLNGFcdsCRy9IPJp3tv1CmdpQTzovEJzX9RBliQFK5hOTokj+HhtNqXkcCg3MBBFhoKM/4JfTFYh0LfQwHDjhEDSvxHC7l7L8f27w0/eM9pArM6NE4q7vkC33wAlBpIERx81K1A9Kk1RZmzSZoLQVxckiqLXDDwvWuHwUevhSVAZU7xKEYZEFarWdJS/9XYonITSNJACpssOkM2PQxDvPY2EykIzrRyxdj0MarfoFcKtqGBasICO5em+Z1fcdCqctV2qOUUbuqi0yVYbc/d4oHZ27QLhzcgehs5WfO7fsAiEln4JAukWomDEK7uh1SmKFmNPR55r+FGwyRPfpDmw/Q2B9uKj0lL3GRZc8txYhajeRmxEXgdzGa8UEz57RupWP7Ayiz2NK3wdPgYBiA6dmguUxY416CKhLL2WJsx6fzKR6Htr+Mm6tf4SbU9ewiJYwJ6mYlr3NQe8KLdo/7tzF7Z+/RCc5gNeKOP2DGHkuhJjpsqzT92cjzK4tY2q5jeSwU2jNpc1bkouICX2134EZJbIh9hw66haOnCd2T7uNjHYhWI3Kocd9tNvB8f6QOwCgCQqZPkUaHlEd2Lx+lUS7OMkGGARDBmOosDUKmvRHPRiayOsBknGGYDrEfreDb+7dwVr4DtpbHzOrGWllyudH5noY49eXv+Cr+7exmzxBfDlmKQ9vDKzo4jiUxOlzMSl2pAVMUkTGZog0PsXv3XvIHiT4bOtTrMDHtG1IIWhFx8kJCBjiGK/wx+ARvn94F4fpgcz3zCJFFWu84osRQOv0pIfWchNLNzaw++cLsQE0GRcdSS5Ou80wx/PnA3Sf7qE1fYk307nq3WCq7WuV8cUeNLq5Is363gHyV0Nxmef8+Ml8ltJL11rGzPo11gejJgAqFft+qsWylUBF/keLJTN8PgZJgP1hgh96J2g3mli5AszT+6S9GeTX3hkDj/7poXMaIKM4pZrHfg80HIlhpY1uaBM08gRzaYoatShSm6QX4tA2mQnPRpNeD1oZpuMmxn2DO0+OYHMfF9+bQk1gcdDb/XUGfLHdxWNi/ql4pPFnxCiXCz9ffLWyslcnb8gNxpRyMrOEuYsbOOr+xAkMxkxYSqhk5uXhKXoHJ6hfWOCoSOMTmKKsgSmvLUZz7hXkNp6Y/Q6BwYsjjA+PJwaQRb6EReJF8BfX4S2vIQ0k1SVj2EoiJ/l8rCSBELjc8jPcWmzikyXgAy3++We0h6DnQV0d8ITpN8CHANbqNWG0WXmeFpGjFtU9wdseRgEAyYownEQRqDRkJOmfHBV4pQnceB/47uI8Pv9tD4/HDfStsNK0emVOWqNUOc0H/cEYUfsC6ptX0d/+Fqk+PCpEuQjiNIQM+886GBwdw59pMbhEn0WSVRLzeN/EfsWyYaRBR2s1GZglg2O82D1gt39h2gT4o40XXQcRtqsbK2hO11RG4LSfUvjanDoS6Rdn0Fp4F7iwDvgtXv89m6hPQIlMgOS5TNVDNBZiWW/+pwTAdxt+U0NtapHZbiraU9XneuV0AWcGaOrA3CoubQXo/tXDsPtMiBHW28ql2tTyGkXAJgHx46yP9vwMNlYvodW4j8EgEemAJ0ImNoylOWB7B34v4Q16amhD7oiG16P/5AboHVAfk6w3RHdnT7L+ae/IOmZTyDIIANhcWhFjx5Ip79m4QSGWyG8lRWYNOqNThJdXsXjzOhDHsua9PmvrxaMCB5yN1H3bQ6RUXtVs02hXRnsB4eYW5jr7GD74G6PDU0SZdEnZUnKhV9Ibkz8R3+tc02iIaDA52vOzqKt5rpMJ1YzcH2qQ2H24jXGvh6jt87yel/ZsvP89szc6D6ApWOyCCT9fQ155BnzOEiftCKqJhECK+katXrCxXOCGEeuzidxz6R39QR9xM+bPUEt9qFF97ErfbBSO9c53DK6QdXOMMz5X/ypfzXRdVJ2ne1yJ/PMKmbbEw40LnTnp+J2XmKvHnMzLFfdC6pbazNX3aqyFK3ujqJ6emWbdZ3LHq3ZS/xewKY7jwuxPDJwzNU+XTmga/2VTwjcd7n2YdDno87UoOqfhpAB6lIlb97wluYjWH+nM4LnWRYhrUgM9B6qLmOAlvweWNUhtRNdATDx9FWnqhFCUBArpeHCADHdNWIlsZJCIzCVz6WY5T+5A51YLAwYyeL/ojE6VKHZAhwMXfTI/pm48qtcoNUDfC04DiCL8CwAA//+MXctuHEUUPdWvmfEjY3ucxIkTJAtQgAiRBZLzAyxgzRfwjaxALFA2sDEiYgGRHIQSJxAnY0/c8+zuanRf3TXOhNBSS9Gk3Y+Zqup7zz33nCgKKphO1SY5wQqoKJUqoLMnv/UWEPpVtsmaUTlMIIESxkypLpFrqeeSVOui6sPKsXl1i3WEeTLa5LIk0FS+XSD4Yde0+7LBwEhT0goG0oLcsgXqpq/cXAzoPJwAG2tAB3nFQgqG/i7/JJcHu/W20PEh2mTekEbXIGSGQYlCbCaMwrRq8apUfJF7RAgxUhE889Sn70EoH2/2qsFAioAFQM9oi41MWK+9IknDdqBnCIUew4mz1Gde+eX+IW/fbXivpk9QNL6noWCiifqFViu2m7sB0/x1IZR2COnBYQRNFf8ZQKna74DG3XgyboQ4jHViKplMLrKxYqior5f30BfbqHGNCIpvxpFttPAyokkoLE3OwiOae4xPR6JqrmJNlmwmmUMRA/t3DzBfq1n8r/Wl1sCjbgUmK/iGTuvNuulSC49T0RmoyjZVXSv1lfXVciDDjo5eFHKt/5vWLD+Lkc3WcHjrEPd3P8cu+hy8uGp1z3+QqjYbQRlDjHH0/Bf88Ot3GEVDxFciRB2HjY01pjgTKySxnjkS0+w6uO0Em7evosgksHZNz6owV/0cGD09RXk+YZ/lhIGEiEWbyAaz0vHFgJdrvYjpHFmUwM8rjJ6NUI4kXuL+Sl346RwzAi43gWvvXce4mGJaTjgYnJEicEZKrnPMKZGi9c3Ji5JsYlIO+DymkwlOnj9TybWW0km/22vkOF48xk/HDzDEC2zubWBtqydqzWyNowALAU9ljTTKONhPlfXSiDbS3KhLjMoz5J0L/HbxO7599D2GmCJ3JQobHxoALlAgR44HRz/izxfH6PZjZD31V3NtVT52Yg3HY59AE1aer1H3Y3SvX8Ei1uq6Vu6JIs7zc+FRjoG/Hj5CNiWF7QydSCiS4qJRcnUh3DgMo6olBd8+QlpFmL66ADGm40DpF3pchQzp3gEnm1XWw3hecILO414r6iXvjpNPEpCtOYoU4I0Oupgs8M95jsmicRDlvyNdgJce+HtcIi8SlEmHmTm0hNfTAhvTEQb5K3wYLXDYz/DlBwN8fW8bX73fx6f9GBt+BFdOpaea0fhS2AF0f2kPL/0mjk5yHJ2JpWCOGCfzHD8//APD4ZA54cksR+YXXAlj1oTa0hkFu10UZDxXJHA2uIr1G/vwcZd1B+qljmV5wG7l8OrxCXqksF+1NclV4a9ZnEKDDQpwUzicP3mJ+dlUfNKDVxS3GrkE2wd3EQ9uo3QZJyze/PkhY5rWDXYLKefYTWsc3khxQD3qALa0+p85eWa27yVRQaJmVzUf8zEl4yAr0EKsG9Wu9L9VDN6+Rco82iaGAUpO+HsQdJPkEvt0X3XNgMNdAF8MgG/u38SdzQidcsKMCDbtoIlmnnJUcJ569sbPOxsodvYwJQtFl3ELlIlTEkjLvh4F8Pz4CbcjUSsNibh551UvxKw8I7ZOjpUKbEWITpTCzT33KoURQ6QJPn3WTYHB7haSTqLvCrE1bAGiCHPfRbR+DRjsA9k6s4vYJZCYMeSuYTa3TpEoen+R3z5pqcSd/0fDeNfGsUoGl1JVTWzuEhc3DKZ2xELAMbIeTLaArVvYvnkH3e19FFHCrSu+UQyV3hwCiElQrqpEsPLa7hX0enGTEkd1K+RH7+bzp2cYn75GRi4BWbrcwrgKAAjukIUXZyW/62PVexD0U/6f5vXB+i5u93ewlnakgHB5s1iDgE8vLWw+driIgeuffAQMdkTY9F3Dvq6AFcUgoBVdtfYAs15b2lf+jV6USv3EBNi7ivize0j2bzIbqWbXkjqIRyphBFBcR6A2Jd/8AtfPIXpSO9TKlPZkTgRtC7ECmIu8wtmLU4kT6hAskfnP7mDlsqC2C7TFoHFUWJyqa/9G7L5qC+NJGwNWZErVets85dv2gtavny35VMsKyiDg1oDZjJ+TEskwHl/6CZX1DI1LYxVkF6HtaKml15hbpl9mff8Wx9NGtu2WeDasB385CfZK2Y+X2GCrviu6BnvmUxsDUcqD9lR3iclMv7M4vIlafaUM8TrIL5gZbQBFIMzejMHg35GCFtbiYLsdZ79zmOR7E+azKvgKkXhjWljBls5Btvc2DijnteSf88SCrOKV2U35JetPCGjCemyBrpsVX+UzyVfoXHQtY59bDmSgjAkH8vXMvUxbI0U3QOL5t41lAqR4/JHQOLH/qF2H7BkJxKpr/AsAAP//nF1ba1xVFP7O3mdmzplMZqZNmknSxrbW0tqKKEWwvvjgg6Bv/kJ/hFDwURQqPoiIlCraRlMa2uY+mTnXvWVd9jmTaBEcCAm5TGbOZe+1vvVdYor6ow2C1ykyFOiapslumkadeFWaR88n20nmYWiOiAYTmdYtP8T6kX69Vho6xVvlxVwQE9VUkNNxoP0HqcHiSREE1reOkxqg3NF8+tppLjb5xORZ83f0HGVWnmlcsdi8NoYTEvFmqZCpZLpM7ytE+RFpwIn9r2T6G1VZRuEClZg8uckFKPCu9TAgpJ0yR53GbXU0JtDG0rDTR5m7xhwwIHqVsi9o8wgsBajmpg40EtN6KjQI2CIyao3mTYaNxjWGQqWahPi6Re2qetHoQyaSlP9O1wPFoYhhj0z1OVbORGoq5fW50Xy/vQBTAZWsLNJ0QQYjSKam+Lw5HbXq840RqYLQphKNN0kUJEGj+ZJIRLeQM25YYsJUHc7Mdfz3zJpkCmHjhCZFqYmURiZUdsIbi6poolQEWFBQwrVAVWscuUilss3C5FQKYjgGxeLgxREOdl7BFIKo0yZZ67SSdNyZATbv3sA8pSipEoUTOzrxpI/UfVr0oGXjOBo+LxbsRrTS/JpJz1/zpF3WWN8sJKXmuXbTBNPZTKYsXhoLYqxERRfuoMLba3fx8eZ9XMMEqRr+/dMoN3gJmDPfobi/I9K4H/2EB4++wl/zp+iODfq9DkrjUJDWCxKPJDpBOT8+Mehc6KF/ZYRZ7DEo0NBiWaseiZbMHhdwu8cYvnUFma+QOY+szJlR4I1XKn+sBmQWZS7IO01fRybFH38e8PmwC00gaWQjT4VvjbVrEyyTDr/rkJ+ctxt/JgAAIABJREFUwg4TRImFrzJek04zypiuOZSPdNbjZIhqv8byLMG4SHF7chVDBh10AgSPnPX3e3i4/T2elztIVmJUJP+YlryJUJPbSRK+x3NCbNlw1DNyazUqKyWPFA5KN1zwTl3O7u95f4of9n5E+djgs1uf4g1cxMUo5UaMIgMPq0N89/M3eLL9CHGfEOBCCuyoQkFrFhXWtoeEDLFosyCNM9HPiLU0SJjRMt5aZYPGbHrM0x5iyRaEVlPbFkmx9uvDX/DJF5/joJ6jKHMUpdeGmIBKAli7vP6fTk9hIVGZS8kS3KxGt+wgf5kjLsBgCrF2nDb11PZkpcP4yg1U41WeNENjm8KSTrR5asFL9qWxnDlPdGufzVFlM/RMiSsXDC5fiFlfGvhJc45hJNf/GgcUeUmgcSKNUIQcIz/FBwOH+5sT3LwErMTASJu5ehl4b7WHS0c9fP37PmbzCnMfc7FPDRPduzTFKm2KnekJHjx+gcmHa7hMb2qa4f6oi63UYuegxNOTQ+w6Mp8bIEpHmBYCFCZ9SQmIewBjDF4oslREVksJBpe3UEYdZJVFL2oZP9SEJCo3Iw+SQWkx5RvEyrpB9yE7+Dlm6iwWblywENhP2uaqg/3tPfhjlT240Jh5blBqY7G8dh11eglZ1EHFEgbRD4divta1c2ANNvsWdxKh8w/QxiNS02fPdR6u8VpzOm/2Z0CO6H9MoAORwiqLIURr8ooa2YbZwOoS1YffoultH4jujfDlt7v4bQ+cQMETYAKXNeYsthHy0xJR3MXSZAvdjTdRbB8greaNASYdE+aZEZD55Bmuf3SHEzcq6yQ1g7dQx82upz1TNUlVkSNO2NULblbi+dNnmB9XfC1SdjXtVZTU01FGxfqkj/HKMgzpWkP8H3Sq7inizKNKhzCrG8Bg2FyvIb0l6KzPPCLVmp9b/1//+I+fM0NItcJQykeT93GOYUCsrqAB599JYDfeRycDqqMj9mOxKm0QYFM9mXyMxEhNNVkbY2N9hN39TMVSEplIsXMEbpFyafryBMObK+xXZNSEkR3siabNbFKntV7EzTkPuLwCCC+PgZnIJAmAjChKkTlTJb+Tq6tk6jqEKYWx2caQUz1Yi8yoEnYCzSGpViJwMhsuYfWd22oCwuqq5hgB5xp2vaHC9JH1zyGCNcTqLtQzizVE8xQLp40nr1YBIK79wH4iEfUN6xvovXsPp8Qy2n2BJLBLzkQaGq0enAyUqJklcIu+rDIsJz2sj5ax/Wqq0gxlVEZSbxyeAId7h1g1W5jTnhC1pro8IS8qlRK25rf/BkudlcbKKhDp9Lb1zGqp5Jw6ZWwzhBF2RfDi0IQIZTwbzqwXw+YeT9qlJ+g63zTcnmWwEF8jIwljBBLNpzOR46rPGTXsAaSQ6Ok2Njs4/0vyltVhT9t4G2Xohmaxo1RzlvNqxHqoW7nWVvPurKiR9lMe8NbK9I2tMLpr1bhXys716o1A+0837qiUqGJAJEyXEaL2AoOzkF4siGm7Hdvc01iIHqf+yBr72oaWfs6vMaQRONcY9Il+XvrPIpdjRHIgqjmoR+jxew2mjp59xqi4CD2s1O462WAZFWntqc+QwbEcMx0g0/+lFUg94Og4MMuHe92Y61uuZ9mHUpgZ1BuFWF16BBChYWOowTld+8QI58F0r8sgQXiNZGAazjXv0eQnFNNQV7wFaM1hxgbLTIStQQ86XwyIVE7WJbr/XYS/Sbua3zaKKP6bmV1/2/moRRJSSuMDoqISSEgIcaiEOHFG/LVcuCOBxKFCQqhSSxRI4thxHNu7691B78282dk0pIduValVnDg7nt197/d+H4mY88kRTwBcbJPT6LMBhUzSPYVFKOsxSrWtijr6whsfSFEhbv5UdTuEqQqvN5HOPUbd/u8iFmbAfRuFjTt8IoFICeQgrX2NzjkNuo4uIkHkeCPSBIcc3P330nvROiDKh2fEzE+DRQ4g50Dn1U7SIHtw5hd5aMxlzXgjeOkDG0EURR3b4deyjNITYioM/dxgYqfrrHy5wWdFFhDSWCdFa88UkohC2UwZqIIvQq/X4/Pm3FPT9vGQEeAQPyxMk1IaMv4l4u+uy6mXWshUXtZHXDVjM404LUAOumC2PraQ/0030QjdNbHJhxg3F0WtIbLOF11YKp1up/78YjlGBGo0TA+t0Mm8nh+RMN/nX8/Or3A7XzJ9vvTK/9LaOpM/BfqHe7ihtlnfT/d3D5GaEhp9xRsg1UaLYW2VCs678pkLUilsH977jKxrBrrydcWeBR/3TvDikxeYmCcYomk21DykWHN7svSZ1UTMPq1O8fPLn3C6eYWyV3KBy6+12q+nDnaEnE9PtGYy2yKjtZ0WN8fVup7QMEahHNSiNxbb+S0XUjQQokrK3We8oQ03hoYXM8tyfihTYWW2FYpVjuuLBdeIkpxWqRrKIIZvb3+IskMpDWs2ynNO3yWDfZQCkGdk6DZAsVigXJVob7oYlyNMjib44oPP8dWnz3miyNIGX5hQBOKb/G/8NXuFjXbAi7It1yix74Ll31uoXy2V8Pk6yq4Dchgph4uF4ps4AVKGoj43KLolfrn4FZ12Dz88/R4tDg90MhKa1B+NP8R3X36LmbnERXaO62yK5WoJW+WwAzBVUY9GPG0sKO3AN4k3FDnT6iIdpujuD3GjFtxgcLqC39M8aVAlLl+foVUAHUrpSDWzJhgh94ClXM8OEHUxs3ReLI0pDfLbjItnootWkYCIidGdHvaenCBLelgRbVIlUG0Dn2DJhSk3NXnFGkOau9psiXFSYXzQwtGgjc+OR3i+r3DgLBT8z3YGgNN8i4z2TGqYXUEs6EE2x9eP9/HjJMUzjTApbvkGOOMJMrDcAWaPR5i+WiIrnHSgRB1FqInW3u7irMgxJRfwBDh6NMbk0Zjf+wbAHMBvc+DlWYk//5liXlmstcKSEMJeH+sbajA73k3cMRpyKoJ2dqD7u6jmV26CjHrhaB9RY7O6nCOhVIGuYZ04M8aUS+2q7vjYNA4C2yqNxcWME0zIuVuHq157MYPC6OAjji4kU8aCfSRMkCNUSjTnBHKRBCBlNlEftVv9Q0cjykxAV/nvO773vruVPD2bArW3D+UB/jY3bwqHSPBNB/jjaBevz6+wrgauT041F3hMH6X7CRs2ptD9EdAeYWvTAJDG001K570+m8KsK6RdzcaJDMIrR5HWHrgWKRDf36iwp6+uMlxfzJgRZXxTv7V140x/d3eG6I+GjubOmYaWC1wGXSsa4hiWuuhO3zvJRx4SYWHej+L/Pse73zkBzAj9/af41/wOhQX7Rml+zrkbupOFbTklhtau1QaGw25k91o79dNnRwDb/HKGPZww0FtEObMqijSDsCJVUn+m1PQvM0b84n1p/JrSfn82mWCQtB2T1pqQmy9rbRssA6q1DZZ5Br17COwOGxv+If8FpjBLXVBGbIDKBjDOJVM4A1S6B+h7wBot4MEdrx8rPguDPnB8jOHJCS5nc6hNjo51DAy3fz1LJyB2BIo4bwahxLS0wajdxV0+SUjNscD1bMExqw/tibcc9Ssrob51b+HZgW7QaBj0h+8nqM4VhihrsFNXdcT1JJuketapk642o/iothRAgV+Xbz27NppKR/V5JfJSYeEmfpptnBeTiibwIsUOZuSxX0tkGh7fx4ttieGwg/Vq6+pE05Q+8JCPWdK+HwgsA/Fbc6zlBhvB2hC3Hb+X9CjyGqGmixQEPlYxPmStlKprAx0M2F2MY2CZ059oQl5693xq6sWULxjlJbVvWGAPl7X23d5Zp7sSAfqdRTsvdbVo6EWywK+PfA7q83bPV/5caUAUyROEVS0+CyxPjdgYwYSR6kw6L89eJnZY8GDzoBT1sryXORrdJR+wqolYyD6anWSB7r3dvmtcYQD+AwAA///EXctvG0Uc/nZnd/2MvUnaNG0JjdqCuCAhAVUlDiBx5c9F4sQRcUTlREWoICFNSNo87MTxY2cX/V7jtWMB4gBzjRI7OzM78/t+30NMADWfuVhReFdKh3caBcN/1Jwf0xSj62vESn0x8CCq6X6WT2gqRmdmeEeLjS5GKi8w9/m6o/mqE94QE6hJRB3Zo0JuMBhwMVjv0tqgAs8WVIPN/mZsfmF/jyYmVlRPXhaLTvYhckGpLJwV6+LwDJcpJYW3tIQ4FLche5TowoTqx/NsyFWXMHsmpUoooJuNJrxB8SxLb0Uuth2CL4PFALKOXpkJWZzJXKm7Cy0s0xS5moaci3Iq/qezkOO5MBfq9s/gjhfn+lAs1w2jVAe37NBPgyg2vC4KcfvnF4+XorwoStFfERVG59QK2VVmH0bzD5/5N4PR1drmDXR5k5n8le7I6JbR/KSqGwbywe8rDN6esQNsO5aDtNILh1eadrsH9Db7GLD7tmQYUzyYhxlMWXyWSDaM/i+dB33JQVL856iCovjOB8fbopSSKnXiZloZqmxdukmFybBAHt3Blx98jvfdLpq4TU27PUQLJpUOWPN/jFN888PX2D97iTK7QSPJxD2buiGM4MeMllIRSc+YzM4TPpBLuDTF2kYfrhXBD6uFbgTtFUdavAkwOD/HHfUVoYqM0FnUIkC58PSVorkRU1o5jmw2w9mbNwvbxmiP9P2I+Zpvr4MiBy6ml2zs1olFv8VMlomHHxbIfAPJuIeNJMfu1mPsNt/Fpzsf4XH+CH00pUjW6zhJDMjdf+/3X3A+voTvGrruGXjhpj6lFEy9KpSdpjuJBpPMUnklxNox4y6wAJiR+kTMkjHGyRjfH3yHh+0tfLH1nD+9FWVoRlt4vvMZPsEzFJhiwDaEZ9g7+RH7Nwf4aXSIYz9kNoMAkbTWCv5uFK94VY2R97rY3L6DS3eozvexrk+awwhp7PH2ZITR4Appl/aqIPK2JEtNOSkrdekt9ZygrofLZK8QoKIHq8QZVqrrj9Do9HH3wTuoCOgrKzTaKbzSaD0nWQDdjND/Ek3M0E89Hm538IAirPMWdtZibGXAFum7K+0+6/xT5+niaswMm7TlmLWVlhN83Evw1ZMUTyP5PWqqZbTMnax3u7RSh/j6boKXpw0Mz0rWfU9Nj+/E0IrkI5TjTxFkrRhYL6WTV6kJIUGeH+bAee5w9N4mfh54vHh7gReXQ7yalShba8BU5oSXRplxvGann6PT30B58WvQ28ummcvATl8foSK6eO2dzO8nYkt4TZtRqV+335O4SQItkxZHNZ6dvgnO9Maek/t7jKTZQX5/G0OKjbV8dN7nAg6YHpGLAlRYyxIGUBr/QXm56gT4p6KBKqRIxdxdJGiY1sCzR018u+dwPpqgIp2ITwIllxuFzGYCGlmLX+7cn4wTBl64A1uJhwMZR11dXLI0opwUzJri1JCge48koaK0uFspEAmQGV+NcXxwxPswSNL07I/U3HH73ja6nU5N42uXTZlDu9S32y19LtW/gFT+5xE5JL0NNBvrGJ2foJlMUdFz9mkAJ0s9U+lsaLYybG7msjasE6hig0TJB3+8PsYuxZuRSddSUcMa5VBoOAVnwY0UAmmvB0OOlo1V6hdZt5jeN5FDr7u2KHWMb+v/w1DzvXHlkd+/B3TbEgNaSx9eCQJEpYLmZfAmqq/qWGib4tpvBQKfIeXt7+I0hlIjMBdeILE6Td7NkT59AhwcYrz/G1Jfzp3aNS3DTPRYRsDNj3knnYq4zXwD6eErAQQjWfchcYG8YY6OUE1nkoBjpoTRIlWhbvZnhOEKq2W1oaAnzX5xIw2RqTQV6xp/84CwQXOXaJQ1NQuZSal3cgMCKqV4172WbGRsqi20eV4XJFOuZfxbfB2xrKzItE6/FZr1+ioUymogfssnzcXsbxaYwUs1ntNC3wpEkS/P5c8FG4z78DPOrDepqRqxp+o+b41fp/WKOP5n4Wf8zJeMNK0Qj5QlLkzvKHiWJI6y/OcgDtUH9P8QUOrUDd8651RDLJsMr5r3ugQiIm+VWkHPn6P/QwDjlvT1dZBlyUc8PON6U70eN29pAvQ/GNOjPrjrrwkG3DCm+74aTFokPEfwq68DM91nBaY3I/FsUNN+BqOKGTer2FuN2GHjCTdywgDwJwAAAP//1F3JbhxVFD1V9bqq53ZsnE6coCjOYKIokVD4AiT+mBUIsUQs2XgVkEAixqMSd7unGh6606vnAYkl1KrbQ/erqlv33eHcc1yY8VAiOF6wVj4Ehq4kbGT4WmmwzjfBhWslnGm04lOZPKBBoauqZWNPW11Dk8QrI4k260AbHMRlN4w5epCNXfPW7DOkKsQVvBvVLv7bOppXr6Vny1AJL7MWZOyh499I8JlZVUh5ClIlfpEZkzL8jmaUglQh8SgkgvO2B9W682YkVEUjiD2zTGr3m41ZYTlCHoggrwGtxqWKlqDnzjaoOBk2J2CdXpstCdr1WtllY0tcuCeOmUkb1d8U1v6ENa7XLXz+jgcqS9pqG9+LyMcwtMlLxdQKEVUTzRzTWjtiF+SMeU3ayWcbcNL1rzZc/2OYtHXw8yQX+Te95oYEsPO07n54b8WKNA2EggSxoblIY+M0wkqTbfR1m1Daff6n68Ab9g02TiY4oxnkVLtl2oWxY+2BwdYAbpCjTOYMyV1lG944mbnZtR0vb87HXlv3PVLnEFI//R+G2SU8BhA+hJ9JHeHQbrx0HjL4pcdgM8KX++/wZvQanwmI/c7zvX00/HwvWd5uhu/ef4/Dk0NUBcEoTW+V1tQRWG8j+tOdoqsVYunYE0+E7wDFqMuqAO0cuxwGvaNG2WJ+JWMhXfMBgqAheCYHHgoPZH+wadDv5gJPrCsO1Gze0OCn1hEk8qj+vT6aHrBkjf8Sha8YDbT4tIZbO4xnXUx7U+w/fYpnW0/wYusl9nAfO5hw4JWzVywDeJlCUGLh/+P0dziaQaWqu1Z2m2i+NC6gmj6x6N1Id/Ea4ooTvVrkdRjVW8OPPE7OjvDDLz/ii2+e4xl24eDY5kYYKilkgnvYxQYP8fn9hzjFMYZ//YzD8/f4QPpV/RRlUnGiyqMsaYb5aomhGzIygjgrcu3KG/KD1plrV5MKXtnejsx9MiRPbx75QCpAKvkp2eGKCm7EmpsIMdpqsQya/5kFukrklxZ9bE/3MGOIpeeiSOyVyPuX8zmGWYXnkwFeTvs4eAw86gIPgEDI2EeCEe1BNEKtqmgU+l2uV3x9GBlYrdEpZ/j67RO80uQ/N9Iub9wOtQT+AMbwOEgSvJv28OH8Ahd1T+0aiuaQYHq+XuDyStjAWBKwlO8v0lA/wzax3TtgfzvDm+0dfIUdfHsC/PTrORaePrdg6DDzE6YO/dEYvf4YyzAs0wSotxT/aswuPiKhkZVG9y7N9QQJkMjzSOzGPYF20nNH96hoCJWxwOZqKblC5A5o1p8QEPlwjM5gjIqQgkw4aXPmMrakUsyyJiKaFZcfdNL/y4fJaQpMXLgKXgyBrSKDK6mg5dmuhS8jE1UjKlx7Cb663QE25NDS7LZEWwJ8Oj5DsirhRo47oY1mLonNjdM+VZfC98BBuudyRLNa4fL0oyZM4idyVzByhtAvtNbJZCIjiyab3IgqyrU1kC/RIN1HhLH/n0P2u8l4F8vj38TOvPpG5rZZK7mtIIryPMVw3BOfxF3E1qgTCPkcFWVoz/YbHwr1dnglnc1S4edgwlbfzqaT/6LwxikMhxOiRBLiYafAgDg1CCK8WfGeGCfcdxUCiGuGxgy2HuyCH5x/cYMkDpMkzsdkAUmj8ah1y7WRYmMTjBto8xku7umrFlcSNRj4XS3/8PgRpq8OcHT0J8pywVK7/D3KyRX2NbUxWxWdM6Fkx70+cmblkPE2immIIJKuPSG8ZmcX8BvWuox7HHq+19n743wgu6G9b4kuFbeZzG21CupQmUpdUxyZpZkm9nGBQb44hrlLAlaG72BkgBOoOSVyNvdunAOUANaatHP3mkmtMx4PYLtyonqVKryd4/6OFOUDQjaaXY8l22tcV76CykYz0bghfyPOtXj9lcqgJwqJpKTSWPuLwgX5a8tleJ8gefPoPjTa2ZZ88TYZYKJa/IiRAE6QDGng1pI1ZCqT2CKSdd1lO8pq52MFUEMCcLzjZc5XJAYzRlja/baCqNkM+0DKaxVVIIhU+Tk3UXV/jGP/9tyuE9HbdTAyeLM5Hv9waeDWEwZ/4TDjz+P8W2I7kwXkWX8a71I0OF13Ru1qQYjsiGyCfNqaEgnOt2Tkg1HUS0FXGDdBo9LpskYP7xv8DQAA///MXVtvG0UU/vZmex27iUPSGCoIqnhASIiCEM9ICPHEL0XiHwCvfUWCRyqhClq1NC2pb3ubQec756w3pmp5ZKNIURw79szszLl8l9wXS07biLZfPM7HF5srVlkoitD1PombzRaz2Uy7xYMqjvOnfbCEFzJcDH6z+Ad3Cw0XGfTFPYS5+wJ3hXanE4QYbsCa/W9pw2dVlGGBYJjAe/V7byGmiXaRmyhg4Uqa7Y2FvN8Emp6XH+NNi4zDSxYgxe/Mx57aArYBedGlaVqrYKp4XmYCh3IoM1GVRUBuu3Nm2r5Aws/chh520g2sRCRxhiX8/t7TZH8jVMYVyc2LU4JwWt3Z81XQMWehwTlKOT07CybqdVdrBz3u/54VQCvsyM+t2TB6QYL0kbaxcVWRSE+81cd0D3tKbL56IT+z2JCvblA4GRYNnE+l3X30N9jQatCLLV488OQfAycAIiYMcTBUEr1RbMk0KINXFU2siRtxVEP59dXfaEUcKin+1X8SZObxxSmqTDzBo6qKpgVaT2CDupn3qp5pgV1Tk+clayYz9VVBaLBqborTFNpMVBk6GcCAaD0iaApudgnK0QTr6y0TqnQ1wqenn+Gby69ximOMyaB+05UZzEnBvOJtf//Jffz06w9oZmugEM5ey4AspgUDp26A3hCEh9qcqXBmwUM3YjQvUS5m6B6/vAkFp9ioBuPXz69tPUyYXNO+ztA4sv7kjJjNjqwIMEK9qzBLxrS+bKq6T/yjsQ51QoHJPEV5PsUqrvDHi4eobgVKVSRNjll7hkV3jM/f/wRfXN7DGU5xhAmmmJAvXejo26vm1iGPJgC4RpXsEPJGodoeyYgo2OBAo6in2WOG4ArS6jfrDdjO3AyYZkWHEkYU0xSb1Q7Pds/wpPoLd8fn9vnM6sdmVPj3E8yRocTbOMO3y3dxb/kQ3/38PR5cP0IsdU6JitFdCJuwxXhxxAKAo0KjdXnSqLLPwq1/+udjvPPxbYwLEhCw3VY21w3XKy2QOg01echXDdEOoaqxWq1UG4MaDrJX1qhk30lHmJ/fRjadY8VAUNXmg1n2UL8GNRbFBh+cjvDV3TE+XAAXmSpvTw22L+m6zNFYnSJ19UoQJGMzEReONTuu7WaN5VsTfHSsavBMkawR1qWa+sOSJlg3W/qKX54BV+dz/Phgh2uJXEvdw7lFBmAVEvzxFNjONbHILC9s7LgTUcuJWWCJX7zU60WQLt4GnjwK+OVKPPmmcCTyqgsoyymyyZxc58QstJLBXFN3a7Wl4nyyvLV33qGdb62Wv4UKyQontg36u2ZXq15A1eDl1XMVZkyUzsKAlkWnEcYnp0B5hEYCJpLINYCnf7p1seGjJUFiAWsa6Hi+Asi131/9h/+A5nrVddgBTd6wox0+njtRKdH3UtpaStuacPFsMlV6SmKxBhE9egblownGswWqYoquVZvAfACtT8jlF35GhVEsVI8k6mMU42ShtKWugJ9Ncq7N8zGev1gToUEqbavPocsRkQY6XCcnJxR7qusNEWXwQDOlsgz3JMYQA6cjjY1AZJkNyP/6kt2JGimE1ho1z0Q02Z3XTF9Kg/xs5dEYi8WMje3KlLu5dyJ1R1w0UoRc75Ael9a9986yIFgVhivTIckV6WxBNYCq7Y7f0fRFqEIUG2qjyP5wuVzi1tEMoWlZ2NH3qKi94JacwVxrKIysmlJSVLu4vAPeOOnrgP/oqYh9kjxwUUk9aQ0uXtz2BQB7QGOc6FMfEcUTXbQKrPNM3adkv/fLuPN/CK3ivTsYLy9Q/fY7yjRnwUrEF7meOntG6jGfI/O0wy+Csb3DiFg2y7kgY2BF5SBNqBDNt35Ip/Gx2Me3jpjRROn1q9cFtCVJFpSmJ+C9A5rpUikNd4+gdURtPYivGYsdwuINmi4iwZ4cO0/frdPrQXLuCbmLknvC6DoAHuc2tBvM+JqCoHXKwWE+5mheoqsFXZvmfQ7ml1uQ+/7gUPV9lz70TUK5JKaCJZsI+/+Tm26X524+Fq44H0Poo1/PuTKzwguOdEhVhDt15y9Dqo2sSJNY81QagxReFI2ypundwYav7eMg97OMlY9zZk01dRazmN9QHzXpDtLc1vVzSCF3lf+R0cwpVXFADx5SAjxnGApB6hrVxo+sKZljotB9nKzoQTtCa7b3iHdDnzgaXXMmE/mTolNWELFdJCr+NyxOMcfqlJbfSjEwSfEPAAAA///cXTuP3UQU/myPffdm0S4JrBYKHtKKMgUCUaRIjcSfpeAvUCFKChpEQRMhsULJ3nttj2fQ+c4547nOIigRE0VKor2xZ649cx7fI7g6+jyvyb+LFsAWrSwoeQYoFYXtg9Q8pqqYVpV4WnPZQ+0VMk/+YQm4TGRnQg8dYR0qRsfKTg7lOouJXGRLqqP56fv1CuRo44EuL0zRB+h7HE8zu3DZ1DPhghRuV1gVIgoSIKXC2/H18lF88ZNxsx1dYQmkQ+1zrZNQKfTX61fDY3wU9X7jy/j3UJQgN8KvxSLQrCm0UrisD1EIb/l7umcpVfzntetIukabClTe4UdFoMTm4Y4GnnBnS2okKfPCA8zmjyDp6gXafl8OiaF7RAjcpB31QMTJrOuwNKsQiqMddk922ik0+xaxYHEaQ1PErnQ+IoBC/820UggYEBvjNRtXLm8qqGmropoMpu0KwzFB7OqUItp+ULeDAAAgAElEQVRW/rgwxWfg4t1LjE3EaIH1kjTpSioBaLxw64SnaJaNSvGYrVhEtdB+R59vEbYUaols0IPAyqJRQAROJB0iCqzNVkyIyLGhIv6HuMXLz17gY3yAwULnfzLZYqXShCFPiPjp9DO+/eE7HC6OSOGAtou+MAw5terq4UNrcMaWFVoG0VJoFM9gsbvqG+1s19fLJvomfMvpHNK8HZ151EtxKxuyRz4q4qAUCK0KAP5nqq6HhP2zKzxkMewbKSgXjwv28yU+6j/BN8+/xnPc4QqiXNyZenHdHVmfZwVWKgR1Wo5ohwVTfEBk4jWYuvZamS8Wqh7rpGxevcp/Lt2TRuvULpKWTT09TipSOIYJv49/IO+0Sy/fZlcKDn5/HQPXvt1BfslcXnz6FQ6/fI/jdI9xeVBVcHLyIykMw9BAbjsetEPU+HtnIlgC9hjFEYGQ2KUshe5xXsBVZIFX50XjTFTQRUiH829VeDVy3zTxSwkwnlyyy5y6rsBgGy/ISQEgL7i93uPLu2t8/p52/d+35NzNPaN3nm3P7gypJiWK12O05DVhFxpc73e4Me5uMP0n57XnohnhbHiFiN8B+OK2x4+/HnE/qTBSMm0M7eru8epeLBkvyP2XZelq1W1D2YakySKdhhqdy83FgLBMmJpF+duGIJpkrftLwS4wWWkM1gxooYgxfQTGN6/RpaviMJA2FDmFbS7o+o6iVuNBhZuElpLGpMlwdcRQM0QEi8TiSorEsvWF87NExVWz8XkzAyqzl+e8/sujeSTVCq4BMWwYyxXvOWcvKbZ0SJDfueqrwnQa+C8ScpwS+eCtaXVQTNBEpgjibowKRppUz4dYtDIOfz7gnQ0iu7EgW1BMrmdTHq1ms5n+DwbPZynaXl4wyWcR3KX9Zf2zw9C1mCI7gST/jOtn33ebKo3UMzub9gU33uqQIWda4kbx1+5648gb0idTcIVbcwcXmNVzdCBavlcRzepa2fNiVJfJeOtci6bXgUoQ8+8Gzw+jPPBZOvu/FK3iVIBk4s3weKXueP+Lx4MWgRLcCBXg6TWGZzd489srjKcJg1kk13M5mxelKBZ+GeKKMPDtWrxGoNSKrGKzWZqTcXl03jmvQrBM1tu1UZirAkgN/VYKsgrryp5HFzPaWyv33y3RqQuxKIrwmI7ls04bldyjqWwJJUZWVzF17NHcIlHUzeH1jogoa2Kf9zg8WDK/F8HkuSn3LXEhG6F9QGdi4nGOJfl3iLl67WtM2IZQNV8j9QBQNWKJxMZc8oG0sdH24ajnbPx//5nOrLt7Qy3XeSGTaqM28D1pFfGIqhlbc+eVupEKIjIXvaq2/F1ui/ONyoV3OHwIqwuAnjtLQZmTVmw+rw6j57ACjAuiS34r91/nXTVioraPd9tGQXBsh+dEbMYyeV91C+qcUvOvNcKWPMcLA/rzni/oUOqk7Tl2XtNJ4HSsdAHO3QSkqMLCFM95RQ2wACWbCYC/qLuWHbeNINgckZJWkVcLxEAAwzCMIEByziHIOcgH5JBvzCG/ka/wIUHWuQUwvPBDIsXhjFHV3cPhrmyfPRcv1guKGg5nuqu7qlq/MZ8YTBhVI20S3O9d1Q/NW9wSKud6XEr8Lw0mrJ22nDMwwheYxlKV966D0Sreqk4fyvVL0rpaFTSOFWbj5XgC71x8fYi1ZJE+uBoVcf6Kz0ERnMBikIcIIpNf48orEPDwizrdwZEsX7zB7rHmvPiCc2GQgsQV4ZEwq3aaKJ9aKWqLUh/7MieOYtXDNyoCJkBWOwVA4L/JeXBzBdIXlNKBJBkoUls939IWb5+xsByshHLwonnrjlIJ4rw+8iwS2JaNaek1XLcm8fedditAoKU31NNtJHFtCrxVnRgOLOH+YAFIDpEJNIIy4Otj1XjV4+PrVVu64sK/vKDMVcLm1wyNVsO9pEX9gHPkeg4VMll30sag/P/TNFIwDe2kMURWBMHvDaIWOkUDQLTCXdBVU/BnvwDmvF1T1X2zvWKr9Wg2NKdBxS+Tld0ibz/JgANvamVzt5NffvpVvt99y0QmX2APXhoIWIOpqP+dbuWPv/6Ul+OtdBt9N4ocEvmvpbTAymsS5YEzeV2p0N0Iukigtx/F+Cb3E/b5z/5OZVb0k1kKMQ4sQlbVu2gAAACP1vYFrdSMTOxcMTiIHi6Y527Xyf7xXoas7ypE/rpTkGePnsrvP/wm38kzuaE6AoTrmmUF895+4MrfE4z4hl7O/TvJeK7BDrugOgg+0pSLtziVhK0Xx90gdPlZddBswkgrCTp/7Wkl67Bhl8Hr4yvJ10kpnGKiWKGaIguw/L63spWfDz/Kv+2tvHz9SqYMekUrIwGnKH1u5WrbSrdrJd2ZgmKaaRSodCHA7d++N8rLvG95dcTfF1Y5Vl3h06J2DTvHyPNGq+WjWZTCoQAt0FfXN0ymZKXq6w0/UzUEJuNUX2828uQg8jUq51DBN3eCVZ7tsesgtLX19T6KvDme1cIOAUUIctiuraPDq4n6g4MdTiHR7pyGTwq6As9v0NYa6WufUqcgBhPDltf5/+4o/73byjd7TSZxnbUX5UUBEOdKdkho4JaAOUMXCs8euMp0lKY7pihDVh5+kmW1wvcnJDvATEEDONDYzi0GQ+l8mQy0ple3Vbz4DDOqVyc5n4YCoviYjPJzeHSQsFZGPyuiRpEI1o2QXO8r6DlzHMQsMr+A4VQJiyEAIwIs6iMUnte0TnUkg5oWebkZOABQtFhrVX2siVGrmy0FSzWmwbuK94GV5Qae+AUu0PcFoDMcIobKNc4DVZM9wzMHMHNpZOtYC5eCly9quALJWfrhjQQIwUKdnvLyIxP/OYv1c3oiQI58gPYf1Ybt4B4Uy9NZK/chfz4TDkYTxdpPPE9tP2SDvCrLcG/YXH0SsL4/GhN/XTylfO/f5tP3Fyr7vkKHNZHZXOgShTBvbdou3hbEVRJmktzyw9jBgEQfWfrNQfZPnsrdi3+kR8WbnXp2flUgg1S60egKa8Ja9rsdOw6DKKe7Seq6ELNRsvqBnXw0U7zwfZUGsFoUzOqEVh7ElqEAlNlU7BFHUqcFn4u4LakgJ+Jh6pZZzFV3pzZV5ZyxQp5Kx6xaiqPivGEe5YVBH0yCsxSwQTymNT73+Tw+TMQpkB1l95XGw9nU/Wnv2TT0+kfsHq2jNXnnsXVE07ZwUtexlgr+TakkX4rDfdT/5zZ0XWUVj9yBApnmfiBVIZA5o4t5V1+nJNelQKz3GbyAmt3mfNbioIaQdb+yS8LmbnZMMBpoVM2wWTPN7c6Xe57rpNU27MxNrOvXOxg86UYeAvAPf8d8hNpSVQHTqMa8FjUMED/NgIgn5su1O8+16/A5ff1z2wX0W+h6Vmwf1fa+7mj+6BCRDwAAAP//xF3JjuREEA2n7Vq6egoEB+AEHEb8AeKG+GL4C75hpDnODGJYpoGumbadC4rlZYbd1TckLFldqu72ks5MZ0S8JcRlWVlFgAfig3/uKKN4m4+Vg64PpWWOth2GbOEHWDouRqw1rNKDmxfFwmGwG0EmSxffzDMBH+daB0UHg8DeVhhOkwEtiYAH0VeFx1wnCcBIwC/pzdPR7+RgPSnnRwPUXxvO7XUIJPgcetM8aBMWeBs1E8eL2vT4+EAUCLRlafCjsEER+PutGgJ2j4KCmCdLuoTVoBDee1EuT7DsEY6bTXANMHr45Us21aDXOA+gTIDEkBvoaB+1cVQejMCa2MbCPqMSD1jMbJV+cZpIjY4wmr9oMP2F8/lcs7JD/3hBjAGK86NPsigHnx+DPXhHBAdz8iIqQHT4di+bjIL0nTk/DXNlge+PTqKTMJeZljzTwu3Me+QJQSuhDNtPCIhKi9r23Uj7sqcQR8pTR3HK1LEA2XtuS628TZLUG6ojAN8nB18lDjS9CxR/Hej7b36g7z77lj6mk1ZSbDG5zY9ktycrYP1NM72hX+inn3+kt8tr6p4tEoDqwzYQLWyIuuwWwblWxOrxk44zDoxLf2360/IAN4Hw2jDZdsNKpyLY+QTtMnT6Myg3mSkAsSZuQ6UYqM0i0fHZLeVDEFoGV1Uf/onUXQJ9ff6KvqQv6Lbs6CSg/E3wX2Earr8ZqJhtHflF8OfdnSxM2YKxyIKlq+PIj4+KMNl2F+fVrOTUUNtX4GCmSh2HSC9evRA1fw7UUL0uuTYhLrCGYhyw39CRnn/+nPrYa4WIEUOclCpRkrVMZg/sAd2tvaT70paHvPgbzBqLTHdD5n3LXieMIeaLp0W1YFKkOercgjXbYrxd5ZEPNJ5uBSUTg3JLudrMi9cM33Q5P79k1dc/dk2Jv95uwcq6leJ4BH9YiC7zpHSNrFWom8PBxPawcG59ViCxBZ/hK6/3fxYBOM7+z5LEEEcAfiaZrdd6+mvp6OW9qv7XbgitB2r3ggCbk2tvC9HrPx4opaAJj7yIaNxStG3YQ111vINBntEvVACTL/tyf9+CFbSHm5uTCT1hHhT+II+zaSbTplppcvA5OCnUH08SDBdwKnkOLa2dLA2k1pWR6P6S5Plcyjpd5+cWS3ldGf//7SZw8e2g9dfUNZ2xYsH/75no7r0KgGlmB17vpSKasqGbyNppHbRkSfpJv44acHa1AuvGeujtOy8CplopbCF35Arl5rKxZJRK2fFQBWOx+eNrIsu4KaUJwGmyGUJt/++GfkaPdttYcS8+0Lvf3tA4WM/pzL5QEui+gQxGy2tZ2Hq53wE4oHNevLqmhZUaB1p4PoK6wfsta4JwIIgxh4r22DsR5XKtx3VuBGztF8lzrujK75/eylobWI/m5jL0Bcwc6yp9qO3y9KbVXdr1FD79hMphT5MhFVfXT+vjkgWTfM6b3SjvrvqcOlVIx7jIU1LXHrSzS4gRqqW2VoPfeg0s09rmEJVi4b4DTVpyRQKsAkELmsExL46bTqDU2PGLWdEJBHun7zqgMxmNk7C2KQ0RrMLqfaUZ8HdKFVB0nFKj7f0c+hrUio2ug9j3VrTFOhkxzDC2tO2yOHE/Lg5xMG0IXQh+bzeOF0SNPjVk7DUO/mwB9GCUX/jNA2mNn9fGlN/EYj4hJkh1vV0RAeYetzOablXCt7b5YOiELPSMWeNIe7f1Rp9I2A3xhoQN6BLw70f8geI0/70Up80NYKuL5mM1xCr+u1q5d21Q3eyy9jP5X8Tfm1hC0HhS8X+QnduK42OgmpWyv1+JzCOO0jgriXW03DejwWOkfwEAAP//pF3LbhxFFD3V1T0Pz9iOpWwQYovYs+AzkPhKdvwCqyA27CKxQkgEJYpRsPGMZ9zdVYXOfVT3jIMQYqQokqOMu7tu3a5773m0hPqLomKrUD9O+kexjuvMjgYCY6CnuPA3F52yW60gp792nVKfw/9laqGwEJ9cCzeXm6JXnj4Tx2BFVOOCFg6xV9WrmhiDcwtJJYjO9bEirj0VovNAo9emBz+DZmGwEL5ARzH514RPgQQmaE6GZToVNPHJhMi6UMk4uOvVom76yAlzUmXrMFtYh/0jTEHgDZY8EwU8DZ6mwkXOP86tESEf+7c0g3nwPtwP3yEuyWgRDPKriyvd+GVA4jqbaj+LLJ8EZPMqFfuLoOUfRfCaMqEq6vVCvVhH4b9N/CgRqbBmBJMRg3MOeZrgSEO952mDBFP+H5UHzyBNjnhQu79iMChvojSBdJIsUH9+F307NR46KXorUqXoxm5nnJ65zZ/DqE7g/EW70IzDCQ2hcJosNJkOXXfu3NDIgS25BkZNwB+DrumP2yXv7QiEXiadycSzFEIabWzZyx4gPeZgwpNiDbdTWk0ZowQrPZ+FH95mW58k9lA5WYIvKnyUaG+5X6J5t8WXn36Fbz7/GjdY6dRO5HhmENhZsWha9NVGiTIwH/CA7159i9e//4jh+l4mlFEKUROJK7M1NtcJOcfw2VJ2PqhCYDBUi8CQ4VA0fbnHOeLEzttELxwPvc1dzdqMeSLHiixJXcDdcY/FqhPRUhaMuz/vBR2ZbYY0CsMdotrOP8vrDfaBHvsZB4qgjUs8PRS8iC9AqaI1C+92FDpF05xBgcP8IKfRkOwIS0Gn1eUGu3KQNVGKTK4NNZmSY3Jl0ZFzeHZQZEE3eJ5LUtFpDPL6uedLxlOb8csfv+I97nGFyzrJPk3RmkvpYW6vdmoaY7O5Qlh2qv5LCguUL3ocH1EW5Jsbb87dnQw6qsUljPM/wdykoWv2qX7gIm9dVIKZuwjR47QkPsregXFjg1+j6Ec0aC+30oDIBJ6HJR6fjoLqYJUqVpZo8Ob9PX7Ia1x/scZyi0qZaNWFFK7CoZaTBgkmguUIaXsJAiCpwGE292rRzpg76ATdATr80vgmd59ht7PB4v7whEKbyFTMFtPiXUQyA3663eOzmw0+WQI3FQ+fzZU+1G4Kn9pvAL7/ecDbA2NpJU01dUhgfiiSMzYXWxGhy2bzFeVpKLSZe+fgIkNsaRVX6reDL8XqWCzy/US0UP8kImVtbmUvsaHTGFLCp4kCnS1swqyxXr/EMdP+r9GiUegYNcKUNyx/t7Ku7253uBuv0bf6XFxqKxlZJopDe2MWgv9vSn3O6Z9wTa5UXupEMhmVA7OlLpZvmrHBU6tIp9dvSdtPOPtq21xlBhs14aeY0Qzqy+7TVreBrbalWfVPDhzr23uVeZruGNGQYlICR6p2rLHuNojyPA1SXIHsrmekvObijaWiDgyTUKxED8rhAfjrA7B8iaZZKY9eUEl5EtM7ucXTA/yzA/1/KEyB549w/sl1+mwoMLOUFN05q1jl7HJ3j4fbN9gQyszzQzB9lJnFnbxCwwKpqApIhWxbphqMlhGDobZ4rmDTPU5WxjwDKjJSJ4yiu0R0R5lg2sHOZ6qlps+yJEP5xJn4WEB15/mnj7i/FJ2Coy8wmFc9Ssga/YuPxuiOAGXOZjgVNKtCuAWzTvE0wKqiEh8ZdtUmcDKIz/YC3eVG3qmNOU0ZCUj3BrRhVixOGKN8w6xCi+1yIXYsIsRq31+MlscNwD1ICkyxyTzPC7wmpasOdn6zgjaaI0aIVsRNItAhqqJ708WqF1SptUlh1D6c4hkym+A5tYZcu4bDlOR6DTZhlzqBNYQLD6Zckb273b4WqsX43Y6y4s+Ph6Gq8dchnTUe/DPntvukfynnmn7WCIHloGmNPOZY/+jAz4vpVu5L4qQfzPXgtAngTSsV6TaOv1F7OzuruW6RNkDSyTUvWnXUEQHzXjW10uBi87E2oaIhzAWFzsGONRaiWd+FOZJ6ZuXXRdXS4HPkEO96e6nCjp3GXtu0AtPnWoxOB7V3IR8Sh4VswG7XF4ogMEStghUCQjfR5BwRrBbhrJXFf1ot1k2l/7kgoCIiuKY+4BYev+Uf/j/ZPtwvrE1MI0s0A5h32FDqe9HKc9oBfyef89AfEWIngrC69oreYaOK+VG0zAqbMyTq1SuSYdhqvcR+v8ffAAAA///EXctu5EQUPVV2O/FAmEnDCDGaFbsRmhU/gvhT2M8KwWJWLAdYBIgmJEigkKZfbrsK3afL7hCBhIQ3STqJX+Vy3XvuuefUgoYkT1RMzEKoEZWIiKlYHNuzFZRwmVgPv8QM9eGJroiL2QC6f33RWy+TqHZ7thDCpOJsfzuiL4acRf/7clEi1sKhG2niexXSsz58GnCjstBnlkRDk1Sh6avgmqJeTGnV+2U9Pcw200q+ULMHLvuYFgDvX0XrglLVef+LyheCnKf2EWXyVYoj8kSpaxcWtMBgBD+OF2GrZMdCaZOTaUwBB0vWDcVrZiIYdn2MIJGgU3s60QGgl3H5fVU4OVgiblue9c/zgrqInoyz2KBOnqCqqd5vpCJ/xv5gFJSCo7bFarWa2C4KsJH9JWKIpD/DD1BlRLixZgXUmrUvoreLWCtJCH9XqxqT36QLoVW3si7g5skbkiSUg1oLZtULSFEWXhbACRmb3Q51aLC/7dD2LZZhifP2KQ4xY9t3zDZYdRts8xpds0d+TJphC+RQY0uAzAmJ9iywX2d0b/f45N2X+PzTz/CEa7/H3shH98OrF4mrsTe4xRevv8TrH77CcL7DUO/YU1ae6fu6aOc/J+mXDWJ9hxm7x4KXUPy7BeXwXr7IdHXKwILbdsqLlMGkk4aHYeiTGew5BVIos2a5qC9+AvWqgC0F8CeniCxOt8Hl5SXiR9XImGEkf+DEq4LKvc/qmFa54ipeFbkKfOiJ4msVXwmC4KBYQUmNAemeMZDnVv2JtQfWAm9mvVAVNw34s99iw8oMKjZnhfeMSfKfNfFRWT6s+y3utmvsovTPMehDrhR0D6PoVsj6Na2c2vPi7/oigC/PXehzW5ydnQmAE1QI0iQK/BmMnAxKpE/v4KQBm/j6cgGWSbby3FAivB4WeHP1B6rc4frZY7z4AHi/AZZBtAAeKYDCzTPUJ8kMFqroJrZro+e2aVoMuw4X1ze4+fhDPArAspa+/HGiF9elAfOgv/6lA9YJ2BKN+LSdWAWRfsE2LvDTJuHNHfDiqSTAjVY6+1HTjcGEtwBe/dzhu+sd+vCeuEHwWFm1f2qHmsK0C8Y8yLOPVzkWUtWgwNAA+qFoaSLBvwpjD++xI0hETDUDEtx+EOWdZnMWc5o/C+ZH3B4yLjfAc7I/VfaIdwo59wj3Un3/u02T5eIYRarp74akLB8qTh50PL6++BWrQVGl6tgjHQVTh8CXisdM7stseHjgQ7nmW5LLB62YOVKOGvclI+oanY80WmyM+jQCi/MtOvOCgIkNfv/xeyzPnyO074jyOsUhk5P9v1oFjo/Ln/hFU9VjhYtvv0F1uENzMuh6S++LfraP8SsJz9K9i+NTIHtTtgc7AwV1sBh6F2KzAkKvRaWGWC9qMzuoan3OZcKWGeiFzgNO6IpjWULu/f+qIwGzyrNEcdfht6srPDu89HaTEYZ/YMsWf/wLUOYftDwc/UvJ7Ka2z33HwCj3Ok8mcfToARDwlKq95LtbVjznbAX6uK6pCHSKDdlCtzUDCBYLTmJIiu+IARqn9nJ+BkHEMjnxS4MWkaJXebvUTYtERbxK31sOVNLCoSAxHVPYbWpNO6SJWwCtLZWyAiyGJBFBill79arPRS9+MtecomrMWk6ao4hw4dpdDIBpFZo2czkwj34BRiSmTKq+Dy7oLjz2MLCe4ne7QovDUazh8811tcznnvO5sXVChNwbTqrHfShbmZ8VqUwLo1ntEQe4mJ0J/433PHh+KExyASHYDu9wcK0AFHFi2RIuIoPCIKa5STpgBCL4/lXbSq55ZIBz8bEARmlsKBczNjtdgwmdcwFSwR5mQCrL293ivOVb2BN8nnptDNDsyC5Q3PfoPEWYXsaBr5PEuy1/LtouaJP8RAAPyS1JgFnuEe1jsVjgLwAAAP//vF1Nb9xEGH5mbO9uqjY0XEpTgUBAVXGBIwducIILP4AfyQmElBMghMQBQQqiqpQCUVMFJYRms8nG9syg92s83i5VLmWkHKJNdr0e+/X78XzU0q2S4sYuaM/cGwkwzK2nG42m9zGOui+pUEavqvEJsfexy4QLdJszNYOYHwpLiK5Q3LSTso53U9rZWbSIBTR6zFfpssigbWqjSopO/VkHO4g4ipWpsNdAISBYrgxnN/Vxnd4JfL4Wvt6KFeEIYh7iqMNkFg/2e4yDwIm5BFQqMGLCHF6hNiYEYcdknchYdK3wzBSw+L4x5Ycci294lyG85fGLSFkaXUhmm2fCFBjx/NcvpxzikjOUu6+kR+BDDuCmzLq62AFAAza9Trx/24uJXrNB4UurCq0vajmTalcPdIMgG5y5PASaDhDKgj35g6BdgvHGXVAYbI+g0HmC85Pq/J36dby9dRfvvfIuXtvcxrSecZH2z+Up9s+eYPfJA/xy8hB/tcfwRAX1LVLdi/J45+GXG7g9eRmfffgp3sCmCtkNz/8RdJIPx+t8UpJj2okFFtj59Svs7H4JbLXo66WGS5/VjRPGTb5UuntYeDWhMo23hBJwyifniQwFw2TTNf0f/XuKTyF74koZ73mS7rjhRoglKoaJ03mDirFWEB2mYu80RslPEv9u0rEgJEYn0PTm2gSX0wW+2/0en9z7CG81r+JmfR0NCxeoGCXtlUsZ8A81EGPlflbdbhgtEBV5QHBG4qOmlQaq5Uu+PPVA1pUQmGPM8StWck4KoJkosdOkpK6wCAv01RITTFn3gVE2UJVvhnf6PO0jyDy5OBB14IK0RWaOJ49BU5pQ5HNJJ1xlKLHcm7jH/X+Ia9BrlGAQdI24dD5Va+Gl5knOHF8vUOv24oIeEhpTE09hqMPPB8hTzQqdb3B4GXB20GLv/Cl2HgW8eXsTd7drbG+Q0KWo6k/bgK1JxVD0pwk4Pl1wEUsCUswljRV+PznD548v8fGdKe46cRSQDljNJ8D4/7ZRS53W/3AQGOZP0HzSkSlzYGpSkGjf4TJgb57w4CUHGiQ0KkRIx3Os1ICDDvhxv8dPf5xi/6SGI6QE72FEtEQhCdye9pDuFR+Nj2wWjQWNwut1xE19rBVAMUioaZrkYtQQAMXfsmgdTW+S/FgxM9imeVRRmnvRG77B4bzz+OLnOW59cIMbAFwIgeyEE/OmqT3W6We9SKvA6PwKQsAyFCuuhsYupYUHAL45A759vMBFdVM90jWQqNq8BSiOXYR2TD0qbi31g/uCFZ5OHPjcRDQtZHIpU01XOOuUCWPv1EqWNrupMsTfr3QKqUZo1whUwfIz5lhHzHyLo7//RPfwPm698z5cPUNNUJZg38k/U5D9X6ssXfNTo9ULgm6YcILj+19jfvgbtjcb1txIav0byQbPCZ4GZWObUKu9WLraTo9oKESdmE35GVG5qxfPWZ/HaDJqXwdVMqf4SYil5y4t/g3KzgK2VEylhKNHe9hezIHp5vh8XHVRkzWLVKodHz83tSgnNG0avsxV97w3gga7VvTAyRHa+Vzua5ho+EYAACAASURBVKYgPv+NRLQ7ctyh/FQG2CkDEZxqiDTXNvg+qVhA/EKeWVk/a4Dgr3t/VprvB3Rnrf7xRo2Nqnlgul51bf7q0mAg6p4NJ5fdMjcLeJCUJO8MBWw8XxOa61cqOFgOJw0ZQM3X8/OF6gWIn73x2G0wWaI1GLav8UALOC5aJ0UBXy7KSawoNDtAa4hY7WGaCCU9tlym3m8U1Mr0x4gDv2LVntTJy87duh7kGA08Rtx2CsWH0gHMGrrm2iKM6pyBkiCvJaWMWyOAB6y+UoFAlwW7c33ENYXURnROyuKfj4dyDkXD076QUxN9Dv0PnUseilcNpkrzoLvKGgFGYV9dZgUvDa+A6YSGmkKXqWezbPPIGg6qmUfXI30vynPJktcaCiyU30xzU4G6xaVbAzVLNjau66CYGl3yvoxWoQF4SviXtmvbbaMIw9/syWvHxC2ilgpCQSKlXAB3PADikgvEW3DFYyCegmegSDwCQqhQCRWhogJRA1ELCWodx47tPQz6T7OzjrlB1FWU5iBnd2d2dv7v/w4ZFKmi3GdDVEi3mKZZuLGoA0qDnURom6EhievHIMQXjzaIqb1nLUgQU2zqjuLC6NvABrxhcwvWbigKRRQX6wDbprc/Ue2G0uPZoctgt8a6i4wT1LAJBboVxlTA2s+hBSVRIylmI5g+GIVf/Q/oHNl1M+iKai6SiCoSCujoxvfKArBBY7p2lCbAHS2d4HKdO1DAYgPpfC7mcwFldGPQbdqyniu/12QAQ7CMQcCO9AYW6D3M4IjG+wV6sUXIJUZza4KG1xZCH6UC2OIZxxHGOfzb6KGhqfZ/M5bk+Mi6CXMwaHx1YU4jYxD7O1b402dDRWNXT/NKoIXM5mwfxd2m86vuhpz1GfmXRTuLEL1doASiRc42A/YRL3leOw5W/HvLkw6b6EaTeevO+bfK4NcObx+8g/dvvYdX3Su4hrFqWVOshhscDg8xHd5E8fsIX5/dxeWC2AAeOT8APDYzj+niBXz47gd4zd0gWx0Y1vtvj+t4o9QwCbvGrxdH+OrbL7HZv8BwkuGS6OdOK0Yv/dAsu+rDcOW9tZhP9B93H1vpuJr+cLtTY1pkl8rC1ngTJ2jhzdRLzzE+GWkSydSHxj0rAijjAiBh9HXPpmVEK8vpOIiRkqU4n1+gGAHHT07w6eef4ZOPPsat6SGuFxPkiQEITjtKPnhK8zWjjQ0zBFKWVjBPnG3wJVaKiixz1d1+mNocicfF9IPe7eiQsneEl3gXn2MvG3G0XjqS4koQf5Ok+B5dlwAmyjw4ah7h3vF9TmCgh8vaVYEe3bpuPFqmtXspOre03KQ9biKydXxPsaaxacM6X+w45+3OHF9NGst1xWPCayqvKYnqbyH3CLPAqEbIUfkEz87I1G+FR8sGP/2Z4GCS4fZ0jIOhw5QqpEKArPMKeLYg/w2i/Tp2sKYTPm8zfHHvIcriLYxuyCb+xSRF2VrHrius6WlFmv77a+Du8QzLNsOgHDOoYoAVmRxx5j55yyQOp8sKTy5z3Cxkvs/XLX5ezPHHqsbMDfHLXyucnCd4uiywqRNMxuQ+LuPh1Pwy6Ha1wHSB0tsGYMvmS+M6EMcHRpg4Rw9UAhBolrwhVOdmnWs9CZiCTtTdThWECJ18647oZ6dJAHQQm6pB5YY4mq9w5wcPd9vhjRK8/hALYl/ZEC6K4EufhxeA3li7C51OplRBgJ1TAA89cOe7BZ4m1+AGe92Cbr9cq9Ept2Ic3KaBq1YSmUHzHibfi2Z37tDmeo1bcSAXcMbBZUKXbbRgp2NdbzaoabLkZMZJGv9lEGRxlJ1CZ9QoI08N766u6d36R+N2yaav88cPeMP98utvAnsvyTpFEZCpGIV1z8nnD6DHr+7pLHG4oL3ZagE0Mzz+8Rv8/dv3uF5Wcn05ZjSPru7u4r3hSOPubGIeE6eEDLJex3YdJADS/TdvIZIQEQBJYJtXYA2JMkacGTYGG1ys2yYy3kOUv2/O5VIMwwpa2m9sauwnCc5OT4HZDJiMlXXi/gMK8P++2t4zQfYwy+MTuPmcY/0IQKdnyG7TPgGPrdtNDcfGNP/b40XrB2XRZwmD+WmRMdIp65XRz7v9nMU3m7mb7P87vyxj9trX5lFjTOe0lbu0rutIwtm9TNJMH2UxkEYnFZiVyBDjjqy9emaEUZHNhZ7q962ByPv21uS9fSkd1Re8t2024oPVmum1Oo+kab9BqnvYAbHyLF4ueBi0odbgzroeomncrailumFNEYlsAt75iZlcM36+e/VMEKP2eifTVrwIBJjJB1lgJzB4wM1EjR9Wjwb6u7XWj06TAwTsUNmnFuVkiGfHImzhmpmG5j1kII40aCnylmo6qUUZSKGGxFb9yNeHU+VEkkVFd1kOe2lmdk6WEkDvRz/nSGve44mM0+adjaUAU51kgr9HzU6SO3ONQ4W6+DTQGDPzvBAZOL3o/Zk5q41h9oeLIvSZ0RIBESyFVJk917ZliX8AAAD//7Rdy24cRRQ9XdUz45npcRxsJzhxBEQRIiQRi+xhF/glFvwIQmKDWLCK+ALYIQFCBAkICkkgDo4h8Tjz6Jl+Frq37q0pO2aRBV5F8TzaXY+uc+95pNrFj8FPTLN3ousItE7J6teJgjjb0K0MMcJnRIYJBBIJ2FnnF1h/re/z4tXxWECfpz94IBjrYBLJkKdJlxf5sYHlSltUXdHX+wiJRt5XB/BGN5knfQRKNfNTwXfQ6Yi+hwF64lkBmjyQRhm6TqMixDiR3k+O4zxw0h0nHbuafVDOtklwrGu/YgB4CjvRljnCQug8g34f+XzuN0ZeYFFHtRVKcnio+IVixSUzjrHQsVHjE97onJoAulBQ0PFQsyHdWPqyocwWc87kVxMRrQpq1VULB/+VvxxLPBJxC1epwAs5os5J7rv8W+IMaWarPMBoxmcjcXdFERa1vobf1/rkhFQ2NC0+sJ6sjWIapYDjUxIqjn+i78/zxbHPdpK/y0Um2tASX9Cg+0T0KgJmFbMajEAjP0aDNTkQMAtAe6qSIkHwvy3ZtZjocpRF304bXNm5gg/evIXXcBFDzp53DDCd6PcpUOdm9jYuXD2P3l4P3+x/hzGeYzKfwpRdDMYp3r/2Ht7dvokt9n43gVUZtvIT1EEnILBBhSUK/D7/A598+TGKwQRuVGDOJQEvZUhaE0yGTm6occGEQaQRmh2dNVsTotIIuC6mMwZbWkIwEnsGKZB0BgOYjnfYpm5A0iEwnbNMw/8JnsbJ67jxkgRusvChztPBqWvh5P8hOe/FLEfXWPTTLuZJjc5aD8tyBrNtce/gAT787CNc372B67tv4fxoG7tbF7FzbhejTob17hA96iDXJWfuGtMJUqnNbBvb6+fx+OARhtkAadcwTVzvea1Fw/jHHTcQC+vXaL68CwUIko3QyZaoqW0ObNkRsqbDaQUUkccPBkWIvm3ODgW0J82wxEM8wqdff4EH9QFmXUOKWgaMHMcnBVJiUtioGqQRZdoppE89c3aDPWOmsxnqzoqyS3OBiqlUVKW9M+klWMxzZHbodW7WclySszM2YyS/FpoP08YDq2IyQ892uEtcyfOqIrdfdpsm+uASietiTbqozhosG4un0xqz5w0OnznsP5vgxs4QO+UU2Uafr3zZIfBN51ff/adCmiOvFDvEsxK4/e0exlcv4NYbBtcAnDNApwm1UQYNBBB/rIDbP1S4N+miAnU/fHh861E638tEzu4100l76KcJNzMzqu2Rt0K5jvE8x+OFwd5zi/myh7Jw6HUsyoK6AIXXBMNT7xN6ltKhpq24CMBzjv0N6+AC0ErHNDt7BnXqWMbRiHRA554e6oj+3KUOCl3jsuHDNxXQ6CvpmtkbR9jKqdD3p4eHONeI9hlCkzipHdekCC7wWvxTt/jq4RF+3WvwzmubuHE5wesDcOzilkTtZVIMOE2KFPall+xOh+fQCblJG37vAgubCD4LNJjA4g6Az78v8fOTHI1dZ4BsefXoB3jGF10rP62rEiM6c+QTpKTrF15Xo7x6iZVMswHabuqDQtmbRfbHNOGONgth6PmTyj4nqz3b3EA67GNB40QdKeKaSLoLjUteAvmyDPcogE3nJYmJ+BXYpMEwLWDdGMWTO7j/50/Y2LyEbPsyupsX0QzPIlkbvNxN/j9+SOKVT4Gnf2O2fx8Hf/2CRb6P0VqNrqk9U0ilUIExmb5Qr6B5fnR05G8xS6WUo2ZY+kBjPnplgwtiM3Lh7XW4SMucJI4drnhDs5GhF3cXqdhN0gFaO8K04bNc5QsAtEfMywWKxpu61Tzhaq9pdysmlQlHAwtLzvpIkbUljg7HqO/eRXrp1Whtndbx9Yld3DbnQoH1DQYBgjilK3n8A7zm30vhNAbxdP2/39ZSWAKrxLIdjzH57T4Gywpd4zNOX3x2SQeW520lDFyLJbHCmoJ3D3JlaSXBgVgEfK5az5AMenBpKf4BIv1rKvF68vuXNmViPMOmbhEDVJsSGufNsgABZ0Yc5GOZ6Oq+mmAYhxMAi50laOzjSPAIt0A67hr7HYyoxU9Cf9iLpfGO9vxsj4oBEBZyK4lefg6aEL2XmFVTTJO5FLfVwrCIrzuO4TutcUqF4ZKl4CsjPz2LBwyYrtLX2FxdgLRKBgxWKXH6HWrgx+BaVl8VMX9rkQGk/J3++pTSD5XWVGXUxLNcF2yEFU3XqAA9fo+OobIUPCtCCgjs8+BBd/CDQINe6hvVatpI18SR89EY8jyOGtT0Wr7v7CHmU+ricfasVQ/Y6f560N+TaFGLWlIDeE6yKbFiN49NOW4xSq8L+JhwJ8uixbid/q7yeMw6Ryaql18C/AsAAP//tF1NbxxFFKyej/3yrjcJJsQhwgkfCkjmgoIiLoC4cUDiys9E4hAhLkhw4BsUBEkMCTFEjoLB8Xp3vTs7PY3e6/d6esZJuEAfbMv27s5uz0z3q6pXdYKecy13w7iHJRETOkIeFoQIUW9J0cx1zDSfsrQNOYwaWyRigKKFfyKmF9DiSZz4VSavQ9kxvTC8k3/q5UqVZ/+ySNqv76Uo6j5tIxIIJSUZfam8gYeV3qF2TIMta0mkTh6iGwJJXVMpwktpNaB7l7rIMqKXpcF1EiLNoJ97ZCbIiFkZMh7rY68EfPCGNXRBrw0GmM3nchx1L/KjZDsI6GqUFBByMqugAkilfUBvmiy9l4uQi20y02upLhiRk6KdQBxFVeNkh/bgGyuaBiFAi1UyEgMmr6ctArUjf9V4jP6dvpcR2hgPbTdhZLJYCrMl54zkqHoZms/b13aRIBeLQJNcIiz1pu+kTUYXNL2xsolNnrM8yKQWHYrkk02CE2OiRJBt+hjJs2BgR57VjCglMmsijwhaHHOboI8hemkPr57fxlmcQY/6l7hcScIO1kvmaRElTu003rzwGo6ODvHp7lc4PFgima3w/tvv4Z1Lb2DMcEHS6CNtIvA1CGBEIEss8QRT7vu/O70NnCvY8d86I6yGLK7CDFQtmfGjWG4owJBUvri0joEzot/SSN6uBKMykoPhkCWBKlPmokY2HexdQpuozN9fqB2Asp+qleP5aLfuqrcSvT4BD/Z4CdP3s+Gk6b3sVDCnHab5Al/sfY3vf/sBvVWGcTbCc5sX8Pz5F3Fl+3VcfGYLG4PT6As4Y5xXNowwxMVzW9g5uIGyLLyb/b8InKu2g3NDc9/8FesMUsqKz9ApDLZOncOZ3pgT/tl+nZhGLvgtm046lNwDt48Jfnx4Ax99ew23pruY9y1s5k0I4xwIPmdnCzhSLGh8lHGhwPBADBgwoQ847xD7swrFDZ0/jLZneZ1D2/IIob9PqtoPgpNQ4Fu1KMZucTRFNnraFzSSBkHRiSZ14Rid9Hd4yXuXDQOL0uDP4zmq1GKzAJ5dX2dmlzfm5JBfVrCm40Xo7CPR5+dfJhnurQpc+3Uff00H+ODlIYocGKSswOZxQMZwFvjw+go3DyrMkyG9LBdiK+mr8fiS4QRDjqZMS6zlPfRzX+Rqbnh33WBxmOPBZIWHM8MxgvRmq8zyxoBM/5x4T6Q2YbDN2RWK5bFngIKbN0QNI2wPvc5a1wM6jznrdM3l+xtdX0nHA2jdDjIyX5xHm1tVYhvykNtHQmwc9VXnBnE2rjrJJ1JUQ5QIoA2P6+JOMcPdn/bwyc9TbHQNLo3Xsb2xjqtn+7g8AoY9nIgf/C+HqTWE3owKGZYVMBdDxwdIcasEPv4F+Gz3APN0CMuN+8obm1CQhXQOml8CB5YLHB/+jbwqGyoGF31dO7XOPiNOIoc5mDHxeyOWsKepAAdCktB+oEp87GU3r5VA6jkQqRcmk4mABpxt4e1ETXWiKCY/kjUUIN0OrTX3b9zH5Pp1zDtP4fJb72LzhVf+xxl40vDma3nKTszYu72Dve8+hz34A718gfE4Q4eUq6iCwiWT1py6kG4Okvk+PDzkc9E6F5RNCngnPZqTIQPLvBlvPZ7jqWVP1cl73Eqg6zqtEd1Ony8O3gO4eqZp9o5mMy50XNcXjE7BmJaBdF1sO1TFMa8h3ekKd778Bi9dvcJxewxwmsf0YkNl0rLf0lzVeL/1JBxA49piA8DHDCItPIpawt3cwfz3e9ig9suM/J+MmDOfHCHr3HkFJ7m3l9ouGI7DsXcN8V/DU2M2piW73nhNNOL1RHuz1cqh1x2gLCeNOkYj+VR23R7KLLO7f+Ya9UcsGQ9m2VFGvRU2mxWhpHqoTnpqNfLpbaSoFfIxqBHSuhbyJGiT3CPGWiXwkMK3KJZy7HUSWOwl4I3AU37eVNSS6oOliq/4HNLWCCINfbxg3e4b11Y8fzYmG11ICFMlhapaEmG1gZrsNMZEe2g06r2aIU+82iMif0O0YFBweAXlaDTkAhoRmBHXrgg1rFc81LF/dfs0gS/cBi2qEf/51HF6bPQeg0Jqkhm1ubLhXvR/qlymuaR7CkvwM2+mSECIts6HpDFWs6hHhvfA8s/t65YFZejKPHENHCVS1O9RP0df/AfCuUX0l9biHwAAAP//vF1da9tmGD16JdmxHCdx069Q2rGuY21hDPYBg0Gvy2D0av9yMMpuxnZXdjUodFtHu26MdjSjbWInqWU5tb7G8yXJsrPSXUxXhsSJLb3S+zznnOecJQBgSZ7t6Sw/ISuEzOjsgbkULhgQleKyyOCjb+iI/E7Ui6rFZY0c30ShX0lu2FwhX4zsW3wuSn57zhZIjs0ESfJlNzerBZy3sACMxbfIvPYDk40UND+SpStBXZCKoqHB2GvUCMcbBtqAuxpF81tmcuYAyY0txVrowqp+Tshsi/EzkwuJdAjY6TeZzZhJtoUVaOZ/83vZYWYRtkiMqW/G19m55w2i9f+boAt7AbTQS2aXGM1SWZwa5hg7/7qj3aA3r8eCHE4be8vstwbfEEdTC1DVzMaSebpSrmX+ErRmBIxZRs1NYVHdtApM6UWsrguPjHgC5sh8VrC4rnSNNFFPRhSjqHL9LPT75XZn58B4b4TO/IxkeXI5oUaA1K4FwsB6OckJA5zCEO9tv4tNRIi45WvQV/onxScoIx4dV3ABX1y7CT/YwE8PHuD9y9fw5Tu3cBERupV4tG78K7attec79csf4QBf372N7375FoNLa8iCV8KapY7npj1D1zSaLWttuKsAANvQrdagAovYXgYAgMqyj0eKnMhy6StvbQ+FGbP4LU/9MMhHhEjgXFQAYiATsJqDYlAoyzXoWg503bxCR5oORweYTaZwWz43zCU7O4eC7HU9bt5ZPUPs9GyG6fwAT579jjuPv8ftu1/h/PAyPrx+A59/dhNXo3MMsrjSw4bXx8XtHax3+tg/jtEj+Ud6ciVWGMO+wKLopVbQyUzyzGSS1kn2coYr/bdw4+rHOBfuCBdMyHWZIvaOESNBkh9hmifYHe/h4fNHuPPoDg79I6QDoKCov1BNc0q7/gKOzCcJillGIQgIPacjKqYEIFDGRzRYZ4dmHs8giSyBirTxKwLu8qyS7fE9q6QnvaZ0AEHOrZERmIY+R7K3j5ejMYKdt+X86BhFoQoOcvkuSxGQ+zSPyqBPIWZuTsYGNs8P0FkPcO6sSM65yYuB3O9gXng6Hy2GBxmkyM67IZ4mE7z8cx/PR2Pc+vQSrq/JLULb8f0p8M29ffw1cZiVG9W8e539LkqXUkfE/TLFZpBjZxMYdpTl1rW3tz+joXABvgqRFtJekxHoSiBbHkjMnKcGX1SMkpnULGElBEdlqRScCVEnAA2td2o2c5sZp9EJfU7Rueakk8ZMrUQvckg11qIeeusRysNpvQ71mdDxPByOR0jiKbx+wSyUr4aIMvage2PhKmNRbtT0mZV6XRTd04iLIcaTKR6Npvht9whbn1zAlTP9N7Ev+8+HXKZ6Hz32gcfk5XAE/HwA3H/2Cr/uxjhMAiDq1CcAjWdvUcel0TqnXP/5NEZyNMawTPk+XaXY3jp9Cp1+D/GJObHNBlWuCZEOQa+LjVNDTNxjuaeqcQlhNKnw3hvty/st971seXbw/dsRz3VKsiAgICywsxlikAbYPY7Rdc1iXTxS/s8jDOVbwUXccBfpFGtBhq1NSkHIuC7NvYzBY1rrPtVrtLYb7H9dogOTeIIXL16cSIST2GH77Dar9pzzbPip+rmxrr7Ods957ENTN1zIzz6qMSjGN3BllaZD/+4onnCj6/UlLoVMj2lbEaNoHW1a8ZmoOjlDQOTfz3D88A+sffQB0OtyXRCuxtPFwZwUCI6aGO+1xH/9Rt2EnRj6yeuT16ZFjOLpHp788CP8JFHn+KLp1vivB5Fs8TTGHOnSO4hfJNCyt7HOJsdFq8SjOplUANbIUhNYqtSdwJ7B+qBixbNshcLuDQ9uvGhtKHFJpBzHV7OB+GItznV3Wo/Mtpvt+pR7lfTfKYPcVg9Uf7PlMWAKW/NDyBssvylXZRTWr2Tq1fsL2VubNTmz+zomzMrvUEzL83yZvENjRKFo1O6mFDCPMmgv1HyOeGpCaOBJTeo5UcKqKWShPQWrrt3ydys1gYGI3lWfb/nc1apUAVJqVp2bb/aDcAwqEHlI9Ssz9jbO/JobiXoJ7mN5XRLUXqsCuG/06z6TCeGKjKx7u9mxFERs3pgSaamEqBLClgZXgTEa30vrj8brfV/PGfWSRD6pItI+v703zzL8AwAA//+8Xclv3FQc/p7tsWeSTBYlIZC2VLREqgQXJA5w5cy/C+JUcQFVqKgSFyRQoVQsbarJ5slkPH72Q7/NfjOZHuGdkqqZ5W3+Ld+yVABYl4zZ4oboDQ0Gk6tPfjx8JLiXKmcdZgmn6u7xiH3jDSVg/MRGvc9dDK/Qz2EQjk5hMuKbW5JHkFr6FikLKQTVNWg64QsqUtDhderxuKq4aXPQiVKoMqd9FoZmryAY4nmk92I+UiKiGSaSx5SCqpJNVogegFNlfVKipDmpFVaSjUTogz1LzRczTbvDYbAQ4/5wlWwFUdEfGuOGCGeEN0IDPUQDRUz0ybWJb8lFI8m/Vb28qnvGPPsYeQFgpTi0PpRj7lSzXKnrqpd1X8xYhXDR/jPlavqd5kz4QunSe3IorHQCg36JirbMZauUDKukGQIlJOIQYfuN+V7DhB+k9r7xuQnGtSpy4V5SRTTUDEfPRilHvk00N4m2Bcge6uZiytxmSlB8ooY5ROVwHr5qmHdFXRB/47GRbmLoi65juDyZFphS8N8yj30LBR7iPXx58gU+f/dTnIwf4IiLB+qhnK5j3cX8a0v9pfv/3W9P8PUPXyF/J4UvFpxYBS8ZdGjttWLl3OULc0kQbUVUztlcEgRutkBY9AUJS6gYlkiFBbLjHG+wGFagve9qgdA7se5J1E7FB7ELyooB6nKOlrjZoyESOouo5Zu7nsROP95cNnDTGvmCeFctJ+/c00s9msyjGniMxxuo5hVG2xT6FUgbxwXS08kZfn1xit8nU9y59wHuPdpD7ob8GgRtfDh6H48OPsTT15e4vrrhwmg/J20UACZd8h+fHDtSrekiUMGpleySFNnraY3DsIPP7n+Cj7dOMIQWAxHwzfeP8fzqJS6aC1zOT3Hlp3h59gplOkOz6xEoMKVCAc+n2lipUCB1HQmF0k4XTIoOCp/ohfBazlHy3TEympvQoKb1SHveXsuoJ4H/ywNROM8UIC1ov9MdOSykIJU0ijoJbE6Yket9PUNVnmNId4HKo7PzCyNgJNQOOmGC2rB93UhXkFBILMInXUVDgEzOz1FwQXsOHwbyGhR4kF4CI3cyJJvbKH2GZ5cl6p9LfHRnC8PM4eXrGj+9eIN/vEOdbvKdQYUSOrumEUBrJNQfYDGfY9td4zD1eLC9gz2FuzuFuw+aCqHyuLlumBVP9y5/HHYJ6ZUmbL+w0FxTA3UJR0oEzt8qmvO+0UJkGUJ/pkx8U3mhHTQ0k5Ib20yRkOGoYCcNIvpkfctcBbsqNIsp5lcTZEf3WdTRRmjjq8U6R727DZ3/qgls9TSn+68YwOUjtPkV7t7d7AqU/+VIFNmU2JnTu4YoHY+f/4Vvf1lgEnYBt8lJ19IICeJKaat5U9Z6jGiPzkvk7ZwlDVfNPINSQoY7Y7hhLpzmGO1jMG8nIlwmJFvPagxJqK9IsX0wxp9KIXR855u7iKStF1cz3sscVAcTWEsi3YJEPPMhBVtGEAxEB4g8Gu8dHGF3b0f+6/8gnvv2QfyTFvvHx5ge7mN+OmH7zzRzXeWsFbZNhzyTESHYeGEzVOUC07NrhKgubZajtB5b+2OGmpPIZiANBhKAs25zIhzivJAkyTciRCeMP7GTHdB9rl1GF3O9TQDUi4gbw9yV74+O/+97hxbIJkmoIjErUXggL6/x99Mf8eD+XeD4iEXJlkePZeHUi8EpKSNKusYG3wni0tMGK27o3ylyzhwouKIIRRA4ACt7ODVV0DcTVE+eofnjFXbbhGlassCW/AAAIABJREFUzcLDpw3bObf6nBD7OUXUBpZq5FYePWdK4tTrmvHdE8SBY5AELl4SLQNFwmsUF8UTdbYyiDiJ3onwnzQdLSY06Lp17xHFpPZ7l2+06ir2FiFbicEFXUp3ZJfgR4l7twMjTYAQJbqrw2Jeogo7hux7jef7NU70fjb0MUVmA83BLF9in3pNEpnW0grEPG4USpI5539vYhX5NZ+/ywdU+4zt+pQKLg3cQddNH7B9uFjUsU3hQmzADR0c0x5s3rkLzer3qeQzEcJCYv7bGlIhEktfdy/FtI14OKV+0/cWigA1iKnTL83jXKH7Ru2VBu3t11k33lbYYSyjIjCIkkiFDNo3tk70Pah5afmTrQsNplPTfuZ8oafq0zpYbsf7lIqeVFDk1+ifmIIaWL4jaN3MpSCkKf4l7Ep25CiC6Mvaeh88+zCWjMdgcYALB07gG+Jf4SeQTyAulhCyLAzIMLIxI3u23mvJRC8isqrHsrGv7umlKjMr4sVb3unQFS9uag84Z+ikqLnFfEinz5m4VXb6ENhG4kaUpjILFtNG4xWlbrAAnM1m7d91aBBvRNM2amrUlwuLgBQKYTJmvS7iTRygaykgCilco8u7fo9ekUkRErPh1fk0k4XWWCY/LAYrhJsPOWfaJzHzc93EjRRHfq7Q+KEIS7pJuWBzLHocp5qUeJZXXfZqs27M0KGQyRgXWtxQRC1lYdjkhFToaKwnzuROafmiO4GOe+PDTMw8Km1YNQqD2pMY4ZiZE6aCBlmeolmrTlRy4UuNFCRjQGjw5p5aWVRSML2oF6pPueEm7bo4PL6mNj8FMRxL2nSGiHC+OdJJk27dBIse4fsoWyTTpkgOPDVQjLmlonfJzcE8SZD39SCqbXHLeiKuXncOrzc2pskHspbyWstv741Ggiby/nJlMDFCwa5cnDPF2M6prk4pgok1Q06ihQJNggqlpXMzD8dbmBxuYR0ChjIFStppOydlLPqvT1+hYN724hpNfyC04cSKPnEu9Q1KNgClR3YrxXi81ToOA3jrVMbbHJAeAUwaHeAA5YSygRRFLIrSCIhs3JQbDMHEDOASTFHix9eP8P3D74CdGqHfYB0qaQz1lExk5M7pOLOp4+Svl/dvfjEilVxD1EGS3tnrnG6dnTdMcFqdL1Bf23ReW1G5emvuo4KUbeDW7X30tkfw6VLqKFKqqrIRHwA6plNDWVpUpYLdmTywBuMtbO3sYvHqrCuZYkHBz5sDl0/PsHd0F1naoD9OUZN+JXuF04geaiyZXiSaW364sBJ8rsZ4dYJ5PZe8/EzmN05wliEK3MdH+PbOAzw/P8Wz5QssWbj3NF4yTl/WBqLyHFiLfri7P1l8IMrwN5Gc9uWyEa+QYZNhz+3im88f4MHxVzjAgejlSXWfosZPp4/xw68PceUuMN7NsXJLlIUD+rkY2xSDHprCSaQiARKucZq28TcUXPNLj6sXF0jWXdtTuEzWJs+Ted5g++QIfmeAOnMysVvUc6FJDoqeOvyaU/pyMVe0vWjgswQrNi3DArvHh/JrCQMkLMTs+jUosS7Psbo8wxE8rspgkz5num4rVoPmswdbNZEKzIlzvzfC9azBNE/anHoW79V0ioPREQ7LBGeLRuQCWarZ7JpIrfn0dKFO8j08vgKeXl5Jo17TONBtwbP4NOu9ICZUyoAheMAoT5m8hwa9POB4kOHrkw/waQ4ckgZudD8WiB9vb+F0dimN/WJVweUTo47qa7RoVYdzGu/12SSsrnH58hl6boaQlArsihZcgU4W1sd3PxRq8zK0KnQ506mlzONzMwLeLjbCjQBs+WSIndu38defFxoPx0YzkH3EDOgp/Po1zk//xK27n0kT75ONyElj90W0JT5r47aj4RoTNHiWJ75Gtb7CF/ePcXegfgDvo/+/DyB4P4PAW5uY3chU5zV7+WqF2Yz5j9R2WzRcfEHMcN9geXg7xwrS6dczrP75A+XVC1qzbjAAnMSnEidZJcDBvROUKTS7nsU8QVnWFDEwNqCVVHAtj4djNPM1xuMJ7tw7wi9NNGRsBKxhY1VDz6Pffv8b82UlPjP0r+nnmSEMdoNcZPi0N8ukUn00vQKjvX31f7Am0TmHTcADbwC6b7sj/+ffcOP6veOfynl0mo3BUNgSNVmHgbKXBfp81sNj4GwIIUBkB5ApOB9Ex0+AdPZigflZacwhj1yYAkFAr1DUGB3vYHB7F0vS1yVeVllOeW7eUXlXAzVBjQJF686VXTgM9/fhaRAZLk0WqKAXd9209ji/ukC9c4hQJciTPtIqSkn8RhrKxgbiHimoC19h4htMHz9B+OQEbvQlsLtt0g5n4wCTGULjTZ00DT1dt2apr4ahXoBClZsEc7KwdSEawlSMSqnnIlQRNpoKapXlivi1/rizc+DJU/z78yPcWnnsDicCnsr5SpQ+98oilVo7CDtG6lR7PzaNl6sKz19fIIYkChjjMmFR8KMHkwLbx4w6hpxHDUENZ8CJ04EkgWRviVuZDIVis5zIGdcYAAAXa33z+Uo2AcvQelA17RS6Qq9fyP9p04gb5rle4opCa7zn39BWpDHa2Icb03dECrnJcTlMFLO9ctkNwqCgIBlY8/milWPBan1v4FWwCF/ep/5oojKTRIedfPDI0DHJWn+Eas2+LRNZcbJh7pps+L5lZsYnAz7W7ax1y1Lqb9bmbJQJhNWV9hYytKx1iErQmvGEfF8+w6R2p8FykdrwUHsqPh/F9817Y+mon0Ybw8n7b8/4NxPOGmNmxz5Ehg3G1N5MoUvQebpFSQSx/bSVUCsoJfs7oev/SvaJ9BT0Mai4DlTmpZ/dmezJ/apWrTQhTunroIw8DnzZ81S+FPM+AXk4SM249zXaj9+PfU4n1+gGJqORghGx2S/JKCdAZKbX4g9hkfD8TuPxWPzh+D3iMD2mCfAetKkwlijmXMB/AAAA//+8XUlz3EQYfVJLGs1mjz02Ace4oFLkEG6suXDgt8Kf4AAHihtHigO5hFRSLpvYxHZ5PCON1E19W0vjhRs4pSpnLMvauvtb3vKv6+cd+IlWqZq24/dbYsWwQeX1W/Gg5hdmrROHi3Zu/AINy8hFcdrhti6tedBb5c58sqHFBRb1aMXejc6Fjkc2CWx3oLCSbguxyGADJ9zq8MfBmCbx+1TFFKzjzwgBhoCnEQ4OrQby/ubv6MWmz268UCXkHE3l0yBKdC1GW3CqZsk8D3JccCKCwcksQdypyqZCdQRzimrgt/j/xvXvX9tkMo6fJT0ek4mRMDfICaStb5nIzznIfba/YwgG1nNwhihQbokqsvIk4kP8vXjv77MYiWrUcixDP9hx7R5RYYAmF+YnZe7Ou2nXa8m/VIOTmOynScfnan13PSaOmGrl0sRSDJLTF3wxnpK9J30YTtQMyIUWIPBmCW6HOxOUk2JjIYX1J1rg+gxormpkjesCskRS/AG9h+zS096xoIzj8s4/Obr4qHN/GjMU2MeQDf/KXtz10ARghIW1+v3/vniB7374HifrU1SDNVvj8Vgl1IJC60VdfBPhw/BG3ThwakXxl6dSRbKYTynU+ijUHvXf1yjbTmHeJ9YhSxg1X86BcnciyuZa9GPBSwjkydZaLgqs16jWMgnXZMtVZph/sCcc8Vv3gY/hgeM/XmNYFxh4KfYQfB7acaKcpsk8qrzGMqmxyjyaMufOkZuOkE9KHD0+wMcfHm7EtxQKTDHCs+lTPD/6GrOwi7CiydxxGHdd1bgh4Z2GEm+PZV3FjoloRwReZGmjYUq1sLryaKsEblFgD3v49uk3+Orgc8yxxxZ0KYxj7jDb38HpzTmasUM1DMB2gWJeItsesNhVoxaC1DUy/2r6vdINsOXGyKsU16ckapYw99scVHKdK27WwM5H76PdIgGtisUwU0Y/STCRZzJ/klUnjU9asNj1IvGok4YTofH+NtJCC1B8bMd8aipFkpr6xasXqM5OuNMp849s3LVRXQJGN91DcqU9aTytL6+QN+Du+zwDnn9yhC8fFXg2ajD3N8yHHlCRoFCtgqCFMOrguQKLbIwrN8NFvovLfIKlK/lnoq7uWWeg0Y4uB72pUHtyX2FSvcNn703xxTzHE7Yk9JiEBsMkMBLgsEjx6eNdbFFRRsWSSLciNOLKErUqKGj0DQbra/jLvxDqC6R+xYE9C2gZF5ztooDZwR7DZyPiJhWrryh2RWO4qmNxmWlxFAQWGSeBNIetVD/Ah0jMYOFBf3OBN7/9ikm7RN4b/yH0ePG9z2AdWXsuOucR6WKU1XhyKM/GtWFjv//yq5/8R5BDNkRCs2cYMJqq70yC/obehErrS7XEYPEWePsS+eoSBSONPKde1HGiAgvlfeNZhtHuNmpChzEF4wF9FF3raVstKg0ka0znIz6GdFJlraaOkcHOz86vcHmxQJGPet2yTkAu6T2bWARWVFZLidCgpHbhnRjq//uSgpqYLQhEjNYMS79y9cQ33YUk4F6ou3S+Hepli4vzBaqVOjcyjUu64KSqTtoP20ePgK0hWmo4UXyUCEyXaBet0tC4tcCca6FKUfeN9FQIop6OSwxnU0nI2AJTroFCfVJd+fP4GG1u9B1tVpnlozWLrBjHRUGhFhDadpo4lO8u8fKnn4HjE2BVI+F5AT1Sf29R02IP25pSx1+pQwEd8kOev86jjDrJ2fnBU4KSpHr+TrYkRbVaIBCfnN6yZQ28OsbrH3+BO7vCFlQUnEV9M04a5Y+YVUBHsWT9GC9d3mXT4Jz0MsSXAmYjTLSpVRswnG1hPJ/B546dFLh5QImcxmYsomZQdNawang9alXkjzTLaF/aLNboYvqOn2/C0UY1NVFyymMkwV1vxHuhpw/woBOaiodbjrBhqe373Hq5BqP30ve52stxUzDrlPnDPWjaDei9JoYW4zL6mBqk5oTQ44T3dQ7M+Y3W7EY1wbjJpXF8qkgAysdS5fmzTTwjYvNoM+hUEJyfTdZxzyW+Nre5NHazEZun0kw0O/BGqYKMpG5Fk6xtWrVWNG0AtUzMcnVySHvX11kc9p+VWAMKEiB+dst+vm9nbsUg+zk1MmizOdX2M7QynSM1E1lnAeI2R9cuqHEplth50nXR/y2npOYjvWeUP0iT2/QbxAWANfC0WGA6bHZvSUvMchLWs1PKpeWUrOmgKAg67rAs8Q8AAAD//7xdTU/cRhh+Zjz2Liwsu0HsQtiAFJFDKuXSQ5Gqfqit2l566F/ob+uhf6C3HnrusYdKLRESiWiAJiWCAPthe1y977wzHi+Q0EtGsiDKarHH4/H78Xz8L4RdnDgHzobnfzP8pGmJxnAHVsoXX8ZZHuDT3hHAW2B1Op0bOdwhgZsTBfSDIaUmCQ8YoofTJ9vM15oT9LjrCF6clAQUzetrFBCUDkUD54HpoDlkQ0EJK3XYnIpo0+efbgaJYtHNCQJZAj9hG4w8D9AbI8US/t2YMF8BPiObujGJiDAK/UI2sJij5EX/6Dv9354vHNiI8uAPmm/2x6QqY+Sg8DY4Tvz/8wdvCJENy/zwiqy08Nn1Ianvoxb6g4MM2cZGNh5PBO7jaR02CBzWyX/F152Y+l7RPPHmk+diV1I1roXVy5VqbN63DSsw6v5gDZ3+CncC462bwmdmLFPH++Ub5vUTzDqJPkSVVK5KkvSUICKu97X0nQ4lOt3+0Lel/0FQijphMxzjH/z0y494+vJP6J5LFon7eHU1cb728pLjF55YWxLSho4gKik2lHm0pnltlCrwy5VrlTD8/+L4FI4qWZ+jF//LFbCy3sfSYJXn1wqaJ+VnQwdBHHouMuo5F7I2TIIJoRaWMmw+3JIkzYoPea2BQPfj8K9nqC4K7iypQoIJhoXGR+IsvCiJok3VkGI70M36+OzJLh4kA7QE8REBLbGILr7c/hofbe7C5KT+OsWUContNnfOCW7N1JZKBT9xxy8mfpxGVRjuPNsi47+3WC3i8b1H+PbxF/h89DG2cB/LhPWwEhQVOVM+vtn9BDujhy6wpuCX9qKshYS7m4lUuZXrDuQVB800p22VYDlvYXp0hvOT1wy/z6jzzL0mB9F3Xs3A4NEWLpICOcWRC6m8yEtXoC3r4MVxaJM6YCUVf21xbzSE6iTIhUSupZ/FT3Exw/nBPpYJFVFNRQ3aP5v21meR4mBC1VgSDLt6jQ82VrElHeaNCviwDXy3BvzwpIvvd4YY6RLTN+dM5aEF7hIlwxocHkLNhgvanXOpCz7o+63wkQuCCNM+rp1FnyknWE2m+HTYwlfrCSf/Q7a9q1irI0PBkPdlAH1qKhLqjYIiCjQEJuwTNnaBK4FWWaA9PkP+7yGq8SWM9+KXhNqRFwj5QJ3mESYkOZFYoTWU1+g5Nw1KLImG1t9cg1oQxEtdLkMnW0QvNbjc/wPZ6REyCuz1XIZ/y2C4vKxrvwa6qcFGVywGk/edcMreJxaEdRH5LWFS6KAXgV/apffz2RHywz107JRtViG9QZeTuZ7rg+0RBvcHUsS0nGTyUJEGjbKNPd9acbExwNpoiN76KqZGnFd9AdMXAF7leLp3wG4ROmAp7I3vkJpXW9MtOaC9g43r+xw+HoPwbcsQn9io0xftC8o1Xch5anI5w/6z57jMBZIvGuTkdkLOGu2exnBnG6a3JEU7x62lRL8SpKZ/1/nkiUV/aY+ge76Qot1tY2XY43taiHSjR45MUGLvxd84nc5Qpsk74REezVopl5QtaIMVlaJ88QrPf/4VODgBJoqFd8kBxs6VAcLTkyShyREKOczvJzxWCl2l0DZ1a4RtYon65P6tbMoaXUQD09a5JjFykDbA41OMf/sddv8QXe2KIJz8GwVLHOdMc8deLiboKcWDE5fJGCeXZ4xUi0lw9KyQy8VwZwvZcoebDJQUt0igjrnWXs2/CvHE/HBcZ0clLSKNKt8tZgh/5BzmY2Uf31JDx0PuszRrfLtvXlW2ajw/uKXZde3cbiga+GS7FJi9R87yT9JXkeStcR2NvMfNMcf/t8TeSjuLV0dvbe5tZRRLz+uGuaVkHJU52BLmHMNTrOy68lpyIR1idR/b+1zCuw8k7IKmAqc9zi/jWJ5yHcqLOPcx3rlMPP5TE6wASznq+1PvDTUt21ke+kKDRxLUDgXU2HI5WBBZnzsv+oynk7xrMD2Fchehf3sqikvur79XKHejz9JPv74D3ULm3p0/WZOn4bMeOeDn2c+9KzK45nU8D4woyGf4DwAA///EXctuI0UUPV398DueiaM4BDEZHhIIIYEyAgELWI14fCn8A+zYsECIBSwSgQYpgybzSGIlsrvbXdXo3rq3XHaMZoPAI2siK2l1u7ur7z3n3HNu7UHchG2ivisExYhEIgsPKp1BUfdHvTCVUeaCXC66VjPZE48meYRjlb3pT3gW5Nw660AXTCrojWes04Cah6bOrbPiiogoShIy9aMbVVE6neWh/xUxVNmEYVdrn3DAiI6ggTGCFZ9EzXccDIchOcAI+pIJmqOf0bYa65EiAkS48IgUCToCoIuTonl+9maluND5fB2p0OOm7dJMToxgxkgf7WsjSKcN8/iexdfzpagY7Z/OxccqEDUjof3SfUnTdUAhbpjDnM/G/D8t1HEECxsOio+C3rS68G5TdUBmZxAZKsbXx5rSI7iVerNIVhdQY5Jl/PPmvvB8mIlQwi0LZCPMP7P/Sy/VJfOtfGeAZZ74GbZQfvlGnFily9+fIp05dBsvT/bGdDRjmLA0iYxuqmrxjwXcv/5qNe/f4tvvvsFPpz8imxiYvkfhiVFPkN5aHFfXglsvxJTBdjY8ZPT+IZMiHiuyCVKSDc4bVM+vV3nra9sAapr/3x0zM2Ajd2NdlzzUkXhXfGe4oeUEE2Jp2hpJP8fo8A6NuYb5xNjBm+qYxYsWy4sFOjZFSu7mVh6mbDAob3oodXtICt9AU0xjew28fvcIDz/4DLvoMXNoAsPmmdkOOtjHFF+9+yUrASbYhb22aOYWZd1y82sbg7qiKjIDlhk3/UldwFT07iIr+yjKLt4YHeH48H08fOdzfDw9xiuYoNsaVlowIEtFjElY9XE4nOCj946xN9xFYjrIekOUjY+k8oyQ8TPDBAZQk9lS85+huzToXTuUf16haFL+XD0oMjZldayKGE3HmNw7xDyxPNO/qBYhHpSZmMzL/Yj5d2oaKs0fl9vGoTsdw/UL9QXkIjxlj/SWG15cPEH5+A/k9ZxQTP78ZY2sZ76oqaow7bT48H7CDHOnBe44h0nr8DaATwrgi9eAT/f6uF+06JQzZrQZfHEZgwBb/TJEzshNgzD/+hmSGpm7xk5zgQeTHF+/OcGDATBtfeZ9x0nEKPwxXzjg7JzGfkuOwjTW+x3o9ZkIWNaxQL9pMKyuYC6fIF3cSG6+C5F7OgFNLP7Oq/uoKXOe703rPQUcsQ1ViMPKRcrICSaiBGDwsQBGBztIR11PFLZtUFiQwmBA9+D5I8xOfkbflqT6fbn0W17k68RRX+JNsJOnGPMICHit+M8kAJv7JcUusPLh2GZjY4xlLwtVMGTLGtnNDPbxKXo3z9C1dZj/5yaQGg76lwOTewdIBwVckXKmvD63+HcpnjTMaOv65Hhkgp4pNY1Y7vRQ7A5peeCGloJYncx9qwbk9OQMFamMHG5du9wcm/WDigEAbnjc/8X+b3+lQiZB6iKtBVbeTFHhLvchgZpk4krjYX89fcHGndSg1857J9WS1jE53Edvb4xl3nIkXV2XiEdouRaxK9d3I0xbyoCORdWUMKMMxd2eB3X0uSijL3SOzpc3OJtdos0Bs0XwsdnEtuLxwF4sSY4BvUuL5ckjPP/+B+BqDpqfYiVA/Kdt9Pc6wily6dXPEvNHK3kiKzrNtQkYvAEj8IgfHSuoDnl2Afx6iqtffsN4aTnCVeuScMysvEw909/eXqcZNiOGu6kxa+bsU2NXu87fYZUDB28d8fmpnA0qTZ4rX/oanetnbkRr71VFPYKAHmq45smb9S/ccZxcE6KuqZkMDb88t9LIwT/Ufnq9Rcx+fO6CpF5M/ULqVESUBNf3SPLtpC9iUsr4UWlOGiNGud/z34ltQsLYOgEpdb11En3uwj2ijPrm7yuT7EEFE5phYqG1qeaeSXo5VVRova0q4EF/IGpdr9bmEQ/bBM8C3Q8FMvS7D9tMFCgQ8iZ6e/bfb0+PSZtdOu+qzNgGAPH5Fcbcm6p3gnqAm2li6GXdiO8/TUdQJXD8UhZdAVLP6vukthClm2c8/qu9Cl13Ku/3++nTkNiUUdIWQix96JW9p5sqlNV4XPs5VcXTsRO5wjGKrFwRxYZ8n+zHIAbyCl5wNDn1zQD+BgAA//+0XV1vFGUUfuZ7drvbRUoshS6xKDZVlAuMhjuvlAv1ook3eqX/0USiF16hRhLEWCOJNRBFELHYsh/z9c6Yc95z3pmlBeKFQzZNk2W6M/PO7DnPeT58oM3qh05m5A8e9VDSCw+N0eMi3iIb5LjJJn51i/p0ESraqBFVio3GzWleu2b+ax4kewjULRpN+5ln84WcTyszqJwTZ7fBU20EhLYRsqSgpU3UImdAB2WBkzM0ckO2k2k60XRzaC4kxLm6Syd32qLQTiOVQsQ+CPR5y0JoMGJEKOhWSw0Rt0dBt30x41NTQD1uNUvsLmL9HLofdJBO2gZLA/c5ibLTdOI0SmFm6LX1O7Einpgu2ngQi8IpoAOZ0vuC+jn/BonZexxQ0v+rv+vfU3CC5A2marUuECd/9RTQddVdU1Q4cVyYmBfquS/Y12CxwGEpga90qrrNzPQ8vqnoZ09+uhuycy6pKCA/iySN5MuiaV+2U0BZFdYngfWIHvw4wvq5c5jSA1X0xL58sVJsUGiA29dvIZ14oPFEkxvOteWHJxVpnA/foJdElhFQZyhxtBzgv2xPhBBkHD5Dhis7V/D5tc/gH/PQfy7lHHLSNJHfgakWmUDAYeS74sxjI9Q84yYRjMQSAkt09ryCobzSnHTsAaq/JzCPcgSVMgd9V9ywcZgPrL18FqYXITOVe/jz/jvULmUmQaQpREkP4gATM8XJzTMYrA3Y7ImKHQcCoEFKWrsM+PnqDqJJjWETcuJC4ofikissHKHKE3WaWuKo9DEqBvjgrcvYiNc5BjB26swW9qEl2W98bGCMT175GB9d+BBbw0308gRhSeBgD6hT5PMIeZGgyFJUkx7qgxjDegWn4nW8vnoB7269g+0L29jefA+Xlqn5t9GDpNf3AmIU2CLfCiM8jLCEy2++jfXRGkzpI69Il9dHFKcIogReGHN8E017YtJ6mgajIMGo8pH+lePhT3dQPzIMqtgUdI+nMoTZED389OYGhqdoIlmLK7dt4MlfJKYiQ7xk6HwV88yZR0ZRys3OrC4wOH2CWQRsTG797t0kO6aJ3MF9/Pb9t+gXc/RVNvKUrShswc6FbzbF1kqKDR/cZPZqYOj5WIaPfm0ZARdT4NM3lrC9tYqxOUC9/8AaTRHzogxADHeX5iSFZkhxn15k9f4IpWjJYCqK/XqIZe8fXFqt8f5LA1wcAWs05ae1VlgPkoqi5wD80gBX/2hwZed33NvL0OQBTGZY/kNu0vxdVRpmtMQGGBCzY/8+Zr/+iCWvtIaAkgLiiX95knhYGa9i9ewYWUQ+Btb/hZ4l/TRxhYQRba4rvphBYzX6dVxj5YXncXx8AnlFrHBJfiHhCk0X8jlG1SPsfvMl+vkUQzo2km8EjsnsXk7mo74GLN0Q0LMocCyxrhl0p0RHdUj/9ybNPoMpvtcCY7LMXORb0zgtJURT7ZkMvXyKpekecHcXzYNbCJtMRFpwjSD5XQQjYHz+LINd1Mx7IvnjfdeNa9yqykhaT8M+IT5nvHqY0/pKPLxw/hyKBMgDK8+whoAhA48klbpx/SaKzOdJb+38kaxjfndqqYBV7R2l63/y5j3rn/f01zP3r+kGUBlXAAAgAElEQVQw1r1ugSWqdWD73sP7C5l9mcJkDW7u7OLu3pTDXyq5P3L2+gGqGDjz2os4Nj6JjAyA05DXfiEDLPpe8aVesYbJ1vMny2cif6uReyV6Kz2sbqwxbkvUfWao8Xn1+B7fA3Dj1i725zPWD5OGuuZm1li/IrlH2ppbprSyDskT63gYY+lggj+vfoeHX3xFbo8MhtKQwIiUoBZlgV5P8sTh5CrN9idZg1xvmxscMLOv6+1EMgdPsAETNHbtZRNg/wC49gMefH0NycEUQ2a2NoiHfft56XFL8q/CHIobbBnDJLsoMTMFbt+7gxm76igjgwDkEiWBqssexq9uIlkesNcMoOzEkL9/0zixXmEytFHwR/X/MdP/DYObXTkaZNpLa4OuKU9+g3BBjtrS0Ot2wCA0fh5Ahm2PA2BhKOWo7r6NHtfmOeysX99vo7zrTu9BTNRQYs5bZkJ5iPr/+Hqn2lbrac3a14GsShsse7V2x99tcCPJ97eNrZirC2u4FDPAqmwN66jv0DpdB2Xa5+hGRowqR6D3EpCh9ZpS54uy6BxTxzTRMQHqhWeINvCL71kc+urmGMDS93UjGVV+rb/zccrx6fnVnks3lbUrqNI1A+d8fhnudpvslgWtLByfj5lZ4sKAbtesTdmjfkivnX5m19/KgLcrRe+CKbRfjVpmCSyDIDrkrjhVjo+1rPAvddf2G0UVxn9zZmfvdrctslu5tVCNEi8JUaMhhAejfyrv+uijhCcvxaSRNKWpYqHQFmihzF5m5hzzfef7Zs7WIg/GBycpCWm3nTm3+S6/y6n4Lro5/cUIkuWQp62TEVbYmBNS85w0+h20QHylI/MSXsYLQGg3V7v79DNaKQo7rn4y/MYjmxBOPo3XBdDPTKaeT6H3q0r/+nmqQFLgRJuD/R+lEFCqSEqMwcm2bNjE1EpbhUiKI6z+KklzuPm0SmRkcYUwHF/FES/GoJLKlhbClSSILVcw82rBlUgL4aCb4NBMAtVNHmup4rE/rSRAerE9hCAf1LJRN67fpMWMU0O4ocK5N6WSd4WygGwutcwr1UkD33w+TINEncaANgjdP32W1ggJtpEeBBcRGGUhvFfRlODDqxZjmk45eXMu7Pz7ir9P3MXOQwoJ/vBPKpi7zLPqS+ihrkm+s16AkYU/48obVIMMVXPNAhoFQVTzf2jE08uVOuXtpIXFC0vI67G3cAo+4y01gelToHbs0FiIOY3I6d4iUhxuIidRwnzKxYdxlHLQ4VoFd4lM9O8gmiVbWKecimKRh/DvTA5w6/tbyLoT1OdIECXlxNLzr2NvPRMFVf8qSv4bvE2DyhIxw//QHDUYAUBrl7iFJNR0tHPAAoCcOCs8WO1qqIoaOwxXLjLn3mGM112+Ymy4WDPKxswZ5TVhE9TOdDBYvYDd3XslA9iJoCLBks0YeLL1CO+OP+IOuK038TR9haRh+IdyedSE1P3rHaZuIC3w1cc3cH35M3ZfqF71ruQAl+NNonRxhCH6uNn7FMNr87iz9RO2Dx/hFb0ARg49U6ATt9HuNNFrzaFT72LYP4N+p4dB8ywW0EMfbXSR8FdTeMrchdZRi7zYJAWVdOsr/SG+vHoN99eeYD89xly76UWznP/iPQsf5NSNYd5pe2RxuP4nxtuH6OQBJE78bSnZt21g+cP3YJsxosSzqPWlD4G+hVZC6joC6dBRoYzh9K0YZy9fxPbtDTTiFvIilRSDqAAFoslzPLp3F4ODfTSGfYbS2rIDc0JpXZJILsLFBeaMwY33e1gU5X2IVaRSbqggsEiiU8Q9vWQwejnAt+uPsX+0B5t0mRMdNQrRFAG7PhBJgSCxhFPwlpdkKUvQ/RG6SPFO0+Lm6jl8fb6Nq6Q5AGBBBED1lUBvvq0c+O7H+7izm2PrKRW12tyMo+IfndcE3efCGbwjD8NTRyns/h/In2wjGr1kqLktC1n++V8WDiuXz8G1Y8StCJMiLTuKUMqLuJhAkl4qqDoR15rmEyQUFM438PalAfZ+2ZEzkN3wvSwGFSddiv3NdRxtbaD3yRAvMu/U8aaLt7T1/u2Jtei1EqarJCKC9UaVuP/gcpIc6tmv8d/rTG75TCNtkSJD9OIZomcPke9uozU9hvecoIKYn/BCCmbdYQ/zy0tcLMsoHY29La8xTlwsZEbiihzODCnqALqIKTxo1dC/MOAFm6WW91HB3W5b0uMe7jzD3bXf8PkXF1lIjuPhyFZVXlQOLP+HSxGGVZwRIPtOoWqwR3zURnp4jM3N33E88q6jubz7tFDmukDv/CKPaV4reJx4PsRdST3ZoxNUR6KuptmE445Grc7IgeGVIQvATl7kqBu1xLTIXITncPh5cwPXr3yAs4tLcNN8Jkk+2cWcAcDQWUlxc81wAbGYjvHgh9v8jINvrqM+XPCwgiCpdGK7we+dmtezcU5V+Q0jgEr3iPIyXnXcisULJRJ0UOYT4CgFNrdxtPYr6xC0SDBWxNSgHviRLTUm+Ap57yE9F/TKzPFg7zGfgaT1Ql7pNvMillQoW1pdQW3+LWTkyJCLaJ2rxoPPR46BpyX03H8vTBCtF5MM0KHVPM46jJ22fsriACMQlcIWl/FpiWgOOOX68zGL72mTxJRFAb2HwlZ6apqk0/mqnPHQPHSmESvzquJ4UPpAoHvG0HBryoQ7tOyzgR6ALVGZVWytVyjUbqRZTEJziuqbZpOSlx8igW11o3LfduZ5dcziIF9gfTX5vmqf6Vmo8TgEBaEd/dzOIk3pOTTHYLo10xPz4G9WTeCTltQhwp3HiYW4BclM9FU5e2bHJ/YIBBIFF6qyR3ao+K1HV/OaOCVU14Q/bIby3NG4UGxFz8rrShAabOnpn4NuUwsI9H/KI5gOS89P5x4Vv0grQO2XpSmq6ydJavgLAAD//8ydSW8cVRSFT43ttt0dz0NMywNxsBIrAQUJBSQ2/Az+Flv2rFmxYAdhEUXeALYY7NhO7NhJPLSHHqur0J2qXttxFmygNhmsdOpV1xvuved+J7QsjPuCcDDsFy+Dn/eLSAaoWq3mWQRRDAQsJbNgT6RShQQ9H6xavpHshoI2TgaEAjmwf2M2gfQgaWEpl4fk4TpejEI3lB6I2P49VXDLA2g0mgK1036ZKIzz7Bl7RfbR4H0l/Kd99hecyQusypzmY+decQOPUPDd19NyXYKSaXDM8HvtheG/d2R3noI/rD3BlbNzllEj15J5NFsVVVUBRJy2JIuwANJijOrZn6lExk+lqkb3HmlAyyTLdls8JzVr6Ur/i0SHHOBdGY71d1sfjgsauenKpeI6SQYrIk8hmI4tzkmfFEatBmljyPrvid8H3fjNCzOvaFh1/8qabuoTu6wST3ROThwlBqWTRYtVIwa/NJIsXKLm+6tUFCRTH9zt+Rqm5mZxsbUnz5O5OLrwkWV5HTj8Yw/V2gJir4sucxHIFqQhUnY/5Pe73WyzCiAqBwg5ICiAX//msppQYbeX8eZ5jATffPctXja3cWt6iIeZdhKEsWzCQqD1+X0y+RrPixuqOvl3pu+HkZpTrrl7fNiIeh5KFwlebfwN5pl5kjSSxlmBDFLFfbo2ienFGktnU9WK36QULg+U0WhfchWVrPuIztrIPNwaGcLiw7t4+WRDeuJ6IjP31KOcbvP15gmOX+xjeHSaabCV0gA6Xo9BhwwhZnptyD7/6GQYiar46t4XuI1xxAjteH1Na5EqTJvVBkgxixGMeQ+wcmcJB623OG21cNZr8zyvlIcwEMTsrUyWflXWIlA1POJfI74DqVgyt10BcL6SoDNVTTBjAT4mUMEnC/fxw9YzHDU67DnPzIYsUIm5rIm03hICbZgC5HoLx7/vIjiBWAHSRq0UbVpUqFOhMlfBzEfzQEm8p0OI1DxL+4MLew/YbodAc+qywes/OmggwtzyEtuRtVsdHmOmjdk0ouHIR31vC4frG5geXWIydOJMQbf6kGnqhRQIYZBhOPRQCyQI57tgiblDqaf7oq8yBVbIn//jEYTVEXy/9hynzTOUB6ndoZFD4hIupsXoslWfhyzyZV+KuhiMz/FgJMLXy0tYjT0sQST/YaK5yNzHs8eEgyMAa7tvsP4KaMUTiKn1p9tCmkVCmqZwmCWUqgig6lrjAvXtP9F9u49BJJowcyS0lNOpAAsPV9jSrNVpsmc6nPlusmArcVPlIFPLQtmbWxygDo5XsHh/GTs/rqN30pVZq3aycRCJfWHrBH/9/BMe3/sc9VIJp1ClBByhRqYHRM/WLYE3EtMgJCgXoygdjMB/gwHgoE2S2iU5I7g/d4B/qfUGUJW+18ZwcoHu/ibaezsYzdp8LkoLr0yek/TOzq3excDMGOpEZ6Z5QucoWs+pymMtA8YC8FLdk5V87WUMlyVZ9NgHUxivzeDyeL9QJ/DeKr2ixGn75ckzPPp0HkFJ+7Tl280DNeTz8t0cn//TRco62cN95TWkTBj3xRalUC+YtFpkSDjYO8CL7V2ct6WFLNXvlEcfAtOLk5j6sMZ7NVe8c0KAJ+eqKwGUXXbeIXJ5HA6gWW8yl2FidhKX56/lfjKZYpT4aWfAYdLA5u4OFoaqGPb7rSWd2LbvsnF1Q0nSkdqnQm1pzQbOnz5lpdLsl4+BO4tApcLjp4q94EezvB3IPld+T+cZj/c+UhCAggOyOaBxckEtkMMJPcNOC6ifAr9t4HTtV2DvAFHjjAtYTLSgAJurJ75+tkBRweycYiSp05dNT/fNZR3Pj/Z53LRnJOyoY9l1YPWzRxicGsW5xxZgmrrRljp6rqGP2I95bogl3jsgxHkLay//Hn0H/gfnfJtXa/2iJZV+xm3KDqQzH4ctbH6RVDBlbk8BdkXVOc1bbHGlRdUuszc3plerm+TFTlb7pv0cA6jsH5qMtzU5H5ej7IbGG77yBWDKFgpQut3cu/7q57vjos+ntmZW3VLcEPoMV3Zbj/vl+NfV48aA8pVBRn8W5oE4wPEepxBHP/Od/7+XJ49StrYMirVYr0DjIo5Fegnbctuzv5ogLHr8b67iWQuFqSiuFkddRbk7TlEsv3/zsudBz1Ic2wpORz4eins1IeQyKIpkhSaNmEUi7QKpJ0UKSkoajDyKxJZRWiCkrSTrZfgHAAD//5Rda2/bVBh+fOxcnGQtXSms66buUnZVNYEEQvvGP+BX8pmfwBdgfAFWLlphazemrpSVaFsXO04cG72345OsDBGp2pqkTnyOz/F7eS6JJTRWkWEVx1gGMeUkXRJOEzNha6qi8L6QNL/mwd4lNeRa+NoCH9LuMXX4Kqlsc8JI/H690CjQLMrCJ6EsDKH6AFaJoa4wQcONE8PQE4W+V+pzCUUmxLGbmxipwCXeCs93ryzRjhpOCivcQyo6wmGX4FRgJw0nnitZtvEnTZVFxBbcXCLPNcOgsmSwE4POFOQvn3Y58SxV8C68QKlYUnlujdhzWKJM76UOM/2dWFGU3FWn97LwjRYpBPoUewtA6ZQr9WFWqSjjtHEyoIWu3BuGIlYM5PVjEVbBYy06OL1mFhfDIk+ezoeSeTqmVLyselkyPMi6LrFW+IjyYUqjtAHLecX+2DxGjKCYIk17XmRxPJ42iIxqfhOCFhfYSUKRKMa5CflczNExSoZ6lRplxebTAlxUYmFiQYV11Ym3v5L20dlYwcaNTfy6f9BwEyNasB0aFLYC++OnPdz9bAvjynEYXLoaXS2q1JUUsLJ8hNcTAsyVGLPXv1wvp201gXzeQgrqFtz69QAsXORwjBN88dWX+ObRdxhsLSGLTpDUqditTNUXmW9qInIkliLzUKpFFIB/PtBtoGCBrl+y1ezEMQaujezJc2T7JxhoI4HVn7lwKJzA0Qz44OYWWssD5JhxMG2HrhnFowrlHPxV0uFIEqz0qDh4IsrPFCguOWxsX2IBrX4R8KXVEYlt1Arg0b1d3L1xAVk70hhnhnYk80OBJwU9rIo8jnF+8B5un7uGLhJ035gRNqTR8aq9SJuUXEpO6/s4i/PdVWTdGiMVDWuzFBObr6qvA7yUo5xozdxgpooYxUAn1AoQHAKqZXYfXWytbuDOlZvY2zkSYUG9ap2KyBGvnzq7g9phUADHj4/x8uExWiNRXDaROTouISEI7nrp1hbeubyOIXnrOikOjYtSvrcG43xzD7iJY9aRgCKbxLIu6fdw8fom1i6cR7F/ZBbZ2q8s4aYZq7Mf/vA1Nrc/QdbuYEzifCquhkBQztYlWVPGboaWE6G9jq4I8vVmm7pofgENnCTrtBXcvQj89WcfVdKH63SRLvcRtxWyN62RFzM8P8lxkL1AUUfon+0gcROsdjr4/NomPgWwSVBIEnM0YQMfR9b+17MJsNQb8KquWx22nazJu5l5pgkXaGhPruhcyhKdIkMne4G/n/yOPsboUXAym3m7PSivebC+jGTtjBSB6F5bTbQTM49ki9RaaErew+0WH4KKZUQXoL11ksRYu7KOpfVVZCfHopFDlDbeg4A2oQCKEYY79zDdf4Azl7eRtxxy9aRvCoxvexDSL/cQbREAPSUhDaO+qJHgs59IEQSt5i3/61EpKqOYvUUA0GdSteeE9KY5eq8OMHy8g95kyF1T3iGD70uHo/Vy7voV5N0YEzfztgLz3PXK/5/XqIrQdVNFMrLrRoZ0uYd3N9fx8v4zqkHyuuW7UC3FSbpP3N/Zxf7+U9y+/T57RrOOgxfQrAJEAFQ1XhJMHk2FiUenlpnNQrFxFjhdoDac+Sr4y38rXTfP+kIVxMKOrkVyOuBY5T+4CvQZaSfF62GBB78d4Omz6RvmDayF1wYXLwfnVvA6UR6wsy650RDdXPDvv59z6CUtnse8GKFLnN6VFBfvXMf3e0fcdPFhe+04XpyUY3z7y4/4cOsq0rTF89toZsyPYRR81yqSNcwJDmosEeSbqpXHQ0yKAg8PD7H28UdY3r4FLK9QlRVJP4ZXheT9seQf2r35/GgDH+XAq4zph8hLLxDI/xJElvbsVy+AoyMMf36A6PkQ3WLCVma811di4csOrK1kYc3MNygsHiS0Con57h4ecqFQS/zISXuBXid3hX6MC7euYtJ2yCcZ2r2ELWXDY88UOctFZNc4cVljD8Y3DxTxjRvNqEMeFveG0juMxqp5hMXlJhhougEhhHwxObTY00wPvSq7IX0hzRTLc5xZ37nII3nJbpXifaJOM5+9Cj8jGFf6bHOscgaXFxRGpehhXtdaBIgCeD3HVloUcIF+WHhe5tZkqG9CUrLb2WTsc5lFBIV1mcPHTOkQPJaUVOuxq6ppvFHcb1pns0kzLx41oIJ2lEtErXju9cjz4Ev/XZvnVRNCEeA2t17LLGh22u9SiAkRx831IQ1UeZ2KL17YWueRzo9oRNZvZEQx7V/BeBhyuhHyCwopXseNmsiC9PbXD2vhkchyQwMQuosgBs2GnosD3HAXOrxozWle3UrwDwAAAP//XF1pb1RVGH7OuctMp0NXliCikUIFBQmxMSZ+9YPxE7/SxG/+ABM1RBM2FQUElxCgBUEKbWc6nTt3OeZ53/fcGZiElnaW3uUs7/IsqanDqFABE1AThChDKdXo3JJm1vkYYNulkAWYXSnyjpgLJALRMf5EpoGeTkoNxrS64duKCvlOMmG9ejBKs7ZR4RstGDQiuiQ32TgmTKZYDBCn29hJfMPKD6YKGh98TyNw+WRqqWAdDoFOBKMxJCpoKByYzHyopOOtkzWRi13OVMltUIntjhc+l8Jdg3RuaY0mR+P0GGWSGHeI/4+CEUx+yH8m55b9pWC8f10saw3cU4OO23faM3HloE1YFDZpOU9ZPqUhNK/DPFkMkYFhUZJUtth3m1jFiFxdQqR9hCNahwgRPmOVNO+n55/o5GeBJk7CCGWCVcZjhU9eHwtO7GBwkmKKeIi2IlE8kj978w2NjwhJ4vOSuBMC3DBZ96/B+1uRCwZTPszwuNQSkBO3S99zo1S4mJRzgYf6ZmaCcojWltHD2iC4sZAQNwpeyQkrj8qj0snM4laN7cE2VpaXcOTDk8B39FNVtVwe48QgeKFw2H4wQbpdYHk+xV4YobOYo6i0CkqfU0Jxu33tQj8LQyxWCZayvvSC4x7fUlMdpt1n+8Vr3QURFYIF8JpA0fLvJSb49v4VfH3lK/hjFYq8EbX4OlSavjqlaYgQ1cQ4mGHKkZWsCeo7LC6szixWTK+DXvOV3LuOCF+VBu0ejwukVQc7f76A/xfIC+1qu6CIBCrkT5oDEc9iUICFjgQGNaMIKMxOXDqMI+a45thiPJkUwrUkvFD8UJsGg+QAS2eP4YNPzuPRd3fELz96dasAI73OA7ZuPkPzeYn50zlC4jCm/7HXwRCC2uTxntd7Jc6sr2EOXevNTxN0tNB/N7Xbsk6d6dtbuh6kADEnOakhf+QjnGLV7ZVyXe1jijIgyxP5uWExpaN+9G+2kmJC4aoSq+kyPj51AVf+uIE9CgpJhK98PoqaMbjEeIye6yJs7ePlrScYPqmwGDKkVSqJeARESw0kBd799CO8ymmFxe60RtZcR7WrqWiZslB3FG5IlfnYs0hADio94Kk/MCoOsHr0kBTLfv9nS/j5iXV7xKK6qdGrCxRbv2H3/k9YWLmMcT0vnTty0ye2VsjZhlr8/LVzPkav15WrXNn1FvSPNzj8FDRltO6ApdRhPQe+eK+Pufke+n1gPjXxQ10BMao89poM29UC9ngPMk7tHvxkgA1T+u+gUtXlTMUWE9tbFKvvJUFgkeDyxgVc27yO58UQrtuHS5Q+IeZYjRa4+K+fAkfdCPXjexg9fYDFptJiLRIULKJY1sDi2PGLZ9A7eQRDk1UUOzDe6060GNQkL0jQ2Khnc616M6TMNKTY+RRFHpAdXcSJc6dw7d6miEpqj5CwRxYAEiyFCqPHd/Ho+29w/MjbyBZWpdsaTBQwup7Fa60WkIklvNxFc4xdwIjjGgrV5mh2s4kXi4FGQ0kMWjsOAQPnMAQEScE/8Q6AJbPAdC0WBG0y8gYmJ364fOXIHgDYLWqF2s/ULkOcUy7CdnPk3GdHI/R2duA276B5cgv1wRN4KTA5m/lKA5Dk//RRnDh3GpOOR+nrFhEE68hx7221axoVSY2xtbj50J2dB1NXWDhyGGcvXcDWD3dRvShQGBolDbFI67D5qsTPv9zG+toxue81aSpGAZSBRQSdUIAUS8T9ppc6hP1dobLUySFZ58o6SMdXxAlnBAp5fkWjnPfcoFiam/uZdTAmto2V8iopwlFgVeImSwr5dmkSdNKpcl5iDjGBWjEjtZ6syXmm/tJEx5WLNtVeKT9BefOu6eL5f7u4eeshtgc2/EKOxuuaJDT1FFjbuIj9XPdDrZDkioJtNCaL4n/CrY0SEKJeHiQprcSuhZDoCvu+wtpn53H9x6s4eFaIcJ8IecLhgFQBJPir3seVv2/jy/Mbsq4maUeSHSbeUVjbhbhr2Ngw//oOFfr5XBXQgcNb2RwGwwPsDnYx3H6J8uoN9FdX0D1xHFhdBFaWgIU+YaTA8jxAkdWqQIdJ/rgGnu6gefgMw4dP0T0IUnhU+pZrhVbL/X2UwwGywT5yxldBdWU4eWNO5BL3OvR/Jibn53HszpH3XOleNfIBv25uypwthU7UEXcXgf+7Bu9fuoDD6ycw9BV8pgVwRe03bVwjrkBEiDKvIBU2ZRxoaGRzxJjraszJ/hTHmtKTzV5XplhtyEe0vvjyZ+giZEkjG1FEE84mmrIGWXHP23vajjYh6N7buqoJ2xQKPkXq6rw2dKTlWCm5X0E55XyGFpDM00hNLpuyhbg7Q7m6qKJvDSyJM5zG4EVdzFh3560mmRyDnL9qjHingoZ8DbXO4pKbWbIt65A1LfKMjkteiompCJePFAXcJsfBhDFDi9rmnBb+f920qv9vPuJnRAtCuUeGGk+Fqqw6Tz5RNHVCV6xGxS+90dTTKNAe1N6cq0xMeNlwEO0Lns+M+DiTYmlKxiR/hqLBsSENoTbvnyn0MJ/1en0It+dxMg+K+mzUqJBl2BL/6OrQiHBsvOc67gSZwbjVzlcQwpFGIMcxM6cstuf16fXmVQDTjpfHIZZ/bCJUBXwszpAalnUEZSnFVy5xLsH/AAAA//90XV1v1FYQPb722rveJCRAsklAVYC2fLRpEYUHEC/9pX3ob+gDUh+qlhYJpJYiQUuBEhBiFSCfS3ZtX39UM3PH9i7UL8k+rH33+vp65sw5ZwLVYsOhmblzK/RdiwWbqQ7uQ9MWcfhXAEEioxoRcUmguvrD0aX+r9Wf0uO5XZtWtHPb6DGq0mkxKszqi/VoOzrqeLUiLn35BeFqn0P7+2ti2U42a2MOupn6wNPcKBroKuJwLWnaGiDdJHKnbVeGg/oe6EM51fsVH/7fnvfSJVF6vbjXc0iZj0liucqv7ARtDWjzaSoKKcypgs7JtW9qJ13WmgRNZXu2Yot6g2/GyPNtGg0UHCOAH1InCVDKk1KQdH7182zXhpwtsRon1tl5CcKgdm5VICXgFhvicEmLv+NQaKGmw7UbMbWeq3Toocxj5LwUGvNGvZaOPXTu2I30oKl481+jDAAyT3MV5lwQZnb570VcrT/91ac4sbGOnQcvBFxguqeii2QiV+LJnUe4OLiMiECKvGRQQfqRR/zZj3wkZoLEy9DtWByV7xFRAkxovIMBaGn7Qo6UEEzHWqPxpaucGZ7rBKKjO/Isftm6h+9++B7jeIRo3kfhF1x5R6vlmp3xjJhifDg/jMpVidNUQCXPmUcquirtGAkQ8pEdpThhYmRv3uPw6Rv0x0BI1SxCaQtB5ydFBvJIHGyuYuncKrw+9SnOuSVfYUtm0IgG0OPnge0WSd5CzJYK6MZdTLIJM27CXgiygorjeZy/fhnP7z5GN6FkJ5tCZ0kKUB4Bf/10HxdPX8fh3ghhLJ0cjEveWcueAl10sba0wg7/nuwY/KYAACAASURBVDb+K13W+kGlq/3yM9OBMr08yRhPrSuUQq+BT5tPSfeZQBDHJyD9b1B7JujG4ua71vnKPT+1OODxHqRDprLzMH1nzEktp0KDY2kHwwePsftoiLkydLZ/9Z3nK1CCt3x2GesXCJSJ4RUjDtYLR1dut+pTc0bPuR4zIEjhJbE2aK1Tv/SInrUSZ765hPs/34MdVwjzpmZHMWlQjGH3X+H177dx/tJNdBdjJBUlIZRoh9Lr2hPdp8RnEjAye0ensn07WlToRrYhXhAUdA9iD2vzwKLfsC8Uj6G1QN0kKHlIVTuODnZ6xzmQpc8JVQErK8GUmzdP9bVGzknt/84uAoPjfbzZk8C5ykuXwxm5HgfeOYLkANHb5zh88geCowMERJeEVJRC1yaJiA1FBJy7cgnh8QUEEe2LBbdSpOfeFrI+dTX5xrT2TGeA6zlzXDJFCyr4CwE2rnyGh7/dRzY85FnUIC+sKswhwwBjbN2+haWr36L/+TXYbg/6RhUne2XBtHTKledM8nxs71lsHwG2DwYCDLMLPJFr8DtX1jI53RP2R2yBI8/DSwD/JsCvD58h7kS4OljB14MQK8x6ka4gzJ6p96tWRdo9W2Xr7r/LiG3UYXhy+mjXZMH7c2kTzFHgtz9EuvUneu+H6Bn91b4Dm0oe77gDbF7bRLg4j7GjZ4seWrJdNpjthAj90Hkt+WwqKzRgy54WVA2iIJ3e5YlvcezUCpbWB9jdfSGAKzlSVHJtonRT0nDrx7u4ceMyNjaWYDzH4kLZer83UgAGF8ld+nAHPW+MkOGQkBNBNkzlDC4FI31pAi+cQy9coHYT9X5jaibOzPSxdtmyhImvn+4CBxaYW2DAHOECAgJFqBDtWOgcrBN9Jk9h0xF8v+TAPC8afVFZFc31PN3sOpiMLLaeDbH1etc9j2EDAnnyzK5unMT82jK8+RiVsQyE8e/0hG7PYbprbduWtoo8MRXvEmVfEbA+FyI+cxLLX25g++1jLgL0XCIfMRyYYwc57vzzN75Y/QQXFtdQThIGQDkjdNLUqS2qmv4LBXlLYf2QEV9chhht78Buv8PIeNgPO8jm+yjiLnonTyAaLOHYxXMw6yuI+jGhx8DeBHg5RPbsNTDcQbo/hp/K2s0DAzs5QMRaaq4yoU+xVaXLRrsITOv8Z8cMV0k3DGBZjJMJTNTB01dbGJKEgVe+B0vSOjL1Q4osBDZvXoGZi5B3krowyBXl9p5OTFvqklXrySvnWWVqU25rtVgojOHp9tXNvv8xKrjmMypB5jzFOE5liZrKDpfoFR/RibfZAVqRVVaytLlrGK1o5QIiATb1ODT/aFPc9eB42qD+3daxBdjLxwFs3GGsE/J3lVGrrGVlDbSN8Sh36VK8ORHwOO7HrkW2+LipRIziO5Yw+2JqmGcpJ/tFy9eNDvLY8kzz7BiXq3itNnz16m51SYO7n+xfGfiuT74wlv0akJF7TxIh/d38HQ8tP7u8Xgv1GnXdH9SXTmn4s+PQY7YrgLxLhKmta4UO7fxGPl16HpVX0ztVpRB0Xc3pWEqfS8FRz90GnOQ80/NEvf+Jqc/zOxlLa8COMKbbTG15uzWtLDMCTssS/7F1Zb1RlWH4+c4yZ5Z2ihZKEUgQMYREMfUCYiLxwnBhNCbGW679HYbf4W/wQrlAE6PRGGMUsBIrKdANqW1pp8vMdM5+zLt855xpvWgInaXf+fb3fZ/Fvf7Zjc+twroN3Ev7vgLl/0vV90InaKG8GYUcFKgWlafVdA4MXaN+i5kowNcsKmQxxKU/ov0OaqS1BjQqLmFh5kwvGFNNGR8Mo6J11i+fOoT+vvV7h2ZcSp63ThZRdoyPCUPYBe5oYCucIDEroe8z2h/MrXeqyzdnrWp2hqz4mOfl81trkLr/vR2wOv/eWF577f2upRhoPTBTC0GqTAckqqbQI+YNecdBdvSZXH0441RguOJE4Ovz15RNj3FsZAwZksdtknnAsHztC/HSVM0G1U5w1crQFjss5CjQv2l/YBNRRH3QNpbcf0eQIfw+IyEIXwJUYFIsGisfUl6IjsCBKNi2Ni/Cq4QmEGIV9ZJkiB2furcr9a/lZhXZeMLDQnaKI4kThgDRnKAA0TgYJSm6wQT21l7gn8UVdFwDNytKOGLGVbAC270+5q5fxUEzQj8/hMee+zEvYNpUCT1AdkazZ2bFH5yEp7KYI0UOpIxg2AtVdpbfKfQLtf6HCopBhGaIx73YX8PtL26jH/ThTzssOEhw5+IIwT4rlXErAZf6enQkjS4JsESSeFzl0zXu6JiAuUs5phsncBpdDB+uY+O7x+gOJPhusKCn0k9IWLQFXP7wHbx6Yw7pJFU7U+H8KRSLhQmNBJpGYbIC9SYaUSABlC/QRlork34HQRJgeeEpRlv7aOTSJ5m1TqK+iYGd/R5mL09j4mSLq2upkQtLDvFgdlMHQRZg7uJVXO5eYv4/qis16v/kWjkueM7YUUHpEU7aD1m9Sy3yxBEagCkrbAKhDNlfWi7yrOBP78lZn9+2UL7DKMwfPjL+rIf5jUd4Gm0hbGaMl3Z9hwPstuvjVHMS6eoBlu7cR2++hw4pzxfyvTYZRBVmGpPrH7+PC++9jV3ix1NChm3moN71hSp5V4eZ66pNquvoBVv5kbyPUjIrwPTESfw9v4DoxUAU+B0Rr6LKJyEiyMJuby9EZ+YipmbOIG843B8Fq/FLMiRlaYaUM+4Uqs74KT56bQoTnLqR1ZCXI2APk6JURRs4BgsRMDAezjYNJjOhBwRcJy2Y0uFT1cSIqOCUVp3p9b+GwPcPn+PETFdUso0r3v5cYVULLh0bFxq0+MC9XYOlXp/FPSnhZxhaSPulYeh/Jw9xcrSN1pPfsPnTXbTDPXgkxKVCidSfCSU4PeDs1fM8Nsmkh0E+wmEWCWKK4b8ysfIsUzcwp6bnrigY0o5vBbJOCRWQFGgZDwdbu9he3kSLBHp5J0nRgFQM4zxCnDnYD4FLb8xh0Gwjomewhg1SZuFAKZcNSkWaEj5Xk8yg7bfx+mkwyqBh+5rRAhaV5iF2pNpPgf/vAL5eB+4+OcD8ZobNKEDPNBDSxa7JovkVhN2YknrDqTPLzTdSbKaa2xaAr5aAB2sJ0rzJ65Sp5GNUkYoC14j66B5uwF15gPD+t2jtrKFJCUyR49PP5QipkDcb4OatT9E89zJGnvj5U7ROrSJRWRF9kgaLTSYlQQlKG3BwbT23Cb1G+2j/MMZku4t0Z4jnj5dhEqFkeJzoc/jBKOAcDshxJsKbVy6h6YM1BOy6rHqnOtMytfGM+z0k+5tw+1sw+//yT7a1hOGzBQxXHyJceYDBs0V0Jl4C2u3aDifPIMk4S1nSEqty6/OtVSz/8CXW7/0I7Gyj05kEK1kRrdIR9JhMxpj9VfOdZWyv/AEfkSBV7AlmoPsDzZGU1zrDqOFj70WIb+7+jD8f7SElTjWPesHIUwJupAFw7YN3cf7aFQycmFEahWMv/kVJp7B3Y5sAYF0sep2CY194tdZ6LkwyNFoTaPlNrNxbYN4aISOoXTSOaZ4Imi5N0I2AC6degV84nNyRZG9e7vNqf1C76NYvvNWexblmuuATChQOmrTfxClacQGzO4CzewDTH8GEEXwK6A5CYGMXWFxFvrKBeH0bXn8Epx/CGcX8WS+RfROMxpVkKJ+t9TNN7xnlPaBMBKgCjRWM1vteFKeMKDxIY9z59Rc8iiQBQOuOzrFBkWHXALNvncPNW58g7roIySCwyFTA0lqD6nOjEvBz1eXLrcG7Dar3Wnu8Urj7WFFzHF7PaFkNCm0MwpbcqKlmFvWzbRxKLkUkqVDbuUPzo03BMbucNZRCq8G9V3nal0JvR6iVAtEvagLc4/cvo/PWxmgUD2RK5623k/qBPeQ5OJdCpVB4TVkUzHMp5lgPfqsRZou7w+EQQaPBiFDGJaqOm+dVz2p5574W3urBP45oFBS1vqtPckddwIxqlnF8qe4KlpozXrS0VvWuCPehKJ3dqG0eO0VpvMG5Ze0PKgLb2avokKPFLdvH9s5vkdCWcmDp6yyMTzEm3VvjBAE5keg4c0FaNRfSXLj/UrgVjTVbEGd3vbom3P/Q0QiBLfODqNyUPCuYCs2vMdV+XLrWrl2OwQH8BwAA//9sXctuHEUUPVXdPa9M7MTBITjEC5MgkQgpCmySBYoQIisWsMiKHT/CJ7DgF9jBggUKEooQsAggJySRHCt2/IgdT2yP7fHY8+iZ6Qe6t+7t7jFEsiLZY890dVV13XPPw/vwq1tfa/GfmxfYrPjXSZ4IfSFbKlnWf47ejGezy6BLN1gLqaIOtNgJ4m6052cPPjVccNEJNrtBcTJ+Qf+JGdHOvhjUaS577o5pcwBD6NxlGTjV3SidJy1MAmMVuBg3xnM6IqcJguR6qhaEJ5qAHs6gwYEpQy06rRXTLZM7ZKveRp1uPZufSwtjpd+jzYJpR6QtIdfm4cAtBjKsI9CjkI+u/2iy0uJXj4L8nupXnmTgntl5rJqCL77ny6bgPqu6njILQl/j++j1e3Jd7rAZie5KjQyV7qiLNGNQyCZnUDAgUYdR+WwUMUILyHX281xNHSe+77rxWVlgBedWn2M4kiySkjffWOm04PFTcKFoKpg/bIgOVYa6/LBvgLA7WE7CNDTDhxrSxtVKFZyyJSzM/4P4KOIDrlbkfP3U0eoAphpj5tol7vRT9I0te0yJlCM+DlttrC6vYKe5jd3dLWzuvMTm3itsNDcxsBGG3pC1UXTIo6ifOOt5Cm2v8FhMZAY0cIBvvvsWa91VVN8MKKAcAWnuJJnXzQf3WxFvVONSjxO7TPaAVC8PGlNGJa0D56gzXzI+0qFBtQOc3kmwdu8h0hchJoQdzUemlAU/MGWL5HwZ1+9+ClycRDcJYcoeG8nxvpBGGULOn9W4e5EBbPqAhdtziJ437MWoBXVEvRGW5p+jSvQx0cvzZ09Npsg8Cpu4cvUyorLl2K4Ra6adjo0ObjaMMTc9i6vn3mNJhRDxYApjoYaHdKwi2G2ABD2SP2SAzDhzX987NUr8TzP6F/1uBxGWkg000ja6FJ7EkqTAIeVZN0MOK0Z8BIzlrtcxQjzaXcRSZxPDSsJdNQILqfY4nZZwrh+g8cczrP2ygEqb0g7Axa4huqDMmSHJZGbO4OMvv0A8XcMRQk4AYEolFS2+k9rYEzRI9VYJVIuXqpNzgpD07UGVu+Vhu4f1J89Rjjw3OlkWfopaUGF5TLsfYXbuMrz6BBKi0RoWUvG854dvOnJeNCbGuWCEO5fPoM6u1+qUb8YZAanF0BruKjcB/Liyg25qMVcPcNYCNSOGi5LP6xtHW+b7lTiAgLrSv28D3/+6gMWV15g4fxFv1A1fb2AyybdwyhMG8qgL3rUGj499LDZaoBZ+JOJr3hfjFJVRiKnBPib21hE+vI9oYwGVZABfgDx68YgO2n6KXgm4+dltXLjxLo7sCGE6cMwVTrJxiKNJcgiwSHscA6Sly08FLIFD5HQeJAbL8wvwR2l27Syf4TnioJFOJ0R18iyqM7MYBTVN/xMjJ5uNeyafYiYBxZCfQrfdxlszVVQrqus36MOiDx8teGgBICvVlQS4t5rip4U27i/v48UB0BnVcBT52NhrY2O3hf2DPkDeClWn64/l70WuT+7o7wTQwqILw3rkpRT44XEfL48swzmpJAHwOjQy0kz/TRBEffitBk69XkT45DfY9aeoD46dfClRIDZB7CV8T965fQPXPrmJjh8xi2kQ9QnGZGNRbZg4FoYTqhBLiqLfGC7kaOBYKMQxjzpBStVyDaXIYGVxCaNOiFJsmDlEoJNlimrEn3tnexfX35/D9PQZBwxb5Ck5sEJFNeIxQJTVIbqdFsLjfXR3G2htreGwsYbD7TV0mhsYHGwg2lnHqHuI7iDGxMws4JXFgd2BwKmxivlIbShAw6CF5tMHaD17wCDWYXMXe1ubGPY6qNdKzHRjvbolWVePY3IOlh9hdLgBm/Rd9zIVPwOMxzK6MyOJFqqY/2sJ935+xGaIie+jn7jCn15HzJ3q23Xc+vwOgguTGAbuZwp4E1uFupl6nsmNt9x5iPPoGeyMs+xwfjbSDulZTNWn0FhYxWHjkBltfOUkAyGmkuw5g6MWLk1dwHR9ktcVxzNapf/nTJn/BQDUtLd4eKP5USrDUqdzFLM/AVH2y8JoonLBUoe/1QG2mkhf7cG0SP8/gOkPUSHmLxy1nQB1X2WENN9PAv4CAGi8pWNDFipjLWASJ4UhWWxIzcBqBX+vPMefm6sM4nXVv4MAmlKKbgB8dPcOLn1wBb1ghCE5/ZJfkgeWLjjnf9eESOTcqN5M9H5B4BoHNI8rVHhKXULfj6Jcjmq0SC8kTpkTRbRKo/VsqzWREcaVLeyZ2t1XH6pUoolVeurmTCSpEnmxr1Hfuucm4uXiSUKYay66gpXmnDY1Nc2MmVgctZxI8SsxxVQPUNwcS/ucRJabZmLCzmtIqfiFRAT1O/OkzlBmeEhsY99J+FIB+agBw2NvPQxIxik59K5WE9a2Uu0j9755godhhjnLs+U8XSy6EwFQGNQeORld8fzPsmo5z+ma1ESwYgPTF1l7Vs9l68idOZQVnLHzCnLZoqGhjq8W6OxnwB5rEonIYIr7u8p+pvF3pvV0nfJzaZKyVJ2VXM78fvy5m8tMiowSnjNS3/D/Uj9qDUYMVwYi1VSfmgiZJ4RBOAgz1rWxBv8CAAD//1xdW49TVRhde5/Tnp62wzAIBAjGqKBR0RhvRBJ9MDFE45MvPpj45JP+Cf+BP0ETNRqjER80UYyAUQwmchkVEFCYYZiBuXRKp+30tOecbb7L3u340IdOZprOPvv2rW9doqffPvKeH5xCHeV58sVj7dskfcW/90Zsxk503r3ZUxSHIr6iDvF+4DyVWlznC9QbafiH6Mt59GncZZW/8RPYaEuMtR6jfOuGpJMCWpxzxGClEiax35iMUsTYcIK61USZyGTgAtXCKpU9luLFH7ye1l+WmsGv2YzsicDaD2ixaMPCYERPJ54vcoWKIcitNzCJ1Ggu5Okbo5+ncTRu4rt7TXs0LnBogSQ8scYMAqugiKfZ85hUkwDCOIgEIlc9j2yQ48xMpwWwR+DYaEI3NY6/UOp7QODceALzOPzPbRUTZh60QdQS8VtglJKocmkaWA1+42La1f/qTCnWS6aWe4qRUfDIv6fufhSoplvtyMeZrxPJAawNUhNEn5fqTRApiktNy8RtFUH/IwtRI2qUNmi0g0wdAlXPc1HUTFPcXV5Fa+42O4JPdn+hFOfbq2s4eOh+NGYayNwmUDWIab2QX8VA2DT9QReLq4tY6t7CXOcmLt25grPXZ3H64hmcuzGL6515rOSr6EV9zic2EdnSVRkC4POlHOlmUiAzBT4+/im+P3sc6d4YJiXUW1xZC6YKOfV9MIrIjmM3Be3Nw5wP6z3klTrOUmY2R6Wi2aWReFUUBqlLsa/cAfy6iMXjVzGdSfffKR2ei0brsJE4HDp6BA+++jw2akT7I3ZFzLQ2H8Hj5Q888lYZD7r2aWPkeRvZoL+n1REnNVRNFTdmLyPbyLRrvrUnRs+kvz7Etuk66vu3o29GGBbic0CB7OysTYyV3giHDzyDOgXyFYbnh7/qkQZrSJnPBH5AMqH/xQq+vf4TPvjxc/TdCHt275Mcf0ChAqj1lf8uasKDATrIcLp1Hu+f+BDHLp3A5c5tYLqGqcR7QkSITKyaVzFBYlpu4ZBHDi308d3fJ3EzW+H2NUnCSatfiyrYbZqoXlrDxS9+wWh+E3XK/WcZlOO4NoI2aP/vGIeHXn4OD730HFqVIUbU0bRykLIPA4EjOt6xFdSeLhC5Xl5ILyveEghauUq1xpKOai3BzuYMrv48i7zdRdUoCODBMuYIO/TaK/zZu+59BJlJkFctMjJScHJJHOm6Zu3j+h0cObQP90TgqDnrI8D8Ey8F1OlaKTC/mu/iy/N/I0634fE9dcwYGUtHbhlWvGEouSJ2apxteRqgbYGv/wB+udLGQsvh8vwa6jt3Yed2g3gEpIZ1NFp0mzBv+9bgXDvChfll5CXtTwoe03OJLRqb67ivfwfDc6fQ/es00v6aRCNKCS9QrjXoUlLGE/vx4huvId+RoBcVKOOS5VM+pojhKdZKO9ZSc/wnXV5ZmpTzmDLtNBZqJQFDBHZElQj1Wh2rc8u4M7fOZuFUd8UKnJMrNF+fRjlWW+t44MlnETe3oZfl7L0BtT8YjiybjtPiYp4O+dPEVWQDh7V2FxeXOliJptBLgdUqAZTApQz4axM4tQgcm81x7FwHJ/9cxlzbYpBvB8oGyjIWc8bcot0Dri1lmF0YYHa5xBISDLbJ8x2q7thqAUKFyCqAiwA++Q04M9fD5rCitHatZ1XCYBRArJVD2I017O7fAmZ/QP/CCSTdFpIyFw0+RD5Beebk3l7ek+CVd94E9jSR14CsJL3ziAtOYzBx5ymR1Kp6B3HMsvPu91LgqJyK7kaFXAKnm1Pobmxg8co8qo7iQEWvLwaCPGOxSUburZt47NGHUSfjYXJcpws8vwScpwt94aTLSqyLOCpgCfQrclQpltaWnFJDrwRDzFBsBiXnUGJTbQp2Zh+KqK6CCxP2UTnftP807KL1x0ksnD+FXbZEI7acsFGxGUZ3l9C5eRVlaxEp6a/ai8iXruDuP2fRXb6G1PRQiUuRFtnA6xAfC9ptHXmP1DDVmMHC3Do++egb3FoasRllTnsvnWWxAMt9Czx29DAOvPAU8kbEOv4ykv+dzslI/Wv8nZEBv8q4+OIIslj8TrjRYiwSyj2nwsIaTKVNTEcN/Pn7eWFPFROu8+JswnPf9Yc4uGMvM4WGxOYjwMYzD6Io7BHw0rJQv+jvhC602sQ6KZYIhyGqfZTEfFZa9ccpN/pwrQ7M3U1gow9DjAC6W3vGFkp1QBTUhkAiiXmzHoGVsfeeW74Lr0WyTmb5kjHRygd6x6SNIsFCt4PPTv+IeQ7xJTCcuvxkfOs4+m/nwV14/d23sFl3yMyAz3oqN3g/5/pBikIpxkukaU27pUWgWTtlq0LBTe8949Sh30e70e8PNdY80q6xL3yC5NfLWtXo2lPFAUyMvRZhvi5SA1M+B2FCw28yj58ZT+T+bk1olJYq6aj4NIBcNOjUZWd2kGefhO7/uPuc1CQdjT3WuP7JUG801NA9DbWZdJklNhA+BU1rjliZuk7vc5GJAoPbR/d6MIQZBkk1mLpLfaT3dYcthSu0QOWGaWj0yb3SgwGhyajsDDGZH4+bZzE4lfuyD5h28+kZ2tCk3erOnxfjznocxQoQyIvGkX4mxuTCEvANYKo/JpkWvtbx+zR9ZrNJZ45IDzyTncbKR53Teembvswgr4lE1HuKcKNRZRmeVe3fM1dtInVNjncFH1U6QaCLBz7E20Ga5ASsyH3Xz0eVJrBcRs35jcF/AAAA//9sXUlvW1UU/u4bbCfOQKFpSJsAHWBRxKotCCE2qJUQYgOCBVsE/4M/gWDDhiIWLECCCgRUamkRNDQpTZWprdJmsJI2o+PZfs/3oXPuOc8vopGsKJbz/MZ77znf5L/66Zuf9a5RL6ruSdp0iJ5D0VJ3kAdpCWxQIYsMRsWVfiEv3RktZN2JSFJqCXdSMh0rGn60WcA0bBlsok6U0rKzP1qIMLVSKFVZz4BAts1MAEH0Y8nI12zShLX2bUcX54LcpOkC2iVkiod8t7pgOuQ9Eeq6M61wDQ2bLnLdcStrwhEuNZaEkVFxv1S/BDqXLDvo9hBYwGT0SioPsClLQSlFboLouhhECEov14NvOI47lAJZ8jSzTAEdJPi45P/12lrWVkVsLKgNgLTxAJOmORiRjqQv0bexJIB1RpFQHZHeA8oi8IUqTt9DD4URepJjTriup6O4JOn5z1KBjDRK9L7W49AHKT1/Wa2NNkOhMYTSnVWdUUYCkzwhp+rAsfpGDK4cykSfJY+AwcIA5v7+F0kjYRddTxeYbjblGLJ6ZwfjJ8bRCWPEQcIFZGx7vgQceYQOqnED1biO/aiKclxBaXcda7slLKwuYnphCjN3Z1DaKaGBNto+uXUFblKijm3S4f3aRhmff/8l9oMycocNbGgFlRV8QWG+zE+PBdMVRkTAWrBIUiv0pfdKIrQsdYXlZ67dxWBUQLhcR+nH2+jf7LBZUlZxQM9eg1Cd8SGc++Bt5F8aRSOMGdWiD6q5pzMtdgsi12RwzyvdN1aYH0y585ykge4LWvSSMWB/oYj6oyoezD9k7T1tJhDjMvqb1Aqk898qP8YzJ0fhDxRY0pHQIjxHTvAN3m55t4K8n8PYkaPSMKGFTZdRuraJ2XiwgQibKOPq8iS+uvQ1Ll7+FlOLU2i02zh/5i0MIkTeCjqhyEq6kHa4KTE7NlHHF79dxC9L17FcWcPDvUdYWlniRf/o4VHkTcgIoPtHodN6lr0j6qaDW60F/HTzd9T62mglTXi2g34vwEBsEK7VsHZpGtuTa8i3PY7+C2ShqWkwFRo7R3xc+OQj9J94Fvt0pDlhFBmhmEPQBGmS8eRlE9FSih1i6r/nGjLaXCXpS3+Qh91qYnnuPvpofLSy2AQk+svC63awUVrHkbGTGDk2gboPlrNQ3B3pQ8lcrk3pKI024loVRWPwysRgmgaQzn3W+RmQrGEDwB8V4Ju/ZrG4E3FT9bUTh1Ck2Eam7Lt8YEgyQyKNPzqepgHKBvjhToS7pSYifwg2X8D07B0cfe55TBwC8h445k8CwtNmWd0Ak9vA7ZUdRJYCIh2S1e8HKCYtDFU3kLs3hfLta7CbD1D0XcxiIm2rLtPYLephgtc/vIBjZ0+jkovR8iIkvpMTGBkYSVvuS7qNNssgi+aCRMIG9DzHbW7SGGZ6dVle0JcvIGj7uDu7ABMhjR9klNp3zVA/7qJewekpiwAAIABJREFUb2GvFeP46ZfR8nOIaP6gZrplZ1ZXzhiR3HChKgaXhSLKzRj3NmqYmt/DzcUG/pyv4cqdPVy+tYfJpTrmHnewWgFaHjkPFGGTAm/DSL6i9UJElP/eyuNx3WJ1v4XZ5S1Mzj7CXKmBtV2D5V0PyzUfqx1gfh+4tgZ8d6OKGytlVEwRSdB3gB3CqD/XmpaNEnPtGobr68CDaVRu/Ay7toABkpJZYToompMzqBjgzLtv4NT5c2j0W3RM7Ip/aHqHQ/81L7s3z7vCztFvs4w9Vxy4xCKfizwqflfnltHabqJPi1KNQJOZb3uzhWLR4MVTx7nAdwWdTTscPTzFGX4ZE3MDgNYR9JssBEN6z3QQJjFCMT2m5nS50cTw2Auc0kHXggo+X9h/XLRRBdypA7srWPrnVwyhhj4aw30LLyRQKUbBswi6TUS1XbT31rG9fh/Ncgnd5hYQVxCSnEeQL5Z+OayWGwKuZvXQlxtEo2pw/eoMrlxdYp+7iHtuIosjzT417A77OPveBQyfGkecS9ANE573eF+T3vlQaSqEqYlMfBo1S4zMkSZN13D7Q+PVcN8Q9rf2sbOyidD6YjSrJrkOKGk0a3jK5DA2MoIgpMax4WabJ8eI/7nqZ1UBSW9qNrrocd4rZFoLckn3VNrjSQ6lhUeujZTSQs2bbpxyoQS6SZvoByhpfuaNwBMT24NJIulaW5Ba1msLOh37AXbiCJdnb2GmvIVdbsL55PzCT0LLA6o54J2P38fTpyfQylEDN3JyjcSNPyqNUDaoKiS0SIwFbIAyeAWcgABWxmQZy5bXj4V8oYcqE53d8zL1j2OI6j1A22DmqGTf+xl2bBYgTdm61NgUmjkzD6DkCPd3IDr8IBvxl2Ffd6U24QZt3E2TwlIWCpmh6yAl61yt0RzD1XmAdZjen2SO36VcsVO9FLpJmqDg9cAvYQToZ1Q+6wppAe5S0M0cYIpqLaXzijZQ1GPGJj2ZbfbzDDKqz1YG3S4UnA+KGsozaB3p9c0wc6K4J9cRuUFP7tFbyKYpESz5dewdRfe1ZnDn3gGIKpvgMUCkpgxwibcYvUe1GgOA/MzJGk6Y0wrUZqPe2TRcJCZp3SLNEPVx4OYMMa7TOMmMFCHxuPgnIIzmbQK6aJ/ScysAZ7a5ktbX3Rj/0XVtv1GUUfz3zWW7LWxZSlstEFGIJF6eiAiGRElMvCS8+KK+GxP/DP8WSTTG+EAI4cFLRERu4SIglxYplAIthe623Z3dndtnzvnOmZnWuMk+kLbs7HzfzJxzfjf/4Ffvfa0IO/5HZ1B96QKRK6Zztl//81ziaqqIe/VVTr8UAak4agp1RSdYbuKEwrRC2QG6aBtzGddpQGSjFhqa3BY0dNUD+YFOpMoLgxeYzC+EqpLbqtbZFvQdvYCUxuqoPWXDoxMjnajp99QJmfoIGI09lM1rUKL7PMwIXZQfbYaQ4+qc3gwSq0ULzoBSmhZ/61Btd8xpEkv0iV/ESmSyPnzejRi06IRIJk/u2vMKRkI1JkV9GJSx4G/YZNVmPJa15It0A5WF9UZCq7LizaBRgky7EmmFTvs2Us6V0mMLU5qNdPQyFFv39X/1NBXKq5bBxTAiKG8UcsGHoj8q9/f6z9QUglxjVXy/eDBTUUEP1/HRregsdPBkdh613FHz9PAJgSQz4OdLfYxPjWDz1CgoiTsjzSzPSTzJnRbyPg3iaOJIa+s7U72hug8TZMweWOo9xcPVh7g+9xd+u3oKN+duYTnrIGyOIgkCdNDDifMncWb2DLwJCkKnsQJpX10zYTxXpGuKgL7137V6rchwZcpXKA2FvFnja8sbtNK5aM8NxwHGVnwsnrqD1cuLqA08FeoWFO3IWvTqwN4P38HrHx9CNEyIATk/J3I9iidBlhcaaM3LZrqudWiFRkm6SzGXRtLD2iDC6HADzdoYHt9/hGi5TaA+QkU1rUS214C1vkW7v4I9r+1FB33EQca0+5SamNCgl/dx49YtpGGOsRebPHRJmOaf4Dk6WEAL51pX8OOFYzhx7jiex4+AsIPAT7G21sWhQ4ew3d+GOq11xUPLUY5ld9oEsclxM5nDN7/8gGdZGxmTiVKsrrUwt/CIHZN3TUyhbkJJVzacDUtmj23Tx43+PRz9/XtMr95DElLuch++TdBILaaiECvnZzB74jrqy0A9ZdU6J5T4IiIh6n87AN7+5F3sPrwf7TBnVgRRF0hCw/uSqe2WBzMFvdKUz4cg9AqEie8Xxukdh0m0TdF9NsGQP4Sp5iSmr91G5+kKRoxi3YXClGnY1Jy2lhaxY+cOYMsY+mGNXaRjz6HMBKrl7J2R4J/ZO9h/cC+mWMsfw89cggL9X10PmAVwugscvXAfV+bXEA+IIQLs2zOB7aFhrX9AzYazRHMMA+Mo8KRjpQHATA4cu9zFAkHN9OzKyKdhCA8XW3hp1xiadYBmcUMW67TlZHL553Pg8lwbA4wgsyFTwIcpXz5aQv3xTaxe/AkxU/9jDFIXU0pnJDXO84DYMnsPvIn9n36EbsPnYRk5zdOe4POfK9LHT1E2DaTkEyNJQKlkHlMiDNNuQ5HneQG7U5MfCTUmY6Pj6C538OTeAmq5az65GOamMWPNLw0pHz9+gk1btqH58qvoekPuOClnInOSgFTc2yFoD7tMsLcwFVc19Ho+uv1hLEcBWlENq3GInq0j9ep8UVpmh/nO8b6wVlB/DR9hvSZq/xp6WYjlyMPCmofb8zHO3m3h1+k2fp7u4tTdDi4+6OJhZND1RziKUYsbnfMaaf5pIpjHCerRMjbNX8Gz08eRzFzFVkqdML4U/5laSSCiRnB3E0e+/BzJxDDWAmr9U2S8/11jgwKosI4mzmZiKIptlR/WJNeatc7GZ8YOI0EesHmkCbNqsXh3HiZOESrvvpB6gBHWB7OP8MrOcezcPslMLyuxpFCJkckrb2H1sQbc3VM98WRwP+MIKKlBMsRJhk2TL7h0I+vzMWo9gTwCWjO4d/YkvGgBoSGQRW+2AobQgDowHPlu8wieR4h/Hz75ALD/iM9MJt86tFu9c9TvJPTJfKyO29fm8e13J7G0Wvq1ENpOiFgvzfk87Hv/AN44chiDRojMy3ggk5ty3m0k7apasGvdSUaBBG6UhriOPcSDEiP3pTjF5sZWTDYnMXNpGnE74ohYz5aMv5BlHBlarUVs3dLAZKOBTVRXZRV2gyDdlaevO5Zi+FHWD1yHyT7i9iYUOZqVETI9WDLJ/rcuoi73yubfqX8z2Ztu6OzcM50ZG11WbCApNZsRF3qXHFhpBqTpYfAsdPeHQRjgj/m7OPb3JWbc9Ni/hvxofH6O9moW297ajQ+++AxZw0NkBsjNgJ3LrXK1Ko7s7PlErv4D59/FZmoFeOP8GBhglNpOs9mrAwCSeXrCUqMGinsPyaDntRamQaGZFl8xRmoJgNxgPL7xxYCNFUM/oaJrXaooLKyCVZYbQpUreALscU+Saw0qDX7qvEB80bRrn2FEIqw9iDP5E7a0Z8RbzQGgPEjw1bgwl8z5TBp7R21nDy2RDtQq7GKvQsfPRd6sBrIFo096FE3d4qEEA52BeImVNaURiSBQsnjpczeTL4h1hvMMZIosQ2t/yACD/rZP5pLCZNAhwEY3zaoEuCrdUAPp6nfj7yS9ITOghdnLgy85r+ovp3H5GnHucBfnsaaG4+vNJ0UyotHq0oc43zR3n2HGAjEcxAOBGXl87xW2OPerLnWMjbYLLwzXIzrAs9L8cySy+zz6vSRJ8C8AAAD//3RdSW8cRRT+qpfpGdtjOxOCSUBWCCECKUEc+AFwgAMnJBYhcWK58A/4N1yjSLkgJFAQMQpJnAVIjJ04NjiObRwwxLE9nhn3TC+F3qv3utuGnEayZ+mluqre976FTQDZqEEpLf9rKqEPnNoe2FLjXJmQmMYfOxo/XSDqvhFdugAXKt1lpkOwYV1WnCAEUdKT479JAXEwqzEs4ttK1E0vql8ZSHkRXShu/oS0sTt+WjyIapRBN7LX6/JDZcSoLkk1U9SKflWoI+wxkArdxRb65io9h3VIQqH3g3IRN+IJwCYVSVpOSPI9ZBjByKS8asxEJnnwEPdMuh10rZUuosifHzhnUfptotjvRyitoD+usGZasoA66v2gkyt/TidbZQAMEjF/VCSy1C+p0WMhAbB58f/qOSoSyrqlNJX3lV4ILI9QBodn9kWJ8D2V9/Pxeq5LTBNdKg6sZepExg6o+mBVc0qfVMAXmxXRUjkTkwpIIMhllmmHe78urgp+aBSNLQAGyxuoRlRDa6yFxbk7GGz3EVlPFmOW/oJULP094M+NDZw8PcnRebRek96QFmte8DUzNYykwHaUeI4VDCUBww6QRRZZkKFr99CO23j4eAP31n7H1Vs/Y3b5Lm4u3MSNxWtoB20k0YC7I86ExhXJzh7ePnleEK8PT1IfqlQovt5CodJrzlFHA4t65mMiG0V7ehV/XbrPOvOm33CuvlK4W8kyT8ZDvP7Z+/CeO4xdL+aChqPRCPyQ8UMGWhwLZXWhVkaHxMowOycV11nxLyDqGD3HicVY8whqXoT5n2YQpWI+prpNlv04cGZzK0a96WPi+BGkfoKYFmhyx/VTGAJDjMXc0l3MLc3hzsoCpudu4OriDUwtXcbU4hVM3Z7C+u46kihFHg4Q1C13ILr9BK2RQ3jt2BkEJoB3YGSKTzCfxyZ2cf7XC7gwOwU7TCkTvqPi1QOOnNzu7nD2vTcSIo4o2rGNR9jCzNY9fL94Geenv8bsowW0TY+ZCVEQMCV+tJ2jc+0+Vr6dgV0GmgqCFFtN2rRZ7lTXXmzizY/fQzoxgphkEDXLY483zQr0WSeXcfOWLdB8ZoayGaMpPF6oN0avjHozBdkZ9YWmhpoXYGlmHkHqDPFUoUevIffJLdLeDtrtbZx4+TRS8h7xqSjyEfcz7qLSuyl5Ix4MsLa2gVdfeZZ/kwonogJTrU4U8G/+AL6cmsWttV1kSQTEPkdWHZsYwvFWHU0YROLvgAO+DXsUuQbg4gPgh7lH6MQhd0PhRUjQwHavj4XFBzj50lGMNVz6IMdse64Qpo7Y1W3glwc7yPIGTOYh7PdR39lA8+/f0Ju9gnj+Ouq9TSh+QqdGxmW5R5rmHLVnRvH2px8gON5iCm3ipdz9p5inlFzbbVYCoyyl87hrVkjQRFrFrDN22ZY1J3emUFS90PgkqcZoYwxLtxeRdxKWhlCJRc7t1Oj1JJeAOpmrq+s4PPkCxieOom8C7vrlYryXFJZ8eWFR6macwMV/GmJC1JAiQu5FMLUh+DXSr9ZgAheHa2hjHUjqnXZQyumJpQ85XWS6F8EwUBtH4o9gzxtBxx9GJ2iia4cR5xHS+rA7sFy6qRWTTp+b5QmCNEYYb6HVWUd7+it0Z3/EkXyAejYocgTY1UCMBfsR8NYn72LszCTaQ9YxmAyBN0JlN7nsU9Vh3gHJPL4yKbKMXh/nak7xy4UMkuZBj+ioTbRGDmN9eQXdjS2WAgQSO1ly3wBKoX24eh+nTj2P1lNNygbV1ancL2uBL5/SqD1PKeKeUmqpaHKd2agWoj/oY9DrotEah0+pRLxfSV2w4+YK1mcuInm8jLoXo07Fv++8CGS6YNYJ0/kz6n7twfhUsGRFJ84IS8SX7neq6yGNHxug7jexsryJc2e/w/xSV5I5nJI9Y58dC9MAahN1vPHRO4hOPI2trMPR0pS2oC7gLn5W9rvGFn45jtYbIB70pZvn0IKcNfLO1JqKJur+c+ybH2JoaBR+bLC6sIwaNYXyQnTEZa0TkVlsb/6DY2OHcCga5jnPab/EaV8HocvAdL9docpZgwoQIOCBFAC0B2FGg3U0/n0xsZ5DuQsAwJS+QBCdPL/67ji0GWB8kQRUjfT2V+f8XtL8E55H4Y231ldx9volLNmc74sbFTRHWeSBRadh8eEXnyOcHMN23uE1JbFkDZiIh4jbv9uKibTGiofC1rXiFcX0bWLoqbw28IXFaYSdVzIAwJR2StKKeR/srpE4xMt3KusZsm9VUK7qcYZKIVtlgpqK0a2+p5rVzxT2QVIck7JMqL4I/bAovE0BlrpClvbJrnlriuNye6JE9iylbFk3Ewo6aDqbJ/eRjo2766b0nSlmPgEn0gq707G3XTyfmv1V9ftFM9aWbAD9u5rb7TM7N+a/XXaaq/qJXF+UiWJ+mdaiv017T5IP64PiTMc9lvrYA1p+VI6lCuxxragSCwH61MRQrzd3zcWwUCn7/HuSIsDwmdQrzsTezalE/XfgUymhdVJZ9z30vQoUsCRBpCNOXlzWtSqt18Q5BmxkvJIcQD3ZdBwOOHK8rEuqQFEQBPgXAAD//2xdTW8VVRh+zpy5c3vbUmj5kgKb4gdK3EhiiFJcsTRi3Lgwrlz4M/wDJv4HV+6MJpigEYkfQZCYEIqoQC0t/aJc2lvuvXPvnTnHvB/nzGBcEBa0ZW5n5rzv+7zPhz390fwnlnXzCaNhpYu2QHr4VC82F1WrWzbj4xY/0MuMZNCgoMObvtWKDKCucQ9DGDUYRHd3iqyEF6POHvBKuw7MgDqFW1xzbU33Ub1YvkZ1iS+qajvSsPVX+ow1EiHHFltMt0jVmTiwBJKoO0GdZVVDiLwijt752qMuvw9qbekZoyLJZoZaU72XGxT06uGmBZNEEx5a49Q4ScxNguutU7dgR8yA1LLhluSGijEJJxpElEnyRGlIcDoMp5S0MJKNaKIHEQ9+TOtyUZceJF8UTUT3K2r846BeG1PMs0aQDBIp/SYxcb+u+bGai24ruUCgWlXUJaVxN7P4rAUdUqL6nSRq5HxkhITDWkwEq5cdqrcJByU0PigYq0GBrXBaBvpTfLY4VkSiG0vn9YCtYqLqnzXQLnlgh5iyEYWyHOW84Rk/MMEyk7U/VtAYWGn+aucTbUAonXNtZQkvnZiDHW9iZB039KXRhrzwMBw3KOguUf4YnKC5OzTIfA9SHsQt5eGOpRgkA2z7NpZ3l7C8u8g+AX5MmjjaviRKU2SlYmr+c49dRRU1AViqnHgjU0Y7nJHqkKgpos2NHyTYa/bgeDqN0e02Vr5ZQLbu0HKigzM+2hqhyFJ04HDmwnnMnX8dOy3HztlF4pSN6NlcKMhKwAh6ykMOAwCl0/ickrecQkOzvBHhWYFi84hmblIe5I/MHkXn4SY276+jlQgIYPU5tUyZTmAKMdOamAH2zEzAZ5Zz5i25vNIljKVIp8aRpwVv57tpH92siyeuja7f5cx80mWmzQwJ+SDYBp7mQ3QHOVbuP8DZM+cwlUxytGOqXv5SWAt2QaeGaQM7+PSrz3C/+wDZdEvYAqzrAvaQb4TJsdhZwrXVm7i8eA0/r9/ApbtXcOn2ZdxYvYnFpyvIGwUcneUNi6lmC9NDC3N3B5sXF2DvlpgciAu7CVFluu2mrc3uGDD/4bs4ePpF9MdGKBrkMSHa5KxmgOSlKxFDIipYpYsNowuMLCf1gc2ESjEE8qrx5IYva+DY7HF0lnexfG9N7qGXokmGenyPaPB0A3S2NtFr72Bu7gR6rSZ2nDCjWEfI8ZR0xjWwsZ3j6t0N9PfP4iFt7EfAwgj45RHw/Z0O7m0O0SOUgwCAIsGg28Xj/g5eeGUWs2QECKMxgOoArPZBD2FwC8DnP5IpJ43AU1xfjMng0yYK28B23+HWP20ceXmGgb5MhwDKsN8A8O2yx52NLlIzAdPp4VDRx+T6PZS//4An17/DZN5Gk6IpFCijRWHSSNAbeo4hOPfh2zj6xkkM9wD9ZCCxZkkRQU0bG1NpRgqiR2h9F2O1UpyJU6kHbJxaSn0UVp7Wgcxj395pZHmG1T+XkFFjxOeyZh+zV4RDM3UYdnfRabdx+PAs7MxB9AiYQYGBRgBKrzFU0FiTdQK1N/iqWN1CagSXSKsQz2qmPTtlVCgqE+PKdNvGNTyppZpQbWdaq5yPfOiyPs3GDP0kpHBwtOsIZd7F+Ggb+zuL2L1+EfmNy5h5uolxAgX0bRXFPQG2QN8Cz8+/irMfvINHrRF2xgq4jOj0A4hnVFmlC8T+RdbQLjB/EsQmvjK4zTg32lJTSnUFI452ak1P4uChQ1i8+Rdcp2DtOTEBglFkaceQuwKdrsPG1ipOnjiCvVMZDDEJWKIx5Gi5YBTlrWTxBQ0zn9GJksS5mQ/eRWBQoyhyoOjC9bbQpAGfPGxGT+BW72Dt719Rdh6i1RiiaUfsKWJYQqiu3GlIYJJNtMQASkY7+cUYH4A3MKhAxoq0PRdzMrJebWJlaRtff3kF139bReENu/4LA8TxwEmAG4F9r733Fo6/eQqDcceMLQI0iJVEf2SLKX+zAV0iUWJ0FpXKpmDzyNAa6+NE5xiZAieqCaL7Q0x76qtnnzuG9uYWNpZWOP2nyfGWCV+j4024R6ckd/4+DkztwyQxULl+OiTUtNOwOujLsMegQ6l6faNCJFODqiqZT6L/Fjxv4gVHNrSLw26IT3xGuslAOTfzMvxDfi6/b5ymYAScCkhopta1FH2d9xkGHNgGFh638cXVn3B71OMaUioA6FODPPHopR4XPn4fc/OnsG1zDLMS2USGYZHH62fWa0Mi50qm5jcY1OTlDipmbhiG5TbJwB8AHFPv1dnLLCTReB2WhSXFm1yWd9ioRRdqfOW3yPHTqr8P3lihJxRH/CIu3EKPKe9v6CcrW2avi0r6WlpaSY+sn0WXgIi+Bqgxeq1Kp8L9DWwPOUfEAL0yN6SlIlPEFWgQzwHJrE81RYn+7zTMYGHgIXIo5fijRt9PQu8V5jMbtfUiB8Az7BleWLHHXGWwSL4vPMinGf9MqtdW5wqv/k1lMJ1O5RolTc3o9yWxH82HOYO9tHWnOkb6+4B1/x87g68pRgZK/0r3LDCkeSlMS1hNZeB6S7OmPlPkYcTzFQ3lCkDJsyafLwABYjxPn0V8KELimgBx4rvBsftUd4L0QGcsToainH9lFrNhvW7zhc0g7wX93oRxTAthAu9lgRlYQTT3cNKZzVCMZAHuHfAvAAAA//98XU1vG1UUPW8+HSfNdwJpRaWWCglVgrKBBVLZdYOQEAuQEBJiA6z5BfwaFl0ixIpWQFvohgpo1fSLRm2o0jhO7Iwdf80Xuu/e+2acSsQbO7LG9syb994959xz/Le/uvitIli+mPe5vb6snnRS4rhRyXocMqiLY2X+ZhdsOR7dqFQ4lsIS6jH1tZEUAEXtrKzCueazkUIg5gj6cBdOHlowO4a7ZKbY89lDAIIU+sLIFoUWh+LoWU7n7Nd/u/1/jSj2ZDeg7LnK8zRWwplViGuovchezWnTfXd3yGPn+sXX0xFsgh6JJJ+ORAihlQNJCwAEHWXgI3fxhbkUQxUbKw7cRe6KW8bRp30avKoD0iF5nqCoKjHR97s0CWUNjsU7OvCmptRQdr2SCLGhiDL5pTinKsKm11rbAQrJeuXP034lLspZIVK5dlpUzTPuu6j55NT4Kiuktixe7H3XFjxVXijKq5GVaoCjBRCfQw3bKzkChpjosMDS0go6Tzpob+/a3uLQjQnxhyD5e4cSkrZx8tQGIgEBxlb+xZORZ70BMusRQHKg0YSjhkbERARxhUjTWKeFnIgF6tWmPn9ibmN+Tsy/kdhEXT5KK+szqI/AKZQCqOKKaioBpwChc28NViK7QciOMjTyCC+V8/C3enj04y3k/4wwmxqraChc9yHnq1OfefPMCi598TGKUwvomrH1Q7CReKawYzP068Y9hXPTLkQyFWlETf0a8WBhcJLROwTNGI0oxFpzAU8ePEB/b2iN13zt+9WIrLwEkT+d7j7W1pcw//I6BjQ5Sy9jTnMXqRb8HJmf2xiyPCgQz88wQAPZ0NH7SDFFcmIqtrwCSZKg2z7EhfNvYgGhlYfmbkQUEocY4erT3/DdjcsYzaYIZmJrwMVpLAZhI4Df9DGOMhzkPbSzLnaGe9iZtNApe8gaJbppYosfOjcN32BxHCB9sI/nVzeR3x5irgdhueU+ltbRkW+Q+MDJt87hvc8+RLCxgCMcoQi4wPRqJqcOZXZ9f8zWFPU5XFJY6v+zIKRsnOg+8eMYUdTA6tw6njx8isFBD4FX2g0gAf7WoErYZ9/kOGzt4zBJ8Mrr55GaCIPUswwgO+97KGgB9CIcjIGbd7dx/c4Ort1p4/rDPq7daeHfJEMyoL6zWf7h4wJ+HCHJMywvbeC1VcqV5xbYQDYhFEdJqewHMPj5ALhy+wBJl8DCpgUArBM6L4y2AOvnJf5+vI9obRGYAw4Nx9ltjoBft1K0uimiCRAd7qO58xDp3d/RvfUTTgyeY6YciwcBfz3ai1PpPGkAFy69gzc+uIjJUoh+OUDYIPURS/kLdTY/tsbQuDFi+qTzpxGDKisfDUM04hnnwaP50TRZFWmB1RPr6LW76DzbRUONVRkuYAVAmcIvcgx7PbR297B6+gz82abN7qY+/ayQmDxfzc0Cp2xw40QZTtTm4/9RKupqZVAdR81ZFchXxrT02Kkexk271UQvJrq8JlC7yBEWig5OdLcw/PMK+n9cwVx7G/P5wPbGG3F5N8JKp4S3nlrAp998jclGE0mcWbVMQNUfKQlUSq2tdUG9x7NwAISdK7JccsMrcoSVeAzIeqSKCrkdaWl5BcE4xP2/7iFMSSXDLVXGys1ZIk5eDq3WAL3OU5w7ewZxoylMtygSwN41lH2vzLL1IKi5pVuvBaPnuJQ1gArTFJNhD/29Zzh89hiH2/eQ7D7CJNlFTLL/MrXmlbITcWpS+n5GUhM4vrZ0RWcpiQ1sGlKyUo3uvTTDTDyHII+RdFP88P01/HJ9C/2M7ovQKkxyUZjQvEwtOjOnG7j4+UdonF7B0IxsTKjnwe1HecB4vPfy1AzPc7HGEJa8LFXVJykznudM4SBRrQSwUvQdRfiuLa5i+/4jZL2h7XqNphvdAAAgAElEQVTIxcuAVAwpo5roj/sojsZYXV62yjDrsWSZQK4HfU/GhiggXFE/dbfU7/TKvFeLgakb5FiLrlu/TfXcvsurwIXqGHx+lCiy5yXL0B/0uWc9CDAKQmy227h88wY2hx10KMFG6wbY6dUCtWfffRXvf/kJRnMGg2Bi13jSRXD2u7SiEiObsUklPad+fZRqoAlH4GiBpIBZnem141pqHDbam96bawRfVbiaqd+sBJTubcOA76xC1AS+qGtZrapyeSOq4hpAI2eAgLzc+n1FzjtMP1MZ8XouvBJd1otADe1kz1/dl3A94HVPEfYSKZyc3Ve1y7HkF7f3Nxx1ac3ACwXvPQEyaqx+rb25+iw+HpGOKqnX9nEmCXleg6okahHB9KfO/JAWcDXjMzX5vUY6aq2g194Z54nS2tSIOU+MALXPX2s4bWumNLE66VcV8Vwfa3u2BX9swV3//nq9GUjSNgrruWWYoCWQic4JvZ/UUsfHA6/J3L5iDeBlzVPy1Kmbpe3VAsH1FnKpnTWVTXv+mfQl8ltIO3oYg//4upbeJq4o/N254wc2wQmEkBKBWqoKIdEdXXbHritaiXWfm0pV1931l3TZNRIrigSIXR88KqFStdCQFCVQkxDHwePxPG51zj3n+tp9WGIBsrFn5s6dc77zPeyFT9/9uiyLsIj1pZIAjdRQ7S5kQYcpTx1RKwiZbjYCWkGU3ESQlbgohGqpUiuT7caMSVtMB7FJOt0t3FRHMa/91+l/AEDV3C1ogpKAUCXRTWaiSsOoE2gEUuiiC39kCk0PY91MjGw0GkUSjGKsDdmjOt2PKeL6f2pk4bynARh1a4sDvY/biHNoGYRwCNEiwdww0rF4qYPXdzLyJK6ddbhuurmI1m2u4Q2gQkR14gmEpi3MNX5MgxETkxCvEbEC4pfqEmNdjhPDDzUcjK8vHT8hiHyO5cZnxkpEcdFj0TVmog1K1+v0Zpn9Tfxvzsx4QihVR89tYmwwA6rEXVTRVL2GiOhPXAy76QOS3pMTeyNNsbR4DE008fTJBqrBBK06lffWQetM0sfxoMbB3gss9Y6idaTHJoGUNUzT44qnBDLxkik7545K9Ej8wNcGm6evmsGuMT4abyUGjFx80UNYjAxDwRBPD3iTQ4j4qgVRV6q3r29T7lRcadEoE6y1lmA3hti8cg/5g320Sx7yeI0pMzQaDDxkFBnUBS5+chmr75zDyzRnoybSsnPbJUUqhK7p1FVWiEse9INIiJzopzy6bZjBIU7J9H2iUyd65YmVE9wobvy2jjIrWP+dBCCOmk3LxXS255BnYxw+sYhGtw2XtIWM7mPQEulpxq8yviajbMxxXrVImsggKy8mLOugKUhJEy1TYfPPTZw/dxanusv8eWogE98hceH0BM/wzY1vcXfzHk//XbOBWsBNOh7WCMuDLy9ybgALCh0k/4pWk9ceUwvbKQ4lDgt5gepxHwe3N5HdHaAzBHsQyGPes6GlyM9SYLzcwqUvPkbvzHHsjF+iJhMLK/dXxLTROCsPholLvrXTyYbq0DVzW9YL0YgZqRbQajQesRP6ysoK52o/ffgH3CsyAqpYluG8+JSRb4bYqhy7/R0UBzlOr76OvO6gMgReNxic4b2AigVHXgNtjKsmDqomKruAiWuwS3VF1HMqLqm54mE7Ne4W2WiEtZUeFruaT+93z1FdYWBSrDvgyve7+H2LAI8FsmuAtZL2wo2447FmkTsMqzYebpW4+WCAG+sFbj2pcPtRgfV+AWLqN0d7aPcfo7j/HQZ3r6GbbbMreioQWS0hPXTPUJzZyvlTuPjhB2isLWJkC87jb7YlHtNMKcczZJ5ofKn7oU6YVUuYihFtm5y2pT4oxTen2TqEZreD3tIx7DzdwbA/RIOe+8R2koF9asQzoSgw3O1juLeDk6uvMQ2/SrqY0F6a6EPbBnNAN922/q1H+U8A4B+PGTP7EQUAoI2TsBb9X2ufDWAq6EiTWT8MUmVoT7ZwpH8fBz9cxcGP19Hpb+Bw5Sf/wktgOnfSNOSvRqEEuPTlR1i9cBZ7lvYvYnARpbWGKyehCA7sQqlfplJLkcHJvktstRh05mcxxQQab/hHzeCI6PhJE2+ceQvbW8+xv/USpjD8y9ivSPwJSFGfVcD25hjD4S5Or61iZbnHkg9tuv0lseE06rXQ1rIWE7ha2WByPPw8nBQoslco8x1U2QvYeoSWLQWCkFwT4/0bDEdJ0OckzSLxQyQfgWoYiPBxgkl4VvndnkDtDijjcfg8x63rd3Dt5i8Y5MCQ95YUE1fJ5NdgYh1GHeC9z97H8ttvYmAKpp6bpA41XLxWkrAuzMwkU2sJBThNtMjimsKbYvpBGO3dy8vLOIQ21n99BJvXSJ06dIv5nvO0+H42QLk/wtHOAnqdBaQuYdafacjxa/IWjMgLXbTQ58dL/w+Uzd9c08HT3PvnG8VEr4Gn2XB8YuLXC5ktgkBTA/y8vYWr937Cnf1n+Iu5MSKJ5PrCE23scYvLX32O6uRhjNLSX38n5pNac+iaCzpqZXi6GRlqQxpFbe40lSg0SdEg0kfPlYgbjOk+6MI5jl9cO4uPjZMUBj2HbAAnnlhK9VZQNRFjwfn6nrXqiTf/1uFUXOdbScGyMrBzYr5N9XcZRVbbKDkMwRvLQe0/dYXEbvfQKbEc+3wdrufQDwp9nVsIm5v2IY7PLsqwxEItr+eXPifDvESOgWoPep6ox5eCCmqAqJLo8TiXWnoq1w0AgERQ19G51/dqX4CIQa7XWwEKHYTq3hp6u/C7tfrxnmi+vpc4yxBpPE158Mz26ff67/OsD1+Hk/TUp0j4vpL848jTwMuLZ863SteD1EIk7UGG7ntrZjwJ+BT31F42JjHlLOsghp94qtF3s1GJ3NcA/gYAAP//rF3NixxFFP9VVU/PzH7MZGPW7C4BEwkYCMGLIDGIICiKeAkS8CoK+l/4x3gWPIiYIB4UNBpwczFBo0ncxGTHZHZ3dmZ6Z6Y/5L16r7pm4yEHc0uyzE53VXe993u/D/fyx699WopuXCfoQB0dR4fOfMNUN1wm0otAmm6I/j0RxK6Y6QaQCbzkLuoFl6L9h2rCi0M3+VBHGjduihgpwJDwQQJGTr0uqMF0mhq5tLWBhDzEJpqJxAsRfr+KkSP0tBBtjYCqtdHgoRQCg/pAnJuay+SrvsY49rA2AfTfSbXmnnJkDIJZRiVFtBVDD0Z4JIO+EvNCZSfoz5NpIB80HGXi5tIEoK+L+B7IZ2levoIZqcSSGOuCJl+ZHPr7ELniB0BGpsNW7ktZFXP3W53/tcBRrZKaA7LhiUgEmM5UlYF+pA+DN7rwDptq8ujpWf7lwzqvSG6BKF6jnhYn4eUR9gu9CGa1l4DKFpwkOITrjl7AAfeV/ZAXHn1l0z5rceTIEUyzKbZu3IOZBMu2UNwvNYBpBmT9GcaDPawdPwFHFB86ANOEOY2l8OmIikWyANbiF8KCEd1Wwa73gijrcps4A12QfKKuyfTFd+XmUA3hS8EyLlSfYM64MIGwpN8d52jNHNaTFSRbY/z21TUcXN/F4kgMEEvVuIM9AKa2wjQFzr1xHmffuQBsdDj2rmr43FlrPEDCRj3qAhtkP36qWQg1r9Vqz6HVJjB9/OFDFFLvJ1F6vboxeHZ1HcP+EHdv/YV2mAKKBhWerWDzCv1HB5hWYxxbXYWzTTQXljmHvTIC+jDYQFEtOVNdqYj1SR1imJX7CLC8JPOpKRppgvHkALdv/Y4zp0+ju0A8AG9GRkDPGFP8uLuJz658hkkzh1tsobTe5VmfM2+Y6s1yKEovm2T8b+wRQNTrwRBt10C32UJzlMPe6aP33S3k10fo7FksSKydbGQuxgo2l/MOza9/8B6eO38Wk0YOu2SRUythlQFkgsmMc6JBm0z4XREb7GiBhWg+VYmGtlJvDTkbbOrz9cjBfv34GrL+EFu3t4JZUVV6A8FKIgpJX0ucsd0HD+FKg2MbJ1lDXtCz4ZoonOi7C6If0t+bjF7NbMLrUlQRzfVgxpEcdqnD0vnB/j4XBJRR35KhccnmgY61/5vbwNfXetgdpRy72Wi0fUtoy0hTDY6WK6sGRqaNnalFLzPYJn+0cYWWa2IxG8Dcv4HR9W+w99OX6I7uo8XNfy7iFeulYcYnhpiVBG9+eAnPnDuFUVqg5Esim7lcwLv4+Zw7TrlA40kzAUTknTAehikDPTsEIjnxQkEk87EarZkYLHWWsdzq4MHde8j3x7wGChpRnLuPkCyxkDg8enAfj3o9HD26gfZSF1OO+XRM01bevx65+rz+XwCA1i0hokxMKP0rTdYoMhKm5pqYMM1iiMXpP+ju/YH9H77A4OfLWO7/jc4s48l/FeIpSY4Bnj5nKfDuR5dw5q3z6NkxMjdll/lZNeHGMmcAwIq3QoHwAfW3FbZdzVaMpZG8jSqLlAAmMdzMadrTbiMjV+rlRZw89Txubt5ENhjxOUhyprSZYFqS/MIP1FMH/Hl7gNn4MdbX1tHpdvn9payLAKrDS6xCoSzf0J8VEZAEIz4BFe/XhaRCK7VoUsNHNUdoFoQmLHTXohLpqexXLvRpem890MAAAO8pAQNYapIin6Z43Mtw+cpVXPl2Ew/3wddGg6Mhv1cNSwUIZKI1eeXiBbz49quYdFIknZQp5OoHzLVDUXsyOaeS02rO4MxGw4RUZIv/uUfpPGMWpkFJMs1GEyfWNrC/M8SdG+SDkNTaewFbM9nuO9kehntDrHRWPChq/fMZQTOHmtOnAwCe/PP0AED9HJUiVYEMCkxYG2JkTIzBTpHj1+2H+Pzq9/hlfxt9WH9tyh7mqERg6ICLn7yP1ZdewCAtOaK2NP6Mp31NZ6P6NzEFupkKhb3gR/UgG4f60ZvHJcGwWgc5cV2vsX7cLEozFb8z6MzS5C4rcXbWRNLjKAlC10QHX2wGLn2H/wxVFCVB7qbNcGhcZaLOwB7V8cxY9HtPtf8KTOSFH+axL5amEIiZXqms6kO7QA2stfZWObQLNa7Wc3VyQtxfMXjvnESE1l5P/j7k9ecWZYjpCwyCqHHXAZkmkenP5JKjX0c0ehYZ1fg8cBNQwA/XbLhOzd6n2kLrdh0Yxt/BWT8JLyPvgbhh9v9X+xHUhsUCYNBzKdflJSa6T3y/wOwBTnKg9ZDeUnTeIQJS1phN44XxQQtEbAOqZxV+UmZB7CvGDAzxSaoltsKAj+pavcfU4AcJtdZaEpuoAID6QFRVhX8BAAD//4xdS4scVRT+6t7qru7pnp7MIwlNwDhGNy6ThQsDKoIgEhGCCx8r/4D/xYX/wU2EWQQMRrcSg4roIoqxkzjTSSaTmZ6e7qmurqor55x7blVPItgQEgj9qLq37r3nO9+DJQBsZKGGB56OpTF2zVpHXwZ9HjQNbB6kmd5eL60IUKBiBKTJBNpFFaVi+QEKZn11szWPfJT+IVaDu8i7XCparsW2KyvKuF4cm935LijdWDaq8Aha5NGdQAk84Qyp+nFnKnnDycHnxcIohc+EmIwFGo6ThVLz+oN7ZrmovdKHRY3slOJeOGUTxEIP8vTM+sYcHrQTMovI0wrV5Inpmw0rxiXWBJlAhWybhYWf36/MgNrGZ/zvEETMBj8GBXDUPIMlGJ6+oouyjpWpaVHr4IreI0XqtOOhSQGW3T7TsBDrfdUiXdEzp9Qwb2ilhh0EDum90Tmt36nGJ87n3muWZ31JjWqSESgirOAC+S4oOONRWUWcwzbrtc2kLaKxdQ2Lfv8c0v0Ztu8NYdjd2TDCzrV3CdGjF8Dx7gzj4SFW2yuIO4mACk6ynktJfOSoQOeR8FijUKIqaow0UiGrVwErKyaVfM3FnH8XuwMz1c57YoSFLILqy3Te63rAmiLN+6UFzrZQHBusxj28YFdhBmMMrv+C/dtP0Z1L59/UCAVCMxeN5vJLfVz9/DNk/Rb27BQZdQYi0eFqlB/PNdJkt1phHaEiPp0d1zY8pTzVqJm8CYgcQDe12Mrhj3S7dIhe39jA7nCIg+E+kjJBHAnjxfqRJPp30zmMhxOYNMfa2hq6vS5SKuqZcdNigyxK9S9L8WUgvVaaZqKx9nOax4k2VTKMp9+RGBxOD3F3+x+cu7CJ08113gQzlNjGI3yx9SXuPPkTSUe8B6KlFqJGzGuZ8R1bulgxhCzYRK3d7CKfzZFPj1GOj9DvLGMtt7CDMR7e+AP5bxk7/idz0guXfI0q5GEWfAxME+DSe2/i0ofv4KhVYN7IURjxenGRC2uaMnSUemi9qRzNJQXzQtawsjacHHgiVx1rAxpvfRQoUclbTZzun8NoMsXj+ztoFBZx1GZ3ckO0YnKfJ9iF5nwxxfD+gLu3Z86eRdnpYWLEWI46g0y3poZznHNUFj9oPoHCI7nioUHrCjEBiMVSWGzvHSLpbKB/Rh4hAmbI0fr7HeDaD3t4sEeSgw4bDNJ8pc6dAAA+14IzJo3ofYiczELfkl0AuzDopiNE935H9vMNjG99g7XpEN3ySLLY2Rci4VloI4cZHZA7wNsfv48X37qIMeVmk0dGlPPXSRLHouvwMwd+NVfzh8gqxzrifcP5CCvUCs+w/sUW0zyFSZpYPb3G++HB4DHy6ZxlRfQ2Os5aJ3spFYZJkWE+OkA22sNKtwPTXke01GPJkvMCWzmzqk9MVXs8rxh59nXi/54TaiTrvYIB3lA0Ego6pwp42gsxGZqzCZaPHqEz+BGPbn6F49s3sTHZw3IxR0LsRdrrSN7SEM06+b5lCfDquxdx+ZMrOFjKMUlylgFRxjwBQrRGNVjSlnHH1NW6T9VLnr/Eyy7gI7a0G0eeQrxPFQI0KiXdtBsM1lH0YLvXweb5C/j7r7uYHUy5WM1lZefvW2pE7ClHozu4d4jR6Ahn1jdwaqWHY5ZfVnufMqcCnuRUdOVTYnxnN3Le/NFb70WSPsprn/VnBTrWS3qD6MWdQVVgWWUTOBiai7EAgI4bRDQnS8wYi2rD5Ql2Bgf4+tq32PruDnZTry2HaOtZONWIOBHELQEvv/YK3vj0KtJeA3mHqPcZ5mXqZS/edI19lgSsI38M9V/Q86ueZz3jPJzP1DQvaKb9H7qe3Am4TCaDBHad39zE04dP8PjBDscCN71eWo2AabQnxASYjZFOM6z0TmGl2UazkFWZMsUTS0kazkvaTgIBzwMG/uv1/wAABUKqZqD4hVD8pJ73OcLVNLCbTnH7wV1s/XQLv073MeJrErYCs1X4HOeQxsClD17H5Y+uIF0CMkM8mwy01VKtRRp8E0e8R0sBIzUHjZEwbXO0Wy3eTyThRz5fU4foPeRLo+k/sZcXzxiUboYiVusG2rvi2NY68GCJbagp4ELnGP7spCbbXIDxeVWKdqJ3c0MSi93d+lpcMlVbCr68yL27v9A5uWHD3fWoKg5tvFCgxsxOtaHAtQsR3srUWDxb1/+mRgExBrXmqIpmG0D5ucZ0A2yypw3IOddSFVigoIeuY6XvVtOMVtO8OEgXrAcfKrm4q/ltQb0baHzm+QLorM+d/rv0kcLa0IlqLO5QxNdYyApWqFEk3cM6zV8j3QMjxFPw6zR7PfdqLavFf7j3NU8B+hQChaTB7j/HN8fVbJu3KU2h4zpXUrK0NlTAhMZKU/KUba4N5lBT+QZ3iGzUFTw06TQ23gEA/gUAAP//hF1di1tVFF3n3puPSTKZaSaptqXQWgVfBAX7KPik4IsKPhXf1Pok+BP8PT4UEUWkPokUClVbKhanxbY2nTpfyWRm8nFv7j1Hzj5733OSUhsInZkmMzfnno+91157rfji5be+8jQ0DuijkFKwuEEQnYUBAsXBHYNI3BdRLLxeLbEFlieos+3SCwPnkApdKtqrwPff27AoT1FR3mVAKp4e8YtLEUJJ1hCoYUZmsce5wpQPrcX/U5dJa9mGwDQO+xFyvi7qyTBevE8+I4n9ha0PAYVf/o4KKuURKzqWaJOsCaEx89iIcmeIAi9uMuy/Tar5pqwg+ITZo2FhBdew+r6I7FUZyYyC4ERx8l/uMMHfl8kXAjHg32lYwVQsPmiTrjHAVOiy/79SrXjP1hAN401R0CzaECH9Wr7NQkCD0nYkicu2BBEAdAKUniojgEPM3ukZ31fxNS3HaImRIsCGBykCDF4qG/wWrXxvkyI15oKEp+orLXQ6L+JgMMLg310o6l2PSXY+ZiG6WCdIigiz0TEGT3bRbjbpSSJjkbMgyqgXnee+nSt54ZFgvoac2QCCetogK2MbGJs8FkyJc24DASvFLIoiai2VUq7kMK1gOk3pUCNhkvEcXazjxHEVyaNjbH53A8Nb++hkMeq23UHsUvhp8VtLM8/Xqvjoi0/RfvUsDuopZtU5VXAsnTkRq0wWo4mUB6ashzNRcanfPGKqVc4BgSjNMjrL6yxS/DtY+HOunIBRc62B9lob/XuPcHwwdtU2W0U2GQe4iirMOjMY7YyQTSdYrTfQajTImshqNNjba3t0yVKx0IyiF04I1J1iDkrRfu3QetAFdkcjHKZjnDl/ComqYYARvr52BT/c/glZI0dcT2hMUkoyUfaLUV9p0O5kdIwiy5GOj5BkGc41N9A6LJDfHWLr501kf0ywsg/UC8vViJiey4CMAsbaJTS91y7gvc8uYbIWIavbzK4gdXmpRMtD6PxhliCJfrg3yNng22VkOwmCFPL5LlyCELkKU73RQq/Xw05/G9v9XUouDa3jwiWL2hn0VUiVIcfekz6m4zG6p0+hubpOolqOSswCq1ahvFQ7V8H6ZiC3yLnNxF1TahKM0wKr6w1ELWAvA25uAVfv5Pjz8QyZHSwr+idBvdDbReEjKlxGJKVtwgMM2olGazqEenALh79exdG1b7Fy+BAnTIqqKZhlERMIYMdkajJMEuD1dy/i7Y8/xPREgknF6U5A2mSkyr3wWPpeLbdCmYWvzdOYQXBWGES1GLN8hqRWQ7fTRTQDhtt75Ahh0bRYR6go539u97XE5KjmOcajbezv7KC60sLaWgfttr03XIEp2VxBHfN5eUz5uucDAPJjT/mHqyjb906ntIfUzRStbITazl1UH/6G7V+uoPjrOjrpEM08JTX3iGz1NFfsXD+z1Y089+YFfPDlJ8i6KziKZ5gTrdmlpvbeR8J21L4aE/M5F8WLbDmJg3yALuc+984bnmdWoCpyVnd277Y9KtP5DM3VFnobL+DxvT6GOweurx8GtShiUcwYBTPO+lsD9P+5j+7GBrone2g0GjB67oXi8DQAIA/NIAadhS4F5/GVd5ej7s6L8japoCK4NP8s6ynPmHylyMkhilbQaHQwGQO3b93HN1d+xI3ftzCNrEgpnF2uCKvZRFrnlGh2X+nh/cuX0Hj5NGZ1W5EvSCODRC+LjABKB34JHTq0ZgzmvAkAfbFve8ZcFLo+3a/EndH2GpvNVbx09hw279zB8fCIGFcJC9MpFsgj9xvrOjMZYn93QOeKtalzSudgAVsfZ/3Pili8piCOletfePWzAIDye2a0UtzkBEMtyGkFPY9NgXuDPVz7exPf37yOB/MJDm2ff9li6AAiK2RrWsCZN87jnc8vASdXkcYG8ziHqdgA0ZALRDqfEZBdxmnanyGQ4oVyoIADl91ZoLkAYedVal3J2B3IuVy5impRJlCeRVxyIY2P4ogyLYkbV2Il1gOLcZfFNo45xZUAeHrz9KxSyVECWr5mJyt4sVYVAABS8ZUElzlHnkG83NIKlELN/nMFtH/lq+CimRDG3OJgRtV4YX7IfFjWNQvHLGRRLRX3NOuxSZJNwqSFLrUV5HXyFNvthRYU7sdXPBYu9zK+7z2oqBvZp0oBXLlvnvkh/0oc6dY/Q5L8nxbckn3YMYftfmHjPBH1E1DKgQFUHCbAxrG9hW2dps4lr8z/pNUjSOZlHF0M5/ISYRmROw9rI7hr8Y4JzjLQOcPImglzOzcMgQMIgP8AAAD//5xdTYscVRQ971V/Tvd0TyaTZJBkRElwJYggKLhwJXEjuFIEEVHEhS78B/4Wt1koqKAJIQshCw2EhCSKksT5yCQzyUxmpr/S1VX15N5376vXnRjFgmFmM9XV9b7uuffcc5JXP3vjKwhNwFcB5W/pV3CIqOoyrSpCuS57bQxnhBhoJ9Mnbhx/xNWGEhy6qR44ysBYSUIYa8KCKTeBaZcAjdsYPEomC1FVPM+8XZ8RjQNvHZKECWhmEgBxSwEPkhORPHmeQKeJFDsJTMbvRCeTkb68kOVSNwJdAGI/ouq6DFiF5mUjn01EB48V39WKqN/Pxndqo1hOHExtmgSGmVJoS/X8eOE5MxNEFaIH4coNwImVH0++iH6V2PJAUnq99sfrZyi9VCetk4yqFasN3SQ4qSLME6Ya5l6RutVuYTQahX4pGL84y8WQCY0rEUHGLCQO9DDXJILOqbhviACb92JF6POaOmRnRRJ0bs9svlb8wTO4qX/hcaAWEraSJMBmYCsNtJYOodFqYvCgj+F+H/mjlFXOjWIIoajSUGS9CUbrO5gvGugsdmCbNQ4aqEoMUUW1lFji8Y8cPFj4psqgP5H3Q9Y3pG6csFiRp3PzYS0kgdwVU/SwuJ0kfG9nBceJl3OlimajiaO1Lo7tV5Bf3cbtH66gf30PtSFQLywqlOSACuz5K7VA2q7g9Efv4cTrL+NR12JoB2y3V0ifpnUuotIZ/n+vC5KH+e/pVz4BUJEeLRUBNZFdjpEeP/UFIDo5zWdSwrbNAt2lDlrtDjbW7mDMwk1ebM7XcoXmSvT7AhhtHaC/uYumrTHgIatCBuZJLbTV0OenJIiHQp6z4GiP5tw4N6zlUCOFbQoqEovNnW2s7mxgzd3D+RsX8OPls7gzuc+AnGitdq7BwZR3a/EDRrR/GlsaS1Knbc3No12vo1uzWLJVzD/MsXdpHVsXbqN/pY9mn8A/edInnoJvPHQOSeDFTNwAACAASURBVKAa0F45jLe/+AT2+CLGtQKuQgkAqjIXIbg3UYKliCiXZUwvwZsEYYEZpjKihZuSlyhtVI0wn6wILaXoLHSxvHwcqxt3sb+3z4ku1bsm4MHVckt2hBnqxQiD+5sY3t3GkfY8LNnAkfODzb2wVS5ngDPTaNF5CqqniDsB7g4YjLDbG2KtZ/Dn/hwubwA//7aH1YcZxlkFLqcgpBrul8hvlmET33e2UBOQUq8AnUqK+mAd2a2L6F38FsNfv8dcto1DNkWD9nP4FozcFkxZJuvGrAmsvHICpz99H9nSHHomRUpgNpF2mCgBMF25fzwBMH399wQAATxyn+H+VfKkb7aw8uwKJ+t37+xicjBCDYnY0RXCYjBc/UvTPno7m0gfrMMMDrhdot7qoqD2CFsJRYXZR3462IHoE5VF2H8sgOqNqSpvnUfwxqFWdeiYEWsutLauILv0DTbPfo1s7RoWigHqxcR7vEvuWwrU3IY1qQInXjuFd778GP1uFYMGUc8zOJprbPXnmL3E61tcSYzoxITChwhbqQ+5iYJ31qNRFh5sEAwr2JXJ+PVK+yAlSi2xBEboTx7h+ZOn0G4sYX11i9sBqrlh61l2ZYFPrNG9R3mO3Z0xrl69wcnZ5cOLqDcp3vAONSFPpop0UesVP4fROUMOPhN2LmGffhGKUyDPrQWFVytXYBhJ1YX176VPiFFDIITAbxfONXHz5hbO/fQLzpw5hz/WhmwpN3HeprUwQQ+dY1cSjV14bhFvfvgujrx4EnuNFD03QE6ME0p2E6vMiVp7ImvdRWrt9vECR7Sl/TsZha3IfOGMzlJyLKAzZq7TwdFjy9i5t43+wwO4Sc7tghr70itmi0Cb4G7aw1+bm6g0G6wH0K42eR/1oHSatv3kh4iu2eX/PxIAgYlCsXGNGBY5tscjXH9wD99du4Tzt37HFgoG/6HdUN4arRU6vxZeegZvff4B2i+sYNeNkZIeg80xTofe0rPiQhHsaQkAZvBEulcmjk2sd9BQ9jDT9CP/9URAmYKxwAKN8IkyPoPAXKQJxt+o0IKePzOpLVULqawLJgU4/fEgtaziE4vDChNRY3WjrllGYxR/FU8A+sb8cwJAcVupGaLigDKOUVtDKHIaheWCNSLbQE9fz8WVJQn2sOF9zUwvTWJQMU974Z2KZcr+O8l8rE9jU7Y8REkAdR2LRLVjfETOQWz5aJNQNCxnm9+qNDmj9w3rOEp2aOE25MZU3y76LI8xqKDsBXG1fSQUpKXVuNwTS6FjTQBQUlXnrrKUYzwbkkkyT3zLqK/w00NqKzSx7oMGgLSAMlrX8eA9xL9LZY7M7gc2sfibr2vpbaOKwt+Mx2N7bMdpmrQFWhBRJR7isQIJCVix4LlDCAQSqyIW/Ah+UxELFoiqrVReKl0ApZRC2iRtHrZjJ47j8TwuOueec30dVbUUtVEl1565c+853/ed76u88sWbX2tUnmvyjciZBAAIHeIEHgFQdN6IIoAaLytfiK1sWApBvYHuhioA4DH9gcdwQxlVb2Gqz4MuEh+M8B9WzUjU3zluguPUqi52AW6mvDLbyBDO3SwbdVR1aE7hUgMiQeQ9TwSJwYhrsef7ZuYf3sAvKmfSc98ozklXdGMrbONO31cPIn3YA5EO+UZrxplhKEJoY3v4u8rMTShGG0epOk/OZnh8ZNB4ZiA25rBw8kONOJktVBuHp7IUJy0JZNOlGA0yRpEsVJ2X1/toTS6sVIj+nZpGTn6Q9ciunLTQq5E7GH2QSRf2HAIm0rBczQ8FRbOmlFapoTIfyuYkeZjO+PB6qUTM/ivCy1m+vkTzGACgG4FFbzM3Ewao6Z5IbXSDzO2IQiRmMWR8xIZ8jRqWV5bRjBMM9/ro93pcX8XznntcaJKtWHBQoLu5jcFwwCBUq55ws2fZpMA6hUsFXXpLUA8iKkJykRwWhVUAVKQItmiPNHbiuqzrSwEcu2aowZFIPWq2ixALITX+i1iYxqhtZehe+QfrP/yOYCNFK60gDsndPmS5e24KJ/2fEtscA69/9DZeeOcNjDoBDqsZssoUJRXRonVhjloQ0VgUR6UHVJZSELBSwZdqScSLGoAaz7vDxhpZNoi+9nh6iDAJUGsmOHXmcbRaHWxtbmE0HBI5IdGAspXS+5OzKhGJh0fYubsJk+boNBK06y0u6mpRjaM6ee2b3LJ0iuLy5zKYkryT121mG6paFQfpIdZ2N/DrX9dx68FtjMIxiiSAqVWYcR1NJ6jWmywjphgdN65BzKIJ0I6bWDA1JEclmgcFsD5E/6d/8eDqGsydDIt0P3KDmE33JMKVClaeuy2RVg3q55bw/oVP0Xl5FSNqaKIchmTzUSmS52LuUJkdsPNAqNubVLKme4g5RiX6ZLw2A2LAmZelA6g6KyexuHQCu9s72B8M6OOgRs96mTugKCLTtHKKMBtj0u1ia20N7XYbnXbCjTexUSztJ/jAaAOjYJv3YXg8wFhTMDrr4gaGhxNs9Ma425+gPwHP/E+OcmtqVsJ5aBgxkzOhAgA5M6Q0O14no77JLqLeHRz8cQnDX75DfvMKltIemkhRLw0cjxSKMp1ksDXg9EtP4IMLn6C+uoL9KEeKDNVm1QFgD1MA+ACAY5T1/HVGrY8GAOYajWD2/pQWQPtJ3Ijx5PlVlqj3un0GztgQkJzW2RPARs0RkNYg6nPYxd7GXYz3D5CEFSw2m6hXQ2mG7OiRZtBDpNnw3LmPv7SYnfvR3Vg/b6Bu2fR3zu7g0ZdmPkZ9bx2N7t+Y3ryK7rWLSG98j4XhBhaRgWw+KyaXswCijLPKpTwGzr/2LN776jOYM23shUc4CqYIqzYHn/m0oBSWMOdzIKrMYpp84mLGgKlQyN4kmn/WLOwolOZItmo14iPvjSyd8PWl68dKoTLA0+eeQdJoY2fzPhuTRjpHLfUURWclUZXjUNMJcPvWBvb2drCysowTnZMywmL3FvZ34OhB67sROpdYyNojttW+dy7gBNSwzp2fCkoH4upvRwjYq4P2CKrnaPXHCRpJB9mkgo31Hi5fuoFvLl7Cj9duoz+2JnIZx95aPww2l+PrUWBK/gNn23j38w/x1KsvYtQC9sp9NqaoyrhqyR4w0uBJJBiM30SG8wpJDwB4KKDmv/g6WfKEuQdHOJTsnXD6sdNoJ230tncx2N7n54TuK6mYCqkfiFmnkYB9ZFjbuYfRYISllWWESQ1BZEeB+Nxz0b3HX+YhP1pQlvPPs7K0wfzvCtOyFwM1WnTaViOMwxL3Bj38t9/D5Vt/4tvffsb14QD3Yb0MAikndLKKzhVSNpx8/hTe+vJjtJ47i0GYIo1yTIuU91gSD9LIFJ3naZ7y9XgUAEDnZ71ek5q85PpNxz2tBB8uwURHOJzkW8gAvQY2BS2fewbp/w89uTfMrO+g9VMTxbA29dqDcHKVmFkf94iab3Jn8+GWtIqculEJQa7VndR9djdV5VeUs7O2PAYGOY8tTQoojatntQaKxCdN1QWFxPXyuEQ25TEkBWM0bYy9GMx8/8UkrJgCVvTMLjKXHhMJuaqye0tSznou1xN4AABFScIDZFQBDQEzVEHOqk8hYZ1SQ1IPglAb6llvE0pEvPaTej/1GXdmsTL7r/dPk+oUOPKBWyJdNGmGkyBk5NEa3ts/OaHOSw1QtQHdBwZ9xWuNvbgIpBLTSX1kHbEtEb2qnqDvSsA7fX8L0tjoP12PTjnu9aNBEOB/AAAA//9UXTuPG1UU/u6dp+31htWSF0lAKKGIqKgokBAUKaABIWjSIIEEHfwyaKBAiZQiAvKQeCUEgsiLJEs2m7CbeG3H9njmovOdc8fewvJuM+OZ+zqP70ENgAhZiSIOcY/QjnBokZFMJE2xNeoKS8KjPJGmrSzF01dtJJqWFxWrN4uMVpsuTVhUiJuoWGmwD+WPRLG4RgOWJR/yVpxrCVZPiHk9bxPtOEDAXggqKQuRh+kUPiscaRgnTZOLWJVNzAM00M8xwncaEyhxxt+P4igxwIiuA7FyE99BXKSzakpBoMTssqgIy+62Xle6Kvpuk1ZYJMK4IpxFINxpnrdQl2A2EXGhR36KLtTYQXCElFVtAK9wGfG5FxhJm/O1xRhv8Pp0DyQxFgCWYfdoO7HCAzcXB/oo16obYHeMAhqqt+D2JPIRwgV7FiqemvAJizqZCmyw0FApZ8YbZ4jvdTpT/nGwDScWbhDaBISXr7UwoPF+MFcK7UDJNSV5IzdPEncTOFNurQWBVdPGwbEqL8JnytExkcFgG+tc/eg5X3z0BtX5LfxAKQS8cPQwipUST0ZCB9gBKco2zdlxckYJkM16Dow2x9i9s4n5zhQrPqewkBwk4vU8mc+QsQCTtH7bWhTQjjE36FDbgZnQrk858Sm8JZTeDgK6H/jE1ozDZDoj/w1UM/boIEW/TnFgvoLy7gSzn7bw79nr2LxwH9nTgGIW1L9dYPZhTvV7abjUBv2vVz3eOv0uXn3vTcwO5dgtpphl8gwjoxd5iiGp5eFetf/UUC21VWR9G2i6Bczc+MWyATNIqGOACoyrCWYSlGdapOQeED3kkwRHXn4RvbV1PN7ewfDBDpNNZ4F/JuJzTj3z05qYYIzvb2Nw4z7qrQHWyz67O5kEMlIYK3PayqXtASbIpaD2m7YPiS2g8EbZXkSN0WzI36YWiIJkyBBEP6UokRcluxSyT2Q+Z2et31lBLy+x2uTY/yxFvjHC+LcH2Dx3AzuXttDfcVitCnYCJRFNEk1yZSZUfo5JU9OXuvvSOt758mOsvXYCu0WFZ0mFeV5hLgUZV7NgklK5vWkVrz3RWDrXfRtkLvY7UZOvjP7D4qJXG0uBeipVR9dlveQso44OzpSOHb2hm6zG/mP7sbq2iu2tR9jd/A++0nsWSDguCVRUUz5ZqNCMt/H49p+oHt1HP21QioBatoImLeHygs4coorGpL2eaCc19VGQQL8kceBDtvKFNq+m9nOV30oqhZ/rxOik1GmQ6xV5gk4S0PEzFLsb6Gxcwc7FbzG5/B3c3as43AyxT2DyIVUdAbP6ymhrG5CUDs+/chSnPj+N3skjGGYzDOsxO9kU/2mqmKpoV9PvTS7leWISqYXZiHRqrJuwRNmDqsy71mda94IIM5QxoqgiqVi6IT6TDvlqgeeOH0S+3sXjB48w2h1iMlc90ab1u3YUa+yGCt1qjGbzNoZ/X0Mm1odVQ+vHms4NGZ1IiMAQuoZX3Zmo4s8ifOpoV+pax5KmTfQV8C7PV1n1dOFZJvSffq9EMhqiP9hC+c/vyP74HtNL32Jw8Rv4G79grRqhJ2cE3VlqXppibFFwS+ZxF3jjw7dx6rOPMDtQ4GE9QF2IIJ+q73MNeLQOGIHXUNRbbZ196oSYvVUwj3G5ONdSPFOXkHQUeKVHvGupfowfgloDy7kr3ynpbmOkRYajx4+h2+/i5s0bmO6OkdE61tFujcmCBJ+Gg5nUwM07T3D5whVMx9K56qPTW+FYiB4Hikw1okTdO56d1rjQhNQTSRSi9oUlkuqjnTCwZSOGSYrnpxJUQNlFJXQMEdDMehgMA+7c2sYP56/g66/O4eyZ63i49Yx0C8ZpTbQf1TNK3DF2JdDORUdmH059+gGOvn4Ss77DIIzheylCYv71iYoYRiPSEOU/EBaWvnE1LSmOUxA5ScwO285VAwzJWlUUp6NgcNs8a3T8ooMN7Tlzh0NHjqDsrWDw8BEGj6UIVpobk/m+210nALn0G5On+PX2X9gcbMNnHt00RcmmR6PxhBQz05zTv5rM9FldMOeZivPJR+pZq/Si+y2pomWXBWVHy2RdZ6K7IH9P6xoTFzB0DR5OR/j53i38eO82zly7ivMbd3GnaTC2NSHTV0Y+N4FfmQYyJusnD+L9Lz5BduIQnmYVQhkwng6QdRLknZRnSk318innhyYz3tZRYNNGkkLlrleWqLl2XPJMbX8bc+UiJXCpgOAjtSgmyzT/EaqrOmqxI++UHuPo2DM3mDnLHtTuQDAUMeNFJTAGm0ASL4r1uVBJo44J99cmtNd0llDxLoYciBDwqLelmmayR2SqocP/c3NVUk0NFuPE5cUKEOSNW360sLWOnvzOLM99GxvFRq6cu1GoXKwR03TJ7i5RxJJ8RHAxS9V5oRbBvbj4XPTIny+KwnY8Soe/boJ55JtLAYW+m9ZCPCxZfkcXgNq0xLyJrcOajTF/lN/JmF603SpF/VKDhMUFvSfnsbnmUBiasbcW/DqlQOmliKm6XJGSZb6rLeJbkfBRI0Dz0oVzRIOi06GYM9ElbMTo/RnbkS4vSBlFswj6kx19rm/NH5lLL33ToCsVBKHSRrUpq0VwTfvM1lt0jLLMKBJKg1ChRC3URBT2sq0/Q3/OVStihoD/AQAA//9cXctrXFUY/51zb+aVyavptKXd2CJUkCKIK0F0IS6kuLALEaSbLgX969yIUhcGqygu2kRtE2tCJk1jTDLpZF73ceR7nXuTQpi0lMnk3nPP+b7v9+IBwEwNHXx0MUdsqi9qoFJt9CpEVBaOONWK6YVtkNFt2+go+tDZJEemWDU0Qt+HblChrpJQHYqZfBj1u3LirBBe8QyQTcNoPzErs/bFpm1KuTcal0WJEPpm2aKs/XE1zapO5WW6l8RFwZ8nL8TgwhBS/SI9NL0vUYMKRaVt8+HfP3HRxd7rta6MAoOMuFH93lWMEWIBKjc6P3fz43temArT5A4al0GL1rIqbZroojHKXEWDqxlD2iDD9DSOC9O80sInFaMCupGVag5YsGlKK04OeXhEppL6GWPeqdGKL7iTRnpUjTJjhh58zVRTaRot8zIwFkc9DrCu6TK5QGU2UnlMED3bPqvFrMRppG3qvr5hpBG19CppsfiQVLNgbY0IWCXU0ODUUGjOoXf9CtrdDo6PDzE5OaW+gU1x2I+hkOx/ptJS40dFxwisQ+9v7bApVNM3kYYUrUabu1QaUgQd9JQq5TAWQLCsIy3u6b/JgEQONF4D2pSJCsGJ8RSxcvIUPbeA1byLxqlD8iLD6PEBDh49x8u1LWQ7Y8znQDP3rJe3KESvrsEz1UTO2sCH9z/BW3ffR3Gji0FjhrGfsmlWEfIoEbFnviyrhoa+l2GLj6/2p6zRVDmGRv0ejGGSBdH7Z4yESQNbBxD54PTihL9yrccMlfHJEKdHJ5y20LZ0CzK40kQOKniaxAYYFjh9cYz+9i58FjCfttBxDdGSTWdsDJNPMpaB0Pe8dxmSl7ioUadbQzRaaiA9JW/Qz0ylOOOGtXTodNpsqNjxDSwnbayihaVxgsb+CLONA+z+sIG9tWfwexMsTRJ0ZgkbSnFooUorGFl2Yh42BLD6+lV89tUDrL79OkbzAWM3RSDpgSuYqsnoueZgc03vfUQSOCVF3Xwv0uGcGmM6jRCDIgGMLJiBao0UQMVgkz1WiniQEzuBOrLCZehd6WF5ZREnh8cY/HuCBoV9q0yjRXtrEDSZ/ACahJJnE4yPXuKwv43ZcMAFG6G6Tbrm5BpeSrHDvxQPgLwg/4wsOqGKJ3pweegkUF+9sbACu1izxwCk6E/KCeayIRayARqDHeT9deRbv+Bw7RsUm7+jefgPrqcZOrMxGmUZvWmIzUNFUEYDPQdcffM13Pv6AVq3b+CsHTCkdICWZwlPUajBksaoMaX5gsTLDIboeSBkhl2I6zG6NUST90L2ZdHEFUVnMjWVLYzaqIRr3scSx/4EbqmJ5d4l9JZXcbj/EmMSbVszwM10woNMcjRoIUOXrs/4FIc7W9j/+y9MXg0wnwQsNoFOyLGUlOjQc1BwVINIT3jTLHhPDEFo9ZZaItyBwIoLZhOwn1yJpJyiRWh3PsJCdgp/sA2/+yem649w9ttDdvhPt59gcdDHZczQImdx5ojIQKmMxqnCWso7wEdf3MW7n3+M8aUm9sMQWJxDmZQKVFQoa15zD7diMlcNMT3/xJaTc7QWORdCbNJQo45CTetsp+Lnzydot5sCvBSSWEOnHpn5ZV7c2m/eusWpDZtPn2JGUVs0wOe0Gq+DZSf5/iqHoXLo8cYunmysY1oAC0sraLa78An9nJSvLxuWkcdJGSoj4ZgEY69eyY5pZGCR/C0nWJg4YWmbI/1y10buOjg4GuHp5gus/biO7779GQ+/f4z+/iQil7Qnl4jzQnH79wFnrmSK+cKtLu59eR833nkDYbWNSVJw5B/tX0GbgqBAkhX0FudlLMLot1BD+i32S1iCGhPsvOZ9V3HBJh9wtfOIzjF6jui5pOaddgeKwexdvYbe6mX0d/cwHo50vYquRMYnHrkT13xKOBijxN6rI2xub2E6pcF1A2m3i5yMXwv1mKFzhQZWiSSkwMybjT0T63svhrgmYS0FpGEMnuqMuRYPhM9Q4iif4tnRPv74bw8/bW7g0fNn+LW/je3ZhIcTvL+wcZ5In0hGQj6ShPqP54Db793BB/c/xcqdmxgtNhA6xDabIdEoIGqkbB8Tkz5JcpL6Mue9JmNDTPCrgSuVdKZkT65Ck5+gMhChcoeouTbE1Ws0H7MDaizWiwi61ZBGFTdDbqlHavRKJ6adJkmt3qdGkz+X6V+xSEr1JrA6tJIhG2uhjGaHiZrtZdms6qWMtauNdLXfV70Yo+x1ebJT9k2oRexZBN05WUHgnzsXae/VeY7acL/OlOHeI5FGns0V1d8rVwmBU5+zyKTywlAWUK+hzMjK7LzeA9D9oj5tfr4TvdjqtUdZY7MlEc92565LqakGgk1qzJ+CjwLaGmNDo9T1+kntKfdDzkJZF6brNwaa/RuzQVRuQn83GUQ0JaT1pp/NWPjmkWbMHi2J4nW2+yeDn8qkXtZX1XfZmjZEmuX1eu7zOkoT/A8AAP//XF1baxxlGH5mZndnD0lrmxMxtUj1onhEL0QFvRC8qF5VKHglCiLolf4D/5J421oPFNSmBwSNqTTbtEm2TZrdzWY3e5qZT97TN5MsLIWUNjPfzPd+7/O+z/s80bvffPA9Bz0COCpiVqTWn2QVFV9OoTRMlJqT+7kbbc0VxJ8seJ6cSUkLooFhYfPZv6myVUKKuBJ7SjgrzCsIpwTaVOhF5E82Cr0gbIemAaH4NcXMMnfN7aWVBTPBwLzwkW/UY5tVAXDZ7HmCfL69+ElosFfvZTKd5ur9ng3hvKqo0ZNzWolj2qtZCMqsc1F8w2lKEnj6krEOfIAp1AtMJT/w82Ny3TZvYr6ULG6hgSbzdKnAz6CEOqMiYD9UUKcuD7qeXryv+E4ozcYplUscIwrUR61IG/3fnUhGfddeNxjTYHSWEtpdYsANCRLFcRK7Jm+f4Wf+E7233I+0qDsBPwMmfx96oQ59JwoMFOuaoXBPNmvkshx4WiCWBJ+AoxU+Mk6usyjAM8tnsXhuBQedLrrtNrIRNRQzlHXC0TpyZShbY+qQDoDOdgc7a49Q6qSojUooZTIPWY2qDBoJSBAJ3TEVXUQPA61Wi0iOEXOko0IUuAhlFluj31WLqqi7Mk6XG5gdVzC7GyK710fn5mN0/mihfWsLw40egkOxMCSWggf/2mVJVKgO1QjZqRAff/kpLlx6G5PlGfRLUwzcCCmBzEiFg9T2RiiaqouhyZsViZx2bYqMRqcJtD4MmKIqB0YWTHQ+kAYmElNQoXfMjpjK8yk5PPvcOSwsLaDdOcDhbhflpCIKAlqQMV6UEWfouYwOpuht7aNzfxvuYISGi1DJQtQqVQZXUpQIxDOdKv7KVhASg1TLyS6GQH+13kCtXmcRqVq9gZl6g9/9BVKJjiuYD2Kc7juUmgfo33qI7m9NbF37F2mzj0rPoZ6Sxz/RdjNEQarFJ2hHgZ3xMI6B5deex5XvvsL86y9gWElxlA25k8TdxiAtxB1JnuCk4u7ZVioWaXvUj8ToPJwXCeVZNlkDlwnzxovvMIwXypqM/chhJmNR6vCSUYdrisWVRcwtL+PpbhujvT5iKm6UtEOqsSvyxdopwmSEZNDG4Mkmpq0HiHp7qEwHQrfneEYjYDEcMS1g4m2qck4ZbaRfTZ4jTRj48K6Whf5YChl4xbRfsgT10T5me49Qf3wX6dp19H7/AUd3riN+sonZwT5OZRPUKfFVRoEUn4WVRoUq6qy98uEbeP+rK0jOn8ZRTCyNCdNOyPKPEl1WbQ+cyq7lYpnFxMdsk3jOnDtLiS+a5rsm/9C+S/TMEIFWYUvRn9GxeAFPEZ9yZyVBo17D/NI8FpcW0Gt30NnrcocyciW1Ow1Ub0JIxhGxIoIRouE+ktY6hht/IWw1Ue/sYW6SIB4lqGbEnikxE4SKI7WwxDoEZLPm+NmY44kUT2psQRfwutayCRajFI3DXYTb9xA1byNZ/RFj9vW/yu4Lp/q7aCSHqGsRqYRQrVxlXehXUFOKTtp4IcLlbz/HxUvvYHQ2xta4i3EVcOWQQQwzyTyLLfXvfnH0wvaHdcEMeFryG5nFZ+Hsgi9+ZgwmgwCeHWm6OcbKo9Yr5UIxaedMhhhOxnjx4kXMzJ3B2vo9BEcpytOAGSdlkTbVEoCcGwQ8qfvc7qW4c/chfrm+ilari2RCrJSYrQ9Ys4HHPwN2BLDCH+95Kp84yi+khEKz/GKJGnH3tFSuA0EV/UGG/XaCtfUd3Fr9Dz9dvY2r1+7gxo01tFp9jJNCYdYYqZrcEzBOI3LAcOiTDsOb53H568+w8PIFDMoJeukIpLzCEd9a9dD45ydK8iaIFDArXpTNBJSNRUrgP1Zmnamkp2meF1uuafZbqYKNSP8PyaFCjCZjjNIxsjjAmZUlzK0sYrP5AIedA0Q0msUnbyhOGvTuORE4pasgvtEhHP7p7mJ18z42dvcwJUYnhBHK+bzRqpMEE3WNKLOzieV+qh0Dbf5AfkaFHLrHo/EUB8MJHuw9xd9PdvDndhM/b6zh1+Y6bj5tYWc8ZOAvg7QSt2t0jmVOz/uA8uypsgAAIABJREFUxxeGDeClj97Ce198gplXz+Mxhjgk1hL7zSbKWnIam1Jv+SbrO/G0fAPqphEldHIpPMu+0uKiuhqF+rNIQV1JnZGOUfKdYAovyB0cLwCkigeseSTdcWk6yDUcp/In07wZZsWWk+D/+CfXzLF5cJv5NkAXaoPTaOLWSBWsIk5flCPQF9qM5HjCMUCK5/TuEf4oOgXI/sy8MJ9R0E+CTQH/ZX/eE6ai64u5i14E/bl9to3hMi5TMTxxONDOswpuGuOcsSAxOEjkTsE/xy8DwNr9n5lpeLa5gWRowYGxipMmtQH5QPP+VBnC/rmaGCHFL73n4niJPTOK416v4cR4Be95ZmsJrrXYLAzf3PGt2OA2bGnFAsNg1tyi9TU9NLooEoQuPg8brZB1pHEtETP3hWF1MeMxBW2e2/pZnPI4LgjxP1vX0hs3FYU/vz2emebRpknblDYEtV0glUWLVAlRFhWgSiBYIbFg37/AH2HJD2CD6IoVSBSpUAQKj1Z90CiJ0qQlVZJ5+XVto3POvbYnkM1EMxrPjH197nl8D+vWz59XpgFgOFDG9ocPYpVTP/zoI9tyaX9GxdYxXr2YYJJo/X7viEuALHxjc2fXk72qlUBqyeyG16DtOygZoY2tE3aFy1U0KvBSyOrJbGtibqa7bT9OW3Py6P2moG0K8IJhl4ZbYrzg21wh4s4a/0nz+4qWQib7VOuFYJwT2gqaLGKh+fKObbgljv7sglWr2VpLd/aK1qKnG5uSxE7U0UJMpmNt1+fZqZXam4SDNwHN/U6V4uPTMU3TpP0d2KrItlp8aY3UoGRFKaR5UVt7QdMg2humVU0LGNIaMfoMjLZwRS9AeDNqKgjXwhuaq2NoAEYTwCjZt29KvmlVwVBjOr5Jnui97ePUNJDaxq6svUiNFRZ3T+3GsswgDNr/s5BSOZ00t/9oukywtFw1eguePlfSEDJiNS7DtFzyJlcWIzWiLMCLtU38dvsOtn5ag/0yRUSvKbtO0lwDf7MkWTugSSFtuhRUSO9s2cPsyiJOrCwBfRd5WKEIbFRBJSJ1LgVtX18fg8JxudCmax7QpKcSbTGis/oKyAYjpOMYw609HP71AsV2inKfChgfTlqxSJbryDSe4HV2S4SAJtwDWg+Bhe6pedz49EOsvvUG4sUA+1aCzM6RVTL9dxiKL7AwE/wYqq7vH7FZlA0wjscssPKfgK0nBAWajjq9L8kz3Yxxm+N7GplRB82SbYSSSQzfi9Bz+wgnAXbvreP+7btY/+F3+EnB58RjPRGWbZKkFFIkFMTNssFWVEUfUMcD9M8voPvqEtyFLrz5LjIqxgkhTuwjmgxZJRSJU9FUhO2w5N7vRr3aqo2uEaGZy0zByQtY4xTDjT2MHu/i8OEu1HYObwh0EgsdtmFTfC48TSOxW6JeNPnPyH4xAC6/dw3XP/kAwbkTOLBSKK9ASgmaU/F0JiljoU2xvZ00diTZEbVgShxFjVk2oTSN66LH6HKEnQ7HAY6ZjsW2nia+Gq5eZZn9QXfadUFk0Ep03QgCmqQj9Jw+OmkPk4cHuPvlt9i89yescYZjxN1TFtxSBDRLnsq5GKkcxEzP7Q6GpY9iZgnZ3Ck4r1yEe+YinPkldOYWUfgB3F4EZYvvOFlcgaa0TG2TtcJTbOPkQo2oPKNNkafSHj0/SmHF+1D7T2HtrWPw6B7K3b9hHTxHr8oQwmY7SZdsDtFw/rmo0crmzjEXV96/jss330Zy9hjiyMYgHqLXDxEn++hEQY2Ss6cSPEG4mIalvFbWRSadwziZiJ2UYxKY1vSZm2OtaZhGDkhDTmCXdSy1hTscJxlcQplR3EwL+JmFk1UfB3/s4Ndv7uDxj2vopS56mcyGaUZN69ypZD1QYUPrfagqKH8G+1kIa+YMqpll2Avn4Z46D2/5LKLTi1BuCD+cY6HNNLCRccXuc0yWeFWyrSqyMcrJAHY8wISoBs+eYLLxCNh9AnuwhW42RlgohOwsXzFaRJdDurWhBGYO5pew4nz/TISPbn2Gk1cv4YWTI/YrWH0fh9kQjmcjpJg0HiP03Lr4N+K9MliRJD8vZf/M9SDFUOlqm6eq0Rwy6DvoaXKuRADL+KQD09M4unYUf4keSJD9LFOwchez3gyOO/PYuPsA333xFQ7vb6KbARGMXSM4hjPSJiS6Vy42fpaNmPIHpvYBi4vAm1dfx4UL57C6ukKGNohCoh5UCFxji+VqGLLEfqVzLZnGAi/3hhgOUqxv7ODp+jaerj/D5vaAnVNInDCjPZELYcXOHpXWwygsjcbQ9wop/U88ccW4cvMdzK6exshRUD7ZL1ai1Ei6JnkiUDZoeK0eQlVWQ5Vsr/UkmfDU3qBn2rmZFCiNojtPWV1xMJJBlMMxkuIbdH5o7pdu1MUknghcn6hYZYAFzGL7zgP88vX32Fl7gs64Qp9oGq26sRJfFNlbdHlEu3eXbB0BzMPDa71FXFpewdLMDOb6ETp+wHRPsaMpWSvF02jRnL6PRp7xecwzjJIYB8MBRkmKrd2X2BkN8DwbYbs4wD/EzdefrXvHCG0PvqWHS/q1Qu8pzlKAax/fwIV3ryFb6CHuOYzGKHKy4iOqW8qNS+PK1M49fd+tUTPtxpetfff5eYaKN85ENtoFOSEFktoXnRoFrt3kb+x81EL+thHPZoBF+5dBP7EFIOyany2f0Qz0GOmaN9bVpoYw66qqjg7wGsX8Gt2qi3zUuWyladbaOrhVW0muootOfU9Rbm1+iwhpN8LdU0i8WoOt0ohpV6bz9vTAK8sT/nzTpKDjZxqFwZP4PKuP+X9idpbVeOMbFIJQzsWWnRtkWtfL6CCIm1xZ2wZKU01+s6kduDGRZ/w86xjo4yktOFjnEUVeT95N48Q8Rp0IcUaoP73GWmL0Jr8nKopQgqlu0AiuVn3CzS+qA3Q9YpovZpJv/jfNxKN/phlCjSMzxDaNCIobdH9yvGeF/6Y2NWvH1LdNjULnQmumWU3skYaLsOCkfnPgOi7+BQAA//9cXVuLHFUQ/vrec9/JbrIRTYwvwSjBhwQMGOODvsT44oOIP8Kf4P8R8VE0KigqokENIt6IETQSsmz2NjszPX1vqTpVp3t2ICSZZedyuk+dr6q++j7n3bvvNV3Kim6ASitcTr12wV1RVvfEUo+n/HVzdpJEDYhRFPCHMCJsgTkMm66fqJlTZEqCJGi6cPwczIfVBe7eyAzg/chWvS19glV2RaSvgaXGV7KYtCHN+7kSyE21KE1XRlFSOt+GfuPaf2vhwOnSyLG+obVTogHf8wLLKlBf+UY26oqBb3sx9cZkQUMpCNRwbeGhUvE4KdaYkYN1G7+2QGM+N60fbSxN8o0Pp2+DUS6VNrW1ANRWpUKfgHpV2OBWiq0eJ8mBmU0q63ZT6wiABiQOJJ2AzPP18h6c/NMG8CQRl8/UZYTYJN1TwaN6zdtSnzv5KCWRZ8X7zn3jdW01lJWyJmDWKrdCfEs9+J2ftwJnPGdEhYawZwMYi3LItbWBXgo+quoMdQJQkUDPiBYRaGUKeRCzHRa91yAcol/2MPvnMe5/8xPufvwV0nszbJhRWO5s+ZI0uI3p+5UeeH6b7NtIiIeUqSkBdWPAGzmYnj8NdxohPj1GMIkRjvokPW/oQZ4ZVaFrRz62pKrUb2Lk8xWS/SMUswVWOwdYHcywfFzAJz/mjCj+pkBAc7KBBc66vuYhfVQG1mRfduHlK3jh5g08de1ZzKMSKc37E2DzShSkIO3rDKSPisRN5IAwRfv1oKfxyRQfYfcJH9pMHzTXhNdfnSAEiPL8m/qcc3Lp2MOGXr8X9w3FmIEbUcoDRKmP+mGCX2//gJ8//BKjFY1gV2iKshUHFKBKtwEBq1KsnRY0YhHTHwdF38Hg3AZ6myOc2t7EcDoyc/6hywibtADcUZ/BFEONyuHZ/nKVIVssUSUJkp1dHP63i8O/j+AvAH8JxCIGH/EMpum2GrEzZkxzk5TeIq/MdcmoKHB+jOtvv4HLt65jHtVI/Rq5zF0T5KTklpwYOI6SEFqoXUof6SoVe8uGaXn0f4q9/HzUimKe3Ne8xk1tR44UYCuw0GKdpRUDHQqla/RSSPyLYnkVY1qPkd4/xN2PvsXvn9+Bf1QjKhwM/QhOkXCCUjYl4+CicpGRloXrI3MIlPqo+hNkTgxn4ywmZ55GsHUOwdln0PQnCAZjOKTHEvaQuSEKEWHrRR6adIlqNYeTpRiRdstyhmx+BHc5Q/roX6R7D5DsPYCXzRDlCyP+x3PlNdviuaIqH0hSUzbmXjmuge2LE7z05k1cvHEVydDDIm6Q+7WcOyXycsFAGTDroADJxkfnhGNH57wyALWwdE35DatET2dAFPX4dSkuFDKGhw6d3Z7HPIvvc4fZJBS1sc70fYRFiDAN4e0W+PH9L/DnZ3cQHRYYUgHTCYRpo+DKJA+VWC7mjoccPjI3QuqFWBHtfDRGOJnCG0zRn54H+pvwJkM4gz78aMAF1GZFQnsZstkO8vke8r2HqGa7aI734eUJ/yyqcwycgp0W2KlAaP5cJHGghH8DFiWGJTHw/GuX8eI7txBdMAKMJNCWezWcyGg2UFGLuPMsnGU9oQ0mKLXgzpbFhWFhea33uOlyulitDHCLw9bj3Dl59tXtGKRiBKXHGupvAKcxe6eQghJxxpzSxTiYYFL1kfy1j+8/+BS/3f4a47RhNgCxKjwmvZAAXcn7rJBYwS40orivu5hSsRExh7YHOPfkNrY2Jzi9OcWw30NEgrutpizm8zlmsxl29/dwPEuw8+gAi3mJ+aoVi2tc1YPy4NaG4eZTL1lEa7nzT+Bc5t6rGAjP9XDl5iu49Oo1FJMY5SBE6VIBNTcODI25nnRtyjJDwALAGdzAQ5KmrGtB54diGXokyRK9Xmz3jjYbmqZpMabfdtgsptAGAjcrAmFXFrbY3LWFZvwjjgzEKBuWAxzce4Q/PrmDB9/9gnpnjiFJLsBF5BpdkLyiAmbFDkNiLmrPnUbOXMeUXjCBi81wiO1TWzg1nmBruIFRGPOZQMUNuieWWYrj1ZJFZY+SBQ6SOY7TJXHfcIyau/gqHa3RQ9+PdVZE7Jtt96QgQ7jjzHObuPLW63ji6iXUW30cO3TO16znwXuNBKBpXIj1LCrbHNLcAZpkkqaSJvwn8DfqViyPu8ZSYLPOUnXJiSJEOV1HCGznWG5izX2s/bUyQKq8g5ebdVV6xpVGbC2T/R4HiqEr4w7me2sjpWbExLByTjqmmcJGaRNCTuQkIil7uJvM80huab5PIM0L1Z1SPE5aKl2ff72/bce/LsXCzmi5KT0cUOvucq3hohhZz+AKLa61Z/paQ67FV91xctdtm4S0Flpko+vjS/6n+Zgm99qY0zjI5764O+maW8FBscgM5e+6OwvfefCAHt1D8h30eukaUIHEOK6ZM09xJTebgwBZbrC/3m/kUGbvp44YPeXAui702iRGzHFdxCr5Hq/M2aCMcI7jtKukeEz5s+4B/o5BwMU9ek9bnMlaRp8KAHKjXOxDS1JM1WYAgP8BAAD//3RdS48UVRg9devR1d0MM6IyEmMMCYqBjQbQoMENJC6Mbv2V7nwkJhKMCdEoYiLEhQtAIw5IRoHpR73uNd+r6lYPVjIJ00wq1bfu4/vOOd/5egWAtU7r9MsZKsTBX9x2L3Kx5EW4IRlM3NByQQbVj36XpF0MEUSGIy8uTc34wfUHGn1+dH4E5lEgjFI1eh5GmCLkxpJn+8xFE5Il4oWYhyS62GxS2YS0CbhaLXlREMAQqxYOTfTw7P/rJzrSkcujLUJzMJU6zeHiOhluU5cLIpceLivowYc07Rkd+w7YCAyc9hmlCUios41lp3X5dICx4YiCAOL0n/bvRFw2xzVNQY2LYGivqjOsjtFk/pvjj0gFII7+HVw+tFmJ/85KBJ45plEgtPk3xoxAAZj/u4/dg2vpFQjqVOLqowSQGf4NgCUGKkwBYABADIDQvep28EzwETJqrFmn7t5OqQ36N21ilIyGJqBI55gR//H3Uzz65S5ufPo1/vzpDteZk6Q7byXxLtR3hVIJCl4r7SPcesfu3CR/7HKAzOD9FPAzSUQnzxVIipTfm6lroHW+VKRf7S/hyBZj3cCtPSY1ULZieJd6dZLVQMCS/biSmOuqKPBxwMq32Nk9jjcvX8LJ98+jPHUcj2cNJ//M0KYd9wJuXc0HE+0HZV6OAADnxvuNjzZ3Ww/WWpLXnf55qqw0V2X7IXlhpsYO7aYZHcqeA5CSUdbQ1cy7NFQKEXLM/QzuwRp/XLuNm198i/3f95CsgJkCISlGuZamEtKyq9VaSWJCniTyHtISSCZAPivYpZpZ1EkGPy3FsIrmGLUKXK7Rriusnx7ALwKSBTBrgGlt7fzALIUtEam3pqRfJMLBAnhNtHxZ4Ox753Dxkw8xP7WL/UnFyT+1nCMghh3Mfdcz3DxOBMQV4p1AHQyCMl+0pq2dz4pUE2QolA+u/7Fb8TAwXc/6xCwClaoIOyB7ixHRA7OiPcYTtfAKDpNQoFjmcPsN/vrhN/z81Xe4f+seskWNLXqXnUi4GSzrKMFMuHUmjUOTCEizIrlyTqqMGbrZC+i2doHZDooj28BsjsmxF9EmGQMA9EwZjVFTIVkfICG1w/Ix/BMCAP4BFlQK8wiTboEybZBTsEWGh1K0pQVPJjXXvTSVtdvOgdMXzuLiR1dw/MxJrLYydsym9pKSXDPch0BdBVIbyjELLOMz7F+bAIB8OCiunHbRCGFoR8fdMRTU7IGyqEbdK3vINeeQs8Nry1Jw4Oq5YLtIZjiGbUz3atz68jpufvYN6r0FysYxw5l6P9pDSDTUelXSKDDSKJBGPhisrElKLP1R1PkcYZJrK79CstOGXdAAv0IS1phT7X9Xo0DNDD+X/GkxFRlZcmlV0B796Ib2dUH8V2jktk4cwdsfX8Ebly/An3weD8MSy1ChTTp+NppYtNdRtjxVOX+rclBTVoTIx4YTyWCqs6hskYN9OR9LLYvhYDhiFg9LSyVmMrZLgtSUARZm3p38kJ9EW7VIQwG3DjhRvITu/lPcufYjbnx+DQd39zBpMqQNmWRmDHzKBhrUuMs6Djh+P2xOhcGwLt72pmpYu3mFiL12UcJqCYK3jStIGmuKBErk6SzjJDOTtrHFUYfXL5zBWx+8i+3TL2O9lWFB+xftPdMJltUBg2WseCLdjhPWOy1SVhUZsz8ppn0SZ2MqceLw8CHyI+oBGXvmiN21AN6IBlo7Bor2YI21GE5DP6YUS2R+glldIntQ48712/j16vdY3XuI5tEKO0Qo1Z5BgFYVe/BS/tNpMtOqFF9k+V6NUGWcc1ULkOoo4z4Rnawr/altD8JgzqvW1b0Skrv9BHN26MSmVM8VnwH/dsD2KwXOX34Hr106B7y6i3qnxIL2rTxhwoMk/66pxDSODFNVQRyfCwMzPia4oMo8p0QUxQYWU/O71A5TQ6I6Jg2HhF/VstF9LSY0n6AQKZT7mK1XU4kSqlqPFa1lXozUq6bIjWNnI/f6GHLje8eMPIF4nXaYojLo1vrGazxppUYUG1kJXXylLh+VzfUq1J5kXUuLPlXIQvOH4X2MFZebV6f18FYWfPhyvfdZGpVIx2upH/+N/MVUA/Flqhsa60LLEmKCl4A2UWxI2RopTWy8YvDCrnVDoAHNHXlOK5sx8Ibev92/fy6NZfieBLJG78/AWrtsPzYFpCkzTP0wkFcZl1ZY1wCbc3y2Rr9zbkAlOk0tSmIlYOmZ6JlNEduXktg64hxPVcbahaGqKvwHAAD//3xdW4scRRg91deZ3VnXfUgMGvMQTFYS2QQMLohCMIL6c/VRBGERXCIqMSQGLxvRjS/mYrIyl+6uavlu1TWzo/My7JLtdFdVV33f+c53zikAwCrirfqm06abBsgsApg8TIbBWsAWji0UZhbAM0IGTW6Z7q4DLZVTp5XxLCI4IlQkzABWV1d/fRogezjEHu2BgmGD9H8AgC0oQxoNTTFkzlC68XhDhfWEomITvvpxCWUSK8GXUWPtZTVrQVsY8tynXxlD4wq2TDqdvNrLzH1OrsdUUSep2PslAIAZAEkS2mmSanR4niGtvNFzmuATzbXQjQfkm+6LFp6NA6+ZqsZ0Ol2ivFjSzTTgUzYzwoSwtVZU+VKCnid0qbBmk1g3zuvGx65l62FdqwDPA1WY2ia2gJhFoF3HrcEgUtoWKa8bA4BpPOVgl2LUqZbbLgr1TpWAg/uduIdMhe2c0MWDinUYoEIIbEU2cj5DPgVmvz3Fr1/fxS8H3+LZT08w8ZT8OWxQv6H2CoqtHokG0TUyFukim7C5tsK3bqCoE00vuMHWmWNo/blnQUFp1augh7+XgEKE1cwvFpEnYVMplRoJdP/xHjuvncG5vcu4dHMfr1x5A8WZbcxrjxNM0RYd+7fTHRHFnKjw0mItN2eJ+X8BAHaAShDWLR2ueWLzyddIKgCRJmh0dN3n4rXpkXMNtJWKlrG4HTAqN5HPgJ1+gj/u/Iw7n3+Fo9v30Rx3TKfdchJoObVL7LV3kxReqUd61ns0VEEalWhdP7RKFTKGjQbXKjIcjQyirZIOMgXYtdI/zaKQ/22smiuy3UtiNqNWmxLoRsDr1y/h+kcf4up77wCTCn/7E7ZkIu9yn1Plv+VvStLzMOylTMenXkDvI9pMa39dEMw2W66PLVkW+DrrZ+wH+mQaKDEAQHov7Nctqt3QoNfA2vRd55o4MVwXHeq+wE4mzJm7X9zG74f3MTt6jPEMLJpJyV4RJLGlENb6g1tO+gos+hxNqFCPJpjTmcEiXIEFu8iuk0E7nQVWHKEkiZKFrsWIqqwkkhfkuXnsSfwUonqfBREhC0oyLzgoafg3nYrKnb1yAdc+fh9v3dxHWzs0lcczP4UjS7e+ixRmoX9K4o0IWA5rd+mTpYF0QiFd0rcZWvbiXhrcqcQHCrZRIkV6JezYEOTMLkrVNHFyNudljbbpWPCtdAUm3RjjWY7j749w+9MDPL/3CMXTBhshQ00i/SEqFyhoZt9Bdginfu8MElTw2RgLmp/Q8lnmsuEZpc2l4GsShVyo/V3soxaB25zngL396ZxQcblOq9D0aNUOcPnda7jxyS1s717A81HANO8xz1t2X6BNV1o2Qqy+jQuJY0gR3JiO0T5MRbboTJguhGLeJS1iZh/Fv+vFTmo0GqsWkIuBsVX949yblpDp43BlVJITr/ae/K4uGmbDtDOPoq+x7bbwUlfhyYNjfPfZAR4e/oj5Xycoux5bEFaVUOZFiporZlp3dgqgc4AbxFN/oToeFYDVlMCt+c711EqZY8t/oQUkCvxJhJTMZyrg1b2LePODfZx/exfjsxus8k/g5ZztXEvkld47BfFM3+7F6YSsQasSTWiYfr85puRfK8wUUFfVEMeEoe0irUxb/GTvVZwPv9JCo8kCxdQEAhiIY0Az2/E6AfV4lGct6kCCsVvYbGs8fvAn7n35DR4e/oDm0QvsdOS4U6Ikl5BehC0JLO/UlnGQONTRcybsra202kZhoIuBMDyTzKrwS+C9Vxo3AQYrRy+/S3WVYU69xRtA9zJw/sYu9m7t49zVi2gmFQPYL6gKT0n/qMCimXG8QKKrubYNUXzaqvilJTghAXlXK8rGTmYdn7aLYms0xiRsaXNlmkHpNXKj7BvN257FrOASHQcD7pC0BGTq9z4UxYZ41QpuKUNguO+hb5vXg7aKrE2qE6s8NsrRam6pCvNpMYniJEv+OWdbiYtL2n8TAMAo97CKdjEwhA2cyBIAJS8kXo85QHK/KQPA8r60jcZWSRQ/TxgAbJGoOQDlX+PRSBjRCQs9pbvbh5iClpxbPmctIN6H2B7JIpFcoB7uex0AQPuYsCboPkREVwoZ2nLBcj8DwJDGLpxjao5hH9OmMBCW93YFV4w1ZOtFF5bMExWmSRha9Ro497I2HYs9LcdKAADW4VHQiseD4nPNQez/YOcrEpBma0LVSSPAYLHAvwAAAP//bF3JblxFFD1Vb+i207aVRbClxhIJUyICUSJlkbAAsSCs+VoEgg2gOAvAUWQBwhDGBBwRQmz38EZ0p6p6jb2JFbW7+71Xdeuee885938SAKtYGmik9CIFREZh69WNsVrMQxe9UZMHS6Q5sXY2TsJ0z9WATkX0xahfdOEBQ+kYpKkxanmktyfVtEYqG5b0M2hOtHIeGFDbRZuaxyJEG3UZaQXKKrVBv3aGxg5aABgsUH3QMM1X04WqPt03Asu0KEyn0ycMgsEG0UUAN5wdKvpsFyQAAtiG3ym9jvXRmBe2VSIbnf3vNWFo1YiD779uPqPjsgaIZo0TFUk7dNKlyEMQq1QLZ/T8dDNwpROxOGSgy3wXWFahyesq2LcAHrWp8SddB0bZOusZdQqy6/DcsxU9LAaHmlDM/WC95C6mMBZ00x8qANi1sf7Hu5C8QfWswUiRrz8PBlwcLPh1XvT4TuZpL9taXPZpbxQW3KQDXC49JlWB598/wuHeA+x/dg+LxyfYWALnCLCLX50kyE66vWT0xx3nTlgdltSzC7HZSLqQI4TDymmF3CuThRJlGgGV8+8Z+1+0/RI+uY+16v9qnflbTMbYvfIart6+iZ1rr6Kfnkc9GbEr9bxfoKO2rK8UNLRccCTg2an3SJGVaKr2zAJATMYiRYtAFz1nNq6hWKJJF617A5Q+6ZiloKbthPoXnnEmJpxUVDCqoVBHK+TMDCBgQc77EzRHp/h9/wccfLyHowcPgX9qlHPqyJOGM6qJeSQTRPZB9pNz1o/LAaVDsfjQistMOLGtQqIosIjddKJS5prjud5sQaOus/UibyBQ82/bY3p5G+99+D52b7yBbLqNZzS6jTpi3ZI1mXzvfcP/UgGAq+CdSFS4oEjxscw5aaNnQIe30dk4tutkDomn0MJrAAAgAElEQVRtw3u8+ju6fhAPjIVjzJnwN4k5zyC5ItBZjnnvLOlvmBZK3UtiaeQojh2eH/6J3+5+i1+++g5/P3zENJhztE9aYlZkCmha3gtUwKsbh6o3mK4fo4lz5yO4pssonSR9lmwoJg9JtMi16HPi9UBV5bzfc49TYnytA5vT87j5wTuY3riMjUtTzEY9e2LUWcdUbDZhpPO4a9XTQKDxQKKXFAAGyWAoAMTzyhgydjbIukqmAihlZDVpCgV/B8xa8R3gNejF8yEUADj+FVwE6FlK2LCEZqvYwqabAE8qHH5+H998dBdPf/wDeLrAJu0oSmJorFvXh7Fp/N28TkthZ2abr5Dr3miCzAgJ0BzxXPWMzTx77ogq7LHnSA2EUKITp3XqLC9UOnXl+ou4dedd7Lz1OuYbJWZrHvWYRqI1rPVv+wX7hLTaWW7VZLTlcaOaDDddUpjAQGK2qBfRwDg4f/sgaeyaOsSpMjiMD5sOKeB0YfxTx0kwxU2WEbqYJNOdI60+5SZZvgZPxoqVxwXy0njW4/HBz9j75Ascfn2A9smMGV8kTyHz0FLMOdjXpePOsBjL1loSgI42Y51613DhyyWg3l6TSu+GMso+vM5WK8cw6spR17/sceHiNm7deRsvXL2E7KVtHJdCu5r3cy7Ykq6e3lUaDZ51wFnQltdYUKwZ5erx43lEa5vMyKaOoOVMqSdGWmwO54fOnzfgz/lGUlDuNGdKqcP2zMIe9T3LFWidj1yJ+ckS6+MtlN0Ym/06iuMex7/+hfuf3sNPX+6jPjrBmOyT6g7rPOmpC6AEmk/JGEFhabRJF50AW215sRbTbE5DWhAgYEExt1bpSmbhNpM9YpISwjMbO2PsXn8Z02uv4OLtN1FtFmgmI5y2FReegiSo0PaEgWfyt1AQ2Ogc9zQ2WRHGh4ZizQ05WtdEaW6qSsfj5fqs89ChNy02SZBTRmiQ55m3mFLrjUEgoDwyjXlsqjUTCOz1MZcVNqv4TRnDg8f9aiM0sH1WzOcMI1iO71dAu3mr0P/PZktMJpPB9ILBe2tcMR8jYwHQeqRrWV+bhPNhlQHA74lY8GVZsjL37HU+ExxndPJCp4PZDzEV6f1tv7ApsO11J9ljKgGwfZMWRAxbWCPWDDajJLDg78UU97oKHmzGGE8ButH3Tdad+4glVgsyvG+VIRenyQn2M8kJtwgSBvuqzx1PyuB1EnGsxWDDVYYHOMYrTjK/Hlr3jLe1SGNdfv5s9nUQWbFJv60xa9+D4pdM77KpduLFZMaHqaeasM6jKaXzDv+xda09dRVRdM0598EFbAw1qLXGQIvWoGhMG6s/yR/hTzOaftAY2iY+2rS0xgStoMEIocC552X2Y83MueUkBAL3xcycPbPXXnut8NX9rwcZDR8o9JzRKN2QE+9FI8BjqIKhSfkGpILs2eSOdEIuzAItE6eL77eAKiqFux4K4+VX2xlLgGhqXafkCgN6VnCF7UYHQ4OwizmUvkgUVGhDpL+D1Xf/W75QLvsbFxZRKIILeY+MoO29ty+MXG1fVXldqEIWINsOuOgGiCcsYPCATREOiszEvvWmHaDLDf00M+s7aQMwSw4bUxURGqdg12fU/gFVPRc5cRFEChDpDZ4xLkjzMSGjRMfKx5f0On3OaEi9Wnxv04Cwcee6SMEs9QazpYF6EVoBEUaJH6xGLtCY3xDBvTf5f2ugbNMmTWoZMjoftSUQe6IWvDb9iuNWZiKDEgTK1A+Wf4bG22OU+h2vLh6UrAJauCCfCIeVmDQF/nt+gL0ffsb+j7/i6NEhVrwHfIagyclcKuJ0zPLqcOfUVziFq3uFUVHETUniQGFa9+oKUKtYmQVd6ads1f/cElb5SX2ARRz6ygzXtreweXcHN25/hKU319Se6aSYKzCgyaX4pJc16q72dW7WdnVTKbVNDzV98M2yjMhmpMjJBtbMY9WA6771arIm+qBtaNowQnaIoxgXA20+52oLxDhAVd4ixTahUxXlRKsA4rm91I4wf3GMg59+w969+/jzwVOEv3uMK2BWBhVeEhbTilQqakvoLhoHvEjVVGHJy1tfFi+yawQcamFUZajWSBfX3sumQyXJzGrAOx/fwNaXO/jg7g5W1l/DedmiGpcqcsfUiZUoFVvsLflqHMidlOMIyDWslMCAwtLjh+wJL09PldkjzytHWTWhoB2RaZgY5baIsRMZlTa4PWdszXFQjrGXIHExIsHVLANpZUvhyrLusSRpyDzg9I8j/L77FE++28Xx4wOUJ8BKD6wq4FkrSi6gjugPmFN2ob22sabsIFmIAECIFZ/Eyujj4dr2INEzqBQ+ELGrs9pot1LJLmZAWC7w+nvr2Li9jY07O1jbehdnk06ZObXSLnoDZMjm0H7mNEdSWSaIzf7PFIOMnktgV/eDZmHD9RYMXgNwXCyVii5qt7AHsta4zpjNxCglboPLtW9anfeJooMlzFEkSBwrlzE/OsP+wz08u/cQfz3YQ39YYbUNygoYy36fifcOihF9P+hLHqSRVATPbLo6XxidV14lHkqSLhapI7dYq6dAuApc/+wmtr74VONXuzpFPxnhtK7UJrMpsvcIRsO1CSiM7j2vPC5iIK5sa2bBhUYoq7Ol2OqSi3rZtah5MzzIXgaO88yUV5wMtEosydKtZxsniIvkighmLmOC5WKq1rGHT/bx+JuHePb9Lzg//FdbjQTUFPtTQZapiJ6fEdK4mGhgX1cL/4GtEq4TvS88plx0Hsfky4X+TuQXM6CdiTXpdWx+fgs37mzj6sZbOJ/2qCRp8/2E94jq+3vCNBbaeV9HJqmcYwUolD56qpKr97noMHgfOsFmATbh+0BszXCWICv7we8308uYRscagvwoEmtDGVAsXLWp9UnPXiGdfdRNQcB+qfR3Y52Pibj4nPU4fv4Cj77dVSCg++cY4bQTnUZrtRAcRJKP3o05fZm0SHaJPNJ37vxSevWfcnatt8Y0/nORtWsIQ0p6+0Vwcb4ErN1cxxvvv42NT27h2oebmK5fQTUOqKSVD/RUN6AyJsKhc9cw9vgLC+YiJj1iuzygfbfJNUb2Aya6HKupnpubmCuU/hhaT8vrDwAAnwt9vtqGp3Oqxs+m8d73pFNm68FV03tEAXAK2eVnp8vOl8hAU8bW3kU9CxeXy3WjmBDnlXr2+DPfaNtUiM2Tf8ZJ6hi9YtuXxQlNNssy5g7URZLHkUYPt8bk58pfR+4ZYXTkBbNFBkJfpHaInGlGpwPREIqtP5mQO/zMbe163cCecRhvumhTLmMpLAKZ5zheTRIlzIEcxkfVYKGlOfVt3OZW91IX0TUnA/vO3Mded+hsxvyZbAsCWwQP8vGxvDAxLLjmbC1SWyS1jivryNsslc0tBS8vUPOSeTMghVbL9vnJQGIOqSyCeo7/AQAA//98XdtuHEUQPd0zs/hKTOyI2FEglgM4BImYSMAD4ov4CP6MJxQQD8RSbGHicDWW4/iSkOzGuzPTjaq6qrtnvGEly1K82uz0terUqXPMNw+/7dwgihzRxtFFGhb6Bebn51k1mPvTa+07t52AmR6o04MOFz+jj1xjCgCgg5D3cueLVt+jFBmmJxUlCyGw+rwMXKpGuzjZejlqQsEBvrcsXEUIk7oAOKcCHlWcTAVD+hUs3ZAqOoFeMmU9OhOoz6QV/IXFK7HHxrU9+qUP9NKExtlYYUOmt6C0egUA2KdZNA5McTmA0PfxJmsn8ZlVQbQ/5lYQUXqR5zhy2jSp1ue9Jhq8F0Wk76qoYlkmCyooaml9RF/7oEP4wi6JGNrQmxM9XDOqax5U5UrYmrj1RRxjldskTQJkooC5sKURQGFasKUaD2+scppULaiFPePEViv0y+YI5ZRWB/0nPSTV/ojm3lnMNBbV0AOnI5zuHeD3H3ZxvPMXXh2dcY/nQGjhpQmOBxR8s4V7k6rIkMC0+2zK3BBFbCMIqYy3+pNq4DUxDkMLTmbWPtrA3S/v48Ynt9GszGFYtqzQfWFbTmoCmddxf7knRWAJoFn1WsSxuOpMAJcNjCC94I0Iw2krER1xehhD9nnegxkSNHup2p+eU9dPpuScn2c9H9rkIVywfkYjrRsNB14FFnyF2YmFO/oX548PsffdNo72/sTLk+dULkV5ESj7ZcMuiCG4csL+0bYljzdTubOXJqNEEnJFoOM1EqhRpbotLd65uYZbW3ex+dUWVj68gcm8wdCO0VYtV51YCyBL26Y5WpBoFqLIouU+8Zho2mT9p/uLQEWjqv/GxflQn2VtCQvUwcwG1pgMeBVwg23ommglBGET8fy3LgKAaT57FMhC6ltkc9aWGJBQ4tkYx9u/4fH3P+NgZx/1+YiWIs8J7RczkTYXYzD0aZfoSjAdnYs8qZIkzwcqvZF+XPohcc6xiGMRSLb07gLev3MbW1/fx9L6dczdWuUe/5cm7BGZfVHXTwl/BxwyoZGAznBMAQAg+/P/AIA+gy0/h7mv3yRB3S74qSyzwCbSBMb0ApIxa0JUWWUmiRQSy8K8NYPClVikgTkewT4dYf/BLp78tIPR4TO0L16FvmeH0Ff/uhG/+nCepecMv9seBGGyFitqV9C2AlUqZwOyiswDDJbfu4b1z+4wSLZMe+XtCid2wpoMzLQpbYeZwp9vk70Vt9ZFEb5JDJjzpIPenwfBlHDkrCMj+ynR/Dv/XRSMQtbGGMcgA8+0DcD1WgiLMhRtGMivQgGijUwQz4w3K/f3oCmxMBxg+PcZ/tj+Bb/+uI3T/QPeL6Q3EvTcwrnH7YYa4LeiCO+D2Nu0VyREUOBOQAIxeIjKTsJwPC+enWyKqxU2P/8UH39xD8sbq5hZXcR4xuHcD+EpJjNFBySpa03mCiYDsZ6D7o8y2Ee2bfD95qR9NsyXMl/bTH08FBTKqDqvSYiyWblK6xHtAPUeUlX5Qp4tZ+jofd+2l+MJL+4nuq9IsbX0ZaC907x4i2uDJSzUBep/TnD46Al2HzzEi6MTPH/6DO2whh8B8waYK0Krk5/4aPNKvykviseJFydAZ0WrIRSVaOzJepTvEfLwr4GGjuxFYGFtGVfX17B+bxMrH9zElY3r7LbgZ8kB4zXMbAVTyDhRRXQ8jELfznVj2zApPtKtQ3W7l0A2TYzDVSwzfw1kfHUPquiiquJXg25BLm8XhLBPtHLLIAStDSkyRm0rZRZTgut8Kj69geJvOkzYLoNV43TTERL0kYYe4+hMmE6r0soYCEyIUhgnYc0pUK7JXe4koPeqz9T0Ic5r6pIUGceSA2oBVuPX/vcFUgI+bR3r3/P4HL372UuLdCyoyv2S768w3iqq2dUSCIBwxhjO2FPskjSoUF/UHeZuDpDy+SgM95w1rTpoDErWqcCkIJUK+oV29QTo9gEWzkPkvlTAsD8GxODI8yvVNVCmNAEMOTsgfMfUSkZ7N/88ApO1QMyfNzuXwOamia3JvBabBv8BAAD//4xda08bVxA9d722sc0rKQUlVQBFCglqKjVSP/VDP/TH9E/0H1aq1DZKqzQBlCAeJRJxMPix3t1bzdyZu+NLkna/ADaWd+9z5twz57iffvk5AQBEyK0OapSqbB5uNGNVeAsAKH0BQnkigQ89EeVFGM0AV3Ebe32MAVBF9K6z8J6iOE7o1kxvqxBPxVXp20v9eCZK0bEBZCJbAIBO7rTBVa1VkT/9fl1QYiJvwAALAKSbLQ9m14rJI02yUOtRNsq+Sl9JBLJiADxvRCJsGzkjRpcbzQAV+VNhEm+QM+50YRLopA4AgIsWIrpZxQG1tITR6DpSRvRSFoH3i8mDgiifAgDsPYDZkWUj4KKn7N7HgKktFoy06LUluFIAwBsanX5Ox2PcEAi8kWTRjqPYR64pX6E+DLZKdVyMU0DA9hH3j7+NTNrvCX0cdA4UqVYAphbfVQ0s7OIU7+8zAABdHUcCWx22e3JToDMGhm/eMdX5/K8j/PPiELgco/gwZSpnHznyMmhroKrgI+WyAcsg84HrM73Qzqm2Oc8woXYU+iwlNb21ZWC9j7uPtvHF3i62n+2jt3kHS2sruCrHyO70MSomXOfomGZehKREZfEyvwAAaHDkRGV1Mp1EZwxFyQn5ZEVfCtIE7HJC30vbUDe4W8wjU/OMpGxGNxhruRnbJHMLjIG2CDYyTdUH0Ug63cwrj27VQqeocXl0iotXb3Hy+xFO/zhkqnPrA1E4AwgQPeorsecz91m5T4MAmbxXiJVf3QYmLWD53jp2nj5hBsbXP36PapBz/fhNPUbdrrnuuHLzQI8kiqeIT35sDMMCAOxqIgCA0tMQ6pvV+vNmPEa/1xULHRW6mUYgFbJ+WbHM2vSPBecgc00ZVlXVzEtNfsrPKBCDVfqDC8tcGrJNSU0+QLdwKIdjXL05xeFvL3D0/CUuXp2jfYWgq1FlcGRFp4mbXwQAuK1M+qzLoD39obFN3z2jvl0l3/hVniObjx7g4bOn2Ni9j3qQY1iOMfJzVCy2EU5V22pdSIFz1gACnDg5O08b2ygGg5VFFdX/5X9zoX/O/0O0VvcVDbY6apUbPqfsGmV8VKlAbgIA8Cmz7NUhqBY/YhK/o3FAtn0Z1em32N4Ukxq9uov6usTFwTHPl3cHb3H6+gjZqEDrpuR1bCD6F2ox2oxfZ/5uqqFVbJUFUufhNt1KC8u7W/hq/yG2v9nDvf0drG1vYETSkF2H95MReZxxH3gRBHNJ/MJzXzV2mH3mop1sUPOeRxZA6LDE5lZsrKIbiTKSIgDdWthf7D6kcQmS8kEY5xxbDgkDACDOFdlH5X2uGVY7XmZgZOi5HrokJjac4Pr4Age/PsfZn4eYnb3H7GSIbtHi56BgvUssIQEwPYMAi+M1vXh81CHR9B1gSGD1eo6tvR18ubeLxz98x/OGHFKm9RSu4zF1BWbVDP2V5RA4mzFn94BMmAHKrMyNRpG2X1EW3PaquxPKyEJb6vpVGo2kNEFhkWUu9ZzHmErBAI7J5JQYAgAUxoI4BaQVAKhj3JEJyJWxpqUKctK6NHBtdJHzfj46v8TJywOcvz7G+d+HGJ9dYnpZsWDvoAzipy2h8UfXAN8IxCqTiV6Yi+I/iSxWHcCtdtG7v4G7ew8w2N7EzrdP0N9ax2B9GTekXdIDRsWU7YQnpEhPa1AurAIuPwzPUidi2TEmhwDI6kaV7D9VFEYL8eOt+FTjAImj7GGAagLZ5Dw9AMpENFj7sJw1on4U+5JVo54AQ9ZYdUPRpN1qoMW1/38CADoXNbewOh9pwpjWuivrhA4/tX2UTbewJ5iaehiwgn/XkgnzjDZPmosziTJkUhYWMUStCKIy9WL/GfHTEDc1z+REXyJ1DrOW4k7yB21fmEOK8Hod+zUe4EQNrZIPvGrz/QzyVY2zATuEmJJQfkYGQEKZs8bdCqxQ8q9rdVgL5DDDsAD0YleWXnDVsiDUQvu4IPpO+R39XIw3KU5vLOT1EJPbRsUgaXaZnJHZ7aJpxq+Ri4KUyKQsDO89/gUAAP//fF3pUuNGEP4kWb6BgBcW4uxuyG4Rcr1XHiJvmP9JVULCscsuxhgwxsa2pFGqe7pnRoKK/gBlY+toafr4jujX33+r3HEaoNQ5MxIIeiMxdL2tgoC5Ey4IOxMMW3bWCzSds68ptz+pTaTxwsQp5MC9lJBa0YiOFP0dF7QhH1w5QKRCTb+H1hohBSBRmw2C5na7fGJVlFBvct/hec5n1Y6a3nj1BxjZ4IQiGpFYQ9gpQY601WHYqvLE6psRAQjiPJUC4w81D0oJeA2MUECEf6J0EBS3oAmPxB5j6by7ixeaLka7oZJ8Kw/FUxb8eUJgtcj6ANk6aDR4pwJ9iNB7qBgJYfYayG6hNjb41XZQP8cFcmyvuVFbPrKrEnoBf66xHVmFbTnujxMuaVRiU7vNPCVRtdSa5ZXrIkcWoqOKsCGCw03RAi5uURSVmNYkQTlE2tgKt/9rAFjlYCtemJV2X5omRSduIV0aJA9rRJMFFpd3+PjXv7g5/Yybfz5iNX3C6mFNbjysFxAHk3DdIhlzckSqVDPZoPe72Bxs4fXBAXq72zh4/y02hntoD3dRbLYxjXOGAPLEjazgkPFD8Gm1QLfXZo6wK0oi64KhzxAtNMpAsIbgmtbW0VQ8yBWiTAmGogN4AWIBJy9EV8rnKfUk1PywC0bhGgga22EzoF5Qhp1k9zCXa8ETRokJXmjo/sgy9KMG0jmQzEqmCDycTXB7NsLo5ALTqxGepo+Yzwq+HkSTTIwXwQ4FnaoXyMYCcTGjdozh+zd4d3yEw1+OsXP4DTYOBswhv4ut9RIdZ15m3NhtdxqYzaaM5ikVKlg7vnDLc02g/RTCCJcYQeFhFeQ9hHDJaLGmNE8Lvo7dXtfeX7Vm6TPxwFrDLQngn1YwtmoP6OPWF1f8XmeTGgv/LWE0ADUGW+TosMrRLxIU0xXGJ58x+vMcl3+cYTl+xOP1BIvpwoa/XJOoJsRYyHVi0ThYa0WiIKdtcnJoYG+4g8Hbfbz98QivvhuiO9xFtNXD1KyYglGkJNCZM4y5VFQXNZY0MSORL3eM5hmcut4AEFcy9z9ZZu1ujUyo6w2AcDoNEfpVdA0/q2MjcEOfSCsqZh3Q4fyFrE3HnLhWIRpBkoyzzkRkfdDFbYWSHaYHkK94o4X4CehnKZJZhvnNLcYnFxj9fYq7syuMzz+hsS5wP15WdFwqexP5JpnyljcHfWwNtvHhh2O8/ekDXn1/iNb+FpZtw40YEl18KteWEtJpsFBZEST54fNDoc36zNa8RyeHlERael3iz3NUTYCtarmlDliBUuO+z04TqzJ6oQd6vWAKxRoZfRm8NzxDlQZnqdfDvkp6DUaKUDutNsxrZreltUGfgOkLg9YiY32A2ek1Hq/u8OXiE+7HN5hcXWO5WGA9LypFZjXo/K+0x81egu39ATb3d7kRM3g35ClztNPDtJFj1VCEiWHNGeJlkz1bKmt1nSZROheLnCl1YQOgCOKYzwGqf1sxsKqdJn0PI0ydDZmnNdKxaR4cnntdO3TiHyICaRJum93G0dIgQwglHOk5K/NS1vsGozmJM6+QeSqsN1t9RCvDRX7PxJiP7pHdzXB1donJ+RdGbywmD5jd3lseP62l6xxmZUNRe+W63nS3e2hu9LDz9WteQ978fITucIB07yvMmwbpdg/LMsPaLHl6Ss89onstWZSsac+l6n+UwjUwVTV9RQOEiAfVyHLuLoroW629xV9abQDwFFZyXaUIqu+5RzKVFUSMDhc0X41KjzBgZFncqAwMQwg9U3gLf2+GzQRTQ4hqrvk8Nj3/PUTthrpnGj+qqeasEQWZ7LVAfG6v/+tqscK4wr+O6qtoWUjRqMLcmlcp0pLocCRAqiKDoZV3XhSCdKoK8la+K7zXZZ8U4W3zL/966KEPqSdbadNRjEPqtY+BskIByIV+o9emmXix91L49my5l0szVxBXLkeXoZzWQ2xvK+iJMLegXIZynEJEUXV/w+aO1YqSBpUgWOqOD9qA4ONWBLrUG3yuRKyYNie+LvUiN0sim9e6fEfQSGw9z6LiMdeOel+E9UcURfgPAAD//2xd7VLbSBBsrT6wbDAGDAm5XOXHvdw9xb3gvUH+peqou0rA5PwlZGlXqZmd2V0Ju4oyBYWxpd3ZmZ6e7uzPv/8a2Cd7Fucy+UOYYWQPR8HU35x0MXs/VFogwQvd+n+u8zhV4bu3Kf1Hxf44sXTpzcxk1rDnWdlMEr+UsqELhTa7L+zLkbKi0r8ydSowY1Rm6kNPDAAVnEjn+X1BGJEndUkwsllUwV07WKFzb7TYk0S4rIIooCJsfvbVv8eymo0AAt1Y6revPaY0qUhndvSaeeaDC91SBQesfJ4Q8MRrMywwExMVCI30HNjRdV551dvdxWLe27Scn0kswgEdA1/6uiyYY7uA4OqIg45pMC1MKNyqgRBFeN6PAGQhqPmEldFgG1kFGpRVfXVIVVyFfhTAB0FRyVlBgQwN1EoPsty9yUfAgiLaUyQPSWKixS2jiRPQx0wQQgUAgg96YhvkL8CQ/F6HU333nuY6qQtNNE3qGhg7oHnZ4W2zw+bfZ7z92GL/3zNOhyNOJxvE2Oi6zeqKg9fF1QL11QLLuxXm15dYPdyiXixQLWpOqP2ssgo1eZEgBSk48UZC8WawInbBGLzJdH3H5HVEd8rG9ma6NuP1wmi+HEkizEh8Ip4Z74ENQZWLqknRmAIAyjqh/eYR7uIdCMh9BOk48rPJQuEzdCcWNMvlqxhKlDbn78nZwW522L1s8OPpO3bPG6ZyktVfuz+ibU7o7ZjiSl37eT3H3foO1w9r3H15xNXjPW4/f4S9KHhGmVSwVZirKSwXkUaE2cKohxYvJ285SmtR1a/TxwjQzCbzmXBBABCcW8bkRBOGtGuhSbGK4kyL/TCGoVoMRXnWWQCj96UjX5Gpo2NPJys0XMTONAHGzg6sdk3dhbIYmMLMLhudwczV6LYtun3Le2Xz7QmH1/+5sDm8vKLdHjiJtm+EsnfsaU3q1uWcPDVLXD/cYfXxHo+/f+bny4cb/jm5PdB9ICvMIKAl4zO8B0ykS9KZlYvrhnbyHXQEAO8e43GlLLAvfFLsQTWn1MFhzGAy4r6jALZn1cUzzWHauXOBIspJxiR+kZ0anS88XymiqOOHkc6IF3pkjRQjYoPWRkCZWDSZ3yOmdzAUa+2AuSnRNx1OhwZoejx9/QfHnw22rz/R7Pb88+HkZ745uS4M5lcLrH97xOrTB3z64wuKyzkDmVTIdCUJLVrvmkJeEPkQxhn8erfBwnca15H4lGuhTWc8q5GLYxEEVFHRXGRuFMOyYdoVciHf8A2YaqQ/Q59JwTBVrFbKp8nH4Mu02wTOfypeD50oThPYQn/bi/sDidByoUmMQ87n2tAZo/miCzPz8YyuryVF+iIUlfTVbHc47qlqx8QAACAASURBVA/YbV7RbBscvm/ZFpGV3sUDn0C55XKJ5eoaq/s16psllh/WGKocQ10EtgaNwrTGxy+9NpgIizL43UaXJhOYiW4MRMljek06qz7qZfDWhjAcgxC2nD9pAaL3R0cAkMSvQpofPK5Bz5KrshAt5VDCJuC951zoeKZgDbPJzjCahsyJ9aYHPkyf4yIr0Z/eUBUlKhImZbE7h6G1sHvH+4XOk75pcdzueH/QGePjds6FDBXq1ewCi9sb5HWNy/UNimWNfpbz9feuGOo44oLVp0sFHp0JTSXveBTPdEjBH/JmdfkSfademiPRn943YcihQentChrT9fLjAB0zbKM9eKRSazONfe7FWUwbDDpnzfnBMB4pSF2DuqBhFfPKqihCkannVNqZjTWI5tHRElqLwtDwojOQxlKkoEvtwrVzr+8zjDUktYa6S/A5q0KJsre5a1/E3Da4BgiAr/dhsPGspTVLzEqNKSbRPDrH0POFtgcqslS8TvIrjkllHhqSOlZhkwKdbAqDiLeKdsu4DefCsoY8O7mT2BoZNbTeQnGr7AfZZywu2crYrYCqCjQpkMsMIVHe59eQhqWKRacAxhTo4GcGvGMDPHVToPdCGgB63fR/+N8rQB7Zv2mM8toQfbg/erZTfEr3S8oQU8BIm9e+ZqNGTCOskQgmMzjpLH5xdiVIbhsxcEBS2iPxU/OLPDCfiVerFYepbqAxGK5SrrJcW5bXJfGYg0Cju2F//fP3QXO4VzcJ0GYoAEB0eW/nZBlAKlnDoEiH0sLUA9/n1eQLdWA6GXd3XGKxOgq4FURBuv0ztbBuwGoJKARJAaAoGHJ9H3SS7+iwzFyI4lzfot3DkiYJCU7kwI/erWvQKRabzQPr4LWKxu99On8rLtm8VlHwyuLHImQrRGrzemp7lNxb9KnE6+3d+9f++PNH+/nz3zyPugAV2ClYSa0Nza9mDwChfErERNvXoqqItQf1c0SKjU8Gf5IazPd/Rk5JCT/dnwoAWCTiYjlkIKX2GLrvJXmXGWALFLqidwOdl3mhTedZqyhCAFsJ9JxV4jpJ6tG6TQkkTfVi7tmTxX2Ef4UFVXA5tYH5XQAgv98GS4AymKAO4oGMP6DaIvlEq7TXvpFOC04sjYtkQhPrEBXtx2ZTsgLduI6vqlrSn4Py18r5MSELbwXR/hnALRZJj+hfzxHkvQACxynBb4MY8b8v60OTV5P2AXJ9p0RPgI3YGvHQ7pPho1eV6/Xa5nskq5vL0b4+7wFiSYsuzfjGQPoFtHRMs4dFUA1rhL3Zwx1mL+sfEwBQe9z2MGT6YIu67lVkcxCK5m54uEXwvFHKUQyBArAgBbkERudXb2dAYNbsu4SjaBVXy+CZFZM+EvOco9GvvGrKqwmggAKBOjW4kh5vsIW2KaHN6t3qDruW+3NUr9fVuzAc3j0b83pbvPJs3ccEIA3QrCtayH3uTECNPztaDfjfd+wdX217WZz5AUNMJEwXjMtCfTLef23ums35xracX3NQUQKEJkriMgNSuIf6zK8AAAU4lMlcLwncy3zsWysvgSXSwJZEhEBNPB9aVCC0Jur7+iLOVLS29/44/b+bbN4fn2mK1gpwXjXAXLOH+7g0yTCwroIafTku7X1/YyKqPQZVTjp7H54IUYoGiQza2ZJt4W3ibi30Nquqrr3c4+h+Yt4dQtf5bH96f3lPDbIAesREmJ8A6kAh1p7v3Ulu2cqS19fPtP7HtN/BY0fJM8DoqlGf2kSdDIjbk2S3djUyrfVjMOJ2HddiXrAl4t1bQzqy6UwN+MjEeHFfOdw1Xsab/m/juICRBoDNwrF8L1RtVOdBG8cz5AaGafdk39JUs0eLvDbkL4VFweOvnrhn0nS65nU9UZLL/u0u4H3ylhnf67JKFZtUVBnMjChm7H2iQOsc0k382JN6LAp1lRP0KIjxCpUUW3Ru2Pfo2OPrloacwYTQXH1d3miETbO7Hh1brsNz5bK8cm/bOGruGwQgzSIhhw8EZCGotAP8YbtTSCMgB1iD2bQe0QbWHfxlRtrKngImyeixH+0Rsd+Fvp/+Q8F66KVg92BcvTM+qYkUTRyjAkyweA03+I8bPwc/MiQ2MKaVqXb1r5J3gxg1dfxaSWiX8kxsEa+LQn48WfNWrzGT4GPqKiR2rEsEKv3f2/XJxX5UxMd8ELiA39EstxSj1jD4VryMa5SBtwo3uhcJqBRJQK38as5i3FuwB9RGsJqIr9fh3XaO6Wv8tISsTx5yYrdatByXjw++H/kh97arm4iLgaDPi/HBpP/jliDJMwkCfSuKgbrGQUaK9LxK4MXBEhyH1Xt2n3AgNAuuJUdgrrc7RV/xRmVICwCoEgbd32SRNGdo69q0x2ROUg3ly/FzbkUuUfe2BGTzeTrMHyVl5tiSURFm6oj/i9ky10pr7T8AAAD//5xd227bMAyVZLlNO/T/v3LA9rLGiSUNPOShaCcrigkYim5DYsuyxMu51GKcdqo/OtyBL5J18mWhiKBJhPcPdgksMZZFDA56V068PMhaavojAnuhe6qq7C9IznvgZiMBGZqAMNGP1nLFA5HFIf9xsgEPbrrhEgkQAbT8HCryK3xvV55lVygNbevY8Y3QdT4UJsDn5J9/F6tk8EgP3JphegF8IaFcbQ/YIT2y6HYN4Lbrlj4+PhRm+CRZYdFCkn9XzAZnp6Zh8FEVZSkPsNv/Gahs92lNmPPRB/M8YjdijOMLIpsHqlhFaRqOrAhBDIsSXNDn4DhyH7lJVUM0wGnB0B38d3p5SiLDDZWdxrsFErAQkbVDz09RB5Z7lQJU4JjjXXFbFoX4LIYyiY4GB8iNozwePVu/Nay7zzAnJmjFLODgBR95l+gcqkiTHhg1tWWkW23p576l5aLXKPMrBaVhQQuTFi8+MFljcp8NopyUSqDfdezMKrZQM4NugcNwP2JBJ1TvCvrlPlOtLYqHf/bOfbX2sq/BckC2NOfOHm14zsiNYQF3b1MbII5uKtpyn2or1vFHnkFuc16m1kk33eWOgG6TzVz2kwDFnOKeyq2N83C//zL7TOtYmhfvEDGa3bQ/crdag840AnMP1LOpf5P/phoMymt7pDw8JyAQpikcbAvse7OzQ663mHe/WumlEOSCx/qU05BcS0VcDHAGFQtag0hQa0RsPHb3ku0X7Kzdty1d1otfMazJuJ9nE7YUxeuu+0HNI31KMJD13LiXmq6X5N7nuXMdJags5nzRcyrrem5FN3zoMYgtHfaP5veOYmQJyeywAHSEacZZZMgXPoonndw45hY4/P77XayZNImNHFBoTZxQd+h8SrDa5l4d34mp/L94Fwm6QE/2Ly0kaScZgf/pdWVHRG4OiZfxQuWM4jrRQmpzJwZ3XYCquJYRN/EVb3v6vF+BdCJ0Wmw698wCxissALHfYX8zdJJYw+EDRVBQLRVRSh5mPdw14UFTwbzVQXeJKCt7hkJh241fiXjjrucCE5IaUITbtrs69TwLHiH8EUJOJX9J/mfwWPxc6SEwV6pGRNod7bbgSrRbYiDfvahNnKG0/VJwftzUVV5cWhCfJKILVJQyRxx/ngnpqMr93i2J/L19IgZU329NcDKaMte037SoLDS8BPFS238yNQmUAEWbQMyWdJcD579CI4NxnWpCxfkU/ZIjcuNUYD/FkPGnvA9CWboZoiVamPEn6EgB/cHvnf83I9FRYW1pIgTbZ+xB6UAjZeJSDHtTRp0IIKyPXal57j5whRWdEO8FRQdXlGZUhdZVFV2sdMVqUuKWRv560bNdEFC1mc+8CiTuBWagsHtFAcX0SBJcRSiqyebCsMLQ3IubmxHm9CYd0b0Z7et4vmCuszllBD48hyawM+5Wq7nhaA21y2ueCHPQlm8V/nUfzm8bJlALShobRevXe+u/xozpigolYx00bYAZRVbuBx3YzyuuU2lx1/TjfYX+CbvuQI5K46++pNfX6iruN0NBe7fc449jrKS51uIW4bRA5t6Qgq043SxkPtGUtc+s6xpQAlCQtMbvvwcQCalb7tKx/oj6k/l4X9/SbZ8i5kyi68rn3VwFn6KD1NyQ34V2AwpwsE5thj5LtOmu2awLV3/3SPnNVEgOg/svCxWyiBlPiL4dCqmLUnNYzMH8tylQ/L11YQVSo88tsOeblpTs6sdQKBYBnqG3Dm49dgbT7pDP8xy/YX3QJlvmGyLx1lAeI/0FAAD//2xdW3LcOAwERckz6+Q4+7+3yTn2zvuRkUYUt9CNBinHqZqKPR5bIglSeHSj69+//vkXHXrfO6syCOoX+hw9tNxDCuLz8xOcwhl+pRGwK3MLR5kXBMR54hyIo8KDLmDd0+CRVLhGFywEvTOHOjg8/h6aEJaILWwkJN5fdD1bVEB60BUE29HnoMEd8nyE1VP05GrqDvqO4KRHdfu0JyZvaL8K0nGFM8P54RiYSeODXtxZcPcEjzImKtw4/F7ETYee53XZj6jwE/XARREc38ctOBMeHMYqQFVDi5McXXQZTn7n4EgLjq5riVf7p9MfigJlyb9tE89prrCKSiGEQb9VuO7wbsGhkGGv92YW+blwysQB498YyaeS0J0lbCzkOmTLdpchQTfVWgck6d2o4VnZSwDNBregOsSho3sEj2dKSDFRNsae71u/BbRfe1no599VXL8GoAPikG/evu+h4Lvo4MkfOT+ohDO/MJD0DqBQU+BYd2u2u/q5VzE/ih3FG5adhMNuBa+9n6gKuGPnftcFLW6+rsWrM0H09DspAS234PYVamvDjV/oYF9R/W9wGqlxX9S4a+J/jbka0C7LRNIIoubzTg7X7bfT3sb/TO4JETJsbqxXzc/CcfWEkkdTX5s2XSGgVCrGpURQd+c9ZG6Qh+m8js+DjzW7w7s9PVYP423vbwQ13SGXjqrFq9h/fbeX8/iXN1772tCg7L1e9tsOO7x5nFfNqgHuvbgTrcAbX3OOWNWktcDBFvdN6J44v79z0GZ7FIpgIG+YcOM+XVOjtsY+BAy00B6xtp3nHfXI40ddydEr+79wjcfezaqozodYX9jDtH5IrIXM5QrdZqbLeuGst/NIechlCsDULNLPdtdmR5Mlh4c6GKBegCOfm1FScTM7H8X2raO/gnOUvUv2uRVUMt/Qyu7eaiDCx5aJEJiL9kRI1eEZN9l71z5Xwg2dqsOGp73yXQKRTcw4J2hk1KIvvpq4TtkXJG3iGQgnZa2BIPggOuxk8oKNHEO3+GRliDDNQb/oCnxKzSDGELj8qY6Sz6/GTEf1RAzspIyqf9FZdh8j0BvxctuGb7MSmeRrVFyj39VGtm7Xo7JB2UfFnmE12ZUNiI7xCzlC8QJKkWtTQ2rVArkIBJL1TEzcN8RMu6jYQx4EvkAfJDx/P/i17wcfi8/tHGT2Cb1Be29Z/ChqxFLoCz08uRHcTqzrMiR4oUCwrcGtnlF2M0WvJ2S0iyfvz+HzjIokZXMxz171gj9AM/Sk2IL+GRfvM4zVqWJuk44kZNM7dro/mQILNZJuZ3UsQUOQj/VYi+2l2XG9bW/IVNnjL1fIOXBNSPct40zX/lx04VgH+Z2WhYH7eaUCg/wUS4g3zw73e3191CRLG7Co8aWgtx5c2eiYTsQHOe6+V1QsUnJAeyCbABZLnwCfuaL6W2ued5IqlqY3jt/OQtTFb4a9de4NVHOfrPj63BcEHRtQMm4XP3/+SHUQUD6eD1LvXMmxNPt9vDwrjOe4Jyo88eaypb4XXB0LxRO3SYuiYNczNfzESO6XPpSZeqjQ8JDh57UOs1+UGufrmlz4HugUBf9XIJlEAxU3Wz60EvzZY8tl0o6Bgjr2V/pyoAF2nZ2BGu3l5kOsUfjjfCnG6FnQqZkwip5YtcZ5Np6fSOC1lr4X0Q2GvS9FMY+jbEoCKmYYNBIG9U/A1QeNtU1NKs+QYOd8fGQF+PF4wr7uil89fR2gcKY9QpRm9DLpocY0oeXSCe2znyRaLZHQpEYygQsp1NeLNJBU7hlnUouEEKviPYvKQgIkLbZYIBTHGaZeTtrbx7EjsSK/UH51xnnHGRr9vG+iMLZM2Hp8qDVDg258Ns7f6JQ/4tdB/1T1H7c5dfpXPCaailOA6DdxvfQv6QDTOnB8nAuNRQeaxuz3k7KFIQEt1BB87biW7geNBSfqAYrDQcHsvdv/AAAA//9sXWmaEzsMtOwk3bkPF3i3ecfg1AxDui2+WuT0APwZZslmy3JJKqnGt///+87DUbIPeZkK5pHUdQBmqwjDVcGI9QaX8Y83oOZGzmbX4Z4OfHW1oS+AFrxXxCLQz/EC/LAMIvUcGrgUppsMYZmSKKohCL54VwV2TdLtq2e7pS6K7bEvsAVDfx3HOyMJXWDQSR+bDJCv0wVq3G7AjX+fjfciW+eaICcEWhaoQxWWGULTewxkZODK2msN5Tg57bFrzboD16M0bh/q51uDJgpYhDSXSS+ZSvETFIcozCMKIN8Eiv8xmfYa0JbzUF9NVTvqIL4D8CttCpcZncDF+L4E+DNXJT1dYRuk8w71b94eq30CFDcYunqL8R5m27ddjA0tnnTt/Zz6vw5PDUOs9eaQQCsrMJwJ7Q6mAeNhpPg4KqmMPPYbVLZVFW/vqaLpPQ0nYK6OlZ+XWvPBCsvBKc9d1ZZw72tob4cztsxY4zEG5o0Hu8L6sAzMbL8+1eM7AURgC6BCfnogS1Wdm+iyzZI4Szlhnm6TsRoDQPEU2Jvh4NTr8nJ1uLmlAN+zHmENbIZVuAij6Lnon3oZDDWuS9l9r0RLvPsUeLadUChfw6+hczZK757BReNQLp4xVOoSPaxyhBrMpoGC0Ns/0JrE+Run7eyaAOgLkKOqqb4tBSYtShO2u7Ih5gHOinxHY8BCIEEWEh5ytieUUT5/th2XC7K86bYHDT1wyCfgzMqww8Iz3UeZWpKapo/Aofzu6GormHmoYmzKcjD7Lik3un/qO2rfaDWpy7NbL3CWqkBR7VN02oE2oZAfInOgkjq9WD46D4X5ClDpvAfPZhBw0rvz7MOvz5lOQPRF+7+kbJUgsopGt9SmwMe1ItcW2BedUpEagRUq0pf+f8MSn9FiXeT6OdZuWJ+8wCxtgG9FZyUPqV6kHzvtt6uC0Z1EmedhNor3g3Tggy0wd6q/WIIO58qcj+Gs/2hiFVWiHNkb+HAwEcL3GgVGu+6lvA7EDUkLQT2lzhUp25BeJJvJ82y6KqJR4EKC/WuNmXRBQLDdlJTga5ld4SQrA+RAf+ovq4LobDDJPDS1eLCvvTt4FXjnfex1W+wGBwrFdmsVTJdOsnui+eHhx7Efk7vDROYwhZnvG+fU7YNzuu3KuuPFBBAZx35piFrfmZw8GVzCFu5dPqyoy6Ap99ZW36k+gnzTCiTz6o1lkzW8jPrcea5kMv4fZpulkwx/6XKz5aN98X/5zn7Q7zQzFatoQR8fTWD10ZvSfcUoFF36NLvudFUozNRkQN3Ld4ljAaWd21A1G1VI+fmDASGwjCisdz4nJfRwjkYssP7x+dN22WmDmO1AhiPsHgXpVEsebLYvsFx08mQVvzkR2Y0NpnvrwWqSfv/GwM6eTRRzJBpO3br829lWMaMqYjgHShDIv+BxCPrBOMnmQWkRpqF34r1z0acHp9APJ+J5HzsAztLaN9YUW8QDestnNCWAmXd7nbyX8PvbUBECj9nuuxR8mh1z4dRU4YZtPNjTWyebFIl0sGZUab15wKT7rF/Hsvu6bdJFubo/c42VTWoBA2uGmRSogJ7pFqSagYO/RFGkay1wPrvvxQd8QcrvK88aq1ASPk8I8CQlB4nMO+1KzEntSzEqTye20LbD9b0EP5JsPBau5Keo5KWTBqSBm4VG3OviUKk6gcnAmSSeN4Tv8fTPfaMZgmmLdpLXKWlxVkdh97476p+k4/ST/fkUzPRqE9918VXSSVHEFMSg93v78fFBDP863767UrwVXCv2yVWU5BwOJ0e7h0D2SxsbYxX7PmCdzUOwax/1e6sMeN4K1d1yegbBWBiMMr93tb5gf3CuxyWI/1LkqmSZk/nAsLL7zsF4j22XzJxx45/PUX7s+dw1I+48rfRz8N5R4XbSfy/8wa819V/xEgbcqWUtHZ/UsG8XlSPNCJR61Y4ko7ENXwMtNpwLJuyH9y7fJUyvWRYyRSVX1XbEe4dxM1oCYPdIwCBew1roTNIvYZYJ5vHgeRz4VxJP+EstcWXf11gJtluFlPrbihmEk5FsAUVRCXzYN+6ExV6Az3WCAvE9df+RIMOQQMyKOI72GwAA//9kXQFu3DAMs5Vcr+tj9oD9Zj/Zs9teYg+mSElJCwxrgTZ3udiyRFLU9vvvn384Zq3TpIXOwC1NH4KBsWSHO0fH9Qsq1AKR1pcxXbWCYJh62KkGcJl2OkAa+0bA0Mp5nsiHjF6QaPAQRiFERGkF8Ebmfd3w+rkuWjeOyEVdE0cUTJsjKZiFiz5V9bioV84f/H22pPEAxe8RkQ/UsXnxuq7/gAlMsrhWxvTVHhLFhUh8yS4KbdRYRW2mmliIBZCkV4XPKGxavEDPFxKaCHXgtodcaP29O14OJIPP6ENOvjmv6YiqAll89lR2xL31q2P35Od6ntlioXFKVeakAi7vd3BMpd3urcXh8fZ8i778g4t/rQEANWQNZaQo51f929kP1pWUzXYd99EtnoEY1VhT0wscBXehflLBCEXHs+RoGSGUUM889hv/lQWOP5uj/XpztLXR9GqWBBisrEwbCRJ0Bkcf3WYxs3eyj20h4IsFWMnfHM61QbJpjcXl4N8TJBp+WHcyvEKOZcbUN02BGDhcuZQdzBiDZijJ6NwPGSPLIcnxJAAnRHmW6RqRtJ0uQzuYUBrjQy/o/ZwZ2071WW0CCoqq4yaGMR6gncycby2yAeht3SJ5wXp7ZQ92XfOaDiGwAcZblvtJexWpBdnfjT3Gn1+fOLze35/t+fAYFYcpRsDkHrKyPydXxykQcxVfD0fdD84GF+mvA1qKLyUrYo3nzGT7ErO47vT+H+zFxAFHOflxnjRudEkxjF73LWInL0g1xY10LeBkp5GN2rmOmBBi9P7Q2hpxDRSSJsfgl4NDumf+kmZSr3s8xlHWdjKqXcW85TrAGiJj2h0h4jPs0WdsVDvkuCo3JVWSB1CA4Iw7arfL57vib67TfhlpCxCFXh4eJwo4MnOEn5likqUyIRRNeVZ73FZMlwmRy21leISWhbMqwgrIy+spYfP7rWfQdPafCU2qMlqAJVCSwdHeQkVifIYAxnYHPla8wSSVW8LuEsmGvYKSb568RwcT3YPIXwumeu2qOFngmAybKvumL+zvcv7NkapAMhfB0Fw+55Cd5/dVLecJ4nD5vHlOgj5omgrL7VlGpdZz7KazQL6WACDoU5nZwztpGgy4ZxCIDP+hEwW3jrg1irWJxSPDpyJZ/dnKrTrb4rAedpckK2ntfHaX+E7GFft/M7Jur/B4WrCPK0sdjHJAkRMV4iwhgDVGjONb70vn+zpf4ZpNB20Zubpkv0d8EvvpbaReID1Cdn1V9Ul11GMk87jlOFIWzdhziwFeBQZMIdn3PotHEYxmX76/N6gTXiSfTsShtX+f+4P35pJntd4O5jTag/pexZFk2bP48PhacwBORdbr+Iak3UecWTu+v7D/wMRT1r6AjA2xZoTCR8/UR/axhx9rZMf/6z2jVYKF8cnzBuqj44i/8+lYZ8RTxfChqU7BJv8kneaczBkzHiOvZOuoGzBaJEeTnguYdLVaTSmNluK0sYCrKqS1PwBkl4I9Z7j/NNENpQJZYY3p1ki8H4RRSzPqVsa9dbaiqk6qZ+BU6/aYkbfqmjIYh7rr2w239d57KUZRNNKpXsSezmO9F6ln87VbxF3cV5uh0JZaQapv65Zrk3veCmvvmF41PhQxcD1PFDdqTRr3a1TWFJWuzJ9BAKoNpfUYw76Kf+T5VDFKHVDXcl3fqjNd3bMAOJfgY9IO6pAkTdezW/FokZUiJWQOua63DJSRAZR7cINDqlL4mdTnGUp7jY1vPtFuXUgAiD5DHyvLFmXmF19rihxUDtY+Pj7afwAAAP//ZF0LrhMxDHSSLlI5EAfgNByDSyNe290E2Z6xnaUSEk/wup8k/ozH4/Hj18/fbhxbzNkO6mzP5IyzDxWJpPBEQyWZH1vcB0YylMpvjwX1AF03oaNn0yqYfDh9AKOstJwxvECdcPGnGRuX3y0rXyDvd4JKag/K7wLCy2sxgYj7lDyUFAExhJv/jv7TAWflPTel2loO0jf0//lmKj3H6CkmZYRVdDWQRMxbi76GzdmsEjgQECB1ZsFAWr8Kvucqqqp1fTj2YyDxWOVibqSOADvOkzM+PUDTXibSezIx7gWR8yDm+fzuGw2U/dZSaI9Gjg68cl9nMWzsV+kAV2rQEJX4tVj7CcQ0kNOSaJshOlyckOKI5pCsRQIjC985biZogHjXFRCQexIS9P6SeJcPH7MPVpYlRKAYQJn2geoVoDJAx8HzVZ2KIbzqSC9nP1Anw+69KLV2rO0Hyq6PwwGjkwAHBBytRwkIbAPFdhUH7kmEV1MvqB5bcIk+YYJNAjq9XksDF45SeTHYKQ5gLoborhbMYCVAlBvKzESPv8szw/38nzNEb2AkE6BZSlCsZgTE92kXIoV2erNvsfa0Mxy/A4ol7YzAqFP0lONfNJD68/U3AJMB5pEnUJ4ouhMFtZGOsefcda3odLx/ASCZZ+aMpMOYTCHWUwBZvOcOeqJVecUTO3VUJ3r26ETi59Iry3Wi06s2imsUIksY+1PtjL8PjvIbW+JoAUo4/WRjmIhaH0E1F8kEigGZ2zzocwQ7CUHVwp+yT+zeb4h80HWXzw/vjZo0DUwlDyAaNGlMBfnzCWaVBFAOez2Z2PaylxIMjKAKayBlYgIr/sp0sHWWbmBmA1Ck1Q8NpE3wzyoQYDgQIC90b3knswAAIABJREFUwIkm7xDs5bmS2/5fCQAsjGnaAAHxQDyD8RRtrOvIs1ITYvd3PQNAqBiLZJuUroGJP9n4r8NYeKwiaTvey5Jct40mCIYiBFkFq8lWpZ8Imjt6H2uLEdlSGQtkkMePC+yBGkrqe/lYciFejZ+3wLw1Krn37d1caDOslSoDnqMdoKcvWQS6ZvgM+zts/4DPcjpyTjppnAbx9ca1MvE9UFUiCCRgy7QQK3WgbmLELItCJor1frndV985/VQ/UEVkwmCaCNMTChNS/JzBzNp1CdyeseLrCdkuSMq2SCaJrPRzT12lDVJ9mwIeNgFDpwNAO0jXXYPthrgm7DV1nLBP+8jx09pHrv9P9yFt6QOVulbsBdtDDTwfg4hw7jHER5bYYkyY4Kx4b27LYB5VcgKSAzpEeFk+BQJJCd/PKC0E3OO0bcvYgmectRjhCv9LO83rO0hb2yXd7pLtldOvkv7OHm59Rj2XekZp1zqYCYxrDMBSn8jqpyXUBxKbpHafpyv+63nUWJLrz2es74u+jevilPcGPSzfo2RaVbBloE34Oj+Rl8QeQ7LdoNFAu8f9WAuIBGQj+boDhLhv0r9tMhpBBMRVTLIrgDQvjqnLMaMUoLOWVCRxsfYjk/UB/bU64lXt2BM5l/oZ/r7ZERRALiTIgvtdK0ViM3avnxV+JscrjvANtG/3T43v6kQAQTGXsUkLT7uzB7Z4b2sp2ZP1ZH2GR/J9bAKqut6Xa2YA+GNhLZmy+7SRWtj24qDbfPte6M/FleA/FXiu0yTsHZfzaoAp81P4I1+/I2KEmncwR6HQubY4+MQHjO3nzH8w0HV91G5RtJ6AlLUnvN/yj60rQY4bhmGS7XX7oT6gv+kz+ulkUseyOiQBkHbSmZ120uzaa0k8QBBcf/35/XfBHNrZ6MxbqQ4nnd8rFSMOiVWETaThObs+lIfDWXvyAcX2LsNYnVxU2oW6ooef4wpCrAOVIizuiURlou++PwCATnoEknb2bUz0mLy/v8uh8jBxAbjgTPYmevZjbuui2PqGwKECxKSUaAv72j8cPY8KtsK/JaYnNFy3l57a+Xh5Eg2Drc3IAHnJXnluyNYTZbLKQG2Ku8rnsMewjnkiqsXEaGCj2JtOGH+K2UyV5vKAMqkPQbBVbJC8zxwDqISfWw2aAb6RAYiYwepL9uzxu/q4kj36IVmiJc17KXRvBWELRlFSJHALSqEf+p6H2StkS9crnOYm1DgrgGmQqkBXLy0xGSSgCjfvCW1WvBsS6UvOPPsJ+xeGDYEECuawDaU6wwSjhgywUoFekkBn03QZTrMBRoV+YdSI7Z+O906Adb0XIGcmvavjc6WLAU0MMiRIk9zAasC3J8la+689HESbZU4qAmkX6kIgdxsNhz5ysyEWwLEPzmmJnK2KpLJJUyRZHmF7UrfC6XPfCGcGRRUMkXVDsnhGuxCqtgygqJNCoM6FUem8zSZhlj2/i8sDjgHl3JGVSTuDx6fOditOmbbL9zBUbtkj1jH/eJb+Zb6fP6eTt7YDJle0feydJbuJr2gFuusuPKu8/L0N7RZcP9Kl+7Loedm1js8D1yznqaG6JuG+fvtOZBrN0n/Hc8j7yqT/kgiaelIxUUa29woQccV9Ri9f0HJ5Jhe0gYTNCqFGu68fO5PwOyjYWJ2A0O1eNGDI+BmDjKNV/2aFgwDYArbCBn/JKhX9ZQQEhwDbUGPeyppP9Ipe2p8enBQNleL2cUKzKjNQyYveRAAVcyjBfZ5hAZht3taA/jie1SoBVVZlnbmHcUontF86+t5f+64Z4gQOW7n/jmfMtef7BxKhCohzvacAq6895K0n4DS+Y7vgaRkwe/sp/U9llRSwOIE72q787JwEM50eTo0jBplhc0JdmgkbowbGUASSs/cdFHvaDMzc9lbBcm6O49QUpBAINWHYnzGWmaO5UG26IJAae9KS5X+u2t4BKGxebUfcc0UwfKECF0y6C88lCyqsWk3s51CRT7+4qWp+FSHX3HtnGT3qf+OMkgHmwDZ8hz0nTuLpAK+rNhTHBad9I8iY1clZmYwCJ8s+EJMn/KvtbbKBPJZ6ZY932MWcYHSAOpx7qWmtDGQn4EDm3ScYC+l71ptdnBCdvu/h8Em6xno/H9c4lRyzwp1neYpVVBkuBBo8hnjtugenwb+9KdnZEWdwpJ/9zMSsLbfI0W1ddnfDlIspe9+1L5h8rwBVwjZE65PFAm4vkeBHMegECB0tji7cB9sj0BjtUK0AAHYOtjpSG2r5r4eGjpJ6AJqtZa84k0z//RLfBcgbVXUxbMa42Q4Ww87SElQBgGA9pk8ls8ZiE42ZRDxyoT2YFe0GH8ucgwJ49wlZXeB0TMkKENSTTbA5fD2L2LYKaGyVKSxOghshYrrq/wUKPM4TWyrXbZXt1n4twozUhSCjk2epiTEOcV6sHcEfTiuwP1bo5FmiLWe+SB9qLUi8TkxwCPoJ4znXfjANHTCpzX+pIIWYrK6ls7tQpKLOSy1oVsDHzwTyHfoPsqFrMYlxSehpxPUt+b/GaP8BAAD//2yda27VQAyFJ5OkLagLYgUshlWwa1p6M4Nsn8/jXIHEDwSlvck87PPy/uPXz9+XvGH4Pf2A6y1ZUS5OD6s7VogM4QrOCn9+BMvIvPYe/oRe0F6+bktGqcvvsufinIWVjwZPm0YKgEPFE2PzNvkp40BZYUW5Cca4FSCBwLZE/u23AxkqlCoLiURpyk9hX2OH00L1rmwKvbBSwc5GZ1bv4DPq8+TYrBJs1csl0sqfOSimsgV2IbIXcl2kmQfjbmamnz+zc2wQkMbwxsVn4v/kfbHAp8JQJs1qsYGshjv8Khd5Bchdk3XZbsx8S9nLTFQsJIczi9tRChlYrjmlmpBEJtcrcqRsBpdU6JD3hWdsMumajLwLUUcmVllTP0CFYFdlSC3WZltNRuYFjEg3PlTYVwXAs6SXS62pqGEdUvSzvmiiPTlVjH/b2tNozZ4TCPLn3OJweFEAzZTs7JR0MDygIZOFSbNCriM3egSzaWvGZvISENMoYI2hmpLyljXW97h4Tnkqh6RhvYT4jTCNJypZ2aFTlzTnA88LliklmO0Ogl2aJRuX/ZkNJ7PObU9+SVrJvyUAlPWTBc6Y/y3qa0GQSigbLfP6lmeGo7At1vBIyXhPaau/wx5ePNh+ivutzWwiNwUTAWDCPHf52HmfU6oBu+jZnV7oiG2050pSblpmWnggPVeEANC5JIhTUyDsEjJpahcD7xkk0t5USe+t4S0MvANWl6YfbGLmLIPFFAeyK6TaTGNzAtGeCQAQysovgmxsjvlUQ2pg3RxNjPkQmzlldTjSGlEbuNGmZHOhBPDU6qHJEDNC09oQA9gXeIWE2ja6vzPLPHgEWP3QXOaw5KDG6FlK1v1/6s5yma4AI9B7QKIu8NkLVSuUdyab3Nn2kCfuwYTKemY/1yFfoBfmUjgB1pkFKIFeNRHeUMkbXafwxFm0mmj2b20Ibu9fXmLuKWfWHtP9og81dl3vNxKul6qDM5bArmQizbf7+uZnFlkA9k5tj5DtQPChsb74iy98ybIJoKihAHfGpQS/5r2qc4jzuNrqalOZhMRNqbYSsgEw1l1BWFwE+b0IrK9nzKZC0veQMajp/1y/hlh88zTja+45MmrL/TmlVFqKkKHm5I0XJFCF5qdpfZ7t48+nmvDp97R7zo/1vZS6I/+2AOMZgLEBAKgOHSgTJILaLBqnaFrCCrPY/8iQ2nJizrN6Y+Bz1rjQSxlOzqqFeOLGXMKq8lxRpm2qYc0HTvN9FStrFSrWd5N/98Q6VoCW538ogK7rjI3zavdpJS1ZxnjHm4CGINfiPR5u32NU2a57tEUW0jU1QnD37KTWovb+csC454g9agjuS6v7djV/S4Ezln2vKBDj48VzChAw7pWX1zOZdXuP1JLUXptyiyDGksnnTs/Quxhh9/7+XkZwr312yPoAGWfrcAwUcLFOCSvns1IrmnLV6zfZY5zQktqhCXzEBr3UFagDAyyqygOyeTjDeK4AO6M0pr2MeYP8mWMmS9tLrTHV5+DNp55sYvAPZYsFwfo3aw+mIhBuPQgglgw8rDXLKlAB3b0oU1ez23MNQNzl/hHZuatmpJdxi1KxCGB9vDTOO9QrZ4JJELY9QowiqBy777lULhCQ9wliowCB93HlLwKIhxRVBKdz7xPeyBlidqVQnNiUlpgYwn5A9c5dlkRO6WW/ff+uCQLx3JkwF2es5bXF/70sQ+W+8J6L4zfyB2x0rNmdqJvqeeLkmnrZtJY7CK8x8q76kCpEdycBoNj27HvaHe8qrTnbPwAAAP//bJ0LjtRADEQ73ZkFaS7DBTgNF+HYfJIOarue7YSNtBJIy5BM3P6Uq+zx7cf3nxiCaVu3pkB3xFqJRKimTV2E5mEdAdP1OHpl3ZA2Y62D0YRAY4KynclhV+Bexgs9BUcUyGUX8q6BF6YdUvFvYMCRHezUgiQTYB858bBOcQzjKsnFMjwG+vB8QX9U1KULgZP7on2SFHHzulLX/6C1D+l8ayCrVwUCeAaXEuzhAKEM3gJQS81T0F5IzMrnP4MXv9el6Z0RjLx4/RAyRmEZE3fLtQITToc9xFWDg+bmeiS+68BDDUZjS8JXkVQcBgAILSqe7aZHfwRhkjAfBHNfz4hDMUr8mawEZCMwU1g9g0OrtCu3tdRMbeoi56XhaC1nPeBgaxKZMyVU0GlDRhettYJoV/l7LTYpGHLNmVDjNoNa5An5FpIB7+KlhpMzsQlJX072K1sDmEr8iQ3x+VU6wc+BJrno3lCj0xk5C+oZ7+3KabWjJHGue53ZdSx74684e4B4XZNxD2lju5KFD4Etr6DOHgq6ABFsHNlDa3svQCuoSIClQ8cam6akGzuf130n8fI36DyN/fLaI+A4intFojyU8D5pbdB52fRhnVO0hRpUuKujbY5fyDz2sWYJnGcZDNWQGPnnr93SdPDplNKR4Fl29PtRTEHxdjuy/dhj1zyGPD+X7g877hqMudEdk5+NwI8/V8EAoNVau3WgCK5NCc/Bn/t4+AlJXuTzhiirAMPQSK/ynffGTBJJErbs9mySVMTqKg17igI5noNOtfSpm29ioWvj78jXHLWyJsv/n66ZDecNLKw/dl50DljTS0eVhMST5RxwF7bc73T1NhOUr3Nuooj9JI7FvxX7KSjv9n5HzPLAJi7JmGZsghjRxVmU4eV7K+iaq8FmdEJ6ef8JYuV9bvJxs+Qgl+Y+9GBZ3NkLFn9eI3Zzb5IperxjD7MKHQ3qa6VQPTWAlHh9m3PE6qx5BBPhv++vaQhg9bMN1tUMAOYpPEMKQAwJuB6gFMYAPrb7Krvbey801iY2FJ0yLqdYn+GXcuaGn1OfoTQj9mBD5B27BjaTh6F9rfkmYL/5sN0LZDYrUDTHfRfdd7Li2A51BFjuw+Cu6JADLjpj81f4FvvsJ+PzxirS4MMtu6L1+2sqmmYBhp7XVViDI/zqDFuxNXw6O7N0NauE8Izut7MakAN5R/u3JptnoZ/nRKsTK7MFX1AkvuRK3vT6G6yjIfYbtkn8qhtKKqOGLuRu2zK86ecdYAozfw/k4PFvZs4BcF35q4ByMwrBGU2xlmAiMhYKQDFhmPnUdZM+xX+GfHhTY6qpecJ2AaNbi90LewW/7feWckB88V729dd6JIChdgW7yDYi6DOMiQnTs2VdUGsZbGABJ2bnf3wHP+/7/X4bsHVqrz7zI0LK8tiktBV2alMTE4nOKY271wNebJ6P9wQQQN2w7MvqJM1m8xgylF8WdnbZw+/MNc/Zrb4sRlTZ4lFHislmTeKynr0/ctXaGGwC6Bz4dT+E7a17X01D4mTacgX3xMRY771sYlkXgIL/Tn6vSIa8meO2sFFjmx/0PDGZDF7PRf2FfE/P4jVm+iXO1K3GXWeFRmoZbmrnd4z2DwAA//+EXdt220AI3F1dmuT/v7Sx5Nq69QAzgGyl3XP6kKS2ZS0CFoaZPh6chmpR9UA5DjE7m29A/seuqBLTNXGgM2SDltBcTJCJARBbVke0OiwVLOlsDO8624RGKJT3womS9IbXxAMYD+B50440i8Pler29Oa/pOUF73mZmViG3ADMk4ZnZCDYnngKR0UuCyXmn+tIh4WsyYiAvVp8HdXabkrXQoDkfzqCjBysN5Ffp2HmdOQGasuCvKKK4vASSRoeZ4xq3PTRwuUhWZRDL7u3zCOUqSd84L7mfX1+fZZ7vTjrIap04H9kbysAY0VV1yFLW5bzSzaR9TNPsyBWH0qY94GGtJOfA/aJ9FSpMXHS7CgoKLIJVyjJqcnHWmX/9/uMw+uvpzMSmRPdZ+QqSvXKvRcaqwEZU0irZo0o3t5irrbXHyMToBDRcCnEs1kZqmAE1tQN7f+lOPMgFAjQE4c68R8JKa3OH+9se8BCuQa4rHizy3P6qUCeTCcwHtB0kY0vS9437ara5gSzsKjlTu9yJnLEKuY4FwG72HQgV9S9HID4UWtb8d9qhh51tWX+XPBniw6DLzeJLQaBbn6vzdHApgdZqB4N5mi0xofDKEfdIk7Nick1MaisPmpeWbmu+z2ZngAyTIO/AWA/hiIQAS0AfhgjEFUXHBeiS8oTdVu6d2M3Dfb4S3fO8V30ixz9zBRJD+SCkEHCEj3etXvgRfXbgw7NUag7Ap+4KZFqJUqMEqXYvlCUcDPkY7xngN05PbvpB/qZ8OLAlsZcK37q6L4wDvv6cUCIVRWk5RGxHkFbptR3x3HjFHvZfa9wvhWv2vzASNJpyw2qqHdJd43W2wfaNM7clH1RctcYgsJp01arXZUUVklJ1qshxpPjc2rnYSEK3bV88icydsCi24dkjVwK7Fvt7TNpJRucFoYjfr2sBRJfPTXGipOIjaQegyOH3TJZzg+zZn/vdfTk/vzAWJj6Zk1ngd7fvb4wTBRlgXh1G1thhbCgCH2hYsMOf35PJO4nNaiJSzPuo+cy6BMli1zzf8mKGjxBEXGEMlfzlWM/xhlKlLFxKx1iljT8+vBj9uhoKwNqR3mOkSgk1++H0v/n8dB0OQEyAMVpyJOe1+Vy0FYKkq3t/Pk7vpwez3fg4LBcYwTPzVITHcpq7NU6OvMRubrfJiad1jzBqIJrwHXTHOQ8/4PusUE/o/yHVq8VLfJ+Gwpbd3xg36+H/c0fyOk7aazdy5qAAUY6fcxsukmazQML3k3tEgjZFyMrz8rK/9GvMi65ym4LnODcH6Nu3Ynkf88oFJIz5XrkOuR+K4jDUY97ZDrzN83fmKoZS6HC4bkAs7IrkVIRtX6IZ4MiWsOPOmz5BfKjKLZJvqBTBz/dVv1NXFP2mP0u8y/arIzrIbUFmfrVkH4xU+f/5ObnDVo3PjyjAAYVq6jq7+zLxHZ+jMeGbNGv1xin3iK/N95b5YIfxjzy2wXNEBTdDtrMCu+Ze8jqSpZTb9NuKbbVGA62hiLuSZLd5I0JVoJK6Wo7zzIOJAmYhVke7evOtzGkWR0U0l21lXvo6mlMKx4isyM8CBgtF4mNMTSURVTsC2nJjs6/Ib+kXtoomHM4AvofJlxiCW8gnP5UImTHJ9hQcacmv5EZ8oNRln8+oO+WigCKAFmx6y8+0sS+qKUBfSGx4PB7lLwAAAP//ZJ1bdtswDERJyWlPF9QNdDPdRrddWyR7CMwFIDVfSZvYMh94zgzOn79//dljRgxKPz/Nm2qCvD8XzAQ1DnVtVqkQrjhsNpJGF7urukn3H2hND0NZ1Bx9R4ybQIfgr4yAbTBiC9IOAFJUIYqR/IurBiflmVRUlAGVvE0DoKtV6QFdQhgEy4f4+3DD4HQZ9KSIhzUC1jB0aA2kmNwq6tptJQeoBqVBeZCK41vTE5r4HTX4qn8flXB9VS5bVmiXYE9D3dKs5K/FOAxg1xQE/hfWMDXwVQPz8/FcU0WM/D/g7FRlgfoH3K5n8NhLZ8CgrILJnhK+qBdAJzV+noK3AgEdBeK1P/OmrmCQrOt7jRRiKd3s2gHOS30oAOrxnnDCfH+Sq8NzsWec+RVdAs3NViAeglAFYo1wUzyfqvygJBBXi7nGKkgtdXuozraifXF0hKjuavoH6tjnGcbaHNMoqugUhoSAiRnIJUHadyU6YnMEXJN5x3TM4GDVQp4FGo/O+0eKp0DZEFbj/CKsyb2ny99DMGbFdI4pkVEq90wHIGDjzLgysFfu0a1A5Kg9kEUURQlAKgWAoiQQt9pZnoJHzoJYsSQ4XrdwhIPT6RopVhzbdvN0LqMF9l9fEq6CMjQEQ8bWj4YAVS+dMwtWbOzXGd+7LbhCe+Is/NIVyJUl28nZjnlYHgjotVDfvX+OlQKxQrM05hX3vKuzjLN0aPaIJDLWaDn9BL2F/dwufJd9jfnohC5BUg9xaY8zZ3r34k8OBRazBA5rZWDQ6QJDgdG53b7wrUSVGf3s5SlYNmgXRz58j885ZkI4PUG7AupZ/URNSrrg1G05DH4LVc2iLcL+OLT6tKI/3etILkUJ405D/3o2BGpGF3DXmZx6f0b4pYfsQVeB6igdxh40naCxdVdZ3zo6zI7eax9QUptdn6i/ViYOLZ2HTymg4kObkk/QaawbduDm39SZueSruGdQ2naBFz488Hy6p2ui97B0nkf4hhR/mwqo7wJifkfOEMHizoQCNFpAAWsFBo4mRA+aSL/pgNwDRpK+fS9v4nsxqhE7riQoaGZLVJRPmfIw1d17RVJmO9xbCNSi3xDaC3QxhSR1wawWU3+u94hGDgrjdBDNT4ieaPsXd68kQPLHdVIQsZpxZAtknDMNxdR+V5Q6zlX96lr/iBFAQiDGRvCuruoTYWF4ol6omU8EQcS8+RrEUCESeiuMOmqIwthLZzRsk9ZviJqyk1LXIHnFxKVVREynKBLYeBAVZ4GH+4jLnJ40HnGeFbuhF21K8b4PoLpU3DxL5zIS0xMB11b8edP4wyPuVBaE86zie/e//zBKwmX37Jt93nf4Z2iGLuCn84mtO4/iG9O/XIp1pvSD6B5XdCN+vqsYCNrAusvjCiRmk8Xi9xMB7ChFxhZypj2p8z0Z4nPbtCitLxTCao9nGaHIGXgpXm9af+IO9gUw4FKh9iMEFpOrKGqizdOK//krKvirTCnjvlkzMzSKpL9D5z9ikhZ/68+ftKtmBasRBaOm3JD3ydwkdVGILWr8BFXL72/mgm6XEiXjdjbRYjcbr6IJr+1FCkdDBTpANJNqX/JqlzxYC35rogWy2c8k8WH6BqiRdSKZKD7k5hpJCTLA3m9MK6pZUfA42j8AAAD//1RdW3IcNwwEOVztWpXj5AA5To7hW8e2dsgU+gFSHypZpfJqHiQBNNDd19///vMTCEyOCg+hcyGf+Sf9yVuXx6XQtOxuALmQGNbyLHbfnuYDYjDdZiNUM4YnpQZbxTMZ/bGLLRX4ZoklOj3MGbGyr9AnB6ORIirTvFSOVHEUk16MPezlTv5a8tmWElPwRVHUEIm5F/mJ0eRlffh3YwyaFsVMMJVkjI+BJOP09sTHd48b7VFnTqbROxtJBHxGedBNXRM4/hr1TL93JB69l2p/HgxliWQlbz2vCXGeZ90fxsfUyQwJXnhssAZ+G33Zm/zpFzbi2txCcfzj8Nod8r705nJSGdXxdzGcwci8rPUtkSkgJ+Q9rjGoReKe1gcFW5q8UOcx0ptquTu3bMfX/nlNeu+TR9Q0DqMD5J4lALcKfOni4W21ahTx8htPxU0mfgfq3BTobnuaMzihEMeY/b62pefbSzTHMrD7fXyo0/U23yq98oMjrNCZWPI9vh70Xm1Svs7D0mPm6EzzM4auNw+KS3zSpYMU95kFPKgsP+LrfasguOThekG4yYBNvk93AJssyGxTM9TtTFGUIW/wX78Z8Bc3K/UgrgfQ09pXGjmnHRtHmpaeH9/dg+O70eAogL2ZZwuSYxVk4qMvj18dB3U+Iz6nvj3+0SEMvaeooiOOSYxb4MoYT3EslVy8J9ZDjSnrLFsendc518SXz2vtF/ns8AqWm8hqfIepnRBAnJ/4XHs7M9EIiSjKlz6R4qAatz1rkQx5TDy9iT9f8edLWiPrlpPKgo0UxC/RNf5NocTXB979FzpgvCbQTxJ8GQQG39O2MkLGnx+VdLOrscEjrJNYFQ/2qPv+/fNFocSntFSsC+Bz3/c67Zuozk12f+75ruSU3NJZZ/Myqq73HOEukLh2cov3Xp7mEcamEaHbMT1Wx+tIb+w6/8WpX/ICxmepexES0Fr2w4+uayUfMv9fR5uAseX9xXu/FTcAuMPPf2u8VKLirg72PU9Nd8LYbeTkXtNadsGev5shLv+wngC5xB/Z8RUFwwUtwM/VivpHvZydXJ8uJZWIxKERgMLe4HlUghXNnGzajk7FI4w1K67MY/+cOQJAjB+fsp3kRAT2kBwKMkeAg4KeaVOsDynad+0nPLjUwUjOu7RboBkhn+hhcLP444yT2QFe4GTeOCsgmrekgQLe5VVniK0XXfxjtF6gRZQn99L9yxljtQ0mVpwgz9sgM866duks0L+dQ2k8PEdyh5T+c6XQVz09xyesqtbaegEdtIIuW9btL12CdgcIMARkAZQ7aB/WzhiwJZz4vhoL/nlT0wfv72LMQ/dbOisEcEYB6Pl4H3Ibyvj8+fkXgCI7J3XRly7RZPK6fiWnFfopdiAYFVPlvaC16aLl+haHYSsYx9mq9eefX68fzK16FFBtj//Wr0q2vfadpxrV93h8xu774OSG1qdzxFj77/v6c03fcn2oTl8BDFG8dOfjBuztfJJnCiYx+j7HOuwkuQ5ywggx1gKfvYsGJvvIXGNL+xFxrG9f89GVX7i4iW/nwe7me4Kr7XtHgRUFDOY1gU47o/Jj5LCZA2GCacDWtlXDYxUN9T5sD5c44M5B6fjF5dfXnm74+vqzGxwCSa+26bXyUksRAAAgAElEQVRYA7cmESEK+aDPv7jsLoLL4UBxOBQf2qHq7pR0DFmdC1Q+XXvYfBMl6eL5/Hi8uCfupS7z1kvLHGHIytk5q+OQn7NzU8bTXRsQYB+a+Lljvt1BblW7uX5x7LaO1QbL8hybdW9cX1FUJgrC7i51HILT/owhyqLB5HlTu8eF/RiPAlnc8LMNVdKx8svjkjMEmqd4cOY6t8Ehxn2sUf995SVFta1JsOPe5brgd4P3g/zbtFlNXVS+F/GfGrIA1R5038FgieoVPPujXmTeaWxPzg0ALP3ld8BLy/zL5w7WurUaNJ2AvEJNRtYszDXfjjFuvJvWC80kihj3dsX/dJ0LktQwDETlJDvFhTgAx+EW3BoYkpiyrNeSw7JVW1sw/4ktS+pW9/71+7cfngjvzYPe2zfJ5gkXc1QjGGMxQCdyfOnePbUMgrXTwYtKoRkbhcgnoGrM+YQju7TFG9u7Z68jFMXvWOAhJiH1QxDZ7EZtLQ9SVMGrxUul1fx2pdJ5+Dul7F0sIsZjzmtB9J6dHAn4FNoraCEUuyfFv3aCW6EkGklsKEmykNsndmf11wqqhQAS83bQ984i4FFnte9m6l4KrUa0yamj+/LZ6P4hLkE3ywryn4UU891HURK15TEka4mq5yzfnGUt6ypmrbiGo/uZPr2f/HSL4DsTh48jZ7fuSH5QOuX9tIdGQ7NNnUnogbVT3wO9qwhww2N8J+mwZFM8rl3tTLbil67nUqe4ibrbyyzfmDO+Yn9cwSQAoT/CUzzpRKCUlxC18f3g4UqhT7HhquLhA6+OYhQljuTaROiYs2fO2tB8aBNp65Eod3Q81JhYu6PSCsAeDUpdSwGUXXNnkXzXx929BMPs8Da6t0XngNnk9KXvBTHZS6ywMirQJL4ISmpSCV8/S+1Ag1Ji/8JBbYFQwSBAcMzFm0KA5qKYg82zNcXBuX9XWuEt9WHQ2xBrer1ka+pU7kCJrJkaQ1fEsjmrnQKqCzW0Va2VbBBualKyYsNp5LErOXwnnfyVhSLMmpUAZef5DqR8XLO5dlDr7tGwbYUxM5P7S+K0SZWb+jagMT0YSK8PGoBXiMw9EfBge+DmEM4AzrhBA0CxYxZi/hli9hn21FZQy9l4PNa4I8GrtKdMLRNLpLpfZT1ufh1pfKGjA8I6v4+mzj9zrlxL1qjYbkKZT28ULbTEBzqtv734M9+0fFYHhoqI7Puu79SFrmyLWeBzOZsr20oztVtqRIA2Mt8odkLLMRpUneON6D7XdamYahIKTjV5/r9TNSvSmxgxFomgI9ZRfFmM3lSWhD1QVStrxbC9+gcZTuGt53z/vz8IDM/14EJWIaTpyuZFhR1Ve3KBVKS+4nkOva6z4QJV18xtFP8DyYVZR77Tgv2yb+uY3LBZe0eOxRohl3LkOWLwuA9o7DhzPBYzJhConjOTYHxGgizwC+YFdpAahwm17HBfYa3vD/eq/ljrYnH0ZCDotqLJw2faoqFzRK5xCsFkfCMF0iriiCsH/54uCPk6vBZrvod2xnmtlpasUGkRiH1ThGphuIaS+x5Wj3FUl9w7GYuMAKHrwk2btELy+dc1TEw3sW66CtoVqLGi3+Wo9s9f8dg7ctkSb4obVCsoKfc3NeGyDti33B/EcuoYH01BwyhABCjX3VJPDD2bUReMtTx1bXY1wNkv96OGsVIf3R3R0GTLVuSZ9+QxCgethwq9zuESI6+iM1Fv/1+9cN+VSVrXfJNmEQW+XF+KrV9lOqyNqXQrqTR/z11P3EtCxV727LdGy+oaFxCua/+sm8Kh5bo09kIud8Q+e72+LCMQFuwC8jd/v0suXs9jcvB1D9W9BpvT93GMeMC+Yna/Oiwoz6EJNMA3xV32C5bjsIGTvT01fcL6W3t65sk0Zhm5GE0F9Iw8Xgymj9dTY8Rw6IU1+/PnbX8BAAD//3xd2XLbMAzkIduJ2///0caHLFHsANgFITkJZ/rQppFEigJx7C6m14zKpaitvsTSTZ6hs+rJuoMbmeMxej32UP2NRtGh2TR09ZReDRVBqDqLcf38Y1wEwsHPaJWigd5UXJlRXuqEdj7cFGqbI/Q8OpIdAd6BP1VDkGrQ/exOwuP5dD46A0xpa7MgmNMKQ90fyORSDNGW6poCjX0mwzjCyOPzqFKmVIAyFJu/4Yq1wIHNOe94JV11G87QV2ipqOM5PvAUYJq7jfzDKI7GKKOlX7UKEfl4UQMhPgcF16QE4HysanBs9uc1flEJyYG220tqBLGufmCeT86J5R7MwflKwWibCrvdi2qlCkNerFNF7qNylQOUtQWBp+vnX3NONNDewwXTIfhXHqNCbmeIsXXAH/f8o36E+vkzF1Uhf9zvaF9lCALlQGINqRnQ2nvP2Qy4ldz/A89xFiMQuOs0WPyG2OvZExcLOYEQSWyr89sIP4tDYXVrVi0BXfMtOzdSxWD66nPmNyVj6QZJamEtSnCuYn/Y2qv/3Vl88rOG2j+///rOr6wQVHQInnDJ1mGzGnRIUto7gT5KVg5gPU1AQEwatG4Uh2vD9viaHniWLlo6xdZcY84JAdwGu5jYP7p075NckGVeedhyT+V9Ei6hEiV2TKtAPMC6/REHhronGRBrHn5y78f9oZzn29eX8a4P3LkWIdXtvWsID03OmYkLzlf2NO+tdrKekXj63hIJAqNQTFJ5uxfAyJFklcMSAdh3dM554fNCrGihg1K1yquVVhUCTRYETXA85V227loSKY1q+UsVmS1pbCJHo2XsCx11SrVqbAtK8fGQNyXv7A42B3sGl5093ZwOIb+n+jqTcf3mbXY6xu120/VMaUBWzaEY189ILFMMivxrDr22BmFmf+b1Nc5bFC3Hau7DU3eq8wiuClpBblt3rYZ5lururP92vVw9wTPmO6hQPfRIXpfFryn4HxXfA1VlftxNBCqIb7mKu6z3VvxhO5Lk+u3U4fyRB2u2isEJvzfb04/23CUb63QGKnHzZAQTnUc74GsiDil+tgb/icnJ5M7nb6czrhXoNVrEuH7qNyy+Vvf2hskTZXGwbRhtfp0GxUadTk3SQBNEqv1OZ4QA2Lp6RZa8ZEJNBS0n4+NyQoIaoskK2V29oipOaP34cB7t1ofQp545h/nmHLWImrejTkhMHHV6OuHgQGTs5n9wzDkqxAszBXtLRytcJNPLeBaea/QZWGyS5Ja8k7kt6Ti4vz1hg171WjWHqFjC2cR9ttHe1oLEzsl9r7g25AyXS9lpcdh7Hj36OWeeBQkcfdP9GhoG3IFMHC7LjL0yjf8Tigy6H+S9ahJ78iD+uO60T4PmZUOhySjaKB++Zr/P8LFLeKaOvv/DH/Je6VYEffteBpS6QL+qWcvJVYGKNiegElqioJyhAi5IAF4ElbR191kLqrtHmoj4QwTyy7KK7gSThGb3Th4HuL0L7XljvCDVYIk3nv+sPd1T45Xr8AmRgDiOXVGCAf8PumNacQ6BMGkLCcEztQT0vK5yvSDYrRTBKMhcLHbolohuQKH2ZEhTtTGnzdfDRVJl3vmExAL9m6SI6FqGMLcq7guyRQp70N+q0Dayc5Sdh2poJ2hxiWk99bQEcfCSiboIrUXxW+TRs0Bh4CwgBUISXO05gnf9HvRMgv/A+OTA6f9tUK+BhfK9XplohFkjd75PF8gFnYo2RsS81W4woSivrqf0HwAA//90XVtu2zAQJCnJCHqfHqF36TF6aiexSLHg7sxwKbfpT1G4gU1T+5zH9vP3rz9UECdfxWGJvpEiZxPXxlACHbZtFij6e3PTscnlg2GN6YCOwvs++qzzweWGRVtT8H2OLXAmU16QBCpcF3eBrOBgDXWwcaNAAhEEFdtT/Z8a/FivZtDDdtYlKd9/TgiEpJBQIleyhYf9fdIPBDi3ifBpzgiwOc/CWk1K+JxRcFANDXjNc9Oc9FBxwp8DBJ38cE3zwnQyAdrG4rZCgbUB3ZBkA5jezofcM3LJE4pL41OeTY0/hZLkEX7biLubY17eH7eUO3zaaSnTgkVTgRLpHlSCdxRJNr1lwC1JlpEOHSsz0SfHQWVufvvqMd0Bx18Kdoo3jXsRbALvZxSn7BFiLZscTKUv3Q/Yl5CLi2er3PzZx/Nqjduw5IEifJzgstHk1oIiKpzIDog2Vd+zNskQqQr+z25x1tNXKLoY5AomjS3oMzhk9PTAjyHZEZrbZUqOe07rtCj8lqisD95skir9ptdHS01P7s6zHp+dnLEO9EfD1qnAjUQuHRhiVSBOqLTcAWWcSW+q2s+J/C3Qo+iP8Yl/r68TfMTp6U3O3Ejsd2sxvpbCSKIuICZyQ73Beocc4+kUkQNnLllcrrVpo9SBAhn2UoZIeDVLsgYX7bwHORGXRl42+W9EBGhLk9ZEN+9nmzBKIYCu5c4lDBzmpvGh2Hqi+eDQNamwRJwrvoVzgcXsVDBAfq3oMr2DGs4R3wlQLON9PaxBdj0FP/Oi902u/b4Xbe3td+/cNmSJfo17X8GnrdB2MBTAMa3BpnDfdCApYfKf0vTQn8O4kY9/OFqtOKSP2hlsxvmdMJdzOMDNCO9LBl+V52ufAzD7DXQb0jJ6oDVNDY68DOD+ddfZyPN8JtJon7DzWz4j95E6J6Ph0/aG1n6bw94/Hu4zb98bHFHsbKVi3RS/eK4DQUWfZP5sYaOf8JkvoRtoFVt0z/sNyVQCNFlxnwUlGssODv1WVhX26MjCOup/PxzwuM0mGqDuz3RHI/T59S0vdnteQG3yIrmqkJ4CX3MjyyaVwyuKbXWgAegSJLg3BtDHw6lqBxppIqs4lI4uDzs80c2uFwKA473bawe/GbGMyv2GdoHYmedEj5fP59NoRcp12LirBrEc1m5nu+Zk/psQWbb08eEKUQhr/u5Ci+n7h2OBnf3np6MfMfCJ3PQs8eFZ20QdInd16XKFiTHeP3sL8SHqBHTlZzrwFFBQuXBnnrK8hgaWYrVE4nb6pWuI2KQBteb7qYVC9wJuT01EW6gfrpvXLXU8Dy3mwGMfze3VzrAgom7XrniSgBCIA0MiPRIad7c5PeQs1NolpBwXlA/E5LIs1K4FMt4h3DnyAJE2shE9Dg04U5/P5oS8JuWqekJYrmfdRf6J9S8RL3EBljo1appZxhm65uF11FD7Zw9VQl0S7/f97rN+YK3CbbLewwGXL2zqqdcgJxlQnLfii2NHBTp6rFYucTYcw7S3Zc55fb+UMykCHuMgaSuJ1DtQBBJoXzZovHzAaVoFzWnTor5anUw0W5fuC3XbBp2R943aGFGsd9Lrb3H4ZgloSyazkx7DGDjrBM0ODsl4zvydtIhX7ghoHXO00tLSF55EvpOmOj67nxdt7D32eM2LHpxxDv3EEBa3HJ9L+gsAAP//bF1ZdhNBDFTPZifAYbgBl+EeHDuOx908qarUmoB5j3yA7Xjco7WW9efvX38cZrmGH7BP37x5+WCh+EGBDAoIVL/gJ+240pdwzQJTysSC2mKoAJGJyldIJEAfKbIj2AOeDxjzTJATWhsogY6N0Iswfb8ILhiEg4JDd3BTU4sGNZqC/kUhywYLvEckfQUzwUYBSxu54c8gUYr0+RngZwnvbAndnKlwbVT8PMh7WeiLr+TjN4b/P3GwMaA5sx6oon5T1OW4NMF6r0FISdox5VSxp42VaQu9XLd28Vwpim9qYizVtlVoTgi0Ni8txcGMfCXxvBWMg5v8miIxEqYIfvLtTq7XbIglbKOkPpvldpk063wJri0/fwkN3eTXTr6NoHCpcF1u+ihmaM2lBKPvGBCfLYO833SCWc+N1gwcX6fDZjOY63M3bYxXUXDWQMV4kF/4vlB7XThd7AlPl3NFnGtX8HfRHTY4CirVv95iwnvQVuzMa3qjdz+gm1sGbOOEUw2E33ffv//IzfVg0I/fdV3yNeOsbJXr2L4k2pHFRg2MxiJEE+idVlRuA6XPcb9NS04ByHMrTZ92bThqE/LiNdq3tRTSsnZ5MVH2HMD8b/hnZSp+cPtoNi1RJcolgcdW7jtNveWBH80hGxw9xN9H8/PMJCI/b/B8ca582NMJj28X6OwcPg4JT6ZwoWgJ9DA2y1gUG6MTw9LDt5zDNw4PNlv44/xpIZi0dZHlkZSfnXMmnj8+PHi+nKPEWblsvU5wc0MEibxU/6mpv68JcT3JVexGa7k1dTvUmj7oELAviDc+yHi7v9nriSIgztMK26VG3vT7t3fYAH0+qcINLjGgy4LmT2i7EQaP798ij2KovWQRZhzWvagUrwJqyI6RzdeT8akWbLW4l9iQzn7PzRtE6iDotZMnLsrbRqHBhQXwK4urjJ0sjAIWvK2kAEAd3mK71okUmZzShNkuhQJQGta6RZKAHOqFWSC6OOHB8yaqkBpVDWairuAgU9SKs4j1RXPlyDzBQjuE2xYKAC9sVDs5pjGAcspeB6Lj5sWzoShqPFa1AGxwEkttB6MnO6z/LFFhlR5VB4ZWhn96ZB7hpl3fh3FIOeHViEUHletjo1O2pWr443vhUGYPxCKtRsXNp2WgGiZtGAdV1r3R9pjfuMGVmLL/mzuc+OveHE5LK1j//FF4kyqUA0wOvGQPjdg/82bUgxcNiSWL4RRgtEb73UdSK6e6+UoRui2bbW2pNwqg6loerLEc1Vkj9yA6QwJitSa8U5dEjZMsXWXhex0aUOhXdnTczscGVCJvzXjer/RT3c8heF228Uk15O/uz3m7f0McHFi+xcCBPHWvY1yTxs91IGcfT/LTt4hVVsSTGxGR8OmflDXFEtmuasmhBYlrLXXqEeAs3iFeKLh3m5z40Ha53VOjAsvDJc6OjTkY17VAb3GW+DaiftGA3gWvW3Ffqk1+5f+rBl0uFnk9hV99Cz/6uGhCvCKeg+6rwRYsDqtVIoPcgG4G7NFHakVEvml0OmMfM4W3OYA94QS1Ehqu5RdyLwR5I3fYRD3h3hW9cFwa+dTT6SOXd8rX2pyk0Nvj8x8E3iW/+IL0mGJ9ozSjeu1qZZpi6A0CkvLxb7am3oB/x14niFaIpd+eYnVA12hBiw354+MzFsqgV2yzR+s9RLrXZb/oc4BWjUVioNE9dsUwV7owO3O2pQbNGnoTO6nLujeADpj5CwjZiMHSMCqx+YKaKELUogKg+b8ugvO1v9BT9VCdrOFRvpfoKxw2+bBH0H/lWP/bdSGillA/w6WM68FEPBQNg9/lvmyRH1cf9rRmfwEAAP//bF0LjuM6DLOTpt/z7Anead4t3q1n2sT2QhJJK8UrsJjBDtrm48gSJZLrn3//+S8OYPUvs4tkgmCf9295PF9+Q5iMeTc4WVFFQjmEDrOAi5sYaE+DguRQUCWIEOPZLGRtIXC0jAVcJHMzae2JR031WN+ML5xUKBBwuSMQRIcvxI2KjtML71soaNr5Bqdzh9gQ+YAYzd13IYpUsLTi1BBnepfzoWx9ejMz0BUkIv4wodt6oJA3hLNgDC8AhtVtvJynYYKFvz9S4BxF9z0WV0oMbVEH6DL8eKkeHvzWdrIuJBI3aLmRNkcXfoLCMjlz7Mznok02QkJmM0cohIOKj/h+/L4yMjUkgEWobcBSAmPQlbZNwBG11jXe5ceD4FCRtHJdRQduTkcI1SEHuw9tDg2fGSIvV3nuE9nMKGh0P4ZsNQjkkIcciqpXASWnsVomfdNSXcIjGdHN4jIVXUNxjNcQvCPFxDeK3sv9EQJFhvi6SBnFRtKaYDfPgSEIudCDVpzGCopOmQm8rc8fA9HKQBGwC52t6OjmzoolDgf95f09MX3w2UOFnIXh0PqJ627HEirEu45F/EwEQl+Ll1X+7KtAt8kH7f2YUytq0pEnH8lRgZsGr42di92fuydNbylo899g4Y5ucFaI/07kJ9+0KNBzfVeAAR2CMFUb8KLPXCASRwDVrhUBxqAcLfBz3iXCNrmg68k3mx3JeWx9zmyrY0iB0VDbbrhGwQ+OTrHEXe1cWlF3nxQGdfDa8BHJNYmLZn4aItXpu5/Pl7qfDlYhyR7SLiiyJiInmOd8uz4miFWpT/ORMr8l1Pb//hOCQwsKpA4bvo5x2+DwX8I2sebx6wpl6uTvnZ7bjAPp+T5Rahq0MVJXDkCLn8P9pokn+76fn9+Tk8kBfYCiguDs3V3r1IyJTmPQsOy55Qg2EwnZiUnVuKl4qujWfva3nruO5K4hxoZ+y6bEtCEOZ3Buqbkb0lNXfHaQa53Ukws4z/ZeB3mPwwtQ7rFNMb0r6WcX8Y6CbWH31P6+H2lvmzo4DToQpjBmz87z9ZL60gpgmPv3jvFKagPwfrvVXQ2R4NfzFd01cIg7PlejnF8c0twUYNEr2k4qAs+aMCHia3s+VfkZs/18/kdNOjceqI/SKVpnvyO6dwD52d2J13dzrYRI9K2xYrmHxxw4rgxadLHYSsU3Rhhn8koHF8T91Qu9SOAP9/e+TCqG26zOEWK3PBwd+zwclECncQ4x8hECGL6HGODxRfEqaYKBMXvguOh/TQBOOecSTirja392DRzEcxZ4zEUj8d8wEYs8B3vZcVAgdzlxkAlaEfyZE5lnbQBe7yuaFZrkq1P4gIAO1wdjjQpm6sekiboAcbquz6I41/U+gpKVXviFU1nwhQdveUtdbxXWoAxzmpbHmfW+GN8s9s1phFWnJsXyHvXFGFOnhNMmbuvref7ZKpZ7DZ/n0c6AqsUBTUzWqC8YLyqsp6ODin22TGAvHD+29P5FeX2DdsPylR8Y2MhneIM4MjvQtv9ctjUoLCwoIa5MJyAr/FwXKOVTa2oq+rXYZ/7quft2ka5ZtiHOsUL5Z58ceekEwflJLjd4cQpUGmcOdE79iwPAcYCK73Ld7kFPQy04IOhqew5dqmwq3Kcdb1fYNb811eraANvj9OySHjQwteJgPqZ36SJzoHF7uz0CAO0DNokHaoUM8AVtYu4dUZPay0C1ABipxRB16zeokgH683RF5INyonEhW7qGxcsF89HYsnNng3tOTb/l2pCbTJxO4USQU7Qgbv7d7DYhW7PNdA0Ap4JCa2SU8hcAAP//XJ0LbuRGDET7p3Gy9j32CHuW3CanzgYejRSQrMfmZAADNrwer6VWk11VrJo///r1t20yz++XS/tsUX5/nzkbE2zFmRfEYh5AoX3m+Zil4I6U6tHMLknZcRVGNgb6vOSMS1TBDViAWY8YR5eK9S0773KoNNSTAwkNMXnXXoAk755zig2PxvlfNR1WdD4/v7LZexXJ1cTUSRGHtkgxTAM1dAb1fLavz6+3GQ82HDsQeXFekel6KFWBBZgZ/irgjuqq8WMtwbwfciutjUPM072EZl/prk0zYIzUGDiRcnCbiWDDNm9J3dWQIvkmfl25sO9itlZZxR0hJxRQ9zfQvacvTD909ZlKjyaFx5BTvgED+EPYhojslozyVqTgtfFeY+jwHHM9XFueoUCn+2YN1KyHbHZkTCMbTo1RaeQ86/tVCYIJzFPv03VAxKCOjFEAYYCuoY+pIjJnl5yJxrwlkBDP1ZX3GoPAV9m03JiOfF4h3z7HKzfxQxnofphXhFgtYFfJTaYR4NlxJr/M190Z9QkDyVxy7AXpYF82aNvgvfF/HKHOibgPraPNmEVeveS3Gt/IRks38wLp5G91VUlvGNmxt8TyQsYxEgi5SpRKzPA3rZ/59tExxvMCuRH42uDn5n+jLLjSqC1UHZfGbqaMjEaCQrtQxDqgiXJAUqMAttf4tRG4yXxzZUv9Xgrd9fn0zE8RkzlC/szX7DG+FzU8CXr4aSx5szxVGPpy3xbkxE0Hzjm2aZg3gIYoH6EQsM+tod8GjyOvCfeDAtuLJBcAKLxlHv73MbLg7IKzcz88z90OvJfcpLtM8DC0tPpkTO9jrVREMAN4Ee9jLM750s+Fi7knvohFvZUe8Mh58g2A9t73unprpK5k3FuR0+4uoCWbdJbM4XpAX0o8aWoAXQbsDtnbdyMOPuEG7YomRThNmajFOMXQWFWwMnd7ZTNRfx9ryUYchsD2UBmtTEHxsRopgGz91bqW1+Au+74i8agF/B4DesiTNlCL/WEhEdcBlMxvXhW8YJ0M9UcOMguQmRrz8wM0gIUxqZ6CoxpuKhNXWHQRGcGS0NxxMLRUl20yPOQqfeVoGMpD9nJcwGHieeYbzH+JurzLITCbtDL/CljoWfeSyjqrpDGR44Gz+n5VOKAXVQr1pRezttj7Z+79gEnUmi7wFOA8/t2S0e47AQAb3wUiVzaWXis+j74iPHsecanKbPrjY49fxOcBiuMvgASdwwlGe7CexoADGMIw4omRtWWtPNz2otZgXQHg15/J53Jthj6SEN5neGNeXIaIUqnxPqhQ3xQ3Wnu3DrP/n4GnN+P58TpY0kBg+mCB/Xkr8YZ321nfMWLSU0XJyNFUigF9Ob3VhODLXvCVHiUo5ABGqc32zNs9ADhPZtwSbtaR9Q4lbPRNksq3vW44tM+5Xf2jdm62v0kNwGGw1hVe1xUgskv/RVo+RC5ykEym3b63HjJKnV7HwmD2VNzgka7wh0ZVco6iMTfOc9dTnl1fVqf+/OOHxrPOtzXI+0Xv8iEj73dFJLUIlQAkTMjNj03UPE8HVFFMXooTtu/b/psxxsWkr/WW/fVZvLzeZvHV9+7RpKg7nlTxKqpZPR+mtji9doVq1epRjE1ETfr9+x+N2AWAi8k3t3KoVvt76OzkdWFN/d0ta78DKPPY90JKFMYQHTg5r1QPDJmK7whn8+BRCowBJ/5/jLUdJtehLtzKVCJqN8MPMICqk2tYwQEn10Woxv3TWcbTbGItsl9uMiAKne2fdu1QBwPGZbS+onUNmArSY98rCHg/B0u1Y9fMzsTWIx1rtf8AAAD//2ydYXbcIAyEsb1Ne5+eoVfpOXrtbAz0geYbxG5+7Evj1PbaCJA0o9H1+++ffyNbM0SjoNHM1nUy/MFOnFkiq+63hfKcEcpSgA0AAAR+SURBVOyNARrO65Go0c4eJdXXS/2LvYkJ9YsH+Niui5FSQ4bD2ORgkcln8RzHQI0fSbV/IpjOzp029Em3/fnLGVFTfvXdcFLnIKlGFrqN6XkDfSht9a200u5asECUcMCi3OF2xu9LNTAE7CPjc5RAcKOHd7S+YvODyUBQGFnRcKAI/FmgP2a981MBzOrocEClvKscor2maqNcddCxrFTZnfVdv1/SC4jJOcf18+nsFgEsNDDeYSvd2WIcFRziqKuppov1JA7FfVvqEIFabFHtD8+JmjfCS6ecRVgJ0HB45vzJffup0a6iykZGXn30Qa+EUPEdetsdPk9tU3CL50qg4WUF+zq/vzjd2UE+1LM2hO72ZMZ0dFQeQ89snmF9mrLRa25aJKccZgBY6TkFEUdZSDsLZFVgfVznyuqXbpvATmiTcqm0Za47Rv7KNgehSWYxxOsi0VDX/E6aIkUZa9CVU6wIaKhVXQtCLLTtn5aQ3rcA8BVtSP11RfsHYeI8aiqxOcpi6Hpitkbq12qNBgKHF2RhtcPrthcolfG1aeUlhHZNDSvYVwkZXnbmhYq4t3iwnlCxP1KQkelqmZ48HX0FKoG6X1vicCDgc05JkLJKNO+woOlh+8XBhiEQpToxj1mnp5NdaKXZZ1C3ygWKnYOwvWNjdM331urSu5Co0/hbUGXrRo8Mx3MP7nMCgLZ8H0KpvNYraT0Ri7b3NN5VwIklxShI2jZFTsN0FPX/Hyk5CQuuq2NAT2JSnE/iEOV3EqLej/sqWeXYzZ6r8c/rWEmo9pmo7Hltaa3Zvue/72pnS4vHRo8u39zD86hWUxxPBUMwuqK+s22lBDAKtpplEH6N/+fXp+brbZpz76tffVHpWgg7xX55Cl29LUr2sGPYY8GPvWYVkPq5SnIQSWRzLIKfNU4w0Kxu3t73gI3eDqqudzCvI0fSredStxeYHLQThoIOilnZ/zUHvWeLrQhzracEAIr/2E8d6CRMQlHkESluKmkhwTWOmWWi9WPSlB8/XMN7ui6dwH3t61Xv/EhlJ5QzHC/2lRMA5Ru7y0gbOixOfNfFWOzyHyjDA40H7IHx6vslPRsYoisBoLFqyyc9BGBlYbHzWr54VylJFeujJko944NfB+BlOy3vCQC6+cwOMWEt1jyB1o3Rxrvb90LeCzY9GHqzBd/z6UQNIJ1tmAS6GQD3mtMJCOAniZXvqvLGdX6I0VaUoHf5opJKp7SCusejeY4sdt1KwHguMqfwOcWAXsDhe614r3HN0FRpGxu5lKUIf0vcvPf1/ac/IISc+83zdQsU4aeuhpBqC1gnfxUBS7NikgDduJ/fi5hN2I9FVMWSYI8ijmNfXO++zoAcELGLUck8DLB3jXvPzEklPWA/EHQDLkfL0UcAvo/LHQWK9gD0BgJJD9HZCWSl+daTKKptijmtOHW4IJMRTJceyjteAKAwrqUF4kOpXGhjplrlIfnzYhDZ1xdDmRggWFBLXwrGde56NdsAwphVQnGuw7CdAEDHuZPRqTVkWMVxlP8DAEqVdhWMsOGTAAAAAElFTkSuQmCC"/> +</svg> diff --git a/docs/images/Creature2.svg b/docs/images/Creature2.svg new file mode 100644 index 0000000000..05964a80e1 --- /dev/null +++ b/docs/images/Creature2.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1024" height="1024" viewBox="0 0 1024 1024"> + <image id="Background" width="1024" height="1024" xlink:href="data:img/png;base64,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"/> +</svg> diff --git a/docs/images/Creature3.svg b/docs/images/Creature3.svg new file mode 100644 index 0000000000..3c03d91c28 --- /dev/null +++ b/docs/images/Creature3.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1024" height="1024" viewBox="0 0 1024 1024"> + <image id="Background" width="1024" height="1024" xlink:href="data:img/png;base64,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"/> +</svg> diff --git a/docs/images/Favicon-Dark.svg b/docs/images/Favicon-Dark.svg new file mode 100644 index 0000000000..ecd12ab70b --- /dev/null +++ b/docs/images/Favicon-Dark.svg @@ -0,0 +1 @@ +<svg fill="none" height="96" viewBox="0 0 96 96" width="96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><clipPath id="a"><path d="m11 24h75v48h-75z"/></clipPath><path d="m0 0h96v96h-96z" fill="#0b0134"/><g clip-path="url(#a)" fill="#fff"><path d="m63.2627 25.63c-6.4927 0-12.3308 2.769-16.4092 7.1748l9.9983 9.9983c2.8645 2.8644 2.8645 7.5294 0 10.3938l-9.9983 9.9983c4.0921 4.4058 9.9301 7.1748 16.4092 7.1748 12.3581 0 22.37-10.012 22.37-22.37 0-12.3581-10.0119-22.37-22.37-22.37z"/><path d="m40.8926 48c0-5.8653 2.2643-11.2123 5.9608-15.1952l-6.6565-6.6565c-2.8644-2.8644-7.5294-2.8644-10.3938 0l-16.6548 16.6548c-2.8644 2.8644-2.8644 7.5294 0 10.3938l16.6548 16.6548c2.8644 2.8644 7.5294 2.8644 10.3938 0l6.6565-6.6565c-3.7102-3.9829-5.9608-9.3299-5.9608-15.1952z"/></g></svg> \ No newline at end of file diff --git a/docs/images/Person2.svg b/docs/images/Person2.svg new file mode 100644 index 0000000000..5aa766bd8b --- /dev/null +++ b/docs/images/Person2.svg @@ -0,0 +1,57 @@ +<svg width="1017" height="712" viewBox="0 0 1017 712" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M511.67 227.1C510.63 227.1 509.57 227.12 508.53 227.14C440.21 228.84 386.2 285.6 387.91 353.92C389.59 421.19 444.64 474.57 511.55 474.57C512.59 474.57 513.64 474.55 514.69 474.53C583.01 472.83 637.02 416.06 635.32 347.75C633.64 280.48 578.58 227.09 511.67 227.1Z" fill="#241950"/> +<path d="M633.68 329.8C628.83 301.46 614.33 276.4 593.69 258.14C581.88 265.35 574 278.36 574 293.21C574 315.89 592.38 334.27 615.06 334.27C621.76 334.27 628.09 332.65 633.68 329.8Z" fill="#A693FF"/> +<path d="M304.07 354.72C314.15 354.72 322.329 346.55 322.329 336.46C322.329 326.37 314.16 318.2 304.07 318.2C293.98 318.2 285.81 326.37 285.81 336.46C285.81 346.55 293.98 354.72 304.07 354.72Z" fill="#8770EC"/> +<path d="M403.32 489.69C411.9 489.69 418.85 482.74 418.85 474.16C418.85 465.58 411.9 458.63 403.32 458.63C394.74 458.63 387.79 465.58 387.79 474.16C387.79 482.74 394.74 489.69 403.32 489.69Z" fill="#8770EC"/> +<path d="M201.68 405.4C219.38 405.4 233.72 391.06 233.72 373.36C233.72 355.66 219.37 341.32 201.68 341.32C183.99 341.32 169.64 355.66 169.64 373.36C169.64 391.06 183.99 405.4 201.68 405.4Z" fill="#A693FF"/> +<path d="M591.419 465.73C599.619 465.73 606.259 459.09 606.259 450.89C606.259 442.69 599.619 436.05 591.419 436.05C583.219 436.05 576.579 442.69 576.579 450.89C576.579 459.09 583.219 465.73 591.419 465.73Z" fill="#A693FF"/> +<path d="M635.359 272.13C643.559 272.13 650.2 265.49 650.2 257.29C650.2 249.09 643.559 242.45 635.359 242.45C627.159 242.45 620.52 249.09 620.52 257.29C620.52 265.49 627.159 272.13 635.359 272.13Z" fill="#BBABFF"/> +<path d="M224.08 283.03C261.2 283.03 291.29 252.94 291.29 215.83C291.29 178.72 261.2 148.63 224.08 148.63C186.96 148.63 156.87 178.72 156.87 215.83C156.87 252.94 186.96 283.03 224.08 283.03Z" fill="#CFC4FF"/> +<path d="M535.64 572.32C558.25 572.32 576.58 553.99 576.58 531.38C576.58 508.77 558.25 490.44 535.64 490.44C513.03 490.44 494.7 508.77 494.7 531.38C494.7 553.99 513.03 572.32 535.64 572.32Z" fill="#CFC4FF"/> +<path d="M790.459 227.12C802.089 227.12 811.509 217.7 811.509 206.07C811.509 194.44 802.089 185.02 790.459 185.02C778.829 185.02 769.409 194.44 769.409 206.07C769.409 217.7 778.839 227.12 790.459 227.12Z" fill="#BBABFF"/> +<path d="M630.219 211.91C645.859 211.91 658.539 199.23 658.539 183.59C658.539 167.95 645.859 155.27 630.219 155.27C614.579 155.27 601.899 167.95 601.899 183.59C601.899 199.23 614.579 211.91 630.219 211.91Z" fill="#BBABFF"/> +<path d="M294.009 550.12C309.649 550.12 322.329 537.44 322.329 521.8C322.329 506.16 309.649 493.48 294.009 493.48C278.369 493.48 265.689 506.16 265.689 521.8C265.689 537.44 278.369 550.12 294.009 550.12Z" fill="#CFC4FF"/> +<path d="M544.969 252.96C556.959 252.96 566.68 243.24 566.68 231.26C566.68 219.28 556.959 209.56 544.969 209.56C532.979 209.56 523.27 219.28 523.27 231.26C523.27 243.24 532.989 252.96 544.969 252.96Z" fill="#BBABFF"/> +<path d="M499.51 303.1C507.29 303.1 513.59 296.8 513.59 289.02C513.59 281.24 507.29 274.94 499.51 274.94C491.73 274.94 485.43 281.24 485.43 289.02C485.43 296.8 491.74 303.1 499.51 303.1Z" fill="#8770EC"/> +<path d="M685.73 445.62C691.32 445.62 695.84 441.09 695.84 435.51C695.84 429.93 691.31 425.4 685.73 425.4C680.15 425.4 675.62 429.93 675.62 435.51C675.62 441.09 680.15 445.62 685.73 445.62Z" fill="#8770EC"/> +<path d="M635.26 358.01C622.29 353.18 607.19 355.02 595.52 364.19C577.69 378.2 574.59 404.01 588.6 421.84C592.74 427.11 597.92 431.08 603.61 433.72C622.9 412.39 633.64 385.52 635.25 358.01H635.26Z" fill="#4A32AE"/> +<path d="M808.359 473.98C826.219 473.98 840.7 459.5 840.7 441.64C840.7 423.78 826.219 409.3 808.359 409.3C790.499 409.3 776.02 423.78 776.02 441.64C776.02 459.5 790.499 473.98 808.359 473.98Z" fill="#8770EC"/> +<path d="M385.509 267.53C396.659 267.53 405.699 258.49 405.699 247.34C405.699 236.19 396.659 227.15 385.509 227.15C374.359 227.15 365.319 236.19 365.319 247.34C365.319 258.49 374.359 267.53 385.509 267.53Z" fill="#735BD7"/> +<path d="M547.489 433.69C555.199 433.69 561.449 427.44 561.449 419.73C561.449 412.02 555.199 405.77 547.489 405.77C539.779 405.77 533.529 412.02 533.529 419.73C533.529 427.44 539.779 433.69 547.489 433.69Z" fill="#4A32AE"/> +<path d="M529.01 406.77L524.19 406.51C523.67 406.47 523.36 406.42 523.16 406.32L522.91 411.31L522.19 425.62L518.96 474.34C528.7 473.78 538.14 472.09 547.15 469.4L550.98 414.44C551 414.21 551.32 414.22 551.32 414.45L551.35 468.07C555.76 466.58 560.06 464.84 564.23 462.89L563.12 413.54C557.14 412.98 551.53 410.71 546.9 407.12C540.94 407.43 534.96 407.32 529.01 406.76V406.77Z" fill="#4A32AE"/> +<path d="M477.03 427.74L476.81 398.49C476.66 395.18 474.4 392.59 471.66 392.59H458.67L444.43 392.52C441.61 392.51 440.8 393.9 440.65 397.31L437.06 449.5C440.06 451.77 443.159 453.91 446.359 455.9L446.39 405.43C446.39 405.2 446.719 405.19 446.729 405.42L450.4 458.32C459.7 463.64 469.77 467.78 480.38 470.56L478.9 457.97C477.72 447.94 477.1 437.85 477.02 427.75L477.03 427.74Z" fill="#8770EC"/> +<path d="M446.389 405.44L446.359 455.91C447.689 456.74 449.029 457.55 450.399 458.33L446.729 405.43C446.719 405.2 446.389 405.21 446.389 405.44Z" fill="#5F47C3"/> +<path d="M529.01 406.77C534.96 407.33 540.94 407.44 546.9 407.13C541.2 402.73 536.98 396.35 535.41 388.75C531.91 371.84 542.77 355.28 559.69 351.78C561.14 351.48 562.59 351.29 564.03 351.2C561.16 348.32 557.69 346.09 553.87 344.85C551.9 344.13 549.81 343.73 547.63 343.73H540.97C533.5 343.73 526.91 347.47 523.03 353.15L523.01 353.19C522.36 354.15 521.79 355.16 521.3 356.22L511.19 374.17C511 374.5 508.32 379.37 508.23 379.74C508.21 379.81 504.91 385.69 504.34 387.63C503.87 389.24 503.87 390.78 504.14 392.25C505.48 399.57 512.78 404.04 520 402.26L523.25 401.46C523.12 402.82 522.93 405.04 522.89 405.5C522.85 405.96 522.89 406.19 523.16 406.32C523.36 406.42 523.67 406.47 524.19 406.51L529.01 406.77Z" fill="#A693FF"/> +<path d="M550.979 414.45L547.149 469.41C548.559 468.99 549.959 468.55 551.349 468.09L551.319 414.47C551.319 414.24 550.999 414.23 550.979 414.45Z" fill="#241950"/> +<path d="M564.019 351.2C562.579 351.3 561.139 351.48 559.679 351.78C542.769 355.29 531.899 371.84 535.399 388.75C536.969 396.35 541.189 402.72 546.889 407.13C551.519 410.71 557.129 412.99 563.109 413.55C566.129 413.83 569.249 413.68 572.379 413.03C589.289 409.53 600.159 392.97 596.659 376.06C593.449 360.6 579.349 350.2 564.019 351.2Z" fill="#D9D0FF"/> +<path d="M219.129 485.46L204.739 471.07C203.049 469.38 200.319 469.38 198.629 471.07L184.239 485.46C182.549 487.15 182.549 489.88 184.239 491.57L198.629 505.96C200.319 507.65 203.049 507.65 204.739 505.96L219.129 491.57C220.819 489.88 220.819 487.15 219.129 485.46Z" fill="#A693FF"/> +<path d="M325.09 437.14L310.7 422.75C309.01 421.06 306.28 421.06 304.59 422.75L290.2 437.14C288.51 438.83 288.51 441.56 290.2 443.25L304.59 457.64C306.28 459.33 309.01 459.33 310.7 457.64L325.09 443.25C326.78 441.56 326.78 438.83 325.09 437.14Z" fill="#D9D0FF"/> +<path d="M688.71 321.68L723.05 356.01C726.74 359.7 732.72 359.7 736.41 356.01L770.75 321.68C774.44 317.99 774.44 312.01 770.75 308.32L736.41 273.99C732.72 270.3 726.73 270.3 723.05 273.99L688.71 308.32C685.02 312.01 685.02 317.99 688.71 321.68Z" fill="#A693FF"/> +<path d="M497.58 183.13L472.22 157.77C468.53 154.08 462.55 154.08 458.86 157.77L433.5 183.13C429.81 186.82 429.81 192.8 433.5 196.49L458.86 221.85C462.55 225.54 468.53 225.54 472.22 221.85L497.58 196.49C501.27 192.8 501.27 186.82 497.58 183.13Z" fill="#A693FF"/> +<path d="M746.989 527.18L724.949 505.15C721.929 502.13 717.019 502.13 713.999 505.15L691.959 527.18C688.939 530.2 688.939 535.1 691.959 538.13L713.999 560.16C717.019 563.18 721.929 563.18 724.949 560.16L746.989 538.13C750.009 535.1 750.009 530.2 746.989 527.18Z" fill="#A693FF"/> +<path d="M535.22 348.54C540.07 352.67 548 353.35 551.77 348.99C555.54 344.63 553.74 336.88 548.88 332.76C544.03 328.63 537.04 328.82 533.27 333.18C529.49 337.54 530.37 344.42 535.23 348.54H535.22Z" fill="#4A32AE"/> +<path d="M528.879 343.45C535.099 350.28 546.859 352.82 553.119 346.43C556.639 342.83 556.819 337.55 555.829 332.15C555.059 327.94 553.759 323.62 551.569 320.3C546.489 312.58 535.219 313.12 528.949 319.51C522.689 325.9 522.649 336.63 528.879 343.46V343.45Z" fill="#937CF8"/> +<path d="M554.019 338.83C553.739 338.78 553.379 339.04 552.819 339.01C552.609 339 552.439 339.31 552.209 339.39C551.939 339.49 551.589 339.34 551.359 339.54C550.649 340.14 549.719 339.89 549.259 340.23C549.069 340.37 549.099 340.62 549.319 340.69C550.729 341.14 553.949 340.52 554.229 339.12C554.259 338.98 554.169 338.85 554.019 338.82V338.83Z" fill="#4A32AE"/> +<path d="M552.83 341.04C552.75 341.1 552.68 341.16 552.61 341.22C552.59 341.23 552.56 341.26 552.64 341.19C552.64 341.19 552.64 341.2 552.62 341.21C552.61 341.22 552.59 341.23 552.58 341.24C552.55 341.26 552.52 341.27 552.5 341.29C552.48 341.3 552.58 341.26 552.54 341.28C552.53 341.28 552.52 341.28 552.51 341.29C552.49 341.29 552.47 341.3 552.46 341.3C552.44 341.3 552.37 341.32 552.42 341.31H552.38C552.25 341.32 552.12 341.31 551.98 341.29V341.83C552.15 341.81 552.33 341.78 552.5 341.74C552.71 341.68 552.92 341.61 553.12 341.51L552.79 341.09C552.69 341.2 552.68 341.37 552.79 341.47C552.9 341.57 553.07 341.58 553.17 341.47C553.26 341.37 553.28 341.22 553.19 341.11C553.11 341 552.96 340.98 552.84 341.04C552.82 341.05 552.8 341.06 552.78 341.07C552.77 341.07 552.76 341.08 552.74 341.09C552.78 341.08 552.78 341.08 552.76 341.09C552.72 341.11 552.67 341.13 552.62 341.14C552.54 341.17 552.45 341.2 552.36 341.22C552.27 341.25 552.18 341.26 552.09 341.28C552.07 341.28 552.03 341.3 552.02 341.29C552.03 341.29 552.08 341.29 552.04 341.29C552.02 341.29 552.01 341.29 551.99 341.29C551.91 341.3 551.85 341.32 551.8 341.37C551.76 341.42 551.72 341.5 551.72 341.56C551.72 341.62 551.74 341.7 551.8 341.75C551.86 341.8 551.92 341.82 551.99 341.83C552.24 341.87 552.5 341.88 552.74 341.77C552.84 341.73 552.91 341.68 552.99 341.61C553.02 341.59 553.05 341.56 553.07 341.54C553.09 341.52 553.1 341.51 553.12 341.5C553.12 341.5 553.13 341.49 553.14 341.48C553.18 341.44 553.09 341.52 553.12 341.5C553.18 341.45 553.22 341.41 553.25 341.34C553.27 341.27 553.25 341.19 553.23 341.13C553.19 341.07 553.14 341.02 553.07 341C553 340.98 552.92 340.98 552.86 341.03L552.83 341.04Z" fill="#735BD7"/> +<path d="M553.23 336.33C553.31 336 553.35 335.81 553.15 335.73C552.75 335.56 552.3 336.11 551.92 336.34C551.92 336.34 551.9 336.36 551.86 336.38C551.74 336.45 551.62 336.51 551.49 336.54C550.93 336.67 550.41 336.61 550.14 336.72C549.8 336.86 549.28 337.06 549.39 337.46C549.58 338.19 552.9 338.35 553.24 336.33H553.23Z" fill="#735BD7"/> +<path d="M545.889 337.88C543.989 337.88 542.199 336.3 541.709 334.05C541.169 331.52 542.479 329.08 544.639 328.62C546.799 328.16 548.989 329.84 549.529 332.37C549.789 333.58 549.639 334.81 549.099 335.83C548.549 336.87 547.659 337.57 546.609 337.8C546.369 337.85 546.129 337.88 545.889 337.88ZM545.359 329.31C545.169 329.31 544.99 329.33 544.799 329.37C543.059 329.74 542.009 331.77 542.459 333.89C542.919 336.01 544.7 337.43 546.45 337.06C547.28 336.88 547.99 336.32 548.43 335.48C548.89 334.62 549.009 333.57 548.789 332.53C548.379 330.64 546.909 329.3 545.359 329.3V329.31Z" fill="#4A32AE"/> +<path d="M554.39 335.39C553.64 335.39 552.91 335.02 552.29 334.32C551.62 333.57 551.17 332.51 551.01 331.35C550.81 329.89 551.11 328.46 551.82 327.52C552.27 326.93 552.84 326.57 553.48 326.48C554.33 326.36 555.19 326.73 555.9 327.53C556.57 328.28 557.02 329.34 557.18 330.5C557.52 332.99 556.44 335.13 554.71 335.37C554.61 335.38 554.5 335.39 554.4 335.39H554.39ZM553.77 327.21C553.7 327.21 553.63 327.21 553.57 327.22C553.13 327.28 552.73 327.54 552.4 327.97C551.81 328.76 551.56 329.98 551.73 331.25C551.87 332.27 552.26 333.18 552.83 333.82C553.36 334.42 553.99 334.71 554.58 334.62C555.87 334.44 556.7 332.63 556.41 330.59C556.27 329.58 555.88 328.66 555.31 328.02C554.84 327.49 554.29 327.2 553.76 327.2L553.77 327.21Z" fill="#4A32AE"/> +<path d="M549.219 332.13L548.649 331.55L548.819 331.38C549.349 330.86 550.209 330.53 551.069 330.52V331.34C550.439 331.34 549.769 331.6 549.389 331.97L549.219 332.14V332.13Z" fill="#4A32AE"/> +<path d="M541.918 331.746L533.211 333.276L533.349 334.064L542.056 332.534L541.918 331.746Z" fill="#4A32AE"/> +<path d="M552.63 321.01C549.75 313.86 536.66 311.39 528.69 319.23C522.13 325.68 522.22 336.83 528.62 343.85C529.29 344.58 530.01 345.25 530.76 345.85C531.31 346.28 532.13 346.15 532.5 345.55C532.82 345.03 533.06 344.45 533.23 343.87C533.57 342.75 533.73 341.59 533.8 340.43C533.83 339.91 533.84 339.39 533.83 338.88C533.81 338.26 533.72 337.64 533.63 337.03C533.48 335.97 533.34 334.8 533.84 333.83C533.82 333.79 533.8 333.74 533.79 333.71C533.9 333.61 534 333.51 534.12 333.41C534.32 333.15 534.57 332.94 534.83 332.74C534.93 332.67 535.03 332.6 535.12 332.54C537.47 330.55 536.63 330.69 538.62 328.08C539.21 327.31 539.75 326.51 540.32 325.74C540.66 325.3 541.01 324.84 541.46 324.52C541.82 324.27 542.23 324.13 542.64 324.02C543.33 323.83 546.84 322.99 548.64 322.81C549.13 322.76 549.61 322.6 550.08 322.48C550.57 322.35 551.05 322.19 551.52 321.98L552.4 321.54C552.49 321.49 552.57 321.43 552.63 321.33C552.69 321.23 552.69 321.13 552.62 321.03H552.63V321.01Z" fill="#4A32AE"/> +<path d="M543.98 333.31C544.19 334.26 545.73 334.7 546.36 334.54C546.99 334.38 547.32 333.48 547.1 332.53C546.89 331.58 546.21 330.94 545.59 331.11C544.96 331.27 543.77 332.37 543.98 333.32V333.31Z" fill="white"/> +<path d="M552.47 331.08C552.66 331.96 553.87 332.43 554.45 332.29C555.03 332.14 555.35 331.32 555.16 330.43C554.97 329.55 554.34 328.95 553.76 329.1C553.18 329.25 552.28 330.21 552.48 331.09L552.47 331.08Z" fill="white"/> +<path d="M546.319 334.55C546.949 334.42 547.309 333.55 547.119 332.6C546.929 331.65 546.259 330.98 545.629 331.11C544.999 331.24 544.639 332.11 544.829 333.06C545.019 334.01 545.689 334.68 546.319 334.55Z" fill="#241950"/> +<path d="M554.409 332.3C554.999 332.19 555.339 331.37 555.169 330.49C554.999 329.6 554.379 328.98 553.789 329.09C553.199 329.2 552.859 330.02 553.029 330.9C553.199 331.79 553.819 332.41 554.409 332.3Z" fill="#241950"/> +<path d="M539.849 394.13C541.479 394.23 550.529 392.07 549.629 389.69C549.459 389.24 548.979 388.97 548.499 388.98C547.769 388.98 546.659 389.11 546.079 389.14C546.009 389.14 545.98 389.04 546.05 389.01C547.44 388.32 550.979 387.29 550.459 385.7C550.289 385.2 549.779 384.9 549.259 384.91C548.109 384.94 546.259 385.42 545.249 385.32C545.179 385.32 545.159 385.22 545.229 385.19C546.759 384.49 551.409 382.91 550.219 381.14C549.919 380.7 549.009 380.82 548.269 380.99C546.829 381.32 544.64 381.77 543.32 382.05C543.25 382.06 543.209 381.96 543.269 381.92C544.279 381.27 546.349 380.7 547.279 379.76C547.969 379.05 547.519 377.82 546.519 377.67C544.449 377.36 540.999 379.23 539.109 379.38C539.079 379.38 539.03 379.36 539.04 379.33C539.43 378.4 539.819 378.07 540.239 376.9C541.259 374.01 538.129 374.34 536.729 376.15C534.149 379.91 529.08 382.47 530.55 387.93C531.79 392.82 535.509 395.27 539.839 394.12H539.859L539.849 394.13Z" fill="#937CF8"/> +<path d="M456.189 342.21C450.829 338.47 451.409 333.01 454.369 328.3C455.079 326.78 456.979 323.79 457.739 320.6C457.889 320.18 460.599 319.92 460.749 319.5C460.879 319.58 463.279 319.93 463.389 320.08C463.449 320.21 461.499 321.99 461.509 322.11C461.739 322.73 463.039 322.38 463.819 322.9C467.139 321.72 464.909 325.38 468.309 326.97C477.409 331.48 474.969 344.15 464.239 344.3C464.649 344.67 465.039 345.01 465.509 345.28C464.929 345.17 464.579 344.65 464.139 344.31C461.419 344.43 458.449 343.71 456.189 342.2V342.21Z" fill="#735BD7"/> +<path d="M481.239 321.52C477.219 312.91 461.279 309.97 457.619 320.23C457.459 320.67 457.629 321.16 458.029 321.39C458.889 321.86 460.239 322.28 460.699 323.32C461.719 326.5 460.469 329.77 464.479 326.92C464.879 326.63 465.339 326.41 465.829 326.33C467.549 326.06 468.479 327.35 468.459 328.77C468.449 329.58 468.069 330.35 467.509 330.94C464.879 333.71 462.749 334.63 463.449 339.9C463.779 343.13 467.499 343.69 469.969 345.44C473.639 345.51 476.999 342.91 479.209 339.36C479.209 339.36 479.219 339.36 479.229 339.36C482.529 335.34 483.869 325.14 481.239 321.5V321.52Z" fill="#4A32AE"/> +<path d="M456.59 326.41C456.59 326.41 456.52 326.36 456.49 326.34C456.44 326.41 456.4 326.49 456.36 326.56C456.33 326.61 456.31 326.65 456.29 326.7C456.26 326.74 456.24 326.78 456.21 326.82C456.15 326.89 456.08 326.96 456.01 327.03C455.89 327.17 455.81 327.32 455.74 327.48C455.67 327.65 455.63 327.82 455.58 328C455.54 328.14 455.5 328.27 455.46 328.4C456.07 328.59 457.24 328.81 457.55 328.35C457.9 327.83 456.98 326.74 456.59 326.41Z" fill="white"/> +<path d="M456.65 327.7C456.38 328.27 455.92 328.58 455.48 328.39C455.04 328.2 454.88 327.57 455.16 327.01C455.43 326.44 455.91 326.04 456.47 326.34C456.89 326.57 456.92 327.14 456.65 327.7Z" fill="#24194B"/> +<path d="M440.339 398.75C439.759 398.68 439.339 398.16 439.399 397.58L441.249 382.54C441.999 376.63 442.629 373.88 442.499 367.93C442.359 362.06 441.629 357.24 442.069 354.95C444.479 342.28 447.019 340.96 455.259 341.04C469.309 341.18 480.519 346.86 479.419 362.44C479.199 365.22 478.189 372.73 477.969 375.09C477.069 384.77 478.529 391.16 479.149 400.51C479.229 401.69 478.519 402.78 477.429 403.15C470.079 405.59 447.109 398.89 441.529 398.89L440.349 398.76L440.339 398.75Z" fill="#CFC4FF"/> +<path d="M380.579 357.51C398.079 357.51 412.259 343 412.259 325.1C412.259 307.2 398.079 292.69 380.579 292.69C363.079 292.69 348.899 307.2 348.899 325.1C348.899 343 363.079 357.51 380.579 357.51Z" fill="#A693FF"/> +<path d="M388.77 335.95C388.77 336.05 388.32 336.06 385.89 335.45C385.42 335.33 384.89 335.47 384.65 335.79C383.91 336.79 386.55 337.7 388.96 338.73C390.97 339.58 393.09 340.11 395.25 340.37C396.32 340.5 397.4 340.62 397.4 340.62C399.39 340.98 400.98 341.56 402.91 343.15C404.01 344.05 406.67 340.17 407.97 337.83C409.44 335.27 407 333.81 403.08 332.04C401.22 331.2 400.15 329.46 399.26 328.3C397.87 326.48 397.56 326.7 396.83 325.92C395.51 324.51 394.37 326.31 395.39 327.73C396.07 328.67 396.54 328.89 396.78 329.7C396.78 329.73 396.73 329.73 396.7 329.72C394.84 329.22 390.81 327.08 388.84 326.34C387.95 326 387.18 327.14 387.76 327.84C388.53 328.77 391.25 330.17 392.16 330.9C392.21 330.94 392.16 331.02 392.1 331C390.84 330.52 388.83 329.75 387.46 329.2C386.75 328.92 385.41 328.36 385.04 328.64C384.79 328.83 384.65 329.13 384.72 329.39C385.05 330.58 387.88 331.72 389.71 333.1C389.76 333.14 389.73 333.21 389.67 333.2C388.65 333.07 386.9 332.33 385.76 332.08C385.24 331.96 384.41 331.59 384.12 332.27C383.57 333.55 387.47 335.12 388.75 335.95L388.76 335.96L388.77 335.95ZM390.34 327.98C390.34 327.9 390.34 327.94 390.34 327.98V327.98Z" fill="#735BD7"/> +<path d="M404.729 333.72C405.449 332.34 407.029 331.62 408.549 332L433.069 338.09C438.189 338.96 441.089 345.97 440.489 351.8C439.989 356.53 444.079 362.86 440.439 363.16C439.239 363.26 429.079 359.14 427.969 358.6L402.429 345.49C400.759 344.63 400.099 342.58 400.979 340.91L404.739 333.71L404.729 333.72Z" fill="#CFC4FF"/> +<path d="M465.92 374.9L428.95 359.09C421.34 353.29 414.64 347.72 416.95 339.85L415.37 344C416.66 338.13 424.29 336.59 433.4 338.13L462.26 341.78C465.06 342.2 467.79 343.15 470.14 344.72C474.68 347.75 477.54 352.31 475.81 358.22L476.04 361.51C473.73 369.38 473 377.55 465.91 374.89L465.92 374.9Z" fill="#CFC4FF"/> +<path d="M442.39 364.83L452.27 366.77C452.98 366.9 457.13 367.49 460.46 368.01C461.15 368.12 461.06 368.72 460.36 368.71L454.72 368.63C452.84 368.6 450.96 368.62 449.11 368.72C445.69 368.91 443.78 369 442.5 369.5L442.43 366.78L442.39 364.83Z" fill="#9C85FF"/> +</svg> diff --git a/docs/images/Person3.svg b/docs/images/Person3.svg new file mode 100644 index 0000000000..33eb8449a7 --- /dev/null +++ b/docs/images/Person3.svg @@ -0,0 +1,59 @@ +<svg width="1017" height="712" viewBox="0 0 1017 712" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g clip-path="url(#clip0_967_99)"> +<path d="M763.015 577.452H244.712C241.363 577.452 238.655 578.311 238.655 579.368C238.655 580.425 241.368 581.284 244.712 581.284H763.015C766.364 581.284 769.072 580.425 769.072 579.368C769.072 578.311 766.359 577.452 763.015 577.452Z" fill="#CFC4FF"/> +<path d="M891.512 246.384C887.635 241.75 882.645 238.167 877.172 235.626L820.396 210.828C820.05 210.661 819.71 210.503 819.369 210.335L773.29 183.363C770.414 181.681 766.765 182.184 764.458 184.577L752.451 197.027C749.671 199.908 749.773 204.502 752.674 207.261L796.99 249.392C797.234 249.616 797.737 250.038 798.434 250.612C798.525 250.734 798.611 250.861 798.703 250.983L864.743 305.498C877.66 315.178 884.032 298.937 893.494 284.236L894.993 277.366C902.087 266.339 898.967 255.292 891.512 246.374V246.384Z" fill="#CFC4FF"/> +<path d="M213.984 207.287C213.633 210.295 211.113 212.724 210.579 215.275C209.949 218.278 211.209 221.551 210.335 223.964C209.278 226.881 206.174 228.456 204.791 230.606C203.135 233.177 202.799 236.628 200.731 238.254C198.48 240.032 195.014 239.468 192.342 240.347C189.755 241.196 187.397 243.732 184.485 243.95C181.792 244.158 178.957 242.029 176.045 241.872C173.321 241.719 170.344 243.544 167.472 243.208C164.601 242.873 162.142 240.413 159.469 239.926C156.608 239.402 153.361 240.794 150.8 239.951C148.041 239.046 146.359 236.028 144.052 234.595C141.668 233.116 138.172 232.867 136.389 230.642C134.737 228.584 135.179 225.153 134.137 222.308C133.258 219.909 130.58 217.694 130.199 214.64C129.884 212.099 131.846 209.202 131.902 206.143C131.952 203.547 130.047 200.62 130.397 197.622C130.718 194.832 133.34 192.56 134.132 189.979C134.951 187.311 134.061 183.957 135.327 181.554C136.617 179.089 139.885 177.92 141.587 175.791C143.31 173.621 143.721 170.176 145.805 168.403C147.888 166.624 151.369 166.746 153.768 165.41C156.161 164.073 157.873 161.05 160.506 160.216C163.138 159.388 166.233 160.892 169.002 160.633C171.771 160.374 174.48 158.301 177.265 158.626C180.049 158.946 182.285 161.604 184.851 162.462C187.418 163.326 190.868 162.605 193.216 163.997C195.589 165.405 196.564 168.733 198.592 170.588C200.619 172.443 204.024 173.088 205.66 175.314C207.281 177.519 206.895 180.964 208.079 183.47C209.248 185.934 212.16 187.814 212.856 190.513C213.537 193.14 211.911 196.199 212.094 198.989C212.271 201.687 214.309 204.492 213.984 207.282H213.989L213.984 207.287Z" fill="#241950"/> +<path d="M221.377 535.27L218.09 534.35C215.752 531.769 223.065 530.788 219.604 530.697L185.888 531.053C180.502 531.053 177.346 534.203 177.346 539.635L175.943 558.056C175.943 562.045 179.15 565.282 183.113 565.282H244.361C248.32 565.282 251.531 562.045 251.531 558.056L251.542 556.963C251.542 547.161 245.84 542.435 236.637 540.646C233.919 540.118 223.258 537.333 221.393 535.27H221.383H221.377Z" fill="#3B38A5"/> +<path d="M213.141 538.604C217.719 538.604 221.368 534.833 221.144 530.331L212.063 364.576C211.718 357.141 206.311 351.328 199.771 351.354L166.741 351.501H136.623C130.276 351.501 125.037 357.147 124.691 364.357L115.011 532.475C114.772 537.069 118.004 541.007 122.384 541.922C123.355 542.125 124.356 542.11 125.332 541.968L130.865 541.139C138.274 540.032 145.831 540.448 153.077 542.374L157.625 543.578C160.603 544.371 163.824 543.655 166.075 541.5C167.757 539.894 168.825 537.664 168.901 535.179L169.876 380.964C169.927 380.334 171.503 380.354 171.503 380.943L172.849 534.61C172.976 538.878 176.523 542.262 180.858 542.262L213.12 538.593H213.126L213.141 538.604Z" fill="#8770EC"/> +<path d="M127.374 536.169H152.686C163.032 536.169 171.426 544.569 171.426 554.91V558.559C171.426 562.273 168.408 565.287 164.698 565.287H115.367C111.652 565.287 108.639 562.268 108.639 558.559V554.91C108.639 544.564 117.038 536.169 127.379 536.169H127.374Z" fill="#3B38A5"/> +<path d="M118.639 356.771C118.619 357.126 118.598 357.477 118.624 357.833C118.893 361.878 122.186 365.064 126.195 365.023L203.298 364.241C209.904 364.241 214.96 357.721 213.964 350.48L211.555 317.734L218.054 285.299C218.054 258.58 198.511 236.922 174.399 236.922H162.259C138.147 236.922 122.846 265.201 122.846 291.915L120.423 339.742L118.644 356.766L118.639 356.771Z" fill="#BBABFF"/> +<path d="M123.639 337.689L197.769 339.351C216.083 336.292 247.436 336.449 243.437 318.583L237.623 306.854C231.973 295.456 227.44 299.771 216.509 268.982C209.939 250.485 195.619 236.942 175.227 236.942H162.909C138.437 236.942 118.598 256.486 118.598 280.598L123.634 337.694L123.639 337.689Z" fill="#BBABFF"/> +<path d="M166.802 356.933L121.139 343.894C113.883 341.82 108.171 336.973 104.827 330.844C100.894 323.629 100.635 314.964 103.811 307.383L122.552 262.625L141.272 281.599L166.802 356.933Z" fill="#BBABFF"/> +<path d="M118.954 353.346C132.822 346.384 148.097 346.338 158.387 344.727C158.9 344.646 158.849 343.894 158.331 343.889C153.478 343.818 144.56 344.545 136.308 344.565C129.132 344.585 122.394 343.935 120.001 343.518L118.959 353.346H118.954Z" fill="#8770EC"/> +<path d="M145.109 192.077C149.149 176.599 175.426 168.067 193.897 182.092C209.101 193.638 211.86 216.591 200.554 232.725C199.375 234.412 198.069 235.977 196.661 237.41C195.645 238.447 193.922 238.381 193.008 237.263C192.205 236.282 191.565 235.144 191.051 234.005C190.05 231.805 189.415 229.437 188.973 227.069C188.78 226.017 188.622 224.955 188.51 223.888C188.373 222.602 188.414 221.307 188.429 220.021C188.455 217.81 188.429 215.351 187.144 213.481C187.169 213.395 187.189 213.298 187.22 213.212C186.971 213.034 186.722 212.861 186.468 212.688C185.98 212.211 185.421 211.845 184.831 211.499C184.618 211.377 184.394 211.271 184.181 211.154C178.815 207.683 180.588 207.744 175.807 202.901C174.399 201.478 173.073 199.979 171.685 198.541C170.883 197.713 170.024 196.859 169.013 196.326C168.205 195.899 167.326 195.726 166.446 195.609C164.968 195.406 157.538 194.608 153.768 194.7C152.741 194.725 151.73 194.532 150.719 194.39C149.682 194.247 148.646 194.039 147.629 193.739L145.693 193.053C145.49 192.967 145.302 192.87 145.17 192.687C145.033 192.504 144.992 192.296 145.114 192.072L145.104 192.083L145.109 192.077Z" fill="#332711"/> +<path d="M189.913 243.889C181.747 254.276 163.342 258.498 154.439 250.53C145.531 242.557 147.203 226.139 156.1 216.367C164.998 206.59 179.43 205.132 188.343 213.105C195.681 219.67 191.188 219.243 190.147 229.457C189.852 232.338 192.052 241.185 189.923 243.894H189.918L189.913 243.889Z" fill="#3C23A0"/> +<path d="M197.64 229.564C186.639 245.261 165.027 255.556 150.453 244.052C142.261 237.588 140.493 226.749 141.113 215.377C141.596 206.514 143.12 197.286 146.754 189.857C155.174 172.641 178.493 170.766 193.067 182.27C207.641 193.775 208.642 213.862 197.64 229.554V229.564Z" fill="#8770EC"/> +<path d="M145.109 192.077C149.149 176.599 175.425 168.067 193.897 182.092C209.101 193.638 211.86 216.591 200.554 232.725C199.375 234.412 198.069 235.977 196.661 237.41C195.645 238.447 193.922 238.381 193.007 237.263C192.205 236.282 191.564 235.144 191.051 234.005C190.05 231.805 189.415 229.437 188.973 227.069C188.78 226.017 188.622 224.955 188.51 223.888C188.373 222.602 188.414 221.307 188.429 220.021C188.454 217.81 189.029 215.778 187.738 213.908C187.763 213.821 187.194 213.293 187.22 213.217C186.971 213.039 186.722 212.866 186.468 212.693C185.98 212.216 185.421 211.85 184.831 211.504C184.618 211.382 184.394 211.276 184.181 211.159C178.617 208.222 180.365 210.452 175.593 205.61C174.185 204.187 173.083 199.984 171.69 198.546C170.887 197.718 170.029 196.864 169.017 196.331C168.21 195.904 167.33 195.731 166.451 195.614C164.973 195.411 157.543 194.613 153.773 194.705C152.746 194.73 151.735 194.537 150.724 194.395C149.687 194.252 148.651 194.044 147.634 193.744L145.698 193.058C145.495 192.972 145.307 192.875 145.175 192.692C145.038 192.509 144.997 192.301 145.119 192.077H145.104H145.109Z" fill="#241950"/> +<path d="M142.365 192.367C146.405 176.889 172.681 168.357 191.153 182.382C206.357 193.927 209.116 216.88 197.81 233.014C196.631 234.701 195.325 236.267 193.917 237.7C192.901 238.736 191.636 239.366 190.721 238.238C189.918 237.257 188.831 235.428 188.312 234.29C187.311 232.09 186.676 229.722 186.234 227.354C186.041 226.302 185.883 225.24 185.772 224.172C185.634 222.887 185.675 221.591 185.69 220.305C185.716 218.095 186.29 216.062 184.999 214.192C185.025 214.106 184.455 213.577 184.481 213.501C184.232 213.323 183.983 213.151 183.729 212.978C183.241 212.5 182.682 212.134 182.092 211.789C181.879 211.667 181.655 211.56 181.442 211.443C175.878 208.506 177.626 210.737 172.854 205.894C171.447 204.471 170.344 200.269 168.952 198.831C168.149 198.002 167.29 197.149 166.279 196.615C165.471 196.188 164.592 196.016 163.713 195.899C162.234 195.695 154.805 194.898 151.034 194.989C150.008 195.015 148.996 194.821 147.985 194.679C146.948 194.537 145.912 194.329 144.896 194.029L142.959 193.343C142.756 193.256 142.568 193.16 142.436 192.977C142.299 192.794 142.258 192.586 142.38 192.362L142.365 192.372V192.367Z" fill="#241950"/> +<path d="M203.486 325.773L200.051 284.597C200.03 284.028 200.854 283.932 200.965 284.486L210.061 329.605C210.143 329.991 209.726 330.291 209.385 330.103L201.57 325.804" fill="#8770EC"/> +<path d="M147.015 227.506C147.609 227.313 148.417 227.806 149.601 227.598C150.048 227.516 150.495 228.192 150.983 228.304C151.578 228.451 152.284 228.03 152.828 228.416C154.479 229.59 156.385 228.787 157.457 229.437C157.899 229.707 157.894 230.296 157.447 230.515C154.571 231.927 147.574 231.384 146.639 228.248C146.542 227.938 146.7 227.613 147.02 227.506H147.015Z" fill="#4A32AE"/> +<path d="M149.332 233.126C149.464 233.304 149.586 233.497 149.738 233.66C149.906 233.837 150.114 233.97 150.353 234.051C150.632 234.147 150.927 234.122 151.212 234.076C151.552 234.026 151.877 233.909 152.203 233.782C152.482 233.67 152.68 233.436 152.635 233.121C152.594 232.826 152.345 232.603 152.04 232.598C151.923 232.598 151.806 232.598 151.689 232.592C151.578 232.592 151.471 232.582 151.364 232.572C151.313 232.572 151.257 232.562 151.202 232.557C151.075 232.542 151.339 232.577 151.181 232.557C150.785 232.496 150.394 232.394 150.013 232.257C149.718 232.15 149.342 232.379 149.271 232.679C149.189 233.019 149.377 233.304 149.692 233.421C150.444 233.695 151.242 233.807 152.035 233.817L151.877 232.633C151.583 232.75 151.278 232.862 150.968 232.913C150.917 232.923 150.785 232.928 151.003 232.913C150.983 232.913 150.958 232.918 150.932 232.918C150.887 232.918 150.836 232.923 150.785 232.923H150.714C150.653 232.923 150.592 232.887 150.795 232.933C150.759 232.923 150.719 232.918 150.683 232.908C150.668 232.908 150.653 232.897 150.643 232.892C150.561 232.867 150.81 232.979 150.719 232.923C150.688 232.908 150.663 232.892 150.627 232.872C150.587 232.847 150.546 232.786 150.704 232.928C150.688 232.913 150.673 232.902 150.658 232.892C150.632 232.867 150.607 232.847 150.582 232.816C150.561 232.791 150.536 232.76 150.505 232.73C150.475 232.694 150.429 232.623 150.556 232.801C150.541 232.786 150.531 232.765 150.516 232.75C150.465 232.679 150.414 232.613 150.368 232.542C150.272 232.41 150.165 232.308 150.007 232.267C149.865 232.227 149.667 232.247 149.54 232.323C149.286 232.486 149.128 232.872 149.321 233.146V233.126H149.332Z" fill="#654ECA"/> +<path d="M148.031 221.18C147.777 220.448 147.645 220.026 148.051 219.777C148.859 219.284 149.957 220.418 150.81 220.824C150.79 220.819 151.313 221.073 151.303 221.073C151.319 221.073 151.725 221.159 151.801 221.17C153.016 221.312 154.119 221.022 154.713 221.21C155.46 221.444 156.629 221.749 156.497 222.704C156.263 224.422 149.271 225.733 148.031 221.18Z" fill="#654ECA"/> +<path d="M167.549 214.375C167.285 216.133 163.743 217.012 162.391 216.748C161.04 216.484 160.15 214.837 160.42 213.079C160.689 211.321 161.995 210.101 163.352 210.371C164.703 210.635 167.818 212.617 167.554 214.38H167.549V214.375Z" fill="white"/> +<path d="M165.349 213.761C165.496 211.982 164.5 210.447 163.128 210.336C161.756 210.224 160.521 211.57 160.374 213.349C160.226 215.127 161.222 216.662 162.594 216.774C163.966 216.886 165.201 215.539 165.349 213.761Z" fill="#241950"/> +<path d="M149.702 211.479C149.453 213.207 146.384 214.136 145.154 213.903C143.93 213.669 143.137 212.078 143.381 210.356C143.63 208.633 144.824 207.419 146.044 207.647C147.268 207.881 149.941 209.746 149.692 211.474H149.697L149.702 211.479Z" fill="white"/> +<path d="M147.848 210.996C148.016 209.258 147.147 207.754 145.907 207.637C144.667 207.52 143.529 208.831 143.366 210.569C143.198 212.307 144.067 213.811 145.307 213.928C146.547 214.045 147.685 212.734 147.848 210.996Z" fill="#241950"/> +<path d="M171.294 208.938C171.086 208.557 170.689 208.232 170.374 207.942C169.993 207.596 169.582 207.286 169.16 207.002C168.377 206.478 167.503 206.067 166.614 205.772C164.653 205.127 162.488 205.096 160.511 205.726C160.44 205.747 160.379 205.772 160.308 205.813C160.262 205.838 160.232 205.874 160.191 205.904C159.429 206.473 159.688 207.632 160.618 207.891C161.131 208.033 161.67 208.13 162.188 208.252C164.343 208.76 166.482 209.36 168.586 210.056C169.048 210.208 169.505 210.391 169.978 210.508C170.893 210.747 171.797 209.848 171.304 208.933L171.294 208.943V208.938ZM170.349 208.852C170.466 208.852 170.491 208.897 170.349 208.852V208.852Z" fill="#241950"/> +<path d="M148.259 202.83C146.537 202.103 144.611 202.408 143.295 203.77C143.259 203.811 143.224 203.857 143.198 203.897H143.193C142.898 204.319 143.036 204.959 143.473 205.223C143.656 205.335 143.854 205.356 144.057 205.361C144.494 205.376 144.936 205.391 145.373 205.406C145.825 205.422 146.283 205.442 146.735 205.457C146.765 205.457 146.811 205.462 146.842 205.457C146.938 205.478 147.035 205.493 147.131 205.508C148 205.661 148.859 205.828 149.733 205.976C150.744 206.138 151.202 205.03 150.511 204.339C149.865 203.694 149.093 203.171 148.259 202.815V202.825V202.83Z" fill="#241950"/> +<path d="M197.311 519.766L254.148 576.603C261.491 583.946 273.397 583.946 280.74 576.603L337.577 519.766C344.92 512.423 344.92 500.517 337.577 493.175L280.74 436.337C273.397 428.995 261.491 428.995 254.148 436.337L197.311 493.175C189.968 500.517 189.968 512.423 197.311 519.766Z" fill="#503EBA"/> +<path d="M499.684 519.497L556.521 576.334C563.864 583.677 575.77 583.677 583.113 576.334L639.95 519.497C647.293 512.154 647.293 500.248 639.95 492.905L583.113 436.068C575.77 428.725 563.864 428.725 556.521 436.068L499.684 492.905C492.341 500.248 492.341 512.154 499.684 519.497Z" fill="#8770EC"/> +<path d="M418.664 581.507C460.038 581.507 493.581 547.964 493.581 506.59C493.581 465.216 460.038 431.673 418.664 431.673C377.29 431.673 343.747 465.216 343.747 506.59C343.747 547.964 377.29 581.507 418.664 581.507Z" fill="#A693FF"/> +<path d="M721.057 581.507C762.431 581.507 795.974 547.964 795.974 506.59C795.974 465.216 762.431 431.673 721.057 431.673C679.683 431.673 646.14 465.216 646.14 506.59C646.14 547.964 679.683 581.507 721.057 581.507Z" fill="#A693FF"/> +<path d="M266.949 430.834C308.323 430.834 341.866 397.291 341.866 355.917C341.866 314.543 308.323 281 266.949 281C225.575 281 192.032 314.543 192.032 355.917C192.032 397.291 225.575 430.834 266.949 430.834Z" fill="#A693FF"/> +<path d="M197.311 218.512L254.148 275.349C261.491 282.692 273.397 282.692 280.74 275.349L337.577 218.512C344.92 211.169 344.92 199.263 337.577 191.92L280.74 135.083C273.397 127.74 261.491 127.74 254.148 135.083L197.311 191.92C189.968 199.263 189.968 211.169 197.311 218.512Z" fill="#503EBA"/> +<path d="M209.883 351.379C213.364 351.78 231.953 354.098 231.561 348.472C231.485 347.405 230.677 346.491 229.701 346.12C228.223 345.561 225.53 348.655 224.437 348.991C224.279 349.036 224.3 349.031 224.457 349.016C227.694 348.681 236.201 346.953 236.094 343.264C236.064 342.105 235.21 341.074 234.138 340.687C231.78 339.844 227.577 341.013 225.087 340.408C224.945 340.372 225.113 340.438 225.092 340.489C223.726 344.001 238.061 341.541 237.868 337.501C237.74 334.833 235.378 334.422 233.772 334.198C230.662 333.766 225.956 332.974 223.141 332.521C222.984 332.496 222.887 332.892 223.141 332.857C225.738 332.476 233.243 335.804 235.693 334.579C237.532 333.66 237.339 330.758 235.433 329.686C231.429 327.43 223.868 325.372 219.935 324.233C219.676 324.157 218.237 323.771 217.501 323.578C216.479 323.309 218.197 322.292 219.325 319.508C221.363 314.477 218.507 309.827 215.773 314.751C214.848 316.423 213.496 316.25 212.094 318.141C210.468 320.341 206.021 321.997 204.355 322.892C198.048 326.276 194.532 323.781 193.165 334.605C192.591 339.158 192.703 338.487 192.327 341.897C191.991 344.925 192.774 346.333 197.52 346.333C200.528 346.333 206.545 351.013 209.883 351.399V351.384V351.379ZM229.773 327.684C229.773 327.684 229.762 327.689 229.757 327.694C229.803 327.587 229.849 327.501 229.773 327.684Z" fill="#8770EC"/> +<path d="M197.464 346.44C195.96 346.196 180.329 344.839 162.203 344.839C154.977 344.839 152.899 343.269 153.011 341.409C153.819 328.349 157.889 324.523 160.15 321.85C162.533 319.025 165.359 318.705 169.698 319.467L203.587 325.9L197.459 346.445" fill="#8770EC"/> +<path d="M499.684 218.242L556.521 275.079C563.864 282.422 575.77 282.422 583.113 275.079L639.95 218.242C647.293 210.899 647.293 198.993 639.95 191.65L583.113 134.813C575.77 127.47 563.864 127.47 556.521 134.813L499.684 191.65C492.341 198.993 492.341 210.899 499.684 218.242Z" fill="#8770EC"/> +<path d="M418.664 280.248C460.038 280.248 493.581 246.704 493.581 205.33C493.581 163.956 460.038 130.413 418.664 130.413C377.29 130.413 343.747 163.956 343.747 205.33C343.747 246.704 377.29 280.248 418.664 280.248Z" fill="#A693FF"/> +<path d="M721.057 280.248C762.431 280.248 795.974 246.704 795.974 205.33C795.974 163.956 762.431 130.413 721.057 130.413C679.683 130.413 646.14 163.956 646.14 205.33C646.14 246.704 679.683 280.248 721.057 280.248Z" fill="#A693FF"/> +<path d="M789.805 341.826L732.968 284.989C725.625 277.646 713.719 277.646 706.376 284.989L649.544 341.826C642.196 349.169 642.196 361.075 649.544 368.417L706.376 425.255C713.719 432.597 725.625 432.597 732.968 425.255L789.805 368.417C797.148 361.075 797.148 349.169 789.805 341.826Z" fill="#503EBA"/> +<path d="M487.432 342.09L430.595 285.253C423.252 277.91 411.346 277.91 404.003 285.253L347.166 342.09C339.823 349.433 339.823 361.339 347.166 368.682L404.003 425.519C411.346 432.862 423.252 432.862 430.595 425.519L487.432 368.682C494.78 361.339 494.78 349.433 487.432 342.09Z" fill="#8770EC"/> +<path d="M568.452 429.924C609.826 429.924 643.37 396.381 643.37 355.007C643.37 313.633 609.826 280.09 568.452 280.09C527.078 280.09 493.535 313.633 493.535 355.007C493.535 396.381 527.078 429.924 568.452 429.924Z" fill="#A693FF"/> +<path d="M838.933 578.423L892.681 578.824C899.241 578.87 904.414 573.56 904.094 567.284C904.074 566.878 904.013 566.471 903.947 566.07L900.923 547.568C900.7 545.484 898.845 543.929 896.695 544.016L844.355 546.064C843.827 546.084 843.314 546.201 842.831 546.414L834.365 550.149C828.399 552.781 824.608 557.421 824.786 563.793L824.979 570.872C825.188 578.301 831.27 578.372 838.928 578.428L838.933 578.423Z" fill="#CFC4FF"/> +<path d="M807.534 579.759L849.589 580.715C855.26 580.755 859.559 573.946 858.807 566.115L855.718 543.213C855.479 540.718 853.888 538.858 852.084 538.965L819.298 540.377C818.861 540.403 818.424 540.545 818.028 540.804L814.771 548.365C811.823 551.704 807.448 553.645 804.328 555.754C799.861 558.778 790.928 561.644 791.162 567.523L791.401 571.908C791.761 580.816 801.111 579.708 807.529 579.759H807.534Z" fill="#CFC4FF"/> +<path d="M855.84 236.175C844.183 228.055 845.458 216.189 851.881 205.94C853.431 202.632 857.557 196.132 859.209 189.216C859.529 188.302 863.721 192.58 864.046 191.666C864.326 191.828 864.453 192.113 864.682 192.433C864.809 192.718 867.365 192.255 867.39 192.509C867.883 193.851 864.58 197.977 866.282 199.1C873.508 196.539 874.799 199.623 882.177 203.064C901.96 212.861 896.655 240.413 873.346 240.743C874.24 241.546 875.089 242.293 876.1 242.867C874.84 242.629 874.077 241.495 873.112 240.759C867.212 241.013 860.743 239.453 855.845 236.18L855.84 236.175Z" fill="#796AE2"/> +<path d="M913.998 201.148C911.96 187.245 897.58 174.648 881.603 175.959C871.775 175.933 856.368 182.006 857.73 194.268C857.882 195.629 860.794 197.825 861.079 198.811C863.172 206.118 866.465 203.384 869.982 202.119C877.746 199.329 880.912 205.986 877.833 210.437C875.988 213.095 872.634 214.563 870.749 216.347C867.105 219.787 865.469 223.293 866.43 231.033C867.309 238.071 876.72 239.321 882.98 243.132C892.274 243.32 900.745 237.705 906.299 230.021C906.31 230.021 906.325 230.032 906.335 230.037C912.291 222.765 916.351 210.346 914.003 201.153H913.998V201.148Z" fill="#241950"/> +<path d="M856.699 201.595C856.612 201.519 856.531 201.473 856.45 201.438C856.338 201.615 856.226 201.793 856.124 201.976C856.063 202.088 856.008 202.205 855.947 202.317C855.891 202.418 855.82 202.505 855.743 202.596C855.596 202.774 855.423 202.937 855.266 203.109C854.976 203.435 854.768 203.816 854.615 204.227C854.458 204.639 854.346 205.066 854.229 205.493C854.138 205.818 854.046 206.148 853.929 206.463C855.408 206.941 858.279 207.469 859.041 206.341C859.905 205.071 857.649 202.408 856.694 201.6H856.699V201.595Z" fill="white"/> +<path d="M856.83 204.761C856.165 206.153 855.062 206.931 853.98 206.453C852.902 205.975 852.516 204.456 853.187 203.064C853.853 201.671 855.027 200.686 856.404 201.417C857.445 201.971 857.501 203.369 856.836 204.756H856.83V204.761Z" fill="#241950"/> +<path d="M857.257 549.067C857.954 558.173 857.237 558.676 867.908 557.456C875.068 556.638 883.021 556.013 891.7 556.232C893.662 556.277 899.714 557.156 901.675 556.374C905.725 555.276 908.667 551.038 908.449 546.119L903.881 504.019C900.318 471.73 893.331 425.524 897.036 390.029C896.868 379.475 905.461 349.372 887.914 348.472C873.046 348.513 842.861 348.416 827.932 348.31C821.722 348.279 819.938 351.587 819.613 359.703L807.631 547.715C807.418 552.629 810.883 556.75 815.233 556.75L845.773 560.215C851.907 560.912 857.242 555.723 857.247 549.067H857.257Z" fill="#503EBA"/> +<path d="M819.629 355.648C818.389 355.505 817.494 354.388 817.626 353.148L821.57 321.108C823.165 308.521 824.517 302.662 824.222 289.989C823.933 277.478 822.368 267.214 823.292 262.345C828.42 235.352 833.847 232.542 851.383 232.71C881.303 232.994 905.182 245.119 902.844 278.307C902.382 284.232 900.217 300.233 899.749 305.244C897.834 325.865 900.938 339.468 902.255 359.388C902.417 361.898 900.923 364.23 898.586 365.008C882.929 370.217 834.014 355.937 822.129 355.937L819.623 355.653L819.629 355.648Z" fill="#CFC4FF"/> +<path d="M745.814 218.7C747.836 221.281 750.957 216.296 755.073 211.662C759.682 206.641 763.051 206.067 747.77 197.937C743.609 195.721 741.657 188.836 740.245 185.761C738.024 180.944 737.221 181.29 735.971 179.171C733.7 175.314 730.214 178.81 731.814 182.509C732.876 184.974 733.827 185.711 733.959 187.667C733.959 187.723 733.837 187.713 733.776 187.677C729.843 185.614 721.829 178.759 717.759 176.076C715.914 174.861 713.617 177.047 714.578 178.927C715.843 181.412 721.265 185.955 722.952 188.038C723.049 188.16 722.906 188.317 722.779 188.231C720.193 186.513 716.046 183.769 713.226 181.828C711.773 180.827 709.029 178.891 708.048 179.343C707.392 179.648 706.92 180.248 706.955 180.883C707.093 183.724 712.901 187.733 716.331 191.768C716.417 191.869 716.311 192.017 716.189 191.971C713.963 191.178 710.391 188.612 707.941 187.469C706.834 186.945 705.146 185.68 704.145 187.067C702.265 189.664 710.264 195.193 712.718 197.698L712.708 197.713C712.647 197.947 711.625 197.723 706.457 195.137C705.446 194.629 704.211 194.664 703.495 195.274C701.315 197.144 706.813 200.549 711.737 204.08C715.086 206.484 718.999 207.993 722.917 209.37C724.629 209.975 726.382 210.463 728.156 210.854C732.871 211.891 738.07 215.097 742.216 217.567L745.804 218.675V218.685L745.814 218.7Z" fill="#796AE2"/> +<path d="M747.4 199.502C749.336 196.793 752.877 195.757 755.962 197.007L805.883 217.104C816.417 220.443 820.472 236.109 817.469 248.214C815.03 258.046 821.768 272.61 814.014 272.168C811.447 272.021 791.233 260.333 789.063 258.875L739.061 223.675C735.788 221.368 735.016 216.84 737.343 213.583L747.405 199.512L747.4 199.502Z" fill="#CFC4FF"/> +<path d="M864.296 304.461L790.994 260.191C776.664 245.703 764.164 231.978 771.369 216.052L766.821 224.33C771.273 212.312 787.823 211.337 806.574 217.282L866.369 233.513C872.162 235.225 877.619 238.035 882.132 242.055C890.806 249.789 895.512 260.262 890.105 272.204L889.622 279.226C882.411 295.152 878.483 312.15 864.29 304.461H864.296Z" fill="#CFC4FF"/> +</g> +<defs> +<clipPath id="clip0_967_99"> +<rect width="1016.31" height="711.417" fill="white"/> +</clipPath> +</defs> +</svg> diff --git a/docs/images/Personer.svg b/docs/images/Personer.svg new file mode 100644 index 0000000000..d4b77dc8bc --- /dev/null +++ b/docs/images/Personer.svg @@ -0,0 +1,55 @@ +<svg width="1017" height="712" viewBox="0 0 1017 712" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M309.329 302.27L262.169 308.659C257.879 309.239 253.989 306.369 253.629 302.359L252.309 287.77C251.939 283.74 254.179 269.569 258.509 269.399L298.029 281.529C300.289 281.979 312.119 282.57 314.409 282.8C320.739 283.45 318.739 283.16 319.019 286.3L315.889 294.609C316.229 298.359 313.349 301.73 309.339 302.27H309.329Z" fill="#4A32AE"/> +<path d="M754.909 183.31C754.909 186.94 757.979 194.769 756.909 197.279C754.309 203.389 748.599 199.05 742.389 199.05C733.639 199.05 726.539 191.949 726.539 183.199C726.539 174.449 733.639 167.35 742.389 167.35C751.139 167.35 754.909 174.55 754.909 183.3V183.31Z" fill="#3C23A0"/> +<path d="M723.548 183.96C723.548 187.59 721.618 192.53 722.688 195.04C725.288 201.15 732.088 199.05 738.288 199.05C747.038 199.05 754.138 191.949 754.138 183.199C754.138 174.449 747.038 167.35 738.288 167.35C729.538 167.35 723.548 175.21 723.548 183.96Z" fill="#3C23A0"/> +<path d="M280.431 214.16C280.361 214.16 280.301 214.16 280.231 214.16C279.101 214.08 278.101 213.36 277.421 212.11C276.791 210.96 276.501 209.49 276.611 207.96C276.841 204.64 278.791 202.16 281.041 202.32C283.301 202.48 284.891 205.2 284.661 208.52C284.441 211.74 282.601 214.17 280.431 214.17V214.16ZM280.841 203.62C279.411 203.62 278.081 205.61 277.921 208.05C277.831 209.33 278.061 210.55 278.571 211.48C279.031 212.31 279.651 212.8 280.311 212.84C281.771 212.94 283.171 210.92 283.341 208.42C283.511 205.92 282.411 203.73 280.941 203.63C280.901 203.63 280.871 203.63 280.831 203.63L280.841 203.62Z" fill="#241950"/> +<path d="M472.839 552.819C467.969 552.819 464.019 548.87 464.019 544V449.05C464.019 430.32 479.749 415.08 499.079 415.08H612.639C622.239 415.08 630.039 407.76 630.039 398.76V234.1C630.039 225.1 622.229 217.779 612.639 217.779H373.399C363.799 217.779 355.999 225.1 355.999 234.1V282.76C355.999 287.63 352.049 291.58 347.179 291.58C342.309 291.58 338.359 287.63 338.359 282.76V234.1C338.359 215.37 354.089 200.13 373.409 200.13H612.649C631.979 200.13 647.699 215.37 647.699 234.1V398.76C647.699 417.49 631.969 432.729 612.649 432.729H499.089C489.489 432.729 481.679 440.05 481.679 449.05V544C481.679 548.87 477.729 552.819 472.859 552.819H472.839Z" fill="#735BD7"/> +<path d="M827.799 561.859H477.019C472.239 561.859 468.359 557.979 468.359 553.199C468.359 548.419 472.239 544.54 477.019 544.54H827.799C841.299 544.54 852.289 535.599 852.289 524.619V371.01C852.289 366.23 856.169 362.35 860.949 362.35C865.729 362.35 869.609 366.23 869.609 371.01V524.619C869.609 545.149 850.859 561.859 827.809 561.859H827.799Z" fill="#CFC4FF"/> +<path d="M793.46 263.22C786.35 257.67 782.11 266.719 780.16 271.869C777.43 279.039 789.56 281.05 797.06 277.85C804.56 274.65 812.11 278.009 812.11 274.779C812.11 270.149 806.28 273.24 793.47 263.22H793.46Z" fill="#8770EC"/> +<path d="M168.859 484.01C163.709 484.01 159.539 479.839 159.539 474.689V169.489C159.539 143.859 180.399 123 206.029 123H595.339C620.969 123 641.829 143.859 641.829 169.489V216.26C641.829 221.41 637.659 225.58 632.509 225.58C627.359 225.58 623.189 221.41 623.189 216.26V169.489C623.189 154.139 610.699 141.649 595.349 141.649H206.039C190.689 141.649 178.199 154.139 178.199 169.489V474.689C178.199 479.839 174.029 484.01 168.879 484.01H168.859Z" fill="#CFC4FF"/> +<path d="M728.328 205.69L763.688 256.51C774.378 271.5 777.778 272.68 782.438 271.8C784.848 271.34 787.168 270.41 789.278 269.14L795.008 265.68C796.118 265.49 796.678 264.21 796.038 263.31C794.208 260.71 792.548 258.48 791.028 256.5C781.138 243.57 772.948 229.42 766.688 214.36L763.478 206.659C761.178 202.379 758.568 199.79 754.408 198.25C749.058 196.27 739.618 195 734.598 198.77L728.318 205.699L728.328 205.69Z" fill="#BBABFF"/> +<path d="M678.13 221.159C684.08 228.689 675.53 232.669 670.36 231.889C658.51 230.109 659.99 221.539 663.47 212.599C666.95 203.659 662.69 194.79 665.7 195.96C670.57 197.85 671.48 212.739 678.13 221.149V221.159Z" fill="#8770EC"/> +<path d="M763.38 355.34C765.75 355.99 766.04 353.27 765.71 351.29C765.21 348.38 765 345.43 764.85 342.48L760.85 262.489C760.67 258.489 757.8 255.36 754.32 255.38L736.79 255.46H720.8C717.43 255.46 714.65 258.5 714.46 262.38L710.43 347.85C710.29 350.67 709.61 354.8 712.44 354.8C719.39 353.96 726.43 354.37 733.24 356L733.9 356.159C734.35 356.269 734.82 356.25 735.29 356.18C738.25 355.74 737.22 352.86 737.29 350.52L737.26 278.9C737.28 278.21 737.93 278.27 737.95 278.96L740.41 350.26C740.43 350.92 740.44 351.59 740.44 352.25C740.46 354.62 740.95 355.46 742.53 355.23C745.93 354.75 749.39 354.76 752.82 354.9L763.38 355.33V355.34Z" fill="#4A32AE"/> +<path d="M714.1 350.01H726.58C732.33 350.01 737.01 354.679 737.01 360.439V362.34C737.01 363.28 736.25 364.04 735.31 364.04H705.37C704.43 364.04 703.67 363.28 703.67 362.34V360.439C703.67 354.689 708.34 350.01 714.1 350.01Z" fill="#241950"/> +<path d="M750.27 350.13H756.51C762.26 350.13 766.94 354.8 766.94 360.56V362.31C766.94 363.25 766.18 364.01 765.24 364.01H741.55C740.61 364.01 739.85 363.25 739.85 362.31V360.56C739.85 354.81 744.52 350.13 750.28 350.13H750.27Z" fill="#241950"/> +<path d="M714.74 266.05C714.04 265.99 713.5 265.34 713.52 264.58L714.11 259.54C714.87 253.11 715.85 245.879 715.77 239.399C715.73 236.309 715.32 234.989 715.24 231.689C715.08 224.749 713.38 216.15 713.89 213.46C716.69 198.49 724.03 194.989 733.6 194.989H740.69C743.78 196.739 747.82 196.74 751.68 197.79C758.53 199.66 762.84 207.39 764.04 214.96C764.36 216.95 764.39 218.97 764.23 220.97L763.9 225.22C763.69 227.93 759.18 230.089 758.78 231.949C756.72 241.309 759.66 237.37 760.51 247.58C760.87 251.86 761.05 261.22 762.22 265.35C762.24 266.11 761.7 266.749 761 266.819L759.34 266.97C743.86 268.41 731.17 267.6 715.69 266.14L714.74 266.05Z" fill="#BBABFF"/> +<path d="M749.171 213.5L707.551 246.72C701.941 251 693.921 249.93 689.641 244.32L686.911 239.43C682.631 233.82 690.811 229.89 696.421 225.6L716.741 201.02C718.441 199.19 720.521 197.701 722.861 196.831C729.501 194.361 736.451 196.83 740.821 202.55L749.181 213.5H749.171Z" fill="#BBABFF"/> +<path d="M265.74 480.899C251.56 478.379 228.83 477.119 220.93 476.849C218.79 476.779 219.42 474.43 219.7 473.01C220.29 470.06 220.89 464.139 222.55 459.409C226.02 453.959 264.14 458.119 268.92 461.199C278.51 464.789 279.12 483.579 265.74 480.899Z" fill="#241950"/> +<path d="M264.728 459.4L282.628 306.44C268.188 310.97 252.828 311.81 237.968 309.26C231.998 308.25 247.158 299.74 241.348 297.73C241.278 297.7 233.718 302.82 233.648 302.8C230.238 301.9 230.528 311.449 229.998 315.989C228.258 327.199 227.848 337.12 229.978 348.36C230.768 351.62 232.878 358 232.698 361.56C231.708 381.21 230.118 398.37 227.898 417.15C226.178 431.7 222.988 445.51 221.428 457.13C221.248 458.43 222.308 459.589 223.678 459.619C229.988 460.769 232.388 461.71 249.458 459.15L264.738 459.39L264.728 459.4Z" fill="#A693FF"/> +<path d="M276.531 481.51C257.001 479.87 239.871 490.27 240.011 473.04C240.051 468.8 240.491 462.889 242.941 454.719C242.691 448.129 275.301 450.129 277.421 452.449C283.951 459.619 288.331 459.589 293.601 463.279C299.961 467.739 298.381 477.55 290.931 479.8C285.981 481.3 280.211 481.84 276.541 481.5L276.531 481.51Z" fill="#241950"/> +<path d="M268.698 461.279C269.188 461.189 269.678 461.13 270.168 461.04C273.718 460.44 281.948 455.98 281.948 453.25C281.928 451.99 281.108 448.89 281.128 438.18C281.188 414.07 282.328 392.319 282.098 374.369L281.048 315.42C280.508 310.88 294.258 303.75 289.998 304.93C278.018 308.83 265.558 310.92 252.958 310.67C246.758 310.55 240.548 309.86 234.388 308.58C231.498 307.98 233.178 313.87 230.318 313.01L240.898 421.699C241.718 427.929 235.888 444.51 236.258 454.06C237.488 461.3 246.138 462.09 252.018 462.08C257.988 462.27 262.068 462.49 268.678 461.27L268.698 461.279Z" fill="#A693FF"/> +<path d="M271.669 229.56C275.839 227.77 279.039 224.52 280.339 220.55C280.989 218.55 281.269 216.38 281.149 214.14C281.149 213.15 281.079 212.16 280.949 211.18C280.809 210.31 280.689 209.089 280.609 208.149C280.369 205.389 281.089 200.78 281.019 199.92C281.019 199.18 279.979 200.229 279.979 199.489C279.769 199.549 279.629 199.74 279.429 199.92C279.289 200.11 279.149 200.23 279.079 200.42C278.589 200.98 277.979 204.699 277.429 205.189L277.079 205.5L277.009 205.56C273.139 202.16 267.679 200.74 262.429 201.72C254.069 203.38 248.879 211.029 250.809 218.939C251.909 223.449 255.299 227.28 259.999 229.26C259.519 229.57 258.959 229.82 258.479 230L258.339 230.06C258.199 230.19 258.059 230.25 257.859 230.25C258.069 230.31 258.279 230.249 258.479 230.189C259.029 229.939 259.589 229.63 260.139 229.33C263.039 230.51 266.289 230.819 269.469 230.199C270.229 230.069 270.989 229.89 271.679 229.58L271.669 229.56Z" fill="#A693FF"/> +<path d="M283.625 207.059L276.119 207.299L276.161 208.618L283.667 208.379L283.625 207.059Z" fill="#1B380E"/> +<path d="M283.625 207.059L276.119 207.299L276.161 208.618L283.667 208.379L283.625 207.059Z" fill="#241950"/> +<path d="M281.34 196C279.39 188.51 273.83 183.15 267.05 180.59C264.05 179.29 260.75 178.569 257.28 178.569C250.55 178.569 244.46 181.279 239.95 185.699C238.99 186.489 238.14 187.339 237.51 188.239C236.88 189.119 236.35 189.99 235.88 190.85C233.49 194.82 232.1 199.49 232.09 204.51C232.09 207.71 232.99 212.499 233.71 214.649H233.74C236.22 223.449 242.73 231.12 252.31 231.68C258.1 233.27 264.95 231.16 267.57 225.47C271.73 218.5 262.59 212 267.08 207.14C269.89 205.48 271.12 209.41 273.42 209.97C275.13 210.22 277.08 209.1 277.69 207.59C279.5 203.09 282.53 199.89 281.35 196H281.34Z" fill="#241950"/> +<path d="M674.689 218.489C675.929 216.209 678.639 215.279 680.759 216.409L704.589 226.69C709.719 229.47 711.449 236.21 708.449 241.75C705.449 247.28 700.229 251.279 695.089 248.489L669.959 236.48C667.809 235.34 667.069 232.52 668.319 230.22L674.679 218.5L674.689 218.489Z" fill="#BBABFF"/> +<path d="M863.048 368.52C857.958 368.52 853.838 364.4 853.838 359.31V308.83C853.838 300.99 847.458 294.619 839.618 294.619H562.528C557.438 294.619 553.318 290.499 553.318 285.409C553.318 280.319 557.438 276.199 562.528 276.199H839.618C857.618 276.199 872.258 290.84 872.258 308.84V359.319C872.258 364.409 868.138 368.529 863.048 368.529V368.52Z" fill="#A693FF"/> +<path d="M742.289 485.25H556.209C537.649 485.25 522.549 470.519 522.549 452.409V308.619C522.549 300.619 515.669 294.109 507.219 294.109C502.159 294.109 498.049 290.009 498.049 284.939C498.049 279.869 502.149 275.77 507.219 275.77C525.779 275.77 540.879 290.499 540.879 308.609V452.399C540.879 460.399 547.759 466.909 556.209 466.909H742.289C747.349 466.909 751.459 471.01 751.459 476.08C751.459 481.15 747.359 485.25 742.289 485.25Z" fill="#CFC4FF"/> +<path d="M374.849 495.399H162.369C157.219 495.399 153.049 491.23 153.049 486.08C153.049 480.93 157.219 476.76 162.369 476.76H374.849C386.859 476.76 396.629 466.989 396.629 454.979V404.06C396.629 381.77 414.769 363.63 437.059 363.63H853.329C858.479 363.63 862.649 367.799 862.649 372.949C862.649 378.099 858.479 382.27 853.329 382.27H437.059C425.049 382.27 415.279 392.04 415.279 404.05V454.97C415.279 477.26 397.139 495.399 374.849 495.399Z" fill="#3C23A0"/> +<path d="M166.039 515.79C184.399 515.79 199.289 500.9 199.289 482.54C199.289 464.18 184.399 449.29 166.039 449.29C147.679 449.29 132.789 464.18 132.789 482.54C132.789 500.9 147.679 515.79 166.039 515.79Z" fill="#4A32AE"/> +<path d="M346.18 313.56C364.54 313.56 379.43 298.67 379.43 280.31C379.43 261.95 364.54 247.06 346.18 247.06C327.82 247.06 312.93 261.95 312.93 280.31C312.93 298.67 327.82 313.56 346.18 313.56Z" fill="#A693FF"/> +<path d="M406.568 408.67C424.928 408.67 439.818 393.78 439.818 375.42C439.818 357.06 424.928 342.17 406.568 342.17C388.208 342.17 373.318 357.06 373.318 375.42C373.318 393.78 388.208 408.67 406.568 408.67Z" fill="#8770EC"/> +<path d="M861.75 404.699C880.11 404.699 895 389.809 895 371.449C895 353.089 880.11 338.199 861.75 338.199C843.39 338.199 828.5 353.089 828.5 371.449C828.5 389.809 843.38 404.699 861.75 404.699Z" fill="#4A32AE"/> +<path d="M633.789 243.1C652.159 243.1 667.039 228.21 667.039 209.85C667.039 191.49 652.159 176.6 633.789 176.6C615.419 176.6 600.539 191.49 600.539 209.85C600.539 228.21 615.429 243.1 633.789 243.1Z" fill="#A693FF"/> +<path d="M472.529 583C490.239 583 504.599 568.64 504.599 550.93C504.599 533.22 490.239 518.859 472.529 518.859C454.819 518.859 440.459 533.22 440.459 550.93C440.459 568.64 454.819 583 472.529 583Z" fill="#4A32AE"/> +<path d="M564.948 272.659L543.999 251.71C537.569 245.27 527.128 245.27 520.688 251.71L499.739 272.659C493.309 279.099 493.309 289.53 499.739 295.96L520.688 316.909C527.118 323.349 537.559 323.349 543.999 316.909L564.948 295.96C571.378 289.52 571.378 279.089 564.948 272.659Z" fill="#4A32AE"/> +<path d="M201.03 271.79L180.08 250.84C173.64 244.4 163.21 244.4 156.78 250.84L135.83 271.79C129.39 278.22 129.39 288.66 135.83 295.09L156.78 316.04C163.22 322.48 173.65 322.48 180.08 316.04L201.03 295.09C207.47 288.65 207.47 278.22 201.03 271.79Z" fill="#8770EC"/> +<path d="M773.591 462.96L752.641 442.01C746.211 435.57 735.771 435.57 729.341 442.01L708.391 462.96C701.961 469.4 701.961 479.83 708.391 486.26L729.341 507.21C735.771 513.65 746.211 513.65 752.641 507.21L773.591 486.26C780.021 479.82 780.021 469.39 773.591 462.96Z" fill="#8770EC"/> +<path d="M325.979 310.399C330.109 312.629 334.759 313.739 339.439 313.399C342.639 313.159 345.319 312.429 345.189 310.819C345.129 310.139 344.559 309.569 343.849 309.339C342.789 308.989 340.879 310.96 340.089 311.17C339.979 311.2 339.989 311.199 340.099 311.179C342.419 310.959 348.489 309.839 348.409 307.509C348.379 306.779 347.769 306.129 347.009 305.889C345.319 305.369 342.319 306.119 340.539 305.739C340.439 305.719 340.559 305.76 340.539 305.79C339.569 308.01 349.819 306.409 349.669 303.859C349.569 302.169 347.879 301.919 346.729 301.779C344.509 301.519 341.139 301.029 339.119 300.759C338.999 300.749 338.939 300.989 339.119 300.969C340.969 300.719 346.359 302.799 348.099 302.019C349.419 301.429 349.269 299.599 347.899 298.929C345.029 297.519 339.619 296.239 336.799 295.529C336.609 295.479 335.729 295.179 335.199 295.049C334.469 294.879 335.699 294.229 336.489 292.469C337.929 289.279 335.729 286.42 333.799 289.54C333.319 290.3 332.929 290.479 332.239 290.929C331.979 291.109 331.229 291.619 330.969 291.939C329.819 293.339 326.839 294.149 325.649 294.719C321.149 296.879 314.999 291.199 314.049 298.049C313.649 300.929 315.759 305.47 315.499 307.63C315.269 309.55 318.959 307.279 323.969 309.059C324.149 309.119 325.599 310.189 325.969 310.389L325.979 310.399Z" fill="#CFC4FF"/> +<path d="M256.17 225.189C271.99 224.599 277.92 234.109 279.96 252.489C282.31 268.829 270.29 283.339 274.92 299.259C274.36 303.599 285.83 304.719 286.52 309.949C286.75 311.709 286.64 312.909 283.91 312.979C282.39 313.019 284 322.339 284 322.339C284.28 324.609 282.91 324.319 281.54 324.389C263.27 325.259 247.57 327.699 229.79 323.029C227.46 322.319 227.1 320.119 227.65 317.729C236.66 278.189 218.83 226.599 256.18 225.199L256.17 225.189Z" fill="#735BD7"/> +<path d="M280.95 248.369C280.72 245.759 280.26 243.169 279.5 240.659C276.2 229.799 269.52 225.729 257.92 225.369V225.75C246.2 226.76 238.37 236.97 240.01 247.29L241.9 283.17L283.69 279.81L280.95 248.359V248.369Z" fill="#735BD7"/> +<path d="M314.12 290.619L286.32 285.909C285.14 285.709 284.25 284.74 284.15 283.56L281.01 248.52L251.67 253.369L261.08 310.359L262.38 309.479C263.56 310.769 265.21 311.63 267.1 311.76L311.3 314.72C315.05 314.97 318.35 312.229 318.78 308.489L319.95 298.38C320.38 294.66 317.82 291.249 314.13 290.619H314.12Z" fill="#735BD7"/> +<path d="M745.929 196.38C742.489 201.52 731.989 203.46 727.659 199.45C726.749 198.61 726.809 196.14 726.339 195.03C724.549 190.84 724.979 186.65 728.339 183.1C732.589 178.6 733.189 178.25 737.519 182.27C741.269 185.76 746.529 189.28 745.559 192.93C745.409 193.49 746.019 196.25 745.929 196.39V196.38Z" fill="#735BD7"/> +<path d="M724.879 170.79C727.189 162.24 739.509 154.6 751.289 163.94C754.439 166.44 758.789 188.11 752.219 194.68C749.409 196.32 748.679 190.78 748.209 188.86C747.569 186.39 748.619 183.57 747.369 181.3C747.379 181.25 747.399 181.2 747.409 181.15C744.309 179.03 743.649 180.199 741.189 177.119C739.659 175.639 738.529 173.22 736.249 172.97C734.859 172.35 725.519 172.85 724.869 170.79H724.879Z" fill="#1B380E"/> +<path d="M729.51 197.82C727.92 197.2 726.48 196.23 725.39 194.92C723.06 192.13 722.58 188.89 723.56 181.43C724.19 176.67 724.42 171.729 726.41 167.739C731.02 158.479 743.14 157.599 750.55 163.909C751.13 164.409 757.46 182.46 754.46 188.5C754.36 188.5 754.27 188.499 754.17 188.489C753.77 188.489 753.37 188.469 752.97 188.449C752.57 188.429 752.17 188.4 751.77 188.39C751.37 188.38 750.97 188.37 750.57 188.39C750.38 188.39 750.19 188.41 750.01 188.44C749.86 188.46 749.69 188.48 749.56 188.54C749.53 188.55 749.51 188.58 749.48 188.6C749.48 188.6 749.48 188.6 749.47 188.6C749.45 188.62 749.43 188.639 749.41 188.659C749.4 188.659 749.38 188.68 749.37 188.69C748.8 189.18 748.21 189.659 747.65 190.159C747.03 190.709 746.44 191.29 745.92 191.92C745.47 192.49 745.89 193.33 746.61 193.31C755.45 193.08 749.94 194.14 747.78 194.44C747.54 194.47 745.21 192.19 745.16 192.42C745.14 192.49 745.56 189.58 745.46 189.76C745.19 190.22 744.96 190.66 744.73 191.08C742.97 194.33 740.04 196.78 736.53 197.94C734.63 198.57 732.58 198.7 730.65 198.19C730.28 198.09 729.91 197.97 729.55 197.83L729.51 197.82Z" fill="#8770EC"/> +<path d="M751.151 163.699C741.291 155.469 726.051 159.59 723.721 172.6C723.721 177.54 729.901 172.43 732.451 171.6C732.521 171.58 732.591 171.56 732.671 171.56C735.111 171.36 736.341 174.68 739.231 176.79C741.001 178.09 744.261 177.14 743.701 180.25C743.501 185.24 741.491 189.879 744.101 194.489C745.481 196.939 746.361 196.44 747.941 196.65C749.421 196.84 751.031 196.589 751.991 195.239C759.351 188.229 757.121 169.26 751.151 163.69V163.699Z" fill="#3C23A0"/> +<path d="M726.13 187.819C726.44 187.709 726.89 187.939 727.52 187.799C727.76 187.749 728.02 188.069 728.28 188.119C728.6 188.179 728.97 187.949 729.28 188.119C730.2 188.669 731.199 188.219 731.799 188.509C732.049 188.639 732.049 188.929 731.819 189.049C730.309 189.819 726.519 189.729 725.949 188.189C725.889 188.039 725.97 187.869 726.14 187.809L726.13 187.819Z" fill="#4A32AE"/> +<path d="M727.55 190.63C727.69 190.8 727.84 190.96 728.06 191.01C728.39 191.09 728.74 190.96 729.04 190.83C729.11 190.8 729.19 190.759 729.23 190.689C729.26 190.629 729.28 190.559 729.27 190.489C729.25 190.339 729.12 190.21 728.96 190.22C728.78 190.22 728.61 190.22 728.44 190.22C728.41 190.22 728.38 190.22 728.35 190.22C728.26 190.22 728.33 190.22 728.35 190.22C728.29 190.22 728.23 190.199 728.17 190.189C728.07 190.169 727.97 190.139 727.86 190.119C727.7 190.069 727.51 190.18 727.48 190.34C727.44 190.5 727.53 190.68 727.7 190.72C728.11 190.84 728.54 190.879 728.97 190.859L728.89 190.239C728.73 190.299 728.57 190.369 728.4 190.409C728.37 190.409 728.26 190.419 728.38 190.409C728.35 190.409 728.33 190.409 728.3 190.409H728.24C728.18 190.409 728.33 190.429 728.28 190.409C728.28 190.409 728.26 190.409 728.25 190.409C728.23 190.409 728.22 190.41 728.2 190.39C728.31 190.42 728.25 190.41 728.22 190.39C728.21 190.39 728.19 190.369 728.17 190.359C728.27 190.429 728.21 190.389 728.18 190.359C728.12 190.299 728.06 190.23 728.01 190.17C727.9 190.04 727.68 190.05 727.57 190.17C727.45 190.3 727.45 190.479 727.57 190.609L727.55 190.63Z" fill="#735BD7"/> +<path d="M726.548 185.05C726.378 184.7 726.248 184.48 726.458 184.34C726.868 184.05 727.508 184.56 727.988 184.71C727.978 184.71 728.268 184.809 728.258 184.809C728.878 184.909 729.688 184.669 730.088 184.689C730.498 184.709 731.138 184.86 731.118 185.34C731.078 186.21 727.428 187.24 726.538 185.05H726.548Z" fill="#735BD7"/> +<path d="M727.519 180.59C727.429 181.39 725.919 181.699 725.369 181.619C724.819 181.539 724.449 180.83 724.539 180.04C724.629 179.24 725.229 178.689 725.779 178.769C726.329 178.849 727.609 179.8 727.519 180.6V180.59Z" fill="white"/> +<path d="M726.651 180.411C726.511 181.411 725.881 181.731 725.311 181.621C724.741 181.501 724.371 180.771 724.501 179.981C724.631 179.191 725.151 178.621 725.781 178.761C726.351 178.891 726.761 179.621 726.651 180.411Z" fill="#0D0D0D"/> +<path d="M735.891 182.21C735.771 183.03 734.101 183.329 733.501 183.229C732.901 183.139 732.501 182.389 732.621 181.569C732.741 180.749 733.411 180.179 734.011 180.269C734.611 180.359 736.011 181.379 735.891 182.199V182.21Z" fill="white"/> +<path d="M734.949 182.01C734.769 183.04 734.069 183.369 733.439 183.239C732.809 183.109 732.429 182.34 732.589 181.52C732.749 180.7 733.339 180.12 734.029 180.27C734.659 180.41 735.089 181.18 734.949 182V182.01Z" fill="#0D0D0D"/> +<path d="M738.129 179.409C738.019 179.179 737.819 178.99 737.659 178.83C737.469 178.63 737.258 178.449 737.048 178.279C736.658 177.979 736.228 177.74 735.788 177.58C734.828 177.22 733.769 177.24 732.829 177.65C732.799 177.66 732.769 177.68 732.729 177.71C732.709 177.73 732.688 177.75 732.668 177.77C732.308 178.13 732.468 178.82 732.918 178.97C733.168 179.05 733.428 179.099 733.688 179.159C734.748 179.429 735.789 179.76 736.829 180.14C737.059 180.22 737.279 180.33 737.509 180.39C737.959 180.52 738.379 179.96 738.119 179.42L738.129 179.409Z" fill="#4A32AE"/> +<path d="M727.039 176.199C726.199 175.759 725.27 175.949 724.64 176.769C724.62 176.789 724.609 176.82 724.589 176.84C724.449 177.09 724.509 177.48 724.719 177.64C724.809 177.7 724.91 177.72 725.01 177.72C725.22 177.72 725.44 177.74 725.64 177.75C725.86 177.75 726.079 177.769 726.309 177.779H726.359C726.359 177.779 726.45 177.799 726.5 177.809C726.92 177.899 727.34 178 727.76 178.09C728.25 178.19 728.47 177.52 728.14 177.1C727.83 176.71 727.449 176.39 727.039 176.18V176.199Z" fill="#4A32AE"/> +</svg> diff --git a/docs/images/favicon.ico b/docs/images/favicon.ico new file mode 100644 index 0000000000..c01d54bcd3 Binary files /dev/null and b/docs/images/favicon.ico differ diff --git a/docs/images/logo.svg b/docs/images/logo.svg new file mode 100644 index 0000000000..4a9bc2d73f --- /dev/null +++ b/docs/images/logo.svg @@ -0,0 +1 @@ +<svg fill="none" viewBox="0 0 75 48" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#a)" fill="currentColor"><path d="m52.262 1.63c-6.4928 0-12.331 2.769-16.409 7.1748l9.9983 9.9983c2.8644 2.8644 2.8644 7.5294 0 10.394l-9.9983 9.9983c4.092 4.4058 9.9301 7.1748 16.409 7.1748 12.358 0 22.37-10.012 22.37-22.37 0-12.358-10.012-22.37-22.37-22.37z"/><path d="m29.893 24c0-5.8653 2.2643-11.212 5.9608-15.195l-6.6565-6.6564c-2.8644-2.8645-7.5294-2.8645-10.394 0l-16.655 16.655c-2.8645 2.8644-2.8645 7.5294 0 10.394l16.655 16.655c2.8644 2.8644 7.5294 2.8644 10.394 0l6.6565-6.6565c-3.7102-3.9829-5.9608-9.3299-5.9608-15.195z"/></g><defs><clipPath id="a"><rect width="75" height="48" fill="currentColor"/></clipPath></defs></svg> diff --git a/docs/index.adoc b/docs/index.adoc new file mode 100644 index 0000000000..4efb8bda24 --- /dev/null +++ b/docs/index.adoc @@ -0,0 +1,93 @@ += Graphitron +:description: Graphitron is a Java code generator that turns GraphQL schemas + jOOQ database models into resolvers. +:keywords: graphitron, sikt, graphql, jooq, java, code generation +:!toc: +:noheader: + +++++ +<section class="hero-band"> + <h1 class="hero-title">Graphitron</h1> + <p class="hero-tagline">A code generator for GraphQL APIs backed by jOOQ.</p> + <div class="cta-row"> + <a class="cta-button" href="quick-start.html">Quick start</a> + <a class="cta-button" href="https://github.com/sikt-no/graphitron/tree/claude/graphitron-rewrite" rel="noopener">GitHub</a> + </div> +</section> +++++ + +Graphitron generates the wiring between a GraphQL schema and a jOOQ-modelled database, so resolvers, fetchers, and SQL come out of the schema rather than being maintained by hand. + +// Decorative hero illustrations: emitted as HTML passthroughs so they carry +// aria-hidden="true". AsciiDoctor's image: macro does not support arbitrary +// HTML attributes, and alt="" alone is not enough; VoiceOver and a few other +// screen readers fall back to reading the file path when an empty-alt image +// has no aria-hidden, which is the failure mode being fixed here. +[.featurerow,cols="1a,1a,1a",frame=none,grid=none] +|=== +| ++++<img class="decorative" src="images/Person2.svg" alt="" aria-hidden="true">+++ + +[.feature] +== Database-first + +A well-designed database outlives every application built on top of it. Graphitron consumes jOOQ-generated types and treats the database schema as the source of truth, rather than abstracting it away. + +xref:graphitron-principles.adoc[Read the principles] + +| ++++<img class="decorative" src="images/Person3.svg" alt="" aria-hidden="true">+++ + +[.feature] +== Built on jOOQ and graphql-java + +jOOQ provides the typed table classes that Graphitron uses to build SQL the compiler can check. graphql-java provides the schema-execution layer the generated resolvers plug into. Both are foundational, not incidental. + +xref:dependencies.adoc[Why these dependencies] + +| ++++<img class="decorative" src="images/Personer.svg" alt="" aria-hidden="true">+++ + +[.feature] +== Authorization stays in the database + +Generated resolvers contain no authorization logic. PostgreSQL row-level security and per-request session variables enforce access rules where the rules already live, and where every other application that touches the data sees them too. + +xref:security.adoc[Security model] +|=== + +== Documentation + +[cols="1,3", options="header"] +|=== +| Section +| Contents + +| xref:quick-start.adoc[Quick Start] +| Prerequisites, jOOQ generation, GraphQL schema with directives, build wiring. Start here if you want to use Graphitron in a project. + +| xref:manual/index.adoc[User Manual] +| Tutorial, how-to recipes, directive reference, and explanation of the design. Diataxis-shaped; pick the quadrant that matches what you are trying to do. + +| xref:faq.adoc[FAQ] +| Purpose, how it works, licensing, production use, and where to ask for help. + +| xref:vision-and-goal.adoc[Vision and Goal] +| What problem Graphitron solves and how it approaches the solution. + +| xref:graphitron-principles.adoc[Graphitron Principles] +| The design philosophy behind Graphitron, the long-term thinking behind the architectural decisions. + +| xref:dependencies.adoc[Dependencies] +| Why jOOQ and GraphQL-Java are foundational, and what that means for you. + +| xref:security.adoc[Security] +| Why we enforce security at the database layer. + +| xref:architecture/index.adoc[Architecture] +| Contributor-facing internals, Diataxis-shaped; pick the quadrant (explanation, reference, how-to) for code generation triggers, the sealed model hierarchy, runtime extension points, design principles, and the dev-loop internals. + +| xref:roadmap/index.adoc[Roadmap] +| Active and Backlog work, plus a xref:roadmap/by-theme.adoc[by-theme view] and the xref:roadmap/changelog.adoc[changelog]. Plans are authored as markdown next to the code; the rendered view here updates on every push. +|=== + +The current build is `{graphitron-version}`. diff --git a/docs/manual/_generated/supported-directives.adoc b/docs/manual/_generated/supported-directives.adoc new file mode 100644 index 0000000000..dd46c6c257 --- /dev/null +++ b/docs/manual/_generated/supported-directives.adoc @@ -0,0 +1,60 @@ +// Generated by `graphitron-roadmap-tool directive-support --mode=migration`. +// Regenerate via the verify-mode CI guard. Never edit by hand. + +=== Supported directives + +The rewrite generator declares the following directives. Each is documented in the architecture chapter and exercised by at least one execution-tier or pipeline-tier test fixture: + +* `@asConnection` +* `@condition` +* `@defaultOrder` +* `@discriminate` +* `@discriminator` +* `@enum` +* `@error` +* `@externalField` +* `@field` +* `@index` +* `@lookupKey` +* `@mutation` +* `@node` +* `@nodeId` +* `@order` +* `@orderBy` +* `@record` +* `@reference` +* `@routine` +* `@scalarType` +* `@service` +* `@splitQuery` +* `@table` + +=== Removed / rejected directives + +These directives are still declared so existing schemas parse, but the rewrite no longer supports them: applying one is a build error. Remove them from your schema (see the migration guide for replacements): + +* `@multitableReference` +* `@notGenerated` + +=== Legacy-only directives + +These directives existed in legacy graphitron but are removed in the rewrite. Drop them from your schema (or replace per the notes below) before migrating: + +* `@experimental_procedureCall` + +=== Argument-shape changes + +The following directives have argument-shape changes between legacy and rewrite. Consumers must update existing usages: + +==== `@externalField` + +* + reference: ExternalCodeReference! (rewrite only) + +==== `@field` + +* - javaName: String (legacy only) + +==== `@mutation` + +* + multiRow: Boolean = false (rewrite only) + diff --git a/docs/manual/_generated/supported-schema-shapes.adoc b/docs/manual/_generated/supported-schema-shapes.adoc new file mode 100644 index 0000000000..f0dda0926a --- /dev/null +++ b/docs/manual/_generated/supported-schema-shapes.adoc @@ -0,0 +1,98 @@ +// Generated by `graphitron-roadmap-tool leaf-coverage --mode=migration`. +// Regenerate via the verify-mode CI guard. Never edit by hand. + +Supported schema shapes are enumerated below by output sealed-leaf class. Each supported entry has at least one execution-tier or pipeline-tier fixture in the rewrite test suite. + +=== GraphitronField + +* *UnclassifiedField*: A field that could not be classified. A schema containing unclassified fields is invalid — + +=== RootField + +* *MutationBulkDeletePayloadField*: R266 — the payload-returning `@mutation(typeName: DELETE)` field with bulk +* *MutationBulkDmlRecordField*: R141 — a record-returning DML mutation with bulk `@table` input and a list-shaped +* *MutationBulkUpdatePayloadField*: R258 — the payload-returning `@mutation(typeName: UPDATE)` field with bulk +* *MutationDeletePayloadField*: R266 — the payload-returning `@mutation(typeName: DELETE)` field with single +* *MutationDeleteTableField*: R266 / R287: the `@mutation(typeName: DELETE)` field that returns an encoded ID. Unlike +* *MutationDmlRecordField*: R75 / Phase 1 — a record-returning DML mutation: the schema field carries +* *MutationInsertTableField* +* *MutationServiceRecordField*: A mutation field backed by a developer-provided service method, returning a non-table type +* *MutationServiceTableField*: A mutation field backed by a developer-provided service method, returning a table-mapped type +* *MutationUpdatePayloadField*: R258 — the payload-returning `@mutation(typeName: UPDATE)` field with single +* *MutationUpdateTableField*: R246: the `@mutation(typeName: UPDATE)` field that returns its `@table` type +* _(not yet supported)_ *MutationUpsertTableField* +* *QueryInterfaceField*: A root query field returning a multi-table `GraphitronType.InterfaceType` +* *QueryLookupTableField* +* *QueryNodeField* +* *QueryNodesField* +* *QueryServiceRecordField*: A root query field backed by a developer-provided service method, returning a non-table type +* *QueryServiceTableField*: A root query field backed by a developer-provided service method, returning a table-mapped type +* *QueryTableField* +* *QueryTableInterfaceField* +* *QueryTableMethodTableField*: A root query field using `@tableMethod`. The developer provides a pre-filtered +* *QueryUnionField*: A root query field returning a multi-table `GraphitronType.UnionType` + +=== ChildField + +* *ColumnField*: A single-column output carrier on a table-backed parent. The column's value reaches the +* *ColumnReferenceField*: A single-column output carrier on a table-backed parent reached through a `@reference` +* *CompositeColumnField*: Composite-key output carrier on a table-backed parent. Carries `columns` of arity +* _(not yet supported)_ *CompositeColumnReferenceField*: Composite-key output carrier on a table-backed parent reached through a `@reference` +* *ComputedField*: A child field using `@externalField` — the developer provides a static method +* *ErrorsField*: The `errors` field on a payload type. Lift target for the payload-side of a +* *InterfaceField*: A child field on a `GraphitronType.TableBackedType` parent returning a multi-table +* *LookupTableField* +* *NestingField*: A nesting child field whose value is a fragment of the parent's table-bound projection +* *ParticipantColumnReferenceField*: A scalar field on a `GraphitronType.TableInterfaceType` participant that +* *PropertyField* +* *RecordField* +* *RecordLookupTableField* +* *RecordTableField* +* *RecordTableMethodField*: DTO-parent sibling of `TableMethodField`: a child field on a class-backed (non-table) +* *ServiceRecordField*: A child field backed by a developer-provided service method (`@service`), where the +* *ServiceTableField*: A child field backed by a developer-provided service method (`@service`), where the +* *SingleRecordIdField*: R275 — the single data field on an `@service` source-record carrier whose data +* *SingleRecordIdFieldFromReturning*: R156 — the single data field on a payload-returning DELETE carrier whose data field is an +* *SingleRecordTableField*: R75 / Phase 1 — the single data field on a single-record DML carrier (an SDL Object admitted +* *SplitLookupTableField* +* *SplitTableField* +* *TableField* +* *TableInterfaceField* +* *TableMethodField*: A child field using `@tableMethod` — the developer provides a pre-filtered +* *UnionField*: A child field on a `GraphitronType.TableBackedType` parent returning a multi-table + +=== InputField + +* *ColumnField*: A field in a `@table`-annotated input type, successfully resolved to a SQL column +* *ColumnReferenceField*: A field in a `@table`-annotated input type that uses `@reference` to reach a +* *CompositeColumnField*: Composite-key input carrier on a `@table`-annotated input type. Carries +* *CompositeColumnReferenceField*: Composite-key input reference carrier on a `@table`-annotated input type whose +* *NestingField*: A field in a `@table`-annotated input type whose GraphQL type is itself an input +* *UnboundField*: Input field that does not bind to a SQL column. The defining property is the absence of a + +=== GraphitronType + +* *Backed*: R75 Phase 1: a payload carrier whose backing class was reflected from its +* _(not yet supported)_ *ConnectionType*: A Relay connection object type — the outer wrapper whose fields are +* _(not yet supported)_ *EdgeType*: A Relay edge object type — the inner wrapper whose fields are `cursor: String!` and +* *EnumType*: A GraphQL enum type. Classifier records it so `schema.types()` is complete for +* *ErrorType*: An object type annotated with `@error`. Maps Java exceptions to GraphQL error responses +* *InterfaceType*: An interface with no directives. Participating types may be table-bound (`ParticipantRef.TableBound`) +* *JavaRecordInputType*: A non-table input type backed by a Java `record` class +* *JavaRecordType*: A result type whose producer's reflected return is a Java `record` class +* _(not yet supported)_ *JooqRecordInputType*: A non-table input type backed by a jOOQ `Record<?>` (not table-bound) +* _(not yet supported)_ *JooqRecordType*: A result type whose producer's reflected return is a jOOQ `Record<?>` (not table-bound) +* *JooqTableRecordInputType*: A non-table input type backed by a jOOQ `TableRecord<?>` +* *JooqTableRecordType*: A result type whose producer's reflected return is a jOOQ `TableRecord<?>` +* *NestingType*: A nesting projection: a directiveless SDL object type embedded under a `@table`-bound +* *NodeType*: A GraphQL object type annotated with both `@table` and `@node` +* _(not yet supported)_ *PageInfoType*: The Relay `PageInfo` object type. Exactly one instance per schema; the classifier +* *PojoInputType*: A non-table input type backed by a plain Java class (POJO), or one whose backing class +* *RootType*: A root operation type (Query or Mutation). Unmapped — no source context, no SQL until +* *ScalarType*: A GraphQL scalar type whose Java type and `GraphQLScalarType` constant (or inline +* *TableInputType*: A GraphQL input object type annotated with `@table` +* *TableInterfaceType*: An interface annotated with `@table` and `@discriminate`, where implementing +* *TableType*: A GraphQL object type annotated with `@table`, without `@node` +* *UnclassifiedType*: A type that could not be classified — examples include an unresolvable `@table` +* *UnionType*: A union type whose member types all have `@table` + diff --git a/docs/manual/explanation/batching-model.adoc b/docs/manual/explanation/batching-model.adoc new file mode 100644 index 0000000000..cf8b69a0a8 --- /dev/null +++ b/docs/manual/explanation/batching-model.adoc @@ -0,0 +1,62 @@ += The batching model +:description: Why N+1 doesn't appear in Graphitron-generated code, what `@splitQuery` and `@lookupKey` actually do at runtime, and what the N × M contract demands of your custom conditions. +:!toc: + +The classic GraphQL performance trap is N+1: a list query for N parents triggers one parent query plus one child query per parent. Graphitron's generated code never does this; every cross-scope child fetch is batched. This page covers what batching means, how the directives steer it, and the contract custom code must respect for the batching to stay correct. + +== The two scope shapes + +Graphitron generates SQL in *scopes*. A scope is one SQL statement; fields within a scope contribute to the same query, so the database does the heavy lifting once. xref:classifier-mental-model.adoc[The classifier] decides where the scope boundaries fall. + +* *Same-scope joins.* When a `@table`-bound type returns another `@table`-bound type and the foreign-key path can be expressed as a join, the child fields land in the parent's scope. One SELECT for both sides; no batching needed because the database already did the work. +* *Cross-scope batches.* When the child has to be fetched separately (xref:../reference/directives/splitQuery.adoc[`@splitQuery`]; xref:../reference/directives/lookupKey.adoc[`@lookupKey`]; a child of a class-backed parent, one whose backing class is reflected from its producer rather than `@table`-resolved; a service-backed field), the build wires a *DataLoader*. At request time, every parent in the same execution batch contributes its key; the loader fires *one* query for the whole batch and routes the results back to the right parents. + +The user-facing payoff: query for N parents and you get one query for the parents and one query for each batched child, regardless of N. For schemas of any meaningful depth, this is the difference between a workable API and a non-starter. + +== `@splitQuery`: open a new scope + +xref:../reference/directives/splitQuery.adoc[`@splitQuery`] tells the classifier "this child does not belong in the parent's SQL". The generator emits a DataLoader; at runtime, all parent primary keys collected during the request flow into one batched child query. The result list is then redistributed back to the parents. + +The shape is keyed by the *parent's primary key* (or its FK columns). One row per parent in the loader's input; one row per matched child in the output (per `@splitQuery` field's natural cardinality). For one-to-many relations (`films` on `Customer`), the loader returns lists. For one-to-one (`address` on `Customer` when `address` is a separate scope), the loader returns single values. + +You reach for `@splitQuery` when the same-scope join would balloon the parent query (Cartesian explosion across two large child collections, say), or when the child must be filtered by something the parent's scope can't express. xref:../how-to/join-with-references.adoc[How-to: Join with references] covers the same-scope vs. split-scope decision. + +== `@lookupKey`: parameterised batches + +xref:../reference/directives/lookupKey.adoc[`@lookupKey`] adds a different shape: the field takes argument values that scope the child fetch, and Graphitron builds a *derived target table* from those values at runtime. For a field like `customer(id: ID!)` annotated with `@lookupKey`, every distinct `id:` argument across the batch contributes one row to a `VALUES (...)` derived table; the child query joins against it, and the results are dispatched back per argument. + +This is the batching shape that powers Relay-style `node(id: ID!)` queries (and Apollo Federation's `_entities` dispatch): a single query handles every node fetched in a request, regardless of which Node-implementing types are in play. + +A constraint that surprises people: *`@lookupKey` blocks pagination*. The result count is exactly N × M, where N is the number of parents in the batch and M is the number of lookup values per parent. Pagination would change the per-parent count non-uniformly, breaking the dispatch. Use `@splitQuery` for paginated relations. + +== The N × M contract + +When `@lookupKey` is on a field that *also* takes a xref:../reference/directives/condition.adoc[`@condition`] argument, the condition method has a contract: each `(parent, lookup-value)` pair produced by the derived target join is either kept in full or dropped in full, and no extra rows may be introduced. Two consequences: + +* *Predicates over the pair are fine.* A condition that says "this rental is overdue for *this* customer" is a per-pair test; either the row stays or it goes, no row count change beyond the dropped pair. +* *Filters that change per-parent counts are not.* A condition that adds rows by joining onto a third table, or that filters non-uniformly across parents, breaks the dispatch (the runtime can't reattach rows to the right parent because the positional contract is gone). + +The validator does not enforce the contract at build time; it's a developer discipline. xref:../how-to/add-custom-conditions.adoc[How-to: Add custom conditions] frames the recipe; the symptom of a violation is rows showing up under the wrong parent at runtime. + +== DataLoader registry + +At request time, a fresh `DataLoaderRegistry` is created per request and stashed on `ExecutionInput.dataLoaderRegistry`. Graphitron's generated fetchers register their loaders against it; graphql-java drives the dispatch. The registry is per-request to avoid cross-request data leakage and to keep the batch boundary aligned with the request lifecycle. + +You don't author DataLoaders by hand; the generator does it. The xref:../reference/runtime-api.adoc[runtime API] documents the sealed `GraphitronContext` contract; the host application's job is to call `Graphitron.newExecutionInput(dsl, ...)` with the `DSLContext` and any `contextArgument` values, and the generator wires the per-request `GraphQLContext` from those typed parameters. xref:../how-to/tenant-scoping.adoc[How-to: Tenant scoping] covers the per-request DSLContext routing recipe (currently a deferral banner pending R45's tenant-column work). + +== When you should care + +Most schemas don't need to think about batching at all; the rules are mechanical and the generator picks the right shape. You should look here when: + +* *A request runs more queries than expected.* Read the generated `*Fetchers.java` for the slow field. Either it's not batched (no `@splitQuery` / `@lookupKey` where one is needed), or its parent isn't part of the same execution batch. +* *Rows show up under the wrong parent.* The N × M contract was violated by a `@condition` method on a `@lookupKey` field. The condition needs to be a per-pair predicate. +* *DataLoader cache hits surprise you across requests.* They shouldn't; the registry is per-request. If you see cross-request leakage, the host application is reusing a registry across requests; that's a wiring bug. + +== See also + +* xref:how-it-works.adoc[How it works] frames the build-time decision and the runtime path. +* xref:../reference/directives/splitQuery.adoc[`@splitQuery`] and xref:../reference/directives/lookupKey.adoc[`@lookupKey`] are the two directives that drive batching. +* xref:../how-to/join-with-references.adoc[How-to: Join with references] covers the same-scope vs. split-scope decision per field. +* xref:design-decisions.adoc[Design decisions] explains why `@lookupKey` blocks pagination and why `@condition` methods take a table. + +xref:index.adoc[← Explanation index] diff --git a/docs/manual/explanation/classifier-mental-model.adoc b/docs/manual/explanation/classifier-mental-model.adoc new file mode 100644 index 0000000000..c2a28ec700 --- /dev/null +++ b/docs/manual/explanation/classifier-mental-model.adoc @@ -0,0 +1,75 @@ += Classifier mental model +:description: What the build's classification step does, in user-visible terms. Useful when reading rejection messages, understanding directive interactions, or diagnosing why a field surfaces as a stub. +:!toc: + +The build doesn't blindly emit a fetcher for every field; it first sorts each field into a category based on its directives, its parent, and its return type. The sorting is the *classification* step, and most of the build's user-visible behaviour (rejection messages, directive interaction rules, batched-vs-correlated query shapes) traces back to it. This page explains the model in user terms; xref:../../architecture/reference/code-generation-triggers.adoc[Code Generation Triggers] covers the contributor-facing detail. + +== Two axes describe every field + +Two independent properties decide what a field becomes: + +* *The parent context.* The type the field is defined on. Either the parent has xref:../reference/directives/table.adoc[`@table`] (table-bound, full SQL is fair game), or it is class-backed (its producer's reflected return type is a Java/jOOQ class that carries the row, so no SQL runs until a new scope opens), or it has neither (the field is on `Query` / `Mutation` / a plain output type, and the field's *return type* drives the binding instead). +* *The return type.* What the field returns: another `@table`-bound type (a join is on the table), a class-backed type (a backing Java/jOOQ class derived by reflection from the producing field, no SQL until a new scope opens), a scalar/enum (a column or a service value), or a polymorphic interface/union (a runtime type-discrimination step). + +The pair `(parent context, return type)` plus the directives on the field decide which category the field falls into. The categories are the things you read about in the directive reference: a "scalar field on a `@table` parent" is one category, a "table-returning field on a `@table` parent" is another, a "field with `@lookupKey`" is yet another. The category determines what code the generator emits and what the validator demands of the field. + +== Why this matters for you + +Three user-visible consequences: + +* *Directives interact through the category.* Whether xref:../reference/directives/asConnection.adoc[`@asConnection`] composes with xref:../reference/directives/lookupKey.adoc[`@lookupKey`], whether xref:../reference/directives/splitQuery.adoc[`@splitQuery`] is redundant on a particular field, whether xref:../reference/directives/condition.adoc[`@condition`] applies, all flow from the category. The directive reference pages name "what category this puts the field in" and "what other directives are admitted in that category". +* *Rejection messages reference categories.* When the validator says "field cannot have `@asConnection` and `@lookupKey` simultaneously" or "the parent must be `@table`-bound for this directive", it's reading the category off the field and reporting which categories admit which directive sets. The xref:../reference/diagnostics-glossary.adoc[diagnostics glossary] catalogues the closed-set rejection kinds; most of them are category-driven. +* *Stubs versus errors.* When a category is recognised but not yet emitted, the validator records a *deferred* rejection with a `planSlug:` pointing at the roadmap entry. When a category isn't recognised at all (a directive set that no category admits), the validator records a *structural* rejection. The two outcomes look similar from outside; the diagnostics glossary names the difference. + +== A concrete walk-through + +Take this excerpt: + +[source,graphql] +---- +type Query { + customers: [Customer!]! + customer(id: ID!): Customer +} + +type Customer @table { + id: ID! + firstName: String! @field(name: "FIRST_NAME") + address: Address! # <1> + rentals: [Rental!]! @splitQuery # <2> + activeRentalCount: Int! @externalField(...) # <3> +} + +type Address @table { + id: ID! + street: String! @field(name: "ADDRESS_") +} + +type Rental @table { + id: ID! + rentalDate: DateTime! +} +---- + +<1> *Table-returning child on a `@table` parent.* The classifier finds the foreign key from `customer` to `address` by the `@table` directive on `Address` and emits a join into the same scope as the parent; no DataLoader. +<2> *Table-returning child with `@splitQuery`.* The classifier sees `@splitQuery` and opens a new scope: this becomes a DataLoader-backed batch keyed by the parent's primary key. xref:batching-model.adoc[The batching model] explains the mechanics. +<3> *Computed field.* The classifier sees xref:../reference/directives/externalField.adoc[`@externalField`] and routes the field to the user-supplied jOOQ method instead of building a SQL projection. xref:../how-to/computed-fields.adoc[How-to: Computed fields] is the recipe. + +The same schema, same directives, three different generated outputs, all decided at the classification step. No runtime introspection ever asks "what category is this field"; the answer was baked into the emitted code at build time. + +== When the classifier surfaces an error + +Two rejection shapes are the most common things you'll see: + +* *Unknown name with candidate hint.* A `@field(name: "FIRST_NAMEZ")` typo against the `customer` table fails resolution against the jOOQ catalog; the rejection names the typo and the closest match. xref:../reference/diagnostics-glossary.adoc#kind-author-error[The `author-error` rejection kind] is the umbrella; the rejection's *attempt kind* says what was being looked up (a column, a foreign key, a service method, an enum constant, etc.). +* *Directive conflict.* Two directives that don't compose, like `@service` + `@mutation` on the same field. The validator names both directives and explains why they don't compose. xref:../reference/diagnostics-glossary.adoc#kind-invalid-schema[The `invalid-schema` rejection kind] covers these. + +A third, less common shape: *deferred*. The validator recognises the field but the emitter hasn't been built yet. The rejection carries a `planSlug:` pointing at the roadmap entry that will close the gap; the runtime stub the generator emits in its place fails fast with the same plan slug. + +== See also + +* xref:how-it-works.adoc[How it works] is the wider pipeline; classification is one of its four steps. +* xref:design-decisions.adoc[Design decisions] explains why specific category boundaries are where they are (why `@condition` methods take a table; why `@lookupKey` blocks pagination; etc.). +* xref:../reference/diagnostics-glossary.adoc[Diagnostics glossary] is the canonical surface for the rejection messages the classifier produces. + +xref:index.adoc[← Explanation index] diff --git a/docs/manual/explanation/design-decisions.adoc b/docs/manual/explanation/design-decisions.adoc new file mode 100644 index 0000000000..970a2820df --- /dev/null +++ b/docs/manual/explanation/design-decisions.adoc @@ -0,0 +1,82 @@ += Design decisions +:description: Why specific directive constraints, validator rejections, and emitter shapes are where they are. The user-visible "why" answers behind rules that look surprising on first contact. +:!toc: + +A reading path for the design decisions that show up as rules you have to follow but whose rationale isn't obvious from the rule itself. Each section names a constraint, explains the alternative we considered, and points at the directive or how-to page that surfaces the rule in practice. + +== `@condition` methods take a table + +xref:../reference/directives/condition.adoc[`@condition`] points at a Java method that returns a jOOQ `Condition`. The method's first parameter is the table the condition is being applied to (typically a generated `Table<R>` instance). New users sometimes ask: why does the framework need to pass the table in? Couldn't the condition method just refer to the generated `Tables.CUSTOMER` constant directly? + +Two reasons: + +* *Aliasing.* Graphitron's generated queries use jOOQ aliasing whenever the same table appears in multiple roles (a self-join, a filter on a joined table, a subquery in a `@lookupKey` derived table). A condition that hardcodes `Tables.CUSTOMER` would refer to the wrong instance when the surrounding query has aliased it; the table parameter carries the aliased reference into the condition's scope so the predicate composes correctly. +* *Symmetry with `@reference` join methods.* When `@reference` accepts a method-returned `Condition` (the *condition-join* shape, as opposed to a foreign-key path), the same first-parameter convention applies. Keeping the two callable shapes identical means one signature works for both kinds of custom predicate. + +The cost is that every condition method has to accept the table parameter explicitly, even when it isn't aliased in the caller's query. The benefit is that condition methods compose cleanly into any surrounding query shape, including the batching shapes that didn't exist when the condition was authored. + +xref:../how-to/add-custom-conditions.adoc[How-to: Add custom conditions] is the recipe. + +== `@lookupKey` blocks pagination + +A field with xref:../reference/directives/lookupKey.adoc[`@lookupKey`] cannot also carry xref:../reference/directives/asConnection.adoc[`@asConnection`]. The validator rejects the combination at build time. + +The reason is the *N × M contract* that batching depends on. xref:batching-model.adoc[The batching model] explains the mechanics: each `(parent, lookup-value)` pair contributes a fixed number of rows to the batched query, and the runtime dispatches results back to parents using the row-count predictability. Pagination changes per-parent row counts non-uniformly: page 2 of customer A's results carries different rows than page 2 of customer B's, and the dispatch loses the positional anchor that lets it route rows to the right parent. + +You could, in principle, page each lookup value independently and join the page boundaries into the derived target table. We considered it and rejected it: the surface complexity (page cursors per lookup value, per-parent state in the loader, validation of cursor consistency across the batch) outweighed the use cases we found. The pragmatic alternative is to use xref:../reference/directives/splitQuery.adoc[`@splitQuery`] for paginated relations and reserve `@lookupKey` for the bounded-cardinality shapes (Relay `node(id:)`, Apollo Federation `_entities`, point lookups on natural keys). + +== Mutations require `@table` on the input type + +A mutation like `createFilm(input: FilmCreateInput!): Film` won't generate unless `FilmCreateInput` carries xref:../reference/directives/table.adoc[`@table`]. The output type does not transfer its table binding to the input. + +Two reasons input types can't reuse the output type's binding: + +* *Input shapes diverge.* The set of fields a client supplies on create is rarely the set the database stores: client supplies natural keys, generated keys arrive from sequences, audit columns are server-set, transient validation fields don't reach storage at all. Forcing the input to share the output's binding would conflate the two surfaces. +* *Different binding rules apply.* On a `@table` output, `@field` is column-bound and selection-driven; on a `@table` input, `@field` declares "this column is written on every call" and the GraphQL nullability of the field is the contract for whether the column must be supplied. The generator's emit rules differ; without the directive on the input, the classifier can't pick the input-shape rules. + +The cost is one extra `@table` directive per input type. The benefit is that input and output evolve independently, and a mutation's wire shape is clear from its input definition without cross-referencing the output. + +xref:../how-to/index.adoc[The how-to index] points at xref:../reference/directives/mutation.adoc[`@mutation`] and the mutation recipes for the full input vocabulary. + +== Selection drives projection + +A query that asks for `customer { firstName }` produces `SELECT customer.first_name`, not `SELECT *`. Graphitron reads the GraphQL `SelectedField` set at execution time and projects only the columns the client asked for. + +This is selection-aware projection, and it is not just an optimisation: it is what makes adding columns to a `@table` type non-breaking for existing queries. The generator does not know at build time which columns each client will ask for; the runtime decides per request, and the database does the minimum work for that selection. + +The cost is that every column-bound field has to flow through the runtime selection check; you can't shortcut the projection with hand-rolled code that selects fixed columns. The benefit is that the GraphQL schema can grow without making every existing query slower. + +xref:how-it-works.adoc[How it works] mentions selection-aware projection as part of the request-time path. + +== Federation `_entities` is a `@lookupKey` shape + +Apollo Federation's xref:../reference/directives/node.adoc[`@key`] resolution and xref:../reference/directives/nodeId.adoc[`@nodeId`] global IDs both run through the same `@lookupKey`-shaped batched dispatch. xref:../how-to/apollo-federation.adoc[How-to: Apollo Federation] is the recipe. + +The reason is simple: at runtime, "find all `Customer` entities whose `id` is in this set" and "find one `Customer` per `id` argument" are the same query. Reusing the `@lookupKey` mechanics gave federation `_entities` and Relay `node(id:)` the same batching contract for free, including the N × M predictability that lets the dispatch reattach results to the right entities. + +The cost: the federation surface inherits `@lookupKey`'s no-pagination rule (federation `_entities` is one-shot per `id`, not paged). The benefit: one runtime path serves three shapes (Relay node, Federation entities, generic `@lookupKey` lookups), and the contract is the same across all three. + +== The validator's diagnostics surface is closed-set + +Every rejection the validator emits falls into a finite, enumerated taxonomy: three top-level *kinds*, nine *attempt kinds* for name lookups, four *emit-block reasons* for deferred features. xref:../reference/diagnostics-glossary.adoc[The diagnostics glossary] is the canonical reference. + +The closed-set shape exists so consumers can build typed handling on top of it. The LSP fix-it engine reads the *attempt kind* off an unknown-name rejection and offers candidates from the right namespace (a column miss prompts column candidates, not table candidates). The watch mode reports the same kind in its build-status surface. Tooling that wants to filter, group, or count diagnostics has stable categories to work against. + +The cost is that adding a new diagnostic shape requires extending the closed set, not just authoring a new rejection inline. The benefit is that the surface is small, documentable, and amenable to mechanical handling. The xref:classifier-mental-model.adoc[classifier mental model] page explains how rejections appear at the validation step; the diagnostics glossary catalogues the codes themselves. + +== Build-time wins over runtime introspection + +Graphitron does almost nothing at runtime that it could have done at build time. Directive parsing, table resolution, foreign-key path discovery, projection plan, batch keying: all of it is decided when the generator runs, baked into the emitted `*Fetchers.java`, and never re-derived per request. + +The architectural payoff is that runtime overhead is comparable to hand-written jOOQ code: a `DataFetcher` invocation, a `DSLContext.select(...)` call, a result mapping. The generator's complexity stays at build time where it can fail loudly and where it doesn't add per-request latency. + +The cost is that schema changes require a build. There is a `dev` Mojo goal (xref:../reference/mojo-configuration.adoc[Mojo configuration reference]) that watches the schema and the classpath and re-emits in the background; it closes the iteration loop so the build cost is paid asynchronously while you keep working. + +== See also + +* xref:how-it-works.adoc[How it works] for the wider pipeline framing. +* xref:classifier-mental-model.adoc[Classifier mental model] for the category-based mental model the design decisions sit in. +* xref:batching-model.adoc[The batching model] for the runtime contract design decisions reference. +* xref:../../graphitron-principles.adoc[Graphitron principles] for the higher-level design philosophy. + +xref:index.adoc[← Explanation index] diff --git a/docs/manual/explanation/how-it-works.adoc b/docs/manual/explanation/how-it-works.adoc new file mode 100644 index 0000000000..e62048d2b2 --- /dev/null +++ b/docs/manual/explanation/how-it-works.adoc @@ -0,0 +1,53 @@ += How it works +:description: From the GraphQL schema and your directives, through the build, to the generated DataFetchers your application serves. +:!toc: + +A 30-second mental model of the pipeline that turns your schema and your jOOQ catalog into the resolvers your application serves at runtime. Aimed at the user, not the contributor; for the contributor-level pipeline detail see xref:../../architecture/reference/code-generation-triggers.adoc[Code Generation Triggers]. + +== The three moving parts + +. *Your GraphQL schema with directives.* xref:../reference/directives/index.adoc[The directive reference] catalogues the vocabulary; xref:../how-to/index.adoc[the how-to chapter] pairs each directive with a recipe. +. *Your jOOQ catalog.* Generated by jOOQ's own `mvn` plugin from the database; this is the typed view of the schema Graphitron resolves directives against. +. *Graphitron's Maven plugin.* Reads (1), looks up identifiers in (2), and emits Java sources. xref:../reference/mojo-configuration.adoc[The Mojo configuration reference] covers the goals (`generate`, `validate`, `dev`) and every parameter. + +The build is mechanical: the generator does not query the database at build time, and runtime queries do not re-read the GraphQL schema or the directives. The schema and the directives are both *parsed once*, classified once, and the generators emit code from the classified result. This is the property that makes the build deterministic and the runtime cheap. + +== What happens at build time + +Graphitron's plugin runs after jOOQ codegen and before your application's compile step: + +. *Parse.* The plugin reads your `.graphqls` files and the rewrite's auto-injected directive definitions. Parse errors fail the build with `file:line:col: error: ...` messages naming the offending file. +. *Classify.* Every type and every field is sorted into a category: a `@table`-bound type produces SQL; a class-backed type carries a backing class derived by reflection from its producing field; a field with `@lookupKey` becomes a batched lookup; a field with `@asConnection` becomes a Relay connection; and so on. xref:classifier-mental-model.adoc[The classifier mental model] explains what the categories are and why. +. *Validate.* The validator cross-checks the classified result against the jOOQ catalog and against structural invariants (no circular types, no `@asConnection`+`@lookupKey` together, every `@field(name:)` resolves to an actual column). Rejections come out as a typed surface; xref:../reference/diagnostics-glossary.adoc[the diagnostics glossary] catalogues every closed-set rejection kind. +. *Emit.* For each classified field, the generator writes a `DataFetcher` (or a `TypeResolver`, or a row-method on a service interface) into your output package. The emitted code is plain Java that calls into jOOQ at runtime; you can read it like hand-written code. + +If anything in step 2 or 3 fails, the build stops with a structured rejection. The catch-all is the validator's stub-arm: a feature that classifies but cannot be emitted yet falls into a runtime stub with a planned-feature pointer instead of a generated body. xref:../reference/diagnostics-glossary.adoc#kind-deferred[The `deferred` rejection kind] is what you see at validate time when this happens. + +== What happens at request time + +Your application starts with `Graphitron.buildSchema(...)` (xref:../reference/runtime-api.adoc[Runtime API reference]), which assembles the wired `GraphQLSchema` once and hands it back. From then on, each GraphQL request: + +. *Lands in graphql-java.* The engine parses the operation, plans an execution, and walks fields top-down. +. *Hits a Graphitron `DataFetcher`.* For each field that Graphitron generated against, the fetcher Graphitron emitted is invoked with the standard `DataFetchingEnvironment`. +. *Calls into jOOQ.* The fetcher reads the per-request `DSLContext` off the `GraphQLContext` that `Graphitron.newExecutionInput(dsl, ...)` populated, builds a typed query (selection-aware: only the columns the client asked for), and executes it. +. *Batches and projects.* DataLoader-backed fields collect their keys per request and execute one query per batch instead of one per parent row. xref:batching-model.adoc[The batching model] explains the mechanics and the contract. +. *Returns the projected shape.* The query result is mapped onto the GraphQL response shape; lists, nulls, connections, and federation `_entities` dispatch all flow through the same return path. + +There is no runtime introspection of directives, no schema reading, no reflection of jOOQ tables. Everything that matters at runtime was decided at build time, and the runtime path is the one the generator emitted into your sources. + +== Where to look when something is off + +* *A directive doesn't bind.* Build error with a candidate hint. The xref:../reference/diagnostics-glossary.adoc[diagnostics glossary] explains the rejection kinds; the relevant directive page in xref:../reference/directives/index.adoc[the directive reference] gives the binding rules. +* *A query is slow.* Read the generated `*Fetchers.java` for the path. The query is selection-aware, so missing columns mean missing GraphQL selections; an unexpected join means an explicit `@reference` somewhere up the path. +* *N+1 in the logs.* The field is not batched. Either it has no xref:../reference/directives/splitQuery.adoc[`@splitQuery`] / xref:../reference/directives/lookupKey.adoc[`@lookupKey`] when it should, or its parent isn't part of a batch. xref:batching-model.adoc[The batching model] is the reading path. +* *A feature returns a stub.* Validator `deferred` rejection at build time, runtime stub at request time. Check the rejection's `planSlug:` for the roadmap entry that owns the feature. + +== See also + +* xref:why-database-first.adoc[Why database-first] frames the architectural stance. +* xref:why-jooq-and-graphql-java.adoc[Why jOOQ and GraphQL-Java] frames the dependency triple. +* xref:classifier-mental-model.adoc[Classifier mental model] explains what the build's classification step does. +* xref:batching-model.adoc[Batching model] covers DataLoader wiring at request time. +* xref:design-decisions.adoc[Design decisions] answers user-visible "why does it work that way" questions. + +xref:index.adoc[← Explanation index] diff --git a/docs/manual/explanation/index.adoc b/docs/manual/explanation/index.adoc new file mode 100644 index 0000000000..ad9d62a378 --- /dev/null +++ b/docs/manual/explanation/index.adoc @@ -0,0 +1,33 @@ += Explanation +:description: Background on the design decisions, the batching model, and how the pipeline fits together. +:!toc: + +Background and rationale, organised by what you might want to understand. None of these pages are required reading; they exist so you can build a mental model when something surprises you, or read up on a design choice before extending past it. + +== Architectural framing + +* xref:why-database-first.adoc[Why Graphitron is database-first]: the schema, the constraints, and the relationships in your database are the source of truth; the GraphQL layer is a typed view onto them. Cross-links to xref:../../graphitron-principles.adoc[Graphitron principles]. +* xref:why-jooq-and-graphql-java.adoc[Why jOOQ and GraphQL-Java]: the two foundational dependencies, why they shape the developer experience, and where each surfaces in your work. Cross-links to xref:../../dependencies.adoc[Dependencies]. + +== How the build and the runtime fit together + +* xref:how-it-works.adoc[How it works]: the pipeline that turns your GraphQL schema and your jOOQ catalog into the resolvers your application serves. Build-time and request-time, in 30 seconds. +* xref:classifier-mental-model.adoc[Classifier mental model]: what the build's classification step does, in user-visible terms. Useful when reading rejection messages or understanding directive interactions. +* xref:batching-model.adoc[The batching model]: why N+1 doesn't appear in Graphitron-generated code, what xref:../reference/directives/splitQuery.adoc[`@splitQuery`] and xref:../reference/directives/lookupKey.adoc[`@lookupKey`] actually do at runtime, and what the N × M contract demands of your custom conditions. + +== Why specific things work the way they do + +* xref:design-decisions.adoc[Design decisions]: user-visible "why does it work that way" answers for the constraints that look surprising on first contact (why xref:../reference/directives/condition.adoc[`@condition`] methods take a table, why xref:../reference/directives/lookupKey.adoc[`@lookupKey`] blocks pagination, why mutations require xref:../reference/directives/table.adoc[`@table`] on the input type, and more). + +== The wider context + +The user-manual explanation chapter sits next to the deployed site's existing top-level explanation pages, which cover orientation rather than the manual-internal pipeline: + +* xref:../../graphitron-principles.adoc[Graphitron principles]: the design philosophy in plain prose. +* xref:../../vision-and-goal.adoc[Vision and goal]: what problem Graphitron solves and how it approaches the solution. +* xref:../../dependencies.adoc[Dependencies]: why jOOQ and graphql-java are foundational, and what that means for users. +* xref:../../security.adoc[Security]: why authorization stays in the database. + +For contributor-facing material (sealed hierarchies, classification source map, generator dispatch, runtime extension points), see xref:../../architecture/index.adoc[the architecture chapter]. + +xref:../index.adoc[← Back to the manual landing] diff --git a/docs/manual/explanation/why-database-first.adoc b/docs/manual/explanation/why-database-first.adoc new file mode 100644 index 0000000000..5853d5f05b --- /dev/null +++ b/docs/manual/explanation/why-database-first.adoc @@ -0,0 +1,33 @@ += Why Graphitron is database-first +:description: The schema, the constraints, and the relationships in your database are the source of truth. Graphitron generates the API around them, not the other way around. +:!toc: + +Most code-generation tools that touch GraphQL go in one direction: define the API, then figure out how to back it with data. Graphitron goes the other way. The database schema is the source of truth; the GraphQL schema is a typed view onto it; the generated code keeps the two in sync. This page explains why, and what it means for you. + +== Where the truth lives + +Relational databases have been around for fifty years for good reasons. A well-designed database enforces integrity (NOT NULL, foreign keys, check constraints, unique indexes) at the level closest to the data, where the constraints survive every application that ever talks to it. Authorization can live there too (row-level security, schema-level grants, view-based isolation). And databases tend to outlive the applications built on top of them. + +When Graphitron is asked which value goes in `customer.first_name`, the answer is whatever the database says, with whatever rules the database enforces. The GraphQL layer's job is to make that surface available to clients in a typed, batch-efficient, pageable, sortable way. The GraphQL layer does not own data semantics. + +== What this means in practice + +* *Mappings are explicit.* xref:../reference/directives/table.adoc[`@table`] and xref:../reference/directives/field.adoc[`@field`] declare how a GraphQL type or slot is backed. The directive says "this is the table" or "this is the column"; everything else flows from there. xref:../how-to/map-types-to-tables.adoc[How-to: Map types to tables] walks through the mapping vocabulary. +* *The build fails fast on drift.* Rename a column without updating the GraphQL schema, and the build rejects the directive with a candidate hint pointing at the new name. The xref:../reference/diagnostics-glossary.adoc[Diagnostics glossary] catalogues every closed-set rejection the validator emits; the shape is "describe what's wrong, name where, suggest a fix". +* *Authorization stays in the database.* Graphitron does not synthesize authorization checks in the generated code. The recommended pattern is row-level security (or equivalent) on the database side; the per-request `DSLContext` carries the principal that the database authorizes against. See xref:../../security.adoc[Security] for the database-level model and xref:../how-to/tenant-scoping.adoc[How-to: Tenant scoping] for the per-request wiring. +* *jOOQ is where you extend.* When Graphitron's schema-driven surface needs a custom predicate, a computed column, or a hand-written join, you write jOOQ. The generated code calls into your jOOQ functions; you do not work around the framework. See xref:why-jooq-and-graphql-java.adoc[Why jOOQ and GraphQL-Java] for the dependency framing and xref:../how-to/add-custom-conditions.adoc[How-to: Add custom conditions] for the recipe. + +== When this is the right shape + +Database-first works best when the database schema is well-modelled and stable, the team has access to (or includes) people who understand the data, and the GraphQL schema is shaped to expose what's there rather than to hide a different model behind a flatter facade. xref:../../graphitron-principles.adoc[Graphitron principles] expands on the design philosophy; xref:../../vision-and-goal.adoc[Vision and goal] frames the problem this approach solves. + +It is *not* the right shape when the GraphQL schema is meant to look nothing like the underlying data (a heavy translation layer over multiple disparate sources, say), or when there is no relational database in the picture at all. Both cases exist; Graphitron is just not the tool for them. + +== See also + +* xref:../../graphitron-principles.adoc[Graphitron principles] is the design-philosophy companion to this page. +* xref:../../security.adoc[Security] explains the database-level authorization model. +* xref:why-jooq-and-graphql-java.adoc[Why jOOQ and GraphQL-Java] frames the dependencies that follow from the database-first stance. +* xref:how-it-works.adoc[How it works] walks through the pipeline that turns the GraphQL schema and the directives into the generated code. + +xref:index.adoc[← Explanation index] diff --git a/docs/manual/explanation/why-jooq-and-graphql-java.adoc b/docs/manual/explanation/why-jooq-and-graphql-java.adoc new file mode 100644 index 0000000000..ae0b6706c4 --- /dev/null +++ b/docs/manual/explanation/why-jooq-and-graphql-java.adoc @@ -0,0 +1,43 @@ += Why jOOQ and GraphQL-Java +:description: Two foundational dependencies shape how Graphitron-generated code looks, what you can extend, and how you debug it. +:!toc: + +Graphitron sits on top of two libraries that you'll feel constantly while working with it: jOOQ for typed SQL, and GraphQL-Java for query execution. Neither is incidental; both shape what the generated code looks like and where you go when you need to extend it. + +== jOOQ is where you work + +Graphitron generates types, fetchers, and join paths against jOOQ's catalog of typed table classes. When you need custom logic (a filter predicate, a computed column, a join the schema can't express), you write it as a jOOQ method, and Graphitron's directives point at it. + +jOOQ has been actively maintained since 2009, stays close to SQL rather than hiding it, and produces code that reads like the SQL you'd write by hand. That last property matters: when something is wrong with a generated query, you can read the jOOQ DSL chain that built it and the SQL it emitted, side by side, without a translation layer in between. + +* *Custom conditions* (xref:../how-to/add-custom-conditions.adoc[How-to: Add custom conditions]) are jOOQ `Condition` methods you author and `@condition` directives you attach. +* *Computed fields* (xref:../how-to/computed-fields.adoc[How-to: Computed fields]) are jOOQ `Field<T>` methods bound via xref:../reference/directives/externalField.adoc[`@externalField`]. +* *Service-backed mutations* (xref:../how-to/handle-services.adoc[How-to: Services]) accept and return jOOQ `Record` types when the row needs to round-trip through the database. + +The cost is that jOOQ is the second framework you need fluency in. Reading generated code, debugging, and extending all assume jOOQ literacy. xref:../../dependencies.adoc[Dependencies] covers licensing (the open-source edition supports many engines; commercial databases require a commercial jOOQ licence). + +== GraphQL-Java is under the hood + +GraphQL-Java is the reference Java implementation of GraphQL. It parses your schema, plans queries, and provides the `DataFetcher` and `TypeResolver` interfaces Graphitron implements. You will rarely write GraphQL-Java code directly; the integration runs through xref:../reference/runtime-api.adoc[`Graphitron.buildSchema(...)`], which hands you a wired `GraphQLSchema` ready to drop into a `GraphQL` engine. + +Where GraphQL-Java surfaces in your work: + +* The xref:../how-to/custom-scalars.adoc[custom-scalar registration recipe] uses GraphQL-Java's `GraphQLScalarType` because that is the type the engine wants. +* The per-request context xref:../reference/runtime-api.adoc[`GraphitronContext`] is what your application implements to carry the `DSLContext`, the tenant principal, and any context arguments down to data fetchers. +* xref:../how-to/apollo-federation.adoc[Apollo Federation] support is wired through GraphQL-Java's Federation utilities; Graphitron generates the `_entities` dispatch and the `@key` resolution against them. + +The cost is much lower than for jOOQ: most consumers can ignore GraphQL-Java's API entirely and just call `Graphitron.buildSchema(...)`. Where it matters (custom scalars, federation, request-scoped context), the recipes name what to import and what to wire. + +== What the choice constrains + +Database-first (xref:why-database-first.adoc[Why database-first]) plus jOOQ plus GraphQL-Java together pin the shape of the generated output: typed against the catalog, executed against a `DSLContext`, served by a `DataFetcher` registered against `graphql-java`'s schema. That triple is rigid by design. The benefit is that the generated code is mechanical and readable; you can drop into any layer (the catalog, a custom condition, the per-request context, the GraphQL engine) without crossing a magic boundary. + +The triple also means Graphitron is *not* a good fit when the application backing isn't relational, when the data access layer must be something other than jOOQ, or when the GraphQL engine of choice isn't graphql-java. + +== See also + +* xref:../../dependencies.adoc[Dependencies] expands on the licensing and version policy. +* xref:why-database-first.adoc[Why database-first] explains the architectural stance the dependency choice supports. +* xref:how-it-works.adoc[How it works] traces the pipeline from your schema to the generated `DataFetcher` calling into jOOQ. + +xref:index.adoc[← Explanation index] diff --git a/docs/manual/how-to/add-custom-conditions.adoc b/docs/manual/how-to/add-custom-conditions.adoc new file mode 100644 index 0000000000..cf824d3d68 --- /dev/null +++ b/docs/manual/how-to/add-custom-conditions.adoc @@ -0,0 +1,191 @@ += How-to: Add custom conditions +:description: Wire a developer-supplied SQL predicate onto a field, an argument, or an input field via @condition, the rewrite reflects on a static Java method that returns a jOOQ Condition. +:!toc: + +The xref:../reference/directives/condition.adoc[`@condition`] directive hands one piece of a generated `WHERE` clause off to a developer-supplied static method. Use it when the predicate isn't a plain `column = ?` (range filters, regex, date arithmetic, vendor-specific operators, multi-column boolean shapes) or when the column you want to filter on isn't reachable through `@field`. This recipe walks through writing the Java method, attaching the directive at each of the three SDL sites (argument, field, input field), and rebinding parameter names when GraphQL and Java conventions diverge. For the override cascade rules (stacking, suppression, the legacy-divergence trap), read xref:condition-cascade.adoc[How-to: Stacking and overriding conditions] after this recipe. + +The recipe assumes you've read xref:external-code.adoc[How-to: Wire external Java code] for the plugin-classpath and FQCN mechanics shared across all directives that point at Java code. + +== Write the Java method + +Every condition method has the same shape: a `static` method on a public class, returning a jOOQ `Condition`, taking the surrounding `Table<?>` first and the GraphQL argument values after. The example fixture filters films by primary key: + +[source,java] +---- +package no.sikt.graphitron.rewrite.test.conditions; + +import no.sikt.graphitron.rewrite.test.jooq.tables.Film; +import org.jooq.Condition; +import org.jooq.Table; +import org.jooq.impl.DSL; + +public final class InputFieldConditionFixtures { + + private InputFieldConditionFixtures() {} + + public static Condition filmIdCondition(Table<?> table, String filmId) { + if (filmId == null) { + return DSL.noCondition(); + } + return table.field(Film.FILM.FILM_ID).eq(Integer.parseInt(filmId)); + } +} +---- + +Three things matter: + +* *The first parameter is the surrounding `Table<?>`.* The rewrite passes the aliased table the field's fetcher is selecting from. Resolve column references through `table.field(Film.FILM.FILM_ID)` rather than `Film.FILM.FILM_ID` directly, the alias-bearing handle keeps the predicate anchored in the caller's `FROM` and lets jOOQ render the `WHERE` against the correct alias. +* *The remaining parameters bind by name.* The Java parameter named `filmId` receives the GraphQL argument named `filmId`. Names must agree; the rewrite reads them through reflection. Compile the Java module with `-parameters` so the parameter names survive into the bytecode (the example fixtures' `pom.xml` carries `<parameters>true</parameters>` for this reason). +* *Return `DSL.noCondition()` to opt out.* When the GraphQL argument is null or absent, return the no-op so the predicate is structurally present but contributes nothing to the `WHERE` clause. This is the contract that lets optional filter inputs degrade cleanly to "unconstrained". + +Add the carrying artifact to the rewrite plugin's `<dependencies>` block, not your consumer module's compile classpath; the plugin reflects on the class via `Class.forName(...)` at code-generation time. xref:external-code.adoc[How-to: Wire external Java code] covers the plugin-classpath setup in full. + +== Attach the directive at one of three sites + +`@condition` is valid on `FIELD_DEFINITION`, `ARGUMENT_DEFINITION`, and `INPUT_FIELD_DEFINITION`. The placement determines what the Java method sees: + +[cols="1,1,3",options="header"] +|=== +| Site | What the method sees | When to use +| Argument | the table + the one argument's value | The predicate is local to one argument; other arguments are unaffected. +| Field | the table + every direct argument | The predicate spans multiple arguments (conjunctive filter, multi-column boolean shape). +| Input field | the table + the input's leaf scalar | The predicate filters by a value carried inside a `@table`-bound or plain input. +|=== + +=== Argument-level: filter by one input + +[source,graphql] +---- +type Query { + citiesByName( + cityNames: [String!] @field(name: "CITY") + @condition(condition: { + className: "com.example.CityConditions", + method: "cityMethod" + }) + ): [City] +} +---- + +The Java method takes `(City table, List<String> cityNames)`. The predicate is `AND`-ed with the implicit `CITY IN (?, ?, ...)` that `@field(name: "CITY")` would otherwise emit on its own. Argument-level conditions only see their own argument; the surrounding field's other arguments are invisible. + +=== Field-level: filter spanning every argument + +[source,graphql] +---- +type Query { + cities( + countryId: String! @field(name: "COUNTRY_ID"), + cityNames: [String!] @field(name: "CITY") + ): [City] @condition(condition: { + className: "com.example.CityConditions", + method: "cityMethod" + }) +} +---- + +The Java method's signature is `(City table, String countryId, List<String> cityNames)`, every direct argument is delivered. Reach for field-level placement when the predicate is conjunctive across arguments or when the explicit logic depends on more than one input value. + +=== Input-field-level: filter on an input's leaf scalar + +The example schema's `filmsWithInputFieldCondition` query exercises this at runtime. The query takes a `@table`-bound input whose `filmId` field carries `@condition`: + +[source,graphql] +---- +type Query { + filmsWithInputFieldCondition(filter: FilmConditionInput): [Film!]! +} + +input FilmConditionInput @table(name: "film") { + filmId: ID! @field(name: "film_id") + @condition(condition: { + className: "no.sikt.graphitron.rewrite.test.conditions.InputFieldConditionFixtures", + method: "filmIdCondition" + }) +} +---- + +The Java method's signature is `(Film table, String filmId)`. The rewrite extracts `filter.filmId` from the GraphQL argument map at request time and passes it as the second parameter. A two-level nested input (`NestedFilmInput`'s `inner.filmId` in the same fixture set) walks the path `["inner", "filmId"]` to reach the leaf and binds the same way. The execution-tier test `inputFieldCondition_tableInput_filtersByFilmId` in `GraphQLQueryTest` runs the resulting query and asserts that `{filmId: "1"}` returns exactly one row. + +=== Pick a site + +The default is whichever site is closest to where the value is. An argument carrying a single GraphQL argument: argument-level. A field whose predicate involves several arguments: field-level. A value buried inside a structured input: input-field-level. Argument-level and field-level conditions can coexist on the same field; input-field-level conditions stack with both. xref:condition-cascade.adoc[How-to: Stacking and overriding conditions] covers the override flag and the divergence rules when implicit and explicit predicates disagree. + +== Rebind argument names with `argMapping` + +When the GraphQL argument name and the Java parameter name diverge, use `argMapping:` to rebind. The syntax is `"javaParam: graphqlArg"`, comma-separated; the Java side comes first because that is what the reflected method signature reads: + +[source,graphql] +---- +type Query { + cities(cityNames: [String!] + @condition(condition: { + className: "com.example.CityConditions", + method: "argConditionRenamed", + argMapping: "city: cityNames" + })): [City] +} +---- + +The Java method `argConditionRenamed(Table<?> table, String city)` receives the GraphQL argument `cityNames` as its `city` parameter. Whitespace around `:` and `,` is tolerated, multi-line text-block input is accepted for long mappings, and an empty `argMapping:` is identity. `argMapping:` is supported on `@condition`, `@service`, and `@tableMethod`, the directives whose Java targets receive GraphQL arguments. It is structurally inert on `@externalField`, `@enum`, and `@sourceRow`; applying it on those is rejected at parse time. + +Field-level placement mirrors the argument-level shape, `argMapping:` rebinds every parameter that needs a different Java name: + +[source,graphql] +---- +type Query { + cities(cityNames: [String!] @field(name: "CITY"), + countryId: String! @field(name: "COUNTRY_ID")): + [City] @condition(condition: { + className: "com.example.CityConditions", + method: "fieldConditionRenamed", + argMapping: "city: cityNames, country: countryId" + }) +} +---- + +The Java method `fieldConditionRenamed(Table<?> table, String city, String country)` receives both GraphQL arguments under their renamed Java identifiers. Unmentioned Java parameters bind to a GraphQL argument of the same name, so partial mappings are valid. + +== Pull request-context values via `contextArguments` + +When the predicate depends on values from the request context (current user, tenant ID, correlation ID), name them via `contextArguments:`. The rewrite appends one Java parameter per listed key, after the table and the GraphQL-argument parameters: + +[source,graphql] +---- +type Query { + citiesForCurrentUser: [City] + @condition( + condition: {className: "com.example.CityConditions", method: "tenantScoped"}, + contextArguments: ["tenantId"] + ) +} +---- + +`tenantScoped(City table, UUID tenantId)` runs at request time with `tenantId` pulled from the runtime `GraphQLContext`. Wire the value into the context map at servlet bootstrap; the rewrite reads each named key with the runtime value's declared Java type. xref:tenant-scoping.adoc[How-to: Tenant scoping] covers the supplying side, and xref:../reference/runtime-api.adoc[the runtime API reference] documents the `GraphitronContext` interface that brokers the per-request values. + +Two consequences worth pinning: + +* *Compile-time wiring guard.* A typo in `contextArguments` surfaces at compile time as a typed-but-unfamiliar parameter on `Graphitron.newExecutionInput(...)`'s signature: the factory reflects the SDL's `contextArguments:` list verbatim, so a misspelled name produces a factory parameter under the misspelled name. The error you see is the consumer-side compile failure (or, if you pass `null` to fill that slot, an `NullPointerException` at the factory call from the per-slot `Objects.requireNonNull`), not a silent `null` at request time. +* *`contextArguments:` and `argMapping:` compose.* A single method may take `(table, GraphQL args mapped through argMapping, context args in declared order)` and the rewrite assembles the call site accordingly. + +== Constraints + +* `condition.className:` and `condition.method:` are both required for a meaningful directive. A `@condition` whose reference resolves to no method surfaces with the diagnostic `field '<name>' @condition: ...` or `argument '<name>' @condition: ...`. The class must be on the rewrite plugin's classpath, not the consumer module's. +* The first Java parameter is always the surrounding `Table<?>`. Resolve column references through `table.field(...)` rather than the static jOOQ-table handle, the alias-bearing accessor keeps the predicate anchored to the calling fetcher's `FROM` clause. +* Parameter names bind GraphQL argument names. Compile the carrying module with `<parameters>true</parameters>` so the names survive reflection. Diverging names are reconciled by `argMapping:`, not by reordering the method. +* `DSL.noCondition()` is the explicit no-op; return it for null or absent inputs. Returning `null` is undefined and currently throws at the predicate-folding site. +* Argument-level placement sees only that argument; sibling arguments are invisible. Field-level placement sees every direct argument, including those bound to `@table` inputs (the input arrives as the carrier type the input is bound to). Input-field-level placement walks the GraphQL argument map by path and delivers the leaf scalar. +* `argMapping:` is supported on `@condition`. It is not supported on `@externalField`, `@enum`, or `@sourceRow`. +* `contextArguments:` keys flow through `GraphQLContext` unmodified; the runtime is responsible for placing each key. Typos surface as `null` at request time. +* The override cascade and the divergence-from-legacy semantics live in xref:condition-cascade.adoc[How-to: Stacking and overriding conditions]. Read it before composing `@condition` with `override: true` across nested inputs. + +== See also + +* xref:../reference/directives/condition.adoc[`@condition`] is the directive's reference page; the parameter list, the `ExternalCodeReference` shape, and the per-site rejection messages live there. +* xref:condition-cascade.adoc[How-to: Stacking and overriding conditions] covers the override flag, the implicit-vs-explicit cascade, the input-carrier rules for nested inputs, and the regression-fenced divergence from the legacy generator's "outer owns everything" semantics. +* xref:external-code.adoc[How-to: Wire external Java code] covers the rewrite-plugin classpath, the FQCN requirement, and the `argMapping:` syntax that `@condition` shares with `@service` and `@tableMethod`. +* xref:../reference/directives/field.adoc[`@field(name: ...)`] supplies the implicit equality predicate that `@condition` either stacks with or replaces. +* xref:handle-services.adoc[How-to: Handle services] covers the alternative when the *whole* fetcher is custom code, `@condition` is for adjusting a single predicate inside an otherwise generated query. +* xref:../reference/directives/lookupKey.adoc[`@lookupKey`] is exempt from the implicit-predicate path; `@condition` on a lookup-key arg runs alongside the `VALUES + JOIN` lookup but does not interact with it. + +xref:index.adoc[← How-to index] diff --git a/docs/manual/how-to/apollo-federation.adoc b/docs/manual/how-to/apollo-federation.adoc new file mode 100644 index 0000000000..439269bf15 --- /dev/null +++ b/docs/manual/how-to/apollo-federation.adoc @@ -0,0 +1,109 @@ += How-to: Apollo Federation transport +:description: Wire the federation runtime around a Graphitron schema, the @link build-time opt-in, the two-arg buildSchema customizer for entity dispatch, the federation-graphql-java-support dependency, and the don't-double-wrap rule. +:!toc: + +When your SDL declares an Apollo Federation `@link`, `Graphitron.buildSchema(...)` returns a federation-wrapped `GraphQLSchema` directly: `_Service.sdl`, `_entities`, the synthesised `_Entity` union, and per-type entity dispatchers are wired automatically. Without the `@link` the call returns a vanilla schema and the federation surface stays out of the build entirely. The whole transport is a small surface (one SDL declaration, one or two dependencies, one customizer hook), but it has a few sharp edges that are easy to trip over (double-wrapping with `Federation.transform`, mixing `@link` and manual directive declarations, the `<schemaInput tag>` implicit opt-in). + +This recipe walks the operational mechanics: declaring the `@link`, building the federation-wrapped schema, swapping in a custom entity fetcher for hand-rolled types, and the constraints around the customizer hook. For entity declaration (`@key`, `@key(resolvable: false)`, multi-alternative dispatch, the `@experimental_constructType` stub-from-another-subgraph pattern), read xref:federation-keys.adoc[How-to: Federation key fields] first. + +== Declare the federation `@link` + +Open one of your `.graphqls` files with an Apollo Federation 2 `@link` directive that imports the spec directives you intend to use: + +[source,graphql] +---- +extend schema + @link( + url: "https://specs.apollo.dev/federation/v2.10", + import: ["@key", "@shareable", "@inaccessible", "@override", "@tag"] + ) +---- + +Pick whichever `v2.x` URL covers the directives in your `import:` list; Graphitron delegates federation-directive parsing to `federation-graphql-java-support`, which tracks the Apollo spec and gates each directive on its minimum version. An import of `"@composeDirective"` against `v2.0` fails composition cleanly, naming the directive and the URL. + +The `@link` is the *build-time* opt-in. Whatever schema file carries it flips an internal `federationLink` flag in the generator, which is what triggers the federation-wrapped emission of `Graphitron.buildSchema`. Without the `@link`, the wrap is skipped entirely and the schema behaves exactly as before. + +If you would rather not use `@link`, declare each federation directive manually: + +[source,graphql] +---- +directive @key(fields: String!, resolvable: Boolean = true) repeatable + on OBJECT | INTERFACE +directive @shareable on OBJECT | FIELD_DEFINITION +---- + +Mixing the two on the same directive (importing `@key` via `@link` *and* redeclaring it manually) fails validation; pick one approach per directive. + +== Add the runtime dependency + +The generated `GraphitronSchema.build(...)` references `Federation` and `SchemaTransformer` at compile time when `federationLink` is set. Declare `federation-graphql-java-support` on the consumer module's compile classpath: + +[source,xml] +---- +<dependency> + <groupId>com.apollographql.federation</groupId> + <artifactId>federation-graphql-java-support</artifactId> +</dependency> +---- + +`graphitron-sakila-example/pom.xml` carries this dependency for the federation-fixture build; copy the same shape into your consumer module. The dependency is *compile-scope* on the consumer module (not plugin-scope) because the federation symbols appear in the generated source the consumer compiles. + +== Build the federation-wrapped schema + +The single-arg form is identical to the non-federation case, the wrap is implicit: + +[source,java] +---- +GraphQLSchema schema = Graphitron.buildSchema(b -> {}); +// Federation directives, _Service.sdl, _entities, and _Entity are wired automatically. +---- + +`Graphitron.buildSchema(b -> {})` returns a schema whose `getQueryType()` exposes both your declared queries *and* the federation `_service` and `_entities` fields. The `_Entity` union lists every type Graphitron classifies as a federation entity (every `@node` type, every `@key`-bearing type), and `_service.sdl` reconstructs the SDL with synthesised `@key` directives on `@node` types so the supergraph composer can see them. + +The execution-tier tests `twoArgBuildDoesNotThrow`, `resultHasServiceType`, `resultHasEntitiesQueryField`, `resultEntityUnionContainsAllFixtureEntities`, and `serviceSdlExposesSynthesisedKeyOnNodeTypes` in `FederationBuildSmokeTest` pin this surface against `federation-graphql-java-support` API drift. + +*Don't double-wrap.* Calling `Federation.transform(...)` on a schema Graphitron already wrapped breaks composition: `_Service` and `_Entity` get added a second time, and the gateway sees a malformed subgraph. The wrap is automatic; let it happen. + +== Override the entity fetcher + +For every type Graphitron classifies, `_entities` resolution is wired automatically. `@node` types resolve via the NodeId path (decode the `id`, dispatch the per-type SELECT); types with a `@key` directive resolve via a column-value lookup. Both paths share the same per-type batched SELECT (one statement per `(__typename, alternative)` group), so federation gateway requests fan in without amplification. + +If your subgraph carries entity types Graphitron does *not* classify (hand-rolled GraphQL objects, types pulled from a non-Graphitron source), supply your own `fetchEntities` via the two-arg form: + +[source,java] +---- +GraphQLSchema schema = Graphitron.buildSchema( + b -> {}, + fed -> fed.fetchEntities(myCustomFetcher)); +---- + +The federation builder arrives pre-configured with Graphitron's defaults; the customizer replaces what the lambda touches and leaves the rest. The default fetcher resolves Graphitron-classified entities by routing through the per-type batched SELECT; a custom fetcher composes with that path by either delegating back to the default (for representations whose `__typename` is classified) or returning its own results (for representations the default doesn't recognise). + +Custom fetchers must return entities the default `resolveEntityType` recognises, jOOQ `Record`s with a `__typename` column. Richer type-resolution shapes (return a domain object with no jOOQ backing) are not currently supported; the supported extension point is the row shape graphql-java's federation support already understands. + +== The `<schemaInput tag>` flag + +The Maven plugin's `<schemaInput><tag>...</tag></schemaInput>` configuration emits `@tag(name: "...")` directives on schema types. `@tag` is meaningful only to a federation gateway, so the plugin treats the configuration as an *implicit* opt-in to Federation 2: + +* If you have *not* declared `@link`, the plugin synthesises one with `import: ["@tag"]` for you. Nothing else changes; you can still author `@key` / `@shareable` / etc. with manual declarations if you want. +* If you *have* declared `@link` but `"@tag"` is missing from the `import:` list, the build fails with a fatal error pointing at your `@link`. Add `"@tag"` to the `import:` list to clear it. +* If `<schemaInput tag>` is unset, the plugin makes no federation choice on your behalf; the `@link` (or its absence) is the only signal. + +This is the one place where federation-relevant state lives outside the SDL itself; the rest of the federation surface is SDL-driven. + +== Constraints + +* The build-time opt-in is the SDL `@link`. `Graphitron.buildSchema(...)` returns a federation-wrapped schema *iff* one of your schema files declares the `@link`; without it, no federation surface gets wired. +* Don't wrap the result in `Federation.transform(...)` yourself. Graphitron has already done it; a second wrap double-adds `_Service` / `_Entity` and breaks composition. +* The `federation-graphql-java-support` dependency is compile-scope on the *consumer* module (not the plugin), the symbols appear in generated source the consumer compiles. xref:external-code.adoc[How-to: Wire external Java code] covers the plugin-scope dependency layout for the *other* external-code directives; federation is the exception. +* Custom `fetchEntities` implementations must return entities the default `resolveEntityType` recognises (jOOQ `Record`s with a `__typename` column). Richer shapes (domain objects without jOOQ backing) are not currently supported. +* `<schemaInput tag>` triggers an implicit `@link(import: ["@tag"])` synthesis when no `@link` is present, and a fatal build error when `@link` is present without `"@tag"` in `import:`. The error spells out the fix. +* Mixing `@link` import and manual directive declaration on the same directive fails validation. Pick one per directive. +* The `@link` URL pins the Federation 2 minor version (`v2.10` in the canonical example). Pick whichever version covers the directives you import; the generator delegates the version gate to `federation-graphql-java-support`. + +== See also + +* xref:federation-keys.adoc[How-to: Federation key fields] is the entity-side companion; it covers `@key`, multi-alternative dispatch, compound keys, and the `resolvable: false` flag for entities owned by another subgraph. +* xref:tenant-scoping.adoc[How-to: Tenant scoping] covers per-request `DSLContext` routing (recipe is being rewritten under R45). + +xref:index.adoc[← How-to index] diff --git a/docs/manual/how-to/batch-lookups.adoc b/docs/manual/how-to/batch-lookups.adoc new file mode 100644 index 0000000000..ce88e9fb32 --- /dev/null +++ b/docs/manual/how-to/batch-lookups.adoc @@ -0,0 +1,145 @@ += How-to: Batch lookups +:description: Drive a positional batch fetch with @lookupKey across single, correlated, composite, NodeId-encoded, and per-parent shapes. +:!toc: + +xref:../reference/directives/lookupKey.adoc[`@lookupKey`] turns a query into a batch lookup: the client sends a list of key values, the server returns a list of results in the same positions, and unmatched keys surface as `null` at the corresponding output index. The reference page covers the directive's signature and the four canonical shapes; this recipe walks the operational variations: correlated multi-arg keys, composite keys behind a `@table` input, NodeId-encoded keys and the failure-mode split they imply, the `@splitQuery` interaction (per-parent narrowed batches), and the constraints that bite when keys are too many, the wrong shape, or paired with the wrong directive. + +== The positional contract + +Every `@lookupKey` shape compiles to the same generator pattern: a `VALUES(idx, key1, key2, ...)` derived table joined against the target table on the key columns, ordered by `idx`. The output list is the same length as the input key list; unmatched keys produce `null` at their input position. xref:sort-results.adoc[Sorts] do not apply: the order is the input order, full stop. Adding xref:../reference/directives/asConnection.adoc[`@asConnection`] on top of a `@lookupKey` field is rejected by the classifier (`@asConnection on @lookupKey fields is invalid`); pagination would shift positions and break the positional contract. + +The Sakila example schema's root lookups exercise the common shapes. The simplest is a single-scalar key: + +[source,graphql] +---- +type Query { + filmById(film_id: [ID] @lookupKey): [Film!]! + languageByKey(language_id: [Int] @lookupKey @field(name: "language_id")): [Language!]! +} +---- + +A request `filmById(film_id: ["1", "999999", "2"]) { title }` returns three positions in input order: `{ "ACADEMY DINOSAUR" }`, `null`, `{ "ACE GOLDFINGER" }`. The empty-list case short-circuits before touching SQL: `filmById(film_id: [])` returns `[]` without dispatching a query. + +== Correlated multi-argument keys + +Two `@lookupKey` arguments at the same call site correlate by index. `customerById(customer_id: [ID] @lookupKey, store_id: ID @lookupKey)` matches `(customer_id[i], store_id[i])` per row; a scalar key broadcasts to every position, while two list keys must have the same length. The generator builds `VALUES(idx, customer_id, store_id) JOIN customer USING (customer_id, store_id)`. + +[source,graphql] +---- +type Query { + customerById(customer_id: [ID] @lookupKey, store_id: ID @lookupKey): [Customer!]! +} +---- + +A request `customerById(customer_id: ["1", "2", "4", "3"], store_id: "1")` joins each customer id against `store_id = "1"` (broadcast) and returns four positions, `null` where a `(customer_id, store_id)` pair has no match. Two list arguments of unequal length are a runtime contract violation; wrap them in a `@table` input to get framework-level enforcement. + +The argument-level `@lookupKey` shape is right when the keys are scalar lists at the call site and the caller can be trusted to supply correlated lists. When the pairing matters and you want the schema to enforce it, the input-type shape is preferable. + +== Composite keys via `@table` input + +A `@table`-bound input type with `@lookupKey` on each leaf scalar lets the schema enforce that the keys travel together as one record. Each input element is one row of the lookup; the generator materialises `VALUES(idx, film_id, actor_id)` and joins on the full composite key. + +[source,graphql] +---- +type Query { + filmActorsByKey(key: [FilmActorKey!]! @lookupKey): [FilmActor!]! +} + +input FilmActorKey @table(name: "film_actor") { + filmId: Int! @field(name: "film_id") @lookupKey + actorId: Int! @field(name: "actor_id") @lookupKey +} +---- + +The contract: each `FilmActorKey` is one row of the `VALUES` table, the join is on the full key set, and the output preserves input order. `@lookupKey` on the argument itself (`key: [FilmActorKey!]! @lookupKey`) is the carrier marker; the per-leaf `@lookupKey` annotations are what bind individual fields into the key tuple. A leaf without `@lookupKey` is excluded from the key set and resolves like any other `@table`-bound input field. + +The same shape works for the `@mutation` directive's `UPDATE`/`DELETE`/`UPSERT` row identification, but that is a distinct use of `@lookupKey` on `INPUT_FIELD_DEFINITION` covered in xref:../reference/directives/mutation.adoc[`@mutation`]. + +== NodeId-encoded keys + +Two flavors of NodeId-driven lookup exist and they differ in failure mode: + +*Synthesised lookup-key path* (`@lookupKey` on an `[ID]` arg whose target type carries `@node`). Each opaque base64 id decodes once per row at the arg layer to a `Record<N>` of the target's primary-key columns; the generator emits `VALUES(idx, pk_col1, pk_col2, ...)` keyed on the decoded composite. Decode failure (a wrong-typename or malformed id) is a contract violation: it surfaces as `GraphqlErrorException` via `CallSiteExtraction.NodeIdDecodeKeys.ThrowOnMismatch`. + +[source,graphql] +---- +type Query { + filmActorByNodeId(id: [ID!]! @lookupKey): [FilmActor!]! +} +---- + +The output list is one element per opaque id, ordered by input position; the FilmActor type's two-column primary key (`actor_id`, `film_id`) is encoded into each id and decoded into the `VALUES` row. + +*Same-table `@nodeId` arg path* (`@nodeId(typeName: T)` on an `[ID]` arg whose `T` matches the field's return type). Same lookup-by-id semantics, but with filter-style failure handling: a malformed id silently drops to "no row matches" via `CallSiteExtraction.NodeIdDecodeKeys.SkipMismatchedElement`. The classifier synthesises `isLookupKey: true` for this arm, so an explicit `@lookupKey` on the same arg is rejected (`@nodeId already implies @lookupKey for same-table; the explicit directive is redundant`). + +[source,graphql] +---- +type Query { + filmsByNodeIdArg(ids: [ID!]! @nodeId(typeName: "Film")): [Film!]! +} +---- + +`filmsByNodeIdArg(ids: [<film_2>, "garbage", <film_4>])` returns two films at positions 0 and 2 and skips position 1 entirely; the malformed id never reaches the SQL pass. This contrasts with the `@lookupKey + @nodeId(typeName:)` case the generator rejects up front: pick one. For decode-side guidance on stable IDs, xref:global-id.adoc[How-to: Global object IDs] covers the encoder/decoder layout. + +== `@splitQuery` + `@lookupKey` (per-parent narrowed batch) + +When a `@lookupKey` field hangs off a list parent and you want each parent to receive only its own filtered child list, combine `@splitQuery` with `@lookupKey`. The fetcher emits a flat `SELECT` joined against two `VALUES` tables: one for the per-parent dispatch keys (driven by the `DataLoader`), one for the caller-provided lookup keys. + +[source,graphql] +---- +type Film @table(name: "film") { + actorsBySplitLookup(actor_id: [Int!] @lookupKey): [Actor!]! @splitQuery @reference(path: [ + {key: "film_actor_film_id_fkey"}, + {key: "film_actor_actor_id_fkey"} + ]) +} +---- + +Per request, the framework gathers every parent Film's `film_id`, dispatches one batched query that joins `film_actor` against the per-parent key set *and* the caller's `actor_id` list, then scatters rows back to their parents by `__idx__`. Each Film receives a list filtered by the caller's actor keys; absence of an actor in a film yields no row (not `null`) at the child position, since this is a list output, not a positional one. + +Without `@splitQuery`, the same `[Actor!]!` field with `@lookupKey` paginates across *all* parents in one wide SELECT: the lookup keys narrow the union of all parents' actors, not per-parent slices. That is rarely the right shape at the child level. The `actors(actor_id: [Int!] @lookupKey)` field on `Film` shows the inline (non-split) variant: it ships an inline correlated subquery per parent, useful when parent fan-out is small but wasteful at scale. + +The same composition applies at deeper nesting depths through plain-object `NestingField` parents. `Film.info.castByKey(actor_id: [Int!] @lookupKey)` (`info: FilmInfo`, `FilmInfo` plain-object) treats the nested arm as just another `SplitLookupTableField`: same DataLoader shape, deeper path. + +`@splitQuery` + `@lookupKey` + `@asConnection` is *not* a valid composition. The `@asConnection` rejection mentioned above applies to any `@lookupKey` field, including `@splitQuery` ones; combine `@splitQuery` + `@asConnection` (covered in xref:connections.adoc[connections]) for per-parent paginated children, or `@splitQuery` + `@lookupKey` for per-parent narrowed batches, but not all three at once. + +== `@lookupKey` on class-backed parents + +A class-backed parent reachable from `@service` is implicitly DataLoader-batched on its `@table`-typed children (`classifyChildFieldOnResultType` never inspects `@splitQuery` on record-parent table-bound fields). That same pattern admits `@lookupKey`: a `RecordLookupTableField` batches keyed by the parent record's PK and narrowed by the caller-provided lookup keys. Explicit `@splitQuery` is redundant on these fields, not rejected. + +[source,graphql] +---- +# backed by no.sikt.graphitron.rewrite.test.jooq.tables.records.FilmRecord, reflected from its producing field's return type +type FilmDetails { + actorsByLookup(actor_id: [Int!] @lookupKey): [Actor!]! @reference(path: [ + {key: "film_actor_film_id_fkey"}, + {key: "film_actor_actor_id_fkey"} + ]) +} +---- + +The same VALUES-pair join applies; the difference is purely on the parent side, where the key extraction reads from the jOOQ record's accessor rather than from a `@table` parent's projected `__idx__` column. + +== Constraints and pitfalls + +* `@asConnection` on a `@lookupKey` field is rejected. Pagination would shift positions, breaking the positional contract. +* Single-cardinality `@lookupKey` is rejected. Pass a list-returning field, or drop `@lookupKey`. +* Two layers of lists (e.g. `[InList] @lookupKey` where `InList { field: [String] }`) is rejected. The lookup operates over a flat keyset; flatten the input or drop the inner list. +* Multiple `@lookupKey` arguments at the same call site must have the same length; values at the same index are correlated. A scalar argument broadcasts to every position. Wrap correlated keys in a `@table` input when the schema should enforce the pairing. +* `@nodeId(typeName: T)` on the same arg implies `@lookupKey` when `T` matches the field's return type; the explicit `@lookupKey` is rejected as redundant. The decode failure mode is `Skip` (filter semantics, malformed ids drop silently). Synthesised lookup-key paths via `@lookupKey` on `[ID]` args use `Throw` (decode failure surfaces as `GraphqlErrorException`). +* Composite keys cap at 21 columns plus the implicit `idx` cell. `ValuesJoinRowBuilder` enforces jOOQ's typed `Row<N+1>`/`Record<N+1>` arity limit of 22; exceeding it fails the build with the offending arity in the message. +* Empty lookup-input short-circuits before SQL. Selecting `filmById(film_id: [])` returns `[]` without dispatching to the database. +* Keys should uniquely identify a row. Multiple rows matching one key collapses to one returned row (driver-dependent which); use `@condition` for non-uniquely-keyed filtering, not `@lookupKey`. +* `@lookupKey` args are exempt from the implicit `column = ?` predicate path. The cascade in xref:condition-cascade.adoc[Stacking and overriding conditions] excludes `@lookupKey`-bound names from `walkInputFieldConditions`, so a lookup arg doesn't double-filter via VALUES join AND a redundant `column IN (...)`. +* Only arguments on root-level fields (or on their referenced input types) and on child fields with arguments may be keys. xref:../reference/directives/mutation.adoc[`@mutation`] uses `@lookupKey` separately to identify the target row for `UPDATE`/`DELETE`/`UPSERT`; that's a distinct use of the same directive on `INPUT_FIELD_DEFINITION`. + +== See also + +* xref:../reference/directives/lookupKey.adoc[`@lookupKey`] is the directive surface and the canonical-shapes catalog. +* xref:../reference/directives/splitQuery.adoc[`@splitQuery`] composes with `@lookupKey` for per-parent narrowed child batches. +* xref:../reference/directives/nodeId.adoc[`@nodeId`] supplies the encoded-id decode plumbing; same-table `@nodeId` args synthesise `@lookupKey` automatically. +* xref:global-id.adoc[How-to: Global object IDs] covers stable-id strategies and the decode-side argument and input contracts that NodeId-keyed lookups depend on. +* xref:condition-cascade.adoc[How-to: Stacking and overriding conditions] covers the `@lookupKey` exemption from the implicit-predicate path. +* xref:connections.adoc[How-to: Cursor-paginated connections] covers the `@splitQuery` + `@asConnection` shape when paginated child slices are the goal instead of caller-narrowed keysets. + +xref:index.adoc[← How-to index] diff --git a/docs/manual/how-to/computed-fields.adoc b/docs/manual/how-to/computed-fields.adoc new file mode 100644 index 0000000000..ffb97f70a1 --- /dev/null +++ b/docs/manual/how-to/computed-fields.adoc @@ -0,0 +1,167 @@ += How-to: Computed fields with `@externalField` +:description: Resolve a field's value with a developer-supplied static method that returns a jOOQ Field, in lieu of a column or a join. +:!toc: + +The xref:../reference/directives/externalField.adoc[`@externalField`] directive hands one slot of a generated `SELECT` clause off to a developer-supplied static method that returns a jOOQ `Field<T>`. Reach for it when the value isn't a plain column and isn't reachable through `@field` or `@reference`: computed booleans, derived strings, vendor-specific SQL expressions, or `Field.convert(...)` lifts that fabricate a typed record from a single column. The method is invoked at code-generation time; its returned `Field<T>` is inlined under an alias into the parent table's `$fields()` projection, and a `ColumnFetcher` reads the alias from the result `Record` at request time. + +This recipe walks through writing the Java method, attaching the directive, and the three return shapes the rewrite recognises (scalar `Field<T>`, lifted `Field<TableRecord<?>>`, lifted `Field<CustomJavaRecord>`). For the plugin-classpath and FQCN mechanics shared with `@service`, `@condition`, and the other external-code directives, read xref:external-code.adoc[How-to: Wire external Java code] first. + +== Write the Java method + +Every `@externalField` method has the same shape: a `static` method on a public class, returning `Field<T>`, taking the parent type's jOOQ table class as its sole formal parameter. The example fixture computes a boolean column on `Film`: + +[source,java] +---- +package no.sikt.graphitron.rewrite.test.extensions; + +import no.sikt.graphitron.rewrite.test.jooq.tables.Film; +import org.jooq.Field; +import org.jooq.impl.DSL; + +public final class FilmExtensions { + + private FilmExtensions() {} + + public static Field<Boolean> isEnglish(Film table) { + return DSL.field(table.LANGUAGE_ID.eq(1)); + } +} +---- + +Three things matter: + +* *The sole parameter is the parent table's jOOQ class.* The rewrite passes the aliased parent table the field's fetcher is selecting from. Resolve column references through `table.LANGUAGE_ID` (the alias-bearing accessor) rather than the static `Film.FILM.LANGUAGE_ID` handle, the alias keeps the expression anchored in the caller's `FROM` and lets jOOQ render the projected column against the correct alias. +* *The return type's `T` matches the GraphQL scalar.* The rewrite trusts the declared return type at the reflection site; the GraphQL field's runtime type must be readable from the projected `T`. A `Field<Boolean>` for a `Boolean` field, a `Field<String>` for a `String`, and so on, with the lift forms below for class-backed (record-typed) fields. +* *The method runs at code-generation time, not at request time.* The `Field<T>` you return is inlined into the SQL once and reused for every fetcher invocation. Don't capture per-request state in the method; reach for xref:handle-services.adoc[`@service`] when the value depends on the request. + +Add the carrying artifact to the rewrite plugin's `<dependencies>` block, not your consumer module's compile classpath; the plugin reflects on the class via `Class.forName(...)` at code-generation time. xref:external-code.adoc[How-to: Wire external Java code] covers the plugin-classpath setup in full. + +== Attach the directive + +`@externalField` is valid only on `FIELD_DEFINITION`. Attach it on a field of a `@table`-bound type and point the reference at the static method: + +[source,graphql] +---- +type Film @table(name: "film") { + isEnglish: Boolean @externalField(reference: { + className: "no.sikt.graphitron.rewrite.test.extensions.FilmExtensions", + method: "isEnglish" + }) +} +---- + +When the GraphQL field name and the Java method name agree, omit `method:`, the rewrite uses the field name as the static-method name: + +[source,graphql] +---- +isEnglish: Boolean @externalField(reference: { + className: "no.sikt.graphitron.rewrite.test.extensions.FilmExtensions" +}) +---- + +The execution-tier test `films_isEnglish_resolvesViaExternalFieldExpression` in `GraphQLQueryTest` runs `{ films { title isEnglish } }` against the seeded Sakila data and asserts that every row's `isEnglish` resolves to `true` (all five seeded films carry `language_id = 1`). + +== Return shapes + +A `@externalField` method returns one of three shapes. The first is a plain scalar; the other two lift a single column into a typed record so child fields on the resulting class-backed type batch-fetch the rest. The method's return type *is* the binding for that class-backed type: the rewrite reflects the lifted record class straight off the `Field<...>` element type. + +=== Scalar `Field<T>` + +The default and the simplest case. `T` matches the GraphQL scalar (`Boolean`, `String`, `Integer`, …). The expression is whatever jOOQ exposes: column comparisons, `DSL.iif(...)`, `DSL.case_()`, vendor-specific casts, regex predicates. The rewrite drops the `Field<T>` into the parent's projection and reads the value out by alias. + +=== Lifted `Field<TableRecord<?>>` + +Use this shape when the GraphQL field returns a class-backed wrapper whose backing class is a jOOQ `TableRecord`. The static method projects a single column (typically a foreign-key value on the parent table), and `Field.convert(Converter.from(...))` converts the raw value into a `TableRecord` carrying that column as the PK: + +[source,graphql] +---- +type Inventory @table(name: "inventory") { + inventoryId: Int! @field(name: "INVENTORY_ID") + filmRef: FilmCard @externalField(reference: { + className: "no.sikt.graphitron.rewrite.test.extensions.InventoryExtensions", + method: "filmRef" + }) +} + +# backed by no.sikt.graphitron.rewrite.test.jooq.tables.records.FilmRecord, reflected from the filmRef @externalField method's Field<FilmRecord> return +type FilmCard { + filmId: Int @field(name: "film_id") +} +---- + +[source,java] +---- +public static Field<FilmRecord> filmRef(Inventory table) { + return table.FILM_ID.convert(Converter.from(Integer.class, FilmRecord.class, filmId -> { + FilmRecord f = new FilmRecord(); + f.setFilmId(filmId); + return f; + })); +} +---- + +The lifted `FilmRecord` carries only the PK; the framework batch-fetches non-PK columns on demand through the standard class-backed-parent paths. The execution-tier test `inventoryById_filmRef_resolvesViaExternalFieldReturningFieldOfTableRecord` runs `{ inventoryById(inventory_id: [1, 2, 3]) { inventoryId filmRef { filmId } } }` and asserts each row's `filmRef.filmId` equals the seeded `inventory.film_id`. + +=== Lifted `Field<CustomJavaRecord>` + +Use this shape when the wrapper is a developer-defined Java record with a typed `TableRecord` accessor. The classifier picks the canonical accessor (the record's component whose declared type is a jOOQ `TableRecord`) and produces an `AccessorKeyedSingle` batch key for any GraphQL child field returning the wrapped `@table` type, batching dispatch through a `DataLoader` keyed on the element table's PK: + +[source,graphql] +---- +type Inventory @table(name: "inventory") { + filmCardData: FilmCardWrapper @externalField(reference: { + className: "no.sikt.graphitron.rewrite.test.extensions.InventoryExtensions", + method: "filmCardData" + }) +} + +# backed by no.sikt.graphitron.rewrite.test.services.FilmCardData, reflected from the filmCardData @externalField method's Field<FilmCardData> return +type FilmCardWrapper { + film: Film +} +---- + +[source,java] +---- +public record FilmCardData(FilmRecord film) {} + +public static Field<FilmCardData> filmCardData(Inventory table) { + return table.FILM_ID.convert(Converter.from(Integer.class, FilmCardData.class, filmId -> { + FilmRecord f = new FilmRecord(); + f.setFilmId(filmId); + return new FilmCardData(f); + })); +} +---- + +The execution-tier test `inventoryById_filmCardData_firesAccessorKeyedSingleLiftThroughCustomJavaRecord` runs `{ inventoryById(inventory_id: [1, 2, 3]) { inventoryId filmCardData { film { filmId title } } } }`, asserts the `filmId` round-trips through the lift, and checks that `title` (a non-PK column not present on the lifted `FilmRecord`) resolves through the framework's PK-keyed batch fetch. This is the path that makes "lift one column on the parent, then read the full child row by PK" work without writing a service. + +== Pick a shape + +The default is whichever shape is closest to the value. A scalar field wants a `Field<T>`. A wrapper that fronts a single jOOQ table wants `Field<TableRecord<?>>`. A wrapper that bundles a typed record alongside other fields wants `Field<CustomJavaRecord>` so the canonical-accessor inference can derive the batch key. The xref:result-types.adoc[How-to: Result-type variants] recipe covers the broader decision tree for class-backed parents and accessor-driven batching. + +When the value is not a column-shaped expression at all (a network call, request-scoped logic, multi-row payload), the right directive is xref:handle-services.adoc[`@service`], not `@externalField`. When the value comes from following an FK chain to another table, the right directive is xref:../reference/directives/reference.adoc[`@reference`]. + +The wrapper types in the two lift forms above are class-backed: the `@externalField` method's `Field<...>` return type *is* the binding, so the wrapper type carries no directive of its own. + +== Constraints + +* The parent type must be `@table`-bound. The static method's sole formal parameter is the parent table's jOOQ class; without that anchor, reflection has no shape to bind. +* The GraphQL field name must not collide with a real SQL column on the parent table. The wiring side resolves the field by name via `DSL.field("<name>")` against the result `Record`; a collision shadows the actual column. Rename the field or use xref:../reference/directives/field.adoc[`@field(name: ...)`] to disambiguate. +* `className:` is required on the reference. A bare `@externalField` (no `reference:`, or a reference with no `className:`) surfaces with the diagnostic `external field reference could not be resolved -- missing className`. +* `method:` is optional. When omitted, the rewrite uses the GraphQL field name as the static-method name. Set `method:` only when the two diverge. +* `argMapping:` on the reference is structurally inert and is rejected at parse time. `@externalField` consumes no GraphQL-argument-bound parameters, the method's only formal parameter is the parent table. +* The static method must return `Field<T>` where `T` matches the GraphQL scalar, or one of the lift forms (`Field<TableRecord<?>>`, `Field<CustomJavaRecord>`) when the field's GraphQL type is class-backed (the method's `Field<...>` return type supplies the binding). +* The carrying class must be on the rewrite Maven plugin's classpath, not the consumer module's compile classpath. Reflection failures surface as `external field reference could not be resolved -- <reflection error>`. xref:external-code.adoc[How-to: Wire external Java code] covers the plugin-classpath setup. +* Combining `@externalField` with a `@reference` path (the condition-join lift form) is not yet supported; the build rejects this with a deferred-validation error. + +== See also + +* xref:../reference/directives/externalField.adoc[`@externalField`] is the directive's reference page; the parameter list, the `ExternalCodeReference` shape, and the per-site rejection messages live there. +* xref:external-code.adoc[How-to: Wire external Java code] covers the rewrite plugin's classpath setup, the FQCN requirement, and the method-name default. +* xref:result-types.adoc[How-to: Result-type variants] covers the class-backed parent decision tree, including the canonical-accessor inference that auto-derives batch keys for `Field<CustomJavaRecord>` lifts. +* xref:../reference/directives/reference.adoc[`@reference`] is the FK-driven counterpart; choose it when the value comes from a chain of catalog joins, choose `@externalField` when the value is a custom expression or a typed lift. +* xref:handle-services.adoc[How-to: Handle services] covers the alternative when the field's value depends on the request rather than on a column expression. +* xref:result-types.adoc[How-to: Result-type variants] also covers the class-backed wrapper types that the `Field<TableRecord<?>>` and `Field<CustomJavaRecord>` lift forms produce; the wrapper's backing class is reflected from the method's `Field<...>` return type, so no directive is needed on the wrapper. + +xref:index.adoc[← How-to index] diff --git a/docs/manual/how-to/condition-cascade.adoc b/docs/manual/how-to/condition-cascade.adoc new file mode 100644 index 0000000000..0b7f9249f5 --- /dev/null +++ b/docs/manual/how-to/condition-cascade.adoc @@ -0,0 +1,206 @@ += How-to: Stacking and overriding conditions +:description: Layer @condition with implicit equality predicates, control the cascade with override:true at argument and field level, pick the right input-type carrier for nested inputs, and recognise the rewrite's divergence from legacy "outer owns everything" semantics. +:!toc: + +xref:../reference/directives/condition.adoc[`@condition`] is the escape hatch for SQL predicates the catalog can't infer: regex, ranges, date arithmetic, vendor-specific shapes, multi-column boolean expressions. By default the explicit predicate is `AND`-ed with the implicit `column = ?` predicates the rewrite would have emitted on its own; `override: true` flips that to "explicit only". The `override:` flag interacts with field-level vs argument-level placement, with `@table`-bound vs plain inputs, and with how nested input types pass values down. This recipe walks through the cascade end-to-end, names the input-carrier choices that make nested `@condition` flow correctly, and pins the rewrite's intentional divergence from the legacy generator's "outer owns everything" semantics. + +For the directive's signature, parameter list, and canonical examples, see xref:../reference/directives/condition.adoc[`@condition`]. This recipe assumes you've read it. + +== The default: stack, don't replace + +Without `override: true`, every `@condition` is *additive*. The rewrite folds the developer-supplied `Condition` into the `WHERE` clause alongside whatever it would otherwise emit: + +[source,graphql] +---- +type Query { + citiesByName( + cityNames: [String!] @field(name: "CITY") + @condition(condition: {className: "com.example.CityConditions", method: "cityMethod"}) + ): [City] +} +---- + +Two predicates make it into SQL: the implicit `CITY IN (?, ?, ...)` from `@field(name: "CITY")` plus a list-typed argument, *and* the explicit `cityMethod(table, cityNames)` predicate. The two are `AND`-ed. This is usually what you want: the explicit method runs additional filtering on the same column, e.g. case-insensitive matching, normalised whitespace, locale-aware comparison. + +Field-level `@condition` (without `override:`) is the same shape, just at a different scope: the explicit predicate is `AND`-ed with the implicit predicates for *every* direct argument and (for `@table`-bound input arguments) every implicit column-equality predicate the input would otherwise contribute. + +== Argument-level `override: true`: scoped to one argument + +The narrow override: + +[source,graphql] +---- +type Query { + cities(countryId: String! @field(name: "COUNTRY_ID") + @condition(condition: {...}, override: true)): [City] +} +---- + +`override: true` on the argument suppresses *that argument's* implicit `column = ?` and lets the explicit condition method own the predicate alone. Other arguments on the same field are unaffected: their implicit predicates still fire, their explicit `@condition` annotations (if any) still fire on top. + +The implementation key is `ScalarArg.suppressedByFieldOverride() || argCondition.override()` in `FieldBuilder.projectFilters`: only the argument's own `BodyParam` is skipped; sibling arguments build their own `BodyParam` independently. + +== Field-level `override: true`: scoped to all direct arguments + +The wide override: + +[source,graphql] +---- +type Query { + cities( + countryId: String! @field(name: "COUNTRY_ID"), + cityNames: [String!] @field(name: "CITY") + ): [City] @condition(condition: {...}, override: true) +} +---- + +Field-level `override: true` suppresses the implicit predicates for *every* direct argument and, when an argument is a `@table`-bound input, every implicit column-equality predicate inside the input. The explicit method runs alone (in this example, alongside whatever inner explicit `@condition` annotations might be on the input's fields, but those are already covered by argument-level conditions; on a flat scalar arg list, there's just the field's own method). + +This is the right shape when the developer's condition method takes over completely: a multi-column boolean expression that the implicit equality decomposition would interfere with. + +== `@table` input + outer `override: true`: the cascade rule + +The non-obvious case. An outer field-level `@condition(override: true)` on a query whose argument is a `@table`-bound input: + +[source,graphql] +---- +type Query { + filmsOuterOverrideTableInput(filter: FilmConditionInput): [Film!]! + @condition( + condition: {className: "...InputFieldConditionFixtures", method: "outerOverrideMethod"}, + override: true + ) +} + +input FilmConditionInput @table(name: "film") { + filmId: Int @field(name: "FILM_ID") + @condition(condition: { + className: "...InputFieldConditionFixtures", + method: "filmIdCondition" + }) +} +---- + +Three things happen at request time: + +1. `outerOverrideMethod(filmTable)` runs (the outer explicit method, returning `film_id >= 2` in the fixture). +2. The implicit `filmTable.FILM_ID = ?` that the rewrite would normally derive from `filter.filmId` is *suppressed*. +3. The inner `filmIdCondition(filmTable, filmId)` runs *anyway* (the inner explicit method, returning `film_id = ?` for the supplied value). + +Net SQL `WHERE`: `(film_id >= 2) AND (film_id = 1)`. With the fixture data (`filmId: "1"`), no rows match. This is the rewrite's intended behavior: `override: true` *suppresses implicit predicates*, not explicit ones. Inner `@condition` annotations are preserved through any number of override layers above. + +The implementation key is `walkInputFieldConditions` in `FieldBuilder`: every `case` arm adds the `cf.condition()` filter to `out` unconditionally, while the implicit `BodyParam` is gated on `!enclosingOverride && cf.condition().isEmpty()`. The two paths are independent. + +The same shape applies recursively to nested input types: a `NestingField` propagates `enclosingOverride = enclosingOverride || (this nesting's @condition has override:true)` to its children. Implicit predicates anywhere below an override layer are suppressed; explicit predicates anywhere below are preserved. + +== Divergence from legacy semantics + +The legacy generator interpreted `override: true` as "outer owns everything": the inner explicit `@condition` annotations were *dropped*, and the outer method ran alone. The rewrite preserves the inner explicit conditions deliberately. The Sakila example schema has a regression-fence around this: `filmsOuterOverrideTableInput` (above) is paired with the `filmsOuterOverridePlainInput` fixture and a comment in the schema that says, verbatim: + +[quote] +____ +A regression to legacy semantics breaks this test by name. +____ + +The reason for the divergence: under the legacy reading, an inner `@condition` was meaningless once any ancestor used `override: true`, which made schema review brittle (an outer override meant inner annotations were silently inert). Under the rewrite's reading, every `@condition` always fires; only the rewrite's own implicit predicates are negotiable. This makes the directive composable and the schema readable: each `@condition` you write produces SQL. + +If you've been migrating from the legacy generator and you have an outer `@condition(override: true)` whose inner fields also carry `@condition`, audit them. The legacy generator silently dropped the inner ones; the rewrite runs them. You may need to add `override: true` to the inner annotation, or remove the inner annotation entirely if it was redundant with the outer method. + +== Plain (non-`@table`) inputs and implicit predicates + +When the argument is a plain input (no `@table` on the input type), the rewrite does *not* synthesise implicit `column = ?` predicates from the input's fields. Only explicit `@condition` annotations contribute. This is `PlainInputArg`'s job in `FieldBuilder.projectFilters`: + +[source,java] +---- +case ArgumentRef.InputTypeArg.PlainInputArg pia -> { + pia.argCondition().ifPresent(ac -> argConditions.add(ac.filter())); + walkInputFieldConditions(pia.fields(), pia.name(), List.of(), + false, Set.of(), null, argConditions); // null implicitBodyParams +} +---- + +The `null` argument means no implicit `BodyParam` ever materialises. The walker still descends and collects every explicit `@condition` it finds, but no implicit predicates contribute. This is why xref:../reference/directives/condition.adoc[`@condition`] on a plain input field is the *only* way to filter through that field; the implicit-equality fallback is unavailable. + +The same fixture pattern mirrors the `@table` case: `filmsOuterOverridePlainInput(filter: PlainFilmIdInput)` with outer `@condition(override: true)` and an inner `@condition` on `filter.filmId`. Both methods fire; outer-only semantics would fail the same regression fence. + +== Nested-input record conventions + +The `@condition` reference page lists the carrier rules in two lines; here's the operational shape, with the carriers spelled out. + +GraphQL input types classify into one of five carriers in the rewrite. For class-backed carriers, the backing class is reflected from the `@service` / `@condition` / `@tableMethod` method parameter the input flows into: + +* *xref:../reference/directives/table.adoc[`@table`]-bound* (`TableInputType`): Graphitron owns the column projection and DML. Most `@condition` fixtures sit here. +* *Class-backed by a Java record* (`JavaRecordInputType`): the producer's parameter is a record class; the rewrite binds GraphQL fields to its components. +* *Class-backed by a jOOQ record* (`JooqRecordInputType`) or a jOOQ `TableRecord` (`JooqTableRecordInputType`): the reflected carrier is a jOOQ-generated row type. +* *Plain* (`PojoInputType`): the fallback when the input is neither `@table`-bound nor reflected to a typed class. The carrier is `Map<String, Object>` at runtime. + +The non-obvious composition rules around `@condition`: + +* *jOOQ records can't contain other records.* A `@table` input or a jOOQ-record input can have a leaf-level `@condition`, but it cannot nest a child input that requires its own jOOQ-record carrier. That's a carrier-shape limitation, not a `@condition` one: there is no jOOQ class that carries a nested record. +* *Java-record carriers cascade upward.* If a leaf input is class-backed by a Java record, every input *above it* in the nesting chain must also be Java-record-backed. The rewrite needs a stable Java type to hold the nested record. Mixing carriers (e.g. a `@table` outer with a class-backed inner) does not compose: the outer `@table` input has no slot for the inner record. +* *Listed nested inputs require a Java record carrier.* `[InnerInput]` inside an outer input means the outer carrier must be a Java record (so the list element has a stable Java type to deserialise into). A `@table` outer with `[InnerInput]` inside is rejected at classify time. +* *Plain `PojoInputType` works for shallow scalar paths.* The runtime `Map<String, Object>` traversal handles any depth of plain inputs whose leaves are scalars and `@condition`-annotated. The example schema's `NestedFilmInput @table` outer / `InnerFilmInput` plain inner / `filmId @condition` leaf composition exercises this; the multi-segment path `["inner", "filmId"]` is extracted at runtime via `NestedInputField`. + +The conservative default: when in doubt, use `@table` on the outermost input (so the rewrite can drive implicit predicates) and plain inputs on inner nesting layers (so the rewrite's `Map`-traversal handles the descent). Only reach for a class-backed carrier (a service method whose parameter is a typed Java class) when the input shape demands a typed Java carrier, or when listed nested inputs are involved. + +== Lookup-key arguments are exempt + +A `@condition` does not interfere with xref:../reference/directives/lookupKey.adoc[`@lookupKey`]: lookup-key arguments are consumed upstream by `LookupValuesJoinEmitter`, not by the `WHERE`-clause projection. The implementation key is in `FieldBuilder.projectFilters`: + +[source,java] +---- +if (!autoSuppressed && !ca.isLookupKey()) { + bodyParams.add(...); +} +---- + +Lookup-key args bypass the `BodyParam` path entirely. The `lookupBoundNames` set passed into `walkInputFieldConditions` skips them on the input-side too, so an input field that backs a lookup key never emits an implicit predicate even when the input is `@table`-bound and `enclosingOverride` is false. + +If you `@condition` a lookup-key arg, the explicit predicate runs alongside the `VALUES + JOIN` lookup path. `override: true` on a lookup-key arg has no effect on the lookup itself (it's not a `WHERE`-clause predicate to suppress); it only affects the implicit `column = ?` that would otherwise pair with a non-lookup-key arg of the same shape. + +== `contextArguments:` flow + +Values pulled from `GraphQLContext` arrive as additional Java parameters on the reflected method, after the table and the input parameters: + +[source,graphql] +---- +type Query { + citiesForCurrentUser: [City] + @condition( + condition: {className: "...", method: "tenantScoped"}, + contextArguments: ["tenantId"] + ) +} +---- + +`tenantScoped(City table, UUID tenantId)` runs at request time. Two consequences: + +* *No build-time validation that the context key is wired.* A typo in `contextArguments` surfaces as a `null` parameter at request time, not at build time. Test the wiring (or log on null in the condition method). +* *`contextArguments:` and `argMapping:` are independent.* `argMapping:` rebinds GraphQL argument names to differently-named Java parameters; `contextArguments:` adds parameters from the request context. They compose: a method can take `(table, mapped GraphQL args, context args)` in that order. + +The supplying side of the context-argument story (tenant scoping, request-id propagation, current-user filtering) lives in xref:tenant-scoping.adoc[How-to: Tenant scoping] and the runtime-side `GraphitronContext` interface documented in xref:../reference/runtime-api.adoc[the runtime API reference]. + +== Constraints and pitfalls + +* *Default is additive.* Without `override: true`, an explicit `@condition` is `AND`-ed with the implicit `column = ?` predicates. Reach for `override:` only when the explicit method takes over completely. +* *Argument-level `override: true` is local.* Suppresses just that argument's implicit predicate, nothing else. +* *Field-level `override: true` cascades through `@table` inputs.* Suppresses implicit predicates on direct args and inside `@table`-bound input arguments. Inner `@condition` annotations are *preserved*. +* *Inner explicit `@condition` always runs.* The rewrite never drops a `@condition` annotation regardless of how many `override: true` layers sit above it. Migrators from the legacy generator should audit fields where outer `override: true` and inner `@condition` coexist; legacy semantics dropped the inner ones. +* *Plain inputs have no implicit predicates.* Only explicit `@condition` annotations contribute. Without one, a plain input field is silently a no-op on the SQL side. +* *jOOQ records cannot contain other records.* Inputs class-backed by a jOOQ record can have leaf `@condition`s but cannot nest a sibling jOOQ-record input. +* *Java-record carriers cascade upward.* If any input in a nesting chain is class-backed by a Java record, every input above it must also be Java-record-backed. +* *Listed nested inputs (`[InnerInput]`) require a Java record carrier on the outer input.* +* *`contextArguments:` is unvalidated at build time.* Typos surface as `null` at request time. +* *`@lookupKey` args bypass the implicit-predicate path.* `override:` has no effect on lookup-key dispatch; explicit `@condition` on a lookup-key arg runs alongside the `VALUES + JOIN`. + +== See also + +* xref:../reference/directives/condition.adoc[`@condition`] is the directive's reference page. +* xref:../reference/directives/field.adoc[`@field`] supplies the implicit predicate that `@condition` either stacks with or replaces. +* xref:../reference/directives/table.adoc[`@table`] (or, for class-backed inputs, the producer's reflected parameter type) determines the input carrier the condition method reads from. +* xref:../reference/directives/lookupKey.adoc[`@lookupKey`] is exempt from the implicit-predicate path. +* xref:../reference/directives/service.adoc[`@service`] is the alternative when an *entire* fetcher is custom code. +* xref:external-code.adoc[How-to: Wire external Java code] covers the FQCN requirement, classpath setup, and `argMapping:` syntax shared with `@condition`. +* xref:map-types-to-tables.adoc[How-to: Map types to tables] covers the input-type binding side that `@condition` builds on. + +xref:index.adoc[← How-to index] diff --git a/docs/manual/how-to/connections.adoc b/docs/manual/how-to/connections.adoc new file mode 100644 index 0000000000..f2046f0047 --- /dev/null +++ b/docs/manual/how-to/connections.adoc @@ -0,0 +1,111 @@ += How-to: Cursor-paginated connections +:description: Wrap a list as a Relay connection, name the synthesised types, account for totalCount cost, and understand what the rewrite does (and does not) cap. +:!toc: + +xref:../reference/directives/asConnection.adoc[`@asConnection`] turns a list field into a Relay connection: the schema-transform stage rewrites `[T!]!` to a synthesised `TConnection`, the generator emits keyset SQL, and the runtime returns `edges`, `nodes`, `pageInfo`, and (when asked for) `totalCount`. The reference page covers signature, examples, and constraints. This recipe addresses three operational questions that bite teams in review: why each connection field should own its own Connection type, what `totalCount` actually costs (and when it returns `null`), and what the rewrite does about page-size caps. + +For the cursor-stability and tie-breaker side of pagination, see xref:sort-results.adoc[How-to: Sort results]. The sort spec and the connection are separate concerns: the order is what the cursor encodes, and the connection is what the cursor traverses. + +== Synthesised vs declared connection types + +Two paths produce a connection type, and the rewrite recognises both: + +* *Directive-driven (synthesised).* `myField: [T!]! @asConnection` on a bare list. The generator manufactures `<ParentType><FieldName>Connection` and a matching `Edge` type, registers them on the schema, and rewrites the field's return type to point at the synthesised name. `Query.stores: [Store!]! @asConnection` becomes `Query.stores: QueryStoresConnection!`. +* *Structural (declared).* `myField: FilmsConnection!` where the SDL already declares `FilmsConnection { edges: [FilmsEdge!]!, nodes: [Film!]!, pageInfo: PageInfo!, totalCount: Int }`. The rewrite recognises the `edges.node` shape and reuses the SDL type as-is. `@asConnection` may also be present on the carrier, but the directive's job is just to opt the field into the connection emitter; no rewrite of the return type happens. + +The Sakila example schema uses both shapes intentionally: `Query.stores` exercises the synthesised path (`QueryStoresConnection`), and `Query.filmsConnection: FilmsConnection!` exercises the declared path. Both compile to the same kind of fetcher; the difference is purely which side owns the type's name. + +== One field, one connection type + +Each `@asConnection` field gets its own synthesised Connection type, named `<ParentType><FieldName>Connection`. The default is the recommended outcome: a field-specific type for a field-specific result set. The `connectionName:` argument that overrides the default is *deprecated*; reach for it only when migrating a legacy schema. + +The reason is semantic, not syntactic. Two fields that paginate the same element type usually do *not* return the same logical result: + +* *Different parents.* `Query.customers` returns the global customer list; `Store.customers` returns one store's customers. The element type is `Customer` in both cases, but the result sets are scoped differently. A shared `CustomersConnection` would lie about that scoping at the type level: a tool inspecting the schema would see one connection and assume one filter contract, when the runtime contracts differ. +* *Different filters and arguments.* A connection field's argument set is part of its identity. `Query.activeCustomers(active: Boolean = true)` and `Query.customers` produce different sub-populations of the same table; a shared Connection type would erase that distinction. +* *Different orders, different cursors.* The cursor wire format embeds the active sort columns. Two fields that have different `@defaultOrder` (or different `@orderBy` enum spaces) cannot share cursors, even when they share an element type. Sharing the Connection type but not the cursor format produces a leaky abstraction at the schema boundary. +* *Independent evolution.* Two fields that share a type evolve in lockstep: adding a column to one's order spec, adding a filter to one's element shape, or renaming one's edge metadata forces the other to follow. Field-owned Connections decouple that lifecycle. + +The synthesised default `<ParentType><FieldName>Connection` honours all four points by construction. `Query.customers` becomes `QueryCustomersConnection` and `Store.customers` becomes `StoreCustomersConnection`; they're separate types in the schema because they're separate things in the domain. Clients that need to pass both lists through the same UI component still can — the GraphQL types are independent, but the underlying `Customer` element shape is shared. + +The deprecated `connectionName:` override coalesces multiple carriers onto one type. It exists for one purpose: migrating a legacy schema where the wire-side name is already published and a rename would break clients. New schemas should not use it; legacy schemas should plan a transition off it. The dedup is also silent — two carriers with the same name but different element types reuse the first registration without validation, producing a connection whose `edges.node` doesn't match one of the carriers — which is a sharp edge worth avoiding for that reason alone. + +== `totalCount` is lazy and orthogonal + +`totalCount: Int` is optional on every connection (synthesised or declared). The reference page documents the field; the operational facts are: + +* *Lazy on selection.* graphql-java only invokes the registered `totalCount` resolver when the client selects the field. Queries that ask for `edges`, `nodes`, or `pageInfo` and skip `totalCount` pay zero count cost. This is why `totalCount` is `Int` (nullable), not `Int!`: the resolver can decline to produce a value, and the field's nullability lets the caller observe that. +* *Issued as a separate `SELECT count(*)`.* The page query and the count query are independent SQL passes. The count uses the same `Table<?>` and `Condition` the page used (carried on the `ConnectionResult` for root connection fetchers), so the count matches the page's predicate; it does not duplicate the page's projection or `seek/limit`. +* *Returns `null` on split-connection paths.* Per-parent paginated children built with `@asConnection` + xref:../reference/directives/splitQuery.adoc[`@splitQuery`] (e.g. `Film.actorsConnection`) supply a `ConnectionResult` without `(table, condition)`: the scatter pass partitions one wide query across many parents, so there is no single per-parent `(table, condition)` pair to count against. Selecting `totalCount` on a split-connection carrier returns `null` until the per-parent count plumbing lands. This is observable: clients asking for `totalCount` on `Film.actorsConnection` see `null`, not the per-film actor count. +* *Returns `null` on multi-table polymorphic connections.* `Query.searchConnection` and friends emit a per-branch `UNION ALL` wrapped in a derived table. The polymorphic count query is a separate roadmap follow-up; until it lands, `totalCount` on these carriers also returns `null`. + +The performance consequence: keep `totalCount` available in the schema for clients that need it, but do not assume it costs nothing per query. A client that always asks for `totalCount` doubles the round trip count; for high-RPS reads, prefer not selecting it. + +== Page size: `defaultFirstValue` and the missing cap + +Page size resolves at request time: + +* *Client supplies `first: N`.* Use `N`. No cap. +* *Client omits `first:`.* Use the directive's `defaultFirstValue:` (the `@asConnection(defaultFirstValue: 5)` argument), or the generator's `DEFAULT_PAGE_SIZE = 100` when `defaultFirstValue:` is also omitted. +* *Backward pagination (`last: N`).* Same shape, `last` substitutes for `first` in the resolution. + +There is *no server-side cap on `first:` or `last:`* in the rewrite. The legacy generator's `<maxAllowedPageSize>` Maven-plugin setting was deliberately excised from the rewrite plugin (the rewrite Mojo's five `@Parameter` fields are `schemaInputs`, `outputDirectory`, `outputPackage`, `jooqPackage`, `namedReferences`; no page-size cap). A client passing `first: 100000` will produce that many rows, modulo database memory and network limits. + +If you need a request-rate or page-size cap, enforce it outside the generator: + +* *Apollo persisted queries* or another query-allowlist that constrains accepted shapes. +* *Servlet-layer limits* (request size, response size, query timeout) configured on the host application. +* *graphql-java instrumentation* that rejects queries whose `first:`/`last:` exceed a threshold before the field resolves. + +The `defaultFirstValue:` argument is purely a default for the omitted-`first:` case, not a cap. Setting `@asConnection(defaultFirstValue: 5)` on `Query.searchConnection` (as the example schema does) means clients that don't ask for a specific page size get five rows; clients that ask for `first: 1000` still get up to 1000. + +== Cursor encoding is part of the public contract + +Cursors are base64-encoded NUL-separated tuples of the active sort columns' values for the last row of the page. Two consequences worth restating here (the sort recipe covers the full set): + +* *The cursor's columns are the order's columns.* Adding, removing, or reordering columns in xref:../reference/directives/defaultOrder.adoc[`@defaultOrder`] or in an xref:../reference/directives/order.adoc[`@order`] enum value invalidates outstanding cursors. Treat the order column list as part of the cursor wire contract. +* *Decoding rejects shape mismatches.* When the request's effective order produces a different column count than the cursor decodes, the request fails. A cursor issued under `@orderBy` cannot be replayed against a `@defaultOrder`-only request unless the column lists happen to coincide. + +Backward pagination reuses the same encoding; the rewrite reverses each `SortField`'s direction via jOOQ's `$field()`/`$sortOrder()` model API, runs the seek, and reverses the in-memory result before returning. A cursor issued from a `first:` page round-trips through a `before:` request and vice versa. + +== Composition with `@splitQuery` + +`@asConnection` + `@splitQuery` is the right pattern for paginated child lists (per-parent slices). The combination produces a `ROW_NUMBER() OVER (PARTITION BY parentInput.idx ORDER BY ...)` envelope so each parent's connection page is the leading N+1 rows of its partition; a `DataLoader` batches the dispatch across parents. + +[source,graphql] +---- +type Film @table(name: "film") { + actorsConnection( + first: Int, last: Int, after: String, before: String + ): ActorsConnection! @splitQuery @reference(path: [ + {key: "film_actor_film_id_fkey"}, + {key: "film_actor_actor_id_fkey"} + ]) @defaultOrder(primaryKey: true) +} +---- + +Without `@splitQuery`, the same `[Actor!]!` child list under `@asConnection` paginates *across all parents in a single SQL pass*: there is no `PARTITION BY` envelope, and the `first: N` argument applies to the union of all parents' rows. That is rarely the right behavior at the child level; reach for `@splitQuery` whenever the parent appears in a list. + +The `totalCount` consequence cited above applies here: split-connection carriers return `null` for `totalCount` until per-parent count plumbing lands. + +== Constraints and pitfalls + +* `@asConnection` applies to list-typed fields. Single-cardinality `@asConnection` is rejected at classify time. +* The field must have a stable order. Either xref:../reference/directives/defaultOrder.adoc[`@defaultOrder`] is set, or xref:../reference/directives/orderBy.adoc[`@orderBy`] is required at runtime; without one, keyset pagination has no anchor and the build fails. +* `connectionName:` is deprecated. Each connection field should own its own Connection type; the override exists as a transition mechanism for legacy schemas. When set, the dedup is silent — two carriers with the same name and different element types reuse the first registration and only the first carrier's element type appears under that connection's `edges.node`. +* `totalCount` is `null` on split-connection and multi-table polymorphic carriers. Document this for clients; do not surface `0` as a substitute. +* `totalCount` is lazy on selection but a separate SQL pass when selected. Treat it as observable extra cost; don't assume it's free. +* No server-side page-size cap. `defaultFirstValue:` is the omitted-`first:` default, not a maximum. Enforce caps at the API layer if needed. +* Cursor wire format embeds the active order's columns. Sort-spec changes invalidate outstanding cursors; treat the column list as part of the public contract. +* `@asConnection` + `@splitQuery` is the right shape for per-parent paginated children. `@asConnection` alone on a child list paginates across all parents. + +== See also + +* xref:../reference/directives/asConnection.adoc[`@asConnection`] establishes the connection wrapper. +* xref:../reference/directives/splitQuery.adoc[`@splitQuery`] dispatches per-parent connections through a `DataLoader`. +* xref:../reference/directives/defaultOrder.adoc[`@defaultOrder`] anchors the cursor. +* xref:../reference/directives/orderBy.adoc[`@orderBy`] supplies dynamic order. +* xref:sort-results.adoc[How-to: Sort results] covers cursor stability, tie-breakers, and the collation pitfalls that bite at scale. +* xref:polymorphic-types.adoc[How-to: Polymorphic types] covers union/interface connection emission and the multi-table `__sort__` shape. + +xref:index.adoc[← How-to index] diff --git a/docs/manual/how-to/custom-scalars.adoc b/docs/manual/how-to/custom-scalars.adoc new file mode 100644 index 0000000000..da763552ee --- /dev/null +++ b/docs/manual/how-to/custom-scalars.adoc @@ -0,0 +1,125 @@ += How-to: Custom scalars +:description: Declare a custom scalar in the SDL and bind it to a graphql-java GraphQLScalarType constant via the @scalarType(scalar:) directive; Graphitron registers the constant on the synthesized schema for you. +:!toc: + +GraphQL leans on a small set of built-in scalars (`Int`, `Float`, `String`, `Boolean`, `ID`); real schemas usually need more (`UUID`, `Date`, `DateTime`, `JSON`, `Long`). Graphitron itself never coerces values; it leaves coercion to graphql-java by emitting `GraphQLTypeReference.typeRef("<name>")` everywhere a scalar is referenced. The reference is resolved against a `GraphQLScalarType` registered on the synthesized schema, and Graphitron's scalar resolver does that registration for you so the `buildSchema(...)` customizer does not have to. + +This recipe walks through declaring the scalar in the SDL, pointing the `@scalarType(scalar:)` directive at a `public static final GraphQLScalarType` constant on the classpath, and the convention-table shortcut that lets you omit the directive entirely for shapes covered by `graphql-java-extended-scalars`. The full directive surface (per-arm rejection reasons, LSP completion, classpath-visibility rules) is on the xref:../reference/directives/scalarType.adoc[`@scalarType` directive reference]; this recipe is the worked example. + +== Declare the scalar and bind it in one place + +Add a `scalar` declaration to one of your `.graphqls` files and attach `@scalarType(scalar: "FQN.FIELD")` pointing at the constant you want the schema to use. The fully-qualified reference takes the form `package.Class.FIELD`; inner classes use `$` (`pkg.Outer$Inner.FIELD`). + +[source,graphql] +---- +scalar UUID @scalarType(scalar: "graphql.scalars.ExtendedScalars.UUID") +scalar DateTime @scalarType(scalar: "graphql.scalars.ExtendedScalars.DateTime") + +type Customer @table(name: "customer") { + id: UUID @field(name: "customer_id") + createdAt: DateTime @field(name: "create_date") +} +---- + +Graphitron loads each named class via the project-aware codegen classloader, reads the static final field, and reflects on the bound `Coercing<I, O>` to recover the Java type used for input-record components, service parameters, and `Field<X>` projections. The constant is then registered on the synthesized schema (`.additionalType(<constant>)`) automatically. Consumer code does not need to wire the scalar in its `buildSchema(...)` hook. + +[NOTE] +==== +The class the directive points at must be on the *codegen* classpath: the consumer module's `target/classes`, a reactor sibling's `target/classes`, or a declared dependency. Classes from `<plugin><dependencies>` are not visible because they live on the plugin classloader, not the project classloader. +==== + +== Skip the directive when extended-scalars covers the shape + +`graphql-java-extended-scalars` ships ready-made constants for most common shapes. If the SDL name matches one of the 30 entries in graphitron's convention table _and_ `graphql.scalars.ExtendedScalars` is on the consumer's compile classpath, the directive is optional: a bare `scalar UUID` resolves to `ExtendedScalars.UUID` automatically. Both the bare (`scalar BigDecimal`) and `GraphQL`-prefixed (`scalar GraphQLBigDecimal`) names map to the same constant. + +[source,graphql] +---- +# Resolves to ExtendedScalars.UUID via the convention table: +scalar UUID + +# Same, but explicit — useful as the canonical form when you want the +# resolution path to be obvious at read time: +scalar UUID @scalarType(scalar: "graphql.scalars.ExtendedScalars.UUID") +---- + +Pick whichever form you prefer. The directive wins over the convention layer, so a consumer who imports extended-scalars but wants `BigDecimal` modeled as their own `Money` wrapper just writes: + +[source,graphql] +---- +scalar BigDecimal @scalarType(scalar: "com.example.Scalars.MONEY") +---- + +and the directive's `MONEY` constant beats the conventional `ExtendedScalars.GraphQLBigDecimal`. + +== Build your own `GraphQLScalarType` for a unique domain shape + +When no library covers the shape, author the constant in your consumer module and point `@scalarType` at it. The constant must be `public static final`, non-null at code generation, and assignable to `graphql.schema.GraphQLScalarType`. The bound `Coercing<I, O>` must declare concrete type parameters (a raw `Coercing`, `Coercing<Object, Object>`, or an anonymous-class declaration whose `I` erases to `Object` is rejected with a `CoercingErased` reason). + +[source,java] +---- +package com.example.scalars; + +import graphql.schema.Coercing; +import graphql.schema.GraphQLScalarType; + +public final class Scalars { + + public static final GraphQLScalarType EPOCH_SECONDS = GraphQLScalarType.newScalar() + .name("EpochSeconds") + .description("Unix epoch seconds, signed 64-bit.") + .coercing(new Coercing<Long, Long>() { /* serialize / parseValue / parseLiteral */ }) + .build(); + + private Scalars() {} +} +---- + +Then point the SDL declaration at the constant: + +[source,graphql] +---- +scalar EpochSeconds @scalarType(scalar: "com.example.scalars.Scalars.EPOCH_SECONDS") +---- + +The `Coercing<Internal, External>` parameters let you choose the Java side (`Internal`) and the wire side (`External`) independently; graphql-java's javadoc covers the contract for each method. `name()` must match the SDL `scalar` declaration; the runtime resolves `typeRef("EpochSeconds")` against this exact name. Once the directive resolves, Graphitron binds input-record components, service parameters, and `Field<EpochSeconds>` projections to `Long` everywhere `EpochSeconds` appears in the SDL. + +== Resolution order and failure modes + +Graphitron's scalar resolver tries three layers in order; first hit wins: + +. *Spec built-ins.* `Int`, `Float`, `String`, `Boolean`, `ID` resolve through a closed table baked into the resolver. `@scalarType` on a spec built-in name is a hard validation error (directive conflict). +. *`@scalarType(scalar:)` directive.* The consumer's explicit reference, takes precedence over the convention layer. +. *graphql-java-extended-scalars convention.* SDL name matches a convention-table entry _and_ the artifact is on the compile classpath. + +If none of the three layers produces a hit, the scalar is unresolved and the build fails with a validation error pointing at `@scalarType(scalar:)` or extended-scalars as the fix. There is no silent fallback to `Object`. + +Field-level rejection reasons are surfaced with per-arm messages: `FieldNotFound`, `FieldNotAccessible`, `NullAtCodegen`, `NotAScalarType`, `CoercingErased`. The directive reference catalogues each one. + +== Migrate off manual `additionalType(...)` calls + +Earlier rewrite snapshots taught registering scalars through the `Graphitron.buildSchema(...)` customizer with `b.additionalType(ExtendedScalars.UUID)`. Once `@scalarType` resolves the same scalar, graphql-java's `GraphQLSchema.Builder.additionalType` rejects the duplicate type-name at build time with a `SchemaProblem`. The migration is mechanical: remove the manual `.additionalType(<scalarConstant>)` line from your customizer for every scalar Graphitron now resolves. + +The customizer is still the right place for *non-scalar* additional types and for custom directives; the additivity contract documented in xref:../reference/runtime-api.adoc[the runtime API reference] is unchanged. + +== Editor support + +The graphitron LSP completes `@scalarType(scalar: |)` on a `scalar X` declaration with the convention-table FQNs, preferring the entry that matches the SDL name when one exists. Diagnostics surface malformed references (no dot) and unknown classes (FQN whose class part is not on the compile classpath scan) inline; field-level failures (`FieldNotFound`, `CoercingErased`, etc.) surface during the build. + +== Constraints + +* `@scalarType` is only valid on `scalar` declarations. Applying it to a spec built-in (`Int`, `Float`, `String`, `Boolean`, `ID`) is a directive-conflict validation error: the GraphQL spec and graphql-java already bind these names. +* The SDL `scalar <Name>` declaration is what makes the name resolvable in the SDL; the `@scalarType(scalar:)` directive (or the convention-table fallback) is what makes the *reference* resolvable in the built schema. The SDL name and the registered `GraphQLScalarType` constant's `name()` must match exactly. +* The referenced class must be on the codegen classpath (consumer module's `target/classes`, any reactor sibling's `target/classes`, or a declared dependency). Plugin-classpath visibility does not count. +* The referenced field must be `public static`, non-null at code generation, and assignable to `graphql.schema.GraphQLScalarType`. +* The constant's `Coercing<I, O>` must declare concrete type parameters; raw, `Object`-erased, or anonymous-class declarations whose `I` resolves to `Object` are rejected with a `CoercingErased` reason. +* Federation-namespaced scalars (e.g. `_FieldSet`) are wired automatically when the SDL declares an Apollo Federation `@link`; do not redeclare them with `@scalarType`. xref:federation-keys.adoc[How-to: Federation key fields] covers the federation directive surface. + +== See also + +* xref:../reference/directives/scalarType.adoc[`@scalarType` directive reference] is the canonical surface for the directive: SDL signature, parameters, resolution order, and the per-arm rejection reasons in full. +* xref:../reference/runtime-api.adoc[Runtime API reference] documents `Graphitron.buildSchema(...)`, including the customizer's additive-only contract for non-scalar extension. +* xref:federation-keys.adoc[How-to: Federation key fields] covers federation entity declaration; federation-namespaced scalars are wired by the federation transform automatically. +* xref:polymorphic-types.adoc[How-to: Polymorphic types] covers the supported `.codeRegistry(UnaryOperator)` extension point for type resolvers on hand-rolled interfaces and unions. +* The graphql-java-extended-scalars project: https://github.com/graphql-java/graphql-java-extended-scalars[graphql-java-extended-scalars] for ready-made `GraphQLScalarType` constants covering `BigDecimal`, `DateTime`, `UUID`, and similar. + +xref:index.adoc[← How-to index] diff --git a/docs/manual/how-to/dev-loop.adoc b/docs/manual/how-to/dev-loop.adoc new file mode 100644 index 0000000000..ad3c0328e6 --- /dev/null +++ b/docs/manual/how-to/dev-loop.adoc @@ -0,0 +1,138 @@ += How-to: The dev loop (Quarkus + LSP) +:description: The inner loop for working on an existing Graphitron subgraph under Quarkus, why macOS needs the LSP, and how to connect IntelliJ to it. +:!toc: + +You have an existing Graphitron subgraph and you want a tight edit-save-see-it loop. The short version: run two long-lived terminals, one for `mvn graphitron:dev` (regenerates Java from your `.graphqls`, serves an LSP to your editor, and serves an MCP server to your agent), one for `mvn quarkus:dev` (hot-reloads the running app). Edit the schema, save, and the change flows through both without restarting anything. + +[TIP] +==== +On macOS the filesystem-watch half of this loop is slow on its own. Attaching your editor to the LSP is what makes saves feel instant. See <<macos>>. +==== + +== TLDR + +[cols="1,3"] +|=== +| Step | What to run + +| 1. Regenerate + LSP +| `mvn graphitron:dev` in a side terminal. Binds an LSP on `localhost:8487`, watches your `.graphqls`, regenerates only the changed files under `target/generated-sources/graphitron`. + +| 2. Run the app +| `mvn quarkus:dev` in another terminal. Quarkus watches `target/generated-sources/` by mtime and hot-reloads only the classes that actually changed. + +| 3. Connect your editor +| Point your LSP client at `localhost:8487` (TCP) for diagnostics, hover, completion, and go-to-definition on `.graphqls`. IntelliJ users: see <<intellij>>. + +| 4. Connect your agent (optional) +| Point an MCP-aware agent (Claude Code, Cursor) at `http://127.0.0.1:8488/mcp`. See <<mcp>>. + +| 5. Edit and save +| Save a `.graphqls`. Graphitron regenerates, Quarkus reloads, your editor refreshes diagnostics. No restart of either terminal. +|=== + +Both Maven goals are long-lived. Start them once at the beginning of a session and leave them running; stop with Ctrl+C. + +== The loop in detail + +`mvn graphitron:dev` is one JVM, one terminal, one socket. It binds an LSP server on `localhost:8487`, watches your schema sources, and on every save re-runs the generator. Writes are idempotent: only files whose rendered content actually changed touch disk (SHA-256 comparison), and types you delete from the schema have their generated files removed. So `git diff` after a session shows only what the edit predicts, and downstream tools recompile only what changed. + +That idempotence is exactly what lets `quarkus:dev` sit on top. Quarkus detects source-root changes by mtime; because unchanged generated files keep their mtimes, a one-type schema edit triggers a reload of just that type's classes, not the whole schema. The same is true of IntelliJ's incremental compiler and Spring Boot DevTools, so no Graphitron-specific build plugin is needed for the reload half. + +If `8487` is already in use, pass `-Dgraphitron.dev.port=N` to `mvn graphitron:dev` and use the matching port in your editor config. The goal fails fast on a bind conflict with a message naming the property; it never silently rebinds to a port the editor would not know about. + +For the full picture of how the schema watcher, classpath watcher, and generator dispatch cooperate inside the `dev` goal, see xref:../../architecture/how-to/dev-loop-internals.adoc#dev-loop-detail[the dev loop reference] in the architecture docs. + +[#macos] +== Why macOS needs the LSP + +Java's `WatchService` has no native file-event backend on macOS; it falls back to a polling implementation that only notices a change on its next poll. In practice a save can take several seconds to register, which makes the filesystem-watch path of the dev loop feel laggy on a Mac in a way it does not on Linux. + +The LSP path sidesteps this entirely. When your editor is attached to the LSP on `localhost:8487`, the editor's save event drives the regeneration directly, instead of waiting for the polling watcher to notice the file changed on disk. So on macOS, attaching your editor to the LSP is not just for diagnostics and completion: it is what restores an instant save-to-regen loop. The schema watcher still runs as a headless fallback for saves made outside the attached editor; it is just slower on this platform. + +Linux and Windows have native watch backends and do not suffer this latency, but connecting the editor is still worth it for the diagnostics, hover, completion, and go-to-definition the LSP provides. + +== Connect your editor to the LSP + +The LSP speaks over TCP on `localhost:8487`. Any LSP client that can connect to a TCP socket works: point it at that address and register it for `.graphql` and `.graphqls` files. Neovim, Helix, and VS Code can target a TCP socket directly. IntelliJ needs one extra hop, covered next. + +[#intellij] +== IntelliJ users + +IntelliJ's LSP support (both the Ultimate built-in API and the LSP4IJ plugin) launches a language server as a subprocess and talks to it over stdin/stdout; neither connects to a TCP socket out of the box. The simplest bridge is `netcat`: a `nc 127.0.0.1 8487` subprocess copies bytes between IntelliJ's stdio and the dev server's socket. + +Set it up with https://plugins.jetbrains.com/plugin/23257-lsp4ij[LSP4IJ] (Red Hat), which works in both IntelliJ Community and Ultimate: + +. Install **LSP4IJ** from Settings -> Plugins -> Marketplace. +. Open Settings -> Languages & Frameworks -> Language Servers, add a new server, and import (or fill in) this configuration: ++ +[source,json] +---- +{ + "name": "Graphitron", + "programArgs": { + "default": "sh -c \"nc 127.0.0.1 8487\"" + }, + "languageMappings": [ + { + "language": "GraphQL", + "languageId": "graphql" + } + ], + "fileTypeMappings": [ + { + "fileType": { + "patterns": [ + "*.graphql" + ] + }, + "languageId": "graphql" + }, + { + "fileType": { + "patterns": [ + "*.graphqls" + ] + }, + "languageId": "graphql" + } + ] +} +---- ++ +The `programArgs` command is what bridges stdio to the dev server's TCP socket; the mappings register the server for `.graphql` and `.graphqls` files. +. Start `mvn graphitron:dev` in a terminal first (the bridge connects to it; if the dev goal is not running, `nc` exits immediately and IntelliJ reports the server as crashed). +. Open a `.graphqls` file. LSP4IJ spawns the bridge, attaches, and you get diagnostics, hover, completion, and go-to-definition. + +Notes: + +* `nc` ships with macOS and most Linux distributions. On Windows, install a netcat (for example `ncat` from Nmap) and adjust the command, or use an editor that connects to TCP directly. +* If you overrode the port with `-Dgraphitron.dev.port=N`, change `8487` in the command to match. +* The dev goal serves all connected clients off the same warm catalog, so you can attach IntelliJ and another editor at once; a save in either is seen by both. +* A native IntelliJ plugin that removes the manual LSP4IJ + netcat setup is on the roadmap; until it ships, this is the supported IntelliJ path. + +[#mcp] +== Connect your agent to the MCP server + +The same `mvn graphitron:dev` process that serves the LSP also runs an MCP server on `http://127.0.0.1:8488/mcp` (Streamable HTTP, loopback only). An MCP-aware agent (Claude Code, Cursor) connected to it gets read-only context about your project: it can search the bundled manual (`docs.search`), discover tables in your jOOQ catalog (`catalog.search`, `catalog.describe`), inspect the classified schema, `@service` / `@condition` / `@record` bindings, and the current validation diagnostics, plus a `+/mcp__graphitron__about+` slash command that orients it on the loop. + +For Claude Code, run the line the dev server prints on startup: + +---- +claude mcp add --transport http graphitron http://127.0.0.1:8488/mcp +---- + +Unlike the LSP port, the MCP port is fixed at `8488` and not overridable, so a committed `.mcp.json` stays valid across machines. If `8488` is already taken, the dev goal fails fast naming the conflict rather than rebinding. + +The full setup, the complete tool list, and the `.mcp.json` for zero-config sharing are in xref:mcp-agent-context.adoc[Agent context over MCP]. + +== See also + +* xref:mcp-agent-context.adoc[Agent context over MCP]: connect an MCP-aware agent to the same dev server. +* xref:../../architecture/how-to/dev-loop-internals.adoc#dev-loop-detail[Dev loop reference] (architecture docs): how the `dev` goal is wired internally. +* xref:../reference/lsp-inlay-hints.adoc[LSP inlay hints]: the editor hints the LSP surfaces. +* xref:test-your-schema.adoc[Test your schema]: the consumer-side execution test that complements the inner loop. + +xref:index.adoc[← How-to index] +</content> +</invoke> diff --git a/docs/manual/how-to/error-channel.adoc b/docs/manual/how-to/error-channel.adoc new file mode 100644 index 0000000000..2892a8bec5 --- /dev/null +++ b/docs/manual/how-to/error-channel.adoc @@ -0,0 +1,150 @@ += How-to: The errors channel +:description: Wire a service payload's `errors:` field through @error types so business exceptions flow as typed data alongside the rest of the response. +:!toc: + +xref:../reference/directives/error.adoc[`@error`] turns a Java exception into a typed GraphQL error appended to a service payload's `errors:` list, instead of failing the resolver. The reference page covers signature and constraints. This recipe addresses three operational questions the directive raises: when to use a union of `@error` types vs a single error type for the carrier, what the rewrite does with the handler's `description:` field vs the exception's own message, and what the synthesised `path:` slot actually contains at runtime. + +== Carrier shapes: union vs single type + +The carrier is the `errors:` field on the payload type. Two shapes work: + +[source,graphql] +---- +# backed by com.example.FilmPayload via its @service producer's return type +type FilmPayload { + film: Film + errors: [FilmError] +} + +union FilmError = YearOutOfRange | NotAllowed | DbError +---- + +vs: + +[source,graphql] +---- +# backed by com.example.FilmPayload via its @service producer's return type +type FilmPayload { + film: Film + errors: [SimpleError] +} + +type SimpleError @error(handlers: [...]) { + path: [String!]! + message: String! +} +---- + +The classifier treats both the same way: `ErrorChannel.mappedErrorTypes` is a `List<ErrorType>`, populated with the union members in the union case and a one-element list in the single-type case. The runtime dispatch (`ErrorRouterClassGenerator.buildDispatchMethod`) walks that list once per thrown exception; cardinality of the list does not change the matching algorithm. + +The choice is semantic, not structural: + +* *Union* fits when distinct error classes carry distinct *fields*. `YearOutOfRange` might want a `validRange: String` slot; `DbError` might want a `constraint: String`. Each member is its own object type with its own SDL field set, and graphql-java's type resolver dispatches on the runtime instance. Use a union when clients should branch on `__typename` to read shape-specific fields. +* *Single type* fits when every error has the same shape and only the `message:` (and `path:`) varies. The handler list on the single `@error` type can still cover many distinct exception classes — the union pattern is for distinct *result shapes*, not distinct *handlers*. + +The rewrite doesn't pick a side: a class-backed payload whose canonical constructor declares a parameter typed `List<? super FilmError>` (or `List<SimpleError>`) is recognised either way. The classifier reflects on the canonical constructor and locates the unique parameterised `List`/`Iterable`/`Collection` slot whose element bound is compatible with every channel error type. + +The Sakila example schema currently has no `@error` types; the canonical fixtures live in `graphitron/src/test/java/no/sikt/graphitron/rewrite/ErrorChannelClassificationTest.java` (alongside the synthetic `SakPayload` record at `no.sikt.graphitron.codereferences.dummyreferences.SakPayload`). When you wire your first error channel, that test class's setup is the right shape to copy. + +== Handler dispatch: source order, cause-chain unwrap + +The router's match loop is straightforward: + +[source,java] +---- +for (Mapping mapping : mappings) { + for (Throwable t = thrown; t != null; t = t.getCause()) { + if (mapping.match(t)) { + return DataFetcherResult.<P>newResult().data(payloadFactory.apply(List.of(t))).build(); + } + } +} +return redact(thrown, env); +---- + +(`ErrorRouterClassGenerator.java:347-358`.) + +Two facts to internalise: + +* *Source order wins.* Mappings are walked in the order the channel's types appear in the SDL (and within a type, in `handlers:` declaration order). The first mapping that returns `true` from `match(t)` is the answer. Order matters when one handler is more specific than another — declare the narrow one first. +* *The cause chain is unwrapped per mapping.* For each mapping, the loop walks the thrown exception, then `getCause()`, then the cause's cause, and so on. The result is "first (mapping, throwable-in-chain) pair that matches", not "first throwable matched against any mapping". A `RuntimeException` wrapping a `DataAccessException` will match a `DATABASE` handler attached to the inner exception even if the outer exception class isn't itself in any handler. This is the intended shape: business exceptions surfaced through framework wrappers route to the typed channel. + +The classifier rejects duplicate handler tuples across the channel (`Rule 8`). Two handlers with identical `(handler, className, code, sqlState, matches)` are unreachable for the second declaration; the build fails rather than silently picking one. Cross-variant overlap is allowed: a `GENERIC` handler for `IllegalArgumentException` and a `DATABASE` handler for `sqlState: "23514"` can coexist on the same channel because their match predicates inspect orthogonal fields. + +`VALIDATION` is special-cased. There is at most one `VALIDATION` handler per channel (`Rule 7`); a Bean Validation failure runs as a *pre-execution wrapper*, never enters the dispatch loop, and the resulting `GraphQLError` is routed straight into the errors slot. + +== `description:` is captured but currently unused + +The reference page lists `description: String` on each handler entry. Today, the value is captured at emit time on the per-handler `Mapping` instance and exposed through a `description()` accessor, but it is not consulted at dispatch: + +[quote, ErrorRouterClassGenerator.java:342-344] +The `description` field on each `Mapping` is currently unused at the dispatch site; the description-overriding facade is a follow-on emitter concern. + +The dispatch loop above propagates the matched `Throwable` directly: `payloadFactory.apply(List.of(t))`. The `message:` field on the error type (described next) reads from the live exception, not from the handler's `description:`. The practical consequence: setting `description:` on a handler today is a no-op for what reaches the client; the exception's own `getMessage()` is what shows up. + +This is captured rather than removed because the description-overriding facade is a planned follow-up: at landing, it will wrap the matched exception in an adapter that returns `description` from `getMessage()` (preserving the rest of the throwable's identity for logging and observability). Until then, write the user-facing message into the exception itself when you want a stable string surfaced to clients, and treat `description:` as documentation for the SDL reader rather than runtime behaviour. + +== `path:`, `message:` field fetchers + +Every `@error` type's `path: [String!]!` and `message: String!` slots get synthesised data fetchers. The slots are matched by *name*; an `@error` type without one of them is rejected at classify time. + +`path:` reads the GraphQL execution step path for non-validation sources (`GraphitronSchemaClassGenerator.buildErrorTypeFieldFetchers:425-456`): + +[source,java] +---- +return env.getExecutionStepInfo().getPath().toList().stream().map(String::valueOf).toList(); +---- + +For `VALIDATION` sources (which are `GraphQLError` instances pre-built by the Bean-Validation wrapper), `path:` reads from the error itself — `ge.getPath().stream().map(String::valueOf).toList()` — so the per-element constraint paths recorded by `ConstraintViolations.toGraphQLError` survive intact. + +The path is the GraphQL *response* path, not the mutation argument path. For: + +[source,graphql] +---- +mutation { createFilm(input: {...}) { film { title } errors { path message } } } +---- + +an exception thrown by `createFilm` and matched into `errors[0]` produces `path: ["createFilm"]` (or `["createFilm", "<some-subfield>"]` if the throw happened during nested resolution). To convey *which input field* triggered the error, encode that into the exception itself (the constraint or the validation-handler payload) and surface it through `message:` or a custom field on the error type. + +`message:` always reads `getMessage()` from the source — `Throwable.getMessage()` for the dispatched exception, `GraphQLError.getMessage()` for VALIDATION sources. The handler's `description:` is *not* consulted here today (see the previous section). If you want a localised or sanitised message at the boundary, override `getMessage()` in the exception class (or wrap the throw in a `MessageScrubbingException` of your own). + +== Unmatched exceptions: redact and correlate + +When no handler matches, the router runs the redact path (`ErrorRouterClassGenerator.redactBody:361`): + +[source,java] +---- +UUID correlationId = UUID.randomUUID(); +LOGGER.error("Unmatched exception in fetcher; correlation id = {}", correlationId, thrown); +return DataFetcherResult.<P>newResult() + .data(null) + .error(GraphqlErrorBuilder.newError(env) + .message("An error occurred. Reference: " + correlationId + ".") + .build()) + .build(); +---- + +Two consequences: + +* *Untyped exceptions don't leak details to clients.* The user-facing message is "An error occurred. Reference: <UUID>."; the original message stays in the server log. This is the fallback behaviour, intentional: only exceptions you've explicitly opted into via `@error` flow as data. +* *The correlation ID joins the log line and the client response.* Operations can grep the logs for the UUID a customer reports back, see the original stack, and decide whether to add a handler. This is the shape any new error category goes through before earning a typed channel slot. + +Add a typed channel slot when an untyped fallthrough turns out to be a regular, expected condition (not a bug). Leave it as a fallthrough when it really is a bug: the redacted shape is exactly what you want for a 500-class condition. + +== Pitfalls + +* *Source order is significant.* Declare narrow handlers (with `matches:` substrings, more specific `className:` subclasses) before broad ones. The first match wins, not the most specific. +* *`description:` is documentation today.* Don't rely on it changing the wire-side message; carry the customer-visible string in the exception itself. The override facade is a planned follow-up; this recipe will be amended when it lands. +* *`path:` is the response path.* If you need to point at an input argument, encode it in the exception or in a custom field on the error type. The synthesised fetcher reads `env.getExecutionStepInfo().getPath()` and can't distinguish argument positions. +* *`VALIDATION` runs pre-execution.* The Bean-Validation handler intercepts before the service method runs; its results bypass the dispatch loop and route straight into the errors slot. There's at most one `VALIDATION` handler per channel. +* *Cause-chain unwrap is per mapping, not per source-order step.* If a wrapping exception declares a handler at the channel and the wrapped exception declares a different one, the *wrapping* exception wins for any mapping it matches first — even if the wrapped exception would match a later mapping more specifically. Keep handler tuples disjoint across the wrap boundary. +* *Unmatched flows redact.* If a developer expects a specific exception class to surface to the client and it doesn't, the most likely cause is "no `@error` type covers it"; check the redaction log for a correlation ID, then add the handler. +* *No payload, no channel.* `@error` only takes effect when the type appears as (or in a union behind) an `errors:` field on a payload reachable from a `@service` field. A standalone `@error` type with no carrier is rejected at classify time. + +== See also + +* xref:../reference/directives/error.adoc[`@error`] is the directive surface and the handler-tuple specification. +* xref:../reference/directives/service.adoc[`@service`] is the upstream of the errors channel: only service-returned payloads carry one. +* xref:result-types.adoc[How-to: Result-type variants] covers the payload's backing-class shape (reflected from its `@service` producer's return type), which the channel classifier reflects on to find the errors slot. + +xref:index.adoc[← How-to index] diff --git a/docs/manual/how-to/external-code.adoc b/docs/manual/how-to/external-code.adoc new file mode 100644 index 0000000000..72fd8f9067 --- /dev/null +++ b/docs/manual/how-to/external-code.adoc @@ -0,0 +1,129 @@ += How-to: Wire external Java code +:description: Plug a custom Java method into a directive that takes `ExternalCodeReference!`. +:!toc: + +Four of the rewrite's directives (`@service`, `@externalField`, `@condition`, `@enum`) hand the resolution of a slot off to a developer-supplied Java target via the shared `ExternalCodeReference` input. The mechanics are uniform across all four: a fully-qualified class name on the rewrite plugin's classpath, an optional method name that defaults to the GraphQL field name, and an optional `argMapping:` for renaming Java parameters. This recipe walks through each piece once. + +(The deprecated `@record` directive still parses the same `ExternalCodeReference` shape, but it is ignored: a class-backed type's binding is reflected from its producer's return or parameter type, not from a directive. See xref:result-types.adoc[How-to: Result-type variants].) + +== Make the class reachable + +The rewrite's Maven plugin reflects on the named class at code-generation time (via `Class.forName(...)`). The class therefore has to be on the *plugin's* classpath, not the consumer module's compile classpath. Declare the carrying artifact under the plugin's own `<dependencies>` block: + +[source,xml] +---- +<plugin> + <groupId>no.sikt</groupId> + <artifactId>graphitron-maven-plugin</artifactId> + <version>${graphitron.version}</version> + <executions> + <execution> + <goals><goal>generate</goal></goals> + </execution> + </executions> + <dependencies> + <!-- Carries the @service / @externalField / @tableMethod / @condition / + @sourceRow / @enum target classes, plus the Java classes that back + class-backed types (reflected from their producers). --> + <dependency> + <groupId>com.example</groupId> + <artifactId>my-services</artifactId> + <version>${project.version}</version> + </dependency> + </dependencies> +</plugin> +---- + +The dependency is plugin-scoped: the consumer module never imports the artifact at compile time (the generator emits sources that wire in via `DSLContext`-mediated reflection bindings, not via direct `import` statements). Putting the artifact in the *outer* `<dependencies>` block instead would compile the consumer module against it for no benefit and pollute the runtime jar. + +`graphitron-sakila-example` follows this pattern: the example POM declares `graphitron-sakila-service` (which carries `SampleQueryService`, `FilmService`, `InventoryExtensions`, etc.) under the `<plugin>...<dependencies>` block of the `graphitron-maven-plugin` plugin in `graphitron-sakila-example/pom.xml`, not under the module's outer dependency list. + +== Reference the class from the schema + +`className:` must be a fully-qualified class name. `method:` defaults to the GraphQL field name when omitted, so the common case is identity: + +[source,graphql] +---- +type Query { + filmCount: Int! + @service(service: { + className: "com.example.services.SampleQueryService" + # method defaults to "filmCount" (the field name). + }) +} +---- + +Set `method:` only when the Java method's name diverges from the field name: + +[source,graphql] +---- +type Query { + popularFilms(minRentalRate: Float!): [Film!]! + @tableMethod( + className: "com.example.services.SampleQueryService", + method: "popularFilmsAboveRate" + ) +} +---- + +Reflection failures (class not on the plugin classpath, method not present, signature does not match the directive's expected shape) surface at build time with a directive-specific message: `service method could not be resolved — <reason>` for `@service`, `table method could not be resolved — <reason>` for `@tableMethod`, and so on. The `<reason>` is the underlying reflection exception when the class or method is missing, or a constraint message when the signature is wrong. + +== Map GraphQL arguments to Java parameter names + +When the GraphQL argument name and the Java parameter name diverge, use `argMapping:` to rebind. The syntax is `"javaParam: graphqlArg"`, comma-separated for multiple entries: + +[source,graphql] +---- +type Query { + filmsByServiceRenamed(ids: [Int!]!): [Film!]! + @service(service: { + className: "com.example.services.SampleQueryService", + method: "filmsByServiceRenamed", + argMapping: "filmIds: ids" + }) +} +---- + +[source,java] +---- +public final class SampleQueryService { + public Result<FilmRecord> filmsByServiceRenamed(DSLContext ctx, List<Integer> filmIds) { ... } +} +---- + +The Java parameter `filmIds` receives the GraphQL argument `ids`. Unmentioned Java parameters bind to a GraphQL argument of the same name; an empty `argMapping:` is identity for every parameter. Whitespace around `:` and `,` is tolerated, and multi-line text-block input is accepted for long mappings. + +`argMapping:` is meaningful on `@service`, `@tableMethod`, and `@condition` (the directives whose Java targets receive GraphQL arguments). It is structurally inert on `@externalField` and `@enum`, where the Java target consumes no GraphQL-argument-bound parameters; applying it on those two is rejected at parse time. + +== Per-directive slot names + +Each directive's `ExternalCodeReference!` parameter has its own name, but the contents are identical: + +[cols="1,2,2",options="header"] +|=== +| Directive | Slot name | Reference page +| `@service` | `service:` (`ExternalCodeReference`) | xref:../reference/directives/service.adoc[`@service`] +| `@externalField` | `reference:` (`ExternalCodeReference`) | xref:../reference/directives/externalField.adoc[`@externalField`] +| `@condition` | `condition:` (`ExternalCodeReference`) | xref:../reference/directives/condition.adoc[`@condition`] +| `@enum` | `enumReference:` (`ExternalCodeReference`) | xref:../reference/directives/enum.adoc[`@enum`] +|=== + +The slot names are historical (each directive was named before the shape was unified); each wraps the class/method pair in an `ExternalCodeReference` input object. + +The deprecated `@record` directive parses the same `record:` (`ExternalCodeReference`) shape, but the binding it once carried is ignored; a class-backed type's Java class is reflected from its producer instead. A reachable type still carrying `@record` triggers a build warning telling you to remove it. + +== Constraints + +* `className:` must be a fully-qualified class name. Package-prefix short-name resolution is not implemented; spell out the FQCN for now. +* The carrying artifact must be on the *plugin's* classpath (the `<plugin>...<dependencies>` block), not the module's outer `<dependencies>`. The generator runs at build time and only sees what the plugin can load. +* Reflection runs at code-generation time, not at server startup. A typo in `className:` or `method:` fails the `mvn install` that builds the consumer module, not at request time. +* `argMapping:` is `"javaParam: graphqlArg"`, not `"graphqlArg: javaParam"`. The Java side comes first because that is what the reflected method signature reads. +* `ExternalCodeReference.name:` (a deprecated short alias resolved via the Mojo's `<namedReferences>` config) is still parsed for legacy schemas in transition, but new schemas should use `className:` directly. The deprecation warning surfaces during the rewrite-generate Maven goal. + +== See also + +* xref:../reference/directives/service.adoc[`@service`] is the most common consumer of this surface: a developer-supplied resolver method for a whole field. +* xref:../reference/directives/externalField.adoc[`@externalField`] uses a static method that returns a jOOQ `Field<T>` plugged into the parent's `SELECT` projection. +* xref:../reference/directives/condition.adoc[`@condition`] uses a static method that returns a jOOQ `Condition` to splice into a query's `WHERE` clause. + +xref:index.adoc[← How-to index] diff --git a/docs/manual/how-to/federation-keys.adoc b/docs/manual/how-to/federation-keys.adoc new file mode 100644 index 0000000000..3edd819cc5 --- /dev/null +++ b/docs/manual/how-to/federation-keys.adoc @@ -0,0 +1,144 @@ += How-to: Federation key fields +:description: Declare entity keys with `@key`, layer `@key` onto `@node` types, dispatch across multiple alternatives, and reference non-resolvable entities owned by another subgraph. +:!toc: + +This recipe covers the federation key surface: how `@key` declares an entity, how graphitron wires entity resolution from `@key` and `@node`, what compound and multi-alternative keys do, and the `resolvable: false` flag for keys owned by another subgraph. It walks the path from "what `@key` does at all" through to declaring a reference-only entity that lives on another subgraph. + +The framework-level federation surface (the `@link` opt-in, the runtime entity dispatcher, custom fetchers, the `<schemaInput tag>` flag) lives in xref:apollo-federation.adoc[How-to: Apollo Federation transport]; this recipe assumes that wiring is in place. + +== What `@key` does + +A federation `@key` on a type declares "this type is an entity, and a representation carrying these fields uniquely identifies one row". The federation gateway routes `_entities` lookups to your subgraph; graphitron wires the resolution per-type so each `@key` becomes a SELECT against the type's `@table`. + +[source,graphql] +---- +extend schema + @link(url: "https://specs.apollo.dev/federation/v2.10", import: ["@key"]) + +type Customer @table(name: "customer") @key(fields: "customerId") { + customerId: Int! @field(name: "CUSTOMER_ID") + firstName: String! @field(name: "FIRST_NAME") + lastName: String! @field(name: "LAST_NAME") +} +---- + +The classifier reads `@key(fields: "customerId")`, walks `customerId`'s field-level `@field` to find the column (`customer.customer_id`), and registers an entity-resolution alternative on the type. At runtime, an `_entities` representation `{ "__typename": "Customer", "customerId": 42 }` becomes the SELECT: + +[source,sql] +---- +SELECT customer.first_name, customer.last_name, customer.customer_id + FROM customer + WHERE customer.customer_id = 42 +---- + +The dispatcher batches across all `_entities` representations for the same alternative on the same type into a single VALUES-derived-table query, so a request asking for fifty customers fires one statement, not fifty. + +`@key` on a type without `@table` is rejected at classify time. The reference dispatcher SELECTs from a table; without one, there's no source. The diagnostic spells out the missing `@table`. + +== Compound keys + +`fields:` accepts a space-separated list. Every column on the list contributes to the key: + +[source,graphql] +---- +type FilmActor @table(name: "film_actor") @key(fields: "filmId actorId") { + filmId: Int! @field(name: "film_id") + actorId: Int! @field(name: "actor_id") +} +---- + +The dispatcher emits a multi-column VALUES join: each representation must carry both `filmId` and `actorId`, and the SELECT WHERE clause is `(film_id, actor_id) IN ((?, ?), (?, ?), ...)`. The arity of the VALUES-derived table matches the key's column count. + +The fields named in `fields:` must each resolve to a column on the type's table. A field that is itself an `@externalField` or computed scalar can't participate in a key; the diagnostic surfaces the field name and the reason. + +== Multiple `@key` alternatives + +A type can declare multiple `@key` directives. Each is an alternative: + +[source,graphql] +---- +type Film @table(name: "film") + @key(fields: "filmId") + @key(fields: "filmId title") { + filmId: Int! @field(name: "FILM_ID") + title: String! @field(name: "TITLE") +} +---- + +The runtime dispatcher walks the alternatives in *most-specific-first* order: when a representation supplies both `filmId` and `title`, the compound key wins; when only `filmId` is supplied, the single-key alternative matches. Ties (two alternatives of the same size whose required fields are both subsets of the representation's keys) are broken by SDL declaration order. + +This matters for cross-subgraph contracts: a federation gateway may route a representation to your subgraph that supplies more fields than the narrowest alternative needs. The most-specific-wins rule means the dispatcher uses the richest information available, even if a less-specific alternative would also match. The query plan is the same SELECT shape; only the WHERE clause changes. + +== `@key` on `@node` types + +Graphitron's xref:../reference/directives/node.adoc[`@node`] directive synthesises a `@key(fields: "id", resolvable: true)` per type. The opaque `id:` is decoded through the same `NodeIdEncoder` the Relay-side `Query.node` uses, and the resulting column values feed the same dispatcher as a `@key(fields: "...")` would. Point being: `@node` is enough on its own; you don't need to add `@key(fields: "id")` for the synthesised path. + +A `@node` type with an additional explicit `@key` gets *both* alternatives: + +[source,graphql] +---- +type Film implements Node @table(name: "film") @node + @key(fields: "filmId") + @key(fields: "filmId title") { + id: ID! @nodeId + filmId: Int! @field(name: "FILM_ID") + title: String! @field(name: "TITLE") +} +---- + +The synthesised NODE_ID alternative (decode `id:` through `NodeIdEncoder`) is recorded, plus the two consumer-declared DIRECT alternatives (`filmId`, then `filmId title`). At dispatch time, a representation with `id:` lands the NODE_ID arm; a representation with `filmId` and `title` lands the compound alternative; a representation with just `filmId` lands the single-column alternative. A representation that supplies all three fields lands the compound alternative (most-specific tie-break). + +This layered shape is the right pattern when: + +* The Relay path (`Query.node(id:)`) and the federation path (`_entities`) both need to work, and the Relay path must use opaque IDs (no leaking column values to clients). +* External subgraphs may reference the entity by either form (gateway-supplied opaque IDs from a previous Relay traversal, or column values from a fresh subgraph join). + +The synthesised alternative is always added; explicit `@key(fields: "id")` on a `@node` type is folded into the same NODE_ID alternative, with the `resolvable:` value coming from the user's directive (so `@key(fields: "id", resolvable: false)` on a `@node` carries `resolvable: false` through to the synthesised alternative). + +== `resolvable: false`: keys for reference + +A federation entity can declare a key that this subgraph *does not* resolve. The federation spec calls this a non-resolvable key, and graphitron honours it: the dispatcher records the alternative but skips it at match time, so a representation matching this alternative yields `null` without firing a SELECT. + +[source,graphql] +---- +type Language @table(name: "language") @key(fields: "languageId", resolvable: false) { + languageId: Int! @field(name: "LANGUAGE_ID") + name: String! @field(name: "NAME") +} +---- + +The schema lists `Language` as a reference-only entity: the gateway sees the key, knows the type exists, but routes resolution to whichever subgraph declared a resolvable key for the same type. This is the federation-level "I know about this thing, but it's not mine to fetch". + +Two distinct uses: + +* *This subgraph has the table but the entity is owned elsewhere.* The local table is incidental (cached lookup data, denormalised columns); the canonical resolution lives on another subgraph. +* *This subgraph references the entity by FK but does not store it.* The non-resolvable key lets a relationship typecheck without forcing the local subgraph to expose a SELECT. + +`resolvable: false` is also legal on `@node` types via the synthesised path: `@node @key(fields: "id", resolvable: false)` declares the type as a reference-only entity even though `@node` would normally make it resolvable. + +== Wiring federation: `@link`, `<schemaInput tag>`, custom fetchers + +Three wiring concerns surface once `@key` is in play. xref:apollo-federation.adoc[How-to: Apollo Federation transport] covers them in full; the operational summary: + +* *Opt in via `@link`.* Add an `extend schema @link(url: "...", import: [...])` to one of your `.graphqls` files. The plugin detects the link and wraps the assembled schema with the federation builder. Without `@link`, the schema is non-federation; `@key` fails graphql-java parsing because the directive is not declared. +* *Manual directive declarations.* Alternative to `@link`: declare each directive you use (`directive @key(fields: String!, resolvable: Boolean = true) repeatable on OBJECT | INTERFACE`). The build still wraps with federation when the catalog finds any federation directive applied. Mixing the two on the same directive (importing via `@link` and redeclaring it locally) fails validation. +* *`<schemaInput tag>` is federation-specific.* Setting `<schemaInput><tag>...</tag></schemaInput>` in the plugin config emits `@tag(name: "...")` directives on schema elements. These are only meaningful to a federation gateway; the plugin treats this as an implicit Federation 2 opt-in, and synthesises a minimal `@link` import for `@tag` if you haven't already declared one. +* *Custom entity fetcher.* The default dispatcher handles `@node` and `@key` types graphitron classifies; for hand-rolled entity types or entities pulled from a non-graphitron source, supply your own fetcher via the two-arg `Graphitron.buildSchema(b, fed -> fed.fetchEntities(myFetcher))`. Custom fetchers must return entities the default `resolveEntityType` can recognise (jOOQ `Record`s with a `__typename` column). + +== Pitfalls + +* *`@key` requires `@table`.* The dispatcher SELECTs from a table; a `@key` on a non-table-bound type is rejected at classify time. The exception is `@node` types (which always carry an entity entry for the `Query.node` path, regardless of `@key`). +* *`@key` is rejected on interface types in graphitron.* The federation spec allows it, but graphitron's dispatcher does not yet support `@key` on interfaces; declare `@key` on the implementing types instead. The diagnostic mentions this explicitly. +* *Most-specific-wins applies across keys, not within.* Within a single `@key`, all required fields are mandatory; the alternative matches only when *every* required field is supplied. Across alternatives, the dispatcher picks the largest matching one. +* *`resolvable: false` is honoured but advisory.* The dispatcher skips the alternative; if no other alternative matches, the result is `null`. A non-resolvable key with no resolvable counterpart on any subgraph is a federation-graph composition error, not a graphitron build error; it surfaces at the gateway, not at build time. +* *Compound keys must list column-backed fields only.* A field that is `@externalField` or otherwise non-column can't participate in a `@key`; the diagnostic names the offending field. The fix: use a column-backed field, or restructure the key to avoid the non-column field. + +== See also + +* xref:../reference/directives/node.adoc[`@node`] is the Relay/`Query.node` directive whose synthesised key feeds the federation `_entities` path. +* xref:../reference/directives/nodeId.adoc[`@nodeId`] declares the encoded `id:` field that NODE_ID-shape alternatives use. +* xref:../reference/directives/field.adoc[`@field`] is the per-field column-mapping axis for entity key fields. +* xref:apollo-federation.adoc[How-to: Apollo Federation transport] covers the framework-level wiring (`@link`, `<schemaInput tag>`, custom fetchers) this recipe assumes is in place. +* xref:global-id.adoc[How-to: Global object IDs] covers the Relay-side `Query.node` dispatch and `keyColumns` migrations that share infrastructure with `@key`. + +xref:index.adoc[← How-to index] diff --git a/docs/manual/how-to/global-id.adoc b/docs/manual/how-to/global-id.adoc new file mode 100644 index 0000000000..1b0ba33a23 --- /dev/null +++ b/docs/manual/how-to/global-id.adoc @@ -0,0 +1,177 @@ += How-to: Global object IDs +:description: Set up Relay Global Object Identification, decide stable-ID strategy, decode IDs back into typed keys, and reason about migration when columns or types change. +:!toc: + +Relay Global Object Identification gives every node a single opaque ID that identifies a row across the graph. Graphitron synthesises that ID from `(typeId, primary-key columns)` whenever a type carries xref:../reference/directives/node.adoc[`@node`] and an `id: ID!` field decorated with xref:../reference/directives/nodeId.adoc[`@nodeId`]. `Query.node(id:)` and `Query.nodes(ids:)` dispatch on the embedded `typeId` to fetch the underlying row. This recipe covers the choices that affect long-term ID stability, the contract for decoding IDs back into typed keys at argument and input sites, and the dispatch shape of the two root entry points. + +== Wire format and the opacity contract + +The opaque ID is base64-url-encoded `"typeId:v1,v2,..."` (no padding, UTF-8). Commas inside values are escaped as `%2C`. Generated `NodeIdEncoder.encode<TypeName>(...)` and `NodeIdEncoder.decode<TypeName>(base64Id)` helpers handle the round-trip. + +Two things follow from the wire format: + +* The `typeId`, the `keyColumns`, and the *order* of those columns are part of the public ID contract. Changing any of them invalidates IDs that clients have already cached or persisted. +* Decoding errors stay opaque to clients on the dispatcher path. `Query.node(id:)` and `Query.nodes(ids:)` return `null` for malformed, unknown-typeId, or no-such-row IDs (Relay spec). On the *argument* path, decode errors surface as `GraphqlErrorException` because the request is asserting "these are valid IDs of *this* type"; see "Decode-side errors" below. + +== Stable-ID strategies + +xref:../reference/directives/node.adoc[`@node(typeId:)`] defaults to the GraphQL type name. Two reasons to set it explicitly. + +*Decouple from rename.* If `Customer` might one day be renamed to `Person`, set `typeId: "C"` (or `"customer"`, or any opaque token) at introduction time so the rename is a schema-only change: + +[source,graphql] +---- +type Person implements Node @table(name: "customer") @node(typeId: "C") { + id: ID! @nodeId +} +---- + +Already-issued IDs continue to decode after the rename because the wire format never carried the GraphQL name. + +*Shorter or namespaced IDs.* The `typeId` is part of every ID's wire bytes. Trimming `Customer` (8 bytes) to `C` (1 byte) compounds across batched lookups. Conversely, prefixing `typeId` per service (`shop:Customer`) is one way to keep IDs unique across federated subgraphs without coordinating on type names. + +The build rejects two `@node` types that share a `typeId` (whether explicit or defaulted): `Query.node(id:)` cannot dispatch unambiguously, and the rewrite refuses to compile rather than silently route to the wrong table. + +== `keyColumns` migrations + +The default xref:../reference/directives/node.adoc[`@node(keyColumns:)`] is the bound table's primary-key columns in declaration order. Override only when the PK is unstable (rare on production schemas) or when an alternate unique key is the better identity: + +[source,graphql] +---- +type FilmByCode implements Node @table(name: "film") @node(keyColumns: ["FILM_CODE"]) { + id: ID! @nodeId + filmCode: String! @field(name: "FILM_CODE") +} +---- + +`FILM_CODE` must be a unique key on `film` for the build to accept the directive; the build fails to resolve otherwise. + +When you genuinely need to migrate `keyColumns` (the underlying PK is being changed, or you're moving from PK-based IDs to a domain-key for stability), the safe sequence is: + +. Add the new candidate-key columns and a unique constraint, deploy, backfill. +. *In a single release* swap `keyColumns:` to the new column list. Every client cache or persisted ID issued before this release stops decoding; plan accordingly. +. Optionally retain the old type under a different `typeId` (and a deprecation marker) for one release cycle so old IDs continue to dispatch while clients refresh. + +The rewrite gives no automatic rolling-window for the wire format: a `keyColumns` change is a hard cut. If continuity matters, the right tool is a *second* `@node` type pinned to the old shape, not a graceful in-place migration. + +== Composite-PK nodes + +Composite primary keys work the same way; the synthesised ID embeds every column in declaration order: + +[source,graphql] +---- +type FilmActor implements Node @table(name: "film_actor") @node { + id: ID! @nodeId + # ... +} +---- + +`film_actor`'s PK is `(actor_id, film_id)`; the wire format is `base64-url("FilmActor:<actor_id>,<film_id>")`. xref:../reference/directives/lookupKey.adoc[`@lookupKey`] on `[ID!]!` keyed by `FilmActor` produces a `VALUES(idx, actor_id, film_id)` join over both PK columns; no per-element scatter is needed. + +Reordering the PK columns at the catalog level changes the ID's wire format. If your jOOQ catalog regenerates the columns in a different order (e.g. after a DDL rewrite), set `keyColumns:` explicitly to lock the order: + +[source,graphql] +---- +type FilmActor implements Node @table(name: "film_actor") + @node(keyColumns: ["actor_id", "film_id"]) { + id: ID! @nodeId +} +---- + +== Cross-type IDs from FK paths + +xref:../reference/directives/nodeId.adoc[`@nodeId`] without `typeName:` infers from the containing type when the field is on a `@node` type's own `id` slot. When the slot encodes a *different* row's identity, set `typeName:` explicitly and pair it with xref:../reference/directives/reference.adoc[`@reference`]: + +[source,graphql] +---- +type Customer implements Node @table(name: "customer") @node { + id: ID! @nodeId + addressNodeId: ID @nodeId(typeName: "Address") + @reference(path: [{key: "customer_address_id_fkey"}]) +} +---- + +`addressNodeId` produces an `Address` global ID from the FK column on `customer`. Two things happen at projection time. First, the FK-mirror collapse: because `customer.address_id == address.address_id`, the rewrite reads the PK columns directly from the `customer` row without joining to `address`. Second, the encoder uses `Address`'s typeId and `keyColumns`, not `Customer`'s. The result is a valid `Address` ID that `Query.node` will dispatch to the `address` table. + +The same pattern works for any FK that lands on a `@node` table. If two `@node` types bind to the same target table (rare but legal), set `typeName:` explicitly to disambiguate; inference rule (b) only fires when *exactly one* `@node` type matches. + +== Decode-side: arguments and inputs + +xref:../reference/directives/nodeId.adoc[`@nodeId`] on an argument or input field reverses the direction: it decodes an opaque ID back into typed key columns. Two shapes are common. + +*Same-table NodeId argument.* The argument decodes to the surrounding query's PK columns and feeds an `IN (...)` lookup. xref:../reference/directives/lookupKey.adoc[`@lookupKey`] is implicit on this shape: + +[source,graphql] +---- +type Query { + filmsByNodeIdArg(ids: [ID!]! @nodeId(typeName: "Film")): [Film!]! +} +---- + +The rewrite emits a `VALUES(idx, film_id) JOIN film ON film.film_id = values.film_id` shape, with each `id` decoded via `NodeIdEncoder.decodeFilm(...)` at request time. Adding an explicit `@lookupKey` is permitted but redundant. + +*Composite-PK NodeId argument.* When the keyed type has a composite PK, the same shape widens to a multi-column `VALUES`: + +[source,graphql] +---- +type Query { + filmActorByNodeId(id: [ID!]! @lookupKey): [FilmActor!]! +} +---- + +Here `@lookupKey` is explicit because the keyed type is inferred from the return type, not from `@nodeId(typeName:)`. The decoder yields `(actor_id, film_id)` per ID; the join is `VALUES(idx, actor_id, film_id) JOIN film_actor ON ... AND ...`. + +*Input-record field.* The same decode contract applies inside an `input` type used in a mutation or filter: + +[source,graphql] +---- +input FilmSameTableNodeIdInput { + filmIds: [ID!] @nodeId(typeName: "Film") +} +---- + +The rewrite materialises `filmIds` as `List<Integer>` (or the typed PK shape) on the input record, with decode happening at the boundary. + +== Decode-side errors + +Argument and input decoders use the `ThrowOnMismatch` contract: a malformed base64 ID, or an ID whose embedded `typeId` does not match the declared `typeName:`, fails the request as a `GraphqlErrorException` *before any SQL runs*. Clients see a structured GraphQL error pointing at the offending argument; the server never tries to use a half-decoded value as a query parameter. + +This is intentionally different from the dispatcher path. `Query.node(id:)` and `Query.nodes(ids:)` use the `NullOnMismatch` contract: a malformed or wrong-typeId ID returns `null` (per Relay's "if no such object exists, the field returns null"). The asymmetry is the opacity contract: clients should not be able to probe for valid IDs by mining server errors. Argument-typed `@nodeId` *asserts* the IDs are of the expected type; `Query.node(id:)` *queries* whether an ID resolves at all. + +== `Query.node` and `Query.nodes` dispatch + +The two Relay entry points are emitted automatically when at least one `@node` type is classified for the schema: + +[source,graphql] +---- +type Query { + node(id: ID!): Node + nodes(ids: [ID!]!): [Node] +} +---- + +`Query.node(id:)` peeks the typeId via `NodeIdEncoder.peekTypeId(id)`, dispatches through the entity-fetcher table for that type, and `SELECT`s the requested fields plus a synthetic `__typename` column. The `Node` `TypeResolver` reads `__typename` to route the row at scatter time. Null IDs, base64 errors, and unknown typeIds all return `null`. + +`Query.nodes(ids:)` is the batched form. The dispatcher groups IDs by typeId, fans out one batched `SELECT` per type (DataLoader-backed so siblings sharing a typeId collapse into one round trip), and scatters rows back to each request's original positions. Mixing `Customer`, `Address`, and `Film` IDs in one call still produces just three queries. + +Both entry points only project the fields the client actually selects. The framework knows the type's table from `@node`, so the projection respects xref:../reference/directives/field.adoc[`@field(name:)`] aliases, xref:../reference/directives/reference.adoc[`@reference`] joins, and the rest of the directive surface uniformly. + +== Constraints and pitfalls + +* `@node` requires the type to also carry xref:../reference/directives/table.adoc[`@table`] and to implement the `Node` interface. The build rejects bare `@node` and `@node` on non-`Node`-implementing types. +* `id: ID!` plus xref:../reference/directives/nodeId.adoc[`@nodeId`] is required on every `@node` type. The directive on the type alone does not produce the ID; the field-level marker tells the generator which slot is the ID. +* `keyColumns:` must form a primary key or another unique key. Reordering the columns changes the ID's wire format; treat the order as part of the public contract. +* `typeId:` collisions across types are rejected at build time. If you need two GraphQL types to share a backing table, give each a distinct `typeId`. +* `@nodeId` is a binding directive, not a projection. The slot's GraphQL type must be `ID!`, `ID`, `[ID!]`, or `[ID!]!`. +* On argument decode, an ID's embedded `typeId` must match the declared `typeName:`; mismatches fail the request. On `Query.node`/`Query.nodes`, the same mismatch returns `null`. +* On a same-table `@nodeId` argument, xref:../reference/directives/lookupKey.adoc[`@lookupKey`] is implicit; the rewrite emits the `VALUES`-join shape automatically. Explicit `@lookupKey` is permitted but redundant. + +== See also + +* xref:../reference/directives/node.adoc[`@node`] configures the owning type (`typeId`, `keyColumns`). +* xref:../reference/directives/nodeId.adoc[`@nodeId`] marks each encode/decode slot. +* xref:../reference/directives/reference.adoc[`@reference`] supplies the FK path for cross-type IDs. +* xref:../reference/directives/lookupKey.adoc[`@lookupKey`] is the dispatch path for `[ID!]`-keyed argument lookups; same-table NodeId arguments imply it. +* xref:batch-lookups.adoc[How-to: Batch lookups] covers the broader `@lookupKey` patterns including non-NodeId keys. + +xref:index.adoc[← How-to index] diff --git a/docs/manual/how-to/handle-services.adoc b/docs/manual/how-to/handle-services.adoc new file mode 100644 index 0000000000..133c97c9a3 --- /dev/null +++ b/docs/manual/how-to/handle-services.adoc @@ -0,0 +1,239 @@ += How-to: Handle services +:description: Bind GraphQL arguments to Java parameters, shape the service response so the framework recognises it, and wire @service onto a child field via @splitQuery. +:!toc: + +xref:../reference/directives/service.adoc[`@service`] hands the database operation for a field off to a custom Java method. The reference page covers signature, the `argMapping:` syntax, and the constraints. This recipe addresses the three operational topics it defers: how arguments (including nested input types and request-context values) flow into Java parameters, what return shapes the framework recognises and how to choose among them, and the contract the rewrite imposes when `@service` lands on a non-root field. + +For the surrounding context (when to reach for `@service` vs xref:../reference/directives/mutation.adoc[`@mutation`]) see the reference's "Constraints" section. This recipe assumes the choice is already made. + +== Argument binding: from GraphQL to Java parameters + +The framework constructs the service class with whatever it can resolve from the request context (a `DSLContext` for the request's database session is the most common parameter), then calls the named method. Each remaining Java parameter is supplied from one of three sources: + +* *A GraphQL argument*, by name. The Java parameter `ids` matches the GraphQL argument `ids: [Int!]!`. +* *An `argMapping:` rebinding.* `argMapping: "filmIds: ids"` means "the Java parameter `filmIds` receives the value of the GraphQL argument `ids`". Multiple entries are comma-separated; whitespace is tolerated. +* *A request-context value*, when the parameter name matches an entry in `contextArguments:`. Each named value is pulled from the request `GraphQLContext` per request and threaded into the call as an additional argument. + +The example schema's three root services exercise the first two sources: + +[source,graphql] +---- +type Query { + filmsByService(ids: [Int!]!): [Film!]! + @service(service: { + className: "no.sikt.graphitron.rewrite.test.services.SampleQueryService", + method: "filmsByService" + }) + + filmsByServiceRenamed(ids: [Int!]!): [Film!]! + @service(service: { + className: "no.sikt.graphitron.rewrite.test.services.SampleQueryService", + method: "filmsByServiceRenamed", + argMapping: "filmIds: ids" + }) +} +---- + +The Java surface: + +[source,java] +---- +public static Result<FilmRecord> filmsByService(DSLContext dsl, List<Integer> ids) { ... } +public static Result<FilmRecord> filmsByServiceRenamed(DSLContext dsl, List<Integer> filmIds) { ... } +---- + +Both bind the `[Int!]!` argument to the method's `List<Integer>` parameter; the rename version reads more naturally on the Java side because `filmIds` is unambiguous in a class that handles many entity types. Use `argMapping:` when the Java method's signature already exists with a name you cannot change (e.g., a shared service class) or when the GraphQL argument's name is opaque (e.g. `id` on an interface) and the Java side wants more specificity. + +=== Nested input types + +When a field takes an input-type argument, the framework passes the input through as a single Java parameter, not flattened into per-field parameters. A field declared as + +[source,graphql] +---- +createFilm(in: FilmCreateInput!): Film + @service(service: {className: "...", method: "createFilm"}) +---- + +binds to + +[source,java] +---- +public static FilmRecord createFilm(DSLContext dsl, FilmCreateInput in) { ... } +---- + +where `FilmCreateInput` is a Java class whose components correspond to the input-type's fields. The backing class is reflected from the `createFilm` method's parameter type; graphql-java does the input deserialisation; the framework just hands the resulting object to the method. The Java side reads `in.title()`, `in.languageId()`, etc. + +When the input type's producer (the service method parameter) is a typed Java class, the backing class is the canonical home for the input shape. When the input flows into no typed parameter, the framework's input projection produces an `ImmutableMap<String, Object>` that the Java method must read by key; the typed-class shape is strongly preferred, so declare the service method's parameter as the typed input class. + +`argMapping:` works for input arguments the same way it works for scalars: `argMapping: "input: in"` rebinds the Java parameter name. Field-level rebinding inside the input type is not part of `@service`'s surface; that's the input type's own concern (see xref:../reference/directives/field.adoc[`@field`] on input fields). + +=== `contextArguments`: pulling from request state + +`contextArguments:` is for values that aren't GraphQL arguments but live on the per-request `GraphQLContext`: tenant IDs, authenticated principals, feature-flag snapshots. Declaring `contextArguments: ["tenantId"]` in the directive means the framework looks up `env.getGraphQlContext().get("tenantId")` and threads the result as an additional Java parameter named `tenantId`: + +[source,graphql] +---- +filmsForTenant(genre: String): [Film!]! + @service( + service: {className: "...", method: "filmsForTenant"}, + contextArguments: ["tenantId"] + ) +---- + +[source,java] +---- +public static Result<FilmRecord> filmsForTenant(DSLContext dsl, String tenantId, String genre) { ... } +---- + +The runtime contract is "your servlet or webfilter must place each named value on the request context before the resolver runs". The framework does not validate context arguments at startup; a missing context value yields `null` at call time, which most code will then throw on. The classifier does check that the parameter exists on the Java method's signature. + +== Response shapes the framework recognises + +A `@service` method is opaque to the generator: no SQL is spliced, no projection is grafted on. The classifier inspects the *return type* and routes the result through one of four runtime paths. + +=== `Result<TableRecord>` (or `List<TableRecord>`): direct hand-off + +[source,java] +---- +public static Result<FilmRecord> filmsByService(DSLContext dsl, List<Integer> ids) { + return dsl.selectFrom(Tables.FILM) + .where(Tables.FILM.FILM_ID.in(ids)) + .orderBy(Tables.FILM.FILM_ID) + .fetch(); +} +---- + +When the return type is bound to a `@table` GraphQL type and the Java return is a `Result<X>` (or `List<X>`) of jOOQ records, the framework treats the records as already-projected rows and hands them straight to graphql-java. Each record carries every column the table emits; the per-field column fetchers walk the record without an additional SELECT. + +This is the right shape when the service has already produced the rows you want returned and no further projection is needed. The trade-off: the service is responsible for selecting *every column* the schema may eventually ask for. A field added to the GraphQL type later will read `null` from records that didn't include that column. + +=== Scalar return: graphql-java coerces + +[source,java] +---- +public static Integer filmCount(DSLContext dsl) { + return dsl.fetchCount(Tables.FILM); +} +---- + +When the return type is a non-table GraphQL scalar (or list of scalars), the Java return must be a value graphql-java can coerce. The framework wraps the result in a `DataFetcherResult` and lets graphql-java apply scalar coercion (e.g. `Integer` → `Int!`, `BigDecimal` → `Float`). No projection or batching is involved. + +=== Class-backed payload: accessor-derived or lifter-driven + +When the return type is a class-backed type (a custom payload whose backing class is reflected from this `@service` method's return type), each row in the service's result has children that the framework still resolves. Two paths drive the child-fetch dispatch: + +* *Auto-derived from accessor.* If the payload's canonical record-component accessor returns the right shape (a `TableRecord` subclass, `List<TableRecord>`, or `Set<TableRecord>` whose element matches the child field's `@table`), the classifier auto-derives a `BatchKey.AccessorKeyedSingle`/`AccessorKeyedMany` for the field. No extra directive is needed. +* *Explicit `@sourceRow`.* When the catalog cannot derive the key (e.g. the payload carries a raw FK column instead of a typed record), declare a lifter that takes the parent and returns a `RowN` of the FK column values. + +The `recentlyCreatedFilms` example exercises the lifter path: + +[source,graphql] +---- +# backed by ...CreateFilmPayload via the recentlyCreatedFilms @service producer's return type +type CreateFilmPayload { + languageId: Int! + language: [Language!]! + @sourceRow( + className: "...CreateFilmPayloadLifter", + method: "liftLanguageId" + ) +} + +type Query { + recentlyCreatedFilms: [CreateFilmPayload!]! + @service(service: {className: "...CreateFilmPayloadService", method: "recentlyCreatedFilms"}) +} +---- + +The service hand-rolls three payloads with `languageId`s `(1, 2, 1)`. The framework's lifter-driven `DataLoader` dispatches one batched language lookup with the deduplicated key set `{1, 2}`, not three. The full decision tree for which path applies (and the four backing-class variants) lives in xref:result-types.adoc[How-to: Result-type variants]. + +=== `Map<Key, Value>`: child `@service` with the mapped-batch shape + +For `@service` on a child field (under `@splitQuery`, see next section), the return shape is a `Map<Key, Value>` indexed by the parent-key shape the classifier expects. The example schema's `FilmService.titleUppercase` exercises the `Record1<Integer>` arm: + +[source,java] +---- +public static Map<Record1<Integer>, String> titleUppercase(Set<Record1<Integer>> filmIds, DSLContext dsl) { + List<Integer> ids = filmIds.stream().map(Record1::value1).toList(); + Map<Integer, String> titlesById = dsl + .select(Film.FILM.FILM_ID, Film.FILM.TITLE) + .from(Film.FILM) + .where(Film.FILM.FILM_ID.in(ids)) + .fetchMap(Film.FILM.FILM_ID, Film.FILM.TITLE); + + Map<Record1<Integer>, String> result = new LinkedHashMap<>(); + for (Record1<Integer> key : filmIds) { + result.put(key, titlesById.getOrDefault(key.value1(), "").toUpperCase()); + } + return result; +} +---- + +The `Set<Record1<Integer>>` parameter is the framework's batch: one entry per distinct parent the request touched. The returned `Map`'s keys must be the same instances (or value-equal substitutes) the framework supplied; the framework reads each parent's value out of the map by lookup. Missing keys yield `null` for the field on that parent. + +The accepted source shapes are `Set<Row<N>>`, `Set<Record<N>>`, and `Set<X extends TableRecord>`. The corresponding `BatchKey` variants (`MappedRowKeyed`, `MappedRecordKeyed`, `MappedTableRecordKeyed`) are emitted by `ServiceCatalog.classifySourcesType:600-639` based on the parameter's reflected type. `Row<N>` works (use `DSL.row(value)` to construct keys back); `Record<N>` lets you call `.value1()`/`.value2()` to extract column values directly; the typed-record arm hands you fully-populated parent records when the parent has a `@table`. + +== `@service` on a child field: the `@splitQuery` contract + +`@service` on a non-root field is allowed *only* under `@splitQuery`. Without it, the field's parent is fetched first as a single SQL pass and there is no batch dispatch shape; the classifier rejects the schema at build time. + +Under `@splitQuery`, the runtime contract is: + +. The framework runs the parent query first. The parent's selection set is collected into a `Set<KeyType>` where `KeyType` is one of `Row<N>` / `Record<N>` / a typed `TableRecord`. The `Set` carries only the parent's primary-key columns by default; it does not carry the rest of the parent's projected columns (the framework hasn't fetched them yet on the typed-record arm, though the typed-record arm is special-cased, see below). +. The framework dispatches the child `@service` once per request with that `Set`. +. The service returns a `Map<KeyType, ChildValue>`. The framework reads each parent's value from the map and resolves the child for that parent. + +The example schema wires three sibling `@service` children on `Film` for the three accepted source shapes: + +[source,graphql] +---- +type Film @table(name: "film") { + titleUppercase: String @service(service: {className: "...FilmService", method: "titleUppercase"}) + titleLowercase: String @service(service: {className: "...FilmService", method: "titleLowercase"}) + titleTitlecase: String @service(service: {className: "...FilmService", method: "titleTitlecase"}) +} +---- + +[source,java] +---- +public static Map<Record1<Integer>, String> titleUppercase(Set<Record1<Integer>> filmIds, DSLContext dsl) { ... } +public static Map<Row1<Integer>, String> titleLowercase(Set<Row1<Integer>> filmIds, DSLContext dsl) { ... } +public static Map<FilmRecord, String> titleTitlecase(Set<FilmRecord> films) { ... } +---- + +The classifier picks the variant by inspecting the `Set<E>`'s element type: + +* `Row<N>` → `MappedRowKeyed`. Keys carry no value accessors; reconstruct keys with `DSL.row(value)` if you need to read or rebuild them. Use this when the SQL side composes against the row (`DSL.row(FILM_ID).in(filmIds)`). +* `Record<N>` → `MappedRecordKeyed`. Keys expose `.value1()`/`.value2()`/etc. Use this when the body needs to extract column values from each key. +* `X extends TableRecord` → `MappedTableRecordKeyed`. The framework supplies fully-populated parent records (every column on the parent table), extracted via `env.getSource().into(Tables.FILM)`. Use this when the body needs columns beyond the parent's PK; `titleTitlecase` reads `film.getTitle()` straight off the record without a SELECT. + +The typed-record arm is the most powerful and the easiest to misuse: the framework supplies the parent's full record, but the parent record's columns came from whatever projection the parent's own fetcher emitted. If the parent is a synthesised connection, every column is present; if the parent is itself a `@service` returning a hand-rolled record, only the columns the service populated are populated. Plan accordingly. + +=== One DataLoader per request, per field + +The dispatch is `DataLoader`-batched: one invocation of the service method per request per field, regardless of how many parents the request touches. The cache key is path-scoped, request-scoped, and tenant-prefixed (see xref:split-vs-inline.adoc[How-to: When to split queries] for the full key shape and the consequences for aliased uses). + +The performance shape: one `Set<Key>`-input call, one `Map<Key, Value>`-output result, regardless of fan-out. A request that touches 200 films sees one `titleUppercase` invocation with a 200-element `Set`, not 200 calls; missing keys in the returned `Map` yield `null` for that parent's field. + +== Pitfalls + +* *Argument binding is by name.* GraphQL argument `ids` binds to Java parameter `ids` by default; rename via `argMapping:` when the Java method's parameter has a different name. Mismatches are caught at build time. +* *Input types pass through whole.* A `FilmCreateInput!` argument becomes one Java parameter, not flattened into per-field parameters. Read the input's components on the Java side. Prefer a typed input-class parameter (the binding the framework reflects) over the untyped `Map<String, Object>` projection. +* *`contextArguments:` requires the request layer to set them.* The framework reads `env.getGraphQlContext().get(name)`; if the servlet/filter doesn't put the value there, the parameter is `null` at call time. The classifier doesn't validate the value is set; only that the Java parameter named to receive it exists. +* *Non-root `@service` requires `@splitQuery`.* The classifier rejects a child `@service` without it. The shape on the child is `Set<Key>` → `Map<Key, Value>`, not `(Parent, Args) → Value`. Single-statement nested resolution is not supported on the service path. +* *Map keys must round-trip.* The returned `Map` is read by `framework-supplied Set` element. If your body constructs new keys (not `Row<N>` instances backed by the same value-equals semantics), the lookup misses and the field returns `null` for every parent. Prefer to rebuild keys from the framework's `Set` rather than constructing fresh ones. +* *`Result<TableRecord>` returns skip framework projection.* The service is responsible for selecting every column the schema may eventually ask for. A schema field added later that reads a column the service didn't include returns `null` from records that lack it. +* *Child fields without typed-record source-shape pay an extra fetch.* `Row<N>`/`Record<N>` shapes do not carry parent column data; the body must SELECT what it needs. The typed-`TableRecord` shape is the only one where the framework supplies fully-populated parent records. +* *Conditions on a `@service` field are ignored.* The reference is explicit: the generator does not splice generated SQL into a custom method's body. If the service needs filtering, take the filter as an argument or read it from the input type. +* *`@service` and xref:../reference/directives/mutation.adoc[`@mutation`] are mutually exclusive.* One field can have one or the other, never both. Use `@mutation` when the framework should generate the INSERT/UPDATE/UPSERT; use `@service` when you need custom logic. + +== See also + +* xref:../reference/directives/service.adoc[`@service`] is the directive surface; this recipe expands its three deferred topics. +* xref:../reference/directives/mutation.adoc[`@mutation`] for the framework-generated alternative on root mutation fields. +* xref:../reference/directives/splitQuery.adoc[`@splitQuery`] is the per-parent batch wrapper non-root services require. +* xref:result-types.adoc[How-to: Result-type variants] covers the class-backed payload backing-class shape that the classifier reflects on to find children. +* xref:split-vs-inline.adoc[How-to: When to split queries] covers the `DataLoader` cache-key shape and the aliased-uses-don't-share-batches consequence. +* xref:error-channel.adoc[How-to: The errors channel] covers turning service-thrown exceptions into typed errors on a payload's `errors:` field. + +xref:index.adoc[← How-to index] diff --git a/docs/manual/how-to/index.adoc b/docs/manual/how-to/index.adoc new file mode 100644 index 0000000000..b8f9cfb0a3 --- /dev/null +++ b/docs/manual/how-to/index.adoc @@ -0,0 +1,78 @@ += How-to guides +:description: Recipes for the day-to-day patterns Graphitron's directives unlock. +:!toc: + +Task-indexed recipes for the day-to-day patterns Graphitron's directives unlock. Browse alphabetically when you know which directive you want; browse by category when you know which problem you're solving. + +[cols="1,1",frame=none,grid=none] +|=== +a| +== Alphabetical + +* xref:add-custom-conditions.adoc[Add custom conditions]: attach a developer-supplied predicate to a field, argument, or input field via `@condition`. +* xref:apollo-federation.adoc[Apollo Federation transport]: wire the federation runtime around a Graphitron schema. +* xref:batch-lookups.adoc[Batch lookups]: drive a positional batch fetch with `@lookupKey` and get one result per input position. +* xref:computed-fields.adoc[Computed fields with `@externalField`]: project a derived column from a developer-supplied jOOQ `Field<T>`. +* xref:condition-cascade.adoc[Stacking and overriding conditions]: when explicit `@condition` predicates stack with implicit ones, and what `override:` suppresses. +* xref:connections.adoc[Cursor-paginated connections]: synthesised vs declared connection types, `totalCount` cost, and what the rewrite caps (and doesn't). +* xref:custom-scalars.adoc[Custom scalars]: declare a custom scalar in the SDL and bind it to a `GraphQLScalarType` constant via the `@scalarType(scalar:)` directive. +* xref:dev-loop.adoc[The dev loop (Quarkus + LSP)]: the inner edit-save-reload loop, why macOS needs the LSP, and how to connect IntelliJ to it. +* xref:error-channel.adoc[The errors channel]: route Java exceptions through a service payload's `errors:` field as typed data. +* xref:external-code.adoc[Wire external Java code]: the shared mechanics for `@service`, `@externalField`, `@tableMethod`, `@condition`, `@sourceRow`, and `@enum`. +* xref:federation-keys.adoc[Federation key fields]: declare entity keys with `@key`, layer them onto `@node` types, and stub non-resolvable entities owned by another subgraph. +* xref:global-id.adoc[Global object IDs]: Relay Global Object Identification end-to-end, including stable IDs, `keyColumns` migrations, and `Query.node` dispatch. +* xref:handle-services.adoc[Handle services]: bind GraphQL arguments to Java parameters and pick a return shape the framework recognises. +* xref:join-with-references.adoc[Join with references]: pin foreign-key paths between table-bound types so the generator emits a JOIN. +* xref:map-types-to-tables.adoc[Map types to tables]: bind types and fields with `@table` + `@field` across the four directive sites. +* xref:mcp-agent-context.adoc[Agent context over MCP]: connect an MCP-aware agent (Claude Code, Cursor) to `graphitron:dev` so it can answer questions about your schema, catalog, and directives. +* xref:migrating-from-legacy.adoc[Migrating from the legacy generator]: walk a schema authored against `graphitron-codegen-parent` to the rewrite. +* xref:multi-hop-nodeid-filter.adoc[Multi-hop `@nodeId` filters]: reach a related node type through one or more intermediate tables when the FKs carry the target's keys positionally by SQL name. +* xref:polymorphic-types.adoc[Polymorphic types]: choose between single-table and multi-table layouts for GraphQL interfaces and unions. +* xref:result-types.adoc[Result-type variants]: understand the backing class reflected from a class-backed parent's producer (jOOQ `TableRecord`, jOOQ `Record`, Java record, plain POJO). +* xref:sort-results.adoc[Sort results]: pick a column source, build stable keyset cursors with explicit tie-breakers, and avoid the collation pitfalls. +* xref:split-vs-inline.adoc[When to split queries]: choose between inline correlated subqueries and `@splitQuery`-batched fetches. +* xref:tenant-scoping.adoc[Tenant scoping]: per-request routing through `Graphitron.newExecutionInput(dsl, ...)`. The full recipe (per-tenant DataLoader partitioning, `@tenantId` directive, `byTenant` factory overload) ships under R45; until then, single-tenant apps pass a single `DSLContext`. +* xref:test-your-schema.adoc[Test your schema]: wire a consumer-side execution-tier test against a real Postgres. + +a| +== By category + +*Mapping types to tables* + +xref:map-types-to-tables.adoc[Map types to tables], xref:custom-scalars.adoc[Custom scalars] + +*Joining and batching* + +xref:join-with-references.adoc[Join with references], xref:batch-lookups.adoc[Batch lookups], xref:split-vs-inline.adoc[When to split queries] + +*Pagination and sorting* + +xref:connections.adoc[Cursor-paginated connections], xref:sort-results.adoc[Sort results] + +*Filtering* + +xref:add-custom-conditions.adoc[Add custom conditions], xref:condition-cascade.adoc[Stacking and overriding conditions] + +*Custom Java code* + +xref:external-code.adoc[Wire external Java code], xref:handle-services.adoc[Handle services], xref:computed-fields.adoc[Computed fields] + +*Result shapes and polymorphism* + +xref:result-types.adoc[Result-type variants], xref:polymorphic-types.adoc[Polymorphic types] + +*Mutations and errors* + +xref:error-channel.adoc[The errors channel] + +*Global IDs and federation* + +xref:global-id.adoc[Global object IDs], xref:federation-keys.adoc[Federation key fields], xref:apollo-federation.adoc[Apollo Federation transport] + +*Multi-tenant* + +xref:tenant-scoping.adoc[Tenant scoping] + +*Migration* + +xref:migrating-from-legacy.adoc[Migrating from the legacy generator] + +*Testing* + +xref:test-your-schema.adoc[Test your schema] + +*Editor and dev loop* + +xref:dev-loop.adoc[The dev loop (Quarkus + LSP)], xref:mcp-agent-context.adoc[Agent context over MCP] + +|=== + +xref:../index.adoc[← Back to the manual landing] diff --git a/docs/manual/how-to/join-with-references.adoc b/docs/manual/how-to/join-with-references.adoc new file mode 100644 index 0000000000..478266e35e --- /dev/null +++ b/docs/manual/how-to/join-with-references.adoc @@ -0,0 +1,307 @@ += How-to: Join with references +:description: Pin foreign-key paths between table-bound types so the generator emits a JOIN, including the implicit-FK shortcut, multi-hop chains, junction tables, the `table:` short form, inline column references, and the input-field variant. +:!toc: + +xref:../reference/directives/reference.adoc[`@reference`] declares a foreign-key path between the field's parent table and its target table. The generator threads the path through jOOQ's catalog and emits a JOIN whenever the field is selected. The reference page covers signature and constraints; this recipe walks the variants the directive surface supports: when you can omit it entirely, multi-hop chains and junction-table traversals, the two ways to pin a hop (by `key:` or by `table:`), inline cross-table column references, the input-field position, and the current state of the `condition:` form. + +For the surrounding question of "when does the join fire vs DataLoader-batch instead of inline", see xref:split-vs-inline.adoc[How-to: When to split queries]. This recipe assumes the field is inline-joinable (no `@splitQuery`); the path mechanics are the same either way. + +== Single-hop FK references + +The canonical case: name the FK constraint, the generator joins through it. + +[source,graphql] +---- +type Customer @table(name: "customer") { + address: Address @reference(path: [{key: "customer_address_id_fkey"}]) +} +---- + +`customer_address_id_fkey` is the constraint declared in the schema's DDL. A query selecting `customers { address { district } }` emits one statement: + +[source,sql] +---- +SELECT customer.first_name AS "firstName", + address.district AS "district" + FROM customer + LEFT JOIN address ON customer.address_id = address.address_id +---- + +The JOIN fires only when the selection set traverses through `address`; selecting only `firstName` skips it. This is the projection-narrowing the rewrite applies to every reachable path: nothing is fetched that the request didn't ask for. + +The `key:` value accepts two forms, both resolving to the same FK: + +* *Lowercase SQL constraint name.* `"customer_address_id_fkey"` matches what `psql \d customer` shows. +* *Java-constant style.* `"CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY"` matches the constant generated into jOOQ's `Keys` class. + +Either works; pick whichever your team's style guide prefers. The classifier walks both indices in parallel. + +== Implicit references: when the catalog disambiguates + +When exactly one foreign key exists between two tables, `@reference` is unnecessary and the generator picks the path automatically: + +[source,graphql] +---- +type Store @table(name: "store") { + customers: [Customer!]! @defaultOrder(primaryKey: true) +} +---- + +There is exactly one FK between `customer` and `store` (`customer.store_id`), so the join is implicit. The `@table`-bound parent type plus the `@table`-bound return type plus a unique FK between them is enough; the catalog finds the path. This is the recommended shape when it applies; explicit `@reference` is noise when the catalog can resolve the path. + +The generator does not guess when more than one FK exists. The Sakila `store ↔ staff` pair has two FKs (`store.manager_staff_id` and `staff.store_id`), so any field crossing it must declare which one: + +[source,graphql] +---- +type Store @table(name: "store") { + manager: Staff @splitQuery @reference(path: [{key: "store_manager_staff_id_fkey"}]) +} +---- + +Without `@reference` here, the build fails at classify time with an ambiguous-reference diagnostic listing both candidate FKs. The fix is always one of two things: name the FK with `key:`, or use `table:` if the disambiguation goes the other direction. + +== Multi-hop chains + +`@reference` accepts a list of hops; the generator chains them into one JOIN sequence. + +[source,graphql] +---- +type Customer @table(name: "customer") { + storeAddress: Address @reference(path: [ + {key: "customer_store_id_fkey"}, + {key: "store_address_id_fkey"} + ]) +} +---- + +The path is `customer.store_id → store.store_id → store.address_id → address.address_id`: two FKs and three tables touched in one SQL statement. Each hop's `key:` pins one of the FKs; the generator infers the intermediate tables from the FK target metadata. + +Multi-hop chains are how junction tables work too. A many-to-many through `film_actor` is two FKs in sequence: + +[source,graphql] +---- +type Film @table(name: "film") { + actors(actor_id: [Int!] @lookupKey): [Actor!]! @reference(path: [ + {key: "film_actor_film_id_fkey"}, + {key: "film_actor_actor_id_fkey"} + ]) +} +---- + +The first hop joins `film` to `film_actor` via the film_id FK; the second joins `film_actor` to `actor` via the actor_id FK. The junction table itself does not appear in the GraphQL schema; it's purely path infrastructure. The same shape works on connections (`actorsConnection: ActorsConnection!`) and under `@splitQuery` (`actorsBySplitLookup: ...`). + +The number of hops is unbounded; chains of three, four, or more FKs work the same way. Each hop is independent and resolves against the previous hop's destination table. + +== `table:` as a short form + +The reference's `ReferenceElement` accepts `table:` as an alternative to `key:`. When exactly one FK exists between the source and destination tables for that hop, `table:` is enough: + +[source,graphql] +---- +type Customer @table(name: "customer") { + district: String @reference(path: [{table: "address"}]) +} +---- + +This resolves to the same FK as `{key: "customer_address_id_fkey"}` because `customer ↔ address` has exactly one FK between them. When the table pair is ambiguous, `table:` fails: + +[source,graphql] +---- +# Customer ↔ Address has only one FK; this works. +district: String @reference(path: [{table: "address"}]) + +# Film ↔ Language has only one FK; this works. +languageName: String @field(name: "name") @reference(path: [{table: "language"}]) +---- + +But two `language`-pointing FKs (e.g. a hypothetical `original_language_id` alongside `language_id`) would make the second example ambiguous, and the build would reject it as an `UnclassifiedField` with the same ambiguous-reference diagnostic. The `table:` form is the catalog-driven shortcut; the `key:` form is the explicit one. Use whichever expresses the intent more clearly: + +* `key:` when the constraint name is the source of truth (DBA-managed schemas, named-constraint conventions). +* `table:` when the destination is what's interesting and the FK choice is unambiguous. + +Setting both `key:` and `table:` is allowed but redundant; the generator validates they agree. + +== How `table`, `key`, and `condition` combine + +Each `ReferenceElement` carries three optional fields. They are not independent toggles: which ones you set, and whether the catalog can disambiguate, decides how the hop resolves. The role of `condition:` in particular flips depending on whether `table:`/`key:` accompany it, joining `ON` predicate when alone, extra constraint when paired. + +[cols="2,5",options="header"] +|=== +| Fields set | How the hop resolves +| `key:` alone | The explicit form. `table:` is inferred from the FK target. Always unambiguous; this is what a multi-FK pair must use. +| `table:` alone | The catalog-driven shortcut. `key:` is inferred when exactly one FK exists between the source and destination tables; an ambiguous pair classifies as `UnclassifiedField` and the build rejects with the candidate FKs listed. +| `key:` + `table:` | Allowed but redundant. The generator validates the two agree and fails if they do not. +| `condition:` alone | Treated as the join `ON` predicate: the generator joins the field's target table and applies the returned `org.jooq.Condition` as the join condition. *Classify-only today* (see <<condition-form>>): the schema validates but the field throws at request time. +| `condition:` + `key:`/`table:` | `condition:` acts as an *extra* constraint on the hop joined via the FK, not as the `ON` predicate. Mixed paths that combine an FK hop with a `condition:`-only terminal hop are reserved; treat as not-yet-supported. +| none of the three | Not a valid hop. `path:` must be non-empty and each element must pin its hop somehow. +|=== + +The `condition:`-bearing rows describe the intended contract; the runtime arm has not shipped. See the `condition:` section below before relying on either. + +== Inline cross-table columns + +`@reference` is most often seen on object-typed fields, but it works on scalar fields too: the parent type pulls a column from a referenced table directly into its own shape, with no intermediate object. + +[source,graphql] +---- +type Film @table(name: "film") { + languageName: String @field(name: "name") @reference(path: [{key: "film_language_id_fkey"}]) +} +---- + +`Film.languageName` projects `language.name` (joined through `film.language_id`) directly onto the film type. The classifier produces a `ColumnReferenceField`; the emitter joins through the FK and projects the target column under the requested alias. No intermediate `language` object appears; clients see `Film { languageName }` as a flat scalar. + +This is useful when the schema wants to expose a foreign column without the indirection cost of nesting through the linked type. The trade-off: every `Film` selection that includes `languageName` triggers the join. A field that already nests through `language` (e.g. `Film { language { name } }`) is preferred when other language columns are also exposed; the `languageName` shortcut is for the "expose exactly one column" case. + +The shortcut also accepts the multi-hop and `table:` forms: + +[source,graphql] +---- +type Customer @table(name: "customer") { + storeManagerName: String + @field(name: "first_name") + @reference(path: [ + {key: "customer_store_id_fkey"}, + {key: "store_manager_staff_id_fkey"} + ]) +} +---- + +Same shape as a multi-hop object reference; the only difference is the parent type's projection list at SQL time, which gets `staff.first_name` aliased to `storeManagerName`. + +== Filter references + +`@reference` also applies to filter inputs: both `INPUT_FIELD_DEFINITION` (a field inside a `filter:` input object) and `ARGUMENT_DEFINITION` (a direct scalar argument). In both cases the directive lets a filter value resolve through a foreign-key path to a column on a *joined* table, instead of a column on the field's own table. + +[source,graphql] +---- +input Input { + district: String! @reference(path: [{table: "address"}]) +} + +type Customer @table(name: "customer") { + customerId: Int! @field(name: "customer_id") +} + +type Query { + query(in: Input!): Customer +} +---- + +The query's return type `Customer` has `@table(name: "customer")`, so the input type `Input` is implicitly bound to the `customer` table for the duration of this argument site. The `@reference(path: [{table: "address"}])` on the `district` input field resolves the customer→address FK and filters on `address.district` (a column that does not exist on `customer`). + +Because the terminal column lives on a different table than the row being filtered, the generated condition does not compare a local column. It emits a *correlated `EXISTS` subquery* that joins through the path and applies the predicate against the terminal table: + +[source,sql] +---- +EXISTS ( + SELECT 1 + FROM address + WHERE address.address_id = customer.address_id -- correlation back to the filtered row + AND address.district = ? -- predicate on the terminal column +) +---- + +The same applies to a direct scalar argument: + +[source,graphql] +---- +type Query { + customersByDistrict( + district: String @reference(path: [{table: "address"}]) + ): [Customer!]! +} +---- + +=== Multi-hop filters + +The path may traverse several foreign keys. The `EXISTS` subquery then joins the whole chain, correlating its first hop back to the filtered row and applying the predicate against the terminal table: + +[source,graphql] +---- +type Query { + citiesByCountryName( + countryName: String @reference(path: [{table: "city"}, {table: "country"}]) @field(name: "country") + ): [Address!]! +} +---- + +`@field(name:)` names the terminal column (here `country.country`) when it differs from the GraphQL field name; without it the field name is used. + +=== Null and empty-list filters contribute no predicate + +A reference filter behaves exactly like a local-column filter for absent values: a null scalar argument, or an empty list, contributes no predicate at all (the whole `EXISTS` term is guarded), so the query is unfiltered rather than matching zero rows. A list-valued reference filter emits `IN (...)` against the terminal column inside the `EXISTS`. + +=== Foreign-key hops only + +A reference filter requires every hop to resolve to a foreign key (the `{key:}` and `{table:}` forms, including single-FK auto-discovery). A `{condition:}` hop (see <<condition-form>> below) is *not* supported in a filter path and is rejected at build time; reference filters are emitted as a foreign-key correlated subquery, so a non-FK hop has nothing to correlate on. + +The full set of input-field directives (`@field`, `@condition`, `@reference`) interoperate; see xref:condition-cascade.adoc[How-to: Stacking and overriding conditions] for the input-carrier rules and how the input's `@table` cascade interacts with the per-field directives. + +[#condition-form] +== The `condition:` form (classify-only today) + +`ReferenceElement` has a third option: `condition:` is an `ExternalCodeReference` to a Java method that returns a `org.jooq.Condition` to use as the join predicate. The classifier accepts it, but the generator's emitter for `ConditionJoin` paths is currently a runtime-throwing stub: + +[source,graphql] +---- +type Category @table(name: "category") { + similar: Category @reference(path: [{condition: { + className: "no.sikt.graphitron.rewrite.test.conditions.CategoryConditions", + method: "sameNamePrefix" + }}]) +} +---- + +The Java side: + +[source,java] +---- +public static Condition sameNamePrefix(Table<?> src, Table<?> tgt) { + return DSL.noCondition(); +} +---- + +The classifier produces a `JoinStep.ConditionJoin` and the schema validates, but selecting `Category.similar` at request time throws `UnsupportedOperationException` until the emitter ships a real body. This shape is reserved for non-FK joins: catalog-derived predicates (e.g. "category whose name shares a prefix with this one"), date-range overlaps, computed predicates with no FK constraint to anchor against. Today, treat the schema as a placeholder; production schemas should not include `condition:`-only references. + +When the runtime arm lands, the contract will be: the method receives the source and target table aliases (both as `Table<?>`) and returns the `Condition` to use on the JOIN's `ON` clause. The framework wraps that into the JOIN at SQL emit time. Mixed paths that combine a `key:` hop with a `condition:`-only terminal hop are also reserved. + +== `@splitQuery` on a referenced field + +Adding `@splitQuery` switches the field from inline-JOIN dispatch to per-parent `DataLoader` batching. The `@reference` path stays the same; only the runtime shape changes. + +[source,graphql] +---- +type Customer @table(name: "customer") { + address: Address @reference(path: [{key: "customer_address_id_fkey"}]) + addressSplit: Address @splitQuery @reference(path: [{key: "customer_address_id_fkey"}]) +} +---- + +`address` resolves inline as part of the customer query (one SQL statement, JOIN-projected columns). + +`addressSplit` resolves via a `DataLoader`: the customer query runs first, then a per-request batched address lookup keyed on `customer.address_id` runs in a second statement, fanned out to all parents that selected `addressSplit`. + +The choice is operational, not semantic; xref:split-vs-inline.adoc[How-to: When to split queries] covers when round-trip cost beats fan-out cost (typically: deep paths, many sibling parents, large parent projections). The path itself is identical. + +== Pitfalls + +* *`path:` must be non-empty.* `@reference(path: [])` fails graphql-java parsing. Every reference declares at least one hop. +* *Multi-FK pairs require explicit `key:` or `table:`.* When more than one FK exists between two tables for a given hop, the build fails with an ambiguous-reference diagnostic. Pick one with `key:` (preferred when the FK has a stable name) or `table:` (preferred when the FK is unique-but-unnamed in your conventions, and the destination disambiguates). +* *`table:` requires unique-FK-between-the-pair.* Otherwise the field classifies as `UnclassifiedField` and the build rejects. The diagnostic spells out the candidate FKs; switch to `key:` to disambiguate. +* *Implicit references work only when one FK exists.* The example schema's `Store.customers` works without `@reference` because `customer ↔ store` has exactly one FK; `Store.manager` cannot omit `@reference` because `store ↔ staff` has two FKs. +* *Inline column references join the linked table.* `languageName: String @field(name: "name") @reference(...)` adds a JOIN to `language` whenever `languageName` is selected. If the schema also exposes `Film.language { name }` and clients tend to select via the nested form, the inline shortcut is redundant cost. +* *`condition:`-only paths classify but throw at request time today.* Use only as a placeholder pending the runtime arm; production schemas should stick to `key:` and `table:` forms. +* *Junction tables are path-only, never types.* The `film_actor` join table is two FKs in sequence; it does not appear as a GraphQL type. Adding it as a `@table`-bound type would be valid (FilmActor exists in the example schema for `@nodeId` purposes), but client-facing many-to-many fields use the path form. +* *FK constraint names are catalog-bound.* A migration that renames a constraint without updating the schema's `key:` value breaks the build. The `table:` form is more migration-resilient when the FK pair stays unique; the `key:` form is more explicit when constraint names are the contract. + +== See also + +* xref:../reference/directives/reference.adoc[`@reference`] is the directive surface this recipe expands. +* xref:../reference/directives/table.adoc[`@table`] establishes the table binding both endpoints rely on. +* xref:polymorphic-types.adoc[How-to: Polymorphic types] for the union/interface variant, modelled through `@discriminate` / `@discriminator`. +* xref:split-vs-inline.adoc[How-to: When to split queries] covers the inline-JOIN vs per-parent batch trade-off; the `@reference` path is shared across both. +* xref:condition-cascade.adoc[How-to: Stacking and overriding conditions] covers the input-carrier rules and how input-field references interact with the condition cascade. +* xref:../tutorial/04-joining-tables.adoc[Tutorial page 4: Joining tables] introduces single-hop and multi-hop references in narrative form. + +xref:index.adoc[← How-to index] diff --git a/docs/manual/how-to/map-types-to-tables.adoc b/docs/manual/how-to/map-types-to-tables.adoc new file mode 100644 index 0000000000..818aad3d7d --- /dev/null +++ b/docs/manual/how-to/map-types-to-tables.adoc @@ -0,0 +1,175 @@ += How-to: Map types to tables +:description: Bind GraphQL types and fields to jOOQ tables and columns, with enum-value mapping (text-column and jOOQ-enum), input-type binding, and the case-sensitivity rules. +:!toc: + +xref:../reference/directives/table.adoc[`@table`] anchors a GraphQL type to a database table; xref:../reference/directives/field.adoc[`@field`] points a slot at a specific column or string. Together they carry every type-to-storage mapping in the rewrite. This recipe walks through the four directive sites of `@field` (object field, argument, input field, enum value), shows the two enum-mapping shapes (text-column and jOOQ-enum), and covers the case-sensitivity and re-binding rules that catch teams new to the directive pair. + +== When to spell `@table` and when to omit it + +xref:../reference/directives/table.adoc[`@table`] without `name:` looks up the jOOQ table by the GraphQL type name, case-insensitively. So `type Customer` resolves to the `customer` table without configuration. Spell `name:` explicitly when: + +* The GraphQL type name and the SQL identifier diverge (renamed type, namespace prefix, plural/singular mismatch). Example: `type Person @table(name: "customer")` keeps the schema-side rename intact while binding to the existing table. +* The SQL identifier carries casing or punctuation the GraphQL type can't replicate (uppercase, underscores, or quoted identifiers in the jOOQ catalog). +* Two GraphQL types bind to the same table (e.g. `Customer` and `CustomerSummary`); both need explicit `@table(name: "customer")` because one is going to lose the case-insensitive default. + +The `name:` value must match the jOOQ-generated identifier exactly (typically uppercase for PostgreSQL when jOOQ's default casing is in effect). The build fails with an unclassified-type error if the catalog has no matching `Table` class. + +== Tables in non-default schemas + +When the consumer's jOOQ codegen straddles two or more SQL schemas (`public`, `archive`, an external integration namespace), `@table(name:)` accepts a qualified `"schema.table"` form to scope the lookup. Unqualified names still work in the common case where the table name is unique across every schema in the catalog: + +[source,graphql] +---- +type Widget @table(name: "widget") { # unique across schemas + id: ID! @field(name: "WIDGET_ID") +} + +type ArchivedEvent @table(name: "archive.event") { # qualified + id: ID! @field(name: "EVENT_ID") +} + +type CurrentEvent @table(name: "public.event") { # qualified + id: ID! @field(name: "EVENT_ID") +} +---- + +When the bare table name appears in two or more schemas, an *unqualified* lookup fails the build with `@table(name: 'event') is ambiguous: defined in schemas [archive, public]; qualify as 'archive.event', 'public.event'` (the catalog returns empty rather than picking whichever schema iterated first; the rejection names the colliding schemas and the qualified forms inline). The fix is to pick the right schema and qualify; the message tells you both options. Single-schema consumers see no change; only collision sites are forced to qualify, so adding a non-default schema to a previously single-schema project only forces edits where a name actually collides. + +A genuinely missing name (the value isn't in any schema) takes a different path: the standard `table 'X' could not be resolved in the jOOQ catalog` rejection with a Levenshtein-ranked candidate hint pointing at near matches. The two messages distinguish "this column was renamed" from "this column lives somewhere; pick which one". + +The same syntax applies on input types and interfaces; `@table(name: "schema.table")` is valid wherever bare `@table(name:)` was. Schema and table halves of the qualified value are both case-insensitive (consistent with the unqualified form). + +== Field-to-column with `@field` + +The most common shape: bind every scalar to its column. + +[source,graphql] +---- +type Customer @table(name: "customer") { + customerId: Int! @field(name: "CUSTOMER_ID") + firstName: String! @field(name: "FIRST_NAME") + lastName: String! @field(name: "LAST_NAME") + email: String @field(name: "EMAIL") +} +---- + +The selection set drives projection: a query asking for `firstName lastName` produces `SELECT customer.first_name AS "firstName", customer.last_name AS "lastName"`, not `SELECT *`. Adding columns to the type only widens the projection when clients ask for them. + +Four practical rules: + +* *Names match case-insensitively.* When GraphQL `firstName` and column `FIRST_NAME` already match (lowercased and underscore-normalised), the directive is technically redundant. The example schema applies it explicitly anyway because mismatches creep in over time and explicit binding keeps the drift detectable in code review. +* *Mismatch fails the build.* `@field(name: "FIRST_NAMEZ")` (typo) fails resolution against the catalog, with a candidate hint pointing at `FIRST_NAME`. +* *Nested `@table` re-binds.* A nested type with its own `@table` re-anchors column lookup; an xref:../reference/directives/reference.adoc[`@reference`]-annotated field hops into the joined table for the duration of that field's subquery. Inside `Customer`, `address: Address @reference(...)` resolves `Address`'s columns against the `address` table, not `customer`. +* *Don't use `@field` on relations.* `@field` is for column-bound slots only. Relations (`address: Address`, `films: [Film!]!`) use xref:../reference/directives/reference.adoc[`@reference`] or auto-discovered FK paths instead. + +== Argument-to-column: avoid silent column collisions + +When a `Query` field exposes a filter argument whose name doesn't match the column, `@field` pins the binding: + +[source,graphql] +---- +type Query { + customers(active: Boolean @field(name: "ACTIVEBOOL")): [Customer!]! +} +---- + +Without the directive, the generator would look up a column called `active` on the `customer` table. Sakila's `customer` table happens to have one (an unused integer flag), so the filter would silently bind to the wrong column. `@field(name: "ACTIVEBOOL")` makes the binding explicit and the build will fail loudly if `ACTIVEBOOL` ever disappears from the catalog. + +This is the canonical case where `@field` is *not* redundant: GraphQL conventions favour short, intuitive argument names (`active`, `name`, `id`) while databases often keep longer, more specific column names (`ACTIVEBOOL`, `FIRST_NAME`, `CUSTOMER_ID`). The directive is what makes the schema readable on both sides without coupling them. + +The argument can also drive a typed-enum filter (see "Enum values" below) or a xref:../reference/directives/lookupKey.adoc[`@lookupKey`] batch lookup; `@field` works the same way in either case. + +== Input-field-to-column: mutations and filters + +`@field` on `INPUT_FIELD_DEFINITION` plays the same role inside an `input` type used by a mutation, condition, or upsert: + +[source,graphql] +---- +input FilmCreateInput @table(name: "film") { + title: String! @field(name: "title") + languageId: Int! @field(name: "language_id") +} +---- + +The `INSERT` writes `title` and `language_id`; the GraphQL camelCase never reaches SQL. The `@table` directive on the *input type* tells the generator which table the write targets; without it, the input would not classify as a `TableInputType` and the mutation would not wire up. + +Three things that surface here and not on output types: + +* *Required input scalars are write-time required.* A `title: String!` field on a `@table` input means the column must be supplied on every call; nullability of the underlying column does not relax the GraphQL contract. +* *Input types don't compose like output types.* You cannot reuse `Customer` (an output type) as an input. Define `CustomerCreateInput` separately and bind it with its own `@table`. +* *Filter inputs follow the same rule.* A `FilmConditionInput @table(name: "film")` bound to a `filmsByCondition(filter: FilmConditionInput)` query uses `@field` on each input field to point its xref:../reference/directives/condition.adoc[`@condition`]-driven match at the right column. + +== Enum values: text-column and jOOQ-enum + +GraphQL enums map to two distinct database shapes, and `@field` on `ENUM_VALUE` carries the right thing for each. + +*Text-column enum.* The column is `text`, `varchar`, or another string type, and the DB stores literal values (some of which can't be GraphQL identifiers). Use `@field(name:)` on each value where the storage diverges: + +[source,graphql] +---- +"""Text-column enum: values map to database strings via @field(name:).""" +enum TextRating { + G + PG + PG_13 @field(name: "PG-13") + R + NC_17 @field(name: "NC-17") +} +---- + +GraphQL doesn't allow `-` in enum values, but the database stores `"PG-13"` and `"NC-17"`. `@field` per value provides the GraphQL-safe identifier-to-storage mapping. The generator emits a static `*_MAP` lookup table and uses it to translate GraphQL values to DB strings on the way down (filter arguments, mutation input) and back to GraphQL on the way up (selection projections). Values without `@field` default to their own name, so `G`, `PG`, and `R` map to `"G"`, `"PG"`, and `"R"` without further configuration. + +*jOOQ-typed enum.* The column is a database-native ENUM type (PostgreSQL `CREATE TYPE`) for which jOOQ generates a Java enum class. GraphQL enum values must match the Java constants exactly: + +[source,graphql] +---- +enum MpaaRating { + G + PG + PG_13 + R + NC_17 +} +---- + +The generator validates every GraphQL value against the jOOQ-generated Java enum's `Enum.values()` and rejects mismatches at build time with a candidate-hint diagnostic. There is no `@field` per value on the jOOQ-enum case because the Java enum names are the contract; renaming a GraphQL value to a non-matching name fails the build. + +The two cases coexist on the same database. The Sakila example schema's `Film.rating` is the jOOQ-enum form (`mpaa_rating` is a Postgres ENUM); `Film.textRating` is the text-column form on a sibling `TEXT_RATING` column that stores the same values as plain strings. + +When the column is a jOOQ enum but the GraphQL side carries `@field` on values, the build fails. When the column is text but the GraphQL enum has no `@field` overrides, the values default to their own names; that's only correct if the DB happens to store the GraphQL identifiers verbatim. + +== Re-binding and the table-context cascade + +Column lookup resolves against a *current table context*. The cascade rules: + +. The containing GraphQL type's `@table`, if it has one. +. A nested type's own `@table` re-binds inside that type. +. An xref:../reference/directives/reference.adoc[`@reference`]-annotated field hops the context into the joined table for the duration of its subquery. +. An argument or input field on a query/mutation field with no `@table` resolves against the field's *return-type table*, not the parent's. + +Two consequences worth highlighting: + +* *Nested types don't inherit `@table` from their parent.* `Address` inside `Customer` re-binds to its own table; `@field` inside `Address` resolves against `address`, not `customer`. The xref:../reference/directives/reference.adoc[`@reference`] on `customer.address` carries the FK path so the join is correct. +* *Arguments resolve against the return type.* `customers(active: Boolean @field(name: "ACTIVEBOOL")): [Customer!]!` resolves `ACTIVEBOOL` against the `customer` table (the return type) even though the field lives on `Query`. This is why argument-side `@field` works without a `@table` on the argument itself. + +== Constraints and pitfalls + +* `@field(name:)` is required (graphql-java rejects no-arg `@field` at parse time). +* The target identifier must resolve in the surrounding `@table`'s jOOQ catalog; mismatches fail the build with a candidate hint. +* `@field` is for column-bound slots only. Relations and nested types use xref:../reference/directives/reference.adoc[`@reference`] or auto-discovered FK paths. +* GraphQL slot name and target identifier match case-insensitively (lowercased + underscore-normalised). The directive is redundant when names match; spell it out anyway to surface drift. +* Input types must declare their own `@table`; inheriting from an output type's binding is not supported. +* Text-column enum values default to their own name when `@field` is omitted; that is only correct when the DB stores the GraphQL identifier verbatim. +* jOOQ-enum values must match the Java enum constants 1:1; `@field` per value is rejected on the jOOQ-enum case. +* The argument-side default (column lookup against the field's *return-type* table) is what makes argument `@field` work without a `@table` on the argument itself; it also means the same argument bound to two different return types resolves against two different tables. + +== See also + +* xref:../reference/directives/table.adoc[`@table`] establishes the table context. +* xref:../reference/directives/field.adoc[`@field`] is the per-slot binding directive. +* xref:../reference/directives/reference.adoc[`@reference`] hops between two `@table`-bound types. +* xref:../reference/directives/lookupKey.adoc[`@lookupKey`] composes with `@field` on argument-side batch lookups. +* xref:../reference/directives/condition.adoc[`@condition`] composes with `@field` on input filter fields. +* xref:../tutorial/02-first-schema.adoc[Tutorial page 2: The starter schema] introduces `@table` and `@field` together. + +xref:index.adoc[← How-to index] diff --git a/docs/manual/how-to/mcp-agent-context.adoc b/docs/manual/how-to/mcp-agent-context.adoc new file mode 100644 index 0000000000..7b5d20e3a7 --- /dev/null +++ b/docs/manual/how-to/mcp-agent-context.adoc @@ -0,0 +1,123 @@ += How-to: Agent context over MCP +:description: Connect an MCP-aware agent (Claude Code, Cursor) to the graphitron:dev server so it can answer questions about your project's schema, catalog, and directives without grepping. +:!toc: + +You are working on a Graphitron subgraph with an MCP-aware coding agent (Claude Code, Cursor), and you want the agent to understand your project: which tables the catalog holds, which `@service` classes exist, what the directive vocabulary means, and where to find the right pattern in the manual. `mvn graphitron:dev` already runs an MCP server for exactly this. Point your agent at it once and the agent stops guessing. + +[TIP] +==== +This is the companion to xref:dev-loop.adoc[the dev loop]. The same `mvn graphitron:dev` process serves both the LSP (for your editor) and the MCP server (for your agent) off one warm workspace. If you have the dev loop running, the MCP server is already up. +==== + +== TLDR + +[cols="1,3"] +|=== +| Step | What to run + +| 1. Start the dev server +| `mvn graphitron:dev` in a side terminal. Alongside the LSP on `localhost:8487`, it binds an MCP server on `http://127.0.0.1:8488/mcp` (Streamable HTTP, loopback only). + +| 2. Register the server +| Run the copy-pasteable line the dev server prints on startup: `claude mcp add --transport http graphitron http://127.0.0.1:8488/mcp`. Or commit a `.mcp.json` (see <<setup>>). + +| 3. Ask the agent +| Run the `+/mcp__graphitron__about+` slash command for orientation, then ask questions in natural language ("which directive joins two tables?", "where are customer addresses stored?"). The agent calls the MCP tools to answer. +|=== + +The MCP server is loopback-only and read-only: it exposes context about the project you are running `graphitron:dev` in, nothing else. + +== What the MCP server gives an agent + +An MCP-aware agent connected to the server gets three kinds of context, all served off the same warm workspace the dev loop keeps current. + +An **`about` prompt** (surfaced as the `+/mcp__graphitron__about+` slash command) that orients the agent on the dev loop and how to use the other tools. Run it first in a fresh session. + +A **`directives` resource**, the Graphitron directive vocabulary, so the agent knows what `@table`, `@field`, `@reference`, `@service`, and the rest mean without you pasting the reference in. + +A set of **tools** the agent calls to answer questions: + +[cols="1,3"] +|=== +| Tool | What it answers + +| `docs.search` +| Natural-language retrieval over the bundled manual ("which directive joins two tables?"). Returns the matching passages with a link into this site, so the agent finds the right pattern without already knowing the vocabulary to grep for. + +| `catalog.search` +| Semantic, fuzzy discovery over your jOOQ catalog ("where are customer addresses stored?"). Returns the most relevant tables ranked by similarity, by schema-qualified SQL name. Feed a hit straight into `catalog.describe`. + +| `catalog.tables` +| Lists the tables in the catalog. + +| `catalog.describe` +| Full column / key / foreign-key detail for one table. + +| `schema` +| Describes the classified GraphQL schema. + +| `services`, `conditions`, `records` +| List the `@service` classes, `@condition` methods, and `@record` classes the generator resolved on the classpath. + +| `edges` +| Traverses the cross-reference edges between schema elements and their backing Java / jOOQ. + +| `diagnostics` +| The current schema validation diagnostics, the same `(file, location, message)` triples the LSP delivers to your editor. + +| `status` +| Dev-loop status (ports, warm state). +|=== + +[NOTE] +==== +`catalog.search` and `docs.search` are backed by a semantic index that loads asynchronously when `graphitron:dev` starts and refreshes after a schema change. While the index warms, those two tools return a short notice and point the agent at the structured tools (`catalog.tables`, `catalog.describe`, `schema`, and the rest), which answer immediately in the meantime. + +`catalog.search` is much stronger when your jOOQ-generated catalog carries table and column comments. Enable comment generation in your jOOQ codegen configuration so the database's own documentation feeds the search; without comments, search still works on table and column names alone. +==== + +[#setup] +== Connect your agent + +The server speaks the Model Context Protocol over Streamable HTTP at `http://127.0.0.1:8488/mcp`. Any MCP-aware agent that supports HTTP transport can connect. + +=== Claude Code + +The dev server prints a copy-pasteable line on startup: + +---- +claude mcp add --transport http graphitron http://127.0.0.1:8488/mcp +---- + +Run it once and Claude Code registers the `graphitron` server. Alternatively, commit a `.mcp.json` at the project root so anyone who clones the repo gets the server with zero configuration: + +[source,json] +---- +{ + "mcpServers": { + "graphitron": { + "type": "http", + "url": "http://127.0.0.1:8488/mcp" + } + } +} +---- + +The `graphitron-sakila-example` project ships exactly this file, so cloning it needs no MCP setup at all. + +=== Cursor and other agents + +Any MCP client that accepts an HTTP endpoint works: register a server named `graphitron` pointing at `http://127.0.0.1:8488/mcp` with transport type HTTP (sometimes labelled "Streamable HTTP" or "http"). The shape is the same as the `.mcp.json` above; consult your agent's MCP configuration docs for where that config lives. + +== Port and lifecycle + +The MCP port is fixed at `8488` (the LSP's is `8487`) and, unlike the LSP port, is *not* overridable. It stays a well-known value so a committed `.mcp.json` never drifts. If `8488` is already taken, typically a second `graphitron:dev` for another project, the dev server fails fast on startup with a message naming the conflict rather than silently rebinding, so a stale `.mcp.json` never points an agent at the wrong project's server. Stop the other session occupying the port, then retry. + +The server is part of the one `graphitron:dev` JVM: no daemon, no separate process to manage. Ctrl+C on the dev goal closes the MCP server along with the LSP socket and the watchers. + +== See also + +* xref:dev-loop.adoc[The dev loop (Quarkus + LSP)]: the editor-facing half of the same `graphitron:dev` process. +* xref:../../architecture/how-to/dev-loop-internals.adoc#dev-loop-detail[Dev loop reference] (architecture docs): how the `dev` goal wires the LSP, MCP server, watchers, and generator dispatch into one JVM. + +xref:index.adoc[← How-to index] diff --git a/docs/manual/how-to/migrating-from-legacy.adoc b/docs/manual/how-to/migrating-from-legacy.adoc new file mode 100644 index 0000000000..4443f209e6 --- /dev/null +++ b/docs/manual/how-to/migrating-from-legacy.adoc @@ -0,0 +1,255 @@ += How-to: Migrating from the legacy generator +:description: Walk a schema from the legacy graphitron-codegen-parent generator to the rewrite. Covers the hard removals, the synthesis shims that still warn but will retire, the deprecated arguments to phase out, and the one intentional behavior divergence. +:!toc: + +The rewrite generator (`graphitron-rewrite`) is directive-compatible with the legacy generator (`graphitron-codegen-parent`): the same `@table`, `@field`, `@service`, `@reference`, `@asConnection`, `@nodeId`, `@condition` directives all do approximately the same thing on the rewrite, and a schema authored against the legacy generator's directive surface will mostly compile under the rewrite without changes. The "mostly" is what this recipe covers: the hard removals (build fails until you remove the directive), the synthesis shims (build succeeds with a WARN today, will fail later), the deprecated arguments (build succeeds with a deprecation notice from graphql-java), and the one behavior divergence the rewrite intentionally preserves over legacy semantics. + +This recipe is organised by *what changes for you*, not by which directive each topic touches. Run through the sections in order; each lands a class of migration steps before the next one introduces a new shape. + +[#supported-surface] +== Authoritative supported surface + +The rewrite's directive surface and the schema shapes its classifier emits are both regenerated from the test suite. The two lists below are mechanically derived: every directive listed under "Supported directives" is declared in the rewrite's `directives.graphqls`, and every shape under "Supported schema shapes" has at least one execution-tier or pipeline-tier fixture that exercises it through end-to-end classification. + +A schema using only the directives and shapes named below should migrate cleanly. The remaining sections of this recipe cover the mechanical rewrites the legacy → rewrite migration requires. + +include::../_generated/supported-directives.adoc[] + +include::../_generated/supported-schema-shapes.adoc[] + +== Hard removals + +Two directives the rewrite refuses to accept. Both stay declared so the SDL still parses, but every application is rejected at classify time with a "no longer supported" message. + +=== `@notGenerated` + +Legacy schemas used it to mark fields the developer would wire by hand through `RuntimeWiring`; the rewrite requires every field to be fully described by the schema. Any application is rejected at build time: + +[source,text] +---- +@notGenerated is no longer supported. Remove the directive; fields must be fully described by the schema. +---- + +The directive is still *parsed* (so the SDL still validates), but every classify-time application fails with that message. The migration is a one-step delete-and-replace: remove the `@notGenerated` and add the directive that names the actual data source. + +[cols="2,2,3",options="header"] +|=== +| Original site | Rewrite replacement | Notes +| `field: T @notGenerated` on `Query` / `Mutation` | xref:../reference/directives/service.adoc[`@service`] | Wire the resolver as a service method; the rewrite generates the data fetcher and dispatches to your code. See xref:handle-services.adoc[How-to: Handle services] for the argument binding and return-shape rules. +| `field: T @notGenerated` on a child of a `@table` parent | xref:../reference/directives/externalField.adoc[`@externalField`] (column-shaped) or xref:../reference/directives/reference.adoc[`@reference`] (FK-driven) | `@externalField` returns a `Field<T>` from a static method (the framework projects); `@reference` joins through the catalog. xref:join-with-references.adoc[How-to: Join with references] covers the FK-path mechanics. +| `field: T @notGenerated` on a class-backed parent | A typed Java accessor | The class-backed parent (its backing class reflected from its producer) must expose the data through a typed Java-record accessor (auto-derived `BatchKey`). xref:result-types.adoc[How-to: Result-type variants] covers the four backing-class shapes. +| `field: T @splitQuery @notGenerated` (custom batch fetcher) | xref:../reference/directives/service.adoc[`@service`] (with xref:../reference/directives/splitQuery.adoc[`@splitQuery`] for non-root batching) | Service methods can be batched with `@splitQuery` at non-root sites; the developer-supplied method runs once per parent batch. The contract is `Set<Key> → Map<Key, Value>`; see the `@splitQuery` section of xref:handle-services.adoc[How-to: Handle services]. +| `interface T @notGenerated` / `union U @notGenerated` | (no replacement needed) | The legacy "skip interface/union wiring" axis was always tied to `RuntimeWiring`-side type resolvers; the rewrite always generates these from xref:../reference/directives/discriminate.adoc[`@discriminate`] / xref:../reference/directives/discriminator.adoc[`@discriminator`]. Remove the directive. +|=== + +The xref:../reference/directives/notGenerated.adoc[`@notGenerated` reference page] carries the same matrix; this recipe expands the right-hand column with cross-links to the recipe each replacement is best documented in. + +=== `@multitableReference` + +Legacy schemas used `@multitableReference(routes: [...])` to declare per-implementation join paths for a field returning a multi-table interface or union. The rewrite generates multi-table interface dispatch from xref:../reference/directives/discriminate.adoc[`@discriminate`] / xref:../reference/directives/discriminator.adoc[`@discriminator`] (with `@reference` for the FK-driven join) and does not need a separate per-route description. Any application is rejected at build time: + +[source,text] +---- +@multitableReference is no longer supported. Remove the directive; the rewrite generates multi-table interface dispatch from @discriminate / @discriminator without an explicit multitable-reference path. +---- + +Migration is a one-step delete-and-rebuild: drop the `@multitableReference` directive (and its `ReferencesForType` argument tree) and model the multi-table dispatch through `@discriminate` / `@discriminator`. xref:polymorphic-types.adoc[How-to: Polymorphic types] covers the supported shapes. + +== Synthesis shims: WARN today, error later + +Two paths still work in the rewrite for backwards compatibility but emit a per-occurrence WARN at build time. Plan to migrate them before the shim retirement gate fires (no committed date; tracked at `roadmap/retire-synthesis-shims.md`). + +=== Bare `id: ID!` on `@node` types + +Legacy schemas frequently relied on the generator inferring an opaque-ID carrier from a bare `ID!` field on a `@node` type. The rewrite still does this, but warns: + +[source,graphql] +---- +# Legacy form, still works, emits a WARN +type Customer implements Node @table(name: "customer") @node { + id: ID! + customerId: Int! @field(name: "CUSTOMER_ID") +} +---- + +Migration: declare xref:../reference/directives/nodeId.adoc[`@nodeId`] explicitly on the carrier: + +[source,graphql] +---- +# Canonical form, no WARN +type Customer implements Node @table(name: "customer") @node { + id: ID! @nodeId + customerId: Int! @field(name: "CUSTOMER_ID") +} +---- + +The WARN message names the field: `field 'Customer.id' synthesizes an `@nodeId` carrier without the directive; declare `@nodeId` explicitly.` It mentions the roadmap path so the team-internal trace from log line to migration ticket is one step. + +When the shim retires, the WARN flips to a classify-time rejection: the field reads as `UnclassifiedField` and the build fails with a "column 'id' could not be resolved" diagnostic. + +=== `[ID!] @field(name: "X_ID")` on `@table` input types + +Legacy `@table` input types let an `ID!` (or `[ID!]`) field carry a column name through `@field(name:)` and the FK qualifier was inferred from the catalog. The rewrite still does this, but warns. Migration: replace the `@field(name:)` annotation with an explicit xref:../reference/directives/nodeId.adoc[`@nodeId(typeName:)`]. + +Before: + +[source,graphql] +---- +# Legacy form, still works, emits a WARN +input CustomerFilter @table(name: "customer") { + customerIds: [ID!] @field(name: "CUSTOMER_ID") +} +---- + +After: + +[source,graphql] +---- +# Canonical form +input CustomerFilter @table(name: "customer") { + customerIds: [ID!] @nodeId(typeName: "Customer") +} +---- + +When the FK is ambiguous (more than one path from the input's `@table` to the target), add an explicit `@reference(path: [{key: "fk_constraint_name"}])` alongside the `@nodeId`. The xref:join-with-references.adoc[`@reference` recipe] covers the FK-disambiguation mechanics; the migration is otherwise mechanical. + +=== `@table` no longer auto-promotes to `NodeType` + +Historical only: legacy versions of the rewrite would silently promote any `@table` SDL type to `NodeType` if its backing jOOQ class carried `__NODE_TYPE_ID` / `__NODE_KEY_COLUMNS` metadata, even without `implements Node @node`. This behavior was retired (the synthesis shim plan documents the trigger: a mass typeId collision between ~200 backing types each carrying `__NODE_TYPE_ID = "195"` produced a symmetric demotion to `UnclassifiedType`). + +The current rule: a `@table` type without `implements Node @node` is a regular `TableType`, regardless of catalog metadata. If a schema relied on the auto-promotion (the type was reachable via `Query.node` or carried `@nodeId` fields), add the explicit `implements Node @node` declaration. The fields inside the type that *do* depend on node behavior (the `@nodeId` synthesis shim from the previous section) will still warn until they're explicit. + +=== `@record` is now a no-op + +Legacy schemas used `@record(record: {className: "..."})` to bind a class-backed SDL type to its Java class. The rewrite now derives that binding by reflection from the type's producer instead: for an output type, the producing field's return type (a `@service` method return, a `@tableMethod` return, or a parent-accessor chain); for an input type, the method parameter the input flows into. The directive still parses (so existing schemas keep loading), but it is ignored. + +A reachable type still carrying `@record` triggers a build WARN telling you to remove it. The WARN distinguishes three cases: + +[cols="2,3",options="header"] +|=== +| Case | Meaning +| redundant | Reflection derives the same class the directive named. Remove the directive; nothing else changes. +| shadowed by `@table` | The type also carries `@table`, which wins. Remove the `@record`. +| disagrees | Reflection's class differs from the one the directive named. Reflection wins; the directive is ignored. Remove the directive and verify the producer's type is the one you want. +|=== + +Migration is mechanical: delete the `@record(record: {...})` annotation. Make sure the type's producer (the `@service` / `@tableMethod` return, or the `@externalField` lift's `Field<...>` element type) is the Java class you intend to back the type. xref:result-types.adoc[How-to: Result-type variants] covers the reflected backing-class shapes; the `@notGenerated`-on-a-class-backed-parent row above covers the child-fetch directives that remain unchanged. + +== Deprecated arguments: phase out at your leisure + +The directives below still accept these arguments, but graphql-java surfaces a deprecation notice every time the schema is parsed, and the long-term plan is to drop them. Migrate when you next touch the directive. + +=== `connectionName:` on `@asConnection` + +[source,graphql] +---- +# Legacy override, deprecated +movies: [Movie!]! @asConnection(connectionName: "SharedMoviesConnection") +otherMovies: [Movie!]! @asConnection(connectionName: "SharedMoviesConnection") +---- + +The override coalesces multiple connection-bearing fields onto one synthesised type. The rewrite default produces one Connection type per field (`<ParentType><FieldName>Connection`); sharing a name across fields conflates distinct semantic contexts (different parents, filters, orders, cursor formats) at the type level. + +Migration: drop the argument and let each field own its synthesised connection type. The four reasons for the per-field default and the migration considerations live in xref:connections.adoc[How-to: Cursor-paginated connections] under "One field, one connection type". + +=== `name:` on `ExternalCodeReference` + +[source,graphql] +---- +# Legacy form, deprecated +@service(service: {name: "SampleQueryService", method: "filmsByService"}) +---- + +Replaced with `className:`: + +[source,graphql] +---- +# Canonical form +@service(service: {className: "no.sikt.graphitron.rewrite.test.services.SampleQueryService", method: "filmsByService"}) +---- + +`className:` is the FQCN; the legacy `name:` was a short-name resolved through the plugin's `externalReferences:` config. Both still work, but only `className:` is the canonical form going forward. The migration is mechanical: copy the FQCN from the legacy `externalReferences:` entry into `className:` and drop the entry. + +=== `@index` on enum values + +[source,graphql] +---- +# Legacy form, deprecated +enum FilmSort { + BY_TITLE @index(name: "IDX_TITLE") +} +---- + +Replaced with `@order(index:)`: + +[source,graphql] +---- +# Canonical form +enum FilmSort { + BY_TITLE @order(index: "IDX_TITLE") +} +---- + +`@order` is the unified enum-value sort surface; it accepts `index:`, `fields:`, or `primaryKey:` (exactly one). xref:sort-results.adoc[How-to: Sort results] covers the column-source choice. `@index` still works on enum values today; the deprecation notice at parse time is the migration prompt. + +== Behavior divergence: `@condition` cascade + +The rewrite intentionally diverges from the legacy generator on one semantic point. Schemas that relied on the legacy reading need to be updated; schemas that didn't (or that already wrote schemas the rewrite reads correctly) are unaffected. + +*Legacy reading.* `@condition(override: true)` on an outer field meant "outer owns everything": all inner explicit `@condition` annotations on the input's fields were *dropped*, and the outer method's predicates ran alone. + +*Rewrite reading.* `@condition(override: true)` suppresses only the implicit `column = ?` predicates the rewrite would have emitted on its own. Inner explicit `@condition` annotations *still fire*: every `@condition` you write produces SQL. + +The rewrite's reading is the intended one. Under legacy semantics, an inner `@condition` was meaningless once any ancestor used `override: true`, which made schema review brittle (an outer override silently inert-ified inner annotations). The rewrite's reading is composable: each `@condition` always fires; only the rewrite's own implicit predicates are negotiable. + +Schemas that relied on the legacy "outer owns everything" silently dropping inner conditions will produce different SQL under the rewrite. The migration is to rewrite the schema so the inner `@condition` annotations describe what should fire (instead of relying on them being ignored), or to remove them if their absence is the intent. + +The example schema's `filmsOuterOverrideTableInput` and `filmsOuterOverridePlainInput` fixtures pin the rewrite's behavior as a regression-fence. The full mechanics live in xref:condition-cascade.adoc[How-to: Stacking and overriding conditions] under "Divergence from legacy semantics". + +== Things that didn't change + +Every other directive on the legacy surface reads under the rewrite the same way, with one nuance per directive worth flagging: + +* xref:../reference/directives/table.adoc[`@table`], xref:../reference/directives/field.adoc[`@field`], xref:../reference/directives/reference.adoc[`@reference`]: unchanged; the catalog-driven mechanics are identical. +* xref:../reference/directives/service.adoc[`@service`], xref:../reference/directives/externalField.adoc[`@externalField`], xref:../reference/directives/enum.adoc[`@enum`]: unchanged surface; the only change is the `name:` → `className:` migration on `ExternalCodeReference` (above). (`@record` is the exception: it is now a no-op; see "`@record` is now a no-op" above.) +* xref:../reference/directives/discriminate.adoc[`@discriminate`] / xref:../reference/directives/discriminator.adoc[`@discriminator`]: unchanged; the rewrite generates the type resolvers and runtime dispatchers automatically (no `RuntimeWiring`-side wiring needed). +* xref:../reference/directives/asConnection.adoc[`@asConnection`]: unchanged synth-vs-declared shape; only `connectionName:` is deprecated. The rewrite emits the same Relay connection contract. +* xref:../reference/directives/orderBy.adoc[`@orderBy`], xref:../reference/directives/order.adoc[`@order`], xref:../reference/directives/defaultOrder.adoc[`@defaultOrder`]: unchanged; the rewrite recognises the same shapes. The cursor wire format is the same base64-encoded NUL-separated tuple. +* xref:../reference/directives/node.adoc[`@node`], xref:../reference/directives/nodeId.adoc[`@nodeId`]: unchanged contract; the synthesis shims (above) are the only migration work. `keyColumns:` migration semantics carry over (cursor invalidation on key changes). +* xref:../reference/directives/condition.adoc[`@condition`]: same surface; the cascade divergence (above) is the only behavior change. +* xref:../reference/directives/error.adoc[`@error`]: same handler-tuple surface; the rewrite's classify-time rejection of duplicate tuples is new. xref:error-channel.adoc[How-to: The errors channel] covers the dispatch loop and what's currently a no-op (`description:` is captured but unused). +* xref:../reference/directives/lookupKey.adoc[`@lookupKey`], xref:../reference/directives/splitQuery.adoc[`@splitQuery`]: unchanged. Mid-migration schemas that mixed `@splitQuery` with `@notGenerated` (the legacy custom-batch-fetcher pattern) need to migrate the body to `@service` (above). + +== Migration sequence + +The recommended order, from least invasive to most: + +. Run a `mvn install` to surface every `@notGenerated` rejection. Replace each with the directive named in the matrix above. The build won't compile under the rewrite until this lands. +. Audit the build log for `synthesizes an `@nodeId` carrier without the directive` WARNs; declare `@nodeId` explicitly on each. +. Audit input types for `[ID!] @field(name: "X_ID")` patterns; replace with `[ID!] @nodeId(typeName: "T")`. +. Drop `connectionName:` arguments from `@asConnection` and let each field own its connection type. +. Migrate `name:` to `className:` on `ExternalCodeReference` instances. Drop the corresponding entries from `externalReferences:` plugin config. +. Migrate `@index` to `@order(index:)` on enum values. +. If your schema uses `@condition(override: true)` with nested inputs that carry their own `@condition`, audit whether the legacy "outer owns everything" semantics were load-bearing. If they were, the SQL will change; rewrite the inner annotations to express the intended predicate set explicitly. + +Steps 1 is non-optional (the build fails). Steps 2-3 will become non-optional when the synthesis shims retire. Steps 4-6 produce deprecation notices but no failures. Step 7 only matters for schemas that relied on the divergence; most schemas don't. + +== Pitfalls + +* *`@notGenerated` is parsed but always rejected.* Removing the directive is the only fix; there is no warn-only mode and no migration shim. Schemas that still carry it will not compile. +* *Synthesis shims run silently in IDE / language server contexts.* The WARN is a build-time log line; an IDE that loads the schema for completion may not surface it. Periodically grep your build logs for `synthesizes an` to catch shim-bearing fields. +* *`@table` no longer auto-promotes to `NodeType`.* If a previously-promoted type breaks under the rewrite (typically: `Query.node` returns `null` for what used to resolve, or `@nodeId` synthesis stops firing), add `implements Node @node` to opt in explicitly. +* *Deprecated arguments still work.* The deprecation notice from graphql-java is informational, not blocking. The migration is your call until the deprecation flips to removal in a future release. +* *The `@condition` cascade divergence is a real SQL change.* Schemas that relied on legacy "outer owns everything" semantics produce different result sets under the rewrite, not different errors. Audit `override: true` sites with nested-input `@condition` annotations before promoting the rewrite to production. +* *The rewrite is directive-compatible, not field-classifier-compatible.* A schema that compiled under legacy may surface new diagnostics under the rewrite (stricter classification for shapes the legacy generator silently accepted). The diagnostic always names the field; treat each as the rewrite's stricter-shape analysis catching what legacy would have produced as a runtime error. +* *Plugin configuration migrates separately.* The schema-side migration is what this recipe covers; `<schemaInputs>`, `<outputDirectory>`, `<outputPackage>`, `<jooqPackage>`, and `<namedReferences>` on the rewrite Mojo do not have a 1:1 mapping with every legacy plugin parameter. The legacy `<maxAllowedPageSize>` was deliberately excised; xref:connections.adoc[How-to: Cursor-paginated connections] covers the alternative. + +== See also + +* xref:../reference/directives/notGenerated.adoc[`@notGenerated`] is the directive surface this recipe expands; it carries the abridged migration matrix in tabular form. +* xref:condition-cascade.adoc[How-to: Stacking and overriding conditions] covers the `@condition` cascade divergence end-to-end. +* xref:handle-services.adoc[How-to: Handle services] is the destination for most `@notGenerated` migrations on root and split-query fields. +* xref:result-types.adoc[How-to: Result-type variants] covers the class-backed-parent migration path (accessor inference vs `@sourceRow`), including the reflected backing-class shapes the retired `@record` directive used to declare. +* xref:global-id.adoc[How-to: Global object IDs] covers the `@node` / `@nodeId` declaration shapes the synthesis shims migrate to. + +xref:index.adoc[← How-to index] diff --git a/docs/manual/how-to/multi-hop-nodeid-filter.adoc b/docs/manual/how-to/multi-hop-nodeid-filter.adoc new file mode 100644 index 0000000000..2e7a17fb09 --- /dev/null +++ b/docs/manual/how-to/multi-hop-nodeid-filter.adoc @@ -0,0 +1,118 @@ += How-to: Multi-hop `@nodeId` filters +:description: Reach a related node type through one or more intermediate tables when the foreign keys carry the target node's keys positionally by SQL name. +:!toc: + +A filter input that decodes an opaque `@nodeId` of one type and applies it as a predicate against rows of a different type is the bread-and-butter shape for cross-table filtering. xref:join-with-references.adoc[`@reference`] declares the FK path; the rewrite emits a single-table predicate over the parent table's own columns whenever each FK in the chain preserves the next FK's source-side columns positionally by SQL name. This is the *identity-carrying lift* shape, and it is what this recipe covers. Multi-hop chains where some intermediate FK *translates* (drops or renames a key column the next hop needs) are deferred to a sibling Backlog item; the diagnostic at the bottom of this page tells you which case you hit. + +== Why identity-carrying + +A filter that decodes a `@nodeId(typeName: T)` and asks "which parent rows match this T?" has a natural single-table shape when the parent's own columns already carry T's identity. With a single direct FK, that property is automatic: the FK source columns are on the parent's row, so the predicate is `WHERE parent.fk_columns IN (decoded_keys)`. No JOIN, no subquery; one column tuple, one IN clause. + +The same property generalises across multiple hops, but only when each hop preserves the next hop's source-side columns by name. Concretely: walk the chain from the second hop forward; at each step, every column in `hop[i].sourceSideColumns` must appear in `hop[i-1].targetSideColumns` (case-insensitive SQL name). When that holds at every step, the terminal hop's source-side tuple lifts back through the chain, position by position, to a sub-tuple of the first hop's source-side columns: a tuple on the parent's own row, positionally aligned with T's NodeType keys. + +The emitted SQL is the same direct row predicate the single-hop case emits. Chain length is purely a classifier-time concept; the runtime touches one table. + +When the lift fails at some step, the schema is asking the runtime to walk a JOIN with translation. That shape is real but is not what the multi-hop `@nodeId` lift covers; the diagnostic names the failing step and points back to this article. + +== Worked example: a 2-hop chain + +Three tables on a `(k1, k2)` identity-carrying chain. `level_a` is the NodeType target; `level_c` is the parent shape we filter: + +[source,sql] +---- +CREATE TABLE level_a ( + k1 varchar(20) NOT NULL, + k2 varchar(20) NOT NULL, + PRIMARY KEY (k1, k2) +); +CREATE TABLE level_b ( + s varchar(20) NOT NULL, + k1 varchar(20) NOT NULL, + k2 varchar(20) NOT NULL, + PRIMARY KEY (s, k1, k2), + FOREIGN KEY (k1, k2) REFERENCES level_a (k1, k2) +); +CREATE TABLE level_c ( + c varchar(20) NOT NULL, + s varchar(20) NOT NULL, + k1 varchar(20) NOT NULL, + k2 varchar(20) NOT NULL, + PRIMARY KEY (c, s, k1, k2), + FOREIGN KEY (s, k1, k2) REFERENCES level_b (s, k1, k2) +); +---- + +Both FKs preserve the next FK's source-side columns positionally by SQL name: + +* `level_c.(s, k1, k2) -> level_b.(s, k1, k2)` carries `(s, k1, k2)` to `level_b`. +* `level_b.(k1, k2) -> level_a.(k1, k2)` consumes `(k1, k2)` of those, which were carried in. + +So `level_a`'s identity `(k1, k2)` is observable on a `level_c` row at columns `(k1, k2)` directly. + +The schema declaration: + +[source,graphql] +---- +type LevelA implements Node @table(name: "level_a") @node { + id: ID! +} + +input LevelCFilterInput @table(name: "level_c") { + levelAIds: [ID!] @nodeId(typeName: "LevelA") @reference(path: [ + {key: "level_c_level_b_fk"}, + {key: "level_b_level_a_fk"} + ]) +} + +extend type Query { + levelCs(filter: LevelCFilterInput): [LevelC!]! +} +---- + +The classifier walks the chain, verifies the lift predicate at each adjacent pair, computes the lifted tuple, and stores it on the carrier. The emitter reads the lifted tuple directly. The generated SQL is `... WHERE row(level_c.k1, level_c.k2) IN ((decoded_k1, decoded_k2), ...)` over a single-table FROM clause. + +== Multi-hop is always explicit + +The auto-discovery fallback that lets you omit `@reference` when there is exactly one FK between two tables stays single-hop. Multi-hop chains must be declared explicitly with one `{ key: ... }` element per hop. Disambiguation among `A -> ? -> C` paths is the author's responsibility; the classifier never searches past one hop. + +This keeps the auto-discovery path the same shape as today and pins the multi-hop opt-in to the SDL surface where the chain is visible at review time. + +== Rejection messages + +[#lift-failure] +=== `identity-carrying FKs` + +The lift predicate failed at some step of the chain. The message names the failing hop, the FK constraint, the source-side columns that were not carried, and the previous hop's target-side columns for comparison: + +[source] +---- +@reference path on @nodeId leaf '<leafName>': hop <i> ('<fkName>') introduces a column translation +— its source-side columns [<sql-names>] are not a positional subset of the previous hop's +target-side columns [<sql-names>] by SQL name. Multi-hop @reference on @nodeId currently requires +identity-carrying FKs at every step (the predicate compiles to a single-table SELECT). See +docs/manual/how-to/multi-hop-nodeid-filter.adoc for the mental model and rejection-messages section. +---- + +What to change: + +* Confirm that each step's source-side columns appear by name in the previous hop's target-side columns. The "Worked example" section walks an identity-carrying chain you can compare against. +* If the schema genuinely needs translation in the middle of the chain (a renamed FK column, or an alternate-key target), the multi-hop EXISTS-subquery emission is the right fit, but it is not yet shipping. Keep the directive in the form you want and watch for the sibling Backlog item that adds the deferred path. + +[#condition-step] +=== `must be a foreign key` + +A `{ condition: ... }` step appeared inside a multi-hop `@nodeId` `@reference` path. Every step in a multi-hop chain must be a `JoinStep.FkJoin`; condition-only steps are rejected with: + +[source] +---- +@reference path on @nodeId leaf '<leafName>': step <i> is a condition step; every step in a +multi-hop @nodeId path must be a foreign key (use { key: ... } at every position). +---- + +What to change: replace the `{ condition: ... }` with a `{ key: <fk-name> }` step. If the predicate that the `condition:` was expressing genuinely belongs in the chain, lift it to the surrounding query's `@condition` arm rather than embedding it in the `@nodeId` filter path. + +== Related + +* xref:join-with-references.adoc[How-to: Join with references] covers the directive surface for non-`@nodeId` `@reference` paths. +* xref:global-id.adoc[How-to: Global object IDs] covers the wire format for `@nodeId` end-to-end. +* xref:add-custom-conditions.adoc[How-to: Add custom conditions] is the right home for predicates that translate or join with non-FK semantics. diff --git a/docs/manual/how-to/polymorphic-types.adoc b/docs/manual/how-to/polymorphic-types.adoc new file mode 100644 index 0000000000..84081eff1b --- /dev/null +++ b/docs/manual/how-to/polymorphic-types.adoc @@ -0,0 +1,132 @@ += How-to: Polymorphic types +:description: Map GraphQL interfaces and unions onto single-table or multi-table layouts, with discriminator-value pitfalls and the pagination contract. +:!toc: + +GraphQL gives you two ways to spell "this field returns one of several object types": an `interface` whose implementers each `implements` it, and a `union` that lists member types. Graphitron supports both and projects each onto one of two layouts. *Single-table* polymorphism: every subtype shares one jOOQ table, and a discriminator column says which row belongs to which subtype. *Multi-table* polymorphism: each subtype has its own table, and the generator stitches results together with a two-stage `UNION ALL` fetcher. Pick by where the rows actually live; the directives follow from that choice. + +== Choose the layout + +Single-table fits when the rows literally share a table and a column tells you the subtype. The classic shape is an `entity_type` discriminator with subtype-specific columns nullable on the rows that don't use them. One `SELECT` against the shared table covers every subtype; row-mapping branches at the discriminator value. + +Multi-table fits when subtypes are stored in *different* tables (heterogeneous shape, separate PKs, separate indexes). There is no shared discriminator column to pivot on; the generator emits a stage-1 narrow `UNION ALL` projecting `(__typename, __pk__, __sort__)` across the participants and a stage-2 per-typename batched lookup that hydrates each branch's full row. + +The two layouts are not mutually exclusive across a schema: a single GraphQL schema can carry single-table interfaces (e.g. `Content`) and multi-table interfaces (e.g. `Searchable`) side by side. Each interface or union picks its own layout independently of the others. + +== Single-table: `@discriminate` + `@discriminator` + +The interface carries xref:../reference/directives/table.adoc[`@table`] (the shared table) and xref:../reference/directives/discriminate.adoc[`@discriminate(on:)`] (the column that selects the subtype). Each implementer carries the same xref:../reference/directives/table.adoc[`@table`] and xref:../reference/directives/discriminator.adoc[`@discriminator(value:)`] pinned to the column's literal value: + +[source,graphql] +---- +interface Content @table(name: "content") @discriminate(on: "CONTENT_TYPE") { + contentId: Int! @field(name: "CONTENT_ID") + title: String! @field(name: "TITLE") +} + +type FilmContent implements Content @table(name: "content") @discriminator(value: "FILM") { + contentId: Int! @field(name: "CONTENT_ID") + title: String! @field(name: "TITLE") + length: Int @field(name: "LENGTH") + rating: MpaaRating @reference(path: [{key: "content_film_id_fkey"}]) @field(name: "RATING") +} + +type ShortContent implements Content @table(name: "content") @discriminator(value: "SHORT") { + contentId: Int! @field(name: "CONTENT_ID") + title: String! @field(name: "TITLE") + description: String @field(name: "SHORT_DESCRIPTION") +} +---- + +A query selecting `... on FilmContent { length }` and `... on ShortContent { description }` produces one `SELECT content.content_id, content.title, content.length, content.short_description, content.content_type FROM content`. The row mapper inspects `content_type` per row and dispatches to the matching type. Subtype-specific fields are read from the unified projection as nullable; the row mapper ignores them on the wrong branch. + +Subtype-only fields can still pull from joined tables. `FilmContent.rating` reaches into `film` via `content_film_id_fkey`; the generator emits a conditional `LEFT JOIN` gated by `content_type = 'FILM'`, so non-`FILM` rows never trigger the join. + +== Multi-table: omit `@discriminate` + +When the implementers live on different tables, drop `@discriminate` from the interface (or use a union, which never carries one). The interface itself stays unbound; it carries no xref:../reference/directives/table.adoc[`@table`], because there is no shared backing storage: + +[source,graphql] +---- +interface Searchable { + name: String! +} + +type Film implements Searchable @table(name: "film") { + name: String! @field(name: "TITLE") + # ... +} + +type Actor implements Searchable @table(name: "actor") { + name: String! @field(name: "FIRST_NAME") + # ... +} + +union Document = Film | Actor +---- + +The interface field `name` is synthetic on the GraphQL side; each implementer remaps its own meaningful column to it via xref:../reference/directives/field.adoc[`@field(name:)`]. The union form `Document = Film | Actor` produces the same fetcher path as the interface form; the generator's `MultiTablePolymorphicEmitter` is shared between them. + +At request time the rewrite emits a two-stage fetcher. Stage 1 is a narrow `UNION ALL` projecting `(__typename, __pk__, __sort__)` per branch; stage 2 dispatches per typename to a batched lookup that hydrates the full row. The records carry `__typename` so the GraphQL `TypeResolver` routes per row without a discriminator column. + +== Polymorphic child fields + +A polymorphic interface or union can be the return type of a child field, not just a root query. Two shapes are common. + +*Auto-discovered per-branch FK back to the parent.* If each implementer has exactly one FK back to the parent table, the rewrite infers the per-branch `WHERE` clause without any `@reference` on the child field: + +[source,graphql] +---- +type Address @table(name: "address") { + addressId: Int! @field(name: "ADDRESS_ID") + occupants: [AddressOccupant!]! +} + +union AddressOccupant = Customer | Staff +---- + +Both `customer.address_id` and `staff.address_id` FK back to `address.address_id`, so the multi-table polymorphic emitter projects per-branch `WHERE customer.address_id = parent.address_id` and `WHERE staff.address_id = parent.address_id` in stage 1's narrow `UNION ALL`. No directive is needed on `Address.occupants`. + +*FK chain to a single-table interface.* If the field returns a single-table polymorphic interface reached through one FK chain, use a regular xref:../reference/directives/reference.adoc[`@reference`]: + +[source,graphql] +---- +type Film @table(name: "film") { + filmContent: Content @reference(path: [{key: "content_film_id_fkey"}]) +} +---- + +`content.film_id` FKs back to `film.film_id`; the per-parent fetcher conditions on the FK and projects `CONTENT_TYPE` so the row mapper still routes per row. + +== Pagination across polymorphism + +Both layouts compose with xref:../reference/directives/asConnection.adoc[`@asConnection`]. For multi-table polymorphism the connection emitter wraps the per-branch `UNION ALL` in a derived table so `.seek/.limit` and cursor encoding apply uniformly across the union; per-typename stage 2 additionally projects `__sort__` so cursor decoding can read it back per edge. Composite-PK participants project `DSL.jsonbArray(k1, k2)` as the synthetic `__sort__` column, typed as JSONB so PostgreSQL's lexicographic ordering reproduces the multi-column ordering. + +For single-table polymorphism, pagination works the same way as for non-polymorphic `@table` fields: the discriminator column is just another projected column, and the row mapper still branches per row. The connection's order-by and cursor contract are unchanged. + +== Discriminator-value pitfalls + +Single-table layouts hinge on the literal database value matching xref:../reference/directives/discriminator.adoc[`@discriminator(value:)`] verbatim. Common gotchas: + +* *Case sensitivity.* `value: "FILM"` does not match a stored `'film'`. Match the column's storage exactly. +* *Whitespace.* Trailing spaces on `CHAR(N)` columns are part of the stored value. Either trim at write time or include the padding in the `value:`. +* *Duplicate values.* Two implementers with the same `value:` collapse to one branch; the second is unreachable. The build does not currently reject this, so audit for it. +* *Unknown values.* A row whose discriminator column carries a value no implementer claims fails to map and surfaces as a runtime error. Either backfill the column or add an implementer. +* *Mixing tables.* Every implementer must declare the interface's `@table`. An implementer on a different table is rejected at classify time; for cross-table layouts, omit `@discriminate` and use the multi-table fetcher instead. +* *Missing column.* `@discriminate(on:)` must name a real column on the shared table. The build fails to resolve if it does not exist. + +== Constraints + +* The single-table layout requires every implementer to share the interface's xref:../reference/directives/table.adoc[`@table`]. Mixing tables breaks the contract. +* The multi-table layout requires that each implementer be xref:../reference/directives/table.adoc[`@table`]-bound; the interface or union itself is not. +* Subtype-specific fields on a single-table interface may pull from joined tables via xref:../reference/directives/reference.adoc[`@reference`]; the generator emits a conditional `LEFT JOIN` gated by the discriminator value. +* Auto-discovered per-branch FK paths (the `AddressOccupant` shape) are the supported multi-table-child idiom. The legacy `@multitableReference` directive is rejected; see xref:../reference/directives/multitableReference.adoc[`@multitableReference`]. +* For composite-PK multi-table polymorphism with xref:../reference/directives/asConnection.adoc[`@asConnection`], all participating tables must share the same composite-PK shape; the polymorphic emitter projects a single typed `__sort__` column across the branches. + +== See also + +* xref:../reference/directives/discriminate.adoc[`@discriminate`] declares the interface or union's discriminator column. +* xref:../reference/directives/discriminator.adoc[`@discriminator`] pins each implementer to a value. +* xref:../reference/directives/reference.adoc[`@reference`] for cross-table joins on subtype-specific fields and for FK-chain access to single-table polymorphic interfaces. +* xref:../reference/directives/asConnection.adoc[`@asConnection`] for cursor pagination across either layout. + +xref:index.adoc[← How-to index] diff --git a/docs/manual/how-to/result-types.adoc b/docs/manual/how-to/result-types.adoc new file mode 100644 index 0000000000..fe39df64e7 --- /dev/null +++ b/docs/manual/how-to/result-types.adoc @@ -0,0 +1,158 @@ += How-to: Result-type variants +:description: Understand which backing class the rewrite reflects from a class-backed type's producer (jOOQ TableRecord, jOOQ Record, Java record, or POJO), and let accessor inference batch the children when the catalog can't. +:!toc: + +A class-backed GraphQL output or input type is bound to an existing Java class. The binding is derived by reflection from the type's producer: for an output type, the producing field's return type (a `@service` method return or a parent-accessor chain); for an input type, the method parameter the input flows into. The reflected class's shape determines which sealed result-type variant the rewrite picks and, for child `@table` fields on free-form parents, whether the classifier can auto-derive a batch key from a typed accessor. This recipe walks the decision tree and the operational consequences for each variant. + +== The four output variants + +The sealed `GraphitronType.ResultType` hierarchy has four permits (`GraphitronType.java:89-141`). The classifier picks among them by reflecting on the backing class the producer yields (`TypeBuilder.buildResultType:513-546`): + +* *`JooqTableRecordType`*: backing class extends `org.jooq.TableRecord`. The catalog supplies FK metadata; child `@table` fields use xref:../reference/directives/reference.adoc[`@reference`] paths driven by the catalog, and `@sourceRow` is rejected (the path is already known). +* *`JooqRecordType`*: backing class extends `org.jooq.Record` but not `TableRecord`. Same FK availability as table-records via the carried row type; the variant exists because a generic `Record` isn't bound to one canonical table. +* *`JavaRecordType`*: backing class is a Java `record` (`cls.isRecord()`). The catalog has no FK metadata for the hand-written class. Child `@table` fields fall back to either accessor inference (a record component returning a typed jOOQ `TableRecord`) or `@sourceRow`. +* *`PojoResultType`*: anything else (plain POJO, DTO, hand-rolled class with setters). Same accessor-vs-lifter contract as `JavaRecordType`. + +The classification check order is `isRecord` → `TableRecord` → `Record` → fallback to `PojoResultType`. `TableRecord` is checked before `Record` because every `TableRecord` is also a `Record`; the more specific match wins. + +Input-side class-backed types follow the same shape with parallel permits on `InputType` (`GraphitronType.java:282-340`): `JavaRecordInputType`, `PojoInputType`, `JooqRecordInputType`, `JooqTableRecordInputType`. The backing class is reflected from the `@service` / `@condition` / `@tableMethod` method parameter the input flows into. The Maven plugin can scaffold a Java record matching the input's field shape; binding flows through setters or the canonical constructor. + +== jOOQ-record parents: catalog drives everything + +When the parent is a `JooqTableRecordType`, child `@table` fields traverse via xref:../reference/directives/reference.adoc[`@reference`] paths the catalog already knows about. The example schema's `FilmDetails` is the canonical shape; its producer's return type reflects to the jOOQ `FilmRecord`: + +[source,graphql] +---- +# backed by no.sikt.graphitron.rewrite.test.jooq.tables.records.FilmRecord, reflected from its producing field's return type +type FilmDetails { + title: String! @field(name: "title") + language: [Language!]! @reference(path: [{key: "film_language_id_fkey"}]) +} +---- + +Because `FilmRecord` is a jOOQ `TableRecord`, the rewrite reads `film_language_id_fkey` from the catalog and emits a column-keyed DataLoader for the `language` child. `@sourceRow` would be redundant here and is rejected at classify time. xref:split-vs-inline.adoc[`@splitQuery`] is also unnecessary on these fields: `classifyChildFieldOnResultType` never inspects it on record-parent table-bound fields, which are DataLoader-batched unconditionally. + +Smallest jOOQ-record fixture: `FilmCard` (backed by `FilmRecord`, reflected from its producer) with a single scalar projection `filmId: Int @field(name: "film_id")`. Read-paths into and out of `FilmCard` flow through `FilmRecord` instances; only the PK is set when the parent is constructed via xref:../reference/directives/externalField.adoc[`@externalField`]'s `Field<FilmRecord>` shape, and other columns are batch-fetched on demand. + +== Accessor inference on free-form parents + +When the parent is a `JavaRecordType` or `PojoResultType` and a child returns a `@table` type, the classifier introspects the backing class for a *typed accessor*: an instance method that takes no arguments and returns either a jOOQ `TableRecord` subclass (single-cardinality) or a `List<TableRecord>` / `Set<TableRecord>` (list-cardinality), where the `TableRecord` element type matches the child field's `@table` return (`FieldBuilder.deriveBatchKeyFromTypedAccessor:2817-2934`). + +Matching rules: + +* Instance method only — no static, bridge, or synthetic. +* Zero parameters. +* Method name matches the GraphQL field name as `fieldName`, `getFieldName`, or `isFieldName`. +* Return type peels through `List<...>` / `Set<...>` (for list cardinality) and the element type must be assignable to the child's `@table` return's record class. +* Cardinality alignment: list child needs list/set accessor (`AccessorKeyedMany`); single child needs single-record accessor (`AccessorKeyedSingle`). + +When all four hold, the classifier emits `BatchKey.AccessorKeyedSingle` or `BatchKey.AccessorKeyedMany`, the generator wires `loader.load(key)` or `loader.loadMany(keys)` against the element table's PK, and no directive on the child is needed. + +The example schema's `CreateFilmsPayload` exercises the `Many` shape. Its `@service` producer returns the backing class, so reflection binds it: + +[source,graphql] +---- +# backed by no.sikt.graphitron.rewrite.test.services.CreateFilmsPayload via its @service producer's return type +type CreateFilmsPayload { + films: [Film!]! +} +---- + +Backing class: + +[source,java] +---- +public record CreateFilmsPayload(List<FilmRecord> films) {} +---- + +The canonical record-component accessor `films(): List<FilmRecord>` is what the classifier picks up. No `@sourceRow`, no `@reference`; per request the framework gathers all parents' film keys and dispatches one batched lookup keyed on `film.film_id`. + +The `Single` shape lives at `FilmCardWrapper`: + +[source,graphql] +---- +# backed by no.sikt.graphitron.rewrite.test.services.FilmCardData, reflected from its producing field's return type +type FilmCardWrapper { + film: Film +} +---- + +[source,java] +---- +public record FilmCardData(FilmRecord film) {} +---- + +The `film()` accessor returns one `FilmRecord` matching the child field's `Film` table. The classifier emits `AccessorKeyedSingle`; per request, all parents' single keys batch through `loader.load`, returning one `Film` row per distinct PK. + +== When to reach for `@sourceRow` + +Accessor inference works only when the backing class already carries a typed jOOQ record. If the parent only has the FK column as a primitive scalar (e.g., `Integer languageId` rather than `LanguageRecord language`), there is nothing for the classifier to reflect on and accessor inference fails. That's the `@sourceRow` case. + +The example schema's `CreateFilmPayload` is the canonical shape; its `@service` producer returns the backing class: + +[source,graphql] +---- +# backed by no.sikt.graphitron.rewrite.test.services.CreateFilmPayload via its @service producer's return type +type CreateFilmPayload { + languageId: Int! + language: [Language!]! + @sourceRow( + className: "no.sikt.graphitron.rewrite.test.services.CreateFilmPayloadLifter", + method: "liftLanguageId" + ) +} +---- + +Backing class and lifter: + +[source,java] +---- +public record CreateFilmPayload(Integer languageId) {} + +public final class CreateFilmPayloadLifter { + public static Row1<Integer> liftLanguageId(CreateFilmPayload p) { + return DSL.row(p.languageId()); + } +} +---- + +Per request the framework calls `liftLanguageId` once per parent, gathers the resulting `Row1<Integer>` keys, and dispatches a single `language_id IN (...)` batch. The lifter's `Row1<Integer>` matches the leaf table's primary key (`language.language_id`) by default; the per-position Java type is checked against the column's column class at build time. + +For multi-hop paths, compose with xref:join-with-references.adoc[`@reference`]: the lifter's `RowN` then matches the first FK hop's source-side columns rather than the leaf PK. Multi-column lifts use `Row2..RowN` (`ValuesJoinRowBuilder.MAX_ARITY = 22` is the upper bound). A mismatch between the lifter's arity and the derived parent-side tuple fails the build with the offending arity in the message. + +== Diagnostic when neither path is available + +A bare child `@table` reference on a `JavaRecordType` or `PojoResultType` parent — no accessor matching the field name, no `@sourceRow` — fails classification with: + +[quote] +on a free-form DTO parent requires a typed accessor or @sourceRow to lift the batch key; the catalog has no FK metadata for the parent class. Either expose a typed accessor on the parent returning `List<...Record>`, `Set<...Record>`, or `...Record` (where `...Record` is the element type's jOOQ TableRecord); or add `@sourceRow(className: ..., method: ...)` optionally composed with `@reference`; or back the parent with a typed jOOQ TableRecord so the FK can be derived. + +(`FieldBuilder.java:2765`.) + +The diagnostic is the entry point to the decision tree: pick whichever route fits the parent's shape best. If the backing class already carries a typed `TableRecord` (or `List<TableRecord>`), expose it as a public accessor matching the child field's name and inference takes over. If the parent only carries scalar FK columns, write a `@sourceRow`. If the parent is genuinely table-backed, add xref:../reference/directives/table.adoc[`@table`] so the type is table-bound and let the catalog drive the path. + +== Picking a variant: a quick decision tree + +The producer's return type determines the backing class. The only authoring choice is whether the type is table-bound or class-backed: add xref:../reference/directives/table.adoc[`@table`] if the type *is* a jOOQ table, otherwise leave it class-backed and the rewrite reflects the producer's return type to pick the variant. + +* *Is the type already a jOOQ table?* Add xref:../reference/directives/table.adoc[`@table`]. Catalog-driven joins and column projection apply directly; you avoid the per-field lifting question. +* *Is the type a hand-rolled wrapper around one or more jOOQ records?* Leave it class-backed; the producer returns the wrapper class. The classifier picks `JooqTableRecordType` (if the class extends `TableRecord`), `JooqRecordType` (generic `Record`), or `JavaRecordType` / `PojoResultType` for hand-rolled classes; child `@table` fields use accessor inference when the wrapper exposes typed accessors. +* *Is the type a service-result DTO with only scalar fields?* Leave it class-backed (the producer returns the DTO), plus `@sourceRow` on each child `@table` field. The lifter extracts the FK column(s) the DTO carries and feeds them into the batched join. +* *Mixing the two on the same parent?* Yes; different children can mix accessor inference and `@sourceRow` on the same parent class, because the per-field classification runs once per child. The same backing class can carry typed accessors for some fields and primitive scalars (lifted into batch keys) for others. + +== Constraints and gotchas + +* *Table-bound and class-backed are exclusive on an output type.* The type is either jOOQ-table-bound (`TableType`, via `@table`) or backed by a Java class reflected from its producer (`ResultType`). On *input* types, `@table` wins over a reflected class binding: when both apply, a build warning names the conflict. +* *`@sourceRow` is rejected on `JooqTableRecordType` and `JooqRecordType` parents.* The catalog already supplies the path; use `@reference`. The diagnostic names the directive that's redundant. +* *Accessor inference rejects bridge and synthetic methods.* If a backing class has a generic-typed accessor that the compiler erases through a bridge method, the bridge is filtered out before name matching. The user-visible accessor (the canonical declared method) is what the classifier sees. +* *`@splitQuery` on record-parent table-bound fields is redundant but not rejected.* `classifyChildFieldOnResultType` never inspects the directive on these fields; record-parent children are DataLoader-batched unconditionally. +* *Service methods returning a class-backed type feed straight into the resolver.* The xref:../reference/directives/service.adoc[`@service`] return type *is* the binding, and the framework projects through it without an extra round trip. + +== See also + +* xref:../reference/directives/reference.adoc[`@reference`] is the catalog-driven counterpart on `@table` and jOOQ-record parents. +* xref:../reference/directives/table.adoc[`@table`] is the catalog-bound alternative when the type *is* the table. +* xref:external-code.adoc[How-to: Wire external Java code] covers the broader `@service` integration patterns. +* xref:split-vs-inline.adoc[How-to: When to split queries] covers the inline-vs-split distinction; record-parent children sit in the always-batched path and are exempt from the inline shape. + +xref:index.adoc[← How-to index] diff --git a/docs/manual/how-to/sort-results.adoc b/docs/manual/how-to/sort-results.adoc new file mode 100644 index 0000000000..02f112c191 --- /dev/null +++ b/docs/manual/how-to/sort-results.adoc @@ -0,0 +1,151 @@ += How-to: Sort results +:description: Pick a sort source, give clients dynamic ordering, build a stable keyset cursor, and avoid the common pagination pitfalls. +:!toc: + +Three directives carry the sort surface: xref:../reference/directives/defaultOrder.adoc[`@defaultOrder`] sets a static fallback on a field, xref:../reference/directives/orderBy.adoc[`@orderBy`] takes a runtime argument, and xref:../reference/directives/order.adoc[`@order`] attaches a sort spec to each value of the bound enum. All three share the same column-source shape: exactly one of `index:`, `fields:`, or `primaryKey:`. This recipe covers picking among them, mixing static and dynamic ordering on the same field, cursor stability under pagination, and the collation and tie-breaker pitfalls that bite at scale. + +== Pick the column source + +The three column sources are mutually exclusive on any one directive site; the build rejects setting two or none. Pick by which kind of identity the sort needs: + +* *`primaryKey: true`* when the order is "stable, in declaration order". This is the default for any paginated `@table` field that omits `@defaultOrder`, so most fields do not need to spell it out. Spell it out explicitly when you want the intent to survive a refactor that adds `@orderBy`. +* *`fields:`* when the order is "by these named columns, in this order". Optional `collate:` per column. The columns resolve against the *return-type's* `@table`, not the parent's. +* *`index:`* when an existing database index already projects the right column list (often a multi-column index that pairs the sort key with frequently-filtered columns). Requires `<includeIndexes>true</includeIndexes>` on the jOOQ generator; otherwise the catalog lookup throws "no matching index" at startup. + +A field-based order with a tie-breaker on the PK is the safe default for "humans want this column": + +[source,graphql] +---- +type Query { + customers: [Customer!]! @asConnection + @defaultOrder(fields: [ + {name: "LAST_NAME", collate: "case_insensitive"}, + {name: "FIRST_NAME", collate: "case_insensitive"}, + {name: "CUSTOMER_ID"} + ]) +} +---- + +`CUSTOMER_ID` at the end pins the cursor onto a unique key so two rows with identical `(last_name, first_name)` pages deterministically. Without it, the cursor will jitter between two rows that compare equal on every preceding column. The rewrite does *not* auto-append a PK tie-breaker; it is a schema-author responsibility. + +== Static order: `@defaultOrder` + +xref:../reference/directives/defaultOrder.adoc[`@defaultOrder`] is the field-level "this is how this list comes back when nobody asks otherwise". Every example-schema connection field uses it: + +[source,graphql] +---- +type Query { + stores: [Store!]! @asConnection @defaultOrder(primaryKey: true) + filmsConnection( + first: Int, last: Int, after: String, before: String + ): FilmsConnection! @defaultOrder(primaryKey: true) +} +---- + +The `direction:` argument is global across the spec: every column in the list sorts the same way. There is no per-column direction surface on `@defaultOrder` itself; if your design needs per-column direction (e.g. `LAST_NAME ASC, RECENT_LOGIN DESC`), you have already crossed into "this should be a client choice", and the right tool is `@orderBy` (each row of the input list carries its own `SortDirection`). + +`@defaultOrder` is *required* on xref:../reference/directives/asConnection.adoc[`@asConnection`] fields that don't carry `@orderBy`; keyset pagination has no anchor without one and the build fails. Connections that only accept dynamic order (`@orderBy` with no fallback) are not a supported shape; supply `@defaultOrder` as the fallback for the no-argument case. + +== Dynamic order: `@orderBy` and `@order` + +xref:../reference/directives/orderBy.adoc[`@orderBy`] activates a runtime argument whose input type binds two fields by *type*, not by name: one `SortDirection` enum (the project's, declared once and reused) and one enum whose values carry xref:../reference/directives/order.adoc[`@order`]. The example schema exposes the dynamic shape on `filmsOrderedConnection`: + +[source,graphql] +---- +type Query { + filmsOrderedConnection( + rating: MpaaRating @field(name: "RATING"), + order: [FilmOrderBy] @orderBy, + first: Int, last: Int, after: String, before: String + ): FilmsConnection! @defaultOrder(primaryKey: true) +} + +input FilmOrderBy { + field: FilmSort! + direction: SortDirection +} + +enum FilmSort { + FILM_ID @order(primaryKey: true) + TITLE @order(fields: [{name: "title"}]) +} + +enum SortDirection { ASC, DESC } +---- + +A request asking `order: [{ field: TITLE, direction: ASC }, { field: FILM_ID, direction: ASC }]` sorts by `title` then `film_id`; the rewrite emits a per-element `case "TITLE" -> ... case "FILM_ID" -> ...` switch in the generated `<fieldName>OrderBy(env, srcAlias)` helper, building a `List<SortField<?>>` plus a parallel `List<Field<?>>` of the same columns for cursor encoding. + +The list shape `[FilmOrderBy]` lets clients compose multi-key orderings; a singular `FilmOrderBy` argument also works when only one column is ever needed. Either way the cursor binds onto whichever ordering was active for that request. + +When `@orderBy` and `@defaultOrder` coexist on the same field, the dynamic argument wins when the client supplies it; `@defaultOrder` fills in when the argument is null or absent. This is why the example field has both: `filmsOrderedConnection` falls back to PK order when `order:` is not supplied, and uses the client's order when it is. + +== Stable cursors and tie-breakers + +xref:../reference/directives/asConnection.adoc[`@asConnection`] emits keyset pagination using the active order. The cursor is a base64-encoded NUL-separated tuple of the sort columns' values for the last row of the page; jOOQ's `.seek(Field<?>...)` consumes the decoded values. Two consequences: + +. *The order columns are part of the cursor's wire bytes.* Adding a column to `@defaultOrder` or to an `@order` enum value invalidates cursors clients have already issued. New cursors decode against the new column list; old cursors decode the wrong number of values and the request fails. Treat the column list and order as part of the public cursor contract. +. *Determinism gates "the next page is always the next page".* If two rows compare equal on every order column, the seek can step over either. A field-based order without a tie-breaker on a unique key is unstable: identical-name rows shuffle between pages on retries, and a row can appear twice or be skipped. The rewrite does not synthesise a tie-breaker; append the PK explicitly to every non-PK order, on both `@defaultOrder` and per-`@order` enum values. + +Backward pagination (`last:`/`before:`) reuses the same cursor encoding; the rewrite reverses each `SortField`'s direction via jOOQ's `$field()`/`$sortOrder()` model API, runs the seek, and returns rows in the original order. This means a cursor issued from a `first:` page round-trips correctly through a `before:` request and vice versa, without any per-direction encoding split. + +== Collation pitfalls + +`fields[].collate:` is passed verbatim to the database. PostgreSQL applies the collation per column at sort time: + +[source,graphql] +---- +enum PersonOrderByField { + NAME_NORSK @order(fields: [ + {name: "LAST_NAME", collate: "xdanish_ai"}, + {name: "FIRST_NAME", collate: "xdanish_ai"} + ]) +} +---- + +Three things to know before reaching for collation: + +* *Misspelled collations surface only at query time*, not at build time. The catalog does not validate collation names. A typo emits valid SQL that the database rejects when the request runs. +* *Indexes follow collations.* An index built without `COLLATE "xdanish_ai"` will not be used for an ordering that names that collation; the planner falls back to a sort. Either build the index with the matching collation or accept the per-page sort cost. +* *Cursor stability survives collation changes only if both ends agree.* If a database upgrade reweights `case_insensitive`'s tertiary tiebreak, cursors issued before the upgrade may decode to a position that no longer corresponds to the same row. This is rare and database-specific; the recipe is "treat collation changes as a hard cursor cut", same as `keyColumns` in xref:global-id.adoc[`@node`]. + +== Index-based sorting + +`@order(index: "IDX_TITLE")` and `@defaultOrder(index: "IDX_TITLE")` reuse a database index's column list as the sort spec. The lookup happens at build time against the jOOQ-generated catalog, so the column list is fixed at generator time and stays in sync with the schema migration that created the index. + +Use indexed orders when: + +* The index already exists for query-planner reasons (it pairs the sort columns with the most common filter columns) and you want the GraphQL order to ride on the same column list. Single source of truth for "what's the canonical order for this list". +* The index encodes a multi-column order that would be tedious to maintain twice (in DDL and in a `fields:` list). + +Avoid them when: + +* The index might be dropped, renamed, or rebuilt with a different column list during operations. The build resolves the index name at generator time; a subsequent DDL change that drops the index makes the next build fail with "no matching index". For volatile indexes, prefer `fields:`. +* `<includeIndexes>true</includeIndexes>` is not enabled on the jOOQ generator. The catalog lookup returns nothing in that case and the directive cannot resolve. + +== Sort across polymorphism + +For xref:polymorphic-types.adoc[multi-table polymorphic] connections, the rewrite emits a single typed `__sort__` column per branch in the stage-1 `UNION ALL`, projected as JSONB for composite-PK participants. This means *every participating table must agree on the order's shape*: same column count, same types, same effective collation. The `MultiTablePolymorphicEmitter` projects one `__sort__` value per branch in stage 1, and the connection emitter sorts and seeks on that single column at the union level. Mixing a `(LAST_NAME, FIRST_NAME)` ordering for `Customer` with a `(FIRST_NAME, LAST_NAME)` ordering for `Staff` does not compose; pick one shared order, or run two separate connections. + +For single-table polymorphism, ordering is unchanged from the non-polymorphic case: the discriminator column is just another projected column, and the sort spec applies to the shared backing table. + +== Constraints and pitfalls + +* Exactly one of `index:`, `fields:`, or `primaryKey:` per `@order` value and per `@defaultOrder` directive. Multiple or none fails the build. +* `@orderBy` argument input types bind by *type*, not by name. The input must contain exactly one `SortDirection`-typed field and exactly one `@order`-bearing enum field. Field names are free. +* Every value of an `@orderBy`-bound enum must declare a sort spec. Missing values fail the build with a per-value diagnostic. +* `@defaultOrder.direction:` is global across the spec; per-column direction is only available through `@orderBy` (each list element carries its own `SortDirection`). +* Cursor wire format embeds the active order's columns. Adding, removing, or reordering columns in `@defaultOrder` or in an `@order` enum value invalidates outstanding cursors. +* The rewrite does not auto-append a PK tie-breaker on non-PK orders. Append the PK explicitly; otherwise keyset pagination is non-deterministic on equal-key rows. +* `index:` requires jOOQ index generation. With it disabled, the lookup yields no columns and the directive fails to resolve. +* `fields[].name` resolves against the field's return-type `@table`, not the parent's. Case-sensitive against the jOOQ-generated identifiers. +* `collate:` is unvalidated at build time; misspellings surface as runtime database errors. + +== See also + +* xref:../reference/directives/defaultOrder.adoc[`@defaultOrder`] sets the static order on a field. +* xref:../reference/directives/orderBy.adoc[`@orderBy`] activates a runtime argument. +* xref:../reference/directives/order.adoc[`@order`] attaches a sort spec to each enum value. +* xref:../reference/directives/asConnection.adoc[`@asConnection`] is the cursor-pagination wrapper that consumes the resolved order. +* xref:connections.adoc[How-to: Cursor-paginated connections] covers the one-field-one-connection rule, `totalCount` performance, and what the rewrite does about page-size caps. + +xref:index.adoc[← How-to index] diff --git a/docs/manual/how-to/split-vs-inline.adoc b/docs/manual/how-to/split-vs-inline.adoc new file mode 100644 index 0000000000..95e444c3b2 --- /dev/null +++ b/docs/manual/how-to/split-vs-inline.adoc @@ -0,0 +1,84 @@ += How-to: When to split queries +:description: Choose between inline correlated subqueries and DataLoader-batched split fetches based on round-trip cost, fan-out shape, and per-parent semantics. +:!toc: + +xref:../reference/directives/splitQuery.adoc[`@splitQuery`] turns a child field into a `DataLoader`-batched fetch instead of an inline correlated subquery. The reference page lists the canonical shapes and the classifier rejections; this recipe addresses the operational question the directive raises: when to inline (default), when to split, and what the DataLoader's caching contract actually looks like. + +== Two emission shapes + +The classifier picks between two emission shapes for an `@reference`-pathed `@table`-typed child: + +* *Inline (default).* The field's child SELECT is embedded into the parent's SELECT as a `DSL.multiset(...)` correlated subquery. One round trip per request; the join travels to the database, no Java-side fan-out. The parent's `$fields()` method drops the `multiset(SELECT child_cols FROM child JOIN ... WHERE child.fk = parent.pk).as("fieldName")` term into the projection list, and graphql-java reads the multiset cell back at field-resolution time. (Source-of-truth: `InlineTableFieldEmitter.buildFkOnlyArm`, line 64.) +* *Split (`@splitQuery`).* The field's child SELECT is hoisted into a separate, batched `SELECT` dispatched through a `DataLoader`. Per request, sibling parents' BatchKey columns are gathered, one batched query runs against the child table joined to a `VALUES (idx, parent_pk...)` derived table, and rows scatter back to their parents by `__idx__`. (Source-of-truth: `SplitRowsMethodEmitter.buildListMethod` and `TypeFetcherGenerator.buildSplitQueryDataFetcher`.) + +The switch between shapes is purely directive-driven for `@table`-parent children: `@splitQuery` present → split; absent → inline. The classifier rejects the inline path's `@asConnection` composition (`@asConnection on inline (non-@splitQuery) TableField is not supported; add @splitQuery for batched connection semantics`, `FieldBuilder.classifyObjectReturnChildField:478`). + +For class-backed-parent children that return a `@table` type, the classifier batches via `DataLoader` *unconditionally* (the parent doesn't sit inside a SQL `JOIN`, so an inline correlated subquery has nothing to bind against). `@splitQuery` on those fields is redundant but not rejected; `classifyChildFieldOnResultType` never inspects the directive. + +== The round-trip vs fan-out trade-off + +Inline and split exchange round trips for SQL width, and the right pick depends on parent fan-out: + +* *Inline cost is per-row, not per-field.* The parent SELECT carries one `multiset` cell per inline child; PostgreSQL evaluates each multiset per parent row. Total work scales with `parents × children-per-parent × column-count`. One round trip, but the bytes shipped back are the full nested projection. Inline is right when the parent fan-out is bounded (small parent list, single-cardinality parent, top-level lookup) and the child cardinality is low. +* *Split cost is per-batch, not per-parent.* Per `@splitQuery` boundary, the framework gathers all parents' keys into one batched query: one round trip per boundary, narrower SQL per query (no nested multiset, no per-parent re-evaluation). Total work scales with `unique-parents × children-per-batch`. Split is right when the parent fan-out is large or unbounded (top-level list, deep nesting) and per-parent inline projection would balloon the response. +* *Cumulative round trips.* A request that traverses three `@splitQuery` boundaries pays four round trips (one root + three split). Inline keeps the count at one but bills it in projection volume. + +The Sakila example schema shows both shapes at the same logical position. `Film.actors(actor_id: [Int!] @lookupKey)` (no `@splitQuery`) emits an inline `multiset` correlated subquery: each parent Film carries its own filtered actor list as a nested cell in the outer SELECT. `Film.actorsBySplitLookup(actor_id: [Int!] @lookupKey) @splitQuery` emits a separate batched query, one round trip for all parents' actor lists combined. At low parent fan-out (a single Film, a small Film list) inline is cheaper. At high fan-out (a 1000-row Film list, or Film inside another deep nesting) split amortises across the whole batch. + +== When the classifier *requires* split + +`@splitQuery` is required (not optional) in two operational cases: + +* *Non-root `@service`.* A child field with `@service` does not derive its data from the parent SELECT (the service runs independently). Without `@splitQuery`, there's no way to dispatch the service per parent. The reference page documents this as a structural requirement; in practice the example schema's `City.filmsFromCity: [Film!]! @splitQuery @service(...)` shows the canonical shape. +* *`@asConnection` on a child of a `@table` parent.* Inline correlated subqueries can't carry per-parent pagination (the `multiset` cell would have to encode the entire connection state, including a cursor that isn't known until parents are resolved). The classifier rejects `@asConnection` on a non-split TableField with a directive-conflict diagnostic; combining `@asConnection + @splitQuery` is the supported shape (covered in xref:connections.adoc[connections]). + +Self-referencing FKs (e.g. `Category.parent: Category @reference(path: [{key: "category_parent_category_id_fkey"}])`) work *inline* in the rewrite. The `InlineTableFieldEmitter` prefixes alias names with the parent alias's runtime name so recursive subselects don't collide (line 75-88), and the live `Category.parent` / `Category.children` fixtures cover this in `GraphQLQueryTest` (the "self-referential recursion" suite). Reach for `@splitQuery` on a self-FK only when the same fan-out arguments above apply; the directive is not structurally required for self-joins. + +== `DataLoader` cache key and lifecycle + +Every `@splitQuery` fetcher registers a `DataLoader` under a name built at request time: + +[source,java] +---- +String name = String.join("/", env.getExecutionStepInfo().getPath().getKeysOnly()); +DataLoader<K, V> loader = env.getDataLoaderRegistry() + .computeIfAbsent(name, k -> DataLoaderFactory.newDataLoader(...)); +---- + +(`TypeFetcherGenerator.buildDataLoaderName:2537`.) + +Two operational facts follow: + +* *Cache key is path-scoped, not name-scoped.* `getKeysOnly()` returns the named segments of the result path with list indices stripped: `/films/0/actors` and `/films/1/actors` both map to `[films, actors]`, so all parents in the same list share one DataLoader. Two unrelated fields that happen to be named `actors` on different parents (e.g. `Film.actors`, `Store.actors`) get distinct paths and distinct loaders. Aliased uses get distinct paths *because* aliases land in `getKeysOnly()`: a query selecting `{ heroes: actors { name }, villains: actors { name } }` runs two separate batched queries, not one. This is by design; the alias splits the result tree. +* *Cache scope is the request.* The `DataLoaderRegistry` lives on the `DataFetchingEnvironment`, which graphql-java rebuilds per request. There is no inter-request caching; each request starts with an empty registry, populates it lazily via `computeIfAbsent`, and discards it on completion. Two requests that select the same field do not share a loader. + +The combination "path-scoped, request-scoped" means inline-style mistakes (a per-parent loop calling the same loader with one key at a time) still cost only one batched query per loader, because the loader gathers keys until the framework dispatches. The framework dispatches at the natural barrier graphql-java provides (between selection-set evaluation and field resolution), so split fetchers work correctly under any client query shape. + +== Composition with other directives + +* *`@lookupKey`.* A `@splitQuery + @lookupKey` field narrows the per-parent batch to caller-provided keys: each parent gets the intersection of "rows that match this parent" AND "rows whose key matches the caller's list". Two `VALUES` tables join into one batched query. Without `@splitQuery`, the same `[T!]! @lookupKey` field paginates across all parents in one wide SELECT; rarely the right semantic at the child level. xref:batch-lookups.adoc[Batch lookups] covers this composition in detail. +* *`@asConnection`.* `@splitQuery + @asConnection` produces a per-parent paginated child connection. The fetcher emits a `ROW_NUMBER() OVER (PARTITION BY parentInput.idx ORDER BY ...)` envelope so each parent's connection page is its own slice; xref:connections.adoc[connections] covers cursor stability and the `totalCount` consequence (split-connection carriers return `null` for `totalCount` until per-parent count plumbing lands). +* *`@orderBy`.* A `@splitQuery` fetcher accepts a runtime `@orderBy` argument and threads it into the per-parent batched query. The emitted helper takes the FK-chain terminal alias as a parameter so column refs resolve against the split query's aliased table instance rather than a hard-coded canonical alias. Inline correlated subqueries can also carry `@orderBy`, but the order applies *across* all parents' rows, not per-parent. +* *`@reference`.* Both shapes need a path. The classifier reads the catalog FK metadata, falls back to the directive-stated `path: [...]`, and rejects ambiguous auto-discovery with a diagnostic. `@reference` is orthogonal to the inline/split decision; it supplies the join, the directive picks the emission shape. + +== Constraints and pitfalls + +* *Aliased uses don't share batches.* `{ heroes: actors { name }, villains: actors { name } }` runs two separate `DataLoader` dispatches because their result paths differ. If you need both shapes to share a batch, drop the alias or refactor the schema so they resolve through the same path. +* *Inline child fan-out compounds.* Three levels of inline `@table` children with `[T!]!` cardinality each at depth 100 produce a `multiset` cell of 100³ rows in the outer SELECT. Inline is fine for narrow children at low depth; reach for split at any of those frontiers. +* *`@splitQuery` registers a `DataLoader` even when the parent list is empty.* `computeIfAbsent` runs on first invocation; an empty parent list means no key is ever supplied, but the loader still occupies a slot in the registry. Memory cost is the closure plus the empty key list; it goes away when the request ends. +* *Cache lifetime is one request only.* Don't expect cross-request memoisation; that would require a custom `DataLoaderRegistry` and the framework doesn't ship one. For cross-request caching, layer a custom cache *inside* the rows method (e.g. read-through against a shared LRU keyed by parent PK). +* *Per-parent ordering on inline children isn't expressible.* Inline correlated subqueries can carry an `ORDER BY`, but the order applies to the whole multiset cell uniformly. If a child's order needs to depend on per-parent state (e.g. a parent's preference column), the inline path can't carry that and `@splitQuery` is required. +* *DataLoader name length is unbounded.* Deep paths with many ancestors produce long names: `/films/details/actors/films/details/actors/...`. There's no truncation; long paths just produce long keys in the registry's `HashMap`. Memory cost is linear in path depth × parent fan-out. +* *Nested `@splitQuery` boundaries multiply round trips.* A `@splitQuery` field whose child has another `@splitQuery` field pays one round trip per boundary. Three nested boundaries = four round trips total. Acceptable when batches are large; expensive when each level's parent fan-out is small. + +== See also + +* xref:../reference/directives/splitQuery.adoc[`@splitQuery`] is the directive surface and the canonical-shapes catalog. +* xref:../reference/directives/reference.adoc[`@reference`] supplies the FK chain for both inline and split paths. +* xref:../reference/directives/asConnection.adoc[`@asConnection`] composes with `@splitQuery` for per-parent paginated child connections. +* xref:../reference/directives/lookupKey.adoc[`@lookupKey`] composes with `@splitQuery` for per-parent narrowed child batches. +* xref:batch-lookups.adoc[How-to: Batch lookups] covers the `@lookupKey` composition shapes in operational detail. +* xref:connections.adoc[How-to: Cursor-paginated connections] covers the `@splitQuery + @asConnection` shape and the split-connection `totalCount: null` consequence. +* xref:sort-results.adoc[How-to: Sort results] covers the cursor-stability, tie-breaker, and `@orderBy` issues that affect both split and inline paginated children. + +xref:index.adoc[← How-to index] diff --git a/docs/manual/how-to/tenant-scoping.adoc b/docs/manual/how-to/tenant-scoping.adoc new file mode 100644 index 0000000000..90b5e62c4d --- /dev/null +++ b/docs/manual/how-to/tenant-scoping.adoc @@ -0,0 +1,9 @@ += How-to: Tenant scoping +:description: Per-tenant DSLContext routing recipe (currently rewritten under R45 alongside the tenant-column work). +:!toc: + +The per-tenant `DSLContext` routing recipe is being rewritten under R45 alongside the tenant-column work. Until R45 ships, single-tenant apps pass a single `DSLContext` to `Graphitron.newExecutionInput(dsl, ...)`; multi-tenant routing through the generated `byTenant` factory overload, the `@tenantId` argument directive, and per-tenant DataLoader partitioning all land together under R45. + +For the single-tenant request-entry shape, see xref:../tutorial/index.adoc[the tutorial] and xref:../reference/runtime-api.adoc[Runtime API reference]. + +xref:index.adoc[← How-to index] diff --git a/docs/manual/how-to/test-your-schema.adoc b/docs/manual/how-to/test-your-schema.adoc new file mode 100644 index 0000000000..aa925ac7b3 --- /dev/null +++ b/docs/manual/how-to/test-your-schema.adoc @@ -0,0 +1,271 @@ += How-to: Test your schema +:description: Wire a consumer-side test class that runs full GraphQL requests against your generated facade and a real database, asserting both response shapes and round-trip counts. +:!toc: + +The most useful tests for a graphitron-rewrite-generated schema are *consumer execution tests*: full GraphQL requests sent through your generated facade, against a real PostgreSQL instance (Testcontainers in CI, native local DB for the inner loop), with assertions on both the response shape (did the right rows come back) and the runtime cost (how many JDBC round-trips fired, what SQL ran, did `DataLoader` batches consolidate). The compilation tier (the rewrite checks this in the example module) and the pipeline tier (the rewrite checks this in `graphitron`) are upstream of you; what's left for the consumer is "the contract between SDL, Java service code, and the database is what I expect". + +This recipe walks the canonical setup: starting Postgres, building the schema, executing requests, and the two assertion families that capture what schema authors most need to verify. It's anchored on `GraphQLQueryTest` (`graphitron-sakila-example/src/test/java/no/sikt/graphitron/rewrite/test/querydb/GraphQLQueryTest.java`) which uses every shape the recipe describes; copy it as the starting template for your application. + +For the rewrite-internal tier model (unit/pipeline/compilation/execution), see xref:../../architecture/how-to/testing.adoc[the test-tier guide]. This recipe is about the consumer's execution-tier setup, not the rewrite's tier choices. + +== The setup: Postgres + DSLContext + GraphQL + +Three things must be in place before a request runs: + +* A `DSLContext` pointing at a Postgres instance with your application's schema migrations applied. The example module uses Testcontainers in CI and accepts a `test.db.url` system property for the inner loop; either path produces a `DSLContext` against the same database shape. +* A call to `Graphitron.newExecutionInput(dsl, ...)` per request, threading the `DSLContext` and any `@service` / `@condition` `contextArguments` through the typed parameter list. +* A `GraphQLSchema` produced by your generated `Graphitron.buildSchema(b -> {})` facade. The schema is built once per test class (`@BeforeAll`); requests reuse it. + +The skeleton: + +[source,java] +---- +@ExecutionTier +class GraphQLQueryTest { + + static PostgreSQLContainer postgres; + static DSLContext dsl; + static GraphQL graphql; + static final AtomicInteger QUERY_COUNT = new AtomicInteger(); + static final List<String> SQL_LOG = new CopyOnWriteArrayList<>(); + + @BeforeAll + static void startDatabase() throws Exception { + var localUrl = System.getProperty("test.db.url"); + if (localUrl != null) { + dsl = DSL.using(localUrl, + System.getProperty("test.db.username", "postgres"), + System.getProperty("test.db.password", "postgres")); + } else { + postgres = new PostgreSQLContainer("postgres:18-alpine") + .withInitScript("init.sql"); + postgres.start(); + dsl = DSL.using(postgres.getJdbcUrl(), postgres.getUsername(), postgres.getPassword()); + } + + dsl.configuration().set(new DefaultExecuteListenerProvider(new ExecuteListener() { + @Override public void executeStart(ExecuteContext ctx) { + QUERY_COUNT.incrementAndGet(); + var sql = ctx.sql(); + if (sql != null) SQL_LOG.add(sql.toLowerCase(Locale.ROOT)); + } + })); + + GraphQLSchema schema = Graphitron.buildSchema(b -> {}); + graphql = GraphQL.newGraphQL(schema).build(); + } + + @AfterAll + static void stopDatabase() { + if (postgres != null) postgres.stop(); + } +} +---- + +The `ExecuteListener` is what makes the round-trip-count and SQL-shape assertions possible: every JDBC statement increments `QUERY_COUNT` and adds its rendered SQL to `SQL_LOG`. Tests that need to assert "this was one batched query, not N per-parent queries" reset `QUERY_COUNT` before executing and assert on it after. + +The Testcontainers fallback runs Postgres 18 alpine with `init.sql` as the bootstrap; consumer tests use whatever migrations your application runs in production. The `test.db.url` system property is the inner-loop optimisation: when set, the test connects to a local Postgres without spinning a container, which shaves about 10 seconds per test class start. + +== Executing a request + +A helper method captures the request shape; tests call it with the GraphQL string: + +[source,java] +---- +private Map<String, Object> execute(String query) { + var input = Graphitron.newExecutionInput(dsl).query(query).build(); + var result = graphql.execute(input); + assertThat(result.getErrors()).isEmpty(); + return result.getData(); +} +---- + +Three things to know about this helper: + +* *`Graphitron.newExecutionInput(...)` is the per-request wiring point.* Its parameter list is schema-driven: a `DSLContext` first, then one typed parameter per `contextArgument` declared in your `@service` / `@condition` / `@tableMethod` directives. The example wires the same `dsl` for every test; production tests that exercise per-tenant routing build a per-tenant `DSLContext` at request entry and pass it as `defaultDsl`. The per-tenant routing recipe is being rewritten under R45 alongside the tenant-column work. +* *`contextArguments` thread through typed factory slots.* A `@service(contextArguments: ["tenantId"])` site adds a `String tenantId` parameter to the generated factory; the test passes the value directly. There is no per-request anonymous `GraphitronContext` impl; the sealed interface is populated by the factory. +* *`DataLoaderRegistry` is mandatory and the factory attaches one.* graphql-java requires a registry per request; the factory pre-attaches a fresh `DataLoaderRegistry` so generated `Split*` fetchers can `computeIfAbsent` on it at first lookup. Override via `.dataLoaderRegistry(custom)` only when you need a pre-populated registry; `.graphQLContext(b -> b.put(...))` calls merge with the entries the factory put. + +The `assertThat(result.getErrors()).isEmpty()` line is the default safety net. Tests that *expect* an error (validation failure, redacted exception) use a sister method `executeRaw` that returns the raw `ExecutionResult` and asserts on the error list. + +== Value assertions: what came back + +The most direct shape: pull GraphQL response fields out of the `Map<String, Object>` and assert on them. AssertJ's `as(LIST)`, `as(MAP)`, `as(list(Map.class))` factories navigate the nested-map shape cleanly: + +[source,java] +---- +@Test +void customers_returnsAllCustomers() { + Map<String, Object> data = execute("{ customers { customerId firstName lastName } }"); + assertThat(data).extractingByKey("customers", as(LIST)).hasSize(5); +} + +@Test +void customers_filteredByActive() { + Map<String, Object> data = execute("{ customers(active: true) { customerId firstName } }"); + assertThat(data).extractingByKey("customers", as(list(Map.class))) + .hasSize(3) + .allSatisfy(c -> assertThat(c).containsKey("firstName")); +} +---- + +Two patterns worth standardising on: + +* *Assert what came back, not what didn't.* `containsOnlyKeys("firstName", "lastName")` catches the regression where selection-set scoping leaks (e.g. customer rows accidentally projecting film columns). Plain `containsKey` doesn't. +* *Cross-check with the seed data.* The example seeds five films with deterministic IDs; tests that depend on row counts (`hasSize(5)`) or specific titles (`containsExactly("ACADEMY DINOSAUR", ...)`) hard-code values from `init.sql`. This is fragile if the seed shifts but valuable as a contract: the test breaks loudly when the data-fixture and the schema-fixture diverge. + +For unions and interfaces, assert on `__typename` to verify the runtime type resolver routes correctly: + +[source,java] +---- +@Test +void search_returnsMixedTypes() { + Map<String, Object> data = execute("{ search { __typename ... on Film { title } ... on Actor { firstName } } }"); + assertThat(data).extractingByKey("search", as(list(Map.class))) + .extracting(r -> r.get("__typename")) + .containsExactlyInAnyOrder("Film", "Film", "Actor", "Actor"); +} +---- + +== Performance assertions: how many round-trips fired + +This is what the `QUERY_COUNT` and `SQL_LOG` machinery exists for. The pattern: reset before, execute, assert after. + +[source,java] +---- +@Test +void splitTableField_multipleParents_scatterPerParent() { + QUERY_COUNT.set(0); + Map<String, Object> data = execute( + "{ languageByKey(language_id: [1, 2, 3]) { languageId films { filmId } } }"); + // Expect 2 JDBC round-trips: 1 for languageByKey root + 1 batched for films. + // Unbatched scatter would fire 1 + N=3 = 4. + assertThat(QUERY_COUNT.get()).isEqualTo(2); + // Value assertions follow... +} +---- + +The 2-vs-4 difference is the test's primary signal: a regression that breaks DataLoader batching turns 2 into 4, the value assertions still pass, and only the count assertion catches the regression. This is *the* canonical reason to write performance assertions: the user-visible response is the same, but per-request cost has gone up by a factor of N. + +`SQL_LOG` is the same idea at finer granularity: assert that a particular SQL shape did or didn't run. + +[source,java] +---- +@Test +void totalCount_isLazyOnSelection_noCountSqlWhenUnselected() { + SQL_LOG.clear(); + execute("{ filmsConnection(first: 2) { nodes { title } pageInfo { hasNextPage } } }"); + assertThat(SQL_LOG) + .as("no SELECT count statement should be issued when totalCount is not selected") + .noneMatch(s -> s.contains("select count")); +} + +@Test +void totalCount_selected_doesIssueCountSql() { + SQL_LOG.clear(); + execute("{ filmsConnection { totalCount } }"); + assertThat(SQL_LOG) + .filteredOn(s -> s.contains("select count")) + .as("selecting totalCount should issue exactly one SELECT count statement") + .hasSize(1); +} +---- + +The pair is the regression-fence: one ratchets that the lazy-on-selection optimisation didn't break, the other ratchets that selecting the field still produces the count query. Without both, a regression that always fires the count query (or never fires it) passes one test and fails the other. + +Common patterns from the example: + +* *DataLoader batching.* Compare expected count to per-parent fan-out: `1 + 1` (one root + one batched child) vs `1 + N`. +* *Empty-input short-circuits.* `actor_id: []` on a `@lookupKey` field should not issue a child query; `QUERY_COUNT == 1` (parent only) is the assertion. +* *Connection cursor round-trip.* Page 1's `endCursor` fed back into a `first: N, after: <cursor>` request should pull page 2 with the right rows; the test pins both the cursor encoding and the seek's correctness. + +== Error-path tests + +`execute` asserts no errors. For tests that exercise error paths (validation failures, mapped exceptions through the `errors:` channel, redacted unmatched exceptions), use a raw helper: + +[source,java] +---- +private ExecutionResult executeRaw(String query) { + var input = Graphitron.newExecutionInput(dsl).query(query).build(); + return graphql.execute(input); +} +---- + +Then assert on the errors directly: + +[source,java] +---- +@Test +void connectionField_firstAndLast_areMutuallyExclusive() { + var result = executeRaw("{ filmsConnection(first: 2, last: 2) { totalCount } }"); + assertThat(result.getErrors()) + .as("Relay forbids mixing first and last on the same request") + .isNotEmpty(); +} +---- + +For typed errors flowing through the xref:error-channel.adoc[errors channel], the test asserts on the response data (the `errors:` field on the payload) rather than `result.getErrors()`. The framework redaction path (unmatched exceptions) shows up in `result.getErrors()` with the "An error occurred. Reference: <UUID>." message; tests that exercise the redact path assert the message format and that no original exception details leak. + +== Context-argument tests + +For `@service` or `@condition` paths that read context arguments, the helper takes typed values directly and passes them through the schema-driven factory slot: + +[source,java] +---- +private Map<String, Object> executeWithContext(String query, String userId) { + var input = Graphitron.newExecutionInput(dsl, userId).query(query).build(); + var result = graphql.execute(input); + assertThat(result.getErrors()).isEmpty(); + return result.getData(); +} + +@Test +void servicePath_seesContextArgument() { + Map<String, Object> data = executeWithContext("{ myFilms { title } }", "user-42"); + // Assertions specific to the contextArgument path +} +---- + +The pattern is the same as the basic helper, just with a callable context builder. For full-on multi-tenant testing, also see xref:tenant-scoping.adoc[How-to: Tenant scoping] for the framework-side wiring contract. + +== Federation entity tests + +If your schema declares federation `@key` directives, the `_entities` resolver dispatches representations through the runtime entity dispatcher. `FederationEntitiesDispatchTest` (in the example's `querydb` package) is the canonical template: same Testcontainers + `Graphitron.buildSchema` + `ExecuteListener` setup, with the request shape adjusted for federation: + +[source,java] +---- +@Test +void entities_resolveSingleNodeIdRep_returnsHydratedRow() { + String customerId = NodeIdEncoder.encode("Customer", 1); + Map<String, Object> data = execute( + "query Q($reps: [_Any!]!) { _entities(representations: $reps) { ... on Customer { firstName lastName } } }", + Map.of("reps", List.of(Map.of("__typename", "Customer", "id", customerId)))); + var entities = (List<Map<String, Object>>) data.get("_entities"); + assertThat(entities).singleElement(as(MAP)) + .containsEntry("firstName", "MARY") + .containsEntry("lastName", "SMITH"); +} +---- + +The test passes representations via GraphQL variables, and asserts on the dispatched results. For multi-alternative dispatch, the same shape works with multiple representations in the input list and assertions on which alternative matched (typically by inference from the response shape, since the dispatcher is internal). xref:federation-keys.adoc[How-to: Federation key fields] covers the dispatch rules; the test confirms the rules behave as documented. + +== Pitfalls + +* *Hand-rolling `ExecutionInput.newExecutionInput()` outside the factory.* The factory attaches the `DataLoaderRegistry` and stashes the singleton `GraphitronContextImpl`; bypassing it produces NPEs at first DataLoader lookup and "context value … was not supplied" `IllegalStateException`s at first `contextArgument` read. Always go through `Graphitron.newExecutionInput(dsl, ...)`. +* *Per-test connection leak.* `@AfterAll` stops the Testcontainers Postgres; a test that holds `dsl` references past class scope leaks a connection. Use `@BeforeAll` / `@AfterAll` (class-scoped) rather than `@BeforeEach` / `@AfterEach` for the database; per-test work happens inside the request. +* *`QUERY_COUNT` and `SQL_LOG` are global.* They are static fields on the test class, mutated by the listener that fires on every JDBC statement. Tests that read them must reset (e.g. `QUERY_COUNT.set(0)`, `SQL_LOG.clear()`) immediately before executing the GraphQL query, and the test must run on its own (no parallel test in the class touching the same DB at the same time). The example uses JUnit 5's default sequential execution; if your test class enables parallel execution, switch to per-test counters. +* *Seed-data drift breaks tests.* Hard-coded row counts (`hasSize(5)`) and specific values (`containsExactly("ACADEMY DINOSAUR", ...)`) tie tests to the seed. Either commit the seed alongside the tests (the example does this) or assert on shape-only (`size > 0`, `every row has a `firstName` key`); avoid the middle ground where the seed is shared but mutable. +* *`init.sql` runs once per Testcontainers start.* The example's container starts in `@BeforeAll` and stops in `@AfterAll`, so the whole test class shares the same database state. Tests that mutate the data (mutations, deletes) must order their assertions accordingly, or use a per-test transaction rollback. The example uses read-only queries in most tests; mutation tests assert on the post-mutation state. +* *Generated facade name is `Graphitron`.* The class your tests import is the rewrite-generated `Graphitron` (default class name from the Mojo's `<outputPackage>`). Federation-bearing schemas produce a separate `Graphitron` in the federation output package; the example imports both via fully-qualified package names so the two facades coexist. +* *Compilation tier covers "did the source compile"; execution tier covers "does it run".* Don't add execution tests for purely structural concerns (fields exist, types are reachable); the compilation tier already catches those, and execution tests are slower. Reach for execution-tier tests when the contract is "this request returns this row" or "this DataLoader batches these parents". + +== See also + +* `GraphQLQueryTest` (`graphitron-sakila-example/src/test/java/no/sikt/graphitron/rewrite/test/querydb/GraphQLQueryTest.java`) is the canonical template; copy its `@BeforeAll` setup. +* `FederationEntitiesDispatchTest` (same package) covers the federation-side test pattern. +* xref:apollo-federation.adoc[How-to: Apollo Federation transport] covers the framework-level wiring this recipe assumes is in place when testing federation entities. +* xref:handle-services.adoc[How-to: Handle services] covers the `@service` argument-binding contract that consumer tests exercise. +* xref:error-channel.adoc[How-to: The errors channel] covers asserting on typed errors that flow through a payload's `errors:` field vs the framework redaction path. +* xref:federation-keys.adoc[How-to: Federation key fields] covers the dispatch rules a federation-side test verifies. + +xref:index.adoc[← How-to index] diff --git a/docs/manual/index.adoc b/docs/manual/index.adoc new file mode 100644 index 0000000000..a091fac9d4 --- /dev/null +++ b/docs/manual/index.adoc @@ -0,0 +1,38 @@ += Graphitron user manual +:description: A Diataxis-shaped manual covering Graphitron's directives, runtime, and design. +:keywords: graphitron, documentation, tutorial, reference, how-to +:!toc: + +This manual covers Graphitron from four angles. Pick the one that matches what you are trying to do right now. + +[.quadrants,cols="1,1",frame=none,grid=none] +|=== +a| +[.quadrant-title]*xref:tutorial/index.adoc[Tutorial]* + +I'm new and want to learn by doing. + +A page-by-page walk-through that takes a fresh checkout to a working GraphQL query against the Sakila example. + +a| +[.quadrant-title]*xref:how-to/index.adoc[How-to guides]* + +I have a specific task and want a recipe. + +Task-indexed instructions for the day-to-day patterns: joining tables, custom conditions, mutations, services, pagination, errors, federation, the recommended consumer test pattern. + +a| +[.quadrant-title]*xref:reference/index.adoc[Reference]* + +I know what I am looking for and want the facts. + +Authoritative descriptions of every directive, every Maven plugin parameter, every runtime API entry point, and every diagnostic code Graphitron emits. + +a| +[.quadrant-title]*xref:explanation/index.adoc[Explanation]* + +I want to understand why Graphitron works the way it does. + +Background on the design decisions, the batching model, the database-first stance, and how the pipeline fits together. + +|=== diff --git a/docs/manual/reference/deprecations.adoc b/docs/manual/reference/deprecations.adoc new file mode 100644 index 0000000000..e8b3ce15b0 --- /dev/null +++ b/docs/manual/reference/deprecations.adoc @@ -0,0 +1,73 @@ += Deprecations +:description: Every deprecated directive parameter, input field, and whole directive in the rewrite, with migration guidance. +:!toc: + +Aggregator for every deprecated surface element the rewrite carries: directive arguments, input fields, and whole directives. The per-directive reference page is the canonical migration guide; this page is the index. + +== Source of truth + +Two distinct sources feed this page: + +* *SDL `@deprecated()` markers* on directive arguments and input fields. The rewrite's `directives.graphqls` carries them inline; the GraphQL spec only allows the marker on `FIELD_DEFINITION`, `ARGUMENT_DEFINITION`, `INPUT_FIELD_DEFINITION`, and `ENUM_VALUE`, so this is the machine-detectable surface. +* *Whole-directive deprecations*, which the GraphQL spec cannot mark inline (the `@deprecated` directive is not allowed on a directive definition). These are documented prose-side on the directive's reference page and aggregated below in a separate section. + +The `DeprecationsDocCoverageTest` verifier asserts every SDL `@deprecated()` marker has a row in the table below; whole-directive deprecations are an explicit hand-maintained list (the verifier covers them via a small allow-list). + +[NOTE] +==== +The rewrite's `@deprecated(reason:)` markers do not carry a structured removal version, and the project does not currently version the directive surface as a separate cadence. "Status" carries the practical signal (discouraged, transitional, removed) and "Migration" names the replacement. +==== + +== Deprecated arguments and input fields + +[cols="2,2,1,3",options="header"] +|=== +| Site | Status | Since | Migration + +| xref:directives/asConnection.adoc[`@asConnection(connectionName:)`] +| Discouraged transition mechanism +| Rewrite v1 +| Drop the override and let the generator synthesize `{ParentType}{FieldName}Connection`. Each connection field should own its own Connection type; sharing one across fields conflates distinct semantic contexts (different parents, filters, orders) at the type level. + +| xref:directives/record.adoc[`ExternalCodeReference.name`] +| Phased out +| Rewrite v1 +| Use `className:` instead. `name:` was a Norwegian-language alias kept for backward compatibility with legacy schemas; `className:` is the canonical key on `ExternalCodeReference` (used by xref:directives/service.adoc[`@service`], xref:directives/error.adoc[`@error`], and other directive sites that reference external Java code). +|=== + +== Deprecated whole directives and directive locations + +The GraphQL spec does not allow `@deprecated` on a directive definition, nor on a single directive *location* (a scope in the `on` clause). Deprecations the spec cannot mark inline, whether the whole directive or one of its locations, are documented in the directive's own reference page and listed here for visibility. + +[cols="2,2,1,3",options="header"] +|=== +| Directive | Status | Since | Migration + +| xref:directives/table.adoc[`@table`] (on `INPUT_OBJECT`) +| Deprecated; `OBJECT` / `INTERFACE` unaffected +| Rewrite v1 +| Remove `@table` from input types. The mutation's write/read target is derived from the consuming field's resolved target table, so the directive on the input is redundant. A build warning fires per `@table`-on-input usage, except encoded-ID / scalar-return INSERT/UPSERT, where the input's `@table` is still the only write-target signal until that derivation lands. + +| xref:directives/index-directive.adoc[`@index`] +| Backward-compatibility alias +| Rewrite v1 +| Replace `@index(name: "X")` with xref:directives/order.adoc[`@order(index: "X")`]. The two forms generate identical code; only the directive name and parameter key change. xref:directives/order.adoc[`@order`] also offers `fields:` and `primaryKey:` modes that `@index` cannot express. + +| xref:directives/record.adoc[`@record`] +| Ignored (parsed, drives nothing) +| Rewrite v1 +| Remove it. The backing Java class is now inferred from the producing field's reflected type: an xref:directives/service.adoc[`@service`] method return (or parameter, for inputs), a xref:directives/table.adoc[`@table`] resolution, a `@tableMethod` return, or a parent-accessor chain. A reachable type still carrying `@record` emits a build warning (redundant, shadowed-by-`@table`, or disagrees-with-reflection). The directive stays declared so existing schemas keep parsing. +|=== + +== Rejected, not deprecated + +These directives parse but the rewrite refuses to generate against them. They are *not* deprecations (a deprecated surface still works); they are explicit rejections that fail the build with a structured diagnostic. Listed here because users sometimes confuse the categories: + +* xref:directives/notGenerated.adoc[`@notGenerated`] is rejected. Remove it from the schema; the rewrite has no equivalent escape hatch. + +== See also + +* xref:diagnostics-glossary.adoc[Diagnostics glossary] catalogues the closed-set rejection kinds the validator emits. +* xref:directives/index-directive.adoc[`@index`] and xref:directives/asConnection.adoc[`@asConnection`] carry their own deprecation prose at the canonical site. + +xref:index.adoc[← Reference index] diff --git a/docs/manual/reference/diagnostics-glossary.adoc b/docs/manual/reference/diagnostics-glossary.adoc new file mode 100644 index 0000000000..906a6a7735 --- /dev/null +++ b/docs/manual/reference/diagnostics-glossary.adoc @@ -0,0 +1,155 @@ += Diagnostics glossary +:description: Every closed-set diagnostic code the rewrite validator emits, with a sample message line and the next concrete step for each one. +:!toc: + +You probably arrived here because the build failed with a `[<kind>] <message>` line and you searched for it. The rest of this page is organised so the line you saw is the entry point: top-level kinds first, then the nine `unknown-name` attempt kinds (the most common shape), then the four `deferred` emit-block reasons. Each entry leads with a sample line you can grep for. + +== Reading an error line + +Every emitted error takes one of three forms. Pattern-match by prefix: + +[source] +---- +[author-error] <message> [; did you mean: A, B, C] +[invalid-schema] <message> +[deferred] <message> [— see roadmap/<plan-slug>.md] +---- + +The `did you mean: ...` suffix only appears for `UnknownName` variants (the nine attempt-kinds in this page); a structural `[author-error]` carries no candidate list. The roadmap-path suffix only appears for `Deferred` variants whose `planSlug` is non-empty. + +Watch-mode (`mvn graphitron:dev`) groups errors by file and coordinate, then prints them under one heading per element; the `[<kind>]` prefix is preserved through the grouping so the typed signal is still legible. + +Most everyday `[invalid-schema]` and `[author-error]` errors are `Structural` variants whose messages are produced ad-hoc at the classifier site; their text is not enumerable here, but the kind-level entries below describe what reading them looks like. + +== Top-level kinds + +Three prefixes. Triage by which one you saw. + +[#kind-author-error] +=== author-error + +*Sample line.* `[author-error] @field 'firstName' did not match any column on table 'customer'; did you mean: FIRST_NAME, LAST_NAME, EMAIL`. + +*Cause.* Author-correctable: a name typo, a missing `@table` somewhere it's needed, a directive pointed at something the jOOQ catalog or SDL registry doesn't know about. When the lookup is against a closed set, the message includes a `did you mean: ...` hint with up to five candidates ranked by Levenshtein distance. + +*Next step.* The fix is in the schema or the consumer code (a column rename, an FK declaration, a `<namedReference>` entry); no Graphitron-internal change is needed. If the message includes `did you mean: ...`, the relevant attempt-kind below names the resolution rule. When you can't tell whether an error is `[author-error]` or `[invalid-schema]`, the rule of thumb is "could a column rename in the SDL fix it?" Yes → `[author-error]`. No → `[invalid-schema]`. + +[#kind-invalid-schema] +=== invalid-schema + +*Sample line.* `[invalid-schema] @asConnection on a non-@splitQuery field that returns a paginated child` or `[invalid-schema] lookup fields must not return a connection`. + +*Cause.* The directive combination cannot work, period. Two sub-shapes: + +* `DirectiveConflict` reports two or more directives that co-occur in a combination the classifier rejects (`@asConnection` on a non-`@splitQuery` field, `@discriminate` mixed with `@reference`). The error names the conflicting directives. +* `Structural` reports rules that don't reduce to a clean directive enumeration ("lookup fields must not return a connection", "result type does not match input cardinality"). + +*Next step.* Drop or replace one of the directives, or restructure the schema so the combination doesn't arise. Renames don't help; this is a hard "no". The directive pages in xref:directives/index.adoc[the directive reference] document the admitted directive combinations per directive. + +[#kind-deferred] +=== deferred + +*Sample line.* `[deferred] split-batch emitter does not yet support @condition with a join step — see roadmap/condition-join-step.md`. + +*Cause.* Recognised but not yet generator-supported. The classifier understands what the schema asks for, the rewrite roadmap tracks the work, but emission is stubbed until the relevant plan ships. + +*Next step.* Either drop the unsupported shape (and revisit when the plan ships), or contribute the missing emission to the rewrite. The roadmap path on the message names the variant class or feature shape; the emit-block reasons further down this page describe each shape that currently lands here. + +== Unknown name: which kind of name + +When `[author-error]` carries an `UnknownName` variant (a closed-set name lookup that didn't resolve), the message contains a `did you mean: ...` suffix when there were close candidates. The variant's `attempt-kind` field names *what kind of thing the classifier was looking up*; the LSP fix-its read this typed value to offer the right action ("rename column", "add `<namedReference>` entry", etc.). Find your sample below. + +[#attempt-column] +=== column + +*Sample line.* `[author-error] @field 'firstName' did not match any column on table 'customer'; did you mean: FIRST_NAME`. + +*Cause.* The `@field` directive's `name:` argument did not match any column on the `@table`-bound parent. Typical typos: case (`firstName` vs `FIRST_NAME`) or a stale rename (column dropped at the database side, schema not updated). + +*Next step.* Correct the `name:` argument, or update the database schema and regenerate the jOOQ catalog if the column was supposed to exist. xref:directives/field.adoc[`@field` directive reference] covers the column-name resolution rules. + +[#attempt-table] +=== table + +*Sample line.* `[author-error] @table 'CUSTOMER' did not match any table in the catalog; did you mean: customer`. + +*Cause.* The `@table` directive's `name:` argument did not match any table in the jOOQ-generated catalog. Candidates are tables under the configured `<jooqPackage>`. + +*Next step.* Correct case or schema prefix. If the table is genuinely missing, regenerate the jOOQ catalog from the database first. xref:directives/table.adoc[`@table` directive reference] covers the resolution rules. + +[#attempt-foreign-key] +=== foreign-key + +*Sample line.* `[author-error] @reference key 'customer_address_fkey' did not match any FK on table 'customer'; did you mean: customer_address_id_fkey`. + +*Cause.* The `@reference` directive's `key:` argument did not match any FK declared on the parent table. Candidates are the FK constants on the relevant table's `Keys` class. + +*Next step.* Correct the constraint name. If the FK exists in the database but not in the catalog, regenerate jOOQ. If the FK doesn't exist, declare it (`ALTER TABLE ... ADD FOREIGN KEY`) or pin the join with `table:` instead of `key:`. xref:directives/reference.adoc[`@reference` directive reference] covers both pinning shapes. + +[#attempt-service-method] +=== service-method + +*Sample line.* `[author-error] @service method 'findCustomers' not found on com.example.CustomerService; did you mean: findCustomer`. + +*Cause.* The `@service` (or `@externalField`, `@tableMethod`) directive's `methodName:` argument (or the field-name default) did not match any static method on the resolved class. Candidates are the public static methods on that class with matching arity. + +*Next step.* Correct the method name or rebind via `argMapping:` if the parameter list shifted. xref:../how-to/external-code.adoc[How-to: Wire external Java code] covers the FQCN + method-name contract. + +[#attempt-lifter-method] +=== lifter-method + +*Sample line.* `[author-error] @sourceRow method 'liftKeys' not found on com.example.Lifters; did you mean: liftKey`. + +*Cause.* The `@sourceRow` directive's `methodName:` argument did not match any static method on the resolved class. Candidates are the lifter-shape static methods (`(Set<Key>) -> Map<Key, Value>`) on that class. + +*Next step.* Correct the method name. The lifter must be a static method with the `(Set<Key>) -> Map<Key, Value>` shape. + +[#attempt-enum-constant] +=== enum-constant + +*Sample line.* `[author-error] @enum constant 'PENDING' not found on com.example.Status; did you mean: PENDING_REVIEW`. + +*Cause.* A jOOQ-typed `@enum` mapping referenced a Java enum constant the resolved enum class doesn't carry. + +*Next step.* Correct the constant name, or update the jOOQ catalog if the database enum changed. + +[#attempt-type-name] +=== type-name + +*Sample line.* `[author-error] @nodeId typeName 'customer' did not match any GraphQL type; did you mean: Customer`. + +*Cause.* A `@nodeId` directive's `typeName:` argument (or a similar refType lookup) did not match any GraphQL type in the assembled SDL. + +*Next step.* Correct case or pull in the missing schema file. xref:directives/nodeId.adoc[`@nodeId` directive reference] covers the typeName resolution. + +[#attempt-nodeid-key-column] +=== nodeid-key-column + +*Sample line.* `[author-error] @node keyColumns 'customer_id' did not match a column on table 'customer'; did you mean: CUSTOMER_ID`. + +*Cause.* A `@node` directive's `keyColumns:` argument named a column the bound table doesn't carry. + +*Next step.* Correct case (jOOQ-generated identifiers are usually upper-snake) or update `keyColumns:` after a schema change. xref:directives/node.adoc[`@node` directive reference] covers the `keyColumns:` contract. + +[#attempt-dml-kind] +=== dml-kind + +*Sample line.* `[author-error] @mutation typeName 'CREATE' is not a supported DML kind; did you mean: INSERT`. + +*Cause.* A `@mutation` directive's `typeName:` argument did not match the closed set of supported DML kinds. + +*Next step.* Use one of the supported values (`INSERT`, `UPDATE`, `DELETE`, `UPSERT`). xref:directives/mutation.adoc[`@mutation` directive reference] covers the supported kinds. + +== Drift protection + +`DiagnosticsDocCoverageTest` asserts every value of `RejectionKind` and `Rejection.AttemptKind` has an anchored `=== <kebab-case-name>` heading on this page, and every such heading corresponds to an enum value. A new diagnostic added to one of these enums cannot land green without a doc paragraph; an obsolete code's removal forces the heading's removal. + +Structural variants (`AuthorError.Structural`, `InvalidSchema.Structural`, `InvalidSchema.DirectiveConflict`) carry ad-hoc messages produced at the classifier site and are not enumerable; the kind-level entries above describe how to read those. + +== See also + +* xref:directives/index.adoc[Directive reference] is the SDL-side companion: every closed-set name lookup that produces an `unknown-name` error resolves against a directive's argument, and the directive page covers the resolution contract. +* xref:mojo-configuration.adoc[Maven plugin configuration] covers the `validate` goal that runs the validator without emitting code; useful for a CI gate that surfaces these errors without the full code-generation cost. +* xref:../how-to/migrating-from-legacy.adoc[How-to: Migrating from the legacy generator] covers diagnostics specific to the legacy-to-rewrite transition (the `@notGenerated` rejection, the synthesis shims that warn but classify, the `@condition` cascade divergence). + +xref:index.adoc[← Reference index] diff --git a/docs/manual/reference/directives/asConnection.adoc b/docs/manual/reference/directives/asConnection.adoc new file mode 100644 index 0000000000..259114dd23 --- /dev/null +++ b/docs/manual/reference/directives/asConnection.adoc @@ -0,0 +1,100 @@ += @asConnection +:description: Wrap a list field as a Relay cursor-paginated connection, synthesizing the Connection / Edge / PageInfo types and keyset-based fetchers. +:!toc: + +Marks a list field as a https://relay.dev/graphql/connections.htm[Relay cursor connection]. The schema-transform stage rewrites the field's return type from `[T!]!` to a synthesized `TConnection` carrying `edges`, `nodes`, `pageInfo`, and `totalCount`; the generator emits keyset-based `seek/limit` SQL with `ROW_NUMBER() OVER (PARTITION BY ...)` for batched per-parent pagination. If the field doesn't already declare pagination arguments, forward-pagination args (`first: Int`, `after: String`) are added automatically; backward (`last`/`before`) and dynamic xref:orderBy.adoc[`@orderBy`] arguments coexist when present. + +`@asConnection` works on three field shapes that the rewrite recognises distinctly: bare list fields on `@table` parents (inline pagination), `@reference`-driven child lists (per-parent paginated children), and union/interface lists (multi-table polymorphic pagination). It also composes with xref:splitQuery.adoc[`@splitQuery`] to dispatch each parent's connection through a `DataLoader`. + +== SDL signature + +[source,graphql] +---- +directive @asConnection( + defaultFirstValue: Int = 100 + connectionName: String +) on FIELD_DEFINITION +---- + +== Parameters + +[cols="1,1,1,3",options="header"] +|=== +| Name | Type | Default | Description +| `defaultFirstValue` | `Int` | `100` | Page size used when the client omits `first:`. Not a cap on `first:`; clients that supply a value get exactly what they ask for. +| `connectionName` | `String` | `{ParentType}{FieldName}Connection` | *Deprecated.* Override the synthesized connection type's name. Each connection field should own its own type; sharing a Connection across fields conflates distinct semantic contexts (different parents, filters, orders) at the type level. The override remains supported as a transition mechanism for legacy schemas but is permanently discouraged. See xref:../../how-to/connections.adoc[How-to: Cursor-paginated connections]. +|=== + +== Canonical examples + +A bare list on a `@table` parent (`Query.stores`): `@asConnection` rewrites the return type to `StoreConnection`, adds `first:`/`after:` arguments, and emits keyset pagination using xref:defaultOrder.adoc[`@defaultOrder`] for the cursor: + +[source,graphql] +---- +type Query { + stores: [Store!]! @asConnection @defaultOrder(primaryKey: true) +} +---- + +A union-typed list (`Address.occupantsConnection`): the multi-table polymorphic emitter wraps the per-branch `UNION ALL` in a derived table so `seek/limit` and cursor pagination apply across the union; `totalCount` counts only this parent's occupants: + +[source,graphql] +---- +type Address @table(name: "address") { + occupants: [AddressOccupant!]! + occupantsConnection: [AddressOccupant!]! @asConnection(defaultFirstValue: 5) +} + +union AddressOccupant = Customer | Staff +---- + +Per-parent paginated children with xref:splitQuery.adoc[`@splitQuery`] (`Film.actorsConnection`): a `ROW_NUMBER() OVER (PARTITION BY parentInput.idx)` envelope gives each parent its own paginated slice, and a `DataLoader` batches the dispatch: + +[source,graphql] +---- +type Film @table(name: "film") { + actorsConnection( + first: Int, last: Int, after: String, before: String + ): ActorsConnection! @splitQuery @reference(path: [ + {key: "film_actor_film_id_fkey"}, + {key: "film_actor_actor_id_fkey"} + ]) @defaultOrder(primaryKey: true) +} +---- + +When the schema declares the connection type explicitly (the `ActorsConnection!` shape above), the rewrite reuses it instead of synthesising a fresh one. Otherwise, a `*Connection`, `*Edge`, and `PageInfo` are generated alongside the field. + +Federation directives on the field (`@shareable`, `@tag`) propagate onto the synthesised Connection, Edge, and PageInfo types, so federation contracts that include the field's tags also include its pagination types. An author-declared `PageInfo` is left untouched; a synthesised one carries the union of the tags from every connection-promoted field. + +Dynamic order via xref:orderBy.adoc[`@orderBy`] composes naturally: + +[source,graphql] +---- +actorsOrderedConnection( + order: [ActorOrderBy] @orderBy, + first: Int, last: Int, after: String, before: String +): ActorsConnection! @splitQuery @reference(path: [ + {key: "film_actor_film_id_fkey"}, + {key: "film_actor_actor_id_fkey"} +]) @defaultOrder(primaryKey: true) +---- + +The cursor encodes the active order columns (the `@orderBy` selection if the client supplied one, otherwise `@defaultOrder`); decoding rejects cursors whose embedded sort doesn't match the request's effective order. + +== Constraints + +* Applies to list-typed fields. The runtime cardinality must be a list; single-cardinality `@asConnection` is rejected at classify time. +* The field must have a stable order. Either xref:defaultOrder.adoc[`@defaultOrder`] is set on the field, or xref:orderBy.adoc[`@orderBy`] is required at runtime; without one of these, keyset pagination has no anchor and the build fails. +* The synthesized connection type's name must not collide with another type already declared in the schema. The default `<ParentType><FieldName>Connection` shape rarely collides because parent and field names jointly disambiguate; collisions usually mean two carriers should be split into distinct fields rather than coalesced. The deprecated `connectionName:` override exists as a transition escape hatch. +* `defaultFirstValue:` is the page size used when the client omits `first:`; it is not a cap. The rewrite plugin does not ship a server-side maximum on `first:`/`last:` (the legacy generator's `<maxAllowedPageSize>` setting was excised); enforce caps at the API layer if needed. See xref:../../how-to/connections.adoc[How-to: Cursor-paginated connections]. +* Composes with xref:splitQuery.adoc[`@splitQuery`]: when both are present, the connection is materialized per-parent through a `DataLoader` keyed on the parent's PK or FK. Without `@splitQuery` on a parent-keyed list, all parents' rows are paginated in a single SQL pass (the `PARTITION BY` envelope is omitted). +* Inline `TableField` placement is not allowed under interface-or-union return types unless the surrounding type axis supports the multi-table emitter; the generator rejects mismatched placements at classify time. (See `rewrite-design-principles.adoc` for the "no generator-side invariant goes unchecked at validate time" rule that backs this.) + +== See also + +* xref:splitQuery.adoc[`@splitQuery`] dispatches per-parent connections through a `DataLoader` for nested-depth pagination. +* xref:defaultOrder.adoc[`@defaultOrder`] anchors the cursor when the client omits `@orderBy`. +* xref:orderBy.adoc[`@orderBy`] supplies dynamic order; the cursor encodes the active selection. +* xref:../../how-to/connections.adoc[How-to: Cursor-paginated connections] covers the one-field-one-connection rule, `totalCount` performance, and what the rewrite does about page-size caps. + +xref:../index.adoc[← Reference index] diff --git a/docs/manual/reference/directives/condition.adoc b/docs/manual/reference/directives/condition.adoc new file mode 100644 index 0000000000..8a564b131a --- /dev/null +++ b/docs/manual/reference/directives/condition.adoc @@ -0,0 +1,150 @@ += @condition +:description: Add (or override) a SQL predicate at a field, argument, or input field by reflecting a developer-supplied static method. +:!toc: + +Attaches a developer-supplied predicate to a field, an argument, or an input field. The reflected static method takes the surrounding table and the relevant scalar values, and returns a jOOQ `Condition`. The rewrite folds that `Condition` into the generated `WHERE` clause: by default *in addition to* the implicit `column = ?` predicates the rewrite would otherwise emit, or *replacing them* when `override: true`. + +`@condition` is the escape hatch for predicates Graphitron can't infer from the catalog: regex matches, range filters, date arithmetic, joins through correlated subqueries, vendor-specific predicates, multi-column boolean shapes. It also drives the dynamic `enclosingOverride` cascade at field level: an outer field-level `@condition(override: true)` suppresses the implicit-column predicates from a `@table`-typed input, but inner argument-level `@condition` annotations *still fire*. (The rewrite preserves inner explicit conditions, the legacy generator dropped them, see `filmsOuterOverrideTableInput` in the example schema for the test that pins this divergence.) + +== SDL signature + +[source,graphql] +---- +directive @condition( + condition: ExternalCodeReference + override: Boolean = false + contextArguments: [String!] +) on FIELD_DEFINITION | ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION +---- + +== Parameters + +[cols="1,1,1,3",options="header"] +|=== +| Name | Type | Default | Description +| `condition` | `ExternalCodeReference` | (required in practice) | Points at the static Java method that returns the `Condition`. `className:` and `method:` are both required, the rewrite reflects the method's parameter list against (in order) the surrounding table, the input or scalar parameters, and any `contextArguments`. `argMapping:` rebinds GraphQL argument names to differently-named Java parameters when the conventions diverge. +| `override` | `Boolean` | `false` | When `true`, suppresses the rewrite's automatic equality predicates *for the affected element only*: at argument level, the implicit `column = ?` for that one argument; at field level, the implicit predicates for every direct argument *and* the column-equality predicates inside `@table` inputs. Inner explicit `@condition` annotations are preserved on either axis. +| `contextArguments` | `[String!]` | `[]` | Names of values to pull from the GraphQL `GraphQLContext` at runtime. Each named context value becomes a Java parameter the reflected method receives, alongside the table and the input arguments. Wire the values into `GraphQLContext` in your servlet bootstrap. +|=== + +== Canonical examples + +Argument-level, no override (the explicit predicate is `AND`-ed with the implicit `column IN (...)`): + +[source,graphql] +---- +type Query { + citiesByName( + cityNames: [String!] @field(name: "CITY") + @condition(condition: {className: "com.example.CityConditions", method: "cityMethod"}) + ): [City] +} +---- + +Field-level, no override (the explicit predicate is `AND`-ed with the implicit predicates for every argument): + +[source,graphql] +---- +type Query { + cities( + countryId: String! @field(name: "COUNTRY_ID"), + cityNames: [String!] @field(name: "CITY") + ): [City] @condition(condition: {className: "com.example.CityConditions", method: "cityMethod"}) +} +---- + +Field-level, `override: true` on a `@table` input. The outer `@condition` runs, the implicit column-equality predicates from `FilmConditionInput` are suppressed, *but* an inner `@condition` on `FilmConditionInput.filmId` still fires: + +[source,graphql] +---- +type Query { + filmsOuterOverrideTableInput(filter: FilmConditionInput): [Film!]! + @condition( + condition: { + className: "com.example.conditions.InputFieldConditionFixtures", + method: "outerOverrideMethod" + }, + override: true + ) +} + +input FilmConditionInput @table(name: "film") { + filmId: Int @field(name: "FILM_ID") + @condition(condition: { + className: "com.example.conditions.InputFieldConditionFixtures", + method: "filmIdCondition" + }) +} +---- + +Net effect: `(film_id >= 2) AND (film_id = 1)` — both the outer override and the inner explicit `@condition` are honoured, even though the outer override is `true`. + +Multi-segment input path with a plain (non-`@table`) input. The two-level nested input lets a leaf-level `@condition` reference its enclosing-input field by path: + +[source,graphql] +---- +input NestedFilmInput { + inner: InnerFilmInput +} + +input InnerFilmInput { + filmId: Int @condition(condition: { + className: "com.example.conditions.PlainFilmIdConditions", + method: "filmIdCondition" + }) +} +---- + +The rewrite extracts `inner.filmId` from the outer argument map and passes it to `filmIdCondition` as the bound parameter. + +Context-argument flow. The reflected method receives the table, any explicit input parameters, *and* the named context values: + +[source,graphql] +---- +type Query { + citiesForCurrentUser: [City] + @condition( + condition: {className: "com.example.CityConditions", method: "tenantScoped"}, + contextArguments: ["tenantId"] + ) +} +---- + +`tenantScoped(City table, UUID tenantId)` runs at request time with `tenantId` pulled from `GraphQLContext`. + +FK-target `@nodeId` filter. When an input field carries both `@nodeId(typeName: "X")` and `@condition`, the field decodes an opaque id for a *foreign-key-linked* table `X` (reached from the input's own table through a catalog foreign key). The reflected method's table parameter is then `X`, not the input's own table: + +[source,graphql] +---- +input SoknadsmangeltypeFilterInput @table(name: "soknadsmangeltype") { + regelverksamlingId: ID! @nodeId(typeName: "Regelverksamling") + @condition(condition: { + className: "com.example.conditions.SoknadsmangeltypeConditions", + method: "iRegelverksamling" + }, override: true) +} +---- + +The method signature is `iRegelverksamling(Regelverksamling rs, String regelverksamligId)`: it receives an alias for the FK-target `Regelverksamling`, and the rewrite wraps the returned `Condition` in a correlated subquery, `EXISTS (SELECT 1 FROM regelverksamling rs WHERE soknadsmangeltype.<fk> = rs.<pk> AND <your predicate>)`, so the predicate runs against `X` while the outer row set is preserved. The developer method is identical to any other `@condition` method; it neither knows nor cares that its `Condition` lands inside an `EXISTS` rather than the top-level `WHERE`. Composite-key NodeType targets are supported: the correlation ANDs every foreign-key column pair (`EXISTS (SELECT 1 FROM project p WHERE p.org_id = project_note.org_id AND p.project_id = project_note.project_id AND <your predicate>)`). The same `EXISTS` is emitted wherever the predicate lands, including inline child-field fetchers and `@splitQuery` batched fetchers, not only top-level query conditions. + +== Constraints + +* Applies on `FIELD_DEFINITION`, `ARGUMENT_DEFINITION`, and `INPUT_FIELD_DEFINITION`. The element type fixes the predicate's scope: argument-level conditions can only see *their own* argument and any context arguments, field-level conditions see *all* of the field's arguments, input-field-level conditions see the input's enclosing argument map (the rewrite extracts the leaf value via the path from the outer argument). +* `condition.className:` and `condition.method:` are both required for a meaningful directive. A `@condition` whose reference resolves to no method (missing `className:` or `method:`) surfaces as `field '<name>' @condition: ...` or `argument '<name>' @condition: ...`. +* `argMapping:` is *supported* on `@condition` (unlike on `@externalField`, `@enum`, `@sourceRow`). Use it to rebind a GraphQL argument name to a differently-named Java parameter, the rewrite carries the mapping into the reflected method's parameter list. +* `contextArguments:` values must already be wired into the runtime `GraphQLContext` map, the rewrite passes the listed keys through unmodified. A typo here surfaces as a `null` parameter at request time, not as a build error. +* Field-level `override: true` suppresses the implicit predicates from the field's direct arguments *and* from any `@table`-bound input nested under those arguments. Inner explicit `@condition` annotations on the input's fields are *preserved*, override does not cascade through them. (Divergence from the legacy generator: legacy semantics dropped them. The rewrite's behaviour is the intended one and `filmsOuterOverrideTableInput` pins it as a regression-fence.) +* Argument-level `override: true` is local: it suppresses the implicit `column = ?` for that one argument, nothing else. +* An input field carrying both `@nodeId(typeName: "X")` and `@condition` binds the condition method's table parameter to the FK-*target* table `X` (the table the decoded id identifies), reached through the catalog foreign key from the input's own table. The predicate is emitted as a correlated `EXISTS` over that foreign key, so the method receives an alias for `X` rather than the input's own table. Single-column and composite-key NodeType targets are both supported (the composite correlation ANDs every foreign-key column pair). This holds at every emission site: top-level query conditions, inline child-field fetchers, and `@splitQuery` batched fetchers. +* Nested input types must be carrier-mapped to flow through `@condition`. A `@table` input maps to a jOOQ record (only at the leaf, jOOQ records can not contain other records); a class-backed input maps to its Java record (and any input above it must also be a Java record). An input is class-backed when the Java parameter it flows into is that record type; leaving it without a carrier routes through the `PojoInputType` path, which still works for plain scalar paths. +* Listed nested input types (`[InnerInput]` inside an outer record) require a Java record carrier on the outer input, the rewrite needs a stable Java type for the list element. + +== See also + +* xref:reference.adoc[`@reference`] supplies catalog-driven joins that `@condition` can layer additional filtering on. +* xref:field.adoc[`@field(name: ...)`] is the column-binding axis, `@condition` and `@field` coexist on the same slot, `@field` drives the implicit predicate, `@condition` adds (or replaces) the explicit one. +* An input type's backing class determines the carrier the condition method reads from: xref:table.adoc[`@table`] supplies a jOOQ record, otherwise the carrier is the Java record the method parameter is typed as (inferred, not declared). +* xref:service.adoc[`@service`] is the alternative when a *whole* fetcher is custom code, `@condition` is for adjusting a single predicate inside an otherwise generated query. +* xref:../../how-to/condition-cascade.adoc[How-to: Stacking and overriding conditions] covers the override cascade rules, nested-input record conventions, and the divergence from legacy semantics. + +xref:../index.adoc[← Reference index] diff --git a/docs/manual/reference/directives/defaultOrder.adoc b/docs/manual/reference/directives/defaultOrder.adoc new file mode 100644 index 0000000000..0d52343def --- /dev/null +++ b/docs/manual/reference/directives/defaultOrder.adoc @@ -0,0 +1,101 @@ += @defaultOrder +:description: Set the fallback sort order for a field when no @orderBy argument is provided. +:!toc: + +Specifies a static `ORDER BY` for a field. When the field also carries an xref:orderBy.adoc[`@orderBy`] argument and the client supplies a value, the dynamic order wins; otherwise `@defaultOrder` applies. Without an explicit `@defaultOrder`, paginated fields default to ascending primary-key order. + +== SDL signature + +[source,graphql] +---- +directive @defaultOrder( + index: String, + fields: [FieldSort!], + primaryKey: Boolean = false, + direction: SortDirection = ASC +) on FIELD_DEFINITION + +input FieldSort { + name: String! + collate: String +} + +enum SortDirection { ASC, DESC } +---- + +== Parameters + +[cols="1,1,1,3",options="header"] +|=== +| Name | Type | Default | Description +| `index` | `String` | none | Name of a database index. The generator emits the index's column list as the sort specification. Requires `<includeIndexes>true</includeIndexes>` in the jOOQ generator. +| `fields` | `[FieldSort!]` | none | Explicit column list. Each `FieldSort` has a required `name` (the column on the field's parent table) and an optional `collate` (database-specific collation). +| `primaryKey` | `Boolean` | `false` | When `true`, sorts by the parent table's primary key columns in declaration order. Common choice for stable keyset pagination. +| `direction` | `SortDirection` | `ASC` | Sort direction applied to every column in the spec. `ASC` or `DESC`. +|=== + +Exactly one of `index`, `fields`, or `primaryKey` must be set. + +== Canonical example + +The example schema's connection fields default to primary-key order: + +[source,graphql] +---- +type Query { + stores: [Store!]! @asConnection @defaultOrder(primaryKey: true) + + filmsConnection( + first: Int, last: Int, after: String, before: String + ): FilmsConnection! @defaultOrder(primaryKey: true) + + filmsOrderedConnection( + rating: MpaaRating @field(name: "RATING"), + order: [FilmOrderBy] @orderBy, + first: Int, last: Int, after: String, before: String + ): FilmsConnection! @defaultOrder(primaryKey: true) +} +---- + +`stores` and `filmsConnection` have no `@orderBy` argument: every page is sorted by primary key. `filmsOrderedConnection` accepts a dynamic `order` argument; when the client omits it, the field falls back to `@defaultOrder(primaryKey: true)`. The keyset-pagination cursor binds to whichever order is active. + +Field-based with collation: + +[source,graphql] +---- +type Query { + customers(first: Int = 100, after: String): CustomerConnection + @defaultOrder(fields: [ + {name: "LAST_NAME", collate: "case_insensitive"}, + {name: "FIRST_NAME", collate: "case_insensitive"} + ]) +} +---- + +Index-based with descending direction: + +[source,graphql] +---- +type Query { + films(orderBy: FilmOrder @orderBy, first: Int = 100, after: String): FilmConnection + @defaultOrder(index: "IDX_TITLE", direction: DESC) +} +---- + +== Constraints + +* Exactly one of `index`, `fields`, or `primaryKey` must be set. Multiple or none fails the build. +* Applies to fields only. Apply it to the connection-bearing field, not the synthesised `Connection` / `Edge` types. +* When combined with xref:orderBy.adoc[`@orderBy`] on the same field, the client's argument value (when present) takes precedence; `@defaultOrder` is the fallback. +* `direction` is global across the spec. Per-column direction requires xref:orderBy.adoc[`@orderBy`] (the enum input carries its own `SortDirection`). +* `index` requires jOOQ index generation. `fields[].name` resolves against the field's return-type table, not the parent. +* Stable keyset pagination depends on the order being deterministic. `primaryKey: true` is the safe default; field-based orders need a tie-breaker (typically the PK) to avoid unstable cursors. + +== See also + +* xref:orderBy.adoc[`@orderBy`] supplies the dynamic counterpart. +* xref:order.adoc[`@order`] reuses the `index` / `fields` / `primaryKey` shape on enum values. +* xref:asConnection.adoc[`@asConnection`] for connection synthesis; `@defaultOrder` is required for stable pagination on synthesised connections. +* xref:../../how-to/sort-results.adoc[How-to: Sort results] covers tie-breakers, collation pitfalls, and pagination semantics. + +xref:../index.adoc[← Reference index] diff --git a/docs/manual/reference/directives/discriminate.adoc b/docs/manual/reference/directives/discriminate.adoc new file mode 100644 index 0000000000..d65e0492f9 --- /dev/null +++ b/docs/manual/reference/directives/discriminate.adoc @@ -0,0 +1,68 @@ += @discriminate +:description: Mark an interface or union as single-table polymorphic with a discriminator column. +:!toc: + +Declares that all rows of an interface (or union) live on a single jOOQ table and that one column tells the generator which subtype each row belongs to. Implementing objects pin themselves to that column's value via xref:discriminator.adoc[`@discriminator`]. The pair drives a single-table polymorphic fetcher: one `SELECT` against the shared table, branching by discriminator value at row-mapping time. + +Use xref:discriminator.adoc[`@discriminator`] together with this directive on every implementing type. For multi-table polymorphism (different tables per implementer), omit `@discriminate` entirely — the rewrite emits a multi-table fetcher when the interface has no discriminator column. + +== SDL signature + +[source,graphql] +---- +directive @discriminate(on: String!) on INTERFACE | UNION +---- + +== Parameters + +[cols="1,1,1,3",options="header"] +|=== +| Name | Type | Default | Description +| `on` | `String!` | (required) | Name of the column on the interface's `@table` that carries the discriminator value. Each implementing type's xref:discriminator.adoc[`@discriminator(value:)`] is matched against this column at row-mapping time. +|=== + +== Canonical example + +The example schema's `Content` interface is single-table polymorphic: all rows live in `content`, and `CONTENT_TYPE` selects the subtype. + +[source,graphql] +---- +interface Content @table(name: "content") @discriminate(on: "CONTENT_TYPE") { + contentId: Int! @field(name: "CONTENT_ID") + title: String! @field(name: "TITLE") +} + +type FilmContent implements Content @table(name: "content") @discriminator(value: "FILM") { + contentId: Int! @field(name: "CONTENT_ID") + title: String! @field(name: "TITLE") + length: Int @field(name: "LENGTH") + rating: MpaaRating @reference(path: [{key: "content_film_id_fkey"}]) @field(name: "RATING") +} + +type ShortContent implements Content @table(name: "content") @discriminator(value: "SHORT") { + contentId: Int! @field(name: "CONTENT_ID") + title: String! @field(name: "TITLE") + description: String @field(name: "SHORT_DESCRIPTION") +} +---- + +A query selecting `... on FilmContent { length }` and `... on ShortContent { description }` produces a single `SELECT content.content_id, content.title, content.length, content.short_description, content.content_type FROM content`; the row mapper inspects `content_type` per row and dispatches to the matching type. Subtype-only fields are read as nullable from the unified projection (the row mapper ignores them on the wrong subtype). + +Subtype-specific fields may pull from joined tables. `FilmContent.rating` reaches into `film` via `content_film_id_fkey`; the generator emits a conditional `LEFT JOIN` gated by `content_type = 'FILM'`, so non-`FILM` rows never trigger the join. + +== Constraints + +* The interface (or union) must carry xref:table.adoc[`@table`]; without it there is no shared table to branch on. +* The `on` column must exist on that table. The build fails if it does not resolve. +* Every implementing object must declare xref:discriminator.adoc[`@discriminator(value:)`]. Implementers without one are rejected at classify time. +* All implementers must share the interface's `@table` (single-table polymorphism). Implementers on a different table are rejected; for cross-table polymorphism, omit `@discriminate` and use the multi-table fetcher instead. +* `@discriminate` cannot be combined with disjoint-table union members. The same single-table requirement applies. + +== See also + +* xref:discriminator.adoc[`@discriminator`] is the per-implementer pair: it names the discriminator value that places a row in this subtype. +* xref:table.adoc[`@table`] establishes the shared table the discriminator column resolves against. +* xref:reference.adoc[`@reference`] for subtype-specific fields that pull from joined tables (such as `FilmContent.rating` in the example). +* xref:../../how-to/polymorphic-types.adoc[How-to: Polymorphic types] for the choice between single-table and multi-table fetchers. + +xref:../index.adoc[← Reference index] diff --git a/docs/manual/reference/directives/discriminator.adoc b/docs/manual/reference/directives/discriminator.adoc new file mode 100644 index 0000000000..55177d0d81 --- /dev/null +++ b/docs/manual/reference/directives/discriminator.adoc @@ -0,0 +1,63 @@ += @discriminator +:description: Pin an implementing object to a discriminator value on the shared @discriminate column. +:!toc: + +Tags an implementing object with the value its parent interface's xref:discriminate.adoc[`@discriminate(on:)`] column must hold for a row to belong to this subtype. Pairs with xref:discriminate.adoc[`@discriminate`] for single-table polymorphism. Without `@discriminate` on the interface there is nothing for the value to match against; without `@discriminator` on each implementer the row mapper has no way to assign rows. + +== SDL signature + +[source,graphql] +---- +directive @discriminator(value: String!) on OBJECT +---- + +== Parameters + +[cols="1,1,1,3",options="header"] +|=== +| Name | Type | Default | Description +| `value` | `String!` | (required) | The literal database value of the discriminator column that places a row in this subtype. Compared verbatim against the column at row-mapping time; case-sensitive. +|=== + +== Canonical example + +From the example schema's `Content` family: + +[source,graphql] +---- +interface Content @table(name: "content") @discriminate(on: "CONTENT_TYPE") { + contentId: Int! @field(name: "CONTENT_ID") + title: String! @field(name: "TITLE") +} + +type FilmContent implements Content @table(name: "content") @discriminator(value: "FILM") { + contentId: Int! @field(name: "CONTENT_ID") + title: String! @field(name: "TITLE") + length: Int @field(name: "LENGTH") + rating: MpaaRating @reference(path: [{key: "content_film_id_fkey"}]) @field(name: "RATING") +} + +type ShortContent implements Content @table(name: "content") @discriminator(value: "SHORT") { + contentId: Int! @field(name: "CONTENT_ID") + title: String! @field(name: "TITLE") + description: String @field(name: "SHORT_DESCRIPTION") +} +---- + +Each implementer also carries `@table(name: "content")` (the same table as the interface) and `@discriminator(value: ...)`. At row-mapping time the fetcher reads `content_type`; rows where `content_type = 'FILM'` map to `FilmContent`, rows where `content_type = 'SHORT'` map to `ShortContent`. Rows with any other discriminator value fail to map and surface as a runtime error. + +== Constraints + +* `@discriminator` is only meaningful on objects that implement an interface decorated with xref:discriminate.adoc[`@discriminate`]. The build rejects it on objects whose implemented interfaces have no discriminator column. +* The implementer's xref:table.adoc[`@table`] must match the interface's xref:table.adoc[`@table`]. Mixing tables breaks single-table polymorphism. +* `value` is matched verbatim against the database column; quoting and case must match the stored value exactly. +* Each implementer of a single `@discriminate` interface should declare a distinct `value`. Two implementers sharing the same value collapse to one branch and the second is unreachable. +* The directive applies only to `OBJECT`; interfaces and unions cannot carry `@discriminator`. + +== See also + +* xref:discriminate.adoc[`@discriminate`] is the interface-side counterpart that names the column. +* xref:table.adoc[`@table`] establishes the shared table. +* xref:../../how-to/polymorphic-types.adoc[How-to: Polymorphic types] covers single-table vs multi-table layouts and discriminator-value pitfalls. + +xref:../index.adoc[← Reference index] diff --git a/docs/manual/reference/directives/enum.adoc b/docs/manual/reference/directives/enum.adoc new file mode 100644 index 0000000000..e525a29585 --- /dev/null +++ b/docs/manual/reference/directives/enum.adoc @@ -0,0 +1,52 @@ += @enum +:description: Bind a GraphQL enum type to a Java enum class via a jOOQ converter. +:!toc: + +Maps a GraphQL `enum` type to a Java enum class through a jOOQ converter. Pairs with the schema's database-bound enum columns: jOOQ's converter materialises rows as the Java enum, the GraphQL layer presents the same shape, and Graphitron generates the GraphQL ↔ Java translation. This is the type-level alternative to per-value xref:field.adoc[`@field`] mapping (which targets a column literal per `ENUM_VALUE`). + +== SDL signature + +[source,graphql] +---- +directive @enum(enumReference: ExternalCodeReference!) on ENUM +---- + +== Parameters + +[cols="1,1,1,3",options="header"] +|=== +| Name | Type | Default | Description +| `enumReference` | `ExternalCodeReference!` | (required) | Points at the Java enum class (or a jOOQ converter for it). The directive uses `className:` (and optionally `method:`); other `ExternalCodeReference` slots are structurally inert. `argMapping:` is rejected at parse time. +|=== + +== Canonical example + +A GraphQL enum mapped to a Java enum class via a jOOQ converter: + +[source,graphql] +---- +enum Mood @enum(enumReference: {className: "no.sikt.graphitron.codereferences.dummyreferences.MoodEnum"}) { + HAPPY + SAD +} +---- + +Each member of the GraphQL `Mood` enum is paired with the same-named constant on `MoodEnum` at code-generation time. At read time the converter produces a `MoodEnum` instance from the column's stored representation; at write time the Java constant is converted back. Mismatches between the GraphQL enum members and the Java enum's constants surface as a build-time validation error. + +`className:` must be a fully-qualified class name; the carrying artifact must be on the rewrite Maven plugin's classpath (`<dependencies>` of the `<plugin>` block). + +== Constraints + +* The argument is required; graphql-java rejects a no-arg `@enum` at parse time. Mirrors xref:service.adoc[`@service`], `@tableMethod`, and `@externalField`, which all take `ExternalCodeReference!`. +* `argMapping:` on the `enumReference` is structurally inert and is rejected at parse time with "argMapping is not supported on `@enum`". `@enum` does not consume GraphQL-argument-bound parameters. +* Each GraphQL enum member must correspond to a Java constant of the same name on the referenced class. Missing or extra constants fail the build. +* `@enum` is mutually exclusive with per-value xref:field.adoc[`@field`]: declare `@enum` on the type for converter-based mapping, or `@field(name: ...)` on each `ENUM_VALUE` for column-literal mapping. Don't mix the two on the same enum. +* Applies only to GraphQL `enum` types. The directive on any other site is rejected. + +== See also + +* xref:field.adoc[`@field`] on `ENUM_VALUE` is the alternative axis: a per-member literal binding (`@field(name: "DB_VALUE")`) without a converter. +* `ExternalCodeReference` is the shared shape across xref:service.adoc[`@service`], `@tableMethod`, `@externalField`, and `@enum`. Only `className`/`method` carry meaning here. +* xref:../../how-to/external-code.adoc[How-to: Wiring external Java code] covers the rewrite plugin's classpath setup and the FQCN requirement. + +xref:../index.adoc[← Reference index] diff --git a/docs/manual/reference/directives/error.adoc b/docs/manual/reference/directives/error.adoc new file mode 100644 index 0000000000..348e48e8b4 --- /dev/null +++ b/docs/manual/reference/directives/error.adoc @@ -0,0 +1,119 @@ += @error +:description: Map specific Java exceptions to a GraphQL error type carried by a service payload's errors channel. +:!toc: + +Marks a GraphQL `OBJECT` type as the typed home for one or more Java exceptions. When a xref:service.adoc[`@service`]-returned payload exposes an `errors:` field of an `@error` type (or a `union` of `@error` types), the rewrite generates an *error channel*: at runtime the service method's exception is caught, matched against the type's `handlers:`, and the matched type is appended to the payload's `errors` list. + +`@error` is the entry point to Graphitron's "errors-as-data" path. It contrasts with throwing: a thrown exception ends the resolver; a mapped exception flows through the GraphQL response as a typed error alongside the rest of the data. + +== SDL signature + +[source,graphql] +---- +directive @error(handlers: [ErrorHandler!]!) on OBJECT + +input ErrorHandler { + handler: ErrorHandlerType! # GENERIC | DATABASE | VALIDATION + className: String # FQCN of the exception (required for GENERIC; defaults to org.jooq.exception.DataAccessException for DATABASE) + code: String # Vendor-specific DB error code (DATABASE only) + sqlState: String # Standardized SQL state (DATABASE only) + matches: String # Substring the exception message must contain + description: String # Override message returned to the client +} + +enum ErrorHandlerType { GENERIC, DATABASE, VALIDATION } +---- + +== Parameters + +[cols="1,1,1,3",options="header"] +|=== +| Name | Type | Default | Description +| `handlers` | `[ErrorHandler!]!` | (required) | One or more handler entries describing which Java exceptions map to this error type. Multiple entries on a single type are an "OR" — any matching entry assigns the exception to this type. The first entry whose criteria match (across all `@error` types reachable from the same channel) wins. +|=== + +`ErrorHandler` fields: + +[cols="1,1,3",options="header"] +|=== +| Field | Required | Description +| `handler` | yes | Selector. `DATABASE` matches `org.jooq.exception.DataAccessException` (or a configured subclass) by `code`/`sqlState`/`matches`. `GENERIC` matches by `className` plus optional `matches`. `VALIDATION` matches Bean Validation failures. +| `className` | for `GENERIC` | Fully qualified exception class name. Required for `GENERIC`; defaults to `org.jooq.exception.DataAccessException` for `DATABASE`; ignored for `VALIDATION`. +| `code` | no (`DATABASE` only) | Vendor-specific error code as returned by `SQLException.getErrorCode()`. PostgreSQL always returns `0`; Oracle uses meaningful codes. Pair with `sqlState` when matching across vendors. +| `sqlState` | no (`DATABASE` only) | Standardized SQL state from `SQLException.getSQLState()` (e.g. `"23503"` for foreign-key violation, `"23514"` for check-constraint violation). +| `matches` | no | Substring the exception message must contain. Useful to narrow a broad `className` or `sqlState` to one specific error. +| `description` | no | Static error message returned to the client. Defaults to the exception's `getMessage()`. +|=== + +== Canonical example + +A service payload with a typed errors channel: + +[source,graphql] +---- +# FilmPayload is backed by com.example.FilmPayload, the return type of the +# createFilm @service method below; no directive declares the binding. +type FilmPayload { + film: Film + errors: [FilmError] +} + +union FilmError = YearOutOfRange | NotAllowed | DbError + +type YearOutOfRange @error(handlers: [ + {handler: DATABASE, sqlState: "23514", matches: "year_check", + description: "Release year must be between 1901 and 2155"} +]) { + path: [String!]! + message: String! +} + +type NotAllowed @error(handlers: [ + {handler: GENERIC, className: "com.example.NotAllowedException", + description: "You are not allowed to do this"} +]) { + path: [String!]! + message: String! +} + +type DbError @error(handlers: [ + {handler: DATABASE, sqlState: "23503"} +]) { + path: [String!]! + message: String! +} + +type Mutation { + createFilm(input: CreateFilmInput!): FilmPayload @service(service: {className: "com.example.FilmService"}) +} +---- + +When the service method throws a `DataAccessException` whose `sqlState` is `23514` and whose message contains `year_check`, the rewrite catches it, builds a `YearOutOfRange` instance with `message = description` (or the exception's own message when `description:` is absent), and appends it to `FilmPayload.errors`. The `data` field still streams to the client; only `film` is `null` for that request. + +`VALIDATION` handles a Bean-Validation failure raised before the service method runs: + +[source,graphql] +---- +type ValidationErr @error(handlers: [{handler: VALIDATION}]) { + path: [String!]! + message: String! +} +---- + +== Constraints + +* `@error` only takes effect when the type appears as (or in a union behind) an `errors:` field on a payload reachable from a xref:service.adoc[`@service`] field. A standalone `@error` type with no carrier is rejected at classify time. +* The handler list is order-insensitive within a type; across types of the same channel, ties are broken by handler-tuple equality. Two `@error` types declaring the same handler tuple (same `handler`, `className`, `code`, `sqlState`, `matches`) collapse — the second is unreachable. The build rejects duplicate tuples. +* `matches:` makes two otherwise-identical handlers distinct: `(GENERIC, IllegalArgumentException, matches: "foo")` and `(GENERIC, IllegalArgumentException)` (no `matches`) are both reachable, with the more-specific match running first. +* For `GENERIC`, `className:` is required. The build rejects a `GENERIC` handler without it. +* For `DATABASE`, supply at least one of `code:`, `sqlState:`, or `matches:` (otherwise every `DataAccessException` on the channel routes to this type, which is rarely the intent). +* `code:` and `sqlState:` may be combined; both must match on the exception. Vendor portability: prefer `sqlState` (PostgreSQL is specific, Oracle is generic) or pair both with a `matches:` substring. +* Applies only to `OBJECT`. Interfaces and unions cannot carry `@error` directly — the union-of-error-types pattern works because the union *members* are individually `@error`-decorated. + +== See also + +* xref:service.adoc[`@service`] is the upstream of the errors channel: only service-returned payloads carry one. +* The payload type that exposes the `errors:` field is class-backed, its backing class inferred from the xref:service.adoc[`@service`] method's return type. +* xref:../../how-to/error-channel.adoc[How-to: The errors channel] covers union vs single-type carriers, `description:` vs exception message, and the `path:` slot's contents. + +xref:../index.adoc[← Reference index] diff --git a/docs/manual/reference/directives/externalField.adoc b/docs/manual/reference/directives/externalField.adoc new file mode 100644 index 0000000000..be01f574d8 --- /dev/null +++ b/docs/manual/reference/directives/externalField.adoc @@ -0,0 +1,102 @@ += @externalField +:description: Resolve a field's value with a developer-supplied static method that returns a jOOQ Field, in lieu of a column or join. +:!toc: + +Marks a field as resolved by a static Java method instead of by direct column projection or by a `@reference` join. The method takes the parent table's jOOQ class as its sole argument and returns a `Field<T>` whose `T` matches the GraphQL scalar; the rewrite drops the returned `Field` into the parent's `SELECT` clause at the field's slot. The method name defaults to the GraphQL field name when `method:` is omitted from the reference, removing ceremony from the common case. + +`@externalField` is the seam for custom column-shaped logic: computed booleans, derived strings, vendor-specific SQL expressions, and jOOQ `Row.convertFrom(...)` lifts that fabricate typed records (e.g. lifting an FK column into a `Field<TableRecord<?>>` that subsequent child fields read through). It contrasts with xref:reference.adoc[`@reference`] (which traverses an FK chain) and with xref:service.adoc[`@service`] (which calls into a service for the entire payload): `@externalField` produces a single `Field<T>` and that's all. + +== SDL signature + +[source,graphql] +---- +directive @externalField(reference: ExternalCodeReference!) on FIELD_DEFINITION +---- + +== Parameters + +[cols="1,1,1,3",options="header"] +|=== +| Name | Type | Default | Description +| `reference` | `ExternalCodeReference` | (required) | Points at the static Java method that produces the field's `Field<T>`. `className:` is required; `method:` defaults to the GraphQL field name when omitted. `argMapping:` on this reference is structurally inert and is rejected at parse time, the method's only formal parameter is the parent table's jOOQ class. +|=== + +== Canonical examples + +A computed boolean derived from a column on the parent table. The method name is omitted because it equals the GraphQL field name: + +[source,graphql] +---- +type Film @table(name: "film") { + isEnglish: Boolean @externalField(reference: { + className: "com.example.FilmExtensions" + }) +} +---- + +[source,java] +---- +public final class FilmExtensions { + public static Field<Boolean> isEnglish(Film film) { + return DSL.iif(film.ORIGINAL_LANGUAGE_ID.eq(1), inline(true), inline(false)); + } +} +---- + +A `Field<TableRecord<?>>` lift via `DSL.row(...).convertFrom(...)`. The lifted `FilmRecord` carries only the PK column, child fields on the resulting class-backed type read from the lifted record and the framework batch-fetches non-PK columns as needed. The backing class is the `Field<X>` element type the lift method returns; no directive declares it: + +[source,graphql] +---- +type Inventory @table(name: "inventory") { + inventoryId: Int! @field(name: "INVENTORY_ID") + filmRef: FilmCard @externalField(reference: { + className: "com.example.InventoryExtensions", + method: "filmRef" + }) +} + +# FilmCard is backed by com.example.jooq.tables.records.FilmRecord, the element +# type of the Field<TableRecord<?>> the filmRef lift returns. +type FilmCard { + filmId: Int @field(name: "film_id") +} +---- + +A `Field<CustomJavaRecord>` lift returning a developer-defined record whose canonical accessor returns a typed jOOQ record. The classifier auto-derives an `AccessorKeyedSingle` batch key from the typed accessor, so a child `@table`-returning field on the wrapper resolves through a `DataLoader` keyed on the lifted record's PK: + +[source,graphql] +---- +type Inventory @table(name: "inventory") { + filmCardData: FilmCardWrapper @externalField(reference: { + className: "com.example.InventoryExtensions", + method: "filmCardData" + }) +} + +# FilmCardWrapper is backed by com.example.services.FilmCardData, the element +# type of the Field<CustomJavaRecord> the filmCardData lift returns. +type FilmCardWrapper { + film: Film +} +---- + +== Constraints + +* The parent type must be `@table`-bound. The static method's sole formal parameter is the parent table's jOOQ class; without that anchor, reflection has no shape to bind. +* The GraphQL field name must not collide with a real SQL column on the parent table. The wiring side resolves the field by name via `DSL.field("<name>")` against the result `Record`, a collision shadows the actual column. Rename the field or use xref:field.adoc[`@field(name: ...)`] to disambiguate. +* `className:` is required on the reference. A bare `@externalField` (no `reference:`, or a reference with no `className:`) surfaces as `external field reference could not be resolved — missing className`. +* `method:` is optional. When omitted, the rewrite uses the GraphQL field name as the static-method name. Set `method:` only when the two diverge. +* `argMapping:` on the `reference` is structurally inert and rejected at parse time. `@externalField` consumes no GraphQL-argument-bound parameters. +* The static method must return `Field<T>` where `T` matches the GraphQL scalar, or one of the lift forms (`Field<TableRecord<?>>`, `Field<CustomJavaRecord>`) when the field's GraphQL type is class-backed. +* `className:` must be a fully-qualified class name reachable on the rewrite Maven plugin's classpath (declare the carrying artifact under `<dependencies>` of the plugin's `<plugin>` block). Reflection failures surface as `external field reference could not be resolved — <reflection error>`. +* Combining `@externalField` with a `@reference` path (the condition-join lift form) is not yet supported; the build rejects this with a deferred-validation error. + +== See also + +* xref:reference.adoc[`@reference`] is the FK-driven counterpart, choose it when the value comes from a chain of catalog joins, choose `@externalField` when the value is a custom expression or a typed lift. +* A class-backed type is the natural target for the `Field<TableRecord<?>>` and `Field<CustomJavaRecord>` lift forms; the lift's element type supplies the backing class. See xref:record.adoc[`@record`] for why the directive that used to declare it is now ignored. +* xref:field.adoc[`@field(name: ...)`] disambiguates the GraphQL-field-vs-SQL-column alias when names collide. +* xref:../../how-to/computed-fields.adoc[How-to: Computed fields with `@externalField`] is the operational recipe; it walks the `(ParentTable) -> Field<T>` signature, the three return shapes (scalar, `Field<TableRecord<?>>`, `Field<CustomJavaRecord>`), and the canonical fixtures. +* xref:../../how-to/external-code.adoc[How-to: Wire external Java code] covers the rewrite plugin's classpath setup, the FQCN requirement, and the method-name default shared with `@service`, `@condition`, and the other external-code directives. + +xref:../index.adoc[← Reference index] diff --git a/docs/manual/reference/directives/field.adoc b/docs/manual/reference/directives/field.adoc new file mode 100644 index 0000000000..9abfcbfd6a --- /dev/null +++ b/docs/manual/reference/directives/field.adoc @@ -0,0 +1,106 @@ += @field +:description: Bind a GraphQL slot to a specific column, argument target, or enum value. +:!toc: + +Names the underlying-binding target for a GraphQL slot. The axis is determined by the directive site: column on a field or input field, column on a filter argument, database string (or Java enum constant) on an enum value. + +== SDL signature + +[source,graphql] +---- +directive @field(name: String!) on FIELD_DEFINITION | ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION | ENUM_VALUE +---- + +== Parameters + +[cols="1,1,1,3",options="header"] +|=== +| Name | Type | Default | Description +| `name` | `String!` | (required) | The target identifier. Resolves as a column name on `FIELD_DEFINITION`, `ARGUMENT_DEFINITION`, and `INPUT_FIELD_DEFINITION`; resolves as the database string (or, where applicable, the Java enum constant) on `ENUM_VALUE`. The literal value `$source` is also admitted at one specific site; see <<root-value-sigil>>. +|=== + +== Canonical example + +The tutorial's `Customer` type uses `@field` on every scalar to map GraphQL camelCase to PostgreSQL `snake_case`: + +[source,graphql] +---- +type Customer @table(name: "customer") { + firstName: String! @field(name: "FIRST_NAME") + lastName: String! @field(name: "LAST_NAME") + email: String @field(name: "EMAIL") + activebool: Boolean! @field(name: "ACTIVEBOOL") +} +---- + +A query selecting `firstName lastName` produces `SELECT customer.first_name AS "firstName", customer.last_name AS "lastName"`. The selection set drives the projection: ask only for `firstName` and the SELECT shrinks to one column. + +On an *argument*, `@field` steers the column the filter binds to when the GraphQL argument name doesn't match the column name. From `Query.customers`: + +[source,graphql] +---- +type Query { + customers(active: Boolean @field(name: "ACTIVEBOOL")): [Customer!]! +} +---- + +Without the directive, the generator would look up a column called `active` on the `customer` table. Sakila's `customer` table happens to have one (an unused integer flag), so the filter would silently bind to the wrong column. `@field(name: "ACTIVEBOOL")` pins it to the right one. + +On an *input field* (a mutation), `@field` plays the same role: + +[source,graphql] +---- +input FilmCreateInput @table(name: "film") { + title: String! @field(name: "title") + languageId: Int! @field(name: "language_id") +} +---- + +The `INSERT` writes `title` and `language_id`; the GraphQL camelCase never reaches SQL. + +On an *enum value*, `@field` maps the GraphQL value to the database string the value should encode as. See xref:../../how-to/map-types-to-tables.adoc[the mapping how-to] for the enum case. + +[[root-value-sigil]] +== Root-value sigil: `$source` + +In addition to a column or accessor name, the `name` argument admits one sigil literal: `$source`. It binds the SDL field to the upstream Java value taken as a whole, rather than to a member of it. + +The sigil is admitted at exactly one site: the data field of a carrier-payload type returned by a xref:service.adoc[`@service`]-backed mutation. Anywhere else, `@field(name: "$source")` is rejected. + +[source,graphql] +---- +type Film @table(name: "film") { + title: String +} + +type FilmListPayload { + films: [Film!] @field(name: "$source") +} + +type Mutation { + runFilms: FilmListPayload + @service(service: {className: "com.example.FilmService", method: "getFilms"}) +} +---- + +If `FilmService.getFilms` returns `List<FilmRecord>` (or `Result<FilmRecord>`), the `films` data field on the carrier payload is bound to that return value directly. The directive is a no-op confirmation of a binding the generator would otherwise infer implicitly; writing it makes the intent explicit and decouples the SDL slot name from the producer method's signature. + +The producer's reflected return type must match the SDL element's backing class. For a table-backed element, the producer must return the table's record class (or `List<RecordClass>` / `Result<RecordClass>` when the SDL field is list-shaped); for a class-backed element, the producer must return that backing class with the same list-shape discipline. (The producer's reflected return type is itself what supplies the backing class; the match is between the element's already-bound class and the producer that bound it.) Mismatches fail the build with a typed message naming the producer and both types. + +Unknown sigils are rejected at parse time: `@field(name: "$foo")` fails with `Unknown sigil '$foo' on @field(name:); allowed: $source`. The sigil at a non-admitted site fails with a message naming the only valid site. + +== Constraints + +* The `name` parameter is required; graphql-java rejects a no-arg `@field` at parse time. +* The target identifier must resolve in the surrounding `@table`'s jOOQ catalog. The generator fails the build if the column does not exist. +* When the GraphQL slot name and the target identifier match (case-insensitively), the directive is unnecessary. The example schema applies it explicitly anyway because mismatches are common in PostgreSQL projects and explicit binding keeps drift detectable. + +== See also + +* xref:../../tutorial/02-first-schema.adoc[Tutorial page 2: The starter schema] for `@field` on regular type fields. +* xref:../../tutorial/03-first-query.adoc[Tutorial page 3: Running your first query] explains the `@field` argument-collision case. +* xref:table.adoc[`@table`] establishes the jOOQ table context that `@field` resolves against. +* xref:service.adoc[`@service`] for the mutation form that produces a carrier-payload type whose data field admits `$source`. +* xref:../../how-to/map-types-to-tables.adoc[How-to: Map types to tables] for enum-value mappings and other patterns. + +xref:../index.adoc[← Reference index] diff --git a/docs/manual/reference/directives/index-directive.adoc b/docs/manual/reference/directives/index-directive.adoc new file mode 100644 index 0000000000..49b98da3ab --- /dev/null +++ b/docs/manual/reference/directives/index-directive.adoc @@ -0,0 +1,62 @@ += @index (deprecated) +:description: Legacy single-purpose alias for @order(index:). Migrate to @order. +:!toc: + +[CAUTION] +==== +*Deprecated.* `@index` exists for backward compatibility with schemas predating xref:order.adoc[`@order`]. New code must use `@order(index: "...")` instead. The framework still recognises `@index` and routes it to the same generator path, but the directive surface, error messages, and how-to pages all assume `@order`. +==== + +Connects an enum value to a database index by name. Functionally identical to `@order(index: "...")` with no additional capabilities; the rename happened when xref:order.adoc[`@order`] generalised the surface to include `fields:` and `primaryKey:`. + +== SDL signature + +[source,graphql] +---- +directive @index(name: String) on ENUM_VALUE +---- + +== Parameters + +[cols="1,1,1,3",options="header"] +|=== +| Name | Type | Default | Description +| `name` | `String` | none | Name of the database index on the enum's parent table (resolved via the xref:orderBy.adoc[`@orderBy`] argument that references this enum). Identical semantics to xref:order.adoc[`@order`'s `index`]. +|=== + +== Canonical example + +[source,graphql] +---- +# Legacy +enum FilmOrderByField { + LANGUAGE @index(name: "IDX_FK_LANGUAGE_ID") + TITLE @index(name: "IDX_TITLE") +} + +# Equivalent, modern +enum FilmOrderByField { + LANGUAGE @order(index: "IDX_FK_LANGUAGE_ID") + TITLE @order(index: "IDX_TITLE") +} +---- + +The two forms generate identical code. The migration is a mechanical rename plus a parameter shape change (`name:` becomes `index:`). + +== Constraints + +* Applies only to enum values, like xref:order.adoc[`@order`]. +* `name` must resolve to an existing database index when jOOQ index generation is enabled. The same "no matching index" error fires as for xref:order.adoc[`@order(index:)`]. +* `@index` and xref:order.adoc[`@order`] cannot both decorate the same enum value. +* Cannot express the field-based or primary-key sorting modes available on xref:order.adoc[`@order`]. Schemas that need those modes must migrate. + +== Migration + +Replace each `@index(name: "X")` with `@order(index: "X")`. No runtime behaviour changes; only the directive name and parameter key. + +== See also + +* xref:order.adoc[`@order`] is the supported replacement. +* xref:orderBy.adoc[`@orderBy`] is the entry point for both forms. + +xref:../index.adoc[← Reference index] diff --git a/docs/manual/reference/directives/index.adoc b/docs/manual/reference/directives/index.adoc new file mode 100644 index 0000000000..700bc2493e --- /dev/null +++ b/docs/manual/reference/directives/index.adoc @@ -0,0 +1,70 @@ += Directive reference +:description: Every directive in the rewrite, alphabetically and by category. +:!toc: + +Authoritative descriptions of every directive in the rewrite's `directives.graphqls`. Each directive page carries its SDL signature, parameter table, canonical examples from the Sakila example schema, constraints, and cross-links to the recipes and explanation pages that frame it. + +[cols="1,1",frame=none,grid=none] +|=== +a| +== Alphabetical + +* xref:asConnection.adoc[`@asConnection`] +* xref:condition.adoc[`@condition`] +* xref:defaultOrder.adoc[`@defaultOrder`] +* xref:discriminate.adoc[`@discriminate`] +* xref:discriminator.adoc[`@discriminator`] +* xref:enum.adoc[`@enum`] +* xref:error.adoc[`@error`] +* xref:externalField.adoc[`@externalField`] +* xref:field.adoc[`@field`] +* xref:index-directive.adoc[`@index`] _(deprecated, use `@order(index:)`)_ +* xref:lookupKey.adoc[`@lookupKey`] +* xref:multitableReference.adoc[`@multitableReference`] _(rejected, remove from the schema)_ +* xref:mutation.adoc[`@mutation`] +* xref:node.adoc[`@node`] +* xref:nodeId.adoc[`@nodeId`] +* xref:notGenerated.adoc[`@notGenerated`] _(rejected, remove from the schema)_ +* xref:order.adoc[`@order`] +* xref:orderBy.adoc[`@orderBy`] +* xref:record.adoc[`@record`] _(deprecated, ignored, remove from the schema)_ +* xref:reference.adoc[`@reference`] +* xref:routine.adoc[`@routine`] +* xref:scalarType.adoc[`@scalarType`] +* xref:service.adoc[`@service`] +* xref:splitQuery.adoc[`@splitQuery`] +* xref:table.adoc[`@table`] + +a| +== By category + +*Mapping* + +xref:table.adoc[`@table`], xref:field.adoc[`@field`], xref:enum.adoc[`@enum`], xref:scalarType.adoc[`@scalarType`] + +*Joining* + +xref:reference.adoc[`@reference`] + +*Querying* + +xref:asConnection.adoc[`@asConnection`], xref:condition.adoc[`@condition`], xref:externalField.adoc[`@externalField`], xref:lookupKey.adoc[`@lookupKey`], xref:routine.adoc[`@routine`], xref:splitQuery.adoc[`@splitQuery`] + +*Mutating* + +xref:mutation.adoc[`@mutation`], xref:service.adoc[`@service`] + +*Sorting* + +xref:orderBy.adoc[`@orderBy`], xref:order.adoc[`@order`], xref:defaultOrder.adoc[`@defaultOrder`], xref:index-directive.adoc[`@index`] (deprecated) + +*Error handling* + +xref:error.adoc[`@error`] + +*Polymorphism* + +xref:discriminate.adoc[`@discriminate`], xref:discriminator.adoc[`@discriminator`] + +*Global ID* + +xref:node.adoc[`@node`], xref:nodeId.adoc[`@nodeId`] + +*Rejected by the rewrite* + +xref:notGenerated.adoc[`@notGenerated`], xref:multitableReference.adoc[`@multitableReference`] (remove from the schema) + +|=== + +xref:../index.adoc[← Reference index] diff --git a/docs/manual/reference/directives/lookupKey.adoc b/docs/manual/reference/directives/lookupKey.adoc new file mode 100644 index 0000000000..54953ac090 --- /dev/null +++ b/docs/manual/reference/directives/lookupKey.adoc @@ -0,0 +1,65 @@ += @lookupKey +:description: Mark arguments or input fields as batch-lookup keys so a single query returns one result per input position. +:!toc: + +Promotes a query into a batch-lookup: the client sends a list of key values and the resolver returns a list of results in the same order, with `null` for unmatched positions. The generator emits a `VALUES`-derived table joined against the target table so all keys resolve in a single round trip. + +== SDL signature + +[source,graphql] +---- +directive @lookupKey on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION +---- + +`@lookupKey` takes no parameters; presence on an argument or input field is the entire signal. + +== Canonical example + +The example schema's root lookups cover the common shapes: + +[source,graphql] +---- +type Query { + filmById(film_id: [ID] @lookupKey): [Film!]! + + languageByKey(language_id: [Int] @lookupKey @field(name: "language_id")): [Language!]! + + customerById(customer_id: [ID] @lookupKey, store_id: ID @lookupKey): [Customer!]! + + filmActorsByKey(key: [FilmActorKey!]! @lookupKey): [FilmActor!]! +} + +input FilmActorKey { + filmId: Int! @field(name: "film_id") @lookupKey + actorId: Int! @field(name: "actor_id") @lookupKey +} +---- + +`filmById` keys on a single scalar list. `customerById` shows two correlated keys: each pair `(customer_id[i], store_id[i])` matches one row. `filmActorsByKey` wraps a composite key in an input type, with `@lookupKey` re-applied per leaf field; the generator builds `VALUES(idx, film_id, actor_id)` and joins on both PK columns. Unmatched keys surface as `null` at the corresponding output index. + +A client query against `filmById`: + +[source,graphql] +---- +query { + filmById(film_id: ["1", "999999", "2"]) { title } +} +---- + +returns three positions in input order: `{ title: "ACADEMY DINOSAUR" }`, `null`, `{ title: "ACE GOLDFINGER" }`. + +== Constraints + +* Keys must be one-dimensional lists. Two layers of lists (e.g. `[InList] @lookupKey` where `InList { field: [String] }`) is rejected: the lookup operates over a flat keyset. +* Multiple `@lookupKey` arguments at the same call site must have the same length, and values at the same index are correlated. Wrap them in an input type when the framework should enforce that pairing. +* `@lookupKey` on an input type (the argument itself) applies to every leaf scalar field of that input. `@lookupKey` on an individual input field applies only to that field; the rest of the input behaves normally. +* Keys should uniquely identify a row. If multiple rows match the same key, only one is returned. +* Only arguments on root-level fields (or on their referenced input types) may be keys. The xref:mutation.adoc[`@mutation`] directive uses `@lookupKey` separately to identify the row to `UPDATE`, `DELETE`, or `UPSERT`; that's a distinct use of the same directive on `INPUT_FIELD_DEFINITION`. + +== See also + +* xref:mutation.adoc[`@mutation`] uses `@lookupKey` on input fields to identify the target row for `UPDATE`, `DELETE`, and `UPSERT`. +* xref:../../how-to/batch-lookups.adoc[How-to: Batch lookups] covers correlated-key shapes, NodeId-keyed lookups, and `@splitQuery` interactions. +* xref:../../tutorial/05-mutations.adoc[Tutorial page 5: A first mutation] uses `@lookupKey` on the `UPDATE` input to identify the target row. + +xref:../index.adoc[← Reference index] diff --git a/docs/manual/reference/directives/multitableReference.adoc b/docs/manual/reference/directives/multitableReference.adoc new file mode 100644 index 0000000000..c2304294af --- /dev/null +++ b/docs/manual/reference/directives/multitableReference.adoc @@ -0,0 +1,52 @@ += @multitableReference +:description: Legacy directive that declared per-implementation join paths for multi-table interface/union fields. The rewrite no longer supports it; remove it from the schema. +:!toc: + +`@multitableReference` was the legacy generator's escape hatch for fields returning a multi-table interface or union, where a single FK path could not describe the join because each implementation lived in a different table. The schema author declared a separate `@reference`-shaped `routes` entry per implementation type. The rewrite no longer supports the directive: multi-table interface dispatch is generated from xref:discriminate.adoc[`@discriminate`] / xref:discriminator.adoc[`@discriminator`] (with xref:reference.adoc[`@reference`] for the FK-driven join), without a separate per-route description. + +The directive name is still parsed (so existing schemas don't fail with "unknown directive `@multitableReference`"), but every application is rejected at classify time with a clear message: `@multitableReference is no longer supported. Remove the directive; the rewrite generates multi-table interface dispatch from @discriminate / @discriminator without an explicit multitable-reference path.` Remove every occurrence from your schema and model the dispatch through `@discriminate` / `@discriminator`. + +== SDL signature + +[source,graphql] +---- +directive @multitableReference( + routes: [ReferencesForType!] +) on FIELD_DEFINITION +---- + +== Migration + +Drop the directive (and its `ReferencesForType` argument tree) and model the multi-table dispatch through `@discriminate` / `@discriminator`. xref:../../how-to/polymorphic-types.adoc[How-to: Polymorphic types] covers the supported shapes: + +* xref:discriminate.adoc[`@discriminate`] on the interface or union picks the right implementation per row. +* xref:discriminator.adoc[`@discriminator`] on the implementation declares the row-level discriminator value. +* xref:reference.adoc[`@reference`] on the field describes the FK-driven join (single hop, or multiple hops when the path traverses join tables). + +The rewrite resolves the per-implementation join paths automatically from `@reference` and the catalog's FK metadata; the schema author does not enumerate them. + +== Diagnostic + +Any application of `@multitableReference` produces a build-time rejection: + +[source,text] +---- +@multitableReference is no longer supported. Remove the directive; the rewrite generates multi-table interface dispatch from @discriminate / @discriminator without an explicit multitable-reference path. +---- + +The rejection fires before the rest of the field's classification runs, so the message is the first thing the build emits for that field. Schemas that still carry `@multitableReference` annotations must remove every occurrence to compile under the rewrite. + +== Constraints + +* Every application is rejected at build time, regardless of position. There is no "warn-only" mode and no migration shim, the surface is hard-removed. +* The directive is still *parsed* (the schema still validates against the SDL), so the migration is a one-step delete-and-rebuild, not a two-step "first remove, then add `@multitableReference` back later". +* The directive is mentioned in the rewrite's `directives.graphqls` SDL only because removing the declaration would cause "unknown directive" parse errors on legacy schemas. Once your schema is fully migrated, the declaration is purely cosmetic. + +== See also + +* xref:discriminate.adoc[`@discriminate`] and xref:discriminator.adoc[`@discriminator`] for the type-resolution mechanism that supersedes the per-route description. +* xref:reference.adoc[`@reference`] for the single-table FK-driven join. +* xref:../../how-to/polymorphic-types.adoc[How-to: Polymorphic types] covers union and interface patterns end-to-end. +* xref:../../how-to/migrating-from-legacy.adoc[How-to: Migrating from the legacy generator] covers the full directive-by-directive migration matrix, including the rejected-stub directives. + +xref:../index.adoc[← Reference index] diff --git a/docs/manual/reference/directives/mutation.adoc b/docs/manual/reference/directives/mutation.adoc new file mode 100644 index 0000000000..30ccd63d69 --- /dev/null +++ b/docs/manual/reference/directives/mutation.adoc @@ -0,0 +1,141 @@ += @mutation +:description: Flip a mutation resolver into INSERT, UPDATE, DELETE, or UPSERT against a @table-bound input. +:!toc: + +Marks a mutation field as fully generated, picks the SQL shape (`INSERT`, `UPDATE`, `DELETE`, `UPSERT`), and threads the response selection set through `RETURNING` so writes complete in a single round trip. + +== SDL signature + +[source,graphql] +---- +directive @mutation(typeName: MutationType!, multiRow: Boolean = false) on FIELD_DEFINITION + +enum MutationType { UPDATE, DELETE, INSERT, UPSERT } +---- + +== Parameters + +[cols="1,1,1,3",options="header"] +|=== +| Name | Type | Default | Description +| `typeName` | `MutationType!` | (required) | The SQL shape to emit. `INSERT` writes a row; `UPDATE` modifies the row identified by the input's primary-key-or-unique-key coverage; `DELETE` removes the row(s) identified the same way; `UPSERT` emits `INSERT … ON CONFLICT … DO UPDATE`. +| `multiRow` | `Boolean` | `false` | On `DELETE`, opts into a broadcast delete when the input covers no primary key or unique key (the filter may match more than one row). Rejected on `INSERT` (no `WHERE` clause), `UPDATE` (no broadcast shape; cover a key), and `UPSERT`. +|=== + +== Input shape + +A `@mutation` field takes exactly one `@table` input argument. Its fields bind to columns of that table (`@field(name:)`, or the SDL name by default). + +An input field may also be a plain input object with *no* `@table` directive: a grouping shape whose own fields map onto columns of the *same* table. The grouping carries no DML semantics; the leaves flatten onto the outer table as if declared at the top level, and absent-vs-null is honored independently at every nesting layer (an absent or `null` group skips its whole subtree; a present group descends per leaf). The tutorial's xref:../../tutorial/05-mutations.adoc#_grouping_fields_with_nested_input_types[Grouping fields with nested input types] walks a worked example. A nested input that is itself `@table`-backed (introducing a second DML target) is a separate compound-mutation shape and is not admitted here. + +== Canonical example + +The tutorial's three film mutations cover the three most common shapes: + +[source,graphql] +---- +input FilmCreateInput @table(name: "film") { + title: String! @field(name: "title") + languageId: Int! @field(name: "language_id") +} + +input FilmUpdateInput @table(name: "film") { + filmId: Int! @field(name: "film_id") + title: String! @field(name: "title") +} + +input FilmUpsertInput @table(name: "film") { + filmId: Int! @field(name: "film_id") + title: String! @field(name: "title") + languageId: Int! @field(name: "language_id") +} + +type Mutation { + createFilm(in: FilmCreateInput!): Film @mutation(typeName: INSERT) + updateFilm(in: FilmUpdateInput!): Film @mutation(typeName: UPDATE) + upsertFilm(in: FilmUpsertInput!): Film @mutation(typeName: UPSERT) +} +---- + +The `INSERT` shape produces: + +[source,sql] +---- +INSERT INTO film (title, language_id) + VALUES (?, ?) + RETURNING film.film_id AS "filmId", + film.title AS "title" +---- + +The `RETURNING` projection narrows to the response selection set: a mutation that asks for `{ filmId title }` retrieves only those columns; asking for `{ filmId title language { name } }` adds a JOIN through `@reference` and the `RETURNING` is wrapped in a `WITH` clause so the round-trip count stays at one. + +`UPDATE` identifies the target row by which input columns cover a primary key or unique key of the `@table` (inferred from the jOOQ catalog, no directive needed): the matched key's columns become the `WHERE` clause and the remaining input fields populate the `SET` clause. `UPSERT` adds `ON CONFLICT` keyed on the matched key's columns. + +`DELETE` identifies rows the same way (primary-key-or-unique-key coverage), but has no `SET` clause: *every* admitted input column is a `WHERE` filter, and the deleted row's primary key is returned through `RETURNING`. Extra input columns beyond the matched key add further `AND`ed predicates (they narrow the match, they don't move to a `SET` side). When the input covers no primary key or unique key, the DELETE is rejected at build time so a non-unique filter cannot silently broadcast; set `multiRow: true` on the `@mutation` directive to opt into a deliberate broadcast (non-key) delete that may remove more than one row. + +== Payload-returning DELETE + +`@mutation(typeName: DELETE)` supports two payload-carrier shapes. Both echo information about the rows the DML actually removed; neither projects non-primary-key columns from the deleted rows (the row is gone before the response can read it). + +=== Echoing the deleted primary key (recommended) + +The simplest payload returns the encoded NodeId of each deleted row: + +[source,graphql] +---- +type SlettRegelverksamlingPayload { + deletedIds: [ID!] # implicit @nodeId; encoder resolves against the input @table's @node +} + +extend type Mutation { + slettRegelverksamling(input: [RegelverksamlingDeleteInput!]!): SlettRegelverksamlingPayload + @mutation(typeName: DELETE) +} +---- + +The carrier field's element type must be `ID` (single DELETE) or `[ID!]` (bulk DELETE). The list wrapper must be list-of-non-null; `[ID]` (list-of-nullable) is rejected, because every element of a successful DELETE response is the encoded PK of an actually-deleted row, the slot cannot be null. The encoder is recognised implicitly when the input `@table` registers a `@node`. If the input `@table` is not `@node`-backed, the carrier is rejected with the same diagnostic as the bare-`ID` DELETE path; register the input type as `@node` first. To pin the encoder explicitly (recommended when grep-ability matters), attach `@nodeId(typeName: "...")` to the carrier field; the directive's encoder must resolve to the same `@table` as the mutation's input. An `@nodeId` whose encoder resolves to a different table is rejected: you would be returning IDs of a different entity than the one the DML acted on. + +The response contains exactly the IDs of rows the DML actually removed. + +=== Projecting the deleted row's primary key onto an SDL type + +The carrier may also return the `@table`-backed SDL type, but only when every non-nullable field on the type resolves to a primary-key column: + +[source,graphql] +---- +type Regelverksamling @table(name: "regelverksamling") @node { + id: ID! # PK; admits + navn: String # non-PK, nullable; admits, runtime returns null + beskrivelse: String! # non-PK, non-nullable; REJECTS the carrier +} +---- + +The classifier inspects every field on the element type and rejects the carrier if any non-nullable field maps to a non-PK column. Nullable non-PK fields admit and always resolve to `null` at runtime; this is by design — after a DELETE there is no row left to read those columns from. If your SDL type carries non-nullable non-PK fields, prefer the `[ID!]` shape above, or define a dedicated `DeletedRegelverksamling` SDL type whose non-nullable fields are PK-only. + +`@service`-resolved fields are not admitted on the element type, nullable or not. The service would receive a PK-only row at runtime and any non-PK source parameter would silently produce `null`. Use the `[ID!]` shape and resolve service-backed data on the deleted entity through a sibling lookup if needed. FK-traversing reference fields (`@reference` paths to a joined target table) are also rejected on DELETE carriers, since the join cannot run after the row is gone. + +=== Single vs bulk + +Both shapes work with single and bulk DELETE; cardinality follows the carrier field's wrapper (`ID`/`Foo` for single, `[ID!]`/`[Foo!]` for bulk). + +=== What you can't return + +* Arbitrary non-PK columns of the deleted row. The row is gone; `RETURNING` is narrowed to primary-key columns. If you need the full pre-delete state, snapshot it in your application code before issuing the mutation. +* A bare class-backed payload type. Use a NodeId echo or a `@table` projection. + +== Constraints + +* The mutation's input type must carry `@table`. The generator fails the build with a "@mutation requires a @table-bound input type" error otherwise; without `@table` it has no way to know which table the operation targets. +* `UPDATE` and `DELETE` require the input columns to cover a primary key or unique key of the `@table` (inferred from the catalog, no directive needed); otherwise the build fails so a non-unique filter cannot silently broadcast. `DELETE` can opt out with `multiRow: true` for a deliberate broadcast; `UPDATE` has no broadcast shape (cover a key). `@lookupKey` on a mutation input field is no longer supported (it identified rows in the pre-catalog model); remove it. +* `UPDATE` requires at least one input field outside the matched key (otherwise the `SET` clause is empty). `DELETE` has no such requirement — a key-only DELETE is the canonical single-row delete. `UPSERT` is exempt on the SET side: an upsert with no SET-clause fields is `INSERT … ON CONFLICT DO NOTHING`, which is a legitimate shape. +* `@mutation` and xref:service.adoc[`@service`] are mutually exclusive on the same field. Pick one: `@mutation` for fully-generated DB operations, `@service` for handing the operation to custom Java. +* Optional input fields participate in the operation only when the client provides them; absent optional fields are omitted from the column list (`INSERT`) or the `SET` clause (`UPDATE`/`UPSERT`). + +== See also + +* xref:../../tutorial/05-mutations.adoc[Tutorial page 5: A first mutation] walks the `INSERT`/`UPDATE`/`UPSERT` flow against a running database. +* xref:lookupKey.adoc[`@lookupKey`] is a Query-side lookup-key marker on `ARGUMENT_DEFINITION`; it no longer participates in mutation row identification (that is catalog-derived). +* xref:table.adoc[`@table`] establishes the input-type binding `@mutation` requires. +* xref:service.adoc[`@service`] for custom-Java mutations. + +xref:../index.adoc[← Reference index] diff --git a/docs/manual/reference/directives/node.adoc b/docs/manual/reference/directives/node.adoc new file mode 100644 index 0000000000..a3dd84d834 --- /dev/null +++ b/docs/manual/reference/directives/node.adoc @@ -0,0 +1,109 @@ += @node +:description: Opt a type into Relay Global Object Identification, producing opaque, table-keyed global IDs. +:!toc: + +Marks a type as a Relay https://graphql.org/learn/global-object-identification/[Global Object Identification] node. Every `@node`-decorated type gets a synthesised opaque ID encoding `(typeId, primary-key columns)`; xref:nodeId.adoc[`@nodeId`] fields encode and decode that ID. The `Query.node(id:)` and `Query.nodes(ids:)` entry points dispatch by `typeId` prefix to the matching `@node` type's table at runtime. + +`@node` only takes effect on types that also carry xref:table.adoc[`@table`]; the global ID embeds primary-key (or unique-key) columns from the bound table. + +== SDL signature + +[source,graphql] +---- +directive @node( + typeId: String, + keyColumns: [String!] +) on OBJECT +---- + +== Parameters + +[cols="1,1,1,3",options="header"] +|=== +| Name | Type | Default | Description +| `typeId` | `String` | type's GraphQL name | The discriminator embedded in the ID that tells `Query.node` which type (and table) to dispatch to. Defaults to the GraphQL type name. Set explicitly when you want shorter IDs, or stable IDs that survive a GraphQL type rename. +| `keyColumns` | `[String!]` | primary-key columns | Ordered column list embedded in the ID. Must correspond to a primary key or another unique key on the bound table. Defaults to the primary key in declaration order. Set explicitly to decouple the ID from primary-key changes. +|=== + +== Canonical example + +The example schema's `Customer`, `Address`, and `Film` types all opt into Relay Node: + +[source,graphql] +---- +interface Node { id: ID! } + +type Customer implements Node @table(name: "customer") @node { + id: ID! @nodeId + customerId: Int! @field(name: "CUSTOMER_ID") + firstName: String! @field(name: "FIRST_NAME") + # ... +} + +type Address implements Node @table(name: "address") @node { + id: ID! @nodeId + # ... +} + +type Film implements Node @table(name: "film") @node { + id: ID! @nodeId + # ... +} +---- + +`@node` here uses every default: `typeId` falls back to `Customer`, `Address`, `Film`; `keyColumns` falls back to each table's primary key. The corresponding entry points: + +[source,graphql] +---- +type Query { + node(id: ID!): Node + nodes(ids: [ID!]!): [Node] +} +---- + +`Query.node(id:)` decodes the opaque ID, reads the embedded `typeId`, and dispatches to the matching `@node` type's table. `Query.nodes(ids:)` is the batched form: the rewrite groups IDs by `typeId`, fans out one batched `SELECT` per type, and scatters rows back to the request's original positions. + +Composite-PK nodes follow the same shape: + +[source,graphql] +---- +type FilmActor implements Node @table(name: "film_actor") @node { + id: ID! @nodeId + # ... +} +---- + +`film_actor` has a composite `(actor_id, film_id)` primary key; the synthesised ID embeds both columns in declaration order. xref:lookupKey.adoc[`@lookupKey`] on `[ID!]!` keyed by the same node type produces the corresponding `VALUES` join over both PK columns. + +Set `typeId` explicitly when the GraphQL type name might change but the ID must remain stable: + +[source,graphql] +---- +type Person implements Node @table(name: "customer") @node(typeId: "C") { + id: ID! @nodeId +} +---- + +The `typeId: "C"` keeps existing IDs valid even if `Person` is later renamed to `User` or `Customer`. + +== Constraints + +* The decorated type must also carry xref:table.adoc[`@table`]; the bound table supplies the columns to embed. +* The type must implement the `Node` interface (`type X implements Node ...`). Without the interface, `Query.node(id:)` cannot return the type. +* The type must declare an `id: ID!` field decorated with xref:nodeId.adoc[`@nodeId`]. The directive on the type alone does not produce the ID; the field-level marker tells the generator which slot is the ID. +* `keyColumns` must form a primary key or another unique key on the bound table. The build fails if the columns don't form a unique constraint. +* `keyColumns` ordering matters and is part of the ID's wire format; reordering breaks already-issued IDs. +* `typeId` collisions across types are rejected at startup. If two types share a `typeId` (whether explicit or defaulted), `Query.node(id:)` cannot dispatch unambiguously. + +== Editor support + +The graphitron LSP completes `keyColumns:` element values against the columns of the type's `@table`-backed jOOQ class (the same column set xref:field.adoc[`@field(name:)`] completes against), flags typos per-element, and hovers each element to surface its GraphQL type. Cursor inside the empty list literal offers every column; once you start typing, the editor narrows to the matching prefix. + +== See also + +* xref:nodeId.adoc[`@nodeId`] is the field-level counterpart that encodes and decodes the ID. +* xref:table.adoc[`@table`] supplies the columns embedded in the ID. +* xref:lookupKey.adoc[`@lookupKey`] on `[ID!]` decodes opaque node IDs into typed batch keys (composite-PK NodeId lookups). +* xref:../../how-to/global-id.adoc[How-to: Global object IDs] covers stable-ID strategies, `keyColumns` migrations, and `Query.node`/`Query.nodes` dispatch. + +xref:../index.adoc[← Reference index] diff --git a/docs/manual/reference/directives/nodeId.adoc b/docs/manual/reference/directives/nodeId.adoc new file mode 100644 index 0000000000..86bae7cf38 --- /dev/null +++ b/docs/manual/reference/directives/nodeId.adoc @@ -0,0 +1,118 @@ += @nodeId +:description: Mark a slot as a Relay global ID that encodes or decodes a @node type's primary key. +:!toc: + +Names a GraphQL slot as a Relay https://graphql.org/learn/global-object-identification/[Global Object Identification] ID. The site axis decides direction: on a `FIELD_DEFINITION` the directive *encodes* the parent's primary-key columns into the opaque ID; on `INPUT_FIELD_DEFINITION` and `ARGUMENT_DEFINITION` it *decodes* the ID back to typed key columns at the carrier. Pairs with xref:node.adoc[`@node`], which configures the type that owns the ID. + +== SDL signature + +[source,graphql] +---- +directive @nodeId( + typeName: String +) on FIELD_DEFINITION | INPUT_FIELD_DEFINITION | ARGUMENT_DEFINITION +---- + +== Parameters + +[cols="1,1,1,3",options="header"] +|=== +| Name | Type | Default | Description +| `typeName` | `String` | inferred | The xref:node.adoc[`@node`] type the ID belongs to. Case-sensitive. Required when the carrier site is ambiguous. Inferred when: (a) on a non-xref:reference.adoc[`@reference`] object field, the containing type is itself a `@node`; (b) on a xref:reference.adoc[`@reference`] field or jOOQ-record input field, exactly one `@node` type binds to the same target table. +|=== + +== Canonical example + +Producing IDs on a `@node` type's `id` slot (encode side): + +[source,graphql] +---- +type Customer implements Node @table(name: "customer") @node { + id: ID! @nodeId + customerId: Int! @field(name: "CUSTOMER_ID") + # ... +} + +type Address implements Node @table(name: "address") @node { + id: ID! @nodeId + # ... +} +---- + +`@nodeId` here has no `typeName:` because case (a) applies: the containing type is a `@node`, so the inference is unambiguous. The selected `id` is base64-encoded `(typeId, primary-key columns)`. + +Cross-type reference (encode side, with explicit type): + +[source,graphql] +---- +type Customer implements Node @table(name: "customer") @node { + addressNodeId: ID @nodeId(typeName: "Address") + @reference(path: [{key: "customer_address_id_fkey"}]) +} +---- + +`addressNodeId` produces an `Address` ID from the FK on `customer.address_id`. The xref:reference.adoc[`@reference`] path points at the `address` row; `@nodeId(typeName: "Address")` encodes that row's PK columns under the `Address` typeId. (FK-mirror collapse means no extra JOIN: `customer.address_id == address.address_id`.) + +Decoding into typed keys at an argument or input field (decode side): + +[source,graphql] +---- +type Query { + # Same-table @nodeId on an argument: decodes opaque IDs into film primary keys + # and feeds a (film_id) IN (...) lookup. @lookupKey is implicit on same-table + # @nodeId arguments. + filmsByNodeIdArg(ids: [ID!]! @nodeId(typeName: "Film")): [Film!]! + + # Composite-PK NodeId @lookupKey: each opaque ID decodes to (actor_id, film_id), + # joined via VALUES(idx, actor_id, film_id) on both PK columns. + filmActorByNodeId(id: [ID!]! @lookupKey): [FilmActor!]! +} + +input FilmSameTableNodeIdInput { + filmIds: [ID!] @nodeId(typeName: "Film") +} +---- + +On the decode side the rewrite verifies the ID's embedded `typeId` against the declared `typeName:`; mismatched IDs surface as `GraphqlErrorException` via the ThrowOnMismatch contract before any SQL runs. + +=== Decoding into a jOOQ record at a `@service` param + +When a `@service` method parameter is a generated jOOQ `TableRecord` (singular or `List<…>`), the framework builds the record at the fetcher boundary, and an `@nodeId` field on the backing input type decodes into columns *on that record*. The target columns are resolved by table identity: + +* *Same-table identity.* When the `@nodeId` type's xref:table.adoc[`@table`] is the param record's own table, the decoded key loads into the record's own key columns. +* *Cross-table FK reference.* When the `@nodeId` type is a *different* table (the common status / history / junction-row shape), the decoded key loads into the foreign-key child columns on the record, resolved through the FK constraint between the two tables. The FK is deduced when exactly one connects them; when several do, name it with xref:reference.adoc[`@reference`]`(path: [{key: "<fk-name>"}])`. A record may carry several such FK-reference `@nodeId` fields. + +[source,graphql] +---- +# A jOOQ FilmActorRecord @service param. Each @nodeId references a *different* node +# type; the decoded ids load into the junction row's FK child columns (film_actor.film_id, +# film_actor.actor_id), resolved through the catalog FK constraints — not by name match. +input AssignFilmActorInput { + filmId: ID! @nodeId(typeName: "Film") + actorId: ID! @nodeId(typeName: "Actor") +} +---- + +A nullable (`ID`) field follows jOOQ's changed-flag contract: an omitted key leaves its column unwritten (excluded from the service's INSERT/UPDATE), an explicit `null` writes `NULL`, and a value decodes and loads. A non-null (`ID!`) field always decodes and throws on a malformed or wrong-type id. A self-reference (an `@reference` on a same-table `@nodeId`) is rejected as out of scope. + +== Constraints + +* The named or inferred type must carry xref:node.adoc[`@node`]. The build fails when `typeName:` resolves to a non-node type. +* `typeName:` is required when neither inference rule fires: when the field's type is not the containing type and no `@reference` provides an unambiguous target table. +* `@nodeId` does not stand alone on a non-`@node` field as the type's identity. Use it on the `id: ID!` field of a `@node` type, or on slots that *reference* a node from elsewhere. +* On `[ID!]` arguments where `typeName` matches the surrounding query's return-type table, xref:lookupKey.adoc[`@lookupKey`] is implied; an explicit `@lookupKey` is permitted but redundant. +* Decode-time ID/typeId mismatch fails the request with a GraphQL error; same with malformed base64. +* `@nodeId` is a binding directive, not a projection. The slot's GraphQL type must be `ID!`, `ID`, `[ID!]`, or `[ID!]!` (lists are valid for batch decode). + +== Editor support + +The graphitron LSP completes `typeName:` against the set of types that declare xref:node.adoc[`@node`] in the schema; typing into the empty quoted value offers every node-bearing type, and a value that does not resolve to one surfaces as an error inline. Hover on a resolved `typeName:` shows the type's `typeId` and key-column list, pulling each column's GraphQL type from xref:field.adoc[`@field`] / xref:table.adoc[`@table`] metadata. + +== See also + +* xref:node.adoc[`@node`] configures the owning type (`typeId`, `keyColumns`). +* xref:reference.adoc[`@reference`] supplies the JOIN path when an ID is encoded from a *different* row than the parent. +* xref:lookupKey.adoc[`@lookupKey`] is the dispatch path for `[ID!]`-keyed argument lookups; same-table NodeId arguments imply it. +* xref:../../how-to/global-id.adoc[How-to: Global object IDs] covers cross-type IDs, decode-error handling, and same-table-nodeid filter inputs. + +xref:../index.adoc[← Reference index] diff --git a/docs/manual/reference/directives/notGenerated.adoc b/docs/manual/reference/directives/notGenerated.adoc new file mode 100644 index 0000000000..bba3436bbc --- /dev/null +++ b/docs/manual/reference/directives/notGenerated.adoc @@ -0,0 +1,54 @@ += @notGenerated +:description: Legacy directive that suppressed data-fetcher generation. The rewrite no longer supports it; remove it from the schema. +:!toc: + +`@notGenerated` was the legacy generator's escape hatch for fields whose data fetcher the developer wanted to wire by hand: the directive caused Graphitron to skip code generation for the field, leaving it to be bound through the runtime's `RuntimeWiring`. The rewrite no longer supports it. The schema must fully describe every field, fields are either generated from directives or explicitly delegated through xref:service.adoc[`@service`] / xref:externalField.adoc[`@externalField`]. + +The directive name is still parsed (so existing schemas don't fail with "unknown directive `@notGenerated`"), but every application is rejected with a clear message: `@notGenerated is no longer supported. Remove the directive; fields must be fully described by the schema.` Remove every occurrence from your schema and replace each one with the directive that names the actual data source. + +== SDL signature + +[source,graphql] +---- +directive @notGenerated on FIELD_DEFINITION | ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION | INTERFACE | UNION +---- + +== Migration + +Replace each application with the directive that describes the field's actual data source: + +[cols="1,1,3",options="header"] +|=== +| Original | Rewrite replacement | Notes +| `field: T @notGenerated` on `Query` / `Mutation` | xref:service.adoc[`@service`] | Wire the resolver as a service method, the rewrite generates the data fetcher and dispatches to your code. +| `field: T @notGenerated` on a child of a `@table` parent | xref:externalField.adoc[`@externalField`] (column-shaped) or xref:reference.adoc[`@reference`] (FK-driven) | Either return the value as a `Field<T>` from a static method, or join through the catalog. +| `field: T @notGenerated` on a class-backed parent | A typed Java accessor | A class-backed parent (Java record / POJO) must expose the data through a typed Java-record accessor. +| `field: T @splitQuery @notGenerated` (custom batch fetcher) | xref:service.adoc[`@service`] (with xref:splitQuery.adoc[`@splitQuery`] for non-root batching) | Service methods can be batched with xref:splitQuery.adoc[`@splitQuery`] at non-root sites; the developer-supplied method runs once per parent batch. +| `interface T @notGenerated` / `union U @notGenerated` | (no replacement needed) | The legacy "skip interface/union wiring" axis was always tied to `RuntimeWiring`-side type resolvers, the rewrite always generates these from xref:discriminate.adoc[`@discriminate`] / xref:discriminator.adoc[`@discriminator`]. Remove the directive. +|=== + +== Diagnostic + +Any application of `@notGenerated` produces a build-time rejection: + +[source,text] +---- +@notGenerated is no longer supported. Remove the directive; fields must be fully described by the schema. +---- + +The rejection fires before the rest of the field's classification runs, so the message is the first thing the build emits for that field. Schemas that still carry `@notGenerated` annotations must remove every occurrence to compile under the rewrite. + +== Constraints + +* Every application is rejected at build time, regardless of position. There is no "warn-only" mode and no migration shim, the surface is hard-removed. +* The directive is still *parsed* (the schema still validates against the SDL), so the migration is a one-step delete-and-replace, not a two-step "first remove, then add `@notGenerated` back later". +* Input-field-level applications (rare in legacy schemas) are also rejected. The build messages identify which input field carries the directive: `input field '<name>': @notGenerated is no longer supported. Remove the directive; fields must be fully described by the schema.` +* The directive is mentioned in the rewrite's `directives.graphqls` SDL only because removing the declaration would cause "unknown directive" parse errors on legacy schemas. Once your schema is fully migrated, the declaration is purely cosmetic. + +== See also + +* xref:service.adoc[`@service`] is the most common replacement: a developer-supplied resolver method for a whole field. +* xref:externalField.adoc[`@externalField`] is the replacement for column-shaped custom logic on a `@table` parent. +* xref:../../how-to/migrating-from-legacy.adoc[How-to: Migrating from the legacy generator] covers the full directive-by-directive migration matrix, including the rejected-stub directives. + +xref:../index.adoc[← Reference index] diff --git a/docs/manual/reference/directives/order.adoc b/docs/manual/reference/directives/order.adoc new file mode 100644 index 0000000000..e5a9591c04 --- /dev/null +++ b/docs/manual/reference/directives/order.adoc @@ -0,0 +1,92 @@ += @order +:description: Map an enum value to a database sort specification (index, fields, or primary key). +:!toc: + +Attaches a sort specification to an enum value used by an xref:orderBy.adoc[`@orderBy`] argument. Exactly one of `index`, `fields`, or `primaryKey` must be set on each enum value; together they tell the generator which columns to emit in `ORDER BY`. + +== SDL signature + +[source,graphql] +---- +directive @order( + index: String, + fields: [FieldSort!], + primaryKey: Boolean = false +) on ENUM_VALUE + +input FieldSort { + name: String! + collate: String +} +---- + +== Parameters + +[cols="1,1,1,3",options="header"] +|=== +| Name | Type | Default | Description +| `index` | `String` | none | Name of a database index. The generator looks up the index on the parent table at build time and emits its column list. Index code generation must be enabled in jOOQ (`<includeIndexes>true</includeIndexes>`). +| `fields` | `[FieldSort!]` | none | One or more column specifications. Each `FieldSort` carries a required `name` (the column name in the jOOQ table) and an optional `collate` (database-specific collation name, e.g. `"xdanish_ai"`). +| `primaryKey` | `Boolean` | `false` | When `true`, sorts by the parent table's primary key columns in declaration order. Useful for stable pagination cursors. +|=== + +== Canonical example + +[source,graphql] +---- +enum FilmSort { + FILM_ID @order(primaryKey: true) + TITLE @order(fields: [{name: "title"}]) +} + +enum ActorSort { + ACTOR_ID @order(primaryKey: true) + FIRST_NAME @order(fields: [{name: "first_name"}]) + LAST_NAME @order(fields: [{name: "last_name"}]) +} +---- + +`FILM_ID @order(primaryKey: true)` sorts by `film.film_id`, the primary key of the bound table. `TITLE @order(fields: [{name: "title"}])` sorts by the `title` column without requiring a database index. + +Index-based sorting (with optional multi-column index): + +[source,graphql] +---- +enum FilmOrderByField { + LANGUAGE @order(index: "IDX_FK_LANGUAGE_ID") + TITLE @order(index: "IDX_TITLE") + STORE_ID_FILM_ID @order(index: "idx_store_id_film_id") +} +---- + +Field-based sorting with collation: + +[source,graphql] +---- +enum PersonOrderByField { + NAME_NORSK @order(fields: [ + {name: "LAST_NAME", collate: "xdanish_ai"}, + {name: "FIRST_NAME", collate: "xdanish_ai"} + ]) + STATUS @order(fields: [{name: "ACTIVE"}]) +} +---- + +The enum's parent type is determined by where the enum is referenced from (the xref:orderBy.adoc[`@orderBy`] argument); column names resolve against that type's `@table`. + +== Constraints + +* Exactly one of `index`, `fields`, or `primaryKey` must be set per enum value. Setting two, or none, fails the build. +* `index` requires jOOQ index generation. With `<includeIndexes>true</includeIndexes>` disabled, the lookup throws at startup with a "no matching index" error. +* `fields[].name` must be a real column on the bound table. Resolution mirrors xref:field.adoc[`@field`]: case-sensitive against the jOOQ-generated identifiers. +* `collate` is passed verbatim to the database; misspelled collations surface only at query time. +* `@order` applies to enum values only. Use it on every value of an enum referenced by xref:orderBy.adoc[`@orderBy`]; missing values fail the build. +* xref:index-directive.adoc[`@index`] is the deprecated single-purpose alias for `@order(index:)`. New code should use `@order`. + +== See also + +* xref:orderBy.adoc[`@orderBy`] is the entry point that activates `@order`-bearing enums. +* xref:defaultOrder.adoc[`@defaultOrder`] reuses the same `index` / `fields` / `primaryKey` shape on the field rather than the enum. +* xref:index-directive.adoc[`@index`] is deprecated; migrate to `@order(index:)`. + +xref:../index.adoc[← Reference index] diff --git a/docs/manual/reference/directives/orderBy.adoc b/docs/manual/reference/directives/orderBy.adoc new file mode 100644 index 0000000000..74683c4f6e --- /dev/null +++ b/docs/manual/reference/directives/orderBy.adoc @@ -0,0 +1,59 @@ += @orderBy +:description: Mark an argument as the dynamic-ordering input for the field. +:!toc: + +Marks an argument whose value selects a sort order at runtime. The argument's input type must contain exactly one `SortDirection` enum field and exactly one enum field whose values carry xref:order.adoc[`@order`] directives. The generator picks each up by GraphQL type, not by field name. + +== SDL signature + +[source,graphql] +---- +directive @orderBy on ARGUMENT_DEFINITION +---- + +`@orderBy` takes no parameters. + +== Canonical example + +The example schema's `filmsOrderedConnection` exposes a dynamic order argument: + +[source,graphql] +---- +type Query { + filmsOrderedConnection( + rating: MpaaRating @field(name: "RATING"), + order: [FilmOrderBy] @orderBy, + first: Int, last: Int, after: String, before: String + ): FilmsConnection! @defaultOrder(primaryKey: true) +} + +input FilmOrderBy { + field: FilmSort! + direction: SortDirection +} + +enum FilmSort { + FILM_ID @order(primaryKey: true) + TITLE @order(fields: [{name: "title"}]) +} + +enum SortDirection { ASC, DESC } +---- + +A client requesting `order: [{ field: TITLE, direction: ASC }]` gets the films sorted by `film.title` ascending. The `[FilmOrderBy]` list shape lets the client compose multi-key orderings; `FILM_ID` after `TITLE` ties the keyset cursor onto the primary key for stable pagination. + +== Constraints + +* Applies only to arguments. Putting `@orderBy` on a field, input field, or enum value is rejected. +* The argument's input type must contain exactly one field whose type is the project's `SortDirection` enum (declared by name, looked up by type) and exactly one field whose type is an enum carrying xref:order.adoc[`@order`] on every value. Field names are free; the generator binds by type. +* Every value of the bound enum must declare exactly one of `index`, `fields`, or `primaryKey` via xref:order.adoc[`@order`]. Missing or ambiguous specifications fail the build. +* `@orderBy` and xref:defaultOrder.adoc[`@defaultOrder`] coexist on the same field. When the client supplies a value the dynamic order wins; when omitted, `@defaultOrder` applies. +* Connection fields (xref:asConnection.adoc[`@asConnection`] or hand-written `*Connection` types) integrate `@orderBy` with keyset pagination automatically; the cursor encodes the active sort columns. + +== See also + +* xref:order.adoc[`@order`] specifies how each enum value maps to database sort columns. +* xref:defaultOrder.adoc[`@defaultOrder`] supplies the fallback sort when the client omits the `@orderBy` argument. +* xref:../../how-to/sort-results.adoc[How-to: Sort results] covers multi-key orderings and keyset pagination interactions. + +xref:../index.adoc[← Reference index] diff --git a/docs/manual/reference/directives/record.adoc b/docs/manual/reference/directives/record.adoc new file mode 100644 index 0000000000..d3832d2319 --- /dev/null +++ b/docs/manual/reference/directives/record.adoc @@ -0,0 +1,57 @@ += @record +:description: Deprecated and ignored. The backing Java class is now inferred from the producing field's reflected return type; remove @record from the schema. +:!toc: + +[WARNING] +==== +`@record` is *deprecated and ignored*. The rewrite no longer reads it to bind a type to a backing Java class. The directive is still declared in `directives.graphqls` so existing schemas keep parsing, but it drives no behaviour. Leaving it on a reachable type produces a build warning that tells you to remove it. *Remove `@record` from your schema.* +==== + +== What replaced it + +A GraphQL `OBJECT` or `INPUT_OBJECT` is still backed by a Java class when it carries one; the rewrite just derives the class differently. Instead of reading `@record(record: {className: ...})`, the rewrite *reflects on the field that produces the type* and takes the backing class from that field's Java signature: + +* *Output / result types* take their backing from the producing field's *return* type: an xref:service.adoc[`@service`] method return, a xref:table.adoc[`@table`] resolution, a `@tableMethod` return, or a parent-accessor chain that threads the class down to child types. +* *Input types* take their backing from the Java *parameter* type the input flows into (the xref:service.adoc[`@service`] / xref:condition.adoc[`@condition`] / `@tableMethod` method parameter), or from xref:table.adoc[`@table`]. + +The class shape still determines the variant the rewrite picks: a jOOQ `TableRecord` produces a `JooqTableRecordType` (output) / `JooqTableRecordInputType` (input), a jOOQ `Record` produces a `JooqRecordType` / `JooqRecordInputType`, and a plain Java record or POJO produces `JavaRecordType` / `PojoResultType` / `JavaRecordInputType` / `PojoInputType`. What changed is the *trigger*: reflection on the producing field, not the directive. + +So a service method that returns a hand-written DTO binds the SDL payload type to that DTO automatically; you write the xref:service.adoc[`@service`] field and let its return type carry the class. No directive is needed, and none is consulted. + +== Migration + +Delete the directive. The type keeps the same backing class as long as a producing field still supplies it by reflection: + +[source,graphql] +---- +# Before (the directive was read to bind the class): +type CreateFilmPayload @record(record: {className: "no.sikt.graphitron.rewrite.test.services.CreateFilmPayload"}) { + films: [Film!]! +} + +# After (the @service method that returns CreateFilmPayload supplies the class): +type CreateFilmPayload { + films: [Film!]! +} +---- + +Nothing else about the type changes: child fields still reach further tables through xref:reference.adoc[`@reference`] (jOOQ-record parents) or a typed accessor (plain-record parents), exactly as before. That joining was never part of `@record`; only the parent's class binding moved to reflection. + +== The build warning + +When a reachable type still carries `@record`, the rewrite emits one of three warnings at the type's source location, all of which end "remove it": + +* *Redundant*: the directive's `className` (or a bare `@record` with none) matches the class the rewrite already derives from the producing field. The directive adds nothing. +* *Shadowed by `@table`*: the type also carries xref:table.adoc[`@table`], which supplies the backing class; `@record` is ignored. +* *Disagrees*: the directive's `className` names a different class from the one the producing field reflects to. The rewrite uses the reflected class and ignores the directive's claim. + +A bare `@record` with no `record:` was previously rejected at classify time; it now folds into the redundant case, because `className` was the only field that ever participated in binding. + +== See also + +* xref:table.adoc[`@table`] is the catalog-bound counterpart: choose it when the type is a jOOQ table. A type that is neither `@table`-bound nor reached by a class-returning producer is a plain nesting type and generates no carrier of its own. +* xref:service.adoc[`@service`] is the most common source of a class-backed output type: the method's return type now carries the binding the directive used to declare. +* xref:../../how-to/result-types.adoc[How-to: Result-type variants] covers `JavaRecordType` / `PojoResultType` / `JooqRecordType` / `JooqTableRecordType` and how the rewrite picks among them from the producer's reflected type. +* xref:../deprecations.adoc[Deprecations] indexes every deprecated and ignored surface element. + +xref:../index.adoc[← Reference index] diff --git a/docs/manual/reference/directives/reference.adoc b/docs/manual/reference/directives/reference.adoc new file mode 100644 index 0000000000..1949126733 --- /dev/null +++ b/docs/manual/reference/directives/reference.adoc @@ -0,0 +1,100 @@ += @reference +:description: Declare a foreign-key path between two table-bound types so the generator can emit a JOIN. +:!toc: + +Declares an explicit foreign-key path between the field's parent table and the field's target table. The generator threads the path through jOOQ's catalog and emits a JOIN whenever the field is selected. + +== SDL signature + +[source,graphql] +---- +directive @reference( + path: [ReferenceElement!]! +) on FIELD_DEFINITION | ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +input ReferenceElement { + table: String, + key: String, + condition: ExternalCodeReference +} +---- + +== Parameters + +[cols="1,1,1,3",options="header"] +|=== +| Name | Type | Default | Description +| `path` | `[ReferenceElement!]!` | (required) | Ordered list of hops from the parent table to the target table. Each element pins one hop by table name, foreign-key constraint name, or an external join condition. +|=== + +`ReferenceElement` fields: + +[cols="1,1,1,3",options="header"] +|=== +| Name | Type | Default | Description +| `table` | `String` | inferred from the field's target type | The jOOQ table identifier for this hop's destination. Overrides the type-level `@table` if both are present. +| `key` | `String` | inferred when unique | The foreign-key constraint name (matching jOOQ's `Keys` class). Required when more than one foreign key exists between the source and destination tables for a hop. +| `condition` | `ExternalCodeReference` | none | An external Java method that returns a `org.jooq.Condition` to add to the join. Acts as an `ON` condition when neither `table` nor `key` is set, otherwise as an extra `WHERE` constraint on the joined hop. +|=== + +== Canonical example + +The tutorial's `Customer.address` is a single-hop reference along a named foreign key: + +[source,graphql] +---- +type Customer @table(name: "customer") { + address: Address @reference(path: [{key: "customer_address_id_fkey"}]) +} +---- + +`customer_address_id_fkey` is the FK constraint declared in `init.sql` as `address_id int NOT NULL REFERENCES address(address_id)`. A query selecting `customers { address { district } }` emits: + +[source,sql] +---- +SELECT customer.first_name AS "firstName", + address.district AS "district" + FROM customer + LEFT JOIN address ON customer.address_id = address.address_id +---- + +The JOIN is added only when the selection set traverses through `address`; selecting only `firstName` skips it. + +`@reference` chains across hops. From the same `Customer` type: + +[source,graphql] +---- +storeAddress: Address @reference(path: [ + {key: "customer_store_id_fkey"}, + {key: "store_address_id_fkey"} +]) +---- + +The path is `customer.store_id → store.store_id → store.address_id → address.address_id` — two FKs and three tables touched, but still a single SQL statement with the same projection-narrowing. + +When exactly one foreign key exists between two tables, `@reference` is unnecessary and the generator picks the path automatically: + +[source,graphql] +---- +type Store @table(name: "store") { + customers: [Customer!]! @defaultOrder(primaryKey: true) +} +---- + +There is exactly one FK between `customer` and `store` (`customer.store_id`), so the join is implicit. Multiple-FK cases must declare the path explicitly: the generator does not guess. + +== Constraints + +* `path` must be non-empty. A `@reference` with `path: []` fails graphql-java parsing. +* When more than one foreign key exists between the source and destination tables for a given hop, `key` is required. The build fails with an ambiguous-reference error otherwise. +* When `key` is provided alone, `table` is inferred from the FK target. When `table` is provided alone, `key` is inferred when unique. Setting both is allowed but redundant. +* A `condition`-only hop (no `table`, no `key`) is treated as a join `ON` condition; the generator joins the field's target table and applies the condition. Use this when the join is non-FK or computed. + +== See also + +* xref:../../tutorial/04-joining-tables.adoc[Tutorial page 4: Joining tables] introduces single-hop and multi-hop references. +* xref:../../how-to/join-with-references.adoc[How-to: Join with references] for recipe-shaped variants. +* xref:discriminate.adoc[`@discriminate`] / xref:discriminator.adoc[`@discriminator`] for the union/interface variant. See xref:../../how-to/polymorphic-types.adoc[How-to: Polymorphic types] for the supported shapes. +* xref:table.adoc[`@table`] establishes the table binding both endpoints rely on. + +xref:../index.adoc[← Reference index] diff --git a/docs/manual/reference/directives/routine.adoc b/docs/manual/reference/directives/routine.adoc new file mode 100644 index 0000000000..1f6f14c360 --- /dev/null +++ b/docs/manual/reference/directives/routine.adoc @@ -0,0 +1,62 @@ += @routine +:description: Back a field with a jOOQ database routine (a stored function or procedure). +:!toc: + +Backs a field with a database *routine* rather than a catalog table. Day-one supports the table-valued read function (PostgreSQL `RETURNS TABLE` / `SETOF`): jOOQ generates such a function as a first-class catalog `Table<R>`, so the field's `@table`-bound element type resolves the routine-result columns exactly as a plain table type does, and the rewrite projects `Type.$fields(...)` against it with the same selection narrowing. The only difference from a plain catalog read is the `FROM` source: instead of the bare `Tables.X` singleton, the rewrite calls the schema's generated `Routines` convenience method with the routine's IN parameters bound from GraphQL field arguments. + +`@routine` is the seam for reading from a stored function whose result set parameterises on its inputs, such as an access-control function that returns the rows a caller may see. The read shape (table-valued) is read off the routine's jOOQ kind, not declared. + +== SDL signature + +[source,graphql] +---- +directive @routine( + name: String! + argMapping: String +) on FIELD_DEFINITION +---- + +== Parameters + +[cols="1,1,1,3",options="header"] +|=== +| Name | Type | Default | Description +| `name` | `String!` | (required) | The database routine name, optionally schema-qualified (`schema.routine`). Must resolve to a table-valued function in the jOOQ catalog. +| `argMapping` | `String` | (empty) | Maps routine IN parameters to GraphQL argument names (`routineParam: graphqlArg`, comma-separated). The routine parameter name is the jOOQ-generated (camelCased) name, e.g. `pEnv` for a `p_env` parameter. Unmentioned parameters bind to a GraphQL argument of the same name (identity). +|=== + +== Canonical example + +A table-valued access-control function backing a root list field. The `@table`-bound element type names the jOOQ-generated table-valued-function table; the three TEXT IN parameters bind from GraphQL arguments: + +[source,graphql] +---- +type Tilgang @table(name: "tilganger_for_feidebruker_med_fs_fiktivt_fnr") { + organisasjonskode: Int + rollekode: String +} + +type Query { + tilganger(env: String!, serviceId: String!, feideId: String!): [Tilgang!]! + @routine( + name: "tilganger_for_feidebruker_med_fs_fiktivt_fnr" + argMapping: "pEnv: env, pServiceId: serviceId, pFeideId: feideId" + ) +} +---- + +The rewrite emits `select(Tilgang.$fields(...)).from(Routines.tilgangerForFeidebrukerMedFsFiktivtFnr(env, serviceId, feideId)).fetch()`. A query selecting only `organisasjonskode` projects only that routine-result column. + +== Constraints + +* The field's return type must be `@table`-bound, and that table must be the routine's result table. A non-`@table` return is rejected with `@routine requires a @table-annotated return type`; a mismatch with the routine's result table is rejected with `@routine could not be resolved — the field's @table type ... does not match the routine's result table ...`. +* `name:` must resolve to a *table-valued function* in the jOOQ catalog. A name that resolves to nothing is rejected with `@routine could not be resolved — no table-valued function named ...`; a name that resolves to a plain table or view is rejected with `... resolves to a table or view, not a table-valued function`. The deferred scalar-read and procedure-write forks reject here today. +* `@routine` is supported on root `Query` fields only; a child-positioned read routine is not yet implemented and is rejected at validate time. +* `argMapping:` parameter names are the jOOQ-generated (camelCased) names. Binding a parameter to an argument the field does not declare is rejected with `@routine parameter ... binds to GraphQL argument ..., which is not an argument of this field`. Resolving the parameter names off the generated `Routines` method requires the consumer to compile their jOOQ sources with `-parameters`. + +== See also + +* xref:table.adoc[`@table`] is the plain catalog-driven counterpart for a field always backed by the same table. +* xref:service.adoc[`@service`] is the alternative when the developer supplies the entire fetcher rather than a routine-backed table. + +xref:../index.adoc[← Reference index] diff --git a/docs/manual/reference/directives/scalarType.adoc b/docs/manual/reference/directives/scalarType.adoc new file mode 100644 index 0000000000..2693d6bad0 --- /dev/null +++ b/docs/manual/reference/directives/scalarType.adoc @@ -0,0 +1,65 @@ += @scalarType +:description: Bind an SDL scalar to a public static GraphQLScalarType constant on the consumer's classpath. +:!toc: + +Binds a custom GraphQL scalar to a `public static final GraphQLScalarType` constant on the consumer's classpath. Graphitron reflects on the constant to recover the Java type that input records, service parameters, and `Field<X>` projections bind to, and registers the constant on the synthesized schema so the consumer's `buildSchema` hook does not have to wire it. + +== SDL signature + +[source,graphql] +---- +directive @scalarType(scalar: String!) on SCALAR +---- + +== Parameters + +[cols="1,1,3",options="header"] +|=== +| Name | Type | Description +| `scalar` | `String!` | Fully-qualified Java reference of the form `package.Class.FIELD`, pointing at a `public static final GraphQLScalarType` constant. Graphitron loads the named class via the project-aware codegen classloader, reads the field, and reflects on the bound `Coercing<I, O>` to recover the Java type. Inner-class references use `$` (e.g. `pkg.Outer$Inner.FIELD`). +|=== + +== Canonical example + +[source,graphql] +---- +scalar BigDecimal + @scalarType(scalar: "graphql.scalars.ExtendedScalars.GraphQLBigDecimal") + +type Invoice @table(name: "invoice") { + amount: BigDecimal! +} +---- + +The generator produces an input record with a `java.math.BigDecimal` component, a `Field<BigDecimal>` projection for SELECT paths, and registers `ExtendedScalars.GraphQLBigDecimal` via `.additionalType(...)` on the synthesized schema. Consumer code does not need to wire the scalar in its `buildSchema` hook. + +== Resolution order + +Graphitron's scalar resolver tries three layers in order, first hit wins: + +. *Spec built-ins.* `Int`, `Float`, `String`, `Boolean`, `ID` resolve through a closed table baked into the resolver. `@scalarType` on a spec built-in name is a hard validation error. +. *`@scalarType(scalar:)` directive.* The consumer's explicit reference. Beats the convention layer, so a consumer who imports extended-scalars but wants `BigDecimal` modeled as their own `Money` wrapper just declares `scalar BigDecimal @scalarType(scalar: "com.example.Scalars.MONEY")` and the directive wins. +. *graphql-java-extended-scalars convention.* When the SDL name matches one of the 30 entries in `ScalarTypeResolver`'s convention table _and_ `graphql.scalars.ExtendedScalars` is on the consumer's compile classpath, the scalar resolves automatically. Both the bare (`scalar BigDecimal`) and `GraphQL`-prefixed (`scalar GraphQLBigDecimal`) names map to `ExtendedScalars.GraphQLBigDecimal`. + +If none of the three layers produces a hit, the scalar is unresolved and the build fails with an error pointing at `@scalarType(scalar:)` or extended-scalars as the fix. There is no silent fallback to `Object`. + +== Migration + +Consumers upgrading to the resolver-driven additional-type registration must *remove* manual `.additionalType(ExtendedScalars.GraphQLBigDecimal)` (or other graphitron-resolved scalar constant) calls from their `buildSchema(...)` hooks. graphql-java's `GraphQLSchema.Builder.additionalType` rejects duplicate type names at build time, so leaving the manual call in turns the upgrade into a `SchemaProblem` rather than silent tolerance. + +== Constraints + +* `@scalarType` is only valid on `scalar` declarations. Applying it to a spec built-in (`Int`, `Float`, `String`, `Boolean`, `ID`) raises a directive-conflict validation error: the GraphQL spec and graphql-java already bind these names. +* The referenced class must be on the codegen classpath (`<project>/target/classes`, every reactor sibling's `target/classes`, or a declared dependency). Classes from `<plugin><dependencies>` are *not* visible. +* The referenced field must be `public static`, non-null at code generation, and assignable to `graphql.schema.GraphQLScalarType`. Validation errors name the specific mismatch (`FieldNotFound`, `FieldNotAccessible`, `NullAtCodegen`, `NotAScalarType`). +* The constant's `Coercing<I, O>` must declare concrete type parameters. A raw `Coercing` declaration, a `Coercing<Object, Object>` declaration, or an anonymous-class declaration whose `I` resolves to `Object` produces a `CoercingErased` rejection with a per-arm hint (extract anonymous class, declare concrete parameters, etc.). + +== Editor support + +The graphitron LSP completes `@scalarType(scalar: |)` on a `scalar X` declaration with the convention-table FQNs, preferring the entry that matches `X` when one exists. Diagnostics surface malformed references (no dot) and unknown classes (FQN whose class part is not on the compile classpath scan) inline; field-level failures (`FieldNotFound`, `CoercingErased`, etc.) surface during the build. + +== See also + +* The graphql-java-extended-scalars project: https://github.com/graphql-java/graphql-java-extended-scalars[graphql-java-extended-scalars] for ready-made `GraphQLScalarType` constants covering `BigDecimal`, `DateTime`, `UUID`, and similar. + +xref:../index.adoc[← Reference index] diff --git a/docs/manual/reference/directives/service.adoc b/docs/manual/reference/directives/service.adoc new file mode 100644 index 0000000000..8563ac320c --- /dev/null +++ b/docs/manual/reference/directives/service.adoc @@ -0,0 +1,90 @@ += @service +:description: Hand off the database operation for a field to a custom Java method. +:!toc: + +Replaces the generated DB operation for a field with a call to an external Java method. Use it when the operation cannot be expressed by the directive surface — multi-statement transactions, business-logic-heavy reads, third-party calls, or shapes the framework does not (yet) cover. + +== SDL signature + +[source,graphql] +---- +directive @service( + service: ExternalCodeReference!, + contextArguments: [String!] +) on FIELD_DEFINITION + +input ExternalCodeReference { + className: String + method: String + argMapping: String +} +---- + +== Parameters + +[cols="1,1,1,3",options="header"] +|=== +| Name | Type | Default | Description +| `service` | `ExternalCodeReference!` | (required) | The Java target. `className` is the fully-qualified implementing class (the carrying artifact must be on the rewrite Maven plugin's classpath); `method` defaults to the GraphQL field name when omitted; `argMapping` rebinds GraphQL argument names to Java parameter names (`"javaParam: graphqlArg, …"`). +| `contextArguments` | `[String!]` | none | Names of values pulled from the request `GraphQLContext` and threaded into the Java method as additional arguments. The runtime must place each named value on the context per request. +|=== + +== Canonical example + +The example schema's root services hand off three different return shapes: + +[source,graphql] +---- +type Query { + filmsByService(ids: [Int!]!): [Film!]! + @service(service: { + className: "no.sikt.graphitron.rewrite.test.services.SampleQueryService", + method: "filmsByService" + }) + + filmsByServiceRenamed(ids: [Int!]!): [Film!]! + @service(service: { + className: "no.sikt.graphitron.rewrite.test.services.SampleQueryService", + method: "filmsByServiceRenamed", + argMapping: "filmIds: ids" + }) + + filmCount: Int! + @service(service: { + className: "no.sikt.graphitron.rewrite.test.services.SampleQueryService", + method: "filmCount" + }) +} +---- + +`filmsByService` returns a `Result<FilmRecord>` directly; the framework treats jOOQ records as already-populated rows and skips its own projection. `filmsByServiceRenamed` shows `argMapping`: the GraphQL arg `ids` binds to the Java parameter `filmIds` because the service method's signature reads more naturally that way. `filmCount` returns a plain scalar. + +The Java surface for the first method: + +[source,java] +---- +public class SampleQueryService { + public SampleQueryService(DSLContext context) { … } + + public Result<FilmRecord> filmsByService(List<Integer> ids) { … } +} +---- + +The framework constructs the service with whatever it can resolve from the request context (a `DSLContext` for the request's database session is the most common parameter); the rest of the method signature is the field's GraphQL arguments, mapped by name (or by `argMapping` overrides). + +== Constraints + +* `service.className` is required. graphql-java rejects a no-arg `@service` at parse time. +* `service.method` defaults to the GraphQL field name. Set it only when the Java method's name diverges. +* `argMapping` is parsed as `"javaParam: graphqlArg"` entries, comma-separated. Whitespace around `:` and `,` is tolerated; multi-line text-block input is accepted. Empty string is identity. +* `@service` and xref:mutation.adoc[`@mutation`] are mutually exclusive on the same field. Use `@mutation` for fully-generated DB writes, `@service` for custom logic. +* On non-root fields, `@service` requires `@splitQuery`: the parent's selection set is collected first, the service method receives a `Set` of parent records (only their primary-key columns populated), and returns a `Map` from those keys to results. Single-statement nested resolution is not supported on the service path. +* Conditions and other DB-customisation directives on the same field are ignored: the service is opaque and the generator does not splice generated SQL into a custom method's body. + +== See also + +* xref:../../how-to/handle-services.adoc[How-to: Handle services] covers nested-input mapping, response shaping, and the `@splitQuery` pattern in depth. +* xref:mutation.adoc[`@mutation`] for the framework-generated alternative. +* xref:../../how-to/test-your-schema.adoc[How-to: Test your schema] for the consumer test pattern with services in play. + +xref:../index.adoc[← Reference index] diff --git a/docs/manual/reference/directives/splitQuery.adoc b/docs/manual/reference/directives/splitQuery.adoc new file mode 100644 index 0000000000..a081a7955c --- /dev/null +++ b/docs/manual/reference/directives/splitQuery.adoc @@ -0,0 +1,109 @@ += @splitQuery +:description: Detach a child field's fetch from its parent's SELECT, dispatching it through a DataLoader keyed on the parent's PK or FK. +:!toc: + +Splits the annotated field's resolution out of the surrounding parent SELECT into a separate, batched query. The rewrite emits a `DataLoader`-backed fetcher: per request, sibling parents' keys are gathered, one batched `SELECT` runs against the child table with a `VALUES`-keyed join, and rows scatter back to their original parent positions. + +`@splitQuery` is the directive that decouples query depth from query *breadth*. Without it, child references inline into the parent SELECT (one round-trip, joined SQL). With it, each `@splitQuery` boundary becomes a deferred `DataLoader` call (more round-trips, narrower SQL, batched across parents). It composes with xref:reference.adoc[`@reference`], xref:lookupKey.adoc[`@lookupKey`], xref:asConnection.adoc[`@asConnection`], and xref:service.adoc[`@service`]. + +== SDL signature + +[source,graphql] +---- +directive @splitQuery on FIELD_DEFINITION +---- + +The directive takes no arguments. The cardinality (single vs list), the FK direction (parent-holds-FK vs child-holds-FK), and the path's hop count are all read from the surrounding xref:reference.adoc[`@reference`] / catalog inference; the rewrite picks the appropriate `DataLoader` shape from those signals. + +== Canonical examples + +List child, child-holds-FK (`@splitQuery` keyed on parent's PK). The DataLoader's batch is `parent_id IN (...)`, distributing rows to parents by FK: + +[source,graphql] +---- +type Language @table(name: "language") { + films: [Film!]! @splitQuery @reference(path: [{key: "film_language_id_fkey"}]) +} +---- + +Single-cardinality, parent-holds-FK (`@splitQuery` keyed on parent's FK column). At least one parent may carry `NULL` in the FK; the rewrite short-circuits those to `null` without dispatching to the DataLoader: + +[source,graphql] +---- +type Customer @table(name: "customer") { + addressSplit: Address @splitQuery @reference(path: [{key: "customer_address_id_fkey"}]) +} + +type Store @table(name: "store") { + manager: Staff @splitQuery @reference(path: [{key: "store_manager_staff_id_fkey"}]) +} +---- + +`Store.manager` traverses a *nullable* FK; the §4 null-FK short-circuit returns `null` without a round-trip when the column is `NULL`. The `@reference` is required even though `Customer.address_id` would auto-infer, because `store` and `staff` have two FKs between them and inference would be ambiguous. + +Multi-hop list with `@lookupKey` (`SplitLookupTableField` — flat `SELECT` + `VALUES+ON` keyset + per-parent scatter): + +[source,graphql] +---- +type Film @table(name: "film") { + actorsBySplitLookup(actor_id: [Int!] @lookupKey): [Actor!]! @splitQuery @reference(path: [ + {key: "film_actor_film_id_fkey"}, + {key: "film_actor_actor_id_fkey"} + ]) +} +---- + +Self-referencing FK (split is *available* for fan-out reduction; not structurally required since the inline emitter handles self-joins via parent-prefixed alias names): + +[source,graphql] +---- +type Film @table(name: "film") { + sequel: Film @splitQuery @reference(path: [{key: "FILM__SEQUEL_FKEY"}]) +} +---- + +Non-root xref:service.adoc[`@service`] (resolver-style fields without an FK chain back to the parent's table need an explicit split): + +[source,graphql] +---- +type City @table(name: "city") { + filmsFromCity: [Film!]! @splitQuery @service(service: {className: "com.example.MockService"}) +} +---- + +Combined with xref:asConnection.adoc[`@asConnection`] (per-parent paginated child connection: `ROW_NUMBER() OVER (PARTITION BY parentInput.idx)` envelope gives each parent its own slice): + +[source,graphql] +---- +type Film @table(name: "film") { + actorsConnection(first: Int, after: String): ActorsConnection! + @splitQuery + @reference(path: [ + {key: "film_actor_film_id_fkey"}, + {key: "film_actor_actor_id_fkey"} + ]) + @defaultOrder(primaryKey: true) +} +---- + +== Constraints + +* Single-cardinality `@splitQuery` is restricted to a *single-hop* xref:reference.adoc[`@reference`] path. Multi-hop single-cardinality is rejected at build time with the offending path's hop count in the message. +* List-cardinality `@splitQuery` supports any hop count, including junction-table chains (`@reference(path: [..., ...])`). +* Implicit on `@table`-typed fields of a class-backed parent reachable from xref:service.adoc[`@service`]: re-entry queries are emitted automatically. Explicit `@splitQuery` on those fields is redundant but not rejected. (`classifyChildFieldOnResultType` never inspects `@splitQuery` on class-backed-parent table-bound fields.) +* Self-referencing FKs work *inline* in the rewrite. `InlineTableFieldEmitter` prefixes alias names with the parent alias's runtime name so recursive subselects don't collide; `Category.parent` and `Category.children` in the example schema cover this end-to-end. `@splitQuery` is available on self-FKs for the same fan-out-reduction reasons as any other reference, but is not required. +* Required when xref:service.adoc[`@service`] is used on a non-root field (the service fetches the row independently of the parent's SELECT; the split is the contract). +* Composes with xref:asConnection.adoc[`@asConnection`]: the per-parent partition envelope is added to the connection's pagination shape. +* Composes with xref:lookupKey.adoc[`@lookupKey`]: the lookup key narrows the per-parent batch (each parent's child list filtered by the caller-provided keys). +* On root (`Query`/`Mutation`) fields and on fields with arguments, `@splitQuery` is irrelevant; those always have explicit data fetchers. The directive is silently ignored there. +* Nullable FKs on parent-holds-FK single-cardinality fields short-circuit to `null` *before* dispatching to the DataLoader (saves a round-trip when no parents have a non-null FK value). + +== See also + +* xref:reference.adoc[`@reference`] supplies the FK chain; `@splitQuery` decides whether to inline or batch it. +* xref:asConnection.adoc[`@asConnection`] adds per-parent Relay pagination on top of a split fetch. +* xref:lookupKey.adoc[`@lookupKey`] narrows the per-parent batch to caller-provided keys. +* Class-backed parents reachable from xref:service.adoc[`@service`] get implicit `@splitQuery` on `@table`-typed children. +* xref:../../how-to/split-vs-inline.adoc[How-to: When to split queries] covers the round-trip-vs-fan-out trade-off, self-FK rules, and DataLoader caching behaviour. + +xref:../index.adoc[← Reference index] diff --git a/docs/manual/reference/directives/table.adoc b/docs/manual/reference/directives/table.adoc new file mode 100644 index 0000000000..cae664bc1c --- /dev/null +++ b/docs/manual/reference/directives/table.adoc @@ -0,0 +1,71 @@ += @table +:description: Bind a GraphQL type to a jOOQ-modelled database table. +:!toc: + +Binds a GraphQL type to a jOOQ-modelled database table so the generator can project columns, build joins, and emit mutations against it. + +== SDL signature + +[source,graphql] +---- +directive @table(name: String) on OBJECT | INPUT_OBJECT | INTERFACE +---- + +== Parameters + +[cols="1,1,1,3",options="header"] +|=== +| Name | Type | Default | Description +| `name` | `String` | type name (case-insensitive) | The jOOQ table identifier. Must match the SQL identifier as it appears in jOOQ's catalog. Omit when the GraphQL type name already equals the table name. For jOOQ catalogs that span multiple schemas, the value can be qualified as `"schema.table"` to scope the lookup; an unqualified value is only accepted when exactly one schema in the catalog contains a table with that name. +|=== + +== Canonical example + +The tutorial's `Customer` type binds to the `customer` table: + +[source,graphql] +---- +type Customer implements Node @table(name: "customer") @node { + customerId: Int! @field(name: "CUSTOMER_ID") + firstName: String! @field(name: "FIRST_NAME") + address: Address @reference(path: [{key: "customer_address_id_fkey"}]) +} +---- + +A query that selects `customers { firstName }` produces a `SELECT customer.first_name` against this binding. Because the type carries `@table`, every `@field`-annotated column inside resolves against the `customer` table by default; nested types like `Address` re-bind via their own `@table` and join to `Customer` through `@reference`. + +For mutations, `@table` is also required on the *input* type so the generator knows which table the `INSERT`, `UPDATE`, or `UPSERT` targets: + +[source,graphql] +---- +input FilmCreateInput @table(name: "film") { + title: String! @field(name: "title") + languageId: Int! @field(name: "language_id") +} +---- + +[WARNING] +.Deprecated on input types +==== +Applying `@table` to an input (`INPUT_OBJECT`) is deprecated and will be removed in a future release. `@table` on `OBJECT` and `INTERFACE` is unaffected. + +A mutation's write/read target is derived from the consuming field's resolved target table, so the directive on the input is redundant. Remove it. A non-fatal build warning fires per `@table`-on-input usage. + +One case still needs the directive for now: a mutation returning an *encoded ID or scalar* (e.g. `createFilm(...): ID`). There the return type carries no `@table`, so the input's `@table` is currently the only signal naming the write target, and the build does not warn on that usage yet. The other write shapes (returning a `@table` type, or a payload wrapping one) already derive the target from the return, so their inputs warn today. +==== + +== Constraints + +* The `name` parameter must resolve to a real jOOQ table; the generator fails the build with an unclassified-type error if the catalog has no matching `Table` class. Use the same case the jOOQ generator emits (typically uppercase for PostgreSQL identifiers, but follow your project's catalog). +* When omitted, the generator looks up the jOOQ table by GraphQL type name (case-insensitive). A type named `Customer` therefore resolves to the `customer` table without explicit configuration. +* Containing fields default to the type's table for column lookup. A nested `@table` re-binds; an `@reference`-annotated field hops into the joined table for the duration of that field's subquery. +* For multi-schema catalogs, an unqualified `name:` must be unique across schemas. When the same bare name exists in two or more schemas (`event` in `public` and `archive`, say), the build fails with `@table(name: 'event') is ambiguous: defined in schemas [public, archive]; qualify as 'public.event', 'archive.event'`. Disambiguate by qualifying explicitly: `@table(name: "public.event")`. Single-schema consumers see no change; only collision sites are forced to qualify. A genuinely missing name (no schema contains it) falls through to the standard `table 'X' could not be resolved in the jOOQ catalog` rejection with a Levenshtein-ranked candidate hint. + +== See also + +* xref:../../tutorial/02-first-schema.adoc[Tutorial page 2: The starter schema] introduces `@table` and `@field` together. +* xref:field.adoc[`@field`] for column-level binding inside a `@table`-bound type. +* xref:reference.adoc[`@reference`] for explicit join paths between two `@table`-bound types. +* xref:mutation.adoc[`@mutation`] for the input-type role on writes. + +xref:../index.adoc[← Reference index] diff --git a/docs/manual/reference/index.adoc b/docs/manual/reference/index.adoc new file mode 100644 index 0000000000..6908bb1e8c --- /dev/null +++ b/docs/manual/reference/index.adoc @@ -0,0 +1,91 @@ += Reference +:description: Authoritative descriptions of every directive, plugin parameter, and runtime API entry point. +:!toc: + +Authoritative descriptions of every directive, every Maven plugin parameter, every runtime API entry point, and every diagnostic code Graphitron emits. + +== Runtime API + +* xref:runtime-api.adoc[Runtime API reference]: the `Graphitron.buildSchema(...)` facade (single-arg and federation two-arg overloads), the `Graphitron.newExecutionInput(...)` schema-driven factory (`DSLContext` first, then typed `contextArgument` slots reflected from your `@service` / `@condition` directives), the sealed `GraphitronContext` per-request interface (`getDslContext`, `getContextArgument`, `getValidator`), and the `NodeIdEncoder` utility (generic `encode`/`peekTypeId`/`decodeValues` plus per-Node `encode<TypeName>` and `decode<TypeName>` helpers). + +== Maven plugin + +* xref:mojo-configuration.adoc[Maven plugin configuration]: every parameter on every goal of `graphitron-maven-plugin`. Covers the three goals (`generate`, `validate`, `dev`), the shared `<configuration>` parameters (`outputDirectory`, `outputPackage`, `jooqPackage`, `schemaInputs`, `namedReferences`), the `dev`-only watch parameters (`port`, `debounceMs`, `skipInitial`), and the two complex POM bindings (`<schemaInput>`, `<namedReference>`). + +== Editor support + +* xref:lsp-requirements.adoc[LSP requirements]: the LSP's native runtime. Both the GraphQL grammar and the `libtree-sitter` runtime ship bundled, so there is no system dependency to install. Covers the supported host architectures and the startup diagnostics. +* xref:lsp-inlay-hints.adoc[LSP inlay hints and classification hover]: the three editor-side config keys (`graphitron.inlayHints.inferredDirectives`, `graphitron.inlayHints.classification`, `graphitron.hover.classification`) that surface Graphitron's inference and classification layers inside the editor. Default off; opt in per key. + +== Diagnostics + +* xref:diagnostics-glossary.adoc[Diagnostics glossary]: every closed-set diagnostic code the validator emits, organised by category. Covers the three top-level rejection kinds (`author-error`, `invalid-schema`, `deferred`), the nine name-lookup attempt kinds (`column`, `table`, `foreign-key`, `service-method`, `lifter-method`, `enum-constant`, `type-name`, `nodeid-key-column`, `dml-kind`), and the four deferred emit-block reasons. + +== Deprecations + +* xref:deprecations.adoc[Deprecations]: aggregator for every deprecated directive argument, input field, and whole directive in the rewrite, with migration guidance pointing back at the canonical directive page. + +== Directives + +[cols="1,1",frame=none,grid=none] +|=== +a| +=== Alphabetical + +* xref:directives/asConnection.adoc[`@asConnection`] +* xref:directives/condition.adoc[`@condition`] +* xref:directives/defaultOrder.adoc[`@defaultOrder`] +* xref:directives/discriminate.adoc[`@discriminate`] +* xref:directives/discriminator.adoc[`@discriminator`] +* xref:directives/enum.adoc[`@enum`] +* xref:directives/error.adoc[`@error`] +* xref:directives/externalField.adoc[`@externalField`] +* xref:directives/field.adoc[`@field`] +* xref:directives/index-directive.adoc[`@index`] _(deprecated, use `@order(index:)`)_ +* xref:directives/lookupKey.adoc[`@lookupKey`] +* xref:directives/multitableReference.adoc[`@multitableReference`] _(rejected, remove from the schema)_ +* xref:directives/mutation.adoc[`@mutation`] +* xref:directives/node.adoc[`@node`] +* xref:directives/nodeId.adoc[`@nodeId`] +* xref:directives/notGenerated.adoc[`@notGenerated`] _(rejected, remove from the schema)_ +* xref:directives/order.adoc[`@order`] +* xref:directives/orderBy.adoc[`@orderBy`] +* xref:directives/record.adoc[`@record`] _(deprecated, ignored, remove from the schema)_ +* xref:directives/reference.adoc[`@reference`] +* xref:directives/service.adoc[`@service`] +* xref:directives/splitQuery.adoc[`@splitQuery`] +* xref:directives/table.adoc[`@table`] + +a| +=== By category + +*Mapping* + +xref:directives/table.adoc[`@table`], xref:directives/field.adoc[`@field`], xref:directives/enum.adoc[`@enum`], xref:directives/record.adoc[`@record`] (deprecated, ignored) + +*Joining* + +xref:directives/reference.adoc[`@reference`] + +*Querying* + +xref:directives/asConnection.adoc[`@asConnection`], xref:directives/condition.adoc[`@condition`], xref:directives/externalField.adoc[`@externalField`], xref:directives/lookupKey.adoc[`@lookupKey`], xref:directives/splitQuery.adoc[`@splitQuery`] + +*Mutating* + +xref:directives/mutation.adoc[`@mutation`], xref:directives/service.adoc[`@service`] + +*Sorting* + +xref:directives/orderBy.adoc[`@orderBy`], xref:directives/order.adoc[`@order`], xref:directives/defaultOrder.adoc[`@defaultOrder`], xref:directives/index-directive.adoc[`@index`] (deprecated) + +*Error handling* + +xref:directives/error.adoc[`@error`] + +*Polymorphism* + +xref:directives/discriminate.adoc[`@discriminate`], xref:directives/discriminator.adoc[`@discriminator`] + +*Global ID* + +xref:directives/node.adoc[`@node`], xref:directives/nodeId.adoc[`@nodeId`] + +*Rejected by the rewrite* + +xref:directives/notGenerated.adoc[`@notGenerated`], xref:directives/multitableReference.adoc[`@multitableReference`] (remove from the schema) + +|=== + +xref:../index.adoc[← Back to the manual landing] diff --git a/docs/manual/reference/lsp-inlay-hints.adoc b/docs/manual/reference/lsp-inlay-hints.adoc new file mode 100644 index 0000000000..932f4c4611 --- /dev/null +++ b/docs/manual/reference/lsp-inlay-hints.adoc @@ -0,0 +1,75 @@ += LSP inlay hints and classification hover +:description: Reference for the Graphitron LSP's inlay-hint surface and the classification-hover content, plus the three editor-side config keys that gate them. +:keywords: graphitron, lsp, inlay hints, hover, classification, configuration + +The Graphitron LSP surfaces two layers the schema author normally cannot see: inference (the canonical-argument value Graphitron fills in for `@table` / `@field` / `@reference` when the author omits it) and classification (the sealed-variant identity the classifier assigns to every field and type, fully determining the generated code). Both layers are off by default and light up through editor-side config. + +== Three config keys + +All three live under the `graphitron.inlayHints` (and `graphitron.hover`) namespace and default to `false`. The LSP pulls them via `workspace/configuration` on initialisation and refreshes them on `workspace/didChangeConfiguration`. A client that does not implement `workspace/configuration` leaves the defaults in effect; no error is surfaced. + +[cols="1,1,3"] +|=== +| Key | Default | Effect + +| `graphitron.inlayHints.inferredDirectives` +| `false` +| Renders a ghost annotation at `@table` / `@field` / `@reference` sites where the author wrote the directive bare. The annotation shows the resolved value the classifier produced (`name: "customer"`, `path: [{key: "film_language_id_fkey"}]`, etc.). + +| `graphitron.inlayHints.classification` +| `false` +| Renders a compact classification label at every field declaration and every object / interface / input / union / scalar / enum type declaration. Labels include `"column"`, `"table field"`, `"query node field"`, `"insert mutation"`, `"node type"`, `"table input"`, and the rest of the closed vocabulary. + +| `graphitron.hover.classification` +| `false` +| Enables rich hover content on field-declaration and type-declaration name tokens. Where the inlay hint shows a compact label, the hover popup unpacks the variant's load-bearing payload (table, column, FK path, target type, error channel, DML verb, ...) as markdown. +|=== + +The three toggles are independent: a user who wants ghost annotations for inferred directives but not classification labels gets exactly that. + +== Inferred-directive hints + +Renders only when the canonical argument is _absent_ from the SDL source. The LSP asks the live tree-sitter parse tree whether the argument node exists in the buffer; when it does not, the LSP looks up the resolved value on the classification projection the build pipeline shipped to it. Three sites today: + +* `@table` without `name:` — shows `name: "<table>"` (the table name the classifier resolved). +* `@field` without `name:` — shows `name: "<column>"` (the column name the classifier resolved). +* `@reference` without `path:` — shows `path: [{key: "..."}]` or `path: [{table: "..."}]` for each step in the resolved FK chain. + +Adding the canonical argument to the directive removes the hint immediately on next paint, without waiting for a regenerate cycle. + +== Classification hints + +Renders on every field declaration and every type declaration. Labels are 1:1 with the generator-side sealed permits and are stable across renames of the underlying types; the user-facing label vocabulary is owned by the LSP module, not by the generator-side type names. + +== Classification hover + +Renders the projection's load-bearing payload as markdown when the cursor is on a field-declaration or type-declaration name token (outside any directive). The hover content includes: + +* The friendly label (matching the inlay hint). +* The qualified coordinate (`ParentType.fieldName` for fields; the type name for types). +* Per-permit payload: target table, column name, FK chain, participant set, discriminator column, DML verb, error-channel constant, input type name, accessor / column duality for class-backed-parent fields, and so on. + +Hover stays distinct from the directive-argument-keyed dispatch (`@table(name:)`, `ExternalCodeReference.method`, ...): the existing directive-arg hovers keep firing when the cursor sits inside a directive, and the classification hover fires only as a fallback on declaration coordinates. + +== Stale-snapshot behaviour + +Mirroring the existing `userArgHover` and `columnHover` arms, hints render under both `LspSchemaSnapshot.Built.Current` and `LspSchemaSnapshot.Built.Previous` indistinguishably (the "prefer stale info over silence" policy). The next successful generator pass replaces stale with current; the gap is bounded by the dev-pipeline's regenerate cadence, typically a save away. + +Under `LspSchemaSnapshot.Unavailable` (pre-build), no hints render. The editor simply does not see the inlay-hint kind, and the classification hover is empty. + +== Editor configuration + +The keys live under the workspace's settings root. In a VS Code-style `settings.json`: + +[source,json] +---- +{ + "graphitron.inlayHints.inferredDirectives": true, + "graphitron.inlayHints.classification": true, + "graphitron.hover.classification": true +} +---- + +The editor's LSP client forwards these to the Graphitron LSP through the `workspace/configuration` request on initialisation and the `workspace/didChangeConfiguration` notification on subsequent flips. + +xref:index.adoc[← Back to the reference index] diff --git a/docs/manual/reference/lsp-requirements.adoc b/docs/manual/reference/lsp-requirements.adoc new file mode 100644 index 0000000000..d277b72b7a --- /dev/null +++ b/docs/manual/reference/lsp-requirements.adoc @@ -0,0 +1,36 @@ += LSP requirements +:description: Reference for the Graphitron LSP's native runtime. Both native pieces of its GraphQL parser ship in the graphitron-tree-sitter-natives jar and are extracted at startup, so there is no system dependency to install. Lists the supported host architectures and the startup diagnostics. +:keywords: graphitron, lsp, tree-sitter, libtree-sitter, jtreesitter, native, runtime, requirements + +The Graphitron LSP, started by the `dev` goal of the Maven plugin (`mvn graphitron:dev`), parses GraphQL with a tree-sitter-based parser. That parser has two native pieces, and both ship with the LSP: + +* The *GraphQL grammar* (`tree_sitter_graphql`). +* The *tree-sitter runtime* (`libtree-sitter`, exporting the `ts_*` symbols). + +Both are bundled per-platform in the `no.sikt:graphitron-tree-sitter-natives` jar and extracted to temp files at startup. *You do not install anything*: there is no system dependency. + +== Supported host architectures + +The bundled binaries cover four host platforms: + +* `linux-x86_64` +* `linux-aarch64` +* `macos-aarch64` +* `windows-x86_64` + +Intel-Mac (`macos-x86_64`) is not shipped. On an unsupported host the LSP fails fast at startup naming the `os.name` / `os.arch` it saw and the supported set. + +== Startup diagnostics + +Because nothing is installed, the only native failure mode is the bundled runtime failing to load *after* it has been extracted from the jar. The LSP does not let the underlying `UnsatisfiedLinkError` surface raw; it reports a single startup error naming the temp path the runtime was extracted to. The usual causes: + +* *`noexec` temp directory*: the JVM's `java.io.tmpdir` is mounted `noexec`, so the extracted shared library cannot be loaded. Point `java.io.tmpdir` at an exec-capable directory (for example `-Djava.io.tmpdir=$HOME/.cache/graphitron`). +* *Corrupt extract*: the temp file was truncated or removed mid-session (an aggressive temp-cleaner, a full disk). Restart the LSP so it re-extracts. +* *Missing system C runtime*: the host lacks a base C runtime the shared library links against. This is rare on the supported platforms; install your distribution's base C runtime package. + +== See also + +* xref:lsp-inlay-hints.adoc[LSP inlay hints and classification hover]: the editor-side config keys that surface Graphitron's inference and classification layers. +* xref:../../architecture/how-to/dev-loop-internals.adoc#native-runtime-dependency[Dev loop internals: native runtime dependency] for the same "nothing to install" note in the context of the `dev`-loop internals. + +xref:index.adoc[← Back to the reference index] diff --git a/docs/manual/reference/mojo-configuration.adoc b/docs/manual/reference/mojo-configuration.adoc new file mode 100644 index 0000000000..779dee2a0e --- /dev/null +++ b/docs/manual/reference/mojo-configuration.adoc @@ -0,0 +1,209 @@ += Maven plugin configuration +:description: Every parameter of every goal on Graphitron's Maven plugin (graphitron-maven-plugin). Covers the three goals (generate, validate, dev), the four shared <configuration> parameters, the dev-only watch parameters, the two complex POM bindings (<schemaInput>, <namedReference>), and the CLI -D properties. +:!toc: + +`graphitron-maven-plugin` exposes three Maven goals: `generate` (the build-time codegen pipeline), `validate` (a faster schema-only run that emits no Java), and `dev` (the editor-loop server). Each goal accepts the same handful of `<configuration>` parameters; `dev` adds three of its own. Two of the parameters (`<schemaInputs>` and `<namedReferences>`) are list-of-complex-objects with their own POM bindings. + +This page is the parameter-by-parameter reference. The xref:../tutorial/01-prerequisites.adoc[tutorial's first chapter] introduces the canonical `<configuration>` shape with one schema input and the two required packages; the directive reference under xref:directives/index.adoc[`reference/directives`] covers what each schema input declares. + +== Goals + +[cols="1,1,2,2",options="header"] +|=== +| Goal | Default phase | Purpose | Required parameters + +| `generate` +| `generate-sources` +| Run the rewrite pipeline (load → attribute → classify → validate → emit) and write Java sources under `<outputDirectory>`. Adds `<outputDirectory>` as a compile source root so the consumer's `compile` phase picks the generated code up automatically. +| `<outputPackage>`, `<jooqPackage>` + +| `validate` +| `validate` +| Run load → attribute → classify → validate only. No Java is emitted; the pipeline stops after validation. Useful as a CI gate when you want a schema check without paying for the full code generation. +| (none; both packages are optional, a sentinel is substituted) + +| `dev` +| (none; CLI-only) +| Run the LSP server on `127.0.0.1:8487` and watch `<schemaInputs>` for writes matching `<schemaFileExtensions>` (default `.graphqls` / `.graphql`) plus the consumer's compiled jOOQ output for `.class` changes. Re-runs the generator on every save (debounced) and rebuilds the in-process catalog atomically. Stop with Ctrl+C. +| `<outputPackage>`, `<jooqPackage>` +|=== + +The plugin coordinates are `no.sikt:graphitron-maven-plugin`; bind a goal to a `<execution>` block under the rewrite plugin's `<executions>` to wire it into the standard Maven lifecycle, or invoke from the command line with `mvn graphitron:<goal>`. + +== Shared parameters + +The following parameters apply to every goal: + +[cols="1,1,1,3",options="header"] +|=== +| Name | Type | Default | Description + +| `outputDirectory` +| `String` (path) +| `${project.build.directory}/generated-sources/graphitron` +| Directory the `generate` goal writes Java sources into. Resolved against the project basedir if relative. The `generate` goal also adds this directory as a compile source root so the consumer's `compile` phase picks up the generated code; `validate` and `dev` honour the parameter for their own context-construction but do not add the source root. + +| `outputPackage` +| `String` (Java package) +| (none) +| Root Java package the generator writes under. Required for `generate` and `dev`; optional for `validate` (a sentinel package is substituted because the validate goal never emits code). The `Graphitron` facade lands at `<outputPackage>.Graphitron` and `GraphitronContext` at `<outputPackage>.schema.GraphitronContext`. + +| `jooqPackage` +| `String` (Java package) +| (none) +| Root Java package of the consumer's jOOQ-generated catalog (the `Tables` / `Keys` / `Routines` classes). Required for `generate` and `dev`; optional for `validate`. The classifier resolves every `@table` and `@field` against the catalog rooted at this package. + +| `schemaInputs` +| `List<SchemaInputBinding>` +| empty +| List of `<schemaInput>` entries pointing at schema files (or globs that expand to schema files) the loader assembles into one schema. By default schema files are those ending in `.graphqls` or `.graphql`; the `<schemaFileExtensions>` parameter narrows or extends that set. Order matters when two files declare the same type with overlapping fields; later entries win. See xref:#schemainput-binding[`<schemaInput>` binding] for the per-entry shape. + +| `namedReferences` +| `List<NamedReferenceBinding>` +| empty +| Reusable `name` → `className` mappings the SDL refers to via `ExternalCodeReference.name:` instead of repeating a fully qualified class name at every directive site. Each entry carries `<name>` and `<className>` children. Empty by default; populated only when the same external class is referenced from many places. + +| `schemaFileExtensions` +| `List<String>` +| `[".graphqls", ".graphql"]` +| File-name suffixes that count as GraphQL schema files. Drives three places at once: the `<schemaInputs>` post-scan filter (matches are kept only when the filename ends in a configured suffix), the `graphitron:dev` watcher's trigger filter (only writes matching a configured suffix fire a regenerate), and the orphan-file scanner that runs when schema validation fails (only files with a configured suffix can be reported as orphans). Leading dots are optional (`graphqls` normalises to `.graphqls`); case is preserved. A configured but empty list is rejected at Mojo execute; omit the parameter to accept the default. +|=== + +== `dev`-goal parameters + +Three watch-loop knobs unique to the `dev` goal, each driven from a CLI property: + +[cols="1,1,1,1,3",options="header"] +|=== +| Name | Type | Default | CLI property | Description + +| `port` +| `int` +| `8487` +| `graphitron.dev.port` +| TCP port the LSP server binds on `127.0.0.1`. The plugin fails fast with a clear message when the port is in use, naming the override property. + +| `debounceMs` +| `long` +| `300` +| `graphitron.dev.debounceMs` +| Debounce window for both the schema watcher and the classpath watcher. Multiple `.graphqls` writes inside the window collapse into one regenerate; the same applies to `.class` changes for the catalog rebuild. Lower for snappier response, higher for noisy editors. + +| `skipInitial` +| `boolean` +| `false` +| `graphitron.dev.skipInitial` +| Skip the initial generator pass at startup. Useful when the consumer has just run `mvn graphitron:generate` and the generated sources are already on disk; the dev loop still re-runs on every subsequent save. +|=== + +The CLI properties take precedence over `<configuration>` values, so `mvn graphitron:dev -Dgraphitron.dev.port=9090` works without editing the POM. + +=== Quarkus dev-mode interaction + +Consumers running their app under `quarkus:dev` alongside `graphitron:dev` may find that schema edits regenerate sources but the running app keeps serving the old `GraphQLSchema` until they press `s` in the Quarkus console. The cause is Quarkus's bytecode-instrumentation hot-swap: it sees the regenerated `.java` files, decides the changes are method-body-compatible, and replaces classes in place rather than restarting. The schema bean is built once at startup, so a hot-swap doesn't rebuild it. The matching log line is `Files changed but restart not needed - notified extensions`: Quarkus saw the change, asked its extensions, and none claimed it as restart-worthy. + +Set `quarkus.live-reload.instrumentation=false` in `application.properties` to disable instrumentation hot-swap entirely. Every change triggers a full restart, including the schema rebuild. The cost is losing hot-swap on hand-edited Java; for a schema-driven app that is usually the right trade. Putting the `.graphqls` files on a watched path does not help on its own — Quarkus already watches `src/main/resources/`, but a change there is still classified by extension claims, and no shipped Quarkus extension claims `.graphqls` as restart-worthy. + +[#schemainput-binding] +== `<schemaInput>` binding + +Each `<schemaInput>` carries three optional children. The `pattern` is the only one most consumers need: + +[cols="1,1,3",options="header"] +|=== +| Child | Type | Description + +| `pattern` +| `String` (Ant-style glob) +| Path or Ant glob relative to the project basedir, expanding to one or more `.graphqls` files. A literal path matches one file; a glob like `src/main/resources/graphql/**/*.graphqls` matches every schema file under the directory. Both shapes fan into the same loader. + +| `tag` +| `String` +| Optional tag applied to every type, field, argument, and enum value defined in matched files. Emitted as a `@tag(name: "...")` directive on each element. The plugin treats this as an implicit Federation 2 opt-in: when set without an `@link` in the SDL, the plugin synthesises one with `import: ["@tag"]`; when set with an `@link` whose import list omits `"@tag"`, the build fails with a fatal error pointing at the `@link`. xref:../how-to/apollo-federation.adoc[How-to: Apollo Federation transport] covers the federation interaction. + +| `descriptionNote` +| `String` +| Optional sentence appended to every element's description. Useful for marking a subgraph's elements with a provenance hint (e.g. `"From the orders subgraph"`) without editing the SDL by hand. +|=== + +The minimum useful entry is one `pattern`: + +[source,xml] +---- +<schemaInputs> + <schemaInput> + <pattern>src/main/resources/graphql/schema.graphqls</pattern> + </schemaInput> +</schemaInputs> +---- + +== `<namedReference>` binding + +Each `<namedReference>` carries two required children: + +[cols="1,1,3",options="header"] +|=== +| Child | Type | Description + +| `name` +| `String` +| Lookup key the SDL uses to refer to this reference. Matched against the `name:` argument of `ExternalCodeReference`-bearing directives (see xref:directives/condition.adoc[`@condition`], xref:directives/externalField.adoc[`@externalField`], xref:directives/service.adoc[`@service`]). Names live in a flat namespace; collisions are an author error. + +| `className` +| `String` (FQCN) +| Fully qualified Java class name the reference resolves to. The classifier checks this against the consumer module's classpath and fails the build with the offending name if the class can't be resolved. +|=== + +`<namedReferences>` is empty by default; consumers populate it when the same external class is referenced from many places and the FQCN repetition becomes painful. The directive-site form (without `name:`) takes a literal `className`, so this binding is purely an indirection and never adds new capability. + +== `validate`-goal sentinel + +The `validate` goal exists so consumers can run `mvn graphitron:validate` from the command line without editing their POM's `<execution>` block to thread `<outputPackage>` / `<jooqPackage>`. The mojo substitutes an inert sentinel (`validation.unused`) for both packages when they are not configured, so the classifier stage still type-checks against `RewriteContext`'s non-null contract. The sentinel never reaches generated code; the validate pipeline emits nothing. + +If the parameters *are* configured (e.g. when `validate` is bound to the `validate` lifecycle phase alongside a `generate` execution), the configured values flow through normally; the sentinel only activates when the parameters are absent. + +== Putting it together + +The canonical generate-and-deploy `<execution>` against the example schema: + +[source,xml] +---- +<plugin> + <groupId>no.sikt</groupId> + <artifactId>graphitron-maven-plugin</artifactId> + <version>${graphitron.version}</version> + <executions> + <execution> + <id>rewrite-generate</id> + <goals><goal>generate</goal></goals> + <configuration> + <schemaInputs> + <schemaInput> + <pattern>src/main/resources/graphql/schema.graphqls</pattern> + </schemaInput> + </schemaInputs> + <jooqPackage>com.example.jooq</jooqPackage> + <outputPackage>com.example.generated</outputPackage> + </configuration> + </execution> + </executions> +</plugin> +---- + +For the dev loop add a second execution bound to no phase, or invoke `mvn graphitron:dev` directly. `graphitron-sakila-example`'s pre-wired POM (`graphitron-sakila-example/pom.xml`) is the canonical worked example. + +== Codegen classpath + +The reflection sites that resolve consumer-declared classes (`@service` / `@externalField` / `@tableMethod` target classes, the classes a type's backing record is reflected from off its producing field, `@condition` resolvers, the generated jOOQ `DefaultCatalog`) load from the *project's* compile classpath plus every reactor sibling's `target/classes`, not from the plugin realm. Any artifact already declared as a normal `<dependency>` of the consumer module is visible to the generator at codegen time; consumers do not need to mirror service / catalog jars under `<plugin><dependencies>`. The rare legitimate case where `<plugin><dependencies>` still makes sense is pinning a service or catalog jar to a different version from the project's compile dep ; the plugin realm parents the codegen loader, so an override under `<plugin><dependencies>` still wins through the parent chain. + +== Drift protection + +A bidirectional coverage test (`MojoDocCoverageTest` in `graphitron-maven-plugin`) asserts every `@Parameter`-annotated field on `AbstractRewriteMojo`, `GenerateMojo`, `ValidateMojo`, and `DevMojo` has a row in this page's parameter tables, and every parameter row corresponds to an annotated field on one of those Mojos. A new `@Parameter` field cannot land green without a doc row; a removed field forces the row's removal. + +== See also + +* xref:runtime-api.adoc[Runtime API reference] covers the `Graphitron` facade and `GraphitronContext` interface this plugin's `generate` goal emits into the consumer module. +* xref:directives/index.adoc[Directive reference] covers the SDL surface every `<schemaInput>` parses against; `<namedReference>` entries match `ExternalCodeReference.name:` on the four directives that take external Java code. +* xref:../tutorial/01-prerequisites.adoc[Tutorial page 1: Prerequisites] is the first place a consumer meets the plugin and the example consumer's pre-wired POM. + +xref:index.adoc[← Reference index] diff --git a/docs/manual/reference/runtime-api.adoc b/docs/manual/reference/runtime-api.adoc new file mode 100644 index 0000000000..2fa909154a --- /dev/null +++ b/docs/manual/reference/runtime-api.adoc @@ -0,0 +1,165 @@ += Runtime API reference +:description: The hand-written-feeling runtime surface Graphitron emits into your generated sources. Covers the Graphitron facade's buildSchema entry point, the GraphitronContext per-request extension interface, and the NodeIdEncoder utility class. +:!toc: + +Three hand-written-feeling classes ship as part of every Graphitron code-generation run. They aren't pulled in from a runtime library; they are *emitted into your `<outputPackage>` source tree* alongside the type-specific fetchers, and your consumer module compiles them. This is what keeps the runtime dependency surface flat: your code depends on jOOQ, graphql-java, and your own generated sources, nothing else. + +This page documents the public method surface of all three. The directive reference under xref:directives/index.adoc[`reference/directives`] covers what gets emitted *because of* SDL declarations; this page covers what gets emitted *unconditionally* and how your consumer code calls into it. + +== `Graphitron` facade + +Emitted by `GraphitronFacadeGenerator` into `<outputPackage>`. Single public entry point for building the schema: + +[source,java] +---- +public final class Graphitron { + + public static GraphQLSchema buildSchema( + Consumer<GraphQLSchema.Builder> customizer); + + // Emitted only when your SDL declares a federation @link. + public static GraphQLSchema buildSchema( + Consumer<GraphQLSchema.Builder> schemaCustomizer, + Consumer<SchemaTransformer> federationCustomizer); +} +---- + +`buildSchema` returns a fully wired `GraphQLSchema`: every type, field, fetcher, and directive Graphitron understands is attached before the schema is built. Custom scalars are wired automatically from the `@scalarType(scalar:)` directive on each `scalar` declaration (see xref:directives/scalarType.adoc[`@scalarType` directive]); the `customizer` lambda receives the underlying `GraphQLSchema.Builder` so consumer code can layer in additional non-scalar types, hand-rolled type resolvers, or custom directives before the build. + +=== Customizer contract + +The customizer is *additive only*. The following are unsupported and break the assembled schema: + +* `.query(...)` / `.mutation(...)` / `.subscription(...)` -- replaces the root types Graphitron just wired. +* `.clearDirectives()` -- drops the directive set Graphitron emits for federation, authorization, and validation. +* `.codeRegistry(GraphQLCodeRegistry)` (the *replace* overload) -- replaces the fetcher registry Graphitron just populated. + +The supported extension shape for `codeRegistry` is the *transform* overload `.codeRegistry(UnaryOperator<GraphQLCodeRegistry.Builder>)`; that one is fine and is the seam for adding type resolvers to interfaces and unions whose Java types Graphitron cannot infer (hand-rolled domain types, types pulled in from a non-Graphitron source, polymorphic shapes outside the catalog). xref:../how-to/polymorphic-types.adoc[How-to: Polymorphic types] covers the resolver shape. + +The customizer runs *once per schema build*, not once per request. Per-request runtime values flow through `GraphitronContext` on the `ExecutionInput.graphQLContext`, not through this lambda. + +=== Federation two-arg overload + +When at least one of your `.graphqls` files carries an Apollo Federation `@link`, the generator emits a second overload that exposes the federation builder. The federation customizer's most useful method is `fetchEntities(...)` for swapping in a hand-rolled entity fetcher: + +[source,java] +---- +GraphQLSchema schema = Graphitron.buildSchema( + b -> {}, + fed -> fed.fetchEntities(myCustomFetcher)); +---- + +Without the `@link`, the federation overload isn't emitted, the federation surface stays out of the build entirely, and `buildSchema` returns a vanilla schema. xref:../how-to/apollo-federation.adoc[How-to: Apollo Federation transport] covers the transport-side wiring; xref:../how-to/federation-keys.adoc[How-to: Federation key fields] covers entity-side declaration. + +== `GraphitronContext` interface + +Emitted by `GraphitronContextInterfaceGenerator` into `<outputPackage>.schema`. The sealed per-request contract every generated DataFetcher reads from. Apps no longer implement it; the only impl is the generator's own `GraphitronContextImpl` singleton (nested inside the interface for same-compilation-unit permits), populated by `Graphitron.newExecutionInput(...)`. + +[source,java] +---- +public sealed interface GraphitronContext { + + default DSLContext getDslContext(DataFetchingEnvironment env) { + return env.getGraphQlContext().get(DSLContext.class); + } + + default Object getContextArgument(DataFetchingEnvironment env, String name) { + Object value = env.getGraphQlContext().get(name); + if (value == null) { + throw new IllegalStateException("context value '" + name + + "' was not supplied; call Graphitron.newExecutionInput(...) to populate it"); + } + return value; + } + + default Validator getValidator(DataFetchingEnvironment env) { + return DefaultValidatorHolder.INSTANCE; + } + + final class GraphitronContextImpl implements GraphitronContext { + public static final GraphitronContextImpl INSTANCE = new GraphitronContextImpl(); + private GraphitronContextImpl() {} + } +} +---- + +The factory IS the registration point; the parameter list is schema-driven (`DSLContext` first, then one parameter per `contextArgument` named in `@service` / `@tableMethod` / `@condition` directives, alphabetically): + +[source,java] +---- +ExecutionInput input = Graphitron.newExecutionInput(dsl, /* contextArgs... */) + .query(query) + .build(); +---- + +Generated fetchers retrieve the impl through a private helper emitted once per `*Fetchers` class (`graphitronContext(env)`); generated helpers that issue SQL on behalf of those fetchers (for example, `ConnectionHelper.totalCount(env)` for `@asConnection` connections) emit the same shim. The sealed-interface + singleton-impl pair means `GraphitronContext` is global to the build, not per-request; all per-request state lives in the `GraphQLContext` the factory populates. + +=== `getDslContext` + +Reads the per-request `DSLContext` from `env.getGraphQlContext().get(DSLContext.class)`, populated by the factory's `defaultDsl` parameter. The default impl is the only impl; this is not an override point. To return a tenant-specific `DSLContext` per request, build the right `DSLContext` at request entry and pass it to `Graphitron.newExecutionInput(dsl, ...)` (reintroduced under R45's tenant-column work). + +=== `getContextArgument` + +Reads the value from `env.getGraphQlContext()` (under the contextArgument's string name) and returns it as `Object`; the cast to the expected Java type happens at the generated call site (`(String) graphitronContext(env).getContextArgument(env, "userId")`). A missing entry throws `IllegalStateException` naming the contextArgument and pointing the reader at `Graphitron.newExecutionInput(...)`; a wrong-typed entry surfaces as `ClassCastException` at the generated cast. Both throw paths are only reachable when a consumer hand-rolls an `ExecutionInput.Builder` outside the factory; going through `Graphitron.newExecutionInput(...)` makes the same mistake a compile error at the call site, because the factory's typed parameter slot IS the reflected expected type. The framework's redact path replaces the prose message with a correlation-id reference before it reaches the consumer, so the runtime throw is server-log surface only; the typed factory is the load-bearing diagnostic. + +xref:../how-to/condition-cascade.adoc[How-to: Stacking and overriding conditions] covers the call-site shape; the supplying side is the factory's typed parameter slot. + +=== `getValidator` + +Returns the `jakarta.validation.Validator` the wrapper's pre-execution validation step uses for this fetch. Defaults to the JVM's default validator factory: + +[source,java] +---- +default Validator getValidator(DataFetchingEnvironment env) { + return DefaultValidatorHolder.INSTANCE; +} +---- + +`DefaultValidatorHolder` is a holder-class idiom inside the same emitted file; its `INSTANCE` is initialised on the first call to `getValidator` (`Validation.buildDefaultValidatorFactory().getValidator()`) and shared by every subsequent default-using request. The method is no longer an override point on the sealed interface; custom-validator-factory configuration ships under R192 as a Mojo-driven hook. + +== `NodeIdEncoder` utility + +Emitted by `NodeIdEncoderClassGenerator` into `<outputPackage>.schema` only when at least one type carries `@node`. Static, non-extendable encode/decode helpers for Relay global IDs: + +[source,java] +---- +public final class NodeIdEncoder { + + public static String encode(String typeId, Object... values); + + public static String peekTypeId(String base64Id); + + // Per-Node helpers, one pair per @node type: + public static String encode<TypeName>(T1 v1, ..., TN vN); + public static RecordN<T1, ..., TN> decode<TypeName>(String base64Id); +} +---- + +=== Wire format + +Every Graphitron-emitted nodeId is base64-url-encoded `"typeId:v1,v2,..."` (no padding, UTF-8). Commas inside values are escaped as `%2C`, so a key value containing a literal comma round-trips losslessly. The format matches the legacy `no.sikt.graphql.NodeIdStrategy` encoding, so IDs round-trip across a cut-over from the legacy generator. + +`encode(typeId, values...)` returns `null` when any value is `null`, so the GraphQL field resolves to `null` rather than emitting a malformed ID. + +=== Per-Node helpers + +For each `@node`-decorated type the generator emits two static helpers named after the GraphQL type: + +* `encode<TypeName>(T1 v1, ..., TN vN)` -- bakes the typeId into the helper name so call sites pass typed key values directly. Returns `null` if any value is `null`. +* `decode<TypeName>(String base64Id)` -- returns a jOOQ `RecordN<T1, ..., TN>` typed against the bound table's PK columns, or `null` uniformly on malformed input or a typeId mismatch. Carrier consumers wrap that null through the matching `CallSiteExtraction.NodeIdDecodeKeys.*` arm. + +`peekTypeId(base64Id)` reads the typeId off the wire string without decoding the rest. `Query.node(id:)` uses this to dispatch to the right `@node` type's table; a non-typed reader can call it the same way. + +=== Why a final class with private constructor + +A single canonical wire format across every generated dispatcher is what makes nodeIds durable across schema evolution. Subclassing the encoder to override the encoding would let one corner of an app speak a different dialect from another, and the result would not round-trip. xref:../how-to/global-id.adoc[How-to: Global object IDs] covers Relay Node end-to-end, including stable-ID strategies and `keyColumns` migrations. + +== See also + +* xref:directives/index.adoc[Directive reference] is the SDL-driven half of what generated code looks like; this page is the SDL-independent half. +* xref:../how-to/test-your-schema.adoc[How-to: Test your schema] covers wiring `Graphitron.buildSchema(...)` and a request-scoped `GraphitronContext` into an execution-tier test. +* xref:../how-to/custom-scalars.adoc[How-to: Custom scalars] covers declaring a `scalar` with `@scalarType(scalar:)` and authoring the `GraphQLScalarType` constant the directive points at. +* xref:../how-to/tenant-scoping.adoc[How-to: Tenant scoping] covers per-request `DSLContext` routing (recipe is being rewritten under R45; the link resolves but the body shows a deferral banner). +* xref:../how-to/global-id.adoc[How-to: Global object IDs] covers `NodeIdEncoder` end-to-end, including the per-Node helpers, `keyColumns` migrations, and `Query.node` / `Query.nodes` dispatch. + +xref:index.adoc[← Reference index] diff --git a/docs/manual/tutorial/01-prerequisites.adoc b/docs/manual/tutorial/01-prerequisites.adoc new file mode 100644 index 0000000000..fe1e806572 --- /dev/null +++ b/docs/manual/tutorial/01-prerequisites.adoc @@ -0,0 +1,120 @@ += Page 1: Prerequisites +:description: Tools, repository checkout, PostgreSQL with the example data, and the running Quarkus app. +:!toc: + +By the end of this page you have the rewrite checked out, a PostgreSQL database loaded with example data, and a Quarkus dev server serving GraphQL on `http://localhost:8080/graphql`. The next five pages send queries to that server. + +== Tools you need + +* *JDK 25.* The generator runs on Java 25 (`pom.xml` sets `<release>25</release>` and the parent's `requireJavaVersion` enforcer fails the build on anything older). Run `java -version` to confirm. +* *Maven 3.9 or later.* Run `mvn -version` to confirm. +* *Docker.* The simplest way to get a PostgreSQL with the example schema. If you already run PostgreSQL natively, see the alternative below. +* *git.* For checking out the repository. + +== Check out the repository + +[source,bash] +---- +git clone https://github.com/sikt-no/graphitron.git +cd graphitron +---- + +The example you build against lives at `graphitron-sakila-example/`. Everything in this tutorial happens from the repository root unless stated otherwise. + +== Start PostgreSQL with the example data + +The example reads from a database named `rewrite_test` on `localhost:5432` with `postgres` / `postgres` credentials. The DDL and seed data live in `graphitron-sakila-db/src/main/resources/init.sql`; load that file into a fresh database and you are done. + +With Docker: + +[source,bash] +---- +docker run -d --name graphitron-pg \ + -e POSTGRES_PASSWORD=postgres \ + -e POSTGRES_DB=rewrite_test \ + -p 5432:5432 \ + -v "$PWD/graphitron-sakila-db/src/main/resources/init.sql:/docker-entrypoint-initdb.d/init.sql:ro" \ + postgres:16 +---- + +The `init.sql` mount runs once on first start, so the database comes up with `customer`, `address`, `store`, `film`, and the rest of the Sakila schema already populated. + +If you already run PostgreSQL natively: create the database, then load `init.sql`. + +[source,bash] +---- +createdb rewrite_test +psql -d rewrite_test -f graphitron-sakila-db/src/main/resources/init.sql +---- + +== Build the rewrite + +[source,bash] +---- +mvn install -Plocal-db +---- + +The first build pulls jOOQ, graphql-java, Quarkus, and a few hundred other artifacts; expect a couple of minutes on a warm Maven repository, longer on a cold one. The `-Plocal-db` profile points the jOOQ code generator at the database you just started instead of spinning up a Testcontainer. + +You will see the rewrite's modules build in order: javapoet, the generator, the Sakila catalog and service modules, the Maven plugin, and finally the example. When it ends with `BUILD SUCCESS` the example's generated resolvers, runtime app, and test suite are all in place. + +== Start the app + +[source,bash] +---- +cd graphitron-sakila-example +mvn quarkus:dev +---- + +Quarkus boots in a few seconds and prints a banner ending with `Listening on: http://0.0.0.0:8080`. Leave this terminal running; every subsequent page sends queries to that endpoint from a second terminal. + +To verify the server is up, try a tiny query against the schema's introspection endpoint: + +[source,bash] +---- +curl -s -X POST http://localhost:8080/graphql \ + -H 'Content-Type: application/json' \ + -d '{"query":"{ __typename }"}' +---- + +A response of `{"data":{"__typename":"Query"}}` means the GraphQL engine is wired up and ready. + +== If something goes wrong + +Three failures account for most newcomer hiccups; if you hit one, the fix is short. + +*The build fails with `Detected JDK ... is version 21.x.x which is not in the allowed range [25,)`.* The Maven enforcer is reading `JAVA_HOME`, which inherited a JDK 21 from your shell or a prior session. Install JDK 25 and point `JAVA_HOME` at it: + +[source,bash] +---- +sudo apt-get install -y openjdk-25-jdk-headless +export JAVA_HOME=/usr/lib/jvm/java-25-openjdk-amd64 +mvn -version # should now report Java 25 +---- + +On macOS or Windows, install a JDK 25 distribution (Temurin, Liberica, etc.) and set `JAVA_HOME` accordingly. `mvn -version` is the verification step; it must report Java 25 before the build will pass. + +*Quarkus fails to start with "address already in use" or never reaches `Listening on: http://0.0.0.0:8080`.* Port 8080 is taken by another process (a previous run that didn't shut down, a system service, another local app). Either stop the offender (`lsof -i :8080` finds it) or run the example on a different port: `mvn quarkus:dev -Dquarkus.http.port=8081`. Adjust the `localhost:8080` URLs in the rest of this tutorial to match. + +*The example app starts but every query returns a connection error.* Postgres isn't reachable on `localhost:5432`. If you used the Docker command above, `docker ps` should show `graphitron-pg`; if it isn't there, the container exited (check `docker logs graphitron-pg`). If you're running Postgres natively, confirm `psql -U postgres -d rewrite_test -c "SELECT 1"` returns `1`. The default credentials the example expects are `postgres` / `postgres` against database `rewrite_test`. + +== Use GraphiQL instead of curl (optional) + +The example bundles the GraphiQL playground: an in-browser editor with auto-complete, query history, and a one-click run button against the same `/graphql` endpoint. Open `http://localhost:8080/graphiql/` directly, or visit `http://localhost:8080/graphql` in a browser and you are redirected there automatically. + +Every query and mutation in the rest of this tutorial works in GraphiQL too: paste the GraphQL string (the part inside `"query":"..."` in each curl body) into the editor's left pane and hit run. We show curl in the prose because it copies cleanly into a terminal, but if you prefer a GUI the playground is the ergonomic choice. + +== You have just learned + +How the rewrite organises itself into the generator, the Sakila catalog, the example module, and the Quarkus runtime; how to load the example data into PostgreSQL; how to build and run the example; and how to send queries with either curl or GraphiQL. + +== Next + +xref:02-first-schema.adoc[Page 2: The starter schema] introduces the directives that turn GraphQL types into PostgreSQL queries. + +[.pagenav,cols="<,^,>",frame=none,grid=none] +|=== +| +| xref:index.adoc[↑ Tutorial overview] +| xref:02-first-schema.adoc[Next: The starter schema →] +|=== diff --git a/docs/manual/tutorial/02-first-schema.adoc b/docs/manual/tutorial/02-first-schema.adoc new file mode 100644 index 0000000000..29f1d6cd70 --- /dev/null +++ b/docs/manual/tutorial/02-first-schema.adoc @@ -0,0 +1,75 @@ += Page 2: The starter schema +:description: How @table and @field map a GraphQL type to a PostgreSQL table and its columns. +:!toc: + +The example's GraphQL schema lives at `graphitron-sakila-example/src/main/resources/graphql/schema.graphqls`. Open that file in an editor; this page walks you through three types and the directives that wire them to PostgreSQL. + +The full schema covers most of Graphitron's directive surface, so it is large. For this tutorial, focus on the three types that back the queries on the next pages: `Query`, `Customer`, and `Address`. + +== Query + +[source,graphql] +---- +type Query { + customers(active: Boolean @field(name: "ACTIVEBOOL")): [Customer!]! + ... +} +---- + +`Query.customers` is the entry point for the first query. The `active` argument is optional; when present, Graphitron emits a `WHERE customer.activebool = ?` clause. The `@field(name: "ACTIVEBOOL")` directive tells the generator which column the argument maps to, since the GraphQL name (`active`) and the database column name (`activebool`) differ. + +== Customer + +The shape relevant to this page, with the scalar fields and the two directive families that map them: + +[source,graphql] +---- +type Customer @table(name: "customer") { + customerId: Int! @field(name: "CUSTOMER_ID") + firstName: String! @field(name: "FIRST_NAME") + lastName: String! @field(name: "LAST_NAME") + email: String @field(name: "EMAIL") + activebool: Boolean! @field(name: "ACTIVEBOOL") + ... +} +---- + +`@table(name: "customer")` binds the GraphQL `Customer` type to the `customer` table in jOOQ's catalog. The generator looks up the matching jOOQ `Table` class at code-generation time, fails the build if it cannot find one, and uses it everywhere `Customer` appears in a query. + +`@field(name: "FIRST_NAME")` on each scalar field tells the generator which column to project. When the GraphQL name and the column name match (case-insensitively), the directive is unnecessary; here every field carries it because the schema is explicit. A query selecting `firstName` produces `SELECT customer.first_name AS firstName`; a query selecting both `firstName` and `lastName` produces `SELECT customer.first_name AS firstName, customer.last_name AS lastName`. + +The full `Customer` type in the schema also carries `implements Node @node` and an `id: ID! @nodeId` field, plus a foreign-key-driven `address: Address @reference(...)`. xref:04-joining-tables.adoc[Page 4] introduces `@reference`; xref:../how-to/global-id.adoc[How-to: Global object IDs] covers `@node` and `@nodeId`. + +== Address + +[source,graphql] +---- +type Address implements Node @table(name: "address") @node { + id: ID! @nodeId + addressId: Int! @field(name: "ADDRESS_ID") + address: String! @field(name: "ADDRESS") + district: String! @field(name: "DISTRICT") + ... +} +---- + +Same pattern: `@table` binds the type to the `address` table, `@field` maps each scalar to its column. Note that the GraphQL field `address` and the column `ADDRESS` collide on name; the directive is still required here because the schema enables a strict mode where every column-backed field has to declare its column explicitly. + +== Reading the generator output + +If you are curious what Graphitron produced for these types, the generated sources live under `graphitron-sakila-example/target/generated-sources/graphitron/`. The interesting files for `Customer` are `CustomerType.java` (the GraphQL type wrapper) and `QueryCustomersFetcher.java` (the resolver for `Query.customers`). You do not need to read them to follow the rest of the tutorial; they are there when you want to see what the directives translated into. + +== You have just learned + +How `@table` binds a GraphQL type to a jOOQ-modelled PostgreSQL table, and how `@field` maps a scalar field to a specific column. + +== Next + +xref:03-first-query.adoc[Page 3: Running your first query] sends a real GraphQL query to the running server and gets `customer` rows back. + +[.pagenav,cols="<,^,>",frame=none,grid=none] +|=== +| xref:01-prerequisites.adoc[← Previous: Prerequisites] +| xref:index.adoc[↑ Tutorial overview] +| xref:03-first-query.adoc[Next: Running your first query →] +|=== diff --git a/docs/manual/tutorial/03-first-query.adoc b/docs/manual/tutorial/03-first-query.adoc new file mode 100644 index 0000000000..3bfa45ba0a --- /dev/null +++ b/docs/manual/tutorial/03-first-query.adoc @@ -0,0 +1,86 @@ += Page 3: Running your first query +:description: Send a GraphQL query to the running Quarkus app and see PostgreSQL rows in the response. +:!toc: + +With the server from xref:01-prerequisites.adoc[page 1] still running on `http://localhost:8080`, open a second terminal and send a query. (If you prefer the in-browser GraphiQL playground, open `http://localhost:8080/graphiql/` and paste the query body into the left pane instead of running curl.) + +== Send the query + +[source,bash] +---- +curl -s -X POST http://localhost:8080/graphql \ + -H 'Content-Type: application/json' \ + -d '{"query":"{ customers { firstName lastName email } }"}' +---- + +The response is JSON containing the five rows the example seed loaded into the `customer` table: + +[source,json] +---- +{ + "data": { + "customers": [ + {"firstName": "Mary", "lastName": "Smith", "email": "mary.smith@example.com"}, + {"firstName": "Patricia", "lastName": "Johnson", "email": "patricia.johnson@example.com"}, + {"firstName": "Linda", "lastName": "Williams", "email": "linda.williams@example.com"}, + {"firstName": "Barbara", "lastName": "Jones", "email": "barbara.jones@example.com"}, + {"firstName": "Elizabeth", "lastName": "Brown", "email": "elizabeth.brown@example.com"} + ] + } +} +---- + +== What just happened + +Graphitron's generated resolver for `Query.customers` produced a single SQL statement against PostgreSQL, projected only the columns your query asked for, and returned the rows as a GraphQL response. + +Roughly, it ran: + +[source,sql] +---- +SELECT customer.first_name AS "firstName", + customer.last_name AS "lastName", + customer.email AS "email" + FROM customer +---- + +If you are running with `quarkus.log.level=DEBUG` (or want to inspect the executed SQL), Quarkus's dev mode prints jOOQ's SQL log to the terminal where `mvn quarkus:dev` is running. The actual statement uses parameter placeholders and quoted identifiers, but the shape is the one above. + +The selection set drives the projection: a query that asks only for `firstName` produces a SELECT with only `customer.first_name`. Add `lastName` to the query and the SELECT grows to two columns. Graphitron does this projection-narrowing for every query, every time, because each generated resolver inspects the request's selection set and threads the chosen fields through to jOOQ. + +== Filter with the active argument + +The `active` argument from xref:02-first-schema.adoc[page 2] filters by the `activebool` column. The seed data has three active customers and two inactive: + +[source,bash] +---- +curl -s -X POST http://localhost:8080/graphql \ + -H 'Content-Type: application/json' \ + -d '{"query":"{ customers(active: true) { firstName } }"}' +---- + +[source,json] +---- +{"data":{"customers":[ + {"firstName":"Mary"}, + {"firstName":"Patricia"}, + {"firstName":"Linda"} +]}} +---- + +The `@field(name: "ACTIVEBOOL")` on the `active` argument is what wired this filter to the `activebool` column. Without it, the generator would have used the GraphQL name (`active`) to look up a column called `active`, found one (the `customer` table happens to have an unused integer column named `active` too), and wired the filter to the wrong place. Argument-level `@field` is how you steer the column choice when names collide. + +== You have just learned + +How a generated resolver translates a GraphQL selection set into a column-narrowed `SELECT`, and how an argument-level `@field` directive maps a query argument to a specific column. + +== Next + +xref:04-joining-tables.adoc[Page 4: Joining tables] adds the `address` field and shows how `@reference` produces a `JOIN`. + +[.pagenav,cols="<,^,>",frame=none,grid=none] +|=== +| xref:02-first-schema.adoc[← Previous: The starter schema] +| xref:index.adoc[↑ Tutorial overview] +| xref:04-joining-tables.adoc[Next: Joining tables →] +|=== diff --git a/docs/manual/tutorial/04-joining-tables.adoc b/docs/manual/tutorial/04-joining-tables.adoc new file mode 100644 index 0000000000..dc6820f13c --- /dev/null +++ b/docs/manual/tutorial/04-joining-tables.adoc @@ -0,0 +1,110 @@ += Page 4: Joining tables with @reference +:description: Add a related Address to each Customer with a foreign-key path. +:!toc: + +`Customer` and `Address` are joined in the database by `customer.address_id` referencing `address.address_id`. The schema declares that join as a `@reference` on the `address` field of `Customer`, which means a query that selects `customer { address { ... } }` produces a SQL JOIN automatically. + +== Send the joined query + +[source,bash] +---- +curl -s -X POST http://localhost:8080/graphql \ + -H 'Content-Type: application/json' \ + -d '{"query":"{ customers { firstName address { address district } } }"}' +---- + +[source,json] +---- +{ + "data": { + "customers": [ + {"firstName":"Mary","address":{"address":"47 MySakila Drive","district":"Alberta"}}, + {"firstName":"Patricia","address":{"address":"28 MySQL Boulevard","district":"Lazio"}}, + {"firstName":"Linda","address":{"address":"23 Workhaven Lane","district":"Alberta"}}, + {"firstName":"Barbara","address":{"address":"47 MySakila Drive","district":"Alberta"}}, + {"firstName":"Elizabeth","address":{"address":"28 MySQL Boulevard","district":"Lazio"}} + ] + } +} +---- + +One HTTP request, one SQL query, five customers each with their joined address row. + +== How @reference produced the JOIN + +The directive on `Customer.address`: + +[source,graphql] +---- +address: Address @reference(path: [{key: "customer_address_id_fkey"}]) +---- + +`customer_address_id_fkey` is the name of the foreign-key constraint on the `customer` table, the one declared as `address_id int NOT NULL REFERENCES address(address_id)` in `init.sql`. Graphitron looks the constraint up in jOOQ's catalog at code-generation time, reads off the source and target columns, and uses them to build a `JOIN` clause whenever your query selects through `Customer.address`. + +The shape of the SQL emitted for the joined query above is roughly: + +[source,sql] +---- +SELECT customer.first_name AS "firstName", + address.address AS "address", + address.district AS "district" + FROM customer + LEFT JOIN address ON customer.address_id = address.address_id +---- + +Two things to notice: + +. *The JOIN is not added unconditionally.* If your query selects only `firstName`, the generated resolver omits the `JOIN` entirely. Graphitron narrows both the column projection and the join graph based on the request's selection set, so unused tables are not touched. + +. *The path is declared by name, not by columns.* `customer_address_id_fkey` is the constraint name; the columns on either side come from the catalog. If a future migration changes which columns participate in the constraint, the GraphQL schema does not have to change. (Renaming the constraint, of course, would mean updating the directive.) + +== Multi-hop references + +`@reference` can chain. Look further down `Customer` in the schema: + +[source,graphql] +---- +storeAddress: Address @reference(path: [ + {key: "customer_store_id_fkey"}, + {key: "store_address_id_fkey"} +]) +---- + +`storeAddress` resolves through `customer.store_id → store.store_id → store.address_id → address.address_id`, two foreign-key hops. The same projection-narrowing applies: select `storeAddress` and you get a two-`JOIN` chain; omit it and the chain disappears. + +[source,bash] +---- +curl -s -X POST http://localhost:8080/graphql \ + -H 'Content-Type: application/json' \ + -d '{"query":"{ customers { firstName storeAddress { address district } } }"}' +---- + +The first three customers belong to store 1 (address `47 MySakila Drive`); the other two belong to store 2 (address `28 MySQL Boulevard`). + +== When references are inferred + +If exactly one foreign key exists between two tables, Graphitron can infer the path without an explicit `@reference`. The schema's `Store.customers` field uses that: + +[source,graphql] +---- +type Store @table(name: "store") { + customers: [Customer!]! @defaultOrder(primaryKey: true) +} +---- + +There is no `@reference` here, but the catalog has exactly one FK between `customer` and `store` (`customer.store_id`), so the generator picks it. Multiple-FK cases (like `customer` to `address` and `store` to `address`) require the explicit declaration, because the generator will not guess. + +== You have just learned + +How `@reference(path: ...)` declares a foreign-key join by constraint name; how single-hop and multi-hop references both produce projection-narrowed SQL; and how implicit references work when the FK relationship is unambiguous. + +== Next + +xref:05-mutations.adoc[Page 5: A first mutation] turns from reading data to writing it: a single directive flips a query into an `INSERT`. + +[.pagenav,cols="<,^,>",frame=none,grid=none] +|=== +| xref:03-first-query.adoc[← Previous: Running your first query] +| xref:index.adoc[↑ Tutorial overview] +| xref:05-mutations.adoc[Next: A first mutation →] +|=== diff --git a/docs/manual/tutorial/05-mutations.adoc b/docs/manual/tutorial/05-mutations.adoc new file mode 100644 index 0000000000..43a95effab --- /dev/null +++ b/docs/manual/tutorial/05-mutations.adoc @@ -0,0 +1,181 @@ += Page 5: A first mutation +:description: Insert a new row with @mutation, and read back the columns the GraphQL response asks for. +:!toc: + +The example schema declares one mutation field for inserting a new film. This page sends that mutation and walks through the directives that turn a GraphQL operation into a SQL `INSERT`. + +== The mutation in the schema + +From `schema.graphqls`: + +[source,graphql] +---- +input FilmCreateInput @table(name: "film") { + title: String! @field(name: "title") + languageId: Int! @field(name: "language_id") +} + +type Mutation { + createFilm(in: FilmCreateInput!): Film @mutation(typeName: INSERT) +} +---- + +Three pieces are doing the work: + +* `@table(name: "film")` on the input type. This binds `FilmCreateInput`'s fields to columns on the `film` table; without it, the generator would not know which table to insert into. +* `@field(name: "...")` on each input field. Same role as on a query type: map the GraphQL field name to a database column. +* `@mutation(typeName: INSERT)` on the mutation field. This is the directive that flips the resolver from "build a SELECT" to "build an INSERT", and tells it to use `RETURNING` to populate the response. + +== Send the mutation + +[source,bash] +---- +curl -s -X POST http://localhost:8080/graphql \ + -H 'Content-Type: application/json' \ + -d '{"query":"mutation { createFilm(in: { title: \"MY FIRST FILM\", languageId: 1 }) { filmId title } }"}' +---- + +[source,json] +---- +{ + "data": { + "createFilm": { + "filmId": 6, + "title": "MY FIRST FILM" + } + } +} +---- + +Run it again and you get `filmId: 7`, then `8`, and so on; the `film_id` column is a `serial`, so PostgreSQL hands out the next id on each insert. + +== What just happened + +The generated resolver for `Mutation.createFilm` produced this shape of SQL: + +[source,sql] +---- +INSERT INTO film (title, language_id) + VALUES (?, ?) + RETURNING film.film_id AS "filmId", + film.title AS "title" +---- + +The `RETURNING` clause is what makes mutations cheap in Graphitron: PostgreSQL hands the inserted row back in the same statement, with the columns the GraphQL selection set asked for. There is no follow-up `SELECT` to fetch what was just written. + +If your mutation selects more fields, the `RETURNING` projection grows. If your mutation also selects through a `@reference`, the resolver wraps the `INSERT` in a `WITH` clause and joins from the inserted row outwards, keeping the round trip count to one. + +== Other mutation shapes + +The example schema also has `updateFilm` and `upsertFilm`: + +[source,graphql] +---- +type Mutation { + createFilm(in: FilmCreateInput!): Film @mutation(typeName: INSERT) + updateFilm(in: FilmUpdateInput!): Film @mutation(typeName: UPDATE) + upsertFilm(in: FilmUpsertInput!): Film @mutation(typeName: UPSERT) +} +---- + +`UPDATE` requires an input field marked with `@lookupKey` to identify the row to update; `UPSERT` adds an `ON CONFLICT` clause. Both follow the same pattern as `INSERT`: the directive picks the SQL shape, the input's `@table` binds the target, and the `RETURNING` projection narrows to the response selection set. Sample `FilmUpdateInput`: + +[source,graphql] +---- +input FilmUpdateInput @table(name: "film") { + filmId: Int! @field(name: "film_id") @lookupKey + title: String! @field(name: "title") +} +---- + +The `@lookupKey` on `filmId` tells the generator "this field identifies the row, not a value to set". Try the update against the film you just inserted: + +[source,bash] +---- +curl -s -X POST http://localhost:8080/graphql \ + -H 'Content-Type: application/json' \ + -d '{"query":"mutation { updateFilm(in: { filmId: 6, title: \"RENAMED FILM\" }) { filmId title } }"}' +---- + +== Grouping fields with nested input types + +A `@mutation` input field can itself be an input object with no `@table` directive: a plain grouping type whose own fields map onto columns of the *same* table as the surrounding `@table` input. This tidies a large input into named clusters on the client side without introducing a second table. Suppose a schema like: + +[source,graphql] +---- +input EndreOrganisasjonInput @table(name: "ORGANISASJON") { + id: ID! @nodeId(typeName: "URegOrganisasjon") + originalnavn: String! @field(name: "NAVN_ORIGINAL") + lokalisering: LokaliseringInput! +} + +input LokaliseringInput { + landkode: String! + bynavn: String + regionnavn: String +} + +type Mutation { + endreOrganisasjon(input: [EndreOrganisasjonInput!]!): EndreOrganisasjonPayload + @mutation(typeName: UPDATE) +} +---- + +`LokaliseringInput` has no `@table`, so its fields are not a separate row: `landkode`, `bynavn`, and `regionnavn` are columns of `ORGANISASJON`, reached on the wire as `input.lokalisering.landkode`. The mutation call nests the same way: + +[source,graphql] +---- +mutation { + endreOrganisasjon(input: [{ id: "...", originalnavn: "Sikt", lokalisering: { landkode: "NO", bynavn: "Oslo" } }]) { + # ... + } +} +---- + +Three things to keep in mind: + +* *The grouping has no DML semantics.* It is purely a wire-format ergonomics shape. The generated `UPDATE` writes flat columns on `ORGANISASJON` exactly as if the nested leaves had been declared at the top level of `EndreOrganisasjonInput`. +* *`@field(name:)` on a nested leaf targets the outer table.* The resolution context is the surrounding `@table`, so a nested leaf names a column of that table (here, of `ORGANISASJON`); the SDL-name-defaults-to-column-name fallback resolves against the outer table too. +* *Absent-vs-null is honored at every nesting layer*, matching the way top-level mutation inputs already behave: ++ +[cols="1,3"] +|=== +| Wire shape | Effect + +| outer key absent (`lokalisering` not sent) +| no claim about the group; every leaf under it is skipped + +| outer key present with `null` (`lokalisering: null`) +| no claim about the group; every leaf under it is skipped + +| outer key present with a Map +| descend; each leaf is decided independently by the rows below + +| leaf key absent +| the column is left untouched (PATCH semantics) + +| leaf key present with `null` +| the column is written `NULL` + +| leaf key present with a value +| the column is written to that value +|=== + +So sending `lokalisering: { landkode: "NO", bynavn: null }` writes `landkode = 'NO'`, `bynavn = NULL`, and leaves `regionnavn` untouched. + +This works for every DML verb (`INSERT`, `UPDATE`, `DELETE`). A nested grouping that introduces a *second* table (a nested input that is itself `@table`-backed) is a different, compound-mutation shape and is not covered here. + +== You have just learned + +How `@mutation(typeName: ...)` flips a resolver into an `INSERT`, `UPDATE`, or `UPSERT`; how `@table` and `@field` on an input type wire the operation to a target table and its columns; and how `RETURNING` keeps the round-trip count to one, even when the response asks for more than the inserted row provides. + +== Next + +xref:06-going-further.adoc[Page 6: Going further] points at the four how-to recipes most worth reading after this tutorial. + +[.pagenav,cols="<,^,>",frame=none,grid=none] +|=== +| xref:04-joining-tables.adoc[← Previous: Joining tables] +| xref:index.adoc[↑ Tutorial overview] +| xref:06-going-further.adoc[Next: Going further →] +|=== diff --git a/docs/manual/tutorial/06-going-further.adoc b/docs/manual/tutorial/06-going-further.adoc new file mode 100644 index 0000000000..0edf176705 --- /dev/null +++ b/docs/manual/tutorial/06-going-further.adoc @@ -0,0 +1,45 @@ += Page 6: Going further +:description: Four how-to recipes most relevant after the tutorial, plus the reference and explanation chapters. +:!toc: + +You started with a fresh checkout, set up PostgreSQL with example data, ran the example app under `mvn quarkus:dev`, queried `customers` directly, traversed a `@reference` to `Address`, and ran `INSERT` and `UPDATE` mutations against `film`. The directives you used (`@table`, `@field`, `@reference`, `@lookupKey`, `@mutation`) cover the common case; everything else builds on the same idea: GraphQL types map to PostgreSQL tables, and directives pick the SQL shape. + +This page lists the four how-to recipes most worth reading next, then points at the rest of the manual. + +== Recipes most relevant after this tutorial + +The four topics below are the ones to read next. The xref:../how-to/index.adoc[how-to landing] lists every available recipe. + +Add custom conditions:: +The `active` filter you used on page 3 is the simplest case of an argument-driven `WHERE`. The `@condition` directive lets you wire arbitrary jOOQ predicates onto fields and arguments: `WHERE rental_rate < ?`, `WHERE title ILIKE ?`, conjunctive filters across multiple input fields, anything jOOQ can express. xref:../how-to/add-custom-conditions.adoc[How-to: Add custom conditions] walks through the Java method shape and the three placement axes; xref:../how-to/condition-cascade.adoc[How-to: Stacking and overriding conditions] covers the override flag and the divergence from legacy semantics. + +Pagination and sorting:: +The `customers` query you ran returns all five rows. Real schemas paginate: Graphitron supports both Relay-style cursor pagination (`@asConnection`, `first`/`after`) and dynamic ordering (`@orderBy`, `@order`). xref:../how-to/connections.adoc[How-to: Cursor-paginated connections] walks through turning a list field into a connection; xref:../how-to/sort-results.adoc[How-to: Sort results] covers tie-breakers, `@defaultOrder`, and keyset semantics. + +Error handling:: +The mutations on page 5 happily commit anything that PostgreSQL accepts. Real mutations need to surface validation errors (constraint violations, business-rule failures) as typed GraphQL errors, not opaque exceptions. xref:../how-to/error-channel.adoc[How-to: The errors channel] covers union vs single-type carriers, the cause-chain dispatch loop, and the redact-with-correlation-id fallback. + +Test your schema:: +The example module's own tests under `src/test/java/.../querydb/` are the recommended pattern for pinning your schema's behaviour against a real PostgreSQL. xref:../how-to/test-your-schema.adoc[How-to: Test your schema] walks through copying that pattern into your own project: how to wire `Graphitron.newExecutionInput(dsl, ...)` against Testcontainers, how to assert on response shapes, and how to use the `QUERY_COUNT`/`SQL_LOG` listeners to ratchet round-trip counts. + +== Where the rest of the manual sits + +xref:../how-to/index.adoc[How-to guides]:: +The full task-indexed list. Beyond the four recipes above, the chapter covers `@service` for hand-written fetchers, `@lookupKey` for batched key lookups, `@splitQuery` for opt-in DataLoader batching, polymorphic types via `@discriminate` and unions, Apollo Federation, custom scalars, tenant scoping, and global node identification. + +xref:../reference/index.adoc[Reference]:: +Authoritative descriptions of every directive, every Maven plugin parameter, and every diagnostic the validator emits. Use this when you know the directive name and want the parameter list and constraints; use the how-to chapter when you know the task and want a recipe. + +xref:../explanation/index.adoc[Explanation]:: +The design decisions behind Graphitron: why the database catalog is the source of truth, why `@condition` methods take a table parameter, why authorization stays in PostgreSQL row-level security, how the batching model works. Read this chapter when "why does it work this way" matters more than "how do I use it". + +== You have finished + +The tutorial is over. The example you built against is the same one the rest of the manual references in its `verified by` pointers; if a how-to or reference page mentions a query, you can paste it into the same `curl` shape from xref:03-first-query.adoc[page 3] and run it against your local server. + +[.pagenav,cols="<,^,>",frame=none,grid=none] +|=== +| xref:05-mutations.adoc[← Previous: A first mutation] +| xref:index.adoc[↑ Tutorial overview] +| +|=== diff --git a/docs/manual/tutorial/index.adoc b/docs/manual/tutorial/index.adoc new file mode 100644 index 0000000000..1fcdd9973d --- /dev/null +++ b/docs/manual/tutorial/index.adoc @@ -0,0 +1,29 @@ += Tutorial +:description: A page-by-page walk-through from a fresh checkout to a working GraphQL query. +:!toc: + +A step-by-step path from a fresh checkout to a working GraphQL query against the example schema. Each page builds on the last; reach the end with a query like `customers { firstName address { address district } }` returning real Sakila rows over HTTP. + +The tutorial anchors on https://github.com/sikt-no/graphitron/tree/claude/graphitron-rewrite/graphitron-rewrite/graphitron-sakila-example[`graphitron-sakila-example`], the rewrite's runnable reference application. You do not write a new project from scratch; you build, run, and query the example, then read the schema to see how each query was made possible by a directive. + +== Pages + +. xref:01-prerequisites.adoc[Prerequisites]: tools, repository checkout, PostgreSQL with the example data, and starting the Quarkus dev server. +. xref:02-first-schema.adoc[The starter schema]: how `@table` and `@field` map a GraphQL type to a PostgreSQL table. +. xref:03-first-query.adoc[Running your first query]: send a GraphQL query and see PostgreSQL rows in the response. +. xref:04-joining-tables.adoc[Joining tables with `@reference`]: add a related `Address` to each `Customer` with a foreign-key path. +. xref:05-mutations.adoc[A first mutation]: insert a new row with `@mutation`, and read back the columns the GraphQL response asks for. +. xref:06-going-further.adoc[Going further]: four how-to recipes most relevant after this tutorial, plus the reference and explanation chapters. + +Time budget: about an hour, mostly waiting for the first Maven build to finish. + +== Before you start + +If you are evaluating Graphitron rather than learning it, the xref:../../quick-start.adoc[Quick start] page covers the same ground in one screen. The tutorial is for the case where you want to type the commands yourself, see real responses, and build up the directive vocabulary one page at a time. + +[.pagenav,cols="<,^,>",frame=none,grid=none] +|=== +| +| xref:../index.adoc[↑ Manual landing] +| xref:01-prerequisites.adoc[Start: Prerequisites →] +|=== diff --git a/docs/pom.xml b/docs/pom.xml new file mode 100644 index 0000000000..6a77eb4c9e --- /dev/null +++ b/docs/pom.xml @@ -0,0 +1,366 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>no.sikt</groupId> + <artifactId>graphitron-rewrite-parent</artifactId> + <version>10-SNAPSHOT</version> + <relativePath>../pom.xml</relativePath> + </parent> + + <artifactId>graphitron-docs</artifactId> + <packaging>pom</packaging> + <name>${project.groupId}:${project.artifactId}</name> + <description>AsciiDoc documentation site for Graphitron, built by Maven and published to GitHub Pages.</description> + + <properties> + <maven.deploy.skip>true</maven.deploy.skip> + <sds.core.version>5.3.0</sds.core.version> + <sds.button.version>4.6.1</sds.button.version> + <asciidoctor.maven.version>3.2.0</asciidoctor.maven.version> + <asciidoctorj.version>3.0.1</asciidoctorj.version> + <download.maven.version>1.13.0</download.maven.version> + </properties> + + <dependencies> + <!-- Reactor-only dependency: ensures roadmap-tool builds before docs and + puts its classes on the exec-maven-plugin classpath for render-adoc. --> + <dependency> + <groupId>no.sikt</groupId> + <artifactId>graphitron-roadmap-tool</artifactId> + <version>${project.version}</version> + <scope>provided</scope> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>com.googlecode.maven-download-plugin</groupId> + <artifactId>download-maven-plugin</artifactId> + <version>${download.maven.version}</version> + <executions> + <execution> + <id>fetch-sds-core</id> + <phase>generate-resources</phase> + <goals><goal>wget</goal></goals> + <configuration> + <url>https://registry.npmjs.org/@sikt/sds-core/-/sds-core-${sds.core.version}.tgz</url> + <outputDirectory>${project.build.directory}/sds-core</outputDirectory> + <unpack>true</unpack> + <skipCache>false</skipCache> + </configuration> + </execution> + <execution> + <id>fetch-sds-button</id> + <phase>generate-resources</phase> + <goals><goal>wget</goal></goals> + <configuration> + <url>https://registry.npmjs.org/@sikt/sds-button/-/sds-button-${sds.button.version}.tgz</url> + <outputDirectory>${project.build.directory}/sds-button</outputDirectory> + <unpack>true</unpack> + <skipCache>false</skipCache> + </configuration> + </execution> + </executions> + </plugin> + + <plugin> + <artifactId>maven-resources-plugin</artifactId> + <executions> + <execution> + <id>stage-adoc</id> + <phase>process-resources</phase> + <goals><goal>copy-resources</goal></goals> + <configuration> + <outputDirectory>${project.build.directory}/staging</outputDirectory> + <resources> + <resource> + <directory>${project.basedir}</directory> + <includes> + <include>*.adoc</include> + <include>images/**</include> + <include>_includes/**</include> + <include>manual/**/*.adoc</include> + <include>architecture/**/*.adoc</include> + <include>architecture/**/images/**</include> + </includes> + </resource> + </resources> + </configuration> + </execution> + <execution> + <id>stage-theme-css</id> + <phase>process-resources</phase> + <goals><goal>copy-resources</goal></goals> + <configuration> + <outputDirectory>${project.build.directory}/staging/css</outputDirectory> + <resources> + <resource> + <directory>${project.basedir}/_theme</directory> + <includes> + <include>*.css</include> + </includes> + </resource> + </resources> + </configuration> + </execution> + </executions> + </plugin> + + <plugin> + <artifactId>maven-antrun-plugin</artifactId> + <executions> + <execution> + <id>stage-sds-css</id> + <phase>process-resources</phase> + <goals><goal>run</goal></goals> + <configuration> + <target> + <copy file="${project.build.directory}/sds-core/package/dist/index.css" + tofile="${project.build.directory}/staging/css/sds-core.css" + overwrite="true"/> + <copy file="${project.build.directory}/sds-core/package/LICENSE.md" + tofile="${project.build.directory}/staging/css/LICENSE-sds-core.md" + overwrite="true"/> + <copy file="${project.build.directory}/sds-button/package/dist/index.css" + tofile="${project.build.directory}/staging/css/sds-button.css" + overwrite="true"/> + <copy todir="${project.build.directory}/staging/architecture/css" overwrite="true"> + <fileset dir="${project.build.directory}/staging/css"/> + </copy> + <copy todir="${project.build.directory}/staging/architecture/explanation/css" overwrite="true" failonerror="false"> + <fileset dir="${project.build.directory}/staging/css"/> + </copy> + <copy todir="${project.build.directory}/staging/architecture/reference/css" overwrite="true" failonerror="false"> + <fileset dir="${project.build.directory}/staging/css"/> + </copy> + <copy todir="${project.build.directory}/staging/architecture/how-to/css" overwrite="true" failonerror="false"> + <fileset dir="${project.build.directory}/staging/css"/> + </copy> + <copy todir="${project.build.directory}/staging/roadmap/css" overwrite="true" failonerror="false"> + <fileset dir="${project.build.directory}/staging/css"/> + </copy> + <copy todir="${project.build.directory}/staging/roadmap/plans/css" overwrite="true" failonerror="false"> + <fileset dir="${project.build.directory}/staging/css"/> + </copy> + <copy todir="${project.build.directory}/staging/manual/css" overwrite="true" failonerror="false"> + <fileset dir="${project.build.directory}/staging/css"/> + </copy> + <copy todir="${project.build.directory}/staging/manual/tutorial/css" overwrite="true" failonerror="false"> + <fileset dir="${project.build.directory}/staging/css"/> + </copy> + <copy todir="${project.build.directory}/staging/manual/how-to/css" overwrite="true" failonerror="false"> + <fileset dir="${project.build.directory}/staging/css"/> + </copy> + <copy todir="${project.build.directory}/staging/manual/reference/css" overwrite="true" failonerror="false"> + <fileset dir="${project.build.directory}/staging/css"/> + </copy> + <copy todir="${project.build.directory}/staging/manual/reference/directives/css" overwrite="true" failonerror="false"> + <fileset dir="${project.build.directory}/staging/css"/> + </copy> + <copy todir="${project.build.directory}/staging/manual/explanation/css" overwrite="true" failonerror="false"> + <fileset dir="${project.build.directory}/staging/css"/> + </copy> + <!-- Docinfo files (top nav header + dark footer) staged into every + source directory so :docinfo: shared picks them up regardless + of which page asciidoctor is rendering. --> + <copy todir="${project.build.directory}/staging" overwrite="true"> + <fileset dir="${project.basedir}/_theme"> + <include name="docinfo-header.html"/> + <include name="docinfo-footer.html"/> + </fileset> + </copy> + <copy todir="${project.build.directory}/staging/architecture" overwrite="true"> + <fileset dir="${project.basedir}/_theme"> + <include name="docinfo-header.html"/> + <include name="docinfo-footer.html"/> + </fileset> + </copy> + <copy todir="${project.build.directory}/staging/architecture/explanation" overwrite="true" failonerror="false"> + <fileset dir="${project.basedir}/_theme"> + <include name="docinfo-header.html"/> + <include name="docinfo-footer.html"/> + </fileset> + </copy> + <copy todir="${project.build.directory}/staging/architecture/reference" overwrite="true" failonerror="false"> + <fileset dir="${project.basedir}/_theme"> + <include name="docinfo-header.html"/> + <include name="docinfo-footer.html"/> + </fileset> + </copy> + <copy todir="${project.build.directory}/staging/architecture/how-to" overwrite="true" failonerror="false"> + <fileset dir="${project.basedir}/_theme"> + <include name="docinfo-header.html"/> + <include name="docinfo-footer.html"/> + </fileset> + </copy> + <copy todir="${project.build.directory}/staging/roadmap" overwrite="true" failonerror="false"> + <fileset dir="${project.basedir}/_theme"> + <include name="docinfo-header.html"/> + <include name="docinfo-footer.html"/> + </fileset> + </copy> + <copy todir="${project.build.directory}/staging/roadmap/plans" overwrite="true" failonerror="false"> + <fileset dir="${project.basedir}/_theme"> + <include name="docinfo-header.html"/> + <include name="docinfo-footer.html"/> + </fileset> + </copy> + <copy todir="${project.build.directory}/staging/manual" overwrite="true" failonerror="false"> + <fileset dir="${project.basedir}/_theme"> + <include name="docinfo-header.html"/> + <include name="docinfo-footer.html"/> + </fileset> + </copy> + <copy todir="${project.build.directory}/staging/manual/tutorial" overwrite="true" failonerror="false"> + <fileset dir="${project.basedir}/_theme"> + <include name="docinfo-header.html"/> + <include name="docinfo-footer.html"/> + </fileset> + </copy> + <copy todir="${project.build.directory}/staging/manual/how-to" overwrite="true" failonerror="false"> + <fileset dir="${project.basedir}/_theme"> + <include name="docinfo-header.html"/> + <include name="docinfo-footer.html"/> + </fileset> + </copy> + <copy todir="${project.build.directory}/staging/manual/reference" overwrite="true" failonerror="false"> + <fileset dir="${project.basedir}/_theme"> + <include name="docinfo-header.html"/> + <include name="docinfo-footer.html"/> + </fileset> + </copy> + <copy todir="${project.build.directory}/staging/manual/reference/directives" overwrite="true" failonerror="false"> + <fileset dir="${project.basedir}/_theme"> + <include name="docinfo-header.html"/> + <include name="docinfo-footer.html"/> + </fileset> + </copy> + <copy todir="${project.build.directory}/staging/manual/explanation" overwrite="true" failonerror="false"> + <fileset dir="${project.basedir}/_theme"> + <include name="docinfo-header.html"/> + <include name="docinfo-footer.html"/> + </fileset> + </copy> + </target> + </configuration> + </execution> + </executions> + </plugin> + + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>exec-maven-plugin</artifactId> + <version>3.5.0</version> + <executions> + <execution> + <id>render-roadmap-adoc</id> + <phase>process-resources</phase> + <goals><goal>java</goal></goals> + <configuration> + <mainClass>no.sikt.graphitron.roadmap.Main</mainClass> + <arguments> + <argument>render-adoc</argument> + <argument>${project.basedir}/../roadmap</argument> + <argument>${project.build.directory}/staging/roadmap</argument> + </arguments> + <classpathScope>compile</classpathScope> + <includePluginDependencies>true</includePluginDependencies> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> + + <profiles> + <profile> + <id>docs</id> + <activation> + <activeByDefault>true</activeByDefault> + </activation> + <build> + <plugins> + <plugin> + <groupId>org.asciidoctor</groupId> + <artifactId>asciidoctor-maven-plugin</artifactId> + <version>${asciidoctor.maven.version}</version> + <dependencies> + <dependency> + <groupId>org.asciidoctor</groupId> + <artifactId>asciidoctorj</artifactId> + <version>${asciidoctorj.version}</version> + </dependency> + </dependencies> + <executions> + <execution> + <id>render-site</id> + <phase>compile</phase> + <goals><goal>process-asciidoc</goal></goals> + <configuration> + <sourceDirectory>${project.build.directory}/staging</sourceDirectory> + <outputDirectory>${project.build.directory}/generated-docs</outputDirectory> + <preserveDirectories>true</preserveDirectories> + <relativeBaseDir>true</relativeBaseDir> + <backend>html5</backend> + <attributes> + <source-highlighter>rouge</source-highlighter> + <icons>font</icons> + <toc>left@</toc> + <sectanchors>true</sectanchors> + <sectlinks>true</sectlinks> + <experimental>true</experimental> + <linkcss>true</linkcss> + <stylesheet>css/site.css</stylesheet> + <docinfo>shared</docinfo> + <imagesdir>images</imagesdir> + <idprefix/> + <idseparator>-</idseparator> + <graphitron-version>${project.version}</graphitron-version> + </attributes> + <resources> + <resource> + <directory>${project.build.directory}/staging/images</directory> + <targetPath>images</targetPath> + </resource> + <resource> + <directory>${project.build.directory}/staging/css</directory> + <targetPath>css</targetPath> + </resource> + <resource> + <directory>${project.build.directory}/staging/_includes</directory> + <targetPath>_includes</targetPath> + </resource> + <!-- Asciidoctor copies the configured stylesheet (css/site.css) + alongside each rendered page, but not the SDS CSS files + that site.css @imports. Carry those into every subdir's + css/ folder explicitly so the design tokens resolve. --> + <resource> + <directory>${project.build.directory}/staging</directory> + <includes> + <include>**/css/sds-*.css</include> + <include>**/css/LICENSE-*.md</include> + </includes> + <excludes> + <exclude>css/**</exclude> + </excludes> + </resource> + </resources> + <logHandler> + <failIf> + <severity>WARN</severity> + </failIf> + </logHandler> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> + </profile> + </profiles> +</project> diff --git a/docs/quick-start.adoc b/docs/quick-start.adoc new file mode 100644 index 0000000000..1da6d2f64e --- /dev/null +++ b/docs/quick-start.adoc @@ -0,0 +1,75 @@ += Quick Start +:description: Set up Graphitron in your project: prerequisites, jOOQ generation, GraphQL schema with directives, build wiring. + +This page is a high-level orientation. If you want to type commands yourself and see real responses, the xref:manual/tutorial/index.adoc[Tutorial] takes a fresh checkout to a working query against the Sakila example. For worked runtime-integration recipes (custom scalars, Apollo Federation, the dev loop), see xref:manual/how-to/index.adoc[the How-to guides]. + +== Requirements + +* *Java 17* or higher (consumers of Graphitron's generated output run on Java 17; the generator itself runs on Java 25). +* *jOOQ*. The open-source edition covers PostgreSQL, MySQL, MariaDB, SQLite, and others. Commercial databases require a commercial jOOQ licence. See https://www.jooq.org/download/#databases[the jOOQ database matrix]. +* *Maven*. Graphitron runs as a Maven plugin. + +== Outline + +. *Generate jOOQ classes from your database schema.* Use the https://www.jooq.org/doc/latest/manual/code-generation/codegen-configuration/[jOOQ code generator] to produce typed table/record classes. Graphitron consumes them. +. *Write your GraphQL schema with Graphitron directives.* Annotate types and fields to declare how they map to tables and columns. The directive reference lives at xref:manual/reference/directives/index.adoc[Reference: directives]. +. *Configure the Graphitron Maven plugin.* Wire it into your `pom.xml` so it runs after jOOQ codegen and before your application code compiles. +. *Build.* The generated resolvers land alongside your code, ready to be wired into your GraphQL server. + +== Sample directive-annotated schema + +The https://github.com/sikt-no/graphitron/tree/claude/graphitron-rewrite/graphitron-rewrite/graphitron-sakila-example[example project] uses the https://www.jooq.org/sakila[Sakila] database. A trimmed view: + +[source,graphql] +---- +type Query { + customers: [Customer] +} + +type Customer @table { + id: ID + firstName: String! @field(name: "FIRST_NAME") + lastName: String! @field(name: "LAST_NAME") + email: String + address: Address! +} + +type Address @table { + id: ID + addressLine1: String! @field(name: "ADDRESS_") + addressLine2: String @field(name: "ADDRESS2") + zip: String @field(name: "POSTAL_CODE") + phone: String! +} +---- + +== Maven build shape + +Graphitron requires jOOQ classes to exist before it runs, so the generator and its consumers split cleanly into separate Maven modules: + +* One module runs the jOOQ code generator. +* A dependent module runs Graphitron, with the jOOQ module as a `<dependency>`. + +A single-module setup is possible with multi-phase configuration but ends up fiddlier. Multi-module is the recommended path. + +== Running the generated code + +After the build, you have generated DataFetchers, TypeResolvers, and supporting classes ready to plug into a GraphQL server. Two options: + +* Use the Quarkus integration shipped with Graphitron (see the example project). +* Wire the generated resolvers into an existing https://www.graphql-java.com/[graphql-java] application. + +== Working example + +https://github.com/sikt-no/graphitron/tree/claude/graphitron-rewrite/graphitron-rewrite/graphitron-sakila-example[graphitron-sakila-example] is a complete working project: Sakila schema, GraphQL schema with directives, generated resolvers, and a Quarkus + JAX-RS server that runs them. + +The same module also doubles as the recommended **consumer test pattern**: the in-process query-to-database tests under `src/test/java/.../querydb/` build the schema via `Graphitron.buildSchema(...)`, instantiate a `GraphQL` engine, execute via graphql-java, and assert against a live PostgreSQL `DSLContext`. Two worked examples (one match-style, one approval-style) are templates you can copy. See the module's https://github.com/sikt-no/graphitron/tree/claude/graphitron-rewrite/graphitron-rewrite/graphitron-sakila-example/README.md[README] for which directories to copy and what each role looks like. + +== Where to next + +* xref:manual/tutorial/index.adoc[Tutorial]: a six-page walk-through from a fresh checkout to a working GraphQL query. +* xref:manual/reference/runtime-api.adoc[Runtime API reference]: the emitted `buildSchema` / `newExecutionInput` surface, plus the xref:manual/how-to/index.adoc[How-to guides] for custom scalars, federation, and the dev loop. +* xref:vision-and-goal.adoc[Vision and Goal]: what problem Graphitron solves. +* xref:graphitron-principles.adoc[Graphitron Principles]: design philosophy. +* xref:dependencies.adoc[Dependencies]: why jOOQ and graphql-java. +* xref:security.adoc[Security]: database-level security model. diff --git a/docs/security.adoc b/docs/security.adoc new file mode 100644 index 0000000000..6f77519666 --- /dev/null +++ b/docs/security.adoc @@ -0,0 +1,21 @@ += Security + +== Why database-level security + +Security logic can live in many places: the database, a service layer, API middleware, the UI. For our context, the database makes sense: + +The system spans decades. The database outlasts any individual application; rules in the database persist, rules in applications must be intentionally carried forward. Multiple applications access the same data, so database-level rules apply uniformly without coordination. And rules expressed as data predicates are discussable with the people who understand the business. Ask a registrar who should see student grades and they can tell you. A database has a finite number of tables and columns; you can point at one and have a concrete conversation. + +Other systems (shorter-lived, single-application, or with authorization logic that doesn't map to data predicates) might reasonably choose differently. This isn't a universal prescription. + +== What this means for Graphitron + +Graphitron's generated code is intentionally naive about security. It doesn't include authorization checks. The database handles enforcement; the generated code stays simple. If Graphitron tried to generate authorization logic, it would be reimplementing what the database already does, and adding something that could drift out of sync. + +== The UI still matters + +Database enforcement doesn't mean the UI can ignore security. Good usability requires that users don't see buttons they can't click or forms they can't submit. The rules should be the same in both places; the implementations differ. + +What we insist on: *the database is the enforcement point.* If the UI gets it wrong, the result is a confusing experience. If the database gets it wrong, data is exposed. These are not equivalent failures. + +The practical approach is PostgreSQL Row-Level Security with session variables set per request. See xref:architecture/reference/runtime-extension-points.adoc[Runtime Extension Points] for how that wires through the per-request `DSLContext` you pass to `Graphitron.newExecutionInput(dsl, ...)`. diff --git a/docs/vision-and-goal.adoc b/docs/vision-and-goal.adoc new file mode 100644 index 0000000000..29faabf93d --- /dev/null +++ b/docs/vision-and-goal.adoc @@ -0,0 +1,17 @@ += Vision and Goal + +Your database schema and your GraphQL schema describe the same thing from different angles. The database says "there's a FILM table with a TITLE column". The API says "there's a Film type with a title field". Wiring those together, writing the DataFetcher that selects FILM.TITLE when `film { title }` is queried, is mechanical work that doesn't require human judgment. + +Graphitron generates that wiring from a declarative mapping between the two schemas. You annotate your GraphQL schema to say which type maps to which table, which field maps to which column, and how relationships map to foreign keys. Graphitron handles the rest. + +== What this means in practice + +You write a GraphQL schema with annotations. Graphitron generates the Java code that fetches data from the database when queries arrive. The generated code is type-safe, handles pagination and batching, and is as efficient as what you'd write by hand. When the database schema changes, you update the mapping and regenerate. + +The generated code has no runtime dependency on Graphitron. It's just code: readable, debuggable, and not tied to any framework. + +== What Graphitron doesn't do + +It doesn't generate your API schema from your database schema (or vice versa). You design both; Graphitron implements the bridge between them. It doesn't hide your database behind an abstraction; the generated code works directly with jOOQ and your specific schema. It doesn't handle business logic; when you need custom rules, you drop into hand-written code through explicit extension points. + +The mechanical translation is Graphitron's job. Schema design and business logic are yours. diff --git a/graphitron-codegen-parent/graphitron-java-codegen/README.md b/graphitron-codegen-parent/graphitron-java-codegen/README.md deleted file mode 100644 index d330546101..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/README.md +++ /dev/null @@ -1,2004 +0,0 @@ -# Graphitron -This is a code generation tool that implements GraphQL schemas by tying -schemas to underlying database models. Graphitron creates complete or partial data fetcher implementations from GraphQL schemas -using Java and [jOOQ](https://www.jooq.org/). - -<!-- Update README table of contents using doctoc (https://github.com/thlorenz/doctoc)--> -<!-- START doctoc generated TOC please keep comment here to allow auto update --> -<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --> -**Table of Contents** - -- [Features](#features) -- [Usage](#usage) - - [Code interface](#code-interface) -- [Maven Settings](#maven-settings) - - [Goals](#goals) - - [Configuration](#configuration) - - [General settings](#general-settings) - - [Global node identification settings](#global-node-identification-settings) - - [Validation settings](#validation-settings) - - [Query generation settings](#query-generation-settings) - - [Code references](#code-references) -- [Directives](#directives) - - [Common directives](#common-directives) - - [Split database queries with @splitQuery](#split-database-queries-with-splitquery) - - [Joining on self referencing FKs requires @splitQuery](#joining-on-self-referencing-fks-requires-splitquery) - - [Skip DataFetcher generation with @notGenerated](#skip-datafetcher-generation-with-notgenerated) - - [Map fields to table columns with @field](#map-fields-to-table-columns-with-field) - - [Construct nested types from table columns with @experimental_constructType](#construct-nested-types-from-table-columns-with-experimental_constructtype) - - [Resolve fields from database functions with @experimental_procedureCall](#resolve-fields-from-database-functions-with-experimental_procedurecall) - - [Tables, joins and records](#tables-joins-and-records) - - [Link types to database tables with @table](#link-types-to-database-tables-with-table) - - [Define table join paths with @reference](#define-table-join-paths-with-reference) - - [Define table join paths for multitable types with @multitableReference](#define-table-join-paths-for-multitable-types-with-multitablereference) - - [Custom query conditions with @condition](#custom-query-conditions-with-condition) - - [Example: Setup](#example-setup) - - [Example: No _override_ on input parameter](#example-no-override-on-input-parameter) - - [Example: No _override_ on field with input parameters](#example-no-override-on-field-with-input-parameters) - - [Example: Both field and parameters](#example-both-field-and-parameters) - - [Example: With _override_ on input parameter](#example-with-override-on-input-parameter) - - [Example: With _override_ on field with input parameters](#example-with-override-on-field-with-input-parameters) - - [Example: With _override_ on both field and parameters](#example-with-override-on-both-field-and-parameters) - - [Example: Conditions on input type fields](#example-conditions-on-input-type-fields) - - [Example: Condition using flat record configuration](#example-condition-using-flat-record-configuration) - - [Example: Condition using nested record configurations](#example-condition-using-nested-record-configurations) - - [Example: Schema with listed input types and condition set _on_ listed input field](#example-schema-with-listed-input-types-and-condition-set-on-listed-input-field) - - [Example: Schema with listed input types and condition set on input field _inside_ a list input](#example-schema-with-listed-input-types-and-condition-set-on-input-field-inside-a-list-input) - - [Example: Condition with @nodeId argument](#example-condition-with-nodeid-argument) - - [Map enums with @enum](#map-enums-with-enum) - - [Generate mutations with @mutation](#generate-mutations-with-mutation) - - [Custom logic with @service](#custom-logic-with-service) - - [Services outside root](#services-outside-root) - - [Resolving @table fields after services](#resolving-table-fields-after-services) - - [Services returning jOOQ records](#services-returning-jooq-records) - - [Services returning Java records](#services-returning-java-records) - - [Auto-fetching @table types from database](#auto-fetching-table-types-from-database) - - [Nested input structures](#nested-input-structures) - - [Input types with Java records](#input-types-with-java-records) - - [Explicit null vs not provided in services](#explicit-null-vs-not-provided-in-services) - - [jOOQ record inputs](#jooq-record-inputs) - - [Java record inputs (experimental)](#java-record-inputs-experimental) - - [How to use](#how-to-use) - - [Context variables](#context-variables) - - [Response mapping](#response-mapping) - - [Custom table resolution with @tableMethod](#custom-table-resolution-with-tablemethod) - - [Exception handling with @error](#exception-handling-with-error) - - [Custom field logic with @externalField](#custom-field-logic-with-externalfield) - - [Example](#example) - - [Polymorphic queries (unions and interfaces)](#polymorphic-queries-unions-and-interfaces) - - [Single table interface](#single-table-interface) - - [Multitable interface](#multitable-interface) - - [Multitable union](#multitable-union) - - [Query conditions for polymorphic multitable types](#query-conditions-for-polymorphic-multitable-types) - - [Batch lookups with @lookupKey](#batch-lookups-with-lookupkey) - - [Constraints](#constraints) - - [Valid and invalid patterns](#valid-and-invalid-patterns) - - [Sorting](#sorting) - - [Sort results with @orderBy input](#sort-results-with-orderby-input) - - [Default sorting with @defaultOrder](#default-sorting-with-defaultorder) -- [Special interfaces](#special-interfaces) - - [Node](#node) - - [Error](#error) -- [Global node identification](#global-node-identification) - - [Mark a type as globally identifiable with @node](#mark-a-type-as-globally-identifiable-with-node) - - [Mark an ID as globally unique with @nodeId](#mark-an-id-as-globally-unique-with-nodeid) - - [Implicit typeName](#implicit-typename) - - [Referencing another type's ID](#referencing-another-types-id) -- [Graphitron integration tests](#graphitron-integration-tests) - -<!-- END doctoc generated TOC please keep comment here to allow auto update --> - -## Features -* Generate the GraphQL code and database queries needed to resolve a GraphQL schema with a set of directives - * In many cases, writing backend code can be skipped entirely! - * Need more advanced queries? Graphitron provides options for setting custom conditions, sorting, queries and more, - while still taking care of the GraphQL-side of things - * If needed, code generation can be skipped for individual data fetchers -* Supports Apollo Federation -* Error handling - -## Usage -See the [example project](https://github.com/sikt-no/graphitron/blob/main/graphitron-example) for a complete example of how to set up -and use Graphitron, which also includes a [README.md](https://github.com/sikt-no/graphitron/blob/main/graphitron-example/README.md) -file detailing the setup and usage of the example project. -This project is also the home of our integration tests, which ensure that Graphitron generates data fetchers that run as expected. - -### Code interface -Graphitron provides a static generated class (`graphitron.Graphitron`) for accessing the generated results in a user-friendly way. -This will be available after the first run of graphitron-java-codegen. A [nodeIdStrategy](#global-node-identification) -can be passed to most of these methods. - -Here are a few examples of how one can retrieve schema-related code for further use: - -```java -// Get the schema with all wiring included. -GraphQLSchema schema = Graphitron.getSchema(nodeIdStrategy); -``` - -```java -// Get the schema with Apollo Federation support. Use this to wire _service and _entities resolvers. -var registry = Graphitron.getTypeRegistry(); -var wiringBuilder = Graphitron.getRuntimeWiringBuilder(nodeIdStrategy); -GraphQLSchema schema = Graphitron.getFederatedSchema(registry, wiringBuilder, nodeIdStrategy); -``` - -```java -// Get the wiring for the generated code. -RuntimeWiring runtimeWiring = Graphitron.getRuntimeWiring(nodeIdStrategy); -``` - -```java -// Get the wiring for the generated code as a builder. Equivalent to the getRuntimeWiring, but skips the .build() call at the end. -RuntimeWiring.Builder runtimeWiringBuilder = Graphitron.getRuntimeWiringBuilder(nodeIdStrategy); -``` - -```java -// Get the type registry. You need this to build a GraphQLSchema. -TypeDefinitionRegistry registry = Graphitron.getTypeRegistry(); -``` - -## Maven Settings -### Goals -The _generate_ Maven goal allows Graphitron to be called as part of the build pipeline. It generates all the classes -that are set to generate in the schema. - -Additionally, the _watch_ goal can be used locally to watch GraphQL files -for changes, and regenerate code without having to re-run generation manually each time. -The _watch_ feature is incomplete and currently has low utility. - -The _validate_ goal can be used to validate GraphQL schemas without generating code. - -### Configuration -In order to find the schema files and any custom methods, Graphitron also provides some configuration options. -The options are the same for both goals. - -#### General settings -* `outputPath` - The location where the code will be generated. -* `outputPackage` - The package path of the generated code. -* `schemaFiles` - Set of schema files which should be used for the generation process. -* `userSchemaFiles` - Set of schema files to provide to the user. -* `jooqGeneratedPackage` - The location of the jOOQ generated code. -* `externalReferences` - See [Code references](#code-references). -* `externalReferenceImports` - See [Code references](#code-references). -* `globalRecordTransforms` - See [Code references](#code-references). -* `maxAllowedPageSize` - The maximum number of items that can be returned from "Cursor Connections Specification" based data fetchers. And thus also the database query limit. -* `scalars` - Extra scalars that can be used in code generation and that will be added automatically to the wiring. Reflection is used to find all the scalar definitions of the provided class(es). - -#### Global node identification settings -* `makeNodeStrategy` - Enables support for global node identification in generated code. See [Global node identification](#global-node-identification). -* `experimental_requireTypeIdOnNode` - Experimental flag that requires the `typeId` parameter on the **node** directive. This flag will be removed, but can temporarily be used to ensure all node types have a defined type ID. - -#### Validation settings -* `recordValidation` - Controls whether generated mutations should include validation of JOOQ records through the Jakarta Bean Validation specification. - * `enabled` - Flag indicating if Graphitron should generate record validation code - * `schemaErrorType` - Name of the schema error to be returned in case of validation violations and IllegalArgumentExceptions. - If null while `enabled` is true all validation violations and IllegalArgumentExceptions will instead cause - _AbortExecutionExceptions_ to be thrown, leading to top-level GraphQL errors. - Also, if the given error is not present in the schema as a returnable error for a specific mutation, - validation violations and IllegalArgumentExceptions on this mutation will cause top-level GraphQL errors. -* `codeGenerationThresholds` - Thresholds for code generation warnings and limits. If enabled, errors or warnings will appear if a generated jOOQ query exceed the thresholds. - * `upperBoundLinesOfCode` - Warning threshold for generated method line count. - * `crashPointLinesOfCode` - Hard limit for generated method line count; exceeding this causes a build failure. - * `upperBoundNestingDepth` - Warning threshold for nesting depth of correlated subqueries. - * `crashPointNestingDepth` - Hard limit for nesting depth; exceeding this causes a build failure. -* `validateOverlappingInputFields` - Validates that input fields mapping to the same jOOQ column have consistent values at runtime. - -#### Query generation settings -* `optionalSelect` - Controls optional select behavior for fields, which can improve performance by skipping unrequested fields. - * `onSubqueryReferences` - Enable optional selects for subquery references. - * `onExternalFields` - Enable optional selects for external fields. -* `useJdbcBatchingForDeletes` - Enables JDBC batching for delete operations in generated mutations. Enabled by default. If disabled, improved delete query with returning clause will be generated. -* `useJdbcBatchingForInserts` - Enables JDBC batching for insert operations in generated mutations. Enabled by default. If disabled, improved insert query with returning clause will be generated. -* `failOnMerge` - When enabled, code generation will fail if an upsert mutation with MERGE is encountered. Disabled by default. -* `generateUpsertAsStore` - Use jOOQ `batchStore` instead of `batchMerge` for upsert mutations. Disabled by default. When enabled, existing records are fetched by primary key before mutation, and only the input-provided fields are applied onto them. This lets jOOQ decide whether to INSERT or UPDATE based on the record state. - -See the [pom.xml](https://github.com/sikt-no/graphitron/blob/main/graphitron-example/graphitron-example-spec/pom.xml) -of _graphitron-example-spec_ for an example on how to configure these settings. - -#### Code references - -In some instances you need to link custom java code to Graphitron's generated data fetchers. -In order for Graphitron to find the external Java code it needs to be listed in the maven configuration described in this section. - -* _externalReferences_ - List of references to classes that can be applied through certain directives. Note that this is being deprecated in favor of using the className in the directives. -* _externalReferenceImports_ - List of packages that should be searched for classNames used in directives. - -Example of referencing a class through the configuration: -```xml -<externalReferences> - <element> <!--The name of this outer element does not matter.--> - <name>CUSTOMER_TRANSFORM</name> - <fullyQualifiedClassName>some.path.CustomerTransform</fullyQualifiedClassName> - </element> -</externalReferences> -``` - -Example of importing a package through the configuration: -```xml -<externalReferenceImports> - <package>some.path</package> -</externalReferenceImports> -``` - -Example of applying a global transform in the POM: -```xml -<globalRecordTransforms> - <element> - <fullyQualifiedClassName>some.path.CustomerTransform</fullyQualifiedClassName> - <method>someTransformMethod</method> <!-- Method in the referenced class to be applied. --> - <scope>ALL_MUTATIONS</scope> <!-- Only ALL_MUTATIONS is supported right now. --> - </element> -</globalRecordTransforms> -``` - -## Directives -> Note that several of the code examples below use unaliased jOOQ tables for readability, while the code Graphitron generates only uses aliased tables. -### Common directives -#### Split database queries with @splitQuery -Applying this to a type reference denotes a split in the generated jOOQ query. -This means that we want a new, explicit data fetcher for the annotated field. -Fields in the Query and Mutation types, as well as fields with arguments, do not require this directive as -they always require explicit data fetchers. - -In this example, the code generation creates the classes _ATypeDBQueries_ and _ATypeGeneratedDataFetcher_, containing -the data fetcher code required to fetch _OtherType_ given _AType_. -Note that this example would not work in practice as we have not specified any tables to map to yet. -```graphql -type AType { - otherType: OtherType @splitQuery # Build new data fetcher/query for this field. -} - -type OtherType { - name: String -} -``` -The actual code generated by Graphitron will be discussed in the next sections. - -Note that for `@table` fields on `@record` types reachable from `@service`, `@splitQuery` is applied automatically. See [Resolving @table fields after services](#resolving-table-fields-after-services). - -##### Joining on self referencing FKs requires @splitQuery - -When a database table has a foreign key that references itself (e.g., `FILM.SEQUEL` referencing `FILM.FILM_ID`), the field that traverses this self-reference **must** have the `@splitQuery` directive. Without it, the code generator cannot distinguish the self-referencing join from staying in the same table context. - -```graphql -type Film @table { - sequel: Film @splitQuery @reference(path: [{key: "FILM__SEQUEL_FKEY"}]) -} -``` - -Wrapper types that map to the same table without creating a join are unaffected: -```graphql -type Film @table { - wrapper: FilmDetails # No @splitQuery needed — stays in the same table context -} - -type FilmDetails @table(name: "FILM") { - title: String -} -``` - -**Reverse self-references** (listing rows that reference the current row via a self-referencing FK) are not currently supported through automatic join resolution. Use a custom `@condition` as a workaround. - -#### Skip DataFetcher generation with @notGenerated -Set this on any query or mutation field that Graphitron would usually generate a new data fetcher for in order to -cancel of it. -Since graphql still requires the data fetchers to resolve the fields, -they will have to be implemented and [wired manually](https://javadoc.io/static/com.graphql-java/graphql-java/10.0/graphql/schema/idl/RuntimeWiring.html). -If one is not specified, the field will always return null. - -```graphql -type Query { - aQuery: AType @notGenerated # Do not generate this query automatically. -} - -type AType { - otherType: OtherType @splitQuery @notGenerated # Require a new data fetcher for this field, but do not generate it automatically. -} - -type OtherType { - name: String -} -``` - -#### Map fields to table columns with @field -By default, Graphitron assumes each field not annotated with the **notGenerated** or **splitQuery** directives to have a name -equal to the column it corresponds to in the jOOQ table or service record. -Specifying the _name_-parameter in the **field** directive overrides this behaviour. -This directive applies to regular type fields, input type fields, arguments and enum values. -For determining which table the field name should be taken from, see the [table](#link-types-to-database-tables-with-table) and [reference](#define-table-join-paths-with-reference) directives. - - -```graphql -type Query { - query( - argument: String @field(name: "ACTUAL_ARGUMENT_NAME") # @field applied on an argument. - ): SomeType -} - -type SomeType { - value: String @field(name: "ACTUAL_VALUE_NAME") # @field applied on a standard field. -} - -input SomeInput { - value: String @field(name: "ACTUAL_VALUE_NAME") # @field applied on an input field. -} - -enum SomeEnum { # @field applied on enum fields. Each of these must correspond to a jOOQ field. - E0 @field(name: "ACTUAL_E0") - E1 @field(name: "ACTUAL_E1") - E2 @field(name: "ACTUAL_E2") -} -``` - -The _javaName_-parameter is an obscure special case for when a table/jOOQ-record needs to interact with a Java record. -It acts as a second override, defaulting to the value of _name_ when not set. A concrete example of where this parameter -is required is when using records with conditions or queries in general where the contents of the record must be -matched to jOOQ table fields. - -```graphql -type Query { - query(argument: SomeInput): SomeType -} - -input SomeInput @record(record: {className: "some.path.SomeRecord"}) { - value: String @field(name: "ACTUAL_VALUE_NAME", javaName: "ACTUAL_JAVA_RECORD_FIELD_NAME") -} - -type SomeType @table { … } -``` - -#### Construct nested types from table columns with @experimental_constructType -The **experimental_constructType** directive constructs nested object types from columns in the parent table, -when the target type does not have the `@table` directive. This is useful when you want re-use nested types with different mappings, -or when mapping keys for non-resolvable federation entities. The logic is equivalent to that of the `@field` directive. - -The _selection_ parameter uses the GraphQL syntax to map fields to columns in the parent table: -- `fieldName: COLUMN_NAME` maps the field to a specific, differently named column. -- `fieldName` assumes the column has the same name as the field. -- Fields that are not included in the selection will resolve to `null`. - -```graphql -type Customer @table { - info: CustomerInfo @experimental_constructType(selection: "label: FIRST_NAME, detail: EMAIL") -} - -type CustomerInfo { # Both fields are resolved from Customer. - label: String - detail: String -} -``` - -Multiline input is also allowed: - -```graphql -type Customer @table { - info: CustomerInfo @experimental_constructType(selection: """ - label: FIRST_NAME, - detail: EMAIL - """) -} -``` - -**Restrictions:** -- The containing type must have access to a table, either by specifying `@table` or inheriting it from previous types. -- The target type is forbidden from having a `@table` directive set. -- Can not be combined with `@field` or `@externalField` on the same field. -- Nested object types are not supported. -- All selection field names must exist in the target type. - -#### Resolve fields from database functions with @experimental_procedureCall -The **experimental_procedureCall** directive resolves a field by calling a jOOQ-generated routine (a database function) inline -as part of the surrounding query. The function call composes into the same `SELECT` that builds the parent row, so its inputs -can be either columns on the current row or GraphQL arguments on the surrounding data-fetcher field. - -The _procedure_ parameter is the routine name as returned by jOOQ's `Routine.getName()`, matching the database routine name -(matched case-insensitively). When the same routine name exists in multiple database schemas, qualify it as `schema.routine` -(e.g. `public.last_day`) to disambiguate. If the procedure is unique across schemas, the name will suffice. -The _arguments_ parameter maps the routine's IN parameter names to argument sources, -using the same selection syntax as [@experimental_constructType](#construct-nested-types-from-table-columns-with-experimental_constructtype): -- The key side is the routine parameter name exactly as returned by jOOQ's `Parameter.getName()` - typically snake_case (e.g. `p_inventory_id`). -- The value side names either a column on the current table or a GraphQL argument, depending on the directive's mode (see below). -- Argument order is deduced from the routine's IN parameter order; the map is keyed by parameter name, not positional. -- _arguments_ may be omitted or empty only when the function has zero IN parameters. - -The directive has two modes, distinguished structurally by the presence of the `target` parameter. - -##### Inline mode (no `target`) - -The directive sits on a scalar field. Argument values name columns on the surrounding type's table, and the function call -fills the cell of the directive-bearing field. - -```graphql -type InventoryWithHeldBy implements Node @node @table(name: "INVENTORY") { - id: ID! @nodeId - inventoryHeldBy: Int @experimental_procedureCall( - procedure: "inventory_held_by_customer", - arguments: "p_inventory_id: INVENTORY_ID" - ) -} -``` - -Multiple arguments can be provided: - -```graphql -someField: Int @experimental_procedureCall(procedure: "some_func", arguments: "p_first: FIRST_COLUMN, p_second: SECOND_COLUMN") -``` - -##### Target mode (`target` set) - -The directive sits on a *data-fetcher field* (a root field, a field with arguments, or a `@splitQuery` field) whose return type -is an object or a list of objects. The `target` parameter names a sibling scalar field on that return type whose cell the function -call fills. Argument values name top-level GraphQL arguments on the directive-bearing field. - -```graphql -type Query { - customerWithHeldBy(inventoryId: ID): Customer @experimental_procedureCall( - target: "heldBy", - procedure: "inventory_held_by_customer", - arguments: "p_inventory_id: inventoryId" - ) -} - -type Customer @table { - id: ID - heldBy: Int -} -``` - -Mode discrimination is structural: setting `target` switches the meaning of every argument value from "column on the surrounding -table" to "GraphQL argument on the data-fetcher field." Mixing the two within a single directive is not allowed. - -**Restrictions (apply to both modes):** -- Only scalar-returning functions (`Field<T>`) are currently supported. OUT / INOUT parameters and record-returning procedures are not supported. -- Every IN parameter of the routine must be mapped, and the routine's return type must match the cell's Java type - (the directive-bearing field in inline mode, the target field in target mode). -- The routine name must resolve unambiguously, qualified with `schema.` when needed. -- Can not be combined with `@field`, `@externalField`, or `@reference` on the same field. -- Can not be placed on interface fields. - -**Inline mode-specific:** -- The containing type must have an associated table (via `@table` or inherited from an enclosing type). -- The directive can not be placed on root `Query` or `Mutation` fields, or on fields with non-scalar return types. -- Every mapped argument value must name a column on the surrounding table. - -**Target mode-specific:** -- The return type (or a type above it in the chain) must have an associated table. -- The return type must be an object, or a list of objects (interfaces and unions are not yet supported). -- The named target must be a scalar field on the return type, with no `@field`, `@externalField`, or `@experimental_procedureCall` of its own. -- Every mapped argument value must name a top-level GraphQL argument on the directive-bearing field. Nested input-field paths are not yet supported. - -### Tables, joins and records -#### Link types to database tables with @table -The **table** directive links the object, interface or input type to a jOOQ table and record. Any **field**-directives within -this type will use this table as the source for the field mapping. This targets jOOQ generated classes, so -the _name_ parameter must match the table name in jOOQ if it differs from the database. The _name_ parameter is optional, -and does not need to be specified if the type name already equals the table name. - -In the example below the generator would apply an implicit path join on the key between the two tables when building the subquery for the reference. -Note that this can only work if there is only one foreign key between the tables. For example, given tables from the -schema example below, the result will be `TABLE_A.table_b()`. If more than one key exists, a more complex configuration -is required, see [reference](#define-table-join-paths-with-reference). - -_Schema_: -```graphql -type Table_A @table { # Table name matches the type name, name is unnecessary. - someOtherType: OtherType -} - -type OtherType @table(name: "TABLE_B") { - name: String -} -``` - -_Generated result (excluding row mapping and aliases)_: -```java -select( - field( - select(TABLE_A.table_b().NAME) - .from(TABLE_A.table_b()) - ) - .from(TABLE_A) -``` - -If a table type contains other types that do not set their own tables, the previous table type is used instead. -This also applies to enum types. - -#### Define table join paths with @reference -There are, of course, many cases where the connection between two tables is more complex. -In such cases, Graphitron requires some extra parameters to make the right connections. -This is done through the **reference** directive, which contains the following parameters: - -* _path_ - This parameter contains an ordered list of reference elements that is used to compose the path from -the table of this type to the table corresponding to the type of the field. -* _reference element_: - * _table_ - This defaults to the table of the type that is referenced by the field the directive is set on. -Setting this overrides whatever table may be set there. This must match a table name from jOOQs _Table_ class. - * _key_ - If there are multiple foreign keys from one type to another, then this parameter is required for defining which -key that should be used. This must match a key name from jOOQs _Keys_ class. - * _condition_ - This parameter is used to place an additional constraint on the two tables, by referring to the correct [entry](#code-references) -in the POM XML. In the cases where there is no way to deduce the key between the tables and the _key_ or _table_ parameter is not set, -this condition will be assumed to be an _on_ condition to be used in a join operation between the tables. - -Note that joins only apply to the field they are set on, as it is only applied to the field's subquery. If the field is a scalar type, -it can be linked to a jOOQ column in another table using this directive. If the field is a GraphQL type, all fields within the -type will use the resulting join operation. - -Also note that setting both the _table_ and _key_ parameters in the same _reference element_ is redundant if there is -only one path between the tables, since either is enough to make the join. - -The following examples will assume that this configuration is set so that Graphitron can find the referenced classes: -```xml -<externalReferenceImports> - <package>some.path</package> -</externalReferenceImports> -``` - -For the first example we will apply this simple condition method on tables that _do_ have a direct connection. -```java -class CustomerConditions { - static org.jooq.Condition addressJoin(Customer customer, Address address) { … } -} -``` - -The method returns a jOOQ condition, which will be added to the where conditions for the subquery. - -_Schema_: -```graphql -type Customer @table { - addresses: [Address!]! @splitQuery @reference(path: [{condition : {className: "some.path.CustomerConditions", method: "addressJoin"}}]) -} -``` - -_Generated result_: -```java -.where(some.path.CustomerConditions.addressJoin(CUSTOMER, CUSTOMER.address())) -``` - -The condition is thus an additional constraint applied on both tables. -In a slightly different case where the tables are not directly connected, the join will behave differently. -If the two tables do not have any foreign keys between them, or there are multiple, and the one to use was not specified, -the generated result would follow a pattern like the code below. - -```java -.from(CUSTOMER) -.join(ADDRESS) -.on(some.path.CustomerConditions.addressJoin(CUSTOMER, ADDRESS)) -``` - -Providing only a key will yield the same result. Note that in this example the key and the reference directive itself -are redundant since there is only one key between the tables. Assume the _Address_ type has the **table** directive set. - -_Schema_: -```graphql -type Customer @table { - addresses: [Address!]! @splitQuery @reference(path: [{key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY"}]) -} -``` - -_Generated result_: -```java -.from(CUSTOMER.address()) -``` - -Providing both a key and a condition will result in a sum of both the first and previous examples, -meaning both a join on a key and one additional condition will be applied. - -Using multiple _reference elements_ will create additional joins like the previous examples have already shown. -The example below is a simple illustration of this. Assume the _Film_ type has the **table** directive set. - -_Schema_: -```graphql -type Payment @table { - # The path here is PAYMENT -> RENTAL -> INVENTORY -> FILM - film: Film! @splitQuery @reference(path: [{table: "RENTAL"}, {table: "INVENTORY"}]) -} -``` - -First, Graphitron defines aliases for these joins, one per step. - -```java -var payment = PAYMENT; -var payment_rental = payment.rental(); -var payment_rental_inventory = payment_rental.inventory(); -var payment_rental_inventory_film = payment_rental_inventory.film(); -``` - -Then, the aliases are applied where necessary. This is the generated subquery for the references. -Assume that the Film type contains a field named "title". - -```java -select(select.optional("title", payment_rental_inventory_film.TITLE)) -.from(payment_rental) -.join(payment_rental_inventory) -.join(payment_rental_inventory_film) -``` - -#### Define table join paths for multitable types with @multitableReference - -The **multitableReference** directive specifies type-specific reference paths for fields that return multitable union or interface types. -This directive defines the reference path from the source table to target table for each type. - -**Parameters:** -* _routes_ - A list of reference routes, one for each implementing type or union type - * _typeName_ - The implementation type name. Note that this is case-sensitive. - * _path_ - An ordered list of reference elements (same structure as **reference** directive) - -**Example:** -```graphql -type Payment @table { - staffAndCustomers: [PersonWithEmail] @splitQuery @multitableReference(routes: [ - {typeName: "Staff", path: [{key: "PAYMENT__PAYMENT_STAFF_ID_FKEY"}]}, - {typeName: "Customer", path: [{table: "CUSTOMER"}]} - ]) -} -``` - -**Notes:** -- Cannot be combined with **@reference** directive -- Only applies to multitable unions/interfaces -- If routes are omitted for some types, Graphitron will attempt to infer the reference path - -### Custom query conditions with @condition -To either apply additional conditions or override the conditions added by default, use the **condition** directive. -It can be applied to both input parameters and data fetcher fields, and the scope of the condition will match the element it is put on. -It provides the following parameter options: - -* _condition_ - Reference class and method name (see [code references](#code-references)) -* _override_ - If true, disables any default checks that are added to the affected arguments, otherwise add the new condition in -addition to the default ones. - -If the condition should take a list of nested input types, they need to correspond to records. -This can be achieved by either using the **table** directive or the **record** directive. -The former will result in a mapping to a jOOQ record, while the latter will produce a mapping to the referenced Java record. -Thus, the condition will take the created record as parameter, allowing for more complex conditions. -Worth noting here is that jOOQ records can not contain other records. -Also, to use a **record** directive on a nested input all the preceding inputs must also be Java records. - -There are concrete examples of how conditions and Java records may look in our test project files, -such as [CustomerConditions](https://github.com/sikt-no/graphitron/blob/main/graphitron-example/graphitron-example-service/src/main/java/no/sikt/graphitron/example/service/conditions/CustomerConditions.java) -and [CustomerJavaInput](https://github.com/sikt-no/graphitron/blob/main/graphitron-example/graphitron-example-service/src/main/java/no/sikt/graphitron/example/service/records/CustomerJavaInput.java). - -#### Example: Setup -The following examples will assume this configuration exists: - -```xml -<externalReferenceImports> - <package>some.path</package> -</externalReferenceImports> -``` - -#### Example: No _override_ on input parameter -Adds this condition in addition to the conditions automatically generated for this parameter. -The method must have the table and the input parameter type as parameters. - -_Schema_: -```graphql -cityNames: [String!] @field(name: "CITY") @condition(condition: {className: "some.path.CityConditions", method: "cityMethod"}) -``` - -_Resulting code_: -```java -.where(cityNames != null && cityNames.size() > 0 ? CITY.CITY.in(cityNames) : noCondition()) -.and(some.path.CityConditions.cityMethod(CITY, cityNames)) -``` - -#### Example: No _override_ on field with input parameters -Adds this condition in addition to the conditions automatically generated for this parameter. -The method must have the table and all input parameter types for this field as parameters. - -_Schema_: -```graphql -cities( - countryId: String! @field(name: "COUNTRY_ID"), - cityNames: [String!] @field(name: "CITY") -): [City] @condition(condition: {className: "some.path.CityConditions", method: "cityMethod"}) -``` - -_Resulting code_: -```java -.where(CITY.COUNTRY_ID.eq(countryId)) -.and(cityNames != null && cityNames.size() > 0 ? CITY.CITY.in(cityNames) : noCondition()) -.and(some.path.CityConditions.cityMethod(CITY, countryId, cityNames)) -``` - -#### Example: Both field and parameters -Removes none of the automatically generated conditions, but add conditions for both the field and parameter as shown in the two previous examples. - -#### Example: With _override_ on input parameter -Replaces the automatically generated conditions for the input parameter with the specified condition. -The method must have the table and the input parameter type as parameters. - -_Schema_: -```graphql -cityNames: [String!] @field(name: "CITY") @condition(condition: {className: "some.path.CityConditions", method: "cityMethod"}, override: true) -``` - -_Resulting code_: -```java -.where(some.path.CityConditions.cityMethod(CITY, cityNames)) -``` - -#### Example: With _override_ on field with input parameters -Replaces the automatically generated conditions for the field with the specified condition. -The method must have the table and all input parameter types for this field as parameters. - -_Schema_: -```graphql -cities( - countryId: String! @field(name: "COUNTRY_ID"), - cityNames: [String!] @field(name: "CITY") -): [City] @condition(condition: {className: "some.path.CityConditions", method: "cityMethodAllElements"}, override: true) -``` - -_Resulting code_: -```java -.where(some.path.CityConditions.cityMethodAllElements(CITY, countryId, cityNames)) -``` - -#### Example: With _override_ on both field and parameters -Both manually defined conditions are included, but nothing else. Note that if override is set on the field condition -the _override_ value on the parameter becomes irrelevant, since the one on the field already removes all -the default checks. - -_Schema_: -```graphql -cities( - countryId: String! @field(name: "COUNTRY_ID"), - cityNames: [String!] @field(name: "CITY") @condition(condition: {className: "some.path.CityConditions", method: "cityMethod"}, override: true) -): [City] @condition(condition: {className: "some.path.CityConditions", method: "cityMethodAllElements"}, override: true) -``` - -_Resulting code_: -```java -.where(some.path.CityConditions.cityMethod(CITY, cityNames)) -.and(some.path.CityConditions.cityMethodAllElements(CITY, countryId, cityNames)) -``` - -#### Example: Conditions on input type fields -In the following example we have conditions on input type parameters, where some have the _override_ value set to _true_. -Conditions placed on the outer levels of a nested input type, will extract all the scalar values within the type and use them as arguments. -The default conditions will still be generated for the inner levels of a nested input type when they are not overridden by a parent condition. - -_Schema_: -```graphql -type Query { - query(staff: StaffInput! @condition(condition: {className: "some.path.StaffConditions", method: "staff"}) - ) : [Staff] -} - -input StaffInput { - info: ContactInfoInput! - active: Boolean! -} - -input ContactInfoInput { - name: NameInput! @condition(condition: {className: "some.path.StaffConditions", method: "name"}, override: true) - jobEmail: EmailInput! @condition(condition: {className: "some.path.StaffConditions", method: "email"}) -} - -input NameInput { - firstname: String! @field(name: "FIRST_NAME") @condition(condition: {className: "some.path.StaffConditions", method: "firstname"}) - lastname: String! @field(name: "LAST_NAME") @condition(condition: {className: "some.path.StaffConditions", method: "lastname"}) -} - -input EmailInput { - email: String! -} -``` - -_Resulting code_: -```java -.where(some.path.StaffConditions.firstname(STAFF, staff.getInfo().getName().getFirstname())) -.and(some.path.StaffConditions.lastname(STAFF, staff.getInfo().getName().getLastname())) -.and(STAFF.EMAIL.eq(staff.getInfo().getJobEmail().getEmail())) -.and(STAFF.ACTIVE.eq(staff.getActive())) -.and(some.path.StaffConditions.staff(STAFF, staff.getInfo().getName().getFirstname(), staff.getInfo().getName().getLastname(), staff.getInfo().getJobEmail().getEmail(), staff.getActive())) -.and(some.path.StaffConditions.name(STAFF, staff.getInfo().getName().getFirstname(), staff.getInfo().getName().getLastname())) -.and(some.path.StaffConditions.email(STAFF, staff.getInfo().getJobEmail().getEmail())) -``` - -#### Example: Condition using flat record configuration -This is the simplest case, when we have only one layer of input types. -In the example below, the input type will be mapped to a jOOQ record that corresponds to the table. -This has the advantage of not needing to define and reference a Java record, but the result is equivalent. - -_Schema_: -```graphql -cities( - cityInput: CityInput! -): [City] @condition(condition: {className: "some.path.CityConditions", method: "cityMethodAllElements"}, override: true) - -input CityInput @table(name: "CITY") { - countryId: String! @field(name: "COUNTRY_ID") -} -``` - -#### Example: Condition using nested record configurations -Currently, if one layer input is a record then the entire preceding structure must also be records. -This is because the mapping from DTOs to records happens before the query is executed. The most relevant details to note here is that while jOOQ records -are allowed inside a Java record definition, they must always be on "leaf" input types that do not have further record nesting. -Additionally, jOOQ records can, of course, not contain Java records. - -This pattern is required when using nested input types that use lists of the inner input types. -Note the extra parameter for the [**field**](#map-fields-to-table-columns-with-field) directive since we are using Java records in fetch queries. - -_Schema_: -```graphql -cities( - cityInput: CityInput1! -): [City] @condition(condition: {className: "some.path.CityConditions", method: "cityMethodAllElements"}, override: true) - -# Can not skip record here even if we only want one of the other input types in our condition. -input CityInput1 @record(record: {className: "some.path.Layer1Record"}) { - # A condition can also be placed here, but this may be redundant given the condition above in this case. - cityNames: [String!] @field(name: "CITY", javaName: "javaCityNamesField") @condition(condition: {className: "some.path.CityConditions", method: "cityMethod"}, override: true) - countryId: String! @field(name: "COUNTRY_ID", javaName: "javaCountryField") - city2: [CityInput2] - city3: [CityInput3] -} - -input CityInput2 @record(record: {className: "some.path.Layer2Record"}) { - countryId: String! @field(name: "COUNTRY_ID", javaName: "javaCountryField2") -} - -input CityInput3 @table(name: "CITY") { - countryId: String! @field(name: "COUNTRY_ID") -} -``` - -_Resulting code_: -```java -.where(some.path.CityConditions.cityMethodAllElements(CITY, cityInputRecord)) -.and(some.path.CityConditions.cityMethod(CITY, cityInputRecord.getCityNames())) -``` - -#### Example: Schema with listed input types and condition set _on_ listed input field -Graphitron does not support more than one level of listed input types. To be able to generate code for the cases -where we initially would generate several levels of lists, we instead must declare an override condition before the -second listed input in the hierarchy. Then we must write subsequent checks manually in the method specified for the -condition. In this case we specify an override condition _on_ a field holding a list of input types. The condition method -will then be passed this list of input types and further checks on this list will be done in the method. - -```graphql -type Query { - query( - inputs1: [Input1] @condition(condition: {className: "some.path.RecordStaffConditions", method: "input1"}, override: true) - ) : [Staff] -} - -input Input1 @record(record: {className: "some.path.JavaRecordStaffInput1"}) { - names: [NameInput] - active: Boolean -} - -input NameInput @record(record: {className: "some.path.JavaRecordStaffName"}) { - firstname: String! @field(name: "FIRST_NAME") - lastname: String! @field(name: "LAST_NAME") -} -``` - -_Resulting_code_: -```java -.where(some.path.RecordStaffConditions.input1(STAFF, inputs1RecordList)) -``` - -#### Example: Schema with listed input types and condition set on input field _inside_ a list input -Here we have a schema of several levels of input types and several of these are lists. -Since Graphitron does not support more than one level of listed inputs, we must specify an override condition before -the second listed input in the hierarchy. -The difference from the previous example is that the condition is set on a field inside a listed input and before the -second listed input. - -_Schema_: -```graphql -type Query { - query( - input3: Input3! - ) : [Staff] -} - -input Input3 @record(record: {className: "some.path.JavaRecordStaffInput3"}) { - inputs2: [Input2] -} - -input Input2 @record(record: {className: "some.path.JavaRecordStaffInput2"}) { - input1: Input1 @condition(condition: {className: "some.path.StaffConditions", method: "input1"}, override: true) -} - -input Input1 @record(record: {className: "some.path.JavaRecordStaffInput1"}) { - names: [NameInput] - active: Boolean -} - -input NameInput @record(record: {className: "some.path.JavaRecordStaffName"}) { - firstname: String! @field(name: "FIRST_NAME") - lastname: String! @field(name: "LAST_NAME") -} -``` - -_Resulting_code_: -```java -.where( - input3Record.getInputs2() != null && input3Record.getInputs2().size() > 0 ? - DSL.row(DSL.trueCondition()).in( - input3Record.getInputs2().stream().map(internal_it_ -> - DSL.row(some.path.StaffConditions.input1(STAFF, internal_it_.getInput1())) - ).toList() - ) : DSL.noCondition() -) -``` - -#### Example: Condition with @nodeId argument -A `@nodeId` argument can be received as a decoded jOOQ record by declaring the corresponding -condition method parameter as the record type. - -_Schema_: -```graphql -customerWithNextCustomerId( - customerId: ID! - @nodeId(typeName: "Customer") - @condition(condition: {className: "some.path.CustomerConditions", method: "customerWithNextCustomerId"}, override: true) -): Customer -``` - -_Condition method_: -```java -public static Condition customerWithNextCustomerId(Customer customer, CustomerRecord id) { - return customer.CUSTOMER_ID.eq(id.getCustomerId() + 1); -} -``` - -### Map enums with @enum -Enums can be mapped in two ways. The **field** directive is already covered [here](#map-fields-to-table-columns-with-field). -An alternative method is to set up a Java enum instead through a jOOQ converter. These can be referenced -using the **enum** directive, by pointing to the appropriate [entry](#code-references). - -```graphql -enum SomeEnum @enum(enumReference: {className: "some.path.SomeEnumConverter"}) { - E0 - E1 - E2 -} -``` - -### Generate mutations with @mutation -Mutations have some limitations when generated through Graphitron, as mutations can potentially take many inputs which may be related to multiple tables. -Automatic generation of the entire data fetcher is currently only viable for simple cases where one input type representing one type of jOOQ record is handled. -This limitation may be removed in the future for mutations other than delete mutations. - -Use the **@mutation** directive and the accompanying _typeName_ parameter to denote a mutation that should be fully -generated. To specify which table should be affected, the **table** directive is used just like for the usual types used -for queries. Unlike for queries, the directive is always required on input types in order for Graphitron to know which records should be mutated. -As usual, **field** may also be applied to adjust the mapping of individual fields. - -```graphql -type Mutation { - editCustomerInputAndResponse(input: EditInput!): EditResponse! @mutation(typeName: UPDATE) - editCustomerWithCustomerResponse(input: EditInput!): EditResponseWithCustomer! @mutation(typeName: UPDATE) -} - -input EditInput @table(name: "CUSTOMER") { # Use @table to specify which jOOQ record/table this corresponds to. - id: ID! - firstName: String @field(name : "FIRST_NAME") # Use @field to adjust the mapping to jOOQ fields. - email: String -} - -type EditResponse { - id: ID! # Note, delete mutations need the return type to have a field of type "ID". -} - -type EditResponseWithCustomer { - customer: Customer -} -``` - -If all required fields for an insert or upsert operation are not set in the input type, a warning will be generated. -In the future this may change to an exception instead, as an incomplete set of required fields will result in a data fetcher -that compiles, but will always fail when executed. - -Note that mutations need either the **@mutation** or the **@service** directive set, but not both, in order to be generated. - -> **Important:** The output from generated update and insert mutations are currently incorrect when using JDBC batching. -> The mutation output is being fetched and filtered based on the input fields rather than returning the actual mutated record(s). To enable improved queries with returning clauses, disable JDBC batching by setting `useJdbcBatchingForInserts` and/or `useJdbcBatchingForDeletes` to `false` in the [query generation settings](#query-generation-settings). - -> **Note:** By default, upsert mutations use SQL MERGE via jOOQ's `batchMerge`. If `batchStore` is preferred, enable `generateUpsertAsStore` in the [query generation settings](#query-generation-settings). This changes the generated code to fetch existing records first and use `batchStore`. - -### Custom logic with @service -The **service** directive allows for full customization of any database operations while still generating data fetchers. -The directive points to a class [entry](#code-references) in the POM XML. -The method name is either specified through the directive or is assumed to be the same as the field name. - -Note that any directives that would usually alter the database operation, such as conditions, are ignored for services. - -There are concrete examples of how services may look in our test project files, -such as [CustomerService](https://github.com/sikt-no/graphitron/blob/main/graphitron-example/graphitron-example-service/src/main/java/no/sikt/graphitron/example/service/CustomerService.java). - -_Schema:_ -```graphql -type Query { - getCustomer: Customer! @service(service: {className: "some.path.CustomerService"}) - - fetchCustomer( - id: ID! - ): Customer! @service(service: {className: "some.path.CustomerService", method: "getCustomer"}) # Example of a case where the method name does not match the field name. -} - -type Mutation { - editCustomer1( - editInput: EditCustomerInput! - ): Customer! @service(service: {className: "some.path.CustomerService"}) # Returning just an ID is allowed as well. - - editCustomer2( - editInput: EditCustomerInput! - ): Customer! @service(service: {className: "some.path.CustomerService", method: "editCustomerAndRespond"}) # Example of a case where the method name does not match the field name. -} - -input EditCustomerInput @table(name: "CUSTOMER") { # @table specifies the jOOQ table/record to use as input to the service. - id: ID! - firstName: String @field(name : "FIRST_NAME") # @field specifies the expected field name either in the jOOQ table or in the custom return class. -} -``` - -#### Services outside root -Using **@service** on non-root fields is supported when combined with the **@splitQuery** directive. -The service method must accept a `Set` of parent table record and return a `Map` from those parents to the resulting values. -Only the primary key fields in the parent table record will be populated with values. - -The resulting values should be a type containing the data you need. Use jOOQ TableRecords if you want Graphitron to generate re-entry queries. In that case, Graphitron will only use the PK fields of those records. Other fields will be ignored. - -_Schema:_ -```graphql -type City @table { - filmsFromCity: [Film!]! @splitQuery @service(service: {className: "some.path.MockService"}) -} -``` - -_Required service code:_ -```java -public class MockService { - public MockService(DSLContext context) { … } - - public Map<CityRecord, List<FilmRecord>> filmsFromCity(Set<CityRecord> cityKeys) { - … - } -} -``` - -> **Deprecated:** Using a `RowN` (e.g., `Row1<Integer>`) matching the primary key (instead of a `TableRecord`) as the resolver key is deprecated. Support will be removed in 9.0.0. - -#### Resolving @table fields after services -When a `@record` type reachable from a `@service` field contains fields that point to `@table` types, Graphitron automatically generates re-entry queries to fetch those fields from the database. This applies whether the `@record` type is the direct return type of the service or is nested inside plain wrapper types. - -No `@splitQuery` directive is needed, the behavior is implicit. The service only needs to return records with the necessary primary key fields populated. - -##### Services returning jOOQ records -The returned jOOQ record must include the primary key fields required for the re-entry query. - -_Schema:_ -```graphql -type Query { - customerService: Customer @service(service: {className: "some.path.CustomerService", method: "customer"}) -} - -type Customer @table { - address: Address -} -``` -For Graphitron to be able to resolve the `address` field in the `Customer` type in this example, -the jOOQ record returned from the service must contain the primary key of the `CUSTOMER` table, in this case `CUSTOMER_ID`. - -##### Services returning Java records -The Java record returned must have a table record type corresponding to the target type's table. -Graphitron will then extract the primary key from the table record, and use it to look up the next object. - -_Schema:_ -```graphql -type Query { - service: JavaRecordResult @service(...) -} - -type JavaRecordResult @record(...) { - customer: Customer -} - -type Customer @table {...} -``` - -The Java record is then expected to have `customer` of type `CustomerRecord`, and its primary key fields to be given the correct value(s) in the service. - -> **Note:** `@splitQuery` can still be used explicitly and remains required for `@table` fields on plain (non-`@record`) types. - -#### Auto-fetching @table types from database -When a service field directly returns a type with `@table`, Graphitron will automatically fetch all requested fields from the database using the primary key extracted from the service result. The service needs to return a record with the primary key populated, all other fields on the record are fetched from the database. - -This applies to non-paginated service fields without `@splitQuery` where the return type has a `@table` directive. Both single and listed fields are supported. For listed fields, Graphitron extracts primary keys from all service results and performs a single batch query using `WHERE pk IN (...)`. - -_Schema:_ -```graphql -type Query { - customerService: Customer @service(service: {className: "some.path.CustomerService", method: "customer"}) - customerServiceList: [Customer] @service(service: {className: "some.path.CustomerService", method: "customers"}) -} - -type Customer @table { - id: ID! - firstName: String @field(name: "FIRST_NAME") - email: String -} -``` - -_Required service code:_ -```java -public class CustomerService { - public CustomerRecord customer() { - // Perform business logic, then return a record with the PK set. - // Graphitron uses the PK to fetch all requested fields from the database. - var customer = new CustomerRecord(); - customer.setCustomerId(1); - return customer; - } - - public List<CustomerRecord> customers() { - // Return records with only the PKs set. - // Graphitron batch-fetches all remaining fields in a single query. - var c1 = new CustomerRecord(); - c1.setCustomerId(1); - var c2 = new CustomerRecord(); - c2.setCustomerId(2); - return List.of(c1, c2); - } -} -``` - -In these examples, even though the service only sets `customerId`, the generated code will execute `SELECT` queries using those IDs to fetch `firstName`, `email`, and any other requested fields from the `CUSTOMER` table. For listed fields, a single batch query is issued for all keys. - -> **Note:** If the return type does _not_ have `@table`, the service result is mapped directly to the GraphQL response type using the standard [response mapping](#response-mapping) rules. - -#### Nested input structures -Multiple layers of jOOQ input types are also supported, but comes with its own limitations. -Most notably, all records are sent to the service as a flat list of unorganised parameters. -This means that all the hierarchy information is lost when reading them in the service. -It is therefore recommended to avoid using this feature, and use [Java records](#input-types-with-java-records) instead. -The following example will illustrate this limitation. - -_Schema_: -```graphql -edit(someInput: InputA!): ID! @service(service: {className: "some.path.SomeService"}) # Assumes method name is the same as field. - -input InputA @table { - b: InputB -} - -input InputB @table { … } -``` - -_Generated code_: -```java -var editResult = service.edit(inputARecord, inputBRecord); // Sequential, independent of the input structure. -``` - -#### Input types with Java records -When using services, custom input types may also be used. It is a referenced class [entry](#code-references), -which must contain appropriate _set_ methods. The name of the method used for setting the values is assumed to be the -same as a fields name in the schema, unless the **field** directive overrides this. These classes can be nested, listed -and may contain JOOQ-records. - -_Schema:_ -```graphql -customer(editInput: EditCustomerInput!): ID! @service(service: {className: "some.path.CustomerService"}) - -input EditCustomerInput @record(record: {className: "some.path.JavaCustomerRecord"}) { # @record specifies the Java record to use. Setting @table here would not do anything. - id: ID! # We need a method with the name "setId" in the record class. - first: String @field(name: "FIRST_NAME") # We need a method with the name "setFirstName" in the record class. Overridden by @field. -} -``` - -_Required service code_: -```java -public class CustomerService { - // The correct java class is defined through the code reference in the configuration. - public String customer(JavaCustomerRecord person) { … } -} -``` -#### Explicit null vs not provided in services - -##### jOOQ record inputs -To distinguish between explicit null from omitted one can track the `changed()` status of the jOOQ record in the service code. -If the jOOQ record's `changed()` status is `true` for a given field, then the value was provided (even if it was `null`). -If `changed()` is `false`, the field was omitted from the request entirely. - -_Example service code_: -```java -public Customer updateCustomer(CustomerRecord record) { - if (record.changed(CUSTOMER.FIRST_NAME)) { - // Field was provided (value may be null or non-null) - } else { - // Field was omitted from the request entirely — do not update - } -} -``` - -For `@mutation` insert operations, Graphitron's generated queries use this automatically: omitted fields fall back to the database column default, while explicitly provided `null` values are inserted as `null`. - -##### Java record inputs (experimental) - -> **Note:** This feature is experimental and may change in future versions. - -> ⚠️ Important: This pattern intentionally uses null on an Optional field to represent "omitted". This goes against conventional Java usage of Optional. See the table below for the three states. - -For Java records (using `@record`), Graphitron does not have built-in `changed()` tracking. -Instead, you can use `Optional<T>` setter parameters to distinguish between three states for a nullable input field: - -| Client sends | Java value | Meaning | -|---|---|---| -| `field: "hello"` | `Optional.of("hello")` | A value was provided | -| `field: null` | `Optional.empty()` | The field was explicitly set to null | -| _(field omitted)_ | `null` | The field was not included in the request | - -##### How to use - -No schema-level changes are needed. The feature is driven entirely by the setter signatures in the Java record class referenced via `@record`. - -1. **Define your input type as usual** in the GraphQL schema: - -```graphql -input EditFilmInput @record(record: {className: "com.example.EditFilmRecord"}) { - title: String! - description: String - rentalDuration: Int -} -``` - -2. **Use `Optional<T>` setter parameters** in your Java record for fields that should track null vs omitted: - -```java -public class EditFilmRecord { - private String title; - private Optional<String> description; - private Optional<Integer> rentalDuration; - - public void setTitle(String title) { this.title = title; } - - // Optional<T> parameter signals Graphitron to wrap the value - public void setDescription(Optional<String> description) { this.description = description; } - public void setRentalDuration(Optional<Integer> rentalDuration) { this.rentalDuration = rentalDuration; } - - // Getters... -} -``` - -3. **Handle the three states** in your service code: - -```java -public class FilmService { - public String editFilm(EditFilmRecord input) { - if (input.getDescription() == null) { - // Field was omitted — do not update - } else if (input.getDescription().isEmpty()) { - // Field was explicitly set to null — clear the value - } else { - // Field has a value — update it - String value = input.getDescription().get(); - } - } -} -``` - -Graphitron detects `Optional<T>` setter parameters at code generation time via reflection and generates mapper code that wraps values with `Optional.ofNullable(...)`. The setter is only called when the field is present in the GraphQL request arguments, so omitted fields leave the Java record field as `null`. -Note: Many IDEs will give a warning about comparing optional values to null. In IntelliJ IDEA, this can be suppressed by adding `@SuppressWarnings("OptionalAssignedToNull")` to the method or class. - -#### Context variables -Using the _contextArguments_ parameter on the **service** or **condition** directives, one can specify which context values should be passed to the referenced method. -The names of the context values correspond to the keys of the values as found in the -[`graphql.GraphQLContext`](https://javadoc.io/static/com.graphql-java/graphql-java/15.0/graphql/GraphQLContext.html) for the current operation. -Graphitron will fetch these values and try to cast them to the matching datatypes in the method arguments. -Note that context arguments are always placed at the end of the method arguments, in the order specified by the _contextArguments_ parameter. - -_Schema:_ -```graphql -customer(name: String): Customer @service(service: {className: "some.path.CustomerService"}, contextArguments: "someCtxField") -``` - -_Required service code_: -```java -public class CustomerService { - // The context value will be cast to String as the last parameter type here is String. - // This inference is necessary because the GraphQLContext does not retain the type information. - // Context arguments always come last in the signature, even after pagination-related parameters. - public String customer(String name, String someCtxField) { … } -} -``` - -#### Response mapping -By default, Graphitron inspects the return type of the service methods to decide how it should be mapped to the -schema response type. - -_Schema:_ -```graphql -type Mutation { - editCustomerWithResponse( - id: ID! - ): EditCustomerResponse! @service(service: {className: "some.path.CustomerService", method: "editCustomerAndRespond"}) -} - -type EditCustomerResponse @record(record: {className: "some.path.JavaCustomerRecord"}) { - id: ID! # We need a method with the name "getId" in the record class. - first: String @field(name: "FIRST_NAME") # We need a method with the name "getFirstName" in the record class. Overridden by @field. - customer: Customer # Some node type. -} -``` - -_Required service code_: -```java -public class CustomerService { - // The only field that is required (except whatever the database requires) is the ID. The correct java class is defined through the code reference in the configuration. - public JavaCustomerRecord editCustomer(String id) { … } -} -``` - -There are some rules that services must follow. Services that are _not_ in a root type must return a map. -The map should use the record ID as key, and the value corresponds to the return type of the previous data fetcher. - -These rules vary slightly when using pagination. -All paginated fields are treated as listed. -In other words, root level services should return a list. -If the service is not at the root level it should return a map with the ID as key and the value should be set to a list of records. - -Schema pagination wrapping is handled automatically, but pagination parameters must be manually applied to any queries -that are used in the service. - -_Schema:_ -```graphql -type Query { - getCustomer(id: ID!): CustomerWrapper! @service(service: {className: "some.path.CustomerService"}) - getCustomerPaginated(id: ID!, first: Int = 100, after: String): CustomerWrapperConnection! @service(service: {className: "some.path.CustomerService"}) -} - -type CustomerWrapperConnection { … } - -type CustomerWrapperConnectionEdge { … } - -type CustomerWrapper @record(record: {className: "some.path.JavaCustomerWrapper"}) { - id: ID! # We need a method with the name "getId" in the record class. - first: String @field(name: "FIRST_NAME") # We need a method with the name "getFirstName" in the record class. Overridden by @field. - customer: Customer # Some node type. -} -``` - -_Required service code_: -```java -public class CustomerService { - public JavaCustomerWrapper getCustomer(String id) { … } - public List<JavaCustomerWrapper> getCustomerPaginated(String id, int pageSize, String after) { … } -} -``` - -If the queries were placed on a query not in the Query type: - -_Required service code_: -```java -public class CustomerService { - public Map<String, JavaCustomerWrapper> getCustomer(String id) { … } - public Map<String, List<JavaCustomerWrapper>> getCustomerPaginated(String id, int pageSize, String after) { … } -} -``` - -Nesting of return types is also allowed. -This example shows the more complex case, where two nested Java return record classes are used. -Such a setup can also be applied to input types. - -_Schema_: -```graphql -something(id: ID!): ReturnA! @service(service: {className: "some.path.SomethingService"}) # Query or mutation. - -type ReturnA @record(record: {className: "some.path.ReturnA"}) { - returnB: ReturnB -} - -type ReturnB @record(record: {className: "some.path.ReturnB"}) { - someData: String @field(name: "INTERESTING_DATA") -} -``` - -_Required service code_: -```java -public class SomethingService { - public ReturnA something(String id) { … } // The service method that should be called. Note that the 'id' here corresponds to the 'id' in the schema. -} -``` - -_Required record code_: -```java -public class ReturnA { - public ReturnB getReturnB() { … } // Must have a method that returns something that can be mapped to 'ReturnB' in the schema. -} - -public class ReturnB { - public String getInterestingData() { … } // Must have a method that returns something that can be mapped to 'someData' in the schema. -} -``` - -### Custom table resolution with @tableMethod -The **@tableMethod** directive allows a field to use a jOOQ table returned from a custom Java method. - -For example, you can annotate a field in your schema with the **tableMethod** directive, referencing a method like [AddressTableMethod](https://github.com/sikt-no/graphitron/blob/main/graphitron-example/graphitron-example-service/src/main/java/no/sikt/graphitron/example/service/AddressTableMethod.java): -```graphql -type Query { - address: Address @tableMethod(tableMethodReference: {className: "some.path.AddressTableMethod", method: "addressTableMethod"}) -} -``` - -### Exception handling with @error -Graphitron allows for simple error handling. In the schema a type is an error type if it implements -the _Error_ interface and has the **@error** directive set. Unions of such types are also considered error types. - -The **error** directive serves to map specific Java exceptions to GraphQL errors. This directive is applied to error types -in the schema and accepts a list of handlers with parameters, specifying how various exceptions should be mapped. - -Here is an example of how the **error** directive can be used: - -```graphql -type MyError implements Error @error(handlers: -[ - { - handler: DATABASE, - sqlState: "23514", - matches: "year_check", - description: "Release year must be between 1901 and 2155" - }, - { - handler: DATABASE, - code: "20997", - description: "You are not allowed to do this like that" - }, - { - handler: GENERIC, - className: "org.example.YouAreNotAllowedException", - matches: "stop doing this", - description: "You are not allowed to do this like that" - } -]) { - path: [String!]! - message: String! -} -``` - -In this instance, certain exceptions are mapped to be handled as _MyError_. The parameters inside the handler object are explained as follows: -- `handler` - Determines the error handler to use. Presently, there are two options available, DATABASE and GENERIC. -- `className` - Specifies the fully qualified name of the exception class. This field is required for the GENERIC handler and defaults to `org.jooq.exception.DataAccessException` if not provided for the DATABASE handler. -- `code` - For the `DATABASE` handler, this is the vendor-specific database error code (`SQLException.getErrorCode()`). The meaning and usefulness of this value varies between databases. For example, Oracle uses specific error codes while PostgreSQL always returns `0`. Not in use for the GENERIC handler. -- `sqlState` - For the `DATABASE` handler, this is the standardized SQL state code (`SQLException.getSQLState()`). SQL state codes follow the SQL standard and are supported across databases, though the level of specificity varies. For example, PostgreSQL returns specific codes like `"23514"` (check constraint violation), while Oracle returns the generic `"23000"` for all constraint violations. Not in use for the GENERIC handler. -- `matches` - Can be used to specify a string that the exception message must contain in order to be handled. -- `description` - A description of the error to be returned to the user. If not provided, the exception message will be used instead. - -> **Note**: `code` and `sqlState` can be used together when you need to match on both. When both are specified, the exception must match on all provided criteria. Which parameter is most useful depends on your database, -> check your database's documentation for how it reports error codes and SQL states. - -### Custom field logic with @externalField -The **@externalField** directive indicates that the annotated field is -retrieved using a static extension method implemented in Java. -This is typically used when the field's value requires custom logic implemented in Java. - -Requirements: - -- Method has to include the table class it's extending as its single parameter - additional parameters is not supported. -- Method needs to return the generic type `Field` -- Parameter type of the generic type needs to match scalar type used in your field in the GraphQL schema, i.e: `Field<TYPE_MATCHING_SCALAR_TYPE>` -- Code reference should be added to `externalReferenceImports` in your `pom.xml`. See [code references](#code-references) for details on configuration. -- The `type` where **externalField** is used needs to have a table associated to it - -#### Example -Say you have a GraphQL schema like this, where you have defined a type with an associated database table, which returns a one field: - -```graphql -type Film @table(name: "FILM") { - isEnglish: Boolean @externalField -} -``` - -You want to write custom logic for the `isEnglish`-field and therefore add the **externalField**-directive. -The example below show such custom logic can be implemented: - -```java -public static Field<Boolean> isEnglish(Film film) { - return DSL.iif( - film.ORIGINAL_LANGUAGE_ID.eq(1), - inline(true), - inline(false) - ); -} -``` -The static extension method is required to have the table class it's extending as a parameter, which is `Film` in this example. -It also needs to return the generic type `Field`, with the actual type within matching the scalar type from the schema. -In this example you see that the scalar type in the schema is `Boolean`, which means that the generic type needs to look -like this `Field<Boolean>`. - -The file containing this method needs to be discoverable for Graphitron. -You need to provide the path for the file within the tag `externalReferenceImports` in your `pom.xml`: -```xml -<externalReferenceImports> - <package>some.path.MyClass</package> -</externalReferenceImports> -``` -Graphitron will then use this custom logic in the select part of the database query, as shown below: - -```java -public class QueryDBQueries { - public static Film queryForQuery(DSLContext ctx, SelectionSet select) { - var _film = FILM.as("film_2952383337"); - return ctx - .select(DSL.row(some.path.MyClass.isEnglish(_film)).mapping(Functions.nullOnAllNull(Film::new))) - .from(_film) - .fetchOne(it -> it.into(Film.class)); - } -} -``` - -Note that jOOQ records do not have space for extra fields, and any usage of external fields where such fields must be stored in a jOOQ record will fail. - -### Polymorphic queries (unions and interfaces) -Graphitron supports generating queries for interfaces and unions, allowing polymorphic return types. - -#### Single table interface -Single table interfaces are interfaces where every implementation is in the same table, and the type of the interface is determined by a discriminator column. -Graphitron supports generating queries for this type of interface on the Query-type. - -In order to define a single table interface and its types, the **discriminate** and **discriminator** directives are used, in addition to the [**table**](#link-types-to-database-tables-with-table) directive. - -For an interface to be considered a single table interface, both the **table** and **discriminate** directives must be set: -```graphql -interface Employee @table(name: "EMPLOYEE") @discriminate(on: "EMPLOYEE_TITLE") { - … -} -``` - -The **discriminate** directive determines the discriminator column for the interface. -In the example above, the column `EMPLOYEE_TITLE` in table `EMPLOYEE` is the discriminator column. - -Each implementation of the interface must have the **table** and **discriminator**-directives set: - -```graphql -type TechLead implements Employee @table(name: "EMPLOYEE") @discriminator(value: "TECH_LEAD") { - … -} -``` -The **table** directive parameter must be the same as for the interface, and the **discriminator** directive indicates which value the discriminator column has if the row is of type `TechLead`. -In other words, if `EMPLOYEE.EMPLOYEE_TITLE` is `"TECH_LEAD"`, the row is of type `TechLead`. - -With the example above, Graphitron can generate queries like these in the Query-type: - -```graphql -type Query { - employees: [Employee] - employees(first: Int = 100, after: String): EmployeeConnection -} -``` - -Queries with input and [query conditions](#custom-query-conditions-with-condition) are also supported. - -- Types implementing multiple single table interfaces are supported if they have the same discriminator value for all interfaces -- The discriminator column must return a string type -- Every reference field in the interface must have the same configuration in every implementing type -- Other reference fields sharing the same name must also have the same configuration across the implementing types - -#### Multitable interface -Multitable interfaces are interfaces where the implementations are spread across tables, and a row's type is determined by -its table. Graphitron supports generating queries for this type of interface on the Query-type. - -No special directives are required on the interface definition. Any directives on fields in the interface will be ignored, and should instead be placed on the fields in the implementing type. - -```graphql -interface Titled { - title: String -} -``` - -For every implementing type, the [**table**](#link-types-to-database-tables-with-table) directive is required. - -```graphql -type Film implements Titled @table(name: "FILM") { - title: String @field(name: …) - … -} - -type Book implements Titled @table(name: "BOOK") { - title: String - … -} -``` - -With the example above, Graphitron can generate queries like these in the Query-type: - -```graphql -type Query { - titled: [Titled] - titled(first: Int = 100, after: String): TitledConnection -} -``` - -#### Multitable union -Graphitron supports union queries on the Query type. All the union's subtypes need to have the [**table**](#link-types-to-database-tables-with-table) directive set. - -_Schema setup:_ -```graphql -union LanguageStaffUnion = Language | Staff - -type Language @table { - name: String - … -} - -type Staff @table { - id: Int @field(name: "STAFF_ID") - … -} - -``` -_Example:_ -```graphql -type Query { - languageOrStaff: [LanguageStaffUnion] -} -``` - -#### Query conditions for polymorphic multitable types - -[Conditions](#custom-query-conditions-with-condition) on queries returning multitable interfaces or unions are also supported. -Since the table is passed as a parameter to the condition method and each implementing type has a different table, -a unique method for each implementation is necessary. -These methods must all share the same method signature, except for the first table parameter. - -```graphql -type Query { - titled(prefix: String): [Titled] @condition(condition: {className: "some.path.TitledConditions", method: "titledMethod"}) -} -``` - -```java -class TitledConditions { - static Condition titledMethod(Film film, String prefix) {…} - static Condition titledMethod(Book book, String prefix) {…} -} -``` - -### Batch lookups with @lookupKey - -The **lookupKey** directive enables batch lookups: you send a list of values and get back a list of results -in the same order, where each position contains either the matching object or `null` if nothing was found. -This is useful when you need to fetch multiple objects by some identifying value in a single query. - -For example, given this schema: - -```graphql -type Query { - filmsByTitle(titles: [String] @lookupKey): [Film] @table(name: "film") -} -``` - -A client could query: - -```graphql -query { - filmsByTitle(titles: ["ACADEMY DINOSAUR", "NONEXISTENT FILM", "ACE GOLDFINGER"]) -} -``` - -And receive results preserving the input order, with `null` for unmatched keys: - -```json -{ - "filmsByTitle": [ - { "title": "ACADEMY DINOSAUR", "releaseYear": 2006 }, - null, - { "title": "ACE GOLDFINGER", "releaseYear": 2006 } - ] -} -``` - -If at least one argument is marked with **lookupKey**, the query automatically becomes a lookup. -The key values should uniquely identify rows — if multiple rows match the same key, only one is returned. -Only arguments for root-level fields or their referenced input types can be keys. - -#### Constraints - -* All keys must be one-dimensional listed types. It does not make sense to invoke this logic for fetching single objects. -* More than one key may be used at once, but each key must always have the same number of values. - In addition, each value in a key must be correlated with the values of any other keys at the same indexes. - This can be enforced by wrapping the keys in input types. - -The keys can be wrapped with input types and can be set on input type references, but they must always end up being a one-dimensional list. -In other words, a list of input types which itself contains a list of keys will not work, and the key values themselves can never be lists. - -You can use multiple keys together. Each key list must have the same length, and values at the same index are correlated: - -```graphql -type Query { - staffLookup(firstNames: [String] @lookupKey, lastNames: [String] @lookupKey): [Staff] -} -``` - -#### Valid and invalid patterns - -```graphql -type Query { - # @lookupKey on a scalar list argument. Other arguments are still used as usual. - query0(argument0: [String] @lookupKey, argument1: String): [SomeType] - - # @lookupKey on an input type applies to all its fields. - query1(argument: [In] @lookupKey): [SomeType] - - # @lookupKey can also be placed on individual fields in the input type. - query2(argument: [InKey]): [SomeType] - - # Multiple keys are supported. - query3(argument0: [String] @lookupKey, argument1: [Int] @lookupKey): [SomeType] - - # Nested input types are supported. Every leaf field becomes a key. - query4(argument: [InNested] @lookupKey): [SomeType] - - # Invalid: two layers of lists are not allowed. - badQuery(argument: [InList] @lookupKey): [SomeType] -} - -input In { - field0: String - field1: Int -} - -input InKey { - field: String @lookupKey -} - -input InList { - field: [String] -} - -input InNested { - field: In -} -``` - -### Sorting -If no ordering is specified, paginated queries default to sorting by primary key in ascending order. -You can control sorting behavior with the `@orderBy` and `@defaultOrder` directives. - -#### Sort results with @orderBy input -Incorporating the **orderBy** functionality in your GraphQL schema allow API users to sort query results based on specific fields. - -_Step 1: Define Order Input Types_ - -Define an input type for **orderBy**. This input type must include exactly one direction enum field (with `ASC`/`DESC` values) and -exactly one orderBy enum field (whose values have `@order` directives). The field names are flexible, Graphitron identifies each field by its type, not its name: - -```graphql -input FilmOrder { - direction: OrderDirection! - orderByField: FilmOrderByField! -} -``` - -The `OrderDirection` enum specifies the sort order: - -```graphql -enum OrderDirection { - ASC - DESC -} -``` - -_Step 2: Define Order By fields_ - -Next, define the `OrderByField` enum. This should include all the fields on which sorting should be allowed. -The **@order** directive specifies how each enum value maps to database sorting. There are three modes: - -**Index-based sorting** (backed by a database index): -```graphql -enum FilmOrderByField { - LANGUAGE @order(index: "IDX_FK_LANGUAGE_ID") - TITLE @order(index: "IDX_TITLE") -} -``` - -Note: A single OrderByField can involve more than one field in the database, e.g.: `STORE_ID_FILM_ID @order(index: "idx_store_id_film_id")` - -**Field-based sorting** (with optional collation, no index required): -```graphql -enum PersonOrderByField { - NAME_NORSK @order(fields: [ - {name: "LAST_NAME", collate: "xdanish_ai"}, - {name: "FIRST_NAME", collate: "xdanish_ai"} - ]) - STATUS @order(fields: [{name: "ACTIVE"}]) -} -``` - -**Primary key sorting** (uses the table's primary key): -```graphql -enum PersonOrderByField { - ID @order(primaryKey: true) -} -``` - -Exactly one of `index`, `fields`, or `primaryKey` must be set on each enum value. - -For index-based sorting, ensure index code generation is enabled in jOOQ's generator config: - -```xml -<database> - <includeIndexes>true</includeIndexes> - … -</database> -``` - -Graphitron will look for the indexes using their names as specified by the **@order** directive. -Exceptions will be thrown if no matching index is found for the corresponding database table. - -_Step 3: Add orderBy argument to Query_ - -Add the `orderBy` argument to your query. Use the **orderBy** directive to indicate that the input should be handled according to the _orderBy_-functionality: - -```graphql -type Query { - films(orderBy: FilmOrder @orderBy, first: Int = 100, after: String): FilmConnection -} -``` - -#### Default sorting with @defaultOrder -The **@defaultOrder** directive specifies the default sort order for a field when no `@orderBy` input is provided. -Exactly one of `index`, `fields`, or `primaryKey` must be set. - -**Parameters:** -* _index_ - Name of the database index to use for sorting -* _fields_ - Field(s) to sort by, with optional collation (see [FieldSort](#field-based-sorting)) -* _primaryKey_ - Use the table's primary key for sorting (default: `false`) -* _direction_ - Sort direction: `ASC` or `DESC` (default: `ASC`) - -If an `@orderBy` input is also present on the field and the user provides an orderBy value, the user's value takes precedence over the default. - -**Index-based:** -```graphql -type Query { - films(orderBy: FilmOrder @orderBy, first: Int = 100, after: String): FilmConnection @defaultOrder(index: "IDX_TITLE") -} -``` - -**Field-based (with optional collation):** -```graphql -type Query { - customers(first: Int = 100, after: String): CustomerConnection @defaultOrder(fields: [ - {name: "LAST_NAME", collate: "case_insensitive"}, - {name: "FIRST_NAME", collate: "case_insensitive"} - ]) -} -``` - -**Primary key:** -```graphql -type Query { - customers(first: Int = 100, after: String): CustomerConnection @defaultOrder(primaryKey: true, direction: DESC) -} -``` - -## Special interfaces -Currently, Graphitron reserves two interface names for special purposes, namely _Node_ and _Error_. - -### Node -The _Node_ interface must contain an ID field. Any type that implements this interface will have a -_Node_ data fetcher generated. -This is designed to be compatible with [Global Object Identification](https://graphql.org/learn/global-object-identification/). - -```graphql -interface Node { - id: ID! -} -``` - -### Error -An interface used to enforce certain fields that use the **service** directive. - -```graphql -interface Error { - path: [String!]! - message: String! -} -``` - -This may be removed/changed in the near future as it may not be flexible enough. - -## Global node identification -If your schema includes [Global Object Identification](https://graphql.org/learn/global-object-identification/), -you need to have an instance of a class extending [NodeIdStrategy](https://github.com/sikt-no/graphitron/tree/main/graphitron-common/src/main/java/no/sikt/graphql/NodeIdStrategy.java), -optionally overriding methods for custom ID encoding/decoding, and pass it to the wiring builder in order to resolve `node` queries on your server. - -```java -@Singleton -public class MyNodeIdStrategy extends NodeIdStrategy { - // Optionally override methods for custom ID encoding/decoding -} -``` - -Pass it to the runtime wiring: -```java -Graphitron.getRuntimeWiring(nodeIdStrategy); -``` - -### Mark a type as globally identifiable with @node -The **node** directive marks a type as globally identifiable by its ID, following your custom node ID strategy. To use this directive, the type must: - -- Have the [table](#link-types-to-database-tables-with-table) directive. -- Implement the [Node](#node) interface. - -The **node** directive supports two parameters for ID configuration: - -- _typeId_: Sets the type identifier which is embedded in the ID and used to determine the correct type given an ID. Defaults to the GraphQL type name. -- _keyColumns_: The ordered table columns to include in the ID. If omitted, Graphitron uses the table's primary key. - - Note: If the primary key changes, the generated ID will also change. Therefore, in order to ensure stable IDs, we recommend hard coding the primary key columns. - -Given this schema: -```graphql -type Customer implements Node @node @table { - id: ID! @nodeId -} -``` -Graphitron resolves the primary key columns at generation time and passes them to the _createId_ method in your node strategy: - -```java -nodeIdStrategy.createId("Customer", CUSTOMER.CUSTOMER_ID) -``` - -And with a custom configuration like this: -```graphql -type Customer implements Node @node(typeId: "C", keyColumns: ["CUSTOMER_ID", "EMAIL"]) @table { - id: ID! @nodeId -} -``` - -Graphitron will instead pass these arguments: - -```java -nodeIdStrategy.createId("C", CUSTOMER.CUSTOMER_ID, CUSTOMER.EMAIL) -``` - -### Mark an ID as globally unique with @nodeId -> **Note:** This directive is not currently supported when combined with [services](#custom-database-operations-with-service). - -The **nodeId** directive must be placed on all node ID fields to indicate that they represent globally unique IDs, according to your node ID strategy. - -The directive accepts one parameter: - -- `typeName` — The name of the node type the ID refers to. - - The type name is case-sensitive. - - The provided type must have the [**@node**](#mark-a-type-as-globally-identifiable-with-node) directive. - -#### Implicit typeName -The typeName parameter of the nodeId directive is optional. If omitted, Graphitron will try to deduce the node type like this: - - For object fields without the **reference** directive: uses the containing type (if it is a node type) - - For fields with the **reference** directive or jOOQ record input fields: uses the node type with the same table (if unambiguous) - -#### Referencing another type's ID -It is possible to reference another type's node ID by specifying the `typeName` parameter. -The _typeName_ implies a reference to another table, so this is often combined with the [reference](#define-table-join-paths-with-reference) directive. - -For example, if you have a `Customer` type that has a field referring to an `Address` ID: - -```graphql -type Customer implements Node @node @table { - id: ID! @nodeId - addressId: ID @nodeId(typeName: "Address") # Implicit reference to the 'ADDRESS' table -} - -type Address implements Node @node @table { - id: ID! @nodeId -} -``` - -## Graphitron integration tests -For internal testing purposes Graphitron uses predefined input schemas combined with expected file results. -When altering the generator, these files likely have to be adjusted as well. These test schemas can also be read as -further examples on how to use the various directives. - -Graphitron uses the [Sakila test database](https://www.jooq.org/sakila) to generate the jOOQ types needed for tests. -These are generated to `src/test/java` when running maven. These files are ignored by Git, and they are only generated -when they do not exist already or the property `testdata.schema.version` in _pom.xml_ is updated. In other words, -updating the property will refresh the jOOQ types. -This is typically only done when altering the database to add new tables or keys. diff --git a/graphitron-codegen-parent/graphitron-java-codegen/pom.xml b/graphitron-codegen-parent/graphitron-java-codegen/pom.xml deleted file mode 100644 index 381c073a1b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/pom.xml +++ /dev/null @@ -1,174 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> - -<project xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>no.sikt</groupId> - <artifactId>graphitron-codegen-parent</artifactId> - <version>${revision}${changelist}</version> - </parent> - <artifactId>graphitron-java-codegen</artifactId> - <name>${project.groupId}:${project.artifactId}</name> - <url>https://github.com/sikt-no/graphitron</url> - - <dependencies> - <dependency> - <groupId>${project.groupId}</groupId> - <artifactId>graphitron-common</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>${project.groupId}</groupId> - <artifactId>graphitron-javapoet</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>ch.qos.logback</groupId> - <artifactId>logback-classic</artifactId> - </dependency> - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-api</artifactId> - </dependency> - <dependency> - <groupId>jakarta.platform</groupId> - <artifactId>jakarta.jakartaee-api</artifactId> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>org.jooq</groupId> - <artifactId>jooq</artifactId> - </dependency> - <dependency> - <groupId>org.jooq</groupId> - <artifactId>jooq-codegen</artifactId> - </dependency> - - <dependency> - <groupId>${project.groupId}</groupId> - <artifactId>graphitron-error-handling-javax</artifactId> - <version>${project.version}</version> - <scope>provided</scope> - </dependency> - - <dependency> - <groupId>org.assertj</groupId> - <artifactId>assertj-core</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.junit.jupiter</groupId> - <artifactId>junit-jupiter-engine</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.junit.jupiter</groupId> - <artifactId>junit-jupiter-params</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.junit.vintage</groupId> - <artifactId>junit-vintage-engine</artifactId> - <scope>test</scope> - </dependency> - </dependencies> - - <build> - <plugins> - <plugin> - <groupId>org.jooq</groupId> - <artifactId>jooq-codegen-maven</artifactId> - <executions> - <execution> - <id>jooq-test-code-generator</id> - <phase>generate-test-sources</phase> - <goals> - <goal>generate</goal> - </goals> - - <configuration> - <skip>${jooq.codegen.skip}</skip> <!--To skip: -Djooq.codegen.skip=true--> - <jdbc> - <driver>org.testcontainers.jdbc.ContainerDatabaseDriver</driver> - <url>${db.url}</url> - <user>${db.username}</user> - <password>${db.password}</password> - </jdbc> - <generator> - <database> - <includes>public.*|pg_catalog\.(pg_user|pg_user_mapping|pg_depend)|utils\..*</includes> - <schemata> - <schema> - <inputSchema>public</inputSchema> - </schema> - <schema> - <inputSchema>pg_catalog</inputSchema> - </schema> - <schema> - <inputSchema>utils</inputSchema> - </schema> - </schemata> - <schemaVersionProvider>${testdata.schema.version}</schemaVersionProvider> - <includeIndexes>true</includeIndexes> - </database> - <target> - <packageName>no.sikt.graphitron.jooq.generated.testdata</packageName> - <directory>src/test/java</directory> - </target> - </generator> - </configuration> - </execution> - </executions> - <dependencies> - <dependency> - <groupId>org.postgresql</groupId> - <artifactId>postgresql</artifactId> - <version>${version.postgresql}</version> - </dependency> - <dependency> - <groupId>org.testcontainers</groupId> - <artifactId>testcontainers-postgresql</artifactId> - <version>${version.testcontainers.postgresql}</version> - </dependency> - <!-- Explicit core testcontainers dependency to override jOOQ parent's dependencyManagement which pins an older version --> - <dependency> - <groupId>org.testcontainers</groupId> - <artifactId>testcontainers</artifactId> - <version>${version.testcontainers.postgresql}</version> - </dependency> - </dependencies> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-dependency-plugin</artifactId> - <executions> - <execution> - <id>unpack-graphitron-directives-schema</id> - <phase>generate-sources</phase> - <goals> - <goal>unpack-dependencies</goal> - </goals> - <configuration> - <includeArtifactIds>graphitron-common</includeArtifactIds> - <outputDirectory>${graphitronDirectivesSchemaDirectory}</outputDirectory> - <includes>directives.graphqls</includes> - </configuration> - </execution> - </executions> - </plugin> - </plugins> - - </build> - <properties> - <jooq.codegen.skip>false</jooq.codegen.skip> - <db.url>jdbc:tc:postgresql:15:///sakila?TC_TMPFS=/testtmpfs:rw&TC_INITSCRIPT=file:${basedir}/src/test/resources/database/postgres-sakila-schema.sql</db.url> - <db.username>postgres</db.username> - <db.password>postgres</db.password> - <!-- Change this version number if the generated jooq classes needs to be regenerated --> - <testdata.schema.version>1.15</testdata.schema.version> - <graphitronDirectivesSchemaDirectory>${project.build.directory}/graphitron-common/schema</graphitronDirectivesSchemaDirectory> - </properties> -</project> diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/CodeGenerationThresholds.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/CodeGenerationThresholds.java deleted file mode 100644 index b8eb0c74b5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/CodeGenerationThresholds.java +++ /dev/null @@ -1,38 +0,0 @@ -package no.sikt.graphitron.configuration; - -public class CodeGenerationThresholds { - private Integer upperBoundLinesOfCode; - private Integer crashPointLinesOfCode; - private Integer upperBoundNestingDepth; - private Integer crashPointNestingDepth; - - public CodeGenerationThresholds() { - } - - public CodeGenerationThresholds( - Integer upperBoundLinesOfCode, - Integer crashPointLinesOfCode, - Integer upperBoundNestingDepth, - Integer crashPointNestingDepth) { - this.upperBoundLinesOfCode = upperBoundLinesOfCode; - this.crashPointLinesOfCode = crashPointLinesOfCode; - this.upperBoundNestingDepth = upperBoundNestingDepth; - this.crashPointNestingDepth = crashPointNestingDepth; - } - - public Integer getUpperBoundLinesOfCode() { - return upperBoundLinesOfCode; - } - - public Integer getUpperBoundNestingDepth() { - return upperBoundNestingDepth; - } - - public Integer getCrashPointLinesOfCode() { - return crashPointLinesOfCode; - } - - public Integer getCrashPointNestingDepth() { - return crashPointNestingDepth; - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/ErrorHandlerType.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/ErrorHandlerType.java deleted file mode 100644 index 55fa15a286..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/ErrorHandlerType.java +++ /dev/null @@ -1,12 +0,0 @@ -package no.sikt.graphitron.configuration; - -import static org.apache.commons.lang3.StringUtils.capitalize; - -public enum ErrorHandlerType { - DATABASE, - GENERIC; - - public String toCamelCaseString() { - return capitalize(this.toString().toLowerCase()); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/ExceptionToErrorMapping.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/ExceptionToErrorMapping.java deleted file mode 100644 index ff89d3f3d5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/ExceptionToErrorMapping.java +++ /dev/null @@ -1,69 +0,0 @@ -package no.sikt.graphitron.configuration; - -import org.jetbrains.annotations.Nullable; - -import java.util.Objects; -import java.util.Optional; - -public class ExceptionToErrorMapping { - - private final ErrorHandlerType handler; - private final String exceptionClassName; - private final String errorTypeName; - private final String databaseErrorCode; - private final String sqlState; - private final String exceptionMessageContains; - private final String errorDescription; - - public ExceptionToErrorMapping(ErrorHandlerType handler, String exceptionClassName, String errorTypeName, String databaseErrorCode, - @Nullable String sqlState, @Nullable String exceptionMessageContains, @Nullable String errorDescription) { - this.handler = handler; - this.exceptionClassName = exceptionClassName; - this.errorTypeName = errorTypeName; - this.databaseErrorCode = databaseErrorCode; - this.sqlState = sqlState; - this.exceptionMessageContains = exceptionMessageContains; - this.errorDescription = errorDescription; - } - - public String getExceptionClassName() { - return exceptionClassName; - } - - public String getErrorTypeName() { - return errorTypeName; - } - - public String getExceptionMessageContains() { - return exceptionMessageContains; - } - - public String getDatabaseErrorCode() { - return databaseErrorCode; - } - - public String getSqlState() { - return sqlState; - } - - public Optional<String> getErrorDescription() { - return Optional.ofNullable(errorDescription); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - ExceptionToErrorMapping that = (ExceptionToErrorMapping) o; - return Objects.equals(exceptionClassName, that.exceptionClassName) && Objects.equals(errorTypeName, that.errorTypeName) && Objects.equals(databaseErrorCode, that.databaseErrorCode) && Objects.equals(sqlState, that.sqlState) && Objects.equals(exceptionMessageContains, that.exceptionMessageContains) && Objects.equals(errorDescription, that.errorDescription); - } - - @Override - public int hashCode() { - return Objects.hash(exceptionClassName, errorTypeName, databaseErrorCode, sqlState, exceptionMessageContains, errorDescription); - } - - public ErrorHandlerType getHandler() { - return handler; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/GeneratorConfig.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/GeneratorConfig.java deleted file mode 100644 index 6d41ad04dc..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/GeneratorConfig.java +++ /dev/null @@ -1,390 +0,0 @@ -package no.sikt.graphitron.configuration; - -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.configuration.externalreferences.ExternalReferences; -import no.sikt.graphitron.configuration.externalreferences.GlobalTransform; -import no.sikt.graphitron.configuration.externalreferences.TransformScope; -import no.sikt.graphitron.generate.Generator; -import no.sikt.graphitron.generate.Introspector; -import no.sikt.graphitron.generate.Validator; - -import java.io.File; -import java.net.URL; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - -/** - * Static generator configuration. Mostly dependent on the settings set through the POM XML. - */ -public class GeneratorConfig { - private static final String - PLUGIN_OUTPUT_PATH = "graphitron", - TEMP_GRAPHQL_GENERATED_PACKAGE = "fake.graphql.example", // Once codegen is fully contained in this module, this will be redundant. - DEFAULT_API_SUFFIX = ".api", - DEFAULT_MODEL_SUFFIX = ".model"; - - private static final URL GENERATOR_DIRECTIVES_PATH = GeneratorConfig.class.getResource("schema/directives.graphqls"); - - private static Set<String> generatorSchemaFiles, userSchema; - - private static String - outputDirectory, - outputPackage, - generatedSchemaResolversPackage, - generatedSchemaModelsPackage, - generatedJooqPackage; - - private static boolean makeNodeStrategy = false; - private static boolean nodeExists = false; - private static boolean alwaysUsePrimaryKeyInSplitQueries = true; - private static boolean useJdbcBatchingForDeletes = true; - private static boolean useJdbcBatchingForInserts = true; - private static boolean requireTypeIdOnNode = false; - private static boolean validateOverlappingInputFields = true; - private static boolean generateUpsertAsStore = false; - private static boolean failOnMerge = false; - - private static int maxAllowedPageSize; - - private static ExternalReferences externalReferences; - private static Set<String> externalReferenceImports; - private static List<GlobalTransform> globalTransforms; - - private static RecordValidation recordValidation; - - private static CodeGenerationThresholds codeGenerationThresholds; - - private static OptionalSelect optionalSelect = new OptionalSelect(); - - /** - * Set the generator properties from code. Intended for tests. - */ - public static void setProperties( - Set<String> files, - String outputDir, - String outputPkg, - String jooqPkg, - List<ExternalReference> references, - Set<String> imports, - List<GlobalTransform> globalTransforms - ) { - generatorSchemaFiles = files; - userSchema = files; - outputDirectory = outputDir; - outputPackage = outputPkg; - - generatedSchemaResolversPackage = TEMP_GRAPHQL_GENERATED_PACKAGE + DEFAULT_API_SUFFIX; - generatedSchemaModelsPackage = TEMP_GRAPHQL_GENERATED_PACKAGE + DEFAULT_MODEL_SUFFIX; - generatedJooqPackage = jooqPkg; - maxAllowedPageSize = 1000; - - externalReferences = new ExternalReferences(references); - externalReferenceImports = imports; - - GeneratorConfig.globalTransforms = globalTransforms; - } - - /** - * Read all the configurations set in the XML from the provided MOJO. - */ - public static void loadProperties(Generator mojo) { - var files = mojo.getSchemaFiles(); - Set<String> inputFiles = Set.of(); - if (files != null) { - inputFiles = new HashSet<>(files); - if (GENERATOR_DIRECTIVES_PATH != null) { - inputFiles.add(GENERATOR_DIRECTIVES_PATH.getPath()); - } - } - - generatorSchemaFiles = inputFiles; - userSchema = mojo.getUserSchemaFiles(); - outputDirectory = mojo.getOutputPath() + "/" + PLUGIN_OUTPUT_PATH; - outputPackage = mojo.getOutputPackage(); - - generatedSchemaResolversPackage = mojo.getApiPackageName(); - generatedSchemaModelsPackage = mojo.getModelPackageName(); - generatedJooqPackage = mojo.getJooqGeneratedPackage(); - maxAllowedPageSize = mojo.getMaxAllowedPageSize(); - - externalReferences = new ExternalReferences(mojo.getExternalReferences()); - externalReferenceImports = mojo.getExternalReferenceImports(); - - globalTransforms = mojo.getGlobalTransforms(); - recordValidation = mojo.getRecordValidation(); - makeNodeStrategy = mojo.makeNodeStrategy(); - useJdbcBatchingForDeletes = mojo.useJdbcBatchingForDeletes(); - useJdbcBatchingForInserts = mojo.useJdbcBatchingForInserts(); - alwaysUsePrimaryKeyInSplitQueries = true; - codeGenerationThresholds = mojo.getCodeGenerationThresholds(); - requireTypeIdOnNode = mojo.requireTypeIdOnNode(); - optionalSelect = mojo.getOptionalSelect(); - validateOverlappingInputFields = mojo.validateOverlappingInputFields(); - generateUpsertAsStore = mojo.generateUpsertAsStore(); - failOnMerge = mojo.failOnMerge(); - } - - /** - * Load minimal properties needed for validation only. - * This is a subset of {@link #loadProperties(Generator)} for the validate goal. - */ - public static void loadValidatorProperties(Validator validator) { - var files = validator.getSchemaFiles(); - Set<String> inputFiles = Set.of(); - if (files != null) { - inputFiles = new HashSet<>(files); - if (GENERATOR_DIRECTIVES_PATH != null) { - inputFiles.add(GENERATOR_DIRECTIVES_PATH.getPath()); - } - } - - generatorSchemaFiles = inputFiles; - userSchema = files; - generatedJooqPackage = validator.getJooqGeneratedPackage(); - makeNodeStrategy = validator.makeNodeStrategy(); - requireTypeIdOnNode = validator.requireTypeIdOnNode(); - - externalReferences = new ExternalReferences(validator.getExternalReferences()); - externalReferenceImports = validator.getExternalReferenceImports(); - - // Set defaults for unused fields to prevent NPEs - // Note: These packages are needed by ProcessedSchema during construction, - // even though code generation won't actually use them. - outputDirectory = null; - outputPackage = "validation.unused"; - generatedSchemaResolversPackage = "validation.unused.api"; - generatedSchemaModelsPackage = "validation.unused.model"; - maxAllowedPageSize = 1000; - globalTransforms = List.of(); - recordValidation = new RecordValidation(); - codeGenerationThresholds = new CodeGenerationThresholds(); - } - - /** - * Load configuration from an Introspector instance. - * Only sets jOOQ package configuration needed for introspection. - */ - public static void loadIntrospectorProperties(Introspector introspector) { - generatedJooqPackage = introspector.getJooqGeneratedPackage(); - - // Set placeholder values for unused configuration - outputDirectory = ""; - outputPackage = ""; - generatorSchemaFiles = Set.of(); - userSchema = Set.of(); - externalReferences = new ExternalReferences(introspector.getExternalReferences()); - externalReferenceImports = introspector.getExternalReferenceImports(); - globalTransforms = List.of(); - recordValidation = null; - maxAllowedPageSize = 1000; - makeNodeStrategy = false; - useJdbcBatchingForDeletes = true; - useJdbcBatchingForInserts = true; - codeGenerationThresholds = null; - requireTypeIdOnNode = false; - validateOverlappingInputFields = false; - } - - /** - * Clear all configurations. Intended for tests. - */ - public static void clear() { - generatorSchemaFiles = null; - userSchema = null; - outputDirectory = null; - outputPackage = null; - generatedSchemaResolversPackage = null; - generatedSchemaModelsPackage = null; - generatedJooqPackage = null; - externalReferences = new ExternalReferences(List.of()); - externalReferenceImports = Set.of(); - globalTransforms = List.of(); - recordValidation = new RecordValidation(); - codeGenerationThresholds = new CodeGenerationThresholds(); - generateUpsertAsStore = false; - } - - public static Set<String> generatorSchemaFiles() { - return generatorSchemaFiles; - } - - public static Set<String> schemaFiles() { - return userSchema; - } - - public static String outputDirectory() { - return outputDirectory; - } - - public static String outputPackage() { - return outputPackage; - } - - public static String generatedResolversPackage() { - return generatedSchemaResolversPackage; - } - - public static String generatedModelsPackage() { - return generatedSchemaModelsPackage; - } - - public static String getGeneratedJooqPackage() { - return generatedJooqPackage; - } - - public static ExternalReferences getExternalReferences() { - return externalReferences; - } - - public static Set<String> getExternalReferenceImports() { - return externalReferenceImports; - } - - public static List<GlobalTransform> getGlobalTransforms(TransformScope scope) { - return globalTransforms - .stream() - .filter(it -> it.getScope().equals(scope)) - .collect(Collectors.toList()); - } - - public static RecordValidation getRecordValidation() { - return recordValidation; - } - - public static boolean recordValidationEnabled() { - return recordValidation != null && recordValidation.isEnabled(); - } - - public static boolean shouldMakeNodeStrategy() { - return makeNodeStrategy && nodeExists; - } - - public static void setNodeStrategy(boolean shouldUseNodeStrategy) { - makeNodeStrategy = shouldUseNodeStrategy; - } - - public static void setNodeExists(boolean exists) { - nodeExists = exists; - } - - public static boolean alwaysUsePrimaryKeyInSplitQueries() { - return alwaysUsePrimaryKeyInSplitQueries; - } - - public static void setAlwaysUsePrimaryKeyInSplitQueries(boolean usePrimaryKey) { - alwaysUsePrimaryKeyInSplitQueries = usePrimaryKey; - } - - public static boolean useJdbcBatchingForDeletes() { - return useJdbcBatchingForDeletes; - } - - public static void setUseJdbcBatchingForDeletes(boolean useJdbcBatching) { - useJdbcBatchingForDeletes = useJdbcBatching; - } - - public static void setUseJdbcBatchingForAllMutations(boolean useJdbcBatching) { - setUseJdbcBatchingForDeletes(useJdbcBatching); - setUseJdbcBatchingForInserts(useJdbcBatching); - } - - public static boolean useJdbcBatchingForInserts() { - return useJdbcBatchingForInserts; - } - - public static void setUseJdbcBatchingForInserts(boolean useJdbcBatching) { - useJdbcBatchingForInserts = useJdbcBatching; - } - - public static void setRecordValidation(RecordValidation recordValidation) { - GeneratorConfig.recordValidation = recordValidation; - } - - public static void setGeneratorSchemaFiles(String... files) { - generatorSchemaFiles = Arrays.stream(files).filter(it -> new File(it).exists()).collect(Collectors.toSet()); - } - - public static void setGeneratorSchemaFiles(Set<String> files) { - generatorSchemaFiles = files; - } - - public static void setUserSchemaFiles(Set<String> files) { - userSchema = files; - } - - public static void setOutputDirectory(String path) { - outputDirectory = path + "/" + PLUGIN_OUTPUT_PATH; - } - - public static int getMaxAllowedPageSize() { - return maxAllowedPageSize; - } - - public static CodeGenerationThresholds getCodeGenerationThresholds() { - return codeGenerationThresholds; - } - - public static void setCodeGenerationThresholds(CodeGenerationThresholds thresholds) { - codeGenerationThresholds = thresholds; - } - - public static boolean requireTypeIdOnNode() { - return requireTypeIdOnNode; - } - - public static void setRequireTypeIdOnNode(boolean require) { - requireTypeIdOnNode = require; - } - - public static boolean validateOverlappingInputFields() { - return validateOverlappingInputFields; - } - - public static void setValidateOverlappingInputFields(boolean validate) { - validateOverlappingInputFields = validate; - } - - public static boolean failOnMerge() { - return failOnMerge; - } - - public static void setFailOnMerge(boolean fail) { - failOnMerge = fail; - } - - public static boolean generateUpsertAsStore() { - return generateUpsertAsStore; - } - - public static void setGenerateUpsertAsStore(boolean enable) { - generateUpsertAsStore = enable; - } - - public static void setUseOptionalSelects(boolean enable) { - optionalSelect.setOnExternalFields(enable); - optionalSelect.setOnSubqueryReferences(enable); - } - - public static void setOptionalSelectOnExternalFields(boolean enable) { - optionalSelect.setOnExternalFields(enable); - } - - public static void setOptionalSelectOnSubqueries(boolean enable) { - optionalSelect.setOnSubqueryReferences(enable); - } - - public static boolean optionalSelectIsEnabled() { - return optionalSelect.onSubqueryReferences() || optionalSelect.onExternalFields(); - } - - public static boolean optionalSelectOnExternalFieldsIsEnabled() { - return optionalSelect.onExternalFields(); - } - - public static boolean optionalSelectOnSubqueriesIsEnabled() { - return optionalSelect.onSubqueryReferences(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/OptionalSelect.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/OptionalSelect.java deleted file mode 100644 index 638a53a0f4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/OptionalSelect.java +++ /dev/null @@ -1,25 +0,0 @@ -package no.sikt.graphitron.configuration; - -public class OptionalSelect { - private boolean onExternalFields = false; - private boolean onSubqueryReferences = false; - - public OptionalSelect() { - } - - public boolean onExternalFields() { - return onExternalFields; - } - - public boolean onSubqueryReferences() { - return onSubqueryReferences; - } - - public void setOnExternalFields(boolean onExternalFields) { - this.onExternalFields = onExternalFields; - } - - public void setOnSubqueryReferences(boolean onSubqueryReferences) { - this.onSubqueryReferences = onSubqueryReferences; - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/RecordValidation.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/RecordValidation.java deleted file mode 100644 index a167cfcaf3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/RecordValidation.java +++ /dev/null @@ -1,52 +0,0 @@ -package no.sikt.graphitron.configuration; - -import org.jetbrains.annotations.Nullable; - -import java.util.Optional; - -/** - * Configure generation of JOOQ record validation for generated mutations according to the Jakarta Bean Validation - * specification. This class allows for toggling validation and specifying the associated GraphQL schema error type. - */ -public class RecordValidation { - - /** - * Flag indicating if Graphitron should generate code for validation of JOOQ records. - */ - private boolean enabled; - - /** - * Name of the schema error to be returned in case of validation violations and IllegalArgumentExceptions. - * If null while 'enabled' is true all validation violations and IllegalArgumentExceptions will cause 'AbortExecutionExceptions' to be thrown, - * leading to top-level GraphQL errors. If the given error is not present in the schema as a returnable error for - * a specific mutation, validation violations and IllegalArgumentExceptions on this mutation will instead also cause top-level GraphQL errors. - */ - private String schemaErrorType; - - public RecordValidation() {} - - public RecordValidation(boolean enabled, @Nullable String schemaErrorType) { - this.enabled = enabled; - this.schemaErrorType = schemaErrorType; - } - - /** - * Checks if the record validation is currently enabled. - * - * @return A boolean indicating whether record validation is enabled. - */ - public boolean isEnabled() { - return enabled; - } - - /** - * Retrieves the schema error type. - * - * @return An Optional containing the schema error type if present and validation is enabled, otherwise returns an empty Optional. - */ - public Optional<String> getSchemaErrorType() { - return enabled - ? Optional.ofNullable(schemaErrorType) - : Optional.empty(); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/Recursion.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/Recursion.java deleted file mode 100644 index 01fee29d0b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/Recursion.java +++ /dev/null @@ -1,12 +0,0 @@ -package no.sikt.graphitron.configuration; - -public class Recursion { - /** - * Helper method for enforcing a recursion limit. - */ - public static void recursionCheck(int recursion) { - if (recursion == Integer.MAX_VALUE - 1) { - throw new RuntimeException("Recursion depth has reached the integer max value."); - } - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/externalreferences/CodeReference.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/externalreferences/CodeReference.java deleted file mode 100644 index 2fede5e6b9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/externalreferences/CodeReference.java +++ /dev/null @@ -1,69 +0,0 @@ -package no.sikt.graphitron.configuration.externalreferences; - -import graphql.language.DirectivesContainer; -import graphql.language.ObjectField; -import no.sikt.graphql.directives.DirectiveHelpers; -import no.sikt.graphql.directives.GenerationDirective; -import no.sikt.graphql.directives.GenerationDirectiveParam; - -import java.util.List; - -import static no.sikt.graphql.directives.DirectiveHelpers.getDirectiveArgumentObjectFields; -import static no.sikt.graphql.directives.DirectiveHelpers.getOptionalObjectFieldByName; -import static no.sikt.graphql.directives.GenerationDirectiveParam.*; - -/** - * Simple representation of a code reference input type. - */ -public class CodeReference { - private final String schemaClassReference, className, methodName; - - public CodeReference(DirectivesContainer<?> field, GenerationDirective fromDirective, GenerationDirectiveParam fromParam) { - this(field, fromDirective, fromParam, ""); - } - - public CodeReference(DirectivesContainer<?> field, GenerationDirective fromDirective, GenerationDirectiveParam fromParam, String defaultMethodName) { - this(getDirectiveArgumentObjectFields(field, fromDirective, fromParam), defaultMethodName); - } - - public CodeReference(List<ObjectField> objectFields, String defaultMethodName) { - this.schemaClassReference = getOptionalObjectFieldByName(objectFields, NAME).map(DirectiveHelpers::stringValueOf).orElse(null); - this.className = getOptionalObjectFieldByName(objectFields, CLASS_NAME).map(DirectiveHelpers::stringValueOf).orElse(null); - this.methodName = getOptionalObjectFieldByName(objectFields, METHOD).map(DirectiveHelpers::stringValueOf).orElse(defaultMethodName); - - if (this.className == null && this.schemaClassReference == null) { - throw new IllegalArgumentException("Can't find " + CLASS_NAME.getName() + " or " + NAME.getName() + " in directive arguments."); - } - } - - public String getSchemaClassReference() { - return schemaClassReference; - } - - public String getClassName() { - return className; - } - public String getMethodName() { - return methodName; - } - - public boolean hasSchemaClassReference() { - return schemaClassReference != null; - } - - public boolean hasClassName() { - return className != null; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) return true; - if (obj instanceof CodeReference codeRef) { - return codeRef.getMethodName().equals(this.getMethodName()) - && (codeRef.hasClassName() == this.hasClassName() && (!this.hasClassName() || codeRef.getClassName().equals(this.getClassName()))) - && (codeRef.hasSchemaClassReference() == this.hasSchemaClassReference() && (!this.hasSchemaClassReference() || codeRef.getSchemaClassReference().equals(this.getSchemaClassReference()))); - } else { - return false; - } - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/externalreferences/ExternalClassReference.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/externalreferences/ExternalClassReference.java deleted file mode 100644 index 337f55a22f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/externalreferences/ExternalClassReference.java +++ /dev/null @@ -1,3 +0,0 @@ -package no.sikt.graphitron.configuration.externalreferences; - -public record ExternalClassReference(String name, Class<?> classReference) implements ExternalReference { } diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/externalreferences/ExternalMojoClassReference.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/externalreferences/ExternalMojoClassReference.java deleted file mode 100644 index 864e995e83..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/externalreferences/ExternalMojoClassReference.java +++ /dev/null @@ -1,27 +0,0 @@ -package no.sikt.graphitron.configuration.externalreferences; - -public class ExternalMojoClassReference implements ExternalReference { - private String name; - private String fullyQualifiedClassName; - - public ExternalMojoClassReference() {} - - public ExternalMojoClassReference(String name, String fullyQualifiedClassName) { - this.name = name; - this.fullyQualifiedClassName = fullyQualifiedClassName; - } - - @Override - public String name() { - return name; - } - - @Override - public Class<?> classReference() { - try { - return Class.forName(fullyQualifiedClassName); - } catch (ClassNotFoundException e) { - throw new IllegalArgumentException("Could not find external class. ", e); - } - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/externalreferences/ExternalReference.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/externalreferences/ExternalReference.java deleted file mode 100644 index 0a5b6205ab..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/externalreferences/ExternalReference.java +++ /dev/null @@ -1,6 +0,0 @@ -package no.sikt.graphitron.configuration.externalreferences; - -public interface ExternalReference { - String name(); - Class<?> classReference(); -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/externalreferences/ExternalReferences.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/externalreferences/ExternalReferences.java deleted file mode 100644 index 9fa8a8499b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/externalreferences/ExternalReferences.java +++ /dev/null @@ -1,94 +0,0 @@ -package no.sikt.graphitron.configuration.externalreferences; - -import no.sikt.graphitron.configuration.GeneratorConfig; - -import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.stream.Collectors; - -public class ExternalReferences { - private final Map<String, Class<?>> classes; - - public ExternalReferences(List<? extends ExternalReference> references) { - if (references != null) { - classes = references - .stream() - .collect(Collectors.toMap(ExternalReference::name, ExternalReference::classReference)); - } else { - classes = Map.of(); - } - } - - public boolean contains(CodeReference reference) { - try { - return getClassFrom(reference) != null; - } catch (IllegalArgumentException e) { - return false; - } - } - - /** - * @return The methods this reference points to. - */ - public List<Method> getMethodsFrom(CodeReference reference) { - if (reference == null) { - return List.of(); - } - - var referenceClass = getClassFrom(reference); - if (referenceClass == null) { - return List.of(); - } - - return Arrays - .stream(referenceClass.getMethods()) - .filter(it -> it.getName().equalsIgnoreCase(reference.getMethodName())) - .collect(Collectors.toList()); - } - - public Class<?> getClassFrom(CodeReference reference) { - if (reference == null) { - return null; - } - - var className = reference.getClassName(); - if (className != null) { - var cls = resolve(className); - if (cls != null) { - return cls; - } - - var resolved = GeneratorConfig.getExternalReferenceImports().stream() - .map(pkg -> pkg + "." + className) - .map(this::resolve) - .filter(Objects::nonNull) - .toList(); - - if (resolved.isEmpty()) { - throw new IllegalArgumentException( - "Could not find external class " + className + " in externalReferenceImports."); - } - - if (resolved.size() > 1) { - throw new IllegalArgumentException( - className + " resolves to more than one class: " + resolved.stream().map(Class::getName).collect(Collectors.joining(", "))); - } - - return resolved.get(0); - } - - var name = reference.getSchemaClassReference(); - return classes.get(name); - } - - private Class<?> resolve(String className) { - try { - return Class.forName(className); - } catch (ClassNotFoundException e) { - return null; - } - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/externalreferences/GlobalTransform.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/externalreferences/GlobalTransform.java deleted file mode 100644 index bb3dca5ff4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/externalreferences/GlobalTransform.java +++ /dev/null @@ -1,29 +0,0 @@ -package no.sikt.graphitron.configuration.externalreferences; - -/** - * A transform that is applied to all records, or on all records in a subset of generated mutations. - */ -public class GlobalTransform { - private TransformScope scope; - private String fullyQualifiedClassName, method; - - public GlobalTransform() {} - - public GlobalTransform(String fullyQualifiedClassName, String method, TransformScope scope) { - this.scope = scope; - this.fullyQualifiedClassName = fullyQualifiedClassName; - this.method = method; - } - - public TransformScope getScope() { - return scope; - } - - public String getFullyQualifiedClassName() { - return fullyQualifiedClassName; - } - - public String getMethod() { - return method; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/externalreferences/TransformScope.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/externalreferences/TransformScope.java deleted file mode 100644 index 4a42fa2d41..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/configuration/externalreferences/TransformScope.java +++ /dev/null @@ -1,8 +0,0 @@ -package no.sikt.graphitron.configuration.externalreferences; - -/** - * The scope at which a global transform should be applied. - */ -public enum TransformScope { - ALL_MUTATIONS, WITH_SERVICE, FULLY_GENERATED -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/AbstractField.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/AbstractField.java deleted file mode 100644 index f7422699bb..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/AbstractField.java +++ /dev/null @@ -1,157 +0,0 @@ -package no.sikt.graphitron.definitions.fields; - -import graphql.language.DirectivesContainer; -import graphql.language.NamedNode; -import no.sikt.graphitron.definitions.fields.containedtypes.FieldType; -import no.sikt.graphitron.definitions.interfaces.FieldSpecification; -import no.sikt.graphitron.definitions.mapping.MethodMapping; -import no.sikt.graphitron.javapoet.TypeName; - -import static no.sikt.graphql.directives.DirectiveHelpers.getDirectiveArgumentString; -import static no.sikt.graphql.directives.DirectiveHelpers.getOptionalDirectiveArgumentString; -import static no.sikt.graphql.directives.GenerationDirective.FIELD; -import static no.sikt.graphql.directives.GenerationDirectiveParam.JAVA_NAME; -import static no.sikt.graphql.directives.GenerationDirectiveParam.NAME; -import static no.sikt.graphql.naming.GraphQLReservedName.SCHEMA_MUTATION; -import static no.sikt.graphql.naming.GraphQLReservedName.SCHEMA_QUERY; - -/** - * This class represents the general functionality associated with GraphQLs object fields. - */ -public abstract class AbstractField<T extends NamedNode<T> & DirectivesContainer<T>> implements FieldSpecification { - private final FieldType fieldType; - private final String name, javaName, upperCaseName, unprocessedFieldOverrideInput, containerType; - private final MethodMapping mappingFromSchemaName, mappingFromFieldOverride; - private final boolean hasSetFieldOverride; - - public AbstractField(T field, String container) { - this(field ,null, container); - } - - public AbstractField(T field, FieldType fieldType, String container) { - name = field.getName(); - containerType = container; - hasSetFieldOverride = field.hasDirective(FIELD.getName()); - if (hasSetFieldOverride) { - var columnValue = getDirectiveArgumentString(field, FIELD, NAME); - unprocessedFieldOverrideInput = columnValue; - upperCaseName = columnValue.toUpperCase(); - var javaColumnValue = getOptionalDirectiveArgumentString(field, FIELD, JAVA_NAME); - javaName = javaColumnValue.orElse(""); - } else { - unprocessedFieldOverrideInput = name; - upperCaseName = name.toUpperCase(); - javaName = ""; - } - - this.fieldType = fieldType; - mappingFromSchemaName = new MethodMapping(name); - mappingFromFieldOverride = new MethodMapping(unprocessedFieldOverrideInput); - } - - @Override - public boolean hasSetFieldOverride() { - return hasSetFieldOverride; - } - - @Override - public String getTypeName() { - return fieldType.getName(); - } - - @Override - public String getContainerTypeName() { - return containerType; - } - - /** - * @return Is this field an ID? - */ - @Override - public boolean isID() { - return fieldType.isID(); - } - - @Override - public boolean isIterableWrapped() { - return fieldType.isIterableWrapped(); - } - - /** - * Is this field nullable? - * In case of an iterable wrapped field, is the list nullable? E.g. [String!] will return true, and [String]! will return false. - */ - @Override - public boolean isNullable() { - return fieldType.isIterableWrapped() ? fieldType.isIterableNullable() : fieldType.isNullable(); - } - - /** - * Is this field nullable? - * In case of an iterable wrapped field, is the list nullable? E.g. [String!] will return false, and [String]! will return true. - */ - @Override - public boolean isNonNullable() { - return fieldType.isIterableWrapped() ? !fieldType.isIterableNullable() : !fieldType.isNullable(); - } - - /** - * Is this an iterable wrapped field with a nullable element? - * Will return true: [String] and [String]! - * Will return false: [String!], [String!]! and String - */ - @Override - public boolean isIterableWrappedWithNullableElement() { - return fieldType.isIterableWrapped() && fieldType.isNullable(); - } - - @Override - public TypeName getTypeClass() { - return fieldType.getTypeClass(); - } - - @Override - public String getName() { - return name; - } - - public String getJavaName() { - return javaName; - } - - @Override - public String getUpperCaseName() { - return upperCaseName; - } - - public String getUnprocessedFieldOverrideInput() { - return unprocessedFieldOverrideInput; - } - - @Override - public MethodMapping getMappingFromSchemaName() { - return mappingFromSchemaName; - } - - @Override - public MethodMapping getMappingFromFieldOverride() { - return mappingFromFieldOverride; - } - - @Override - public boolean isRootField() { - return containerType.equals(SCHEMA_QUERY.getName()) || containerType.equals(SCHEMA_MUTATION.getName()); - } - - public String formatGraphQLSchemaType() { - var typeName = getTypeName(); - - if (!fieldType.isNullable()) typeName += "!"; - - if (isIterableWrapped()) { - typeName = "[" + typeName + "]"; - if (!fieldType.isIterableNullable()) typeName += "!"; - } - return typeName; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/ArgumentField.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/ArgumentField.java deleted file mode 100644 index 9344051928..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/ArgumentField.java +++ /dev/null @@ -1,20 +0,0 @@ -package no.sikt.graphitron.definitions.fields; - -import graphql.language.InputValueDefinition; - -/** - * An argument for a {@link ObjectField}. - */ -public class ArgumentField extends InputField { - private final String targetFieldName; - - public ArgumentField(InputValueDefinition field, String container, String targetFieldName) { - super(field, container); - this.targetFieldName = targetFieldName; - } - - @Override - public String formatPath() { - return String.format("'%s' on '%s.%s'", getName(), getContainerTypeName(), targetFieldName); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/DefaultOrder.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/DefaultOrder.java deleted file mode 100644 index ba9d07b36f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/DefaultOrder.java +++ /dev/null @@ -1,45 +0,0 @@ -package no.sikt.graphitron.definitions.fields; - -import graphql.language.FieldDefinition; -import no.sikt.graphitron.validation.ValidationHandler; - -import java.util.List; - -import static no.sikt.graphql.directives.DirectiveHelpers.*; -import static no.sikt.graphql.directives.GenerationDirective.DEFAULT_ORDER; -import static no.sikt.graphql.directives.GenerationDirectiveParam.*; - -/** - * Represents a parsed @defaultOrder directive with one of three modes: index, fields, or primaryKey. - */ -public record DefaultOrder(String index, List<FieldSortSpec> fields, boolean primaryKey, String direction) { - - public DefaultOrder { - var modeCount = (index != null ? 1 : 0) - + (fields != null && !fields.isEmpty() ? 1 : 0) - + (primaryKey ? 1 : 0); - ValidationHandler.isTrue(modeCount == 1, - "@%s must have exactly one of %s, %s, or %s set, but %d were set.", - DEFAULT_ORDER.getName(), INDEX.getName(), FIELDS.getName(), PRIMARY_KEY.getName(), modeCount); - } - - public static DefaultOrder from(FieldDefinition field) { - var indexArg = getOptionalDirectiveArgumentString(field, DEFAULT_ORDER, INDEX); - var fieldsArg = getOptionalDirectiveArgumentObjectValueList(field, DEFAULT_ORDER, FIELDS); - var hasPrimaryKey = getOptionalDirectiveArgumentBoolean(field, DEFAULT_ORDER, PRIMARY_KEY).orElse(false); - - var fieldSpecs = fieldsArg.isPresent() && !fieldsArg.get().isEmpty() - ? fieldsArg.get().stream().map(FieldSortSpec::from).toList() - : null; - var direction = getOptionalDirectiveArgumentEnum(field, DEFAULT_ORDER, DIRECTION).orElse("ASC"); - return new DefaultOrder(indexArg.orElse(null), fieldSpecs, hasPrimaryKey, direction); - } - - public boolean isIndex() { - return index != null; - } - - public boolean isFields() { - return fields != null && !fields.isEmpty(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/EnumField.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/EnumField.java deleted file mode 100644 index 8c44d7c1f8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/EnumField.java +++ /dev/null @@ -1,29 +0,0 @@ -package no.sikt.graphitron.definitions.fields; - -import graphql.language.EnumTypeDefinition; -import graphql.language.EnumValueDefinition; -import no.sikt.graphitron.definitions.objects.EnumDefinition; - -import java.util.List; -import java.util.stream.Collectors; - -/** - * An enum value within an {@link EnumDefinition}. - */ -public class EnumField extends AbstractField<EnumValueDefinition> { - public EnumField(EnumValueDefinition field, String container) { - super(field, container); - } - - /** - * @return List of instances based on an instance of {@link EnumTypeDefinition}. - */ - public static List<EnumField> from(EnumTypeDefinition e, String container) { - return e.getEnumValueDefinitions().stream().map(it -> new EnumField(it, container)).collect(Collectors.toList()); - } - - @Override - public boolean hasNodeID() { - return false; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/FieldSortSpec.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/FieldSortSpec.java deleted file mode 100644 index b5c64cc900..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/FieldSortSpec.java +++ /dev/null @@ -1,24 +0,0 @@ -package no.sikt.graphitron.definitions.fields; - -import graphql.language.ObjectValue; -import no.sikt.graphql.directives.DirectiveHelpers; - -import static no.sikt.graphql.directives.DirectiveHelpers.*; -import static no.sikt.graphql.directives.GenerationDirectiveParam.COLLATE; -import static no.sikt.graphql.directives.GenerationDirectiveParam.NAME; - -/** - * Represents a field sort specification parsed from the @order or @defaultOrder directives. - * @param name Database field name. - * @param collation Optional collation string. - */ -public record FieldSortSpec(String name, String collation) { - - public static FieldSortSpec from(ObjectValue obj) { - var fields = obj.getObjectFields(); - var name = stringValueOf(getObjectFieldByName(fields, NAME)); - var collation = getOptionalObjectFieldByName(fields, COLLATE) - .map(DirectiveHelpers::stringValueOf).orElse(null); - return new FieldSortSpec(name, collation); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/GenerationSourceField.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/GenerationSourceField.java deleted file mode 100644 index c10c1c536c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/GenerationSourceField.java +++ /dev/null @@ -1,335 +0,0 @@ -package no.sikt.graphitron.definitions.fields; - -import graphql.language.*; -import graphql.language.ObjectField; -import no.sikt.graphitron.configuration.externalreferences.CodeReference; -import no.sikt.graphitron.definitions.fields.containedtypes.FieldReference; -import no.sikt.graphitron.definitions.fields.containedtypes.FieldType; -import no.sikt.graphitron.definitions.fields.containedtypes.MutationType; -import no.sikt.graphitron.definitions.helpers.ProcedureCall; -import no.sikt.graphitron.definitions.helpers.ServiceWrapper; -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.definitions.mapping.JOOQMapping; -import no.sikt.graphitron.definitions.mapping.MethodMapping; -import no.sikt.graphitron.definitions.sql.SQLCondition; -import no.sikt.graphitron.javapoet.TypeName; -import no.sikt.graphql.directives.DirectiveHelpers; -import no.sikt.graphql.directives.GenerationDirective; -import no.sikt.graphql.directives.GenerationDirectiveParam; - -import java.util.*; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static no.sikt.graphitron.generators.codebuilding.NameFormat.toCamelCase; -import static no.sikt.graphql.directives.DirectiveHelpers.getOptionalDirectiveArgumentString; -import static no.sikt.graphql.directives.DirectiveHelpers.getOptionalObjectFieldByName; -import static no.sikt.graphql.directives.GenerationDirective.*; -import static no.sikt.graphql.directives.GenerationDirective.SERVICE; -import static no.sikt.graphql.directives.GenerationDirectiveParam.*; -import static no.sikt.graphql.naming.GraphQLReservedName.SCHEMA_MUTATION; -import static no.sikt.graphql.naming.GraphQLReservedName.SCHEMA_QUERY; - -/** - * This class represents the general functionality associated with GraphQLs fields that can initialise code generation. - */ -public abstract class GenerationSourceField<T extends NamedNode<T> & DirectivesContainer<T>> extends AbstractField<T> implements GenerationField { - private final boolean isGenerated, createsDataFetchers, createsDataFetcher, isExternalField, - hasFieldDirective, hasNodeID, hasTableMethod, hasService; - private boolean implicitSplitQuery; - private final ArrayList<FieldReference> fieldReferences; - private final Map<String, List<FieldReference>> multitableReferences; - - private final SQLCondition condition; - private final MethodMapping mappingForRecordFieldOverride; - private final ServiceWrapper serviceWrapper; - private final String nodeIdTypeName; - private final Map<String, TypeName> contextFields; - private final ProcedureCall procedureCall; - - public GenerationSourceField(T field, FieldType fieldType, String container) { - super(field, fieldType, container); - fieldReferences = new ArrayList<>(); - if (field.hasDirective(REFERENCE.getName())) { - var referenceDirective = field.getDirectives(REFERENCE.getName()).get(0); - - Optional.ofNullable(referenceDirective.getArgument(PATH.getName())) - .map(Argument::getValue) - .ifPresent(it -> addFieldReferences(it, fieldReferences)); - } - - multitableReferences = new HashMap<>(); - if (field.hasDirective(MULTITABLE_REFERENCE.getName())) { - var referenceDirective = field.getDirectives(MULTITABLE_REFERENCE.getName()).get(0); - - Optional.ofNullable(referenceDirective.getArgument(ROUTES.getName())) - .map(Argument::getValue) - .ifPresent(this::addMultitableReferences); - } - - condition = field.hasDirective(GenerationDirective.CONDITION.getName()) && fieldType != null ? new SQLCondition(field) : null; - serviceWrapper = field.hasDirective(SERVICE.getName()) || field.hasDirective(TABLE_METHOD.getName()) ? new ServiceWrapper(field) : null; - if (field.hasDirective(FIELD.getName())) { - mappingForRecordFieldOverride = getJavaName().isEmpty() ? new MethodMapping(toCamelCase(getUpperCaseName())) : new MethodMapping(getJavaName()); - } else { - mappingForRecordFieldOverride = getMappingFromFieldOverride(); - } - - hasFieldDirective = field.hasDirective(FIELD.getName()); - isExternalField = field.hasDirective(EXTERNAL_FIELD.getName()); - isGenerated = !field.hasDirective(NOT_GENERATED.getName()); - createsDataFetchers = field.hasDirective(SPLIT_QUERY.getName()) - || (field instanceof FieldDefinition && !container.equals(SCHEMA_QUERY.getName()) && !container.equals(SCHEMA_MUTATION.getName()) && !((FieldDefinition) field).getInputValueDefinitions().isEmpty()); - hasTableMethod = field.hasDirective(TABLE_METHOD.getName()); - hasService = field.hasDirective(SERVICE.getName()); - - createsDataFetcher = (createsDataFetchers || container.equals(SCHEMA_QUERY.getName()) || container.equals(SCHEMA_MUTATION.getName())) && isGenerated; - - hasNodeID = field.hasDirective(GenerationDirective.NODE_ID.getName()); - nodeIdTypeName = getOptionalDirectiveArgumentString(field, GenerationDirective.NODE_ID, GenerationDirectiveParam.TYPE_NAME) - .orElse(null); - contextFields = findContextFields(); - procedureCall = field.hasDirective(PROCEDURE_CALL.getName()) - ? new ProcedureCall(field) - : null; - } - - /** - * Construct references from the {@link GenerationDirectiveParam#PATH references} parameter. - */ - private void addFieldReferences(Value<?> referencesValue, List<FieldReference> listToAddTo) { - var values = referencesValue instanceof ArrayValue ? ((ArrayValue) referencesValue).getValues() : List.of(((ObjectValue) referencesValue)); - - values.stream() - .filter(value -> value instanceof ObjectValue) - .forEach(value -> { - var objectFields = ((ObjectValue) value).getObjectFields(); - var table = getOptionalObjectFieldByName(objectFields, GenerationDirectiveParam.TABLE); - var key = getOptionalObjectFieldByName(objectFields, KEY); - var referencedCondition = getOptionalObjectFieldByName(objectFields, GenerationDirectiveParam.CONDITION) - .map(ObjectField::getValue) - .map(it -> (ObjectValue) it) - .map(ObjectValue::getObjectFields) - .map(fields -> new SQLCondition(new CodeReference(fields, getName()))).orElse(null); - - listToAddTo.add( - new FieldReference( - table.map(DirectiveHelpers::stringValueOf).map(JOOQMapping::fromTable).orElse(null), - key.map(DirectiveHelpers::stringValueOf).map(JOOQMapping::fromKey).orElse(null), - referencedCondition - ) - ); - }); - } - - private void addMultitableReferences(Value<?> referencesValue) { - var values = referencesValue instanceof ArrayValue ? ((ArrayValue) referencesValue).getValues() : List.of(((ObjectValue) referencesValue)); - - values.stream() - .filter(value -> value instanceof ObjectValue) - .forEach(value -> { - var objectFields = ((ObjectValue) value).getObjectFields(); - var typeName = objectFields.stream() - .filter(it -> it.getName().equals(TYPE_NAME.getName())).findFirst() - .map(it -> ((StringValue) it.getValue()).getValue()) - .orElseThrow(() -> // Should never be thrown because typeName is not nullable - new RuntimeException(String.format("%s directive is missing %s parameter.",MULTITABLE_REFERENCE.getName(), TYPE_NAME.getName()))); - - var fieldReferencesForType = new ArrayList<FieldReference>(); - - objectFields.stream() - .filter(it -> it.getName().equals(PATH.getName())) - .findFirst() - .ifPresent(it -> addFieldReferences(it.getValue(), fieldReferencesForType)); - - multitableReferences.put(typeName, fieldReferencesForType); - }); - } - - /** - * @return Gather all the context fields that are reachable from this object alone. - */ - private Map<String, TypeName> findContextFields() { - var serviceFields = hasServiceReference() || hasTableMethod ? serviceWrapper.getContextFields() : Map.<String, TypeName>of(); - var conditionFields = hasCondition() ? condition.getContextFields() : Map.<String, TypeName>of(); - var referenceConditionFields = fieldReferences - .stream() - .map(FieldReference::getTableCondition) - .filter(Objects::nonNull) - .flatMap(it -> it.getContextFields().entrySet().stream()); - return Stream - .concat(Stream.concat(serviceFields.entrySet().stream(), conditionFields.entrySet().stream()), referenceConditionFields) - .sorted(Map.Entry.comparingByKey()) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (x, y) -> y, LinkedHashMap::new)); - } - - @Override - public boolean createsDataFetcher() { - return createsDataFetchers || implicitSplitQuery; - } - - public boolean isExternalField() { - return isExternalField; - } - - public boolean hasFieldDirective() { - return hasFieldDirective; - } - - @Override - public MethodMapping getMappingForRecordFieldOverride() { - return mappingForRecordFieldOverride; - } - - /** - * Get the method mapping for Java record field access. - * @param mapsJavaRecord true for types with @record directive (uses raw @field name), false otherwise (uses toCamelCase) - * @return The appropriate MethodMapping for getter/setter generation - */ - public MethodMapping getJavaRecordMethodMapping(boolean mapsJavaRecord) { - if (mapsJavaRecord) { - return getJavaName().isEmpty() - ? getMappingFromFieldOverride() - : new MethodMapping(getJavaName()); - } - return getMappingForRecordFieldOverride(); - } - - @Override - public String getFieldRecordMappingName() { - return mappingForRecordFieldOverride.getName(); - } - - @Override - public List<FieldReference> getFieldReferences() { - return fieldReferences; - } - - @Override - public boolean hasFieldReferences() { - return !fieldReferences.isEmpty(); - } - - public Map<String, List<FieldReference>> getMultitableReferences() { - return multitableReferences; - } - - public boolean hasMultitableReferences() { - return !multitableReferences.isEmpty(); - } - - @Override - public SQLCondition getCondition() { - return condition; - } - - @Override - public boolean hasCondition() { - return condition != null; - } - - @Override - public boolean hasOverridingCondition() { - return hasCondition() && condition.isOverride(); - } - - @Override - public boolean isGenerated() { - return isGenerated; - } - - @Override - public boolean hasServiceReference() { return hasService; } - - @Override - public ServiceWrapper getExternalMethod() { - return serviceWrapper; - } - - @Override - public Map<String, TypeName> getContextFields() { - return contextFields; - } - - @Override - public boolean hasMutationType() { - return false; - } - - @Override - public MutationType getMutationType() { - return null; - } - - @Override - public boolean isGeneratedWithResolver() { - return createsDataFetcher || implicitSplitQuery; - } - - /** - * Mark this field as an implicit split query, giving it the same behavior as an explicit {@code @splitQuery} directive. - */ - public void markAsImplicitSplitQuery() { - this.implicitSplitQuery = true; - } - - public boolean hasImplicitSplitQuery() { - return implicitSplitQuery; - } - - @Override - public boolean isExplicitlyNotGenerated() { - return !isGenerated; - } - - /** - * @return Does this field have the @nodeId directive? - */ - @Override - public boolean hasNodeID() { - return hasNodeID; - } - - /** - * @return The type name configured in the @nodeId directive - */ - @Override - public Optional<String> getNodeIdTypeName() { - return Optional.ofNullable(nodeIdTypeName); - } - - @Override - public boolean hasTableMethodDirective() { - return hasTableMethod; - } - - @Override - public ProcedureCall getProcedureCall() { - return procedureCall; - } - - @Override - public boolean hasProcedureCall() { - return procedureCall != null; - } - - @Override - public String formatPath() { - return String.format("'%s.%s'", getContainerTypeName(), getName()); - } - - - @Override - public boolean equals(Object obj) { - if (this == obj) return true; - if (obj == null || getClass() != obj.getClass()) return false; - GenerationSourceField<?> that = (GenerationSourceField<?>) obj; - return Objects.equals(getName(), that.getName()) - && Objects.equals(getContainerTypeName(), that.getContainerTypeName()); - } - - @Override - public int hashCode() { - return Objects.hash(getName(), getContainerTypeName()); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/InputField.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/InputField.java deleted file mode 100644 index b7df057cc6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/InputField.java +++ /dev/null @@ -1,65 +0,0 @@ -package no.sikt.graphitron.definitions.fields; - -import graphql.language.InputValueDefinition; -import no.sikt.graphitron.definitions.fields.containedtypes.FieldType; -import no.sikt.graphitron.definitions.objects.InputDefinition; - -import java.util.List; -import java.util.stream.Collectors; - -import static no.sikt.graphql.directives.GenerationDirective.LOOKUP_KEY; -import static no.sikt.graphql.directives.GenerationDirective.ORDER_BY; - -/** - * A field for a {@link InputDefinition}. - */ -public class InputField extends GenerationSourceField<InputValueDefinition> { - private final String defaultValue; - private final boolean isLookupKey; - private final boolean isOrderField; - - public InputField(InputValueDefinition field, String container) { - super(field, new FieldType(field.getType()), container); - defaultValue = field.getDefaultValue() != null ? field.getDefaultValue().toString() : ""; - - isLookupKey = field.hasDirective(LOOKUP_KEY.getName()); - isOrderField = field.hasDirective(ORDER_BY.getName()); - } - - /** - * @return Does this input have a default value set? - */ - public boolean hasDefaultValue() { - return !defaultValue.isEmpty(); - } - - /** - * @return Default value for this input. - */ - public String getDefaultValue() { - return defaultValue; - } - - /** - * @return Is this input field to be used as a key for a lookup operation? - */ - public boolean isLookupKey() { - return isLookupKey; - } - - /** - * @return List of instances based on a list of {@link InputValueDefinition}. - */ - public static List<InputField> from(List<InputValueDefinition> fields, String container) { - return fields.stream().map(it -> new InputField(it, container)).collect(Collectors.toList()); - } - - public boolean isOrderField() { - return isOrderField; - } - - @Override - public boolean isInput() { - return true; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/ObjectField.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/ObjectField.java deleted file mode 100644 index 6115fd086b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/ObjectField.java +++ /dev/null @@ -1,260 +0,0 @@ -package no.sikt.graphitron.definitions.fields; - -import graphql.language.FieldDefinition; -import graphql.language.IntValue; -import no.sikt.graphitron.definitions.fields.containedtypes.FieldType; -import no.sikt.graphitron.definitions.fields.containedtypes.MutationType; -import no.sikt.graphitron.definitions.helpers.ConstructSelection; -import no.sikt.graphitron.definitions.helpers.SelectionParser; -import no.sikt.graphitron.validation.ValidationHandler; -import no.sikt.graphql.directives.GenerationDirectiveParam; -import no.sikt.graphql.naming.GraphQLReservedName; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.*; -import java.util.function.Function; -import java.util.stream.Collectors; - -import static no.sikt.graphql.directives.DirectiveHelpers.getDirectiveArgumentEnum; -import static no.sikt.graphql.directives.DirectiveHelpers.getOptionalDirectiveArgumentString; -import static no.sikt.graphql.directives.GenerationDirective.*; -import static no.sikt.graphql.directives.GenerationDirectiveParam.SELECTION; - -/** - * Represents the default field type, which in addition to the generic field functionality also provides join operation data. - */ -public class ObjectField extends GenerationSourceField<FieldDefinition> { - private int firstDefault = 100; - private int lastDefault = 100; - private boolean hasForwardPagination, hasBackwardPagination, hasRequiredPaginationFields; - private final List<ArgumentField> arguments, nonReservedArguments; - private final ArgumentField orderField; - private final LinkedHashMap<String, ArgumentField> argumentsByName; - private final LinkedHashSet<String> lookupKeys; - private final MutationType mutationType; - private final boolean hasLookupKey; - private final DefaultOrder defaultOrder; - private final ConstructSelection construct; - public final static List<String> RESERVED_PAGINATION_NAMES = List.of( - GraphQLReservedName.PAGINATION_FIRST.getName(), - GraphQLReservedName.PAGINATION_AFTER.getName(), - GraphQLReservedName.PAGINATION_LAST.getName(), - GraphQLReservedName.PAGINATION_BEFORE.getName() - ); - - public ObjectField(FieldDefinition field, String container) { - super(field, new FieldType(field.getType()), container); - arguments = setInputAndPagination(field, isRootField(), container); - orderField = arguments.stream().filter(InputField::isOrderField).findFirst().orElse(null); - nonReservedArguments = arguments.stream().filter(inputField -> - RESERVED_PAGINATION_NAMES.stream().noneMatch(n -> n.equals(inputField.getName())) && !inputField.equals(orderField) - ).collect(Collectors.toList()); - - mutationType = field.hasDirective(MUTATION.getName()) - ? MutationType.valueOf(getDirectiveArgumentEnum(field, MUTATION, GenerationDirectiveParam.TYPE)) - : null; - defaultOrder = field.hasDirective(DEFAULT_ORDER.getName()) - ? DefaultOrder.from(field) - : null; - lookupKeys = nonReservedArguments.stream().filter(ArgumentField::isLookupKey).map(AbstractField::getName).collect(Collectors.toCollection(LinkedHashSet::new)); - hasLookupKey = !lookupKeys.isEmpty(); - argumentsByName = arguments.stream().collect(Collectors.toMap(AbstractField::getName, Function.identity(), (x, y) -> y, LinkedHashMap::new)); - ValidationHandler.isTrue(!hasLookupKey || getOrderField().isEmpty(), - "'%s' has both @%s and @%s defined. These directives can not be used together", getName(), ORDER_BY.getName(), LOOKUP_KEY.getName()); - ValidationHandler.isTrue(!hasLookupKey || !hasPagination(), - "'%s' has both pagination and @%s defined. These can not be used together", getName(), LOOKUP_KEY.getName()); - construct = field.hasDirective(CONSTRUCT_TYPE.getName()) - ? getOptionalDirectiveArgumentString(field, CONSTRUCT_TYPE, SELECTION).map(SelectionParser::parseSelection).orElse(null) - : null; - } - - private List<ArgumentField> setInputAndPagination(FieldDefinition field, boolean isTopLevel, String container) { - var inputs = field.getInputValueDefinitions(); - var inputFields = new ArrayList<ArgumentField>(); - - if (!this.createsDataFetcher() && !isTopLevel) { - return inputs.stream().map(it -> new ArgumentField(it, container, field.getName())).toList(); - } - - boolean hasFirst = false, hasAfter = false, hasLast = false, hasBefore = false; - for (var in : inputs) { - var name = in.getName(); - - if (name.equals(GraphQLReservedName.PAGINATION_FIRST.getName())) { - hasFirst = true; - if (in.getDefaultValue() != null) { - firstDefault = ((IntValue) (in.getDefaultValue())).getValue().intValue(); - } - } else if (name.equals(GraphQLReservedName.PAGINATION_AFTER.getName())) { - hasAfter = true; - } else if (name.equals(GraphQLReservedName.PAGINATION_LAST.getName())) { - hasLast = true; - if (in.getDefaultValue() != null) { - lastDefault = ((IntValue) (in.getDefaultValue())).getValue().intValue(); - } - } else if (name.equals(GraphQLReservedName.PAGINATION_BEFORE.getName())) { - hasBefore = true; - } - inputFields.add(new ArgumentField(in, container, field.getName())); - } - - var hasConnection = getTypeName().endsWith(GraphQLReservedName.SCHEMA_CONNECTION_SUFFIX.getName()); - hasRequiredPaginationFields = hasFirst && hasAfter || hasLast && hasBefore; - hasForwardPagination = hasConnection && hasFirst && hasAfter; - hasBackwardPagination = hasConnection && hasLast && hasBefore; - return inputFields; - } - - /** - * @return Type construction configuration. - */ - public ConstructSelection getSelectConstruct() { - return construct; - } - - /** - * @return Does this field have a type construction directive set? - */ - public boolean hasSelectConstruct() { - return construct != null; - } - - /** - * @return Does this search field use forward pagination? - * Does its type have the reserved "Connection" suffix? - */ - public boolean hasForwardPagination() { - return hasForwardPagination; - } - - /** - * @return Does this search field use backward pagination? - * Does its type have the reserved "Connection" suffix? - */ - public boolean hasBackwardPagination() { - return hasBackwardPagination; - } - - /** - * @return Does this search field use any form of pagination? - */ - public boolean hasPagination() { - return hasForwardPagination() || hasBackwardPagination(); - } - - public boolean hasTotalCountFieldInReturnType(ProcessedSchema schema) { - var connectionObject = schema.getConnectionObject(this.getTypeName()); - - return connectionObject != null && connectionObject - .getFields() - .stream() - .anyMatch(field -> field.getName().equals(GraphQLReservedName.CONNECTION_TOTAL_COUNT.getName())); - } - - @Override - public boolean hasMutationType() { - return mutationType != null; - } - - @Override - public MutationType getMutationType() { - return mutationType; - } - - /** - * @return List of all input arguments for this field. - */ - public List<ArgumentField> getArguments() { - return arguments; - } - - /** - * @return Argument with this name if it exists. - */ - public ArgumentField getArgumentByName(String name) { - return argumentsByName.get(name); - } - - /** - * @return Does this field contain this argument? - */ - public boolean hasArgument(String name) { - return argumentsByName.containsKey(name); - } - - /** - * @return Default value set for the after parameter. - */ - public int getFirstDefault() { - return firstDefault; - } - - /** - * @return Default value set for the before parameter. - */ - public int getLastDefault() { - return lastDefault; - } - - /** - * @return List of all input non-reserved arguments for this field. - */ - public List<ArgumentField> getNonReservedArguments() { - return nonReservedArguments; - } - - /** - * @return Does this field have any input fields defined? - */ - public boolean hasInputFields() { - return !arguments.isEmpty(); - } - - /** - * @return Does this field have any input fields defined that are not reserved? - */ - public boolean hasNonReservedInputFields() { - return !nonReservedArguments.isEmpty(); - } - - /** - * @return Does this field have any set of pagination fields? - */ - public boolean hasRequiredPaginationFields() { - return hasRequiredPaginationFields; - } - - /** - * @return List of instances based on a list of {@link FieldDefinition}. - */ - public static List<ObjectField> from(List<FieldDefinition> fields, String container) { - return fields.stream().map(it -> new ObjectField(it, container)).collect(Collectors.toList()); - } - - /** - * @return Does this field contain an argument set as a key for a lookup operation? - */ - public boolean hasLookupKey() { - return hasLookupKey; - } - - /** - * @return Set of fields that are configured to be used as lookup keys. - */ - public LinkedHashSet<String> getLookupKeys() { - return lookupKeys; - } - - public Optional<ArgumentField> getOrderField() { - return Optional.ofNullable(orderField); - } - - public Optional<DefaultOrder> getDefaultOrder() { - return Optional.ofNullable(defaultOrder); - } - - @Override - public boolean isInput() { - return false; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/OperationField.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/OperationField.java deleted file mode 100644 index fbed357a36..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/OperationField.java +++ /dev/null @@ -1,94 +0,0 @@ -package no.sikt.graphitron.definitions.fields; - -import graphql.language.OperationTypeDefinition; -import no.sikt.graphitron.definitions.fields.containedtypes.FieldType; -import no.sikt.graphitron.definitions.interfaces.FieldSpecification; -import no.sikt.graphitron.definitions.mapping.MethodMapping; -import no.sikt.graphitron.javapoet.TypeName; - -/** - * This class represents operation fields in the schema type. - */ -public class OperationField implements FieldSpecification { - private final FieldType fieldType; - private final String name; - - public OperationField(OperationTypeDefinition field) { - name = field.getName(); - fieldType = new FieldType(field.getTypeName()); - } - - @Override - public boolean hasSetFieldOverride() { - return false; - } - - @Override - public String getTypeName() { - return fieldType.getName(); - } - - @Override - public String getContainerTypeName() { - return null; - } - - @Override - public boolean isID() { - return fieldType.isID(); - } - - public boolean hasNodeID() { - return false; - } - - @Override - public boolean isIterableWrapped() { - return fieldType.isIterableWrapped(); - } - - @Override - public boolean isNullable() { - return fieldType.isIterableWrapped() ? fieldType.isIterableNullable() : fieldType.isNullable(); - } - - @Override - public boolean isNonNullable() { - return fieldType.isIterableWrapped() ? !fieldType.isIterableNullable() : !fieldType.isNullable(); - } - - @Override - public TypeName getTypeClass() { - return fieldType.getTypeClass(); - } - - @Override - public String getName() { - return name; - } - - @Override - public String getUpperCaseName() { - return name; - } - - @Override - public MethodMapping getMappingFromSchemaName() { - return null; - } - - @Override - public MethodMapping getMappingFromFieldOverride() { - return null; - } - - @Override - public boolean isRootField() { - return true; - } - - @Override - public boolean isIterableWrappedWithNullableElement() { - return fieldType.isIterableWrapped() && fieldType.isNullable(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/OrderByEnumField.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/OrderByEnumField.java deleted file mode 100644 index 68d254a0d3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/OrderByEnumField.java +++ /dev/null @@ -1,94 +0,0 @@ -package no.sikt.graphitron.definitions.fields; - -import graphql.language.EnumTypeDefinition; -import graphql.language.EnumValueDefinition; -import no.sikt.graphitron.validation.ValidationHandler; - -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -import no.sikt.graphql.directives.GenerationDirective; - -import static no.sikt.graphql.directives.DirectiveHelpers.*; -import static no.sikt.graphql.directives.GenerationDirective.ORDER; -import static no.sikt.graphql.directives.GenerationDirectiveParam.*; - -/** - * An order by field enum value within an {@link no.sikt.graphitron.definitions.objects.EnumDefinition}. - */ -public class OrderByEnumField extends AbstractField<EnumValueDefinition> { - - public enum SortMode { INDEX, FIELDS, PRIMARY_KEY } - - private final String indexName; - private final List<FieldSortSpec> fieldSortSpecs; - private final SortMode sortMode; - - public OrderByEnumField(EnumValueDefinition field, String container) { - super(field, container); - - // Support deprecated @index(name:) as fallback for @order(index:) - var legacyIndexArg = getOptionalDirectiveArgumentString(field, GenerationDirective.INDEX, NAME); - if (legacyIndexArg.isPresent()) { - ValidationHandler.addWarningMessage( - "Enum field '%s' of '%s' uses deprecated @index directive. Use @order(index: \"%s\") instead.", - field.getName(), container, legacyIndexArg.get()); - indexName = legacyIndexArg.get(); - fieldSortSpecs = null; - sortMode = SortMode.INDEX; - return; - } - - var indexArg = getOptionalDirectiveArgumentString(field, ORDER, INDEX); - var fieldsArg = getOptionalDirectiveArgumentObjectValueList(field, ORDER, FIELDS); - var hasPrimaryKey = getOptionalDirectiveArgumentBoolean(field, ORDER, PRIMARY_KEY).orElse(false); - - var hasIndex = indexArg.isPresent(); - var hasFields = fieldsArg.isPresent() && !fieldsArg.get().isEmpty(); - var modeCount = (hasIndex ? 1 : 0) + (hasFields ? 1 : 0) + (hasPrimaryKey ? 1 : 0); - - if (modeCount == 0) { - ValidationHandler.addErrorMessage( - "Expected enum field '%s' of '%s' to have an '@%s' directive with one of index, fields, or primaryKey set", - field.getName(), container, ORDER.getName()); - } - ValidationHandler.isTrue(modeCount <= 1, - "Enum field '%s' of '%s' must have exactly one of @%s(index:), @%s(fields:), or @%s(primaryKey: true) set, but %d were set", - field.getName(), container, ORDER.getName(), ORDER.getName(), ORDER.getName(), modeCount); - - indexName = hasIndex ? indexArg.get() : null; - fieldSortSpecs = hasFields ? fieldsArg.get().stream().map(FieldSortSpec::from).toList() : null; - sortMode = hasIndex ? SortMode.INDEX - : hasFields ? SortMode.FIELDS - : hasPrimaryKey ? SortMode.PRIMARY_KEY - : null; - } - - /** - * @return List of instances based on an instance of {@link EnumTypeDefinition}. - */ - public static List<OrderByEnumField> from(EnumTypeDefinition e, String container) { - return e.getEnumValueDefinitions() - .stream() - .map(field -> new OrderByEnumField(field, container)) - .collect(Collectors.toList()); - } - - public Optional<String> getIndexName() { - return Optional.ofNullable(indexName); - } - - public List<FieldSortSpec> getFieldSortSpecs() { - return fieldSortSpecs != null ? fieldSortSpecs : List.of(); - } - - public SortMode getSortMode() { - return sortMode; - } - - @Override - public boolean hasNodeID() { - return false; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/VirtualInputField.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/VirtualInputField.java deleted file mode 100644 index 76b66274ba..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/VirtualInputField.java +++ /dev/null @@ -1,23 +0,0 @@ -package no.sikt.graphitron.definitions.fields; - -import graphql.language.InputValueDefinition; -import graphql.language.TypeName; -import no.sikt.graphitron.definitions.mapping.MethodMapping; - -import static no.sikt.graphitron.generators.codebuilding.NameFormat.toCamelCase; - -public class VirtualInputField extends InputField { - public static final TypeName PLACEHOLDER_TYPENAME = new TypeName("String"); - private final MethodMapping mappingForRecordFieldOverride; - - - public VirtualInputField(String fieldName, String container) { - super(new InputValueDefinition(fieldName, PLACEHOLDER_TYPENAME), container); - this.mappingForRecordFieldOverride = new MethodMapping(toCamelCase(getUpperCaseName())); - } - - @Override - public MethodMapping getMappingForRecordFieldOverride() { - return mappingForRecordFieldOverride; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/VirtualSourceField.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/VirtualSourceField.java deleted file mode 100644 index 5a4ed5fd90..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/VirtualSourceField.java +++ /dev/null @@ -1,126 +0,0 @@ -package no.sikt.graphitron.definitions.fields; - -import graphql.language.FieldDefinition; -import graphql.language.TypeName; -import no.sikt.graphitron.definitions.fields.containedtypes.FieldReference; -import no.sikt.graphitron.definitions.interfaces.RecordObjectSpecification; -import no.sikt.graphitron.definitions.sql.SQLCondition; - -import java.util.List; - -import static no.sikt.graphql.naming.GraphQLReservedName.SCHEMA_QUERY; - -/** - * Virtual field for when we want to have a virtual source for code generation. - */ -public class VirtualSourceField extends ObjectField { - private final List<ArgumentField> nonReservedArguments, arguments; - private final SQLCondition condition; - private final boolean createsDataFetchers; - private final List<FieldReference> fieldReferences; - private String originalFieldName; - - public VirtualSourceField( - String targetTypeName, - String container, - List<ArgumentField> arguments, - List<ArgumentField> nonReservedArguments, - SQLCondition condition, - boolean createsDataFetchers, - List<FieldReference> fieldReferences) { - super(new FieldDefinition("for_" + targetTypeName,new TypeName(targetTypeName)), container); - this.arguments = arguments; - this.nonReservedArguments = nonReservedArguments; - this.condition = condition; - this.createsDataFetchers = createsDataFetchers; - this.fieldReferences = fieldReferences; - } - - public VirtualSourceField(String targetTypeName, ObjectField target) { - this(targetTypeName, - target.getContainerTypeName(), - target.getArguments(), - target.getNonReservedArguments(), - target.getCondition(), - target.createsDataFetcher(), - target.getMultitableReferences().getOrDefault(targetTypeName, List.of())); - this.originalFieldName = target.getName(); - } - - public VirtualSourceField(RecordObjectSpecification<?> targetType, ObjectField target) { - this(targetType.getName(), target); - } - - public VirtualSourceField(RecordObjectSpecification<?> targetType, String container) { - this(targetType.getName(), container, List.of(), List.of(), null, false, List.of()); - } - - public VirtualSourceField(RecordObjectSpecification<?> targetType) { - this(targetType.getName(), SCHEMA_QUERY.getName(), List.of(), List.of(), null, false, List.of()); - } - - public VirtualSourceField(ObjectField originalTarget, ObjectField dataTarget) { - this(dataTarget.getTypeName(), - originalTarget.getContainerTypeName(), - originalTarget.getArguments(), - originalTarget.getNonReservedArguments(), - originalTarget.getCondition(), - originalTarget.createsDataFetcher(), - List.of()); - } - - /** - * @return List of all input non-reserved arguments for this field. - */ - @Override - public List<ArgumentField> getNonReservedArguments() { - return nonReservedArguments; - } - - @Override - public List<ArgumentField> getArguments() { - return arguments; - } - - /** - * @return Does this field have any input fields defined that are not reserved? - */ - @Override - public boolean hasNonReservedInputFields() { - return !nonReservedArguments.isEmpty(); - } - - @Override - public SQLCondition getCondition() { - return condition; - } - - @Override - public boolean hasCondition() { - return condition != null; - } - - @Override - public boolean hasOverridingCondition() { - return hasCondition() && condition.isOverride(); - } - - @Override - public boolean createsDataFetcher() { - return createsDataFetchers; - } - - @Override - public List<FieldReference> getFieldReferences() { - return fieldReferences; - } - - @Override - public boolean hasFieldReferences() { - return !fieldReferences.isEmpty(); - } - - public String getOriginalFieldName() { - return originalFieldName; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/VirtualTableRecordField.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/VirtualTableRecordField.java deleted file mode 100644 index f579b2644b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/VirtualTableRecordField.java +++ /dev/null @@ -1,10 +0,0 @@ -package no.sikt.graphitron.definitions.fields; - -import no.sikt.graphitron.definitions.interfaces.GenerationTarget; - -/** - * Virtual field representing a table record, used when code generation needs a table reference - * without a corresponding GraphQL field definition. - */ -public record VirtualTableRecordField(String tableName) implements GenerationTarget { -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/containedtypes/FieldReference.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/containedtypes/FieldReference.java deleted file mode 100644 index 14860b3b86..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/containedtypes/FieldReference.java +++ /dev/null @@ -1,147 +0,0 @@ -package no.sikt.graphitron.definitions.fields.containedtypes; - -import graphql.language.DirectivesContainer; -import graphql.language.NamedNode; -import no.sikt.graphitron.configuration.externalreferences.CodeReference; -import no.sikt.graphitron.definitions.mapping.Alias; -import no.sikt.graphitron.definitions.mapping.JOOQMapping; -import no.sikt.graphitron.definitions.sql.*; -import no.sikt.graphitron.generators.context.JoinListSequence; - -import java.util.List; - -import static no.sikt.graphql.directives.DirectiveHelpers.getOptionalDirectiveArgumentObjectFields; -import static no.sikt.graphql.directives.DirectiveHelpers.getOptionalDirectiveArgumentString; -import static no.sikt.graphql.directives.GenerationDirective.REFERENCE; -import static no.sikt.graphql.directives.GenerationDirectiveParam.*; - -public class FieldReference { - private final JOOQMapping table; - private final JOOQMapping key; - private final SQLCondition tableCondition; - - public <T extends NamedNode<T> & DirectivesContainer<T>> FieldReference(T field) { - JOOQMapping relatedTable = null; - JOOQMapping relatedTableKey = null; - SQLCondition relatedTableCondition = null; - if (field.hasDirective(REFERENCE.getName())) { - relatedTable = getOptionalDirectiveArgumentString(field, REFERENCE, TABLE).map(JOOQMapping::fromTable).orElse(null); - relatedTableKey = getOptionalDirectiveArgumentString(field, REFERENCE, KEY).map(JOOQMapping::fromKey).orElse(null); - - var condition = getOptionalDirectiveArgumentObjectFields(field, REFERENCE, CONDITION); - if (condition.isPresent()) { - relatedTableCondition = new SQLCondition(new CodeReference(condition.get(), field.getName())); - } - } - - table = relatedTable; - key = relatedTableKey; - tableCondition = relatedTableCondition; - } - - public FieldReference(JOOQMapping table, JOOQMapping key, SQLCondition tableCondition) { - this.table = table; - this.key = key; - this.tableCondition = tableCondition; - } - - public FieldReference(JOOQMapping table) { - this(table, null, null); - } - - public boolean hasTable() { - return table != null && !table.getMappingName().isEmpty(); - } - - public JOOQMapping getTable() { - return table; - } - - public JOOQMapping getKey() { - return key; - } - - public boolean hasKey() { - return key != null && !key.getMappingName().isEmpty(); - } - - public SQLCondition getTableCondition() { - return tableCondition; - } - - public boolean hasTableCondition() { - return tableCondition != null; - } - - private SQLJoinStatement createJoinFor( - String joinName, - JoinListSequence joinSequence, - JOOQMapping tableNameBackup, - SQLJoinField joinField, - boolean isNullable - ) { - var targetTable = hasTable() ? getTable() : tableNameBackup; - var secondLast = joinSequence.getSecondLast(); - var adjustedReference = joinSequence.getLast().equals(targetTable) - ? secondLast != null ? secondLast.getCodeName() : targetTable.getCodeName() - : joinSequence.render() + (joinName.isEmpty() ? "" : "_" + joinName); - return new SQLJoinStatement( - joinSequence, - targetTable, - new Alias(adjustedReference, targetTable, isNullable).toAliasWrapper(), - List.of(joinField), - isNullable - ); - } - - /** - * @return A join statement based on a condition. - */ - public SQLJoinStatement createConditionJoinFor(JoinListSequence joinSequence, JOOQMapping tableNameBackup, boolean isNullable) { - return createJoinFor( - tableCondition.getReference().getMethodName().toLowerCase(), - joinSequence, - tableNameBackup, - new SQLJoinOnCondition(tableCondition), - isNullable - ); - } - - /** - * @return A join statement based on a key reference. - */ - public SQLJoinStatement createJoinOnKeyFor(JoinListSequence joinSequence, JOOQMapping tableNameBackup, boolean isNullable) { - return createJoinFor( - !joinSequence.isEmpty() && joinSequence.getLast().equals(key) ? "" : key.getCodeName(), - joinSequence, - tableNameBackup, - new SQLJoinOnKey(key), - isNullable - ); - } - - /** - * @return A join statement based on a key reference. - */ - public SQLJoinStatement createJoinOnKeyFor(JOOQMapping keyOverride, JoinListSequence joinSequence, JOOQMapping tableNameBackup, boolean isNullable) { - return createJoinFor( - !joinSequence.isEmpty() && joinSequence.getLast().equals(keyOverride) ? "" : keyOverride.getCodeName(), - joinSequence, - tableNameBackup, - new SQLJoinOnKey(keyOverride), - isNullable - ); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) return true; - if (obj instanceof FieldReference ref) { - return ref.hasTable() == this.hasTable() && (!this.hasTable() || ref.getTable().equals(this.getTable())) - && ref.hasKey() == this.hasKey() && (!this.hasKey() || ref.getKey().equals(this.getKey())) - && ref.hasTableCondition() == this.hasTableCondition() && (!this.hasTableCondition() || ref.getTableCondition().equals(this.tableCondition)); - } else { - return false; - } - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/containedtypes/FieldType.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/containedtypes/FieldType.java deleted file mode 100644 index 4a2a2a326e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/containedtypes/FieldType.java +++ /dev/null @@ -1,89 +0,0 @@ -package no.sikt.graphitron.definitions.fields.containedtypes; - -import graphql.language.ListType; -import graphql.language.NonNullType; -import graphql.language.Type; -import graphql.language.TypeName; -import no.sikt.graphitron.definitions.helpers.ScalarUtils; - -import java.util.ArrayList; - -/** - * Class that contains all the necessary information about a field's type and nullability. - */ -public class FieldType extends no.sikt.graphql.schema.FieldType { - private String name; - private no.sikt.graphitron.javapoet.TypeName typeClass; - private boolean isNonNullable = false; - private boolean isIterableNonNullable = false; - private boolean isIterableWrapped = false; - private boolean isID = false; - - public FieldType(Type<?> fieldType) { - super(fieldType); - setFields(fieldType); - } - - protected void setFields(Type<?> fieldType) { - ArrayList<Type<?>> orderedTypeList = extractNestedTypes(fieldType); - boolean isThisNonNullable = false; - for (Type<?> objectType : orderedTypeList) { - if (objectType instanceof NonNullType) { - isThisNonNullable = true; - } - else { - if (objectType instanceof ListType) { - isIterableWrapped = true; - isIterableNonNullable = isThisNonNullable; - } - else if (objectType instanceof TypeName) { - name = ((TypeName) objectType).getName(); - typeClass = ScalarUtils.getInstance().getScalarTypeMapping(name); - isNonNullable = isThisNonNullable; - isID = name.equals("ID"); - } - - isThisNonNullable = false; - } - } - } - - /** - * @return The name of the data type as specified in the schema. - */ - public String getName() { - return name; - } - - /** - * @return Is this data type wrapped in a list? - */ - public boolean isIterableWrapped() { - return isIterableWrapped; - } - - public boolean isNullable() { - return !isNonNullable; - } - - /** - * @return Is this data type's list wrapping nullable? - */ - public boolean isIterableNullable() { - return !isIterableNonNullable; - } - - /** - * @return Is this data type an ID type? - */ - public boolean isID() { - return isID; - } - - /** - * @return {@link no.sikt.graphitron.javapoet.TypeName} for this field. - */ - public no.sikt.graphitron.javapoet.TypeName getTypeClass() { - return typeClass; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/containedtypes/MutationType.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/containedtypes/MutationType.java deleted file mode 100644 index c7bc56de80..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/fields/containedtypes/MutationType.java +++ /dev/null @@ -1,8 +0,0 @@ -package no.sikt.graphitron.definitions.fields.containedtypes; - -/** - * Enum that lists all supported forms of mutations. - */ -public enum MutationType { - UPDATE, DELETE, INSERT, UPSERT -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/ClassReference.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/ClassReference.java deleted file mode 100644 index 39f9a412e5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/ClassReference.java +++ /dev/null @@ -1,54 +0,0 @@ -package no.sikt.graphitron.definitions.helpers; - -import no.sikt.graphitron.javapoet.ClassName; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.configuration.externalreferences.CodeReference; - -public class ClassReference { - private final Class<?> classReference; - private final ClassName className; - - public ClassReference(CodeReference reference) { - if (reference != null) { - var referencedClass = GeneratorConfig.getExternalReferences().getClassFrom(reference); - if (referencedClass == null) { - throw new IllegalArgumentException("Invalid class reference: " + reference.getSchemaClassReference()); - } - classReference = referencedClass; - className = ClassName.get(referencedClass); - } else { - classReference = null; - className = null; - } - } - - public ClassReference(String typeName, String packageSource) { - Class<?> reference; - try { - reference = Class.forName(packageSource + "." + typeName); - } catch (ClassNotFoundException e) { - reference = null; - } - classReference = reference; - className = classReference != null - ? ClassName.get(classReference) - : ClassName.get(packageSource, typeName); // TODO: Remove special else case (should be just null). In our test the objects do not exist and this class lookup will fail. When the graphql-codegen is integrated in this module this will be redundant. - } - - public ClassReference(Class<?> reference) { - classReference = reference; - className = ClassName.get(reference); - } - - public Class<?> getReferenceClass() { - return classReference; - } - - public String getClassNameString() { - return className != null ? className.simpleName() : ""; - } - - public ClassName getClassName() { - return className; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/CodeReferenceWrapper.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/CodeReferenceWrapper.java deleted file mode 100644 index 5cc6f1ffa1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/CodeReferenceWrapper.java +++ /dev/null @@ -1,122 +0,0 @@ -package no.sikt.graphitron.definitions.helpers; - -import graphql.language.DirectivesContainer; -import graphql.language.NamedNode; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.configuration.externalreferences.CodeReference; -import no.sikt.graphitron.javapoet.ClassName; -import no.sikt.graphitron.javapoet.TypeName; -import no.sikt.graphql.directives.GenerationDirective; -import no.sikt.graphql.directives.GenerationDirectiveParam; - -import java.lang.reflect.Method; -import java.lang.reflect.Parameter; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import static no.sikt.graphitron.mappings.JavaPoetClassName.OBJECT; -import static no.sikt.graphql.directives.DirectiveHelpers.getOptionalDirectiveArgumentStringList; -import static no.sikt.graphql.directives.GenerationDirectiveParam.CONTEXT_ARGUMENTS; -import static org.apache.commons.lang3.StringUtils.uncapitalize; - -/** - * Class that contains extended information for a code reference. - */ -abstract public class CodeReferenceWrapper { - private final Method method; - private final String methodName; - private final ClassName className; - private final CodeReference reference; - private final Map<String, TypeName> contextFields; - - public CodeReferenceWrapper(CodeReference reference) { - this.reference = reference; - var references = GeneratorConfig.getExternalReferences(); - var service = references.getClassFrom(this.reference); - method = references.getMethodsFrom(this.reference).stream().findFirst().orElse(null); - className = service != null ? ClassName.get(service) : null; - methodName = this.reference.getMethodName(); - contextFields = Map.of(); - } - - public <T extends NamedNode<T> & DirectivesContainer<T>> CodeReferenceWrapper(T field, GenerationDirective directive, GenerationDirectiveParam param) { - if (!field.hasDirective(directive.getName())) { - method = null; - methodName = null; - className = null; - reference = null; - contextFields = Map.of(); - return; - } - - reference = new CodeReference(field, directive, param, field.getName()); - var references = GeneratorConfig.getExternalReferences(); - var service = references.getClassFrom(reference); - method = references.getMethodsFrom(reference).stream().findFirst().orElse(null); - className = service != null ? ClassName.get(service) : null; - methodName = uncapitalize(method != null ? method.getName() : field.getName()); - - contextFields = getContextFields(field, reference, directive); - } - - private static <T extends NamedNode<T> & DirectivesContainer<T>> Map<String, TypeName> getContextFields(T field, CodeReference reference, GenerationDirective directive) { - // This matches parameter types to the names given in the schema. This is a best-guess effort which assumes these context parameters are at the end of the method call. - var method = GeneratorConfig.getExternalReferences().getMethodsFrom(reference).stream().findFirst().orElse(null); - - var contextFields = getOptionalDirectiveArgumentStringList(field, directive, CONTEXT_ARGUMENTS); - var allParams = (method != null ? List.of(method.getParameters()) : List.<Parameter>of()); - var paramTypes = allParams - .subList(Math.max(allParams.size() - contextFields.size(), 0), allParams.size()) - .stream() - .map(Parameter::getType) - .toList(); - var contextMap = new LinkedHashMap<String, TypeName>(); - for (int i = 0; i < contextFields.size(); i++) { - contextMap.put(contextFields.get(i), i < paramTypes.size() ? TypeName.get(paramTypes.get(i)) : OBJECT.className); - } - return contextMap; - } - - /** - * @return The class of the return type for this referenced method. - */ - public TypeName getGenericReturnType() { - return ClassName.get(method.getGenericReturnType()); - } - - /** - * @return The reflected method name for this referenced method. - */ - public String getMethodName() { - return methodName; - } - - /** - * @return Javapoet classname of the referenced class. - */ - public ClassName getClassName() { - return className; - } - - /** - * @return Map of context argument to be added to the reference call mapped to their types. - */ - public Map<String, TypeName> getContextFields() { - return contextFields; - } - - /** - * @return The reference to the external code that this field is related to. - */ - public CodeReference getReference() { - return reference; - } - - /** - * @return The method that is set by this reference. - */ - public Method getMethod() { - return method; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/ConstructSelection.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/ConstructSelection.java deleted file mode 100644 index 39df9d1acc..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/ConstructSelection.java +++ /dev/null @@ -1,9 +0,0 @@ -package no.sikt.graphitron.definitions.helpers; - -import java.util.LinkedHashMap; - -/** - * Wrapper for handling selection construction patterns. May be expanded to handle more complex cases later. - * @param values Map of selection values. - */ -public record ConstructSelection(LinkedHashMap<String, String> values) {} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/InputComponent.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/InputComponent.java deleted file mode 100644 index 6f2bf452e3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/InputComponent.java +++ /dev/null @@ -1,77 +0,0 @@ -package no.sikt.graphitron.definitions.helpers; - -import no.sikt.graphitron.definitions.fields.InputField; -import no.sikt.graphitron.javapoet.CodeBlock; - -import java.util.LinkedHashSet; -import java.util.stream.Collectors; - -import static org.apache.commons.lang3.StringUtils.uncapitalize; - -public abstract class InputComponent { - protected final InputField input, sourceInput; - protected final String namePath, startName; - protected final LinkedHashSet<String> nullChecks; - protected final boolean pastWasIterable; - protected final boolean hasRecord; - protected final Boolean isWrappedInList; - - protected InputComponent( - InputField input, - InputField sourceInput, - String startName, - String namePath, - LinkedHashSet<String> nullChecks, - boolean pastWasIterable, - Boolean isWrappedInList, - boolean hasRecord) { - this.input = input; - this.sourceInput = sourceInput; - this.startName = startName; - this.namePath = namePath; - this.nullChecks = new LinkedHashSet<>(nullChecks); - this.pastWasIterable = pastWasIterable; - this.isWrappedInList = isWrappedInList; - this.hasRecord = hasRecord; - } - - public InputField getInput() { - return input; - } - - public String getNamePath() { - return namePath; - } - - public CodeBlock getNameWithPath() { - return CodeBlock.of(getNameWithPathString()); - } - - public String getNameWithPathString() { - if (namePath.isEmpty()) { - return uncapitalize(startName.isEmpty() ? input.getName() : startName); - } - - return namePath + ( - hasRecord - ? input.getMappingForRecordFieldOverride().asGetCall() - : input.getMappingFromSchemaName().asGetCall() - ).toString(); - } - - public String getChecksAsSequence() { - return !nullChecks.isEmpty() ? nullChecks.stream().sorted().collect(Collectors.joining(" && ")) : ""; - } - - public CodeBlock getCheckSequenceCodeBlock() { - return CodeBlock.of(getChecksAsSequence()); - } - - public abstract InputComponent iterate(InputField input); - - public abstract InputComponent applyTo(InputField input); - - public boolean hasRecord() { - return hasRecord; - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/InputComponents.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/InputComponents.java deleted file mode 100644 index 4835edce65..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/InputComponents.java +++ /dev/null @@ -1,15 +0,0 @@ -package no.sikt.graphitron.definitions.helpers; - -import no.sikt.graphitron.definitions.interfaces.GenerationField; - -import java.util.List; -import java.util.Map; - -public record InputComponents( - List<InputCondition> independentConditions, List<ConditionTuple> conditionTuples, - List<InputSetValue> independentSetValues, SetValueTuple setValueTuple, - Map<GenerationField, List<InputCondition>> declaredConditionsByField -) { - public record ConditionTuple(String path, List<InputCondition> conditions) {} - public record SetValueTuple(String path, List<InputSetValue> setValues) {} -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/InputCondition.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/InputCondition.java deleted file mode 100644 index 15cf01898e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/InputCondition.java +++ /dev/null @@ -1,86 +0,0 @@ -package no.sikt.graphitron.definitions.helpers; - -import no.sikt.graphitron.definitions.fields.InputField; -import no.sikt.graphitron.mappings.JavaPoetClassName; - -import java.util.LinkedHashSet; - - -public class InputCondition extends InputComponent { - private final Boolean isOverriddenByAncestors; - private final boolean isArray; - - private InputCondition( - InputField input, - InputField sourceInput, - String startName, - String namePath, - LinkedHashSet<String> nullChecks, - boolean pastWasIterable, - boolean hasRecord, - Boolean isOverriddenByAncestors, - Boolean isWrappedInList) { - super(input, sourceInput, startName, namePath, nullChecks, pastWasIterable, isWrappedInList, hasRecord); - this.isOverriddenByAncestors = isOverriddenByAncestors; - this.isArray = input.isIterableWrapped() // This will not cover all array fields, but good enough for now - && (JavaPoetClassName.INTEGER.className.equals(input.getTypeClass()) || JavaPoetClassName.STRING.className.equals(input.getTypeClass())); - inferAdditionalChecks(input); - } - - public InputCondition(InputField input, String startName, boolean hasRecord, Boolean isOverriddenByAncestors) { - this(input, input, startName, "", new LinkedHashSet<>(), false, hasRecord, isOverriddenByAncestors, false); - } - - public InputField getSourceInput() { - return sourceInput; - } - - private void inferAdditionalChecks(InputField input) { - var name = getNameWithPathString(); - if (!pastWasIterable && input.isNullable()) { - this.nullChecks.add(name + " != null"); - } - - if (isArray && hasRecord()) { - this.nullChecks.add(name + ".length > 0"); - } else if (input.isIterableWrapped()) { - this.nullChecks.add(name + ".size() > 0"); - } - } - - public Boolean isOverriddenByAncestors() { - return this.isOverriddenByAncestors; - } - - public Boolean isWrappedInList() { - return this.isWrappedInList; - } - - @Override - public InputCondition iterate(InputField input) { - return new InputCondition( - input, - sourceInput, - startName, - getNameWithPathString(), - nullChecks, - pastWasIterable || this.input.isIterableWrapped(), - hasRecord, - isOverriddenByAncestors || this.input.hasOverridingCondition(), - isWrappedInList || this.input.isIterableWrapped()); - } - - @Override - public InputCondition applyTo(InputField input) { - return new InputCondition( - input, - sourceInput, - startName, - namePath, - nullChecks, - pastWasIterable || this.input.isIterableWrapped(), - hasRecord, - isOverriddenByAncestors, - isWrappedInList); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/InputSetValue.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/InputSetValue.java deleted file mode 100644 index a68de84f64..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/InputSetValue.java +++ /dev/null @@ -1,55 +0,0 @@ -package no.sikt.graphitron.definitions.helpers; - -import no.sikt.graphitron.definitions.fields.InputField; - -import java.util.LinkedHashSet; - -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_ITERATOR; - - -public class InputSetValue extends InputComponent { - - private InputSetValue( - InputField input, - InputField sourceInput, - String startName, - String namePath, - LinkedHashSet<String> nullChecks, - boolean pastWasIterable, - Boolean isWrappedInList, - boolean hasRecord) { - super(input, sourceInput, startName, namePath, nullChecks, pastWasIterable, isWrappedInList, hasRecord); - } - - public InputSetValue(InputField input, String startName, boolean hasRecord) { - this(input, input, startName, "", new LinkedHashSet<>(), false, false, hasRecord); - } - - @Override - public InputSetValue iterate(InputField input) { - return new InputSetValue( - input, - sourceInput, - startName, - sourceInput.isIterableWrapped() ? VAR_ITERATOR : startName, // TODO: how about further nesting? - nullChecks, - pastWasIterable || this.input.isIterableWrapped(), - isWrappedInList || this.input.isIterableWrapped(), - hasRecord - ); - } - - @Override - public InputSetValue applyTo(InputField input) { - return new InputSetValue( - input, - sourceInput, - startName, - namePath, - nullChecks, - pastWasIterable || this.input.isIterableWrapped(), - isWrappedInList, - hasRecord - ); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/NodeConfiguration.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/NodeConfiguration.java deleted file mode 100644 index c30a03f534..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/NodeConfiguration.java +++ /dev/null @@ -1,85 +0,0 @@ -package no.sikt.graphitron.definitions.helpers; - -import graphql.language.TypeDefinition; -import no.sikt.graphitron.definitions.mapping.JOOQMapping; -import no.sikt.graphitron.definitions.mapping.MethodMapping; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphql.directives.GenerationDirective; -import no.sikt.graphql.directives.GenerationDirectiveParam; - -import java.util.Collection; -import java.util.List; -import java.util.Optional; - -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.tableFieldsBlock; -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.tableFieldsWithStaticTableInstanceBlock; -import static no.sikt.graphitron.mappings.TableReflection.*; -import static no.sikt.graphql.directives.DirectiveHelpers.getOptionalDirectiveArgumentString; -import static no.sikt.graphql.directives.DirectiveHelpers.getOptionalDirectiveArgumentStringList; - -/** - * Configuration for a globally identifiable GraphQL object, derived from the {@code @node} and {@code @table} directives. - * - * @param typeId from {@code @node(typeId)}. Defaults to the GraphQL type name when omitted. - * @param targetTable the {@link JOOQMapping} for the table associated via {@code @table}. - * Should match the table of the {@link no.sikt.graphitron.definitions.objects.RecordObjectDefinition} this NodeConfiguration belongs to. - * @param keyColumnsJavaNames from {@code @node(keyColumns)}. Falls back to the table's primary key columns when omitted. - * @param hasCustomTypeId whether the {@code @node} directive explicitly sets the {@code typeId} parameter. - */ -public record NodeConfiguration(String typeId, JOOQMapping targetTable, List<String> keyColumnsJavaNames, boolean hasCustomTypeId) { - public NodeConfiguration(TypeDefinition<?> objectDefinition, JOOQMapping table) { - this( - resolveTypeId(objectDefinition), - table, - resolveKeyColumns(objectDefinition, table), - getOptionalDirectiveArgumentString(objectDefinition, GenerationDirective.NODE, GenerationDirectiveParam.TYPE_ID).isPresent() - ); - } - - private static String resolveTypeId(TypeDefinition<?> objectDefinition) { - return getOptionalDirectiveArgumentString(objectDefinition, GenerationDirective.NODE, GenerationDirectiveParam.TYPE_ID) - .orElse(objectDefinition.getName()); - } - - private static List<String> resolveKeyColumns(TypeDefinition<?> objectDefinition, JOOQMapping table) { - String javaTableName = Optional.ofNullable(table).map(MethodMapping::getName).orElse(null); - - var keyColumns = getOptionalDirectiveArgumentStringList(objectDefinition, GenerationDirective.NODE, GenerationDirectiveParam.KEY_COLUMNS) - .stream() - .map(columnName -> getJavaFieldName(javaTableName, columnName).orElse(columnName)) - .toList(); - - if (keyColumns.isEmpty()) { - keyColumns = getPrimaryKeyForTable(javaTableName) - .stream() - .map(it -> getJavaFieldNamesForKey(javaTableName, it)) - .flatMap(Collection::stream) - .toList(); - } - return keyColumns; - } - - /** - * @return CodeBlock with comma-separated node ID fields using a static table instance. - * Example: {@code Film.FILM.FILM_ID, Film.FILM.TITLE} - */ - public CodeBlock nodeIdFieldsWithStaticTableInstanceBlock() { - return tableFieldsWithStaticTableInstanceBlock(targetTable().getName(), keyColumnsJavaNames()); - } - - /** - * @return CodeBlock with comma-separated node ID fields referencing the static table field directly. - * Example: {@code FILM.FILM_ID, FILM.TITLE} - */ - public CodeBlock nodeIdFieldsWithStaticFieldBlock() { - return tableFieldsBlock(CodeBlock.of("$N", targetTable().getName()), keyColumnsJavaNames()); - } - - /** - * @return CodeBlock with comma-separated node ID fields using a table alias variable. - * Example: {@code _a_film.FILM_ID, _a_film.TITLE} - */ - public CodeBlock nodeIdFieldsWithTableVariableBlock(String tableVariable) { - return tableFieldsBlock(CodeBlock.of("$N", tableVariable), keyColumnsJavaNames()); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/ProcedureCall.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/ProcedureCall.java deleted file mode 100644 index a3d50a2241..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/ProcedureCall.java +++ /dev/null @@ -1,42 +0,0 @@ -package no.sikt.graphitron.definitions.helpers; - -import graphql.language.DirectivesContainer; -import graphql.language.NamedNode; - -import java.util.LinkedHashMap; -import java.util.Map; - -import static no.sikt.graphql.directives.DirectiveHelpers.getOptionalDirectiveArgumentString; -import static no.sikt.graphql.directives.GenerationDirective.PROCEDURE_CALL; -import static no.sikt.graphql.directives.GenerationDirectiveParam.ARGUMENTS; -import static no.sikt.graphql.directives.GenerationDirectiveParam.PROCEDURE; -import static no.sikt.graphql.directives.GenerationDirectiveParam.TARGET; - -/** - * Wrapper for handling the configuration of a single {@code @experimental_procedureCall} directive usage on a field. - * - * @param procedureName The routine name as written by the user in the directive. - * @param argumentMap Mapping of routine IN parameter names (exactly what jOOQ's {@code Parameter.getName()} returns, - * typically snake_case) to argument sources. The interpretation depends on the directive's mode: - * in inline mode every value is a column; - * in target mode every value is a GraphQL input argument on the directive-bearing field. - * @param targetField In target mode, the name of a scalar field in the data-fetcher's return type whose cell - * the function call fills. {@code null} or blank in inline mode. - */ -public record ProcedureCall(String procedureName, Map<String, String> argumentMap, String targetField) { - public <T extends NamedNode<T> & DirectivesContainer<T>> ProcedureCall(T field) { - this( - getOptionalDirectiveArgumentString(field, PROCEDURE_CALL, PROCEDURE).orElse(""), - parseArguments(getOptionalDirectiveArgumentString(field, PROCEDURE_CALL, ARGUMENTS).orElse("")), - getOptionalDirectiveArgumentString(field, PROCEDURE_CALL, TARGET).orElse(null) - ); - } - - public boolean hasTarget() { - return targetField != null && !targetField.isBlank(); - } - - private static Map<String, String> parseArguments(String rawArguments) { - return rawArguments.isBlank() ? new LinkedHashMap<>() : SelectionParser.parseSelection(rawArguments).values(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/ScalarUtils.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/ScalarUtils.java deleted file mode 100644 index ee8e66dc56..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/ScalarUtils.java +++ /dev/null @@ -1,165 +0,0 @@ -package no.sikt.graphitron.definitions.helpers; - -import com.apollographql.federation.graphqljava._Any; -import com.apollographql.federation.graphqljava._FieldSet; -import com.apollographql.federation.graphqljava.link__Import; -import no.sikt.graphitron.javapoet.ClassName; -import no.sikt.graphitron.javapoet.CodeBlock; -import graphql.Scalars; -import graphql.scalars.ExtendedScalars; -import graphql.schema.GraphQLScalarType; -import no.sikt.graphql.schema.CustomScalars; - -import java.lang.reflect.Field; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -public class ScalarUtils { - - private static ScalarUtils instance = null; - - private final Set<String> BUILT_IN_SCALAR_NAMES; - - //order matters. Any custom scalars that should override the default ones should be added last. - private static final List<Class<?>> DEFAULT_SCALAR_DEFINITIONS_CLASSES = - List.of(Scalars.class, ExtendedScalars.class, _FieldSet.class, _Any.class, link__Import.class, CustomScalars.class); - - private final Map<String, CodeBlock> scalarTypeCodeBlockMapping; - private final Map<String, String> scalarTypeNameMapping; - private final Map<String, ClassName> scalarsTypeClassMapping; - - private ScalarUtils(Set<Class<?>> userProvidedDefinitionsClasses) { - BUILT_IN_SCALAR_NAMES = getScalarFields(Scalars.class).values() - .stream() - .map(GraphQLScalarType::getName) - .collect(Collectors.toSet()); - - scalarTypeCodeBlockMapping = new HashMap<>(); - scalarTypeNameMapping = new HashMap<>(); - scalarsTypeClassMapping = new HashMap<>(); - - var scalarDefinitionsClasses = - Stream.concat( - DEFAULT_SCALAR_DEFINITIONS_CLASSES.stream(), - userProvidedDefinitionsClasses.stream() - ); - - scalarDefinitionsClasses - .forEach(scalarDefinitionsClass -> { - var scalars = getScalarFields(scalarDefinitionsClass); - var scalarNameToClassNames = getScalarNameToClassNameMap(scalars); - scalarsTypeClassMapping.putAll(scalarNameToClassNames); - scalarTypeNameMapping.putAll(getScalarNameToJavaClassNameMap(scalarNameToClassNames)); - scalarTypeCodeBlockMapping.putAll(getScalarTypeNameToFieldNameMap(scalars, scalarDefinitionsClass)); - }); - } - - public static ScalarUtils getInstance() { - if (instance == null) { - return new ScalarUtils(Set.of()); - } - return instance; - } - - public static ScalarUtils initialize(Set<Class<?>> definitionsClasses) { - instance = new ScalarUtils(definitionsClasses); - return instance; - } - - /** - * @return the names of the built-in scalar types supported by GraphQL Java. - */ - public Set<String> getBuiltInScalarNames() { - return BUILT_IN_SCALAR_NAMES; - } - - /** - * @return a map of scalar names to CodeBlocks representing the code to access the scalar field. - * E.g "BigDecimal" -> "ExtendedScalars.GraphQLBigDecimal". - * This is used to automatically add scalar types to the wiring. - */ - public Map<String, CodeBlock> getScalarTypeCodeBlockMapping() { - return scalarTypeCodeBlockMapping; - } - - /** - * @return a map of all supported scalar names to their corresponding Java class names. - */ - public Map<String, String> getScalarTypeNameMapping() { - return scalarTypeNameMapping; - } - - /** - * @return the java ClassName type mapping for a supported scalar type. - * Null if the scalar is not supported. - */ - public ClassName getScalarTypeMapping(String scalarName) { - return scalarsTypeClassMapping.get(scalarName); - } - - private Map<String, CodeBlock> getScalarTypeNameToFieldNameMap(Map<String, GraphQLScalarType> scalars, Class<?> containingClass) { - return scalars.entrySet() - .stream() - .collect(Collectors.toMap(entry -> entry.getValue().getName(), - entry -> CodeBlock.of("$T.$N", containingClass, entry.getKey()))); - } - - private Map<String, ClassName> getScalarNameToClassNameMap(Map<String, GraphQLScalarType> scalars) { - HashMap<String, ClassName> extendedScalarsTypeMapping = new HashMap<>(); - scalars.forEach((fieldName, scalarType) -> { - try { - Type[] genericInterfaces = scalarType.getCoercing().getClass().getGenericInterfaces(); - for (Type genericInterface : genericInterfaces) { - if (genericInterface instanceof ParameterizedType parameterizedType) { - Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); - if (actualTypeArguments.length > 0) { - Type inputType = actualTypeArguments[0]; - if (inputType instanceof Class<?> inputClass) { - extendedScalarsTypeMapping.put(scalarType.getName(), ClassName.get(inputClass)); - return; - } - } - } - } - // Fallback mechanism for scalars that do not have generic type parameters - Class<?> inputClass = scalarType.getCoercing().getClass().getMethod("parseValue", Object.class).getReturnType(); - extendedScalarsTypeMapping.put(scalarType.getName(), ClassName.get(inputClass)); - } catch (NoSuchMethodException e) { - throw new RuntimeException("Failed to access scalar field: " + fieldName, e); - } - }); - return extendedScalarsTypeMapping; - } - - private Map<String, String> getScalarNameToJavaClassNameMap(Map<String, ClassName> scalarToClassNames) { - return scalarToClassNames.entrySet().stream() - .map(it -> Map.entry(it.getKey(), it.getValue().canonicalName())) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); - } - - /** - * This method uses reflection to access all public fields of the provided class - * that are of type {@link GraphQLScalarType}. It then creates a map where the keys are the names of these fields - * and the values are the corresponding scalar types. - */ - private Map<String, GraphQLScalarType> getScalarFields(Class<?> clazz) { - return Stream.of(clazz.getFields()) - .filter(field -> GraphQLScalarType.class.isAssignableFrom(field.getType())) - .collect(Collectors.toMap( - Field::getName, - field -> { - try { - return (GraphQLScalarType) field.get(null); - } catch (IllegalAccessException e) { - throw new RuntimeException("Failed to access scalar field: " + field.getName(), e); - } - } - )); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/SelectionParser.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/SelectionParser.java deleted file mode 100644 index 19a9608a67..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/SelectionParser.java +++ /dev/null @@ -1,17 +0,0 @@ -package no.sikt.graphitron.definitions.helpers; - -import no.sikt.graphql.schema.SelectionSetParser; - -import java.util.LinkedHashMap; - -public class SelectionParser { - public static ConstructSelection parseSelection(String selection) { - var fields = SelectionSetParser.parseFields(selection); - var result = new LinkedHashMap<String, String>(); - for (var field : fields) { - var key = field.getAlias() != null ? field.getAlias() : field.getName(); - result.put(key, field.getName()); - } - return new ConstructSelection(result); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/ServiceWrapper.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/ServiceWrapper.java deleted file mode 100644 index 5171ca47da..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/ServiceWrapper.java +++ /dev/null @@ -1,18 +0,0 @@ -package no.sikt.graphitron.definitions.helpers; - -import graphql.language.DirectivesContainer; -import graphql.language.NamedNode; -import no.sikt.graphql.directives.GenerationDirectiveParam; - -import static no.sikt.graphql.directives.GenerationDirective.SERVICE; -import static no.sikt.graphql.directives.GenerationDirective.TABLE_METHOD; - -/** - * Class that contains extended information about a service. - */ -public class ServiceWrapper extends CodeReferenceWrapper { - public <T extends NamedNode<T> & DirectivesContainer<T>> ServiceWrapper(T field) { - super(field, field.hasDirective(SERVICE.getName()) ? SERVICE : TABLE_METHOD, - field.hasDirective(SERVICE.getName()) ? GenerationDirectiveParam.SERVICE : GenerationDirectiveParam.TABLE_METHOD_REFERENCE); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/TypeExtractor.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/TypeExtractor.java deleted file mode 100644 index b94eac381e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/helpers/TypeExtractor.java +++ /dev/null @@ -1,40 +0,0 @@ -package no.sikt.graphitron.definitions.helpers; - -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.lang.reflect.WildcardType; - -public class TypeExtractor { - /** - * @return If the type is a parameterized type such as a List or Set, return the class of the parameter, otherwise return the class of the argument. - */ - public static Class<?> extractType(Type type) { - - if (type == null) { - return null; - } - - if (type instanceof Class<?>) { - return (Class<?>) type; - } else if (type instanceof ParameterizedType) { - Type[] actualTypeArguments = ((ParameterizedType) type).getActualTypeArguments(); - - if (actualTypeArguments.length > 0) { - Type actualTypeArgument = actualTypeArguments[0]; - - if (actualTypeArgument instanceof Class<?>) { - return (Class<?>) actualTypeArgument; - } else if (actualTypeArgument instanceof ParameterizedType) { - return (Class<?>) ((ParameterizedType) actualTypeArgument).getRawType(); - } else if (actualTypeArgument instanceof WildcardType) { - WildcardType wildcardType = (WildcardType) actualTypeArgument; - Type[] upperBounds = wildcardType.getUpperBounds(); - if (upperBounds.length > 0 && upperBounds[0] instanceof Class<?>) { - return (Class<?>) upperBounds[0]; - } - } - } - } - throw new IllegalArgumentException("Cannot extract class from type: " + type); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/interfaces/FieldSpecification.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/interfaces/FieldSpecification.java deleted file mode 100644 index 78a325f966..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/interfaces/FieldSpecification.java +++ /dev/null @@ -1,91 +0,0 @@ -package no.sikt.graphitron.definitions.interfaces; - -import no.sikt.graphitron.javapoet.TypeName; -import no.sikt.graphitron.definitions.mapping.MethodMapping; -import no.sikt.graphql.directives.GenerationDirective; - -import java.util.Optional; - -/** - * Specifies that this Java object represents a GraphQL field. - */ -public interface FieldSpecification { - /** - * @return Is this field an ID? - */ - boolean isID(); - - /** - * @return Does this field have the @nodeId directive? - */ - boolean hasNodeID(); - - /** - * @return The type name configured in the @nodeId directive - */ - default Optional<String> getNodeIdTypeName(){ - return Optional.empty(); - } - - /** - * @return The name of the object as specified in the schema. - */ - String getName(); - - /** - * @return The name of the field's underlying data type. - */ - String getTypeName(); - - /** - * @return {@link no.sikt.graphitron.javapoet.TypeName} for this field's type. - */ - TypeName getTypeClass(); - - /** - * @return The name of the field's container schema type. - */ - String getContainerTypeName(); - - /** - * @return Is this field wrapped in a list? - */ - boolean isIterableWrapped(); - - /** - * @return Schema-side method name mappings based on the GraphQL equivalent of this field. - */ - MethodMapping getMappingFromSchemaName(); - - /** - * @return Is this field optional/nullable? - */ - boolean isNullable(); - - /** - * @return Is this field required/non-nullable? - */ - boolean isNonNullable(); - - /** - * @return The database equivalent name of this field. Defaults to field name. - */ - String getUpperCaseName(); - - /** - * @return Does this field use the {@link GenerationDirective#FIELD} directive? - */ - boolean hasSetFieldOverride(); - - /** - * @return DB-side method name mappings based on the database equivalent of this field. - */ - MethodMapping getMappingFromFieldOverride(); - - /** - * @return Is this object field a Query or Mutation root field? - */ - boolean isRootField(); - - boolean isIterableWrappedWithNullableElement(); -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/interfaces/GenerationField.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/interfaces/GenerationField.java deleted file mode 100644 index 00a1af943b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/interfaces/GenerationField.java +++ /dev/null @@ -1,85 +0,0 @@ -package no.sikt.graphitron.definitions.interfaces; - -import no.sikt.graphitron.definitions.fields.containedtypes.FieldReference; -import no.sikt.graphitron.definitions.fields.containedtypes.MutationType; -import no.sikt.graphitron.definitions.helpers.ProcedureCall; -import no.sikt.graphitron.definitions.helpers.ServiceWrapper; -import no.sikt.graphitron.definitions.mapping.MethodMapping; -import no.sikt.graphitron.definitions.sql.SQLCondition; -import no.sikt.graphitron.javapoet.TypeName; -import no.sikt.graphql.directives.GenerationDirective; - -import java.util.List; -import java.util.Map; - -/** - * This interface represents the general functionality associated with GraphQLs fields that can initialise code generation. - */ -public interface GenerationField extends GenerationTarget, FieldSpecification { - boolean hasFieldReferences(); - - boolean isExternalField(); - - boolean isInput(); - - boolean hasCondition(); - - boolean hasOverridingCondition(); - - List<FieldReference> getFieldReferences(); - - SQLCondition getCondition(); - - /** - * @return Does this field have a service reference defined? - */ - boolean hasServiceReference(); - - /** - * @return The wrapper object for a service reference, if the field has a service set. Otherwise, null. - */ - ServiceWrapper getExternalMethod(); - - /** - * @return Get any context fields related to this field. This may be either service or condition context fields (without duplicates). - */ - Map<String, TypeName> getContextFields(); - - /** - * @return Does this field have a mutation operation defined? - */ - boolean hasMutationType(); - - /** - * @return The type of mutation that should be applied in this operation. - */ - MutationType getMutationType(); - - /** - * @return Record-side name mapping based on the name of the field or the {@link GenerationDirective#FIELD} directive set on this type. - */ - String getFieldRecordMappingName(); - - /** - * @return Record-side method mapping based on the name of the field or the directive {@link GenerationDirective#FIELD} set on this type. - */ - MethodMapping getMappingForRecordFieldOverride(); - - MethodMapping getJavaRecordMethodMapping(boolean mapsJavaRecord); - - boolean hasFieldDirective(); - - boolean hasTableMethodDirective(); - - /** - * @return Procedure call configuration for this field, or {@code null} if {@code @experimental_procedureCall} was not used. - */ - ProcedureCall getProcedureCall(); - - /** - * @return Does this field have an {@code @experimental_procedureCall} directive set? - */ - boolean hasProcedureCall(); - - String formatPath(); -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/interfaces/GenerationTarget.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/interfaces/GenerationTarget.java deleted file mode 100644 index 132e683dba..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/interfaces/GenerationTarget.java +++ /dev/null @@ -1,50 +0,0 @@ -package no.sikt.graphitron.definitions.interfaces; - -import no.sikt.graphql.directives.GenerationDirective; - -public interface GenerationTarget { - /** - * @return Does this element lead to the generation of additional data fetchers? - */ - default boolean createsDataFetcher() { - return false; - } - - /** - * @return Does this element contain fields which may produce data fetchers? - */ - default boolean createsDataFetchersForFields() { - return false; - } - - /** - * @return Should this object be generated? - * - * @deprecated To be removed since transform now handles removal of non-generated fields. This is now always true. - */ - @Deprecated - default boolean isGenerated() { - return true; - } - - /** - * @return Should this object be generated as or containing resolvers? - * - * @deprecated To be removed since transform now handles removal of non-generated fields. This is now always true for resolvers. - * To check for resolvers, use {@link GenerationTarget#createsDataFetcher} instead. - */ - @Deprecated - default boolean isGeneratedWithResolver() { - return false; - } - - /** - * Does this have the {@link GenerationDirective#NOT_GENERATED} directive for skipping generation set? - * - * @deprecated To be removed since transform now handles removal of non-generated fields. This is now always false. - */ - @Deprecated - default boolean isExplicitlyNotGenerated() { - return false; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/interfaces/JoinElement.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/interfaces/JoinElement.java deleted file mode 100644 index a760332be9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/interfaces/JoinElement.java +++ /dev/null @@ -1,28 +0,0 @@ -package no.sikt.graphitron.definitions.interfaces; - -import no.sikt.graphitron.definitions.mapping.JOOQMapping; - -/** - * An element that can be used as a part of a join sequence. - */ -public interface JoinElement { - /** - * @return The exact name of the data that this object corresponds to. - */ - String getMappingName(); - - /** - * @return The method call version of the name. - */ - String getCodeName(); - - /** - * @return Should this element reset the sequence? - */ - boolean clearsPreviousSequence(); - - /** - * @return The table that this join element is built of. - */ - JOOQMapping getTable(); -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/interfaces/ObjectSpecification.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/interfaces/ObjectSpecification.java deleted file mode 100644 index 34d5c080ea..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/interfaces/ObjectSpecification.java +++ /dev/null @@ -1,42 +0,0 @@ -package no.sikt.graphitron.definitions.interfaces; - -import no.sikt.graphitron.javapoet.ClassName; - -import java.util.List; - -/** - * Specifies that this Java object represents a GraphQL object. - */ -public interface ObjectSpecification<T extends FieldSpecification> { - /** - * @return The name of the type as specified in the schema. - */ - String getName(); - - /** - * @return The pre-generated class for this GraphQL-type. - */ - Class<?> getClassReference(); - - /** - * @return The javapoet {@link ClassName} for the imported generated GraphQL type. - */ - ClassName getGraphClassName(); - - /** - * @return The fields contained within this type. - */ - List<T> getFields(); - - /** - * @return The field with this name. Null if it does not exist. - */ - T getFieldByName(String name); - - /** - * @return Is this type the top node? That should be either the Query or the Mutation type. - */ - default boolean isOperationRoot() { - return false; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/interfaces/RecordObjectSpecification.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/interfaces/RecordObjectSpecification.java deleted file mode 100644 index 290fe5a78c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/interfaces/RecordObjectSpecification.java +++ /dev/null @@ -1,82 +0,0 @@ -package no.sikt.graphitron.definitions.interfaces; - -import no.sikt.graphitron.definitions.helpers.NodeConfiguration; -import no.sikt.graphitron.definitions.mapping.JOOQMapping; -import no.sikt.graphitron.javapoet.ClassName; -import no.sikt.graphql.directives.GenerationDirective; -import no.sikt.graphql.federation.fieldsets.FederationFieldSet; - -import java.util.Optional; - -/** - * Specifies that this Java object represents a GraphQL object. - */ -public interface RecordObjectSpecification<T extends GenerationField> extends ObjectSpecification<T>, GenerationTarget { - /** - * @return Table objects which holds table names. - */ - JOOQMapping getTable(); - - /** - * @return Does this object have the "{@link GenerationDirective#TABLE table}" directive - * which implies a connection to a database table? - */ - boolean hasTable(); - - /** - * @return The reference for a record class for this input type. - */ - Class<?> getRecordReference(); - - /** - * @return The reference name for a record class for this input type. - */ - String getRecordReferenceName(); - - /** - * @return The {@link ClassName} for the record that corresponds to this type. - */ - ClassName getRecordClassName(); - - /** - * @return Does this input type have a record java class attached? - */ - boolean hasJavaRecordReference(); - - /** - * @return Does this input type have a record class attached? - */ - boolean hasRecordReference(); - - /** - * @return The {@link ClassName} for this object when it is considered the source of a mapping. - */ - ClassName asSourceClassName(boolean toRecord); - - /** - * @return The {@link ClassName} for this object when it is considered the target of a mapping. - */ - ClassName asTargetClassName(boolean toRecord); - - /** - * @return The name of this object once it is transformed into a record. - */ - String asRecordName(); - - /** - * @return Is this type an entity according to the Apollo Federation specification? - */ - boolean isEntity(); - - /** - * @return Apollo federation entity keys for this type. - */ - FederationFieldSet getEntityKeys(); - - default boolean hasNodeDirective() { - return false; - } - default Optional<NodeConfiguration> getNodeConfiguration() { - return Optional.empty(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/interfaces/TypeResolverTarget.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/interfaces/TypeResolverTarget.java deleted file mode 100644 index eb03c33c4a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/interfaces/TypeResolverTarget.java +++ /dev/null @@ -1,5 +0,0 @@ -package no.sikt.graphitron.definitions.interfaces; - -import no.sikt.graphitron.definitions.fields.ObjectField; - -public interface TypeResolverTarget extends GenerationTarget, ObjectSpecification<ObjectField> { } diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/mapping/Alias.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/mapping/Alias.java deleted file mode 100644 index 42931fdb94..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/mapping/Alias.java +++ /dev/null @@ -1,101 +0,0 @@ -package no.sikt.graphitron.definitions.mapping; - -import no.sikt.graphitron.definitions.interfaces.JoinElement; -import no.sikt.graphitron.generators.context.JoinListSequence; - -import java.util.Objects; -import java.util.zip.CRC32; - -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.aliasPrefix; - -/** - * Holds an alias. - */ -public class Alias implements JoinElement { - private final String name, shortName, variableValue; - private final JOOQMapping type; - - public Alias(String prefix, JOOQMapping table, boolean isLeft) { - this( - prefix + "_" + table.getMappingName(), - table, - table.getMappingName(), - table.getMappingName(), - isLeft - ); - } - - public Alias(String prefix, JoinListSequence joinSequence, boolean isLeft) { - this( - prefix, - joinSequence.getLast().getTable(), - joinSequence.getLast().getTable().getMappingName(), - joinSequence.render().toString(), - isLeft - ); - } - - private Alias(String name, JOOQMapping type, String aliasName, String variableValue, boolean isLeft) { - this.name = aliasPrefix(name + (isLeft ? "_left" : "")).toLowerCase(); - var withoutNamespace = name.replaceFirst(aliasPrefix(""), ""); - this.type = type; - this.shortName = createShortAliasName(withoutNamespace.replace("_", ""), aliasName.replace("_", "").toLowerCase()); - this.variableValue = variableValue; - } - - /** - * @return Alias name. - */ - @Override - public String getMappingName() { - return name; - } - - @Override - public String getCodeName() { - return shortName; - } - - @Override - public boolean clearsPreviousSequence() { - return true; - } - - @Override - public JOOQMapping getTable() { - return type; - } - - /** - * Short name for Alias due to character limit on Oracle Alias values (JIRA reference: <a href="https://unit.atlassian.net/browse/ROK-685">ROK-685</a>). - */ - private String createShortAliasName(String from, String to) { - var crc32 = new CRC32(); - crc32.reset(); - crc32.update(from.getBytes()); - return to + "_" + crc32.getValue(); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof Alias that)) return false; - return Objects.equals(name, that.name); - } - - @Override - public int hashCode() { - return Objects.hash(name); - } - - /** - * Content for alias variable declaration - */ - public String getVariableValue() { - return variableValue; - } - - public AliasWrapper toAliasWrapper() { - return new AliasWrapper(this); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/mapping/AliasWrapper.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/mapping/AliasWrapper.java deleted file mode 100644 index 721d6358dc..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/mapping/AliasWrapper.java +++ /dev/null @@ -1,69 +0,0 @@ -package no.sikt.graphitron.definitions.mapping; - -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.helpers.ServiceWrapper; -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.generators.context.InputParser; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.List; -import java.util.Objects; - -public class AliasWrapper { - private final Alias alias; - private ServiceWrapper tableMethod; - private List<String> inputNames; - private GenerationField referenceObjectField; - - public AliasWrapper(Alias alias, GenerationField referenceObjectField, boolean isTargetTable, ProcessedSchema processedSchema) { - this.alias = alias; - this.tableMethod = referenceObjectField.hasTableMethodDirective() && isTargetTable ? referenceObjectField.getExternalMethod() : null; - this.inputNames = new InputParser((ObjectField) referenceObjectField, processedSchema).getMethodInputNames(false, false, true); - this.referenceObjectField = referenceObjectField; - } - - public AliasWrapper(Alias alias, GenerationField referenceObjectField, ProcessedSchema processedSchema) { - this(alias, referenceObjectField, true, processedSchema); - } - - public AliasWrapper(Alias alias) { - this.alias = alias; - } - - public boolean hasTableMethod() { - return tableMethod != null; - } - - public Alias getAlias() { - return alias; - } - - public ServiceWrapper getTableMethod() { - return tableMethod; - } - - public List<String> getInputNames() { - return inputNames; - } - - public GenerationField getReferenceObjectField() { - return referenceObjectField; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o instanceof Alias) { - return o.equals(this.getAlias()); - } - if (o instanceof AliasWrapper) { - return ((AliasWrapper) o).getAlias().equals(this.getAlias()); - } - return false; - } - - @Override - public int hashCode() { - return Objects.hash(this.getAlias().getMappingName()); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/mapping/JOOQMapping.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/mapping/JOOQMapping.java deleted file mode 100644 index 533ab771bc..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/mapping/JOOQMapping.java +++ /dev/null @@ -1,118 +0,0 @@ -package no.sikt.graphitron.definitions.mapping; - -import no.sikt.graphitron.definitions.interfaces.JoinElement; -import no.sikt.graphitron.mappings.TableReflection; -import org.apache.commons.lang3.StringUtils; - -import java.util.Objects; - -import static no.sikt.graphitron.generators.codebuilding.NameFormat.toCamelCase; -import static no.sikt.graphitron.mappings.TableReflection.*; - -/** - * Stores operations related to rendering jOOQ key and table mappings. - */ -public class JOOQMapping extends MethodMapping implements JoinElement { - private final String name, codeName; - private final JOOQMapping underlyingTable; - - private JOOQMapping(String name, String codeName) { - super(name); - this.name = name; - this.codeName = codeName; - this.underlyingTable = this; - } - - private JOOQMapping(String name, String codeName, JOOQMapping underlyingTable) { - super(name); - this.name = name; - this.codeName = codeName; - this.underlyingTable = underlyingTable; - } - - /** - * @return The exact name of the data that this object corresponds to. - */ - @Override - public String getMappingName() { - return name; - } - - /** - * @return The method call version of the name. - */ - @Override - public String getCodeName() { - return codeName; - } - - public static JOOQMapping fromTable(String tableName) { - var maybeCorrectedJavaTableName = TableReflection.getTableJavaFieldNameByTableName(tableName) - .orElse(tableName); - var codeNameUpper = toCamelCase(tableName); - return new JOOQMapping(maybeCorrectedJavaTableName, StringUtils.uncapitalize(codeNameUpper)); - } - - public static JOOQMapping fromKey(String keyName) { - var upperName = keyName.toUpperCase(); - var sourceTable = getKeySourceTableJavaName(upperName); - var targetTable = getKeyTargetTableJavaName(upperName); - - return new JOOQMapping( - upperName, - sourceTable.map(it -> searchTableForKeyMethodNameGivenJavaFieldNames(it, upperName).orElse("")).orElse(""), - targetTable.map(JOOQMapping::fromTable).orElse(null) - ); - } - - public JOOQMapping getInverseKey() { - var sourceTable = getKeySourceTableJavaName(name).map(JOOQMapping::fromTable).orElse(null); - var targetTable = getKeyTargetTableJavaName(name).map(JOOQMapping::fromTable).orElse(null); - - if (sourceTable == null || targetTable == null) { - return null; - } - - var isReverse = sourceTable.equals(underlyingTable); - - return new JOOQMapping( - name, - searchTableForKeyMethodNameGivenJavaFieldNames(isReverse ? sourceTable.getName() : targetTable.getName(), name).orElse(""), - (isReverse ? targetTable : sourceTable) - ); - } - - @Override - public JOOQMapping getTable() { - return underlyingTable; - } - - @Override - public boolean clearsPreviousSequence() { - return false; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof JOOQMapping that)) return false; - return Objects.equals(name, that.name) && underlyingTable.getName().equalsIgnoreCase(that.underlyingTable.getName()); - } - - @Override - public int hashCode() { - return Objects.hash(name); - } - - public Class<?> getTableClass() { - // FIXME: Dersom skjema refererer til en tabell som ikke finnes burde vi stoppe genereringen (FSP-538) - return TableReflection.getTableClass(name) - .orElse(Object.class); - } - - public Class<?> getRecordClass() { - // FIXME: Dersom skjema refererer til en tabell som ikke finnes burde vi stoppe genereringen (FSP-538) - return TableReflection.getRecordClass(name) - .orElse(Object.class); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/mapping/MethodMapping.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/mapping/MethodMapping.java deleted file mode 100644 index 38f50ea7ef..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/mapping/MethodMapping.java +++ /dev/null @@ -1,124 +0,0 @@ -package no.sikt.graphitron.definitions.mapping; - -import no.sikt.graphitron.javapoet.CodeBlock; - -import static no.sikt.graphitron.generators.codebuilding.NameFormat.SUFFIX_RESOLVER_KEY_DTO; -import static no.sikt.graphitron.generators.codebuilding.NameFormat.toCamelCase; -import static no.sikt.graphitron.mappings.JavaPoetClassName.COLLECTORS; -import static org.apache.commons.lang3.StringUtils.capitalize; - -/** - * Stores operations related to rendering get and set method calls. - */ -public class MethodMapping { - private final String name, get, camelGet, set, has, camelHas, setCallPart, setKeyCallPart, hasCallPart, hasIterableCallPart, camelHasCallPart, camelHasIterableCallPart; - private final CodeBlock getCall; - - public MethodMapping(String name) { - this.name = name; - get = "get" + capitalize(name); - getCall = CodeBlock.of(".$L()", get); - camelGet = "get" + capitalize(toCamelCase(name)); - - set = "set" + capitalize(name); - setCallPart = "." + set + "("; - setKeyCallPart = "." + set + SUFFIX_RESOLVER_KEY_DTO + "("; - - has = "has" + capitalize(name); - var hasIterable = has + "s"; - hasCallPart = "." + has + "("; - hasIterableCallPart = "." + hasIterable + "("; - - camelHas = "has" + capitalize(toCamelCase(name)); - var camelHasIterable = camelHas + "s"; - camelHasCallPart = "." + camelHas + "("; - camelHasIterableCallPart = "." + camelHasIterable + "("; - } - - /** - * @return The exact name of the data that this object corresponds to. - */ - public String getName() { - return name; - } - - /** - * @return The name for a get[name] method call. - */ - public String asGet() { - return get; - } - - /** - * @return The name for a get[name] method call. - */ - public String asCamelGet() { - return camelGet; - } - - /** - * @return Format this name as a .get[name]() method call. - */ - public CodeBlock asGetCall() { - return getCall; - } - - /** - * @return The name for a set[name] method call. - */ - public String asSet() { - return set; - } - - /** - * @return Format this name for a .set[name]([input]) method call. - */ - public CodeBlock asSetCall(String input) { - return CodeBlock.statementOf("$L$N)", setCallPart, input); - } - - /** - * @return Format this name for a .set[name]([input]) method call. - */ - public CodeBlock asSetCall(CodeBlock input) { - return CodeBlock.statementOf("$L$L)", setCallPart, input); - } - - public CodeBlock asSetKeyCall(CodeBlock input) { - return CodeBlock.builder().addStatement("$L$L)", setKeyCallPart, input).build(); - } - - /** - * @return The name for a has[name] method call. - */ - public String asHas() { - return has; - } - - /** - * @return The name for a has[name] method call. - */ - public String asCamelHas() { - return camelHas; - } - - /** - * @return Format this name as a .has[name][s]([input]) method call. - */ - public CodeBlock asHasCall(CodeBlock input, boolean iterable) { - if (iterable) { - return CodeBlock.of("$L$L)", hasIterableCallPart, CodeBlock.of("$L.stream().collect($T.toSet())", input, COLLECTORS.className)); - } - return CodeBlock.of("$L$L)", hasCallPart, input); - } - - /** - * @return Format this name as a .has[name][s]([input]) method call. - */ - public CodeBlock asCamelHasCall(CodeBlock input, boolean iterable) { - if (iterable) { - return CodeBlock.of("$L$L)", camelHasIterableCallPart, CodeBlock.of("$L.stream().collect($T.toSet())", input, COLLECTORS.className)); - } - return CodeBlock.of("$L$L)", camelHasCallPart, input); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/mapping/TableRelation.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/mapping/TableRelation.java deleted file mode 100644 index e809c74db3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/mapping/TableRelation.java +++ /dev/null @@ -1,79 +0,0 @@ -package no.sikt.graphitron.definitions.mapping; - -import no.sikt.graphitron.generators.context.JoinListSequence; - -import static no.sikt.graphitron.mappings.TableReflection.inferRelationType; - -public class TableRelation { - private final JOOQMapping from, toTable, key; - private final TableRelationType relationType; - - public TableRelation(JOOQMapping from, JOOQMapping toTable) { - this(from, toTable, null); - } - - public TableRelation(JOOQMapping from, JOOQMapping toTable, JOOQMapping key) { - this.from = from; - this.toTable = toTable; - this.key = key; - - // For cases where relations exist both ways, we need a way to know which one is intended. - relationType = from != null && toTable != null - ? inferRelationType(from.getMappingName(), toTable.getMappingName(), key) - : TableRelationType.NONE; - } - - public JoinListSequence inferJoinStep(JoinListSequence sequence) { - if (sequence.isEmpty()) { - return inferJoinStep(); - } - - switch (relationType) { - case IMPLICIT: - return sequence.cloneAdd(toTable); - case KEY: - if (key != null) { - return sequence.cloneAdd(key); - } - default: - return sequence; // Needs join or some other more advanced inference. - } - } - - private JoinListSequence inferJoinStep() { - switch (relationType) { - case IMPLICIT: - return JoinListSequence.of(from, toTable); - case KEY: - if (key != null) { - return JoinListSequence.of(from, key); - } - default: - return JoinListSequence.of(from); - } - } - - public JOOQMapping getFrom() { - return from; - } - - public JOOQMapping getToTable() { - return toTable; - } - - public TableRelationType getRelationType() { - return relationType; - } - - public boolean hasRelation() { - return relationType != TableRelationType.NONE; - } - - public JOOQMapping getKey() { - return key; - } - - public boolean isReverse() { - return relationType == TableRelationType.REVERSE_IMPLICIT || relationType == TableRelationType.REVERSE_KEY; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/mapping/TableRelationType.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/mapping/TableRelationType.java deleted file mode 100644 index f1dfaa15a0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/mapping/TableRelationType.java +++ /dev/null @@ -1,5 +0,0 @@ -package no.sikt.graphitron.definitions.mapping; - -public enum TableRelationType { - IMPLICIT, REVERSE_IMPLICIT, KEY, REVERSE_KEY, NONE -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/AbstractObjectDefinition.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/AbstractObjectDefinition.java deleted file mode 100644 index 4da47ec5ba..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/AbstractObjectDefinition.java +++ /dev/null @@ -1,82 +0,0 @@ -package no.sikt.graphitron.definitions.objects; - -import no.sikt.graphitron.javapoet.ClassName; -import graphql.language.TypeDefinition; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.definitions.helpers.ClassReference; -import no.sikt.graphitron.definitions.interfaces.FieldSpecification; -import no.sikt.graphitron.definitions.interfaces.ObjectSpecification; - -import java.util.*; -import java.util.function.Function; -import java.util.stream.Collectors; - -import static org.apache.commons.lang3.StringUtils.capitalize; - -/** - * A generalized implementation of {@link ObjectSpecification}. - * Contains functionality that is common between the different kinds of GraphQL objects. - */ -public abstract class AbstractObjectDefinition<T extends TypeDefinition<T>, U extends FieldSpecification> implements ObjectSpecification<U> { - private final String name; - private final ClassReference graphClass; - private final LinkedHashMap<String, U> fieldsByName; - private final T objectDefinition; - - public AbstractObjectDefinition(T objectDefinition) { - this.objectDefinition = objectDefinition; - name = objectDefinition.getName(); - graphClass = new ClassReference(capitalize(name), GeneratorConfig.generatedModelsPackage()); - fieldsByName = createFields(objectDefinition).stream().collect(Collectors.toMap(FieldSpecification::getName, Function.identity(), (x, y) -> y, LinkedHashMap::new)); - } - - @Override - public String getName() { - return name; - } - - @Override - public Class<?> getClassReference() { - return graphClass.getReferenceClass(); - } - - @Override - public ClassName getGraphClassName() { - return graphClass.getClassName(); - } - - protected abstract List<U> createFields(T objectDefinition); - - @Override - public List<U> getFields() { - return new ArrayList<>(fieldsByName.values()); - } - - @Override - public U getFieldByName(String name) { - return fieldsByName.get(name); - } - - /** - * @return Does this object contain this field? - */ - public boolean hasField(String name) { - return fieldsByName.containsKey(name); - } - - public T getObjectDefinition() { - return objectDefinition; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof AbstractObjectDefinition<?, ?> that)) return false; - return Objects.equals(getName(), that.getName()); - } - - @Override - public int hashCode() { - return Objects.hash(getName()); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/ConnectionObjectDefinition.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/ConnectionObjectDefinition.java deleted file mode 100644 index 8856a26450..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/ConnectionObjectDefinition.java +++ /dev/null @@ -1,38 +0,0 @@ -package no.sikt.graphitron.definitions.objects; - -import graphql.language.ObjectTypeDefinition; -import no.sikt.graphitron.definitions.fields.ObjectField; - -import java.util.List; - -/** - * Object that corresponds to a GraphQL type whose name ends with the "Connection" suffix. - * The behaviour of this class should always reflect the <a href="https://relay.dev/graphql/connections.htm">connections specification</a>. - */ -public class ConnectionObjectDefinition extends AbstractObjectDefinition<ObjectTypeDefinition, ObjectField> { - private final EdgeObjectDefinition edgeObject; - - public ConnectionObjectDefinition(ObjectTypeDefinition objectDefinition, EdgeObjectDefinition edgeObject) { - super(objectDefinition); - this.edgeObject = edgeObject; - } - - @Override - protected List<ObjectField> createFields(ObjectTypeDefinition objectDefinition) { - return ObjectField.from(objectDefinition.getFieldDefinitions(), getName()); - } - - /** - * @return The underlying GraphQL object that is referred to within the edge type's node field. - */ - public String getNodeType() { - return edgeObject.getNodeType(); - } - - /** - * @return Edge object for this connection. Defined by the "edges" field on the connection object. - */ - public EdgeObjectDefinition getEdgeObject() { - return edgeObject; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/EdgeObjectDefinition.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/EdgeObjectDefinition.java deleted file mode 100644 index a2894f9d38..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/EdgeObjectDefinition.java +++ /dev/null @@ -1,50 +0,0 @@ -package no.sikt.graphitron.definitions.objects; - -import graphql.language.ObjectTypeDefinition; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphql.naming.GraphQLReservedName; - -import java.util.List; - -/** - * Object that corresponds to a GraphQL type which is referred to by a connection's "edges" field. - * The behaviour of this class should always reflect the <a href="https://relay.dev/graphql/connections.htm">connections specification</a>. - */ -public class EdgeObjectDefinition extends AbstractObjectDefinition<ObjectTypeDefinition, ObjectField> { - private final String nodeType; - private final ObjectField cursor; - - public EdgeObjectDefinition(ObjectTypeDefinition objectDefinition) { - super(objectDefinition); - var fields = ObjectField.from(objectDefinition.getFieldDefinitions(), getName()); - nodeType = getObjectForField(GraphQLReservedName.CONNECTION_NODE_FIELD.getName(), fields).getTypeName(); - cursor = getObjectForField(GraphQLReservedName.CONNECTION_CURSOR_FIELD.getName(), fields); - } - - @Override - protected List<ObjectField> createFields(ObjectTypeDefinition objectDefinition) { - return ObjectField.from(objectDefinition.getFieldDefinitions(), getName()); - } - - private ObjectField getObjectForField(String name, List<ObjectField> fields) { - return fields - .stream() - .filter(it -> it.getName().equalsIgnoreCase(name)) - .findFirst() - .orElseThrow(() -> new IllegalArgumentException(getName() + " has no '" + name + "' field.")); - } - - /** - * @return The underlying GraphQL object name that is referred to by the object's node field. - */ - public String getNodeType() { - return nodeType; - } - - /** - * @return The specification-required cursor field for the edge type. - */ - public ObjectField getCursor() { - return cursor; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/EnumDefinition.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/EnumDefinition.java deleted file mode 100644 index 318d81855f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/EnumDefinition.java +++ /dev/null @@ -1,76 +0,0 @@ -package no.sikt.graphitron.definitions.objects; - -import graphql.language.EnumTypeDefinition; -import no.sikt.graphitron.configuration.externalreferences.CodeReference; -import no.sikt.graphitron.definitions.fields.EnumField; -import no.sikt.graphitron.definitions.interfaces.GenerationTarget; -import no.sikt.graphql.directives.GenerationDirectiveParam; - -import java.util.List; -import java.util.stream.Collectors; - -import static no.sikt.graphql.directives.GenerationDirective.*; - -/** - * Representation of a GraphQL enum type. - */ -public class EnumDefinition extends AbstractObjectDefinition<EnumTypeDefinition, EnumField> implements GenerationTarget { - private final CodeReference enumReference; - - public EnumDefinition(EnumTypeDefinition enumTypeDefinition) { - super(enumTypeDefinition); - this.enumReference = enumTypeDefinition.hasDirective(ENUM.getName()) - ? new CodeReference(enumTypeDefinition, ENUM, GenerationDirectiveParam.ENUM) - : null; - } - - @Override - protected List<EnumField> createFields(EnumTypeDefinition objectDefinition) { - return EnumField.from(objectDefinition, getName()); - } - - /** - * @return Reference to the external Java enum that should correspond to the one in the schema. - */ - public CodeReference getEnumReference() { - return enumReference; - } - - /** - * @return Does this enum map to another enum in the API? - */ - public boolean hasJavaEnumMapping() { - return enumReference != null; - } - - /** - * Creates instances of this class for each of the {@link EnumTypeDefinition} provided. - * @return List of EnumDefinitions. - */ - public static List<EnumDefinition> processEnumDefinitions(List<EnumTypeDefinition> enums) { - return enums - .stream() - .map(EnumDefinition::new) - .collect(Collectors.toList()); - } - - /** - * @return Does this enum have values with @order or @index directives (i.e., it defines sort fields)? - */ - public boolean isOrderByEnum() { - return getObjectDefinition().getEnumValueDefinitions().stream() - .anyMatch(v -> v.hasDirective(ORDER.getName()) || v.hasDirective(INDEX.getName())); - } - - /** - * @return Is this a direction enum (exactly two values: ASC and DESC)? - */ - public boolean isDirectionEnum() { - var values = getObjectDefinition().getEnumValueDefinitions(); - if (values.size() != 2) { - return false; - } - var names = values.stream().map(v -> v.getName().toUpperCase()).sorted().toList(); - return names.equals(List.of("ASC", "DESC")); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/ExceptionDefinition.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/ExceptionDefinition.java deleted file mode 100644 index 09095825f5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/ExceptionDefinition.java +++ /dev/null @@ -1,89 +0,0 @@ -package no.sikt.graphitron.definitions.objects; - -import graphql.language.*; -import no.sikt.graphitron.configuration.ErrorHandlerType; -import no.sikt.graphitron.configuration.ExceptionToErrorMapping; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphql.directives.DirectiveHelpers; -import org.jooq.exception.DataAccessException; - -import java.util.List; -import java.util.stream.Collectors; - -import static no.sikt.graphql.directives.DirectiveHelpers.getObjectFieldByName; -import static no.sikt.graphql.directives.DirectiveHelpers.getOptionalObjectFieldByName; -import static no.sikt.graphql.directives.GenerationDirective.ERROR; -import static no.sikt.graphql.directives.GenerationDirectiveParam.*; - -/** - * Represents the default GraphQL object, parsed as an exception type. - */ -public class ExceptionDefinition extends AbstractObjectDefinition<ObjectTypeDefinition, ObjectField> { - private final boolean isGenerated; - private final List<ExceptionToErrorMapping> exceptionToErrorMappings; - - public ExceptionDefinition(ObjectTypeDefinition objectDefinition) { - super(objectDefinition); - - isGenerated = getFields().stream().anyMatch(ObjectField::isGeneratedWithResolver); - - if (objectDefinition.hasDirective(ERROR.getName())) { - var refrenceDirective = objectDefinition.getDirectives(ERROR.getName()).get(0); - var handlersArgument = refrenceDirective.getArgument(HANDLERS.getName()); - exceptionToErrorMappings = getErrorMappings(handlersArgument.getValue(), objectDefinition); - } else { - exceptionToErrorMappings = List.of(); - } - } - - private static List<ExceptionToErrorMapping> getErrorMappings(Value handlersValue, ObjectTypeDefinition objectDefinition) { - var values = handlersValue instanceof ArrayValue ? ((ArrayValue) handlersValue).getValues() : List.of(((ObjectValue) handlersValue)); - - return values.stream() - .filter(value -> value instanceof ObjectValue) - .map(value -> { - var objectFields = ((ObjectValue) value).getObjectFields(); - ErrorHandlerType handler = ErrorHandlerType.valueOf(((EnumValue) getObjectFieldByName(objectFields, HANDLER).getValue()).getName()); - return new ExceptionToErrorMapping( - handler, - getOptionalObjectFieldByName(objectFields, CLASS_NAME).map(DirectiveHelpers::stringValueOf).orElseGet( - () -> { - if (handler == ErrorHandlerType.DATABASE) { - return DataAccessException.class.getName(); - } - throw new IllegalArgumentException("'" + CLASS_NAME.getName() + "´ directive argument must be defined for error handler of type " + handler); - }), - objectDefinition.getName(), - getOptionalObjectFieldByName(objectFields, CODE).map(DirectiveHelpers::stringValueOf).orElse(null), - getOptionalObjectFieldByName(objectFields, SQL_STATE).map(DirectiveHelpers::stringValueOf).orElse(null), - getOptionalObjectFieldByName(objectFields, MATCHES).map(DirectiveHelpers::stringValueOf).orElse(null), - getOptionalObjectFieldByName(objectFields, DESCRIPTION).map(DirectiveHelpers::stringValueOf).orElse(null) - ); - }).collect(Collectors.toList()); - - } - - @Override - protected List<ObjectField> createFields(ObjectTypeDefinition objectDefinition) { - return ObjectField.from(objectDefinition.getFieldDefinitions(), getName()); - } - - public boolean isGenerated() { - return isGenerated; - } - - /** - * Creates instances of this class for each of the {@link ObjectTypeDefinition} provided. - * @return List of ObjectDefinitions. - */ - public static List<ExceptionDefinition> processObjectDefinitions(List<ObjectTypeDefinition> objects) { - return objects - .stream() - .map(ExceptionDefinition::new) - .collect(Collectors.toList()); - } - - public List<ExceptionToErrorMapping> getExceptionToErrorMappings() { - return exceptionToErrorMappings; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/InputDefinition.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/InputDefinition.java deleted file mode 100644 index 459307f109..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/InputDefinition.java +++ /dev/null @@ -1,53 +0,0 @@ -package no.sikt.graphitron.definitions.objects; - -import graphql.language.InputObjectTypeDefinition; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.definitions.fields.InputField; - -import java.util.LinkedHashSet; -import java.util.List; -import java.util.stream.Collectors; - -/** - * Represents a default GraphQL input type. - */ -public class InputDefinition extends RecordObjectDefinition<InputObjectTypeDefinition, InputField> { - private final LinkedHashSet<String> lookupInputs; - private final boolean containsLookupKey; - - public InputDefinition(InputObjectTypeDefinition inputType) { - super(inputType); - lookupInputs = getFields().stream().filter(InputField::isLookupKey).map(InputField::getName).collect(Collectors.toCollection(LinkedHashSet::new)); - containsLookupKey = !lookupInputs.isEmpty(); - } - - @Override - protected List<InputField> createFields(InputObjectTypeDefinition inputType) { - return InputField.from(inputType.getInputValueDefinitions(), getName()); - } - - /** - * @return Inputs set to be used as keys for lookup operations. - */ - public LinkedHashSet<String> getLookupKeys() { - return lookupInputs; - } - - /** - * @return Does this input type contain a field that is a key for a lookup operation? - */ - public boolean containsLookupKey() { - return containsLookupKey; - } - - /** - * Creates instances of this class for each of the {@link InputObjectTypeDefinition} provided. - * @return List of InputDefinitions. - */ - public static List<InputDefinition> processInputDefinitions(List<InputObjectTypeDefinition> inputs) { - return inputs - .stream() - .map(InputDefinition::new) - .collect(Collectors.toList()); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/InterfaceDefinition.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/InterfaceDefinition.java deleted file mode 100644 index 56b7be9aa3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/InterfaceDefinition.java +++ /dev/null @@ -1,131 +0,0 @@ -package no.sikt.graphitron.definitions.objects; - -import graphql.language.InterfaceTypeDefinition; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.interfaces.GenerationTarget; -import no.sikt.graphitron.definitions.interfaces.RecordObjectSpecification; -import no.sikt.graphitron.definitions.interfaces.TypeResolverTarget; -import no.sikt.graphitron.definitions.mapping.JOOQMapping; -import no.sikt.graphitron.javapoet.ClassName; -import no.sikt.graphql.directives.GenerationDirective; -import no.sikt.graphql.federation.fieldsets.FederationFieldSet; - -import java.util.List; - -import static no.sikt.graphql.directives.DirectiveHelpers.getDirectiveArgumentString; -import static no.sikt.graphql.directives.DirectiveHelpers.getOptionalDirectiveArgumentString; -import static no.sikt.graphql.directives.GenerationDirective.NOT_GENERATED; -import static no.sikt.graphql.directives.GenerationDirectiveParam.NAME; -import static no.sikt.graphql.directives.GenerationDirectiveParam.ON; - -/** - * Represents a GraphQL interface. - */ -public class InterfaceDefinition extends AbstractObjectDefinition<InterfaceTypeDefinition, ObjectField> implements TypeResolverTarget, RecordObjectSpecification<ObjectField> { - private final JOOQMapping table; - private final boolean isGenerated, hasTable, hasDiscriminator, createsDataFetchers; - private final String discriminatorFieldName; - - public InterfaceDefinition(InterfaceTypeDefinition typeDefinition) { - super(typeDefinition); - isGenerated = !typeDefinition.hasDirective(NOT_GENERATED.getName()); - hasTable = typeDefinition.hasDirective(GenerationDirective.TABLE.getName()); - table = hasTable - ? JOOQMapping.fromTable(getOptionalDirectiveArgumentString(typeDefinition, GenerationDirective.TABLE, NAME).orElse(getName().toUpperCase())) - : null; - - hasDiscriminator = typeDefinition.hasDirective(GenerationDirective.DISCRIMINATE.getName()); - discriminatorFieldName = hasDiscriminator ? getDirectiveArgumentString(typeDefinition, GenerationDirective.DISCRIMINATE, ON) : null; - createsDataFetchers = getFields().stream().anyMatch(GenerationTarget::isGeneratedWithResolver); - } - - @Override - protected List<ObjectField> createFields(InterfaceTypeDefinition objectDefinition) { - return ObjectField.from(objectDefinition.getFieldDefinitions(), getName()); - } - - public boolean hasTable() { - return hasTable; - } - - public boolean isMultiTableInterface() { - return !hasTable; - } - - public JOOQMapping getTable() { - return table; - } - - public boolean hasDiscriminator() { - return hasDiscriminator; - } - - public String getDiscriminatorFieldName() { - return discriminatorFieldName; - } - - @Override - public Class<?> getRecordReference() { - return null; - } - - @Override - public String getRecordReferenceName() { - return null; - } - - @Override - public ClassName getRecordClassName() { - return null; - } - - @Override - public boolean hasJavaRecordReference() { - return false; - } - - @Override - public boolean hasRecordReference() { - return false; - } - - @Override - public ClassName asSourceClassName(boolean toRecord) { - return null; - } - - @Override - public ClassName asTargetClassName(boolean toRecord) { - return null; - } - - @Override - public String asRecordName() { - return null; - } - - @Override - public boolean isEntity() { - return false; - } - - @Override - public FederationFieldSet getEntityKeys() { - return null; - } - - @Override - public boolean isGenerated() { - return isGenerated; - } - - @Override - public boolean isGeneratedWithResolver() { - return createsDataFetchers; - } - - @Override - public boolean isExplicitlyNotGenerated() { - return !isGenerated; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/ObjectDefinition.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/ObjectDefinition.java deleted file mode 100644 index 0d67ee4672..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/ObjectDefinition.java +++ /dev/null @@ -1,105 +0,0 @@ -package no.sikt.graphitron.definitions.objects; - -import graphql.language.ObjectTypeDefinition; -import graphql.language.TypeName; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.interfaces.GenerationTarget; -import no.sikt.graphitron.mappings.TableReflection; -import no.sikt.graphql.directives.GenerationDirective; -import no.sikt.graphql.directives.GenerationDirectiveParam; - -import java.util.LinkedHashSet; -import java.util.List; -import java.util.stream.Collectors; - -import static no.sikt.graphitron.mappings.TableReflection.getJavaFieldName; -import static no.sikt.graphql.directives.DirectiveHelpers.*; -import static no.sikt.graphql.directives.GenerationDirective.NODE; -import static no.sikt.graphql.directives.GenerationDirectiveParam.VALUE; -import static no.sikt.graphql.naming.GraphQLReservedName.SCHEMA_MUTATION; -import static no.sikt.graphql.naming.GraphQLReservedName.SCHEMA_QUERY; - -/** - * Represents the default GraphQL object. - * Objects which do not fall within a different object category will become instances of this class. - * This is typically the only object type used in table referencing and joining operations. - */ -public class ObjectDefinition extends RecordObjectDefinition<ObjectTypeDefinition, ObjectField> { - private final boolean isRoot, hasDiscriminator; - private final LinkedHashSet<String> implementsInterfaces; - private final ObjectTypeDefinition objectTypeDefinition; - private final String discriminator; - - public ObjectDefinition(ObjectTypeDefinition objectDefinition) { - super(objectDefinition); - - isRoot = isRootType(objectDefinition); - implementsInterfaces = objectDefinition.getImplements().stream() - .map(it -> ((TypeName) it).getName()) - .collect(Collectors.toCollection(LinkedHashSet::new)); - objectTypeDefinition = objectDefinition; - hasDiscriminator = objectDefinition.hasDirective(GenerationDirective.DISCRIMINATOR.getName()); - discriminator = hasDiscriminator ? getDirectiveArgumentString(objectDefinition, GenerationDirective.DISCRIMINATOR, VALUE) : null; - } - - @Override - protected List<ObjectField> createFields(ObjectTypeDefinition objectDefinition) { - var definitions = objectDefinition.getFieldDefinitions(); - return ObjectField.from(definitions, getName()); - } - - private boolean isRootType(ObjectTypeDefinition objectDefinition) { - return objectDefinition.getName().equalsIgnoreCase(SCHEMA_QUERY.getName()) - || objectDefinition.getName().equalsIgnoreCase(SCHEMA_MUTATION.getName()); - } - - /** - * @return Is this object the top node? That should be either the Query or the Mutation type. - */ - @Override - public boolean isOperationRoot() { - return isRoot; - } - - /** - * @return The original interpretation of this object as provided by GraphQL. - */ - public ObjectTypeDefinition getTypeDefinition() { - return objectTypeDefinition; - } - - @Override - public boolean isGeneratedWithResolver() { - return getFields().stream().anyMatch(GenerationTarget::isGeneratedWithResolver); - } - - /** - * Creates instances of this class for each of the {@link ObjectTypeDefinition} provided. - * @return List of ObjectDefinitions. - */ - public static List<ObjectDefinition> processObjectDefinitions(List<ObjectTypeDefinition> objects) { - return objects - .stream() - .map(ObjectDefinition::new) - .collect(Collectors.toList()); - } - - /** - * @return Does this object implement this interface? - */ - public boolean implementsInterface(String interfaceName) { - return implementsInterfaces.contains(interfaceName); - } - - public LinkedHashSet<String> getImplementedInterfaces() { - return implementsInterfaces; - } - - public String getDiscriminator() { - return discriminator; - } - - public boolean hasDiscriminator() { - return hasDiscriminator; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/OrderByEnumDefinition.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/OrderByEnumDefinition.java deleted file mode 100644 index 9da048c430..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/OrderByEnumDefinition.java +++ /dev/null @@ -1,25 +0,0 @@ -package no.sikt.graphitron.definitions.objects; - -import graphql.language.EnumTypeDefinition; -import no.sikt.graphitron.definitions.fields.OrderByEnumField; - -import java.util.List; - -/** - * Representation of an OrderBy enum type. - */ -public class OrderByEnumDefinition extends AbstractObjectDefinition<EnumTypeDefinition, OrderByEnumField> { - - public OrderByEnumDefinition(EnumTypeDefinition enumTypeDefinition) { - super(enumTypeDefinition); - } - - public static OrderByEnumDefinition from(EnumDefinition it) { - return new OrderByEnumDefinition(it.getObjectDefinition()); - } - - @Override - protected List<OrderByEnumField> createFields(EnumTypeDefinition objectDefinition) { - return OrderByEnumField.from(objectDefinition, getName()); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/RecordObjectDefinition.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/RecordObjectDefinition.java deleted file mode 100644 index 3328348931..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/RecordObjectDefinition.java +++ /dev/null @@ -1,206 +0,0 @@ -package no.sikt.graphitron.definitions.objects; - -import graphql.language.TypeDefinition; -import no.sikt.graphitron.configuration.externalreferences.CodeReference; -import no.sikt.graphitron.definitions.helpers.ClassReference; -import no.sikt.graphitron.definitions.helpers.NodeConfiguration; -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.definitions.interfaces.GenerationTarget; -import no.sikt.graphitron.definitions.interfaces.ObjectSpecification; -import no.sikt.graphitron.definitions.interfaces.RecordObjectSpecification; -import no.sikt.graphitron.definitions.mapping.JOOQMapping; -import no.sikt.graphitron.generators.codebuilding.NameFormat; -import no.sikt.graphitron.javapoet.ClassName; -import no.sikt.graphitron.mappings.TableReflection; -import no.sikt.graphql.directives.GenerationDirective; -import no.sikt.graphql.directives.GenerationDirectiveParam; -import no.sikt.graphql.federation.fieldsets.FederationFieldSet; -import org.jetbrains.annotations.NotNull; - -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static no.sikt.graphitron.mappings.TableReflection.getRequiredFields; -import static no.sikt.graphql.directives.DirectiveHelpers.getOptionalDirectiveArgumentString; -import static no.sikt.graphql.directives.DirectiveHelpers.getRepeatableDirectiveArgumentString; -import static no.sikt.graphql.directives.GenerationDirective.*; -import static no.sikt.graphql.directives.GenerationDirectiveParam.NAME; -import static no.sikt.graphql.naming.GraphQLReservedName.FEDERATION_KEY; -import static no.sikt.graphql.naming.GraphQLReservedName.FEDERATION_KEY_FIELDS; - -/** - * A generalized implementation of {@link ObjectSpecification} for types that can be linked to tables or records. - */ -public abstract class RecordObjectDefinition<T extends TypeDefinition<T>, U extends GenerationField> extends AbstractObjectDefinition<T, U> implements RecordObjectSpecification<U> { - private final JOOQMapping table; - private final boolean hasTable, usesJavaRecord, isGenerated, hasResolvers, explicitlyNotGenerated, hasKeys, hasNodeDirective; - private final ClassReference classReference; - private final List<U> inputsSortedByNullability; - private final LinkedHashSet<String> requiredInputs; - private final FederationFieldSet keys; - private final NodeConfiguration nodeConfiguration; - - public RecordObjectDefinition(T objectDefinition) { - super(objectDefinition); - hasTable = objectDefinition.hasDirective(GenerationDirective.TABLE.getName()); - table = hasTable - ? JOOQMapping.fromTable(getOptionalDirectiveArgumentString(objectDefinition, GenerationDirective.TABLE, NAME).orElse(getName().toUpperCase())) - : null; - - isGenerated = getFields().stream().anyMatch(GenerationTarget::isGenerated); - hasResolvers = getFields().stream().anyMatch(GenerationTarget::isGeneratedWithResolver); - explicitlyNotGenerated = objectDefinition.hasDirective(NOT_GENERATED.getName()); - usesJavaRecord = objectDefinition.hasDirective(RECORD.getName()); - if (usesJavaRecord) { - classReference = new ClassReference(new CodeReference(objectDefinition, RECORD, GenerationDirectiveParam.RECORD, objectDefinition.getName())); - } else if (hasTable) { - classReference = new ClassReference(table.getRecordClass()); - } else { - classReference = null; - } - requiredInputs = hasTable() ? getRequiredFields(getTable().getMappingName()).stream().map(String::toUpperCase).collect(Collectors.toCollection(LinkedHashSet::new)) : new LinkedHashSet<>(); - inputsSortedByNullability = sortInputsByNullability(); - hasKeys = objectDefinition.hasDirective(FEDERATION_KEY.getName()); - keys = hasKeys ? FederationFieldSet.fromString(getRepeatableDirectiveArgumentString(objectDefinition, FEDERATION_KEY.getName(), FEDERATION_KEY_FIELDS.getName())) : null; - - hasNodeDirective = objectDefinition.hasDirective(NODE.getName()); - - if (hasNodeDirective) { - nodeConfiguration = new NodeConfiguration(objectDefinition, getTable()); - } else { - nodeConfiguration = null; - } - } - - @NotNull - private List<U> sortInputsByNullability() { - var splitOnIsRequired = getFields().stream().collect(Collectors.partitioningBy(this::isNonNullable)); - return Stream.concat(splitOnIsRequired.get(false).stream(), splitOnIsRequired.get(true).stream()).toList(); - } - - /** - * @return Is this field non-nullable in the database? - */ - protected boolean isNonNullable(GenerationField field) { - if (field.isID() && hasTable()) { - var idFields = TableReflection.getRequiredFields(getTable().getMappingName()).stream() - .map(String::toUpperCase) - .toList(); - if (!idFields.isEmpty()) { - if (requiredInputs.containsAll(idFields)) { - return true; - } - } - } - return requiredInputs.contains(field.getUpperCaseName()); - } - - @Override - public boolean createsDataFetcher() { - return hasResolvers; - } - - @Override - public boolean createsDataFetchersForFields() { - return hasResolvers; - } - - @Override - public boolean isGenerated() { - return isGenerated; - } - - @Override - public boolean isGeneratedWithResolver() { - return hasResolvers; - } - - @Override - public boolean isExplicitlyNotGenerated() { - return explicitlyNotGenerated; - } - - @Override - public JOOQMapping getTable() { - return table; - } - - @Override - public boolean hasTable() { - return hasTable; - } - - @Override - public Class<?> getRecordReference() { - return hasRecordReference() ? classReference.getReferenceClass() : null; - } - - @Override - public String getRecordReferenceName() { - return hasRecordReference() ? classReference.getClassNameString() : null; - } - - @Override - public ClassName getRecordClassName() { - return hasRecordReference() ? classReference.getClassName() : null; - } - - @Override - public boolean hasJavaRecordReference() { - return usesJavaRecord; - } - - @Override - public boolean hasRecordReference() { - return classReference != null; - } - - @Override - public ClassName asSourceClassName(boolean toRecord) { - return toRecord ? getGraphClassName() : getRecordClassName(); - } - - @Override - public ClassName asTargetClassName(boolean toRecord) { - return toRecord ? getRecordClassName() : getGraphClassName(); - } - - @Override - public String asRecordName() { - return hasJavaRecordReference() || hasTable ? getRecordReferenceName() : NameFormat.asRecordName(getName()); - } - - /** - * @return List of input fields contained within this input type, sorted by whether they are nullable fields. - */ - public List<U> getInputsSortedByNullability() { - return inputsSortedByNullability; - } - - protected LinkedHashSet<String> getRequiredInputs() { - return requiredInputs; - } - - @Override - public boolean isEntity() { - return hasKeys; - } - - @Override - public FederationFieldSet getEntityKeys() { - return keys; - } - - @Override - public boolean hasNodeDirective() { - return hasNodeDirective; - } - - @Override - public Optional<NodeConfiguration> getNodeConfiguration() { - return Optional.ofNullable(nodeConfiguration); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/SchemaDefinition.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/SchemaDefinition.java deleted file mode 100644 index c216406bfa..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/SchemaDefinition.java +++ /dev/null @@ -1,75 +0,0 @@ -package no.sikt.graphitron.definitions.objects; - -import no.sikt.graphitron.definitions.interfaces.GenerationTarget; -import no.sikt.graphitron.javapoet.ClassName; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.definitions.fields.OperationField; -import no.sikt.graphitron.definitions.helpers.ClassReference; -import no.sikt.graphitron.definitions.interfaces.FieldSpecification; -import no.sikt.graphitron.definitions.interfaces.ObjectSpecification; - -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.function.Function; -import java.util.stream.Collectors; - -import static no.sikt.graphql.naming.GraphQLReservedName.*; -import static org.apache.commons.lang3.StringUtils.capitalize; - -/** - * Represents the top schema object in GraphQL. - */ -public class SchemaDefinition implements ObjectSpecification<OperationField>, GenerationTarget { - private final static String name = SCHEMA.getName(); - private final LinkedHashMap<String, OperationField> fieldsByName; - private final ClassReference graphClass; - private final OperationField query; - private final OperationField mutation; - // private final OperationField subscription; - - public SchemaDefinition(graphql.language.SchemaDefinition definition) { - graphClass = new ClassReference(capitalize(name), GeneratorConfig.generatedModelsPackage()); - fieldsByName = definition - .getOperationTypeDefinitions() - .stream() - .map(OperationField::new) - .collect(Collectors.toMap(FieldSpecification::getName, Function.identity(), (x, y) -> y, LinkedHashMap::new)); - query = fieldsByName.values().stream().filter(it -> it.getName().equals(OPERATION_QUERY.getName())).findFirst().orElse(null); - mutation = fieldsByName.values().stream().filter(it -> it.getName().equals(OPERATION_MUTATION.getName())).findFirst().orElse(null); - // subscription = fieldsByName.values().stream().filter(it -> it.getName().equals(OPERATION_SUBSCRIPTION.getName())).findFirst().orElse(null); - } - - @Override - public String getName() { - return name; - } - - @Override - public Class<?> getClassReference() { - return graphClass.getReferenceClass(); - } - - @Override - public ClassName getGraphClassName() { - return graphClass.getClassName(); - } - - @Override - public List<OperationField> getFields() { - return new ArrayList<>(fieldsByName.values()); - } - - @Override - public OperationField getFieldByName(String name) { - return fieldsByName.get(name); - } - - public OperationField getQuery() { - return query; - } - - public OperationField getMutation() { - return mutation; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/UnionDefinition.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/UnionDefinition.java deleted file mode 100644 index 9dc39a3f86..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/objects/UnionDefinition.java +++ /dev/null @@ -1,75 +0,0 @@ -package no.sikt.graphitron.definitions.objects; - -import graphql.language.TypeName; -import graphql.language.UnionTypeDefinition; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.interfaces.RecordObjectSpecification; -import no.sikt.graphitron.definitions.interfaces.TypeResolverTarget; - -import java.util.List; -import java.util.stream.Collectors; - -import static no.sikt.graphql.directives.GenerationDirective.NOT_GENERATED; - -/** - * Represents a GraphQL union type. - */ -public class UnionDefinition extends RecordObjectDefinition<UnionTypeDefinition, ObjectField> implements TypeResolverTarget, RecordObjectSpecification<ObjectField> { - private final List<String> fieldTypeNames; - private final boolean isGenerated; - - public UnionDefinition(UnionTypeDefinition typeDefinition) { - super(typeDefinition); - fieldTypeNames = typeDefinition - .getMemberTypes() - .stream() - .map(it -> ((TypeName)it).getName()) - .collect(Collectors.toList()); - isGenerated = !typeDefinition.hasDirective(NOT_GENERATED.getName()); - } - - /** - * @return List of type names this union consists of. - */ - public List<String> getFieldTypeNames() { - return fieldTypeNames; - } - - /** - * Creates instances of this class for each of the {@link UnionTypeDefinition} provided. - * @return List of ObjectDefinitions. - */ - public static List<UnionDefinition> processUnionDefinitions(List<UnionTypeDefinition> objects) { - return objects.stream().map(UnionDefinition::new).collect(Collectors.toList()); - } - - @Override - protected List<ObjectField> createFields(UnionTypeDefinition objectDefinition) { - return List.of(); - } - - @Override - public List<ObjectField> getFields() { - return List.of(); - } - - @Override - public ObjectField getFieldByName(String name) { - return null; - } - - @Override - public boolean isGenerated() { - return isGenerated; - } - - @Override - public boolean isGeneratedWithResolver() { - return isGenerated; - } - - @Override - public boolean isExplicitlyNotGenerated() { - return !isGenerated; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/sql/SQLAlias.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/sql/SQLAlias.java deleted file mode 100644 index 77d89d27bf..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/sql/SQLAlias.java +++ /dev/null @@ -1,68 +0,0 @@ -package no.sikt.graphitron.definitions.sql; - -import java.util.Objects; - -/** - * For multiple joins on the same table, aliases are required to distinguish them. - */ -public class SQLAlias { - private final String joinTargetMethod, name, joinSourceTable, shortName, rendered; - - /** - * @param joinTargetMethod The table to be joined with, using the provided method. - * @param joinSourceTable The table to be joined from. - */ - public SQLAlias(String name, String shortName, String joinTargetMethod, String joinSourceTable) { - this.joinSourceTable = joinSourceTable; - this.joinTargetMethod = joinTargetMethod; - this.name = name.replaceAll("[.]", "_").replaceAll("[()]", ""); - this.shortName = shortName; - rendered = "var " + this.name + " = " + joinSourceTable + "." + joinTargetMethod + "().as(\"" + shortName + "\")"; - } - - /** - * @return Source table to join from. The "left" side of a join statement. - */ - public String getJoinSourceTable() { - return joinSourceTable; - } - - /** - * @return The target table to be joined with. The "right" side of a join statement. - */ - public String getJoinTargetMethod() { - return joinTargetMethod; - } - - /** - * @return The alias to be used to uniquely distinguish this join operation. - */ - public String getName() { - return name; - } - - /** - * @return Shortened alias name that will not exceed the max character limit for aliases. - */ - public String getShortName() { - return shortName; - } - - @Override - public String toString() { - return rendered; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof SQLAlias)) return false; - SQLAlias sqlAlias = (SQLAlias) o; - return Objects.equals(joinTargetMethod, sqlAlias.joinTargetMethod) && Objects.equals(name, sqlAlias.name) && Objects.equals(joinSourceTable, sqlAlias.joinSourceTable); - } - - @Override - public int hashCode() { - return Objects.hash(joinTargetMethod, name, joinSourceTable); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/sql/SQLCondition.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/sql/SQLCondition.java deleted file mode 100644 index 5eba21fdcb..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/sql/SQLCondition.java +++ /dev/null @@ -1,90 +0,0 @@ -package no.sikt.graphitron.definitions.sql; - -import graphql.language.DirectivesContainer; -import graphql.language.NamedNode; -import no.sikt.graphitron.definitions.helpers.CodeReferenceWrapper; -import no.sikt.graphitron.generators.codebuilding.VariablePrefix; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.configuration.externalreferences.CodeReference; -import no.sikt.graphql.directives.GenerationDirective; -import no.sikt.graphql.directives.GenerationDirectiveParam; -import org.apache.commons.lang3.StringUtils; - -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -import static no.sikt.graphql.directives.DirectiveHelpers.getOptionalDirectiveArgumentBoolean; -import static no.sikt.graphql.directives.GenerationDirectiveParam.OVERRIDE; - -public class SQLCondition extends CodeReferenceWrapper { - private final boolean override; - - public SQLCondition(CodeReference conditionReference) { - super(conditionReference); - this.override = false; - } - - public <T extends NamedNode<T> & DirectivesContainer<T>> SQLCondition(T field) { - super(field, GenerationDirective.CONDITION, GenerationDirectiveParam.CONDITION); - this.override = getOptionalDirectiveArgumentBoolean(field, GenerationDirective.CONDITION, OVERRIDE).orElse(false); - } - - public CodeBlock formatToString(List<CodeBlock> methodInputs) { - var reference = getReference(); - var methods = GeneratorConfig.getExternalReferences().getMethodsFrom(reference); - var methodName = reference.getMethodName(); - if (methods.isEmpty()) { - throw new IllegalArgumentException( - "Condition reference " + - GeneratorConfig.getExternalReferences().getClassFrom(reference).getName() + - " does not contain method named " + methodName - ); - } - - var inputSize = methodInputs.size() + getContextFields().size(); - var method = methods.stream().filter(it -> it.getParameterTypes().length == inputSize).findFirst(); - if (method.isEmpty()) { - var declaringName = methods.stream().findAny().get().getDeclaringClass().getName(); - var possibleInputs = methods - .stream() - .map(it -> Arrays.stream(it.getParameterTypes()).map(Class::getCanonicalName).collect(Collectors.joining(", "))) - .collect(Collectors.joining(" or ")); - throw new IllegalArgumentException( - String.format( - "Wrong number of inputs for method '%s' in class '%s'.\nInputs were %s, but expected %s.", - methodName, - declaringName, - CodeBlock.join(", ", methodInputs).toString(), - possibleInputs - ) - ); - } - - var declaringName = method.get().getDeclaringClass().getName(); - var contextFields = getContextFields(); - return CodeBlock - .builder() - .add("$N.$L(", declaringName, methodName) - .add(StringUtils.repeat("$L", ", ", methodInputs.size()), methodInputs.toArray()) - .addIf(!contextFields.isEmpty(), ", ") - .add(StringUtils.repeat("$L", ", ", contextFields.size()), contextFields.keySet().stream().map(VariablePrefix::contextFieldPrefix).toList().toArray()) - .add(")") - .build(); - } - - public boolean isOverride() { - return override; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) return true; - if (obj instanceof SQLCondition) { - return ((SQLCondition) obj).getReference().equals(this.getReference()) && ((SQLCondition) obj).isOverride() == this.isOverride(); - } else { - return false; - } - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/sql/SQLJoin.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/sql/SQLJoin.java deleted file mode 100644 index 68159f607a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/sql/SQLJoin.java +++ /dev/null @@ -1,69 +0,0 @@ -package no.sikt.graphitron.definitions.sql; - -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.generators.context.JoinListSequence; - -import java.util.List; -import java.util.stream.Collectors; - -/** - * Contains information on how to format join operations, including what type of join to use and which columns should be compared. - * This class contains only information on the join source, and needs to be provided the target table in order to produce - * a full join statement. - * <p> - * This class is intended as a temporary stage before the final target table and aliases are determined, - * as these may depend on additional graph paths that must be evaluated first, and can not be directly inferred from a single field and its directives. - */ -public class SQLJoin { - private final List<SQLJoinField> joinFields; - private final SQLJoinType joinType; - private final JoinListSequence joinSequence; - - /** - * @param joinSequence The "left" side of a join statement. This is the table to be joined from. - * @param joinFields List of any conditions for the join operation. - * @param nullable What kind of join operation is to be used. - */ - public SQLJoin(JoinListSequence joinSequence, List<SQLJoinField> joinFields, boolean nullable) { - // Remember to sort so that the key join always comes first. - this.joinFields = joinFields.stream().sorted().collect(Collectors.toList()); - this.joinSequence = joinSequence; - this.joinType = nullable ? SQLJoinType.LEFT : SQLJoinType.JOIN; - } - - /** - * @return List of column or key comparisons used to construct the join statement. - */ - public List<SQLJoinField> getJoinFields() { - return joinFields; - } - - /** - * @return What kind of join operation is to be used. - */ - public SQLJoinType getJoinType() { - return joinType; - } - - /** - * @return Source table to join from. The "left" side of a join statement. - */ - public JoinListSequence getJoinSequence() { - return joinSequence; - } - - /** - * @param aliasName The name of the table alias to be used for this particular join statement. - * @return A string that contains a complete join statement followed by all conditions set for this join. - */ - public CodeBlock toJoinString(String aliasName) { - var code = CodeBlock.builder().add(".$L($N)\n", joinType == SQLJoinType.LEFT ? "leftJoin" : "join", aliasName); - - var fields = getJoinFields(); - for (int i = 0; i < fields.size(); i++) { - var joinField = fields.get(i); - code.add(".$L($L)\n", i == 0 ? joinField.getMethodCallName() : "and", joinField.toJoinString(joinSequence, aliasName)); - } - return code.build(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/sql/SQLJoinField.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/sql/SQLJoinField.java deleted file mode 100644 index 349a1a11db..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/sql/SQLJoinField.java +++ /dev/null @@ -1,38 +0,0 @@ -package no.sikt.graphitron.definitions.sql; - -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.generators.context.JoinListSequence; -import org.jetbrains.annotations.NotNull; - -/** - * Abstraction that allows to apply different join conditions more smoothly. - * Join conditions are ordered such that the conditions appear in the order required by jOOQ. - * The limitation is that there can be only one "onKey" condition, and it must be called first, before any "on" conditions. - */ -public abstract class SQLJoinField implements Comparable<SQLJoinField> { - private final static int orderingPriority = 1; - - /** - * @return Ordering priority for this type of join condition. - */ - public int getOrderingPriority() { - return orderingPriority; - } - - @Override - public int compareTo(@NotNull SQLJoinField o) { - return Integer.compare(getOrderingPriority(), o.getOrderingPriority()); - } - - /** - * @return The name of the jOOQ method that corresponds to this condition. - */ - abstract public String getMethodCallName(); - - /** - * @param joinSequence The source from which the join is originating. In other words, the left side of the join. - * @param aliasName The name of the table alias to be used for this particular join statement. - * @return A CodeBlock that contains a complete condition statement. - */ - abstract public CodeBlock toJoinString(JoinListSequence joinSequence, String aliasName); -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/sql/SQLJoinOnCondition.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/sql/SQLJoinOnCondition.java deleted file mode 100644 index bc032c0747..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/sql/SQLJoinOnCondition.java +++ /dev/null @@ -1,34 +0,0 @@ -package no.sikt.graphitron.definitions.sql; - -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.generators.context.JoinListSequence; - -import java.util.List; - -/** - * SQL join condition which joins using an external condition method. - */ -public class SQLJoinOnCondition extends SQLJoinField { - private final static String JOOQ_METHOD_CALL = "on"; - private final static int orderingPriority = 1; - private final SQLCondition condition; - - public SQLJoinOnCondition(SQLCondition condition) { - this.condition = condition; - } - - @Override - public int getOrderingPriority() { - return orderingPriority; - } - - @Override - public String getMethodCallName() { - return JOOQ_METHOD_CALL; - } - - @Override - public CodeBlock toJoinString(JoinListSequence joinSequence, String aliasName) { - return condition.formatToString(List.of(joinSequence.render(), CodeBlock.of(aliasName))); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/sql/SQLJoinOnKey.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/sql/SQLJoinOnKey.java deleted file mode 100644 index ff7b98e926..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/sql/SQLJoinOnKey.java +++ /dev/null @@ -1,42 +0,0 @@ -package no.sikt.graphitron.definitions.sql; - -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.definitions.mapping.JOOQMapping; -import no.sikt.graphitron.generators.context.JoinListSequence; - -/** - * SQL join condition which joins on a single key generated by jOOQ, referred to by name. - */ -public class SQLJoinOnKey extends SQLJoinField { - private final static String JOOQ_METHOD_CALL = "onKey"; - private final static int orderingPriority = 0; // onKey MUST be first. - private final JOOQMapping key; - - /** - * @param key The name of a key generated by jOOQ. - */ - public SQLJoinOnKey(JOOQMapping key) { - this.key = key; - } - - /** - * @return jOOQ name of the key. - */ - public JOOQMapping getKey() { - return key; - } - - public int getOrderingPriority() { - return orderingPriority; - } - - @Override - public String getMethodCallName() { - return JOOQ_METHOD_CALL; - } - - @Override - public CodeBlock toJoinString(JoinListSequence joinSequence, String aliasName) { - return CodeBlock.of(getKey().getMappingName()); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/sql/SQLJoinStatement.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/sql/SQLJoinStatement.java deleted file mode 100644 index 5d345efbbc..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/sql/SQLJoinStatement.java +++ /dev/null @@ -1,93 +0,0 @@ -package no.sikt.graphitron.definitions.sql; - -import no.sikt.graphitron.definitions.interfaces.JoinElement; -import no.sikt.graphitron.definitions.mapping.AliasWrapper; -import no.sikt.graphitron.definitions.mapping.JOOQMapping; -import no.sikt.graphitron.generators.context.JoinListSequence; -import no.sikt.graphitron.javapoet.CodeBlock; - -import java.util.List; -import java.util.Objects; - -/** - * An extension of {@link SQLJoin} with additional data on which table to join towards and which alias should be used. - * This class then contains all the information necessary to construct a complete join statement. - */ -public class SQLJoinStatement extends SQLJoin { - private final JoinElement joinTargetTable; - private final String comparableJoinString; - private final AliasWrapper joinAlias; - private final CodeBlock joinString; - private final JOOQMapping key; - - /** - * @param joinTargetTable The "right" side of a join statement. This is the table to be joined with. - * @param joinFields List of any conditions for the join operation. - * @param nullable What kind of join operation is to be used. - */ - public SQLJoinStatement(JoinListSequence joinSequence, JoinElement joinTargetTable, AliasWrapper joinAlias, List<SQLJoinField> joinFields, boolean nullable) { - this(joinSequence, joinTargetTable, joinAlias, joinFields, nullable, null); - } - - /** - * @param joinTargetTable The "right" side of a join statement. This is the table to be joined with. - * @param joinFields List of any conditions for the join operation. - * @param nullable What kind of join operation is to be used. - * @param key The foreign key used for this join, if available. Used to generate EXISTS subqueries for filter-only LEFT JOINs. - */ - public SQLJoinStatement(JoinListSequence joinSequence, JoinElement joinTargetTable, AliasWrapper joinAlias, List<SQLJoinField> joinFields, boolean nullable, JOOQMapping key) { - super(joinSequence, joinFields, nullable); - this.joinTargetTable = joinTargetTable; - this.joinAlias = joinAlias; - this.key = key; - joinString = super.toJoinString(joinAlias.getAlias().getMappingName()); - comparableJoinString = joinString.toString(); - } - - /** - * @return Source table to join from. The "left" side of a join statement. - */ - public JoinListSequence getJoinSequence() { - return super.getJoinSequence(); - } - - /** - * @return The target table to be joined with. The "right" side of a join statement. - */ - public JoinElement getJoinTargetTable() { - return joinTargetTable; - } - - /** - * @return The alias to be used to uniquely distinguish this join operation. - */ - public AliasWrapper getJoinAlias() { - return joinAlias; - } - - /** - * @return The foreign key used for this join, or null if not available. - */ - public JOOQMapping getKey() { - return key; - } - - /** - * @return A string that contains a complete join statement followed by all conditions set for this join. - */ - public CodeBlock toJoinString() { - return joinString; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof SQLJoinStatement that)) return false; - return Objects.equals(comparableJoinString, that.comparableJoinString); - } - - @Override - public int hashCode() { - return Objects.hash(comparableJoinString); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/sql/SQLJoinType.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/sql/SQLJoinType.java deleted file mode 100644 index ca252fa34c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/definitions/sql/SQLJoinType.java +++ /dev/null @@ -1,11 +0,0 @@ -package no.sikt.graphitron.definitions.sql; - -/** - * Enum of supported SQL join types. - */ -public enum SQLJoinType { - DEFAULT, // Default should be "JOIN". - JOIN, - LEFT, - // RIGHT, // Not supported yet. -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generate/Generator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generate/Generator.java deleted file mode 100644 index d0bc1c060e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generate/Generator.java +++ /dev/null @@ -1,50 +0,0 @@ -package no.sikt.graphitron.generate; - -import no.sikt.graphitron.configuration.CodeGenerationThresholds; -import no.sikt.graphitron.configuration.OptionalSelect; -import no.sikt.graphitron.configuration.RecordValidation; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.configuration.externalreferences.GlobalTransform; - -import java.util.List; -import java.util.Set; - -public interface Generator { - String getOutputPath(); - - String getOutputPackage(); - Set<String> getSchemaFiles(); - Set<String> getUserSchemaFiles(); - String getJooqGeneratedPackage(); - RecordValidation getRecordValidation(); - - int getMaxAllowedPageSize(); - - List<? extends ExternalReference> getExternalReferences(); - - Set<String> getExternalReferenceImports(); - - List<GlobalTransform> getGlobalTransforms(); - - String getApiPackageName(); - - String getModelPackageName(); - - boolean makeNodeStrategy(); - - boolean useJdbcBatchingForDeletes(); - - boolean useJdbcBatchingForInserts(); - - CodeGenerationThresholds getCodeGenerationThresholds(); - - boolean requireTypeIdOnNode(); - - boolean validateOverlappingInputFields(); - - boolean failOnMerge(); - - boolean generateUpsertAsStore(); - - OptionalSelect getOptionalSelect(); -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generate/GraphQLGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generate/GraphQLGenerator.java deleted file mode 100644 index 368730d736..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generate/GraphQLGenerator.java +++ /dev/null @@ -1,122 +0,0 @@ -package no.sikt.graphitron.generate; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.codeinterface.CodeInterfaceClassGenerator; -import no.sikt.graphitron.generators.codeinterface.typeregistry.TypeRegistryClassGenerator; -import no.sikt.graphitron.generators.codeinterface.wiring.WiringClassGenerator; -import no.sikt.graphitron.generators.db.DBClassGenerator; -import no.sikt.graphitron.generators.dto.*; -import no.sikt.graphitron.generators.exception.ExceptionToErrorMappingProviderGenerator; -import no.sikt.graphitron.generators.exception.ExceptionStrategyConfigurationGenerator; -import no.sikt.graphitron.generators.mapping.JavaRecordMapperClassGenerator; -import no.sikt.graphitron.generators.mapping.RecordMapperClassGenerator; -import no.sikt.graphitron.generators.mapping.TransformerClassGenerator; -import no.sikt.graphitron.generators.datafetchers.operations.OperationClassGenerator; -import no.sikt.graphitron.generators.datafetchers.typeresolvers.TypeResolverClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static no.sikt.graphql.schema.SchemaReadingHelper.getTypeDefinitionRegistry; - -/** - * Class for executing the code generation. Defines which generators should run by default. - * This assumes that generator configuration is set before calling any of these methods. - */ -public class GraphQLGenerator { - static final Logger LOGGER = LoggerFactory.getLogger(GraphQLGenerator.class); - - /* - public static void main(String[] args) { - generate(); - } - */ - - /** - * Execute the code generation on the default set of generators and logging settings. - */ - public static void generate() { - var processedSchema = getProcessedSchema(true); - processedSchema.validate(); - generate(getGenerators(processedSchema)); - } - - public static List<ClassGenerator> getGenerators(ProcessedSchema processedSchema) { - List<ClassGenerator> generators = List.of( - new TypeDTOGenerator(processedSchema), - new InputDTOGenerator(processedSchema), - new InterfaceDTOGenerator(processedSchema), - new UnionDTOGenerator(processedSchema), - new EnumDTOGenerator(processedSchema), - new DBClassGenerator(processedSchema), - new TransformerClassGenerator(processedSchema), - new RecordMapperClassGenerator(processedSchema, true), - new RecordMapperClassGenerator(processedSchema, false), - new JavaRecordMapperClassGenerator(processedSchema, true), - new JavaRecordMapperClassGenerator(processedSchema, false), - new ExceptionStrategyConfigurationGenerator(processedSchema), - new ExceptionToErrorMappingProviderGenerator(processedSchema), - new TypeRegistryClassGenerator(), - new CodeInterfaceClassGenerator(processedSchema) - ); - List<ClassGenerator> dataFetcherGenerators = List.of( - new OperationClassGenerator(processedSchema), - new TypeResolverClassGenerator(processedSchema) - ); - return Stream.concat( - Stream.concat(generators.stream(), dataFetcherGenerators.stream()), - Stream.of(new WiringClassGenerator(dataFetcherGenerators, processedSchema)) // These must be the last. - ).toList(); - } - - /** - * Run a list of generators. - * @param generators The generators that should be executed. - */ - public static void generate(List<ClassGenerator> generators) { - var last = generators.subList(generators.size() - 1, generators.size()).get(0); // The wiring generator must go last. - var other = generators.subList(0, generators.size() - 1); - other.stream().parallel().forEach(g -> { - g.generateAllToDirectory(GeneratorConfig.outputDirectory(), GeneratorConfig.outputPackage()); - LOGGER.info("Generated sources to: {}.{}", GeneratorConfig.outputPackage(), g.getDefaultSaveDirectoryName()); - }); - last.generateAllToDirectory(GeneratorConfig.outputDirectory(), GeneratorConfig.outputPackage()); - LOGGER.info("Generated sources to: {}.{}", GeneratorConfig.outputPackage(), last.getDefaultSaveDirectoryName()); - } - - public static Map<String, List<String>> generateAsStrings(List<ClassGenerator> generators) { - return generators - .stream() - .flatMap(it -> it.generateAllAsMap().entrySet().stream()) - .collect(Collectors.toMap( - Map.Entry::getKey, - it -> List.of(it.getValue().split("\n")), - (a, b) -> Stream.concat(a.stream(), b.stream()).toList() - )); - } - - /** - * @return A Graphitron-interpreted version of the schema files set in {@link GeneratorConfig}. - */ - public static ProcessedSchema getProcessedSchema() { - return getProcessedSchema(false); - } - - /** - * @param verbose Should the files read be logged? - * @return A Graphitron-interpreted version of the schema files set in {@link GeneratorConfig}. - */ - public static ProcessedSchema getProcessedSchema(boolean verbose) { - var schemaLocations = GeneratorConfig.generatorSchemaFiles(); - if (verbose) { - LOGGER.info("Reading graphql schemas {}", schemaLocations); - } - return new ProcessedSchema(getTypeDefinitionRegistry(schemaLocations)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generate/Introspector.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generate/Introspector.java deleted file mode 100644 index 5a7aa1ea74..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generate/Introspector.java +++ /dev/null @@ -1,18 +0,0 @@ -package no.sikt.graphitron.generate; - -/** - * Configuration interface for jOOQ introspection. - * Extends Validator to reuse jOOQ package configuration, - * including external references and imports. - */ -public interface Introspector extends Validator { - /** - * @return Output path for the LSP configuration JSON file - */ - String getOutputFile(); - - /** - * @return Whether to include external references in the LSP configuration - */ - boolean includeExternalReferencesForLSP(); -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generate/Validator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generate/Validator.java deleted file mode 100644 index e7e358ff0a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generate/Validator.java +++ /dev/null @@ -1,37 +0,0 @@ -package no.sikt.graphitron.generate; - -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; - -import java.util.List; -import java.util.Set; - -/** - * Minimal configuration interface for schema validation. - * Unlike {@link Generator}, this only includes parameters needed for validation. - */ -public interface Validator { - /** - * @return Schema files to validate - */ - Set<String> getSchemaFiles(); - - /** - * @return Package where jOOQ generated code resides (for database metadata) - */ - String getJooqGeneratedPackage(); - - /** - * @return Whether Node strategy is enabled (affects validation rules) - */ - boolean makeNodeStrategy(); - - /** - * @return Whether type ID is required on Node types (affects validation rules) - */ - boolean requireTypeIdOnNode(); - - List<? extends ExternalReference> getExternalReferences(); - - Set<String> getExternalReferenceImports(); - -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/AbstractClassGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/AbstractClassGenerator.java deleted file mode 100644 index 0bb218e1d4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/AbstractClassGenerator.java +++ /dev/null @@ -1,92 +0,0 @@ -package no.sikt.graphitron.generators.abstractions; - -import no.sikt.graphitron.generators.codebuilding.TypeNameFormat; -import no.sikt.graphitron.generators.dependencies.ServiceDependency; -import no.sikt.graphitron.javapoet.ClassName; -import no.sikt.graphitron.javapoet.JavaFile; -import no.sikt.graphitron.javapoet.TypeSpec; - -import javax.lang.model.element.Modifier; -import java.io.File; -import java.io.IOException; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import static org.apache.commons.lang3.StringUtils.capitalize; - -abstract public class AbstractClassGenerator implements ClassGenerator { - @Override - public TypeSpec.Builder getSpec(String className, List<? extends MethodGenerator> generators) { - return TypeSpec - .classBuilder(className + getFileNameSuffix()) - .addModifiers(Modifier.PUBLIC) - .addMethods( - generators - .stream() - .map(MethodGenerator::generateAll) - .flatMap(List::stream) - .collect(Collectors.toList()) - ); - } - - public TypeSpec.Builder getSpec(String className, MethodGenerator generator) { - return getSpec(className, List.of(generator)); - } - - /** - * Add all the dependency fields for this class. - * @param generators Generators to extract dependencies from. - */ - protected void setDependencies(List<? extends MethodGenerator> generators, TypeSpec.Builder spec) { - generators - .stream() - .flatMap(gen -> gen.getDependencyMap().values().stream().flatMap(Collection::stream)) - .distinct() - .sorted() - .filter(dep -> !(dep instanceof ServiceDependency)) // Inelegant solution, but it should work for now. - .forEach(dep -> spec.addField(dep.getSpec())); - } - - @Override - public Map<String, String> generateAllAsMap() { - return generateAll().stream().collect(Collectors.toMap(TypeSpec::name, this::writeToString)); - } - - @Override - public void generateAllToDirectory(String path, String packagePath) { - generateAll().forEach(it -> writeToFile(it, path, packagePath)); - } - - @Override - public void writeToFile(TypeSpec generatedClass, String path, String packagePath) { - writeToFile(generatedClass, path, packagePath, getDefaultSaveDirectoryName()); - } - - @Override - public void writeToFile(TypeSpec generatedClass, String path, String packagePath, String directoryOverride) { - var file = JavaFile - .builder(packagePath + "." + directoryOverride, generatedClass) - .indent(" ") - .build(); - try { - file.writeTo(new File(path)); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public String writeToString(TypeSpec generatedClass) { - return JavaFile.builder("", generatedClass).indent(" ").build().toString(); - } - - /** - * @param name Name of the class. - * @return ClassName based on the default output package and save directory. - */ - public ClassName getGeneratedClassName(String name) { - return TypeNameFormat.getGeneratedClassName(getDefaultSaveDirectoryName(), capitalize(name)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/AbstractMapperClassGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/AbstractMapperClassGenerator.java deleted file mode 100644 index 5d90c40a95..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/AbstractMapperClassGenerator.java +++ /dev/null @@ -1,45 +0,0 @@ -package no.sikt.graphitron.generators.abstractions; - -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.javapoet.TypeSpec; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.List; -import java.util.stream.Collectors; - -public abstract class AbstractMapperClassGenerator<T extends GenerationField> extends AbstractSchemaClassGenerator<T> { - public static final String DEFAULT_SAVE_DIRECTORY_NAME = "mappers"; - private final boolean toRecord; - - public AbstractMapperClassGenerator(ProcessedSchema processedSchema, boolean toRecord) { - super(processedSchema); - this.toRecord = toRecord; - } - - @Override - public List<TypeSpec> generateAll() { - return processedSchema - .getTransformableFields() - .stream() - .filter(this::filterProperties) - .map(it -> (T) it) - .map(this::generate) - .filter(this::typeSpecFilter) - .collect(Collectors.toList()); - } - - protected boolean typeSpecFilter(TypeSpec spec) { - return !spec.methodSpecs().isEmpty(); - } - - protected abstract boolean filterProperties(GenerationField field); - - @Override - public String getDefaultSaveDirectoryName() { - return DEFAULT_SAVE_DIRECTORY_NAME; - } - - public boolean isToRecord() { - return toRecord; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/AbstractMapperMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/AbstractMapperMethodGenerator.java deleted file mode 100644 index c9ac90016b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/AbstractMapperMethodGenerator.java +++ /dev/null @@ -1,106 +0,0 @@ -package no.sikt.graphitron.generators.abstractions; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.definitions.interfaces.RecordObjectSpecification; -import no.sikt.graphitron.generators.context.MapperContext; -import no.sikt.graphitron.generators.dependencies.Dependency; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphitron.javapoet.TypeName; -import no.sikt.graphql.schema.ProcessedSchema; - -import javax.lang.model.element.Modifier; -import java.util.List; - -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.addStringIfNotEmpty; -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.asMethodCall; -import static no.sikt.graphitron.generators.codebuilding.NameFormat.recordTransformMethod; -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.wrapArrayList; -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.wrapListIf; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.*; -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.listedOutputPrefix; -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.outputPrefix; -import static no.sikt.graphitron.mappings.JavaPoetClassName.*; -import static org.apache.commons.lang3.StringUtils.uncapitalize; - -abstract public class AbstractMapperMethodGenerator extends AbstractSchemaMethodGenerator<GenerationField, RecordObjectSpecification<?>> { - private final GenerationField localField; - protected final boolean toRecord; - - public AbstractMapperMethodGenerator(GenerationField localField, ProcessedSchema processedSchema, boolean toRecord) { - super(processedSchema.getRecordType(localField.getContainerTypeName()), processedSchema); - - this.localField = localField; - this.toRecord = toRecord; - } - - public GenerationField getLocalField() { - return localField; - } - - public MethodSpec.Builder getDefaultSpecBuilder(String methodName, String inputName, TypeName inputType, TypeName returnType) { - return getDefaultSpecBuilder(methodName, returnType) - .addModifiers(Modifier.STATIC) - .addParameter(inputType, uncapitalize(inputName)) - .addParameterIf(GeneratorConfig.shouldMakeNodeStrategy() && !methodName.equals(METHOD_VALIDATE_NAME), NODE_ID_STRATEGY.className, VAR_NODE_STRATEGY) - .addParameterIf(toRecord && !methodName.equals(METHOD_VALIDATE_NAME), ARGUMENT_PRESENCE.className, VAR_ARG_PRESENCE) - .addParameter(STRING.className, VAR_PATH_NAME) - .addParameter(RECORD_TRANSFORMER.className, VAR_TRANSFORMER) - .declare(VAR_PATH_HERE, addStringIfNotEmpty(VAR_PATH_NAME, "/")); - } - - public MethodSpec.Builder getMapperSpecBuilder(GenerationField target) { - var context = MapperContext.createContext(target, toRecord, mapsJavaRecord(), processedSchema); - var methodName = recordTransformMethod(context.hasJavaRecordReference(), toRecord); - - var fillCode = iterateRecords(context); // Note, do before declaring dependencies. - var type = processedSchema.getRecordType(target); - var currentSource = type.asSourceClassName(toRecord); - var source = wrapListIf(currentSource != null ? currentSource : target.getExternalMethod().getGenericReturnType(), context.hasSourceName()); - var noRecordIterability = !context.hasSourceName() && target.isIterableWrapped(); - var hasIterable = context.hasSourceName() || noRecordIterability; - return getDefaultSpecBuilder(methodName, context.getInputVariableName(), source, wrapListIf(context.getReturnType(), noRecordIterability || context.hasRecordReference())) - .declareIf(!toRecord, VAR_SELECT, asMethodCall(VAR_TRANSFORMER, METHOD_SELECT_NAME)) - .declareIf(toRecord && context.hasTable() && !context.hasJavaRecordReference(), VAR_CONTEXT, asMethodCall(VAR_TRANSFORMER, METHOD_CONTEXT_NAME)) - .declareNewIf(hasIterable, listedOutputPrefix(context.getOutputName()), wrapArrayList(context.getReturnType())) - .declareNewIf(!hasIterable, outputPrefix(context.getOutputName()), context.getReturnType()) - .addCode("\n") - .addCode(declareDependencyClasses(methodName)) - .addCode(fillCode) - .addCode("\n") - .addCode(context.getReturnBlock()); - } - - @Override - public List<MethodSpec> generateAll() { - if (getLocalObject() == null || getLocalObject().isExplicitlyNotGenerated()) { - return List.of(); - } - - return List.of(generate(getLocalField())); - } - - public abstract boolean mapsJavaRecord(); - - /** - * @return Code that declares any dependencies set for this method. - */ - private CodeBlock declareDependencyClasses(String methodName) { - var dependencies = dependencyMap - .getOrDefault(methodName, List.of()) - .stream() - .distinct() - .sorted() - .map(Dependency::getDeclarationCode) - .toList(); - - var code = CodeBlock.builder(); - return code.addAll(dependencies).addIf(!code.isEmpty(), "\n").build(); - } - - /** - * @return Code for setting the mapping data. - */ - protected abstract CodeBlock iterateRecords(MapperContext context); -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/AbstractSchemaClassGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/AbstractSchemaClassGenerator.java deleted file mode 100644 index 64f8472bb9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/AbstractSchemaClassGenerator.java +++ /dev/null @@ -1,19 +0,0 @@ -package no.sikt.graphitron.generators.abstractions; - -import no.sikt.graphitron.definitions.interfaces.GenerationTarget; -import no.sikt.graphitron.javapoet.TypeSpec; -import no.sikt.graphql.schema.ProcessedSchema; - -abstract public class AbstractSchemaClassGenerator<T extends GenerationTarget> extends AbstractClassGenerator { - protected final ProcessedSchema processedSchema; - - public AbstractSchemaClassGenerator(ProcessedSchema processedSchema) { - this.processedSchema = processedSchema; - } - - /** - * @param target A {@link GenerationTarget} object representing a source from which a class should be generated. - * @return A complete class in the form of a javapoet {@link TypeSpec}. - */ - abstract public TypeSpec generate(T target); -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/AbstractSchemaMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/AbstractSchemaMethodGenerator.java deleted file mode 100644 index 73c0ce233a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/AbstractSchemaMethodGenerator.java +++ /dev/null @@ -1,134 +0,0 @@ -package no.sikt.graphitron.generators.abstractions; - -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.definitions.interfaces.GenerationTarget; -import no.sikt.graphitron.definitions.interfaces.RecordObjectSpecification; -import no.sikt.graphitron.definitions.mapping.AliasWrapper; -import no.sikt.graphitron.definitions.mapping.JOOQMapping; -import no.sikt.graphitron.generators.codeinterface.wiring.WiringContainer; -import no.sikt.graphitron.generators.dependencies.Dependency; -import no.sikt.graphitron.generators.dependencies.ServiceDependency; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphitron.javapoet.TypeName; -import no.sikt.graphql.schema.ProcessedSchema; - -import javax.lang.model.element.Modifier; -import java.util.*; - -/** - * An abstract generator that contains methods that are common between both DB-method generators and resolver generators. - */ -abstract public class AbstractSchemaMethodGenerator<T extends GenerationTarget, U extends GenerationTarget> implements MethodGenerator { - protected final U localObject; - protected final ProcessedSchema processedSchema; - protected Map<String, List<Dependency>> dependencyMap = new HashMap<>(); - - public AbstractSchemaMethodGenerator(U localObject, ProcessedSchema processedSchema) { - this.localObject = localObject; - this.processedSchema = processedSchema; - } - - /** - * @return The object that this generator is attempting to build methods for. - */ - public U getLocalObject() { - return localObject; - } - - protected JOOQMapping getLocalTable() { - if (!(getLocalObject() instanceof RecordObjectSpecification<? extends GenerationField> localRecordObject)) { - return null; - } - - if (localRecordObject.hasTable()) { - return localRecordObject.getTable(); - } - return Optional - .ofNullable(processedSchema.getPreviousTableObjectForObject(localRecordObject)) - .map(RecordObjectSpecification::getTable) - .orElse(null); - } - - /** - * @param methodName The name of the method. - * @param returnType The return type of the method, as a javapoet {@link TypeName}. - * @return The default builder for this class' methods, with any common settings applied. - */ - public MethodSpec.Builder getDefaultSpecBuilder(String methodName, TypeName returnType) { - return MethodSpec - .methodBuilder(methodName) - .addModifiers(Modifier.PUBLIC) - .returns(returnType); - } - - @Override - public Map<String, List<Dependency>> getDependencyMap() { - return dependencyMap; - } - - /** - * @return Any DataFetcher wiring this generator produces. - */ - public List<WiringContainer> getDataFetcherWiring() { - return List.of(); - } - - /** - * @return Any TypeRespolver wiring this generator produces. - */ - public List<WiringContainer> getTypeResolverWiring() { - return List.of(); - } - - /** - * @return The complete javapoet {@link MethodSpec} based on the provided target. - */ - abstract public MethodSpec generate(T target); - - protected ServiceDependency createServiceDependency(GenerationField target) { - var dependency = new ServiceDependency(target.getExternalMethod().getClassName()); - dependencyMap.computeIfAbsent(target.getName(), (s) -> new ArrayList<>()).add(dependency); - return dependency; - } - - /** - * @return Code that declares any service dependencies set for this generator. - */ - protected CodeBlock declareAllServiceClasses(String targetName) { - return declareAllServiceClasses(targetName, false); - } - - protected CodeBlock declareAllServiceClasses(String targetName, boolean excludeCtx) { - var code = CodeBlock.builder(); - dependencyMap - .getOrDefault(targetName, List.of()) - .stream() - .filter(dep -> dep instanceof ServiceDependency) // Inelegant solution, but it should work for now. - .distinct() - .sorted() - .map(dep -> (ServiceDependency) dep) - .forEach(dep -> code.add(dep.getDeclarationCode(excludeCtx))); - return code.build(); - } - - protected CodeBlock declareAllServiceClassesInAliasSet(Set<AliasWrapper> aliasSet) { - for (var alias: aliasSet) { - if (alias.hasTableMethod()){ - createServiceDependency(alias.getReferenceObjectField()); - } - } - - var codeBlocks = aliasSet.stream() - .map(AliasWrapper::getReferenceObjectField) - .filter(Objects::nonNull) - .filter(field -> dependencyMap.containsKey(field.getName())) - .flatMap(field -> dependencyMap.get(field.getName()).stream()) - .filter(dep -> dep instanceof ServiceDependency) - .distinct() - .map(dep -> ((ServiceDependency) dep).getDeclarationCode(true)) - .collect(CodeBlock.joining()); - - return CodeBlock.builder().add(codeBlocks).build(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/ClassGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/ClassGenerator.java deleted file mode 100644 index 97a4caa182..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/ClassGenerator.java +++ /dev/null @@ -1,66 +0,0 @@ -package no.sikt.graphitron.generators.abstractions; - -import no.sikt.graphitron.javapoet.TypeSpec; - -import java.util.List; -import java.util.Map; - -/** - * A class generator generates a set of classes for any purpose. - */ -public interface ClassGenerator { - /** - * Generate the classes and return the list of TypeSpecs. - */ - List<TypeSpec> generateAll(); - /** - * @param path The path to the output directory. - * @param packagePath The package path that this class should be written to. - */ - void generateAllToDirectory(String path, String packagePath); - - /** - * Create the {@link no.sikt.graphitron.javapoet.JavaFile JavaFile} for this class, add any common static imports and write it to file. - * @param generatedClass A complete javapoet {@link TypeSpec}. - * @param path The path to the output directory. - * @param packagePath The package path that this class should be written to. - */ - void writeToFile(TypeSpec generatedClass, String path, String packagePath); - - /** - * Create the {@link no.sikt.graphitron.javapoet.JavaFile JavaFile} for this class, add any common static imports and write it to file. - * @param generatedClass A complete javapoet {@link TypeSpec}. - * @param path The path to the output directory. - * @param packagePath The package path that this class should be written to. - * @param directoryOverride Override the directory within the package where the class is saved to. - */ - void writeToFile(TypeSpec generatedClass, String path, String packagePath, String directoryOverride); - - /** - * Generate the classes and write them to a String. - */ - Map<String, String> generateAllAsMap(); - - /** - * Create the {@link no.sikt.graphitron.javapoet.JavaFile JavaFile} for this class, add any common static imports and render the file as a string. - * @param generatedClass A complete javapoet {@link TypeSpec}. - */ - String writeToString(TypeSpec generatedClass); - - /** - * @return The final directory path within the package where the classes are ultimately saved. - */ - String getDefaultSaveDirectoryName(); - - /** - * @return The suffix that is to be added to the end of file names generated by this class. - */ - String getFileNameSuffix(); - - /** - * @param className The name of the class. - * @param generators List of method generators that this class should use to generate its methods. - * @return A completed {@link TypeSpec.Builder} for this class, where all methods have already been added. - */ - TypeSpec.Builder getSpec(String className, List<? extends MethodGenerator> generators); -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/DBMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/DBMethodGenerator.java deleted file mode 100644 index b2512d548e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/DBMethodGenerator.java +++ /dev/null @@ -1,42 +0,0 @@ -package no.sikt.graphitron.generators.abstractions; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.definitions.interfaces.GenerationTarget; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.generators.codebuilding.VariableNames; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphitron.javapoet.TypeName; -import no.sikt.graphql.schema.ProcessedSchema; - -import javax.lang.model.element.Modifier; - -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_NODE_STRATEGY; -import static no.sikt.graphitron.mappings.JavaPoetClassName.DSL_CONTEXT; -import static no.sikt.graphitron.mappings.JavaPoetClassName.NODE_ID_STRATEGY; - -/** - * Generic select query generation functionality is contained within this class. - * @param <T> Field type that this generator operates on. - */ -abstract public class DBMethodGenerator<T extends GenerationTarget> extends AbstractSchemaMethodGenerator<T, ObjectDefinition> { - public DBMethodGenerator(ObjectDefinition localObject, ProcessedSchema processedSchema) { - super(localObject, processedSchema); - } - - @Override - public MethodSpec.Builder getDefaultSpecBuilder(String methodName, TypeName returnType) { - return getDefaultSpecBuilder(methodName, returnType, false); - } - - /** - * @param skipNodeIdStrategy If true, the node ID strategy parameter is never added, - * regardless of the global {@link GeneratorConfig#shouldMakeNodeStrategy()} setting. - */ - public MethodSpec.Builder getDefaultSpecBuilder(String methodName, TypeName returnType, boolean skipNodeIdStrategy) { - return super - .getDefaultSpecBuilder(methodName, returnType) - .addModifiers(Modifier.STATIC) - .addParameter(DSL_CONTEXT.className, VariableNames.VAR_CONTEXT) - .addParameterIf(GeneratorConfig.shouldMakeNodeStrategy() && !skipNodeIdStrategy, NODE_ID_STRATEGY.className, VAR_NODE_STRATEGY); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/DataFetcherClassGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/DataFetcherClassGenerator.java deleted file mode 100644 index 1531875d0a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/DataFetcherClassGenerator.java +++ /dev/null @@ -1,47 +0,0 @@ -package no.sikt.graphitron.generators.abstractions; - -import no.sikt.graphitron.definitions.interfaces.GenerationTarget; -import no.sikt.graphitron.generators.codeinterface.wiring.ClassWiringContainer; -import no.sikt.graphitron.generators.codeinterface.wiring.WiringContainer; -import no.sikt.graphitron.javapoet.ClassName; -import no.sikt.graphitron.javapoet.TypeSpec; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.ArrayList; -import java.util.List; - -import static no.sikt.graphitron.generators.codeinterface.wiring.WiringContainer.asClassWiring; - -abstract public class DataFetcherClassGenerator<T extends GenerationTarget> extends AbstractSchemaClassGenerator<T> { - public static final String DEFAULT_SAVE_DIRECTORY_NAME = "resolvers", FILE_NAME_SUFFIX = "GeneratedDataFetcher"; - protected final List<ClassWiringContainer> fetcherWiringContainer = new ArrayList<>(); - - public DataFetcherClassGenerator(ProcessedSchema processedSchema) { - super(processedSchema); - } - - @Override - public TypeSpec.Builder getSpec(String className, List<? extends MethodGenerator> generators) { - var spec = super.getSpec(className, generators); - setDependencies(generators, spec); - return spec; - } - - @Override - public String getDefaultSaveDirectoryName() { - return DEFAULT_SAVE_DIRECTORY_NAME; - } - - @Override - public String getFileNameSuffix() { - return FILE_NAME_SUFFIX; - } - - public List<ClassWiringContainer> getGeneratedDataFetchers() { - return fetcherWiringContainer; - } - - protected void addFetchers(List<WiringContainer> containers, ClassName className) { - fetcherWiringContainer.addAll(asClassWiring(containers, className)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/DataFetcherMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/DataFetcherMethodGenerator.java deleted file mode 100644 index a1c4def08d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/DataFetcherMethodGenerator.java +++ /dev/null @@ -1,99 +0,0 @@ -package no.sikt.graphitron.generators.abstractions; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.definitions.fields.ArgumentField; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.generators.codebuilding.TypeNameFormat; -import no.sikt.graphitron.generators.codeinterface.wiring.WiringContainer; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphitron.javapoet.TypeName; -import no.sikt.graphql.naming.GraphQLReservedName; -import no.sikt.graphql.schema.ProcessedSchema; - -import javax.lang.model.element.Modifier; -import java.util.ArrayList; -import java.util.List; - -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.asMethodCall; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.*; -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.inputPrefix; -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.sourcePrefix; -import static no.sikt.graphitron.mappings.JavaPoetClassName.NODE_ID_STRATEGY; -import static no.sikt.graphitron.mappings.JavaPoetClassName.RESOLVER_HELPERS; -import static no.sikt.graphql.naming.GraphQLReservedName.FEDERATION_ENTITIES_FIELD; - -abstract public class DataFetcherMethodGenerator extends AbstractSchemaMethodGenerator<ObjectField, ObjectDefinition> { - protected final List<WiringContainer> dataFetcherWiring = new ArrayList<>(); - - public DataFetcherMethodGenerator(ObjectDefinition localObject, ProcessedSchema processedSchema) { - super(localObject, processedSchema); - } - - @Override - public MethodSpec.Builder getDefaultSpecBuilder(String methodName, TypeName returnType) { - return super - .getDefaultSpecBuilder(methodName, returnType) - .addModifiers(Modifier.STATIC) - .addParameterIf(GeneratorConfig.shouldMakeNodeStrategy(), NODE_ID_STRATEGY.className, VAR_NODE_STRATEGY); - } - - protected CodeBlock extractParams(ObjectField target) { - var localObject = getLocalObject(); - var isEntitiesField = localObject.isOperationRoot() && target.getName().equals(FEDERATION_ENTITIES_FIELD.getName()) && processedSchema.isFederationImported(); - return CodeBlock - .builder() - .declareIf( - !localObject.isOperationRoot(), - localObject.getGraphClassName(), - sourcePrefix(localObject.getName()), - () -> asMethodCall(VAR_ENV, METHOD_SOURCE_NAME) - ) - .addAll(target.getArguments().stream().map(it -> declareArgument(it, isEntitiesField)).toList()) - .addIf(target.hasForwardPagination(), declarePageSize(target.getFirstDefault())) - .build(); - } - - /** - * @return CodeBlock consisting of a declaration of the page size variable through a method call. - */ - public static CodeBlock declarePageSize(int defaultFirst) { - return CodeBlock.statementOf( - "int $L = $T.getPageSize($N, $L, $L)", - VAR_PAGE_SIZE, - RESOLVER_HELPERS.className, - inputPrefix(GraphQLReservedName.PAGINATION_FIRST.getName()), - GeneratorConfig.getMaxAllowedPageSize(), - defaultFirst - ); - } - - private CodeBlock declareArgument(ArgumentField field, boolean isEntitiesField) { - var getBlock = CodeBlock.of("$N.getArgument($S)", VAR_ENV, field.getName()); - var transformBlock = processedSchema.isRecordType(field) ? transformDTOBlock(field, getBlock) : getBlock; - return CodeBlock.declare( - !isEntitiesField - ? TypeNameFormat.iterableWrapType(field, false, processedSchema) - : TypeNameFormat.getWildCardListTypeName(), - inputPrefix(field.getName()), - transformBlock - ); - } - - protected CodeBlock transformDTOBlock(GenerationField field, CodeBlock source) { - return CodeBlock.of( - "$T.$L($L, $T.class)", - RESOLVER_HELPERS.className, - field.isIterableWrapped() ? "transformDTOList" : "transformDTO", - source, - processedSchema.getRecordType(field).getGraphClassName() - ); - } - - @Override - public List<WiringContainer> getDataFetcherWiring() { - return dataFetcherWiring; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/MethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/MethodGenerator.java deleted file mode 100644 index a78919e990..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/MethodGenerator.java +++ /dev/null @@ -1,22 +0,0 @@ -package no.sikt.graphitron.generators.abstractions; - -import no.sikt.graphitron.generators.dependencies.Dependency; -import no.sikt.graphitron.javapoet.MethodSpec; - -import java.util.List; -import java.util.Map; - -/** - * A method generator generates a set of methods for any purpose. - */ -public interface MethodGenerator { - /** - * @return List of complete javapoet {@link MethodSpec} that can be generated for this object. - */ - List<MethodSpec> generateAll(); - - /** - * @return A set containing all dependencies necessary for these generated methods. Key is the method name where the dependency is needed. - */ - Map<String, List<Dependency>> getDependencyMap(); -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/SimpleMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/SimpleMethodGenerator.java deleted file mode 100644 index 6b0bbf5ad3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/abstractions/SimpleMethodGenerator.java +++ /dev/null @@ -1,27 +0,0 @@ -package no.sikt.graphitron.generators.abstractions; - -import no.sikt.graphitron.generators.dependencies.Dependency; -import no.sikt.graphitron.javapoet.MethodSpec; - -import java.util.List; -import java.util.Map; - -/** - * An abstract generator that contains simple methods that are independent of the GraphQL schema. - */ -abstract public class SimpleMethodGenerator implements MethodGenerator { - @Override - public List<MethodSpec> generateAll() { - return List.of(generate()); - } - - @Override - public Map<String, List<Dependency>> getDependencyMap() { - return Map.of(); - } - - /** - * @return The complete javapoet {@link MethodSpec} based on the provided target. - */ - abstract public MethodSpec generate(); -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codebuilding/FormatCodeBlocks.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codebuilding/FormatCodeBlocks.java deleted file mode 100644 index 276779e4be..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codebuilding/FormatCodeBlocks.java +++ /dev/null @@ -1,917 +0,0 @@ -package no.sikt.graphitron.generators.codebuilding; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.configuration.externalreferences.TransformScope; -import no.sikt.graphitron.definitions.helpers.NodeConfiguration; -import no.sikt.graphitron.definitions.interfaces.RecordObjectSpecification; -import no.sikt.graphitron.definitions.mapping.MethodMapping; -import no.sikt.graphitron.definitions.objects.EnumDefinition; -import no.sikt.graphitron.generators.context.FetchContext; -import no.sikt.graphitron.generators.db.DBClassGenerator; -import no.sikt.graphitron.javapoet.ClassName; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.CodeBlocks; -import no.sikt.graphitron.javapoet.TypeName; -import no.sikt.graphql.schema.ProcessedSchema; -import org.jetbrains.annotations.NotNull; -import org.jooq.Key; - -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.function.UnaryOperator; - -import static no.sikt.graphitron.generators.codebuilding.NameFormat.asListedName; -import static no.sikt.graphitron.generators.codebuilding.NameFormat.recordTransformMethod; -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.getGeneratedClassName; -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.wrapArrayList; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.*; -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.*; -import static no.sikt.graphitron.javapoet.CodeBlock.ofVar; -import static no.sikt.graphitron.mappings.JavaPoetClassName.*; -import static no.sikt.graphitron.mappings.TableReflection.*; -import static org.apache.commons.lang3.StringUtils.capitalize; -import static org.apache.commons.lang3.StringUtils.uncapitalize; - -/** - * Class containing various helper methods for constructing code with javapoet. - */ -public class FormatCodeBlocks { - private final static CodeBlock - COLLECT_TO_LIST = CodeBlock.of(".toList()"), - NEW_TRANSFORM = CodeBlock.of("new $T($N)", RECORD_TRANSFORMER.className, VAR_ENV), - DECLARE_TRANSFORM = CodeBlock.declare(VAR_TRANSFORMER, NEW_TRANSFORM), - NEW_DATA_FETCHER = CodeBlock.of("new $T($N)", DATA_FETCHER_HELPER.className, VAR_ENV), - NEW_SERVICE_DATA_FETCHER_TRANSFORM = CodeBlock.of("new $T<>($N)", DATA_SERVICE_FETCHER.className, VAR_TRANSFORMER), - ATTACH = CodeBlock.of(".attach($N.configuration())", VAR_CONTEXT), - ATTACH_RESOLVER = CodeBlock.of(".attach($L.configuration())", asMethodCall(VAR_TRANSFORMER, METHOD_CONTEXT_NAME)), - TRUE_CONDITION = CodeBlock.of("$T.trueCondition()", DSL.className), - FALSE_CONDITION = CodeBlock.of("$T.falseCondition()", DSL.className), - NO_CONDITION = CodeBlock.of("$T.noCondition()", DSL.className), - FIND_FIRST = CodeBlock.of(".stream().findFirst()"), - EMPTY_LIST = CodeBlock.of("$T.of()", LIST.className), - EMPTY_SET = CodeBlock.of("$T.of()", SET.className), - EMPTY_MAP = CodeBlock.of("$T.of()", MAP.className); - - /** - * @param name Name of a field that should be declared as a record. This will be the name of the variable. - * @param input Input type that should be declared as a record. - * @param isIterable Is this record wrapped in a list? - * @param createsDataFetchers Is this declaration to be used in a resolver? - * @return CodeBlock that declares a new record variable and that attaches context configuration if needed. - */ - public static CodeBlock declareRecord(String name, RecordObjectSpecification<?> input, boolean isIterable, boolean createsDataFetchers) { - if (!input.hasRecordReference()) { - return CodeBlock.empty(); - } - - return CodeBlock - .builder() - .declareNewIf(isIterable, asListedName(name), wrapArrayList(input.getRecordClassName())) - .declareNewIf(!isIterable, name, input.getRecordClassName()) - .addStatementIf(!input.hasJavaRecordReference() && !isIterable, "$N$L", name, createsDataFetchers ? ATTACH_RESOLVER : ATTACH) - .build(); - } - - public static CodeBlock recordTransformPart(String transformerName, String varName, String typeName, boolean isJava, boolean isInput) { - return CodeBlock.of("$N.$L($N, ", transformerName, recordTransformMethod(typeName, isJava, isInput), uncapitalize(varName)); - } - - /** - * @return CodeBlock that creates an empty List. - */ - @NotNull - public static CodeBlock listOf() { - return EMPTY_LIST; - } - - /** - * @return CodeBlock that wraps the supplied CodeBlock in a List. - */ - @NotNull - public static CodeBlock listOf(CodeBlock code) { - return CodeBlock.ofIf(!code.isEmpty(), "$T.of($L)", LIST.className, code); - } - - /** - * @return CodeBlock that wraps the supplied variable name in a List. - */ - @NotNull - public static CodeBlock listOf(String variable) { - return CodeBlock.of("$T.of($N)", LIST.className, variable); - } - - /** - * @return CodeBlock that wraps the provided CodeBlock in a Java list provided the condition is true. - */ - @NotNull - public static CodeBlock listOfIf(CodeBlock code, boolean condition) { - if (!condition) { - return code; - } - return listOf(indentIfMultiline(code)); - } - - /** - * @return CodeBlock that creates an empty Set. - */ - @NotNull - public static CodeBlock setOf() { - return EMPTY_SET; - } - - /** - * @return CodeBlock that wraps the supplied CodeBlock in a Set. - */ - @NotNull - public static CodeBlock setOf(CodeBlock code) { - return CodeBlock.ofIf(!code.isEmpty(), "$T.of($L)", SET.className, code); - } - - /** - * @return CodeBlock that wraps the supplied variable name in a Set. - */ - @NotNull - public static CodeBlock setOf(String variable) { - return CodeBlock.of("$T.of($N)", SET.className, variable); - } - - /** - * @return CodeBlock that creates an empty Map. - */ - @NotNull - public static CodeBlock mapOf() { - return EMPTY_MAP; - } - - /** - * @return CodeBlock that wraps the supplied CodeBlock in a Map. - */ - public static CodeBlock mapOf(CodeBlock code) { - return CodeBlock.of("$T.of($L)", MAP.className, code); - } - - /** - * @return CodeBlock that wraps the supplied CodeBlock in a Map using ofEntries. - * Use this instead of {@link #mapOf(CodeBlock)} when the map may have more than 10 entries. - */ - public static CodeBlock mapOfEntries(CodeBlock code) { - return CodeBlock.of("$T.ofEntries($L)", MAP.className, code); - } - - /** - * @return CodeBlock that wraps the supplied key string and value CodeBlocks in a Map.Entry. - */ - public static CodeBlock mapEntry(String key, CodeBlock value) { - return CodeBlock.of("$T.entry($S, $L)", MAP.className, key, value); - } - - /** - * @return CodeBlock that wraps this method name in a method call format. - */ - public static CodeBlock asMethodCall(String method) { - return CodeBlock.of(".$L()", method); - } - - /** - * @return CodeBlock that wraps this method name in a method call format after the specified source. - */ - public static CodeBlock asMethodCall(String source, String method) { - return CodeBlock.of("$N$L", source, asMethodCall(method)); - } - - /** - * @return CodeBlock that wraps this method name in a static method call format after the specified source. - */ - public static CodeBlock asMethodCall(TypeName source, String method) { - return CodeBlock.of("$T$L", source, asMethodCall(method)); - } - - /** - * @return CodeBlock that wraps this variable in a Java cast. - */ - public static CodeBlock asCast(TypeName type, String variable) { - return CodeBlock.of("(($T) $N)", type, variable); - } - - /** - * @return CodeBlock that wraps this code in a Java cast. - */ - public static CodeBlock asCast(TypeName type, CodeBlock code) { - return CodeBlock.of("(($T) $L)", type, code); - } - - /** - * @return CodeBlock that adds a collect to List call to be used on a Stream. - */ - @NotNull - public static CodeBlock collectToList() { - return COLLECT_TO_LIST; - } - - /** - * @return CodeBlock that adds a findFirst call to be used on a collection. - */ - @NotNull - public static CodeBlock findFirst() { - return FIND_FIRST; - } - - /** - * @return CodeBlock that wraps the provided CodeBlock name in a simple null check. - */ - @NotNull - public static CodeBlock nullIfNullElse(CodeBlock code) { - return CodeBlock.of("$L == null ? null : ", code); - } - - /** - * @return CodeBlock that wraps the provided CodeBlock name in a simple null check. - */ - @NotNull - public static CodeBlock nullIfNullElseThis(CodeBlock code) { - return CodeBlock.join(nullIfNullElse(code), code); - } - - /** - * @return CodeBlock that wraps the provided CodeBlock name in a mapping null check. - */ - @NotNull - public static CodeBlock listedNullCheck(String variable, CodeBlock code) { - return CodeBlock.of("$T.stream($N).allMatch($T::isNull) ? null : $L", ARRAYS.className, variable, OBJECTS.className, code); - } - - /** - * @return CodeBlock that adds something to a String if it is not empty. - */ - @NotNull - public static CodeBlock addStringIfNotEmpty(String target, String addition) { - return CodeBlock.of("$N.isEmpty() ? $N : $N + $S", target, target, target, addition); - } - - /** - * @return CodeBlock that checks whether a path is in use. - */ - @NotNull - public static CodeBlock selectionSetLookup(String path, boolean atResolver, boolean useArguments) { - if (!atResolver) { - return CodeBlock.of("$N.contains($N + $S)", useArguments ? VAR_ARGS : VAR_SELECT, VAR_PATH_HERE, path); - } - return CodeBlock.of("$L.contains($S)", asMethodCall(VAR_TRANSFORMER, useArguments ? METHOD_ARGS_NAME : METHOD_SELECT_NAME), path); - } - - /** - * @return CodeBlock that sets a value through a mapping. - */ - @NotNull - public static CodeBlock setValue(String container, MethodMapping mapping, CodeBlock value, boolean isDataFetcherKey) { - return CodeBlock.of("$N$L", uncapitalize(container), isDataFetcherKey ? mapping.asSetKeyCall(value) : mapping.asSetCall(value)); - } - - /** - * @return CodeBlock that sets a value through a mapping. - */ - @NotNull - public static CodeBlock setValue(String container, MethodMapping mapping, CodeBlock value) { - return CodeBlock.of("$N$L", uncapitalize(container), mapping.asSetCall(value)); - } - /** - * @return CodeBlock that gets a value through a mapping. - */ - @NotNull - public static CodeBlock getValue(String container, MethodMapping mapping) { - return CodeBlock.of("$N$L", uncapitalize(container), mapping.asGetCall()); - } - - /** - * @return CodeBlock that creates a data fetcher object. - */ - @NotNull - public static CodeBlock newDataFetcher() { - return NEW_DATA_FETCHER; - } - - /** - * @return CodeBlock that creates a service data fetcher through a transform object. - */ - @NotNull - public static CodeBlock newServiceDataFetcherWithTransform() { - return NEW_SERVICE_DATA_FETCHER_TRANSFORM; - } - - /** - * @return CodeBlock that declares a resolver transformer. - */ - @NotNull - public static CodeBlock declareTransform() { - return DECLARE_TRANSFORM; - } - - /** - * @return CodeBlock does a null check on the variable and runs continue if it is. - */ - @NotNull - public static CodeBlock continueCheck(String value) { - return CodeBlock.statementOf("if ($N == null) continue", value); - } - - /** - * @return CodeBlock consisting of a function for a count DB call. - */ - @NotNull - public static CodeBlock countFunction(String queryLocation, String queryMethodName, CodeBlocks inputList, boolean isService) { - var lambdaVars = CodeBlocks - .create() - .addVarIf(!isService, VAR_CONTEXT) - .addVar(VAR_RESOLVER_KEYS) - .join(", "); - return CodeBlock.of( - "($L) -> $L.count$L($L)", - lambdaVars, - getSource(queryLocation, isService), - capitalize(queryMethodName), - inputList.join(", ") - ); - } - - public static ClassName getQueryClassName(String queryLocation) { - return getGeneratedClassName(DBClassGenerator.DEFAULT_SAVE_DIRECTORY_NAME, queryLocation); - } - - /** - * @return CodeBlock consisting of a function for a generic DB call. - */ - @NotNull - public static CodeBlock queryFunction(String queryLocation, String queryMethodName, CodeBlocks inputList, boolean hasKeyValues, boolean usesKeyValues, boolean isService) { - var inputs = CodeBlocks - .create() - .addVarIf(!isService, VAR_CONTEXT) - .addVarIf(hasKeyValues, VAR_RESOLVER_KEYS) - .addVarIf(!isService, VAR_SELECTION_SET) - .join(", "); - - var params = CodeBlocks - .create() - .addVarIf(!isService, VAR_CONTEXT) - .addVarIf(!isService && GeneratorConfig.shouldMakeNodeStrategy(), VAR_NODE_STRATEGY) - .addVarIf(usesKeyValues, VAR_RESOLVER_KEYS) - .addAll(inputList) - .addVarIf(!isService, VAR_SELECTION_SET) - .join(", "); - - return CodeBlock.of("($L) -> $L", inputs, invokeExternalMethod(getSource(queryLocation, isService), queryMethodName, params)); - } - - private static CodeBlock getSource(String queryLocation, boolean isService) { - return isService ? CodeBlock.of("$N", uncapitalize(queryLocation)) : CodeBlock.of("$T", getQueryClassName(queryLocation)); - } - - public static CodeBlock invokeExternalMethod(CodeBlock source, String methodName, CodeBlock parameters) { - return CodeBlock.of("$L.$L($L)", source, methodName, parameters); - } - - /** - * @return CodeBlock that wraps the provided CodeBlock in an if not null check. - */ - @NotNull - public static CodeBlock wrapNotNull(String valueToCheck, CodeBlock code) { - return wrapNotNull(CodeBlock.of("$N", valueToCheck), code); - } - - /** - * @return CodeBlock that wraps the provided CodeBlock in an if not null check. - */ - @NotNull - public static CodeBlock wrapNotNull(CodeBlock valueToCheck, CodeBlock code) { - return CodeBlock - .builder() - .beginControlFlow("if ($L != null)", valueToCheck) - .add(code) - .endControlFlow() - .build(); - } - - /** - * @return CodeBlock that wraps the provided CodeBlock in a jOOQ row. - */ - @NotNull - public static CodeBlock wrapRow(CodeBlock code) { - return CodeBlock.ofIf(!code.isEmpty(), "$T.row($L)", DSL.className, indentIfMultiline(code)); - } - - /** - * @return CodeBlock that wraps the provided CodeBlock in a jOOQ row. - */ - @NotNull - public static CodeBlock wrapRowOfMap(CodeBlock code) { - return CodeBlock.ofIf(!code.isEmpty(), "$T.rowOfMap($L)", QUERY_HELPER.className, indentIfMultiline(code)); - } - - /** - * @return CodeBlock that wraps the provided CodeBlock in a jOOQ coalesce. - */ - @NotNull - public static CodeBlock wrapCoalesce(CodeBlock code) { - return CodeBlock.ofIf(!code.isEmpty(), "$T.coalesce($L)", DSL.className, indentIfMultiline(code)); - } - - /** - * @return CodeBlock that wraps the provided CodeBlock in a call to SelectionSet#ifRequested. - */ - @NotNull - public static CodeBlock wrapSelectIfRequested(String path, CodeBlock code) { - return CodeBlock.of("$N.ifRequested($S, () -> $L)", VAR_SELECT, path, indentIfMultiline(code)); - } - - /** - * returns a transform that wraps the receiver builder's accumulated content in a {@code for}-each loop over the named variable. - */ - public static UnaryOperator<CodeBlock.Builder> wrapFor(String variable) { - return b -> CodeBlock - .builder() - .beginControlFlow("for (var $L : $N)", namedIteratorPrefix(variable), inputPrefix(variable)) - .add(b.build()) - .endControlFlow(); - } - - /** - * returns a transform that wraps the receiver builder's accumulated content in an indexed {@code for} loop. - */ - public static UnaryOperator<CodeBlock.Builder> wrapForIndexed(String variable) { - return b -> CodeBlock - .builder() - .beginControlFlow("for (int $1L = 0; $1N < $2N.size(); $1N++)", namedIndexIteratorPrefix(variable), inputPrefix(variable)) - .add(b.build()) - .endControlFlow(); - } - - /** - * returns a transform that wraps the receiver builder's accumulated content in {@code DSL.row(...)}. Returns an empty builder - * when the receiver is empty (matches {@link #wrapRow(CodeBlock)} behavior). - */ - public static UnaryOperator<CodeBlock.Builder> wrapRow() { - return b -> { - var inner = b.build(); - if (inner.isEmpty()) return CodeBlock.builder(); - return CodeBlock.builder().add("$T.row($L)", DSL.className, indentIfMultiline(inner)); - }; - } - - /** - * returns a transform that wraps the receiver builder's accumulated content in {@code QueryHelper.rowOfMap(...)}. Returns an - * empty builder when the receiver is empty. - */ - public static UnaryOperator<CodeBlock.Builder> wrapRowOfMap() { - return b -> { - var inner = b.build(); - if (inner.isEmpty()) return CodeBlock.builder(); - return CodeBlock.builder().add("$T.rowOfMap($L)", QUERY_HELPER.className, indentIfMultiline(inner)); - }; - } - - /** - * returns a transform that wraps the receiver builder's accumulated content in {@code DSL.coalesce(...)}. Returns an empty - * builder when the receiver is empty. - */ - public static UnaryOperator<CodeBlock.Builder> wrapCoalesce() { - return b -> { - var inner = b.build(); - if (inner.isEmpty()) return CodeBlock.builder(); - return CodeBlock.builder().add("$T.coalesce($L)", DSL.className, indentIfMultiline(inner)); - }; - } - - /** - * @return CodeBlock that wraps the provided CodeBlock in a jOOQ inline. - */ - @NotNull - public static CodeBlock inline(CodeBlock code) { - return CodeBlock.ofIf(!code.isEmpty(), "$T.inline($L)", DSL.className, code); - } - - /** - * @return CodeBlock that wraps the provided CodeBlock in a jOOQ val. - */ - @NotNull - public static CodeBlock val(CodeBlock code) { - return CodeBlock.ofIf(!code.isEmpty(), "$T.val($L)", DSL.className, code); - } - - public static @NotNull CodeBlock defaultValue(CodeBlock field) { - return CodeBlock.of("$T.defaultValue($L)", DSL.className, field); - } - - public static @NotNull CodeBlock defaultValue(String tableName, String fieldName) { - return defaultValue(tableFieldCodeBlock(tableName, fieldName)); - } - - public static CodeBlock tableFieldCodeBlock(String targetTable, String column) { - return tableFieldCodeBlock(CodeBlock.of("$N", targetTable), column); - } - - public static CodeBlock tableFieldCodeBlock(CodeBlock targetTable, String column) { - return CodeBlock.of("$L.$L", targetTable, column); - } - - /** - * @return Add appropriate indentation if this code has multiple lines. - */ - @NotNull - public static CodeBlock indentIfMultiline(CodeBlock code) { - if (!code.toString().contains("\n")) { - return code; - } - - return CodeBlock - .builder() - .add("\n") - .indent() - .indent() - .add(code) - .add("\n") - .unindent() - .unindent() - .build(); - } - - /** - * @return CodeBlock that sends this variable through an enum mapping. - */ - public static CodeBlock makeEnumMapBlock(CodeBlock inputVariable, CodeBlock valueLists) { - return CodeBlock.of("$T.makeEnumMap($L, $L)", QUERY_HELPER.className, inputVariable, valueLists); - } - - /** - * @return CodeBlock that sends this variable through an enum mapping. - */ - public static CodeBlock makeEnumMapBlock(String inputVariable, CodeBlock valueLists) { - return makeEnumMapBlock(CodeBlock.of(inputVariable), valueLists); - } - - /** - * @return Code block containing the enum conversion method call with anonymous function declarations. - */ - public static CodeBlock toJOOQEnumConverter(String enumType, ProcessedSchema schema) { - if (!schema.isEnum(enumType)) { - return CodeBlock.empty(); - } - - var enumEntry = schema.getEnum(enumType); - var tempVariableName = "s"; - var code = CodeBlock.of( - "$T.class,\n$L -> $L,\n$L -> $L", - enumEntry.getGraphClassName(), - tempVariableName, - makeEnumMapBlock(tempVariableName, renderEnumMapElements(enumEntry, true)), - tempVariableName, - makeEnumMapBlock(tempVariableName, renderEnumMapElements(enumEntry, false)) - ); - return CodeBlock.of(".convert($L)", indentIfMultiline(code)); - } - - /** - * @return CodeBlock that converts a SQL array field to a Java List using jOOQ's convertFrom with null-safety. - */ - public static CodeBlock arrayToListConverter() { - return CodeBlock.of(".convertFrom($T.nullOnAllNull($N -> $T.of($L)))", - FUNCTIONS.className, VAR_ITERATOR, LIST.className, VAR_ITERATOR); - } - - /** - * @return Code block containing the enum conversion method call. - */ - public static CodeBlock toGraphEnumConverter(String enumType, CodeBlock field, boolean toRecord, ProcessedSchema schema) { - if (!schema.isEnum(enumType)) { - return CodeBlock.empty(); - } - return makeEnumMapBlock(field, renderEnumMapElements(schema.getEnum(enumType), !toRecord)); - } - - private static CodeBlock renderEnumMapElements(EnumDefinition enumEntry, boolean flipDirection) { - var hasEnumReference = enumEntry.hasJavaEnumMapping(); - var enumReference = enumEntry.getEnumReference(); - var entryClassName = enumEntry.getGraphClassName(); - var referenceClassName = enumReference != null - ? ClassName.get(GeneratorConfig.getExternalReferences().getClassFrom(enumReference)) - : null; - - var fromBlocks = new ArrayList<CodeBlock>(); - var toBlocks = new ArrayList<CodeBlock>(); - for (var enumValue : enumEntry.getFields()) { - var name = enumValue.getUnprocessedFieldOverrideInput(); - var key = CodeBlock.of("$T.$L", entryClassName, enumValue.getName()); - var value = hasEnumReference ? CodeBlock.of("$T.$L", referenceClassName, name) : CodeBlock.of("$S", name); - fromBlocks.add(flipDirection ? value : key); - toBlocks.add(flipDirection ? key : value); - } - - return CodeBlock.of( - "$L, $L", - listOf(CodeBlock.join(", ", fromBlocks)), - listOf(CodeBlock.join(", ", toBlocks)) - ); - } - - /** - * @return Code block of a true jOOQ condition. - */ - public static CodeBlock trueCondition() { - return TRUE_CONDITION; - } - - /** - * @return Code block of a false jOOQ condition. - */ - public static CodeBlock falseCondition() { - return FALSE_CONDITION; - } - - /** - * @return Code block of a jOOQ "no condition". - */ - public static CodeBlock noCondition() { - return NO_CONDITION; - } - - /** - * @param recordName Name of the record to transform. - * @param scope The scope of transforms that should be applied. Currently only {@link TransformScope#ALL_MUTATIONS} is supported. - * @return CodeBlock where all defined global transforms are applied to the record. - */ - public static CodeBlock applyGlobalTransforms(String recordName, TypeName recordTypeName, TransformScope scope) { - return GeneratorConfig - .getGlobalTransforms(scope) - .stream() - .map(it -> getMethodFrom(it.getFullyQualifiedClassName(), it.getMethod())) - .map(transform -> applyTransform(recordName, recordTypeName, transform)) - .collect(CodeBlock.joining()); - } - - private static Method getMethodFrom(String fullyQualifiedClassName, String methodName) { - try { - var classReference = Class.forName(fullyQualifiedClassName); - return Arrays.stream(classReference.getMethods()) - .filter(it -> it.getName().equalsIgnoreCase(methodName)) - .findFirst() - .orElseThrow(() -> new IllegalArgumentException("Could not find method with name " + methodName + " in external class " + fullyQualifiedClassName)); - - } catch (ClassNotFoundException e) { - throw new IllegalArgumentException("Could not find external class " + fullyQualifiedClassName); - } - } - - /** - * @param recordName Name of the record to transform. - * @param transform The method that should transform the record. - * @return CodeBlock where the transform is applied to the record. - */ - public static CodeBlock applyTransform(String recordName, TypeName recordTypeName, Method transform) { - return CodeBlock.statementOf( - "$N = ($T) $T.$L($N, $N)", - listedOutputPrefix(recordName), - wrapArrayList(recordTypeName), - ClassName.get(transform.getDeclaringClass()), - transform.getName(), - VAR_CONTEXT, - listedOutputPrefix(recordName) - ); - } - - public static CodeBlock fetchMapping(boolean iterable) { - return iterable - ? CodeBlock.of("$1L -> $1N.value1().intoMap(), $1L -> $1N.value2().intoMap()", VAR_ITERATOR) - : CodeBlock.of(".fetchOneMap()"); - } - - /** - * @return CodeBlock that returns the provided name. - */ - @NotNull - public static CodeBlock returnWrap(String variable) { - return CodeBlock.statementOf("return $N", variable); - } - - /** - * @return CodeBlock that returns the provided code. - */ - @NotNull - public static CodeBlock returnWrap(CodeBlock code) { - return CodeBlock.statementOf("return $L", code); - } - - /** - * Returns condition for filtering on resolver key. - */ - public static CodeBlock inResolverKeysBlock(String resolverKeyParamName, FetchContext context) { - return inResolverKeysBlock(resolverKeyParamName, context.getResolverKey().key(), context.getTargetTableName(), context.getTargetAlias()); - } - - /** - * Returns condition for filtering on resolver key, using the table's primary key. - */ - public static CodeBlock inResolverKeysBlock(String resolverKeyParamName, String targetTableJavaName) { - return inResolverKeysBlock(resolverKeyParamName, getPrimaryKeyForTable(targetTableJavaName).orElseThrow(), targetTableJavaName, targetTableJavaName); - } - - private static CodeBlock inResolverKeysBlock(String resolverKeyParamName, Key<?> key, String tableName, String alias) { - return CodeBlock.of( - "$1L.in($2N.stream().map($3N -> $3N.key().valuesRow()).toList())", - wrapRow(commaSeparatedKeyFields(key, tableName, alias)), - resolverKeyParamName, - VAR_ITERATOR - ); - } - - /** - * Returns code for selecting resolver key and converting it into a table record. - */ - public static CodeBlock resolverKeyAsTableRecord(FetchContext context) { - return keyAsTableRecordWithQueryHelper(context.getResolverKey().key(), context.getTargetTableName(), context.getTargetAlias()); - } - - /** - * Returns a CodeBlock that selects key fields as a row and converts fetched records into TableRecords - * via {@link no.sikt.graphql.helpers.query.QueryHelper#intoTableRecord}. - */ - public static CodeBlock keyAsTableRecordWithQueryHelper(Key<?> key, String tableName, String aliasVariableName) { - CodeBlock keyFields = commaSeparatedKeyFields(key, tableName, aliasVariableName); - return CodeBlock.builder() - .add(wrapRow(keyFields)) - .add(".convertFrom($1N -> $2T.intoTableRecord($1N, $3L))", VAR_ITERATOR, QUERY_HELPER.className, listOf(keyFields)) - .build(); - } - - public static CodeBlock commaSeparatedResolverKeyFields(FetchContext context) { - return commaSeparatedKeyFields(context.getResolverKey().key(), context.getTargetTableName(), context.getTargetAlias()); - } - - private static CodeBlock commaSeparatedKeyFields(Key<?> key, String tableName, String aliasVariableName) { - return getJavaFieldNamesForKey(tableName, key) - .stream() - .map(it -> CodeBlock.of("$N.$L", aliasVariableName, it)) - .collect(CodeBlock.joining(", ")); - } - - public static CodeBlock getPrimaryKeyFieldsWithTableAliasBlock(String targetAlias) { - return CodeBlock.of("$N.fields($L)", targetAlias, getPrimaryKeyFieldsArrayBlock(targetAlias)); - } - - public static CodeBlock getPrimaryKeyFieldsWithTableAliasBlock(String targetAlias, String direction) { - var sortOrder = direction.equalsIgnoreCase("ASC") - ? CodeBlock.of("$T.ASC", SORT_ORDER.className) - : CodeBlock.of("$T.DESC", SORT_ORDER.className); - return getPrimaryKeyFieldsWithTableAliasBlock(targetAlias, sortOrder); - } - - public static CodeBlock getPrimaryKeyFieldsWithTableAliasBlock(String targetAlias, CodeBlock sortOrder) { - return CodeBlock.of( - "$T.of($N.fields($L)).map(f -> f.sort($L)).toArray($T[]::new)", - STREAM.className, targetAlias, getPrimaryKeyFieldsArrayBlock(targetAlias), - sortOrder, SORT_FIELD.className); - } - - private static @NotNull CodeBlock getPrimaryKeyFieldsArrayBlock(String target) { - return CodeBlock.of("$L.getPrimaryKey().getFieldsArray()", target); - } - - public static CodeBlock ofTernary(CodeBlock ifExpr, CodeBlock thenExpr, CodeBlock elseExpr) { - return CodeBlock.of("$L ? $L : $L", ifExpr, thenExpr, elseExpr); - } - - public static CodeBlock staticTableInstanceBlock(String tableName) { - var tableClass = getTableByJavaFieldName(tableName) - .orElseThrow(() -> new RuntimeException("Unknown table " + tableName)) - .getClass(); - return CodeBlock.of("$T.$N", tableClass, tableName); - } - - - public static CodeBlock createNodeIdBlock(NodeConfiguration nodeConfiguration, String targetAlias) { - return createNodeIdBlock( - CodeBlock.of("$S, $L", - nodeConfiguration.typeId(), - nodeConfiguration.nodeIdFieldsWithTableVariableBlock(targetAlias) - ) - ); - } - - public static CodeBlock createNodeIdBlockForRecord(NodeConfiguration nodeConfiguration, String recordVariableName) { - return createNodeIdBlock( - CodeBlock.of("$N, $S, $L", - recordVariableName, - nodeConfiguration.typeId(), - nodeConfiguration.nodeIdFieldsWithStaticTableInstanceBlock() - ) - ); - } - - private static CodeBlock createNodeIdBlock(CodeBlock args) { - return CodeBlock.of("$N.createId($L)", VAR_NODE_STRATEGY, args); - } - - - public static CodeBlock hasNodeIdOrIdsBlock(CodeBlock idOrRecordVariable, NodeConfiguration nodeConfiguration, String targetAlias, boolean isMultiple) { - return hasNodeIdOrIdsBlock( - nodeConfiguration.typeId(), - idOrRecordVariable, - nodeConfiguration.nodeIdFieldsWithTableVariableBlock(targetAlias), - isMultiple - ); - } - - public static CodeBlock hasNodeIdOrIdsBlock(CodeBlock idOrRecordVariable, NodeConfiguration nodeConfiguration, String targetAlias, List<String> overrideKeyCols, boolean isMultiple) { - return hasNodeIdOrIdsBlock( - nodeConfiguration.typeId(), - idOrRecordVariable, - tableFieldsBlock(CodeBlock.of("$N", targetAlias), overrideKeyCols), - isMultiple - ); - } - - private static CodeBlock hasNodeIdOrIdsBlock(String typeId, CodeBlock idOrRecordVariable, CodeBlock keyColumns, boolean isMultiple) { - var args = CodeBlock.of("$S, $L, $L", typeId, idOrRecordVariable, keyColumns); - return isMultiple ? hasNodeIdsBlock(args) : hasNodeIdBlock(args); - } - - private static CodeBlock hasNodeIdBlock(CodeBlock code) { - return CodeBlock.of("$N.hasId($L)", VAR_NODE_STRATEGY, code); - } - - private static CodeBlock hasNodeIdsBlock(CodeBlock code) { - return CodeBlock.of("$N.hasIds($L)", VAR_NODE_STRATEGY, code); - } - - /** - * @return CodeBlock that decodes a single node ID into a table record using - * {@link no.sikt.graphql.NodeIdStrategy#nodeIdToTableRecord}. - */ - public static CodeBlock nodeIdToTableRecordBlock(NodeConfiguration node, CodeBlock idValue) { - return CodeBlock.of("$N.nodeIdToTableRecord($L, $S, $L)", - VAR_NODE_STRATEGY, - idValue, - node.typeId(), - listOf(node.nodeIdFieldsWithStaticFieldBlock()) - ); - } - - /** - * @return CodeBlock that streams a list of node IDs and decodes each to a table record. - */ - public static CodeBlock nodeIdsToTableRecordsBlock(NodeConfiguration node, CodeBlock listValue) { - return CodeBlock.of("$L.stream().map($N -> $L).toList()", - listValue, - VAR_ITERATOR, - nodeIdToTableRecordBlock(node, CodeBlock.of("$N", VAR_ITERATOR)) - ); - } - - /** - * @return CodeBlock with comma-separated table fields using a static table instance resolved from the table name. - * Example: {@code Film.FILM.FILM_ID, Film.FILM.LANGUAGE_ID} - */ - public static CodeBlock tableFieldsWithStaticTableInstanceBlock(String tableJavaName, List<String> fieldJavaNames) { - return tableFieldsBlock(staticTableInstanceBlock(tableJavaName), fieldJavaNames); - } - - /** - * @param tableRef The CodeBlock with the table reference. For example a table alias variable, or a static table instance block. - * @return CodeBlock with comma-separated table fields from the given table reference code block. - */ - public static CodeBlock tableFieldsBlock(CodeBlock tableRef, List<String> fieldJavaNames) { - return fieldJavaNames.stream() - .map(it -> tableFieldCodeBlock(tableRef, it)) - .collect(CodeBlock.joining(", ")); - } - - /** - * Returns a CodeBlock that extracts the primary key from a TableRecord and maps it into a new record of the same type. - * The resulting record will only have its key fields populated. - * <p>Example output: {@code myTableRecord.key().into(MyTableRecord.class)} - * - * @param variableName variable name of the table record to extract the key from. - * @param recordClass the record class to map the key into. This should match the record class of the variable. - * @return CodeBlock that converts a table record into a key-only record of the same type. - */ - public static CodeBlock extractKeyAsTableRecord(String variableName, TypeName recordClass) { - return CodeBlock.of("$N.key().into($T.class)", variableName, recordClass); - } - - /** - * Same as {@link #extractKeyAsTableRecord} but emits a null-guard so the expression is safe - * to evaluate when the source variable may be null at runtime (e.g. when a service returns - * null or a list element is null). - * - * <p>Example output: {@code myTableRecord != null ? myTableRecord.key().into(MyTableRecord.class) : null} - * - * @param variableName variable name of the table record to extract the key from. - * @param recordClass the record class to map the key into. This should match the record class of the variable. - * @return CodeBlock that converts a possibly-null table record into a key-only record, or null. - */ - public static CodeBlock extractKeyAsTableRecordWithNullCheck(String variableName, TypeName recordClass) { - return CodeBlock.transformIfNotNull( - ofVar(variableName), - extractKeyAsTableRecord(variableName, recordClass) - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codebuilding/KeyWrapper.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codebuilding/KeyWrapper.java deleted file mode 100644 index 0d1a7d12cc..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codebuilding/KeyWrapper.java +++ /dev/null @@ -1,190 +0,0 @@ -package no.sikt.graphitron.generators.codebuilding; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.definitions.interfaces.GenerationTarget; -import no.sikt.graphitron.definitions.interfaces.RecordObjectSpecification; -import no.sikt.graphitron.javapoet.ClassName; -import no.sikt.graphitron.javapoet.ParameterizedTypeName; -import no.sikt.graphitron.javapoet.TypeName; -import no.sikt.graphitron.validation.ValidationHandler; -import no.sikt.graphql.schema.ProcessedSchema; -import org.jooq.Key; - -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Optional; -import java.util.function.Supplier; -import java.util.stream.Collectors; - -import static no.sikt.graphitron.mappings.JavaPoetClassName.LIST; -import static no.sikt.graphitron.mappings.TableReflection.*; -import static no.sikt.graphitron.validation.ValidationHandler.addErrorMessage; -import static no.sikt.graphql.directives.GenerationDirective.SPLIT_QUERY; -import static org.apache.commons.lang3.StringUtils.capitalize; -import static org.apache.commons.lang3.StringUtils.uncapitalize; - -public record KeyWrapper(Key<?> key, TypeName tableRecordTypeName) { - public String getDTOVariableName() { - return uncapitalize(key.getName()); - } - - public String getDTOGetterName() { - return "get" + capitalize(key.getName()); - } - - /** - * Returns the TableRecord TypeName for this key. - */ - public TypeName getTypeName() { - return getTypeName(false); - } - - /** - * Returns the TableRecord TypeName for this key, optionally wrapped in a List. - */ - public TypeName getTypeName(boolean asList) { - return asList ? ParameterizedTypeName.get(LIST.className, tableRecordTypeName) : tableRecordTypeName; - } - - /** - * Maps resolver field names to their resolved keys (foreign key or primary key). - * - * @param fields The fields to find keys for. This list may contain fields which are not resolvers. - * @param schema The processed schema. - * @return Map of field names to their resolved keys. - */ - public static LinkedHashMap<String, KeyWrapper> getKeyMapForResolverFields(List<? extends GenerationField> fields, ProcessedSchema schema) { - return fields.stream() - .filter(GenerationTarget::isGeneratedWithResolver) - .collect(Collectors.toMap(GenerationField::getName, it -> - getKeyForResolverFieldOrThrow(it, schema), (a, b) -> b, LinkedHashMap::new)); - } - - /** - * Get the set of keys used in the resolver fields given a list of fields. - * The key could either be a foreign key or the primary key of the current table. - * - * @param fields The fields to find keys for - * @param schema The processed schema - * @return The map of field names and keys - */ - public static LinkedHashSet<KeyWrapper> getKeySetForResolverFields(List<? extends GenerationField> fields, ProcessedSchema schema) { - return new LinkedHashSet<>(getKeyMapForResolverFields(fields, schema).values()); - } - - /** - * Finds the key used in the first step when resolving a resolver field, throwing if not found. - * - * @param field The resolver field. - * @param processedSchema The processed schema. - * @return Wrapper for the key used in the first resolution step. - */ - public static KeyWrapper getKeyForResolverFieldOrThrow(GenerationField field, ProcessedSchema processedSchema) { - return getResolverKey(field, processedSchema) - .orElseThrow(() -> new IllegalStateException("Failed to find resolver key for field " + field.formatPath())); - } - /** - * Finds the key used in the first resolution step if the field is a resolver field. - */ - private static Optional<KeyWrapper> getResolverKey(GenerationField field, ProcessedSchema processedSchema) { - if (!field.createsDataFetcher()) return Optional.empty(); - - var container = processedSchema.getRecordType(field.getContainerTypeName()); - - var previousTable = container.hasTable() ? - container.getTable() - : Optional.ofNullable(processedSchema.getPreviousTableObjectForObject(container)).map(RecordObjectSpecification::getTable).orElse(null); - - if (previousTable == null) { - var targetTable = processedSchema.getRecordType(field).getTable().getName(); - return withPrimaryKey( - targetTable, - () -> String.format("Code generation failed for %s as the table '%s' must have a primary key in order to be referenced from a service.", - field.formatPath(), targetTable) - ); - } - - var tableFromFieldType = processedSchema.isRecordType(field) ? processedSchema.getRecordType(field).getTable() : null; - - if (GeneratorConfig.alwaysUsePrimaryKeyInSplitQueries() || processedSchema.isMultiTableField(field)) { - return withPrimaryKey( - previousTable.getName(), - () -> String.format("Code generation failed for %s as the table '%s' must have a primary key in order to reference another table in @%s field.", - field.formatPath(), previousTable.getName(), SPLIT_QUERY.getName()) - ); - } - - String foreignKeyName; - if (processedSchema.isScalar(field.getTypeName()) && !field.hasFieldReferences()) { - throw new IllegalStateException("Cannot resolve reference for scalar field " + field.formatPath() + "."); - } else if (field.hasFieldReferences()) { - var firstRef = field.getFieldReferences().stream().findFirst().get(); - Optional<String> implicitKey = firstRef.hasTable() ? findImplicitKey(previousTable.getName(), firstRef.getTable().getName()) : Optional.empty(); - - if (firstRef.hasKey()) { - foreignKeyName = firstRef.getKey().getName(); - } else if (firstRef.hasTableCondition() && implicitKey.isEmpty()) { - return withPrimaryKey( - previousTable.getName(), - () -> String.format("Code generation failed for %s as the table '%s' must have a primary key in order to reference another table without a foreign key.", - field.formatPath(), previousTable.getName()) - ); - } else { - foreignKeyName = implicitKey.stream().findFirst() - .orElseThrow(() -> { - addErrorMessage("Cannot find implicit key for field %s.", field.formatPath()); - return ValidationHandler.getException(); - }); - } - } else { - foreignKeyName = findImplicitKey(previousTable.getName(), (tableFromFieldType != null ? tableFromFieldType : previousTable).getName()) - .orElseThrow(() -> { - addErrorMessage("Cannot find implicit key for field %s.", field.formatPath()); - return ValidationHandler.getException(); - }); - } - - var foreignKey = getForeignKey(foreignKeyName) - .orElseThrow(() -> { - addErrorMessage("Cannot find key with name '%s'.", foreignKeyName); - return ValidationHandler.getException(); - }); - - String javaTableNameForKey = getTableJavaFieldNameByTableName(foreignKey.getTable().getName()) - .orElseThrow(() -> new IllegalStateException("Cannot find jOOQ table name for table " + foreignKey.getTable().getName())); // Should never happen - - var targetTable = javaTableNameForKey.equalsIgnoreCase(previousTable.getName()) - ? foreignKey.getInverseKey().getTable() - : foreignKey.getTable(); - - return Optional.of(new KeyWrapper(foreignKey, ClassName.get(targetTable.getRecordType()))); - } - - private static Optional<KeyWrapper> withPrimaryKey(String tableJavaName, Supplier<String> noPrimaryKeyErrorMessage) { - var primaryKey = getPrimaryKeyForTable(tableJavaName) - .orElseThrow(() -> { - addErrorMessage(noPrimaryKeyErrorMessage.get()); - return ValidationHandler.getException(); - }); - var tableRecordClass = getRecordClass(tableJavaName) - .map(ClassName::get) - .orElseThrow(() -> { - // This should never happen - addErrorMessage("Cannot find TableRecord class for table with name '%s'.", tableJavaName); - return ValidationHandler.getException(); - }); - return Optional.of(new KeyWrapper(primaryKey, tableRecordClass)); - } - - /** - * Returns the TableRecord TypeName for the key used in the first resolution step of a resolver field. - * - * @param field The resolver field. - * @return TableRecord TypeName of the resolved key. - */ - public static TypeName getKeyTableRecordTypeName(GenerationField field, ProcessedSchema schema) { - return getKeyForResolverFieldOrThrow(field, schema).getTypeName(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codebuilding/LookupHelpers.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codebuilding/LookupHelpers.java deleted file mode 100644 index 1a50b00c2b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codebuilding/LookupHelpers.java +++ /dev/null @@ -1,235 +0,0 @@ -package no.sikt.graphitron.generators.codebuilding; - -import no.sikt.graphitron.definitions.fields.InputField; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.objects.InputDefinition; -import no.sikt.graphitron.javapoet.ClassName; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphql.schema.ProcessedSchema; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.*; -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.inputPrefix; -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.namedIteratorPrefix; -import static no.sikt.graphitron.mappings.JavaPoetClassName.*; - -public class LookupHelpers { - public static boolean lookupExists(ObjectField referenceField, ProcessedSchema processedSchema) { - if (referenceField.hasLookupKey()) { - return true; - } - - var inputTypes = filterInputTypes(referenceField.getNonReservedArguments(), processedSchema); - - var limit = processedSchema.getInputTypes().size(); - int count = inputTypes.size(); - var queue = new ArrayDeque<>(inputTypes); - while (!queue.isEmpty() && count <= limit) { - var input = queue.poll(); - if (input.containsLookupKey()) { - return true; - } - - var newInputTypes = filterInputTypes(input.getFields(), processedSchema); - queue.addAll(newInputTypes); - count += newInputTypes.size(); - } - - if (count > limit) { - throw new IllegalStateException("Recursion loop or duplication detected for query field " + referenceField.getName() + ". For lookup operations, any input type should only ever be referenced once."); - } - - return false; - } - - @NotNull - private static List<InputDefinition> filterInputTypes(List<? extends InputField> fields, ProcessedSchema processedSchema) { - return fields - .stream() - .filter(processedSchema::isInputType) - .map(processedSchema::getInputType) - .distinct() - .collect(Collectors.toList()); - } - - private static List<String> getLookupKeys(ObjectField referenceField, ProcessedSchema processedSchema) { - var keys = new ArrayList<String>(); - if (referenceField.hasLookupKey()) { - referenceField - .getLookupKeys() - .stream() - .filter(it -> !processedSchema.isInputType(referenceField.getArgumentByName(it))) - .forEach(keys::add); - } - - var fields = referenceField - .getNonReservedArguments() - .stream() - .filter(processedSchema::isInputType) - .toList(); - var limit = processedSchema.getInputTypes().size(); - fields.forEach(it -> keys.addAll(getLookupKeys(processedSchema.getInputType(it), it.getName(), it.isLookupKey(), processedSchema, fields.size(), limit))); - return keys; - } - - private static List<String> getLookupKeys(InputDefinition object, String previous, boolean lookupSetOnType, ProcessedSchema processedSchema, int count, int limit) { - if (count > limit) { - throw new IllegalStateException("Recursion loop or duplication detected for input type " + object.getName() + ". For lookup operations, any input type should only ever be referenced once."); - } - - Stream<InputField> fieldsToAdd; - if (lookupSetOnType) { - fieldsToAdd = object.getFields().stream(); - } else if (object.containsLookupKey()) { - fieldsToAdd = object.getLookupKeys().stream().map(object::getFieldByName); - } else { - fieldsToAdd = Stream.empty(); - } - - var keys = new ArrayList<String>(); - var path = previous + ","; - fieldsToAdd - .filter(it -> !processedSchema.isInputType(it)) - .map(it -> path + it.getName()) - .forEach(keys::add); - - var fields = object - .getFields() - .stream() - .filter(processedSchema::isInputType) - .toList(); - var nextCount = count + fields.size(); - fields.forEach(it -> - keys.addAll( - getLookupKeys( - processedSchema.getInputType(it), - path + it.getName(), - lookupSetOnType || it.isLookupKey(), - processedSchema, - nextCount, - limit - ) - ) - ); - return keys; - } - - @NotNull - public static CodeBlock getLookUpKeysAsColumnList(ObjectField ref, CodeBlock table, ProcessedSchema schema) { - var keyBlocks = getLookupKeys(ref, schema) - .stream() - .map(it -> buildKey(it, ref, schema, table)) - .toList(); - - List<CodeBlock> keysWithInline; - if (keyBlocks.size() > 1) { - keysWithInline = keyBlocks - .stream() - .map(it -> CodeBlock.of("$T.inlined($L)", DSL.className, it)) - .toList(); - } else { - keysWithInline = keyBlocks; - } - - var blocksWithSeparators = keysWithInline - .stream() - .limit(keysWithInline.size() - 1) - .map(it -> CodeBlock.of("$L, $T.inline($S)", it, DSL.className, ",")); - - return Stream - .concat(blocksWithSeparators, Stream.of(keysWithInline.get(keysWithInline.size() - 1))) - .collect(CodeBlock.joining(", ")); - } - - @NotNull - private static CodeBlock buildKey(String key, ObjectField ref, ProcessedSchema schema, CodeBlock table) { - var components = key.split(","); - if (components.length < 2) { - return components.length < 1 ? CodeBlock.empty() : Optional - .ofNullable(ref.getArgumentByName(components[0])) - .map(it -> getKeyFieldBlock(schema, table, it)) - .orElse(CodeBlock.empty()); - } - return getKeyFieldBlock(schema, table, lastInput(components, schema, ref)); - } - - private static @NotNull CodeBlock getKeyFieldBlock(ProcessedSchema schema, CodeBlock table, InputField it) { - if (it.isID()) { - return schema.isNodeIdField(it) - ? createNodeIdBlock(schema.getNodeConfigurationForNodeIdFieldOrThrow(it), table.toString()) - : CodeBlock.of("$L$L", table, it.getMappingFromFieldOverride().asGetCall()); - } - var fieldBlock = CodeBlock.of("$L.$L", table, it.getUpperCaseName()); - if (it.getTypeClass().equals(ClassName.get(String.class))) { - return fieldBlock; - } - - return CodeBlock.of("$L.cast($T.class)", fieldBlock, STRING.className); - } - - public static CodeBlock getLookupKeysAsList(ObjectField referenceField, ProcessedSchema processedSchema) { - return listOf(getLookupKeys(referenceField, processedSchema).stream().map(it -> formatKeyAsList(referenceField, it, processedSchema)).collect(CodeBlock.joining(", "))); - } - - private static CodeBlock formatKeyAsList(ObjectField referenceField, String keySequence, ProcessedSchema schema) { - var components = keySequence.split(","); - if (components.length < 1) { - return CodeBlock.empty(); - } - - var path = iterateComponents(components, schema, referenceField); - var lastField = lastInput(components, schema, referenceField); - var lastType = lastField.getTypeClass(); - if (lastType != null && !path.isEmpty() && (lastType.isPrimitive() || lastType.isBoxedPrimitive()) && !lastField.getName().equalsIgnoreCase("String")) { - return CodeBlock.of("$T.formatString($L)", RESOLVER_HELPERS.className, path); - } - return path; - } - - private static InputField lastInput(String[] components, ProcessedSchema schema, ObjectField ref) { - var first = components[0]; - var argument = ref.getArgumentByName(first); - var container = schema.getInputType(argument); - var field = container != null && container.hasField(first) ? container.getFieldByName(first) : argument; - for (int i = 1; i < components.length; i++) { - field = container.getFieldByName(components[i]); - if (i < components.length - 1) { - container = schema.getInputType(field); - } - } - return field; - } - - private static CodeBlock iterateComponents(String[] components, ProcessedSchema schema, ObjectField ref) { - var path = CodeBlock.builder().add("$N", inputPrefix(ref.getArgumentByName(components[0]).getName())); - var collectBlock = CodeBlock.builder(); - - var first = components[0]; - var argument = ref.getArgumentByName(first); - var container = schema.getInputType(argument); - var field = container != null && container.hasField(first) ? container.getFieldByName(first) : argument; - var previousField = field; - for (int i = 1; i < components.length; i++) { - field = container.getFieldByName(components[i]); - if (i < components.length - 1) { - container = schema.getInputType(field); - } - collectBlock.addIf(previousField.isIterableWrapped(), " : $N)$L", "null", collectToList()); - - path - .addIf(previousField.isIterableWrapped(), ".stream().map($1L -> $1N != null ? $1N", namedIteratorPrefix(previousField.getName())) - .add(field.getMappingFromSchemaName().asGetCall()); - previousField = field; - } - - path.add(collectBlock.build()); - return path.build(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codebuilding/NameFormat.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codebuilding/NameFormat.java deleted file mode 100644 index b21d029d75..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codebuilding/NameFormat.java +++ /dev/null @@ -1,219 +0,0 @@ -package no.sikt.graphitron.generators.codebuilding; - -import no.sikt.graphitron.generators.db.DBClassGenerator; -import no.sikt.graphitron.generators.mapping.JavaRecordMapperClassGenerator; -import no.sikt.graphitron.generators.mapping.RecordMapperClassGenerator; -import org.apache.commons.lang3.StringUtils; -import org.jetbrains.annotations.NotNull; - -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.namedIteratorPrefix; -import static no.sikt.graphql.naming.GraphQLReservedName.FEDERATION_ENTITY_UNION; -import static no.sikt.graphql.naming.GraphQLReservedName.NODE_TYPE; -import static org.apache.commons.lang3.StringUtils.capitalize; -import static org.apache.commons.lang3.StringUtils.uncapitalize; - -/** - * Helper methods for formatting names. - */ -public class NameFormat { - public static final String - PREFIX_COUNT = "count", - PREFIX_GET = "get", - SUFFIX_LIST = "List", - PREFIX_VALIDATE = "validate", - SUFFIX_RECORD = "Record", - SUFFIX_RECORD_TRANSFORM = "ToJOOQ" + SUFFIX_RECORD, - SUFFIX_RECORD_TRANSFORM_JAVA = "ToJava" + SUFFIX_RECORD, - SUFFIX_RESPONSE_TRANSFORM = "ToGraphType", - SUFFIX_RESPONSE_TRANSFORM_JOOQ = SUFFIX_RECORD + SUFFIX_RESPONSE_TRANSFORM, - SUFFIX_RESPONSE_TRANSFORM_JAVA = SUFFIX_RESPONSE_TRANSFORM, - SUFFIX_TYPE_RESOLVER = "TypeResolver", - SUFFIX_RESOLVER_KEY_DTO = "Key"; - - /** - * @return Inputs formatted as a get call, but without the get element of the string. - */ - @NotNull - public static String asGetMethodVariableName(String source, String fieldName) { - return uncapitalize(source) + capitalize(fieldName); - } - - /** - * @return This field and containing type formatted as a counting query method name. - */ - @NotNull - public static String asCountMethodName(String field, String container) { - return PREFIX_COUNT + capitalize(asQueryMethodName(field, container)); - } - - /** - * @return This field and containing type formatted as a fetch query method name. - */ - @NotNull - public static String asQueryMethodName(String field, String container) { - return uncapitalize(field) + "For" + capitalize(container); - } - - /** - * @return This field and containing type formatted as an entity fetch query method name. - */ - @NotNull - public static String asEntityQueryMethodName(String prefix) { - return uncapitalize(prefix) + "AsEntity"; - } - - /** - * @return Format this name as a method name for a type resolver. - */ - @NotNull - public static String asTypeResolverMethodName(String target) { - return uncapitalize(target.replace("_", "")) + SUFFIX_TYPE_RESOLVER; - } - - /** - * @return Inputs formatted as a get call. - */ - @NotNull - public static String asGetMethodName(String field, String type) { - return PREFIX_GET + capitalize(field) + capitalize(type); - } - - /** - * @return Inputs formatted as a get call. - */ - @NotNull - public static String asGetMethodName(String field) { - return PREFIX_GET + capitalize(field); - } - - /** - * @return Name formatted as a query class name. - */ - @NotNull - public static String asQueryClass(String s) { - return capitalize(s) + DBClassGenerator.FILE_NAME_SUFFIX; - } - - /** - * @return Name formatted as a record mapper class name. - */ - @NotNull - public static String asRecordMapperClass(String s, boolean isJavaRecord, boolean isInput) { - if (isInput) { - return capitalize(s) + (isJavaRecord ? JavaRecordMapperClassGenerator.FILE_NAME_TO_SUFFIX : RecordMapperClassGenerator.FILE_NAME_TO_SUFFIX); - } - return capitalize(s) + (isJavaRecord ? JavaRecordMapperClassGenerator.FILE_NAME_FROM_SUFFIX : RecordMapperClassGenerator.FILE_NAME_FROM_SUFFIX); - } - - /** - * @return Interface method naming for this interface implementation. - */ - public static String interfaceOrUnionQueryName(String implementationName, String interfaceName) { - return String.format("%sFor%s", uncapitalize(implementationName), capitalize(interfaceName)); - } - - /** - * @return Field type formatted as a node interface method call. - */ - @NotNull - public static String asNodeQueryName(String s) { - return interfaceOrUnionQueryName(s, NODE_TYPE.getName()); - } - - public static String asEntitiesQueryName(String s) { - return interfaceOrUnionQueryName(s, FEDERATION_ENTITY_UNION.getName()); - } - - /** - * @return Input formatted as a list version of itself. - */ - @NotNull - public static String asListedName(String s) { - return uncapitalize(s) + SUFFIX_LIST; - } - - /** - * @return Input formatted as a list version of itself, if condition is true. - */ - @NotNull - public static String asListedNameIf(String s, boolean condition) { - return condition ? uncapitalize(s) + SUFFIX_LIST : uncapitalize(s); - } - - /** - * @return Format this string as a record naming pattern. - */ - @NotNull - public static String asRecordName(String s) { - return uncapitalize(s) + SUFFIX_RECORD; - } - - /** - * @return Format this string as a record transform method naming pattern. - */ - @NotNull - public static String recordTransformMethod(String s, boolean isJavaRecord, boolean isInput) { - if (isInput) { - return uncapitalize(s) + (isJavaRecord ? SUFFIX_RECORD_TRANSFORM_JAVA : SUFFIX_RECORD_TRANSFORM); - } - return uncapitalize(s) + (isJavaRecord ? SUFFIX_RESPONSE_TRANSFORM_JAVA : SUFFIX_RESPONSE_TRANSFORM_JOOQ); - } - - /** - * @return Format a record transform method naming pattern. - */ - @NotNull - public static String recordTransformMethod(boolean isJavaRecord, boolean isInput) { - if (isInput) { - return uncapitalize(isJavaRecord ? SUFFIX_RECORD_TRANSFORM_JAVA : SUFFIX_RECORD_TRANSFORM); - } - return uncapitalize(isJavaRecord ? SUFFIX_RESPONSE_TRANSFORM_JAVA : SUFFIX_RESPONSE_TRANSFORM_JOOQ); - } - - /** - * @return Format a record validation method naming pattern. - */ - @NotNull - public static String recordValidateMethod() { - return PREFIX_VALIDATE; - } - - /** - * @return Input formatted as an iterable name, if condition is true. - */ - @NotNull - public static String namedIteratorPrefixIf(String s, boolean condition) { - return condition ? namedIteratorPrefix(s) : uncapitalize(s); - } - - /** - * @return Format this string as an iterable record naming pattern. - */ - @NotNull - public static String asListedRecordName(String name) { - return asListedName(asRecordName(name)); - } - - /** - * @return Format this string as a record naming pattern. It is iterable if condition is set to true - */ - @NotNull - public static String asListedRecordNameIf(String name, boolean condition) { - return asListedNameIf(asRecordName(name), condition); - } - - /** - * Camel case conversion with special handling for numbers. - */ - public static String toCamelCase(String name) { - return uncapitalize( - Stream - .of(name.toLowerCase().split("_(?![0-9_]+)")) - .map(StringUtils::capitalize) - .collect(Collectors.joining()) - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codebuilding/TypeNameFormat.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codebuilding/TypeNameFormat.java deleted file mode 100644 index 47c6608831..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codebuilding/TypeNameFormat.java +++ /dev/null @@ -1,164 +0,0 @@ -package no.sikt.graphitron.generators.codebuilding; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.javapoet.ClassName; -import no.sikt.graphitron.javapoet.ParameterizedTypeName; -import no.sikt.graphitron.javapoet.TypeName; -import no.sikt.graphitron.javapoet.WildcardTypeName; -import no.sikt.graphql.schema.ProcessedSchema; - -import static no.sikt.graphitron.mappings.JavaPoetClassName.*; - -/** - * Helper methods for handling javapoet TypeNames. - */ -public class TypeNameFormat { - private static final ParameterizedTypeName - STRING_SET = ParameterizedTypeName.get(SET.className, STRING.className), - STRING_OBJECT_MAP = ParameterizedTypeName.get(MAP.className, STRING.className, OBJECT.className); - - /** - * @return The type wrapped in a List ParameterizedTypeName, if the boolean condition is true. - */ - public static TypeName wrapListIf(TypeName type, boolean condition) { - return condition ? wrapList(type) : type; - } - - /** - * @return The type wrapped in a Set ParameterizedTypeName, if the boolean condition is true. - */ - public static TypeName wrapSetIf(TypeName type, boolean condition) { - return condition ? wrapSet(type) : type; - } - - /** - * @return The type wrapped in a Map ParameterizedTypeName with String as key, if the boolean condition is true. - */ - public static TypeName wrapStringMapIf(TypeName type, boolean condition) { - return condition ? wrapStringMap(type) : type; - } - - /** - * @return The type wrapped in a List ParameterizedTypeName. - */ - public static ParameterizedTypeName wrapList(TypeName type) { - return ParameterizedTypeName.get(LIST.className, type); - } - - /** - * @return The type wrapped in a ArrayList ParameterizedTypeName. - */ - public static ParameterizedTypeName wrapArrayList(TypeName type) { - return ParameterizedTypeName.get(ARRAY_LIST.className, type); - } - - /** - * @return The type wrapped in a Set ParameterizedTypeName. - */ - public static ParameterizedTypeName wrapSet(TypeName type) { - return ParameterizedTypeName.get(SET.className, type); - } - - /** - * @return The type wrapped in a CompletableFuture ParameterizedTypeName. - */ - public static ParameterizedTypeName wrapFuture(TypeName type) { - return ParameterizedTypeName.get(COMPLETABLE_FUTURE.className, type); - } - - /** - * @return The type wrapped in a DataFetcher ParameterizedTypeName. - */ - public static ParameterizedTypeName wrapFetcher(TypeName type) { - return ParameterizedTypeName.get(DATA_FETCHER.className, type); - } - - /** - * @return The type wrapped in a Map ParameterizedTypeName with String as key. - */ - public static ParameterizedTypeName wrapStringMap(TypeName type) { - return ParameterizedTypeName.get(MAP.className, STRING.className, type); - } - - /** - * @return The type wrapped in a Map ParameterizedTypeName with key. - */ - public static ParameterizedTypeName wrapMap(TypeName key, TypeName type) { - return ParameterizedTypeName.get(MAP.className, key, type); - } - - /** - * @return The type wrapped in a ConnectionImpl ParameterizedTypeName. - */ - public static ParameterizedTypeName wrapConnection(TypeName type) { - return ParameterizedTypeName.get(CONNECTION_IMPL.className, type); - } - - /** - * @return The ParameterizedTypeName for a Set of Strings. - */ - public static ParameterizedTypeName getStringSetTypeName() { - return STRING_SET; - } - - /** - * @return The ParameterizedTypeName for a Map of Objects by Strings. - */ - public static ParameterizedTypeName getObjectMapTypeName() { - return STRING_OBJECT_MAP; - } - - private static TypeName getWildcardTypeName() { - return WildcardTypeName.subtypeOf(Object.class); - } - - /** - * @return List type with wildcard ('?') ParameterizedTypeName. - */ - public static ParameterizedTypeName getWildCardListTypeName() { - return ParameterizedTypeName.get(LIST.className, getWildcardTypeName()); - } - - /** - * @param subPath Path from the top of the output package. - * @param name Name of the class. - * @return ClassName based on the default output package and the provided subpath. - */ - public static ClassName getGeneratedClassName(String subPath, String name) { - return ClassName.get(GeneratorConfig.outputPackage() + "." + subPath, name); - } - - /** - * @return Get the javapoet TypeName for this field's type, and wrap it in a list ParameterizedTypeName if it is iterable. - */ - public static TypeName iterableWrapType(GenerationField field, boolean checkRecordReferences, ProcessedSchema processedSchema) { - return wrapListIf(inferFieldTypeName(field, checkRecordReferences, processedSchema), field.isIterableWrapped()); - } - - /** - * @return Get the javapoet TypeName for this field's type. - */ - public static TypeName inferFieldTypeName(GenerationField field, boolean checkRecordReferences, ProcessedSchema processedSchema) { - if (processedSchema.isRecordType(field)) { - var type = processedSchema.getRecordType(field); - if (!checkRecordReferences || !type.hasRecordReference()) { - return type.getGraphClassName(); - } - return type.getRecordClassName(); - } - - if (processedSchema.isEnum(field)) { - return processedSchema.getEnum(field).getGraphClassName(); - } - - var typeName = field.getTypeName(); - - var typeClass = field.getTypeClass(); - if (typeClass == null) { - throw new IllegalStateException("Field \"" + field.getName() + "\" has a type \"" + typeName + "\" that can not be resolved."); - } - - return typeClass; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codebuilding/VariableNames.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codebuilding/VariableNames.java deleted file mode 100644 index b9f83ea4eb..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codebuilding/VariableNames.java +++ /dev/null @@ -1,61 +0,0 @@ -package no.sikt.graphitron.generators.codebuilding; - -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.internalPrefix; - -public class VariableNames { - public final static String - VAR_SELECTION_SET = internalPrefix("selectionSet"), - VAR_IDS = internalPrefix("ids"), - VAR_REPS = internalPrefix("reps"), - VAR_REP = internalPrefix("rep"), - VAR_RESOLVER_KEYS = internalPrefix("keys"), - VAR_LOOKUP_KEYS = internalPrefix("lookupKeys"), - VAR_PAGE_SIZE = internalPrefix("pageSize"), - VAR_CONTEXT = internalPrefix("ctx"), - VAR_GRAPH_CONTEXT = internalPrefix("graphCtx"), - VAR_TRANSFORMER = internalPrefix("transform"), - VAR_ORDER_FIELDS = internalPrefix("orderFields"), - VAR_PATH_NAME = internalPrefix("path"), - VAR_INDEX_PATH = internalPrefix("indexPath"), - VAR_PATH_HERE = internalPrefix("pathHere"), - VAR_ARGS = internalPrefix("args"), - VAR_NEXT_ARGS = internalPrefix("nextArgs"), - VAR_ENV = internalPrefix("env"), - VAR_SELECT = internalPrefix("select"), - VAR_VALIDATION_ERRORS = internalPrefix("validationErrors"), - VAR_PATHS_FOR_PROPERTIES = internalPrefix("pathsForProperties"), - VAR_TYPE_NAME = internalPrefix("targetType"), - VAR_TYPE_ID = internalPrefix("typeId"), - VAR_FETCHER_NAME = internalPrefix("fetcher"), - VAR_LOADER = internalPrefix("loaderName"), - VAR_OBJECT = internalPrefix("obj"), - VAR_RESULT = internalPrefix("result"), - VAR_GRAPHITRON_CONTEXT = internalPrefix("graphitronContext"), - VAR_ITERATOR = internalPrefix("it"), - VAR_RECORD_ITERATOR = internalPrefix("r"), - VAR_NODE_HANDLER = internalPrefix("nodeIdHandler"), - VAR_NODE_STRATEGY = internalPrefix("nodeIdStrategy"), - VAR_NODE_MAP = internalPrefix("TABLE_TO_TYPE"), - VAR_NODE_ID_VALUE = internalPrefix("nodeIdValue"), - VAR_EXISTING_VALUE =internalPrefix("existing"), - VAR_SERVICE_RESULT = internalPrefix("serviceResult"), - VAR_SERVICE_KEY = internalPrefix("serviceKey"), - VAR_SERVICE_KEYS = internalPrefix("serviceKeys"), - GRAPHITRON_CONTEXT_NAME = "graphitronContext", - METHOD_ARGS_NAME = "getArguments", - METHOD_CONTEXT_NAME = "getCtx", - METHOD_VALIDATE_NAME = "validate", - METHOD_ENV_NAME = "getEnv", - METHOD_SELECT_NAME = "getSelect", - METHOD_SOURCE_NAME = "getSource", - METHOD_GRAPH_CONTEXT = "getGraphQlContext", - METHOD_SET_RECORD_ID = "setId", - METHOD_SET_RECORD_REFERENCE_ID = "setReferenceId", - VAR_ARG_PRESENCE = internalPrefix("argPresence"), - METHOD_ARG_PRESENCE_NAME = "getArgumentPresence", - METHOD_HAS_ARG_AT_INDEX = "hasArgumentAtIndex", - METHOD_ITEM_AT = "itemAt", - METHOD_HAS_FIELD = "hasField", - METHOD_CHILD = "child", - METHOD_AS_SINGLE_ITEM = "asSingleItem"; -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codebuilding/VariablePrefix.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codebuilding/VariablePrefix.java deleted file mode 100644 index 84c5d81475..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codebuilding/VariablePrefix.java +++ /dev/null @@ -1,198 +0,0 @@ -package no.sikt.graphitron.generators.codebuilding; - -import static org.apache.commons.lang3.StringUtils.uncapitalize; - -/** - * This class handles the naming conventions for internal variables. When generating code, we need to name parameters and variables. - * The different names may come from different namespaces. A namespace in this context is a set of strings, meaning a collection that has no duplicates. - * A namespace can for example be the set of fields that a GraphQL type has, as there can not be two fields with the same name. - * Therefore, using the names of the fields as variables is safe, as they will never collide with each other. - * Another example is the set of internal helper variables in Graphitron-generated code, as these must also be unique and are predetermined by a single source, the developers. - * When variables hail from different namespaces, however, they inevitably risk colliding in the generated code without proper countermeasures. - * <p> - * An example of a collision may be an input field (it will become a method parameter) which has the same name as a jOOQ table. - * In the query Graphitron may create an alias for this table, while also having a method parameter that inherits the name of the input field. - * Such code may result in uncompilable code at best or produce incorrect query results at worst. - * <p> - * The risk of collisions would be even higher for instance if the DB/GraphQL-domain was code-related. - * To prevent such issues we use variable prefixes for all variables in the generated code. - * These make it impossible to accidentally or intentionally produce naming collisions, given that the prefixes are not substrings of each other. - * <p> - * Here is a more rigorous explanation and proof for why this is needed:<br> - * Assume two variable names N and M (which are based on user-defined configuration beyond our control or other factors such as DB-schema). - * These two variables exist in their corresponding namespaces with their own prefixes P and Q where P ≠ Q and where there exists no string S such that P = S + Q or Q = S + P. - * <p> - * Let us take a look at the possibilities:<br> - * 1. No prefixes are applied. Here, a conflict immediately emerges in the case N = M. As such, this solution is unacceptable. - * <p> - * 2. Prefixes are applied to only one namespace, P. This means that the resulting variable X in the code will be X = P + N.<br> - * One can easily engineer a problem case by assuming that M consists of two substrings concatenated such that M = P + N.<br> - * Since prefixes in the name space Q are not applied (are empty), we get that the generated variable Y will be Y = M = P + N = X, and so we have another collision. - * Thus, this solution is also unacceptable. - * <p> - * 3. Prefixes are applied for all namespaces. This time the generated variables will be X = P + N and Y = Q + M.<br> - * Let us disprove that there exist a case where X = Y. If X = Y, then P + N = Q + M. We have three possibilities:<br> - * * N = M results in P + N = Q + N and P = Q which is a contradiction with our premise P ≠ Q. So we have that N ≠ M.<br> - * * The next possibility is that the prefixes have the same length |P| = |Q|.<br> - * For this to be true and for the strings to still be equal, every character in P must match the one at the same index in Q, thus resulting in P = Q, contradicting P ≠ Q.<br> - * * Lastly, for |P| ≠ |Q| one of them must be shorter, so let us use |P| < |Q|. This would be equivalent for |Q| < |P|. Since P + N = Q + M, Q must use P as a prefix.<br> - * This means that Q = P + S where S is a non-empty string. This contradicts our second premise that there must not exist a string S such that P = S + Q or Q = S + P.<br> - * With this solution there can not exist a case where X = Y and variable naming collisions are impossible. - */ -public class VariablePrefix { - // Note that all names are fine, so long as none of these prefixes are the same for multiple name spaces. - // There should also not exist any pair of prefixes that are substrings of each other. - public static final String - INTERNAL_VARIABLE = "iv", - METHOD_INPUT = "mi", - METHOD_OUTPUT = "mo", - METHOD_LIST_OUTPUT = "mlo", - OPERATION_SOURCE = "os", - DATA_FETCHER_KEYS = "rk", - DATA_FETCHER_SERVICE = "rs", - DATA_FETCHER_QUERY = "rq", - SELECT_JOIN_STEP = "sjs", - INSERT_HELPER = "ih", - NAMED_ITERATOR = "nit", - NAMED_ITERATOR_INDEX = "niit", - MAPPER_NODE_INPUT = "mni", - MAPPER_RECORD_INPUT = "mri", - ALIAS = "a", - CONTEXT_FIELD = "cf", - SEPARATOR = "_", - UNPACKED = "up"; - - /** - * @return This name formatted as an internal variable to avoid namespace collisions. - */ - public static String internalPrefix(String name) { - return prefixName(INTERNAL_VARIABLE, name); - } - - /** - * @return This name formatted as an input variable to avoid namespace collisions. - */ - public static String inputPrefix(String name) { - return prefixName(METHOD_INPUT, name); - } - - /** - * @return This name formatted as a mutation node input variable to avoid namespace collisions. - */ - public static String mapperNodeInputPrefix(String name) { - return prefixName(MAPPER_NODE_INPUT, name); - } - - /** - * @return This name formatted as a mutation record input variable to avoid namespace collisions. - */ - public static String mapperRecordInputPrefix(String name) { - return prefixName(MAPPER_RECORD_INPUT, name); - } - - /** - * @return This name formatted as an output variable to avoid namespace collisions. - */ - public static String outputPrefix(String name) { - return prefixName(METHOD_OUTPUT, name); - } - - /** - * @return This name formatted as a listed output variable to avoid namespace collisions. - */ - public static String listedOutputPrefix(String name) { - return prefixName(METHOD_LIST_OUTPUT, name); - } - - /** - * @return This name formatted as an operation source variable to avoid namespace collisions. - */ - public static String sourcePrefix(String name) { - return prefixName(OPERATION_SOURCE, name); - } - - /** - * @return This name formatted as a resolver key variable to avoid namespace collisions. - */ - public static String resolverKeyPrefix(String name) { - return prefixName(DATA_FETCHER_KEYS, name); - } - - /** - * @return This name formatted as an alias variable to avoid namespace collisions. - */ - public static String aliasPrefix(String name) { - return prefixName(ALIAS, name); - } - - /** - * @return This name formatted as a context variable to avoid namespace collisions. - */ - public static String contextFieldPrefix(String name) { - return prefixName(CONTEXT_FIELD, name); - } - - /** - * @return This name formatted as an iterator variable to avoid namespace collisions. - */ - public static String namedIteratorPrefix(String name) { - return prefixName(NAMED_ITERATOR, name); - } - - /** - * @return This name formatted as an index iterator variable to avoid namespace collisions. - */ - public static String namedIndexIteratorPrefix(String name) { - return prefixName(NAMED_ITERATOR_INDEX, name); - } - - /** - * @return This name formatted as a service class object reference to avoid namespace collisions. - */ - public static String servicePrefix(String name) { - return prefixName(DATA_FETCHER_SERVICE, name); - } - - /** - * @return This name formatted as a query class object reference to avoid namespace collisions. - */ - public static String queryPrefix(String name) { - return prefixName(DATA_FETCHER_QUERY, name); - } - - /** - * @return This name formatted as an operation query select join step variable to avoid namespace collisions. - */ - public static String joinStepPrefix(String name) { - return prefixName(SELECT_JOIN_STEP, name); - } - - /** - * @return This name formatted as an insert mutation helpervariable to avoid namespace collisions. - */ - public static String insertHelperPrefix(String name) { - return prefixName(INSERT_HELPER, name); - } - - /** - * @return This name formatted as an unpacked variable to avoid namespace collisions. - */ - public static String unpackedPrefix(String name) { return prefixName(UNPACKED, name); } - - - /** - * @return This name prefixed with the provided prefix. - */ - public static String prefixName(String prefix, String name) { - var actualPrefix = prefixFormat(prefix); - return name.startsWith(actualPrefix) ? name : actualPrefix + uncapitalize(name); - } - - /** - * This adds the separator symbol before and after the prefix. - * @return The correct format for prefixes. - */ - private static String prefixFormat(String prefix) { - return SEPARATOR + prefix + SEPARATOR; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/CodeInterfaceBuilderMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/CodeInterfaceBuilderMethodGenerator.java deleted file mode 100644 index d0524a1791..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/CodeInterfaceBuilderMethodGenerator.java +++ /dev/null @@ -1,36 +0,0 @@ -package no.sikt.graphitron.generators.codeinterface; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphitron.generators.codeinterface.wiring.WiringBuilderMethodGenerator; -import no.sikt.graphitron.generators.codeinterface.wiring.WiringClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.List; - -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.returnWrap; -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.getGeneratedClassName; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_NODE_HANDLER; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_NODE_STRATEGY; -import static no.sikt.graphitron.mappings.JavaPoetClassName.RUNTIME_WIRING_BUILDER; - -/** - * This class generates a simple method for getting a RuntimeWiring Builder. - */ -public class CodeInterfaceBuilderMethodGenerator extends WiringBuilderMethodGenerator { - public CodeInterfaceBuilderMethodGenerator(ProcessedSchema processedSchema) { - super(List.of(), processedSchema); - } - - @Override - public MethodSpec generate() { - var code = includeNode ? CodeBlock.of("($N)", - GeneratorConfig.shouldMakeNodeStrategy() ? VAR_NODE_STRATEGY : VAR_NODE_HANDLER) - : CodeBlock.of("()"); - var className = getGeneratedClassName(WiringClassGenerator.SAVE_DIRECTORY_NAME, WiringClassGenerator.CLASS_NAME); - return getSpec(METHOD_NAME, RUNTIME_WIRING_BUILDER.className) - .addCode(returnWrap(CodeBlock.of("$T.$L$L", className, WiringBuilderMethodGenerator.METHOD_NAME, code))) - .build(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/CodeInterfaceClassGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/CodeInterfaceClassGenerator.java deleted file mode 100644 index 14a4999cd5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/CodeInterfaceClassGenerator.java +++ /dev/null @@ -1,48 +0,0 @@ -package no.sikt.graphitron.generators.codeinterface; - -import no.sikt.graphitron.generators.abstractions.AbstractClassGenerator; -import no.sikt.graphitron.generators.abstractions.SimpleMethodGenerator; -import no.sikt.graphitron.generators.codeinterface.wiring.WiringMethodGenerator; -import no.sikt.graphitron.javapoet.TypeSpec; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.ArrayList; -import java.util.List; - -/** - * Class generator for the code interface. - */ -public class CodeInterfaceClassGenerator extends AbstractClassGenerator { - public final static String SAVE_DIRECTORY_NAME = "graphitron", CLASS_NAME = "Graphitron"; - private final boolean includeNode; - private final ProcessedSchema processedSchema; - - public CodeInterfaceClassGenerator(ProcessedSchema processedSchema) { - this.includeNode = processedSchema.nodeExists(); - this.processedSchema = processedSchema; - } - - @Override - public List<TypeSpec> generateAll() { - var generators = new ArrayList<SimpleMethodGenerator>(); - generators.add(new CodeInterfaceTypeRegistryMethodGenerator()); - generators.add(new CodeInterfaceBuilderMethodGenerator(processedSchema)); - generators.add(new WiringMethodGenerator(processedSchema)); - generators.add(new CodeInterfaceSchemaMethodGenerator(includeNode)); - if (processedSchema.isFederationImported()) { - generators.add(new CodeInterfaceGetFederatedSchemaMethodGenerator(processedSchema)); - generators.add(new CodeInterfaceSchemaWithFederationMethodGenerator(processedSchema)); - } - return List.of(getSpec(CLASS_NAME, generators).build()); - } - - @Override - public String getDefaultSaveDirectoryName() { - return SAVE_DIRECTORY_NAME; - } - - @Override - public String getFileNameSuffix() { - return ""; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/CodeInterfaceGetFederatedSchemaMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/CodeInterfaceGetFederatedSchemaMethodGenerator.java deleted file mode 100644 index 13be0c2ee3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/CodeInterfaceGetFederatedSchemaMethodGenerator.java +++ /dev/null @@ -1,102 +0,0 @@ -package no.sikt.graphitron.generators.codeinterface; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.generators.abstractions.SimpleMethodGenerator; -import no.sikt.graphitron.generators.datafetchers.operations.OperationClassGenerator; -import no.sikt.graphitron.generators.datafetchers.typeresolvers.TypeResolverClassGenerator; -import no.sikt.graphitron.javapoet.ClassName; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphql.schema.ProcessedSchema; - -import javax.lang.model.element.Modifier; - -import static no.sikt.graphitron.generators.abstractions.DataFetcherClassGenerator.DEFAULT_SAVE_DIRECTORY_NAME; -import static no.sikt.graphitron.generators.abstractions.DataFetcherClassGenerator.FILE_NAME_SUFFIX; -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.returnWrap; -import static no.sikt.graphitron.generators.codebuilding.NameFormat.asTypeResolverMethodName; -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.getGeneratedClassName; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_NODE_HANDLER; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_NODE_STRATEGY; -import static no.sikt.graphitron.javapoet.CodeBlock.empty; -import static no.sikt.graphitron.mappings.JavaPoetClassName.*; -import static no.sikt.graphql.naming.GraphQLReservedName.FEDERATION_ENTITIES_FIELD; -import static no.sikt.graphql.naming.GraphQLReservedName.FEDERATION_ENTITY_UNION; - -/** - * Generates the {@code getFederatedSchema(registry, wiringBuilder, ...)} method for building - * a Federation 2 compatible GraphQL schema. - * <p> - * This provides a flexible API for consumers who need custom type registry and wiring configuration. - * When the schema has resolvable entities, the method includes entity type resolver and entity fetcher parameters. - */ -public class CodeInterfaceGetFederatedSchemaMethodGenerator extends SimpleMethodGenerator { - public static final String METHOD_NAME = "getFederatedSchema"; - private static final String VAR_REGISTRY = "registry", VAR_WIRING_BUILDER = "wiringBuilder"; - - private final ProcessedSchema processedSchema; - private final boolean hasEntities; - private final boolean useNodeStrategy; - private final String nodeParam; - private final ClassName nodeParamClass; - - public CodeInterfaceGetFederatedSchemaMethodGenerator(ProcessedSchema processedSchema) { - this.processedSchema = processedSchema; - this.hasEntities = processedSchema.federationEntitiesExist(); - this.useNodeStrategy = GeneratorConfig.shouldMakeNodeStrategy(); - this.nodeParam = useNodeStrategy ? VAR_NODE_STRATEGY : VAR_NODE_HANDLER; - this.nodeParamClass = useNodeStrategy ? NODE_ID_STRATEGY.className : NODE_ID_HANDLER.className; - } - - @Override - public MethodSpec generate() { - var spec = MethodSpec.methodBuilder(METHOD_NAME) - .addModifiers(Modifier.PUBLIC, Modifier.STATIC) - .returns(GRAPHQL_SCHEMA.className) - .addParameter(TYPE_DEFINITION_REGISTRY.className, VAR_REGISTRY) - .addParameter(RUNTIME_WIRING_BUILDER.className, VAR_WIRING_BUILDER); - - if (hasEntities) { - spec.addParameterIf(useNodeStrategy, nodeParamClass, nodeParam); - spec.addCode(returnWrap(buildFederatedSchemaWithEntities())); - } else { - spec.addCode(returnWrap(buildFederatedSchemaSimple())); - } - - return spec.build(); - } - - private CodeBlock buildFederatedSchemaSimple() { - return CodeBlock.of( - "$T.buildFederatedSchema($N, $N)", - FEDERATION_HELPER.className, - VAR_REGISTRY, - VAR_WIRING_BUILDER - ); - } - - private CodeBlock buildFederatedSchemaWithEntities() { - var entityFetcherClassName = getGeneratedClassName( - DEFAULT_SAVE_DIRECTORY_NAME + "." + OperationClassGenerator.SAVE_DIRECTORY_NAME, - processedSchema.getQueryType().getName() + FILE_NAME_SUFFIX - ); - var entityTypeResolverClassName = getGeneratedClassName( - DEFAULT_SAVE_DIRECTORY_NAME + "." + TypeResolverClassGenerator.SAVE_DIRECTORY_NAME, - FEDERATION_ENTITY_UNION.getName().replace("_", "") + TypeResolverClassGenerator.FILE_NAME_SUFFIX - ); - var typeResolverMethodName = asTypeResolverMethodName(FEDERATION_ENTITY_UNION.getName()); - - var entityFetcherCall = CodeBlock.of("$T.$L($L)", entityFetcherClassName, FEDERATION_ENTITIES_FIELD.getName(), - useNodeStrategy ? nodeParam : empty()); - - return CodeBlock.of( - "$T.buildFederatedSchema($N, $N, $T.$L(), $L)", - FEDERATION_HELPER.className, - VAR_REGISTRY, - VAR_WIRING_BUILDER, - entityTypeResolverClassName, - typeResolverMethodName, - entityFetcherCall - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/CodeInterfaceSchemaMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/CodeInterfaceSchemaMethodGenerator.java deleted file mode 100644 index f2a7b898e1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/CodeInterfaceSchemaMethodGenerator.java +++ /dev/null @@ -1,51 +0,0 @@ -package no.sikt.graphitron.generators.codeinterface; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphitron.generators.abstractions.SimpleMethodGenerator; -import no.sikt.graphitron.generators.codeinterface.typeregistry.TypeRegistryMethodGenerator; -import no.sikt.graphitron.generators.codeinterface.wiring.WiringBuilderMethodGenerator; - -import javax.lang.model.element.Modifier; - -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.returnWrap; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_NODE_HANDLER; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_NODE_STRATEGY; -import static no.sikt.graphitron.mappings.JavaPoetClassName.*; - -/** - * This class generates code for a method for fetching a complete schema. - */ -public class CodeInterfaceSchemaMethodGenerator extends SimpleMethodGenerator { - public static final String METHOD_NAME = "getSchema"; - private static final String VAR_REGISTRY = "registry", VAR_WIRING = "wiring"; - private final boolean includeNode; - - public CodeInterfaceSchemaMethodGenerator(boolean includeNode) { - this.includeNode = includeNode; - } - - @Override - public MethodSpec generate() { - var code = includeNode ? CodeBlock.of("($N)", - GeneratorConfig.shouldMakeNodeStrategy() ? VAR_NODE_STRATEGY : VAR_NODE_HANDLER) - : CodeBlock.of("()"); - var spec = MethodSpec.methodBuilder(METHOD_NAME); - if (includeNode) { - if (GeneratorConfig.shouldMakeNodeStrategy()) { - spec.addParameter(NODE_ID_STRATEGY.className, VAR_NODE_STRATEGY); - } else { - spec.addParameter(NODE_ID_HANDLER.className, VAR_NODE_HANDLER); - } - } - return spec - .addModifiers(Modifier.PUBLIC) - .addModifiers(Modifier.STATIC) - .returns(GRAPHQL_SCHEMA.className) - .declare(VAR_WIRING, "$L$L", WiringBuilderMethodGenerator.METHOD_NAME, code) - .declare(VAR_REGISTRY, "$L()", TypeRegistryMethodGenerator.METHOD_NAME) - .addCode(returnWrap(CodeBlock.of("new $T().makeExecutableSchema($N, $N.build())", SCHEMA_GENERATOR.className, VAR_REGISTRY, VAR_WIRING))) - .build(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/CodeInterfaceSchemaWithFederationMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/CodeInterfaceSchemaWithFederationMethodGenerator.java deleted file mode 100644 index b6d9f43834..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/CodeInterfaceSchemaWithFederationMethodGenerator.java +++ /dev/null @@ -1,70 +0,0 @@ -package no.sikt.graphitron.generators.codeinterface; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.generators.abstractions.SimpleMethodGenerator; -import no.sikt.graphitron.generators.codeinterface.typeregistry.TypeRegistryMethodGenerator; -import no.sikt.graphitron.generators.codeinterface.wiring.WiringBuilderMethodGenerator; -import no.sikt.graphitron.javapoet.ClassName; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphql.schema.ProcessedSchema; - -import javax.lang.model.element.Modifier; - -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.returnWrap; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_NODE_HANDLER; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_NODE_STRATEGY; -import static no.sikt.graphitron.javapoet.CodeBlock.empty; -import static no.sikt.graphitron.javapoet.TypeName.BOOLEAN; -import static no.sikt.graphitron.mappings.JavaPoetClassName.GRAPHQL_SCHEMA; -import static no.sikt.graphitron.mappings.JavaPoetClassName.NODE_ID_HANDLER; -import static no.sikt.graphitron.mappings.JavaPoetClassName.NODE_ID_STRATEGY; - -/** - * Generates the {@code getSchema(..., includeFederation)} overload method that provides a simple API - * for getting either a regular or federated schema based on a boolean flag. - * <p> - * This method delegates to {@code getFederatedSchema} when federation is enabled, - * or falls back to the regular {@code getSchema} method otherwise. - */ -public class CodeInterfaceSchemaWithFederationMethodGenerator extends SimpleMethodGenerator { - private static final String VAR_REGISTRY = "registry", VAR_WIRING = "wiring"; - private static final String VAR_INCLUDE_FEDERATION = "includeFederation"; - - private final boolean includeNode; - private final boolean hasEntities; - private final boolean useNodeStrategy; - private final String nodeParam; - private final ClassName nodeParamClass; - - public CodeInterfaceSchemaWithFederationMethodGenerator(ProcessedSchema processedSchema) { - this.includeNode = processedSchema.nodeExists(); - this.hasEntities = processedSchema.federationEntitiesExist(); - this.useNodeStrategy = GeneratorConfig.shouldMakeNodeStrategy(); - this.nodeParam = useNodeStrategy ? VAR_NODE_STRATEGY : VAR_NODE_HANDLER; - this.nodeParamClass = useNodeStrategy ? NODE_ID_STRATEGY.className : NODE_ID_HANDLER.className; - } - - @Override - public MethodSpec generate() { - var nodeParamCode = includeNode ? nodeParam : empty(); - - return MethodSpec.methodBuilder(CodeInterfaceSchemaMethodGenerator.METHOD_NAME) - .addModifiers(Modifier.PUBLIC, Modifier.STATIC) - .returns(GRAPHQL_SCHEMA.className) - .addParameterIf(includeNode, nodeParamClass, nodeParam) - .addParameter(BOOLEAN, VAR_INCLUDE_FEDERATION) - .beginControlFlow("if (!$N)", VAR_INCLUDE_FEDERATION) - .addCode(returnWrap(CodeBlock.of("$L($L)", CodeInterfaceSchemaMethodGenerator.METHOD_NAME, nodeParamCode))) - .endControlFlow() - .declare(VAR_WIRING, "$L($L)", WiringBuilderMethodGenerator.METHOD_NAME, nodeParamCode) - .declare(VAR_REGISTRY, "$L()", TypeRegistryMethodGenerator.METHOD_NAME) - .addCode(returnWrap(buildGetFederatedSchemaCall())) - .build(); - } - - private CodeBlock buildGetFederatedSchemaCall() { - return CodeBlock.of("$L($N, $N$L)", CodeInterfaceGetFederatedSchemaMethodGenerator.METHOD_NAME, VAR_REGISTRY, VAR_WIRING, - CodeBlock.ofIf(hasEntities && useNodeStrategy, ", $N", nodeParam)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/CodeInterfaceTypeRegistryMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/CodeInterfaceTypeRegistryMethodGenerator.java deleted file mode 100644 index 2c0ee5aaf4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/CodeInterfaceTypeRegistryMethodGenerator.java +++ /dev/null @@ -1,30 +0,0 @@ -package no.sikt.graphitron.generators.codeinterface; - -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphitron.generators.abstractions.SimpleMethodGenerator; -import no.sikt.graphitron.generators.codeinterface.typeregistry.TypeRegistryClassGenerator; -import no.sikt.graphitron.generators.codeinterface.typeregistry.TypeRegistryMethodGenerator; - -import javax.lang.model.element.Modifier; - -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.asMethodCall; -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.returnWrap; -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.getGeneratedClassName; -import static no.sikt.graphitron.mappings.JavaPoetClassName.TYPE_DEFINITION_REGISTRY; - -/** - * This class generates code for a simple Type Registry fetching method. - */ -public class CodeInterfaceTypeRegistryMethodGenerator extends SimpleMethodGenerator { - @Override - public MethodSpec generate() { - var className = getGeneratedClassName(TypeRegistryClassGenerator.SAVE_DIRECTORY_NAME, TypeRegistryClassGenerator.CLASS_NAME); - return MethodSpec - .methodBuilder(TypeRegistryMethodGenerator.METHOD_NAME) - .addModifiers(Modifier.PUBLIC) - .addModifiers(Modifier.STATIC) - .returns(TYPE_DEFINITION_REGISTRY.className) - .addCode(returnWrap(asMethodCall(className, TypeRegistryMethodGenerator.METHOD_NAME))) - .build(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/typeregistry/TypeRegistryClassGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/typeregistry/TypeRegistryClassGenerator.java deleted file mode 100644 index 46fcdb4aae..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/typeregistry/TypeRegistryClassGenerator.java +++ /dev/null @@ -1,28 +0,0 @@ -package no.sikt.graphitron.generators.codeinterface.typeregistry; - -import no.sikt.graphitron.javapoet.TypeSpec; -import no.sikt.graphitron.generators.abstractions.AbstractClassGenerator; - -import java.util.List; - -/** - * Class generator for the class that returns the type registry. - */ -public class TypeRegistryClassGenerator extends AbstractClassGenerator { - public final static String SAVE_DIRECTORY_NAME = "typeregistry", CLASS_NAME = "TypeRegistry"; - - @Override - public List<TypeSpec> generateAll() { - return List.of(getSpec(CLASS_NAME, new TypeRegistryMethodGenerator()).build()); - } - - @Override - public String getDefaultSaveDirectoryName() { - return SAVE_DIRECTORY_NAME; - } - - @Override - public String getFileNameSuffix() { - return ""; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/typeregistry/TypeRegistryMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/typeregistry/TypeRegistryMethodGenerator.java deleted file mode 100644 index a27eab61da..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/typeregistry/TypeRegistryMethodGenerator.java +++ /dev/null @@ -1,40 +0,0 @@ -package no.sikt.graphitron.generators.codeinterface.typeregistry; - -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.generators.abstractions.SimpleMethodGenerator; - -import javax.lang.model.element.Modifier; - -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.*; -import static no.sikt.graphitron.mappings.JavaPoetClassName.SCHEMA_READER; -import static no.sikt.graphitron.mappings.JavaPoetClassName.TYPE_DEFINITION_REGISTRY; - -/** - * This class generates code for the Type Registry fetching method. - */ -public class TypeRegistryMethodGenerator extends SimpleMethodGenerator { - public static final String METHOD_NAME = "getTypeRegistry"; - - @Override - public MethodSpec generate() { - // Replaced from GeneratorConfig.generatorSchemaFiles() because the generator schema is not compatible with the user schema. - var files = GeneratorConfig.schemaFiles().stream().map(it -> CodeBlock.of("$S", it)).collect(CodeBlock.joining(",\n")); - return MethodSpec - .methodBuilder(METHOD_NAME) - .addModifiers(Modifier.PUBLIC) - .returns(TYPE_DEFINITION_REGISTRY.className) - .addModifiers(Modifier.STATIC) - .addCode( - returnWrap( - CodeBlock.of( - "$T.getTypeDefinitionRegistry($L)", - SCHEMA_READER.className, - indentIfMultiline(setOf(files)) - ) - ) - ) // Note that this annoyingly produces too many indents. Blame faulty indent handling. Subsequent statements have correct indent though. - .build(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/wiring/ClassWiringContainer.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/wiring/ClassWiringContainer.java deleted file mode 100644 index 49a4a03745..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/wiring/ClassWiringContainer.java +++ /dev/null @@ -1,29 +0,0 @@ -package no.sikt.graphitron.generators.codeinterface.wiring; - -import no.sikt.graphitron.javapoet.ClassName; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.configuration.GeneratorConfig; - -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.asMethodCall; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_NODE_HANDLER; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_NODE_STRATEGY; -import static no.sikt.graphql.naming.GraphQLReservedName.NODE_TYPE; -import static org.apache.commons.lang3.StringUtils.uncapitalize; - -public record ClassWiringContainer(WiringContainer wiring, ClassName containerClass) { - public CodeBlock toCode() { - if (wiring.isFetcher()) { - CodeBlock methodCall; - - if (GeneratorConfig.shouldMakeNodeStrategy()) { - methodCall = CodeBlock.of("$T.$L($N)", containerClass, wiring.methodName(), VAR_NODE_STRATEGY); - } else { - methodCall = wiring.schemaField().equals(uncapitalize(NODE_TYPE.getName())) - ? CodeBlock.of("$T.$L($N)", containerClass, wiring.methodName(), VAR_NODE_HANDLER) - : asMethodCall(containerClass, wiring.methodName()); - } - return CodeBlock.of(".dataFetcher($S, $L)", wiring.schemaField(), methodCall); - } - return CodeBlock.of(".typeResolver($L)", asMethodCall(containerClass, wiring.methodName())); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/wiring/WiringBuilderMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/wiring/WiringBuilderMethodGenerator.java deleted file mode 100644 index bc9e34b283..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/wiring/WiringBuilderMethodGenerator.java +++ /dev/null @@ -1,141 +0,0 @@ -package no.sikt.graphitron.generators.codeinterface.wiring; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphitron.javapoet.TypeName; -import no.sikt.graphitron.definitions.helpers.ScalarUtils; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.abstractions.DataFetcherClassGenerator; -import no.sikt.graphitron.generators.abstractions.SimpleMethodGenerator; -import no.sikt.graphitron.generators.datafetchers.typeresolvers.TypeResolverClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.lang.model.element.Modifier; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.asMethodCall; -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.indentIfMultiline; -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.returnWrap; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_NODE_HANDLER; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_NODE_STRATEGY; -import static no.sikt.graphitron.mappings.JavaPoetClassName.*; - -/** - * This class generates code for the RuntimeWiring Builder fetching method. - */ -public class WiringBuilderMethodGenerator extends SimpleMethodGenerator { - static final Logger LOGGER = LoggerFactory.getLogger(WiringBuilderMethodGenerator.class); - - public static final String METHOD_NAME = "getRuntimeWiringBuilder"; - private final static String VAR_WIRING = "wiring"; - private final List<ClassGenerator> generators; - protected final boolean includeNode; - private final ProcessedSchema processedSchema; - - public WiringBuilderMethodGenerator(List<ClassGenerator> generators, ProcessedSchema processedSchema) { - this.generators = generators; - this.includeNode = processedSchema.nodeExists(); - this.processedSchema = processedSchema; - } - - private List<ClassWiringContainer> extractDataFetchers() { - return generators - .stream() - .filter(it -> it instanceof DataFetcherClassGenerator) - .flatMap(it -> ((DataFetcherClassGenerator<?>) it).getGeneratedDataFetchers().stream()) - .toList(); - } - - private List<ClassWiringContainer> extractTypeResolvers() { - return generators - .stream() - .filter(it -> it instanceof TypeResolverClassGenerator) - .flatMap(it -> ((TypeResolverClassGenerator) it).getGeneratedTypeResolvers().stream()) - .toList(); - } - - private Map<String, List<ClassWiringContainer>> getWiringByType() { - return Stream - .concat(extractDataFetchers().stream(), extractTypeResolvers().stream()) - .collect(Collectors.groupingBy(it -> it.wiring().schemaType(), LinkedHashMap::new, Collectors.toList())); - } - - public MethodSpec.Builder getSpec(String methodName, TypeName returnType) { - var spec = MethodSpec - .methodBuilder(methodName) - .addModifiers(Modifier.PUBLIC) - .addModifiers(Modifier.STATIC) - .returns(returnType); - if (includeNode) { - if (GeneratorConfig.shouldMakeNodeStrategy()) { - spec.addParameter(NODE_ID_STRATEGY.className, VAR_NODE_STRATEGY); - } else { - spec.addParameter(NODE_ID_HANDLER.className, VAR_NODE_HANDLER); - } - } - return spec; - } - - @Override - public MethodSpec generate() { - var wiringByType = getWiringByType(); - - var code = CodeBlock - .builder() - .declare(VAR_WIRING, asMethodCall(RUNTIME_WIRING.className, "newRuntimeWiring")); - wiringByType.forEach((k, v) -> - code - .add("$N.type(", VAR_WIRING) - .add( - indentIfMultiline( - CodeBlock.join( - newTypeWiring(k), - indentIfMultiline(v.stream().map(ClassWiringContainer::toCode).collect(CodeBlock.joining("\n"))) - ) - ) - ) - .addStatement(")") // This is separated because it affects indent. - ); - - code.add(createAddScalarsCodeBlocks(processedSchema.getScalarTypes())); - - code.add(returnWrap(CodeBlock.of("$N", VAR_WIRING))); - return getSpec(METHOD_NAME, RUNTIME_WIRING_BUILDER.className) - .addCode(code.build()) - .build(); - } - - /** - * Automatically adds scalar types to the wiring for all scalar types that are - * not built-in, if they are recognized as extended scalars. - * - * @param scalarsInSchema the set of scalar type names to be added to the wiring - * @return a CodeBlock representing the scalar type additions - */ - private CodeBlock createAddScalarsCodeBlocks(Set<String> scalarsInSchema) { - var scalarTypeToCodeBlockMapping = ScalarUtils.getInstance().getScalarTypeCodeBlockMapping(); - - return scalarsInSchema.stream() - .filter(it -> !ScalarUtils.getInstance().getBuiltInScalarNames().contains(it)) - .map(scalarName -> { - if (scalarTypeToCodeBlockMapping.containsKey(scalarName)) { - return CodeBlock.of("$N.scalar($L);", VAR_WIRING, scalarTypeToCodeBlockMapping.get(scalarName)); - } else { - LOGGER.info("Scalar type '{}' is not recognized and must be added manually to the wiring.", scalarName); - return CodeBlock.empty(); - } - }).collect(CodeBlock.joining("\n")); - } - - private CodeBlock newTypeWiring(String type) { - return CodeBlock.of("$T.newTypeWiring($S)", TYPE_RUNTIME_WIRING.className, type); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/wiring/WiringClassGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/wiring/WiringClassGenerator.java deleted file mode 100644 index e0afebc9f0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/wiring/WiringClassGenerator.java +++ /dev/null @@ -1,38 +0,0 @@ -package no.sikt.graphitron.generators.codeinterface.wiring; - -import no.sikt.graphitron.javapoet.TypeSpec; -import no.sikt.graphitron.generators.abstractions.AbstractClassGenerator; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.List; - -/** - * Class generator for the RuntimeWiring class. - */ -public class WiringClassGenerator extends AbstractClassGenerator { - public final static String SAVE_DIRECTORY_NAME = "wiring", CLASS_NAME = "Wiring"; - private final List<? extends WiringBuilderMethodGenerator> generators; - - public WiringClassGenerator(List<ClassGenerator> generators, ProcessedSchema processedSchema) { - this.generators = List.of( - new WiringBuilderMethodGenerator(generators, processedSchema), - new WiringMethodGenerator(processedSchema) - ); - } - - @Override - public List<TypeSpec> generateAll() { - return List.of(getSpec(CLASS_NAME, generators).build()); - } - - @Override - public String getDefaultSaveDirectoryName() { - return SAVE_DIRECTORY_NAME; - } - - @Override - public String getFileNameSuffix() { - return ""; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/wiring/WiringContainer.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/wiring/WiringContainer.java deleted file mode 100644 index 8175b1b45b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/wiring/WiringContainer.java +++ /dev/null @@ -1,19 +0,0 @@ -package no.sikt.graphitron.generators.codeinterface.wiring; - -import no.sikt.graphitron.javapoet.ClassName; - -import java.util.List; - -public record WiringContainer(String methodName, String schemaType, String schemaField, boolean isFetcher) { - public WiringContainer(String methodName, String schemaType, String schemaField) { - this(methodName, schemaType, schemaField, true); - } - - public ClassWiringContainer asClassWiring(ClassName className) { - return new ClassWiringContainer(this, className); - } - - public static List<ClassWiringContainer> asClassWiring(List<WiringContainer> containers, ClassName className) { - return containers.stream().map(it -> it.asClassWiring(className)).toList(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/wiring/WiringMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/wiring/WiringMethodGenerator.java deleted file mode 100644 index 747d8f9a87..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/codeinterface/wiring/WiringMethodGenerator.java +++ /dev/null @@ -1,39 +0,0 @@ -package no.sikt.graphitron.generators.codeinterface.wiring; - -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.List; - -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.returnWrap; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_NODE_HANDLER; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_NODE_STRATEGY; -import static no.sikt.graphitron.mappings.JavaPoetClassName.RUNTIME_WIRING; - -/** - * This class generates code for the RuntimeWiring fetching method. - */ -public class WiringMethodGenerator extends WiringBuilderMethodGenerator { - public static final String METHOD_NAME = "getRuntimeWiring"; - - public WiringMethodGenerator(ProcessedSchema processedSchema) { - super(List.of(), processedSchema); - } - - @Override - public MethodSpec generate() { - var code = CodeBlock - .builder() - .add("$N", WiringBuilderMethodGenerator.METHOD_NAME) - .add(includeNode ? CodeBlock.of("($N)", - GeneratorConfig.shouldMakeNodeStrategy() ? VAR_NODE_STRATEGY : VAR_NODE_HANDLER) - : CodeBlock.of("()") - ) - .add(".build()"); - return getSpec(METHOD_NAME, RUNTIME_WIRING.className) - .addCode(returnWrap(code.build())) - .build(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/context/FetchContext.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/context/FetchContext.java deleted file mode 100644 index 118211d9a1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/context/FetchContext.java +++ /dev/null @@ -1,681 +0,0 @@ -package no.sikt.graphitron.generators.context; - -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.fields.VirtualSourceField; -import no.sikt.graphitron.definitions.fields.containedtypes.FieldReference; -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.definitions.interfaces.JoinElement; -import no.sikt.graphitron.definitions.interfaces.RecordObjectSpecification; -import no.sikt.graphitron.definitions.mapping.*; -import no.sikt.graphitron.definitions.sql.SQLJoinStatement; -import no.sikt.graphitron.generators.codebuilding.KeyWrapper; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphql.schema.ProcessedSchema; -import org.jooq.Table; - -import java.util.*; -import java.util.stream.Stream; - -import static no.sikt.graphitron.generators.codebuilding.KeyWrapper.getKeyForResolverFieldOrThrow; -import static no.sikt.graphitron.mappings.TableReflection.*; - -/** - * A helper class to handle traversal of nested types in queries. Since such queries will require nested layers of rows, - * this class can generate the next "iteration" of itself for handling deeper layers. - */ -public class FetchContext { - private final FetchContext previousContext; - private final GenerationField referenceObjectField; - private final RecordObjectSpecification<?> referenceObject; - private final JOOQMapping referenceTable, previousTable, inputTable; - private final JoinListSequence currentJoinSequence; - - private final LinkedHashSet<SQLJoinStatement> joinSet; - private final LinkedHashSet<AliasWrapper> aliasSet; - private final List<GenerationField> conditionSourceFields; - private final ArrayList<CodeBlock> conditionList; - private ExistsJoin existsJoin; - private final String graphPath; - private final int recCounter; - private final KeyWrapper resolverKey; - private boolean shouldUseEnhancedNullOnAllNullCheck = false; - private final boolean hasApplicableTable; - private final ProcessedSchema processedSchema; - - /* Midlertidig hack på count for paginerte kanter, som ikke bruker subspørringer enda */ - private final boolean addAllJoinsToJoinSet; - - private final boolean useTableWithoutAliasInFirstStep; // Necessary for mutation queries - - /** - * @param referenceObjectField The referring field that contains an object. - * @param pastJoinSequence The current sequence of joins that must prepended. - * @param previousObject The last object that was joined on in some previous iteration. - * @param joinSet List of joins that must be declared outside this recursion. - * @param aliasSet List of alias that must be declared outside this recursion. - * @param conditionList List of conditions that must be declared outside this recursion. - * @param pastGraphPath The path in the GraphQL schema so far. - * @param recCounter Counter that limits recursion depth to the max value of integers. - */ - private FetchContext( - ProcessedSchema processedSchema, - GenerationField referenceObjectField, - JoinListSequence pastJoinSequence, - RecordObjectSpecification<?> previousObject, - LinkedHashSet<SQLJoinStatement> joinSet, - LinkedHashSet<AliasWrapper> aliasSet, - ArrayList<CodeBlock> conditionList, - String pastGraphPath, - int recCounter, - FetchContext previousContext, - boolean addAllJoinsToJoinSet, - boolean useTableWithoutAliasInFirstStep - ) { - if (recCounter == Integer.MAX_VALUE - 1) { - throw new RuntimeException("Recursion depth has reached the integer max value."); - } - this.addAllJoinsToJoinSet = addAllJoinsToJoinSet; - this.useTableWithoutAliasInFirstStep = useTableWithoutAliasInFirstStep; - this.recCounter = recCounter; - this.processedSchema = processedSchema; - - if (referenceObjectField.hasNodeID()) { - referenceObject = processedSchema.getNodeTypeForNodeIdFieldOrThrow(referenceObjectField); - } else { - referenceObject = processedSchema.getRecordType(referenceObjectField); - } - - this.joinSet = joinSet; - this.aliasSet = aliasSet; - this.conditionList = conditionList; - - this.referenceObjectField = referenceObjectField; - var optionalPrevious = Optional.ofNullable(previousContext); - var previousTableObject = processedSchema.getPreviousTableObjectForObject(previousObject); - this.previousTable = previousTableObject != null ? previousTableObject.getTable() : null; - this.referenceTable = referenceObject != null ? referenceObject.getTable() : null; - - // For more complex cases, the input table may need to be expanded to a sequence. - var allFoundInputTables = processedSchema.findInputTables(referenceObjectField); - var foundInputTable = allFoundInputTables.stream().findFirst().orElse(null); - var inputTable = foundInputTable != null ? foundInputTable : optionalPrevious.map(it -> it.inputTable).orElse(null); - - graphPath = pastGraphPath; - - this.previousContext = previousContext; - this.resolverKey = referenceObjectField.createsDataFetcher() ? getKeyForResolverFieldOrThrow(referenceObjectField, processedSchema) : null; - - hasApplicableTable = previousTable != null || referenceTable != null; - var hasPreviousApplicableTable = optionalPrevious.map(FetchContext::hasApplicableTable).orElse(false); - var previousSourceFields = optionalPrevious.map(FetchContext::getConditionSourceFields).orElse(List.of()); - if (!previousSourceFields.isEmpty() && hasPreviousApplicableTable) { - this.conditionSourceFields = List.of(); - this.inputTable = null; // Note that this is important in order to not break longer join sequences by accidentally reusing this table. - } else if (!hasApplicableTable) { - this.conditionSourceFields = Stream.concat(previousSourceFields.stream(), Stream.of(referenceObjectField)).toList(); - this.inputTable = inputTable; - } else { - this.conditionSourceFields = previousSourceFields; - this.inputTable = inputTable; - } - currentJoinSequence = iterateJoinSequence(pastJoinSequence); - } - - /** - * @param referenceObjectField The referring field that contains an object. - * @param previousObject Object of origin for this context. - */ - public FetchContext( - ProcessedSchema processedSchema, - ObjectField referenceObjectField, - RecordObjectSpecification<?> previousObject, - boolean addAllJoinsToJoinSet - ) { - this( - processedSchema, - referenceObjectField, - previousObject, - addAllJoinsToJoinSet, - false - ); - } - - public FetchContext( - ProcessedSchema processedSchema, - ObjectField referenceObjectField, - RecordObjectSpecification<?> previousObject, - boolean addAllJoinsToJoinSet, - boolean useTableWithoutAliasInFirstStep - ) { - this( - processedSchema, - referenceObjectField, - new JoinListSequence(), - previousObject, - new LinkedHashSet<>(), - new LinkedHashSet<>(), - new ArrayList<>(), - "", - 0, - null, - addAllJoinsToJoinSet, - useTableWithoutAliasInFirstStep - ); - } - - /** - * @return Set of joins created by this context. - */ - public Set<SQLJoinStatement> getJoinSet() { - return joinSet; - } - - /** - * Retrieves and removes a one-to-many EXISTS join along with any associated conditions (e.g., from @condition). - * The join and conditions were diverted from joinSet/conditionList by resolveNextSequence to avoid row duplication. - */ - public Optional<ExistsJoin> pollExistsJoin() { - var result = Optional.ofNullable(existsJoin); - existsJoin = null; // Reset after consumption, otherwise the next filter field in the iteration would incorrectly wrap its condition in EXISTS - return result; - } - - public static class ExistsJoin { - private final SQLJoinStatement join; - private final List<CodeBlock> conditions = new ArrayList<>(); - - ExistsJoin(SQLJoinStatement join) { - this.join = join; - } - - public SQLJoinStatement join() { return join; } - public List<CodeBlock> conditions() { return Collections.unmodifiableList(conditions); } - - void addCondition(CodeBlock condition) { conditions.add(condition); } - } - - /** - * @return Set of aliases created by this and any other context created from this one. - */ - public Set<AliasWrapper> getAliasSet() { - return aliasSet; - } - - /** - * @return The path to the schema field in this context. Used to correctly check selection sets. - */ - public String getGraphPath(GenerationField field) { - String graphPathForField = graphPath; - if (processedSchema.isScalar(field)) { - graphPathForField += (graphPath.isEmpty() ? "" : "/") + field.getName(); - } - return graphPathForField; - } - - /** - * @return The referred object being processed in the current context. - */ - public RecordObjectSpecification<?> getReferenceObject() { - return referenceObject; - } - - /** - * @return The table join path or alias where the columns are expected to be found. - */ - public JoinListSequence getCurrentJoinSequence() { - return currentJoinSequence; - } - - /** - * @return List of all conditions created up to this point. - */ - public List<CodeBlock> getConditionList() { - return conditionList; - } - - /** - * @return The reference table the reference field points to. - */ - public JOOQMapping getReferenceTable() { - return referenceTable; - } - - /** - * @return The previously used reference table. - */ - public JOOQMapping getPreviousTable() { - if (previousContext != null) { - return previousContext.getTargetTable(); - } else { - return previousTable; - } - } - - /** - * @return The target table of this context. - */ - public JOOQMapping getTargetTable() { - return currentJoinSequence.isEmpty() ? getPreviousTable() : currentJoinSequence.getLast().getTable(); - } - - /** - * @return The target table name of this context. - */ - public String getTargetTableName() { - return getTargetTable() == null ? "" : getTargetTable().getName(); - } - - public String getSourceAlias() { - return !currentJoinSequence.isEmpty() ? currentJoinSequence.getFirst().getMappingName() : null; - } - - /** - * @return The target table alias of this context. - */ - public String getTargetAlias() { - return currentJoinSequence.render().toString(); - } - - /** - * @return The reference table which fields on this layer are taken from. - */ - public JOOQMapping getReferenceOrPreviousTable() { - return (referenceObject != null && referenceObject.hasTable()) ? referenceObject.getTable() : previousTable; - } - - /** - * @return The reference field which points to the reference object for this layer. - */ - public GenerationField getReferenceObjectField() { - return referenceObjectField; - } - - /** - * @return The sources for conditions that could not be applied in previous steps. - */ - public List<GenerationField> getConditionSourceFields() { - return conditionSourceFields; - } - - public KeyWrapper getResolverKey() { - return resolverKey; - } - - public boolean hasApplicableTable() { - return hasApplicableTable; - } - - public boolean hasNonSubqueryFields() { - return getReferenceObject() == null || getReferenceObject() - .getFields() - .stream() - .filter(it -> !processedSchema.isExceptionOrExceptionUnion(it)) - .anyMatch(it -> !processedSchema.invokesSubquery(it, getTargetTable())); - } - - public boolean hasPreviousContext() { - return previousContext != null; - } - - /** - * @return Should this layer apply an expanded null check? - */ - public boolean shouldUseEnhancedNullOnAllNullCheck() { - return shouldUseEnhancedNullOnAllNullCheck; - } - - /** - * Override the previous layer's use of an expanded null check. - */ - public void setParentContextShouldUseEnhancedNullOnAllNullCheck() { - if (previousContext != null) { - previousContext.shouldUseEnhancedNullOnAllNullCheck = true; - } - } - - /** - * @return The next iteration of this context based on the provided reference field. - */ - public FetchContext nextContext(GenerationField referenceObjectField) { - var newJoinListSequence = new JoinListSequence(); - var previousGraphPath = graphPath; - - if (!referenceObjectField.createsDataFetcher() && processedSchema.isObject(referenceObjectField)) { - previousGraphPath += (previousGraphPath.isEmpty() ? "" : "/") + referenceObjectField.getName(); - var refTable = processedSchema.getObject(referenceObjectField).getTable(); - - if ((refTable == null || refTable.equals(getReferenceTable())) && !currentJoinSequence.isEmpty()) { - newJoinListSequence.add(currentJoinSequence.getLast()); - } - } else if (!processedSchema.isObject(referenceObjectField) && referenceObjectField.isIterableWrapped() - && !referenceObjectField.hasFieldReferences() && !currentJoinSequence.isEmpty()) { - newJoinListSequence.addAll(currentJoinSequence); - } - - return new FetchContext( - processedSchema, - referenceObjectField, - newJoinListSequence, - referenceObject, - new LinkedHashSet<>(), - aliasSet, - new ArrayList<>(conditionList), - previousGraphPath, - recCounter + 1, - this, - addAllJoinsToJoinSet, - false); - } - - public FetchContext forVirtualField(VirtualSourceField field) { - return new FetchContext( - processedSchema, - field, - getCurrentJoinSequence(), - referenceObject, - new LinkedHashSet<>(), - aliasSet, - new ArrayList<>(conditionList), - graphPath, - recCounter + 1, - this, - addAllJoinsToJoinSet, - false); - } - - /** - * Iterate the table sequence as if several context layers were traversed with the provided references. - * @return The new join sequence, with the provided join sequence extended by all references in this layer's reference field, - * or other appropriate start points for a sequence. - */ - public JoinListSequence iterateJoinSequenceFor(GenerationField field) { - var currentSequence = getCurrentJoinSequence(); - List<FieldReference> fieldReferences = field.getFieldReferences(); - - if (processedSchema.isNodeIdField(field)) { - var nodeType = processedSchema.getNodeTypeForNodeIdFieldOrThrow(field); - if (!nodeType.getName().equals(getReferenceObjectField().getTypeName())) { - if (!referenceDirectiveAlreadySpecifiesPathToTable(fieldReferences, nodeType.getTable())) { - fieldReferences = Stream.of( - field.getFieldReferences(), - List.of(new FieldReference(nodeType.getTable()))) - .flatMap(Collection::stream).toList(); - } - } - } - - if (fieldReferences.isEmpty()) { - return currentSequence; - } - - var newJoinSequence = processFieldReferences( - getCurrentJoinSequence(), - getReferenceTable(), - fieldReferences, - true, - false - ); - return !newJoinSequence.isEmpty() ? newJoinSequence : currentSequence; - } - - /** - * Checks whether the last element in a @reference path already reaches the target table, either by direct table - * match or by being a key whose source or target table matches. This prevents adding a duplicate implicit table - * reference for @nodeId fields when the @reference directive already terminates at the correct table. - */ - private static boolean referenceDirectiveAlreadySpecifiesPathToTable(List<FieldReference> refs, JOOQMapping targetTable) { - if (refs.isEmpty()) { - return false; - } - var lastRef = refs.get(refs.size() - 1); - if (lastRef.hasKey()) { - var keyName = lastRef.getKey().getMappingName(); - return getKeySourceTableJavaName(keyName).map(targetTable.getMappingName()::equals).orElse(false) - || getKeyTargetTableJavaName(keyName).map(targetTable.getMappingName()::equals).orElse(false); - } - return lastRef.hasTable() && lastRef.getTable().equals(targetTable); - } - - /** - * Iterate the table sequence as if several context layers were traversed. - * @return The new join sequence, with the provided join sequence extended by all references in this layer's reference field, - * or other appropriate start points for a sequence. - */ - public JoinListSequence iterateJoinSequence(JoinListSequence previousSequence) { - var refTable = getReferenceTable() == null && !hasApplicableTable() ? inputTable : getReferenceTable(); - if (refTable == null && !referenceObjectField.hasFieldReferences()) { - return previousSequence; - } - - var referencesFromField = referenceObjectField.getFieldReferences(); - var newJoinSequence = processFieldReferences(previousSequence, getReferenceOrPreviousTable(), referencesFromField, false, true); - var updatedSequence = !newJoinSequence.isEmpty() ? newJoinSequence : previousSequence; - - if (refTable == null) { - return updatedSequence; - } - - var lastTable = !updatedSequence.isEmpty() ? updatedSequence.getLast().getTable() : getPreviousTable(); // Wrong if key was reverse. - - // An implicit self-join is only needed when source and target are the same table AND the field is a @splitQuery field with a previous table context and no explicit references. - var needsImplicitSelfJoin = referencesFromField.isEmpty() - && referenceObjectField.createsDataFetcher() - && processedSchema.isFieldWithPreviousTableObject(referenceObjectField); - - if (Objects.equals(lastTable, refTable) && !needsImplicitSelfJoin) { - return updatedSequence.isEmpty() ? makeJoinSequence(refTable) : updatedSequence; - } - - var finalSequence = resolveNextSequence( - new FieldReference(refTable), - new TableRelation(lastTable, refTable), - updatedSequence, - false - ); // Add fake reference to the reference table so that the last step is also executed if no table or key is specified. - if (!finalSequence.isEmpty()) { - return finalSequence; - } else { - return makeJoinSequence(refTable); - } - } - - /** - * Iterate through the provided references and create a new join sequence. - * @return The new join sequence, with the provided join sequence extended by all the references provided. - */ - private JoinListSequence processFieldReferences(JoinListSequence joinSequence, JOOQMapping refTable, List<FieldReference> references, boolean isInputReference, boolean checkLastRef) { - var previousTable = joinSequence.isEmpty() ? getPreviousTable() : joinSequence.getLast().getTable(); - if (getReferenceObjectField().createsDataFetcher() && previousContext != null && checkLastRef) previousTable = previousContext.getPreviousTable(); - - var relations = new ArrayList<TableRelation>(); - for (var fRef : references) { - var table = inferNextTable(fRef.getTable(), fRef.getKey(), previousTable, refTable); - relations.add(new TableRelation(previousTable, table, fRef.getKey())); - previousTable = table; - } - - if (previousTable == null) { - previousTable = getPreviousTable(); - } - - if (checkLastRef && !Objects.equals(previousTable, refTable)) { - relations.add(new TableRelation(previousTable, refTable)); - } - - for (int i = 0; i < references.size(); i++) { - if (getReferenceObjectField().createsDataFetcher() && previousContext == null && i > 0) break; - joinSequence = resolveNextSequence(references.get(i), relations.get(i), joinSequence, isInputReference); - } - return joinSequence; - } - - private JoinListSequence resolveNextSequence(FieldReference fRef, TableRelation relation, JoinListSequence joinSequence, boolean isInputReference) { - var previous = relation.getFrom(); - var target = relation.getToTable(); - - if (previous == null) { - return makeJoinSequence(target); - } - if (getReferenceObjectField().createsDataFetcher() && previousContext == null) { - return makeJoinSequence(previous); - } - - var targetOrPrevious = target != null ? target : previous; - - var newSequence = joinSequence; - - var keyToUse = fRef.hasKey() || fRef.hasTableCondition() - ? fRef.getKey() - : findImplicitKey(previous.getMappingName(), targetOrPrevious.getMappingName()).map(JOOQMapping::fromKey).orElse(null); - - if (keyToUse != null && !keyToUse.getTable().equals(target)) { - keyToUse = keyToUse.getInverseKey(); - } - - if (fRef.hasTableCondition() && keyToUse == null) { - if (newSequence.isEmpty()) { - var joinElement = getJoinElement(previous.getCodeName() + "_" + getReferenceObjectField().getName(), JoinListSequence.of(previous)); - newSequence.add(joinElement); - - var primaryKey = getTableByJavaFieldName(previous.getName()).map(Table::getPrimaryKey).stream().findFirst() - .orElseThrow(() -> - new IllegalArgumentException(String.format("Code generation failed for %s.%s as the table %s must have a primary key in order to reference another table without a foreign key.", - referenceObjectField.getContainerTypeName(), referenceObjectField.getName(), previous.getName()))); - - for (var fieldName : getJavaFieldNamesForKey(previous.getName(), primaryKey)) { - this.conditionList.add(CodeBlock.of("$L.$L.eq($L.$L)", previousContext.getCurrentJoinSequence().getLast().getMappingName(), fieldName, joinElement.getMappingName(), fieldName)); - } - } - var join = fRef.createConditionJoinFor(newSequence, targetOrPrevious, isInputReference); - addToJoinSet(join, isInputReference, previous, targetOrPrevious, null, newSequence); - aliasSet.add(join.getJoinAlias()); - return newSequence.cloneAdd(join.getJoinAlias().getAlias()); - } - - if (keyToUse != null) { - var aliasJoinSequence = newSequence.clone(); - if (newSequence.isEmpty()) aliasJoinSequence = aliasJoinSequence.cloneAdd(previousContext == null || previousContext.getCurrentJoinSequence().isEmpty() ? previous : previousContext.getCurrentJoinSequence().getLast()); - aliasJoinSequence = aliasJoinSequence.cloneAdd(keyToUse); - - var join = createJoinOnExplicitPathFor(fRef, keyToUse, aliasJoinSequence, target, isInputReference); - addToJoinSet(join, isInputReference, previous, targetOrPrevious, keyToUse, newSequence); - aliasSet.add(join.getJoinAlias()); - newSequence = newSequence.cloneAdd(join.getJoinAlias().getAlias()); - } - - if (fRef.hasTableCondition() && relation.hasRelation()) { - var previousTableWithAlias = newSequence.getSecondLast() == null && previousContext != null ? previousContext.getCurrentJoinSequence().render() : newSequence.render(newSequence.getSecondLast()); - addCondition(fRef.getTableCondition().formatToString(List.of(previousTableWithAlias, newSequence.render()))); - } - - return newSequence; - } - - private JoinElement getJoinElement(String aliasPrefix, JoinListSequence sequence) { - if (useTableWithoutAliasInFirstStep) { - return sequence.getFirst(); - } - return getAlias(aliasPrefix, sequence, false); - } - - private Alias getAlias(String aliasPrefix, JoinListSequence sequence, boolean isLeft) { - var aliasWrapper = new AliasWrapper(new Alias(aliasPrefix, sequence, isLeft), referenceObjectField, processedSchema); - aliasSet.add(aliasWrapper); - return aliasWrapper.getAlias(); - } - - /** - * Adds a join to joinSet, or stores it as an EXISTS join if it's a one-to-many filter join. - */ - private void addToJoinSet(SQLJoinStatement join, boolean isInputReference, JOOQMapping from, JOOQMapping to, JOOQMapping key, JoinListSequence currentSequence) { - if (!currentSequence.isEmpty() || addAllJoinsToJoinSet) { - if (isExistsJoin(isInputReference, from, to, key)) { - existsJoin = new ExistsJoin(join); - } else { - joinSet.add(join); - } - } - } - - /** - * Adds a condition to the current EXISTS join if one exists, otherwise to the regular condition list. - */ - private void addCondition(CodeBlock condition) { - if (existsJoin != null) { - existsJoin.addCondition(condition); - } else { - conditionList.add(condition); - } - } - - /** - * Checks if a filter LEFT JOIN represents a one-to-many relationship that should use an EXISTS subquery - * instead of a regular LEFT JOIN, to avoid row duplication. - */ - private boolean isExistsJoin(boolean isInputReference, JOOQMapping from, JOOQMapping to, JOOQMapping key) { - if (isInputReference && from != null && to != null && !from.getMappingName().equalsIgnoreCase(to.getMappingName())) { - var relationType = inferRelationType(from.getMappingName(), to.getMappingName(), key); - return relationType == TableRelationType.REVERSE_IMPLICIT || relationType == TableRelationType.REVERSE_KEY; - } - return false; - } - - /** - * @return A join statement based on a key reference using path - */ - - public SQLJoinStatement createJoinOnExplicitPathFor(FieldReference fRef, JOOQMapping keyOverride, JoinListSequence joinSequence, JOOQMapping tableNameBackup, boolean isNullable) { - - var targetTable = fRef.hasTable() ? fRef.getTable() : tableNameBackup; - var prefix = joinSequence.getSecondLast().getCodeName().startsWith("_") ? joinSequence.getSecondLast().getMappingName() : joinSequence.getSecondLast().getCodeName(); - var alias = new AliasWrapper(getAlias(prefix + "_" + keyOverride.getCodeName(), joinSequence, isNullable), referenceObjectField, targetTable.equals(referenceTable), processedSchema); - - return new SQLJoinStatement( - joinSequence, - targetTable, - alias, - List.of(), - isNullable, - keyOverride - ); - } - - private JoinListSequence makeJoinSequence(JOOQMapping mapping) { - var aliasOrTable = getJoinElement(mapping.getCodeName(), JoinListSequence.of(mapping)); - return JoinListSequence.of(aliasOrTable); - } - - public CodeBlock renderQuerySource(JOOQMapping localTable) { - return currentJoinSequence.render(localTable == null ? getReferenceTable() : localTable); - } - - private static JOOQMapping inferNextTable(JOOQMapping referenceTable, JOOQMapping referenceKey, JOOQMapping previousTable, JOOQMapping nextTable) { - if (referenceTable != null) { - return referenceTable; - } - - // Infer based on the key provided. - if (referenceKey != null) { - var keyName = referenceKey.getMappingName(); - var sourceTable = getKeySourceTableJavaName(keyName).map(JOOQMapping::fromTable).orElse(null); - var targetTable = getKeyTargetTableJavaName(keyName).map(JOOQMapping::fromTable).orElse(null); - - // Self reference key. - if (Objects.equals(sourceTable, targetTable) && Objects.equals(sourceTable, previousTable) && hasSelfRelation(previousTable.getMappingName())) { - return sourceTable; - } - - // Key is the "right" way. - if (Objects.equals(sourceTable, previousTable)) { - return targetTable; - } - - // Key is the "wrong" way. - if (Objects.equals(targetTable, previousTable)) { - return sourceTable; - } - } - - return nextTable; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/context/InputParser.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/context/InputParser.java deleted file mode 100644 index cb8bfd43da..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/context/InputParser.java +++ /dev/null @@ -1,237 +0,0 @@ -package no.sikt.graphitron.generators.context; - -import no.sikt.graphitron.definitions.fields.InputField; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.objects.ExceptionDefinition; -import no.sikt.graphitron.generators.codebuilding.VariablePrefix; -import no.sikt.graphitron.javapoet.CodeBlocks; -import no.sikt.graphitron.javapoet.ParameterSpec; -import no.sikt.graphitron.javapoet.TypeName; -import no.sikt.graphql.naming.GraphQLReservedName; -import no.sikt.graphql.schema.ProcessedSchema; -import org.jetbrains.annotations.NotNull; - -import java.util.*; -import java.util.stream.Collectors; - -import static no.sikt.graphitron.configuration.GeneratorConfig.getRecordValidation; -import static no.sikt.graphitron.configuration.GeneratorConfig.recordValidationEnabled; -import static no.sikt.graphitron.configuration.Recursion.recursionCheck; -import static no.sikt.graphitron.generators.codebuilding.NameFormat.asListedRecordNameIf; -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.*; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_PAGE_SIZE; -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.contextFieldPrefix; -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.inputPrefix; -import static no.sikt.graphitron.mappings.JavaPoetClassName.INTEGER; -import static no.sikt.graphitron.mappings.JavaPoetClassName.STRING; -import static no.sikt.graphql.naming.GraphQLReservedName.*; -import static org.apache.commons.lang3.StringUtils.uncapitalize; - -/** - * A helper class for handling input type data for services and mutations. - * Order of fields is as follows: Basic non-reserved fields -> ordering field -> pagination fields -> context fields - */ -public class InputParser { - private final static List<ParameterSpec> FORWARD_PAGINATION_SPECS = List.of( - ParameterSpec.of(INTEGER.className, VAR_PAGE_SIZE), - ParameterSpec.of(STRING.className, inputPrefix(GraphQLReservedName.PAGINATION_AFTER.getName())) - ); - private final static List<String> FORWARD_PAGINATION_INPUTS = List.of(VAR_PAGE_SIZE, inputPrefix(PAGINATION_AFTER.getName())); - private final Map<String, InputField> methodInputs, recordInputs, jOOQInputs, orderField; - private final Map<String, TypeName> contextInputs ; - private final List<String> methodInputParams, contextInputNames, orderFieldParam; - private final List<ObjectField> allErrors; - private final ExceptionDefinition validationErrorException; - private final ProcessedSchema schema; - private final boolean hasForwardPagination, isEntities; - - public InputParser(ObjectField target, ProcessedSchema schema) { - this.schema = schema; - this.hasForwardPagination = target.hasForwardPagination(); - this.isEntities = target.isRootField() && target.getName().equals(FEDERATION_ENTITIES_FIELD.getName()) && schema.isFederationImported(); - methodInputs = parseInputs(target.getNonReservedArguments(), schema); - orderField = target.getOrderField().map(it -> parseInputs(List.of(it), schema)).orElse(Map.of()); - recordInputs = methodInputs - .entrySet() - .stream() - .filter(it -> schema.hasRecord(it.getValue())) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> v1, LinkedHashMap::new)); - jOOQInputs = recordInputs - .entrySet() - .stream() - .filter(it -> schema.hasJOOQRecord(it.getValue())) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> v1, LinkedHashMap::new)); - methodInputParams = methodInputs.keySet().stream().map(VariablePrefix::inputPrefix).toList(); - orderFieldParam = orderField.keySet().stream().map(VariablePrefix::inputPrefix).toList(); - contextInputs = schema.getAllContextFields(target); - contextInputNames = contextInputs.keySet().stream().map(VariablePrefix::contextFieldPrefix).toList(); - - if (schema.isObject(target) && schema.isInterface(ERROR_TYPE.getName())) { - allErrors = schema.getAllErrors(target.getTypeName()); - } else { - allErrors = List.of(); - } - - validationErrorException = !recordValidationEnabled() ? null : getRecordValidation().getSchemaErrorType().flatMap(errorTypeName -> - allErrors.stream() - .map(it -> schema.getExceptionDefinitions(it.getTypeName())) - .flatMap(Collection::stream) - .filter(it -> errorTypeName.equals(it.getName())) - .findFirst() - ).orElse(null); - } - - /** - * @return Map of variable names and types for the declared and fully set records. - */ - @NotNull - private Map<String, InputField> parseInputs(List<? extends InputField> specInputs, ProcessedSchema schema) { - var inputs = new LinkedHashMap<String, InputField>(); - - for (var in : specInputs) { - if (isEntities && in.getName().equals(FEDERATION_REPRESENTATIONS_ARGUMENT.getName())) { - return Map.of(uncapitalize(FEDERATION_REPRESENTATIONS_ARGUMENT.getName()), in); - } - - var inType = schema.getInputType(in); - if (inType == null) { - inputs.put(uncapitalize(in.getName()), in); - } else if (inType.hasTable() && !inType.hasJavaRecordReference()) { - inputs.putAll(parseInputs(in, schema, 0)); - } else if (inType.hasJavaRecordReference()) { - inputs.put(asListedRecordNameIf(in.getName(), in.isIterableWrapped()), in); - } else { - inputs.put(uncapitalize(in.getName()), in); - } - } - return inputs; - } - - /** - * @return Map of variable names and types for the declared records. - */ - @NotNull - private Map<String, InputField> parseInputs(InputField target, ProcessedSchema schema, int recursion) { - recursionCheck(recursion); - - var serviceInputs = new LinkedHashMap<String, InputField>(); - serviceInputs.put(asListedRecordNameIf(target.getName(), target.isIterableWrapped()), target); - schema - .getInputType(target) - .getFields() - .stream() - .filter(schema::hasJOOQRecord) - .flatMap(in -> parseInputs(in, schema, recursion + 1).entrySet().stream()) - .forEach(it -> serviceInputs.put(it.getKey(), it.getValue())); - return serviceInputs; - } - - /** - * @return List of all context input names that the field specifies. - */ - public List<String> getContextFieldNames() { - return contextInputNames; - } - - /** - * @return List of all input names that the field specifies. - */ - public List<String> getMethodInputNames(boolean includeOrder, boolean includeForwardPagination, boolean includeContextFields) { - var fieldList = new ArrayList<>(methodInputParams); - if (includeOrder) { - fieldList.addAll(orderFieldParam); - } - if (includeForwardPagination && hasForwardPagination) { - fieldList.addAll(FORWARD_PAGINATION_INPUTS); - } - if (includeContextFields) { - fieldList.addAll(contextInputNames); - } - return fieldList; - } - - /** - * @return List of all inputs that the field specifies as CodeBlocks. - */ - public CodeBlocks getMethodInputBlocks(boolean includeOrder, boolean includeForwardPagination, boolean includeContextFields) { - return CodeBlocks.fromVars(getMethodInputNames(includeOrder, includeForwardPagination, includeContextFields)); - } - - /** - * @return Map of inputs that the field specifies that correspond to any records. - */ - public Map<String, InputField> getRecords() { - return recordInputs; - } - - /** - * @return Map of inputs that the field specifies that correspond to jOOQ records. - */ - public Map<String, InputField> getJOOQRecords() { - return jOOQInputs; - } - - /** - * @return Are there any records among the inputs? - */ - public boolean hasRecords() { - return !recordInputs.isEmpty(); - } - - /** - * @return Are there any jOOQ records among the inputs?. - */ - public boolean hasJOOQRecords() { - return !jOOQInputs.isEmpty(); - } - - /** - * @return List of all error types this operation has specified in the schema. - */ - public List<ObjectField> getAllErrors() { - return allErrors; - } - - /** - * @return ExceptionDefinition used for validation errors. If it's configured and present in the schema as a returnable error for this operation. - */ - public Optional<ExceptionDefinition> getValidationErrorException() { - return Optional.ofNullable(validationErrorException); - } - - public List<ParameterSpec> getMethodParameterSpecs(boolean includeOrder, boolean includeForwardPagination, boolean includeContextFields) { - var specList = new ArrayList<>(getMethodParameterSpecs(methodInputs)); - if (includeOrder) { - specList.addAll(getMethodParameterSpecs(orderField)); - } - if (includeForwardPagination && hasForwardPagination) { - specList.addAll(FORWARD_PAGINATION_SPECS); - } - if (includeContextFields) { - specList.addAll(getContextParameterSpecs()); - } - return specList; - } - - private List<ParameterSpec> getMethodParameterSpecs(Map<String, InputField> inputs) { - return inputs - .entrySet() - .stream() - .map((it) -> - ParameterSpec.of( - isEntities && it.getValue().getName().equals(FEDERATION_REPRESENTATIONS_ARGUMENT.getName()) - ? wrapList(getObjectMapTypeName()) - : iterableWrapType(it.getValue(), true, schema), inputPrefix(it.getKey()) - ) - ) - .toList(); - } - - public List<ParameterSpec> getContextParameterSpecs() { - return contextInputs - .entrySet() - .stream() - .map((it) -> ParameterSpec.of(it.getValue(), contextFieldPrefix(it.getKey()))) - .toList(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/context/JoinListSequence.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/context/JoinListSequence.java deleted file mode 100644 index fed025d296..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/context/JoinListSequence.java +++ /dev/null @@ -1,92 +0,0 @@ -package no.sikt.graphitron.generators.context; - -import no.sikt.graphitron.definitions.interfaces.JoinElement; -import no.sikt.graphitron.javapoet.CodeBlock; - -import java.io.Serial; -import java.util.Arrays; -import java.util.LinkedList; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; - -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.asMethodCall; - -/** - * A list of table or key references. - */ -public class JoinListSequence extends LinkedList<JoinElement> { - @Serial - private static final long serialVersionUID = 1L; - /** - * @return Render all the elements of this list to a method call sequence. - */ - public CodeBlock render() { - return render(null); - } - - /** - * @return Render the elements of this list to a method call sequence, but exclude everything after the limit element. - */ - public CodeBlock render(JoinElement limitElement) { - if (isEmpty()) { - return CodeBlock.empty(); - } - - var first = getFirst(); - var code = CodeBlock.builder().add(first.getMappingName()); - if (first.equals(limitElement)) { - return code.build(); - } - - if (size() > 1) { - var remaining = this.subList(1, size()); - for (var element : remaining) { - if (element.clearsPreviousSequence()) { - code.clear().add(element.getMappingName()); - } else { - code.add(asMethodCall(element.getCodeName())); - } - - if (element.equals(limitElement)) { - return code.build(); - } - } - } - return code.build(); - } - - public static JoinListSequence of(JoinElement ... elements) { - var sequence = new JoinListSequence(); - if (!Arrays.stream(elements).allMatch(Objects::isNull)) { - sequence.addAll(List.of(elements)); - } - return sequence; - } - - public JoinListSequence cloneAdd(JoinElement ... elements) { - var clone = clone(); - if (!Arrays.stream(elements).allMatch(Objects::isNull)) { - clone.addAll(List.of(elements)); - } - return clone; - } - - public JoinElement getSecondLast() { - var it = descendingIterator(); - if (it.hasNext()) { - it.next(); - } - return it.hasNext() ? it.next() : null; - } - - @Override - public JoinListSequence clone() { - return (JoinListSequence) super.clone(); - } - - @Override - public String toString() { - return stream().filter(it -> !it.clearsPreviousSequence()).map(JoinElement::getCodeName).collect(Collectors.joining("_")); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/context/MapperContext.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/context/MapperContext.java deleted file mode 100644 index 4e120d9fd4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/context/MapperContext.java +++ /dev/null @@ -1,530 +0,0 @@ -package no.sikt.graphitron.generators.context; - -import no.sikt.graphitron.configuration.externalreferences.TransformScope; -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.definitions.mapping.MethodMapping; -import no.sikt.graphitron.definitions.objects.RecordObjectDefinition; -import no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks; -import no.sikt.graphitron.javapoet.ClassName; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.ParameterizedTypeName; -import no.sikt.graphitron.javapoet.Wrappers; -import no.sikt.graphql.schema.ProcessedSchema; -import org.jetbrains.annotations.Nullable; - -import java.util.Optional; - -import static no.sikt.graphitron.configuration.GeneratorConfig.recordValidationEnabled; -import static no.sikt.graphitron.configuration.GeneratorConfig.shouldMakeNodeStrategy; -import static no.sikt.graphitron.configuration.Recursion.recursionCheck; -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.*; -import static no.sikt.graphitron.generators.codebuilding.KeyWrapper.getKeyTableRecordTypeName; -import static no.sikt.graphitron.generators.codebuilding.NameFormat.asRecordName; -import static no.sikt.graphitron.generators.codebuilding.NameFormat.namedIteratorPrefixIf; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.*; -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.*; -import static no.sikt.graphitron.generators.context.NodeIdReferenceHelpers.isNodeIdReferenceField; -import static no.sikt.graphitron.generators.context.NodeIdReferenceHelpers.resolveColumnNamesForNodeIdField; -import static no.sikt.graphitron.javapoet.CodeBlock.declareNew; -import static no.sikt.graphitron.mappings.JavaPoetClassName.*; -import static no.sikt.graphitron.mappings.ReflectionHelpers.classHasMethod; -import static no.sikt.graphitron.mappings.ReflectionHelpers.setterAcceptsOptional; -import static no.sikt.graphitron.mappings.TableReflection.recordUsesFSHack; -import static no.sikt.graphql.naming.GraphQLReservedName.NODE_ID; -import static org.apache.commons.lang3.StringUtils.uncapitalize; - -public class MapperContext { - private final GenerationField target; - private final int recursion; - private final RecordObjectDefinition<?, ?> targetType; - private final boolean - hasRecordReference, - hasJavaRecordReference, - hasTable, - isIterable, - wasIterable, - toRecord, - mapsJavaRecord, - isValidation, - createsDataFetchers, - targetIsType, - isInitContext, - pastFieldOverrideExists, - noRecordIterability, - isSimpleIDMode, - lastInputDeclarationWasIterable; - private final String sourceName, targetName, path, indexPath, lastIterableIndexName; - private final MethodMapping getSourceMapping, setTargetMapping, lastRecordMapping; - private final MapperContext previousContext; - private final ProcessedSchema schema; - - // Initial context values. Only some of the initial values here are used. - private MapperContext(boolean toRecord, boolean mapsJavaRecord, boolean isValidation, boolean createsDataFetchers, ProcessedSchema schema) { - recursion = 0; - path = ""; - indexPath = ""; - lastIterableIndexName = null; - isIterable = false; - wasIterable = false; - lastInputDeclarationWasIterable = true; - targetIsType = false; - sourceName = ""; - targetName = ""; - lastRecordMapping = null; - getSourceMapping = null; - setTargetMapping = null; - previousContext = null; - targetType = null; - hasRecordReference = false; - hasJavaRecordReference = false; - hasTable = false; - isSimpleIDMode = false; - target = null; - this.toRecord = toRecord; - this.mapsJavaRecord = mapsJavaRecord; - this.isValidation = isValidation; - this.createsDataFetchers = createsDataFetchers; - this.schema = schema; - - isInitContext = true; - pastFieldOverrideExists = false; - noRecordIterability = false; - } - - private MapperContext(GenerationField target, MapperContext previousContext) { - isInitContext = false; - this.previousContext = previousContext; - this.schema = previousContext.schema; - this.mapsJavaRecord = previousContext.mapsJavaRecord; - this.toRecord = previousContext.toRecord; - this.isValidation = previousContext.isValidation; - this.createsDataFetchers = previousContext.createsDataFetchers; - this.target = target; - this.targetType = (RecordObjectDefinition<?, ?>) Optional.ofNullable(schema.getRecordType(target)) - .filter(it -> it instanceof RecordObjectDefinition<?, ?>) - .orElse(null); - - pastFieldOverrideExists = previousContext.pastFieldOverrideExists || (previousContext.target != null && previousContext.target.hasSetFieldOverride()); - targetIsType = targetType != null; - hasRecordReference = targetIsType && targetType.hasRecordReference(); - hasTable = targetIsType && targetType.hasTable(); - hasJavaRecordReference = targetIsType && targetType.hasJavaRecordReference(); - recursion = previousContext.recursion + 1; - isIterable = createsDataFetchers ? target.isIterableWrapped() : (target.isIterableWrapped() && !hasJavaRecordReference || previousContext.isInitContext); - wasIterable = isIterable || previousContext.wasIterable; - isSimpleIDMode = !previousContext.hasRecordReference && !toRecord && !target.isInput() && target.isID(); // Special case, may become unsupported in the future. - - var schemaNameToUse = getSchemaNameToUse(); - var recordName = getRecordName(); - - sourceName = select(schemaNameToUse, recordName); - targetName = select(recordName, schemaNameToUse); - - var schemaMethodMapping = target.getMappingFromSchemaName(); - var recordMappingHere = getNextRecordMapping(); - lastRecordMapping = recordMappingHere; - getSourceMapping = select(schemaMethodMapping, recordMappingHere); - setTargetMapping = select(recordMappingHere, schemaMethodMapping); - - path = getNextPath(); - indexPath = getNextIndexPath(); - lastIterableIndexName = isIterable ? getIndexName() : previousContext.lastIterableIndexName; - noRecordIterability = targetIsType && sourceName.isEmpty() && target.isIterableWrapped(); - - lastInputDeclarationWasIterable = previousContext.lastInputDeclarationWasIterable && !target.isIterableWrapped() || previousContext.isInitContext; - } - - private @Nullable MethodMapping getNextRecordMapping() { - if (previousContext.isInitContext || (!target.hasSetFieldOverride() && previousContext.lastRecordMapping != null && pastFieldOverrideExists)) { - return previousContext.lastRecordMapping; - } - - // FS HACK - Account for get/set ID methods with an underscore at the end... - if (previousContext.targetIsType && previousContext.targetType.hasTable() && recordUsesFSHack(previousContext.targetType.getTable().getName()) && target.getName().equals(NODE_ID.getName())) { - return new MethodMapping(target.getName() + "_"); - } - - return target.getJavaRecordMethodMapping(mapsJavaRecord); - } - - private String getSchemaNameToUse() { - if (createsDataFetchers && toRecord) { - return uncapitalize(target.getName()); - } - - if (previousContext.isInitContext || createsDataFetchers) { - return uncapitalize(schema.isRecordType(target) ? schema.getRecordType(target).getName() : target.getTypeName()); - } - - if (mapsJavaRecord) { - return uncapitalize(target.getName()); - } - - return uncapitalize(previousContext.targetType.getName() + "_" + uncapitalize(target.getName())); - } - - private String getRecordName() { - if (createsDataFetchers && !toRecord) { - return uncapitalize(target.getTypeName()); - } - - return (mapsJavaRecord ? hasJavaRecordReference : hasTable) - ? uncapitalize(targetType.asRecordName()) - : select(previousContext.targetName, previousContext.sourceName); - } - - private String getNextPath() { - if (previousContext.isInitContext) { - return createsDataFetchers && toRecord ? target.getName() : ""; - } - - if (previousContext.path.isEmpty()) { - return target.getName(); - } - - return previousContext.path + "/" + target.getName(); - } - - private String getNextIndexPath() { - if (previousContext.isInitContext) { - return createsDataFetchers && toRecord ? target.getName() : ""; - } - - if (previousContext.indexPath.isEmpty() && !previousContext.isIterable) { - return target.getName(); - } - - var indexElement = previousContext.isIterable ? (previousContext.indexPath.isEmpty() ? "" : "/\" + ") + previousContext.getIndexName() + " + \"/" : "/"; - return previousContext.indexPath + indexElement + target.getName(); - } - - public RecordObjectDefinition<?, ?> getTargetType() { - return targetType; - } - - public boolean hasRecordReference() { - return hasRecordReference; - } - - public boolean hasJavaRecordReference() { - return hasJavaRecordReference; - } - - public boolean hasTable() { - return hasTable; - } - - public GenerationField getTarget() { - return target; - } - - public MapperContext getPreviousContext() { - return previousContext; - } - - public boolean isIterable() { - return isIterable; - } - - public boolean wasIterable() { - return wasIterable; - } - - public boolean isTopLevelContext() { - return previousContext != null && previousContext.isInitContext; - } - - public boolean targetIsType() { - return targetIsType; - } - - public String getPath() { - return path; - } - - public String getFieldName() { - return target.getName(); - } - - public String getIndexPath() { - return indexPath; - } - - public String getSourceName() { - return sourceName; - } - - public boolean hasSourceName() { - return !sourceName.isEmpty(); - } - - public String getTargetName() { - return targetName; - } - - private String getIndexName() { - return namedIndexIteratorPrefix(sourceName); - } - - public boolean targetCanNotBeMapped() { - return previousContext.hasRecordReference && !isMappingPossible() && (!targetIsType || targetType.hasRecordReference()); - } - - public boolean variableNotAlreadyDeclared() { - return targetIsType && !sourceIsEqualToPreviousSource() && sourceHasRequiredMethod(); - } - - private boolean sourceIsEqualToPreviousSource() { - var secondLastContext = previousContext.previousContext; - if (secondLastContext == null) { - return false; - } - return previousContext.sourceName.equals(secondLastContext.sourceName); - } - - public CodeBlock getSourceGetCallBlock() { - if (isSimpleIDMode) { - return CodeBlock.of(inputPrefix(asRecordName(previousContext.targetName))); - } - - if (!toRecord && schema.isNodeIdField(target)) { - var nodeConfig = schema.getNodeConfigurationForTypeOrThrow(target.getContainerTypeName()); - return createNodeIdBlockForRecord(nodeConfig, namedIteratorPrefixIf(previousContext.sourceName, previousContext.isIterable)); - } - - return getValue( - (!isValidation || toRecord) && previousContext.isIterable || !toRecord && previousContext.lastInputDeclarationWasIterable - ? namedIteratorPrefix(previousContext.sourceName) - : inputPrefix(previousContext.sourceName), getSourceMapping - ); - } - - public MapperContext iterateContext(GenerationField field) { - recursionCheck(recursion); - return new MapperContext(field, this); - } - - public String getInputVariableName() { - return inputPrefix(select(targetType.getName(), targetType.asRecordName())); - } - - public String getOutputName() { - return select(targetType.asRecordName(), targetType.getName()); - } - - public String getHelperVariableName() { - return mapsJavaRecord ? getSourceMapping.getName() : (previousContext.targetType.getName() + "_" + uncapitalize(setTargetMapping.getName())); - } - - public ClassName getReturnType() { - return targetType.asTargetClassName(toRecord); - } - - public CodeBlock wrapFields(CodeBlock fieldCode) { - if (fieldCode.isEmpty()) { - return CodeBlock.empty(); - } - - var targetEqualsPrevious = targetName.equals(previousContext.targetName); - var code = CodeBlock.builder(); - if (isIterable && hasSourceName()) { - code.declareIf(createsDataFetchers || isValidation || toRecord, namedIteratorPrefix(sourceName), "$N.get($N)", inputPrefix(sourceName), getIndexName()); - - if (toRecord && !createsDataFetchers && !isValidation) { - code.declare(VAR_ARGS, "$N.$L($N)", VAR_ARG_PRESENCE, METHOD_ITEM_AT, getIndexName()); - } - - if (!isValidation) { - code.add(continueCheck(namedIteratorPrefix(sourceName))); - - if (!createsDataFetchers && !mapsJavaRecord && !targetEqualsPrevious) { - code.add(select(declareRecord(outputPrefix(targetName), targetType, false, false), declareNew(outputPrefix(targetName), targetType.getGraphClassName()))); - } - } else if (previousContext.isInitContext) { - code.declareNew(VAR_PATHS_FOR_PROPERTIES, ParameterizedTypeName.get(HASH_MAP.className, STRING.className, STRING.className)); - } - } - - code - .declareNewIf(!isValidation && mapsJavaRecord && !targetEqualsPrevious, outputPrefix(targetName), targetType.asTargetClassName(toRecord)) - .add(fieldCode); - - if (createsDataFetchers) { - return code.applyIf(isIterable, wrapForIndexed(sourceName)).build(); - } - - if (hasSourceName()) { - if (!isValidation && isIterable && (!mapsJavaRecord || hasRecordReference)) { - code.addStatement("$N.add($N)", listedOutputPrefix(targetName), outputPrefix(targetName)); - } else if (isValidation && previousContext.isInitContext) { - code.addStatement("$N.addAll($T.validatePropertiesAndGenerateGraphQLErrors($N, $N, $N))", VAR_VALIDATION_ERRORS, RECORD_VALIDATOR.className, namedIteratorPrefixIf(sourceName, isIterable), VAR_PATHS_FOR_PROPERTIES, VAR_ENV); - } - } - - code.applyIf(isIterable && hasSourceName(), isValidation || toRecord ? wrapForIndexed(sourceName) : wrapFor(sourceName)); - if (isValidation || !previousContext.isInitContext && (toRecord || !mapsJavaRecord)) { - return code.build(); - } - - if (!previousContext.isInitContext) { - return code.add(getSetMappingBlock(outputPrefix(targetName))).build(); - } - - return code - .applyIf(hasSourceName(), Wrappers.wrapNotNull(inputPrefix(sourceName))) - .addIf(toRecord && !mapsJavaRecord, () -> applyGlobalTransforms(targetName, targetType.getRecordClassName(), TransformScope.ALL_MUTATIONS)) // Note: This is done after records are filled. - .build(); - } - - public CodeBlock getSetMappingBlock(CodeBlock valueToSet) { - if (schema.isNodeIdField(target) && toRecord && !mapsJavaRecord) { - var nodeConfiguration = schema.getNodeConfigurationForNodeIdFieldOrThrow(target); - var currentTable = schema.getRecordType(target.getContainerTypeName()).getTable(); - var isReference = isNodeIdReferenceField(target, schema, currentTable); - var nodeIdFields = tableFieldsWithStaticTableInstanceBlock( - currentTable.getName(), - resolveColumnNamesForNodeIdField(target, schema, currentTable) - ); - - return CodeBlock.statementOf("$N.$L($N, $L, $S, $L)", - VAR_NODE_STRATEGY, - isReference ? METHOD_SET_RECORD_REFERENCE_ID : METHOD_SET_RECORD_ID, - outputPrefix(previousContext.targetName), - valueToSet, - nodeConfiguration.typeId(), - nodeIdFields - ); - } - return setValue(outputPrefix(previousContext.targetName), setTargetMapping, valueToSet, target.createsDataFetcher()); - } - - public CodeBlock getSetMappingBlock(String valueToSet) { - return getSetMappingBlock(CodeBlock.of(valueToSet)); - } - - public CodeBlock getFieldSetMappingBlock() { - CodeBlock valueToSet = applyEnumConversion(target.getTypeName(), getSourceGetCallBlock()); - if (isIterable && !targetIsType && !mapsJavaRecord) { // Array field - valueToSet = toRecord - ? CodeBlock.of("$L.stream().toArray($T[]::new)", valueToSet, target.getTypeClass()) - : CodeBlock.of("$T.of($L)", LIST.className, valueToSet); - } - if (toRecord && mapsJavaRecord && isSetterOptional()) { - valueToSet = CodeBlock.of("$T.ofNullable($L)", Optional.class, valueToSet); - } - return getSetMappingBlock(valueToSet); - } - - public CodeBlock getResolverKeySetMappingBlockForJooqRecord() { - return getResolverKeySetMappingBlock(namedIteratorPrefixIf(previousContext.sourceName, previousContext.isIterable), false); - } - - public CodeBlock getResolverKeySetMappingBlock(String varName) { - return getResolverKeySetMappingBlock(varName, target.isIterableWrapped()); - } - - private CodeBlock getResolverKeySetMappingBlock(String varName, boolean isKeyList) { - var recordClass = getKeyTableRecordTypeName(target, schema); - - if (isKeyList) { - return getSetMappingBlock(CodeBlock.of("$N.stream().map($N -> $L)$L", - varName, VAR_ITERATOR, extractKeyAsTableRecord(VAR_ITERATOR, recordClass), collectToList()) - ); - } - - return getSetMappingBlock(extractKeyAsTableRecord(varName, recordClass)); - } - - public CodeBlock getRecordSetMappingBlock() { - return getSetMappingBlock(transformRecord()); - } - - public CodeBlock applyEnumConversion(String typeName, CodeBlock getCall) { - return schema.isEnum(typeName) ? toGraphEnumConverter(typeName, getCall, toRecord, schema) : getCall; - } - - public CodeBlock getReturnBlock() { - var name = select(targetType.getRecordReferenceName(), targetType.getName()); - return returnWrap(hasSourceName() || noRecordIterability ? listedOutputPrefix(name) : outputPrefix(name)); - } - - /** - * @return CodeBlock for the mapping of a record. Includes path for validation. - */ - public CodeBlock transformInputRecord() { - return CodeBlock.of( - "$L$L$L$S$L)", - recordTransformPart(sourceName, targetType.getName()), - CodeBlock.ofIf(shouldMakeNodeStrategy(), "$N, ", VAR_NODE_STRATEGY), - CodeBlock.of("$N.$L().$L($S), ", VAR_TRANSFORMER, METHOD_ARG_PRESENCE_NAME, METHOD_CHILD, target.getName()), - path, - CodeBlock.ofIf(recordValidationEnabled() && !hasJavaRecordReference, ", \"$L\"", indexPath) - ); - } - - /** - * @return CodeBlock for the mapping of a record. - */ - private CodeBlock transformRecord() { - var recordPart = recordTransformPart( - previousContext.hasSourceName() ? getHelperVariableName() : asRecordName(previousContext.getTargetName()), - uncapitalize(targetType.getName()) - ); - var nodeStrategyPart = CodeBlock.ofIf(shouldMakeNodeStrategy(), "$N, ", VAR_NODE_STRATEGY); - var argPresencePart = toRecord - ? CodeBlock.of("$N.$L($S), ", VAR_ARGS, METHOD_CHILD, target.getName()) - : CodeBlock.empty(); - var pathPart = toRecord && previousContext.lastIterableIndexName != null - ? CodeBlock.of("$N + $S + $N + $S", VAR_PATH_NAME, "[", previousContext.lastIterableIndexName, "]/" + path) - : CodeBlock.of("$N + $S", VAR_PATH_HERE, path); - var validationPart = CodeBlock.ofIf(recordValidationEnabled() && !hasJavaRecordReference && toRecord, ", $N + $S", VAR_PATH_HERE, path); - return CodeBlock.join(recordPart, nodeStrategyPart, argPresencePart, pathPart, validationPart, CodeBlock.of(")")); - } - - private CodeBlock recordTransformPart(String varName, String typeName) { - return FormatCodeBlocks.recordTransformPart(VAR_TRANSFORMER, inputPrefix(varName), typeName, hasJavaRecordReference, toRecord); - } - - private boolean isMappingPossible() { - return sourceHasRequiredMethod() && targetHasRequiredMethod(); - } - - private boolean sourceHasRequiredMethod() { - // Assume the schema ones are OK anyway. It is done like this because these classes are not defined in tests. - return toRecord || classHasMethod(previousContext.targetType.getRecordReference(), getSourceMapping.asGet()); - } - - private boolean targetHasRequiredMethod() { - // Assume the schema ones are OK anyway. It is done like this because these classes are not defined in tests. - return !toRecord || classHasMethod(previousContext.targetType.getRecordReference(), setTargetMapping.asSet()); - } - - private boolean isSetterOptional() { - if (!previousContext.hasRecordReference) { - return false; - } - return setterAcceptsOptional( - previousContext.targetType.getRecordReference(), - setTargetMapping.asSet() - ); - } - - /** - * @return The object that should be used based on whether this mapper maps to or from a record. - */ - protected <O> O select(O obj0, O obj1) { - return toRecord ? obj0 : obj1; - } - - public static MapperContext createContext(GenerationField target, boolean toRecord, boolean mapsJavaRecord, ProcessedSchema schema) { - return new MapperContext(toRecord, mapsJavaRecord, false, false, schema).iterateContext(target); - } - - public static MapperContext createResolverContext(GenerationField target, boolean toRecord, ProcessedSchema schema) { - return new MapperContext(toRecord, false, false, true, schema).iterateContext(target); - } - - public static MapperContext createValidationContext(GenerationField target, ProcessedSchema schema) { - return new MapperContext(false, false, true, false, schema).iterateContext(target); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/context/NodeIdReferenceHelpers.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/context/NodeIdReferenceHelpers.java deleted file mode 100644 index ca4b1de90c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/context/NodeIdReferenceHelpers.java +++ /dev/null @@ -1,127 +0,0 @@ - -package no.sikt.graphitron.generators.context; - -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.helpers.NodeConfiguration; -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.definitions.interfaces.RecordObjectSpecification; -import no.sikt.graphitron.definitions.mapping.JOOQMapping; -import no.sikt.graphitron.mappings.TableReflection; -import no.sikt.graphql.schema.ProcessedSchema; -import org.jooq.Field; -import org.jooq.ForeignKey; - -import java.util.List; -import java.util.Optional; -import java.util.TreeMap; -import java.util.stream.IntStream; - -import static no.sikt.graphitron.mappings.TableReflection.findImplicitKey; -import static no.sikt.graphitron.mappings.TableReflection.getJavaFieldName; - -/** - * Utility methods for determining whether a {@literal @}nodeId field is a cross-table reference - * and resolving the foreign key and column mappings needed for the generated code. - */ -public class NodeIdReferenceHelpers { - - /** - * Determines whether a {@literal @}nodeId field is a reference. - * Returns {@code true} when the field has explicit {@literal @}reference directives, or when - * its node type's target table differs from {@code currentTable}. - * - * @param field the {@literal @}nodeId field - * @param schema the processed schema. - * @param currentTable the current table in which the field is currently being resolved, or {@code null} if unknown. - * @return {@code true} if the field references a node on a different table. - */ - public static boolean isNodeIdReferenceField(GenerationField field, ProcessedSchema schema, JOOQMapping currentTable) { - if (!schema.isNodeIdField(field)) { - return false; - } - if (field.hasFieldReferences()) { - return true; - } - return currentTable != null && !schema.getNodeConfigurationForNodeIdFieldOrThrow(field).targetTable().equals(currentTable); - } - - /** - * Determines whether a {@literal @}nodeId field is a reference by resolving the current table - * from the field's container type or its previous table object. - * - * @param objectField the {@literal @}nodeId object field - * @param schema the processed schema. - * @return {@code true} if the field references a node on a different table than its previous table. - * @see #isNodeIdReferenceField(GenerationField, ProcessedSchema, JOOQMapping) - */ - public static boolean isNodeIdReferenceField(ObjectField objectField, ProcessedSchema schema) { - var containerType = objectField.getContainerTypeName(); - var currentTable = schema.isObject(containerType) && schema.getObject(containerType).hasTable() - ? schema.getObject(containerType).getTable() - : Optional.ofNullable(schema.getPreviousTableObjectForField(objectField)) - .filter(RecordObjectSpecification::hasTable) - .map(RecordObjectSpecification::getTable) - .orElse(null); - return isNodeIdReferenceField(objectField, schema, currentTable); - } - - /** - * Returns the Java column names to use for a {@literal @}nodeId field given the current table context. - * For references, maps the node's key columns through the foreign key to the current table's columns. - * Returns the node configuration's key columns directly if the field is not a reference. - * - * @param field the field carrying the {@literal @}nodeId directive. - * @param schema the processed schema. - * @param currentTable the current table in which the field is currently being resolved, or {@code null} if unknown. - * @return ordered list of Java column names for the key fields. - */ - public static List<String> resolveColumnNamesForNodeIdField(GenerationField field, ProcessedSchema schema, JOOQMapping currentTable) { - if (isNodeIdReferenceField(field, schema, currentTable)) { - var foreignKey = findForeignKeyForNodeIdField(field, schema, currentTable) - .orElseThrow(() -> new RuntimeException("Cannot find foreign key for nodeId field " + field.formatPath())); - return mapKeyColumnsThroughForeignKey(currentTable, schema.getNodeConfigurationForNodeIdFieldOrThrow(field), foreignKey); - } - return schema.getNodeConfigurationForNodeIdFieldOrThrow(field).keyColumnsJavaNames(); - } - - /** - * Resolves the foreign key connecting {@code currentTable} to the node type's target table - * for a {@literal @}nodeId reference field. Returns empty if the field is not a reference. - * - * @param field the {@literal @}nodeId field - * @param schema the processed schema. - * @param currentTable the current table in which the field is currently being resolved, or {@code null} if unknown. - * @return the foreign key, or empty if the field is not a reference. - */ - public static Optional<ForeignKey<?,?>> findForeignKeyForNodeIdField(GenerationField field, ProcessedSchema schema, JOOQMapping currentTable) { - if (!isNodeIdReferenceField(field, schema, currentTable)) { - return Optional.empty(); - } - return resolveForeignKey(field, currentTable, schema.getNodeConfigurationForNodeIdFieldOrThrow(field).targetTable()); - } - - private static Optional<ForeignKey<?,?>> resolveForeignKey(GenerationField field, JOOQMapping previousTable, JOOQMapping targetTable) { - return field.getFieldReferences().stream() - .findFirst() - .map(fRef -> fRef.hasKey() - ? Optional.of(fRef.getKey().getName()) - : findImplicitKey(previousTable.getName(), fRef.getTable().getName())) - .orElseGet(() -> findImplicitKey(previousTable.getName(), targetTable.getName())) - .flatMap(TableReflection::getForeignKey); - } - - private static List<String> mapKeyColumnsThroughForeignKey(JOOQMapping currentTable, NodeConfiguration targetNodeConfiguration, ForeignKey<?,?> fk) { - var sourceColumns = fk.getFields(); - var targetColumns = fk.getInverseKey().getFields(); - - var mapping = new TreeMap<String, Field<?>>(String.CASE_INSENSITIVE_ORDER); - IntStream.range(0, sourceColumns.size()) - .forEach(i -> mapping.put(targetColumns.get(i).getName(), sourceColumns.get(i))); - - return targetNodeConfiguration.keyColumnsJavaNames().stream() - .map(it -> Optional.ofNullable(mapping.get(it)) - .orElseThrow(() -> new IllegalArgumentException("Node ID field " + it + " is not found in foreign key " + fk.getName() + "'s fields."))) - .map(it -> getJavaFieldName(currentTable.getName(), it.getName()).orElseThrow()) - .toList(); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/datafetchers/operations/ColumnFieldMapping.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/datafetchers/operations/ColumnFieldMapping.java deleted file mode 100644 index b2dd29f745..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/datafetchers/operations/ColumnFieldMapping.java +++ /dev/null @@ -1,25 +0,0 @@ -package no.sikt.graphitron.generators.datafetchers.operations; - -import no.sikt.graphitron.definitions.fields.InputField; - -/** - * Represents information about how to extract a column value from an input field. - * For nodeId fields, this includes the node type and index in the composite key. - * For regular fields, this is just the getter call. - */ -record FieldToColumnRecord( - InputField field, - boolean isNodeId, - String nodeTypeId, // Only set for nodeId fields - int columnIndex, // Index in the unpacked array for nodeId fields - String unpackedVarName, // Variable name for unpacked nodeId values - String columnName // The actual column name being mapped -) { - static FieldToColumnRecord forRegularField(InputField field, String columnName) { - return new FieldToColumnRecord(field, false, null, -1, null, columnName); - } - - static FieldToColumnRecord forNodeIdField(InputField field, String nodeTypeId, int columnIndex, String unpackedVarName, String columnName) { - return new FieldToColumnRecord(field, true, nodeTypeId, columnIndex, unpackedVarName, columnName); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/datafetchers/operations/FetchEntitiesMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/datafetchers/operations/FetchEntitiesMethodGenerator.java deleted file mode 100644 index a11c1b6d5e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/datafetchers/operations/FetchEntitiesMethodGenerator.java +++ /dev/null @@ -1,102 +0,0 @@ -package no.sikt.graphitron.generators.datafetchers.operations; - -import no.sikt.graphitron.definitions.fields.GenerationSourceField; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.generators.abstractions.DataFetcherMethodGenerator; -import no.sikt.graphitron.generators.codeinterface.wiring.WiringContainer; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.List; -import java.util.stream.Collectors; - -import static no.sikt.graphitron.configuration.GeneratorConfig.shouldMakeNodeStrategy; -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.*; -import static no.sikt.graphitron.generators.codebuilding.NameFormat.asEntitiesQueryName; -import static no.sikt.graphitron.generators.codebuilding.NameFormat.asQueryClass; -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.*; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.*; -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.inputPrefix; -import static no.sikt.graphql.naming.GraphQLReservedName.*; - -/** - * Generates resolver for the Query._entities. - */ -public class FetchEntitiesMethodGenerator extends DataFetcherMethodGenerator { - - public FetchEntitiesMethodGenerator(ObjectDefinition localObject, ProcessedSchema processedSchema) { - super(localObject, processedSchema); - } - - @Override - public MethodSpec generate(ObjectField target) { - var entitiesUnion = processedSchema.getUnion(FEDERATION_ENTITY_UNION.getName()); - var builder = getDefaultSpecBuilder(target.getName(), wrapFetcher(wrapFuture(wrapList(entitiesUnion.getGraphClassName())))); - dataFetcherWiring.add(new WiringContainer(target.getName(), getLocalObject().getName(), target.getName())); - - if (processedSchema.getEntities().isEmpty()) { - return builder.addCode(returnWrap(CodeBlock.of("$N -> return null", VAR_ENV))).build(); - } - - var typeNameToMethodMap = mapOfEntries( - indentIfMultiline( - processedSchema.getEntities() - .entrySet().stream() - .map(it -> - mapEntry(it.getKey(), methodCallForImplementation(it.getValue()))) - .collect(CodeBlock.joining(",\n")) - ) - ); - - var arguments = CodeBlock.builder() - .addIf(shouldMakeNodeStrategy(), "$L,\n", VAR_NODE_STRATEGY) - .add("$L,\n$L", inputPrefix(FEDERATION_REPRESENTATIONS_ARGUMENT.getName()), typeNameToMethodMap) - .build(); - - var methodCall = CodeBlock.statementOf( - "return $L.$L($L)", - newDataFetcher(), - "loadLookupEntities", - indentIfMultiline(arguments) - ); - - return builder - .beginControlFlow("return $N ->", VAR_ENV) - .addCode(extractParams(target)) - .addCode(declareAllServiceClasses(target.getName())) - .addCode(methodCall) - .endControlFlow("") // Keep this, logic to set semicolon only kicks in if a string is set. - .build(); - } - - private CodeBlock methodCallForImplementation(ObjectDefinition implementation) { - return CodeBlock.of( - "($L, $L, $L) -> $T.$L($L)", - VAR_CONTEXT, - VAR_REPS, - VAR_SELECTION_SET, - getQueryClassName(asQueryClass(implementation.getName())), - asEntitiesQueryName(implementation.getName()), - CodeBlock.of("$N, $L$N, $N", VAR_CONTEXT, CodeBlock.ofIf(shouldMakeNodeStrategy(), "$N, ", VAR_NODE_STRATEGY), VAR_REPS, VAR_SELECTION_SET) - ); - } - - @Override - public List<MethodSpec> generateAll() { - if (!processedSchema.isFederationImported()) { - return List.of(); - } - return localObject - .getFields() - .stream() - .filter(GenerationSourceField::isGenerated) - .filter(it -> getLocalObject().isOperationRoot()) - .filter(it -> it.getName().equals(FEDERATION_ENTITIES_FIELD.getName())) - .filter(it -> it.getTypeName().equals(FEDERATION_ENTITY_UNION.getName())) - .map(this::generate) - .filter(it -> !it.code().isEmpty()) - .collect(Collectors.toList()); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/datafetchers/operations/FetchNodeMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/datafetchers/operations/FetchNodeMethodGenerator.java deleted file mode 100644 index 41acc9ae2b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/datafetchers/operations/FetchNodeMethodGenerator.java +++ /dev/null @@ -1,137 +0,0 @@ -package no.sikt.graphitron.generators.datafetchers.operations; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.objects.AbstractObjectDefinition; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.generators.abstractions.DataFetcherMethodGenerator; -import no.sikt.graphitron.generators.codeinterface.wiring.WiringContainer; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.Comparator; -import java.util.List; -import java.util.stream.Collectors; - -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.*; -import static no.sikt.graphitron.generators.codebuilding.NameFormat.*; -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.wrapFetcher; -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.wrapFuture; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.*; -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.inputPrefix; -import static no.sikt.graphitron.mappings.JavaPoetClassName.ILLEGAL_ARGUMENT_EXCEPTION; -import static no.sikt.graphitron.mappings.JavaPoetClassName.NODE_ID_HANDLER; -import static no.sikt.graphql.naming.GraphQLReservedName.NODE_TYPE; - -/** - * Generates resolvers for the Node interface. - */ -public class FetchNodeMethodGenerator extends DataFetcherMethodGenerator { - private final ObjectDefinition localObject; - - public FetchNodeMethodGenerator(ObjectDefinition localObject, ProcessedSchema processedSchema) { - super(localObject, processedSchema); - this.localObject = localObject; - } - - @Override - public MethodSpec generate(ObjectField target) { - var inputField = target.getArguments().get(0); - var inputFieldName = inputField.getName(); - var prefixedInputFieldName = inputPrefix(inputFieldName); - - var interfaceDefinition = processedSchema.getInterface(target); - var implementations = processedSchema - .getObjects() - .values() - .stream() - .filter(it -> it.implementsInterface(interfaceDefinition.getName())) - .sorted(Comparator.comparing(AbstractObjectDefinition::getName)) - .toList(); - var anyImplementation = implementations.stream().findFirst(); - var targetBlock = CodeBlock.builder(); - if (anyImplementation.isPresent() && interfaceDefinition.getName().equals(NODE_TYPE.getName())) { // Node special case. - if (GeneratorConfig.shouldMakeNodeStrategy()) { - targetBlock.add("$N.getTypeId($N)", VAR_NODE_STRATEGY, prefixedInputFieldName); - } else { - targetBlock.add("$N.get($N.getTable($N).getName())", VAR_NODE_MAP, VAR_NODE_HANDLER, prefixedInputFieldName); - } - } else { - targetBlock.add("null"); - } - - var illegalBlock = CodeBlock.statementOf( - "throw new $T(\"Could not resolve input $N with value \" + $N + \" within type \" + $N)", - ILLEGAL_ARGUMENT_EXCEPTION.className, - inputFieldName, - prefixedInputFieldName, - GeneratorConfig.shouldMakeNodeStrategy() ? VAR_TYPE_ID : VAR_TYPE_NAME - ); - - dataFetcherWiring.add(new WiringContainer(target.getName(), getLocalObject().getName(), target.getName())); - - return getDefaultSpecBuilder(target.getName(), wrapFetcher(wrapFuture(interfaceDefinition.getGraphClassName()))) - .beginControlFlow("return $N ->", VAR_ENV) - .addCode(extractParams(target)) - .declare(GeneratorConfig.shouldMakeNodeStrategy() ? VAR_TYPE_ID : VAR_TYPE_NAME, targetBlock.build()) - .beginControlFlow("if ($N == null)", GeneratorConfig.shouldMakeNodeStrategy() ? VAR_TYPE_ID : VAR_TYPE_NAME) - .addCode(illegalBlock) - .endControlFlow() - .declare(VAR_LOADER, CodeBlock.of("$N + $S", GeneratorConfig.shouldMakeNodeStrategy() ? VAR_TYPE_ID : VAR_TYPE_NAME, "_" + target.getName())) - .declare(VAR_FETCHER_NAME, newDataFetcher()) - .addCode("\n") - .beginControlFlow("switch ($N)", GeneratorConfig.shouldMakeNodeStrategy() ? VAR_TYPE_ID : VAR_TYPE_NAME) - .addParameterIf( - !GeneratorConfig.shouldMakeNodeStrategy() && interfaceDefinition.getName().equals(NODE_TYPE.getName()), - NODE_ID_HANDLER.className, - VAR_NODE_HANDLER - ) - .addCode( - implementations - .stream() - .map(implementation -> codeForImplementation(implementation, prefixedInputFieldName)) - .collect(CodeBlock.joining()) - ) - .addCode("default: $L", illegalBlock) - .endControlFlow() - .endControlFlow("") // Keep this, logic to set semicolon only kicks in if a string is set. - .build(); - } - - private CodeBlock codeForImplementation(ObjectDefinition implementation, String inputFieldName) { - var implementationTypeName = implementation.getName(); - CodeBlock dbFunction = CodeBlock.of( - "($L, $L, $L) -> $T.$L($L)", - VAR_CONTEXT, - VAR_IDS, - VAR_SELECTION_SET, - getQueryClassName(asQueryClass(implementationTypeName)), - asNodeQueryName(implementationTypeName), - GeneratorConfig.shouldMakeNodeStrategy() ? - CodeBlock.of("$N, $N, $N, $N", VAR_CONTEXT, VAR_NODE_STRATEGY, VAR_IDS, VAR_SELECTION_SET) - : CodeBlock.of("$N, $N, $N", VAR_CONTEXT, VAR_IDS, VAR_SELECTION_SET) - ); - - String name; - if (GeneratorConfig.shouldMakeNodeStrategy()) { - name = processedSchema.getNodeConfigurationForTypeOrThrow(implementation).typeId(); - } else { - name = implementationTypeName; - } - - return CodeBlock.statementOf("case $S: return $N.$L($N, $N, $L)", name, VAR_FETCHER_NAME, "loadInterface", VAR_LOADER, inputFieldName, dbFunction); - } - - @Override - public List<MethodSpec> generateAll() { - return localObject - .getFields() - .stream() - .filter(ObjectField::isGeneratedWithResolver) - .filter(it -> processedSchema.isInterface(it.getTypeName()) && it.getTypeName().equals(NODE_TYPE.getName())) - .map(this::generate) - .filter(it -> !it.code().isEmpty()) - .collect(Collectors.toList()); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/datafetchers/operations/OperationClassGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/datafetchers/operations/OperationClassGenerator.java deleted file mode 100644 index 389ac3d43c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/datafetchers/operations/OperationClassGenerator.java +++ /dev/null @@ -1,115 +0,0 @@ -package no.sikt.graphitron.generators.datafetchers.operations; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.objects.AbstractObjectDefinition; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.generators.abstractions.DataFetcherClassGenerator; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.FieldSpec; -import no.sikt.graphitron.javapoet.ParameterizedTypeName; -import no.sikt.graphitron.javapoet.TypeSpec; -import no.sikt.graphql.schema.ProcessedSchema; - -import javax.lang.model.element.Modifier; -import java.util.Comparator; -import java.util.HashSet; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.indentIfMultiline; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_NODE_MAP; -import static no.sikt.graphitron.mappings.JavaPoetClassName.MAP; -import static no.sikt.graphitron.mappings.JavaPoetClassName.STRING; -import static no.sikt.graphql.naming.GraphQLReservedName.NODE_TYPE; - -/** - * Class generator for any data fetchers classes. - */ -public class OperationClassGenerator extends DataFetcherClassGenerator<ObjectDefinition> { - public static final String SAVE_DIRECTORY_NAME = "operations"; - - public OperationClassGenerator(ProcessedSchema processedSchema) { - super(processedSchema); - } - - @Override - public List<TypeSpec> generateAll() { - return processedSchema - .getObjects() - .values() - .stream() - .filter(ObjectDefinition::isGenerated) - .map(this::generate) - .filter(it -> !it.methodSpecs().isEmpty()) - .collect(Collectors.toList()); - } - - @Override - public TypeSpec generate(ObjectDefinition target) { - var generators = List.of( - new FetchEntitiesMethodGenerator(target, processedSchema), - new OperationMethodGenerator(target, processedSchema), - new FetchNodeMethodGenerator(target, processedSchema) - ); - var spec = getSpec(target.getName(), generators); - target - .getFields() - .stream() - .filter(it -> it.getTypeName().equals(NODE_TYPE.getName()) && !GeneratorConfig.shouldMakeNodeStrategy()) - .findFirst() - .flatMap(this::buildNodeMap) - .ifPresent(spec::addField); - var className = getGeneratedClassName(target.getName() + getFileNameSuffix()); - generators.forEach(it -> addFetchers(it.getDataFetcherWiring(), className)); - return spec.build(); - } - - protected Optional<FieldSpec> buildNodeMap(ObjectField target) { - var interfaceDefinition = processedSchema.getInterface(target); - var interfaceName = interfaceDefinition.getName(); - var seenTables = new HashSet<String>(); - var nodes = processedSchema - .getObjects() - .values() - .stream() - .filter(it -> it.implementsInterface(interfaceName)) - .sorted(Comparator.comparing(AbstractObjectDefinition::getName)) - .map(it -> { - var table = it.getTable(); - if (seenTables.contains(table.getMappingName())) { - return CodeBlock.empty(); // Can not handle having duplicate tables for nodes. - } - - seenTables.add(table.getMappingName()); - return CodeBlock.of( - "$T.entry($T.$N.getName(), $S)", - MAP.className, - table.getTableClass(), - table.getMappingName(), - it.getName() - ); - } - ) - .filter(it -> !it.isEmpty()) - .collect(CodeBlock.joining(",\n")); - - if (nodes.isEmpty()) { - return Optional.empty(); - } - - return Optional.of( - FieldSpec - .builder(ParameterizedTypeName.get(MAP.className, STRING.className, STRING.className), VAR_NODE_MAP) - .addModifiers(Modifier.PRIVATE, Modifier.FINAL, Modifier.STATIC) - .initializer(CodeBlock.of("$T.ofEntries($L)", MAP.className, indentIfMultiline(nodes))) - .build() - ); - } - - @Override - public String getDefaultSaveDirectoryName() { - return DataFetcherClassGenerator.DEFAULT_SAVE_DIRECTORY_NAME + "." + SAVE_DIRECTORY_NAME; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/datafetchers/operations/OperationMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/datafetchers/operations/OperationMethodGenerator.java deleted file mode 100644 index 51474fb0b5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/datafetchers/operations/OperationMethodGenerator.java +++ /dev/null @@ -1,686 +0,0 @@ -package no.sikt.graphitron.generators.datafetchers.operations; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.definitions.fields.AbstractField; -import no.sikt.graphitron.definitions.fields.ArgumentField; -import no.sikt.graphitron.definitions.fields.InputField; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.fields.containedtypes.MutationType; -import no.sikt.graphitron.definitions.interfaces.FieldSpecification; -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.definitions.interfaces.RecordObjectSpecification; -import no.sikt.graphitron.definitions.objects.InputDefinition; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.generators.abstractions.DataFetcherMethodGenerator; -import no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks; -import no.sikt.graphitron.generators.codebuilding.LookupHelpers; -import no.sikt.graphitron.generators.codebuilding.VariablePrefix; -import no.sikt.graphitron.generators.codeinterface.wiring.WiringContainer; -import no.sikt.graphitron.generators.context.InputParser; -import no.sikt.graphitron.generators.context.MapperContext; -import no.sikt.graphitron.generators.db.FetchTableRecordDBMethodGenerator; -import no.sikt.graphitron.javapoet.*; -import no.sikt.graphql.GraphitronContext; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Optional; - -import static no.sikt.graphitron.configuration.GeneratorConfig.*; -import static no.sikt.graphitron.configuration.Recursion.recursionCheck; -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.*; -import static no.sikt.graphitron.generators.codebuilding.NameFormat.*; -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.*; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.*; -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.*; -import static no.sikt.graphitron.generators.context.NodeIdReferenceHelpers.resolveColumnNamesForNodeIdField; -import static no.sikt.graphitron.generators.dto.DTOGenerator.getDTOGetterMethodNameForField; -import static no.sikt.graphitron.javapoet.CodeBlock.declare; -import static no.sikt.graphitron.javapoet.CodeBlock.ofVar; -import static no.sikt.graphitron.mappings.JavaPoetClassName.FUNCTION; -import static no.sikt.graphitron.mappings.JavaPoetClassName.RESOLVER_HELPERS; -import static no.sikt.graphitron.mappings.TableReflection.getRecordClass; -import static no.sikt.graphql.naming.GraphQLReservedName.*; -import static org.apache.commons.lang3.StringUtils.uncapitalize; - -/** - * This class generates the data fetchers for default fetch or mutation queries with potential arguments or pagination. - */ -public class OperationMethodGenerator extends DataFetcherMethodGenerator { - private static final String - RESPONSE_NAME = internalPrefix("response"), - TRANSFORMER_LAMBDA_NAME = internalPrefix("recordTransform"), - FETCHED_RECORDS_VAR_SUFFIX = "ForFetchRecords"; - - public OperationMethodGenerator(ObjectDefinition localObject, ProcessedSchema processedSchema) { - super(localObject, processedSchema); - } - - @Override - public MethodSpec generate(ObjectField target) { - var isMutationReturningData = processedSchema.isDeleteMutationWithReturning(target) || processedSchema.isInsertMutationWithReturning(target); - var isBatchStoreMutation = GeneratorConfig.generateUpsertAsStore() && target.hasMutationType() && target.getMutationType().equals(MutationType.UPSERT); - var parser = new InputParser(target, processedSchema); - var methodCall = getMethodCall(target, parser, false); // Note, do this before declaring services. - dataFetcherWiring.add(new WiringContainer(target.getName(), getLocalObject().getName(), target.getName())); - var builder = getDefaultSpecBuilder(target.getName(), wrapFetcher(wrapFuture(getReturnTypeName(target)))); - - return builder - .beginControlFlow("return $N ->", VAR_ENV) - .addCode(extractParams(target)) - .addCode(declareContextArgs(target)) - .addCode(transformInputs(target, parser, isBatchStoreMutation)) - .addCode(validateInputs(parser)) - .addCodeIf(isBatchStoreMutation, () -> fetchExistingRecordsAndPrepareForStore(parser)) - .addCode(declareAllServiceClasses(target.getName())) - .addCodeIf(!isMutationReturningData && localObject.getName().equals(SCHEMA_MUTATION.getName()), - () -> getMethodCall(target, parser, true)) - .addCode(methodCall) - .endControlFlow("") // Keep this, logic to set semicolon only kicks in if a string is set. - .build(); - } - - /** - * @return Code block that fetches existing records by primary key and prepares input records for store. - */ - private CodeBlock fetchExistingRecordsAndPrepareForStore(InputParser parser) { - var recordInput = parser.getJOOQRecords().entrySet().stream().findFirst().orElseThrow(); - var targetTable = processedSchema.getInputType(recordInput.getValue().getTypeName()).getTable(); - - var fetchedRecordsVariableName = inputPrefix(recordInput.getKey() + FETCHED_RECORDS_VAR_SUFFIX); - var fetchRecordsMethodName = FetchTableRecordDBMethodGenerator.getMethodName(getRecordClass(targetTable.getName()).orElseThrow().getSimpleName()); - - var fetchTableRecordsCall = CodeBlock.of("$L.$L($L, $L)", - asQueryClass(localObject.getName()), - fetchRecordsMethodName, - asMethodCall(VAR_TRANSFORMER, METHOD_CONTEXT_NAME), - !recordInput.getValue().isIterableWrapped() ? listOf(fetchedRecordsVariableName) : fetchedRecordsVariableName - ); - - return CodeBlock.builder() - .add(declare(internalPrefix("existingRecords"), fetchTableRecordsCall)) - .add(declare(inputPrefix(recordInput.getKey()), - "$T.prepareRecordsForStore($N, $N)", - RESOLVER_HELPERS.className, - internalPrefix("existingRecords"), - fetchedRecordsVariableName) - ) - .build(); - } - - protected CodeBlock getMethodCall(ObjectField target, InputParser parser, boolean isMutatingMethod) { - var isService = target.hasServiceReference(); - var hasLookup = !isService && LookupHelpers.lookupExists(target, processedSchema); - var isAutoFetch = isServiceReturningTable(target); - - var objectToCall = isService ? createServiceDependency(target).getName() : asQueryClass(localObject.getName()); - var methodName = isService ? target.getExternalMethod().getMethodName() : asQueryMethodName(target.getName(), localObject.getName()); - var isRoot = localObject.isOperationRoot(); - - // For service-returning-table, build a DB-targeting queryFunction (the service is called separately for key extraction). - var queryFunction = isAutoFetch - ? queryFunction(asQueryClass(localObject.getName()), asQueryMethodName(target.getName(), localObject.getName()), CodeBlocks.of(), true, true, false) - : queryFunction(objectToCall, methodName, parser.getMethodInputBlocks(true, true, true), !isRoot || hasLookup, !isRoot && !hasLookup, isService); - - if (hasLookup) { // Assume all keys are correlated. - return CodeBlock - .builder() - .declare(VAR_LOOKUP_KEYS, LookupHelpers.getLookupKeysAsList(target, processedSchema)) - .addStatement("return $L.$L($N, $L)", newDataFetcher(), "loadLookup", VAR_LOOKUP_KEYS, queryFunction) - .build(); - } - - // Service returning @table: call service, extract PK, then use standard DataFetcherHelper to batch-fetch from DB. - if (isAutoFetch) { - return serviceAutoFetchBlock(target, objectToCall, methodName, parser, queryFunction); - } - - if (processedSchema.isOrderedMultiKeyQuery(target)) { - return CodeBlock.statementOf( - "return $L.$L($L, $L)", - newDataFetcher(), - "loadByResolverKeys", - asMethodCall(sourcePrefix(localObject.getName()), getDTOGetterMethodNameForField(target)), - queryFunction - ); - } - - // If this method is the mutating method of a mutation. In other words, it is not the query that returns the final result. - if (!isMutatingMethod) { - return callQueryBlock(target, objectToCall, methodName, parser, queryFunction); - } - - if (isService) { - return CodeBlock.empty(); - } - - return CodeBlock.statementOf( - "$T.$L($L$L, $L)", - getQueryClassName(objectToCall), - methodName, - asMethodCall(VAR_TRANSFORMER, METHOD_CONTEXT_NAME), - CodeBlock.ofIf(shouldMakeNodeStrategy(), ", $N", VAR_NODE_STRATEGY), - parser.getMethodInputBlocks(true, true, true).join(", ") - ); - } - - private CodeBlock callQueryBlock(ObjectField target, String objectToCall, String method, InputParser parser, CodeBlock queryFunction) { - var innerCode = CodeBlocks - .create() - .addIf(!localObject.isOperationRoot(), asMethodCall(sourcePrefix(localObject.getName()), getDTOGetterMethodNameForField(target))) - .add(callQueryBlockInner(target, objectToCall, method, parser, queryFunction)) - .join(", "); - return returnWrap( - CodeBlock.methodCall( - target.hasServiceReference() ? newServiceDataFetcherWithTransform() : newDataFetcher(), - getFetcherMethodName(target, localObject), - indentIfMultiline(innerCode) - ) - ); - } - - private CodeBlock callQueryBlockInner(ObjectField target, String objectToCall, String method, InputParser parser, CodeBlock queryFunction) { - if (processedSchema.isDeleteMutationWithReturning(target) || processedSchema.isInsertMutationWithReturning(target)) { - return !processedSchema.inferDataTargetForMutation(target).map(target::equals).orElse(false) ? - CodeBlock.join(",\n", queryFunction, wrapMutationOutputFunction(target)) : queryFunction; - } - if (target.hasMutationType() && target.getMutationType().equals(MutationType.DELETE)) { - return CodeBlock.join(",\n", queryFunction, filterDeleteIDsFunction(target)); - } - - var object = processedSchema.getObjectOrConnectionNode(target); - var transformFunction = target.hasServiceReference() && object != null - ? transformOutputRecord(object.getName(), object.hasJavaRecordReference()) - : CodeBlock.empty(); - if (!target.hasRequiredPaginationFields()) { - return CodeBlock - .builder() - .addIf(!localObject.isOperationRoot(), "\n") - .add(CodeBlock.join(",\n", queryFunction, transformFunction)) - .build(); - } - - var params = CodeBlocks - .create() - .addVarIf(!target.hasServiceReference(), VAR_CONTEXT) - .addVarIf(GeneratorConfig.shouldMakeNodeStrategy(), VAR_NODE_STRATEGY) - .addVarIf(!localObject.isOperationRoot(), VAR_RESOLVER_KEYS) - .addAll(parser.getMethodInputBlocks(false, false, true)); - - var countFunction = CodeBlock.ofIf( - target.hasTotalCountFieldInReturnType(processedSchema), - () -> countFunction(objectToCall, method, params, target.hasServiceReference()) - ); - - return CodeBlock.join(",\n", CodeBlock.ofVar(VAR_PAGE_SIZE), queryFunction, countFunction, transformFunction); - } - - private boolean isServiceReturningTable(ObjectField target) { - return target.hasServiceReference() - && target.hasImplicitSplitQuery() - && processedSchema.hasTableObject(target); - } - - /** - * Generate code for service-returning-table auto-fetch. Calls the service, extracts the PK as a TableRecord, - * then uses the standard DataFetcherHelper to batch-fetch from DB. - */ - private CodeBlock serviceAutoFetchBlock(ObjectField target, String serviceName, String methodName, InputParser parser, CodeBlock dbFunction) { - var recordClassName = processedSchema.getRecordType(target).getRecordClassName(); - - var serviceCall = CodeBlock.of("$N.$L($L)", - servicePrefix(serviceName), methodName, - String.join(", ", parser.getMethodInputNames(true, true, true))); - - var isIterable = target.isIterableWrapped(); - var keyVarName = isIterable ? VAR_SERVICE_KEYS : VAR_SERVICE_KEY; - var toTableRecord = extractKeyAsTableRecordWithNullCheck(isIterable ? VAR_RECORD_ITERATOR : VAR_SERVICE_RESULT, recordClassName); - var keyValue = isIterable - ? CodeBlock.transformIfNotNull( - ofVar(VAR_SERVICE_RESULT), - CodeBlock.of("$N.stream().map($N -> $L)$L", VAR_SERVICE_RESULT, VAR_RECORD_ITERATOR, toTableRecord, collectToList())) - : toTableRecord; - - return CodeBlock.builder() - .declare(VAR_SERVICE_RESULT, serviceCall) - .declare(keyVarName, keyValue) - .addStatement( - "return $L.load$L($N, $L)", - newDataFetcher(), - CodeBlock.ofIf(isIterable, "ByResolverKeys"), - keyVarName, - dbFunction - ) - .build(); - } - - /** - * @return CodeBlock for the mapping of a record. - */ - private static CodeBlock transformOutputRecord(String typeName, boolean isJava) { - return CodeBlock.of( - "($L, $L) -> $L$L$S)", - TRANSFORMER_LAMBDA_NAME, - RESPONSE_NAME, - recordTransformPart(TRANSFORMER_LAMBDA_NAME, RESPONSE_NAME, typeName, isJava, false), - CodeBlock.ofIf(shouldMakeNodeStrategy(), "$N, ", VAR_NODE_STRATEGY), - "" - ); - } - - /** - * @return CodeBlock for wrapping output from mutations. Does not use recursion to check for arbitrarily deep nesting. - */ - private CodeBlock wrapMutationOutputFunction(ObjectField target) { - var isRecord = processedSchema.isRecordType(target); - if (!isRecord) return CodeBlock.empty(); - var recordType = processedSchema.getRecordType(target); - return CodeBlock.of("($1N) -> new $2T($1N)", VAR_RESULT, recordType.getGraphClassName()); - } - - /** - * @return CodeBlock for the filtering of IDs. Does not use recursion to check for arbitrarily deep nesting. - */ - private CodeBlock filterDeleteIDsFunction(ObjectField target) { - var isRecord = processedSchema.isRecordType(target); - var recordType = processedSchema.getRecordType(target); - var outputIDFieldOptional = isRecord - ? recordType.getFields().stream().filter(FieldSpecification::isID).findFirst() - : Optional.of(target); - - var argIDField = deduceIDInputFieldFromArgs(target); - GenerationField idContainerField, idField; - if (argIDField != null) { - idContainerField = null; - idField = argIDField; - } else { - idContainerField = deduceIDInputFieldType(target); - idField = idContainerField == null ? null : processedSchema - .getRecordType(idContainerField) - .getFields() - .stream() - .filter(FieldSpecification::isID) - .findFirst() - .orElseThrow(); // This will not happen, already checked in previous filter that this exists. - } - - if (outputIDFieldOptional.isEmpty() || idField == null || !outputIDFieldOptional.get().isID()) { - return CodeBlock.of("$L.identity()", FUNCTION.className); - } - - var outputIDField = outputIDFieldOptional.get(); - - var extraction = CodeBlock - .builder() - .add(VAR_RESULT) - .addIf(isRecord, outputIDField.getMappingFromSchemaName().asGetCall()); - - var filter = CodeBlock.builder(); - if (outputIDField.isIterableWrapped()) { - filter.add( - "$1L.stream().map($2L -> $2N$3L).filter($2L -> !$4L.contains($2N))$5L", - inputPrefix(idContainerField == null ? idField.getName() : idContainerField.getName()), - VAR_ITERATOR, - idField.getMappingFromSchemaName().asGetCall(), - extraction.build(), - collectToList() - ); - } else { - filter.add( - "$L == null ? $L : null", - extraction.build(), - idContainerField == null - ? inputPrefix(idField.getName()) - : CodeBlock.of("$N$L", inputPrefix(idContainerField.getName()), idField.getMappingFromSchemaName().asGetCall())); - } - - var reWrapping = CodeBlock.builder().add("($L) -> ", VAR_RESULT); - if (isRecord) { - return reWrapping.add("new $T($L)", recordType.getGraphClassName(), filter.build()).build(); - } - - return reWrapping.add(filter.build()).build(); - } - - private ArgumentField deduceIDInputFieldType(ObjectField target) { - return target - .getArguments() - .stream() - .filter(it -> - Optional - .of(processedSchema.getRecordType(it)) - .map(record -> record.getFields().stream().anyMatch(FieldSpecification::isID)) - .orElse(false) - ) - .findFirst() - .orElse(null); - } - - private ArgumentField deduceIDInputFieldFromArgs(ObjectField target) { - return target.getArguments().stream().filter(AbstractField::isID).findFirst().orElse(null); - } - - private String getFetcherMethodName(ObjectField target, RecordObjectSpecification<?> localObject) { - if (processedSchema.isDeleteMutationWithReturning(target) || processedSchema.isInsertMutationWithReturning(target)) { - return processedSchema.isObject(target) && !processedSchema.hasTableObject(target) ? "loadWrapped" : "load"; - } - - if (target.hasMutationType() && target.getMutationType().equals(MutationType.DELETE)) { - return "loadDelete"; - } - - if (!localObject.isOperationRoot() && target.isIterableWrapped() && target.isNonNullable()) { - return "loadNonNullable"; - } - - return target.hasForwardPagination() ? "loadPaginated" : "load"; - } - - /** - * @return CodeBlock for declaring the transformer class and calling it on each record input. - */ - private CodeBlock transformInputs(ObjectField field, InputParser parser, boolean isBatchStoreMutation) { - if (!parser.hasRecords()) { - if (field.hasServiceReference()) { - return declareTransform(); - } - - return CodeBlock.empty(); - } - - var code = CodeBlock - .builder() - .add(declareTransform()) - .add("\n"); - var recordCode = CodeBlock.builder(); - - var inputObjects = field.getNonReservedArguments().stream().filter(processedSchema::isInputType).toList(); - for (var in : inputObjects) { - var context = MapperContext.createResolverContext(in, true, processedSchema); - code.add(declareRecords(context, 0, isBatchStoreMutation)); - recordCode.add(unwrapRecords(context)); - } - - if (code.isEmpty() && recordCode.isEmpty()) { - return CodeBlock.empty(); - } - - return code - .add("\n") - .add(recordCode.build()) - .addIf(recordValidationEnabled(), "\n") - .addStatementIf(recordValidationEnabled(), asMethodCall(VAR_TRANSFORMER, METHOD_VALIDATE_NAME)) - .build(); - } - - private CodeBlock validateInputs(InputParser parser) { - if (!validateOverlappingInputFields()) { - return CodeBlock.empty(); - } - - var code = CodeBlock.builder(); - - for (InputField inputRecord : parser.getJOOQRecords().values()) { - var tableColumnToInputFieldMappings = new LinkedHashMap<String, List<FieldToColumnRecord>>(); - var type = processedSchema.getInputType(inputRecord); - var inputVarName = inputPrefix(uncapitalize(inputRecord.getName())); - var isListed = inputRecord.isIterableWrapped(); - var itemVarName = isListed ? namedIteratorPrefix(inputRecord.getName()) : inputVarName; - - for (InputField recordField : type.getFields()) { - if (processedSchema.isNodeIdField(recordField)) { - var nodeConfiguration = processedSchema.getNodeConfigurationForNodeIdFieldOrThrow(recordField); - var unpackedVarName = VariablePrefix.unpackedPrefix(recordField.getName()); - - var columns = resolveColumnNamesForNodeIdField(recordField, processedSchema, type.getTable()); - - for (int i = 0; i < columns.size(); i++) { - tableColumnToInputFieldMappings - .computeIfAbsent(columns.get(i), k -> new ArrayList<>()) - .add(FieldToColumnRecord.forNodeIdField(recordField, nodeConfiguration.typeId(), i, unpackedVarName, columns.get(i))); - } - } else { - String jooqColumn = recordField.getUpperCaseName(); - tableColumnToInputFieldMappings - .computeIfAbsent(jooqColumn, k -> new ArrayList<>()) - .add(FieldToColumnRecord.forRegularField(recordField, jooqColumn)); - } - } - - var overlappingColumns = tableColumnToInputFieldMappings.entrySet().stream() - .filter(e -> e.getValue().size() > 1) - .toList(); - - if (overlappingColumns.isEmpty()) { - continue; - } - - if (isListed) { - code.beginControlFlow("for (var $L : $N)", itemVarName, inputVarName); - } - - var nodeIdFieldsToUnpack = overlappingColumns.stream() - .flatMap(e -> e.getValue().stream()) - .filter(FieldToColumnRecord::isNodeId) - .map(FieldToColumnRecord::field) - .distinct() - .toList(); - - for (InputField nodeIdField : nodeIdFieldsToUnpack) { - var nodeConfiguration = processedSchema.getNodeConfigurationForNodeIdFieldOrThrow(nodeIdField); - var unpackedVarName = unpackedPrefix(nodeIdField.getName()); - - code.addStatement("var $N = $N.$L() != null ? $N.unpackIdValues($S, $N.$L(), $L) : null", - unpackedVarName, - itemVarName, - nodeIdField.getMappingFromSchemaName().asGet(), - VAR_NODE_STRATEGY, - nodeConfiguration.typeId(), - itemVarName, - nodeIdField.getMappingFromSchemaName().asGet(), - nodeConfiguration.nodeIdFieldsWithStaticTableInstanceBlock()); - } - - for (var entry : overlappingColumns) { - var mappings = entry.getValue(); - - // Build varargs call with alternating field names and value extraction expressions - var args = CodeBlock.builder(); - for (int i = 0; i < mappings.size(); i++) { - var mapping = mappings.get(i); - if (i > 0) { - args.add(",\n"); - } - args.add("$S, $L", mapping.field().getName(), getValueExtractionCode(mapping, itemVarName, type)); - } - - code.addStatement("$T.assertSameColumnValues(\n$L)", - RESOLVER_HELPERS.className, - args.build()); - } - - if (isListed) { - code.endControlFlow(); - } - } - - return code.build(); - } - - private CodeBlock getValueExtractionCode(FieldToColumnRecord mapping, String inputVarName, InputDefinition type) { - if (mapping.isNodeId()) { - // For nodeId fields, get the value from the unpacked array - return CodeBlock.of("$N != null ? $N.getFieldValue($L.$L, $N[$L]) : null", - mapping.unpackedVarName(), - VAR_NODE_STRATEGY, - FormatCodeBlocks.staticTableInstanceBlock(type.getTable().getName()), - mapping.columnName(), - mapping.unpackedVarName(), - mapping.columnIndex()); - } else { - // For regular fields, just get the value directly - return CodeBlock.of("$N.$L()", - inputVarName, - mapping.field().getMappingFromSchemaName().asGet()); - } - } - - private CodeBlock declareRecords(MapperContext context, int recursion, boolean isBatchStoreMutation) { - recursionCheck(recursion); - if (!context.targetIsType()) { - return CodeBlock.empty(); - } - - var target = context.getTarget(); - var baseName = inputPrefix(asListedRecordNameIf(target.getName(), context.isIterable())); - var variableName = baseName + (isBatchStoreMutation ? FETCHED_RECORDS_VAR_SUFFIX : ""); - var declareBlock = declare(variableName, context.transformInputRecord()); - if (context.hasJavaRecordReference()) { - return declareBlock; // If the input type is a Java record, no further records should be declared. - } - - var code = CodeBlock.builder(); - if (context.hasTable() && recursion == 0) { - code.add(declareBlock); - } else { - code.add(declareRecord(inputPrefix(asRecordName(target.getName())), context.getTargetType(), context.isIterable(), true)); - } - - code.addAll( - context - .getTargetType() - .getFields() - .stream() - .filter(processedSchema::isInputType) - .map(in -> declareRecords(context.iterateContext(in), recursion + 1, isBatchStoreMutation)) - .toList() - ); - - return code.build(); - } - - /** - * @return Code for setting the record data of previously defined records. - */ - private CodeBlock unwrapRecords(MapperContext context) { - if (context.hasJavaRecordReference()) { - return CodeBlock.empty(); - } - - var containedInputTypes = context.getTargetType() - .getInputsSortedByNullability() - .stream() - .filter(processedSchema::isInputType) - .filter(it -> processedSchema.hasRecord(it) || processedSchema.getInputType(it).getFields().stream().anyMatch(processedSchema::isInputType)) - .toList(); - - var fieldCode = CodeBlock.builder(); - for (var in : containedInputTypes) { - var innerContext = context.iterateContext(in); - fieldCode - .declare(inputPrefix(in.getName()), innerContext.getSourceGetCallBlock()) - .add(unwrapRecords(innerContext)); - } - - var code = CodeBlock.builder(); - var sourceName = context.getSourceName(); - if (context.hasTable() && !context.isTopLevelContext()) { - var record = context.transformInputRecord(); - if (!context.getPreviousContext().wasIterable()) { - code.assign(inputPrefix(asListedRecordNameIf(sourceName, context.isIterable())), record); - } else { - code.addStatement("$N.add$L($L)", inputPrefix(asListedRecordName(sourceName)), context.isIterable() ? "All" : "", record); - } - } - - var fields = context.getTargetType().getFields(); - if (fieldCode.isEmpty() || fields.stream().noneMatch(processedSchema::isInputType)) { - return code.build(); - } - - if (context.isIterable() && !(context.hasTable() && fields.stream().anyMatch(it -> it.isIterableWrapped() && processedSchema.isInputType(it)))) { - return code.build(); - } - - return code - .add(context.wrapFields(fieldCode.build())) - .apply(Wrappers.wrapNotNull(inputPrefix(sourceName))) - .build(); - } - - private CodeBlock declareContextArgs(ObjectField target) { - var contextFields = processedSchema.getAllContextFields(target); - if (contextFields.isEmpty()) { - return CodeBlock.empty(); - } - - var code = CodeBlock - .builder() - .declare(VAR_GRAPH_CONTEXT, asMethodCall(VAR_ENV, METHOD_GRAPH_CONTEXT)) - .declare(TypeName.get(GraphitronContext.class), VAR_GRAPHITRON_CONTEXT, CodeBlock.of("$N.get($S)", VAR_GRAPH_CONTEXT, GRAPHITRON_CONTEXT_NAME)); - - contextFields.forEach((name, type) -> code.declare(type, VariablePrefix.contextFieldPrefix(name), CodeBlock.of("$N.getContextArgument($L, $S)", VAR_GRAPHITRON_CONTEXT, VAR_ENV, name))); - return code.build(); - } - - protected TypeName getReturnTypeName(ObjectField referenceField) { - var typeName = getTypeName(referenceField); - if (referenceField.hasForwardPagination()) { - return wrapConnection(typeName); - } - - return wrapListIf(typeName, referenceField.isIterableWrapped()); - } - - private TypeName getTypeName(GenerationField field) { - if (processedSchema.isRecordType(field)) { - return processedSchema.getRecordType(field).getGraphClassName(); - } - if (processedSchema.isEnum(field)) { - return processedSchema.getEnum(field).getGraphClassName(); - } - return field.getTypeClass(); - } - - protected boolean generationCondition(GenerationField target) { - if (!target.isGeneratedWithResolver()) { - return false; - } - - if (processedSchema.isFederationService(target)) { - return false; - } - - if (processedSchema.isInterface(target) && target.getTypeName().equals(NODE_TYPE.getName())) { - return false; - } - - if (getLocalObject().isOperationRoot() && target.getName().equals(FEDERATION_ENTITIES_FIELD.getName()) && processedSchema.isFederationImported()) { - return false; - } - - if (target.hasServiceReference() && !localObject.getName().equals(SCHEMA_MUTATION.getName())) { - return !LookupHelpers.lookupExists((ObjectField) target, processedSchema); - } - - return true; - } - - @Override - public List<MethodSpec> generateAll() { - var localObject = getLocalObject(); - if (localObject == null || localObject.isExplicitlyNotGenerated()) { - return List.of(); - } - - return localObject - .getFields() - .stream() - .filter(this::generationCondition) - .map(this::generate) - .filter(it -> !it.code().isEmpty()) - .toList(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/datafetchers/typeresolvers/TypeNameMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/datafetchers/typeresolvers/TypeNameMethodGenerator.java deleted file mode 100644 index 7b12b131ce..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/datafetchers/typeresolvers/TypeNameMethodGenerator.java +++ /dev/null @@ -1,59 +0,0 @@ -package no.sikt.graphitron.generators.datafetchers.typeresolvers; - -import no.sikt.graphitron.definitions.interfaces.TypeResolverTarget; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.generators.abstractions.AbstractSchemaMethodGenerator; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphql.schema.ProcessedSchema; - -import javax.lang.model.element.Modifier; -import java.util.List; -import java.util.Optional; - -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.returnWrap; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_OBJECT; -import static no.sikt.graphitron.mappings.JavaPoetClassName.*; - -/** - * Class for generating the helper method for type resolvers. - */ -public class TypeNameMethodGenerator extends AbstractSchemaMethodGenerator<TypeResolverTarget, TypeResolverTarget> { - public static final String METHOD_NAME = "getName"; - - public TypeNameMethodGenerator(TypeResolverTarget localObject, ProcessedSchema processedSchema) { - super(localObject, processedSchema); - } - - @Override - public MethodSpec generate(TypeResolverTarget target) { - var components = getComponents(target).orElse(List.of()).stream().map(TypeNameMethodGenerator::ifStatement).collect(CodeBlock.joining("\n")); - return getDefaultSpecBuilder(METHOD_NAME, STRING.className) - .addModifiers(Modifier.STATIC) - .addParameter(OBJECT.className, VAR_OBJECT) - .addCode(components) - .addStatement("throw new $T(\"Type of \" + $N + \" can not be resolved.\")", ILLEGAL_ARGUMENT_EXCEPTION.className, VAR_OBJECT) - .build(); - } - - private Optional<List<ObjectDefinition>> getComponents(TypeResolverTarget target) { - if (processedSchema.isInterface(target.getName()) || processedSchema.isUnion(target.getName())) { - return processedSchema.getTypesFromInterfaceOrUnion(target.getName()); - } - return Optional.empty(); - } - - private static CodeBlock ifStatement(ObjectDefinition obj) { - return CodeBlock - .builder() - .beginControlFlow("if ($N instanceof $T)", VAR_OBJECT, obj.getGraphClassName()) - .add(returnWrap(CodeBlock.of("$S", obj.getName()))) - .endControlFlow() - .build(); - } - - public List<MethodSpec> generateAll() { - var localObject = getLocalObject(); - return localObject == null ? List.of() : List.of(generate(localObject)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/datafetchers/typeresolvers/TypeResolverClassGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/datafetchers/typeresolvers/TypeResolverClassGenerator.java deleted file mode 100644 index 702a7d758a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/datafetchers/typeresolvers/TypeResolverClassGenerator.java +++ /dev/null @@ -1,64 +0,0 @@ -package no.sikt.graphitron.generators.datafetchers.typeresolvers; - -import no.sikt.graphitron.definitions.interfaces.TypeResolverTarget; -import no.sikt.graphitron.generators.abstractions.AbstractSchemaClassGenerator; -import no.sikt.graphitron.generators.abstractions.DataFetcherClassGenerator; -import no.sikt.graphitron.generators.codeinterface.wiring.ClassWiringContainer; -import no.sikt.graphitron.generators.codeinterface.wiring.WiringContainer; -import no.sikt.graphitron.javapoet.ClassName; -import no.sikt.graphitron.javapoet.TypeSpec; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Stream; - -import static no.sikt.graphitron.generators.codeinterface.wiring.WiringContainer.asClassWiring; -import static no.sikt.graphql.naming.GraphQLReservedName.FEDERATION_ENTITY_UNION; - -/** - * Class generator for wrapping the entity resolver. - */ -public class TypeResolverClassGenerator extends AbstractSchemaClassGenerator<TypeResolverTarget> { - public static final String SAVE_DIRECTORY_NAME = "typeresolvers", FILE_NAME_SUFFIX = "TypeResolver"; - protected final List<ClassWiringContainer> typeWiringContainer = new ArrayList<>(); - - public TypeResolverClassGenerator(ProcessedSchema processedSchema) { - super(processedSchema); - } - - @Override - public TypeSpec generate(TypeResolverTarget target) { - var typeName = (target != null ? target.getName() : FEDERATION_ENTITY_UNION.getName()).replace("_", ""); - var resolverGenerator = new TypeResolverMethodGenerator(target, processedSchema); - var spec = getSpec(typeName, List.of(resolverGenerator, new TypeNameMethodGenerator(target, processedSchema))).build(); - var className = getGeneratedClassName(typeName + getFileNameSuffix()); - addTypeResolvers(resolverGenerator.getTypeResolverWiring(), className); - return spec; - } - - @Override - public String getDefaultSaveDirectoryName() { - return DataFetcherClassGenerator.DEFAULT_SAVE_DIRECTORY_NAME + "." + SAVE_DIRECTORY_NAME; - } - - @Override - public String getFileNameSuffix() { - return FILE_NAME_SUFFIX; - } - - public List<TypeSpec> generateAll() { - return Stream - .concat(processedSchema.getInterfaces().values().stream(), processedSchema.getUnions().values().stream()) - .map(this::generate) - .toList(); - } - - public List<ClassWiringContainer> getGeneratedTypeResolvers() { - return typeWiringContainer; - } - - protected void addTypeResolvers(List<WiringContainer> containers, ClassName className) { - typeWiringContainer.addAll(asClassWiring(containers, className)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/datafetchers/typeresolvers/TypeResolverMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/datafetchers/typeresolvers/TypeResolverMethodGenerator.java deleted file mode 100644 index 9ce2a2c38d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/datafetchers/typeresolvers/TypeResolverMethodGenerator.java +++ /dev/null @@ -1,46 +0,0 @@ -package no.sikt.graphitron.generators.datafetchers.typeresolvers; - -import no.sikt.graphitron.definitions.interfaces.TypeResolverTarget; -import no.sikt.graphitron.generators.abstractions.AbstractSchemaMethodGenerator; -import no.sikt.graphitron.generators.codeinterface.wiring.WiringContainer; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphql.schema.ProcessedSchema; - -import javax.lang.model.element.Modifier; -import java.util.ArrayList; -import java.util.List; - -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.returnWrap; -import static no.sikt.graphitron.generators.codebuilding.NameFormat.asTypeResolverMethodName; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_ENV; -import static no.sikt.graphitron.mappings.JavaPoetClassName.TYPE_RESOLVER; - -/** - * Class for generating any type resolvers. - */ -public class TypeResolverMethodGenerator extends AbstractSchemaMethodGenerator<TypeResolverTarget, TypeResolverTarget> { - protected final List<WiringContainer> typeResolverWiring = new ArrayList<>(); - - public TypeResolverMethodGenerator(TypeResolverTarget localObject, ProcessedSchema processedSchema) { - super(localObject, processedSchema); - } - - @Override - public MethodSpec generate(TypeResolverTarget target) { - typeResolverWiring.add(new WiringContainer(asTypeResolverMethodName(target.getName()), target.getName(), null, false)); - return getDefaultSpecBuilder(asTypeResolverMethodName(target.getName()), TYPE_RESOLVER.className) - .addModifiers(Modifier.STATIC) - .addCode(returnWrap(CodeBlock.of("$1L -> $1N.getSchema().getObjectType($2N($1N.getObject()))", VAR_ENV, TypeNameMethodGenerator.METHOD_NAME))) - .build(); - } - - public List<MethodSpec> generateAll() { - return List.of(generate(getLocalObject())); - } - - @Override - public List<WiringContainer> getTypeResolverWiring() { - return typeResolverWiring; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/BatchUpdateDBMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/BatchUpdateDBMethodGenerator.java deleted file mode 100644 index 29e0e6bd1e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/BatchUpdateDBMethodGenerator.java +++ /dev/null @@ -1,146 +0,0 @@ -package no.sikt.graphitron.generators.db; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.definitions.fields.InputField; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.fields.containedtypes.MutationType; -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.generators.abstractions.DBMethodGenerator; -import no.sikt.graphitron.generators.codebuilding.VariableNames; -import no.sikt.graphitron.generators.context.InputParser; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphitron.javapoet.TypeName; -import no.sikt.graphql.directives.GenerationDirective; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.stream.Collectors; - -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.returnWrap; -import static no.sikt.graphitron.generators.codebuilding.NameFormat.asQueryMethodName; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_ITERATOR; -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.inputPrefix; -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.internalPrefix; -import static no.sikt.graphitron.mappings.JavaPoetClassName.*; - -/** - * Generator that creates the default data mutation methods. - */ -public class BatchUpdateDBMethodGenerator extends DBMethodGenerator<ObjectField> { - private static String batchMethodName(MutationType type) { - return switch (type) { - case UPDATE -> "batchUpdate"; - case DELETE -> "batchDelete"; - case INSERT -> "batchInsert"; - case UPSERT -> GeneratorConfig.generateUpsertAsStore() ? "batchStore" : "batchMerge"; - }; - } - - private static final String VARIABLE_RECORD_LIST = internalPrefix("recordList"), CONFIG = internalPrefix("config"); - - public BatchUpdateDBMethodGenerator(ObjectDefinition localObject, ProcessedSchema processedSchema) { - super(localObject, processedSchema); - } - - /** - * @param target A {@link ObjectField} for which a mutation method should be generated for. - * This must reference a field located within the Mutation type and with the - * "{@link GenerationDirective#MUTATION mutationType}" directive set. - * @return The complete javapoet {@link MethodSpec} based on the provided reference field. - */ - @Override - public MethodSpec generate(ObjectField target) { - var recordMethod = batchMethodName(target.getMutationType()); - if (recordMethod == null) { - return MethodSpec.methodBuilder(target.getName()).build(); - } - - var parser = new InputParser(target, processedSchema); - var spec = getDefaultSpecBuilder(asQueryMethodName(target.getName(), getLocalObject().getName()), TypeName.INT) - .addParameters(parser.getMethodParameterSpecs(true, false, false)); - - var recordInputs = parser.getJOOQRecords(); - if (recordInputs.isEmpty()) { - return spec.addCode(returnWrap("0")).build(); - } - - var code = CodeBlock.builder(); - String batchInputVariable; - if (recordInputs.size() == 1) { - batchInputVariable = inputPrefix(recordInputs.keySet().stream().findFirst().get()); - } else { - batchInputVariable = VARIABLE_RECORD_LIST; - code.declareNew(VARIABLE_RECORD_LIST, ARRAY_LIST.className); - recordInputs.forEach((name, type) -> code.addStatement("$N.$L($N)", VARIABLE_RECORD_LIST, type.isIterableWrapped() ? "addAll" : "add", inputPrefix(name))); - } - - if (target.hasMutationType() && target.getMutationType() == MutationType.UPSERT && !GeneratorConfig.generateUpsertAsStore()) { - recordInputs.entrySet().stream() - .map(it -> findNodeIdInJooqRecordInputTypes(it.getKey(), it.getValue())) - .filter(Optional::isPresent) - .map(Optional::get) - .findFirst() - .ifPresent(it -> { - var recordInputName = inputPrefix(it.getKey()); - var nodeConfiguration = processedSchema.getNodeConfigurationForNodeIdFieldOrThrow(it.getValue()); - var isIterable = recordInputs.get(it.getKey()).isIterableWrapped(); - var variableName = isIterable ? VAR_ITERATOR : recordInputName; - - code.beginControlFlowIf(isIterable, "$N.forEach($N ->", recordInputName, VAR_ITERATOR) - .indentIf(isIterable); - - nodeConfiguration.keyColumnsJavaNames() - .forEach(columnName -> code.addStatement("$N.changed($N.$N, true)", variableName, nodeConfiguration.targetTable().getName(), columnName)); - - code.unindentIf(isIterable) - .endControlFlowIf(isIterable) - .addStatementIf(isIterable, ")"); - }); - } - - code.addStatement( - "return $N.transactionResult($L -> $T.stream($T.using($N).$L($N).execute()).sum())", - VariableNames.VAR_CONTEXT, - CONFIG, - ARRAYS.className, - DSL.className, - CONFIG, - recordMethod, - batchInputVariable - ); - - return spec - .addCode(code.build()) - .build(); - } - - @Override - public List<MethodSpec> generateAll() { - var localObject = getLocalObject(); - if (localObject.isExplicitlyNotGenerated()) { - return List.of(); - } - return localObject - .getFields() - .stream() - .filter(ObjectField::isGeneratedWithResolver) - .filter(ObjectField::hasMutationType) - .filter(it -> !processedSchema.isDeleteMutationWithReturning(it)) - .filter(it -> !processedSchema.isInsertMutationWithReturning(it)) - .map(this::generate) - .filter(it -> !it.code().isEmpty()) - .collect(Collectors.toList()); - } - - private Optional<Map.Entry<String, GenerationField>> findNodeIdInJooqRecordInputTypes(String key, InputField field) { - return processedSchema.getInputType(field.getTypeName()) - .getFields().stream() - .filter(processedSchema::isNodeIdField) - .findFirst() - .map(it -> Map.entry(key, it)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/DBClassGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/DBClassGenerator.java deleted file mode 100644 index 59f8355db3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/DBClassGenerator.java +++ /dev/null @@ -1,157 +0,0 @@ -package no.sikt.graphitron.generators.db; - -import no.sikt.graphitron.configuration.CodeGenerationThresholds; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.generators.abstractions.AbstractSchemaClassGenerator; -import no.sikt.graphitron.generators.abstractions.MethodGenerator; -import no.sikt.graphitron.javapoet.JavaFile; -import no.sikt.graphitron.javapoet.TypeSpec; -import no.sikt.graphitron.mappings.TableReflection; -import no.sikt.graphitron.validation.CodeGenerationThresholdEvaluator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; -import java.io.IOException; -import java.util.HashSet; -import java.util.List; -import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; - -import static no.sikt.graphql.naming.GraphQLReservedName.NODE_TYPE; - -/** - * Class generator that keeps track of all method generators for DB queries. - */ -public class DBClassGenerator extends AbstractSchemaClassGenerator<ObjectDefinition> { - public static final String DEFAULT_SAVE_DIRECTORY_NAME = "queries", FILE_NAME_SUFFIX = "DBQueries"; - protected final Set<ObjectField> objectFieldsReturningNode; - static final Logger LOGGER = LoggerFactory.getLogger(DBClassGenerator.class); - - public DBClassGenerator(ProcessedSchema processedSchema) { - super(processedSchema); - - objectFieldsReturningNode = processedSchema - .getObjects() - .values() - .stream() - .filter(ObjectDefinition::isGeneratedWithResolver) - .map(ObjectDefinition::getFields) - .flatMap(List::stream) - .filter(ObjectField::isGenerated) - .filter(processedSchema::isInterface) - .filter(it -> processedSchema.getInterface(it).getName().equals(NODE_TYPE.getName())) - .collect(Collectors.toSet()); - } - - @Override - public List<TypeSpec> generateAll() { - return processedSchema - .getObjects() - .values() - .stream() - .filter(Objects::nonNull) - .filter(it -> it.isGeneratedWithResolver() || it.isEntity() || (!objectFieldsReturningNode.isEmpty())) - .map(this::generate) - .filter(it -> !it.methodSpecs().isEmpty()) - .collect(Collectors.toList()); - } - - @Override - public TypeSpec generate(ObjectDefinition target) { - TypeSpec typeSpec = getSpec( - target.getName(), - List.of( - new FetchMappedObjectDBMethodGenerator(target, processedSchema), - new FetchCountDBMethodGenerator(target, processedSchema), - new FetchNodeImplementationDBMethodGenerator(target, processedSchema, objectFieldsReturningNode), - new FetchMultiTableDBMethodGenerator(target, processedSchema), - new FetchSingleTableInterfaceDBMethodGenerator(target, processedSchema), - new FetchEntityImplementationDBMethodGenerator(target, processedSchema), - new BatchUpdateDBMethodGenerator(target, processedSchema), - new UpdateWithReturningDBMethodGenerator(target, processedSchema), - new ServiceResultFetchDBMethodGenerator(target, processedSchema), - new SelectHelperDBMethodGenerator(target, processedSchema), - new NodeSelectHelperDBMethodGenerator(target, processedSchema, objectFieldsReturningNode), - new EntitySelectHelperDBMethodGenerator(target, processedSchema), - new FetchTableRecordDBMethodGenerator(target, processedSchema) - ) - ).build(); - warnOrCrashIfMethodsExceedsBounds(typeSpec); - return typeSpec; - } - - @Override - public String getDefaultSaveDirectoryName() { - return DEFAULT_SAVE_DIRECTORY_NAME; - } - - @Override - public TypeSpec.Builder getSpec(String className, List<? extends MethodGenerator> generators) { - var spec = super.getSpec(className, generators); - setDependencies(generators, spec); - return spec; - } - - protected Set<Class<?>> getStaticImports() { - return new HashSet<>(TableReflection.getClassFromSchemas("Tables")); - } - - @Override - public void writeToFile(TypeSpec generatedClass, String path, String packagePath, String directoryOverride) { - var fileBuilder = JavaFile - .builder(packagePath + "." + directoryOverride, generatedClass) - .indent(" "); - - getStaticImports().forEach(it -> fileBuilder.addStaticImport(it, "*")); - - var file = fileBuilder.build(); - try { - file.writeTo(new File(path)); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public String writeToString(TypeSpec generatedClass) { - var fileBuilder = JavaFile.builder("", generatedClass).indent(" "); - getStaticImports().forEach(it -> fileBuilder.addStaticImport(it, "*")); - return fileBuilder.build().toString(); - } - - @Override - public String getFileNameSuffix() { - return FILE_NAME_SUFFIX; - } - - protected void warnOrCrashIfMethodsExceedsBounds(TypeSpec typeSpec) { - - CodeGenerationThresholds codeGenerationThresholds = GeneratorConfig.getCodeGenerationThresholds(); - if (codeGenerationThresholds == null) return; - var codeGenerationThresholdEvaluator = new CodeGenerationThresholdEvaluator( - codeGenerationThresholds, - typeSpec - ); - var upperBoundMessages = codeGenerationThresholdEvaluator.getUpperBoundMessages(); - var crashPointMessages = codeGenerationThresholdEvaluator.getCrashPointMessages(); - - if (!upperBoundMessages.isEmpty()) { - LOGGER.warn( - "Code generation upper bound has exceeded for the following methods, this may cause performance issues:\n{}", - String.join("\n", upperBoundMessages) - ); - } - - if (!crashPointMessages.isEmpty()) { - throw new IllegalArgumentException( - "Code generation crash point has exceeded for the following methods:\n" - + String.join("\n", crashPointMessages) - ); - } - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/EntitySelectHelperDBMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/EntitySelectHelperDBMethodGenerator.java deleted file mode 100644 index 82fd369e5c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/EntitySelectHelperDBMethodGenerator.java +++ /dev/null @@ -1,36 +0,0 @@ -package no.sikt.graphitron.generators.db; - -import no.sikt.graphitron.definitions.fields.VirtualSourceField; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.List; -import java.util.stream.Stream; - -import static no.sikt.graphql.naming.GraphQLReservedName.FEDERATION_ENTITY_UNION; - -/** - * Generator that creates the data fetching methods for entity implementations, e.g. queries used by the federation entity resolver. - */ -public class EntitySelectHelperDBMethodGenerator extends NestedFetchDBMethodGenerator { - - public EntitySelectHelperDBMethodGenerator( - ObjectDefinition localObject, - ProcessedSchema processedSchema - ) { - super(localObject, processedSchema); - } - - @Override - public List<MethodSpec> generateAll() { - if (!processedSchema.federationEntitiesExist() || !getLocalObject().isEntity()) { - return List.of(); - } - - var field = new VirtualSourceField(getLocalObject(), FEDERATION_ENTITY_UNION.getName()); - var top = Stream.of(generate(field)); - var nested = generateNested(field).stream(); - return Stream.concat(top, nested).toList(); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/FetchCountDBMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/FetchCountDBMethodGenerator.java deleted file mode 100644 index 089308c7b8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/FetchCountDBMethodGenerator.java +++ /dev/null @@ -1,166 +0,0 @@ -package no.sikt.graphitron.generators.db; - -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.fields.VirtualSourceField; -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.definitions.mapping.AliasWrapper; -import no.sikt.graphitron.definitions.objects.AbstractObjectDefinition; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.generators.context.FetchContext; -import no.sikt.graphitron.generators.context.InputParser; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphql.directives.GenerationDirective; -import no.sikt.graphql.schema.ProcessedSchema; -import org.jetbrains.annotations.NotNull; - -import java.util.LinkedHashSet; -import java.util.List; -import java.util.stream.Collectors; - -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.*; -import static no.sikt.graphitron.generators.codebuilding.KeyWrapper.getKeyTableRecordTypeName; -import static no.sikt.graphitron.generators.codebuilding.NameFormat.asCountMethodName; -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.wrapMap; -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.wrapSet; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_CONTEXT; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_RECORD_ITERATOR; -import static no.sikt.graphitron.mappings.JavaPoetClassName.*; - -/** - * Generator that creates methods for counting all available elements for a type. - */ -public class FetchCountDBMethodGenerator extends FetchDBMethodGenerator { - - public static final String UNION_COUNT_QUERY = "unionCountQuery"; - public static final String COUNT_FIELD_NAME = "$count"; - - public FetchCountDBMethodGenerator(ObjectDefinition localObject, ProcessedSchema processedSchema) { - super(localObject, processedSchema); - } - - /** - * @param target A {@link ObjectField} for which a method should be generated for. - * This must reference an object with the - * "{@link GenerationDirective#TABLE table}" directive set. - * @return The complete javapoet {@link MethodSpec} based on the provided reference field. - */ - @Override - public MethodSpec generate(ObjectField target) { - var parser = new InputParser(target, processedSchema); - if (processedSchema.isMultiTableInterface(target.getTypeName()) || processedSchema.isUnion(target.getTypeName())) { - return getSpecBuilder(target, parser) - .addCode(getCodeForMultitableCountMethod(target)) - .build(); - } - var context = new FetchContext(processedSchema, target, getLocalObject(), true); - var targetSource = context.renderQuerySource(getLocalTable()); - var where = formatWhereContents(context, target.createsDataFetcher()); - var nextContext = target.createsDataFetcher() ? context.nextContext(target) : context; - return getSpecBuilder(target, parser) - .addCode(declareAllServiceClassesInAliasSet(nextContext.getAliasSet())) - .addCode(createAliasDeclarations(nextContext.getAliasSet())) - .addCode("return $N\n", VAR_CONTEXT) - .indent() - .indent() - .addCode(".select(") - .addCodeIf(!isRoot(),() -> CodeBlock.of("$L, ", resolverKeyAsTableRecord(context))) - .addCode("$T.count())\n", DSL.className) - .addCode(".from($L)\n", targetSource) - .addCode(createSelectJoins(nextContext.getJoinSet())) - .addCode(where) - .addCode(createSelectConditions(nextContext.getConditionList(), !where.isEmpty())) - .addCodeIf(!isRoot(),() -> CodeBlock.of(".groupBy($L)\n", commaSeparatedResolverKeyFields(context))) - .addStatementIf(isRoot(), ".fetchOne(0, $T.class)", INTEGER.className) - .addStatementIf(!isRoot(), ".fetchMap($1T::value1, $1T::value2)", RECORD2.className) - .unindent() - .unindent() - .build(); - } - - private CodeBlock getCodeForMultitableCountMethod(ObjectField target) { - var implementations = processedSchema.getTypesFromInterfaceOrUnion(target.getTypeName()).orElse(List.of()); - - var aliasSet = new LinkedHashSet<AliasWrapper>(); - var codeForImplementations = CodeBlock.builder(); - - implementations.forEach(implementation -> { - var virtualTarget = new VirtualSourceField(implementation, target); - var context = new FetchContext(processedSchema, virtualTarget, localObject, true); - var refContext = virtualTarget.createsDataFetcher() ? context.nextContext(virtualTarget) : context; - var where = formatWhereContents(context, target.createsDataFetcher()); - var countForImplementation = CodeBlock.builder() - .add("$T.select(", DSL.className) - .addIf(!isRoot(), () -> CodeBlock.of("$L)", resolverKeyAsTableRecord(context))) - .addIf(isRoot(), "$T.count().as($S))", DSL.className, COUNT_FIELD_NAME) - .add("\n.from($L)\n", context.getTargetAlias()) - .add(createSelectJoins(refContext.getJoinSet())) - .add(where) - .add(createSelectConditions(context.getConditionList(), !where.isEmpty())); - - aliasSet.addAll(refContext.getAliasSet()); - codeForImplementations.declare(getCountVariableName(implementation.getName()), countForImplementation.build()); - }); - - var code = CodeBlock.builder() - .add(createAliasDeclarations(aliasSet)) - .add(codeForImplementations.build()); - - var resolverKey = implementations.stream() - .findFirst() - .map(it -> new FetchContext(processedSchema, new VirtualSourceField(it, target), localObject, true)) - .map(FetchContext::getResolverKey); - - var unionQuery = implementations.stream() - .map(AbstractObjectDefinition::getName) - .reduce("", (currString, element) -> - String.format(currString.isEmpty() ? "%s" : "%s\n.unionAll(%s)", getCountVariableName(element), currString)); - - return code - .declare(UNION_COUNT_QUERY, "$L\n.asTable()", unionQuery) - .add("\nreturn $N.select(", VAR_CONTEXT) - .addIf(!isRoot(),() -> CodeBlock.of("$N.field(0), $T.count())", UNION_COUNT_QUERY, DSL.className)) - .addIf(isRoot(), "$T.sum($N.field($S, $T.class)))", DSL.className, UNION_COUNT_QUERY, COUNT_FIELD_NAME, INTEGER.className) - .add("\n.from($N)", UNION_COUNT_QUERY) - .addStatementIf(isRoot(), "\n.fetchOne(0, $T.class)", INTEGER.className) - .addIf(!isRoot(), "\n.groupBy($N.field(0))", UNION_COUNT_QUERY) - .addStatementIf( - !isRoot() && resolverKey.isPresent(), - () -> CodeBlock.of( - "\n.fetchMap($1L -> (($2T) $1N.value1()), $3T::value2)", - VAR_RECORD_ITERATOR, - resolverKey.get().getTypeName(), - RECORD2.className - ) - ) - .build(); - } - - private static String getCountVariableName(String implementationName) { - return String.format("count%s", implementationName); - } - - @NotNull - private MethodSpec.Builder getSpecBuilder(ObjectField referenceField, InputParser parser) { - return getDefaultSpecBuilder( - asCountMethodName(referenceField.getName(), getLocalObject().getName()), - isRoot() ? INTEGER.className : wrapMap(getKeyTableRecordTypeName(referenceField, processedSchema), INTEGER.className) - ) - .addParameterIf(!isRoot(), () -> wrapSet(getKeyTableRecordTypeName(referenceField, processedSchema)), resolverKeyParamName) - .addParameters(parser.getMethodParameterSpecs(false, false, true)); - } - - @Override - public List<MethodSpec> generateAll() { - return getLocalObject() - .getFields() - .stream() - .filter(GenerationField::isGeneratedWithResolver) - .filter(ObjectField::hasRequiredPaginationFields) - .filter(it -> it.hasTotalCountFieldInReturnType(processedSchema)) - .filter(it -> !it.hasServiceReference()) - .map(this::generate) - .filter(it -> !it.code().isEmpty()) - .collect(Collectors.toList()); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/FetchDBMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/FetchDBMethodGenerator.java deleted file mode 100644 index 6a02a224e6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/FetchDBMethodGenerator.java +++ /dev/null @@ -1,1419 +0,0 @@ -package no.sikt.graphitron.generators.db; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.definitions.fields.*; -import no.sikt.graphitron.definitions.helpers.InputComponents; -import no.sikt.graphitron.definitions.helpers.InputCondition; -import no.sikt.graphitron.definitions.helpers.ProcedureCall; -import no.sikt.graphitron.definitions.interfaces.FieldSpecification; -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.definitions.interfaces.RecordObjectSpecification; -import no.sikt.graphitron.definitions.mapping.AliasWrapper; -import no.sikt.graphitron.definitions.mapping.JOOQMapping; -import no.sikt.graphitron.definitions.mapping.MethodMapping; -import no.sikt.graphitron.definitions.objects.InterfaceDefinition; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.definitions.sql.SQLCondition; -import no.sikt.graphitron.definitions.sql.SQLJoinStatement; -import no.sikt.graphitron.generators.abstractions.DBMethodGenerator; -import no.sikt.graphitron.generators.codebuilding.KeyWrapper; -import no.sikt.graphitron.generators.codebuilding.LookupHelpers; -import no.sikt.graphitron.generators.context.FetchContext; -import no.sikt.graphitron.generators.context.InputParser; -import no.sikt.graphitron.javapoet.*; -import no.sikt.graphitron.validation.ValidationHandler; -import no.sikt.graphql.naming.GraphQLReservedName; -import no.sikt.graphql.schema.ProcessedSchema; -import org.jetbrains.annotations.NotNull; -import org.jooq.Named; - -import java.util.*; -import java.util.regex.Pattern; -import java.util.stream.Collectors; -import java.util.stream.IntStream; -import java.util.stream.Stream; - -import static no.sikt.graphitron.configuration.GeneratorConfig.*; -import static no.sikt.graphitron.configuration.Recursion.recursionCheck; -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.*; -import static no.sikt.graphitron.generators.codebuilding.KeyWrapper.getKeySetForResolverFields; -import static no.sikt.graphitron.generators.codebuilding.KeyWrapper.getKeyTableRecordTypeName; -import static no.sikt.graphitron.generators.codebuilding.NameFormat.*; -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.*; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.*; -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.*; -import static no.sikt.graphitron.generators.context.NodeIdReferenceHelpers.isNodeIdReferenceField; -import static no.sikt.graphitron.generators.context.NodeIdReferenceHelpers.resolveColumnNamesForNodeIdField; -import static no.sikt.graphitron.generators.dto.DTOGenerator.getDTOGetterMethodNameForField; -import static no.sikt.graphitron.mappings.JavaPoetClassName.*; -import static no.sikt.graphitron.mappings.ReflectionHelpers.methodExpectsTableRecordParamAtIndex; -import static no.sikt.graphitron.mappings.RoutineReflection.*; -import static no.sikt.graphitron.mappings.TableReflection.*; -import static org.apache.commons.lang3.StringUtils.uncapitalize; - -/** - * Abstract generator for various database fetching methods. - */ -public abstract class FetchDBMethodGenerator extends DBMethodGenerator<ObjectField> { - protected static final String ELEMENT_NAME = internalPrefix("e"); - protected final String resolverKeyParamName; - protected final boolean conditionsShouldFallbackToFalse; // This will eventually apply to all generated mutations - private static final int MAX_NUMBER_OF_FIELDS_SUPPORTED_WITH_TYPE_SAFETY = 22; - - public FetchDBMethodGenerator(ObjectDefinition localObject, ProcessedSchema processedSchema, boolean conditionsShouldFallbackToFalse) { - super(localObject, processedSchema); - resolverKeyParamName = resolverKeyPrefix(localObject.getName()); - this.conditionsShouldFallbackToFalse = conditionsShouldFallbackToFalse; - } - - public FetchDBMethodGenerator(ObjectDefinition localObject, ProcessedSchema processedSchema) { - this(localObject, processedSchema, false); - } - - protected boolean isRoot() { - return getLocalObject().isOperationRoot(); - } - - protected CodeBlock getInitialKey(FetchContext context) { - var code = CodeBlock.builder(); - - var ref = (ObjectField) context.getReferenceObjectField(); - var table = context.renderQuerySource(getLocalTable()); - if (LookupHelpers.lookupExists(ref, processedSchema)) { - var concatBlock = LookupHelpers.getLookUpKeysAsColumnList(ref, table, processedSchema); - if (concatBlock.toString().contains(".inline(")) { - code.add("$T.concat($L),\n", DSL.className, concatBlock); - } else { - code.add(concatBlock).add(",\n"); - } - } else if (!isRoot()) { - code.add("$L,\n", resolverKeyAsTableRecord(context)); - } - return code.build(); - } - - /** - * @param joinList List of join statements that should be applied to a select query. - * @return Code block containing all the join statements and their conditions. - */ - protected CodeBlock createSelectJoins(Set<SQLJoinStatement> joinList) { - return createSelectJoins(joinList, false); - } - - /** - * @param joinList List of join statements that should be applied to a select query. - * @param skipFirstJoin Whether to skip the first join statement. Used in multitable resolver queries where - * the first join is implicit via .from(keyPath), unless it's a condition reference. - * @return Code block containing all the join statements and their conditions. - */ - protected CodeBlock createSelectJoins(Set<SQLJoinStatement> joinList, boolean skipFirstJoin) { - var codeBuilder = CodeBlock.builder(); - var iterator = joinList.iterator(); - if (skipFirstJoin && iterator.hasNext()) iterator.next(); - iterator.forEachRemaining(join -> codeBuilder.add(join.toJoinString())); - return codeBuilder.build(); - } - - /** - * @param conditionList List of conditional statements that should be appended after the where-statement. - * @return Code block which declares all the extra conditions that will be used in a select query. - */ - protected CodeBlock createSelectConditions(List<CodeBlock> conditionList, boolean hasWhere) { - var code = CodeBlock.builder(); - for (var condition : conditionList) { - code.add(".$L($L)\n", hasWhere ? "and" : "where", condition); - hasWhere = true; - } - return code.build(); - } - - /** - * @param aliasSet Set of aliases to be defined. - * @return Code block which declares all the aliases that will be used in a select query. - */ - protected static CodeBlock createAliasDeclarations(Set<AliasWrapper> aliasSet) { - return createAliasDeclarations(aliasSet, false); - } - - /** - * @param aliasSet Set of aliases to be defined. - * @param skipFirstAlias Whether to skip the first alias declaration. Used in multitable resolver queries where - * the source table alias is already declared in the main method and passed to the helper methods. - * @return Code block which declares all the aliases that will be used in a select query. - */ - protected static CodeBlock createAliasDeclarations(Set<AliasWrapper> aliasSet, boolean skipFirstAlias) { - var codeBuilder = CodeBlock.builder(); - var aliasIterator = aliasSet.iterator(); - if (skipFirstAlias && aliasIterator.hasNext()) aliasIterator.next(); - - aliasIterator.forEachRemaining(aliasWrapper -> { - var alias = aliasWrapper.getAlias(); - CodeBlock tableWithAlias = CodeBlock.of("$N.as($S)", alias.getVariableValue(), alias.getCodeName()); - if (!aliasWrapper.hasTableMethod()) { - codeBuilder.declare(alias.getMappingName(), tableWithAlias); - } else { - var params = new LinkedList<CodeBlock>(); - params.add(tableWithAlias); - aliasWrapper.getInputNames().stream().map(CodeBlock::of).forEach(params::add); - - codeBuilder.declare( - alias.getMappingName(), - invokeExternalMethod( - CodeBlock.of("$N", servicePrefix(aliasWrapper.getTableMethod().getClassName().simpleName())), - aliasWrapper.getTableMethod().getMethodName(), - CodeBlock.join(", ", params) - ) - ); - - } - }); - return codeBuilder.build(); - } - - protected CodeBlock generateCorrelatedSubquery(FetchContext context) { - var field = context.getReferenceObjectField(); - var isConnection = ((ObjectField) field).hasForwardPagination(); - var isMultiset = field.isIterableWrapped() || isConnection; - var orderByFieldsBlock = field.createsDataFetcher() && tableHasPrimaryKey(context.getTargetTableName()) - ? CodeBlock.of(VAR_ORDER_FIELDS) - : createOrderFieldsBlock((ObjectField) field, context.getTargetAlias(), context.getTargetTableName()); - var shouldBeOrdered = isMultiset && !orderByFieldsBlock.isEmpty(); - var shouldHaveOrderByToken = isConnection && !orderByFieldsBlock.isEmpty(); - - CodeBlock.Builder select = CodeBlock.builder(); - select.addIf(shouldHaveOrderByToken, "\n$T.getOrderByToken($L, $L),\n", QUERY_HELPER.className, context.getTargetAlias(), orderByFieldsBlock); - - if (context.getReferenceObject() == null || field.hasNodeID()) { - select.add(generateForField(field, context)); - } else { - // Allow subclasses to use helper methods for record types - var helperMethodCall = getHelperMethodCallForNestedField((ObjectField) field, context); - if (helperMethodCall != null) { - select.add(helperMethodCall); - } else { - select.add(generateSelectRow(context)); - } - } - - var where = formatWhereContents(context, false); - var joins = createSelectJoins(context.getJoinSet()); - - var contents = CodeBlock.builder() - .add("$T.select($L)", DSL.className, indentIfMultiline(select.build())) - .add("\n.from($L)\n", context.getSourceAlias()) - .add(joins) - .add(where) - .add(createSelectConditions(context.getConditionList(), !where.isEmpty())) - .addIf(shouldBeOrdered, ".orderBy($L)", orderByFieldsBlock) - .addIf(isConnection, this::createSeekAndLimitBlock) - .build(); - - if (field.createsDataFetcher()) { - return isMultiset ? wrapInMultiset(contents) : wrapInField(contents); - } - - contents = isMultiset ? wrapInMultisetWithMapping(contents, shouldHaveOrderByToken) : wrapInField(contents); - - return optionalSelectOnSubqueriesIsEnabled() - ? wrapSelectIfRequested(context.getGraphPath(field), indentIfMultiline(contents)) - : contents; - } - - /** - * Generates a helper method call for nested record type fields. - * This base implementation generates the root-level helper method call. - * - * @param field The field to generate the helper method call for - * @param context The fetch context (unused in base implementation) - * @return CodeBlock containing the helper method call, or null to use inline generation - */ - protected CodeBlock getHelperMethodCallForNestedField(ObjectField field, FetchContext context) { - var helperMethodName = generateHelperMethodName(field); - - var parameters = new ArrayList<String>(); - if (GeneratorConfig.shouldMakeNodeStrategy()) { - parameters.add(VAR_NODE_STRATEGY); - } - parameters.addAll(new InputParser(field, processedSchema).getContextFieldNames()); - if (optionalSelectIsEnabled()) parameters.add(VAR_SELECT); - - return CodeBlock.of("$L($L)", helperMethodName, String.join(", ", parameters)); - } - - private CodeBlock wrapInMultisetWithMapping(CodeBlock contents, boolean hasOrderByToken) { - return CodeBlock.of( - "$L.mapping($L -> $N.map($T::value$L))", - wrapRow(wrapInMultiset(contents)), - ELEMENT_NAME, - ELEMENT_NAME, - hasOrderByToken ? RECORD2.className : RECORD1.className, - hasOrderByToken ? "2" : "1" - ); - } - - protected CodeBlock wrapInMultiset(CodeBlock contents) { - return CodeBlock.of("$T.multiset($L)", DSL.className, indentIfMultiline(contents)); - } - - protected CodeBlock wrapInField(CodeBlock contents) { - return CodeBlock.of("$T.field($L)", DSL.className, indentIfMultiline(contents)); - } - - /** - * This method recursively generates one single row method call. - * It deduces how each layer of row call should be structured by keeping track of joins and following field references. - * @return Code block which contains the entire recursive structure of the row statement. - */ - protected CodeBlock generateSelectRow(FetchContext context) { - var fields = context - .getReferenceObject() - .getFields() - .stream() - .filter(it -> !processedSchema.isExceptionOrExceptionUnion(it)) - .filter(f -> !(f.createsDataFetcher() && processedSchema.isRecordType(f))) - .toList(); - - var rowElements = new ArrayList<CodeBlock>(); - var keySet = new LinkedHashSet<KeyWrapper>(); - - if (context.getReferenceObjectField() instanceof ObjectField objectField && objectField.hasSelectConstruct()) { - var constructMap = objectField.getSelectConstruct().values(); - fields.forEach(field -> rowElements.add( - Optional.ofNullable(constructMap.get(field.getName())) - .map(it -> generateForField(field, context, it.toUpperCase())) - .orElse(inline(asCast(TypeName.OBJECT, CodeBlock.of("null")))) - )); - } else { - keySet.addAll(getKeySetForResolverFields(context.getReferenceObject().getFields(), processedSchema)); - var table = context.getTargetTableName(); - var alias = context.getTargetAlias(); - keySet.forEach(key -> rowElements.add(keyAsTableRecordWithQueryHelper(key.key(), table, alias))); - fields.forEach(field -> rowElements.add(getSelectCode(field, context))); - } - - return createMapping(context, fields, rowElements, keySet); - } - - protected CodeBlock getSelectCode(GenerationField field, FetchContext context) { - var outerCall = context.getReferenceObjectField().getProcedureCall(); - if (outerCall != null && outerCall.hasTarget() && field.getName().equals(outerCall.targetField())) { - return generateProcedureCall(context, outerCall); - } - - if (processedSchema.invokesSubquery(field, context.getTargetTable())) { - return generateCorrelatedSubquery(context.nextContext(field)); - } - - if (processedSchema.isObject(field)) { - return generateSelectRow(context.nextContext(field)); - } - - if (field.isExternalField()) { - return getExternalBlock(field, context); - } - - if (field.hasProcedureCall()) { - return generateProcedureCall(context, field.getProcedureCall()); - } - - return generateForField(field, context); - } - - /** - * Generates a static method call to the generated jOOQ {@code Routines} class for a field annotated with - * {@code @experimental_procedureCall}. Arguments are materialized in the routine's declared IN-parameter order. - */ - protected CodeBlock generateProcedureCall(FetchContext context, ProcedureCall call) { - var matches = resolveRoutine(call.procedureName()); - if (matches.size() != 1) { - throw new IllegalStateException("Routine '" + call.procedureName() + "' could not be resolved. Validation should have caught this."); - } - var routineName = matches.get(0); - var routinesClass = ClassName.bestGuess(getRoutinesClassName(routineName).orElseThrow()); - var methodName = getRoutineMethodName(routineName).orElseThrow(); - - var isTargetMode = call.hasTarget(); - var renderedSource = context.renderQuerySource(getLocalTable()); - var argBlocks = getInParameters(routineName) - .stream() - .map(Named::getName) - .map(it -> call.argumentMap().get(it)) - .map(it -> isTargetMode ? inputPrefix(it) : it.toUpperCase()) - .collect(CodeBlocks.varCollector()) - .map(it -> isTargetMode ? it : CodeBlock.join(".", renderedSource, it)); - - return getProcedureCall(routinesClass, methodName, argBlocks); - } - - protected CodeBlock getProcedureCall(TypeName routinesClass, String method, CodeBlocks args) { - return CodeBlock.methodCall(routinesClass, method, args); - } - - private CodeBlock getExternalBlock(GenerationField field, FetchContext context) { - JOOQMapping table = context.getTargetTable(); - - if (table == null) { - throw new IllegalArgumentException("No table found for field " + field.getName()); - } - - var externalFieldCode = CodeBlock.of( - "$L.$L($L)", - getImportReferenceOfValidExtensionMethod(field, table.getName()), - field.getName(), - context.getTargetAlias()); - - return optionalSelectOnExternalFieldsIsEnabled() - ? wrapSelectIfRequested(context.getGraphPath(field), externalFieldCode) - : externalFieldCode; - } - - private static String getImportReferenceOfValidExtensionMethod(GenerationField field, String tableName) { - var imports = GeneratorConfig.getExternalReferenceImports(); - - Optional<String> reference = imports.stream() - .filter(it -> getMethodFromReference(it, tableName, field.getName()).isPresent()) - .findFirst(); - - if (reference.isEmpty()) { - throw new IllegalArgumentException("No method found for field " + field.getName() + " in table " + tableName); - } - - return reference.get(); - } - - private CodeBlock createMapping(FetchContext context, List<? extends GenerationField> fieldsWithoutSplitting, List<CodeBlock> rowElements, LinkedHashSet<KeyWrapper> keySet) { - boolean maxTypeSafeFieldSizeIsExceeded = fieldsWithoutSplitting.size() + keySet.size() > MAX_NUMBER_OF_FIELDS_SUPPORTED_WITH_TYPE_SAFETY; - - CodeBlock regularMappingFunction = context.shouldUseEnhancedNullOnAllNullCheck() - ? createMappingFunctionWithEnhancedNullSafety(fieldsWithoutSplitting, context.getReferenceObject().getGraphClassName(), maxTypeSafeFieldSizeIsExceeded, keySet.size()) - : createMappingFunction(context, fieldsWithoutSplitting, maxTypeSafeFieldSizeIsExceeded); - - var mappingContent = maxTypeSafeFieldSizeIsExceeded - ? wrapWithExplicitMapping(regularMappingFunction, context, fieldsWithoutSplitting, keySet) - : regularMappingFunction; - - return CodeBlock - .builder() - .add(wrapRow(CodeBlock.join(",\n", rowElements))) - .addIf(!mappingContent.isEmpty(), ".mapping($L)", mappingContent) - .build(); - } - - private CodeBlock createMappingFunction(FetchContext context, List<? extends GenerationField> fieldsWithoutTable, boolean maxTypeSafeFieldSizeIsExceeded) { - boolean hasIdField = fieldsWithoutTable.stream().anyMatch(GenerationField::isID); - boolean hasNullableField = fieldsWithoutTable.stream().anyMatch(GenerationField::isNullable); - - boolean canReturnNonNullableObjectWithAllFieldsNull = hasNullableField && context.getReferenceObjectField().isNonNullable() && !hasIdField; - - var className = context.getReferenceObject().getGraphClassName(); - if (canReturnNonNullableObjectWithAllFieldsNull) { - context.setParentContextShouldUseEnhancedNullOnAllNullCheck(); - return CodeBlock.of(maxTypeSafeFieldSizeIsExceeded ? "new $T(\n" : "$T::new", className); - } - - if (fieldsWithoutTable.stream().anyMatch(objectField -> processedSchema.isUnion(objectField.getTypeName()))) { - return createMappingWithUnion(context, fieldsWithoutTable); - } - - if (maxTypeSafeFieldSizeIsExceeded) { - return listedNullCheck(VAR_RECORD_ITERATOR, CodeBlock.of("new $T(\n", className)); - } - - // Made this obscure case because compilation failed on the type safety for some of these. No clue as to why. - var listedFieldWithoutTableIsPresent = context - .getReferenceObject() - .getFields() - .stream() - .filter(f -> !(f.createsDataFetcher() && processedSchema.isRecordType(f))) - .anyMatch(FieldSpecification::isIterableWrapped); - - if (!context.hasPreviousContext() && !context.hasApplicableTable() && listedFieldWithoutTableIsPresent) { - return CodeBlock.of("$T.nullOnAllNull(($L) -> new $T($N))", FUNCTIONS.className, VAR_ITERATOR, className, VAR_ITERATOR); - } - - return CodeBlock.of("$T.nullOnAllNull($T::new)", FUNCTIONS.className, className); - } - - private CodeBlock createMappingWithUnion(FetchContext context, List<? extends GenerationField> fieldsWithoutTable) { - var codeBlockArguments = CodeBlock.builder(); - var codeBlockConstructor = CodeBlock.builder(); - for (var mappingIndex = 0; mappingIndex < fieldsWithoutTable.size(); mappingIndex++) { - var field = fieldsWithoutTable.get(mappingIndex); - var typeName = field.getTypeName(); - var isLastField = (mappingIndex == fieldsWithoutTable.size()-1); - if (processedSchema.isUnion(typeName)) { - codeBlockArguments.add(unionFieldArguments(typeName, mappingIndex, isLastField)); - codeBlockConstructor.add(unionFieldConstructor(typeName, mappingIndex, isLastField)); - } else { - var currentAlias = CodeBlock.of("$L$L$L", ELEMENT_NAME, mappingIndex, (isLastField ? "" : ", ")); - codeBlockArguments.add(currentAlias); - codeBlockConstructor.add(currentAlias); - } - } - - return CodeBlock.of("($L) -> new $L($L)", codeBlockArguments.build(), context.getReferenceObjectField().getTypeName(), codeBlockConstructor.build()); - } - - private CodeBlock unionFieldArguments(String typeName, int fieldIndex, boolean isLastField) { - var codeBlockArguments = CodeBlock.builder(); - var unionFieldTypeNames = processedSchema.getUnion(typeName).getFieldTypeNames(); - for (var i = 0; i < unionFieldTypeNames.size(); i++) { - codeBlockArguments.add("$L$L_$L", ELEMENT_NAME, fieldIndex, i); - codeBlockArguments.addIf(i + 1 < unionFieldTypeNames.size(), ", "); - } - - codeBlockArguments.addIf(!isLastField, ", "); - return codeBlockArguments.build(); - } - - private CodeBlock unionFieldConstructor(String typeName, int fieldIndex, boolean isLastField) { - var codeBlockConstructor = CodeBlock.builder(); - var unionFieldTypeNames = processedSchema.getUnion(typeName).getFieldTypeNames(); - for (var i = 0; i < unionFieldTypeNames.size(); i++) { - var currentAlias = CodeBlock.of("$L$L_$L", ELEMENT_NAME, fieldIndex, i); - if (i + 1 < unionFieldTypeNames.size()) { - codeBlockConstructor.add("$L != null ? $L : ", currentAlias, currentAlias); - } else { - codeBlockConstructor.add(currentAlias); - } - } - codeBlockConstructor.addIf(!isLastField, ", "); - return codeBlockConstructor.build(); - } - - private CodeBlock unionFieldCondition(String typeName, int fieldIndex, boolean isLastField) { - var codeBlockConditions = CodeBlock.builder(); - var unionFieldTypeNames = processedSchema.getUnion(typeName).getFieldTypeNames(); - for (var i = 0; i < unionFieldTypeNames.size(); i++) { - codeBlockConditions.add("$L$L_$L != null", ELEMENT_NAME, fieldIndex, i); - codeBlockConditions.addIf(i + 1 < unionFieldTypeNames.size(), " && "); - } - codeBlockConditions.addIf(!isLastField, " && "); - return codeBlockConditions.build(); - } - - private CodeBlock createMappingFunctionWithEnhancedNullSafety(List<? extends GenerationField> fieldsWithoutTable, TypeName graphClassName, boolean maxTypeSafeFieldSizeIsExceeded, int keyCount) { - var codeBlockArguments = CodeBlock.builder(); - var codeBlockConditions = CodeBlock.builder(); - var codeBlockConstructor = CodeBlock.builder(); - - var useMemberConstructor = false; - - codeBlockArguments.add("("); - codeBlockConstructor.add("("); - - for (int i = 0; i < fieldsWithoutTable.size() + keyCount; i++) { - var field = i < keyCount ? null : fieldsWithoutTable.get(i - keyCount); - var isLastField = (i == fieldsWithoutTable.size() + keyCount - 1); - - if (field != null && processedSchema.isUnion(field.getTypeName())) { - useMemberConstructor = true; - codeBlockArguments.add(unionFieldArguments(field.getTypeName(), i, isLastField)); - codeBlockConstructor.add(unionFieldConstructor(field.getTypeName(), i, isLastField)); - codeBlockConditions.add(unionFieldCondition(field.getTypeName(), i, isLastField)); - continue; - } - - CodeBlock argumentName; - if (maxTypeSafeFieldSizeIsExceeded) { - argumentName = CodeBlock.of("$N[$L]", VAR_RECORD_ITERATOR, i); - } else { - argumentName = CodeBlock.of("$L$L", ELEMENT_NAME, i); - codeBlockArguments.add(argumentName); - codeBlockArguments.add(isLastField ? ")" : ", "); - } - - codeBlockConstructor - .add(argumentName) - .add(isLastField ? ")" : ", "); - - if (field != null && processedSchema.isObject(field)) { - codeBlockConditions.add("($L == null || new $T().equals($L))", argumentName, processedSchema.getObject(field).getGraphClassName(), argumentName); - } else { - codeBlockConditions.add("$L == null", argumentName); - } - codeBlockConditions.add(isLastField ? "" : " && "); - } - - if (maxTypeSafeFieldSizeIsExceeded) { - return CodeBlock.of("$L ? null : new $T(\n", codeBlockConditions.build(), graphClassName); - } - - return CodeBlock.builder() - .add(codeBlockArguments.build()) - .add(" -> ") - .add(codeBlockConditions.build()) - .add(" ? null : new $T", graphClassName) - .add((useMemberConstructor) ? codeBlockConstructor.build() : codeBlockArguments.build()) - .build(); - } - - /** - * Used when fields size exceeds {@link #MAX_NUMBER_OF_FIELDS_SUPPORTED_WITH_TYPE_SAFETY}. This - * requires the mapping function to be wrapped with explicit mapping, without type safety. - */ - private CodeBlock wrapWithExplicitMapping(CodeBlock mappingFunction, FetchContext context, List<? extends GenerationField> fieldsWithoutTable, LinkedHashSet<KeyWrapper> keySet) { - var innerMappingCode = CodeBlocks.create(); - - int keyIndex = 0; - for (var key : keySet) { - innerMappingCode.add("($T) $N[$L]", key.getTypeName(), VAR_RECORD_ITERATOR, keyIndex); - keyIndex++; - } - - for (int i = keySet.size(), f = 0; f < fieldsWithoutTable.size(); i++, f++) { - innerMappingCode.add(wrapMapping(context, fieldsWithoutTable.get(f), i)); - } - - return CodeBlock.of( - "$T.class, $L ->$L", - context.getReferenceObject().getGraphClassName(), - VAR_RECORD_ITERATOR, - indentIfMultiline(CodeBlock.join(mappingFunction, indentIfMultiline(innerMappingCode.join(",\n")), CodeBlock.of("\n)"))) - ); - } - - private CodeBlock wrapMapping(FetchContext context, GenerationField field, int i) { - if (processedSchema.isObject(field)) { - var typeName = field.isIterableWrapped() - ? ParameterizedTypeName.get(LIST.className, processedSchema.getObject(field).getGraphClassName()) - : processedSchema.getObject(field).getGraphClassName(); - return CodeBlock.of("($T) $N[$L]", typeName, VAR_RECORD_ITERATOR, i); - } - - if (field.isExternalField()) { - JOOQMapping table = processedSchema.getObject(field.getContainerTypeName()).getTable(); - - if (table == null) { - throw new IllegalArgumentException("No table found for field " + field.getName()); - } - - return CodeBlock.of( - "$L.$L($L).getDataType().convert($N[$L])", - getImportReferenceOfValidExtensionMethod(field, table.getName()), - field.getName(), - context.getTargetAlias(), - VAR_RECORD_ITERATOR, - i - ); - } - - if (field.isID()) { - return CodeBlock.of("($T) $N[$L]", STRING.className, VAR_RECORD_ITERATOR, i); - } - - if (processedSchema.isEnum(field)) { - var enumDefinition = processedSchema.getEnum(field); - return CodeBlock.of("($T) $N[$L]", enumDefinition.getGraphClassName(), VAR_RECORD_ITERATOR, i); - } - - if (field.isIterableWrapped() && isArrayField(context.getTargetTable().getName(), field.getUpperCaseName())) { - return CodeBlock.of("($T) $N[$L]", LIST.className, VAR_RECORD_ITERATOR, i); - } - - return CodeBlock.of( - "$L.$N.getDataType().convert($N[$L])", - field.hasFieldReferences() ? context.nextContext(field).renderQuerySource(getLocalTable()) : context.renderQuerySource(getLocalTable()), - field.getUpperCaseName(), - VAR_RECORD_ITERATOR, - i - ); - } - - /** - * Generate a single argument in the row method call. - */ - protected CodeBlock generateForField(GenerationField field, FetchContext context) { - return generateForField(field, context, false); - } - - /** - * Generate a single argument in the row method call. - */ - protected CodeBlock generateForField(GenerationField field, FetchContext context, boolean overrideEnum) { - return generateForField(field, context, overrideEnum, field.getUpperCaseName()); - } - - /** - * Generate a single argument in the row method call, with an explicit column name override. - * Used by construct type generation to map inner fields to columns on the parent table. - */ - private CodeBlock generateForField(GenerationField field, FetchContext context, String columnName) { - return generateForField(field, context, false, columnName); - } - - private CodeBlock generateForField(GenerationField field, FetchContext context, boolean overrideEnum, String columnName) { - if (processedSchema.isUnion(field)) { - return generateForUnionField(field, context); - } - - if (processedSchema.isNodeIdField(field)) { - return createNodeIdBlock(processedSchema.getNodeConfigurationForNodeIdFieldOrThrow(field), context.getTargetAlias()); - } - - var renderedSource = field.isInput() ? context.iterateJoinSequenceFor(field).render() : context.renderQuerySource(getLocalTable()); - if (field.isID() && !shouldMakeNodeStrategy()) { - return CodeBlock.join( - renderedSource, - generateGetForID(field.getMappingFromFieldOverride(), context.getCurrentJoinSequence().isEmpty() ? null : context.getCurrentJoinSequence().getLast().getTable()) - ); - } - - var convertArrayFieldToList = field.isIterableWrapped() - && getFieldType(context.getTargetTable().getName(), columnName).map(Class::isArray).orElse(false); - - return CodeBlock.builder() - .add("$L.$N", renderedSource, columnName) - .addIf(!overrideEnum, toJOOQEnumConverter(field.getTypeName(), processedSchema)) - .addIf(convertArrayFieldToList, arrayToListConverter()) - .build(); - } - - private CodeBlock generateGetForID(MethodMapping mapping, JOOQMapping table) { - if (table != null) { // This may become superfluous if nodeId becomes the only way of handling IDs. This is just temporary insurance that the right thing gets picked. - var method = searchTableForMethodWithName(table.getMappingName(), mapping.getName()) - .or(() -> searchTableForMethodWithName(table.getMappingName(), mapping.asGet())) - .or(() -> searchTableForMethodWithName(table.getMappingName(), mapping.asCamelGet())); - if (method.isPresent()) { - return CodeBlock.of(".$L()", method.get()); - } - } - return mapping.asGetCall(); - } - - private CodeBlock generateHasForID(MethodMapping mapping, JOOQMapping table, CodeBlock content, boolean isIterable) { - if (table != null) { // This may become superfluous if nodeId becomes the only way of handling IDs. This is just temporary insurance that the right thing gets picked. - var suffix = isIterable ? "s" : ""; - if (searchTableForMethodWithName(table.getMappingName(), mapping.asHas() + suffix).isPresent()) { - return mapping.asHasCall(content, isIterable); - } - if (searchTableForMethodWithName(table.getMappingName(), mapping.asCamelHas() + suffix).isPresent()) { - return mapping.asCamelHasCall(content, isIterable); - } - } - return mapping.asHasCall(content, isIterable); - } - - /** - * Generate select row for each object within the union field - */ - protected CodeBlock generateForUnionField(GenerationField field, FetchContext context) { - var union = processedSchema.getUnion(field).getFieldTypeNames(); - var code = new ArrayList<CodeBlock>(); - for (var fieldObject : union) { - var objectField = new VirtualSourceField(processedSchema.getObject(fieldObject), fieldObject); - code.add(generateSelectRow(context.nextContext(objectField))); - } - return CodeBlock.join(",\n", code); - } - - /** - * @return Formatted CodeBlock for the where-statement and surrounding code. Applies conditions and joins. - */ - protected CodeBlock formatWhereContents(FetchContext context, boolean isDataFetcherRoot) { - var conditionList = new ArrayList<CodeBlock>(); - - if (context.getReferenceObject() instanceof InterfaceDefinition) { - // Discriminator condition for single table interface - conditionList.add( - CodeBlock.of("$L.$L.in($L)", - context.renderQuerySource(getLocalTable()), - processedSchema.getInterface(context.getReferenceObjectField()).getDiscriminatorFieldName(), - CodeBlock.join( - ", ", processedSchema - .getObjects() - .values() - .stream() - .filter(it -> it.implementsInterface(processedSchema.getInterface(context.getReferenceObjectField()).getName())) - .map(it -> CodeBlock.of("$S", it.getDiscriminator())) - .toList() - )) - ); - } - - if (!isRoot() && !resolverKeyParamName.isEmpty() && isDataFetcherRoot) { - conditionList.add(inResolverKeysBlock(resolverKeyParamName, context)); - } - - if (!isDataFetcherRoot && (context.hasNonSubqueryFields() || context.hasApplicableTable())) { - conditionList.addAll(getInputConditions(context, (ObjectField) context.getReferenceObjectField())); - var otherConditionsFields = context - .getConditionSourceFields() - .stream() // In theory this filter should not be necessary, context logic should add these in a way such that this case never arises. - .filter(it -> !it.equals(context.getReferenceObjectField())) - .toList(); - if (!otherConditionsFields.isEmpty()) { - for (var otherConditionsField : otherConditionsFields) { - conditionList.addAll(getInputConditions(context, (ObjectField) otherConditionsField)); - } - } - } - return formatJooqConditions(conditionList, "and"); - } - - protected static CodeBlock formatJooqConditions(ArrayList<CodeBlock> conditionList, String chainMethod) { - var code = CodeBlock.builder(); - var hasWhere = false; - for (var condition : conditionList) { - if (condition.isEmpty()) continue; - code.add(".$L($L)\n", hasWhere ? chainMethod : "where", indentIfMultiline(condition)); - hasWhere = true; - } - - return code.build(); - } - - /** - * Returns condition code blocks for a field which is assumed to only have input conditions, and no set values. - */ - protected List<CodeBlock> getInputConditions(FetchContext context, ObjectField sourceField) { - var allConditionCodeBlocks = new ArrayList<CodeBlock>(); - var inputComponents = getInputConditions(sourceField); - var flatInputs = inputComponents.independentConditions(); - var declaredInputConditions = inputComponents.declaredConditionsByField(); - var splitInputs = flatInputs - .stream() - .collect(Collectors.partitioningBy(it -> processedSchema.hasRecord(it.getInput()))); - var inputsWithRecord = splitInputs.get(true); - var inputsWithoutRecord = splitInputs.get(false); - - for (var inputCondition : inputsWithoutRecord) { - var conditionBuilder = CodeBlock.builder(); - var field = inputCondition.getInput(); - var checks = inputCondition.getChecksAsSequence(); - var isInRecordInput = processedSchema.isInputType(field.getContainerTypeName()) && processedSchema.hasJOOQRecord(field.getContainerTypeName()); - var checksNotEmpty = !checks.isEmpty() - && !(isInRecordInput && processedSchema.isNodeIdField(field)); // Skip null checks for nodeId in jOOQ record inputs in queries - - var renderedSequence = isInRecordInput ? - CodeBlock.of(context.getTargetAlias()) - : context.iterateJoinSequenceFor(field).render(); - if (renderedSequence.isEmpty()) { - continue; - } - var existsJoin = context.pollExistsJoin(); - - if (!inputCondition.isOverriddenByAncestors() && !field.hasOverridingCondition()) { - if (checksNotEmpty) { - conditionBuilder.add(checks + " ? "); - } - - var formattedCondition = existsJoin - .map(it -> wrapConditionInExists(formatCondition(inputCondition, renderedSequence, context), it, context)) - .orElseGet(() -> formatCondition(inputCondition, renderedSequence, context)); - conditionBuilder.add(formattedCondition); - - if (checksNotEmpty) { - var fallbackOnFalse = (conditionsShouldFallbackToFalse && inputCondition.isWrappedInList()) || field instanceof VirtualInputField; - conditionBuilder - .add(" : ") - .addIf(fallbackOnFalse, falseCondition()) - .addIf(!fallbackOnFalse, noCondition()); - } - allConditionCodeBlocks.add(conditionBuilder.build()); - } - - if (field.hasCondition()) { - var conditionInputs = List.of(renderedSequence, getCheckedNameWithPath(inputCondition, field.getCondition(), 2, 1)); - allConditionCodeBlocks.add(field.getCondition().formatToString(conditionInputs)); - } - } - - for (var conditionTuple : inputComponents.conditionTuples()) { - if (inputComponents.conditionTuples() - .stream() - .anyMatch(it -> conditionTuple.path().startsWith(it.path()) - && conditionTuple.path().length() > it.path().length())) { - continue; - } - - allConditionCodeBlocks.add(createTupleCondition( - context, conditionTuple.path(), conditionTuple.conditions())); - } - - for (var inputCondition : inputsWithRecord) { - var field = inputCondition.getInput(); - var sequence = context.iterateJoinSequenceFor(field).render(); - - if (!sequence.isEmpty() && field.hasCondition()) { - var conditionInputs = List.of(sequence, getCheckedNameWithPath(inputCondition, field.getCondition(), 2, 1)); - allConditionCodeBlocks.add(field.getCondition().formatToString(conditionInputs)); - } - } - - for (var condition : declaredInputConditions.entrySet()) { - var values = condition.getValue(); - var sqlCondition = condition.getKey().getCondition(); - var methodInputCount = 1 + values.size(); - var inputs = Stream.concat( - Stream.of(context.getCurrentJoinSequence().render()), - IntStream.range(0, values.size()) - .mapToObj(i -> getCheckedNameWithPath(values.get(i), sqlCondition, methodInputCount, i + 1)) - ).collect(Collectors.toList()); - - allConditionCodeBlocks.add(sqlCondition.formatToString(inputs)); - } - return allConditionCodeBlocks; - } - - private CodeBlock formatCondition(InputCondition inputCondition, CodeBlock renderedSequence, FetchContext context) { - var field = inputCondition.getInput(); - var name = processedSchema.isNodeIdField(field) && processedSchema.hasJOOQRecord(field.getContainerTypeName()) - ? CodeBlock.of(inputCondition.getNamePath()) - : inputCondition.getNameWithPath(); - if (processedSchema.isNodeIdField(field)) { - if (inputCondition.hasRecord() && isNodeIdReferenceField(field, processedSchema, context.getTargetTable())) { - return hasNodeIdOrIdsBlock( - name, - processedSchema.getNodeConfigurationForNodeIdFieldOrThrow(field), - renderedSequence.toString(), - resolveColumnNamesForNodeIdField(field, processedSchema, context.getTargetTable()), - field.isIterableWrapped() - ); - } else { - return hasNodeIdOrIdsBlock( - name, - processedSchema.getNodeConfigurationForNodeIdFieldOrThrow(field), - renderedSequence.toString(), - field.isIterableWrapped() - ); - } - } - - if (field.isID() && !shouldMakeNodeStrategy()) { - var isInRecordInput = processedSchema.isInputType(field.getContainerTypeName()) && processedSchema.hasJOOQRecord(field.getContainerTypeName()); - var table = isInRecordInput ? context.getCurrentJoinSequence().getLast().getTable() : context.iterateJoinSequenceFor(field).getLast().getTable(); - return CodeBlock.join(renderedSequence, generateHasForID(field.getMappingFromFieldOverride(), table, name, field.isIterableWrapped())); - } - - return CodeBlock.of( - "$L.$N$L.$L($L)", - renderedSequence, - field.getUpperCaseName(), - !processedSchema.hasJOOQRecord(field.getContainerTypeName()) ? toJOOQEnumConverter(field.getTypeName(), processedSchema) : CodeBlock.empty(), - field.isIterableWrapped() ? "in" : "eq", - name - ); - } - - private CodeBlock wrapConditionInExists(CodeBlock filterCondition, FetchContext.ExistsJoin existsJoin, FetchContext context) { - var join = existsJoin.join(); - var aliasName = join.getJoinAlias().getAlias().getMappingName(); - var rootAlias = context.getCurrentJoinSequence().render(); - - var correlation = buildExistsCorrelation(join, aliasName, rootAlias); - var innerCondition = Stream.concat(Stream.of(filterCondition), existsJoin.conditions().stream()) - .reduce((a, b) -> CodeBlock.of("$L.and($L)", a, b)) - .orElse(filterCondition); - return CodeBlock.of("$T.exists($T.selectOne().from($N).where($L.and($L)))", - DSL.className, DSL.className, aliasName, correlation, innerCondition); - } - - private CodeBlock buildExistsCorrelation(SQLJoinStatement join, String aliasName, CodeBlock rootAlias) { - if (join.getKey() != null) { - var targetTableName = join.getJoinTargetTable().getTable().getMappingName(); - return getKeyFields(join.getKey()) - .map(fields -> fields.entrySet().stream() - .map(e -> CodeBlock.of("$L.$L.eq($L.$L)", - aliasName, getJavaFieldName(targetTableName, e.getKey().getName()).orElseThrow(), - rootAlias, getJavaFieldName( - getKeyTargetTableJavaName(join.getKey().getMappingName()).orElseThrow(), - e.getValue().getName()).orElseThrow())) - .reduce((a, b) -> CodeBlock.of("$L.and($L)", a, b)) - .orElseThrow()) - .orElseThrow(() -> new IllegalStateException("No FK column mapping found for key " + join.getKey().getMappingName())); - } - // Condition-based joins: reuse the ON condition as correlation - return join.getJoinFields().stream() - .map(field -> field.toJoinString(join.getJoinSequence(), aliasName)) - .reduce((a, b) -> CodeBlock.of("$L.and($L)", a, b)) - .orElseThrow(() -> new IllegalStateException("No join fields found for EXISTS correlation on " + aliasName)); - } - - private CodeBlock getCheckedNameWithPath(InputCondition condition, SQLCondition sqlCondition, int methodInputCount, int paramIndex) { - var nameWithPath = condition.getNameWithPath(); - var checks = condition.getChecksAsSequence(); - var input = condition.getInput(); - var enumConverter = toGraphEnumConverter(input.getTypeName(), nameWithPath, true, processedSchema); - - CodeBlock value; - if (!enumConverter.isEmpty()) { - value = enumConverter; - } else if (processedSchema.isNodeIdField(input) - && expectsRecordParam(sqlCondition, methodInputCount, paramIndex)) { - var node = processedSchema.getNodeConfigurationForNodeIdFieldOrThrow(input); - value = input.isIterableWrapped() - ? nodeIdsToTableRecordsBlock(node, nameWithPath) - : nodeIdToTableRecordBlock(node, nameWithPath); - } else { - value = nameWithPath; - } - - return CodeBlock.of( - !checks.isEmpty() && !condition.getNamePath().isEmpty() ? checks + " ? $L : null" : "$L", - value - ); - } - - /** - * @return whether the condition method's parameter at {@code paramIndex} is a jOOQ table - * record (singular or {@code List<…>}). - */ - private static boolean expectsRecordParam(SQLCondition sqlCondition, int methodInputCount, int paramIndex) { - return getExternalReferences().getMethodsFrom(sqlCondition.getReference()).stream() - .filter(it -> it.getParameterTypes().length == methodInputCount + sqlCondition.getContextFields().size()) - .anyMatch(method -> methodExpectsTableRecordParamAtIndex(method, paramIndex)); - } - - private CodeBlock createTupleCondition( - FetchContext context, - String argumentInputFieldName, - List<InputCondition> conditions - ) { - var selectedConditions = new HashSet<InputCondition>(); - var tupleFieldBlocks = new ArrayList<CodeBlock>(); - var tupleVariableBlocks = new ArrayList<CodeBlock>(); - - for (var condition : conditions) { - var field = condition.getInput(); - var fieldSequence = context.iterateJoinSequenceFor(field); - var lastTable = fieldSequence.getLast().getTable(); - var unpacked = unpackElement(context, argumentInputFieldName, condition, lastTable); - - if (condition.isOverriddenByAncestors()) { - continue; - } - - if (!field.hasOverridingCondition()) { - var argumentSelect = CodeBlock.ofIf(field.isNullable(), "$N.$L($S, $N, $S)", - VAR_SELECT, METHOD_HAS_ARG_AT_INDEX, condition.getSourceInput().getName(), VAR_ITERATOR, field.getName()); - var isNullableAndNotVirtual = field.isNullable() && !(field instanceof VirtualInputField); - if (processedSchema.isNodeIdField(field)) { - tupleVariableBlocks.add(isNullableAndNotVirtual ? ofTernary(argumentSelect, unpacked, trueCondition()) : unpacked); - } else if (field.isID()) { - var check = CodeBlock.join(fieldSequence.render(), generateHasForID(field.getMappingFromFieldOverride(), lastTable, unpacked, field.isIterableWrapped())); - tupleVariableBlocks.add(isNullableAndNotVirtual ? ofTernary(argumentSelect, check, trueCondition()) : check); - } else { - tupleVariableBlocks.add( - isNullableAndNotVirtual - ? ofTernary(argumentSelect, val(unpacked), makeTupleBlock(field, context, condition.hasRecord(), fieldTypeIsCLOB(lastTable.getName(), field.getUpperCaseName()))) - : val(unpacked) - ); - } - - tupleFieldBlocks.add(makeTupleBlock(field, context, condition.hasRecord(), fieldTypeIsCLOB(lastTable.getName(), field.getUpperCaseName()))); - selectedConditions.add(condition); - } - - if (field.hasCondition()) { - tupleFieldBlocks.add(trueCondition()); - - var conditionInputs = List.of(fieldSequence.render(), unpacked); - tupleVariableBlocks.add(field.getCondition().formatToString(conditionInputs)); - selectedConditions.add(condition); - } - } - - if (tupleFieldBlocks.isEmpty()) { - return CodeBlock.empty(); - } - - var checks = String.join(" && ", selectedConditions - .stream() - .map(InputCondition::getChecksAsSequence) - .collect(Collectors.toSet())); - - return CodeBlock - .builder() - .add(checks.isEmpty() ? "" : "$L ?\n", checks) - .indent() - .indent() - .add(wrapRow(CodeBlock.join(",\n", tupleFieldBlocks))) - .add(".in(\n") - .indent() - .indent() - .add("$T.range(0, $N.size()).mapToObj($N ->\n", INT_STREAM.className, argumentInputFieldName, VAR_ITERATOR) - .indent() - .indent() - .add(wrapRow(CodeBlock.join(",\n", tupleVariableBlocks))) - .unindent() - .unindent() - .add("\n)") - .unindent() - .unindent() - .add("$L\n) : $L", collectToList(), conditionsShouldFallbackToFalse ? falseCondition() : noCondition()) - .unindent() - .unindent() - .build(); - } - - private CodeBlock makeTupleBlock(GenerationField field, FetchContext context, boolean hasRecord, boolean isClob) { - if (field.isID() || processedSchema.isNodeIdField(field)) { - return trueCondition(); - } - - return CodeBlock.join( - generateForField(field, context, hasRecord), - CodeBlock.ofIf(isClob, ".cast($T.class)", STRING.className) - ); - } - - private CodeBlock unpackElement(FetchContext context, String argumentInputFieldName, InputCondition condition, JOOQMapping table) { - var field = condition.getInput(); - var getElement = CodeBlock.of("$N.get($N)", argumentInputFieldName, VAR_ITERATOR); - if (processedSchema.isNodeIdField(field)) { - getElement = !condition.isWrappedInList() && processedSchema.hasJOOQRecord(field.getContainerTypeName()) - ? CodeBlock.of("$L$L", getElement, field.getMappingForRecordFieldOverride().asGetCall()) - : getElement; - var referenceObject = processedSchema.hasJOOQRecord(field.getContainerTypeName()) - ? processedSchema.getNodeTypeForNodeIdFieldOrThrow(field) - : context.getReferenceObject(); - return hasNodeIdOrIdsBlock(getElement, processedSchema.getNodeConfigurationForTypeOrThrow(referenceObject), context.getTargetAlias(), false); - } - - if (!condition.hasRecord()) { - return CodeBlock.of("$L$L", getElement, condition.getNameWithPathString().replaceFirst(Pattern.quote(argumentInputFieldName), "")); - } - - var mapping = field.isID() && !Optional.ofNullable(processedSchema.getRecordType(condition.getSourceInput())).map(RecordObjectSpecification::hasJavaRecordReference).orElse(false) - ? generateGetForID(field.getMappingFromFieldOverride(), table) - : field.getMappingForRecordFieldOverride().asGetCall(); - return CodeBlock.of("$L$L", getElement, mapping); - } - - /** - * Returns an {@link InputComponents} object where all input for the field is categorized as conditions, and not set values. - */ - @NotNull - private InputComponents getInputConditions(ObjectField referenceField) { - var pathNameForIterableFields = new ArrayList<String>(); - var flatInputs = new ArrayList<InputCondition>(); - var declaredConditionsByField = new LinkedHashMap<GenerationField, List<InputCondition>>(); - var ancestorsWithDeclaredCondition = new HashSet<GenerationField>(); - - if (referenceField.hasCondition()) { - declaredConditionsByField.put(referenceField, new ArrayList<>()); - ancestorsWithDeclaredCondition.add(referenceField); - } - - var inputBuffer = referenceField - .getNonReservedArguments() - .stream() - .map(it -> new InputCondition( - it, - inputPrefix(inferFieldNamingConvention(it)), - processedSchema.hasRecord(it), - referenceField.hasOverridingCondition() - ) - ) - .collect(Collectors.toCollection(LinkedList::new)); - - while (!inputBuffer.isEmpty()) { - recursionCheck(inputBuffer.size()); - var inputCondition = inputBuffer.poll(); - var inputField = inputCondition.getInput(); - - if (processedSchema.isInputType(inputField)) { - if (ancestorsWithDeclaredCondition.contains(inputField)) { - ancestorsWithDeclaredCondition.remove(inputField); - continue; - } else if (inputField.hasCondition() && !processedSchema.hasRecord(inputField)) { - ancestorsWithDeclaredCondition.add(inputField); - declaredConditionsByField.put(inputField, new ArrayList<>()); - inputBuffer.addFirst(inputCondition); - } - - if (inputField.isIterableWrapped()) { - pathNameForIterableFields.add(inputCondition.getNameWithPathString()); - } - - var isMutationWithJDBCBatching = referenceField.hasMutationType() - && !processedSchema.isDeleteMutationWithReturning(referenceField) - && !processedSchema.isInsertMutationWithReturning(referenceField); - - var innerFields = isMutationWithJDBCBatching ? - getPrimaryKeyForTable(processedSchema.getRecordType(inputField).getTable().getName()) - .map(it -> it.getFields().stream().map(col -> new VirtualInputField(col.getName(), inputField.getContainerTypeName())).toList()) - .orElse(List.of()) - : processedSchema.getInputType(inputField).getFields(); - - inputBuffer.addAll( - 0, - innerFields.stream() - .map(inputCondition::iterate) - .toList() - ); - } - - if (!processedSchema.isInputType(inputField) || processedSchema.hasRecord(inputField)) { - var flatInput = inputCondition.applyTo(inputField); - - flatInputs.add(flatInput); - - for (var ancestor : ancestorsWithDeclaredCondition) { - declaredConditionsByField.get(ancestor).add(flatInput); - } - } - } - - var conditionTuples = getConditionTuples(pathNameForIterableFields, flatInputs); - - conditionTuples - .stream() - .map(InputComponents.ConditionTuple::conditions) - .forEach(flatInputs::removeAll); - - filterDeclaredConditions(declaredConditionsByField, conditionTuples); - - return new InputComponents(flatInputs, conditionTuples, List.of(), null, declaredConditionsByField); - } - - private List<InputComponents.ConditionTuple> getConditionTuples( - List<String> iterableInputFields, - List<InputCondition> flatInputs) { - return iterableInputFields - .stream() - .map(s -> new InputComponents.ConditionTuple( - s, flatInputs - .stream() - .filter(condition -> condition.getNamePath().startsWith(s)) - .collect(Collectors.toList()))) - .collect(Collectors.toList()); - } - - private void filterDeclaredConditions( - LinkedHashMap<GenerationField, List<InputCondition>> declaredConditionsByField, - List<InputComponents.ConditionTuple> conditionTuples) { - for (var entry : declaredConditionsByField.entrySet()) { - var recordConditions = entry - .getValue() - .stream() - .filter(InputCondition::hasRecord) - .toList(); - var conditions = entry - .getValue() - .stream() - .filter(c -> !c.hasRecord()) - .collect(Collectors.toList()); - - var filteredRecordConditions = recordConditions - .stream() - .filter(c1 -> recordConditions - .stream() - .noneMatch(c2 -> !c1.getNamePath().equals(c2.getNamePath()) && - c1.getNamePath().startsWith(c2.getNamePath()))) - .toList(); - - conditionTuples - .stream() - .map(InputComponents.ConditionTuple::conditions) - .forEach(conditions::removeAll); - - declaredConditionsByField.replace( - entry.getKey(), - Stream.concat(filteredRecordConditions.stream(), conditions.stream()).collect(Collectors.toList())); - } - } - - protected String inferFieldNamingConvention(GenerationField field) { - if (processedSchema.hasRecord(field)) { - return asListedRecordNameIf(field.getName(), field.isIterableWrapped()); - } - return field.getName(); - } - - protected CodeBlock createSeekAndLimitBlock() { - return CodeBlock - .builder() - .add(".seek($T.getOrderByValues($N, $L, $N))\n", QUERY_HELPER.className, VAR_CONTEXT, VAR_ORDER_FIELDS, inputPrefix(GraphQLReservedName.PAGINATION_AFTER.getName())) - .add(".limit($N + 1)\n", VAR_PAGE_SIZE) - .build(); - } - - protected CodeBlock createOrderFieldsDeclarationBlock(ObjectField referenceField, String actualRefTable, String tableName) { - var fieldsBlock = createOrderFieldsBlock(referenceField, actualRefTable, tableName); - return !fieldsBlock.isEmpty() ? CodeBlock.declare(VAR_ORDER_FIELDS, fieldsBlock) : CodeBlock.empty(); - } - - protected CodeBlock createOrderFieldsBlock(ObjectField referenceField, String actualRefTable, String tableName) { - var orderByField = referenceField.getOrderField(); - var defaultOrder = referenceField.getDefaultOrder(); - var hasPrimaryKey = tableHasPrimaryKey(tableName); - - // No sorting possible if no orderBy, no defaultOrder, and no primary key - if (orderByField.isEmpty() && defaultOrder.isEmpty() && !hasPrimaryKey) { - return CodeBlock.empty(); - } - - // Determine default order fields (defaultOrder takes precedence over primary key) - var defaultOrderByFields = defaultOrder - .map(order -> { - if (order.isIndex()) { - validateIndexExists(tableName, order.index(), referenceField.getName()); - return CodeBlock.of( - "$T.getSortFields($N, $S, $S)", - QUERY_HELPER.className, actualRefTable, order.index(), order.direction()); - } else if (order.isFields()) { - validateFieldsExist(tableName, order.fields(), referenceField.getName()); - var sortOrder = order.direction().equalsIgnoreCase("ASC") - ? CodeBlock.of("$T.ASC", SORT_ORDER.className) - : CodeBlock.of("$T.DESC", SORT_ORDER.className); - return createFieldSortFields(order.fields(), actualRefTable, sortOrder); - } else { - return getPrimaryKeyFieldsWithTableAliasBlock(actualRefTable, order.direction()); - } - }) - .orElseGet(() -> hasPrimaryKey - ? getPrimaryKeyFieldsWithTableAliasBlock(actualRefTable) - : CodeBlock.of("new $T[] {}", SORT_FIELD.className)); - - var code = CodeBlock.builder(); - orderByField.ifPresentOrElse( - it -> code.add(createCustomOrderBy(it, actualRefTable, defaultOrderByFields, tableName)), - () -> code.add(defaultOrderByFields)); - return code.build(); - } - - @NotNull - private CodeBlock createCustomOrderBy(InputField orderInputField, String actualRefTable, CodeBlock defaultOrderByFieldsBlock, String targetTableName) { - var orderInput = processedSchema.getResolvedOrderInput(orderInputField); - return createOrderBySwitch(orderInput, orderInputField, actualRefTable, defaultOrderByFieldsBlock, targetTableName); - } - - @NotNull - private CodeBlock createOrderBySwitch(ProcessedSchema.ResolvedOrderInput orderInput, InputField orderInputField, - String actualRefTable, CodeBlock defaultOrderByFieldsBlock, String targetTableName) { - var orderInputFieldName = inputPrefix(orderInputField.getName()); - var orderByFieldGetter = getDTOGetterMethodNameForField(orderInput.orderByField()); - var directionGetter = getDTOGetterMethodNameForField(orderInput.directionField()); - - var code = CodeBlock.builder() - .add("$N == null\n", orderInputFieldName) - .indent().indent() - .add("? $L\n", defaultOrderByFieldsBlock) - .beginControlFlow(": switch ($N.$L().toString())", orderInputFieldName, orderByFieldGetter); - - orderInput.enumDefinition().getFields().forEach(field -> - code.add(createOrderByCase(field, actualRefTable, orderInputFieldName, directionGetter, targetTableName))); - - code.add("default -> throw new $T($S + $N.$L().toString());\n", - ILLEGAL_ARGUMENT_EXCEPTION.className, "Unknown order by field: ", - orderInputFieldName, orderByFieldGetter); - code.endControlFlow() - .unindent().unindent(); - return code.build(); - } - - private static CodeBlock createDynamicSortOrderBlock(String orderInputFieldName, String directionGetter) { - return CodeBlock.of( - "$N.$L().toString().equalsIgnoreCase($S) ? $T.ASC : $T.DESC", - orderInputFieldName, directionGetter, "ASC", SORT_ORDER.className, SORT_ORDER.className); - } - - private CodeBlock createOrderByCase(OrderByEnumField field, String actualRefTable, String orderInputFieldName, String directionGetter, String targetTableName) { - var enumValueName = field.getName(); - return switch (field.getSortMode()) { - case INDEX -> { - var indexName = field.getIndexName().orElseThrow(); - validateIndexExists(targetTableName, indexName, enumValueName); - yield CodeBlock.of("case $S -> $T.getSortFields($N, $S, $N.$L().toString());\n", - enumValueName, QUERY_HELPER.className, actualRefTable, indexName, orderInputFieldName, directionGetter); - } - case FIELDS -> { - var fieldSpecs = field.getFieldSortSpecs(); - validateFieldsExist(targetTableName, fieldSpecs, enumValueName); - var dynamicSortOrder = createDynamicSortOrderBlock(orderInputFieldName, directionGetter); - yield CodeBlock.of("case $S -> $L;\n", enumValueName, - createFieldSortFields(fieldSpecs, actualRefTable, dynamicSortOrder)); - } - case PRIMARY_KEY -> { - ValidationHandler.isTrue( - tableHasPrimaryKey(targetTableName), - "Table '%s' has no primary key, but @order(primaryKey: true) is set on enum value '%s'", - targetTableName, enumValueName); - var dynamicSortOrder = createDynamicSortOrderBlock(orderInputFieldName, directionGetter); - yield CodeBlock.of("case $S -> $L;\n", enumValueName, - getPrimaryKeyFieldsWithTableAliasBlock(actualRefTable, dynamicSortOrder)); - } - }; - } - - private static void validateIndexExists(String tableName, String indexName, String sourceFieldName) { - ValidationHandler.isTrue(tableHasIndex(tableName, indexName), - "Table '%s' has no index '%s' specified for '%s'", tableName, indexName, sourceFieldName); - } - - private static void validateFieldsExist(String tableName, List<FieldSortSpec> fieldSpecs, String sourceFieldName) { - fieldSpecs.forEach(spec -> ValidationHandler.isTrue( - getField(tableName, spec.name()).isPresent(), - "Table '%s' has no field '%s' specified for '%s'", tableName, spec.name(), sourceFieldName)); - } - - private CodeBlock createFieldSortFields(List<FieldSortSpec> fieldSpecs, String tableAlias, CodeBlock sortOrder) { - var fieldBlocks = fieldSpecs.stream() - .map(spec -> { - if (spec.collation() != null) { - return CodeBlock.of("$N.$N.collate($S).sort($L)", - tableAlias, spec.name(), spec.collation(), sortOrder); - } else { - return CodeBlock.of("$N.$N.sort($L)", - tableAlias, spec.name(), sortOrder); - } - }) - .collect(CodeBlock.joining(",\n")); - - return CodeBlock.builder() - .beginControlFlow("new $T[]", SORT_FIELD.className) - .add(fieldBlocks) - .endControlFlow() - .build(); - } - - @NotNull - protected MethodSpec.Builder getSpecBuilder(ObjectField referenceField, TypeName refTypeName, InputParser parser) { - return getDefaultSpecBuilder( - asQueryMethodName(referenceField.getName(), getLocalObject().getName()), - getReturnType(referenceField, refTypeName) - ) - .addParameterIf(!isRoot(), () -> wrapSet(getKeyTableRecordTypeName(referenceField, processedSchema)), resolverKeyParamName) - .addParameters(parser.getMethodParameterSpecs(true, true, true)) - .addParameter(SELECTION_SET.className, VAR_SELECT); - } - - @NotNull - protected TypeName getReturnType(ObjectField referenceField, TypeName refClassName) { - TypeName type = referenceField.hasForwardPagination() ? ParameterizedTypeName.get(PAIR.className, STRING.className, refClassName) : refClassName; - - var lookupExists = LookupHelpers.lookupExists(referenceField, processedSchema); - - if (isRoot() && !lookupExists) { - return wrapListIf(type, referenceField.isIterableWrapped() || referenceField.hasForwardPagination()); - } else if (!isRoot()) { - return wrapMap( - getKeyTableRecordTypeName(referenceField, processedSchema), - wrapListIf(type, referenceField.isIterableWrapped() && !processedSchema.isOrderedMultiKeyQuery(referenceField) || referenceField.hasForwardPagination())); - } else { - return wrapMap(STRING.className, wrapListIf(type, referenceField.hasForwardPagination())); - } - } - - protected String generateHelperMethodName(ObjectField target) { - // Generate method name like: queryForQuery_outer - // Pattern: [callingMethod]_[returnType] - var returnTypeName = processedSchema.getRecordType(target).getName(); - - if (target instanceof VirtualSourceField) { - return generateNestedMethodName(interfaceOrUnionQueryName(returnTypeName, target.getContainerTypeName()), returnTypeName); - } - return generateNestedMethodName(asQueryMethodName(target.getName(), localObject.getName()), returnTypeName); - } - - /** - * Generates a method name. - * Format: [parentHelperMethodName]_[fieldName] - * Example: queryForQuery_customer_storeInfo_staff - */ - protected String generateNestedMethodName(String parentHelperMethodName, String fieldName) { - return parentHelperMethodName + "_" + uncapitalize(fieldName); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/FetchEntityImplementationDBMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/FetchEntityImplementationDBMethodGenerator.java deleted file mode 100644 index 42f69081f8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/FetchEntityImplementationDBMethodGenerator.java +++ /dev/null @@ -1,193 +0,0 @@ -package no.sikt.graphitron.generators.db; - -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.fields.VirtualSourceField; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.generators.codebuilding.VariableNames; -import no.sikt.graphitron.generators.context.FetchContext; -import no.sikt.graphitron.generators.context.InputParser; -import no.sikt.graphitron.javapoet.ClassName; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphitron.javapoet.TypeName; -import no.sikt.graphql.schema.ProcessedSchema; -import org.jspecify.annotations.NonNull; - -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; - -import static no.sikt.graphitron.configuration.GeneratorConfig.optionalSelectIsEnabled; -import static no.sikt.graphitron.configuration.GeneratorConfig.shouldMakeNodeStrategy; -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.*; -import static no.sikt.graphitron.generators.codebuilding.NameFormat.asEntitiesQueryName; -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.*; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.*; -import static no.sikt.graphitron.generators.db.FetchMultiTableDBMethodGenerator.VAR_FILTERED_REPRESENTATIONS; -import static no.sikt.graphitron.generators.db.FetchMultiTableDBMethodGenerator.VAR_REPRESENTATIONS; -import static no.sikt.graphitron.mappings.JavaPoetClassName.*; -import static no.sikt.graphql.naming.GraphQLReservedName.FEDERATION_ENTITY_UNION; -import static no.sikt.graphql.naming.GraphQLReservedName.TYPE_NAME; - -/** - * Generator that creates the data fetching methods for entities - */ -public class FetchEntityImplementationDBMethodGenerator extends FetchDBMethodGenerator { - - public FetchEntityImplementationDBMethodGenerator( - ObjectDefinition localObject, - ProcessedSchema processedSchema - ) { - super(localObject, processedSchema); - } - - @Override - public MethodSpec generate(ObjectField target) { - var implementation = getLocalObject(); - var virtualReference = new VirtualSourceField(getLocalObject(), FEDERATION_ENTITY_UNION.getName()); - var context = new FetchContext(processedSchema, virtualReference, implementation, false); - var entityUnionClass = processedSchema.getUnion(FEDERATION_ENTITY_UNION.getName()).getGraphClassName(); - - var querySource = context.renderQuerySource(implementation.getTable()); - - var parser = new InputParser(virtualReference, processedSchema); - var methodInputs = parser.getMethodInputNames(true, false, true); - if (shouldMakeNodeStrategy()) methodInputs.add(0, VAR_NODE_STRATEGY); - if (optionalSelectIsEnabled()) methodInputs.add(VAR_SELECT); - - var allFieldsIncludedInEntityKey = new LinkedList<>( - implementation.getEntityKeys() - .keys().stream() - .flatMap(it -> it.getKeys().stream()).map(implementation::getFieldByName) - .toList() - ); - - var selectBlock = getSelectBlock( - virtualReference, - methodInputs, - allFieldsIncludedInEntityKey, - context - ); - - return getDefaultSpecBuilder(asEntitiesQueryName(implementation.getName()), wrapMap(wrapStringMap(TypeName.OBJECT), entityUnionClass)) - .addParameter(wrapSet(wrapStringMap(TypeName.OBJECT)), VAR_REPRESENTATIONS) - .addParameter(SELECTION_SET.className, VAR_SELECT) - .declare(VAR_FILTERED_REPRESENTATIONS, getFilteredEntities(implementation.getName())) - .addCode(createAliasDeclarations(context.getAliasSet())) - .addCode("return $N\n", VariableNames.VAR_CONTEXT) - .indent() - .indent() - .addCode(".select($L)\n", indentIfMultiline(selectBlock)) - .addCode(".from($L)\n", querySource) - .addCode(createSelectJoins(context.getJoinSet())) - .addCode(formatWhere(context, implementation)) - .addCode(createSelectConditions(context.getConditionList(), true)) - .addCode(fetchAndMapBlock(entityUnionClass, implementation)) - .unindent() - .unindent() - .build(); - } - - private static @NonNull CodeBlock fetchAndMapBlock(ClassName entityUnionClass, ObjectDefinition obj) { - return CodeBlock - .builder() - .add(".fetchMap(\n") - .indent() - .beginControlFlow("$L ->", VAR_ITERATOR) - .declare(VAR_REP, "new $T<$T, $T>()", HASH_MAP.className, STRING.className, OBJECT.className) - .addStatement("$N.put($S, $S)", VAR_REP, TYPE_NAME.getName(), obj.getName()) - .addStatement("$N.putAll($N.value1())", VAR_REP, VAR_ITERATOR) - .add(returnWrap(VAR_REP)) - .endControlFlowWithComma() - .add("$1N -> ($2T) $1N.value2()\n", VAR_ITERATOR, entityUnionClass) - .unindent() - .addStatement(")") - .build(); - } - - private @NonNull CodeBlock getSelectBlock(ObjectField virtualField, List<String> methodInputs, LinkedList<ObjectField> fieldsInAnyEntityKey, FetchContext context) { - return CodeBlock - .builder() - .add(wrapRowOfMap(fieldsInAnyEntityKey.stream().map(it -> mapEntry(it.getName(), generateForField(it, context))).collect(CodeBlock.joining(",\n")))) - .add(",\n$L($L)", generateHelperMethodName(virtualField), String.join(", ", methodInputs)) - .build(); - } - - private CodeBlock getFilteredEntities(String implementationName) { - return CodeBlock - .builder() - .add("$N\n", VAR_REPRESENTATIONS) - .add(".stream()\n") - .add(".filter($T::nonNull)\n", OBJECTS.className) - .add(".filter($L -> $S.equals($N.get($S)))\n", VAR_ITERATOR, implementationName, VAR_ITERATOR, TYPE_NAME.getName()) - .add(collectToList()) - .build(); - } - - private CodeBlock getEntitiesConditionCode(FetchContext context, String key, ObjectField field, ObjectDefinition implementation) { - var streamBlock = CodeBlock.builder() - .add("$N.stream().map($L -> ", VAR_FILTERED_REPRESENTATIONS, VAR_ITERATOR) - .addIf(field.isID(), "($T)", STRING.className) - .add(" $N.get($S))", VAR_ITERATOR, key) - .build(); - if (processedSchema.isNodeIdField(field)) { - var code = CodeBlock.of("$L.filter($T::nonNull)$L", streamBlock, OBJECTS.className, collectToList()); - return hasNodeIdOrIdsBlock(code, processedSchema.getNodeConfigurationForTypeOrThrow(implementation), context.getTargetAlias(), true); - } - - return CodeBlock - .builder() - .add("$N.", context.getTargetAlias()) - .addIf(field.isID(), "hasIds(") - .addIf( - !field.isID(), - "$L$L.in(", - field.getUpperCaseName(), - toJOOQEnumConverter(field.getTypeName(), processedSchema) - ) - .add(streamBlock) - .add(collectToList()) - .add(")") - .build(); - } - - /** - * @return Formatted CodeBlock for the where-statement and surrounding code for federation queries. - */ - protected CodeBlock formatWhere(FetchContext context, ObjectDefinition implementation) { - var type = processedSchema.getObject(context.getReferenceObjectField()); - var conditionBlocks = new ArrayList<CodeBlock>(); - for (var k: type.getEntityKeys().keys()) { - var containedKeys = k.getKeys(); - var code = CodeBlock.builder(); - if (containedKeys.size() < 2) { - var key = containedKeys.get(0); - code.add(getEntitiesConditionCode(context, key, type.getFieldByName(key), implementation)); - } else { - var conditions = new ArrayList<CodeBlock>(); - for (var key : containedKeys) { - conditions.add(getEntitiesConditionCode(context, key, type.getFieldByName(key), implementation)); - } - code.add("$T.and($L)", DSL.className, indentIfMultiline(CodeBlock.join(",\n", conditions))); - } - conditionBlocks.add(code.build()); - // var nestedKeys = k.getNestedKeys(); # TODO: Support nested keys. - } - return formatJooqConditions(conditionBlocks, "or"); - } - - @Override - public List<MethodSpec> generateAll() { - if (!processedSchema.federationEntitiesExist() || !processedSchema.isEntity(getLocalObject().getName())) { - return List.of(); - } - return localObject - .getFields() - .stream() - .findFirst() - .map(this::generate) - .filter(it -> !it.code().isEmpty()) - .stream() - .toList(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/FetchMappedObjectDBMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/FetchMappedObjectDBMethodGenerator.java deleted file mode 100644 index 17752b4ce1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/FetchMappedObjectDBMethodGenerator.java +++ /dev/null @@ -1,215 +0,0 @@ -package no.sikt.graphitron.generators.db; - -import no.sikt.graphitron.definitions.fields.GenerationSourceField; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.generators.codebuilding.LookupHelpers; -import no.sikt.graphitron.generators.codebuilding.VariableNames; -import no.sikt.graphitron.generators.context.FetchContext; -import no.sikt.graphitron.generators.context.InputParser; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphql.directives.GenerationDirective; -import no.sikt.graphql.naming.GraphQLReservedName; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.List; -import java.util.stream.Stream; - -import static no.sikt.graphitron.configuration.GeneratorConfig.optionalSelectIsEnabled; -import static no.sikt.graphitron.configuration.GeneratorConfig.shouldMakeNodeStrategy; -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.indentIfMultiline; -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.inferFieldTypeName; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.*; -import static no.sikt.graphitron.javapoet.CodeBlock.empty; -import static no.sikt.graphitron.mappings.JavaPoetClassName.*; -import static no.sikt.graphitron.mappings.TableReflection.tableHasPrimaryKey; -import static no.sikt.graphql.naming.GraphQLReservedName.FEDERATION_ENTITIES_FIELD; - -/** - * Generator that creates the default data fetching methods - */ -public class FetchMappedObjectDBMethodGenerator extends FetchDBMethodGenerator { - - public FetchMappedObjectDBMethodGenerator(ObjectDefinition localObject, ProcessedSchema processedSchema) { - super( - localObject, - processedSchema, - localObject.isOperationRoot() - && localObject.getName().equals(GraphQLReservedName.SCHEMA_MUTATION.getName()) - ); - } - - /** - * @param target A {@link ObjectField} for which a method should be generated for. - * This must reference an object with the - * "{@link GenerationDirective#TABLE table}" directive set. - * @return The complete javapoet {@link MethodSpec} based on the provided reference field. - */ - @Override - public MethodSpec generate(ObjectField target) { - var localObject = getLocalObject(); - var context = new FetchContext(processedSchema, target, localObject, false); - - // Note that this must happen before alias declaration. - var selectRowBlock = getSelectRowOrField(target, context); - var whereBlock = formatWhereContents(context, target.createsDataFetcher()); - for (var alias: context.getAliasSet()) { - if (alias.hasTableMethod()){ - createServiceDependency(alias.getReferenceObjectField()); - } - } - var querySource = context.renderQuerySource(getLocalTable()); - var refContext = target.createsDataFetcher() ? context.nextContext(target) : context; - var actualRefTable = refContext.getTargetAlias(); - var actualRefTableName = refContext.getTargetTableName(); - var selectAliasesBlock = createAliasDeclarations(context.getAliasSet()); - var orderFields = !LookupHelpers.lookupExists(target, processedSchema) && (target.isIterableWrapped() || target.hasForwardPagination() || !isRoot()) - ? createOrderFieldsDeclarationBlock(target, actualRefTable, actualRefTableName) - : empty(); - - var returnType = processedSchema.isRecordType(target) - ? processedSchema.getRecordType(target).getGraphClassName() - : inferFieldTypeName(context.getReferenceObjectField(), true, processedSchema); - - var isReferenceResolverField = processedSchema.isReferenceResolverField(target); - var parser = new InputParser(target, processedSchema); - var selectBlockToUse = getSelectBlockForRecord(target, selectRowBlock, isReferenceResolverField, parser); - var selectBlock = createSelectBlock(target, context, actualRefTable, selectBlockToUse); - - return getSpecBuilder(target, returnType, parser) - .addCode(declareAllServiceClassesInAliasSet(context.getAliasSet())) - .addCode(selectAliasesBlock) - .addCode(orderFields) - .addCode("return $N\n", VariableNames.VAR_CONTEXT) - .indent() - .indent() - .addCode(".select($L)\n", selectBlock) - .addCodeIf(!querySource.isEmpty() && (context.hasNonSubqueryFields() || context.hasApplicableTable()), ".from($L)\n", querySource) - .addCode(createSelectJoins(context.getJoinSet())) - .addCode(whereBlock) - .addCode(createSelectConditions(context.getConditionList(), !whereBlock.isEmpty())) - .addCodeIf(!target.createsDataFetcher() && !orderFields.isEmpty(), ".orderBy($L)\n", VAR_ORDER_FIELDS) - .addCodeIf(target.hasForwardPagination() && !target.createsDataFetcher(), this::createSeekAndLimitBlock) - .addCode(setFetch(target)) - .unindent() - .unindent() - .build(); - } - - private CodeBlock getSelectRowOrField(ObjectField target, FetchContext context) { - if (!processedSchema.isRecordType(target)) { - return generateForField(target, context); - } - return processedSchema.isReferenceResolverField(target) - ? generateCorrelatedSubquery(context.nextContext(target)) - : generateSelectRow(context); - } - - /** - * Determine the select block to use for record types. By default, delegates to a helper method - * unless the field is a reference resolver field (which uses a correlated subquery). - * Subclasses can override to always inline the select. - */ - protected CodeBlock getSelectBlockForRecord(ObjectField target, CodeBlock selectRowBlock, boolean isReferenceResolverField, InputParser parser) { - if (!processedSchema.isRecordType(target) || isReferenceResolverField) { - return selectRowBlock; - } - var methodInputs = parser.getMethodInputNames(true, false, true); - if (optionalSelectIsEnabled()) methodInputs.add(VAR_SELECT); - if (shouldMakeNodeStrategy()) methodInputs.add(0, VAR_NODE_STRATEGY); - return CodeBlock.of("$L($L)", generateHelperMethodName(target), methodInputs.stream().map(CodeBlock::of).collect(CodeBlock.joining(", "))); - } - - private CodeBlock createSelectBlock(ObjectField target, FetchContext context, String actualRefTable, CodeBlock selectRowBlock) { - return indentIfMultiline( - Stream.of( - getInitialKey(context), - CodeBlock.ofIf(target.hasForwardPagination() && !target.createsDataFetcher(), "$T.getOrderByToken($L, $L),\n", QUERY_HELPER.className, actualRefTable, VAR_ORDER_FIELDS), - selectRowBlock - ).collect(CodeBlock.joining()) - ); - } - - private CodeBlock setFetch(ObjectField referenceField) { - var refObject = processedSchema.getObjectOrConnectionNode(referenceField); - if (refObject == null) { - return CodeBlock.statementOf( - ".fetch$L($L -> $N.into($T.class))", - referenceField.isIterableWrapped() ? "" : "One", - VAR_ITERATOR, - VAR_ITERATOR, - referenceField.getTypeClass() - ); - } - - if (referenceField.hasForwardPagination()) { - return getPaginationFetchBlock(); - } - - var lookupExists = LookupHelpers.lookupExists(referenceField, processedSchema); - if (isRoot() && !lookupExists) { - return CodeBlock.statementOf( - ".fetch$L($L -> $N.into($T.class))", - referenceField.isIterableWrapped() ? "" : "One", - VAR_ITERATOR, - VAR_ITERATOR, - refObject.getGraphClassName() - ); - } - - var code = CodeBlock.builder() - .add(".fetchMap($T::value1, ", RECORD2.className); - - if (processedSchema.isObjectOrConnectionNodeWithPreviousTableObject(referenceField.getContainerTypeName()) && referenceField.isIterableWrapped() && !lookupExists || referenceField.hasForwardPagination()) { - if (referenceField.hasForwardPagination() && (referenceField.getOrderField().isPresent() || tableHasPrimaryKey(refObject.getTable().getName()))) { - return code.addStatement("$1L -> $1N.value2().map($2T::value2))", VAR_RECORD_ITERATOR, RECORD2.className).build(); - } - - return code.addStatement("$1L -> $1N.value2().map($2T::value1))", VAR_RECORD_ITERATOR, RECORD1.className).build(); - } - - return code.addStatement("$T::value2)", RECORD2.className).build(); - } - - private CodeBlock getPaginationFetchBlock() { - var code = CodeBlock.builder(); - - if (isRoot()) { - code - .add(".fetch()\n") - .addStatement(".map($1L -> new $2T<>($1N.value1(), $1N.value2()))", VAR_ITERATOR, IMMUTABLE_PAIR.className); - } else { - code - .add(".fetchMap(\n") - .indent() - .add("$T::value1,\n", RECORD2.className) - .add( - "$1L -> $1N.value2().map($2L -> $2N.value2() == null ? null : new $3T<>($2N.value1(), $2N.value2()))", - VAR_ITERATOR, - VAR_RECORD_ITERATOR, - IMMUTABLE_PAIR.className - ) - .unindent() - .addStatement(")"); - } - return code.build(); - } - - @Override - public List<MethodSpec> generateAll() { - return getLocalObject() - .getFields() - .stream() - .filter(it -> !processedSchema.isInterface(it) && !processedSchema.isUnion(it)) - .filter(it -> !it.getName().equals(FEDERATION_ENTITIES_FIELD.getName())) - .filter(it -> !processedSchema.isFederationService(it)) - .filter(GenerationSourceField::isGeneratedWithResolver) - .filter(it -> !it.hasServiceReference()) - .filter(it -> !processedSchema.isDeleteMutationWithReturning(it)) - .filter(it -> !processedSchema.isInsertMutationWithReturning(it)) - .map(this::generate) - .filter(it -> !it.code().isEmpty()) - .toList(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/FetchMultiTableDBMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/FetchMultiTableDBMethodGenerator.java deleted file mode 100644 index 003cd78252..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/FetchMultiTableDBMethodGenerator.java +++ /dev/null @@ -1,494 +0,0 @@ -package no.sikt.graphitron.generators.db; - -import no.sikt.graphitron.definitions.fields.GenerationSourceField; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.fields.VirtualSourceField; -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.definitions.mapping.Alias; -import no.sikt.graphitron.definitions.mapping.AliasWrapper; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.generators.context.FetchContext; -import no.sikt.graphitron.generators.context.InputParser; -import no.sikt.graphitron.javapoet.*; -import no.sikt.graphql.helpers.query.AfterTokenWithTypeName; -import no.sikt.graphql.schema.ProcessedSchema; -import org.apache.commons.lang3.StringUtils; -import org.jetbrains.annotations.NotNull; -import org.jooq.Field; -import org.jooq.SelectLimitPercentStep; -import org.jooq.SelectSeekStepN; - -import javax.lang.model.element.Modifier; -import java.util.*; -import java.util.stream.Stream; - -import static no.sikt.graphitron.configuration.GeneratorConfig.optionalSelectIsEnabled; -import static no.sikt.graphitron.configuration.GeneratorConfig.shouldMakeNodeStrategy; -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.*; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.*; -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.*; -import static no.sikt.graphitron.generators.db.FetchSingleTableInterfaceDBMethodGenerator.TOKEN; -import static no.sikt.graphitron.mappings.JavaPoetClassName.*; -import static no.sikt.graphitron.mappings.JavaPoetClassName.SELECT_JOIN_STEP; -import static no.sikt.graphitron.mappings.TableReflection.*; -import static no.sikt.graphql.naming.GraphQLReservedName.*; - -public class FetchMultiTableDBMethodGenerator extends FetchDBMethodGenerator { - public static final String - UNION_KEYS_QUERY = internalPrefix("unionKeysQuery"), - VAR_REPRESENTATIONS = inputPrefix(FEDERATION_REPRESENTATIONS_ARGUMENT.getName()), - VAR_FILTERED_REPRESENTATIONS = VAR_REPRESENTATIONS + "_filtered"; - public static final String TYPE_FIELD = "$type"; - public static final String DATA_FIELD = "$data"; - public static final String PK_FIELDS = "$pkFields"; - public static final String INNER_ROW_NUM = "$innerRowNum"; - private static final String ELEMENT_FIRST = ELEMENT_NAME + "0"; - private FetchContext initialContext; - - public FetchMultiTableDBMethodGenerator( - ObjectDefinition localObject, - ProcessedSchema processedSchema - ) { - super(localObject, processedSchema); - } - - @Override - public MethodSpec generate(ObjectField target) { - var inputParser = new InputParser(target, processedSchema); - - var unionOrInterfaceDefinition = processedSchema.isUnion(target) ? processedSchema.getUnion(target) : processedSchema.getInterface(target); - - // Order is important for paginated queries as it gets data fields by index in the mapping - var implementations = processedSchema.getTypesFromInterfaceOrUnion(unionOrInterfaceDefinition.getName()).orElse(List.of()); - - return getSpecBuilder(target, unionOrInterfaceDefinition.getGraphClassName(), inputParser) - .addCode(implementations.isEmpty() ? returnWrap("null") : getCode(target, implementations, inputParser.getMethodInputNames(false, false, true))) - .build(); - } - - @Override - protected CodeBlock getHelperMethodCallForNestedField(ObjectField field, FetchContext context) { - return null; - } - - private CodeBlock getCode(ObjectField target, List<ObjectDefinition> implementations, List<String> inputs) { - List<String> sortFieldQueryMethodCalls = new ArrayList<>(); - LinkedHashMap<String, String> mappedQueryVariables = new LinkedHashMap<>(); - var joins = CodeBlock.builder(); - var mappedDeclarationBlock = CodeBlock.builder(); - - if (target.createsDataFetcher()) { - initialContext = implementations - .stream() - .findFirst() - .map(it -> new FetchContext(processedSchema, new VirtualSourceField(it, target), localObject, false)) - .orElse(null); - } - - for (var implementation : implementations) { - String typeName = implementation.getName(); - sortFieldQueryMethodCalls.add(getSortFieldsMethodName(target, implementation)); - String mappedVariableName = joinStepPrefix(typeName); - mappedQueryVariables.put(typeName, mappedVariableName); - - var input = new ArrayList<String>(); - if (shouldMakeNodeStrategy()) input.add(VAR_NODE_STRATEGY); - if (optionalSelectIsEnabled()) input.add(VAR_SELECT); - - mappedDeclarationBlock.declare( - mappedVariableName, - "$N($L)", - getMappedMethodName(target, implementation), - String.join(", ", input) - ); - - joins.add("\n.leftJoin($N)\n.on($N.field($S, $T.class).eq($N.field($S, $T.class)))", - mappedVariableName, - UNION_KEYS_QUERY, PK_FIELDS, JSONB.className, - mappedVariableName, PK_FIELDS, JSONB.className); - } - - var unionQuery = getUnionQuery(sortFieldQueryMethodCalls, inputs, target.hasPagination()); - var multitableQuery = CodeBlock.builder() - .addIf(target.createsDataFetcher(), "$T", DSL.className) - .addIf(!target.createsDataFetcher(), "$N", VAR_CONTEXT) - .add(".select(") - .add(indentIfMultiline(wrapRow(createSelectBlock(mappedQueryVariables)))) - .add(".mapping($L)", createMappingContent(target, implementations, target.hasPagination())) - .add(")\n.from($L)", UNION_KEYS_QUERY) - .add(joins.build()) - .addIf(processedSchema.returnsList(target), "\n.orderBy($N.field($S), $N.field($S))", UNION_KEYS_QUERY, TYPE_FIELD, UNION_KEYS_QUERY, INNER_ROW_NUM) - .addIf(target.hasPagination(), "\n.limit($N + 1)\n", VAR_PAGE_SIZE) - .addIf(!processedSchema.returnsList(target), "\n.limit(2)\n") // So that we get a DataFetchingException on multiple rows, without fetching more than necessary - .build(); - - if (target.createsDataFetcher()) { - multitableQuery = processedSchema.returnsList(target) - ? wrapInMultiset(multitableQuery) - : wrapInField(multitableQuery); - } - - return CodeBlock.builder() - .declareIf(target.hasPagination(), TOKEN, () -> getTokenVariableDeclaration(implementations)) - .addIf(target.createsDataFetcher(), () -> createAliasDeclarations(initialContext.getAliasSet())) - .declare(UNION_KEYS_QUERY, unionQuery) - .add("\n") - .add(mappedDeclarationBlock.build()) - .add("\nreturn ") - .indent() - .addIf(target.createsDataFetcher(), "$N.select(\n", VAR_CONTEXT) - .indent() - .addIf(target.createsDataFetcher(), () -> getInitialKey(initialContext)) - .add(multitableQuery) - .unindent() - .addIf(target.createsDataFetcher(), "\n)") - .addIf(target.createsDataFetcher(), () -> CodeBlock.of("\n.from($L)\n", initialContext.renderQuerySource(getLocalTable()))) - .addIf(target.createsDataFetcher(), () -> formatWhereContents(initialContext, target.createsDataFetcher())) - .add(getFetchCodeBlock(target)) - .unindent() - .build(); - } - - private static @NotNull CodeBlock getTokenVariableDeclaration(List<ObjectDefinition> implementations) { - var map = mapOfEntries( - indentIfMultiline( - implementations.stream() - .map(impl -> mapEntry(impl.getName(), getPrimaryKeyFieldsWithTableAliasBlock(impl.getTable().getName()))) - .collect(CodeBlock.joining(",\n")) - ) - ); - - return CodeBlock.builder() - .add("$T.getOrderByValuesForMultitableInterface($N, \n", QUERY_HELPER.className, VAR_CONTEXT) - .indent() - .add("$L,\n$N)", map, inputPrefix(PAGINATION_AFTER.getName())) - .unindent() - .build(); - } - - private @NotNull CodeBlock getUnionQuery(List<String> subselectVariableNames, List<String> inputNames, boolean isConnection) { - var additionalInputs = new LinkedHashSet<String>(); - - Optional.ofNullable(initialContext) - .map(FetchContext::getAliasSet) - .stream() - .findFirst() - .ifPresent(it -> it.stream().map(AliasWrapper::getAlias).map(Alias::getMappingName).forEach(additionalInputs::add)); - - if (shouldMakeNodeStrategy()) { - additionalInputs.add(VAR_NODE_STRATEGY); - } - - if (isConnection) { - additionalInputs.add(VAR_PAGE_SIZE); - additionalInputs.add(TOKEN); - } - - var inputs = Stream.concat( - additionalInputs.stream(), - inputNames.stream()) - .map(CodeBlock::of).collect(CodeBlock.joining(", ")); - - return CodeBlock.of( - subselectVariableNames.stream() - .reduce("", (currString, element) -> - currString.isEmpty() ? String.format("%s(%s)", element, inputs) - : String.format("%s(%s)\n.unionAll(%s)", element, inputs, currString)) - ); - } - - private CodeBlock createSelectBlock(Map<String, String> mappedQueryVariables) { - return Stream.concat( - Stream.of(CodeBlock.of("$N.field($S, $T.class)", UNION_KEYS_QUERY, TYPE_FIELD, STRING.className)), - mappedQueryVariables.values().stream().map(it -> CodeBlock.of("$N.field($S)", it, DATA_FIELD)) - ).collect(CodeBlock.joining(",\n")); - } - - private CodeBlock getFetchCodeBlock(ObjectField target) { - var isList = processedSchema.returnsList(target); - if (target.createsDataFetcher()) { - return CodeBlock - .builder() - .add(".fetchMap(") - .addIf(!isList, indentIfMultiline(CodeBlock.of("$1T::value1, $1T::value2", RECORD2.className))) - .addIf(isList, indentIfMultiline(CodeBlock.of("$1T::value1,\n$2L -> $2L.value2().map($3T::value1)", RECORD2.className, VAR_RECORD_ITERATOR, RECORD1.className))) - .addStatement(")") - .build(); - } - - return CodeBlock.statementOf(".$L($T::value1)", - isList ? "fetch" : "fetchOne", - RECORD1.className); - } - - private CodeBlock createMappingContent(GenerationSourceField<?> target, List<ObjectDefinition> implementations, boolean isConnection) { - var interfaceClassName = processedSchema.getRecordType(target).getGraphClassName(); - var lambdaParameters = new LinkedHashMap<String, String>(); - - var index = 1; - for (ObjectDefinition implementation : implementations) { - lambdaParameters.put(implementation.getName(), ELEMENT_NAME + index); - index++; - } - - var code = CodeBlock.builder() - .indent() - .add("($L, $L) -> ", ELEMENT_FIRST, lambdaParameters.values().stream().map(CodeBlock::of).collect(CodeBlock.joining(", "))) - .beginControlFlowIf(isConnection) - .addIf(isConnection, "$T $N = ", RECORD2.className, VAR_RESULT) - .beginControlFlow("switch ($N)", ELEMENT_FIRST); - - var classToCastTo = isConnection ? RECORD2.className : interfaceClassName; - - implementations.forEach(implementation -> - code.addStatement("case $S -> ($T) $N", implementation.getName(), classToCastTo, lambdaParameters.get(implementation.getName())) - ); - - return code.add("default -> \n") - .indent() - .add( - "throw new $T($T.format($S, \"$T\", $N));\n", - RuntimeException.class, - STRING.className, - "Querying multitable interface/union '%s' returned unexpected typeName '%s'", - interfaceClassName, - ELEMENT_FIRST - ) - .unindent() - .endControlFlowIf(!isConnection) - .endControlFlowAsStatementIf(isConnection) - .addStatementIf(isConnection, "return $T.of($N.get(0, $T.class), $N.get(1, $T.class))", - PAIR.className, VAR_RESULT, STRING.className, VAR_RESULT, interfaceClassName) - .endControlFlowIf(isConnection) - .unindent() - .build(); - } - - public List<MethodSpec> generateWithSubselectMethods(ObjectField target) { - var mainMethod = generate(target); - var methodInputs = new InputParser(target, processedSchema).getMethodParameterSpecs(false, false, true); - var unionOrInterfaceDefinition = processedSchema.isUnion(target) - ? processedSchema.getUnion(target) - : processedSchema.getInterface(target); - - return Stream.concat( - Stream.of(mainMethod), - processedSchema - .getTypesFromInterfaceOrUnion(unionOrInterfaceDefinition.getName()).orElse(List.of()) - .stream() - .map(it -> getMethodsForImplementation(target, it, methodInputs)) - .flatMap(Collection::stream) - ).toList(); - } - - private List<MethodSpec> getMethodsForImplementation(ObjectField target, ObjectDefinition implementation, List<ParameterSpec> methodInputs) { - var virtualTarget = new VirtualSourceField(implementation, target); - var context = new FetchContext(processedSchema, virtualTarget, localObject, true); - var refContext = virtualTarget.createsDataFetcher() ? context.nextContext(virtualTarget) : context; - - return List.of(getSortFieldsMethod(target, implementation, refContext, methodInputs), getMappedMethod(target, implementation)); - } - - private MethodSpec getSortFieldsMethod(ObjectField target, ObjectDefinition implementation, FetchContext context, List<ParameterSpec> methodInputs) { - var methodBuilder = MethodSpec - .methodBuilder(getSortFieldsMethodName(target, implementation)) - .addModifiers(Modifier.PRIVATE, Modifier.STATIC) - .returns(getReturnTypeForKeysMethod(target.hasPagination(), !processedSchema.returnsList(target))) - .addCode(getSortFieldsMethodCode(implementation, context, target)); - - if (target.createsDataFetcher()) { - Optional.ofNullable(initialContext) - .flatMap(it -> it.getAliasSet().stream().findFirst()) - .ifPresent(startAlias -> - methodBuilder.addParameter( - getTableClass(startAlias.getAlias().getTable().getName()).orElseThrow(), - aliasPrefix(startAlias.getAlias().getMappingName()) - ) - ); - } - return methodBuilder - .addParameterIf(shouldMakeNodeStrategy(), NODE_ID_STRATEGY.className, VAR_NODE_STRATEGY) - .addParameterIf(target.hasPagination(), Integer.class, VAR_PAGE_SIZE) - .addParameterIf(target.hasPagination(), AfterTokenWithTypeName.class, TOKEN) - .addParameters(methodInputs) - .build(); - } - - private MethodSpec getMappedMethod(ObjectField target, ObjectDefinition implementation) { - var mappedContext = new FetchContext(processedSchema, new VirtualSourceField(implementation), processedSchema.getQueryType(), false); - return MethodSpec - .methodBuilder(getMappedMethodName(target, implementation)) - .addModifiers(Modifier.PRIVATE, Modifier.STATIC) - .returns(target.hasPagination() ? - getReturnTypeForMappedConnectionMethod(implementation.getGraphClassName()) - : getReturnTypeForMappedMethod(implementation.getGraphClassName())) - .addCode(getMappedMethodCode(target, implementation, mappedContext)) - .addParameterIf(shouldMakeNodeStrategy(), NODE_ID_STRATEGY.className, VAR_NODE_STRATEGY) - .addParameterIf(optionalSelectIsEnabled(), SELECTION_SET.className, VAR_SELECT) - .build(); - } - - private CodeBlock getMappedMethodCode(ObjectField target, ObjectDefinition implementation, FetchContext context) { - var code = CodeBlock.builder(); - var querySource = context.renderQuerySource(getLocalTable()); - var selectCode = generateSelectRow(context); - - return code - .add(createAliasDeclarations(context.getAliasSet())) - .add("return $T.select(\n", DSL.className) - .indent() - .add(getPrimaryKeyFieldsArray(implementation.getName(), querySource.toString(), context.getTargetTable().getName())) - .add(".as($S),\n$T.field(\n", PK_FIELDS, DSL.className) - .indent() - .addIf(target.hasPagination(), "$1T.select(\n$1T.row(\n", DSL.className) - .addIf(target.hasPagination(), () -> - CodeBlock.of("$T.getOrderByTokenForMultitableInterface($L, $L, $S),\n", - QUERY_HELPER.className, context.getTargetAlias(), getPrimaryKeyFieldsWithTableAliasBlock(context.getTargetAlias()), implementation.getName())) - .add("$T.select($L)", DSL.className, indentIfMultiline(selectCode)) - .unindent() - .addIf(target.hasPagination(), ")\n)\n") - .add("\n).as($S))", DATA_FIELD) - .add("\n.from($L);", querySource) - .unindent() - .build(); - } - - private CodeBlock getSortFieldsMethodCode(ObjectDefinition implementation, FetchContext context, ObjectField queryTarget) { - var targetAlias = context.getTargetAlias(); - var whereBlock = formatWhereContents(context, false); - String implName = implementation.getName(); - - // When first reference step is a condition reference without key, we need to join explicitly - // Otherwise, the first join is implicit via the jOOQ key path and can be skipped for cleaner code. - var firstReferenceStep = context.getReferenceObjectField().getFieldReferences().stream().findFirst(); - var hasConditionReferenceAsFirstStep = queryTarget.createsDataFetcher() - && firstReferenceStep.map(it -> it.hasTableCondition() && !it.hasKey()).orElse(false); - - boolean returnsList = processedSchema.returnsList(queryTarget); - - return CodeBlock.builder() - // Skip first alias declaration for resolvers - it's already declared in main method and passed to helpers - .add(createAliasDeclarations(context.getAliasSet(), queryTarget.createsDataFetcher())) - .declareIf(returnsList, VAR_ORDER_FIELDS, getPrimaryKeyFieldsWithTableAliasBlock(targetAlias)) - .add("return $T.select(\n", DSL.className) - .indent() - .indent() - .indent() - .indent() - .add("$T.inline($S).as($S)", DSL.className, implName, TYPE_FIELD) - .addIf(returnsList, - ",\n$T.rowNumber().over($T.orderBy($L)).as($S)", DSL.className, DSL.className, VAR_ORDER_FIELDS, INNER_ROW_NUM) - .add(",\n") - .add(getPrimaryKeyFieldsArray(implName, targetAlias, context.getTargetTable().getName())) - .add(".as($S)", PK_FIELDS) - .unindent() - .unindent() - .add("\n)\n.from($N)\n", context.getSourceAlias()) - .add(createSelectJoins(context.getJoinSet(), !hasConditionReferenceAsFirstStep)) - .add(whereBlock) - .add("\n") - .add(createSelectConditions(context.getConditionList(), !whereBlock.isEmpty())) - .addIf( - queryTarget.hasPagination(), - ".$1L($2N == null ? $3L : $4T.inline($5S).greaterOrEqual($2N.typeName()))\n" + - ".and($2N != null && $2N.matches($5S) ? $4T.row($6L).gt($4T.row($2N.fields())) : $3L)", - whereBlock.isEmpty() ? "where" : "and", - TOKEN, - noCondition(), - DSL.className, - implementation.getName(), - getPrimaryKeyFieldsWithTableAliasBlock(targetAlias) - ) - .addIf(returnsList, ".orderBy($L)", VAR_ORDER_FIELDS) - .addIf(queryTarget.hasPagination(), "\n.limit($N + 1)", VAR_PAGE_SIZE) - .addIf(!returnsList, "\n.limit(2)") // So that we get a DataFetchingException on multiple rows, without fetching more than necessary - .addStatement("") - .unindent() - .unindent() - .build(); - } - - private static CodeBlock getPrimaryKeyFieldsArray(String name, String alias, String tableName) { - return CodeBlock.of("$T.jsonbArray($T.inline($S), $L)", DSL.className, DSL.className, name, getPrimaryKeyFields(tableName, alias)); - } - - private static CodeBlock getPrimaryKeyFields(String tableName, String alias) { - var code = CodeBlock.builder(); - - getPrimaryKeyForTable(tableName) - .map(pk -> pk - .getFields() - .stream().map(Field::getName) - .map(it -> CodeBlock.of("$N.$L", alias, it.toUpperCase())) - .toList() - ).ifPresent(it -> code.add(CodeBlock.join(", ", it))); - - return code.build(); - } - - private static @NotNull String getMappedMethodName(ObjectField target, ObjectDefinition implementation) { - return String.format("%sFor%s", implementation.getName().toLowerCase(), StringUtils.capitalize(target.getName())); - } - - private static @NotNull String getSortFieldsMethodName(ObjectField target, ObjectDefinition implementation) { - return String.format("%sSortFieldsFor%s", implementation.getName().toLowerCase(), StringUtils.capitalize(target.getName())); - } - - private static ParameterizedTypeName getReturnTypeForMappedMethod(ClassName implementationClassName) { - return ParameterizedTypeName.get(SELECT_JOIN_STEP.className, - ParameterizedTypeName.get(RECORD2.className, - JSONB.className, - implementationClassName) - ); - } - - private static ParameterizedTypeName getReturnTypeForMappedConnectionMethod(ClassName implementationClassName) { - return ParameterizedTypeName.get(SELECT_JOIN_STEP.className, - ParameterizedTypeName.get(RECORD2.className, - JSONB.className, - ParameterizedTypeName.get(RECORD2.className, - ParameterizedTypeName.get(SELECT_FIELD.className, STRING.className), - ParameterizedTypeName.get(SELECT_SELECT_STEP.className, - ParameterizedTypeName.get(RECORD1.className, - implementationClassName - ) - ) - ) - ) - ); - } - - private static ParameterizedTypeName getReturnTypeForKeysMethod(boolean isConnection, boolean returnsSingleObject) { - if (returnsSingleObject) { - return ParameterizedTypeName.get( - ClassName.get(SelectLimitPercentStep.class), - ParameterizedTypeName.get(RECORD2.className, - STRING.className, - JSONB.className) - ); - } - - return ParameterizedTypeName.get( - ClassName.get(isConnection ? SelectLimitPercentStep.class : SelectSeekStepN.class), - ParameterizedTypeName.get(RECORD3.className, - STRING.className, - INTEGER.className, - JSONB.className) - ); - } - - @Override - public List<MethodSpec> generateAll() { - return getLocalObject() - .getFields() - .stream() - .filter(processedSchema::isMultiTableField) - .filter(it -> !it.getName().equals(FEDERATION_ENTITIES_FIELD.getName())) - .filter(it -> !it.getTypeName().equals(NODE_TYPE.getName())) - .filter(GenerationField::isGeneratedWithResolver) - .filter(it -> !it.hasServiceReference()) - .flatMap(it -> generateWithSubselectMethods(it).stream()) - .filter(it -> !it.code().isEmpty()) - .toList(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/FetchNodeImplementationDBMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/FetchNodeImplementationDBMethodGenerator.java deleted file mode 100644 index b3bf42efaa..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/FetchNodeImplementationDBMethodGenerator.java +++ /dev/null @@ -1,117 +0,0 @@ -package no.sikt.graphitron.generators.db; - -import no.sikt.graphitron.definitions.fields.AbstractField; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.fields.VirtualSourceField; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.generators.codebuilding.VariableNames; -import no.sikt.graphitron.generators.context.FetchContext; -import no.sikt.graphitron.generators.context.InputParser; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphql.directives.GenerationDirective; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.Comparator; -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.configuration.GeneratorConfig.optionalSelectIsEnabled; -import static no.sikt.graphitron.configuration.GeneratorConfig.shouldMakeNodeStrategy; -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.*; -import static no.sikt.graphitron.generators.codebuilding.NameFormat.asNodeQueryName; -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.getStringSetTypeName; -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.wrapStringMap; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_NODE_STRATEGY; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_SELECT; -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.inputPrefix; -import static no.sikt.graphitron.mappings.JavaPoetClassName.RECORD2; -import static no.sikt.graphitron.mappings.JavaPoetClassName.SELECTION_SET; -import static no.sikt.graphitron.validation.ValidationHandler.addErrorMessageAndThrow; -import static no.sikt.graphql.naming.GraphQLReservedName.NODE_TYPE; - -/** - * Generator that creates the data fetching methods for interface implementations, e.g. queries used by the node resolver. - */ -public class FetchNodeImplementationDBMethodGenerator extends FetchDBMethodGenerator { - private final Set<ObjectField> objectFieldsReturningNode; - - public FetchNodeImplementationDBMethodGenerator( - ObjectDefinition localObject, - ProcessedSchema processedSchema, - Set<ObjectField> objectFieldsReturningNode - ) { - super(localObject, processedSchema); - this.objectFieldsReturningNode = objectFieldsReturningNode; - } - - @Override - public MethodSpec generate(ObjectField target) { - var implementation = getLocalObject(); - var implementationTableObject = implementation.getTable(); - if (implementationTableObject == null) { - addErrorMessageAndThrow("Type %s needs to have the @%s directive set to be able to implement interface %s", - implementation.getName(), GenerationDirective.TABLE.getName(), NODE_TYPE.getName()); - } - - var virtualReference = new VirtualSourceField(getLocalObject(), target.getTypeName()); - var context = new FetchContext(processedSchema, virtualReference, implementation, false); - - var argument = target.getArguments().get(0); - var argumentName = inputPrefix(argument.getName()); - var querySource = context.renderQuerySource(implementationTableObject); - - var parser = new InputParser(virtualReference, processedSchema); - var methodInputs = parser.getMethodInputNames(true, false, true); - if (shouldMakeNodeStrategy()) methodInputs.add(0, VAR_NODE_STRATEGY); - if (optionalSelectIsEnabled()) methodInputs.add(VAR_SELECT); - var selectBlock = CodeBlock.of("$L($L)", generateHelperMethodName(virtualReference), String.join(", ", methodInputs)); - - CodeBlock id; - CodeBlock whereCondition; - if (shouldMakeNodeStrategy()) { - var nodeConfiguration = processedSchema.getNodeConfigurationForTypeOrThrow(localObject); - id = CodeBlock.of("$L,\n$L", createNodeIdBlock(nodeConfiguration, context.getTargetAlias()), selectBlock); - whereCondition = hasNodeIdOrIdsBlock(CodeBlock.of(argumentName), nodeConfiguration, context.getTargetAlias(), true); - } else { - var hasOrIn = argument.isID() - ? CodeBlock.of("hasIds") - : CodeBlock.of("$L.in", implementation.getFieldByName(argument.getName()).getUpperCaseName()); - - id = CodeBlock.of("$L.getId(),\n$L", querySource, selectBlock); - whereCondition = CodeBlock.of("$L.$L($N)", querySource, hasOrIn, argumentName); - } - - return getDefaultSpecBuilder(asNodeQueryName(implementation.getName()), wrapStringMap(implementation.getGraphClassName())) - .addParameter(getStringSetTypeName(), argumentName) - .addParameter(SELECTION_SET.className, VAR_SELECT) - .addCode(createAliasDeclarations(context.getAliasSet())) - .addCode("return $N\n", VariableNames.VAR_CONTEXT) - .indent() - .indent() - .addCode(".select($L)\n", indentIfMultiline(id)) - .addCode(".from($L)\n", querySource) - .addCode(createSelectJoins(context.getJoinSet())) - .addCode(".where($L)\n", whereCondition) - .addCode(createSelectConditions(context.getConditionList(), true)) - .addStatement( - ".$L($T::value1, $T::value2)", - (!target.isIterableWrapped() ? "fetchMap" : "fetchGroups"), - RECORD2.className, - RECORD2.className - ) - .unindent() - .unindent() - .build(); - } - - @Override - public List<MethodSpec> generateAll() { - return objectFieldsReturningNode - .stream() - .filter(entry -> getLocalObject().implementsInterface(NODE_TYPE.getName())) - .sorted(Comparator.comparing(AbstractField::getName)) - .map(this::generate) - .toList(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/FetchSingleTableInterfaceDBMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/FetchSingleTableInterfaceDBMethodGenerator.java deleted file mode 100644 index 4984ba140a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/FetchSingleTableInterfaceDBMethodGenerator.java +++ /dev/null @@ -1,286 +0,0 @@ -package no.sikt.graphitron.generators.db; - -import no.sikt.graphitron.definitions.fields.GenerationSourceField; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.fields.VirtualSourceField; -import no.sikt.graphitron.definitions.interfaces.FieldSpecification; -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.definitions.mapping.MethodMapping; -import no.sikt.graphitron.definitions.objects.InterfaceDefinition; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.generators.codebuilding.VariableNames; -import no.sikt.graphitron.generators.context.FetchContext; -import no.sikt.graphitron.generators.context.InputParser; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphql.schema.ProcessedSchema; -import org.jetbrains.annotations.NotNull; - -import java.util.*; -import java.util.stream.Collectors; - -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.indentIfMultiline; -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.keyAsTableRecordWithQueryHelper; -import static no.sikt.graphitron.generators.codebuilding.KeyWrapper.getKeyForResolverFieldOrThrow; -import static no.sikt.graphitron.generators.codebuilding.KeyWrapper.getKeySetForResolverFields; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_ITERATOR; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_ORDER_FIELDS; -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.internalPrefix; -import static no.sikt.graphitron.mappings.JavaPoetClassName.*; -import static no.sikt.graphql.naming.GraphQLReservedName.NODE_TYPE; -import static org.apache.commons.lang3.StringUtils.capitalize; - -public class FetchSingleTableInterfaceDBMethodGenerator extends FetchDBMethodGenerator { - public static final String - DISCRIMINATOR = internalPrefix("discriminator"), - DISCRIMINATOR_VALUE = internalPrefix("discriminatorValue"), - TOKEN = internalPrefix("token"), - DATA = internalPrefix("data"), - INNER_DATA = internalPrefix("innerData"); - - public FetchSingleTableInterfaceDBMethodGenerator( - ObjectDefinition localObject, - ProcessedSchema processedSchema - ) { - super(localObject, processedSchema); - } - - @Override - public MethodSpec generate(ObjectField target) { - var parser = new InputParser(target, processedSchema); - - var interfaceDefinition = processedSchema.getInterface(target); - var implementations = processedSchema.getImplementationsForInterface(interfaceDefinition); - - return getSpecBuilder(target, interfaceDefinition.getGraphClassName(), parser) - .addCode(implementations.isEmpty() ? CodeBlock.of("return null;") : getCode(target, implementations)) - .build(); - } - - private CodeBlock getCode(ObjectField target, List<ObjectDefinition> implementations) { - var context = new FetchContext(processedSchema, target, getLocalObject(), false); - var overriddenFields = getFieldsOverriddenByType(processedSchema.getInterface(target), implementations); - var selectCode = generateSelectRow(context, target, implementations, overriddenFields); - var querySource = context.getTargetAlias(); - var whereBlock = formatWhereContents(context, target.createsDataFetcher()); - var fetchAndMap = fetchAndMap(target, implementations, querySource, overriddenFields, context); - var orderFields = createOrderFieldsDeclarationBlock(target, context.getTargetAlias(), context.getTargetTableName()); - - return CodeBlock.builder() - .add(createAliasDeclarations(context.getAliasSet())) - .add(orderFields) - .add("return $N.select($L)", VariableNames.VAR_CONTEXT, indentIfMultiline(selectCode)) - .add("\n.from($L)\n", querySource) - .add(createSelectJoins(context.getJoinSet())) - .add("\n") - .add(whereBlock) - .addIf(!orderFields.isEmpty(), ".orderBy($L)", VAR_ORDER_FIELDS) - .addIf(target.hasForwardPagination(), this::createSeekAndLimitBlock) - .add(fetchAndMap) - .build(); - } - - @Override - protected CodeBlock getHelperMethodCallForNestedField(ObjectField field, FetchContext context) { - return null; - } - - private @NotNull HashMap<String, Set<String>> getFieldsOverriddenByType(InterfaceDefinition targetInterface, List<ObjectDefinition> implementations) { - HashMap<String, Set<String>> overriddenFields = new HashMap<>(); - - // Find overridden interface fields - implementations.forEach(implementation -> { - Set<String> overriddenFieldNames = new HashSet<>(); - - for (var implField : implementation.getFields()) { - Optional.ofNullable(targetInterface.getFieldByName(implField.getName())) - .filter(interfaceField -> hasDifferentFieldConfiguration(implField, interfaceField)) - .ifPresent(interfaceField -> overriddenFieldNames.add(implField.getName())); - } - overriddenFields.put(implementation.getName(), overriddenFieldNames); - } - ); - - // Find overridden non-interface fields - for (int i = 0; i < implementations.size(); i++) { - for (int j = i + 1; j < implementations.size(); j++) { - compareNonInterfaceFields(implementations.get(i), implementations.get(j), targetInterface, overriddenFields); - } - } - return overriddenFields; - } - - private void compareNonInterfaceFields(ObjectDefinition implA, ObjectDefinition implB, InterfaceDefinition targetInterface, HashMap<String, Set<String>> overriddenFields) { - implA.getFields() - .stream() - .filter(it -> !targetInterface.hasField(it.getName()) && implB.hasField(it.getName())) - .forEach(field -> { - if (hasDifferentFieldConfiguration(field, implB.getFieldByName(field.getName()))) { - overriddenFields.computeIfAbsent(implA.getName(), k -> new HashSet<>()).add(field.getName()); - overriddenFields.computeIfAbsent(implB.getName(), k -> new HashSet<>()).add(field.getName()); - } - } - ); - } - - private boolean hasDifferentFieldConfiguration(ObjectField fieldA, ObjectField fieldB) { - var fieldDirectiveDiffers = !fieldA.getUpperCaseName().equals(fieldB.getUpperCaseName()); - var isNodeIdField = processedSchema.isNodeIdField(fieldA) || processedSchema.isNodeIdField(fieldB); - return fieldDirectiveDiffers || isNodeIdField; - } - - protected CodeBlock generateSelectRow(FetchContext context, ObjectField target, List<ObjectDefinition> implementations, HashMap<String, Set<String>> overriddenFields) { - List<GenerationField> allFields = new LinkedList<>(); - - context.getReferenceObject() - .getFields() - .stream() - .filter(it -> !processedSchema.isExceptionOrExceptionUnion(it)) - .filter(it -> !implementations.stream() - .allMatch(impl -> isOverriddenField(overriddenFields, impl.getName(), it))) - .forEach(allFields::add); - - implementations.forEach(impl -> - impl.getFields() - .stream() - .filter(f -> - isOverriddenField(overriddenFields, impl.getName(), f) - || allFields.stream().map(FieldSpecification::getName).noneMatch(it -> it.equals(f.getName()))) - .forEach(allFields::add)); - - - var rowElements = new ArrayList<CodeBlock>(); - - getKeySetForResolverFields(allFields, processedSchema) - .forEach(key -> - rowElements.add( - CodeBlock.of("$L.as($S)", - keyAsTableRecordWithQueryHelper(key.key(), context.getTargetTableName(), context.getTargetAlias()), - key.key().getName())) - ); - - rowElements.add(CodeBlock.of("$L.$N.as($S)", - context.getTargetAlias(), processedSchema.getInterface(target).getDiscriminatorFieldName(), DISCRIMINATOR)); - - if (target.hasForwardPagination()) { - rowElements.add(CodeBlock.of("$T.getOrderByToken($L, $L).as($S)", - QUERY_HELPER.className, context.getTargetAlias(), VAR_ORDER_FIELDS, TOKEN)); - } - - allFields.stream().filter(it -> !it.createsDataFetcher()) - .forEach(field -> { - var isOverriddenField = isOverriddenField(overriddenFields, field.getContainerTypeName(), field); - var fieldAlias = field.getName(); - var fieldContext = context; - if (isOverriddenField) { - fieldAlias = getOverriddenFieldAlias(processedSchema.getObject(field.getContainerTypeName()), fieldAlias); - var virtualField = new VirtualSourceField(field.getContainerTypeName(), (ObjectField) field); - fieldContext = context.forVirtualField(virtualField); - } - rowElements.add(CodeBlock.of("$L.as($S)", getSelectCode(field, fieldContext), fieldAlias)); - }); - return CodeBlock.join(",\n", rowElements); - } - - private CodeBlock fetchAndMap(ObjectField target, List<ObjectDefinition> implementations, String querySource, HashMap<String, Set<String>> overriddenFields, FetchContext context) { - var interfaceDefinition = processedSchema.getInterface(target); - - var returnInsideIfBlock = !target.hasForwardPagination(); - var mapping = CodeBlock.builder() - .indent() - .beginControlFlow("$N -> ", VAR_ITERATOR) - .declare( - DISCRIMINATOR_VALUE, - "$N.get($S, $L.$L.getConverter())", - VAR_ITERATOR, DISCRIMINATOR, querySource, interfaceDefinition.getDiscriminatorFieldName() - ) - .declareIf(!returnInsideIfBlock, TOKEN, CodeBlock.of("$N.get($S, $T.class)", VAR_ITERATOR, TOKEN, STRING.className)) - .addStatementIf(!returnInsideIfBlock, "$T $N", interfaceDefinition.getGraphClassName(), DATA); - - boolean isFirst = true; - var innerVariableName = returnInsideIfBlock ? DATA : INNER_DATA; - - for (var implementation : implementations) { - var overriddenFieldsForImpl = getOverriddenFieldsForImplementation(overriddenFields, implementation.getName()); - var resolverFieldsForImpl = implementation.getFields().stream().filter(GenerationSourceField::createsDataFetcher).toList(); - var needToManuallySetFields = !overriddenFieldsForImpl.isEmpty() || !resolverFieldsForImpl.isEmpty(); - var needInnerDataVariable = !returnInsideIfBlock && needToManuallySetFields; - - var intoBlock = CodeBlock.of("$N.into($T.class)", VAR_ITERATOR, implementation.getGraphClassName()); - - mapping.addIf(!isFirst, "else ") - .beginControlFlow("if ($N.equals($S))", DISCRIMINATOR_VALUE, implementation.getDiscriminator()) - .addStatementIf(!needToManuallySetFields && returnInsideIfBlock, "return $L", intoBlock) - .addStatementIf(!needToManuallySetFields && !returnInsideIfBlock, "$N = $L", DATA, intoBlock) - .declareIf(needToManuallySetFields, innerVariableName, intoBlock); - - overriddenFieldsForImpl.forEach( - it -> { - var field = implementation.getFieldByName(it); - var converterBlock = processedSchema.isNodeIdField(field) - ? CodeBlock.of("$T.class", STRING.className) - : CodeBlock.of("$N.$L.getConverter()", context.getTargetAlias(), field.getUpperCaseName()); - - mapping.addStatement("$N.set$L($N.get($S, $L))", innerVariableName, capitalize(it), VAR_ITERATOR, getOverriddenFieldAlias(implementation, it), converterBlock); - } - ); - - resolverFieldsForImpl.forEach( - it -> { - var key = getKeyForResolverFieldOrThrow(it, processedSchema); - mapping.add("$N$L", - innerVariableName, - (new MethodMapping(it.getName())).asSetKeyCall(CodeBlock.of("$N.get($S, $T.class)", VAR_ITERATOR, key.key().getName(), key.getTypeName())) - ); - } - ); - - mapping.addStatementIf(needInnerDataVariable, "$N = $N", DATA, INNER_DATA) - .addStatementIf(returnInsideIfBlock && needToManuallySetFields, "return $N", innerVariableName) - .endControlFlow(); - isFirst = false; - } - mapping.beginControlFlow("else") - .add("throw new $T($T.format($S, \"$T\", $N));\n", - RuntimeException.class, - String.class, - "Querying interface '%s' returned row with unexpected discriminator value '%s'", - interfaceDefinition.getGraphClassName(), - DISCRIMINATOR_VALUE) - .endControlFlow() - .addStatementIf(target.hasForwardPagination(), "return $T.of($N, $N)", PAIR.className, TOKEN, DATA) - .endControlFlow() - .unindent(); - - return CodeBlock.of("\n.$L(\n$L\n);", - target.isIterableWrapped() || target.hasForwardPagination() ? "fetch" : "fetchOne", - mapping.build()); - } - - private static @NotNull String getOverriddenFieldAlias(ObjectDefinition implementation, String it) { - return implementation.getDiscriminator() + "_" + it; - } - - private static boolean isOverriddenField(HashMap<String, Set<String>> overriddenFieldMap, String typeName, GenerationField field) { - return getOverriddenFieldsForImplementation(overriddenFieldMap, typeName).contains(field.getName()); - } - - private static Set<String> getOverriddenFieldsForImplementation(HashMap<String, Set<String>> overriddenFieldMap, String typeName) { - return overriddenFieldMap.getOrDefault(typeName, Set.of()); - } - - @Override - public List<MethodSpec> generateAll() { - return getLocalObject() - .getFields() - .stream() - .filter(processedSchema::isInterface) - .filter(it -> !it.getTypeName().equals(NODE_TYPE.getName())) - .filter(processedSchema::isSingleTableInterface) - .filter(GenerationField::isGeneratedWithResolver) - .filter(it -> !it.hasServiceReference()) - .map(this::generate) - .filter(it -> !it.code().isEmpty()) - .collect(Collectors.toList()); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/FetchTableRecordDBMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/FetchTableRecordDBMethodGenerator.java deleted file mode 100644 index f3498613bd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/FetchTableRecordDBMethodGenerator.java +++ /dev/null @@ -1,88 +0,0 @@ -package no.sikt.graphitron.generators.db; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.fields.VirtualTableRecordField; -import no.sikt.graphitron.definitions.fields.containedtypes.MutationType; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.generators.abstractions.DBMethodGenerator; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphitron.javapoet.ParameterizedTypeName; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.Collection; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.inResolverKeysBlock; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_CONTEXT; -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.internalPrefix; -import static no.sikt.graphitron.mappings.TableReflection.getRecordClass; -import static no.sikt.graphitron.mappings.TableReflection.getTableJavaFieldNameByTableName; - -/** - * Generator that creates methods for fetching existing table records by primary key. - * Used in store-based upserts to retrieve current DB state before mutating data. - */ -public class FetchTableRecordDBMethodGenerator extends DBMethodGenerator<VirtualTableRecordField> { - - public static final String PRIMARY_KEYS = "primaryKeys"; - - public FetchTableRecordDBMethodGenerator(ObjectDefinition localObject, ProcessedSchema processedSchema) { - super(localObject, processedSchema); - } - - /** - * @param target A {@link VirtualTableRecordField} identifying the table to fetch records from. - * @return A method that fetches records from the target table matching the primary keys of the input records. - */ - @Override - public MethodSpec generate(VirtualTableRecordField target) { - var tableJavaName = getTableJavaFieldNameByTableName(target.tableName()).orElse(target.tableName()); - var recordClass = getRecordClass(target.tableName()).orElseThrow(); - var methodName = getMethodName(recordClass.getSimpleName()); - - var code = CodeBlock.builder() - .add("return $N.selectFrom($N)\n", VAR_CONTEXT, tableJavaName) - .indent() - .indent() - .add(".where($L)\n", inResolverKeysBlock(internalPrefix(PRIMARY_KEYS), tableJavaName)) - .addStatement(".fetch()") - .unindent() - .unindent() - .build(); - - - return getDefaultSpecBuilder(methodName, ParameterizedTypeName.get(List.class, recordClass), true) - .addParameter(ParameterizedTypeName.get(List.class, recordClass), internalPrefix(PRIMARY_KEYS)) - .addCode(code) - .build(); - } - - /** - * @return The generated method name for fetching records of the given type, e.g. {@code "fetchCustomerRecords"}. - */ - public static String getMethodName(String recordClassName) { - return "fetch" + recordClassName + "s"; - } - - @Override - public List<MethodSpec> generateAll() { - if (GeneratorConfig.generateUpsertAsStore()) { - Set<String> tablesWithUpsert = localObject.getFields().stream() - .filter(ObjectField::hasMutationType) - .filter(it -> it.getMutationType().equals(MutationType.UPSERT)) - .map(processedSchema::findInputTables) - .flatMap(Collection::stream) - .map(it -> it.getTable().getName()) - .collect(Collectors.toSet()); - - return tablesWithUpsert.stream() - .map(it -> generate(new VirtualTableRecordField(it))) - .toList(); - } - return List.of(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/NestedFetchDBMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/NestedFetchDBMethodGenerator.java deleted file mode 100644 index acea9a51b7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/NestedFetchDBMethodGenerator.java +++ /dev/null @@ -1,415 +0,0 @@ -package no.sikt.graphitron.generators.db; - - -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.fields.VirtualSourceField; -import no.sikt.graphitron.definitions.interfaces.RecordObjectSpecification; -import no.sikt.graphitron.definitions.mapping.Alias; -import no.sikt.graphitron.definitions.mapping.AliasWrapper; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.generators.context.FetchContext; -import no.sikt.graphitron.generators.context.InputParser; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphitron.javapoet.ParameterSpec; -import no.sikt.graphitron.javapoet.ParameterizedTypeName; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.*; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - -import static javax.lang.model.element.Modifier.PRIVATE; -import static javax.lang.model.element.Modifier.STATIC; -import static no.sikt.graphitron.configuration.GeneratorConfig.optionalSelectIsEnabled; -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.returnWrap; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.*; -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.inputPrefix; -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.prefixName; -import static no.sikt.graphitron.mappings.JavaPoetClassName.*; - -/** - * Abstract base class for generators that create nested helper methods for database query generation. - * <p> - * This class provides the infrastructure and logic for generating private static helper methods that - * extract SelectField row mapping logic for record types. Helper methods improve compilation performance - * by reducing method complexity and enable reuse of mapping logic across different query contexts. - * <p> - * Subclasses (like {@link FetchMappedObjectDBMethodGenerator}) extend this to generate the main query - * methods while inheriting all helper method generation capabilities and shared state management. - * - * <p><b>Helper Method Generation Rules:</b></p> - * <ul> - * <li>Helper methods are generated for record types with tables, list fields, or fields with @reference</li> - * <li>Error types (marked with @error) never generate helpers</li> - * <li>Split queries receive the target table as a parameter</li> - * <li>Other fields receive base table parameters with alias declarations in the method body</li> - * <li>Only aliases actually referenced in the generated SELECT are declared</li> - * <li>Circular references are detected and prevented using visited type tracking</li> - * <li>Input parameters are omitted from split query helpers (applied at main method level)</li> - * </ul> - * - * <p><b>Special Patterns:</b></p> - * <ul> - * <li><b>Container Pattern</b> - At depth 0, non-table types with input arguments traverse directly - * to nested fields without generating a helper (e.g., FilmContainer wrapping Film query)</li> - * <li><b>Wrapper Types</b> - Non-table singular types without @reference recurse to children - * without generating helpers (e.g., LanguageWrapper.originalLanguage)</li> - * <li><b>Helper Naming</b> - Nested helpers use parent method name as prefix with depth indicators - * (e.g., queryForQuery_customer_d1_address). Uniqueness ensured with counters for duplicate paths.</li> - * </ul> - * - * <p><b>State Management:</b></p> - * This class maintains shared state ({@link MethodGenerationState}, {@link HelperGenerationContext}) - * that is accessible to subclasses during method generation to ensure consistent naming and proper - * depth tracking for nested helper methods. - * - * @see FetchDBMethodGenerator - * @see FetchMappedObjectDBMethodGenerator - */ -public abstract class NestedFetchDBMethodGenerator extends FetchDBMethodGenerator { - private final Map<String, Integer> methodDefinitionCounters = new HashMap<>(); - private final Map<Pattern, Pattern> aliasPatternCache = new HashMap<>(); - - // Per-method state (set for each top-level field) - MethodGenerationState methodState = null; - - // Per-helper state (set for each helper being generated) - HelperGenerationContext helperContext = null; - - /** - * Container pattern detection only applies at depth 0. - * At this depth, we're processing the root helper method's direct fields. - */ - static final int CONTAINER_PATTERN_DEPTH = 0; - - /** - * State for a single top-level method and all its nested helpers. - * Created once per top-level field, cleared when moving to next field. - */ - static class MethodGenerationState { - ObjectField parentField; - final ObjectField rootField; - final FetchContext rootFetchContext; - - MethodGenerationState(ObjectField rootField, FetchContext rootFetchContext) { - this.rootField = rootField; - this.rootFetchContext = rootFetchContext; - this.parentField = rootField; - } - } - - /** - * Context for generating a single helper method. - * Created fresh for each helper, tracks method call occurrences and depth. - */ - static class HelperGenerationContext { - final String helperMethodName; - final int depth; - private final Map<String, Integer> methodCallCounters = new HashMap<>(); - - HelperGenerationContext(String helperMethodName, int depth) { - this.helperMethodName = helperMethodName; - this.depth = depth; - } - - String getNextCallName(String baseName) { - var occurrence = methodCallCounters.getOrDefault(baseName, 0); - methodCallCounters.put(baseName, occurrence + 1); - return (occurrence == 0) ? baseName : baseName + "_" + occurrence; - } - } - - public NestedFetchDBMethodGenerator(ObjectDefinition localObject, ProcessedSchema processedSchema) { - super(localObject, processedSchema); - } - - @Override - public MethodSpec generate(ObjectField field) { - // Create per-method state for this top-level field - var rootContext = new FetchContext(processedSchema, field, getLocalObject(), false); - methodState = new MethodGenerationState(field, rootContext); - - var method = generateHelperMethod(field); - - // Clear per-method state before moving to next field - methodState = null; - return method; - } - - public List<MethodSpec> generateNested(ObjectField field) { - // Create per-method state for this top-level field and all its nested helpers - var rootContext = new FetchContext(processedSchema, field, getLocalObject(), false); - methodState = new MethodGenerationState(field, rootContext); - var parentHelperName = generateHelperMethodName(field); - - // For resolver fields (like splitQuery), we need to navigate to get the correct context - // For non-resolver fields, rootFetchContext already represents the correct context - var context = methodState.rootFetchContext; - var parentContext = field.createsDataFetcher() ? context.nextContext(field) : context; - // Start at depth 0 (root helper method level) - var helperMethods = generateNestedHelperMethods(field, parentHelperName, parentContext, new HashSet<>(), 0); - - // Clear per-method state before moving to next field - methodState = null; - return helperMethods; - } - - MethodSpec generateHelperMethod(ObjectField target) { - return generateHelperMethod(null, target, null, 0).orElseThrow(); - } - - private Optional<MethodSpec> generateHelperMethod(String methodName, ObjectField target, FetchContext parentContext, int depth) { - var isRootHelper = depth == 0; - - if (isRootHelper) { - methodState.parentField = target; - } - - var nestedRecordType = processedSchema.getRecordType(target); - if (!isRootHelper && !shouldGenerateHelperMethod(target, nestedRecordType)) { - return Optional.empty(); - } - - // Method naming: root uses generateHelperMethodName(), nested uses passed-in name with depth prefix - var helperMethodName = isRootHelper ? generateHelperMethodName(target) : methodName; - var finalMethodName = isRootHelper ? helperMethodName : prefixName(String.valueOf(depth), helperMethodName); - - var previousHelperContext = helperContext; - helperContext = new HelperGenerationContext(helperMethodName, depth); - - try { - // Context: root uses rootFetchContext (with optional nextContext for resolvers), nested uses parentContext.nextContext() - var context = isRootHelper - ? (target.createsDataFetcher() ? methodState.rootFetchContext.nextContext(target) : methodState.rootFetchContext) - : parentContext.nextContext(target); - - var returnType = nestedRecordType.getGraphClassName(); - var selectRowBlock = generateSelectRow(context); - - var methodBuilder = MethodSpec.methodBuilder(finalMethodName) - .addModifiers(PRIVATE, STATIC) - .addParameterIf(GeneratorConfig.shouldMakeNodeStrategy(), NODE_ID_STRATEGY.className, VAR_NODE_STRATEGY) - .returns(ParameterizedTypeName.get(SELECT_FIELD.className, returnType)); - - // Parameters: root adds full input params (for non-split queries), nested adds only table method inputs - var parser = new InputParser(isRootHelper ? target : methodState.rootField, processedSchema); - if (isRootHelper && !processedSchema.isReferenceResolverField(target)) { - methodBuilder.addParameters(parser.getMethodParameterSpecs(true, false, false)); - } else if (!isRootHelper) { - var tableMethodInputs = collectTableMethodInputNames(context.getAliasSet()); - methodBuilder.addParameters(addTableMethodInputParameters(tableMethodInputs, methodState.rootField)); - } - - var allAliases = context.getAliasSet(); - var usedAliases = filterToUsedAliasesOnly(allAliases, selectRowBlock); - - methodBuilder - .addCode(declareAllServiceClassesInAliasSet(usedAliases)) - .addCodeIf(!usedAliases.isEmpty(), () -> createAliasDeclarations(usedAliases)) - .addCode(returnWrap(selectRowBlock)) - .addParameters(parser.getContextParameterSpecs()) - .addParameterIf(optionalSelectIsEnabled(), SELECTION_SET.className, VAR_SELECT); - - return Optional.of(methodBuilder.build()); - } finally { - if (isRootHelper) { - methodState.parentField = null; - } - helperContext = previousHelperContext; - } - } - - @Override - protected CodeBlock getHelperMethodCallForNestedField(ObjectField field, FetchContext context) { - // Root-level case: delegate to base class implementation - if (helperContext == null) { - return super.getHelperMethodCallForNestedField(field, context); - } - - // Nested case: when calling from within a helper at depth N, the nested helper is at depth N+1 - var nestedDepth = helperContext.depth + 1; - var baseName = generateNestedMethodName(helperContext.helperMethodName, field instanceof VirtualSourceField ? field.getContainerTypeName() : field.getName()); - var helperMethodName = prefixName(String.valueOf(nestedDepth), helperContext.getNextCallName(baseName)); - - var parameters = new ArrayList<String>(); - if (GeneratorConfig.shouldMakeNodeStrategy()) { - parameters.add(VAR_NODE_STRATEGY); - } - - var tableMethodInputs = collectTableMethodInputNames(methodState.rootFetchContext.getAliasSet()); - parameters.addAll(tableMethodInputs); - parameters.addAll(new InputParser(methodState.rootField, processedSchema).getContextFieldNames()); - if (optionalSelectIsEnabled()) parameters.add(VAR_SELECT); - - return CodeBlock.of("$L($L)", helperMethodName, String.join(", ", parameters)); - } - - private List<MethodSpec> generateNestedHelperMethods(ObjectField parentField, String parentHelperMethodName, FetchContext parentContext, Set<String> visitedTypes, int depth) { - var nestedMethods = new ArrayList<MethodSpec>(); - - var recordType = processedSchema.getRecordType(parentField); - - var currentTypeName = recordType.getName(); - visitedTypes.add(currentTypeName); - - for (var field : recordType.getFields()) { - if (!(field instanceof ObjectField objectField) || shouldSkipField(objectField)) { - continue; - } - - // New visited set for each sibling allows same type through different paths - // (e.g., minimumRating.language and maximumRating.language get separate helpers) - var siblingVisitedTypes = new HashSet<>(visitedTypes); - var nestedRecordType = processedSchema.getRecordType(objectField); - - if (processedSchema.isReferenceResolverField(objectField)) { - continue; - } - - // Check if this field should skip helper generation but continue traversing to children - if (shouldSkipHelperAndTraverse(objectField, recordType, nestedRecordType, depth, methodState.rootField.getArguments().stream().anyMatch(processedSchema::hasInputJOOQRecord))) { - nestedMethods.addAll(generateNestedHelperMethods(objectField, parentHelperMethodName, parentContext.nextContext(objectField), siblingVisitedTypes, depth)); - continue; - } - - // Generate helper method for this field (at depth + 1 since it's nested under parent at depth) - - // Generate method name like: _1_queryForQuery_customer_address (_{depth}_[parentHelperMethod]_[fieldName]) - // Depth is included to prevent collisions between staff.store (depth 2) and staff_store (depth 1) - var baseName = generateNestedMethodName(parentHelperMethodName, objectField.getName()); - // Ensure uniqueness by appending counter if base name already used - var helperMethodName = baseName + makeUniqueSuffix(prefixName(String.valueOf(depth + 1), baseName)); - var nestedHelperMethod = generateHelperMethod(helperMethodName, objectField, parentContext, depth + 1); - - nestedHelperMethod.ifPresent(method -> { - nestedMethods.add(method); - nestedMethods.addAll(generateNestedHelperMethods(objectField, helperMethodName, parentContext.nextContext(objectField), siblingVisitedTypes, depth + 1)); - }); - } - - return nestedMethods; - } - - private String makeUniqueSuffix(String baseName) { - var counter = methodDefinitionCounters.getOrDefault(baseName, 0); - methodDefinitionCounters.put(baseName, counter + 1); - return counter == 0 ? "" : "_" + counter; - } - - private boolean shouldSkipField(ObjectField field) { - return field.isExplicitlyNotGenerated() || - !processedSchema.isRecordType(field) || - processedSchema.isUnion(field); - } - - /** - * Determines if a field represents a structural wrapper where helper method generation should be skipped, - * but traversal to children should continue. - * <p> - * Two patterns are handled: - * <ul> - * <li><b>Input parameter container</b> (depth 0 only): A non-table type that wraps input parameters - * for a nested table field. Example: {@code type FilmContainer { films: Film }} where the Query - * has {@code input: FilmInput!}. Helper is skipped because input params bind directly to the - * nested Film table.</li> - * <li><b>Structural wrapper</b> (any depth): A non-table type with a single non-list field without - * {@code @reference}. Example: {@code type Wrapper { customer: Customer }} where Wrapper has no table. - * Helper is skipped because no table means no SELECT to generate.</li> - * </ul> - * - * @param field The field being evaluated - * @param parentType The parent type containing this field - * @param nestedType The type this field references - * @param depth Current recursion depth (0 = root helper level) - * @param rootFieldHasInputTableArguments Whether the root field has input table arguments - * @return true if helper should be skipped and children should be traversed, false otherwise - */ - private boolean shouldSkipHelperAndTraverse(ObjectField field, RecordObjectSpecification<?> parentType, - RecordObjectSpecification<?> nestedType, int depth, - boolean rootFieldHasInputTableArguments) { - // Input parameter container at root (depth 0) - if (depth == CONTAINER_PATTERN_DEPTH && - !parentType.hasTable() && - !field.isIterableWrapped() && - !field.hasFieldReferences() && - nestedType != null && nestedType.hasTable() && - rootFieldHasInputTableArguments) { - return true; - } - - // Structural wrapper type (any depth) - return (nestedType == null || !nestedType.hasTable()) && - !field.isIterableWrapped() && - !field.hasFieldReferences(); - } - - private boolean shouldGenerateHelperMethod(ObjectField field, RecordObjectSpecification<?> nestedRecordType) { - if (processedSchema.isExceptionOrExceptionUnion(field)) { - return false; - } - - return nestedRecordType.hasTable() || - field.isIterableWrapped() || - field.hasFieldReferences(); - } - - private Set<String> collectTableMethodInputNames(Set<AliasWrapper> aliasSet) { - return aliasSet.stream() - .filter(aliasWrapper -> aliasWrapper.hasTableMethod() && !aliasWrapper.getInputNames().isEmpty()) - .flatMap(aliasWrapper -> aliasWrapper.getInputNames().stream()) - .collect(Collectors.toSet()); - } - - private List<ParameterSpec> addTableMethodInputParameters(Set<String> inputNames, ObjectField sourceField) { - return sourceField - .getArguments() - .stream() - .filter(arg -> inputNames.contains(inputPrefix(arg.getName()))) - .map(arg -> ParameterSpec.of(arg.getTypeClass(), inputPrefix(arg.getName()))) - .toList(); - } - - // Filters to aliases used in SELECT plus their transitive dependencies, preserving order - private Set<AliasWrapper> filterToUsedAliasesOnly(Set<AliasWrapper> allAliases, CodeBlock selectCode) { - var codeString = selectCode.toString(); - - var allNeeded = allAliases.stream() - .filter(aliasWrapper -> isAliasUsedInCode(aliasWrapper.getAlias(), codeString)) - .collect(Collectors.toCollection(HashSet::new)); - - // Add transitive dependencies (e.g., if _a_customer.address() is needed, include _a_customer) - boolean addedAny = true; - while (addedAny) { - addedAny = false; - for (var aliasWrapper : allAliases) { - if (allNeeded.contains(aliasWrapper)) continue; - - var aliasName = aliasWrapper.getAlias().getMappingName(); - for (var neededAlias : allNeeded) { - var variableValue = neededAlias.getAlias().getVariableValue(); - if (variableValue.startsWith(aliasName + ".")) { - allNeeded.add(aliasWrapper); - addedAny = true; - break; - } - } - } - } - - return allAliases.stream() - .filter(allNeeded::contains) - .collect(Collectors.toCollection(LinkedHashSet::new)); - } - - // Uses regex word boundaries to avoid partial matches (cached for performance) - private boolean isAliasUsedInCode(Alias alias, String codeString) { - var aliasName = alias.getMappingName(); - var pattern = aliasPatternCache.computeIfAbsent( - Pattern.compile("\\b" + Pattern.quote(aliasName) + "\\b"), - k -> k - ); - return pattern.matcher(codeString).find(); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/NodeSelectHelperDBMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/NodeSelectHelperDBMethodGenerator.java deleted file mode 100644 index 19a5aaa836..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/NodeSelectHelperDBMethodGenerator.java +++ /dev/null @@ -1,49 +0,0 @@ -package no.sikt.graphitron.generators.db; - -import no.sikt.graphitron.definitions.fields.AbstractField; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.fields.VirtualSourceField; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.Collection; -import java.util.Comparator; -import java.util.List; -import java.util.Set; -import java.util.stream.Stream; - -import static no.sikt.graphql.naming.GraphQLReservedName.NODE_TYPE; - -/** - * Generator that creates the data fetching methods for interface implementations, e.g. queries used by the node resolver. - */ -public class NodeSelectHelperDBMethodGenerator extends NestedFetchDBMethodGenerator { - private final Set<ObjectField> objectFieldsReturningNode; - - public NodeSelectHelperDBMethodGenerator(ObjectDefinition localObject, ProcessedSchema processedSchema, Set<ObjectField> objectFieldsReturningNode) { - super(localObject, processedSchema); - this.objectFieldsReturningNode = objectFieldsReturningNode; - } - - @Override - public List<MethodSpec> generateAll() { - var fields = objectFieldsReturningNode - .stream() - .filter(entry -> getLocalObject().implementsInterface(NODE_TYPE.getName())) - .sorted(Comparator.comparing(AbstractField::getName)) - .map(it -> new VirtualSourceField(getLocalObject(), it.getTypeName())) - .toList(); - - var top = fields - .stream() - .map(this::generate); - var nested = fields - .stream() - .map(this::generateNested) - .flatMap(Collection::stream); - return Stream - .concat(top, nested) - .toList(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/SelectHelperDBClassGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/SelectHelperDBClassGenerator.java deleted file mode 100644 index 8889dcff87..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/SelectHelperDBClassGenerator.java +++ /dev/null @@ -1,26 +0,0 @@ -package no.sikt.graphitron.generators.db; - -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.javapoet.TypeSpec; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.List; - -public class SelectHelperDBClassGenerator extends DBClassGenerator { - public SelectHelperDBClassGenerator(ProcessedSchema processedSchema) { - super(processedSchema); - } - - @Override - public TypeSpec generate(ObjectDefinition target) { - TypeSpec typeSpec = getSpec( - target.getName(), - List.of( - new SelectHelperDBMethodGenerator(target, processedSchema), - new NodeSelectHelperDBMethodGenerator(target, processedSchema, objectFieldsReturningNode) - ) - ).build(); - warnOrCrashIfMethodsExceedsBounds(typeSpec); - return typeSpec; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/SelectHelperDBMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/SelectHelperDBMethodGenerator.java deleted file mode 100644 index f742b761d0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/SelectHelperDBMethodGenerator.java +++ /dev/null @@ -1,45 +0,0 @@ -package no.sikt.graphitron.generators.db; - -import no.sikt.graphitron.definitions.fields.GenerationSourceField; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.Collection; -import java.util.List; -import java.util.stream.Stream; - -import static no.sikt.graphql.naming.GraphQLReservedName.FEDERATION_ENTITIES_FIELD; - -public class SelectHelperDBMethodGenerator extends NestedFetchDBMethodGenerator { - public SelectHelperDBMethodGenerator(ObjectDefinition localObject, ProcessedSchema processedSchema) { - super(localObject, processedSchema); - } - - @Override - public List<MethodSpec> generateAll() { - var fields = getLocalObject() - .getFields() - .stream() - .filter(it -> !processedSchema.isInterface(it) && !processedSchema.isUnion(it)) - .filter(it -> !it.getName().equals(FEDERATION_ENTITIES_FIELD.getName())) - .filter(it -> !processedSchema.isFederationService(it)) - .filter(GenerationSourceField::isGeneratedWithResolver) - .filter(it -> !it.hasServiceReference()) - .filter(it -> !processedSchema.isDeleteMutationWithReturning(it)) - .filter(it -> !processedSchema.isInsertMutationWithReturning(it)) - .filter(processedSchema::isRecordType) - .toList(); - - var top = fields - .stream() - .map(this::generate); - var nested = fields - .stream() - .map(this::generateNested) - .flatMap(Collection::stream); - return Stream - .concat(top, nested) - .toList(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/ServiceResultFetchDBMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/ServiceResultFetchDBMethodGenerator.java deleted file mode 100644 index d7d2a9d6b1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/ServiceResultFetchDBMethodGenerator.java +++ /dev/null @@ -1,73 +0,0 @@ -package no.sikt.graphitron.generators.db; - -import no.sikt.graphitron.definitions.fields.GenerationSourceField; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.generators.context.FetchContext; -import no.sikt.graphitron.generators.context.InputParser; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphitron.javapoet.TypeName; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.List; - -import static no.sikt.graphitron.generators.codebuilding.KeyWrapper.getKeyTableRecordTypeName; -import static no.sikt.graphitron.generators.codebuilding.NameFormat.asQueryMethodName; -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.wrapSet; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_SELECT; -import static no.sikt.graphitron.mappings.JavaPoetClassName.SELECTION_SET; - -/** - * Generator that creates DB fetch methods for fields where a @service returns a table-backed type. - * Extends {@link FetchMappedObjectDBMethodGenerator} with {@link #isRoot()} returning false so that - * the generated method includes resolver key parameters and WHERE clause for batch fetching by PK. - */ -public class ServiceResultFetchDBMethodGenerator extends FetchMappedObjectDBMethodGenerator { - - public ServiceResultFetchDBMethodGenerator(ObjectDefinition localObject, ProcessedSchema processedSchema) { - super(localObject, processedSchema); - } - - @Override - protected boolean isRoot() { - return false; - } - - @Override - protected CodeBlock getHelperMethodCallForNestedField(ObjectField field, FetchContext context) { - return null; - } - - @Override - protected CodeBlock getSelectBlockForRecord(ObjectField target, CodeBlock selectRowBlock, boolean isReferenceResolverField, InputParser parser) { - return selectRowBlock; - } - - /** - * Override to exclude input parameters from the DB method signature. Input arguments are passed - * to the service call, not to the DB query. - */ - @Override - protected MethodSpec.Builder getSpecBuilder(ObjectField referenceField, TypeName refTypeName, InputParser parser) { - return getDefaultSpecBuilder( - asQueryMethodName(referenceField.getName(), getLocalObject().getName()), - getReturnType(referenceField, refTypeName) - ) - .addParameter(wrapSet(getKeyTableRecordTypeName(referenceField, processedSchema)), resolverKeyParamName) - .addParameter(SELECTION_SET.className, VAR_SELECT); - } - - @Override - public List<MethodSpec> generateAll() { - return getLocalObject() - .getFields() - .stream() - .filter(GenerationSourceField::hasImplicitSplitQuery) - .filter(ObjectField::hasServiceReference) - .filter(processedSchema::hasTableObject) - .map(this::generate) - .filter(it -> !it.code().isEmpty()) - .toList(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/UpdateWithReturningDBMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/UpdateWithReturningDBMethodGenerator.java deleted file mode 100644 index de7be9f827..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/db/UpdateWithReturningDBMethodGenerator.java +++ /dev/null @@ -1,267 +0,0 @@ -package no.sikt.graphitron.generators.db; - -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.fields.VirtualSourceField; -import no.sikt.graphitron.definitions.helpers.InputComponents; -import no.sikt.graphitron.definitions.helpers.InputSetValue; -import no.sikt.graphitron.definitions.mapping.JOOQMapping; -import no.sikt.graphitron.definitions.mapping.MethodMapping; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.generators.context.FetchContext; -import no.sikt.graphitron.generators.context.InputParser; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphql.directives.GenerationDirective; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.*; -import java.util.stream.Collectors; - -import static no.sikt.graphitron.configuration.Recursion.recursionCheck; -import static no.sikt.graphitron.definitions.fields.containedtypes.MutationType.DELETE; -import static no.sikt.graphitron.definitions.fields.containedtypes.MutationType.INSERT; -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.*; -import static no.sikt.graphitron.generators.codebuilding.NameFormat.asQueryMethodName; -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.inferFieldTypeName; -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.wrapListIf; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.*; -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.inputPrefix; -import static no.sikt.graphitron.generators.context.NodeIdReferenceHelpers.*; -import static no.sikt.graphitron.mappings.JavaPoetClassName.SELECTION_SET; -import static no.sikt.graphitron.mappings.TableReflection.getJavaFieldName; - -/** - * Generator that creates the default data mutation methods. - */ -public class UpdateWithReturningDBMethodGenerator extends FetchDBMethodGenerator { - - public UpdateWithReturningDBMethodGenerator(ObjectDefinition localObject, ProcessedSchema processedSchema) { - super(localObject, processedSchema, true); - } - - /** - * @param target A {@link ObjectField} for which a mutation method should be generated for. - * This must reference a field located within the Mutation type and with the - * "{@link GenerationDirective#MUTATION mutationType}" directive set. - * @return The complete javapoet {@link MethodSpec} based on the provided reference field. - */ - @Override - public MethodSpec generate(ObjectField target) { - if (!target.hasMutationType()) { - return MethodSpec.methodBuilder(target.getName()).build(); - } - - // Field containing the actual data returned after the mutation - var dataTarget = processedSchema.inferDataTargetForMutation(target) - .orElseThrow(() -> new RuntimeException(String.format( - "Cannot determine field to output data to for mutation %s.", - target.formatPath()))); - - var returnType = processedSchema.isRecordType(dataTarget) - ? processedSchema.getRecordType(dataTarget).getGraphClassName() - : inferFieldTypeName(dataTarget, true, processedSchema); - - var targetTable = processedSchema.findInputTables(target).stream() // TODO: support inferring target table from data output - .findFirst() - .orElseThrow(() -> new RuntimeException(String.format("Cannot infer target table for mutation %s.", target.formatPath()))); - - var parser = new InputParser(target, processedSchema); - - var contextForData = new FetchContext( - processedSchema, - new VirtualSourceField(target, dataTarget), - getLocalObject(), - false, - true); - - CodeBlock selectBlock = processedSchema.isScalar(dataTarget) ? generateForField(dataTarget, contextForData) : generateSelectRow(contextForData); - var code = CodeBlock.builder() - .add(createAliasDeclarations(contextForData.getAliasSet())) - .addIf(target.getMutationType().equals(DELETE), () -> getDeletePartOfQuery(targetTable.getName(), target)) - .addIf(target.getMutationType().equals(INSERT), () -> getInsertPartOfQuery(targetTable.getName(), target)) - .add("\n.returningResult($L)\n", indentIfMultiline(selectBlock)) - .add(setFetch(dataTarget)); - - return getDefaultSpecBuilder(asQueryMethodName(target.getName(), getLocalObject().getName()), wrapListIf(returnType, dataTarget.isIterableWrapped())) - .addParameters(parser.getMethodParameterSpecs(true, false, false)) - .addParameter(SELECTION_SET.className, VAR_SELECT) - .addCode(code.build()) - .build(); - } - - @Override - protected CodeBlock getHelperMethodCallForNestedField(ObjectField field, FetchContext context) { - return null; - } - - private CodeBlock getDeletePartOfQuery(String targetTable, ObjectField target) { - return CodeBlock.builder() - .add("return $N", VAR_CONTEXT) - .add(".deleteFrom($N)", targetTable) - .indent() - .indent() - .add("\n$L", formatWhereContentsForDeleteMutation(target)) - .unindent() - .unindent() - .build(); - } - - private CodeBlock getInsertPartOfQuery(String targetTable, ObjectField target) { - var inputConditions = getInputComponents(target); - var setValueMap = new LinkedHashMap<CodeBlock, CodeBlock>(); - var setValues = !inputConditions.independentSetValues().isEmpty() - ? inputConditions.independentSetValues() - : inputConditions.setValueTuple().setValues(); - - var recordInput = target.getArguments().stream() - .filter(processedSchema::hasJOOQRecord).findFirst() - .orElseThrow(() -> new RuntimeException("Cannot find jOOQ record input for " + target.formatPath())); - - var recordInputVariableName = inputPrefix(inferFieldNamingConvention(recordInput)); - - for (var inputSetValue : setValues) { - var inputField = inputSetValue.getInput(); - if (processedSchema.isNodeIdField(inputField)) { - var keyColumns = resolveColumnNamesForNodeIdField(inputField, processedSchema, JOOQMapping.fromTable(targetTable)); - - for (String keyColumn : keyColumns) { - var field = tableFieldCodeBlock(targetTable, getJavaFieldName(targetTable, keyColumn).orElseThrow()); - var getterExpr = CodeBlock.of("$N.$L()", - recordInput.isIterableWrapped() ? VAR_ITERATOR : recordInputVariableName, - new MethodMapping(keyColumn).asCamelGet() - ); - var setValue = val(getterExpr); - - if (inputField.isNullable()) { - setValue = ofTernary( - CodeBlock.of("$L != null", inputSetValue.getNameWithPath()), - setValue, - defaultValue(field) - ); - } - setValueMap.put(field, setValue); - } - } else { - var field = tableFieldCodeBlock(targetTable, inputField.getUpperCaseName()); - var setValue = val(inputSetValue.getNameWithPath()); - if (inputField.isNullable()) { - var recordVar = CodeBlock.of("$N", recordInput.isIterableWrapped() ? VAR_ITERATOR : recordInputVariableName); - setValue = ofTernary( - CodeBlock.of("$L.changed($L)", recordVar, field), - setValue, - defaultValue(field) - ); - } - setValueMap.put(field, setValue); - } - } - - - var valuesContent = indentIfMultiline(CodeBlock.join(",\n", setValueMap.values())); - - if (recordInput.isIterableWrapped()) { - valuesContent = CodeBlock.builder() - .beginControlFlow("$N.stream().map($N -> ", recordInputVariableName, VAR_ITERATOR) - .add("return ") - .addStatement(wrapRow(valuesContent)) - .endControlFlow() - .add(")$L", collectToList()) - .build(); - } - - return CodeBlock.builder() - .add("return $N", VAR_CONTEXT) - .indent() - .indent() - .add(".insertInto($N, $L)", targetTable, CodeBlock.join(", ", setValueMap.keySet())) - .add("\n.$L($L)", recordInput.isIterableWrapped() ? "valuesOfRows" : "values", valuesContent) - .unindent() - .unindent() - .build(); - } - - protected CodeBlock formatWhereContentsForDeleteMutation(ObjectField target) { - var context = new FetchContext(processedSchema, target, getLocalObject(), false, true); - return formatJooqConditions(new ArrayList<>(getInputConditions(context, target)), "and"); - } - - private CodeBlock setFetch(ObjectField referenceField) { - var refObject = processedSchema.getObjectOrConnectionNode(referenceField); - var resType = refObject == null ? referenceField.getTypeClass() : refObject.getGraphClassName(); - return CodeBlock.statementOf(".fetch$1L($2N -> $2N.into($3T.class))", - referenceField.isIterableWrapped() ? "" : "One", VAR_ITERATOR, resType); - } - - private InputComponents getInputComponents(ObjectField referenceField) { - /* - * Currently only used for INSERT mutations, where all input is set values. - * This method will need more complex logic for UPDATE and UPSERT, as they will also have input conditions - * */ - var setValues = new ArrayList<InputSetValue>(); - var pathNameForIterableFields = new ArrayList<String>(); - - var inputBuffer = referenceField - .getNonReservedArguments() - .stream() - .map(it -> new InputSetValue( - it, - inputPrefix(inferFieldNamingConvention(it)), - processedSchema.hasRecord(it) - ) - ) - .collect(Collectors.toCollection(LinkedList::new)); - - while (!inputBuffer.isEmpty()) { - recursionCheck(inputBuffer.size()); - var inputSetValue = inputBuffer.poll(); - var inputField = inputSetValue.getInput(); - - if (processedSchema.isInputType(inputField)) { - inputBuffer.addAll( - 0, - processedSchema.getInputType(inputField) - .getFields() - .stream() - .map(inputSetValue::iterate) - .toList() - ); - if (inputField.isIterableWrapped()) { - pathNameForIterableFields.add(inputSetValue.getNameWithPathString()); - } - } else { - setValues.add(inputSetValue.applyTo(inputField)); - } - } - var setValueTuple = pathNameForIterableFields - .stream() - .findFirst() - .map(s -> new InputComponents.SetValueTuple( - s, setValues - .stream() - .filter(condition -> condition.getNamePath().startsWith(s)) - .collect(Collectors.toList()))) - .orElse(null); - - Optional.ofNullable(setValueTuple).map(InputComponents.SetValueTuple::setValues) - .orElse(List.of()) - .forEach(setValues::remove); - - return new InputComponents(List.of(), List.of(), setValues, setValueTuple, Map.of()); - } - - @Override - public List<MethodSpec> generateAll() { - var localObject = getLocalObject(); - if (localObject.isExplicitlyNotGenerated()) { - return List.of(); - } - return localObject - .getFields() - .stream() - .filter(ObjectField::isGeneratedWithResolver) - .filter(it -> processedSchema.isDeleteMutationWithReturning(it) || processedSchema.isInsertMutationWithReturning(it)) - .map(this::generate) - .filter(it -> !it.code().isEmpty()) - .collect(Collectors.toList()); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dependencies/ContextDependency.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dependencies/ContextDependency.java deleted file mode 100644 index f2f7a2b8d1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dependencies/ContextDependency.java +++ /dev/null @@ -1,55 +0,0 @@ -package no.sikt.graphitron.generators.dependencies; - -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.FieldSpec; -import org.jetbrains.annotations.NotNull; - -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_CONTEXT; -import static no.sikt.graphitron.mappings.JavaPoetClassName.DSL_CONTEXT; -import static no.sikt.graphitron.mappings.JavaPoetClassName.INJECT; - -/** - * A dependency on DSLContext. - */ -public class ContextDependency implements Dependency, Comparable<Dependency> { - private static final ContextDependency instance = new ContextDependency(); - private final static CodeBlock declaration = CodeBlock.declareNew(VAR_CONTEXT, DSL_CONTEXT.className); - - private ContextDependency() {} - - /** - * @return Get the singleton DSLContext dependency. - */ - public static ContextDependency getInstance() { - return instance; - } - - @Override - public FieldSpec getSpec() { - return FieldSpec.builder(DSL_CONTEXT.className, VAR_CONTEXT).addAnnotation(INJECT.className).build(); - } - - @Override - public CodeBlock getDeclarationCode() { - return declaration; - } - - @Override - public int compareTo(@NotNull Dependency o) { - if (o instanceof ContextDependency) { - return 0; - } - if (o instanceof NamedDependency) { - return -1; - } - return 1; - } - - @Override - public boolean equals(Object obj) { - if (obj == this) { - return true; - } - return obj instanceof ContextDependency; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dependencies/Dependency.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dependencies/Dependency.java deleted file mode 100644 index 9d115c1903..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dependencies/Dependency.java +++ /dev/null @@ -1,19 +0,0 @@ -package no.sikt.graphitron.generators.dependencies; - -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.FieldSpec; - -/** - * General interface for dependency handling in generated classes. - */ -public interface Dependency { - /** - * @return Javapoet FieldSpec for a dependency of this type. - */ - FieldSpec getSpec(); - - /** - * @return CodeBlock that declares a dependency of this type. - */ - CodeBlock getDeclarationCode(); -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dependencies/IdHandlerDependency.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dependencies/IdHandlerDependency.java deleted file mode 100644 index b474a62c09..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dependencies/IdHandlerDependency.java +++ /dev/null @@ -1,57 +0,0 @@ -package no.sikt.graphitron.generators.dependencies; - -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.FieldSpec; -import org.jetbrains.annotations.NotNull; - -import javax.lang.model.element.Modifier; - -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_NODE_HANDLER; -import static no.sikt.graphitron.mappings.JavaPoetClassName.INJECT; -import static no.sikt.graphitron.mappings.JavaPoetClassName.NODE_ID_HANDLER; - -/** - * A dependency on DSLContext. - */ -public class IdHandlerDependency implements Dependency, Comparable<Dependency> { - private static final IdHandlerDependency instance = new IdHandlerDependency(); - private final static CodeBlock declaration = CodeBlock.declareNew(VAR_NODE_HANDLER, NODE_ID_HANDLER.className); - - private IdHandlerDependency() {} - - /** - * @return Get the singleton DSLContext dependency. - */ - public static IdHandlerDependency getInstance() { - return instance; - } - - @Override - public FieldSpec getSpec() { - return FieldSpec.builder(NODE_ID_HANDLER.className, VAR_NODE_HANDLER, Modifier.PRIVATE).addAnnotation(INJECT.className).build(); - } - - @Override - public CodeBlock getDeclarationCode() { - return declaration; - } - - @Override - public int compareTo(@NotNull Dependency o) { - if (o instanceof IdHandlerDependency) { - return 0; - } - if (o instanceof NamedDependency) { - return -1; - } - return 1; - } - - @Override - public boolean equals(Object obj) { - if (obj == this) { - return true; - } - return obj instanceof IdHandlerDependency; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dependencies/NamedDependency.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dependencies/NamedDependency.java deleted file mode 100644 index 6213b95508..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dependencies/NamedDependency.java +++ /dev/null @@ -1,82 +0,0 @@ -package no.sikt.graphitron.generators.dependencies; - -import no.sikt.graphitron.javapoet.ClassName; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.FieldSpec; -import no.sikt.graphitron.javapoet.TypeName; -import org.jetbrains.annotations.NotNull; - -import java.util.Objects; - -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.asMethodCall; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.METHOD_CONTEXT_NAME; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_TRANSFORMER; - -/** - * An abstract dependency on a class somewhere in the codebase. - */ -abstract public class NamedDependency implements Dependency, Comparable<Dependency> { - private final String name, path; - private final ClassName typeName; - - public NamedDependency(ClassName className) { - typeName = className; - this.name = typeName.simpleName(); - this.path = typeName.packageName(); - } - - /** - * @return The name of this dependency. - */ - public String getName() { - return name; - } - - /** - * @return The location of this dependency. - */ - public String getPath() { - return path; - } - - /** - * @return The javapoet TypeName for this dependency. - */ - public TypeName getTypeName() { - return typeName; - } - - @Override - abstract public FieldSpec getSpec(); - - @Override - public CodeBlock getDeclarationCode() { - return getDeclarationCode(false); - } - - public CodeBlock getDeclarationCode(boolean excludeCtx) { - return CodeBlock.declareNew(getName(), getTypeName(), excludeCtx ? CodeBlock.empty() - : asMethodCall(VAR_TRANSFORMER, METHOD_CONTEXT_NAME)); - } - - @Override - public int compareTo(@NotNull Dependency o) { - if (o instanceof ContextDependency) { - return 1; - } - var nDep = (NamedDependency) o; - return (getName() + getPath()).compareTo(nDep.getName() + nDep.getPath()); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof NamedDependency that)) return false; - return getName().equals(that.getName()) && Objects.equals(getPath(), that.getPath()); - } - - @Override - public int hashCode() { - return Objects.hash(name, path); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dependencies/QueryDependency.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dependencies/QueryDependency.java deleted file mode 100644 index 35198db5ee..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dependencies/QueryDependency.java +++ /dev/null @@ -1,40 +0,0 @@ -package no.sikt.graphitron.generators.dependencies; - -import no.sikt.graphitron.generators.db.DBClassGenerator; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.FieldSpec; - -import javax.lang.model.element.Modifier; - -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.getGeneratedClassName; -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.queryPrefix; -import static no.sikt.graphitron.mappings.JavaPoetClassName.INJECT; - -/** - * A dependency on a generated Query class. Intended for resolvers. - */ -public class QueryDependency extends NamedDependency { - public QueryDependency(String name, String subPath) { - super(getGeneratedClassName(DBClassGenerator.DEFAULT_SAVE_DIRECTORY_NAME + "." + subPath, name)); - } - - /** - * @return The name of this dependency. - */ - public String getName() { - return queryPrefix(super.getName()); - } - - @Override - public CodeBlock getDeclarationCode() { - return CodeBlock.declareNew(getName(), getTypeName()); - } - - @Override - public FieldSpec getSpec() { - return FieldSpec - .builder(getTypeName(), getName(), Modifier.PRIVATE) - .addAnnotation(INJECT.className) - .build(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dependencies/ServiceDependency.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dependencies/ServiceDependency.java deleted file mode 100644 index b464028a43..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dependencies/ServiceDependency.java +++ /dev/null @@ -1,33 +0,0 @@ -package no.sikt.graphitron.generators.dependencies; - -import no.sikt.graphitron.javapoet.ClassName; -import no.sikt.graphitron.javapoet.FieldSpec; - -import javax.lang.model.element.Modifier; - -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_CONTEXT; -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.servicePrefix; - -/** - * A dependency on a manually defined service class. Intended for mutation resolvers. - */ -public class ServiceDependency extends NamedDependency { - public ServiceDependency(ClassName className) { - super(className); - } - - /** - * @return The name of this dependency. - */ - public String getName() { - return servicePrefix(super.getName()); - } - - @Override - public FieldSpec getSpec() { - return FieldSpec - .builder(getTypeName(), getName(), Modifier.PRIVATE) - .initializer("new $T($N)", getTypeName(), VAR_CONTEXT) - .build(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dto/DTOGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dto/DTOGenerator.java deleted file mode 100644 index dd54928962..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dto/DTOGenerator.java +++ /dev/null @@ -1,209 +0,0 @@ -package no.sikt.graphitron.generators.dto; - -import graphql.language.NamedNode; -import no.sikt.graphitron.definitions.fields.GenerationSourceField; -import no.sikt.graphitron.definitions.interfaces.GenerationTarget; -import no.sikt.graphitron.generators.abstractions.AbstractSchemaClassGenerator; -import no.sikt.graphitron.generators.codebuilding.KeyWrapper; -import no.sikt.graphitron.javapoet.*; -import no.sikt.graphql.schema.ProcessedSchema; -import org.apache.commons.lang3.StringUtils; - -import javax.lang.model.element.Modifier; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -import static no.sikt.graphitron.configuration.GeneratorConfig.generatedModelsPackage; -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.returnWrap; -import static no.sikt.graphitron.generators.codebuilding.KeyWrapper.getKeyMapForResolverFields; -import static no.sikt.graphitron.generators.codebuilding.NameFormat.SUFFIX_RESOLVER_KEY_DTO; -import static no.sikt.graphitron.mappings.JavaPoetClassName.LIST; -import static org.apache.commons.lang3.StringUtils.capitalize; - -public abstract class DTOGenerator<T extends GenerationTarget> extends AbstractSchemaClassGenerator<T> { - public static final String HASH_CODE = "hashCode", OBJ = "obj", EQUALS = "equals"; - - public DTOGenerator(ProcessedSchema processedSchema) { - super(processedSchema); - } - - protected TypeSpec.Builder getTypeSpecBuilder(String targetName, List<? extends GenerationSourceField<?>> fields) { - var isJavaRecord = processedSchema.hasJavaRecord(targetName); - var keyMap = getKeyMapForResolverFields(fields, processedSchema); - var classBuilder = TypeSpec.classBuilder(targetName) - .addModifiers(Modifier.PUBLIC) - .addMethod(MethodSpec.constructorBuilder().addModifiers(Modifier.PUBLIC).build()); - - var constructorBuilder = MethodSpec.constructorBuilder().addModifiers(Modifier.PUBLIC); - - // New constructor that skips error fields so queries can use them without making up new empty fields. - var constructorNoErrorsBuilder = MethodSpec.constructorBuilder().addModifiers(Modifier.PUBLIC); - - List<String> allVariableNames = new ArrayList<>(); - - var hasErrors = fields.stream().anyMatch(processedSchema::isExceptionOrExceptionUnion); - - if (!isJavaRecord) { - keyMap.values() - .stream() - .distinct() - .forEach((key) -> { - var dtoVarName = key.getDTOVariableName(); - allVariableNames.add(dtoVarName); - var typeName = key.getTypeName(); - addClassKeyVariable(typeName, dtoVarName, classBuilder); - addConstructorKeyVariable(typeName, dtoVarName, constructorBuilder); - if (hasErrors) { - addConstructorKeyVariable(typeName, dtoVarName, constructorNoErrorsBuilder); - } - }); - } - - fields.stream() - .filter(it -> !(it.isExplicitlyNotGenerated())) - .forEach(field -> { - var key = keyMap.getOrDefault(field.getName(), null); - var variableName = getDTOVariableNameForField(field); - var typeName = getTypeNameForField(field, key); - var setValue = field.createsDataFetcher() ? key.getDTOVariableName() : field.getName(); - - allVariableNames.add(variableName); - - addClassFieldVariable(typeName, variableName, classBuilder); - boolean shouldWrapAsList = processedSchema.isOrderedMultiKeyQuery(field); - addConstructorFieldVariable(typeName, variableName, constructorBuilder, setValue, false, field.createsDataFetcher(), shouldWrapAsList); - if (hasErrors) { - addConstructorFieldVariable( - typeName, - variableName, - constructorNoErrorsBuilder, - setValue, - processedSchema.isExceptionOrExceptionUnion(field), - field.createsDataFetcher(), - shouldWrapAsList - ); - } - }); - - if (hasErrors && !isJavaRecord) { - classBuilder.addMethod(constructorNoErrorsBuilder.build()); - } - return classBuilder - .addMethodIf(!isJavaRecord, constructorBuilder.build()) - .addMethod(getHashCodeMethod(allVariableNames)) - .addMethod(getEqualsMethod(targetName, allVariableNames)); - } - - protected static String getDTOVariableNameForField(GenerationSourceField<? extends NamedNode<?>> field) { - return field.createsDataFetcher() ? field.getName() + SUFFIX_RESOLVER_KEY_DTO : field.getName(); - } - - public static String getDTOGetterMethodNameForField(GenerationSourceField<?> field) { - return "get" + capitalize(getDTOVariableNameForField(field)); - } - - private void addClassKeyVariable(TypeName fieldType, String name, TypeSpec.Builder classBuilder) { - classBuilder - .addField(fieldType, name, Modifier.PRIVATE) - .addMethod(getGetterMethod(fieldType, name)); - } - - private void addConstructorKeyVariable(TypeName fieldType, String name, MethodSpec.Builder constructorBuilder) { - constructorBuilder - .addStatement("this.$N = $N", name, name) - .addParameter(fieldType, name); - } - - private void addClassFieldVariable(TypeName fieldType, String name, TypeSpec.Builder classBuilder) { - classBuilder - .addField(fieldType, name, Modifier.PRIVATE) - .addMethod(getGetterMethod(fieldType, name)) - .addMethod(getSetterMethod(fieldType, name)); - } - - private void addConstructorFieldVariable(TypeName fieldType, String name, MethodSpec.Builder constructorBuilder, String setValueInConstructor, boolean isError, boolean createsDataFetchers, boolean isList) { - constructorBuilder - .addStatementIf(isList, "this.$N = $T.of($N)", name, LIST.className, isError ? "null" : setValueInConstructor) - .addStatementIf(!isList, "this.$N = $N", name, isError ? "null" : setValueInConstructor) - .addParameterIf(!createsDataFetchers && !isError, fieldType, name); - } - - private MethodSpec getGetterMethod(TypeName fieldType, String fieldName) { - return MethodSpec - .methodBuilder("get" + capitalize(fieldName)) - .addCode(returnWrap(fieldName)) - .returns(fieldType) - .addModifiers(Modifier.PUBLIC) - .build(); - } - - private MethodSpec getSetterMethod(TypeName fieldType, String fieldName) { - return MethodSpec.methodBuilder("set" + capitalize(fieldName)) - .addParameter(fieldType, fieldName) - .addStatement("this.$N = $N", fieldName, fieldName) - .addModifiers(Modifier.PUBLIC) - .build(); - } - - private MethodSpec getHashCodeMethod(List<String> fieldNames) { - return MethodSpec.methodBuilder(HASH_CODE) - .returns(int.class) - .addModifiers(Modifier.PUBLIC) - .addAnnotation(Override.class) - .addCode(returnWrap( - CodeBlock.of("$T.hash($L)", - Objects.class, - StringUtils.join(fieldNames, ", ")) - )) - .build(); - } - - private MethodSpec getEqualsMethod(String targetName, List<String> fieldNames) { - CodeBlock returnCodeBlock = CodeBlock.join( - " && ", fieldNames.stream() - .map(field -> CodeBlock.of("$T.equals($N, that.$N)", Objects.class, field, field)) - .toList() - ); - - return MethodSpec.methodBuilder(EQUALS) - .returns(boolean.class) - .addParameter(Object.class, OBJ) - .addModifiers(Modifier.PUBLIC) - .addAnnotation(Override.class) - .beginControlFlow("if (this == $N)", OBJ) - .addCode(returnWrap("true")) - .endControlFlow() - .beginControlFlow("if ($N == null || getClass() != $N.getClass())", OBJ, OBJ) - .addCode(returnWrap("false")) - .endControlFlow() - .addStatement("final $L that = ($L) $N", targetName, targetName, OBJ) - .addCode(returnWrap(returnCodeBlock)) - .build(); - } - - protected TypeName getTypeNameForField(GenerationSourceField<?> field, KeyWrapper firstStepKeyForField) { - if (!field.isGeneratedWithResolver()) { - TypeName typeClass = field.getTypeClass() != null ? - field.getTypeClass() - : ClassName.get(generatedModelsPackage(), field.getTypeName()); - - return field.isIterableWrapped() ? - ParameterizedTypeName.get(ClassName.get(List.class), typeClass) - : typeClass; - - } else { // Fields with @splitQuery - return firstStepKeyForField.getTypeName(processedSchema.isOrderedMultiKeyQuery(field)); - } - } - - @Override - public String getDefaultSaveDirectoryName() { - return "model"; - } - - @Override - public String getFileNameSuffix() { - return ""; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dto/EnumDTOGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dto/EnumDTOGenerator.java deleted file mode 100644 index 49a76b253b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dto/EnumDTOGenerator.java +++ /dev/null @@ -1,33 +0,0 @@ -package no.sikt.graphitron.generators.dto; - -import no.sikt.graphitron.definitions.objects.EnumDefinition; -import no.sikt.graphitron.javapoet.TypeSpec; -import no.sikt.graphql.schema.ProcessedSchema; - -import javax.lang.model.element.Modifier; -import java.util.List; - -public class EnumDTOGenerator extends DTOGenerator<EnumDefinition> { - - public EnumDTOGenerator(ProcessedSchema processedSchema) { - super(processedSchema); - } - - @Override - public TypeSpec generate(EnumDefinition enumDefinition) { - var enumBuilder = TypeSpec.enumBuilder(enumDefinition.getName()).addModifiers(Modifier.PUBLIC); - enumDefinition.getFields().forEach(field -> enumBuilder.addEnumConstant(field.getName())); - return enumBuilder.build(); - } - - @Override - public List<TypeSpec> generateAll() { - return processedSchema - .getEnums() - .values() - .stream() - .filter(it -> !it.getName().equalsIgnoreCase("link__purpose")) //Ignore the link__purpose enum required by the @link directive used by Apollo Federation - .map(this::generate) - .toList(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dto/InputDTOGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dto/InputDTOGenerator.java deleted file mode 100644 index f1794e1a4a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dto/InputDTOGenerator.java +++ /dev/null @@ -1,28 +0,0 @@ -package no.sikt.graphitron.generators.dto; - -import no.sikt.graphitron.definitions.objects.InputDefinition; -import no.sikt.graphitron.javapoet.TypeSpec; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.List; - -public class InputDTOGenerator extends DTOGenerator<InputDefinition> { - public InputDTOGenerator(ProcessedSchema processedSchema) { - super(processedSchema); - } - - @Override - public TypeSpec generate(InputDefinition target) { - return getTypeSpecBuilder(target.getName(), target.getFields()).build(); - } - - @Override - public List<TypeSpec> generateAll() { - return processedSchema - .getInputTypes() - .values() - .stream() - .map(this::generate) - .toList(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dto/InterfaceDTOGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dto/InterfaceDTOGenerator.java deleted file mode 100644 index 5311c08528..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dto/InterfaceDTOGenerator.java +++ /dev/null @@ -1,67 +0,0 @@ -package no.sikt.graphitron.generators.dto; - -import no.sikt.graphitron.definitions.objects.InterfaceDefinition; -import no.sikt.graphitron.generators.codebuilding.KeyWrapper; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphitron.javapoet.TypeSpec; -import no.sikt.graphql.schema.ProcessedSchema; - -import javax.lang.model.element.Modifier; -import java.util.HashMap; -import java.util.LinkedHashSet; -import java.util.List; - -import static no.sikt.graphitron.generators.codebuilding.KeyWrapper.getKeyMapForResolverFields; -import static org.apache.commons.lang3.StringUtils.capitalize; - -public class InterfaceDTOGenerator extends DTOGenerator<InterfaceDefinition> { - - public InterfaceDTOGenerator(ProcessedSchema processedSchema) { - super(processedSchema); - } - - @Override - public TypeSpec generate(InterfaceDefinition target) { - var interfaceBuilder = TypeSpec.interfaceBuilder(target.getName()).addModifiers(Modifier.PUBLIC); - - var keyMap = target.hasTable() ? getKeyMapForResolverFields(target.getFields(), processedSchema) : new HashMap<String, KeyWrapper>(); - - new LinkedHashSet<>(keyMap.values()).forEach(( key) -> - interfaceBuilder.addMethod( - MethodSpec.methodBuilder(key.getDTOGetterName()) - .returns(key.getTypeName()) - .addModifiers(Modifier.PUBLIC, Modifier.ABSTRACT) - .build() - ) - ); - - var implementations = processedSchema.getImplementationsForInterface(target); - - target.getFields() - .stream() - .filter(it -> !it.isExplicitlyNotGenerated()) - .filter(it -> implementations.stream().noneMatch(impl -> impl.getFieldByName(it.getName()).isExplicitlyNotGenerated())) - .filter(it -> !it.isGeneratedWithResolver() || target.hasTable()) // Skip splitQuery keys on multitable interface - .forEach(field -> { - var fieldType = getTypeNameForField(field, keyMap.computeIfAbsent(field.getName(), it -> null)); - - interfaceBuilder.addMethod( - MethodSpec.methodBuilder("get" + capitalize(getDTOVariableNameForField(field))) - .returns(fieldType) - .addModifiers(Modifier.PUBLIC, Modifier.ABSTRACT) - .build() - ); - }); - return interfaceBuilder.build(); - } - - @Override - public List<TypeSpec> generateAll() { - return processedSchema - .getInterfaces() - .values() - .stream() - .map(this::generate) - .toList(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dto/TypeDTOGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dto/TypeDTOGenerator.java deleted file mode 100644 index 4a3ef07fe9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dto/TypeDTOGenerator.java +++ /dev/null @@ -1,78 +0,0 @@ -package no.sikt.graphitron.generators.dto; - -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.javapoet.ClassName; -import no.sikt.graphitron.javapoet.TypeSpec; -import no.sikt.graphql.naming.GraphQLReservedName; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.stream.Stream; - -import static no.sikt.graphitron.configuration.GeneratorConfig.generatedModelsPackage; -import static no.sikt.graphql.naming.GraphQLReservedName.*; - -public class TypeDTOGenerator extends DTOGenerator<ObjectDefinition> { - private final static LinkedList<String> PAGE_INFO_FIELD_ORDER = new LinkedList<>( - Stream.of(HAS_PREVIOUS_PAGE_FIELD, HAS_NEXT_PAGE_FIELD, START_CURSOR_FIELD, END_CURSOR_FIELD) - .map(GraphQLReservedName::getName).toList()); - - private final static LinkedList<String> CONNECTION_FIELD_ORDER = new LinkedList<>( - Stream.of(CONNECTION_EDGE_FIELD, CONNECTION_PAGE_INFO_FIELD, CONNECTION_NODES_FIELD, CONNECTION_TOTAL_COUNT) - .map(GraphQLReservedName::getName).toList()); - - public TypeDTOGenerator(ProcessedSchema processedSchema) { - super(processedSchema); - } - - @Override - public TypeSpec generate(ObjectDefinition target) { - var fields = target.getFields(); - - // Ensure constructors for PageInfo and Connection type are in the order data fetchers expect - if (target.getName().equals(CONNECTION_PAGE_INFO_NODE.getName())) { - fields = sortFields(fields, PAGE_INFO_FIELD_ORDER); - } else if (target.getName().endsWith(SCHEMA_CONNECTION_SUFFIX.getName())) { - fields = sortFields(fields, CONNECTION_FIELD_ORDER); - } - - var classBuilder = getTypeSpecBuilder(target.getName(), fields); - - target.getImplementedInterfaces() - .forEach(i -> classBuilder.addSuperinterface(ClassName.get(generatedModelsPackage(), i))); - - processedSchema - .getUnions() - .values() - .stream() - .filter(it -> it.getFieldTypeNames().contains(target.getName())) - .forEach(it -> classBuilder.addSuperinterface(ClassName.get(generatedModelsPackage(), it.getGraphClassName().simpleName()))); - - return classBuilder.build(); - } - - private List<ObjectField> sortFields(List<ObjectField> fields, List<String> sortOrder){ - return fields.stream() - .sorted((a, b) -> sortOrder.indexOf(a.getName()) > sortOrder.indexOf(b.getName()) ? 1 : -1) - .toList(); - } - - @Override - public List<TypeSpec> generateAll() { - return processedSchema - .getObjects() - .entrySet() - .stream() - .filter(it -> !it.getKey().equals(SCHEMA_QUERY.getName())) - .filter(it -> !it.getKey().equals(SCHEMA_MUTATION.getName())) - .filter(it -> !it.getKey().equals(CONNECTION_PAGE_INFO_NODE.getName())) - .filter(it -> !processedSchema.isConnectionObject(it.getKey())) - .filter(it -> !processedSchema.isEdgeObject(it.getKey())) - .map(Map.Entry::getValue) - .map(this::generate) - .toList(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dto/UnionDTOGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dto/UnionDTOGenerator.java deleted file mode 100644 index 3609f6be8f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/dto/UnionDTOGenerator.java +++ /dev/null @@ -1,30 +0,0 @@ -package no.sikt.graphitron.generators.dto; - -import no.sikt.graphitron.definitions.objects.UnionDefinition; -import no.sikt.graphitron.javapoet.TypeSpec; -import no.sikt.graphql.schema.ProcessedSchema; - -import javax.lang.model.element.Modifier; -import java.util.List; - -public class UnionDTOGenerator extends DTOGenerator<UnionDefinition> { - - public UnionDTOGenerator(ProcessedSchema processedSchema) { - super(processedSchema); - } - - @Override - public TypeSpec generate(UnionDefinition target) { - return TypeSpec.interfaceBuilder(target.getName()).addModifiers(Modifier.PUBLIC).build(); - } - - @Override - public List<TypeSpec> generateAll() { - return processedSchema - .getUnions() - .values() - .stream() - .map(this::generate) - .toList(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/exception/ExceptionStrategyConfigurationGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/exception/ExceptionStrategyConfigurationGenerator.java deleted file mode 100644 index 6371a3019f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/exception/ExceptionStrategyConfigurationGenerator.java +++ /dev/null @@ -1,207 +0,0 @@ -package no.sikt.graphitron.generators.exception; - -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.objects.SchemaDefinition; -import no.sikt.graphitron.generators.abstractions.AbstractSchemaClassGenerator; -import no.sikt.graphitron.generators.abstractions.MethodGenerator; -import no.sikt.graphitron.generators.context.InputParser; -import no.sikt.graphitron.javapoet.*; -import no.sikt.graphql.schema.ProcessedSchema; - -import javax.lang.model.element.Modifier; -import java.util.*; -import java.util.stream.Stream; - -import static no.sikt.graphitron.configuration.ErrorHandlerType.DATABASE; -import static no.sikt.graphitron.configuration.GeneratorConfig.getRecordValidation; -import static no.sikt.graphitron.configuration.GeneratorConfig.recordValidationEnabled; -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.returnWrap; -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.setValue; -import static no.sikt.graphitron.generators.codebuilding.NameFormat.asGetMethodName; -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.wrapSet; -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.wrapStringMap; -import static no.sikt.graphitron.mappings.JavaPoetClassName.*; -import static no.sikt.graphql.naming.GraphQLReservedName.ERROR_FIELD; - -public class ExceptionStrategyConfigurationGenerator extends AbstractSchemaClassGenerator<SchemaDefinition> { - private static final String - PAYLOAD_NAME = "payload", - PAYLOAD_FOR_FIELD_NAME = PAYLOAD_NAME + "ForField", - EXCEPTION_FIELD = "fieldsForException"; - private static final ParameterizedTypeName FIELDS_FOR_EXCEPTIONS_TYPE = - ParameterizedTypeName.get(MAP.className, ParameterizedTypeName.get(CLASS.className, - WildcardTypeName.subtypeOf(THROWABLE.className)), wrapSet(STRING.className)); - private static final TypeName PAYLOAD_FOR_FIELDS_TYPE = wrapStringMap(PAYLOAD_CREATOR.className); - private final Map<ClassName, Set<String>> seenFieldsForException; - - public ExceptionStrategyConfigurationGenerator(ProcessedSchema processedSchema) { - super(processedSchema); - seenFieldsForException = new HashMap<>(); - } - - @Override - public TypeSpec generate(SchemaDefinition schemaDefinition) { - return getSpec("GeneratedExceptionStrategyConfiguration", List.of()) - .addMethod(createConstructor(schemaDefinition)) - .build(); - } - - private MethodSpec createConstructor(SchemaDefinition schemaDefinition) { - return MethodSpec.constructorBuilder() - .addModifiers(Modifier.PUBLIC) - .addStatement("$N = new $T<>()", EXCEPTION_FIELD, HASH_MAP.className) - .addStatement("$N = new $T<>()", PAYLOAD_FOR_FIELD_NAME, HASH_MAP.className) - .addCode(createConstructorContentForFields(schemaDefinition)) - .build(); - } - - private CodeBlock createConstructorContentForFields(SchemaDefinition schemaDefinition) { - var queryType = schemaDefinition.getQuery() != null ? processedSchema.getObject(schemaDefinition.getQuery()) : null; - var mutationType = schemaDefinition.getMutation() != null ? processedSchema.getObject(schemaDefinition.getMutation()) : null; - - return Stream - .concat(queryType != null ? queryType.getFields().stream() : Stream.of(), mutationType != null ? mutationType.getFields().stream() : Stream.of()) - .sorted(Comparator.comparing(ObjectField::getName)) - .map(field -> { - var ctx = new InputParser(field, processedSchema); - var payloadBlockBuilder = CodeBlock.builder(); - - if (ctx.getValidationErrorException().isPresent()) { - payloadBlockBuilder - .add(createFieldsForExceptionBlock(field, VALIDATION_VIOLATION_EXCEPTION.className)) - .add(createFieldsForExceptionBlock(field, ILLEGAL_ARGUMENT_EXCEPTION.className)); - } - - for (var errorField : ctx.getAllErrors()) { - for (var exc : processedSchema.getExceptionDefinitions(errorField.getTypeName())) { - - exc.getExceptionToErrorMappings().forEach(mapping -> { - try { - payloadBlockBuilder.add(createFieldsForExceptionBlock(field, - mapping.getHandler() == DATABASE - ? DATA_ACCESS_EXCEPTION.className - : ClassName.get(Class.forName(mapping.getExceptionClassName())))); - } catch (ClassNotFoundException e) { - throw new IllegalArgumentException("Unable to find exception className: " + mapping.getExceptionClassName() + - ", declared for operation: " + field.getName(), e); - } - }); - } - } - - if (payloadBlockBuilder.isEmpty()) { - return CodeBlock.empty(); - } - - return payloadBlockBuilder - .add(createPayloadForFieldBlock(field, ctx)) - .add("\n") - .build(); - }) - .collect(CodeBlock.joining()); - } - - private CodeBlock createFieldsForExceptionBlock(ObjectField field, ClassName exceptionClassName) { - CodeBlock.Builder codeBlock = CodeBlock.builder(); - - if (seenFieldsForException.containsKey(exceptionClassName)) { - if (!seenFieldsForException.get(exceptionClassName).contains(field.getName())) { - seenFieldsForException.get(exceptionClassName).add(field.getName()); - codeBlock.addStatement("$N.get($T.class).add($S)", EXCEPTION_FIELD, exceptionClassName, field.getName()); - } - } else { - HashSet<String> seenFields = new HashSet<>(); - seenFields.add(field.getName()); - seenFieldsForException.put(exceptionClassName, seenFields); - codeBlock.addStatement("$N.computeIfAbsent($T.class, k -> new $T<>()).add($S)", EXCEPTION_FIELD, exceptionClassName, HashSet.class, field.getName()); - } - - return codeBlock.build(); - } - - private CodeBlock createPayloadForFieldBlock(ObjectField field, InputParser ctx) { - var errorBlocks = ctx - .getAllErrors() - .stream() - .map(errorField -> - setValue( - PAYLOAD_NAME, - errorField.getMappingFromSchemaName(), - CodeBlock.of( - "($T) $N", - ParameterizedTypeName.get(LIST.className, processedSchema.getErrorTypeDefinition(errorField.getTypeName()).getGraphClassName()), - ERROR_FIELD.getName() - ) - ) - ) - .toList(); - return CodeBlock - .builder() - .add("$N.put($S, ", PAYLOAD_FOR_FIELD_NAME, field.getName()) - .beginControlFlow("$L ->", ERROR_FIELD.getName()) - .declareNew(PAYLOAD_NAME, processedSchema.getObject(field.getTypeName()).getGraphClassName()) - .addAll(errorBlocks) - .add(returnWrap(PAYLOAD_NAME)) - .endControlFlow(")") - .build(); - } - - @Override - public List<TypeSpec> generateAll() { - if (recordValidationEnabled() && getRecordValidation().getSchemaErrorType().isPresent() || schemaContainsExceptionToErrorMappings()) { - var generated = Optional - .ofNullable(processedSchema.getSchemaType()) - .map(this::generate) - .filter(it -> !it.methodSpecs().isEmpty()); - if (generated.isPresent()) { - return List.of(generated.get()); - } - } - return List.of(); - } - - private boolean schemaContainsExceptionToErrorMappings() { - return processedSchema.getExceptions().values().stream().anyMatch(it -> !it.getExceptionToErrorMappings().isEmpty()); - } - - @Override - public String getDefaultSaveDirectoryName() { - return "exception"; - } - - @Override - public String getFileNameSuffix() { - return ""; - } - - @Override - public TypeSpec.Builder getSpec(String className, List<? extends MethodGenerator> generators) { - return TypeSpec.classBuilder(className) - .addSuperinterface(EXCEPTION_STRATEGY_CONFIGURATION.className) - .addModifiers(Modifier.PUBLIC) - .addField(FieldSpec.builder(FIELDS_FOR_EXCEPTIONS_TYPE, EXCEPTION_FIELD, Modifier.PRIVATE, Modifier.FINAL).build()) - .addField(FieldSpec.builder(PAYLOAD_FOR_FIELDS_TYPE, PAYLOAD_FOR_FIELD_NAME, Modifier.PRIVATE, Modifier.FINAL).build()) - .addMethod(createGetFieldsForExceptionsMethod()) - .addMethod(createGetPayloadForFieldsMethod()); - } - - private static MethodSpec createGetFieldsForExceptionsMethod() { - return MethodSpec - .methodBuilder(asGetMethodName(EXCEPTION_FIELD)) - .returns(FIELDS_FOR_EXCEPTIONS_TYPE) - .addModifiers(Modifier.PUBLIC) - .addAnnotation(OVERRIDE.className) - .addCode(returnWrap(EXCEPTION_FIELD)) - .build(); - } - - private static MethodSpec createGetPayloadForFieldsMethod() { - return MethodSpec - .methodBuilder(asGetMethodName(PAYLOAD_FOR_FIELD_NAME)) - .returns(PAYLOAD_FOR_FIELDS_TYPE) - .addModifiers(Modifier.PUBLIC) - .addAnnotation(OVERRIDE.className) - .addCode(returnWrap(PAYLOAD_FOR_FIELD_NAME)) - .build(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/exception/ExceptionToErrorMappingProviderGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/exception/ExceptionToErrorMappingProviderGenerator.java deleted file mode 100644 index fa368f6564..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/exception/ExceptionToErrorMappingProviderGenerator.java +++ /dev/null @@ -1,238 +0,0 @@ -package no.sikt.graphitron.generators.exception; - -import no.sikt.graphitron.configuration.ErrorHandlerType; -import no.sikt.graphitron.configuration.ExceptionToErrorMapping; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.objects.ExceptionDefinition; -import no.sikt.graphitron.definitions.objects.SchemaDefinition; -import no.sikt.graphitron.generators.abstractions.AbstractSchemaClassGenerator; -import no.sikt.graphitron.generators.abstractions.MethodGenerator; -import no.sikt.graphitron.generators.context.InputParser; -import no.sikt.graphitron.javapoet.*; -import no.sikt.graphql.schema.ProcessedSchema; - -import javax.lang.model.element.Modifier; -import java.util.*; -import java.util.stream.Stream; - -import static no.sikt.graphitron.configuration.ErrorHandlerType.DATABASE; -import static no.sikt.graphitron.configuration.ErrorHandlerType.GENERIC; -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.listOf; -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.returnWrap; -import static no.sikt.graphitron.generators.codebuilding.NameFormat.asGetMethodName; -import static no.sikt.graphitron.generators.codebuilding.NameFormat.asListedName; -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.wrapList; -import static no.sikt.graphitron.mappings.JavaPoetClassName.*; - -public class ExceptionToErrorMappingProviderGenerator extends AbstractSchemaClassGenerator<SchemaDefinition> { - private static final String DATA_ACCESS_MAPPINGS_FOR_FIELD_NAME = "dataAccessMappingsForOperation"; - private static final String GENERIC_MAPPINGS_FOR_FIELD_NAME = "genericMappingsForOperation"; - - private static final TypeName DATA_ACCESS_ERROR_MAPPINGS_TYPE = ParameterizedTypeName.get(MAP.className, STRING.className, wrapList(DATA_ACCESS_EXCEPTION_CONTENT_TO_ERROR_MAPPING.className)); - private static final TypeName GENERIC_ERROR_MAPPINGS_TYPE = ParameterizedTypeName.get(MAP.className, STRING.className, wrapList(GENERIC_EXCEPTION_CONTENT_TO_ERROR_MAPPING.className)); - private static final String MAPPING_VARIABLE_PREFIX = "m"; - - public ExceptionToErrorMappingProviderGenerator(ProcessedSchema processedSchema) { - super(processedSchema); - } - - @Override - public TypeSpec generate(SchemaDefinition schemaDefinition) { - return getSpec("GeneratedExceptionToErrorMappingProvider", List.of()) - .addMethod(createConstructor(schemaDefinition)) - .build(); - } - - private MethodSpec createConstructor(SchemaDefinition schemaDefinition) { - return MethodSpec.constructorBuilder() - .addModifiers(Modifier.PUBLIC) - .addCode(CodeBlock.builder() - .addStatement("$N = new $T<>()", DATA_ACCESS_MAPPINGS_FOR_FIELD_NAME, HASH_MAP.className) - .addStatement("$N = new $T<>()", GENERIC_MAPPINGS_FOR_FIELD_NAME, HASH_MAP.className) - .add(createConstructorContentForFields(schemaDefinition)) - .build()) - .build(); - } - - private CodeBlock createConstructorContentForFields(SchemaDefinition schemaDefinition) { - Map<ExceptionToErrorMapping, Integer> exceptionMappingsToErrorMappingVariables = new HashMap<>(); - Map<Integer, CodeBlock> mappingVariablesToBlocks = new HashMap<>(); - - var queryType = schemaDefinition.getQuery() != null ? processedSchema.getObject(schemaDefinition.getQuery()) : null; - var mutationType = schemaDefinition.getMutation() != null ? processedSchema.getObject(schemaDefinition.getMutation()) : null; - var errorListsCodeblock = Stream - .concat(queryType != null ? queryType.getFields().stream() : Stream.of(), mutationType != null ? mutationType.getFields().stream() : Stream.of()) - .sorted(Comparator.comparing(ObjectField::getName)) - .map(it -> new OperationProcessor(it).process(exceptionMappingsToErrorMappingVariables, mappingVariablesToBlocks)) - .collect(CodeBlock.joining()); - - var codeBuilder = CodeBlock.builder(); - mappingVariablesToBlocks.forEach((key, value) -> codeBuilder.declare(MAPPING_VARIABLE_PREFIX + key, value)); - - codeBuilder.add(errorListsCodeblock); - return codeBuilder.build(); - } - - @Override - public List<TypeSpec> generateAll() { - if (processedSchema.getExceptions().entrySet().stream().anyMatch(it -> !it.getValue().getExceptionToErrorMappings().isEmpty())) { - var generated = Optional - .ofNullable(processedSchema.getSchemaType()) - .map(this::generate) - .filter(it -> !it.methodSpecs().isEmpty()); - if (generated.isPresent()) { - return List.of(generated.get()); - } - } - return List.of(); - } - - @Override - public String getDefaultSaveDirectoryName() { - return "exception"; - } - - @Override - public String getFileNameSuffix() { - return ""; - } - - @Override - public TypeSpec.Builder getSpec(String className, List<? extends MethodGenerator> generators) { - return TypeSpec.classBuilder(className) - .addSuperinterface(EXCEPTION_TO_ERROR_MAPPING_PROVIDER.className) - .addModifiers(Modifier.PUBLIC) - .addField(FieldSpec.builder(DATA_ACCESS_ERROR_MAPPINGS_TYPE, DATA_ACCESS_MAPPINGS_FOR_FIELD_NAME, Modifier.PRIVATE, Modifier.FINAL).build()) - .addField(FieldSpec.builder(GENERIC_ERROR_MAPPINGS_TYPE, GENERIC_MAPPINGS_FOR_FIELD_NAME, Modifier.PRIVATE, Modifier.FINAL).build()) - .addMethod(createGetDataAccessMappingsForMethod()) - .addMethod(createGetGenericMappingsForMethod()); - } - - private static MethodSpec createGetDataAccessMappingsForMethod() { - return MethodSpec - .methodBuilder(asGetMethodName(DATA_ACCESS_MAPPINGS_FOR_FIELD_NAME)) - .returns(DATA_ACCESS_ERROR_MAPPINGS_TYPE) - .addModifiers(Modifier.PUBLIC) - .addAnnotation(OVERRIDE.className) - .addCode(returnWrap(DATA_ACCESS_MAPPINGS_FOR_FIELD_NAME)) - .build(); - } - - private static MethodSpec createGetGenericMappingsForMethod() { - return MethodSpec - .methodBuilder(asGetMethodName(GENERIC_MAPPINGS_FOR_FIELD_NAME)) - .returns(GENERIC_ERROR_MAPPINGS_TYPE) - .addModifiers(Modifier.PUBLIC) - .addAnnotation(OVERRIDE.className) - .addCode(returnWrap(GENERIC_MAPPINGS_FOR_FIELD_NAME)) - .build(); - } - - private class OperationProcessor { - private static final String MSG_VARIABLE_NAME = "msg"; - private final List<ObjectField> errors; - private final String operationName; - private boolean databaseMappingIsCreatedForField = false; - private boolean genericMappingIsCreatedForField = false; - - OperationProcessor(ObjectField field) { - this.errors = new InputParser(field, processedSchema).getAllErrors(); - this.operationName = field.getName(); - } - - public CodeBlock process(Map<ExceptionToErrorMapping, Integer> exceptionMappingsToErrorMappingVariables, Map<Integer, CodeBlock> mappingVariablesToBlocks) { - var codeBuilder = CodeBlock.builder(); - var databaseListName = asListedName(operationName + DATABASE.toCamelCaseString()); - var genericListName = asListedName(operationName + GENERIC.toCamelCaseString()); - - for (var errorField : errors) { - List<ExceptionDefinition> exceptionDefinitions = processedSchema.getExceptionDefinitions(errorField.getTypeName()); - - var databaseMappingVariablesBlock = createMappingVariablesBlock(exceptionDefinitions, DATABASE, exceptionMappingsToErrorMappingVariables, mappingVariablesToBlocks); - var genericMappingVariablesBlock = createMappingVariablesBlock(exceptionDefinitions, GENERIC, exceptionMappingsToErrorMappingVariables, mappingVariablesToBlocks); - - if (!databaseMappingVariablesBlock.isEmpty()) { - codeBuilder.add("\n"); - codeBuilder.declare(databaseListName, listOf(databaseMappingVariablesBlock)); - databaseMappingIsCreatedForField = true; - } - - if (!genericMappingVariablesBlock.isEmpty()) { - codeBuilder.add("\n"); - codeBuilder.declare(genericListName, listOf(genericMappingVariablesBlock)); - genericMappingIsCreatedForField = true; - } - } - - if (databaseMappingIsCreatedForField) { - codeBuilder.addStatement("$N.put($S, $N)", DATA_ACCESS_MAPPINGS_FOR_FIELD_NAME, operationName, databaseListName); - } - - if (genericMappingIsCreatedForField) { - codeBuilder.addStatement("$N.put($S, $N)", GENERIC_MAPPINGS_FOR_FIELD_NAME, operationName, genericListName); - } - - return codeBuilder.build(); - } - - private CodeBlock createMappingVariablesBlock(List<ExceptionDefinition> exceptionDefinitions, ErrorHandlerType handlerType, Map<ExceptionToErrorMapping, Integer> exceptionMappingsToErrorMappingVariables, Map<Integer, CodeBlock> mappingVariablesToBlocks) { - return exceptionDefinitions.stream() - .map(ExceptionDefinition::getExceptionToErrorMappings) - .flatMap(Collection::stream) - .filter(it -> it.getHandler() == handlerType) - .map(it -> processErrorMapping(it, exceptionMappingsToErrorMappingVariables, mappingVariablesToBlocks)) - .collect(CodeBlock.joining(", ")); - } - - private CodeBlock processErrorMapping(ExceptionToErrorMapping errorMapping, Map<ExceptionToErrorMapping, Integer> exceptionMappingsToErrorMappingVariables, Map<Integer, CodeBlock> mappingVariablesToBlocks) { - var codeBuilder = CodeBlock.builder(); - var variableNumber = exceptionMappingsToErrorMappingVariables.get(errorMapping); - - if (variableNumber == null) { - int numberOfMappingVariablesFound = exceptionMappingsToErrorMappingVariables.size() + 1; - exceptionMappingsToErrorMappingVariables.put(errorMapping, numberOfMappingVariablesFound); - - switch (errorMapping.getHandler()) { - case DATABASE: - mappingVariablesToBlocks.put(numberOfMappingVariablesFound, - createExceptionToErrorMappingCodeBlock( - DATA_ACCESS_EXCEPTION_CONTENT_TO_ERROR_MAPPING.className, - DATA_ACCESS_EXCEPTION_MAPPING_CONTENT.className, - errorMapping)); - break; - case GENERIC: - mappingVariablesToBlocks.put(numberOfMappingVariablesFound, - createExceptionToErrorMappingCodeBlock( - GENERIC_EXCEPTION_CONTENT_TO_ERROR_MAPPING.className, - GENERIC_EXCEPTION_MAPPING_CONTENT.className, - errorMapping)); - break; - default: - throw new IllegalArgumentException("Unknown handler: " + errorMapping.getHandler()); - } - variableNumber = numberOfMappingVariablesFound; - } - - codeBuilder.add("$L$L", MAPPING_VARIABLE_PREFIX, variableNumber); - return codeBuilder.build(); - } - - private CodeBlock createExceptionToErrorMappingCodeBlock(ClassName contentToErrorMappingClassName, ClassName contentClassName, ExceptionToErrorMapping exceptionToErrorMapping) { - return CodeBlock.builder() - .add("new $T(\n", contentToErrorMappingClassName) - .indent() - .add("new $T($L, $S),\n", - contentClassName, - contentToErrorMappingClassName.equals(DATA_ACCESS_EXCEPTION_CONTENT_TO_ERROR_MAPPING.className) - ? CodeBlock.of("$S, $S", exceptionToErrorMapping.getDatabaseErrorCode(), exceptionToErrorMapping.getSqlState()) - : CodeBlock.of("$S", exceptionToErrorMapping.getExceptionClassName()), - exceptionToErrorMapping.getExceptionMessageContains()) - .add("(path, $L) -> new $T(path, $L))", - MSG_VARIABLE_NAME, - processedSchema.getObject(exceptionToErrorMapping.getErrorTypeName()).getGraphClassName(), - exceptionToErrorMapping.getErrorDescription().map(it -> CodeBlock.of("$S", it)).orElse(CodeBlock.of(MSG_VARIABLE_NAME))) - .unindent() - .build(); - } - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/mapping/JavaRecordMapperClassGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/mapping/JavaRecordMapperClassGenerator.java deleted file mode 100644 index 6c81fc8df6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/mapping/JavaRecordMapperClassGenerator.java +++ /dev/null @@ -1,30 +0,0 @@ -package no.sikt.graphitron.generators.mapping; - -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.generators.abstractions.AbstractMapperClassGenerator; -import no.sikt.graphitron.javapoet.TypeSpec; -import no.sikt.graphql.schema.ProcessedSchema; - -public class JavaRecordMapperClassGenerator extends AbstractMapperClassGenerator<GenerationField> { - public static final String FILE_NAME_TO_SUFFIX = "JavaMapper", FILE_NAME_FROM_SUFFIX = "TypeMapper"; - - public JavaRecordMapperClassGenerator(ProcessedSchema processedSchema, boolean toRecord) { - super(processedSchema, toRecord); - } - - @Override - public TypeSpec generate(GenerationField target) { - return getSpec(processedSchema.getRecordType(target).getName(), new JavaRecordMapperMethodGenerator(target, processedSchema, isToRecord())).build(); - } - - @Override - protected boolean filterProperties(GenerationField field) { - return processedSchema.getRecordType(field).hasJavaRecordReference() - && (isToRecord() ? processedSchema.isInputType(field) : processedSchema.isObject(field)); - } - - @Override - public String getFileNameSuffix() { - return isToRecord() ? FILE_NAME_TO_SUFFIX : FILE_NAME_FROM_SUFFIX; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/mapping/JavaRecordMapperMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/mapping/JavaRecordMapperMethodGenerator.java deleted file mode 100644 index 7d9dd175bd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/mapping/JavaRecordMapperMethodGenerator.java +++ /dev/null @@ -1,438 +0,0 @@ -package no.sikt.graphitron.generators.mapping; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.definitions.mapping.JOOQMapping; -import no.sikt.graphitron.definitions.mapping.MethodMapping; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.generators.abstractions.AbstractMapperMethodGenerator; -import no.sikt.graphitron.generators.context.MapperContext; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphitron.mappings.TableReflection; -import no.sikt.graphql.schema.ProcessedSchema; -import org.jetbrains.annotations.NotNull; - -import java.util.*; -import java.util.stream.Collectors; - -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.*; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.*; -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.*; -import static no.sikt.graphitron.generators.context.NodeIdReferenceHelpers.*; -import static no.sikt.graphitron.mappings.JavaPoetClassName.ARRAY_LIST; -import static no.sikt.graphitron.mappings.JavaPoetClassName.MAPPER_HELPER; -import static no.sikt.graphitron.mappings.ReflectionHelpers.getJooqRecordClassForNodeIdInputField; -import static no.sikt.graphitron.mappings.TableReflection.getTableName; - -public class JavaRecordMapperMethodGenerator extends AbstractMapperMethodGenerator { - static final String INDEX_VAR_NAME = namedIndexIteratorPrefix("nodeIdIndex"); - static final String SIZE_VAR_NAME = internalPrefix("nodeIdListSize"); - public JavaRecordMapperMethodGenerator(GenerationField localField, ProcessedSchema processedSchema, boolean toRecord) { - super(localField, processedSchema, toRecord); - } - - @Override - public MethodSpec generate(GenerationField target) { - return getMapperSpecBuilder(target).build(); - } - - - @Override - protected CodeBlock iterateRecords(MapperContext context){ - return iterateRecords(context, 0); - } - - /** - * @return Code for setting the record data from input types. - */ - @NotNull - protected CodeBlock iterateRecords(MapperContext context, int argDepth) { - var argumentSetName = argDepth == 0 ? VAR_ARGS : VAR_NEXT_ARGS + (argDepth - 1); - if (context.isIterable() && !context.hasRecordReference()) { - return CodeBlock.empty(); // Can not allow this, because input type may contain multiple fields. These can not be mapped to a single field in any reasonable way. - } - - var fieldCode = CodeBlock.builder(); - var allFields = context - .getTargetType() - .getFields() - .stream() - .filter(it -> !(it.isExplicitlyNotGenerated() || (it.createsDataFetcher() && toRecord))) - .toList(); - - // Group @nodeId fields targeting jOOQ records - var nodeIdGroups = groupNodeIdFields(allFields); - var regularFields = getNonNodeIdFields(allFields, nodeIdGroups); - - // Generate code for @nodeId groups first - for (var group : nodeIdGroups.values()) { - fieldCode - .add(generateNodeIdGroupCode(group, context)) - .add("\n"); - } - - // Process regular fields as before - for (var innerField : regularFields) { - var innerContext = context.iterateContext(innerField); - if (innerContext.targetCanNotBeMapped()) { - continue; - } - - var varName = inputPrefix(innerContext.getHelperVariableName()); - var innerCode = CodeBlock.builder(); - if (!innerContext.getTarget().createsDataFetcher()) { - if (!innerContext.targetIsType()) { - innerCode.add(innerContext.getFieldSetMappingBlock()); - } else if (innerContext.hasRecordReference()) { - innerCode.add(innerContext.getRecordSetMappingBlock()); - } else if (toRecord) { - innerCode - .declare(VAR_NEXT_ARGS + argDepth, "$N.child($S)", argumentSetName, innerField.getName()) - .add(iterateRecords(innerContext, argDepth + 1)); - } else { - innerCode.add(iterateRecords(innerContext)); - } - } else { - innerCode.add(innerContext.getResolverKeySetMappingBlock(varName)); - } - - if (!innerCode.isEmpty()) { - var notAlreadyDefined = innerContext.variableNotAlreadyDeclared(); - var shouldDeclareVariable = notAlreadyDefined || innerContext.getTarget().createsDataFetcher(); - var nullBlock = CodeBlock.ofIf(shouldDeclareVariable, "$N != null", varName); - var isWrapperWithoutRecord = innerContext.targetIsType() && !innerContext.hasRecordReference() && !innerContext.getTarget().createsDataFetcher(); - - var presenceCheck = isWrapperWithoutRecord && toRecord - ? CodeBlock.empty() - : toRecord - ? CodeBlock.of("$L.hasField($S)", argumentSetName, innerField.getName()) - : selectionSetLookup(innerContext.getPath(), false, false); - var condition = !shouldDeclareVariable - ? presenceCheck - : presenceCheck.isEmpty() - ? nullBlock - : CodeBlock.join(" && ", nullBlock, presenceCheck); - fieldCode - .declareIf(shouldDeclareVariable, varName, innerContext.getSourceGetCallBlock()) - .beginControlFlow("if ($L)", condition) - .add(innerCode.build()) - .endControlFlow() - .add("\n"); - } - } - - return context.wrapFields(fieldCode.build()); - } - - @Override - public boolean mapsJavaRecord() { - return true; - } - - /** - * Groups @nodeId fields that target the same jOOQ record field. - * Non-@nodeId fields and @nodeId fields without jOOQ record targets are not grouped. - */ - private Map<String, NodeIdFieldGroup> groupNodeIdFields(List<? extends GenerationField> fields) { - Map<String, NodeIdFieldGroup> groups = new LinkedHashMap<>(); - - for (var field : fields) { - var jooqRecordClass = getJooqRecordClassForNodeIdInputField(field, processedSchema); - if (jooqRecordClass.isPresent()) { - String targetName = field.getJavaRecordMethodMapping(true).getName(); - groups.computeIfAbsent(targetName, k -> new NodeIdFieldGroup(k, jooqRecordClass.get())) - .addField(field); - } - } - - return groups; - } - - /** - * Returns fields that are NOT part of any @nodeId group (processed normally). - */ - private List<? extends GenerationField> getNonNodeIdFields( - List<? extends GenerationField> allFields, - Map<String, NodeIdFieldGroup> groups) { - Set<GenerationField> groupedFields = groups.values().stream() - .flatMap(g -> g.getFields().stream()) - .collect(Collectors.toSet()); - - return allFields.stream() - .filter(f -> !groupedFields.contains(f)) - .toList(); - } - - /** - * Generates code to create and populate a jOOQ record from @nodeId fields. - * @param group The group of @nodeId fields targeting the same jOOQ record - * @param context The current mapper context - * @return CodeBlock containing the generated code - */ - private CodeBlock generateNodeIdGroupCode(NodeIdFieldGroup group, MapperContext context) { - if (group.isListed()) { - return generateListedNodeIdGroupCode(group, context); - } - - var code = CodeBlock.builder(); - var targetVarName = inputPrefix(group.getTargetFieldName()); - var hasValueVarName = targetVarName + "HasValue"; - var jooqRecordClass = group.getJooqRecordClass(); - - // Detect overlapping columns that need runtime validation - var overlappingColumns = detectOverlappingColumns(group); - - // Declare the jOOQ record variable and hasValue flag - code - .declare(targetVarName, "new $T()", jooqRecordClass) - .declare(hasValueVarName, "false"); - - // Generate code for each @nodeId field in the group - for (var field : group.getFields()) { - code.add(generateSingleNodeIdFieldCode(field, targetVarName, hasValueVarName, context, overlappingColumns.keySet(), jooqRecordClass)); - } - - // Set the final value on the output record - var outputVar = outputPrefix(context.getTargetName()); - var setterMapping = new MethodMapping(group.getTargetFieldName()); - code.addStatement("$N.$L($N ? $N : null)", outputVar, setterMapping.asSet(), hasValueVarName, targetVarName); - - return code.build(); - } - - /** - * Generates code for listed @nodeId field groups that produce a List of jOOQ records. - * Validates same length at runtime, then iterates with indexed for loop constructing one record per index. - */ - private CodeBlock generateListedNodeIdGroupCode(NodeIdFieldGroup group, MapperContext context) { - var overlappingColumns = detectOverlappingColumns(group); - - var fields = group.getFields(); - var targetFieldName = group.getTargetFieldName(); - var targetVarName = mapperRecordInputPrefix(targetFieldName); - var listOutputVarName = listedOutputPrefix(targetFieldName); - var hasValueVarName = targetVarName + "HasValue"; - var jooqRecordClass = group.getJooqRecordClass(); - var outputVar = outputPrefix(context.getTargetName()); - var setterMapping = new MethodMapping(targetFieldName); - var sourceName = context.getSourceName(); - var inputVar = namedIteratorPrefix(sourceName); - - var code = CodeBlock.builder(); - - var listVarNames = new ArrayList<String>(); - for (var field : fields) { - var listVarName = mapperNodeInputPrefix(field.getName()); - listVarNames.add(listVarName); - var getterMapping = new MethodMapping(field.getName()); - code.declare(listVarName, - "$L.hasField($S) ? $L : null", VAR_ARGS, field.getName(), - asMethodCall(inputVar, getterMapping.asGet())); - } - - var orCondition = listVarNames.stream() - .map(name -> CodeBlock.of("$N != null", name)) - .collect(CodeBlock.joining(" || ")); - code.beginControlFlow("if ($L)", orCondition); - - var validateArgs = listVarNames.stream() - .map(name -> CodeBlock.of("$N", name)) - .collect(CodeBlock.joining(", ")); - code.addStatement("$T.validateListLengths($L)", MAPPER_HELPER.className, validateArgs); - - var sizeExpression = CodeBlock.of("0"); - for (int i = listVarNames.size() - 1; i >= 0; i--) { - sizeExpression = CodeBlock.of("$N != null ? $N.size() : $L", listVarNames.get(i), listVarNames.get(i), sizeExpression); - } - code - .declare(SIZE_VAR_NAME, sizeExpression) - .declare(listOutputVarName, "new $T<$T>()", ARRAY_LIST.className, jooqRecordClass) - .beginControlFlow("for (int $1L = 0; $1N < $2N; $1N++)", - INDEX_VAR_NAME, SIZE_VAR_NAME) - .declare(targetVarName, "new $T()", jooqRecordClass) - .declare(hasValueVarName, "false"); - - for (var field : fields) { - var listVarName = mapperNodeInputPrefix(field.getName()); - code - .beginControlFlow("if ($N != null)", listVarName) - .declare(VAR_NODE_ID_VALUE, "$N.get($N)", listVarName, INDEX_VAR_NAME) - .beginControlFlow("if ($N != null)", VAR_NODE_ID_VALUE) - .add(generateNodeIdFieldValueCode(field, targetVarName, hasValueVarName, overlappingColumns.keySet(), jooqRecordClass)) - .endControlFlow() - .endControlFlow(); - } - - return code - .addStatement("$N.add($N ? $N : null)", listOutputVarName, hasValueVarName, targetVarName) - .endControlFlow() - .addStatement("$N.$L($N)", outputVar, setterMapping.asSet(), listOutputVarName) - .endControlFlow().build(); - } - - /** - * Generates code for a single @nodeId field within a group. - * @param field The @nodeId field - * @param targetVarName The variable name of the target jOOQ record - * @param hasValueVarName The variable name of the hasValue flag - * @param context The current mapper context - * @param overlappingColumns Set of column names that are written by multiple fields in the group - * @param jooqRecordClass The target jOOQ record class (from the group) - * @return CodeBlock containing the generated code - */ - private CodeBlock generateSingleNodeIdFieldCode( - GenerationField field, - String targetVarName, - String hasValueVarName, - MapperContext context, - Set<String> overlappingColumns, - Class<?> jooqRecordClass) { - - var sourceName = context.getSourceName(); - var inputVar = namedIteratorPrefix(sourceName); - var getterMapping = new MethodMapping(field.getName()); - - return CodeBlock.builder() - .beginControlFlow("if ($N.hasField($S))", VAR_ARGS, field.getName()) - .declare(VAR_NODE_ID_VALUE, asMethodCall(inputVar, getterMapping.asGet())) - .add( - wrapNotNull( - VAR_NODE_ID_VALUE, - generateNodeIdFieldValueCode( - field, - targetVarName, - hasValueVarName, - overlappingColumns, - jooqRecordClass - ) - ) - ) - .endControlFlow() - .add("\n") - .build(); - } - - /** - * Generates the core code for processing a single @nodeId field value: - * overlap validation, hasValue flag, and setRecordId call. - * Assumes {@code VAR_NODE_ID_VALUE} has already been declared and null-checked by the caller. - */ - private CodeBlock generateNodeIdFieldValueCode( - GenerationField field, - String targetVarName, - String hasValueVarName, - Set<String> overlappingColumns, - Class<?> jooqRecordClass) { - - var nodeType = processedSchema.getNodeTypeForNodeIdFieldOrThrow(field); - - var jooqRecordTable = JOOQMapping.fromTable(getTableName(jooqRecordClass)); - var isReference = isNodeIdReferenceField(field, processedSchema, jooqRecordTable); - var keyFields = resolveColumnNamesForNodeIdField(field, processedSchema, jooqRecordTable); - var columnsBlock = tableFieldsBlock(staticTableInstanceBlock(jooqRecordTable.getName()), keyFields); - - var code = CodeBlock.builder(); - - if (!overlappingColumns.isEmpty()) { - var hasOverlap = keyFields.stream().anyMatch(overlappingColumns::contains); - code.addIf(hasOverlap && GeneratorConfig.validateOverlappingInputFields(), - () -> generateOverlapValidationCode(field, targetVarName, nodeType, overlappingColumns, jooqRecordClass)); - } - - return code - .addStatement("$N = true", hasValueVarName) - .addStatement("$N.$L($N, $N, $S, $L)", - VAR_NODE_STRATEGY, - isReference ? METHOD_SET_RECORD_REFERENCE_ID : METHOD_SET_RECORD_ID, - targetVarName, VAR_NODE_ID_VALUE, processedSchema.getNodeConfigurationForTypeOrThrow(nodeType).typeId(), columnsBlock) - .build(); - } - - /** - * Detects columns that are written by multiple @nodeId fields in a group. - * Returns a map of column name -> list of fields that write to it. - * Only returns columns with multiple writers (actual overlaps). - * @param group The group of @nodeId fields - * @return Map of overlapping column names to the fields that write to them - */ - private Map<String, List<GenerationField>> detectOverlappingColumns(NodeIdFieldGroup group) { - Map<String, List<GenerationField>> columnToFields = new LinkedHashMap<>(); - - for (var field : group.getFields()) { - var tableName = getTableName(group.getJooqRecordClass()); - - var keyColumns = resolveColumnNamesForNodeIdField(field, processedSchema, JOOQMapping.fromTable(tableName)); - for (var columnName : keyColumns) { - columnToFields.computeIfAbsent(columnName, k -> new ArrayList<>()) - .add(field); - } - } - - // Return only columns with multiple writers - return columnToFields.entrySet().stream() - .filter(e -> e.getValue().size() > 1) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (a, b) -> a, LinkedHashMap::new)); - } - - /** - * Generates code to validate that overlapping columns have consistent values. - * This is called before setting a value when a column might have already been set - * by a previous @nodeId field in the same group. - * - * @param field The current @nodeId field - * @param targetVarName The variable name of the target jOOQ record - * @param nodeType The node type definition for this field - * @param overlappingColumns Set of column names that overlap with other fields - * @param jooqRecordClass The target jOOQ record class - * @return CodeBlock containing the validation code - */ - private CodeBlock generateOverlapValidationCode( - GenerationField field, - String targetVarName, - ObjectDefinition nodeType, - Set<String> overlappingColumns, - Class<?> jooqRecordClass) { - - var tableName = getTableName(jooqRecordClass); - var keyColumns = resolveColumnNamesForNodeIdField(field, processedSchema, JOOQMapping.fromTable(tableName)); - var tableClass = TableReflection.getTableByJavaFieldName(tableName) - .orElseThrow(() -> new RuntimeException("Unknown table " + tableName)) - .getClass(); - - var code = CodeBlock.builder(); - var javaNameKeyColumns = keyColumns.stream().map(columnName -> - TableReflection.getJavaFieldName(tableName, columnName).orElseThrow(() -> new RuntimeException("Column " + columnName + " not found in table " + tableName)) - ).map(javaFieldName -> CodeBlock.of("$T.$N.$N", tableClass, tableName, javaFieldName)).collect(CodeBlock.joining(", ")); - - - - // For each key column that overlaps with other fields - for (String columnName : keyColumns) { - if (!overlappingColumns.contains(columnName)) { - continue; - } - - - var javaFieldName = TableReflection.getJavaFieldName(tableName, columnName) - .orElseThrow(() -> new RuntimeException("Column " + columnName + " not found in table " + tableName)); - var nameMapping = new MethodMapping(javaFieldName); - - code.addStatement("$T.$L($N, $L, $N, $S, $S, $L, $L)", - MAPPER_HELPER.className, - "validateOverlappingNodeIdColumns", - VAR_NODE_STRATEGY, - VAR_NODE_ID_VALUE, - targetVarName, - processedSchema.getNodeConfigurationForTypeOrThrow(nodeType).typeId(), - columnName, - CodeBlock.of("($1L) -> $1N.$2L()", VAR_ITERATOR, nameMapping.asCamelGet()), - javaNameKeyColumns - - ); - } - - return code.build(); - } - -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/mapping/NodeIdFieldGroup.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/mapping/NodeIdFieldGroup.java deleted file mode 100644 index dd585af62a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/mapping/NodeIdFieldGroup.java +++ /dev/null @@ -1,51 +0,0 @@ -package no.sikt.graphitron.generators.mapping; - -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import org.jooq.impl.UpdatableRecordImpl; - -import java.util.ArrayList; -import java.util.List; - -/** - * Represents a group of @nodeId fields that target the same jOOQ record field - * in a Java record input type. - */ -public class NodeIdFieldGroup { - private final String targetFieldName; - private final Class<? extends UpdatableRecordImpl<?>> jooqRecordClass; - private final List<GenerationField> fields; - private boolean isListed; - - public NodeIdFieldGroup(String targetFieldName, Class<? extends UpdatableRecordImpl<?>> jooqRecordClass) { - this.targetFieldName = targetFieldName; - this.jooqRecordClass = jooqRecordClass; - this.fields = new ArrayList<>(); - } - - public void addField(GenerationField field) { - if (fields.isEmpty()) { - isListed = field.isIterableWrapped(); - } else if (field.isIterableWrapped() != isListed) { - throw new IllegalArgumentException( - "Cannot mix listed and singular @nodeId fields targeting the same record field '" - + targetFieldName + "'"); - } - fields.add(field); - } - - public boolean isListed() { - return isListed; - } - - public String getTargetFieldName() { - return targetFieldName; - } - - public Class<? extends UpdatableRecordImpl<?>> getJooqRecordClass() { - return jooqRecordClass; - } - - public List<GenerationField> getFields() { - return fields; - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/mapping/RecordMapperClassGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/mapping/RecordMapperClassGenerator.java deleted file mode 100644 index 68656bbc23..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/mapping/RecordMapperClassGenerator.java +++ /dev/null @@ -1,40 +0,0 @@ -package no.sikt.graphitron.generators.mapping; - -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.generators.abstractions.AbstractMapperClassGenerator; -import no.sikt.graphitron.javapoet.TypeSpec; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.List; - -public class RecordMapperClassGenerator extends AbstractMapperClassGenerator<GenerationField> { - public static final String FILE_NAME_TO_SUFFIX = "JOOQMapper", FILE_NAME_FROM_SUFFIX = "TypeMapper"; - - public RecordMapperClassGenerator(ProcessedSchema processedSchema, boolean toRecord) { - super(processedSchema, toRecord); - } - - @Override - public TypeSpec generate(GenerationField target) { - var recordMapper = new RecordMapperMethodGenerator(target, processedSchema, isToRecord()); - var generators = isToRecord() - ? List.of(recordMapper, new RecordValidatorMethodGenerator(target, processedSchema)) - : List.of(recordMapper); - return getSpec(processedSchema.getRecordType(target).getName(), generators).build(); - } - - @Override - protected boolean filterProperties(GenerationField field) { - var type = processedSchema.getRecordType(field); - if (!type.hasTable() && !field.hasServiceReference() || type.hasJavaRecordReference()) { - return false; - } - - return isToRecord() ? processedSchema.isInputType(field) : processedSchema.isObject(field); - } - - @Override - public String getFileNameSuffix() { - return isToRecord() ? FILE_NAME_TO_SUFFIX : FILE_NAME_FROM_SUFFIX; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/mapping/RecordMapperMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/mapping/RecordMapperMethodGenerator.java deleted file mode 100644 index 4e380c73c0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/mapping/RecordMapperMethodGenerator.java +++ /dev/null @@ -1,122 +0,0 @@ -package no.sikt.graphitron.generators.mapping; - -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.generators.abstractions.AbstractMapperMethodGenerator; -import no.sikt.graphitron.generators.context.MapperContext; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphql.schema.ProcessedSchema; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; - -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.*; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_ARGS; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_NEXT_ARGS; - -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.inputPrefix; -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.outputPrefix; -import static no.sikt.graphql.naming.GraphQLReservedName.ERROR_FIELD; - -public class RecordMapperMethodGenerator extends AbstractMapperMethodGenerator { - public RecordMapperMethodGenerator(GenerationField localField, ProcessedSchema processedSchema, boolean toRecord) { - super(localField, processedSchema, toRecord); - } - - @Override - public MethodSpec generate(GenerationField target) { - return getMapperSpecBuilder(target).build(); - } - - - - protected CodeBlock iterateRecords(MapperContext context) { - return iterateRecords(context, 0); - } - /** - * @return Code for setting the record data of previously defined records. - */ - @NotNull - protected CodeBlock iterateRecords(MapperContext context, int argDepth) { - var argumentSetName = argDepth == 0 ? VAR_ARGS : VAR_NEXT_ARGS + (argDepth - 1); - if (context.isIterable() && !context.hasTable() && context.hasSourceName()) { - return CodeBlock.empty(); - } - - var fieldCode = new ArrayList<CodeBlock>(); - var type = context.getTargetType(); - var fields = (toRecord ? type.getInputsSortedByNullability().stream().filter(it -> !processedSchema.hasJOOQRecord(it)).toList() : type.getFields()) - .stream() - .filter(it -> !(it.isExplicitlyNotGenerated())) - .toList(); - for (var innerField : fields) { - if (innerField.getMappingFromFieldOverride().getName().equalsIgnoreCase(ERROR_FIELD.getName())) { - continue; - } - - // Can not handle references in jOOQ mappers as input records do not contain them. - if (!innerField.hasNodeID() && !innerField.isGeneratedWithResolver() && innerField.hasFieldReferences()) { - continue; - } - - var innerContext = context.iterateContext(innerField); - var isType = innerContext.targetIsType(); - MapperContext previousContext = innerContext.getPreviousContext(); - var previousHadSource = previousContext.hasSourceName(); - - var innerCode = CodeBlock.builder(); - if (innerField.createsDataFetcher()) { - if (processedSchema.isOrderedMultiKeyQuery(innerField) || !previousHadSource) { - innerCode.add(innerContext.getResolverKeySetMappingBlock(inputPrefix(type.asRecordName()))); - } else { - innerCode.add(innerContext.getResolverKeySetMappingBlockForJooqRecord()); - } - } else if (!isType) { - innerCode.add(innerContext.getFieldSetMappingBlock()); - } else if (!previousHadSource) { - innerCode.add(innerContext.getRecordSetMappingBlock()); - } else if (!innerField.createsDataFetcher() && !innerContext.hasTable()) { - if(toRecord) { - innerCode - .declare(VAR_NEXT_ARGS + argDepth, "$N.child($S)", argumentSetName, innerField.getName()) - .add(iterateRecords(innerContext, argDepth + 1)); - } else { - innerCode.add(iterateRecords(innerContext)); - } - } - - if (!innerCode.isEmpty()) { - var varName = innerContext.getHelperVariableName(); - var declareBlock = CodeBlock.declareIf( - isType && !innerField.createsDataFetcher(), - toRecord ? inputPrefix(varName) : outputPrefix(varName), - () -> toRecord - ? innerContext.getSourceGetCallBlock() - : CodeBlock.of("new $T()", innerContext.getTargetType().getGraphClassName()) - ); - - if (isType && toRecord) { - fieldCode.add(CodeBlock.join(declareBlock, wrapNotNull(inputPrefix(varName), innerCode.build()))); - } else { - fieldCode.add( - CodeBlock - .builder() - .beginControlFlow("if ($L)", toRecord ? CodeBlock.of("$L.hasField($S)", argumentSetName, innerField.getName()) : selectionSetLookup(innerContext.getPath(), false, false)) - .addIf(isType && previousHadSource, declareBlock) - .add(innerCode.build()) - .addIf(isType && previousHadSource && !innerField.createsDataFetcher(), () -> innerContext.getSetMappingBlock(outputPrefix(varName))) - .endControlFlow() - .build() - ); - } - } - } - - return context.wrapFields(CodeBlock.join("\n", fieldCode)); - } - - @Override - public boolean mapsJavaRecord() { - return false; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/mapping/RecordValidatorMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/mapping/RecordValidatorMethodGenerator.java deleted file mode 100644 index ac2e81eb29..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/mapping/RecordValidatorMethodGenerator.java +++ /dev/null @@ -1,99 +0,0 @@ -package no.sikt.graphitron.generators.mapping; - -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.generators.abstractions.AbstractMapperMethodGenerator; -import no.sikt.graphitron.generators.context.MapperContext; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphitron.javapoet.ParameterizedTypeName; -import no.sikt.graphql.schema.ProcessedSchema; -import org.jetbrains.annotations.NotNull; - -import java.util.List; - -import static no.sikt.graphitron.configuration.GeneratorConfig.getRecordValidation; -import static no.sikt.graphitron.configuration.GeneratorConfig.recordValidationEnabled; -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.*; -import static no.sikt.graphitron.generators.codebuilding.NameFormat.recordValidateMethod; -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.wrapList; -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.wrapSet; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.*; -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.inputPrefix; -import static no.sikt.graphitron.mappings.JavaPoetClassName.GRAPHQL_ERROR; -import static no.sikt.graphitron.mappings.JavaPoetClassName.HASH_SET; -import static org.apache.commons.lang3.StringUtils.uncapitalize; - -public class RecordValidatorMethodGenerator extends AbstractMapperMethodGenerator { - public RecordValidatorMethodGenerator(GenerationField localField, ProcessedSchema processedSchema) { - super(localField, processedSchema, false); // It operates on records as input, so technically false. - } - - @Override - public MethodSpec generate(GenerationField target) { - var methodName = recordValidateMethod(); - if (!processedSchema.hasInputJOOQRecord(target) || !getRecordValidation().isEnabled()) { - return MethodSpec.methodBuilder(methodName).build(); - } - - var input = processedSchema.getInputType(target); - return getDefaultSpecBuilder(methodName, inputPrefix(input.getRecordReferenceName()), wrapList(input.getRecordClassName()), wrapSet(GRAPHQL_ERROR.className)) - .declare(VAR_ARGS, asMethodCall(VAR_TRANSFORMER, METHOD_ARGS_NAME)) - .declare(VAR_ENV, asMethodCall(VAR_TRANSFORMER, METHOD_ENV_NAME)) - .declareNew(VAR_VALIDATION_ERRORS, ParameterizedTypeName.get(HASH_SET.className, GRAPHQL_ERROR.className)) - .addCode("\n") - .addCode("$L\n", iterateRecords(MapperContext.createValidationContext(target, processedSchema))) - .addCode(returnWrap(VAR_VALIDATION_ERRORS)) - .build(); - } - - /** - * @return Code for setting the validation paths. - */ - @NotNull - protected CodeBlock iterateRecords(MapperContext context) { - if (context.isIterable() && !context.hasTable()) { - return CodeBlock.empty(); - } - - var fieldCode = CodeBlock.builder(); - var containedInputs = context - .getTargetType() - .getInputsSortedByNullability() - .stream() - .filter(it -> !processedSchema.hasInputJOOQRecord(it)) - .filter(it -> !(it.isExplicitlyNotGenerated() || it.createsDataFetcher())) - .toList(); - for (var innerField : containedInputs) { - var innerContext = context.iterateContext(innerField); - if (innerContext.targetIsType()) { - fieldCode.add(iterateRecords(innerContext)); - } else { - fieldCode - .beginControlFlow("if ($L)", selectionSetLookup(innerContext.getIndexPath().replaceAll("(.*?)\"/", ""), false, true)) - .addStatement("$N.put($S, $N + $L\")", VAR_PATHS_FOR_PROPERTIES, uncapitalize(innerField.getFieldRecordMappingName()), VAR_PATH_HERE, innerContext.getIndexPath()) - .endControlFlow(); - } - } - - return context.wrapFields(fieldCode.build()); - } - - @Override - public List<MethodSpec> generateAll() { - if (getLocalObject() == null || getLocalObject().isExplicitlyNotGenerated() || !recordValidationEnabled()) { - return List.of(); - } - - var input = processedSchema.getInputType(getLocalField()); - if (input == null || !input.hasTable() || input.hasJavaRecordReference()) { - return List.of(); - } - - return List.of(generate(getLocalField())); - } - - @Override - public boolean mapsJavaRecord() { - return false; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/mapping/TransformerClassGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/mapping/TransformerClassGenerator.java deleted file mode 100644 index 4898904cae..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/mapping/TransformerClassGenerator.java +++ /dev/null @@ -1,60 +0,0 @@ -package no.sikt.graphitron.generators.mapping; - -import no.sikt.graphitron.generators.abstractions.AbstractClassGenerator; -import no.sikt.graphitron.generators.abstractions.MethodGenerator; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphitron.javapoet.TypeSpec; -import no.sikt.graphql.schema.ProcessedSchema; -import org.jetbrains.annotations.NotNull; - -import javax.lang.model.element.Modifier; -import java.util.List; - -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_ENV; -import static no.sikt.graphitron.mappings.JavaPoetClassName.ABSTRACT_TRANSFORMER; -import static no.sikt.graphitron.mappings.JavaPoetClassName.DATA_FETCHING_ENVIRONMENT; - -public class TransformerClassGenerator extends AbstractClassGenerator { - public static final String FILE_NAME_SUFFIX = "RecordTransformer", DEFAULT_SAVE_DIRECTORY_NAME = "transform"; - private final List<MethodGenerator> generators; - - public TransformerClassGenerator(ProcessedSchema processedSchema) { - generators = List.of( - new TransformerListMethodGenerator(processedSchema), - new TransformerMethodGenerator(processedSchema) - ); - } - - @Override - public TypeSpec.Builder getSpec(String className, List<? extends MethodGenerator> generators) { - return super - .getSpec("", generators) - .superclass(ABSTRACT_TRANSFORMER.className) - .addMethod(constructor()); - } - - @NotNull - private static MethodSpec constructor() { - return MethodSpec - .constructorBuilder() - .addModifiers(Modifier.PUBLIC) - .addParameter(DATA_FETCHING_ENVIRONMENT.className, VAR_ENV) - .addStatement("super($N)", VAR_ENV) - .build(); - } - - @Override - public List<TypeSpec> generateAll() { - return List.of(getSpec("", generators).build()); - } - - @Override - public String getDefaultSaveDirectoryName() { - return DEFAULT_SAVE_DIRECTORY_NAME; - } - - @Override - public String getFileNameSuffix() { - return FILE_NAME_SUFFIX; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/mapping/TransformerListMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/mapping/TransformerListMethodGenerator.java deleted file mode 100644 index cd768917f3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/mapping/TransformerListMethodGenerator.java +++ /dev/null @@ -1,58 +0,0 @@ -package no.sikt.graphitron.generators.mapping; - -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphql.schema.ProcessedSchema; - -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.returnWrap; -import static no.sikt.graphitron.generators.codebuilding.NameFormat.asRecordMapperClass; -import static no.sikt.graphitron.generators.codebuilding.NameFormat.recordTransformMethod; -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.getGeneratedClassName; -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.wrapList; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_INDEX_PATH; -import static no.sikt.graphitron.mappings.JavaPoetClassName.STRING; - -public class TransformerListMethodGenerator extends TransformerMethodGenerator { - public TransformerListMethodGenerator(ProcessedSchema processedSchema) { - super(processedSchema); - } - - @Override - public MethodSpec generate(GenerationField target) { - var toRecord = target.isInput(); - var type = processedSchema.getRecordType(target); - var methodName = recordTransformMethod(type.getName(), type.hasJavaRecordReference(), toRecord); - if (!type.hasRecordReference()) { - return MethodSpec.methodBuilder(methodName).build(); - } - - return getDefaultSpecBuilder(methodName, wrapList(type.asTargetClassName(toRecord)), wrapList(type.asSourceClassName(toRecord)), toRecord) - .addParameterIf(toRecord && useValidation(type), STRING.className, VAR_INDEX_PATH) - .addCode(getMethodContent(target)) - .build(); - } - - @Override - protected CodeBlock getMethodContent(GenerationField target) { - var toRecord = target.isInput(); - - var type = processedSchema.getRecordType(target); - var hasReference = type.hasJavaRecordReference(); - - var mapperClass = getGeneratedClassName(RecordMapperClassGenerator.DEFAULT_SAVE_DIRECTORY_NAME, asRecordMapperClass(type.getName(), hasReference, toRecord)); - var useValidation = toRecord && useValidation(type); - var code = CodeBlock - .builder() - .addStatement(transformCallCode(useValidation, mapperClass, hasReference, toRecord)); - - if (!useValidation) { - return code.build(); - } - - return code - .addStatement(validateCode(mapperClass)) - .add(returnWrap(VARIABLE_RECORDS)) - .build(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/mapping/TransformerMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/mapping/TransformerMethodGenerator.java deleted file mode 100644 index 8dc99d6f4b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/generators/mapping/TransformerMethodGenerator.java +++ /dev/null @@ -1,125 +0,0 @@ -package no.sikt.graphitron.generators.mapping; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.definitions.interfaces.RecordObjectSpecification; -import no.sikt.graphitron.generators.abstractions.AbstractSchemaMethodGenerator; -import no.sikt.graphitron.javapoet.ClassName; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphitron.javapoet.TypeName; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.List; -import java.util.stream.Collectors; - -import static no.sikt.graphitron.configuration.GeneratorConfig.recordValidationEnabled; -import static no.sikt.graphitron.configuration.GeneratorConfig.shouldMakeNodeStrategy; -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.returnWrap; -import static no.sikt.graphitron.generators.codebuilding.NameFormat.*; -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.getGeneratedClassName; -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.wrapListIf; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.*; -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.inputPrefix; -import static no.sikt.graphitron.generators.codebuilding.VariablePrefix.outputPrefix; -import static no.sikt.graphitron.mappings.JavaPoetClassName.*; - -public class TransformerMethodGenerator extends AbstractSchemaMethodGenerator<GenerationField, RecordObjectSpecification<GenerationField>> { - protected static final String VARIABLE_INPUT = inputPrefix("input"), VARIABLE_RECORDS = outputPrefix("records"); - - public TransformerMethodGenerator(ProcessedSchema processedSchema) { - super(null, processedSchema); - } - - @Override - public MethodSpec generate(GenerationField target) { - var toRecord = target.isInput(); - var type = processedSchema.getRecordType(target); - var methodName = recordTransformMethod(type.getName(), type.hasJavaRecordReference(), toRecord); - var currentSource = type.asSourceClassName(toRecord); - return getDefaultSpecBuilder( - methodName, - wrapListIf(type.asTargetClassName(toRecord), currentSource == null && target.isIterableWrapped()), - currentSource != null || !target.hasServiceReference() ? currentSource : target.getExternalMethod().getGenericReturnType(), - toRecord - ) - .addParameterIf(toRecord && useValidation(type), STRING.className, VAR_INDEX_PATH) - .addCode(getMethodContent(target)) - .build(); - } - - protected CodeBlock getMethodContent(GenerationField target) { - var toRecord = target.isInput(); - - var type = processedSchema.getRecordType(target); - var useValidation = toRecord && useValidation(type); - if (type.asSourceClassName(toRecord) == null) { - var hasReference = type.hasJavaRecordReference(); - var mapperClass = getGeneratedClassName(RecordMapperClassGenerator.DEFAULT_SAVE_DIRECTORY_NAME, asRecordMapperClass(type.getName(), hasReference, toRecord)); - - var code = CodeBlock - .builder() - .addStatement(transformCallCode(useValidation, mapperClass, hasReference, toRecord)); - - if (!useValidation) { - return code.build(); - } - - return code - .addStatement(validateCode(mapperClass)) - .add(returnWrap(VARIABLE_RECORDS)) - .build(); - } - - return CodeBlock.statementOf( - "return $N($T.of($N)$L$L, $N$L).stream().findFirst().orElse($L)", - recordTransformMethod(type.getName(), type.hasJavaRecordReference(), toRecord), - LIST.className, - VARIABLE_INPUT, - CodeBlock.ofIf(shouldMakeNodeStrategy(), ", $N", VAR_NODE_STRATEGY), - CodeBlock.ofIf(toRecord, ", $N.$L()", VAR_ARG_PRESENCE, METHOD_AS_SINGLE_ITEM), - VAR_PATH_NAME, - CodeBlock.ofIf(useValidation, ", $N", VAR_INDEX_PATH), - toRecord ? CodeBlock.of("new $T()", type.getRecordClassName()) : CodeBlock.of("null") - ); - } - - protected static CodeBlock transformCallCode(boolean useValidation, ClassName mapperClass, boolean hasReference, boolean toRecord) { - return CodeBlock.of( - "$L$T.$L($N,$L$L $N, this)", - useValidation ? CodeBlock.of("var $L = ", VARIABLE_RECORDS) : CodeBlock.of("return "), - mapperClass, - recordTransformMethod(hasReference, toRecord), - VARIABLE_INPUT, - CodeBlock.ofIf(shouldMakeNodeStrategy(), " $N,", VAR_NODE_STRATEGY), - CodeBlock.ofIf(toRecord, " $N,", VAR_ARG_PRESENCE), - VAR_PATH_NAME - ); - } - - protected static CodeBlock validateCode(ClassName mapperClass) { - return CodeBlock.of("$N.addAll($T.$L($N, $N, this))", VAR_VALIDATION_ERRORS, mapperClass, recordValidateMethod(), VARIABLE_RECORDS, VAR_INDEX_PATH); - } - - protected MethodSpec.Builder getDefaultSpecBuilder(String methodName, TypeName returnType, TypeName source, boolean toRecord) { - return getDefaultSpecBuilder(methodName, returnType) - .addParameter(source, VARIABLE_INPUT) - .addParameterIf(GeneratorConfig.shouldMakeNodeStrategy(), NODE_ID_STRATEGY.className, VAR_NODE_STRATEGY) - .addParameterIf(toRecord, ARGUMENT_PRESENCE.className, VAR_ARG_PRESENCE) - .addParameter(STRING.className, VAR_PATH_NAME); - } - - protected static boolean useValidation(RecordObjectSpecification<?> type) { - return recordValidationEnabled() && type.hasTable() && !type.hasJavaRecordReference(); - } - - @Override - public List<MethodSpec> generateAll() { - return processedSchema - .getTransformableFields() - .stream() - .map(this::generate) - .filter(it -> !it.code().isEmpty()) - .collect(Collectors.toList()); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/mappings/JavaPoetClassName.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/mappings/JavaPoetClassName.java deleted file mode 100644 index 2b0c31650e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/mappings/JavaPoetClassName.java +++ /dev/null @@ -1,126 +0,0 @@ -package no.sikt.graphitron.mappings; - -import graphql.GraphQLError; -import graphql.schema.GraphQLSchema; -import graphql.schema.TypeResolver; -import graphql.schema.idl.RuntimeWiring; -import graphql.schema.idl.SchemaGenerator; -import graphql.schema.idl.TypeDefinitionRegistry; -import graphql.schema.idl.TypeRuntimeWiring; -import no.sikt.graphitron.generators.mapping.TransformerClassGenerator; -import no.sikt.graphitron.javapoet.ClassName; -import no.sikt.graphitron.validation.RecordValidator; -import no.sikt.graphql.NodeIdHandler; -import no.sikt.graphql.NodeIdStrategy; -import no.sikt.graphql.exception.*; -import no.sikt.graphql.helpers.mappers.MapperHelper; -import no.sikt.graphql.helpers.query.QueryHelper; -import no.sikt.graphql.helpers.resolvers.DataFetcherHelper; -import no.sikt.graphql.helpers.resolvers.ArgumentPresence; -import no.sikt.graphql.helpers.resolvers.EnvironmentHandler; -import no.sikt.graphql.helpers.resolvers.ResolverHelpers; -import no.sikt.graphql.helpers.resolvers.ServiceDataFetcherHelper; -import no.sikt.graphql.helpers.selection.SelectionSet; -import no.sikt.graphql.helpers.transform.AbstractTransformer; -import no.sikt.graphql.relay.ConnectionImpl; -import no.sikt.graphql.schema.SchemaReadingHelper; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; -import org.jooq.JSONB; -import org.jooq.SelectField; -import org.jooq.SelectJoinStep; -import org.jooq.SelectSelectStep; -import org.jooq.exception.DataAccessException; - -import java.util.stream.IntStream; - -import static no.sikt.graphitron.generators.codebuilding.TypeNameFormat.getGeneratedClassName; - -/** - * Enum of all the classnames in use in the generator, which helps keep track of dependencies. - * Preferably add any new non-dynamic class name retrievals here. - */ -public enum JavaPoetClassName { - ARRAYS(java.util.Arrays.class), - ARRAY_LIST(java.util.ArrayList.class), - CLASS(java.lang.Class.class), - COLLECTORS(java.util.stream.Collectors.class), - COMPLETABLE_FUTURE(java.util.concurrent.CompletableFuture.class), - DATA_ACCESS_EXCEPTION(DataAccessException.class), - DATA_ACCESS_EXCEPTION_CONTENT_TO_ERROR_MAPPING(DataAccessExceptionContentToErrorMapping.class), - DATA_ACCESS_EXCEPTION_MAPPING_CONTENT(DataAccessMatcher.class), - DATA_FETCHING_ENVIRONMENT(graphql.schema.DataFetchingEnvironment.class), - ENVIRONMENT_HANDLER(EnvironmentHandler.class), - DATA_FETCHER(graphql.schema.DataFetcher.class), - DATA_FETCHER_HELPER(DataFetcherHelper.class), - DATA_SERVICE_FETCHER(ServiceDataFetcherHelper.class), - DSL(org.jooq.impl.DSL.class), - SORT_FIELD(org.jooq.SortField.class), - SORT_ORDER(org.jooq.SortOrder.class), - DSL_CONTEXT(org.jooq.DSLContext.class), - EXCEPTION_TO_ERROR_MAPPING_PROVIDER(ExceptionToErrorMappingProvider.class), - NODE_ID_HANDLER(NodeIdHandler.class), - FUNCTION(java.util.function.Function.class), - FUNCTIONS(org.jooq.Functions.class), - GENERIC_EXCEPTION_CONTENT_TO_ERROR_MAPPING(GenericExceptionContentToErrorMapping.class), - GENERIC_EXCEPTION_MAPPING_CONTENT(GenericExceptionMatcher.class), - GRAPHQL_ERROR(GraphQLError.class), - HASH_MAP(java.util.HashMap.class), - HASH_SET(java.util.HashSet.class), - ILLEGAL_ARGUMENT_EXCEPTION(IllegalArgumentException.class), - IMMUTABLE_PAIR(ImmutablePair.class), - INJECT(javax.inject.Inject.class), - INTEGER(java.lang.Integer.class), - FLOAT(java.lang.Float.class), - BOOLEAN(java.lang.Boolean.class), - LIST(java.util.List.class), - STREAM(java.util.stream.Stream.class), - MAP(java.util.Map.class), - OBJECT(java.lang.Object.class), - EXCEPTION_STRATEGY_CONFIGURATION(ExceptionStrategyConfiguration.class), - OBJECTS(java.util.Objects.class), - OVERRIDE(java.lang.Override.class), - PAIR(Pair.class), // Note that this enforces a dependency on org.apache.commons on users. - PAYLOAD_CREATOR(ExceptionStrategyConfiguration.PayloadCreator.class), - QUERY_HELPER(QueryHelper.class), - MAPPER_HELPER(MapperHelper.class), - RECORD1(org.jooq.Record1.class), - RECORD2(org.jooq.Record2.class), - RECORD3(org.jooq.Record3.class), - RECORD_VALIDATOR(RecordValidator.class), - RESOLVER_HELPERS(ResolverHelpers.class), - SELECTION_SET(SelectionSet.class), - SET(java.util.Set.class), - STRING(java.lang.String.class), - THROWABLE(Throwable.class), - VALIDATION_VIOLATION_EXCEPTION(ValidationViolationGraphQLException.class), - RECORD_TRANSFORMER(getGeneratedClassName(TransformerClassGenerator.DEFAULT_SAVE_DIRECTORY_NAME, TransformerClassGenerator.FILE_NAME_SUFFIX)), - ABSTRACT_TRANSFORMER(AbstractTransformer.class), - ARGUMENT_PRESENCE(ArgumentPresence.class), - JSONB(JSONB.class), - RUNTIME_WIRING(RuntimeWiring.class), - RUNTIME_WIRING_BUILDER(RuntimeWiring.Builder.class), - TYPE_RUNTIME_WIRING(TypeRuntimeWiring.class), - TYPE_RESOLVER(TypeResolver.class), - TYPE_DEFINITION_REGISTRY(TypeDefinitionRegistry.class), - SCHEMA_READER(SchemaReadingHelper.class), - GRAPHQL_SCHEMA(GraphQLSchema.class), - SCHEMA_GENERATOR(SchemaGenerator.class), - NODE_ID_STRATEGY(NodeIdStrategy.class), - SELECT_JOIN_STEP(SelectJoinStep.class), - SELECT_FIELD(SelectField.class), - SELECT_SELECT_STEP(SelectSelectStep.class), - INT_STREAM(IntStream.class), - CONNECTION_IMPL(ConnectionImpl.class), - FEDERATION_HELPER(no.sikt.graphql.schema.FederationHelper.class); - - public final ClassName className; - - JavaPoetClassName(ClassName className) { - this.className = className; - } - - JavaPoetClassName(Class<?> clazz) { - this.className = ClassName.get(clazz); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/mappings/ReflectionHelpers.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/mappings/ReflectionHelpers.java deleted file mode 100644 index 5bfc1f2cbf..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/mappings/ReflectionHelpers.java +++ /dev/null @@ -1,110 +0,0 @@ -package no.sikt.graphitron.mappings; - -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphql.schema.ProcessedSchema; -import org.jooq.impl.UpdatableRecordImpl; - -import java.lang.reflect.Method; -import java.lang.reflect.ParameterizedType; -import java.util.Arrays; -import java.util.List; -import java.util.Optional; - -import static org.apache.commons.lang3.StringUtils.capitalize; - -/** - * Helper class that takes care of any reflection operations the code generator might require. - */ -public class ReflectionHelpers { - /** - * @return Does this jOOQ table contain this method name? - */ - public static boolean classHasMethod(Class<?> reference, String methodName) { - return reference != null && Arrays.stream(reference.getMethods()).anyMatch(it -> it.getName().equals(methodName)); - } - - /** - * Gets the jOOQ record class for a field in a Java record class. - * @param recordClass The Java record class to inspect - * @param fieldName The field name to get type for - * @return The jOOQ record class, or null if not a jOOQ record type - */ - @SuppressWarnings("unchecked") - public static Optional<Class<? extends UpdatableRecordImpl<?>>> getJooqRecordClassReturnedFromFieldGetter(Class<?> recordClass, String fieldName) { - String getterName = "get" + capitalize(fieldName); - try { - Method getter = recordClass.getMethod(getterName); - Class<?> returnType = getter.getReturnType(); - if (UpdatableRecordImpl.class.isAssignableFrom(returnType)) { - return Optional.of((Class<? extends UpdatableRecordImpl<?>>) returnType); - } - if (List.class.isAssignableFrom(returnType) && getter.getGenericReturnType() instanceof ParameterizedType parameterized) { - var typeArg = parameterized.getActualTypeArguments()[0]; - if (typeArg instanceof Class<?> elementClass && UpdatableRecordImpl.class.isAssignableFrom(elementClass)) { - return Optional.of((Class<? extends UpdatableRecordImpl<?>>) elementClass); - } - } - return Optional.empty(); - } catch (NoSuchMethodException e) { - return Optional.empty(); - } - } - - /** - * Checks whether a setter method on the given class accepts an Optional parameter. - * - * @param recordClass The POJO class to inspect - * @param setterName The setter method name (e.g., "setRentalDuration") - * @return true if the setter's first parameter is Optional - */ - public static boolean setterAcceptsOptional(Class<?> recordClass, String setterName) { - if (recordClass == null) { - return false; - } - return Arrays.stream(recordClass.getMethods()) - .filter(m -> m.getName().equals(setterName) && m.getParameterCount() == 1) - .anyMatch(m -> m.getParameterTypes()[0] == Optional.class); - } - - /** - * Gets the jOOQ record class that a @nodeId field should produce. - * Uses reflection on the Java record class to get the target field's type. - * @param field The @nodeId field - * @return The jOOQ record class, or null if the field is not targeting a jOOQ record field - */ - public static Optional<Class<? extends UpdatableRecordImpl<?>>> getJooqRecordClassForNodeIdInputField(GenerationField field, ProcessedSchema schema) { - if (!schema.isNodeIdField(field)) { - return Optional.empty(); - } - var inputType = schema.getInputType(field.getContainerTypeName()); - if (inputType == null || !inputType.hasJavaRecordReference()) { - return Optional.empty(); - } - - Class<?> javaRecordClass = inputType.getRecordReference(); - String targetFieldName = field.getJavaRecordMethodMapping(true).getName(); - return getJooqRecordClassReturnedFromFieldGetter(javaRecordClass, targetFieldName); - } - - /** - * Checks whether the parameter at the given index of {@code method} is a jOOQ table record type — - * either an {@link UpdatableRecordImpl} subtype or a {@code List<X>} where {@code X} is one. - * - * @param method The method to inspect. - * @param paramIndex Zero-based index of the parameter to check. - * @return {@code true} if the parameter is a jOOQ table record (singular or listed); {@code false} - * for any other shape (raw types, arrays, {@code Collection}, generic wildcards, etc.). - */ - public static boolean methodExpectsTableRecordParamAtIndex(Method method, int paramIndex) { - var raw = method.getParameterTypes()[paramIndex]; - if (UpdatableRecordImpl.class.isAssignableFrom(raw)) { - return true; - } else if (!List.class.isAssignableFrom(raw)) { - return false; - } - var generic = method.getGenericParameterTypes()[paramIndex]; - return generic instanceof ParameterizedType pt - && pt.getActualTypeArguments()[0] instanceof Class<?> elt - && UpdatableRecordImpl.class.isAssignableFrom(elt); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/mappings/RoutineReflection.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/mappings/RoutineReflection.java deleted file mode 100644 index 990b0747f4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/mappings/RoutineReflection.java +++ /dev/null @@ -1,277 +0,0 @@ -package no.sikt.graphitron.mappings; - -import org.jooq.Parameter; -import org.jooq.Routine; -import org.jooq.impl.AbstractRoutine; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.net.JarURLConnection; -import java.net.URL; -import java.util.*; -import java.util.stream.Collectors; - -/** - * Helper class that takes care of any routine reflection operations the code generator might require towards the jOOQ source. - * Discovers and provides access to stored procedures and functions generated by jOOQ. - * <p> - * Routines are keyed internally by a schema-qualified name ({@code schema.SimpleClassName}, lowercased) so that routines - * with the same name in different database schemas do not collide. - */ -public class RoutineReflection extends SchemaReflection { - private static final Logger LOGGER = LoggerFactory.getLogger(RoutineReflection.class); - - /** - * Routines keyed by their schema-qualified Java key: {@code schemaName.SimpleClassName}, both lowercased. - * jOOQ guarantees uniqueness within a schema package, and we prefix the schema to disambiguate across schemas. - */ - private static final Map<String, Routine<?>> ROUTINES_BY_QUALIFIED_KEY = discoverRoutines(); - - /** - * Multi-value index from lowercased routine database name (without schema) to the list of qualified keys that - * match. When the list has a single entry, the routine is unambiguous by bare name; otherwise callers must - * disambiguate by passing {@code schema.routine}. - */ - private static final Map<String, List<String>> QUALIFIED_KEYS_BY_ROUTINE_NAME = ROUTINES_BY_QUALIFIED_KEY - .entrySet() - .stream() - .collect(Collectors.groupingBy( - e -> e.getValue().getName().toLowerCase(), - () -> new TreeMap<>(String.CASE_INSENSITIVE_ORDER), - Collectors.mapping(Map.Entry::getKey, Collectors.toList()))); - - /** - * Resolves a user-supplied routine name against the discovered routines, returning the list of matching - * qualified keys ({@code schema.SimpleClassName}, lowercased). The name may be bare ({@code foo}) or - * schema-qualified ({@code my_schema.foo}). Matching is case-insensitive. - * <p> - * An empty list means no match; a single entry is unambiguous; multiple entries indicate the bare name is - * ambiguous across schemas and the caller must disambiguate. - */ - public static List<String> resolveRoutine(String userSuppliedName) { - if (userSuppliedName == null || userSuppliedName.isBlank()) { - return List.of(); - } - - var index = userSuppliedName.indexOf('.'); - if (index >= 0) { - var schemaPart = userSuppliedName.substring(0, index).toLowerCase(); - var routinePart = userSuppliedName.substring(index + 1).toLowerCase(); - return QUALIFIED_KEYS_BY_ROUTINE_NAME - .getOrDefault(routinePart, List.of()) - .stream() - .filter(key -> schemaFromProcedure(key).equals(schemaPart)) - .toList(); - } - - return QUALIFIED_KEYS_BY_ROUTINE_NAME.getOrDefault(userSuppliedName.toLowerCase(), List.of()); - } - - /** - * Returns the schema portion of a qualified routine key (the part before the dot). - */ - public static String schemaFromProcedure(String qualifiedProcedure) { - var index = qualifiedProcedure.indexOf('.'); - return index < 0 ? "" : qualifiedProcedure.substring(0, index); - } - - private static Optional<Routine<?>> getRoutine(String qualifiedKey) { - return Optional.ofNullable(ROUTINES_BY_QUALIFIED_KEY.get(qualifiedKey)); - } - - private static Optional<Parameter<?>> getReturnParameter(String qualifiedKey) { - return getRoutine(qualifiedKey).map(Routine::getReturnParameter); - } - - /** - * @return Whether the routine is a function (has a return). - */ - public static boolean isFunction(String qualifiedKey) { - return getReturnParameter(qualifiedKey).isPresent(); - } - - /** - * @return The IN parameters of the routine (excluding return). - */ - public static List<Parameter<?>> getInParameters(String qualifiedKey) { - return getRoutine(qualifiedKey).map(Routine::getInParameters).orElse(List.of()); - } - - /** - * @return The OUT parameters of the routine (excluding return). - */ - public static List<Parameter<?>> getOutParameters(String qualifiedKey) { - return getRoutine(qualifiedKey).map(Routine::getOutParameters).orElse(List.of()); - } - - /** - * @return The Java return type of the routine, if it is a function. - */ - public static Optional<Class<?>> getReturnType(String qualifiedKey) { - return getReturnParameter(qualifiedKey).map(Parameter::getType); - } - - /** - * Derives the fully qualified name of the generated {@code Routines} class that holds the convenience static methods - * for the given routine. The class lives one package up from the individual routine class (the schema package). - * <p> - * Assumes the jOOQ convention where each routine class lives at {@code <schema>.routines.XYZ}; a routine placed - * directly in the schema package would cause this to derive an incorrect parent package. - * - * @return The fully qualified class name of {@code Routines}, or empty if no such routine exists. - */ - public static Optional<String> getRoutinesClassName(String qualifiedKey) { - return getRoutine(qualifiedKey) - .map(Routine::getClass) - .map(Class::getPackageName) - .map(pkg -> { - var idx = pkg.lastIndexOf('.'); - return idx > 0 ? pkg.substring(0, idx) : pkg; - }) - .map(it -> it + ".Routines"); - } - - /** - * Derives the name of the convenience static method on the generated {@code Routines} class for a given routine. - * jOOQ emits the method as a camelCased version of the routine's Java class name (e.g. {@code InventoryHeldByCustomer} - * becomes {@code inventoryHeldByCustomer}, and {@code _GroupConcat} becomes {@code _GroupConcat}). - * - * @return The method name on the generated {@code Routines} class, or empty if no such routine exists. - */ - public static Optional<String> getRoutineMethodName(String qualifiedKey) { - return getRoutine(qualifiedKey) - .map(Routine::getClass) - .map(Class::getSimpleName) - .map(it -> { - // Routines whose class name starts with an underscore (e.g. _GroupConcat) keep the underscore and PascalCase in jOOQ output. - if (it.startsWith("_")) { - return it; - } - return Character.toLowerCase(it.charAt(0)) + it.substring(1); - }); - } - - /** - * Discovers all jOOQ-generated routine classes by scanning the {@code routines} subpackage - * of each schema for classes extending {@link AbstractRoutine}, instantiating them to - * access their parameter metadata. Keys each routine by {@code schemaName.SimpleClassName} (lowercased). - */ - private static Map<String, Routine<?>> discoverRoutines() { - var result = new LinkedHashMap<String, Routine<?>>(); - getDefaultCatalog() - .schemaStream() - .forEach(schema -> { - var schemaName = schema.getName().toLowerCase(); - var packageName = schema.getClass().getPackageName() + ".routines"; - findRoutineClassesInPackage(packageName).forEach(routine -> { - var key = schemaName + "." + routine.getClass().getSimpleName().toLowerCase(); - var previous = result.put(key, routine); - if (previous != null) { - LOGGER.warn("Duplicate routine key '{}' encountered during discovery; keeping the last one.", key); - } - }); - }); - return Map.copyOf(result); - } - - /** - * Scans a package for classes extending {@link AbstractRoutine} and instantiates them. - * Uses classloader resource scanning to discover class files both when classes live on the filesystem - * (directory entries in the classpath) and when they are packaged in JARs. - */ - private static List<? extends Routine<?>> findRoutineClassesInPackage(String packageName) { - var classLoader = Thread.currentThread().getContextClassLoader(); - var path = packageName.replace('.', '/'); - var classNames = new LinkedHashSet<String>(); - - try { - var resources = classLoader.getResources(path); - while (resources.hasMoreElements()) { - var resource = resources.nextElement(); - var protocol = resource.getProtocol(); - if ("jar".equals(protocol)) { - classNames.addAll(listRoutineClassNamesFromJar(resource, path)); - } else if ("file".equals(protocol)) { - classNames.addAll(listRoutineClassNamesFromDirectory(resource)); - } else { - LOGGER.debug("Unsupported classpath protocol '{}' for package {}", protocol, packageName); - } - } - } catch (Exception e) { - LOGGER.debug("Failed to scan routine classes in package: {}", packageName, e); - return List.of(); - } - - return classNames - .stream() - .map(it -> packageName + "." + it) - .map(RoutineReflection::loadRoutineClass) - .filter(Optional::isPresent) - .map(Optional::get) - .toList(); - } - - /** - * Reads direct-entry class names from a directory-based classpath resource. - */ - private static List<String> listRoutineClassNamesFromDirectory(URL resource) { - try (var reader = new BufferedReader(new InputStreamReader(resource.openStream()))) { - return reader - .lines() - .filter(it -> it.endsWith(".class")) - .map(it -> it.substring(0, it.length() - ".class".length())) - .toList(); - } catch (Exception e) { - LOGGER.debug("Failed to read routine package from directory resource: {}", resource, e); - return List.of(); - } - } - - /** - * Reads direct-entry class names from a jar-based classpath resource, matching only classes that live directly - * within the given package path (not in a sub-package). - */ - private static List<String> listRoutineClassNamesFromJar(URL resource, String path) { - try { - var connection = (JarURLConnection) resource.openConnection(); - try (var jar = connection.getJarFile()) { - var prefix = path.endsWith("/") ? path : path + "/"; - var classNames = new ArrayList<String>(); - var entries = jar.entries(); - while (entries.hasMoreElements()) { - var entry = entries.nextElement(); - var name = entry.getName(); - if (!name.startsWith(prefix) || !name.endsWith(".class")) { - continue; - } - var remainder = name.substring(prefix.length()); - if (remainder.indexOf('/') != -1) { - continue; // Sub-package, skip. - } - classNames.add(remainder.substring(0, remainder.length() - ".class".length())); - } - return classNames; - } - } catch (Exception e) { - LOGGER.debug("Failed to read routine package from jar resource: {}", resource, e); - return List.of(); - } - } - - /** - * Loads and instantiates a routine class if it extends {@link AbstractRoutine}. - */ - private static Optional<Routine<?>> loadRoutineClass(String fullyQualifiedClassName) { - try { - var clazz = Class.forName(fullyQualifiedClassName); - if (AbstractRoutine.class.isAssignableFrom(clazz)) { - return Optional.of((Routine<?>) clazz.getDeclaredConstructor().newInstance()); - } - } catch (ClassNotFoundException | NoSuchMethodException | InstantiationException | IllegalAccessException | java.lang.reflect.InvocationTargetException e) { - LOGGER.debug("Skipping routine class that could not be loaded or instantiated: {}", fullyQualifiedClassName, e); - } - return Optional.empty(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/mappings/SchemaReflection.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/mappings/SchemaReflection.java deleted file mode 100644 index f29837b947..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/mappings/SchemaReflection.java +++ /dev/null @@ -1,70 +0,0 @@ -package no.sikt.graphitron.mappings; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import org.jetbrains.annotations.NotNull; -import org.jooq.Catalog; -import org.jooq.Schema; - -import java.util.Arrays; -import java.util.Optional; -import java.util.function.Function; -import java.util.stream.Stream; - -/** - * Base class for jOOQ reflection operations. Provides shared infrastructure for discovering - * and reflecting on jOOQ-generated schema classes (Tables, Keys, Routines, etc.). - */ -public class SchemaReflection { - - protected static Catalog getDefaultCatalog() { - var generatedJooqPackage = GeneratorConfig.getGeneratedJooqPackage(); - - try { - var defaultCatalogClass = Class.forName(generatedJooqPackage + ".DefaultCatalog"); - var defaultCatalogField = defaultCatalogClass.getField("DEFAULT_CATALOG"); - return (Catalog) defaultCatalogField.get(null); - } catch (ClassNotFoundException e) { - throw new RuntimeException(generatedJooqPackage + " did not contain a DefaultCatalog class. This is probably a configuration error.", e); - } catch (NoSuchFieldException e) { - throw new RuntimeException(generatedJooqPackage + ".DefaultCatalog did not contain the DEFAULT_CATALOG field. Inconceivable.", e); - } catch (IllegalAccessException e) { - throw new RuntimeException("Could not get " + generatedJooqPackage + ".DefaultCatalog.DEFAULT_CATALOG. Inconceivable.", e); - } - } - - protected static Function<Schema, Stream<java.lang.reflect.Field>> getFieldsFromSchemaClass(String className) { - return schema -> findClassFromSchemaPackage(schema, className).stream().flatMap(it -> Arrays.stream(it.getFields())); - } - - @NotNull - protected static Function<Schema, Class<?>> getClassFromSchemaPackage(String className) { - return schema -> findClassFromSchemaPackage(schema, className) - .orElseThrow(() -> new RuntimeException(schema.getClass().getPackageName() + " did not contain a " + className + " class. Inconceivable.")); - } - - /** - * Looks up a class that jOOQ generates alongside a schema (e.g. {@code Tables}, {@code Keys}, {@code Routines}). - * Returns empty when the class does not exist — jOOQ omits these classes for schemas with no tables/keys/routines, - * and callers that aggregate across all schemas need to tolerate that. - */ - private static Optional<Class<?>> findClassFromSchemaPackage(Schema schema, String className) { - var packageName = schema.getClass().getPackageName(); - try { - return Optional.of(Class.forName(packageName + "." + className)); - } catch (ClassNotFoundException e) { - return Optional.empty(); - } - } - - protected static String getJavaFieldName(java.lang.reflect.Field field) { - return field.getName(); - } - - protected static Object getJavaFieldValue(java.lang.reflect.Field field) { - try { - return field.get(null); - } catch (IllegalAccessException e) { - throw new RuntimeException(e); - } - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/mappings/TableReflection.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/mappings/TableReflection.java deleted file mode 100644 index 987132cd5b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/mappings/TableReflection.java +++ /dev/null @@ -1,522 +0,0 @@ -package no.sikt.graphitron.mappings; - -import no.sikt.graphitron.definitions.mapping.JOOQMapping; -import no.sikt.graphitron.definitions.mapping.TableRelationType; -import org.jetbrains.annotations.NotNull; -import org.jooq.*; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; -import org.jspecify.annotations.NonNull; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.*; -import java.util.stream.Collectors; -import java.util.stream.IntStream; -import java.util.stream.Stream; - -/** - * Helper class that takes care of any table reflection operations the code generator might require towards the jOOQ source. - */ -public class TableReflection extends SchemaReflection { - private final static Map<String, Table<?>> TABLES_BY_JAVA_FIELD_NAME = getTablesByJavaFieldName(); - private final static Map<String, String> TABLE_NAME_TO_JAVA_FIELD_NAME = TABLES_BY_JAVA_FIELD_NAME.entrySet().stream() - .collect(Collectors.toMap(it -> it.getValue().getName(), Map.Entry::getKey)); - private final static Map<String, ForeignKey<?, ?>> FOREIGN_KEYS_BY_JAVA_FIELD_NAME = getForeignKeysByJavaFieldName(); - private final static Map<String, String> FOREIGN_KEY_NAME_TO_JAVA_FIELD_NAME = FOREIGN_KEYS_BY_JAVA_FIELD_NAME.entrySet().stream() - .collect(Collectors.toMap(it -> it.getValue().getName(), Map.Entry::getKey)); - - private final static Map<String, Map<String, String>> PATH_BY_TABLE_AND_KEY = getPathMethodsForTableAndKey(TABLES_BY_JAVA_FIELD_NAME); - - /** - * @return The implicit key between these two tables. - */ - public static Optional<String> findImplicitKey(String leftTableName, String rightTableName) { - var keysOptional = getForeignKeysBetweenTables(leftTableName, rightTableName); - if (keysOptional.isPresent()) { - var keys = keysOptional.get(); - if (keys.size() == 1) { - return Optional.of(FOREIGN_KEY_NAME_TO_JAVA_FIELD_NAME.get(keys.get(0).getName())); - } - } - return Optional.empty(); - } - - /** - * @return an Optional list of foreign keys between leftTable and rightTable - */ - public static Optional<List<? extends ForeignKey<?, ?>>> getForeignKeysBetweenTables(String leftTableName, String rightTableName) { - var leftTable = getTableByJavaFieldName(leftTableName).orElse(null); - var rightTable = getTableByJavaFieldName(rightTableName).orElse(null); - if (leftTable == null || rightTable == null) { - return Optional.empty(); - } - Set<ForeignKey<?, ?>> uniqueKeys = new HashSet<>(); - uniqueKeys.addAll(leftTable.getReferencesTo(rightTable)); - uniqueKeys.addAll(rightTable.getReferencesTo(leftTable)); - return Optional.of(new ArrayList<>(uniqueKeys)); - } - - /** - * @return the number of foreign keys between leftTable and rightTable. - */ - public static int getNumberOfForeignKeysBetweenTables(String leftTableName, String rightTableName) { - return getForeignKeysBetweenTables(leftTableName,rightTableName) - .map(List::size) - .orElse(0); - } - - /** - * @return The kind of relation that is present between these tables. - */ - public static TableRelationType inferRelationType(String leftTableName, String rightTableName, JOOQMapping preferredKey) { - var leftTable = getTableByJavaFieldName(leftTableName); - if (leftTable.isEmpty()) { - return TableRelationType.NONE; - } - var rightTable = getTableByJavaFieldName(rightTableName); - if (rightTable.isEmpty()) { - return TableRelationType.NONE; - } - - var keysSize = leftTable.get().getReferencesTo(rightTable.get()).size(); - var reverseKeys = rightTable.get().getReferencesTo(leftTable.get()); - var reverseKeysSize = reverseKeys.size(); - - // If keys should be prioritized, reverse keys are checked before normal implicit joins. - if (preferredKey != null) { - if (keysSize > 1) { - return TableRelationType.KEY; - } - if (reverseKeysSize > 1) { - return TableRelationType.REVERSE_KEY; - } - - // The unlikely case where there are single references both ways, and for some reason the reverse reference is preferred. - if (reverseKeysSize == 1) { - var reverseKeyFieldName = FOREIGN_KEY_NAME_TO_JAVA_FIELD_NAME.get(reverseKeys.get(0).getName()); - if (reverseKeyFieldName.equals(preferredKey.getMappingName())) { - return TableRelationType.REVERSE_IMPLICIT; - } - } - } - - // Normally, references the "right" way are prioritized. - if (keysSize == 1) { - return TableRelationType.IMPLICIT; - } - if (keysSize > 1) { - return TableRelationType.KEY; - } - - if (reverseKeysSize == 1) { - return TableRelationType.REVERSE_IMPLICIT; - } - if (reverseKeysSize > 1) { - return TableRelationType.REVERSE_KEY; - } - return TableRelationType.NONE; - } - - /** - * @return Does this table have any references to itself? - */ - public static boolean hasSelfRelation(String tableName) { - return !inferRelationType(tableName, tableName, null).equals(TableRelationType.NONE); - } - - /** - * NEW FS hack! Some methods do not use getId(), but getId_() methods for ID... - */ - public static boolean recordUsesFSHack(String tableName) { - return getRecordClass(tableName) - .map(it -> Stream.of(it.getMethods()).anyMatch(m -> m.getName().equalsIgnoreCase("getId_"))) - .orElse(false); - } - - /** - * @return Does this table exist in the generated jOOQ code? - */ - public static boolean tableExists(String tableName) { - return TABLES_BY_JAVA_FIELD_NAME.containsKey(tableName); - } - - /** - * @return Does this key exist in the generated jOOQ code? - */ - public static boolean keyExists(String keyName) { - return FOREIGN_KEYS_BY_JAVA_FIELD_NAME.containsKey(keyName); - } - - /** - * @return Does this table or key exist in the generated jOOQ code? - */ - public static boolean tableOrKeyExists(String name) { - return tableExists(name) || keyExists(name); - } - - /** - * @return Which table does this key point to? - */ - public static Optional<String> getKeyTargetTableJavaName(String keyName) { - return getForeignKey(keyName) - .map(ForeignKey::getKey) - .map(Key::getTable) - .map(Named::getName) - .flatMap(TableReflection::getTableJavaFieldNameByTableName); - } - - /** - * @return Which table does this key belong to? - */ - public static Optional<String> getKeySourceTableJavaName(String keyName) { - return getForeignKey(keyName) - .map(Key::getTable) - .map(Named::getName) - .flatMap(TableReflection::getTableJavaFieldNameByTableName); - } - - /** - * Given a foreign key and a known source table, resolve the table on the other side of the key. - * @param keyName The foreign key name - * @param sourceTable The table we're coming from - * @return The table on the other side, or empty if unresolvable - */ - public static Optional<String> resolveKeyOtherTable(String keyName, String sourceTable) { - var keyTarget = getKeyTargetTableJavaName(keyName); - if (keyTarget.isPresent() && !keyTarget.get().equals(sourceTable)) { - return keyTarget; - } - return getKeySourceTableJavaName(keyName); - } - - public static Optional<Map<TableField<?, ?>, TableField<?, ?>>> getKeyFields(JOOQMapping key) { - if(key == null || key.getMappingName() == null) { - return Optional.empty(); - } - - var keyName = key.getMappingName(); - var fromColumns = getForeignKey(keyName).map(Key::getFields); - var toColumns = getForeignKey(keyName).map(ForeignKey::getKeyFields); - - if(fromColumns.isEmpty() || toColumns.isEmpty()) { - return Optional.empty(); - } - - if(fromColumns.get().size() != toColumns.get().size()) { - return Optional.empty(); - } - Map<TableField<?, ?>, TableField<?, ?>> map = IntStream.range(0, fromColumns.get().size()) - .boxed() - .collect(Collectors.toMap(fromColumns.get()::get, toColumns.get()::get)); - return Optional.of(map); - } - - /** - * @return Set of the names for all the fields that are set as required in the jOOQ table. - */ - public static Set<String> getRequiredFields(String tableName) { - return getTableByJavaFieldName(tableName) - .map(table -> table.fieldStream() - .filter(field -> !field.getDataType().nullable()) - .map(Field::getName) - .collect(Collectors.toSet())) - .orElse(Set.of()); - } - - /** - * @return Is this field nullable in the jOOQ table?. - */ - public static Optional<Boolean> fieldIsNullable(String tableName, String fieldName) { - return getTableByJavaFieldName(tableName) - .map(table -> table - .fieldStream() - .filter(it -> it.getName().equalsIgnoreCase(fieldName)) - .anyMatch(it -> it.getDataType().nullable())); - } - - /** - * @return Does this field have a default value in this jOOQ table? Does not work for views. - */ - public static boolean tableFieldHasDefaultValue(String tableName, String fieldName) { - return getTableByJavaFieldName(tableName) - .flatMap(value -> Arrays.stream(value.fields()).filter(it -> it.getName().equalsIgnoreCase(fieldName)).findFirst()) - .map(it -> it.getDataType().defaulted()) // This does not work for views. - .orElse(false); - } - - /** - * Checks if a table has an index with the specified name. - * - * @param tableName The name of the table to check for the index. - * @param indexName The name of the index - * @return Returns true if the table has an index with the same name as provided, false otherwise. - */ - public static boolean tableHasIndex(String tableName, String indexName) { - return getIndex(tableName, indexName).isPresent(); - } - - public static Optional<Index> getIndex(String tableName, String indexName) { - return getTableByJavaFieldName(tableName) - .flatMap(table -> table.getIndexes().stream() - .filter(index -> index.getName().equalsIgnoreCase(indexName)) - .findFirst()); - } - - /** - * Search this jOOQ table for a method that matches this name. - * @param tableName Name of the jOOQ table. - * @param name Name that might have a method associated with it. - * @return The name of a method that matches the provided name if it exists. - */ - public static Optional<String> searchTableForMethodWithName(String tableName, String name) { - return searchTableForKeyMethodNameGivenJavaFieldNames(tableName, name) - .or(() -> getMethodName(tableName, name)); - } - - @NotNull - private static Optional<String> getMethodName(String tableName, String name) { - return getMethod(tableName, name) - .map(Method::getName); - } - - @NotNull - private static Optional<Method> getMethod(String tableName, String name) { - return getTableByJavaFieldName(tableName) - .flatMap(table -> Arrays.stream(table.getClass().getMethods()).filter(it -> name.equals(it.getName())).findFirst()); - } - - /** - * Search this jOOQ table for a path method that matches the provided key name. - * @param tableName Java field name of the jOOQ Table - * @param keyName Name of the jOOQ ForeignKey - * @return The name of a path method on the table that matches the provided key - */ - public static Optional<String> searchTableForKeyMethodNameGivenJavaFieldNames(String tableName, String keyName) { - var keys = PATH_BY_TABLE_AND_KEY.get(tableName); - if (keys != null) { - var name = keys.get(keyName); - return Optional.ofNullable(name); - } - - return Optional.empty(); - } - - public static Optional<Table<?>> getTableByJavaFieldName(String name) { - return Optional.ofNullable(TABLES_BY_JAVA_FIELD_NAME.get(name)); - } - - public static Optional<String> getTableJavaFieldNameByTableName(String name){ - return TABLE_NAME_TO_JAVA_FIELD_NAME.entrySet().stream() - .filter(it -> it.getKey().equalsIgnoreCase(name)) - .map(Map.Entry::getValue) - .findFirst(); - } - - /** - * @return Set of all table names in the jOOQ generated code. - */ - public static Set<String> getTableNames() { - return TABLES_BY_JAVA_FIELD_NAME.keySet(); - } - - public static Optional<ForeignKey<?, ?>> getForeignKey(String name) { - return Optional.ofNullable(FOREIGN_KEYS_BY_JAVA_FIELD_NAME.get(name)); - } - - /** - * @return Set of field names for this table. - */ - public static Set<String> getJavaFieldNamesForTable(String tableName) { - return getTableByJavaFieldName(tableName) - .map(table -> Arrays.stream(table.getClass().getFields()) - .map(TableReflection::getJavaFieldName) - .collect(Collectors.toSet())) - .orElse(Set.of()); - } - - public static List<String> getJavaFieldNamesForKey(String tableName, Key<?> key) { - return key.getFields() - .stream() - .map(keyField -> - getJavaFieldName(tableName, keyField.getName()) - .orElseThrow()) - .toList(); - } - - public static Optional<String> getJavaFieldName(String tableName, String fieldName) { - return getJavaFieldNamesForTable(tableName) - .stream() - .filter(tableFieldName -> tableFieldName.equalsIgnoreCase(fieldName)) - .findFirst(); - } - - public static Set<Class<?>> getClassFromSchemas(String className) { - return getDefaultCatalog() - .schemaStream() - .flatMap(schema -> { - var pkg = schema.getClass().getPackageName(); - try { - return Stream.of(Class.forName(pkg + "." + className)); - } catch (ClassNotFoundException e) { - return Stream.empty(); - } - }) - .collect(Collectors.toSet()); - } - - protected static Map<String, Table<?>> getTablesByJavaFieldName() { - return getDefaultCatalog() - .schemaStream() - .flatMap(getFieldsFromSchemaClass("Tables")) - .filter(it -> Table.class.isAssignableFrom(it.getType())) - .collect(Collectors.toMap( - TableReflection::getJavaFieldName, - it -> (Table<?>) getJavaFieldValue(it))); - } - - protected static Map<String, ForeignKey<?, ?>> getForeignKeysByJavaFieldName() { - return getDefaultCatalog() - .schemaStream() - .flatMap(getFieldsFromSchemaClass("Keys")) - .filter(it -> ForeignKey.class.isAssignableFrom(it.getType())) - .collect(Collectors.toMap( - TableReflection::getJavaFieldName, - it -> (ForeignKey<?, ?>) getJavaFieldValue(it))); - } - - /** - * @return Map containing all the foreign key references for any table and the corresponding method names to call them. - */ - private static Map<String, Map<String, String>> getPathMethodsForTableAndKey(Map<String, Table<?>> tablesByJavaFieldName) { - return tablesByJavaFieldName - .values() - .stream() - .collect(Collectors.toMap(table -> TABLE_NAME_TO_JAVA_FIELD_NAME.get(table.getName()), TableReflection::getPathByFk)); - } - - /** - * @param table Table class to find paths for. - * @return Map containing all the foreign key references for the table and the corresponding method names to call them. - */ - private static Map<String, String> getPathByFk(Table<?> table) { - return Arrays - .stream(table.getClass().getMethods()) - .filter(it -> Path.class.isAssignableFrom(it.getReturnType())) - .collect(Collectors.toMap(method -> getKeyNameForMethod(table, method), Method::getName)); - } - - /** - * @param method Method that can be used to implicitly join another table with a FK. - * @param table Table class to which the method belongs to. - * @return The jOOQ name of the key corresponding to the method in the table class. - */ - private static String getKeyNameForMethod(Table<?> table, Method method) { - try { - var path = (Path<?>) method.invoke(table); - var childKey = (ForeignKey<?, ?>) getField(path, "childPath"); - var parentKey = (InverseForeignKey<?, ?>) getField(path, "parentPath"); - var key = childKey != null ? childKey : parentKey.getForeignKey(); - return FOREIGN_KEY_NAME_TO_JAVA_FIELD_NAME.get(key.getName()); - } catch (IllegalAccessException | NoSuchFieldException | InvocationTargetException e) { - throw new RuntimeException(e); - } - } - - private static Object getField(Path<?> path, String name) throws NoSuchFieldException, IllegalAccessException { - var childKeyField = TableImpl.class.getDeclaredField(name); - childKeyField.setAccessible(true); - return childKeyField.get(path); - } - - public static Optional<Field<?>> getField(String tableName, String name) { - return getTableByJavaFieldName(tableName) - .flatMap(table -> Arrays.stream(table.fields()) - .filter(field -> field.getName().equalsIgnoreCase(name)) - .findFirst() - ); - } - - public static Optional<Class<?>> getFieldType(String table, String name) { - return getField(table, name).map(Typed::getType); - } - - public static boolean isArrayField(String tableName, String fieldName) { - return getFieldType(tableName, fieldName).map(Class::isArray).orElse(false); - } - - public static boolean fieldTypeIsCLOB(String table, String name) { - return getField(table, name) - .flatMap(it -> Optional.ofNullable(it.getDataType().getSQLDataType())) - .map(it -> it.equals(SQLDataType.CLOB)) - .orElse(false); - } - - - public static Optional<Class<?>> getTableClass(String name) { - return getTableByJavaFieldName(name).map(Object::getClass); - } - - public static Optional<Class<?>> getRecordClass(String name) { - return getTableByJavaFieldName(name).map(Table::getRecordType); - } - - public static boolean tableHasPrimaryKey(String tableName) { - return getPrimaryKeyForTable(tableName).isPresent(); - } - - public static Optional<? extends UniqueKey<?>> getPrimaryKeyForTable(String tableName) { - return getTableByJavaFieldName(tableName).map(Table::getPrimaryKey).stream().findFirst(); - } - - public static Optional<List<? extends UniqueKey<?>>> getUniqueKeysForTable(String tableName) { - return getTableByJavaFieldName(tableName).map(Table::getUniqueKeys); - } - - public static Set<? extends UniqueKey<?>> getPrimaryAndUniqueKeysForTable(String tableName) { - var allKeys = new HashSet<UniqueKey<?>>(); - getPrimaryKeyForTable(tableName).map(allKeys::add); - getUniqueKeysForTable(tableName).map(allKeys::addAll); - return allKeys; - } - - public static Optional<? extends UniqueKey<?>> getPrimaryOrUniqueKeyMatchingFields(String table, List<String> fields) { - return getTableByJavaFieldName(table) - .flatMap(value -> - Stream.concat(value.getUniqueKeys().stream(), Stream.of(value.getPrimaryKey())) - .filter(key -> key.getFields().size() == fields.size() - && fields.stream().allMatch(idField -> key.getFields().stream().anyMatch(keyField -> keyField.getName().equalsIgnoreCase(idField)))) - .findFirst() - ); - } - - public static Optional<Method> getMethodFromReference(String reference, String tableName, String methodName) { - try { - Class<?> clazz = Class.forName(reference); - Optional<Class<?>> tableClass = getTableClass(tableName); - if (tableClass.isEmpty()) { - return Optional.empty(); - } - return Optional.of(clazz.getMethod(methodName, tableClass.get())); - } catch (ClassNotFoundException | NoSuchMethodException e) { - return Optional.empty(); - } - } - - /** - * Gets the table name (Java field name) for a jOOQ record class. - * @param recordClass The jOOQ record class to find the table for - * @return The table name if found, empty otherwise - */ - public static Optional<String> getTableJavaFieldNameForRecordClass(Class<?> recordClass) { - return TABLES_BY_JAVA_FIELD_NAME.entrySet().stream() - .filter(entry -> entry.getValue().getRecordType().equals(recordClass)) - .map(Map.Entry::getKey) - .findFirst(); - } - - public static @NonNull String getTableName(Class<?> jooqRecordClass) { - return TableReflection.getTableJavaFieldNameForRecordClass(jooqRecordClass) - .orElseThrow(() -> new RuntimeException("Cannot find table for jOOQ record class: " + jooqRecordClass.getName())); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/AbstractSchemaValidator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/AbstractSchemaValidator.java deleted file mode 100644 index 987ddd6427..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/AbstractSchemaValidator.java +++ /dev/null @@ -1,116 +0,0 @@ -package no.sikt.graphitron.validation; - -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.fields.VirtualSourceField; -import no.sikt.graphitron.definitions.fields.containedtypes.FieldReference; -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphql.schema.ProcessedSchema; -import org.apache.commons.text.similarity.LevenshteinDistance; - -import java.util.List; -import java.util.Map; -import java.util.function.Function; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static no.sikt.graphitron.mappings.TableReflection.*; -import static no.sikt.graphitron.validation.ValidationHandler.addErrorMessageAndThrow; -import static no.sikt.graphql.directives.GenerationDirective.MULTITABLE_REFERENCE; -import static no.sikt.graphql.directives.GenerationDirective.REFERENCE; - -/** - * Base class for schema validators, providing shared state and utility methods. - */ -abstract class AbstractSchemaValidator { - protected final ProcessedSchema schema; - protected final List<ObjectField> allFields; - - protected AbstractSchemaValidator(ProcessedSchema schema, List<ObjectField> allFields) { - this.schema = schema; - this.allFields = allFields; - } - - abstract void validate(); - - /** - * Finds strings similar to the target using Levenshtein distance, including the distance values. - * @param target The string to match against - * @param candidates Stream of candidate strings - * @param maxDistance Maximum allowed distance for suggestions - * @return Map of similar strings to their Levenshtein distance within the minimum distance threshold (up to maxDistance) - */ - protected static Map<String, Integer> findSimilarStringsWithDistance(String target, Stream<String> candidates, int maxDistance) { - var levenshtein = new LevenshteinDistance(12); - - var distances = candidates.collect(Collectors.toMap( - Function.identity(), - candidate -> levenshtein.apply(target, candidate))); - - var distanceThreshold = distances.values().stream() - .filter(it -> it > -1 && it <= maxDistance) - .min(Integer::compare) - .orElse(0); - - return distances.entrySet().stream() - .filter(it -> it.getValue() > -1 && it.getValue() <= distanceThreshold) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); - } - - protected void validateReferencePath(GenerationField field, String sourceTable, String targetTable) { - if (sourceTable.equals(targetTable) && !field.createsDataFetcher() && !field.hasFieldReferences() && !field.hasNodeID()) { - return; - } - for (FieldReference fieldReference : field.getFieldReferences()) { - if (fieldReference.hasTableCondition() && !fieldReference.hasKey()) { - return; - } else if (fieldReference.hasKey()) { - String nextTable; - String keyName = fieldReference.getKey().getName(); - var keyTarget = getKeyTargetTableJavaName(keyName).orElse(""); - if (!keyTarget.equals(sourceTable)) { - nextTable = keyTarget; - } else { - nextTable = getKeySourceTableJavaName(keyName).orElse(""); - } - if (nextTable.equals(targetTable)) { - return; - } else { - sourceTable = nextTable; - } - } else if (fieldReference.hasTable()) { - String nextTable = fieldReference.getTable().getName(); - addErrorMessageAndThrowIfNoImplicitPath(field, sourceTable, nextTable); - if (nextTable.equals(targetTable)) { - return; - } else { - sourceTable = nextTable; - } - } - } - - // Because scalar fields have the whole reference path in the reference directive, validation has completed at this point - if (schema.isScalar(field)) { - return; - } - - addErrorMessageAndThrowIfNoImplicitPath(field, sourceTable, targetTable); - } - - protected void addErrorMessageAndThrowIfNoImplicitPath(GenerationField field, String leftTable, String rightTable) { - var possibleKeys = getNumberOfForeignKeysBetweenTables(leftTable, rightTable); - if (possibleKeys == 1) return; - - var isMultitableField = field instanceof VirtualSourceField; - - addErrorMessageAndThrow("Error on field \"%s\" in type \"%s\": " + - "%s found between tables \"%s\" and \"%s\"%s. Please specify path with the @%s directive.", - isMultitableField ? ((VirtualSourceField) field).getOriginalFieldName() : field.getName(), - field.getContainerTypeName(), - possibleKeys == 0 ? "No foreign key" : "Multiple foreign keys", - leftTable, - rightTable, - isMultitableField ? String.format(" in reference path for type '%s'", field.getTypeName()) : "", - isMultitableField ? MULTITABLE_REFERENCE.getName() : REFERENCE.getName() - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/CodeGenerationThresholdEvaluator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/CodeGenerationThresholdEvaluator.java deleted file mode 100644 index 01c326da8e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/CodeGenerationThresholdEvaluator.java +++ /dev/null @@ -1,118 +0,0 @@ -package no.sikt.graphitron.validation; - -import no.sikt.graphitron.configuration.CodeGenerationThresholds; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphitron.javapoet.TypeSpec; - -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Pattern; - -public class CodeGenerationThresholdEvaluator { - private final Integer upperBoundLinesOfCode; - private final Integer upperBoundNestingDepth; - private final Integer crashPointLinesOfCode; - private final Integer crashPointNestingDepth; - private final List<String> upperBoundMessages = new ArrayList<>(); - private final List<String> crashPointMessages = new ArrayList<>(); - private final static Pattern SELECT_PATTERN = Pattern.compile("\\.select\\("); - - public CodeGenerationThresholdEvaluator(CodeGenerationThresholds thresholds, TypeSpec typeSpec) { - this.upperBoundLinesOfCode = thresholds == null ? null : thresholds.getUpperBoundLinesOfCode(); - this.upperBoundNestingDepth = thresholds == null ? null : thresholds.getUpperBoundNestingDepth(); - this.crashPointLinesOfCode = thresholds == null ? null : thresholds.getCrashPointLinesOfCode(); - this.crashPointNestingDepth = thresholds == null ? null : thresholds.getCrashPointNestingDepth(); - - typeSpec.methodSpecs().forEach(method -> { - addMessageIfMethodExceedsNestingDepthBounds(method, typeSpec.name()); - addMessageIfMethodExceedsLinesOfCodeBounds(method, typeSpec.name()); - }); - } - - private String getNestingDepthMessage(String className, String methodName, long depth, ThresholdType type) { - return String.format( - "Query nesting depth in %s.%s has exceeded its %s (current/limit) %d/%d", - className, - methodName, - type.name(), - depth, - type == ThresholdType.UPPER_BOUND ? upperBoundNestingDepth : crashPointNestingDepth - ); - } - - private String getLinesOfCodeMessage(String className, String methodName, int linesOfCode, ThresholdType type) { - return String.format( - "Code size in %s.%s has exceeded its %s (current/limit) %d/%d", - className, - methodName, - type.name(), - linesOfCode, - type == ThresholdType.UPPER_BOUND ? upperBoundLinesOfCode : crashPointLinesOfCode - ); - } - - public void addMessageIfMethodExceedsNestingDepthBounds(MethodSpec method, String className) { - var depth = SELECT_PATTERN.matcher(method.toString()).results().count(); - - if (crashPointNestingDepth != null && depth > crashPointNestingDepth) { - this.crashPointMessages.add( - getNestingDepthMessage( - className, - method.name(), - depth, - ThresholdType.CRASH_POINT - ) - ); - return; - } - if (upperBoundNestingDepth != null && depth > upperBoundNestingDepth) { - this.upperBoundMessages.add( - getNestingDepthMessage( - className, - method.name(), - depth, - ThresholdType.UPPER_BOUND - ) - ); - } - } - - public void addMessageIfMethodExceedsLinesOfCodeBounds(MethodSpec method, String className) { - var linesOfCode = method.code().toString().split("\\R").length; - - if (crashPointLinesOfCode != null && linesOfCode > crashPointLinesOfCode) { - this.crashPointMessages.add( - getLinesOfCodeMessage( - className, - method.name(), - linesOfCode, - ThresholdType.CRASH_POINT - ) - ); - return; - } - if (upperBoundLinesOfCode != null && linesOfCode > upperBoundLinesOfCode) { - this.upperBoundMessages.add( - getLinesOfCodeMessage( - className, - method.name(), - linesOfCode, - ThresholdType.UPPER_BOUND - ) - ); - } - } - - enum ThresholdType { - UPPER_BOUND, - CRASH_POINT - } - - public List<String> getUpperBoundMessages() { - return upperBoundMessages; - } - - public List<String> getCrashPointMessages() { - return crashPointMessages; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/CycleValidator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/CycleValidator.java deleted file mode 100644 index 91a2d2eaff..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/CycleValidator.java +++ /dev/null @@ -1,149 +0,0 @@ -package no.sikt.graphitron.validation; - -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.interfaces.FieldSpecification; -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.definitions.interfaces.GenerationTarget; -import no.sikt.graphitron.definitions.objects.AbstractObjectDefinition; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.*; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static no.sikt.graphitron.validation.ValidationHandler.addErrorMessage; -import static no.sikt.graphitron.validation.ValidationHandler.throwIfErrors; -import static no.sikt.graphql.directives.GenerationDirective.SPLIT_QUERY; - -/** - * Validates that the schema has no unresolved cycles in input or output types. - * Must run before other validators to prevent infinite loops during validation. - */ -class CycleValidator extends AbstractSchemaValidator { - - CycleValidator(ProcessedSchema schema, List<ObjectField> allFields) { - super(schema, allFields); - } - - @Override - void validate() { - validateInputCycles(); - validateOutputTypeCycles(); - } - - private void validateInputCycles() { - var alreadyExplored = new HashSet<String>(); - schema.getInputTypes().values() - .forEach(input -> - detectCycles(input.getName(), new LinkedHashMap<>(), alreadyExplored, "Input type cycles are not allowed.")); - } - - private void validateOutputTypeCycles() { - var alreadyExplored = new HashSet<String>(); - var errorSuffix = String.format("A resolver is required to break the cycle, for example by adding @%s to (one of) the field(s).", - SPLIT_QUERY.getName()); - - schema.getObjects().values() - .forEach(type -> detectCycles(type.getName(), new LinkedHashMap<>(), alreadyExplored, errorSuffix)); - schema.getInterfaces().values() - .forEach(type -> detectCycles(type.getName(), new LinkedHashMap<>(), alreadyExplored, errorSuffix)); - } - - /** - * Detects cycles in input types, and cycles in output types not broken by a resolver. - * - * @param typeName the name of the type, interface or input currently being visited - * @param currentPath ordered map of types on the current DFS path, each mapped to the field paths leading from it - * @param alreadyExplored types whose entire subgraph has already been checked - * @param errorSuffix appended after the cycle path in the error message, e.g. a workaround suggestion - */ - private void detectCycles(String typeName, LinkedHashMap<String, List<String>> currentPath, Set<String> alreadyExplored, String errorSuffix) { - if (alreadyExplored.contains(typeName)) return; - - if (currentPath.containsKey(typeName)) { - addErrorMessage("Cycle detected: %s. %s", formatCyclePath(currentPath, typeName), errorSuffix); - return; - } - - getNextPaths(typeName) - .forEach((fieldTargetType, fieldPaths) -> { - currentPath.put(typeName, fieldPaths); - detectCycles(fieldTargetType, currentPath, alreadyExplored, errorSuffix); - }); - currentPath.remove(typeName); - alreadyExplored.add(typeName); - } - - /** Returns a type's non-resolver fields, grouped by target type name. */ - private Map<String, List<String>> getNextPaths(String typeName) { - if (schema.isInputType(typeName)) { - return schema.getInputType(typeName) - .getFields().stream() - .filter(GenerationTarget::isGenerated) - .filter(field -> schema.isInputType(field.getTypeName())) - .collect(Collectors.groupingBy( - FieldSpecification::getTypeName, - LinkedHashMap::new, - Collectors.mapping(GenerationField::formatPath, Collectors.toList()) - ) - ); - } - var fields = schema.isObject(typeName) - ? schema.getObject(typeName).getFields() - : Optional.ofNullable(schema.getInterface(typeName)) - .map(AbstractObjectDefinition::getFields) - .orElse(List.of()); - - return fields.stream() - .filter(GenerationTarget::isGenerated) - .filter(field -> !field.createsDataFetcher()) - .filter(field -> !schema.isScalar(field)) - .flatMap(field -> - resolveFieldTargets(field) - .map(targetTypeName -> Map.entry(field.formatPath(), targetTypeName))) - .collect(Collectors.groupingBy( - Map.Entry::getValue, - LinkedHashMap::new, - Collectors.mapping(Map.Entry::getKey, Collectors.toList()))); - } - - /** Resolves the type names a field can point to, expanding interfaces to their implementations and unions to their members. */ - private Stream<String> resolveFieldTargets(GenerationField field) { - if (schema.isObject(field) || schema.isInputType(field)) { - return Stream.of(field.getTypeName()); - } else if (schema.isInterface(field)) { - return Stream.concat( - Stream.of(field.getTypeName()), // Include interface name in order to check for interface cycles - schema.getImplementationsForInterface(field.getTypeName()).stream() - .map(AbstractObjectDefinition::getName) - ); - } else if (schema.isUnion(field)) { - return schema.getUnionSubTypes(field.getTypeName()).stream() - .map(AbstractObjectDefinition::getName); - } - return Stream.empty(); - } - - /** - * Formats the cycle portion of a path as a human-readable string, e.g. {@code 'TypeA.b' -> 'TypeB.a' -> 'TypeA'}. - * @param fullPath Ordered map of types on the current DFS path, each mapped to the field paths leading from it - * @param typeNameInCycle Name of a type/interface/input type which is in the cycle. - * @return Path as a human-readable string - */ - private static String formatCyclePath(LinkedHashMap<String, List<String>> fullPath, String typeNameInCycle) { - var cyclePath = new LinkedHashMap<>(fullPath); - for (var key : fullPath.keySet()) { - if (key.equals(typeNameInCycle)) break; - cyclePath.remove(key); - } - - var path = cyclePath.values() - .stream() - .map(fieldPaths -> String.join("/", fieldPaths)) - .reduce("", - (accumulated, step) -> accumulated + step + " -> "); - - // Append the repeated type name to close the cycle - return path + String.format("'%s'", cyclePath.keySet().iterator().next()); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/ExternalReferenceValidator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/ExternalReferenceValidator.java deleted file mode 100644 index d37c870faf..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/ExternalReferenceValidator.java +++ /dev/null @@ -1,52 +0,0 @@ -package no.sikt.graphitron.validation; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.helpers.CodeReferenceWrapper; -import no.sikt.graphitron.definitions.objects.EnumDefinition; -import no.sikt.graphitron.definitions.sql.SQLCondition; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.List; - -import static no.sikt.graphitron.validation.ValidationHandler.addErrorMessage; - -/** - * Validates that external references (enums, services, conditions) configured in the schema - * resolve to known classes. - */ -class ExternalReferenceValidator extends AbstractSchemaValidator { - - ExternalReferenceValidator(ProcessedSchema schema, List<ObjectField> allFields) { - super(schema, allFields); - } - - @Override - void validate() { - var referenceSet = GeneratorConfig.getExternalReferences(); - schema - .getEnums() - .values() - .stream() - .filter(EnumDefinition::hasJavaEnumMapping) - .map(EnumDefinition::getEnumReference) - .filter(e -> !referenceSet.contains(e)) - .forEach(e -> addErrorMessage("No enum with name '%s' found.", e.getSchemaClassReference())); - - allFields.stream() - .filter(ObjectField::hasServiceReference) - .map(ObjectField::getExternalMethod) - .map(CodeReferenceWrapper::getReference) - .filter(e -> !referenceSet.contains(e)) - .forEach(e -> addErrorMessage("No service with name '%s' found.", e.getSchemaClassReference())); - - allFields - .stream() - .filter(ObjectField::isGenerated) - .filter(ObjectField::hasCondition) - .map(ObjectField::getCondition) - .map(SQLCondition::getReference) - .filter(e -> !referenceSet.contains(e)) - .forEach(e -> addErrorMessage("No condition with name '%s' found.", e.getSchemaClassReference())); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/FederationValidator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/FederationValidator.java deleted file mode 100644 index 97ac14cab3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/FederationValidator.java +++ /dev/null @@ -1,110 +0,0 @@ -package no.sikt.graphitron.validation; - -import no.sikt.graphitron.definitions.fields.AbstractField; -import no.sikt.graphitron.definitions.fields.GenerationSourceField; -import no.sikt.graphitron.definitions.fields.InputField; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.mapping.JOOQMapping; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.definitions.objects.RecordObjectDefinition; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.List; -import java.util.stream.Collectors; - -import static no.sikt.graphitron.generators.context.NodeIdReferenceHelpers.isNodeIdReferenceField; -import static no.sikt.graphitron.validation.ValidationHandler.addErrorMessage; -import static no.sikt.graphql.directives.GenerationDirective.LOOKUP_KEY; -import static no.sikt.graphql.directives.GenerationDirective.TABLE; - -/** - * Validates Apollo Federation entity definitions and @lookupKey arguments. - */ -class FederationValidator extends AbstractSchemaValidator { - - FederationValidator(ProcessedSchema schema, List<ObjectField> allFields) { - super(schema, allFields); - } - - @Override - void validate() { - validateLookupArguments(); - validateEntities(); - } - - private void validateLookupArguments() { - allFields.forEach(field -> { - var lookupArguments = field.getNonReservedArguments().stream() - .filter(InputField::isLookupKey) - .toList(); - - JOOQMapping currentTable; - var previousTableObject = schema.getPreviousTableObjectForField(field); - if (schema.isObject(field.getTypeName()) && schema.getObject(field.getTypeName()).hasTable()) { - currentTable = schema.getObject(field.getTypeName()).getTable(); - } else { - if (previousTableObject != null && previousTableObject.hasTable()) { - currentTable = previousTableObject.getTable(); - } else { - currentTable = null; - } - } - - lookupArguments.stream() - .filter(it -> it.hasFieldReferences() || isNodeIdReferenceField(it, schema, currentTable)) - .forEach(it -> addErrorMessage( - "Argument/input field %s has %s directive, but is a reference field. Lookup on references is not currently supported.", - it.formatPath(), LOOKUP_KEY.getName())); - - lookupArguments.stream() - .filter(schema::isInputType) - .forEach(arg -> { - var referenceFields = schema.getInputType(arg).getFields().stream() - .filter(it -> it.hasFieldReferences() || isNodeIdReferenceField(it, schema, currentTable)) - .map(GenerationSourceField::formatPath) - .collect(Collectors.joining(", ")); - if (!referenceFields.isEmpty()) { - addErrorMessage( - "Argument %s has %s directive, but contains reference field(s): %s. Lookup on references is not currently supported.", - arg.formatPath(), LOOKUP_KEY.getName(), referenceFields); - } - }); - }); - } - - private void validateEntities() { - schema.getObjects().values().stream() - .filter(RecordObjectDefinition::isEntity) - .forEach(this::validateEntity); - } - - private void validateEntity(ObjectDefinition entityType) { - if (!entityType.hasTable()) { - addErrorMessage("Entity type '%s' must map to a table using the @%s directive", - entityType.getName(), - TABLE.getName()); - return; - } - - var hasNestedKeys = entityType.getEntityKeys().keys().stream().anyMatch(key -> !key.getNestedKeys().isEmpty()); - if (hasNestedKeys) { - addErrorMessage("Nested key(s) found in entity type '%s'. This is currently not supported.", entityType.getName()); - } - - for (var compositeKey: entityType.getEntityKeys().keys()) { - for (var key : compositeKey.getKeys()) { - var matchingField = entityType.getFields().stream() - .filter(field -> field.getName().equals(key)) - .findFirst(); - if (matchingField.isEmpty()) { - var similarFields = findSimilarStringsWithDistance(key, entityType.getFields().stream().map(AbstractField::getName), 6); - var suggestion = similarFields.isEmpty() ? "" : String.format(". Did you mean one of: '%s'?", String.join("', '", similarFields.keySet())); - addErrorMessage("Entity Key field '%s' was not found in type '%s'%s", key, entityType.getName(), suggestion); - } else if (matchingField.get().hasFieldReferences() || isNodeIdReferenceField(matchingField.get(), schema)) { - addErrorMessage("Entity Key field '%s' in type '%s' is a reference. This is currently not supported.", - key, entityType.getName()); - } - } - } - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/FieldDirectiveValidator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/FieldDirectiveValidator.java deleted file mode 100644 index 6091da81b4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/FieldDirectiveValidator.java +++ /dev/null @@ -1,168 +0,0 @@ -package no.sikt.graphitron.validation; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.definitions.fields.GenerationSourceField; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.interfaces.RecordObjectSpecification; -import no.sikt.graphitron.definitions.mapping.JOOQMapping; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphql.schema.ProcessedSchema; -import org.jooq.Field; - -import java.lang.reflect.Method; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.util.List; -import java.util.Optional; -import java.util.Set; - -import static no.sikt.graphitron.mappings.TableReflection.getJavaFieldName; -import static no.sikt.graphitron.mappings.TableReflection.getMethodFromReference; -import static no.sikt.graphitron.mappings.TableReflection.tableExists; -import static no.sikt.graphitron.validation.ValidationHandler.addErrorMessage; -import static no.sikt.graphitron.validation.messages.ConstructError.*; -import static no.sikt.graphql.directives.GenerationDirective.*; - -/** - * Validates @constructType, @externalField, and @field directive combinations. - */ -class FieldDirectiveValidator extends AbstractSchemaValidator { - - FieldDirectiveValidator(ProcessedSchema schema, List<ObjectField> allFields) { - super(schema, allFields); - } - - @Override - void validate() { - validateNotUsingBothExternalFieldAndField(); - validateConstructTypeDirective(); - validateExternalField(); - } - - private void validateNotUsingBothExternalFieldAndField() { - schema.getObjects().values() - .forEach(object -> object.getFields().stream() - .filter(it -> it.isExternalField() && it.hasFieldDirective()) - .forEach(it -> addErrorMessage( - "Field " + it.getName() + " in type " + it.getContainerTypeName() + " cannot have both the field and externalField directives." - ) - ) - ); - } - - private void validateConstructTypeDirective() { - schema - .getObjects() - .values() - .forEach(object -> object - .getFields() - .stream() - .filter(ObjectField::hasSelectConstruct) - .forEach(field -> validateConstructField(field, object)) - ); - } - - private void validateConstructField(ObjectField field, ObjectDefinition object) { - var targetType = schema.getObject(field.getTypeName()); - - if (targetType == null) { - addErrorMessage(CONSTRUCT_FIELD_IS_NOT_TYPE, field.formatPath(), field.getTypeName()); - return; - } - - if (targetType.hasTable()) { - addErrorMessage(CONSTRUCT_TYPE_HAS_TABLE, field.formatPath(), field.getTypeName()); - } - - var hasTable = schema.hasTableObjectForObject(object); - if (!hasTable) { - addErrorMessage(CONSTRUCT_MISSING_TABLE, field.formatPath()); - } - - if (field.hasFieldDirective()) { - addErrorMessage(CONSTRUCT_FIELD_HAS_ILLEGAL_DIRECTIVE, field.formatPath(), FIELD.getName()); - } - - if (field.isExternalField()) { - addErrorMessage(CONSTRUCT_FIELD_HAS_ILLEGAL_DIRECTIVE, field.formatPath(), EXTERNAL_FIELD.getName()); - } - - var construct = field.getSelectConstruct(); - var tableJavaName = hasTable - ? schema.getPreviousTableObjectForObject(object).getTable().getMappingName() - : null; - - for (var entry : construct.values().entrySet()) { - var selectionFieldName = entry.getKey(); - var columnName = entry.getValue(); - - var innerField = targetType.getFields().stream() - .filter(f -> f.getName().equals(selectionFieldName)) - .findFirst(); - - if (innerField.isEmpty()) { - addErrorMessage(CONSTRUCT_NONEXISTENT_FIELD, field.formatPath(), selectionFieldName, targetType.getName()); - } else if (schema.isObject(innerField.get())) { - addErrorMessage(CONSTRUCT_CONTAINS_NESTED_TYPE, field.formatPath(), selectionFieldName); - } - - if (hasTable && tableExists(tableJavaName) && getJavaFieldName(tableJavaName, columnName).isEmpty()) { - addErrorMessage(CONSTRUCT_NONEXISTENT_COLUMN, field.formatPath(), columnName, tableJavaName); - } - } - } - - private void validateExternalField() { - this.schema.getObjects().values() - .forEach(object -> object.getFields().stream() - .filter(GenerationSourceField::isExternalField) - .forEach(field -> { - String typeName = field.getContainerTypeName(); - JOOQMapping table = - Optional.ofNullable(schema.getObject(typeName).getTable()) - .orElseGet(() -> - Optional.ofNullable(schema.getPreviousTableObjectForField(field)) - .map(RecordObjectSpecification::getTable) - .orElse(null) - ); - - if (table == null) { - addErrorMessage("No table found for field " + field.getName() + "in type " + typeName); - return; - } - - Set<String> referenceImports = GeneratorConfig.getExternalReferenceImports(); - List<Method> methods = referenceImports.stream() - .map(it -> getMethodFromReference(it, table.getName(), field.getName())) - .flatMap(Optional::stream) - .toList(); - - if (methods.isEmpty()) { - addErrorMessage("No method found for field " + field.getName() + " in type " + typeName); - return; - } - - if (methods.size() > 1) { - addErrorMessage("Multiple methods found for field " + field.getName() + "in type " + typeName); - return; - } - - Method method = methods.get(0); - - if (!method.getReturnType().equals(Field.class)) { - addErrorMessage("Return type of method needs to be generic type Field for field " + field.getName() + "in type " + typeName); - } - - Type type = method.getGenericReturnType(); - - if (type instanceof ParameterizedType paramType) { - Type actualType = paramType.getActualTypeArguments()[0]; - - if (!actualType.getTypeName().equals(field.getTypeClass().toString())) { - addErrorMessage("Type parameter of generic type Field in method needs to match scalar type of field " + field.getName() + "in type " + typeName); - } - } - }) - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/FieldTypeValidator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/FieldTypeValidator.java deleted file mode 100644 index 19ff345ef4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/FieldTypeValidator.java +++ /dev/null @@ -1,80 +0,0 @@ -package no.sikt.graphitron.validation; - -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.definitions.interfaces.RecordObjectSpecification; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static no.sikt.graphitron.validation.ValidationHandler.throwIfErrors; - -/** - * Validates that all field types in the schema resolve to known types. - */ -class FieldTypeValidator extends AbstractSchemaValidator { - - FieldTypeValidator(ProcessedSchema schema, List<ObjectField> allFields) { - super(schema, allFields); - } - - @Override - void validate() { - schema.getRecordTypes() - .values() - .stream() - .map(this::validateFieldTypes) - .filter(it -> !it.isEmpty()) - .forEach(ValidationHandler::addErrorMessage); - - throwIfErrors(); - } - - private String validateFieldTypes(RecordObjectSpecification<? extends GenerationField> object) { - var objectName = object.getName(); - return object - .getFields() - .stream() - .flatMap(it -> validateFieldType(objectName, it).stream()) - .filter(it -> !it.isEmpty()) - .collect(Collectors.joining("\n")); - } - - private List<String> validateFieldType(String objectName, GenerationField field) { - return checkTypeExists(field.getTypeName(), Set.of()) - .entrySet() - .stream() - .map(it -> String.format("Field \"%s\" within schema type \"%s\" has invalid type \"%s\" (or an union containing it). Closest type matches found by levenshtein distance are:\n%s", field.getName(), objectName, it.getKey(), it.getValue())) - .collect(Collectors.toList()); - } - - private Map<String, String> checkTypeExists(String typeName, Set<String> seenTypes) { - if (seenTypes.contains(typeName) || schema.isScalar(typeName)) { - return Map.of(); - } - - if (schema.isUnion(typeName)) { - return schema - .getUnion(typeName) - .getFieldTypeNames() - .stream() - .flatMap(it -> checkTypeExists(it, Stream.concat(seenTypes.stream(), Stream.of(typeName)).collect(Collectors.toSet())).entrySet().stream()) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); - } - - if (schema.isType(typeName)) { - return Map.of(); - } - - // If we make it here, no valid type could be identified. - var similarTypes = findSimilarStringsWithDistance(typeName, schema.getAllValidFieldTypeNames().stream(), 12); - var formatted = similarTypes.entrySet().stream() - .map(e -> e.getKey() + " - " + e.getValue()) - .collect(Collectors.joining(", ")); - return Map.of(typeName, formatted); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/InputDirectiveValidator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/InputDirectiveValidator.java deleted file mode 100644 index cb3da11b0b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/InputDirectiveValidator.java +++ /dev/null @@ -1,32 +0,0 @@ -package no.sikt.graphitron.validation; - -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.objects.RecordObjectDefinition; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.List; - -import static no.sikt.graphitron.validation.ValidationHandler.addWarningMessage; -import static no.sikt.graphitron.validation.messages.InputDirectiveWarning.RECORD_TYPE_CONFLICT; - -/** - * Validates directive combinations on input types. - */ -class InputDirectiveValidator extends AbstractSchemaValidator { - - InputDirectiveValidator(ProcessedSchema schema, List<ObjectField> allFields) { - super(schema, allFields); - } - - @Override - void validate() { - validateNotUsingBothTableAndRecord(); - } - - private void validateNotUsingBothTableAndRecord() { - schema.getInputTypes().values().stream() - .filter(RecordObjectDefinition::hasTable) - .filter(RecordObjectDefinition::hasJavaRecordReference) - .forEach(input -> addWarningMessage(RECORD_TYPE_CONFLICT, input.getName())); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/InterfaceAndUnionValidator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/InterfaceAndUnionValidator.java deleted file mode 100644 index 03588f190f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/InterfaceAndUnionValidator.java +++ /dev/null @@ -1,291 +0,0 @@ -package no.sikt.graphitron.validation; - -import no.sikt.graphitron.definitions.fields.GenerationSourceField; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.objects.AbstractObjectDefinition; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.Collection; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.stream.Collectors; - -import static java.util.stream.Collectors.groupingBy; -import static no.sikt.graphitron.mappings.TableReflection.*; -import static no.sikt.graphitron.validation.ValidationHandler.addErrorMessage; -import static no.sikt.graphitron.validation.ValidationHandler.isTrue; -import static no.sikt.graphitron.validation.messages.MultitableError.MISSING_TABLE_ON_MULTITABLE; -import static no.sikt.graphql.directives.GenerationDirective.*; -import static no.sikt.graphql.naming.GraphQLReservedName.*; - -/** - * Validates interface and union type definitions, including single-table interfaces, - * multitable field constraints, and interface return type requirements. - */ -class InterfaceAndUnionValidator extends AbstractSchemaValidator { - - InterfaceAndUnionValidator(ProcessedSchema schema, List<ObjectField> allFields) { - super(schema, allFields); - } - - @Override - void validate() { - validateMultitableTypeTables(); - validateSingleTableInterfaceDefinitions(); - validateInterfacesReturnedInFields(); - validateMultitableFieldsOutsideRoot(); - validateUnionAndInterfaceSubTypes(); - } - - /* - * This is a temporary validation until GG-104 has been fixed. - */ - private void validateUnionAndInterfaceSubTypes() { - schema.getObjects() - .values().stream() - .flatMap(o -> o.getFields().stream()) - .filter(schema::isMultiTableField) - .filter(field -> !field.getTypeName().equals(NODE_TYPE.getName())) - .filter(field -> !field.getTypeName().equals(FEDERATION_SERVICE_TYPE.getName())) - .filter(field -> !field.getTypeName().equals(FEDERATION_ENTITY_UNION.getName())) - .forEach(field -> { - var subTypes = schema.getTypesFromInterfaceOrUnion(field.getTypeName()).orElse(List.of()); - if (subTypes.size() < 2 && subTypes.stream().noneMatch(type -> type.implementsInterface(ERROR_TYPE.getName()))) { - addErrorMessage( - "Multitable queries is currently only supported for interface and unions with more than one implementing type. \n" + - "The field %s's type %s has %d implementing type(s).", field.getName(), field.getTypeName(), subTypes.size()); - } - }); - } - - private void validateMultitableFieldsOutsideRoot() { - allFields.stream() - .filter(GenerationSourceField::isGenerated) - .filter(it -> !it.isRootField()) - .filter(it -> schema.isObjectWithPreviousTableObject(it.getContainerTypeName())) - .filter(schema::isMultiTableField) - .forEach(field -> { - if (!field.createsDataFetcher()) { - addErrorMessage("%s is a multitable field outside root, but is missing the %s directive. " + - "Multitable queries outside root is only supported for resolver fields.", - field.formatPath(), SPLIT_QUERY.getName() - ); - } - - if (field.hasFieldReferences()) { - addErrorMessage("%s has the %s directive which is not supported on multitable queries. Use %s directive instead.", - field.formatPath(), REFERENCE.getName(), MULTITABLE_REFERENCE.getName() - ); - } - }); - } - - private void validateMultitableTypeTables() { - schema - .getObjects() - .values() - .stream() - .filter(Objects::nonNull) - .flatMap(it -> it.getFields().stream()) - .filter(schema::isMultiTableField) - .filter(it -> it.createsDataFetcher() || it.isRootField()) - .filter(it -> !it.hasServiceReference()) - .filter(it -> !it.getName().equals(FEDERATION_ENTITIES_FIELD.getName())) - .filter(it -> !it.getTypeName().equals(NODE_TYPE.getName())) - .filter(it -> !it.getTypeName().equals(ERROR_TYPE.getName())) - .forEach((field) -> { - var multitableName = field.getTypeName(); - var typesMissingTable = schema - .getTypesFromInterfaceOrUnion(multitableName).orElse(List.of()) - .stream() - .filter(it -> !it.hasTable()) - .map(AbstractObjectDefinition::getName) - .collect(Collectors.joining("', '")); - if (!typesMissingTable.isEmpty()) { - addErrorMessage(MISSING_TABLE_ON_MULTITABLE, typesMissingTable, field.formatPath(), field.getTypeName()); - } - }); - } - - private void validateSingleTableInterfaceDefinitions() { - schema.getInterfaces().forEach((name, interfaceDefinition) -> { - if (name.equalsIgnoreCase(NODE_TYPE.getName()) || name.equalsIgnoreCase(ERROR_TYPE.getName())) return; - - var implementations = schema.getTypesFromInterfaceOrUnion(interfaceDefinition).orElse(List.of()); - - if (interfaceDefinition.hasDiscriminator() == interfaceDefinition.isMultiTableInterface()) { - addErrorMessage( - String.format("'%s' and '%s' directives on interfaces must be used together. " + - "Interface '%s' is missing '%s' directive.", - DISCRIMINATE.getName(), TABLE.getName(), name, - interfaceDefinition.hasTable() ? DISCRIMINATE.getName() : TABLE.getName())); - } - - if (!interfaceDefinition.isMultiTableInterface()) { // Single table interface with discriminator - Optional<?> discriminatorField = getField( - interfaceDefinition.getTable().getName(), - interfaceDefinition.getDiscriminatorFieldName() - ); - if (discriminatorField.isEmpty()) { - addErrorMessage( - String.format("Interface '%s' has discriminating field set as '%s', but the field " + - "does not exist in table '%s'.", - name, interfaceDefinition.getDiscriminatorFieldName(), interfaceDefinition.getTable().getName())); - } else { - Optional<Class<?>> fieldType = getFieldType( - interfaceDefinition.getTable().getName(), - interfaceDefinition.getDiscriminatorFieldName() - ); - if (fieldType.isEmpty() || !fieldType.get().equals(String.class)) { - addErrorMessage( - String.format("Interface '%s' has discriminating field set as '%s', but the field " + - "does not return a string type, which is not supported.", - name, interfaceDefinition.getDiscriminatorFieldName())); - } - } - - implementations.forEach(impl -> { - if (!impl.hasDiscriminator()) { - addErrorMessage( - String.format("Type '%s' is missing '%s' directive in order to implement interface '%s'.", - impl.getName(), DISCRIMINATOR.getName(), name)); - } - if (impl.hasTable() && interfaceDefinition.hasTable() && !impl.getTable().equals(interfaceDefinition.getTable())) { - addErrorMessage( - String.format("Interface '%s' requires implementing types to have table '%s', " + - "but type '%s' has table '%s'.", - name, interfaceDefinition.getTable().getName(), impl.getName(), impl.getTable().getName())); - } - - impl.getFields() - .stream() - .filter(it -> interfaceDefinition.hasField(it.getName())) - .forEach(it -> { - var fieldInInterface = interfaceDefinition.getFieldByName(it.getName()); - String sharedErrorMessage = "Overriding '%s' configuration in types implementing " + - "a single table interface is not currently supported, and must be identical " + - "with interface. Type '%s' has a configuration mismatch on field '%s' from the interface '%s'."; - - if (it.hasCondition() != fieldInInterface.hasCondition() - || (it.hasCondition() && !it.getCondition().equals(fieldInInterface.getCondition()))) { - addErrorMessage( - sharedErrorMessage, - CONDITION.getName(), impl.getName(), it.getName(), name - ); - } - - if (!it.getFieldReferences().equals(fieldInInterface.getFieldReferences())) { - addErrorMessage( - sharedErrorMessage, - REFERENCE.getName(), impl.getName(), it.getName(), name - ); - } - }); - }); - - // Check for conflicts in "shared" fields which are not in the interface definition - implementations.stream() - .map(AbstractObjectDefinition::getFields) - .flatMap(Collection::stream) - .filter(it -> !interfaceDefinition.hasField(it.getName())) - .collect(groupingBy(ObjectField::getName)) - .entrySet() - .stream() - .filter(it -> it.getValue().size() > 1) - .forEach(entry -> { - var fields = entry.getValue(); - var first = fields.get(0); - - fields.stream().skip(1).forEach(field -> { - String sharedErrorMessage = "Different configuration on fields in types implementing the same single table interface is currently not supported. " + - "Field '%s' occurs in two or more types implementing interface '%s', but there is a mismatch between the configuration of the '%s' directive."; - if (!field.getUpperCaseName().equals(first.getUpperCaseName())) { - addErrorMessage( - sharedErrorMessage, - entry.getKey(), interfaceDefinition.getName(), FIELD.getName() - ); - } - - if (!field.getFieldReferences().equals(first.getFieldReferences())) { - addErrorMessage( - sharedErrorMessage, - entry.getKey(), interfaceDefinition.getName(), REFERENCE.getName()); - } - - if (!(field.hasCondition() == first.hasCondition() - && (!field.hasCondition() || field.getCondition().equals(first.getCondition())))) { - addErrorMessage( - sharedErrorMessage, - entry.getKey(), interfaceDefinition.getName(), CONDITION.getName()); - } - }); - }); - } - } - ); - - schema.getObjects().values().stream() - .filter(objectDefinition -> !objectDefinition.getImplementedInterfaces().isEmpty() || objectDefinition.hasDiscriminator()) - .forEach(objectDefinition -> { - var implementedInterfaces = objectDefinition.getImplementedInterfaces(); - - var singleTableInterfaces = implementedInterfaces.stream() - .filter(it -> !it.equals(NODE_TYPE.getName())) - .filter(schema::isSingleTableInterface) - .toList(); - - if (singleTableInterfaces.isEmpty() && objectDefinition.hasDiscriminator()) { - addErrorMessage( - String.format("Type '%s' has discriminator, but doesn't implement any interfaces requiring it.", objectDefinition.getName()) - ); - } - }); - } - - private void validateInterfacesReturnedInFields() { - allFields.stream() - .filter(ObjectField::isGeneratedWithResolver) - .filter(schema::isInterface) - .forEach(field -> { - var typeName = field.getTypeName(); - var name = Optional - .ofNullable(schema.getObjectOrConnectionNode(typeName)) - .map(AbstractObjectDefinition::getName) - .orElse(typeName); - var isSingleTable = schema.isSingleTableInterface(field); - if (!field.isRootField() && (isSingleTable || name.equals(NODE_TYPE.getName()))) { - addErrorMessage("interface (%s) returned in non root object. This is not fully " + - "supported. Use with care", name); - } - - if (name.equalsIgnoreCase(NODE_TYPE.getName())) { - isTrue( - field.getArguments().size() == 1, - "Only exactly one input field is currently supported for fields returning the '%s' interface. " + - "%s has %s input fields", NODE_TYPE.getName(), field.formatPath(), field.getArguments().size() - ); - isTrue( - !field.isIterableWrapped(), - "Generating fields returning a list of '%s' is not supported. " + - "'%s' must return only one %s", name, field.getName(), field.getTypeName() - ); - } else { - schema.getObjects() - .values() - .stream() - .filter(it -> it.implementsInterface(schema.getInterface(name).getName())) - .forEach(implementation -> { - if (!implementation.hasTable() && isSingleTable) { - addErrorMessage("Interface '%s' is returned in field '%s', but type '%s' " + - "implementing '%s' does not have table set. This is not supported.", name, field.getName(), implementation.getName(), name); - } else if (implementation.hasTable() && !tableHasPrimaryKey(implementation.getTable().getName())) { - addErrorMessage("Interface '%s' is returned in field '%s', but implementing type '%s' " + - "has table '%s' which does not have a primary key. This is not supported.", name, field.getName(), implementation.getName(), implementation.getTable().getName()); - } - }); - } - } - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/InvalidSchemaException.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/InvalidSchemaException.java deleted file mode 100644 index bd27009e40..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/InvalidSchemaException.java +++ /dev/null @@ -1,7 +0,0 @@ -package no.sikt.graphitron.validation; - -public class InvalidSchemaException extends RuntimeException { - public InvalidSchemaException(String message) { - super(message); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/MutationValidator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/MutationValidator.java deleted file mode 100644 index a98db55dc8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/MutationValidator.java +++ /dev/null @@ -1,320 +0,0 @@ -package no.sikt.graphitron.validation; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.definitions.fields.AbstractField; -import no.sikt.graphitron.definitions.fields.GenerationSourceField; -import no.sikt.graphitron.definitions.fields.InputField; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.fields.containedtypes.MutationType; -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.definitions.interfaces.GenerationTarget; -import no.sikt.graphitron.definitions.mapping.JOOQMapping; -import no.sikt.graphitron.generators.context.InputParser; -import no.sikt.graphitron.validation.messages.InputTableError; -import no.sikt.graphql.naming.GraphQLReservedName; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.*; -import java.util.stream.Collectors; - -import static no.sikt.graphitron.configuration.GeneratorConfig.shouldMakeNodeStrategy; -import static no.sikt.graphitron.configuration.Recursion.recursionCheck; -import static no.sikt.graphitron.generators.context.NodeIdReferenceHelpers.isNodeIdReferenceField; -import static no.sikt.graphitron.mappings.TableReflection.*; -import static no.sikt.graphitron.validation.ValidationHandler.addErrorMessage; -import static no.sikt.graphitron.validation.ValidationHandler.addWarningMessage; -import static no.sikt.graphitron.validation.messages.InputTableError.MISSING_FIELD; -import static no.sikt.graphitron.validation.messages.InputTableError.MISSING_NON_NULLABLE; -import static org.apache.commons.lang3.StringUtils.lowerCase; - -/** - * Validates mutation directives, required fields, and delete/insert-with-returning mutations. - */ -class MutationValidator extends AbstractSchemaValidator { - - MutationValidator(ProcessedSchema schema, List<ObjectField> allFields) { - super(schema, allFields); - } - - @Override - void validate() { - var mutation = schema.getMutationType(); - if (mutation == null) { - return; - } - var mutations = mutation - .getFields() - .stream() - .filter(ObjectField::isGeneratedWithResolver) - .toList(); - if (mutations.isEmpty()) { - return; - } - - validateMutationDirectives(mutations); - validateMutationRequiredFields(mutations); - } - - private void validateMutationDirectives(List<ObjectField> mutations) { - mutations - .stream() - .filter(it -> !it.hasMutationType() && !it.hasServiceReference()) - .forEach(it -> addErrorMessage("Mutation '%s' is set to generate, but has neither a service nor mutation type set.", it.getName())); - mutations - .stream() - .filter(it -> it.hasMutationType() && !new InputParser(it, schema).hasJOOQRecords()) - .forEach(it -> addErrorMessage("Mutations must have at least one table attached when generating resolvers with queries. Mutation '%s' has no tables attached.", it.getName())); - - if (GeneratorConfig.failOnMerge() && !GeneratorConfig.generateUpsertAsStore()) { - mutations - .stream() - .filter(it -> it.hasMutationType() && it.getMutationType() == MutationType.UPSERT) - .forEach(it -> addErrorMessage("MERGE generation is disabled (failOnMerge is enabled), but mutation '%s' uses UPSERT. Possible workaround is enabling generateUpsertAsStore.", it.getName())); - } - } - - private void validateMutationRequiredFields(List<ObjectField> mutations) { - mutations - .stream() - .filter(ObjectField::hasMutationType) - .forEach(target -> { - validateRecordRequiredFields(target); - validateMutationWithReturning(target); - new InputParser(target, schema).getJOOQRecords().values().forEach(inputField -> checkMutationIOFields(inputField, target)); - }); - } - - private void validateRecordRequiredFields(ObjectField target) { - var mutationType = target.getMutationType(); - if (mutationType.equals(MutationType.INSERT) || mutationType.equals(MutationType.UPSERT)) { - var recordInputs = new InputParser(target, schema).getJOOQRecords().values(); - if (recordInputs.isEmpty()) { - addErrorMessage("Mutation " - + target.getName() - + " is set as an " + lowerCase(mutationType.name()) + " operation, but does not link any input to tables."); - } - - recordInputs.forEach(this::checkRequiredFields); - } - } - - private void validateMutationWithReturning(ObjectField field) { - boolean isDeleteWithReturning = schema.isDeleteMutationWithReturning(field); - boolean isInsertWithReturning = schema.isInsertMutationWithReturning(field); - - if (!isDeleteWithReturning && !isInsertWithReturning) { - return; - } - /* Validate output */ - var dataField = schema.inferDataTargetForMutation(field); - - if (dataField.isEmpty()) { - addErrorMessage("Cannot find correct field to output data to after mutation for field %s.", field.formatPath()); - return; - } - - /* Validate input */ - var recordInputs = new InputParser(field, schema).getJOOQRecords().values(); // TODO: support non-jOOQ record inputs - if (recordInputs.isEmpty()) { - addErrorMessage("Field %s is a generated %s mutation, but does not link any input to tables.", field.formatPath(), field.getMutationType()); - return; - } else if (recordInputs.size() != 1) { - addErrorMessage("Field %s is a generated %s mutation, but has multiple input records. This is not supported.", field.formatPath(), field.getMutationType()); - return; - } - - var input = recordInputs.stream().findFirst().orElseThrow(); - - if (isInsertWithReturning && !shouldMakeNodeStrategy() && schema.getInputType(input).getFields().stream().anyMatch(AbstractField::isID)) { - addErrorMessage("%s is a generated %s field with ID input, but this is only supported with node ID strategy enabled.", - field.formatPath(), - field.getMutationType() - ); - return; - } - - var inputTable = schema.getRecordType(input).getTable(); - var outputTable = schema.isScalar(dataField.get()) ? inputTable : schema.getRecordType(dataField.get()).getTable(); - - if (!inputTable.equals(outputTable)) { - addErrorMessage("Mutation field %s has a mismatch between input and output tables. Input table is '%s', and output table is '%s'.", - field.formatPath(), inputTable.getMappingName(), outputTable.getMappingName()); - return; - } - - if (input.isNullable() || input.isIterableWrappedWithNullableElement()) { - addErrorMessage("Field %s is a generated %s mutation, but has nullable input. This is not supported. Consider changing the input type from '%s' to '%s'.", - field.formatPath(), field.getMutationType(), - input.formatGraphQLSchemaType(), - input.isIterableWrapped() ? "[" + input.getTypeName() + "!]!" : input.getTypeName() + "!"); - } - - if (isDeleteWithReturning) { - validateDeleteMutation(field, dataField.orElse(null), input); - } - } - - private void validateDeleteMutation(ObjectField field, ObjectField dataField, InputField input) { - var inputType = schema.getInputType(input); - var targetTable = inputType.getTable(); - - /* Validate that there are no references in output */ - if (dataField != null && schema.isRecordType(dataField)){ - var subqueryReferenceFields = findSubqueryReferenceFieldsForTableObject(dataField, targetTable, 0); - if (!subqueryReferenceFields.isEmpty()) { - addErrorMessage( - "Mutation field %s has references returned from the data field. " + - "This is not supported for %s mutations. Found reference fields are: %s", - field.formatPath(), MutationType.DELETE, String.join(", ", subqueryReferenceFields.stream().map(GenerationField::formatPath).toList())); - } - } - - /* Validate that there is non-nullable input matching a PK/UK */ - var idFields = inputType.getFields().stream() - .filter(it -> it.isID() || schema.isNodeIdField(it)) - .filter(it -> !it.hasFieldReferences()) - .filter(it -> !schema.isNodeIdField(it) || schema.getNodeTypeForNodeIdField(it).map(n -> n.getTable().equals(targetTable)).orElse(false)) - .filter(it -> schema.isNodeIdField(it) || it.getUpperCaseName().equalsIgnoreCase(GraphQLReservedName.NODE_ID.getName())) - .toList(); - - var requiredIdOrNodeIdFields = idFields.stream() - .filter(AbstractField::isNonNullable) - .toList(); - - if (requiredIdOrNodeIdFields.isEmpty()) { - var possibleFixes = new ArrayList<>(idFields.stream().map(GenerationSourceField::formatPath).map(it -> "Make " + it + " non-nullable.").toList()); - if (schema.getNodeTypesWithTable(targetTable).size() == 1) { - possibleFixes.add(String.format("Add non-nullable node ID input field for type '%s'.", - schema.getNodeTypesWithTable(targetTable).stream().findFirst().orElseThrow().getName()) - ); - } - - var keys = getPrimaryAndUniqueKeysForTable(targetTable.getName()); - var nonNullableInputFields = inputType.getFields().stream() - .filter(AbstractField::isNonNullable) - .toList(); - - for (var key : keys) { - var keyFields = getJavaFieldNamesForKey(targetTable.getName(), key); - var keyFieldToInputFieldMatches = keyFields.stream() - .collect(Collectors.toMap( - kf -> kf, - kf -> nonNullableInputFields.stream() - .filter(f -> f.getUpperCaseName().equalsIgnoreCase(kf)) - .toList() - )); - - if (keyFieldToInputFieldMatches.entrySet().stream().anyMatch(e -> e.getValue().isEmpty())) { - possibleFixes.add(String.format("Add non-nullable input fields for %s to match PK/UK '%s'.", - String.join(", ", keyFieldToInputFieldMatches.entrySet().stream().filter(it -> it.getValue().isEmpty()).map(Map.Entry::getKey).toList()), - key.getName()) - ); - } else { - return; - } - } - - addErrorMessage("Mutation field %s is a generated delete mutation, but does not have input with non-nullable fields corresponding to a PK/UK of the table. %s%s", - field.formatPath(), - !possibleFixes.isEmpty() ? "\nPossible fix(es):\n* " : "", - String.join("\n* ", possibleFixes) - ); - } - } - - private Set<GenerationField> findSubqueryReferenceFieldsForTableObject(GenerationField target, JOOQMapping targetTable, int recursion) { - recursionCheck(recursion); - - if (target.hasFieldReferences() || isNodeIdReferenceField(target, schema, targetTable)) { - return Set.of(target); - } - - var result = new HashSet<GenerationField>(); - - if (schema.isRecordType(target)) { - var recordType = schema.getRecordType(target); - - // Implicit reference - if (recordType.hasTable() && !recordType.getTable().equals(targetTable)) { - return Set.of(target); - } - - recordType.getFields() - .stream() - .filter(GenerationTarget::isGenerated) - .filter(it -> !it.createsDataFetcher()) - .forEach(f -> { - if (f.hasFieldReferences()) { - result.add(f); - } else { - result.addAll(findSubqueryReferenceFieldsForTableObject(f, targetTable, recursion + 1)); - } - }); - } - return result; - } - - // Check input and payload("output") fields - private void checkMutationIOFields(InputField inputField, ObjectField objectField) { - if(!schema.isObject(objectField)) - return; - - var objectFieldErrors = new InputParser(objectField, schema).getAllErrors(); - var payloadContainsIterableField = objectField.isIterableWrapped() || - schema.getObject(objectField) - .getFields() - .stream() - .filter(field -> !objectFieldErrors.contains(field)) - .anyMatch(AbstractField::isIterableWrapped); - - if (!inputField.isIterableWrapped() && payloadContainsIterableField) { - addWarningMessage( - "Mutation %s with Input %s is not defined as a list while Payload type %s contains " + - "a list", - objectField.getName(), inputField.getTypeName(), objectField.getTypeName()); - } else if (inputField.isIterableWrapped() && !payloadContainsIterableField) { - addWarningMessage( - "Mutation %s with Input %s is defined as a list while Payload type %s does not " + - "contain a list", - objectField.getName(), inputField.getTypeName(), objectField.getTypeName()); - } - } - - private void checkRequiredFields(InputField recordInput) { - var inputObject = schema.getInputType(recordInput); - var tableName = inputObject.getTable().getMappingName(); - - var requiredDBFields = getRequiredFields(tableName) - .stream() - .map(String::toUpperCase) - .filter(it -> !tableFieldHasDefaultValue(tableName, it)) - .collect(Collectors.toList()); - var recordFieldNames = - inputObject.getFields() - .stream() - .map(InputField::getUpperCaseName) - .collect(Collectors.toSet()); - checkRequiredFieldsExist(MISSING_FIELD, recordFieldNames, requiredDBFields, recordInput); - - var requiredRecordFieldNames = - inputObject.getFields() - .stream() - .filter(AbstractField::isNonNullable) - .map(InputField::getUpperCaseName) - .collect(Collectors.toSet()); - checkRequiredFieldsExist(MISSING_NON_NULLABLE, requiredRecordFieldNames, requiredDBFields, recordInput); - } - - private void checkRequiredFieldsExist(InputTableError message, Set<String> actualFields, List<String> requiredFields, InputField recordInput) { - if (!actualFields.containsAll(requiredFields)) { - var missingFields = requiredFields.stream().filter(it -> !actualFields.contains(it)).collect(Collectors.joining(", ")); - addWarningMessage( - message, - recordInput.getTypeName(), - schema.getInputType(recordInput).getTable().getMappingName(), - missingFields - ); - } - } - -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/NodeValidator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/NodeValidator.java deleted file mode 100644 index 08e6113719..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/NodeValidator.java +++ /dev/null @@ -1,353 +0,0 @@ -package no.sikt.graphitron.validation; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.definitions.fields.ArgumentField; -import no.sikt.graphitron.definitions.fields.GenerationSourceField; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.fields.containedtypes.MutationType; -import no.sikt.graphitron.definitions.interfaces.FieldSpecification; -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.definitions.interfaces.RecordObjectSpecification; -import no.sikt.graphitron.definitions.mapping.JOOQMapping; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.definitions.objects.RecordObjectDefinition; -import no.sikt.graphitron.generators.context.InputParser; -import no.sikt.graphitron.mappings.TableReflection; -import no.sikt.graphql.directives.GenerationDirectiveParam; -import no.sikt.graphql.schema.ProcessedSchema; -import org.jooq.Key; - -import java.util.*; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static no.sikt.graphitron.generators.context.NodeIdReferenceHelpers.findForeignKeyForNodeIdField; -import static no.sikt.graphitron.generators.context.NodeIdReferenceHelpers.isNodeIdReferenceField; -import static no.sikt.graphitron.mappings.JavaPoetClassName.STRING; -import static no.sikt.graphitron.mappings.ReflectionHelpers.getJooqRecordClassForNodeIdInputField; -import static no.sikt.graphitron.mappings.TableReflection.*; -import static no.sikt.graphitron.validation.ValidationHandler.addErrorMessage; -import static no.sikt.graphql.directives.GenerationDirective.*; -import static no.sikt.graphql.directives.GenerationDirectiveParam.TYPE_ID; -import static no.sikt.graphql.naming.GraphQLReservedName.NODE_TYPE; -import static org.apache.commons.lang3.StringUtils.capitalize; -import static org.apache.commons.lang3.StringUtils.uncapitalize; - -/** - * Validates @node and @nodeId directives, node ID references in jOOQ and Java record inputs. - */ -class NodeValidator extends AbstractSchemaValidator { - - NodeValidator(ProcessedSchema schema, List<ObjectField> allFields) { - super(schema, allFields); - } - - @Override - void validate() { - validateNodeDirective(); - validateTypesUsingNodeInterfaceWithoutNodeDirective(); - validateNodeId(); - validateNodeIdReferenceInJooqRecordInput(); - validateNodeIdFieldsInJavaRecordInputs(); - } - - private void validateNodeDirective() { - var typeIdMap = new HashMap<String, Set<String>>(); - schema.getObjects().values().stream() - .filter(ObjectDefinition::hasNodeDirective) - .forEach(objectDefinition -> { - var nodeConfiguration = objectDefinition.getNodeConfiguration() - .orElseThrow(() -> new IllegalStateException(String.format( "Node type '%s' is unexpectedly missing node configuration.", objectDefinition.getName()))); - - if (objectDefinition.getTable() == null) { - addErrorMessage("Type %s has the %s directive, but is missing the %s directive.", - objectDefinition.getName(), NODE.getName(), TABLE.getName()); - } else { - if (!objectDefinition.getTable().equals(nodeConfiguration.targetTable())) { - throw new IllegalStateException(String.format( - "Unexpected mismatch between node configuration table and object table for '%s'. Please report if you have encountered this issue.", - objectDefinition.getName()) - ); - } - - var tableFields = getJavaFieldNamesForTable(nodeConfiguration.targetTable().getName()); - nodeConfiguration.keyColumnsJavaNames().stream() - .filter(col -> tableFields.stream().noneMatch(it -> it.equalsIgnoreCase(col))) - .forEach(col -> addErrorMessage( - "Key column '%s' in node ID for type '%s' does not exist in table '%s'", - col, - objectDefinition.getName(), - nodeConfiguration.targetTable().getName()) - ); - - if (getPrimaryOrUniqueKeyMatchingFields(nodeConfiguration.targetTable().getName(), nodeConfiguration.keyColumnsJavaNames()).isEmpty()) { - addErrorMessage( - "Key columns in node ID for type '%s' does not match a PK/UK for table '%s'", - objectDefinition.getName(), - nodeConfiguration.targetTable().getName()); - } - } - if (!objectDefinition.implementsInterface(NODE_TYPE.getName())) { - addErrorMessage("Type %s has the %s directive, but does not implement the %s interface.", - objectDefinition.getName(), NODE.getName(), NODE_TYPE.getName()); - } - if (GeneratorConfig.requireTypeIdOnNode() && !nodeConfiguration.hasCustomTypeId()) { - addErrorMessage("Type '%s' has the '%s' directive, but is missing the '%s' parameter which has been configured to be required.", - objectDefinition.getName(), NODE.getName(), TYPE_ID.getName()); - } - typeIdMap.computeIfAbsent(nodeConfiguration.typeId(), k -> new HashSet<>()) - .add(objectDefinition.getName()); - }); - - typeIdMap.entrySet().stream() - .filter(it -> it.getValue().size() > 1) - .forEach((entry) -> - addErrorMessage( - "Multiple node types (%s) have the same node type ID '%s'. Type IDs must be unique.", - String.join(", ", entry.getValue()), - entry.getKey()) - ); - } - - private void validateNodeId() { - Stream<? extends GenerationSourceField<?>> inputStream = - Stream.concat( - schema.getInputTypes().values().stream().flatMap(it -> it.getFields().stream()), - allFields.stream().flatMap(it -> it.getNonReservedArguments().stream()) - ); - Stream.concat(allFields.stream(), inputStream) - .filter(GenerationSourceField::hasNodeID) - .forEach(this::checkNodeId); - } - - private void checkNodeId(GenerationField field) { - var fieldName = field instanceof ArgumentField - ? String.format("argument '%s' on a field in type '%s'", field.getName(), field.getContainerTypeName()) - : String.format("field %s", field.formatPath()); - - if (!(field.isID() || field.getTypeName().equals(STRING.className.simpleName()))) { - addErrorMessage( - "%s has %s directive, but is not an ID or String field.", - capitalize(fieldName), - NODE_ID.getName() - ); - } - - if (field.getNodeIdTypeName().isPresent()) { - var providedType = schema.getObject(field.getNodeIdTypeName().get()); - if (providedType == null) { - addErrorMessage( - "Type with name '%s' referenced in the %s directive for %s does not exist.", - field.getNodeIdTypeName().get(), - NODE_ID.getName(), - fieldName - ); - return; - } else if (!providedType.hasNodeDirective()) { - addErrorMessage( - "Referenced type '%s' referenced in the %s directive for %s is missing the necessary %s directive.", - providedType.getName(), - NODE_ID.getName(), - fieldName, - NODE.getName() - ); - return; - } - } else if (schema.getNodeTypeForNodeIdField(field).isEmpty()) { // Implicit nodeType - addErrorMessage("Cannot automatically deduce node type for node ID field %s. " + - "Please specify the node type with the %s parameter in the %s directive.", - field.formatPath(), - GenerationDirectiveParam.TYPE_NAME.getName(), - NODE_ID.getName() - ); - return; - } - - if (field instanceof ObjectField && isNodeIdReferenceField((ObjectField) field, schema)) { - // Only filter object fields because we currently don't have reference validation on input (GGG-209) - var recordType = Optional - .ofNullable(schema.getRecordType(field.getContainerTypeName())) - .flatMap(it -> Optional.ofNullable(it.getTable())); - - var referenceTable = schema.getNodeTypeForNodeIdFieldOrThrow(field) - .getTable(); - recordType.ifPresent(it -> validateReferencePath(field, it.getMappingName(), referenceTable.getMappingName())); - if (recordType.isEmpty()) { - var inputMapping = schema.findInputTables(field).stream().findFirst(); - if (inputMapping.isPresent() && !inputMapping.get().equals(referenceTable)) { - validateReferencePath(field, inputMapping.get().getMappingName(), referenceTable.getMappingName()); - } - } - } - - if (field.hasFieldDirective()) { - // Allow @nodeId + @field only in @record input types targeting jOOQ record fields - boolean isAllowed = getJooqRecordClassForNodeIdInputField(field, schema).isPresent(); - - if (!isAllowed) { - addErrorMessage( - "%s has both the '%s' and '%s' directives, which is only supported for node ID fields in Java Record inputs.", - capitalize(fieldName), - NODE_ID.getName(), - FIELD.getName() - ); - } - } - if (field.isExternalField()) { - addErrorMessage( - "%s has both the '%s' and '%s' directives, which is not supported.", - capitalize(fieldName), - NODE_ID.getName(), - EXTERNAL_FIELD.getName() - ); - } - } - - private void validateNodeIdReferenceInJooqRecordInput() { - schema.getInputTypes() - .values() - .stream() - .filter(it -> schema.isRecordType(it.getName())) - .map(it -> schema.getRecordType(it.getName())) - .filter(it -> it.getFields().stream().anyMatch(FieldSpecification::hasNodeID)) - .filter(it -> it.hasTable() && getTableByJavaFieldName(it.getTable().getName()).isPresent()) - .forEach(jooqRecordInput -> - jooqRecordInput.getFields() - .stream() - .filter(schema::isNodeIdField) - .filter(it -> schema.getNodeTypeForNodeIdField(it).isPresent()) - .filter(it -> !schema.getNodeTypeForNodeIdFieldOrThrow(it).getTable().equals(jooqRecordInput.getTable())) - .forEach(it -> { - validateNodeIdReferenceInRecord(jooqRecordInput.getTable().getName(), it, true, jooqRecordInput.getTable()); - findForeignKeyForNodeIdField(it, schema, jooqRecordInput.getTable()).ifPresent(foreignKey -> { - if (isUsedInUpdateMutation(jooqRecordInput)) { - getPrimaryKeyForTable(jooqRecordInput.getTable().getName()) - .map(Key::getFields) - .filter(pkFields -> pkFields.stream().anyMatch(pkF -> foreignKey.getFields().stream().anyMatch(pkF::equals))) - .stream().findFirst() - .ifPresent((a) -> addErrorMessage( - "Foreign key used for node ID field '%s' in jOOQ record input '%s' overlaps with the primary key of the jOOQ record table. This is not supported for update/upsert mutations.", - it.getName(), - it.getContainerTypeName() - )); - } - }); - }) - ); - } - - private void validateNodeIdReferenceInRecord(String jooqRecordName, GenerationField field, boolean isJooqRecordInput, JOOQMapping currentTable) { - var inputKind = isJooqRecordInput ? "jOOQ record input" : "Java record input"; - - var foreignKeyOptional = findForeignKeyForNodeIdField(field, schema, currentTable); - if (foreignKeyOptional.isEmpty()) { - addErrorMessage("Cannot find foreign key for node ID field '%s' in %s '%s'.", - field.getName(), - inputKind, - field.getContainerTypeName()); - return; - } - - var foreignKey = foreignKeyOptional.get(); - - if (!foreignKey.getTable().getName().equalsIgnoreCase(jooqRecordName)) { - addErrorMessage( - "Node ID field '%s' in %s '%s' references a table with an inverse key which is not supported.", - field.getName(), - inputKind, - field.getContainerTypeName() - ); - return; - } - - var nodeType = schema.getNodeTypeForNodeIdFieldOrThrow(field); - var nodeConfig = schema.getNodeConfigurationForNodeIdFieldOrThrow(field); - var firstForeignKeyReferencesTargetTable = getTableJavaFieldNameByTableName(foreignKey.getInverseKey().getTable().getName()) - .orElseThrow() - .equalsIgnoreCase(nodeConfig.targetTable().getName()); - - if (field.getFieldReferences().size() > 1 || (field.hasFieldReferences() && !firstForeignKeyReferencesTargetTable)) { - addErrorMessage( - "Node ID field '%s' in %s '%s' has a reference via table(s) which is not supported on %ss.", - field.getName(), - inputKind, - field.getContainerTypeName(), - inputKind - ); - return; - } - - var targetKey = getPrimaryOrUniqueKeyMatchingFields(nodeConfig.targetTable().getName(), nodeConfig.keyColumnsJavaNames()); - - if (targetKey.isPresent() && !targetKey.get().equals(foreignKey.getKey())) { - addErrorMessage( - "Node ID field '%s' in %s '%s' uses foreign key '%s' which does not reference the same primary/unique key used for type '%s's node ID. This is not supported.", - field.getName(), - inputKind, - field.getContainerTypeName(), - foreignKey.getName(), - nodeType.getName() - ); - } - } - - private boolean isUsedInUpdateMutation(RecordObjectSpecification<?> jooqRecordInput) { - var mutation = schema.getMutationType(); - if (mutation == null) { - return false; - } - - var usages = mutation.getFields().stream() - .filter(ObjectField::hasMutationType) - .flatMap(objectField -> { - var inputs = new InputParser(objectField, schema).getJOOQRecords().values(); - return inputs.stream() - .map(schema::getInputType) - .filter(it -> it != null && it.getName().equals(jooqRecordInput.getName())) - .map(it -> objectField.getMutationType()); - }).collect(Collectors.toSet()); - - if (usages.isEmpty()) { - return false; - } - return usages.stream().anyMatch(mt -> mt == MutationType.UPDATE || mt == MutationType.UPSERT); - } - - private void validateNodeIdFieldsInJavaRecordInputs() { - schema.getInputTypes().values().stream() - .filter(RecordObjectDefinition::hasJavaRecordReference) - .flatMap(it -> it.getFields().stream()) - .filter(GenerationSourceField::hasNodeID) - .filter(it -> schema.getNodeTypeForNodeIdField(it).isPresent()) - .forEach(it -> getJooqRecordClassForNodeIdInputField(it, schema) - .filter(recordClass -> !schema.getNodeTypeForNodeIdFieldOrThrow(it).getTable().getRecordClass().equals(recordClass)) - .ifPresent(recordClass -> validateNodeIdReferenceInRecord( - TableReflection.getTableJavaFieldNameForRecordClass(recordClass).orElseThrow(), - it, false, JOOQMapping.fromTable(getTableName(recordClass))))); - } - - private void validateTypesUsingNodeInterfaceWithoutNodeDirective() { - if (!schema.nodeExists() || - schema.getQueryType() == null || - schema.getQueryType().getFieldByName(uncapitalize(NODE_TYPE.getName())) == null || - schema.getQueryType().getFieldByName(uncapitalize(NODE_TYPE.getName())).isExplicitlyNotGenerated()) { - return; - } - - var records = schema - .getObjects() - .values() - .stream() - .filter(it -> it.implementsInterface(NODE_TYPE.getName()) && it.hasTable() && !it.hasNodeDirective()) - .collect(Collectors.groupingBy( - it -> it.getTable().getName(), Collectors.mapping(ObjectDefinition::getName, Collectors.toSet()))); - - records.forEach((tableName, schemaTypes) -> { - if (schemaTypes.size() > 1) { - addErrorMessage( - "Multiple types (%s) implement the %s interface and refer to the same table %s. This is not supported.", - String.join(", ", schemaTypes), NODE_TYPE.getName(), tableName); - } - }); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/PaginationValidator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/PaginationValidator.java deleted file mode 100644 index 1655fedac2..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/PaginationValidator.java +++ /dev/null @@ -1,161 +0,0 @@ -package no.sikt.graphitron.validation; - -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.objects.EnumDefinition; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.List; -import java.util.Optional; - -import static no.sikt.graphitron.mappings.TableReflection.tableHasPrimaryKey; -import static no.sikt.graphitron.validation.ValidationHandler.addErrorMessage; -import static no.sikt.graphql.directives.GenerationDirective.*; -import static no.sikt.graphql.naming.GraphQLReservedName.SCHEMA_CONNECTION_SUFFIX; - -/** - * Validates pagination specs, ordering requirements, and @orderBy input types. - */ -class PaginationValidator extends AbstractSchemaValidator { - - PaginationValidator(ProcessedSchema schema, List<ObjectField> allFields) { - super(schema, allFields); - } - - @Override - void validate() { - schema.getObjects().values().forEach(it -> checkPaginationSpecs(it.getFields())); - validatePaginatedFieldsHaveOrdering(); - validateOrderByInputTypes(); - validateDefaultOrderNotOnInterfaceOrUnion(); - } - - private static void checkPaginationSpecs(List<ObjectField> fields) { - for (var field : fields) { - var hasConnectionSuffix = field.getTypeName().endsWith(SCHEMA_CONNECTION_SUFFIX.getName()); - if (hasConnectionSuffix && !field.hasRequiredPaginationFields()) { - addErrorMessage( - "Type %s ending with the reserved suffix 'Connection' must have either " + - "forward(first and after fields) or backwards(last and before fields) pagination, " + - "yet neither was found.", field.getTypeName() - ); - } - } - } - - /** - * Validates that paginated fields on tables without primary keys have stable ordering. - * Without ordering, cursor-based pagination produces unstable results. - * <p> - * For tables without primary keys, we need one of: - * - @defaultOrder directive (provides fallback ordering) - * - non-nullable @orderBy (user must always provide ordering) - * - both @orderBy and @defaultOrder (nullable orderBy with fallback) - */ - private void validatePaginatedFieldsHaveOrdering() { - allFields.stream() - .filter(ObjectField::hasForwardPagination) - .filter(ObjectField::isGenerated) - .filter(field -> { - var recordType = schema.getRecordType(field); - return recordType != null && recordType.hasTable(); - }) - .forEach(field -> { - var recordType = schema.getRecordType(field); - var tableName = recordType.getTable().getMappingName(); - if (!tableHasPrimaryKey(tableName)) { - var hasDefaultOrder = field.getDefaultOrder().isPresent(); - var orderByField = field.getOrderField(); - var hasNonNullableOrderBy = orderByField.isPresent() && orderByField.get().isNonNullable(); - - if (!hasDefaultOrder && !hasNonNullableOrderBy) { - if (orderByField.isPresent()) { - // Has nullable @orderBy but no @defaultOrder - addErrorMessage( - "Paginated field '%s' in type '%s' has nullable @%s but no @%s directive. " + - "Table '%s' has no primary key, so either make the orderBy argument non-nullable (orderBy: ...!) " + - "or add @%s to provide fallback ordering when orderBy is not provided.", - field.getName(), - field.getContainerTypeName(), - ORDER_BY.getName(), - DEFAULT_ORDER.getName(), - tableName, - DEFAULT_ORDER.getName() - ); - } else { - // No @orderBy and no @defaultOrder - addErrorMessage( - "Paginated field '%s' in type '%s' requires @%s or @%s directive. " + - "Table '%s' has no primary key, so without ordering, cursor-based pagination produces unstable results.", - field.getName(), - field.getContainerTypeName(), - DEFAULT_ORDER.getName(), - ORDER_BY.getName(), - tableName - ); - } - } - } - }); - } - - /** - * Validates that @defaultOrder directive is not used on fields returning interface or union types. - * This feature is not yet supported for interface/union queries. - */ - private void validateDefaultOrderNotOnInterfaceOrUnion() { - allFields.stream() - .filter(field -> field.getDefaultOrder().isPresent()) - .filter(field -> schema.isInterface(field) || schema.isUnion(field)) - .forEach(field -> addErrorMessage( - "@%s directive on field '%s' in type '%s' is not supported because the field returns %s type '%s'. " + - "@%s is not yet supported for interface or union queries.", - DEFAULT_ORDER.getName(), - field.getName(), - field.getContainerTypeName(), - schema.isInterface(field) ? "interface" : "union", - field.getTypeName(), - DEFAULT_ORDER.getName() - )); - } - - /** - * Validates that all @orderBy input types have the required structure: - * one enum field with @order/@index directives (the sort field) and one direction enum (ASC/DESC). - */ - private void validateOrderByInputTypes() { - allFields.stream() - .map(ObjectField::getOrderField) - .flatMap(Optional::stream) - .forEach(orderField -> { - var inputType = schema.getInputType(orderField); - if (inputType == null) { - addErrorMessage("Input type '%s' not found in schema", orderField.getTypeName()); - return; - } - var enums = inputType.getFields().stream() - .filter(schema::isEnum) - .map(schema::getEnum) - .toList(); - var orderByCount = enums.stream().filter(EnumDefinition::isOrderByEnum).count(); - var directionCount = enums.stream().filter(EnumDefinition::isDirectionEnum).count(); - if (orderByCount != 1) { - addErrorMessage( - "Expected exactly one orderBy enum field on type '%s', but found %d. The @%s input type must contain exactly one enum field whose values have @%s directives.", - orderField.getTypeName(), orderByCount, ORDER_BY.getName(), ORDER.getName()); - } - if (directionCount != 1) { - addErrorMessage( - "Expected exactly one direction enum field on type '%s', but found %d. The @%s input type must contain exactly one direction enum field (e.g., with ASC/DESC values).", - orderField.getTypeName(), directionCount, ORDER_BY.getName()); - } - // Validate that all orderBy enum fields have @order or @index - enums.stream() - .filter(EnumDefinition::isOrderByEnum) - .forEach(e -> e.getObjectDefinition().getEnumValueDefinitions().stream() - .filter(v -> !v.hasDirective(ORDER.getName()) && !v.hasDirective(INDEX.getName())) - .forEach(v -> addErrorMessage( - "Enum field '%s' of '%s' has no valid @%s directive", - v.getName(), e.getName(), ORDER.getName()))); - }); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/ProcedureCallValidator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/ProcedureCallValidator.java deleted file mode 100644 index f0bcbb15e5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/ProcedureCallValidator.java +++ /dev/null @@ -1,254 +0,0 @@ -package no.sikt.graphitron.validation; - -import no.sikt.graphitron.definitions.fields.AbstractField; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.helpers.ProcedureCall; -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.javapoet.ClassName; -import no.sikt.graphitron.javapoet.TypeName; -import no.sikt.graphitron.mappings.RoutineReflection; -import no.sikt.graphql.directives.GenerationDirective; -import no.sikt.graphql.schema.ProcessedSchema; -import org.jooq.Parameter; - -import java.util.*; -import java.util.function.Function; -import java.util.stream.Collectors; - -import static no.sikt.graphitron.mappings.TableReflection.getJavaFieldName; -import static no.sikt.graphitron.validation.ValidationHandler.addErrorMessage; -import static no.sikt.graphitron.validation.messages.ProcedureCallError.*; -import static no.sikt.graphql.directives.GenerationDirective.*; - -/** - * Validates usage of the {@code @experimental_procedureCall} directive. - * <p> - * The directive has two modes, distinguished by the presence of the {@code target} parameter. - * If it is set, the input is GraphQL arguments, else it is jOOQ columns. - */ -class ProcedureCallValidator extends AbstractSchemaValidator { - private final static Map<GenerationDirective, Function<GenerationField, Boolean>> ILLEGAL_COMBINATIONS = new LinkedHashMap<>( - Map.of( - FIELD, GenerationField::hasFieldDirective, - EXTERNAL_FIELD, GenerationField::isExternalField, - REFERENCE, (it) -> !it.getFieldReferences().isEmpty() - ) - ); - - ProcedureCallValidator(ProcessedSchema schema, List<ObjectField> allFields) { - super(schema, allFields); - } - - @Override - void validate() { - schema - .getObjects() - .values() - .forEach( - it -> it - .getFields() - .stream() - .filter(ObjectField::hasProcedureCall) - .forEach(field -> validateProcedureCallField(field, it)) - ); - - schema - .getInterfaces() - .values() - .forEach( - it -> it - .getFields() - .stream() - .filter(ObjectField::hasProcedureCall) - .forEach(field -> addErrorMessage(ON_INTERFACE_DECLARATION, field.formatPath(), it.getName())) - ); - } - - private void validateProcedureCallField(ObjectField field, ObjectDefinition object) { - var fieldPath = field.formatPath(); - ILLEGAL_COMBINATIONS - .entrySet() - .stream() - .filter(it -> it.getValue().apply(field)) - .forEach(it -> directiveCombinationError(fieldPath, it.getKey())); - - var call = field.getProcedureCall(); - if (call.hasTarget()) { - validateTarget(field, call); - } else { - validateInline(field, object, call); - } - } - - private void validateInline(ObjectField field, ObjectDefinition object, ProcedureCall call) { - var fieldPath = field.formatPath(); - if (object.isOperationRoot()) { - addErrorMessage(ON_ROOT_OPERATION, fieldPath, object.getName()); - } - - if (requireTable(field, object)) { - checkInputs(field, call, schema.getPreviousTableObjectForObject(object).getTable().getMappingName()); - } - - if (!schema.isScalar(field.getTypeName())) { - addErrorMessage(ON_NON_SCALAR_FIELD_TYPE, fieldPath, field.getTypeName()); - } - - validateRoutine(fieldPath, call, field.getTypeClass(), field.getTypeName()); - } - - private void validateTarget(ObjectField field, ProcedureCall call) { - var targetName = call.targetField(); - - if (!field.createsDataFetcher() && !field.isRootField()) { - addErrorMessage(TARGET_MODE_REQUIRES_DATA_FETCHER, field.formatPath(), targetName); - return; - } - - if (!schema.isObject(field)) { - addErrorMessage(TARGET_MODE_REQUIRES_OBJECT_RETURN_TYPE, field.formatPath(), targetName, field.getTypeName()); - return; - } - - var returnTypeObject = schema.getObject(field); - requireTable(field, returnTypeObject); - - checkInputs(field, call, null); - - var fieldPath = field.formatPath(); - var targetField = returnTypeObject.getFieldByName(targetName); - var returnName = returnTypeObject.getName(); - if (targetField == null) { - addErrorMessage(UNKNOWN_TARGET_FIELD, fieldPath, targetName, returnName); - return; - } - - ILLEGAL_COMBINATIONS - .entrySet() - .stream() - .filter(it -> it.getValue().apply(targetField)) - .forEach(it -> targetDirectiveCombinationError(fieldPath, targetName, returnName, it.getKey())); - if (targetField.hasProcedureCall()) { - targetDirectiveCombinationError(fieldPath, targetName, returnName, PROCEDURE_CALL); - } - - if (!schema.isScalar(targetField.getTypeName())) { - addErrorMessage(TARGET_FIELD_NOT_SCALAR, fieldPath, targetName, returnName, targetField.getTypeName()); - } - - validateRoutine(fieldPath, call, targetField.getTypeClass(), targetField.getTypeName()); - } - - private static void checkInputs(ObjectField field, ProcedureCall call, String tableJavaName) { - var isTarget = call.hasTarget(); - var message = isTarget - ? "no such GraphQL argument on field '" + field.getName() + "'" - : "no such column on table '" + tableJavaName + "'"; - var argNames = !isTarget ? Set.of() : field - .getArguments() - .stream() - .map(AbstractField::getName) - .collect(Collectors.toSet()); - call - .argumentMap() - .entrySet() - .stream() - .filter(entry -> isTarget ? !argNames.contains(entry.getValue()) : getJavaFieldName(tableJavaName, entry.getValue()).isEmpty()) - .forEach(entry -> addErrorMessage( - ARGUMENT_NOT_FOUND, - field.formatPath(), - entry.getKey(), - entry.getValue(), - message - )); - } - - private void validateRoutine(String fieldPath, ProcedureCall call, TypeName expectedFieldType, String expectedFieldTypeName) { - var procedureName = call.procedureName(); - - var matches = RoutineReflection.resolveRoutine(procedureName); - if (matches.size() > 1) { - var candidateSchemas = matches.stream().map(RoutineReflection::schemaFromProcedure).sorted().collect(Collectors.joining(", ")); - addErrorMessage(AMBIGUOUS_ROUTINE, fieldPath, procedureName, candidateSchemas); - return; - } - if (matches.isEmpty()) { - addErrorMessage(UNKNOWN_ROUTINE, fieldPath, procedureName); - return; - } - var resolvedRoutineName = matches.get(0); - - var isFunction = RoutineReflection.isFunction(resolvedRoutineName); - var outParams = RoutineReflection.getOutParameters(resolvedRoutineName); - if (!isFunction || !outParams.isEmpty()) { - addErrorMessage(NOT_A_FUNCTION, fieldPath, procedureName); - return; - } - - var paramNames = RoutineReflection - .getInParameters(resolvedRoutineName) - .stream() - .map(Parameter::getName) - .collect(Collectors.toCollection(LinkedHashSet::new)); - - var argumentMap = call.argumentMap(); - var invalidArguments = argumentMap - .keySet() - .stream() - .filter(it -> !paramNames.contains(it)) - .toList(); - if (!invalidArguments.isEmpty()) { - var joinedParams = String.join(", ", paramNames); - invalidArguments.forEach(it -> addErrorMessage(UNKNOWN_PARAMETER, fieldPath, it, procedureName, joinedParams)); - } - paramNames - .stream() - .filter(it -> !argumentMap.containsKey(it)) - .forEach(it -> addErrorMessage(MISSING_PARAMETER, fieldPath, it, procedureName)); - - var returnTypeOptional = RoutineReflection.getReturnType(resolvedRoutineName); - if (returnTypeOptional.isEmpty()) { - return; - } - - var returnType = returnTypeOptional.get(); - if (!isCompatibleReturnType(expectedFieldType, returnType)) { - addErrorMessage( - RETURN_TYPE_MISMATCH, - fieldPath, - procedureName, - returnType.getName(), - expectedFieldTypeName, - expectedFieldType.toString() - ); - } - } - - private static void targetDirectiveCombinationError(String fieldPath, String targetName, String returnName, GenerationDirective illegal) { - addErrorMessage(TARGET_FIELD_HAS_ILLEGAL_DIRECTIVE, fieldPath, targetName, returnName, illegal.getName()); - } - - private static void directiveCombinationError(String fieldPath, GenerationDirective illegal) { - addErrorMessage(ILLEGAL_COMBINATION, fieldPath, illegal.getName()); - } - - private boolean requireTable(ObjectField field, ObjectDefinition object) { - if (schema.hasTableObjectForObject(object)) { - return true; - } - - addErrorMessage(MISSING_TABLE, field.formatPath()); - return false; - } - - /** - * The jOOQ-returned Java type must match the field's javapoet {@link TypeName} by canonical name. - */ - private static boolean isCompatibleReturnType(TypeName fieldType, Class<?> jooqReturnType) { - if (fieldType == null || jooqReturnType == null) { - return true; // be permissive if we somehow cannot determine - } - return fieldType.equals(ClassName.get(jooqReturnType)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/ProcessedDefinitionsValidator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/ProcessedDefinitionsValidator.java deleted file mode 100644 index e1839837b0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/ProcessedDefinitionsValidator.java +++ /dev/null @@ -1,65 +0,0 @@ -package no.sikt.graphitron.validation; - -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.List; - -import static no.sikt.graphitron.validation.ValidationHandler.logWarnings; -import static no.sikt.graphitron.validation.ValidationHandler.throwIfErrors; - -/** - * Orchestrates schema validation by delegating to focused sub-validators. - * Each sub-validator is responsible for a specific domain of validation. - */ -public class ProcessedDefinitionsValidator { - private final ProcessedSchema schema; - private final List<ObjectField> allFields; - - private final List<AbstractSchemaValidator> validators; - - public ProcessedDefinitionsValidator(ProcessedSchema schema) { - this.schema = schema; - allFields = schema - .getObjects() - .values() - .stream() - .flatMap(it -> it.getFields().stream()) - .toList(); - - validators = List.of( - new InterfaceAndUnionValidator(schema, allFields), - new TableValidator(schema, allFields), - new RecordMappingValidator(schema, allFields), - new ExternalReferenceValidator(schema, allFields), - new ServiceValidator(schema, allFields), - new MutationValidator(schema, allFields), - new FieldDirectiveValidator(schema, allFields), - new InputDirectiveValidator(schema, allFields), - new ProcedureCallValidator(schema, allFields), - new NodeValidator(schema, allFields), - new PaginationValidator(schema, allFields), - new FederationValidator(schema, allFields) - ); - } - - /** - * Validate the directive usage in the schema. - */ - public void validateDirectiveUsage() { - // Validate cycles first to ensure there are no infinite loops later - new CycleValidator(schema, allFields).validate(); - throwIfErrors(); - - validators.forEach(AbstractSchemaValidator::validate); - logWarnings(); - throwIfErrors(); - } - - /** - * Validate field types separately, as this is called conditionally from {@link ProcessedSchema#validate}. - */ - public void validateObjectFieldTypes() { - new FieldTypeValidator(schema, allFields).validate(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/RecordMappingValidator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/RecordMappingValidator.java deleted file mode 100644 index 4c1fbe2ee5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/RecordMappingValidator.java +++ /dev/null @@ -1,166 +0,0 @@ -package no.sikt.graphitron.validation; - -import no.sikt.graphitron.definitions.fields.GenerationSourceField; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.definitions.interfaces.RecordObjectSpecification; -import no.sikt.graphitron.definitions.objects.AbstractObjectDefinition; -import no.sikt.graphitron.definitions.objects.RecordObjectDefinition; -import no.sikt.graphitron.mappings.ReflectionHelpers; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -import static no.sikt.graphitron.validation.ValidationHandler.addErrorMessage; -import static no.sikt.graphql.directives.GenerationDirective.SPLIT_QUERY; -import static org.apache.commons.lang3.StringUtils.uncapitalize; - -/** - * Validates Java record field mappings, split query fields in Java records, - * wrapper types with previous table, and input field structure. - */ -class RecordMappingValidator extends AbstractSchemaValidator { - - RecordMappingValidator(ProcessedSchema schema, List<ObjectField> allFields) { - super(schema, allFields); - } - - @Override - void validate() { - validateSplitQueryFieldsInJavaRecords(); - validateJavaRecordFieldMappings(); - } - - private void validateSplitQueryFieldsInJavaRecords() { - allFields.stream() - .filter(schema::hasJavaRecord) - .map(schema::getObject) - .map(AbstractObjectDefinition::getFields) - .flatMap(Collection::stream) - .filter(GenerationSourceField::createsDataFetcher) - .forEach(field -> { - var errorMessageStart = String.format("%s in a java record has %s directive, but", - field.formatPath(), - SPLIT_QUERY.getName() - ); - - if (!schema.isObject(field) || !schema.getObject(field.getTypeName()).hasTable()) { - addErrorMessage(errorMessageStart + " does not return a type with table. This is not supported."); - } - - if (field.hasForwardPagination()) { - addErrorMessage(errorMessageStart + " is paginated. This is not supported."); - } - }); - } - - /** - * Validates that all fields in types with @record directive can be mapped - * to methods in the referenced Java record class. - * - Input types: validates setter methods (setXxx) - * - Output types: validates getter methods (getXxx) - */ - private void validateJavaRecordFieldMappings() { - schema.getInputTypes().values().stream() - .filter(RecordObjectDefinition::hasJavaRecordReference) - .forEach(type -> validateJavaRecordMethods(type, type.getRecordReference(), true)); - - schema.getRecordTypes().values().stream() - .filter(type -> !schema.isInputType(type.getName())) - .filter(RecordObjectSpecification::hasJavaRecordReference) - .forEach(type -> validateJavaRecordMethods( - (RecordObjectDefinition<?, ?>) type, - type.getRecordReference(), - false)); - } - - private void validateJavaRecordMethods(RecordObjectDefinition<?, ?> type, Class<?> recordClass, boolean isInput) { - if (recordClass == null) return; - - for (var field : type.getFields()) { - if (field.isExplicitlyNotGenerated()) { - continue; - } - - // Flatten nested types without @record/@table - var flattenedType = getFlattenedNestedType(field, isInput); - if (flattenedType.isPresent()) { - validateJavaRecordMethods(flattenedType.get(), recordClass, isInput); - continue; - } - - if (shouldSkipFieldValidation(field, isInput)) { - continue; - } - - validateFieldHasMethod(field, type, recordClass, isInput); - } - } - - private Optional<RecordObjectDefinition<?, ?>> getFlattenedNestedType(GenerationField field, boolean isInput) { - var nested = isInput - ? schema.getInputType(field) - : schema.getObject(field.getTypeName()); - - if (nested != null && !nested.hasJavaRecordReference() && !nested.hasTable() - && !schema.isExceptionOrExceptionUnion(field.getTypeName())) { - return Optional.of(nested); - } - return Optional.empty(); - } - - private boolean shouldSkipFieldValidation(GenerationField field, boolean isInput) { - return isInput - ? schema.isInputType(field) - : !field.createsDataFetcher() && schema.isObject(field); - } - - private void validateFieldHasMethod(GenerationField field, RecordObjectDefinition<?, ?> type, - Class<?> recordClass, boolean isInput) { - if (!(field instanceof GenerationSourceField<?> sourceField)) { - return; - } - - var mapping = sourceField.getJavaRecordMethodMapping(true); - var methodName = isInput ? mapping.asSet() : mapping.asGet(); - - if (ReflectionHelpers.classHasMethod(recordClass, methodName)) { - return; - } - var typeKind = isInput ? "input" : "type"; - var methodType = isInput ? "setter" : "getter"; - var suggestion = findSimilarMethods(recordClass, methodName, isInput); - - var message = suggestion.isEmpty() - ? "Cannot map field '%s' in %s '%s' to %s in Java record '%s'. Expected method: %s" - : "Cannot map field '%s' in %s '%s' to %s in Java record '%s'. Expected method: %s. Did you mean: %s?"; - - if (suggestion.isEmpty()) { - addErrorMessage(message, field.getName(), typeKind, type.getName(), methodType, recordClass.getSimpleName(), methodName); - } else { - addErrorMessage(message, field.getName(), typeKind, type.getName(), methodType, recordClass.getSimpleName(), methodName, suggestion.get()); - } - } - - private Optional<String> findSimilarMethods(Class<?> recordClass, String expectedMethod, boolean isInput) { - var prefix = isInput ? "set" : "get"; - var candidates = Arrays.stream(recordClass.getMethods()) - .map(Method::getName) - .filter(name -> name.startsWith(prefix)); - - var similarMethods = findSimilarStringsWithDistance(expectedMethod, candidates, 12); - if (similarMethods.isEmpty()) { - return Optional.empty(); - } - - var fieldNames = similarMethods.keySet().stream() - .map(methodName -> uncapitalize(methodName.substring(prefix.length()))) - .collect(Collectors.joining(", ")); - return Optional.of(fieldNames); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/ServiceMethodFormatter.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/ServiceMethodFormatter.java deleted file mode 100644 index 69df241cde..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/ServiceMethodFormatter.java +++ /dev/null @@ -1,60 +0,0 @@ -package no.sikt.graphitron.validation; - -import java.lang.reflect.Method; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -/** - * Formats service method signatures and types for use in validation error messages. - */ -class ServiceMethodFormatter { - - /** - * Formats the expected parameter type, e.g. "CustomerRecord" or "List<CustomerRecord>". - */ - static String formatExpectedListableType(Class<?> inputClass, boolean isListed) { - return isListed ? "List<" + inputClass.getSimpleName() + ">" : inputClass.getSimpleName(); - } - - /** - * Formats a list of method overloads as an indented, newline-separated string for error messages. - */ - static String formatOverloads(List<Method> overloads, String methodName) { - if (overloads.isEmpty()) { - return " (no overloads found)"; - } - return overloads.stream() - .map(m -> " " + formatMethodSignature(m, methodName)) - .collect(Collectors.joining("\n")); - } - - /** - * Formats a single method signature, e.g. "methodName(String, List<CustomerRecord>)". - */ - static String formatMethodSignature(Method method, String methodName) { - var params = Arrays.stream(method.getGenericParameterTypes()) - .map(ServiceMethodFormatter::formatTypeName) - .collect(Collectors.joining(", ")); - return methodName + "(" + params + ")"; - } - - /** - * Formats a reflected type as a readable simple name, resolving generic type arguments recursively. - */ - static String formatTypeName(Type type) { - if (type instanceof ParameterizedType pt) { - var raw = ((Class<?>) pt.getRawType()).getSimpleName(); - var args = Arrays.stream(pt.getActualTypeArguments()) - .map(ServiceMethodFormatter::formatTypeName) - .collect(Collectors.joining(", ")); - return raw + "<" + args + ">"; - } - if (type instanceof Class<?> cls) { - return cls.getSimpleName(); - } - return type.getTypeName(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/ServiceValidator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/ServiceValidator.java deleted file mode 100644 index c632d4fe8b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/ServiceValidator.java +++ /dev/null @@ -1,212 +0,0 @@ -package no.sikt.graphitron.validation; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.definitions.fields.GenerationSourceField; -import no.sikt.graphitron.definitions.fields.InputField; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.helpers.CodeReferenceWrapper; -import no.sikt.graphitron.generators.codebuilding.VariablePrefix; -import no.sikt.graphitron.generators.context.InputParser; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.lang.reflect.Method; -import java.lang.reflect.ParameterizedType; -import java.util.List; -import java.util.stream.Stream; - -import static no.sikt.graphitron.configuration.Recursion.recursionCheck; -import static no.sikt.graphitron.validation.ServiceMethodFormatter.formatExpectedListableType; -import static no.sikt.graphitron.validation.ServiceMethodFormatter.formatOverloads; -import static no.sikt.graphitron.validation.ValidationHandler.addErrorMessage; -import static no.sikt.graphql.directives.GenerationDirective.*; - -/** - * Validates service references, service method existence, input types, and parameter type compatibility. - */ -class ServiceValidator extends AbstractSchemaValidator { - - ServiceValidator(ProcessedSchema schema, List<ObjectField> allFields) { - super(schema, allFields); - } - - @Override - void validate() { - var serviceFields = allFields.stream().filter(ObjectField::hasServiceReference).toList(); - validateServiceMethods(serviceFields); - validateServiceInputTypes(serviceFields); - validateServiceMethodParameterTypes(serviceFields); - validateRecursiveRecordInputs(); - } - - private void validateServiceMethods(List<ObjectField> serviceFields) { - serviceFields.stream() - .map(GenerationSourceField::getExternalMethod) - .filter(it -> GeneratorConfig.getExternalReferences().contains(it.getReference())) - .filter(it -> getAllOverloads(it).isEmpty()) - .forEach(it -> addErrorMessage("Service reference with name '%s' does not contain a method named '%s'.", GeneratorConfig.getExternalReferences().getClassFrom(it.getReference()), it.getReference().getMethodName())); - } - - private void validateServiceInputTypes(List<ObjectField> serviceFields) { - serviceFields - .forEach(field -> field.getNonReservedArguments() - .stream() - .filter(schema::isInputType) - .filter(arg -> !schema.hasRecord(arg)) - .forEach(arg -> addErrorMessage( - "Input type '%s' is used as an argument on service field '%s.%s', but has neither the @%s nor the @%s directive. " - + "Input types on @%s operations must have one of these directives.", - arg.getTypeName(), - field.getContainerTypeName(), - field.getName(), - TABLE.getName(), - RECORD.getName(), - SERVICE.getName() - )) - ); - } - - private void validateServiceMethodParameterTypes(List<ObjectField> serviceFields) { - serviceFields.stream() - .filter(field -> field.getNonReservedArguments() - .stream() - .filter(schema::isInputType) - .allMatch(schema::hasRecord)) - .forEach(this::checkServiceParameterTypes); - } - - private void checkServiceParameterTypes(ObjectField field) { - var serviceWrapper = field.getExternalMethod(); - var overloads = getAllOverloads(serviceWrapper); - if (overloads.isEmpty()) { - return; - } - - var parser = new InputParser(field, schema); - var resolverKeyOffset = field.isRootField() ? 0 : 1; - var expectedParamCount = resolverKeyOffset + parser.getMethodInputNames(true, true, true).size(); - - var candidates = overloads.stream() - .filter(m -> m.getParameterTypes().length == expectedParamCount) - .toList(); - - if (candidates.isEmpty()) { - addErrorMessage( - "Service field '%s.%s' maps to %d method parameter(s) but there is no overload of '%s' with that parameter count. Available overloads:\n%s", - field.getContainerTypeName(), - field.getName(), - expectedParamCount, - serviceWrapper.getMethodName(), - formatOverloads(overloads, serviceWrapper.getMethodName()) - ); - return; - } - - var allMethodInputs = parser.getMethodInputNames(false, false, false); - - for (var entry : parser.getRecords().entrySet()) { - var varName = entry.getKey(); - var inputField = entry.getValue(); - - var posInInputs = allMethodInputs.indexOf(VariablePrefix.inputPrefix(varName)); - if (posInInputs < 0) { - continue; - } - var methodParamIndex = resolverKeyOffset + posInInputs; - - var inputDef = schema.getInputType(inputField); - if (inputDef == null || !inputDef.hasRecordReference()) { - continue; - } - var inputClass = inputDef.getRecordReference(); - if (inputClass == null) { - continue; - } - - var inputIsListed = inputField.isIterableWrapped(); - if (candidates.stream().noneMatch(o -> isParameterCompatible(o, methodParamIndex, inputClass, inputIsListed))) { - addErrorMessage( - "Argument '%s' on service field '%s.%s' has input type '%s' which maps to '%s', " - + "but there is no overload of '%s' that accepts this. Available overloads:\n%s", - inputField.getName(), - field.getContainerTypeName(), - field.getName(), - inputField.getTypeName(), - formatExpectedListableType(inputClass, inputIsListed), - serviceWrapper.getMethodName(), - formatOverloads(candidates, serviceWrapper.getMethodName()) - ); - } - } - } - - private boolean isParameterCompatible(Method method, int paramIndex, Class<?> inputClass, boolean inputIsListed) { - var paramTypes = method.getParameterTypes(); - if (paramIndex >= paramTypes.length) { - return false; - } - if (inputIsListed != List.class.isAssignableFrom(paramTypes[paramIndex])) { - return false; - } - var effectiveType = getEffectiveParameterType(method, paramIndex, inputIsListed); - return effectiveType != null && effectiveType.isAssignableFrom(inputClass); - } - - private List<Method> getAllOverloads(CodeReferenceWrapper serviceWrapper) { - return GeneratorConfig.getExternalReferences().getMethodsFrom(serviceWrapper.getReference()); - } - - private Class<?> getEffectiveParameterType(Method method, int paramIndex, boolean isListed) { - var paramTypes = method.getParameterTypes(); - if (paramIndex >= paramTypes.length) { - return null; - } - if (!isListed) { - return paramTypes[paramIndex]; - } - var genericTypes = method.getGenericParameterTypes(); - if (paramIndex < genericTypes.length - && genericTypes[paramIndex] instanceof ParameterizedType pt - && pt.getActualTypeArguments().length > 0 - && pt.getActualTypeArguments()[0] instanceof Class<?> elementType) { - return elementType; - } - return null; - } - - private void validateRecursiveRecordInputs() { - var mutation = schema.getMutationType(); - var mutations = mutation != null ? mutation.getFields().stream() : Stream.<ObjectField>of(); - var query = schema.getQueryType(); - var queries = query != null ? query.getFields().stream() : Stream.<ObjectField>of(); - - Stream - .concat(queries, mutations) - .filter(ObjectField::hasServiceReference) - .flatMap(it -> it.getArguments().stream()) - .filter(schema::isInputType) - .forEach(it -> validateRecursiveRecordInputs(it, false, 0)); - } - - private void validateRecursiveRecordInputs(InputField field, boolean wasRecord, int recursion) { - recursionCheck(recursion); - - var input = schema.getInputType(field); - if (input == null) { - return; - } - - var hasTableOrRecordReference = input.hasTable() || input.hasJavaRecordReference(); - - if (field.isIterableWrapped() && wasRecord && !hasTableOrRecordReference) { - addErrorMessage( - String.format( - "Field %s with Input type %s is iterable, but has no record mapping set. Iterable Input types within records without record mapping can not be mapped to a single field in the surrounding record.", - field.getName(), - input.getName() - ) - ); - } - - input.getFields().forEach(it -> validateRecursiveRecordInputs(it, wasRecord || hasTableOrRecordReference, recursion + 1)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/TableValidator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/TableValidator.java deleted file mode 100644 index 43d1e04b2d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/TableValidator.java +++ /dev/null @@ -1,460 +0,0 @@ -package no.sikt.graphitron.validation; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.definitions.fields.*; -import no.sikt.graphitron.definitions.fields.containedtypes.FieldReference; -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.definitions.interfaces.GenerationTarget; -import no.sikt.graphitron.definitions.interfaces.RecordObjectSpecification; -import no.sikt.graphitron.definitions.mapping.JOOQMapping; -import no.sikt.graphitron.definitions.mapping.TableRelationType; -import no.sikt.graphitron.definitions.objects.AbstractObjectDefinition; -import no.sikt.graphitron.definitions.objects.RecordObjectDefinition; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.*; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static no.sikt.graphitron.configuration.GeneratorConfig.shouldMakeNodeStrategy; -import static no.sikt.graphitron.mappings.TableReflection.*; -import static no.sikt.graphitron.validation.ValidationHandler.*; -import static no.sikt.graphitron.validation.messages.SelfReferenceError.SELF_REFERENCE_WITHOUT_SPLITQUERY; -import static no.sikt.graphitron.validation.messages.SelfReferenceWarning.SELF_REFERENCE_IMPLICITLY_REVERSE; -import static no.sikt.graphql.directives.GenerationDirective.NODE_ID; -import static no.sikt.graphql.directives.GenerationDirective.REFERENCE; -import static no.sikt.graphql.naming.GraphQLReservedName.FEDERATION_ENTITY_UNION; -import static no.sikt.graphql.naming.GraphQLReservedName.FEDERATION_SERVICE_TYPE; - -/** - * Validates table and key existence, reference paths, and required table fields. - */ -class TableValidator extends AbstractSchemaValidator { - - TableValidator(ProcessedSchema schema, List<ObjectField> allFields) { - super(schema, allFields); - } - - @Override - void validate() { - validateTablesAndKeys(); - validateRequiredTableFields(); - validateOneToManyInputReferences(); - validateInputFields(); - validateWrapperTypesWithPreviousTable(); - validateOnlyOneInputRecordInputWhenNoTypeTableIsPresent(); - } - - private void validateTablesAndKeys() { - var recordTypes = schema.getRecordTypes(); - recordTypes - .values() - .stream() - .filter(RecordObjectSpecification::hasTable) - .map(RecordObjectSpecification::getTable) - .map(JOOQMapping::getMappingName) - .filter(it -> !tableExists(it)) - .forEach(it -> addErrorMessage("No table with name \"%s\" found.", it)); - - var allReferences = recordTypes - .values() - .stream() - .flatMap(it -> it.getFields().stream()) - .flatMap(it -> it.isInput() ? Stream.of(it) : Stream.concat(Stream.of(it), ((ObjectField) it).getArguments().stream())) - .flatMap(it -> it.getFieldReferences().stream()) - .toList(); - - allReferences - .stream() - .filter(FieldReference::hasTable) - .map(FieldReference::getTable) - .map(JOOQMapping::getMappingName) - .filter(it -> !tableExists(it)) - .forEach(it -> addErrorMessage("No table with name \"%s\" found.", it)); - - allReferences - .stream() - .filter(FieldReference::hasKey) - .map(FieldReference::getKey) - .map(JOOQMapping::getMappingName) - .filter(it -> !keyExists(it)) - .forEach(it -> addErrorMessage("No key with name \"%s\" found.", it)); - - recordTypes - .values() - .stream() - .filter(schema::hasTableObjectForObject) - .filter(it -> !schema.isMultiTableInterface(it.getName())) - .filter(it -> !it.hasJavaRecordReference()) - .flatMap(it -> it.getFields().stream()) - .flatMap(it -> schema.isMultiTableField(it) - ? schema.getTypesFromInterfaceOrUnion(it.getTypeName()).orElse(List.of()).stream().map(o -> new VirtualSourceField(o.getName(), (ObjectField) it)) - : Stream.of(it)) - .filter(field -> !field.hasServiceReference()) - .filter(field -> schema.isRecordType(field.getTypeName()) || field.hasFieldReferences() || field.createsDataFetcher()) - .forEach(this::validateReferencePathFromField); - } - - private void validateReferencePathFromField(GenerationField field) { - var targetTable = getTargetTableForField(field); - - if (targetTable == null) return; - - var sourceTable = schema.getPreviousTableObjectForObject(schema.getRecordTypes().get(field.getContainerTypeName())).getTable().getName(); - - if (targetTable.equals(sourceTable)) { - validateSelfReference(field); - } - validateReferencePath(field, sourceTable, targetTable); - } - - private void validateSelfReference(GenerationField field) { - if (!field.createsDataFetcher() && field.hasFieldReferences()) { - addErrorMessage(SELF_REFERENCE_WITHOUT_SPLITQUERY.format(field.formatPath())); - } - // Only checks the first reference step. Multi-step self-reference paths are not yet validated. - var firstRef = field.getFieldReferences().stream().findFirst(); - var joinsOnKeyPath = firstRef.isEmpty() || firstRef.get().hasTable() || firstRef.get().hasKey(); - if (field.isIterableWrapped() && joinsOnKeyPath) { - addWarningMessage(SELF_REFERENCE_IMPLICITLY_REVERSE.format(field.formatPath())); - } - } - - /** - * Returns target table for field determined by target type's table, nodeId directive or 'table' in last item provided in reference directive. - * Does not find target table from key only. - * @return Name of the target table - */ - private String getTargetTableForField(GenerationField field) { - if (schema.isNodeIdField(field)) { - return schema.getNodeTypeForNodeIdFieldOrThrow(field).getTable().getName(); - } - if (schema.hasTableObject(field)) { - return schema.getObjectOrConnectionNode(field).getTable().getName(); - } - - if (schema.isScalar(field)) { - if (!field.hasFieldReferences()) { - return null; - } - var references = field.getFieldReferences(); - - return Optional.ofNullable(references.get(references.size() - 1)) - .filter(FieldReference::hasTable) - .map(it -> it.getTable().getName()).orElse(null); - } - return null; - } - - /** - * Walk a reference path from a source table and return the final resolved table name. - * Returns empty if the path contains a condition-only element (no table metadata available). - */ - private static Optional<String> resolveReferenceTargetTable(List<FieldReference> references, String sourceTable) { - var currentTable = sourceTable; - for (FieldReference ref : references) { - if (ref.hasKey()) { - var resolved = resolveKeyOtherTable(ref.getKey().getName(), currentTable); - if (resolved.isEmpty()) return Optional.empty(); - currentTable = resolved.get(); - } else if (ref.hasTable()) { - currentTable = ref.getTable().getMappingName(); - } else { - return Optional.empty(); - } - } - return Optional.of(currentTable); - } - - private void validateRequiredTableFields() { - // Validate objects with table - schema.getObjects().values().stream() - .filter(RecordObjectDefinition::hasTable) - .toList() - .forEach(object -> validateTableFieldsExist(object.getTable(), object.getFields())); - - // Validate input objects with table (jOOQ record input) - var alreadyValidatedJooqRecordInput = schema.getInputTypes().values().stream() - .filter(RecordObjectDefinition::hasTable) - .filter(it -> !it.hasJavaRecordReference()) - .map(input -> { - validateTableFieldsExist(input.getTable(), input.getFields(), false); - return input.getName(); - }) - .toList(); - - // Validate input on fields returning table object (except already validated jOOQ record input types) - allFields.stream() - .filter(schema::isObject) - .filter(GenerationSourceField::isGenerated) - .filter(ObjectField::hasNonReservedInputFields) - .filter(it -> schema.getObjectOrConnectionNode(it) != null) - .filter(it -> schema.getObjectOrConnectionNode(it).hasTable()) - .forEach(field -> { - var table = schema.getObjectOrConnectionNode(field).getTable(); - var argumentsToValidate = field.getNonReservedArguments().stream() - .filter(it -> !alreadyValidatedJooqRecordInput.contains(it.getTypeName())) - .toList(); - validateTableFieldsExist(table, argumentsToValidate, field.hasOverridingCondition()); - }); - - // Validate fields with implicit table from input jOOQ record - allFields.stream() - .filter(GenerationSourceField::isGenerated) - .filter(it -> !it.hasServiceReference()) - .filter(it -> schema.findInputTables(it).size() == 1) - .filter(it -> schema.getObjectOrConnectionNode(it) == null || !schema.getObjectOrConnectionNode(it).hasTable()) - .forEach(field -> { - var implicitTableFromInput = schema.findInputTables(field).get(0); - List<ObjectField> fields; - - if (field.hasMutationType()) { - var dataTargetOptional = schema.inferDataTargetForMutation(field); - if (dataTargetOptional.isEmpty()) { - return; - } - - var dataTarget = dataTargetOptional.get(); - if (schema.isObject(dataTarget) && schema.getObject(dataTarget).hasTable()) { - return; - } - fields = schema.isScalar(dataTarget) ? List.of(dataTarget) : schema.getObject(dataTarget).getFields(); - } else if (schema.isObject(field)) { - fields = schema.getObject(field).getFields(); - } else if (schema.isScalar(field)) { - fields = List.of(field); - } else { - return; - } - validateTableFieldsExist(implicitTableFromInput, fields); - }); - } - - private void validateTableFieldsExist(JOOQMapping currentTable, Collection<ObjectField> fields) { - var contextFields = getFieldsInTableContext(fields, currentTable) - .stream() - .filter(it -> !it.hasProcedureCall()) - .filter(it -> !schema.isObject(it) || !it.hasSelectConstruct()) - .toList(); - for (var field : contextFields) { - if (schema.isObject(field)) { - validateTableFieldsExist(currentTable, schema.getObject(field).getFields()); - } else { - validateFieldExists(currentTable.getMappingName(), field); - } - } - } - - private void validateTableFieldsExist(JOOQMapping currentTable, Collection<? extends InputField> fields, boolean hasOverridingCondition) { - for (var field : getFieldsInTableContext(fields, currentTable)) { - var hasCondition = hasOverridingCondition || field.hasOverridingCondition(); - if (schema.isInputType(field)) { - var inputType = schema.getInputType(field); - if (!inputType.hasTable()) { - validateTableFieldsExist(currentTable, inputType.getFields(), hasCondition); - } - } else if (!hasCondition) { - validateFieldExists(currentTable.getMappingName(), field); - } - } - // Validate that @field columns exist in @reference tables - if (!hasOverridingCondition) { - fields.stream() - .filter(field -> field.isGenerated() && field.hasFieldReferences() && !field.hasNodeID() && !field.hasOverridingCondition()) - .forEach(field -> - resolveReferenceTargetTable(field.getFieldReferences(), currentTable.getMappingName()) - .ifPresent(table -> validateFieldExists(table, field))); - } - } - - private <T extends GenerationField> List<T> getFieldsInTableContext(Collection<T> fieldList, JOOQMapping currentTable) { - return fieldList.stream() - .filter(GenerationTarget::isGenerated) - .filter(it -> !leavesTableContext(it, currentTable)) - .toList(); - } - - private boolean leavesTableContext(GenerationField field, JOOQMapping currentTable) { - return field.hasFieldReferences() - || (schema.isObject(field) && schema.getObject(field).hasTable() && !schema.getObject(field).getTable().equals(currentTable)) - || field.createsDataFetcher() - || schema.isConnectionObject(field) - || schema.isMultiTableField(field) - || schema.isInterface(field) - || schema.isNodeIdField(field) - || field.isExternalField() - || field.hasServiceReference() - || (schema.isInputType(field) && schema.getInputType(field).hasJavaRecordReference()); - } - - private void validateFieldExists(String tableJavaName, GenerationField field) { - if (!tableExists(tableJavaName)) { - return; - } - if (field.isID() && !GeneratorConfig.shouldMakeNodeStrategy()) { - return; - } - if (getJavaFieldName(tableJavaName, field.getUpperCaseName()).isEmpty()) { - if (shouldMakeNodeStrategy() && field.isID()) { - addErrorMessage("No field with name '%s' found in table '%s' which may be required by %s. " + - "Add %s directive if %s is supposed to be a node ID field.", - field.getUpperCaseName(), tableJavaName, field.formatPath(), NODE_ID.getName(), field.formatPath()); - } else { - addErrorMessage("No field with name '%s' found in table '%s' which is required by %s.", - field.getUpperCaseName(), tableJavaName, field.formatPath()); - } - } - } - - /** - * Validates that query arguments and input fields with multistep @reference paths do not contain - * one-to-many (REVERSE) joins in non-final steps. Such joins cause row duplication that cannot be resolved - * automatically. One-to-many in the final step is allowed, as it is handled by EXISTS subquery generation. - */ - private void validateOneToManyInputReferences() { - allFields.forEach(field -> { - if (!field.hasNonReservedInputFields()) return; - var connectionNode = schema.getObjectOrConnectionNode(field); - if (connectionNode == null || !connectionNode.hasTable()) return; - - var rootTable = connectionNode.getTable().getMappingName(); - field.getNonReservedArguments() - .forEach(arg -> validateNoOneToManyInNonFinalStep(arg, rootTable)); - field.getNonReservedArguments().stream() - .filter(schema::isInputType) - .flatMap(arg -> schema.getInputType(arg).getFields().stream()) - .forEach(inputField -> validateNoOneToManyInNonFinalStep(inputField, rootTable)); - }); - } - - /** - * Validates that a filter field's @reference path does not contain a one-to-many relationship in a non-final step. - * The total number of steps includes an implicit step from @nodeId if it targets a different table than the last - * explicit reference. - */ - private void validateNoOneToManyInNonFinalStep(GenerationField field, String rootTable) { - var references = field.getFieldReferences(); - var lastRefTable = resolveReferenceTargetTable(references, rootTable).orElse(rootTable); - var nodeType = schema.isNodeIdField(field) ? schema.getNodeTypeForNodeIdField(field).orElse(null) : null; - var hasImplicitNodeIdStep = nodeType != null && nodeType.hasTable() - && !nodeType.getTable().getMappingName().equals(lastRefTable); - var totalSteps = references.size() + (hasImplicitNodeIdStep ? 1 : 0); - if (totalSteps < 2) return; - - var currentTable = rootTable; - for (int i = 0; i < references.size(); i++) { - var ref = references.get(i); - String nextTable; - if (ref.hasKey()) { - nextTable = resolveKeyOtherTable(ref.getKey().getName(), currentTable).orElse(null); - } else if (ref.hasTable()) { - nextTable = ref.getTable().getMappingName(); - } else { - return; - } - if (nextTable == null) return; - if (i < totalSteps - 1) { - var relationType = inferRelationType(currentTable, nextTable, ref.hasKey() ? ref.getKey() : null); - if (relationType == TableRelationType.REVERSE_IMPLICIT || relationType == TableRelationType.REVERSE_KEY) { - addErrorMessage( - "Field %s has a multi-step @%s path with a one-to-many relationship " + - "from \"%s\" to \"%s\" in a non-final step. This is not currently supported on filter inputs because it causes row duplication. " + - "Use the @condition directive for complex cross-table filtering instead.", - field.formatPath(), REFERENCE.getName(), currentTable, nextTable); - } - } - currentTable = nextTable; - } - } - - // TODO: It seems we are now handling/validating lists that are directly below parent lists. But what about - // validation of nested lists where a list is not directly below parent list, but are deeper down the hierarchy? - private void validateInputFields() { - var oneLayerFlattenedFields = allFields - .stream() - .filter(schema::hasTableObject) - .flatMap(it -> it.getNonReservedArguments().stream()) - .filter(it -> !schema.hasRecord(it) && !it.hasOverridingCondition()) - .filter(AbstractField::isIterableWrapped) - .filter(schema::isInputType) - .toList(); - - for (var field : oneLayerFlattenedFields) { - var messageStart = String.format("Argument '%s' is a collection of InputFields ('%s') type.", field.getName(), field.getTypeName()); - var inputDefinitionFields = schema.getInputType(field).getFields(); - - inputDefinitionFields.stream().filter(AbstractField::isIterableWrapped).findFirst().ifPresent(it -> addErrorMessageAndThrow( - "%s Fields returning collections: '%s' are not supported on such types (used for generating condition tuples)", - messageStart, - it.getName() - )); - - var optionalFields = inputDefinitionFields - .stream() - .filter(AbstractField::isNullable) - .map(AbstractField::getName) - .collect(Collectors.toList()); - if (!optionalFields.isEmpty()) { - addErrorMessage( - String.format( - "%s Optional fields on such types are not supported. The following fields will be " + - "treated as mandatory in the resulting, generated condition tuple: '%s'", - messageStart, - String.join("', '", optionalFields) - ) - ); - } - } - } - - private void validateWrapperTypesWithPreviousTable() { - schema.getObjects() - .values() - .stream() - .filter(it -> schema.isObjectWithPreviousTableObject(it.getName())) - .map(AbstractObjectDefinition::getFields) - .flatMap(Collection::stream) - .filter(AbstractField::isIterableWrapped) - .filter(schema::isObject) - .filter(it -> !it.hasFieldReferences()) - .filter(it -> !it.createsDataFetcher()) - .filter(it -> Optional.ofNullable(schema.getObject(it).getTable()) - .map(t -> schema.getPreviousTableObjectForField(it).getTable().equals(t)) - .orElse(true) - ) - .forEach(f -> - addErrorMessage( - "Field %s returns a list of wrapper type '%s' (a type wrapping a subset of the table fields)," + - " which is not supported. Change the field to return a single '%s' to fix.", - f.formatPath(), f.getTypeName(), f.getTypeName(), f.getTypeName()) - ); - } - - private void validateOnlyOneInputRecordInputWhenNoTypeTableIsPresent() { - var mutation = schema.getMutationType(); - var mutations = mutation != null ? mutation.getFields().stream() : Stream.<ObjectField>of(); - var query = schema.getQueryType(); - var queries = query != null ? query.getFields().stream() : Stream.<ObjectField>of(); - - Stream - .concat(queries, mutations) - .filter(ObjectField::isGeneratedWithResolver) - .filter(it -> !it.hasServiceReference()) - .filter(it -> !it.getTypeName().equals(FEDERATION_SERVICE_TYPE.getName())) - .filter(it -> !it.getTypeName().equals(FEDERATION_ENTITY_UNION.getName())) - .filter(it -> !schema.isInterface(it)) - .filter(it -> !schema.isUnion(it)) - .filter(it -> schema.isScalar(it) || schema.isRecordType(it)) - .filter(it -> !schema.nextTypeTableExists(it, new HashSet<>())) - .collect(Collectors.toMap(it -> it.getContainerTypeName() + "." + it.getName(), it -> schema.findInputTables(it).size())) - .entrySet() - .stream() - .filter(it -> it.getValue() != 1) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)) - .forEach((key, value) -> addErrorMessage( - "%s is a field of a type without a table, and has %s potential input records to use as a source for the table in queries. In such cases, there must be exactly one input table so that it can be resolved unambiguously.", - key, - value - )); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/ValidationHandler.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/ValidationHandler.java deleted file mode 100644 index 07d1a05a1f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/ValidationHandler.java +++ /dev/null @@ -1,109 +0,0 @@ -package no.sikt.graphitron.validation; - -import no.sikt.graphitron.validation.messages.interfaces.ErrorMessage; -import no.sikt.graphitron.validation.messages.interfaces.WarningMessage; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.LinkedHashSet; -import java.util.Set; - -public class ValidationHandler { - private static final Set<String> errorMessages = new LinkedHashSet<>(); - private static final Set<String> warningMessages = new LinkedHashSet<>(); - private static final Logger LOGGER = LoggerFactory.getLogger(ValidationHandler.class); - - /** - * Adds an error message that will be thrown at a later time - * @param formatedErrorMessage - A formated description of the error. - * @param args - The arguments for the formatedErrorMessage - */ - public static void addErrorMessage(String formatedErrorMessage, Object... args) { - errorMessages.add(String.format(formatedErrorMessage, args)); - } - - /** - * Adds an error message that will be thrown at a later time. - * @param message - A formated description of the error. - * @param args - The arguments for the formatedErrorMessage - */ - public static void addErrorMessage(ErrorMessage message, Object... args) { - errorMessages.add(message.format(args)); - } - - /** - * Adds a warning message that will be logged. - * @param formatedWarningMessage - A formated description of the warning - * @param args - Arguments for the formatedWarningMessage - */ - public static void addWarningMessage(String formatedWarningMessage, Object... args) { - warningMessages.add(String.format(formatedWarningMessage, args)); - } - - /** - * Adds a warning message that will be logged. - * @param message - A formated description of the warning. - * @param args - Arguments for the message. - */ - public static void addWarningMessage(WarningMessage message, Object... args) { - warningMessages.add(message.format(args)); - } - - /** - * Adds an error message and immediately throws an InvalidSchemaException for all added error messages. - * @param formatedErrorMessage - A description of the error as a formated string. - * @param args - The arguments referenced in the formatedErrorMessage - */ - public static void addErrorMessageAndThrow(String formatedErrorMessage, Object... args) { - addErrorMessage(formatedErrorMessage, args); - throw new InvalidSchemaException("Problems have been found that prevent code generation: \n" + String.join("\n", errorMessages)); - } - - public static InvalidSchemaException getException() { - return new InvalidSchemaException("Problems have been found that prevent code generation: \n" + String.join("\n", errorMessages)); - } - - /** - * Logs all reported warnings. - */ - public static void logWarnings() { - if (!warningMessages.isEmpty()) { - LOGGER.warn("Problems have been found that MAY prevent code generation:\n{}", String.join("\n", warningMessages)); - } - } - - /** - * Throws an exception if any error has previously been reported. - */ - public static void throwIfErrors() { - if (!errorMessages.isEmpty()) { - throw new InvalidSchemaException("Problems have been found that prevent code generation: \n" + String.join("\n", errorMessages)); - } - } - - /** - * Used to clear the errorMessages between tests. - */ - public static void resetErrorMessages() { - errorMessages.clear(); - } - - /** - * Used to clear warningMessages between tests. - */ - public static void resetWarningMessages() { - warningMessages.clear(); - } - - /** - * format Asserts that an expression is true and throws a InvalidSchemaException if the expression is false. - * @param expr - The expression to be checked. - * @param message - A parameterized string describing the error - * @param values - Values for the parameterized string. - */ - public static void isTrue (boolean expr, String message, Object ... values) { - if (!expr) { - throw new InvalidSchemaException(String.format(message, values)); - } - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/messages/ConstructError.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/messages/ConstructError.java deleted file mode 100644 index bc4b0b1316..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/messages/ConstructError.java +++ /dev/null @@ -1,27 +0,0 @@ -package no.sikt.graphitron.validation.messages; - -import static no.sikt.graphql.directives.GenerationDirective.CONSTRUCT_TYPE; -import static no.sikt.graphql.directives.GenerationDirective.TABLE; - -import no.sikt.graphitron.validation.messages.interfaces.ErrorMessage; - -public enum ConstructError implements ErrorMessage { - CONSTRUCT_FIELD_IS_NOT_TYPE("Field %s uses @" + CONSTRUCT_TYPE.getName() + " but its target type '%s' is not an object type."), - CONSTRUCT_TYPE_HAS_TABLE("Field %s uses @" + CONSTRUCT_TYPE.getName() + " but the target type '%s' has a @" + TABLE.getName() + " directive. The target type must not have its own table."), - CONSTRUCT_MISSING_TABLE("Field %s uses @" + CONSTRUCT_TYPE.getName() + " but the containing type has no resolvable table."), - CONSTRUCT_FIELD_HAS_ILLEGAL_DIRECTIVE("Field %s can not have both @" + CONSTRUCT_TYPE.getName() + " and @%s directives."), - CONSTRUCT_NONEXISTENT_FIELD("Field %s uses @" + CONSTRUCT_TYPE.getName() + " with selection field '%s' which does not exist in target type '%s'."), - CONSTRUCT_CONTAINS_NESTED_TYPE("Field %s uses @" + CONSTRUCT_TYPE.getName() + " with selection field '%s' which is an object type. Only scalar and enum fields are allowed in construct selections."), - CONSTRUCT_NONEXISTENT_COLUMN("Field %s uses @" + CONSTRUCT_TYPE.getName() + " with selection column '%s' which does not exist in table '%s'."); - - private final String msg; - - ConstructError(String msg) { - this.msg = msg; - } - - @Override - public String getMsg() { - return msg; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/messages/InputDirectiveWarning.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/messages/InputDirectiveWarning.java deleted file mode 100644 index 8e583ac92f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/messages/InputDirectiveWarning.java +++ /dev/null @@ -1,24 +0,0 @@ -package no.sikt.graphitron.validation.messages; - -import no.sikt.graphitron.validation.messages.interfaces.WarningMessage; - -import static no.sikt.graphql.directives.GenerationDirective.RECORD; -import static no.sikt.graphql.directives.GenerationDirective.TABLE; - -public enum InputDirectiveWarning implements WarningMessage { - RECORD_TYPE_CONFLICT(String.format("Input types can only be mapped to one record category (either a jOOQ record " + - "via @%1$s or a Java record via @%2$s), but input type '%%s' has both directives. " + - "Remove @%1$s to preserve the existing behaviour.", - TABLE.getName(), RECORD.getName())); - - private final String msg; - - InputDirectiveWarning(String msg) { - this.msg = msg; - } - - @Override - public String getMsg() { - return msg; - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/messages/InputTableError.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/messages/InputTableError.java deleted file mode 100644 index bf64fdb5d3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/messages/InputTableError.java +++ /dev/null @@ -1,19 +0,0 @@ -package no.sikt.graphitron.validation.messages; - -import no.sikt.graphitron.validation.messages.interfaces.WarningMessage; - -public enum InputTableError implements WarningMessage { - MISSING_FIELD("Input type %s referencing table %s does not map all fields required by the database. Missing required fields: %s"), - MISSING_NON_NULLABLE("Input type %s referencing table %s does not map all fields required by the database as non-nullable. Nullable required fields: %s"); - - private final String msg; - - InputTableError(String msg) { - this.msg = msg; - } - - @Override - public String getMsg() { - return msg; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/messages/MultitableError.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/messages/MultitableError.java deleted file mode 100644 index 41287cab97..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/messages/MultitableError.java +++ /dev/null @@ -1,18 +0,0 @@ -package no.sikt.graphitron.validation.messages; - -import no.sikt.graphitron.validation.messages.interfaces.ErrorMessage; - -public enum MultitableError implements ErrorMessage { - MISSING_TABLE_ON_MULTITABLE("Type(s) '%s' are used in a query %s returning multitable interface or union '%s', but do not have tables set. This is not supported."); - - private final String msg; - - MultitableError(String msg) { - this.msg = msg; - } - - @Override - public String getMsg() { - return msg; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/messages/ProcedureCallError.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/messages/ProcedureCallError.java deleted file mode 100644 index e4bb0d0ad6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/messages/ProcedureCallError.java +++ /dev/null @@ -1,37 +0,0 @@ -package no.sikt.graphitron.validation.messages; - -import no.sikt.graphitron.validation.messages.interfaces.ErrorMessage; - -import static no.sikt.graphql.directives.GenerationDirective.PROCEDURE_CALL; -import static no.sikt.graphql.directives.GenerationDirective.SPLIT_QUERY; - -public enum ProcedureCallError implements ErrorMessage { - UNKNOWN_ROUTINE("Field %s uses @" + PROCEDURE_CALL.getName() + " but no jOOQ routine was found with the name '%s'."), - AMBIGUOUS_ROUTINE("Field %s uses @" + PROCEDURE_CALL.getName() + " with routine '%s' but that name exists in multiple schemas: [%s]. Qualify the name as 'schema.routine' to disambiguate."), - NOT_A_FUNCTION("Field %s uses @" + PROCEDURE_CALL.getName() + " with routine '%s' but the routine is not a function (it has no return value, or it has OUT/INOUT parameters which are not supported)."), - MISSING_TABLE("Field %s uses @" + PROCEDURE_CALL.getName() + " but the relevant type neither has a table nor inherits one from a previous type."), - UNKNOWN_PARAMETER("Field %s uses @" + PROCEDURE_CALL.getName() + " with unknown routine parameter '%s' for routine '%s'. Known IN parameters: [%s]."), - MISSING_PARAMETER("Field %s uses @" + PROCEDURE_CALL.getName() + " but does not map routine IN parameter '%s' (routine '%s'). All IN parameters must be supplied."), - ARGUMENT_NOT_FOUND("Field %s uses @" + PROCEDURE_CALL.getName() + " mapping parameter '%s' to '%s' but no such argument source was found (%s)."), - RETURN_TYPE_MISMATCH("Field %s uses @" + PROCEDURE_CALL.getName() + " but the routine '%s' returns '%s' which is not compatible with the GraphQL type '%s' (expected Java type '%s')."), - ON_ROOT_OPERATION("Field %s uses @" + PROCEDURE_CALL.getName() + " on a %s root field. The directive is only valid on fields of types backed by a table."), - ON_NON_SCALAR_FIELD_TYPE("Field %s uses @" + PROCEDURE_CALL.getName() + " but its type '%s' is not a scalar. @" + PROCEDURE_CALL.getName() + " only supports scalar-returning functions."), - ON_INTERFACE_DECLARATION("Field %s is declared on interface '%s' with @" + PROCEDURE_CALL.getName() + ". Declare the directive on the implementing object types instead."), - ILLEGAL_COMBINATION("Field %s uses @" + PROCEDURE_CALL.getName() + " together with @%s. These directives cannot be combined."), - TARGET_MODE_REQUIRES_DATA_FETCHER("Field %s uses @" + PROCEDURE_CALL.getName() + " with target '%s' but the directive is not on a data-fetcher field. The 'target' parameter is only valid on root fields, fields with arguments, or @" + SPLIT_QUERY.getName() + " fields."), - TARGET_MODE_REQUIRES_OBJECT_RETURN_TYPE("Field %s uses @" + PROCEDURE_CALL.getName() + " with target '%s' but its type '%s' is not an object type. Target mode requires the field to return an object or list of objects."), - UNKNOWN_TARGET_FIELD("Field %s uses @" + PROCEDURE_CALL.getName() + " with target '%s' but no such field exists on the return type '%s'."), - TARGET_FIELD_NOT_SCALAR("Field %s uses @" + PROCEDURE_CALL.getName() + " with target '%s' on return type '%s' but that field's type '%s' is not a scalar. @" + PROCEDURE_CALL.getName() + " only supports scalar-returning functions."), - TARGET_FIELD_HAS_ILLEGAL_DIRECTIVE("Field %s uses @" + PROCEDURE_CALL.getName() + " with target '%s' on return type '%s' but the target field already carries @%s."); - - private final String msg; - - ProcedureCallError(String msg) { - this.msg = msg; - } - - @Override - public String getMsg() { - return msg; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/messages/SelfReferenceError.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/messages/SelfReferenceError.java deleted file mode 100644 index d1b8456631..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/messages/SelfReferenceError.java +++ /dev/null @@ -1,20 +0,0 @@ -package no.sikt.graphitron.validation.messages; - -import no.sikt.graphitron.validation.messages.interfaces.ErrorMessage; - -import static no.sikt.graphql.directives.GenerationDirective.SPLIT_QUERY; - -public enum SelfReferenceError implements ErrorMessage { - SELF_REFERENCE_WITHOUT_SPLITQUERY("Field %s is a field generating a table self-reference. This is only supported if the field has the @" + SPLIT_QUERY.getName() + " directive."); - - private final String msg; - - SelfReferenceError(String msg) { - this.msg = msg; - } - - @Override - public String getMsg() { - return msg; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/messages/SelfReferenceWarning.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/messages/SelfReferenceWarning.java deleted file mode 100644 index 7497d4c1d1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/messages/SelfReferenceWarning.java +++ /dev/null @@ -1,19 +0,0 @@ -package no.sikt.graphitron.validation.messages; - -import no.sikt.graphitron.validation.messages.interfaces.WarningMessage; - -public enum SelfReferenceWarning implements WarningMessage { - SELF_REFERENCE_IMPLICITLY_REVERSE("Field %s is a listed field generating a table self-reference through a key, implying you may want a reverse reference. " + - "Reverse self reference is not currently supported. Possible workaround is defining a custom reference condition."); - - private final String msg; - - SelfReferenceWarning(String msg) { - this.msg = msg; - } - - @Override - public String getMsg() { - return msg; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/messages/interfaces/ErrorMessage.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/messages/interfaces/ErrorMessage.java deleted file mode 100644 index 5d1999ceef..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/messages/interfaces/ErrorMessage.java +++ /dev/null @@ -1,3 +0,0 @@ -package no.sikt.graphitron.validation.messages.interfaces; - -public interface ErrorMessage extends UserMessage {} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/messages/interfaces/UserMessage.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/messages/interfaces/UserMessage.java deleted file mode 100644 index 7d77ae3607..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/messages/interfaces/UserMessage.java +++ /dev/null @@ -1,8 +0,0 @@ -package no.sikt.graphitron.validation.messages.interfaces; - -public interface UserMessage { - String getMsg(); - default String format(Object... input) { - return String.format(getMsg(), input); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/messages/interfaces/WarningMessage.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/messages/interfaces/WarningMessage.java deleted file mode 100644 index 57d396b42d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphitron/validation/messages/interfaces/WarningMessage.java +++ /dev/null @@ -1,3 +0,0 @@ -package no.sikt.graphitron.validation.messages.interfaces; - -public interface WarningMessage extends UserMessage {} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphql/directives/DirectiveHelpers.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphql/directives/DirectiveHelpers.java deleted file mode 100644 index e4be2dd51d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphql/directives/DirectiveHelpers.java +++ /dev/null @@ -1,230 +0,0 @@ -package no.sikt.graphql.directives; - -import graphql.language.*; - -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.function.Supplier; -import java.util.stream.Collectors; - -/** - * Helper methods for extracting directive information from the schema. - */ -public class DirectiveHelpers { - private static Value<?> getArgument(DirectivesContainer<?> container, GenerationDirective directive, String arg) { - var dir = container.getDirectives(directive.getName()); - return dir != null && !dir.isEmpty() ? extractArgumentValueFrom(dir.get(0), arg) : null; - } - - private static List<Value<?>> getRepeatableArguments(DirectivesContainer<?> container, String directive, String arg) { - var dir = container.getDirectives(directive); - return dir != null && !dir.isEmpty() ? dir.stream().map(it -> extractArgumentValueFrom(it, arg)).filter(Objects::nonNull).collect(Collectors.toList()) : null; - } - - private static Value<?> extractArgumentValueFrom(Directive directive, String arg) { - var argument = directive.getArgument(arg); - return argument != null ? argument.getValue() : null; - } - - /** - * @param container The graph element to be inspected. - * @param directive The directive this argument should be set on. - * @param param Name of the argument. - * @return The String value of the directive argument, if it exists. - */ - public static Optional<String> getOptionalDirectiveArgumentString(DirectivesContainer<?> container, GenerationDirective directive, GenerationDirectiveParam param) { - directive.checkParamIsValid(param); - return Optional.ofNullable((StringValue) getArgument(container, directive, param.getName())) - .map(StringValue::getValue) - .map(String::strip); - } - - /** - * @param container The graph element to be inspected. - * @param directive The directive this argument should be set on. - * @param param Name of the argument. - * @return The String values of the directive arguments, if they exist. - */ - public static List<String> getRepeatableDirectiveArgumentString(DirectivesContainer<?> container, String directive, String param) { - return Optional - .ofNullable(getRepeatableArguments(container, directive, param)) - .orElse(List.of()) - .stream() - .map(arg -> (StringValue) arg) - .map(StringValue::getValue) - .map(String::strip) - .collect(Collectors.toList()); - } - - /** - * @param container The graph element to be inspected. - * @param directive The directive this argument should be set on. - * @param param Name of the argument. - * @return The name of the enum value for this argument, if it exists. - */ - public static Optional<String> getOptionalDirectiveArgumentEnum(DirectivesContainer<?> container, GenerationDirective directive, GenerationDirectiveParam param) { - directive.checkParamIsValid(param); - return Optional.ofNullable((EnumValue) getArgument(container, directive, param.getName())) - .map(EnumValue::getName) - .map(String::strip); - } - - /** - * @param container The graph element to be inspected. - * @param directive The directive this argument should be set on. - * @param param Name of the argument. - * @return List of String values of the directive argument, if it exists. - */ - public static List<String> getOptionalDirectiveArgumentStringList(DirectivesContainer<?> container, GenerationDirective directive, GenerationDirectiveParam param) { - directive.checkParamIsValid(param); - return getOptionalDirectiveArgumentStringList(container, directive.getName(), param); - } - - private static List<String> getOptionalDirectiveArgumentStringList(DirectivesContainer<?> container, String directiveName, GenerationDirectiveParam param) { - var dir = container.getDirectives(directiveName); - if (dir == null || dir.isEmpty()) { - return List.of(); - } - - var args = dir.get(0).getArgument(param.getName()); - if (args == null) { - return List.of(); - } - - var argsValue = args.getValue(); - - if (argsValue instanceof StringValue) { - return List.of(((StringValue) argsValue).getValue()); - } - return ((ArrayValue) argsValue).getValues().stream() - .map(stringValue -> stringValue instanceof NullValue ? null : ((StringValue) stringValue).getValue().strip()) - .collect(Collectors.toList()); - - } - - /** - * @param container The graph element to be inspected. - * @param directive The directive this argument should be set on. - * @param param Name of the argument. - * @return The Boolean value of the directive argument, if it exists. - */ - public static Optional<Boolean> getOptionalDirectiveArgumentBoolean(DirectivesContainer<?> container, GenerationDirective directive, GenerationDirectiveParam param) { - directive.checkParamIsValid(param); - return Optional.ofNullable((BooleanValue) getArgument(container, directive, param.getName())) - .map(BooleanValue::isValue); - } - - /** - * @param container The graph element to be inspected. - * @param directive The directive this argument should be set on. - * @param param Name of the argument. - * @return Object fields of the directive argument, if it exists. - */ - public static Optional<List<ObjectField>> getOptionalDirectiveArgumentObjectFields(DirectivesContainer<?> container, GenerationDirective directive, GenerationDirectiveParam param) { - directive.checkParamIsValid(param); - return (Optional.ofNullable((ObjectValue) getArgument(container, directive, param.getName()))).map(ObjectValue::getObjectFields); - } - - /** - * Get a directive argument value. This assumes that the argument is required and will exist. - * - * @param container The graph element to be inspected. - * @param directive The directive this argument should be set on. - * @param param Name of the argument. - * @return The String value of the directive argument. An exception is thrown if this does not exist. - */ - public static String getDirectiveArgumentString(DirectivesContainer<?> container, GenerationDirective directive, GenerationDirectiveParam param) { - return getOptionalDirectiveArgumentString(container, directive, param) - .map(String::strip) - .orElseThrow(getIllegalArgumentExceptionSupplier(param.getName(), directive.getName())); - } - - /** - * Get a directive argument value. This assumes that the argument is required and will exist. - * - * @param container The graph element to be inspected. - * @param directive The directive this argument should be set on. - * @param param Name of the argument. - * @return The name of the enum value for this argument. An exception is thrown if this does not exist. - */ - public static String getDirectiveArgumentEnum(DirectivesContainer<?> container, GenerationDirective directive, GenerationDirectiveParam param) { - directive.checkParamIsValid(param); - return getOptionalDirectiveArgumentEnum(container, directive, param) - .map(String::strip) - .orElseThrow(getIllegalArgumentExceptionSupplier(param.getName(), directive.getName())); - } - - /** - * Get a directive argument value. This assumes that the argument is required and will exist. - * - * @param container The graph element to be inspected. - * @param directive The directive this argument should be set on. - * @param param Name of the argument. - * @return The Boolean value of the directive argument. An exception is thrown if this does not exist. - */ - public static Boolean getDirectiveArgumentBoolean(DirectivesContainer<?> container, GenerationDirective directive, GenerationDirectiveParam param) { - directive.checkParamIsValid(param); - return getOptionalDirectiveArgumentBoolean(container, directive, param) - .orElseThrow(getIllegalArgumentExceptionSupplier(param.getName(), directive.getName())); - } - - /** - * Get a directive argument value. This assumes that the argument is required and will exist. - * - * @param container The graph element to be inspected. - * @param directive The directive this argument should be set on. - * @param param Name of the argument. - * @return Object fields of the directive argument. An exception is thrown if this does not exist. - */ - public static List<ObjectField> getDirectiveArgumentObjectFields(DirectivesContainer<?> container, GenerationDirective directive, GenerationDirectiveParam param) { - directive.checkParamIsValid(param); - return getOptionalDirectiveArgumentObjectFields(container, directive, param) - .orElseThrow(getIllegalArgumentExceptionSupplier(param.getName(), directive.getName())); - } - - /** - * @param container The graph element to be inspected. - * @param directive The directive this argument should be set on. - * @param param Name of the argument. - * @return List of ObjectValue elements from the directive argument, if it exists. - */ - public static Optional<List<ObjectValue>> getOptionalDirectiveArgumentObjectValueList(DirectivesContainer<?> container, GenerationDirective directive, GenerationDirectiveParam param) { - directive.checkParamIsValid(param); - var value = getArgument(container, directive, param.getName()); - if (value instanceof ArrayValue arrayValue) { - return Optional.of(arrayValue.getValues().stream() - .map(v -> (ObjectValue) v) - .collect(Collectors.toList())); - } - return Optional.empty(); - } - - public static <T extends NamedNode<T>> Optional<T> getOptionalObjectFieldByName(List<T> fields, GenerationDirectiveParam param) { - var name = param.getName(); - return fields - .stream() - .filter(objectField -> objectField.getName().equals(name)) - .findFirst(); - } - - public static <T extends NamedNode<T>> T getObjectFieldByName(List<T> fields, GenerationDirectiveParam param) { - return getOptionalObjectFieldByName(fields, param).orElseThrow(() -> - new IllegalArgumentException( - "Field with name '" - + param.getName() - + "' not found in '" - + fields.stream().map(NamedNode::getName).collect(Collectors.joining(", ")) - + "'." - ) - ); - } - - public static String stringValueOf(ObjectField objectField) { - return ((StringValue) objectField.getValue()).getValue(); - } - - private static Supplier<IllegalArgumentException> getIllegalArgumentExceptionSupplier(String arg, String directive) { - return () -> new IllegalArgumentException("No argument '" + arg + "' found for directive '" + directive + "'."); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphql/schema/ProcessedSchema.java b/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphql/schema/ProcessedSchema.java deleted file mode 100644 index b97b1836c7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/main/java/no/sikt/graphql/schema/ProcessedSchema.java +++ /dev/null @@ -1,1362 +0,0 @@ -package no.sikt.graphql.schema; - -import com.apollographql.federation.graphqljava.directives.LinkDirectiveProcessor; -import graphql.language.*; -import graphql.language.SchemaDefinition; -import graphql.schema.idl.TypeDefinitionRegistry; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.definitions.fields.*; -import no.sikt.graphitron.definitions.fields.ObjectField; -import no.sikt.graphitron.definitions.fields.containedtypes.FieldType; -import no.sikt.graphitron.definitions.fields.containedtypes.MutationType; -import no.sikt.graphitron.definitions.helpers.NodeConfiguration; -import no.sikt.graphitron.definitions.interfaces.FieldSpecification; -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.definitions.interfaces.ObjectSpecification; -import no.sikt.graphitron.definitions.interfaces.RecordObjectSpecification; -import no.sikt.graphitron.definitions.mapping.JOOQMapping; -import no.sikt.graphitron.definitions.objects.*; -import no.sikt.graphitron.validation.ProcessedDefinitionsValidator; -import no.sikt.graphql.directives.GenerationDirective; -import no.sikt.graphql.naming.GraphQLReservedName; -import org.jetbrains.annotations.NotNull; - -import java.util.*; -import java.util.function.Function; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static no.sikt.graphitron.configuration.GeneratorConfig.useJdbcBatchingForDeletes; -import static no.sikt.graphitron.configuration.GeneratorConfig.useJdbcBatchingForInserts; -import static no.sikt.graphitron.configuration.Recursion.recursionCheck; -import static no.sikt.graphitron.generators.context.NodeIdReferenceHelpers.isNodeIdReferenceField; -import static no.sikt.graphql.directives.GenerationDirective.NODE; -import static no.sikt.graphql.naming.GraphQLReservedName.*; -import static org.apache.commons.lang3.StringUtils.uncapitalize; - -/** - * This class represents a fully processed GraphQL schema. This is Graphitron's pre-processing of the schema. - */ -public class ProcessedSchema { - private final Map<String, EnumDefinition> enums; - private final Map<String, ObjectDefinition> objects, entities; - private final Map<String, ExceptionDefinition> exceptions; - private final Map<String, InputDefinition> inputs; - private final Map<String, RecordObjectSpecification<? extends GenerationField>> recordTypes; - private final Map<String, ObjectDefinition> nodeTypes; - private final Map<String, InterfaceDefinition> interfaces; - private final Map<String, ConnectionObjectDefinition> connectionObjects; - private final Map<String, EdgeObjectDefinition> edgeObjects; - private final Map<String, UnionDefinition> unions; - private final Set<String> tableTypesWithTable, scalarTypes, typeNames, validFieldTypes; - private final ObjectDefinition queryType, mutationType; - private final Map<String, RecordObjectSpecification<?>> objectWithPreviousTable; - private final no.sikt.graphitron.definitions.objects.SchemaDefinition rootSchemaObject; - private final List<GenerationField> transformableFields; - private final List<ObjectDefinition> unreferencedObjects; - private final boolean nodeExists, federationIsImported, federationEntitiesExist; - - // Graphitron-provided special inputs. Should be excluded from certain operations. - private final Set<String> specialInputs = Set.of("ExternalCodeReference", "ReferenceElement", "ErrorHandler", "ReferencesForType"); - - public ProcessedSchema(TypeDefinitionRegistry typeRegistry) { - typeNames = typeRegistry.getTypes(TypeDefinition.class).stream().map(TypeDefinition::getName).collect(Collectors.toSet()); - var objectTypes = typeRegistry.getTypes(ObjectTypeDefinition.class); - enums = EnumDefinition.processEnumDefinitions(typeRegistry.getTypes(EnumTypeDefinition.class)) - .stream() - .collect(Collectors.toMap(EnumDefinition::getName, Function.identity())); - - objects = ObjectDefinition - .processObjectDefinitions(objectTypes) - .stream() - .collect(Collectors.toMap(ObjectDefinition::getName, Function.identity())); - - var allReferencedTypes = objects - .values() - .stream() - .flatMap(it -> it.getFields().stream()) - .map(AbstractField::getTypeName) - .collect(Collectors.toSet()); - unreferencedObjects = objects - .values() - .stream() - .filter(it -> !allReferencedTypes.contains(it.getName())) - .filter(it -> !it.getName().equals(SCHEMA_QUERY.getName()) && !it.getName().equals(SCHEMA_MUTATION.getName())) - .collect(Collectors.toList()); - - entities = objects - .values() - .stream() - .filter(RecordObjectDefinition::isEntity) - .collect(Collectors.toMap(ObjectDefinition::getName, Function.identity())); - - var exceptionTypes = objectTypes - .stream() - .filter(obj -> - obj - .getImplements() - .stream() - .filter(it -> it instanceof TypeName) - .map(it -> ((TypeName) it).getName()) - .anyMatch(it -> it.equals(ERROR_TYPE.getName())) - ) - .collect(Collectors.toList()); - exceptions = ExceptionDefinition - .processObjectDefinitions(exceptionTypes) - .stream() - .collect(Collectors.toMap(ExceptionDefinition::getName, Function.identity())); - - rootSchemaObject = isObject(SCHEMA_QUERY.getName()) || isObject(SCHEMA_MUTATION.getName()) - ? new no.sikt.graphitron.definitions.objects.SchemaDefinition(createSchemaDefinition()) - : null; - queryType = rootSchemaObject != null && rootSchemaObject.getQuery() != null ? getObject(rootSchemaObject.getQuery()) : null; - mutationType = rootSchemaObject != null && rootSchemaObject.getMutation() != null ? getObject(rootSchemaObject.getMutation()) : null; - - inputs = InputDefinition.processInputDefinitions(typeRegistry.getTypes(InputObjectTypeDefinition.class)) - .stream() - .filter(it -> !specialInputs.contains(it.getName())) - .collect(Collectors.toMap(InputDefinition::getName, Function.identity())); - - interfaces = typeRegistry.getTypes(InterfaceTypeDefinition.class) - .stream() - .map(InterfaceDefinition::new) - .collect(Collectors.toMap(ObjectSpecification::getName, Function.identity())); - - nodeExists = interfaces.containsKey(NODE_TYPE.getName()); - GeneratorConfig.setNodeExists(nodeExists); - - connectionObjects = objectTypes - .stream() - .filter(f -> f.getName().endsWith(GraphQLReservedName.SCHEMA_CONNECTION_SUFFIX.getName())) - .map(this::getSearchObjectDefinitionFor) - .collect(Collectors.toMap(ConnectionObjectDefinition::getName, Function.identity())); - - edgeObjects = connectionObjects - .values() - .stream() - .map(ConnectionObjectDefinition::getEdgeObject) - .collect(Collectors.toMap(EdgeObjectDefinition::getName, Function.identity())); - - unions = UnionDefinition.processUnionDefinitions(typeRegistry.getTypes(UnionTypeDefinition.class)) - .stream() - .collect(Collectors.toMap(UnionDefinition::getName, Function.identity())); - - recordTypes = Stream - .concat(Stream.concat(objects.values().stream(), inputs.values().stream()), - Stream.concat(interfaces.values().stream(), unions.values().stream().filter(it -> !isExceptionUnion(it.getName())))) - .collect(Collectors.toMap(AbstractObjectDefinition::getName, Function.identity())); - tableTypesWithTable = recordTypes - .values() - .stream() - .filter(RecordObjectSpecification::hasTable) - .map(RecordObjectSpecification::getName) - .collect(Collectors.toSet()); - nodeTypes = objects.values().stream().filter(RecordObjectDefinition::hasNodeDirective) - .collect(Collectors.toMap(AbstractObjectDefinition::getName, Function.identity())); - - scalarTypes = typeRegistry.scalars().keySet(); - validFieldTypes = Stream.concat(scalarTypes.stream(), typeNames.stream()).collect(Collectors.toSet()); - - // queryType may be null in certain tests. - objectWithPreviousTable = new HashMap<>(); - var nodes = objects.values().stream().filter(it -> it.implementsInterface(NODE_TYPE.getName())).map(it -> (RecordObjectSpecification<?>) it); - (queryType != null ? Stream.concat(nodes, Stream.of(queryType)) : nodes).forEach(this::buildPreviousTableMap); - interfaces.values().forEach(this::buildPreviousTableMap); - - markImplicitSplitQueryFields(); - - transformableFields = findTransformableFields(); - - federationIsImported = LinkDirectiveProcessor.loadFederationImportedDefinitions(typeRegistry) != null; - federationEntitiesExist = queryType != null && queryType.hasField(FEDERATION_ENTITIES_FIELD.getName()) && isFederationImported(); - } - - private SchemaDefinition createSchemaDefinition() { - var definitionBuilder = SchemaDefinition.newSchemaDefinition(); - var query = objects.get(SCHEMA_QUERY.getName()); - if (query != null) { - var queryName = query.getName(); - definitionBuilder.operationTypeDefinition( - OperationTypeDefinition - .newOperationTypeDefinition() - .name(uncapitalize(queryName)).typeName(TypeName.newTypeName().name(queryName).build()) - .build() - ); - } - - var mutation = objects.get(SCHEMA_MUTATION.getName()); - if (mutation != null) { - var mutationName = mutation.getName(); - definitionBuilder.operationTypeDefinition( - OperationTypeDefinition - .newOperationTypeDefinition() - .name(uncapitalize(mutationName)).typeName(TypeName.newTypeName().name(mutationName).build()) - .build() - ); - } - return definitionBuilder.build(); - } - - public boolean nodeExists() { - return nodeExists; - } - - /** - * Ensure that the definitions created in this class match database names where applicable. - */ - public void validate() { - validate(true); - } - - /** - * Ensure that the definitions created in this class match database names where applicable. - */ - public void validate(boolean checkTypes) { - ProcessedDefinitionsValidator processedDefinitionsValidator = new ProcessedDefinitionsValidator(this); - if (checkTypes) { - processedDefinitionsValidator.validateObjectFieldTypes(); - } - processedDefinitionsValidator.validateDirectiveUsage(); - } - - /** - * @return Does this name belong to a valid GraphQL type in the schema? - */ - public boolean isType(String name) { - return typeNames.contains(name); - } - - /** - * @return Does this field type belong to a valid GraphQL type in the schema? - */ - public boolean isType(FieldSpecification field) { - return typeNames.contains(field.getTypeName()); - } - - /** - * @return Set of all possible type or scalar names that a field can have in the schema. - */ - public Set<String> getAllValidFieldTypeNames() { - return validFieldTypes; - } - - /** - * @return Map of all the enums in the schema by name. - */ - public Map<String, EnumDefinition> getEnums() { - return enums; - } - - /** - * @return Does this name belong to an enum type in the schema? - */ - public boolean isEnum(String name) { - return enums.containsKey(name) || isConnectionObject(name) && isEnum(getConnectionObject(name).getNodeType()); - } - - /** - * @return Does this field point to an enum type in the schema? - */ - public boolean isEnum(GenerationField field) { - return enums.containsKey(field.getTypeName()) || isConnectionObject(field) && isEnum(getConnectionObject(field).getNodeType()); - } - - /** - * @return Does this field point to an enum type in the schema and does it have the {@link GenerationDirective#ENUM} directive set? - */ - public boolean isJavaMappedEnum(FieldSpecification field) { - return Optional.ofNullable(getEnum(field)).map(EnumDefinition::hasJavaEnumMapping).orElse(false); - } - - /** - * @return Get an enum with this name. - */ - public EnumDefinition getEnum(String name) { - return enums.get(isConnectionObject(name) ? getConnectionObject(name).getNodeType() : name); - } - - /** - * @return Get the enum that this field points to. - */ - public EnumDefinition getEnum(FieldSpecification field) { - var typeName = field.getTypeName(); - return enums.get(isConnectionObject(typeName) ? getConnectionObject(typeName).getNodeType() : typeName); - } - - /** - * @return Map of all the interfaces in the schema by name. - */ - public Map<String, InterfaceDefinition> getInterfaces() { - return interfaces; - } - - /** - * @return Does this name belong to an interface type in the schema? - */ - public boolean isInterface(String name) { - return interfaces.containsKey(name) || isConnectionObject(name) && isInterface(getConnectionObject(name).getNodeType()); - } - - /** - * @return Does this field point to an interface type in the schema? - */ - public boolean isInterface(GenerationField field) { - return interfaces.containsKey(field.getTypeName()) || isConnectionObject(field) && isInterface(getConnectionObject(field).getNodeType()); - } - - /** - * @return Does this field return a multi-table interface type in the schema? - */ - public boolean isMultiTableInterface(GenerationField field) { - return isMultiTableInterface(field.getTypeName()); - } - - /** - * @return Does this name belong to a multi-table interface type in the schema? - */ - public boolean isMultiTableInterface(String name) { - return isInterface(name) && getInterface(name).isMultiTableInterface(); - } - - /** - * @return Does this field return a single table interface type in the schema? - */ - public boolean isSingleTableInterface(GenerationField field) { - return isSingleTableInterface(field.getTypeName()); - } - - /** - * @return Does this name belong to a single table interface type in the schema? - */ - public boolean isSingleTableInterface(String name) { - return isInterface(name) && !getInterface(name).isMultiTableInterface(); - } - - /** - * @return Does this field return rows from multiple tables? - */ - public boolean isMultiTableField(GenerationField field) { - return isMultiTableInterface(field)|| isUnion(field); - } - - - /** - * @return Get an interface with this name. - */ - public InterfaceDefinition getInterface(String name) { - return interfaces.get(isConnectionObject(name) ? getConnectionObject(name).getNodeType() : name); - } - - /** - * @return Get the interface that this field points to. - */ - public InterfaceDefinition getInterface(FieldSpecification field) { - var typeName = field.getTypeName(); - return interfaces.get(isConnectionObject(typeName) ? getConnectionObject(typeName).getNodeType() : typeName); - } - - /** - * @return Get the implementations for an interface given its name - */ - public List<ObjectDefinition> getImplementationsForInterface(String interfaceName) { - return getObjects() - .values() - .stream() - .filter(it -> it.implementsInterface(interfaceName)) - .toList(); - } - - /** - * @return Get the implementations for an interface - */ - public List<ObjectDefinition> getImplementationsForInterface(InterfaceDefinition interfaceDefinition) { - return getImplementationsForInterface(interfaceDefinition.getName()); - } - - /** - * @return Get the ObjectDefinition for each Type in a Union given its name - */ - public List<ObjectDefinition> getUnionSubTypes(String objectName) { - return getUnion(objectName). - getFieldTypeNames() - .stream() - .map(this::getObjectOrConnectionNode) - .toList(); - } - - /** - * Returns the ObjectDefinition for each Type in a union given that the name - * supplied is a union. Otherwise, return the ObjectDefinition for all types - * that implements the given interface. - */ - public Optional<List<ObjectDefinition>> getTypesFromInterfaceOrUnion(String name) { - if (isUnion(name)) { - return Optional.of(getUnionSubTypes(isConnectionObject(name) ? getConnectionObject(name).getNodeType() : name)); - } - if (isInterface(name)) { - return Optional.of(getImplementationsForInterface(isConnectionObject(name) ? getConnectionObject(name).getNodeType() : name)); - } - return Optional.empty(); - } - - /** - * Returns the ObjectDefinition for each type implementing an interface or union given its definition - */ - public Optional<List<ObjectDefinition>> getTypesFromInterfaceOrUnion(RecordObjectSpecification<?> definition) { - return getTypesFromInterfaceOrUnion(definition.getName()); - } - - /** - * @return Map of all the objects in the schema by name. - */ - public Map<String, ObjectDefinition> getObjects() { - return objects; - } - - /** - * @return List of all the objects in the schema that are not referenced by an object field. - */ - public List<ObjectDefinition> getUnreferencedObjects() { - return unreferencedObjects; - } - - /** - * @return Map of all the types by name that have the federation directive @key set. - */ - public Map<String, ObjectDefinition> getEntities() { - return entities; - } - - public boolean isEntity(String typeName) { - return entities.containsKey(typeName); - } - - /** - * @return Set of all the scalar types in the schema. - */ - public Set<String> getScalarTypes() { - return scalarTypes; - } - - /** - * @return Does this name belong to an object type in the schema? - */ - public boolean isObject(String name) { - return objects.containsKey(name); - } - - /** - * @return Does this field point to an object type in the schema? - */ - public boolean isObject(FieldSpecification field) { - return objects.containsKey(field.getTypeName()); - } - - /** - * @return Get an object with this name. - */ - public ObjectDefinition getObject(String name) { - return objects.get(name); - } - - public boolean isNodeType(String name) { - return nodeTypes.containsKey(name); - } - - public ObjectDefinition getNodeType(String name) { - return nodeTypes.get(name); - } - - public List<ObjectDefinition> getNodeTypesWithTable(JOOQMapping table) { - return nodeTypes.values().stream() - .filter(it -> it.getTable().equals(table)) - .toList(); - } - - /** - * @return Get the object that this field points to. - */ - public ObjectDefinition getObject(FieldSpecification field) { - return objects.get(field.getTypeName()); - } - - /** - * @return Get an object or connection node with this name. - */ - public ObjectDefinition getObjectOrConnectionNode(String name) { - return getObject(isConnectionObject(name) ? getConnectionObject(name).getNodeType() : name); - } - - /** - * @return Get the object or connection node that this field points to. - */ - public ObjectDefinition getObjectOrConnectionNode(GenerationField field) { - return getObjectOrConnectionNode(field.getTypeName()); - } - - /** - * @return Does this name belong to an object type or connection node in the schema that is connected to a database table? - */ - public boolean hasTableObject(String name) { - return isObject(name) && getObject(name).hasTable() || isConnectionObject(name) && hasTableObject(getConnectionObject(name).getNodeType()); - } - - /** - * @return Does this field point to an object type or connection node in the schema that is connected to a database table? - */ - public boolean hasTableObject(FieldSpecification field) { - return hasTableObject(field.getTypeName()); - } - - /** - * @return Does this name point to an object type in the schema which implements the Node interface? - */ - public boolean implementsNode(String name) { - return isObject(name) && getObject(name).implementsInterface(NODE_TYPE.getName()); - } - - /** - * @return Does this field point to an object type in the schema which implements the Node interface? - */ - public boolean implementsNode(FieldSpecification field) { - return implementsNode(field.getTypeName()); - } - /** - * @return Does this name point to an object type in the schema which implements the interface? - */ - public boolean implementsInterface(String name, String interfaceName) { - return isObject(name) && getObject(name).implementsInterface(interfaceName); - } - - /** - * @return Does this field point to an object type in the schema which implements the interface? - */ - public boolean implementsInterface(FieldSpecification field, String interfaceName) { - return implementsInterface(field.getTypeName(), interfaceName); - } - - /** - * @return Does this name belong to a connection object type in the schema? - */ - public boolean isConnectionObject(String name) { - return connectionObjects.containsKey(name); - } - - /** - * @return Does this field point to a connection object type in the schema? - */ - public boolean isConnectionObject(FieldSpecification field) { - return connectionObjects.containsKey(field.getTypeName()); - } - - /** - * @return Get a connection object with this name. - */ - public ConnectionObjectDefinition getConnectionObject(String name) { - return connectionObjects.get(name); - } - - /** - * @return Get the connection object that this field points to. - */ - public ConnectionObjectDefinition getConnectionObject(GenerationField field) { - return connectionObjects.get(field.getTypeName()); - } - - /** - * @return Does this name belong to an edge object type in the schema? - */ - public boolean isEdgeObject(String name) { - return edgeObjects.containsKey(name); - } - - /** - * @return Map of all the exceptions in the schema by name. - */ - public Map<String, ExceptionDefinition> getExceptions() { - return exceptions; - } - - /** - * @return Does this name belong to an exception type in the schema? - */ - public boolean isException(String name) { - return exceptions.containsKey(name); - } - - /** - * @return Get an exception with this name. - */ - public ExceptionDefinition getException(String name) { - return exceptions.get(name); - } - - - /** - * @return Map of all the input type objects in the schema by name. - */ - public Map<String, InputDefinition> getInputTypes() { - return inputs; - } - - /** - * @return Does this name belong to an input type in the schema? - */ - public boolean isInputType(String name) { - return inputs.containsKey(name); - } - - /** - * @return Does this field point to an input type in the schema? - */ - public boolean isInputType(FieldSpecification field) { - return inputs.containsKey(field.getTypeName()); - } - - /** - * @return Does this name point to a type that has a table set? - */ - public boolean hasJOOQRecord(String name) { - return tableTypesWithTable.contains(isConnectionObject(name) ? getConnectionObject(name).getNodeType() : name); - } - - /** - * @return Does this field point to a type that has a table set? - */ - public boolean hasJOOQRecord(GenerationField field) { - return hasJOOQRecord(field.getTypeName()); - } - - /** - * @return Does this field point to an input type with a table set in the schema? - */ - public boolean hasInputJOOQRecord(GenerationField field) { - return Optional.ofNullable(getInputType(field)).map(InputDefinition::hasTable).orElse(false); - } - - /** - * @return Does this type name point to a type with a Java record? - */ - public boolean hasJavaRecord(String typeName) { - return Optional.ofNullable(getRecordType(typeName)).map(RecordObjectSpecification::hasJavaRecordReference).orElse(false); - } - - /** - * @return Does this field point to a type with a Java record set in the schema? - */ - public boolean hasJavaRecord(GenerationField field) { - return hasJavaRecord(field.getTypeName()); - } - - /** - * @return Does this field point to an input type with a record set in the schema? - */ - public boolean hasRecord(GenerationField field) { - return hasRecord(field.getTypeName()); - } - - public boolean hasRecord(String typeName){ - return Optional.ofNullable(getRecordType(typeName)).map(RecordObjectSpecification::hasRecordReference).orElse(false); - } - - /** - * @return Is this an ordered multi-key query? - */ - public boolean isOrderedMultiKeyQuery(GenerationField field) { - RecordObjectSpecification<?> type = getRecordType(field.getTypeName()); - boolean hasTable = type != null && type.hasTable(); - return field.isIterableWrapped() && field.createsDataFetcher() - && (hasJavaRecord(field.getContainerTypeName()) || !isObjectWithPreviousTableObject(field.getContainerTypeName())) - && hasTable; - } - - /** - * @return Get an input type with this name. - */ - public InputDefinition getInputType(String name) { - return inputs.get(name); - } - - /** - * @return Get the input type that this field points to. - */ - public InputDefinition getInputType(GenerationField field) { - return inputs.get(field.getTypeName()); - } - - /** - * @return Does this name belong to a union type in the schema? - */ - public boolean isUnion(String name) { - return unions.containsKey(name) || isConnectionObject(name) && isUnion(getConnectionObject(name).getNodeType()); - } - - /** - * @return Does this field belong to a union type in the schema? - */ - public boolean isUnion(FieldSpecification field) { - return isUnion(field.getTypeName()); - } - - /** - * @return Does this name belong to a union type containing only error types? - */ - public boolean isExceptionUnion(String name) { - if (!isUnion(name)) { - return false; - } - return getUnion(name).getFieldTypeNames().stream().allMatch(this::isException); // What if only some match? - } - - /** - * @return Does this name belong to an exception type or a union type containing only error types? - */ - public boolean isExceptionOrExceptionUnion(String name) { - return isException(name) || isExceptionUnion(name); - } - - /** - * @return Does this field belong to an exception type or a union type containing only error types? - */ - public boolean isExceptionOrExceptionUnion(FieldSpecification field) { - return isExceptionOrExceptionUnion(field.getTypeName()); - } - - /** - * @return Get a union type with this name. - */ - public UnionDefinition getUnion(String name) { - return unions.get(isConnectionObject(name) ? getConnectionObject(name).getNodeType() : name); - } - - /** - * @return Get a union type that this field points to. - */ - public UnionDefinition getUnion(GenerationField field) { - return getUnion(field.getTypeName()); - } - - /** - * @return Get all union types keyed by name. - */ - public Map<String, UnionDefinition> getUnions() { - return unions; - } - - /** - * @return Does this name belong to a scalar in the schema? - */ - public boolean isScalar(String name) { - return scalarTypes.contains(name); - } - - /** - * @return Is this field a scalar in the schema? - */ - public boolean isScalar(GenerationField field) { - return scalarTypes.contains(field.getTypeName()); - } - - /** - * @return The Query type. - */ - public ObjectDefinition getQueryType() { - return queryType; - } - - /** - * @return The Mutation type, if it exists. - */ - public ObjectDefinition getMutationType() { - return mutationType; - } - - /** - * @return The root schema type, if it exists. - */ - public no.sikt.graphitron.definitions.objects.SchemaDefinition getSchemaType() { - return rootSchemaObject; - } - - /** - * @return Does this name point to a type that may have a record set? - */ - public boolean isRecordType(String name) { - return recordTypes.containsKey(isConnectionObject(name) ? getConnectionObject(name).getNodeType() : name); - } - - /** - * @return Does this field point to a type that may have a record set? - */ - public boolean isRecordType(FieldSpecification field) { - return isRecordType(field.getTypeName()); - } - - /** - * @return Find the type this field refers to. - */ - public RecordObjectSpecification<?> getRecordType(String name) { - return recordTypes.get(isConnectionObject(name) ? getConnectionObject(name).getNodeType() : name); - } - - /** - * @return Find the type this field refers to. - */ - public RecordObjectSpecification<?> getRecordType(GenerationField field) { - return getRecordType(field.getTypeName()); - } - - /** - * @return Does this schema import federation and have the _entities field? - */ - public boolean federationEntitiesExist() { - return federationEntitiesExist; - } - - /** - * @return All types which could potentially have tables. - */ - public Map<String, RecordObjectSpecification<? extends GenerationField>> getRecordTypes() { - return recordTypes; - } - - /** - * @return Whether a field is a node ID field using NodeIdStrategy - */ - public boolean isNodeIdField(GenerationField field) { - return GeneratorConfig.shouldMakeNodeStrategy() && field.hasNodeID(); - } - - /** - * @param field the {@link GenerationField} to resolve the node type for - * @return the corresponding {@link RecordObjectSpecification}, or {@code null} if not found - */ - public Optional<ObjectDefinition> getNodeTypeForNodeIdField(GenerationField field) { - if (!field.hasNodeID()) return Optional.empty(); - - if (field.getNodeIdTypeName().isPresent()) { - return Optional.ofNullable(getNodeType(field.getNodeIdTypeName().get())); - } - - // Object field with implicit typeName - if (field instanceof ObjectField) { - return Optional.ofNullable(getNodeType(field.getContainerTypeName())); - } - - // Input field with implicit typeName - var types = Optional.ofNullable(getRecordType(field.getContainerTypeName())) - .map(RecordObjectSpecification::getTable) - .map(this::getNodeTypesWithTable) - .orElse(List.of()); - if (types.size() != 1) { - return Optional.empty(); - } - return types.stream().findFirst(); - } - - /** - * Finds node type for a node ID field. If not found an error is thrown. - * @param field The {@link GenerationField} to resolve the node type for. The field must be a node ID field. - * @return the corresponding {@link RecordObjectSpecification} - */ - public ObjectDefinition getNodeTypeForNodeIdFieldOrThrow(GenerationField field) { - return getNodeTypeForNodeIdField(field).orElseThrow(() -> new RuntimeException("Cannot find node type for node ID field " + field.formatPath())); - } - - /** - * Finds node type for a node ID field. If not found an error is thrown. - * @param field The {@link GenerationField} to resolve the node type for. The field must be a node ID field. - * @return the corresponding {@link RecordObjectSpecification} - */ - public NodeConfiguration getNodeConfigurationForNodeIdFieldOrThrow(GenerationField field) { - return getNodeConfigurationForTypeOrThrow(getNodeTypeForNodeIdFieldOrThrow(field)); - } - - /** - * Returns the {@link NodeConfiguration} for the given type name, or throws if the {@code @node} configuration is missing. - * @param typeName the name of a node type in the schema - * @return the node configuration for the type - */ - public NodeConfiguration getNodeConfigurationForTypeOrThrow(String typeName) { - return getNodeConfigurationForTypeOrThrow(getNodeType(typeName)); - } - - /** - * Returns the {@link NodeConfiguration} for the given object, or throws if the {@code @node} configuration is missing. - * @param object the record object to retrieve the node configuration from - * @return the node configuration for the object - */ - public NodeConfiguration getNodeConfigurationForTypeOrThrow(RecordObjectSpecification<?> object) { - return object.getNodeConfiguration() - .orElseThrow(() -> new IllegalStateException(String.format( - "Expected type '%s' to have @%s configuration, but it is unexpectedly null. Has validation been skipped?", - object.getName(), NODE.getName() - ))); - } - - /** - * @return Is this field the federation _service field? - */ - public boolean isFederationService(GenerationField target) { - return target.getName().equals(FEDERATION_SERVICE_FIELD.getName()) - && target.getTypeName().equals(FEDERATION_SERVICE_TYPE.getName()) - && target.getContainerTypeName().equals(SCHEMA_QUERY.getName()); - } - - /** - * @param object Object that should be mapped to a connection object. - * @return The original object transformed to a connection object. - */ - private ConnectionObjectDefinition getSearchObjectDefinitionFor(ObjectTypeDefinition object) { - var nodeFieldType = object - .getFieldDefinitions() - .stream() - .filter(it -> it.getName().equalsIgnoreCase(GraphQLReservedName.CONNECTION_EDGE_FIELD.getName())) - .findFirst() - .orElseThrow(() -> new IllegalArgumentException(object.getName() + " has no '" + GraphQLReservedName.CONNECTION_EDGE_FIELD.getName() + "' field.")) - .getType(); - var edge = new EdgeObjectDefinition(objects.get(new FieldType(nodeFieldType).getName()).getTypeDefinition()); - return new ConnectionObjectDefinition(object, edge); - } - - /** - * Resolved structure of an @orderBy input type, containing the enum definition and the actual fields. - */ - public record ResolvedOrderInput(OrderByEnumDefinition enumDefinition, InputField orderByField, InputField directionField) {} - - /** - * @return The resolved order input structure for the given orderInputField, with the enum definition - * and the actual fields for the orderBy enum and direction. - * Assumes the input type structure has been validated by {@link ProcessedDefinitionsValidator}. - */ - public ResolvedOrderInput getResolvedOrderInput(InputField orderInputField) { - var enumFields = getInputType(orderInputField).getFields().stream() - .filter(this::isEnum) - .toList(); - - var orderByField = enumFields.stream() - .filter(f -> getEnum(f).isOrderByEnum()) - .findFirst() - .orElseThrow(); - var directionField = enumFields.stream() - .filter(f -> getEnum(f).isDirectionEnum()) - .findFirst() - .orElseThrow(); - - return new ResolvedOrderInput( - OrderByEnumDefinition.from(getEnum(orderByField)), - orderByField, - directionField); - } - - /** - * @return The closest table on or above this object. Assumes only one table can be associated with the object. - */ - public RecordObjectSpecification<?> getPreviousTableObjectForObject(RecordObjectSpecification<?> object) { - return objectWithPreviousTable.get(object.getName()); - } - - /** - * @return The closest table on or above this field. Assumes only one table can be associated with the object. - */ - public RecordObjectSpecification<?> getPreviousTableObjectForField(GenerationField field) { - return objectWithPreviousTable.get(field.getContainerTypeName()); - } - - /** - * @return Whether the field's container type has a table on or above it in the schema hierarchy. - */ - public boolean isFieldWithPreviousTableObject(GenerationField field) { - return objectWithPreviousTable.containsKey(field.getContainerTypeName()); - } - - /** - * @return Returns whether the object has a table on or above it. - */ - public boolean hasTableObjectForObject(RecordObjectSpecification<?> object) { - return objectWithPreviousTable.containsKey(object.getName()); - } - - /* - * @return Returns whether name belongs to an object with a previous table - */ - public boolean isObjectWithPreviousTableObject(String name) { - return isObject(name) && objectWithPreviousTable.containsKey(name); - } - - public boolean isObjectOrConnectionNodeWithPreviousTableObject(String name) { - return (isObject(name) || isConnectionObject(name)) && objectWithPreviousTable.containsKey(name); - } - - public boolean isReferenceResolverField(ObjectField field) { - return field.createsDataFetcher() && isObjectOrConnectionNodeWithPreviousTableObject(field.getContainerTypeName()); - } - - /** - * Determines whether the field requires a correlated subquery in the generated database query. - * <p> - * A correlated subquery is needed when resolving the field requires joining to a different table - * or fetching data that cannot be selected directly from the current table context. - * <p> - * Returns {@code true} when any of the following conditions are met: - * <ul> - * <li>The field has explicit references via {@code @references} directive</li> - * <li>The field's type maps to a different table than the current table (implicit reference)</li> - * <li>The field is a node ID reference field</li> - * <li>The field is a root query field with iterable-wrapped output and no parent table context</li> - * </ul> - * <p> - * - * @param field the field to check for subquery requirement - * @param currentTable the table context from which the field is being resolved - * @return {@code true} if resolving this field requires a correlated subquery, {@code false} otherwise - */ - public boolean invokesSubquery(GenerationField field, JOOQMapping currentTable) { - if (field.createsDataFetcher() || isExceptionOrExceptionUnion(field)) { - return false; - } - - var targetTableFromFieldType = Optional.ofNullable(getRecordType(field)).map(RecordObjectSpecification::getTable); - - boolean implicitReferenceFromFieldType = targetTableFromFieldType - .map(t -> !t.getTable().equals(currentTable)) - .orElse(false); - - // Field reference - if (field.hasFieldReferences() || implicitReferenceFromFieldType || isNodeIdReferenceField(field, this, currentTable)) { - return true; - } - - // Root query with wrapped, listed output - return Optional.ofNullable(getPreviousTableObjectForField(field)).isEmpty() && field.isIterableWrapped(); - } - - public boolean returnsList(ObjectField field) { - return field.isIterableWrapped() || field.hasPagination(); - } - - /** - * Simple method that tries to find a table reference in the input records. - * This is not very robust, but we need this to not break existing things. - * @return Table mapping for this context based on input records, if any exists. - */ - public List<JOOQMapping> findInputTables(GenerationField field) { - if (!(field instanceof ObjectField objectField)) { - return List.of(); - } - - return objectField - .getArguments() - .stream() - .filter(this::isRecordType) - .map(this::getRecordType) - .filter(RecordObjectSpecification::hasTable) - .map(RecordObjectSpecification::getTable) - .distinct() - .toList(); - } - - /** - * Finds the target field which the returned data from mutation should be outputted. - * In the case of the mutation field being a wrapper type, this method will find the correct field inside the wrapper type which will contain data. - * This method assumes there is maximum one level of nesting. - * @param initialTarget The mutation field - * @return The field which should contain the return data - */ - public Optional<ObjectField> inferDataTargetForMutation(ObjectField initialTarget) { - if (isScalar(initialTarget) || (isObject(initialTarget) && getObject(initialTarget).hasTable())) { - return Optional.of(initialTarget); - } - - var possibleMatches = getObject(initialTarget) - .getFields() - .stream() - .filter(it -> !isExceptionOrExceptionUnion(it)) - .toList(); - return possibleMatches.size() == 1 ? Optional.of(possibleMatches.get(0)) : Optional.empty(); - } - - public boolean isDeleteMutationWithReturning(ObjectField field) { - return field.hasMutationType() && field.getMutationType().equals(MutationType.DELETE) && !useJdbcBatchingForDeletes(); - } - - public boolean isInsertMutationWithReturning(ObjectField field) { - return field.hasMutationType() && field.getMutationType().equals(MutationType.INSERT) && !useJdbcBatchingForInserts(); - } - - /** - * Simple method that tries to find a table reference the field's type. - * @return Table mapping for this context based on the contents of the field's type records, if any exists. - */ - public boolean nextTypeTableExists(GenerationField field, Set<String> seen) { - if (!(field instanceof ObjectField objectField) || !isRecordType(objectField) || seen.contains(field.getName() + field.getContainerTypeName())) { - return false; - } - - var type = getRecordType(field); - if (type.hasTable()) { - return true; - } - seen.add(field.getName() + field.getContainerTypeName()); - - return getRecordType(objectField) - .getFields() - .stream() - .filter(this::isRecordType) - .anyMatch(it -> nextTypeTableExists(it, seen)); - } - - /** - * Create a map of which objects should be related to which tables. Note that this enforces that each type is only connected to one table. - */ - private void buildPreviousTableMap(RecordObjectSpecification<?> object) { - buildPreviousTableMap(object, null, new HashSet<>(), 0); - } - - private void buildPreviousTableMap(RecordObjectSpecification<?> object, RecordObjectSpecification<?> lastObject, HashSet<String> seenObjects, int recursion) { - recursionCheck(recursion); - if (!seenObjects.add(object.getName())) { - return; - } - - var tableObject = object.hasTable() ? object : lastObject; - if (tableObject != null) { - objectWithPreviousTable.put(object.getName(), tableObject); - } - - object - .getFields() - .stream() - .filter(this::isRecordType) - .map(this::getRecordType) - .filter(Objects::nonNull) - .filter(it -> !objectWithPreviousTable.containsKey(it.getName())) - .forEach(it -> buildPreviousTableMap(it, tableObject, seenObjects, recursion + 1)); - - object - .getFields() - .stream() - .filter(this::isInterface) - .map(this::getInterface) - .map(this::getImplementationsForInterface) - .flatMap(Collection::stream) - .filter(it -> !objectWithPreviousTable.containsKey(it.getName())) - .forEach(it -> buildPreviousTableMap(it, tableObject, seenObjects, recursion + 1)); - } - - /** - * For @record types reachable from @service fields, mark any @table-typed fields as implicit split queries. - * Also marks @service fields that directly return @table types as implicit split queries, so that - * the existing resolver-key-based DB fetch infrastructure handles the auto-fetch. - * Traverses through plain wrapper types (no @table, no @record) to find nested @record types. - */ - private void markImplicitSplitQueryFields() { - objects.values().stream() - .flatMap(obj -> obj.getFields().stream()) - .filter(GenerationSourceField::hasServiceReference) - .filter(this::isObject) - .forEach(serviceField -> { - if (hasTableObject(serviceField) && !serviceField.hasPagination() && !serviceField.createsDataFetcher()) { - serviceField.markAsImplicitSplitQuery(); - } - if (!hasJOOQRecord(serviceField) || hasTableObject(serviceField)) { - markImplicitSplitQueryFields(getObject(serviceField), new HashSet<>()); - } - }); - } - - private void markImplicitSplitQueryFields(ObjectDefinition type, Set<String> seen) { - if (type == null || !seen.add(type.getName())) { - return; - } - if (type.hasRecordReference()) { - type.getFields().stream() - .filter(field -> !field.createsDataFetcher()) - .filter(this::hasJOOQRecord) - .forEach(GenerationSourceField::markAsImplicitSplitQuery); - } - // Recurse into all non-@table object fields to find nested @record/@table types with @table fields. - type.getFields().stream() - .filter(field -> isObject(field) && !hasJOOQRecord(field) && !field.createsDataFetcher()) - .map(this::getObject) - .forEach(nested -> markImplicitSplitQueryFields(nested, seen)); - } - - /** - * @return List of all error types this type contains. - */ - @NotNull - public List<ObjectField> getAllErrors(String typeName) { - return getObject(typeName) - .getFields() - .stream() - .filter(this::isExceptionOrExceptionUnion) - .collect(Collectors.toList()); - } - - /** - * @return The error type or union of error types with this name if it exists. - */ - @NotNull - public AbstractObjectDefinition<?, ?> getErrorTypeDefinition(String name) { - return isUnion(name) ? getUnion(name) : getException(name); - } - - /** - * @return List of exception definitions that exists for this type name. If it is not a union, the list will only have one element. - */ - @NotNull - public List<ExceptionDefinition> getExceptionDefinitions(String name) { - if (!isUnion(name)) { - return List.of(getException(name)); - } - - return getUnion(name) - .getFieldTypeNames() - .stream() - .map(this::getException) - .collect(Collectors.toList()); - } - - public Map<String, no.sikt.graphitron.javapoet.TypeName> getAllContextFields(GenerationField field) { - var otherFields = field.getContextFields(); - var argumentFields = findNestedContextFields(!(field instanceof ObjectField) ? List.of() : ((ObjectField) field).getArguments(), 0); - return Stream - .concat(otherFields.entrySet().stream(), argumentFields) - .sorted(Map.Entry.comparingByKey()) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (x, y) -> y, LinkedHashMap::new)); - } - - private Stream<Map.Entry<String, no.sikt.graphitron.javapoet.TypeName>> findNestedContextFields(List<? extends InputField> fields, int recursion) { - recursionCheck(recursion); - if (fields.isEmpty()) { - return Stream.of(); - } - var nextFields = fields - .stream() - .filter(this::isInputType) - .map(this::getInputType) - .map(AbstractObjectDefinition::getFields) - .flatMap(Collection::stream) - .toList(); - var foundContext = fields.stream() - .map(GenerationSourceField::getContextFields) - .map(Map::entrySet) - .flatMap(Collection::stream); - return Stream.concat(foundContext, findNestedContextFields(nextFields, recursion + 1)); - } - - /** - * @return List of fields in the schema that may be used to generate transforms. - */ - public List<GenerationField> getTransformableFields() { - return transformableFields; - } - - private List<GenerationField> findTransformableFields() { - var fields = new ArrayList<GenerationField>(); - var query = getQueryType(); - if (query != null && !query.isExplicitlyNotGenerated()) { - query - .getFields() - .stream() - .flatMap(field -> findTransformableFields(field, false).stream()) - .forEach(fields::add); - } - - var mutation = getMutationType(); - if (mutation != null && !mutation.isExplicitlyNotGenerated()) { - mutation - .getFields() - .stream() - .flatMap(field -> findTransformableFields(field, true).stream()) - .forEach(fields::add); - } - return new ArrayList<>( - fields - .stream() - .filter(this::isRecordType) - .collect(Collectors.toMap(this::getRecordType, Function.identity(), (it1, it2) -> it1)) // Filter duplicates if multiple fields use the same record type. - .values() - ); - } - - /** - * @param field Field that are to be searched. - * @return List of fields that points to a type with the table or record directive set. - */ - private List<GenerationField> findTransformableFields(ObjectField field, boolean isMutation) { - // Note, do not check for conditions in this variable, it should not apply to object fields. Conditions should not affect return type mapping! - var canMapTable = isMutation || field.hasServiceReference(); - - var objects = findTransformableFields(field, new HashSet<>(), isMutation, canMapTable, false, false, 0).stream(); - var inputs = field - .getArguments() - .stream() - .flatMap(it -> findTransformableFields(it, new HashSet<>(), isMutation, canMapTable || hasRecord(it), false, field.hasCondition(), 0).stream()); - return Stream.concat(objects, inputs).collect(Collectors.toList()); - } - - private List<GenerationField> findTransformableFields( - GenerationField field, - HashSet<GenerationField> seen, - boolean isMutation, - boolean canMapTable, - boolean hadTable, - boolean hadMappableInputConfiguration, - int recursion - ) { - recursionCheck(recursion); - if (seen.contains(field)) { - return List.of(); - } - seen.add(field); - - var hasService = field.hasServiceReference(); - var hasMutationType = field.hasMutationType(); - var type = getRecordType(field); - if (!field.isInput() && hasMutationType || field.createsDataFetcher() && isMutation && !hasService || type == null) { - return List.of(); - } - - var hasCondition = field.hasCondition(); - var canMapTableHere = isMutation || hasService || hasCondition && field.isInput() || type.hasJavaRecordReference() || canMapTable || hadMappableInputConfiguration; - var notAlreadyWrappedInTable = !hadTable || !type.hasTable() || hadMappableInputConfiguration; - var array = new ArrayList<GenerationField>(); - if ((type.hasRecordReference() || hasService && !hasMutationType) && !field.isExplicitlyNotGenerated() && notAlreadyWrappedInTable && canMapTableHere) { - array.add(field); - } - - if (!field.isInput()) { - array.addAll(((ObjectField) field).getArguments().stream().flatMap(it -> - findTransformableFields( - it, - seen, - false, - !(hadTable || type.hasTable()), - hadTable || type.hasTable(), - true, - recursion + 1 - ).stream()).toList() - ); - } - - array.addAll(type.getFields().stream().flatMap(it -> - findTransformableFields( - it, - seen, - isMutation, - canMapTableHere && !(hadTable || type.hasTable()), - !canMapTableHere && (hadTable || type.hasTable()) && !it.createsDataFetcher(), - false, - recursion + 1 - ).stream()).toList() - ); - - return array; - } - - public boolean isFederationImported() { - return federationIsImported; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/AbstractTransformerDetectionTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/AbstractTransformerDetectionTest.java deleted file mode 100644 index 3211028a65..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/AbstractTransformerDetectionTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package no.sikt.graphitron.code; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.definitions.interfaces.FieldSpecification; - -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.*; -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_TABLE; -import static org.assertj.core.api.Assertions.assertThat; - -public abstract class AbstractTransformerDetectionTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "transformerdetection"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(DUMMY_RECORD, DUMMY_SERVICE, DUMMY_CONDITION); - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(CUSTOMER_TABLE); - } - - public List<String> getTransformableFieldNames(String schemaParentFolder, Set<SchemaComponent> extraComponents) { - return getProcessedSchema(schemaParentFolder, extraComponents) - .getTransformableFields() // Note that duplicate record type references are filtered away. - .stream() - .map(FieldSpecification::getName) - .collect(Collectors.toList()); - } - - protected void checkFoundNames(String path, String... expected) { - checkFoundNames(path, Set.of(), expected); - } - - protected void checkFoundNames(String path, Set<SchemaComponent> extraComponents, String... expected) { - // Uses isEqualTo because duplicate field names should be checked for as well. - assertThat(getTransformableFieldNames(path, extraComponents)).isEqualTo(List.of(expected)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/DataFetcherHelperTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/DataFetcherHelperTest.java deleted file mode 100644 index 758ea60017..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/DataFetcherHelperTest.java +++ /dev/null @@ -1,73 +0,0 @@ -package no.sikt.graphitron.code; - -import graphql.execution.ExecutionStepInfo; -import graphql.execution.MergedField; -import graphql.execution.ResultPath; -import graphql.language.Field; -import graphql.schema.DataFetchingEnvironment; -import graphql.schema.DataFetchingEnvironmentImpl; -import graphql.schema.GraphQLFieldDefinition; -import no.sikt.graphql.exception.ValidationViolationGraphQLException; -import no.sikt.graphql.helpers.resolvers.DataFetcherHelper; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; - -import java.util.List; - -import static graphql.Scalars.GraphQLInt; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -public class DataFetcherHelperTest { - private static final List<Object> - STRING_KEY_0 = List.of("A0", "A1", "A2"), - STRING_KEY_1 = List.of("B0", "B1", "B2"), - INT_KEY = List.of(0, 1, 2); - private final static GraphQLFieldDefinition FIELD = GraphQLFieldDefinition - .newFieldDefinition() - .name("testField") - .type(GraphQLInt) - .build(); - - private final static DataFetchingEnvironment ENV = DataFetchingEnvironmentImpl - .newDataFetchingEnvironment() - .fieldDefinition(FIELD) - .mergedField(MergedField.newMergedField().addField(Field.newField().name("testField").build()).build()) - .executionStepInfo( - ExecutionStepInfo - .newExecutionStepInfo() - .path(ResultPath.rootPath()) - .type(GraphQLInt) - .fieldDefinition(FIELD) - .build() - ) - .build(); - - @Test - public void mergeKeysEmptyKeysResultsInEmptyResult() { - assertThat(DataFetcherHelper.mergeKeys(List.of(), ENV)).isEmpty(); - } - - @Test - public void mergeKeysBuildsKeysForSingleKeySet() { - assertThat(DataFetcherHelper.mergeKeys(List.of(STRING_KEY_0), ENV)).isEqualTo(STRING_KEY_0); - } - - @Test - public void mergeKeysBuildsKeysForIntegers() { - assertThat(DataFetcherHelper.mergeKeys(List.of(INT_KEY), ENV)).isEqualTo(List.of("0", "1", "2")); - } - - @Test - public void mergeKeysBuildsKeysMultipleKeySets() { - assertThat(DataFetcherHelper.mergeKeys(List.of(STRING_KEY_0, STRING_KEY_1, INT_KEY), ENV)).isEqualTo(List.of("A0,B0,0", "A1,B1,1", "A2,B2,2")); - } - - @Test - @Disabled - public void mergeKeysThrowsErrorIfSetsDoNotMatchInSize() { - assertThatThrownBy(() -> DataFetcherHelper.mergeKeys(List.of(STRING_KEY_0, List.of(0)), ENV)) - .isInstanceOf(ValidationViolationGraphQLException.class); - //.hasMessage("Keys sets have differing lengths. For this type of query, each key field is required to be an array of equal length."); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/InputEnumConversionFunctionTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/InputEnumConversionFunctionTest.java deleted file mode 100644 index 80cbe22b3d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/InputEnumConversionFunctionTest.java +++ /dev/null @@ -1,76 +0,0 @@ -package no.sikt.graphitron.code; - -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.common.CodeBlockTest; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.DUMMY_ENUM; -import static no.sikt.graphitron.common.configuration.SchemaComponent.DUMMY_ENUM_CONVERTED; -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.toJOOQEnumConverter; - -@DisplayName("Query input enums - Enum conversion for queries") -public class InputEnumConversionFunctionTest extends CodeBlockTest { - public static final String EXPECTED_JOOQ = ".convert(fake.graphql.example.model.DummyEnumConverted.class, " + - "s -> no.sikt.graphql.helpers.query.QueryHelper.makeEnumMap(s, " + - "java.util.List.of(no.sikt.graphitron.codereferences.dummyreferences.DummyJOOQEnum.A, no.sikt.graphitron.codereferences.dummyreferences.DummyJOOQEnum.B, no.sikt.graphitron.codereferences.dummyreferences.DummyJOOQEnum.C), " + - "java.util.List.of(fake.graphql.example.model.DummyEnumConverted.A, fake.graphql.example.model.DummyEnumConverted.B, fake.graphql.example.model.DummyEnumConverted.C))," + - "s -> no.sikt.graphql.helpers.query.QueryHelper.makeEnumMap(s, " + - "java.util.List.of(fake.graphql.example.model.DummyEnumConverted.A, fake.graphql.example.model.DummyEnumConverted.B, fake.graphql.example.model.DummyEnumConverted.C), " + - "java.util.List.of(no.sikt.graphitron.codereferences.dummyreferences.DummyJOOQEnum.A, no.sikt.graphitron.codereferences.dummyreferences.DummyJOOQEnum.B, no.sikt.graphitron.codereferences.dummyreferences.DummyJOOQEnum.C)))"; - public static final String EXPECTED_STRING = ".convert(fake.graphql.example.model.DummyEnum.class," + - "s -> no.sikt.graphql.helpers.query.QueryHelper.makeEnumMap(s, " + - "java.util.List.of(\"A\", \"B\", \"C\"), " + - "java.util.List.of(fake.graphql.example.model.DummyEnum.A, fake.graphql.example.model.DummyEnum.B, fake.graphql.example.model.DummyEnum.C))," + - "s -> no.sikt.graphql.helpers.query.QueryHelper.makeEnumMap(s, " + - "java.util.List.of(fake.graphql.example.model.DummyEnum.A, fake.graphql.example.model.DummyEnum.B, fake.graphql.example.model.DummyEnum.C), " + - "java.util.List.of(\"A\", \"B\", \"C\")))"; - public static final String EXPECTED_STRING_MIXED_CASE = ".convert(fake.graphql.example.model.MixedCaseEnum.class," + - "s -> no.sikt.graphql.helpers.query.QueryHelper.makeEnumMap(s, " + - "java.util.List.of(\"UPPER\", \"lower\", \"mIxEd\"), " + - "java.util.List.of(fake.graphql.example.model.MixedCaseEnum.UPPER, fake.graphql.example.model.MixedCaseEnum.LOWER, fake.graphql.example.model.MixedCaseEnum.MIXED))," + - "s -> no.sikt.graphql.helpers.query.QueryHelper.makeEnumMap(s, " + - "java.util.List.of(fake.graphql.example.model.MixedCaseEnum.UPPER, fake.graphql.example.model.MixedCaseEnum.LOWER, fake.graphql.example.model.MixedCaseEnum.MIXED), " + - "java.util.List.of(\"UPPER\", \"lower\", \"mIxEd\")))"; - - @Override - protected String getSubpath() { - return "queries/fetch/enums/input"; - } - - @Override - protected CodeBlock makeCodeBlock(ProcessedSchema schema) { - var field = schema - .getQueryType() - .getFields() - .stream() - .flatMap(it -> it.getArguments().stream()) - .filter(schema::isEnum) - .findFirst() - .orElse(null); - if (field == null) { - return CodeBlock.empty(); - } - - return toJOOQEnumConverter(field.getTypeName(), schema); - } - - @Test - @DisplayName("jOOQ enum converter") - public void jOOQ() { - compareCodeBlockResult("jOOQ", EXPECTED_JOOQ, DUMMY_ENUM_CONVERTED); - } - - @Test - @DisplayName("String enum converter") - public void string() { - compareCodeBlockResult("string", EXPECTED_STRING, DUMMY_ENUM); - } - - @Test - @DisplayName("String enum converter with mixed case") - public void stringMixedCase() { - compareCodeBlockResult("stringMixedCase", EXPECTED_STRING_MIXED_CASE); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/MapperEnumConversionFunctionTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/MapperEnumConversionFunctionTest.java deleted file mode 100644 index cb2fb652cc..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/MapperEnumConversionFunctionTest.java +++ /dev/null @@ -1,165 +0,0 @@ -package no.sikt.graphitron.code; - -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.common.CodeBlockTest; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.DUMMY_SERVICE; -import static no.sikt.graphitron.common.configuration.ReferencedEntry.MAPPER_RECORD_ENUM; -import static no.sikt.graphitron.common.configuration.SchemaComponent.DUMMY_ENUM; -import static no.sikt.graphitron.common.configuration.SchemaComponent.DUMMY_ENUM_CONVERTED; -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.toGraphEnumConverter; - -@DisplayName("Graph enums - Enum conversion when mapping enums") -public class MapperEnumConversionFunctionTest extends CodeBlockTest { - @Override - protected String getSubpath() { - return "enums"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(DUMMY_SERVICE, MAPPER_RECORD_ENUM); - } - - @Override - protected CodeBlock makeCodeBlock(ProcessedSchema schema) { - var field = schema - .getRecordType("Dummy") - .getFields() - .stream() - .filter(schema::isEnum) - .findFirst() - .orElse(null); - if (field == null) { - return CodeBlock.empty(); - } - - return toGraphEnumConverter(field.getTypeName(), CodeBlock.of(field.getName()), field.isInput(), schema); - } - - @Test - @DisplayName("Graph jOOQ enum converter") - public void toGraphJOOQ() { - compareCodeBlockResult( - "tograph/jOOQ", - "no.sikt.graphql.helpers.query.QueryHelper.makeEnumMap(e, " + - "java.util.List.of(" + - "no.sikt.graphitron.codereferences.dummyreferences.DummyJOOQEnum.A, " + - "no.sikt.graphitron.codereferences.dummyreferences.DummyJOOQEnum.B, " + - "no.sikt.graphitron.codereferences.dummyreferences.DummyJOOQEnum.C), " + - "java.util.List.of(" + - "fake.graphql.example.model.DummyEnumConverted.A, " + - "fake.graphql.example.model.DummyEnumConverted.B, " + - "fake.graphql.example.model.DummyEnumConverted.C))", - DUMMY_ENUM_CONVERTED - ); - } - - @Test - @DisplayName("Graph jOOQ listed enum converter") - public void toGraphJOOQListed() { - compareCodeBlockResult( - "tograph/jOOQListed", - "no.sikt.graphql.helpers.query.QueryHelper.makeEnumMap(e, " + - "java.util.List.of(" + - "no.sikt.graphitron.codereferences.dummyreferences.DummyJOOQEnum.A, " + - "no.sikt.graphitron.codereferences.dummyreferences.DummyJOOQEnum.B, " + - "no.sikt.graphitron.codereferences.dummyreferences.DummyJOOQEnum.C), " + - "java.util.List.of(" + - "fake.graphql.example.model.DummyEnumConverted.A, " + - "fake.graphql.example.model.DummyEnumConverted.B, " + - "fake.graphql.example.model.DummyEnumConverted.C))", - DUMMY_ENUM_CONVERTED - ); - } - - @Test - @DisplayName("Graph string enum converter") - public void toGraphString() { - compareCodeBlockResult( - "tograph/string", - "no.sikt.graphql.helpers.query.QueryHelper.makeEnumMap(e, " + - "java.util.List.of(\"A\", \"B\", \"C\"), " + - "java.util.List.of(fake.graphql.example.model.DummyEnum.A, fake.graphql.example.model.DummyEnum.B, fake.graphql.example.model.DummyEnum.C))", - DUMMY_ENUM - ); - } - - @Test - @DisplayName("Graph string listed enum converter") - public void toGraphStringListed() { - compareCodeBlockResult( - "tograph/stringListed", - "no.sikt.graphql.helpers.query.QueryHelper.makeEnumMap(e, " + - "java.util.List.of(\"A\", \"B\", \"C\"), " + - "java.util.List.of(fake.graphql.example.model.DummyEnum.A, fake.graphql.example.model.DummyEnum.B, fake.graphql.example.model.DummyEnum.C))", - DUMMY_ENUM - ); - } - - @Test - @DisplayName("Record jOOQ enum converter") - public void toRecordJOOQ() { - compareCodeBlockResult( - "torecord/jOOQ", - "no.sikt.graphql.helpers.query.QueryHelper.makeEnumMap(e, " + - "java.util.List.of(" + - "fake.graphql.example.model.DummyEnumConverted.A, " + - "fake.graphql.example.model.DummyEnumConverted.B, " + - "fake.graphql.example.model.DummyEnumConverted.C), " + - "java.util.List.of(" + - "no.sikt.graphitron.codereferences.dummyreferences.DummyJOOQEnum.A, " + - "no.sikt.graphitron.codereferences.dummyreferences.DummyJOOQEnum.B, " + - "no.sikt.graphitron.codereferences.dummyreferences.DummyJOOQEnum.C))", - DUMMY_ENUM_CONVERTED - ); - } - - @Test - @DisplayName("jOOQ listed enum converter") - public void toRecordJOOQListed() { - compareCodeBlockResult( - "torecord/jOOQListed", - "no.sikt.graphql.helpers.query.QueryHelper.makeEnumMap(e, " + - "java.util.List.of(" + - "fake.graphql.example.model.DummyEnumConverted.A, " + - "fake.graphql.example.model.DummyEnumConverted.B, " + - "fake.graphql.example.model.DummyEnumConverted.C), " + - "java.util.List.of(" + - "no.sikt.graphitron.codereferences.dummyreferences.DummyJOOQEnum.A, " + - "no.sikt.graphitron.codereferences.dummyreferences.DummyJOOQEnum.B, " + - "no.sikt.graphitron.codereferences.dummyreferences.DummyJOOQEnum.C))", - DUMMY_ENUM_CONVERTED - ); - } - - @Test - @DisplayName("Record string enum converter") - public void toRecordString() { - compareCodeBlockResult( - "torecord/string", - "no.sikt.graphql.helpers.query.QueryHelper.makeEnumMap(e, " + - "java.util.List.of(fake.graphql.example.model.DummyEnum.A, fake.graphql.example.model.DummyEnum.B, fake.graphql.example.model.DummyEnum.C), " + - "java.util.List.of(\"A\", \"B\", \"C\"))", - DUMMY_ENUM - ); - } - - @Test - @DisplayName("Record string listed enum converter") - public void toRecordStringListed() { - compareCodeBlockResult( - "torecord/stringListed", - "no.sikt.graphql.helpers.query.QueryHelper.makeEnumMap(e, " + - "java.util.List.of(fake.graphql.example.model.DummyEnum.A, fake.graphql.example.model.DummyEnum.B, fake.graphql.example.model.DummyEnum.C), " + - "java.util.List.of(\"A\", \"B\", \"C\"))", - DUMMY_ENUM - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/OutputEnumConversionFunctionTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/OutputEnumConversionFunctionTest.java deleted file mode 100644 index b3daab071d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/OutputEnumConversionFunctionTest.java +++ /dev/null @@ -1,55 +0,0 @@ -package no.sikt.graphitron.code; - -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.common.CodeBlockTest; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import static no.sikt.graphitron.code.InputEnumConversionFunctionTest.*; -import static no.sikt.graphitron.common.configuration.SchemaComponent.DUMMY_ENUM; -import static no.sikt.graphitron.common.configuration.SchemaComponent.DUMMY_ENUM_CONVERTED; -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.toJOOQEnumConverter; - -@DisplayName("Query output enums - Enum conversion for queries") -public class OutputEnumConversionFunctionTest extends CodeBlockTest { - @Override - protected String getSubpath() { - return "queries/fetch/enums/output"; - } - - @Override - protected CodeBlock makeCodeBlock(ProcessedSchema schema) { - var field = schema - .getQueryType() - .getFields() - .stream() - .flatMap(it -> schema.getObject(it).getFields().stream()) - .filter(schema::isEnum) - .findFirst() - .orElse(null); - if (field == null) { - return CodeBlock.empty(); - } - - return toJOOQEnumConverter(field.getTypeName(), schema); - } - - @Test - @DisplayName("jOOQ enum converter") - public void jOOQ() { - compareCodeBlockResult("jOOQ", EXPECTED_JOOQ, DUMMY_ENUM_CONVERTED); // Makes sure it is the same for output as input. - } - - @Test - @DisplayName("String enum converter") - public void string() { - compareCodeBlockResult("string", EXPECTED_STRING, DUMMY_ENUM); - } - - @Test - @DisplayName("String enum converter with mixed case") - public void stringMixedCase() { - compareCodeBlockResult("stringMixedCase", EXPECTED_STRING_MIXED_CASE); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/RoutineReflectionTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/RoutineReflectionTest.java deleted file mode 100644 index 6fb96b0a1b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/RoutineReflectionTest.java +++ /dev/null @@ -1,138 +0,0 @@ -package no.sikt.graphitron.code; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.mappings.RoutineReflection; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.math.BigDecimal; -import java.time.LocalDate; -import java.util.List; - -import static no.sikt.graphitron.common.configuration.TestConfiguration.setProperties; -import static no.sikt.graphitron.mappings.RoutineReflection.*; -import static org.assertj.core.api.Assertions.assertThat; - -@DisplayName("Reflection - Use reflection on jOOQ routine code") -public class RoutineReflectionTest { - @BeforeEach - public void setup() { - setProperties(); - } - - @AfterEach - public void destroy() { - GeneratorConfig.clear(); - } - - @Test - @DisplayName("Resolves a unique routine by bare name") - public void resolveUniqueByBareName() { - assertThat(resolveRoutine("get_customer_balance")).hasSize(1); - assertThat(resolveRoutine("inventory_in_stock")).hasSize(1); - } - - @Test - @DisplayName("Matching is case-insensitive") - public void resolveIsCaseInsensitive() { - assertThat(resolveRoutine("GET_CUSTOMER_BALANCE")).hasSize(1); - assertThat(resolveRoutine("Get_Customer_Balance")).hasSize(1); - } - - @Test - @DisplayName("Returns empty for unknown routine name") - public void resolveUnknownReturnsEmpty() { - assertThat(resolveRoutine("no_such_routine")).isEmpty(); - } - - @Test - @DisplayName("Returns multiple matches when the same routine exists in multiple schemas") - public void resolveAmbiguousAcrossSchemas() { - // last_day exists in both public and utils (see test fixture) - var matches = resolveRoutine("last_day"); - assertThat(matches).hasSize(2); - assertThat(matches.stream().map(RoutineReflection::schemaFromProcedure).sorted().toList()) - .containsExactly("public", "utils"); - } - - @Test - @DisplayName("Schema-qualified lookup disambiguates colliding routines") - public void resolveQualifiedDisambiguates() { - var publicLastDay = resolveRoutine("public.last_day"); - var utilsLastDay = resolveRoutine("utils.last_day"); - assertThat(publicLastDay).hasSize(1); - assertThat(utilsLastDay).hasSize(1); - assertThat(publicLastDay.get(0)).isNotEqualTo(utilsLastDay.get(0)); - } - - @Test - @DisplayName("Schema-qualified lookup works for non-colliding routines too") - public void resolveQualifiedForUniqueRoutine() { - assertThat(resolveRoutine("public.get_customer_balance")).hasSize(1); - assertThat(resolveRoutine("utils.only_here")).hasSize(1); - } - - @Test - @DisplayName("Schema-qualified lookup returns empty when the schema does not contain the routine") - public void resolveQualifiedWrongSchema() { - // only_here exists only in utils, not in public - assertThat(resolveRoutine("public.only_here")).isEmpty(); - // get_customer_balance exists only in public, not in utils - assertThat(resolveRoutine("utils.get_customer_balance")).isEmpty(); - } - - @Test - @DisplayName("Null and blank inputs resolve to empty") - public void resolveNullAndBlank() { - assertThat(resolveRoutine(null)).isEmpty(); - assertThat(resolveRoutine("")).isEmpty(); - assertThat(resolveRoutine(" ")).isEmpty(); - } - - @Test - @DisplayName("Functions have return parameters") - public void functionHasReturnParameter() { - var key = uniqueMatch(resolveRoutine("get_customer_balance")); - assertThat(isFunction(key)).isTrue(); - assertThat(getReturnType(key)).hasValue(BigDecimal.class); - } - - @Test - @DisplayName("Can get return type for different functions") - public void getReturnTypes() { - assertThat(getReturnType(uniqueMatch(resolveRoutine("inventory_in_stock")))).hasValue(Boolean.class); - assertThat(getReturnType(uniqueMatch(resolveRoutine("public.last_day")))).hasValue(LocalDate.class); - } - - @Test - @DisplayName("Can get IN parameters for a routine") - public void getInParametersForRoutine() { - var params = getInParameters(uniqueMatch(resolveRoutine("get_customer_balance"))); - assertThat(params).hasSize(2); - assertThat(params.get(0).getName()).isEqualTo("p_customer_id"); - assertThat(params.get(1).getName()).isEqualTo("p_effective_date"); - } - - @Test - @DisplayName("Can get IN parameters for single-parameter routine") - public void getInParametersForSingleParamRoutine() { - var params = getInParameters(uniqueMatch(resolveRoutine("inventory_in_stock"))); - assertThat(params).hasSize(1); - assertThat(params.get(0).getName()).isEqualTo("p_inventory_id"); - assertThat(params.get(0).getType()).isEqualTo(Long.class); - } - - @Test - @DisplayName("Returns empty for non-existent routine parameters") - public void emptyForNonExistentRoutineParameters() { - assertThat(getInParameters("no_such_schema.no_such_routine")).isEmpty(); - assertThat(getOutParameters("no_such_schema.no_such_routine")).isEmpty(); - } - - private static String uniqueMatch(List<String> matches) { - assertThat(matches).hasSize(1); - return matches.get(0); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/TableReflectionTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/TableReflectionTest.java deleted file mode 100644 index 68b1ed2739..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/TableReflectionTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package no.sikt.graphitron.code; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import static no.sikt.graphitron.common.configuration.TestConfiguration.setProperties; -import static no.sikt.graphitron.mappings.TableReflection.searchTableForKeyMethodNameGivenJavaFieldNames; -import static no.sikt.graphitron.mappings.TableReflection.searchTableForMethodWithName; -import static org.assertj.core.api.Assertions.assertThat; - -@DisplayName("Reflection - Use reflection on jOOQ code") -public class TableReflectionTest { - @BeforeEach - public void setup() { - setProperties(); - } - - @AfterEach - public void destroy() { - GeneratorConfig.clear(); - } - - @Test - @DisplayName("Can find a method name for a key that exists") - public void findMethodForExistingKey() { - assertThat(searchTableForKeyMethodNameGivenJavaFieldNames("CUSTOMER", "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY")).hasValue("address"); - } - - - @Test - @DisplayName("Finds no method if table is provided when key is expected or key does not exist") - public void findNothingForNotKeys() { - assertThat(searchTableForKeyMethodNameGivenJavaFieldNames("RENTAL", "INVENTORY")).isEmpty(); - assertThat(searchTableForKeyMethodNameGivenJavaFieldNames("RENTAL", "NONEXISTENT")).isEmpty(); - } - - @Test - @DisplayName("Can find a method name for a key or table that exists") - public void findMethodForExistingKeyOrTable() { - assertThat(searchTableForMethodWithName("CUSTOMER", "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY")).hasValue("address"); - assertThat(searchTableForMethodWithName("RENTAL", "inventory")).hasValue("inventory"); - } - - @Test - @DisplayName("Finds no method if provided value does not exist") - public void findNothingForInvalidName() { - assertThat(searchTableForMethodWithName("RENTAL", "NONEXISTENT")).isEmpty(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/TransformerDetectionMutationTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/TransformerDetectionMutationTest.java deleted file mode 100644 index c9b50a8013..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/TransformerDetectionMutationTest.java +++ /dev/null @@ -1,88 +0,0 @@ -package no.sikt.graphitron.code; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("ProcessedSchema - Can find mutation fields that can be used for transformer generation") -public class TransformerDetectionMutationTest extends AbstractTransformerDetectionTest { - @Override - protected String getSubpath() { - return super.getSubpath() + "/mutation"; - } - - @Test - @DisplayName("Java records in mutation services") - public void serviceWithJavaRecordOutputs() { - checkFoundNames( - "tograph/serviceWithJavaRecords", - Set.of(WRAPPED_ADDRESS_JAVA), - "addresses", - "mutation", - "addressesWrapped", - "cityRecord" - ); - } - - @Test - @DisplayName("jOQQ records in mutation services") - public void serviceWithJOOQRecordOutputs() { - checkFoundNames( - "tograph/serviceWithJOOQRecords", - Set.of(WRAPPED_ADDRESS_JOOQ), - "addresses", - "mutation", - "addressesWrapped", - "cityRecord" - ); - } - - @Test - @DisplayName("Java record inputs in mutation queries") - public void serviceWithJavaRecordInputs() { - checkFoundNames("torecord/serviceWithJavaRecords", Set.of(CITY_INPUTS_JAVA), "cityInput", "city", "city"); - } - - @Test - @DisplayName("jOOQ record inputs in mutation queries") - public void serviceWithJOOQRecordInputs() { - checkFoundNames("torecord/serviceWithJOOQRecords", Set.of(CITY_INPUTS_JOOQ), "cityInput", "city", "city"); - } - - @Test - @DisplayName("Records in non-root fetch services") - public void serviceRecordsOnSplitQuery() { - checkFoundNames( - "serviceRecordsOnSplitQuery", - Set.of(DUMMY_TYPE_RECORD, DUMMY_INPUT_RECORD, CUSTOMER_TABLE, CUSTOMER_INPUT_TABLE), - "mutation", "mutation1", "input1", "mutation2", "input2" - ); - } - - @Test - @DisplayName("Service without outer record wrapping and split query field") - public void serviceWithoutRecordOutput() { - checkFoundNames("tograph/serviceWithoutOuterRecord", "customer1", "edit1", "edit2"); - } - - @Test - @DisplayName("Finds records when middle input has no record set") - public void middleInputWithoutRecord() { - checkFoundNames("torecord/middleInputWithoutRecord", "level3A", "level3B", "level1"); - } - - @Test - @DisplayName("Finds records when middle output has no record set") - public void middleOutputWithoutRecord() { - checkFoundNames("tograph/middleOutputWithoutRecord", "level3A", "level3B", "mutation"); - } - - @Test - @DisplayName("Finds layered jOOQ records") // Allowed for mutation inputs - public void layeredInputJOOQRecords() { - checkFoundNames("torecord/layeredInputJOOQRecords", "level3", "level1", "level2"); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/TransformerDetectionQueryTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/TransformerDetectionQueryTest.java deleted file mode 100644 index 3149c60390..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/TransformerDetectionQueryTest.java +++ /dev/null @@ -1,125 +0,0 @@ -package no.sikt.graphitron.code; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("ProcessedSchema - Can find query fields that can be used for transformer generation") -public class TransformerDetectionQueryTest extends AbstractTransformerDetectionTest { - @Override - protected String getSubpath() { - return super.getSubpath() + "/query"; - } - - @Test - @DisplayName("Java records in fetch services") - public void serviceWithJavaRecordOutputs() { - checkFoundNames( - "tograph/serviceWithJavaRecords", - Set.of(WRAPPED_ADDRESS_JAVA), - "addresses", - "query", - "addressesWrapped", - "city", - "cityRecord" - ); - } - - @Test - @DisplayName("jOQQ records in fetch services") - public void serviceWithJOOQRecordOutputs() { - checkFoundNames( - "tograph/serviceWithJOOQRecords", - Set.of(WRAPPED_ADDRESS_JOOQ), - "addresses", - "query", - "addressesWrapped", - "cityRecord" - ); - } - - @Test - @DisplayName("Java records in fetch queries with conditions") - public void conditionAndJavaRecords() { - checkFoundNames("torecord/conditionAndJavaRecords", Set.of(CITY_INPUTS_JAVA), "cityInput", "city", "city"); - } - - @Test - @DisplayName("jOOQ records in fetch queries with conditions") - public void conditionAndJOOQRecords() { - checkFoundNames("torecord/conditionAndJOOQRecords", Set.of(CITY_INPUTS_JOOQ), "cityInput", "city"); - } - - @Test - @DisplayName("Records in non-root fetch queries with conditions") - public void conditionRecordsOnSplitQuery() { - checkFoundNames("conditionRecordsOnSplitQuery", Set.of(SPLIT_QUERY_WRAPPER), "input2", "input1", "address1"); - } - - @Test - @DisplayName("Java record inputs in fetch services") - public void serviceWithJavaRecordInputs() { - checkFoundNames("torecord/serviceWithJavaRecords", Set.of(CITY_INPUTS_JAVA), "cityInput", "city", "city"); - } - - @Test - @DisplayName("jOOQ record inputs in fetch services") - public void serviceWithJOOQRecordInputs() { - checkFoundNames("torecord/serviceWithJOOQRecords", Set.of(CITY_INPUTS_JOOQ), "cityInput", "city"); - } - - @Test - @DisplayName("Records in non-root fetch services") - public void serviceRecordsOnSplitQuery() { - checkFoundNames( - "serviceRecordsOnSplitQuery", - Set.of(SPLIT_QUERY_WRAPPER, DUMMY_TYPE_RECORD, DUMMY_INPUT_RECORD, CUSTOMER_TABLE, CUSTOMER_INPUT_TABLE), - "query1", "input1", "query2", "input2" - ); - } - - @Test - @DisplayName("Records in fetch services with pagination") - public void serviceWithPagination() { - checkFoundNames("tograph/serviceWithPagination", "queryConnection"); - } - - @Test - @DisplayName("Service without record on first Graph output type") - public void serviceWithoutTopLevelRecord() { - checkFoundNames("tograph/serviceWithoutTopLevelRecord", "query", "customers"); - } - - @Test - @DisplayName("Conditions without records finds no records") - public void conditionWithoutRecordClasses() { - checkFoundNames("conditionWithoutRecordClasses"); - } - - @Test - @DisplayName("Query with jOOQ record and no conditions or services") - public void withoutServiceOrCondition() { - checkFoundNames("torecord/withoutServiceOrCondition", Set.of(DUMMY_TYPE, DUMMY_INPUT_RECORD, CUSTOMER_INPUT_TABLE), "in2", "in1"); - } - - @Test - @DisplayName("Query with jOOQ record and no conditions or services") - public void withoutServiceOrConditionSplitQuery() { - checkFoundNames("torecord/withoutServiceOrConditionSplitQuery", Set.of(SPLIT_QUERY_WRAPPER, DUMMY_TYPE, DUMMY_INPUT_RECORD, CUSTOMER_INPUT_TABLE), "in2", "in1"); - } - - @Test - @DisplayName("Finds records when middle input has no record set") - public void middleInputWithoutRecord() { - checkFoundNames("torecord/middleInputWithoutRecord", "level3A", "level3B", "level1"); - } - - @Test - @DisplayName("Finds records when middle output has no record set") - public void middleOutputWithoutRecord() { - checkFoundNames("tograph/middleOutputWithoutRecord", "level3A", "level3B", "query"); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/TransformerDetectionTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/TransformerDetectionTest.java deleted file mode 100644 index 196f27cde4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/TransformerDetectionTest.java +++ /dev/null @@ -1,36 +0,0 @@ -package no.sikt.graphitron.code; - -import no.sikt.graphitron.common.configuration.SchemaComponent; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("ProcessedSchema - Can find fields that can be used for transformer generation") -public class TransformerDetectionTest extends AbstractTransformerDetectionTest { - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(DUMMY_TYPE_RECORD); - } - - @Test - @DisplayName("Filters duplicate uses of a record") - public void filtersDuplicates() { - checkFoundNames("filtersDuplicates", "query"); - } - - @Test - @DisplayName("Filters duplicate uses of a record across mutations and queries") - public void filtersDuplicatesForQueryAndMutation() { - checkFoundNames( - "filtersDuplicatesForQueryAndMutation", - Set.of(DUMMY_INPUT_RECORD, CUSTOMER_TABLE, CUSTOMER_INPUT_TABLE), - "queryJava", - "inQueryJava", - "queryJOOQ", - "inQueryJOOQ" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/TypeExtractorTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/TypeExtractorTest.java deleted file mode 100644 index 9c8e0a6f4a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/code/TypeExtractorTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package no.sikt.graphitron.code; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.lang.reflect.Type; -import java.util.List; - -import static no.sikt.graphitron.definitions.helpers.TypeExtractor.extractType; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -class TypeExtractorTest { - // Type declarations for tests - private List<String> listOfStrings; - private List<? extends Number> wildcardList; - private List<List<String>> listOfLists; - - @Test - @DisplayName("Extract type from Class object should return the Class itself") - void classType() { - assertThat(extractType(String.class)).isEqualTo(String.class); - } - - @Test - @DisplayName("Extract type from ParameterizedType (List<String>) should return the actual type argument (String)") - void parameterizedType() throws NoSuchFieldException { - Type type = getClass().getDeclaredField("listOfStrings").getGenericType(); - assertThat(extractType(type)).isEqualTo(String.class); - } - - @Test - @DisplayName("Extract type from WildcardType (List<? extends Number>) should return the upper bound (Number)") - void wildcardType() throws NoSuchFieldException { - Type type = getClass().getDeclaredField("wildcardList").getGenericType(); - assertThat(extractType(type)).isEqualTo(Number.class); - } - - @Test - @DisplayName("Extract type from nested ParameterizedType (List<List<String>>) should return the raw type (List)") - void nestedParameterizedType() throws NoSuchFieldException { - Type type = getClass().getDeclaredField("listOfLists").getGenericType(); - assertThat(extractType(type)).isEqualTo(List.class); - } - - @Test - @DisplayName("Extract type from unsupported Type should throw IllegalArgumentException") - void invalidType() { - Type invalidType = new Type(){}; - assertThatThrownBy(() -> extractType(invalidType)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("Cannot extract class from type"); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codeinterface/GraphitronTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codeinterface/GraphitronTest.java deleted file mode 100644 index 53c3d1a1d1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codeinterface/GraphitronTest.java +++ /dev/null @@ -1,153 +0,0 @@ -package no.sikt.graphitron.codeinterface; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.codeinterface.CodeInterfaceClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.FEDERATION_QUERY; -import static no.sikt.graphitron.common.configuration.SchemaComponent.NODE; - -@DisplayName("Graphitron - Generation of the code interface methods") -public class GraphitronTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "codeinterface"; - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new CodeInterfaceClassGenerator(schema)); - } - - @Test - @DisplayName("Default code interface") - void defaultCase() { - assertGeneratedContentMatches("default"); - } - - @Test - @DisplayName("Node is enabled") - void node() { - assertGeneratedContentContains( - "node", Set.of(NODE), - "getRuntimeWiringBuilder(NodeIdHandler _iv_nodeIdHandler", - ".getRuntimeWiringBuilder(_iv_nodeIdHandler", - "getRuntimeWiring(NodeIdHandler _iv_nodeIdHandler", - "return getRuntimeWiringBuilder(_iv_nodeIdHandler", - "getSchema(NodeIdHandler _iv_nodeIdHandler)", - "= getRuntimeWiringBuilder(_iv_nodeIdHandler)" - ); - } - - @Test - @DisplayName("Federation schema helper is generated when entities exist") - void federation() { - assertGeneratedContentContains( - "federation", Set.of(FEDERATION_QUERY), - "getFederatedSchema(TypeDefinitionRegistry registry", - """ - public static GraphQLSchema getFederatedSchema(TypeDefinitionRegistry registry, - RuntimeWiring.Builder wiringBuilder) { - return FederationHelper.buildFederatedSchema(registry, wiringBuilder, EntityTypeResolver.entityTypeResolver(), QueryGeneratedDataFetcher._entities()); - """ - ); - } - - @Test - @DisplayName("Federation schema helper includes NodeIdStrategy when configured") - void federationWithNodeStrategy() { - try { - GeneratorConfig.setNodeStrategy(true); - assertGeneratedContentContains( - "federation", Set.of(FEDERATION_QUERY, NODE), - """ - public static GraphQLSchema getFederatedSchema(TypeDefinitionRegistry registry, RuntimeWiring.Builder wiringBuilder, NodeIdStrategy _iv_nodeIdStrategy) { - return FederationHelper.buildFederatedSchema(registry, wiringBuilder, EntityTypeResolver.entityTypeResolver(), QueryGeneratedDataFetcher._entities(_iv_nodeIdStrategy)); - """ - ); - } finally { - GeneratorConfig.setNodeStrategy(false); - } - } - - @Test - @DisplayName("Simple federation schema helper is generated when federation is imported but no entities exist") - void federationWithoutEntities() { - assertGeneratedContentContains( - "federation-no-entities", - """ - public static GraphQLSchema getFederatedSchema(TypeDefinitionRegistry registry, RuntimeWiring.Builder wiringBuilder) { - return FederationHelper.buildFederatedSchema(registry, wiringBuilder); - """ - ); - } - - @Test - @DisplayName("Federation schema helper is NOT generated when federation is not imported") - void noFederationWithoutImport() { - resultDoesNotContain( - "default", - "getFederatedSchema", - "FederationHelper" - ); - } - - @Test - @DisplayName("Simple getSchema overload with includeFederation parameter is generated when federation is imported") - void getSchemaWithIncludeFederationParameter() { - assertGeneratedContentContains( - "federation", Set.of(FEDERATION_QUERY), - "getSchema(boolean includeFederation)", - """ - public static GraphQLSchema getSchema(boolean includeFederation) { - if (!includeFederation) { - return getSchema(); - } - var wiring = getRuntimeWiringBuilder(); - var registry = getTypeRegistry(); - return getFederatedSchema(registry, wiring); - } - """ - ); - } - - @Test - @DisplayName("Simple getSchema overload with includeFederation parameter includes NodeIdStrategy when Node is enabled") - void getSchemaWithIncludeFederationAndNodeStrategy() { - try { - GeneratorConfig.setNodeStrategy(true); - assertGeneratedContentContains( - "federation", Set.of(FEDERATION_QUERY, NODE), - "getSchema(NodeIdStrategy _iv_nodeIdStrategy, boolean includeFederation)", - """ - public static GraphQLSchema getSchema(NodeIdStrategy _iv_nodeIdStrategy, boolean includeFederation) { - if (!includeFederation) { - return getSchema(_iv_nodeIdStrategy); - } - var wiring = getRuntimeWiringBuilder(_iv_nodeIdStrategy); - var registry = getTypeRegistry(); - return getFederatedSchema(registry, wiring, _iv_nodeIdStrategy); - } - """ - ); - } finally { - GeneratorConfig.setNodeStrategy(false); - } - } - - @Test - @DisplayName("Simple getSchema overload is NOT generated when federation is not imported") - void noGetSchemaOverloadWithoutFederation() { - resultDoesNotContain( - "default", - "includeFederation" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/ContextCondition.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/ContextCondition.java deleted file mode 100644 index dc83e1e56c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/ContextCondition.java +++ /dev/null @@ -1,19 +0,0 @@ -package no.sikt.graphitron.codereferences.conditions; - -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.Customer; -import org.jooq.Condition; - -public class ContextCondition { - public static Condition query(Customer c, String ctxField) { - return null; - } - public static Condition query(Customer c, String email, String ctxField) { - return null; - } - public static Condition email(Customer c, String email, String ctxField) { - return null; - } - public static Condition email(Customer c, String email, String ctxField1, String ctxField2) { - return null; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/PaymentCondition.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/PaymentCondition.java deleted file mode 100644 index 5fccefb06b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/PaymentCondition.java +++ /dev/null @@ -1,17 +0,0 @@ -package no.sikt.graphitron.codereferences.conditions; - -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.Payment; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.Rental; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.Staff; -import org.jooq.Condition; -import org.jooq.impl.DSL; - -public class PaymentCondition { - public static Condition paymentStaff(Payment p, Staff s) { - return null; - } - - public static Condition rentalStaff(Rental r, Staff s) { - return r.STAFF_ID.eq(s.STAFF_ID); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/PgUserMappingCondition.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/PgUserMappingCondition.java deleted file mode 100644 index baef93c924..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/PgUserMappingCondition.java +++ /dev/null @@ -1,11 +0,0 @@ -package no.sikt.graphitron.codereferences.conditions; - -import no.sikt.graphitron.jooq.generated.testdata.pg_catalog.tables.PgUser; -import no.sikt.graphitron.jooq.generated.testdata.pg_catalog.tables.PgUserMapping; -import org.jooq.Condition; - -public class PgUserMappingCondition { - public static Condition userMapping(PgUserMapping address, PgUser firstname) { - return null; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/QueryAddressInterfaceCondition.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/QueryAddressInterfaceCondition.java deleted file mode 100644 index 0567b3bb30..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/QueryAddressInterfaceCondition.java +++ /dev/null @@ -1,10 +0,0 @@ -package no.sikt.graphitron.codereferences.conditions; - -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.Address; -import org.jooq.Condition; - -public class QueryAddressInterfaceCondition { - public static Condition address(Address address, String firstname) { - return null; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/QueryCustomerCondition.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/QueryCustomerCondition.java deleted file mode 100644 index 6031467829..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/QueryCustomerCondition.java +++ /dev/null @@ -1,70 +0,0 @@ -package no.sikt.graphitron.codereferences.conditions; - -import no.sikt.graphitron.codereferences.dummyreferences.DummyJOOQEnum; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.Customer; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CustomerRecord; -import org.jooq.Condition; - -import java.util.List; - -public class QueryCustomerCondition { - public static Condition email(Customer c, String s) { - return null; - } - - public static Condition emails(Customer c, List<String> s) { - return null; - } - - public static Condition query(Customer c, String s) { - return null; - } - - public static Condition id(Customer c, String s) { - return null; - } - - public static Condition query(Customer c, String s0, String s1) { - return null; - } - - public static Condition queryList(Customer c, List<String> s) { - return null; - } - - public static Condition enumInput(Customer c, DummyJOOQEnum e) { - return null; - } - - public static Condition enumInputList(Customer c, List<DummyJOOQEnum> e) { - return null; - } - - public static Condition queryEnum(Customer c, DummyJOOQEnum e) { - return null; - } - - public static Condition queryEnumList(Customer c, List<DummyJOOQEnum> e) { - return null; - } - - public static Condition queryCustomerNodeId(Customer c, CustomerRecord s) { - return null; - } - - public static Condition queryCustomerIdAndNodeId(Customer c, int customerId, CustomerRecord s) { - return null; - } - - public static Condition queryCustomerNodeIds(Customer c, List<CustomerRecord> s) { - return null; - } - - public static Condition queryCustomerNodeIdAsString(Customer c, String s) { - return null; - } - - public static Condition queryCustomerNodeIdsAsString(Customer c, List<String> s) { - return null; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/QueryPaymentInterfaceCondition.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/QueryPaymentInterfaceCondition.java deleted file mode 100644 index 0723c87d16..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/QueryPaymentInterfaceCondition.java +++ /dev/null @@ -1,15 +0,0 @@ -package no.sikt.graphitron.codereferences.conditions; - -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.PaymentP2007_01; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.PaymentP2007_02; -import org.jooq.Condition; - -public class QueryPaymentInterfaceCondition { - public static Condition payments(PaymentP2007_01 payment, String customerId) { - return null; - } - - public static Condition payments(PaymentP2007_02 payment, String customerId) { - return null; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/QueryStaffCondition.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/QueryStaffCondition.java deleted file mode 100644 index 33164eb2ae..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/QueryStaffCondition.java +++ /dev/null @@ -1,34 +0,0 @@ -package no.sikt.graphitron.codereferences.conditions; - -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.Staff; -import org.jooq.Condition; - -public class QueryStaffCondition { - public static Condition firstname(Staff staff, String firstname) { - return null; - } - - public static Condition lastname(Staff staff, String lastname) { - return null; - } - - public static Condition name(Staff staff, String firstname, String lastname) { - return null; - } - - public static Condition email(Staff staff, String email) { - return null; - } - - public static Condition field(Staff staff, String firstname, String lastname, Boolean active) { - return null; - } - - public static Condition staff(Staff staff, String firstname, String lastname, String email, Boolean active) { - return null; - } - - public static Condition staffMin(Staff staff, String firstname, String lastname, Boolean active) { - return null; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/RecordCustomerCondition.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/RecordCustomerCondition.java deleted file mode 100644 index be15d04605..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/RecordCustomerCondition.java +++ /dev/null @@ -1,29 +0,0 @@ -package no.sikt.graphitron.codereferences.conditions; - -import no.sikt.graphitron.codereferences.records.CustomerJavaRecord; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.Customer; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CustomerRecord; -import org.jooq.Condition; - -import java.util.List; - -public class RecordCustomerCondition { - public static Condition customerString(Customer customer, String s) { - return null; - } - - public static Condition customerJOOQRecord(Customer customer, CustomerRecord record) { - return null; - } - - public static Condition customerJOOQRecordList(Customer customer, List<CustomerRecord> record) { - return null; - } - - public static Condition customerJavaRecord(Customer customer, CustomerJavaRecord record) { - return null; - } - public static Condition customerJavaRecordList(Customer customer, List<CustomerJavaRecord> record) { - return null; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/RecordStaffCondition.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/RecordStaffCondition.java deleted file mode 100644 index f1bb784df2..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/RecordStaffCondition.java +++ /dev/null @@ -1,34 +0,0 @@ -package no.sikt.graphitron.codereferences.conditions; - -import no.sikt.graphitron.codereferences.records.StaffInput1JavaRecord; -import no.sikt.graphitron.codereferences.records.StaffNameJavaRecord; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.Staff; -import org.jooq.Condition; - -import java.util.List; - -public class RecordStaffCondition { - public static Condition firstname(Staff staff, String firstname) { - return null; - } - - public static Condition lastname(Staff staff, String lastname) { - return null; - } - - public static Condition name(Staff staff, StaffNameJavaRecord name) { - return null; - } - - public static Condition nameList(Staff staff, List<StaffNameJavaRecord> names) { - return null; - } - - public static Condition fieldWithListInput(Staff staff, List<StaffNameJavaRecord> names, Boolean active) { - return null; - } - - public static Condition input1(Staff staff, List<StaffInput1JavaRecord> input1) { - return null; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/ReferenceCustomerCondition.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/ReferenceCustomerCondition.java deleted file mode 100644 index 021c4bc56b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/ReferenceCustomerCondition.java +++ /dev/null @@ -1,34 +0,0 @@ -package no.sikt.graphitron.codereferences.conditions; - -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.Address; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.City; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.Customer; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.Payment; -import org.jooq.Condition; - -public class ReferenceCustomerCondition { - public static Condition addressCustomer(Customer c, Address a) { - return null; - } - public static Condition addressCity(City c, Address a) { - return null; - } - public static Condition cityCustomer(Customer cu, City ci) { - return null; - } - public static Condition cityAddress(Address a, City c) { - return null; - } - public static Condition district(Customer c, Address a) { - return null; - } - public static Condition email(Address a, Customer c) { - return null; - } - public static Condition addressId(Customer c, Address a) { - return null; - } - public static Condition payments(Customer c, Payment p) { - return null; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/ReferenceFilmCondition.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/ReferenceFilmCondition.java deleted file mode 100644 index 5d9740b820..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/conditions/ReferenceFilmCondition.java +++ /dev/null @@ -1,10 +0,0 @@ -package no.sikt.graphitron.codereferences.conditions; - -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.Film; -import org.jooq.Condition; - -public class ReferenceFilmCondition { - public static Condition sequel(Film f0, Film f1) { - return null; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/dummyreferences/DummyCondition.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/dummyreferences/DummyCondition.java deleted file mode 100644 index fd8c984500..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/dummyreferences/DummyCondition.java +++ /dev/null @@ -1,7 +0,0 @@ -package no.sikt.graphitron.codereferences.dummyreferences; - -/** - * Fake condition for tests. Does not need to contain anything. Only the existence of the class is checked here. - */ -public class DummyCondition { -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/dummyreferences/DummyJOOQEnum.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/dummyreferences/DummyJOOQEnum.java deleted file mode 100644 index e2ed214359..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/dummyreferences/DummyJOOQEnum.java +++ /dev/null @@ -1,8 +0,0 @@ -package no.sikt.graphitron.codereferences.dummyreferences; - -/** - * Fake enum for tests. Does not need to contain meaningful values. - */ -public enum DummyJOOQEnum { - A, B, C -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/dummyreferences/DummyService.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/dummyreferences/DummyService.java deleted file mode 100644 index 31f1bfa773..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/dummyreferences/DummyService.java +++ /dev/null @@ -1,6 +0,0 @@ -package no.sikt.graphitron.codereferences.dummyreferences; - -/** - * Fake service for tests. Does not need to contain anything, mappers do not use this for anything. Only service class reference is checked here. - */ -public class DummyService {} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/extensionmethods/ClassWithDuplicatedExtensionMethod.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/extensionmethods/ClassWithDuplicatedExtensionMethod.java deleted file mode 100644 index 8f4ec37fe3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/extensionmethods/ClassWithDuplicatedExtensionMethod.java +++ /dev/null @@ -1,11 +0,0 @@ -package no.sikt.graphitron.codereferences.extensionmethods; - -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.Customer; -import org.jooq.Field; -import org.jooq.impl.DSL; - -public class ClassWithDuplicatedExtensionMethod { - public static Field<String> duplicated(Customer customer) { - return DSL.field("", String.class); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/extensionmethods/ClassWithExtensionMethod.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/extensionmethods/ClassWithExtensionMethod.java deleted file mode 100644 index 45252dfd19..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/extensionmethods/ClassWithExtensionMethod.java +++ /dev/null @@ -1,25 +0,0 @@ -package no.sikt.graphitron.codereferences.extensionmethods; - -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.Customer; -import org.jooq.Field; -import org.jooq.impl.DSL; - -public class ClassWithExtensionMethod { - public static Field<String> name(Customer customer) { - return DSL.field("", String.class); - } - - public static Field<String> duplicated(Customer customer) { - return DSL.field("", String.class); - } - - public static Field<Integer> wrongGenericReturnType(Customer customer) { - return DSL.field("", Integer.class); - } - - public static String wrongReturnType(Customer customer) { - return ""; - } - -} - diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/CompositeKeyInputJavaRecord.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/CompositeKeyInputJavaRecord.java deleted file mode 100644 index 8b48eb12c9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/CompositeKeyInputJavaRecord.java +++ /dev/null @@ -1,29 +0,0 @@ -package no.sikt.graphitron.codereferences.records; - -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.FilmActorRecord; - -/** - * Test Java record (POJO) with a jOOQ record field that has composite primary keys. - * Used to test transformation of @nodeId fields to jOOQ records when the node type - * has composite keys (ACTOR_ID, FILM_ID in FILM_ACTOR table). - */ -public class CompositeKeyInputJavaRecord { - private String name; - private FilmActorRecord filmActor; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public FilmActorRecord getFilmActor() { - return filmActor; - } - - public void setFilmActor(FilmActorRecord filmActor) { - this.filmActor = filmActor; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/CustomerJavaRecord.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/CustomerJavaRecord.java deleted file mode 100644 index 97aed8eaea..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/CustomerJavaRecord.java +++ /dev/null @@ -1,69 +0,0 @@ -package no.sikt.graphitron.codereferences.records; - -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.AddressRecord; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CustomerRecord; - -import java.util.List; - -public class CustomerJavaRecord { - private String someID, addressId, otherID, email; - private List<String> idList; - private AddressRecord address; - private CustomerRecord customer; - - public String getSomeID() { - return someID; - } - - public void setSomeID(String someID) { - this.someID = someID; - } - - public String getOtherID() { - return otherID; - } - - public void setOtherID(String otherID) { - this.otherID = otherID; - } - - public AddressRecord getAddress() { - return address; - } - - public void setAddress(AddressRecord address) { - this.address = address; - } - - public String getAddressId() { - return addressId; - } - - public void setAddressId(String addressId) { - this.addressId = addressId; - } - - public List<String> getIdList() { - return idList; - } - - public void setIdList(List<String> idList) { - this.idList = idList; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public CustomerRecord getCustomer() { - return customer; - } - - public void setCustomer(CustomerRecord customer) { - this.customer = customer; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/FilmActorInputJavaRecord.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/FilmActorInputJavaRecord.java deleted file mode 100644 index 8b0dd7a5f7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/FilmActorInputJavaRecord.java +++ /dev/null @@ -1,25 +0,0 @@ -package no.sikt.graphitron.codereferences.records; - -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.FilmActorRecord; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.RentalRecord; - -public class FilmActorInputJavaRecord { - private FilmActorRecord filmActor; - private RentalRecord rental; - - public RentalRecord getRental() { - return rental; - } - - public void setRental(RentalRecord rental) { - this.rental = rental; - } - - public FilmActorRecord getFilmActor() { - return filmActor; - } - - public void setFilmActor(FilmActorRecord filmActor) { - this.filmActor = filmActor; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/FilmJavaRecord.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/FilmJavaRecord.java deleted file mode 100644 index b7fd89d306..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/FilmJavaRecord.java +++ /dev/null @@ -1,15 +0,0 @@ -package no.sikt.graphitron.codereferences.records; - -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.FilmRecord; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.LanguageRecord; - -public class FilmJavaRecord { - FilmRecord film; - - public FilmRecord getFilm() { - return film; - } - public void setFilm(FilmRecord film) { - this.film = film; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/FilmWrapperRecord.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/FilmWrapperRecord.java deleted file mode 100644 index 408d0617c6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/FilmWrapperRecord.java +++ /dev/null @@ -1,15 +0,0 @@ -package no.sikt.graphitron.codereferences.records; - -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.FilmRecord; - -public class FilmWrapperRecord { - public FilmRecord getFilm() { - return film; - } - - public void setFilm(FilmRecord film) { - this.film = film; - } - - private FilmRecord film; -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/IDJavaRecord.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/IDJavaRecord.java deleted file mode 100644 index 0096439b2f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/IDJavaRecord.java +++ /dev/null @@ -1,13 +0,0 @@ -package no.sikt.graphitron.codereferences.records; - -public class IDJavaRecord { - private String id; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/ListedAndSingularInputJavaRecord.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/ListedAndSingularInputJavaRecord.java deleted file mode 100644 index 02b2968507..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/ListedAndSingularInputJavaRecord.java +++ /dev/null @@ -1,27 +0,0 @@ -package no.sikt.graphitron.codereferences.records; - -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CustomerRecord; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.RentalRecord; - -import java.util.List; - -public class ListedAndSingularInputJavaRecord { - private List<RentalRecord> rental; - private CustomerRecord customer; - - public List<RentalRecord> getRental() { - return rental; - } - - public void setRental(List<RentalRecord> rental) { - this.rental = rental; - } - - public CustomerRecord getCustomer() { - return customer; - } - - public void setCustomer(CustomerRecord customer) { - this.customer = customer; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/ListedFilmActorInputJavaRecord.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/ListedFilmActorInputJavaRecord.java deleted file mode 100644 index fa320dab3a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/ListedFilmActorInputJavaRecord.java +++ /dev/null @@ -1,17 +0,0 @@ -package no.sikt.graphitron.codereferences.records; - -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.FilmActorRecord; - -import java.util.List; - -public class ListedFilmActorInputJavaRecord { - private List<FilmActorRecord> filmActor; - - public List<FilmActorRecord> getFilmActor() { - return filmActor; - } - - public void setFilmActor(List<FilmActorRecord> filmActor) { - this.filmActor = filmActor; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/ListedNodeIdInputJavaRecord.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/ListedNodeIdInputJavaRecord.java deleted file mode 100644 index 768bcd34f8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/ListedNodeIdInputJavaRecord.java +++ /dev/null @@ -1,26 +0,0 @@ -package no.sikt.graphitron.codereferences.records; - -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CustomerRecord; - -import java.util.List; - -public class ListedNodeIdInputJavaRecord { - private String name; - private List<CustomerRecord> customer; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public List<CustomerRecord> getCustomer() { - return customer; - } - - public void setCustomer(List<CustomerRecord> customer) { - this.customer = customer; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/ListedRentalInputJavaRecord.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/ListedRentalInputJavaRecord.java deleted file mode 100644 index a657337628..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/ListedRentalInputJavaRecord.java +++ /dev/null @@ -1,17 +0,0 @@ -package no.sikt.graphitron.codereferences.records; - -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.RentalRecord; - -import java.util.List; - -public class ListedRentalInputJavaRecord { - private List<RentalRecord> rental; - - public List<RentalRecord> getRental() { - return rental; - } - - public void setRental(List<RentalRecord> rental) { - this.rental = rental; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/MapperAddressJavaRecord.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/MapperAddressJavaRecord.java deleted file mode 100644 index eca5a42cdc..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/MapperAddressJavaRecord.java +++ /dev/null @@ -1,21 +0,0 @@ -package no.sikt.graphitron.codereferences.records; - -public class MapperAddressJavaRecord { - String id, postalCode; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getPostalCode() { - return postalCode; - } - - public void setPostalCode(String postalCode) { - this.postalCode = postalCode; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/MapperCityJavaRecord.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/MapperCityJavaRecord.java deleted file mode 100644 index 863b3a085b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/MapperCityJavaRecord.java +++ /dev/null @@ -1,22 +0,0 @@ -package no.sikt.graphitron.codereferences.records; - -public class MapperCityJavaRecord { - String id; - String cityName; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getCityName() { - return cityName; - } - - public void setCityName(String cityName) { - this.cityName = cityName; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/MapperCustomerInnerJavaRecord.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/MapperCustomerInnerJavaRecord.java deleted file mode 100644 index b763223a64..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/MapperCustomerInnerJavaRecord.java +++ /dev/null @@ -1,33 +0,0 @@ -package no.sikt.graphitron.codereferences.records; - -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CustomerRecord; - -public class MapperCustomerInnerJavaRecord { - private CustomerRecord someRecord; - private CustomerRecord someRecordList; - private Integer someInt; - - public CustomerRecord getSomeRecord() { - return someRecord; - } - - public CustomerRecord getSomeRecordList() { - return someRecordList; - } - - public Integer getSomeInt() { - return someInt; - } - - public void setSomeRecord(CustomerRecord someRecord) { - this.someRecord = someRecord; - } - - public void setSomeRecordList(CustomerRecord someRecordList) { - this.someRecordList = someRecordList; - } - - public void setSomeInt(Integer someInt) { - this.someInt = someInt; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/MapperCustomerJavaRecord.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/MapperCustomerJavaRecord.java deleted file mode 100644 index 3e616e0575..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/MapperCustomerJavaRecord.java +++ /dev/null @@ -1,94 +0,0 @@ -package no.sikt.graphitron.codereferences.records; - -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CustomerRecord; - -import java.util.List; - -public class MapperCustomerJavaRecord { - private String someID, name; - private List<String> someListID, nameList1, nameList2; - private MapperCustomerInnerJavaRecord edit2A, customerInnerJavaRecord; - private MapperCustomerInnerJavaRecord customerInnerJavaRecordList; - private CustomerRecord record; - private List<CustomerRecord> recordList; - - public String getSomeID() { - return someID; - } - - public String getName() { - return name; - } - - public List<String> getSomeListID() { - return someListID; - } - - public List<String> getNameList1() { - return nameList1; - } - - public List<String> getNameList2() { - return nameList2; - } - - public MapperCustomerInnerJavaRecord getEdit2A() { - return edit2A; - } - - public MapperCustomerInnerJavaRecord getTestCustomerInnerRecord() { - return customerInnerJavaRecord; - } - - public MapperCustomerInnerJavaRecord getTestCustomerInnerRecordList() { - return customerInnerJavaRecordList; - } - - public CustomerRecord getRecord() { - return record; - } - - public List<CustomerRecord> getRecordList() { - return recordList; - } - - public void setSomeID(String someID) { - this.someID = someID; - } - - public void setName(String name) { - this.name = name; - } - - public void setSomeListID(List<String> someListID) { - this.someListID = someListID; - } - - public void setNameList1(List<String> nameList1) { - this.nameList1 = nameList1; - } - - public void setNameList2(List<String> nameList2) { - this.nameList2 = nameList2; - } - - public void setEdit2A(MapperCustomerInnerJavaRecord edit2A) { - this.edit2A = edit2A; - } - - public void setTestCustomerInnerRecord(MapperCustomerInnerJavaRecord customerInnerJavaRecord) { - this.customerInnerJavaRecord = customerInnerJavaRecord; - } - - public void setTestCustomerInnerRecordList(MapperCustomerInnerJavaRecord customerInnerJavaRecordList) { - this.customerInnerJavaRecordList = customerInnerJavaRecordList; - } - - public void setRecord(CustomerRecord record) { - this.record = record; - } - - public void setRecordList(List<CustomerRecord> recordList) { - this.recordList = recordList; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/MapperEnumRecord.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/MapperEnumRecord.java deleted file mode 100644 index 5e635d374e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/MapperEnumRecord.java +++ /dev/null @@ -1,44 +0,0 @@ -package no.sikt.graphitron.codereferences.records; - -import no.sikt.graphitron.codereferences.dummyreferences.DummyJOOQEnum; - -import java.util.List; - -public class MapperEnumRecord { - private DummyJOOQEnum enum1; - private String enum2; - private List<DummyJOOQEnum> enum1List; - private List<String> enum2List; - - public DummyJOOQEnum getEnum1() { - return enum1; - } - - public void setEnum1(DummyJOOQEnum enum1) { - this.enum1 = enum1; - } - - public String getEnum2() { - return enum2; - } - - public void setEnum2(String enum2) { - this.enum2 = enum2; - } - - public List<DummyJOOQEnum> getEnum1List() { - return enum1List; - } - - public void setEnum1List(List<DummyJOOQEnum> enum1List) { - this.enum1List = enum1List; - } - - public List<String> getEnum2List() { - return enum2List; - } - - public void setEnum2List(List<String> enum2List) { - this.enum2List = enum2List; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/MapperNestedJavaRecord.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/MapperNestedJavaRecord.java deleted file mode 100644 index be5661ce72..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/MapperNestedJavaRecord.java +++ /dev/null @@ -1,35 +0,0 @@ -package no.sikt.graphitron.codereferences.records; - -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.Customer; - -import java.util.List; - -public class MapperNestedJavaRecord { - Customer customer; - IDJavaRecord dummyRecord; - List<Customer> customerList; - - public Customer getCustomer() { - return customer; - } - - public IDJavaRecord getDummyRecord() { - return dummyRecord; - } - - public void setDummyRecord(IDJavaRecord dummyRecord) { - this.dummyRecord = dummyRecord; - } - - public void setCustomer(Customer customer) { - this.customer = customer; - } - - public List<Customer> getCustomerList() { - return customerList; - } - - public void setCustomerList(List<Customer> customerList) { - this.customerList = customerList; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/NodeIdInputJavaRecord.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/NodeIdInputJavaRecord.java deleted file mode 100644 index 2db07722ab..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/NodeIdInputJavaRecord.java +++ /dev/null @@ -1,28 +0,0 @@ -package no.sikt.graphitron.codereferences.records; - -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CustomerRecord; - -/** - * Test Java record (POJO) with a jOOQ record field for @nodeId testing. - * Used to test transformation of @nodeId fields to jOOQ records in @record inputs. - */ -public class NodeIdInputJavaRecord { - private String name; - private CustomerRecord customer; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public CustomerRecord getCustomer() { - return customer; - } - - public void setCustomer(CustomerRecord customer) { - this.customer = customer; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/OptionalFieldJavaRecord.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/OptionalFieldJavaRecord.java deleted file mode 100644 index a4d38b90f9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/OptionalFieldJavaRecord.java +++ /dev/null @@ -1,18 +0,0 @@ -package no.sikt.graphitron.codereferences.records; - -import java.util.Optional; - -public class OptionalFieldJavaRecord { - private String id; - private Optional<String> name; - private Optional<Integer> rentalDuration; - - public String getId() { return id; } - public void setId(String id) { this.id = id; } - - public Optional<String> getName() { return name; } - public void setName(Optional<String> name) { this.name = name; } - - public Optional<Integer> getRentalDuration() { return rentalDuration; } - public void setRentalDuration(Optional<Integer> rentalDuration) { this.rentalDuration = rentalDuration; } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/RentalInputJavaRecord.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/RentalInputJavaRecord.java deleted file mode 100644 index 990f446df7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/RentalInputJavaRecord.java +++ /dev/null @@ -1,29 +0,0 @@ -package no.sikt.graphitron.codereferences.records; - -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.RentalRecord; - -/** - * Test Java record (POJO) with a jOOQ record field for @nodeId merging testing. - * Used to test merging of multiple @nodeId fields into a single jOOQ record. - * The RentalRecord has both CUSTOMER_ID and INVENTORY_ID columns. - */ -public class RentalInputJavaRecord { - private String name; - private RentalRecord rental; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public RentalRecord getRental() { - return rental; - } - - public void setRental(RentalRecord rental) { - this.rental = rental; - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/StaffInput1JavaRecord.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/StaffInput1JavaRecord.java deleted file mode 100644 index 6943c1b656..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/StaffInput1JavaRecord.java +++ /dev/null @@ -1,33 +0,0 @@ -package no.sikt.graphitron.codereferences.records; - -import java.util.List; - -public class StaffInput1JavaRecord { - private List<StaffNameJavaRecord> names; - private String email; - private Boolean active; - - public List<StaffNameJavaRecord> getNamesRecord() { - return this.names; - } - - public void setNamesRecord(List<StaffNameJavaRecord> names) { - this.names = names; - } - - public String getEmail() { - return this.email; - } - - public void setEmail(String email) { - this.email = email; - } - - public Boolean getActive() { - return this.active; - } - - public void setActive(Boolean active) { - this.active = active; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/StaffInput2JavaRecord.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/StaffInput2JavaRecord.java deleted file mode 100644 index ec12808102..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/StaffInput2JavaRecord.java +++ /dev/null @@ -1,13 +0,0 @@ -package no.sikt.graphitron.codereferences.records; - -public class StaffInput2JavaRecord { - private StaffInput1JavaRecord input1; - - public StaffInput1JavaRecord getInput1Record() { - return input1; - } - - public void setInput1Record(StaffInput1JavaRecord input1) { - this.input1 = input1; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/StaffInput3JavaRecord.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/StaffInput3JavaRecord.java deleted file mode 100644 index a548c7299b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/StaffInput3JavaRecord.java +++ /dev/null @@ -1,15 +0,0 @@ -package no.sikt.graphitron.codereferences.records; - -import java.util.List; - -public class StaffInput3JavaRecord { - private List<StaffInput2JavaRecord> inputs2; - - public List<StaffInput2JavaRecord> getInputs2() { - return this.inputs2; - } - - public void setInputs2(List<StaffInput2JavaRecord> inputs2) { - this.inputs2 = inputs2; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/StaffNameJavaRecord.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/StaffNameJavaRecord.java deleted file mode 100644 index ae573cbf99..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/records/StaffNameJavaRecord.java +++ /dev/null @@ -1,22 +0,0 @@ -package no.sikt.graphitron.codereferences.records; - -public class StaffNameJavaRecord { - private String firstname; - private String lastname; - - public String getFirstname() { - return this.firstname; - } - - public void setFirstname(String firstname) { - this.firstname = firstname; - } - - public String getLastname() { - return this.lastname; - } - - public void setLastname(String lastname) { - this.lastname = lastname; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/services/ContextService.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/services/ContextService.java deleted file mode 100644 index 6a9e328fc8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/services/ContextService.java +++ /dev/null @@ -1,26 +0,0 @@ -package no.sikt.graphitron.codereferences.services; - -import org.jooq.DSLContext; - -/** - * Fake service for mapper tests. Does not need to return meaningful values as only the generated result is tested. - */ -public class ContextService { - public ContextService(DSLContext context) {} - - public String query(String ctxField) { - return null; - } - - public String mutation(String ctxField) { - return null; - } - - public String query(int i, String ctxField) { - return null; - } - - public String mutation(int i, String ctxField) { - return null; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/services/CustomerTableMethod.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/services/CustomerTableMethod.java deleted file mode 100644 index e674ed7295..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/services/CustomerTableMethod.java +++ /dev/null @@ -1,12 +0,0 @@ -package no.sikt.graphitron.codereferences.services; - -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.Customer; - -public class CustomerTableMethod { - public Customer customerTable(Customer customer, String firstName) { - return customer.where(Customer.CUSTOMER.FIRST_NAME.eq(firstName)); - } - public Customer customerTable(Customer customer) { - return customer; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/services/IDMapperService.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/services/IDMapperService.java deleted file mode 100644 index 4120bdefcf..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/services/IDMapperService.java +++ /dev/null @@ -1,21 +0,0 @@ -package no.sikt.graphitron.codereferences.services; - -import org.jooq.DSLContext; - -import java.util.List; - -/** - * Fake service for mapper tests. Does not need to return meaningful values as only the generated result is tested. - */ -public class IDMapperService { - public IDMapperService(DSLContext context) { - } - - public String query() { - return null; - } - - public List<String> queryListed() { - return null; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/services/JOOQRecordInputFetchService.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/services/JOOQRecordInputFetchService.java deleted file mode 100644 index 95a19f8ed6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/services/JOOQRecordInputFetchService.java +++ /dev/null @@ -1,21 +0,0 @@ -package no.sikt.graphitron.codereferences.services; - -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CustomerRecord; -import org.jooq.DSLContext; - -import java.util.List; - -/** - * Fake service for record tests. - */ -public class JOOQRecordInputFetchService { - public JOOQRecordInputFetchService(DSLContext context) {} - - public CustomerRecord customer(String id, CustomerRecord record) { - return null; - } - - public List<CustomerRecord> customerListed(List<CustomerRecord> record) { - return null; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/services/JavaRecordInputFetchService.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/services/JavaRecordInputFetchService.java deleted file mode 100644 index d6f427cbac..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/services/JavaRecordInputFetchService.java +++ /dev/null @@ -1,28 +0,0 @@ -package no.sikt.graphitron.codereferences.services; - -import no.sikt.graphitron.codereferences.dummyreferences.DummyRecord; -import no.sikt.graphitron.codereferences.records.CustomerJavaRecord; -import no.sikt.graphitron.codereferences.records.FilmActorInputJavaRecord; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CustomerRecord; -import org.jooq.DSLContext; - -import java.util.List; - -/** - * Fake service for mapper tests. Does not need to return meaningful values as only the generated result is tested. - */ -public class JavaRecordInputFetchService { - public JavaRecordInputFetchService(DSLContext context) {} - - public CustomerRecord customer(CustomerJavaRecord record) { - return null; - } - - public List<CustomerRecord> customerListed(List<DummyRecord> record) { - return null; - } - - public String filmActors(List<FilmActorInputJavaRecord> input) { - return null; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/services/MapperFetchService.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/services/MapperFetchService.java deleted file mode 100644 index ca8aa47624..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/services/MapperFetchService.java +++ /dev/null @@ -1,33 +0,0 @@ -package no.sikt.graphitron.codereferences.services; - -import no.sikt.graphitron.codereferences.records.CustomerJavaRecord; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CityRecord; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CustomerRecord; -import org.jooq.DSLContext; - -import java.util.List; -import java.util.Set; - -/** - * Fake service for mapper tests. Does not need to return meaningful values as only the generated result is tested. - */ -public class MapperFetchService { - public MapperFetchService(DSLContext context) {} - - public List<CustomerRecord> customerQuery() { - return null; - } - - public List<CustomerJavaRecord> customerJavaQuery() { - return null; - } - - public CustomerJavaRecord fetchCustomerDetails(Set<Integer> resolverKeys) { - return null; - } - - public List<CityRecord> cityQuery() { - return null; - } - -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/services/ResolverFetchService.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/services/ResolverFetchService.java deleted file mode 100644 index c013c08f0f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/services/ResolverFetchService.java +++ /dev/null @@ -1,78 +0,0 @@ -package no.sikt.graphitron.codereferences.services; - -import no.sikt.graphitron.codereferences.dummyreferences.DummyRecord; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CustomerRecord; -import org.apache.commons.lang3.tuple.Pair; -import org.jooq.DSLContext; - -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -/** - * Fake service for resolver tests. Does not need to return meaningful values as only the generated result is tested. - */ -public class ResolverFetchService { - public ResolverFetchService(DSLContext context) {} - - public CustomerRecord query(String id) { - return null; - } - - public CustomerRecord query(DummyRecord record) { - return null; - } - - public CustomerRecord query(CustomerRecord record) { - return null; - } - - public CustomerRecord query(Set<String> ids, String id) { - return null; - } - - public CustomerRecord query(Set<String> ids, CustomerRecord record) { - return null; - } - - public List<Pair<String, CustomerRecord>> queryList(int pageSize, String after) { - return List.of(); - } - - public Integer countQueryList() { - return 0; - } - - public Map<String, List<Pair<String, CustomerRecord>>> queryMap(Set<String> ids, int pageSize, String after) { - return Map.of(); - } - - public Map<String, Integer> countQueryMap(Set<String> ids) { - return ids.stream().collect(Collectors.toMap(id -> id, id -> 0)); - } - - public List<CustomerRecord> queryList(CustomerRecord record, int pageSize, String after) { - return List.of(); - } - - public Integer countQueryList(CustomerRecord record) { - return 0; - } - - public Map<String, CustomerRecord> queryMap(Set<String> ids, CustomerRecord record, int pageSize, String after) { - return Map.of(); - } - - public Integer countQueryMap(Set<String> ids, CustomerRecord record) { - return 0; - } - - public DummyRecord queryJavaRecord() { - return null; - } - - public DummyRecord queryJavaRecord(Set<String> id) { - return null; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/services/ResolverMutationService.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/services/ResolverMutationService.java deleted file mode 100644 index f2b7d5e3d5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/services/ResolverMutationService.java +++ /dev/null @@ -1,54 +0,0 @@ -package no.sikt.graphitron.codereferences.services; - -import no.sikt.graphitron.codereferences.dummyreferences.DummyRecord; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CustomerRecord; - -import java.util.List; - -/** - * Fake service for resolver tests. Does not need to return meaningful values as only the generated result is tested. - */ -public class ResolverMutationService { - public String mutation() { - return null; - } - public String mutation(String s) { - return null; - } - public String mutation(String s0, String s1) { - return null; - } - public String mutation(CustomerRecord c) { - return null; - } - public String mutation(DummyRecord d) { - return null; - } - public String mutation(CustomerRecord c0, CustomerRecord c1) { - return null; - } - public String mutation(CustomerRecord c0, CustomerRecord c1, CustomerRecord c2) { - return null; - } - public String mutation(CustomerRecord c0, List<CustomerRecord> c1) { - return null; - } - public String mutation(List<CustomerRecord> c0, List<CustomerRecord> c1) { - return null; - } - public String mutation(List<CustomerRecord> s) { - return null; - } - public List<String> mutationList() { - return null; - } - public CustomerRecord mutationCustomer() { - return null; - } - public List<CustomerRecord> mutationCustomerList() { - return null; - } - public DummyRecord mutationDummy() { - return null; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/services/StaffTableMethod.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/services/StaffTableMethod.java deleted file mode 100644 index 3f1df9bc1e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/services/StaffTableMethod.java +++ /dev/null @@ -1,12 +0,0 @@ -package no.sikt.graphitron.codereferences.services; - -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.Staff; - -public class StaffTableMethod { - public Staff staffTable(Staff staff, String firstName) { - return staff.where(Staff.STAFF.FIRST_NAME.eq(firstName)); - } - public Staff staffTable(Staff staff) { - return staff; - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/services/TypeMismatchService.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/services/TypeMismatchService.java deleted file mode 100644 index ae92f116fb..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/services/TypeMismatchService.java +++ /dev/null @@ -1,45 +0,0 @@ -package no.sikt.graphitron.codereferences.services; - -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.AddressRecord; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CustomerRecord; - -import java.util.List; - -/** - * Test service for validating parameter type mismatch detection. - * Methods have unambiguous parameter types (no overloads sharing the same name). - */ -public class TypeMismatchService { - public String check(CustomerRecord record) { - return null; - } - - public String checkNested(CustomerRecord customer, AddressRecord address) { - return null; - } - - public String checkNested(CustomerRecord customer, AddressRecord address, CustomerRecord customer2) { - return null; - } - - public String checkNestedWrongCount(CustomerRecord customer, AddressRecord address, CustomerRecord customer2) { - return null; - } - - public String checkString(String wrongType) { - return null; - } - - public String checkList(List<CustomerRecord> records) { - return null; - } - - public String checkIncorrect(List<String> wrongType) { - return null; - } - - public String checkAllInputFeatures(CustomerRecord input, String order, int first, String after, String ctx1, String ctx2) { - return null; - } - -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/transforms/SomeTransform.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/transforms/SomeTransform.java deleted file mode 100644 index a52152ae18..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/codereferences/transforms/SomeTransform.java +++ /dev/null @@ -1,12 +0,0 @@ -package no.sikt.graphitron.codereferences.transforms; - -import org.jooq.DSLContext; -import org.jooq.UpdatableRecord; - -import java.util.List; - -public class SomeTransform { - public static <T extends UpdatableRecord<T>> List<T> someTransform(DSLContext ctx, List<T> records) { - return null; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/common/CodeBlockTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/common/CodeBlockTest.java deleted file mode 100644 index cd7f7f04e8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/common/CodeBlockTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package no.sikt.graphitron.common; - -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphql.schema.ProcessedSchema; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Functionality that is used for testing individual code blocks. - */ -public abstract class CodeBlockTest extends GeneratorTest { - protected abstract CodeBlock makeCodeBlock(ProcessedSchema schema); - - protected void compareCodeBlockResult(String path, String expected, SchemaComponent... components) { - assertThat(makeCodeBlock(getProcessedSchema(path, components)).toString()).isEqualToIgnoringWhitespace(expected); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/common/GeneratorTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/common/GeneratorTest.java deleted file mode 100644 index c30dcdce65..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/common/GeneratorTest.java +++ /dev/null @@ -1,419 +0,0 @@ -package no.sikt.graphitron.common; - -import no.sikt.graphitron.common.configuration.ReferencedEntry; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.common.configuration.TestConfiguration; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.configuration.externalreferences.GlobalTransform; -import no.sikt.graphitron.generate.GraphQLGenerator; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.validation.ValidationHandler; -import no.sikt.graphql.schema.ProcessedSchema; -import org.jetbrains.annotations.NotNull; -import org.junit.ComparisonFailure; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.function.Executable; - -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.*; -import java.nio.file.attribute.BasicFileAttributes; -import java.util.*; -import java.util.regex.Pattern; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static java.util.regex.Pattern.DOTALL; -import static no.sikt.graphitron.common.configuration.TestConfiguration.*; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertAll; - -/** - * Abstractions for functionality that is used across multiple test classes. - */ -public abstract class GeneratorTest { - private final String sourceTestPath; - private final Set<SchemaComponent> components; - protected final boolean checkProcessedSchemaDefault; - private final Set<ExternalReference> references; - private final Set<GlobalTransform> globalTransforms; - - private final static String - MSG_CONTAIN_EXPECT = "Expected to find", - MSG_NOT_CONTAIN_EXPECT = "Unexpectedly found", - MSG_CONTAIN_ACTUAL = "in:", - - MSG_GENERATED_EXPECT = "Expected the generated code:", - MSG_GENERATED_ACTUAL = "to be equivalent with excluding imports:", - MSG_IMPORT_EXPECT = "Expected the generated imports:", - MSG_IMPORT_ACTUAL = "to be equivalent with:", - MSG_EXPECT = String.format("(%s)", String.join("|", MSG_CONTAIN_EXPECT, MSG_NOT_CONTAIN_EXPECT, MSG_GENERATED_EXPECT, MSG_IMPORT_EXPECT)), - MSG_ACTUAL = String.format("(%s)", String.join("|", MSG_CONTAIN_ACTUAL, MSG_GENERATED_ACTUAL, MSG_IMPORT_ACTUAL)); - private final static Pattern - PATTERN_EXP = Pattern.compile(MSG_EXPECT + "(.*?)" + MSG_ACTUAL, DOTALL), - PATTERN_ACTUAL = Pattern.compile(MSG_ACTUAL + "(.*?)(java\\.lang\\.|$)", DOTALL); - - public GeneratorTest() { - sourceTestPath = SRC_ROOT + "/" + getSubpath() + "/"; - this.checkProcessedSchemaDefault = getCheckProcessedSchemaDefault(); - this.components = getComponents(); - this.references = getExternalReferences(); - this.globalTransforms = getGlobalTransforms(); - } - - public String getSourceTestPath() { - return sourceTestPath; - } - - protected Map<String, List<String>> generateFiles(String schemaParentFolder) { - return generateFiles(schemaParentFolder, Set.of()); - } - - protected Map<String, List<String>> generateFiles(String schemaParentFolder, Set<SchemaComponent> extraComponents) { - return GraphQLGenerator.generateAsStrings(makeGenerators(getProcessedSchema(schemaParentFolder, extraComponents))); - } - - protected Map<String, List<String>> generateFiles(Set<SchemaComponent> components) { - return GraphQLGenerator.generateAsStrings(makeGenerators(getProcessedSchema(components))); - } - - public static void assertGeneratedContentMatches(String expectedOutputFolder, Map<String, List<String>> generatedFiles) { - var path = Paths.get(expectedOutputFolder + "/" + EXPECTED_OUTPUT_NAME); - if (!Files.exists(path)) { - throw new IllegalArgumentException( - "Expected output directory not found: " + path + ". Use assertNothingGenerated() if no output is expected." - ); - } - - var expectedFileNames = new HashSet<String>(); - var assertList = new ArrayList<Executable>(); - try { - Files.walkFileTree(path, new SimpleFileVisitor<>() { - @Override - public @NotNull FileVisitResult visitFile(@NotNull Path expectedOutputFile, @NotNull BasicFileAttributes attrs) { - String expectedFileName = expectedOutputFile.getFileName().toString().replace(".java", ""); - expectedFileNames.add(expectedFileName); - var expectedFile = readFileAsStrings(expectedOutputFile); - if (!generatedFiles.containsKey(expectedFileName)) { - return FileVisitResult.CONTINUE; - } - - var generatedFile = generatedFiles.get(expectedFileName); - var expected = formatExpectedFile(expectedFile); - assertList.add( - () -> { - String actual = formatGeneratedFile(generatedFile); - assertThat(actual) - .withFailMessage( - "\u001B[33;1m%s\u001B[0;35m\n%s\n\n\u001B[33;1m%s\u001B[0;35m\n%s\n\u001B[0m", - MSG_GENERATED_EXPECT, - expected, - MSG_GENERATED_ACTUAL, - actual - ) - .isEqualToIgnoringWhitespace(expected); - } - ); - - var expectedFileImports = asImportList(expectedFile); - var generatedFileImports = asImportList(generatedFile); - assertList.add( - () -> assertThat(simplifyImports(generatedFileImports)) - .withFailMessage( - "\u001B[33;1m%s\u001B[0;35m\n%s\n\n\u001B[33;1m%s\u001B[0;35m\n%s\n\u001B[0m", - MSG_IMPORT_EXPECT, - String.join("\n", generatedFileImports), - MSG_IMPORT_ACTUAL, - String.join("\n", expectedFileImports) - ) - .containsExactlyInAnyOrderElementsOf(simplifyImports(expectedFileImports)) // Allows us to ignore import order. - ); - - return FileVisitResult.CONTINUE; - } - }); - } catch (IOException e) { - throw new RuntimeException(e); - } - - assertList.add(() -> assertThat(generatedFiles.keySet()).containsExactlyInAnyOrderElementsOf(expectedFileNames)); - assertAllWithReducedStackTrace(assertList); - } - - private static String formatGeneratedFile(List<String> generatedFile) { - return generatedFile - .stream() - .filter(it -> !it.startsWith("import") && !it.startsWith("package")) - .collect(Collectors.joining("\n")); - } - - private static String formatExpectedFile(List<String> expectedFile) { - var expectedFileNoImports = expectedFile - .stream() - .filter(it -> !it.startsWith("import") && !it.startsWith("package")) - .toList(); - var trimmedExpectedFile = new ArrayList<String>(); - var isText = false; - for (var line : expectedFileNoImports) { - if (!line.isEmpty()) { - isText = true; - } - if (isText) { - trimmedExpectedFile.add(line); - } - } - return String.join("\n", trimmedExpectedFile); - } - - private static void assertAllWithReducedStackTrace(ArrayList<Executable> assertList) { - try { - assertAll(assertList); - } catch (AssertionError e) { - var message = e.getMessage(); - var messageNoColour = message.replaceAll("\u001B\\[[;\\d]*m", ""); - - var matcherExp = PATTERN_EXP.matcher(messageNoColour); - var expected = new ArrayList<String>(); - while (matcherExp.find()) { - expected.add(matcherExp.group(2).strip()); - } - - var matcherActual = PATTERN_ACTUAL.matcher(messageNoColour); - var actual = new ArrayList<String>(); - while (matcherActual.find()) { - var match = matcherActual.group(2).strip(); - if (actual.stream().noneMatch(it -> it.equals(match))) { - actual.add(match); - } - } - - // Prints the failures to the console twice, so that IDE comparison will show up. - throw new ComparisonFailure(message, String.join("\n\n", expected), String.join("\n\n", actual)); - - // Prints the failures to the console. - // throw new MultipleFailuresError(e.getMessage(), List.of()); - } - } - - private static List<String> simplifyImports(List<String> lines) { - return lines.stream().map(it -> it.replaceFirst("import ", "")).collect(Collectors.toList()); - } - - private static List<String> asImportList(List<String> expectedFile) { - return expectedFile - .stream() - .filter(it -> it.startsWith("import")) - .collect(Collectors.toList()); - } - - public ProcessedSchema getProcessedSchema(String schemaParentFolder, SchemaComponent... extraComponents) { - return getProcessedSchema(schemaParentFolder, Set.of(extraComponents)); - } - - public ProcessedSchema getProcessedSchema(String schemaParentFolder, Set<SchemaComponent> extraComponents) { - var schemaFile = Paths.get(sourceTestPath + schemaParentFolder + "/" + COMMON_TEST_SCHEMA_NAME); - if (!Files.exists(schemaFile)) { - throw new IllegalArgumentException( - "Test schema file not found: " + schemaFile - ); - } - return TestConfiguration.getProcessedSchema(sourceTestPath + schemaParentFolder, mergeComponentsAndSetConfig(extraComponents), validateSchema(), checkProcessedSchemaDefault); - } - - public ProcessedSchema getProcessedSchema(SchemaComponent... extraComponents) { - return getProcessedSchema(Set.of(extraComponents)); - } - - public ProcessedSchema getProcessedSchema(Set<SchemaComponent> extraComponents) { - return TestConfiguration.getProcessedSchema(mergeComponentsAndSetConfig(extraComponents), validateSchema(), checkProcessedSchemaDefault); - } - - protected Set<String> mergeComponentsAndSetConfig(Set<SchemaComponent> extraComponents) { - var allComponents = Stream.concat(components.stream(), extraComponents.stream()).collect(Collectors.toSet()); - var allPaths = allComponents.stream().flatMap(it -> it.getPaths().stream()).collect(Collectors.toSet()); - var allReferences = Stream.concat(references.stream(), allComponents.stream().flatMap(it -> makeReferences(it.getReferences()).stream())).collect(Collectors.toSet()); - - setProperties(new ArrayList<>(allReferences), new ArrayList<>(globalTransforms)); - return allPaths; - } - - protected void assertGeneratedContentMatches(String resourceRootFolder) { - assertGeneratedContentMatches(sourceTestPath + resourceRootFolder, generateFiles(resourceRootFolder)); - } - - protected void assertGeneratedContentMatches(String resourceRootFolder, SchemaComponent... extraComponents) { - assertGeneratedContentMatches(sourceTestPath + resourceRootFolder, generateFiles(resourceRootFolder, Set.of(extraComponents))); - } - - /** - * Asserts that generated content matches expected output files, building the schema entirely from the given - * components. Unlike {@link #assertGeneratedContentMatches(String, SchemaComponent...)}, this does not require - * a {@code schema.graphqls} file in the resource folder. - */ - protected void assertGeneratedContentMatchesFromComponents(String expectedOutputFolder, SchemaComponent... components) { - assertGeneratedContentMatches(sourceTestPath + expectedOutputFolder, generateFiles(Set.of(components))); - } - - - protected static void contains(Map<String, List<String>> generatedFiles, String... expected) { - if (expected.length < 1) { - return; - } - var allFileContent = processFileContent(generatedFiles); - var asserts = new ArrayList<Executable>(); - Stream.of(expected).forEach(it -> - asserts.add(() -> assertThat(allFileContent) - .withFailMessage( - "\u001B[33;1m%s\u001B[0;35m\n%s\n\u001B[33;1m%s\u001B[0;35m\n%s\n\u001B[0m", - MSG_CONTAIN_EXPECT, - it, - MSG_CONTAIN_ACTUAL, - allFileContent - ) - .containsIgnoringWhitespaces(it) - )); - assertAllWithReducedStackTrace(asserts); - } - - private static String processFileContent(Map<String, List<String>> generatedFiles) { - return generatedFiles - .values() - .stream() - .flatMap(Collection::stream) - .filter(it -> !it.isEmpty() && !it.startsWith("import") && !it.startsWith("package")) - .collect(Collectors.joining("\n")); // Add newlines for readability when the test fails. - } - - protected void assertGeneratedContentContains(String resourceRootFolder, Set<SchemaComponent> extraComponents, String... expected) { - contains(generateFiles(resourceRootFolder, extraComponents), expected); - } - - protected void assertGeneratedContentContains(String resourceRootFolder, String... expected) { - assertGeneratedContentContains(resourceRootFolder, Set.of(), expected); - } - - protected void assertGeneratedContentContains(Set<SchemaComponent> components, String... expected) { - contains(generateFiles(components), expected); - } - - - // Avoid using these three methods if possible, they have worse performance than the ones above. - protected static void doesNotContain(Map<String, List<String>> generatedFiles, String... expected) { - if (expected.length < 1) { - return; - } - var allFileContent = processFileContent(generatedFiles); - var asserts = new ArrayList<Executable>(); - Stream.of(expected).forEach(it -> - asserts.add(() -> assertThat(allFileContent) - .withFailMessage( - "\u001B[33;1m%s\u001B[0;35m\n%s\n\u001B[33;1m%s\u001B[0;35m\n%s\n\u001B[0m", - MSG_NOT_CONTAIN_EXPECT, - it, - MSG_CONTAIN_ACTUAL, - allFileContent - ) - .doesNotContain(it) - ) // Note, does not ignore whitespaces. There is no method for that. - ); - assertAllWithReducedStackTrace(asserts); - } - - protected void resultDoesNotContain(String resourceRootFolder, Set<SchemaComponent> extraComponents, String... expected) { - doesNotContain(generateFiles(resourceRootFolder, extraComponents), expected); - } - - protected void resultDoesNotContain(String resourceRootFolder, String... expected) { - resultDoesNotContain(resourceRootFolder, Set.of(), expected); - } - - protected void resultDoesNotContain(Set<SchemaComponent> extraComponents, String... expected) { - doesNotContain(generateFiles(extraComponents), expected); - } - - - protected void assertFilesAreGenerated(String schemaFolder, String... expectedFiles) { - assertFilesAreGenerated(schemaFolder, Set.of(), expectedFiles); - } - - protected void assertFilesAreGenerated(String schemaFolder, Set<SchemaComponent> extraComponents, String... expectedFiles) { - assertThat(generateFiles(schemaFolder, extraComponents).keySet()).containsExactlyInAnyOrderElementsOf(Set.of(expectedFiles)); - } - - - protected void assertNothingGenerated(String schemaFolder) { - assertNothingGenerated(schemaFolder, Set.of()); - } - - protected void assertNothingGenerated(String schemaFolder, Set<SchemaComponent> extraComponents) { - assertThat(generateFiles(schemaFolder, extraComponents).keySet()).isEmpty(); - } - - protected void assertNothingGenerated(Set<SchemaComponent> extraComponents) { - assertThat(generateFiles(extraComponents).keySet()).isEmpty(); - } - - @BeforeEach - public void setup() { - // Reset ValidationHandler state before each test to prevent cross-test contamination - ValidationHandler.resetErrorMessages(); - ValidationHandler.resetWarningMessages(); - } - - @AfterEach - public void teardown() { - GeneratorConfig.clear(); // To prevent any config from remaining when running multiple tests. - ValidationHandler.resetErrorMessages(); - ValidationHandler.resetWarningMessages(); - } - - protected static List<String> readFileAsStrings(Path file) { - try { - return Files.readAllLines(file, StandardCharsets.UTF_8); - } catch (IOException e) { - throw new RuntimeException("Could not read file: " + file.toFile().getPath(), e); - } - } - - protected Set<ExternalReference> makeReferences(ReferencedEntry... entries) { - return makeReferences(Set.of(entries)); - } - - protected Set<ExternalReference> makeReferences(Set<ReferencedEntry> entries) { - return entries.stream().map(ReferencedEntry::get).collect(Collectors.toSet()); - } - - protected Set<SchemaComponent> makeComponents(SchemaComponent... entries) { - return Stream.of(entries).collect(Collectors.toSet()); - } - - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(); - } - - protected String getSubpath() { - return ""; - } - - protected boolean validateSchema() { - return false; - } - - protected boolean getCheckProcessedSchemaDefault() { - return true; - } - - protected Set<SchemaComponent> getComponents() { - return Set.of(); - } - - protected Set<ExternalReference> getExternalReferences() { - return Set.of(); - } - - protected Set<GlobalTransform> getGlobalTransforms() { - return Set.of(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/common/configuration/ReferencedEntry.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/common/configuration/ReferencedEntry.java deleted file mode 100644 index ab89b989bf..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/common/configuration/ReferencedEntry.java +++ /dev/null @@ -1,89 +0,0 @@ -package no.sikt.graphitron.common.configuration; - -import no.sikt.graphitron.codereferences.conditions.*; -import no.sikt.graphitron.codereferences.dummyreferences.DummyCondition; -import no.sikt.graphitron.codereferences.dummyreferences.DummyJOOQEnum; -import no.sikt.graphitron.codereferences.dummyreferences.DummyRecord; -import no.sikt.graphitron.codereferences.dummyreferences.DummyService; -import no.sikt.graphitron.codereferences.records.*; -import no.sikt.graphitron.codereferences.services.*; -import no.sikt.graphitron.configuration.externalreferences.ExternalClassReference; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; - -public enum ReferencedEntry { - // Dummy service. - DUMMY_SERVICE("DUMMY_SERVICE", DummyService.class), - - // Dummy record. - DUMMY_RECORD("DUMMY_RECORD", DummyRecord.class), - - // Dummy condition. - DUMMY_CONDITION("DUMMY_CONDITION", DummyCondition.class), - - // Dummy enum. - DUMMY_JOOQ_ENUM("DUMMY_JOOQ_ENUM", DummyJOOQEnum.class), - - // Mapping services. - MAPPER_FETCH_SERVICE("MAPPER_FETCH_SERVICE", MapperFetchService.class), - MAPPER_ID_SERVICE("MAPPER_ID_SERVICE", IDMapperService.class), - CONTEXT_SERVICE("CONTEXT_SERVICE", ContextService.class), - RESOLVER_FETCH_SERVICE("RESOLVER_FETCH_SERVICE", ResolverFetchService.class), - - // Mutation services. - RESOLVER_MUTATION_SERVICE("RESOLVER_MUTATION_SERVICE", ResolverMutationService.class), - - // Mapping records. - MAPPER_RECORD_CITY("MAPPER_RECORD_CITY", MapperCityJavaRecord.class), - MAPPER_RECORD_ADDRESS("MAPPER_RECORD_ADDRESS", MapperAddressJavaRecord.class), - MAPPER_RECORD_ENUM("MAPPER_RECORD_ENUM", MapperEnumRecord.class), - ID_RECORD("ID_RECORD", IDJavaRecord.class), - NESTED_RECORD("NESTED_RECORD", MapperNestedJavaRecord.class), - - // Input record services. - JAVA_RECORD_FETCH_SERVICE("JAVA_RECORD_FETCH_SERVICE", JavaRecordInputFetchService.class), - JOOQ_RECORD_FETCH_SERVICE("JOOQ_RECORD_FETCH_SERVICE", JOOQRecordInputFetchService.class), - JAVA_RECORD_CUSTOMER("JAVA_RECORD_CUSTOMER", CustomerJavaRecord.class), - JAVA_RECORD_STAFF_INPUT1("JAVA_RECORD_STAFF_INPUT1", StaffInput1JavaRecord.class), - JAVA_RECORD_STAFF_INPUT2("JAVA_RECORD_STAFF_INPUT2", StaffInput2JavaRecord.class), - JAVA_RECORD_STAFF_INPUT3("JAVA_RECORD_STAFF_INPUT3", StaffInput3JavaRecord.class), - JAVA_RECORD_STAFF_NAME("JAVA_RECORD_STAFF_NAME", StaffNameJavaRecord.class), - - // Input record conditions. - RECORD_FETCH_CONDITION("RECORD_FETCH_CONDITION", RecordCustomerCondition.class), - RECORD_FETCH_STAFF_CONDITION("RECORD_FETCH_STAFF_CONDITION", RecordStaffCondition.class), - - // Query conditions. - REFERENCE_CUSTOMER_CONDITION("REFERENCE_CUSTOMER_CONDITION", ReferenceCustomerCondition.class), - REFERENCE_FILM_CONDITION("REFERENCE_FILM_CONDITION", ReferenceFilmCondition.class), - QUERY_FETCH_CONDITION("QUERY_FETCH_CONDITION", QueryCustomerCondition.class), - QUERY_FETCH_STAFF_CONDITION("QUERY_FETCH_STAFF_CONDITION", QueryStaffCondition.class), - QUERY_FETCH_ADDRESS_INTERFACE_CONDITION("QUERY_FETCH_ADDRESS_INTERFACE_CONDITION", QueryAddressInterfaceCondition.class), - QUERY_FETCH_PAYMENT_INTERFACE_CONDITION("QUERY_FETCH_PAYMENT_INTERFACE_CONDITION", QueryPaymentInterfaceCondition.class), - REFERENCE_PG_USER_MAPPING_CONDITION("REFERENCE_PG_USER_MAPPING_CONDITION", PgUserMappingCondition.class), - CONTEXT_CONDITION("CONTEXT_CONDITION", ContextCondition.class), - PAYMENT_CONDITION("PAYMENT_CONDITION", PaymentCondition.class), - - // NodeId to jOOQ record test records. - NODEID_INPUT_JAVA_RECORD("NODEID_INPUT_JAVA_RECORD", NodeIdInputJavaRecord.class), - RENTAL_INPUT_JAVA_RECORD("RENTAL_INPUT_JAVA_RECORD", RentalInputJavaRecord.class), - FILM_ACTOR_INPUT_JAVA_RECORD("FILM_ACTOR_INPUT_JAVA_RECORD", FilmActorInputJavaRecord.class), - COMPOSITE_KEY_INPUT_JAVA_RECORD("COMPOSITE_KEY_INPUT_JAVA_RECORD", CompositeKeyInputJavaRecord.class), - FILM_JAVA_RECORD("FILM_JAVA_RECORD", FilmJavaRecord.class), - LISTED_NODEID_INPUT_JAVA_RECORD("LISTED_NODEID_INPUT_JAVA_RECORD", ListedNodeIdInputJavaRecord.class), - LISTED_RENTAL_INPUT_JAVA_RECORD("LISTED_RENTAL_INPUT_JAVA_RECORD", ListedRentalInputJavaRecord.class), - LISTED_AND_SINGULAR_INPUT_JAVA_RECORD("LISTED_AND_SINGULAR_INPUT_JAVA_RECORD", ListedAndSingularInputJavaRecord.class), - LISTED_FILM_ACTOR_INPUT_JAVA_RECORD("LISTED_FILM_ACTOR_INPUT_JAVA_RECORD", ListedFilmActorInputJavaRecord.class), - - // Optional field record. - OPTIONAL_FIELD_RECORD("OPTIONAL_FIELD_RECORD", OptionalFieldJavaRecord.class); - - private final ExternalReference reference; - - ReferencedEntry(String name, Class<?> referenceClass) { - this.reference = new ExternalClassReference(name, referenceClass); - } - - public ExternalReference get() { - return reference; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/common/configuration/SchemaComponent.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/common/configuration/SchemaComponent.java deleted file mode 100644 index 67936677f6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/common/configuration/SchemaComponent.java +++ /dev/null @@ -1,113 +0,0 @@ -package no.sikt.graphitron.common.configuration; - -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.*; -import static no.sikt.graphitron.common.configuration.TestConfiguration.COMPONENT_PATH; -import static no.sikt.graphitron.common.configuration.TestConfiguration.SCHEMA_EXTENSION; - -public enum SchemaComponent { - PAGE_INFO("special/PageInfo"), - NODE("special/Node"), - NODE_QUERY("special/NodeQuery"), - ERROR("special/Error"), - ORDER_DIRECTION("special/OrderDirection"), - ORDER("special/Order", ORDER_DIRECTION), - DATE("Date"), - FEDERATION("special/Federation"), - FEDERATION_QUERY("special/FederationQuery", FEDERATION), - - DUMMY_ENUM("enums/DummyEnum"), - DUMMY_ENUM_CONVERTED("enums/DummyEnumConverted", Set.of(ReferencedEntry.DUMMY_JOOQ_ENUM)), - - CUSTOMER("basic/Customer"), - CUSTOMER_NODE("basic/CustomerNode", NODE), - INVENTORY_NODE("basic/InventoryNode", NODE), - FILM_ACTOR_NODE("basic/FilmActorNode", NODE), - CUSTOMER_QUERY("basic/CustomerQuery"), - CUSTOMER_NOT_GENERATED("basic/CustomerNotGenerated"), - CUSTOMER_TABLE("basic/CustomerTable"), - CUSTOMER_INPUT_TABLE("basic/CustomerInputTable"), - CUSTOMER_CONNECTION_ONLY("basic/CustomerConnection", PAGE_INFO), - CUSTOMER_CONNECTION_WITH_NO_OPTIONALS_ONLY("basic/CustomerConnectionWithNoOptionals", PAGE_INFO), - CUSTOMER_CONNECTION(CUSTOMER_TABLE, CUSTOMER_CONNECTION_ONLY), - CUSTOMER_CONNECTION_WITH_NO_OPTIONALS(CUSTOMER_TABLE, CUSTOMER_CONNECTION_WITH_NO_OPTIONALS_ONLY), - CUSTOMER_CONNECTION_ORDER(CUSTOMER_CONNECTION_ONLY, ORDER), - CUSTOMER_UNION("basic/CustomerUnion", CUSTOMER_QUERY), - CUSTOMER_NODE_INPUT_TABLE("basic/CustomerNodeInputTable", CUSTOMER_NODE), - CITY_QUERY("basic/CityQuery"), - ADDRESS_SERVICE("basic/AddressService", Set.of(DUMMY_SERVICE)), - - DUMMY_TYPE("basic/DummyType"), - DUMMY_TYPE_RECORD("basic/DummyTypeRecord", Set.of(ID_RECORD)), - DUMMY_INPUT("basic/DummyInput"), - DUMMY_INPUT_RECORD("basic/DummyInputRecord", Set.of(ID_RECORD)), - DUMMY_CONNECTION("basic/DummyConnection", DUMMY_TYPE, PAGE_INFO), - - ADDRESS_BY_DISTRICT("basic/AddressByDistrict"), - ADDRESS_BY_DISTRICT_CONNECTION("basic/AddressByDistrictConnection"), - - PERSON_WITH_EMAIL("basic/PersonWithEmail"), // Multitable interface - PERSON_WITH_EMAIL_CONNECTION_ONLY("basic/PersonWithEmailConnection"), - PERSON_WITH_EMAIL_CONNECTION(PERSON_WITH_EMAIL, PERSON_WITH_EMAIL_CONNECTION_ONLY), - - SOMEUNION_CONNECTION("basic/SomeUnionConnection"), - - MUTATION_RESPONSE("basic/MutationResponse"), - - NAME_INPUT("basic/NameInput"), - - STAFF("basic/Staff"), - - SPLIT_QUERY_WRAPPER("SplitQueryWrapper"), - - CITY_INPUTS_JOOQ("records/CityInputsJOOQ"), - CITY_INPUTS_JAVA("records/CityInputsJava", Set.of(DUMMY_RECORD)), - - CITY0("records/City0"), - CITY1("records/City1", Set.of(DUMMY_RECORD)), - - NAME_INPUT_JAVA("records/NameInputJava"), - - WRAPPED_ADDRESS_JAVA("records/WrappedAddressJava", Set.of(DUMMY_RECORD), CITY0, CITY1), - WRAPPED_ADDRESS_JOOQ("records/WrappedAddressJOOQ", CITY0, CITY1), - - OPTIONAL_FIELD_INPUT("basic/OptionalFieldInput", Set.of(ReferencedEntry.OPTIONAL_FIELD_RECORD)), - - VALIDATION_ERROR("basic/ValidationError", ERROR); - - private final Set<String> fileNames; - private final Set<ReferencedEntry> references; - - SchemaComponent(SchemaComponent... includes) { - this("", includes); - } - - SchemaComponent(String path, SchemaComponent... includes) { - this(path, Set.of(), includes); - } - - SchemaComponent(String path, Set<ReferencedEntry> references, SchemaComponent... includes) { - var included = Stream.of(includes).flatMap(it -> it.getPaths().stream()); - if (path == null || path.isEmpty()) { - fileNames = included.collect(Collectors.toSet()); - } else { - fileNames = Stream.concat(Stream.of(toFullPath(path)), included).collect(Collectors.toSet()); - } - this.references = Stream.concat(references.stream(), Stream.of(includes).flatMap(it -> it.getReferences().stream())).collect(Collectors.toSet()); - } - - private String toFullPath(String file) { - return COMPONENT_PATH + "/" + file + SCHEMA_EXTENSION; - } - - public Set<String> getPaths() { - return fileNames; - } - - public Set<ReferencedEntry> getReferences() { - return references; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/common/configuration/TestConfiguration.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/common/configuration/TestConfiguration.java deleted file mode 100644 index 70e788b379..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/common/configuration/TestConfiguration.java +++ /dev/null @@ -1,80 +0,0 @@ -package no.sikt.graphitron.common.configuration; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.configuration.externalreferences.GlobalTransform; -import no.sikt.graphitron.generate.GraphQLGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.jetbrains.annotations.NotNull; - -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -public class TestConfiguration { - public static final String - SCHEMA_EXTENSION = ".graphqls", - COMMON_TEST_SCHEMA_NAME = "schema" + SCHEMA_EXTENSION, - DEFAULT_OUTPUT_PACKAGE = "fake.code.generated", - DEFAULT_JOOQ_PACKAGE = "no.sikt.graphitron.jooq.generated.testdata", - SRC_ROOT = "src/test/resources", - COMPONENT_PATH = SRC_ROOT + "/components", - SRC_DIRECTIVES = "../../graphitron-common/src/main/resources/directives" + SCHEMA_EXTENSION, - EXPECTED_OUTPUT_NAME = "expected"; - - @NotNull - public static ProcessedSchema getProcessedSchema(Set<String> components, boolean validate, boolean checkTypes) { - return getProcessedSchema(null, components, validate, checkTypes); - } - - @NotNull - public static ProcessedSchema getProcessedSchema(String schemaPath, Set<String> components, boolean validate, boolean checkTypes) { - var pathFiles = schemaPath != null ? Stream.of(SRC_DIRECTIVES, schemaPath + "/" + COMMON_TEST_SCHEMA_NAME) : Stream.of(SRC_DIRECTIVES); - var files = Stream.concat(pathFiles, components.stream()).collect(Collectors.toSet()); - GeneratorConfig.setGeneratorSchemaFiles(files); - GeneratorConfig.setUserSchemaFiles(files); - - var processedSchema = GraphQLGenerator.getProcessedSchema(); - if (validate) { - processedSchema.validate(checkTypes); - } - return processedSchema; - } - - public static void setProperties(List<ExternalReference> references, List<GlobalTransform> globalTransforms) { - GeneratorConfig.setProperties( - Set.of(), - "", - DEFAULT_OUTPUT_PACKAGE, - DEFAULT_JOOQ_PACKAGE, - references, - Set.of( - "no.sikt.graphitron.codereferences.conditions", - "no.sikt.graphitron.codereferences.dummyreferences", - "no.sikt.graphitron.codereferences.records", - "no.sikt.graphitron.codereferences.services", - "no.sikt.graphitron.codereferences.transforms", - "no.sikt.graphitron.codereferences.extensionmethods.ClassWithExtensionMethod", - "no.sikt.graphitron.codereferences.extensionmethods.ClassWithDuplicatedExtensionMethod" - ), - globalTransforms - ); - } - - public static void setProperties(List<ExternalReference> references) { - setProperties(references, List.of()); - } - - public static void setProperties() { - GeneratorConfig.setProperties( - Set.of(), - "", - DEFAULT_OUTPUT_PACKAGE, - DEFAULT_JOOQ_PACKAGE, - List.of(), - Set.of(), - List.of() - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/services/edit/ResolverTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/services/edit/ResolverTest.java deleted file mode 100644 index 5172db822f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/services/edit/ResolverTest.java +++ /dev/null @@ -1,173 +0,0 @@ -package no.sikt.graphitron.datafetchers.services.edit; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.configuration.RecordValidation; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.datafetchers.operations.OperationClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.CONTEXT_SERVICE; -import static no.sikt.graphitron.common.configuration.ReferencedEntry.RESOLVER_MUTATION_SERVICE; -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("Mutation resolvers - Resolvers with services") -public class ResolverTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "datafetchers/edit/services"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(RESOLVER_MUTATION_SERVICE, CONTEXT_SERVICE); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new OperationClassGenerator(schema)); - } - - @Test - @DisplayName("No inputs") - void defaultCase() { - assertGeneratedContentMatches("default"); - } - - @Test - @DisplayName("Single input") - void oneInput() { - assertGeneratedContentContains("oneInput", "_mi_in = _iv_env.getArgument(\"in\")", ".mutation(_mi_in)"); - } - - @Test - @DisplayName("Single context input") - void contextInput() { - assertGeneratedContentContains("contextInput", - "_iv_graphCtx = _iv_env.getGraphQlContext()", - "String _cf_ctxField = _iv_graphitronContext.getContextArgument(_iv_env, \"ctxField\")", - "mutation(_cf_ctxField)" - ); - } - - @Test - @DisplayName("Listed input") - void listedInput() { - assertGeneratedContentContains("listedInput", "in = _iv_env.getArgument(\"in\")", ".mutation(_mi_in)"); - } - - @Test - @DisplayName("Two inputs") - void multipleInputs() { - assertGeneratedContentContains("multipleInputs", ".mutation(_mi_in0, _mi_in1)"); - } - - @Test - @DisplayName("Record input") - void recordInput() { - assertGeneratedContentContains("recordInput", Set.of(CUSTOMER_INPUT_TABLE), ".mutation(_mi_inRecord)"); - } - - @Test // Tests this only once as it is treated the same as jOOQ records otherwise. - @DisplayName("Java record input") - void javaRecordInput() { - assertGeneratedContentContains("javaRecordInput", Set.of(DUMMY_INPUT_RECORD), ".mutation(_mi_inRecord)"); - } - - @Test - @DisplayName("Two record inputs") - void multipleRecordInputs() { - assertGeneratedContentContains("multipleRecordInputs", Set.of(CUSTOMER_INPUT_TABLE), ".mutation(_mi_in0Record, _mi_in1Record)"); - } - - @Test - @DisplayName("Listed record input") - void listedRecordInput() { - assertGeneratedContentContains("listedRecordInput", Set.of(CUSTOMER_INPUT_TABLE), ".mutation(_mi_inRecordList)"); - } - - @Test // Not sure if this is the intended behaviour for such cases. The service will not be able to handle this type. - @DisplayName("Input with non-record wrapper") - void wrappedInput() { - assertGeneratedContentContains("wrappedInput", ".mutation(_mi_in)"); - } - - @Test - @DisplayName("JOOQ input record containing another input jOOQ record") - void nestedInputRecord() { - assertGeneratedContentContains("nestedInputRecord", Set.of(CUSTOMER_INPUT_TABLE), ".mutation(_mi_in0Record, _mi_in1Record)"); - } - - @Test - @DisplayName("JOOQ input record containing a listed input jOOQ record") - void nestedListedInputRecord() { - assertGeneratedContentContains( - "nestedListedInputRecord", Set.of(CUSTOMER_INPUT_TABLE), - "in1RecordList = new ArrayList<", - "in1RecordList = _iv_transform.", - ".mutation(_mi_in0Record, _mi_in1RecordList)" - ); - } - - @Test // This logic gets so convoluted that it might just be better to remove the support for this. - @DisplayName("Listed JOOQ input record containing a listed input jOOQ record") - void nestedTwiceListedInputRecord() { - assertGeneratedContentContains( - "nestedTwiceListedInputRecord", Set.of(CUSTOMER_INPUT_TABLE), - "in1RecordList = new ArrayList<", - "for (int _niit_in0 = 0; _niit_in0 < _mi_in0.size(); _niit_in0++) {" + - "var _nit_in0 = _mi_in0.get(_niit_in0);if (_nit_in0 == null) continue;" + - "var _mi_in1 = _nit_in0.getIn1();" + - "_mi_in1RecordList.addAll(_iv_transform.customerInputTableToJOOQRecord(_mi_in1, _iv_transform.getArgumentPresence().child(\"in1\"), \"in0/in1\"", - ".mutation(_mi_in0RecordList, _mi_in1RecordList)" - ); - } - - @Test - @DisplayName("Two layers of jOOQ records containing other records") - void doubleNestedInputRecord() { - assertGeneratedContentContains( - "doubleNestedInputRecord", Set.of(CUSTOMER_INPUT_TABLE), - "in0Record = _iv_transform.", - "var _mi_in1 = _mi_in0.getIn1();if (_mi_in1 != null) {_mi_in1Record = _iv_transform.wrapper1ToJOOQRecord(_mi_in1, _iv_transform.getArgumentPresence().child(\"in1\"), \"in0/in1\");" + - "var _mi_in2 = _mi_in1.getIn2();_mi_in2Record = _iv_transform.customerInputTableToJOOQRecord(_mi_in2, _iv_transform.getArgumentPresence().child(\"in2\"), \"in0/in1/in2\"", // Inconsistent logic, but should work anyway. - ".mutation(_mi_in0Record, _mi_in1Record, _mi_in2Record)" - ); - } - - @Test - @DisplayName("With service that returns a jOOQ record, should fetch from DB") - void returningJOOQRecord() { - assertGeneratedContentContains( - "returningJOOQRecord", Set.of(CUSTOMER_TABLE), - "_iv_serviceResult.key().into(", - "new DataFetcherHelper(_iv_env).load(_iv_serviceKey" - ); - resultDoesNotContain( - "returningJOOQRecord", Set.of(CUSTOMER_TABLE), - "customerTableRecordToGraphType" - ); - } - - @Test - @DisplayName("Service that returns a Java record") - void returningJavaRecord() { - assertGeneratedContentContains( - "returningJavaRecord", Set.of(DUMMY_TYPE_RECORD), - ".dummyTypeRecordToGraphType(_iv_response, \"\")" - ); - } - - @Test - @DisplayName("Validation enabled") - void validation() { - GeneratorConfig.setRecordValidation(new RecordValidation(true, null)); - assertGeneratedContentContains("recordInput", Set.of(CUSTOMER_INPUT_TABLE), "_iv_transform.validate();"); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/services/fetch/InputRecordTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/services/fetch/InputRecordTest.java deleted file mode 100644 index 61b0c7ecc1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/services/fetch/InputRecordTest.java +++ /dev/null @@ -1,79 +0,0 @@ -package no.sikt.graphitron.datafetchers.services.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.datafetchers.operations.OperationClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.RESOLVER_FETCH_SERVICE; -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("Fetch service resolvers - Resolvers that call custom services with records") -public class InputRecordTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "datafetchers/fetch/services"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(RESOLVER_FETCH_SERVICE); - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(CUSTOMER); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new OperationClassGenerator(schema)); - } - - @Test - @DisplayName("Root service including input Java records") - void withInputJavaRecord() { - assertGeneratedContentContains( - "operation/withInputJavaRecord", Set.of(DUMMY_INPUT_RECORD), - "inRecord = _iv_transform.dummyInputRecordToJavaRecord(_mi_in, _iv_transform.getArgumentPresence().child(\"in\"), \"in\")", - "resolverFetchService.query(_mi_inRecord)" - ); - } - - @Test - @DisplayName("Root service including input jOOQ records") - void withInputJOOQRecord() { - assertGeneratedContentContains( - "operation/withInputJOOQRecord", Set.of(CUSTOMER_INPUT_TABLE), - "inRecord = _iv_transform.customerInputTableToJOOQRecord(_mi_in, _iv_transform.getArgumentPresence().child(\"in\"), \"in\")", - "resolverFetchService.query(_mi_inRecord)" - ); - } - - @Test - @DisplayName("Service including input Java records") - void withInputJavaRecordOnSplitQuery() { - assertGeneratedContentContains( - "splitquery/withInputJavaRecord", Set.of(SPLIT_QUERY_WRAPPER, DUMMY_INPUT_RECORD), - "inRecord = _iv_transform.dummyInputRecordToJavaRecord(_mi_in, _iv_transform.getArgumentPresence().child(\"in\"), \"in\")", - "resolverFetchService.query(_iv_keys, _mi_inRecord)" - ); - } - - @Test - @DisplayName("Service including input jOOQ records") - void withInputJOOQRecordOnSplitQuery() { - assertGeneratedContentContains( - "splitquery/withInputJOOQRecord", Set.of(SPLIT_QUERY_WRAPPER, CUSTOMER_INPUT_TABLE), - "inRecord = _iv_transform.customerInputTableToJOOQRecord(_mi_in, _iv_transform.getArgumentPresence().child(\"in\"), \"in\")", - "resolverFetchService.query(_iv_keys, _mi_inRecord)" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/services/fetch/OutputRecordTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/services/fetch/OutputRecordTest.java deleted file mode 100644 index c2da93fc7f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/services/fetch/OutputRecordTest.java +++ /dev/null @@ -1,74 +0,0 @@ -package no.sikt.graphitron.datafetchers.services.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.datafetchers.operations.OperationClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.DUMMY_RECORD; -import static no.sikt.graphitron.common.configuration.ReferencedEntry.RESOLVER_FETCH_SERVICE; -import static no.sikt.graphitron.common.configuration.SchemaComponent.DUMMY_TYPE_RECORD; -import static no.sikt.graphitron.common.configuration.SchemaComponent.SPLIT_QUERY_WRAPPER; - -@DisplayName("Fetch service resolvers - Resolvers that call custom services with records") -public class OutputRecordTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "datafetchers/fetch/services"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(RESOLVER_FETCH_SERVICE, DUMMY_RECORD); - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(DUMMY_TYPE_RECORD); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new OperationClassGenerator(schema)); - } - - @Test - @DisplayName("Root service returning Java records") - void returningJavaRecord() { - assertGeneratedContentContains( - "operation/returningJavaRecord", - "DataFetcher<CompletableFuture<DummyTypeRecord>>", - "resolverFetchService.queryJavaRecord(),", - "recordTransform.dummyTypeRecordToGraphType(_iv_response, \"\")" - ); - } - - @Test - @DisplayName("Service returning Java records wrapped in a non-record graph type") // The naming of the methods may be a bit off here. This test just ensures the resolver uses the right one. - void returningWrappedJavaRecord() { - assertGeneratedContentContains( - "operation/returningWrappedJavaRecord", - "DataFetcher<CompletableFuture<Wrapper>>", - "resolverFetchService.queryJavaRecord(),", - "recordTransform.wrapperRecordToGraphType(_iv_response, \"\")" - ); - } - - @Test - @DisplayName("Service returning Java records") - void returningJavaRecordOnSplitQuery() { - assertGeneratedContentContains( - "splitquery/returningJavaRecord", Set.of(SPLIT_QUERY_WRAPPER), - "DataFetcher<CompletableFuture<DummyTypeRecord>>", - "resolverFetchService.queryJavaRecord(_iv_keys)", - "recordTransform.dummyTypeRecordToGraphType(_iv_response, \"\")" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/services/fetch/ResolverTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/services/fetch/ResolverTest.java deleted file mode 100644 index bcc8bd5e95..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/services/fetch/ResolverTest.java +++ /dev/null @@ -1,237 +0,0 @@ -package no.sikt.graphitron.datafetchers.services.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.datafetchers.operations.OperationClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static org.assertj.core.api.Assertions.assertThat; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.CONTEXT_SERVICE; -import static no.sikt.graphitron.common.configuration.ReferencedEntry.RESOLVER_FETCH_SERVICE; -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("Fetch service resolvers - Resolvers that call custom services") -public class ResolverTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "datafetchers/fetch/services"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(RESOLVER_FETCH_SERVICE, CONTEXT_SERVICE); - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(CUSTOMER); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new OperationClassGenerator(schema)); - } - - @Test - @DisplayName("Basic root service with no extra parameters") - void defaultCase() { - assertGeneratedContentMatches("operation/default"); - } - - @Test - @DisplayName("Basic root service with a parameter") - void withInput() { - assertGeneratedContentContains("operation/withInput", "String _mi_id = _iv_env.getArgument(\"id\")", "resolverFetchService.query(_mi_id)"); - } - - @Test - @DisplayName("Basic root service with a context parameter") - void withContextInput() { - assertGeneratedContentContains( - "operation/withContextInput", - "graphCtx = _iv_env.getGraphQlContext()", - "GraphitronContext _iv_graphitronContext = _iv_graphCtx.get(\"graphitronContext\")", - "ctxField = _iv_graphitronContext.getContextArgument(_iv_env, \"ctxField\")", - "query(_cf_ctxField)" - ); - } - - @Test - @DisplayName("TableMethod with context input") - void tableMethodWithContextInput() { - assertGeneratedContentContains("operation/contextTableMethod", "QueryDBQueries.customerForQuery(_iv_ctx, _cf_ctxField, _iv_selectionSet)"); - } - - @Test - @DisplayName("Basic root service with both a context parameter and a standard parameter") - void withContextInputAndArgument() { - assertGeneratedContentContains("operation/withContextInputAndArgument", "query(_mi_i, _cf_ctxField)"); - } - - @Test - @DisplayName("Service with both a context parameter and a pagination parameters") - void withContextInputAndPagination() { - assertGeneratedContentContains( - "operation/withContextInputAndPagination", - Set.of(DUMMY_CONNECTION), - "query(_iv_pageSize, _mi_after, _cf_ctxField)", - ".countQuery(_cf_ctxField)" - ); - } - - @Test - @DisplayName("Root service with pagination") - void withPagination() { - assertGeneratedContentMatches("operation/withPagination", CUSTOMER_CONNECTION); - } - - @Test - @DisplayName("Root service with pagination and a record input") - void withPaginationAndRecord() { - assertGeneratedContentContains( - "operation/withPaginationAndRecord", Set.of(CUSTOMER_CONNECTION, CUSTOMER_INPUT_TABLE), - "in = ResolverHelpers.transformDTO(_iv_env.getArgument(\"in\"), CustomerInputTable.class)", - "inRecord = _iv_transform.customerInputTableToJOOQRecord(_mi_in, _iv_transform.getArgumentPresence().child(\"in\"), \"in\")", - "resolverFetchService.queryList(_mi_inRecord, _iv_pageSize, _mi_after", - "resolverFetchService.countQueryList(_mi_inRecord" - ); - } - - @Test - @DisplayName("Basic service with no extra parameters") - void splitQuery() { - assertGeneratedContentMatches("splitquery/default", SPLIT_QUERY_WRAPPER); - } - - @Test - @DisplayName("Basic service with a parameter") - void splitQueryWithInput() { - assertGeneratedContentContains( - "splitquery/withInput", Set.of(SPLIT_QUERY_WRAPPER), - "String _mi_id = _iv_env.getArgument(\"id\")", - "resolverFetchService.query(_iv_keys, _mi_id)" - ); - } - - @Test - @DisplayName("Service with pagination") - void splitQueryWithPagination() { - assertGeneratedContentMatches("splitquery/withPagination", SPLIT_QUERY_WRAPPER, CUSTOMER_CONNECTION); - } - - @Test - @DisplayName("Service with pagination and a record input") - void splitQueryWithPaginationAndRecord() { - assertGeneratedContentContains( - "splitquery/withPaginationAndRecord", Set.of(SPLIT_QUERY_WRAPPER, CUSTOMER_CONNECTION, CUSTOMER_INPUT_TABLE), - "inRecord = _iv_transform.customerInputTableToJOOQRecord(_mi_in, _iv_transform.getArgumentPresence().child(\"in\"), \"in\")", - "resolverFetchService.queryMap(_iv_keys, _mi_inRecord, _iv_pageSize, _mi_after", - "resolverFetchService.countQueryMap(_iv_keys, _mi_inRecord" - ); - } - - // We had a bug where service dependencies would be applied to all subsequent methods generated by a method generator. - @Test - @DisplayName("Service followed by normal query") - void queryAfterService() { - assertGeneratedContentContains( - "operation/queryAfterService", - "var _rs_resolverFetchService", - "queryNormal() {return _iv_env -> {return" - ); - } - - @Test - @DisplayName("When optional field 'totalCount' is included in the schema for a field having a service and pagination, generate the count method") - void serviceWithPaginationAndAllOptionalFieldsIncluded() { - assertGeneratedContentContains( - "operation/withPaginationAndAllOptionalFieldsIncluded", - Set.of(CUSTOMER_CONNECTION), - """ - .loadPaginated( - _iv_pageSize, - () -> _rs_resolverFetchService.queryList(_iv_pageSize, _mi_after), - (_iv_keys) -> _rs_resolverFetchService.countQueryList(), - (_iv_recordTransform, - """ - ); - } - - @Test - @DisplayName("When optional field 'totalCount' is not included in the schema for a field having a service and pagination, do not generate the count method") - void serviceWithPaginationAndNoOptionalFieldsIncluded() { - assertGeneratedContentContains( - "operation/withPaginationAndNoOptionalFieldsIncluded", - Set.of(CUSTOMER_CONNECTION_WITH_NO_OPTIONALS), - """ - .loadPaginated( - _iv_pageSize, - () -> _rs_resolverFetchService.queryList(_iv_pageSize, _mi_after), - (_iv_recordTransform, _iv_response) -> _iv_recordTransform.customerTableRecordToGraphType(_iv_response, "") - ); - """ - ); - } - - @Test - @DisplayName("Query service returning table type should auto-fetch from DB via DataFetcherHelper") - void returningTableWithAutoFetch() { - assertGeneratedContentContains( - "operation/returningTableWithAutoFetch", Set.of(CUSTOMER_TABLE), - "_iv_serviceResult != null ? _iv_serviceResult.key().into(CustomerRecord.class) : null", - "new DataFetcherHelper(_iv_env).load(_iv_serviceKey" - ); - } - - @Test - @DisplayName("Query service returning table type should NOT use record-to-graph transform") - void returningTableWithAutoFetchShouldNotTransform() { - resultDoesNotContain( - "operation/returningTableWithAutoFetch", Set.of(CUSTOMER_TABLE), - "customerTableRecordToGraphType" - ); - } - - @Test - @DisplayName("Listed service returning table type should use loadByResolverKeys for batch auto-fetch") - void returningTableListWithAutoFetch() { - assertGeneratedContentContains( - "operation/returningTableListWithAutoFetch", Set.of(CUSTOMER_TABLE), - "_iv_serviceResult != null ? _iv_serviceResult.stream().map(_iv_r -> _iv_r != null ? _iv_r.key().into(CustomerRecord.class) : null).toList() : null", - "new DataFetcherHelper(_iv_env).loadByResolverKeys(_iv_serviceKeys" - ); - } - - @Test - @DisplayName("Listed service returning table type should NOT use record-to-graph transform") - void returningTableListWithAutoFetchShouldNotTransform() { - resultDoesNotContain( - "operation/returningTableListWithAutoFetch", Set.of(CUSTOMER_TABLE), - "customerTableRecordToGraphType" - ); - } - - @Test - @DisplayName("@table field on @record type returned by @service should be implicit @splitQuery") - void implicitSplitQueryFromRecord() { - var implicit = generateFiles("operation/implicitSplitQueryFromRecord", Set.of(CUSTOMER_TABLE, DUMMY_TYPE_RECORD)); - var explicit = generateFiles("operation/explicitSplitQueryFromRecord", Set.of(CUSTOMER_TABLE, DUMMY_TYPE_RECORD)); - assertThat(implicit).as("Implicit @splitQuery should generate same output as explicit @splitQuery").isEqualTo(explicit); - } - - @Test - @DisplayName("@table field on @record type nested inside a plain wrapper returned by @service should be implicit @splitQuery") - void implicitSplitQueryFromWrappedRecord() { - var implicit = generateFiles("operation/implicitSplitQueryFromWrappedRecord", Set.of(CUSTOMER_TABLE, DUMMY_TYPE_RECORD)); - var explicit = generateFiles("operation/explicitSplitQueryFromWrappedRecord", Set.of(CUSTOMER_TABLE, DUMMY_TYPE_RECORD)); - assertThat(implicit).as("Implicit @splitQuery through wrapper should generate same output as explicit @splitQuery").isEqualTo(explicit); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/services/fetch/StrategyNodeServiceTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/services/fetch/StrategyNodeServiceTest.java deleted file mode 100644 index 6386957660..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/services/fetch/StrategyNodeServiceTest.java +++ /dev/null @@ -1,81 +0,0 @@ -package no.sikt.graphitron.datafetchers.services.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.datafetchers.operations.OperationClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.DUMMY_RECORD; -import static no.sikt.graphitron.common.configuration.ReferencedEntry.RESOLVER_FETCH_SERVICE; -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("Temporary test class for testing node strategy with services") -public class StrategyNodeServiceTest extends GeneratorTest { - @BeforeAll - static void setUp() { - GeneratorConfig.setNodeStrategy(true); - } - - @AfterAll - static void tearDown() { - GeneratorConfig.setNodeStrategy(false); - } - - @Override - protected String getSubpath() { - return "datafetchers/fetch/services/nodestrategy"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(RESOLVER_FETCH_SERVICE, DUMMY_RECORD); - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(DUMMY_TYPE_RECORD, CUSTOMER_NODE_INPUT_TABLE); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of( - new OperationClassGenerator(schema) - ); - } - - @Test - @DisplayName("Service resolver with node strategy enabled, auto-fetches from DB for table type") - void resolver() { - assertGeneratedContentContains("default", - "_iv_serviceResult.key().into(", - "new DataFetcherHelper(_iv_env).load(_iv_serviceKey" - ); - resultDoesNotContain("default", - "customerNodeRecordToGraphType" - ); - } - - @Test - @DisplayName("Root service including input jOOQ records, auto-fetches from DB for table type") - void withInputJOOQRecord() { - assertGeneratedContentContains( - "withInputJOOQRecord", - ".customerNodeInputTableToJOOQRecord(_mi_in, _iv_nodeIdStrategy, _iv_transform.getArgumentPresence().child(\"in\"), \"in\")", - "_iv_serviceResult.key().into(", - "new DataFetcherHelper(_iv_env).load(_iv_serviceKey" - ); - resultDoesNotContain("withInputJOOQRecord", - "customerNodeRecordToGraphType" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/edit/MutationResolverTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/edit/MutationResolverTest.java deleted file mode 100644 index 479dba5e94..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/edit/MutationResolverTest.java +++ /dev/null @@ -1,87 +0,0 @@ -package no.sikt.graphitron.datafetchers.standard.edit; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.configuration.RecordValidation; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.datafetchers.operations.OperationClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_INPUT_TABLE; - -@DisplayName("Mutation resolvers - Resolvers for delete and insert mutations (will be expanded to include all generated mutations)") -public class MutationResolverTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "datafetchers/edit/standard/withReturning"; - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(CUSTOMER_INPUT_TABLE); - } - - @BeforeAll - static void setUp() { - GeneratorConfig.setUseJdbcBatchingForAllMutations(false); - } - - @AfterAll - static void tearDown() { - GeneratorConfig.setUseJdbcBatchingForAllMutations(true); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new OperationClassGenerator(schema)); - } - - @Test - @DisplayName("Default case for delete") - void delete() { - assertGeneratedContentMatches("delete"); - } - - @Test - @DisplayName("Default case for insert") - void insert() { - assertGeneratedContentContains("insert", - """ - CustomerInputTable _mi_in = ResolverHelpers.transformDTO(_iv_env.getArgument("in"), CustomerInputTable.class); - var _iv_transform = new RecordTransformer(_iv_env); - var _mi_inRecord = _iv_transform.customerInputTableToJOOQRecord(_mi_in, _iv_transform.getArgumentPresence().child("in"), "in"); - return new DataFetcherHelper(_iv_env).load( - (_iv_ctx, _iv_selectionSet) -> MutationDBQueries.mutationForMutation(_iv_ctx, _mi_inRecord, _iv_selectionSet) - ); - """ - ); - } - - @Test - @DisplayName("Returning wrapped output for delete mutation") - void wrappedOutputForDelete() { - assertGeneratedContentContains("wrappedOutputForDelete", - "loadWrapped(" + - "(_iv_ctx, _iv_selectionSet) -> MutationDBQueries.mutationForMutation(_iv_ctx, _mi_inRecord, _iv_selectionSet)," + - "(_iv_result) -> new Wrapper(_iv_result));" - ); - } - - @Test - @DisplayName("Returning wrapped output for insert mutation") - void wrappedOutputForInsert() { - assertGeneratedContentContains("wrappedOutputForInsert", - "loadWrapped(" + - "(_iv_ctx, _iv_selectionSet) -> MutationDBQueries.mutationForMutation(_iv_ctx, _mi_inRecord, _iv_selectionSet)," + - "(_iv_result) -> new Wrapper(_iv_result));" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/edit/NodeIdResolverTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/edit/NodeIdResolverTest.java deleted file mode 100644 index 5127141fe9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/edit/NodeIdResolverTest.java +++ /dev/null @@ -1,108 +0,0 @@ -package no.sikt.graphitron.datafetchers.standard.edit; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.datafetchers.operations.OperationClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.*; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_INPUT_TABLE; -import static no.sikt.graphitron.common.configuration.SchemaComponent.NODE; - -@DisplayName("Mutation resolvers - Resolvers with nodeId for mutations") -public class NodeIdResolverTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "datafetchers/edit/standard"; - } - - @BeforeAll - static void setUp() { - GeneratorConfig.setNodeStrategy(true); - } - - @AfterAll - static void tearDown() { - GeneratorConfig.setNodeStrategy(false); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new OperationClassGenerator(schema)); - } - - @Test - @DisplayName("A mutation that uses nodeIdStrategy") - void nodeIdStrategyWithBatching() { - assertGeneratedContentContains( - "withBatching/nodeId", Set.of(CUSTOMER_INPUT_TABLE, NODE), - ".mutationForMutation(_iv_transform.getCtx(), _iv_nodeIdStrategy, _mi_inRecord)", - ".mutationForMutation(_iv_ctx, _iv_nodeIdStrategy, _mi_inRecord, _iv_selectionSet)" - ); - } - - @Test - @DisplayName("Assert overlapping fields") - void assertInputColumns() { - assertGeneratedContentContains( - "assertInputColumns", Set.of(NODE), - """ - FilmActorInput _mi_in = ResolverHelpers.transformDTO(_iv_env.getArgument("in"), FilmActorInput.class); - var _iv_transform = new RecordTransformer(_iv_env); - var _mi_inRecord = _iv_transform.filmActorInputToJOOQRecord(_mi_in, _iv_nodeIdStrategy, _iv_transform.getArgumentPresence().child("in"), "in"); - var _up_id = _mi_in.getId() != null ? _iv_nodeIdStrategy.unpackIdValues("FilmActor", _mi_in.getId(), FilmActor.FILM_ACTOR.ACTOR_ID, FilmActor.FILM_ACTOR.FILM_ID) : null; - ResolverHelpers.assertSameColumnValues( - "id", _up_id != null ? _iv_nodeIdStrategy.getFieldValue(FilmActor.FILM_ACTOR.ACTOR_ID, _up_id[0]) : null, - "actor", _mi_in.getActor()); - """ - ); - } - - @Test - @DisplayName("Assert overlapping fields with listed input record") - void assertListedInputColumns() { - assertGeneratedContentContains( - "assertListedInputColumns", Set.of(NODE), - """ - List<FilmActorInput> _mi_in = ResolverHelpers.transformDTOList(_iv_env.getArgument("in"), FilmActorInput.class); - var _iv_transform = new RecordTransformer(_iv_env); - var _mi_inRecordList = _iv_transform.filmActorInputToJOOQRecord(_mi_in, _iv_nodeIdStrategy, _iv_transform.getArgumentPresence().child("in"), "in"); - for (var _nit_in : _mi_in) { - var _up_id = _nit_in.getId() != null ? _iv_nodeIdStrategy.unpackIdValues("FilmActor", _nit_in.getId(), FilmActor.FILM_ACTOR.ACTOR_ID, FilmActor.FILM_ACTOR.FILM_ID) : null; - ResolverHelpers.assertSameColumnValues( - "id", _up_id != null ? _iv_nodeIdStrategy.getFieldValue(FilmActor.FILM_ACTOR.ACTOR_ID, _up_id[0]) : null, - "actor", _nit_in.getActor()); - } - """ - ); - } - - @Test - @DisplayName("Assert many overlapping fields") - void assertMultipleOverlappingFields() { - assertGeneratedContentContains("assertManyOverlappingFields", Set.of(NODE), - """ - ResolverHelpers.assertSameColumnValues( - "id", _up_id != null ? _iv_nodeIdStrategy.getFieldValue(FilmActor.FILM_ACTOR.ACTOR_ID, _up_id[0]) : null, - "actor", _nit_in.getActor()); - ResolverHelpers.assertSameColumnValues( - "id", _up_id != null ? _iv_nodeIdStrategy.getFieldValue(FilmActor.FILM_ACTOR.FILM_ID, _up_id[1]) : null, - "filmId", _up_filmId != null ? _iv_nodeIdStrategy.getFieldValue(FilmActor.FILM_ACTOR.FILM_ID, _up_filmId[0]) : null); - """); - } - - @Test - @DisplayName("A delete mutation that uses nodeIdStrategy") - void nodeIdStrategyInDeleteMutation() { - GeneratorConfig.setUseJdbcBatchingForDeletes(false); - assertGeneratedContentContains( - "withReturning/withNodeIdStrategy", Set.of(CUSTOMER_INPUT_TABLE, NODE), - ".mutationForMutation(_iv_ctx, _iv_nodeIdStrategy, _mi_inRecord, _iv_selectionSet)" - ); - GeneratorConfig.setUseJdbcBatchingForDeletes(true); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/edit/ResolverTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/edit/ResolverTest.java deleted file mode 100644 index 512df11c2e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/edit/ResolverTest.java +++ /dev/null @@ -1,139 +0,0 @@ -package no.sikt.graphitron.datafetchers.standard.edit; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.configuration.RecordValidation; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.datafetchers.operations.OperationClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_INPUT_TABLE; -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_TABLE; - -@DisplayName("Mutation resolvers (old) - Resolvers for mutations except delete") -public class ResolverTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "datafetchers/edit/standard/withBatching"; - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(CUSTOMER_INPUT_TABLE); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new OperationClassGenerator(schema)); - } - - @Test // Chose update for these tests, but there is no specific reason for this choice. Mutation type does not affect the resolver (except delete). - @DisplayName("Single input") - void defaultCase() { - assertGeneratedContentMatches("default"); - } - - @Test - @DisplayName("Record input with an additional scalar input") - void withNonRecordInput() { - assertGeneratedContentContains( - "withNonRecordInput", - "String _mi_email = _iv_env.getArgument(\"email\")", - ".mutationForMutation(_iv_transform.getCtx(), _mi_inRecord, _mi_email)" - ); - } - - @Test // Note that this will produce invalid code if the output is not also listed. Should throw exception for such cases. - @DisplayName("Listed input") - void listedInput() { - assertGeneratedContentContains( - "listedInput", - ".getCtx(), _mi_inRecordList", - "ctx, _mi_inRecordList, _iv_selectionSet)" - ); - } - - @Test // These kind of cases are ambiguous because there is no way to know which table to use in query. - @Disabled("Case not supported.") - @DisplayName("Two inputs") - void multipleInputs() { - assertGeneratedContentContains( - "multipleInputs", - ".getCtx(), _mi_in0Record, _mi_in1Record", - "ctx, _mi_in0Record, _mi_in1Record, _iv_selectionSet" - ); - } - - @Test - @Disabled("Case not supported.") - @DisplayName("Two listed inputs") - void multipleListedInputs() { - assertGeneratedContentContains( - "multipleListedInputs", - ".getCtx(), in0RecordList, in1RecordList", - "ctx, in0RecordList, in1RecordList, _iv_selectionSet" - ); - } - - @Test - @Disabled("Case not supported.") - @DisplayName("Two inputs, one listed and one not") - void multipleMixedInputs() { - assertGeneratedContentContains( - "multipleMixedInputs", - ".getCtx(), in0RecordList, in1Record", - "ctx, in0RecordList, in1Record, _iv_selectionSet" - ); - } - - @Test - @DisplayName("Validation enabled") - void validation() { - GeneratorConfig.setRecordValidation(new RecordValidation(true, null)); - assertGeneratedContentContains("default", "_iv_transform.validate();"); - } - - @Test // Note that the query still returns IDs, but we can compare which were NOT found in the database to get the ones deleted. - @DisplayName("Delete mutation") - void delete() { - assertGeneratedContentContains( - "delete", - "DataFetcherHelper(_iv_env).loadDelete(", - "(_iv_result) -> _iv_result == null ? _mi_in.getId() : null" - ); - } - - @Test - @DisplayName("Listed delete mutation") - void deleteListed() { - assertGeneratedContentContains( - "deleteListed", - "in.stream().map(_iv_it -> _iv_it.getId()).filter(_iv_it -> !_iv_result.contains(_iv_it)).toList()" - ); - } - - @Test - @DisplayName("Delete mutation with wrapped output") - void deleteWrapped() { - assertGeneratedContentContains( - "deleteWrapped", Set.of(CUSTOMER_TABLE), - "new CustomerTable(_iv_result.getId() == null ? _mi_in.getId() : null)" - ); - } - - @Test - @DisplayName("Listed delete mutation with wrapped output") - void deleteWrappedListed() { - assertGeneratedContentContains( - "deleteWrappedListed", - "new CustomerOutput(_mi_in.stream().map(_iv_it -> _iv_it.getId()).filter(_iv_it -> !_iv_result.getId().contains(_iv_it)).toList()" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/edit/UpsertAsStoreResolverTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/edit/UpsertAsStoreResolverTest.java deleted file mode 100644 index 7bfb41201b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/edit/UpsertAsStoreResolverTest.java +++ /dev/null @@ -1,87 +0,0 @@ -package no.sikt.graphitron.datafetchers.standard.edit; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.datafetchers.operations.OperationClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_INPUT_TABLE; - -public class UpsertAsStoreResolverTest extends GeneratorTest { - - @Override - protected String getSubpath() { - return "datafetchers/edit/standard/withBatching"; - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(CUSTOMER_INPUT_TABLE); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new OperationClassGenerator(schema)); - } - - @BeforeEach - void setUp() { - GeneratorConfig.setGenerateUpsertAsStore(true); - } - - @AfterEach - void tearDown() { - GeneratorConfig.setGenerateUpsertAsStore(false); - } - - @Test - @DisplayName("Upsert as store") - void withUpsertAsStore() { - assertGeneratedContentContains("upsertAsStore", - """ - return _iv_env -> { - CustomerInputTable _mi_in = ResolverHelpers.transformDTO(_iv_env.getArgument("in"), CustomerInputTable.class); - var _iv_transform = new RecordTransformer(_iv_env); - var _mi_inRecordForFetchRecords = _iv_transform.customerInputTableToJOOQRecord(_mi_in, _iv_transform.getArgumentPresence().child("in"), "in"); - - var _iv_existingRecords = MutationDBQueries.fetchCustomerRecords(_iv_transform.getCtx(), List.of(_mi_inRecordForFetchRecords)); - - var _mi_inRecord = ResolverHelpers.prepareRecordsForStore(_iv_existingRecords, _mi_inRecordForFetchRecords); - - MutationDBQueries.mutationForMutation(_iv_transform.getCtx(), _mi_inRecord); - return new DataFetcherHelper(_iv_env).load((_iv_ctx, _iv_selectionSet) -> MutationDBQueries.mutationForMutation(_iv_ctx, _mi_inRecord, _iv_selectionSet)); - }; - """ - ); - } - - @Test - @DisplayName("Upsert as store with listed input") - void withUpsertAsStoreListed() { - assertGeneratedContentContains("upsertAsStoreListed", - """ - return _iv_env -> { - List<CustomerInputTable> _mi_in = ResolverHelpers.transformDTOList(_iv_env.getArgument("in"), CustomerInputTable.class); - var _iv_transform = new RecordTransformer(_iv_env); - var _mi_inRecordListForFetchRecords = _iv_transform.customerInputTableToJOOQRecord(_mi_in, _iv_transform.getArgumentPresence().child("in"), "in"); - - var _iv_existingRecords = MutationDBQueries.fetchCustomerRecords(_iv_transform.getCtx(), _mi_inRecordListForFetchRecords); - - var _mi_inRecordList = ResolverHelpers.prepareRecordsForStore(_iv_existingRecords, _mi_inRecordListForFetchRecords); - - MutationDBQueries.mutationForMutation(_iv_transform.getCtx(), _mi_inRecordList); - return new DataFetcherHelper(_iv_env).load((_iv_ctx, _iv_selectionSet) -> MutationDBQueries.mutationForMutation(_iv_ctx, _mi_inRecordList, _iv_selectionSet)); - }; - """ - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/fetch/EntityResolverTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/fetch/EntityResolverTest.java deleted file mode 100644 index 305915a489..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/fetch/EntityResolverTest.java +++ /dev/null @@ -1,57 +0,0 @@ -package no.sikt.graphitron.datafetchers.standard.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.datafetchers.operations.OperationClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.FEDERATION_QUERY; - -@DisplayName("Entity resolvers - Resolvers for the entity field") -public class EntityResolverTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "datafetchers/fetch/entity"; - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(FEDERATION_QUERY); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new OperationClassGenerator(schema)); - } - - @Test - @DisplayName("One entity exists") - void defaultCase() { - assertGeneratedContentMatches("default"); - } - - @Test - @DisplayName("Two entities exists") - void twoEntities() { - assertGeneratedContentContains("twoEntities", - """ - Map.ofEntries( - Map.entry("Address", (_iv_ctx, _iv_reps, _iv_selectionSet) -> AddressDBQueries.addressFor_Entity(_iv_ctx, _iv_reps, _iv_selectionSet)), - Map.entry("Customer", (_iv_ctx, _iv_reps, _iv_selectionSet) -> CustomerDBQueries.customerFor_Entity(_iv_ctx, _iv_reps, _iv_selectionSet)) - ) - """ - ); - } - - @Test // Dummy datafetcher when there are no entities, but _entities is defined. Should not happen in practice. - @DisplayName("No entities defined in schema") - void noEntities() { - assertGeneratedContentContains("noEntities", "return _iv_env -> return null;"); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/fetch/LookupTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/fetch/LookupTest.java deleted file mode 100644 index 69b64b42ab..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/fetch/LookupTest.java +++ /dev/null @@ -1,171 +0,0 @@ -package no.sikt.graphitron.datafetchers.standard.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.datafetchers.operations.OperationClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("Lookup datafetchers - Datafetchers that look up exact data points based on keys") -public class LookupTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "datafetchers/fetch/lookup"; - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(DUMMY_TYPE); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new OperationClassGenerator(schema)); - } - - @Test - @DisplayName("One key") // Note that lookup is not defined for non-listed keys. - void defaultCase() { - assertGeneratedContentMatches("default"); - } - - @Test - @DisplayName("One key not on root level") // The rest of the logic should be the same, so no need to make another set of tests for it. Note that this is not fully supported and tested. - void splitQuery() { - assertGeneratedContentMatches("splitQuery", SPLIT_QUERY_WRAPPER); - } - - @Test - @DisplayName("Integer key") - void integerKey() { - assertGeneratedContentContains("integerKey", "_iv_lookupKeys = List.of(ResolverHelpers.formatString(_mi_i))"); - } - - @Test - @DisplayName("Several flat keys") - void multipleKeys() { - assertGeneratedContentContains("multipleKeys", "lookupKeys = List.of(_mi_id0, _mi_id1, _mi_id2)"); - } - - @Test - @DisplayName("One key and one other field") - void otherNonKeyField() { - assertGeneratedContentContains("otherNonKeyField", "lookupKeys = List.of(_mi_id0)", "queryForQuery(_iv_ctx, _mi_id0, _mi_id1,"); - } - - @Test - @DisplayName("Various key types") // Note that this result has a different order than the input in schema. - void mixedKeys() { - assertGeneratedContentContains( - "mixedKeys", Set.of(DUMMY_INPUT), - "lookupKeys = List.of(_mi_id, ResolverHelpers.formatString(_mi_i), _mi_in.stream().map(_nit_in -> _nit_in != null ? _nit_in.getId() : null).toList())", - "queryForQuery(_iv_ctx, _mi_id, _mi_in, _mi_i," - ); - } - - @Test - @DisplayName("Input type key") - void inputKey() { - assertGeneratedContentContains( - "inputKey", Set.of(DUMMY_INPUT), - "lookupKeys = List.of(_mi_in.stream().map(_nit_in -> _nit_in != null ? _nit_in.getId() : null).toList())" - ); - } - - @Test - @Disabled("Does not work. Does not treat outer field as list.") - @DisplayName("Nested input type key") - void nestedInputKey() { - assertGeneratedContentContains( - "nestedInputKey", Set.of(DUMMY_INPUT), - "lookupKeys = List.of(_mi_in.stream().map(_iv_it -> _iv_it != null ? _iv_it.getIn().getId() : null).toList())" - ); - } - - @Test - @Disabled("Does not work. Does not treat outer field as list.") - @DisplayName("Nested input type integer key") - void nestedInputIntegerKey() { - assertGeneratedContentContains( - "nestedInputIntegerKey", - "List.of(ResolverHelpers.formatString(_mi_in.stream().map(_iv_it -> _iv_it != null ? _iv_it.getIn().getId() : null).toList()))" - ); - } - - @Test - @Disabled("Does not work. Does not treat outer field as list.") - @DisplayName("Nested input type key where the directive is placed on a intermediate level") - void nestedInputKeyMiddle() { - assertGeneratedContentContains( - "nestedInputKeyMiddle", Set.of(DUMMY_INPUT), - "lookupKeys = List.of(_mi_in.stream().map(_iv_it -> _iv_it != null ? _iv_it.getIn().getId() : null).toList())" - ); - } - - @Test - @Disabled("Does not work. Assumes outer input is list.") - @DisplayName("Nested input type key where the list wrapping is placed on a intermediate level") - void nestedInputKeyWithMiddleList() { - assertGeneratedContentContains( - "nestedInputKeyWithMiddleList", Set.of(DUMMY_INPUT), - "lookupKeys = List.of(_mi_in.getIn().stream().map(_iv_it -> _iv_it != null ? _iv_it.getId() : null).toList())" - ); - } - - @Test - @DisplayName("Key inside a listed input type") - void keyInListedInput() { - assertGeneratedContentContains( - "keyInListedInput", - "lookupKeys = List.of(_mi_in.stream().map(_nit_in -> _nit_in != null ? _nit_in.getId() : null).toList())" - ); - } - - @Test - @DisplayName("Listed key inside an input type") - void listedKeyInInput() { - assertGeneratedContentContains("listedKeyInInput", "lookupKeys = List.of(_mi_in.getId())"); - } - - @Test - @DisplayName("Key inside an input type and double key directive") - void keyInInputWithDuplicateDirective() { - assertGeneratedContentContains( - "keyInInputWithDuplicateDirective", - "lookupKeys = List.of(_mi_in.stream().map(_nit_in -> _nit_in != null ? _nit_in.getId() : null).toList())" - ); - } - - @Test - @DisplayName("Key inside a nested input type") - void keyInNestedInput() { - assertGeneratedContentContains("keyInNestedInput", "lookupKeys = List.of(_mi_in1.getIn2().getId())"); - } - - @Test - @DisplayName("Key inside a nested input type where the directive is placed on a intermediate level") - void keyInNestedInputMiddle() { - assertGeneratedContentContains("keyInNestedInputMiddle", "lookupKeys = List.of(_mi_in1.getIn2().getId())"); - } - - @Test - @DisplayName("Integer key inside a nested input type") - void integerKeyInInput() { - assertGeneratedContentContains("integerKeyInInput", "lookupKeys = List.of(ResolverHelpers.formatString(_mi_in.getI()))"); - } - - @Test - @Disabled("Does not work. Maybe it should not?") - @DisplayName("Key that is not a list") - void withoutList() { - assertGeneratedContentContains("withoutList", "lookupKeys = List.of(List.of(_mi_id))"); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/fetch/NodeResolverTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/fetch/NodeResolverTest.java deleted file mode 100644 index 8a31301270..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/fetch/NodeResolverTest.java +++ /dev/null @@ -1,84 +0,0 @@ -package no.sikt.graphitron.datafetchers.standard.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.datafetchers.operations.OperationClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.NODE; - -@DisplayName("Interface resolvers - Resolvers for the Node interface") -public class NodeResolverTest extends GeneratorTest { - - // Disable validation until GGG-104 - @Override - protected boolean validateSchema() { - return false; - } - - @Override - protected String getSubpath() { - return "datafetchers/fetch/node"; - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(NODE); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new OperationClassGenerator(schema)); - } - - @Test - @DisplayName("No types implement Node interface") - void nodeNoImplementations() { - assertGeneratedContentMatches("noImplementations"); - } - - @Test - @DisplayName("One type implements Node interface") - void nodeOneImplementation() { - assertGeneratedContentMatches("oneImplementation"); - } - - @Test - @DisplayName("Many types implement Node interface") - void manyImplementations() { - assertGeneratedContentContains( - "manyImplementations", - "ADDRESS.getName(), \"Address\"", - "CUSTOMER.getName(), \"Customer\"", - "FILM.getName(), \"Film\"", - "case \"Address\":", - "case \"Customer\":", - "case \"Film\":", - "AddressDBQueries.addressForNode(", - "CustomerDBQueries.customerForNode(", - "FilmDBQueries.filmForNode(" - ); - } - - @Test - @DisplayName("Implementing type has no path from Query") - void withoutPathFromQuery() { - assertGeneratedContentContains("withoutPathFromQuery", "CustomerDBQueries.customerForNode("); - } - - @Test - @DisplayName("Type implements interface and Node") - void doubleInterface() { - assertGeneratedContentContains( - "doubleInterface", Set.of(NODE), - "FilmDBQueries.filmForNode(", - "QueryDBQueries.titledForQuery(" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/fetch/RecordTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/fetch/RecordTest.java deleted file mode 100644 index 44ab845d1c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/fetch/RecordTest.java +++ /dev/null @@ -1,135 +0,0 @@ -package no.sikt.graphitron.datafetchers.standard.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.datafetchers.operations.OperationClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.DUMMY_SERVICE; -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("Fetch resolvers - Resolvers with input records") -public class RecordTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "datafetchers/fetch/standard"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(DUMMY_SERVICE); - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(DUMMY_TYPE); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new OperationClassGenerator(schema)); - } - - @Test - @DisplayName("Input name for a Java record type starts with a capital letter") - void wrongCapitalisationJavaRecord() { - assertGeneratedContentContains( - "operation/wrongCapitalisationJavaRecord", - Set.of(DUMMY_INPUT_RECORD), - "iN =", ".getArgument(\"IN\")", "iNRecord", "(_mi_iN, _iv_transform.getArgumentPresence().child(\"IN\"), \"IN\")", ", _mi_iNRecord," - ); - } - - @Test - @DisplayName("Input name for a jOOQ record starts with a capital letter") - void wrongCapitalisationJOOQRecord() { - assertGeneratedContentContains( - "operation/wrongCapitalisationJOOQRecord", - Set.of(CUSTOMER_INPUT_TABLE), - "iN =", ".getArgument(\"IN\")", "iNRecord", "(_mi_iN, _iv_transform.getArgumentPresence().child(\"IN\"), \"IN\")", ", _mi_iNRecord," - ); - } - - @Test - @DisplayName("Root-level input Java records") - void inputJavaRecord() { - assertGeneratedContentContains( - "operation/inputJavaRecord", Set.of(DUMMY_INPUT_RECORD), - "in = ResolverHelpers.transformDTO(_iv_env.getArgument(\"in\"), DummyInputRecord.class)", - "transform = new RecordTransformer(_iv_env)", - "inRecord = _iv_transform.dummyInputRecordToJavaRecord(_mi_in, _iv_transform.getArgumentPresence().child(\"in\"), \"in\")", - "queryForQuery(_iv_ctx, _mi_inRecord," - ); - } - - @Test - @DisplayName("Listed input Java records") - void listedInputJavaRecord() { - assertGeneratedContentContains( - "operation/listedInputJavaRecord", Set.of(DUMMY_INPUT_RECORD), - "in = ResolverHelpers.transformDTOList(_iv_env.getArgument(\"in\"), DummyInputRecord.class)", - "inRecordList = _iv_transform.dummyInputRecordToJavaRecord(_mi_in, _iv_transform.getArgumentPresence().child(\"in\"), \"in\")", - "queryForQuery(_iv_ctx, _mi_inRecordList," - ); - } - - @Test - @DisplayName("Root-level input jOOQ records") - void inputJOOQRecord() { - assertGeneratedContentContains( - "operation/inputJOOQRecord", Set.of(CUSTOMER_INPUT_TABLE), - "in = ResolverHelpers.transformDTO(_iv_env.getArgument(\"in\"), CustomerInputTable.class)", - "transform = new RecordTransformer(_iv_env)", - "inRecord = _iv_transform.customerInputTableToJOOQRecord(_mi_in, _iv_transform.getArgumentPresence().child(\"in\"), \"in\")", - "queryForQuery(_iv_ctx, _mi_inRecord," - ); - } - - @Test - @DisplayName("Listed input jOOQ records") - void listedInputJOOQRecord() { - assertGeneratedContentContains( - "operation/listedInputJOOQRecord", Set.of(CUSTOMER_INPUT_TABLE), - "in = ResolverHelpers.transformDTOList(_iv_env.getArgument(\"in\"), CustomerInputTable.class)", - "inRecordList = _iv_transform.customerInputTableToJOOQRecord(_mi_in, _iv_transform.getArgumentPresence().child(\"in\"), \"in\")", - "queryForQuery(_iv_ctx, _mi_inRecordList," - ); - } - - @Test - @DisplayName("Input Java records") - void splitQueryInputJavaRecord() { - assertGeneratedContentContains( - "splitquery/inputJavaRecord", Set.of(SPLIT_QUERY_WRAPPER, DUMMY_INPUT_RECORD), - "queryForWrapper(_iv_ctx, _iv_keys, _mi_inRecord," - ); - } - - @Test - @DisplayName("Input jOOQ records") - void splitQueryInputJOOQRecord() { - assertGeneratedContentContains( - "splitquery/inputJOOQRecord", Set.of(SPLIT_QUERY_WRAPPER, CUSTOMER_INPUT_TABLE), - "queryForWrapper(_iv_ctx, _iv_keys, _mi_inRecord," - ); - } - - @Test - @DisplayName("JOOQ input record containing another input jOOQ record") - void nestedInputRecord() { - assertGeneratedContentContains( - "operation/nestedInputRecord", Set.of(CUSTOMER_INPUT_TABLE), - "in0Record = _iv_transform.", - "in1Record = new CustomerRecord();_mi_in1Record.attach(_iv_transform.getCtx().configuration()", - "if (_mi_in0 != null) {var _mi_in1 = _mi_in0.getIn1();_mi_in1Record = _iv_transform.customerInputTableToJOOQRecord(_mi_in1, _iv_transform.getArgumentPresence().child(\"in1\"), \"in0/in1\")", - ".queryForQuery(_iv_ctx, _mi_in0Record, _mi_in1Record," - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/fetch/ResolverPaginationTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/fetch/ResolverPaginationTest.java deleted file mode 100644 index 52fdc2c828..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/fetch/ResolverPaginationTest.java +++ /dev/null @@ -1,139 +0,0 @@ -package no.sikt.graphitron.datafetchers.standard.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.datafetchers.operations.OperationClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.CONTEXT_CONDITION; -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_CONNECTION; -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_CONNECTION_WITH_NO_OPTIONALS; -import static no.sikt.graphitron.common.configuration.SchemaComponent.DUMMY_CONNECTION; -import static no.sikt.graphitron.common.configuration.SchemaComponent.SPLIT_QUERY_WRAPPER; - -@DisplayName("Paginated resolvers - Resolvers with pagination") -public class ResolverPaginationTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "datafetchers/fetch/pagination"; - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new OperationClassGenerator(schema)); - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(DUMMY_CONNECTION); - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(CONTEXT_CONDITION); - } - - @Test - @DisplayName("Basic root resolver with no extra parameters") - void defaultCase() { - assertGeneratedContentMatches("operation/default"); - } - - @Test - @DisplayName("Root resolver with an additional parameter") - void withOtherInput() { - assertGeneratedContentContains( - "operation/withOtherInput", - "Integer _mi_first = _iv_env.getArgument(\"first\")", - "String _mi_after = _iv_env.getArgument(\"after\")", - "String _mi_other = _iv_env.getArgument(\"other\")", - "queryForQuery(_iv_ctx, _mi_other, _iv_pageSize, _mi_after," - ); - } - - @Test - @DisplayName("Basic resolver with no extra parameters") - void splitQuery() { - assertGeneratedContentMatches("splitquery/default", SPLIT_QUERY_WRAPPER); - } - - @Test - @DisplayName("Resolver with an additional parameter") - void splitQueryWithOtherInput() { - assertGeneratedContentContains( - "splitquery/withOtherInput", Set.of(SPLIT_QUERY_WRAPPER), - "first = _iv_env.getArgument(\"first\")", - "after = _iv_env.getArgument(\"after\")", - "other = _iv_env.getArgument(\"other\")", - "queryForWrapper(_iv_ctx, _iv_keys, _mi_other, _iv_pageSize, _mi_after," - ); - } - - @Test - @DisplayName("Root resolver returning multi-table interface") - @Disabled("Disabled until GGG-79") - void multitableInterface() { - assertGeneratedContentContains("operation/multitableInterface", - "CompletableFuture<TitledConnection>", - "QueryDBQueries.titledForQuery(" - ); - } - - @Test - @DisplayName("Root resolver returning a single table interface") - void singleTableInterface() { - assertGeneratedContentContains("operation/singleTableInterface", - "CompletableFuture<ConnectionImpl<Address>>", - "loadPaginated", - "QueryDBQueries.addressForQuery(" - ); - } - - @Test - @DisplayName("Field with a condition referencing a context parameter") - void withContextCondition() { - assertGeneratedContentContains( - "operation/withContextCondition", - "queryForQuery(_iv_ctx, _iv_pageSize, _mi_after, _cf_ctxField, _iv_selectionSet)", - "countQueryForQuery(_iv_ctx, _cf_ctxField)" - ); - } - - @Test - @DisplayName("When optional field 'totalCount' is included in the schema, generate the count method") - void countMethodCalledWhenAllOptionalFieldsIncluded() { - assertGeneratedContentContains( - "operation/allOptionalFieldsIncluded", - Set.of(CUSTOMER_CONNECTION), - """ - .loadPaginated( - _iv_pageSize, - (_iv_ctx, _iv_selectionSet) -> QueryDBQueries.customersForQuery(_iv_ctx, _iv_pageSize, _mi_after, _iv_selectionSet), - (_iv_ctx, _iv_keys) -> QueryDBQueries.countCustomersForQuery(_iv_ctx) - """ - ); - } - - @Test - @DisplayName("When optional field 'totalCount' is not included in the schema, do not generate the count method") - void countMethodNotCalledWhenAllOptionalFieldsDisabled() { - assertGeneratedContentContains( - "operation/allOptionalFieldsExcluded", - Set.of(CUSTOMER_CONNECTION_WITH_NO_OPTIONALS), - """ - .loadPaginated( - _iv_pageSize, - (_iv_ctx, _iv_selectionSet) -> QueryDBQueries.customersForQuery(_iv_ctx, _iv_pageSize, _mi_after, _iv_selectionSet) - ); - """ - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/fetch/ResolverTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/fetch/ResolverTest.java deleted file mode 100644 index 55a5434409..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/fetch/ResolverTest.java +++ /dev/null @@ -1,222 +0,0 @@ -package no.sikt.graphitron.datafetchers.standard.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.datafetchers.operations.OperationClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.CONTEXT_CONDITION; -import static no.sikt.graphitron.common.configuration.ReferencedEntry.JAVA_RECORD_CUSTOMER; -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("Fetch resolvers - Resolvers for queries") -public class ResolverTest extends GeneratorTest { - - // Disabled until GGG-104 - @Override - protected boolean validateSchema() { - return false; - } - - @Override - protected String getSubpath() { - return "datafetchers/fetch/standard"; - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(DUMMY_TYPE); - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(CONTEXT_CONDITION, JAVA_RECORD_CUSTOMER); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new OperationClassGenerator(schema)); - } - - @Test - @DisplayName("Basic root resolver with no parameters") - void defaultCase() { - assertGeneratedContentMatches("operation/default"); - } - - @Test - @DisplayName("Root resolvers with various input data types") - void inputDatatypes() { - assertGeneratedContentMatches("operation/inputDatatypes", DUMMY_INPUT, DUMMY_ENUM); - } - - @Test - @DisplayName("Input name starts with a capital letter") - void wrongInputCapitalisation() { - assertGeneratedContentContains( - "operation/wrongInputCapitalisation", - "iN =", ".getArgument(\"IN\")", ", _mi_iN," - ); - } - - @Test - @DisplayName("Input name for an input type starts with a capital letter") - void wrongInputTypeCapitalisation() { - assertGeneratedContentContains( - "operation/wrongInputTypeCapitalisation", - Set.of(DUMMY_INPUT), - "iN =", ".getArgument(\"IN\")", ", _mi_iN," - ); - } - - @Test - @DisplayName("Field with a condition referencing a context parameter") - void withContextCondition() { - assertGeneratedContentContains( - "operation/withContextCondition", - "ctxField = _iv_graphitronContext.getContextArgument(_iv_env, \"ctxField\")", - "queryForQuery(_iv_ctx, _cf_ctxField, _iv_selectionSet)" - ); - } - - @Test - @DisplayName("Field with a argument condition referencing a context parameter") - void withArgumentContextCondition() { - assertGeneratedContentContains( - "operation/withArgumentContextCondition", - "ctxField = _iv_graphitronContext.getContextArgument(_iv_env, \"ctxField\")", - "queryForQuery(_iv_ctx, _mi_email, _cf_ctxField, _iv_selectionSet)" - ); - } - - @Test - @DisplayName("Field with an input type field condition referencing a context parameter") - void withInputTypeContextCondition() { - assertGeneratedContentContains( - "operation/withInputTypeContextCondition", - "ctxField = _iv_graphitronContext.getContextArgument(_iv_env, \"ctxField\")", - "queryForQuery(_iv_ctx, _mi_in, _cf_ctxField, _iv_selectionSet)" - ); - } - - @Test // Note, these are sorted alphabetically. - @DisplayName("Field with multiple conditions referencing context parameters") - void withMultipleContextConditions() { - assertGeneratedContentContains( - "operation/withMultipleContextConditions", - "ctxField1 = _iv_graphitronContext.getContextArgument(_iv_env, \"ctxField1\")", - "ctxField2 = _iv_graphitronContext.getContextArgument(_iv_env, \"ctxField2\")", - "queryForQuery(_iv_ctx, _mi_email, _cf_ctxField1, _cf_ctxField2, _iv_selectionSet)" - ); - } - - @Test - @DisplayName("Field with multiple conditions referencing the same context parameter") - void withDuplicateContextField() { - assertGeneratedContentContains( - "operation/withDuplicateContextField", - "ctxField = _iv_graphitronContext.getContextArgument(_iv_env, \"ctxField\")", - "queryForQuery(_iv_ctx, _mi_email, _cf_ctxField, _iv_selectionSet)" - ); - } - - @Test - @DisplayName("Root resolver that returns a list") - void returningList() { - assertGeneratedContentContains("operation/returningList", "public static DataFetcher<CompletableFuture<List<DummyType>>> query()"); - } - - @Test - @DisplayName("Root resolver that returns an optional list") - void returningOptionalList() { - assertGeneratedContentContains("operation/returningOptionalList", "public static DataFetcher<CompletableFuture<List<DummyType>>> query()"); - } - - @Test - @DisplayName("Root resolver that is not generated") - void notGenerated() { - assertNothingGenerated("operation/notGenerated"); - } - - @Test - @DisplayName("Basic resolver with no parameters") - void splitQuery() { - assertGeneratedContentMatches("splitquery/default", SPLIT_QUERY_WRAPPER); - } - - @Test - @DisplayName("Resolvers with various input data types") - void splitQueryInputDatatypes() { - assertGeneratedContentMatches("splitquery/inputDatatypes", DUMMY_INPUT, DUMMY_ENUM, SPLIT_QUERY_WRAPPER); - } - - @Test - @DisplayName("Resolver that returns a list") - void splitQueryReturningList() { - assertGeneratedContentContains("splitquery/returningList", Set.of(SPLIT_QUERY_WRAPPER), - "public static DataFetcher<CompletableFuture<List<DummyType>>> query()" - ); - } - - @Test - @DisplayName("Resolver that returns an optional list") - void splitQueryReturningOptionalList() { - assertGeneratedContentContains("splitquery/returningOptionalList", Set.of(SPLIT_QUERY_WRAPPER), - "public static DataFetcher<CompletableFuture<List<DummyType>>> query()" - ); - } - - @Test - @DisplayName("Resolver created from a type that inherits the table from another type") - void splitQueryFromTypeWithoutTable() { - assertGeneratedContentMatches("splitquery/fromTypeWithoutTable", CUSTOMER_TABLE); - } - - @Test - @DisplayName("Resolver that is not generated") - void splitQueryNotGenerated() { - assertNothingGenerated("splitquery/notGenerated", Set.of(SPLIT_QUERY_WRAPPER)); - } - - @Test - @DisplayName("Root resolver returning multi-table interface") - void multitableInterface() { - assertGeneratedContentContains("operation/multitableInterface", - "CompletableFuture<List<Titled>>", - "QueryDBQueries.titledForQuery(" - ); - } - - @Test - @DisplayName("Root resolver returning single table interface") - void singleTableInterface() { - assertGeneratedContentContains("operation/singleTableInterface", - "CompletableFuture<List<Address>>", - "QueryDBQueries.addressForQuery(" - ); - } - - @Test - @DisplayName("SplitQuery field in Java record") - void splitQueryFromJavaRecord() { - assertGeneratedContentContains("splitquery/splitQueryFromJavaRecord", - "load(", - "addressForMyJavaRecord" - ); - } - - @Test - @DisplayName("Listed splitQuery field in Java record") - void listedSplitQueryFromJavaRecord() { - assertGeneratedContentContains("splitquery/listedSplitQueryFromJavaRecord", - "return new DataFetcherHelper(_iv_env).loadByResolverKeys(_os_myJavaRecord.getAddressKey()" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/fetch/StrategyNodeResolverTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/fetch/StrategyNodeResolverTest.java deleted file mode 100644 index 8cad557996..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/standard/fetch/StrategyNodeResolverTest.java +++ /dev/null @@ -1,121 +0,0 @@ -package no.sikt.graphitron.datafetchers.standard.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.datafetchers.operations.OperationClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("Interface resolvers - Resolvers for the Node strategy interface") -public class StrategyNodeResolverTest extends GeneratorTest { - - // Disabled until GGG-104 - @Override - protected boolean validateSchema() { - return false; - } - - @BeforeAll - static void setUp() { - GeneratorConfig.setNodeStrategy(true); - } - - @AfterAll - static void tearDown() { - GeneratorConfig.setNodeStrategy(false); - } - - @Override - protected String getSubpath() { - return "datafetchers/fetch/strategynode"; - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(NODE); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new OperationClassGenerator(schema)); - } - - @Test - @DisplayName("No types implement Node interface") - void nodeNoImplementations() { - assertGeneratedContentMatches("noImplementations"); - } - - @Test - @DisplayName("One type implements Node interface") - void nodeOneImplementation() { - assertGeneratedContentMatches("oneImplementation"); - } - - @Test - @DisplayName("Custom type id generates correct switch statements") - void nodeCorrectSwitchStatement() { - assertGeneratedContentContains("withCustomTypeId", "case \"CustomerType\""); - } - - @Test - @DisplayName("Many types implement Node interface") - void manyImplementations() { - assertGeneratedContentContains( - "manyImplementations", - "case \"Address\":", - "case \"Customer\":", - "AddressDBQueries.addressForNode(", - "case \"Film\":", - "CustomerDBQueries.customerForNode(", - "FilmDBQueries.filmForNode(" - ); - } - - @Test - @DisplayName("Implementing type has no path from Query") - void withoutPathFromQuery() { - assertGeneratedContentContains("withoutPathFromQuery", "CustomerDBQueries.customerForNode("); - } - - @Test - @DisplayName("Type implements interface and Node") - void doubleInterface() { - assertGeneratedContentContains( - "doubleInterface", Set.of(NODE), - "FilmDBQueries.filmForNode(", - "QueryDBQueries.titledForQuery(" - ); - } - - @Test - @DisplayName("Entity type") - void entity() { - assertGeneratedContentContains( - "entity", Set.of(NODE, FEDERATION_QUERY), - "loadLookupEntities(_iv_nodeIdStrategy, _mi_representations,", - "_entities(NodeIdStrategy _iv_nodeIdStrategy)", - "customerFor_Entity(_iv_ctx, _iv_nodeIdStrategy, _iv_reps" - ); - } - - @Test - @DisplayName("Connection") - void connection() { - assertGeneratedContentContains( - "connection", Set.of(CUSTOMER_CONNECTION), - ".queryForQuery(_iv_ctx, _iv_nodeIdStrategy,", - ".countQueryForQuery(_iv_ctx, _iv_nodeIdStrategy)" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/type/TypeResolverTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/type/TypeResolverTest.java deleted file mode 100644 index 666c6a6a35..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/datafetchers/type/TypeResolverTest.java +++ /dev/null @@ -1,61 +0,0 @@ -package no.sikt.graphitron.datafetchers.type; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.datafetchers.typeresolvers.TypeResolverClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.FEDERATION_QUERY; - -@DisplayName("Type resolvers - Resolvers for unions and interfaces") -public class TypeResolverTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "datafetchers/type"; - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new TypeResolverClassGenerator(schema)); - } - - @Test - @DisplayName("Union with one component") - void unionType() { - assertGeneratedContentMatches("union"); - } - - @Test - @DisplayName("Interface with one implementation") - void interfaceType() { - assertGeneratedContentMatches("interface"); - } - - @Test - @DisplayName("Union with two components") - void unionTypeDouble() { - assertGeneratedContentContains("unionDouble", "obj instanceof A", "obj instanceof B"); - } - - @Test - @DisplayName("Interface with two implementations") - void interfaceTypeDouble() { - assertGeneratedContentContains("interfaceDouble", "obj instanceof A", "obj instanceof B"); - } - - @Test - @DisplayName("Interface with no implementations") - void interfaceNoImplementations() { - assertGeneratedContentContains("interfaceNoImplementations", "Object _iv_obj) {throw new"); - } - - @Test - @DisplayName("Federation Entity union") - void entity() { - assertGeneratedContentMatches("entity", FEDERATION_QUERY); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/definitions/helpers/ScalarUtilsTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/definitions/helpers/ScalarUtilsTest.java deleted file mode 100644 index 7011817537..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/definitions/helpers/ScalarUtilsTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package no.sikt.graphitron.definitions.helpers; - -import no.sikt.graphitron.javapoet.CodeBlock; -import graphql.Scalars; -import graphql.scalars.ExtendedScalars; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Set; - -import static org.assertj.core.api.Assertions.assertThat; - -class ScalarUtilsTest { - - @BeforeEach - void setUp() { - ScalarUtils.initialize(Set.of()); - } - - @Test - @DisplayName("Should return set of built-in scalar names") - void builtInScalarNames() { - Set<String> builtInScalars = ScalarUtils.getInstance().getBuiltInScalarNames(); - assertThat(builtInScalars).contains("String", "Int", "Boolean"); - } - - @Test - @DisplayName("Should return map of scalar names to CodeBlocks representing the code to access the scalar field") - void getScalarTypeCodeBlockMapping() { - assertThat(ScalarUtils.getInstance().getScalarTypeCodeBlockMapping()) - .containsEntry("BigDecimal", CodeBlock.of("$T.$N", ExtendedScalars.class, "GraphQLBigDecimal")) - .containsEntry("BigInteger", CodeBlock.of("$T.$N", ExtendedScalars.class, "GraphQLBigInteger")); - } - - @Test - @DisplayName("Should return map of scalar names to Java class names") - void getScalarTypeNameMapping() { - assertThat(ScalarUtils.getInstance().getScalarTypeNameMapping()) - .containsEntry("Boolean", "java.lang.Boolean") //from Scalars - .containsEntry("BigDecimal", "java.math.BigDecimal") //from ExtendedScalars - .containsEntry("_Any", "java.lang.Object"); //from _Any - } - - @Test - @DisplayName("Should use custom scalar type mapping for ID scalar instead of default from Scalars") - void getCustomScalarsTypeNameMappingCustomID() { - assertThat(ScalarUtils.getInstance().getScalarTypeNameMapping()) - .containsEntry("ID", "java.lang.String") //from CustomScalars - .doesNotContainEntry("ID", "java.lang.Object"); //from Scalars - } - - @Test - @DisplayName("Should return ClassName for valid extended scalar name") - void getScalarTypeMapping_ValidScalar() { - var className = ScalarUtils.getInstance().getScalarTypeMapping("BigDecimal"); - assertThat(className.canonicalName()).isEqualTo("java.math.BigDecimal"); - } - - @Test - @DisplayName("Initialize should add user-provided scalar to the mappings") - void initialize() { - //add Scalars to the end of definitions, re-adding the ID scalar from Scalars that overrides the one from CustomScalars - ScalarUtils.initialize(Set.of(Scalars.class)); - - assertThat(ScalarUtils.getInstance().getScalarTypeNameMapping()) - .doesNotContainEntry("ID", "java.lang.String") //from CustomScalars - .containsEntry("ID", "java.lang.Object"); //from Scalars - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/dto/DTOGeneratorTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/dto/DTOGeneratorTest.java deleted file mode 100644 index d974e81c1c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/dto/DTOGeneratorTest.java +++ /dev/null @@ -1,11 +0,0 @@ -package no.sikt.graphitron.dto; - -import no.sikt.graphitron.common.GeneratorTest; - -public class DTOGeneratorTest extends GeneratorTest { - - @Override - protected String getSubpath() { - return "dto/"; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/dto/DTOSplitQueryOnlyPrimaryKeyTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/dto/DTOSplitQueryOnlyPrimaryKeyTest.java deleted file mode 100644 index 8dd10e82f9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/dto/DTOSplitQueryOnlyPrimaryKeyTest.java +++ /dev/null @@ -1,175 +0,0 @@ -package no.sikt.graphitron.dto; - -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.dto.InterfaceDTOGenerator; -import no.sikt.graphitron.generators.dto.TypeDTOGenerator; -import no.sikt.graphitron.generators.dto.UnionDTOGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_CONNECTION; -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_TABLE; - -@DisplayName("Temporary test class for only using primary key in splitQuery fields") -/* -* This class is mostly a copy of DTOSplitQueryTest, but only keeping primary keys. -* The option to only use primary keys for the generator is temporary and will be removed. -* */ -public class DTOSplitQueryOnlyPrimaryKeyTest extends DTOGeneratorTest { - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new TypeDTOGenerator(schema), new InterfaceDTOGenerator(schema), new UnionDTOGenerator(schema)); - } - - @Override - protected String getSubpath() { - return super.getSubpath() + "splitQuery"; - } - - @Test - @DisplayName("Scalar field with splitQuery referencing another table should store primary key fields") - void scalarReference() { - assertGeneratedContentContains("scalarReference", - "VacationDestination(VacationDestinationRecord vacation_destination_pkey)", - "this.vacationDescriptionKey = vacation_destination_pkey" - ); - } - - @Test - @DisplayName("Field with splitQuery referencing another table should store primary key fields") - void reference() { - assertGeneratedContentContains("reference", - "VacationDestinationRecord vacation_destination_pkey", - "VacationDestination(VacationDestinationRecord vacation_destination_pkey)", - "this.vacationKey = vacation_destination_pkey" - ); - } - - @Test - @DisplayName("Listed field should keep primary key fields") - void listedReference() { - assertGeneratedContentContains("listedReference", - "VacationRecord destinationKey", - "Vacation(VacationRecord vacation_pkey)", - "this.destinationKey = vacation_pkey" - ); - } - - @Test - @DisplayName("Fields with reverse reference should keep primary key fields even if they are not listed") - void reverseReference() { - assertGeneratedContentContains("reverseReference", - "VacationRecord destinationKey", - "Vacation(VacationRecord vacation_pkey)", - "this.destinationKey = vacation_pkey" - ); - } - - @Test - @DisplayName("Connection field with splitQuery referencing another table should store primary key fields") - void connectionReference() { - assertGeneratedContentContains("connectionReference", Set.of(CUSTOMER_TABLE, CUSTOMER_CONNECTION), - "Store(StoreRecord store_pkey)", - "this.customersKey = store_pkey" - ); - } - - @Test - @DisplayName("SplitQuery field referencing another table with condition should store primary key fields") - void conditionPath() { - assertGeneratedContentContains("conditionPath", - "VacationDestination(VacationDestinationRecord vacation_destination_pkey) " + - "{ this.vacation_destination_pkey = vacation_destination_pkey; this.someStringsKey = vacation_destination_pkey; }", - "private VacationDestinationRecord someStringsKey" - ); - } - - @Test - @DisplayName("Field reference with both condition and implicit key should store primary key fields") - void conditionWithImplicitKey() { - assertGeneratedContentContains("conditionWithImplicitKey", - "this.vacationsKey = vacation_destination_pkey" - ); - } - - @Test - @DisplayName("Field reference with both condition and no implicit key should store primary key fields") - void conditionWithoutImplicitKey() { - assertGeneratedContentContains("conditionWithoutImplicitKey", Set.of(CUSTOMER_TABLE), - "this.customersKey = vacation_destination_pkey" - ); - } - - @Test - @DisplayName("Reference via tables should keep fields for first key") - void referenceViaTable() { - assertGeneratedContentContains("referenceViaTable", - "Inventory(InventoryRecord inventory_pkey)", - "this.staffForInventoryKey = inventory_pkey" - ); - } - - @Test - @DisplayName("Key fields should be reused when multiple splitQuery fields use the same key") - void multipleFieldsWithSameKey() { - assertGeneratedContentContains("multipleFieldsWithSameKey", - "Inventory(InventoryRecord inventory_pkey)", - "this.store1Key = inventory_pkey", - "this.store2Key = inventory_pkey" - ); - } - - @Test - @DisplayName("Subtype with splitQuery reference should store primary key fields") - void referenceInSubtype() { - assertGeneratedContentContains("referenceInSubtype", - "SomeType(CustomerRecord customer_pkey)" - ); - } - - @Test - @DisplayName("Field with self reference should store primary key fields") - void selfReference() { - assertGeneratedContentContains("selfReference", - "FilmRecord sequelKey", - "this.sequelKey = film_pkey" - ); - } - - @Test - @DisplayName("Single table interface with splitQuery field") - void interfaceWithTable() { - assertGeneratedContentContains("interfaceWithTable", - "VacationDestinationRecord getSomeStringKey()" - ); - } - - @Test - @DisplayName("Single table interface with splitQuery field") - void conditionPathFromInterfaceWithTable() { - assertGeneratedContentContains("conditionPathFromInterfaceWithTable", - "VacationDestinationRecord getVacation_destination_pkey()", - "VacationDestinationRecord getSomeStringKey()" - ); - } - - @Test - @DisplayName("Multitable interface should skip splitQuery field") - void multiTableInterface() { - assertGeneratedContentContains("multiTableInterface", - "interface SomeInterface { }" - ); - } - - @Test - @DisplayName("Multitable union should skip splitQuery field") - void multiTableUnion() { - assertGeneratedContentContains("multiTableUnion", - "interface CustomerUnion { }" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/dto/DTOSplitQueryTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/dto/DTOSplitQueryTest.java deleted file mode 100644 index 37a7efa7bf..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/dto/DTOSplitQueryTest.java +++ /dev/null @@ -1,301 +0,0 @@ -package no.sikt.graphitron.dto; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.dto.InterfaceDTOGenerator; -import no.sikt.graphitron.generators.dto.TypeDTOGenerator; -import no.sikt.graphitron.generators.dto.UnionDTOGenerator; -import no.sikt.graphitron.validation.InvalidSchemaException; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.JAVA_RECORD_CUSTOMER; -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -/** - * WIP: - * Test class for DTOs when splitQueries use foreign key fields instead of previous primary key (unless there is no FK). - * Note that this is not supported or used yet so there may be some errors in this test class. - */ -public class DTOSplitQueryTest extends DTOGeneratorTest { - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new TypeDTOGenerator(schema), new InterfaceDTOGenerator(schema), new UnionDTOGenerator(schema)); - } - - @BeforeAll - static void setUp() { - GeneratorConfig.setAlwaysUsePrimaryKeyInSplitQueries(false); - } - - @AfterAll - static void tearDown() { - GeneratorConfig.setAlwaysUsePrimaryKeyInSplitQueries(true); - } - - @Override - protected String getSubpath() { - return super.getSubpath() + "splitQuery"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(JAVA_RECORD_CUSTOMER); - } - - @Test - @DisplayName("Scalar field with splitQuery referencing another table should store foreign key fields") - void scalarReference() { - assertGeneratedContentMatches("scalarReference"); - } - - @Test - @DisplayName("Field with splitQuery referencing another table should store foreign key fields") - void reference() { - assertGeneratedContentContains("reference", - "VacationRecord vacationKey", - "VacationDestination(VacationRecord vacation_destination_vacation_fkey)", - "this.vacationKey = vacation_destination_vacation_fkey" - ); - } - - @Test - @DisplayName("Listed field stores referenced table's key fields") - void listedReference() { - assertGeneratedContentContains("listedReference", - "VacationDestinationRecord destinationKey", - "Vacation(VacationDestinationRecord vacation_destination_vacation_fkey)", - "this.destinationKey = vacation_destination_vacation_fkey" - ); - } - - @Test - @DisplayName("Reverse reference stores referenced table's key fields") - void reverseReference() { - assertGeneratedContentContains("reverseReference", - "VacationDestinationRecord destinationKey", - "Vacation(VacationDestinationRecord vacation_destination_vacation_fkey)", - "this.destinationKey = vacation_destination_vacation_fkey" - ); - } - - @Test - @DisplayName("Connection field stores foreign key fields") - void connectionReference() { - assertGeneratedContentContains("connectionReference", Set.of(CUSTOMER_TABLE, CUSTOMER_CONNECTION), - "Store(CustomerRecord customer_store_id_fkey)", - "this.customersKey = customer_store_id_fkey" - ); - } - - @Test - @DisplayName("Condition path falls back to primary key fields") - void conditionPath() { - assertGeneratedContentContains("conditionPath", - "VacationDestination(VacationDestinationRecord vacation_destination_pkey) " + - "{ this.vacation_destination_pkey = vacation_destination_pkey; this.someStringsKey = vacation_destination_pkey; }", - "private VacationDestinationRecord someStringsKey" - ); - } - - @Test - @DisplayName("Field reference with both condition and implicit key should store foreign key fields") - void conditionWithImplicitKey() { - assertGeneratedContentContains("conditionWithImplicitKey", - "VacationRecord vacationsKey", - "this.vacationsKey = vacation_destination_vacation_fkey" - ); - } - - @Test - @DisplayName("Field reference with both condition and no implicit key should store primary key fields") - void conditionWithoutImplicitKey() { - assertGeneratedContentContains("conditionWithoutImplicitKey", Set.of(CUSTOMER_TABLE), - "VacationDestinationRecord customersKey", - "this.customersKey = vacation_destination_pkey" - ); - } - - @Test - @DisplayName("Reference via tables should keep fields for first key") - void referenceViaTable() { - assertGeneratedContentContains("referenceViaTable", - "Inventory(StoreRecord inventory_store_id_fkey)", - "this.staffForInventoryKey = inventory_store_id_fkey" - ); - } - - @Test - @DisplayName("Key fields should be reused when multiple splitQuery fields use the same key") - void multipleFieldsWithSameKey() { - assertGeneratedContentContains("multipleFieldsWithSameKey", - "Inventory(StoreRecord inventory_store_id_fkey)", - "this.store1Key = inventory_store_id_fkey", - "this.store2Key = inventory_store_id_fkey" - ); - } - - @Test - @DisplayName("Subtype with splitQuery reference should store foreign key fields") - void referenceInSubtype() { - assertGeneratedContentContains("referenceInSubtype", - "SomeType(AddressRecord customer_address_id_fkey)" - ); - } - - @Test - @DisplayName("Field with self reference should store foreign key fields") - void selfReference() { - assertGeneratedContentContains("selfReference", - "FilmRecord sequelKey", - "this.sequel_fkey = sequel_fkey; this.sequelKey = sequel_fkey;" - ); - } - - @Test - @DisplayName("Single table interface with splitQuery field") - void interfaceWithTable() { - assertGeneratedContentContains("interfaceWithTable", - "VacationRecord getSomeStringKey()" - ); - } - - @Test - @DisplayName("Single table interface with condition path stores primary key fields") - void conditionPathFromInterfaceWithTable() { - assertGeneratedContentContains("conditionPathFromInterfaceWithTable", - "VacationDestinationRecord getVacation_destination_pkey()", - "VacationDestinationRecord getSomeStringKey()" - ); - } - - @Test - @DisplayName("Multitable interface should skip splitQuery field") - void multiTableInterface() { - assertGeneratedContentContains("multiTableInterface", - "interface SomeInterface { }" - ); - } - - @Test - @DisplayName("Multitable union should skip splitQuery field") - void multiTableUnion() { - assertGeneratedContentContains("multiTableUnion", - "interface CustomerUnion { }" - ); - } - - @Test - @DisplayName("Scalar field from same table with splitQuery should throw error") - void scalarSameTable() { - assertThatThrownBy(() -> generateFiles("scalarSameTable")) - .isInstanceOf(RuntimeException.class) - .hasMessage("Cannot resolve reference for scalar field 'Vacation.someString'."); - } - - @Test - @DisplayName("Subtype field with splitQuery should throw error") - void subtype() { - assertThatThrownBy(() -> generateFiles("subtype")) - .isInstanceOf(InvalidSchemaException.class) - .hasMessageContaining("Cannot find implicit key for field 'VacationDestination.someType'."); - } - - @Test - @DisplayName("Field referencing single table interface") - void referencingSingleTableInterface() { - assertGeneratedContentContains("referencingSingleTableInterface", Set.of(ADDRESS_BY_DISTRICT), - "City(AddressRecord address_city_id_fkey)", - "this.addressesKey = address_city_id_fkey" - ); - } - - @Test - @DisplayName("Field referencing single table interface connection") - void referencingSingleTableInterfaceConnection() { - assertGeneratedContentContains("referencingSingleTableInterfaceConnection", Set.of(ADDRESS_BY_DISTRICT, ADDRESS_BY_DISTRICT_CONNECTION), - "City(AddressRecord address_city_id_fkey)", - "this.addressesKey = address_city_id_fkey" - ); - } - - @Test - @DisplayName("Field referencing multitable interface") - void referencingMultitableInterface() { - assertGeneratedContentContains("referencingMultitableInterface", - "FilmCategory(FilmCategoryRecord film_category_pkey)", - "this.titledFilmsKey = film_category_pkey" - ); - } - - @Test - @DisplayName("Field referencing multitable interface connection") - void referencingMultitableInterfaceConnection() { - assertGeneratedContentContains("referencingMultitableInterfaceConnection", - "this.titledFilmsKey = film_category_pkey" - ); - } - - @Test - @DisplayName("Field referencing multitable union") - void referencingMultitableUnion() { - assertGeneratedContentContains("referencingMultitableUnion", - "this.filmsKey = film_category_pkey" - ); - } - - @Test - @DisplayName("Field referencing multitable union connection") - void referencingMultitableUnionConnection() { - assertGeneratedContentContains("referencingMultitableUnionConnection", - "this.filmsKey = film_category_pkey" - ); - } - - @Test - @DisplayName("Multiple keys in java record") - void multipleKeysInJavaRecord() { - assertGeneratedContentContains("multipleKeysInJavaRecord", - "private AddressRecord addressKey; private CityRecord cityKey;" - ); - } - - @Test - @DisplayName("Listed resolver keys for java record") - void listedKeyInJavaRecord() { - assertGeneratedContentContains("listedKeyInJavaRecord", - "private List<AddressRecord> addressKey;", - "setAddressKey(List<AddressRecord> addressKey) { this.addressKey = addressKey;" - ); - } - - - @Test - @DisplayName("Listed resolver keys for java record with split query") - void listedKeyInJavaRecordSplitQuery() { - assertGeneratedContentContains("listedKeyInJavaRecordSplitQuery", - "this.addressKey = List.of(address_pkey);", - "private List<AddressRecord> addressKey;", - "setAddressKey(List<AddressRecord> addressKey) { this.addressKey = addressKey;" - ); - } - - @Test - @DisplayName("Listed resolver keys for java record with nested split query") - void listedKeyInJavaRecordSplitQueryNested() { - assertGeneratedContentContains("listedKeyInJavaRecordNestedSplitQuery", - "public Payload(Result result) {this.result = result;}", - "this.addressKey = List.of(address_pkey);", - "private List<AddressRecord> addressKey;", - "setAddressKey(List<AddressRecord> addressKey) { this.addressKey = addressKey;" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/dto/EnumDTOGeneratorTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/dto/EnumDTOGeneratorTest.java deleted file mode 100644 index 4914371dbb..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/dto/EnumDTOGeneratorTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package no.sikt.graphitron.dto; - -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.dto.EnumDTOGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.DUMMY_ENUM; - -public class EnumDTOGeneratorTest extends DTOGeneratorTest { - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new EnumDTOGenerator(schema)); - } - - @Override - protected String getSubpath() { - return super.getSubpath() + "enum"; - } - - @Test - @DisplayName("Simple enum") - void defaultCase() { - assertGeneratedContentContains(Set.of(DUMMY_ENUM), - "public enum DummyEnum { A, B, C }" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/dto/InputDTOGeneratorTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/dto/InputDTOGeneratorTest.java deleted file mode 100644 index 9cc045312f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/dto/InputDTOGeneratorTest.java +++ /dev/null @@ -1,31 +0,0 @@ -package no.sikt.graphitron.dto; - -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.dto.InputDTOGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -public class InputDTOGeneratorTest extends DTOGeneratorTest { - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new InputDTOGenerator(schema)); - } - - @Override - protected String getSubpath() { - return super.getSubpath() + "input"; - } - - @Test - @DisplayName("Input type") - void defaultCase() { - assertGeneratedContentContains(Set.of(DUMMY_INPUT), - "DummyInput(String id)"); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/dto/InterfaceDTOGeneratorTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/dto/InterfaceDTOGeneratorTest.java deleted file mode 100644 index f4f58f44aa..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/dto/InterfaceDTOGeneratorTest.java +++ /dev/null @@ -1,42 +0,0 @@ -package no.sikt.graphitron.dto; - -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.dto.InterfaceDTOGenerator; -import no.sikt.graphitron.generators.dto.TypeDTOGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; - -public class InterfaceDTOGeneratorTest extends DTOGeneratorTest { - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new InterfaceDTOGenerator(schema), new TypeDTOGenerator(schema)); - } - - @Override - protected String getSubpath() { - return super.getSubpath() + "interface"; - } - - @Test - @DisplayName("Simple interface") - void defaultCase() { - assertGeneratedContentMatches("default"); - } - - @Test - @DisplayName("Single table interface") - void singleTable() { - assertGeneratedContentMatches("singleTable"); - } - - @Test - @DisplayName("Interface with a type having notGenerated set on interface field") - void withNotGeneratedField() { - assertGeneratedContentContains("withNotGeneratedField", - "public interface SomeInterface { }" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/dto/TypeDTOGeneratorTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/dto/TypeDTOGeneratorTest.java deleted file mode 100644 index d0a0b77201..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/dto/TypeDTOGeneratorTest.java +++ /dev/null @@ -1,120 +0,0 @@ -package no.sikt.graphitron.dto; - -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.dto.TypeDTOGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.JAVA_RECORD_CUSTOMER; -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -public class TypeDTOGeneratorTest extends DTOGeneratorTest { - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new TypeDTOGenerator(schema)); - } - - @Override - protected String getSubpath() { - return super.getSubpath() + "type"; - } - - @Test - @DisplayName("Simple type") - void defaultCase() { - assertGeneratedContentMatchesFromComponents("default", CUSTOMER_TABLE); - } - - @Test - @DisplayName("Type with array table field") - void arrayTableField() { - assertGeneratedContentContains("arrayTableField", - "List<String> usernames"); - } - - @Test - @DisplayName("Type with multiple fields") - void multipleFields() { - assertGeneratedContentMatches("multipleFields"); - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(JAVA_RECORD_CUSTOMER); - } - - @Test - @DisplayName("Type with field referencing another DTO") - void dtoField() { - assertGeneratedContentContains("dtoField", - "public CustomerTable(SomeType someType)", - "private SomeType someType", - "public void setSomeType(SomeType someType) { this.someType = someType; }", - "public SomeType getSomeType() { return someType;}" - ); - } - - @Test - @DisplayName("Type with field of scalar type from graphql-java-extended-scalars") - void extendedScalarField() { - assertGeneratedContentMatches("extendedScalarField"); - } - - @Test - @DisplayName("Type implementing interface") - void implementingInterface() { - assertGeneratedContentContains(Set.of(VALIDATION_ERROR), - "ValidationError implements Error" - ); - } - - @Test - @DisplayName("Type is part of a union") - void isPartOfUnion() { - assertGeneratedContentContains("isPartOfUnion", Set.of(CUSTOMER_TABLE), - "CustomerTable implements SomeUnion"); - } - - @Test // New constructor that skips error fields so queries can use them without making up new empty fields. - @DisplayName("Contains an errors field") - void withErrors() { - assertGeneratedContentContains( - "withErrors", Set.of(ERROR), - "Customer(String id, List<ValidationError> errors)", - "this.errors = errors", - "Customer(String id) {this.id = id;this.errors = null" - ); - } - - @Test - @DisplayName("Contains an errors union field") - void withErrorsUnion() { - assertGeneratedContentContains( - "withErrorsUnion", Set.of(ERROR), - "Customer(String id, List<ErrorUnion> errors)", - "this.errors = errors", - "Customer(String id){this.id = id;this.errors = null" - ); - } - - @Test - @DisplayName("Type for java record") - void javaRecord() { - assertGeneratedContentMatches("javaRecord"); - } - - @Test - @DisplayName("Type with listed field referencing another DTO") - void dtoFieldListed() { - assertGeneratedContentContains( - "dtoFieldListed", - "public CustomerContainerListed(List<Customer> customers) {this.customers = customers;}" - ); - } - -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/dto/UnionDTOGeneratorTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/dto/UnionDTOGeneratorTest.java deleted file mode 100644 index 23bd5154bb..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/dto/UnionDTOGeneratorTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package no.sikt.graphitron.dto; - -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.dto.UnionDTOGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_TABLE; - -public class UnionDTOGeneratorTest extends DTOGeneratorTest { - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new UnionDTOGenerator(schema)); - } - - @Override - protected String getSubpath() { - return super.getSubpath() + "union"; - } - - @Test - @DisplayName("Union") - void defaultCase() { - assertGeneratedContentMatches("default", CUSTOMER_TABLE); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/exceptionhandling/ConfigurationTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/exceptionhandling/ConfigurationTest.java deleted file mode 100644 index 41797aaea7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/exceptionhandling/ConfigurationTest.java +++ /dev/null @@ -1,179 +0,0 @@ -package no.sikt.graphitron.exceptionhandling; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.configuration.RecordValidation; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.exception.ExceptionStrategyConfigurationGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.DUMMY_SERVICE; -import static no.sikt.graphitron.common.configuration.SchemaComponent.MUTATION_RESPONSE; -import static no.sikt.graphitron.common.configuration.SchemaComponent.VALIDATION_ERROR; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -@DisplayName("Exception handling - Exception configuration class generation") -public class ConfigurationTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "exceptions/configuration"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(DUMMY_SERVICE); - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(VALIDATION_ERROR); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new ExceptionStrategyConfigurationGenerator(schema)); - } - - @BeforeEach - public void setup() { - super.setup(); - GeneratorConfig.setRecordValidation(new RecordValidation(true, "ValidationError"));// Putting a union here does not work. - } - - @Test - @DisplayName("One mutation with one set of errors") - void defaultCase() { - assertGeneratedContentMatches("default", MUTATION_RESPONSE); - } - - @Test - @DisplayName("One query with one set of errors") - void query() { - assertGeneratedContentContains( - "query", - "ValidationViolationGraphQLException.class, k -> new HashSet<>()).add(\"query\"", - "IllegalArgumentException.class, k -> new HashSet<>()).add(\"query\"", - "payloadForField.put(\"query\", errors -> {var payload = new Response();payload.setErrors((List<ValidationError>" - ); - } - - @Test // These are the same for mutations with and without services, so added just this one test for services. - @DisplayName("One mutation using service directive") - void service() { - assertGeneratedContentContains( - "service", - ".computeIfAbsent(ValidationViolationGraphQLException.class, k -> new HashSet<>()).add(\"mutation\")", - ".computeIfAbsent(IllegalArgumentException.class, k -> new HashSet<>()).add(\"mutation\")", - "payloadForField.put(\"mutation\", errors -> {var payload = new Response();payload.setErrors((List<ValidationError>) errors);return payload;" - ); - } - - @Test - @DisplayName("Validation set to false") - void noValidation() { - GeneratorConfig.setRecordValidation(new RecordValidation(false, null)); - assertNothingGenerated("default", Set.of(MUTATION_RESPONSE)); - } - - @Test - @DisplayName("No errors exist") - void noErrors() { - assertGeneratedContentContains( - "noErrors", - "{fieldsForException = new HashMap<>();payloadForField = new HashMap<>();}" // Empty class - ); - } - - @Test - @DisplayName("Two mutations with an error") - void twoMutations() { - assertGeneratedContentContains( - "twoMutations", - "\"mutation0\", errors -> {", - "fieldsForException.get(ValidationViolationGraphQLException.class).add(\"mutation1\")", - "fieldsForException.get(IllegalArgumentException.class).add(\"mutation1\")", - "\"mutation1\", errors -> {" - ); - } - - @Test - @DisplayName("Error type with a handler") - void handledError() { - assertGeneratedContentContains( - "handledError", Set.of(MUTATION_RESPONSE), - ".computeIfAbsent(UnsupportedOperationException.class, k ->" - ); - } - - @Test - @DisplayName("Error type with a database handler") - void databaseHandledError() { - assertGeneratedContentContains( - "databaseHandledError", Set.of(MUTATION_RESPONSE), - ".computeIfAbsent(DataAccessException.class, k ->" - ); - } - - @Test - @DisplayName("Only unrelated errors exist") - void unrelatedError() { - assertGeneratedContentContains( - "unrelatedError", Set.of(MUTATION_RESPONSE), - "{fieldsForException = new HashMap<>();payloadForField = new HashMap<>();}" - ); - } - - @Test - @DisplayName("Handler points to an invalid class name") - void invalidClassName() { - assertThatThrownBy(() -> generateFiles("invalidClassName", Set.of(MUTATION_RESPONSE))) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("Unable to find exception className: INVALID, declared for operation: mutation"); - } - - @Test - @DisplayName("Union error type") - void union() { - assertGeneratedContentContains( - "union", Set.of(MUTATION_RESPONSE), - ".setErrors((List<ValidationUnion>) errors" - ); - } - - @Test - @DisplayName("Union error type including one handler") - void unionWithHandled() { - assertGeneratedContentContains( - "unionWithHandled", Set.of(MUTATION_RESPONSE), - ".setErrors((List<ValidationUnion>) errors" - ); - } - - @Test - @DisplayName("Mutation with multiple error fields") - void multipleErrorsInMutation() { - assertGeneratedContentContains( - "multipleErrorsInMutation", Set.of(MUTATION_RESPONSE), - ".setErrors0((List<ValidationError>)", - ".setErrors1((List<UnrelatedError>)" - ); - } - - @Test - @DisplayName("Mutation with multiple error fields including one union") - void multipleErrorsInMutationWithUnion() { - assertGeneratedContentContains( - "multipleErrorsInMutationWithUnion", Set.of(MUTATION_RESPONSE), - ".setErrors0((List<ValidationError>)", - ".setErrors1((List<ValidationUnion>)" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/exceptionhandling/ProviderTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/exceptionhandling/ProviderTest.java deleted file mode 100644 index 86d6121856..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/exceptionhandling/ProviderTest.java +++ /dev/null @@ -1,325 +0,0 @@ -package no.sikt.graphitron.exceptionhandling; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.configuration.RecordValidation; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.exception.ExceptionToErrorMappingProviderGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.DUMMY_SERVICE; -import static no.sikt.graphitron.common.configuration.SchemaComponent.ERROR; -import static no.sikt.graphitron.common.configuration.SchemaComponent.MUTATION_RESPONSE; - -@DisplayName("Exception handling - Exception mapping provider class generation") -public class ProviderTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "exceptions/provider"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(DUMMY_SERVICE); - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(ERROR); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new ExceptionToErrorMappingProviderGenerator(schema)); - } - - @BeforeEach - public void setup() { - super.setup(); - GeneratorConfig.setRecordValidation(new RecordValidation(true, null)); - } - - @Test - @DisplayName("One mutation with one set of errors") - void defaultCase() { - assertGeneratedContentMatches("default", MUTATION_RESPONSE); - } - - @Test - @DisplayName("One query with one set of errors") - void query() { - assertGeneratedContentContains( - "query", - "var queryGenericList = List.of(m1);genericMappingsForOperation.put(\"query\", queryGenericList" - ); - } - - @Test - @DisplayName("No errors exist") - void noErrors() { - assertNothingGenerated("noErrors"); - } - - @Test - @DisplayName("Error without handler") - void noHandlers() { - assertNothingGenerated("noHandlers", Set.of(MUTATION_RESPONSE)); - } - - @Test - @DisplayName("A handler that uses the matching input") - void withMatches() { - assertGeneratedContentContains( - "withMatches", Set.of(MUTATION_RESPONSE), - "GenericExceptionMatcher(\"java.lang.IllegalArgumentException\", \"MATCH\"" - ); - } - - @Test - @DisplayName("A handler that uses the description input") - void withDescription() { - assertGeneratedContentContains("withDescription", Set.of(MUTATION_RESPONSE), "SomeError(path, \"DESC\""); - } - - @Test - @DisplayName("One error with a handler and one without") - void onlyOneHandled() { - assertGeneratedContentContains("onlyOneHandled", Set.of(MUTATION_RESPONSE), "-> new SomeError0"); - resultDoesNotContain("onlyOneHandled", Set.of(MUTATION_RESPONSE), "-> new SomeError1"); - } - - @Test - @DisplayName("Validation set to false") - void noValidation() { - GeneratorConfig.setRecordValidation(new RecordValidation(false, null)); - assertGeneratedContentMatches("default", MUTATION_RESPONSE); - } - - @Test // These are the same for mutations with and without services, so added just this one test for services. - @DisplayName("One mutation using service directive") - void service() { - assertGeneratedContentContains("service", "-> new SomeError"); - } - - @Test - @DisplayName("Two handlers for one error") - void multipleHandlers() { - assertGeneratedContentContains( - "multipleHandlers", Set.of(MUTATION_RESPONSE), - "m1 = new GenericExceptionContentToErrorMapping(" + - "new GenericExceptionMatcher(\"java.lang.IllegalArgumentException\", null),(path, msg) -> new SomeError", - "m2 = new GenericExceptionContentToErrorMapping(" + - "new GenericExceptionMatcher(\"java.lang.IllegalStateException\", null),(path, msg) -> new SomeError", - "List.of(m1, m2)" - ); - } - - @Test - @DisplayName("Two handlers for two errors") - void multiple() { - assertGeneratedContentContains( - "multiple", - "-> new SomeError0", - "-> new SomeError1", - "mutation0GenericList = List.of(m1)", - "genericMappingsForOperation.put(\"mutation0\", mutation0GenericList", - "mutation1GenericList = List.of(m2)", - "genericMappingsForOperation.put(\"mutation1\", mutation1GenericList" - ); - } - - @Test // Note, this produces illegal code. - @DisplayName("Two handlers for two errors in the same response") - void multipleInOneResponse() { - assertGeneratedContentContains( - "multipleInOneResponse", Set.of(MUTATION_RESPONSE), - "-> new SomeError0", - "-> new SomeError1", - "mutationGenericList = List.of(m1)", - "mutationGenericList = List.of(m2)" - ); - } - - @Test - @DisplayName("Error type with a database handler") - void databaseHandledError() { - assertGeneratedContentContains( - "databaseHandledError", Set.of(MUTATION_RESPONSE), - "m1 = new DataAccessExceptionContentToErrorMapping(" + - "new DataAccessMatcher(null, null, null),(path, msg) -> new SomeError(", - "mutationDatabaseList = List.of(m1)", - "dataAccessMappingsForOperation.put(\"mutation\", mutationDatabaseList" - ); - } - - @Test - @DisplayName("Two database handlers for one error") - void multipleDatabaseHandlers() { - assertGeneratedContentContains( - "multipleDatabaseHandlers", Set.of(MUTATION_RESPONSE), - "m1 = new DataAccessExceptionContentToErrorMapping(" + - "new DataAccessMatcher(\"C_0\", null, null),(path, msg) -> new SomeError", - "m2 = new DataAccessExceptionContentToErrorMapping(" + - "new DataAccessMatcher(\"C_1\", null, null),(path, msg) -> new SomeError", - "List.of(m1, m2)" - ); - } - - @Test - @DisplayName("A database handler with code set") - void databaseWithCode() { - assertGeneratedContentContains( - "databaseWithCode", Set.of(MUTATION_RESPONSE), - "DataAccessMatcher(\"CODE\", null," - ); - } - - @Test - @DisplayName("A database handler with matches set") - void databaseWithMatches() { - assertGeneratedContentContains( - "databaseWithMatches", Set.of(MUTATION_RESPONSE), - "DataAccessMatcher(null, null, \"MATCHES\")" - ); - } - - @Test - @DisplayName("A database handler with sqlState set") - void databaseWithSqlState() { - assertGeneratedContentContains( - "databaseWithSqlState", Set.of(MUTATION_RESPONSE), - "DataAccessMatcher(null, \"23503\", null)" - ); - } - - @Test - @DisplayName("A database handler with both code and sqlState set") - void databaseWithCodeAndSqlState() { - assertGeneratedContentContains( - "databaseWithCodeAndSqlState", Set.of(MUTATION_RESPONSE), - "DataAccessMatcher(\"20997\", \"23503\", null)" - ); - } - - @Test - @DisplayName("Error type with both a database handler and generic handler") - void bothGenericAndDatabase() { - assertGeneratedContentContains( - "bothGenericAndDatabase", Set.of(MUTATION_RESPONSE), - "m1 = new DataAccessExceptionContentToErrorMapping", - "m2 = new GenericExceptionContentToErrorMapping", - "mutationDatabaseList = List.of(m1)", - "mutationGenericList = List.of(m2)" - ); - } - - @Test // Note, this produces illegal code. - @DisplayName("Two error types with both a database handler and generic handler within the same response") - void bothGenericAndDatabaseInMultipleErrorsForOneResponse() { - assertGeneratedContentContains( - "bothGenericAndDatabaseInMultipleErrorsForOneResponse", Set.of(MUTATION_RESPONSE), - "m1 = new DataAccessExceptionContentToErrorMapping(" + - "new DataAccessMatcher(null, null, null),(path, msg) -> new SomeError0", - "m2 = new GenericExceptionContentToErrorMapping(" + - "new GenericExceptionMatcher(\"java.lang.IllegalArgumentException\", null),(path, msg) -> new SomeError0", - "m3 = new DataAccessExceptionContentToErrorMapping(" + - "new DataAccessMatcher(null, null, null),(path, msg) -> new SomeError1", - "m4 = new GenericExceptionContentToErrorMapping(" + - "new GenericExceptionMatcher(\"java.lang.IllegalArgumentException\", null),(path, msg) -> new SomeError1", - "mutationDatabaseList = List.of(m1)", - "mutationGenericList = List.of(m2)", - "mutationDatabaseList = List.of(m3)", - "mutationGenericList = List.of(m4)" - ); - } - - @Test - @DisplayName("Union with one handled error") - void union() { - assertGeneratedContentContains( - "union", Set.of(MUTATION_RESPONSE), - "m1 = new GenericExceptionContentToErrorMapping(", - "mutationGenericList = List.of(m1)" - ); - } - - @Test - @DisplayName("Union with one handled error and one unhandled") - void unionWithUnhandledError() { - assertGeneratedContentContains( - "unionWithUnhandledError", Set.of(MUTATION_RESPONSE), - "mutationGenericList = List.of(m1)"); - } - - @Test - @DisplayName("Union with two handled errors") - void unionMultipleHandlers() { - assertGeneratedContentContains( - "unionMultipleHandlers", Set.of(MUTATION_RESPONSE), - "new SomeError0(", - "new SomeError1(", - "mutationGenericList = List.of(m1, m2)" - ); - } - - @Test - @DisplayName("Union with a database handled error") - void unionDatabase() { - assertGeneratedContentContains( - "unionDatabase", Set.of(MUTATION_RESPONSE), - "m1 = new DataAccessExceptionContentToErrorMapping(", - "mutationDatabaseList = List.of(m1)" - ); - } - - @Test - @DisplayName("Union with two handled database errors") - void unionMultipleDatabaseHandlers() { - assertGeneratedContentContains( - "unionMultipleDatabaseHandlers", Set.of(MUTATION_RESPONSE), - "new SomeError0(", - "new SomeError1(", - "mutationDatabaseList = List.of(m1, m2)" - ); - } - - @Test - @DisplayName("Union with generic and database handled errors") - void unionMultipleMixedHandlers() { - assertGeneratedContentContains( - "unionMultipleMixedHandlers", Set.of(MUTATION_RESPONSE), - "m1 = new DataAccessExceptionContentToErrorMapping(" + - "new DataAccessMatcher(null, null, null),(path, msg) -> new SomeError1", - "m2 = new GenericExceptionContentToErrorMapping(" + - "new GenericExceptionMatcher(\"java.lang.IllegalArgumentException\", null),(path, msg) -> new SomeError0", - "mutationDatabaseList = List.of(m1)", - "mutationGenericList = List.of(m2)" - ); - } - - @Test - @DisplayName("Union with both generic and database handlers for multiple errors") - void unionMultipleErrorsWithMultipleMixedHandlers() { - assertGeneratedContentContains( - "unionMultipleErrorsWithMultipleMixedHandlers", Set.of(MUTATION_RESPONSE), - "m1 = new DataAccessExceptionContentToErrorMapping(" + - "new DataAccessMatcher(null, null, null),(path, msg) -> new SomeError0", - "m2 = new DataAccessExceptionContentToErrorMapping(" + - "new DataAccessMatcher(null, null, null),(path, msg) -> new SomeError1", - "m3 = new GenericExceptionContentToErrorMapping(" + - "new GenericExceptionMatcher(\"java.lang.IllegalArgumentException\", null),(path, msg) -> new SomeError0", - "m4 = new GenericExceptionContentToErrorMapping(" + - "new GenericExceptionMatcher(\"java.lang.IllegalArgumentException\", null),(path, msg) -> new SomeError1", - "mutationDatabaseList = List.of(m1, m2)", - "mutationGenericList = List.of(m3, m4)" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/javarecordmappers/JavaMapperGeneratorClassesTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/javarecordmappers/JavaMapperGeneratorClassesTest.java deleted file mode 100644 index ecd9bbdc59..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/javarecordmappers/JavaMapperGeneratorClassesTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package no.sikt.graphitron.javarecordmappers; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.mapping.JavaRecordMapperClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.DUMMY_RECORD; -import static no.sikt.graphitron.common.configuration.ReferencedEntry.DUMMY_SERVICE; -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_INPUT_TABLE; -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_TABLE; - -@DisplayName("Java Mappers - Mapper classes for mapping Java records") -public class JavaMapperGeneratorClassesTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "javamappers"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(DUMMY_SERVICE, DUMMY_RECORD); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new JavaRecordMapperClassGenerator(schema, false)); - } - - @Test - @DisplayName("Mapper generator ignores JOOQ records") - void ignoresJOOQRecordClasses() { - assertNothingGenerated("ignoresJOOQRecordClasses", Set.of(CUSTOMER_TABLE, CUSTOMER_INPUT_TABLE)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/javarecordmappers/JavaMapperGeneratorNestingTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/javarecordmappers/JavaMapperGeneratorNestingTest.java deleted file mode 100644 index 8b43793b70..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/javarecordmappers/JavaMapperGeneratorNestingTest.java +++ /dev/null @@ -1,59 +0,0 @@ -package no.sikt.graphitron.javarecordmappers; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.mapping.JavaRecordMapperClassGenerator; -import no.sikt.graphitron.reducedgenerators.dummygenerators.DummyTransformerClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.*; -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -// This is split here so the dummy transformer is not included in other tests. -@DisplayName("Java Mappers - Mapper containing additional records") -public class JavaMapperGeneratorNestingTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "javamappers"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(DUMMY_SERVICE, NESTED_RECORD, JAVA_RECORD_CUSTOMER); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new JavaRecordMapperClassGenerator(schema, false), new JavaRecordMapperClassGenerator(schema, true), new DummyTransformerClassGenerator(schema)); - } - - @Test - @DisplayName("Responses containing a jOOQ record") - void responsesContainingJOOQRecord() { - assertGeneratedContentMatches("tograph/containingJOOQRecord", ADDRESS_SERVICE, CUSTOMER_TABLE); - } - - @Test - @DisplayName("Responses containing a Java record") - void responsesContainingJavaRecord() { - assertGeneratedContentMatches("tograph/containingJavaRecord", ADDRESS_SERVICE, DUMMY_TYPE_RECORD); - } - - @Test - @DisplayName("Inputs containing a Java record") - void inputsContainingJavaRecord() { - assertGeneratedContentMatches("torecord/containingJavaRecord", DUMMY_INPUT_RECORD); - } - - @Test - @DisplayName("Inputs containing a jOOQ record") - void inputsContainingJOOQRecord() { - assertGeneratedContentMatches("torecord/containingJOOQRecord", CUSTOMER_INPUT_TABLE); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/javarecordmappers/JavaMapperGeneratorToGraphTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/javarecordmappers/JavaMapperGeneratorToGraphTest.java deleted file mode 100644 index b49fef74cf..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/javarecordmappers/JavaMapperGeneratorToGraphTest.java +++ /dev/null @@ -1,225 +0,0 @@ -package no.sikt.graphitron.javarecordmappers; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.mapping.JavaRecordMapperClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.*; -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("Java Mappers - Mapper content for mapping Java records to graph types") -public class JavaMapperGeneratorToGraphTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "javamappers/tograph"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(DUMMY_SERVICE, NESTED_RECORD, JAVA_RECORD_CUSTOMER, MAPPER_RECORD_ADDRESS, MAPPER_RECORD_ENUM); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new JavaRecordMapperClassGenerator(schema, false)); - } - - @Test - @DisplayName("Simple mapper with one field") - void defaultCase() { - assertGeneratedContentMatches("default", DUMMY_TYPE_RECORD); - } - - @Test - @DisplayName("Field using the @field directive") - void mappedField() { - assertGeneratedContentContains( - "mappedField", - "pathHere + \"id\"", - "customer.setId(_nit_customerJavaRecord.getSomeID()" - ); - } - - @Test - @DisplayName("Mapper with multiple fields") - void twoFields() { - assertGeneratedContentContains( - "twoFields", - "pathHere + \"someID\"", - "customer.setSomeID(_nit_customerJavaRecord.getSomeID()", - "pathHere + \"otherID\"", - "customer.setOtherID(_nit_customerJavaRecord.getOtherID()" - ); - } - - @Test - @DisplayName("Containing non-record type") - void containingNonRecordWrapper() { - assertGeneratedContentContains( - "containingNonRecordWrapper", Set.of(ADDRESS_SERVICE), - "inner = new Wrapper();" + - "if (_iv_select.contains(_iv_pathHere + \"inner/postalCode\")) {" + - "_mo_inner.setPostalCode(_nit_mapperAddressJavaRecord.getPostalCode());}" + - "_mo_address.setInner(_mo_inner)" - ); - } - - @Test - @DisplayName("Containing two layers of non-record types") - void containingDoubleNonRecordWrapper() { - assertGeneratedContentContains( - "containingDoubleNonRecordWrapper", Set.of(ADDRESS_SERVICE), - "if (_iv_select.contains(_iv_pathHere + \"inner0/inner1\")) {" + - "var _mo_inner1 = new InnerWrapper();" + - "if (_iv_select.contains(_iv_pathHere + \"inner0/inner1/postalCode\")) {" + - "_mo_inner1.setPostalCode(_nit_mapperAddressJavaRecord.getPostalCode());}" + - "_mo_inner0.setInner1(_mo_inner1)" - ); - } - - @Test - @Disabled("Java records do not account for name duplicates in the schema like jOOQ ones do.") - @DisplayName("Fields on different levels that have the same name") - void nestingWithDuplicateFieldName() { - assertGeneratedContentContains( - "containingNonRecordWrapper", - "inner = new Wrapper();" + - "if (_iv_select.contains(_iv_pathHere + \"inner/inner\")) {" + - "var _mo_inner = new InnerWrapper();" + - "if (_iv_select.contains(_iv_pathHere + \"inner/inner/postalCode\")) {" + - "_mo_inner.setPostalCode(_nit_mapperAddressJavaRecord.getPostalCode());}" + - "_mo_inner.setInner(_mo_inner)" - ); - } - - @Test - @DisplayName("Containing non-record type and using field overrides") - void containingNonRecordWrapperWithFieldOverride() { - assertGeneratedContentContains( - "containingNonRecordWrapperWithFieldOverride", Set.of(ADDRESS_SERVICE), - "inner1 = new Wrapper1()", - "inner1.setCode(_nit_mapperAddressJavaRecord.getPostalCode()", - "inner2 = new Wrapper2()", - "inner2.setCode(_nit_mapperAddressJavaRecord.getPostalCode()" - ); - } - - @Test - @DisplayName("Sets resolver key for field with splitQuery") - void splitQuery() { - assertGeneratedContentContains( - "splitQuery", - """ - var _mi_address = _nit_customerJavaRecord.getAddress(); - if (_mi_address != null && _iv_select.contains(_iv_pathHere + "address")) { - _mo_customer.setAddressKey(_mi_address.key().into(AddressRecord.class)); - } - """ - ); - } - - @Test - @DisplayName("Sets resolver key for nested field with splitQuery") - void splitQueryNested() { - assertGeneratedContentContains( - "splitQueryNested", - "var _mi_address = _nit_customerJavaRecord.getAddress();" + - "if (_mi_address != null && _iv_select.contains(_iv_pathHere + \"wrapper/address\")) {" + - "_mo_wrapper.setAddressKey(_mi_address.key().into(AddressRecord.class));" - ); - } - - @Test - @DisplayName("Sets resolver keys for listed field with splitQuery") - void splitQueryListed() { - assertGeneratedContentContains( - "splitQueryListed", - "var _mi_address = _nit_customerJavaRecord.getAddress()", - "customer.setAddressKey(_mi_address.stream().map(_iv_it -> _iv_it.key().into(AddressRecord.class)).toList());" - ); - } - - @Test - @DisplayName("Skips fields that are not mapped to a record field") - void unconfiguredField() { - assertGeneratedContentContains( - "unconfiguredField", - "customer = new ArrayList<Customer>();return _mlo_customer" - ); - } - - @Test - @DisplayName("Maps ID fields that are not the primary key") - void idOtherThanPK() { - assertGeneratedContentContains( - "idOtherThanPK", - "pathHere + \"addressId\"", - ".setAddressId(_nit_customerJavaRecord.getAddressId()" - ); - } - - @Test - @DisplayName("Enum field") - void withEnum() { - assertGeneratedContentContains("withEnum", Set.of(SchemaComponent.DUMMY_ENUM),".setE(QueryHelper.makeEnumMap(_nit_mapperEnumRecord.getEnum1(),"); - } - - @Test - @DisplayName("List field") - void listField() { - assertGeneratedContentContains("listField", ".setIdList(_nit_customerJavaRecord.getIdList()"); - } - - @Test - @DisplayName("Responses containing a jOOQ record with split query") - void recordWithSplitQuery() { - resultDoesNotContain("containingRecordWithSplitQuery", Set.of(ADDRESS_SERVICE), "address.setCustomer("); - } - - @Test - @Disabled("This is wrong! Should be _nit_mapperNestedJavaRecord.getDummyRecord()). Seems to wrongly use toRecord case here.") - @DisplayName("Responses containing a Java record with a non-record type in between") - void containingNonRecordWrapperWithJavaRecord() { - assertGeneratedContentContains( - "containingNonRecordWrapperWithJavaRecord", Set.of(DUMMY_TYPE_RECORD), - "inner.setDummyRecord(_iv_transform.dummyTypeRecordToGraphType(_nit_mapperNestedJavaRecord.getDummyRecord(), _iv_pathHere + \"inner/dummyRecord\")" - ); - } - - @Test - @Disabled("This is wrong! Should be _nit_mapperNestedJavaRecord.getCustomer(). Seems to wrongly use toRecord case here.") - @DisplayName("Responses containing a jOOQ record with a non-record type in between") - void containingNonRecordWrapperWithJOOQRecord() { - assertGeneratedContentContains( - "containingNonRecordWrapperWithJOOQRecord", Set.of(CUSTOMER_TABLE), - "inner.setCustomer(_iv_transform.customerTableRecordToGraphType(_nit_mapperNestedJavaRecord.getCustomer(), _iv_pathHere + \"inner/customer\")" - ); - } - - @Test - @DisplayName("Responses skip fields that are not mapped to a Java record") - void withUnconfiguredJavaRecord() { - assertGeneratedContentContains( - "unconfiguredJavaRecord", - "customer = new ArrayList<Customer>();return _mlo_customer" - ); - } - - @Test - @DisplayName("Responses skip fields that are not mapped to a jOOQ record") - void withUnconfiguredJOOQRecord() { - assertGeneratedContentContains( - "unconfiguredJOOQRecord", Set.of(CUSTOMER_TABLE), - "customer = new ArrayList<Customer>();return _mlo_customer" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/javarecordmappers/JavaMapperGeneratorToRecordTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/javarecordmappers/JavaMapperGeneratorToRecordTest.java deleted file mode 100644 index cfc8ed9a48..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/javarecordmappers/JavaMapperGeneratorToRecordTest.java +++ /dev/null @@ -1,219 +0,0 @@ -package no.sikt.graphitron.javarecordmappers; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.mapping.JavaRecordMapperClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Optional; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.*; -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("Java Mappers - Mapper content for mapping graph types to Java records") -public class JavaMapperGeneratorToRecordTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "javamappers/torecord"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(DUMMY_SERVICE, NESTED_RECORD, MAPPER_RECORD_ENUM, JAVA_RECORD_CUSTOMER, MAPPER_RECORD_ADDRESS, OPTIONAL_FIELD_RECORD); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new JavaRecordMapperClassGenerator(schema, true)); - } - - @Test - @DisplayName("Simple mapper with one field") - void defaultCase() { - assertGeneratedContentMatches("default", DUMMY_INPUT_RECORD); - } - - @Test - @DisplayName("Field using the @field directive") - void mappedField() { - assertGeneratedContentContains("mappedField", "customerJavaRecord.setSomeID(_nit_customer.getId()"); - } - - @Test - @DisplayName("Mapper with multiple fields") - void twoFields() { - assertGeneratedContentContains( - "twoFields", - "_iv_args.hasField(\"id\")", - "customerJavaRecord.setSomeID(_nit_customer.getId()", - "_iv_args.hasField(\"otherID\")", - "customerJavaRecord.setOtherID(_nit_customer.getOtherID()" - ); - } - - @Test - @DisplayName("Containing non-record type") - void containingNonRecordWrapper() { - assertGeneratedContentContains( - "containingNonRecordWrapper", - """ - var _nit_address = _mi_address.get(_niit_address); - var _iv_args = _iv_argPresence.itemAt(_niit_address); - if (_nit_address == null) continue; - var _mo_mapperAddressJavaRecord = new MapperAddressJavaRecord(); - var _mi_inner = _nit_address.getInner(); - if (_mi_inner != null) { - var _iv_nextArgs0 = _iv_args.child("inner"); - if (_iv_nextArgs0.hasField("postalCode")) { - _mo_mapperAddressJavaRecord.setPostalCode(_mi_inner.getPostalCode()); - } - } - _mlo_mapperAddressJavaRecord.add(_mo_mapperAddressJavaRecord); - """ - ); - } - - @Test - @DisplayName("Containing two layers of non-record types") - void containingDoubleNonRecordWrapper() { - assertGeneratedContentContains( - "containingDoubleNonRecordWrapper", - """ - var _mi_inner0 = _nit_address.getInner0(); - if (_mi_inner0 != null) { - var _iv_nextArgs0 = _iv_args.child("inner0"); - var _mi_inner1 = _mi_inner0.getInner1(); - if (_mi_inner1 != null) { - var _iv_nextArgs1 = _iv_nextArgs0.child("inner1"); - if (_iv_nextArgs1.hasField("postalCode")) { - _mo_mapperAddressJavaRecord.setPostalCode(_mi_inner1.getPostalCode()); - } - } - } - _mlo_mapperAddressJavaRecord.add(_mo_mapperAddressJavaRecord); - """ - ); - } - - @Test - @Disabled("Java records do not account for name duplicates in the schema like jOOQ ones do.") - @DisplayName("Fields on different levels that have the same name") - void nestingWithDuplicateFieldName() { - assertGeneratedContentContains( - "nestingWithDuplicateFieldName", - """ - var _mi_inner = _nit_address.getInner(); - if (_mi_inner != null) { - var _iv_nextArgs0 = _iv_args.child("inner"); - var _mi_inner = _mi_inner.getInner(); - if (_mi_inner != null) { - var _iv_nextArgs1 = _iv_nextArgs0.child("inner"); - """ - ); - } - - - @Test - @DisplayName("Containing non-record type and using field overrides") - void containingNonRecordWrapperWithFieldOverride() { - assertGeneratedContentContains( - "containingNonRecordWrapperWithFieldOverride", - "inner1 = _nit_address.getInner1()", - ".setPostalCode(_mi_inner1.getCode()", - "inner2 = _nit_address.getInner2()", - ".setPostalCode(_mi_inner2.getCode()" - ); - } - - @Test - @DisplayName("Skips fields that are not mapped to a record field") - void unconfiguredField() { - assertGeneratedContentContains( - "unconfiguredField", - "customerJavaRecord = new ArrayList<CustomerJavaRecord>();return _mlo_customerJavaRecord" - ); - } - - @Test - @DisplayName("Maps ID fields that are not the primary key") - void idOtherThanPK() { - assertGeneratedContentContains( - "idOtherThanPK", - "_iv_args.hasField(\"addressId\")", - ".setAddressId(_nit_customer.getAddressId()" - ); - } - - @Test - @DisplayName("Skips fields with splitQuery set") - void skipsSplitQuery() { - assertGeneratedContentContains( - "skipsSplitQuery", - "customerJavaRecord = new ArrayList<CustomerJavaRecord>();return _mlo_customerJavaRecord" - ); - } - - @Test - @DisplayName("Enum fields") - void withEnum() { - assertGeneratedContentContains("withEnum", Set.of(SchemaComponent.DUMMY_ENUM), ".setEnum1(QueryHelper.makeEnumMap(_nit_dummy.getE(),"); - } - - @Test - @DisplayName("List fields") - void listField() { - assertGeneratedContentContains("listField", ".setIdList(_nit_customer.getIdList()"); - } - - @Test - @DisplayName("Inputs containing a Java record with a non-record type in between") - void containingNonRecordWrapperWithJavaRecord() { - assertGeneratedContentContains( - "containingNonRecordWrapperWithJavaRecord", Set.of(DUMMY_INPUT_RECORD), - "mapperNestedJavaRecord.setDummyRecord(_iv_transform.dummyInputRecordToJavaRecord(_mi_dummyRecord, _iv_args.child(\"dummyRecord\"), _iv_path + \"[\" + _niit_address + \"]/inner/dummyRecord\")" - ); - } - - @Test - @DisplayName("Inputs containing a jOOQ record with a non-record type in between") - void containingNonRecordWrapperWithJOOQRecord() { - assertGeneratedContentContains( - "containingNonRecordWrapperWithJOOQRecord", Set.of(CUSTOMER_INPUT_TABLE), - "mapperNestedJavaRecord.setCustomer(_iv_transform.customerInputTableToJOOQRecord(_mi_customer, _iv_args.child(\"customer\"), _iv_path + \"[\" + _niit_address + \"]/inner/customer\")" - ); - } - - @Test - @DisplayName("Optional setter fields are wrapped in Optional.ofNullable()") - void optionalFields() { - assertGeneratedContentContains("optionalFields", Set.of(OPTIONAL_FIELD_INPUT), - "setId(_nit_optionalFieldInput.getId())", - "setName(Optional.ofNullable(_nit_optionalFieldInput.getName()))", - "setRentalDuration(Optional.ofNullable(_nit_optionalFieldInput.getRentalDuration()))"); - } - - @Test - @DisplayName("Inputs skip fields that are not mapped to a Java record") - void withUnconfiguredJavaRecord() { - assertGeneratedContentContains( - "unconfiguredJavaRecord", Set.of(DUMMY_INPUT_RECORD), - "customerJavaRecord = new ArrayList<CustomerJavaRecord>();return _mlo_customerJavaRecord" - ); - } - - @Test - @DisplayName("Inputs skip fields that are not mapped to a jOOQ record") - void withUnconfiguredJOOQRecord() { - assertGeneratedContentContains( - "unconfiguredJOOQRecord", Set.of(CUSTOMER_TABLE), - "customerJavaRecord = new ArrayList<CustomerJavaRecord>();return _mlo_customerJavaRecord" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/javarecordmappers/JavaMapperNodeStrategyTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/javarecordmappers/JavaMapperNodeStrategyTest.java deleted file mode 100644 index a8e3b995de..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/javarecordmappers/JavaMapperNodeStrategyTest.java +++ /dev/null @@ -1,53 +0,0 @@ -package no.sikt.graphitron.javarecordmappers; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.mapping.JavaRecordMapperClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.ID_RECORD; -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_NODE; - -@DisplayName("Java mappers with node strategy (temporary test class)") -public class JavaMapperNodeStrategyTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "javamappers/nodeStrategy"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(ID_RECORD); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new JavaRecordMapperClassGenerator(schema, true)); - } - @BeforeAll - static void setUp() { - GeneratorConfig.setNodeStrategy(true); - } - - @AfterAll - static void tearDown() { - GeneratorConfig.setNodeStrategy(false); - } - - @Test - @DisplayName("Java record input should not use node strategy (temporary test)") - void toRecord() { - assertGeneratedContentContains("toRecord/default", Set.of(CUSTOMER_NODE), - "iDJavaRecord.setId(_nit_dummyInputRecord.getId());" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/javarecordmappers/NodeIdToJooqRecordTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/javarecordmappers/NodeIdToJooqRecordTest.java deleted file mode 100644 index ab1936fa92..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/javarecordmappers/NodeIdToJooqRecordTest.java +++ /dev/null @@ -1,150 +0,0 @@ -package no.sikt.graphitron.javarecordmappers; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.mapping.JavaRecordMapperClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.*; -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("@nodeId fields producing jOOQ records in Java record inputs") -public class NodeIdToJooqRecordTest extends GeneratorTest { - - @Override - protected String getSubpath() { - return "javamappers/torecord/nodeId"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(DUMMY_SERVICE, NODEID_INPUT_JAVA_RECORD, RENTAL_INPUT_JAVA_RECORD, COMPOSITE_KEY_INPUT_JAVA_RECORD, - FILM_ACTOR_INPUT_JAVA_RECORD, FILM_JAVA_RECORD, LISTED_NODEID_INPUT_JAVA_RECORD, - LISTED_RENTAL_INPUT_JAVA_RECORD, LISTED_AND_SINGULAR_INPUT_JAVA_RECORD, - LISTED_FILM_ACTOR_INPUT_JAVA_RECORD); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new JavaRecordMapperClassGenerator(schema, true)); - } - - @BeforeAll - static void setUp() { - GeneratorConfig.setNodeStrategy(true); - } - - @AfterAll - static void tearDown() { - GeneratorConfig.setNodeStrategy(false); - } - - @Test - @DisplayName("Single @nodeId field creates jOOQ record") - void nodeIdToJooqRecord() { - assertGeneratedContentMatches( - "nodeIdToJooqRecord", CUSTOMER_NODE); - } - - @Test - @DisplayName("Multiple @nodeId reference fields merge into single jOOQ record") - void nodeIdMerging() { - assertGeneratedContentContains("nodeIdMerging", Set.of(CUSTOMER_NODE, INVENTORY_NODE), - "var _mi_rental = new RentalRecord()", - "setReferenceId(_mi_rental, _iv_nodeIdValue, \"CustomerNode\", Rental.RENTAL.CUSTOMER_ID)", - "setReferenceId(_mi_rental, _iv_nodeIdValue, \"InventoryNode\", Rental.RENTAL.INVENTORY_ID)" - ); - } - - @Test - @DisplayName("@nodeId with composite key creates jOOQ record with multiple key columns") - void nodeIdCompositeKey() { - assertGeneratedContentContains("nodeIdCompositeKey", Set.of(FILM_ACTOR_NODE), - "var _mi_filmActor = new FilmActorRecord()", - "setId(_mi_filmActor, _iv_nodeIdValue, \"FilmActorNode\", FilmActor.FILM_ACTOR.ACTOR_ID, FilmActor.FILM_ACTOR.FILM_ID)" - ); - } - - @Test - @DisplayName("Reference and non-reference @nodeId fields merge into single jOOQ record with overlapping column") - void nodeIdOverlappingColumn() { - assertGeneratedContentContains("nodeIdOverlappingColumn", Set.of(FILM_ACTOR_NODE), - "if (_iv_nodeIdValue != null) {", - "MapperHelper.validateOverlappingNodeIdColumns(_iv_nodeIdStrategy, _iv_nodeIdValue, _mi_filmActor, \"FilmActorNode\", \"ACTOR_ID\", (_iv_it) -> _iv_it.getActorId(), FilmActor.FILM_ACTOR.ACTOR_ID, FilmActor.FILM_ACTOR.FILM_ID);", - "MapperHelper.validateOverlappingNodeIdColumns(_iv_nodeIdStrategy, _iv_nodeIdValue, _mi_filmActor, \"Actor\", \"ACTOR_ID\", (_iv_it) -> _iv_it.getActorId(), FilmActor.FILM_ACTOR.ACTOR_ID);"); - } - - - @Test - @DisplayName("Reference that has different column names in source and target tables") - void nodeIdDifferentColumnNames() { - assertGeneratedContentContains("nodeIdReferenceDifferentColumnNames", Set.of(NODE), - "_iv_nodeIdStrategy.setReferenceId(_mi_film, _iv_nodeIdValue, \"Language\", Film.FILM.ORIGINAL_LANGUAGE_ID);"); - } - - @Test - @DisplayName("Self-referencing nodeID field") - void selfReference() { - assertGeneratedContentContains("nodeIdSelfReference", Set.of(NODE), - "Film.FILM.SEQUEL"); - } - - @Test - @DisplayName("Listed nodeID field") - void listedNodeId() { - assertGeneratedContentContains("listedNodeId", Set.of(CUSTOMER_NODE), - "var _mni_id = _iv_args.hasField(\"id\") ? _nit_customerInput.getId() : null;", - "var _mlo_customer = new ArrayList<CustomerRecord>()", - "MapperHelper.validateListLengths(_mni_id)", - "var _iv_nodeIdListSize = _mni_id != null ? _mni_id.size() : 0;", - "for (int _niit_nodeIdIndex = 0; _niit_nodeIdIndex < _iv_nodeIdListSize; _niit_nodeIdIndex++)", - "var _iv_nodeIdValue = _mni_id.get(_niit_nodeIdIndex);", - "setId(_mri_customer, _iv_nodeIdValue, \"CustomerNode\", Customer.CUSTOMER.CUSTOMER_ID)", - "_mlo_customer.add(_mri_customerHasValue ? _mri_customer : null)", - ".setCustomer(_mlo_customer)" - ); - } - - @Test - @DisplayName("Multiple listed @nodeId fields merge into single jOOQ record list") - void listedNodeIdMerging() { - assertGeneratedContentContains("listedNodeIdMerging", Set.of(CUSTOMER_NODE, INVENTORY_NODE), - "MapperHelper.validateListLengths(_mni_customerId, _mni_inventoryId)", - "var _iv_nodeIdListSize = _mni_customerId != null ? _mni_customerId.size() : _mni_inventoryId != null ? _mni_inventoryId.size() : 0;", - "setReferenceId(_mri_rental, _iv_nodeIdValue, \"CustomerNode\", Rental.RENTAL.CUSTOMER_ID)", - "setReferenceId(_mri_rental, _iv_nodeIdValue, \"InventoryNode\", Rental.RENTAL.INVENTORY_ID)" - ); - } - - @Test - @DisplayName("Listed @nodeId fields with overlapping columns") - void listedNodeIdOverlappingColumn() { - assertGeneratedContentContains("listedNodeIdOverlappingColumn", Set.of(FILM_ACTOR_NODE), - "validateOverlappingNodeIdColumns(_iv_nodeIdStrategy, _iv_nodeIdValue, _mri_filmActor, \"FilmActorNode\", \"ACTOR_ID\", (_iv_it) -> _iv_it.getActorId(), FilmActor.FILM_ACTOR.ACTOR_ID, FilmActor.FILM_ACTOR.FILM_ID);", - "validateOverlappingNodeIdColumns(_iv_nodeIdStrategy, _iv_nodeIdValue, _mri_filmActor, \"Actor\", \"ACTOR_ID\", (_iv_it) -> _iv_it.getActorId(), FilmActor.FILM_ACTOR.ACTOR_ID);" - ); - } - - @Test - @DisplayName("Mixed listed and singular @nodeId fields in same input type") - void listedNodeIdMergingWithSingular() { - assertGeneratedContentContains("listedNodeIdMergingWithSingular", Set.of(CUSTOMER_NODE, INVENTORY_NODE), - // Listed group (rental) - "new ArrayList<RentalRecord>()", - "setReferenceId(_mri_rental, _iv_nodeIdValue, \"CustomerNode\", Rental.RENTAL.CUSTOMER_ID)", - "setReferenceId(_mri_rental, _iv_nodeIdValue, \"InventoryNode\", Rental.RENTAL.INVENTORY_ID)", - // Singular group (customer) - "var _mi_customer = new CustomerRecord()", - "setId(_mi_customer, _iv_nodeIdValue, \"CustomerNode\", Customer.CUSTOMER.CUSTOMER_ID)" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/jooqrecordmappers/MapperGeneratorClassesTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/jooqrecordmappers/MapperGeneratorClassesTest.java deleted file mode 100644 index 1b8d155cf1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/jooqrecordmappers/MapperGeneratorClassesTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package no.sikt.graphitron.jooqrecordmappers; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.mapping.RecordMapperClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.DUMMY_SERVICE; -import static no.sikt.graphitron.common.configuration.SchemaComponent.DUMMY_INPUT_RECORD; -import static no.sikt.graphitron.common.configuration.SchemaComponent.DUMMY_TYPE_RECORD; - -@DisplayName("JOOQ Mappers - Mapper classes for mapping jOOQ records") -public class MapperGeneratorClassesTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "jooqmappers"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(DUMMY_SERVICE); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new RecordMapperClassGenerator(schema, false)); - } - - @Test - @DisplayName("Mapper generator ignores Java records") - void ignoresJavaRecordClasses() { - assertNothingGenerated("ignoresJavaRecordClasses", Set.of(DUMMY_TYPE_RECORD, DUMMY_INPUT_RECORD)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/jooqrecordmappers/MapperGeneratorToGraphTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/jooqrecordmappers/MapperGeneratorToGraphTest.java deleted file mode 100644 index c260d1408f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/jooqrecordmappers/MapperGeneratorToGraphTest.java +++ /dev/null @@ -1,229 +0,0 @@ -package no.sikt.graphitron.jooqrecordmappers; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.mapping.RecordMapperClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.*; -import static no.sikt.graphitron.common.configuration.SchemaComponent.ADDRESS_SERVICE; -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_TABLE; - -@DisplayName("JOOQ Mappers - Mapper content for mapping jOOQ records to graph types") -public class MapperGeneratorToGraphTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "jooqmappers/tograph"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(DUMMY_SERVICE, DUMMY_RECORD, DUMMY_JOOQ_ENUM, MAPPER_FETCH_SERVICE); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new RecordMapperClassGenerator(schema, false)); - } - - @Test - @DisplayName("Simple mapper with one field") - void defaultCase() { - assertGeneratedContentMatches("default", CUSTOMER_TABLE); - } - - @Test - @DisplayName("Field using the @field directive") - void mappedField() { - assertGeneratedContentContains( - "mappedField", - "pathHere + \"first\"", - "customer.setFirst(_nit_customerRecord.getFirstName()" - ); - } - - @Test // This is a special case that cause issues with the mapping logic. - @DisplayName("Listed mapper source with nested fields") - void listedSourceWithNesting() { - assertGeneratedContentContains( - "listedSourceWithNesting", - "_mo_customer_name.setFirst(_nit_customerRecord.getFirstName()" - ); - } - - @Test - @DisplayName("Mapper with multiple fields") - void twoFields() { - assertGeneratedContentContains( - "twoFields", - "pathHere + \"id\"", - "customer.setId(_nit_customerRecord.getId()", - "pathHere + \"first\"", - "customer.setFirst(_nit_customerRecord.getFirstName()" - ); - } - - @Test - @DisplayName("Mapper with a non-record outer wrapper") - void outerNonRecordWrapper() { - assertGeneratedContentContains( - "outerNonRecordWrapper", - "pathHere + \"customer\"", - "wrapper.setCustomer(_iv_transform.customerRecordToGraphType(_mi_wrapperRecord, _iv_pathHere + \"customer\")" - ); - } - - @Test - @DisplayName("Record containing jOOQ record") - void containingRecords() { - assertGeneratedContentContains( - "containingRecords", - "setAddressKey(_nit_customerRecord.key().into(CustomerRecord.class))" - ); - } - - @Test - @DisplayName("Record containing non-record type") - void containingNonRecordWrapper() { - assertGeneratedContentContains( - "containingNonRecordWrapper", Set.of(ADDRESS_SERVICE), - "address_inner = new Wrapper();" + - "if (_iv_select.contains(_iv_pathHere + \"inner/postalCode\")) {" + - "_mo_address_inner.setPostalCode(_nit_addressRecord.getPostalCode());}" + - "_mo_address.setInner(_mo_address_inner)" - ); - } - - @Test - @DisplayName("Mapper with two layers of non-record types") - void containingDoubleNonRecordWrapper() { - assertGeneratedContentContains( - "containingDoubleNonRecordWrapper", Set.of(ADDRESS_SERVICE), - "address_inner0 = new Wrapper();" + - "if (_iv_select.contains(_iv_pathHere + \"inner0/inner1\")) {" + - "var _mo_wrapper_inner1 = new InnerWrapper();" + - "if (_iv_select.contains(_iv_pathHere + \"inner0/inner1/postalCode\")) {" + - "_mo_wrapper_inner1.setPostalCode(_nit_addressRecord.getPostalCode());}" + - "_mo_address_inner0.setInner1(_mo_wrapper_inner1);}" + - "_mo_address.setInner0(_mo_address_inner0)" - ); - } - - @Test - @DisplayName("Fields on different levels that have the same name") - void nestingWithDuplicateFieldName() { - assertGeneratedContentContains( - "nestingWithDuplicateFieldName", Set.of(ADDRESS_SERVICE), - "address_inner = new Wrapper();" + - "if (_iv_select.contains(_iv_pathHere + \"inner/inner\")) {" + - "var _mo_wrapper_inner = new InnerWrapper();" + - "if (_iv_select.contains(_iv_pathHere + \"inner/inner/postalCode\")) {" + - "_mo_wrapper_inner.setPostalCode(_nit_addressRecord.getPostalCode());}" + - "_mo_address_inner.setInner(_mo_wrapper_inner);}" + - "_mo_address.setInner(_mo_address_inner)" - ); - } - - @Test - @DisplayName("Record containing non-record type and using field overrides") - void containingNonRecordWrapperWithFieldOverride() { - assertGeneratedContentContains( - "containingNonRecordWrapperWithFieldOverride", Set.of(ADDRESS_SERVICE), - "address_inner1 = new Wrapper1()", - "address_inner1.setCode(_nit_addressRecord.getPostalCode()", - "address_inner2 = new Wrapper2()", - "address_inner2.setCode(_nit_addressRecord.getPostalCode()" - ); - } - - @Test - @DisplayName("Handles fields that are not mapped to a record field") // TODO: This currently produces illegal code. - void unconfiguredField() { - assertGeneratedContentContains( - "unconfiguredField", - ".setId1(_nit_customerRecord.getId1()", - ".setId2(_nit_customerRecord.getWrongName()" - ); - } - - @Test - @DisplayName("Maps ID fields that are not the primary key") - void idOtherThanPK() { - assertGeneratedContentContains("idOtherThanPK", ".setAddressId(_nit_customerRecord.getAddressId()"); - } - - @Test - @DisplayName("Enum field") - void withEnum() { - assertGeneratedContentContains("withEnum", Set.of(SchemaComponent.DUMMY_ENUM),".setE(QueryHelper.makeEnumMap(_nit_filmRecord.getRating(),"); - } - - @Test - @DisplayName("SplitQuery field") - void withSplitQueryReference() { - assertGeneratedContentContains("withSplitQueryReference", - "if (_iv_select.contains(_iv_pathHere + \"address\")) {_mo_customer.setAddressKey(_nit_customerRecord.key().into(CustomerRecord.class));}" - ); - } - - @Test - @DisplayName("SplitQuery list") - void withSplitQueryList() { - assertGeneratedContentContains("withSplitQueryList", - "customer.setId(_nit_customerRecord.getId())", - """ - if (_iv_select.contains(_iv_pathHere + "customers")) { - _mo_customerPayload.setCustomersKey(_mi_customerPayloadRecord.stream().map(_iv_it -> _iv_it.key().into(CustomerRecord.class)).toList()); - } - """ - ); - } - - @Test - @DisplayName("SplitQuery field with key provided in reference directive") - void withSplitQueryReferenceWithKey() { - assertGeneratedContentContains("withSplitQueryReferenceWithKey", - "if (_iv_select.contains(_iv_pathHere + \"address\")) {_mo_customer.setAddressKey(_nit_customerRecord.key().into(CustomerRecord.class));}" - ); - } - - @Test - @DisplayName("SplitQuery list field with key provided in reference directive") - void withSplitQueryReferenceWithKeyList() { - assertGeneratedContentContains("withSplitQueryReferenceWithKeyList", - "\"payments\")) {_mo_customer.setPaymentsKey(_nit_customerRecord.key().into(CustomerRecord.class))" - ); - } - - @Test - @DisplayName("SplitQuery field with condition and no key provided in reference directive") - void withSplitQueryReferenceWithCondition() { - assertGeneratedContentContains("withSplitQueryReferenceWithCondition", - "\"address\")) {_mo_customer.setAddressKey(_nit_customerRecord.key().into(CustomerRecord.class))" - ); - } - - @Test - @DisplayName("SplitQuery list field with condition and no key provided in reference directive") - void withSplitQueryReferenceWithConditionList() { - assertGeneratedContentContains("withSplitQueryReferenceWithConditionList", - "\"payments\")) {_mo_customer.setPaymentsKey(_nit_customerRecord.key().into(CustomerRecord.class))" - ); - } - - @Test - @DisplayName("With scalar array field") - void arrayScalarField() { - assertGeneratedContentContains( - "arrayScalarField", - "setUsernames(List.of(_nit_customerRecord.getUsernames()));" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/jooqrecordmappers/MapperGeneratorToRecordTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/jooqrecordmappers/MapperGeneratorToRecordTest.java deleted file mode 100644 index 358dd95664..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/jooqrecordmappers/MapperGeneratorToRecordTest.java +++ /dev/null @@ -1,164 +0,0 @@ -package no.sikt.graphitron.jooqrecordmappers; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.mapping.RecordMapperClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.*; -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_INPUT_TABLE; - -@DisplayName("JOOQ Mappers - Mapper content for mapping graph types to jOOQ records") -public class MapperGeneratorToRecordTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "jooqmappers/torecord"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(DUMMY_SERVICE, DUMMY_JOOQ_ENUM, MAPPER_FETCH_SERVICE); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new RecordMapperClassGenerator(schema, true)); - } - - @Test - @DisplayName("Simple mapper with one field") - void defaultCase() { - assertGeneratedContentMatches("default", CUSTOMER_INPUT_TABLE); - } - - @Test - @DisplayName("Field using the @field directive") - void mappedField() { - assertGeneratedContentContains( - "mappedField", - "_iv_args.hasField(\"first\")", - "customerRecord.setFirstName(_nit_customer.getFirst()" - ); - } - - @Test - @DisplayName("Mapper with multiple fields") - void twoFields() { - assertGeneratedContentContains( - "twoFields", - "_iv_args.hasField(\"id\")", - "customerRecord.setId(_nit_customer.getId()", - "_iv_args.hasField(\"first\")", - "customerRecord.setFirstName(_nit_customer.getFirst()" - ); - } - - @Test - @DisplayName("Record containing non-record type") - void containingNonRecordWrapper() { - assertGeneratedContentContains( - "containingNonRecordWrapper", - """ - if (_mi_address_inner != null) { - var _iv_nextArgs0 = _iv_args.child("inner"); - if (_iv_nextArgs0.hasField("postalCode")) { - _mo_addressRecord.setPostalCode(_mi_address_inner.getPostalCode()); - } - } - _mlo_addressRecord.add(_mo_addressRecord); - """ - ); - } - - @Test - @DisplayName("Mapper with two layers of non-record types") - void containingDoubleNonRecordWrapper() { - assertGeneratedContentContains( - "containingDoubleNonRecordWrapper", - """ - var _mi_address_inner0 = _nit_address.getInner0(); - if (_mi_address_inner0 != null) { - var _iv_nextArgs0 = _iv_args.child("inner0"); - var _mi_wrapper_inner1 = _mi_address_inner0.getInner1(); - if (_mi_wrapper_inner1 != null) { - var _iv_nextArgs1 = _iv_nextArgs0.child("inner1"); - """ - - ); - } - - @Test - @DisplayName("Fields on different levels that have the same name") - void nestingWithDuplicateFieldName() { - assertGeneratedContentContains( - "nestingWithDuplicateFieldName", - """ - var _mi_address_inner = _nit_address.getInner(); - if (_mi_address_inner != null) { - var _iv_nextArgs0 = _iv_args.child("inner"); - var _mi_wrapper_inner = _mi_address_inner.getInner(); - """ - ); - } - - @Test - @DisplayName("Record containing non-record type and using field overrides") - @Disabled("This confuses the temporary variable a bit, but otherwise works.") - void containingNonRecordWrapperWithFieldOverride() { - assertGeneratedContentContains( - "containingNonRecordWrapperWithFieldOverride", - "address_inner1 = _nit_address.getInner1()", - ".setPostalCode(_mi_address_inner1.getCode()", - "address_inner2 = _nit_address.getInner2()", - ".setPostalCode(_mi_address_inner2.getCode()" - ); - } - - @Test - @DisplayName("Handles fields that are not mapped to a record field") // TODO: This currently produces illegal code. - void unconfiguredField() { - assertGeneratedContentContains( - "unconfiguredField", - ".setId1(_nit_customer.getId1()", - ".setWrongName(_nit_customer.getId2()" - ); - } - - @Test - @DisplayName("Maps ID fields that are not the primary key") - void idOtherThanPK() { - assertGeneratedContentContains("idOtherThanPK", ".setAddressId(_nit_customer.getAddressId()"); - } - - @Test - @DisplayName("Records with enum fields") - void withEnum() { - assertGeneratedContentContains("withEnum", Set.of(SchemaComponent.DUMMY_ENUM), ".setRating(QueryHelper.makeEnumMap(_nit_filmInput.getE(),"); - } - - @Test - @DisplayName("Record containing jOOQ record") - void containingRecords() { - assertGeneratedContentContains( - "containingRecords", - "customerRecord = new ArrayList<CustomerRecord>();return _mlo_customerRecord" - ); - } - - @Test - @DisplayName("With scalar array field") - void arrayScalarField() { - assertGeneratedContentContains( - "arrayScalarField", - ".setUsernames(_nit_customer.getUsernames().stream().toArray(String[]::new));" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/jooqrecordmappers/MapperGeneratorToRecordValidationTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/jooqrecordmappers/MapperGeneratorToRecordValidationTest.java deleted file mode 100644 index 64524d771b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/jooqrecordmappers/MapperGeneratorToRecordValidationTest.java +++ /dev/null @@ -1,129 +0,0 @@ -package no.sikt.graphitron.jooqrecordmappers; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.configuration.RecordValidation; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.ReducedRecordMapperClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.DUMMY_SERVICE; -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_INPUT_TABLE; - -@DisplayName("JOOQ Validators - Validate mapped jOOQ records") -public class MapperGeneratorToRecordValidationTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "jooqmappers"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(DUMMY_SERVICE); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new ReducedRecordMapperClassGenerator(schema)); // Generates only validation. - } - - @BeforeEach - public void setup() { - super.setup(); - GeneratorConfig.setRecordValidation(new RecordValidation(true, null)); - } - - @Test - @DisplayName("Simple mapper with one field") - void defaultCase() { - assertGeneratedContentMatches("validation/default", CUSTOMER_INPUT_TABLE); - } - - @Test - @DisplayName("Field using the @field directive") - void mappedField() { - assertGeneratedContentContains( - "torecord/mappedField", - "pathHere + \"first\"", - ".put(\"firstName\", _iv_pathHere + _niit_customerRecord + \"/first\"" - ); - } - - @Test - @DisplayName("Mapper with multiple fields") - void twoFields() { - assertGeneratedContentContains( - "torecord/twoFields", - "pathHere + \"id\"", - ".put(\"id\", _iv_pathHere + _niit_customerRecord + \"/id\"", - "pathHere + \"first\"", - ".put(\"firstName\", _iv_pathHere + _niit_customerRecord + \"/first\"" - ); - } - - @Test - @DisplayName("Record containing non-record type") - void containingNonRecordWrapper() { - assertGeneratedContentContains( - "torecord/containingNonRecordWrapper", - ".put(\"postalCode\", _iv_pathHere + _niit_addressRecord + \"/inner/postalCode\"" - ); - } - - @Test - @DisplayName("Mapper with two layers of non-record types") - void containingDoubleNonRecordWrapper() { - assertGeneratedContentContains( - "torecord/containingDoubleNonRecordWrapper", - ".put(\"postalCode\", _iv_pathHere + _niit_addressRecord + \"/inner0/inner1/postalCode\"" - ); - } - - @Test - @DisplayName("Fields on different levels that have the same name") - void nestingWithDuplicateFieldName() { - assertGeneratedContentContains( - "torecord/nestingWithDuplicateFieldName", - ".put(\"postalCode\", _iv_pathHere + _niit_addressRecord + \"/inner/inner/postalCode\"" - ); - } - - @Test - @DisplayName("Record containing non-record type and using field overrides") - // This does not inherit @field the same way the mappers do, and may therefore have unwanted deviations. - void containingNonRecordWrapperWithFieldOverride() { - assertGeneratedContentContains( - "torecord/containingNonRecordWrapperWithFieldOverride", - "pathHere + \"inner1/code\"", - ".put(\"postalCode\", _iv_pathHere + _niit_addressRecord + \"/inner1/code\"", - "pathHere + \"inner2/code\"", - ".put(\"code\", _iv_pathHere + _niit_addressRecord + \"/inner2/code\"" - ); - } - - @Test - @DisplayName("Handles fields that are not mapped to a record field") // TODO: This currently does not check for field existence. - void unconfiguredField() { - assertGeneratedContentContains( - "torecord/unconfiguredField", - ".put(\"id1\", _iv_pathHere + _niit_customerRecord + \"/id1\")", - ".put(\"wrongName\", _iv_pathHere + _niit_customerRecord + \"/id2\"" - ); - } - - @Test - @DisplayName("Record containing jOOQ record") // Can not do anything with jOOQ records, so will skip them. - void containingRecords() { - assertGeneratedContentContains( - "torecord/containingRecords", - "validationErrors = new HashSet<GraphQLError>();return _iv_validationErrors" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/jooqrecordmappers/MapperGeneratorToRecordWithTransformTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/jooqrecordmappers/MapperGeneratorToRecordWithTransformTest.java deleted file mode 100644 index fcfe42559c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/jooqrecordmappers/MapperGeneratorToRecordWithTransformTest.java +++ /dev/null @@ -1,42 +0,0 @@ -package no.sikt.graphitron.jooqrecordmappers; - -import no.sikt.graphitron.codereferences.transforms.SomeTransform; -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.configuration.externalreferences.GlobalTransform; -import no.sikt.graphitron.configuration.externalreferences.TransformScope; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.mapping.RecordMapperClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -@DisplayName("JOOQ Mappers - Mapper content for mapping graph types to jOOQ records") -public class MapperGeneratorToRecordWithTransformTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "jooqmappers/torecord"; - } - - @Override - protected Set<GlobalTransform> getGlobalTransforms() { - return Set.of(new GlobalTransform(SomeTransform.class.getName(), "someTransform", TransformScope.ALL_MUTATIONS)); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new RecordMapperClassGenerator(schema, true)); - } - - @Test - @DisplayName("Default case for global record transforms") - void defaultCase() { - assertGeneratedContentContains( - "withTransforms", - "customerRecord = (ArrayList<CustomerRecord>) SomeTransform.someTransform(_iv_ctx, _mlo_customerRecord);" + - "return _mlo_customerRecord" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/jooqrecordmappers/MapperNodeIdWithoutNodeTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/jooqrecordmappers/MapperNodeIdWithoutNodeTest.java deleted file mode 100644 index 9a84f55486..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/jooqrecordmappers/MapperNodeIdWithoutNodeTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package no.sikt.graphitron.jooqrecordmappers; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.mapping.RecordMapperClassGenerator; -import no.sikt.graphitron.generators.mapping.TransformerClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.*; -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_NODE_STRATEGY; - -@DisplayName("Mappers - Node strategy is not used when Node interface is absent") -public class MapperNodeIdWithoutNodeTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "javamappers/nodeStrategy/toRecord"; - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of( - new RecordMapperClassGenerator(schema, false), - new RecordMapperClassGenerator(schema, true), - new TransformerClassGenerator(schema) - ); - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(DUMMY_SERVICE); - } - - @Test - @DisplayName("Node strategy is not used in mapper when enabled but no Node interface exists") - void nodeStrategyWithoutNodeInMapper() { - GeneratorConfig.setNodeStrategy(true); - resultDoesNotContain("nodeIdWithoutNode", Set.of(DUMMY_INPUT_RECORD), "NodeIdStrategy", VAR_NODE_STRATEGY); - GeneratorConfig.setNodeStrategy(false); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/jooqrecordmappers/MapperNodeStrategyTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/jooqrecordmappers/MapperNodeStrategyTest.java deleted file mode 100644 index 5fc155bb99..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/jooqrecordmappers/MapperNodeStrategyTest.java +++ /dev/null @@ -1,126 +0,0 @@ -package no.sikt.graphitron.jooqrecordmappers; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.mapping.RecordMapperClassGenerator; -import no.sikt.graphitron.generators.mapping.TransformerClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.JAVA_RECORD_CUSTOMER; -import static no.sikt.graphitron.common.configuration.ReferencedEntry.MAPPER_FETCH_SERVICE; -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_NODE; -import static no.sikt.graphitron.common.configuration.SchemaComponent.NODE; - -@DisplayName("Mappers with node strategy (temporary test class)") -public class MapperNodeStrategyTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "jooqmappers/nodeStrategy"; - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of( - new RecordMapperClassGenerator(schema, false), - new RecordMapperClassGenerator(schema, true), - new TransformerClassGenerator(schema) - ); - } - - @BeforeAll - static void setUp() { - GeneratorConfig.setNodeStrategy(true); - } - - @AfterAll - static void tearDown() { - GeneratorConfig.setNodeStrategy(false); - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(JAVA_RECORD_CUSTOMER, MAPPER_FETCH_SERVICE); - } - - @Test - @DisplayName("To graph with node strategy (temporary test)") - void toGraph() { - assertGeneratedContentContains("toGraph/default", Set.of(CUSTOMER_NODE), - // In mapper - " recordToGraphType(List<CustomerRecord> _mi_customerRecord, NodeIdStrategy _iv_nodeIdStrategy, String _iv_path, RecordTransformer _iv_transform)", - "customerNode.setId(_iv_nodeIdStrategy.createId(_nit_customerRecord, \"CustomerNode\", Customer.CUSTOMER.CUSTOMER_ID))", - - // In record transformer - "customerNodeRecordToGraphType(List<CustomerRecord> _mi_input, NodeIdStrategy _iv_nodeIdStrategy, String _iv_path)", - "customerNodeRecordToGraphType(CustomerRecord _mi_input, NodeIdStrategy _iv_nodeIdStrategy, String _iv_path)", - "customerNodeRecordToGraphType(List.of(_mi_input), _iv_nodeIdStrategy, _iv_path)", - ".recordToGraphType(_mi_input, _iv_nodeIdStrategy, _iv_path, this)" - ); - } - - @Test - @DisplayName("Custom node ID field to graph with node strategy (temporary test)") - void toGraphCustomNodeId() { - assertGeneratedContentContains("toGraph/toGraphCustomNodeId", Set.of(NODE), - "customerNode.setId(_iv_nodeIdStrategy.createId(_nit_customerRecord, \"C\", Customer.CUSTOMER.CUSTOMER_ID))" - ); - } - - @Test - @DisplayName("To graph with node strategy (temporary test)") - void toGraphNotNodeId() { - assertGeneratedContentContains("toGraph/notNodeId", - "customer.setCustomerId(_nit_customerRecord.getCustomerId()" - ); - } - - @Test - @DisplayName("To record with node strategy (temporary test)") - void toRecord() { - assertGeneratedContentContains("toRecord/default", Set.of(CUSTOMER_NODE), - // In mapper - "toJOOQRecord(List<CustomerInputTable> _mi_customerInputTable, NodeIdStrategy _iv_nodeIdStrategy, ArgumentPresence _iv_argPresence, String _iv_path, RecordTransformer _iv_transform)", - "nodeIdStrategy.setId(_mo_customerRecord, _nit_customerInputTable.getId(), \"CustomerNode\", Customer.CUSTOMER.CUSTOMER_ID)", - - // In recordtransformer - "customerInputTableToJOOQRecord(List<CustomerInputTable> _mi_input, NodeIdStrategy _iv_nodeIdStrategy, ArgumentPresence _iv_argPresence, String _iv_path)", - "customerInputTableToJOOQRecord(CustomerInputTable _mi_input, NodeIdStrategy _iv_nodeIdStrategy, ArgumentPresence _iv_argPresence, String _iv_path)", - "customerInputTableToJOOQRecord(List.of(_mi_input), _iv_nodeIdStrategy, _iv_argPresence.asSingleItem(), _iv_path)", - ".toJOOQRecord(_mi_input, _iv_nodeIdStrategy, _iv_argPresence, _iv_path, this)" - ); - } - - @Test - @DisplayName("Node ID in jooq record with implicit reference") - void toRecordWithImplicitReference() { - assertGeneratedContentContains("toRecord/withImplicitReference", Set.of(CUSTOMER_NODE), - "nodeIdStrategy.setReferenceId(_mo_customerRecord, _nit_customerInputTable.getAddressId(), \"Address\", Customer.CUSTOMER.ADDRESS_ID)" - ); - } - - @Test - @DisplayName("Node ID in jooq record with key reference") - void toRecordWithReferenceKey() { - assertGeneratedContentContains("toRecord/withReferenceKey", Set.of(CUSTOMER_NODE), - "nodeIdStrategy.setReferenceId(_mo_customerRecord, _nit_customerInputTable.getAddressId(), \"Address\", Customer.CUSTOMER.ADDRESS_ID)" - ); - } - - @Test - @DisplayName("Wrapper field containing listed Java record with splitQuery field") - void listedFieldWithJavaRecord() { - assertGeneratedContentContains( - "toGraph/splitQueryInNestedJavaRecord", Set.of(NODE), - "customerJavaRecordToGraphType(_mi_payloadRecord, _iv_nodeIdStrategy, _iv_pathHere + \"customerJavaRecords\")" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/jooqrecordmappers/MapperWithValidationNodeStrategyTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/jooqrecordmappers/MapperWithValidationNodeStrategyTest.java deleted file mode 100644 index 5c8a832c7c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/jooqrecordmappers/MapperWithValidationNodeStrategyTest.java +++ /dev/null @@ -1,74 +0,0 @@ -package no.sikt.graphitron.jooqrecordmappers; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.configuration.RecordValidation; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.mapping.RecordMapperClassGenerator; -import no.sikt.graphitron.generators.mapping.TransformerClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.*; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.*; -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_NODE; - -@DisplayName("Mappers with node strategy and validation (temporary test class)") -public class MapperWithValidationNodeStrategyTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "jooqmappers/nodeStrategy"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(DUMMY_SERVICE, DUMMY_RECORD, DUMMY_JOOQ_ENUM, MAPPER_FETCH_SERVICE); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new RecordMapperClassGenerator(schema, false), - new RecordMapperClassGenerator(schema, true), - new TransformerClassGenerator(schema) - ); - } - - @BeforeAll - static void setUp() { - GeneratorConfig.setNodeStrategy(true); - } - - @AfterAll - static void tearDown() { - GeneratorConfig.setNodeStrategy(false); - } - - @BeforeEach - public void setup() { - super.setup(); - GeneratorConfig.setRecordValidation(new RecordValidation(true, null)); - } - - @Test - @DisplayName("To record with node strategy (temporary test)") - void toRecord() { - assertGeneratedContentContains("toRecord/default", Set.of(CUSTOMER_NODE), - // In mapper - "toJOOQRecord(List<CustomerInputTable> _mi_customerInputTable, NodeIdStrategy _iv_nodeIdStrategy, ArgumentPresence _iv_argPresence, String _iv_path, RecordTransformer _iv_transform)", - "nodeIdStrategy.setId(_mo_customerRecord, _nit_customerInputTable.getId(), \"CustomerNode\", Customer.CUSTOMER.CUSTOMER_ID)", - - // In recordtransformer - "customerInputTableToJOOQRecord(List<CustomerInputTable> _mi_input, NodeIdStrategy _iv_nodeIdStrategy, ArgumentPresence _iv_argPresence, String _iv_path, String _iv_indexPath)", - "customerInputTableToJOOQRecord(CustomerInputTable _mi_input, NodeIdStrategy _iv_nodeIdStrategy, ArgumentPresence _iv_argPresence, String _iv_path, String _iv_indexPath)", - "customerInputTableToJOOQRecord(List.of(_mi_input), _iv_nodeIdStrategy, _iv_argPresence.asSingleItem(), _iv_path, _iv_indexPath)", - ".toJOOQRecord(_mi_input, _iv_nodeIdStrategy, _iv_argPresence, _iv_path, this)", - - // validation - "validate(List<CustomerRecord> _mi_customerRecord, String _iv_path, RecordTransformer _iv_transform)", - ".validate(_mo_records, _iv_indexPath, this)" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/edit/BatchingQueryTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/edit/BatchingQueryTest.java deleted file mode 100644 index 05268935b8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/edit/BatchingQueryTest.java +++ /dev/null @@ -1,158 +0,0 @@ -package no.sikt.graphitron.queries.edit; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.UpdateOnlyDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_INPUT_TABLE; -import static no.sikt.graphitron.common.configuration.SchemaComponent.NODE; - -@DisplayName("Mutation queries - Queries for updating data with JDBC batching") -public class BatchingQueryTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/edit/withBatching"; - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(CUSTOMER_INPUT_TABLE); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new UpdateOnlyDBClassGenerator(schema)); - } - - @BeforeAll - static void setUp() { - GeneratorConfig.setNodeStrategy(true); - } - - @AfterAll - static void tearDown() { - GeneratorConfig.setNodeStrategy(false); - } - - @Test - @DisplayName("Update") // This is default for no particular reason, could have been any of the types. - void defaultCase() { - assertGeneratedContentMatches("default", NODE); - } - - @Test - @DisplayName("Delete") - void delete() { - assertGeneratedContentContains("delete", ".batchDelete(_mi_inRecord)"); - } - - @Test - @DisplayName("Insert") - void insert() { - assertGeneratedContentContains("insert", ".batchInsert(_mi_inRecord)"); - } - - @Test - @DisplayName("Upsert") - void upsert() { - assertGeneratedContentContains("upsert", ".batchMerge(_mi_inRecord)"); - } - - @Test - @DisplayName("Upsert with node id") - void upsertNodeId() { - assertGeneratedContentContains("upsertNodeId", Set.of(NODE), - "_mi_inRecord.changed(VACATION_DESTINATION.DESTINATION_ID, true);", - "inRecord.changed(VACATION_DESTINATION.COUNTRY_NAME, true);", - ".batchMerge(_mi_inRecord)" - ); - } - - @Test - @DisplayName("Upsert with implicit node id") - void upsertImplicitNodeId() { - assertGeneratedContentContains("upsertNodeIdWithImplicitTypeName", Set.of(NODE), - "inRecord.changed(VACATION_DESTINATION.DESTINATION_ID, true);", - "inRecord.changed(VACATION_DESTINATION.COUNTRY_NAME, true);", - ".batchMerge(_mi_inRecord)" - ); - } - - @Test - @DisplayName("Upsert with node id being an iterable") - void upsertNodeIdIterable() { - assertGeneratedContentContains("upsertNodeIdIterable", Set.of(NODE), - "inRecordList.forEach(_iv_it -> {", - "it.changed(VACATION_DESTINATION.DESTINATION_ID, true);", - "it.changed(VACATION_DESTINATION.COUNTRY_NAME, true);", - ".batchMerge(_mi_inRecordList)" - ); - } - - @Test - @DisplayName("Upsert with node id having custom key columns") - void upsertNodeIdCustomKeyColumns() { - assertGeneratedContentContains("upsertNodeIdCustomKeyColumns", Set.of(NODE), - "inRecord.changed(VACATION_DESTINATION.KEY_COLUMN1, true);", - "inRecord.changed(VACATION_DESTINATION.KEY_COLUMN2, true);", - ".batchMerge(_mi_inRecord)" - ); - } - - @Test - @DisplayName("Mutation with an unusable extra field") - void extraField() { - assertGeneratedContentContains("extraField", ", CustomerRecord _mi_inRecord, String _mi_id", ".batchUpdate(_mi_inRecord)"); - } - - @Test - @DisplayName("List") // Mutation type does not matter. - void listed() { - assertGeneratedContentContains("listed", "List<CustomerRecord> _mi_inRecordList", ".batchUpdate(_mi_inRecordList)"); - } - - // These four may be unused in practice and could have problems. - @Test - @DisplayName("Double record mutation") - void twoRecords() { - assertGeneratedContentMatches("twoRecords", NODE); - } - - @Test - @DisplayName("Mutations with two distinct records") - void twoDifferentRecords() { - assertGeneratedContentContains("twoDifferentRecords", ", CustomerRecord _mi_in1Record, AddressRecord _mi_in2Record"); - } - - @Test - @DisplayName("Mutations with two records where both are lists") - void twoListedRecords() { - assertGeneratedContentContains( - "twoListedRecords", - ", List<CustomerRecord> _mi_in1RecordList, List<CustomerRecord> _mi_in2RecordList", - "recordList.addAll(_mi_in1RecordList)", - "recordList.addAll(_mi_in2RecordList)" - ); - } - - @Test - @DisplayName("Mutations with two records where one is a list") - void twoRecordsOneListed() { - assertGeneratedContentContains( - "twoRecordsOneListed", - ", List<CustomerRecord> _mi_in1RecordList, CustomerRecord _mi_in2Record", - "recordList.add(_mi_in2Record)", - "recordList.addAll(_mi_in1RecordList)" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/edit/BatchingQueryWithStoreTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/edit/BatchingQueryWithStoreTest.java deleted file mode 100644 index 25f568d7ca..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/edit/BatchingQueryWithStoreTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package no.sikt.graphitron.queries.edit; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.UpdateOnlyDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.*; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_INPUT_TABLE; - -@DisplayName("Mutation queries - Queries for updating data with JDBC batching") -public class BatchingQueryWithStoreTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/edit/withBatching"; - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(CUSTOMER_INPUT_TABLE); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new UpdateOnlyDBClassGenerator(schema)); - } - - @BeforeEach - void setUp() { - GeneratorConfig.setGenerateUpsertAsStore(true); - } - - @AfterEach - void tearDown() { - GeneratorConfig.setGenerateUpsertAsStore(false); - } - - @Test - @DisplayName("Upsert as store") - void upsertAsStore() { - assertGeneratedContentContains("upsert", ".batchStore(_mi_inRecord)"); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/edit/DeleteQueryTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/edit/DeleteQueryTest.java deleted file mode 100644 index 0dc4811287..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/edit/DeleteQueryTest.java +++ /dev/null @@ -1,83 +0,0 @@ -package no.sikt.graphitron.queries.edit; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -@DisplayName("Mutation queries - Query and conditions for deleting data") -public class DeleteQueryTest extends MutationQueryTest { - @Override - protected String getSubpath() { - return super.getSubpath() + "delete"; - } - - @BeforeAll - static void setUp() { - GeneratorConfig.setUseJdbcBatchingForDeletes(false); - } - - @AfterAll - static void tearDown() { - GeneratorConfig.setUseJdbcBatchingForDeletes(true); - } - - - @Test - @DisplayName("Default case with scalar field in jOOQ record input") - void defaultCase() { - assertGeneratedContentMatches("default"); - } - - - @Test - @DisplayName("With node ID field in jOOQ record input") - void nodeIdInput() { - assertGeneratedContentContains("nodeIdInput", - ".where(_iv_nodeIdStrategy.hasId(\"CustomerNode\", _mi_inRecord, CUSTOMER.CUSTOMER_ID)" - ); - } - - @Test - @DisplayName("Non nullable input list") - void listedInput() { - assertGeneratedContentContains("listedInput", - """ - .where(_mi_inRecordList.size() > 0 ? - DSL.row(CUSTOMER.CUSTOMER_ID).in( - IntStream.range(0, _mi_inRecordList.size()).mapToObj(_iv_it -> - DSL.row(DSL.val(_mi_inRecordList.get(_iv_it).getCustomerId())) - ).toList() - ) : DSL.falseCondition() - ) - """ - ); - } - - @Test - @DisplayName("Nullable field in input") - void nullableFieldInInput() { - /* - * Note that we validate that the input either has a non-nullable ID or non-nullable fields matching a PK/UK - * Therefore, it's safe to fall back to DSL.noCondition on nullable input fields. - * */ - assertGeneratedContentContains("nullableFieldInInput", - ".and(_mi_inRecord.getFirstName() != null ? CUSTOMER.FIRST_NAME.eq(_mi_inRecord.getFirstName()) : DSL.noCondition())" - ); - } - - @Test - @DisplayName("Input list with node ID field") - void inputListWithNodeId() { - assertGeneratedContentContains("inputListWithNodeId", - """ - DSL.row(DSL.trueCondition()).in( - IntStream.range(0, _mi_inRecordList.size()).mapToObj(_iv_it -> - DSL.row(_iv_nodeIdStrategy.hasId("CustomerNode", _mi_inRecordList.get(_iv_it), CUSTOMER.CUSTOMER_ID)) - ).toList() - ) - """ - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/edit/FetchQueryTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/edit/FetchQueryTest.java deleted file mode 100644 index ace13a7145..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/edit/FetchQueryTest.java +++ /dev/null @@ -1,107 +0,0 @@ -package no.sikt.graphitron.queries.edit; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.MapOnlyFetchDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("Mutation queries - Queries for updating with JDBC batching and then fetching data") -public class FetchQueryTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/edit/withBatching"; - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(CUSTOMER_TABLE, CUSTOMER_INPUT_TABLE); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new MapOnlyFetchDBClassGenerator(schema)); - } - - @Test // Works the same for queries, but there were additional null-pointers for mutations. - @DisplayName("Nested output without table") - void nestedOutput() { - assertGeneratedContentContains("nestedOutput", - "CustomerTable::new", - "new Outer(_iv_it)", - ".fetchOne(_iv_it -> _iv_it.into(Outer.class))", - " DSL.val(_mi_inRecordList.get(_iv_it).getCustomerId())", - ".select(mutationForMutation_outer(_mi_inRecordList)).fetch" // Assert no outer from clause - ); - } - - @Test - @DisplayName("Nested output without table, with error field") - void nestedOutputWithErrorField() { - assertGeneratedContentContains("nestedOutputWithErrorField", - Set.of(ERROR), - ".select(mutationForMutation_outer(_mi_inRecordList)).fetch" // Assert no outer from clause - ); - } - - @Test - @DisplayName("Output after insert") - void defaultCase() { - assertGeneratedContentContains("insert", - ".where(_mi_inRecord != null && _mi_inRecord.getCustomerId() != null ? _a_customer.CUSTOMER_ID.eq(_mi_inRecord.getCustomerId()) : DSL.falseCondition())" - ); - } - - @Test - @DisplayName("Output with composite primary key") - void tableWithCompositePrimaryKey() { - assertGeneratedContentContains("tableWithCompositePrimaryKey", - ".where(_mi_inRecord != null && _mi_inRecord.getDestinationId() != null ? _a_vacationdestination.DESTINATION_ID.eq(_mi_inRecord.getDestinationId()) : DSL.falseCondition())" + - ".and(_mi_inRecord != null && _mi_inRecord.getCountryName() != null ? _a_vacationdestination.COUNTRY_NAME.eq(_mi_inRecord.getCountryName())" - ); - } - - @Test - @DisplayName("Listed output with composite primary key") - void tableWithCompositePrimaryKeyListed() { - assertGeneratedContentContains("tableWithCompositePrimaryKeyListed", - "DSL.row(_a_vacationdestination.DESTINATION_ID, _a_vacationdestination.COUNTRY_NAME)", - "DSL.val(_mi_inRecordList.get(_iv_it).getDestinationId())" - ); - } - - @Test - @DisplayName("Don't filter on non-PK fields in jOOQ record input when fetching after mutation") - void inputRecordWithNonPkField() { - assertGeneratedContentContains("inputRecordWithNonPkField", - ".where(_mi_inRecord != null && _mi_inRecord.getCustomerId() != null ? _a_customer.CUSTOMER_ID.eq(_mi_inRecord.getCustomerId()) : DSL.falseCondition()).fetch" - ); - } - - @Test - @DisplayName("Updating objects with an empty input list should return an empty output list") - void emptyInputListForUpdate() { - assertGeneratedContentContains( - "emptyInputListForUpdate", - ".where(_mi_inRecordList != null && _mi_inRecordList.size() > 0 ? DSL.row(", - ").toList()) : DSL.falseCondition())" - ); - } - - @Test - @DisplayName("Upserting objects with an empty input list should return an empty output list") - void emptyInputListForUpsert() { - assertGeneratedContentContains( - "emptyInputListForUpsert", - ".where(_mi_inRecordList != null && _mi_inRecordList.size() > 0 ? DSL.row(", - ").toList()) : DSL.falseCondition())" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/edit/InsertQueryTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/edit/InsertQueryTest.java deleted file mode 100644 index 4e4eeaef60..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/edit/InsertQueryTest.java +++ /dev/null @@ -1,179 +0,0 @@ -package no.sikt.graphitron.queries.edit; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -@DisplayName("Mutation queries - Query and conditions for inserting data") -public class InsertQueryTest extends MutationQueryTest { - @Override - protected String getSubpath() { - return super.getSubpath() + "insert"; - } - - @Test - @DisplayName("Default case with jOOQ record input") - void defaultCase() { - assertGeneratedContentMatches("default"); - } - - @Test - @DisplayName("With default node ID field") - void nodeId() { - assertGeneratedContentContains("nodeId", - "insertInto(CUSTOMER, CUSTOMER.CUSTOMER_ID)", - ".values(DSL.val(_mi_inRecord.getCustomerId()))" - ); - } - - @Test - @DisplayName("With custom node ID field") - void customNodeId() { - assertGeneratedContentContains("customNodeId", - "insertInto(CUSTOMER, CUSTOMER.CUSTOMER_ID)", - ".values(DSL.val(_mi_inRecord.getCustomerId()))" - ); - } - - @Test - @DisplayName("With default node ID field with multiple key fields") - void nodeIdWithMultipleFields() { - assertGeneratedContentContains("nodeIdWithMultipleFields", - "insertInto(VACATION_DESTINATION, VACATION_DESTINATION.DESTINATION_ID, VACATION_DESTINATION.COUNTRY_NAME)", - """ - .values( - DSL.val(_mi_inRecord.getDestinationId()), - DSL.val(_mi_inRecord.getCountryName()) - ) - """ - ); - } - - @Test - @DisplayName("With custom node ID field with multiple key fields") - void customNodeIdWithMultipleFields() { - assertGeneratedContentContains("customNodeIdWithMultipleFields", - "insertInto(VACATION_DESTINATION, VACATION_DESTINATION.COUNTRY_NAME, VACATION_DESTINATION.DESTINATION_ID)", - """ - .values( - DSL.val(_mi_inRecord.getCountryName()), - DSL.val(_mi_inRecord.getDestinationId()) - ) - """ - ); - } - - @Test - @DisplayName("With default, implicit reference node ID field") - void referenceNodeId() { - assertGeneratedContentContains("referenceNodeId", - "insertInto(CUSTOMER, CUSTOMER.ADDRESS_ID)" + - ".values(DSL.val(_mi_inRecord.getAddressId()))" - ); - } - - @Test - @DisplayName("With custom reference node ID field") - void customReferenceNodeId() { - assertGeneratedContentContains("customReferenceNodeId", - "insertInto(CUSTOMER, CUSTOMER.ADDRESS_ID)" + - ".values(DSL.val(_mi_inRecord.getAddressId()))" - ); - } - - @Test - @DisplayName("Map node ID reference to correct column names") - void referenceNodeIdWithColumnNameMismatch() { - assertGeneratedContentContains("referenceNodeIdWithColumnNameMismatch", - "insertInto(FILM, FILM.ORIGINAL_LANGUAGE_ID)", - ".values(_mi_inRecord.getOriginalLanguageId() != null ? DSL.val(_mi_inRecord.getOriginalLanguageId()) : DSL.defaultValue(FILM.ORIGINAL_LANGUAGE_ID))" - ); - } - - @Test - @DisplayName("With multiple fields including node ID") - void multipleFields() { - assertGeneratedContentContains("multipleFields", - "insertInto(CUSTOMER, CUSTOMER.ADDRESS_ID, CUSTOMER.CUSTOMER_ID, CUSTOMER.FIRST_NAME, CUSTOMER.LAST_NAME)", - """ - .values( - DSL.val(_mi_inRecord.getAddressId()), - DSL.val(_mi_inRecord.getCustomerId()), - DSL.val(_mi_inRecord.getFirstName()), - DSL.val(_mi_inRecord.getLastName()) - ) - """ - ); - } - - @Test - @DisplayName("With nullable field") - void nullableField() { - assertGeneratedContentContains("nullableField", - "insertInto(CUSTOMER, CUSTOMER.ADDRESS_ID)" + - ".values(_mi_inRecord.changed(CUSTOMER.ADDRESS_ID) ? DSL.val(_mi_inRecord.getAddressId()) : DSL.defaultValue(CUSTOMER.ADDRESS_ID))" - ); - } - - @Test - @DisplayName("With nullable node ID field") - void nullableNodeId() { - assertGeneratedContentContains("nullableNodeId", - "insertInto(VACATION_DESTINATION, VACATION_DESTINATION.COUNTRY_NAME, VACATION_DESTINATION.DESTINATION_ID)", - """ - .values( - _mi_inRecord.getId() != null ? DSL.val(_mi_inRecord.getCountryName()) : DSL.defaultValue(VACATION_DESTINATION.COUNTRY_NAME), - _mi_inRecord.getId() != null ? DSL.val(_mi_inRecord.getDestinationId()) : DSL.defaultValue(VACATION_DESTINATION.DESTINATION_ID) - ) - """ - ); - } - - @Test - @DisplayName("Default case with listed input") - void listedInput() { - assertGeneratedContentContains("listedInput", - ".insertInto(CUSTOMER, CUSTOMER.CUSTOMER_ID)", - """ - .valuesOfRows(_mi_inRecordList.stream().map(_iv_it -> { - return DSL.row( - DSL.val(_iv_it.getCustomerId()) - ); - }).toList() - ) - """ - ); - } - - @Test - @DisplayName("Default case with listed input with nullable field") - void listedInputWithNullableField() { - assertGeneratedContentContains("listedInputWithNullableField", - ".insertInto(CUSTOMER, CUSTOMER.CUSTOMER_ID)", - """ - .valuesOfRows(_mi_inRecordList.stream().map(_iv_it -> { - return DSL.row( - _iv_it.changed(CUSTOMER.CUSTOMER_ID) ? DSL.val(_iv_it.getCustomerId()) : DSL.defaultValue(CUSTOMER.CUSTOMER_ID) - ); - }).toList() - ) - """ - ); - } - - @Test - @DisplayName("Default case with listed input with node ID field") - void listedInputWithNodeIdField() { - assertGeneratedContentContains("listedInputWithNodeIdField", - ".insertInto(VACATION_DESTINATION, VACATION_DESTINATION.DESTINATION_ID, VACATION_DESTINATION.COUNTRY_NAME)", - """ - .valuesOfRows(_mi_inRecordList.stream().map(_iv_it -> { - return DSL.row( - DSL.val(_iv_it.getDestinationId()), - DSL.val(_iv_it.getCountryName()) - ); - }).toList() - ) - """ - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/edit/MutationNodeIdWithoutNodeTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/edit/MutationNodeIdWithoutNodeTest.java deleted file mode 100644 index 09ff594de0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/edit/MutationNodeIdWithoutNodeTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package no.sikt.graphitron.queries.edit; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.UpdateOnlyDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_NODE_STRATEGY; - -@DisplayName("Mutation queries - Node strategy is not used when Node interface is absent") -public class MutationNodeIdWithoutNodeTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/edit/delete"; - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new UpdateOnlyDBClassGenerator(schema)); - } - - @Test - @DisplayName("Node strategy is not used in delete mutation when enabled but no Node interface exists") - void nodeStrategyWithoutNodeInDeleteMutation() { - GeneratorConfig.setNodeStrategy(true); - GeneratorConfig.setUseJdbcBatchingForDeletes(false); - resultDoesNotContain("nodeIdWithoutNode", Set.of(SchemaComponent.CUSTOMER_INPUT_TABLE), "NodeIdStrategy", VAR_NODE_STRATEGY); - GeneratorConfig.setNodeStrategy(false); - GeneratorConfig.setUseJdbcBatchingForDeletes(true); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/edit/MutationOutputTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/edit/MutationOutputTest.java deleted file mode 100644 index 91dec8162a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/edit/MutationOutputTest.java +++ /dev/null @@ -1,168 +0,0 @@ -package no.sikt.graphitron.queries.edit; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -@DisplayName("Mutation queries - Inferring table target, and returning data from mutations") -public class MutationOutputTest extends MutationQueryTest { - @Override - protected String getSubpath() { - return super.getSubpath() + "returningResult"; - } - - @Test - @DisplayName("Returning node ID field") - void nodeId() { - assertGeneratedContentContains("nodeId", - "String mutationForMutation", - "deleteFrom(CUSTOMER)", - ".returningResult(_iv_nodeIdStrategy.createId(\"CustomerNode\", CUSTOMER.CUSTOMER_ID))" + - ".fetchOne(_iv_it -> _iv_it.into(String.class))" - ); - } - - @Test - @DisplayName("Returning scalar field") - void scalar() { - assertGeneratedContentContains("scalar", - "Integer mutationForMutation", - "deleteFrom(CUSTOMER)", - ".returningResult(CUSTOMER.CUSTOMER_ID)" + - ".fetchOne(_iv_it -> _iv_it.into(Integer.class))" - ); - } - - @Test - @DisplayName("Returning node ID field wrapped in type without table") - void wrappedNodeId() { - assertGeneratedContentContains("wrappedNodeId", - "CustomerRecord _mi_inRecord, SelectionSet _iv_select)", - "deleteFrom(CUSTOMER)", - ".returningResult(_iv_nodeIdStrategy.createId(\"CustomerNode\", CUSTOMER.CUSTOMER_ID))" + - ".fetchOne(_iv_it -> _iv_it.into(String.class))" - ); - } - - @Test - @DisplayName("Returning scalar field wrapped in type without table") - void wrappedScalar() { - assertGeneratedContentContains("wrappedScalar", - "CustomerRecord _mi_inRecord, SelectionSet _iv_select)", - "deleteFrom(CUSTOMER)", - ".returningResult(CUSTOMER.CUSTOMER_ID)" + - ".fetchOne(_iv_it -> _iv_it.into(Integer.class))" - ); - } - - @Test - @DisplayName("Returning a list of node IDs") - void nodeIdList() { - assertGeneratedContentContains("nodeIdList", - "List<String> mutationForMutation", - "deleteFrom(CUSTOMER)", - ".returningResult(_iv_nodeIdStrategy.createId(\"CustomerNode\", CUSTOMER.CUSTOMER_ID))" + - ".fetch(_iv_it -> _iv_it.into(String.class))" - ); - } - - @Test - @DisplayName("Returning listed scalar field") - void scalarList() { - assertGeneratedContentContains("scalarList", - "List<Integer> mutationForMutation", - "deleteFrom(CUSTOMER)", - ".returningResult(CUSTOMER.CUSTOMER_ID)" + - ".fetch(_iv_it -> _iv_it.into(Integer.class))" - ); - } - - @Test - @DisplayName("Returning listed node ID field wrapped in type without table") - void wrappedNodeIdList() { - assertGeneratedContentContains("wrappedNodeIdList", - "List<String> mutationForMutation", - "deleteFrom(CUSTOMER)", - ".returningResult(_iv_nodeIdStrategy.createId(\"CustomerNode\", CUSTOMER.CUSTOMER_ID))" + - ".fetch(_iv_it -> _iv_it.into(String.class))" - ); - } - - @Test - @DisplayName("Returning listed scalar field wrapped in type without table") - void wrappedScalarList() { - assertGeneratedContentContains("wrappedScalarList", - "List<Integer> mutationForMutation", - "deleteFrom(CUSTOMER)", - ".returningResult(CUSTOMER.CUSTOMER_ID)" + - ".fetch(_iv_it -> _iv_it.into(Integer.class))" - ); - } - - @Test - @DisplayName("Returning table object") - void tableObject() { - assertGeneratedContentContains("tableObject", - "CustomerNode mutationForMutation", - "deleteFrom(CUSTOMER)", - ".returningResult(DSL.row(_iv_nodeIdStrategy.createId(\"CustomerNode\", CUSTOMER.CUSTOMER_ID))" + - ".mapping(Functions.nullOnAllNull(CustomerNode::new)))" + - ".fetchOne(_iv_it -> _iv_it.into(CustomerNode.class))" - ); - } - - @Test - @DisplayName("Returning table object wrapped in type without table") - void wrappedTableObject() { - assertGeneratedContentContains("wrappedTableObject", - "CustomerNode mutationForMutation", - "deleteFrom(CUSTOMER)", - ".returningResult(DSL.row(_iv_nodeIdStrategy.createId(\"CustomerNode\", CUSTOMER.CUSTOMER_ID))" + - ".mapping(Functions.nullOnAllNull(CustomerNode::new)))" + - ".fetchOne(_iv_it -> _iv_it.into(CustomerNode.class))" - ); - } - - @Test - @DisplayName("Returning listed table object") - void tableObjectList() { - assertGeneratedContentContains("tableObjectList", - "List<CustomerNode> mutationForMutation", - "deleteFrom(CUSTOMER)", - ".returningResult(DSL.row(_iv_nodeIdStrategy.createId(\"CustomerNode\", CUSTOMER.CUSTOMER_ID))" + - ".mapping(Functions.nullOnAllNull(CustomerNode::new)))" + - ".fetch(_iv_it -> _iv_it.into(CustomerNode.class))" - ); - } - - @Test - @DisplayName("Returning list of table objects wrapped in type without table") - void wrappedTableObjectList() { - assertGeneratedContentContains("wrappedTableObjectList", - "List<CustomerNode> mutationForMutation", - "deleteFrom(CUSTOMER)", - ".returningResult(DSL.row(_iv_nodeIdStrategy.createId(\"CustomerNode\", CUSTOMER.CUSTOMER_ID))" + - ".mapping(Functions.nullOnAllNull(CustomerNode::new)))" + - ".fetch(_iv_it -> _iv_it.into(CustomerNode.class))" - ); - } - - @Test - @DisplayName("Returning table object with subquery reference") - void tableObjectWithSubqueryReference() { - assertGeneratedContentContains("tableObjectWithSubqueryReference", - "{ var _a_customer_address = CUSTOMER.address()", - "field(DSL.select(DSL.row(_a_customer_address.ADDRESS_ID).mapping(Functions.nullOnAllNull(Address::new))).from(_a_customer_address))" - ); - } - - @Test - @DisplayName("Returning table object with splitQuery reference") - void tableObjectWithSplitQueryReference() { - assertGeneratedContentContains("tableObjectWithSplitQueryReference", - "{ return", - "DSL.row(DSL.row(CUSTOMER.CUSTOMER_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(CUSTOMER.CUSTOMER_ID)))," + - "_iv_nodeIdStrategy.createId(\"Customer\", CUSTOMER.CUSTOMER_ID))" + - ".mapping(Functions.nullOnAllNull(Customer" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/edit/MutationOutputWithoutNodeIdStrategyTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/edit/MutationOutputWithoutNodeIdStrategyTest.java deleted file mode 100644 index a321e865bc..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/edit/MutationOutputWithoutNodeIdStrategyTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package no.sikt.graphitron.queries.edit; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -@DisplayName("Mutation queries - Data returned from mutations") -public class MutationOutputWithoutNodeIdStrategyTest extends MutationQueryTest { - @Override - protected String getSubpath() { - return super.getSubpath() + "returningResult"; - } - - @BeforeAll - static void setUp() { - GeneratorConfig.setNodeStrategy(false); - } - - @AfterAll - static void tearDown() { - GeneratorConfig.setNodeStrategy(true); - } - - @Test - @DisplayName("Returning id field") - void id() { - assertGeneratedContentContains("id", - "String mutationForMutation", - ".returningResult(CUSTOMER.getId())" - ); - } - - @Test - @DisplayName("Returning wrapped id field") - void wrappedId() { - assertGeneratedContentContains("wrappedId", - "String mutationForMutation", - ".returningResult(CUSTOMER.getId())" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/edit/MutationQueryTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/edit/MutationQueryTest.java deleted file mode 100644 index 7bdc059277..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/edit/MutationQueryTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package no.sikt.graphitron.queries.edit; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.MapOnlyFetchDBClassGenerator; -import no.sikt.graphitron.reducedgenerators.UpdateOnlyDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.DisplayName; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("Mutation queries - Queries for updating data") -public class MutationQueryTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/edit/"; - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(CUSTOMER_NODE, CUSTOMER_NODE_INPUT_TABLE, CUSTOMER_INPUT_TABLE); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of( - new UpdateOnlyDBClassGenerator(schema), - new MapOnlyFetchDBClassGenerator(schema) // Temporarily included to make sure we don't generate two methods for mutations without JDBC batching - ); - } - - @BeforeAll - static void setUp() { - GeneratorConfig.setUseJdbcBatchingForAllMutations(false); - GeneratorConfig.setNodeStrategy(true); - } - - @AfterAll - static void tearDown() { - GeneratorConfig.setUseJdbcBatchingForAllMutations(true); - GeneratorConfig.setNodeStrategy(false); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ConditionRecordsTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ConditionRecordsTest.java deleted file mode 100644 index 1e1528a24f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ConditionRecordsTest.java +++ /dev/null @@ -1,131 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.db.DBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.*; -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("Fetch condition queries - Queries that apply custom conditions with records") -public class ConditionRecordsTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/fetch/records"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences( - RECORD_FETCH_CONDITION, - RECORD_FETCH_STAFF_CONDITION, - DUMMY_RECORD, - JAVA_RECORD_STAFF_INPUT1, - JAVA_RECORD_STAFF_INPUT2, - JAVA_RECORD_STAFF_INPUT3, - JAVA_RECORD_STAFF_NAME - ); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new DBClassGenerator(schema)); - } - - @Test - @DisplayName("Conditions with input Java records") - void withInputJavaRecordAndCondition() { - assertGeneratedContentMatches("withInputJavaRecordAndCondition", CUSTOMER_TABLE); - } - - @Test - @DisplayName("Conditions with input jOOQ records") - void withInputJOOQRecordAndCondition() { - assertGeneratedContentMatches("withInputJOOQRecordAndCondition", CUSTOMER_TABLE); - } - - @Test - @DisplayName("Conditions with listed inputs") - void withListedInputConditions() { - assertGeneratedContentMatches("withListedInputConditions", CUSTOMER_TABLE); - } - - @Test - @DisplayName("Condition with nested input records") - void withNestedConditionRecord() { - assertGeneratedContentMatches("withNestedConditionRecord", CUSTOMER_TABLE); - } - - @Test - @DisplayName("Condition with input record and pagination") - void withPaginatedConditionAndRecord() { - assertGeneratedContentMatches("withPaginatedConditionAndRecord", CUSTOMER_CONNECTION, CUSTOMER_INPUT_TABLE); - } - - @Test - @DisplayName("Condition on parameter of Java record input type") - void inputJavaRecordCondition() { - assertGeneratedContentContains( - "inputJavaRecordCondition", Set.of(STAFF, NAME_INPUT_JAVA), - "staff.FIRST_NAME.eq(_mi_nameRecord.getFirstName())", - "staff.LAST_NAME.eq(_mi_nameRecord.getLastName())", - "staff.ACTIVE.eq(_mi_active)", - ".name(_a_staff, _mi_nameRecord))" - ); - } - - @Test - @DisplayName("Condition on listed parameter of Java record input type and field") - void listInputJavaRecordAndFieldCondition() { - assertGeneratedContentContains( - "listInputJavaRecordAndFieldCondition", Set.of(STAFF, NAME_INPUT_JAVA), - "staff.ACTIVE.eq(_mi_active)", - "staff.FIRST_NAME,_a_staff.LAST_NAME).in(IntStream.range(0, _mi_namesRecordList.size()).mapToObj(_iv_it ->" + - "DSL.row(DSL.val(_mi_namesRecordList.get(_iv_it).getFirstName()),DSL.val(_mi_namesRecordList.get(_iv_it).getLastName())", - ".nameList(_a_staff, _mi_namesRecordList)", - ".fieldWithListInput(_a_staff, _mi_namesRecordList, _mi_active)" - ); - } - - @Test - @DisplayName("Condition on listed parameter of Java record input type and override condition on field") - void listInputJavaRecordAndFieldOverrideCondition() { - assertGeneratedContentContains( - "listInputJavaRecordAndFieldOverrideCondition", Set.of(STAFF, NAME_INPUT_JAVA), - ".where(no.sikt.graphitron.codereferences.conditions.RecordStaffCondition.nameList(_a_staff, _mi_namesRecordList))" + - ".and(no.sikt.graphitron.codereferences.conditions.RecordStaffCondition.fieldWithListInput(_a_staff, _mi_namesRecordList, _mi_active))" + - ".orderBy" - ); - } - - @Test - @DisplayName("Override condition on listed parameter of Java record input type containing another input list") - void nestedListInputJavaRecordOverrideCondition() { - assertGeneratedContentContains( - "nestedListInputJavaRecordOverrideCondition", Set.of(STAFF, NAME_INPUT_JAVA), - ".where(no.sikt.graphitron.codereferences.conditions.RecordStaffCondition.input1(_a_staff, _mi_inputs1RecordList))" + - ".orderBy" - ); - } - - @Test - @DisplayName("Overriding condition on parameter of Java record input type contained within a list and multiple levels of input types") - void multiLevelInputJavaRecordOverrideCondition() { - assertGeneratedContentContains( - "multiLevelInputJavaRecordOverrideCondition", Set.of(STAFF, NAME_INPUT_JAVA), - ".where(_mi_input3Record.getInputs2() != null && _mi_input3Record.getInputs2().size() > 0 ?" + - "DSL.row(DSL.trueCondition()).in(" + - "IntStream.range(0, _mi_input3Record.getInputs2().size()).mapToObj(_iv_it ->" + - "DSL.row(no.sikt.graphitron.codereferences.conditions.RecordStaffCondition.input1(_a_staff, _mi_input3Record.getInputs2().get(_iv_it).getInput1()))" + - ").toList()) : DSL.noCondition()" + - ").orderBy" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ConditionTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ConditionTest.java deleted file mode 100644 index dafb7eb07e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ConditionTest.java +++ /dev/null @@ -1,487 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.InterfaceOnlyFetchDBClassGenerator; -import no.sikt.graphitron.reducedgenerators.MapOnlyFetchDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.*; -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("Fetch query conditions - External conditions for queries") -public class ConditionTest extends GeneratorTest { - - @Override - protected String getSubpath() { - return "queries/fetch/conditions"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences( - QUERY_FETCH_CONDITION, - QUERY_FETCH_STAFF_CONDITION, - QUERY_FETCH_ADDRESS_INTERFACE_CONDITION, - CONTEXT_CONDITION - ); - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(CUSTOMER_TABLE); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new MapOnlyFetchDBClassGenerator(schema), new InterfaceOnlyFetchDBClassGenerator(schema)); - } - - @Test - @DisplayName("Condition on a parameter") - void onParam() { - assertGeneratedContentContains( - "onParam", - ".where(_a_customer.EMAIL.eq(_mi_email))" + - ".and(no.sikt.graphitron.codereferences.conditions.QueryCustomerCondition.email(_a_customer, _mi_email)).fetch" - ); - } - - @Test - @DisplayName("Overriding condition on a parameter") - void onParamOverride() { - assertGeneratedContentContains( - "onParamOverride", - ".where(no.sikt.graphitron.codereferences.conditions.QueryCustomerCondition.email(_a_customer, _mi_email)).fetch" - ); - } - - @Test - @DisplayName("Condition on a parameter and one unrelated field") - void onParamWithOtherField() { - assertGeneratedContentContains( - "onParamWithOtherField", - "customer.EMAIL.eq(_mi_email", - "customer.FIRST_NAME.eq(_mi_name", - ".email(_a_customer, _mi_email)" - ); - } - - @Test - @DisplayName("Condition on a listed parameter") - void onListedParam() { - assertGeneratedContentContains("onListedParam", ".emails(_a_customer, _mi_emails)).fetch"); - } - - @Test - @DisplayName("Referencing other method name than default assumption") - void withMethodNameOverride() { - assertGeneratedContentContains("withMethodNameOverride", ".id(_a_customer, _mi_someID)"); - } - - @Test - @DisplayName("Condition on a single field") - void onField() { - assertGeneratedContentContains("onField", "customer.EMAIL.eq(_mi_email", ".query(_a_customer, _mi_email)"); - } - - @Test - @DisplayName("Condition on a field with multiple parameters") - void onFieldMultipleParams() { - assertGeneratedContentContains("onFieldMultipleParams", ".query(_a_customer, _mi_email, _mi_name)"); - } - - @Test - @DisplayName("Overriding condition on a field") - void onFieldOverride() { - assertGeneratedContentContains( - "onFieldOverride", - ".where(no.sikt.graphitron.codereferences.conditions.QueryCustomerCondition.query(_a_customer, _mi_email)).fetch" - ); - } - - @Test - @DisplayName("Conditions on a field and an associated parameter") - void onParamAndField() { - assertGeneratedContentContains( - "onParamAndField", - "customer.EMAIL.eq(_mi_email", - ".email(_a_customer, _mi_email)", - "customer.FIRST_NAME.eq(_mi_name", - ".query(_a_customer, _mi_email, _mi_name)" - ); - } - - @Test - @DisplayName("Condition on a field with override and condition on an associated parameter") - void onParamAndOverrideField() { - assertGeneratedContentContains( - "onParamAndOverrideField", - ".where(no.sikt.graphitron.codereferences.conditions.QueryCustomerCondition.email(_a_customer, _mi_email))" + - ".and(no.sikt.graphitron.codereferences.conditions.QueryCustomerCondition.query(_a_customer, _mi_email, _mi_name)).fetch" - ); - } - - @Test - @DisplayName("Overriding conditions on a field and an associated parameter") - void onParamAndFieldOverrideBoth() { - assertGeneratedContentContains( - "onParamAndOverrideField", - ".where(no.sikt.graphitron.codereferences.conditions.QueryCustomerCondition.email(_a_customer, _mi_email))" + - ".and(no.sikt.graphitron.codereferences.conditions.QueryCustomerCondition.query(_a_customer, _mi_email, _mi_name)).fetch" - ); - } - - @Test - @DisplayName("Condition on an input type parameter") - void onInputParam() { - assertGeneratedContentContains( - "onInputParam", Set.of(STAFF, NAME_INPUT), - "staff.FIRST_NAME.eq(_mi_name.getFirstname())", - "staff.LAST_NAME.eq(_mi_name.getLastname())", - ".name(_a_staff, _mi_name.getFirstname(), _mi_name.getLastname())" - ); - } - - @Test - @DisplayName("Overriding condition on an input type parameter") - void onInputParamOverride() { - assertGeneratedContentContains( - "onInputParamOverride", Set.of(STAFF, NAME_INPUT), - ".where(_mi_active != null ? _a_staff.ACTIVE.eq(_mi_active) : DSL.noCondition())" + - ".and(no.sikt.graphitron.codereferences.conditions.QueryStaffCondition.name(_a_staff, _mi_name.getFirstname(), _mi_name.getLastname()))" + - ".orderBy" - ); - } - - @Test - @DisplayName("Conditions on parameters of input and scalar type") - void onInputAndScalarParams() { - assertGeneratedContentContains( - "onInputAndScalarParams", Set.of(STAFF, NAME_INPUT), - "staff.FIRST_NAME.eq(_mi_name.getFirstname())", - "staff.LAST_NAME.eq(_mi_name.getLastname())", - "email != null ? _a_staff.EMAIL.eq(_mi_email) : DSL.noCondition()", - ".email(_a_staff, _mi_email)", - "staff.ACTIVE.eq(_mi_active)", - ".name(_a_staff, _mi_name.getFirstname(), _mi_name.getLastname())" - ); - } - - @Test - @DisplayName("Overriding condition on parameter of input type and condition on scalar type") - public void onInputOverrideAndScalarParams() { - assertGeneratedContentContains("onInputOverrideAndScalarParams", Set.of(STAFF, NAME_INPUT), - ".where(_a_staff.EMAIL.eq(_mi_email))" + - ".and(no.sikt.graphitron.codereferences.conditions.QueryStaffCondition.email(_a_staff, _mi_email))" + - ".and(no.sikt.graphitron.codereferences.conditions.QueryStaffCondition.name(_a_staff, _mi_name.getFirstname(), _mi_name.getLastname()))" + - ".orderBy" - ); - } - - @Test - @DisplayName("Overriding condition on field where parameter has input type") - public void onFieldOverrideInputParam() { - assertGeneratedContentContains( - "onFieldOverrideInputParam", Set.of(STAFF, NAME_INPUT), - ".where(no.sikt.graphitron.codereferences.conditions.QueryStaffCondition.field(_a_staff, _mi_name.getFirstname(), _mi_name.getLastname(), _mi_active))" + - ".orderBy" - ); - } - - @Test - @DisplayName("Condition on both parameter of input type and field") - public void onInputParamAndField() { - assertGeneratedContentContains( - "onInputParamAndField", Set.of(STAFF, NAME_INPUT), - "staff.FIRST_NAME.eq(_mi_name.getFirstname())", - "staff.LAST_NAME.eq(_mi_name.getLastname())", - "active != null ? _a_staff.ACTIVE.eq(_mi_active) : DSL.noCondition())", - ".field(_a_staff, _mi_name.getFirstname(), _mi_name.getLastname(), _mi_active)", - ".name(_a_staff, _mi_name.getFirstname(), _mi_name.getLastname())" - ); - } - - @Test - @DisplayName("Condition on parameter of input type and override condition on field") - public void onInputParamAndFieldOverride() { - assertGeneratedContentContains( - "onInputParamAndFieldOverride", Set.of(STAFF, NAME_INPUT), - ".where(no.sikt.graphitron.codereferences.conditions.QueryStaffCondition.field(_a_staff, _mi_name.getFirstname(), _mi_name.getLastname(), _mi_active))" + - ".and(no.sikt.graphitron.codereferences.conditions.QueryStaffCondition.name(_a_staff, _mi_name.getFirstname(), _mi_name.getLastname()))" + - ".orderBy" - ); - } - - @Test - @DisplayName("Override condition on both parameter of input type and field") - public void onInputParamAndFieldOverrideBoth() { - assertGeneratedContentContains( - "onInputParamAndFieldOverrideBoth", Set.of(STAFF, NAME_INPUT), - ".where(no.sikt.graphitron.codereferences.conditions.QueryStaffCondition.field(_a_staff, _mi_name.getFirstname(), _mi_name.getLastname(), _mi_active))" + - ".and(no.sikt.graphitron.codereferences.conditions.QueryStaffCondition.name(_a_staff, _mi_name.getFirstname(), _mi_name.getLastname()))" + - ".orderBy" - ); - } - - @Test - @DisplayName("Condition on parameter of nested input type") - public void onNestedInputParam() { - assertGeneratedContentContains( - "onNestedInputParam", Set.of(STAFF, NAME_INPUT), - "staff.FIRST_NAME.eq(_mi_staff.getName().getFirstname())", - "staff.LAST_NAME.eq(_mi_staff.getName().getLastname())", - "staff.getActive() != null ? _a_staff.ACTIVE.eq(_mi_staff.getActive()) : DSL.noCondition())", - ".staffMin(_a_staff, _mi_staff.getName().getFirstname(), _mi_staff.getName().getLastname(), _mi_staff.getActive() != null ? _mi_staff.getActive() : null))" - ); - } - - @Test - @DisplayName("Override condition on parameter of nested input type") - public void onNestedInputOverrideParam() { - assertGeneratedContentContains( - "onNestedInputOverrideParam", Set.of(STAFF, NAME_INPUT), - ".where(no.sikt.graphitron.codereferences.conditions.QueryStaffCondition.staffMin(_a_staff, _mi_staff.getName().getFirstname(), _mi_staff.getName().getLastname(), _mi_staff.getActive()))" + - ".orderBy" - ); - } - - @Test - @DisplayName("Condition on field where parameter has nested input type") - public void onFieldNestedInputParam() { - assertGeneratedContentContains( - "onFieldNestedInputParam", Set.of(STAFF, NAME_INPUT), - "staff.FIRST_NAME.eq(_mi_staff.getName().getFirstname())", - "staff.LAST_NAME.eq(_mi_staff.getName().getLastname())", - "staff.EMAIL.eq(_mi_staff.getEmail())", - "staff.ACTIVE.eq(_mi_staff.getActive())", - ".staff(_a_staff, _mi_staff.getName().getFirstname(), _mi_staff.getName().getLastname(), _mi_staff.getEmail(), _mi_staff.getActive())" - ); - } - - @Test - @DisplayName("Overriding condition on field where parameter has nested input type") - public void onFieldOverrideNestedInputParam() { - assertGeneratedContentContains( - "onFieldOverrideNestedInputParam", Set.of(STAFF, NAME_INPUT), - ".where(no.sikt.graphitron.codereferences.conditions.QueryStaffCondition.staff(_a_staff, _mi_staff.getName().getFirstname(), _mi_staff.getName().getLastname(), _mi_staff.getEmail(), _mi_staff.getActive()))" + - ".orderBy" - ); - } - - @Test - @DisplayName("Overriding condition and condition on parameters of input types on same level within a multi-level input type") - public void onMultiLevelInputDifferentOverride() { - assertGeneratedContentContains( - "onMultiLevelInputDifferentOverride", Set.of(STAFF, NAME_INPUT), - ".where(_a_staff.EMAIL.eq(_mi_staff.getInfo().getJobEmail().getEmail()))" + - ".and(_a_staff.ACTIVE.eq(_mi_staff.getActive()))" + - ".and(no.sikt.graphitron.codereferences.conditions.QueryStaffCondition.name(_a_staff, _mi_staff.getInfo().getName().getFirstname(), _mi_staff.getInfo().getName().getLastname()))" + - ".and(no.sikt.graphitron.codereferences.conditions.QueryStaffCondition.email(_a_staff, _mi_staff.getInfo().getJobEmail().getEmail()))" + - ".orderBy" - ); - } - - @Test - @DisplayName("Overriding condition and condition on parameters of input types on same level within a multi-level input and override condition on field") - public void onMultiLevelInputAndFieldDifferentOverride() { - assertGeneratedContentContains( - "onMultiLevelInputAndFieldDifferentOverride", Set.of(STAFF, NAME_INPUT), - ".where(no.sikt.graphitron.codereferences.conditions.QueryStaffCondition.staff(_a_staff, _mi_staff.getInfo().getName().getFirstname(), _mi_staff.getInfo().getName().getLastname(), _mi_staff.getInfo().getJobEmail().getEmail(), _mi_staff.getActive()))" + - ".and(no.sikt.graphitron.codereferences.conditions.QueryStaffCondition.name(_a_staff, _mi_staff.getInfo().getName().getFirstname(), _mi_staff.getInfo().getName().getLastname()))" + - ".and(no.sikt.graphitron.codereferences.conditions.QueryStaffCondition.email(_a_staff, _mi_staff.getInfo().getJobEmail().getEmail()))" + - ".orderBy" - ); - } - - @Test - @DisplayName("Condition on toplevel parameter input type, overriding condition and condition on input types on same level within multi-level input, and condition on scalar values") - public void onMultiLevelInputAndScalarDifferentOverride() { - assertGeneratedContentContains( - "onMultiLevelInputAndScalarDifferentOverride", Set.of(STAFF, NAME_INPUT), - ".where(no.sikt.graphitron.codereferences.conditions.QueryStaffCondition.firstname(_a_staff, _mi_staff.getInfo().getName().getFirstname()))" + - ".and(no.sikt.graphitron.codereferences.conditions.QueryStaffCondition.lastname(_a_staff, _mi_staff.getInfo().getName().getLastname()))" + - ".and(_a_staff.EMAIL.eq(_mi_staff.getInfo().getJobEmail().getEmail()))" + - ".and(_a_staff.ACTIVE.eq(_mi_staff.getActive()))" + - ".and(no.sikt.graphitron.codereferences.conditions.QueryStaffCondition.staff(_a_staff, _mi_staff.getInfo().getName().getFirstname(), _mi_staff.getInfo().getName().getLastname(), _mi_staff.getInfo().getJobEmail().getEmail(), _mi_staff.getActive()))" + - ".and(no.sikt.graphitron.codereferences.conditions.QueryStaffCondition.name(_a_staff, _mi_staff.getInfo().getName().getFirstname(), _mi_staff.getInfo().getName().getLastname()))" + - ".and(no.sikt.graphitron.codereferences.conditions.QueryStaffCondition.email(_a_staff, _mi_staff.getInfo().getJobEmail().getEmail()))" + - ".orderBy" - ); - } - - @Test - @DisplayName("Condition on a field with an input type parameter") - void withInput() { - assertGeneratedContentContains("withInput", Set.of(DUMMY_INPUT), ".query(_a_customer, _mi_in.getId() != null ? _mi_in.getId() : null)"); - } - - @Test - @Disabled("Does not unwrap listed fields.") - @DisplayName("Condition on a field with a listed input type parameter") - void withListedInput() { - assertGeneratedContentContains("withListedInput", ".query(_a_customer, input.stream().map(_iv_it -> _iv_it.getId()).toList())"); - } - - @Test - @DisplayName("Condition on a field inside an input type") - void onFieldInInput() { - assertGeneratedContentContains("onFieldInInput", ".id(_a_customer, _mi_in.getId())"); - } - - @Test - @DisplayName("Condition on an enum parameter") - void onEnum() { - assertGeneratedContentContains( - "onEnum", Set.of(DUMMY_ENUM_CONVERTED), - ".enumInput(_a_customer, QueryHelper.makeEnumMap(_mi_enumInput," - ); - } - - @Test // Test that the mapping to the method is correct here, but enums generally are tested elsewhere, so the tests just use jOOQ enums otherwise. - @DisplayName("Condition on a schema-only enum parameter") - void onStringEnum() { - assertGeneratedContentContains( - "onStringEnum", Set.of(DUMMY_ENUM), - ".email(_a_customer, QueryHelper.makeEnumMap(_mi_enumInput," - ); - } - - @Test - @DisplayName("Condition on a listed enum parameter") - void onListedEnum() { - assertGeneratedContentContains( - "onListedEnum", Set.of(DUMMY_ENUM_CONVERTED), - ".enumInputList(_a_customer, QueryHelper.makeEnumMap(_mi_enumInputList," - ); - } - - @Test - @DisplayName("Condition on a field with an enum type parameter") - void onParamWithEnum() { - assertGeneratedContentContains( - "onParamWithEnum", Set.of(DUMMY_ENUM_CONVERTED), - ".queryEnum(_a_customer, QueryHelper.makeEnumMap(_mi_enumInput," - ); - } - - @Test - @DisplayName("Condition on a field with a listed enum type parameter") - void onParamWithListedEnum() { - assertGeneratedContentContains( - "onParamWithListedEnum", Set.of(DUMMY_ENUM_CONVERTED), - "queryEnumList(_a_customer, QueryHelper.makeEnumMap(_mi_enumInputList," - ); - } - - @Test - @DisplayName("Condition on a field with an enum type parameter inside an input type") - void onParamWithEnumInInput() { - assertGeneratedContentContains( - "onParamWithEnumInInput", Set.of(DUMMY_ENUM_CONVERTED), - ".queryEnum(_a_customer, QueryHelper.makeEnumMap(_mi_in.getE()," - ); - } - - @Test - @DisplayName("Condition on field returning single table interface") - void onSingleTableInterface() { - assertGeneratedContentContains("onFieldReturningSingleTableInterface", - ".and(_a_address.POSTAL_CODE.eq(_mi_filter.getPostalCode()", - ".and(no.sikt.graphitron.codereferences.conditions.QueryAddressInterfaceCondition.address(_a_address, _mi_filter.getPostalCode()" - ); - } - - @Test - @DisplayName("Condition on a capitalised parameter") - void onParamWithWrongCapitalisation() { - assertGeneratedContentContains( - "onParamWithWrongCapitalisation", - ", String _mi_sTRING,", - ".where(_a_customer.EMAIL.eq(_mi_sTRING))" + - ".and(no.sikt.graphitron.codereferences.conditions.QueryCustomerCondition.email(_a_customer, _mi_sTRING)).fetch" - ); - } - - @Test - @DisplayName("Condition on a capitalised input type parameter") - void onInputParamWithWrongCapitalisation() { - assertGeneratedContentContains( - "onInputParamWithWrongCapitalisation", Set.of(STAFF, NAME_INPUT), - ", NameInput _mi_nAME,", - "staff.FIRST_NAME.eq(_mi_nAME.getFirstname())", - "staff.LAST_NAME.eq(_mi_nAME.getLastname())", - ".name(_a_staff, _mi_nAME.getFirstname(), _mi_nAME.getLastname())" - ); - } - - @Test - @DisplayName("Condition referencing a context field on a parameter") - void onParamWithContextField() { - assertGeneratedContentContains( - "onParamWithContextField", - "email, String _cf_ctxField, SelectionSet", - "ContextCondition.email(_a_customer, _mi_email, _cf_ctxField)" - ); - } - - @Test - @DisplayName("Condition referencing a context field on a field") - void onFieldWithContextField() { - assertGeneratedContentContains( - "onFieldWithContextField", - "email, String _cf_ctxField, SelectionSet", - "ContextCondition.query(_a_customer, _mi_email, _cf_ctxField)" - ); - } - - @Test - @DisplayName("Condition referencing a context field on a field within an input type") - void onInputParamWithContextField() { - assertGeneratedContentContains( - "onInputParamWithContextField", - "In _mi_in, String _cf_ctxField, SelectionSet", - "ContextCondition.email(_a_customer, _mi_in != null ? _mi_in.getEmail() : null, _cf_ctxField)" - ); - } - - @Test - @DisplayName("Condition referencing two context fields on a parameter") - void onParamWithMultipleContextFields() { - assertGeneratedContentContains( - "onParamWithMultipleContextFields", - "email, String _cf_ctxField1, String _cf_ctxField2, SelectionSet", - "ContextCondition.email(_a_customer, _mi_email, _cf_ctxField1, _cf_ctxField2)" - ); - } - - @Test - @DisplayName("Two conditions each referencing context fields on parameters") - void onMultipleParamsWithContextFields() { - assertGeneratedContentContains( - "onMultipleParamsWithContextFields", - "email2, String _cf_ctxField1, String _cf_ctxField2, SelectionSet", - "ContextCondition.email(_a_customer, _mi_email1, _cf_ctxField1)", - "ContextCondition.email(_a_customer, _mi_email2, _cf_ctxField2)" - ); - } - - @Test - @DisplayName("Two conditions each referencing the same context field on parameters") - void onMultipleParamsWithSameContextField() { - assertGeneratedContentContains( - "onMultipleParamsWithSameContextField", - "email2, String _cf_ctxField, SelectionSet", - "ContextCondition.email(_a_customer, _mi_email1, _cf_ctxField)", - "ContextCondition.email(_a_customer, _mi_email2, _cf_ctxField)" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/CountTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/CountTest.java deleted file mode 100644 index 38d7462da3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/CountTest.java +++ /dev/null @@ -1,86 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.CountOnlyFetchDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("Query pagination - Count methods for paginated queries") -public class CountTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/fetch/count"; - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(CUSTOMER_CONNECTION); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new CountOnlyFetchDBClassGenerator(schema)); // Note that this reuses most of the code from normal queries. - } - - @Test - @DisplayName("Connection with no other fields") // TODO: No need to generate total count if the field does not exist in the connection. - void defaultCase() { - assertGeneratedContentMatches("default"); - } - - @Test - @DisplayName("TotalCount for nested paginated query") - void nestedCase() { - assertGeneratedContentMatches("nestedPaginatedQuery"); - } - - @Test - @DisplayName("Connection with an extra field") - void withOtherField() { - assertGeneratedContentContains("withOtherField", ", String _mi_email)", ".where(_a_customer.EMAIL.eq(_mi_email)"); - } - - @Test - @DisplayName("Connection on interface with discriminator (in same table)") - void singleTableInterface() { - assertGeneratedContentMatches("singleTableInterface"); - } - - @Test - @DisplayName("Connection on multitable interface") - void multiTableInterface() { - assertGeneratedContentMatches("multiTableInterface"); - } - - @Test - @DisplayName("Multitable connection outside query") - void multiTableInterfaceSplitQuery() { - assertGeneratedContentMatches("multiTableInterfaceSplitQuery", PERSON_WITH_EMAIL_CONNECTION); - } - - @Test - @DisplayName("Connection on multitable interface with an extra field") - void multiTableInterfaceWithOtherField() { - assertGeneratedContentContains("multiTableInterfaceWithOtherField", - ", String _mi_customerId){", - ".from(_a_paymentp2007_01).where(_a_paymentp2007_01.CUSTOMER_ID.eq(_mi_customerId))" - ); - } - - @Test - @DisplayName("Connection on union") - void unionCountTest() { - assertGeneratedContentContains("unionConnection", - Set.of(SOMEUNION_CONNECTION), - ".from(_a_paymentp2007_01)", - "from(_a_paymentp2007_02)"); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/DefaultOrderDirectiveTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/DefaultOrderDirectiveTest.java deleted file mode 100644 index 8a3232895f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/DefaultOrderDirectiveTest.java +++ /dev/null @@ -1,109 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.MapOnlyFetchDBClassGenerator; -import no.sikt.graphitron.validation.InvalidSchemaException; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.ORDER; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -@DisplayName("DefaultOrder - Queries with default ordering via @defaultOrder directive") -public class DefaultOrderDirectiveTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/fetch/defaultOrder/"; - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new MapOnlyFetchDBClassGenerator(schema)); - } - - @Test - @DisplayName("Default order with index - uses getSortFields instead of primary key") - void defaultOrder() { - assertGeneratedContentContains("default", "getSortFields(_a_customer, \"IDX_LAST_NAME\", \"ASC\")"); - } - - @Test - @DisplayName("Default order with DESC direction") - void defaultOrderWithDirection() { - assertGeneratedContentContains("withDirection", "getSortFields(_a_customer, \"IDX_LAST_NAME\", \"DESC\")"); - } - - @Test - @DisplayName("Paginated query with default order") - void paginatedWithDefaultOrder() { - assertGeneratedContentContains("paginated", - "_iv_orderFields = QueryHelper.getSortFields(_a_customer, \"IDX_LAST_NAME\", \"ASC\")", - ".orderBy(_iv_orderFields)", - "QueryHelper.getOrderByToken(_a_customer, _iv_orderFields)" - ); - } - - @Test - @DisplayName("Default order combined with @orderBy - orderBy fallback uses defaultOrder") - void defaultOrderWithOrderBy() { - // When orderBy input is null, should use defaultOrder index instead of primary key - assertGeneratedContentContains("withOrderBy", Set.of(ORDER), - """ - var _iv_orderFields = _mi_orderBy == null - ? QueryHelper.getSortFields(_a_customer, "IDX_LAST_NAME", "ASC") - : switch (_mi_orderBy.getOrderByField().toString()) { - """ - ); - } - - @Test - @DisplayName("Invalid index name should fail validation") - void invalidIndex() { - assertThatThrownBy(() -> generateFiles("invalidIndex", Set.of())) - .isInstanceOf(InvalidSchemaException.class) - .hasMessageContaining("has no index 'NONEXISTENT_INDEX'"); - } - - @Test - @DisplayName("Default order with fields - uses direct field references") - void withFields() { - assertGeneratedContentContains("withFields", - ".LAST_NAME.sort(SortOrder.DESC)"); - } - - @Test - @DisplayName("Default order with fields and collation") - void withFieldsAndCollation() { - assertGeneratedContentContains("withFieldsAndCollation", - ".LAST_NAME.collate(\"xdanish_ai\").sort(SortOrder.ASC)"); - } - - @Test - @DisplayName("Default order with primary key DESC") - void withPrimaryKey() { - assertGeneratedContentContains("withPrimaryKey", - "getPrimaryKey().getFieldsArray()", - "f.sort(SortOrder.DESC)"); - } - - @Test - @DisplayName("Default order with non-existent field should fail") - void withWrongField() { - assertThatThrownBy(() -> generateFiles("withWrongField", Set.of())) - .isInstanceOf(InvalidSchemaException.class) - .hasMessageContaining("has no field 'NONEXISTENT_FIELD'"); - } - - @Test - @DisplayName("Default order with both index and fields should fail") - void withBothIndexAndFields() { - assertThatThrownBy(() -> generateFiles("withBothIndexAndFields", Set.of())) - .isInstanceOf(InvalidSchemaException.class) - .hasMessageContaining("must have exactly one of index, fields, or primaryKey set"); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/EntityNodeIdInputTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/EntityNodeIdInputTest.java deleted file mode 100644 index f095e187ac..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/EntityNodeIdInputTest.java +++ /dev/null @@ -1,33 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.EntityOnlyFetchDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.FEDERATION_QUERY; - -@DisplayName("Node ID input - entity input fields with nodeId directive") -public class EntityNodeIdInputTest extends NodeIdDirectiveTest { - @Override - protected String getSubpath() { - return super.getSubpath() + "input"; - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new EntityOnlyFetchDBClassGenerator(schema)); - } - - @Test - @DisplayName("NodeId is handled correctly for entity representations input") - void inEntitiesQuery() { - assertGeneratedContentContains("inEntitiesQuery", Set.of(FEDERATION_QUERY), - ".where(_iv_nodeIdStrategy.hasIds(\"Customer\", _mi_representations_filtered.stream().map(_iv_it -> (String) _iv_it.get(\"id\")).filter(Objects::nonNull).toList(), _a_customer.CUSTOMER_ID)" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/EntityTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/EntityTest.java deleted file mode 100644 index c9a7d637c9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/EntityTest.java +++ /dev/null @@ -1,105 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.EntityOnlyFetchDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_TABLE; -import static no.sikt.graphitron.common.configuration.SchemaComponent.FEDERATION_QUERY; - -@DisplayName("Entity queries - Queries for fetching entity types") -public class EntityTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/fetch/entity"; - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(FEDERATION_QUERY); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new EntityOnlyFetchDBClassGenerator(schema)); - } - - @Test - @DisplayName("One entity exists with ID key") - void defaultCase() { - assertGeneratedContentContains( - "default", - "ctx, Set<Map<String, Object>> _mi_representations,", - """ - var _mi_representations_filtered = _mi_representations - .stream() - .filter(Objects::nonNull) - .filter(_iv_it -> "Customer".equals(_iv_it.get("__typename"))) - .toList(); - var _a_customer = CUSTOMER.as("customer_2168032777"); - return _iv_ctx - .select( - QueryHelper.rowOfMap(Map.entry("id", _a_customer.getId())), - customerFor_Entity_customer() - ) - .from(_a_customer) - .where(_a_customer.hasIds(_mi_representations_filtered.stream().map(_iv_it -> (String) _iv_it.get("id")).toList())) - .fetchMap(_iv_it -> { - var _iv_rep = new HashMap<String, Object>(); - _iv_rep.put("__typename", "Customer"); - _iv_rep.putAll(_iv_it.value1()); - return _iv_rep; - }, - _iv_it -> (_Entity) _iv_it.value2()); - """ - ); - } - - @Test - @DisplayName("No entities defined in schema") - void noEntities() { - assertNothingGenerated(Set.of(CUSTOMER_TABLE)); - } - - @Test - @DisplayName("Entity with two keys, one ID and one String") - void twoKeys() { - assertGeneratedContentContains( - "twoKeys", - "rowOfMap(Map.entry(\"id\", _a_customer.getId()), Map.entry(\"first\", _a_customer.FIRST_NAME))", - "where(_a_customer.hasIds(_mi_representations_filtered.stream().map(_iv_it -> (String) _iv_it.get(\"id\")).toList()))" + - ".or(_a_customer.FIRST_NAME.in(_mi_representations_filtered.stream().map(_iv_it -> _iv_it.get(\"first\")).toList()))" - ); - } - - @Test - @DisplayName("Entity with one compound key") - void compoundKey() { - assertGeneratedContentContains( - "compoundKey", - """ - .where( - DSL.and( - _a_customer.hasIds(_mi_representations_filtered.stream().map(_iv_it -> (String) _iv_it.get("id")).toList()), - _a_customer.FIRST_NAME.in(_mi_representations_filtered.stream().map(_iv_it -> _iv_it.get("first")).toList()) - ) - ) - """ - ); - } - - @Test - @DisplayName("Entity query with integer key") - void nonStringKey() { - assertGeneratedContentContains("nonStringKey", - "P_FILM_COUNT.in(_mi_representations_filtered.stream().map(_iv_it -> _iv_it.get(\"p_film_count\"))" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/EnumInputTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/EnumInputTest.java deleted file mode 100644 index cbb332449f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/EnumInputTest.java +++ /dev/null @@ -1,85 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.MapOnlyFetchDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.DUMMY_ENUM; -import static no.sikt.graphitron.common.configuration.SchemaComponent.DUMMY_ENUM_CONVERTED; - -@DisplayName("Query enums - Positioning of enums in query inputs") -public class EnumInputTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/fetch/enums"; - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new MapOnlyFetchDBClassGenerator(schema)); - } - - @Test - @DisplayName("Input JOOQ enum") - void inputJOOQ() { - assertGeneratedContentContains( - "input/jOOQ", Set.of(DUMMY_ENUM_CONVERTED), - ", DummyEnumConverted _mi_e,", - "e != null ? _a_film.RATING.convert(DummyEnumConverted.class,", - ".eq(_mi_e) : DSL.noCondition()" - ); - } - - @Test - @DisplayName("Input string enum") - void inputString() { - assertGeneratedContentContains( - "input/string", Set.of(DUMMY_ENUM), - ", DummyEnum _mi_e,", - "e != null ? _a_film.RATING.convert(DummyEnum.class,", - ".eq(_mi_e) : DSL.noCondition()" - ); - } - - @Test - @DisplayName("Input jOOQ record containing an enum") - void jOOQRecord() { - assertGeneratedContentContains( - "input/jOOQRecord", Set.of(DUMMY_ENUM_CONVERTED), - "inRecord.getRating() != null ? _a_film.RATING.eq(_mi_inRecord.getRating()) : DSL.noCondition()" - ); - } - - @Test - @DisplayName("Input jOOQ record containing a string enum") - void jOOQRecordString() { - assertGeneratedContentContains( - "input/jOOQRecordString", Set.of(DUMMY_ENUM), - "inRecord.getRating() != null ? _a_film.RATING.eq(_mi_inRecord.getRating()) : DSL.noCondition()" - ); - } - - @Test - @DisplayName("Listed input jOOQ record containing an enum") - void listedJOOQRecord() { - assertGeneratedContentContains( - "input/listedJOOQRecord", Set.of(DUMMY_ENUM_CONVERTED), - "inRecordList.get(_iv_it).getRating()) : _a_film.RATING)" - ); - } - - @Test - @DisplayName("Listed input jOOQ record containing an enum with additional schema layers") - void listedJOOQRecordNested() { - assertGeneratedContentContains( - "input/listedJOOQRecordNested", Set.of(DUMMY_ENUM_CONVERTED), - "DSL.val(_mi_inRecordList.get(_iv_it).getRating()) : _a_film.RATING)" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/EnumOutputTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/EnumOutputTest.java deleted file mode 100644 index de722f1e31..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/EnumOutputTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.QueryOnlyHelperDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.DUMMY_ENUM; -import static no.sikt.graphitron.common.configuration.SchemaComponent.DUMMY_ENUM_CONVERTED; - -@DisplayName("Query enums - Positioning of enums in query outputs") -public class EnumOutputTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/fetch/enums"; - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new QueryOnlyHelperDBClassGenerator(schema)); - } - - @Test - @DisplayName("Output JOOQ enum") - void outputJOOQ() { - assertGeneratedContentContains( - "output/jOOQ", Set.of(DUMMY_ENUM_CONVERTED), - "_a_film.RATING.convert(DummyEnumConverted.class," - ); - } - - @Test - @DisplayName("Output string enum") - void outputString() { - assertGeneratedContentContains( - "output/string", Set.of(DUMMY_ENUM), - "_a_film.RATING.convert(DummyEnum.class," - ); - } - - @Test - @DisplayName("Output JOOQ enum in subquery") - void outputJOOQSubquery() { - assertGeneratedContentContains( - "output/jOOQSubquery", Set.of(DUMMY_ENUM_CONVERTED), - "inventory_2972535350_film.RATING.convert(" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/FetchTableRecordTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/FetchTableRecordTest.java deleted file mode 100644 index bc50564478..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/FetchTableRecordTest.java +++ /dev/null @@ -1,60 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.FetchTableRecordOnlyDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_INPUT_TABLE; - -public class FetchTableRecordTest extends GeneratorTest { - - @Override - protected String getSubpath() { - return "queries/fetch/tableRecord"; - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(CUSTOMER_INPUT_TABLE); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new FetchTableRecordOnlyDBClassGenerator(schema)); - } - - @BeforeEach - void setUp() { - GeneratorConfig.setGenerateUpsertAsStore(true); - } - - @AfterEach - void tearDown() { - GeneratorConfig.setGenerateUpsertAsStore(false); - } - - @Test - @DisplayName("Default case") - void defaultCase() { - assertGeneratedContentMatches("default"); - } - - @Test - @DisplayName("When multiple UPSERT mutations exist, one record fetching method should be generated for each table") - void multipleTables() { - assertGeneratedContentContains("multipleTables", - " fetchAddressRecords(", - " fetchCustomerRecords(" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/InputTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/InputTest.java deleted file mode 100644 index 8040769c18..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/InputTest.java +++ /dev/null @@ -1,199 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.InterfaceOnlyFetchDBClassGenerator; -import no.sikt.graphitron.reducedgenerators.MapOnlyFetchDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("Query inputs - Equality, list and null checks for fields") -public class InputTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/fetch/inputs/required"; - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(CUSTOMER_TABLE); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new MapOnlyFetchDBClassGenerator(schema), new InterfaceOnlyFetchDBClassGenerator(schema)); - } - - @Test - @DisplayName("No input") - void defaultCase() { - assertGeneratedContentMatches("default"); - } - - @Test - @DisplayName("String field") - void string() { - assertGeneratedContentMatches("string"); // Check the placement, but just this once. - } - - @Test - @DisplayName("Scalar field found in extended scalars") - void scalar() { - assertGeneratedContentContains("scalar", ", LocalDate _mi_createdDate,", "customer.CREATE_DATE.eq(_mi_createdDate)"); - } - - @Test - @DisplayName("ID field") - void id() { - assertGeneratedContentContains("id", ", String _mi_id,", "customer.hasId(_mi_id)"); - } - - @Test - @DisplayName("ID field that is not the primary ID") - void idOther() { - assertGeneratedContentContains("idOther", "customer.hasAddressId(_mi_id)"); - } - - @Test - @DisplayName("Boolean field") - void booleanCase() { - assertGeneratedContentContains("boolean", ", Boolean _mi_bool,", "customer.ACTIVE.eq(_mi_bool)"); - } - - @Test - @DisplayName("Integer field") - void integer() { - assertGeneratedContentContains("integer", ", Integer _mi_length,", "film.LENGTH.eq(_mi_length)"); - } - - @Test - @DisplayName("Field with @field directive") - void fieldOverride() { - assertGeneratedContentContains("fieldOverride", ", String _mi_name,", "customer.FIRST_NAME.eq(_mi_name)"); - } - - @Test - @DisplayName("Two string fields") - void twoFields() { - assertGeneratedContentContains( - "twoFields", - ", String _mi_firstName, String _mi_lastName,", - "customer.FIRST_NAME.eq(_mi_firstName)", - "customer.LAST_NAME.eq(_mi_lastName)" - ); - } - - @Test - @DisplayName("Listed field") - void list() { - assertGeneratedContentContains( - "list", - ", List<String> _mi_email,", - "email.size() > 0 ? _a_customer.EMAIL.in(_mi_email) : DSL.noCondition()" - ); - } - - @Test // Special case methods for IDs. - @DisplayName("ID list field") - void idList() { - assertGeneratedContentContains("idList", ", List<String> _mi_id,", "customer.hasIds(_mi_id.stream().collect(Collectors.toSet()))"); - } - - @Test - @DisplayName("ID list field that is not the primary ID") - void idOtherList() { - assertGeneratedContentContains("idOtherList", "customer.hasAddressIds(_mi_id.stream().collect(Collectors.toSet()))"); - } - - @Test - @DisplayName("Input type field") - void input() { - assertGeneratedContentContains( - "input", - Set.of(DUMMY_INPUT), - ", DummyInput _mi_in,", - "_mi_in.getId() != null ? _a_customer.hasId(_mi_in.getId()) : DSL.noCondition()" - ); - } - - @Test - @DisplayName("Nested input field") - void nestedInput() { - assertGeneratedContentContains( - "nestedInput", - Set.of(DUMMY_INPUT), - ", Wrapper _mi_in,", - "_mi_in.getIn().getId() != null ? _a_customer.hasId(_mi_in.getIn().getId()) : DSL.noCondition()" - ); - } - - @Test - @DisplayName("Nested and then listed input field with two inner fields") - void nestedListedInputTwoFields() { - assertGeneratedContentContains( - "nestedListedInputTwoFields", - "customer.FIRST_NAME, _a_customer.LAST_NAME", - "DSL.val(_mi_in.getIn().get(_iv_it).getFirst()), DSL.val(_mi_in.getIn().get(_iv_it).getLast())" - ); - } - - @Test - @DisplayName("Three-level input type containing two other input types on the same level") - void multiLevelInput() { - assertGeneratedContentContains( - "multiLevelInput", Set.of(STAFF, NAME_INPUT), - ".where(_a_staff.FIRST_NAME.eq(_mi_staff.getInfo().getName().getFirstname()))" + - ".and(_a_staff.LAST_NAME.eq(_mi_staff.getInfo().getName().getLastname()))" + - ".and(_mi_staff.getInfo().getJobEmail().getEmail() != null ? _a_staff.EMAIL.eq(_mi_staff.getInfo().getJobEmail().getEmail()) : DSL.noCondition())" + - ".and(_a_staff.ACTIVE.eq(_mi_staff.getActive()))" + - ".orderBy" - ); - } - - @Test - @DisplayName("On field returning single table interface") - void onSingleTableInterface() { - assertGeneratedContentContains("onSingleTableInterface", - ", AddressInput _mi_filter", - ".and(_a_address.POSTAL_CODE.eq(_mi_filter.getPostalCode()))"); - } - - @Test - @DisplayName("SplitQuery field") - void onSplitQueryField() { - assertGeneratedContentContains("onSplitQueryField", - ".from(_a_address_223244161_customer).where(_a_address_223244161_customer.EMAIL.eq(_mi_email))", - ".from(_a_address).where(DSL.row(_a_address.ADDRESS_ID).in(_rk_address.stream().map(_iv_it -> _iv_it.key().valuesRow()).toList())).fetch" // Make sure condition is not applied on outer query - ); - } - - @Test - @DisplayName("Wrapper type that also has input table parameter") - void wrappedTypeWithInputTable() { - assertGeneratedContentContains( - "inputTable", - // Main method signature includes input record parameter - "public static FilmContainer filmWrappedWithInputTableAndTableFieldForQuery(DSLContext _iv_ctx,\n" + - " FilmRecord _mi_inputRecord, SelectionSet _iv_select)", - // Helper method signature receives input record parameter - "private static SelectField<FilmContainer> filmWrappedWithInputTableAndTableFieldForQuery_filmContainer(\n" + - " FilmRecord _mi_inputRecord)", - // Nested helper method at depth 1 - "private static SelectField<Language> _1_filmWrappedWithInputTableAndTableFieldForQuery_filmContainer_language()", - // Main method calls helper with input record parameter - ".select(filmWrappedWithInputTableAndTableFieldForQuery_filmContainer(_mi_inputRecord))", - // Helper declares necessary aliases - "var _a_film = FILM.as(\"film_2185543202\");", - "var _a_film_2185543202_filmlanguageidfkey = _a_film.filmLanguageIdFkey().as(\"language_4253626089\");", - // Helper calls nested helper - "DSL.select(_1_filmWrappedWithInputTableAndTableFieldForQuery_filmContainer_language())" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/InterfaceTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/InterfaceTest.java deleted file mode 100644 index 2e063a86b8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/InterfaceTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.InterfaceOnlyFetchDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.QUERY_FETCH_PAYMENT_INTERFACE_CONDITION; -import static no.sikt.graphitron.common.configuration.ReferencedEntry.REFERENCE_CUSTOMER_CONDITION; - -@DisplayName("Query interfaces - Interface handling for types implementing interfaces") -public class InterfaceTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/fetch/interfaces/"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(REFERENCE_CUSTOMER_CONDITION, QUERY_FETCH_PAYMENT_INTERFACE_CONDITION); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new InterfaceOnlyFetchDBClassGenerator(schema)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/LookupTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/LookupTest.java deleted file mode 100644 index 997d6741e5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/LookupTest.java +++ /dev/null @@ -1,76 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.MapOnlyFetchDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_TABLE; - -@DisplayName("Lookup Queries - Queries using lookup keys") -public class LookupTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/fetch/lookup"; - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(CUSTOMER_TABLE); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new MapOnlyFetchDBClassGenerator(schema)); - } - - @Test - @DisplayName("One key") - void defaultCase() { - assertGeneratedContentMatches("default"); - } - - @Test - @DisplayName("Key other than an ID") - void nonIDKey() { - assertGeneratedContentContains("nonIDKey", ",List<Integer> _mi_integer,", ".select(_a_film.LENGTH.cast(String.class),"); - } - - @Test - @DisplayName("Multiple keys") - void manyKeys() { - assertGeneratedContentContains( - "manyKeys", - ",List<String> _mi_firstName,List<String> _mi_lastName,", - ".select(DSL.concat(DSL.inlined(_a_customer.FIRST_NAME), DSL.inline(\",\"), DSL.inlined(_a_customer.LAST_NAME))," - ); - } - - @Test - @DisplayName("One key and one non-key field") - void otherNonKeyField() { - assertGeneratedContentContains( - "otherNonKeyField", - ",List<String> _mi_firstName,List<String> _mi_lastName,", - ".select(_a_customer.FIRST_NAME," - ); - } - - @Test - @DisplayName("Key inside listed input type") - void inputKey() { - assertGeneratedContentContains("inputKey", ",List<Input> _mi_in,", ".select(_a_customer.getId(),"); - } - - @Test - @DisplayName("Key listed inside input type") - void listedKeyInInput() { - assertGeneratedContentContains("listedKeyInInput", ", Input _mi_in,", ".select(_a_customer.getId(),"); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/MultitableInterfaceTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/MultitableInterfaceTest.java deleted file mode 100644 index 11e8637224..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/MultitableInterfaceTest.java +++ /dev/null @@ -1,186 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("Multi-table interfaces - Queries") -public class MultitableInterfaceTest extends InterfaceTest { - - // Disabled until GGG-104 - @Override - protected boolean validateSchema() { - return false; - } - - @Override - protected String getSubpath() { - return super.getSubpath() + "/multitableInterface"; - } - - @Test - @DisplayName("Default case") - void defaultCase() { - assertGeneratedContentMatches("default"); - } - - @Test - @DisplayName("No implementations") - void noImplementations() { - assertGeneratedContentContains("noImplementations", ", SelectionSet _iv_select) {return null;}"); - } - - @Test - @DisplayName("One implementation") - void oneImplementation() { - assertGeneratedContentMatches("oneImplementation"); - } - - @Test - @DisplayName("Two implementations") - void twoImplementations() { - assertGeneratedContentMatches("twoImplementations"); - } - - @Test - @DisplayName("Multiple implementations") - void multipleImplementations() { - assertGeneratedContentContains( - "multipleImplementations", - "citySortFieldsForSomeInterface().unionAll(customerSortFieldsForSomeInterface().unionAll(addressSortFieldsForSomeInterface()))", - "address.field(\"$data\")," + - "_sjs_customer.field(\"$data\")," + - "_sjs_city.field(\"$data\")", - "case \"Address\" -> (SomeInterface) _iv_e1", - "case \"Customer\" -> (SomeInterface) _iv_e2", - "case \"City\" -> (SomeInterface) _iv_e3" - ); - } - - @Test - @DisplayName("Interface with a reference to a type") - void interfaceWithType() { - assertGeneratedContentContains( - "interfaceWithType", - Set.of(CUSTOMER_TABLE), - "payment_1831371789_customer = _a_payment.customer()", - ".from(_a_payment_1831371789_customer", - "CustomerTable::new" - ); - } - - @Test - @Disabled("Disabled until alwaysUsePrimaryKeyInSplitQueries-property is removed.") - @DisplayName("Interface with type reference with splitQuery should have reference key fields in subquery") - void interfaceWithTypeSplitQuery() { - assertGeneratedContentContains( - "interfaceWithTypeSplitQuery", - Set.of(CUSTOMER_TABLE), - "row(DSL.row(_a_payment.CUSTOMER_ID), _a_payment.getId()).mapping" - ); - } - - @Test - @DisplayName("Interface with type reference with splitQuery should have resolver key in subquery") - void interfaceWithTypeSplitQueryOnlyPrimaryKey() { - assertGeneratedContentContains( - "interfaceWithTypeSplitQuery", - Set.of(CUSTOMER_TABLE), - """ - row(DSL.row( - _a_payment.PAYMENT_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_payment.PAYMENT_ID))), - _a_payment.getId() - ).mapping - """ - ); - } - - @Test - @DisplayName("Listed without pagination") - void listed() { - assertGeneratedContentMatches("listed"); - } - - @Test - @DisplayName("Input on multitable interface") - void withInput() { - assertGeneratedContentMatches("withInput"); - } - - @Test - @DisplayName("Paginated") - void paginated() { - assertGeneratedContentMatches("paginated"); - } - - @Test - @DisplayName("Paginated with input") - void paginatedWithInput() { - assertGeneratedContentContains("paginatedWithInput", - "SortFieldsForPayments(_iv_pageSize, _iv_token, _mi_customerId).union", - ".where(_mi_customerId != null ? _a_paymentp2007_02.CUSTOMER_ID.eq(_mi_customerId) : DSL.noCondition()).and(_iv_token" - ); - } - - @Test - @DisplayName("Multiple inputs on multitable interface") - void withMultipleInputs() { - assertGeneratedContentContains("withMultipleInputs", - "paymenttypetwoSortFieldsForPayments(_mi_customerId, _mi_staff)" + - ".unionAll(paymenttypeoneSortFieldsForPayments(_mi_customerId, _mi_staff))", - "SortFieldsForPayments(String _mi_customerId, PaymentStaffInput _mi_staff)", - ".where(_mi_customerId != null ? _a_paymentp2007_01.", - ".and(_a_paymentp2007_01.STAFF_ID.eq(_mi_staff.getStaffId()))" - ); - } - - @Test - @DisplayName("Condition on multi table interface") - void withQueryCondition() { - assertGeneratedContentContains("withQueryCondition", - ".from(_a_paymentp2007_01).where(no.sikt.", - ".from(_a_paymentp2007_02).where(no.sikt." - ); - } - - @Test - @DisplayName("Condition on input on multi table interface") - void withInputCondition() { - assertGeneratedContentContains("withInputCondition", - ".from(_a_paymentp2007_01).where(_mi_customerId", - ": DSL.noCondition()).and(no.sikt", - "QueryPaymentInterfaceCondition.payments(_a_paymentp2007_01, _mi_customerId)" - ); - } - - @Test - @DisplayName("Multitable interface in splitQuery field") - void splitQuery() { - assertGeneratedContentMatches("splitQuery", PERSON_WITH_EMAIL); - } - - @Test - @DisplayName("Listed multitable interface in splitQuery field") - void listedInSplitQuery() { - assertGeneratedContentMatches("splitQueryListed", PERSON_WITH_EMAIL); - } - - @Test - @DisplayName("Paginated multitable interface in splitQuery field") - void paginatedInSplitQuery() { - assertGeneratedContentMatches("splitQueryPaginated", PERSON_WITH_EMAIL_CONNECTION); - } - - @Test - @DisplayName("Multitable interface in splitQuery field with input") - void splitQueryWithInput() { - assertGeneratedContentContains("splitQueryWithInput", Set.of(PERSON_WITH_EMAIL_CONNECTION), - ".from(_a_payment_1831371789_customer).where(_a_payment_1831371789_customer.EMAIL.eq(_mi_email))", - ".from(_a_payment).where(DSL.row(_a_payment.PAYMENT_ID).in(_rk_payment.stream().map(_iv_it -> _iv_it.key().valuesRow()).toList())).fetch" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/MultitableReferenceTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/MultitableReferenceTest.java deleted file mode 100644 index c5281ad6e6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/MultitableReferenceTest.java +++ /dev/null @@ -1,99 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.UnionOnlyFetchDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.PERSON_WITH_EMAIL; - -@DisplayName("Multi-table references - Queries") -public class MultitableReferenceTest extends ReferenceTest { - - @Override - protected String getSubpath() { - return super.getSubpath() + "/multitable"; - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new UnionOnlyFetchDBClassGenerator(schema)); - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(PERSON_WITH_EMAIL); - } - - @Test - @DisplayName("On multitable interface with all implicit references") - void multitableInterface() { - assertGeneratedContentContains("multitableInterface", - ".from(_a_payment_1831371789_customer).orderBy", - ".from(_a_payment_1831371789_staff).orderBy" - ); - } - - @Test - @DisplayName("On union with all implicit references") - void union() { - assertGeneratedContentContains("union", - ".from(_a_payment_1831371789_customer).orderBy", - ".from(_a_payment_1831371789_staff).orderBy" - ); - } - - @Test - @DisplayName("All implementations have their reference path specified") - void allSpecified() { - assertGeneratedContentContains("allSpecified", - ".from(_a_payment_1831371789_customer).orderBy", - ".from(_a_payment_1831371789_staff).orderBy" - ); - } - - @Test - @DisplayName("One implicit reference in multitable reference directive") - void oneImplicit() { - assertGeneratedContentContains("oneImplicit", - ".from(_a_payment_1831371789_customer).orderBy", - ".from(_a_payment_1831371789_staff).orderBy" - ); - } - - @Test - @DisplayName("Reference path starting with condition and no key") - void conditionReference() { - assertGeneratedContentContains("conditionReference", - "payment = PAYMENT.as(\"p", // Outer alias - "payment_for_staff = PAYMENT.as(\"p", // Inner alias (in sort fields method) - ".from(_a_payment_for_staff).join(_a_payment_for_staff_paymentstaff_staff).on(no", - "paymentStaff(_a_payment_for_staff, _a_payment_for_staff_paymentstaff_staff))" + - ".where(_a_payment.PAYMENT_ID.eq(_a_payment_for_staff.PAYMENT_ID))" - ); - } - - @Test - @DisplayName("Reference path starting with key and condition") - void conditionReferenceWithKey() { - assertGeneratedContentContains("conditionReferenceWithKey", - ".from(_a_payment_1831371789_staff).where(no.", - "paymentStaff(_a_payment, _a_payment_1831371789_staff)" - ); - } - - @Test - @DisplayName("With condition reference after key") - void conditionReferenceAfterKey() { - assertGeneratedContentContains("conditionReferenceAfterKey", - "rental_370786941_payment_paymentstaff_staff = STAFF", - ".from(_a_rental_370786941_payment).join(_a_rental_370786941_payment_paymentstaff_staff).on(no.", - "paymentStaff(_a_rental_370786941_payment, _a_rental_370786941_payment_paymentstaff_staff)" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/NodeDirectiveTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/NodeDirectiveTest.java deleted file mode 100644 index 61570a6e68..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/NodeDirectiveTest.java +++ /dev/null @@ -1,150 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.InterfaceOnlyFetchDBClassGenerator; -import no.sikt.graphitron.reducedgenerators.MapOnlyFetchDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -public class NodeDirectiveTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/fetch/nodeDirective"; - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(NODE); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new InterfaceOnlyFetchDBClassGenerator(schema), new MapOnlyFetchDBClassGenerator(schema)); - } - - @BeforeAll - static void setUp() { - GeneratorConfig.setNodeStrategy(true); - } - - @AfterAll - static void tearDown() { - GeneratorConfig.setNodeStrategy(false); - } - - @Test - @DisplayName("Default case") - void defaultCase() { - assertGeneratedContentContains( - "root/default", Set.of(CUSTOMER_QUERY), - "queryForQuery_customer(_iv_nodeIdStrategy)", - "row(_iv_nodeIdStrategy.createId(\"Customer\", _a_customer.CUSTOMER_ID)).mapping", - "SelectField<Customer> queryForQuery_customer(NodeIdStrategy _iv_nodeIdStrategy)" - ); - } - - @Test - @DisplayName("ID in nested query") - void nested() { - assertGeneratedContentContains( - "root/nested", Set.of(CUSTOMER_QUERY), - "createId(\"Address\", _a_customer_2168032777_address.ADDRESS_ID))" + - ".mapping(Functions.nullOnAllNull(Address" - ); - } - - @Test - @DisplayName("With ID using custom type ID") - void customTypeId() { - assertGeneratedContentContains( - "root/customTypeId", Set.of(CUSTOMER_QUERY), - ".createId(\"C\", _a_customer.CUSTOMER_ID)" - ); - } - - @Test - @DisplayName("With ID using custom key columns") - void customKeyColumns() { - assertGeneratedContentContains( - "root/customKeyColumns", Set.of(CUSTOMER_QUERY), - ".createId(\"Customer\", _a_customer.CUSTOMER_ID, _a_customer.EMAIL)).mapping" - ); - } - - @Test - @DisplayName("With custom key columns with wrong case") - void customKeyColumnsWrongCase() { - assertGeneratedContentContains( - "root/customKeyColumnsWrongCase", Set.of(CUSTOMER_QUERY), - ".createId(\"Customer\", _a_customer.CUSTOMER_ID, _a_customer.EMAIL)).mapping" - ); - } - - @Test - @DisplayName("Default ID in splitQuery") - void splitQuery() { - assertGeneratedContentContains( - "splitQuery/default", - "DSL.row(_iv_nodeIdStrategy.createId(\"Customer\", _a_address_2" - ); - } - - @Test - @DisplayName("ID with custom type ID in splitQuery") - void customTypeIdInSplitQuery() { - assertGeneratedContentContains( - "splitQuery/customTypeId", - "DSL.row(_iv_nodeIdStrategy.createId(\"C\", _a_address_2" - ); - } - - @Test - @DisplayName("ID using custom key columns in splitQuery") - void customKeyColumnsInSplitQuery() { - assertGeneratedContentContains( - "splitQuery/customKeyColumns", - "DSL.row(_iv_nodeIdStrategy.createId(\"Address\", _a_customer_2168032777_address.ADDRESS_ID)).mapping" - ); - } - - @Test - @DisplayName("Default ID in Node query") - void nodeQuery() { - assertGeneratedContentContains( - "nodeQuery/default", Set.of(NODE_QUERY), - "nodeIdStrategy.createId(\"Customer\", _a_customer.CUSTOMER_ID), customerForNode_customer(_iv_nodeIdStrategy)", - ".where(_iv_nodeIdStrategy.hasIds(\"Customer\", _mi_id, _a_customer.CUSTOMER_ID))" - ); - } - - @Test - @DisplayName("ID with custom type ID in Node query") - void customTypeIdInNodeQuery() { - assertGeneratedContentContains( - "nodeQuery/customTypeId", Set.of(NODE_QUERY), - "createId(\"C\", _a_customer.CUSTOMER_ID)", - ".where(_iv_nodeIdStrategy.hasIds(\"C\", _mi_id, _a_customer.CUSTOMER_ID)" - ); - } - - @Test - @DisplayName("ID with custom key columns in Node query") - void customKeyColumnsInNodeQuery() { - assertGeneratedContentContains( - "nodeQuery/customKeyColumns", Set.of(NODE_QUERY), - "nodeIdStrategy.createId(\"Customer\", _a_customer.CUSTOMER_ID, _a_customer.EMAIL), customerForNode_customer(_iv_nodeIdStrategy)", - ".where(_iv_nodeIdStrategy.hasIds(\"Customer\", _mi_id, _a_customer.CUSTOMER_ID, _a_customer.EMAIL))" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/NodeIdConditionTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/NodeIdConditionTest.java deleted file mode 100644 index 9f01a7147f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/NodeIdConditionTest.java +++ /dev/null @@ -1,87 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.InterfaceOnlyFetchDBClassGenerator; -import no.sikt.graphitron.reducedgenerators.MapOnlyFetchDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.QUERY_FETCH_CONDITION; - -@DisplayName("Fetch query conditions on nodeId fields") -public class NodeIdConditionTest extends NodeIdDirectiveTest { - - @Override - protected String getSubpath() { - return "queries/fetch/conditions"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(QUERY_FETCH_CONDITION); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new MapOnlyFetchDBClassGenerator(schema), new InterfaceOnlyFetchDBClassGenerator(schema)); - } - - @Test - @DisplayName("Node ID parameter is decoded to TableRecord when condition method expects TableRecord") - void onNodeIdParam() { - assertGeneratedContentContains( - "onNodeIdParam", - ".queryCustomerNodeId(_a_customer, _iv_nodeIdStrategy.nodeIdToTableRecord(_mi_customerId, \"C\", List.of(CUSTOMER.CUSTOMER_ID))))" - ); - } - - @Test - @DisplayName("Node ID parameter is passed as String when condition method expects String") - void onNodeIdParamAsString() { - assertGeneratedContentContains( - "onNodeIdParamAsString", - ".queryCustomerNodeIdAsString(_a_customer, _mi_customerId)" - ); - } - - @Test - @DisplayName("Listed Node ID parameter is decoded to TableRecords when condition method expects List<TableRecord>") - void onListedNodeIdParam() { - assertGeneratedContentContains( - "onListedNodeIdParam", - ".queryCustomerNodeIds(_a_customer, _mi_customerIds.stream().map(_iv_it -> _iv_nodeIdStrategy.nodeIdToTableRecord(_iv_it, \"C\", List.of(CUSTOMER.CUSTOMER_ID))).toList())" - ); - } - - @Test - @DisplayName("Listed Node ID parameter is passed as Strings when condition method expects List<String>") - void onListedNodeIdParamAsString() { - assertGeneratedContentContains( - "onListedNodeIdParamAsString", - ".queryCustomerNodeIdsAsString(_a_customer, _mi_customerIds)" - ); - } - - @Test - @DisplayName("Nested node ID parameter is decoded to TableRecord when condition method expects TableRecord") - void onNestedNodeIdParam() { - assertGeneratedContentContains( - "onNestedNodeIdParam", - ".queryCustomerNodeId(_a_customer, _iv_nodeIdStrategy.nodeIdToTableRecord(" - ); - } - - @Test - @DisplayName("Nested node ID parameter is decoded to TableRecord and other input fields are passed through unchanged") - void onNestedNodeIdParamWithOtherField() { - assertGeneratedContentContains( - "onNestedNodeIdParamWithOtherField", - ".queryCustomerIdAndNodeId(_a_customer, _mi_filter.getCustomerId(), _iv_nodeIdStrategy.nodeIdToTableRecord(" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/NodeIdDirectiveTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/NodeIdDirectiveTest.java deleted file mode 100644 index edb1b3962c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/NodeIdDirectiveTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.InterfaceOnlyFetchDBClassGenerator; -import no.sikt.graphitron.reducedgenerators.MapOnlyFetchDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.NODE; - -public class NodeIdDirectiveTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/fetch/nodeId/"; - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(NODE); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new InterfaceOnlyFetchDBClassGenerator(schema), new MapOnlyFetchDBClassGenerator(schema)); - } - - @BeforeAll - static void setUp() { - GeneratorConfig.setNodeStrategy(true); - } - - @AfterAll - static void tearDown() { - GeneratorConfig.setNodeStrategy(false); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/NodeIdInputTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/NodeIdInputTest.java deleted file mode 100644 index c5df5e51d6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/NodeIdInputTest.java +++ /dev/null @@ -1,236 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.DUMMY_RECORD; -import static no.sikt.graphitron.common.configuration.ReferencedEntry.JAVA_RECORD_CUSTOMER; -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_NODE; -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_NODE_INPUT_TABLE; - -@DisplayName("Node ID input - input fields with nodeId directive") -public class NodeIdInputTest extends NodeIdDirectiveTest { - @Override - protected String getSubpath() { - return super.getSubpath() + "input"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(DUMMY_RECORD, JAVA_RECORD_CUSTOMER); - } - - @Test - @DisplayName("Default case") - void defaultCase() { - assertGeneratedContentContains("default", - ".where(_iv_nodeIdStrategy.hasId(\"Customer\", _mi_customerId, _a_customer.CUSTOMER_ID))" - ); - } - - @Test - @DisplayName("As lookup key") - void lookupKey() { - assertGeneratedContentContains("lookupKey", - "nodeIdStrategy.createId(\"C\", _a_customer.CUSTOMER_ID), queryForQuery_customer(", - ".where(_mi_customerId.size() > 0 ? _iv_nodeIdStrategy.hasIds" - ); - } - - @Test - @DisplayName("With reference") - void reference() { - assertGeneratedContentContains("reference", - "where(_iv_nodeIdStrategy.hasId(\"Address\", _mi_addressId, _a_customer_2168032777_address_left" - ); - } - - @Test - @DisplayName("With reference via table") - void referenceViaTable() { - assertGeneratedContentContains("referenceViaTable", - ".where(_iv_nodeIdStrategy.hasId(\"City\", _mi_cityId, _a_address_2138977089_city_left" - ); - } - - @Test - @DisplayName("With implicit reference from typeName in @nodeId") - void implicitReference() { - assertGeneratedContentContains("implicitReference", - "where(_iv_nodeIdStrategy.hasId(\"Address\", _mi_addressId, _a_customer_2168032777_address_left", - ".leftJoin(_a_customer_2168032777_address_left)" - ); - } - - @Test - @DisplayName("With self-reference") - void selfReference() { - assertGeneratedContentContains("selfReference", - ".where(_iv_nodeIdStrategy.hasId(\"Film\", _mi_sequelId, _a_film_2185543202_film_left.FILM_ID))" - ); - } - - - @Test - @DisplayName("In input type") - void inputType() { - assertGeneratedContentContains("inputType", - ".where(_iv_nodeIdStrategy.hasId(\"Customer\", _mi_filter.getCustomerId(), _a_customer.CUSTOMER_ID))" - ); - } - - @Test - @DisplayName("In jOOQ record input type without nodeId directive") - void implicitInputType() { - assertGeneratedContentContains("implicitInputType", Set.of(CUSTOMER_NODE), - "nodeIdStrategy.hasId(\"CustomerNode\", _mi_filterRecordList.get(_iv_it), _a_customer.CUSTOMER_ID)" - ); - } - - @Test - @DisplayName("In jOOQ record input") - void jooqRecord() { - assertGeneratedContentContains("jooqRecord", Set.of(CUSTOMER_NODE), - ".where(_iv_nodeIdStrategy.hasId(\"CustomerNode\", _mi_filterRecord, _a_customer.CUSTOMER_ID)" - ); - } - - @Test - @DisplayName("Key reference in jOOQ record input") - void jooqRecordReferenceKey() { - assertGeneratedContentContains("jooqRecordReferenceKey", Set.of(CUSTOMER_NODE), - ".where(_iv_nodeIdStrategy.hasId(\"Language\", _mi_filterRecord, _a_film.ORIGINAL_LANGUAGE_ID)", - ".from(_a_film).where" // make sure there's no join - ); - } - - @Test - @DisplayName("Reference in jOOQ record input with custom node ID") - void jooqRecordReferenceWithCustomId() { - assertGeneratedContentContains("jooqRecordReferenceWithCustomId", Set.of(CUSTOMER_NODE), - ".where(_iv_nodeIdStrategy.hasId(\"A\", _mi_filterRecord, _a_customer.ADDRESS_ID)" - ); - } - - @Test - @DisplayName("Reference with FK fields having different order from target node ID") - void jooqRecordReferenceWithCustomFieldOrder() { - assertGeneratedContentContains("jooqRecordReferenceWithCustomFieldOrder", Set.of(CUSTOMER_NODE), - ".where(_iv_nodeIdStrategy.hasId(\"A\", _mi_filterRecord, _a_filmactor.ACTOR_LAST_NAME, _a_filmactor.ACTOR_ID)", - ".from(_a_filmactor).where" - ); - } - - @Test - @DisplayName("Table reference in jOOQ record input") - void jooqRecordReferenceTable() { - assertGeneratedContentContains("jooqRecordReferenceTable", Set.of(CUSTOMER_NODE), - ".where(_iv_nodeIdStrategy.hasId(\"Address\", _mi_filterRecord, _a_customer.ADDRESS_ID" - ); - } - - @Test - @DisplayName("Optional reference in jOOQ record should have no null checks") - void jooqRecordReferenceOptional() { - assertGeneratedContentContains("jooqRecordReferenceOptional", Set.of(CUSTOMER_NODE), - "where(_iv_nodeIdStrategy", - "customer.ADDRESS_ID)).fetch" - ); - } - - @Test - @DisplayName("In java record input") - void javaRecord() { - assertGeneratedContentContains("javaRecord", Set.of(CUSTOMER_NODE), - ".where(_iv_nodeIdStrategy.hasId(\"CustomerNode\", _mi_inRecord.getId(), _a_customer.CUSTOMER_ID)" - ); - } - - @Test - @DisplayName("Optional in java record input should not skip null checks") - void javaRecordOptional() { - assertGeneratedContentContains("javaRecordOptional", Set.of(CUSTOMER_NODE), - "where(_mi_inRecord.getId() != null ? _iv_nodeIdStrategy" - ); - } - - @Test - @DisplayName("Node ID reference in java record input") - void javaRecordReference() { - assertGeneratedContentContains("javaRecordReference", Set.of(CUSTOMER_NODE), - ".leftJoin(_a_customer_2168032777_address_left)", - ".where(_iv_nodeIdStrategy.hasId(\"Address\", _mi_inRecord.getAddressId(), _a_customer_2168032777_address_left.ADDRESS_ID)" - ); - } - - @Test - @DisplayName("A query returns a type without a table set") - void typeWithoutTable() { - assertGeneratedContentContains( - "typeWithoutTable", Set.of(CUSTOMER_NODE, CUSTOMER_NODE_INPUT_TABLE), - "return DSL.row(_iv_nodeIdStrategy.createId(\"CustomerNode\", _a_customer.CUSTOMER_ID))" + - ".mapping(Functions.nullOnAllNull(CustomerNoTable::new));", - "queryForQuery_customerNoTable(_iv_nodeIdStrategy, _mi_inRecord)).from(_a_customer).where(_iv_nodeIdStrategy.hasId(\"CustomerNode\"" - ); - } - - @Test - @DisplayName("Listed input jOOQ records") - void listedInputJOOQRecord() { - assertGeneratedContentContains( - "listedInputJOOQRecord", Set.of(CUSTOMER_NODE, CUSTOMER_NODE_INPUT_TABLE), - "nodeIdStrategy.hasId(\"CustomerNode\", _mi_inRecordList.get(_iv_it), _a_customer.CUSTOMER_ID)" - ); - } - - @Test - @DisplayName("Node ID input on another table object with same table as node type") - void asInputOnAnotherTableObjectWithSameTable() { - assertGeneratedContentContains("asInputOnAnotherTableObjectWithSameTable", - ".from(_a_customer).where(_iv_nodeIdStrategy.hasId(\"C\", _mi_in, _a_customer.CUSTOMER_ID)" - ); - } - - @Test - @DisplayName("Strategy appears before method inputs") - void strategyOrderingInSubqueries() { // Uses tableMethod to make sure input is propagated to the lowest level. - assertGeneratedContentContains("strategyOrderingInSubqueries", - "queryForQuery_customer(_iv_nodeIdStrategy,", - "queryForQuery_customer(NodeIdStrategy _iv_nodeIdStrategy,", - "queryForQuery_customer_address(_iv_nodeIdStrategy, ", - "queryForQuery_customer_address(NodeIdStrategy _iv_nodeIdStrategy," - - ); - } - - @Test - @DisplayName("With reference to table where target has self-referencing FK") - void referencingTableWithSelfReference() { - assertGeneratedContentContains( - "referencingTableWithSelfReference", - ".hasId(\"Film\", _mi_filmId, _a_filmactor_3175015397_film_left.FILM_ID)" - ); - - resultDoesNotContain( - "referencingTableWithSelfReference", - "_a_filmactor_3175015397_film_left.film()" - ); - } - - @Test - @DisplayName("Reverse key path to table with self-referencing FK") - void referencingTableWithSelfReferenceReverse() { - assertGeneratedContentContains( - "referencingTableWithSelfReferenceReverse", - "selectOne().from(_a_language_3571151285_filmlanguageidfkey_left)" - ); - - resultDoesNotContain( - "referencingTableWithSelfReferenceReverse", - ".film()" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/NodeIdOutputTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/NodeIdOutputTest.java deleted file mode 100644 index b0c1e69513..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/NodeIdOutputTest.java +++ /dev/null @@ -1,115 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("Node ID output - fields with nodeId directive as output") -public class NodeIdOutputTest extends NodeIdDirectiveTest { - @Override - protected String getSubpath() { - return super.getSubpath() + "output"; - } - - @Test - @DisplayName("Default case") - void defaultCase() { - assertGeneratedContentContains("default", Set.of(CUSTOMER_QUERY), - "row(_iv_nodeIdStrategy.createId(\"Customer\", _a_customer.CUSTOMER_ID)).mapping" - ); - } - - @Test - @DisplayName("With reference") - void reference() { - assertGeneratedContentContains("reference", Set.of(CUSTOMER_QUERY), - "field(DSL.select(_iv_nodeIdStrategy.createId(\"Address\", _a_customer_2168032777_address.ADDRESS_ID)" - ); - } - - @Test - @DisplayName("With reference and where statement") - void referenceAndInput() { - assertGeneratedContentContains("referenceAndInput", Set.of(CUSTOMER_NODE), - "\"CustomerNode\", _a_customer.CUSTOMER_ID)).mapping(Functions.nullOnAllNull(CustomerNoTable", - "queryForQuery_customerNoTable(_iv_nodeIdStrategy, _mi_inRecord)).from(_a_customer).where(_a_customer.FIRST_NAME.eq(_mi_inRecord.getFirstName()))" - ); - } - - @Test - @DisplayName("With reference via table") - void referenceViaTable() { - assertGeneratedContentContains("referenceViaTable", Set.of(CUSTOMER_QUERY), - "field(DSL.select(_iv_nodeIdStrategy.createId(\"City\", _a_address_2138977089_city.CITY_ID)" - ); - } - - @Test - @DisplayName("With implicit reference from typeName in @nodeId") - void implicitReference() { - assertGeneratedContentContains("implicitReference", Set.of(CUSTOMER_QUERY), - "field(DSL.select(_iv_nodeIdStrategy.createId(\"Address\", _a_customer_2168032777_address.ADDRESS_ID)" - ); - } - - @Test - @DisplayName("With condition reference") - void conditionReference() { - assertGeneratedContentContains("conditionReference", Set.of(CUSTOMER_QUERY), - ".from(_a_customer_addressid).join(_a_customer_addressid_addressid_address).on(no.", - "createId(\"Address\", _a_customer_addressid_addressid_address.ADDRESS_ID)" - ); - } - - @Test - @DisplayName("With condition reference and key") - void conditionReferenceWithKey() { - assertGeneratedContentContains("conditionReferenceWithKey", Set.of(CUSTOMER_QUERY), - "createId(\"Address\", _a_customer_2168032777_address.ADDRESS_ID)" - ); - } - - @Test - @DisplayName("With self-reference") - void selfReference() { - assertGeneratedContentContains("selfReference", - "createId(\"Film\", _a_film_2185543202_film.FILM_ID)" - ); - } - - @Test - @DisplayName("Returning ID without type wrapping") - void noWrapping() { - assertGeneratedContentContains( - "noWrapping", Set.of(CUSTOMER_NODE_INPUT_TABLE, CUSTOMER_NODE), - "String queryForQuery(", - ".select(_iv_nodeIdStrategy.createId(\"CustomerNode\"", - ".where(_iv_nodeIdStrategy.hasId(\"CustomerNode\"", - ".fetchOne(_iv_it -> _iv_it.into(String.class));" - ); - } - - @Test - @DisplayName("Node IDs in single table interface queries") - void inSingleTableInterfaceQuery() { - assertGeneratedContentContains("singleTableInterface", - "nodeIdStrategy.createId(\"A1\", _a_address.ADDRESS_ID).as(\"ONE_id\")", - "nodeIdStrategy.createId(\"A2\", _a_address.ADDRESS_ID).as(\"TWO_id\")", - "data = _iv_it.into(AddressInDistrictOne.class);" + - "_iv_data.setId(_iv_it.get(\"ONE_id\", String.class));" + - "return _iv_data;", - "into(AddressInDistrictTwo.class); _iv_data.setId(_iv_it.get(\"TWO_id\", String.class));" - ); - } - - @Test - @DisplayName("Node ID in another table object with same table as node type") - void inAnotherTableObjectWithSameTable() { - assertGeneratedContentContains("inAnotherTableObjectWithSameTable", - "return DSL.row(_iv_nodeIdStrategy.createId(\"C\", _a_customer" // Don't select as a reference - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/NodeIdWithoutNode.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/NodeIdWithoutNode.java deleted file mode 100644 index dbec677e6e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/NodeIdWithoutNode.java +++ /dev/null @@ -1,37 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.MapOnlyFetchDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER; -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_QUERY; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_NODE_STRATEGY; - -@DisplayName("Wiring - Generation of the method returning a runtime wiring builder") -public class NodeIdWithoutNode extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/fetch/nodeId"; - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new MapOnlyFetchDBClassGenerator(schema)); - } - - @Test - @DisplayName("Node strategy is not used when enabled but no Node interface exists") - void nodeStrategyWithoutNode() { - GeneratorConfig.setNodeStrategy(true); - resultDoesNotContain(Set.of(CUSTOMER_QUERY, CUSTOMER), "NodeIdStrategy", VAR_NODE_STRATEGY); - GeneratorConfig.setNodeStrategy(false); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/NodeInterfaceTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/NodeInterfaceTest.java deleted file mode 100644 index 10aa4e8cc2..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/NodeInterfaceTest.java +++ /dev/null @@ -1,67 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.InterfaceOnlyFetchDBClassGenerator; -import no.sikt.graphitron.validation.InvalidSchemaException; -import no.sikt.graphql.directives.GenerationDirective; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.NODE; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; - -@DisplayName("Query node - Interface handling for types implementing node interface") -public class NodeInterfaceTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/fetch/interfaces/node"; - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(NODE); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new InterfaceOnlyFetchDBClassGenerator(schema)); - } - - @Test - @DisplayName("Only ID") - void defaultCase() { - assertGeneratedContentMatches("default"); - } - - @Test - @DisplayName("Type implements node and non-node interface") - void twoInterfaces() { - assertGeneratedContentContains( - "twoInterfaces", - "customerForNode", - ",Set<String> _mi_id,", - ".where(_a_customer.hasIds(_mi_id))" - ); - } - - @Test - @DisplayName("Type implements interface but does not set table") - void withoutTable() { - assertThatThrownBy(() -> generateFiles("withoutTable")) - .isInstanceOf(InvalidSchemaException.class) - .hasMessageContaining(String.format("Type Type needs to have the @%s directive set to be able to implement interface Node", GenerationDirective.TABLE.getName())); - } - - @Test - @DisplayName("Type implements interface without table set but no queries use the interface") - void withoutTableAndQuery() { - assertDoesNotThrow(() -> generateFiles("withoutTableAndQuery")); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/OptionalInputTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/OptionalInputTest.java deleted file mode 100644 index 35576651b2..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/OptionalInputTest.java +++ /dev/null @@ -1,82 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.InterfaceOnlyFetchDBClassGenerator; -import no.sikt.graphitron.reducedgenerators.MapOnlyFetchDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_TABLE; -import static no.sikt.graphitron.common.configuration.SchemaComponent.DUMMY_INPUT; - -@DisplayName("Query optional inputs - Nullability and list checks for optional fields") -public class OptionalInputTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/fetch/inputs/optional"; - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(CUSTOMER_TABLE); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new MapOnlyFetchDBClassGenerator(schema), new InterfaceOnlyFetchDBClassGenerator(schema)); - } - - @Test - @DisplayName("Optional field") // Just check that this is placed right. - void defaultCase() { - assertGeneratedContentMatches("default"); - } - - @Test - @DisplayName("Listed field") - void list() { - assertGeneratedContentContains("list", "email != null && _mi_email.size() > 0 ? _a_customer.EMAIL.in(_mi_email) :DSL.noCondition()"); - } - - @Test - @DisplayName("Input field") - void input() { - assertGeneratedContentContains( - "input", Set.of(DUMMY_INPUT), - "in != null && _mi_in.getId() != null ? _a_customer.hasId(_mi_in.getId()) : DSL.noCondition()" - ); - } - - @Test - @DisplayName("Nested input field") - void nestedInput() { - assertGeneratedContentContains( - "nestedInput", Set.of(DUMMY_INPUT), - "in != null && _mi_in.getIn() != null && _mi_in.getIn().getId() != null ? _a_customer.hasId(_mi_in.getIn().getId()) : DSL.noCondition()" - ); - } - - @Test // Note that if the inner input type is not marked as required, an exception will be thrown wrongly stating that the outer field is the culprit. - @DisplayName("Listed and then nested input field") - void listedNestedInput() { - assertGeneratedContentContains( - "listedNestedInput", Set.of(DUMMY_INPUT), - "customer.hasId(_mi_in0.get(_iv_it).getIn1().getId())" - ); - } - - @Test - @DisplayName("Nested and then listed input field") - void nestedListedInput() { - assertGeneratedContentContains( - "nestedListedInput", Set.of(DUMMY_INPUT), - "customer.hasId(_mi_in.getIn().get(_iv_it).getId())" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/OptionalSelectExternalFieldsOnlyTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/OptionalSelectExternalFieldsOnlyTest.java deleted file mode 100644 index 231895a363..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/OptionalSelectExternalFieldsOnlyTest.java +++ /dev/null @@ -1,33 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -@DisplayName("Query outputs - With optional select enabled for external fields only") -public class OptionalSelectExternalFieldsOnlyTest extends OptionalSelectPartiallyEnabledTest { - @BeforeAll - static void setUp() { - GeneratorConfig.setOptionalSelectOnExternalFields(true); - GeneratorConfig.setOptionalSelectOnSubqueries(false); - } - - @Test - @DisplayName("External fields should be wrapped with ifRequested") - void externalFieldIsWrapped() { - assertGeneratedContentContains( - "externalField", - "_iv_select.ifRequested(\"name\", () -> no.sikt.graphitron.codereferences.extensionmethods.ClassWithExtensionMethod.name(_a_customer))" - ); - } - - @Test - @DisplayName("Subqueries should NOT be wrapped with ifRequested when onSubqueryReferences is disabled") - void subqueryIsNotWrapped() { - resultDoesNotContain( - "fieldReference", - "ifRequested" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/OptionalSelectPartiallyEnabledTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/OptionalSelectPartiallyEnabledTest.java deleted file mode 100644 index f6b749b723..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/OptionalSelectPartiallyEnabledTest.java +++ /dev/null @@ -1,87 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.EntityOnlyFetchDBClassGenerator; -import no.sikt.graphitron.reducedgenerators.InterfaceOnlyFetchDBClassGenerator; -import no.sikt.graphitron.reducedgenerators.MapOnlyFetchDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -abstract class OptionalSelectPartiallyEnabledTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/fetch/optionalSelect"; - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of( - new MapOnlyFetchDBClassGenerator(schema), - new InterfaceOnlyFetchDBClassGenerator(schema), - new EntityOnlyFetchDBClassGenerator(schema) - ); - } - - @AfterAll - static void tearDown() { - GeneratorConfig.setUseOptionalSelects(false); - } - - @Test - @DisplayName("SelectionSet should be passed to helper methods") - void selectionSetIsPassedToHelpers() { - assertGeneratedContentContains( - "selectionHelpers", - "queryForQuery_customer(SelectionSet _iv_select)", - "_1_queryForQuery_customer_address(SelectionSet _iv_select)" - ); - } - - @Test - @DisplayName("Entity queries should accept SelectionSet") - void entityQuery() { - assertGeneratedContentContains( - "entity", Set.of(FEDERATION_QUERY), - "_mi_representations, SelectionSet _iv_select)" - ); - } - - @Test - @DisplayName("Multitable queries should pass SelectionSet to data helpers") - void multitable() { - assertGeneratedContentContains( - "multitable", - "_iv_ctx, SelectionSet _iv_select)", - "paymenttypeoneForPayments(_iv_select)", - "paymenttypeoneForPayments(SelectionSet _iv_select)" - ); - } - - @Test - @DisplayName("Node queries should accept SelectionSet") - void node() { - assertGeneratedContentContains( - "node", Set.of(NODE, NODE_QUERY), - "_mi_id, SelectionSet _iv_select)", - "customerForNode_customer(_iv_select)" - ); - } - - @Test - @DisplayName("Single table interface queries should accept SelectionSet") - void singleTableInterface() { - assertGeneratedContentContains( - "singleTableInterface", - "_iv_ctx, SelectionSet _iv_select)" - ); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/OptionalSelectSubqueriesOnlyTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/OptionalSelectSubqueriesOnlyTest.java deleted file mode 100644 index 69e4edb53a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/OptionalSelectSubqueriesOnlyTest.java +++ /dev/null @@ -1,33 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -@DisplayName("Query outputs - With optional select enabled for subqueries only") -public class OptionalSelectSubqueriesOnlyTest extends OptionalSelectPartiallyEnabledTest { - @BeforeAll - static void setUp() { - GeneratorConfig.setOptionalSelectOnExternalFields(false); - GeneratorConfig.setOptionalSelectOnSubqueries(true); - } - - @Test - @DisplayName("Subqueries should be wrapped with ifRequested") - void subqueryIsWrapped() { - assertGeneratedContentContains( - "fieldReference", - "_iv_select.ifRequested(\"address\", () ->" - ); - } - - @Test - @DisplayName("External fields should NOT be wrapped with ifRequested when onExternalFields is disabled") - void externalFieldIsNotWrapped() { - resultDoesNotContain( - "externalField", - "ifRequested" - ); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/OptionalSelectTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/OptionalSelectTest.java deleted file mode 100644 index 0f58093e48..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/OptionalSelectTest.java +++ /dev/null @@ -1,230 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.*; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("Query outputs - With optional select enabled") -public class OptionalSelectTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/fetch/optionalSelect"; - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of( - new MapOnlyFetchDBClassGenerator(schema), - new InterfaceOnlyFetchDBClassGenerator(schema), - new EntityOnlyFetchDBClassGenerator(schema), - new EntityOnlyHelperDBClassGenerator(schema) - ); - } - - @BeforeAll - static void setUp() { - GeneratorConfig.setUseOptionalSelects(true); - } - - @AfterAll - static void tearDown() { - GeneratorConfig.setUseOptionalSelects(false); - } - - @Test - @DisplayName("Regular table column should not be optional, but SelectionSet should still be passed down") - void tableColumn() { - assertGeneratedContentContains( - "tableColumn", - "queryForQuery_customer(SelectionSet _iv_select)", // Helper method signature accepts SelectionSet - "row(_a_customer.FIRST_NAME).mapping" // Not wrapped with select.ifRequested - ); - } - - @Test - @DisplayName("SelectionSet should be included in helper method signatures") - void selectionHelpers() { - assertGeneratedContentContains( - "selectionHelpers", - "queryForQuery_customer(SelectionSet _iv_select)", // Helper - "_1_queryForQuery_customer_address(SelectionSet _iv_select)", // Nested helper - "ifRequested(\"address\", () ->", // Check path on subquery - "ifRequested(\"address/city\", () ->" // Check path on nested subquery - ); - } - - @Test - @DisplayName("Field references should be wrapped with ifRequested") - void fieldReference() { - assertGeneratedContentContains( - "fieldReference", - """ - row( - _iv_select.ifRequested("address", () -> - DSL.field( - DSL.select(_1_queryForQuery_customer_address(_iv_select)) - .from(_a_customer_2168032777_address) - ) - ) - ).mapping - """ - ); - } - - @Test - @DisplayName("Nested field references should have correct path") - void nestedFieldReference() { - assertGeneratedContentContains( - "nestedFieldReference", - "ifRequested(\"address/cityId\", " - ); - } - - @Test - @DisplayName("Multiset references should be wrapped with ifRequested") - void multisetReference() { - assertGeneratedContentContains( - "multisetReference", - """ - row( - _iv_select.ifRequested("customers", () -> - DSL.row( - DSL.multiset( - DSL.select(_1_queryForQuery_address_customers(_iv_select)) - .from(_a_address_223244161_customer) - .orderBy(_a_address_223244161_customer.fields(_a_address_223244161_customer.getPrimaryKey().getFieldsArray())) - ) - ).mapping(_iv_e -> _iv_e.map(Record1::value1)) - ) - ).mapping - """ - ); - } - - @Test - @DisplayName("Table column reference should be optional") - void scalarReference() { - assertGeneratedContentContains( - "scalarReference", - "_iv_select.ifRequested(\"cityId\", () ->" - ); - } - - @Test - @DisplayName("SplitQuery fields should not wrap target subquery with ifRequested") - void splitQuery() { - assertGeneratedContentContains( - "splitQuery", - "_a_customer.CUSTOMER_ID))), DSL.field(DSL.select(addressForCustomer_address(_iv_select", - "ifRequested(\"city\", () ->" // Check path on subquery - ); - } - - @Test - @DisplayName("Listed splitQuery fields should not wrap target subquery with ifRequested") - void splitQueryList() { - assertGeneratedContentContains( - "splitQueryList", - "_a_address.ADDRESS_ID))), DSL.multiset(DSL.select(customersForAddress_customer(_iv_select" - ); - } - - @Test - @DisplayName("Entity queries should accept SelectionSet and wrap subqueries with ifRequested") - void entityQuery() { - assertGeneratedContentContains( - "entity", Set.of(FEDERATION_QUERY), - "representations, SelectionSet _iv_select)", - "_a_customer.getId(),_iv_select.ifRequested(\"address\", () -> DSL.field(DSL.select(_1_customerFor_Entity_customer_address" - ); - } - - @Test - @DisplayName("Multitable queries should pass SelectionSet to data helpers but not sort helpers") - void multitable() { - assertGeneratedContentContains( - "multitable", - // Main method accepts SelectionSet - "_iv_ctx, SelectionSet _iv_select)", - - // SelectionSet is not passed to sort fields helper methods - "paymenttypetwoSortFieldsForPayments()", - "JSONB>> paymenttypetwoSortFieldsForPayments()", - - // SelectionSet is passed to data helper methods - "paymenttypeoneForPayments(_iv_select)", - "paymenttypeoneForPayments(SelectionSet _iv_select)", - - ".AMOUNT, _iv_select.ifRequested(\"rental\", () ->" - ); - } - - @Test - @DisplayName("Multitable splitQuery should pass SelectionSet to data helpers but not sort helpers") - void multitableSplitQuery() { - assertGeneratedContentContains( - "multitableSplitQuery", - // Main method accepts SelectionSet - "_iv_ctx, SelectionSet _iv_select)", - - // SelectionSet is not passed to sort fields helper methods - "paymenttypetwoSortFieldsForPayments(_a_customer)", - "JSONB>> paymenttypetwoSortFieldsForPayments(Customer _a_customer)", - - // SelectionSet is passed to data helper methods - "paymenttypeoneForPayments(_iv_select)", - "paymenttypeoneForPayments(SelectionSet _iv_select)", - - ".AMOUNT, _iv_select.ifRequested(\"rental\", () ->" - ); - } - - @Test - @DisplayName("Node queries should accept SelectionSet") - void node() { - assertGeneratedContentContains( - "node", Set.of(NODE, NODE_QUERY), - "_mi_id, SelectionSet _iv_select)", - "customerForNode_customer(_iv_select)" - ); - } - - @Test - @DisplayName("Single table interface queries should accept SelectionSet and wrap subqueries") - void singleTableInterface() { - assertGeneratedContentContains( - "singleTableInterface", - "_iv_ctx, SelectionSet _iv_select)", - "_iv_select.ifRequested(\"customer\", () ->" - ); - } - - @Test - @DisplayName("External field should be wrapped with ifRequested when optional select is enabled") - void externalField() { - assertGeneratedContentContains( - "externalField", - "_iv_select.ifRequested(\"name\", () -> no.sikt.graphitron.codereferences.extensionmethods.ClassWithExtensionMethod.name(_a_customer))" - ); - } - - @Test - @DisplayName("Nested external field should have correct path") - void nestedExternalField() { - assertGeneratedContentContains( - "nestedExternalField", - "ifRequested(\"customers/name\", " - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/OutputTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/OutputTest.java deleted file mode 100644 index ab07318aa5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/OutputTest.java +++ /dev/null @@ -1,520 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.MapOnlyFetchDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("Query outputs - Row structure and return types") -public class OutputTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/fetch/output"; - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new MapOnlyFetchDBClassGenerator(schema)); - } - - @Test - @DisplayName("Simple table type return") - void defaultCase() { - assertGeneratedContentMatches("default", CUSTOMER_TABLE); - } - - @Test - @DisplayName("Listed return type") - void listed() { - assertGeneratedContentContains( - "listed", Set.of(CUSTOMER_TABLE), - "List<CustomerTable> queryForQuery", - ".select(queryForQuery_customerTable(", - ".fetch(_iv_it -> _iv_it.into(CustomerTable.class" - ); - } - - @Test - @DisplayName("Simple table type return on non-root level") - void splitQuery() { - assertGeneratedContentMatches("splitQuery", CUSTOMER_TABLE, SPLIT_QUERY_WRAPPER); - } - - @Test - @DisplayName("Listed return type on non-root level") - void splitQueryListed() { - assertGeneratedContentContains( - "splitQueryListed", Set.of(CUSTOMER_TABLE, SPLIT_QUERY_WRAPPER), - "Map<AddressRecord, List<CustomerTable>> queryForWrapper", - ".select(DSL.row(_a_address.ADDRESS_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_address.ADDRESS_ID)))," + - "DSL.multiset(DSL.select", - ".fetchMap(Record2::value1, _iv_r -> _iv_r.value2().map(Record1::value1))" - ); - } - - @Test - @DisplayName("Implicit splitquery due to argument") - void implicitSplitQuery() { - assertFilesAreGenerated( - "implicitSplitQuery", Set.of(CUSTOMER_TABLE, SPLIT_QUERY_WRAPPER), - "WrapperDBQueries" - ); - } - - @Test - @DisplayName("Containing field annotated with @splitQuery") - void skipsSplits() { - resultDoesNotContain("skipsSplits", Set.of(CUSTOMER_TABLE), "CustomerTable::new"); - } - - @Test // TODO: Should result in an error. - @DisplayName("Containing field annotated with @splitQuery and no other fields") - void noGeneratedField() { - assertGeneratedContentContains("noGeneratedField", Set.of(CUSTOMER_TABLE), "return .mapping(Functions.nullOnAllNull(Address::new))"); - } - - @Test - @DisplayName("Containing field annotated with @field") - void fieldOverride() { - assertGeneratedContentContains("fieldOverride", "customer.FIRST_NAME"); - } - - @Test // Not sure if this is allowed. Note, this is actually invalid in our integration tests, since the IDs are jOOQ fields instead of get methods. - @DisplayName("Containing ID field annotated with @field and has no @nodeId") - void fieldOverrideID() { - assertGeneratedContentContains("fieldOverrideID", "payment.getCustomerId()"); - } - - @Test - @DisplayName("Containing array scalar field") - void arrayScalarField() { - assertGeneratedContentContains("arrayScalarField", - "row(_a_customer.USERNAMES.convertFrom(Functions.nullOnAllNull(_iv_it -> List.of(_iv_it)))).mapping(Functions.nullOnAllNull(Customer::"); - } - - @Test - @DisplayName("Field annotated with @externalField should use method extended on field's jooq table") - void externalField() { - assertGeneratedContentContains("externalField", - "return DSL.row(no.sikt.graphitron.codereferences.extensionmethods.ClassWithExtensionMethod.name(_a_customer))" - ); - } - - @Test - @DisplayName("External field in wrapper type without table should find previous target table") - void externalFieldWrappedType() { - assertGeneratedContentContains("externalFieldWrappedType", - "DSL.row(no.sikt.graphitron.codereferences.extensionmethods.ClassWithExtensionMethod.name(_a_customer))" - ); - } - - @Test - @DisplayName("Field annotated with @externalField should map types correctly even when over 22 fields") - void externalFieldOver22() { - assertGeneratedContentContains("externalFieldOver22", - "return DSL.row(no.sikt.graphitron.codereferences.extensionmethods.ClassWithExtensionMethod.name(_a_customer),", - "no.sikt.graphitron.codereferences.extensionmethods.ClassWithExtensionMethod.name(_a_customer).getDataType().convert(_iv_r[0])," - ); - } - - @Test - @DisplayName("Array field should cast to List in explicit mapping") - void arrayFieldOver22() { - assertGeneratedContentContains("arrayFieldOver22", - ", (List) _iv_r[22])" - ); - } - - @Test - @DisplayName("Returning string without type wrapping") - void noWrapping() { - assertGeneratedContentContains( - "noWrapping", Set.of(CUSTOMER_INPUT_TABLE), - "String queryForQuery", - ".select(_a_customer.FIRST_NAME)", - ".fetchOne(_iv_it -> _iv_it.into(String.class));" - ); - } - - @Test - @DisplayName("Returning listed string without type wrapping") - void noWrappingListed() { - assertGeneratedContentContains( - "noWrappingListed", Set.of(CUSTOMER_INPUT_TABLE), - "List<String> queryForQuery", - ".fetch(_iv_it -> _iv_it.into(String.class));" - ); - } - - @Test - @DisplayName("Query fetching two fields") - void multipleFields() { - assertGeneratedContentContains("multipleFields", ".row(_a_customer.getId(),_a_customer.EMAIL)"); - } - - @Test // TODO: Should result in an error. - @DisplayName("Containing field annotated with incorrect @field") - void invalidFieldOverride() { - assertGeneratedContentContains("invalidFieldOverride", "customer.WRONG"); - } - - @Test - @DisplayName("Type without a table on root level wrapping one that has table set") - void outerNestedRow() { - assertGeneratedContentContains( - "outerNestedRow", Set.of(CUSTOMER_TABLE), - """ - return DSL.row( - DSL.field( - DSL.select(_1_queryForQuery_wrapper_customer()) - .from(_a_customer) - ) - ).mapping(Functions.nullOnAllNull(Wrapper::new)) - """, - ".mapping(Functions.nullOnAllNull(CustomerTable::new))" - ); - } - - @Test - @DisplayName("Type without a table on root level wrapping a listed one that has table set") - void outerNestedListedRow() { - assertGeneratedContentContains( - "outerNestedListedRow", Set.of(CUSTOMER_TABLE), - """ - DSL.row( - DSL.row( - DSL.multiset( - DSL.select(_1_queryForQuery_wrapper_customer()) - .from(_a_customer) - .orderBy(_a_customer.fields(_a_customer.getPrimaryKey().getFieldsArray())) - ) - ).mapping(_iv_e -> _iv_e.map(Record1::value1)) - ).mapping(Functions.nullOnAllNull((_iv_it) -> new Wrapper(_iv_it))) - """ - ); - } - - @Test // TODO: Should result in an error. Email has no source. - @DisplayName("Type without a table on root level wrapping one that has table set with an extra intermediate field") - void outerNestedRowExtraField() { - assertGeneratedContentContains( - "outerNestedRowExtraField", Set.of(CUSTOMER_TABLE), - ".row(.EMAIL,DSL.field(DSL.select(_1_queryForQuery_wrapper_customer())" - ); - } - - @Test - @DisplayName("Two types without a table on root level wrapping one that has table set") - void outerDoubleNestedRow() { - assertGeneratedContentContains( - "outerDoubleNestedRow", Set.of(CUSTOMER_TABLE), - """ - return DSL.row( - DSL.row( - DSL.field( - DSL.select(_1_queryForQuery_wrapper1_customer()) - .from(_a_customer) - ) - ).mapping(Functions.nullOnAllNull(Wrapper2::new)) - ).mapping(Functions.nullOnAllNull(Wrapper1::new)); - """ - ); - } - - @Test - @DisplayName("Nested output with an argument") - void outerNestedWithArgument() { - assertGeneratedContentContains( - "outerNestedWithArgument", Set.of(CUSTOMER_TABLE), - "queryForQuery(DSLContext _iv_ctx, String _mi_firstName,", - "queryForQuery_outer(_mi_firstName)).fetchOne", - "queryForQuery_outer(String _mi_firstName)", - """ - DSL.field( - DSL.select(_1_queryForQuery_outer_customers()) - .from(_a_customer) - .where(_mi_firstName != null ? _a_customer.FIRST_NAME.eq(_mi_firstName) : DSL.noCondition()) - """, - "return DSL.row(_a_customer.getId()).mapping" // Checks that no outer where statement exists. - ); - } - - @Test - @DisplayName("Nested output with a listed argument") - void outerNestedWithArgumentListed() { - assertGeneratedContentContains( - "outerNestedWithArgumentListed", Set.of(CUSTOMER_TABLE), - "queryForQuery(DSLContext _iv_ctx, List<String> _mi_firstName,", - ".select(queryForQuery_outer(_mi_firstName)).fetchOne", - "queryForQuery_outer(List<String> _mi_firstName)", - """ - DSL.multiset( - DSL.select(_1_queryForQuery_outer_customers()) - .from(_a_customer) - .where(_mi_firstName.size() > 0 ? _a_customer.FIRST_NAME.in(_mi_firstName) : DSL.noCondition()) - .orderBy(_a_customer.fields(_a_customer.getPrimaryKey().getFieldsArray())) - ) - """ - ); - } - - @Test - @DisplayName("Double nested output with an argument") - void outerDoubleNestedWithArgument() { - assertGeneratedContentContains( - "outerDoubleNestedWithArgument", Set.of(CUSTOMER_TABLE), - """ - return DSL.row( - DSL.row( - DSL.field( - DSL.select(_1_queryForQuery_wrapper1_customer()) - .from(_a_customer) - .where(_mi_firstName != null ? _a_customer.FIRST_NAME.eq(_mi_firstName) : DSL.noCondition()) - """ - ); - } - - @Test - @DisplayName("Type without a table on root level wrapping a list of errors") - void outerNestedWithListedError() { - assertGeneratedContentContains( - "outerNestedWithListedError", Set.of(CUSTOMER_TABLE, VALIDATION_ERROR), - ".mapping(Functions.nullOnAllNull((_iv_it) -> new Wrapper(_iv_it)" - ); - } - - @Test - @DisplayName("Type without a table inside one that has table set") - void innerNestedRow() { - assertGeneratedContentContains( - "innerNestedRow", - ".row(DSL.row(_a_customer.getId()).mapping(Functions.nullOnAllNull(Wrapper::new))).mapping(Functions.nullOnAllNull(Customer::new" - ); - } - - @Test - @DisplayName("Type without a table inside one that has table set with an extra intermediate field") - void innerNestedRowExtraField() { - assertGeneratedContentContains( - "innerNestedRowExtraField", - ".row(_a_customer.EMAIL,DSL.row(_a_customer.getId()).mapping(Functions.nullOnAllNull(Wrapper::new" - ); - } - - @Test - @DisplayName("Two types without a table inside one that has table set") - void innerDoubleNestedRow() { - assertGeneratedContentContains( - "innerDoubleNestedRow", - ".row(DSL.row(DSL.row(_a_customer.getId())" + - ".mapping(Functions.nullOnAllNull(Wrapper2::new)))" + - ".mapping(Functions.nullOnAllNull(Wrapper1::new)))" + - ".mapping(Functions.nullOnAllNull(Customer::new" - ); - } - - @Test // jOOQ stops type checking at 22 fields. - @DisplayName("Row with more than 22 fields") - void over22Fields() { - assertGeneratedContentMatches("over22Fields"); - } - - @Test - @DisplayName("Row with more than 22 fields where some have types other than string") - void over22FieldsWithVariousTypes() { - assertGeneratedContentContains( - "over22FieldsWithVariousTypes", Set.of(DUMMY_ENUM), - "film.LENGTH", - "film.RATING.convert", - "film.LENGTH.getDataType().convert(_iv_r[21", - "(DummyEnum) _iv_r[22" - ); - } - - @Test - @DisplayName("Row with more than 22 fields including an inner row") - void over22FieldsWithInnerRow() { - assertGeneratedContentContains("over22FieldsWithInnerRow", "Wrapper::new", "(Wrapper) _iv_r[22"); - } - - @Test - @DisplayName("Row with more than 22 fields including multiset") - void over22FieldsWithMultiset() { - assertGeneratedContentContains("over22FieldsWithMultiset", "Wrapper::new", "(List<Wrapper>) _iv_r[22]"); - } - - @Test - @DisplayName("Row with more than 22 fields including key for splitQuery field") - void over22FieldsWithSplitQuery() { - assertGeneratedContentContains("over22FieldsWithSplitQuery", - "new Film( (FilmRecord) _iv_r[0], _a_film.TITLE.getDataType().convert(_iv_r[1])", - "_iv_r[22]))" - ); - } - - @Test // Enhanced null check treats empty objects as null. - @DisplayName("Required row with optional fields") - void requiredRowWithOptionalFields() { - assertGeneratedContentContains( - "requiredRowWithOptionalFields", - ".row(DSL.row(_a_customer.EMAIL).mapping(Wrapper::new))" + - ".mapping((_iv_e0) -> (_iv_e0 == null || new Wrapper().equals(_iv_e0)) ? null : new Customer(_iv_e0)" - ); - } - - @Test - @DisplayName("Required row with optional field and a neighbour field") - void requiredRowWithOptionalFieldsAndNeighbourField() { - assertGeneratedContentContains( - "requiredRowWithOptionalFieldsAndNeighbourField", - ".mapping((_iv_e0, _iv_e1) -> _iv_e0 == null && (_iv_e1 == null || new Wrapper().equals(_iv_e1)) ? null : new Customer(_iv_e0, _iv_e1" - ); - } - - @Test - @DisplayName("Required row with optional field and a neighbour row") - void requiredRowWithOptionalFieldsAndNeighbourRow() { - assertGeneratedContentContains( - "requiredRowWithOptionalFieldsAndNeighbourRow", - ".mapping(Wrapper::new", - ".mapping(Functions.nullOnAllNull(Wrapper::new", - ".mapping((_iv_e0, _iv_e1) -> (_iv_e0 == null || new Wrapper().equals(_iv_e0)) && (_iv_e1 == null || new Wrapper().equals(_iv_e1)) ? null : new Customer(_iv_e0, _iv_e1" - ); - } - - @Test - @DisplayName("Required row with optional field and more than 22 fields") - void requiredRowWithOptionalFieldsAndOver22Fields() { - assertGeneratedContentContains( - "requiredRowWithOptionalFieldsAndOver22Fields", - ".mapping(Wrapper::new", - ".mapping(Customer.class, _iv_r -> (_iv_r[0] == null || new Wrapper().equals(_iv_r[0]))" + - "&& _iv_r[1] == null && _iv_r[2] == null && _iv_r[3] == null && _iv_r[4] == null && _iv_r[5] == null && _iv_r[6] == null" + - "&& _iv_r[7] == null && _iv_r[8] == null && _iv_r[9] == null && _iv_r[10] == null && _iv_r[11] == null" + - "&& _iv_r[12] == null && _iv_r[13] == null && _iv_r[14] == null && _iv_r[15] == null && _iv_r[16] == null" + - "&& _iv_r[17] == null && _iv_r[18] == null && _iv_r[19] == null && _iv_r[20] == null && _iv_r[21] == null" + - "&& _iv_r[22] == null && _iv_r[23] == null ? null : new Customer(" - ); - } - - @Test - @DisplayName("Type containing a table type (field subquery)") - void innerTable() { - assertGeneratedContentMatches("innerTable"); - } - - @Test - @DisplayName("Type containing a listed table type (multiset subquery)") - void innerTableListed() { - assertGeneratedContentMatches("innerTableListed"); - } - - @Test - @DisplayName("Type with a query that references itself") - void innerTableSelfReference() { - assertGeneratedContentContains( - "innerTableSelfReference", - ".row(_a_film.FILM_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_film.FILM_ID))), DSL.field", - ".mapping(Functions.nullOnAllNull(Film::new"); - } - - @Test - @DisplayName("Simple table type return from multiple schemas") - void typesFromMultipleSchemas() { - assertGeneratedContentContains("fromMultipleSchemas", - Set.of(CUSTOMER_TABLE), - "fromSchema1ForQuery", - "fromSchema2ForQuery", - "pguser.getId()", - ".from(_a_pguser)"); - } - - @Test - @DisplayName("Correct table and paths used for table with \"_\" suffix in java field name") - void tableWithSameNameAsSchema() { - assertGeneratedContentContains("tableWithSameNameAsSchema", - "_a_public = PUBLIC_.as", - "_a_public.vacation().as", - "_a_public.DUMMY_COLUMN," - ); - } - - @Test - @DisplayName("Construct type with basic field mapping") - void constructType() { - assertGeneratedContentContains("constructType", Set.of(CUSTOMER_QUERY), - "_a_customer.F", - ".mapping(Functions.nullOnAllNull(Inner::new))" - ); - } - - @Test - @DisplayName("Construct type with explicit column mapping") - void constructTypeWithColumnMapping() { - assertGeneratedContentContains("constructTypeWithColumnMapping", Set.of(CUSTOMER_QUERY), - "_a_customer.STORE_ID", - ".mapping(Functions.nullOnAllNull(Inner::new))" - ); - } - - @Test - @DisplayName("Construct type with enum field") - void constructTypeWithEnum() { - assertGeneratedContentContains("constructTypeWithEnum", Set.of(DUMMY_ENUM, CUSTOMER_QUERY), - "_a_customer.F.convert", - ".mapping(Functions.nullOnAllNull(Inner::new))" - ); - } - - @Test - @DisplayName("Construct type with multiple fields") - void constructTypeMultipleFields() { - assertGeneratedContentContains("constructTypeMultipleFields", Set.of(CUSTOMER_QUERY), - "_a_customer.F", - "_a_customer.STORE_ID", - ".mapping(Functions.nullOnAllNull(Inner::new))" - ); - } - - @Test - @DisplayName("Construct type with partial selection produces null for unmapped field") - void constructTypePartialSelection() { - assertGeneratedContentContains("constructTypePartialSelection", Set.of(CUSTOMER_QUERY), - "_a_customer.F", - "DSL.inline(((Object) null))", - ".mapping(Functions.nullOnAllNull(Inner::new))" - ); - } - - @Test - @DisplayName("Wrapped table with self-referencing FK and table input") - void wrappedTableWithSelfReferenceAndTableInput() { - resultDoesNotContain( - "wrappedTableWithSelfReferenceAndTableInput", - "_a_film.film()" - ); - } - - @Test - @DisplayName("Self-referencing table with wrapper type without @table") - void wrapperWithoutTableForTableWithSelfReference() { - assertGeneratedContentContains("wrapperWithoutTableForTableWithSelfReference", - "row(_a_film.FILM_ID).mapping(Functions.nullOnAllNull(Wrapper::new))).mapping(Functions.nullOnAllNull(Film" - ); - } - - @Test - @DisplayName("Self-referencing table with wrapper type with @table") - void wrapperWithTableForTableWithSelfReference() { - assertGeneratedContentContains("wrapperWithTableForTableWithSelfReference", - "row(_a_film.FILM_ID).mapping(Functions.nullOnAllNull(Wrapper::new))).mapping(Functions.nullOnAllNull(Film" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/PaginationTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/PaginationTest.java deleted file mode 100644 index 999c8ddf73..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/PaginationTest.java +++ /dev/null @@ -1,81 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.PaginationOnlyDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("Query pagination - Pagination parameters applied inside queries") -public class PaginationTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/fetch/pagination"; - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new PaginationOnlyDBClassGenerator(schema)); - } - - @Test - @DisplayName("Connection with no other fields") - void defaultCase() { - assertGeneratedContentMatches("default", CUSTOMER_CONNECTION_WITH_NO_OPTIONALS); - } - - @Test - @DisplayName("Connection with an extra field") - void withOtherField() { - assertGeneratedContentContains( - "withOtherField", - Set.of(CUSTOMER_CONNECTION_WITH_NO_OPTIONALS), - ", String _mi_name, Integer _iv_pageSize, String _mi_after," - ); - } - - @Test - @DisplayName("Connection not on the root level") - void splitQuery() { - assertGeneratedContentMatches( - "splitQuery", - CUSTOMER_CONNECTION_WITH_NO_OPTIONALS, - SPLIT_QUERY_WRAPPER - ); - } - - @Test - @DisplayName("No pagination on non-connection multiset") - void multiset() { - resultDoesNotContain( - "multiset", - Set.of(CUSTOMER_TABLE), - ".getOrderByValues(", - ".seek(" - ); - } - - @Test - @DisplayName("When optional field 'totalCount' is included in the schema, generate the count method") - void shouldGenerateAllOptionalFields() { - assertGeneratedContentContains( - "allOptionalFieldsIncluded", - Set.of(CUSTOMER_CONNECTION), - "countCustomersForQuery("); - } - - @Test - @DisplayName("When optional field 'totalCount' is not included in the schema, do not generate the count method") - void shouldGenerateNoOptionalFields() { - resultDoesNotContain( - "allOptionalFieldsExcluded", - Set.of(CUSTOMER_CONNECTION_WITH_NO_OPTIONALS), - "countCustomersForQuery("); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ProcedureCallTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ProcedureCallTest.java deleted file mode 100644 index e3f0470064..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ProcedureCallTest.java +++ /dev/null @@ -1,74 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.MapOnlyFetchDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_QUERY; - -@DisplayName("Query outputs - @experimental_procedureCall directive") -public class ProcedureCallTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/fetch/procedureCall"; - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new MapOnlyFetchDBClassGenerator(schema)); - } - - @Test - @DisplayName("Procedure call with a single column-sourced argument") - void procedureCall() { - assertGeneratedContentContains("procedureCall", Set.of(CUSTOMER_QUERY), - "Routines.inventoryHeldByCustomer(_a_customer.CUSTOMER_ID)" - ); - } - - @Test - @DisplayName("Procedure call with multiple arguments in jOOQ declaration order") - void procedureCallMultipleArgs() { - assertGeneratedContentContains("procedureCallMultipleArgs", Set.of(CUSTOMER_QUERY), - "Routines.getCustomerBalance(_a_customer.CUSTOMER_ID, _a_customer.LAST_UPDATE)" - ); - } - - @Test - @DisplayName("Procedure call with schema-qualified routine name") - void procedureCallQualifiedRoutine() { - assertGeneratedContentContains("procedureCallQualifiedRoutine", Set.of(CUSTOMER_QUERY), - "Routines.lastDay(_a_customer.LAST_UPDATE)" - ); - } - - @Test - @DisplayName("Procedure call on a root field") - void procedureCallTargetOnRoot() { - assertGeneratedContentContains("procedureCallTargetOnRoot", - "Routines.inventoryHeldByCustomer(_mi_inventoryId)" - ); - } - - @Test - @DisplayName("Procedure call on a non-root data-fetcher") - void procedureCallTargetOnArgField() { - assertGeneratedContentContains("procedureCallTargetOnArgField", - "Routines.inventoryHeldByCustomer(_mi_inventoryId)" - ); - } - - @Test - @DisplayName("Procedure call on a @splitQuery field") - void procedureCallTargetSplitQuery() { - assertGeneratedContentContains("procedureCallTargetSplitQuery", - "Routines.inventoryHeldByCustomer(_mi_inventoryId)" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/RecordTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/RecordTest.java deleted file mode 100644 index 2b5f2f9437..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/RecordTest.java +++ /dev/null @@ -1,183 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.MapOnlyFetchDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.DUMMY_RECORD; -import static no.sikt.graphitron.common.configuration.ReferencedEntry.JAVA_RECORD_CUSTOMER; -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_INPUT_TABLE; -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_TABLE; - -@DisplayName("Fetch queries - Queries using input records") -public class RecordTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/fetch/records"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(DUMMY_RECORD, JAVA_RECORD_CUSTOMER); - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(CUSTOMER_TABLE); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new MapOnlyFetchDBClassGenerator(schema)); - } - - @Test - @DisplayName("Input Java records") - void inputJavaRecord() { - assertGeneratedContentContains( - "inputJavaRecord", - "customerForQuery(DSLContext _iv_ctx, DummyRecord _mi_inRecord,", - "inRecord != null ? _a_customer.hasId(_mi_inRecord.getId()) : DSL.noCondition()", - "inRecord != null ? _a_customer.hasId(_mi_inRecord.getOtherID()) : DSL.noCondition()" - ); - } - - @Test - @DisplayName("Listed input Java records") - void listedInputJavaRecord() { - assertGeneratedContentContains( - "listedInputJavaRecord", - "customerForQuery(DSLContext _iv_ctx, List<DummyRecord> _mi_inRecordList,", - "DSL.row(DSL.trueCondition(), DSL.trueCondition()).in(", - "IntStream.range(0, _mi_inRecordList.size()).mapToObj(_iv_it -> DSL.row(_a_customer.hasId(_mi_inRecordList.get(_iv_it).getId()),", - "customer.hasId(_mi_inRecordList.get(_iv_it).getOtherID())", - ") : DSL.noCondition()" - ); - } - - @Test - @DisplayName("Input jOOQ records") - void inputJOOQRecord() { - assertGeneratedContentContains( - "inputJOOQRecord", - "customerForQuery(DSLContext _iv_ctx, CustomerRecord _mi_inRecord,", - "inRecord != null ? _a_customer.hasId(_mi_inRecord.getId()) : DSL.noCondition()", - "inRecord != null ? _a_customer.FIRST_NAME.eq(_mi_inRecord.getFirstName()) : DSL.noCondition()" - ); - } - - @Test - @DisplayName("Listed input jOOQ records") - void listedInputJOOQRecord() { - assertGeneratedContentContains( - "listedInputJOOQRecord", - "customerForQuery(DSLContext _iv_ctx, List<CustomerRecord> _mi_inRecordList,", - "DSL.row(DSL.trueCondition(), _a_customer.FIRST_NAME).in(", - "customer.hasId(_mi_inRecordList.get(_iv_it).getId()),", - "_iv_select.hasArgumentAtIndex(\"in\", _iv_it, \"first\") ? DSL.val(_mi_inRecordList.get(_iv_it).getFirstName()) : _a_customer.FIRST_NAME" - ); - } - - @Test // Special case where nesting path should not be used since the records are flat structures. - @DisplayName("Listed input jOOQ records with an extra input type inside") - void listedNestedInputJOOQRecord() { - assertGeneratedContentContains("listedNestedInputJOOQRecord", ".val(_mi_inRecordList.get(_iv_it).getFirstName())"); - } - - @Test - @DisplayName("Listed input jOOQ records with a CLOB field") - void listedInputJOOQRecordWithCLOB() { - assertGeneratedContentContains("listedInputJOOQRecordWithCLOB", "_a_film.DESCRIPTION.cast(String.class)"); - } - - @Test // Not sure if this is allowed. - @DisplayName("Input type with an ID field annotated with @field without @nodeId") - void fieldOverrideID() { - assertGeneratedContentContains("fieldOverrideID", - "payment.hasCustomerId(_mi_inRecordList.get(_iv_it).getCustomerId()) : DSL.trueCondition()", - "payment.hasPaymentId(_mi_inRecordList.get(_iv_it).getPaymentId()) : DSL.trueCondition()"); - } - - @Test // In these cases the table must be selected based on the input record, otherwise this is not resolvable. - @DisplayName("Returns a type without a table set") - void returningTypeWithoutTable() { - assertGeneratedContentContains( - "returningTypeWithoutTable", Set.of(CUSTOMER_INPUT_TABLE), - ".row(_a_customer.getId(),_a_customer.FIRST_NAME", - "CustomerNoTable::new", - ".from(_a_customer)", - "customer.hasId(_mi_inRecord.getId()", - ".into(CustomerNoTable.class" - ); - } - - @Test - @DisplayName("Returns a type without a table set, which contains a table field") - void returningTypeWithoutTableWithTableField() { - assertGeneratedContentContains( - "returningTypeWithoutTableWithTableField", Set.of(CUSTOMER_INPUT_TABLE, CUSTOMER_TABLE), - ".row(DSL.row(_a_customer.getId()).mapping(Functions.nullOnAllNull(CustomerTable::new))).mapping(", - ".where(_a_customer.hasId(_mi_inRecord.getId())).fetchOne(" // Makes sure there is no duplicated condition. - ); - } - - @Test - @DisplayName("Returns a listed type without a table set") - void returningListedTypeWithoutTable() { - assertGeneratedContentContains( - "returningListedTypeWithoutTable", Set.of(CUSTOMER_INPUT_TABLE), - ".row(DSL.row(DSL.multiset(" + - "DSL.select(_a_customer.getId())" + - ".from(_a_customer).where(_mi_inRecordList", - ".mapping(Functions.nullOnAllNull((_iv_it) -> new CustomerNoTable(_iv_it))", - ".fetchOne(_iv_it -> _iv_it.into(CustomerNoTable" - ); - } - - @Test - @DisplayName("Returns a listed type without a table set, which contains a table field") - void returningListedTypeWithoutTableWithTableField() { - assertGeneratedContentContains( - "returningListedTypeWithoutTableWithTableField", Set.of(CUSTOMER_INPUT_TABLE, CUSTOMER_TABLE), - ".row(DSL.row(DSL.multiset(" + - "DSL.select(_1_queryForQuery_customerNoTable_customers())", - "DSL.row(_a_customer.getId()).mapping(Functions.nullOnAllNull(CustomerTable::new))", - ".from(_a_customer).where(_mi_inRecordList", - "new CustomerNoTable(_iv_it)))", - ".fetchOne(_iv_it -> _iv_it.into(CustomerNoTable" - ); - } - - @Test // A too long and incorrect join path may occur here. - @DisplayName("A listed type without a table set, which contains a table field and additional nesting layers with references") - void returningListedTypeWithoutTableWithNestedTableField() { - assertGeneratedContentContains( - "returningListedTypeWithoutTableWithNestedTableField", Set.of(CUSTOMER_INPUT_TABLE), - ".select(_a_customer_2168032777_address.DISTRICT).from(_a_customer_2168032777_address))).mapping" - ); - } - - @Test - @DisplayName("TableMethod with Java Record") - void tableMethodWithJavaRecord() { - assertGeneratedContentContains("javaRecordWithTableMethod", - "_a_customer = _rs_customerTableMethod.customerTable(CUSTOMER.as(\"customer_2168032777\"), _mi_inRecord)" - ); - } - - @Test - @DisplayName("TableMethod with jOOQ Record") - void tableMethodWithJOOQRecord() { - assertGeneratedContentContains("jOOQRecordWithTableMethod", - "customer = _rs_customerTableMethod.customerTable(CUSTOMER.as(\"customer_2168032777\"), _mi_inRecord)" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ReferenceAliasTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ReferenceAliasTest.java deleted file mode 100644 index 0517b7a0ae..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ReferenceAliasTest.java +++ /dev/null @@ -1,431 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("Fetch queries - Alias usage") -public class ReferenceAliasTest extends ReferenceTest { - @Test - @DisplayName("Alias declaration for table path") - void aliasTable() { - assertGeneratedContentContains( - "field/table", Set.of(CUSTOMER_QUERY), - "_a_customer_2168032777_address = _a_customer.address().as(\"address_2138977089\")", - "_a_customer_2168032777_address.DISTRICT", - ".from(_a_customer", - ".from(_a_customer_2168032777_address" - ); - } - - @Test - @DisplayName("Alias declaration for key path with only one possible path between the tables") - void aliasKeyWithSinglePath() { - assertGeneratedContentContains( - "field/keyWithSinglePath", Set.of(CUSTOMER_QUERY), - "customer.address().as(", - "customer_2168032777_address.DISTRICT" - ); - } - - @Test - @DisplayName("Alias declaration for key path with multiple possible paths between the tables") - void aliasKeyWithMultiplePaths() { - assertGeneratedContentContains( - "field/keyWithMultiplePaths", - "film_2185543202_filmoriginallanguageidfkey = _a_film.filmOriginalLanguageIdFkey().as(\"language_3878631203\")", - "film_2185543202_filmoriginallanguageidfkey.NAME", - ".from(_a_film_2185543202_filmoriginallanguageidfkey))" - ); - } - - @Test - @DisplayName("Aliases declaration for two key paths using both at the same time") - void aliasKeyUsingMultiplePaths() { - assertGeneratedContentContains( - "alias/keyUsingMultiplePaths", - "film_2185543202_filmlanguageidfkey = _a_film.filmLanguageIdFkey().as(", - "film_2185543202_filmoriginallanguageidfkey = _a_film.filmOriginalLanguageIdFkey().as(", - "film_2185543202_filmoriginallanguageidfkey.NAME", - "film_2185543202_filmlanguageidfkey.NAME", - ".from(_a_film_2185543202_filmlanguageidfkey", - ".from(_a_film_2185543202_filmoriginallanguageidfkey" - ); - } - - @Test - @DisplayName("Condition path") - void aliasCondition() { - assertGeneratedContentContains( - "field/condition", Set.of(CUSTOMER_QUERY), - "customer_district_district_customer = CUSTOMER.as(", - "customer_district_district_customer.DISTRICT", - ".from(_a_customer_district", - ".where(_a_customer.CUSTOMER_ID.eq(_a_customer_district.CUSTOMER_ID" - ); - } - - @Test - @DisplayName("Table path on a split query") - void splitQuery() { - assertGeneratedContentContains( - "splitQuery/table", Set.of(CUSTOMER_NOT_GENERATED), - "customer.address().as(", - "DSL.row(_a_customer_2168032777_address.getId()", - ".from(_a_customer)", - ".where(DSL.row(_a_customer.CUSTOMER_ID).in(_rk_customer.stream().map(_iv_it -> _iv_it.key().valuesRow()).toList()))" - ); - } - - @Test - @DisplayName("Type containing a table type") - void innerTable() { - assertGeneratedContentContains( - "alias/innerTable", - "customer_2168032777_address = _a_customer.address().as(", - "customer_2168032777_address.getId()" - ); - } - - @Test - @DisplayName("Type with a query that references itself") - void innerTableSelfReference() { - assertGeneratedContentContains( - "alias/innerTableSelfReference", - "film_2185543202_film = _a_film.film().as(", - ".row(DSL.row(_a_film_2185543202_film.FILM_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_film_2185543202_film.FILM_ID)))," + - " _a_film_2185543202_film.getId()" - ); - } - - @Test - @DisplayName("Type containing a table type with a reverse implicit path") - void innerTableReverse() { - assertGeneratedContentContains( - "alias/innerTableReverse", Set.of(CUSTOMER_TABLE), - "address_223244161_customer = _a_address.customer().as(", - "address_223244161_customer.getId()" - ); - } - - @Test - @DisplayName("Both a table and a key set on the same path element") - void tableAndKey() { - assertGeneratedContentContains( - "alias/tableAndKey", Set.of(CUSTOMER_QUERY), - "customer.address().as(" - ); - } - - @Test - @DisplayName("Calls alias correctly when the type has over 22 fields") - void over22Fields() { - assertGeneratedContentContains( - "alias/over22Fields", - "film_2185543202_filmlanguageidfkey.NAME", - "film_2185543202_filmlanguageidfkey.NAME.getDataType().convert(_iv_r[22])" - ); - } - - @Test - @DisplayName("Reference starting from type inheriting a table from an earlier type") - void fromTypeWithoutTable() { - assertGeneratedContentContains( - "alias/fromTypeWithoutTable", Set.of(CUSTOMER_NOT_GENERATED), - "customer_2168032777_address = _a_customer.address().as(" - ); - } - - @Test - @DisplayName("Reference starting from type inheriting a table from an earlier type and the target is not reachable without a reference") - void fromTypeWithoutTableExtraStep() { - assertGeneratedContentContains( - "alias/fromTypeWithoutTableExtraStep", Set.of(CUSTOMER_NOT_GENERATED), - "customer_2168032777_address = _a_customer.address().as(", - "address_2138977089_city = _a_customer_2168032777_address.city().as(" - ); - } - - @Test - @DisplayName("Indirect table path") - void throughTable() { - assertGeneratedContentContains( - "splitQuery/throughTable", Set.of(CUSTOMER_NOT_GENERATED), - "customer.address().as(", "customer_2168032777_address.city().as(" - ); - } - - @Test - @DisplayName("Indirect key path") - void throughKey() { - assertGeneratedContentContains( - "splitQuery/throughKey", Set.of(CUSTOMER_NOT_GENERATED), - "customer.address().as(", "customer_2168032777_address.city().as(" - ); - } - - @Test - @DisplayName("Indirect condition path") - void throughCondition() { - assertGeneratedContentContains( - "splitQuery/throughCondition", Set.of(CUSTOMER_NOT_GENERATED), - "customer_city = CUSTOMER.as(\"", - "customer_city_citycustomer_city = CITY.as(" - ); - } - - @Test - @DisplayName("Path from a table to another table") - void tableToTable() { - assertGeneratedContentContains( - "alias/tableToTable", Set.of(CUSTOMER_QUERY), - "customer.address().as(", - "customer_2168032777_address.city().as(", - "address_2138977089_city.CITY" - ); - } - - @Test - @DisplayName("Path from a table to a key") - void tableToKey() { - assertGeneratedContentContains( - "alias/tableToKey", Set.of(CUSTOMER_QUERY), - "customer.address().as(", - "customer_2168032777_address.city().as(", - "address_2138977089_city.CITY" - ); - } - - @Test - @DisplayName("Path from a table to a condition") - void tableToCondition() { - assertGeneratedContentContains( - "alias/tableToCondition", Set.of(CUSTOMER_QUERY), - "customer.address().as(", - "CITY.as(", - "customer_2168032777_address_cityaddress_city.CITY", - ".cityAddress(_a_customer_2168032777_address, _a_customer_2168032777_address_cityaddress_city)" - ); - } - - @Test - @DisplayName("Reverse path from a table to another table") - void tableToTableReverse() { - assertGeneratedContentContains( - "alias/tableToTableReverse", Set.of(CITY_QUERY), - "city.address().as(", - "city_760939060_address.customer().as(", - "address_609487378_customer.EMAIL" - ); - } - - @Test - @DisplayName("Reverse path from a table to a key") - void tableToKeyReverse() { - assertGeneratedContentContains( - "alias/tableToKeyReverse", Set.of(CITY_QUERY), - "city.address().as(", - "city_760939060_address.customer().as(", - "address_609487378_customer.EMAIL" - ); - } - - @Test - @DisplayName("SplitQuery table path") - void splitQueryTableToTable() { - assertGeneratedContentContains( - "alias/splitQueryTableToTable", - """ - private static SelectField<City> citySplitQueryForAddress_city() { - var _a_address = ADDRESS.as("address_223244161"); - var _a_address_223244161_city = _a_address.city().as("city_621065670"); - var _a_city_621065670_country = _a_address_223244161_city.country().as("country_3426431562"); - return DSL.row( - DSL.field( - DSL.select(_a_city_621065670_country.COUNTRY_) - .from(_a_city_621065670_country) - ) - ).mapping(Functions.nullOnAllNull(City::new)); - } - """ - ); - } - - @Test - @DisplayName("Prevent circular reference loops in nested helper method generation") - void preventCircularHelperMethodGeneration() { - assertGeneratedContentMatches( - "alias/circular-prevention"); - } - - @Test - @DisplayName("Skip nested helper generation for fields with existing split query resolvers") - void preventNestedHelpersForExistingSplitQueryResolvers() { - assertGeneratedContentMatches( - "alias/split-query-skip"); - } - - @Test - @DisplayName("Nested complex reference fields use target table parameters") - void nestedComplexReferenceInSplitQuery() { - assertGeneratedContentMatches( - "alias/complex-reference-params"); - } - - @Test - @DisplayName("Reverse path from a table to a condition") - void tableToConditionReverse() { - assertGeneratedContentContains( - "alias/tableToConditionReverse", Set.of(CITY_QUERY), - "city.address().as(", - "CUSTOMER.as(", - "city_760939060_address_email_customer.EMAIL", - ".email(_a_city_760939060_address, _a_city_760939060_address_email_customer)" - ); - } - - @Test - @DisplayName("Path from a key to another key") - void keyToKey() { - assertGeneratedContentContains( - "alias/keyToKey", Set.of(CUSTOMER_QUERY), - "customer.address().as(", - "customer_2168032777_address.city().as(", - "address_2138977089_city.CITY" - ); - } - - @Test - @DisplayName("Path from a key to a table") - void keyToTable() { - assertGeneratedContentContains( - "alias/keyToTable", Set.of(CUSTOMER_QUERY), - "customer.address().as(", - "customer_2168032777_address.city().as(", - "address_2138977089_city.CITY" - ); - } - - @Test - @DisplayName("Path from a key to a condition") - void keyToCondition() { - assertGeneratedContentContains( - "alias/keyToCondition", Set.of(CUSTOMER_QUERY), - "customer.address().as(", - "CITY.as(", - "customer_2168032777_address_cityaddress_city.CITY", - ".cityAddress(_a_customer_2168032777_address, _a_customer_2168032777_address_cityaddress_city)" - ); - } - - @Test - @DisplayName("Reverse path from a key to another key") - void keyToKeyReverse() { - assertGeneratedContentContains( - "alias/keyToKeyReverse", Set.of(CITY_QUERY), - "city.address().as(", - "city_760939060_address.customer().as(", - "address_609487378_customer.EMAIL" - ); - } - - @Test - @DisplayName("Reverse path from a key to a table") - void keyToTableReverse() { - assertGeneratedContentContains( - "alias/keyToTableReverse", Set.of(CITY_QUERY), - "city.address().as(", - "city_760939060_address.customer().as(", - "address_609487378_customer.EMAIL" - ); - } - - @Test - @DisplayName("Reverse path from a key to a condition") - void keyToConditionReverse() { - assertGeneratedContentContains( - "alias/keyToConditionReverse", Set.of(CITY_QUERY), - "city.address().as(", - "CUSTOMER.as(", - "city_760939060_address_email_customer.EMAIL", - ".email(_a_city_760939060_address, _a_city_760939060_address_email_customer)" - ); - } - - @Test - @DisplayName("Path from a condition to another condition") - void conditionToCondition() { - assertGeneratedContentContains( - "alias/conditionToCondition", Set.of(CUSTOMER_QUERY), - "ADDRESS.as(", - "CITY.as(", - "customer_city_addresscustomer_address_cityaddress_city.CITY", - ".addressCustomer(_a_customer_city, _a_customer_city_addresscustomer_address)", - ".cityAddress(_a_customer_city_addresscustomer_address, _a_customer_city_addresscustomer_address_cityaddress_city)" - ); - } - - @Test - @DisplayName("Path from a condition to a table") - void conditionToTable() { - assertGeneratedContentContains( - "alias/conditionToTable", Set.of(CUSTOMER_QUERY), - "ADDRESS.as(", - "customer_city_addresscustomer_address.city().as(", - "address_4217265996_city.CITY", - ".addressCustomer(_a_customer_city, _a_customer_city_addresscustomer_address)" - ); - } - - @Test - @DisplayName("Path from a condition to a key") - void conditionToKey() { - assertGeneratedContentContains( - "alias/conditionToKey", Set.of(CUSTOMER_QUERY), - "ADDRESS.as(", - "customer_city_addresscustomer_address.city().as(", - "address_4217265996_city.CITY", - ".addressCustomer(_a_customer_city, _a_customer_city_addresscustomer_address)" - ); - } - - @Test - @DisplayName("Reverse path from a condition to another condition") - void conditionToConditionReverse() { - assertGeneratedContentContains( - "alias/conditionToConditionReverse", Set.of(CITY_QUERY), - "ADDRESS.as(", - "CUSTOMER.as(", - "city_email_addresscity_address_email_customer.EMAIL", - ".addressCity(_a_city_email, _a_city_email_addresscity_address)", - ".email(_a_city_email_addresscity_address, _a_city_email_addresscity_address_email_customer)" - ); - } - - @Test - @DisplayName("Reverse path from a condition to a table") - void conditionToTableReverse() { - assertGeneratedContentContains( - "alias/conditionToTableReverse", Set.of(CITY_QUERY), - "ADDRESS.as(", - "city_email_addresscity_address.customer().as(", - "address_3704850880_customer.EMAIL", - ".addressCity(_a_city_email, _a_city_email_addresscity_address)" - ); - } - - @Test - @DisplayName("Reverse path from a condition to a key") - void conditionToKeyReverse() { - assertGeneratedContentContains( - "alias/conditionToKeyReverse", Set.of(CITY_QUERY), - "ADDRESS.as(", - "city_email_addresscity_address.customer().as(", - "address_3704850880_customer.EMAIL", - ".addressCity(_a_city_email, _a_city_email_addresscity_address)" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ReferenceErrorTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ReferenceErrorTest.java deleted file mode 100644 index e157e16c1e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ReferenceErrorTest.java +++ /dev/null @@ -1,23 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.NoSuchElementException; - -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -public class ReferenceErrorTest extends ReferenceTest { - @Override - protected String getSubpath() { - return super.getSubpath() + "/error"; - } - - @Test - @DisplayName("Reference without key from table without primary key") - void onFieldFromTableWithoutPrimaryKey() { - assertThatThrownBy(() -> generateFiles("noKeyFromTableWithoutPrimaryKey")) - .isInstanceOf(IllegalArgumentException.class); - //.hasMessage("Code generation failed for ActorInfo.actor as the table ACTOR_INFO must have a primary key in order to reference another table without a foreign key."); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ReferenceFieldTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ReferenceFieldTest.java deleted file mode 100644 index ce3ac63006..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ReferenceFieldTest.java +++ /dev/null @@ -1,146 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_QUERY; -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_TABLE; - -@DisplayName("Fetch queries - Fetching fields through referenced tables") -public class ReferenceFieldTest extends ReferenceTest { - @Override - protected String getSubpath() { - return super.getSubpath() + "/field"; - } - - @Test - @DisplayName("Table path") - void table() { - assertGeneratedContentContains("table", Set.of(CUSTOMER_QUERY), ".from(_a_customer_2168032777_address"); - } - - @Test - @DisplayName("Reverse table path") - void tableBackwards() { - assertGeneratedContentContains( - "tableBackwards", Set.of(CUSTOMER_TABLE), - ".from(_a_address_223244161_customer" - ); - } - - @Test - @DisplayName("Key path with only one possible path between the tables") - void keyWithSinglePath() { - assertGeneratedContentContains("keyWithSinglePath", Set.of(CUSTOMER_QUERY), ".from(_a_customer_2168032777_address"); - } - - @Test - @DisplayName("Key path with multiple possible paths between the tables") - void keyWithMultiplePaths() { - assertGeneratedContentContains("keyWithMultiplePaths", ".from(_a_film_2185543202_filmoriginallanguageidfkey"); - } - - @Test - @DisplayName("Reverse key path") - void keyBackwards() { - assertGeneratedContentContains( - "keyBackwards", Set.of(CUSTOMER_TABLE), - ".from(_a_address_223244161_customer" - ); - } - - @Test - @DisplayName("Condition path") - void condition() { // Path exists but is overridden by condition. - assertGeneratedContentContains( - "condition", Set.of(CUSTOMER_QUERY), - ".join(_a_customer_district_district_customer).on(", - ".district(_a_customer_district, _a_customer_district_district_customer)", - ".where(_a_customer.CUSTOMER_ID.eq(_a_customer_district.CUSTOMER_ID" - ); - } - - @Test - @DisplayName("Reference on a nullable field") - void nullableField() { - assertGeneratedContentContains( - "nullableField", Set.of(CUSTOMER_QUERY), - "customer_2168032777_address.DISTRICT", - ".from(_a_customer_2168032777_address" - ); - } - - @Test - @DisplayName("Both a table and a condition set on the same path element") - void tableAndCondition() { - assertGeneratedContentContains( - "tableAndCondition", Set.of(CUSTOMER_QUERY), - "customer_district_district_address = ADDRESS.as(", // Note, no implicit join anymore. - ".join(_a_customer_district_district_address).on(", - ".district(_a_customer_district, _a_customer_district_district_address)" // Note, condition overrides as it uses "on". - ); - } - - @Test - @DisplayName("Both a key and a condition set on the same path element") - void keyAndCondition() { - assertGeneratedContentContains( - "keyAndCondition", Set.of(CUSTOMER_QUERY), - "customer_2168032777_address = _a_customer.address().as(", // Note, implicit join is present when we use a key, but not table. - ".from(_a_customer_2168032777_address).where(", - ".district(_a_customer, _a_customer_2168032777_address)" // Note, this produces a strange result with an ".and" and no ".on" or ".where". - ); - } - - @Test - @DisplayName("Multiple references to the same table") - void multipleToSameTable() { - assertGeneratedContentContains( - "multipleToSameTable", Set.of(CUSTOMER_QUERY), - "customer_2168032777_address.DISTRICT", - ".from(_a_customer_2168032777_address" - ); - } - - @Test - @DisplayName("Table path on a list of fields without split query") - void list() { - assertGeneratedContentContains( - "list", Set.of(CUSTOMER_QUERY), - "DSL.multiset(", - "customer_2168032777_address.ADDRESS_ID", - ".from(_a_customer_2168032777_address)" - ); - } - - @Test - @DisplayName("Wrapper with @reference key to table type") - void wrapperWithKey() { - assertGeneratedContentContains( - "wrapperWithKey", - """ - private static SelectField<Film> queryForQuery_film() { - var _a_film = FILM.as("film_2185543202"); - var _a_film_2185543202_filmlanguageidfkey = _a_film.filmLanguageIdFkey().as("language_4253626089"); - return DSL.row( - DSL.row( - DSL.field( - DSL.select(_1_queryForQuery_film_language()) - .from(_a_film_2185543202_filmlanguageidfkey) - ) - ).mapping(Functions.nullOnAllNull(LanguageWrapper::new)) - ).mapping(Functions.nullOnAllNull(Film::new)); - } - """, - """ - private static SelectField<Language> _1_queryForQuery_film_language() { - var _a_film = FILM.as("film_2185543202"); - var _a_film_2185543202_filmlanguageidfkey = _a_film.filmLanguageIdFkey().as("language_4253626089"); - return DSL.row(_a_film_2185543202_filmlanguageidfkey.NAME).mapping(Functions.nullOnAllNull(Language::new)); - } - """ - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ReferenceInputTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ReferenceInputTest.java deleted file mode 100644 index d981fff96a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ReferenceInputTest.java +++ /dev/null @@ -1,243 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.InterfaceOnlyFetchDBClassGenerator; -import no.sikt.graphitron.reducedgenerators.MapOnlyFetchDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_TABLE; - -@DisplayName("Fetch queries - Inputs through referenced tables") -public class ReferenceInputTest extends ReferenceTest { - @Override - protected String getSubpath() { - return super.getSubpath() + "/input"; - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new MapOnlyFetchDBClassGenerator(schema), new InterfaceOnlyFetchDBClassGenerator(schema)); - } - - @Test - @DisplayName("Table path") - void table() { - assertGeneratedContentContains("table", Set.of(CUSTOMER_TABLE), - ".leftJoin(_a_customer_2168032777_address_left", - ".where(_a_customer_2168032777_address_left.DISTRICT.eq(_mi_district" - ); - } - - @Test - @DisplayName("Reverse table path - uses EXISTS to avoid row duplication from one-to-many LEFT JOIN") - void tableBackwards() { - assertGeneratedContentContains( - "tableBackwards", Set.of(CUSTOMER_TABLE), - "DSL.exists(DSL.selectOne().from(_a_address_223244161_customer_left).where(", - "customer_left.ADDRESS_ID.eq(_a_address.ADDRESS_ID)" - ); - } - - @Test - @DisplayName("Key path with only one possible path between the tables") - void keyWithSinglePath() { - assertGeneratedContentContains( - "keyWithSinglePath", Set.of(CUSTOMER_TABLE), - ".leftJoin(_a_customer_2168032777_address_left", - ".where(_a_customer_2168032777_address_left.DISTRICT.eq(_mi_district" - ); - } - - @Test - @DisplayName("Key path with multiple possible paths between the tables") - void keyWithMultiplePaths() { - assertGeneratedContentContains( - "keyWithMultiplePaths", - ".leftJoin(_a_film_2185543202_filmoriginallanguageidfkey_left", - ".where(_a_film_2185543202_filmoriginallanguageidfkey_left.NAME.eq(_mi_name" - ); - } - - @Test - @DisplayName("Reverse key path - uses EXISTS to avoid row duplication from one-to-many LEFT JOIN") - void keyBackwards() { - assertGeneratedContentContains( - "keyBackwards", Set.of(CUSTOMER_TABLE), - "DSL.exists(DSL.selectOne().from(_a_address_223244161_customer_left).where(", - "customer_left.ADDRESS_ID.eq(_a_address.ADDRESS_ID)" - ); - } - - @Test - @DisplayName("Condition path") - void condition() { - assertGeneratedContentContains( - "condition", Set.of(CUSTOMER_TABLE), - ".leftJoin(_a_customer_district_customer_left", - ".district(_a_customer, _a_customer_district_customer_left)", - ".where(_a_customer_district_customer_left.DISTRICT.eq(_mi_district" - ); - } - - @Test - @DisplayName("Reference on a nullable field") - void nullableField() { - assertGeneratedContentContains( - "nullableField", Set.of(CUSTOMER_TABLE), - "customer_2168032777_address_left.DISTRICT", - ".leftJoin(_a_customer_2168032777_address_left" - ); - } - - @Test - @DisplayName("Both a table and a condition set on the same path element") - void tableAndCondition() { - assertGeneratedContentContains( - "tableAndCondition", Set.of(CUSTOMER_TABLE), - "customer_district_address_left = ADDRESS.as(", // Note, no implicit join anymore. - ".leftJoin(_a_customer_district_address_left).on(", - ".district(_a_customer, _a_customer_district_address_left)" // Note, condition overrides as it uses "on". - ); - } - - @Test - @DisplayName("Both a key and a condition set on the same path element") - void keyAndCondition() { - assertGeneratedContentContains( - "keyAndCondition", Set.of(CUSTOMER_TABLE), - "customer_2168032777_address_left = _a_customer.address().as(", // Note, implicit join is present when we use a key, but not table. - ".leftJoin(_a_customer_2168032777_address_left).where(_a_customer_2168032777_address_left.DISTRICT.eq(_mi_district)).and(", - ".district(_a_customer, _a_customer_2168032777_address_left)" // Note, no condition override unlike table case. - ); - } - - @Test - @DisplayName("Reference used inside an input type") - void insideInputType() { - assertGeneratedContentContains( - "insideInputType", Set.of(CUSTOMER_TABLE), - ".leftJoin(_a_customer_2168032777_address_left", - ".where(_a_customer_2168032777_address_left.DISTRICT.eq(_mi_in.getDistrict()" - ); - } - - @Test // TODO: This behaviour is undefined and results in illegal code. - @DisplayName("Reference used on an input type") - void onInputType() { - assertGeneratedContentContains("onInputType", Set.of(CUSTOMER_TABLE), "customer.DISTRICT.eq(_mi_in.getDistrict())"); - } - - @Test - @DisplayName("Multiple references to the same table") - void multipleToSameTable() { - assertGeneratedContentContains("multipleToSameTable", Set.of(CUSTOMER_TABLE), - ".leftJoin(_a_customer_2168032777_address_left", - ".where(_a_customer_2168032777_address_left.DISTRICT.eq(_mi_district1", - ".and(_a_customer_2168032777_address_left.DISTRICT.eq(_mi_district2" // Silly case, but valid. - ); - } - - @Test - @DisplayName("On field returning single table interface") - void onSingleTableInterface() { - assertGeneratedContentContains("onSingleTableInterface", - "= _a_address.city()", - ".and(_a_address_223244161_city_left.CITY_.eq(_mi_filter.getCity()))", - ".leftJoin(_a_address_223244161_city_left)" - ); - } - - @Test - @DisplayName("Input with table and return type with field having reference") - void inputWithTableReturnTypeWithScalarReference() { - var generated = generateFiles("inputWithTableReturnTypeWithScalarReference"); - contains(generated, - "_a_city_760939060_country = _a_city.country()", - "_a_city_760939060_country.COUNTRY_" - ); - - doesNotContain(generated, "city()"); - } - - @Test - @DisplayName("Split query with input parameters - helper methods exclude input parameters") - void keyWithMultiplePathsAndNestedSplitQuery() { - assertGeneratedContentContains( - "keyWithMultiplePathsAndNestedSplitQuery", - "DSL.select(filmsForLanguage_film())", - "private static SelectField<Film> filmsForLanguage_film()" - ); - } - - @Test - @DisplayName("Reverse condition path - one-to-many with condition uses EXISTS with condition inside") - void conditionBackwards() { - assertGeneratedContentContains("conditionBackwards", - "DSL.exists(DSL.selectOne().from(_a_address_email_customer_left).where(", - ".email(_a_address, _a_address_email_customer_left)" - ); - } - - @Test - @DisplayName("Reverse key+condition path - condition appears inside EXISTS") - void keyAndConditionBackwards() { - assertGeneratedContentContains("keyAndConditionBackwards", - "DSL.exists(DSL.selectOne().from(_a_address_223244161_customer_left).where(", - ".email(_a_address, _a_address_223244161_customer_left)"); - } - - @Test - @DisplayName("Multi-step path with one-to-many as final step uses EXISTS for the last join") - void multiStepEndingInOneToMany() { - assertGeneratedContentContains("multiStepEndingInOneToMany", Set.of(CUSTOMER_TABLE), - ".leftJoin(_a_customer_2168032777_address_left)", - "DSL.exists(DSL.selectOne().from(_a_address_2138977089_staff_left).where(" - ); - } - - @Test - @DisplayName("Reverse key path with bidirectional FKs uses EXISTS when key disambiguates direction") - void reverseWithMultiplePaths() { - // Store and Staff have FKs in both directions (STAFF__STAFF_STORE_ID_FKEY and STORE__STORE_MANAGER_STAFF_ID_FKEY). - // The explicit key ensures the reverse (one-to-many) direction is detected and wrapped in EXISTS. - assertGeneratedContentContains( - "reverseWithMultiplePaths", - "DSL.exists(DSL.selectOne().from(_a_store_", - "_left).where(", - ".STORE_ID.eq(_a_store.STORE_ID)" - ); - } - - @Test - @DisplayName("Table path to table with self-referencing FK") - void referencingTableWithSelfReference() { - assertGeneratedContentContains( - "referencingTableWithSelfReference", - ".where(_a_filmactor_3175015397_film_left.FILM_ID.eq(_mi_filmId))" - ); - - resultDoesNotContain( - "referencingTableWithSelfReference", - "_a_filmactor_3175015397_film_left.film()" - ); - } - - @Test - @DisplayName("Reverse key path to table with self-referencing FK") - void referencingTableWithSelfReferenceReverse() { - assertGeneratedContentContains( - "referencingTableWithSelfReferenceReverse", - "selectOne().from(_a_language_3571151285_filmlanguageidfkey_left)" - ); - - resultDoesNotContain( - "referencingTableWithSelfReferenceReverse", - ".film()" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ReferenceMultipleTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ReferenceMultipleTest.java deleted file mode 100644 index 8132f24237..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ReferenceMultipleTest.java +++ /dev/null @@ -1,19 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -@DisplayName("Fetch queries - Multiple references to the same table from different sources") -public class ReferenceMultipleTest extends ReferenceTest { - @Test - @DisplayName("From a field and an input") - void multipleToSameTable() { - assertGeneratedContentContains( - "multipleToSameTable", - "customer_2168032777_address.DISTRICT", - ".leftJoin(_a_customer_2168032777_address_left", - ".where(_a_customer_2168032777_address_left.DISTRICT.eq(_mi_district" - ); - } - -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ReferenceSplitQueryTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ReferenceSplitQueryTest.java deleted file mode 100644 index 9dd0f37050..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ReferenceSplitQueryTest.java +++ /dev/null @@ -1,484 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.*; -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("Fetch queries - Fetching through referenced tables with splitQuery-directive") -public class ReferenceSplitQueryTest extends ReferenceTest { - - // Disabled until GGG-104 - @Override - protected boolean validateSchema() { - return false; - } - - @Override - protected String getSubpath() { - return super.getSubpath() + "/splitQuery"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(REFERENCE_CUSTOMER_CONDITION, REFERENCE_FILM_CONDITION, JAVA_RECORD_CUSTOMER, PAYMENT_CONDITION); - } - - @Test - @Disabled("Disabled until alwaysUsePrimaryKeyInSplitQueries-property is removed.") - @DisplayName("Foreign key columns should be selected in previous query") - void previousQuery() { - assertGeneratedContentContains( - "previousQuery", Set.of(CUSTOMER_QUERY), - "DSL.row(DSL.row(_a_customer.ADDRESS_ID)).mapping(Functions.nullOnAllNull(Customer::new" - ); - } - - @Test - @DisplayName("Primary key columns should be selected in previous query") - void previousQueryOnlyPrimaryKey() { - assertGeneratedContentContains( - "previousQuery", Set.of(CUSTOMER_QUERY), - "DSL.row(DSL.row(_a_customer.CUSTOMER_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_customer.CUSTOMER_ID))))" + - ".mapping(Functions.nullOnAllNull(Customer::new" - ); - } - - @Test - @DisplayName("Primary key columns should be selected in previous query on paginated fields") - void previousQueryPaginated() { - assertGeneratedContentContains( - "previousQueryPaginated", Set.of(CUSTOMER_CONNECTION), - "DSL.row(DSL.row(_a_store.STORE_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_store.STORE_ID))))" + - ".mapping(Functions.nullOnAllNull(Store::new" - ); - } - - @Test - @DisplayName("Primary key columns should be selected in previous query on condition path") - void previousQueryConditionPath() { - assertGeneratedContentContains( - "previousQueryConditionPath", Set.of(CUSTOMER_QUERY), - "DSL.row(DSL.row(_a_customer.CUSTOMER_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_customer.CUSTOMER_ID))))" + - ".mapping(Functions.nullOnAllNull(Customer::new" - ); - } - - @Test - @Disabled("Disabled until alwaysUsePrimaryKeyInSplitQueries-property is removed.") - @DisplayName("Foreign key columns should be selected in previous query in nested type") - void previousQueryNested() { - assertGeneratedContentContains( - "previousQueryNested", Set.of(CUSTOMER_QUERY), - "row(_a_customer_2168032777_address.CITY_ID), _a_customer_2168032777_address.getId())" + - ".mapping(Functions.nullOnAllNull(Address::" - ); - } - - @Test - @DisplayName("Primary key columns should be selected in previous query in nested type") - void previousQueryNestedOnlySplitQuery() { - assertGeneratedContentContains( - "previousQueryNested", Set.of(CUSTOMER_QUERY), - "row(_a_customer_2168032777_address.ADDRESS_ID)" + - ".convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_customer_2168032777_address.ADDRESS_ID)))," + - "_a_customer_2168032777_address.getId())" + - ".mapping(Functions.nullOnAllNull(Address::" - ); - } - - @Test - @DisplayName("Primary key columns should be selected in previous query for field returning single table interface") - void previousQuerySingleTableInterface() { - assertGeneratedContentContains( - "previousQuerySingleTableInterface", Set.of(ADDRESS_BY_DISTRICT), - "row(DSL.row(_a_city.CITY_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_city.CITY_ID)))).mapping" - ); - } - - @Test - @DisplayName("Primary key columns should be selected in previous query for field returning multitable interface") - void previousQueryMultitableInterface() { - assertGeneratedContentContains( - "previousQueryMultitableInterface", - "row(DSL.row(_a_filmcategory.FILM_ID, _a_filmcategory.CATEGORY_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_filmcategory.FILM_ID, _a_filmcategory.CATEGORY_ID)))).mapping" - ); - } - - @Test - @DisplayName("Primary key columns should be selected in previous query for field returning multitable union") - void previousQueryMultitableUnion() { - assertGeneratedContentContains( - "previousQueryMultitableUnion", - "row(_a_filmcategory.FILM_ID, _a_filmcategory.CATEGORY_ID)" + - ".convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_filmcategory.FILM_ID, _a_filmcategory.CATEGORY_ID))))" + - ".mapping(Functions.nullOnAllNull(FilmCategory::" - ); - } - - @Test - @DisplayName("Table path") - void table() { - assertGeneratedContentContains( - "table", Set.of(CUSTOMER_NOT_GENERATED), - ".from(_a_customer_2168032777_address" - ); - } - - @Test - @DisplayName("Reverse table path") - void tableBackwards() { - assertGeneratedContentContains( - "tableBackwards", Set.of(CUSTOMER_TABLE), - ".from(_a_address_223244161_customer" - ); - } - - @Test - @DisplayName("Key path with only one possible path between the tables") - void keyWithSinglePath() { - assertGeneratedContentContains( - "keyWithSinglePath", Set.of(CUSTOMER_NOT_GENERATED), - ".from(_a_customer_2168032777_address" - ); - } - - @Test - @DisplayName("Key path with multiple possible paths between the tables") - void keyWithMultiplePaths() { - assertGeneratedContentContains( - "keyWithMultiplePaths", - ".from(_a_film_2185543202_filmoriginallanguageidfkey" - ); - } - - @Test - @DisplayName("Key path with multiple possible paths between the tables in a nested setting") - void keyWithMultiplePathsAndNestedSplitQuery() { - assertGeneratedContentContains( - "keyWithMultiplePathsAndNestedSplitQuery", - """ - private static SelectField<Language> _1_filmsWithoutPaginationForLanguage_film_language() { - var _a_language = LANGUAGE.as("language_3571151285"); - var _a_language_3571151285_filmlanguageidfkey = _a_language.filmLanguageIdFkey().as("film_4095514247"); - var _a_film_4095514247_filmlanguageidfkey = _a_language_3571151285_filmlanguageidfkey.filmLanguageIdFkey().as("language_4281699989"); - return DSL.row( - DSL.row(_a_film_4095514247_filmlanguageidfkey.LANGUAGE_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_film_4095514247_filmlanguageidfkey.LANGUAGE_ID))), - _a_film_4095514247_filmlanguageidfkey.getId(), - _a_film_4095514247_filmlanguageidfkey.NAME - ).mapping(Functions.nullOnAllNull(Language::new)); - } - """ - ); - } - - @Test - @DisplayName("Reverse key path") - void keyBackwards() { - assertGeneratedContentContains( - "keyBackwards", Set.of(CUSTOMER_TABLE), - ".from(_a_address_223244161_customer" - ); - } - - @Test - @DisplayName("Condition path") - void condition() { - assertGeneratedContentContains( - "condition", Set.of(CUSTOMER_NOT_GENERATED), - "join(_a_customer_address_addresscustomer_address).on(", - ".addressCustomer(_a_customer_address, _a_customer_address_addresscustomer_address)", - ".where(_a_customer.CUSTOMER_ID.eq(_a_customer_address.CUSTOMER_ID" - ); - } - - @Test - @DisplayName("Reference on a nullable field") - void nullableField() { - assertGeneratedContentContains( - "nullableField", Set.of(CUSTOMER_NOT_GENERATED), - ".from(_a_customer_2168032777_address" - ); - } - - @Test - @DisplayName("Both a table and a condition set on the same path element") - void tableAndCondition() { - assertGeneratedContentContains( - "tableAndCondition", Set.of(CUSTOMER_NOT_GENERATED), - "customer_address_addresscustomer_address = ADDRESS.as(", // Note, no implicit join anymore. - ".join(_a_customer_address_addresscustomer_address).on(", - ".addressCustomer(_a_customer_address, _a_customer_address_addresscustomer_address)" // Note, condition overrides as it uses "on". - ); - } - - @Test - @DisplayName("Both a key and a condition set on the same path element") - void keyAndCondition() { - assertGeneratedContentContains( - "keyAndCondition", Set.of(CUSTOMER_NOT_GENERATED), - "customer_2168032777_address = _a_customer.address().as(", // Note, implicit join is present when we use a key, but not table. - ".from(_a_customer_2168032777_address).where(", - ".addressCustomer(_a_customer, _a_customer_2168032777_address)", // Note, no condition override unlike table case. - ".where(DSL.row(_a_customer.CUSTOMER_ID).in(_rk_customer" - ); - } - - @Test - @DisplayName("Indirect table path") - void throughTable() { - assertGeneratedContentContains( - "throughTable", Set.of(CUSTOMER_NOT_GENERATED), - ".from(_a_customer_2168032777_address", - ".join(_a_address_2138977089_city" - ); - } - - @Test - @DisplayName("Indirect key path") - void throughKey() { - assertGeneratedContentContains( - "throughKey", Set.of(CUSTOMER_NOT_GENERATED), - ".from(_a_customer_2168032777_address", - ".join(_a_address_2138977089_city" - ); - } - - @Test - @DisplayName("Indirect condition path") - void throughCondition() { - assertGeneratedContentContains( - "throughCondition", Set.of(CUSTOMER_NOT_GENERATED), - ".join(_a_customer_city_citycustomer_city).on(", - ".cityCustomer(_a_customer_city, _a_customer_city_citycustomer_city)" - ); - } - - @Test - @DisplayName("Indirect reverse table path") - void throughTableBackwards() { - assertGeneratedContentContains( - "throughTableBackwards", Set.of(CUSTOMER_TABLE), - ".from(_a_city_760939060_address", - ".join(_a_address_609487378_customer" - ); - } - - @Test - @DisplayName("Table path on a list with split query") - void list() { - assertGeneratedContentContains( - "list", Set.of(CUSTOMER_NOT_GENERATED), - ".from(_a_customer_2168032777_address)", - "DSL.multiset(DSL.select(", - ".fetchMap(Record2::value1, _iv_r -> _iv_r.value2().map(Record1::value1))" - ); - } - - @Test - @DisplayName("Table path on a nullable list with split query") - void nullableList() { - assertGeneratedContentContains( - "nullableList", Set.of(CUSTOMER_NOT_GENERATED), - ".from(_a_customer_2168032777_address)" - ); - } - - @Test - @DisplayName("Table path to the same table as source") - void selfTableReference() { - assertGeneratedContentContains( - "selfTableReference", - "film.film().as(", - "film_2185543202_film.getId()", - ".from(_a_film_2185543202_film" - ); - } - - @Test - @DisplayName("Key path to the same table as source") - void selfKeyReference() { - assertGeneratedContentContains( - "selfKeyReference", - "film.film().as(", - "film_2185543202_film.getId()", - ".from(_a_film_2185543202_film" - ); - } - - @Test - @DisplayName("Condition path to the same table as source") - void selfConditionReference() { - assertGeneratedContentContains( - "selfConditionReference", - "FILM.as(", - "film_sequel_sequel_film.getId()", - ".join(_a_film_sequel_sequel_film).on(", - ".sequel(_a_film_sequel, _a_film_sequel_sequel_film" - ); - } - - @Test - @DisplayName("Reference from multi table interface") - void fromMultitableInterface() { - assertGeneratedContentContains( - "fromMultitableInterface", Set.of(CUSTOMER_TABLE), - "DSL.row(_a_payment.PAYMENT_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_payment.PAYMENT_ID))), DSL.field(", - "customerForPayment_customerTable()).from(_a_payment_1831371789_customer)", - ".from(_a_payment).where(DSL.row(_a_payment.PAYMENT_ID).in(_rk_payment" - ); - } - - @Test - @DisplayName("Temporary test for reference ID argument (not node strategy) outside root ") - void idArgumentOnNonRootQueryWithoutNodeStrategy() { - assertGeneratedContentContains( - "idArgumentOnNonRootQueryWithoutNodeStrategy", Set.of(CUSTOMER_TABLE), - "customer_1589604633_store_left.hasStaffId(_mi_staffId)" - ); - - } - - @Test - @DisplayName("splitQuery field after service returning java record") - void afterJavaService() { - assertGeneratedContentContains( - "afterJavaService", Set.of(CUSTOMER_TABLE), - "Set<AddressRecord> _rk_customer", - ".select(DSL.row(_a_address.ADDRESS_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_address.ADDRESS_ID))), addressForCustomer_address(", - ".from(_a_address)" + - ".where(DSL.row(_a_address.ADDRESS_ID).in(_rk_customer.stream().map(_iv_it -> _iv_it.key().valuesRow()).toList()))" + - ".fetchMap(Record2::value1, Record2::value2)" - ); - } - - @Test - @DisplayName("splitQuery on table with self-referencing FK after service") - void tableWithSelfReferenceAfterJavaService() { - resultDoesNotContain( - "tableWithSelfReferenceAfterJavaService", - "_a_film.film()" - ); - - assertGeneratedContentContains( - "tableWithSelfReferenceAfterJavaService", - ".from(_a_film).where(DSL.row(_a_film.FILM_ID", - "_iv_orderFields = _a_film.fields", - "row(_a_film.getId()).mapping" - ); - } - - @Test - @DisplayName("Listed splitQuery field after service returning java record") - void afterJavaServiceListed() { - assertGeneratedContentContains( - "afterJavaServiceListed", Set.of(CUSTOMER_TABLE), - "Map<AddressRecord, Address> addressForCustomer(DSLContext _iv_ctx, Set<AddressRecord> _rk_customer", - ".select(DSL.row(_a_address.ADDRESS_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_address.ADDRESS_ID))), addressForCustomer_address(" - ); - } - - @Test - @DisplayName("Nested splitQuery field after service returning java record") - void afterJavaServiceNested() { - assertGeneratedContentContains( - "afterJavaServiceNested", Set.of(CUSTOMER_TABLE), - ".select(DSL.row(_a_address.ADDRESS_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_address.ADDRESS_ID))), addressForWrapper_address(" - ); - } - - @Test - @DisplayName("Split query helpers with complex paths declare only valid alias chains") - void splitQueryComplexReferencePathAliasFiltering() { - assertGeneratedContentContains( - "viaTables", Set.of(CUSTOMER_TABLE), - """ - private static SelectField<Store> storesThatHaveThisFilmForFilm_store() { - var _a_film = FILM.as("film_2185543202"); - var _a_film_2185543202_inventory = _a_film.inventory().as("inventory_744357058"); - var _a_inventory_744357058_store = _a_film_2185543202_inventory.store().as("store_3638207731"); - return DSL.row(_a_inventory_744357058_store.getId()).mapping(Functions.nullOnAllNull(Store::new)); - }""" - , - """ - private static SelectField<City> citiesWhereFilmIsStockedForFilm_city() { - var _a_film = FILM.as("film_2185543202"); - var _a_film_2185543202_inventory = _a_film.inventory().as("inventory_744357058"); - var _a_inventory_744357058_store = _a_film_2185543202_inventory.store().as("store_3638207731"); - var _a_store_3638207731_address = _a_inventory_744357058_store.address().as("address_2813127756"); - var _a_address_2813127756_city = _a_store_3638207731_address.city().as("city_3468131846"); - var _a_city_3468131846_address = _a_address_2813127756_city.address().as("address_2618309002"); - var _a_address_2618309002_customer = _a_city_3468131846_address.customer().as("customer_672486254"); - var _a_customer_672486254_payment = _a_address_2618309002_customer.payment().as("payment_3112599430"); - return DSL.row( - _a_address_2813127756_city.getId(), - DSL.row( - DSL.multiset( - DSL.select(_1_citiesWhereFilmIsStockedForFilm_city_payments()) - .from(_a_city_3468131846_address) - .join(_a_address_2618309002_customer) - .join(_a_customer_672486254_payment) - .orderBy(_a_customer_672486254_payment.fields(_a_customer_672486254_payment.getPrimaryKey().getFieldsArray())) - ) - ).mapping(_iv_e -> _iv_e.map(Record1::value1)) - ).mapping(Functions.nullOnAllNull(City::new)); - }""", - """ - private static SelectField<Payment> _1_citiesWhereFilmIsStockedForFilm_city_payments() { - var _a_film = FILM.as("film_2185543202"); - var _a_film_2185543202_inventory = _a_film.inventory().as("inventory_744357058"); - var _a_inventory_744357058_store = _a_film_2185543202_inventory.store().as("store_3638207731"); - var _a_store_3638207731_address = _a_inventory_744357058_store.address().as("address_2813127756"); - var _a_address_2813127756_city = _a_store_3638207731_address.city().as("city_3468131846"); - var _a_city_3468131846_address = _a_address_2813127756_city.address().as("address_2618309002"); - var _a_address_2618309002_customer = _a_city_3468131846_address.customer().as("customer_672486254"); - var _a_customer_672486254_payment = _a_address_2618309002_customer.payment().as("payment_3112599430"); - return DSL.row(_a_customer_672486254_payment.getId()).mapping(Functions.nullOnAllNull(Payment::new)); - } - """ - ); - } - - @Test - @DisplayName("Helper methods declare condition-based join aliases for @reference fields") - void nestedFieldWithoutParentConditions() { - // This test uses Customer -> Payment (splitQuery) -> Staff (with condition) - // The Payment.staff field has a condition-based @reference that uses PAYMENT_CONDITION.paymentStaff() - // The helper method must declare the intermediate aliases (_a_payment_staff, _a_payment_staff_paymentstaff_staff) - // that are used in the condition join, even though they use table constants (not derived from parameters) - assertGeneratedContentContains( - "nestedFieldWithoutParentConditions", Set.of(CUSTOMER_TABLE), - // Helper method should declare both condition-based join aliases - """ - private static SelectField<Payment> paymentsForCustomer_payment() { - var _a_customer = CUSTOMER.as("customer_2168032777"); - var _a_customer_2168032777_payment = _a_customer.payment().as("payment_521722061"); - var _a_payment_staff = PAYMENT.as("payment_1053299965"); - var _a_payment_staff_paymentstaff_staff = STAFF.as("staff_3518249830"); - return DSL.row( - _a_customer_2168032777_payment.PAYMENT_ID, - _a_customer_2168032777_payment.AMOUNT, - DSL.field( - DSL.select(_1_paymentsForCustomer_payment_staff()) - .from(_a_payment_staff) - .join(_a_payment_staff_paymentstaff_staff) - .on(no.sikt.graphitron.codereferences.conditions.PaymentCondition.paymentStaff(_a_payment_staff, _a_payment_staff_paymentstaff_staff)) - .where(_a_customer_2168032777_payment.PAYMENT_ID.eq(_a_payment_staff.PAYMENT_ID)) - ) - ).mapping(Functions.nullOnAllNull(Payment::new)); - } - private static SelectField<Staff> _1_paymentsForCustomer_payment_staff() { - var _a_payment_staff_paymentstaff_staff = STAFF.as("staff_3518249830"); - return DSL.row( - _a_payment_staff_paymentstaff_staff.STAFF_ID, - _a_payment_staff_paymentstaff_staff.FIRST_NAME - ).mapping(Staff::new); - }""" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ReferenceSubqueryTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ReferenceSubqueryTest.java deleted file mode 100644 index e1d1e1896e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ReferenceSubqueryTest.java +++ /dev/null @@ -1,117 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_QUERY; -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_TABLE; - -// Note that these are mostly copies from ReferenceQueryTest. Many cases from there are omitted here. -@DisplayName("Fetch queries - Fetching rows through referenced tables in correlated subqueries") -public class ReferenceSubqueryTest extends ReferenceTest { - @Override - protected String getSubpath() { - return super.getSubpath() + "/subquery"; - } - - @Test - @DisplayName("Table path") - void table() { - assertGeneratedContentContains( - "table", Set.of(CUSTOMER_QUERY), - ".from(_a_customer_2168032777_address" - ); - } - - @Test - @DisplayName("Key path with only one possible path between the tables") - void keyWithSinglePath() { - assertGeneratedContentContains( - "keyWithSinglePath", Set.of(CUSTOMER_QUERY), - ".from(_a_customer_2168032777_address" - ); - } - - @Test - @DisplayName("Key path with multiple possible paths between the tables") - void keyWithMultiplePaths() { - assertGeneratedContentContains( - "keyWithMultiplePaths", - ".from(_a_film_2185543202_filmoriginallanguageidfkey" - ); - } - - @Test - @DisplayName("Condition path") - void condition() { - assertGeneratedContentContains( - "condition", Set.of(CUSTOMER_QUERY), - "join(_a_customer_address_addresscustomer_address).on(", - ".addressCustomer(_a_customer_address, _a_customer_address_addresscustomer_address)", - ".where(_a_customer.CUSTOMER_ID.eq(_a_customer_address.CUSTOMER_ID" - ); - } - - @Test - @DisplayName("Indirect table path") - void throughTable() { - assertGeneratedContentContains( - "throughTable", Set.of(CUSTOMER_QUERY), - ".from(_a_customer_2168032777_address", - ".join(_a_address_2138977089_city" - ); - } - - @Test - @DisplayName("Indirect key path") - void throughKey() { - assertGeneratedContentContains( - "throughKey", Set.of(CUSTOMER_QUERY), - ".from(_a_customer_2168032777_address", - ".join(_a_address_2138977089_city" - ); - } - - @Test - @DisplayName("Indirect condition path") - void throughCondition() { - assertGeneratedContentContains( - "throughCondition", Set.of(CUSTOMER_QUERY), - ".join(_a_customer_city_citycustomer_city).on(", - ".cityCustomer(_a_customer_city, _a_customer_city_citycustomer_city)", - ".where(_a_customer.CUSTOMER_ID.eq(_a_customer_city.CUSTOMER_ID" - ); - } - - @Test - @DisplayName("Indirect reverse table path") - void throughTableBackwards() { - assertGeneratedContentContains( - "throughTableBackwards", Set.of(CUSTOMER_TABLE), - ".from(_a_city_760939060_address", - ".join(_a_address_609487378_customer" - ); - } - - @Test - @DisplayName("Table path on a list") - void list() { - assertGeneratedContentContains( - "list", Set.of(CUSTOMER_TABLE, CUSTOMER_QUERY), - ".from(_a_customer_2168032777_address)" - ); - } - - @Test - @DisplayName("Table path on nested lists") - void nestedLists() { - assertGeneratedContentContains( - "nestedLists", Set.of(CUSTOMER_QUERY), - ".select(_1_queryForQuery_customer_address()).from(_a_customer_2168032777_address)", - ".select(_2_queryForQuery_customer_address_stores()).from(_a_address_2138977089_store)" - ); - } - -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ReferenceTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ReferenceTest.java deleted file mode 100644 index f8c3fabdfc..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/ReferenceTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.InterfaceOnlyFetchDBClassGenerator; -import no.sikt.graphitron.reducedgenerators.MapOnlyFetchDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.REFERENCE_CUSTOMER_CONDITION; - -abstract public class ReferenceTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/fetch/references"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(REFERENCE_CUSTOMER_CONDITION); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new MapOnlyFetchDBClassGenerator(schema)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/SelectHelperMethodCallTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/SelectHelperMethodCallTest.java deleted file mode 100644 index cc08a15266..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/SelectHelperMethodCallTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.QueryOnlyHelperDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.PAYMENT_CONDITION; - -@DisplayName("Helper method generation and calling") -public class SelectHelperMethodCallTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/fetch/selectHelperMethods"; - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new QueryOnlyHelperDBClassGenerator(schema)); - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(PAYMENT_CONDITION); - } - - @Test - @DisplayName("Helper methods with correlated WHERE clauses should not reference undefined parent aliases") - void correlatedSubqueryReferencesPossibleOutput() { - assertGeneratedContentMatches("correlatedSubqueryReferences"); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/SelectHelperMethodEntityTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/SelectHelperMethodEntityTest.java deleted file mode 100644 index 0f5c97b03d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/SelectHelperMethodEntityTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.EntityOnlyHelperDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.FEDERATION_QUERY; - -@DisplayName("Helper method generation and naming for entity queries") -public class SelectHelperMethodEntityTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/fetch/selectHelperMethodsEntity"; - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new EntityOnlyHelperDBClassGenerator(schema)); - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(FEDERATION_QUERY); - } - - - @Test - @DisplayName("Entity type that has nested reference and thus generates multiple helper methods") - void defaultCase() { - assertGeneratedContentContains("default", - "customerFor_Entity_customer() {", - "DSL.multiset(DSL.select(_1_customerFor_Entity_customer_addresses())", - "_1_customerFor_Entity_customer_addresses() {" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/SelectHelperMethodNodeSelectionTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/SelectHelperMethodNodeSelectionTest.java deleted file mode 100644 index ca6f073ab5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/SelectHelperMethodNodeSelectionTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.db.SelectHelperDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.NODE; -import static no.sikt.graphitron.common.configuration.SchemaComponent.NODE_QUERY; - -@DisplayName("Helper method generation and naming") -public class SelectHelperMethodNodeSelectionTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/fetch/selectHelperMethods"; - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new SelectHelperDBClassGenerator(schema)); - } - - @BeforeAll - static void setUp() { - GeneratorConfig.setUseOptionalSelects(true); - } - - @AfterAll - static void tearDown() { - GeneratorConfig.setUseOptionalSelects(false); - } - - @Test - @DisplayName("Node queries should accept SelectionSet and wrap subqueries with ifRequested") - void selection() { - assertGeneratedContentContains( - "selection", Set.of(NODE, NODE_QUERY), - "customerForNode_customer(SelectionSet _iv_select)", - "ifRequested(\"address\"" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/SelectHelperMethodNodeTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/SelectHelperMethodNodeTest.java deleted file mode 100644 index 955b9daba7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/SelectHelperMethodNodeTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.NodeOnlyHelperDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.NODE; - -@DisplayName("Helper method generation and naming for node queries") -public class SelectHelperMethodNodeTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/fetch/selectHelperMethodsNode"; - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(NODE); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new NodeOnlyHelperDBClassGenerator(schema)); - } - - @Test - @DisplayName("Node with multiple fields") - void manyFields() { - assertGeneratedContentContains("manyFields", "customer.FIRST_NAME", "customer.LAST_NAME"); - } - - @Test - @DisplayName("Node type that has nested list references and thus generates multiple layers of helper methods") - void nestedLists() { - assertGeneratedContentContains("nestedLists", - "customerForNode_customer() {", - "DSL.multiset(DSL.select(_1_customerForNode_customer_addresses())", - "_1_customerForNode_customer_addresses() {", - "DSL.multiset(DSL.select(_2_customerForNode_customer_addresses_stores())", - "_2_customerForNode_customer_addresses_stores() {" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/SelectHelperMethodTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/SelectHelperMethodTest.java deleted file mode 100644 index 2cdcb53fec..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/SelectHelperMethodTest.java +++ /dev/null @@ -1,83 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.QueryOnlyHelperDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; - -@DisplayName("Helper method generation and naming") -public class SelectHelperMethodTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/fetch/selectHelperMethods"; - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new QueryOnlyHelperDBClassGenerator(schema)); - } - - @Test - @DisplayName("Multiple nested fields accessing same leaf type generate unique helper method names") - void duplicateNestedFields() { - // This test verifies that unique helper method names are generated when a helper method has multiple wrapper fields - // that both lead to the same nested type (StoreInfo.primaryStaff.staff and StoreInfo.secondaryStaff.staff) - assertGeneratedContentContains( - "duplicateNestedFields", - // Helper method for storeInfo at depth 1 (nested under customer) - "private static SelectField<StoreInfo> _1_queryForQuery_customer_storeInfo(", - "DSL.select(_1_queryForQuery_customer_storeInfo())", - // First helper for staff at depth 2 (nested under storeInfo, no counter suffix since it's the first) - "private static SelectField<Staff> _2_queryForQuery_customer_storeInfo_staff(", - // Second helper for staff at depth 2 (with _1 counter suffix for uniqueness) - "private static SelectField<Staff> _2_queryForQuery_customer_storeInfo_staff_1(", - // Both should be called from the storeInfo helper - "DSL.select(_2_queryForQuery_customer_storeInfo_staff()", - "DSL.select(_2_queryForQuery_customer_storeInfo_staff_1()" - ); - } - - @Test - @DisplayName("Fields with underscore names that could collide with nested paths") - void potentialCollision() { - assertGeneratedContentContains( - "potentialCollision", - // Main rental() helper calls nested helpers with depth indicators - "DSL.select(_1_rentalForQuery_rental_staff())", - "DSL.select(_1_rentalForQuery_rental_staff_store())", - // staff at depth 1 (nested under rental) - "private static SelectField<Staff> _1_rentalForQuery_rental_staff(", - // staff_store at depth 1 - distinct from staff.store due to depth nesting - "private static SelectField<Store> _1_rentalForQuery_rental_staff_store(", - // staff.store nested at depth 2 (staff at depth 1, store at depth 2) - distinct from staff_store - "private static SelectField<Store> _2_rentalForQuery_rental_staff_store(", - - "_1_rentalForQuery_rental_staff_store()", - "_2_rentalForQuery_rental_staff_store()" - ); - } - - @Test - @DisplayName("Order at which inputs are sent in to subqueries") - void inputOrdering() { - assertGeneratedContentContains( - "potentialCollision", - // Main rental() helper calls nested helpers with depth indicators - "DSL.select(_1_rentalForQuery_rental_staff())", - "DSL.select(_1_rentalForQuery_rental_staff_store())", - // staff at depth 1 (nested under rental) - "private static SelectField<Staff> _1_rentalForQuery_rental_staff(", - // staff_store at depth 1 - distinct from staff.store due to depth nesting - "private static SelectField<Store> _1_rentalForQuery_rental_staff_store(", - // staff.store nested at depth 2 (staff at depth 1, store at depth 2) - distinct from staff_store - "private static SelectField<Store> _2_rentalForQuery_rental_staff_store(", - - "_1_rentalForQuery_rental_staff_store()", - "_2_rentalForQuery_rental_staff_store()" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/SelectHelperUnionTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/SelectHelperUnionTest.java deleted file mode 100644 index 3cd1e877d4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/SelectHelperUnionTest.java +++ /dev/null @@ -1,96 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.QueryOnlyHelperDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("Query outputs - Union type helpers") -public class SelectHelperUnionTest extends GeneratorTest { - - // Disable validation until GGG-104 - @Override - protected boolean validateSchema() { - return false; - } - - @Override - protected String getSubpath() { - return "queries/fetch/union"; - } - - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new QueryOnlyHelperDBClassGenerator(schema)); - } - - @Test // Note that setting it as a list does nothing, so will not add listed tests. - @DisplayName("Union with one component") - void defaultCase() { - assertGeneratedContentMatches("default", CUSTOMER_UNION); - } - - @Test - @DisplayName("Union next to an unrelated field") - void withOtherField() { - assertGeneratedContentContains("withOtherField", Set.of(CUSTOMER_QUERY), "(_iv_e0, _iv_e1_0) -> new Customer(_iv_e0, _iv_e1_0)"); - } - - @Test - @DisplayName("Union with two components") - void twoComponents() { - assertGeneratedContentContains( - "twoComponents", Set.of(CUSTOMER_UNION), - "CustomerUnion0::new", - "CustomerUnion1::new", - "(_iv_e0_0, _iv_e0_1) -> new Customer(_iv_e0_0 != null ? _iv_e0_0 : _iv_e0_1)" - ); - } - - @Test - @DisplayName("Union with two components next to an unrelated field") - void twoComponentsWithOtherField() { - assertGeneratedContentContains( - "twoComponentsWithOtherField", Set.of(CUSTOMER_QUERY), - "(_iv_e0, _iv_e1_0, _iv_e1_1) -> new Customer(_iv_e0, _iv_e1_0 != null ? _iv_e1_0 : _iv_e1_1)" - ); - } - - @Test - @DisplayName("Union with three components") - void threeComponents() { - assertGeneratedContentContains( - "threeComponents", Set.of(CUSTOMER_UNION), - "(_iv_e0_0, _iv_e0_1, _iv_e0_2) -> new Customer(_iv_e0_0 != null ? _iv_e0_0 : _iv_e0_1 != null ? _iv_e0_1 : _iv_e0_2)" - ); - } - - @Test - @DisplayName("Union component with two fields") - void componentWithMultipleFields() { - assertGeneratedContentContains( - "componentWithMultipleFields", Set.of(CUSTOMER_UNION), - ".row(_a_customer.getId(),_a_customer.EMAIL).mapping(Functions.nullOnAllNull(CustomerUnion::new)" - ); - } - - @Test - @DisplayName("Union on a non-root level") - void splitQuery() { - assertGeneratedContentContains("splitQuery", Set.of(SPLIT_QUERY_WRAPPER), "CustomerUnion::new", "(_iv_e0_0) -> new Customer(_iv_e0_0)"); - } - - @Test - @DisplayName("Union component with an enum field") - void componentWithEnumField() { - assertGeneratedContentContains("componentWithEnumField", Set.of(CUSTOMER_UNION, DUMMY_ENUM), ".row(DSL.row(_a_customer.ENUM.convert("); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/SingleTableInterfaceTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/SingleTableInterfaceTest.java deleted file mode 100644 index 453c0acd8d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/SingleTableInterfaceTest.java +++ /dev/null @@ -1,156 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_TABLE; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; - -@DisplayName("Single-table interfaces - Queries") -public class SingleTableInterfaceTest extends InterfaceTest { - - @Override - protected String getSubpath() { - return super.getSubpath() + "/singleTableInterface"; - } - - - @Test - @DisplayName("Default case") - void defaultCase() { - assertGeneratedContentMatches("default"); - } - - @Test - @DisplayName("Listed without pagination") - void listed() { - assertGeneratedContentMatches("listed"); - } - - @Test - @DisplayName("Nested") - void nested() { - assertGeneratedContentMatches("nested"); - } - - @Test - @DisplayName("Paginated") - void paginated() { - assertGeneratedContentMatches("paginated"); - } - - @Test - @DisplayName("With reference field from interface definition") - void withReferenceField() { - assertGeneratedContentContains("withReferenceField", - Set.of(CUSTOMER_TABLE), - "address_223244161_customer = _a_address.customer()", - "DSL.field(", - ".from(_a_address_223244161_customer)).as(\"customer\")"); - } - - @Test - @DisplayName("With condition reference field") - void withConditionReferenceField() { - assertGeneratedContentContains("withConditionReferenceField", - Set.of(CUSTOMER_TABLE), - ".join(_a_address_customer_addresscustomer_customer).on(no.", - "addressCustomer(_a_address_customer, _a_address_customer_addresscustomer_customer)" - ); - } - - @Test - @DisplayName("With reference field from type definition") - void withReferenceFieldInType() { - assertGeneratedContentContains("withReferenceFieldInType", - Set.of(CUSTOMER_TABLE), - "address_223244161_customer = _a_address.customer()", - "DSL.field(", - ".from(_a_address_223244161_customer)).as(\"customer\")" - ); - } - - @Test - @DisplayName("Implementing types have the same field") - void implementingTypesWithSameField() { - assertGeneratedContentContains("implementingTypesWithSameField", - Set.of(CUSTOMER_TABLE), - // Check all selected fields to make sure the duplicate field is only selected once - "(_a_address.DISTRICT.as(\"_iv_discriminator\"),_a_address.POSTAL_CODE.as(\"postalCode\")" + - ",_a_address.PHONE.as(\"phoneNumber\"))" - ); - } - - @Test - @Disabled("synthetic colums are not supported in jOOQ open source. Fix in GGG-159") - @DisplayName("Discriminator column name is case insensitive") - void discriminatorColumnNameIsCaseInsensitive() { - assertGeneratedContentMatches("discriminatorColumnNameIsCaseInsensitive"); - } - - @Test - @DisplayName("Type implementing multiple single table interfaces") - void typeImplementsMultipleSingleTableInterfaces() { - assertDoesNotThrow(() -> generateFiles("typeImplementsMultipleSingleTableInterfaces")); - } - - @Test - @DisplayName("Overridden field") - void overriddenField() { - assertGeneratedContentContains("overriddenField", - "discriminator\"), _a_address.POSTAL_CODE.as(\"postalCode\"), _a_address.ADDRESS_.as(\"ONE_postalCode\"))", - "data.setPostalCode(_iv_it.get(\"ONE_postalCode\", _a_address.ADDRESS_.getConverter()));", - "{return _iv_it.into(AddressInDistrictTwo.class);}" - - ); - } - - @Test - @DisplayName("Default field should not be selected when overridden by all types") - void interfaceFieldOverriddenByAll() { - assertGeneratedContentContains("interfaceFieldOverriddenByAll", - "discriminator\"), _a_address.ADDRESS_.as(\"ONE_postalCode\"), _a_address.ADDRESS2.as(\"TWO_postalCode\"))" - - ); - } - - @Test - @DisplayName("Overridden non-interface field") - void overriddenNonInterfaceField() { - assertGeneratedContentContains("overriddenNonInterfaceField", - "address.ADDRESS_.as(\"ONE_extraField\"), _a_address.POSTAL_CODE.as(\"TWO_extraField\")", - ".into(AddressInDistrictOne.class); _iv_data.setExtraField(_iv_it.get(\"ONE_extraField\", _a_address.ADDRESS_.getConverter", - ".into(AddressInDistrictTwo.class); _iv_data.setExtraField(_iv_it.get(\"TWO_extraField\", _a_address.POSTAL_CODE.getConverter" - - ); - } - - @Test - @DisplayName("With splitQuery reference in interface") - void splitQueryReferenceInInterface() { - assertGeneratedContentContains("splitQueryReferenceInInterface", - // Make sure only correct fields are selected - """ - select( - DSL.row(_a_address.ADDRESS_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_address.ADDRESS_ID))).as("address_pkey"), - _a_address.DISTRICT.as("_iv_discriminator"), - _a_address.POSTAL_CODE.as("postalCode") - ) - """, - "data.setCustomerKey(_iv_it.get(\"address_pkey\", AddressRecord.class))" - ); - } - - @Test - @DisplayName("With splitQuery reference in type") - void splitQueryReferenceInType() { - assertGeneratedContentContains("splitQueryReferenceInType", - "DSL.row(_a_address.ADDRESS_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_address.ADDRESS_ID))).as(\"address_pkey\")", - "AddressInDistrictOne.class); _iv_data.setCustomerKey(_iv_it.get(\"address_pkey\"", - "return _iv_it.into(AddressInDistrictTwo.class);" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/SortingDirectiveTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/SortingDirectiveTest.java deleted file mode 100644 index b82346c4f8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/SortingDirectiveTest.java +++ /dev/null @@ -1,173 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.MapOnlyFetchDBClassGenerator; -import no.sikt.graphitron.validation.InvalidSchemaException; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -@DisplayName("Sorting - Queries with custom ordering") -public class SortingDirectiveTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/fetch/orderby/"; - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(ORDER); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new MapOnlyFetchDBClassGenerator(schema)); - } - - // --- Index-based sorting --- - - @Test - @DisplayName("Index-based sorting with single enum value") - void indexBasedSorting() { - assertGeneratedContentMatches("default"); - } - - @Test - @DisplayName("Index-based sorting with pagination") - void indexBasedWithPagination() { - assertGeneratedContentMatches("paginated", CUSTOMER_CONNECTION_ORDER, PAGE_INFO); - } - - @Test - @DisplayName("Index-based sorting with multiple enum values") - void indexBasedMultipleEnumValues() { - assertGeneratedContentContains( - "twoFields", - "case \"STORE\" -> QueryHelper.getSortFields(_a_customer, \"IDX_FK_STORE_ID\",", - "case \"NAME\" -> QueryHelper.getSortFields(_a_customer, \"IDX_LAST_NAME\"," - ); - } - - @Test - @DisplayName("Index-based sorting on a composite index") - void indexBasedCompositeIndex() { - assertGeneratedContentContains( - "twoFieldIndex", - "case \"STORE_ID_FILM_ID\" -> QueryHelper.getSortFields(_a_inventory, \"IDX_STORE_ID_FILM_ID\"," - ); - } - - @Test - @DisplayName("Deprecated @index directive works as @order(index:)") - void deprecatedIndexDirective() { - assertGeneratedContentContains("deprecatedIndex", - "case \"NAME\" -> QueryHelper.getSortFields(_a_customer, \"IDX_LAST_NAME\","); - } - - // --- Field-based sorting --- - - @Test - @DisplayName("Field-based sorting") - void fieldBasedSorting() { - assertGeneratedContentContains("fields", - ".LAST_NAME.sort("); - } - - @Test - @DisplayName("Field-based sorting with collation") - void fieldBasedWithCollation() { - assertGeneratedContentContains("fieldsWithCollation", - ".LAST_NAME.collate(\"xdanish_ai\")"); - } - - @Test - @DisplayName("Field-based sorting with multiple fields and collation") - void fieldBasedMultipleFieldsWithCollation() { - assertGeneratedContentContains("multipleFieldsWithCollation", - ".LAST_NAME.collate(\"xdanish_ai\")", - ".FIRST_NAME.collate(\"xdanish_ai\")"); - } - - // --- Primary key sorting --- - - @Test - @DisplayName("Primary key sorting") - void primaryKeySorting() { - assertGeneratedContentContains("primaryKey", - "f.sort(", - "getPrimaryKey().getFieldsArray()"); - } - - // --- Mixed modes --- - - @Test - @DisplayName("Mixed sorting modes in single enum") - void mixedSortingModes() { - assertGeneratedContentContains("mixed", - "switch ("); - } - - // --- Edge cases and validation --- - - @Test - @DisplayName("No ordering generated for non-list field") - void noOrderingForNonListField() { - assertGeneratedContentMatches("withoutList"); - } - - @Test - @DisplayName("Empty default sort fields when table has no primary key") - void noPrimaryKeyFallback() { - assertGeneratedContentContains("noPrimaryKey", - "? new SortField[] {}"); - } - - @Test - @DisplayName("Non-existent index should fail validation") - void nonExistentIndex() { - assertThatThrownBy(() -> generateFiles("wrongIndex", Set.of(CUSTOMER_TABLE))) - .isInstanceOf(InvalidSchemaException.class) - .hasMessage("Table 'CUSTOMER' has no index 'WRONG_INDEX' specified for 'EMAIL'"); - } - - @Test - @DisplayName("Non-existent field in @order(fields:) should fail validation") - void nonExistentField() { - assertThatThrownBy(() -> generateFiles("wrongField", Set.of(CUSTOMER_TABLE))) - .isInstanceOf(InvalidSchemaException.class) - .hasMessageContaining("has no field"); - } - - @Test - @DisplayName("Multiple @order modes set simultaneously should fail validation") - void multipleModesSet() { - assertThatThrownBy(() -> generateFiles("multipleModes", Set.of(CUSTOMER_TABLE))) - .isInstanceOf(InvalidSchemaException.class) - .hasMessageContaining("must have exactly one"); - } - - @Test - @DisplayName("Primary key sorting on table without PK should fail validation") - void primaryKeyOnTableWithoutPK() { - assertThatThrownBy(() -> generateFiles("primaryKeyNoPK", Set.of())) - .isInstanceOf(InvalidSchemaException.class) - .hasMessageContaining("has no primary key"); - } - - @Test - @DisplayName("Custom field names for orderBy and direction should work") - void customFieldNames() { - assertGeneratedContentContains("customFieldNames", - ".getMyCustomSortField().toString()", - ".getMyCustomSortDirection().toString()" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/SortingTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/SortingTest.java deleted file mode 100644 index 578a5218e3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/SortingTest.java +++ /dev/null @@ -1,106 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.MapOnlyFetchDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.REFERENCE_PG_USER_MAPPING_CONDITION; -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_TABLE; - -@DisplayName("Sorting - Queries with default ordering") -public class SortingTest extends GeneratorTest { - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(REFERENCE_PG_USER_MAPPING_CONDITION); - } - - @Override - protected String getSubpath() { - return "queries/fetch/sorting"; - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(CUSTOMER_TABLE); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new MapOnlyFetchDBClassGenerator(schema)); - } - - @Test - @DisplayName("Default sorting on primary key") - void defaultCase() { - assertGeneratedContentMatches("default"); - } - - @Test - @DisplayName("No sorting when table has no primary key") - void noPrimaryKey() { - resultDoesNotContain("noPrimaryKey", "orderFields", ".orderBy("); - } - - @Test - @DisplayName("Default sorting on list with splitQuery") - void splitQuery() { - assertGeneratedContentContains("splitQuery", - "orderFields = _a_address_223244161_customer", - "customer).orderBy(_iv_orderFields" - ); - } - - @Test - @DisplayName("No sorting on list with splitQuery when table has no primary key") - void splitQueryNoPrimaryKey() { - resultDoesNotContain("splitQueryNoPrimaryKey", "orderFields", ".orderBy("); - } - - @Test - @DisplayName("Default sorting on list without splitQuery (multiset)") - void multiset() { - var generatedFiles = generateFiles("multiset", Set.of()); - contains(generatedFiles, - "_iv_ctx.select(queryForQuery_address(", - ".from(_a_address_223244161_customer).orderBy(_a_address_223244161_customer.fields(_a_address_223244161_customer.getPrimaryKey().getFieldsArray()))" - ); - doesNotContain(generatedFiles, "orderFields"); - } - - @Test - @DisplayName("No sorting on table in multiset when it has no primary key") - void multisetNoPrimaryKey() { - resultDoesNotContain("multisetNoPrimaryKey", "orderFields", "orderBy"); - } - - @Test - @DisplayName("Sorting on nested lists (nested multisets)") - void nestedLists() { - assertGeneratedContentContains("nestedLists", - "orderFields = _a_city.", - "(_a_city).orderBy(_iv_orderFields)", - ".from(_a_city_760939060_address).orderBy(", - ".from(_a_address_609487378_customer).orderBy(" - ); - } - - @Test - @DisplayName("No sorting on non-list types") - void withoutList() { - assertGeneratedContentMatches("withoutList"); - } - - @Test - @DisplayName("No sorting on lookup") - void lookup() { - resultDoesNotContain("lookup", "orderFields", "orderBy"); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/StrategyNodeInterfaceTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/StrategyNodeInterfaceTest.java deleted file mode 100644 index 574a1ca7ff..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/StrategyNodeInterfaceTest.java +++ /dev/null @@ -1,141 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.NodeStrategyInterfaceOnlyFetchDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.*; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("Query node - Interface handling for types implementing node strategy interface") -public class StrategyNodeInterfaceTest extends GeneratorTest { - - // Diabled until GGG-104 - @Override - protected boolean validateSchema() { - return false; - } - - @BeforeAll - static void setUp() { - GeneratorConfig.setNodeStrategy(true); - } - - @AfterAll - static void tearDown() { - GeneratorConfig.setNodeStrategy(false); - } - - @Override - protected String getSubpath() { - return "queries/fetch/interfaces/strategynode"; - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(NODE); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new NodeStrategyInterfaceOnlyFetchDBClassGenerator(schema)); - } - - @Test - @DisplayName("Only ID") - void defaultCase() { - assertGeneratedContentMatches("default"); - } - - @Test - @DisplayName("ID field which is not node ID") - void regularIdField() { - assertGeneratedContentContains("regularIdField", "customer.CUSTOMER_ID"); - } - - @Test - @DisplayName("Input ID field which is not node ID") - void regularIdInputField() { - assertGeneratedContentContains("regularIdInputField", Set.of(CUSTOMER_TABLE), - "customer.CUSTOMER_ID.eq(_mi_id)" - ); - } - - @Test - @DisplayName("Querying a list of regular ID fields after mutation") - void listedIdFieldAfterMutation() { - assertGeneratedContentContains("listedIdFieldAfterMutation", Set.of(CUSTOMER_NODE), - "DSL.multiset(DSL.select(_a_customer.CUSTOMER_ID)" - ); - } - - @Test - @DisplayName("Type implements node and non-node interface") - void twoInterfaces() { - assertGeneratedContentContains( - "twoInterfaces", - "customerForNode", - ",Set<String> _mi_id,", - ".where(_iv_nodeIdStrategy.hasIds(\"Customer\", _mi_id, _a_customer.CUSTOMER_ID)" - ); - } - - @Test - @Disabled("Disabled until alwaysUsePrimaryKeyInSplitQueries-property is removed.") - @DisplayName("Split query") - void splitQuery() { - assertGeneratedContentContains("splitQuery", - "nodeIdStrategy.createId(\"Customer\", _a_customer.CUSTOMER_ID)," + - "DSL.field(", - ".where(_iv_nodeIdStrategy.hasIds(\"Customer\", _mi_customerIds, _a_customer.fields" - ); - } - - @Test - @DisplayName("Split query with primary key") - void splitQueryOnlyPrimaryKey() { - assertGeneratedContentMatches("splitQueryOnlyPrimaryKey"); - } - - @Test - @DisplayName("Root query") - void rootQuery() { - assertGeneratedContentMatches("rootQuery"); - } - - @Test - @DisplayName("Connection") - void connection() { - assertGeneratedContentContains( - "connection", Set.of(CUSTOMER_CONNECTION), - "countQueryForQuery(DSLContext _iv_ctx, NodeIdStrategy _iv_nodeIdStrategy)" - ); - } - - @Test - @DisplayName("Multitable query") - void multitable() { - assertGeneratedContentContains( - "multitable", Set.of(CUSTOMER_TABLE), - "customertableForQuery(_iv_nodeIdStrategy)", - "customertableForQuery(NodeIdStrategy _iv_nodeIdStrategy)", - "customertableSortFieldsForQuery(_iv_nodeIdStrategy)" - ); - } - - @Test - @DisplayName("Multitable query with input") - void multitableWithInput() { - assertGeneratedContentContains( - "multitableWithInput", Set.of(CUSTOMER_TABLE), - "customertableSortFieldsForQuery(NodeIdStrategy _iv_nodeIdStrategy, Integer _mi_customerId)", - "customertableSortFieldsForQuery(_iv_nodeIdStrategy, _mi_customerId)" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/TableMethodTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/TableMethodTest.java deleted file mode 100644 index a0715ae064..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/TableMethodTest.java +++ /dev/null @@ -1,121 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.db.DBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.CONTEXT_SERVICE; -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_CONNECTION; - -@DisplayName("TableMethod for queries") -public class TableMethodTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "queries/fetch/tableMethod"; - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new DBClassGenerator(schema)); - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(CONTEXT_SERVICE); - } - - @Test - @DisplayName("No extra arguments") - void noExtraArguments() { - assertGeneratedContentContains("noExtraArguments", - "customerTableMethod = new CustomerTableMethod()", - "_a_customer = _rs_customerTableMethod.customerTable(CUSTOMER.as(\"customer_2168032777\"))", - ".from(_a_customer)" - ); - } - - @Test - @DisplayName("One argument") - void withOneArgument() { - assertGeneratedContentContains("withOneArgument" , - "customerTableMethod = new CustomerTableMethod()", - "_a_customer = _rs_customerTableMethod.customerTable(CUSTOMER.as(\"customer_2168032777\"), _mi_first_name)", - ".from(_a_customer)" - ); - } - - @Test - @DisplayName("One argument in subquery") - void withOneArgumentInSubquery() { - assertGeneratedContentContains("withOneArgumentInSubquery", - "customerForQuery_customer_address(_mi_first_name)", - "customerForQuery_customer_address(String _mi_first_name)" - ); - } - - @Test - @DisplayName("Table method argument should be passed to subquery helper even if the alias is not used there'") - void withArgumentAndConditionSubquery() { - assertGeneratedContentContains("withArgumentAndConditionSubquery", - "SelectField<Payment> _1_customerForQuery_customer_payments(String _mi_first_name)", - "select(_1_customerForQuery_customer_payments(_mi_first_name)" - ); - } - - @Test - @DisplayName("With pagination") - void paginated() { - assertGeneratedContentContains("paginated", Set.of(CUSTOMER_CONNECTION), - """ - var _a_customer = _rs_customerTableMethod.customerTable(CUSTOMER.as("customer_2168032777"), _mi_first_name); - var _iv_orderFields = _a_customer.fields(_a_customer.getPrimaryKey().getFieldsArray()); - return _iv_ctx - .select( - QueryHelper.getOrderByToken(_a_customer, _iv_orderFields), - customerForQuery_customerTable(_mi_first_name) - ) - """, """ - private static SelectField<CustomerTable> customerForQuery_customerTable(String _mi_first_name) { - var _rs_customerTableMethod = new CustomerTableMethod(); - var _a_customer = _rs_customerTableMethod.customerTable(CUSTOMER.as("customer_2168032777"), _mi_first_name); - return DSL.row(_a_customer.getId()).mapping(Functions.nullOnAllNull(CustomerTable::new));"""); - } - - @Test - @DisplayName("On splitQuery") - void splitQuery() { - assertGeneratedContentContains("splitQuery", Set.of(CUSTOMER_CONNECTION), - "_a_customer = _rs_customerTableMethod.customerTable(CUSTOMER.as(\"customer_2168032777\")); return _iv_ctx.select", - "_a_customer = _rs_customerTableMethod.customerTable(CUSTOMER.as(\"customer_2168032777\")); return DSL.row(" - ); - } - - @Test - @DisplayName("With reference") - void reference() { - assertGeneratedContentContains("reference", - "customer = _rs_customerTableMethod.customerTable(CUSTOMER.as(\"customer_2168032777\"), _mi_first_name)", - "address_2138977089_staff = _rs_staffTableMethod.staffTable(_a_customer_2168032777_address.staff().as(\"staff_4083961958\"))" - ); - } - - @Test - @DisplayName("With ContextArgument") - void withContextArgument() { - assertGeneratedContentContains("withContextArgument", - "Customer customerForQuery(DSLContext _iv_ctx, String _cf_ctxField", - "customer = _rs_customerTableMethod.customerTable(CUSTOMER.as(\"customer_2168032777\"), _cf_ctxField);" + - "return _iv_ctx.", - "SelectField<Customer> customerForQuery_customer(String _cf_ctxField) {", - "customer = _rs_customerTableMethod.customerTable(CUSTOMER.as(\"customer_2168032777\"), _cf_ctxField);" + - "return DSL.row(_a_customer." - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/UnionTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/UnionTest.java deleted file mode 100644 index 392cd9380a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/queries/fetch/UnionTest.java +++ /dev/null @@ -1,59 +0,0 @@ -package no.sikt.graphitron.queries.fetch; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.reducedgenerators.UnionOnlyFetchDBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.PAGE_INFO; -import static no.sikt.graphitron.common.configuration.SchemaComponent.SOMEUNION_CONNECTION; - -@DisplayName("Query outputs - Union types") -public class UnionTest extends GeneratorTest { - - // Disable validation until GG-104 - @Override - protected boolean validateSchema() { - return false; - } - - @Override - protected String getSubpath() { - return "queries/fetch/union"; - } - - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new UnionOnlyFetchDBClassGenerator(schema)); - } - - @Test - @DisplayName("Multitable union query") - void multitableUnion() { - assertGeneratedContentContains("multitableUnion", Set.of(PAGE_INFO, SOMEUNION_CONNECTION), - "languageSortFieldsForPaginatedUnionQuery" - ); - } - - @Test - @DisplayName("Multitable union with one type") - void multitableUnionOneType() { - assertGeneratedContentContains("multitableUnionOneType", Set.of(PAGE_INFO, SOMEUNION_CONNECTION), - " languageForPaginatedUnionQuery()" - ); - } - - @Test - @DisplayName("Multitable union in splitQuery field") - void multitableUnionSplitQuery() { - assertGeneratedContentContains("multitableUnionSplitQuery", Set.of(PAGE_INFO, SOMEUNION_CONNECTION), - "staffAndCustomersForPayment" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/recordtransformer/RecordTransformerClassTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/recordtransformer/RecordTransformerClassTest.java deleted file mode 100644 index d090f46d16..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/recordtransformer/RecordTransformerClassTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package no.sikt.graphitron.recordtransformer; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.mapping.TransformerClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.DUMMY_RECORD; -import static no.sikt.graphitron.common.configuration.ReferencedEntry.DUMMY_SERVICE; - -@DisplayName("Record Transformer - Classes for the RecordTransformer") -public class RecordTransformerClassTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "recordtransformer"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(DUMMY_SERVICE, DUMMY_RECORD); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new TransformerClassGenerator(schema)); - } - - @Test - @DisplayName("The class is still generated when no mappable records exist") - void whenNoRecordsExist() { - assertFilesAreGenerated("whenNoRecordsExist", "RecordTransformer"); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/recordtransformer/RecordTransformerTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/recordtransformer/RecordTransformerTest.java deleted file mode 100644 index 1430f9f39c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/recordtransformer/RecordTransformerTest.java +++ /dev/null @@ -1,73 +0,0 @@ -package no.sikt.graphitron.recordtransformer; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.configuration.RecordValidation; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.mapping.TransformerClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.DUMMY_RECORD; -import static no.sikt.graphitron.common.configuration.ReferencedEntry.DUMMY_SERVICE; -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("Record Transformer - Content for the RecordTransformer") -public class RecordTransformerTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "recordtransformer"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(DUMMY_SERVICE, DUMMY_RECORD); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new TransformerClassGenerator(schema)); - } - - @Test - @DisplayName("Maps from graph types to Java records") - void fromGraphToJava() { - assertGeneratedContentMatches("fromGraphToJava", DUMMY_INPUT_RECORD); - } - - @Test - @DisplayName("Maps from graph types to jOOQ records") - void fromGraphToJOOQ() { - assertGeneratedContentMatches("fromGraphToJOOQ", CUSTOMER_INPUT_TABLE); - } - - @Test - @DisplayName("Maps from Java records to graph types") - void fromJavaToGraph() { - assertGeneratedContentMatches("fromJavaToGraph"); - } - - @Test - @DisplayName("Maps from jOOQ records to graph types") - void fromJOOQToGraph() { - assertGeneratedContentMatches("fromJOOQToGraph", CUSTOMER_TABLE); - } - - @Test - @DisplayName("Generates correct validation code pattern") - void withValidation() { - GeneratorConfig.setRecordValidation(new RecordValidation(true, null)); - assertGeneratedContentContains( - "withValidation", - Set.of(CUSTOMER_INPUT_TABLE), - "records = CustomerInputTableJOOQMapper.toJOOQRecord(_mi_input, _iv_argPresence, _iv_path, this);" + - "_iv_validationErrors.addAll(CustomerInputTableJOOQMapper.validate(_mo_records, _iv_indexPath, this));" + - "return _mo_records" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/CountOnlyFetchDBClassGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/CountOnlyFetchDBClassGenerator.java deleted file mode 100644 index 87700a239a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/CountOnlyFetchDBClassGenerator.java +++ /dev/null @@ -1,18 +0,0 @@ -package no.sikt.graphitron.reducedgenerators; - -import no.sikt.graphitron.javapoet.TypeSpec; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.generators.db.FetchCountDBMethodGenerator; -import no.sikt.graphitron.generators.db.DBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; - -public class CountOnlyFetchDBClassGenerator extends DBClassGenerator { - public CountOnlyFetchDBClassGenerator(ProcessedSchema processedSchema) { - super(processedSchema); - } - - @Override - public TypeSpec generate(ObjectDefinition target) { - return getSpec(target.getName(), new FetchCountDBMethodGenerator(target, processedSchema)).build(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/EntityOnlyFetchDBClassGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/EntityOnlyFetchDBClassGenerator.java deleted file mode 100644 index 16e859f26a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/EntityOnlyFetchDBClassGenerator.java +++ /dev/null @@ -1,20 +0,0 @@ -package no.sikt.graphitron.reducedgenerators; - -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.generators.db.DBClassGenerator; -import no.sikt.graphitron.generators.db.FetchEntityImplementationDBMethodGenerator; -import no.sikt.graphitron.javapoet.TypeSpec; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.List; - -public class EntityOnlyFetchDBClassGenerator extends DBClassGenerator { - public EntityOnlyFetchDBClassGenerator(ProcessedSchema processedSchema) { - super(processedSchema); - } - - @Override - public TypeSpec generate(ObjectDefinition target) { - return getSpec(target.getName(), List.of(new FetchEntityImplementationDBMethodGenerator(target, processedSchema))).build(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/EntityOnlyHelperDBClassGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/EntityOnlyHelperDBClassGenerator.java deleted file mode 100644 index 62d7c62bdf..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/EntityOnlyHelperDBClassGenerator.java +++ /dev/null @@ -1,20 +0,0 @@ -package no.sikt.graphitron.reducedgenerators; - -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.generators.db.DBClassGenerator; -import no.sikt.graphitron.generators.db.EntitySelectHelperDBMethodGenerator; -import no.sikt.graphitron.javapoet.TypeSpec; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.List; - -public class EntityOnlyHelperDBClassGenerator extends DBClassGenerator { - public EntityOnlyHelperDBClassGenerator(ProcessedSchema processedSchema) { - super(processedSchema); - } - - @Override - public TypeSpec generate(ObjectDefinition target) { - return getSpec(target.getName(), List.of(new EntitySelectHelperDBMethodGenerator(target, processedSchema))).build(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/FetchTableRecordOnlyDBClassGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/FetchTableRecordOnlyDBClassGenerator.java deleted file mode 100644 index d1be4ba8bb..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/FetchTableRecordOnlyDBClassGenerator.java +++ /dev/null @@ -1,22 +0,0 @@ -package no.sikt.graphitron.reducedgenerators; - -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.generators.db.DBClassGenerator; -import no.sikt.graphitron.generators.db.FetchTableRecordDBMethodGenerator; -import no.sikt.graphitron.javapoet.TypeSpec; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.List; - -public class FetchTableRecordOnlyDBClassGenerator extends DBClassGenerator { - public FetchTableRecordOnlyDBClassGenerator(ProcessedSchema processedSchema) { - super(processedSchema); - } - - @Override - public TypeSpec generate(ObjectDefinition target) { - return getSpec(target.getName(), - List.of(new FetchTableRecordDBMethodGenerator(target, processedSchema)) - ).build(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/InterfaceOnlyFetchDBClassGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/InterfaceOnlyFetchDBClassGenerator.java deleted file mode 100644 index 254d2a6883..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/InterfaceOnlyFetchDBClassGenerator.java +++ /dev/null @@ -1,26 +0,0 @@ -package no.sikt.graphitron.reducedgenerators; - -import no.sikt.graphitron.generators.db.*; -import no.sikt.graphitron.javapoet.TypeSpec; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.List; - -public class InterfaceOnlyFetchDBClassGenerator extends DBClassGenerator { - public InterfaceOnlyFetchDBClassGenerator(ProcessedSchema processedSchema) { - super(processedSchema); - } - - @Override - public TypeSpec generate(ObjectDefinition target) { - return getSpec( - target.getName(), - List.of( - new FetchNodeImplementationDBMethodGenerator(target, processedSchema, objectFieldsReturningNode), - new FetchMultiTableDBMethodGenerator(target, processedSchema), - new FetchSingleTableInterfaceDBMethodGenerator(target, processedSchema) - ) - ).build(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/MapOnlyFetchDBClassGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/MapOnlyFetchDBClassGenerator.java deleted file mode 100644 index 8e33cc1de9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/MapOnlyFetchDBClassGenerator.java +++ /dev/null @@ -1,27 +0,0 @@ -package no.sikt.graphitron.reducedgenerators; - -import no.sikt.graphitron.generators.db.SelectHelperDBMethodGenerator; -import no.sikt.graphitron.javapoet.TypeSpec; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.generators.db.DBClassGenerator; -import no.sikt.graphitron.generators.db.FetchMappedObjectDBMethodGenerator; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.List; - -public class MapOnlyFetchDBClassGenerator extends DBClassGenerator { - public MapOnlyFetchDBClassGenerator(ProcessedSchema processedSchema) { - super(processedSchema); - } - - @Override - public TypeSpec generate(ObjectDefinition target) { - return getSpec( - target.getName(), - List.of( - new FetchMappedObjectDBMethodGenerator(target, processedSchema), - new SelectHelperDBMethodGenerator(target, processedSchema) - ) - ).build(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/NodeOnlyHelperDBClassGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/NodeOnlyHelperDBClassGenerator.java deleted file mode 100644 index 5c3a3171bb..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/NodeOnlyHelperDBClassGenerator.java +++ /dev/null @@ -1,18 +0,0 @@ -package no.sikt.graphitron.reducedgenerators; - -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.generators.db.DBClassGenerator; -import no.sikt.graphitron.generators.db.NodeSelectHelperDBMethodGenerator; -import no.sikt.graphitron.javapoet.TypeSpec; -import no.sikt.graphql.schema.ProcessedSchema; - -public class NodeOnlyHelperDBClassGenerator extends DBClassGenerator { - public NodeOnlyHelperDBClassGenerator(ProcessedSchema processedSchema) { - super(processedSchema); - } - - @Override - public TypeSpec generate(ObjectDefinition target) { - return getSpec(target.getName(), new NodeSelectHelperDBMethodGenerator(target, processedSchema, objectFieldsReturningNode)).build(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/NodeStrategyInterfaceOnlyFetchDBClassGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/NodeStrategyInterfaceOnlyFetchDBClassGenerator.java deleted file mode 100644 index a91f5d8438..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/NodeStrategyInterfaceOnlyFetchDBClassGenerator.java +++ /dev/null @@ -1,29 +0,0 @@ -package no.sikt.graphitron.reducedgenerators; - -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.generators.db.*; -import no.sikt.graphitron.javapoet.TypeSpec; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.List; - -public class NodeStrategyInterfaceOnlyFetchDBClassGenerator extends DBClassGenerator { - public NodeStrategyInterfaceOnlyFetchDBClassGenerator(ProcessedSchema processedSchema) { - super(processedSchema); - } - - @Override - public TypeSpec generate(ObjectDefinition target) { - return getSpec( - target.getName(), - List.of( - new FetchNodeImplementationDBMethodGenerator(target, processedSchema, objectFieldsReturningNode), - new FetchMappedObjectDBMethodGenerator(target, processedSchema), - new FetchCountDBMethodGenerator(target, processedSchema), - new FetchMultiTableDBMethodGenerator(target, processedSchema), - new SelectHelperDBMethodGenerator(target, processedSchema), - new NodeSelectHelperDBMethodGenerator(target, processedSchema, objectFieldsReturningNode) - ) - ).build(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/PaginationOnlyDBClassGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/PaginationOnlyDBClassGenerator.java deleted file mode 100644 index abb937f5e1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/PaginationOnlyDBClassGenerator.java +++ /dev/null @@ -1,27 +0,0 @@ -package no.sikt.graphitron.reducedgenerators; - -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.generators.db.DBClassGenerator; -import no.sikt.graphitron.generators.db.FetchCountDBMethodGenerator; -import no.sikt.graphitron.generators.db.FetchMappedObjectDBMethodGenerator; -import no.sikt.graphitron.generators.db.SelectHelperDBMethodGenerator; -import no.sikt.graphitron.javapoet.TypeSpec; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.List; - -public class PaginationOnlyDBClassGenerator extends DBClassGenerator { - public PaginationOnlyDBClassGenerator(ProcessedSchema processedSchema) { - super(processedSchema); - } - - @Override - public TypeSpec generate(ObjectDefinition target) { - return getSpec( - target.getName(), - List.of(new FetchMappedObjectDBMethodGenerator(target, processedSchema), - new SelectHelperDBMethodGenerator(target, processedSchema), - new FetchCountDBMethodGenerator(target, processedSchema)) - ).build(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/QueryOnlyHelperDBClassGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/QueryOnlyHelperDBClassGenerator.java deleted file mode 100644 index 0a2fdb21f8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/QueryOnlyHelperDBClassGenerator.java +++ /dev/null @@ -1,18 +0,0 @@ -package no.sikt.graphitron.reducedgenerators; - -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.generators.db.DBClassGenerator; -import no.sikt.graphitron.generators.db.SelectHelperDBMethodGenerator; -import no.sikt.graphitron.javapoet.TypeSpec; -import no.sikt.graphql.schema.ProcessedSchema; - -public class QueryOnlyHelperDBClassGenerator extends DBClassGenerator { - public QueryOnlyHelperDBClassGenerator(ProcessedSchema processedSchema) { - super(processedSchema); - } - - @Override - public TypeSpec generate(ObjectDefinition target) { - return getSpec(target.getName(), new SelectHelperDBMethodGenerator(target, processedSchema)).build(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/ReducedRecordMapperClassGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/ReducedRecordMapperClassGenerator.java deleted file mode 100644 index 4e259ccdba..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/ReducedRecordMapperClassGenerator.java +++ /dev/null @@ -1,18 +0,0 @@ -package no.sikt.graphitron.reducedgenerators; - -import no.sikt.graphitron.javapoet.TypeSpec; -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.generators.mapping.RecordMapperClassGenerator; -import no.sikt.graphitron.generators.mapping.RecordValidatorMethodGenerator; -import no.sikt.graphql.schema.ProcessedSchema; - -public class ReducedRecordMapperClassGenerator extends RecordMapperClassGenerator { - public ReducedRecordMapperClassGenerator(ProcessedSchema processedSchema) { - super(processedSchema, true); - } - - @Override - public TypeSpec generate(GenerationField target) { - return getSpec(processedSchema.getRecordType(target).getName(), new RecordValidatorMethodGenerator(target, processedSchema)).build(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/UnionOnlyFetchDBClassGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/UnionOnlyFetchDBClassGenerator.java deleted file mode 100644 index ab92812d4c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/UnionOnlyFetchDBClassGenerator.java +++ /dev/null @@ -1,27 +0,0 @@ -package no.sikt.graphitron.reducedgenerators; - -import no.sikt.graphitron.generators.db.DBClassGenerator; -import no.sikt.graphitron.generators.db.FetchMappedObjectDBMethodGenerator; -import no.sikt.graphitron.generators.db.FetchMultiTableDBMethodGenerator; -import no.sikt.graphitron.javapoet.TypeSpec; -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.List; - -public class UnionOnlyFetchDBClassGenerator extends DBClassGenerator { - public UnionOnlyFetchDBClassGenerator(ProcessedSchema processedSchema) { - super(processedSchema); - } - - @Override - public TypeSpec generate(ObjectDefinition target) { - return getSpec( - target.getName(), - List.of( - new FetchMultiTableDBMethodGenerator(target, processedSchema), - new FetchMappedObjectDBMethodGenerator(target, processedSchema) - ) - ).build(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/UpdateOnlyDBClassGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/UpdateOnlyDBClassGenerator.java deleted file mode 100644 index 82789c97ec..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/UpdateOnlyDBClassGenerator.java +++ /dev/null @@ -1,24 +0,0 @@ -package no.sikt.graphitron.reducedgenerators; - -import no.sikt.graphitron.definitions.objects.ObjectDefinition; -import no.sikt.graphitron.generators.db.DBClassGenerator; -import no.sikt.graphitron.generators.db.BatchUpdateDBMethodGenerator; -import no.sikt.graphitron.generators.db.UpdateWithReturningDBMethodGenerator; -import no.sikt.graphitron.javapoet.TypeSpec; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.List; - -public class UpdateOnlyDBClassGenerator extends DBClassGenerator { - public UpdateOnlyDBClassGenerator(ProcessedSchema processedSchema) { - super(processedSchema); - } - - @Override - public TypeSpec generate(ObjectDefinition target) { - return getSpec(target.getName(), - List.of(new BatchUpdateDBMethodGenerator(target, processedSchema), - new UpdateWithReturningDBMethodGenerator(target, processedSchema)) - ).build(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/dummygenerators/DummyTransformerClassGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/dummygenerators/DummyTransformerClassGenerator.java deleted file mode 100644 index 9376a1b992..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/dummygenerators/DummyTransformerClassGenerator.java +++ /dev/null @@ -1,25 +0,0 @@ -package no.sikt.graphitron.reducedgenerators.dummygenerators; - -import no.sikt.graphitron.javapoet.TypeSpec; -import no.sikt.graphitron.generators.abstractions.MethodGenerator; -import no.sikt.graphitron.generators.mapping.TransformerClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; - -import java.util.List; - -public class DummyTransformerClassGenerator extends TransformerClassGenerator { - private final List<MethodGenerator> generators; - - public DummyTransformerClassGenerator(ProcessedSchema processedSchema) { - super(processedSchema); - generators = List.of( - new DummyTransformerListMethodGenerator(processedSchema), - new DummyTransformerMethodGenerator(processedSchema) - ); - } - - @Override - public List<TypeSpec> generateAll() { - return List.of(getSpec("", generators).build()); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/dummygenerators/DummyTransformerListMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/dummygenerators/DummyTransformerListMethodGenerator.java deleted file mode 100644 index e6d565f2e1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/dummygenerators/DummyTransformerListMethodGenerator.java +++ /dev/null @@ -1,20 +0,0 @@ -package no.sikt.graphitron.reducedgenerators.dummygenerators; - -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.generators.mapping.TransformerListMethodGenerator; -import no.sikt.graphql.schema.ProcessedSchema; - -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.listOf; -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.returnWrap; - -public class DummyTransformerListMethodGenerator extends TransformerListMethodGenerator { - public DummyTransformerListMethodGenerator(ProcessedSchema processedSchema) { - super(processedSchema); - } - - @Override - protected CodeBlock getMethodContent(GenerationField target) { - return returnWrap(listOf()); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/dummygenerators/DummyTransformerMethodGenerator.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/dummygenerators/DummyTransformerMethodGenerator.java deleted file mode 100644 index 72744f5109..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/reducedgenerators/dummygenerators/DummyTransformerMethodGenerator.java +++ /dev/null @@ -1,19 +0,0 @@ -package no.sikt.graphitron.reducedgenerators.dummygenerators; - -import no.sikt.graphitron.javapoet.CodeBlock; -import no.sikt.graphitron.definitions.interfaces.GenerationField; -import no.sikt.graphitron.generators.mapping.TransformerMethodGenerator; -import no.sikt.graphql.schema.ProcessedSchema; - -import static no.sikt.graphitron.generators.codebuilding.FormatCodeBlocks.returnWrap; - -public class DummyTransformerMethodGenerator extends TransformerMethodGenerator { - public DummyTransformerMethodGenerator(ProcessedSchema processedSchema) { - super(processedSchema); - } - - @Override - protected CodeBlock getMethodContent(GenerationField target) { - return returnWrap(target.isInput() ? CodeBlock.of("new $T()", processedSchema.getRecordType(target).getRecordClassName()) : CodeBlock.of("null")); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/schemamappers/MapperGeneratorToGraphTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/schemamappers/MapperGeneratorToGraphTest.java deleted file mode 100644 index 58081cbd12..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/schemamappers/MapperGeneratorToGraphTest.java +++ /dev/null @@ -1,86 +0,0 @@ -package no.sikt.graphitron.schemamappers; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.mapping.RecordMapperClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.*; -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_TABLE; - -@DisplayName("Schema Mappers - Mapper content for mapping fields to graph types") -public class MapperGeneratorToGraphTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "schemamappers"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(MAPPER_ID_SERVICE, JAVA_RECORD_CUSTOMER, MAPPER_FETCH_SERVICE, RESOLVER_MUTATION_SERVICE); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new RecordMapperClassGenerator(schema, false)); - } - - @Test - @DisplayName("Default case with simple fields") - void defaultCase() { - assertGeneratedContentMatches("default"); - } - - @Test - @DisplayName("Default case with listed fields") - void listedFields() { - assertGeneratedContentContains( - "listedFields", - "Response0 recordToGraphType(List<String> _mi_response0Record,", - "Response1 recordToGraphType(List<String> _mi_response1Record," - ); - } - - @Test - @DisplayName("Wrapper field containing listed Java record with splitQuery field") - void splitQueryInNestedJavaRecord() { - assertGeneratedContentContains( - "splitQueryInNestedJavaRecord", - " if (_iv_select.contains(_iv_pathHere + \"customerJavaRecords\")) {" + - "_mo_payload.setCustomerJavaRecords(_iv_transform.customerJavaRecordToGraphType(_mi_payloadRecord, _iv_pathHere + \"customerJavaRecords\"));}" - ); - } - - @Test - @DisplayName("Wrapper field containing listed jOOQ record with listed splitQuery field") - void listedSplitQueryInNestedJooqRecord() { - assertGeneratedContentContains( - "listedSplitQueryInNestedJooqRecord", - "_mo_city.setAddressesKey(_nit_cityRecord.key().into(CityRecord.class));" - ); - } - - @Test - @DisplayName("Wrapper type with single @splitQuery field") - void singleSplitQueryInWrapper() { - assertGeneratedContentContains( - "singleSplitQueryInWrapper", Set.of(CUSTOMER_TABLE), - "_mo_customerWrapper.setCustomerKey(_mi_customerWrapperRecord.key().into(CustomerRecord.class))" - ); - } - - @Test - @DisplayName("Wrapped field containing listed splitQuery with listed splitQuery field") - void nestedListWithSplitQuery() { - var generatedFiles = generateFiles("nestedListWithSplitQuery"); - contains(generatedFiles, "payload.setCitiesKey(_mi_payloadRecord.stream().map(_iv_it -> _iv_it.key().into(CityRecord.class)).toList());"); -// TODO: fix this below in Jira: https://sikt.atlassian.net/browse/GG-277 -// doesNotContain(generatedFiles, "class CityTypeMapper"); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/typeregistry/TypeRegistryTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/typeregistry/TypeRegistryTest.java deleted file mode 100644 index 3eb3e88e21..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/typeregistry/TypeRegistryTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package no.sikt.graphitron.typeregistry; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.codeinterface.typeregistry.TypeRegistryClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER; -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_QUERY; - -@DisplayName("Type Registry - Generation of the method returning a type registry") -public class TypeRegistryTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "typeregistry"; - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new TypeRegistryClassGenerator()); - } - - @Test - @DisplayName("Return type registry") - void defaultCase() { - assertGeneratedContentMatchesFromComponents("default", CUSTOMER_QUERY, CUSTOMER); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/CodeGenerationThresholdEvaluatorTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/CodeGenerationThresholdEvaluatorTest.java deleted file mode 100644 index 18de1458fb..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/CodeGenerationThresholdEvaluatorTest.java +++ /dev/null @@ -1,170 +0,0 @@ -package no.sikt.graphitron.validation; - -import no.sikt.graphitron.configuration.CodeGenerationThresholds; -import no.sikt.graphitron.javapoet.MethodSpec; -import no.sikt.graphitron.javapoet.TypeSpec; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.stream.IntStream; - -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_CONTEXT; -import static org.assertj.core.api.Assertions.assertThat; - -@DisplayName("Code generation threshold evaluator - Checks generated code up against code generation thresholds") -public class CodeGenerationThresholdEvaluatorTest { - - @Test - @DisplayName("Should not inform of any methods without thresholds set") - void noThresholdsSet() { - var typeSpec = TypeSpec.classBuilder("SomeClass").build(); - - var thresholds = new CodeGenerationThresholds( - null, - null, - null, - null); - var evaluator = new CodeGenerationThresholdEvaluator(thresholds, typeSpec); - - assertThat(evaluator.getUpperBoundMessages()).isEmpty(); - assertThat(evaluator.getCrashPointMessages()).isEmpty(); - } - - @Test - @DisplayName("Should inform of code sizes that exceeds thresholds") - void linesOfCodeExceedsThresholds() { - var CRASH_POINT = 50; - var UPPER_BOUND = 25; - - var methodBeyondCrashPoint = createLinesOfCodeMethod( - "methodBeyondCrashPoint", - CRASH_POINT+1 - ); - var methodBetweenUpperBoundAndCrashPoint = createLinesOfCodeMethod( - "methodBetweenUpperBoundAndCrashPoint", - UPPER_BOUND+1 - ); - var methodBelowUpperBound = createLinesOfCodeMethod( - "methodBelowUpperBound", - UPPER_BOUND-1 - ); - var typeSpec = createTypeSpecWithMethods(List.of( - methodBeyondCrashPoint, - methodBetweenUpperBoundAndCrashPoint, - methodBelowUpperBound - )); - - var thresholds = new CodeGenerationThresholds( - UPPER_BOUND, - CRASH_POINT, - null, - null - ); - var evaluator = new CodeGenerationThresholdEvaluator(thresholds, typeSpec); - - assertThat(evaluator.getUpperBoundMessages()).isEqualTo( - List.of( - String.format( - "Code size in %s.%s has exceeded its UPPER_BOUND (current/limit) %d/%d", - typeSpec.name(), - methodBetweenUpperBoundAndCrashPoint.name(), - UPPER_BOUND + 1, - UPPER_BOUND - ) - )); - assertThat(evaluator.getCrashPointMessages()).isEqualTo( - List.of( - String.format( - "Code size in %s.%s has exceeded its CRASH_POINT (current/limit) %d/%d", - typeSpec.name(), - methodBeyondCrashPoint.name(), - CRASH_POINT + 1, - CRASH_POINT - ) - ) - ); - } - - @Test - @DisplayName("Should inform of nested queries that exceeds thresholds") - void nestedDepthExceedsThresholds() { - var CRASH_POINT = 8; - var UPPER_BOUND = 4; - - - var methodBeyondCrashPoint = createNestedDepthMethod( - "methodBeyondCrashPoint", - CRASH_POINT+1 - ); - var methodBetweenUpperBoundAndCrashPoint = createNestedDepthMethod( - "methodBetweenUpperBoundAndCrashPoint", - UPPER_BOUND+1 - ); - var methodBelowUpperBound = createNestedDepthMethod( - "methodBelowUpperBound", - UPPER_BOUND-1 - ); - var typeSpec = createTypeSpecWithMethods(List.of( - methodBeyondCrashPoint, - methodBetweenUpperBoundAndCrashPoint, - methodBelowUpperBound - )); - - var thresholds = new CodeGenerationThresholds( - null, - null, - UPPER_BOUND, - CRASH_POINT - ); - var evaluator = new CodeGenerationThresholdEvaluator(thresholds, typeSpec); - - assertThat(evaluator.getUpperBoundMessages()).isEqualTo( - List.of( - String.format( - "Query nesting depth in %s.%s has exceeded its UPPER_BOUND (current/limit) %d/%d", - typeSpec.name(), - methodBetweenUpperBoundAndCrashPoint.name(), - UPPER_BOUND + 1, - UPPER_BOUND - ) - )); - assertThat(evaluator.getCrashPointMessages()).isEqualTo( - List.of( - String.format( - "Query nesting depth in %s.%s has exceeded its CRASH_POINT (current/limit) %d/%d", - typeSpec.name(), - methodBeyondCrashPoint.name(), - CRASH_POINT + 1, - CRASH_POINT - ) - ) - ); - } - - private static MethodSpec createLinesOfCodeMethod(String methodName, int linesOfCode) { - var method = MethodSpec.methodBuilder(methodName); - IntStream.range(0, linesOfCode).forEach(i -> method.addCode("someLine\n")); - return method.build(); - } - - private static MethodSpec createNestedDepthMethod(String methodName, int nestedDepth) { - var method = MethodSpec - .methodBuilder(methodName) - .addCode("return\n$N\n", VAR_CONTEXT); - IntStream.range(0, nestedDepth).forEach(i -> - method - .addCode(".select(column$L)\n", i) - .addCode(".from(table$L)\n", i) - ); - return method - .addStatement("from(table)") - .build(); - } - - private static TypeSpec createTypeSpecWithMethods(List<MethodSpec> methods) { - return TypeSpec.classBuilder("SomeClass") - .addMethods(methods) - .build(); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/CycleValidationTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/CycleValidationTest.java deleted file mode 100644 index 2af9028989..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/CycleValidationTest.java +++ /dev/null @@ -1,136 +0,0 @@ -package no.sikt.graphitron.validation; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_NODE; - -@DisplayName("Cycle validation - Detects cycles in input and output types") -public class CycleValidationTest extends ValidationTest { - - @Override - protected String getSubpath() { - return super.getSubpath() + "cycle"; - } - - /* - * Input cycles - * */ - - @Test - @DisplayName("Input types without cycles should pass validation") - void inputTypeNoCycle() { - getProcessedSchema("inputTypeNoCycle", Set.of(CUSTOMER_NODE)); - assertNoWarnings(); - } - - @Test - @DisplayName("Input types with cycle should be detected") - void inputTypeCycle() { - assertErrorsContain("inputTypeCycle", - "Cycle detected: 'InputA.b' -> 'InputB.a' -> 'InputA'. Input type cycles are not allowed."); - } - - @Test - @DisplayName("Self-referencing input type is detected as a cycle") - void inputTypeSelfReference() { - assertErrorsContain("inputTypeSelfReference", - "'InputA.a' -> 'InputA'"); - } - - /* - * Output cycles - * */ - - @Test - @DisplayName("Object type cycle broken by resolver should pass validation") - void objectTypeCycleWithResolver() { - getProcessedSchema("objectTypeCycleWithResolver"); - assertNoWarnings(); - } - - @Test - @DisplayName("Object type cycle without resolver is detected exactly once") - void objectTypeCycle() { - assertErrorsContainOnce("objectTypeCycle", - "Cycle detected", // Make sure the same cycle is not reported multiple times with different path starting point - "Cycle detected: 'TypeB.a' -> 'TypeA.b' -> 'TypeB'. A resolver is required to break the cycle, " + - "for example by adding @splitQuery to (one of) the field(s)." - ); - } - - @Test - @DisplayName("Self-referencing object type is detected as a cycle") - void objectTypeSelfReference() { - assertErrorsContain("objectTypeSelfReference", - "'TypeA.a' -> 'TypeA'"); - } - - @Test - @DisplayName("All field paths in a cycle are included in the error message") - void multiplePathsInCycle() { - assertErrorsContain("multiplePathsInCycle", - "'TypeB.path1'/'TypeB.path2' -> 'TypeA.path1'/'TypeA.path2' -> 'TypeB'" - ); - } - - @Test - @DisplayName("Cycle with dead-end sibling branch should not include the sibling in the error path") - void cycleWithDeadEndSibling() { - assertErrorsContain("cycleWithDeadEndSibling", "'TypeB.a' -> 'TypeA.b' -> 'TypeB'"); - assertErrorsDoNotContain("cycleWithDeadEndSibling", "'DeadEnd"); - } - - @Test - @DisplayName("Self-referencing interface should be detected as a cycle") - void interfaceCycle() { - assertErrorsContain("interfaceCycle", - "'I.i' -> 'I'"); - } - - @Test - @DisplayName("Cycle through interface field should report cycle through interface and implementing types") - void cycleThroughInterfaceField() { - assertErrorsContain("cycleThroughInterfaceField", - "'TypeA.i' -> 'InterfaceI.a' -> 'TypeA'", - "'Impl.a' -> 'TypeA.i' -> 'Impl'" - ); - } - - @Test - @DisplayName("Cycle through interface field with multiple paths") - void cycleThroughInterfaceFieldWithMultiplePaths() { - assertErrorsContain("cycleThroughInterfaceFieldWithMultiplePaths", - "'TypeA.i' -> 'InterfaceI.a1'/'InterfaceI.a2' -> 'TypeA'", - "'Impl.a1'/'Impl.a2' -> 'TypeA.i' -> 'Impl'" - ); - } - - @Test - @DisplayName("Cycle through field returning interface, but not through interface field should report cycle through implementing type") - void cycleThroughFieldReturningInterface() { - assertErrorsContainOnce("cycleThroughFieldReturningInterface", - "Cycle detected", - "'Impl.a' -> 'TypeA.i' -> 'Impl'" - ); - } - - @Test - @DisplayName("Cycle through union should be detected") - void cycleThroughUnion() { - assertErrorsContain("cycleThroughUnion", - "'TypeB.a' -> 'TypeA.u' -> 'TypeB'" - ); - } - - @Test - @DisplayName("Multiple cycles through union should be detected and reported separately") - void multipleCyclesThroughUnion() { - assertErrorsContain("multipleCyclesThroughUnion", - "'TypeB.path1' -> 'TypeA.u' -> 'TypeB'", - "'TypeA.u' -> 'TypeC.path2' -> 'TypeA'" - ); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/DBClassGeneratorTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/DBClassGeneratorTest.java deleted file mode 100644 index 59fec808ef..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/DBClassGeneratorTest.java +++ /dev/null @@ -1,99 +0,0 @@ -package no.sikt.graphitron.validation; - -import ch.qos.logback.classic.Level; -import ch.qos.logback.classic.Logger; -import ch.qos.logback.classic.spi.ILoggingEvent; -import ch.qos.logback.core.read.ListAppender; -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.configuration.CodeGenerationThresholds; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.generate.GraphQLGenerator; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.db.DBClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.Ignore; -import org.junit.jupiter.api.*; -import org.slf4j.LoggerFactory; - -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - - -class DBClassGeneratorTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "validation/"; - } - - @Override - protected boolean validateSchema() { - return true; - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new DBClassGenerator(schema)); - } - - protected ListAppender<ILoggingEvent> logWatcher; - - protected String getWarning() { - return logWatcher - .list - .stream() - .filter(it -> it.getLevel() == Level.WARN) - .map(ILoggingEvent::getFormattedMessage) - .findFirst() - .orElse(""); - } - - protected void assertWarningsContain(String... values) { - assertThat(getWarning()).contains(values); - } - - protected void assertErrorsContain(Runnable f, String ... values) { - assertThatThrownBy(f::run) - .isInstanceOf(IllegalArgumentException.class) - .hasMessageContainingAll(values); - } - - @BeforeEach - public void setup() { - super.setup(); - var logWatch = new ListAppender<ILoggingEvent>(); - logWatch.start(); - ((Logger) LoggerFactory.getLogger(DBClassGenerator.class)).addAppender(logWatch); - this.logWatcher = logWatch; - } - - @AfterEach - public void teardown() { - super.teardown(); - ((Logger) LoggerFactory.getLogger(GraphQLGenerator.class)).detachAndStopAllAppenders(); - } - - @Test - @DisplayName("Throws error when exceeding crash point") - void throwsErrorWhenExceedingCrashPoint() { - GeneratorConfig.setCodeGenerationThresholds(new CodeGenerationThresholds(null, 1, null, null)); - assertErrorsContain( - () -> generateFiles("thresholdEvaluator"), - "Code generation crash point has exceeded for the following methods:\n" + - "Code size in QueryDBQueries.queryForQuery has exceeded its CRASH_POINT (current/limit) 5/1" - ); - - } - - @Test - @DisplayName("Logging a warning when exceeding upper bound") - void warnsWhenExceedingUpperBound() { - GeneratorConfig.setCodeGenerationThresholds(new CodeGenerationThresholds(1, null, null, null)); - generateFiles("thresholdEvaluator"); - assertWarningsContain( - "Code generation upper bound has exceeded for the following methods, this may cause performance issues:\n" + - "Code size in QueryDBQueries.queryForQuery has exceeded its UPPER_BOUND (current/limit) 5/1" - ); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/DeleteMutationTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/DeleteMutationTest.java deleted file mode 100644 index c6bc9d7535..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/DeleteMutationTest.java +++ /dev/null @@ -1,246 +0,0 @@ -package no.sikt.graphitron.validation; - -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.configuration.GeneratorConfig; -import org.junit.jupiter.api.*; - -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("Schema validation - Checks run when building the schema for mutations") -public class DeleteMutationTest extends ValidationTest { - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(CUSTOMER_NODE, CUSTOMER_NODE_INPUT_TABLE, VALIDATION_ERROR); - } - - @Override - protected String getSubpath() { - return super.getSubpath() + "mutation/delete"; - } - - @BeforeAll - static void setUp() { - GeneratorConfig.setNodeStrategy(true); - GeneratorConfig.setUseJdbcBatchingForDeletes(false); - } - - @AfterAll - static void tearDown() { - GeneratorConfig.setNodeStrategy(false); - GeneratorConfig.setUseJdbcBatchingForDeletes(true); - } - - @Test - @DisplayName("With node ID as unique identifier") - void nodeId() { - getProcessedSchema("nodeId"); - assertNoWarnings(); - } - - @Test - @DisplayName("With ID as unique identifier") - void id() { // Temporary test until node ID strategy is required - GeneratorConfig.setNodeStrategy(false); - getProcessedSchema("id", Set.of(CUSTOMER_INPUT_TABLE)); - assertNoWarnings(); - GeneratorConfig.setNodeStrategy(true); - } - - @Test - @DisplayName("With primary key fields as unique identifier") - void primaryKeyFields() { - getProcessedSchema("primaryKeyFields"); - assertNoWarnings(); - } - - @Test - @DisplayName("Missing one field to match primary key of table") - void missingFieldToMatchPrimaryKey() { - assertErrorsContain( - "missingFieldToMatchPrimaryKey", - "Mutation field 'Mutation.mutation' is a generated delete mutation, but does not have input with non-nullable fields corresponding to a PK/UK of the table.", - "Possible fix(es):\n* Add non-nullable input fields for COUNTRY_NAME to match PK/UK 'vacation_destination_pkey'." - ); - } - - @Test - @DisplayName("Missing multiple fields to match primary key of table") - void missingMultipleFieldsToMatchPrimaryKey() { - assertErrorsContain( - "missingMultipleFieldsToMatchPrimaryKey", - "Mutation field 'Mutation.mutation' is a generated delete mutation, but does not have input with non-nullable fields corresponding to a PK/UK of the table.", - "Possible fix(es):\n* Add non-nullable input fields for COUNTRY_NAME, DESTINATION_ID to match PK/UK 'vacation_destination_pkey'." - ); - } - - @Test - @DisplayName("Has fields matching PK, but not all are non-nullable") - void onePrimaryKeyFieldNullable() { - assertErrorsContain( - "onePrimaryKeyFieldNullable", - "Mutation field 'Mutation.mutation' is a generated delete mutation, but does not have input with non-nullable fields corresponding to a PK/UK of the table.", - "Possible fix(es):\n* Add non-nullable input fields for DESTINATION_ID to match PK/UK 'vacation_destination_pkey'." - ); - } - - @Test - @DisplayName("Nullable node ID") - void nullableNodeId() { - assertErrorsContain( - "nullableNodeId", - "Mutation field 'Mutation.mutation' is a generated delete mutation, but does not have input with non-nullable fields corresponding to a PK/UK of the table.", - """ - Possible fix(es): - * Make 'CustomerInput.id' non-nullable. - * Add non-nullable node ID input field for type 'CustomerNode'. - * Add non-nullable input fields for CUSTOMER_ID to match PK/UK 'customer_pkey'.""" - ); - } - - @Test - @DisplayName("Reference node ID should not be mistaken for identifying a row in target table") - void referenceNodeId() { - assertErrorsContain( - "referenceNodeId", - "Mutation field 'Mutation.mutation' is a generated delete mutation, but does not have input with non-nullable fields corresponding to a PK/UK of the table.", - "Possible fix(es):\n* Add non-nullable node ID input field for type 'CustomerNode'.\n* Add non-nullable input fields for CUSTOMER_ID to match PK/UK 'customer_pkey'." - ); - } - - @Test - @DisplayName("Reference ID should not be mistaken for identifying a row in target table") - void referenceId() { // Temporary test until node ID strategy is required - GeneratorConfig.setNodeStrategy(false); - assertErrorsContain( - "referenceId", - "Mutation field 'Mutation.mutation' is a generated delete mutation, but does not have input with non-nullable fields corresponding to a PK/UK of the table.", - "Possible fix(es):\n* Add non-nullable node ID input field for type 'CustomerNode'.\n* Add non-nullable input fields for CUSTOMER_ID to match PK/UK 'customer_pkey'." - ); - GeneratorConfig.setNodeStrategy(true); - } - - @Test - @DisplayName("Without jOOQ record input") - void withoutJooqRecordInput() { - assertErrorsContain( - "withoutJooqRecordInput", - "Field 'Mutation.mutation' is a generated DELETE mutation, but does not link any input to tables." - ); - } - - - /* Output data */ - - @Test - @DisplayName("Returning scalar data") - void returningScalar() { - getProcessedSchema("returningScalar"); - assertNoWarnings(); - } - - @Test - @DisplayName("Returning wrapped scalar data") - void returningWrappedScalar() { - getProcessedSchema("returningWrappedScalar"); - assertNoWarnings(); - } - - @Test - @DisplayName("Returning table object") - void returningTableObject() { - getProcessedSchema("returningTableObject"); - assertNoWarnings(); - } - - @Test - @DisplayName("Returning wrapped table object") - void returningWrappedTableObject() { - getProcessedSchema("returningWrappedTableObject"); - assertNoWarnings(); - } - - @Test - @DisplayName("Multiple possible data fields should throw error") - void multipleDataFields() { - assertErrorsContain( - "multipleDataFields", - "Cannot find correct field to output data to after mutation for field 'Mutation.mutation'." - ); - } - - @Test - @DisplayName("Only errors field (and no data field) should throw error") - void onlyErrorsField() { - assertErrorsContain( - "onlyErrorsField", Set.of(VALIDATION_ERROR), - "Cannot find correct field to output data to after mutation for field 'Mutation.mutation'." - ); - } - - @Test - @DisplayName("Only error/exception union field (with non-reserved name) and no data field should throw error") - void onlyErrorExceptionUnionField() { - assertErrorsContain( - "onlyErrorExceptionUnionField", Set.of(VALIDATION_ERROR), - "Cannot find correct field to output data to after mutation for field 'Mutation.mutation'." - ); - } - - @Test - @DisplayName("Throw error on mismatch between input and ouput tables") - void mismatchBetweenInputAndOutputTables() { - assertErrorsContain( - "mismatchBetweenInputAndOutputTables", Set.of(VALIDATION_ERROR), - "Mutation field 'Mutation.mutation' has a mismatch between input and output tables. " + - "Input table is 'CUSTOMER', and output table is 'VACATION_DESTINATION'." - ); - } - - @Test - @DisplayName("With reference in returned data") - void withReference() { - assertErrorsContain( - "withReference", - "Mutation field 'Mutation.mutation' has references returned from the data field. This is not supported for DELETE mutations. Found reference fields are: 'Customer.address'" - ); - } - - @Test - @DisplayName("With nested reference in returned data") - void withNestedReference() { - assertErrorsContain( - "withNestedReference", - "Mutation field 'Mutation.mutation' has references returned from the data field. This is not supported for DELETE mutations. Found reference fields are: 'AddressWrapper.address'" - ); - } - - @Test - @DisplayName("With reference node ID in returned data") - void withNodeIdReference() { - assertErrorsContain( - "withNodeIdReference", - "Found reference fields are: 'Customer.addressId'" - ); - } - - @Test - @DisplayName("With wrapped reference node ID in returned data") - void withWrappedNodeIdReference() { - assertErrorsContain( - "withWrappedNodeIdReference", - "Found reference fields are: 'AddressWrapper.addressId'" - ); - } - - @Test - @DisplayName("Nullable single input not allowed") - void nullableInput() { - assertErrorsContain("nullableInput", - // This is the same logic as for insert mutations, and more thoroughly tested in no.sikt.graphitron.validation.InsertMutationTest - "Field 'Mutation.mutation' is a generated DELETE mutation, but has nullable input. This is not supported." - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/EntityValidationTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/EntityValidationTest.java deleted file mode 100644 index a2a54687df..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/EntityValidationTest.java +++ /dev/null @@ -1,58 +0,0 @@ -package no.sikt.graphitron.validation; - -import no.sikt.graphitron.common.configuration.SchemaComponent; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.FEDERATION; - -@DisplayName("Entity validation - Checks run for types with @key directive") -public class EntityValidationTest extends ValidationTest { - - @Override - protected String getSubpath() { - return super.getSubpath() + "entity"; - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(FEDERATION); - } - - @Test - @DisplayName("Entity without @table directive") - void noTable() { - assertErrorsContain("noTable", - "Entity type 'Customer' must map to a table using the @table directive"); - } - - @Test - @DisplayName("Entity with nested key") - void nestedKey() { - assertErrorsContain("nestedKey", - "Nested key(s) found in entity type 'Customer'. This is currently not supported."); - } - - @Test - @DisplayName("Key field not found in type") - void keyNotFound() { - assertErrorsContain("keyNotFound", - "Entity Key field 'nonExistentField' was not found in type 'Customer'"); - } - - @Test - @DisplayName("Key field not found in type suggests similar field") - void keyNotFoundSimilar() { - assertErrorsContain("keyNotFoundSimilar", - "Entity Key field 'cusomerId' was not found in type 'Customer'. Did you mean one of: 'customerId'"); - } - - @Test - @DisplayName("Key field is a reference") - void keyIsReference() { - assertErrorsContain("keyIsReference", - "Entity Key field 'addressId' in type 'Customer' is a reference. This is currently not supported"); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/ExceptionHandlingTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/ExceptionHandlingTest.java deleted file mode 100644 index 6d8ddd093d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/ExceptionHandlingTest.java +++ /dev/null @@ -1,22 +0,0 @@ -package no.sikt.graphitron.validation; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -@DisplayName("Exception handling validation - Checks run when building the schema for exception handling") -public class ExceptionHandlingTest extends ValidationTest { - @Override - protected String getSubpath() { - return super.getSubpath() + "exception"; - } - - @Test - @DisplayName("Class name is not set for handler") - void missingClassName() { - assertThatThrownBy(() -> getProcessedSchema("missingClassName")) - .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("'className´ directive argument must be defined for error handler of type GENERIC"); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/InputDirectiveValidationTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/InputDirectiveValidationTest.java deleted file mode 100644 index 8a376230b8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/InputDirectiveValidationTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package no.sikt.graphitron.validation; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import static no.sikt.graphql.directives.GenerationDirective.RECORD; -import static no.sikt.graphql.directives.GenerationDirective.TABLE; - -@DisplayName("Input directive validation - Checks for conflicting directives on input types") -public class InputDirectiveValidationTest extends ValidationTest { - - @Override - protected String getSubpath() { - return super.getSubpath() + "inputDirective"; - } - - @Test - @DisplayName("Input with both @table and @record should log warning") - void tableAndRecord() { - getProcessedSchema("tableAndRecord"); - assertWarningsContain( - String.format( - "Input types can only be mapped to one record category (either a jOOQ record via @%1$s or a " + - "Java record via @%2$s), but input type 'TestInput' has both directives. Remove @%1$s to " + - "preserve the existing behaviour.", - TABLE.getName(), RECORD.getName() - ) - ); - } - - @Test - @DisplayName("Input with only @table is valid") - void tableOnly() { - getProcessedSchema("tableOnly"); - assertNoWarnings(); - } - - @Test - @DisplayName("Input with only @record is valid") - void recordOnly() { - getProcessedSchema("recordOnly"); - assertNoWarnings(); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/InsertMutationTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/InsertMutationTest.java deleted file mode 100644 index 3c247a0e94..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/InsertMutationTest.java +++ /dev/null @@ -1,91 +0,0 @@ -package no.sikt.graphitron.validation; - -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.configuration.GeneratorConfig; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("Schema validation - Checks run when building the schema for mutations") -public class InsertMutationTest extends ValidationTest { - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(CUSTOMER_NODE, CUSTOMER_NODE_INPUT_TABLE, VALIDATION_ERROR); - } - - @Override - protected String getSubpath() { - return super.getSubpath() + "mutation/insert"; - } - - @BeforeAll - static void setUp() { - GeneratorConfig.setNodeStrategy(true); - GeneratorConfig.setUseJdbcBatchingForInserts(false); - } - - @AfterAll - static void tearDown() { - GeneratorConfig.setNodeStrategy(false); - GeneratorConfig.setUseJdbcBatchingForInserts(true); - } - - @Test - @DisplayName("With multiple input records") - void multipleInputRecords() { // This applies to all generated mutations without JDBC batching, so this test should eventually be moved somewhere more appropriate - assertErrorsContain("multipleInputRecords", - "'Mutation.query' is a generated INSERT mutation, but has multiple input records. This is not supported." - ); - } - - @Test - @DisplayName("With reference in returned data") - void withReference() { - getProcessedSchema("withReference"); - } - - @Test - @DisplayName("Non-nullable input should not throw error") - void nonNullableInput() { - getProcessedSchema("nonNullableInput"); - } - - @Test - @DisplayName("Non-nullable input list should not throw error") - void nonNullableInputList() { - getProcessedSchema("nonNullableInputList"); - } - - @Test - @DisplayName("Nullable single input not allowed") - void nullableInput() { - assertErrorsContain("nullableInput", - "Field 'Mutation.mutation' is a generated INSERT mutation, but has nullable input. This is not supported. " + - "Consider changing the input type from 'CustomerNodeInputTable' to 'CustomerNodeInputTable!'." - ); - } - - @Test - @DisplayName("Nullable list with non-null items not allowed") - void nullableInputList() { - assertErrorsContain("nullableInputList", - "Field 'Mutation.mutation' is a generated INSERT mutation, but has nullable input. This is not supported. " + - "Consider changing the input type from '[CustomerNodeInputTable!]' to '[CustomerNodeInputTable!]!'." - ); - } - - @Test - @DisplayName("Non-nullable list with nullable items not allowed") - void nonNullableListWithNullableItems() { - assertErrorsContain("nonNullableListWithNullableItems", - "Field 'Mutation.mutation' is a generated INSERT mutation, but has nullable input. This is not supported. " + - "Consider changing the input type from '[CustomerNodeInputTable]!' to '[CustomerNodeInputTable!]!'." - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/InsertMutationWithoutNodeIdStrategyTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/InsertMutationWithoutNodeIdStrategyTest.java deleted file mode 100644 index d38c4cfa4f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/InsertMutationWithoutNodeIdStrategyTest.java +++ /dev/null @@ -1,60 +0,0 @@ -package no.sikt.graphitron.validation; - -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.configuration.GeneratorConfig; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("Schema validation - Checks run when building the schema for mutations") -public class InsertMutationWithoutNodeIdStrategyTest extends ValidationTest { - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(CUSTOMER, CUSTOMER_INPUT_TABLE); - } - - @Override - protected String getSubpath() { - return super.getSubpath() + "mutation/insert"; - } - - @BeforeAll - static void setUp() { - GeneratorConfig.setUseJdbcBatchingForInserts(false); - } - - @AfterAll - static void tearDown() { - GeneratorConfig.setUseJdbcBatchingForInserts(true); - } - - @Test - @DisplayName("Generated inserts when node ID strategy is disabled is supported if there is no ID field input") - void disabledNodeIdStrategyAndNoIdFieldInput() { - getProcessedSchema("disabledNodeIdStrategyAndNoIdFieldInput"); - } - - @Test - @DisplayName("Generated inserts when node ID strategy is disabled is not supported if there is ID field input") - void disabledNodeIdStrategyAndIdFieldInput() { - assertErrorsContain("disabledNodeIdStrategyAndIdFieldInput", - "'Mutation.mutation' is a generated INSERT field with ID input, but this is only supported with node ID strategy enabled." - ); - } - - @Test - @DisplayName("Give error messages for all mutations with ID input when node ID strategy is disabled") - void multipleMutationsWithIdInput() { - assertErrorsContain("multipleMutationsWithIdInput", - "'Mutation.mutation1'", - "'Mutation.mutation2'" - - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/JavaRecordMappingValidationTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/JavaRecordMappingValidationTest.java deleted file mode 100644 index b2bb340f5e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/JavaRecordMappingValidationTest.java +++ /dev/null @@ -1,89 +0,0 @@ -package no.sikt.graphitron.validation; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -@DisplayName("Java record field mapping validation - Checks that fields can be mapped to Java record methods") -public class JavaRecordMappingValidationTest extends ValidationTest { - - @Override - protected String getSubpath() { - return super.getSubpath() + "javarecord"; - } - - @Test - @DisplayName("Valid input: basic field, @field with javaName, @notGenerated (skipped), flattened nested input, nested @table input (skipped)") - void validMappings() { - getProcessedSchema("inputValidMapping"); - } - - @Test - @DisplayName("Input with unmapped field should throw error") - void unmappedField() { - assertErrorsContain("inputUnmappedField", - "Cannot map field 'invalidField' in input 'TestInput' to setter in Java record 'CustomerJavaRecord'. Expected method: setInvalidField" - ); - } - - @Test - @DisplayName("Flattened nested input with unmapped field should throw error") - void nestedUnmappedField() { - assertErrorsContain("inputNestedUnmappedField", - "Cannot map field 'invalidNestedField' in input 'NestedInput' to setter in Java record 'CustomerJavaRecord'. Expected method: setInvalidNestedField" - ); - } - - @Test - @DisplayName("Valid output: basic field, @field with javaName, @notGenerated (skipped), flattened nested type") - void validOutputMappings() { - getProcessedSchema("outputValidMapping"); - } - - @Test - @DisplayName("Output type with unmapped field should throw error") - void unmappedOutputField() { - assertErrorsContain("outputUnmappedField", - "Cannot map field 'invalidField' in type 'TestOutput' to getter in Java record 'CustomerJavaRecord'. Expected method: getInvalidField" - ); - } - - @Test - @DisplayName("Input with misspelled field should suggest similar setter") - void inputSuggestion() { - assertErrorsContain("inputSuggestion", - "Cannot map field 'emaill' in input 'TestInput' to setter in Java record 'CustomerJavaRecord'. Expected method: setEmaill. Did you mean: email?" - ); - } - - @Test - @DisplayName("Output with misspelled field should suggest similar getter") - void outputSuggestion() { - assertErrorsContain("outputSuggestion", - "Cannot map field 'efail' in type 'TestOutput' to getter in Java record 'CustomerJavaRecord'. Expected method: getEfail. Did you mean: email?" - ); - } - - @Test - @DisplayName("Nested record with unmapped field should throw error") - void nestedRecordUnmappedField() { - assertErrorsContain("nestedRecordUnmappedField", - "Cannot map field 'invalidField' in input 'InnerInput' to setter in Java record 'MapperCustomerInnerJavaRecord'. Expected method: setInvalidField" - ); - } - - @Test - @DisplayName("UPPER_CASE @field name without javaName should throw error (getEMAIL doesn't match getEmail)") - void upperCaseFieldNameWithoutJavaName() { - assertErrorsContain("outputUpperCaseFieldWithoutJavaName", - "Cannot map field 'email' in type 'TestOutput' to getter in Java record 'CustomerJavaRecord'. Expected method: getEMAIL. Did you mean: email?" - ); - } - - @Test - @DisplayName("Resolver field with unmapped @field name should throw error") - void resolverUnmappedField() { - assertErrorsContain("outputResolverUnmappedField", - "Cannot map field 'related' in type 'TestOutput' to getter in Java record 'CustomerJavaRecord'. Expected method: getUndefinedField" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/MultitableTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/MultitableTest.java deleted file mode 100644 index c25b4bfb08..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/MultitableTest.java +++ /dev/null @@ -1,126 +0,0 @@ -package no.sikt.graphitron.validation; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER; -import static no.sikt.graphitron.common.configuration.SchemaComponent.PERSON_WITH_EMAIL; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -@DisplayName("Multitable query validation (interfaces and unions)") -public class MultitableTest extends ValidationTest { - @Override - protected String getSubpath() { - return super.getSubpath() + "multitable"; - } - - @Test - @DisplayName("Interface returned in field has an implementing type with table missing primary key") - void listedMultitableInterfaceNoPrimaryKey() { - assertThatThrownBy(() -> generateFiles("listedNoPrimaryKey")) - .isInstanceOf(InvalidSchemaException.class) - .hasMessageContaining("Interface 'SomeInterface' is returned in field 'query', but implementing " + - "type 'PgUser' has table 'PG_USER' which does not have a primary key."); - } - - @Test - @DisplayName("Multitable interface outside root should not have validation errors") - void interfaceOutsideRoot() { - getProcessedSchema("interfaceOutsideRoot", PERSON_WITH_EMAIL); - } - - @Test - @DisplayName("Multitable union outside root should not have validation errors") - void unionOutsideRoot() { - getProcessedSchema("unionOutsideRoot"); - } - - @Test - @DisplayName("Multitable field with reference directive") - void withReferenceDirective() { - assertErrorsContain( - () -> getProcessedSchema("withReferenceDirective", PERSON_WITH_EMAIL), - "'Payment.staffAndCustomers' has the reference directive which is not supported on multitable queries. Use multitableReference directive instead." - ); - } - - @Test - @DisplayName("Multitable fields outside root with multiple key paths") - void multiplePathsWithoutMultitableReferenceDirective() { - assertErrorsContain( - () -> getProcessedSchema("multiplePathsWithoutMultitableReferenceDirective"), - "Error on field \"languages\" in type \"Film\": Multiple foreign keys found between tables \"FILM\" and \"LANGUAGE\" in reference path for type 'Language'. " + - "Please specify path with the @multitableReference directive." - ); - } - - @Test - @DisplayName("Multitable fields with invalid reference path in multitable reference directive") - void withInvalidReference() { - assertErrorsContain( - () -> getProcessedSchema("withInvalidReference"), - "\"languages\" in type \"Film\": Multiple foreign keys found between tables \"FILM\" and \"LANGUAGE\" in reference path for type 'Language'" - ); - } - - @Test - @DisplayName("Multitable field with valid reference paths") - void withValidReference() { - getProcessedSchema("withValidReference"); - assertNoWarnings(); - } - - @Test - @DisplayName("Multitable query outside root with splitQuery reference should have no validation errors") - void splitQueryReferenceInNestedQuery() { - getProcessedSchema("splitQueryReferenceInNestedQuery"); - } - - @Test - @DisplayName("Multitable query outside root without splitquery should produce validation error") - void splitQueryRequiredOnMultitableFieldOutsideRoot() { - assertErrorsContain( - () -> getProcessedSchema("splitQueryRequiredOnMultitableFieldOutsideRoot", PERSON_WITH_EMAIL), - "'Payment.staffAndCustomers' is a multitable field outside root, but is missing the splitQuery directive. " + - "Multitable queries outside root is only supported for resolver fields" - ); - } - - @Test - @DisplayName("Type implements multitable interface but has no table") - void implementationWithoutTable() { - assertErrorsContain( - () -> getProcessedSchema("implementationWithoutTable"), - String.format("Type(s) '%s' are used in a query '%s' returning multitable interface or union '%s', but do not have tables set. This is not supported.", "Customer", "Query.someInterface", "SomeInterface") - ); - } - - @Test - @DisplayName("Two types implement multitable interface but have no tables") - void twoImplementationsWithoutTable() { - assertErrorsContain( - () -> getProcessedSchema("twoImplementationsWithoutTable"), - String.format("Type(s) '%s' are used in a query '%s' returning multitable interface or union '%s', but do not have tables set. This is not supported.", "Address', 'Customer", "Query.someInterface", "SomeInterface") - ); - } - - @Test - @DisplayName("Union contains type without table") - void typeWithoutTableInUnion() { - assertErrorsContain( - () -> getProcessedSchema("typeWithoutTableInUnion", Set.of(CUSTOMER)), - String.format("Type(s) '%s' are used in a query '%s' returning multitable interface or union '%s', but do not have tables set. This is not supported.", "Customer", "Query.someUnion", "SomeUnion") - ); - } - - @Test - @DisplayName("Union contains two types without tables") - void twoTypesWithoutTableInUnion() { - assertErrorsContain( - () -> getProcessedSchema("twoTypesWithoutTableInUnion", Set.of(CUSTOMER)), - String.format("Type(s) '%s' are used in a query '%s' returning multitable interface or union '%s', but do not have tables set. This is not supported.", "Customer', 'Address", "Query.someUnion", "SomeUnion") - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/MutationTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/MutationTest.java deleted file mode 100644 index 14017746fd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/MutationTest.java +++ /dev/null @@ -1,192 +0,0 @@ -package no.sikt.graphitron.validation; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_INPUT_TABLE; -import static no.sikt.graphitron.common.configuration.SchemaComponent.ERROR; - -@DisplayName("Schema validation - Checks run when building the schema for mutations") -public class MutationTest extends ValidationTest { // TODO: Some of these tests can be generalised, as they also apply to queries. - @Override - protected String getSubpath() { - return super.getSubpath() + "mutation"; - } - - @Test - @DisplayName("Insert mutation without records") - void insertWithoutRecords() { - assertErrorsContain( - "insertWithoutRecords", - "Mutation mutation is set as an insert operation, but does not link any input to tables." - ); - } - - @Test - @DisplayName("Iterable input inside another input") - void iterableNestedInputField() { - assertErrorsContain("iterableNestedInputField", - "Field wrapper with Input type Wrapper is iterable, but has no record mapping set. " + - "Iterable Input types within records without record mapping can not be mapped to a single field in the surrounding record." - ); - } - - @Test // Note this also prints that the field is not set as required, though that much should be obvious just from this message. - @DisplayName("Missing required insert field") - void missingInsertField() { - getProcessedSchema("missingInsertField"); - assertWarningsContain( - "Input type Customer referencing table CUSTOMER does not map all fields required by the database. " + - "Missing required fields: FIRST_NAME" - ); - } - - @Test - @DisplayName("Insert field that should be required is not") - void missingInsertRequiredField() { - getProcessedSchema("missingInsertRequiredField"); - assertWarningsContain( - "Input type Customer referencing table CUSTOMER does not map all fields required by the database as non-nullable. " + - "Nullable required fields: FIRST_NAME" - ); - } - - @Test - @DisplayName("Missing required insert field that has a default set") - void missingInsertFieldWithDefault() { - getProcessedSchema("missingInsertFieldWithDefault"); - assertNoWarnings(); - } - - @Test - @DisplayName("Only input is iterable") - void onlyInputIterable() { - getProcessedSchema("onlyInputIterable", CUSTOMER_INPUT_TABLE); - assertWarningsContain("Mutation mutation with Input CustomerInputTable is defined as a list while Payload type Response does not contain a list"); - } - - @Test - @DisplayName("Only input is iterable when output includes errors") - void onlyInputIterableWithErrors() { - getProcessedSchema("onlyInputIterableWithErrors", CUSTOMER_INPUT_TABLE, ERROR); - assertWarningsContain("CustomerInputTable is defined as a list", "Response does not contain"); - } - - @Test - @DisplayName("Only output is iterable") - void onlyOutputIterable() { - getProcessedSchema("onlyOutputIterable", CUSTOMER_INPUT_TABLE); - assertWarningsContain("Mutation mutation with Input CustomerInputTable is not defined as a list while Payload type Response contains a list"); - } - - @Test - @DisplayName("Only an output field is iterable") - void onlyOutputFieldIterable() { - getProcessedSchema("onlyOutputFieldIterable", CUSTOMER_INPUT_TABLE); - assertWarningsContain("CustomerInputTable is not defined as a list", "Response contains a list"); - } - - @Test - @DisplayName("Only an output field is iterable with an extra non iterated output field") - void onlyOutputFieldIterableWithExtraField() { - getProcessedSchema("onlyOutputFieldIterableWithExtraField", CUSTOMER_INPUT_TABLE); - assertWarningsContain("CustomerInputTable is not defined as a list", "Response contains a list"); - } - - @Test - @DisplayName("Both input and output are iterable") - void bothIterable() { - getProcessedSchema("bothIterable", CUSTOMER_INPUT_TABLE); - assertNoWarnings(); - } - - @Test - @DisplayName("Both input and at least one output field in a mutation are iterable") - void bothOuterIterable() { - getProcessedSchema("bothOuterIterable", CUSTOMER_INPUT_TABLE); - assertNoWarnings(); - } - - @Test - @DisplayName("Both input and output are iterable and output and output contains an extra not iterable field") - void bothIterableWithExtraField() { - getProcessedSchema("bothIterableWithExtraField", CUSTOMER_INPUT_TABLE); - assertNoWarnings(); - } - - @Test - @DisplayName("Both input and output are not iterable") - void bothNotIterable() { - getProcessedSchema("bothNotIterable", CUSTOMER_INPUT_TABLE); - assertNoWarnings(); - } - - @Test - @DisplayName("Both input and output are not iterable and output contains errors") - void bothNotIterableWithErrors() { - getProcessedSchema("bothNotIterableWithErrors", CUSTOMER_INPUT_TABLE, ERROR); - assertNoWarnings(); - } - - @Test - @DisplayName("Input that has no records") - void noRecordInput() { - assertErrorsContain("noRecordInput", - "Problems have been found that prevent code generation:", - "Mutations must have at least one table attached when generating resolvers with queries. Mutation 'mutation' has no tables attached." - ); - } - - @Test // Not sure if this is the intended behaviour for such cases. The mutation does not try to unwrap the input. - @DisplayName("Input with non-record wrapper containing a record") - void wrappedInput() { - assertErrorsContain("wrappedInput", Set.of(CUSTOMER_INPUT_TABLE), - "Problems have been found that prevent code generation:", - "Mutations must have at least one table attached when generating resolvers with queries. Mutation 'mutation' has no tables attached." - ); - } - - @Test - @DisplayName("Input table is required but unresolvable") - void multipleInputRecords() { - assertErrorsContain( - "multipleInputRecords", Set.of(CUSTOMER_INPUT_TABLE), - "Query.query is a field of a type without a table, and has 2 potential input records to use as a source for the table in queries. In such cases, there must be exactly one input table so that it can be resolved unambiguously." - ); - } - - @Test - @DisplayName("Neither service nor mutation directive is set on a mutation") - void noHandlingSet() { - assertErrorsContain("noHandlingSet", "Mutation 'mutation' is set to generate, but has neither a service nor mutation type set."); - } - - @Test - @DisplayName("Upsert mutation fails validation when failOnMerge is enabled") - void failOnMerge() { - try { - GeneratorConfig.setFailOnMerge(true); - assertErrorsContain("upsert", Set.of(CUSTOMER_INPUT_TABLE), - "MERGE generation is disabled (failOnMerge is enabled), but mutation 'upsertCustomer' uses UPSERT. " + - "Possible workaround is enabling generateUpsertAsStore."); - } finally { - GeneratorConfig.setFailOnMerge(false); - } - } - - @Test - @DisplayName("Upsert mutation should not fail validation when both failOnMerge and generateUpsertAsStore is enabled") - void failOnMergeButStoreEnabled() { - try { - GeneratorConfig.setFailOnMerge(true); - GeneratorConfig.setGenerateUpsertAsStore(true); - getProcessedSchema("upsert", Set.of(CUSTOMER_INPUT_TABLE)); - } finally { - GeneratorConfig.setFailOnMerge(false); - GeneratorConfig.setGenerateUpsertAsStore(false); - } - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/NodeDirectiveTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/NodeDirectiveTest.java deleted file mode 100644 index 1a52f3ad1b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/NodeDirectiveTest.java +++ /dev/null @@ -1,83 +0,0 @@ -package no.sikt.graphitron.validation; - -import no.sikt.graphitron.common.configuration.SchemaComponent; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("Node directive validation - Checks run when building the schema for types with node directive") -public class NodeDirectiveTest extends ValidationTest { - @Override - protected String getSubpath() { - return super.getSubpath() + "nodeDirective"; - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(NODE, CUSTOMER_TABLE); - } - - @Test - @DisplayName("Node directive missing node interface") - void notImplementingNode() { - assertErrorsContain("notImplementingNode", - "Problems have been found that prevent code generation:", - "Type Customer has the node directive, but does not implement the Node interface." - ); - } - - @Test - @DisplayName("Node directive missing table directive") - void missingTable() { - assertErrorsContain("missingTable", - "Problems have been found that prevent code generation:", - "Type Customer has the node directive, but is missing the table directive." - ); - } - - @Test - @DisplayName("Node directive with invalid keyFields") - void columnDoesNotExist() { - assertErrorsContain("columnDoesNotExist", - "Key column 'WRONG' in node ID for type 'Language' does not exist in table 'LANGUAGE'" - ); - } - - @Test - @DisplayName("Key columns matching primary key should not throw error") - void keyColumnsMatchingPrimaryKey() { - getProcessedSchema("keyColumnsMatchingPrimaryKey"); - } - - @Test - @DisplayName("Key columns matching unique key should not throw error") - void keyColumnsMatchingUniqueKey() { - getProcessedSchema("keyColumnsMatchingUniqueKey"); - } - - @Test - @DisplayName("Node directive with keyFields not matching any unique keys") - void keyColumnsNotMatchingKey() { - assertErrorsContain("keyColumnsNotMatchingKey", - "Key columns in node ID for type 'Language' does not match a PK/UK for table 'LANGUAGE'" - ); - } - - @Test - @DisplayName("Multiple types with the same table is allowed with node directive") - void multipleTypesWithSameTable() { - getProcessedSchema("multipleTypesWithSameTable", NODE_QUERY); - } - - @Test - @DisplayName("Multiple node types with the same type ID is not supported") - void duplicateTypeId() { - assertErrorsContain("duplicateTypeId", - "Multiple node types (Film, Customer) have the same node type ID 'Film'. " + - "Type IDs must be unique." - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/NodeDirectiveTypeIdRequiredTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/NodeDirectiveTypeIdRequiredTest.java deleted file mode 100644 index affcca8c16..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/NodeDirectiveTypeIdRequiredTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package no.sikt.graphitron.validation; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -@DisplayName("Node directive typeId required validation - Checks that typeId is required when configured") -public class NodeDirectiveTypeIdRequiredTest extends ValidationTest { - @Override - protected String getSubpath() { - return super.getSubpath() + "nodeDirective/typeIdRequired"; - } - - @BeforeAll - static void setUp() { - GeneratorConfig.setRequireTypeIdOnNode(true); - } - - @AfterAll - static void tearDown() { - GeneratorConfig.setRequireTypeIdOnNode(false); - } - - @Test - @DisplayName("Node directive with typeId provided should not throw error") - void withTypeId() { - getProcessedSchema("withTypeId"); - } - - @Test - @DisplayName("Node directive missing typeId when required") - void missingTypeId() { - assertErrorsContain("missingTypeId", - "Type 'Customer' has the 'node' directive, but is missing the 'typeId' parameter which has been configured to be required." - ); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/NodeIdInputTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/NodeIdInputTest.java deleted file mode 100644 index fe74c8926a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/NodeIdInputTest.java +++ /dev/null @@ -1,222 +0,0 @@ -package no.sikt.graphitron.validation; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import org.junit.jupiter.api.*; - -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_NODE; -import static no.sikt.graphitron.common.configuration.SchemaComponent.NODE; -import static no.sikt.graphitron.common.configuration.SchemaComponent.NODE_QUERY; - -@DisplayName("Node directive input validation - Checks run when building the schema for types with node directive") -public class NodeIdInputTest extends ValidationTest { - @Override - protected String getSubpath() { - return super.getSubpath() + "nodeId/input"; - } - - @BeforeAll - static void setUp() { - GeneratorConfig.setNodeStrategy(true); - } - - @AfterAll - static void tearDown() { - GeneratorConfig.setNodeStrategy(false); - } - - @Test - @DisplayName("Type with given name does not exist") - void typeDoesNotExist() { - assertErrorsContain( - () -> getProcessedSchema("typeDoesNotExist", Set.of(CUSTOMER_NODE)), - "Type with name 'Address' referenced in the nodeId directive for argument 'addressId' on a field in type 'Query' does not exist." - ); - } - - @Test - @DisplayName("Type provided in jOOQ record input field does not exist") - void typeDoesNotExistInJooqRecordInput() { - assertErrorsContain( - () -> getProcessedSchema("typeDoesNotExistInJooqRecordInput", Set.of(CUSTOMER_NODE)), - "Type with name 'DoesNotExist' referenced in the nodeId directive for field 'CustomerInput.someId' does not exist." - ); - } - - @Test - @DisplayName("Type does not have the @node directive") - void typeDoesNotHaveNodeDirective() { - assertErrorsContain( - () -> getProcessedSchema("typeDoesNotHaveNodeDirective", Set.of(CUSTOMER_NODE)), - "Referenced type 'Address' referenced in the nodeId directive for argument 'addressId' on a field in type 'Query' is missing the necessary node directive." - ); - } - - @Test - @DisplayName("@nodeId on non-ID/string field") - void nonIdOrStringField() { - assertErrorsContain( - () -> getProcessedSchema("nonIdOrStringField", Set.of(CUSTOMER_NODE)), - "Argument 'id' on a field in type 'Query' has nodeId directive, but is not an ID or String field" - ); - } - - @Test - @DisplayName("@nodeId on string field") - void onStringField() { - getProcessedSchema("onStringField", Set.of(CUSTOMER_NODE)); - } - - @Test - @DisplayName("nodeId combined with field directive") - void withField() { - assertErrorsContain( - () -> getProcessedSchema("withField", Set.of(CUSTOMER_NODE)), - "Argument 'id' on a field in type 'Query' has both the 'nodeId' and 'field' directives, which is only supported for node ID fields in Java Record inputs." - ); - } - - @Test - @DisplayName("nodeId combined with externalField directive") - void withExternalField() { - assertErrorsContain( - () -> getProcessedSchema("withExternalField", Set.of(CUSTOMER_NODE)), - "Argument 'id' on a field in type 'Query' has both the 'nodeId' and 'externalField' directives, which is not supported." - ); - } - - @Test - @DisplayName("Ambiguous reference") - void inJooqRecordInputWithAmbiguousReference() { - assertErrorsContain( - () -> getProcessedSchema("inJooqRecordInputWithAmbiguousReference", Set.of(CUSTOMER_NODE)), - "Cannot find foreign key for node ID field 'languageId' in jOOQ record input 'FilmFilter'." - ); - } - - @Test - @DisplayName("Inverse key reference in jOOQ input") - void inJooqRecordInputWithInverseForeignKey() { - assertErrorsContain( - () -> getProcessedSchema("inJooqRecordInputWithInverseForeignKey", Set.of(CUSTOMER_NODE)), - "Node ID field 'paymentId' in jOOQ record input 'CustomerFilter' references a table with an inverse key which is not supported." - ); - } - - @Test - @DisplayName("Node Id in jOOQ record input with reference via table") - void inJooqRecordInputWithReferenceViaTable() { - assertErrorsContain( - () -> getProcessedSchema("inJooqRecordInputWithReferenceViaTable", Set.of(CUSTOMER_NODE)), - "Node ID field 'cityId' in jOOQ record input 'CustomerFilter' has a reference via table(s) which is not supported on jOOQ record inputs." - ); - } - - @Test - @DisplayName("Foreign key does not reference the same key used for the target node type") - void foreignKeyReferencesWrongKey() { - assertErrorsContain( - () -> getProcessedSchema("foreignKeyReferencesWrongKey", Set.of(NODE)), - "Node ID field 'actorId' in jOOQ record input 'FilmActorFilter' uses foreign key " + - "'film_actor_actor_id_last_name_fkey' which does not reference the same primary/unique key used " + - "for type 'Actor's node ID. This is not supported." - ); - } - - @Test - @DisplayName("Non-mutation input when foreign key overlaps with the primary key of the jOOQ record table should be allowed") - void foreignKeyOverlapsPrimaryKeyNonMutation() { - getProcessedSchema("fkOverlapsPk/nonMutation"); - } - - @Test - @DisplayName("Insert when foreign key overlaps with the primary key of the jOOQ record table should be allowed") - void foreignKeyOverlapsPrimaryKeyInsertMutation() { - getProcessedSchema("fkOverlapsPk/insertMutation"); - } - - @Test - @DisplayName("Update when the foreign key overlaps with the primary key of the jOOQ record table should not be allowed") - void foreignKeyOverlapsPrimaryKeyUpdateMutation() { - assertErrorsContain( - () -> getProcessedSchema("fkOverlapsPk/updateMutation", Set.of(NODE)), - "Foreign key used for node ID field 'filmId' in jOOQ record input 'FilmActorInput' overlaps with the primary key of the jOOQ record table. This is not supported for update/upsert mutations." - ); - } - - @Test - @Disabled("Disabled until GGG-209") - @DisplayName("nodeID with invalid reference") - void invalidReference() { - assertErrorsContain( - () -> getProcessedSchema("invalidReference"), - "...." - ); - } - - @Test - @Disabled("Disabled until GGG-209") - @DisplayName("nodeID with invalid self-reference") - void invalidSelfReference() { - assertErrorsContain( - () -> getProcessedSchema("invalidSelfReference", Set.of(CUSTOMER_NODE)), - "...." - ); - } - - @Test - @DisplayName("Should log error when node ID field has ambiguous implicit node type") - void ambiguousImplicitNodeType() { - assertErrorsContain("ambiguousImplicitNodeType", - "Cannot automatically deduce node type for node ID field 'CustomerFilter.id'. " + - "Please specify the node type with the typeName parameter" - ); - } - - - @Test - @DisplayName("Valid, implicit node ID reference in Java record input should pass validation") - void implicitReferenceInJavaRecordInput() { - getProcessedSchema("implicitReferenceInJavaRecordInput", Set.of(CUSTOMER_NODE)); - } - - @Test - @DisplayName("Reference validation for java record inputs with ID scalar.") - void javaRecordReferenceWithIdScalar() { - assertErrorsContain("javaRecordReferenceWithIdScalar", Set.of(CUSTOMER_NODE), - "Node ID field 'countryId' in Java record input 'CustomerInput' has a reference via table(s) which is not supported on Java record inputs."); - } - - @Test - @DisplayName("Error should not be thrown on node ID lookup arguments which are not references") - void lookup() { - getProcessedSchema("lookup", Set.of(CUSTOMER_NODE)); - assertNoWarnings(); - } - - @Test - @DisplayName("Error should be thrown on reference node ID lookup arguments") - void lookupOnImplicitNodeIdReference() { - assertErrorsContain("lookupOnImplicitNodeIdReference", Set.of(CUSTOMER_NODE), - "Argument/input field 'customerId' on 'Query.query' has lookupKey directive, but is a reference field. Lookup on references is not currently supported." - ); - } - - @Test - @DisplayName("Error should be thrown on input arguments with reference node ID fields") - void lookupInputTypeWithImplicitNodeIdReference() { - assertErrorsContain("lookupInputTypeWithImplicitNodeIdReference", Set.of(CUSTOMER_NODE), - "Argument 'input' on 'Query.query' has lookupKey directive, but contains reference field(s): 'LookupInput.customerId'. Lookup on references is not currently supported." - ); - } - - @Test - @DisplayName("@reference with one-to-many join becomes multi-step when combined with @nodeId, and is rejected") - void oneToManyWithImplicitNodeIdStep() { - assertErrorsContain("oneToManyWithImplicitNodeIdStep", Set.of(NODE), - "Field 'storeId' on 'Query.addresses' has a multi-step @reference path with a one-to-many relationship " + - "from \"ADDRESS\" to \"CUSTOMER\" in a non-final step. This is not currently supported on filter inputs because it causes row duplication. " + - "Use the @condition directive for complex cross-table filtering instead."); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/NodeIdOutputTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/NodeIdOutputTest.java deleted file mode 100644 index 5ebb6bc086..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/NodeIdOutputTest.java +++ /dev/null @@ -1,141 +0,0 @@ -package no.sikt.graphitron.validation; - -import no.sikt.graphitron.configuration.GeneratorConfig; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_NODE; -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_NODE_INPUT_TABLE; - -@DisplayName("Node directive output validation - Checks run when building the schema for types with node directive") -public class NodeIdOutputTest extends ValidationTest { - @Override - protected String getSubpath() { - return super.getSubpath() + "nodeId/output"; - } - - @BeforeAll - static void setUp() { - GeneratorConfig.setNodeStrategy(true); - } - - @AfterAll - static void tearDown() { - GeneratorConfig.setNodeStrategy(false); - } - - @Test - @DisplayName("Type with given name does not exist") - void typeDoesNotExist() { - assertErrorsContain( - () -> getProcessedSchema("typeDoesNotExist"), - "Type with name 'Address' referenced in the nodeId directive for field 'Customer.addressId' does not exist." - ); - } - - @Test - @DisplayName("Type does not have the @node directive") - void typeDoesNotHaveNodeDirective() { - assertErrorsContain( - () -> getProcessedSchema("typeDoesNotHaveNodeDirective"), - "Referenced type 'Address' referenced in the nodeId directive for field 'Customer.addressId' is missing the necessary node directive." - ); - } - - @Test - @DisplayName("Should log error when node ID field has ambiguous implicit node type") - void ambiguousNodeTypeForNodeId() { - assertErrorsContain("ambiguousNodeTypeForNodeId", - "Cannot automatically deduce node type for node ID field 'Customer.id'. " + - "Please specify the node type with the typeName parameter in the nodeId directive." - ); - } - - @Test - @DisplayName("Should log error when reference node ID field has ambiguous implicit node type") - void ambiguousNodeTypeForReferenceNodeId() { - assertErrorsContain("ambiguousNodeTypeForReferenceNodeId", - "Cannot automatically deduce node type for node ID field 'Customer.addressId'. " + - "Please specify the node type with the typeName parameter" - ); - } - - @Test - @DisplayName("Should log error when a node ID field without typeName is returned after a mutation.") - void typeNameOmittedOnMutationReturningNodeId() { - assertErrorsContain("typeNameOmittedOnMutationReturningNodeId", - "Cannot automatically deduce node type for node ID field 'Mutation.mutation'. " + - "Please specify the node type with the typeName parameter in the nodeId directive." - ); - } - - @Test - @DisplayName("@nodeId on non-ID/string field") - void nonIdOrStringField() { - assertErrorsContain( - () -> getProcessedSchema("nonIdOrStringField"), - "Field 'Customer.id' has nodeId directive, but is not an ID or String field" - ); - } - - @Test - @DisplayName("@nodeId on string field") - void onStringField() { - getProcessedSchema("onStringField", Set.of(CUSTOMER_NODE)); - } - - @Test - @DisplayName("nodeId combined with field directive") - void withField() { - assertErrorsContain( - () -> getProcessedSchema("withField"), - "Field 'Customer.id' has both the 'nodeId' and 'field' directives, which is only supported for node ID fields in Java Record inputs." - ); - } - - @Test - @DisplayName("nodeId combined with externalField directive") - void withExternalField() { - assertErrorsContain( - () -> getProcessedSchema("withExternalField"), - "'Customer.id' has both the 'nodeId' and 'externalField' directives, which is not supported." - ); - } - - @Test - @DisplayName("nodeId with invalid reference") - void invalidReference() { - assertErrorsContain( - () -> getProcessedSchema("invalidReference", Set.of(CUSTOMER_NODE)), - "Error on field \"customerId\" in type \"Category\": No foreign key found between tables \"CATEGORY\" and \"CUSTOMER\"" - ); - } - - @Test - @DisplayName("nodeId with invalid self-reference") - void invalidSelfReference() { - assertErrorsContain( - () -> getProcessedSchema("invalidSelfReference", Set.of(CUSTOMER_NODE)), - "Error on field \"parent\" in type \"Customer\": No foreign key found between tables \"CUSTOMER\" and \"CUSTOMER\"" - ); - } - - @Test - @DisplayName("Returning ID without type wrapping") - void noWrapping() { - getProcessedSchema("noWrapping", Set.of(CUSTOMER_NODE_INPUT_TABLE, CUSTOMER_NODE)); - } - - @Test - @DisplayName("Give richer error message on unknown ID field if NodeIdStrategy is enabled") - void unknownIdField() { - assertErrorsContain("unknownIdField", Set.of(CUSTOMER_NODE_INPUT_TABLE), - "No field with name 'MUTATION' found in table 'CUSTOMER' which may be required by 'Mutation.mutation'. " + - "Add nodeId directive if 'Mutation.mutation' is supposed to be a node ID field." - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/NodeInterfaceTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/NodeInterfaceTest.java deleted file mode 100644 index 993515ce39..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/NodeInterfaceTest.java +++ /dev/null @@ -1,62 +0,0 @@ -package no.sikt.graphitron.validation; - -import no.sikt.graphitron.common.configuration.SchemaComponent; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.NODE; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; - -@DisplayName("Node interface validation - Checks run when building the schema for interfaces") -public class NodeInterfaceTest extends ValidationTest { - @Override - protected String getSubpath() { - return super.getSubpath() + "interface/node"; - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(NODE); - } - - @Test - @DisplayName("Interface is used as type for a split query") - void splitQuery() { - assertErrorsContain("splitQuery", "interface (Node) returned in non root object. This is not fully supported. Use with care"); - } - - @Test - @DisplayName("Interface query taking too many arguments") - void tooManyArguments() { - assertErrorsContain("tooManyArguments", "Only exactly one input field is currently supported for fields returning the 'Node' interface. 'Query.node' has 2 input fields"); - } - - @Test - @DisplayName("Interface query taking too few arguments") - void tooFewArguments() { - assertErrorsContain("tooFewArguments", "Only exactly one input field is currently supported for fields returning the 'Node' interface. 'Query.node' has 0 input fields"); - } - - @Test - @DisplayName("Interface query returning a list") - void listed() { - assertErrorsContain("listed", "Generating fields returning a list of 'Node' is not supported. 'nodes' must return only one Node"); - } - - @Test - @DisplayName("Multiple types implementing Node interface and referring to the same table will throw an exception") - void allTypesUsingNodeInterface() { - assertErrorsContain("allTypesUsingNodeInterface", - "Problems have been found that prevent code generation:", - "Multiple types (FilmB, FilmA) implement the Node interface and refer to the same table FILM. This is not supported." - ); - } - - @Test - @DisplayName("Multiple types referring to the same table where only one of these are implementing Node interface are supported") - void notAllTypesUsingNodeInterface() { - assertDoesNotThrow(() -> generateFiles("notAllTypesUsingNodeInterface")); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/OrderByInputValidationTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/OrderByInputValidationTest.java deleted file mode 100644 index fc1ee7d35d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/OrderByInputValidationTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package no.sikt.graphitron.validation; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; - -@DisplayName("OrderBy input validation - Checks that @orderBy input types have valid structure") -public class OrderByInputValidationTest extends ValidationTest { - @Override - protected String getSubpath() { - return super.getSubpath() + "orderByInput/"; - } - - @Test - @DisplayName("Input type without orderBy enum field should fail validation") - void missingOrderByEnum() { - assertErrorsContain("missingOrderByEnum", Set.of(CUSTOMER_TABLE, ORDER_DIRECTION), - "Expected exactly one orderBy enum field on type"); - } - - @Test - @DisplayName("Input type without direction enum field should fail validation") - void missingDirectionEnum() { - assertErrorsContain("missingDirectionEnum", Set.of(CUSTOMER_TABLE), - "Expected exactly one direction enum field on type"); - } - - @Test - @DisplayName("Enum without @order directives should fail validation as missing orderBy field") - void missingOrderDirective() { - assertErrorsContain("missingOrderDirective", Set.of(CUSTOMER_TABLE, ORDER), - "Expected exactly one orderBy enum field on type"); - } - - @Test - @DisplayName("Enum value without @order directive should fail validation") - void enumValueMissingOrderDirective() { - assertErrorsContain("enumValueMissingOrderDirective", Set.of(CUSTOMER_TABLE), - "Enum field 'EMAIL' of 'TestOrderByField' has no valid @order directive"); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/PaginationOrderingValidationTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/PaginationOrderingValidationTest.java deleted file mode 100644 index 89383b6cbc..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/PaginationOrderingValidationTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package no.sikt.graphitron.validation; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.PAGE_INFO; - -@DisplayName("Pagination ordering validation - Paginated fields on tables without PK require ordering") -public class PaginationOrderingValidationTest extends ValidationTest { - @Override - protected String getSubpath() { - return super.getSubpath() + "paginationOrdering/"; - } - - @Test - @DisplayName("Paginated field on table without PK and without ordering should fail validation") - void paginatedWithoutOrderingOnPKlessTable() { - assertErrorsContain("withoutOrdering", Set.of(PAGE_INFO), - "requires @defaultOrder or @orderBy directive", - "Table 'FILM_LIST' has no primary key" - ); - } - - @Test - @DisplayName("Paginated field on table without PK with @defaultOrder should pass validation") - void paginatedWithDefaultOrderOnPKlessTable() { - getProcessedSchema("withDefaultOrder", Set.of(PAGE_INFO)); - } - - @Test - @DisplayName("Paginated field on table without PK with non-nullable @orderBy should pass validation") - void paginatedWithNonNullableOrderByOnPKlessTable() { - getProcessedSchema("withOrderBy", Set.of(PAGE_INFO)); - } - - @Test - @DisplayName("Paginated field on table without PK with nullable @orderBy but no @defaultOrder should fail validation") - void paginatedWithNullableOrderByNoDefaultOnPKlessTable() { - assertErrorsContain("withNullableOrderByNoDefault", Set.of(PAGE_INFO), - "has nullable @orderBy but no @defaultOrder directive", - "Table 'FILM_LIST' has no primary key" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/ProcedureCallValidationTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/ProcedureCallValidationTest.java deleted file mode 100644 index 38187ab209..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/ProcedureCallValidationTest.java +++ /dev/null @@ -1,369 +0,0 @@ -package no.sikt.graphitron.validation; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_QUERY; -import static no.sikt.graphql.directives.GenerationDirective.EXTERNAL_FIELD; -import static no.sikt.graphql.directives.GenerationDirective.FIELD; -import static no.sikt.graphql.directives.GenerationDirective.PROCEDURE_CALL; -import static no.sikt.graphql.directives.GenerationDirective.REFERENCE; - -@DisplayName("Schema validation - @experimental_procedureCall directive") -public class ProcedureCallValidationTest extends ValidationTest { - @Override - protected String getSubpath() { - return super.getSubpath() + "procedureCall"; - } - - @Test - @DisplayName("Procedure call with unknown routine name") - void procedureCallUnknownRoutine() { - assertErrorsContain("procedureCallUnknownRoutine", - String.format( - "Field %s uses @%s but no jOOQ routine was found with the name '%s'.", - "'Customer.heldBy'", - PROCEDURE_CALL.getName(), - "no_such_routine" - ) - ); - } - - @Test - @DisplayName("Procedure call with a routine name that exists in multiple schemas requires qualification") - void procedureCallAmbiguousRoutine() { - assertErrorsContain("procedureCallAmbiguousRoutine", - String.format( - "Field %s uses @%s with routine '%s' but that name exists in multiple schemas: [%s].", - "'Customer.lastDay'", - PROCEDURE_CALL.getName(), - "last_day", - "public, utils" - ) - ); - } - - @Test - @DisplayName("Procedure call targeting a stored procedure (no return value) is rejected") - void procedureCallNotAFunction() { - assertErrorsContain("procedureCallNotAFunction", - String.format( - "Field %s uses @%s with routine '%s' but the routine is not a function", - "'Film.reset'", - PROCEDURE_CALL.getName(), - "reset_film_rental_duration" - ) - ); - } - - @Test - @DisplayName("Procedure call missing a required IN parameter") - void procedureCallMissingParam() { - assertErrorsContain("procedureCallMissingParam", - String.format( - "Field %s uses @%s but does not map routine IN parameter '%s'", - "'Customer.balance'", - PROCEDURE_CALL.getName(), - "p_effective_date" - ) - ); - } - - @Test - @DisplayName("Procedure call with an unknown parameter key") - void procedureCallUnknownParam() { - assertErrorsContain("procedureCallUnknownParam", - String.format( - "Field %s uses @%s with unknown routine parameter '%s'", - "'Customer.heldBy'", - PROCEDURE_CALL.getName(), - "fake" - ) - ); - } - - @Test - @DisplayName("Procedure call mapping a column that does not exist on the surrounding table") - void procedureCallNonexistentColumn() { - assertErrorsContain("procedureCallNonexistentColumn", Set.of(CUSTOMER_QUERY), - String.format( - "Field %s uses @%s mapping parameter '%s' to '%s' but no such argument source was found (no such column on table '%s').", - "'Customer.heldBy'", - PROCEDURE_CALL.getName(), - "p_inventory_id", - "NONEXISTENT_COLUMN", - "CUSTOMER" - ) - ); - } - - @Test - @DisplayName("Procedure call with mismatched return type") - void procedureCallReturnTypeMismatch() { - assertErrorsContain("procedureCallReturnTypeMismatch", - String.format( - "Field %s uses @%s but the routine '%s' returns", - "'Customer.heldBy'", - PROCEDURE_CALL.getName(), - "inventory_held_by_customer" - ) - ); - } - - @Test - @DisplayName("Procedure call on Query root field is rejected") - void procedureCallOnQueryRoot() { - assertErrorsContain("procedureCallOnQueryRoot", - String.format( - "Field %s uses @%s on a %s root field.", - "'Query.heldBy'", - PROCEDURE_CALL.getName(), - "Query" - ) - ); - } - - @Test - @DisplayName("Procedure call on Mutation root field is rejected") - void procedureCallOnMutationRoot() { - assertErrorsContain("procedureCallOnMutationRoot", - String.format( - "Field %s uses @%s on a %s root field.", - "'Mutation.heldBy'", - PROCEDURE_CALL.getName(), - "Mutation" - ) - ); - } - - @Test - @DisplayName("Procedure call on a type with no resolvable table is rejected") - void procedureCallOnTypeWithoutTable() { - assertErrorsContain("procedureCallOnTypeWithoutTable", - String.format( - "Field %s uses @%s but the relevant type neither has a table nor inherits one from a previous type.", - "'Container.heldBy'", - PROCEDURE_CALL.getName() - ) - ); - } - - @Test - @DisplayName("Procedure call on a field whose type is an interface is rejected") - void procedureCallOnInterfaceTypedField() { - assertErrorsContain("procedureCallOnInterfaceTypedField", - String.format( - "Field %s uses @%s but its type '%s' is not a scalar.", - "'Customer.held'", - PROCEDURE_CALL.getName(), - "SomeInterface" - ) - ); - } - - @Test - @DisplayName("Procedure call on a field whose type is a union is rejected") - void procedureCallOnUnionTypedField() { - assertErrorsContain("procedureCallOnUnionTypedField", - String.format( - "Field %s uses @%s but its type '%s' is not a scalar.", - "'Customer.held'", - PROCEDURE_CALL.getName(), - "SomeUnion" - ) - ); - } - - @Test - @DisplayName("Procedure call on a field whose type is an object type is rejected") - void procedureCallOnObjectTypedField() { - assertErrorsContain("procedureCallOnObjectTypedField", - String.format( - "Field %s uses @%s but its type '%s' is not a scalar.", - "'Customer.held'", - PROCEDURE_CALL.getName(), - "Other" - ) - ); - } - - @Test - @DisplayName("Procedure call on an interface declaration is rejected") - void procedureCallOnInterfaceDeclaration() { - assertErrorsContain("procedureCallOnInterfaceDeclaration", - String.format( - "Field %s is declared on interface '%s' with @%s.", - "'SomeInterface.heldBy'", - "SomeInterface", - PROCEDURE_CALL.getName() - ) - ); - } - - @Test - @DisplayName("Procedure call combined with @field is rejected") - void procedureCallWithFieldDirective() { - assertErrorsContain("procedureCallWithFieldDirective", - String.format( - "Field %s uses @%s together with @%s.", - "'Customer.heldBy'", - PROCEDURE_CALL.getName(), - FIELD.getName() - ) - ); - } - - @Test - @DisplayName("Procedure call combined with @externalField is rejected") - void procedureCallWithExternalFieldDirective() { - assertErrorsContain("procedureCallWithExternalFieldDirective", - String.format( - "Field %s uses @%s together with @%s.", - "'Customer.heldBy'", - PROCEDURE_CALL.getName(), - EXTERNAL_FIELD.getName() - ) - ); - } - - @Test - @DisplayName("Procedure call combined with @reference is rejected") - void procedureCallWithReferenceDirective() { - assertErrorsContain("procedureCallWithReferenceDirective", - String.format( - "Field %s uses @%s together with @%s.", - "'Customer.heldBy'", - PROCEDURE_CALL.getName(), - REFERENCE.getName() - ) - ); - } - - @Test - @DisplayName("Procedure call target mode with unknown target field is rejected") - void procedureCallTargetUnknownField() { - assertErrorsContain("procedureCallTargetUnknownField", - String.format( - "Field %s uses @%s with target '%s' but no such field exists on the return type '%s'.", - "'Query.someInventory'", - PROCEDURE_CALL.getName(), - "doesNotExist", - "Customer" - ) - ); - } - - @Test - @DisplayName("Procedure call target mode with non-scalar target field is rejected") - void procedureCallTargetNotScalar() { - assertErrorsContain("procedureCallTargetNotScalar", - String.format( - "Field %s uses @%s with target '%s' on return type '%s' but that field's type '%s' is not a scalar.", - "'Query.someInventory'", - PROCEDURE_CALL.getName(), - "nested", - "Customer", - "Other" - ) - ); - } - - @Test - @DisplayName("Procedure call target mode where the target field carries @field is rejected") - void procedureCallTargetHasFieldDirective() { - assertErrorsContain("procedureCallTargetHasFieldDirective", - String.format( - "Field %s uses @%s with target '%s' on return type '%s' but the target field already carries @%s.", - "'Query.someInventory'", - PROCEDURE_CALL.getName(), - "heldBy", - "Customer", - FIELD.getName() - ) - ); - } - - @Test - @DisplayName("Procedure call target mode where the target field carries @reference is rejected") - void procedureCallTargetHasReferenceDirective() { - assertErrorsContain("procedureCallTargetHasReferenceDirective", - String.format( - "Field %s uses @%s with target '%s' on return type '%s' but the target field already carries @%s.", - "'Query.someInventory'", - PROCEDURE_CALL.getName(), - "heldBy", - "Customer", - REFERENCE.getName() - ) - ); - } - - @Test - @DisplayName("Procedure call target mode on a non-data-fetcher field is rejected") - void procedureCallTargetMissingDataFetcher() { - assertErrorsContain("procedureCallTargetMissingDataFetcher", - String.format( - "Field %s uses @%s with target '%s' but the directive is not on a data-fetcher field.", - "'Store.buddy'", - PROCEDURE_CALL.getName(), - "heldBy" - ) - ); - } - - @Test - @DisplayName("Procedure call target mode mapping a value that is not a GraphQL argument on the field") - void procedureCallTargetUnknownArgument() { - assertErrorsContain("procedureCallTargetUnknownArgument", - String.format( - "Field %s uses @%s mapping parameter '%s' to '%s' but no such argument source was found (no such GraphQL argument on field '%s').", - "'Query.someInventory'", - PROCEDURE_CALL.getName(), - "p_inventory_id", - "fakeArg", - "someInventory" - ) - ); - } - - @Test - @DisplayName("Procedure call target mode with mismatched return type") - void procedureCallTargetReturnTypeMismatch() { - assertErrorsContain("procedureCallTargetReturnTypeMismatch", - String.format( - "Field %s uses @%s but the routine '%s' returns", - "'Query.someInventory'", - PROCEDURE_CALL.getName(), - "inventory_held_by_customer" - ) - ); - } - - @Test - @DisplayName("Procedure call target mode on a field whose return type is not an object is rejected") - void procedureCallTargetNonObjectReturnType() { - assertErrorsContain("procedureCallTargetNonObjectReturnType", - String.format( - "Field %s uses @%s with target '%s' but its type '%s' is not an object type.", - "'Query.someInventory'", - PROCEDURE_CALL.getName(), - "heldBy", - "ID" - ) - ); - } - - @Test - @DisplayName("Procedure call target mode on a return type with no resolvable table is rejected") - void procedureCallTargetMissingTable() { - assertErrorsContain("procedureCallTargetMissingTable", - String.format( - "Field %s uses @%s but the relevant type neither has a table nor inherits one from a previous type.", - "'Query.someInventory'", - PROCEDURE_CALL.getName() - ) - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/QueryTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/QueryTest.java deleted file mode 100644 index dcecab9da5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/QueryTest.java +++ /dev/null @@ -1,414 +0,0 @@ -package no.sikt.graphitron.validation; - -import no.sikt.graphql.directives.GenerationDirective; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; -import static no.sikt.graphql.directives.GenerationDirective.CONSTRUCT_TYPE; -import static no.sikt.graphql.directives.GenerationDirective.EXTERNAL_FIELD; -import static no.sikt.graphql.directives.GenerationDirective.FIELD; -import static no.sikt.graphql.directives.GenerationDirective.LOOKUP_KEY; -import static no.sikt.graphql.directives.GenerationDirective.ORDER_BY; -import static no.sikt.graphql.directives.GenerationDirective.TABLE; - -@DisplayName("Schema validation - Errors thrown when checking the schema") -public class QueryTest extends ValidationTest { - @Override - protected String getSubpath() { - return super.getSubpath() + "query"; - } - - @Test - @DisplayName("Has connection but misses the pagination inputs") - void noPaginationFields() { - assertErrorsContain( - () -> getProcessedSchema("noPaginationFields", CUSTOMER_CONNECTION), - "Type CustomerConnection ending with the reserved suffix 'Connection' must have either " + - "forward(first and after fields) or backwards(last and before fields) pagination, yet " + - "neither was found." - ); - } - - @Test - @DisplayName("Has connection but misses some of the pagination inputs") - void incompletePaginationFields() { - assertErrorsContain( - () -> getProcessedSchema("incompletePaginationFields", CUSTOMER_CONNECTION), - "Type CustomerConnection ending with the reserved suffix 'Connection' must have either " + - "forward(first and after fields) or backwards(last and before fields) pagination, yet " + - "neither was found." - ); - } - - @Test - @DisplayName("Query with lookup keys set") - void lookupAndOrderBy() { - assertErrorsContain( - () -> getProcessedSchema("lookupAndOrderBy", CUSTOMER_TABLE), - String.format("'query' has both @%s and @%s defined. These directives can not be used together", ORDER_BY.getName(), LOOKUP_KEY.getName()) - ); - } - - @Test - @DisplayName("Set both lookup keys and pagination") - void lookupAndPagination() { - assertErrorsContain( - () -> getProcessedSchema("lookupAndPagination", CUSTOMER_CONNECTION), - String.format("'customers' has both pagination and @%s defined. These can not be used together", GenerationDirective.LOOKUP_KEY.getName()) - ); - } - - @Test // Reverse references are allowed and should not cause warnings or errors. - @DisplayName("Correct reverse join") - void reverseJoin() { - getProcessedSchema("reverseJoin", Set.of(CUSTOMER_TABLE)); - assertNoWarnings(); - } - - @Test - @DisplayName("Field cannot have both field and externalField directives") - void externalFieldAndFieldDirectives() { - assertErrorsContain("externalFieldAndFieldDirectives", "Field name in type Customer cannot have both the field and externalField directives."); - } - - @Test - @DisplayName("External field must have one method associated to it") - void externalFieldMissingMethod() { - assertErrorsContain("externalFieldMissingMethod", "No method found for field somethingNotDefined"); - } - - @Test - @DisplayName("External field cannot be associated with multiple methods, only one") - void externalFieldDuplicatedMethod() { - assertErrorsContain("externalFieldDuplicatedMethod", "Multiple methods found for field duplicated"); - } - - @Test - @DisplayName("External field method needs to have generic return type Field") - void externalFieldMethodWrongType() { - assertErrorsContain("externalFieldMethodWrongGenericType", "Return type of method needs to be generic type Field"); - } - - @Test - @DisplayName("External field method needs to have a generic type parameter that matches scalar type in schema field") - void externalFieldMethodWrongGenericType() { - assertErrorsContain("externalFieldMethodWrongGenericTypeParameter", "Type parameter of generic type Field in method needs to match scalar type of field"); - } - - @Test - @DisplayName("External field in schema needs to have a container type with a table directly associated with it") - void externalFieldNoTable() { - assertErrorsContain("externalFieldNoTable", "No table found for field name"); - } - - - @Test - @DisplayName("External field in wrapper type without table should find previous target table") - void externalFieldWrappedType() { - getProcessedSchema("externalFieldWrappedType"); - assertNoWarnings(); - } - - @Test - @DisplayName("Subtype should not be validated as reference") - void sharedSubtypeShouldNotBeValidatedAsReference() { - getProcessedSchema("sharedSubtypeShouldNotBeValidatedAsReference"); - assertNoWarnings(); - } - @Test - @DisplayName("reference directive is needed when there are multiple foreign keys between tables. ") - void multipleFKToTable() { - assertErrorsContain("multipleForeignKeysNoRef", "Multiple foreign keys found between tables \"FILM\" and \"LANGUAGE\""); - } - - @Test - @DisplayName("Correct reference to table with multiple foreign keys.") - void multipleFKToTableWithRef() { - getProcessedSchema("multipleForeignKeysWithRef"); - assertNoWarnings(); - } - - @Test - @DisplayName("Scalar field with multiple paths not specifying which key to use") - void scalarFieldWithMultiplePossiblePaths() { - assertErrorsContain("scalarFieldWithMultiplePossiblePaths", "Multiple foreign keys found between tables \"FILM\" and \"LANGUAGE\""); - } - - @Test - @DisplayName("Scalar field specifying target with both key and table") - void scalarFieldWithMultiplePossiblePathsWithKeyAndTable() { - getProcessedSchema("scalarFieldWithMultiplePossiblePathsWithKeyAndTable"); - assertNoWarnings(); - } - - @Test - @DisplayName("Scalar field specifying target with key only") - void scalarFieldWithMultiplePossiblePathsWithKey() { - getProcessedSchema("scalarFieldWithMultiplePossiblePathsWithKey"); - assertNoWarnings(); - } - - @Test - @DisplayName("No foreign key between tables") - void noForeignKeyToTable() { - assertErrorsContain("noForeignKey", "No foreign key found between tables"); - } - - @Test - @DisplayName("Chained reference tags to table") - void chainedReferenceToTable() { - getProcessedSchema("chainedReferences"); - } - - @Test - @DisplayName("Checking key_reference for self-reference") - void checkImplicitKeyReference() { - assertErrorsContain("invalidSelfReference", "No foreign key found between tables \"CITY\" and \"CITY\""); - } - - @Test - @DisplayName("Listed, then input nested and listed again field") // Could equivalently be input as well, but field is simpler. - void listedNestedListedField() { - assertErrorsContain("listedNestedListedField", Set.of(CUSTOMER_TABLE), - "Argument 'in0' is a collection of InputFields ('Wrapper') type." + - " Fields returning collections: 'in1' are not supported on such types (used for generating condition tuples)" - ); - } - - @Test - @DisplayName("Listed optional input field") - void listedOptionalInput() { - assertErrorsContain("listedOptionalInput", Set.of(DUMMY_INPUT, CUSTOMER_TABLE), - "Argument 'in' is a collection of InputFields ('DummyInput') type." + - " Optional fields on such types are not supported." + - " The following fields will be treated as mandatory in the resulting, generated condition tuple: 'id'" - ); - } - - @Test - @DisplayName("Interface with one implementing type validation.") - void interfaceWithOneSubtype() { - assertErrorsContain("interfaceWithOneType", "The field someInterface's type SomeInterface has 1 implementing type(s)."); - } - - @Test - @DisplayName("Union with one implementing type validation.") - void unionWithOneSubtype() { - assertErrorsContain("unionWithOneType", "The field someUnion's type SomeUnion has 1 implementing type(s)."); - } - - @Test - @DisplayName("Union with one error type should not throw error") - void errorUnionWithOneSubtype() { - getProcessedSchema("errorUnionWithOneSubtype", Set.of(ERROR)); - } - - @Test - @DisplayName("Listed wrapper type in table type should throw error") - void listedWrapperType() { - assertErrorsContain("listedWrapperType", - "Field 'Customer.name' returns a list of wrapper type 'CustomerName' (a type wrapping a subset of the table fields), " + - "which is not supported. Change the field to return a single 'CustomerName' to fix."); - } - - @Test - @DisplayName("Listed wrapper type (with table directive) in table type should throw error") - void listedWrapperTypeWithTable() { - assertErrorsContain("listedWrapperTypeWithTable", - "Field 'Customer.name' returns a list of wrapper type 'CustomerName' (a type wrapping a subset of the table fields), " + - "which is not supported. Change the field to return a single 'CustomerName' to fix."); - } - - @Test - @DisplayName("Nested listed wrapper type in table type should throw error") - void nestedListedWrapperType() { - assertErrorsContain("nestedListedWrapperType", - "Field 'NameWrapper.name' returns a list of wrapper type 'CustomerName' (a type wrapping a subset of the table fields), " + - "which is not supported. Change the field to return a single 'CustomerName' to fix."); - } - - @Test - @DisplayName("Validation should not fail for tables with \"_\" suffix in java field name") - void tableWithSameNameAsSchema() { - getProcessedSchema("tableWithSameNameAsSchema"); - assertNoWarnings(); - } - - @Test - @DisplayName("Error should be thrown on lookup argument with @reference") - void lookupAndReferenceOnArgument() { - assertErrorsContain("lookupAndReferenceOnArgument", - "Argument/input field 'customerId' on 'Query.query' has lookupKey directive, but is a reference field. " + - "Lookup on references is not currently supported." - ); - } - - @Test - @DisplayName("Error should be thrown on lookup input type containing @reference fields") - void lookupInputTypeWithReferenceFields() { - assertErrorsContain("lookupInputTypeWithReferenceFields", - "Argument 'input' on 'Query.query' has lookupKey directive, but contains reference field(s): 'LookupInput.customerId', 'LookupInput.cityId'. " + - "Lookup on references is not currently supported." - ); - } - - @Test - @DisplayName("No error on lookup input type without reference fields") - void noWarningsOnLookupTypeWithoutReferenceFields() { - getProcessedSchema("lookupInputType", Set.of(CUSTOMER_NODE)); - assertNoWarnings(); - } - - @Test - @DisplayName("Construct type on field without resolvable table") - void constructTypeOnFieldWithoutResolvableTable() { - assertErrorsContain("constructTypeOnFieldWithoutResolvableTable", Set.of(CUSTOMER_QUERY), - String.format( - "Field %s uses @%s but the containing type has no resolvable table.", - "'Customer.field'", - CONSTRUCT_TYPE.getName() - ) - ); - } - - @Test - @DisplayName("Construct type target has @table directive") - void constructTypeTargetHasTable() { - assertErrorsContain("constructTypeTargetHasTable", Set.of(CUSTOMER_QUERY), - String.format( - "Field %s uses @%s but the target type '%s' has a @%s directive. The target type must not have its own table.", - "'Customer.field'", - CONSTRUCT_TYPE.getName(), - "Address", - TABLE.getName() - ) - ); - } - - @Test - @DisplayName("Construct type combined with @field directive") - void constructTypeWithFieldDirective() { - assertErrorsContain("constructTypeWithFieldDirective", Set.of(CUSTOMER_QUERY), - String.format( - "Field %s can not have both @%s and @%s directives.", - "'Customer.field'", - CONSTRUCT_TYPE.getName(), - FIELD.getName() - ) - ); - } - - @Test - @DisplayName("Construct type combined with @externalField directive") - void constructTypeWithExternalFieldDirective() { - assertErrorsContain("constructTypeWithExternalFieldDirective", Set.of(CUSTOMER_QUERY), - String.format( - "Field %s can not have both @%s and @%s directives.", - "'Customer.field'", - CONSTRUCT_TYPE.getName(), - EXTERNAL_FIELD.getName() - ) - ); - } - - @Test - @DisplayName("Construct type with invalid selection field") - void constructTypeInvalidSelectionField() { - assertErrorsContain("constructTypeInvalidSelectionField", Set.of(CUSTOMER_QUERY), - String.format( - "Field %s uses @%s with selection field '%s' which does not exist in target type '%s'.", - "'Customer.field'", - CONSTRUCT_TYPE.getName(), - "nonExistent", - "Inner" - ) - ); - } - - @Test - @DisplayName("Construct type with nested object in selection") - void constructTypeWithNestedObject() { - assertErrorsContain("constructTypeWithNestedObject", Set.of(CUSTOMER_QUERY), - String.format( - "Field %s uses @%s with selection field '%s' which is an object type. Only scalar and enum fields are allowed in construct selections.", - "'Customer.field'", - CONSTRUCT_TYPE.getName(), - "nested" - ) - ); - } - - @Test - @DisplayName("Construct type with nonexistent column in selection") - void constructTypeNonexistentColumn() { - assertErrorsContain("constructTypeNonexistentColumn", Set.of(CUSTOMER_QUERY), - String.format( - "Field %s uses @%s with selection column '%s' which does not exist in table '%s'.", - "'Customer.field'", - CONSTRUCT_TYPE.getName(), - "NONEXISTENT_COLUMN", - "CUSTOMER" - ) - ); - } - - @Test - @DisplayName("Multi-step reference path with one-to-many on query argument is not supported") - void oneToManyMultiStepInputReference() { - assertErrorsContain("oneToManyMultiStepInputReference", - "Field 'email' on 'Query.cities' has a multi-step @reference path with a one-to-many relationship " + - "from \"CITY\" to \"ADDRESS\" in a non-final step. This is not currently supported on filter inputs because it causes row duplication. " + - "Use the @condition directive for complex cross-table filtering instead."); - } - - @Test - @DisplayName("Self-referencing table with @splitQuery produces no error or warning") - void selfReferenceWithSplitQuery() { - getProcessedSchema("selfReferenceWithSplitQuery"); - assertNoWarnings(); - } - - @Test - @DisplayName("Self-referencing table requires @splitQuery directive") - void selfReferenceWithoutSplitQuery() { - assertErrorsContain("selfReferenceWithoutSplitQuery", - "Field 'Film.sequel' is a field generating a table self-reference. This is only supported if the field has the @splitQuery directive." - ); - } - - @Test - @DisplayName("Listed (reverse) self reference should give warning") - void reverseSelfReference() { - getProcessedSchema("reverseSelfReference"); - assertWarningsContain( - "Field 'Film.sequels' is a listed field generating a table self-reference through a key, implying you may want a reverse reference. " + - "Reverse self reference is not currently supported. Possible workaround is defining a custom reference condition." - ); - } - - @Test - @DisplayName("Listed (reverse) self reference with key should give warning") - void reverseSelfReferenceWithKey() { - getProcessedSchema("reverseSelfReferenceWithKey"); - assertWarningsContain("'Film.sequels' is a listed field generating a table self-reference"); - } - - @Test - @DisplayName("Listed (reverse) self-reference is allowed with condition join") - void reverseSelfReferenceWithCondition() { - getProcessedSchema("reverseSelfReferenceWithCondition"); - assertNoWarnings(); - } - - @Test - @DisplayName("Listed (reverse) self reference for types mapping to the same table should give warning") - void reverseSelfReferenceDifferentTypes() { - getProcessedSchema("reverseSelfReferenceDifferentTypes"); - assertWarningsContain( - "Field 'Film.sequels' is a listed field generating a table self-reference" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/ReadingTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/ReadingTest.java deleted file mode 100644 index 4f3f1f5574..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/ReadingTest.java +++ /dev/null @@ -1,55 +0,0 @@ -package no.sikt.graphitron.validation; - -import ch.qos.logback.classic.Level; -import ch.qos.logback.classic.Logger; -import ch.qos.logback.classic.spi.ILoggingEvent; -import ch.qos.logback.core.read.ListAppender; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.generate.GraphQLGenerator; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.slf4j.LoggerFactory; - -import static no.sikt.graphitron.common.configuration.TestConfiguration.setProperties; -import static org.assertj.core.api.Assertions.assertThat; - -@DisplayName("Reading schema - Logs when reading schema files") -public class ReadingTest extends ValidationTest { - @Override - protected String getSubpath() { - return super.getSubpath() + "reading"; - } - - @Test - @DisplayName("Schema files are read and their names printed") - void logReadSchemaFiles() { - setProperties(); - var testDirectory = getSourceTestPath() + "logReadSchemaFiles"; - GeneratorConfig.setGeneratorSchemaFiles(testDirectory + "/schema1.graphqls", testDirectory + "/subdir/schema2.graphqls", testDirectory + "/subdir/subsubdir/schema3.graphqls"); - - GraphQLGenerator.getProcessedSchema(true); - assertThat(getInfo()) - .contains("Reading graphql schemas", "schema1.graphqls", "schema2.graphqls", "schema3.graphqls") - .doesNotContain("notASchema"); - } - - @BeforeEach - @Override - public void setup() { - var logWatch = new ListAppender<ILoggingEvent>(); - logWatch.start(); - ((Logger) LoggerFactory.getLogger(GraphQLGenerator.class)).addAppender(logWatch); - this.logWatcher = logWatch; - } - - private String getInfo() { - return logWatcher - .list - .stream() - .filter(it -> it.getLevel() == Level.INFO) - .map(ILoggingEvent::getFormattedMessage) - .findFirst() - .orElse(""); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/SingleTableInterfaceTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/SingleTableInterfaceTest.java deleted file mode 100644 index 2e75bbe077..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/SingleTableInterfaceTest.java +++ /dev/null @@ -1,145 +0,0 @@ -package no.sikt.graphitron.validation; - -import no.sikt.graphitron.common.configuration.SchemaComponent; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_TABLE; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; - -@DisplayName("Single table interface validation") -public class SingleTableInterfaceTest extends ValidationTest { - @Override - protected String getSubpath() { - return super.getSubpath() + "interface/singleTable"; - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(CUSTOMER_TABLE); - } - - @Test - @DisplayName("Discriminate directive on interface but not table") - void missingTable() { - assertErrorsContain("missingTable", - "'discriminate' and 'table' directives on interfaces must be used together. " + - "Interface 'Address' is missing 'table' directive."); - } - - @Test - @DisplayName("Table directive on interface but not discriminate") - void missingDiscriminate() { - assertErrorsContain("missingDiscriminate", - "'discriminate' and 'table' directives on interfaces must be used together. " + - "Interface 'Address' is missing 'discriminate' directive."); - } - - @Test - @DisplayName("Column in discriminate directive does not exists in table") - void discriminateFieldDoesNotExist() { - assertErrorsContain("discriminateFieldDoesNotExist", - "Interface 'AddressByDistrict' has discriminating field set as 'COLUMN_DOES_NOT_EXIST', but the field does not exist in table 'ADDRESS'."); - } - - @Test - @DisplayName("Discriminating column is not of a String type") - void discriminateFieldIsNotString() { - assertErrorsContain("discriminateFieldIsNotString", - "Interface 'AddressByDistrict' has discriminating field set as 'CITY_ID', but the field does not return a string type, which is not supported."); - } - - @Test - @DisplayName("Discriminator directive on type, but does not implement any interfaces") - void typeWithDiscriminatorDoesNotImplementAnyInterface() { - assertErrorsContain("typeWithDiscriminatorDoesNotImplementAnyInterface", - "Type 'Address' has discriminator, but doesn't implement any interfaces requiring it."); - } - - @Test - @DisplayName("Discriminator directive on type, but does not implement any interfaces with discriminate directive") - void typeWithDiscriminatorDoesNotImplementSingleTableInterface() { - assertErrorsContain("typeWithDiscriminatorDoesNotImplementSingleTableInterface", - "Type 'AddressInDistrictOne' has discriminator, but doesn't implement any interfaces requiring it."); - } - - @Test - @DisplayName("Type implements single table interface but is missing discriminator directive") - void typeWithoutDiscriminatorImplementsSingleTableInterface() { - assertErrorsContain("typeWithoutDiscriminatorImplementsSingleTableInterface", - "Type 'Address' is missing 'discriminator' directive in order to implement interface 'AddressByDistrict'."); - } - - @Test - @DisplayName("Single table interface has implementing type with different table") - void singleTableInterfaceHasTypeWithDifferentTable() { - assertErrorsContain("singleTableInterfaceHasTypeWithDifferentTable", - "Interface 'AddressByDistrict' requires implementing types to have table 'ADDRESS', but type 'Address' has table 'SOME_OTHER_TABLE'."); - } - - @Test - @DisplayName("Overriding field directive on field in single table interface should not throw error") - void fieldOverride() { - getProcessedSchema("fieldOverride"); - } - - @Test - @DisplayName("Mismatch in reference directive on field in single table interface") - void referenceConflict() { - assertErrorsContain("referenceConflict", - "Overriding 'reference' configuration in types implementing a single table interface is not " + - "currently supported, and must be identical with interface. Type 'AddressInDistrictOne' has a configuration mismatch on field " + - "'customer' from the interface 'Address'.", - "Type 'AddressInDistrictTwo' has a configuration mismatch" - ); - } - - @Test - @DisplayName("Mismatch in field directive on field in single table interface") - void conditionConflict() { - assertErrorsContain("conditionConflict", - "Overriding 'condition' configuration in types implementing a single table interface is not " + - "currently supported, and must be identical with interface. Type 'AddressInDistrictOne' has a configuration mismatch on field " + - "'customer' from the interface 'Address'.", - "Type 'AddressInDistrictTwo' has a configuration mismatch" - ); - } - - @Test - @DisplayName("Mismatch in field directive on field in type implementing single table interface") - void fieldInTypeConflict() { - assertErrorsContain("fieldInTypeConflict", - "Different configuration on fields in types implementing the same single table interface is currently not supported. Field " + - "'sharedField' occurs in two or more types implementing interface 'Address', but there is a mismatch between the configuration of the 'field' directive."); - } - - @Test - @DisplayName("Matching reference directive on field in type implementing single table interface") - void referenceMatches() { - assertDoesNotThrow(() -> generateFiles("referenceMatches")); - } - - @Test - @DisplayName("Mismatch in reference directive on field in type implementing single table interface") - void referenceInTypeConflict() { - assertErrorsContain("referenceInTypeConflict", - "Different configuration on fields in types implementing the same single table interface is currently not supported. " + - "Field 'customer' occurs in two or more types implementing interface 'Address', but there is a mismatch between the configuration of the 'reference' directive."); - } - - @Test - @DisplayName("Mismatch in condition reference directive on field in type implementing single table interface") - void conditionReferenceInTypeConflict() { - assertErrorsContain("conditionReferenceInTypeConflict", - "Different configuration on fields in types implementing the same single table interface is currently not supported. " + - "Field 'customer' occurs in two or more types implementing interface 'Address', but there is a mismatch between the configuration of the 'reference' directive."); - } - - @Test - @DisplayName("Single table interface is used as type for a split query") - void splitQuery() { - assertErrorsContain("splitQuery", "interface (AddressInterface) returned in non root object. This is not fully supported. "); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/SplitQueryAfterJavaServiceTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/SplitQueryAfterJavaServiceTest.java deleted file mode 100644 index ab01d86bfb..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/SplitQueryAfterJavaServiceTest.java +++ /dev/null @@ -1,61 +0,0 @@ -package no.sikt.graphitron.validation; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_CONNECTION; -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_TABLE; -import static no.sikt.graphitron.common.configuration.SchemaComponent.NODE; - -@DisplayName("Schema validation - splitQuery fields after services returning Java record") -public class SplitQueryAfterJavaServiceTest extends ValidationTest { - @Override - protected String getSubpath() { - return super.getSubpath() + "service/java"; - } - - @Test - @DisplayName("Single object should not throw error") - void defaultCase() { - getProcessedSchema("default", Set.of(CUSTOMER_TABLE)); - } - - @Test - @DisplayName("Listed field is supported") - void listed() { - getProcessedSchema("listed", Set.of(CUSTOMER_TABLE)); - } - - @Test - @DisplayName("Paginated field is not currently supported") - void paginated() { - assertErrorsContain("paginated", Set.of(CUSTOMER_CONNECTION), - "'DummyTypeRecord.customer' in a java record has splitQuery directive, " + - "but is paginated. This is not supported."); - } - - @Test - @DisplayName("Does not return type") - void notType() { - assertErrorsContain("notType", Set.of(CUSTOMER_TABLE), - "'DummyTypeRecord.customer' in a java record has splitQuery directive, " + - "but does not return a type with table. This is not supported."); - } - - @Test - @DisplayName("Parent type with @table should not cause foreign key validation") - void withTableParent() { - getProcessedSchema("withTableParent", Set.of(NODE, CUSTOMER_TABLE)); - } - - @Test - @DisplayName("Type without table") - void typeWithoutTable() { - assertErrorsContain("typeWithoutTable", - "'DummyTypeRecord.wrapper' in a java record has splitQuery directive, " + - "but does not return a type with table. This is not supported." - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/UnknownTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/UnknownTest.java deleted file mode 100644 index eb446b2d59..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/UnknownTest.java +++ /dev/null @@ -1,432 +0,0 @@ -package no.sikt.graphitron.validation; - -import no.sikt.graphitron.configuration.externalreferences.ExternalReference; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.ReferencedEntry.*; -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; -import static no.sikt.graphql.directives.GenerationDirective.TABLE; -import static no.sikt.graphql.directives.GenerationDirective.RECORD; - -@DisplayName("Schema validation - Unknown and unresolvable values") -public class UnknownTest extends ValidationTest { - @Override - protected String getSubpath() { - return super.getSubpath() + "unknown"; - } - - @Override - protected Set<ExternalReference> getExternalReferences() { - return makeReferences(DUMMY_CONDITION, RESOLVER_MUTATION_SERVICE, DUMMY_SERVICE, JAVA_RECORD_CUSTOMER); - } - - @Test - @DisplayName("Enum reference that can not be resolved") - void unknownEnum() { - assertErrorsContain("enum", "No enum with name 'UNKNOWN_ENUM' found."); - } - - @Test - @DisplayName("Type table") - void typeTable() { - assertErrorsContain("typeTable", "No table with name \"UNKNOWN_TABLE\" found."); - } - - @Test - @DisplayName("Input table") - void inputTable() { - assertErrorsContain("inputTable", "No table with name \"UNKNOWN_TABLE\" found."); - } - - @Test - @DisplayName("Field reference table") - void fieldReferenceTable() { - assertErrorsContain("fieldReferenceTable", "No table with name \"UNKNOWN_TABLE\" found."); - } - - @Test - @DisplayName("Input field reference table") - void inputFieldReferenceTable() { - assertErrorsContain("inputFieldReferenceTable", "No table with name \"UNKNOWN_TABLE\" found."); - } - - @Test - @DisplayName("Argument reference table") - void argumentReferenceTable() { - assertErrorsContain("argumentReferenceTable", "No table with name \"UNKNOWN_TABLE\" found."); - } - - @Test - @DisplayName("Field reference key") - void fieldReferenceKey() { - assertErrorsContain("fieldReferenceKey", "No key with name \"UNKNOWN_KEY\" found."); - } - - @Test - @DisplayName("Input field reference key") - void inputFieldReferenceKey() { - assertErrorsContain("inputFieldReferenceKey", "No key with name \"UNKNOWN_KEY\" found."); - } - - @Test - @DisplayName("Argument reference key") - void argumentReferenceKey() { - assertErrorsContain("argumentReferenceKey", "No key with name \"UNKNOWN_KEY\" found."); - } - - @Test - @DisplayName("Referencing unknown type") - void type() { - assertErrorsContain("type", "Field \"query\" within schema type \"Query\" has invalid type \"INVALID\""); - } - - @Test - @DisplayName("Referencing unknown type one close match") - void typeDistance() { - assertErrorsContain( - "typeDistance", - "Field \"query\" within schema type \"Query\" has invalid type \"Typee\" (or an union containing it). " + - "Closest type matches found by levenshtein distance are:\nType - 1" - ); - } - - @Test - @DisplayName("Referencing unknown type with two equally close matches") - void typeDistanceEqual() { - assertErrorsContain( - "typeDistanceEqual", - "Field \"query\" within schema type \"Query\" has invalid type \"Type\" (or an union containing it). " + - "Closest type matches found by levenshtein distance are:\nType0 - 1, Type1 - 1" - ); - } - - @Test - @DisplayName("Referencing unknown type inside an union") - void typeInUnion() { - assertErrorsContain( - () -> getProcessedSchema("typeInUnion", DUMMY_TYPE), - "Field \"query\" within schema type \"Query\" has invalid type \"INVALID\"" - ); - } - - @Test - @DisplayName("Referencing unknown type inside a nested union") - void typeInNestedUnion() { - assertErrorsContain( - () -> getProcessedSchema("typeInNestedUnion", DUMMY_TYPE), - "Field \"query\" within schema type \"Query\" has invalid type \"INVALID\"" - ); - } - - @Test - @Disabled("Input types are not checked") - @DisplayName("Referencing unknown input type") - void inputType() { - assertErrorsContain("inputType", "Field \"in\" within schema type \"Query\" has invalid type \"INVALID\""); - } - - @Test - @DisplayName("Field that can not be connected to anything in a table") - void field() { - assertErrorsContain("field", - "No field with name 'WRONG' found in table 'CUSTOMER' which is required by 'Customer.wrong'." - ); - } - - @Test - @DisplayName("Field that can not be connected to a field in implicit table provided through input") - void fieldWithImplicitTableFromInput() { - assertErrorsContain("fieldWithImplicitTableFromInput", Set.of(CUSTOMER_NODE_INPUT_TABLE), - "No field with name 'WRONG' found in table 'CUSTOMER' which is required by 'Query.query'." - ); - } - - @Test - @DisplayName("Wrapped field that can not be connected to a field in implicit table provided through input") - void wrappedFieldWithImplicitTableFromInput() { - assertErrorsContain("wrappedFieldWithImplicitTableFromInput", Set.of(CUSTOMER_NODE_INPUT_TABLE), - "No field with name 'WRONG' found in table 'CUSTOMER' which is required by 'CustomerNoTable.wrong'." - ); - } - - @Test - @DisplayName("Mutation with conflicting input and output tables validates output against output table") - void fieldInMutationWithConflictingTable() { - assertErrorsContain("fieldInMutationWithConflictingTable", Set.of(CUSTOMER_NODE_INPUT_TABLE), - "No field with name 'WRONG' found in table 'ADDRESS' which is required by 'Address.wrong'." - ); - } - - @Test - @DisplayName("Field that exists in a table") - void knownField() { - getProcessedSchema("knownField"); - assertNoWarnings(); - } - - @Test - @DisplayName("Input field that can not be connected to anything in a table") - void argument() { - assertErrorsContain("argument", Set.of(CUSTOMER_TABLE), - "No field with name 'WRONG' found in table 'CUSTOMER'" - ); - } - - @Test - @DisplayName("Field that can not be connected to anything in a table but is not generated") - void unknownNotGeneratedField() { - getProcessedSchema("unknownNotGeneratedField"); - assertNoWarnings(); - } - - @Test - @DisplayName("Input field that exists in a table") - void knownArgument() { - getProcessedSchema("knownArgument", Set.of(CUSTOMER_TABLE)); - assertNoWarnings(); - } - - @Test - @DisplayName("Input field that can not be connected to anything in a table but is not generated") - void notGeneratedArgument() { - getProcessedSchema("notGeneratedArgument", Set.of(CUSTOMER_TABLE)); - assertNoWarnings(); - } - - @Test // ID fields are not validated. - @DisplayName("ID field that can not be connected to anything in a table") - void id() { - getProcessedSchema("id"); - assertNoWarnings(); - } - - @Test - @DisplayName("Wrapped field that can not be connected to anything in a table") - void fieldWrapped() { - assertErrorsContain("fieldWrapped", - "No field with name 'WRONG' found in table 'CUSTOMER'" - ); - } - - @Test - @DisplayName("Input field that can not be connected to a table but covered by an overriding condition") - void argumentWithOverrideCondition() { - getProcessedSchema("argumentWithOverrideCondition", CUSTOMER_TABLE); - assertNoWarnings(); - } - - @Test - @DisplayName("Input field that can not be connected to a table with a non-overriding condition") - void argumentWithCondition() { - assertErrorsContain("argumentWithCondition", Set.of(CUSTOMER_TABLE), - "No field with name 'WRONG' found in table 'CUSTOMER'" - ); - } - - @Test - @DisplayName("Input field that can not be connected to a table but covered by a surrounding overriding condition") - void argumentWithFieldOverrideCondition() { - getProcessedSchema("argumentWithFieldOverrideCondition", CUSTOMER_TABLE); - assertNoWarnings(); - } - - @Test - @DisplayName("Input field that can not be connected to a table with a surrounding non-overriding condition") - void argumentWithFieldCondition() { - assertErrorsContain("argumentWithFieldCondition", Set.of(CUSTOMER_TABLE), - "No field with name 'WRONG' found in table 'CUSTOMER'" - ); - } - - @Test - @DisplayName("Input type field that can not be connected to a table but covered by a surrounding overriding condition") - void argumentWithTypeOverrideCondition() { - getProcessedSchema("argumentWithTypeOverrideCondition", CUSTOMER_TABLE); - assertNoWarnings(); - } - - @Test - @DisplayName("Input type field that can not be connected to a table with a surrounding non-overriding condition") - void argumentWithTypeCondition() { - assertErrorsContain("argumentWithTypeCondition", Set.of(CUSTOMER_TABLE), - "No field with name 'WRONG' found in table 'CUSTOMER'" - ); - } - - @Test - @DisplayName("Referencing unknown service") - void service() { - assertErrorsContain("service", "No service with name 'INVALID' found."); - } - - @Test - @DisplayName("Service method that can not be found") - void undefinedServiceMethod() { - assertErrorsContain("undefinedServiceMethod", "Service reference with name 'class no.sikt.graphitron.codereferences.services.ResolverMutationService' does not contain a method named 'UNDEFINED'."); - } - - @Test - @DisplayName("Argument @field column does not exist in @reference table") - void argumentReferenceFieldNotInTable() { - assertErrorsContain("argumentReferenceFieldNotInTable", Set.of(CUSTOMER_TABLE), - "No field with name 'STORE_ID' found in table 'CATEGORY'" - ); - } - - @Test - @DisplayName("Argument @field column does not exist in table resolved via @reference key") - void argumentReferenceKeyFieldNotInTable() { - assertErrorsContain("argumentReferenceKeyFieldNotInTable", Set.of(CUSTOMER_TABLE), - "No field with name 'STORE_ID' found in table 'ADDRESS'" - ); - } - - @Test - @DisplayName("Argument @field column does not exist in final table of multi-step @reference path") - void argumentReferenceMultiPathFieldNotInTable() { - assertErrorsContain("argumentReferenceMultiPathFieldNotInTable", Set.of(CUSTOMER_TABLE), - "No field with name 'STORE_ID' found in table 'CITY'" - ); - } - - @Test - @DisplayName("Argument @field column in @reference table is not validated when overriding condition is present") - void argumentReferenceWithOverrideCondition() { - getProcessedSchema("argumentReferenceWithOverrideCondition", CUSTOMER_TABLE); - assertNoWarnings(); - } - - @Test - @DisplayName("Input field @field column does not exist in @reference table") - void inputFieldReferenceFieldNotInTable() { - assertErrorsContain("inputFieldReferenceFieldNotInTable", Set.of(CUSTOMER_TABLE), - "No field with name 'STORE_ID' found in table 'CATEGORY'" - ); - } - - @Test - @DisplayName("Fields returning wrapper types should not cause errors about missing field/method") - void wrapperType() { - getProcessedSchema("wrapperTypeWithTable"); - assertNoWarnings(); - } - - @Test - @DisplayName("External fields should not cause errors about missing field/method for table") - void externalField() { - getProcessedSchema("externalField"); - assertNoWarnings(); - } - - @Test - @DisplayName("jOOQ record service should not incorrectly validate that Java record input fields exist on customer table") - void javaRecordInputJooqRecordOutput() { - getProcessedSchema("javaRecordInputJooqRecordOutput", Set.of(CUSTOMER_TABLE)); - assertNoWarnings(); - } - - @Test - @DisplayName("Service input type missing @table or @record directive") - void serviceInputMissingDirective() { - assertErrorsContain("serviceInputMissingDirective", - String.format("Input type 'TestInput' is used as an argument on service field 'Query.test', but has neither the @%s nor the @%s directive.", TABLE.getName(), RECORD.getName())); - } - - @Test - @DisplayName("Service input type with @record maps to incompatible class") - void serviceInputTypeMismatch() { - assertErrorsContain("serviceInputTypeMismatch", - "on service field 'Query.test'", - "has input type 'TestInput' which maps to 'CustomerJavaRecord'", - "but there is no overload of 'check' that accepts this", - "check(CustomerRecord)"); - } - - @Test - @DisplayName("Service input type with @table maps to incompatible class") - void serviceInputTableTypeMismatch() { - assertErrorsContain("serviceInputTableTypeMismatch", - "on service field 'Query.test'", - "has input type 'TestInput' which maps to 'CustomerRecord'", - "but there is no overload of 'checkString' that accepts this", - "checkString(String)"); - } - - @Test - @DisplayName("Service input type with valid @table directive does not produce false positive") - void serviceInputValidRecord() { - getProcessedSchema("serviceInputValidRecord"); - assertNoWarnings(); - } - - @Test - @DisplayName("Nested @table input with another @table field does not produce false positive") - void serviceInputNestedTableWithRecord() { - getProcessedSchema("serviceInputNestedTableWithRecord"); - assertNoWarnings(); - } - - @Test - @DisplayName("Nested @table input with extra method parameter triggers count mismatch") - void serviceInputCountMismatch() { - assertErrorsContain("serviceInputCountMismatch", - "Service field 'Query.test' maps to 2 method parameter(s)", - "but there is no overload of 'checkNestedWrongCount' with that parameter count", - "checkNestedWrongCount(CustomerRecord, AddressRecord, CustomerRecord)"); - } - - @Test - @DisplayName("Listed @table input with valid service method does not produce false positive") - void serviceInputListedTable() { - getProcessedSchema("serviceInputListedTable"); - assertNoWarnings(); - } - - @Test - @DisplayName("Listed @table input with incompatible service method element type") - void serviceInputListedTableTypeMismatch() { - assertErrorsContain("serviceInputListedTableTypeMismatch", - "on service field 'Query.test'", - "has input type 'TestInput' which maps to 'List<CustomerRecord>'", - "but there is no overload of 'checkIncorrect' that accepts this", - "checkIncorrect(List<String>)"); - } - - @Test - @DisplayName("Listed input but service method expects non-list parameter") - void serviceInputListedNonListParam() { - assertErrorsContain("serviceInputListedNonListParam", - "on service field 'Query.test'", - "has input type 'TestInput' which maps to 'List<CustomerRecord>'", - "but there is no overload of 'check' that accepts this", - "check(CustomerRecord)"); - } - - @Test - @DisplayName("Non-listed input but service method expects list parameter") - void serviceInputNonListedListParam() { - assertErrorsContain("serviceInputNonListedListParam", - "on service field 'Query.test'", - "has input type 'TestInput' which maps to 'CustomerRecord'", - "but there is no overload of 'checkList' that accepts this", - "checkList(List<CustomerRecord>)"); - } - - @Test - @DisplayName("Service field on table type returning Java record should not validate record fields against table") - void tableObjectWithServiceField() { - getProcessedSchema("tableObjectWithServiceField", Set.of(CUSTOMER_TABLE)); - assertNoWarnings(); - } - - @Test - @DisplayName("Service input with ordering, pagination, and context arguments does not produce false positive") - void serviceInputCountWithAllFeatures() { - getProcessedSchema("serviceInputCountWithAllFeatures", Set.of(CUSTOMER_TABLE, PAGE_INFO)); - assertNoWarnings(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/ValidationTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/ValidationTest.java deleted file mode 100644 index 873c8417b6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/validation/ValidationTest.java +++ /dev/null @@ -1,99 +0,0 @@ -package no.sikt.graphitron.validation; - -import ch.qos.logback.classic.Level; -import ch.qos.logback.classic.Logger; -import ch.qos.logback.classic.spi.ILoggingEvent; -import ch.qos.logback.core.read.ListAppender; -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.generate.GraphQLGenerator; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.slf4j.LoggerFactory; - -import java.util.Arrays; -import java.util.Set; -import java.util.regex.Pattern; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -abstract public class ValidationTest extends GeneratorTest { - protected ListAppender<ILoggingEvent> logWatcher; - - @Override - protected String getSubpath() { - return "validation/"; - } - - @Override - protected boolean validateSchema() { - return true; - } - - protected String getWarning() { - return logWatcher - .list - .stream() - .filter(it -> it.getLevel() == Level.WARN) - .map(ILoggingEvent::getFormattedMessage) - .findFirst() - .orElse(""); - } - - protected void assertNoWarnings() { - assertThat(getWarning()).isEmpty(); - } - - protected void assertWarningsContain(String... values) { - assertThat(getWarning()).contains(values); - } - - protected void assertErrorsContain(Runnable f, String ... values) { - assertThatThrownBy(f::run) - .isInstanceOf(InvalidSchemaException.class) - .hasMessageContainingAll(values); - } - - protected void assertErrorsContain(String file, String ... values) { - assertErrorsContain(file, Set.of(), values); - } - - protected void assertErrorsContainOnce(String file, String ... values) { - assertErrorsContainExactlyNTimes(file, 1, Set.of(), values); - } - - protected void assertErrorsContain(String file, Set<SchemaComponent> components, String ... values) { - assertThatThrownBy(() -> getProcessedSchema(file, components)) - .isInstanceOf(InvalidSchemaException.class) - .hasMessageContainingAll(values); - } - - protected void assertErrorsDoNotContain(String file, String ... values) { - assertThatThrownBy(() -> getProcessedSchema(file)) - .isInstanceOf(InvalidSchemaException.class) - .satisfies(it -> assertThat(it.getMessage()).doesNotContain(values)); - } - - protected void assertErrorsContainExactlyNTimes(String file, int n, Set<SchemaComponent> components, String ... values) { - assertThatThrownBy(() -> getProcessedSchema(file, components)) - .isInstanceOf(InvalidSchemaException.class) - .matches(it -> - Arrays.stream(values).allMatch(value -> Pattern.compile(Pattern.quote(value)).matcher(it.getMessage()).results().count() == n)); - } - - @BeforeEach - public void setup() { - super.setup(); - var logWatch = new ListAppender<ILoggingEvent>(); - logWatch.start(); - ((Logger) LoggerFactory.getLogger(ValidationHandler.class)).addAppender(logWatch); - this.logWatcher = logWatch; - } - - @AfterEach - public void teardown() { - super.teardown(); - ((Logger) LoggerFactory.getLogger(GraphQLGenerator.class)).detachAndStopAllAppenders(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/wiring/WiringBuilderMutationTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/wiring/WiringBuilderMutationTest.java deleted file mode 100644 index f123496b0a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/wiring/WiringBuilderMutationTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package no.sikt.graphitron.wiring; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.codeinterface.wiring.WiringClassGenerator; -import no.sikt.graphitron.generators.datafetchers.operations.OperationClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_INPUT_TABLE; -import static no.sikt.graphitron.common.configuration.SchemaComponent.CUSTOMER_TABLE; - -@DisplayName("Mutation Wiring - Generation of the method returning a runtime wiring builder") -public class WiringBuilderMutationTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "wiring"; - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - var generator = new OperationClassGenerator(schema); - return List.of(generator, new WiringClassGenerator(List.of(generator), schema)); - } - - @Test - @DisplayName("One mutation data fetcher generator exists") - void defaultCase() { - assertGeneratedContentContains( - "mutation", - Set.of(CUSTOMER_TABLE, CUSTOMER_INPUT_TABLE), - ".newTypeWiring(\"Mutation\").dataFetcher(\"mutation\", MutationGeneratedDataFetcher.mutation()" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/wiring/WiringBuilderTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/wiring/WiringBuilderTest.java deleted file mode 100644 index ce17698726..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/wiring/WiringBuilderTest.java +++ /dev/null @@ -1,103 +0,0 @@ -package no.sikt.graphitron.wiring; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.configuration.GeneratorConfig; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.codeinterface.wiring.WiringClassGenerator; -import no.sikt.graphitron.generators.datafetchers.operations.OperationClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.*; -import static no.sikt.graphitron.generators.codebuilding.VariableNames.VAR_NODE_STRATEGY; - -@DisplayName("Wiring - Generation of the method returning a runtime wiring builder") -public class WiringBuilderTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "wiring"; - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - var generator = new OperationClassGenerator(schema); - return List.of(generator, new WiringClassGenerator(List.of(generator), schema)); - } - - @Test - @DisplayName("One data fetcher generator exists") - void defaultCase() { - assertGeneratedContentMatchesFromComponents("default", CUSTOMER_QUERY, CUSTOMER); - } - - @Test - @DisplayName("Node data fetcher generator exists") - void node() { - assertGeneratedContentContains( - "node", Set.of(NODE), - "getRuntimeWiringBuilder(NodeIdHandler _iv_nodeIdHandler)", - ".dataFetcher(\"node\", QueryGeneratedDataFetcher.node(_iv_nodeIdHandler)" - ); - } - - @Test - @DisplayName("Node data fetcher generator exists when using node strategy") - void nodeStrategy() { - GeneratorConfig.setNodeStrategy(true); - assertGeneratedContentContains( - "node", Set.of(NODE), - "getRuntimeWiringBuilder(NodeIdStrategy _iv_nodeIdStrategy)", - ".dataFetcher(\"node\", QueryGeneratedDataFetcher.node(_iv_nodeIdStrategy)" - ); - GeneratorConfig.setNodeStrategy(false); - } - - @Test - @DisplayName("Node strategy is not used when enabled but no Node interface exists") - void nodeStrategyWithoutNode() { - GeneratorConfig.setNodeStrategy(true); - resultDoesNotContain(Set.of(CUSTOMER_QUERY, CUSTOMER), "NodeIdStrategy", VAR_NODE_STRATEGY); - GeneratorConfig.setNodeStrategy(false); - } - - @Test - @DisplayName("No fetchers are generated") - void noFetchers() { - assertGeneratedContentContains(Set.of(), ".newRuntimeWiring();return wiring;"); - } - - @Test - @DisplayName("Two data fetcher generators exist for the same type") - void twoFetchers() { - assertGeneratedContentContains( - "twoFetchers", Set.of(CUSTOMER), - "TypeRuntimeWiring.newTypeWiring(\"Query\")" + - ".dataFetcher(\"customer\", QueryGeneratedDataFetcher.customer())" + - ".dataFetcher(\"payment\", QueryGeneratedDataFetcher.payment())" - ); - } - - @Test - @DisplayName("Two types have one data fetcher each") - void twoTypes() { - assertGeneratedContentContains( - "twoTypes", - ".newTypeWiring(\"Query\").dataFetcher(\"customer\",", - ".newTypeWiring(\"Customer\").dataFetcher(\"address\"," - ); - } - - @Test - @DisplayName("Extended scalars present in the schema are added to the wiring") - void extendedScalars() { - assertGeneratedContentContains( - "scalars", - "wiring.scalar(ExtendedScalars.LocalTime);", - "wiring.scalar(ExtendedScalars.GraphQLBigInteger);" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/wiring/WiringEntityFetcherTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/wiring/WiringEntityFetcherTest.java deleted file mode 100644 index f5eb43314f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/wiring/WiringEntityFetcherTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package no.sikt.graphitron.wiring; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.codeinterface.wiring.WiringClassGenerator; -import no.sikt.graphitron.generators.datafetchers.operations.OperationClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.FEDERATION; - -@DisplayName("Entity Wiring - Generation of the wiring for the entity fetcher") -public class WiringEntityFetcherTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "wiring"; - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(FEDERATION); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - var generator = new OperationClassGenerator(schema); - return List.of(generator, new WiringClassGenerator(List.of(generator), schema)); - } - - @Test - @DisplayName("Entity data fetcher exists") - void defaultCase() { - assertGeneratedContentContains( - "entity", - ".newTypeWiring(\"Query\").dataFetcher(\"_entities\", QueryGeneratedDataFetcher._entities()" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/wiring/WiringNoGeneratorsTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/wiring/WiringNoGeneratorsTest.java deleted file mode 100644 index f2f55b72f4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/wiring/WiringNoGeneratorsTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package no.sikt.graphitron.wiring; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.common.configuration.SchemaComponent; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.codeinterface.wiring.WiringClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.FEDERATION; - -@DisplayName("Wiring - Generation of the method returning a runtime wiring") -public class WiringNoGeneratorsTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "wiring"; - } - - @Override - protected Set<SchemaComponent> getComponents() { - return makeComponents(FEDERATION); - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - return List.of(new WiringClassGenerator(List.of(), schema)); - } - - @Test - @DisplayName("No other generator exists") - void noFetchers() { - assertGeneratedContentContains("noGenerators", ".newRuntimeWiring();wiring.scalar(_Any.type);" + - "wiring.scalar(CustomScalars.FieldSet);return wiring;"); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/wiring/WiringTypeResolverTest.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/wiring/WiringTypeResolverTest.java deleted file mode 100644 index b389ddf22c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/java/no/sikt/graphitron/wiring/WiringTypeResolverTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package no.sikt.graphitron.wiring; - -import no.sikt.graphitron.common.GeneratorTest; -import no.sikt.graphitron.generators.abstractions.ClassGenerator; -import no.sikt.graphitron.generators.codeinterface.wiring.WiringClassGenerator; -import no.sikt.graphitron.generators.datafetchers.typeresolvers.TypeResolverClassGenerator; -import no.sikt.graphql.schema.ProcessedSchema; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static no.sikt.graphitron.common.configuration.SchemaComponent.FEDERATION; - -@DisplayName("Type Resolver Wiring - Generation of the type resolver wiring") -public class WiringTypeResolverTest extends GeneratorTest { - @Override - protected String getSubpath() { - return "wiring"; - } - - @Override - protected List<ClassGenerator> makeGenerators(ProcessedSchema schema) { - var generator = new TypeResolverClassGenerator(schema); - return List.of(generator, new WiringClassGenerator(List.of(generator), schema)); - } - - @Test - @DisplayName("Interface type resolver exists") - void interfaceType() { - assertGeneratedContentContains("interface", ".newTypeWiring(\"I\").typeResolver(ITypeResolver.iTypeResolver()"); - } - - @Test - @DisplayName("Union type resolver exists") - void unionType() { - assertGeneratedContentContains("union", ".newTypeWiring(\"U\").typeResolver(UTypeResolver.uTypeResolver()"); - } - - @Test - @DisplayName("Entity type resolver exists") - void entity() { - assertGeneratedContentContains( - "entity", - Set.of(FEDERATION), - ".newTypeWiring(\"_Entity\").typeResolver(EntityTypeResolver.entityTypeResolver()" - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/codeinterface/default/expected/Graphitron.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/codeinterface/default/expected/Graphitron.java deleted file mode 100644 index a449554763..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/codeinterface/default/expected/Graphitron.java +++ /dev/null @@ -1,26 +0,0 @@ -import fake.code.generated.typeregistry.TypeRegistry; -import fake.code.generated.wiring.Wiring; -import graphql.schema.GraphQLSchema; -import graphql.schema.idl.RuntimeWiring; -import graphql.schema.idl.SchemaGenerator; -import graphql.schema.idl.TypeDefinitionRegistry; - -public class Graphitron { - public static TypeDefinitionRegistry getTypeRegistry() { - return TypeRegistry.getTypeRegistry(); - } - - public static RuntimeWiring.Builder getRuntimeWiringBuilder() { - return Wiring.getRuntimeWiringBuilder(); - } - - public static RuntimeWiring getRuntimeWiring() { - return getRuntimeWiringBuilder().build(); - } - - public static GraphQLSchema getSchema() { - var wiring = getRuntimeWiringBuilder(); - var registry = getTypeRegistry(); - return new SchemaGenerator().makeExecutableSchema(registry, wiring.build()); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/codeinterface/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/codeinterface/default/schema.graphqls deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/codeinterface/federation-no-entities/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/codeinterface/federation-no-entities/schema.graphqls deleted file mode 100644 index e4dadece37..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/codeinterface/federation-no-entities/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -extend schema -@link(url: "https://specs.apollo.dev/federation/v2.4", - import: ["@shareable"]) - -type Query { - customer: Customer -} - -type Customer @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/codeinterface/federation/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/codeinterface/federation/schema.graphqls deleted file mode 100644 index 7cbaff3ce1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/codeinterface/federation/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -union _Entity = Customer - -type Customer @table @key(fields: "id", resolvable: true) { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/codeinterface/node/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/codeinterface/node/schema.graphqls deleted file mode 100644 index fb94a7552d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/codeinterface/node/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - customer: Customer - node(id: ID): Node -} - -type Customer implements Node @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/Date.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/Date.graphqls deleted file mode 100644 index 5e1cdadaf8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/Date.graphqls +++ /dev/null @@ -1 +0,0 @@ -scalar Date diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/SplitQueryWrapper.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/SplitQueryWrapper.graphqls deleted file mode 100644 index 8d8fca5658..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/SplitQueryWrapper.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - wrapper: Wrapper @notGenerated -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/AddressByDistrict.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/AddressByDistrict.graphqls deleted file mode 100644 index fcfab21a1f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/AddressByDistrict.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -interface AddressByDistrict @table(name: "ADDRESS") @discriminate(on: "DISTRICT"){ - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressInDistrictOne implements Address @table(name: "ADDRESS") @discriminator(value: "ONE") { - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressInDistrictTwo implements Address @table(name: "ADDRESS") @discriminator(value: "TWO") { - postalCode: String @field(name: "POSTAL_CODE") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/AddressByDistrictConnection.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/AddressByDistrictConnection.graphqls deleted file mode 100644 index 9744d09b2a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/AddressByDistrictConnection.graphqls +++ /dev/null @@ -1,10 +0,0 @@ -type AddressByDistrictConnection { - edges: [AddressByDistrictConnectionEdge] - pageInfo: PageInfo - nodes: [AddressByDistrict!]! -} - -type AddressByDistrictConnectionEdge { - cursor: String - node: AddressByDistrict -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/AddressService.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/AddressService.graphqls deleted file mode 100644 index 16ae6e6b21..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/AddressService.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query: Address @service(service: {name: "DUMMY_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/CityQuery.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/CityQuery.graphqls deleted file mode 100644 index d64b6c7aac..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/CityQuery.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query: City -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/Customer.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/Customer.graphqls deleted file mode 100644 index 7fcaebd3a5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/Customer.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/CustomerConnection.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/CustomerConnection.graphqls deleted file mode 100644 index 8dcd8a4d1f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/CustomerConnection.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type CustomerConnection { - edges: [CustomerConnectionEdge] - pageInfo: PageInfo - nodes: [CustomerTable!]! - totalCount: Int -} - -type CustomerConnectionEdge { - cursor: String - node: CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/CustomerConnectionWithNoOptionals.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/CustomerConnectionWithNoOptionals.graphqls deleted file mode 100644 index 4c700eac3c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/CustomerConnectionWithNoOptionals.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type CustomerNoOptionalsConnection { - edges: [CustomerNoOptionalsConnectionEdge] - pageInfo: PageInfo -} - -type CustomerNoOptionalsConnectionEdge { - cursor: String - node: CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/CustomerInputTable.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/CustomerInputTable.graphqls deleted file mode 100644 index 6f671dc79b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/CustomerInputTable.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -input CustomerInputTable @table(name: "CUSTOMER") { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/CustomerNode.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/CustomerNode.graphqls deleted file mode 100644 index 339c196ffc..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/CustomerNode.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type CustomerNode implements Node @node @table(name: "CUSTOMER") { - id: ID! @nodeId -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/CustomerNodeInputTable.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/CustomerNodeInputTable.graphqls deleted file mode 100644 index 1913ec32f8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/CustomerNodeInputTable.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -input CustomerNodeInputTable @table(name: "CUSTOMER") { - id: ID! @nodeId(typeName: "CustomerNode") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/CustomerNotGenerated.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/CustomerNotGenerated.graphqls deleted file mode 100644 index 77c50759ea..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/CustomerNotGenerated.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query: Customer @notGenerated -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/CustomerQuery.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/CustomerQuery.graphqls deleted file mode 100644 index 8577dc8031..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/CustomerQuery.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query: Customer -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/CustomerTable.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/CustomerTable.graphqls deleted file mode 100644 index fd7d808407..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/CustomerTable.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type CustomerTable @table(name: "CUSTOMER") { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/CustomerUnion.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/CustomerUnion.graphqls deleted file mode 100644 index 1df0e01d0c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/CustomerUnion.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer @table { - union: U -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/DummyConnection.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/DummyConnection.graphqls deleted file mode 100644 index 66428546f7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/DummyConnection.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type DummyConnection { - edges: [DummyConnectionEdge] - pageInfo: PageInfo - nodes: [DummyType!]! - totalCount: Int -} - -type DummyConnectionEdge { - cursor: String - node: DummyType -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/DummyInput.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/DummyInput.graphqls deleted file mode 100644 index 4a1d4aefa8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/DummyInput.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -input DummyInput { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/DummyInputRecord.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/DummyInputRecord.graphqls deleted file mode 100644 index b7a4eef500..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/DummyInputRecord.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -input DummyInputRecord @record(record: {name: "ID_RECORD"}) { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/DummyType.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/DummyType.graphqls deleted file mode 100644 index c3c88bdf6e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/DummyType.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type DummyType { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/DummyTypeRecord.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/DummyTypeRecord.graphqls deleted file mode 100644 index 5ef7481d00..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/DummyTypeRecord.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type DummyTypeRecord @record(record: {name: "ID_RECORD"}) { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/FilmActorNode.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/FilmActorNode.graphqls deleted file mode 100644 index 91a44b0830..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/FilmActorNode.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type FilmActorNode implements Node @node @table(name: "FILM_ACTOR") { - id: ID! @nodeId -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/InventoryNode.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/InventoryNode.graphqls deleted file mode 100644 index 60c3912f1c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/InventoryNode.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type InventoryNode implements Node @node @table(name: "INVENTORY") { - id: ID! @nodeId -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/MutationResponse.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/MutationResponse.graphqls deleted file mode 100644 index d8d3fc0d82..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/MutationResponse.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation: Response @mutation(typeName: UPDATE) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/NameInput.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/NameInput.graphqls deleted file mode 100644 index 24ce8d0923..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/NameInput.graphqls +++ /dev/null @@ -1,4 +0,0 @@ -input NameInput { - firstname: String! @field(name: "FIRST_NAME") - lastname: String! @field(name: "LAST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/OptionalFieldInput.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/OptionalFieldInput.graphqls deleted file mode 100644 index 97717fc47e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/OptionalFieldInput.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -input OptionalFieldInput @record(record: {name: "OPTIONAL_FIELD_RECORD"}) { - id: ID! - name: String - rentalDuration: Int = 3 -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/PersonWithEmail.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/PersonWithEmail.graphqls deleted file mode 100644 index 70d751a861..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/PersonWithEmail.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -interface PersonWithEmail { - email: String -} - -type Staff implements PersonWithEmail @table(name: "STAFF") { - email: String -} - -type Customer implements PersonWithEmail @table(name: "CUSTOMER") { - email: String -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/PersonWithEmailConnection.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/PersonWithEmailConnection.graphqls deleted file mode 100644 index 37c154e8db..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/PersonWithEmailConnection.graphqls +++ /dev/null @@ -1,10 +0,0 @@ -type PersonWithEmailConnection { - edges: [PersonWithEmailConnectionEdge] - nodes: [PersonWithEmail!]! - totalCount: Int -} - -type PersonWithEmailConnectionEdge { - cursor: String - node: PersonWithEmail -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/SomeUnionConnection.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/SomeUnionConnection.graphqls deleted file mode 100644 index 17f1a8050e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/SomeUnionConnection.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type SomeUnionConnection { - edges: [SomeUnionConnectionEdge] - pageInfo: PageInfo - nodes: [SomeUnion!]! - totalCount: Int -} - -type SomeUnionConnectionEdge { - cursor: String - node: SomeUnion -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/Staff.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/Staff.graphqls deleted file mode 100644 index e1d8cca5e9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/Staff.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Staff @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/ValidationError.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/ValidationError.graphqls deleted file mode 100644 index 7f7067c4cc..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/basic/ValidationError.graphqls +++ /dev/null @@ -1,4 +0,0 @@ -type ValidationError implements Error { - path: [String] - message: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/enums/DummyEnum.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/enums/DummyEnum.graphqls deleted file mode 100644 index 67fe576af5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/enums/DummyEnum.graphqls +++ /dev/null @@ -1,6 +0,0 @@ -# Without jOOQ converter. -enum DummyEnum { - A - B - C -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/enums/DummyEnumConverted.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/enums/DummyEnumConverted.graphqls deleted file mode 100644 index 96115f20ac..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/enums/DummyEnumConverted.graphqls +++ /dev/null @@ -1,6 +0,0 @@ -# With jOOQ converter. -enum DummyEnumConverted @enum(enumReference: {name: "DUMMY_JOOQ_ENUM"}) { - A - B - C -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/records/City0.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/records/City0.graphqls deleted file mode 100644 index efeaf08ccb..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/records/City0.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type AddressCity0 @table(name: "CITY") { - city: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/records/City1.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/records/City1.graphqls deleted file mode 100644 index f2105b39c6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/records/City1.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type AddressCity1 @record(record: {name: "DUMMY_RECORD"}) { - city: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/records/CityInputsJOOQ.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/records/CityInputsJOOQ.graphqls deleted file mode 100644 index be8dc0d826..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/records/CityInputsJOOQ.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -input CityInput1 { - city: CityInput2 -} - -input CityInput2 @table(name: "CITY") { - cityId: String! @field(name: "CITY_ID") -} - -input CityInput3 @table(name: "CITY") { - city: CityInput4 -} - -input CityInput4 @table(name: "CITY") { # Will not find this. Two tables in a row do not make sense. - cityId: String! @field(name: "CITY_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/records/CityInputsJava.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/records/CityInputsJava.graphqls deleted file mode 100644 index 07e9f9ce84..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/records/CityInputsJava.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -input CityInput1 { - city: CityInput2 -} - -input CityInput2 @record(record: {name: "DUMMY_RECORD"}) { - cityId: String! @field(name: "CITY_ID") -} - -input CityInput3 @record(record: {name: "DUMMY_RECORD"}) { - city: CityInput4 -} - -input CityInput4 @record(record: {name: "DUMMY_RECORD"}) { - cityId: String! @field(name: "CITY_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/records/NameInputJava.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/records/NameInputJava.graphqls deleted file mode 100644 index eefa6be261..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/records/NameInputJava.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -input NameInput @record(record: {name: "JAVA_RECORD_STAFF_NAME"}) { - firstname: String! @field(name: "FIRST_NAME") - lastname: String! @field(name: "LAST_NAME") -} - diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/records/WrappedAddressJOOQ.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/records/WrappedAddressJOOQ.graphqls deleted file mode 100644 index 6255f99e6a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/records/WrappedAddressJOOQ.graphqls +++ /dev/null @@ -1,6 +0,0 @@ -type AddressWrapped @table(name: "ADDRESS") { - id: ID! - - city: AddressCity0 # This should not be found. - cityRecord: AddressCity1 # Table ignores record directive. -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/records/WrappedAddressJava.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/records/WrappedAddressJava.graphqls deleted file mode 100644 index a6b65f7a92..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/records/WrappedAddressJava.graphqls +++ /dev/null @@ -1,6 +0,0 @@ -type AddressWrapped @record(record: {name: "DUMMY_RECORD"}) { - id: ID! - - city: AddressCity0 - cityRecord: AddressCity1 -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/special/Error.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/special/Error.graphqls deleted file mode 100644 index fa3048f4ed..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/special/Error.graphqls +++ /dev/null @@ -1,4 +0,0 @@ -interface Error { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/special/Federation.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/special/Federation.graphqls deleted file mode 100644 index 9b44a80653..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/special/Federation.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -extend schema -@link(url: "https://specs.apollo.dev/federation/v2.4", - import: ["@key"]) - -scalar _Any -scalar FieldSet - -directive @key(fields: FieldSet!, resolvable: Boolean = true) repeatable on OBJECT | INTERFACE diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/special/FederationQuery.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/special/FederationQuery.graphqls deleted file mode 100644 index e93e9f7166..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/special/FederationQuery.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - _entities(representations: [_Any!]!): [_Entity]! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/special/Node.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/special/Node.graphqls deleted file mode 100644 index 71bf3b96e7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/special/Node.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -interface Node { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/special/NodeQuery.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/special/NodeQuery.graphqls deleted file mode 100644 index 6d1b6453f4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/special/NodeQuery.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - node(id: ID!): Node -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/special/Order.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/special/Order.graphqls deleted file mode 100644 index c808229bf5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/special/Order.graphqls +++ /dev/null @@ -1,4 +0,0 @@ -input Order { - direction: OrderDirection! - orderByField: OrderByField! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/special/OrderDirection.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/special/OrderDirection.graphqls deleted file mode 100644 index c2e10170df..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/special/OrderDirection.graphqls +++ /dev/null @@ -1,4 +0,0 @@ -enum OrderDirection { - ASC - DESC -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/special/PageInfo.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/special/PageInfo.graphqls deleted file mode 100644 index fd5d2c2f44..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/components/special/PageInfo.graphqls +++ /dev/null @@ -1,6 +0,0 @@ -type PageInfo { - hasPreviousPage: Boolean! - hasNextPage: Boolean! - startCursor: String - endCursor: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/database/postgres-sakila-schema.sql b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/database/postgres-sakila-schema.sql deleted file mode 100644 index d0b628aca6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/database/postgres-sakila-schema.sql +++ /dev/null @@ -1,1806 +0,0 @@ -CREATE USER postgres SUPERUSER; - --- --- PostgreSQL database dump --- - -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = off; -SET check_function_bodies = false; -SET client_min_messages = warning; -SET escape_string_warning = off; - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: postgres --- - -COMMENT ON SCHEMA public IS 'Standard public schema'; - - --- --- Name: plpgsql; Type: PROCEDURAL LANGUAGE; Schema: -; Owner: postgres --- - -CREATE OR REPLACE PROCEDURAL LANGUAGE plpgsql; - - -ALTER PROCEDURAL LANGUAGE plpgsql OWNER TO postgres; - -SET search_path = public, pg_catalog; - --- --- Name: actor_actor_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres --- - -CREATE SEQUENCE actor_actor_id_seq - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - -ALTER TABLE public.actor_actor_id_seq OWNER TO postgres; - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: actor; Type: TABLE; Schema: public; Owner: postgres; Tablespace: --- - -CREATE TABLE actor ( - actor_id bigint DEFAULT nextval('actor_actor_id_seq'::regclass) NOT NULL, - first_name character varying(45) NOT NULL, - last_name character varying(45) NOT NULL, - last_update timestamp without time zone DEFAULT now() NOT NULL -); - - -ALTER TABLE public.actor OWNER TO postgres; - --- --- Name: mpaa_rating; Type: TYPE; Schema: public; Owner: postgres --- - -CREATE TYPE mpaa_rating AS ENUM ( - 'G', - 'PG', - 'PG-13', - 'R', - 'NC-17' -); - - -ALTER TYPE public.mpaa_rating OWNER TO postgres; - --- --- Name: year; Type: DOMAIN; Schema: public; Owner: postgres --- - -CREATE DOMAIN year AS integer - CONSTRAINT year_check CHECK (((VALUE >= 1901) AND (VALUE <= 2155))); - - -ALTER DOMAIN public.year OWNER TO postgres; - --- --- Name: _group_concat(text, text); Type: FUNCTION; Schema: public; Owner: postgres --- - -CREATE FUNCTION _group_concat(text, text) RETURNS text - AS $_$ -SELECT CASE - WHEN $2 IS NULL THEN $1 - WHEN $1 IS NULL THEN $2 - ELSE $1 || ', ' || $2 -END -$_$ - LANGUAGE sql IMMUTABLE; - - -ALTER FUNCTION public._group_concat(text, text) OWNER TO postgres; - --- --- Name: group_concat(text); Type: AGGREGATE; Schema: public; Owner: postgres --- - -CREATE AGGREGATE group_concat(text) ( - SFUNC = _group_concat, - STYPE = text -); - - -ALTER AGGREGATE public.group_concat(text) OWNER TO postgres; - --- --- Name: category_category_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres --- - -CREATE SEQUENCE category_category_id_seq - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - -ALTER TABLE public.category_category_id_seq OWNER TO postgres; - --- --- Name: category; Type: TABLE; Schema: public; Owner: postgres; Tablespace: --- - -CREATE TABLE category ( - category_id bigint DEFAULT nextval('category_category_id_seq'::regclass) NOT NULL, - name character varying(25) NOT NULL, - last_update timestamp without time zone DEFAULT now() NOT NULL -); - - -ALTER TABLE public.category OWNER TO postgres; - --- --- Name: film_film_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres --- - -CREATE SEQUENCE film_film_id_seq - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - -ALTER TABLE public.film_film_id_seq OWNER TO postgres; - --- --- Name: film; Type: TABLE; Schema: public; Owner: postgres; Tablespace: --- - -CREATE TABLE film ( - film_id bigint DEFAULT nextval('film_film_id_seq'::regclass) NOT NULL, - title character varying(255) NOT NULL, - description text, - release_year year, - language_id bigint NOT NULL, - original_language_id bigint, - rental_duration smallint DEFAULT 3 NOT NULL, - rental_rate numeric(4,2) DEFAULT 4.99 NOT NULL, - length smallint, - replacement_cost numeric(5,2) DEFAULT 19.99 NOT NULL, - rating mpaa_rating DEFAULT 'G'::mpaa_rating, - last_update timestamp without time zone DEFAULT now() NOT NULL, - special_features text[], - fulltext tsvector NOT NULL -); - - -ALTER TABLE public.film OWNER TO postgres; - --- --- Name: film_actor; Type: TABLE; Schema: public; Owner: postgres; Tablespace: --- - -CREATE TABLE film_actor ( - actor_id bigint NOT NULL, - actor_last_name character varying(45) NOT NULL, - film_id bigint NOT NULL, - last_update timestamp without time zone DEFAULT now() NOT NULL -); - - -ALTER TABLE public.film_actor OWNER TO postgres; - --- --- Name: film_category; Type: TABLE; Schema: public; Owner: postgres; Tablespace: --- - -CREATE TABLE film_category ( - film_id bigint NOT NULL, - category_id bigint NOT NULL, - last_update timestamp without time zone DEFAULT now() NOT NULL -); - - -ALTER TABLE public.film_category OWNER TO postgres; - --- --- Name: actor_info; Type: VIEW; Schema: public; Owner: postgres --- - -CREATE VIEW actor_info AS - SELECT a.actor_id, a.first_name, a.last_name, group_concat(DISTINCT (((c.name)::text || ': '::text) || (SELECT group_concat((f.title)::text) AS group_concat FROM ((film f JOIN film_category fc ON ((f.film_id = fc.film_id))) JOIN film_actor fa ON ((f.film_id = fa.film_id))) WHERE ((fc.category_id = c.category_id) AND (fa.actor_id = a.actor_id)) GROUP BY fa.actor_id))) AS film_info FROM (((actor a LEFT JOIN film_actor fa ON ((a.actor_id = fa.actor_id))) LEFT JOIN film_category fc ON ((fa.film_id = fc.film_id))) LEFT JOIN category c ON ((fc.category_id = c.category_id))) GROUP BY a.actor_id, a.first_name, a.last_name; - - -ALTER TABLE public.actor_info OWNER TO postgres; - --- --- Name: address_address_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres --- - -CREATE SEQUENCE address_address_id_seq - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - -ALTER TABLE public.address_address_id_seq OWNER TO postgres; - --- --- Name: address; Type: TABLE; Schema: public; Owner: postgres; Tablespace: --- - -CREATE TABLE address ( - address_id bigint DEFAULT nextval('address_address_id_seq'::regclass) NOT NULL, - address character varying(50) NOT NULL, - address2 character varying(50), - district character varying(20) NOT NULL, - city_id bigint NOT NULL, - postal_code character varying(10), - phone character varying(20) NOT NULL, - last_update timestamp without time zone DEFAULT now() NOT NULL -); - - -ALTER TABLE public.address OWNER TO postgres; - --- --- Name: city_city_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres --- - -CREATE SEQUENCE city_city_id_seq - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - -ALTER TABLE public.city_city_id_seq OWNER TO postgres; - --- --- Name: city; Type: TABLE; Schema: public; Owner: postgres; Tablespace: --- - -CREATE TABLE city ( - city_id bigint DEFAULT nextval('city_city_id_seq'::regclass) NOT NULL, - city character varying(50) NOT NULL, - country_id bigint NOT NULL, - last_update timestamp without time zone DEFAULT now() NOT NULL -); - - -ALTER TABLE public.city OWNER TO postgres; - --- --- Name: country_country_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres --- - -CREATE SEQUENCE country_country_id_seq - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - -ALTER TABLE public.country_country_id_seq OWNER TO postgres; - --- --- Name: country; Type: TABLE; Schema: public; Owner: postgres; Tablespace: --- - -CREATE TABLE country ( - country_id bigint DEFAULT nextval('country_country_id_seq'::regclass) NOT NULL, - country character varying(50) NOT NULL, - last_update timestamp without time zone DEFAULT now() NOT NULL -); - - -ALTER TABLE public.country OWNER TO postgres; - --- --- Name: customer_customer_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres --- - -CREATE SEQUENCE customer_customer_id_seq - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - -ALTER TABLE public.customer_customer_id_seq OWNER TO postgres; - --- --- Name: customer; Type: TABLE; Schema: public; Owner: postgres; Tablespace: --- - -CREATE TABLE customer ( - customer_id bigint DEFAULT nextval('customer_customer_id_seq'::regclass) NOT NULL, - store_id bigint NOT NULL, - first_name character varying(45) NOT NULL, - last_name character varying(45) NOT NULL, - email character varying(50), - address_id bigint NOT NULL, - activebool boolean DEFAULT true NOT NULL, - create_date date DEFAULT ('now'::text)::date NOT NULL, - last_update timestamp without time zone DEFAULT now(), - active integer -); - - -ALTER TABLE public.customer OWNER TO postgres; - --- --- Name: customer_list; Type: VIEW; Schema: public; Owner: postgres --- - -CREATE VIEW customer_list AS - SELECT cu.customer_id AS id, (((cu.first_name)::text || ' '::text) || (cu.last_name)::text) AS name, a.address, a.postal_code AS "zip code", a.phone, city.city, country.country, CASE WHEN cu.activebool THEN 'active'::text ELSE ''::text END AS notes, cu.store_id AS sid FROM (((customer cu JOIN address a ON ((cu.address_id = a.address_id))) JOIN city ON ((a.city_id = city.city_id))) JOIN country ON ((city.country_id = country.country_id))); - - -ALTER TABLE public.customer_list OWNER TO postgres; - --- --- Name: film_list; Type: VIEW; Schema: public; Owner: postgres --- - -CREATE VIEW film_list AS - SELECT film.film_id AS fid, film.title, film.description, category.name AS category, film.rental_rate AS price, film.length, film.rating, group_concat((((actor.first_name)::text || ' '::text) || (actor.last_name)::text)) AS actors FROM ((((category LEFT JOIN film_category ON ((category.category_id = film_category.category_id))) LEFT JOIN film ON ((film_category.film_id = film.film_id))) JOIN film_actor ON ((film.film_id = film_actor.film_id))) JOIN actor ON ((film_actor.actor_id = actor.actor_id))) GROUP BY film.film_id, film.title, film.description, category.name, film.rental_rate, film.length, film.rating; - - -ALTER TABLE public.film_list OWNER TO postgres; - --- --- Name: inventory_inventory_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres --- - -CREATE SEQUENCE inventory_inventory_id_seq - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - -ALTER TABLE public.inventory_inventory_id_seq OWNER TO postgres; - --- --- Name: inventory; Type: TABLE; Schema: public; Owner: postgres; Tablespace: --- - -CREATE TABLE inventory ( - inventory_id bigint DEFAULT nextval('inventory_inventory_id_seq'::regclass) NOT NULL, - film_id bigint NOT NULL, - store_id bigint NOT NULL, - last_update timestamp without time zone DEFAULT now() NOT NULL -); - - -ALTER TABLE public.inventory OWNER TO postgres; - --- --- Name: language_language_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres --- - -CREATE SEQUENCE language_language_id_seq - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - -ALTER TABLE public.language_language_id_seq OWNER TO postgres; - --- --- Name: language; Type: TABLE; Schema: public; Owner: postgres; Tablespace: --- - -CREATE TABLE language ( - language_id bigint DEFAULT nextval('language_language_id_seq'::regclass) NOT NULL, - name character(20) NOT NULL, - last_update timestamp without time zone DEFAULT now() NOT NULL -); - - -ALTER TABLE public.language OWNER TO postgres; - --- --- Name: nicer_but_slower_film_list; Type: VIEW; Schema: public; Owner: postgres --- - -CREATE VIEW nicer_but_slower_film_list AS - SELECT film.film_id AS fid, film.title, film.description, category.name AS category, film.rental_rate AS price, film.length, film.rating, group_concat((((upper("substring"((actor.first_name)::text, 1, 1)) || lower("substring"((actor.first_name)::text, 2))) || upper("substring"((actor.last_name)::text, 1, 1))) || lower("substring"((actor.last_name)::text, 2)))) AS actors FROM ((((category LEFT JOIN film_category ON ((category.category_id = film_category.category_id))) LEFT JOIN film ON ((film_category.film_id = film.film_id))) JOIN film_actor ON ((film.film_id = film_actor.film_id))) JOIN actor ON ((film_actor.actor_id = actor.actor_id))) GROUP BY film.film_id, film.title, film.description, category.name, film.rental_rate, film.length, film.rating; - - -ALTER TABLE public.nicer_but_slower_film_list OWNER TO postgres; - --- --- Name: payment_payment_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres --- - -CREATE SEQUENCE payment_payment_id_seq - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - -ALTER TABLE public.payment_payment_id_seq OWNER TO postgres; - --- --- Name: payment; Type: TABLE; Schema: public; Owner: postgres; Tablespace: --- - -CREATE TABLE payment ( - payment_id bigint DEFAULT nextval('payment_payment_id_seq'::regclass) NOT NULL, - customer_id bigint NOT NULL, - staff_id bigint NOT NULL, - rental_id bigint NOT NULL, - amount numeric(5,2) NOT NULL, - payment_date timestamp without time zone NOT NULL -); - - -ALTER TABLE public.payment OWNER TO postgres; - --- --- Name: payment_p2007_01; Type: TABLE; Schema: public; Owner: postgres; Tablespace: --- - -CREATE TABLE payment_p2007_01 (CONSTRAINT payment_p2007_01_payment_date_check CHECK (((payment_date >= '2007-01-01 00:00:00'::timestamp without time zone) AND (payment_date < '2007-02-01 00:00:00'::timestamp without time zone))) -) -INHERITS (payment); - - -ALTER TABLE public.payment_p2007_01 OWNER TO postgres; - -ALTER TABLE payment_p2007_01 - ADD CONSTRAINT payment_p2007_01_pkey PRIMARY KEY (payment_id); - --- --- Name: payment_p2007_02; Type: TABLE; Schema: public; Owner: postgres; Tablespace: --- - -CREATE TABLE payment_p2007_02 (CONSTRAINT payment_p2007_02_payment_date_check CHECK (((payment_date >= '2007-02-01 00:00:00'::timestamp without time zone) AND (payment_date < '2007-03-01 00:00:00'::timestamp without time zone))) -) -INHERITS (payment); - - -ALTER TABLE public.payment_p2007_02 OWNER TO postgres; - -ALTER TABLE payment_p2007_02 - ADD CONSTRAINT payment_p2007_02_pkey PRIMARY KEY (payment_id); - --- --- Name: payment_p2007_03; Type: TABLE; Schema: public; Owner: postgres; Tablespace: --- - -CREATE TABLE payment_p2007_03 (CONSTRAINT payment_p2007_03_payment_date_check CHECK (((payment_date >= '2007-03-01 00:00:00'::timestamp without time zone) AND (payment_date < '2007-04-01 00:00:00'::timestamp without time zone))) -) -INHERITS (payment); - - -ALTER TABLE public.payment_p2007_03 OWNER TO postgres; - --- --- Name: payment_p2007_04; Type: TABLE; Schema: public; Owner: postgres; Tablespace: --- - -CREATE TABLE payment_p2007_04 (CONSTRAINT payment_p2007_04_payment_date_check CHECK (((payment_date >= '2007-04-01 00:00:00'::timestamp without time zone) AND (payment_date < '2007-05-01 00:00:00'::timestamp without time zone))) -) -INHERITS (payment); - - -ALTER TABLE public.payment_p2007_04 OWNER TO postgres; - --- --- Name: payment_p2007_05; Type: TABLE; Schema: public; Owner: postgres; Tablespace: --- - -CREATE TABLE payment_p2007_05 (CONSTRAINT payment_p2007_05_payment_date_check CHECK (((payment_date >= '2007-05-01 00:00:00'::timestamp without time zone) AND (payment_date < '2007-06-01 00:00:00'::timestamp without time zone))) -) -INHERITS (payment); - - -ALTER TABLE public.payment_p2007_05 OWNER TO postgres; - --- --- Name: payment_p2007_06; Type: TABLE; Schema: public; Owner: postgres; Tablespace: --- - -CREATE TABLE payment_p2007_06 (CONSTRAINT payment_p2007_06_payment_date_check CHECK (((payment_date >= '2007-06-01 00:00:00'::timestamp without time zone) AND (payment_date < '2007-07-01 00:00:00'::timestamp without time zone))) -) -INHERITS (payment); - - -ALTER TABLE public.payment_p2007_06 OWNER TO postgres; - --- --- Name: rental_rental_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres --- - -CREATE SEQUENCE rental_rental_id_seq - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - -ALTER TABLE public.rental_rental_id_seq OWNER TO postgres; - --- --- Name: rental; Type: TABLE; Schema: public; Owner: postgres; Tablespace: --- - -CREATE TABLE rental ( - rental_id bigint DEFAULT nextval('rental_rental_id_seq'::regclass) NOT NULL, - rental_date timestamp without time zone NOT NULL, - inventory_id bigint NOT NULL, - customer_id bigint NOT NULL, - return_date timestamp without time zone, - staff_id bigint NOT NULL, - last_update timestamp without time zone DEFAULT now() NOT NULL -); - - -ALTER TABLE public.rental OWNER TO postgres; - --- --- Name: sales_by_film_category; Type: VIEW; Schema: public; Owner: postgres --- - -CREATE VIEW sales_by_film_category AS - SELECT c.name AS category, sum(p.amount) AS total_sales FROM (((((payment p JOIN rental r ON ((p.rental_id = r.rental_id))) JOIN inventory i ON ((r.inventory_id = i.inventory_id))) JOIN film f ON ((i.film_id = f.film_id))) JOIN film_category fc ON ((f.film_id = fc.film_id))) JOIN category c ON ((fc.category_id = c.category_id))) GROUP BY c.name ORDER BY sum(p.amount) DESC; - - -ALTER TABLE public.sales_by_film_category OWNER TO postgres; - --- --- Name: staff_staff_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres --- - -CREATE SEQUENCE staff_staff_id_seq - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - -ALTER TABLE public.staff_staff_id_seq OWNER TO postgres; - --- --- Name: staff; Type: TABLE; Schema: public; Owner: postgres; Tablespace: --- - -CREATE TABLE staff ( - staff_id bigint DEFAULT nextval('staff_staff_id_seq'::regclass) NOT NULL, - first_name character varying(45) NOT NULL, - last_name character varying(45) NOT NULL, - address_id bigint NOT NULL, - email character varying(50), - store_id bigint NOT NULL, - active boolean DEFAULT true NOT NULL, - username character varying(16) NOT NULL, - password character varying(40), - last_update timestamp without time zone DEFAULT now() NOT NULL, - picture bytea -); - - -ALTER TABLE public.staff OWNER TO postgres; - --- --- Name: store_store_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres --- - -CREATE SEQUENCE store_store_id_seq - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - - -ALTER TABLE public.store_store_id_seq OWNER TO postgres; - --- --- Name: store; Type: TABLE; Schema: public; Owner: postgres; Tablespace: --- - -CREATE TABLE store ( - store_id bigint DEFAULT nextval('store_store_id_seq'::regclass) NOT NULL, - manager_staff_id bigint NOT NULL, - address_id bigint NOT NULL, - last_update timestamp without time zone DEFAULT now() NOT NULL -); - - -ALTER TABLE public.store OWNER TO postgres; - --- --- Name: sales_by_store; Type: VIEW; Schema: public; Owner: postgres --- - -CREATE VIEW sales_by_store AS - SELECT (((c.city)::text || ','::text) || (cy.country)::text) AS store, (((m.first_name)::text || ' '::text) || (m.last_name)::text) AS manager, sum(p.amount) AS total_sales FROM (((((((payment p JOIN rental r ON ((p.rental_id = r.rental_id))) JOIN inventory i ON ((r.inventory_id = i.inventory_id))) JOIN store s ON ((i.store_id = s.store_id))) JOIN address a ON ((s.address_id = a.address_id))) JOIN city c ON ((a.city_id = c.city_id))) JOIN country cy ON ((c.country_id = cy.country_id))) JOIN staff m ON ((s.manager_staff_id = m.staff_id))) GROUP BY cy.country, c.city, s.store_id, m.first_name, m.last_name ORDER BY cy.country, c.city; - - -ALTER TABLE public.sales_by_store OWNER TO postgres; - --- --- Name: staff_list; Type: VIEW; Schema: public; Owner: postgres --- - -CREATE VIEW staff_list AS - SELECT s.staff_id AS id, (((s.first_name)::text || ' '::text) || (s.last_name)::text) AS name, a.address, a.postal_code AS "zip code", a.phone, city.city, country.country, s.store_id AS sid FROM (((staff s JOIN address a ON ((s.address_id = a.address_id))) JOIN city ON ((a.city_id = city.city_id))) JOIN country ON ((city.country_id = country.country_id))); - - -ALTER TABLE public.staff_list OWNER TO postgres; - -CREATE SEQUENCE vacation_id_seq - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - -CREATE TABLE vacation ( - vacation_id bigint DEFAULT nextval('vacation_id_seq'::regclass) NOT NULL, - description character varying(45) NOT NULL, - parent_id bigint -); - -CREATE SEQUENCE vacation_destination_id_seq - INCREMENT BY 1 - NO MAXVALUE - NO MINVALUE - CACHE 1; - -ALTER TABLE ONLY vacation - ADD CONSTRAINT vacation_pkey PRIMARY KEY (vacation_id); - -CREATE TABLE vacation_destination ( - destination_id bigint DEFAULT nextval('vacation_destination_id_seq'::regclass) NOT NULL, - country_name character varying(45) NOT NULL, - vacation_id bigint -); - -ALTER TABLE ONLY vacation_destination - ADD CONSTRAINT vacation_destination_vacation_fkey FOREIGN KEY (vacation_id) REFERENCES vacation(vacation_id); - -ALTER TABLE ONLY vacation_destination - ADD CONSTRAINT vacation_destination_pkey PRIMARY KEY (destination_id, country_name); - --- --- Name: film_in_stock(integer, integer); Type: FUNCTION; Schema: public; Owner: postgres --- - -CREATE FUNCTION film_in_stock(p_film_id bigint, p_store_id bigint, OUT p_film_count integer) RETURNS SETOF integer - AS $_$ - SELECT inventory_id - FROM inventory - WHERE film_id = $1 - AND store_id = $2 - AND inventory_in_stock(inventory_id); -$_$ - LANGUAGE sql; - - -ALTER FUNCTION public.film_in_stock(p_film_id bigint, p_store_id bigint, OUT p_film_count integer) OWNER TO postgres; - --- --- Name: film_not_in_stock(integer, integer); Type: FUNCTION; Schema: public; Owner: postgres --- - -CREATE FUNCTION film_not_in_stock(p_film_id bigint, p_store_id bigint, OUT p_film_count integer) RETURNS SETOF integer - AS $_$ - SELECT inventory_id - FROM inventory - WHERE film_id = $1 - AND store_id = $2 - AND NOT inventory_in_stock(inventory_id); -$_$ - LANGUAGE sql; - - -ALTER FUNCTION public.film_not_in_stock(p_film_id bigint, p_store_id bigint, OUT p_film_count integer) OWNER TO postgres; - --- --- Name: get_customer_balance(integer, timestamp without time zone); Type: FUNCTION; Schema: public; Owner: postgres --- - -CREATE FUNCTION get_customer_balance(p_customer_id bigint, p_effective_date timestamp without time zone) RETURNS numeric - AS $$ - --#OK, WE NEED TO CALCULATE THE CURRENT BALANCE GIVEN A CUSTOMER_ID AND A DATE - --#THAT WE WANT THE BALANCE TO BE EFFECTIVE FOR. THE BALANCE IS: - --# 1) RENTAL FEES FOR ALL PREVIOUS RENTALS - --# 2) ONE DOLLAR FOR EVERY DAY THE PREVIOUS RENTALS ARE OVERDUE - --# 3) IF A FILM IS MORE THAN RENTAL_DURATION * 2 OVERDUE, CHARGE THE REPLACEMENT_COST - --# 4) SUBTRACT ALL PAYMENTS MADE BEFORE THE DATE SPECIFIED -DECLARE - v_rentfees DECIMAL(5,2); --#FEES PAID TO RENT THE VIDEOS INITIALLY - v_overfees INTEGER; --#LATE FEES FOR PRIOR RENTALS - v_payments DECIMAL(5,2); --#SUM OF PAYMENTS MADE PREVIOUSLY -BEGIN - SELECT COALESCE(SUM(film.rental_rate),0) INTO v_rentfees - FROM film, inventory, rental - WHERE film.film_id = inventory.film_id - AND inventory.inventory_id = rental.inventory_id - AND rental.rental_date <= p_effective_date - AND rental.customer_id = p_customer_id; - - SELECT COALESCE(SUM(IF((rental.return_date - rental.rental_date) > (film.rental_duration * '1 day'::interval), - ((rental.return_date - rental.rental_date) - (film.rental_duration * '1 day'::interval)),0)),0) INTO v_overfees - FROM rental, inventory, film - WHERE film.film_id = inventory.film_id - AND inventory.inventory_id = rental.inventory_id - AND rental.rental_date <= p_effective_date - AND rental.customer_id = p_customer_id; - - SELECT COALESCE(SUM(payment.amount),0) INTO v_payments - FROM payment - WHERE payment.payment_date <= p_effective_date - AND payment.customer_id = p_customer_id; - - RETURN v_rentfees + v_overfees - v_payments; -END -$$ - LANGUAGE plpgsql; - - -ALTER FUNCTION public.get_customer_balance(p_customer_id bigint, p_effective_date timestamp without time zone) OWNER TO postgres; - --- --- Name: inventory_held_by_customer(integer); Type: FUNCTION; Schema: public; Owner: postgres --- - -CREATE FUNCTION inventory_held_by_customer(p_inventory_id bigint) RETURNS integer - AS $$ -DECLARE - v_customer_id bigint; -BEGIN - - SELECT customer_id INTO v_customer_id - FROM rental - WHERE return_date IS NULL - AND inventory_id = p_inventory_id; - - RETURN v_customer_id; -END $$ - LANGUAGE plpgsql; - - -ALTER FUNCTION public.inventory_held_by_customer(p_inventory_id bigint) OWNER TO postgres; - --- --- Name: inventory_in_stock(integer); Type: FUNCTION; Schema: public; Owner: postgres --- - -CREATE FUNCTION inventory_in_stock(p_inventory_id bigint) RETURNS boolean - AS $$ -DECLARE - v_rentals INTEGER; - v_out INTEGER; -BEGIN - -- AN ITEM IS IN-STOCK IF THERE ARE EITHER NO ROWS IN THE rental TABLE - -- FOR THE ITEM OR ALL ROWS HAVE return_date POPULATED - - SELECT count(*) INTO v_rentals - FROM rental - WHERE inventory_id = p_inventory_id; - - IF v_rentals = 0 THEN - RETURN TRUE; - END IF; - - SELECT COUNT(rental_id) INTO v_out - FROM inventory LEFT JOIN rental USING(inventory_id) - WHERE inventory.inventory_id = p_inventory_id - AND rental.return_date IS NULL; - - IF v_out > 0 THEN - RETURN FALSE; - ELSE - RETURN TRUE; - END IF; -END $$ - LANGUAGE plpgsql; - - -ALTER FUNCTION public.inventory_in_stock(p_inventory_id bigint) OWNER TO postgres; - --- --- Name: last_day(timestamp without time zone); Type: FUNCTION; Schema: public; Owner: postgres --- - -CREATE FUNCTION last_day(timestamp without time zone) RETURNS date - AS $_$ - SELECT CASE - WHEN EXTRACT(MONTH FROM $1) = 12 THEN - (((EXTRACT(YEAR FROM $1) + 1) operator(pg_catalog.||) '-01-01')::date - INTERVAL '1 day')::date - ELSE - ((EXTRACT(YEAR FROM $1) operator(pg_catalog.||) '-' operator(pg_catalog.||) (EXTRACT(MONTH FROM $1) + 1) operator(pg_catalog.||) '-01')::date - INTERVAL '1 day')::date - END -$_$ - LANGUAGE sql IMMUTABLE STRICT; - - -ALTER FUNCTION public.last_day(timestamp without time zone) OWNER TO postgres; - --- --- Name: last_updated(); Type: FUNCTION; Schema: public; Owner: postgres --- - -CREATE FUNCTION last_updated() RETURNS trigger - AS $$ -BEGIN - NEW.last_update = CURRENT_TIMESTAMP; - RETURN NEW; -END $$ - LANGUAGE plpgsql; - - -ALTER FUNCTION public.last_updated() OWNER TO postgres; - --- --- Name: reset_film_rental_duration(integer); Type: PROCEDURE; Schema: public; Owner: postgres --- - -CREATE PROCEDURE reset_film_rental_duration(p_film_id integer) - AS $$ -BEGIN - UPDATE film SET rental_duration = 3 WHERE film_id = p_film_id; -END $$ - LANGUAGE plpgsql; - - -ALTER PROCEDURE public.reset_film_rental_duration(p_film_id integer) OWNER TO postgres; - --- --- Name: rewards_report(integer, numeric); Type: FUNCTION; Schema: public; Owner: postgres --- - -CREATE FUNCTION rewards_report(min_monthly_purchases integer, min_dollar_amount_purchased numeric) RETURNS SETOF customer - AS $_$ -DECLARE - last_month_start DATE; - last_month_end DATE; -rr RECORD; -tmpSQL TEXT; -BEGIN - - /* Some sanity checks... */ - IF min_monthly_purchases = 0 THEN - RAISE EXCEPTION 'Minimum monthly purchases parameter must be > 0'; - END IF; - IF min_dollar_amount_purchased = 0.00 THEN - RAISE EXCEPTION 'Minimum monthly dollar amount purchased parameter must be > $0.00'; - END IF; - - last_month_start := CURRENT_DATE - '3 month'::interval; - last_month_start := to_date((extract(YEAR FROM last_month_start) || '-' || extract(MONTH FROM last_month_start) || '-01'),'YYYY-MM-DD'); - last_month_end := LAST_DAY(last_month_start); - - /* - Create a temporary storage area for Customer IDs. - */ - CREATE TEMPORARY TABLE tmpCustomer (customer_id bigint NOT NULL PRIMARY KEY); - - /* - Find all customers meeting the monthly purchase requirements - */ - - tmpSQL := 'INSERT INTO tmpCustomer (customer_id) - SELECT p.customer_id - FROM payment AS p - WHERE DATE(p.payment_date) BETWEEN '||quote_literal(last_month_start) ||' AND '|| quote_literal(last_month_end) || ' - GROUP BY customer_id - HAVING SUM(p.amount) > '|| min_dollar_amount_purchased || ' - AND COUNT(customer_id) > ' ||min_monthly_purchases ; - - EXECUTE tmpSQL; - - /* - Output ALL customer information of matching rewardees. - Customize output as needed. - */ - FOR rr IN EXECUTE 'SELECT c.* FROM tmpCustomer AS t INNER JOIN customer AS c ON t.customer_id = c.customer_id' LOOP - RETURN NEXT rr; - END LOOP; - - /* Clean up */ - tmpSQL := 'DROP TABLE tmpCustomer'; - EXECUTE tmpSQL; - -RETURN; -END -$_$ - LANGUAGE plpgsql SECURITY DEFINER; - - -ALTER FUNCTION public.rewards_report(min_monthly_purchases integer, min_dollar_amount_purchased numeric) OWNER TO postgres; - --- --- Name: actor_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: --- - -ALTER TABLE ONLY actor - ADD CONSTRAINT actor_pkey PRIMARY KEY (actor_id); - -ALTER TABLE ONLY actor - ADD CONSTRAINT actor_ukey UNIQUE (actor_id, last_name); - --- --- Name: address_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: --- - -ALTER TABLE ONLY address - ADD CONSTRAINT address_pkey PRIMARY KEY (address_id); - - --- --- Name: category_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: --- - -ALTER TABLE ONLY category - ADD CONSTRAINT category_pkey PRIMARY KEY (category_id); - - --- --- Name: city_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: --- - -ALTER TABLE ONLY city - ADD CONSTRAINT city_pkey PRIMARY KEY (city_id); - - --- --- Name: country_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: --- - -ALTER TABLE ONLY country - ADD CONSTRAINT country_pkey PRIMARY KEY (country_id); - - --- --- Name: customer_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: --- - -ALTER TABLE ONLY customer - ADD CONSTRAINT customer_pkey PRIMARY KEY (customer_id); - - --- --- Name: film_actor_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: --- - -ALTER TABLE ONLY film_actor - ADD CONSTRAINT film_actor_pkey PRIMARY KEY (actor_id, film_id); - - --- --- Name: film_category_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: --- - -ALTER TABLE ONLY film_category - ADD CONSTRAINT film_category_pkey PRIMARY KEY (film_id, category_id); - - --- --- Name: film_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: --- - -ALTER TABLE ONLY film - ADD CONSTRAINT film_pkey PRIMARY KEY (film_id); - - --- --- Name: inventory_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: --- - -ALTER TABLE ONLY inventory - ADD CONSTRAINT inventory_pkey PRIMARY KEY (inventory_id); - - --- --- Name: language_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: --- - -ALTER TABLE ONLY language - ADD CONSTRAINT language_pkey PRIMARY KEY (language_id); - - --- --- Name: payment_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: --- - -ALTER TABLE ONLY payment - ADD CONSTRAINT payment_pkey PRIMARY KEY (payment_id); - - --- --- Name: rental_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: --- - -ALTER TABLE ONLY rental - ADD CONSTRAINT rental_pkey PRIMARY KEY (rental_id); - - --- --- Name: staff_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: --- - -ALTER TABLE ONLY staff - ADD CONSTRAINT staff_pkey PRIMARY KEY (staff_id); - - --- --- Name: store_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: --- - -ALTER TABLE ONLY store - ADD CONSTRAINT store_pkey PRIMARY KEY (store_id); - - --- --- Name: film_fulltext_idx; Type: INDEX; Schema: public; Owner: postgres; Tablespace: --- - -CREATE INDEX film_fulltext_idx ON film USING gist (fulltext); - - --- --- Name: idx_actor_last_name; Type: INDEX; Schema: public; Owner: postgres; Tablespace: --- - -CREATE INDEX idx_actor_last_name ON actor USING btree (last_name); - - --- --- Name: idx_fk_address_id; Type: INDEX; Schema: public; Owner: postgres; Tablespace: --- - -CREATE INDEX idx_fk_address_id ON customer USING btree (address_id); - - --- --- Name: idx_fk_city_id; Type: INDEX; Schema: public; Owner: postgres; Tablespace: --- - -CREATE INDEX idx_fk_city_id ON address USING btree (city_id); - - --- --- Name: idx_fk_country_id; Type: INDEX; Schema: public; Owner: postgres; Tablespace: --- - -CREATE INDEX idx_fk_country_id ON city USING btree (country_id); - - --- --- Name: idx_fk_customer_id; Type: INDEX; Schema: public; Owner: postgres; Tablespace: --- - -CREATE INDEX idx_fk_customer_id ON payment USING btree (customer_id); - - --- --- Name: idx_fk_film_id; Type: INDEX; Schema: public; Owner: postgres; Tablespace: --- - -CREATE INDEX idx_fk_film_id ON film_actor USING btree (film_id); - - --- --- Name: idx_fk_inventory_id; Type: INDEX; Schema: public; Owner: postgres; Tablespace: --- - -CREATE INDEX idx_fk_inventory_id ON rental USING btree (inventory_id); - - --- --- Name: idx_fk_language_id; Type: INDEX; Schema: public; Owner: postgres; Tablespace: --- - -CREATE INDEX idx_fk_language_id ON film USING btree (language_id); - - --- --- Name: idx_fk_original_language_id; Type: INDEX; Schema: public; Owner: postgres; Tablespace: --- - -CREATE INDEX idx_fk_original_language_id ON film USING btree (original_language_id); - - --- --- Name: idx_fk_payment_p2007_01_customer_id; Type: INDEX; Schema: public; Owner: postgres; Tablespace: --- - -CREATE INDEX idx_fk_payment_p2007_01_customer_id ON payment_p2007_01 USING btree (customer_id); - - --- --- Name: idx_fk_payment_p2007_01_staff_id; Type: INDEX; Schema: public; Owner: postgres; Tablespace: --- - -CREATE INDEX idx_fk_payment_p2007_01_staff_id ON payment_p2007_01 USING btree (staff_id); - - --- --- Name: idx_fk_payment_p2007_02_customer_id; Type: INDEX; Schema: public; Owner: postgres; Tablespace: --- - -CREATE INDEX idx_fk_payment_p2007_02_customer_id ON payment_p2007_02 USING btree (customer_id); - - --- --- Name: idx_fk_payment_p2007_02_staff_id; Type: INDEX; Schema: public; Owner: postgres; Tablespace: --- - -CREATE INDEX idx_fk_payment_p2007_02_staff_id ON payment_p2007_02 USING btree (staff_id); - - --- --- Name: idx_fk_payment_p2007_03_customer_id; Type: INDEX; Schema: public; Owner: postgres; Tablespace: --- - -CREATE INDEX idx_fk_payment_p2007_03_customer_id ON payment_p2007_03 USING btree (customer_id); - - --- --- Name: idx_fk_payment_p2007_03_staff_id; Type: INDEX; Schema: public; Owner: postgres; Tablespace: --- - -CREATE INDEX idx_fk_payment_p2007_03_staff_id ON payment_p2007_03 USING btree (staff_id); - - --- --- Name: idx_fk_payment_p2007_04_customer_id; Type: INDEX; Schema: public; Owner: postgres; Tablespace: --- - -CREATE INDEX idx_fk_payment_p2007_04_customer_id ON payment_p2007_04 USING btree (customer_id); - - --- --- Name: idx_fk_payment_p2007_04_staff_id; Type: INDEX; Schema: public; Owner: postgres; Tablespace: --- - -CREATE INDEX idx_fk_payment_p2007_04_staff_id ON payment_p2007_04 USING btree (staff_id); - - --- --- Name: idx_fk_payment_p2007_05_customer_id; Type: INDEX; Schema: public; Owner: postgres; Tablespace: --- - -CREATE INDEX idx_fk_payment_p2007_05_customer_id ON payment_p2007_05 USING btree (customer_id); - - --- --- Name: idx_fk_payment_p2007_05_staff_id; Type: INDEX; Schema: public; Owner: postgres; Tablespace: --- - -CREATE INDEX idx_fk_payment_p2007_05_staff_id ON payment_p2007_05 USING btree (staff_id); - - --- --- Name: idx_fk_payment_p2007_06_customer_id; Type: INDEX; Schema: public; Owner: postgres; Tablespace: --- - -CREATE INDEX idx_fk_payment_p2007_06_customer_id ON payment_p2007_06 USING btree (customer_id); - - --- --- Name: idx_fk_payment_p2007_06_staff_id; Type: INDEX; Schema: public; Owner: postgres; Tablespace: --- - -CREATE INDEX idx_fk_payment_p2007_06_staff_id ON payment_p2007_06 USING btree (staff_id); - - --- --- Name: idx_fk_staff_id; Type: INDEX; Schema: public; Owner: postgres; Tablespace: --- - -CREATE INDEX idx_fk_staff_id ON payment USING btree (staff_id); - - --- --- Name: idx_fk_store_id; Type: INDEX; Schema: public; Owner: postgres; Tablespace: --- - -CREATE INDEX idx_fk_store_id ON customer USING btree (store_id); - - --- --- Name: idx_last_name; Type: INDEX; Schema: public; Owner: postgres; Tablespace: --- - -CREATE INDEX idx_last_name ON customer USING btree (last_name); - - --- --- Name: idx_store_id_film_id; Type: INDEX; Schema: public; Owner: postgres; Tablespace: --- - -CREATE INDEX idx_store_id_film_id ON inventory USING btree (store_id, film_id); - - --- --- Name: idx_title; Type: INDEX; Schema: public; Owner: postgres; Tablespace: --- - -CREATE INDEX idx_title ON film USING btree (title); - - --- --- Name: idx_unq_manager_staff_id; Type: INDEX; Schema: public; Owner: postgres; Tablespace: --- - -CREATE UNIQUE INDEX idx_unq_manager_staff_id ON store USING btree (manager_staff_id); - - --- --- Name: idx_unq_rental_rental_date_inventory_id_customer_id; Type: INDEX; Schema: public; Owner: postgres; Tablespace: --- - -CREATE UNIQUE INDEX idx_unq_rental_rental_date_inventory_id_customer_id ON rental USING btree (rental_date, inventory_id, customer_id); - - --- --- Name: payment_insert_p2007_01; Type: RULE; Schema: public; Owner: postgres --- - -CREATE RULE payment_insert_p2007_01 AS ON INSERT TO payment WHERE ((new.payment_date >= '2007-01-01 00:00:00'::timestamp without time zone) AND (new.payment_date < '2007-02-01 00:00:00'::timestamp without time zone)) DO INSTEAD INSERT INTO payment_p2007_01 (payment_id, customer_id, staff_id, rental_id, amount, payment_date) VALUES (DEFAULT, new.customer_id, new.staff_id, new.rental_id, new.amount, new.payment_date); - - --- --- Name: payment_insert_p2007_02; Type: RULE; Schema: public; Owner: postgres --- - -CREATE RULE payment_insert_p2007_02 AS ON INSERT TO payment WHERE ((new.payment_date >= '2007-02-01 00:00:00'::timestamp without time zone) AND (new.payment_date < '2007-03-01 00:00:00'::timestamp without time zone)) DO INSTEAD INSERT INTO payment_p2007_02 (payment_id, customer_id, staff_id, rental_id, amount, payment_date) VALUES (DEFAULT, new.customer_id, new.staff_id, new.rental_id, new.amount, new.payment_date); - - --- --- Name: payment_insert_p2007_03; Type: RULE; Schema: public; Owner: postgres --- - -CREATE RULE payment_insert_p2007_03 AS ON INSERT TO payment WHERE ((new.payment_date >= '2007-03-01 00:00:00'::timestamp without time zone) AND (new.payment_date < '2007-04-01 00:00:00'::timestamp without time zone)) DO INSTEAD INSERT INTO payment_p2007_03 (payment_id, customer_id, staff_id, rental_id, amount, payment_date) VALUES (DEFAULT, new.customer_id, new.staff_id, new.rental_id, new.amount, new.payment_date); - - --- --- Name: payment_insert_p2007_04; Type: RULE; Schema: public; Owner: postgres --- - -CREATE RULE payment_insert_p2007_04 AS ON INSERT TO payment WHERE ((new.payment_date >= '2007-04-01 00:00:00'::timestamp without time zone) AND (new.payment_date < '2007-05-01 00:00:00'::timestamp without time zone)) DO INSTEAD INSERT INTO payment_p2007_04 (payment_id, customer_id, staff_id, rental_id, amount, payment_date) VALUES (DEFAULT, new.customer_id, new.staff_id, new.rental_id, new.amount, new.payment_date); - - --- --- Name: payment_insert_p2007_05; Type: RULE; Schema: public; Owner: postgres --- - -CREATE RULE payment_insert_p2007_05 AS ON INSERT TO payment WHERE ((new.payment_date >= '2007-05-01 00:00:00'::timestamp without time zone) AND (new.payment_date < '2007-06-01 00:00:00'::timestamp without time zone)) DO INSTEAD INSERT INTO payment_p2007_05 (payment_id, customer_id, staff_id, rental_id, amount, payment_date) VALUES (DEFAULT, new.customer_id, new.staff_id, new.rental_id, new.amount, new.payment_date); - - --- --- Name: payment_insert_p2007_06; Type: RULE; Schema: public; Owner: postgres --- - -CREATE RULE payment_insert_p2007_06 AS ON INSERT TO payment WHERE ((new.payment_date >= '2007-06-01 00:00:00'::timestamp without time zone) AND (new.payment_date < '2007-07-01 00:00:00'::timestamp without time zone)) DO INSTEAD INSERT INTO payment_p2007_06 (payment_id, customer_id, staff_id, rental_id, amount, payment_date) VALUES (DEFAULT, new.customer_id, new.staff_id, new.rental_id, new.amount, new.payment_date); - - --- --- Name: film_fulltext_trigger; Type: TRIGGER; Schema: public; Owner: postgres --- - -CREATE TRIGGER film_fulltext_trigger - BEFORE INSERT OR UPDATE ON film - FOR EACH ROW - EXECUTE PROCEDURE tsvector_update_trigger('fulltext', 'pg_catalog.english', 'title', 'description'); - - --- --- Name: last_updated; Type: TRIGGER; Schema: public; Owner: postgres --- - -CREATE TRIGGER last_updated - BEFORE UPDATE ON actor - FOR EACH ROW - EXECUTE PROCEDURE last_updated(); - - --- --- Name: last_updated; Type: TRIGGER; Schema: public; Owner: postgres --- - -CREATE TRIGGER last_updated - BEFORE UPDATE ON address - FOR EACH ROW - EXECUTE PROCEDURE last_updated(); - - --- --- Name: last_updated; Type: TRIGGER; Schema: public; Owner: postgres --- - -CREATE TRIGGER last_updated - BEFORE UPDATE ON category - FOR EACH ROW - EXECUTE PROCEDURE last_updated(); - - --- --- Name: last_updated; Type: TRIGGER; Schema: public; Owner: postgres --- - -CREATE TRIGGER last_updated - BEFORE UPDATE ON city - FOR EACH ROW - EXECUTE PROCEDURE last_updated(); - - --- --- Name: last_updated; Type: TRIGGER; Schema: public; Owner: postgres --- - -CREATE TRIGGER last_updated - BEFORE UPDATE ON country - FOR EACH ROW - EXECUTE PROCEDURE last_updated(); - - --- --- Name: last_updated; Type: TRIGGER; Schema: public; Owner: postgres --- - -CREATE TRIGGER last_updated - BEFORE UPDATE ON customer - FOR EACH ROW - EXECUTE PROCEDURE last_updated(); - - --- --- Name: last_updated; Type: TRIGGER; Schema: public; Owner: postgres --- - -CREATE TRIGGER last_updated - BEFORE UPDATE ON film - FOR EACH ROW - EXECUTE PROCEDURE last_updated(); - - --- --- Name: last_updated; Type: TRIGGER; Schema: public; Owner: postgres --- - -CREATE TRIGGER last_updated - BEFORE UPDATE ON film_actor - FOR EACH ROW - EXECUTE PROCEDURE last_updated(); - - --- --- Name: last_updated; Type: TRIGGER; Schema: public; Owner: postgres --- - -CREATE TRIGGER last_updated - BEFORE UPDATE ON film_category - FOR EACH ROW - EXECUTE PROCEDURE last_updated(); - - --- --- Name: last_updated; Type: TRIGGER; Schema: public; Owner: postgres --- - -CREATE TRIGGER last_updated - BEFORE UPDATE ON inventory - FOR EACH ROW - EXECUTE PROCEDURE last_updated(); - - --- --- Name: last_updated; Type: TRIGGER; Schema: public; Owner: postgres --- - -CREATE TRIGGER last_updated - BEFORE UPDATE ON language - FOR EACH ROW - EXECUTE PROCEDURE last_updated(); - - --- --- Name: last_updated; Type: TRIGGER; Schema: public; Owner: postgres --- - -CREATE TRIGGER last_updated - BEFORE UPDATE ON rental - FOR EACH ROW - EXECUTE PROCEDURE last_updated(); - - --- --- Name: last_updated; Type: TRIGGER; Schema: public; Owner: postgres --- - -CREATE TRIGGER last_updated - BEFORE UPDATE ON staff - FOR EACH ROW - EXECUTE PROCEDURE last_updated(); - - --- --- Name: last_updated; Type: TRIGGER; Schema: public; Owner: postgres --- - -CREATE TRIGGER last_updated - BEFORE UPDATE ON store - FOR EACH ROW - EXECUTE PROCEDURE last_updated(); - - --- --- Name: address_city_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY address - ADD CONSTRAINT address_city_id_fkey FOREIGN KEY (city_id) REFERENCES city(city_id) ON UPDATE CASCADE ON DELETE RESTRICT; - - --- --- Name: city_country_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY city - ADD CONSTRAINT city_country_id_fkey FOREIGN KEY (country_id) REFERENCES country(country_id) ON UPDATE CASCADE ON DELETE RESTRICT; - - --- --- Name: customer_address_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY customer - ADD CONSTRAINT customer_address_id_fkey FOREIGN KEY (address_id) REFERENCES address(address_id) ON UPDATE CASCADE ON DELETE RESTRICT; - - --- --- Name: customer_store_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY customer - ADD CONSTRAINT customer_store_id_fkey FOREIGN KEY (store_id) REFERENCES store(store_id) ON UPDATE CASCADE ON DELETE RESTRICT; - - --- --- Name: film_actor_actor_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY film_actor - ADD CONSTRAINT film_actor_actor_id_fkey FOREIGN KEY (actor_id) REFERENCES actor(actor_id) ON UPDATE CASCADE ON DELETE RESTRICT; - - -ALTER TABLE ONLY film_actor - ADD CONSTRAINT film_actor_actor_id_last_name_fkey FOREIGN KEY (actor_id, actor_last_name) REFERENCES actor(actor_id, last_name) ON UPDATE CASCADE ON DELETE RESTRICT; - --- --- Name: film_actor_film_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY film_actor - ADD CONSTRAINT film_actor_film_id_fkey FOREIGN KEY (film_id) REFERENCES film(film_id) ON UPDATE CASCADE ON DELETE RESTRICT; - - --- --- Name: film_category_category_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY film_category - ADD CONSTRAINT film_category_category_id_fkey FOREIGN KEY (category_id) REFERENCES category(category_id) ON UPDATE CASCADE ON DELETE RESTRICT; - - --- --- Name: film_category_film_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY film_category - ADD CONSTRAINT film_category_film_id_fkey FOREIGN KEY (film_id) REFERENCES film(film_id) ON UPDATE CASCADE ON DELETE RESTRICT; - - --- --- Name: film_language_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY film - ADD CONSTRAINT film_language_id_fkey FOREIGN KEY (language_id) REFERENCES language(language_id) ON UPDATE CASCADE ON DELETE RESTRICT; - - --- --- Name: film_original_language_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY film - ADD CONSTRAINT film_original_language_id_fkey FOREIGN KEY (original_language_id) REFERENCES language(language_id) ON UPDATE CASCADE ON DELETE RESTRICT; - - --- --- Name: inventory_film_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY inventory - ADD CONSTRAINT inventory_film_id_fkey FOREIGN KEY (film_id) REFERENCES film(film_id) ON UPDATE CASCADE ON DELETE RESTRICT; - - --- --- Name: inventory_store_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY inventory - ADD CONSTRAINT inventory_store_id_fkey FOREIGN KEY (store_id) REFERENCES store(store_id) ON UPDATE CASCADE ON DELETE RESTRICT; - - --- --- Name: payment_customer_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY payment - ADD CONSTRAINT payment_customer_id_fkey FOREIGN KEY (customer_id) REFERENCES customer(customer_id) ON UPDATE CASCADE ON DELETE RESTRICT; - - --- --- Name: payment_p2007_01_customer_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY payment_p2007_01 - ADD CONSTRAINT payment_p2007_01_customer_id_fkey FOREIGN KEY (customer_id) REFERENCES customer(customer_id); - - --- --- Name: payment_p2007_01_rental_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY payment_p2007_01 - ADD CONSTRAINT payment_p2007_01_rental_id_fkey FOREIGN KEY (rental_id) REFERENCES rental(rental_id); - - --- --- Name: payment_p2007_01_staff_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY payment_p2007_01 - ADD CONSTRAINT payment_p2007_01_staff_id_fkey FOREIGN KEY (staff_id) REFERENCES staff(staff_id); - - --- --- Name: payment_p2007_02_customer_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY payment_p2007_02 - ADD CONSTRAINT payment_p2007_02_customer_id_fkey FOREIGN KEY (customer_id) REFERENCES customer(customer_id); - - --- --- Name: payment_p2007_02_rental_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY payment_p2007_02 - ADD CONSTRAINT payment_p2007_02_rental_id_fkey FOREIGN KEY (rental_id) REFERENCES rental(rental_id); - - --- --- Name: payment_p2007_02_staff_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY payment_p2007_02 - ADD CONSTRAINT payment_p2007_02_staff_id_fkey FOREIGN KEY (staff_id) REFERENCES staff(staff_id); - - --- --- Name: payment_p2007_03_customer_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY payment_p2007_03 - ADD CONSTRAINT payment_p2007_03_customer_id_fkey FOREIGN KEY (customer_id) REFERENCES customer(customer_id); - - --- --- Name: payment_p2007_03_rental_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY payment_p2007_03 - ADD CONSTRAINT payment_p2007_03_rental_id_fkey FOREIGN KEY (rental_id) REFERENCES rental(rental_id); - - --- --- Name: payment_p2007_03_staff_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY payment_p2007_03 - ADD CONSTRAINT payment_p2007_03_staff_id_fkey FOREIGN KEY (staff_id) REFERENCES staff(staff_id); - - --- --- Name: payment_p2007_04_customer_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY payment_p2007_04 - ADD CONSTRAINT payment_p2007_04_customer_id_fkey FOREIGN KEY (customer_id) REFERENCES customer(customer_id); - - --- --- Name: payment_p2007_04_rental_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY payment_p2007_04 - ADD CONSTRAINT payment_p2007_04_rental_id_fkey FOREIGN KEY (rental_id) REFERENCES rental(rental_id); - - --- --- Name: payment_p2007_04_staff_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY payment_p2007_04 - ADD CONSTRAINT payment_p2007_04_staff_id_fkey FOREIGN KEY (staff_id) REFERENCES staff(staff_id); - - --- --- Name: payment_p2007_05_customer_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY payment_p2007_05 - ADD CONSTRAINT payment_p2007_05_customer_id_fkey FOREIGN KEY (customer_id) REFERENCES customer(customer_id); - - --- --- Name: payment_p2007_05_rental_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY payment_p2007_05 - ADD CONSTRAINT payment_p2007_05_rental_id_fkey FOREIGN KEY (rental_id) REFERENCES rental(rental_id); - - --- --- Name: payment_p2007_05_staff_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY payment_p2007_05 - ADD CONSTRAINT payment_p2007_05_staff_id_fkey FOREIGN KEY (staff_id) REFERENCES staff(staff_id); - - --- --- Name: payment_p2007_06_customer_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY payment_p2007_06 - ADD CONSTRAINT payment_p2007_06_customer_id_fkey FOREIGN KEY (customer_id) REFERENCES customer(customer_id); - - --- --- Name: payment_p2007_06_rental_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY payment_p2007_06 - ADD CONSTRAINT payment_p2007_06_rental_id_fkey FOREIGN KEY (rental_id) REFERENCES rental(rental_id); - - --- --- Name: payment_p2007_06_staff_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY payment_p2007_06 - ADD CONSTRAINT payment_p2007_06_staff_id_fkey FOREIGN KEY (staff_id) REFERENCES staff(staff_id); - - --- --- Name: payment_rental_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY payment - ADD CONSTRAINT payment_rental_id_fkey FOREIGN KEY (rental_id) REFERENCES rental(rental_id) ON UPDATE CASCADE ON DELETE SET NULL; - - --- --- Name: payment_staff_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY payment - ADD CONSTRAINT payment_staff_id_fkey FOREIGN KEY (staff_id) REFERENCES staff(staff_id) ON UPDATE CASCADE ON DELETE RESTRICT; - - --- --- Name: rental_customer_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY rental - ADD CONSTRAINT rental_customer_id_fkey FOREIGN KEY (customer_id) REFERENCES customer(customer_id) ON UPDATE CASCADE ON DELETE RESTRICT; - - --- --- Name: rental_inventory_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY rental - ADD CONSTRAINT rental_inventory_id_fkey FOREIGN KEY (inventory_id) REFERENCES inventory(inventory_id) ON UPDATE CASCADE ON DELETE RESTRICT; - - --- --- Name: rental_staff_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY rental - ADD CONSTRAINT rental_staff_id_fkey FOREIGN KEY (staff_id) REFERENCES staff(staff_id) ON UPDATE CASCADE ON DELETE RESTRICT; - - --- --- Name: staff_address_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY staff - ADD CONSTRAINT staff_address_id_fkey FOREIGN KEY (address_id) REFERENCES address(address_id) ON UPDATE CASCADE ON DELETE RESTRICT; - - --- --- Name: staff_store_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY staff - ADD CONSTRAINT staff_store_id_fkey FOREIGN KEY (store_id) REFERENCES store(store_id); - - --- --- Name: store_address_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY store - ADD CONSTRAINT store_address_id_fkey FOREIGN KEY (address_id) REFERENCES address(address_id) ON UPDATE CASCADE ON DELETE RESTRICT; - - --- --- Name: store_manager_staff_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY store - ADD CONSTRAINT store_manager_staff_id_fkey FOREIGN KEY (manager_staff_id) REFERENCES staff(staff_id) ON UPDATE CASCADE ON DELETE RESTRICT; - - --- --- Add sequel to Film table for self reference test --- -ALTER TABLE ONLY film - ADD COLUMN sequel bigint; -ALTER TABLE ONLY film - ADD CONSTRAINT sequel_fkey FOREIGN KEY(sequel) REFERENCES film(film_id); - --- --- Name: public; Type: ACL; Schema: -; Owner: postgres --- - -REVOKE ALL ON SCHEMA public FROM PUBLIC; -GRANT ALL ON SCHEMA public TO postgres; -GRANT ALL ON SCHEMA public TO PUBLIC; - - --- --- PostgreSQL database dump complete --- - -ALTER TABLE customer ADD COLUMN IF NOT EXISTS usernames TEXT[]; - -CREATE TABLE public ( - dummy_column character varying(1), - vacation_id bigint - -); - -ALTER TABLE ONLY public - ADD CONSTRAINT public_vacation_fkey FOREIGN KEY (vacation_id) REFERENCES vacation(vacation_id); - --- --- Secondary schema to exercise cross-schema routine collisions in @experimental_procedureCall. --- utils.last_day collides with public.last_day (same name, different schema) so that the --- bare name is ambiguous and must be qualified as 'utils.last_day' or 'public.last_day'. --- utils.only_here is unique to utils to verify qualified lookup without collision. --- -CREATE SCHEMA utils; - -CREATE FUNCTION utils.last_day(timestamp without time zone) RETURNS date - LANGUAGE SQL IMMUTABLE - AS $_$SELECT CAST($1 AS date)$_$; - -CREATE FUNCTION utils.only_here(p_value bigint) RETURNS bigint - LANGUAGE SQL IMMUTABLE - AS $_$SELECT $1$_$; \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/contextInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/contextInput/schema.graphqls deleted file mode 100644 index 1ff1129d90..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/contextInput/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation: ID @service(service: {name: "CONTEXT_SERVICE"}, contextArguments: "ctxField") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/default/expected/MutationGeneratedDataFetcher.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/default/expected/MutationGeneratedDataFetcher.java deleted file mode 100644 index 4b1b1c67e0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/default/expected/MutationGeneratedDataFetcher.java +++ /dev/null @@ -1,18 +0,0 @@ -package fake.code.generated.resolvers.mutation; - -import fake.code.generated.transform.RecordTransformer; -import graphql.schema.DataFetcher; -import java.lang.String; -import java.util.concurrent.CompletableFuture; -import no.sikt.graphitron.codereferences.services.ResolverMutationService; -import no.sikt.graphql.helpers.resolvers.ServiceDataFetcherHelper; - -public class MutationGeneratedDataFetcher { - public static DataFetcher<CompletableFuture<String>> mutation() { - return _iv_env -> { - var _iv_transform = new RecordTransformer(_iv_env); - var _rs_resolverMutationService = new ResolverMutationService(_iv_transform.getCtx()); - return new ServiceDataFetcherHelper<>(_iv_transform).load(() -> _rs_resolverMutationService.mutation()); - }; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/default/schema.graphqls deleted file mode 100644 index 30736a89e7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/default/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation: ID @service(service: {name: "RESOLVER_MUTATION_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/doubleNestedInputRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/doubleNestedInputRecord/schema.graphqls deleted file mode 100644 index 02cbec6d16..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/doubleNestedInputRecord/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Mutation { - mutation(in0: Wrapper0): ID @service(service: {name: "RESOLVER_MUTATION_SERVICE"}) -} - -input Wrapper0 @table(name: "CUSTOMER") { - in1: Wrapper1 -} - -input Wrapper1 @table(name: "CUSTOMER") { - in2: CustomerInputTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/javaRecordInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/javaRecordInput/schema.graphqls deleted file mode 100644 index 0df8607180..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/javaRecordInput/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: DummyInputRecord): ID @service(service: {name: "RESOLVER_MUTATION_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/listedInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/listedInput/schema.graphqls deleted file mode 100644 index 3ecaceaa36..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/listedInput/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: [ID]): ID @service(service: {name: "RESOLVER_MUTATION_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/listedRecordInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/listedRecordInput/schema.graphqls deleted file mode 100644 index 10ac1498f9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/listedRecordInput/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: [CustomerInputTable]): ID @service(service: {name: "RESOLVER_MUTATION_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/multipleInputs/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/multipleInputs/schema.graphqls deleted file mode 100644 index 9a1d7bc40a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/multipleInputs/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in0: ID, in1: ID): ID @service(service: {name: "RESOLVER_MUTATION_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/multipleRecordInputs/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/multipleRecordInputs/schema.graphqls deleted file mode 100644 index f55941129b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/multipleRecordInputs/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in0: CustomerInputTable, in1: CustomerInputTable): ID @service(service: {name: "RESOLVER_MUTATION_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/nestedInputRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/nestedInputRecord/schema.graphqls deleted file mode 100644 index d773e47350..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/nestedInputRecord/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in0: Wrapper): ID @service(service: {name: "RESOLVER_MUTATION_SERVICE"}) -} - -input Wrapper @table(name: "CUSTOMER") { - in1: CustomerInputTable # The inputs need different names to avoid a variable name conflict. -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/nestedListedInputRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/nestedListedInputRecord/schema.graphqls deleted file mode 100644 index 18381b5db9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/nestedListedInputRecord/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in0: Wrapper): ID @service(service: {name: "RESOLVER_MUTATION_SERVICE"}) -} - -input Wrapper @table(name: "CUSTOMER") { - in1: [CustomerInputTable] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/nestedTwiceListedInputRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/nestedTwiceListedInputRecord/schema.graphqls deleted file mode 100644 index fa55f6d28c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/nestedTwiceListedInputRecord/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in0: [Wrapper]): ID @service(service: {name: "RESOLVER_MUTATION_SERVICE"}) -} - -input Wrapper @table(name: "CUSTOMER") { - in1: [CustomerInputTable] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/oneInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/oneInput/schema.graphqls deleted file mode 100644 index e324d98dd2..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/oneInput/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: ID): ID @service(service: {name: "RESOLVER_MUTATION_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/recordInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/recordInput/schema.graphqls deleted file mode 100644 index 9d3690ee73..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/recordInput/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerInputTable): ID @service(service: {name: "RESOLVER_MUTATION_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/returningJOOQRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/returningJOOQRecord/schema.graphqls deleted file mode 100644 index ce335b8a07..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/returningJOOQRecord/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation: CustomerTable @service(service: {name: "RESOLVER_MUTATION_SERVICE", method: "mutationCustomer"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/returningJavaRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/returningJavaRecord/schema.graphqls deleted file mode 100644 index d48abeb5ce..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/returningJavaRecord/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation: DummyTypeRecord @service(service: {name: "RESOLVER_MUTATION_SERVICE", method: "mutationDummy"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/wrappedInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/wrappedInput/schema.graphqls deleted file mode 100644 index f805a4366f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/services/wrappedInput/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: Input): ID @service(service: {name: "RESOLVER_MUTATION_SERVICE"}) -} - -input Input { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/assertInputColumns/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/assertInputColumns/schema.graphqls deleted file mode 100644 index 9b0dbbd7af..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/assertInputColumns/schema.graphqls +++ /dev/null @@ -1,13 +0,0 @@ -type Mutation { - mutation(in: FilmActorInput): ID @mutation(typeName: UPDATE) -} - -input FilmActorInput @table(name: "film_actor"){ - id: ID! @nodeId(typeName: "FilmActor") - actor: String @field(name: "actor_id") -} - -type FilmActor implements Node @table(name: "film_actor") @node { - id: ID! -} - diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/assertListedInputColumns/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/assertListedInputColumns/schema.graphqls deleted file mode 100644 index f7a4ae60e9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/assertListedInputColumns/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Mutation { - mutation(in: [FilmActorInput]): ID @mutation(typeName: UPDATE) -} - -input FilmActorInput @table(name: "film_actor"){ - id: ID! @nodeId(typeName: "FilmActor") - actor: String @field(name: "actor_id") -} - -type FilmActor implements Node @table(name: "film_actor") @node { - id: ID! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/assertManyOverlappingFields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/assertManyOverlappingFields/schema.graphqls deleted file mode 100644 index 952a176388..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/assertManyOverlappingFields/schema.graphqls +++ /dev/null @@ -1,17 +0,0 @@ -type Mutation { - mutation(in: [FilmActorInput]): ID @mutation(typeName: UPDATE) -} - -input FilmActorInput @table(name: "film_actor"){ - id: ID! @nodeId(typeName: "FilmActor") - filmId: ID! @nodeId(typeName: "Film") - actor: String @field(name: "actor_id") -} - -type FilmActor implements Node @table(name: "film_actor") @node { - id: ID! @nodeId -} - -type Film implements Node @table(name: "film") @node { - id: ID! @nodeId -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/default/expected/MutationGeneratedDataFetcher.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/default/expected/MutationGeneratedDataFetcher.java deleted file mode 100644 index 4624e539ea..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/default/expected/MutationGeneratedDataFetcher.java +++ /dev/null @@ -1,24 +0,0 @@ -package fake.code.generated.resolvers.mutation; - -import fake.code.generated.queries.MutationDBQueries; -import fake.code.generated.transform.RecordTransformer; -import fake.graphql.example.model.CustomerInputTable; -import graphql.schema.DataFetcher; -import java.lang.String; -import java.util.concurrent.CompletableFuture; -import no.sikt.graphql.helpers.resolvers.DataFetcherHelper; -import no.sikt.graphql.helpers.resolvers.ResolverHelpers; - -public class MutationGeneratedDataFetcher { - public static DataFetcher<CompletableFuture<String>> mutation() { - return _iv_env -> { - CustomerInputTable _mi_in = ResolverHelpers.transformDTO(_iv_env.getArgument("in"), CustomerInputTable.class); - var _iv_transform = new RecordTransformer(_iv_env); - - var _mi_inRecord = _iv_transform.customerInputTableToJOOQRecord(_mi_in, _iv_transform.getArgumentPresence().child("in"), "in"); - - MutationDBQueries.mutationForMutation(_iv_transform.getCtx(), _mi_inRecord); - return new DataFetcherHelper(_iv_env).load((_iv_ctx, _iv_selectionSet) -> MutationDBQueries.mutationForMutation(_iv_ctx, _mi_inRecord, _iv_selectionSet)); - }; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/default/schema.graphqls deleted file mode 100644 index 1eb3b24912..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/default/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerInputTable): ID @mutation(typeName: UPDATE) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/delete/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/delete/schema.graphqls deleted file mode 100644 index 061776178d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/delete/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerInputTable): ID @mutation(typeName: DELETE) -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/deleteListed/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/deleteListed/schema.graphqls deleted file mode 100644 index 336afdd979..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/deleteListed/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in : In): [ID] @mutation(typeName: DELETE) -} - -input In { - id: [ID] -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/deleteWrapped/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/deleteWrapped/schema.graphqls deleted file mode 100644 index 06f583c9f1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/deleteWrapped/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerInputTable): CustomerTable @mutation(typeName: DELETE) -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/deleteWrappedListed/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/deleteWrappedListed/schema.graphqls deleted file mode 100644 index 39f2872f3b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/deleteWrappedListed/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Mutation { - mutation(in : In): CustomerOutput @mutation(typeName: DELETE) -} - -input In { - id: [ID] -} - -type CustomerOutput { - id: [ID] -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/listedInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/listedInput/schema.graphqls deleted file mode 100644 index dade46b2e3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/listedInput/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: [CustomerInputTable]): [ID] @mutation(typeName: UPDATE) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/multipleInputs/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/multipleInputs/schema.graphqls deleted file mode 100644 index 9709ee0b6b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/multipleInputs/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in0: CustomerInputTable, in1: CustomerInputTable): ID @mutation(typeName: UPDATE) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/multipleListedInputs/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/multipleListedInputs/schema.graphqls deleted file mode 100644 index 83a7f5175d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/multipleListedInputs/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in0: [CustomerInputTable], in1: [CustomerInputTable]): [ID] @mutation(typeName: UPDATE) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/multipleMixedInputs/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/multipleMixedInputs/schema.graphqls deleted file mode 100644 index 84c2b82a82..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/multipleMixedInputs/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in0: [CustomerInputTable], in1: CustomerInputTable): [ID] @mutation(typeName: UPDATE) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/nodeId/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/nodeId/schema.graphqls deleted file mode 100644 index 1eb3b24912..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/nodeId/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerInputTable): ID @mutation(typeName: UPDATE) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/upsertAsStore/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/upsertAsStore/schema.graphqls deleted file mode 100644 index 9aad151e43..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/upsertAsStore/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerInputTable): ID @mutation(typeName: UPSERT) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/upsertAsStoreListed/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/upsertAsStoreListed/schema.graphqls deleted file mode 100644 index 17394a9683..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/upsertAsStoreListed/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: [CustomerInputTable]): [ID] @mutation(typeName: UPSERT) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/withNonRecordInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/withNonRecordInput/schema.graphqls deleted file mode 100644 index 181099e1e1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withBatching/withNonRecordInput/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerInputTable, email: String): [ID] @mutation(typeName: UPDATE) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withReturning/delete/expected/MutationGeneratedDataFetcher.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withReturning/delete/expected/MutationGeneratedDataFetcher.java deleted file mode 100644 index 53cbc4bac4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withReturning/delete/expected/MutationGeneratedDataFetcher.java +++ /dev/null @@ -1,23 +0,0 @@ -package fake.code.generated.resolvers.mutation; - -import fake.code.generated.queries.MutationDBQueries; -import fake.code.generated.transform.RecordTransformer; -import fake.graphql.example.model.CustomerInputTable; -import graphql.schema.DataFetcher; - -import java.lang.String; -import java.util.concurrent.CompletableFuture; - -import no.sikt.graphql.helpers.resolvers.DataFetcherHelper; -import no.sikt.graphql.helpers.resolvers.ResolverHelpers; - -public class MutationGeneratedDataFetcher { - public static DataFetcher<CompletableFuture<String>> mutation() { - return _iv_env -> { - CustomerInputTable _mi_in = ResolverHelpers.transformDTO(_iv_env.getArgument("in"), CustomerInputTable.class); - var _iv_transform = new RecordTransformer(_iv_env); - var _mi_inRecord = _iv_transform.customerInputTableToJOOQRecord(_mi_in, _iv_transform.getArgumentPresence().child("in"), "in"); - return new DataFetcherHelper(_iv_env).load((_iv_ctx, _iv_selectionSet) -> MutationDBQueries.mutationForMutation(_iv_ctx, _mi_inRecord, _iv_selectionSet)); - }; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withReturning/delete/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withReturning/delete/schema.graphqls deleted file mode 100644 index a04787d34c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withReturning/delete/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerInputTable): ID @mutation(typeName: DELETE) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withReturning/insert/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withReturning/insert/schema.graphqls deleted file mode 100644 index b4e6b9cfc9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withReturning/insert/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerInputTable): ID @mutation(typeName: INSERT) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withReturning/withNodeIdStrategy/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withReturning/withNodeIdStrategy/schema.graphqls deleted file mode 100644 index a04787d34c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withReturning/withNodeIdStrategy/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerInputTable): ID @mutation(typeName: DELETE) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withReturning/wrappedOutputForDelete/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withReturning/wrappedOutputForDelete/schema.graphqls deleted file mode 100644 index ad0e221b2b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withReturning/wrappedOutputForDelete/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: CustomerInputTable): Wrapper @mutation(typeName: DELETE) -} - -type Wrapper { - id: ID -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withReturning/wrappedOutputForInsert/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withReturning/wrappedOutputForInsert/schema.graphqls deleted file mode 100644 index 38efc0f7f4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/edit/standard/withReturning/wrappedOutputForInsert/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: CustomerInputTable): Wrapper @mutation(typeName: INSERT) -} - -type Wrapper { - id: ID -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/entity/default/expected/QueryGeneratedDataFetcher.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/entity/default/expected/QueryGeneratedDataFetcher.java deleted file mode 100644 index 9a13ff0fc6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/entity/default/expected/QueryGeneratedDataFetcher.java +++ /dev/null @@ -1,23 +0,0 @@ -package fake.code.generated.queries.query; - -import fake.code.generated.queries.CustomerDBQueries; -import fake.graphql.example.model._Entity; -import graphql.schema.DataFetcher; -import java.util.List; -import java.util.Map; -import java.util.concurrent.CompletableFuture; -import no.sikt.graphql.helpers.resolvers.DataFetcherHelper; - -public class QueryGeneratedDataFetcher { - public static DataFetcher<CompletableFuture<List<_Entity>>> _entities() { - return _iv_env -> { - List<?> _mi_representations = _iv_env.getArgument("representations"); - return new DataFetcherHelper(_iv_env).loadLookupEntities( - _mi_representations, - Map.ofEntries( - Map.entry("Customer", (_iv_ctx, _iv_reps, _iv_selectionSet) -> CustomerDBQueries.customerFor_Entity(_iv_ctx, _iv_reps, _iv_selectionSet)) - ) - ); - } ; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/entity/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/entity/default/schema.graphqls deleted file mode 100644 index f294b842b9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/entity/default/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -union _Entity = Customer - -type Customer @table @key(fields: "id") { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/entity/noEntities/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/entity/noEntities/schema.graphqls deleted file mode 100644 index dd0eba4682..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/entity/noEntities/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -union _Entity = Dummy - -type Dummy { - string: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/entity/twoEntities/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/entity/twoEntities/schema.graphqls deleted file mode 100644 index b300bf772c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/entity/twoEntities/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -union _Entity = Customer | Address - -type Customer @table @key(fields: "id") { - id: ID -} - -type Address @table @key(fields: "addressId") { - addressId: ID -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/default/expected/QueryGeneratedDataFetcher.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/default/expected/QueryGeneratedDataFetcher.java deleted file mode 100644 index 460c629539..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/default/expected/QueryGeneratedDataFetcher.java +++ /dev/null @@ -1,19 +0,0 @@ -package fake.code.generated.resolvers.query; - -import fake.code.generated.queries.QueryDBQueries; -import fake.graphql.example.model.DummyType; -import graphql.schema.DataFetcher; -import java.lang.String; -import java.util.List; -import java.util.concurrent.CompletableFuture; -import no.sikt.graphql.helpers.resolvers.DataFetcherHelper; - -public class QueryGeneratedDataFetcher { - public static DataFetcher<CompletableFuture<DummyType>> query() { - return _iv_env -> { - List<String> _mi_id = _iv_env.getArgument("id"); - var _iv_lookupKeys = List.of(_mi_id); - return new DataFetcherHelper(_iv_env).loadLookup(_iv_lookupKeys, (_iv_ctx, _iv_keys, _iv_selectionSet) -> QueryDBQueries.queryForQuery(_iv_ctx, _mi_id, _iv_selectionSet)); - }; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/default/schema.graphqls deleted file mode 100644 index aefaa2e0fd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/default/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(id: [ID] @lookupKey): DummyType -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/inputKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/inputKey/schema.graphqls deleted file mode 100644 index 7892518439..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/inputKey/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(in: [DummyInput] @lookupKey): DummyType -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/integerKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/integerKey/schema.graphqls deleted file mode 100644 index 71a86d2091..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/integerKey/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(i: [Int] @lookupKey): DummyType -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/integerKeyInInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/integerKeyInInput/schema.graphqls deleted file mode 100644 index 7dbe69fbc2..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/integerKeyInInput/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: Input): DummyType -} - -input Input { - i: Int @lookupKey -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/keyInInputWithDuplicateDirective/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/keyInInputWithDuplicateDirective/schema.graphqls deleted file mode 100644 index 8e479fb2ee..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/keyInInputWithDuplicateDirective/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: [Input] @lookupKey): DummyType -} - -input Input { - id: ID @lookupKey -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/keyInListedInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/keyInListedInput/schema.graphqls deleted file mode 100644 index dee7e52a9c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/keyInListedInput/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: [Input]): DummyType -} - -input Input { - id: ID @lookupKey -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/keyInNestedInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/keyInNestedInput/schema.graphqls deleted file mode 100644 index 50a022cebd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/keyInNestedInput/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(in1: Input1): DummyType -} - -input Input1 { - in2: Input2 -} - -input Input2 { - id: [ID] @lookupKey -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/keyInNestedInputMiddle/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/keyInNestedInputMiddle/schema.graphqls deleted file mode 100644 index 05cd70b1dd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/keyInNestedInputMiddle/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(in1: Input1): DummyType -} - -input Input1 { - in2: Input2 @lookupKey -} - -input Input2 { - id: [ID] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/listedKeyInInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/listedKeyInInput/schema.graphqls deleted file mode 100644 index 7444a8efb8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/listedKeyInInput/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: Input): DummyType -} - -input Input { - id: [ID] @lookupKey -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/mixedKeys/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/mixedKeys/schema.graphqls deleted file mode 100644 index 6cc457d563..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/mixedKeys/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(id: [ID] @lookupKey, in: [DummyInput] @lookupKey, i: [Int] @lookupKey): DummyType -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/multipleKeys/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/multipleKeys/schema.graphqls deleted file mode 100644 index 2ed2c2f5c3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/multipleKeys/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(id0: [ID] @lookupKey, id1: [ID] @lookupKey, id2: [ID] @lookupKey): DummyType -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/nestedInputIntegerKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/nestedInputIntegerKey/schema.graphqls deleted file mode 100644 index f7db8600ba..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/nestedInputIntegerKey/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(in: [Input1] @lookupKey): DummyType -} - -input Input1 { - in: Input2 -} - -input Input2 { - i: Int -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/nestedInputKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/nestedInputKey/schema.graphqls deleted file mode 100644 index 72552e18f3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/nestedInputKey/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: [Input] @lookupKey): DummyType -} - -input Input { - in: DummyInput -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/nestedInputKeyMiddle/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/nestedInputKeyMiddle/schema.graphqls deleted file mode 100644 index 22ec67e0f0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/nestedInputKeyMiddle/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: [Input]): DummyType -} - -input Input { - in: DummyInput @lookupKey -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/nestedInputKeyWithMiddleList/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/nestedInputKeyWithMiddleList/schema.graphqls deleted file mode 100644 index 1382327398..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/nestedInputKeyWithMiddleList/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: Input @lookupKey): DummyType -} - -input Input { - in: [DummyInput] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/otherNonKeyField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/otherNonKeyField/schema.graphqls deleted file mode 100644 index 2c5f658357..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/otherNonKeyField/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(id0: [ID] @lookupKey, id1: ID): DummyType -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/splitQuery/expected/WrapperGeneratedDataFetcher.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/splitQuery/expected/WrapperGeneratedDataFetcher.java deleted file mode 100644 index 406c48e1a9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/splitQuery/expected/WrapperGeneratedDataFetcher.java +++ /dev/null @@ -1,22 +0,0 @@ -package fake.code.generated.resolvers.query; - -import fake.code.generated.queries.WrapperDBQueries; -import fake.graphql.example.model.DummyType; -import fake.graphql.example.model.Wrapper; -import graphql.schema.DataFetcher; -import java.lang.String; -import java.util.List; -import java.util.concurrent.CompletableFuture; -import no.sikt.graphql.helpers.resolvers.DataFetcherHelper; - -public class WrapperGeneratedDataFetcher { - public static DataFetcher<CompletableFuture<DummyType>> query() { - return _iv_env -> { - Wrapper _os_wrapper = _iv_env.getSource(); - List<String> _mi_id = _iv_env.getArgument("id"); - var _iv_lookupKeys = List.of(_mi_id); - return new DataFetcherHelper(_iv_env).loadLookup(_iv_lookupKeys, (_iv_ctx, _iv_keys, _iv_selectionSet) -> WrapperDBQueries.queryForWrapper(_iv_ctx, _mi_id, _iv_selectionSet)); - }; - } -} - diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/splitQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/splitQuery/schema.graphqls deleted file mode 100644 index 251521507e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/splitQuery/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Wrapper { - id: ID - - query(id: [ID] @lookupKey): DummyType @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/withoutList/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/withoutList/schema.graphqls deleted file mode 100644 index 738a98023b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/lookup/withoutList/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(id: ID @lookupKey): DummyType -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/node/doubleInterface/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/node/doubleInterface/schema.graphqls deleted file mode 100644 index eeaab05128..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/node/doubleInterface/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - node(id: ID!): Node # Node interface - titled: Titled - - film: Film @notGenerated -} - -type Film implements Titled & Node @table { - id: ID! - title: String! -} - -interface Titled { - title: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/node/manyImplementations/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/node/manyImplementations/schema.graphqls deleted file mode 100644 index 18a9780cf2..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/node/manyImplementations/schema.graphqls +++ /dev/null @@ -1,19 +0,0 @@ -type Query { - node(id: ID!): Node # Node interface - - customer: Customer @notGenerated - film: Film @notGenerated - address: Address @notGenerated -} - -type Customer implements Node @table { - id: ID! -} - -type Film implements Node @table { - id: ID! -} - -type Address implements Node @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/node/noImplementations/expected/QueryGeneratedDataFetcher.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/node/noImplementations/expected/QueryGeneratedDataFetcher.java deleted file mode 100644 index c33a05bdd5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/node/noImplementations/expected/QueryGeneratedDataFetcher.java +++ /dev/null @@ -1,27 +0,0 @@ -package fake.code.generated.resolvers.query; - -import fake.graphql.example.model.Node; -import graphql.schema.DataFetcher; -import java.lang.IllegalArgumentException; -import java.lang.String; -import java.util.concurrent.CompletableFuture; -import no.sikt.graphql.NodeIdHandler; -import no.sikt.graphql.helpers.resolvers.DataFetcherHelper; - -public class QueryGeneratedDataFetcher { - public static DataFetcher<CompletableFuture<Node>> node(NodeIdHandler _iv_nodeIdHandler) { - return _iv_env -> { - String _mi_id = _iv_env.getArgument("id"); - var _iv_targetType = null; - if (_iv_targetType == null) { - throw new IllegalArgumentException("Could not resolve input id with value " + _mi_id + " within type " + _iv_targetType); - } - var _iv_loaderName = _iv_targetType + "_node"; - var _iv_fetcher = new DataFetcherHelper(_iv_env); - - switch (_iv_targetType) { - default: throw new IllegalArgumentException("Could not resolve input id with value " + _mi_id + " within type " + _iv_targetType); - } - }; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/node/noImplementations/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/node/noImplementations/schema.graphqls deleted file mode 100644 index 21fb856c57..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/node/noImplementations/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - node(id: ID!): Node # Node interface -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/node/oneImplementation/expected/QueryGeneratedDataFetcher.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/node/oneImplementation/expected/QueryGeneratedDataFetcher.java deleted file mode 100644 index eb63ace884..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/node/oneImplementation/expected/QueryGeneratedDataFetcher.java +++ /dev/null @@ -1,33 +0,0 @@ -package fake.code.generated.resolvers.query; - -import fake.code.generated.queries.CustomerDBQueries; -import fake.graphql.example.model.Node; -import graphql.schema.DataFetcher; -import java.lang.IllegalArgumentException; -import java.lang.String; -import java.util.Map; -import java.util.concurrent.CompletableFuture; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.Customer; -import no.sikt.graphql.NodeIdHandler; -import no.sikt.graphql.helpers.resolvers.DataFetcherHelper; - -public class QueryGeneratedDataFetcher { - private static final Map<String, String> _iv_tABLE_TO_TYPE = Map.ofEntries(Map.entry(Customer.CUSTOMER.getName(), "Customer")); - - public static DataFetcher<CompletableFuture<Node>> node(NodeIdHandler _iv_nodeIdHandler) { - return _iv_env -> { - String _mi_id = _iv_env.getArgument("id"); - var _iv_targetType = _iv_tABLE_TO_TYPE.get(_iv_nodeIdHandler.getTable(_mi_id).getName()); - if (_iv_targetType == null) { - throw new IllegalArgumentException("Could not resolve input id with value " + _mi_id + " within type " + _iv_targetType); - } - var _iv_loaderName = _iv_targetType + "_node"; - var _iv_fetcher = new DataFetcherHelper(_iv_env); - - switch (_iv_targetType) { - case "Customer": return _iv_fetcher.loadInterface(_iv_loaderName, _mi_id, (_iv_ctx, _iv_ids, _iv_selectionSet) -> CustomerDBQueries.customerForNode(_iv_ctx, _iv_ids, _iv_selectionSet)); - default: throw new IllegalArgumentException("Could not resolve input id with value " + _mi_id + " within type " + _iv_targetType); - } - }; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/node/oneImplementation/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/node/oneImplementation/schema.graphqls deleted file mode 100644 index da1e8c0c21..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/node/oneImplementation/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Query { - node(id: ID!): Node # Node interface - - query: Customer @notGenerated -} - -type Customer implements Node @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/node/withoutPathFromQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/node/withoutPathFromQuery/schema.graphqls deleted file mode 100644 index 694b99700f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/node/withoutPathFromQuery/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - node(id: ID!): Node # Node interface -} - -type Customer implements Node @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/operation/allOptionalFieldsExcluded/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/operation/allOptionalFieldsExcluded/schema.graphqls deleted file mode 100644 index 468103160a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/operation/allOptionalFieldsExcluded/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - customers(first: Int = 100, after: String): CustomerNoOptionalsConnection -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/operation/allOptionalFieldsIncluded/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/operation/allOptionalFieldsIncluded/schema.graphqls deleted file mode 100644 index 182f536cc3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/operation/allOptionalFieldsIncluded/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - customers(first: Int = 100, after: String): CustomerConnection -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/operation/default/expected/QueryGeneratedDataFetcher.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/operation/default/expected/QueryGeneratedDataFetcher.java deleted file mode 100644 index 9fea45f68c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/operation/default/expected/QueryGeneratedDataFetcher.java +++ /dev/null @@ -1,27 +0,0 @@ -package fake.code.generated.resolvers.query; - -import fake.code.generated.queries.QueryDBQueries; -import fake.graphql.example.model.DummyType; -import graphql.schema.DataFetcher; -import java.lang.Integer; -import java.lang.String; -import java.util.concurrent.CompletableFuture; - -import no.sikt.graphql.helpers.resolvers.DataFetcherHelper; -import no.sikt.graphql.helpers.resolvers.ResolverHelpers; -import no.sikt.graphql.relay.ConnectionImpl; - -public class QueryGeneratedDataFetcher { - public static DataFetcher<CompletableFuture<ConnectionImpl<DummyType>>> query() { - return _iv_env -> { - Integer _mi_first = _iv_env.getArgument("first"); - String _mi_after = _iv_env.getArgument("after"); - int _iv_pageSize = ResolverHelpers.getPageSize(_mi_first, 1000, 100); - return new DataFetcherHelper(_iv_env).loadPaginated( - _iv_pageSize, - (_iv_ctx, _iv_selectionSet) -> QueryDBQueries.queryForQuery(_iv_ctx, _iv_pageSize, _mi_after, _iv_selectionSet), - (_iv_ctx, _iv_keys) -> QueryDBQueries.countQueryForQuery(_iv_ctx) - ); - }; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/operation/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/operation/default/schema.graphqls deleted file mode 100644 index e99b29e76a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/operation/default/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(first: Int = 100, after: String): DummyConnection -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/operation/multitableInterface/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/operation/multitableInterface/schema.graphqls deleted file mode 100644 index a56acb2c7f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/operation/multitableInterface/schema.graphqls +++ /dev/null @@ -1,23 +0,0 @@ -type Query { - titled(first: Int = 100, after: String): TitledConnection -} - -type Film implements Titled @table { - id: ID! - title: String! -} - -interface Titled { - title: String! -} - -type TitledConnection { - edges: [TitledConnectionEdge] - pageInfo: PageInfo - nodes: [Titled!]! -} - -type TitledConnectionEdge { - cursor: String - node: Titled -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/operation/singleTableInterface/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/operation/singleTableInterface/schema.graphqls deleted file mode 100644 index 4ba1c15e42..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/operation/singleTableInterface/schema.graphqls +++ /dev/null @@ -1,23 +0,0 @@ -type Query { - address(first: Int = 100, after: String): AddressConnection -} - -interface Address @table(name: "ADDRESS") @discriminate(on: "DISTRICT"){ - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressInDistrictOne implements Address @table(name: "ADDRESS") @discriminator(value: "ONE") { - id: ID - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressConnection { - edges: [AddressConnectionEdge] - pageInfo: PageInfo - nodes: [Address!]! -} - -type AddressConnectionEdge { - cursor: String - node: Address -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/operation/withContextCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/operation/withContextCondition/schema.graphqls deleted file mode 100644 index 1078aff0ea..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/operation/withContextCondition/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(first: Int = 100, after: String): DummyConnection @condition(condition: {name: "CONTEXT_CONDITION"}, contextArguments: "ctxField") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/operation/withOtherInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/operation/withOtherInput/schema.graphqls deleted file mode 100644 index 70a86fa4f1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/operation/withOtherInput/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(first: Int = 100, after: String, other: String): DummyConnection -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/splitquery/default/expected/WrapperGeneratedDataFetcher.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/splitquery/default/expected/WrapperGeneratedDataFetcher.java deleted file mode 100644 index 6a673c48c9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/splitquery/default/expected/WrapperGeneratedDataFetcher.java +++ /dev/null @@ -1,29 +0,0 @@ -package fake.code.generated.resolvers.query; - -import fake.code.generated.queries.WrapperDBQueries; -import fake.graphql.example.model.DummyType; -import fake.graphql.example.model.Wrapper; -import graphql.schema.DataFetcher; -import java.lang.Integer; -import java.lang.String; -import java.util.concurrent.CompletableFuture; - -import no.sikt.graphql.helpers.resolvers.DataFetcherHelper; -import no.sikt.graphql.helpers.resolvers.ResolverHelpers; -import no.sikt.graphql.relay.ConnectionImpl; - -public class WrapperGeneratedDataFetcher { - public static DataFetcher<CompletableFuture<ConnectionImpl<DummyType>>> query() { - return _iv_env -> { - Wrapper _os_wrapper = _iv_env.getSource(); - Integer _mi_first = _iv_env.getArgument("first"); - String _mi_after = _iv_env.getArgument("after"); - int _iv_pageSize = ResolverHelpers.getPageSize(_mi_first, 1000, 100); - return new DataFetcherHelper(_iv_env).loadPaginated( - _os_wrapper.getQueryKey(), _iv_pageSize, - (_iv_ctx, _iv_keys, _iv_selectionSet) -> WrapperDBQueries.queryForWrapper(_iv_ctx, _iv_keys, _iv_pageSize, _mi_after, _iv_selectionSet), - (_iv_ctx, _iv_keys) -> WrapperDBQueries.countQueryForWrapper(_iv_ctx, _iv_keys) - ); - }; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/splitquery/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/splitquery/default/schema.graphqls deleted file mode 100644 index da690610f5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/splitquery/default/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Wrapper { - id: ID - - query(first: Int = 100, after: String): DummyConnection @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/splitquery/withOtherInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/splitquery/withOtherInput/schema.graphqls deleted file mode 100644 index c9f7a3d641..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/pagination/splitquery/withOtherInput/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Wrapper { - id: ID - - query(first: Int = 100, after: String, other: String): DummyConnection @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/nodestrategy/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/nodestrategy/default/schema.graphqls deleted file mode 100644 index 5f5608a7ab..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/nodestrategy/default/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query: CustomerNode @service(service: {name: "RESOLVER_FETCH_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/nodestrategy/withInputJOOQRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/nodestrategy/withInputJOOQRecord/schema.graphqls deleted file mode 100644 index 05a5e297f1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/nodestrategy/withInputJOOQRecord/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(in: CustomerNodeInputTable): CustomerNode @service(service: {name: "RESOLVER_FETCH_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/contextTableMethod/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/contextTableMethod/schema.graphqls deleted file mode 100644 index 098206e03e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/contextTableMethod/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - customer: Customer @tableMethod(tableMethodReference: {name: "CONTEXT_SERVICE"}, contextArguments: "ctxField") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/default/expected/QueryGeneratedDataFetcher.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/default/expected/QueryGeneratedDataFetcher.java deleted file mode 100644 index dadf7d4b4b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/default/expected/QueryGeneratedDataFetcher.java +++ /dev/null @@ -1,20 +0,0 @@ -package fake.code.generated.resolvers.query; - -import fake.code.generated.transform.RecordTransformer; -import fake.graphql.example.model.Customer; -import graphql.schema.DataFetcher; -import java.util.concurrent.CompletableFuture; -import no.sikt.graphitron.codereferences.services.ResolverFetchService; -import no.sikt.graphql.helpers.resolvers.ServiceDataFetcherHelper; - -public class QueryGeneratedDataFetcher { - public static DataFetcher<CompletableFuture<Customer>> query() { - return _iv_env -> { - var _iv_transform = new RecordTransformer(_iv_env); - var _rs_resolverFetchService = new ResolverFetchService(_iv_transform.getCtx()); - return new ServiceDataFetcherHelper<>(_iv_transform).load( - () -> _rs_resolverFetchService.query(), - (_iv_recordTransform, _iv_response) -> _iv_recordTransform.customerRecordToGraphType(_iv_response, "")); - }; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/default/schema.graphqls deleted file mode 100644 index 3faabfe214..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/default/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query: Customer @service(service: {name: "RESOLVER_FETCH_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/explicitSplitQueryFromRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/explicitSplitQueryFromRecord/schema.graphqls deleted file mode 100644 index b640e12df5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/explicitSplitQueryFromRecord/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - query: ServiceResult @service(service: {name: "RESOLVER_FETCH_SERVICE"}) -} - -type ServiceResult @record(record: {name: "ID_RECORD"}) { - id: ID - customer: CustomerTable @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/explicitSplitQueryFromWrappedRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/explicitSplitQueryFromWrappedRecord/schema.graphqls deleted file mode 100644 index c5a77b82df..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/explicitSplitQueryFromWrappedRecord/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - query: Payload @service(service: {name: "RESOLVER_FETCH_SERVICE"}) -} - -type Payload { - result: ServiceResult -} - -type ServiceResult @record(record: {name: "ID_RECORD"}) { - id: ID - customer: CustomerTable @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/implicitSplitQueryFromRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/implicitSplitQueryFromRecord/schema.graphqls deleted file mode 100644 index 2529c47a2d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/implicitSplitQueryFromRecord/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - query: ServiceResult @service(service: {name: "RESOLVER_FETCH_SERVICE"}) -} - -type ServiceResult @record(record: {name: "ID_RECORD"}) { - id: ID - customer: CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/implicitSplitQueryFromWrappedRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/implicitSplitQueryFromWrappedRecord/schema.graphqls deleted file mode 100644 index d213a438a5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/implicitSplitQueryFromWrappedRecord/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - query: Payload @service(service: {name: "RESOLVER_FETCH_SERVICE"}) -} - -type Payload { - result: ServiceResult -} - -type ServiceResult @record(record: {name: "ID_RECORD"}) { - id: ID - customer: CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/queryAfterService/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/queryAfterService/schema.graphqls deleted file mode 100644 index 0aff890c45..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/queryAfterService/schema.graphqls +++ /dev/null @@ -1,4 +0,0 @@ -type Query { - query: Customer @service(service: {name: "RESOLVER_FETCH_SERVICE"}) - queryNormal: Customer -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/returningJavaRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/returningJavaRecord/schema.graphqls deleted file mode 100644 index 1ccc809de1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/returningJavaRecord/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query: DummyTypeRecord @service(service: {name: "RESOLVER_FETCH_SERVICE", method: "queryJavaRecord"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/returningTableListWithAutoFetch/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/returningTableListWithAutoFetch/schema.graphqls deleted file mode 100644 index 99c6f94e92..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/returningTableListWithAutoFetch/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query: [CustomerTable] @service(service: {name: "RESOLVER_FETCH_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/returningTableWithAutoFetch/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/returningTableWithAutoFetch/schema.graphqls deleted file mode 100644 index 3805c7030f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/returningTableWithAutoFetch/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query: CustomerTable @service(service: {name: "RESOLVER_FETCH_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/returningWrappedJavaRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/returningWrappedJavaRecord/schema.graphqls deleted file mode 100644 index eec1875736..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/returningWrappedJavaRecord/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Wrapper @service(service: {name: "RESOLVER_FETCH_SERVICE", method: "queryJavaRecord"}) -} - -type Wrapper { - record: DummyTypeRecord -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withContextInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withContextInput/schema.graphqls deleted file mode 100644 index adfc67864c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withContextInput/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query: String @service(service: {name: "CONTEXT_SERVICE"}, contextArguments: "ctxField") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withContextInputAndArgument/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withContextInputAndArgument/schema.graphqls deleted file mode 100644 index 35ceaf4e85..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withContextInputAndArgument/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(i: Int): String @service(service: {name: "CONTEXT_SERVICE"}, contextArguments: "ctxField") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withContextInputAndPagination/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withContextInputAndPagination/schema.graphqls deleted file mode 100644 index 578634fdf4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withContextInputAndPagination/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(first: Int = 100, after: String): DummyConnection @service(service: {name: "CONTEXT_SERVICE"}, contextArguments: "ctxField") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withInput/schema.graphqls deleted file mode 100644 index 578ded3ede..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withInput/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(id: ID): Customer @service(service: {name: "RESOLVER_FETCH_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withInputJOOQRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withInputJOOQRecord/schema.graphqls deleted file mode 100644 index eb678cedcf..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withInputJOOQRecord/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(in: CustomerInputTable): Customer @service(service: {name: "RESOLVER_FETCH_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withInputJavaRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withInputJavaRecord/schema.graphqls deleted file mode 100644 index f087eb6ce3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withInputJavaRecord/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(in: DummyInputRecord): Customer @service(service: {name: "RESOLVER_FETCH_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withPagination/expected/QueryGeneratedDataFetcher.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withPagination/expected/QueryGeneratedDataFetcher.java deleted file mode 100644 index f3d03977f5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withPagination/expected/QueryGeneratedDataFetcher.java +++ /dev/null @@ -1,31 +0,0 @@ -package fake.code.generated.resolvers.query; - -import fake.code.generated.transform.RecordTransformer; -import fake.graphql.example.model.CustomerTable; -import graphql.schema.DataFetcher; -import java.lang.Integer; -import java.lang.String; -import java.util.concurrent.CompletableFuture; - -import no.sikt.graphitron.codereferences.services.ResolverFetchService; -import no.sikt.graphql.helpers.resolvers.ResolverHelpers; -import no.sikt.graphql.helpers.resolvers.ServiceDataFetcherHelper; -import no.sikt.graphql.relay.ConnectionImpl; - -public class QueryGeneratedDataFetcher { - public static DataFetcher<CompletableFuture<ConnectionImpl<CustomerTable>>> query() { - return _iv_env -> { - Integer _mi_first = _iv_env.getArgument("first"); - String _mi_after = _iv_env.getArgument("after"); - int _iv_pageSize = ResolverHelpers.getPageSize(_mi_first, 1000, 100); - var _iv_transform = new RecordTransformer(_iv_env); - var _rs_resolverFetchService = new ResolverFetchService(_iv_transform.getCtx()); - return new ServiceDataFetcherHelper<>(_iv_transform).loadPaginated( - _iv_pageSize, - () -> _rs_resolverFetchService.queryList(_iv_pageSize, _mi_after), - (_iv_keys) -> _rs_resolverFetchService.countQueryList(), - (_iv_recordTransform, _iv_response) -> _iv_recordTransform.customerTableRecordToGraphType(_iv_response, "") - ); - }; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withPagination/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withPagination/schema.graphqls deleted file mode 100644 index c30a68aaac..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withPagination/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(first: Int = 100, after: String): CustomerConnection @service(service: {name: "RESOLVER_FETCH_SERVICE", method: "queryList"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withPaginationAndAllOptionalFieldsIncluded/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withPaginationAndAllOptionalFieldsIncluded/schema.graphqls deleted file mode 100644 index 488e2b010e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withPaginationAndAllOptionalFieldsIncluded/schema.graphqls +++ /dev/null @@ -1,4 +0,0 @@ -type Query { - customers(first: Int = 100, after: String): CustomerConnection @service( - service: {name: "RESOLVER_FETCH_SERVICE", method: "queryList"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withPaginationAndNoOptionalFieldsIncluded/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withPaginationAndNoOptionalFieldsIncluded/schema.graphqls deleted file mode 100644 index dce14a26cc..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withPaginationAndNoOptionalFieldsIncluded/schema.graphqls +++ /dev/null @@ -1,4 +0,0 @@ -type Query { - customers(first: Int = 100, after: String): CustomerNoOptionalsConnection @service( - service: {name: "RESOLVER_FETCH_SERVICE", method: "queryList"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withPaginationAndRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withPaginationAndRecord/schema.graphqls deleted file mode 100644 index 43bd115f1f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/operation/withPaginationAndRecord/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(first: Int = 100, after: String, in: CustomerInputTable): CustomerConnection @service(service: {name: "RESOLVER_FETCH_SERVICE", method: "queryList"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/splitquery/default/expected/WrapperGeneratedDataFetcher.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/splitquery/default/expected/WrapperGeneratedDataFetcher.java deleted file mode 100644 index 394af690a6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/splitquery/default/expected/WrapperGeneratedDataFetcher.java +++ /dev/null @@ -1,23 +0,0 @@ -package fake.code.generated.resolvers.query; - -import fake.code.generated.transform.RecordTransformer; -import fake.graphql.example.model.Customer; -import fake.graphql.example.model.Wrapper; -import graphql.schema.DataFetcher; -import java.util.concurrent.CompletableFuture; -import no.sikt.graphitron.codereferences.services.ResolverFetchService; -import no.sikt.graphql.helpers.resolvers.ServiceDataFetcherHelper; - -public class WrapperGeneratedDataFetcher { - public static DataFetcher<CompletableFuture<Customer>> query() { - return _iv_env -> { - Wrapper _os_wrapper = _iv_env.getSource(); - var _iv_transform = new RecordTransformer(_iv_env); - var _rs_resolverFetchService = new ResolverFetchService(_iv_transform.getCtx()); - return new ServiceDataFetcherHelper<>(_iv_transform).load( - _os_wrapper.getQueryKey(), - (_iv_keys) -> _rs_resolverFetchService.query(_iv_keys), - (_iv_recordTransform, _iv_response) -> _iv_recordTransform.customerRecordToGraphType(_iv_response, "")); - }; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/splitquery/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/splitquery/default/schema.graphqls deleted file mode 100644 index 9a456b79ba..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/splitquery/default/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Wrapper { - id: ID - - query: Customer @service(service: {name: "RESOLVER_FETCH_SERVICE"}) @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/splitquery/returningJavaRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/splitquery/returningJavaRecord/schema.graphqls deleted file mode 100644 index 3e80b81aba..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/splitquery/returningJavaRecord/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Wrapper { - id: ID - - query: DummyTypeRecord @service(service: {name: "RESOLVER_FETCH_SERVICE", method: "queryJavaRecord"}) @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/splitquery/withInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/splitquery/withInput/schema.graphqls deleted file mode 100644 index 971887f84a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/splitquery/withInput/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Wrapper { - id: ID - - query(id: ID): Customer @service(service: {name: "RESOLVER_FETCH_SERVICE"}) @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/splitquery/withInputJOOQRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/splitquery/withInputJOOQRecord/schema.graphqls deleted file mode 100644 index 4312eac8ad..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/splitquery/withInputJOOQRecord/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Wrapper { - id: ID! - - query(in: CustomerInputTable): Customer @splitQuery @service(service: {name: "RESOLVER_FETCH_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/splitquery/withInputJavaRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/splitquery/withInputJavaRecord/schema.graphqls deleted file mode 100644 index 9e3c3b57a7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/splitquery/withInputJavaRecord/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Wrapper { - id: ID! - - query(in: DummyInputRecord): Customer @splitQuery @service(service: {name: "RESOLVER_FETCH_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/splitquery/withPagination/expected/WrapperGeneratedDataFetcher.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/splitquery/withPagination/expected/WrapperGeneratedDataFetcher.java deleted file mode 100644 index c4f8d5ddd6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/splitquery/withPagination/expected/WrapperGeneratedDataFetcher.java +++ /dev/null @@ -1,33 +0,0 @@ -package fake.code.generated.resolvers.query; - -import fake.code.generated.transform.RecordTransformer; -import fake.graphql.example.model.CustomerTable; -import fake.graphql.example.model.Wrapper; -import graphql.schema.DataFetcher; -import java.lang.Integer; -import java.lang.String; -import java.util.concurrent.CompletableFuture; - -import no.sikt.graphitron.codereferences.services.ResolverFetchService; -import no.sikt.graphql.helpers.resolvers.ResolverHelpers; -import no.sikt.graphql.helpers.resolvers.ServiceDataFetcherHelper; -import no.sikt.graphql.relay.ConnectionImpl; - -public class WrapperGeneratedDataFetcher { - public static DataFetcher<CompletableFuture<ConnectionImpl<CustomerTable>>> query() { - return _iv_env -> { - Wrapper _os_wrapper = _iv_env.getSource(); - Integer _mi_first = _iv_env.getArgument("first"); - String _mi_after = _iv_env.getArgument("after"); - int _iv_pageSize = ResolverHelpers.getPageSize(_mi_first, 1000, 100); - var _iv_transform = new RecordTransformer(_iv_env); - var _rs_resolverFetchService = new ResolverFetchService(_iv_transform.getCtx()); - return new ServiceDataFetcherHelper<>(_iv_transform).loadPaginated( - _os_wrapper.getQueryKey(), _iv_pageSize, - (_iv_keys) -> _rs_resolverFetchService.queryMap(_iv_keys, _iv_pageSize, _mi_after), - (_iv_keys) -> _rs_resolverFetchService.countQueryMap(_iv_keys), - (_iv_recordTransform, _iv_response) -> _iv_recordTransform.customerTableRecordToGraphType(_iv_response, "") - ); - }; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/splitquery/withPagination/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/splitquery/withPagination/schema.graphqls deleted file mode 100644 index 1ce63dd478..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/splitquery/withPagination/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Wrapper { - id: ID - - query(first: Int = 100, after: String): CustomerConnection @splitQuery @service(service: {name: "RESOLVER_FETCH_SERVICE", method: "queryMap"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/splitquery/withPaginationAndRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/splitquery/withPaginationAndRecord/schema.graphqls deleted file mode 100644 index 1f46b1777a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/services/splitquery/withPaginationAndRecord/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Wrapper { - id: ID - - query(first: Int = 100, after: String, in: CustomerInputTable): CustomerConnection @splitQuery @service(service: {name: "RESOLVER_FETCH_SERVICE", method: "queryMap"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/default/expected/QueryGeneratedDataFetcher.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/default/expected/QueryGeneratedDataFetcher.java deleted file mode 100644 index abe68940a7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/default/expected/QueryGeneratedDataFetcher.java +++ /dev/null @@ -1,15 +0,0 @@ -package fake.code.generated.resolvers.query; - -import fake.code.generated.queries.QueryDBQueries; -import fake.graphql.example.model.DummyType; -import graphql.schema.DataFetcher; -import java.util.concurrent.CompletableFuture; -import no.sikt.graphql.helpers.resolvers.DataFetcherHelper; - -public class QueryGeneratedDataFetcher { - public static DataFetcher<CompletableFuture<DummyType>> query() { - return _iv_env -> { - return new DataFetcherHelper(_iv_env).load((_iv_ctx, _iv_selectionSet) -> QueryDBQueries.queryForQuery(_iv_ctx, _iv_selectionSet)); - }; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/default/schema.graphqls deleted file mode 100644 index a139347b88..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/default/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query: DummyType -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/inputDatatypes/expected/QueryGeneratedDataFetcher.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/inputDatatypes/expected/QueryGeneratedDataFetcher.java deleted file mode 100644 index f8085941d6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/inputDatatypes/expected/QueryGeneratedDataFetcher.java +++ /dev/null @@ -1,50 +0,0 @@ -package fake.code.generated.resolvers.query; - -import fake.code.generated.queries.QueryDBQueries; -import fake.graphql.example.model.DummyEnum; -import fake.graphql.example.model.DummyInput; -import fake.graphql.example.model.DummyType; -import graphql.schema.DataFetcher; -import java.lang.Boolean; -import java.lang.Integer; -import java.lang.String; -import java.util.List; -import java.util.concurrent.CompletableFuture; -import no.sikt.graphql.helpers.resolvers.DataFetcherHelper; -import no.sikt.graphql.helpers.resolvers.ResolverHelpers; - -public class QueryGeneratedDataFetcher { - public static DataFetcher<CompletableFuture<DummyType>> query() { - return _iv_env -> { - String _mi_id = _iv_env.getArgument("id"); - String _mi_str = _iv_env.getArgument("str"); - Boolean _mi_bool = _iv_env.getArgument("bool"); - Integer _mi_i = _iv_env.getArgument("i"); - DummyEnum _mi_e = _iv_env.getArgument("e"); - DummyInput _mi_in = ResolverHelpers.transformDTO(_iv_env.getArgument("in"), DummyInput.class); - List<String> _mi_idList = _iv_env.getArgument("idList"); - List<DummyInput> _mi_inList = ResolverHelpers.transformDTOList(_iv_env.getArgument("inList"), DummyInput.class); - - return new DataFetcherHelper(_iv_env).load( - (_iv_ctx, _iv_selectionSet) -> QueryDBQueries.queryForQuery(_iv_ctx, _mi_id, _mi_str, _mi_bool, _mi_i, _mi_e, _mi_in, _mi_idList, _mi_inList, _iv_selectionSet) - ); - }; - } - - public static DataFetcher<CompletableFuture<DummyType>> queryNonNullable() { - return _iv_env -> { - String _mi_id = _iv_env.getArgument("id"); - String _mi_str = _iv_env.getArgument("str"); - Boolean _mi_bool = _iv_env.getArgument("bool"); - Integer _mi_i = _iv_env.getArgument("i"); - DummyEnum _mi_e = _iv_env.getArgument("e"); - DummyInput _mi_in = ResolverHelpers.transformDTO(_iv_env.getArgument("in"), DummyInput.class); - List<String> _mi_idList = _iv_env.getArgument("idList"); - List<DummyInput> _mi_inList = ResolverHelpers.transformDTOList(_iv_env.getArgument("inList"), DummyInput.class); - - return new DataFetcherHelper(_iv_env).load( - (_iv_ctx, _iv_selectionSet) -> QueryDBQueries.queryNonNullableForQuery(_iv_ctx, _mi_id, _mi_str, _mi_bool, _mi_i, _mi_e, _mi_in, _mi_idList, _mi_inList, _iv_selectionSet) - ); - }; - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/inputDatatypes/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/inputDatatypes/schema.graphqls deleted file mode 100644 index b49cef207e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/inputDatatypes/schema.graphqls +++ /dev/null @@ -1,25 +0,0 @@ -type Query { - query( - id: ID - str: String - bool: Boolean - i: Int - e: DummyEnum - in: DummyInput - # date: Date # Can not handle this yet, need to make a better type mapping for fields. - idList: [ID] - inList: [DummyInput] - ): DummyType - - queryNonNullable( - id: ID! - str: String! - bool: Boolean! - i: Int! - e: DummyEnum! - in: DummyInput! - # date: Date! - idList: [ID!]! - inList: [DummyInput!]! - ): DummyType -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/inputJOOQRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/inputJOOQRecord/schema.graphqls deleted file mode 100644 index 78987838ab..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/inputJOOQRecord/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(in: CustomerInputTable): DummyType -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/inputJavaRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/inputJavaRecord/schema.graphqls deleted file mode 100644 index 2bbc61d86c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/inputJavaRecord/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(in: DummyInputRecord): DummyType -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/listedInputJOOQRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/listedInputJOOQRecord/schema.graphqls deleted file mode 100644 index f637c6b09c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/listedInputJOOQRecord/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(in: [CustomerInputTable]): [DummyType] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/listedInputJavaRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/listedInputJavaRecord/schema.graphqls deleted file mode 100644 index 28043c851f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/listedInputJavaRecord/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(in: [DummyInputRecord]): [DummyType] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/multitableInterface/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/multitableInterface/schema.graphqls deleted file mode 100644 index 270f6541d7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/multitableInterface/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - titled: [Titled] -} - -type Film implements Titled @table { - id: ID! - title: String! -} - -interface Titled { - title: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/nestedInputRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/nestedInputRecord/schema.graphqls deleted file mode 100644 index f70d4ca52e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/nestedInputRecord/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in0: Wrapper): DummyType -} - -input Wrapper @table(name: "CUSTOMER") { - in1: CustomerInputTable # The inputs need different names to avoid a variable name conflict. -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/notGenerated/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/notGenerated/schema.graphqls deleted file mode 100644 index 7481bc0372..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/notGenerated/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query: DummyType @notGenerated -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/returningList/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/returningList/schema.graphqls deleted file mode 100644 index 8de412ab54..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/returningList/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query: [DummyType!]! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/returningOptionalList/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/returningOptionalList/schema.graphqls deleted file mode 100644 index c21bb02c89..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/returningOptionalList/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query: [DummyType] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/singleTableInterface/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/singleTableInterface/schema.graphqls deleted file mode 100644 index 1e349fe7d8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/singleTableInterface/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - address: [Address] -} - -interface Address @table(name: "ADDRESS") @discriminate(on: "DISTRICT"){ - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressInDistrictOne implements Address @table(name: "ADDRESS") @discriminator(value: "ONE") { - postalCode: String @field(name: "POSTAL_CODE") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/withArgumentContextCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/withArgumentContextCondition/schema.graphqls deleted file mode 100644 index 864ffb1eca..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/withArgumentContextCondition/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(email: String @condition(condition: {name: "CONTEXT_CONDITION"}, contextArguments: "ctxField")): String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/withContextCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/withContextCondition/schema.graphqls deleted file mode 100644 index 2b125a9868..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/withContextCondition/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query: String @condition(condition: {name: "CONTEXT_CONDITION"}, contextArguments: "ctxField") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/withDuplicateContextField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/withDuplicateContextField/schema.graphqls deleted file mode 100644 index c9794da872..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/withDuplicateContextField/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Query { - query( - email: String @condition(condition: {name: "CONTEXT_CONDITION"}, contextArguments: "ctxField") - ): String @condition(condition: {name: "CONTEXT_CONDITION"}, contextArguments: "ctxField") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/withInputTypeContextCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/withInputTypeContextCondition/schema.graphqls deleted file mode 100644 index e1467b681a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/withInputTypeContextCondition/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: In): String -} - -input In { - email: String @condition(condition: {name: "CONTEXT_CONDITION"}, contextArguments: "ctxField") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/withMultipleContextConditions/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/withMultipleContextConditions/schema.graphqls deleted file mode 100644 index 17d73202f2..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/withMultipleContextConditions/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Query { - query( - email: String @condition(condition: {name: "CONTEXT_CONDITION"}, contextArguments: "ctxField1") - ): String @condition(condition: {name: "CONTEXT_CONDITION"}, contextArguments: "ctxField2") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/wrongCapitalisationJOOQRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/wrongCapitalisationJOOQRecord/schema.graphqls deleted file mode 100644 index 5d1f0b237d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/wrongCapitalisationJOOQRecord/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(IN: CustomerInputTable): DummyType -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/wrongCapitalisationJavaRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/wrongCapitalisationJavaRecord/schema.graphqls deleted file mode 100644 index e30fa1004d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/wrongCapitalisationJavaRecord/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(IN: DummyInputRecord): DummyType -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/wrongInputCapitalisation/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/wrongInputCapitalisation/schema.graphqls deleted file mode 100644 index 1f4ea0ae76..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/wrongInputCapitalisation/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(IN: String): DummyType -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/wrongInputTypeCapitalisation/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/wrongInputTypeCapitalisation/schema.graphqls deleted file mode 100644 index 42455b3cd8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/operation/wrongInputTypeCapitalisation/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(IN: DummyInput): DummyType -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/default/expected/WrapperGeneratedDataFetcher.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/default/expected/WrapperGeneratedDataFetcher.java deleted file mode 100644 index 4eceb39d6c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/default/expected/WrapperGeneratedDataFetcher.java +++ /dev/null @@ -1,17 +0,0 @@ -package fake.code.generated.resolvers.query; - -import fake.code.generated.queries.WrapperDBQueries; -import fake.graphql.example.model.DummyType; -import fake.graphql.example.model.Wrapper; -import graphql.schema.DataFetcher; -import java.util.concurrent.CompletableFuture; -import no.sikt.graphql.helpers.resolvers.DataFetcherHelper; - -public class WrapperGeneratedDataFetcher { - public static DataFetcher<CompletableFuture<DummyType>> query() { - return _iv_env -> { - Wrapper _os_wrapper = _iv_env.getSource(); - return new DataFetcherHelper(_iv_env).load(_os_wrapper.getQueryKey(), (_iv_ctx, _iv_keys, _iv_selectionSet) -> WrapperDBQueries.queryForWrapper(_iv_ctx, _iv_keys, _iv_selectionSet)); - }; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/default/schema.graphqls deleted file mode 100644 index d6f0f8aa7b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/default/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Wrapper { - id: ID # TODO: This should not be required. - - query: DummyType @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/fromTypeWithoutTable/expected/WrapperGeneratedDataFetcher.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/fromTypeWithoutTable/expected/WrapperGeneratedDataFetcher.java deleted file mode 100644 index ffbd65ac83..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/fromTypeWithoutTable/expected/WrapperGeneratedDataFetcher.java +++ /dev/null @@ -1,17 +0,0 @@ -package fake.code.generated.resolvers.query; - -import fake.code.generated.queries.WrapperDBQueries; -import fake.graphql.example.model.CustomerTable; -import fake.graphql.example.model.Wrapper; -import graphql.schema.DataFetcher; -import java.util.concurrent.CompletableFuture; -import no.sikt.graphql.helpers.resolvers.DataFetcherHelper; - -public class WrapperGeneratedDataFetcher { - public static DataFetcher<CompletableFuture<CustomerTable>> customer() { - return _iv_env -> { - Wrapper _os_wrapper = _iv_env.getSource(); - return new DataFetcherHelper(_iv_env).load(_os_wrapper.getCustomerKey(), (_iv_ctx, _iv_keys, _iv_selectionSet) -> WrapperDBQueries.customerForWrapper(_iv_ctx, _iv_keys, _iv_selectionSet)); - }; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/fromTypeWithoutTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/fromTypeWithoutTable/schema.graphqls deleted file mode 100644 index 7765452fc6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/fromTypeWithoutTable/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Address @table { - wrapper: Wrapper -} - -type Wrapper { - id: ID - - customer: CustomerTable @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/inputDatatypes/expected/WrapperGeneratedDataFetcher.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/inputDatatypes/expected/WrapperGeneratedDataFetcher.java deleted file mode 100644 index f259b14e30..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/inputDatatypes/expected/WrapperGeneratedDataFetcher.java +++ /dev/null @@ -1,55 +0,0 @@ -package fake.code.generated.resolvers.query; - -import fake.code.generated.queries.WrapperDBQueries; -import fake.graphql.example.model.DummyEnum; -import fake.graphql.example.model.DummyInput; -import fake.graphql.example.model.DummyType; -import fake.graphql.example.model.Wrapper; -import graphql.schema.DataFetcher; -import java.lang.Boolean; -import java.lang.Integer; -import java.lang.String; -import java.util.List; -import java.util.concurrent.CompletableFuture; -import no.sikt.graphql.helpers.resolvers.DataFetcherHelper; -import no.sikt.graphql.helpers.resolvers.ResolverHelpers; - -public class WrapperGeneratedDataFetcher { - public static DataFetcher<CompletableFuture<DummyType>> query() { - return _iv_env -> { - Wrapper _os_wrapper = _iv_env.getSource(); - String _mi_id = _iv_env.getArgument("id"); - String _mi_str = _iv_env.getArgument("str"); - Boolean _mi_bool = _iv_env.getArgument("bool"); - Integer _mi_i = _iv_env.getArgument("i"); - DummyEnum _mi_e = _iv_env.getArgument("e"); - DummyInput _mi_in = ResolverHelpers.transformDTO(_iv_env.getArgument("in"), DummyInput.class); - List<String> _mi_idList = _iv_env.getArgument("idList"); - List<DummyInput> _mi_inList = ResolverHelpers.transformDTOList(_iv_env.getArgument("inList"), DummyInput.class); - - return new DataFetcherHelper(_iv_env).load( - _os_wrapper.getQueryKey(), - (_iv_ctx, _iv_keys, _iv_selectionSet) -> WrapperDBQueries.queryForWrapper(_iv_ctx, _iv_keys, _mi_id, _mi_str, _mi_bool, _mi_i, _mi_e, _mi_in, _mi_idList, _mi_inList, _iv_selectionSet) - ); - }; - } - - public static DataFetcher<CompletableFuture<DummyType>> queryNonNullable() { - return _iv_env -> { - Wrapper _os_wrapper = _iv_env.getSource(); - String _mi_id = _iv_env.getArgument("id"); - String _mi_str = _iv_env.getArgument("str"); - Boolean _mi_bool = _iv_env.getArgument("bool"); - Integer _mi_i = _iv_env.getArgument("i"); - DummyEnum _mi_e = _iv_env.getArgument("e"); - DummyInput _mi_in = ResolverHelpers.transformDTO(_iv_env.getArgument("in"), DummyInput.class); - List<String> _mi_idList = _iv_env.getArgument("idList"); - List<DummyInput> _mi_inList = ResolverHelpers.transformDTOList(_iv_env.getArgument("inList"), DummyInput.class); - - return new DataFetcherHelper(_iv_env).load( - _os_wrapper.getQueryNonNullableKey(), - (_iv_ctx, _iv_keys, _iv_selectionSet) -> WrapperDBQueries.queryNonNullableForWrapper(_iv_ctx, _iv_keys, _mi_id, _mi_str, _mi_bool, _mi_i, _mi_e, _mi_in, _mi_idList, _mi_inList, _iv_selectionSet) - ); - }; - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/inputDatatypes/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/inputDatatypes/schema.graphqls deleted file mode 100644 index 0d53131eda..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/inputDatatypes/schema.graphqls +++ /dev/null @@ -1,27 +0,0 @@ -type Wrapper { - id: ID - - query( - id: ID - str: String - bool: Boolean - i: Int - e: DummyEnum - in: DummyInput - # date: Date # Can not handle this yet, need to make a better type mapping for fields. - idList: [ID] - inList: [DummyInput] - ): DummyType @splitQuery - - queryNonNullable( - id: ID! - str: String! - bool: Boolean! - i: Int! - e: DummyEnum! - in: DummyInput! - # date: Date! - idList: [ID!]! - inList: [DummyInput!]! - ): DummyType @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/inputJOOQRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/inputJOOQRecord/schema.graphqls deleted file mode 100644 index b1ddaf05d7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/inputJOOQRecord/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Wrapper { - id: ID - - query(in: CustomerInputTable): DummyType @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/inputJavaRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/inputJavaRecord/schema.graphqls deleted file mode 100644 index fef2dd5f23..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/inputJavaRecord/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Wrapper { - id: ID - - query(in: DummyInputRecord): DummyType @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/listedSplitQueryFromJavaRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/listedSplitQueryFromJavaRecord/schema.graphqls deleted file mode 100644 index 3dd44f8002..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/listedSplitQueryFromJavaRecord/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type MyJavaRecord @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - address: [Address] @splitQuery -} - -type Address @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/notGenerated/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/notGenerated/schema.graphqls deleted file mode 100644 index 2baf0d9681..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/notGenerated/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Wrapper { - id: ID - - query: DummyType @splitQuery @notGenerated -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/returningList/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/returningList/schema.graphqls deleted file mode 100644 index bbe5eb7bf0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/returningList/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Wrapper { - id: ID # TODO: This should not be required. - - query: [DummyType!]! @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/returningOptionalList/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/returningOptionalList/schema.graphqls deleted file mode 100644 index a9df95e916..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/returningOptionalList/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Wrapper { - id: ID # TODO: This should not be required. - - query: [DummyType] @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/splitQueryFromJavaRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/splitQueryFromJavaRecord/schema.graphqls deleted file mode 100644 index e98c1655dd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/standard/splitquery/splitQueryFromJavaRecord/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type MyJavaRecord @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - address: Address @splitQuery -} - -type Address @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/strategynode/connection/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/strategynode/connection/schema.graphqls deleted file mode 100644 index 95dd142e22..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/strategynode/connection/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(first: Int = 100, after: String): CustomerConnection -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/strategynode/doubleInterface/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/strategynode/doubleInterface/schema.graphqls deleted file mode 100644 index 41b5984a0d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/strategynode/doubleInterface/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - node(id: ID!): Node # Node interface - titled: Titled - - film: Film @notGenerated -} - -type Film implements Titled & Node @table @node { - id: ID! - title: String! -} - -interface Titled { - title: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/strategynode/entity/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/strategynode/entity/schema.graphqls deleted file mode 100644 index 4ef434a2b4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/strategynode/entity/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -union _Entity = Customer - -type Customer implements Node @node @table @key(fields: "id") { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/strategynode/manyImplementations/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/strategynode/manyImplementations/schema.graphqls deleted file mode 100644 index 40cf264038..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/strategynode/manyImplementations/schema.graphqls +++ /dev/null @@ -1,19 +0,0 @@ -type Query { - node(id: ID!): Node # Node interface - - customer: Customer @notGenerated - film: Film @notGenerated - address: Address @notGenerated -} - -type Customer implements Node @node @table { - id: ID! -} - -type Film implements Node @node @table { - id: ID! -} - -type Address implements Node @node @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/strategynode/noImplementations/expected/QueryGeneratedDataFetcher.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/strategynode/noImplementations/expected/QueryGeneratedDataFetcher.java deleted file mode 100644 index af0cf8911c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/strategynode/noImplementations/expected/QueryGeneratedDataFetcher.java +++ /dev/null @@ -1,29 +0,0 @@ - -package fake.code.generated.resolvers.query; - -import fake.graphql.example.model.Node; -import graphql.schema.DataFetcher; -import java.lang.IllegalArgumentException; -import java.lang.String; -import java.util.concurrent.CompletableFuture; - -import no.sikt.graphql.NodeIdStrategy; -import no.sikt.graphql.helpers.resolvers.DataFetcherHelper; - -public class QueryGeneratedDataFetcher { - public static DataFetcher<CompletableFuture<Node>> node(NodeIdStrategy _iv_nodeIdStrategy) { - return _iv_env -> { - String _mi_id = _iv_env.getArgument("id"); - var _iv_typeId = null; - if (_iv_typeId == null) { - throw new IllegalArgumentException("Could not resolve input id with value " + _mi_id + " within type " + _iv_typeId); - } - var _iv_loaderName = _iv_typeId + "_node"; - var _iv_fetcher = new DataFetcherHelper(_iv_env); - - switch (_iv_typeId) { - default: throw new IllegalArgumentException("Could not resolve input id with value " + _mi_id + " within type " + _iv_typeId); - } - }; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/strategynode/noImplementations/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/strategynode/noImplementations/schema.graphqls deleted file mode 100644 index 21fb856c57..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/strategynode/noImplementations/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - node(id: ID!): Node # Node interface -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/strategynode/oneImplementation/expected/QueryGeneratedDataFetcher.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/strategynode/oneImplementation/expected/QueryGeneratedDataFetcher.java deleted file mode 100644 index 067a26d674..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/strategynode/oneImplementation/expected/QueryGeneratedDataFetcher.java +++ /dev/null @@ -1,31 +0,0 @@ - -package fake.code.generated.resolvers.query; - -import fake.code.generated.queries.CustomerDBQueries; -import fake.graphql.example.model.Node; -import graphql.schema.DataFetcher; -import java.lang.IllegalArgumentException; -import java.lang.String; -import java.util.concurrent.CompletableFuture; -import no.sikt.graphql.NodeIdStrategy; -import no.sikt.graphql.helpers.resolvers.DataFetcherHelper; - -public class QueryGeneratedDataFetcher { - - public static DataFetcher<CompletableFuture<Node>> node(NodeIdStrategy _iv_nodeIdStrategy) { - return _iv_env -> { - String _mi_id = _iv_env.getArgument("id"); - var _iv_typeId = _iv_nodeIdStrategy.getTypeId(_mi_id); - if (_iv_typeId == null) { - throw new IllegalArgumentException("Could not resolve input id with value " + _mi_id + " within type " + _iv_typeId); - } - var _iv_loaderName = _iv_typeId + "_node"; - var _iv_fetcher = new DataFetcherHelper(_iv_env); - - switch (_iv_typeId) { - case "Customer": return _iv_fetcher.loadInterface(_iv_loaderName, _mi_id, (_iv_ctx, _iv_ids, _iv_selectionSet) -> CustomerDBQueries.customerForNode(_iv_ctx, _iv_nodeIdStrategy, _iv_ids, _iv_selectionSet)); - default: throw new IllegalArgumentException("Could not resolve input id with value " + _mi_id + " within type " + _iv_typeId); - } - }; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/strategynode/oneImplementation/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/strategynode/oneImplementation/schema.graphqls deleted file mode 100644 index 6bd7b0f86d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/strategynode/oneImplementation/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Query { - node(id: ID!): Node # Node interface - - query: Customer @notGenerated -} - -type Customer implements Node @node @table{ - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/strategynode/withCustomTypeId/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/strategynode/withCustomTypeId/schema.graphqls deleted file mode 100644 index 8be5db8531..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/strategynode/withCustomTypeId/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Query { - node(id: ID!): Node # Node interface - - query: Customer @notGenerated -} - -type Customer implements Node @table @node(typeId: "CustomerType"){ - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/strategynode/withoutPathFromQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/strategynode/withoutPathFromQuery/schema.graphqls deleted file mode 100644 index 9af462716d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/fetch/strategynode/withoutPathFromQuery/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - node(id: ID!): Node # Node interface -} - -type Customer implements Node @table @node { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/type/entity/expected/EntityTypeResolver.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/type/entity/expected/EntityTypeResolver.java deleted file mode 100644 index f1a7222577..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/type/entity/expected/EntityTypeResolver.java +++ /dev/null @@ -1,20 +0,0 @@ -package fake.code.generated.queries.query; - -import fake.graphql.example.model.Customer; -import graphql.schema.TypeResolver; -import java.lang.IllegalArgumentException; -import java.lang.Object; -import java.lang.String; - -public class EntityTypeResolver { - public static TypeResolver entityTypeResolver() { - return _iv_env -> _iv_env.getSchema().getObjectType(getName(_iv_env.getObject())); - } - - public static String getName(Object _iv_obj) { - if (_iv_obj instanceof Customer) { - return "Customer"; - } - throw new IllegalArgumentException("Type of " + _iv_obj + " can not be resolved."); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/type/entity/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/type/entity/schema.graphqls deleted file mode 100644 index f294b842b9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/type/entity/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -union _Entity = Customer - -type Customer @table @key(fields: "id") { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/type/interface/expected/ITypeResolver.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/type/interface/expected/ITypeResolver.java deleted file mode 100644 index b85c55bfe7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/type/interface/expected/ITypeResolver.java +++ /dev/null @@ -1,20 +0,0 @@ -package fake.code.generated.queries.query; - -import fake.graphql.example.model.A; -import graphql.schema.TypeResolver; -import java.lang.IllegalArgumentException; -import java.lang.Object; -import java.lang.String; - -public class ITypeResolver { - public static TypeResolver iTypeResolver() { - return _iv_env -> _iv_env.getSchema().getObjectType(getName(_iv_env.getObject())); - } - - public static String getName(Object _iv_obj) { - if (_iv_obj instanceof A) { - return "A"; - } - throw new IllegalArgumentException("Type of " + _iv_obj + " can not be resolved."); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/type/interface/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/type/interface/schema.graphqls deleted file mode 100644 index aae5537010..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/type/interface/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -interface I { - string: String -} - -type A implements I { - string: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/type/interfaceDouble/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/type/interfaceDouble/schema.graphqls deleted file mode 100644 index 8d0c3142d3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/type/interfaceDouble/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -interface I { - string: String -} - -type A implements I { - string: String -} - -type B implements I { - string: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/type/interfaceNoImplementations/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/type/interfaceNoImplementations/schema.graphqls deleted file mode 100644 index 105a611239..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/type/interfaceNoImplementations/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -interface I { - string: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/type/union/expected/UTypeResolver.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/type/union/expected/UTypeResolver.java deleted file mode 100644 index cbc9495a5e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/type/union/expected/UTypeResolver.java +++ /dev/null @@ -1,20 +0,0 @@ -package fake.code.generated.queries.query; - -import fake.graphql.example.model.A; -import graphql.schema.TypeResolver; -import java.lang.IllegalArgumentException; -import java.lang.Object; -import java.lang.String; - -public class UTypeResolver { - public static TypeResolver uTypeResolver() { - return _iv_env -> _iv_env.getSchema().getObjectType(getName(_iv_env.getObject())); - } - - public static String getName(Object _iv_obj) { - if (_iv_obj instanceof A) { - return "A"; - } - throw new IllegalArgumentException("Type of " + _iv_obj + " can not be resolved."); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/type/union/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/type/union/schema.graphqls deleted file mode 100644 index 8c19dac5ef..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/type/union/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -union U = A - -type A { - string: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/type/unionDouble/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/type/unionDouble/schema.graphqls deleted file mode 100644 index 527751a1fe..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/datafetchers/type/unionDouble/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -union U = A | B - -type A { - string: String -} - -type B { - string: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/interface/default/expected/SomeInterface.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/interface/default/expected/SomeInterface.java deleted file mode 100644 index 62a1fe1645..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/interface/default/expected/SomeInterface.java +++ /dev/null @@ -1,7 +0,0 @@ -package no.sikt.graphitron.example.generated.graphitron.model; - -import java.lang.String; - -public interface SomeInterface { - String getId(); -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/interface/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/interface/default/schema.graphqls deleted file mode 100644 index 867170dd18..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/interface/default/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -interface SomeInterface { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/interface/singleTable/expected/Address.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/interface/singleTable/expected/Address.java deleted file mode 100644 index 94e5131b05..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/interface/singleTable/expected/Address.java +++ /dev/null @@ -1,7 +0,0 @@ -package no.sikt.graphitron.example.generated.graphitron.model; - -import java.lang.String; - -public interface Address { - String getPostalCode(); -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/interface/singleTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/interface/singleTable/schema.graphqls deleted file mode 100644 index 38f5a05091..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/interface/singleTable/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -interface Address @table(name: "ADDRESS") @discriminate(on: "DISTRICT"){ - postalCode: String @field(name: "POSTAL_CODE") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/interface/withNotGeneratedField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/interface/withNotGeneratedField/schema.graphqls deleted file mode 100644 index 2997e1654d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/interface/withNotGeneratedField/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -interface SomeInterface { - id: ID -} - -type SomeType implements SomeInterface { - id: ID @notGenerated -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/conditionPath/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/conditionPath/schema.graphqls deleted file mode 100644 index 581fcd07a4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/conditionPath/schema.graphqls +++ /dev/null @@ -1,6 +0,0 @@ -type Query { - vacation: VacationDestination @notGenerated -} -type VacationDestination @table(name: "VACATION_DESTINATION") { - someStrings: [String] @splitQuery @reference(path: [{condition: {name: "DUMMY_CONDITION"}}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/conditionPathFromInterfaceWithTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/conditionPathFromInterfaceWithTable/schema.graphqls deleted file mode 100644 index 0aa9695277..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/conditionPathFromInterfaceWithTable/schema.graphqls +++ /dev/null @@ -1,4 +0,0 @@ -interface SomeInterface @table(name: "VACATION_DESTINATION") @discriminate(on: "COUNTRY_NAME"){ - id: ID - someString: String @splitQuery @reference(path: [{condition: {name: "DUMMY_CONDITION"}}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/conditionWithImplicitKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/conditionWithImplicitKey/schema.graphqls deleted file mode 100644 index 816ee8efbf..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/conditionWithImplicitKey/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Vacation @table(name: "VACATION") { - someString: String -} - -type VacationDestination @table(name: "VACATION_DESTINATION") { - vacations: Vacation @splitQuery @reference(path: [{condition: {name: "DUMMY_CONDITION"}, table: "VACATION"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/conditionWithoutImplicitKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/conditionWithoutImplicitKey/schema.graphqls deleted file mode 100644 index 877fbd3732..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/conditionWithoutImplicitKey/schema.graphqls +++ /dev/null @@ -1,6 +0,0 @@ -type Query { - vacationDestination: VacationDestination @notGenerated -} -type VacationDestination @table(name: "VACATION_DESTINATION") { - customers: [CustomerTable] @splitQuery @reference(path: [{condition: {name: "DUMMY_CONDITION"}, table: "CUSTOMER"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/connectionReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/connectionReference/schema.graphqls deleted file mode 100644 index 42e32efaf9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/connectionReference/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Store @table { - customers(first: Int = 100, after: String): CustomerConnection @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/interfaceWithTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/interfaceWithTable/schema.graphqls deleted file mode 100644 index bb98e42354..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/interfaceWithTable/schema.graphqls +++ /dev/null @@ -1,4 +0,0 @@ -interface SomeInterface @table(name: "VACATION_DESTINATION") @discriminate(on: "COUNTRY_NAME"){ - id: ID - someString: String @splitQuery @reference(path: [{table: "VACATION"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/listedKeyInJavaRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/listedKeyInJavaRecord/schema.graphqls deleted file mode 100644 index 3dd44f8002..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/listedKeyInJavaRecord/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type MyJavaRecord @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - address: [Address] @splitQuery -} - -type Address @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/listedKeyInJavaRecordNestedSplitQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/listedKeyInJavaRecordNestedSplitQuery/schema.graphqls deleted file mode 100644 index 65e06b5479..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/listedKeyInJavaRecordNestedSplitQuery/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type MyJavaRecord @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - payload: Payload -} - -type Payload { - result: Result -} - -type Result { - address: [Address] @splitQuery -} - -type Address @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/listedKeyInJavaRecordSplitQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/listedKeyInJavaRecordSplitQuery/schema.graphqls deleted file mode 100644 index 5e8fa0110f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/listedKeyInJavaRecordSplitQuery/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type MyJavaRecord @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - payload: Payload -} - -type Payload { - address: [Address] @splitQuery -} - -type Address @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/listedReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/listedReference/schema.graphqls deleted file mode 100644 index f0163acf3b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/listedReference/schema.graphqls +++ /dev/null @@ -1,10 +0,0 @@ -type Query { - vacation: Vacation @notGenerated -} -type Vacation @table(name: "VACATION") { - destination: [VacationDestination] @splitQuery -} - -type VacationDestination @table(name: "VACATION_DESTINATION") { - someString: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/multiTableInterface/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/multiTableInterface/schema.graphqls deleted file mode 100644 index c95b902d33..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/multiTableInterface/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -interface SomeInterface { - someString: String @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/multiTableUnion/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/multiTableUnion/schema.graphqls deleted file mode 100644 index 7037be8bb0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/multiTableUnion/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Customer @table { - address: Address @splitQuery -} - -type Address @table { - id: ID -} - -union CustomerUnion = Customer \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/multipleFieldsWithSameKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/multipleFieldsWithSameKey/schema.graphqls deleted file mode 100644 index 87c68b1133..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/multipleFieldsWithSameKey/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Inventory @table { - store1: Store @splitQuery @reference(path: [{key: "INVENTORY__INVENTORY_STORE_ID_FKEY"}]) - store2: Store @splitQuery @reference -} - -type Store @table { - id: ID -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/multipleKeysInJavaRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/multipleKeysInJavaRecord/schema.graphqls deleted file mode 100644 index e43e888dbc..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/multipleKeysInJavaRecord/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type MyJavaRecord @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - address: Address @splitQuery - city: City @splitQuery -} - -type Address @table { - id: ID -} - -type City @table { - id: ID -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/reference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/reference/schema.graphqls deleted file mode 100644 index c91c5198d6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/reference/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Vacation @table(name: "VACATION") { - someString: String -} - -type VacationDestination @table(name: "VACATION_DESTINATION") { - vacation: Vacation @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/referenceInSubtype/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/referenceInSubtype/schema.graphqls deleted file mode 100644 index ac900dc662..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/referenceInSubtype/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - query: CustomerTable -} - -type CustomerTable @table(name: "CUSTOMER") { - someType: SomeType -} - -type SomeType { - address: Address @splitQuery -} - -type Address @table { - id: ID -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/referenceViaTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/referenceViaTable/schema.graphqls deleted file mode 100644 index b0a1935eba..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/referenceViaTable/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Inventory @table { - staffForInventory: Staff @splitQuery @reference(path: [{key: "INVENTORY__INVENTORY_STORE_ID_FKEY"}, {table: "STAFF"}]) -} - -type Staff @table { - id: ID -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/referencingMultitableInterface/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/referencingMultitableInterface/schema.graphqls deleted file mode 100644 index a1901b393a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/referencingMultitableInterface/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type FilmCategory @table(name: "FILM_CATEGORY") { - titledFilms: [Titled] @splitQuery -} - -type Film implements Titled @table { - id: ID! - title: String! -} - -interface Titled { - title: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/referencingMultitableInterfaceConnection/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/referencingMultitableInterfaceConnection/schema.graphqls deleted file mode 100644 index 1a81e5b8c8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/referencingMultitableInterfaceConnection/schema.graphqls +++ /dev/null @@ -1,23 +0,0 @@ -type FilmCategory @table(name: "FILM_CATEGORY") { - titledFilms(first: Int = 100, after: String): TitledConnection -} - -type Film implements Titled @table { - id: ID! - title: String! -} - -interface Titled { - title: String! -} - -type TitledConnection { - edges: [TitledConnectionEdge] - pageInfo: PageInfo - nodes: [Titled!]! -} - -type TitledConnectionEdge { - cursor: String - node: Titled -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/referencingMultitableUnion/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/referencingMultitableUnion/schema.graphqls deleted file mode 100644 index e6ec1f6261..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/referencingMultitableUnion/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type FilmCategory @table(name: "FILM_CATEGORY") { - films: [FilmUnion] @splitQuery -} - -union FilmUnion = Film - -type Film @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/referencingMultitableUnionConnection/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/referencingMultitableUnionConnection/schema.graphqls deleted file mode 100644 index bd9ee6065e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/referencingMultitableUnionConnection/schema.graphqls +++ /dev/null @@ -1,21 +0,0 @@ -type FilmCategory @table(name: "FILM_CATEGORY") { - films(first: Int = 100, after: String): FilmUnionConnection -} - -union FilmUnion = Film - -type Film @table { - id: ID! -} - - -type FilmUnionConnection { - edges: [FilmUnionConnectionEdge] - pageInfo: PageInfo - nodes: [FilmUnion!]! -} - -type FilmUnionConnectionEdge { - cursor: String - node: FilmUnion -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/referencingSingleTableInterface/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/referencingSingleTableInterface/schema.graphqls deleted file mode 100644 index 1c79cc0436..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/referencingSingleTableInterface/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - city: City @notGenerated -} - -type City @table { - addresses: [AddressByDistrict] @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/referencingSingleTableInterfaceConnection/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/referencingSingleTableInterfaceConnection/schema.graphqls deleted file mode 100644 index ea064c8c05..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/referencingSingleTableInterfaceConnection/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type City @table { - addresses(first: Int = 100, after: String): AddressByDistrictConnection -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/reverseReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/reverseReference/schema.graphqls deleted file mode 100644 index 8e1724f3dd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/reverseReference/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Vacation @table(name: "VACATION") { - destination: VacationDestination @splitQuery -} - -type VacationDestination @table(name: "VACATION_DESTINATION") { - someString: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/scalarReference/expected/VacationDestination.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/scalarReference/expected/VacationDestination.java deleted file mode 100644 index c4ab68dc50..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/scalarReference/expected/VacationDestination.java +++ /dev/null @@ -1,49 +0,0 @@ -package no.sikt.graphitron.example.generated.graphitron.model; - -import java.lang.Object; -import java.lang.Override; -import java.util.Objects; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.VacationRecord; - -public class VacationDestination { - private VacationRecord vacation_destination_vacation_fkey; - - private VacationRecord vacationDescriptionKey; - - public VacationDestination() { - } - - public VacationDestination(VacationRecord vacation_destination_vacation_fkey) { - this.vacation_destination_vacation_fkey = vacation_destination_vacation_fkey; - this.vacationDescriptionKey = vacation_destination_vacation_fkey; - } - - public VacationRecord getVacation_destination_vacation_fkey() { - return vacation_destination_vacation_fkey; - } - - public VacationRecord getVacationDescriptionKey() { - return vacationDescriptionKey; - } - - public void setVacationDescriptionKey(VacationRecord vacationDescriptionKey) { - this.vacationDescriptionKey = vacationDescriptionKey; - } - - @Override - public int hashCode() { - return Objects.hash(vacation_destination_vacation_fkey, vacationDescriptionKey); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null || getClass() != obj.getClass()) { - return false; - } - final VacationDestination that = (VacationDestination) obj; - return Objects.equals(vacation_destination_vacation_fkey, that.vacation_destination_vacation_fkey) && Objects.equals(vacationDescriptionKey, that.vacationDescriptionKey); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/scalarReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/scalarReference/schema.graphqls deleted file mode 100644 index 4f4a1c5429..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/scalarReference/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type VacationDestination @table(name: "VACATION_DESTINATION") { - vacationDescription: String @field(name: "DESCRIPTION") @reference(path: [{table: "VACATION"}]) @splitQuery -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/scalarSameTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/scalarSameTable/schema.graphqls deleted file mode 100644 index 8d674697c4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/scalarSameTable/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Vacation @table(name: "VACATION") { - someString: String @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/selfReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/selfReference/schema.graphqls deleted file mode 100644 index 275313a3d8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/selfReference/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Film @table { - sequel: Film @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/subtype/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/subtype/schema.graphqls deleted file mode 100644 index e63ca958fc..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/splitQuery/subtype/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type VacationDestination @table(name: "VACATION_DESTINATION") { - someType: SomeType @splitQuery -} - -type SomeType { - someString: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/arrayTableField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/arrayTableField/schema.graphqls deleted file mode 100644 index 70d0218324..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/arrayTableField/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type CustomerTable @table(name: "CUSTOMER") { - usernames: [String] -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/default/expected/CustomerTable.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/default/expected/CustomerTable.java deleted file mode 100644 index 9d77d3bfae..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/default/expected/CustomerTable.java +++ /dev/null @@ -1,42 +0,0 @@ -package no.sikt.graphitron.example.generated.graphitron.model; - -import java.lang.Object; -import java.lang.String; -import java.util.Objects; -import java.lang.Override; - -public class CustomerTable{ - private String id; - - public CustomerTable() { - } - - public CustomerTable(String id) { - this.id = id; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - @Override - public int hashCode() { - return Objects.hash(id); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null || getClass() != obj.getClass()) { - return false; - } - final CustomerTable that = (CustomerTable) obj; - return Objects.equals(id, that.id); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/dtoField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/dtoField/schema.graphqls deleted file mode 100644 index 0d69ac2e61..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/dtoField/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type CustomerTable @table(name: "CUSTOMER") { - someType: SomeType -} - -type SomeType { - id: ID -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/dtoFieldListed/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/dtoFieldListed/schema.graphqls deleted file mode 100644 index af5cef4682..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/dtoFieldListed/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - customers: CustomerContainerListed -} - -type CustomerContainerListed { - customers: [Customer] -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/extendedScalarField/expected/Customer.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/extendedScalarField/expected/Customer.java deleted file mode 100644 index e57f004923..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/extendedScalarField/expected/Customer.java +++ /dev/null @@ -1,40 +0,0 @@ -import java.lang.Object; -import java.lang.Override; -import java.time.OffsetTime; -import java.util.Objects; - -public class Customer { - private OffsetTime time; - - public Customer() { - } - - public Customer(OffsetTime time) { - this.time = time; - } - - public OffsetTime getTime() { - return time; - } - - public void setTime(OffsetTime time) { - this.time = time; - } - - @Override - public int hashCode() { - return Objects.hash(time); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null || getClass() != obj.getClass()) { - return false; - } - final Customer that = (Customer) obj; - return Objects.equals(time, that.time); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/extendedScalarField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/extendedScalarField/schema.graphqls deleted file mode 100644 index 15fb943855..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/extendedScalarField/schema.graphqls +++ /dev/null @@ -1,4 +0,0 @@ -scalar Time -type Customer { - time: Time -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/isPartOfUnion/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/isPartOfUnion/schema.graphqls deleted file mode 100644 index d281e9a64e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/isPartOfUnion/schema.graphqls +++ /dev/null @@ -1 +0,0 @@ -union SomeUnion = CustomerTable \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/javaRecord/expected/MyJavaRecord.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/javaRecord/expected/MyJavaRecord.java deleted file mode 100644 index e95c07cf96..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/javaRecord/expected/MyJavaRecord.java +++ /dev/null @@ -1,38 +0,0 @@ -package no.sikt.graphitron.example.generated.graphitron.model; - -import java.lang.Object; -import java.lang.Override; -import java.lang.String; -import java.util.Objects; - -public class MyJavaRecord { - private String myString; - - public MyJavaRecord() { - } - - public String getMyString() { - return myString; - } - - public void setMyString(String myString) { - this.myString = myString; - } - - @Override - public int hashCode() { - return Objects.hash(myString); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null || getClass() != obj.getClass()) { - return false; - } - final MyJavaRecord that = (MyJavaRecord) obj; - return Objects.equals(myString, that.myString); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/javaRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/javaRecord/schema.graphqls deleted file mode 100644 index ed25f8fe6f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/javaRecord/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type MyJavaRecord @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - myString: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/multipleFields/expected/CustomerTable.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/multipleFields/expected/CustomerTable.java deleted file mode 100644 index 43518dbbbc..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/multipleFields/expected/CustomerTable.java +++ /dev/null @@ -1,53 +0,0 @@ -package no.sikt.graphitron.example.generated.graphitron.model; - -import java.lang.Object; -import java.lang.String; -import java.util.Objects; -import java.lang.Override; - -public class CustomerTable { - private String id; - - private String string; - - public CustomerTable() { - } - - public CustomerTable(String id, String string) { - this.id = id; - this.string = string; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getString() { - return string; - } - - public void setString(String string) { - this.string = string; - } - - @Override - public int hashCode() { - return Objects.hash(id, string); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null || getClass() != obj.getClass()) { - return false; - } - final CustomerTable that = (CustomerTable) obj; - return Objects.equals(id, that.id) && Objects.equals(string, that.string); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/multipleFields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/multipleFields/schema.graphqls deleted file mode 100644 index 17100a2cd8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/multipleFields/schema.graphqls +++ /dev/null @@ -1,4 +0,0 @@ -type CustomerTable @table(name: "CUSTOMER") { - id: ID - string: String -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/withErrors/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/withErrors/schema.graphqls deleted file mode 100644 index 8dee807cf6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/withErrors/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Customer { - id: ID - errors: [ValidationError] -} - -type ValidationError implements Error { - path: [String] - message: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/withErrorsUnion/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/withErrorsUnion/schema.graphqls deleted file mode 100644 index 9becf067c6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/type/withErrorsUnion/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Customer { - id: ID - errors: [ErrorUnion] -} - -union ErrorUnion = ValidationError - -type ValidationError implements Error { - path: [String] - message: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/union/default/expected/SomeUnion.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/union/default/expected/SomeUnion.java deleted file mode 100644 index 91d6890361..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/union/default/expected/SomeUnion.java +++ /dev/null @@ -1,4 +0,0 @@ -package no.sikt.graphitron.example.generated.graphitron.model; - -public interface SomeUnion { -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/union/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/union/default/schema.graphqls deleted file mode 100644 index d281e9a64e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/dto/union/default/schema.graphqls +++ /dev/null @@ -1 +0,0 @@ -union SomeUnion = CustomerTable \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/enums/tograph/jOOQ/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/enums/tograph/jOOQ/schema.graphqls deleted file mode 100644 index 0b97aaaba7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/enums/tograph/jOOQ/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Dummy @service(service: {name: "DUMMY_SERVICE"}) -} - -type Dummy @record(record: {name: "MAPPER_RECORD_ENUM"}) { - e: DummyEnumConverted! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/enums/tograph/jOOQListed/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/enums/tograph/jOOQListed/schema.graphqls deleted file mode 100644 index 3f777f9a8f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/enums/tograph/jOOQListed/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Dummy @service(service: {name: "DUMMY_SERVICE"}) -} - -type Dummy @record(record: {name: "MAPPER_RECORD_ENUM"}) { - e: [DummyEnumConverted]! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/enums/tograph/string/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/enums/tograph/string/schema.graphqls deleted file mode 100644 index 703b356161..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/enums/tograph/string/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Dummy @service(service: {name: "DUMMY_SERVICE"}) -} - -type Dummy @record(record: {name: "MAPPER_RECORD_ENUM"}) { - e: DummyEnum! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/enums/tograph/stringListed/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/enums/tograph/stringListed/schema.graphqls deleted file mode 100644 index b2a1a03e97..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/enums/tograph/stringListed/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Dummy @service(service: {name: "DUMMY_SERVICE"}) -} - -type Dummy @record(record: {name: "MAPPER_RECORD_ENUM"}) { - e: [DummyEnum]! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/enums/torecord/jOOQ/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/enums/torecord/jOOQ/schema.graphqls deleted file mode 100644 index f98e6279d5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/enums/torecord/jOOQ/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: Dummy): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input Dummy @record(record: {name: "MAPPER_RECORD_ENUM"}) { - e: DummyEnumConverted! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/enums/torecord/jOOQListed/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/enums/torecord/jOOQListed/schema.graphqls deleted file mode 100644 index b211de4b24..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/enums/torecord/jOOQListed/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: Dummy): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input Dummy @record(record: {name: "MAPPER_RECORD_ENUM"}) { - e: [DummyEnumConverted]! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/enums/torecord/string/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/enums/torecord/string/schema.graphqls deleted file mode 100644 index b4dd01e488..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/enums/torecord/string/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: Dummy): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input Dummy @record(record: {name: "MAPPER_RECORD_ENUM"}) { - e: DummyEnum! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/enums/torecord/stringListed/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/enums/torecord/stringListed/schema.graphqls deleted file mode 100644 index 1d89e16441..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/enums/torecord/stringListed/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: Dummy): ID @service(service : {name: "DUMMY_SERVICE"}) -} - -input Dummy @record(record: {name: "MAPPER_RECORD_ENUM"}) { - e: [DummyEnum]! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/databaseHandledError/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/databaseHandledError/schema.graphqls deleted file mode 100644 index ffee69aea6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/databaseHandledError/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Response { - errors: [HandledError] -} - -type HandledError implements Error @error(handlers: [{handler: DATABASE}]) { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/default/expected/GeneratedExceptionStrategyConfiguration.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/default/expected/GeneratedExceptionStrategyConfiguration.java deleted file mode 100644 index 019a6e40cd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/default/expected/GeneratedExceptionStrategyConfiguration.java +++ /dev/null @@ -1,44 +0,0 @@ -package fake.code.generated.resolvers.mutation; - -import fake.graphql.example.model.ValidationError; -import fake.graphql.example.model.Response; -import java.lang.Class; -import java.lang.IllegalArgumentException; -import java.lang.Override; -import java.lang.String; -import java.lang.Throwable; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import no.sikt.graphql.exception.ExceptionStrategyConfiguration; -import no.sikt.graphql.exception.ValidationViolationGraphQLException; - -public class GeneratedExceptionStrategyConfiguration implements ExceptionStrategyConfiguration { - private final Map<Class<? extends Throwable>, Set<String>> fieldsForException; - - private final Map<String, ExceptionStrategyConfiguration.PayloadCreator> payloadForField; - - public GeneratedExceptionStrategyConfiguration() { - fieldsForException = new HashMap<>(); - payloadForField = new HashMap<>(); - fieldsForException.computeIfAbsent(ValidationViolationGraphQLException.class, k -> new HashSet<>()).add("mutation"); - fieldsForException.computeIfAbsent(IllegalArgumentException.class, k -> new HashSet<>()).add("mutation"); - payloadForField.put("mutation", errors -> { - var payload = new Response(); - payload.setErrors((List<ValidationError>) errors); - return payload; - }); - } - - @Override - public Map<Class<? extends Throwable>, Set<String>> getFieldsForException() { - return fieldsForException; - } - - @Override - public Map<String, ExceptionStrategyConfiguration.PayloadCreator> getPayloadForField() { - return payloadForField; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/default/schema.graphqls deleted file mode 100644 index 52d47d72f9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/default/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Response { - errors: [ValidationError] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/handledError/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/handledError/schema.graphqls deleted file mode 100644 index 4a1858de6e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/handledError/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Response { - errors: [HandledError] -} - -type HandledError implements Error @error(handlers: [{handler: GENERIC, className: "java.lang.UnsupportedOperationException"}]) { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/invalidClassName/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/invalidClassName/schema.graphqls deleted file mode 100644 index 3cd1c158ba..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/invalidClassName/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Response { - errors: [OtherError] -} - -type OtherError implements Error @error(handlers: [{handler: GENERIC, className: "INVALID"}]) { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/multipleErrorsInMutation/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/multipleErrorsInMutation/schema.graphqls deleted file mode 100644 index dba0888a88..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/multipleErrorsInMutation/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Response { - errors0: [ValidationError] - errors1: [UnrelatedError] -} - -type UnrelatedError implements Error { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/multipleErrorsInMutationWithUnion/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/multipleErrorsInMutationWithUnion/schema.graphqls deleted file mode 100644 index da637c0ae9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/multipleErrorsInMutationWithUnion/schema.graphqls +++ /dev/null @@ -1,6 +0,0 @@ -type Response { - errors0: [ValidationError] - errors1: [ValidationUnion] -} - -union ValidationUnion = ValidationError diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/noErrors/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/noErrors/schema.graphqls deleted file mode 100644 index 44b6b39217..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/noErrors/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation: ID @mutation(typeName: UPDATE) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/query/expected/GeneratedExceptionStrategyConfiguration.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/query/expected/GeneratedExceptionStrategyConfiguration.java deleted file mode 100644 index 944361c326..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/query/expected/GeneratedExceptionStrategyConfiguration.java +++ /dev/null @@ -1,45 +0,0 @@ -package fake.code.generated.resolvers.mutation; - -import fake.graphql.example.model.ValidationError; -import fake.graphql.example.model.Response; -import java.lang.Class; -import java.lang.IllegalArgumentException; -import java.lang.Override; -import java.lang.String; -import java.lang.Throwable; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import no.sikt.graphql.exception.ExceptionStrategyConfiguration; -import no.sikt.graphql.exception.ValidationViolationGraphQLException; - -public class GeneratedExceptionStrategyConfiguration implements ExceptionStrategyConfiguration { - private final Map<Class<? extends Throwable>, Set<String>> fieldsForException; - - private final Map<String, ExceptionStrategyConfiguration.PayloadCreator> payloadForField; - - public GeneratedExceptionStrategyConfiguration() { - fieldsForException = new HashMap<>(); - payloadForField = new HashMap<>(); - fieldsForException.computeIfAbsent(ValidationViolationGraphQLException.class, k -> new HashSet<>()).add("query"); - fieldsForException.computeIfAbsent(IllegalArgumentException.class, k -> new HashSet<>()).add("query"); - payloadForField.put("query", errors -> { - var payload = new Response(); - payload.setErrors((List<ValidationError>) errors); - return payload; - } ); - - } - - @Override - public Map<Class<? extends Throwable>, Set<String>> getFieldsForException() { - return fieldsForException; - } - - @Override - public Map<String, ExceptionStrategyConfiguration.PayloadCreator> getPayloadForField() { - return payloadForField; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/query/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/query/schema.graphqls deleted file mode 100644 index 8bf790d43f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/query/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Response -} - -type Response { - errors: [ValidationError] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/service/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/service/schema.graphqls deleted file mode 100644 index 7eead33b3e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/service/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation: Response @service(service: {name: "DUMMY_SERVICE"}) -} - -type Response { - errors: [ValidationError] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/twoMutations/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/twoMutations/schema.graphqls deleted file mode 100644 index 914ba28594..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/twoMutations/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Mutation { - mutation0: Response @mutation(typeName: UPDATE) - mutation1: Response @mutation(typeName: UPDATE) -} - -type Response { - errors: [ValidationError] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/union/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/union/schema.graphqls deleted file mode 100644 index 1493785a6f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/union/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Response { - errors: [ValidationUnion] -} - -union ValidationUnion = ValidationError diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/unionWithHandled/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/unionWithHandled/schema.graphqls deleted file mode 100644 index f4ab46cd71..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/unionWithHandled/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Response { - errors: [ValidationUnion] -} - -union ValidationUnion = ValidationError | SomeError - -type SomeError implements Error @error(handlers: -[{handler: DATABASE, code: "1337", matches: "data error", description: "This is an error for the union type"}]) { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/unrelatedError/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/unrelatedError/schema.graphqls deleted file mode 100644 index 58e4049871..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/configuration/unrelatedError/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Response { - errors: [UnrelatedError] -} - -type UnrelatedError implements Error { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/bothGenericAndDatabase/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/bothGenericAndDatabase/schema.graphqls deleted file mode 100644 index a0d083773d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/bothGenericAndDatabase/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Response { - errors: [SomeError] -} - -type SomeError implements Error @error(handlers: [{handler: DATABASE}, {handler: GENERIC, className: "java.lang.IllegalArgumentException"}]) { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/bothGenericAndDatabaseInMultipleErrorsForOneResponse/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/bothGenericAndDatabaseInMultipleErrorsForOneResponse/schema.graphqls deleted file mode 100644 index 557438d188..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/bothGenericAndDatabaseInMultipleErrorsForOneResponse/schema.graphqls +++ /dev/null @@ -1,14 +0,0 @@ -type Response { - errors0: [SomeError0] - errors1: [SomeError1] -} - -type SomeError0 implements Error @error(handlers: [{handler: DATABASE}, {handler: GENERIC, className: "java.lang.IllegalArgumentException"}]) { - path: [String!]! - message: String! -} - -type SomeError1 implements Error @error(handlers: [{handler: GENERIC, className: "java.lang.IllegalArgumentException"}, {handler: DATABASE}]) { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/databaseHandledError/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/databaseHandledError/schema.graphqls deleted file mode 100644 index 226e894ef8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/databaseHandledError/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Response { - errors: [SomeError] -} - -type SomeError implements Error @error(handlers: [{handler: DATABASE}]) { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/databaseWithCode/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/databaseWithCode/schema.graphqls deleted file mode 100644 index 92e5a170e3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/databaseWithCode/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Response { - errors: [SomeError] -} - -type SomeError implements Error @error(handlers: [{handler: DATABASE, code: "CODE"}]) { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/databaseWithCodeAndSqlState/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/databaseWithCodeAndSqlState/schema.graphqls deleted file mode 100644 index 9800e091c2..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/databaseWithCodeAndSqlState/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Response { - errors: [SomeError] -} - -type SomeError implements Error @error(handlers: [{handler: DATABASE, code: "20997", sqlState: "23503"}]) { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/databaseWithMatches/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/databaseWithMatches/schema.graphqls deleted file mode 100644 index 18dececced..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/databaseWithMatches/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Response { - errors: [SomeError] -} - -type SomeError implements Error @error(handlers: [{handler: DATABASE, matches: "MATCHES"}]) { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/databaseWithSqlState/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/databaseWithSqlState/schema.graphqls deleted file mode 100644 index 8b5f08a7d3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/databaseWithSqlState/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Response { - errors: [SomeError] -} - -type SomeError implements Error @error(handlers: [{handler: DATABASE, sqlState: "23503"}]) { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/default/expected/GeneratedExceptionToErrorMappingProvider.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/default/expected/GeneratedExceptionToErrorMappingProvider.java deleted file mode 100644 index 0bc9115c17..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/default/expected/GeneratedExceptionToErrorMappingProvider.java +++ /dev/null @@ -1,39 +0,0 @@ -package fake.code.generated.resolvers.mutation; - -import fake.graphql.example.model.SomeError; -import java.lang.Override; -import java.lang.String; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import no.sikt.graphql.exception.DataAccessExceptionContentToErrorMapping; -import no.sikt.graphql.exception.ExceptionToErrorMappingProvider; -import no.sikt.graphql.exception.GenericExceptionContentToErrorMapping; -import no.sikt.graphql.exception.GenericExceptionMatcher; - -public class GeneratedExceptionToErrorMappingProvider implements ExceptionToErrorMappingProvider { - private final Map<String, List<DataAccessExceptionContentToErrorMapping>> dataAccessMappingsForOperation; - - private final Map<String, List<GenericExceptionContentToErrorMapping>> genericMappingsForOperation; - - public GeneratedExceptionToErrorMappingProvider() { - dataAccessMappingsForOperation = new HashMap<>(); - genericMappingsForOperation = new HashMap<>(); - var m1 = new GenericExceptionContentToErrorMapping( - new GenericExceptionMatcher("java.lang.IllegalArgumentException", null), - (path, msg) -> new SomeError(path, msg)); - - var mutationGenericList = List.of(m1); - genericMappingsForOperation.put("mutation", mutationGenericList); - } - - @Override - public Map<String, List<DataAccessExceptionContentToErrorMapping>> getDataAccessMappingsForOperation() { - return dataAccessMappingsForOperation; - } - - @Override - public Map<String, List<GenericExceptionContentToErrorMapping>> getGenericMappingsForOperation() { - return genericMappingsForOperation; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/default/schema.graphqls deleted file mode 100644 index 5c09708a2f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/default/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Response { - errors: [SomeError] -} - -type SomeError implements Error @error(handlers: [{handler: GENERIC, className: "java.lang.IllegalArgumentException"}]) { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/multiple/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/multiple/schema.graphqls deleted file mode 100644 index ba1618616f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/multiple/schema.graphqls +++ /dev/null @@ -1,22 +0,0 @@ -type Mutation { - mutation0: Response0 @mutation(typeName: UPDATE) - mutation1: Response1 @mutation(typeName: UPDATE) -} - -type Response0 { - errors: [SomeError0] -} - -type Response1 { - errors: [SomeError1] -} - -type SomeError0 implements Error @error(handlers: [{handler: GENERIC, className: "java.lang.IllegalArgumentException"}]) { - path: [String!]! - message: String! -} - -type SomeError1 implements Error @error(handlers: [{handler: GENERIC, className: "java.lang.IllegalArgumentException"}]) { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/multipleDatabaseHandlers/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/multipleDatabaseHandlers/schema.graphqls deleted file mode 100644 index fa5166d3ab..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/multipleDatabaseHandlers/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Response { - errors: [SomeError] -} - -type SomeError implements Error @error(handlers: [{handler: DATABASE, code: "C_0"}, {handler: DATABASE, code: "C_1"}]) { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/multipleHandlers/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/multipleHandlers/schema.graphqls deleted file mode 100644 index f046c151fc..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/multipleHandlers/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Response { - errors: [SomeError] -} - -type SomeError implements Error @error(handlers: [ - {handler: GENERIC, className: "java.lang.IllegalArgumentException"} - {handler: GENERIC, className: "java.lang.IllegalStateException"} -]) { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/multipleInOneResponse/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/multipleInOneResponse/schema.graphqls deleted file mode 100644 index d6e6fe3e67..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/multipleInOneResponse/schema.graphqls +++ /dev/null @@ -1,14 +0,0 @@ -type Response { - errors0: [SomeError0] - errors1: [SomeError1] -} - -type SomeError0 implements Error @error(handlers: [{handler: GENERIC, className: "java.lang.IllegalArgumentException"}]) { - path: [String!]! - message: String! -} - -type SomeError1 implements Error @error(handlers: [{handler: GENERIC, className: "java.lang.IllegalArgumentException"}]) { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/noErrors/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/noErrors/schema.graphqls deleted file mode 100644 index 44b6b39217..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/noErrors/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation: ID @mutation(typeName: UPDATE) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/noHandlers/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/noHandlers/schema.graphqls deleted file mode 100644 index af22600fda..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/noHandlers/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Response { - errors: [SomeError] -} - -type SomeError implements Error { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/onlyOneHandled/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/onlyOneHandled/schema.graphqls deleted file mode 100644 index 77bb4ba8a6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/onlyOneHandled/schema.graphqls +++ /dev/null @@ -1,14 +0,0 @@ -type Response { - errors0: [SomeError0] - errors1: [SomeError1] -} - -type SomeError0 implements Error @error(handlers: [{handler: GENERIC, className: "java.lang.IllegalArgumentException"}]) { - path: [String!]! - message: String! -} - -type SomeError1 implements Error { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/query/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/query/schema.graphqls deleted file mode 100644 index ac7785a650..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/query/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Response -} - -type Response { - errors: [SomeError] -} - -type SomeError implements Error @error(handlers: [{handler: GENERIC, className: "java.lang.IllegalArgumentException"}]) { - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/service/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/service/schema.graphqls deleted file mode 100644 index dc407cfdbd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/service/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Mutation { - mutation: Response @service(service: {name: "DUMMY_SERVICE"}) -} - -type Response { - errors: [SomeError] -} - -type SomeError implements Error @error(handlers: [{handler: GENERIC, className: "java.lang.IllegalArgumentException"}]) { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/union/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/union/schema.graphqls deleted file mode 100644 index 8d96c3d05d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/union/schema.graphqls +++ /dev/null @@ -1,10 +0,0 @@ -type Response { - errors: [U] -} - -union U = SomeError - -type SomeError implements Error @error(handlers: [{handler: GENERIC, className: "java.lang.IllegalArgumentException"}]) { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/unionDatabase/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/unionDatabase/schema.graphqls deleted file mode 100644 index cdc15e9bfc..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/unionDatabase/schema.graphqls +++ /dev/null @@ -1,10 +0,0 @@ -type Response { - errors: [U] -} - -union U = SomeError - -type SomeError implements Error @error(handlers: [{handler: DATABASE}]) { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/unionMultipleDatabaseHandlers/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/unionMultipleDatabaseHandlers/schema.graphqls deleted file mode 100644 index f102490b60..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/unionMultipleDatabaseHandlers/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Response { - errors: [U] -} - -union U = SomeError0 | SomeError1 - -type SomeError0 implements Error @error(handlers: [{handler: DATABASE}]) { - path: [String!]! - message: String! -} - -type SomeError1 implements Error @error(handlers: [{handler: DATABASE}]) { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/unionMultipleErrorsWithMultipleMixedHandlers/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/unionMultipleErrorsWithMultipleMixedHandlers/schema.graphqls deleted file mode 100644 index c203923188..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/unionMultipleErrorsWithMultipleMixedHandlers/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Response { - errors: [U] -} - -union U = SomeError0 | SomeError1 - -type SomeError0 implements Error @error(handlers: [{handler: GENERIC, className: "java.lang.IllegalArgumentException"}, {handler: DATABASE}]) { - path: [String!]! - message: String! -} - -type SomeError1 implements Error @error(handlers: [{handler: DATABASE}, {handler: GENERIC, className: "java.lang.IllegalArgumentException"}]) { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/unionMultipleHandlers/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/unionMultipleHandlers/schema.graphqls deleted file mode 100644 index e3e8fe9f2f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/unionMultipleHandlers/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Response { - errors: [U] -} - -union U = SomeError0 | SomeError1 - -type SomeError0 implements Error @error(handlers: [{handler: GENERIC, className: "java.lang.IllegalArgumentException"}]) { - path: [String!]! - message: String! -} - -type SomeError1 implements Error @error(handlers: [{handler: GENERIC, className: "java.lang.IllegalArgumentException"}]) { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/unionMultipleMixedHandlers/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/unionMultipleMixedHandlers/schema.graphqls deleted file mode 100644 index 2ca5689010..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/unionMultipleMixedHandlers/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Response { - errors: [U] -} - -union U = SomeError0 | SomeError1 - -type SomeError0 implements Error @error(handlers: [{handler: GENERIC, className: "java.lang.IllegalArgumentException"}]) { - path: [String!]! - message: String! -} - -type SomeError1 implements Error @error(handlers: [{handler: DATABASE}]) { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/unionWithUnhandledError/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/unionWithUnhandledError/schema.graphqls deleted file mode 100644 index b45a5b1ec7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/unionWithUnhandledError/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Response { - errors: [U] -} - -union U = SomeError | UnhandledError - -type SomeError implements Error @error(handlers: [{handler: GENERIC, className: "java.lang.IllegalArgumentException"}]) { - path: [String!]! - message: String! -} - -type UnhandledError implements Error { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/withDescription/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/withDescription/schema.graphqls deleted file mode 100644 index e7c112576d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/withDescription/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Response { - errors: [SomeError] -} - -type SomeError implements Error @error(handlers: [{handler: GENERIC, className: "java.lang.IllegalArgumentException", description: "DESC"}]) { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/withMatches/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/withMatches/schema.graphqls deleted file mode 100644 index 062d7e5bbf..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/exceptions/provider/withMatches/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Response { - errors: [SomeError] -} - -type SomeError implements Error @error(handlers: [{handler: GENERIC, className: "java.lang.IllegalArgumentException", matches: "MATCH"}]) { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/ignoresJOOQRecordClasses/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/ignoresJOOQRecordClasses/schema.graphqls deleted file mode 100644 index fdf38666dd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/ignoresJOOQRecordClasses/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - customerQuery(in: CustomerInputTable): CustomerTable @service(service: {name: "DUMMY_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/nodeStrategy/toRecord/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/nodeStrategy/toRecord/default/schema.graphqls deleted file mode 100644 index c4a02e5c21..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/nodeStrategy/toRecord/default/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: DummyInputRecord): CustomerNode @service(service: {name: "DUMMY_SERVICE"}) -} - -input DummyInputRecord @record(record: {name: "ID_RECORD"}) { - id: ID @nodeId(typeName: "CustomerNode") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/nodeStrategy/toRecord/nodeIdWithoutNode/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/nodeStrategy/toRecord/nodeIdWithoutNode/schema.graphqls deleted file mode 100644 index 17e43791eb..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/nodeStrategy/toRecord/nodeIdWithoutNode/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(in: DummyInputRecord): ID @service(service: {name: "DUMMY_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingDoubleNonRecordWrapper/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingDoubleNonRecordWrapper/schema.graphqls deleted file mode 100644 index ec8553bed6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingDoubleNonRecordWrapper/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Address @record(record: {name: "MAPPER_RECORD_ADDRESS"}) { - inner0: Wrapper -} - -type Wrapper { - inner1: InnerWrapper -} - -type InnerWrapper { - postalCode: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingJOOQRecord/expected/AddressTypeMapper.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingJOOQRecord/expected/AddressTypeMapper.java deleted file mode 100644 index 331040ae42..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingJOOQRecord/expected/AddressTypeMapper.java +++ /dev/null @@ -1,33 +0,0 @@ -package fake.code.generated.mappers; - -import fake.code.generated.transform.RecordTransformer; -import fake.graphql.example.model.Address; -import java.lang.String; -import java.util.ArrayList; -import java.util.List; -import no.sikt.graphitron.codereferences.records.MapperNestedJavaRecord; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CustomerRecord; - -public class AddressTypeMapper { - public static List<Address> toGraphType(List<MapperNestedJavaRecord> _mi_mapperNestedJavaRecord, - String _iv_path, RecordTransformer _iv_transform) { - var _iv_pathHere = _iv_path.isEmpty() ? _iv_path : _iv_path + "/"; - var _iv_select = _iv_transform.getSelect(); - var _mlo_address = new ArrayList<Address>(); - - if (_mi_mapperNestedJavaRecord != null) { - for (var _nit_mapperNestedJavaRecord : _mi_mapperNestedJavaRecord) { - if (_nit_mapperNestedJavaRecord == null) continue; - var _mo_address = new Address(); - var _mi_customer = _nit_mapperNestedJavaRecord.getCustomer(); - if (_mi_customer != null && _iv_select.contains(_iv_pathHere + "customer")) { - _mo_address.setCustomerKey(_mi_customer.key().into(CustomerRecord.class)); - } - - _mlo_address.add(_mo_address); - } - } - - return _mlo_address; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingJOOQRecord/expected/RecordTransformer.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingJOOQRecord/expected/RecordTransformer.java deleted file mode 100644 index e5f4638ac8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingJOOQRecord/expected/RecordTransformer.java +++ /dev/null @@ -1,35 +0,0 @@ -package fake.code.generated.transform; - -import fake.graphql.example.model.Address; -import fake.graphql.example.model.CustomerTable; -import graphql.schema.DataFetchingEnvironment; -import java.lang.String; -import java.util.List; -import no.sikt.graphitron.codereferences.records.MapperNestedJavaRecord; -import no.sikt.graphql.helpers.transform.AbstractTransformer; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CustomerRecord; - -public class RecordTransformer extends AbstractTransformer { - public RecordTransformer(DataFetchingEnvironment _iv_env) { - super(_iv_env); - } - - public List<Address> addressToGraphType(List<MapperNestedJavaRecord> _mi_input, - String _iv_path) { - return List.of(); - } - - public List<CustomerTable> customerTableRecordToGraphType(List<CustomerRecord> _mi_input, - String _iv_path) { - return List.of(); - } - - public Address addressToGraphType(MapperNestedJavaRecord _mi_input, String _iv_path) { - return null; - } - - public CustomerTable customerTableRecordToGraphType(CustomerRecord _mi_input, - String _iv_path) { - return null; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingJOOQRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingJOOQRecord/schema.graphqls deleted file mode 100644 index 5ff85e5632..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingJOOQRecord/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Address @record(record: {name: "NESTED_RECORD"}) { - customer: CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingJavaRecord/expected/AddressTypeMapper.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingJavaRecord/expected/AddressTypeMapper.java deleted file mode 100644 index ed784de61d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingJavaRecord/expected/AddressTypeMapper.java +++ /dev/null @@ -1,32 +0,0 @@ -package fake.code.generated.mappers; - -import fake.code.generated.transform.RecordTransformer; -import fake.graphql.example.model.Address; -import java.lang.String; -import java.util.ArrayList; -import java.util.List; -import no.sikt.graphitron.codereferences.records.MapperNestedJavaRecord; - -public class AddressTypeMapper { - public static List<Address> toGraphType(List<MapperNestedJavaRecord> _mi_mapperNestedJavaRecord, - String _iv_path, RecordTransformer _iv_transform) { - var _iv_pathHere = _iv_path.isEmpty() ? _iv_path : _iv_path + "/"; - var _iv_select = _iv_transform.getSelect(); - var _mlo_address = new ArrayList<Address>(); - - if (_mi_mapperNestedJavaRecord != null) { - for (var _nit_mapperNestedJavaRecord : _mi_mapperNestedJavaRecord) { - if (_nit_mapperNestedJavaRecord == null) continue; - var _mo_address = new Address(); - var _mi_dummyRecord = _nit_mapperNestedJavaRecord.getDummyRecord(); - if (_mi_dummyRecord != null && _iv_select.contains(_iv_pathHere + "dummyRecord")) { - _mo_address.setDummyRecord(_iv_transform.dummyTypeRecordToGraphType(_mi_dummyRecord, _iv_pathHere + "dummyRecord")); - } - - _mlo_address.add(_mo_address); - } - } - - return _mlo_address; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingJavaRecord/expected/DummyTypeRecordTypeMapper.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingJavaRecord/expected/DummyTypeRecordTypeMapper.java deleted file mode 100644 index e9c66f6ecf..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingJavaRecord/expected/DummyTypeRecordTypeMapper.java +++ /dev/null @@ -1,31 +0,0 @@ -package fake.code.generated.mappers; - -import fake.code.generated.transform.RecordTransformer; -import fake.graphql.example.model.DummyTypeRecord; -import java.lang.String; -import java.util.ArrayList; -import java.util.List; -import no.sikt.graphitron.codereferences.records.IDJavaRecord; - -public class DummyTypeRecordTypeMapper { - public static List<DummyTypeRecord> toGraphType(List<IDJavaRecord> _mi_iDJavaRecord, - String _iv_path, RecordTransformer _iv_transform) { - var _iv_pathHere = _iv_path.isEmpty() ? _iv_path : _iv_path + "/"; - var _iv_select = _iv_transform.getSelect(); - var _mlo_dummyTypeRecord = new ArrayList<DummyTypeRecord>(); - - if (_mi_iDJavaRecord != null) { - for (var _nit_iDJavaRecord : _mi_iDJavaRecord) { - if (_nit_iDJavaRecord == null) continue; - var _mo_dummyTypeRecord = new DummyTypeRecord(); - if (_iv_select.contains(_iv_pathHere + "id")) { - _mo_dummyTypeRecord.setId(_nit_iDJavaRecord.getId()); - } - - _mlo_dummyTypeRecord.add(_mo_dummyTypeRecord); - } - } - - return _mlo_dummyTypeRecord; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingJavaRecord/expected/RecordTransformer.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingJavaRecord/expected/RecordTransformer.java deleted file mode 100644 index 44e3f69b7d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingJavaRecord/expected/RecordTransformer.java +++ /dev/null @@ -1,35 +0,0 @@ -package fake.code.generated.transform; - -import fake.graphql.example.model.Address; -import fake.graphql.example.model.DummyTypeRecord; -import graphql.schema.DataFetchingEnvironment; -import java.lang.String; -import java.util.List; -import no.sikt.graphitron.codereferences.records.IDJavaRecord; -import no.sikt.graphitron.codereferences.records.MapperNestedJavaRecord; -import no.sikt.graphql.helpers.transform.AbstractTransformer; - -public class RecordTransformer extends AbstractTransformer { - public RecordTransformer(DataFetchingEnvironment _iv_env) { - super(_iv_env); - } - - public List<DummyTypeRecord> dummyTypeRecordToGraphType(List<IDJavaRecord> _mi_input, - String _iv_path) { - return List.of(); - } - - public List<Address> addressToGraphType(List<MapperNestedJavaRecord> _mi_input, - String _iv_path) { - return List.of(); - } - - public DummyTypeRecord dummyTypeRecordToGraphType(IDJavaRecord _mi_input, - String _iv_path) { - return null; - } - - public Address addressToGraphType(MapperNestedJavaRecord _mi_input, String _iv_path) { - return null; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingJavaRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingJavaRecord/schema.graphqls deleted file mode 100644 index e8cf5c8c89..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingJavaRecord/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Address @record(record: {name: "NESTED_RECORD"}) { - dummyRecord: DummyTypeRecord -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingNonRecordWrapper/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingNonRecordWrapper/schema.graphqls deleted file mode 100644 index ebf2953a93..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingNonRecordWrapper/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Address @record(record: {name: "MAPPER_RECORD_ADDRESS"}) { - inner: Wrapper -} - -type Wrapper { - postalCode: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingNonRecordWrapperWithFieldOverride/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingNonRecordWrapperWithFieldOverride/schema.graphqls deleted file mode 100644 index 93584aa0a3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingNonRecordWrapperWithFieldOverride/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Address @record(record: {name: "MAPPER_RECORD_ADDRESS"}) { - inner1: Wrapper1 - inner2: Wrapper2 @field(name: "postalCode") # This technically works but generates unnecessary code. -} - -type Wrapper1 { - code: String! @field(name: "postalCode") -} - -type Wrapper2 { - code: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingNonRecordWrapperWithJOOQRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingNonRecordWrapperWithJOOQRecord/schema.graphqls deleted file mode 100644 index 8a1b844527..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingNonRecordWrapperWithJOOQRecord/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Address @record(record: {name: "NESTED_RECORD"}) { - inner: InnerWrapper -} - -type InnerWrapper { - customer: CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingNonRecordWrapperWithJavaRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingNonRecordWrapperWithJavaRecord/schema.graphqls deleted file mode 100644 index ab3605a860..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingNonRecordWrapperWithJavaRecord/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Address @record(record: {name: "NESTED_RECORD"}) { - inner: InnerWrapper -} - -type InnerWrapper { - dummyRecord: DummyTypeRecord -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingRecordWithSplitQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingRecordWithSplitQuery/schema.graphqls deleted file mode 100644 index 1aa8f44ffd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/containingRecordWithSplitQuery/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Address @record(record: {name: "NESTED_RECORD"}) { - customer: Customer @splitQuery -} - -type Customer implements Node @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/default/expected/DummyTypeRecordTypeMapper.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/default/expected/DummyTypeRecordTypeMapper.java deleted file mode 100644 index e9c66f6ecf..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/default/expected/DummyTypeRecordTypeMapper.java +++ /dev/null @@ -1,31 +0,0 @@ -package fake.code.generated.mappers; - -import fake.code.generated.transform.RecordTransformer; -import fake.graphql.example.model.DummyTypeRecord; -import java.lang.String; -import java.util.ArrayList; -import java.util.List; -import no.sikt.graphitron.codereferences.records.IDJavaRecord; - -public class DummyTypeRecordTypeMapper { - public static List<DummyTypeRecord> toGraphType(List<IDJavaRecord> _mi_iDJavaRecord, - String _iv_path, RecordTransformer _iv_transform) { - var _iv_pathHere = _iv_path.isEmpty() ? _iv_path : _iv_path + "/"; - var _iv_select = _iv_transform.getSelect(); - var _mlo_dummyTypeRecord = new ArrayList<DummyTypeRecord>(); - - if (_mi_iDJavaRecord != null) { - for (var _nit_iDJavaRecord : _mi_iDJavaRecord) { - if (_nit_iDJavaRecord == null) continue; - var _mo_dummyTypeRecord = new DummyTypeRecord(); - if (_iv_select.contains(_iv_pathHere + "id")) { - _mo_dummyTypeRecord.setId(_nit_iDJavaRecord.getId()); - } - - _mlo_dummyTypeRecord.add(_mo_dummyTypeRecord); - } - } - - return _mlo_dummyTypeRecord; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/default/schema.graphqls deleted file mode 100644 index b07bd83e8b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/default/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query: DummyTypeRecord @service(service : {name: "DUMMY_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/idOtherThanPK/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/idOtherThanPK/schema.graphqls deleted file mode 100644 index e95f50f6b7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/idOtherThanPK/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Customer @service(service: {name: "DUMMY_SERVICE"}) -} - -type Customer @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - addressId: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/listField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/listField/schema.graphqls deleted file mode 100644 index 634bb5e611..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/listField/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Customer @service(service : {name: "DUMMY_SERVICE"}) -} - -type Customer @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - idList: [ID] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/mappedField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/mappedField/schema.graphqls deleted file mode 100644 index b616c4bde1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/mappedField/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Customer @service(service : {name: "DUMMY_SERVICE"}) -} - -type Customer @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - id: ID @field(name: "someID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/nestingWithDuplicateFieldName/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/nestingWithDuplicateFieldName/schema.graphqls deleted file mode 100644 index 8b238fe4f0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/nestingWithDuplicateFieldName/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Address @record(record: {name: "MAPPER_RECORD_ADDRESS"}) { - inner: Wrapper -} - -type Wrapper { - inner: InnerWrapper # Has the same name as the field in the previous type. -} - -type InnerWrapper { - postalCode: String! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/splitQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/splitQuery/schema.graphqls deleted file mode 100644 index 270f41d766..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/splitQuery/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Customer -} - -type Customer @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - address: Address @splitQuery -} - -type Address @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/splitQueryListed/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/splitQueryListed/schema.graphqls deleted file mode 100644 index c6914785b6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/splitQueryListed/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Customer -} - -type Customer @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - address: [Address] @splitQuery -} - -type Address @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/splitQueryNested/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/splitQueryNested/schema.graphqls deleted file mode 100644 index 3a525195bb..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/splitQueryNested/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - query: Customer -} - -type Customer @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - wrapper: Wrapper -} - -type Wrapper { - address: Address @splitQuery -} - -type Address @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/twoFields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/twoFields/schema.graphqls deleted file mode 100644 index d26984939c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/twoFields/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - query: Customer @service(service : {name: "DUMMY_SERVICE"}) -} - -type Customer @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - someID: ID @field(name: "someID") - otherID: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/unconfiguredField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/unconfiguredField/schema.graphqls deleted file mode 100644 index 3b692b539d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/unconfiguredField/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - query: Customer -} - -type Customer @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - id1: ID # Wrong. - id2: ID @field(name: "WRONG_NAME") # Even more wrong. -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/unconfiguredJOOQRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/unconfiguredJOOQRecord/schema.graphqls deleted file mode 100644 index 4904e352ae..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/unconfiguredJOOQRecord/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - query: Customer -} - -type Customer @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - c1: CustomerTable # Wrong. - c2: CustomerTable @field(name: "WRONG_NAME") # Even more wrong. -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/unconfiguredJavaRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/unconfiguredJavaRecord/schema.graphqls deleted file mode 100644 index 022613ccd6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/unconfiguredJavaRecord/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - query: Customer -} - -type Customer @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - c1: CustomerJava # Wrong. - c2: CustomerJava @field(name: "WRONG_NAME") # Even more wrong. -} - -type CustomerJava @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - id: ID @notGenerated -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/withEnum/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/withEnum/schema.graphqls deleted file mode 100644 index fb37967ee5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/tograph/withEnum/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Dummy @service(service: {name: "DUMMY_SERVICE"}) -} - -type Dummy @record(record: {name: "MAPPER_RECORD_ENUM"}) { - e: DummyEnum! @field(name: "enum1") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingDoubleNonRecordWrapper/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingDoubleNonRecordWrapper/schema.graphqls deleted file mode 100644 index edcf3d81c3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingDoubleNonRecordWrapper/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - query(in: Address): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input Address @record(record: {name: "MAPPER_RECORD_ADDRESS"}) { - inner0: Wrapper -} - -input Wrapper { - inner1: InnerWrapper -} - -input InnerWrapper { - postalCode: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingJOOQRecord/expected/AddressJavaMapper.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingJOOQRecord/expected/AddressJavaMapper.java deleted file mode 100644 index 6da5d61494..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingJOOQRecord/expected/AddressJavaMapper.java +++ /dev/null @@ -1,34 +0,0 @@ -package fake.code.generated.mappers; - -import fake.code.generated.transform.RecordTransformer; -import fake.graphql.example.model.Address; -import java.lang.String; -import java.util.ArrayList; -import java.util.List; -import no.sikt.graphitron.codereferences.records.MapperNestedJavaRecord; -import no.sikt.graphql.helpers.resolvers.ArgumentPresence; - -public class AddressJavaMapper { - public static List<MapperNestedJavaRecord> toJavaRecord(List<Address> _mi_address, - ArgumentPresence _iv_argPresence, String _iv_path, RecordTransformer _iv_transform) { - var _iv_pathHere = _iv_path.isEmpty() ? _iv_path : _iv_path + "/"; - var _mlo_mapperNestedJavaRecord = new ArrayList<MapperNestedJavaRecord>(); - - if (_mi_address != null) { - for (int _niit_address = 0; _niit_address < _mi_address.size(); _niit_address++) { - var _nit_address = _mi_address.get(_niit_address); - var _iv_args = _iv_argPresence.itemAt(_niit_address); - if (_nit_address == null) continue; - var _mo_mapperNestedJavaRecord = new MapperNestedJavaRecord(); - var _mi_customer = _nit_address.getCustomer(); - if (_mi_customer != null && _iv_args.hasField("customer")) { - _mo_mapperNestedJavaRecord.setCustomer(_iv_transform.customerInputTableToJOOQRecord(_mi_customer, _iv_args.child("customer"), _iv_path + "[" + _niit_address + "]/customer")); - } - - _mlo_mapperNestedJavaRecord.add(_mo_mapperNestedJavaRecord); - } - } - - return _mlo_mapperNestedJavaRecord; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingJOOQRecord/expected/RecordTransformer.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingJOOQRecord/expected/RecordTransformer.java deleted file mode 100644 index cbfdc60352..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingJOOQRecord/expected/RecordTransformer.java +++ /dev/null @@ -1,37 +0,0 @@ -package fake.code.generated.transform; - -import fake.graphql.example.model.Address; -import fake.graphql.example.model.CustomerInputTable; -import graphql.schema.DataFetchingEnvironment; -import java.lang.String; -import java.util.List; -import no.sikt.graphitron.codereferences.records.MapperNestedJavaRecord; -import no.sikt.graphql.helpers.resolvers.ArgumentPresence; -import no.sikt.graphql.helpers.transform.AbstractTransformer; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CustomerRecord; - -public class RecordTransformer extends AbstractTransformer { - public RecordTransformer(DataFetchingEnvironment _iv_env) { - super(_iv_env); - } - - public List<MapperNestedJavaRecord> addressToJavaRecord(List<Address> _mi_input, - ArgumentPresence _iv_argPresence, String _iv_path) { - return List.of(); - } - - public List<CustomerRecord> customerInputTableToJOOQRecord(List<CustomerInputTable> _mi_input, - ArgumentPresence _iv_argPresence, String _iv_path) { - return List.of(); - } - - public MapperNestedJavaRecord addressToJavaRecord(Address _mi_input, - ArgumentPresence _iv_argPresence, String _iv_path) { - return new MapperNestedJavaRecord(); - } - - public CustomerRecord customerInputTableToJOOQRecord(CustomerInputTable _mi_input, - ArgumentPresence _iv_argPresence, String _iv_path) { - return new CustomerRecord(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingJOOQRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingJOOQRecord/schema.graphqls deleted file mode 100644 index baa7a2d42b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingJOOQRecord/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: Address): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input Address @record(record: {name: "NESTED_RECORD"}) { - customer: CustomerInputTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingJavaRecord/expected/AddressJavaMapper.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingJavaRecord/expected/AddressJavaMapper.java deleted file mode 100644 index 053be005a7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingJavaRecord/expected/AddressJavaMapper.java +++ /dev/null @@ -1,34 +0,0 @@ -package fake.code.generated.mappers; - -import fake.code.generated.transform.RecordTransformer; -import fake.graphql.example.model.Address; -import java.lang.String; -import java.util.ArrayList; -import java.util.List; -import no.sikt.graphitron.codereferences.records.MapperNestedJavaRecord; -import no.sikt.graphql.helpers.resolvers.ArgumentPresence; - -public class AddressJavaMapper { - public static List<MapperNestedJavaRecord> toJavaRecord(List<Address> _mi_address, - ArgumentPresence _iv_argPresence, String _iv_path, RecordTransformer _iv_transform) { - var _iv_pathHere = _iv_path.isEmpty() ? _iv_path : _iv_path + "/"; - var _mlo_mapperNestedJavaRecord = new ArrayList<MapperNestedJavaRecord>(); - - if (_mi_address != null) { - for (int _niit_address = 0; _niit_address < _mi_address.size(); _niit_address++) { - var _nit_address = _mi_address.get(_niit_address); - var _iv_args = _iv_argPresence.itemAt(_niit_address); - if (_nit_address == null) continue; - var _mo_mapperNestedJavaRecord = new MapperNestedJavaRecord(); - var _mi_dummyRecord = _nit_address.getDummyRecord(); - if (_mi_dummyRecord != null && _iv_args.hasField("dummyRecord")) { - _mo_mapperNestedJavaRecord.setDummyRecord(_iv_transform.dummyInputRecordToJavaRecord(_mi_dummyRecord, _iv_args.child("dummyRecord"), _iv_path + "[" + _niit_address + "]/dummyRecord")); - } - - _mlo_mapperNestedJavaRecord.add(_mo_mapperNestedJavaRecord); - } - } - - return _mlo_mapperNestedJavaRecord; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingJavaRecord/expected/DummyInputRecordJavaMapper.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingJavaRecord/expected/DummyInputRecordJavaMapper.java deleted file mode 100644 index b5f1c849dc..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingJavaRecord/expected/DummyInputRecordJavaMapper.java +++ /dev/null @@ -1,33 +0,0 @@ -package fake.code.generated.mappers; - -import fake.code.generated.transform.RecordTransformer; -import fake.graphql.example.model.DummyInputRecord; -import java.lang.String; -import java.util.ArrayList; -import java.util.List; -import no.sikt.graphitron.codereferences.records.IDJavaRecord; -import no.sikt.graphql.helpers.resolvers.ArgumentPresence; - -public class DummyInputRecordJavaMapper { - public static List<IDJavaRecord> toJavaRecord(List<DummyInputRecord> _mi_dummyInputRecord, - ArgumentPresence _iv_argPresence, String _iv_path, RecordTransformer _iv_transform) { - var _iv_pathHere = _iv_path.isEmpty() ? _iv_path : _iv_path + "/"; - var _mlo_iDJavaRecord = new ArrayList<IDJavaRecord>(); - - if (_mi_dummyInputRecord != null) { - for (int _niit_dummyInputRecord = 0; _niit_dummyInputRecord < _mi_dummyInputRecord.size(); _niit_dummyInputRecord++) { - var _nit_dummyInputRecord = _mi_dummyInputRecord.get(_niit_dummyInputRecord); - var _iv_args = _iv_argPresence.itemAt(_niit_dummyInputRecord); - if (_nit_dummyInputRecord == null) continue; - var _mo_iDJavaRecord = new IDJavaRecord(); - if (_iv_args.hasField("id")) { - _mo_iDJavaRecord.setId(_nit_dummyInputRecord.getId()); - } - - _mlo_iDJavaRecord.add(_mo_iDJavaRecord); - } - } - - return _mlo_iDJavaRecord; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingJavaRecord/expected/RecordTransformer.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingJavaRecord/expected/RecordTransformer.java deleted file mode 100644 index f229e21c34..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingJavaRecord/expected/RecordTransformer.java +++ /dev/null @@ -1,37 +0,0 @@ -package fake.code.generated.transform; - -import fake.graphql.example.model.Address; -import fake.graphql.example.model.DummyInputRecord; -import graphql.schema.DataFetchingEnvironment; -import java.lang.String; -import java.util.List; -import no.sikt.graphitron.codereferences.records.IDJavaRecord; -import no.sikt.graphitron.codereferences.records.MapperNestedJavaRecord; -import no.sikt.graphql.helpers.resolvers.ArgumentPresence; -import no.sikt.graphql.helpers.transform.AbstractTransformer; - -public class RecordTransformer extends AbstractTransformer { - public RecordTransformer(DataFetchingEnvironment _iv_env) { - super(_iv_env); - } - - public List<MapperNestedJavaRecord> addressToJavaRecord(List<Address> _mi_input, - ArgumentPresence _iv_argPresence, String _iv_path) { - return List.of(); - } - - public List<IDJavaRecord> dummyInputRecordToJavaRecord(List<DummyInputRecord> _mi_input, - ArgumentPresence _iv_argPresence, String _iv_path) { - return List.of(); - } - - public MapperNestedJavaRecord addressToJavaRecord(Address _mi_input, - ArgumentPresence _iv_argPresence, String _iv_path) { - return new MapperNestedJavaRecord(); - } - - public IDJavaRecord dummyInputRecordToJavaRecord(DummyInputRecord _mi_input, - ArgumentPresence _iv_argPresence, String _iv_path) { - return new IDJavaRecord(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingJavaRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingJavaRecord/schema.graphqls deleted file mode 100644 index 77b0538b9b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingJavaRecord/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: Address): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input Address @record(record: {name: "NESTED_RECORD"}) { - dummyRecord: DummyInputRecord -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingNonRecordWrapper/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingNonRecordWrapper/schema.graphqls deleted file mode 100644 index 9fd5fdf7e7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingNonRecordWrapper/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(in: Address): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input Address @record(record: {name: "MAPPER_RECORD_ADDRESS"}) { - inner: Wrapper -} - -input Wrapper { - postalCode: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingNonRecordWrapperWithFieldOverride/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingNonRecordWrapperWithFieldOverride/schema.graphqls deleted file mode 100644 index e853ca17fe..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingNonRecordWrapperWithFieldOverride/schema.graphqls +++ /dev/null @@ -1,16 +0,0 @@ -type Query { - query(in: Address): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input Address @record(record: {name: "MAPPER_RECORD_ADDRESS"}) { - inner1: Wrapper1 - inner2: Wrapper2 @field(name: "postalCode") -} - -input Wrapper1 { - code: String! @field(name: "postalCode") -} - -input Wrapper2 { - code: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingNonRecordWrapperWithJOOQRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingNonRecordWrapperWithJOOQRecord/schema.graphqls deleted file mode 100644 index b9e5127663..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingNonRecordWrapperWithJOOQRecord/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(in: Address): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input Address @record(record: {name: "NESTED_RECORD"}) { - inner: InnerWrapper -} - -input InnerWrapper { - customer: CustomerInputTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingNonRecordWrapperWithJavaRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingNonRecordWrapperWithJavaRecord/schema.graphqls deleted file mode 100644 index 9abdb9b3cb..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/containingNonRecordWrapperWithJavaRecord/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(in: Address): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input Address @record(record: {name: "NESTED_RECORD"}) { - inner: InnerWrapper -} - -input InnerWrapper { - dummyRecord: DummyInputRecord -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/default/expected/DummyInputRecordJavaMapper.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/default/expected/DummyInputRecordJavaMapper.java deleted file mode 100644 index b5f1c849dc..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/default/expected/DummyInputRecordJavaMapper.java +++ /dev/null @@ -1,33 +0,0 @@ -package fake.code.generated.mappers; - -import fake.code.generated.transform.RecordTransformer; -import fake.graphql.example.model.DummyInputRecord; -import java.lang.String; -import java.util.ArrayList; -import java.util.List; -import no.sikt.graphitron.codereferences.records.IDJavaRecord; -import no.sikt.graphql.helpers.resolvers.ArgumentPresence; - -public class DummyInputRecordJavaMapper { - public static List<IDJavaRecord> toJavaRecord(List<DummyInputRecord> _mi_dummyInputRecord, - ArgumentPresence _iv_argPresence, String _iv_path, RecordTransformer _iv_transform) { - var _iv_pathHere = _iv_path.isEmpty() ? _iv_path : _iv_path + "/"; - var _mlo_iDJavaRecord = new ArrayList<IDJavaRecord>(); - - if (_mi_dummyInputRecord != null) { - for (int _niit_dummyInputRecord = 0; _niit_dummyInputRecord < _mi_dummyInputRecord.size(); _niit_dummyInputRecord++) { - var _nit_dummyInputRecord = _mi_dummyInputRecord.get(_niit_dummyInputRecord); - var _iv_args = _iv_argPresence.itemAt(_niit_dummyInputRecord); - if (_nit_dummyInputRecord == null) continue; - var _mo_iDJavaRecord = new IDJavaRecord(); - if (_iv_args.hasField("id")) { - _mo_iDJavaRecord.setId(_nit_dummyInputRecord.getId()); - } - - _mlo_iDJavaRecord.add(_mo_iDJavaRecord); - } - } - - return _mlo_iDJavaRecord; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/default/schema.graphqls deleted file mode 100644 index 79e8def9de..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/default/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(in: DummyInputRecord): ID @service(service: {name: "DUMMY_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/idOtherThanPK/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/idOtherThanPK/schema.graphqls deleted file mode 100644 index 504d0c8a05..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/idOtherThanPK/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: Customer): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input Customer @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - addressId: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/listField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/listField/schema.graphqls deleted file mode 100644 index 26260d8c25..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/listField/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: Customer): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input Customer @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - idList: [ID] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/mappedField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/mappedField/schema.graphqls deleted file mode 100644 index 2f377a85cc..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/mappedField/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: Customer): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input Customer @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - id: ID @field(name: "someID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nestingWithDuplicateFieldName/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nestingWithDuplicateFieldName/schema.graphqls deleted file mode 100644 index 6b4234f218..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nestingWithDuplicateFieldName/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - query(in: Address): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input Address @record(record: {name: "MAPPER_RECORD_ADDRESS"}) { - inner: Wrapper -} - -input Wrapper { - inner: InnerWrapper # Has the same name as the field in the previous type. -} - -input InnerWrapper { - postalCode: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/listedNodeId/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/listedNodeId/schema.graphqls deleted file mode 100644 index f0edab5a66..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/listedNodeId/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: CustomerInput): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input CustomerInput @record(record: {className: "no.sikt.graphitron.codereferences.records.ListedNodeIdInputJavaRecord"}) { - id: [ID!]! @field(name: "customer") @nodeId(typeName: "CustomerNode") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/listedNodeIdMerging/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/listedNodeIdMerging/schema.graphqls deleted file mode 100644 index aacfe6aaac..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/listedNodeIdMerging/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - query(in: RentalInput): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input RentalInput @record(record: {className: "no.sikt.graphitron.codereferences.records.ListedRentalInputJavaRecord"}) { - customerId: [ID!]! @nodeId(typeName: "CustomerNode") @field(name: "rental") - inventoryId: [ID!]! @nodeId(typeName: "InventoryNode") @field(name: "rental") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/listedNodeIdMergingWithSingular/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/listedNodeIdMergingWithSingular/schema.graphqls deleted file mode 100644 index 00e7cd4c72..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/listedNodeIdMergingWithSingular/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Query { - query(in: MixedInput): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input MixedInput @record(record: {className: "no.sikt.graphitron.codereferences.records.ListedAndSingularInputJavaRecord"}) { - customerId: [ID!]! @nodeId(typeName: "CustomerNode") @field(name: "rental") - inventoryId: [ID!]! @nodeId(typeName: "InventoryNode") @field(name: "rental") - customer: ID @nodeId(typeName: "CustomerNode") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/listedNodeIdOverlappingColumn/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/listedNodeIdOverlappingColumn/schema.graphqls deleted file mode 100644 index e24c000309..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/listedNodeIdOverlappingColumn/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - query(in: FilmActorInput): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input FilmActorInput @record(record: {className: "no.sikt.graphitron.codereferences.records.ListedFilmActorInputJavaRecord"}) { - filmActorId: [ID!]! @nodeId(typeName: "FilmActorNode") @field(name: "filmActor") - actorId: [ID!]! @nodeId(typeName: "Actor") @field(name: "filmActor") @reference(path: [{key: "film_actor__film_actor_actor_id_fkey"}]) -} - -type Actor implements Node @node @table { - id: ID! @nodeId -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/nodeIdCompositeKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/nodeIdCompositeKey/schema.graphqls deleted file mode 100644 index 335c2eded5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/nodeIdCompositeKey/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - query(in: CompositeKeyInput): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input CompositeKeyInput @record(record: {className: "no.sikt.graphitron.codereferences.records.CompositeKeyInputJavaRecord"}) { - name: String - filmActor: ID @nodeId(typeName: "FilmActorNode") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/nodeIdMerging/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/nodeIdMerging/schema.graphqls deleted file mode 100644 index 453aaa1714..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/nodeIdMerging/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - query(in: RentalInput): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input RentalInput @record(record: {className: "no.sikt.graphitron.codereferences.records.RentalInputJavaRecord"}) { - customerId: ID @nodeId(typeName: "CustomerNode") @field(name: "rental") - inventoryId: ID @nodeId(typeName: "InventoryNode") @field(name: "rental") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/nodeIdOverlappingColumn/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/nodeIdOverlappingColumn/schema.graphqls deleted file mode 100644 index de0420d41e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/nodeIdOverlappingColumn/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - query(in: FilmActorInput): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input FilmActorInput @record(record: {className: "no.sikt.graphitron.codereferences.records.FilmActorInputJavaRecord"}) { - filmActorId: ID @nodeId(typeName: "FilmActorNode") @field(name: "filmActor") - actorId: ID @nodeId(typeName: "Actor") @field(name: "filmActor") @reference(path: [{key: "film_actor__film_actor_actor_id_fkey"}]) -} - -type Actor implements Node @node @table { - id: ID! @nodeId -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/nodeIdReferenceDifferentColumnNames/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/nodeIdReferenceDifferentColumnNames/schema.graphqls deleted file mode 100644 index a9f15f261a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/nodeIdReferenceDifferentColumnNames/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - query(in: FilmInput): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -type Film implements Node @node @table { - id: ID! -} - -type Language implements Node @node(keyColumns: "LANGUAGE_ID") @table { - id: ID! -} - -input FilmInput @record(record: {className: "no.sikt.graphitron.codereferences.records.FilmJavaRecord"}) { - originalLanguageId: ID @nodeId(typeName: "Language") @reference(path: {key: "FILM__FILM_ORIGINAL_LANGUAGE_ID_FKEY"}) @field(name: "film") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/nodeIdSelfReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/nodeIdSelfReference/schema.graphqls deleted file mode 100644 index 7dd37cb529..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/nodeIdSelfReference/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(in: FilmInput): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -type Film implements Node @node @table { - id: ID! -} - -input FilmInput @record(record: {className: "no.sikt.graphitron.codereferences.records.FilmJavaRecord"}) { - sequel: ID @field(name: "film") @reference(path: [{table: "FILM"}]) @nodeId(typeName: "Film") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/nodeIdToJooqRecord/expected/NodeIdInputJavaMapper.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/nodeIdToJooqRecord/expected/NodeIdInputJavaMapper.java deleted file mode 100644 index 7104477a70..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/nodeIdToJooqRecord/expected/NodeIdInputJavaMapper.java +++ /dev/null @@ -1,42 +0,0 @@ -import fake.code.generated.transform.RecordTransformer; -import fake.graphql.example.model.NodeIdInput; -import java.lang.String; -import java.util.ArrayList; -import java.util.List; -import no.sikt.graphitron.codereferences.records.NodeIdInputJavaRecord; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.Customer; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CustomerRecord; -import no.sikt.graphql.NodeIdStrategy; -import no.sikt.graphql.helpers.resolvers.ArgumentPresence; - -public class NodeIdInputJavaMapper { - public static List<NodeIdInputJavaRecord> toJavaRecord(List<NodeIdInput> _mi_nodeIdInput, - NodeIdStrategy _iv_nodeIdStrategy, ArgumentPresence _iv_argPresence, String _iv_path, RecordTransformer _iv_transform) { - var _iv_pathHere = _iv_path.isEmpty() ? _iv_path : _iv_path + "/"; - var _mlo_nodeIdInputJavaRecord = new ArrayList<NodeIdInputJavaRecord>(); - - if (_mi_nodeIdInput != null) { - for (int _niit_nodeIdInput = 0; _niit_nodeIdInput < _mi_nodeIdInput.size(); _niit_nodeIdInput++) { - var _nit_nodeIdInput = _mi_nodeIdInput.get(_niit_nodeIdInput); - var _iv_args = _iv_argPresence.itemAt(_niit_nodeIdInput); - if (_nit_nodeIdInput == null) continue; - var _mo_nodeIdInputJavaRecord = new NodeIdInputJavaRecord(); - var _mi_customer = new CustomerRecord(); - var _mi_customerHasValue = false; - if (_iv_args.hasField("customer")) { - var _iv_nodeIdValue = _nit_nodeIdInput.getCustomer(); - if (_iv_nodeIdValue != null) { - _mi_customerHasValue = true; - _iv_nodeIdStrategy.setId(_mi_customer, _iv_nodeIdValue, "CustomerNode", Customer.CUSTOMER.CUSTOMER_ID); - } - } - - _mo_nodeIdInputJavaRecord.setCustomer(_mi_customerHasValue ? _mi_customer : null); - - _mlo_nodeIdInputJavaRecord.add(_mo_nodeIdInputJavaRecord); - } - } - - return _mlo_nodeIdInputJavaRecord; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/nodeIdToJooqRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/nodeIdToJooqRecord/schema.graphqls deleted file mode 100644 index e950e41fc2..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/nodeId/nodeIdToJooqRecord/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: NodeIdInput): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input NodeIdInput @record(record: {className: "no.sikt.graphitron.codereferences.records.NodeIdInputJavaRecord"}) { - customer: ID @nodeId(typeName: "CustomerNode") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/optionalFields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/optionalFields/schema.graphqls deleted file mode 100644 index 417612da6e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/optionalFields/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(in: OptionalFieldInput): ID @service(service: {name: "DUMMY_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/skipsSplitQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/skipsSplitQuery/schema.graphqls deleted file mode 100644 index 2711f9931d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/skipsSplitQuery/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(in: Customer): ID -} - -input Customer @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - address: Address @splitQuery -} - -type Address @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/twoFields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/twoFields/schema.graphqls deleted file mode 100644 index 96ec8f225b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/twoFields/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - query(in: Customer): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input Customer @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - id: ID @field(name: "someID") - otherID: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/unconfiguredField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/unconfiguredField/schema.graphqls deleted file mode 100644 index 1fce8a1f2f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/unconfiguredField/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - query(in: Customer): ID -} - -input Customer @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - id1: ID # Wrong. - id2: ID @field(name: "WRONG_NAME") # Even more wrong. -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/unconfiguredJOOQRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/unconfiguredJOOQRecord/schema.graphqls deleted file mode 100644 index 02b97b3b80..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/unconfiguredJOOQRecord/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - query(in: Customer): ID -} - -input Customer @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - c1: CustomerTable # Wrong. - c2: CustomerTable @field(name: "WRONG_NAME") # Even more wrong. -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/unconfiguredJavaRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/unconfiguredJavaRecord/schema.graphqls deleted file mode 100644 index 6572807972..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/unconfiguredJavaRecord/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - query(in: Customer): ID -} - -input Customer @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - c1: CustomerJava # Wrong. - c2: CustomerJava @field(name: "WRONG_NAME") # Even more wrong. -} - -input CustomerJava @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/withEnum/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/withEnum/schema.graphqls deleted file mode 100644 index a34471eabb..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/javamappers/torecord/withEnum/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: Dummy): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input Dummy @record(record: {name: "MAPPER_RECORD_ENUM"}) { - e: DummyEnum! @field(name: "enum1") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/ignoresJavaRecordClasses/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/ignoresJavaRecordClasses/schema.graphqls deleted file mode 100644 index bac4b2b147..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/ignoresJavaRecordClasses/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(in: DummyInputRecord): DummyTypeRecord @service(service: {name: "DUMMY_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/nodeStrategy/toGraph/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/nodeStrategy/toGraph/default/schema.graphqls deleted file mode 100644 index 5310178a09..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/nodeStrategy/toGraph/default/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query: CustomerNode @service(service: {name: "DUMMY_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/nodeStrategy/toGraph/notNodeId/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/nodeStrategy/toGraph/notNodeId/schema.graphqls deleted file mode 100644 index ecb23d9c22..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/nodeStrategy/toGraph/notNodeId/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Customer @service(service: {name: "DUMMY_SERVICE"}) -} - -type Customer @node @table { - customerId: ID @field(name: "CUSTOMER_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/nodeStrategy/toGraph/splitQueryInNestedJavaRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/nodeStrategy/toGraph/splitQueryInNestedJavaRecord/schema.graphqls deleted file mode 100644 index 1946b54fd3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/nodeStrategy/toGraph/splitQueryInNestedJavaRecord/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - query: Payload @service(service: {name: "MAPPER_FETCH_SERVICE", method: "customerJavaQuery"}) -} - -type Payload { - customerJavaRecords: [CustomerJavaRecord] -} - -type CustomerJavaRecord @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - address: Address @splitQuery -} - -type Address @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/nodeStrategy/toGraph/toGraphCustomNodeId/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/nodeStrategy/toGraph/toGraphCustomNodeId/schema.graphqls deleted file mode 100644 index 005c38a7fb..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/nodeStrategy/toGraph/toGraphCustomNodeId/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: CustomerNode @service(service: {name: "DUMMY_SERVICE"}) -} - -type CustomerNode implements Node @node(typeId: "C", keyColumns: ["CUSTOMER_ID"]) @table(name: "CUSTOMER") { - id: ID! @nodeId -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/nodeStrategy/toRecord/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/nodeStrategy/toRecord/default/schema.graphqls deleted file mode 100644 index 7a28f5711c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/nodeStrategy/toRecord/default/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: CustomerInputTable): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input CustomerInputTable @table(name: "CUSTOMER") { - id: ID! @nodeId(typeName: "CustomerNode") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/nodeStrategy/toRecord/withImplicitReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/nodeStrategy/toRecord/withImplicitReference/schema.graphqls deleted file mode 100644 index 76b5fecc33..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/nodeStrategy/toRecord/withImplicitReference/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(in: CustomerInputTable): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input CustomerInputTable @table(name: "CUSTOMER") { - addressId: ID! @nodeId(typeName: "Address") -} - -type Address implements Node @node @table { - id: ID! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/nodeStrategy/toRecord/withReferenceKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/nodeStrategy/toRecord/withReferenceKey/schema.graphqls deleted file mode 100644 index 346ea56bcf..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/nodeStrategy/toRecord/withReferenceKey/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(in: CustomerInputTable): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input CustomerInputTable @table(name: "CUSTOMER") { - addressId: ID! @nodeId(typeName: "Address") @reference(path: [{key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY"}]) -} - -type Address implements Node @node @table { - id: ID! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/arrayScalarField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/arrayScalarField/schema.graphqls deleted file mode 100644 index 17556cf25f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/arrayScalarField/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Customer @service(service: {name: "DUMMY_SERVICE"}) -} - -type Customer @table { - usernames: [String] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/containingDoubleNonRecordWrapper/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/containingDoubleNonRecordWrapper/schema.graphqls deleted file mode 100644 index bf3d882682..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/containingDoubleNonRecordWrapper/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Address @table { - inner0: Wrapper -} - -type Wrapper { - inner1: InnerWrapper -} - -type InnerWrapper { - postalCode: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/containingNonRecordWrapper/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/containingNonRecordWrapper/schema.graphqls deleted file mode 100644 index cd8b46140e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/containingNonRecordWrapper/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Address @table { - inner: Wrapper -} - -type Wrapper { - postalCode: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/containingNonRecordWrapperWithFieldOverride/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/containingNonRecordWrapperWithFieldOverride/schema.graphqls deleted file mode 100644 index 1a45d19af5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/containingNonRecordWrapperWithFieldOverride/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Address @table { - inner1: Wrapper1 - inner2: Wrapper2 @field(name: "POSTAL_CODE") -} - -type Wrapper1 { - code: String! @field(name: "POSTAL_CODE") -} - -type Wrapper2 { - code: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/containingRecords/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/containingRecords/schema.graphqls deleted file mode 100644 index f01a138dd9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/containingRecords/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Customer @service(service: {name: "DUMMY_SERVICE"}) -} - -type Customer implements Node @table { - address: Address -} - -type Address @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/default/expected/CustomerTableTypeMapper.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/default/expected/CustomerTableTypeMapper.java deleted file mode 100644 index db30449272..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/default/expected/CustomerTableTypeMapper.java +++ /dev/null @@ -1,31 +0,0 @@ -package fake.code.generated.mappers; - -import fake.code.generated.transform.RecordTransformer; -import fake.graphql.example.model.CustomerTable; -import java.lang.String; -import java.util.ArrayList; -import java.util.List; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CustomerRecord; - -public class CustomerTableTypeMapper { - public static List<CustomerTable> recordToGraphType(List<CustomerRecord> _mi_customerRecord, - String _iv_path, RecordTransformer _iv_transform) { - var _iv_pathHere = _iv_path.isEmpty() ? _iv_path : _iv_path + "/"; - var _iv_select = _iv_transform.getSelect(); - var _mlo_customerTable = new ArrayList<CustomerTable>(); - - if (_mi_customerRecord != null) { - for (var _nit_customerRecord : _mi_customerRecord) { - if (_nit_customerRecord == null) continue; - var _mo_customerTable = new CustomerTable(); - if (_iv_select.contains(_iv_pathHere + "id")) { - _mo_customerTable.setId(_nit_customerRecord.getId()); - } - - _mlo_customerTable.add(_mo_customerTable); - } - } - - return _mlo_customerTable; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/default/schema.graphqls deleted file mode 100644 index 19f75c8bb8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/default/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query: CustomerTable @service(service: {name: "DUMMY_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/idOtherThanPK/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/idOtherThanPK/schema.graphqls deleted file mode 100644 index 70d97661f8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/idOtherThanPK/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Customer @service(service: {name: "DUMMY_SERVICE"}) -} - -type Customer @table { - addressId: ID @field(name: "ADDRESS_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/listedSourceWithNesting/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/listedSourceWithNesting/schema.graphqls deleted file mode 100644 index 141bb4216b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/listedSourceWithNesting/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: [Customer] @service(service: {name: "DUMMY_SERVICE"}) -} - -type Customer @table { - name: Name -} - -type Name { - first: String @field(name: "FIRST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/mappedField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/mappedField/schema.graphqls deleted file mode 100644 index a8f0b4ac4a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/mappedField/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Customer @service(service: {name: "DUMMY_SERVICE"}) -} - -type Customer @table { - first: String @field(name: "FIRST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/nestingWithDuplicateFieldName/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/nestingWithDuplicateFieldName/schema.graphqls deleted file mode 100644 index 70e6a59c6e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/nestingWithDuplicateFieldName/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Address @table { - inner: Wrapper -} - -type Wrapper { - inner: InnerWrapper # Has the same name as the field in the previous type. -} - -type InnerWrapper { - postalCode: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/outerNonRecordWrapper/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/outerNonRecordWrapper/schema.graphqls deleted file mode 100644 index ce8fd56fdd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/outerNonRecordWrapper/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - # This invokes special mapping logic due to the mapping source being less clear. - query: Wrapper @service(service: {name: "MAPPER_FETCH_SERVICE", method: "customerQuery"}) -} - -type Wrapper { - customer: Customer -} - -type Customer @table { - id: ID! @notGenerated -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/twoFields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/twoFields/schema.graphqls deleted file mode 100644 index 03b713bfd2..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/twoFields/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - query: Customer @service(service: {name: "DUMMY_SERVICE"}) -} - -type Customer @table { - id: ID - first: String @field(name: "FIRST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/unconfiguredField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/unconfiguredField/schema.graphqls deleted file mode 100644 index 240e08671e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/unconfiguredField/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - query: Customer @service(service: {name: "DUMMY_SERVICE"}) -} - -type Customer @table { - id1: ID # Wrong. - id2: ID @field(name: "WRONG_NAME") # Even more wrong. -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/withEnum/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/withEnum/schema.graphqls deleted file mode 100644 index daedafc367..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/withEnum/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - film: Film @service(service : {name: "DUMMY_SERVICE"}) -} - -type Film @table { - e: DummyEnum! @field(name: "RATING") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/withSplitQueryList/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/withSplitQueryList/schema.graphqls deleted file mode 100644 index 4414869835..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/withSplitQueryList/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - customerQuery: CustomerPayload @service(service: {name: "MAPPER_FETCH_SERVICE"}) -} - -type CustomerPayload { - customers: [Customer!]! @splitQuery -} - -type Customer @table { - id: ID! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/withSplitQueryReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/withSplitQueryReference/schema.graphqls deleted file mode 100644 index c7c6f32fc4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/withSplitQueryReference/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Customer @service(service: {name: "DUMMY_SERVICE"}) -} - -type Customer @table { - address: Address @splitQuery -} - -type Address @table { - id: ID! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/withSplitQueryReferenceWithCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/withSplitQueryReferenceWithCondition/schema.graphqls deleted file mode 100644 index c2750914d2..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/withSplitQueryReferenceWithCondition/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Customer @service(service: {name: "DUMMY_SERVICE"}) -} - -type Customer @table { - address: Address @splitQuery @reference(path: [{condition: {className: "no.sikt.graphitron.codereferences.conditions.ReferenceCustomerCondition", method: "addressCustomer"}}]) -} - -type Address @table { - id: ID! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/withSplitQueryReferenceWithConditionList/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/withSplitQueryReferenceWithConditionList/schema.graphqls deleted file mode 100644 index b86afbc5da..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/withSplitQueryReferenceWithConditionList/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Customer @service(service: {name: "DUMMY_SERVICE"}) -} - -type Customer @table { - payments: [Payment] @splitQuery @reference(path: [{condition: {className: "no.sikt.graphitron.codereferences.conditions.ReferenceCustomerCondition"}}]) -} - -type Payment @table { - id: ID! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/withSplitQueryReferenceWithKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/withSplitQueryReferenceWithKey/schema.graphqls deleted file mode 100644 index bc702a5663..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/withSplitQueryReferenceWithKey/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Customer @service(service: {name: "DUMMY_SERVICE"}) -} - -type Customer @table { - address: Address @splitQuery @reference(path: [{key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY"}]) -} - -type Address @table { - id: ID! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/withSplitQueryReferenceWithKeyList/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/withSplitQueryReferenceWithKeyList/schema.graphqls deleted file mode 100644 index f58f7bc621..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/tograph/withSplitQueryReferenceWithKeyList/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Customer @service(service: {name: "DUMMY_SERVICE"}) -} - -type Customer @table { - payments: [Payment] @splitQuery @reference(path: [{key: "PAYMENT__PAYMENT_CUSTOMER_ID_FKEY"}]) -} - -type Payment @table { - id: ID! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/arrayScalarField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/arrayScalarField/schema.graphqls deleted file mode 100644 index 13e9333e32..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/arrayScalarField/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: Customer): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input Customer @table { - usernames: [String] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/containingDoubleNonRecordWrapper/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/containingDoubleNonRecordWrapper/schema.graphqls deleted file mode 100644 index 08012b2e58..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/containingDoubleNonRecordWrapper/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - query(in: Address): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input Address @table { - inner0: Wrapper -} - -input Wrapper { - inner1: InnerWrapper -} - -input InnerWrapper { - postalCode: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/containingNonRecordWrapper/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/containingNonRecordWrapper/schema.graphqls deleted file mode 100644 index 0a2d7e4ab8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/containingNonRecordWrapper/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(in: Address): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input Address @table { - inner: Wrapper -} - -input Wrapper { - postalCode: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/containingNonRecordWrapperWithFieldOverride/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/containingNonRecordWrapperWithFieldOverride/schema.graphqls deleted file mode 100644 index 525f734c16..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/containingNonRecordWrapperWithFieldOverride/schema.graphqls +++ /dev/null @@ -1,16 +0,0 @@ -type Query { - query(in: Address): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input Address @table { - inner1: Wrapper1 - inner2: Wrapper2 @field(name: "POSTAL_CODE") -} - -input Wrapper1 { - code: String! @field(name: "POSTAL_CODE") -} - -input Wrapper2 { - code: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/containingRecords/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/containingRecords/schema.graphqls deleted file mode 100644 index ed2f6cfaca..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/containingRecords/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(in: Customer): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input Customer @table { - address: Address -} - -input Address @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/default/expected/CustomerInputTableJOOQMapper.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/default/expected/CustomerInputTableJOOQMapper.java deleted file mode 100644 index bc018a96fd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/default/expected/CustomerInputTableJOOQMapper.java +++ /dev/null @@ -1,35 +0,0 @@ -package fake.code.generated.mappers; - -import fake.code.generated.transform.RecordTransformer; -import fake.graphql.example.model.CustomerInputTable; -import java.lang.String; -import java.util.ArrayList; -import java.util.List; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CustomerRecord; -import no.sikt.graphql.helpers.resolvers.ArgumentPresence; - -public class CustomerInputTableJOOQMapper { - public static List<CustomerRecord> toJOOQRecord(List<CustomerInputTable> _mi_customerInputTable, - ArgumentPresence _iv_argPresence, String _iv_path, RecordTransformer _iv_transform) { - var _iv_pathHere = _iv_path.isEmpty() ? _iv_path : _iv_path + "/"; - var _iv_ctx = _iv_transform.getCtx(); - var _mlo_customerRecord = new ArrayList<CustomerRecord>(); - - if (_mi_customerInputTable != null) { - for (int _niit_customerInputTable = 0; _niit_customerInputTable < _mi_customerInputTable.size(); _niit_customerInputTable++) { - var _nit_customerInputTable = _mi_customerInputTable.get(_niit_customerInputTable); - var _iv_args = _iv_argPresence.itemAt(_niit_customerInputTable); - if (_nit_customerInputTable == null) continue; - var _mo_customerRecord = new CustomerRecord(); - _mo_customerRecord.attach(_iv_ctx.configuration()); - if (_iv_args.hasField("id")) { - _mo_customerRecord.setId(_nit_customerInputTable.getId()); - } - - _mlo_customerRecord.add(_mo_customerRecord); - } - } - - return _mlo_customerRecord; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/default/schema.graphqls deleted file mode 100644 index e9a7114d82..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/default/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(in: CustomerInputTable): ID @service(service: {name: "DUMMY_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/idOtherThanPK/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/idOtherThanPK/schema.graphqls deleted file mode 100644 index 010d10b733..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/idOtherThanPK/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: Customer): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input Customer @table { - addressId: ID @field(name: "ADDRESS_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/mappedField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/mappedField/schema.graphqls deleted file mode 100644 index 0cef1beee0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/mappedField/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: Customer): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input Customer @table { - first: String @field(name: "FIRST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/nestingWithDuplicateFieldName/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/nestingWithDuplicateFieldName/schema.graphqls deleted file mode 100644 index bf31338c36..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/nestingWithDuplicateFieldName/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - query(in: Address): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input Address @table { - inner: Wrapper -} - -input Wrapper { - inner: InnerWrapper # Has the same name as the field in the previous type. -} - -input InnerWrapper { - postalCode: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/twoFields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/twoFields/schema.graphqls deleted file mode 100644 index 6606630f45..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/twoFields/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - query(in: Customer): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input Customer @table { - id: ID - first: String @field(name: "FIRST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/unconfiguredField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/unconfiguredField/schema.graphqls deleted file mode 100644 index 433f5a14e6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/unconfiguredField/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - query(in: Customer): ID -} - -input Customer @table { - id1: ID # Wrong. - id2: ID @field(name: "WRONG_NAME") # Even more wrong. -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/withEnum/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/withEnum/schema.graphqls deleted file mode 100644 index 8bd4be8e9a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/withEnum/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - film(in: FilmInput): ID @service(service : {name: "DUMMY_SERVICE"}) -} - -input FilmInput @table(name: "FILM") { - e: DummyEnum! @field(name: "RATING") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/withTransforms/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/withTransforms/schema.graphqls deleted file mode 100644 index 9f7a6c358d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/torecord/withTransforms/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: Customer): ID! -} - -input Customer @table(name: "CUSTOMER") { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/validation/default/expected/CustomerInputTableJOOQMapper.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/validation/default/expected/CustomerInputTableJOOQMapper.java deleted file mode 100644 index d677da74be..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/validation/default/expected/CustomerInputTableJOOQMapper.java +++ /dev/null @@ -1,32 +0,0 @@ -package fake.code.generated.mappers; - -import fake.code.generated.transform.RecordTransformer; -import graphql.GraphQLError; -import java.lang.String; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CustomerRecord; -import no.sikt.graphitron.validation.RecordValidator; - -public class CustomerInputTableJOOQMapper { - public static Set<GraphQLError> validate(List<CustomerRecord> _mi_customerRecord, String _iv_path, - RecordTransformer _iv_transform) { - var _iv_pathHere = _iv_path.isEmpty() ? _iv_path : _iv_path + "/"; - var _iv_args = _iv_transform.getArguments(); - var _iv_env = _iv_transform.getEnv(); - var _iv_validationErrors = new HashSet<GraphQLError>(); - - for (int _niit_customerRecord = 0; _niit_customerRecord < _mi_customerRecord.size(); _niit_customerRecord++) { - var _nit_customerRecord = _mi_customerRecord.get(_niit_customerRecord); - var _iv_pathsForProperties = new HashMap<String, String>(); - if (_iv_args.contains(_iv_pathHere + "id")) { - _iv_pathsForProperties.put("id", _iv_pathHere + _niit_customerRecord + "/id"); - } - _iv_validationErrors.addAll(RecordValidator.validatePropertiesAndGenerateGraphQLErrors(_nit_customerRecord, _iv_pathsForProperties, _iv_env)); - } - - return _iv_validationErrors; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/validation/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/validation/default/schema.graphqls deleted file mode 100644 index e9a7114d82..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/jooqmappers/validation/default/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(in: CustomerInputTable): ID @service(service: {name: "DUMMY_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/delete/default/expected/MutationDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/delete/default/expected/MutationDBQueries.java deleted file mode 100644 index 7886d5e66d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/delete/default/expected/MutationDBQueries.java +++ /dev/null @@ -1,19 +0,0 @@ -package fake.code.generated.queries.; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; - -import java.lang.String; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CustomerRecord; -import no.sikt.graphql.NodeIdStrategy; -import org.jooq.DSLContext; -import no.sikt.graphql.helpers.selection.SelectionSet; - -public class MutationDBQueries { - public static String mutationForMutation(DSLContext _iv_ctx, NodeIdStrategy _iv_nodeIdStrategy, CustomerRecord _mi_inRecord, SelectionSet _iv_select) { - return _iv_ctx.deleteFrom(CUSTOMER) - .where(CUSTOMER.CUSTOMER_ID.eq(_mi_inRecord.getCustomerId())) - .returningResult(_iv_nodeIdStrategy.createId("CustomerNode", CUSTOMER.CUSTOMER_ID)) - .fetchOne(_iv_it -> _iv_it.into(String.class)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/delete/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/delete/default/schema.graphqls deleted file mode 100644 index 22c56bc56a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/delete/default/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: CustomerInput!): ID @mutation(typeName: DELETE) @nodeId(typeName: "CustomerNode") -} - -input CustomerInput @table(name: "CUSTOMER") { - customerId: Int! @field(name: "CUSTOMER_ID") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/delete/inputListWithNodeId/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/delete/inputListWithNodeId/schema.graphqls deleted file mode 100644 index f6f1c5df85..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/delete/inputListWithNodeId/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: [CustomerNodeInputTable!]!): [ID] @mutation(typeName: DELETE) @nodeId(typeName: "CustomerNode") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/delete/listedInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/delete/listedInput/schema.graphqls deleted file mode 100644 index 09d9702662..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/delete/listedInput/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: [CustomerInput!]!): [ID] @mutation(typeName: DELETE) @nodeId(typeName: "CustomerNode") -} - -input CustomerInput @table(name: "CUSTOMER") { - id: Int! @field(name: "CUSTOMER_ID") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/delete/nodeIdInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/delete/nodeIdInput/schema.graphqls deleted file mode 100644 index 9d687bb304..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/delete/nodeIdInput/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerNodeInputTable!): ID @mutation(typeName: DELETE) @nodeId(typeName: "CustomerNode") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/delete/nodeIdWithoutNode/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/delete/nodeIdWithoutNode/schema.graphqls deleted file mode 100644 index 1300029a5e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/delete/nodeIdWithoutNode/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerInputTable!): ID @mutation(typeName: DELETE) -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/delete/nullableFieldInInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/delete/nullableFieldInInput/schema.graphqls deleted file mode 100644 index 078578864d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/delete/nullableFieldInInput/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Mutation { - mutation(in: CustomerInput!): ID @mutation(typeName: DELETE) @nodeId(typeName: "CustomerNode") -} - -input CustomerInput @table(name: "CUSTOMER") { - id: Int! @field(name: "CUSTOMER_ID") - firstName: String @field(name: "FIRST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/customNodeId/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/customNodeId/schema.graphqls deleted file mode 100644 index 37002d9f69..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/customNodeId/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Mutation { - mutation(in: CustomerInput!): ID @mutation(typeName: INSERT) @nodeId(typeName: "Customer") -} - -type Customer implements Node @node(typeId: "C", keyColumns: "CUSTOMER_ID") @table { - id: ID! @nodeId -} - -input CustomerInput @table(name: "CUSTOMER") { - id: ID! @nodeId(typeName: "Customer") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/customNodeIdWithMultipleFields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/customNodeIdWithMultipleFields/schema.graphqls deleted file mode 100644 index d8160c3a40..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/customNodeIdWithMultipleFields/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Mutation { - mutation(in: VacationDestinationInput!): ID @mutation(typeName: INSERT) @nodeId(typeName: "VacationDestination") -} - -type VacationDestination implements Node @node(typeId: "V" keyColumns: ["COUNTRY_NAME", "DESTINATION_ID"]) @table(name: "VACATION_DESTINATION") { - id: ID! @nodeId -} - -input VacationDestinationInput @table(name: "VACATION_DESTINATION") { - id: ID! @nodeId -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/customReferenceNodeId/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/customReferenceNodeId/schema.graphqls deleted file mode 100644 index b4b903b662..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/customReferenceNodeId/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Mutation { - mutation(in: CustomerInput!): ID @mutation(typeName: INSERT) @nodeId(typeName: "CustomerNode") -} - -input CustomerInput @table(name: "CUSTOMER") { - addressId: ID! @nodeId(typeName: "Address") -} - -type Address implements Node @node(typeId: "A", keyColumns: "ADDRESS_ID") @table { - id: ID! @nodeId -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/default/expected/MutationDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/default/expected/MutationDBQueries.java deleted file mode 100644 index 42aea99d74..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/default/expected/MutationDBQueries.java +++ /dev/null @@ -1,20 +0,0 @@ -package fake.code.generated.queries.; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CustomerRecord; - -import java.lang.String; -import no.sikt.graphql.NodeIdStrategy; -import org.jooq.DSLContext; -import org.jooq.impl.DSL; -import no.sikt.graphql.helpers.selection.SelectionSet; - -public class MutationDBQueries { - public static String mutationForMutation(DSLContext _iv_ctx, NodeIdStrategy _iv_nodeIdStrategy, CustomerRecord _mi_inRecord, SelectionSet _iv_select) { - return _iv_ctx.insertInto(CUSTOMER, CUSTOMER.CUSTOMER_ID) - .values(DSL.val(_mi_inRecord.getCustomerId())) - .returningResult(_iv_nodeIdStrategy.createId("CustomerNode", CUSTOMER.CUSTOMER_ID)) - .fetchOne(_iv_it -> _iv_it.into(String.class)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/default/schema.graphqls deleted file mode 100644 index 7ab4ea1cd5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/default/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: CustomerInput!): ID @mutation(typeName: INSERT) @nodeId(typeName: "CustomerNode") -} - -input CustomerInput @table(name: "CUSTOMER") { - customerId: Int! @field(name: "CUSTOMER_ID") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/listedInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/listedInput/schema.graphqls deleted file mode 100644 index 2471af7097..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/listedInput/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: [CustomerInput!]!): [ID] @mutation(typeName: INSERT) @nodeId(typeName: "CustomerNode") -} - -input CustomerInput @table(name: "CUSTOMER") { - customerId: Int! @field(name: "CUSTOMER_ID") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/listedInputWithNodeIdField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/listedInputWithNodeIdField/schema.graphqls deleted file mode 100644 index 98dff8f136..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/listedInputWithNodeIdField/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Mutation { - mutation(in: [VacationDestinationInput!]!): [ID] @mutation(typeName: INSERT) @nodeId(typeName: "VacationDestination") -} - -type VacationDestination implements Node @node(typeId: "V_D", keyColumns: ["DESTINATION_ID", "COUNTRY_NAME"]) @table(name: "VACATION_DESTINATION") { - id: ID! @nodeId -} - -input VacationDestinationInput @table(name: "VACATION_DESTINATION") { - id: ID! @nodeId -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/listedInputWithNullableField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/listedInputWithNullableField/schema.graphqls deleted file mode 100644 index fa36acdaff..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/listedInputWithNullableField/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: [CustomerInput!]!): [ID] @mutation(typeName: INSERT) @nodeId(typeName: "CustomerNode") -} - -input CustomerInput @table(name: "CUSTOMER") { - customerId: Int @field(name: "CUSTOMER_ID") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/multipleFields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/multipleFields/schema.graphqls deleted file mode 100644 index af834701d2..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/multipleFields/schema.graphqls +++ /dev/null @@ -1,10 +0,0 @@ -type Mutation { - mutation(in: CustomerInput!): ID @mutation(typeName: INSERT) @nodeId(typeName: "CustomerNode") -} - -input CustomerInput @table(name: "CUSTOMER") { - addressId: Int! @field(name: "ADDRESS_ID") - id: ID! @nodeId - firstName: String! @field(name: "FIRST_NAME") - lastName: String! @field(name: "LAST_NAME") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/nodeId/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/nodeId/schema.graphqls deleted file mode 100644 index 130be7cae2..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/nodeId/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerNodeInputTable!): ID @mutation(typeName: INSERT) @nodeId(typeName: "CustomerNode") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/nodeIdWithMultipleFields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/nodeIdWithMultipleFields/schema.graphqls deleted file mode 100644 index aae0235eea..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/nodeIdWithMultipleFields/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Mutation { - mutation(in: VacationDestinationInput!): ID @mutation(typeName: INSERT) @nodeId(typeName: "VacationDestination") -} - -type VacationDestination implements Node @node @table(name: "VACATION_DESTINATION") { - id: ID! @nodeId -} - -input VacationDestinationInput @table(name: "VACATION_DESTINATION") { - id: ID! @nodeId -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/nullableField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/nullableField/schema.graphqls deleted file mode 100644 index 7b7c88d9df..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/nullableField/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: CustomerInput!): ID @mutation(typeName: INSERT) @nodeId(typeName: "CustomerNode") -} - -input CustomerInput @table(name: "CUSTOMER") { - addressId: Int @field(name: "ADDRESS_ID") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/nullableNodeId/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/nullableNodeId/schema.graphqls deleted file mode 100644 index 943fb26faa..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/nullableNodeId/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Mutation { - mutation(in: VacationDestinationInput!): ID @mutation(typeName: INSERT) @nodeId(typeName: "VacationDestination") -} - -type VacationDestination implements Node @node(keyColumns: ["COUNTRY_NAME", "DESTINATION_ID"], typeId: "V_D") @table(name: "VACATION_DESTINATION") { - id: ID! @nodeId -} - -input VacationDestinationInput @table(name: "VACATION_DESTINATION") { - id: ID @nodeId -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/referenceNodeId/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/referenceNodeId/schema.graphqls deleted file mode 100644 index 05eca39673..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/referenceNodeId/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Mutation { - mutation(in: CustomerInput!): ID @mutation(typeName: INSERT) @nodeId(typeName: "CustomerNode") -} - -input CustomerInput @table(name: "CUSTOMER") { - addressId: ID! @nodeId(typeName: "Address") -} - -type Address implements Node @node @table { - id: ID! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/referenceNodeIdWithColumnNameMismatch/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/referenceNodeIdWithColumnNameMismatch/schema.graphqls deleted file mode 100644 index cfd4c28730..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/insert/referenceNodeIdWithColumnNameMismatch/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Mutation { - mutation(in: FilmInput!): ID @mutation(typeName: INSERT) @nodeId(typeName: "Film") -} - -type Film implements Node @node @table { - id: ID! -} - -type Language implements Node @node(keyColumns: "LANGUAGE_ID", typeId: "L") @table { - id: ID! -} - -input FilmInput @table(name: "FILM") { - originalLanguageId: ID @nodeId(typeName: "Language") @reference(path: {key: "FILM__FILM_ORIGINAL_LANGUAGE_ID_FKEY"}) -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/id/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/id/schema.graphqls deleted file mode 100644 index 0e0dc51087..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/id/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerNodeInputTable!): ID @mutation(typeName: DELETE) @field(name: "id") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/nodeId/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/nodeId/schema.graphqls deleted file mode 100644 index 9d687bb304..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/nodeId/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerNodeInputTable!): ID @mutation(typeName: DELETE) @nodeId(typeName: "CustomerNode") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/nodeIdList/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/nodeIdList/schema.graphqls deleted file mode 100644 index f6f1c5df85..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/nodeIdList/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: [CustomerNodeInputTable!]!): [ID] @mutation(typeName: DELETE) @nodeId(typeName: "CustomerNode") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/scalar/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/scalar/schema.graphqls deleted file mode 100644 index 0b0437f437..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/scalar/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerNodeInputTable!): Int @mutation(typeName: DELETE) @field(name: "CUSTOMER_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/scalarList/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/scalarList/schema.graphqls deleted file mode 100644 index 941f892ca8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/scalarList/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: [CustomerNodeInputTable!]!): [Int] @mutation(typeName: DELETE) @field(name: "CUSTOMER_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/tableObject/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/tableObject/schema.graphqls deleted file mode 100644 index b522ab7104..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/tableObject/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerNodeInputTable!): CustomerNode @mutation(typeName: DELETE) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/tableObjectList/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/tableObjectList/schema.graphqls deleted file mode 100644 index 7ec860bdc8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/tableObjectList/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: [CustomerNodeInputTable!]!): [CustomerNode] @mutation(typeName: DELETE) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/tableObjectWithSplitQueryReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/tableObjectWithSplitQueryReference/schema.graphqls deleted file mode 100644 index 3b54f601bc..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/tableObjectWithSplitQueryReference/schema.graphqls +++ /dev/null @@ -1,16 +0,0 @@ -type Mutation { - mutation(in: CustomerInput!): Customer @mutation(typeName: INSERT) -} - -input CustomerInput @table(name: "CUSTOMER") { - customerId: Int! @field(name: "CUSTOMER_ID") -} - -type Customer implements Node @node @table { - id: ID! @nodeId - address: Address @splitQuery -} - -type Address @table { - addressId: Int @field(name: "ADDRESS_ID") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/tableObjectWithSubqueryReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/tableObjectWithSubqueryReference/schema.graphqls deleted file mode 100644 index 06f192892a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/tableObjectWithSubqueryReference/schema.graphqls +++ /dev/null @@ -1,16 +0,0 @@ -type Mutation { - mutation(in: CustomerInput!): Customer @mutation(typeName: INSERT) -} - -input CustomerInput @table(name: "CUSTOMER") { - customerId: Int! @field(name: "CUSTOMER_ID") -} - -type Customer implements Node @node @table { - id: ID! - address: Address -} - -type Address @table { - addressId: Int @field(name: "ADDRESS_ID") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/wrappedId/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/wrappedId/schema.graphqls deleted file mode 100644 index 5e465787b0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/wrappedId/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: CustomerNodeInputTable!): Wrapper @mutation(typeName: DELETE) -} - -type Wrapper { - id: ID @field(name: "id") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/wrappedNodeId/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/wrappedNodeId/schema.graphqls deleted file mode 100644 index d7913fe93e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/wrappedNodeId/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: CustomerNodeInputTable!): Wrapper @mutation(typeName: DELETE) -} - -type Wrapper { - id: ID @nodeId(typeName: "CustomerNode") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/wrappedNodeIdList/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/wrappedNodeIdList/schema.graphqls deleted file mode 100644 index 7da0d8289d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/wrappedNodeIdList/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: [CustomerNodeInputTable!]!): Wrapper @mutation(typeName: DELETE) -} - -type Wrapper { - id: [ID] @nodeId(typeName: "CustomerNode") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/wrappedScalar/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/wrappedScalar/schema.graphqls deleted file mode 100644 index 1df425638d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/wrappedScalar/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: CustomerNodeInputTable!): Wrapper @mutation(typeName: DELETE) -} - -type Wrapper { - customerId: Int @field(name: "CUSTOMER_ID") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/wrappedScalarList/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/wrappedScalarList/schema.graphqls deleted file mode 100644 index e1b53967eb..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/wrappedScalarList/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: [CustomerNodeInputTable!]!): Wrapper @mutation(typeName: DELETE) -} - -type Wrapper { - customerId: [Int] @field(name: "CUSTOMER_ID") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/wrappedTableObject/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/wrappedTableObject/schema.graphqls deleted file mode 100644 index 5f8a8aec1a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/wrappedTableObject/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: CustomerNodeInputTable!): Outer @mutation(typeName: DELETE) -} - -type Outer { - customers: CustomerNode -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/wrappedTableObjectList/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/wrappedTableObjectList/schema.graphqls deleted file mode 100644 index 550a610b32..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/returningResult/wrappedTableObjectList/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: [CustomerNodeInputTable!]!): Outer @mutation(typeName: DELETE) -} - -type Outer { - customers: [CustomerNode] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/default/expected/MutationDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/default/expected/MutationDBQueries.java deleted file mode 100644 index 3cc50f5084..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/default/expected/MutationDBQueries.java +++ /dev/null @@ -1,16 +0,0 @@ -package fake.code.generated.queries.; - -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; - -import java.util.Arrays; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CustomerRecord; -import no.sikt.graphql.NodeIdStrategy; -import org.jooq.DSLContext; -import org.jooq.impl.DSL; - -public class MutationDBQueries { - public static int mutationForMutation(DSLContext _iv_ctx, NodeIdStrategy _iv_nodeIdStrategy, CustomerRecord _mi_inRecord) { - return _iv_ctx.transactionResult(_iv_config -> Arrays.stream(DSL.using(_iv_config).batchUpdate(_mi_inRecord).execute()).sum()); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/default/schema.graphqls deleted file mode 100644 index 3498a30c9c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/default/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerInputTable!): ID @mutation(typeName: UPDATE) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/delete/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/delete/schema.graphqls deleted file mode 100644 index ffe382e187..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/delete/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerInputTable!): ID @mutation(typeName: DELETE) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/emptyInputListForUpdate/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/emptyInputListForUpdate/schema.graphqls deleted file mode 100644 index ce9d34e230..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/emptyInputListForUpdate/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Mutation { - mutation(in: [CustomerInput]): [Customer] @mutation(typeName: UPDATE) -} - -input CustomerInput @table(name: "CUSTOMER") { - customerId: Int! @field(name: "CUSTOMER_ID") -} - -type Customer implements Node @node @table { - id: ID! @nodeId -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/emptyInputListForUpsert/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/emptyInputListForUpsert/schema.graphqls deleted file mode 100644 index ca49f20d96..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/emptyInputListForUpsert/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Mutation { - mutation(in: [CustomerInput]): [Customer] @mutation(typeName: UPSERT) -} - -input CustomerInput @table(name: "CUSTOMER") { - customerId: Int! @field(name: "CUSTOMER_ID") -} - -type Customer implements Node @node @table { - id: ID! @nodeId -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/extraField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/extraField/schema.graphqls deleted file mode 100644 index 69345fd52b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/extraField/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerInputTable, id: ID): ID @mutation(typeName: UPDATE) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/inputRecordWithNonPkField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/inputRecordWithNonPkField/schema.graphqls deleted file mode 100644 index eed8b5609a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/inputRecordWithNonPkField/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Mutation { - mutation(in: CustomerInputTableWithName): ID @mutation(typeName: UPDATE) -} - - -input CustomerInputTableWithName @table(name: "CUSTOMER") { - id: ID! - firstName: String! @field(name: "FIRST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/insert/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/insert/schema.graphqls deleted file mode 100644 index b4e6b9cfc9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/insert/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerInputTable): ID @mutation(typeName: INSERT) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/listed/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/listed/schema.graphqls deleted file mode 100644 index 665aef50aa..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/listed/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: [CustomerInputTable]): ID @mutation(typeName: UPDATE) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/nestedOutput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/nestedOutput/schema.graphqls deleted file mode 100644 index 4133ae2d89..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/nestedOutput/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: [CustomerInputTable!]!): Outer @mutation(typeName: UPDATE) -} - -type Outer { - customers: [CustomerTable!]! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/nestedOutputWithErrorField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/nestedOutputWithErrorField/schema.graphqls deleted file mode 100644 index 173755f07b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/nestedOutputWithErrorField/schema.graphqls +++ /dev/null @@ -1,13 +0,0 @@ -type Mutation { - mutation(in: [CustomerInputTable!]!): Outer @mutation(typeName: UPDATE) -} - -type Outer { - customers: [CustomerTable!]! - errors: [UpdateError!] -} - -type UpdateError implements Error { - path: [String] - message: String -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/tableWithCompositePrimaryKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/tableWithCompositePrimaryKey/schema.graphqls deleted file mode 100644 index bffbd877e6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/tableWithCompositePrimaryKey/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: VacationDestinationInput): ID @mutation(typeName: INSERT) -} - -input VacationDestinationInput @table(name: "VACATION_DESTINATION") { - id: ID! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/tableWithCompositePrimaryKeyListed/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/tableWithCompositePrimaryKeyListed/schema.graphqls deleted file mode 100644 index d2562a1dd8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/tableWithCompositePrimaryKeyListed/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: [VacationDestinationInput]): [ID] @mutation(typeName: INSERT) -} - -input VacationDestinationInput @table(name: "VACATION_DESTINATION") { - id: ID! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/twoDifferentRecords/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/twoDifferentRecords/schema.graphqls deleted file mode 100644 index 4e2ca42a62..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/twoDifferentRecords/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in1: CustomerInputTable, in2: Address): ID @mutation(typeName: UPDATE) -} - -input Address @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/twoListedRecords/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/twoListedRecords/schema.graphqls deleted file mode 100644 index 253e97e692..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/twoListedRecords/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in1: [CustomerInputTable], in2: [CustomerInputTable]): ID @mutation(typeName: UPDATE) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/twoRecords/expected/MutationDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/twoRecords/expected/MutationDBQueries.java deleted file mode 100644 index ae499c8826..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/twoRecords/expected/MutationDBQueries.java +++ /dev/null @@ -1,20 +0,0 @@ -package fake.code.generated.queries.; - -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; - -import java.util.ArrayList; -import java.util.Arrays; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CustomerRecord; -import no.sikt.graphql.NodeIdStrategy; -import org.jooq.DSLContext; -import org.jooq.impl.DSL; - -public class MutationDBQueries { - public static int mutationForMutation(DSLContext _iv_ctx, NodeIdStrategy _iv_nodeIdStrategy, CustomerRecord _mi_in1Record, CustomerRecord _mi_in2Record) { - var _iv_recordList = new ArrayList(); - _iv_recordList.add(_mi_in1Record); - _iv_recordList.add(_mi_in2Record); - return _iv_ctx.transactionResult(_iv_config -> Arrays.stream(DSL.using(_iv_config).batchUpdate(_iv_recordList).execute()).sum()); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/twoRecords/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/twoRecords/schema.graphqls deleted file mode 100644 index 784ff4102d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/twoRecords/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in1: CustomerInputTable, in2: CustomerInputTable): ID @mutation(typeName: UPDATE) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/twoRecordsOneListed/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/twoRecordsOneListed/schema.graphqls deleted file mode 100644 index ea3d8c2f7b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/twoRecordsOneListed/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in1: [CustomerInputTable], in2: CustomerInputTable): ID @mutation(typeName: UPDATE) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/upsert/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/upsert/schema.graphqls deleted file mode 100644 index 9aad151e43..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/upsert/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerInputTable): ID @mutation(typeName: UPSERT) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/upsertNodeId/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/upsertNodeId/schema.graphqls deleted file mode 100644 index dde9537f18..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/upsertNodeId/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Mutation { - mutation(in: VacationDestionationInput): VacationDestination @mutation(typeName: UPSERT) -} - -type VacationDestination implements Node @node @table(name: "VACATION_DESTINATION") { - id: ID! -} - -input VacationDestionationInput @table(name: "VACATION_DESTINATION") { - id: ID! @nodeId(typeName: "VacationDestination") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/upsertNodeIdCustomKeyColumns/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/upsertNodeIdCustomKeyColumns/schema.graphqls deleted file mode 100644 index c40081ee27..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/upsertNodeIdCustomKeyColumns/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Mutation { - mutation(in: VacationDestionationInput): VacationDestination @mutation(typeName: UPSERT) -} - -type VacationDestination implements Node @node(keyColumns: ["KEY_COLUMN1", "KEY_COLUMN2"]) @table(name: "VACATION_DESTINATION") { - id: ID! -} - -input VacationDestionationInput @table(name: "VACATION_DESTINATION") { - id: ID! @nodeId(typeName: "VacationDestination") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/upsertNodeIdIterable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/upsertNodeIdIterable/schema.graphqls deleted file mode 100644 index 2dcc874eb3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/upsertNodeIdIterable/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Mutation { - mutation(in: [VacationDestionationInput]): [VacationDestination] @mutation(typeName: UPSERT) -} - -type VacationDestination implements Node @node @table(name: "VACATION_DESTINATION") { - id: ID! -} - -input VacationDestionationInput @table(name: "VACATION_DESTINATION") { - id: ID! @nodeId(typeName: "VacationDestination") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/upsertNodeIdWithImplicitTypeName/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/upsertNodeIdWithImplicitTypeName/schema.graphqls deleted file mode 100644 index 598cf1fa5d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/edit/withBatching/upsertNodeIdWithImplicitTypeName/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Mutation { - mutation(in: VacationDestionationInput): VacationDestination @mutation(typeName: UPSERT) -} - -type VacationDestination implements Node @node @table(name: "VACATION_DESTINATION") { - id: ID! @nodeId -} - -input VacationDestionationInput @table(name: "VACATION_DESTINATION") { - id: ID! @nodeId -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onEnum/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onEnum/schema.graphqls deleted file mode 100644 index bdd5acfae4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onEnum/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(enumInput: DummyEnumConverted! @condition(condition: {name: "QUERY_FETCH_CONDITION"})): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onField/schema.graphqls deleted file mode 100644 index 3c9e7b66fa..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onField/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(email: String!): CustomerTable @condition(condition: {name: "QUERY_FETCH_CONDITION"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onFieldInInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onFieldInInput/schema.graphqls deleted file mode 100644 index 71ca6a059f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onFieldInInput/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: Input!): CustomerTable -} - -input Input { - id: ID! @condition(condition: {name: "QUERY_FETCH_CONDITION"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onFieldMultipleParams/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onFieldMultipleParams/schema.graphqls deleted file mode 100644 index 6aade5f5d2..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onFieldMultipleParams/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(email: String!, name: String! @field(name: "FIRST_NAME")): CustomerTable @condition(condition: {name: "QUERY_FETCH_CONDITION"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onFieldNestedInputParam/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onFieldNestedInputParam/schema.graphqls deleted file mode 100644 index 614d066dc4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onFieldNestedInputParam/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query( - staff: StaffInput! - ) : [Staff] @condition(condition: {name: "QUERY_FETCH_STAFF_CONDITION", method: "staff"} ) -} - -input StaffInput { - name: NameInput! - email: String! - active: Boolean! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onFieldOverride/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onFieldOverride/schema.graphqls deleted file mode 100644 index 76acc0c746..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onFieldOverride/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(email: String!): CustomerTable @condition(condition: {name: "QUERY_FETCH_CONDITION"}, override: true) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onFieldOverrideInputParam/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onFieldOverrideInputParam/schema.graphqls deleted file mode 100644 index e494d01447..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onFieldOverrideInputParam/schema.graphqls +++ /dev/null @@ -1,6 +0,0 @@ -type Query { - query( - name: NameInput! - active: Boolean - ) : [Staff] @condition(condition: {name: "QUERY_FETCH_STAFF_CONDITION", method: "field"}, override: true) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onFieldOverrideNestedInputParam/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onFieldOverrideNestedInputParam/schema.graphqls deleted file mode 100644 index cb0a4aae48..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onFieldOverrideNestedInputParam/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query( - staff: StaffInput! - ) : [Staff] @condition(condition: {name: "QUERY_FETCH_STAFF_CONDITION", method: "staff"}, override: true) -} - -input StaffInput { - name: NameInput! - email: String! - active: Boolean! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onFieldReturningSingleTableInterface/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onFieldReturningSingleTableInterface/schema.graphqls deleted file mode 100644 index 7d4ab893b6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onFieldReturningSingleTableInterface/schema.graphqls +++ /dev/null @@ -1,16 +0,0 @@ -type Query { - address(filter: AddressInput!): [Address] @condition(condition: {name: "QUERY_FETCH_ADDRESS_INTERFACE_CONDITION"}) -} - -input AddressInput { - postalCode: String! @field(name: "POSTAL_CODE") -} - -interface Address @table(name: "ADDRESS") @discriminate(on: "DISTRICT"){ - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressInDistrictOne implements Address @table(name: "ADDRESS") @discriminator(value: "ONE") { - id: ID - postalCode: String @field(name: "POSTAL_CODE") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onFieldWithContextField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onFieldWithContextField/schema.graphqls deleted file mode 100644 index f704686c8e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onFieldWithContextField/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(email: String!): CustomerTable @condition(condition: {name: "CONTEXT_CONDITION"}, contextArguments: "ctxField") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onInputAndScalarParams/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onInputAndScalarParams/schema.graphqls deleted file mode 100644 index 84837860ba..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onInputAndScalarParams/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query( - name: NameInput! @condition(condition: {name: "QUERY_FETCH_STAFF_CONDITION", method: "name"}) - email: String @condition(condition: {name: "QUERY_FETCH_STAFF_CONDITION", method: "email"}) - active: Boolean! - ) : [Staff] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onInputOverrideAndScalarParams/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onInputOverrideAndScalarParams/schema.graphqls deleted file mode 100644 index a5d0ebc1e6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onInputOverrideAndScalarParams/schema.graphqls +++ /dev/null @@ -1,6 +0,0 @@ -type Query { - query( - name: NameInput! @condition(condition: {name: "QUERY_FETCH_STAFF_CONDITION", method: "name"}, override: true) - email: String! @condition(condition: {name: "QUERY_FETCH_STAFF_CONDITION", method: "email"}) - ) : [Staff] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onInputParam/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onInputParam/schema.graphqls deleted file mode 100644 index f77de3eeee..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onInputParam/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Query { - query( - name: NameInput! @condition(condition: {name: "QUERY_FETCH_STAFF_CONDITION", method: "name"}) - ) : [Staff] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onInputParamAndField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onInputParamAndField/schema.graphqls deleted file mode 100644 index 26a3677949..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onInputParamAndField/schema.graphqls +++ /dev/null @@ -1,6 +0,0 @@ -type Query { - query( - name: NameInput! @condition(condition: {name: "QUERY_FETCH_STAFF_CONDITION", method: "name"}) - active: Boolean - ) : [Staff] @condition(condition: {name: "QUERY_FETCH_STAFF_CONDITION", method: "field"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onInputParamAndFieldOverride/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onInputParamAndFieldOverride/schema.graphqls deleted file mode 100644 index 51d54a1d8d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onInputParamAndFieldOverride/schema.graphqls +++ /dev/null @@ -1,6 +0,0 @@ -type Query { - query( - name: NameInput! @condition(condition: {name: "QUERY_FETCH_STAFF_CONDITION", method: "name"}) - active: Boolean! - ) : [Staff] @condition(condition: {name: "QUERY_FETCH_STAFF_CONDITION", method: "field"}, override: true) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onInputParamAndFieldOverrideBoth/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onInputParamAndFieldOverrideBoth/schema.graphqls deleted file mode 100644 index ecf5811937..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onInputParamAndFieldOverrideBoth/schema.graphqls +++ /dev/null @@ -1,6 +0,0 @@ -type Query { - query( - name: NameInput! @condition(condition: {name: "QUERY_FETCH_STAFF_CONDITION", method: "name"}, override: true) - active: Boolean - ) : [Staff] @condition(condition: {name: "QUERY_FETCH_STAFF_CONDITION", method: "field"}, override: true) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onInputParamOverride/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onInputParamOverride/schema.graphqls deleted file mode 100644 index a7f5689bd7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onInputParamOverride/schema.graphqls +++ /dev/null @@ -1,6 +0,0 @@ -type Query { - query( - name: NameInput! @condition(condition: {name: "QUERY_FETCH_STAFF_CONDITION", method: "name"}, override: true) - active: Boolean - ) : [Staff] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onInputParamWithContextField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onInputParamWithContextField/schema.graphqls deleted file mode 100644 index 1d9152e6b9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onInputParamWithContextField/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: In): CustomerTable -} - -input In { - email: String! @condition(condition: {name: "CONTEXT_CONDITION"}, contextArguments: "ctxField") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onInputParamWithWrongCapitalisation/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onInputParamWithWrongCapitalisation/schema.graphqls deleted file mode 100644 index 74d4c4fee8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onInputParamWithWrongCapitalisation/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Query { - query( - NAME: NameInput! @field(name: "name") @condition(condition: {name: "QUERY_FETCH_STAFF_CONDITION", method: "name"}) - ) : [Staff] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onListedEnum/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onListedEnum/schema.graphqls deleted file mode 100644 index 1c6c77233c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onListedEnum/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(enumInputList: [DummyEnumConverted!]! @condition(condition: {name: "QUERY_FETCH_CONDITION"})): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onListedNodeIdParam/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onListedNodeIdParam/schema.graphqls deleted file mode 100644 index 9a3c42e6f0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onListedNodeIdParam/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(customerIds: [ID!]! @nodeId(typeName: "Customer") @condition(condition: {name: "QUERY_FETCH_CONDITION", method: "queryCustomerNodeIds"})): Customer -} - -type Customer implements Node @node(typeId: "C") @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onListedNodeIdParamAsString/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onListedNodeIdParamAsString/schema.graphqls deleted file mode 100644 index 384b2d4f65..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onListedNodeIdParamAsString/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(customerIds: [ID!]! @nodeId(typeName: "Customer") @condition(condition: {name: "QUERY_FETCH_CONDITION", method: "queryCustomerNodeIdsAsString"})): Customer -} - -type Customer implements Node @node(typeId: "C") @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onListedParam/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onListedParam/schema.graphqls deleted file mode 100644 index e1e6d017ef..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onListedParam/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(emails: [String!]! @condition(condition: {name: "QUERY_FETCH_CONDITION"})): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onMultiLevelInputAndFieldDifferentOverride/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onMultiLevelInputAndFieldDifferentOverride/schema.graphqls deleted file mode 100644 index 339878ca2c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onMultiLevelInputAndFieldDifferentOverride/schema.graphqls +++ /dev/null @@ -1,19 +0,0 @@ -type Query { - query( - staff: StaffInput! - ) : [Staff] @condition(condition: {name: "QUERY_FETCH_STAFF_CONDITION", method: "staff"}, override: true) -} - -input StaffInput { - info: ContactInfoInput! - active: Boolean! -} - -input ContactInfoInput { - name: NameInput! @condition(condition: {name: "QUERY_FETCH_STAFF_CONDITION", method: "name"}, override: true) - jobEmail: EmailInput! @condition(condition: {name: "QUERY_FETCH_STAFF_CONDITION", method: "email"}) -} - -input EmailInput { - email: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onMultiLevelInputAndScalarDifferentOverride/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onMultiLevelInputAndScalarDifferentOverride/schema.graphqls deleted file mode 100644 index b7049a2241..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onMultiLevelInputAndScalarDifferentOverride/schema.graphqls +++ /dev/null @@ -1,25 +0,0 @@ -type Query { - query( - staff: StaffInput! @condition(condition: {name: "QUERY_FETCH_STAFF_CONDITION", method: "staff"}) - ) : [Staff] -} - -input StaffInput { - info: ContactInfoInput! - active: Boolean! -} - -input ContactInfoInput { - name: NameConditionInput! @condition(condition: {name: "QUERY_FETCH_STAFF_CONDITION", method: "name"}, override: true) - jobEmail: EmailInput! @condition(condition: {name: "QUERY_FETCH_STAFF_CONDITION", method: "email"}) - -} - -input NameConditionInput { - firstname: String! @field(name: "FIRST_NAME") @condition(condition: {name: "QUERY_FETCH_STAFF_CONDITION", method: "firstname"}) - lastname: String! @field(name: "LAST_NAME") @condition(condition: {name: "QUERY_FETCH_STAFF_CONDITION", method: "lastname"}) -} - -input EmailInput { - email: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onMultiLevelInputDifferentOverride/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onMultiLevelInputDifferentOverride/schema.graphqls deleted file mode 100644 index 6a94602383..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onMultiLevelInputDifferentOverride/schema.graphqls +++ /dev/null @@ -1,19 +0,0 @@ -type Query { - query( - staff: StaffInput! - ) : [Staff] -} - -input StaffInput { - info: ContactInfoInput! - active: Boolean! -} - -input ContactInfoInput { - name: NameInput! @condition(condition: {name: "QUERY_FETCH_STAFF_CONDITION", method: "name"}, override: true) - jobEmail: EmailInput! @condition(condition: {name: "QUERY_FETCH_STAFF_CONDITION", method: "email"}) -} - -input EmailInput { - email: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onMultipleParamsWithContextFields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onMultipleParamsWithContextFields/schema.graphqls deleted file mode 100644 index 40a9a7ca39..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onMultipleParamsWithContextFields/schema.graphqls +++ /dev/null @@ -1,6 +0,0 @@ -type Query { - query( - email1: String! @condition(condition: {name: "CONTEXT_CONDITION", method: "email"}, contextArguments: "ctxField1") - email2: String! @condition(condition: {name: "CONTEXT_CONDITION", method: "email"}, contextArguments: "ctxField2") - ): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onMultipleParamsWithSameContextField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onMultipleParamsWithSameContextField/schema.graphqls deleted file mode 100644 index 63cd535ebc..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onMultipleParamsWithSameContextField/schema.graphqls +++ /dev/null @@ -1,6 +0,0 @@ -type Query { - query( - email1: String! @condition(condition: {name: "CONTEXT_CONDITION", method: "email"}, contextArguments: "ctxField") - email2: String! @condition(condition: {name: "CONTEXT_CONDITION", method: "email"}, contextArguments: "ctxField") - ): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onNestedInputOverrideParam/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onNestedInputOverrideParam/schema.graphqls deleted file mode 100644 index 7f8e29ab42..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onNestedInputOverrideParam/schema.graphqls +++ /dev/null @@ -1,10 +0,0 @@ -type Query { - query( - staff: StaffInput! @condition(condition: {name: "QUERY_FETCH_STAFF_CONDITION", method: "staffMin"}, override: true) - ) : [Staff] -} - -input StaffInput { - name: NameInput! - active: Boolean! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onNestedInputParam/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onNestedInputParam/schema.graphqls deleted file mode 100644 index 2435a0b610..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onNestedInputParam/schema.graphqls +++ /dev/null @@ -1,10 +0,0 @@ -type Query { - query( - staff: StaffInput! @condition(condition: {name: "QUERY_FETCH_STAFF_CONDITION", method: "staffMin"}) - ) : [Staff] -} - -input StaffInput { - name: NameInput! - active: Boolean -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onNestedNodeIdParam/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onNestedNodeIdParam/schema.graphqls deleted file mode 100644 index cb3d722d1a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onNestedNodeIdParam/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(filter: CustomerInput! @condition(condition: {name: "QUERY_FETCH_CONDITION", method: "queryCustomerNodeId"})): Customer -} - -type Customer implements Node @node(typeId: "C") @table { - id: ID! @nodeId -} - -input CustomerInput { - customerId: ID! @nodeId(typeName: "Customer") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onNestedNodeIdParamWithOtherField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onNestedNodeIdParamWithOtherField/schema.graphqls deleted file mode 100644 index 931dfee9d6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onNestedNodeIdParamWithOtherField/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - query(filter: CustomerInput! @condition(condition: {name: "QUERY_FETCH_CONDITION", method: "queryCustomerIdAndNodeId"})): Customer -} - -type Customer implements Node @node(typeId: "C") @table { - id: ID! @nodeId -} - -input CustomerInput { - customerId: Int! @field(name: "CUSTOMER_ID") - customerNodeId: ID! @nodeId(typeName: "Customer") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onNodeIdParam/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onNodeIdParam/schema.graphqls deleted file mode 100644 index 1b361ce556..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onNodeIdParam/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(customerId: ID! @nodeId(typeName: "Customer") @condition(condition: {name: "QUERY_FETCH_CONDITION", method: "queryCustomerNodeId"})): Customer -} - -type Customer implements Node @node(typeId: "C") @table { - id: ID! @nodeId -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onNodeIdParamAsString/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onNodeIdParamAsString/schema.graphqls deleted file mode 100644 index f428c09485..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onNodeIdParamAsString/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(customerId: ID! @nodeId(typeName: "Customer") @condition(condition: {name: "QUERY_FETCH_CONDITION", method: "queryCustomerNodeIdAsString"})): Customer -} - -type Customer implements Node @node(typeId: "C") @table { - id: ID! @nodeId -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParam/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParam/schema.graphqls deleted file mode 100644 index 364aad61dd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParam/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(email: String! @condition(condition: {name: "QUERY_FETCH_CONDITION"})): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParamAndField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParamAndField/schema.graphqls deleted file mode 100644 index 6a128cf178..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParamAndField/schema.graphqls +++ /dev/null @@ -1,6 +0,0 @@ -type Query { - query( - email: String! @condition(condition: {name: "QUERY_FETCH_CONDITION"}) - name: String! @field(name: "FIRST_NAME") - ): CustomerTable @condition(condition: {name: "QUERY_FETCH_CONDITION"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParamAndOverrideField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParamAndOverrideField/schema.graphqls deleted file mode 100644 index 5b7b5a62ff..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParamAndOverrideField/schema.graphqls +++ /dev/null @@ -1,6 +0,0 @@ -type Query { - query( - email: String! @condition(condition: {name: "QUERY_FETCH_CONDITION"}) - name: String! @field(name: "FIRST_NAME") - ): CustomerTable @condition(condition: {name: "QUERY_FETCH_CONDITION"}, override: true) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParamOverride/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParamOverride/schema.graphqls deleted file mode 100644 index 43ff326f75..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParamOverride/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(email: String @condition(condition: {name: "QUERY_FETCH_CONDITION"}, override: true)): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParamWithContextField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParamWithContextField/schema.graphqls deleted file mode 100644 index daff56711f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParamWithContextField/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(email: String! @condition(condition: {name: "CONTEXT_CONDITION"}, contextArguments: "ctxField")): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParamWithEnum/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParamWithEnum/schema.graphqls deleted file mode 100644 index af4ea334ec..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParamWithEnum/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(enumInput: DummyEnumConverted!): CustomerTable @condition(condition: {name: "QUERY_FETCH_CONDITION", method: "queryEnum"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParamWithEnumInInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParamWithEnumInInput/schema.graphqls deleted file mode 100644 index 0456b1fb17..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParamWithEnumInInput/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: Input!): CustomerTable -} - -input Input { - e: DummyEnumConverted! @condition(condition: {name: "QUERY_FETCH_CONDITION", method: "queryEnum"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParamWithListedEnum/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParamWithListedEnum/schema.graphqls deleted file mode 100644 index ca6c558226..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParamWithListedEnum/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(enumInputList: [DummyEnumConverted!]!): CustomerTable @condition(condition: {name: "QUERY_FETCH_CONDITION", method: "queryEnumList"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParamWithMultipleContextFields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParamWithMultipleContextFields/schema.graphqls deleted file mode 100644 index 3d48f778a7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParamWithMultipleContextFields/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(email: String! @condition(condition: {name: "CONTEXT_CONDITION"}, contextArguments: ["ctxField1", "ctxField2"])): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParamWithOtherField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParamWithOtherField/schema.graphqls deleted file mode 100644 index c7f02071b1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParamWithOtherField/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(email: String! @condition(condition: {name: "QUERY_FETCH_CONDITION"}), name: String! @field(name: "FIRST_NAME")): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParamWithWrongCapitalisation/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParamWithWrongCapitalisation/schema.graphqls deleted file mode 100644 index 17915f0256..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onParamWithWrongCapitalisation/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(STRING: String! @field(name: "email") @condition(condition: {name: "QUERY_FETCH_CONDITION", method: "email"})): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onStringEnum/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onStringEnum/schema.graphqls deleted file mode 100644 index 7faa391db9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/onStringEnum/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(enumInput: DummyEnum! @condition(condition: {name: "QUERY_FETCH_CONDITION", method: "email"})): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/withInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/withInput/schema.graphqls deleted file mode 100644 index e1edfe4dd1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/withInput/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(in: DummyInput!): CustomerTable @condition(condition: {name: "QUERY_FETCH_CONDITION"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/withListedInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/withListedInput/schema.graphqls deleted file mode 100644 index 71b8f17443..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/withListedInput/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(input: [Input!]!): CustomerTable @condition(condition: {name: "QUERY_FETCH_CONDITION"}) -} - -input Input { - id: ID! # Must be non-nullable. -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/withMethodNameOverride/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/withMethodNameOverride/schema.graphqls deleted file mode 100644 index 723f628dda..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/conditions/withMethodNameOverride/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(someID: ID! @condition(condition: {name: "QUERY_FETCH_CONDITION", method: "id"})): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/default/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/default/expected/QueryDBQueries.java deleted file mode 100644 index 2441f0c16c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/default/expected/QueryDBQueries.java +++ /dev/null @@ -1,18 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; - -import java.lang.Integer; -import org.jooq.DSLContext; -import org.jooq.impl.DSL; - -public class QueryDBQueries { - public static Integer countQueryForQuery(DSLContext _iv_ctx) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return _iv_ctx - .select(DSL.count()) - .from(_a_customer) - .fetchOne(0, Integer.class); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/default/schema.graphqls deleted file mode 100644 index 14e47f2136..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/default/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(first: Int = 100, after: String): CustomerConnection -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/multiTableInterface/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/multiTableInterface/expected/QueryDBQueries.java deleted file mode 100644 index bd95972d57..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/multiTableInterface/expected/QueryDBQueries.java +++ /dev/null @@ -1,26 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; - -import java.lang.Integer; - -import org.jooq.DSLContext; -import org.jooq.impl.DSL; - -public class QueryDBQueries { - public static Integer countPaymentsForQuery(DSLContext _iv_ctx) { - var _a_paymentp2007_01 = PAYMENT_P2007_01.as("paymentp200701_3585501569"); - var _a_paymentp2007_02 = PAYMENT_P2007_02.as("paymentp200702_1287600187"); - var countPaymentTypeOne = DSL.select(DSL.count().as("$count")).from(_a_paymentp2007_01); - var countPaymentTypeTwo = DSL.select(DSL.count().as("$count")).from(_a_paymentp2007_02); - - var unionCountQuery = countPaymentTypeTwo - .unionAll(countPaymentTypeOne) - .asTable(); - - return _iv_ctx.select(DSL.sum(unionCountQuery.field("$count", Integer.class))) - .from(unionCountQuery) - .fetchOne(0, Integer.class); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/multiTableInterface/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/multiTableInterface/schema.graphqls deleted file mode 100644 index 14a596e834..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/multiTableInterface/schema.graphqls +++ /dev/null @@ -1,26 +0,0 @@ -type Query { - payments(first: Int = 100, after: String): PaymentConnection -} - -interface Payment { - amount: Int -} - -type PaymentTypeOne implements Payment @table(name: "PAYMENT_P2007_01") { - amount: Int -} - -type PaymentTypeTwo implements Payment @table(name: "PAYMENT_P2007_02") { - amount: Int -} - -type PaymentConnection { - edges: [PaymentConnectionEdge] - nodes: [Payment!]! - totalCount: Int -} - -type PaymentConnectionEdge { - cursor: String - node: Payment -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/multiTableInterfaceSplitQuery/expected/PaymentDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/multiTableInterfaceSplitQuery/expected/PaymentDBQueries.java deleted file mode 100644 index f37bd0035f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/multiTableInterfaceSplitQuery/expected/PaymentDBQueries.java +++ /dev/null @@ -1,42 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; - -import java.lang.Integer; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.PaymentRecord; -import no.sikt.graphql.helpers.query.QueryHelper; -import org.jooq.DSLContext; -import org.jooq.Record2; -import org.jooq.impl.DSL; - -public class PaymentDBQueries { - public static Map<PaymentRecord, Integer> countStaffAndCustomersForPayment(DSLContext _iv_ctx, Set<PaymentRecord> _rk_payment) { - var _a_payment = PAYMENT.as("payment_1831371789"); - var _a_payment_1831371789_customer = _a_payment.customer().as("customer_1463568749"); - var _a_payment_1831371789_staff = _a_payment.staff().as("staff_2269035563"); - - var countCustomer = DSL.select(DSL.row(_a_payment.PAYMENT_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_payment.PAYMENT_ID)))) - .from(_a_payment) - .join(_a_payment_1831371789_customer) - .where(DSL.row(_a_payment.PAYMENT_ID).in(_rk_payment.stream().map(_iv_it -> _iv_it.key().valuesRow()).toList())); - - var countStaff = DSL.select(DSL.row(_a_payment.PAYMENT_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_payment.PAYMENT_ID)))) - .from(_a_payment) - .join(_a_payment_1831371789_staff) - .where(DSL.row(_a_payment.PAYMENT_ID).in(_rk_payment.stream().map(_iv_it -> _iv_it.key().valuesRow()).toList())); - - var unionCountQuery = countStaff - .unionAll(countCustomer) - .asTable(); - - return _iv_ctx.select(unionCountQuery.field(0), DSL.count()) - .from(unionCountQuery) - .groupBy(unionCountQuery.field(0)) - .fetchMap(_iv_r -> ((PaymentRecord) _iv_r.value1()), Record2::value2); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/multiTableInterfaceSplitQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/multiTableInterfaceSplitQuery/schema.graphqls deleted file mode 100644 index aabf27fd7f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/multiTableInterfaceSplitQuery/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - query: Payment @notGenerated -} - -type Payment @table { - staffAndCustomers(first: Int = 100, after: String): PersonWithEmailConnection -} - diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/multiTableInterfaceWithOtherField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/multiTableInterfaceWithOtherField/schema.graphqls deleted file mode 100644 index fccf124aa6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/multiTableInterfaceWithOtherField/schema.graphqls +++ /dev/null @@ -1,26 +0,0 @@ -type Query { - payments(customerId: String! @field(name: "CUSTOMER_ID"), first: Int = 100, after: String): PaymentConnection -} - -interface Payment { - amount: Int -} - -type PaymentTypeOne implements Payment @table(name: "PAYMENT_P2007_01") { - amount: Int -} - -type PaymentTypeTwo implements Payment @table(name: "PAYMENT_P2007_02") { - amount: Int -} - -type PaymentConnection { - edges: [PaymentConnectionEdge] - nodes: [Payment!]! - totalCount: Int -} - -type PaymentConnectionEdge { - cursor: String - node: Payment -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/nestedPaginatedQuery/expected/CityDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/nestedPaginatedQuery/expected/CityDBQueries.java deleted file mode 100644 index 285fe10b00..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/nestedPaginatedQuery/expected/CityDBQueries.java +++ /dev/null @@ -1,26 +0,0 @@ -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; -import java.lang.Integer; -import java.util.List; -import java.util.Map; -import java.util.Set; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CityRecord; -import no.sikt.graphql.helpers.query.QueryHelper; -import org.jooq.DSLContext; -import org.jooq.Record2; -import org.jooq.impl.DSL; - -public class CityDBQueries { - public static Map<CityRecord, Integer> countAddressesPaginatedForCity(DSLContext _iv_ctx, - Set<CityRecord> _rk_city) { - var _a_city = CITY.as("city_760939060"); - var _a_city_760939060_address = _a_city.address().as("address_609487378"); - return _iv_ctx - .select(DSL.row(_a_city.CITY_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_city.CITY_ID))), DSL.count()) - .from(_a_city) - .join(_a_city_760939060_address) - .where(DSL.row(_a_city.CITY_ID).in(_rk_city.stream().map(_iv_it -> _iv_it.key().valuesRow()).toList())) - .groupBy(_a_city.CITY_ID) - .fetchMap(Record2::value1, Record2::value2); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/nestedPaginatedQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/nestedPaginatedQuery/schema.graphqls deleted file mode 100644 index c2b48d004a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/nestedPaginatedQuery/schema.graphqls +++ /dev/null @@ -1,24 +0,0 @@ -type Query { - cities: [City] @asConnection -} - -type City implements Node @table{ - id: ID! - addressesPaginated(first: Int = 100, after: String): CityAddressesPaginatedConnection @splitQuery -} - -type CityAddressesPaginatedConnection { - edges: [CityAddressesPaginatedConnectionEdge] - pageInfo: PageInfo - nodes: [Address] - totalCount: Int -} - -type CityAddressesPaginatedConnectionEdge { - cursor: String - node: Address -} - -type Address implements Node @table { - id: ID! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/singleTableInterface/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/singleTableInterface/expected/QueryDBQueries.java deleted file mode 100644 index 1ccc989558..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/singleTableInterface/expected/QueryDBQueries.java +++ /dev/null @@ -1,19 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; - -import java.lang.Integer; -import org.jooq.DSLContext; -import org.jooq.impl.DSL; - -public class QueryDBQueries { - public static Integer countAddressForQuery(DSLContext _iv_ctx) { - var _a_address = ADDRESS.as("address_223244161"); - return _iv_ctx - .select(DSL.count()) - .from(_a_address) - .where(_a_address.DISTRICT.in("ONE", "TWO")) - .fetchOne(0, Integer.class); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/singleTableInterface/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/singleTableInterface/schema.graphqls deleted file mode 100644 index d83cd9fec3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/singleTableInterface/schema.graphqls +++ /dev/null @@ -1,28 +0,0 @@ -type Query { - address(first: Int = 100, after: String): AddressConnection -} - -interface Address @table(name: "ADDRESS") @discriminate(on: "DISTRICT"){ - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressInDistrictOne implements Address @table(name: "ADDRESS") @discriminator(value: "ONE") { - id: ID - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressInDistrictTwo implements Address @table(name: "ADDRESS") @discriminator(value: "TWO") { - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressConnection { - edges: [AddressConnectionEdge] - pageInfo: PageInfo - nodes: [Address!]! - totalCount: Int -} - -type AddressConnectionEdge { - cursor: String - node: Address -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/unionConnection/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/unionConnection/schema.graphqls deleted file mode 100644 index ea3e4bfb85..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/unionConnection/schema.graphqls +++ /dev/null @@ -1,14 +0,0 @@ -type Query { - someUnion(first: Int = 100, after: String): SomeUnionConnection -} - -union SomeUnion = PaymentTypeOne | PaymentTypeTwo - -type PaymentTypeOne @table(name: "PAYMENT_P2007_01") { - amount: Int -} - -type PaymentTypeTwo @table(name: "PAYMENT_P2007_02") { - amount: Int -} - diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/withOtherField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/withOtherField/schema.graphqls deleted file mode 100644 index 7bfd9ad8d4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/count/withOtherField/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(email: String!, first: Int = 100, after: String): CustomerConnection -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/defaultOrder/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/defaultOrder/default/schema.graphqls deleted file mode 100644 index 98c2a40f28..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/defaultOrder/default/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: [CustomerTable] @defaultOrder(index: "IDX_LAST_NAME") -} - -type CustomerTable @table(name: "Customer") { - name: String @field(name: "LAST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/defaultOrder/invalidIndex/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/defaultOrder/invalidIndex/schema.graphqls deleted file mode 100644 index a3a109b336..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/defaultOrder/invalidIndex/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: [CustomerTable] @defaultOrder(index: "NONEXISTENT_INDEX") -} - -type CustomerTable @table(name: "Customer") { - name: String @field(name: "LAST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/defaultOrder/paginated/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/defaultOrder/paginated/schema.graphqls deleted file mode 100644 index e55a4221d6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/defaultOrder/paginated/schema.graphqls +++ /dev/null @@ -1,24 +0,0 @@ -type Query { - query(first: Int, after: String): CustomerTableConnection @defaultOrder(index: "IDX_LAST_NAME") -} - -type CustomerTableConnection { - edges: [CustomerTableEdge] - pageInfo: PageInfo -} - -type CustomerTableEdge { - node: CustomerTable - cursor: String -} - -type PageInfo { - hasNextPage: Boolean! - hasPreviousPage: Boolean! - startCursor: String - endCursor: String -} - -type CustomerTable @table(name: "Customer") { - name: String @field(name: "LAST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/defaultOrder/withBothIndexAndFields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/defaultOrder/withBothIndexAndFields/schema.graphqls deleted file mode 100644 index 9b62d906fb..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/defaultOrder/withBothIndexAndFields/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: [CustomerTable] @defaultOrder(index: "IDX_LAST_NAME", fields: [{name: "LAST_NAME"}]) -} - -type CustomerTable @table(name: "Customer") { - name: String @field(name: "LAST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/defaultOrder/withDirection/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/defaultOrder/withDirection/schema.graphqls deleted file mode 100644 index 7b58ecf1c3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/defaultOrder/withDirection/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: [CustomerTable] @defaultOrder(index: "IDX_LAST_NAME", direction: DESC) -} - -type CustomerTable @table(name: "Customer") { - name: String @field(name: "LAST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/defaultOrder/withFields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/defaultOrder/withFields/schema.graphqls deleted file mode 100644 index 7e158e8e88..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/defaultOrder/withFields/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: [CustomerTable] @defaultOrder(fields: [{name: "LAST_NAME"}], direction: DESC) -} - -type CustomerTable @table(name: "Customer") { - name: String @field(name: "LAST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/defaultOrder/withFieldsAndCollation/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/defaultOrder/withFieldsAndCollation/schema.graphqls deleted file mode 100644 index 2c25c1e23d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/defaultOrder/withFieldsAndCollation/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: [CustomerTable] @defaultOrder(fields: [{name: "LAST_NAME", collate: "xdanish_ai"}]) -} - -type CustomerTable @table(name: "Customer") { - name: String @field(name: "LAST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/defaultOrder/withOrderBy/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/defaultOrder/withOrderBy/schema.graphqls deleted file mode 100644 index 6baf1fa97d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/defaultOrder/withOrderBy/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(orderBy: Order @orderBy): [CustomerTable] @defaultOrder(index: "IDX_LAST_NAME") -} - -enum OrderByField { - STORE @order(index: "IDX_FK_STORE_ID") -} - -type CustomerTable @table(name: "Customer") { - name: String @field(name: "LAST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/defaultOrder/withPrimaryKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/defaultOrder/withPrimaryKey/schema.graphqls deleted file mode 100644 index 5edb4d59ce..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/defaultOrder/withPrimaryKey/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: [CustomerTable] @defaultOrder(primaryKey: true, direction: DESC) -} - -type CustomerTable @table(name: "Customer") { - name: String @field(name: "LAST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/defaultOrder/withWrongField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/defaultOrder/withWrongField/schema.graphqls deleted file mode 100644 index 32d8e8d75c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/defaultOrder/withWrongField/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: [CustomerTable] @defaultOrder(fields: [{name: "NONEXISTENT_FIELD"}]) -} - -type CustomerTable @table(name: "Customer") { - name: String @field(name: "LAST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/entity/compoundKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/entity/compoundKey/schema.graphqls deleted file mode 100644 index 69b26ea76e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/entity/compoundKey/schema.graphqls +++ /dev/null @@ -1,6 +0,0 @@ -union _Entity = Customer - -type Customer @table @key(fields: "id first") { - id: ID - first: String! @field(name: "FIRST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/entity/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/entity/default/schema.graphqls deleted file mode 100644 index f294b842b9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/entity/default/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -union _Entity = Customer - -type Customer @table @key(fields: "id") { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/entity/nonStringKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/entity/nonStringKey/schema.graphqls deleted file mode 100644 index 73dde70eda..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/entity/nonStringKey/schema.graphqls +++ /dev/null @@ -1,6 +0,0 @@ -union _Entity = FilmInStock - -type FilmInStock @table(name: "FILM_IN_STOCK") @key(fields: "p_film_count") { - id: ID - p_film_count: Int -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/entity/twoKeys/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/entity/twoKeys/schema.graphqls deleted file mode 100644 index d29965f5b4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/entity/twoKeys/schema.graphqls +++ /dev/null @@ -1,6 +0,0 @@ -union _Entity = Customer - -type Customer @table @key(fields: "id") @key(fields: "first") { - id: ID - first: String! @field(name: "FIRST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/input/jOOQ/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/input/jOOQ/schema.graphqls deleted file mode 100644 index 877722d95f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/input/jOOQ/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(e: DummyEnumConverted @field(name: "RATING")): FilmTable -} - -type FilmTable @table(name: "FILM") { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/input/jOOQRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/input/jOOQRecord/schema.graphqls deleted file mode 100644 index c0e350accc..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/input/jOOQRecord/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(in: FilmInput!): FilmTable -} - -input FilmInput @table(name: "CUSTOMER") { - e: DummyEnumConverted @field(name: "RATING") -} - -type FilmTable @table(name: "FILM") { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/input/jOOQRecordString/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/input/jOOQRecordString/schema.graphqls deleted file mode 100644 index 5e439fddf0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/input/jOOQRecordString/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(in: FilmInput!): FilmTable -} - -input FilmInput @table(name: "CUSTOMER") { - e: DummyEnum @field(name: "RATING") -} - -type FilmTable @table(name: "FILM") { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/input/listedJOOQRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/input/listedJOOQRecord/schema.graphqls deleted file mode 100644 index 85d3589628..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/input/listedJOOQRecord/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(in: [FilmInput!]!): [FilmTable] -} - -input FilmInput @table(name: "CUSTOMER") { - e: DummyEnumConverted @field(name: "RATING") -} - -type FilmTable @table(name: "FILM") { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/input/listedJOOQRecordNested/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/input/listedJOOQRecordNested/schema.graphqls deleted file mode 100644 index 5fb872069b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/input/listedJOOQRecordNested/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - query(in: [FilmInput!]!): [FilmTable] -} - -input FilmInput @table(name: "CUSTOMER") { - nested: FilmInputNested -} - -input FilmInputNested { - e: DummyEnumConverted @field(name: "RATING") -} - -type FilmTable @table(name: "FILM") { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/input/string/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/input/string/schema.graphqls deleted file mode 100644 index 0952ad7f14..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/input/string/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(e: DummyEnum @field(name: "RATING")): FilmTable -} - -type FilmTable @table(name: "FILM") { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/input/stringMixedCase/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/input/stringMixedCase/schema.graphqls deleted file mode 100644 index e4728f5bc5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/input/stringMixedCase/schema.graphqls +++ /dev/null @@ -1,13 +0,0 @@ -type Query { - query(e: MixedCaseEnum @field(name: "RATING")): FilmTable -} - -type FilmTable @table(name: "FILM") { - id: ID -} - -enum MixedCaseEnum { - UPPER @field(name: "UPPER") - LOWER @field(name: "lower") - MIXED @field(name: "mIxEd") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/output/jOOQ/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/output/jOOQ/schema.graphqls deleted file mode 100644 index 186751cdaf..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/output/jOOQ/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - query: FilmTable -} - -type FilmTable @table(name: "FILM") { - id: ID - e: DummyEnumConverted @field(name: "RATING") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/output/jOOQSubquery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/output/jOOQSubquery/schema.graphqls deleted file mode 100644 index 611865848d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/output/jOOQSubquery/schema.graphqls +++ /dev/null @@ -1,13 +0,0 @@ -type Query { - query: Inventory -} - -type Inventory @table(name: "INVENTORY") { - id: ID - film: FilmTable -} - -type FilmTable @table(name: "FILM") { - id: ID - e: DummyEnumConverted @field(name: "RATING") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/output/string/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/output/string/schema.graphqls deleted file mode 100644 index dc08eeec9f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/output/string/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - query: FilmTable -} - -type FilmTable @table(name: "FILM") { - id: ID - e: DummyEnum @field(name: "RATING") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/output/stringMixedCase/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/output/stringMixedCase/schema.graphqls deleted file mode 100644 index cf5c02a97d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/enums/output/stringMixedCase/schema.graphqls +++ /dev/null @@ -1,14 +0,0 @@ -type Query { - query: FilmTable -} - -type FilmTable @table(name: "FILM") { - id: ID - e: MixedCaseEnum @field(name: "RATING") -} - -enum MixedCaseEnum { - UPPER @field(name: "UPPER") - LOWER @field(name: "lower") - MIXED @field(name: "mIxEd") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/optional/default/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/optional/default/expected/QueryDBQueries.java deleted file mode 100644 index 26f2a9e752..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/optional/default/expected/QueryDBQueries.java +++ /dev/null @@ -1,29 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; - -import fake.graphql.example.model.CustomerTable; -import java.lang.String; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.SelectField; -import org.jooq.impl.DSL; - -public class QueryDBQueries { - public static CustomerTable queryForQuery(DSLContext _iv_ctx, String _mi_id, SelectionSet _iv_select) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return _iv_ctx - .select(queryForQuery_customerTable(_mi_id)) - .from(_a_customer) - .where(_mi_id != null ? _a_customer.hasId(_mi_id) : DSL.noCondition()) - .fetchOne(_iv_it -> _iv_it.into(CustomerTable.class)); - } - - private static SelectField<CustomerTable> queryForQuery_customerTable(String _mi_id) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return DSL.row(_a_customer.getId()).mapping(Functions.nullOnAllNull(CustomerTable::new)); - } -} - diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/optional/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/optional/default/schema.graphqls deleted file mode 100644 index 2559a51e5b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/optional/default/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(id: ID): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/optional/input/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/optional/input/schema.graphqls deleted file mode 100644 index f7b0b563c9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/optional/input/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(in: DummyInput): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/optional/list/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/optional/list/schema.graphqls deleted file mode 100644 index 332250658b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/optional/list/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(email: [String]): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/optional/listedNestedInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/optional/listedNestedInput/schema.graphqls deleted file mode 100644 index 7b0b01f7b6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/optional/listedNestedInput/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in0: [Wrapper]): CustomerTable -} - -input Wrapper { - in1: DummyInput! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/optional/nestedInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/optional/nestedInput/schema.graphqls deleted file mode 100644 index 323a50612f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/optional/nestedInput/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: Wrapper): CustomerTable -} - -input Wrapper { - in: DummyInput -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/optional/nestedListedInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/optional/nestedListedInput/schema.graphqls deleted file mode 100644 index 0e9cb6cd3c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/optional/nestedListedInput/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: Wrapper): CustomerTable -} - -input Wrapper { - in: [DummyInput] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/boolean/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/boolean/schema.graphqls deleted file mode 100644 index 97d9ce80e9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/boolean/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(bool: Boolean! @field(name: "ACTIVE")): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/default/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/default/expected/QueryDBQueries.java deleted file mode 100644 index d6fa5688a4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/default/expected/QueryDBQueries.java +++ /dev/null @@ -1,26 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; - -import fake.graphql.example.model.CustomerTable; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.SelectField; -import org.jooq.impl.DSL; - -public class QueryDBQueries { - public static CustomerTable queryForQuery(DSLContext _iv_ctx, SelectionSet _iv_select) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return _iv_ctx - .select(queryForQuery_customerTable()) - .from(_a_customer) - .fetchOne(_iv_it -> _iv_it.into(CustomerTable.class)); - } - - private static SelectField<CustomerTable> queryForQuery_customerTable() { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return DSL.row(_a_customer.getId()).mapping(Functions.nullOnAllNull(CustomerTable::new)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/default/schema.graphqls deleted file mode 100644 index dc06cf64fa..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/default/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query: CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/fieldOverride/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/fieldOverride/schema.graphqls deleted file mode 100644 index 2be5f35b43..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/fieldOverride/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(name: String! @field(name: "FIRST_NAME")): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/id/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/id/schema.graphqls deleted file mode 100644 index f569beebb8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/id/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(id: ID!): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/idList/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/idList/schema.graphqls deleted file mode 100644 index c14358ba4c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/idList/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(id: [ID!]!): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/idOther/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/idOther/schema.graphqls deleted file mode 100644 index 7540212ca4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/idOther/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(id: ID! @field(name: "addressId")): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/idOtherList/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/idOtherList/schema.graphqls deleted file mode 100644 index 6d39262d8c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/idOtherList/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(id: [ID!]! @field(name: "addressId")): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/input/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/input/schema.graphqls deleted file mode 100644 index 3a42cc0b68..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/input/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(in: DummyInput!): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/inputTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/inputTable/schema.graphqls deleted file mode 100644 index b38f9692d4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/inputTable/schema.graphqls +++ /dev/null @@ -1,20 +0,0 @@ -type Query { - filmWrappedWithInputTableAndTableField(input: FilmInput!): FilmContainer -} - -type FilmContainer { - films: Film -} - -type Film @table { - id: ID! - language: Language @reference(path: {key: "FILM__FILM_LANGUAGE_ID_FKEY"}) -} - -type Language @table { - name: String -} - -input FilmInput @table(name: "FILM") { - description: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/integer/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/integer/schema.graphqls deleted file mode 100644 index e4a501b613..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/integer/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(length: Int!): Film -} - -type Film @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/list/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/list/schema.graphqls deleted file mode 100644 index 0a7aaf392c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/list/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(email: [String!]!): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/multiLevelInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/multiLevelInput/schema.graphqls deleted file mode 100644 index 237fa8880c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/multiLevelInput/schema.graphqls +++ /dev/null @@ -1,19 +0,0 @@ -type Query { - multiLevelInput( - staff: StaffInput! - ) : [Staff] -} - -input StaffInput { - info: ContactInfoInput! - active: Boolean! -} - -input ContactInfoInput { - name: NameInput! - jobEmail: EmailInput! -} - -input EmailInput { - email: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/nestedInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/nestedInput/schema.graphqls deleted file mode 100644 index 8a8c9eacf4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/nestedInput/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: Wrapper!): CustomerTable -} - -input Wrapper { - in: DummyInput! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/nestedListedInputTwoFields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/nestedListedInputTwoFields/schema.graphqls deleted file mode 100644 index 5c3d45ce90..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/nestedListedInputTwoFields/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - query(in: Wrapper!): CustomerTable -} - -input Wrapper { - in: [Input]! -} - -input Input { - first: String! @field(name: "FIRST_NAME") - last: String! @field(name: "LAST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/onSingleTableInterface/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/onSingleTableInterface/schema.graphqls deleted file mode 100644 index c9b0123bfd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/onSingleTableInterface/schema.graphqls +++ /dev/null @@ -1,16 +0,0 @@ -type Query { - address(filter: AddressInput!): [Address] -} - -input AddressInput { - postalCode: String! @field(name: "POSTAL_CODE") -} - -interface Address @table(name: "ADDRESS") @discriminate(on: "DISTRICT"){ - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressInDistrictOne implements Address @table(name: "ADDRESS") @discriminator(value: "ONE") { - id: ID - postalCode: String @field(name: "POSTAL_CODE") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/onSplitQueryField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/onSplitQueryField/schema.graphqls deleted file mode 100644 index f355473dfb..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/onSplitQueryField/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Address -} - -type Address @table { - customer(email: String!): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/scalar/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/scalar/schema.graphqls deleted file mode 100644 index 782fc1a5b0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/scalar/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -scalar Date - -type Query { - query(createdDate: Date! @field(name: "CREATE_DATE")): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/string/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/string/expected/QueryDBQueries.java deleted file mode 100644 index e91e604291..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/string/expected/QueryDBQueries.java +++ /dev/null @@ -1,28 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; - -import fake.graphql.example.model.CustomerTable; -import java.lang.String; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.SelectField; -import org.jooq.impl.DSL; - -public class QueryDBQueries { - public static CustomerTable queryForQuery(DSLContext _iv_ctx, String _mi_email, SelectionSet _iv_select) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return _iv_ctx - .select(queryForQuery_customerTable(_mi_email)) - .from(_a_customer) - .where(_a_customer.EMAIL.eq(_mi_email)) - .fetchOne(_iv_it -> _iv_it.into(CustomerTable.class)); - } - - private static SelectField<CustomerTable> queryForQuery_customerTable(String _mi_email) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return DSL.row(_a_customer.getId()).mapping(Functions.nullOnAllNull(CustomerTable::new)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/string/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/string/schema.graphqls deleted file mode 100644 index 0201399773..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/string/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(email: String!): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/twoFields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/twoFields/schema.graphqls deleted file mode 100644 index 750428fecf..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/inputs/required/twoFields/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(firstName: String! @field(name: "FIRST_NAME"), lastName: String! @field(name: "LAST_NAME")): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/default/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/default/expected/QueryDBQueries.java deleted file mode 100644 index eb2b437f52..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/default/expected/QueryDBQueries.java +++ /dev/null @@ -1,64 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; - -import fake.graphql.example.model.Customer; -import fake.graphql.example.model.SomeInterface; - -import java.lang.RuntimeException; -import java.lang.String; - -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.JSONB; -import org.jooq.Record1; -import org.jooq.Record2; -import org.jooq.SelectJoinStep; -import org.jooq.SelectLimitPercentStep; -import org.jooq.impl.DSL; - -public class QueryDBQueries { - - public static SomeInterface someInterfaceForQuery(DSLContext _iv_ctx, SelectionSet _iv_select) { - var _iv_unionKeysQuery = customerSortFieldsForSomeInterface(); - var _sjs_customer = customerForSomeInterface(); - - return _iv_ctx - .select( - DSL.row( - _iv_unionKeysQuery.field("$type", String.class), - _sjs_customer.field("$data") - ).mapping((_iv_e0, _iv_e1) -> switch (_iv_e0) { - case "Customer" -> (SomeInterface) _iv_e1; - default -> - throw new RuntimeException(String.format("Querying multitable interface/union '%s' returned unexpected typeName '%s'", "SomeInterface", _iv_e0)); - }) - ) - .from(_iv_unionKeysQuery) - .leftJoin(_sjs_customer) - .on(_iv_unionKeysQuery.field("$pkFields", JSONB.class).eq(_sjs_customer.field("$pkFields", JSONB.class))) - .limit(2) - .fetchOne(Record1::value1); - } - - private static SelectLimitPercentStep<Record2<String, JSONB>> customerSortFieldsForSomeInterface() { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return DSL.select( - DSL.inline("Customer").as("$type"), - DSL.jsonbArray(DSL.inline("Customer"), _a_customer.CUSTOMER_ID).as("$pkFields")) - .from(_a_customer) - .limit(2); - } - - private static SelectJoinStep<Record2<JSONB, Customer>> customerForSomeInterface() { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return DSL.select( - DSL.jsonbArray(DSL.inline("Customer"), _a_customer.CUSTOMER_ID).as("$pkFields"), - DSL.field( - DSL.select(DSL.row(_a_customer.getId()).mapping(Functions.nullOnAllNull(Customer::new))) - ).as("$data")) - .from(_a_customer); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/default/schema.graphqls deleted file mode 100644 index 85b9043863..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/default/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - someInterface: SomeInterface -} - -interface SomeInterface { - id: ID -} - -type Customer implements SomeInterface @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/interfaceWithType/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/interfaceWithType/schema.graphqls deleted file mode 100644 index 57f75f8945..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/interfaceWithType/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - query: SomeInterface -} - -interface SomeInterface { - customer: CustomerTable -} - -type Payment implements SomeInterface @table { - id: ID! - customer: CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/interfaceWithTypeSplitQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/interfaceWithTypeSplitQuery/schema.graphqls deleted file mode 100644 index 164f3e260c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/interfaceWithTypeSplitQuery/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - query: SomeInterface -} - -interface SomeInterface { - customer: CustomerTable @splitQuery -} - -type Payment implements SomeInterface @table { - id: ID! - customer: CustomerTable @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/listed/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/listed/expected/QueryDBQueries.java deleted file mode 100644 index 9bf9767e87..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/listed/expected/QueryDBQueries.java +++ /dev/null @@ -1,102 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; - -import fake.graphql.example.model.Address; -import fake.graphql.example.model.Customer; -import fake.graphql.example.model.SomeInterface; - -import java.lang.Integer; -import java.lang.RuntimeException; -import java.lang.String; -import java.util.List; - -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.JSONB; -import org.jooq.Record1; -import org.jooq.Record2; -import org.jooq.Record3; -import org.jooq.SelectJoinStep; -import org.jooq.SelectSeekStepN; -import org.jooq.impl.DSL; - -public class QueryDBQueries { - - public static List<SomeInterface> someInterfaceForQuery(DSLContext _iv_ctx, SelectionSet _iv_select) { - var _iv_unionKeysQuery = customerSortFieldsForSomeInterface().unionAll(addressSortFieldsForSomeInterface()); - - var _sjs_address = addressForSomeInterface(); - var _sjs_customer = customerForSomeInterface(); - - return _iv_ctx - .select( - DSL.row( - _iv_unionKeysQuery.field("$type", String.class), - _sjs_address.field("$data"), - _sjs_customer.field("$data") - ).mapping((_iv_e0, _iv_e1, _iv_e2) -> switch (_iv_e0) { - case "Address" -> (SomeInterface) _iv_e1; - case "Customer" -> (SomeInterface) _iv_e2; - default -> - throw new RuntimeException(String.format("Querying multitable interface/union '%s' returned unexpected typeName '%s'", "SomeInterface", _iv_e0)); - } - )) - .from(_iv_unionKeysQuery) - .leftJoin(_sjs_address) - .on(_iv_unionKeysQuery.field("$pkFields", JSONB.class).eq(_sjs_address.field("$pkFields", JSONB.class))) - .leftJoin(_sjs_customer) - .on(_iv_unionKeysQuery.field("$pkFields", JSONB.class).eq(_sjs_customer.field("$pkFields", JSONB.class))) - .orderBy(_iv_unionKeysQuery.field("$type"), _iv_unionKeysQuery.field("$innerRowNum")) - .fetch(Record1::value1); - } - - private static SelectSeekStepN<Record3<String, Integer, JSONB>> addressSortFieldsForSomeInterface() { - var _a_address = ADDRESS.as("address_223244161"); - var _iv_orderFields = _a_address.fields(_a_address.getPrimaryKey().getFieldsArray()); - return DSL.select( - DSL.inline("Address").as("$type"), - DSL.rowNumber().over(DSL.orderBy(_iv_orderFields)).as("$innerRowNum"), - DSL.jsonbArray(DSL.inline("Address"), _a_address.ADDRESS_ID).as("$pkFields")) - .from(_a_address) - .orderBy(_iv_orderFields); - } - - private static SelectJoinStep<Record2<JSONB, Address>> addressForSomeInterface() { - var _a_address = ADDRESS.as("address_223244161"); - return DSL.select( - DSL.jsonbArray(DSL.inline("Address"), _a_address.ADDRESS_ID).as("$pkFields"), - DSL.field( - DSL.select(DSL.row(_a_address.getId()).mapping(Functions.nullOnAllNull(Address::new))) - ).as("$data")) - .from(_a_address); - } - - private static SelectSeekStepN<Record3<String, Integer, JSONB>> customerSortFieldsForSomeInterface() { - var _a_customer = CUSTOMER.as("customer_2168032777"); - var _iv_orderFields = _a_customer.fields(_a_customer.getPrimaryKey().getFieldsArray()); - return DSL.select( - DSL.inline("Customer").as("$type"), - DSL.rowNumber().over(DSL.orderBy(_iv_orderFields)).as("$innerRowNum"), - DSL.jsonbArray(DSL.inline("Customer"), _a_customer.CUSTOMER_ID).as("$pkFields")) - .from(_a_customer) - .orderBy(_iv_orderFields); - } - - private static SelectJoinStep<Record2<JSONB, Customer>> customerForSomeInterface() { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return DSL.select( - DSL.jsonbArray(DSL.inline("Customer"), _a_customer.CUSTOMER_ID).as("$pkFields"), - DSL.field( - DSL.select( - DSL.row( - _a_customer.getId(), - _a_customer.LAST_NAME - ).mapping(Functions.nullOnAllNull(Customer::new)) - ) - ).as("$data")) - .from(_a_customer); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/listed/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/listed/schema.graphqls deleted file mode 100644 index 0df6e32dbd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/listed/schema.graphqls +++ /dev/null @@ -1,16 +0,0 @@ -type Query { - someInterface: [SomeInterface] -} - -interface SomeInterface { - id: ID -} - -type Customer implements SomeInterface @table { - id: ID - lastName: String @field(name: "LAST_NAME") -} - -type Address implements SomeInterface @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/multipleImplementations/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/multipleImplementations/schema.graphqls deleted file mode 100644 index 951b7525c7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/multipleImplementations/schema.graphqls +++ /dev/null @@ -1,19 +0,0 @@ -type Query { - someInterface: [SomeInterface] -} - -interface SomeInterface { - id: ID -} - -type Customer implements SomeInterface @table { - id: ID -} - -type Address implements SomeInterface @table { - id: ID -} - -type City implements SomeInterface @table { - id: ID -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/noImplementations/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/noImplementations/schema.graphqls deleted file mode 100644 index 73e85a53df..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/noImplementations/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - someInterface: [SomeInterface] -} - -interface SomeInterface { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/oneImplementation/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/oneImplementation/expected/QueryDBQueries.java deleted file mode 100644 index 3073a99047..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/oneImplementation/expected/QueryDBQueries.java +++ /dev/null @@ -1,75 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; - -import fake.graphql.example.model.Customer; -import fake.graphql.example.model.SomeInterface; - -import java.lang.Integer; -import java.lang.RuntimeException; -import java.lang.String; -import java.util.List; - -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.JSONB; -import org.jooq.Record1; -import org.jooq.Record2; -import org.jooq.Record3; -import org.jooq.SelectJoinStep; -import org.jooq.SelectSeekStepN; -import org.jooq.impl.DSL; - -public class QueryDBQueries { - - public static List<SomeInterface> someInterfaceForQuery(DSLContext _iv_ctx, SelectionSet _iv_select) { - var _iv_unionKeysQuery = customerSortFieldsForSomeInterface(); - - var _sjs_customer = customerForSomeInterface(); - - return _iv_ctx - .select( - DSL.row( - _iv_unionKeysQuery.field("$type", String.class), - _sjs_customer.field("$data") - ).mapping((_iv_e0, _iv_e1) -> switch (_iv_e0) { - case "Customer" -> (SomeInterface) _iv_e1; - default -> - throw new RuntimeException(String.format("Querying multitable interface/union '%s' returned unexpected typeName '%s'", "SomeInterface", _iv_e0)); - } - )) - .from(_iv_unionKeysQuery) - .leftJoin(_sjs_customer) - .on(_iv_unionKeysQuery.field("$pkFields", JSONB.class).eq(_sjs_customer.field("$pkFields", JSONB.class))) - .orderBy(_iv_unionKeysQuery.field("$type"), _iv_unionKeysQuery.field("$innerRowNum")) - .fetch(Record1::value1); - } - - private static SelectSeekStepN<Record3<String, Integer, JSONB>> customerSortFieldsForSomeInterface() { - var _a_customer = CUSTOMER.as("customer_2168032777"); - var _iv_orderFields = _a_customer.fields(_a_customer.getPrimaryKey().getFieldsArray()); - return DSL.select( - DSL.inline("Customer").as("$type"), - DSL.rowNumber().over(DSL.orderBy(_iv_orderFields)).as("$innerRowNum"), - DSL.jsonbArray(DSL.inline("Customer"), _a_customer.CUSTOMER_ID).as("$pkFields")) - .from(_a_customer) - .orderBy(_iv_orderFields); - } - - private static SelectJoinStep<Record2<JSONB, Customer>> customerForSomeInterface() { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return DSL.select( - DSL.jsonbArray(DSL.inline("Customer"), _a_customer.CUSTOMER_ID).as("$pkFields"), - DSL.field( - DSL.select( - DSL.row( - _a_customer.getId(), - _a_customer.LAST_NAME - ).mapping(Functions.nullOnAllNull(Customer::new)) - ) - ).as("$data") - ).from(_a_customer); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/oneImplementation/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/oneImplementation/schema.graphqls deleted file mode 100644 index 745cb37c98..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/oneImplementation/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - someInterface: [SomeInterface] -} - -interface SomeInterface { - id: ID -} - -type Customer implements SomeInterface @table { - id: ID - lastName: String @field(name: "LAST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/paginated/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/paginated/expected/QueryDBQueries.java deleted file mode 100644 index 2413157350..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/paginated/expected/QueryDBQueries.java +++ /dev/null @@ -1,132 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; - -import fake.graphql.example.model.Address; -import fake.graphql.example.model.Customer; -import fake.graphql.example.model.SomeInterface; - -import java.lang.Integer; -import java.lang.RuntimeException; -import java.lang.String; -import java.util.List; -import java.util.Map; - -import no.sikt.graphql.helpers.query.AfterTokenWithTypeName; -import no.sikt.graphql.helpers.query.QueryHelper; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.apache.commons.lang3.tuple.Pair; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.JSONB; -import org.jooq.Record1; -import org.jooq.Record2; -import org.jooq.Record3; -import org.jooq.SelectField; -import org.jooq.SelectJoinStep; -import org.jooq.SelectLimitPercentStep; -import org.jooq.SelectSelectStep; -import org.jooq.impl.DSL; - - -public class QueryDBQueries { - - public static List<Pair<String, SomeInterface>> someInterfaceForQuery(DSLContext _iv_ctx, Integer _iv_pageSize, String _mi_after, SelectionSet _iv_select) { - var _iv_token = QueryHelper.getOrderByValuesForMultitableInterface(_iv_ctx, - Map.ofEntries( - Map.entry("Address", ADDRESS.fields(ADDRESS.getPrimaryKey().getFieldsArray())), - Map.entry("Customer", CUSTOMER.fields(CUSTOMER.getPrimaryKey().getFieldsArray()))), - _mi_after); - - var _iv_unionKeysQuery = customerSortFieldsForSomeInterface(_iv_pageSize, _iv_token).unionAll(addressSortFieldsForSomeInterface(_iv_pageSize, _iv_token)); - - var _sjs_address = addressForSomeInterface(); - var _sjs_customer = customerForSomeInterface(); - - return _iv_ctx.select( - DSL.row( - _iv_unionKeysQuery.field("$type", String.class), - _sjs_address.field("$data"), - _sjs_customer.field("$data") - ).mapping((_iv_e0, _iv_e1, _iv_e2) -> { - Record2 _iv_result = switch (_iv_e0) { - case "Address" -> (Record2) _iv_e1; - case "Customer" -> (Record2) _iv_e2; - default -> - throw new RuntimeException(String.format("Querying multitable interface/union '%s' returned unexpected typeName '%s'", "SomeInterface", _iv_e0)); - }; - return Pair.of(_iv_result.get(0, String.class), _iv_result.get(1, SomeInterface.class)); - } - ) - ) - .from(_iv_unionKeysQuery) - .leftJoin(_sjs_address) - .on(_iv_unionKeysQuery.field("$pkFields", JSONB.class).eq(_sjs_address.field("$pkFields", JSONB.class))) - .leftJoin(_sjs_customer) - .on(_iv_unionKeysQuery.field("$pkFields", JSONB.class).eq(_sjs_customer.field("$pkFields", JSONB.class))) - .orderBy(_iv_unionKeysQuery.field("$type"), _iv_unionKeysQuery.field("$innerRowNum")) - .limit(_iv_pageSize + 1) - .fetch(Record1::value1); - } - - private static SelectLimitPercentStep<Record3<String, Integer, JSONB>> addressSortFieldsForSomeInterface(Integer _iv_pageSize, AfterTokenWithTypeName _iv_token) { - var _a_address = ADDRESS.as("address_223244161"); - var _iv_orderFields = _a_address.fields(_a_address.getPrimaryKey().getFieldsArray()); - return DSL.select( - DSL.inline("Address").as("$type"), - DSL.rowNumber().over(DSL.orderBy(_iv_orderFields)).as("$innerRowNum"), - DSL.jsonbArray(DSL.inline("Address"), _a_address.ADDRESS_ID).as("$pkFields")) - .from(_a_address) - .where(_iv_token == null ? DSL.noCondition() : DSL.inline("Address").greaterOrEqual(_iv_token.typeName())) - .and(_iv_token != null && _iv_token.matches("Address") ? DSL.row(_a_address.fields(_a_address.getPrimaryKey().getFieldsArray())).gt(DSL.row(_iv_token.fields())) : DSL.noCondition()) - .orderBy(_iv_orderFields) - .limit(_iv_pageSize + 1); - } - - private static SelectJoinStep<Record2<JSONB, Record2<SelectField<String>, SelectSelectStep<Record1<Address>>>>> addressForSomeInterface( - ) { - var _a_address = ADDRESS.as("address_223244161"); - return DSL.select( - DSL.jsonbArray(DSL.inline("Address"), _a_address.ADDRESS_ID).as("$pkFields"), - DSL.field( - DSL.select( - DSL.row( - QueryHelper.getOrderByTokenForMultitableInterface(_a_address, _a_address.fields(_a_address.getPrimaryKey().getFieldsArray()), "Address"), - DSL.select(DSL.row(_a_address.getId()).mapping(Functions.nullOnAllNull(Address::new))) - ) - ) - ).as("$data")) - .from(_a_address); - } - - private static SelectLimitPercentStep<Record3<String, Integer, JSONB>> customerSortFieldsForSomeInterface(Integer _iv_pageSize, AfterTokenWithTypeName _iv_token) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - var _iv_orderFields = _a_customer.fields(_a_customer.getPrimaryKey().getFieldsArray()); - return DSL.select( - DSL.inline("Customer").as("$type"), - DSL.rowNumber().over(DSL.orderBy(_iv_orderFields)).as("$innerRowNum"), - DSL.jsonbArray(DSL.inline("Customer"), _a_customer.CUSTOMER_ID).as("$pkFields")) - .from(_a_customer) - .where(_iv_token == null ? DSL.noCondition() : DSL.inline("Customer").greaterOrEqual(_iv_token.typeName())) - .and(_iv_token != null && _iv_token.matches("Customer") ? DSL.row(_a_customer.fields(_a_customer.getPrimaryKey().getFieldsArray())).gt(DSL.row(_iv_token.fields())) : DSL.noCondition()) - .orderBy(_iv_orderFields) - .limit(_iv_pageSize + 1); - } - - private static SelectJoinStep<Record2<JSONB, Record2<SelectField<String>, SelectSelectStep<Record1<Customer>>>>> customerForSomeInterface() { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return DSL.select( - DSL.jsonbArray(DSL.inline("Customer"), _a_customer.CUSTOMER_ID).as("$pkFields"), - DSL.field( - DSL.select( - DSL.row( - QueryHelper.getOrderByTokenForMultitableInterface(_a_customer, _a_customer.fields(_a_customer.getPrimaryKey().getFieldsArray()), "Customer"), - DSL.select(DSL.row(_a_customer.getId()).mapping(Functions.nullOnAllNull(Customer::new))) - ) - ) - ).as("$data")) - - .from(_a_customer); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/paginated/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/paginated/schema.graphqls deleted file mode 100644 index 1f77827ab7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/paginated/schema.graphqls +++ /dev/null @@ -1,26 +0,0 @@ -type Query { - someInterface(first: Int = 100, after: String): SomeInterfaceConnection -} - -interface SomeInterface { - id: ID -} - -type Customer implements SomeInterface @table { - id: ID -} - -type Address implements SomeInterface @table { - id: ID -} - - -type SomeInterfaceConnection { - edges: [SomeInterfaceConnectionEdge] - nodes: [SomeInterface!]! -} - -type SomeInterfaceConnectionEdge { - cursor: String - node: SomeInterface -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/paginatedWithInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/paginatedWithInput/schema.graphqls deleted file mode 100644 index 4e34440a26..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/paginatedWithInput/schema.graphqls +++ /dev/null @@ -1,25 +0,0 @@ -type Query { - payments(first: Int = 100, after: String, customerId: String @field(name: "CUSTOMER_ID")): PaymentConnection -} - -interface Payment { - amount: Int -} - -type PaymentTypeOne implements Payment @table(name: "PAYMENT_P2007_01") { - amount: Int -} - -type PaymentTypeTwo implements Payment @table(name: "PAYMENT_P2007_02") { - amount: Int -} - -type PaymentConnection { - edges: [PaymentConnectionEdge] - nodes: [Payment!]! -} - -type PaymentConnectionEdge { - cursor: String - node: Payment -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/splitQuery/expected/PaymentDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/splitQuery/expected/PaymentDBQueries.java deleted file mode 100644 index 1c605f1d5c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/splitQuery/expected/PaymentDBQueries.java +++ /dev/null @@ -1,105 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; - -import fake.graphql.example.model.Customer; -import fake.graphql.example.model.PersonWithEmail; -import fake.graphql.example.model.Staff; - -import java.lang.RuntimeException; -import java.lang.String; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.Payment; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.PaymentRecord; -import no.sikt.graphql.helpers.query.QueryHelper; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.JSONB; -import org.jooq.Record2; -import org.jooq.SelectJoinStep; -import org.jooq.SelectLimitPercentStep; -import org.jooq.impl.DSL; - -public class PaymentDBQueries { - - public static Map<PaymentRecord, PersonWithEmail> staffAndCustomersForPayment(DSLContext _iv_ctx, Set<PaymentRecord> _rk_payment, SelectionSet _iv_select) { - var _a_payment = PAYMENT.as("payment_1831371789"); - var _iv_unionKeysQuery = staffSortFieldsForStaffAndCustomers(_a_payment).unionAll(customerSortFieldsForStaffAndCustomers(_a_payment)); - - var _sjs_customer = customerForStaffAndCustomers(); - var _sjs_staff = staffForStaffAndCustomers(); - - return _iv_ctx.select( - DSL.row(_a_payment.PAYMENT_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_payment.PAYMENT_ID))), - DSL.field( - DSL.select( - DSL.row( - _iv_unionKeysQuery.field("$type", String.class), - _sjs_customer.field("$data"), - _sjs_staff.field("$data") - ).mapping((_iv_e0, _iv_e1, _iv_e2) -> switch (_iv_e0) { - case "Customer" -> (PersonWithEmail) _iv_e1; - case "Staff" -> (PersonWithEmail) _iv_e2; - default -> - throw new RuntimeException(String.format("Querying multitable interface/union '%s' returned unexpected typeName '%s'", "PersonWithEmail", _iv_e0)); - } - )) - .from(_iv_unionKeysQuery) - .leftJoin(_sjs_customer) - .on(_iv_unionKeysQuery.field("$pkFields", JSONB.class).eq(_sjs_customer.field("$pkFields", JSONB.class))) - .leftJoin(_sjs_staff) - .on(_iv_unionKeysQuery.field("$pkFields", JSONB.class).eq(_sjs_staff.field("$pkFields", JSONB.class))) - .limit(2) - ) - ) - .from(_a_payment) - .where(DSL.row(_a_payment.PAYMENT_ID).in(_rk_payment.stream().map(_iv_it -> _iv_it.key().valuesRow()).toList())) - .fetchMap( - Record2::value1, - Record2::value2 - ); - } - - private static SelectLimitPercentStep<Record2<String, JSONB>> customerSortFieldsForStaffAndCustomers(Payment _a_payment) { - var _a_payment_1831371789_customer = _a_payment.customer().as("customer_1463568749"); - return DSL.select( - DSL.inline("Customer").as("$type"), - DSL.jsonbArray(DSL.inline("Customer"), _a_payment_1831371789_customer.CUSTOMER_ID).as("$pkFields")) - .from(_a_payment_1831371789_customer) - .limit(2); - } - - private static SelectJoinStep<Record2<JSONB, Customer>> customerForStaffAndCustomers() { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return DSL.select( - DSL.jsonbArray(DSL.inline("Customer"), _a_customer.CUSTOMER_ID).as("$pkFields"), - DSL.field( - DSL.select(DSL.row(_a_customer.EMAIL).mapping(Functions.nullOnAllNull(Customer::new))) - ).as("$data")) - .from(_a_customer); - } - - private static SelectLimitPercentStep<Record2<String, JSONB>> staffSortFieldsForStaffAndCustomers(Payment _a_payment) { - var _a_payment_1831371789_staff = _a_payment.staff().as("staff_2269035563"); - return DSL.select( - DSL.inline("Staff").as("$type"), - DSL.jsonbArray(DSL.inline("Staff"), _a_payment_1831371789_staff.STAFF_ID).as("$pkFields")) - .from(_a_payment_1831371789_staff) - .limit(2); - } - - private static SelectJoinStep<Record2<JSONB, Staff>> staffForStaffAndCustomers() { - var _a_staff = STAFF.as("staff_1114567570"); - return DSL.select( - DSL.jsonbArray(DSL.inline("Staff"), _a_staff.STAFF_ID).as("$pkFields"), - DSL.field( - DSL.select(DSL.row(_a_staff.EMAIL).mapping(Functions.nullOnAllNull(Staff::new))) - ).as("$data")) - .from(_a_staff); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/splitQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/splitQuery/schema.graphqls deleted file mode 100644 index dac0a797d2..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/splitQuery/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Payment @notGenerated -} - -type Payment @table { - staffAndCustomers: PersonWithEmail @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/splitQueryListed/expected/PaymentDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/splitQueryListed/expected/PaymentDBQueries.java deleted file mode 100644 index 0b3c35e8f1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/splitQueryListed/expected/PaymentDBQueries.java +++ /dev/null @@ -1,115 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; - -import fake.graphql.example.model.Customer; -import fake.graphql.example.model.PersonWithEmail; -import fake.graphql.example.model.Staff; - -import java.lang.Integer; -import java.lang.RuntimeException; -import java.lang.String; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.Payment; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.PaymentRecord; -import no.sikt.graphql.helpers.query.QueryHelper; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.JSONB; -import org.jooq.Record1; -import org.jooq.Record2; -import org.jooq.Record3; -import org.jooq.SelectJoinStep; -import org.jooq.SelectSeekStepN; -import org.jooq.impl.DSL; - -public class PaymentDBQueries { - public static Map<PaymentRecord, List<PersonWithEmail>> staffAndCustomersForPayment( - DSLContext _iv_ctx, Set<PaymentRecord> _rk_payment, SelectionSet _iv_select) { - var _a_payment = PAYMENT.as("payment_1831371789"); - var _iv_unionKeysQuery = staffSortFieldsForStaffAndCustomers(_a_payment) - .unionAll(customerSortFieldsForStaffAndCustomers(_a_payment)); - - var _sjs_customer = customerForStaffAndCustomers(); - var _sjs_staff = staffForStaffAndCustomers(); - - return _iv_ctx.select( - DSL.row(_a_payment.PAYMENT_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_payment.PAYMENT_ID))), - DSL.multiset( - DSL.select( - DSL.row( - _iv_unionKeysQuery.field("$type", String.class), - _sjs_customer.field("$data"), - _sjs_staff.field("$data") - ).mapping((_iv_e0, _iv_e1, _iv_e2) -> switch (_iv_e0) { - case "Customer" -> (PersonWithEmail) _iv_e1; - case "Staff" -> (PersonWithEmail) _iv_e2; - default -> - throw new RuntimeException(String.format("Querying multitable interface/union '%s' returned unexpected typeName '%s'", "PersonWithEmail", _iv_e0)); - } - )) - .from(_iv_unionKeysQuery) - .leftJoin(_sjs_customer) - .on(_iv_unionKeysQuery.field("$pkFields", JSONB.class).eq(_sjs_customer.field("$pkFields", JSONB.class))) - .leftJoin(_sjs_staff) - .on(_iv_unionKeysQuery.field("$pkFields", JSONB.class).eq(_sjs_staff.field("$pkFields", JSONB.class))) - .orderBy(_iv_unionKeysQuery.field("$type"), _iv_unionKeysQuery.field("$innerRowNum")) - ) - ) - .from(_a_payment) - .where(DSL.row(_a_payment.PAYMENT_ID).in(_rk_payment.stream().map(_iv_it -> _iv_it.key().valuesRow()).toList())) - .fetchMap( - Record2::value1, - _iv_r -> _iv_r.value2().map(Record1::value1) - ); - } - - private static SelectSeekStepN<Record3<String, Integer, JSONB>> customerSortFieldsForStaffAndCustomers( - Payment _a_payment) { - var _a_payment_1831371789_customer = _a_payment.customer().as("customer_1463568749"); - var _iv_orderFields = _a_payment_1831371789_customer.fields(_a_payment_1831371789_customer.getPrimaryKey().getFieldsArray()); - return DSL.select( - DSL.inline("Customer").as("$type"), - DSL.rowNumber().over(DSL.orderBy(_iv_orderFields)).as("$innerRowNum"), - DSL.jsonbArray(DSL.inline("Customer"), _a_payment_1831371789_customer.CUSTOMER_ID).as("$pkFields")) - .from(_a_payment_1831371789_customer) - .orderBy(_iv_orderFields); - } - - private static SelectJoinStep<Record2<JSONB, Customer>> customerForStaffAndCustomers() { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return DSL.select( - DSL.jsonbArray(DSL.inline("Customer"), _a_customer.CUSTOMER_ID).as("$pkFields"), - DSL.field( - DSL.select(DSL.row(_a_customer.EMAIL).mapping(Functions.nullOnAllNull(Customer::new))) - ).as("$data")) - .from(_a_customer); - } - - private static SelectSeekStepN<Record3<String, Integer, JSONB>> staffSortFieldsForStaffAndCustomers( - Payment _a_payment) { - var _a_payment_1831371789_staff = _a_payment.staff().as("staff_2269035563"); - var _iv_orderFields = _a_payment_1831371789_staff.fields(_a_payment_1831371789_staff.getPrimaryKey().getFieldsArray()); - return DSL.select( - DSL.inline("Staff").as("$type"), - DSL.rowNumber().over(DSL.orderBy(_iv_orderFields)).as("$innerRowNum"), - DSL.jsonbArray(DSL.inline("Staff"), _a_payment_1831371789_staff.STAFF_ID).as("$pkFields")) - .from(_a_payment_1831371789_staff) - .orderBy(_iv_orderFields); - } - - private static SelectJoinStep<Record2<JSONB, Staff>> staffForStaffAndCustomers() { - var _a_staff = STAFF.as("staff_1114567570"); - return DSL.select( - DSL.jsonbArray(DSL.inline("Staff"), _a_staff.STAFF_ID).as("$pkFields"), - DSL.field( - DSL.select(DSL.row(_a_staff.EMAIL).mapping(Functions.nullOnAllNull(Staff::new))) - ).as("$data")) - .from(_a_staff); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/splitQueryListed/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/splitQueryListed/schema.graphqls deleted file mode 100644 index b33c2132a4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/splitQueryListed/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Payment @notGenerated -} - -type Payment @table { - staffAndCustomers: [PersonWithEmail] @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/splitQueryPaginated/expected/PaymentDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/splitQueryPaginated/expected/PaymentDBQueries.java deleted file mode 100644 index cacc90757b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/splitQueryPaginated/expected/PaymentDBQueries.java +++ /dev/null @@ -1,143 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; - -import fake.graphql.example.model.Customer; -import fake.graphql.example.model.PersonWithEmail; -import fake.graphql.example.model.Staff; - -import java.lang.Integer; -import java.lang.RuntimeException; -import java.lang.String; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.Payment; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.PaymentRecord; -import no.sikt.graphql.helpers.query.AfterTokenWithTypeName; -import no.sikt.graphql.helpers.query.QueryHelper; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.apache.commons.lang3.tuple.Pair; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.JSONB; -import org.jooq.Record1; -import org.jooq.Record2; -import org.jooq.Record3; -import org.jooq.SelectField; -import org.jooq.SelectJoinStep; -import org.jooq.SelectLimitPercentStep; -import org.jooq.SelectSelectStep; -import org.jooq.impl.DSL; - -public class PaymentDBQueries { - - public static Map<PaymentRecord, List<Pair<String, PersonWithEmail>>> staffAndCustomersForPayment(DSLContext _iv_ctx, Set<PaymentRecord> _rk_payment, Integer _iv_pageSize, String _mi_after, SelectionSet _iv_select) { - var _iv_token = QueryHelper.getOrderByValuesForMultitableInterface(_iv_ctx, - Map.ofEntries( - Map.entry("Customer", CUSTOMER.fields(CUSTOMER.getPrimaryKey().getFieldsArray())), - Map.entry("Staff", STAFF.fields(STAFF.getPrimaryKey().getFieldsArray()))), - _mi_after); - - var _a_payment = PAYMENT.as("payment_1831371789"); - - var _iv_unionKeysQuery = staffSortFieldsForStaffAndCustomers(_a_payment, _iv_pageSize, _iv_token).unionAll(customerSortFieldsForStaffAndCustomers(_a_payment, _iv_pageSize, _iv_token)); - - var _sjs_customer = customerForStaffAndCustomers(); - var _sjs_staff = staffForStaffAndCustomers(); - - return _iv_ctx.select( - DSL.row(_a_payment.PAYMENT_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_payment.PAYMENT_ID))), - DSL.multiset( - DSL.select( - DSL.row( - _iv_unionKeysQuery.field("$type", String.class), - _sjs_customer.field("$data"), - _sjs_staff.field("$data") - ).mapping((_iv_e0, _iv_e1 , _iv_e2) -> { - Record2 _iv_result = switch (_iv_e0) { - case "Customer" -> (Record2) _iv_e1; - case "Staff" -> (Record2) _iv_e2; - default -> - throw new RuntimeException(String.format("Querying multitable interface/union '%s' returned unexpected typeName '%s'", "PersonWithEmail", _iv_e0)); - } - ; - return Pair.of(_iv_result.get(0, String.class), _iv_result.get(1, PersonWithEmail.class)); - })) - .from(_iv_unionKeysQuery) - .leftJoin(_sjs_customer) - .on(_iv_unionKeysQuery.field("$pkFields", JSONB.class).eq(_sjs_customer.field("$pkFields", JSONB.class))) - .leftJoin(_sjs_staff) - .on(_iv_unionKeysQuery.field("$pkFields", JSONB.class).eq(_sjs_staff.field("$pkFields", JSONB.class))) - .orderBy(_iv_unionKeysQuery.field("$type"), _iv_unionKeysQuery.field("$innerRowNum")) - .limit(_iv_pageSize + 1) - ) - ) - .from(_a_payment) - .where(DSL.row(_a_payment.PAYMENT_ID).in(_rk_payment.stream().map(_iv_it -> _iv_it.key().valuesRow()).toList())) - .fetchMap( - Record2::value1, - _iv_r -> _iv_r.value2().map(Record1::value1) - ); - } - - private static SelectLimitPercentStep<Record3<String, Integer, JSONB>> customerSortFieldsForStaffAndCustomers(Payment _a_payment, Integer _iv_pageSize, AfterTokenWithTypeName _iv_token) { - var _a_payment_1831371789_customer = _a_payment.customer().as("customer_1463568749"); - var _iv_orderFields = _a_payment_1831371789_customer.fields(_a_payment_1831371789_customer.getPrimaryKey().getFieldsArray()); - return DSL.select( - DSL.inline("Customer").as("$type"), - DSL.rowNumber().over(DSL.orderBy(_iv_orderFields)).as("$innerRowNum"), - DSL.jsonbArray(DSL.inline("Customer"), _a_payment_1831371789_customer.CUSTOMER_ID).as("$pkFields")) - .from(_a_payment_1831371789_customer) - .where(_iv_token == null ? DSL.noCondition() : DSL.inline("Customer").greaterOrEqual(_iv_token.typeName())) - .and(_iv_token != null && _iv_token.matches("Customer") ? DSL.row(_a_payment_1831371789_customer.fields(_a_payment_1831371789_customer.getPrimaryKey().getFieldsArray())).gt(DSL.row(_iv_token.fields())) : DSL.noCondition()) - .orderBy(_iv_orderFields) - .limit(_iv_pageSize + 1); - } - - private static SelectJoinStep<Record2<JSONB, Record2<SelectField<String>, SelectSelectStep<Record1<Customer>>>>> customerForStaffAndCustomers() { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return DSL.select( - DSL.jsonbArray(DSL.inline("Customer"), _a_customer.CUSTOMER_ID).as("$pkFields"), - DSL.field( - DSL.select( - DSL.row( - QueryHelper.getOrderByTokenForMultitableInterface(_a_customer, _a_customer.fields(_a_customer.getPrimaryKey().getFieldsArray()), "Customer"), - DSL.select(DSL.row(_a_customer.EMAIL).mapping(Functions.nullOnAllNull(Customer::new))) - ) - ) - ).as("$data")) - .from(_a_customer); - } - - private static SelectLimitPercentStep<Record3<String, Integer, JSONB>> staffSortFieldsForStaffAndCustomers(Payment _a_payment, Integer _iv_pageSize, AfterTokenWithTypeName _iv_token) { - var _a_payment_1831371789_staff = _a_payment.staff().as("staff_2269035563"); - var _iv_orderFields = _a_payment_1831371789_staff.fields(_a_payment_1831371789_staff.getPrimaryKey().getFieldsArray()); - return DSL.select( - DSL.inline("Staff").as("$type"), - DSL.rowNumber().over(DSL.orderBy(_iv_orderFields)).as("$innerRowNum"), - DSL.jsonbArray(DSL.inline("Staff"), _a_payment_1831371789_staff.STAFF_ID).as("$pkFields")) - .from(_a_payment_1831371789_staff) - .where(_iv_token == null ? DSL.noCondition() : DSL.inline("Staff").greaterOrEqual(_iv_token.typeName())) - .and(_iv_token != null && _iv_token.matches("Staff") ? DSL.row(_a_payment_1831371789_staff.fields(_a_payment_1831371789_staff.getPrimaryKey().getFieldsArray())).gt(DSL.row(_iv_token.fields())) : DSL.noCondition()) - .orderBy(_iv_orderFields) - .limit(_iv_pageSize + 1); - } - - private static SelectJoinStep<Record2<JSONB, Record2<SelectField<String>, SelectSelectStep<Record1<Staff>>>>> staffForStaffAndCustomers() { - var _a_staff = STAFF.as("staff_1114567570"); - return DSL.select( - DSL.jsonbArray(DSL.inline("Staff"), _a_staff.STAFF_ID).as("$pkFields"), - DSL.field( - DSL.select( - DSL.row( - QueryHelper.getOrderByTokenForMultitableInterface(_a_staff, _a_staff.fields(_a_staff.getPrimaryKey().getFieldsArray()), "Staff"), - DSL.select(DSL.row(_a_staff.EMAIL).mapping(Functions.nullOnAllNull(Staff::new))) - ) - ) - ).as("$data")) - .from(_a_staff); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/splitQueryPaginated/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/splitQueryPaginated/schema.graphqls deleted file mode 100644 index 527bc13699..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/splitQueryPaginated/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Payment @notGenerated -} - -type Payment @table { - staffAndCustomers(first: Int = 100, after: String): PersonWithEmailConnection -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/splitQueryWithInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/splitQueryWithInput/schema.graphqls deleted file mode 100644 index e3ca07cf84..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/splitQueryWithInput/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Payment @notGenerated -} - -type Payment @table { - staffAndCustomers(email: String!): [PersonWithEmail] @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/twoImplementations/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/twoImplementations/expected/QueryDBQueries.java deleted file mode 100644 index e75e3fb539..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/twoImplementations/expected/QueryDBQueries.java +++ /dev/null @@ -1,95 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; - -import fake.graphql.example.model.Address; -import fake.graphql.example.model.Customer; -import fake.graphql.example.model.SomeInterface; - -import java.lang.RuntimeException; -import java.lang.String; - -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.JSONB; -import org.jooq.Record1; -import org.jooq.Record2; -import org.jooq.SelectJoinStep; -import org.jooq.SelectLimitPercentStep; -import org.jooq.impl.DSL; - -public class QueryDBQueries { - - public static SomeInterface someInterfaceForQuery(DSLContext _iv_ctx, SelectionSet _iv_select) { - var _iv_unionKeysQuery = customerSortFieldsForSomeInterface().unionAll(addressSortFieldsForSomeInterface()); - - var _sjs_address = addressForSomeInterface(); - var _sjs_customer = customerForSomeInterface(); - - return _iv_ctx - .select( - DSL.row( - _iv_unionKeysQuery.field("$type", String.class), - _sjs_address.field("$data"), - _sjs_customer.field("$data") - ).mapping((_iv_e0, _iv_e1, _iv_e2) -> switch (_iv_e0) { - case "Address" -> (SomeInterface) _iv_e1; - case "Customer" -> (SomeInterface) _iv_e2; - default -> - throw new RuntimeException(String.format("Querying multitable interface/union '%s' returned unexpected typeName '%s'", "SomeInterface", _iv_e0)); - } - )) - .from(_iv_unionKeysQuery) - .leftJoin(_sjs_address) - .on(_iv_unionKeysQuery.field("$pkFields", JSONB.class).eq(_sjs_address.field("$pkFields", JSONB.class))) - .leftJoin(_sjs_customer) - .on(_iv_unionKeysQuery.field("$pkFields", JSONB.class).eq(_sjs_customer.field("$pkFields", JSONB.class))) - .limit(2) - .fetchOne(Record1::value1); - } - - private static SelectLimitPercentStep<Record2<String, JSONB>> addressSortFieldsForSomeInterface() { - var _a_address = ADDRESS.as("address_223244161"); - return DSL.select( - DSL.inline("Address").as("$type"), - DSL.jsonbArray(DSL.inline("Address"), _a_address.ADDRESS_ID).as("$pkFields")) - .from(_a_address) - .limit(2); - } - - private static SelectJoinStep<Record2<JSONB, Address>> addressForSomeInterface() { - var _a_address = ADDRESS.as("address_223244161"); - return DSL.select( - DSL.jsonbArray(DSL.inline("Address"), _a_address.ADDRESS_ID).as("$pkFields"), - DSL.field( - DSL.select(DSL.row(_a_address.getId()).mapping(Functions.nullOnAllNull(Address::new))) - ).as("$data")) - .from(_a_address); - } - - private static SelectLimitPercentStep<Record2<String, JSONB>> customerSortFieldsForSomeInterface() { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return DSL.select( - DSL.inline("Customer").as("$type"), - DSL.jsonbArray(DSL.inline("Customer"), _a_customer.CUSTOMER_ID).as("$pkFields")) - .from(_a_customer) - .limit(2); - } - - private static SelectJoinStep<Record2<JSONB, Customer>> customerForSomeInterface() { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return DSL.select( - DSL.jsonbArray(DSL.inline("Customer"), _a_customer.CUSTOMER_ID).as("$pkFields"), - DSL.field( - DSL.select( - DSL.row( - _a_customer.getId(), - _a_customer.LAST_NAME - ).mapping(Functions.nullOnAllNull(Customer::new)) - ) - ).as("$data")) - .from(_a_customer); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/twoImplementations/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/twoImplementations/schema.graphqls deleted file mode 100644 index 2958c9460d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/twoImplementations/schema.graphqls +++ /dev/null @@ -1,16 +0,0 @@ -type Query { - someInterface: SomeInterface -} - -interface SomeInterface { - id: ID -} - -type Customer implements SomeInterface @table { - id: ID - lastName: String @field(name: "LAST_NAME") -} - -type Address implements SomeInterface @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/withInput/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/withInput/expected/QueryDBQueries.java deleted file mode 100644 index 007b108280..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/withInput/expected/QueryDBQueries.java +++ /dev/null @@ -1,97 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; - -import fake.graphql.example.model.Payment; -import fake.graphql.example.model.PaymentTypeOne; -import fake.graphql.example.model.PaymentTypeTwo; - -import java.lang.Integer; -import java.lang.RuntimeException; -import java.lang.String; -import java.util.List; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.JSONB; -import org.jooq.Record1; -import org.jooq.Record2; -import org.jooq.Record3; -import org.jooq.SelectJoinStep; -import org.jooq.SelectSeekStepN; -import org.jooq.impl.DSL; - -public class QueryDBQueries { - - public static List<Payment> paymentsForQuery(DSLContext _iv_ctx, String _mi_customerId, SelectionSet _iv_select) { - var _iv_unionKeysQuery = paymenttypetwoSortFieldsForPayments(_mi_customerId).unionAll(paymenttypeoneSortFieldsForPayments(_mi_customerId)); - - var _sjs_paymentTypeOne = paymenttypeoneForPayments(); - var _sjs_paymentTypeTwo = paymenttypetwoForPayments(); - - return _iv_ctx.select( - DSL.row( - _iv_unionKeysQuery.field("$type", String.class), - _sjs_paymentTypeOne.field("$data"), - _sjs_paymentTypeTwo.field("$data") - ).mapping((_iv_e0, _iv_e1, _iv_e2) -> switch (_iv_e0) { - case "PaymentTypeOne" -> (Payment) _iv_e1; - case "PaymentTypeTwo" -> (Payment) _iv_e2; - default -> - throw new RuntimeException(String.format("Querying multitable interface/union '%s' returned unexpected typeName '%s'", "Payment", _iv_e0)); - } - )) - .from(_iv_unionKeysQuery) - .leftJoin(_sjs_paymentTypeOne) - .on(_iv_unionKeysQuery.field("$pkFields", JSONB.class).eq(_sjs_paymentTypeOne.field("$pkFields", JSONB.class))) - .leftJoin(_sjs_paymentTypeTwo) - .on(_iv_unionKeysQuery.field("$pkFields", JSONB.class).eq(_sjs_paymentTypeTwo.field("$pkFields", JSONB.class))) - .orderBy(_iv_unionKeysQuery.field("$type"), _iv_unionKeysQuery.field("$innerRowNum")) - .fetch(Record1::value1); - } - - private static SelectSeekStepN<Record3<String, Integer, JSONB>> paymenttypeoneSortFieldsForPayments(String _mi_customerId) { - var _a_paymentp2007_01 = PAYMENT_P2007_01.as("paymentp200701_3585501569"); - var _iv_orderFields = _a_paymentp2007_01.fields(_a_paymentp2007_01.getPrimaryKey().getFieldsArray()); - return DSL.select( - DSL.inline("PaymentTypeOne").as("$type"), - DSL.rowNumber().over(DSL.orderBy(_iv_orderFields)).as("$innerRowNum"), - DSL.jsonbArray(DSL.inline("PaymentTypeOne"), _a_paymentp2007_01.PAYMENT_ID).as("$pkFields")) - .from(_a_paymentp2007_01) - .where(_mi_customerId != null ? _a_paymentp2007_01.CUSTOMER_ID.eq(_mi_customerId) : DSL.noCondition()) - .orderBy(_iv_orderFields); - } - - private static SelectJoinStep<Record2<JSONB, PaymentTypeOne>> paymenttypeoneForPayments() { - var _a_paymentp2007_01 = PAYMENT_P2007_01.as("paymentp200701_3585501569"); - return DSL.select( - DSL.jsonbArray(DSL.inline("PaymentTypeOne"), _a_paymentp2007_01.PAYMENT_ID).as("$pkFields"), - DSL.field( - DSL.select(DSL.row(_a_paymentp2007_01.AMOUNT).mapping(Functions.nullOnAllNull(PaymentTypeOne::new))) - ).as("$data")) - .from(_a_paymentp2007_01); - } - - private static SelectSeekStepN<Record3<String, Integer, JSONB>> paymenttypetwoSortFieldsForPayments(String _mi_customerId) { - var _a_paymentp2007_02 = PAYMENT_P2007_02.as("paymentp200702_1287600187"); - var _iv_orderFields = _a_paymentp2007_02.fields(_a_paymentp2007_02.getPrimaryKey().getFieldsArray()); - return DSL.select( - DSL.inline("PaymentTypeTwo").as("$type"), - DSL.rowNumber().over(DSL.orderBy(_iv_orderFields)).as("$innerRowNum"), - DSL.jsonbArray(DSL.inline("PaymentTypeTwo"), _a_paymentp2007_02.PAYMENT_ID).as("$pkFields")) - .from(_a_paymentp2007_02) - .where(_mi_customerId != null ? _a_paymentp2007_02.CUSTOMER_ID.eq(_mi_customerId) : DSL.noCondition()) - .orderBy(_iv_orderFields); - } - - private static SelectJoinStep<Record2<JSONB, PaymentTypeTwo>> paymenttypetwoForPayments() { - var _a_paymentp2007_02 = PAYMENT_P2007_02.as("paymentp200702_1287600187"); - return DSL.select( - DSL.jsonbArray(DSL.inline("PaymentTypeTwo"), _a_paymentp2007_02.PAYMENT_ID).as("$pkFields"), - DSL.field( - DSL.select(DSL.row(_a_paymentp2007_02.AMOUNT).mapping(Functions.nullOnAllNull(PaymentTypeTwo::new))) - ).as("$data")) - .from(_a_paymentp2007_02); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/withInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/withInput/schema.graphqls deleted file mode 100644 index b30e8998c9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/withInput/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - payments(customerId: String @field(name: "CUSTOMER_ID")): [Payment] -} - -interface Payment { - amount: Int -} - -type PaymentTypeOne implements Payment @table(name: "PAYMENT_P2007_01") { - amount: Int -} - -type PaymentTypeTwo implements Payment @table(name: "PAYMENT_P2007_02") { - amount: Int -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/withInputCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/withInputCondition/schema.graphqls deleted file mode 100644 index 33b0d13174..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/withInputCondition/schema.graphqls +++ /dev/null @@ -1,17 +0,0 @@ -type Query { - payments( - customerId: String @field(name: "CUSTOMER_ID") @condition(condition: {name: "QUERY_FETCH_PAYMENT_INTERFACE_CONDITION", method: "payments"}) - ): [Payment] -} - -interface Payment { - amount: Int -} - -type PaymentTypeOne implements Payment @table(name: "PAYMENT_P2007_01") { - amount: Int -} - -type PaymentTypeTwo implements Payment @table(name: "PAYMENT_P2007_02") { - amount: Int -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/withMultipleInputs/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/withMultipleInputs/schema.graphqls deleted file mode 100644 index 8224dfca3c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/withMultipleInputs/schema.graphqls +++ /dev/null @@ -1,22 +0,0 @@ -type Query { - payments( - customerId: String @field(name: "CUSTOMER_ID") - staff: PaymentStaffInput! - ): [Payment] -} - -input PaymentStaffInput { - staffId: String! @field(name: "STAFF_ID") -} - -interface Payment { - amount: Int -} - -type PaymentTypeOne implements Payment @table(name: "PAYMENT_P2007_01") { - amount: Int -} - -type PaymentTypeTwo implements Payment @table(name: "PAYMENT_P2007_02") { - amount: Int -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/withQueryCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/withQueryCondition/schema.graphqls deleted file mode 100644 index 862246f062..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/multitableInterface/withQueryCondition/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - payments(customerId: String): [Payment] @condition(condition: {name: "QUERY_FETCH_PAYMENT_INTERFACE_CONDITION"}, override: true) -} - -interface Payment { - amount: Int -} - -type PaymentTypeOne implements Payment @table(name: "PAYMENT_P2007_01") { - amount: Int -} - -type PaymentTypeTwo implements Payment @table(name: "PAYMENT_P2007_02") { - amount: Int -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/node/default/expected/CustomerDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/node/default/expected/CustomerDBQueries.java deleted file mode 100644 index 034bc7b073..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/node/default/expected/CustomerDBQueries.java +++ /dev/null @@ -1,26 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; - -import fake.graphql.example.model.Customer; -import java.lang.String; -import java.util.Map; -import java.util.Set; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Record2; - -public class CustomerDBQueries { - public static Map<String, Customer> customerForNode(DSLContext _iv_ctx, Set<String> _mi_id, SelectionSet _iv_select) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return _iv_ctx - .select( - _a_customer.getId(), - customerForNode_customer() - ) - .from(_a_customer) - .where(_a_customer.hasIds(_mi_id)) - .fetchMap(Record2::value1, Record2::value2); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/node/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/node/default/schema.graphqls deleted file mode 100644 index b7b7408351..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/node/default/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - node(id: ID!): Node -} - -type Customer implements Node @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/node/twoInterfaces/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/node/twoInterfaces/schema.graphqls deleted file mode 100644 index e0826fbb39..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/node/twoInterfaces/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - node(id: ID!): Node -} - -interface Named { - firstName: String @field(name: "FIRST_NAME") -} - -type Customer implements Node & Named @table { - id: ID - firstName: String @field(name: "FIRST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/node/withoutTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/node/withoutTable/schema.graphqls deleted file mode 100644 index de3f46f081..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/node/withoutTable/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - node(id: ID): Node -} - -type Type implements Node { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/node/withoutTableAndQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/node/withoutTableAndQuery/schema.graphqls deleted file mode 100644 index 3e47551210..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/node/withoutTableAndQuery/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Customer -} - -interface I { - id: ID -} - -type Customer implements I { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/default/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/default/expected/QueryDBQueries.java deleted file mode 100644 index d5a86d0347..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/default/expected/QueryDBQueries.java +++ /dev/null @@ -1,40 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import fake.graphql.example.model.Address; -import fake.graphql.example.model.AddressInDistrictOne; -import fake.graphql.example.model.AddressInDistrictTwo; -import java.lang.RuntimeException; -import java.lang.String; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; - -public class QueryDBQueries { - - public static Address addressForQuery(DSLContext _iv_ctx, SelectionSet _iv_select) { - var _a_address = ADDRESS.as("address_223244161"); - var _iv_orderFields = _a_address.fields(_a_address.getPrimaryKey().getFieldsArray()); - return _iv_ctx.select( - _a_address.DISTRICT.as("_iv_discriminator"), - _a_address.POSTAL_CODE.as("postalCode"), - _a_address.getId().as("id"), - _a_address.POSTAL_CODE.as("postalCodeDuplicate") - ) - .from(_a_address) - .where(_a_address.DISTRICT.in("ONE", "TWO")) - .orderBy(_iv_orderFields) - .fetchOne( - _iv_it -> { - var _iv_discriminatorValue = _iv_it.get("_iv_discriminator", _a_address.DISTRICT.getConverter()); - if (_iv_discriminatorValue.equals("ONE")) { - return _iv_it.into(AddressInDistrictOne.class); - } else if (_iv_discriminatorValue.equals("TWO")) { - return _iv_it.into(AddressInDistrictTwo.class); - } else { - throw new RuntimeException(String.format("Querying interface '%s' returned row with unexpected discriminator value '%s'", "Address", _iv_discriminatorValue)); - } - } - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/default/schema.graphqls deleted file mode 100644 index 84b425423f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/default/schema.graphqls +++ /dev/null @@ -1,18 +0,0 @@ -type Query { - address: Address -} - -interface Address @table(name: "ADDRESS") @discriminate(on: "DISTRICT"){ - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressInDistrictOne implements Address @table(name: "ADDRESS") @discriminator(value: "ONE") { - id: ID - postalCode: String @field(name: "POSTAL_CODE") - postalCodeDuplicate: String @field(name: "POSTAL_CODE") -} - -type AddressInDistrictTwo implements Address @table(name: "ADDRESS") @discriminator(value: "TWO") { - id: ID - postalCode: String @field(name: "POSTAL_CODE") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/discriminatorColumnNameIsCaseInsensitive/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/discriminatorColumnNameIsCaseInsensitive/schema.graphqls deleted file mode 100644 index 6156c1d6ca..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/discriminatorColumnNameIsCaseInsensitive/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -# See synthetic db objects in graphitron/graphitron/pom.xml:138 for column sPonGeBob_CASED -interface AddressByDistrict @discriminate(on: "spongebob_cased") @table(name: "ADDRESS") { - postalCode: String @field(name: "POSTAL_CODE") -} - -type Address implements AddressByDistrict @discriminator(value: "ONE") { - postalCode: String @field(name: "POSTAL_CODE") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/implementingTypesWithSameField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/implementingTypesWithSameField/schema.graphqls deleted file mode 100644 index a807d39029..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/implementingTypesWithSameField/schema.graphqls +++ /dev/null @@ -1,17 +0,0 @@ -type Query { - address: Address -} - -interface Address @table(name: "ADDRESS") @discriminate(on: "DISTRICT"){ - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressInDistrictOne implements Address @table(name: "ADDRESS") @discriminator(value: "ONE") { - postalCode: String @field(name: "POSTAL_CODE") - phoneNumber: String @field(name: "PHONE") -} - -type AddressInDistrictTwo implements Address @table(name: "ADDRESS") @discriminator(value: "TWO") { - postalCode: String @field(name: "POSTAL_CODE") - phoneNumber: String @field(name: "PHONE") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/interfaceFieldOverriddenByAll/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/interfaceFieldOverriddenByAll/schema.graphqls deleted file mode 100644 index 62a5d7a72b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/interfaceFieldOverriddenByAll/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - address: Address -} - -interface Address @table(name: "ADDRESS") @discriminate(on: "DISTRICT"){ - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressInDistrictOne implements Address @table(name: "ADDRESS") @discriminator(value: "ONE") { - postalCode: String @field(name: "ADDRESS_") -} - -type AddressInDistrictTwo implements Address @table(name: "ADDRESS") @discriminator(value: "TWO") { - postalCode: String @field(name: "ADDRESS2") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/listed/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/listed/expected/QueryDBQueries.java deleted file mode 100644 index 91b7525e8a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/listed/expected/QueryDBQueries.java +++ /dev/null @@ -1,42 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; - -import fake.graphql.example.model.Address; -import fake.graphql.example.model.AddressInDistrictOne; -import fake.graphql.example.model.AddressInDistrictTwo; -import java.lang.RuntimeException; -import java.lang.String; -import java.util.List; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; - -public class QueryDBQueries { - - public static List<Address> addressForQuery(DSLContext _iv_ctx, SelectionSet _iv_select) { - var _a_address = ADDRESS.as("address_223244161"); - var _iv_orderFields = _a_address.fields(_a_address.getPrimaryKey().getFieldsArray()); - return _iv_ctx.select( - _a_address.DISTRICT.as("_iv_discriminator"), - _a_address.POSTAL_CODE.as("postalCode"), - _a_address.getId().as("id"), - _a_address.POSTAL_CODE.as("postalCodeDuplicate") - ) - .from(_a_address) - .where(_a_address.DISTRICT.in("ONE", "TWO")) - .orderBy(_iv_orderFields) - .fetch( - _iv_it -> { - var _iv_discriminatorValue = _iv_it.get("_iv_discriminator", _a_address.DISTRICT.getConverter()); - if (_iv_discriminatorValue.equals("ONE")) { - return _iv_it.into(AddressInDistrictOne.class); - } else if (_iv_discriminatorValue.equals("TWO")) { - return _iv_it.into(AddressInDistrictTwo.class); - } else { - throw new RuntimeException(String.format("Querying interface '%s' returned row with unexpected discriminator value '%s'", "Address", _iv_discriminatorValue)); - } - } - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/listed/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/listed/schema.graphqls deleted file mode 100644 index f0d4fb353a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/listed/schema.graphqls +++ /dev/null @@ -1,18 +0,0 @@ -type Query { - address: [Address] -} - -interface Address @table(name: "ADDRESS") @discriminate(on: "DISTRICT"){ - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressInDistrictOne implements Address @table(name: "ADDRESS") @discriminator(value: "ONE") { - id: ID - postalCode: String @field(name: "POSTAL_CODE") - postalCodeDuplicate: String @field(name: "POSTAL_CODE") -} - -type AddressInDistrictTwo implements Address @table(name: "ADDRESS") @discriminator(value: "TWO") { - id: ID - postalCode: String @field(name: "POSTAL_CODE") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/nested/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/nested/expected/QueryDBQueries.java deleted file mode 100644 index f071a8f493..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/nested/expected/QueryDBQueries.java +++ /dev/null @@ -1,58 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import fake.graphql.example.model.Address; -import fake.graphql.example.model.AddressInDistrictOne; -import fake.graphql.example.model.AddressInDistrictTwo; -import fake.graphql.example.model.City; -import fake.graphql.example.model.Customer; -import java.lang.RuntimeException; -import java.lang.String; -import java.util.List; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.Record1; -import org.jooq.impl.DSL; - -public class QueryDBQueries { - - public static List<Address> addressForQuery(DSLContext _iv_ctx, SelectionSet _iv_select) { - var _a_address = ADDRESS.as("address_223244161"); - var _a_address_223244161_city = _a_address.city().as("city_621065670"); - var _a_address_223244161_customer = _a_address.customer().as("customer_1589604633"); - - var _iv_orderFields = _a_address.fields(_a_address.getPrimaryKey().getFieldsArray()); - return _iv_ctx.select( - _a_address.DISTRICT.as("_iv_discriminator"), - _a_address.POSTAL_CODE.as("postalCode"), - DSL.field( - DSL.select(DSL.row(_a_address_223244161_city.getId()).mapping(Functions.nullOnAllNull(City::new))) - .from(_a_address_223244161_city) - ).as("city"), - DSL.row( - DSL.multiset( - DSL.select(DSL.row(_a_address_223244161_customer.getId()).mapping(Functions.nullOnAllNull(Customer::new))) - .from(_a_address_223244161_customer) - .orderBy(_a_address_223244161_customer.fields(_a_address_223244161_customer.getPrimaryKey().getFieldsArray())) - ) - ).mapping(_iv_e -> _iv_e.map(Record1::value1)).as("customers") - ) - .from(_a_address) - .where(_a_address.DISTRICT.in("ONE", "TWO")) - .orderBy(_iv_orderFields) - .fetch( - _iv_it -> { - var _iv_discriminatorValue = _iv_it.get("_iv_discriminator", _a_address.DISTRICT.getConverter()); - if (_iv_discriminatorValue.equals("ONE")) { - return _iv_it.into(AddressInDistrictOne.class); - } else if (_iv_discriminatorValue.equals("TWO")) { - return _iv_it.into(AddressInDistrictTwo.class); - } else { - throw new RuntimeException(String.format("Querying interface '%s' returned row with unexpected discriminator value '%s'", "Address", _iv_discriminatorValue)); - } - } - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/nested/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/nested/schema.graphqls deleted file mode 100644 index 6de8c418fd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/nested/schema.graphqls +++ /dev/null @@ -1,29 +0,0 @@ -type Query { - address: [Address] -} - -interface Address @table(name: "ADDRESS") @discriminate(on: "DISTRICT"){ - postalCode: String @field(name: "POSTAL_CODE") - city: City - customers: [Customer] -} - -type AddressInDistrictOne implements Address @table(name: "ADDRESS") @discriminator(value: "ONE") { - postalCode: String @field(name: "POSTAL_CODE") - city: City - customers: [Customer] -} - -type AddressInDistrictTwo implements Address @table(name: "ADDRESS") @discriminator(value: "TWO") { - postalCode: String @field(name: "POSTAL_CODE") - city: City - customers: [Customer] -} - -type City @table { - id: ID! -} - -type Customer @table { - id: ID! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/overriddenField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/overriddenField/schema.graphqls deleted file mode 100644 index ecc852cf58..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/overriddenField/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - address: Address -} - -interface Address @table(name: "ADDRESS") @discriminate(on: "DISTRICT"){ - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressInDistrictOne implements Address @table(name: "ADDRESS") @discriminator(value: "ONE") { - postalCode: String @field(name: "ADDRESS_") -} - -type AddressInDistrictTwo implements Address @table(name: "ADDRESS") @discriminator(value: "TWO") { - postalCode: String @field(name: "POSTAL_CODE") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/overriddenNonInterfaceField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/overriddenNonInterfaceField/schema.graphqls deleted file mode 100644 index 239d182f0d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/overriddenNonInterfaceField/schema.graphqls +++ /dev/null @@ -1,17 +0,0 @@ -type Query { - address: Address -} - -interface Address @table(name: "ADDRESS") @discriminate(on: "DISTRICT"){ - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressInDistrictOne implements Address @table(name: "ADDRESS") @discriminator(value: "ONE") { - postalCode: String @field(name: "POSTAL_CODE") - extraField: String @field(name: "ADDRESS_") -} - -type AddressInDistrictTwo implements Address @table(name: "ADDRESS") @discriminator(value: "TWO") { - postalCode: String @field(name: "POSTAL_CODE") - extraField: String @field(name: "POSTAL_CODE") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/paginated/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/paginated/expected/QueryDBQueries.java deleted file mode 100644 index cf91517158..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/paginated/expected/QueryDBQueries.java +++ /dev/null @@ -1,49 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import fake.graphql.example.model.Address; -import fake.graphql.example.model.AddressInDistrictOne; -import fake.graphql.example.model.AddressInDistrictTwo; -import java.lang.Integer; -import java.lang.RuntimeException; -import java.lang.String; -import java.util.List; -import no.sikt.graphql.helpers.query.QueryHelper; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.apache.commons.lang3.tuple.Pair; -import org.jooq.DSLContext; - -public class QueryDBQueries { - - public static List<Pair<String, Address>> addressForQuery(DSLContext _iv_ctx, Integer _iv_pageSize, String _mi_after, SelectionSet _iv_select) { - var _a_address = ADDRESS.as("address_223244161"); - var _iv_orderFields = _a_address.fields(_a_address.getPrimaryKey().getFieldsArray()); - return _iv_ctx.select( - _a_address.DISTRICT.as("_iv_discriminator"), - QueryHelper.getOrderByToken(_a_address, _iv_orderFields).as("_iv_token"), - _a_address.POSTAL_CODE.as("postalCode"), - _a_address.getId().as("id") - ) - .from(_a_address) - .where(_a_address.DISTRICT.in("ONE", "TWO")) - .orderBy(_iv_orderFields) - .seek(QueryHelper.getOrderByValues(_iv_ctx, _iv_orderFields, _mi_after)) - .limit(_iv_pageSize + 1) - .fetch( - _iv_it -> { - var _iv_discriminatorValue = _iv_it.get("_iv_discriminator", _a_address.DISTRICT.getConverter()); - var _iv_token = _iv_it.get("_iv_token", String.class); - Address _iv_data; - if (_iv_discriminatorValue.equals("ONE")) { - _iv_data = _iv_it.into(AddressInDistrictOne.class); - } else if (_iv_discriminatorValue.equals("TWO")) { - _iv_data = _iv_it.into(AddressInDistrictTwo.class); - } else { - throw new RuntimeException(String.format("Querying interface '%s' returned row with unexpected discriminator value '%s'", "Address", _iv_discriminatorValue)); - } - return Pair.of(_iv_token, _iv_data); - } - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/paginated/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/paginated/schema.graphqls deleted file mode 100644 index 4a44e939e2..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/paginated/schema.graphqls +++ /dev/null @@ -1,34 +0,0 @@ -type Query { - address(first: Int = 100, after: String): AddressConnection -} - -interface Address @table(name: "ADDRESS") @discriminate(on: "DISTRICT"){ - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressInDistrictOne implements Address @table(name: "ADDRESS") @discriminator(value: "ONE") { - id: ID - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressInDistrictTwo implements Address @table(name: "ADDRESS") @discriminator(value: "TWO") { - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressConnection { - edges: [AddressConnectionEdge] - pageInfo: PageInfo - nodes: [Address!]! -} - -type AddressConnectionEdge { - cursor: String - node: Address -} - -type PageInfo { - hasPreviousPage: Boolean! - hasNextPage: Boolean! - startCursor: String - endCursor: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/splitQueryReferenceInInterface/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/splitQueryReferenceInInterface/schema.graphqls deleted file mode 100644 index 312220a518..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/splitQueryReferenceInInterface/schema.graphqls +++ /dev/null @@ -1,18 +0,0 @@ -type Query { - address: [Address] -} - -interface Address @table(name: "ADDRESS") @discriminate(on: "DISTRICT"){ - postalCode: String @field(name: "POSTAL_CODE") - customer: Customer @splitQuery -} - -type AddressInDistrictOne implements Address @table(name: "ADDRESS") @discriminator(value: "ONE") { - postalCode: String @field(name: "POSTAL_CODE") - customer: Customer @splitQuery -} - -type AddressInDistrictTwo implements Address @table(name: "ADDRESS") @discriminator(value: "TWO") { - postalCode: String @field(name: "POSTAL_CODE") - customer: Customer @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/splitQueryReferenceInType/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/splitQueryReferenceInType/schema.graphqls deleted file mode 100644 index 0a1c9f463d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/splitQueryReferenceInType/schema.graphqls +++ /dev/null @@ -1,16 +0,0 @@ -type Query { - address: [Address] -} - -interface Address @table(name: "ADDRESS") @discriminate(on: "DISTRICT"){ - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressInDistrictOne implements Address @table(name: "ADDRESS") @discriminator(value: "ONE") { - postalCode: String @field(name: "POSTAL_CODE") - customer: Customer @splitQuery -} - -type AddressInDistrictTwo implements Address @table(name: "ADDRESS") @discriminator(value: "TWO") { - postalCode: String @field(name: "POSTAL_CODE") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/typeImplementsMultipleSingleTableInterfaces/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/typeImplementsMultipleSingleTableInterfaces/schema.graphqls deleted file mode 100644 index 89f201a393..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/typeImplementsMultipleSingleTableInterfaces/schema.graphqls +++ /dev/null @@ -1,18 +0,0 @@ -type Query { - address: Address - addressWithPhoneNumber: AddressWithPhoneNumber -} - -interface Address @table(name: "ADDRESS") @discriminate(on: "DISTRICT"){ - postalCode: String @field(name: "POSTAL_CODE") -} - -interface AddressWithPhoneNumber @table(name: "ADDRESS") @discriminate(on: "DISTRICT"){ - phone: String -} - -type AddressInDistrictOne implements Address & AddressWithPhoneNumber @table(name: "ADDRESS") @discriminator(value: "ONE") { - id: ID - postalCode: String @field(name: "POSTAL_CODE") - phone: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/withConditionReferenceField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/withConditionReferenceField/schema.graphqls deleted file mode 100644 index 15911181df..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/withConditionReferenceField/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - address: Address -} - -interface Address @table(name: "ADDRESS") @discriminate(on: "DISTRICT"){ - customer: CustomerTable @reference(path: [{condition: {name: "REFERENCE_CUSTOMER_CONDITION", method: "addressCustomer"}}]) -} - -type AddressInDistrictOne implements Address @table(name: "ADDRESS") @discriminator(value: "ONE") { - customer: CustomerTable @reference(path: [{condition: {name: "REFERENCE_CUSTOMER_CONDITION", method: "addressCustomer"}}]) -} - -type AddressInDistrictTwo implements Address @table(name: "ADDRESS") @discriminator(value: "TWO") { - customer: CustomerTable @reference(path: [{condition: {name: "REFERENCE_CUSTOMER_CONDITION", method: "addressCustomer"}}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/withReferenceField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/withReferenceField/schema.graphqls deleted file mode 100644 index 3e6b8fe61c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/withReferenceField/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - address: Address -} - -interface Address @table(name: "ADDRESS") @discriminate(on: "DISTRICT"){ - customer: CustomerTable -} - -type AddressInDistrictOne implements Address @table(name: "ADDRESS") @discriminator(value: "ONE") { - customer: CustomerTable -} - -type AddressInDistrictTwo implements Address @table(name: "ADDRESS") @discriminator(value: "TWO") { - customer: CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/withReferenceFieldInType/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/withReferenceFieldInType/schema.graphqls deleted file mode 100644 index 412460cf7d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/singleTableInterface/withReferenceFieldInType/schema.graphqls +++ /dev/null @@ -1,16 +0,0 @@ -type Query { - address: Address -} - -interface Address @table(name: "ADDRESS") @discriminate(on: "DISTRICT"){ - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressInDistrictOne implements Address @table(name: "ADDRESS") @discriminator(value: "ONE") { - customer: CustomerTable - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressInDistrictTwo implements Address @table(name: "ADDRESS") @discriminator(value: "TWO") { - postalCode: String @field(name: "POSTAL_CODE") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/connection/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/connection/schema.graphqls deleted file mode 100644 index 14e47f2136..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/connection/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(first: Int = 100, after: String): CustomerConnection -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/default/expected/CustomerDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/default/expected/CustomerDBQueries.java deleted file mode 100644 index 21e7576e47..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/default/expected/CustomerDBQueries.java +++ /dev/null @@ -1,35 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; - -import fake.graphql.example.model.Customer; -import java.lang.String; -import java.util.Map; -import java.util.Set; -import no.sikt.graphql.NodeIdStrategy; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.Record2; -import org.jooq.SelectField; -import org.jooq.impl.DSL; - -public class CustomerDBQueries { - public static Map<String, Customer> customerForNode(DSLContext _iv_ctx, NodeIdStrategy _iv_nodeIdStrategy, Set<String> _mi_id, SelectionSet _iv_select) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return _iv_ctx - .select( - _iv_nodeIdStrategy.createId("Customer", _a_customer.CUSTOMER_ID), - customerForNode_customer(_iv_nodeIdStrategy) - ) - .from(_a_customer) - .where(_iv_nodeIdStrategy.hasIds("Customer", _mi_id, _a_customer.CUSTOMER_ID)) - .fetchMap(Record2::value1, Record2::value2); - } - - private static SelectField<Customer> customerForNode_customer(NodeIdStrategy _iv_nodeIdStrategy) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return DSL.row(_iv_nodeIdStrategy.createId("Customer", _a_customer.CUSTOMER_ID)).mapping(Functions.nullOnAllNull(Customer::new)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/default/schema.graphqls deleted file mode 100644 index 9a77a3c84b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/default/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - node(id: ID!): Node -} - -type Customer implements Node @node @table { - id: ID! @nodeId -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/listedIdFieldAfterMutation/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/listedIdFieldAfterMutation/schema.graphqls deleted file mode 100644 index 242a486009..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/listedIdFieldAfterMutation/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - customer(in: [CustomerInput]): Output @mutation(typeName: DELETE) -} - -type Output { - id: [ID] @field(name: "CUSTOMER_ID") -} - -input CustomerInput @table(name: "Customer") { - id: ID @nodeId(typeName: "CustomerNode") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/manyFields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/manyFields/schema.graphqls deleted file mode 100644 index c2372ff146..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/manyFields/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Query { - node(id: ID!): Node -} - -type Customer implements Node @table { - id: ID - first: String @field(name: "FIRST_NAME") - last: String! @field(name: "LAST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/multitable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/multitable/schema.graphqls deleted file mode 100644 index 062e9b685d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/multitable/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Query { - query: SomeUnion -} - -union SomeUnion = CustomerTable \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/multitableWithInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/multitableWithInput/schema.graphqls deleted file mode 100644 index c1086411c1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/multitableWithInput/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Query { - query(customerId: Int @field(name: "CUSTOMER_ID")): SomeUnion -} - -union SomeUnion = CustomerTable \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/regularIdField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/regularIdField/schema.graphqls deleted file mode 100644 index e2979e3e15..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/regularIdField/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - customer: Customer -} - -type Customer @table { - id: ID @field(name: "CUSTOMER_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/regularIdInputField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/regularIdInputField/schema.graphqls deleted file mode 100644 index c86adc7ab4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/regularIdInputField/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - customer(id: ID! @field(name: "CUSTOMER_ID")): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/rootQuery/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/rootQuery/expected/QueryDBQueries.java deleted file mode 100644 index 69cbbf31ef..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/rootQuery/expected/QueryDBQueries.java +++ /dev/null @@ -1,31 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; - -import fake.graphql.example.model.Customer; -import java.util.List; -import no.sikt.graphql.NodeIdStrategy; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.SelectField; -import org.jooq.impl.DSL; - -public class QueryDBQueries { - public static List<Customer> customersForQuery(DSLContext _iv_ctx, NodeIdStrategy _iv_nodeIdStrategy, - SelectionSet _iv_select) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - var _iv_orderFields = _a_customer.fields(_a_customer.getPrimaryKey().getFieldsArray()); - return _iv_ctx - .select(customersForQuery_customer(_iv_nodeIdStrategy)) - .from(_a_customer) - .orderBy(_iv_orderFields) - .fetch(_iv_it -> _iv_it.into(Customer.class)); - } - - private static SelectField<Customer> customersForQuery_customer(NodeIdStrategy _iv_nodeIdStrategy) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return DSL.row(_iv_nodeIdStrategy.createId("Customer", _a_customer.CUSTOMER_ID)).mapping(Functions.nullOnAllNull(Customer::new)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/rootQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/rootQuery/schema.graphqls deleted file mode 100644 index 95794e9f91..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/rootQuery/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - customers: [Customer] -} - -type Customer implements Node @node @table { - id: ID! @nodeId -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/splitQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/splitQuery/schema.graphqls deleted file mode 100644 index a4b1fbbda7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/splitQuery/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - query: Customer @notGenerated -} - -type Customer implements Node @node @table { - id: ID! @nodeId - address: Address @splitQuery -} - -type Address implements Node @node @table { - id: ID! @nodeId -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/splitQueryOnlyPrimaryKey/expected/CustomerDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/splitQueryOnlyPrimaryKey/expected/CustomerDBQueries.java deleted file mode 100644 index 1948f05827..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/splitQueryOnlyPrimaryKey/expected/CustomerDBQueries.java +++ /dev/null @@ -1,49 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; - -import fake.graphql.example.model.Address; - -import java.util.List; -import java.util.Map; -import java.util.Set; - -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CustomerRecord; -import no.sikt.graphql.NodeIdStrategy; -import no.sikt.graphql.helpers.query.QueryHelper; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.Record2; -import org.jooq.SelectField; -import org.jooq.impl.DSL; - -public class CustomerDBQueries { - public static Map<CustomerRecord, Address> addressForCustomer(DSLContext _iv_ctx, - NodeIdStrategy _iv_nodeIdStrategy, Set<CustomerRecord> _rk_customer, - SelectionSet _iv_select) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - var _a_customer_2168032777_address = _a_customer.address().as("address_2138977089"); - var _iv_orderFields = _a_customer_2168032777_address.fields(_a_customer_2168032777_address.getPrimaryKey().getFieldsArray()); - return _iv_ctx - .select( - DSL.row(_a_customer.CUSTOMER_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_customer.CUSTOMER_ID))), - DSL.field( - DSL.select(addressForCustomer_address(_iv_nodeIdStrategy)) - .from(_a_customer_2168032777_address) - - ) - ) - .from(_a_customer) - .where(DSL.row(_a_customer.CUSTOMER_ID).in(_rk_customer.stream().map(_iv_it -> _iv_it.key().valuesRow()).toList())) - .fetchMap(Record2::value1, Record2::value2); - } - - private static SelectField<Address> addressForCustomer_address( - NodeIdStrategy _iv_nodeIdStrategy) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - var _a_customer_2168032777_address = _a_customer.address().as("address_2138977089"); - return DSL.row(_iv_nodeIdStrategy.createId("Address", _a_customer_2168032777_address.ADDRESS_ID)).mapping(Functions.nullOnAllNull(Address::new)); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/splitQueryOnlyPrimaryKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/splitQueryOnlyPrimaryKey/schema.graphqls deleted file mode 100644 index 8538c050f8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/splitQueryOnlyPrimaryKey/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Customer implements Node @node @table { - id: ID! @nodeId - address: Address @splitQuery -} - -type Address implements Node @node @table { - id: ID! @nodeId -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/twoInterfaces/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/twoInterfaces/schema.graphqls deleted file mode 100644 index 49fbed48e2..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/twoInterfaces/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - node(id: ID!): Node -} - -interface Named { - firstName: String @field(name: "FIRST_NAME") -} - -type Customer implements Node & Named @node @table { - id: ID - firstName: String @field(name: "FIRST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/withoutTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/withoutTable/schema.graphqls deleted file mode 100644 index de3f46f081..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/interfaces/strategynode/withoutTable/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - node(id: ID): Node -} - -type Type implements Node { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/lookup/default/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/lookup/default/expected/QueryDBQueries.java deleted file mode 100644 index ece4a56d35..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/lookup/default/expected/QueryDBQueries.java +++ /dev/null @@ -1,34 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; -import fake.graphql.example.model.CustomerTable; -import java.lang.String; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.Record2; -import org.jooq.SelectField; -import org.jooq.impl.DSL; - -public class QueryDBQueries { - public static Map<String, CustomerTable> queryForQuery(DSLContext _iv_ctx, List<String> _mi_id, SelectionSet _iv_select) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return _iv_ctx - .select( - _a_customer.getId(), - queryForQuery_customerTable(_mi_id) - ) - .from(_a_customer) - .where(_mi_id.size() > 0 ? _a_customer.hasIds(_mi_id.stream().collect(Collectors.toSet())) : DSL.noCondition()) - .fetchMap(Record2::value1, Record2::value2); - } - - private static SelectField<CustomerTable> queryForQuery_customerTable(List<String> _mi_id) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return DSL.row(_a_customer.getId()).mapping(Functions.nullOnAllNull(CustomerTable::new)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/lookup/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/lookup/default/schema.graphqls deleted file mode 100644 index d5523cd602..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/lookup/default/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(id: [ID]! @lookupKey): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/lookup/inputKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/lookup/inputKey/schema.graphqls deleted file mode 100644 index b4c68ab842..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/lookup/inputKey/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: [Input] @lookupKey): CustomerTable -} - -input Input { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/lookup/listedKeyInInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/lookup/listedKeyInInput/schema.graphqls deleted file mode 100644 index 68779bcd47..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/lookup/listedKeyInInput/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: Input): CustomerTable -} - -input Input { - id: [ID] @lookupKey -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/lookup/manyKeys/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/lookup/manyKeys/schema.graphqls deleted file mode 100644 index 38c1da8cd1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/lookup/manyKeys/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(firstName: [String] @field(name: "FIRST_NAME") @lookupKey, lastName: [String] @field(name: "LAST_NAME") @lookupKey): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/lookup/nonIDKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/lookup/nonIDKey/schema.graphqls deleted file mode 100644 index 38d83e8502..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/lookup/nonIDKey/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(integer: [Int] @field(name: "LENGTH") @lookupKey): Film -} - -type Film @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/lookup/otherNonKeyField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/lookup/otherNonKeyField/schema.graphqls deleted file mode 100644 index e5a90cf090..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/lookup/otherNonKeyField/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(firstName: [String] @field(name: "FIRST_NAME") @lookupKey, lastName: [String] @field(name: "LAST_NAME")): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/nodeQuery/customKeyColumns/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/nodeQuery/customKeyColumns/schema.graphqls deleted file mode 100644 index 78e03cc7f6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/nodeQuery/customKeyColumns/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer implements Node @node(keyColumns: ["CUSTOMER_ID", "EMAIL"]) @table { - id: ID! @nodeId -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/nodeQuery/customTypeId/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/nodeQuery/customTypeId/schema.graphqls deleted file mode 100644 index b3bd59b71c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/nodeQuery/customTypeId/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer implements Node @node(typeId: "C") @table { - id: ID! @nodeId -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/nodeQuery/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/nodeQuery/default/schema.graphqls deleted file mode 100644 index 97dc2eb8ac..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/nodeQuery/default/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer implements Node @node @table { - id: ID! @nodeId -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/root/customKeyColumns/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/root/customKeyColumns/schema.graphqls deleted file mode 100644 index 78e03cc7f6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/root/customKeyColumns/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer implements Node @node(keyColumns: ["CUSTOMER_ID", "EMAIL"]) @table { - id: ID! @nodeId -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/root/customKeyColumnsWrongCase/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/root/customKeyColumnsWrongCase/schema.graphqls deleted file mode 100644 index abe5171a11..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/root/customKeyColumnsWrongCase/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer implements Node @node(keyColumns: ["Customer_ID", "email"]) @table { - id: ID! @nodeId -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/root/customTypeId/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/root/customTypeId/schema.graphqls deleted file mode 100644 index b3bd59b71c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/root/customTypeId/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer implements Node @node(typeId: "C") @table { - id: ID! @nodeId -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/root/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/root/default/schema.graphqls deleted file mode 100644 index 97dc2eb8ac..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/root/default/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer implements Node @node @table { - id: ID! @nodeId -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/root/nested/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/root/nested/schema.graphqls deleted file mode 100644 index 09d99ee227..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/root/nested/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Customer implements Node @node @table { - id: ID! @nodeId - address: Address -} - -type Address implements Node @node @table { - id: ID! @nodeId -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/splitQuery/customKeyColumns/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/splitQuery/customKeyColumns/schema.graphqls deleted file mode 100644 index 674610514e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/splitQuery/customKeyColumns/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer implements Node @node(keyColumns: ["CUSTOMER_ID", "EMAIL"]) @table { - address: Address @splitQuery -} - -type Address implements Node @node(keyColumns: ["ADDRESS_ID"]) @table { - id: ID! @nodeId -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/splitQuery/customTypeId/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/splitQuery/customTypeId/schema.graphqls deleted file mode 100644 index 05174f8a9c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/splitQuery/customTypeId/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Address implements Node @node(typeId: "A") @table { - customer: Customer @splitQuery -} - -type Customer implements Node @node(typeId: "C") @table { - id: ID! @nodeId -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/splitQuery/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/splitQuery/default/schema.graphqls deleted file mode 100644 index d5604b5a47..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeDirective/splitQuery/default/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Address implements Node @node @table { - customer: Customer @splitQuery -} - -type Customer implements Node @node @table { - id: ID! @nodeId -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/asInputOnAnotherTableObjectWithSameTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/asInputOnAnotherTableObjectWithSameTable/schema.graphqls deleted file mode 100644 index b82e00aebe..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/asInputOnAnotherTableObjectWithSameTable/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - query(in: ID! @nodeId(typeName: "CustomerNode")): Customer -} - -type Customer @table { - name: String @field(name: "FIRST_NAME") -} - -type CustomerNode implements Node @node(typeId: "C") @table(name: "CUSTOMER") { - id: ID! -} - diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/default/schema.graphqls deleted file mode 100644 index a0261ab909..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/default/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(customerId: ID! @nodeId(typeName: "Customer")): Customer -} - -type Customer implements Node @node @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/implicitInputType/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/implicitInputType/schema.graphqls deleted file mode 100644 index 556eb0178c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/implicitInputType/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(filter: [CustomerFilter]!): [CustomerNode] -} - -input CustomerFilter @table(name: "CUSTOMER") { - id: ID! @nodeId -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/implicitReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/implicitReference/schema.graphqls deleted file mode 100644 index f1f2663ec4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/implicitReference/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(addressId: ID! @nodeId(typeName: "Address")): Customer -} - -type Customer implements Node @node @table { - id: ID! @nodeId -} - -type Address implements Node @node @table { - id: ID! @nodeId -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/inEntitiesQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/inEntitiesQuery/schema.graphqls deleted file mode 100644 index 0de75e2206..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/inEntitiesQuery/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -union _Entity = Customer - -type Customer implements Node @node @table @key(fields: "id") { - id: ID! @nodeId -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/inputType/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/inputType/schema.graphqls deleted file mode 100644 index 13ceabb42a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/inputType/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(filter: CustomerFilter!): Customer -} - -type Customer implements Node @node @table { - id: ID! -} - -input CustomerFilter { - customerId: ID! @nodeId(typeName: "Customer") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/javaRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/javaRecord/schema.graphqls deleted file mode 100644 index ff6452e1bb..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/javaRecord/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - customer(in: CustomerJavaRecordInput!): CustomerNode -} - -input CustomerJavaRecordInput @record(record: {name: "DUMMY_RECORD"}) { - id: ID! @nodeId(typeName: "CustomerNode") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/javaRecordOptional/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/javaRecordOptional/schema.graphqls deleted file mode 100644 index 08ad651b17..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/javaRecordOptional/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - customer(in: CustomerJavaRecordInput!): CustomerNode -} - -input CustomerJavaRecordInput @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - id: ID @nodeId(typeName: "CustomerNode") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/javaRecordReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/javaRecordReference/schema.graphqls deleted file mode 100644 index 6cbbcab308..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/javaRecordReference/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - customer(in: CustomerJavaRecordInput!): CustomerNode -} - -input CustomerJavaRecordInput @record(record: {name: "DUMMY_RECORD"}) { - addressId: ID! @nodeId(typeName: "Address") -} - -type Address implements Node @node @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/jooqRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/jooqRecord/schema.graphqls deleted file mode 100644 index 71c8977b81..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/jooqRecord/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(filter: CustomerFilter!): CustomerNode -} - -input CustomerFilter @table(name: "CUSTOMER") { - customerId: ID! @nodeId(typeName: "CustomerNode") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/jooqRecordReferenceKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/jooqRecordReferenceKey/schema.graphqls deleted file mode 100644 index af56d554df..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/jooqRecordReferenceKey/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - query(filter: FilmInput!): Film -} - -input FilmInput @table(name: "FILM") { - originalLanguageId: ID! @nodeId(typeName: "Language") @reference(path: [{key: "FILM__FILM_ORIGINAL_LANGUAGE_ID_FKEY"}]) -} - -type Film @table { - id: ID! -} - -type Language implements Node @node @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/jooqRecordReferenceOptional/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/jooqRecordReferenceOptional/schema.graphqls deleted file mode 100644 index cd8250a60c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/jooqRecordReferenceOptional/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(filter: CustomerFilter!): CustomerNode -} - -input CustomerFilter @table(name: "CUSTOMER") { - addressId: ID @nodeId(typeName: "Address") -} - -type Address implements Node @node @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/jooqRecordReferenceTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/jooqRecordReferenceTable/schema.graphqls deleted file mode 100644 index 084ae819d5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/jooqRecordReferenceTable/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(filter: CustomerFilter!): CustomerNode -} - -input CustomerFilter @table(name: "CUSTOMER") { - addressId: ID! @nodeId(typeName: "Address") @reference(path: [{table: "ADDRESS"}]) -} - -type Address implements Node @node @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/jooqRecordReferenceWithCustomFieldOrder/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/jooqRecordReferenceWithCustomFieldOrder/schema.graphqls deleted file mode 100644 index 4ed6397f89..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/jooqRecordReferenceWithCustomFieldOrder/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - query(filter: FilmActorFilter!): FilmActor -} - -input FilmActorFilter @table(name: "FILM_ACTOR") { - actorId: ID! @nodeId(typeName: "Actor") @reference(path: [{key: "FILM_ACTOR__FILM_ACTOR_ACTOR_ID_LAST_NAME_FKEY"}]) -} - -type FilmActor implements Node @node @table(name: "FILM_ACTOR") { - id: ID! -} - -type Actor implements Node @node(typeId: "A", keyColumns: ["LAST_NAME", "ACTOR_ID"]) @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/jooqRecordReferenceWithCustomId/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/jooqRecordReferenceWithCustomId/schema.graphqls deleted file mode 100644 index 3bb83cfe8e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/jooqRecordReferenceWithCustomId/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(filter: CustomerFilter!): CustomerNode -} - -input CustomerFilter @table(name: "CUSTOMER") { - addressId: ID! @nodeId(typeName: "Address") @reference(path: [{key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY"}]) -} - -type Address implements Node @node(typeId: "A", keyColumns: "ADDRESS_ID") @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/listedInputJOOQRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/listedInputJOOQRecord/schema.graphqls deleted file mode 100644 index b57931150b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/listedInputJOOQRecord/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - customer(in: [CustomerNodeInputTable!]!): [CustomerNode] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/lookupKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/lookupKey/schema.graphqls deleted file mode 100644 index 0a668d4af4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/lookupKey/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(customerId: [ID!]! @nodeId(typeName: "Customer") @lookupKey): [Customer] -} - -type Customer implements Node @node(typeId: "C", keyColumns: ["CUSTOMER_ID"]) @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/reference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/reference/schema.graphqls deleted file mode 100644 index 5c1cd6b99d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/reference/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(addressId: ID! @nodeId(typeName: "Address") @reference(path: [{table: "ADDRESS"}])): Customer -} - -type Customer implements Node @node @table { - id: ID! -} - -type Address implements Node @node @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/referenceViaTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/referenceViaTable/schema.graphqls deleted file mode 100644 index 1e28808e47..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/referenceViaTable/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(cityId: ID! @nodeId(typeName: "City") @reference(path: [{table: "ADDRESS"}])): Customer -} - -type Customer implements Node @node @table { - id: ID! @nodeId -} - -type City implements Node @node @table { - id: ID! @nodeId -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/referencingTableWithSelfReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/referencingTableWithSelfReference/schema.graphqls deleted file mode 100644 index 3b9cacb008..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/referencingTableWithSelfReference/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - languagesFilteredByFilm(filmId: ID! @nodeId(typeName : "Film")): [FilmActor] -} - - -type FilmActor implements Node @table(name: "FILM_ACTOR") @node { - id: ID! @nodeId -} - -type Film implements Node @node @table { - id: ID! @nodeId -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/referencingTableWithSelfReferenceReverse/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/referencingTableWithSelfReferenceReverse/schema.graphqls deleted file mode 100644 index 9e772251d5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/referencingTableWithSelfReferenceReverse/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - languagesFilteredByFilm(filmId: ID! @nodeId(typeName : "Film") @reference(path : [{key : "FILM__FILM_LANGUAGE_ID_FKEY"}])): [Language] -} - - -type Language implements Node @table @node { - id: ID! @nodeId -} - -type Film implements Node @node @table { - id: ID! @nodeId -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/selfReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/selfReference/schema.graphqls deleted file mode 100644 index e6c3e7d701..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/selfReference/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(sequelId: ID! @nodeId(typeName: "Film") @reference(path: [{table: "FILM"}])): Film -} - -type Film implements Node @node @table { - id: ID! @nodeId -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/strategyOrderingInSubqueries/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/strategyOrderingInSubqueries/schema.graphqls deleted file mode 100644 index 0478d97f2f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/strategyOrderingInSubqueries/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - query(customerId: ID! @nodeId(typeName: "Customer")): Customer @tableMethod(tableMethodReference: {className: "no.sikt.graphitron.codereferences.services.CustomerTableMethod", method: "customerTable"}) -} - -type Customer implements Node @node @table { - id: ID! - address: Address -} - -type Address implements Node @node @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/typeWithoutTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/typeWithoutTable/schema.graphqls deleted file mode 100644 index 2adb52a8ae..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/input/typeWithoutTable/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: CustomerNodeInputTable!): CustomerNoTable -} - -type CustomerNoTable { - id: ID! @nodeId(typeName: "CustomerNode") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/conditionReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/conditionReference/schema.graphqls deleted file mode 100644 index c4327758e7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/conditionReference/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer implements Node @node @table { - addressId: ID @nodeId(typeName: "Address") @reference(path: [{condition: {className: "no.sikt.graphitron.codereferences.conditions.ReferenceCustomerCondition"}}]) -} - -type Address implements Node @node @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/conditionReferenceWithKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/conditionReferenceWithKey/schema.graphqls deleted file mode 100644 index 29d515606e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/conditionReferenceWithKey/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer implements Node @node @table { - addressId: ID @nodeId(typeName: "Address") @reference(path: [{condition: {className: "no.sikt.graphitron.codereferences.conditions.ReferenceCustomerCondition"}, key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY"}]) -} - -type Address implements Node @node @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/default/schema.graphqls deleted file mode 100644 index 6184efd9fa..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/default/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer implements Node @node @table { - id: ID! @nodeId(typeName: "Customer") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/implicitReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/implicitReference/schema.graphqls deleted file mode 100644 index 844c119f46..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/implicitReference/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Customer implements Node @node @table { - id: ID! - addressId: ID @nodeId(typeName: "Address") -} - -type Address implements Node @node @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/inAnotherTableObjectWithSameTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/inAnotherTableObjectWithSameTable/schema.graphqls deleted file mode 100644 index 90fe7d2e36..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/inAnotherTableObjectWithSameTable/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - id: ID! @nodeId(typeName: "CustomerNode") -} - -type CustomerNode implements Node @node(typeId: "C") @table(name: "CUSTOMER") { - id: ID! -} - diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/noWrapping/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/noWrapping/schema.graphqls deleted file mode 100644 index e0980bc1a6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/noWrapping/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(in: CustomerNodeInputTable): ID @nodeId(typeName: "CustomerNode") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/reference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/reference/schema.graphqls deleted file mode 100644 index c03c784f60..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/reference/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer implements Node @node @table { - id: ID @nodeId(typeName: "Address") @reference(path: [{table: "ADDRESS"}]) -} - -type Address implements Node @node @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/referenceAndInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/referenceAndInput/schema.graphqls deleted file mode 100644 index 49b22415fe..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/referenceAndInput/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(in: In!): CustomerNoTable -} - -input In @table(name: "CUSTOMER") { - firstname: String! @field(name: "FIRST_NAME") -} - -type CustomerNoTable { - id: ID! @nodeId(typeName: "CustomerNode") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/referenceViaTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/referenceViaTable/schema.graphqls deleted file mode 100644 index f624213ced..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/referenceViaTable/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer implements Node @node @table { - id: ID @nodeId(typeName: "City") @reference(path: [{table: "ADDRESS"}]) -} - -type City implements Node @node @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/selfReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/selfReference/schema.graphqls deleted file mode 100644 index 7dd3b29ae8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/selfReference/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Film -} - -type Film implements Node @node @table { - sequelId: ID @nodeId(typeName: "Film") @reference(path: [{table: "FILM"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/singleTableInterface/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/singleTableInterface/schema.graphqls deleted file mode 100644 index 6f6f8a25bc..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/nodeId/output/singleTableInterface/schema.graphqls +++ /dev/null @@ -1,17 +0,0 @@ -type Query { - address: Address -} - -interface Address @table(name: "ADDRESS") @discriminate(on: "DISTRICT"){ - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressInDistrictOne implements Node & Address @table(name: "ADDRESS") @discriminator(value: "ONE") @node(typeId: "A1", keyColumns: "ADDRESS_ID"){ - id: ID! @nodeId - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressInDistrictTwo implements Node & Address @table(name: "ADDRESS") @discriminator(value: "TWO") @node(typeId: "A2"){ - id: ID! @nodeId - postalCode: String @field(name: "POSTAL_CODE") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/entity/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/entity/schema.graphqls deleted file mode 100644 index 616e72d6d6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/entity/schema.graphqls +++ /dev/null @@ -1,10 +0,0 @@ -union _Entity = Customer - -type Customer @table @key(fields: "id") { - id: ID! - address: Address -} - -type Address @table { - id: ID! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/externalField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/externalField/schema.graphqls deleted file mode 100644 index a71d53c3a2..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/externalField/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - customer: Customer -} - -type Customer @table(name: "CUSTOMER") { - name: String @externalField -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/fieldReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/fieldReference/schema.graphqls deleted file mode 100644 index d82298c1fe..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/fieldReference/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - address: Address! @reference(path: [{table: "ADDRESS"}]) -} - -type Address @table { - id: ID! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/multisetReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/multisetReference/schema.graphqls deleted file mode 100644 index b8f3550136..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/multisetReference/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Address -} - -type Address @table { - customers: [Customer] -} - -type Customer @table { - id: ID! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/multitable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/multitable/schema.graphqls deleted file mode 100644 index 16808f46c8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/multitable/schema.graphqls +++ /dev/null @@ -1,18 +0,0 @@ -type Query { - payments: Payment -} - -union Payment = PaymentTypeOne | PaymentTypeTwo - -type PaymentTypeOne @table(name: "PAYMENT_P2007_01") { - amount: Int -} - -type PaymentTypeTwo @table(name: "PAYMENT_P2007_02") { - amount: Int - rental: Rental -} - -type Rental @table { - id: ID! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/multitableSplitQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/multitableSplitQuery/schema.graphqls deleted file mode 100644 index 79b2cdb3c0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/multitableSplitQuery/schema.graphqls +++ /dev/null @@ -1,22 +0,0 @@ -type Query { - query: Customer -} - -union Payment = PaymentTypeOne | PaymentTypeTwo - -type Customer @table { - payments: Payment @splitQuery -} - -type PaymentTypeOne @table(name: "PAYMENT_P2007_01") { - amount: Int -} - -type PaymentTypeTwo @table(name: "PAYMENT_P2007_02") { - amount: Int - rental: Rental -} - -type Rental @table { - id: ID! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/nestedExternalField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/nestedExternalField/schema.graphqls deleted file mode 100644 index b56e33958a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/nestedExternalField/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Address -} - -type Address @table { - customers: Customer -} - -type Customer @table(name: "CUSTOMER") { - name: String @externalField -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/nestedFieldReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/nestedFieldReference/schema.graphqls deleted file mode 100644 index 1681e2320f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/nestedFieldReference/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - address: Address! @reference(path: [{table: "ADDRESS"}]) -} - -type Address @table { - cityId: Int @field(name: "CITY_ID") @reference(path: {table: "CITY"}) -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/node/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/node/schema.graphqls deleted file mode 100644 index 3fd2eeaa78..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/node/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Customer implements Node @table { - name: String! @field(name: "FIRST_NAME") - address: Address -} - -type Address @table { - id: ID! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/scalarReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/scalarReference/schema.graphqls deleted file mode 100644 index eda21d53e0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/scalarReference/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - cityId: Int! @field(name: "CITY_ID") @reference(path: [{table: "ADDRESS"}]) -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/selectionHelpers/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/selectionHelpers/schema.graphqls deleted file mode 100644 index 10fc668905..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/selectionHelpers/schema.graphqls +++ /dev/null @@ -1,16 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - name: String! @field(name: "FIRST_NAME") - address: Address -} - -type Address @table { - city: City -} - -type City @table { - id: ID! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/singleTableInterface/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/singleTableInterface/schema.graphqls deleted file mode 100644 index 503da4c81e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/singleTableInterface/schema.graphqls +++ /dev/null @@ -1,21 +0,0 @@ -type Query { - query: AddressByDistrict -} - -interface AddressByDistrict @table(name: "ADDRESS") @discriminate(on: "DISTRICT"){ - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressInDistrictOne implements AddressByDistrict @table(name: "ADDRESS") @discriminator(value: "ONE") { - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressInDistrictTwo implements AddressByDistrict @table(name: "ADDRESS") @discriminator(value: "TWO") { - postalCode: String @field(name: "POSTAL_CODE") - customer: Customer -} - - -type Customer @table { - id: ID! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/splitQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/splitQuery/schema.graphqls deleted file mode 100644 index 8394703ec9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/splitQuery/schema.graphqls +++ /dev/null @@ -1,16 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - address: Address @splitQuery -} - -type Address @table { - id: ID! - city: City -} - -type City @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/splitQueryList/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/splitQueryList/schema.graphqls deleted file mode 100644 index f91925e8a4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/splitQueryList/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Address -} - -type Address @table { - customers: [Customer] @splitQuery -} - -type Customer @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/tableColumn/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/tableColumn/schema.graphqls deleted file mode 100644 index 4670b1af32..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/optionalSelect/tableColumn/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - name: String! @field(name: "FIRST_NAME") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/customFieldNames/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/customFieldNames/schema.graphqls deleted file mode 100644 index e1c0bbfb8f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/customFieldNames/schema.graphqls +++ /dev/null @@ -1,21 +0,0 @@ -type Query { - query(mySortBy: SortInput @orderBy): [CustomerTable] -} - -input SortInput { - myCustomSortDirection: MyOrderDirection! - myCustomSortField: SortableField! -} - -enum MyOrderDirection { - ASC - DESC -} - -enum SortableField { - NAME @order(index: "IDX_LAST_NAME") -} - -type CustomerTable @table(name: "Customer") { - name: String @field(name: "LAST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/default/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/default/expected/QueryDBQueries.java deleted file mode 100644 index ae99341120..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/default/expected/QueryDBQueries.java +++ /dev/null @@ -1,37 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; - -import fake.graphql.example.model.CustomerTable; -import fake.graphql.example.model.Order; -import java.lang.IllegalArgumentException; -import java.util.List; -import no.sikt.graphql.helpers.query.QueryHelper; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.SelectField; -import org.jooq.impl.DSL; - -public class QueryDBQueries { - public static List<CustomerTable> queryForQuery(DSLContext _iv_ctx, Order _mi_orderBy, SelectionSet _iv_select) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - var _iv_orderFields = _mi_orderBy == null - ? _a_customer.fields(_a_customer.getPrimaryKey().getFieldsArray()) - : switch (_mi_orderBy.getOrderByField().toString()) { - case "NAME" -> QueryHelper.getSortFields(_a_customer, "IDX_LAST_NAME", _mi_orderBy.getDirection().toString()); - default -> throw new IllegalArgumentException("Unknown order by field: " + _mi_orderBy.getOrderByField().toString()); - }; - return _iv_ctx - .select(queryForQuery_customerTable(_mi_orderBy)) - .from(_a_customer) - .orderBy(_iv_orderFields) - .fetch(_iv_it -> _iv_it.into(CustomerTable.class)); - } - - private static SelectField<CustomerTable> queryForQuery_customerTable(Order _mi_orderBy) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return DSL.row(_a_customer.LAST_NAME).mapping(Functions.nullOnAllNull(CustomerTable::new)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/default/schema.graphqls deleted file mode 100644 index 9780d00793..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/default/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(orderBy: Order @orderBy): [CustomerTable] -} - -enum OrderByField { - NAME @order(index: "IDX_LAST_NAME") -} - -type CustomerTable @table(name: "Customer") { - name: String @field(name: "LAST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/deprecatedIndex/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/deprecatedIndex/schema.graphqls deleted file mode 100644 index 51ca46d600..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/deprecatedIndex/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(orderBy: Order @orderBy): [CustomerTable] -} - -enum OrderByField { - NAME @index(name: "IDX_LAST_NAME") -} - -type CustomerTable @table(name: "Customer") { - name: String @field(name: "LAST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/fields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/fields/schema.graphqls deleted file mode 100644 index 8df3ada537..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/fields/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(orderBy: Order @orderBy): [CustomerTable] -} - -enum OrderByField { - NAME @order(fields: [{name: "LAST_NAME"}]) -} - -type CustomerTable @table(name: "Customer") { - name: String @field(name: "LAST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/fieldsWithCollation/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/fieldsWithCollation/schema.graphqls deleted file mode 100644 index 23a0ffd021..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/fieldsWithCollation/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(orderBy: Order @orderBy): [CustomerTable] -} - -enum OrderByField { - NAME @order(fields: [{name: "LAST_NAME", collate: "xdanish_ai"}]) -} - -type CustomerTable @table(name: "Customer") { - name: String @field(name: "LAST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/mixed/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/mixed/schema.graphqls deleted file mode 100644 index 344157203b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/mixed/schema.graphqls +++ /dev/null @@ -1,14 +0,0 @@ -type Query { - query(orderBy: Order @orderBy): [CustomerTable] -} - -enum OrderByField { - NAME @order(index: "IDX_LAST_NAME") - STATUS @order(fields: [{name: "ACTIVE"}]) - ID @order(primaryKey: true) -} - -type CustomerTable @table(name: "Customer") { - name: String @field(name: "LAST_NAME") - active: Int @field(name: "ACTIVE") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/multipleFieldsWithCollation/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/multipleFieldsWithCollation/schema.graphqls deleted file mode 100644 index 1d9bd779d4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/multipleFieldsWithCollation/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - query(orderBy: Order @orderBy): [CustomerTable] -} - -enum OrderByField { - NAME_NORSK @order(fields: [ - {name: "LAST_NAME", collate: "xdanish_ai"}, - {name: "FIRST_NAME", collate: "xdanish_ai"} - ]) -} - -type CustomerTable @table(name: "Customer") { - lastName: String @field(name: "LAST_NAME") - firstName: String @field(name: "FIRST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/multipleModes/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/multipleModes/schema.graphqls deleted file mode 100644 index c464f640d7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/multipleModes/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(orderBy: Order @orderBy): [CustomerTable] -} - -enum OrderByField { - NAME @order(index: "IDX_LAST_NAME", fields: [{name: "LAST_NAME"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/noPrimaryKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/noPrimaryKey/schema.graphqls deleted file mode 100644 index 6c94e48361..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/noPrimaryKey/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(orderBy: Order @orderBy): [PgDepend] -} - -enum OrderByField { - DEPENDER @order(index: "PG_DEPEND_DEPENDER_INDEX") -} - -type PgDepend @table(name: "PG_DEPEND") { - refobjid: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/paginated/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/paginated/expected/QueryDBQueries.java deleted file mode 100644 index 3cc51ec7c8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/paginated/expected/QueryDBQueries.java +++ /dev/null @@ -1,48 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; - -import fake.graphql.example.model.CustomerTable; -import fake.graphql.example.model.Order; -import java.lang.IllegalArgumentException; -import java.lang.Integer; -import java.lang.String; -import java.util.List; -import no.sikt.graphql.helpers.query.QueryHelper; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.SelectField; -import org.jooq.impl.DSL; - -public class QueryDBQueries { - public static List<Pair<String, CustomerTable>> queryForQuery(DSLContext _iv_ctx, Order _mi_orderBy, Integer _iv_pageSize, - String _mi_after, SelectionSet _iv_select) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - var _iv_orderFields = _mi_orderBy == null - ? _a_customer.fields(_a_customer.getPrimaryKey().getFieldsArray()) - : switch (_mi_orderBy.getOrderByField().toString()) { - case "NAME" -> QueryHelper.getSortFields(_a_customer, "IDX_LAST_NAME", _mi_orderBy.getDirection().toString()); - default -> throw new IllegalArgumentException("Unknown order by field: " + _mi_orderBy.getOrderByField().toString()); - }; - return _iv_ctx - .select( - QueryHelper.getOrderByToken(_a_customer, _iv_orderFields), - queryForQuery_customerTable(_mi_orderBy) - ) - .from(_a_customer) - .orderBy(_iv_orderFields) - .seek(QueryHelper.getOrderByValues(_iv_ctx, _iv_orderFields, _mi_after)) - .limit(_iv_pageSize + 1) - .fetch() - .map(_iv_it -> new ImmutablePair<>(_iv_it.value1(), _iv_it.value2())); - } - - private static SelectField<CustomerTable> queryForQuery_customerTable(Order _mi_orderBy) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return DSL.row(_a_customer.LAST_NAME).mapping(Functions.nullOnAllNull(CustomerTable::new)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/paginated/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/paginated/schema.graphqls deleted file mode 100644 index a74c4320b7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/paginated/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(orderBy: Order @orderBy, first: Int = 100, after: String): CustomerConnection -} - -enum OrderByField { - NAME @order(index: "IDX_LAST_NAME") -} - -type CustomerTable @table(name: "Customer") { - name: String @field(name: "LAST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/primaryKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/primaryKey/schema.graphqls deleted file mode 100644 index 17de82010b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/primaryKey/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(orderBy: Order @orderBy): [CustomerTable] -} - -enum OrderByField { - ID @order(primaryKey: true) -} - -type CustomerTable @table(name: "Customer") { - name: String @field(name: "LAST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/primaryKeyNoPK/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/primaryKeyNoPK/schema.graphqls deleted file mode 100644 index 83c3f60663..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/primaryKeyNoPK/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(orderBy: Order @orderBy): [PgDepend] -} - -enum OrderByField { - ID @order(primaryKey: true) -} - -type PgDepend @table(name: "PG_DEPEND") { - refobjid: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/twoFieldIndex/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/twoFieldIndex/schema.graphqls deleted file mode 100644 index 015c204164..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/twoFieldIndex/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - query(order: Order @orderBy): [Inventory] -} - -type Inventory @table { - storeId: String! @field(name: "STORE_ID") - filmId: String! @field(name: "FILM_ID") -} - -enum OrderByField { - STORE_ID_FILM_ID @order(index: "IDX_STORE_ID_FILM_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/twoFields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/twoFields/schema.graphqls deleted file mode 100644 index ebfda47a42..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/twoFields/schema.graphqls +++ /dev/null @@ -1,13 +0,0 @@ -type Query { - query(orderBy: Order @orderBy): [CustomerTable] -} - -enum OrderByField { - NAME @order(index: "IDX_LAST_NAME") - STORE @order(index: "IDX_FK_STORE_ID") -} - -type CustomerTable @table(name: "Customer") { - name: String @field(name: "LAST_NAME") - storeId: String @field(name: "STORE_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/withoutList/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/withoutList/expected/QueryDBQueries.java deleted file mode 100644 index bb1c8c8b1f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/withoutList/expected/QueryDBQueries.java +++ /dev/null @@ -1,27 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; - -import fake.graphql.example.model.CustomerTable; -import fake.graphql.example.model.Order; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.SelectField; -import org.jooq.impl.DSL; - -public class QueryDBQueries { - public static CustomerTable queryForQuery(DSLContext _iv_ctx, Order _mi_orderBy, SelectionSet _iv_select) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return _iv_ctx - .select(queryForQuery_customerTable(_mi_orderBy)) - .from(_a_customer) - .fetchOne(_iv_it -> _iv_it.into(CustomerTable.class)); - } - - private static SelectField<CustomerTable> queryForQuery_customerTable(Order _mi_orderBy) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return DSL.row(_a_customer.LAST_NAME).mapping(Functions.nullOnAllNull(CustomerTable::new)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/withoutList/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/withoutList/schema.graphqls deleted file mode 100644 index e2b145388f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/withoutList/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(orderBy: Order @orderBy): CustomerTable -} - -enum OrderByField { - NAME @order(index: "IDX_LAST_NAME") -} - -type CustomerTable @table(name: "Customer") { - name: String @field(name: "LAST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/wrongField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/wrongField/schema.graphqls deleted file mode 100644 index 9d622ce9b1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/wrongField/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(orderBy: Order @orderBy): [CustomerTable] -} - -enum OrderByField { - NAME @order(fields: [{name: "NONEXISTENT_FIELD"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/wrongIndex/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/wrongIndex/schema.graphqls deleted file mode 100644 index 9b4210fc5e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/orderby/wrongIndex/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(orderBy: Order @orderBy): [CustomerTable] -} - -enum OrderByField { - EMAIL @order(index: "WRONG_INDEX") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/arrayFieldOver22/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/arrayFieldOver22/schema.graphqls deleted file mode 100644 index 247faf4094..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/arrayFieldOver22/schema.graphqls +++ /dev/null @@ -1,29 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - lastName1: String! @field(name: "LAST_NAME") - lastName2: String! @field(name: "LAST_NAME") - lastName3: String! @field(name: "LAST_NAME") - lastName4: String! @field(name: "LAST_NAME") - lastName5: String! @field(name: "LAST_NAME") - lastName6: String! @field(name: "LAST_NAME") - lastName7: String! @field(name: "LAST_NAME") - lastName8: String! @field(name: "LAST_NAME") - lastName9: String! @field(name: "LAST_NAME") - lastName10: String! @field(name: "LAST_NAME") - lastName11: String! @field(name: "LAST_NAME") - lastName12: String! @field(name: "LAST_NAME") - lastName13: String! @field(name: "LAST_NAME") - lastName14: String! @field(name: "LAST_NAME") - lastName15: String! @field(name: "LAST_NAME") - lastName16: String! @field(name: "LAST_NAME") - lastName17: String! @field(name: "LAST_NAME") - lastName18: String! @field(name: "LAST_NAME") - lastName19: String! @field(name: "LAST_NAME") - lastName20: String! @field(name: "LAST_NAME") - lastName21: String! @field(name: "LAST_NAME") - lastName22: String! @field(name: "LAST_NAME") - usernames: [String!] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/arrayScalarField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/arrayScalarField/schema.graphqls deleted file mode 100644 index 1278fbec71..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/arrayScalarField/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - usernames: [String] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/constructType/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/constructType/schema.graphqls deleted file mode 100644 index 9d006d6eec..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/constructType/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer @table { - field: Inner @experimental_constructType(selection: "f") -} - -type Inner { - f: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/constructTypeMultipleFields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/constructTypeMultipleFields/schema.graphqls deleted file mode 100644 index 497ea41e22..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/constructTypeMultipleFields/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Customer @table { - field: Inner @experimental_constructType(selection: "f0, f1: STORE_ID") -} - -type Inner { - f0: String - f1: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/constructTypePartialSelection/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/constructTypePartialSelection/schema.graphqls deleted file mode 100644 index ff35ec15ff..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/constructTypePartialSelection/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Customer @table { - field: Inner @experimental_constructType(selection: "f0") -} - -type Inner { - f0: String - f1: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/constructTypeWithColumnMapping/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/constructTypeWithColumnMapping/schema.graphqls deleted file mode 100644 index f1397f8ed7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/constructTypeWithColumnMapping/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer @table { - field: Inner @experimental_constructType(selection: "f: STORE_ID") -} - -type Inner { - f: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/constructTypeWithEnum/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/constructTypeWithEnum/schema.graphqls deleted file mode 100644 index 40607067d4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/constructTypeWithEnum/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer @table { - field: Inner @experimental_constructType(selection: "f") -} - -type Inner { - f: DummyEnum -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/default/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/default/expected/QueryDBQueries.java deleted file mode 100644 index d6fa5688a4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/default/expected/QueryDBQueries.java +++ /dev/null @@ -1,26 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; - -import fake.graphql.example.model.CustomerTable; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.SelectField; -import org.jooq.impl.DSL; - -public class QueryDBQueries { - public static CustomerTable queryForQuery(DSLContext _iv_ctx, SelectionSet _iv_select) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return _iv_ctx - .select(queryForQuery_customerTable()) - .from(_a_customer) - .fetchOne(_iv_it -> _iv_it.into(CustomerTable.class)); - } - - private static SelectField<CustomerTable> queryForQuery_customerTable() { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return DSL.row(_a_customer.getId()).mapping(Functions.nullOnAllNull(CustomerTable::new)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/default/schema.graphqls deleted file mode 100644 index dc06cf64fa..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/default/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query: CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/externalField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/externalField/schema.graphqls deleted file mode 100644 index 91e4efd92d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/externalField/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - # The field name and table name refers to this method: - # no.sikt.graphitron.codereferences.extensionmethods.FirstClass.name(no.sikt.graphitron.jooq.generated.testdata.public_.tables.Customer) - name: String @externalField -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/externalFieldOver22/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/externalFieldOver22/schema.graphqls deleted file mode 100644 index 92d93121ce..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/externalFieldOver22/schema.graphqls +++ /dev/null @@ -1,31 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - # The field name and table name refers to this method: - # no.sikt.graphitron.codereferences.extensionmethods.FirstClass.name(no.sikt.graphitron.jooq.generated.testdata.public_.tables.Customer) - name: String @externalField - lastName1: String! @field(name: "LAST_NAME") - lastName2: String! @field(name: "LAST_NAME") - lastName3: String! @field(name: "LAST_NAME") - lastName4: String! @field(name: "LAST_NAME") - lastName5: String! @field(name: "LAST_NAME") - lastName6: String! @field(name: "LAST_NAME") - lastName7: String! @field(name: "LAST_NAME") - lastName8: String! @field(name: "LAST_NAME") - lastName9: String! @field(name: "LAST_NAME") - lastName10: String! @field(name: "LAST_NAME") - lastName11: String! @field(name: "LAST_NAME") - lastName12: String! @field(name: "LAST_NAME") - lastName13: String! @field(name: "LAST_NAME") - lastName14: String! @field(name: "LAST_NAME") - lastName15: String! @field(name: "LAST_NAME") - lastName16: String! @field(name: "LAST_NAME") - lastName17: String! @field(name: "LAST_NAME") - lastName18: String! @field(name: "LAST_NAME") - lastName19: String! @field(name: "LAST_NAME") - lastName20: String! @field(name: "LAST_NAME") - lastName21: String! @field(name: "LAST_NAME") - lastName22: String! @field(name: "LAST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/externalFieldWrappedType/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/externalFieldWrappedType/schema.graphqls deleted file mode 100644 index c68d4ffff3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/externalFieldWrappedType/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - something: Something -} - -type Something { - name: String @externalField -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/fieldOverride/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/fieldOverride/schema.graphqls deleted file mode 100644 index 02447439f3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/fieldOverride/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - name: String @field(name: "FIRST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/fieldOverrideID/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/fieldOverrideID/schema.graphqls deleted file mode 100644 index 28ba41b219..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/fieldOverrideID/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Payment -} - -type Payment @table { - customerID: ID @field(name: "customerId") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/fromMultipleSchemas/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/fromMultipleSchemas/schema.graphqls deleted file mode 100644 index 6b00a3d9db..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/fromMultipleSchemas/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Query { - fromSchema1: CustomerTable - - fromSchema2: PgUser -} - -type PgUser @table(name: "PG_USER") { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/implicitSplitQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/implicitSplitQuery/schema.graphqls deleted file mode 100644 index 23d0e4367c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/implicitSplitQuery/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Wrapper @table(name: "ADDRESS"){ - id: ID - - query(lastName: String @field(name: "LAST_NAME")): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/innerDoubleNestedRow/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/innerDoubleNestedRow/schema.graphqls deleted file mode 100644 index 4842349410..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/innerDoubleNestedRow/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - wrapper: Wrapper1 -} - -type Wrapper1 { - wrapper: Wrapper2 -} - -type Wrapper2 { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/innerNestedRow/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/innerNestedRow/schema.graphqls deleted file mode 100644 index b737dc46eb..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/innerNestedRow/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - wrapper: Wrapper -} - -type Wrapper { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/innerNestedRowExtraField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/innerNestedRowExtraField/schema.graphqls deleted file mode 100644 index 72ceffc212..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/innerNestedRowExtraField/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - email: String - wrapper: Wrapper -} - -type Wrapper { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/innerTable/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/innerTable/expected/QueryDBQueries.java deleted file mode 100644 index 390ce22848..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/innerTable/expected/QueryDBQueries.java +++ /dev/null @@ -1,42 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; - -import fake.graphql.example.model.Address; -import fake.graphql.example.model.Customer; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.SelectField; -import org.jooq.impl.DSL; - -public class QueryDBQueries { - public static Customer queryForQuery(DSLContext _iv_ctx, SelectionSet _iv_select) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - var _a_customer_2168032777_address = _a_customer.address().as("address_2138977089"); - return _iv_ctx - .select(queryForQuery_customer()) - .from(_a_customer) - .fetchOne(_iv_it -> _iv_it.into(Customer.class)); - } - - private static SelectField<Customer> queryForQuery_customer() { - var _a_customer = CUSTOMER.as("customer_2168032777"); - var _a_customer_2168032777_address = _a_customer.address().as("address_2138977089"); - return DSL.row( - _a_customer.getId(), - DSL.field( - DSL.select(_1_queryForQuery_customer_address()) - .from(_a_customer_2168032777_address) - - ) - ).mapping(Functions.nullOnAllNull(Customer::new)); - } - - private static SelectField<Address> _1_queryForQuery_customer_address() { - var _a_customer = CUSTOMER.as("customer_2168032777"); - var _a_customer_2168032777_address = _a_customer.address().as("address_2138977089"); - return DSL.row(_a_customer_2168032777_address.getId()).mapping(Functions.nullOnAllNull(Address::new)); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/innerTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/innerTable/schema.graphqls deleted file mode 100644 index 1592ade7c0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/innerTable/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - id: ID - address: Address -} - -type Address @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/innerTableListed/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/innerTableListed/expected/QueryDBQueries.java deleted file mode 100644 index b69d9c3ff9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/innerTableListed/expected/QueryDBQueries.java +++ /dev/null @@ -1,44 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; - -import fake.graphql.example.model.Address; -import fake.graphql.example.model.Customer; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.Record1; -import org.jooq.SelectField; -import org.jooq.impl.DSL; - -public class QueryDBQueries { - public static Customer queryForQuery(DSLContext _iv_ctx, SelectionSet _iv_select) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - var _a_customer_2168032777_address = _a_customer.address().as("address_2138977089"); - return _iv_ctx - .select(queryForQuery_customer()) - .from(_a_customer) - .fetchOne(_iv_it -> _iv_it.into(Customer.class)); - } - - private static SelectField<Customer> queryForQuery_customer() { - var _a_customer = CUSTOMER.as("customer_2168032777"); - var _a_customer_2168032777_address = _a_customer.address().as("address_2138977089"); - return DSL.row( - DSL.row( - DSL.multiset( - DSL.select(_1_queryForQuery_customer_address()) - .from(_a_customer_2168032777_address) - .orderBy(_a_customer_2168032777_address.fields(_a_customer_2168032777_address.getPrimaryKey().getFieldsArray())) - ) - ).mapping(_iv_e -> _iv_e.map(Record1::value1)) - ).mapping(Functions.nullOnAllNull(Customer::new)); - } - - private static SelectField<Address> _1_queryForQuery_customer_address() { - var _a_customer = CUSTOMER.as("customer_2168032777"); - var _a_customer_2168032777_address = _a_customer.address().as("address_2138977089"); - return DSL.row(_a_customer_2168032777_address.getId()).mapping(Functions.nullOnAllNull(Address::new)); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/innerTableListed/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/innerTableListed/schema.graphqls deleted file mode 100644 index bcb0e3aca4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/innerTableListed/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - address: [Address] -} - -type Address @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/innerTableSelfReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/innerTableSelfReference/schema.graphqls deleted file mode 100644 index ea17d3429c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/innerTableSelfReference/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - film: Film @notGenerated -} - -type Film @table { - id: ID! - sequel: Film @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/invalidFieldOverride/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/invalidFieldOverride/schema.graphqls deleted file mode 100644 index c2d01d996b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/invalidFieldOverride/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - name: String @field(name: "WRONG") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/listed/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/listed/schema.graphqls deleted file mode 100644 index d3342225f0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/listed/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query: [CustomerTable] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/multipleFields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/multipleFields/schema.graphqls deleted file mode 100644 index 56395b174f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/multipleFields/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - id: ID - email: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/noGeneratedField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/noGeneratedField/schema.graphqls deleted file mode 100644 index 39a65ff9c0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/noGeneratedField/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Address -} - -type Address @table { - customer: CustomerTable @splitQuery @notGenerated -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/noWrapping/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/noWrapping/schema.graphqls deleted file mode 100644 index 81efd50207..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/noWrapping/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(in: CustomerInputTable): String @field(name: "FIRST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/noWrappingListed/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/noWrappingListed/schema.graphqls deleted file mode 100644 index 82316964df..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/noWrappingListed/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(in: [CustomerInputTable]): [String] @field(name: "FIRST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/outerDoubleNestedRow/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/outerDoubleNestedRow/schema.graphqls deleted file mode 100644 index b13105273a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/outerDoubleNestedRow/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Wrapper1 -} - -type Wrapper1 { - customer: Wrapper2 -} - -type Wrapper2 { - customer: CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/outerDoubleNestedWithArgument/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/outerDoubleNestedWithArgument/schema.graphqls deleted file mode 100644 index b3ea1062bb..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/outerDoubleNestedWithArgument/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(firstName: String @field(name: "FIRST_NAME")): Wrapper1 -} - -type Wrapper1 { - customer: Wrapper2 -} - -type Wrapper2 { - customer: CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/outerNestedListedRow/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/outerNestedListedRow/schema.graphqls deleted file mode 100644 index 9d429a9741..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/outerNestedListedRow/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Wrapper -} - -type Wrapper { - customer: [CustomerTable] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/outerNestedRow/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/outerNestedRow/schema.graphqls deleted file mode 100644 index f9b994397a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/outerNestedRow/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Wrapper -} - -type Wrapper { - customer: CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/outerNestedRowExtraField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/outerNestedRowExtraField/schema.graphqls deleted file mode 100644 index 203072c2c7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/outerNestedRowExtraField/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - query: Wrapper -} - -type Wrapper { - email: String - customer: CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/outerNestedWithArgument/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/outerNestedWithArgument/schema.graphqls deleted file mode 100644 index 3ea5887964..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/outerNestedWithArgument/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(firstName: String @field(name: "FIRST_NAME")): Outer -} - -type Outer { - customers: CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/outerNestedWithArgumentListed/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/outerNestedWithArgumentListed/schema.graphqls deleted file mode 100644 index cdb3069f66..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/outerNestedWithArgumentListed/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(firstName: [String!]! @field(name: "FIRST_NAME")): Outer -} - -type Outer { - customers: [CustomerTable!]! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/outerNestedWithListedError/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/outerNestedWithListedError/schema.graphqls deleted file mode 100644 index 912f359810..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/outerNestedWithListedError/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - query: Wrapper -} - -type Wrapper { - customer: CustomerTable - errors: [ValidationError] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/over22Fields/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/over22Fields/expected/QueryDBQueries.java deleted file mode 100644 index 3209d105e3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/over22Fields/expected/QueryDBQueries.java +++ /dev/null @@ -1,76 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; -import fake.graphql.example.model.Film; -import java.util.Arrays; -import java.util.Objects; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.SelectField; -import org.jooq.impl.DSL; - -public class QueryDBQueries { - public static Film queryForQuery(DSLContext _iv_ctx, SelectionSet _iv_select) { - var _a_film = FILM.as("film_2185543202"); - return _iv_ctx - .select(queryForQuery_film()) - .from(_a_film) - .fetchOne(_iv_it -> _iv_it.into(Film.class)); - } - - private static SelectField<Film> queryForQuery_film() { - var _a_film = FILM.as("film_2185543202"); - return DSL.row( - _a_film.TITLE, - _a_film.TITLE, - _a_film.TITLE, - _a_film.TITLE, - _a_film.TITLE, - _a_film.TITLE, - _a_film.TITLE, - _a_film.TITLE, - _a_film.TITLE, - _a_film.TITLE, - _a_film.TITLE, - _a_film.TITLE, - _a_film.TITLE, - _a_film.TITLE, - _a_film.TITLE, - _a_film.TITLE, - _a_film.TITLE, - _a_film.TITLE, - _a_film.TITLE, - _a_film.TITLE, - _a_film.TITLE, - _a_film.TITLE, - _a_film.TITLE - ).mapping(Film.class, _iv_r -> - Arrays.stream(_iv_r).allMatch(Objects::isNull) ? null : new Film( - _a_film.TITLE.getDataType().convert(_iv_r[0]), - _a_film.TITLE.getDataType().convert(_iv_r[1]), - _a_film.TITLE.getDataType().convert(_iv_r[2]), - _a_film.TITLE.getDataType().convert(_iv_r[3]), - _a_film.TITLE.getDataType().convert(_iv_r[4]), - _a_film.TITLE.getDataType().convert(_iv_r[5]), - _a_film.TITLE.getDataType().convert(_iv_r[6]), - _a_film.TITLE.getDataType().convert(_iv_r[7]), - _a_film.TITLE.getDataType().convert(_iv_r[8]), - _a_film.TITLE.getDataType().convert(_iv_r[9]), - _a_film.TITLE.getDataType().convert(_iv_r[10]), - _a_film.TITLE.getDataType().convert(_iv_r[11]), - _a_film.TITLE.getDataType().convert(_iv_r[12]), - _a_film.TITLE.getDataType().convert(_iv_r[13]), - _a_film.TITLE.getDataType().convert(_iv_r[14]), - _a_film.TITLE.getDataType().convert(_iv_r[15]), - _a_film.TITLE.getDataType().convert(_iv_r[16]), - _a_film.TITLE.getDataType().convert(_iv_r[17]), - _a_film.TITLE.getDataType().convert(_iv_r[18]), - _a_film.TITLE.getDataType().convert(_iv_r[19]), - _a_film.TITLE.getDataType().convert(_iv_r[20]), - _a_film.TITLE.getDataType().convert(_iv_r[21]), - _a_film.TITLE.getDataType().convert(_iv_r[22]) - ) - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/over22Fields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/over22Fields/schema.graphqls deleted file mode 100644 index a40615f5f9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/over22Fields/schema.graphqls +++ /dev/null @@ -1,29 +0,0 @@ -type Query { - query: Film -} - -type Film @table { - title0: String! @field(name: "TITLE") - title1: String! @field(name: "TITLE") - title2: String! @field(name: "TITLE") - title3: String! @field(name: "TITLE") - title4: String! @field(name: "TITLE") - title5: String! @field(name: "TITLE") - title6: String! @field(name: "TITLE") - title7: String! @field(name: "TITLE") - title8: String! @field(name: "TITLE") - title9: String! @field(name: "TITLE") - title10: String! @field(name: "TITLE") - title11: String! @field(name: "TITLE") - title12: String! @field(name: "TITLE") - title13: String! @field(name: "TITLE") - title14: String! @field(name: "TITLE") - title15: String! @field(name: "TITLE") - title16: String! @field(name: "TITLE") - title17: String! @field(name: "TITLE") - title18: String! @field(name: "TITLE") - title19: String! @field(name: "TITLE") - title20: String! @field(name: "TITLE") - title21: String! @field(name: "TITLE") - title22: String! @field(name: "TITLE") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/over22FieldsWithInnerRow/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/over22FieldsWithInnerRow/schema.graphqls deleted file mode 100644 index 2756771bb4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/over22FieldsWithInnerRow/schema.graphqls +++ /dev/null @@ -1,34 +0,0 @@ -type Query { - query: Film -} - -type Film @table { - title0: String! @field(name: "TITLE") - title1: String! @field(name: "TITLE") - title2: String! @field(name: "TITLE") - title3: String! @field(name: "TITLE") - title4: String! @field(name: "TITLE") - title5: String! @field(name: "TITLE") - title6: String! @field(name: "TITLE") - title7: String! @field(name: "TITLE") - title8: String! @field(name: "TITLE") - title9: String! @field(name: "TITLE") - title10: String! @field(name: "TITLE") - title11: String! @field(name: "TITLE") - title12: String! @field(name: "TITLE") - title13: String! @field(name: "TITLE") - title14: String! @field(name: "TITLE") - title15: String! @field(name: "TITLE") - title16: String! @field(name: "TITLE") - title17: String! @field(name: "TITLE") - title18: String! @field(name: "TITLE") - title19: String! @field(name: "TITLE") - title20: String! @field(name: "TITLE") - title21: String! @field(name: "TITLE") - - wrapper: Wrapper -} - -type Wrapper { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/over22FieldsWithMultiset/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/over22FieldsWithMultiset/schema.graphqls deleted file mode 100644 index 4e906846f2..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/over22FieldsWithMultiset/schema.graphqls +++ /dev/null @@ -1,34 +0,0 @@ -type Query { - query: Film -} - -type Film @table { - title0: String! @field(name: "TITLE") - title1: String! @field(name: "TITLE") - title2: String! @field(name: "TITLE") - title3: String! @field(name: "TITLE") - title4: String! @field(name: "TITLE") - title5: String! @field(name: "TITLE") - title6: String! @field(name: "TITLE") - title7: String! @field(name: "TITLE") - title8: String! @field(name: "TITLE") - title9: String! @field(name: "TITLE") - title10: String! @field(name: "TITLE") - title11: String! @field(name: "TITLE") - title12: String! @field(name: "TITLE") - title13: String! @field(name: "TITLE") - title14: String! @field(name: "TITLE") - title15: String! @field(name: "TITLE") - title16: String! @field(name: "TITLE") - title17: String! @field(name: "TITLE") - title18: String! @field(name: "TITLE") - title19: String! @field(name: "TITLE") - title20: String! @field(name: "TITLE") - title21: String! @field(name: "TITLE") - - wrapper: [Wrapper] -} - -type Wrapper { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/over22FieldsWithSplitQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/over22FieldsWithSplitQuery/schema.graphqls deleted file mode 100644 index 714676869b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/over22FieldsWithSplitQuery/schema.graphqls +++ /dev/null @@ -1,34 +0,0 @@ -type Query { - query: Film -} - -type Film @table { - title0: String! @field(name: "TITLE") - title1: String! @field(name: "TITLE") - title2: String! @field(name: "TITLE") - title3: String! @field(name: "TITLE") - title4: String! @field(name: "TITLE") - title5: String! @field(name: "TITLE") - title6: String! @field(name: "TITLE") - title7: String! @field(name: "TITLE") - title8: String! @field(name: "TITLE") - title9: String! @field(name: "TITLE") - title10: String! @field(name: "TITLE") - title11: String! @field(name: "TITLE") - title12: String! @field(name: "TITLE") - title13: String! @field(name: "TITLE") - title14: String! @field(name: "TITLE") - title15: String! @field(name: "TITLE") - title16: String! @field(name: "TITLE") - title17: String! @field(name: "TITLE") - title18: String! @field(name: "TITLE") - title19: String! @field(name: "TITLE") - title20: String! @field(name: "TITLE") - title21: String! @field(name: "TITLE") - - language: Language @splitQuery @reference(path: [{key: "FILM__FILM_LANGUAGE_ID_FKEY"}]) -} - -type Language @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/over22FieldsWithVariousTypes/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/over22FieldsWithVariousTypes/schema.graphqls deleted file mode 100644 index 35b9ddda34..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/over22FieldsWithVariousTypes/schema.graphqls +++ /dev/null @@ -1,30 +0,0 @@ -type Query { - query: Film -} - -type Film @table { - title0: String! @field(name: "TITLE") - title1: String! @field(name: "TITLE") - title2: String! @field(name: "TITLE") - title3: String! @field(name: "TITLE") - title4: String! @field(name: "TITLE") - title5: String! @field(name: "TITLE") - title6: String! @field(name: "TITLE") - title7: String! @field(name: "TITLE") - title8: String! @field(name: "TITLE") - title9: String! @field(name: "TITLE") - title10: String! @field(name: "TITLE") - title11: String! @field(name: "TITLE") - title12: String! @field(name: "TITLE") - title13: String! @field(name: "TITLE") - title14: String! @field(name: "TITLE") - title15: String! @field(name: "TITLE") - title16: String! @field(name: "TITLE") - title17: String! @field(name: "TITLE") - title18: String! @field(name: "TITLE") - title19: String! @field(name: "TITLE") - title20: String! @field(name: "TITLE") - - length: Int - rating: DummyEnum -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/requiredRowWithOptionalFields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/requiredRowWithOptionalFields/schema.graphqls deleted file mode 100644 index 863d870873..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/requiredRowWithOptionalFields/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - wrapper: Wrapper! -} - -type Wrapper { - email: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/requiredRowWithOptionalFieldsAndNeighbourField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/requiredRowWithOptionalFieldsAndNeighbourField/schema.graphqls deleted file mode 100644 index 3707a0fdac..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/requiredRowWithOptionalFieldsAndNeighbourField/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - email: String - wrapper: Wrapper! -} - -type Wrapper { - email: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/requiredRowWithOptionalFieldsAndNeighbourRow/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/requiredRowWithOptionalFieldsAndNeighbourRow/schema.graphqls deleted file mode 100644 index 7a464184bd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/requiredRowWithOptionalFieldsAndNeighbourRow/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - wrapper0: Wrapper! - wrapper1: Wrapper -} - -type Wrapper { - email: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/requiredRowWithOptionalFieldsAndOver22Fields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/requiredRowWithOptionalFieldsAndOver22Fields/schema.graphqls deleted file mode 100644 index 0f010062f0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/requiredRowWithOptionalFieldsAndOver22Fields/schema.graphqls +++ /dev/null @@ -1,35 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - wrapper: Wrapper! - - email0: String @field(name: "EMAIL") - email1: String @field(name: "EMAIL") - email2: String @field(name: "EMAIL") - email3: String @field(name: "EMAIL") - email4: String @field(name: "EMAIL") - email5: String @field(name: "EMAIL") - email6: String @field(name: "EMAIL") - email7: String @field(name: "EMAIL") - email8: String @field(name: "EMAIL") - email9: String @field(name: "EMAIL") - email10: String @field(name: "EMAIL") - email11: String @field(name: "EMAIL") - email12: String @field(name: "EMAIL") - email13: String @field(name: "EMAIL") - email14: String @field(name: "EMAIL") - email15: String @field(name: "EMAIL") - email16: String @field(name: "EMAIL") - email17: String @field(name: "EMAIL") - email18: String @field(name: "EMAIL") - email19: String @field(name: "EMAIL") - email20: String @field(name: "EMAIL") - email21: String @field(name: "EMAIL") - email22: String @field(name: "EMAIL") -} - -type Wrapper { - email: String @field(name: "EMAIL") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/skipsSplits/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/skipsSplits/schema.graphqls deleted file mode 100644 index cc8b21f239..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/skipsSplits/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - query: Address -} - -type Address @table { - id: ID - customer: CustomerTable @splitQuery @notGenerated -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/splitQuery/expected/WrapperDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/splitQuery/expected/WrapperDBQueries.java deleted file mode 100644 index 72e1ba81ae..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/splitQuery/expected/WrapperDBQueries.java +++ /dev/null @@ -1,43 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; -import fake.graphql.example.model.CustomerTable; -import java.util.List; -import java.util.Map; -import java.util.Set; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.AddressRecord; -import no.sikt.graphql.helpers.query.QueryHelper; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.Record2; -import org.jooq.SelectField; -import org.jooq.impl.DSL; - -public class WrapperDBQueries { - public static Map<AddressRecord, CustomerTable> queryForWrapper(DSLContext _iv_ctx, - Set<AddressRecord> _rk_wrapper, SelectionSet _iv_select) { - var _a_address = ADDRESS.as("address_223244161"); - var _a_address_223244161_customer = _a_address.customer().as("customer_1589604633"); - var _iv_orderFields = _a_address_223244161_customer.fields(_a_address_223244161_customer.getPrimaryKey().getFieldsArray()); - return _iv_ctx - .select( - DSL.row(_a_address.ADDRESS_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_address.ADDRESS_ID))), - DSL.field( - DSL.select(queryForWrapper_customerTable()) - .from(_a_address_223244161_customer) - ) - ) - .from(_a_address) - .where(DSL.row(_a_address.ADDRESS_ID).in(_rk_wrapper.stream().map(_iv_it -> _iv_it.key().valuesRow()).toList())) - .fetchMap(Record2::value1, Record2::value2); - } - - private static SelectField<CustomerTable> queryForWrapper_customerTable() { - var _a_address = ADDRESS.as("address_223244161"); - var _a_address_223244161_customer = _a_address.customer().as("customer_1589604633"); - return DSL.row(_a_address_223244161_customer.getId()).mapping(Functions.nullOnAllNull(CustomerTable::new)); - } -} - diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/splitQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/splitQuery/schema.graphqls deleted file mode 100644 index 213ec3a49e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/splitQuery/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Wrapper @table(name: "ADDRESS") { - id: ID - - query: CustomerTable @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/splitQueryListed/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/splitQueryListed/schema.graphqls deleted file mode 100644 index 2b5c9f1fd4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/splitQueryListed/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Wrapper @table(name: "ADDRESS") { - id: ID - - query: [CustomerTable] @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/tableWithSameNameAsSchema/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/tableWithSameNameAsSchema/schema.graphqls deleted file mode 100644 index ce056a1661..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/tableWithSameNameAsSchema/schema.graphqls +++ /dev/null @@ -1,13 +0,0 @@ -type Query { - query: Public -} - - -type Public @table(name: "PUBLIC") { # Java field name for table is "PUBLIC_" - dummyColumn: String @field(name: "DUMMY_COLUMN") - vacation: Vacation -} - -type Vacation @table { - vacationId: Int @field(name: "VACATION_ID") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/wrappedTableWithSelfReferenceAndTableInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/wrappedTableWithSelfReferenceAndTableInput/schema.graphqls deleted file mode 100644 index df7ab8e1f0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/wrappedTableWithSelfReferenceAndTableInput/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - query(input: FilmInput!): FilmWrapper -} - -type FilmWrapper { - film: Film -} - -type Film @table { - id: ID! -} - -input FilmInput @table(name: "FILM") { - filmId: Int! @field(name: "FILM_ID") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/wrapperWithTableForTableWithSelfReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/wrapperWithTableForTableWithSelfReference/schema.graphqls deleted file mode 100644 index a86cdcf48d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/wrapperWithTableForTableWithSelfReference/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Film -} - -type Film @table { - wrapper: Wrapper -} - -type Wrapper @table(name: "FILM") { - id: Int @field(name: "FILM_ID") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/wrapperWithoutTableForTableWithSelfReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/wrapperWithoutTableForTableWithSelfReference/schema.graphqls deleted file mode 100644 index e37fb0a5d7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/output/wrapperWithoutTableForTableWithSelfReference/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Film -} - -type Film @table { - wrapper: Wrapper -} - -type Wrapper { - id: Int @field(name: "FILM_ID") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/pagination/allOptionalFieldsExcluded/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/pagination/allOptionalFieldsExcluded/schema.graphqls deleted file mode 100644 index 468103160a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/pagination/allOptionalFieldsExcluded/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - customers(first: Int = 100, after: String): CustomerNoOptionalsConnection -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/pagination/allOptionalFieldsIncluded/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/pagination/allOptionalFieldsIncluded/schema.graphqls deleted file mode 100644 index 182f536cc3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/pagination/allOptionalFieldsIncluded/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - customers(first: Int = 100, after: String): CustomerConnection -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/pagination/default/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/pagination/default/expected/QueryDBQueries.java deleted file mode 100644 index 12be6bcbc9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/pagination/default/expected/QueryDBQueries.java +++ /dev/null @@ -1,41 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; - -import fake.graphql.example.model.CustomerTable; -import java.lang.Integer; -import java.lang.String; -import java.util.List; -import no.sikt.graphql.helpers.query.QueryHelper; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.SelectField; -import org.jooq.impl.DSL; - -public class QueryDBQueries { - public static List<Pair<String, CustomerTable>> queryForQuery(DSLContext _iv_ctx, Integer _iv_pageSize, - String _mi_after, SelectionSet _iv_select) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - var _iv_orderFields = _a_customer.fields(_a_customer.getPrimaryKey().getFieldsArray()); - return _iv_ctx - .select( - QueryHelper.getOrderByToken(_a_customer, _iv_orderFields), - queryForQuery_customerTable() - ) - .from(_a_customer) - .orderBy(_iv_orderFields) - .seek(QueryHelper.getOrderByValues(_iv_ctx, _iv_orderFields, _mi_after)) - .limit(_iv_pageSize + 1) - .fetch() - .map(_iv_it -> new ImmutablePair<>(_iv_it.value1(), _iv_it.value2())); - } - - private static SelectField<CustomerTable> queryForQuery_customerTable() { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return DSL.row(_a_customer.getId()).mapping(Functions.nullOnAllNull(CustomerTable::new)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/pagination/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/pagination/default/schema.graphqls deleted file mode 100644 index d4a0afd372..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/pagination/default/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(first: Int = 100, after: String): CustomerNoOptionalsConnection -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/pagination/multiset/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/pagination/multiset/schema.graphqls deleted file mode 100644 index a3bbe3eba4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/pagination/multiset/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - query: Address -} - -type Address @table { - id: ID - query: [CustomerTable] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/pagination/splitQuery/expected/WrapperDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/pagination/splitQuery/expected/WrapperDBQueries.java deleted file mode 100644 index 387dcc7756..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/pagination/splitQuery/expected/WrapperDBQueries.java +++ /dev/null @@ -1,57 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; -import fake.graphql.example.model.CustomerTable; -import java.lang.Integer; -import java.lang.String; -import java.util.List; -import java.util.Map; -import java.util.Set; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.AddressRecord; -import no.sikt.graphql.helpers.query.QueryHelper; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.Record2; -import org.jooq.SelectField; -import org.jooq.impl.DSL; - -public class WrapperDBQueries { - public static Map<AddressRecord, List<Pair<String, CustomerTable>>> queryForWrapper( - DSLContext _iv_ctx, Set<AddressRecord> _rk_wrapper, Integer _iv_pageSize, String _mi_after, - SelectionSet _iv_select) { - var _a_address = ADDRESS.as("address_223244161"); - var _a_address_223244161_customer = _a_address.customer().as("customer_1589604633"); - var _iv_orderFields = _a_address_223244161_customer.fields(_a_address_223244161_customer.getPrimaryKey().getFieldsArray()); - return _iv_ctx - .select( - DSL.row(_a_address.ADDRESS_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_address.ADDRESS_ID))), - DSL.multiset( - DSL.select( - - QueryHelper.getOrderByToken(_a_address_223244161_customer, _iv_orderFields), - queryForWrapper_customerTable() - ) - .from(_a_address_223244161_customer) - .orderBy(_iv_orderFields) - .seek(QueryHelper.getOrderByValues(_iv_ctx, _iv_orderFields, _mi_after)) - .limit(_iv_pageSize + 1) - - ) - ) - .from(_a_address) - .where(DSL.row(_a_address.ADDRESS_ID).in(_rk_wrapper.stream().map(_iv_it -> _iv_it.key().valuesRow()).toList())) - .fetchMap( - Record2::value1, - _iv_it -> _iv_it.value2().map(_iv_r -> _iv_r.value2() == null ? null : new ImmutablePair<>(_iv_r.value1(), _iv_r.value2()))); - } - - private static SelectField<CustomerTable> queryForWrapper_customerTable() { - var _a_address = ADDRESS.as("address_223244161"); - var _a_address_223244161_customer = _a_address.customer().as("customer_1589604633"); - return DSL.row(_a_address_223244161_customer.getId()).mapping(Functions.nullOnAllNull(CustomerTable::new)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/pagination/splitQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/pagination/splitQuery/schema.graphqls deleted file mode 100644 index 4607c92d73..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/pagination/splitQuery/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Wrapper @table(name: "ADDRESS") { - id: ID - - query(first: Int = 100, after: String): CustomerNoOptionalsConnection @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/pagination/withOtherField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/pagination/withOtherField/schema.graphqls deleted file mode 100644 index 9cb5db492d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/pagination/withOtherField/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(name: String! @field(name: "FIRST_NAME"), first: Int = 100, after: String): CustomerNoOptionalsConnection -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/procedureCall/procedureCall/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/procedureCall/procedureCall/schema.graphqls deleted file mode 100644 index b958c37c78..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/procedureCall/procedureCall/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer @table { - heldBy: ID @experimental_procedureCall(procedure: "inventory_held_by_customer", arguments: "p_inventory_id: CUSTOMER_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/procedureCall/procedureCallMultipleArgs/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/procedureCall/procedureCallMultipleArgs/schema.graphqls deleted file mode 100644 index 8ce453142b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/procedureCall/procedureCallMultipleArgs/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer @table { - balance: BigDecimal @experimental_procedureCall(procedure: "get_customer_balance", arguments: "p_customer_id: CUSTOMER_ID, p_effective_date: LAST_UPDATE") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/procedureCall/procedureCallQualifiedRoutine/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/procedureCall/procedureCallQualifiedRoutine/schema.graphqls deleted file mode 100644 index f7bc610fd3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/procedureCall/procedureCallQualifiedRoutine/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer @table { - lastDay: String @experimental_procedureCall(procedure: "utils.last_day", arguments: "_1: LAST_UPDATE") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/procedureCall/procedureCallTargetOnArgField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/procedureCall/procedureCallTargetOnArgField/schema.graphqls deleted file mode 100644 index a5827308e3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/procedureCall/procedureCallTargetOnArgField/schema.graphqls +++ /dev/null @@ -1,13 +0,0 @@ -type Query { - store: Store -} - -type Store @table { - id: ID - customer(inventoryId: ID): Customer @experimental_procedureCall(target: "heldBy", procedure: "inventory_held_by_customer", arguments: "p_inventory_id: inventoryId") -} - -type Customer @table { - id: ID - heldBy: Int -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/procedureCall/procedureCallTargetOnRoot/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/procedureCall/procedureCallTargetOnRoot/schema.graphqls deleted file mode 100644 index f2aabb102d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/procedureCall/procedureCallTargetOnRoot/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - customerWithHeldBy(inventoryId: ID): Customer @experimental_procedureCall(target: "heldBy", procedure: "inventory_held_by_customer", arguments: "p_inventory_id: inventoryId") -} - -type Customer @table { - heldBy: Int -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/procedureCall/procedureCallTargetSplitQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/procedureCall/procedureCallTargetSplitQuery/schema.graphqls deleted file mode 100644 index 5b9094c9c2..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/procedureCall/procedureCallTargetSplitQuery/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - store: Store -} - -type Store @table { - customer(inventoryId: ID): Customer @splitQuery @experimental_procedureCall(target: "heldBy", procedure: "inventory_held_by_customer", arguments: "p_inventory_id: inventoryId") -} - -type Customer @table { - heldBy: Int -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/fieldOverrideID/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/fieldOverrideID/schema.graphqls deleted file mode 100644 index b70b2ab29a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/fieldOverrideID/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - query(in: [PaymentInput]): Payment -} - -input PaymentInput @table(name: "Payment") { - customerID: ID @field(name: "customerId") - paymentID: ID @field(name: "paymentId") -} - -type Payment @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/inputJOOQRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/inputJOOQRecord/schema.graphqls deleted file mode 100644 index 822aa9fded..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/inputJOOQRecord/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - customer(in: CustomerInput): CustomerTable -} - -input CustomerInput @table(name: "CUSTOMER") { - id: ID! - first: String! @field(name: "FIRST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/inputJavaRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/inputJavaRecord/schema.graphqls deleted file mode 100644 index 58d46f4db8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/inputJavaRecord/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - customer(in: CustomerInput): CustomerTable -} - -input CustomerInput @record(record: {name: "DUMMY_RECORD"}) { - id: ID! - id2: ID! @field(name: "Id", javaName: "otherID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/inputJavaRecordCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/inputJavaRecordCondition/schema.graphqls deleted file mode 100644 index aa905811c0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/inputJavaRecordCondition/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query( - name: NameInput! @condition(condition: {name: "RECORD_FETCH_STAFF_CONDITION", method: "name"}) - active: Boolean! - ) : [Staff] -} - diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/jOOQRecordWithTableMethod/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/jOOQRecordWithTableMethod/schema.graphqls deleted file mode 100644 index ccee3c990d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/jOOQRecordWithTableMethod/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - customer(in: CustomerInput): CustomerTable @tableMethod(tableMethodReference: {className: "no.sikt.graphitron.codereferences.services.CustomerTableMethod", method: "customerTable"}) -} - -input CustomerInput @table(name: "CUSTOMER") { - id: ID! - first: String! @field(name: "FIRST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/javaRecordWithTableMethod/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/javaRecordWithTableMethod/schema.graphqls deleted file mode 100644 index 550857f3bc..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/javaRecordWithTableMethod/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - customer(in: CustomerInput): CustomerTable @tableMethod(tableMethodReference: {className: "no.sikt.graphitron.codereferences.services.CustomerTableMethod", method: "customerTable"}) -} - -input CustomerInput @record(record: {name: "DUMMY_RECORD"}) { - id: ID! - id2: ID! @field(name: "Id", javaName: "otherID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/listInputJavaRecordAndFieldCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/listInputJavaRecordAndFieldCondition/schema.graphqls deleted file mode 100644 index c99b08e3cb..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/listInputJavaRecordAndFieldCondition/schema.graphqls +++ /dev/null @@ -1,6 +0,0 @@ -type Query { - query( - names: [NameInput!] @condition(condition: {name: "RECORD_FETCH_STAFF_CONDITION", method: "nameList"}) - active: Boolean - ) : [Staff] @condition(condition: {name: "RECORD_FETCH_STAFF_CONDITION", method: "fieldWithListInput"}) -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/listInputJavaRecordAndFieldOverrideCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/listInputJavaRecordAndFieldOverrideCondition/schema.graphqls deleted file mode 100644 index 8711bb7de9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/listInputJavaRecordAndFieldOverrideCondition/schema.graphqls +++ /dev/null @@ -1,6 +0,0 @@ -type Query { - query( - names: [NameInput!] @condition(condition: {name: "RECORD_FETCH_STAFF_CONDITION", method: "nameList"}) - active: Boolean! - ) : [Staff] @condition(condition: {name: "RECORD_FETCH_STAFF_CONDITION", method: "fieldWithListInput"}, override: true) -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/listedInputJOOQRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/listedInputJOOQRecord/schema.graphqls deleted file mode 100644 index ad218d0d79..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/listedInputJOOQRecord/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - customer(in: [CustomerInput]): [CustomerTable] -} - -input CustomerInput @table(name: "CUSTOMER") { - id: ID! - first: String @field(name: "FIRST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/listedInputJOOQRecordWithCLOB/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/listedInputJOOQRecordWithCLOB/schema.graphqls deleted file mode 100644 index 2071e439b4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/listedInputJOOQRecordWithCLOB/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(in: [FilmInput]): [Film] -} - -type Film @table { - id: ID! -} - -input FilmInput @table(name: "FILM") { - description: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/listedInputJavaRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/listedInputJavaRecord/schema.graphqls deleted file mode 100644 index 18a9eb8154..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/listedInputJavaRecord/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - customer(in: [CustomerInput]): [CustomerTable] -} - -input CustomerInput @record(record: {name: "DUMMY_RECORD"}) { - id: ID! - id2: ID! @field(name: "Id", javaName: "otherID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/listedNestedInputJOOQRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/listedNestedInputJOOQRecord/schema.graphqls deleted file mode 100644 index fcdeab22fe..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/listedNestedInputJOOQRecord/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - customer(in: [CustomerInput]): [CustomerTable] -} - -input CustomerInput @table(name: "CUSTOMER") { - id: ID! - nested: Nested -} - -input Nested { - first: String! @field(name: "FIRST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/multiLevelInputJavaRecordOverrideCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/multiLevelInputJavaRecordOverrideCondition/schema.graphqls deleted file mode 100644 index bb67de16b6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/multiLevelInputJavaRecordOverrideCondition/schema.graphqls +++ /dev/null @@ -1,18 +0,0 @@ -type Query { - query( - input3: Input3! - ) : [Staff] -} - -input Input3 @record(record: {name: "JAVA_RECORD_STAFF_INPUT3"}) { - inputs2: [Input2] -} - -input Input2 @record(record: {name: "JAVA_RECORD_STAFF_INPUT2"}) { - input1: Input1 @condition(condition: {name: "RECORD_FETCH_STAFF_CONDITION", method: "input1"}, override: true) -} - -input Input1 @record(record: {name: "JAVA_RECORD_STAFF_INPUT1"}) { - names: [NameInput] - active: Boolean -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/nestedListInputJavaRecordOverrideCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/nestedListInputJavaRecordOverrideCondition/schema.graphqls deleted file mode 100644 index 9395064db7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/nestedListInputJavaRecordOverrideCondition/schema.graphqls +++ /dev/null @@ -1,10 +0,0 @@ -type Query { - query( - inputs1: [Input1] @condition(condition: {name: "RECORD_FETCH_STAFF_CONDITION", method: "input1"}, override: true) - ) : [Staff] -} - -input Input1 @record(record: {name: "JAVA_RECORD_STAFF_INPUT1"}) { - names: [NameInput] - active: Boolean -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/returningListedTypeWithoutTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/returningListedTypeWithoutTable/schema.graphqls deleted file mode 100644 index 0849a5930d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/returningListedTypeWithoutTable/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: [CustomerInputTable!]!): CustomerNoTable -} - -type CustomerNoTable { - id: [ID!]! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/returningListedTypeWithoutTableWithNestedTableField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/returningListedTypeWithoutTableWithNestedTableField/schema.graphqls deleted file mode 100644 index c20c7faa96..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/returningListedTypeWithoutTableWithNestedTableField/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - query(in: [CustomerInputTable!]!): CustomerNoTable -} - -type CustomerNoTable { - customers: [Customer!]! -} - -type Customer @table { # Note that if table is not set here, which would be a valid configuration, the query will generate an incorrect where statement! - id: ID - district: String! @reference(path: [{table: "ADDRESS"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/returningListedTypeWithoutTableWithTableField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/returningListedTypeWithoutTableWithTableField/schema.graphqls deleted file mode 100644 index 16d780b6b0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/returningListedTypeWithoutTableWithTableField/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: [CustomerInputTable!]!): CustomerNoTable -} - -type CustomerNoTable { - customers: [CustomerTable!]! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/returningTypeWithoutTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/returningTypeWithoutTable/schema.graphqls deleted file mode 100644 index edaeae6b41..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/returningTypeWithoutTable/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - query(in: CustomerInputTable!): CustomerNoTable -} - -type CustomerNoTable { - id: ID - name: String @field(name: "FIRST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/returningTypeWithoutTableWithTableField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/returningTypeWithoutTableWithTableField/schema.graphqls deleted file mode 100644 index c5bdc84484..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/returningTypeWithoutTableWithTableField/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: CustomerInputTable!): CustomerNoTable -} - -type CustomerNoTable { - customer: CustomerTable! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/withInputJOOQRecordAndCondition/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/withInputJOOQRecordAndCondition/expected/QueryDBQueries.java deleted file mode 100644 index e154fdade3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/withInputJOOQRecordAndCondition/expected/QueryDBQueries.java +++ /dev/null @@ -1,67 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; - -import fake.graphql.example.model.CustomerTable; -import java.util.List; -import java.util.stream.IntStream; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CustomerRecord; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.SelectField; -import org.jooq.impl.DSL; - -public class QueryDBQueries { - public static CustomerTable customerForQuery(DSLContext _iv_ctx, CustomerRecord _mi_inRecord, - SelectionSet _iv_select) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return _iv_ctx - .select(customerForQuery_customerTable(_mi_inRecord)) - .from(_a_customer) - .where(_mi_inRecord != null ? _a_customer.hasId(_mi_inRecord.getId()) : DSL.noCondition()) - .and(_mi_inRecord != null ? _a_customer.FIRST_NAME.eq(_mi_inRecord.getFirstName()) : DSL.noCondition()) - .and(no.sikt.graphitron.codereferences.conditions.RecordCustomerCondition.customerString(_a_customer, _mi_inRecord != null ? _mi_inRecord.getFirstName() : null)) - .and(no.sikt.graphitron.codereferences.conditions.RecordCustomerCondition.customerJOOQRecord(_a_customer, _mi_inRecord)) - .fetchOne(_iv_it -> _iv_it.into(CustomerTable.class)); - } - - public static CustomerTable customerListedForQuery(DSLContext _iv_ctx, - List<CustomerRecord> _mi_inRecordList, SelectionSet _iv_select) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return _iv_ctx - .select(customerListedForQuery_customerTable(_mi_inRecordList)) - .from(_a_customer) - .where( - _mi_inRecordList != null && _mi_inRecordList.size() > 0 ? - DSL.row( - DSL.trueCondition(), - _a_customer.FIRST_NAME, - DSL.trueCondition() - ).in( - IntStream.range(0, _mi_inRecordList.size()).mapToObj(_iv_it -> - DSL.row( - _a_customer.hasId(_mi_inRecordList.get(_iv_it).getId()), - DSL.val(_mi_inRecordList.get(_iv_it).getFirstName()), - no.sikt.graphitron.codereferences.conditions.RecordCustomerCondition.customerString(_a_customer, _mi_inRecordList.get(_iv_it).getFirstName()) - ) - ).toList() - ) : DSL.noCondition() - ) - .and(no.sikt.graphitron.codereferences.conditions.RecordCustomerCondition.customerJOOQRecordList(_a_customer, _mi_inRecordList)) - .fetchOne(_iv_it -> _iv_it.into(CustomerTable.class)); - } - - private static SelectField<CustomerTable> customerForQuery_customerTable( - CustomerRecord _mi_inRecord) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return DSL.row(_a_customer.getId()).mapping(Functions.nullOnAllNull(CustomerTable::new)); - } - - private static SelectField<CustomerTable> customerListedForQuery_customerTable( - List<CustomerRecord> _mi_inRecordList) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return DSL.row(_a_customer.getId()).mapping(Functions.nullOnAllNull(CustomerTable::new)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/withInputJOOQRecordAndCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/withInputJOOQRecordAndCondition/schema.graphqls deleted file mode 100644 index 55725e4b0c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/withInputJOOQRecordAndCondition/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Query { - customer(in: CustomerInput): CustomerTable @condition(condition: {name: "RECORD_FETCH_CONDITION", method: "customerJOOQRecord"}) - customerListed(in: [CustomerInput]): CustomerTable @condition(condition: {name: "RECORD_FETCH_CONDITION", method: "customerJOOQRecordList"}) -} - -input CustomerInput @table(name: "CUSTOMER") { - id: ID! - first: String! @field(name: "FIRST_NAME") @condition(condition: {name: "RECORD_FETCH_CONDITION", method: "customerString"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/withInputJavaRecordAndCondition/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/withInputJavaRecordAndCondition/expected/QueryDBQueries.java deleted file mode 100644 index 84ccce5e46..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/withInputJavaRecordAndCondition/expected/QueryDBQueries.java +++ /dev/null @@ -1,66 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; - -import fake.graphql.example.model.CustomerTable; -import java.util.List; -import java.util.stream.IntStream; -import no.sikt.graphitron.codereferences.dummyreferences.DummyRecord; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.SelectField; -import org.jooq.impl.DSL; - -public class QueryDBQueries { - public static CustomerTable customerForQuery(DSLContext _iv_ctx, DummyRecord _mi_inRecord, - SelectionSet _iv_select) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return _iv_ctx - .select(customerForQuery_customerTable(_mi_inRecord)) - .from(_a_customer) - .where(_mi_inRecord != null ? _a_customer.hasId(_mi_inRecord.getId()) : DSL.noCondition()) - .and(_mi_inRecord != null ? _a_customer.FIRST.eq(_mi_inRecord.getFirst()) : DSL.noCondition()) - .and(no.sikt.graphitron.codereferences.conditions.RecordCustomerCondition.customerString(_a_customer, _mi_inRecord != null ? _mi_inRecord.getFirst() : null)) - .and(no.sikt.graphitron.codereferences.conditions.RecordCustomerCondition.customerJavaRecord(_a_customer, _mi_inRecord)) - .fetchOne(_iv_it -> _iv_it.into(CustomerTable.class)); - } - - public static CustomerTable customerListedForQuery(DSLContext _iv_ctx, - List<DummyRecord> _mi_inRecordList, SelectionSet _iv_select) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return _iv_ctx - .select(customerListedForQuery_customerTable(_mi_inRecordList)) - .from(_a_customer) - .where( - _mi_inRecordList != null && _mi_inRecordList.size() > 0 ? - DSL.row( - DSL.trueCondition(), - _a_customer.FIRST, - DSL.trueCondition() - ).in( - IntStream.range(0, _mi_inRecordList.size()).mapToObj(_iv_it -> - DSL.row( - _a_customer.hasId(_mi_inRecordList.get(_iv_it).getId()), - DSL.val(_mi_inRecordList.get(_iv_it).getFirst()), - no.sikt.graphitron.codereferences.conditions.RecordCustomerCondition.customerString(_a_customer, _mi_inRecordList.get(_iv_it).getFirst()) - ) - ).toList() - ) : DSL.noCondition() - ) - .and(no.sikt.graphitron.codereferences.conditions.RecordCustomerCondition.customerJavaRecordList(_a_customer, _mi_inRecordList)) - .fetchOne(_iv_it -> _iv_it.into(CustomerTable.class)); - } - - private static SelectField<CustomerTable> customerForQuery_customerTable(DummyRecord _mi_inRecord) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return DSL.row(_a_customer.getId()).mapping(Functions.nullOnAllNull(CustomerTable::new)); - } - - private static SelectField<CustomerTable> customerListedForQuery_customerTable( - List<DummyRecord> _mi_inRecordList) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return DSL.row(_a_customer.getId()).mapping(Functions.nullOnAllNull(CustomerTable::new)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/withInputJavaRecordAndCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/withInputJavaRecordAndCondition/schema.graphqls deleted file mode 100644 index c16bfd41bd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/withInputJavaRecordAndCondition/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Query { - customer(in: CustomerInput): CustomerTable @condition(condition: {name: "RECORD_FETCH_CONDITION", method: "customerJavaRecord"}) - customerListed(in: [CustomerInput]): CustomerTable @condition(condition: {name: "RECORD_FETCH_CONDITION", method: "customerJavaRecordList"}) -} - -input CustomerInput @record(record: {name: "DUMMY_RECORD"}) { - id: ID! - first: String! @condition(condition: {name: "RECORD_FETCH_CONDITION", method: "customerString"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/withListedInputConditions/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/withListedInputConditions/expected/QueryDBQueries.java deleted file mode 100644 index aeff1a1069..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/withListedInputConditions/expected/QueryDBQueries.java +++ /dev/null @@ -1,61 +0,0 @@ -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; -import fake.graphql.example.model.CustomerTable; -import java.util.List; -import java.util.stream.IntStream; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CustomerRecord; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.SelectField; -import org.jooq.impl.DSL; - -public class QueryDBQueries { - public static CustomerTable customerForQuery(DSLContext _iv_ctx, List<CustomerRecord> _mi_inRecordList, - SelectionSet _iv_select) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return _iv_ctx - .select(customerForQuery_customerTable(_mi_inRecordList)) - .from(_a_customer) - .where( - _mi_inRecordList != null && _mi_inRecordList.size() > 0 ? - DSL.row( - DSL.trueCondition(), - DSL.trueCondition(), - DSL.trueCondition() - ).in( - IntStream.range(0, _mi_inRecordList.size()).mapToObj(_iv_it -> - DSL.row( - _a_customer.hasId(_mi_inRecordList.get(_iv_it).getId()), - no.sikt.graphitron.codereferences.conditions.RecordCustomerCondition.customerString(_a_customer, _mi_inRecordList.get(_iv_it).getId()), - no.sikt.graphitron.codereferences.conditions.RecordCustomerCondition.customerString(_a_customer, _mi_inRecordList.get(_iv_it).getFirstName()) - ) - ).toList() - ) : DSL.noCondition() - ) - .and(no.sikt.graphitron.codereferences.conditions.RecordCustomerCondition.customerJOOQRecordList(_a_customer, _mi_inRecordList)) - .fetchOne(_iv_it -> _iv_it.into(CustomerTable.class)); - } - - public static CustomerTable customerOverrideForQuery(DSLContext _iv_ctx, - List<CustomerRecord> _mi_inRecordList, SelectionSet _iv_select) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return _iv_ctx - .select(customerOverrideForQuery_customerTable(_mi_inRecordList)) - .from(_a_customer) - .where(no.sikt.graphitron.codereferences.conditions.RecordCustomerCondition.customerJOOQRecordList(_a_customer, _mi_inRecordList)) - .fetchOne(_iv_it -> _iv_it.into(CustomerTable.class)); - } - - private static SelectField<CustomerTable> customerForQuery_customerTable( - List<CustomerRecord> _mi_inRecordList) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return DSL.row(_a_customer.getId()).mapping(Functions.nullOnAllNull(CustomerTable::new)); - } - - private static SelectField<CustomerTable> customerOverrideForQuery_customerTable( - List<CustomerRecord> _mi_inRecordList) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return DSL.row(_a_customer.getId()).mapping(Functions.nullOnAllNull(CustomerTable::new)); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/withListedInputConditions/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/withListedInputConditions/schema.graphqls deleted file mode 100644 index b06e9b4349..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/withListedInputConditions/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Query { - customer(in: [CustomerInput]): CustomerTable @condition(condition: {name: "RECORD_FETCH_CONDITION", method: "customerJOOQRecordList"}) - customerOverride(in: [CustomerInput]): CustomerTable @condition(condition: {name: "RECORD_FETCH_CONDITION", method: "customerJOOQRecordList"}, override: true) -} - -input CustomerInput @table(name: "CUSTOMER") { - id: ID! @condition(condition: {name: "RECORD_FETCH_CONDITION", method: "customerString"}) - first: String! @field(name: "FIRST_NAME") @condition(condition: {name: "RECORD_FETCH_CONDITION", method: "customerString"}, override: true) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/withNestedConditionRecord/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/withNestedConditionRecord/expected/QueryDBQueries.java deleted file mode 100644 index a2f642fbc4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/withNestedConditionRecord/expected/QueryDBQueries.java +++ /dev/null @@ -1,29 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; - -import fake.graphql.example.model.CustomerTable; -import no.sikt.graphitron.codereferences.dummyreferences.DummyRecord; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.SelectField; -import org.jooq.impl.DSL; - -public class QueryDBQueries { - public static CustomerTable customerForQuery(DSLContext _iv_ctx, DummyRecord _mi_inRecord, - SelectionSet _iv_select) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return _iv_ctx - .select(customerForQuery_customerTable(_mi_inRecord)) - .from(_a_customer) - .where(no.sikt.graphitron.codereferences.conditions.RecordCustomerCondition.customerJavaRecord(_a_customer, _mi_inRecord)) - .fetchOne(_iv_it -> _iv_it.into(CustomerTable.class)); - } - - private static SelectField<CustomerTable> customerForQuery_customerTable(DummyRecord _mi_inRecord) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return DSL.row(_a_customer.getId()).mapping(Functions.nullOnAllNull(CustomerTable::new)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/withNestedConditionRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/withNestedConditionRecord/schema.graphqls deleted file mode 100644 index a18e2831f0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/withNestedConditionRecord/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - customer(in: CustomerInput1): CustomerTable @condition(condition: {name: "RECORD_FETCH_CONDITION", method: "customerJavaRecord"}, override: true) -} - -input CustomerInput1 @record(record: {name: "DUMMY_RECORD"}) { - input2: CustomerInput2 -} - -input CustomerInput2 @record(record: {name: "DUMMY_RECORD"}) { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/withPaginatedConditionAndRecord/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/withPaginatedConditionAndRecord/expected/QueryDBQueries.java deleted file mode 100644 index 4b658b30dd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/withPaginatedConditionAndRecord/expected/QueryDBQueries.java +++ /dev/null @@ -1,53 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; - -import fake.graphql.example.model.CustomerTable; -import java.lang.Integer; -import java.lang.String; -import java.util.List; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CustomerRecord; -import no.sikt.graphql.helpers.query.QueryHelper; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.SelectField; -import org.jooq.impl.DSL; - -public class QueryDBQueries { - public static List<Pair<String, CustomerTable>> customerForQuery(DSLContext _iv_ctx, CustomerRecord _mi_inRecord, - Integer _iv_pageSize, String _mi_after, SelectionSet _iv_select) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - var _iv_orderFields = _a_customer.fields(_a_customer.getPrimaryKey().getFieldsArray()); - return _iv_ctx - .select( - QueryHelper.getOrderByToken(_a_customer, _iv_orderFields), - customerForQuery_customerTable(_mi_inRecord) - ) - .from(_a_customer) - .where(no.sikt.graphitron.codereferences.conditions.RecordCustomerCondition.customerJavaRecord(_a_customer, _mi_inRecord)) - .orderBy(_iv_orderFields) - .seek(QueryHelper.getOrderByValues(_iv_ctx, _iv_orderFields, _mi_after)) - .limit(_iv_pageSize + 1) - .fetch() - .map(_iv_it -> new ImmutablePair<>(_iv_it.value1(), _iv_it.value2())); - } - - public static Integer countCustomerForQuery(DSLContext _iv_ctx, CustomerRecord _mi_inRecord) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return _iv_ctx - .select(DSL.count()) - .from(_a_customer) - .where(no.sikt.graphitron.codereferences.conditions.RecordCustomerCondition.customerJavaRecord(_a_customer, _mi_inRecord)) - .fetchOne(0, Integer.class); - } - - private static SelectField<CustomerTable> customerForQuery_customerTable( - CustomerRecord _mi_inRecord) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return DSL.row(_a_customer.getId()).mapping(Functions.nullOnAllNull(CustomerTable::new)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/withPaginatedConditionAndRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/withPaginatedConditionAndRecord/schema.graphqls deleted file mode 100644 index 0e0bb52fa9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/records/withPaginatedConditionAndRecord/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - customer(in: CustomerInputTable, first: Int = 100, after: String): CustomerConnection @condition(condition: {name: "RECORD_FETCH_CONDITION", method: "customerJavaRecord"}, override: true) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/circular-prevention/expected/CityDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/circular-prevention/expected/CityDBQueries.java deleted file mode 100644 index 048f18fe2f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/circular-prevention/expected/CityDBQueries.java +++ /dev/null @@ -1,61 +0,0 @@ -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; -import fake.graphql.example.model.Address; -import fake.graphql.example.model.City; -import java.util.List; -import java.util.Map; -import java.util.Set; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CityRecord; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.Record1; -import org.jooq.Record2; -import org.jooq.SelectField; -import org.jooq.impl.DSL; -import no.sikt.graphql.helpers.query.QueryHelper; - -public class CityDBQueries { - public static Map<CityRecord, List<Address>> addressesForCity(DSLContext _iv_ctx, - Set<CityRecord> _rk_city, SelectionSet _iv_select) { - var _a_city = CITY.as("city_760939060"); - var _a_city_760939060_address = _a_city.address().as("address_609487378"); - var _iv_orderFields = _a_city_760939060_address.fields(_a_city_760939060_address.getPrimaryKey().getFieldsArray()); - return _iv_ctx - .select( - DSL.row(_a_city.CITY_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_city.CITY_ID))), - DSL.multiset( - DSL.select(addressesForCity_address()) - .from(_a_city_760939060_address) - .orderBy(_iv_orderFields) - ) - ) - .from(_a_city) - .where(DSL.row(_a_city.CITY_ID).in(_rk_city.stream().map(_iv_it -> _iv_it.key().valuesRow()).toList())) - .fetchMap(Record2::value1, _iv_r -> _iv_r.value2().map(Record1::value1)); - } - - private static SelectField<Address> addressesForCity_address() { - var _a_city = CITY.as("city_760939060"); - var _a_city_760939060_address = _a_city.address().as("address_609487378"); - var _a_address_609487378_city = _a_city_760939060_address.city().as("city_3747560710"); - return DSL.row( - _a_city_760939060_address.getId(), - DSL.field( - DSL.select(_1_addressesForCity_address_city()) - .from(_a_address_609487378_city) - - ) - ).mapping(Functions.nullOnAllNull(Address::new)); - } - - private static SelectField<City> _1_addressesForCity_address_city() { - var _a_city = CITY.as("city_760939060"); - var _a_city_760939060_address = _a_city.address().as("address_609487378"); - var _a_address_609487378_city = _a_city_760939060_address.city().as("city_3747560710"); - return DSL.row( - DSL.row(_a_address_609487378_city.CITY_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_address_609487378_city.CITY_ID))), - _a_address_609487378_city.getId() - ).mapping(Functions.nullOnAllNull(City::new)); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/circular-prevention/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/circular-prevention/schema.graphqls deleted file mode 100644 index f1cbb51d63..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/circular-prevention/schema.graphqls +++ /dev/null @@ -1,10 +0,0 @@ - -type Address implements Node @table { - id: ID! - city: City! -} - -type City implements Node @table { - id: ID! - addresses: [Address] @splitQuery -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/complex-reference-params/expected/CityDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/complex-reference-params/expected/CityDBQueries.java deleted file mode 100644 index 545fae8aa6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/complex-reference-params/expected/CityDBQueries.java +++ /dev/null @@ -1,85 +0,0 @@ -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; - -import fake.graphql.example.model.Address; -import fake.graphql.example.model.City; -import fake.graphql.example.model.Payment; -import java.util.List; -import java.util.Map; -import java.util.Set; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CityRecord; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.Record1; -import org.jooq.Record2; -import org.jooq.SelectField; -import org.jooq.impl.DSL; -import no.sikt.graphql.helpers.query.QueryHelper; - -public class CityDBQueries { - public static Map<CityRecord, List<Address>> addressesForCity(DSLContext _iv_ctx, - Set<CityRecord> _rk_city, SelectionSet _iv_select) { - var _a_city = CITY.as("city_760939060"); - var _a_city_760939060_address = _a_city.address().as("address_609487378"); - var _iv_orderFields = _a_city_760939060_address.fields(_a_city_760939060_address.getPrimaryKey().getFieldsArray()); - return _iv_ctx - .select( - DSL.row(_a_city.CITY_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_city.CITY_ID))), - DSL.multiset( - DSL.select(addressesForCity_address()) - .from(_a_city_760939060_address) - .orderBy(_iv_orderFields) - ) - ) - .from(_a_city) - .where(DSL.row(_a_city.CITY_ID).in(_rk_city.stream().map(_iv_it -> _iv_it.key().valuesRow()).toList())) - .fetchMap(Record2::value1, _iv_r -> _iv_r.value2().map(Record1::value1)); - } - - private static SelectField<Address> addressesForCity_address() { - var _a_city = CITY.as("city_760939060"); - var _a_city_760939060_address = _a_city.address().as("address_609487378"); - var _a_address_609487378_city = _a_city_760939060_address.city().as("city_3747560710"); - return DSL.row( - _a_city_760939060_address.getId(), - DSL.field( - DSL.select(_1_addressesForCity_address_city()) - .from(_a_address_609487378_city) - - ) - ).mapping(Functions.nullOnAllNull(Address::new)); - } - - private static SelectField<City> _1_addressesForCity_address_city() { - var _a_city = CITY.as("city_760939060"); - var _a_city_760939060_address = _a_city.address().as("address_609487378"); - var _a_address_609487378_city = _a_city_760939060_address.city().as("city_3747560710"); - var _a_city_3747560710_address = _a_address_609487378_city.address().as("address_2947374364"); - var _a_address_2947374364_customer = _a_city_3747560710_address.customer().as("customer_3296466506"); - var _a_customer_3296466506_payment = _a_address_2947374364_customer.payment().as("payment_1788404239"); - return DSL.row( - DSL.row(_a_address_609487378_city.CITY_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_address_609487378_city.CITY_ID))), - _a_address_609487378_city.getId(), - DSL.row( - DSL.multiset( - DSL.select(_2_addressesForCity_address_city_payments()) - .from(_a_city_3747560710_address) - .join(_a_address_2947374364_customer) - .join(_a_customer_3296466506_payment) - .orderBy(_a_customer_3296466506_payment.fields(_a_customer_3296466506_payment.getPrimaryKey().getFieldsArray())) - ) - ).mapping(_iv_e -> _iv_e.map(Record1::value1)) - ).mapping(Functions.nullOnAllNull(City::new)); - } - - private static SelectField<Payment> _2_addressesForCity_address_city_payments() { - var _a_city = CITY.as("city_760939060"); - var _a_city_760939060_address = _a_city.address().as("address_609487378"); - var _a_address_609487378_city = _a_city_760939060_address.city().as("city_3747560710"); - var _a_city_3747560710_address = _a_address_609487378_city.address().as("address_2947374364"); - var _a_address_2947374364_customer = _a_city_3747560710_address.customer().as("customer_3296466506"); - var _a_customer_3296466506_payment = _a_address_2947374364_customer.payment().as("payment_1788404239"); - return DSL.row(_a_customer_3296466506_payment.AMOUNT).mapping(Functions.nullOnAllNull(Payment::new)); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/complex-reference-params/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/complex-reference-params/schema.graphqls deleted file mode 100644 index 1b7f43a719..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/complex-reference-params/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ - -type Address implements Node @table { - id: ID! - city: City! -} - -type City implements Node @table { - id: ID! - addresses: [Address] @splitQuery - payments: [Payment] @reference(path: [{table: "ADDRESS"}, {key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY"}, {table: "PAYMENT"}]) -} - -type Payment @table { - amount: BigDecimal -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/conditionToCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/conditionToCondition/schema.graphqls deleted file mode 100644 index fee76531bd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/conditionToCondition/schema.graphqls +++ /dev/null @@ -1,6 +0,0 @@ -type Customer @table { - city: String! @reference(path: [ - {table: "ADDRESS", condition: {name: "REFERENCE_CUSTOMER_CONDITION", method: "addressCustomer"}}, - {table: "CITY", condition: {name: "REFERENCE_CUSTOMER_CONDITION", method: "cityAddress"}} - ]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/conditionToConditionReverse/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/conditionToConditionReverse/schema.graphqls deleted file mode 100644 index 3938063025..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/conditionToConditionReverse/schema.graphqls +++ /dev/null @@ -1,6 +0,0 @@ -type City @table { - email: String! @reference(path: [ - {table: "ADDRESS", condition: {name: "REFERENCE_CUSTOMER_CONDITION", method: "addressCity"}}, - {table: "CUSTOMER", condition: {name: "REFERENCE_CUSTOMER_CONDITION"}} - ]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/conditionToKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/conditionToKey/schema.graphqls deleted file mode 100644 index 18b2dfab70..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/conditionToKey/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer @table { - city: String! @reference(path: [{table: "ADDRESS", condition: {name: "REFERENCE_CUSTOMER_CONDITION", method: "addressCustomer"}}, {key: "ADDRESS__ADDRESS_CITY_ID_FKEY"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/conditionToKeyReverse/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/conditionToKeyReverse/schema.graphqls deleted file mode 100644 index 7e014f0815..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/conditionToKeyReverse/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type City @table { - email: String! @reference(path: [{table: "ADDRESS", condition: {name: "REFERENCE_CUSTOMER_CONDITION", method: "addressCity"}}, {key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/conditionToTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/conditionToTable/schema.graphqls deleted file mode 100644 index e654ecddb8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/conditionToTable/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer @table { - city: String! @reference(path: [{table: "ADDRESS", condition: {name: "REFERENCE_CUSTOMER_CONDITION", method: "addressCustomer"}}, {table: "CITY"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/conditionToTableReverse/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/conditionToTableReverse/schema.graphqls deleted file mode 100644 index a98ba44132..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/conditionToTableReverse/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type City @table { - email: String! @reference(path: [{table: "ADDRESS", condition: {name: "REFERENCE_CUSTOMER_CONDITION", method: "addressCity"}}, {table: "CUSTOMER"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/fromTypeWithoutTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/fromTypeWithoutTable/schema.graphqls deleted file mode 100644 index 6ce7c29785..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/fromTypeWithoutTable/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Customer @table { - wrapper: Wrapper! -} - -type Wrapper { - address: Address! @splitQuery @reference(path: [{table: "ADDRESS"}]) -} - -type Address @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/fromTypeWithoutTableExtraStep/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/fromTypeWithoutTableExtraStep/schema.graphqls deleted file mode 100644 index 4a6aa8714f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/fromTypeWithoutTableExtraStep/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Customer @table { - wrapper: Wrapper! -} - -type Wrapper { - city: City! @splitQuery @reference(path: [{table: "ADDRESS"}]) -} - -type City @table { - id: ID! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/innerTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/innerTable/schema.graphqls deleted file mode 100644 index 2d26ac4090..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/innerTable/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - address: Address -} - -type Address @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/innerTableReverse/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/innerTableReverse/schema.graphqls deleted file mode 100644 index 8bbc6f747b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/innerTableReverse/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Address -} - -type Address @table { - customer: CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/innerTableSelfReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/innerTableSelfReference/schema.graphqls deleted file mode 100644 index ea17d3429c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/innerTableSelfReference/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - film: Film @notGenerated -} - -type Film @table { - id: ID! - sequel: Film @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/keyToCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/keyToCondition/schema.graphqls deleted file mode 100644 index 910d0d41a3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/keyToCondition/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer @table { - city: String! @reference(path: [{key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY"}, {table: "CITY", condition: {name: "REFERENCE_CUSTOMER_CONDITION", method: "cityAddress"}}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/keyToConditionReverse/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/keyToConditionReverse/schema.graphqls deleted file mode 100644 index 1e0b7b92c4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/keyToConditionReverse/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type City @table { - email: String! @reference(path: [{key: "ADDRESS__ADDRESS_CITY_ID_FKEY"}, {table: "CUSTOMER", condition: {name: "REFERENCE_CUSTOMER_CONDITION"}}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/keyToKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/keyToKey/schema.graphqls deleted file mode 100644 index e853e5fd20..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/keyToKey/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer @table { - city: String! @reference(path: [{key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY"}, {key: "ADDRESS__ADDRESS_CITY_ID_FKEY"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/keyToKeyReverse/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/keyToKeyReverse/schema.graphqls deleted file mode 100644 index c548200104..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/keyToKeyReverse/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type City @table { - email: String! @reference(path: [{key: "ADDRESS__ADDRESS_CITY_ID_FKEY"}, {key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/keyToTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/keyToTable/schema.graphqls deleted file mode 100644 index d5b4d8c1c3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/keyToTable/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer @table { - city: String! @reference(path: [{key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY"}, {table: "CITY"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/keyToTableReverse/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/keyToTableReverse/schema.graphqls deleted file mode 100644 index 9e526597f7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/keyToTableReverse/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type City @table { - email: String! @reference(path: [{key: "ADDRESS__ADDRESS_CITY_ID_FKEY"}, {table: "CUSTOMER"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/keyUsingMultiplePaths/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/keyUsingMultiplePaths/schema.graphqls deleted file mode 100644 index c118711066..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/keyUsingMultiplePaths/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Query { - film: Film -} - -type Film @table { - id: ID! - name: String @reference(path: [{key: "FILM__FILM_LANGUAGE_ID_FKEY"}]) - originalName: String @field(name: "NAME") @reference(path: [{key: "FILM__FILM_ORIGINAL_LANGUAGE_ID_FKEY"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/over22Fields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/over22Fields/schema.graphqls deleted file mode 100644 index df6f0307bd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/over22Fields/schema.graphqls +++ /dev/null @@ -1,29 +0,0 @@ -type Query { - film: Film -} - -type Film implements Node @table { - title0: String! @field(name: "TITLE") - title1: String! @field(name: "TITLE") - title2: String! @field(name: "TITLE") - title3: String! @field(name: "TITLE") - title4: String! @field(name: "TITLE") - title5: String! @field(name: "TITLE") - title6: String! @field(name: "TITLE") - title7: String! @field(name: "TITLE") - title8: String! @field(name: "TITLE") - title9: String! @field(name: "TITLE") - title10: String! @field(name: "TITLE") - title11: String! @field(name: "TITLE") - title12: String! @field(name: "TITLE") - title13: String! @field(name: "TITLE") - title14: String! @field(name: "TITLE") - title15: String! @field(name: "TITLE") - title16: String! @field(name: "TITLE") - title17: String! @field(name: "TITLE") - title18: String! @field(name: "TITLE") - title19: String! @field(name: "TITLE") - title20: String! @field(name: "TITLE") - title21: String! @field(name: "TITLE") - name: String! @reference(path: [{key: "FILM__FILM_LANGUAGE_ID_FKEY"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/split-query-skip/expected/AddressDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/split-query-skip/expected/AddressDBQueries.java deleted file mode 100644 index b76a332d69..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/split-query-skip/expected/AddressDBQueries.java +++ /dev/null @@ -1,45 +0,0 @@ -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; -import fake.graphql.example.model.City; -import java.util.List; -import java.util.Map; -import java.util.Set; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.AddressRecord; -import no.sikt.graphql.helpers.query.QueryHelper; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.Record2; -import org.jooq.SelectField; -import org.jooq.impl.DSL; - -public class AddressDBQueries { - public static Map<AddressRecord, City> citySplitQueryForAddress(DSLContext _iv_ctx, - Set<AddressRecord> _rk_address, SelectionSet _iv_select) { - var _a_address = ADDRESS.as("address_223244161"); - var _a_address_223244161_city = _a_address.city().as("city_621065670"); - var _iv_orderFields = _a_address_223244161_city.fields(_a_address_223244161_city.getPrimaryKey().getFieldsArray()); - return _iv_ctx - .select( - DSL.row(_a_address.ADDRESS_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_address.ADDRESS_ID))), - DSL.field( - DSL.select(citySplitQueryForAddress_city()) - .from(_a_address_223244161_city) - - ) - ) - .from(_a_address) - .where(DSL.row(_a_address.ADDRESS_ID).in(_rk_address.stream().map(_iv_it -> _iv_it.key().valuesRow()).toList())) - .fetchMap(Record2::value1, Record2::value2); - } - - private static SelectField<City> citySplitQueryForAddress_city() { - var _a_address = ADDRESS.as("address_223244161"); - var _a_address_223244161_city = _a_address.city().as("city_621065670"); - return DSL.row( - DSL.row(_a_address_223244161_city.CITY_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_address_223244161_city.CITY_ID))), - _a_address_223244161_city.getId(), - _a_address_223244161_city.CITY_ - ).mapping(Functions.nullOnAllNull(City::new)); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/split-query-skip/expected/CityDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/split-query-skip/expected/CityDBQueries.java deleted file mode 100644 index 672db54beb..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/split-query-skip/expected/CityDBQueries.java +++ /dev/null @@ -1,45 +0,0 @@ -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; -import fake.graphql.example.model.Address; -import java.util.List; -import java.util.Map; -import java.util.Set; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CityRecord; -import no.sikt.graphql.helpers.query.QueryHelper; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.Record1; -import org.jooq.Record2; -import org.jooq.SelectField; -import org.jooq.impl.DSL; - -public class CityDBQueries { - public static Map<CityRecord, List<Address>> addressesForCity(DSLContext _iv_ctx, - Set<CityRecord> _rk_city, SelectionSet _iv_select) { - var _a_city = CITY.as("city_760939060"); - var _a_city_760939060_address = _a_city.address().as("address_609487378"); - var _iv_orderFields = _a_city_760939060_address.fields(_a_city_760939060_address.getPrimaryKey().getFieldsArray()); - return _iv_ctx - .select( - DSL.row(_a_city.CITY_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_city.CITY_ID))), - DSL.multiset( - DSL.select(addressesForCity_address()) - .from(_a_city_760939060_address) - .orderBy(_iv_orderFields) - ) - ) - .from(_a_city) - .where(DSL.row(_a_city.CITY_ID).in(_rk_city.stream().map(_iv_it -> _iv_it.key().valuesRow()).toList())) - .fetchMap(Record2::value1, _iv_r -> _iv_r.value2().map(Record1::value1)); - } - - private static SelectField<Address> addressesForCity_address() { - var _a_city = CITY.as("city_760939060"); - var _a_city_760939060_address = _a_city.address().as("address_609487378"); - return DSL.row( - DSL.row(_a_city_760939060_address.ADDRESS_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_city_760939060_address.ADDRESS_ID))), - _a_city_760939060_address.getId() - ).mapping(Functions.nullOnAllNull(Address::new)); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/split-query-skip/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/split-query-skip/schema.graphqls deleted file mode 100644 index 80bd097824..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/split-query-skip/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ - -type Address implements Node @table { - id: ID! - citySplitQuery: City! @splitQuery -} - -type City implements Node @table { - id: ID! - name: String! @field(name: "CITY_") - addresses: [Address] @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/splitQueryTableToTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/splitQueryTableToTable/schema.graphqls deleted file mode 100644 index e5e49a0ea7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/splitQueryTableToTable/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Address implements Node @table { - citySplitQuery: City! @splitQuery -} - -type City @table { - countryName: String! @field(name: "COUNTRY_") @reference(path: [{table: "COUNTRY"}]) -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/tableAndKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/tableAndKey/schema.graphqls deleted file mode 100644 index efad30433f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/tableAndKey/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer @table { - district: String! @reference(path: [{table: "ADDRESS", key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/tableToCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/tableToCondition/schema.graphqls deleted file mode 100644 index 3ccbd6f280..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/tableToCondition/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer @table { - city: String! @reference(path: [{table: "ADDRESS"}, {table: "CITY", condition: {name: "REFERENCE_CUSTOMER_CONDITION", method: "cityAddress"}}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/tableToConditionReverse/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/tableToConditionReverse/schema.graphqls deleted file mode 100644 index 229fb12ab5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/tableToConditionReverse/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type City @table { - email: String! @reference(path: [{table: "ADDRESS"}, {table: "CUSTOMER", condition: {name: "REFERENCE_CUSTOMER_CONDITION"}}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/tableToKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/tableToKey/schema.graphqls deleted file mode 100644 index 6a8bd711cb..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/tableToKey/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer @table { - city: String! @reference(path: [{table: "ADDRESS"}, {key: "ADDRESS__ADDRESS_CITY_ID_FKEY"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/tableToKeyReverse/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/tableToKeyReverse/schema.graphqls deleted file mode 100644 index 4df4e97e10..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/tableToKeyReverse/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type City @table { - email: String! @reference(path: [{table: "ADDRESS"}, {key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/tableToTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/tableToTable/schema.graphqls deleted file mode 100644 index 7ad27fc15b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/tableToTable/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer @table { - city: String! @reference(path: [{table: "ADDRESS"}, {table: "CITY"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/tableToTableReverse/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/tableToTableReverse/schema.graphqls deleted file mode 100644 index b06eb11ddd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/alias/tableToTableReverse/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type City @table { - email: String! @reference(path: [{table: "ADDRESS"}, {table: "CUSTOMER"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/error/noKeyFromTableWithoutPrimaryKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/error/noKeyFromTableWithoutPrimaryKey/schema.graphqls deleted file mode 100644 index e4a03fd133..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/error/noKeyFromTableWithoutPrimaryKey/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - query: ActorInfo -} - -type ActorInfo @table(name: "ACTOR_INFO") { - id: ID! - actor: Actor @reference(path: [{condition: {name: "DUMMY_CONDITION"}}]) -} - -type Actor @table(name: "ACTOR") { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/condition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/condition/schema.graphqls deleted file mode 100644 index 0c4f870ee6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/condition/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer @table { - district: String! @reference(path: [{condition: {name: "REFERENCE_CUSTOMER_CONDITION"}}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/keyAndCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/keyAndCondition/schema.graphqls deleted file mode 100644 index c0c9ba45f9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/keyAndCondition/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer @table { - district: String! @reference(path: [{key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY", condition: {name: "REFERENCE_CUSTOMER_CONDITION"}}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/keyBackwards/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/keyBackwards/schema.graphqls deleted file mode 100644 index 84c543149f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/keyBackwards/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Address -} - -type Address @table { - email: String! @reference(path: [{key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/keyWithMultiplePaths/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/keyWithMultiplePaths/schema.graphqls deleted file mode 100644 index daac9bd03c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/keyWithMultiplePaths/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Film -} - -type Film @table { - name: String! @reference(path: [{key: "FILM__FILM_ORIGINAL_LANGUAGE_ID_FKEY"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/keyWithSinglePath/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/keyWithSinglePath/schema.graphqls deleted file mode 100644 index c8da4ed4cf..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/keyWithSinglePath/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer @table { - district: String! @reference(path: [{key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/list/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/list/schema.graphqls deleted file mode 100644 index b842aa337b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/list/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer @table { - address: [String]! @field(name: "ADDRESS_ID") @reference(path: [{table: "ADDRESS"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/multipleToSameTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/multipleToSameTable/schema.graphqls deleted file mode 100644 index 13defdaa7b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/multipleToSameTable/schema.graphqls +++ /dev/null @@ -1,4 +0,0 @@ -type Customer @table { - district1: String! @reference(path: [{table: "ADDRESS"}]) @field(name: "DISTRICT") - district2: String! @reference(path: [{table: "ADDRESS"}]) @field(name: "DISTRICT") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/nullableField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/nullableField/schema.graphqls deleted file mode 100644 index 495c56e6c9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/nullableField/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer @table { - district: String @reference(path: [{table: "ADDRESS"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/table/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/table/schema.graphqls deleted file mode 100644 index dc71a8242e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/table/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer @table { - district: String! @reference(path: [{table: "ADDRESS"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/tableAndCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/tableAndCondition/schema.graphqls deleted file mode 100644 index a94b11465e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/tableAndCondition/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer @table { - district: String! @reference(path: [{table: "ADDRESS", condition: {name: "REFERENCE_CUSTOMER_CONDITION"}}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/tableBackwards/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/tableBackwards/schema.graphqls deleted file mode 100644 index 61b59f2078..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/tableBackwards/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Address -} - -type Address @table { - email: String! @reference(path: [{table: "CUSTOMER"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/wrapperWithKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/wrapperWithKey/schema.graphqls deleted file mode 100644 index a7e953686d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/field/wrapperWithKey/schema.graphqls +++ /dev/null @@ -1,16 +0,0 @@ -type Query { - query: Film -} - -type Film @table { - languageWrapper: LanguageWrapper -} - -type LanguageWrapper { - language: Language @reference(path: {key: "FILM__FILM_LANGUAGE_ID_FKEY"}) -} - -type Language @table { - name: String -} - diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/condition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/condition/schema.graphqls deleted file mode 100644 index 0561f1545c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/condition/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(district: String! @reference(path: [{condition: {name: "REFERENCE_CUSTOMER_CONDITION"}}])): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/conditionBackwards/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/conditionBackwards/schema.graphqls deleted file mode 100644 index 2eda3a62a8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/conditionBackwards/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(email: String! @reference(path: [{table: "CUSTOMER", condition: {className: "no.sikt.graphitron.codereferences.conditions.ReferenceCustomerCondition", method: "email"}}])): Address -} - -type Address @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/inputWithTableReturnTypeWithScalarReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/inputWithTableReturnTypeWithScalarReference/schema.graphqls deleted file mode 100644 index 14dea02700..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/inputWithTableReturnTypeWithScalarReference/schema.graphqls +++ /dev/null @@ -1,13 +0,0 @@ -type Query { - cityByName(in: CityNameInput!): City -} - -type City @table { - id: ID! - countryName: String! @field(name: "COUNTRY_") @reference(path: [{table: "COUNTRY"}]) -} - -input CityNameInput @table(name: "CITY") { - name: String! @field(name: "CITY_") -} - diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/insideInputType/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/insideInputType/schema.graphqls deleted file mode 100644 index dc983d7e13..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/insideInputType/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: Input!): CustomerTable -} - -input Input { - district: String! @reference(path: [{table: "ADDRESS"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/keyAndCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/keyAndCondition/schema.graphqls deleted file mode 100644 index 454af9e5ce..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/keyAndCondition/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(district: String! @reference(path: [{key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY", condition: {name: "REFERENCE_CUSTOMER_CONDITION"}}])): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/keyAndConditionBackwards/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/keyAndConditionBackwards/schema.graphqls deleted file mode 100644 index 1044af6328..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/keyAndConditionBackwards/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(email: String! @reference(path: [{key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY", condition: {className: "no.sikt.graphitron.codereferences.conditions.ReferenceCustomerCondition", method: "email"}}])): Address -} - -type Address @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/keyBackwards/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/keyBackwards/schema.graphqls deleted file mode 100644 index d5dcb854b6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/keyBackwards/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(email: String! @reference(path: [{key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY"}])): Address -} - -type Address @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/keyWithMultiplePaths/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/keyWithMultiplePaths/schema.graphqls deleted file mode 100644 index 8a5dc40904..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/keyWithMultiplePaths/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(name: String! @reference(path: [{key: "FILM__FILM_ORIGINAL_LANGUAGE_ID_FKEY"}])): Film -} - -type Film @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/keyWithMultiplePathsAndNestedSplitQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/keyWithMultiplePathsAndNestedSplitQuery/schema.graphqls deleted file mode 100644 index 7e7c50fe0d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/keyWithMultiplePathsAndNestedSplitQuery/schema.graphqls +++ /dev/null @@ -1,13 +0,0 @@ -type Query { - query: [Language] -} - -type Film @table { - language: Language @reference(path: {key: "FILM__FILM_LANGUAGE_ID_FKEY"}) -} - -type Language @table { - id: ID! - title: String! - films(releaseYear: Int @field(name: "RELEASE_YEAR")): [Film] @splitQuery @reference(path: [{key: "FILM__FILM_LANGUAGE_ID_FKEY"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/keyWithSinglePath/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/keyWithSinglePath/schema.graphqls deleted file mode 100644 index f838c0ffd9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/keyWithSinglePath/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(district: String! @reference(path: [{key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY"}])): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/multiStepEndingInOneToMany/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/multiStepEndingInOneToMany/schema.graphqls deleted file mode 100644 index 769354a3e5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/multiStepEndingInOneToMany/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(username: String @field(name: "USERNAME") @reference(path: [{key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY"}, {table: "STAFF"}])): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/multipleToSameTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/multipleToSameTable/schema.graphqls deleted file mode 100644 index 586d80cdcd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/multipleToSameTable/schema.graphqls +++ /dev/null @@ -1,6 +0,0 @@ -type Query { - query( - district1: String! @reference(path: [{table: "ADDRESS"}]) @field(name: "DISTRICT") - district2: String! @reference(path: [{table: "ADDRESS"}]) @field(name: "DISTRICT") - ): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/nullableField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/nullableField/schema.graphqls deleted file mode 100644 index 4ad63ff259..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/nullableField/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(district: String @reference(path: [{table: "ADDRESS"}])): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/onInputType/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/onInputType/schema.graphqls deleted file mode 100644 index 9020f6a7aa..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/onInputType/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: Input! @reference(path: [{table: "ADDRESS"}])): CustomerTable -} - -input Input { - district: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/onSingleTableInterface/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/onSingleTableInterface/schema.graphqls deleted file mode 100644 index b83e87f70e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/onSingleTableInterface/schema.graphqls +++ /dev/null @@ -1,16 +0,0 @@ -type Query { - address(filter: AddressInput!): [Address] -} - -input AddressInput { - city: String! @field(name: "CITY_") @reference(path: [{table: "CITY"}]) -} - -interface Address @table(name: "ADDRESS") @discriminate(on: "DISTRICT"){ - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressInDistrictOne implements Address @table(name: "ADDRESS") @discriminator(value: "ONE") { - id: ID - postalCode: String @field(name: "POSTAL_CODE") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/referencingTableWithSelfReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/referencingTableWithSelfReference/schema.graphqls deleted file mode 100644 index 64d6535715..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/referencingTableWithSelfReference/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Query { - languagesFilteredByFilm(filmId: Int! @field(name: "FILM_ID") @reference(path: [{table: "FILM"}])): [FilmActor] -} - - -type FilmActor @table(name: "FILM_ACTOR") { - id: ID! -} - diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/referencingTableWithSelfReferenceReverse/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/referencingTableWithSelfReferenceReverse/schema.graphqls deleted file mode 100644 index 0217d4f056..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/referencingTableWithSelfReferenceReverse/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - languagesFilteredByFilm(filmId: Int! @field(name: "FILM_ID") @reference(path : [{key : "FILM__FILM_LANGUAGE_ID_FKEY"}])): [Language] -} - - -type Language @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/reverseWithMultiplePaths/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/reverseWithMultiplePaths/schema.graphqls deleted file mode 100644 index 27ddd8653a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/reverseWithMultiplePaths/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(username: String! @field(name: "USERNAME") @reference(path: [{key: "STAFF__STAFF_STORE_ID_FKEY"}])): Store -} - -type Store @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/table/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/table/schema.graphqls deleted file mode 100644 index 172bfa13b6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/table/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(district: String! @reference(path: [{table: "ADDRESS"}])): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/tableAndCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/tableAndCondition/schema.graphqls deleted file mode 100644 index ac2e18ef57..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/tableAndCondition/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(district: String! @reference(path: [{table: "ADDRESS", condition: {name: "REFERENCE_CUSTOMER_CONDITION"}}])): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/tableBackwards/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/tableBackwards/schema.graphqls deleted file mode 100644 index 80894111a6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/input/tableBackwards/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(email: String! @reference(path: [{table: "CUSTOMER"}])): Address -} - -type Address @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/multipleToSameTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/multipleToSameTable/schema.graphqls deleted file mode 100644 index 89d785f82f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/multipleToSameTable/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(district: String! @reference(path: [{table: "ADDRESS"}])): Customer -} - -type Customer @table { - district: String! @reference(path: [{table: "ADDRESS"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/multitable/allSpecified/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/multitable/allSpecified/schema.graphqls deleted file mode 100644 index afc06578f7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/multitable/allSpecified/schema.graphqls +++ /dev/null @@ -1,10 +0,0 @@ -type Query { - query: Payment @notGenerated -} - -type Payment @table { - staffAndCustomers: [PersonWithEmail] @splitQuery @multitableReference(routes: [ - {typeName: "Staff", path: [{key: "PAYMENT__PAYMENT_STAFF_ID_FKEY"}]}, - {typeName: "Customer", path: [{table: "CUSTOMER"}]} - ]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/multitable/conditionReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/multitable/conditionReference/schema.graphqls deleted file mode 100644 index bece5d17fd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/multitable/conditionReference/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Query { - query: Payment @notGenerated -} - -type Payment @table { - staffAndCustomers: [PersonWithEmail] @splitQuery @multitableReference(routes: [ - {typeName: "Staff", path: [{condition: {className: "PaymentCondition", method: "paymentStaff"}}]} - ]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/multitable/conditionReferenceAfterKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/multitable/conditionReferenceAfterKey/schema.graphqls deleted file mode 100644 index e5c173f0d9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/multitable/conditionReferenceAfterKey/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Query { - query: Rental @notGenerated -} - -type Rental @table { - staffViaPayment: [PersonWithEmail] @splitQuery @multitableReference(routes: [ - {typeName: "Staff", path: [{key: "PAYMENT__PAYMENT_RENTAL_ID_FKEY"}, {condition: {className: "PaymentCondition", method: "paymentStaff"}}]} - ]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/multitable/conditionReferenceWithKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/multitable/conditionReferenceWithKey/schema.graphqls deleted file mode 100644 index 0ffbd79cba..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/multitable/conditionReferenceWithKey/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Query { - query: Payment @notGenerated -} - -type Payment @table { - staffAndCustomers: [PersonWithEmail] @splitQuery @multitableReference(routes: [ - {typeName: "Staff", path: [{key: "PAYMENT__PAYMENT_STAFF_ID_FKEY", condition: {className: "PaymentCondition", method: "paymentStaff"}}]} - ]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/multitable/multitableInterface/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/multitable/multitableInterface/schema.graphqls deleted file mode 100644 index 5484196a6c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/multitable/multitableInterface/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Payment @notGenerated -} - -type Payment @table { - staffAndCustomers: [PersonWithEmail] @splitQuery @multitableReference -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/multitable/oneImplicit/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/multitable/oneImplicit/schema.graphqls deleted file mode 100644 index 7be6d73625..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/multitable/oneImplicit/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Query { - query: Payment @notGenerated -} - -type Payment @table { - staffAndCustomers: [PersonWithEmail] @splitQuery @multitableReference(routes: [ - {typeName: "Staff", path: [{key: "PAYMENT__PAYMENT_STAFF_ID_FKEY"}]} - ]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/multitable/union/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/multitable/union/schema.graphqls deleted file mode 100644 index 53827d76eb..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/multitable/union/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Query { - query: Payment @notGenerated -} - -type Payment @table { - staffAndCustomers: [PersonUnion] @splitQuery @multitableReference -} - -union PersonUnion = Customer | Staff \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/afterJavaService/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/afterJavaService/schema.graphqls deleted file mode 100644 index 723973fd0a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/afterJavaService/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Customer @service(service: {name: "DUMMY_SERVICE"}) -} - -type Customer @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - address: Address @splitQuery -} - -type Address @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/afterJavaServiceListed/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/afterJavaServiceListed/schema.graphqls deleted file mode 100644 index 17ea34d86c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/afterJavaServiceListed/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Customer @service(service: {name: "DUMMY_SERVICE"}) -} - -type Customer @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - address: [Address] @splitQuery -} - -type Address @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/afterJavaServiceNested/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/afterJavaServiceNested/schema.graphqls deleted file mode 100644 index 93acb8daf2..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/afterJavaServiceNested/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - query: Customer @service(service: {name: "DUMMY_SERVICE"}) -} - -type Customer @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - wrapper: Wrapper -} - -type Wrapper { - address: Address @splitQuery -} - -type Address @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/condition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/condition/schema.graphqls deleted file mode 100644 index ca4362b9e5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/condition/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer @table { - address: Address! @splitQuery @reference(path: [{condition: {name: "REFERENCE_CUSTOMER_CONDITION", method: "addressCustomer"}}]) -} - -type Address @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/fromMultitableInterface/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/fromMultitableInterface/schema.graphqls deleted file mode 100644 index b665c29bce..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/fromMultitableInterface/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - query: SomeInterface @notGenerated -} - -interface SomeInterface { - customer: CustomerTable @splitQuery -} - -type Payment implements SomeInterface @table { - id: ID! - customer: CustomerTable @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/idArgumentOnNonRootQueryWithoutNodeStrategy/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/idArgumentOnNonRootQueryWithoutNodeStrategy/schema.graphqls deleted file mode 100644 index 461bba0083..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/idArgumentOnNonRootQueryWithoutNodeStrategy/schema.graphqls +++ /dev/null @@ -1,10 +0,0 @@ -type Query { - query: Address @notGenerated -} - -type Address @table { - id: ID! - customers( - staffId: ID! @reference(path: [{table: "STORE"}]) - ): [CustomerTable] @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/keyAndCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/keyAndCondition/schema.graphqls deleted file mode 100644 index d378505272..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/keyAndCondition/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer @table { - address: Address! @splitQuery @reference(path: [{key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY", condition: {name: "REFERENCE_CUSTOMER_CONDITION", method: "addressCustomer"}}]) -} - -type Address @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/keyBackwards/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/keyBackwards/schema.graphqls deleted file mode 100644 index cd424e3a5f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/keyBackwards/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Address @notGenerated -} - -type Address @table { - customer: CustomerTable @splitQuery @reference(path: [{key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/keyWithMultiplePaths/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/keyWithMultiplePaths/schema.graphqls deleted file mode 100644 index c74a489433..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/keyWithMultiplePaths/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Film @notGenerated -} - -type Film @table { - language: Language! @splitQuery @reference(path: [{key: "FILM__FILM_ORIGINAL_LANGUAGE_ID_FKEY"}]) -} - -type Language @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/keyWithMultiplePathsAndNestedSplitQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/keyWithMultiplePathsAndNestedSplitQuery/schema.graphqls deleted file mode 100644 index 7d202fa05f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/keyWithMultiplePathsAndNestedSplitQuery/schema.graphqls +++ /dev/null @@ -1,13 +0,0 @@ -type Query { - query: [Film] -} - -type Film @table { - language: Language @reference(path: {key: "FILM__FILM_LANGUAGE_ID_FKEY"}) -} - -type Language @table { - id: ID! - name: String! - filmsWithoutPagination: [Film] @splitQuery @reference(path: [{key: "FILM__FILM_LANGUAGE_ID_FKEY"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/keyWithSinglePath/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/keyWithSinglePath/schema.graphqls deleted file mode 100644 index 985fc8c895..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/keyWithSinglePath/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer @table { - address: Address! @splitQuery @reference(path: [{key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY"}]) -} - -type Address @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/list/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/list/schema.graphqls deleted file mode 100644 index dc84a0f67a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/list/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer @table { - address: [Address]! @splitQuery @reference(path: [{table: "ADDRESS"}]) -} - -type Address @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/nestedFieldWithoutParentConditions/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/nestedFieldWithoutParentConditions/schema.graphqls deleted file mode 100644 index 38c162647e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/nestedFieldWithoutParentConditions/schema.graphqls +++ /dev/null @@ -1,20 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - customerId: Int @field(name: "CUSTOMER_ID") - # SplitQuery to payments with a condition that generates WHERE clauses - payments: [Payment] @splitQuery -} - -type Payment @table { - paymentId: Int @field(name: "PAYMENT_ID") - amount: String - staff: Staff! @reference(path: [{table: "STAFF", condition: {name: "PAYMENT_CONDITION", method: "paymentStaff"}}]) -} - -type Staff @table { - staffId: Int @field(name: "STAFF_ID") - firstName: String @field(name: "FIRST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/nullableField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/nullableField/schema.graphqls deleted file mode 100644 index 04b6191dc3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/nullableField/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer @table { - address: Address @splitQuery @reference(path: [{table: "ADDRESS"}]) -} - -type Address @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/nullableList/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/nullableList/schema.graphqls deleted file mode 100644 index ebe72ff46c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/nullableList/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer @table { - address: [Address] @splitQuery @reference(path: [{table: "ADDRESS"}]) -} - -type Address @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/previousQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/previousQuery/schema.graphqls deleted file mode 100644 index 27a80ab7bd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/previousQuery/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer @table { - address: Address! @splitQuery @reference(path: [{table: "ADDRESS"}]) -} - -type Address @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/previousQueryConditionPath/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/previousQueryConditionPath/schema.graphqls deleted file mode 100644 index 671cf082f6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/previousQueryConditionPath/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer @table { - city: City @splitQuery @reference(path: [{condition: {name: "REFERENCE_CUSTOMER_CONDITION", method: "cityCustomer"}}]) -} - -type City @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/previousQueryMultitableInterface/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/previousQueryMultitableInterface/schema.graphqls deleted file mode 100644 index 6e6d756dc4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/previousQueryMultitableInterface/schema.graphqls +++ /dev/null @@ -1,16 +0,0 @@ -type Query { - query: FilmCategory -} - -type FilmCategory @table(name: "FILM_CATEGORY") { - titledFilms: [Titled] @splitQuery -} - -type Film implements Titled @table { - id: ID! - title: String! -} - -interface Titled { - title: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/previousQueryMultitableUnion/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/previousQueryMultitableUnion/schema.graphqls deleted file mode 100644 index b8cfb95453..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/previousQueryMultitableUnion/schema.graphqls +++ /dev/null @@ -1,13 +0,0 @@ -type Query { - query: FilmCategory -} - -type FilmCategory @table(name: "FILM_CATEGORY") { - films: [FilmUnion] @splitQuery -} - -union FilmUnion = Film - -type Film @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/previousQueryNested/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/previousQueryNested/schema.graphqls deleted file mode 100644 index 5d0ed5aef8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/previousQueryNested/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Customer @table { - address: Address! -} - -type Address @table { - id: ID! - city: City @splitQuery -} - -type City @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/previousQueryPaginated/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/previousQueryPaginated/schema.graphqls deleted file mode 100644 index 86ab596b7b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/previousQueryPaginated/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Store -} - -type Store @table { - customers(first: Int = 100, after: String): CustomerConnection @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/previousQuerySingleTableInterface/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/previousQuerySingleTableInterface/schema.graphqls deleted file mode 100644 index c18eb0b12d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/previousQuerySingleTableInterface/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: City -} - -type City @table { - addresses: [AddressByDistrict] @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/selfConditionReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/selfConditionReference/schema.graphqls deleted file mode 100644 index 38dc728397..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/selfConditionReference/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - films: Film @notGenerated -} - -type Film @table { - id: ID! - sequel: Film @splitQuery @reference(path: [{condition: {name: "REFERENCE_FILM_CONDITION"}}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/selfKeyReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/selfKeyReference/schema.graphqls deleted file mode 100644 index 9195824862..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/selfKeyReference/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - films: Film @notGenerated -} - -type Film @table { - id: ID! - sequel: Film @splitQuery @reference(path: [{key: "FILM__SEQUEL_FKEY"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/selfTableReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/selfTableReference/schema.graphqls deleted file mode 100644 index 53f3a6ffaf..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/selfTableReference/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - films: Film @notGenerated -} - -type Film @table { - id: ID! - sequel: Film @splitQuery @reference(path: [{table: "FILM"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/table/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/table/schema.graphqls deleted file mode 100644 index 27a80ab7bd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/table/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer @table { - address: Address! @splitQuery @reference(path: [{table: "ADDRESS"}]) -} - -type Address @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/tableAndCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/tableAndCondition/schema.graphqls deleted file mode 100644 index 4ba4867623..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/tableAndCondition/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer @table { - address: Address! @splitQuery @reference(path: [{table: "ADDRESS", condition: {name: "REFERENCE_CUSTOMER_CONDITION", method: "addressCustomer"}}]) -} - -type Address @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/tableBackwards/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/tableBackwards/schema.graphqls deleted file mode 100644 index 81d88dc038..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/tableBackwards/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Address @notGenerated -} - -type Address @table { - customer: CustomerTable @splitQuery @reference(path: [{table: "CUSTOMER"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/tableWithSelfReferenceAfterJavaService/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/tableWithSelfReferenceAfterJavaService/schema.graphqls deleted file mode 100644 index dd183d88cd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/tableWithSelfReferenceAfterJavaService/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: FilmWrapper @service(service: {name: "DUMMY_SERVICE"}) -} - -type FilmWrapper @record(record: {className: "no.sikt.graphitron.codereferences.records.FilmWrapperRecord"}) { - film: Film @splitQuery -} - -type Film @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/throughCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/throughCondition/schema.graphqls deleted file mode 100644 index 671cf082f6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/throughCondition/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer @table { - city: City @splitQuery @reference(path: [{condition: {name: "REFERENCE_CUSTOMER_CONDITION", method: "cityCustomer"}}]) -} - -type City @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/throughKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/throughKey/schema.graphqls deleted file mode 100644 index cfcfeefe44..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/throughKey/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer @table { - city: City @splitQuery @reference(path: [{key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY"}]) -} - -type City @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/throughTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/throughTable/schema.graphqls deleted file mode 100644 index 4fe965cad9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/throughTable/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer @table { - city: City @splitQuery @reference(path: [{table: "ADDRESS"}]) -} - -type City @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/throughTableBackwards/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/throughTableBackwards/schema.graphqls deleted file mode 100644 index 515c202837..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/throughTableBackwards/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: City @notGenerated -} - -type City @table { - customer: CustomerTable @splitQuery @reference(path: [{table: "ADDRESS"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/viaTables/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/viaTables/schema.graphqls deleted file mode 100644 index c0f96ba1dd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/splitQuery/viaTables/schema.graphqls +++ /dev/null @@ -1,25 +0,0 @@ -type Query { - query: Film @notGenerated -} - -type Film @table { - # Film -> Inventory -> Store - storesThatHaveThisFilm: [Store] @splitQuery @reference(path: [{key: "INVENTORY__INVENTORY_FILM_ID_FKEY"}, {table: "STORE"}]) - - # Film -> Inventory -> Store -> Address -> City - citiesWhereFilmIsStocked: [City] @splitQuery @reference(path: [{key: "INVENTORY__INVENTORY_FILM_ID_FKEY"}, {table: "STORE"}, {table: "ADDRESS"}, {table: "CITY"}]) -} - -type Store @table { - id: ID -} - -type City @table { - id: ID - # City -> Address -> Customer -> Payment - payments: [Payment] @reference(path: [{table: "ADDRESS"}, {key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY"}, {table: "PAYMENT"}]) -} - -type Payment @table { - id: ID -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/subquery/condition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/subquery/condition/schema.graphqls deleted file mode 100644 index af800b7801..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/subquery/condition/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer @table { - address: Address! @reference(path: [{condition: {name: "REFERENCE_CUSTOMER_CONDITION", method: "addressCustomer"}}]) -} - -type Address @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/subquery/keyWithMultiplePaths/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/subquery/keyWithMultiplePaths/schema.graphqls deleted file mode 100644 index ff465b2749..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/subquery/keyWithMultiplePaths/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Film -} - -type Film @table { - language: Language! @reference(path: [{key: "FILM__FILM_ORIGINAL_LANGUAGE_ID_FKEY"}]) -} - -type Language @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/subquery/keyWithSinglePath/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/subquery/keyWithSinglePath/schema.graphqls deleted file mode 100644 index 6fe0e75aba..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/subquery/keyWithSinglePath/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer @table { - address: Address! @reference(path: [{key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY"}]) -} - -type Address @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/subquery/list/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/subquery/list/schema.graphqls deleted file mode 100644 index d80b439c53..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/subquery/list/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer @table { - address: [Address]! @reference(path: [{table: "ADDRESS"}]) -} - -type Address @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/subquery/nestedLists/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/subquery/nestedLists/schema.graphqls deleted file mode 100644 index 1615f0e198..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/subquery/nestedLists/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Customer @table { - address: [Address]! @reference(path: [{table: "ADDRESS"}]) -} - -type Address @table { - id: ID! - stores: [Store] -} - -type Store @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/subquery/table/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/subquery/table/schema.graphqls deleted file mode 100644 index 6a7c7c5286..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/subquery/table/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer @table { - address: Address! @reference(path: [{table: "ADDRESS"}]) -} - -type Address @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/subquery/throughCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/subquery/throughCondition/schema.graphqls deleted file mode 100644 index 4d48c98879..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/subquery/throughCondition/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer @table { - city: City @reference(path: [{condition: {name: "REFERENCE_CUSTOMER_CONDITION", method: "cityCustomer"}}]) -} - -type City @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/subquery/throughKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/subquery/throughKey/schema.graphqls deleted file mode 100644 index 861833029c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/subquery/throughKey/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer @table { - city: City @reference(path: [{key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY"}]) -} - -type City @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/subquery/throughTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/subquery/throughTable/schema.graphqls deleted file mode 100644 index d443d9ad74..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/subquery/throughTable/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer @table { - city: City @reference(path: [{table: "ADDRESS"}]) -} - -type City @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/subquery/throughTableBackwards/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/subquery/throughTableBackwards/schema.graphqls deleted file mode 100644 index a3ef60023d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/references/subquery/throughTableBackwards/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: City -} - -type City @table { - customer: CustomerTable @reference(path: [{table: "ADDRESS"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/selectHelperMethods/correlatedSubqueryReferences/expected/CustomerDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/selectHelperMethods/correlatedSubqueryReferences/expected/CustomerDBQueries.java deleted file mode 100644 index 5c470c0ed6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/selectHelperMethods/correlatedSubqueryReferences/expected/CustomerDBQueries.java +++ /dev/null @@ -1,17 +0,0 @@ -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; - -import fake.graphql.example.model.PaymentDetail; -import java.util.List; -import no.sikt.graphql.helpers.query.QueryHelper; -import org.jooq.Functions; -import org.jooq.SelectField; -import org.jooq.impl.DSL; - -public class CustomerDBQueries { - private static SelectField<PaymentDetail> paymentDetailsForCustomer_paymentDetail() { - var _a_customer = CUSTOMER.as("customer_2168032777"); - var _a_customer_2168032777_payment = _a_customer.payment().as("payment_521722061"); - return DSL.row(DSL.row(_a_customer_2168032777_payment.PAYMENT_ID).convertFrom(_iv_it -> QueryHelper.intoTableRecord(_iv_it, List.of(_a_customer_2168032777_payment.PAYMENT_ID)))).mapping(Functions.nullOnAllNull(PaymentDetail::new)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/selectHelperMethods/correlatedSubqueryReferences/expected/PaymentDetailDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/selectHelperMethods/correlatedSubqueryReferences/expected/PaymentDetailDBQueries.java deleted file mode 100644 index 74e752c437..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/selectHelperMethods/correlatedSubqueryReferences/expected/PaymentDetailDBQueries.java +++ /dev/null @@ -1,63 +0,0 @@ -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; - -import fake.graphql.example.model.Rental; -import fake.graphql.example.model.Staff; -import fake.graphql.example.model.StaffName; -import fake.graphql.example.model.Store; -import org.jooq.Functions; -import org.jooq.SelectField; -import org.jooq.impl.DSL; - -public class PaymentDetailDBQueries { - private static SelectField<Rental> rentalForPaymentDetail_rental() { - var _a_payment = PAYMENT.as("payment_1831371789"); - var _a_payment_1831371789_rental = _a_payment.rental().as("rental_2757859610"); - var _a_rental_staff = RENTAL.as("rental_2416434249"); - var _a_rental_staff_rentalstaff_staff = STAFF.as("staff_4280024544"); - return DSL.row( - DSL.field( - DSL.select(_1_rentalForPaymentDetail_rental_staff()) - .from(_a_rental_staff) - .join(_a_rental_staff_rentalstaff_staff) - .on(no.sikt.graphitron.codereferences.conditions.PaymentCondition.rentalStaff(_a_rental_staff, _a_rental_staff_rentalstaff_staff)) - .where(_a_payment_1831371789_rental.RENTAL_ID.eq(_a_rental_staff.RENTAL_ID)) - - ) - ).mapping(Rental::new); - } - - private static SelectField<Staff> _1_rentalForPaymentDetail_rental_staff() { - var _a_payment = PAYMENT.as("payment_1831371789"); - var _a_payment_1831371789_rental = _a_payment.rental().as("rental_2757859610"); - var _a_rental_staff = RENTAL.as("rental_2416434249"); - var _a_store = STORE.as("store_4283914359"); - return DSL.row( - DSL.field( - DSL.select(_2_rentalForPaymentDetail_rental_staff_store()) - .from(_a_store) - .where(_a_payment_1831371789_rental.RENTAL_ID.eq(_a_rental_staff.RENTAL_ID)) - - ) - ).mapping(Functions.nullOnAllNull(Staff::new)); - } - - private static SelectField<Store> _2_rentalForPaymentDetail_rental_staff_store() { - var _a_payment = PAYMENT.as("payment_1831371789"); - var _a_payment_1831371789_rental = _a_payment.rental().as("rental_2757859610"); - var _a_rental_staff = RENTAL.as("rental_2416434249"); - var _a_store = STORE.as("store_4283914359"); - var _a_store_4283914359_staff = _a_store.staff().as("staff_3749272683"); - return DSL.row( - _a_store.STORE_ID, - DSL.row( - DSL.field( - DSL.select(_a_store_4283914359_staff.LAST_NAME) - .from(_a_store_4283914359_staff) - .where(_a_payment_1831371789_rental.RENTAL_ID.eq(_a_rental_staff.RENTAL_ID)) - - ) - ).mapping(Functions.nullOnAllNull(StaffName::new)) - ).mapping(Functions.nullOnAllNull(Store::new)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/selectHelperMethods/correlatedSubqueryReferences/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/selectHelperMethods/correlatedSubqueryReferences/schema.graphqls deleted file mode 100644 index dbfee57ae5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/selectHelperMethods/correlatedSubqueryReferences/schema.graphqls +++ /dev/null @@ -1,30 +0,0 @@ -type Query { - query: [Customer] @notGenerated -} - -type Customer @table { - paymentDetails: [PaymentDetail] @splitQuery -} - -type PaymentDetail @table(name: "PAYMENT") { - rental: Rental! @splitQuery -} - -# Table reached via nested splitQuery -type Rental @table { - # Condition-based reference that needs to correlate back to PaymentDetail's composite key - staff: Staff @reference(path: [{condition: {name: "PAYMENT_CONDITION", method: "rentalStaff"}}]) -} - -type Staff @table { - store: Store -} - -type Store @table { - storeId: Int @field(name: "STORE_ID") - managerName: StaffName -} - -type StaffName { - lastName: String @field(name: "LAST_NAME") @reference(path: [{key: "STORE__STORE_MANAGER_STAFF_ID_FKEY"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/selectHelperMethods/duplicateNestedFields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/selectHelperMethods/duplicateNestedFields/schema.graphqls deleted file mode 100644 index 4f9bc3b9a9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/selectHelperMethods/duplicateNestedFields/schema.graphqls +++ /dev/null @@ -1,29 +0,0 @@ -type Query { - query: [Customer] -} - -type Customer @table { - customerId: Int @field(name: "CUSTOMER_ID") - firstName: String @field(name: "FIRST_NAME") - # Customer has store info with both primary and secondary stores - storeInfo: StoreInfo -} - -# Table type with its own table that will get a helper method -type StoreInfo @table(name: "STORE") { - storeId: Int @field(name: "STORE_ID") - # Two wrapper fields that both lead to Staff table - # This creates duplicate helper method names without the fix - primaryStaff: StaffWrapper - secondaryStaff: StaffWrapper -} - -# Wrapper type without a table - will be traversed, not extracted -type StaffWrapper { - staff: Staff -} - -type Staff @table { - staffId: Int @field(name: "STAFF_ID") - firstName: String @field(name: "FIRST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/selectHelperMethods/potentialCollision/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/selectHelperMethods/potentialCollision/schema.graphqls deleted file mode 100644 index 391ec0e374..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/selectHelperMethods/potentialCollision/schema.graphqls +++ /dev/null @@ -1,19 +0,0 @@ -type Query { - rental: Rental -} - -type Rental @table { - # rental -> staff -> store - staff: Staff @reference(path: {key: "RENTAL__RENTAL_STAFF_ID_FKEY"}) - # rental -> staff_store (direct) - # Creates potential collision: both could generate "rentalForQuery_rental_staff_store" - staff_store: Store @reference(path: [{table: "STAFF"}, {key: "STAFF__STAFF_STORE_ID_FKEY"}]) -} - -type Staff @table { - store: Store @reference(path: {key: "STAFF__STAFF_STORE_ID_FKEY"}) -} - -type Store @table { - storeId: Int @field(name: "STORE_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/selectHelperMethods/selection/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/selectHelperMethods/selection/schema.graphqls deleted file mode 100644 index 3fd2eeaa78..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/selectHelperMethods/selection/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Customer implements Node @table { - name: String! @field(name: "FIRST_NAME") - address: Address -} - -type Address @table { - id: ID! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/selectHelperMethodsEntity/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/selectHelperMethodsEntity/default/schema.graphqls deleted file mode 100644 index 698051318d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/selectHelperMethodsEntity/default/schema.graphqls +++ /dev/null @@ -1,10 +0,0 @@ -union _Entity = Customer - -type Customer @table @key(fields: "id") { - id: ID - addresses: [Address] -} - -type Address @table { - id: ID -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/selectHelperMethodsNode/manyFields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/selectHelperMethodsNode/manyFields/schema.graphqls deleted file mode 100644 index c2372ff146..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/selectHelperMethodsNode/manyFields/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Query { - node(id: ID!): Node -} - -type Customer implements Node @table { - id: ID - first: String @field(name: "FIRST_NAME") - last: String! @field(name: "LAST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/selectHelperMethodsNode/nestedLists/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/selectHelperMethodsNode/nestedLists/schema.graphqls deleted file mode 100644 index 55d9213d20..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/selectHelperMethodsNode/nestedLists/schema.graphqls +++ /dev/null @@ -1,16 +0,0 @@ -type Query { - node(id: ID!): Node -} - -type Customer implements Node @table { - addresses: [Address]! -} - -type Address @table { - id: ID! - stores: [Store] -} - -type Store @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/default/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/default/expected/QueryDBQueries.java deleted file mode 100644 index 1ce468f147..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/default/expected/QueryDBQueries.java +++ /dev/null @@ -1,29 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; - -import fake.graphql.example.model.CustomerTable; -import java.util.List; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.SelectField; -import org.jooq.impl.DSL; - -public class QueryDBQueries { - public static List<CustomerTable> queryForQuery(DSLContext _iv_ctx, SelectionSet _iv_select) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - var _iv_orderFields = _a_customer.fields(_a_customer.getPrimaryKey().getFieldsArray()); - return _iv_ctx - .select(queryForQuery_customerTable()) - .from(_a_customer) - .orderBy(_iv_orderFields) - .fetch(_iv_it -> _iv_it.into(CustomerTable.class)); - } - - private static SelectField<CustomerTable> queryForQuery_customerTable() { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return DSL.row(_a_customer.getId()).mapping(Functions.nullOnAllNull(CustomerTable::new)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/default/schema.graphqls deleted file mode 100644 index d3342225f0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/default/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query: [CustomerTable] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/lookup/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/lookup/schema.graphqls deleted file mode 100644 index 6558c8d9b4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/lookup/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(id: [ID]! @lookupKey): [CustomerTable] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/multiset/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/multiset/schema.graphqls deleted file mode 100644 index bc28b573ec..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/multiset/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Address -} - -type Address @table { - customers: [CustomerTable] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/multisetNoPrimaryKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/multisetNoPrimaryKey/schema.graphqls deleted file mode 100644 index 81d038b64f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/multisetNoPrimaryKey/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: [Wrapper] -} - -type Wrapper { - query: [PgUser] -} - -type PgUser @table(name: "PG_USER") { - usesysid: String -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/nestedLists/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/nestedLists/schema.graphqls deleted file mode 100644 index 4a25b361af..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/nestedLists/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - query: [City] -} - - -type City @table { - addresses: [Address] -} - -type Address @table { - customers: [CustomerTable] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/noPrimaryKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/noPrimaryKey/schema.graphqls deleted file mode 100644 index 55d673b1af..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/noPrimaryKey/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: [PgUser] -} - -type PgUser @table(name: "PG_USER") { - usesysid: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/splitQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/splitQuery/schema.graphqls deleted file mode 100644 index f3fdf3bc60..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/splitQuery/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: [Address] -} - -type Address @table { - customers: [CustomerTable] @splitQuery -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/splitQueryNoPrimaryKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/splitQueryNoPrimaryKey/schema.graphqls deleted file mode 100644 index 76da6eaee1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/splitQueryNoPrimaryKey/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: [PgUserMapping] @notGenerated -} - -type PgUserMapping @table(name: "PG_USER_MAPPING") { - userMapping: [PgUser] @splitQuery @reference(path: [{condition: {className: "PgUserMappingCondition"}}]) -} - -type PgUser @table(name: "PG_USER"){ - usesysid: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/withoutList/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/withoutList/expected/QueryDBQueries.java deleted file mode 100644 index d6fa5688a4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/withoutList/expected/QueryDBQueries.java +++ /dev/null @@ -1,26 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; - -import fake.graphql.example.model.CustomerTable; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.SelectField; -import org.jooq.impl.DSL; - -public class QueryDBQueries { - public static CustomerTable queryForQuery(DSLContext _iv_ctx, SelectionSet _iv_select) { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return _iv_ctx - .select(queryForQuery_customerTable()) - .from(_a_customer) - .fetchOne(_iv_it -> _iv_it.into(CustomerTable.class)); - } - - private static SelectField<CustomerTable> queryForQuery_customerTable() { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return DSL.row(_a_customer.getId()).mapping(Functions.nullOnAllNull(CustomerTable::new)); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/withoutList/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/withoutList/schema.graphqls deleted file mode 100644 index dc06cf64fa..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/sorting/withoutList/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query: CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableMethod/noExtraArguments/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableMethod/noExtraArguments/schema.graphqls deleted file mode 100644 index c45584dddf..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableMethod/noExtraArguments/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - customer: Customer @tableMethod(tableMethodReference: {className: "no.sikt.graphitron.codereferences.services.CustomerTableMethod", method: "customerTable"}) -} - -type Customer @table { - id: ID -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableMethod/paginated/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableMethod/paginated/schema.graphqls deleted file mode 100644 index 3819d579b4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableMethod/paginated/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - customer(first: Int = 100, after: String, first_name:String): CustomerConnection @tableMethod(tableMethodReference: {className: "no.sikt.graphitron.codereferences.services.CustomerTableMethod", method: "customerTable"}) -} - -type Customer @table { - id: String -} - diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableMethod/reference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableMethod/reference/schema.graphqls deleted file mode 100644 index 83fd9b53c1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableMethod/reference/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - customer(first_name: String): Customer @tableMethod(tableMethodReference: {className: "no.sikt.graphitron.codereferences.services.CustomerTableMethod", method: "customerTable"}) -} - -type Customer @table{ - id: ID - staff: Staff @reference(path: [{table: "Address"}]) @tableMethod(tableMethodReference: {className: "no.sikt.graphitron.codereferences.services.StaffTableMethod", method: "staffTable"}) -} - -type Staff @table{ - id: ID -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableMethod/splitQuery/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableMethod/splitQuery/expected/QueryDBQueries.java deleted file mode 100644 index 1470e53e0c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableMethod/splitQuery/expected/QueryDBQueries.java +++ /dev/null @@ -1,21 +0,0 @@ -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; - -import fake.graphql.example.model.Customer; -import no.sikt.graphitron.codereferences.services.CustomerTableMethod; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; -import org.jooq.Functions; -import org.jooq.impl.DSL; - -public class QueryDBQueries { - public static Customer customerForQuery(DSLContext _iv_ctx, SelectionSet _iv_select) { - var customerTableMethod = new CustomerTableMethod(); - var _a_customer = CUSTOMER.as("customer_2168032777"); - _a_customer = customerTableMethod.customerTable(_a_customer); - return _iv_ctx - .select(DSL.row(DSL.row(_a_customer.CUSTOMER_ID)).mapping(Functions.nullOnAllNull(Customer::new))) - .from(_a_customer) - .fetchOne(_iv_it -> _iv_it.into(Customer.class)); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableMethod/splitQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableMethod/splitQuery/schema.graphqls deleted file mode 100644 index 5356219168..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableMethod/splitQuery/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - customer: Customer @tableMethod(tableMethodReference: {className: "no.sikt.graphitron.codereferences.services.CustomerTableMethod", method: "customerTable"}) -} - -type Customer @table { - address: Address @splitQuery -} - -type Address @table { - id: ID -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableMethod/withArgumentAndConditionSubquery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableMethod/withArgumentAndConditionSubquery/schema.graphqls deleted file mode 100644 index 41b7bd9059..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableMethod/withArgumentAndConditionSubquery/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - customer(first_name: String): Customer @tableMethod(tableMethodReference: {className: "no.sikt.graphitron.codereferences.services.CustomerTableMethod", method: "customerTable"}) -} - -type Customer @table { - id: ID - payments: [Payment] @reference(path: [{condition: {className: "no.sikt.graphitron.codereferences.conditions.ReferenceCustomerCondition"}}]) -} - -type Payment @table { - id: ID -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableMethod/withContextArgument/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableMethod/withContextArgument/schema.graphqls deleted file mode 100644 index 1520fd7a2f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableMethod/withContextArgument/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - customer: Customer @tableMethod(tableMethodReference: {className: "no.sikt.graphitron.codereferences.services.CustomerTableMethod", method: "customerTable"}, contextArguments: "ctxField") -} - -type Customer @table{ - id: ID -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableMethod/withOneArgument/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableMethod/withOneArgument/schema.graphqls deleted file mode 100644 index 123d0072b8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableMethod/withOneArgument/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - customer(first_name:String): Customer @tableMethod(tableMethodReference: {className: "no.sikt.graphitron.codereferences.services.CustomerTableMethod", method: "customerTable"}) -} - -type Customer @table { - id: String -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableMethod/withOneArgumentInSubquery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableMethod/withOneArgumentInSubquery/schema.graphqls deleted file mode 100644 index b0646af776..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableMethod/withOneArgumentInSubquery/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - customer(first_name: String): Customer @tableMethod(tableMethodReference: {className: "no.sikt.graphitron.codereferences.services.CustomerTableMethod", method: "customerTable"}) -} - -type Customer @table { - id: ID - address: Address -} - -type Address @table { - id: ID -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableRecord/default/expected/MutationDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableRecord/default/expected/MutationDBQueries.java deleted file mode 100644 index 3fc8251e8d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableRecord/default/expected/MutationDBQueries.java +++ /dev/null @@ -1,16 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; -import java.util.List; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CustomerRecord; -import org.jooq.DSLContext; -import org.jooq.impl.DSL; - -public class MutationDBQueries { - public static List<CustomerRecord> fetchCustomerRecords(DSLContext _iv_ctx, List<CustomerRecord> _iv_primaryKeys) { - return _iv_ctx.selectFrom(CUSTOMER) - .where(DSL.row(CUSTOMER.CUSTOMER_ID).in(_iv_primaryKeys.stream().map(_iv_it -> _iv_it.key().valuesRow()).toList())) - .fetch(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableRecord/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableRecord/default/schema.graphqls deleted file mode 100644 index 9aad151e43..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableRecord/default/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerInputTable): ID @mutation(typeName: UPSERT) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableRecord/multipleTables/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableRecord/multipleTables/schema.graphqls deleted file mode 100644 index 0bf044690e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/tableRecord/multipleTables/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Mutation { - mutation1(in: CustomerInputTable): ID @mutation(typeName: UPSERT) - mutation2(in: AddressInputTable): ID @mutation(typeName: UPSERT) - mutation3(in: CustomerInputTable): ID @mutation(typeName: UPSERT) -} - -input AddressInputTable @table(name: "ADDRESS") { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/componentWithEnumField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/componentWithEnumField/schema.graphqls deleted file mode 100644 index be129d9c41..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/componentWithEnumField/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -union U = CustomerUnion - -type CustomerUnion { - enum: DummyEnum -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/componentWithMultipleFields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/componentWithMultipleFields/schema.graphqls deleted file mode 100644 index f5e6cf8fb1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/componentWithMultipleFields/schema.graphqls +++ /dev/null @@ -1,6 +0,0 @@ -union U = CustomerUnion - -type CustomerUnion { - id: ID - email: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/default/expected/QueryDBQueries.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/default/expected/QueryDBQueries.java deleted file mode 100644 index 8b1a20f57d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/default/expected/QueryDBQueries.java +++ /dev/null @@ -1,17 +0,0 @@ -package fake.code.generated.queries.query; - -import static no.sikt.graphitron.jooq.generated.testdata.pg_catalog.Tables.*; -import static no.sikt.graphitron.jooq.generated.testdata.public_.Tables.*; - -import fake.graphql.example.model.Customer; -import fake.graphql.example.model.CustomerUnion; -import org.jooq.Functions; -import org.jooq.SelectField; -import org.jooq.impl.DSL; - -public class QueryDBQueries { - private static SelectField<Customer> queryForQuery_customer() { - var _a_customer = CUSTOMER.as("customer_2168032777"); - return DSL.row(DSL.row(_a_customer.EMAIL).mapping(Functions.nullOnAllNull(CustomerUnion::new))).mapping((_iv_e0_0) -> new Customer(_iv_e0_0)); - } -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/default/schema.graphqls deleted file mode 100644 index 9490bf18a4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/default/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -union U = CustomerUnion - -type CustomerUnion { - email: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/multitableUnion/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/multitableUnion/schema.graphqls deleted file mode 100644 index 5e2d2d1eab..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/multitableUnion/schema.graphqls +++ /dev/null @@ -1,13 +0,0 @@ -type Query { - paginatedUnionQuery(first: Int = 100, after: String): SomeUnionConnection -} - -union SomeUnion = Language | Staff - -type Staff @table { - id: ID -} - -type Language @table { - name: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/multitableUnionOneType/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/multitableUnionOneType/schema.graphqls deleted file mode 100644 index 66f9db225b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/multitableUnionOneType/schema.graphqls +++ /dev/null @@ -1,10 +0,0 @@ -type Query { - paginatedUnionQuery(first: Int = 100, after: String): SomeUnionConnection -} - -union SomeUnion = Language - - -type Language @table { - name: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/multitableUnionSplitQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/multitableUnionSplitQuery/schema.graphqls deleted file mode 100644 index d4f6319e28..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/multitableUnionSplitQuery/schema.graphqls +++ /dev/null @@ -1,17 +0,0 @@ -type Query { - query: Payment @notGenerated -} - -type Payment @table { - staffAndCustomers: [PersonWithEmail] @splitQuery -} - -union PersonWithEmail = Staff | Customer - -type Staff @table(name: "STAFF") { - email: String -} - -type Customer @table(name: "CUSTOMER") { - email: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/splitQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/splitQuery/schema.graphqls deleted file mode 100644 index edfa463564..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/splitQuery/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Wrapper @table(name: "ADDRESS") { - id: ID! - - query: Customer @splitQuery -} - -type Customer @table { - union: U -} - -union U = CustomerUnion - -type CustomerUnion { - email: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/threeComponents/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/threeComponents/schema.graphqls deleted file mode 100644 index 3e40b7e0ad..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/threeComponents/schema.graphqls +++ /dev/null @@ -1,13 +0,0 @@ -union U = CustomerUnion0 | CustomerUnion1 | CustomerUnion2 - -type CustomerUnion0 { - email: String -} - -type CustomerUnion1 { - email: String -} - -type CustomerUnion2 { - email: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/twoComponents/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/twoComponents/schema.graphqls deleted file mode 100644 index 2ccb9588e0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/twoComponents/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -union U = CustomerUnion0 | CustomerUnion1 - -type CustomerUnion0 { - email: String -} - -type CustomerUnion1 { - email: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/twoComponentsWithOtherField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/twoComponentsWithOtherField/schema.graphqls deleted file mode 100644 index 9646e6e6df..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/twoComponentsWithOtherField/schema.graphqls +++ /dev/null @@ -1,14 +0,0 @@ -type Customer @table { - id: ID! - union: U -} - -union U = CustomerUnion0 | CustomerUnion1 - -type CustomerUnion0 { - email: String -} - -type CustomerUnion1 { - email: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/withOtherField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/withOtherField/schema.graphqls deleted file mode 100644 index 5d29922dd0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/queries/fetch/union/withOtherField/schema.graphqls +++ /dev/null @@ -1,10 +0,0 @@ -type Customer @table { - id: ID! - union: U -} - -union U = CustomerUnion - -type CustomerUnion { - email: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/recordtransformer/fromGraphToJOOQ/expected/RecordTransformer.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/recordtransformer/fromGraphToJOOQ/expected/RecordTransformer.java deleted file mode 100644 index ae2ac3ecab..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/recordtransformer/fromGraphToJOOQ/expected/RecordTransformer.java +++ /dev/null @@ -1,26 +0,0 @@ -package fake.code.generated.transform; - -import fake.code.generated.mappers.CustomerInputTableJOOQMapper; -import fake.graphql.example.model.CustomerInputTable; -import graphql.schema.DataFetchingEnvironment; -import java.lang.String; -import java.util.List; -import no.sikt.graphql.helpers.resolvers.ArgumentPresence; -import no.sikt.graphql.helpers.transform.AbstractTransformer; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CustomerRecord; - -public class RecordTransformer extends AbstractTransformer { - public RecordTransformer(DataFetchingEnvironment _iv_env) { - super(_iv_env); - } - - public List<CustomerRecord> customerInputTableToJOOQRecord(List<CustomerInputTable> _mi_input, - ArgumentPresence _iv_argPresence, String _iv_path) { - return CustomerInputTableJOOQMapper.toJOOQRecord(_mi_input, _iv_argPresence, _iv_path, this); - } - - public CustomerRecord customerInputTableToJOOQRecord(CustomerInputTable _mi_input, - ArgumentPresence _iv_argPresence, String _iv_path) { - return customerInputTableToJOOQRecord(List.of(_mi_input), _iv_argPresence.asSingleItem(), _iv_path).stream().findFirst().orElse(new CustomerRecord()); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/recordtransformer/fromGraphToJOOQ/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/recordtransformer/fromGraphToJOOQ/schema.graphqls deleted file mode 100644 index e9a7114d82..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/recordtransformer/fromGraphToJOOQ/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(in: CustomerInputTable): ID @service(service: {name: "DUMMY_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/recordtransformer/fromGraphToJava/expected/RecordTransformer.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/recordtransformer/fromGraphToJava/expected/RecordTransformer.java deleted file mode 100644 index eb646fe62b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/recordtransformer/fromGraphToJava/expected/RecordTransformer.java +++ /dev/null @@ -1,26 +0,0 @@ -package fake.code.generated.transform; - -import fake.code.generated.mappers.DummyInputRecordJavaMapper; -import fake.graphql.example.model.DummyInputRecord; -import graphql.schema.DataFetchingEnvironment; -import java.lang.String; -import java.util.List; -import no.sikt.graphitron.codereferences.records.IDJavaRecord; -import no.sikt.graphql.helpers.resolvers.ArgumentPresence; -import no.sikt.graphql.helpers.transform.AbstractTransformer; - -public class RecordTransformer extends AbstractTransformer { - public RecordTransformer(DataFetchingEnvironment _iv_env) { - super(_iv_env); - } - - public List<IDJavaRecord> dummyInputRecordToJavaRecord(List<DummyInputRecord> _mi_input, - ArgumentPresence _iv_argPresence, String _iv_path) { - return DummyInputRecordJavaMapper.toJavaRecord(_mi_input, _iv_argPresence, _iv_path, this); - } - - public IDJavaRecord dummyInputRecordToJavaRecord(DummyInputRecord _mi_input, - ArgumentPresence _iv_argPresence, String _iv_path) { - return dummyInputRecordToJavaRecord(List.of(_mi_input), _iv_argPresence.asSingleItem(), _iv_path).stream().findFirst().orElse(new IDJavaRecord()); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/recordtransformer/fromGraphToJava/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/recordtransformer/fromGraphToJava/schema.graphqls deleted file mode 100644 index 5f3f626cdf..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/recordtransformer/fromGraphToJava/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(in: DummyInputRecord): ID @service(service: {className: "DummyService"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/recordtransformer/fromJOOQToGraph/expected/RecordTransformer.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/recordtransformer/fromJOOQToGraph/expected/RecordTransformer.java deleted file mode 100644 index 413e566656..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/recordtransformer/fromJOOQToGraph/expected/RecordTransformer.java +++ /dev/null @@ -1,25 +0,0 @@ -package fake.code.generated.transform; - -import fake.code.generated.mappers.CustomerTableTypeMapper; -import fake.graphql.example.model.CustomerTable; -import graphql.schema.DataFetchingEnvironment; -import java.lang.String; -import java.util.List; -import no.sikt.graphql.helpers.transform.AbstractTransformer; -import no.sikt.graphitron.jooq.generated.testdata.public_.tables.records.CustomerRecord; - -public class RecordTransformer extends AbstractTransformer { - public RecordTransformer(DataFetchingEnvironment _iv_env) { - super(_iv_env); - } - - public List<CustomerTable> customerTableRecordToGraphType(List<CustomerRecord> _mi_input, - String _iv_path) { - return CustomerTableTypeMapper.recordToGraphType(_mi_input, _iv_path, this); - } - - public CustomerTable customerTableRecordToGraphType(CustomerRecord _mi_input, - String _iv_path) { - return customerTableRecordToGraphType(List.of(_mi_input), _iv_path).stream().findFirst().orElse(null); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/recordtransformer/fromJOOQToGraph/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/recordtransformer/fromJOOQToGraph/schema.graphqls deleted file mode 100644 index 19f75c8bb8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/recordtransformer/fromJOOQToGraph/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query: CustomerTable @service(service: {name: "DUMMY_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/recordtransformer/fromJavaToGraph/expected/RecordTransformer.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/recordtransformer/fromJavaToGraph/expected/RecordTransformer.java deleted file mode 100644 index 9d52bce514..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/recordtransformer/fromJavaToGraph/expected/RecordTransformer.java +++ /dev/null @@ -1,24 +0,0 @@ -package fake.code.generated.transform; - -import fake.code.generated.mappers.CustomerTypeMapper; -import fake.graphql.example.model.Customer; -import graphql.schema.DataFetchingEnvironment; -import java.lang.String; -import java.util.List; -import no.sikt.graphitron.codereferences.dummyreferences.DummyRecord; -import no.sikt.graphql.helpers.transform.AbstractTransformer; - -public class RecordTransformer extends AbstractTransformer { - public RecordTransformer(DataFetchingEnvironment _iv_env) { - super(_iv_env); - } - - public List<Customer> customerToGraphType(List<DummyRecord> _mi_input, - String _iv_path) { - return CustomerTypeMapper.toGraphType(_mi_input, _iv_path, this); - } - - public Customer customerToGraphType(DummyRecord _mi_input, String _iv_path) { - return customerToGraphType(List.of(_mi_input), _iv_path).stream().findFirst().orElse(null); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/recordtransformer/fromJavaToGraph/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/recordtransformer/fromJavaToGraph/schema.graphqls deleted file mode 100644 index 0cf5c94f0d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/recordtransformer/fromJavaToGraph/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Customer @service(service: {name: "DUMMY_SERVICE"}) -} - -type Customer @record(record: {name: "DUMMY_RECORD"}) { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/recordtransformer/whenNoRecordsExist/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/recordtransformer/whenNoRecordsExist/schema.graphqls deleted file mode 100644 index 3077e452a0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/recordtransformer/whenNoRecordsExist/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/recordtransformer/withValidation/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/recordtransformer/withValidation/schema.graphqls deleted file mode 100644 index e9a7114d82..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/recordtransformer/withValidation/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(in: CustomerInputTable): ID @service(service: {name: "DUMMY_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/schemamappers/default/expected/Response0TypeMapper.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/schemamappers/default/expected/Response0TypeMapper.java deleted file mode 100644 index bb42d6d59f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/schemamappers/default/expected/Response0TypeMapper.java +++ /dev/null @@ -1,21 +0,0 @@ -package fake.code.generated.mappers; - -import fake.code.generated.transform.RecordTransformer; -import fake.graphql.example.model.Response0; -import java.lang.String; - -public class Response0TypeMapper { - public static Response0 recordToGraphType(String _mi_response0Record, - String _iv_path, RecordTransformer _iv_transform) { - var _iv_pathHere = _iv_path.isEmpty() ? _iv_path : _iv_path + "/"; - var _iv_select = _iv_transform.getSelect(); - var _mo_response0 = new Response0(); - - if (_iv_select.contains(_iv_pathHere + "id")) { - _mo_response0.setId(_mi_response0Record); - } - - - return _mo_response0; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/schemamappers/default/expected/Response1TypeMapper.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/schemamappers/default/expected/Response1TypeMapper.java deleted file mode 100644 index 2ce991d85d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/schemamappers/default/expected/Response1TypeMapper.java +++ /dev/null @@ -1,21 +0,0 @@ -package fake.code.generated.mappers; - -import fake.code.generated.transform.RecordTransformer; -import fake.graphql.example.model.Response1; -import java.lang.String; - -public class Response1TypeMapper { - public static Response1 recordToGraphType(String _mi_response1Record, - String _iv_path, RecordTransformer _iv_transform) { - var _iv_pathHere = _iv_path.isEmpty() ? _iv_path : _iv_path + "/"; - var _iv_select = _iv_transform.getSelect(); - var _mo_response1 = new Response1(); - - if (_iv_select.contains(_iv_pathHere + "id1")) { - _mo_response1.setId1(_mi_response1Record); - } - - - return _mo_response1; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/schemamappers/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/schemamappers/default/schema.graphqls deleted file mode 100644 index 9e10e73894..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/schemamappers/default/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - query0: Response0 @service(service: {name: "MAPPER_ID_SERVICE", method: "query"}) - query1: Response1 @service(service: {name: "MAPPER_ID_SERVICE", method: "query"}) -} - -type Response0 { - id: ID -} - -type Response1 { - id1: ID @field(name: "ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/schemamappers/listedFields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/schemamappers/listedFields/schema.graphqls deleted file mode 100644 index e56ecda2a0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/schemamappers/listedFields/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - query0: Response0 @service(service: {name: "MAPPER_ID_SERVICE", method: "queryListed"}) - query1: Response1 @service(service: {name: "MAPPER_ID_SERVICE", method: "queryListed"}) -} - -type Response0 { - id: [ID] -} - -type Response1 { - id1: [ID] @field(name: "ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/schemamappers/listedSplitQueryInNestedJooqRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/schemamappers/listedSplitQueryInNestedJooqRecord/schema.graphqls deleted file mode 100644 index 7bd40dbd91..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/schemamappers/listedSplitQueryInNestedJooqRecord/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - query: Payload @service(service: {className: "MapperFetchService", method: "cityQuery"}) -} - -type Payload { - cities: [City] -} - -type City @table { - addresses: [Address] @splitQuery -} - -type Address @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/schemamappers/nestedListWithSplitQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/schemamappers/nestedListWithSplitQuery/schema.graphqls deleted file mode 100644 index 51d4b644d3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/schemamappers/nestedListWithSplitQuery/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - query: Payload @service(service: {className: "MapperFetchService", method: "cityQuery"}) -} - -type Payload { - cities: [City] @splitQuery -} - -type City @table { - addresses: [Address] @splitQuery -} - -type Address @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/schemamappers/singleSplitQueryInWrapper/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/schemamappers/singleSplitQueryInWrapper/schema.graphqls deleted file mode 100644 index 1ff527342d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/schemamappers/singleSplitQueryInWrapper/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation: CustomerWrapper @service(service: {className: "ResolverMutationService", method: "mutationCustomer"}) -} - -type CustomerWrapper { - customer: CustomerTable @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/schemamappers/splitQueryInNestedJavaRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/schemamappers/splitQueryInNestedJavaRecord/schema.graphqls deleted file mode 100644 index 1946b54fd3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/schemamappers/splitQueryInNestedJavaRecord/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - query: Payload @service(service: {name: "MAPPER_FETCH_SERVICE", method: "customerJavaQuery"}) -} - -type Payload { - customerJavaRecords: [CustomerJavaRecord] -} - -type CustomerJavaRecord @record(record: {name: "JAVA_RECORD_CUSTOMER"}) { - address: Address @splitQuery -} - -type Address @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/filtersDuplicates/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/filtersDuplicates/schema.graphqls deleted file mode 100644 index c5eae84ccd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/filtersDuplicates/schema.graphqls +++ /dev/null @@ -1,4 +0,0 @@ -type Query { - query: DummyTypeRecord @service(service: {name: "DUMMY_SERVICE"}) - queryList: [DummyTypeRecord] @service(service : {name: "DUMMY_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/filtersDuplicatesForQueryAndMutation/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/filtersDuplicatesForQueryAndMutation/schema.graphqls deleted file mode 100644 index caf64a8aec..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/filtersDuplicatesForQueryAndMutation/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Query { - queryJOOQ(inQueryJOOQ: CustomerInputTable): CustomerTable @service(service: {name: "DUMMY_SERVICE"}) - queryJava(inQueryJava: DummyInputRecord): DummyTypeRecord @service(service: {name: "DUMMY_SERVICE"}) -} - -type Mutation { - mutationJOOQ(inQueryJOOQ: CustomerInputTable): CustomerTable @service(service: {name: "DUMMY_SERVICE"}) - mutationJava(inQueryJava: DummyInputRecord): DummyTypeRecord @service(service: {name: "DUMMY_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/mutation/serviceRecordsOnSplitQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/mutation/serviceRecordsOnSplitQuery/schema.graphqls deleted file mode 100644 index 6eccb70ae3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/mutation/serviceRecordsOnSplitQuery/schema.graphqls +++ /dev/null @@ -1,10 +0,0 @@ -type Mutation { - mutation: Wrapper -} - -type Wrapper @table(name: "Store") { - id: ID - - mutation1(input1: DummyInputRecord): DummyTypeRecord @splitQuery @service(service: {name: "DUMMY_SERVICE"}) - mutation2(input2: CustomerInputTable): CustomerTable @splitQuery @service(service: {name: "DUMMY_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/mutation/tograph/middleOutputWithoutRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/mutation/tograph/middleOutputWithoutRecord/schema.graphqls deleted file mode 100644 index 7ead171b27..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/mutation/tograph/middleOutputWithoutRecord/schema.graphqls +++ /dev/null @@ -1,20 +0,0 @@ -type Mutation { - mutation: Level1 @service(service: {name: "DUMMY_SERVICE"}) -} - -type Level1 @record(record: {name: "DUMMY_RECORD"}) { - level2: Level2 -} - -type Level2 { - level3A: [Level3A!] - level3B: [Level3B!] -} - -type Level3A @table(name: "CUSTOMER") { - id: ID -} - -type Level3B @record(record: {name: "DUMMY_RECORD"}) { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/mutation/tograph/serviceWithJOOQRecords/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/mutation/tograph/serviceWithJOOQRecords/schema.graphqls deleted file mode 100644 index 9afe875a85..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/mutation/tograph/serviceWithJOOQRecords/schema.graphqls +++ /dev/null @@ -1,20 +0,0 @@ -type Mutation { - mutation: Customer @service(service: {name: "DUMMY_SERVICE"}) -} - -type Customer implements Node @table { - id: ID! - wrapper: Wrapper - addresses: [Address!]! @splitQuery @service(service: {name: "DUMMY_SERVICE"}) -} - -type Wrapper { - addressesWrapped: [AddressWrapped!]! @splitQuery @service(service: {name: "DUMMY_SERVICE"}) -} - -type Address @table { - id: ID! - - city: AddressCity0 # This should not be found. - cityRecord: AddressCity1 # Table ignores record directive. -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/mutation/tograph/serviceWithJavaRecords/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/mutation/tograph/serviceWithJavaRecords/schema.graphqls deleted file mode 100644 index 8997a8d162..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/mutation/tograph/serviceWithJavaRecords/schema.graphqls +++ /dev/null @@ -1,20 +0,0 @@ -type Mutation { - mutation: Customer @service(service: {name: "DUMMY_SERVICE"}) -} - -type Customer @record(record: {name: "DUMMY_RECORD"}) { - id: ID! - wrapper: Wrapper - addresses: [Address!]! @splitQuery @service(service: {name: "DUMMY_SERVICE"}) -} - -type Wrapper { - addressesWrapped: [AddressWrapped!]! @splitQuery @service(service: {name: "DUMMY_SERVICE"}) -} - -type Address @record(record: {name: "DUMMY_RECORD"}) { - id: ID! - - city: AddressCity0 - cityRecord: AddressCity1 -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/mutation/tograph/serviceWithoutOuterRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/mutation/tograph/serviceWithoutOuterRecord/schema.graphqls deleted file mode 100644 index b6e9d80764..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/mutation/tograph/serviceWithoutOuterRecord/schema.graphqls +++ /dev/null @@ -1,20 +0,0 @@ -type Mutation { - edit1: Response1! @service(service: {name: "DUMMY_SERVICE"}) - edit2: Response2! @service(service: {name: "DUMMY_SERVICE"}) -} - -type Response1 { - customer1: [Customer1] -} - -type Response2 { - customer2: [Customer2] @splitQuery -} - -type Customer1 @table(name: "CUSTOMER") { - id: ID! -} - -type Customer2 @table(name: "CUSTOMER") { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/mutation/torecord/layeredInputJOOQRecords/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/mutation/torecord/layeredInputJOOQRecords/schema.graphqls deleted file mode 100644 index 42722fd2b6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/mutation/torecord/layeredInputJOOQRecords/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Mutation { - mutation(level1: Level1!): ID! @service(service : {name: "DUMMY_SERVICE"}) -} - -input Level1 @table(name: "CUSTOMER") { - level2: Level2 -} - -input Level2 @table(name: "CUSTOMER") { - level3: Level3! -} - -input Level3 @table(name: "CUSTOMER") { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/mutation/torecord/middleInputWithoutRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/mutation/torecord/middleInputWithoutRecord/schema.graphqls deleted file mode 100644 index f9c3a4fb64..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/mutation/torecord/middleInputWithoutRecord/schema.graphqls +++ /dev/null @@ -1,20 +0,0 @@ -type Mutation { - mutation(level1: Level1!): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input Level1 @record(record: {name: "DUMMY_RECORD"}) { - level2: Level2 -} - -input Level2 { - level3A: [Level3A!] - level3B: [Level3B!] -} - -input Level3A @table(name: "CUSTOMER") { - id: ID -} - -input Level3B @record(record: {name: "DUMMY_RECORD"}) { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/mutation/torecord/serviceWithJOOQRecords/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/mutation/torecord/serviceWithJOOQRecords/schema.graphqls deleted file mode 100644 index 4de54a3117..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/mutation/torecord/serviceWithJOOQRecords/schema.graphqls +++ /dev/null @@ -1,4 +0,0 @@ -type Mutation { - service1(cityInput: CityInput1): ID @service(service: {name: "DUMMY_SERVICE"}) - service2(cityInput: CityInput3): ID @service(service: {name: "DUMMY_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/mutation/torecord/serviceWithJavaRecords/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/mutation/torecord/serviceWithJavaRecords/schema.graphqls deleted file mode 100644 index 19e7def983..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/mutation/torecord/serviceWithJavaRecords/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Mutation { - # When setting service. - service1(cityInput: CityInput1): ID @service(service: {name: "DUMMY_SERVICE"}) - service2(cityInput: CityInput3): ID @service(service: {name: "DUMMY_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/conditionRecordsOnSplitQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/conditionRecordsOnSplitQuery/schema.graphqls deleted file mode 100644 index 14d9bee753..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/conditionRecordsOnSplitQuery/schema.graphqls +++ /dev/null @@ -1,21 +0,0 @@ -type Wrapper { - id: ID - address1(input1: AddressInput1): Address1 @splitQuery @condition(condition: {name: "DUMMY_CONDITION"}) - address2(input2: AddressInput2): Address2 @splitQuery @condition(condition: {name: "DUMMY_CONDITION"}) -} - -input AddressInput1 @record(record: {name: "DUMMY_RECORD"}) { - id: ID -} - -input AddressInput2 @table(name: "ADDRESS") { - id: ID -} - -type Address1 @record(record: {name: "DUMMY_RECORD"}) { - id: ID -} - -type Address2 @table(name: "ADDRESS") { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/conditionWithoutRecordClasses/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/conditionWithoutRecordClasses/schema.graphqls deleted file mode 100644 index 2ba5a461f1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/conditionWithoutRecordClasses/schema.graphqls +++ /dev/null @@ -1,23 +0,0 @@ -type Query { - condition1(cityInput: CityInput1): ID @condition(condition: {name: "DUMMY_CONDITION"}) - - # Nested case, condition in a resolver. - conditionResolver: Store -} - -input CityInput1 { - cityId: String! @field(name: "CITY_ID") -} - -type Store @table { - id: ID! - address(input: AddressInput): Address @splitQuery @condition(condition: {name: "DUMMY_CONDITION"}) -} - -input AddressInput { - id: ID! -} - -type Address @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/serviceRecordsOnSplitQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/serviceRecordsOnSplitQuery/schema.graphqls deleted file mode 100644 index 14d2c930d7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/serviceRecordsOnSplitQuery/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Wrapper { - id: ID - query1(input1: DummyInputRecord): DummyTypeRecord @splitQuery @service(service: {name: "DUMMY_SERVICE"}) - query2(input2: CustomerInputTable): CustomerTable @splitQuery @service(service: {name: "DUMMY_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/tograph/middleOutputWithoutRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/tograph/middleOutputWithoutRecord/schema.graphqls deleted file mode 100644 index 1d8f80df76..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/tograph/middleOutputWithoutRecord/schema.graphqls +++ /dev/null @@ -1,20 +0,0 @@ -type Query { - query: Level1 @service(service: {name: "DUMMY_SERVICE"}) -} - -type Level1 @record(record: {name: "DUMMY_RECORD"}) { - level2: Level2 -} - -type Level2 { - level3A: [Level3A!] - level3B: [Level3B!] -} - -type Level3A @table(name: "CUSTOMER") { - id: ID -} - -type Level3B @record(record: {name: "DUMMY_RECORD"}) { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/tograph/serviceWithJOOQRecords/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/tograph/serviceWithJOOQRecords/schema.graphqls deleted file mode 100644 index 13f961e646..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/tograph/serviceWithJOOQRecords/schema.graphqls +++ /dev/null @@ -1,20 +0,0 @@ -type Query { - query: Customer @service(service: {name: "DUMMY_SERVICE"}) -} - -type Customer implements Node @table { - id: ID! - wrapper: Wrapper - addresses: [Address!]! @splitQuery @service(service: {name: "DUMMY_SERVICE"}) -} - -type Wrapper { - addressesWrapped: [AddressWrapped!]! @splitQuery @service(service: {name: "DUMMY_SERVICE"}) -} - -type Address @table { - id: ID! - - city: AddressCity0 # This should not be found. - cityRecord: AddressCity1 # Table ignores record directive. -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/tograph/serviceWithJavaRecords/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/tograph/serviceWithJavaRecords/schema.graphqls deleted file mode 100644 index 77b17de0d7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/tograph/serviceWithJavaRecords/schema.graphqls +++ /dev/null @@ -1,20 +0,0 @@ -type Query { - query: Customer @service(service: {name: "DUMMY_SERVICE"}) -} - -type Customer @record(record: {name: "DUMMY_RECORD"}) { - id: ID! - wrapper: Wrapper - addresses: [Address!]! @splitQuery @service(service: {name: "DUMMY_SERVICE"}) -} - -type Wrapper { - addressesWrapped: [AddressWrapped!]! @splitQuery @service(service: {name: "DUMMY_SERVICE"}) -} - -type Address @record(record: {name: "DUMMY_RECORD"}) { - id: ID! - - city: AddressCity0 - cityRecord: AddressCity1 -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/tograph/serviceWithPagination/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/tograph/serviceWithPagination/schema.graphqls deleted file mode 100644 index 1f5be6e497..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/tograph/serviceWithPagination/schema.graphqls +++ /dev/null @@ -1,20 +0,0 @@ -type Query { - queryConnection(first: Int = 100, after: String): CustomerConnection @service(service : {name: "DUMMY_SERVICE"}) - - # We expect only one match despite this. - queryDirect: Customer @service(service : {name: "DUMMY_SERVICE"}) -} - -type CustomerConnection { - edges: [CustomerConnectionEdge] - nodes: [Customer!]! -} - -type CustomerConnectionEdge { - cursor: String - node: Customer -} - -type Customer @record(record: {name: "DUMMY_RECORD"}) { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/tograph/serviceWithoutTopLevelRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/tograph/serviceWithoutTopLevelRecord/schema.graphqls deleted file mode 100644 index a07be1dae5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/tograph/serviceWithoutTopLevelRecord/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: OuterWrapper @service(service: {name: "DUMMY_SERVICE"}) -} - -type OuterWrapper { - customers: [Customer] -} - -type Customer implements Node @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/torecord/conditionAndJOOQRecords/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/torecord/conditionAndJOOQRecords/schema.graphqls deleted file mode 100644 index 3f52549f4c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/torecord/conditionAndJOOQRecords/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Query { - # When setting condition we want to find the mappable records. This is tested to ensure the filtering for record generation accounts for these as well. - condition1(cityInput: CityInput1): ID @condition(condition: {name: "DUMMY_CONDITION"}) - condition2(cityInput: CityInput3): ID @condition(condition: {name: "DUMMY_CONDITION"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/torecord/conditionAndJavaRecords/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/torecord/conditionAndJavaRecords/schema.graphqls deleted file mode 100644 index 8e3a1aa88c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/torecord/conditionAndJavaRecords/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Query { - # When setting condition we want to find the mappable records. This is tested to ensure the filtering for record generation accounts for these as well. - condition1(cityInput: CityInput1): ID @condition(condition: {name: "DUMMY_CONDITION"}) # Layer without record. May need to forbid this case if the next one has record set. - condition2(cityInput: CityInput3): ID @condition(condition: {name: "DUMMY_CONDITION"}) -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/torecord/middleInputWithoutRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/torecord/middleInputWithoutRecord/schema.graphqls deleted file mode 100644 index c1e8146653..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/torecord/middleInputWithoutRecord/schema.graphqls +++ /dev/null @@ -1,20 +0,0 @@ -type Query { - query(level1: Level1!): ID @service(service: {name: "DUMMY_SERVICE"}) -} - -input Level1 @record(record: {name: "DUMMY_RECORD"}) { - level2: Level2 -} - -input Level2 { - level3A: [Level3A!] - level3B: [Level3B!] -} - -input Level3A @table(name: "CUSTOMER") { - id: ID -} - -input Level3B @record(record: {name: "DUMMY_RECORD"}) { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/torecord/serviceWithJOOQRecords/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/torecord/serviceWithJOOQRecords/schema.graphqls deleted file mode 100644 index 31bee19d92..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/torecord/serviceWithJOOQRecords/schema.graphqls +++ /dev/null @@ -1,6 +0,0 @@ -type Query { - # Layer without record. Maybe this case should not be generated after all? For services this would not really work out. - # This is a silly case and out of scope for now. - service1(cityInput: CityInput1): ID @service(service: {name: "DUMMY_SERVICE"}) - service2(cityInput: CityInput3): ID @service(service: {name: "DUMMY_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/torecord/serviceWithJavaRecords/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/torecord/serviceWithJavaRecords/schema.graphqls deleted file mode 100644 index 31bee19d92..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/torecord/serviceWithJavaRecords/schema.graphqls +++ /dev/null @@ -1,6 +0,0 @@ -type Query { - # Layer without record. Maybe this case should not be generated after all? For services this would not really work out. - # This is a silly case and out of scope for now. - service1(cityInput: CityInput1): ID @service(service: {name: "DUMMY_SERVICE"}) - service2(cityInput: CityInput3): ID @service(service: {name: "DUMMY_SERVICE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/torecord/withoutServiceOrCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/torecord/withoutServiceOrCondition/schema.graphqls deleted file mode 100644 index 3feb6f171e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/torecord/withoutServiceOrCondition/schema.graphqls +++ /dev/null @@ -1,4 +0,0 @@ -type Query { - customer1(in1: CustomerInputTable): ID - customer2(in2: DummyInputRecord): ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/torecord/withoutServiceOrConditionSplitQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/torecord/withoutServiceOrConditionSplitQuery/schema.graphqls deleted file mode 100644 index 905edbc820..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/transformerdetection/query/torecord/withoutServiceOrConditionSplitQuery/schema.graphqls +++ /dev/null @@ -1,6 +0,0 @@ -type Wrapper { - id: ID - - customer1(in1: CustomerInputTable): DummyType @splitQuery - customer2(in2: DummyInputRecord): DummyType @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/typeregistry/default/expected/TypeRegistry.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/typeregistry/default/expected/TypeRegistry.java deleted file mode 100644 index 29d14e0a7d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/typeregistry/default/expected/TypeRegistry.java +++ /dev/null @@ -1,15 +0,0 @@ -import graphql.schema.idl.TypeDefinitionRegistry; -import java.util.Set; -import no.sikt.graphql.schema.SchemaReadingHelper; - -public class TypeRegistry { - public static TypeDefinitionRegistry getTypeRegistry() { - return SchemaReadingHelper.getTypeDefinitionRegistry( - Set.of( - "src/test/resources/components/basic/Customer.graphqls", - "src/test/resources/components/basic/CustomerQuery.graphqls", - "../../graphitron-common/src/main/resources/directives.graphqls" - ) - ); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/cycleThroughFieldReturningInterface/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/cycleThroughFieldReturningInterface/schema.graphqls deleted file mode 100644 index fa46b3d0ee..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/cycleThroughFieldReturningInterface/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type TypeA { - i: InterfaceI -} - -interface InterfaceI { - notInCycle: String -} - -type Impl implements InterfaceI { - notInCycle: String - a: TypeA -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/cycleThroughInterfaceField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/cycleThroughInterfaceField/schema.graphqls deleted file mode 100644 index 2ac23de0b7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/cycleThroughInterfaceField/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type TypeA { - i: InterfaceI -} - -interface InterfaceI { - a: TypeA -} - -type Impl implements InterfaceI { - a: TypeA -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/cycleThroughInterfaceFieldWithMultiplePaths/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/cycleThroughInterfaceFieldWithMultiplePaths/schema.graphqls deleted file mode 100644 index a2417ed5db..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/cycleThroughInterfaceFieldWithMultiplePaths/schema.graphqls +++ /dev/null @@ -1,13 +0,0 @@ -type TypeA { - i: InterfaceI -} - -interface InterfaceI { - a1: TypeA - a2: TypeA -} - -type Impl implements InterfaceI { - a1: TypeA - a2: TypeA -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/cycleThroughUnion/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/cycleThroughUnion/schema.graphqls deleted file mode 100644 index 31e2b7a515..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/cycleThroughUnion/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type TypeA { - u: U -} - -union U = TypeB - -type TypeB { - a: TypeA -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/cycleWithDeadEndSibling/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/cycleWithDeadEndSibling/schema.graphqls deleted file mode 100644 index 2c4e75affa..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/cycleWithDeadEndSibling/schema.graphqls +++ /dev/null @@ -1,16 +0,0 @@ -type TypeA { - deadEnd: DeadEnd - b: TypeB -} - -type TypeB { - a: TypeA -} - -type DeadEnd { - d: DeadEndLeaf -} - -type DeadEndLeaf { - s: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/inputTypeCycle/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/inputTypeCycle/schema.graphqls deleted file mode 100644 index c70c1d19b2..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/inputTypeCycle/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -input InputA { - b: InputB -} - -input InputB { - a: InputA -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/inputTypeNoCycle/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/inputTypeNoCycle/schema.graphqls deleted file mode 100644 index 5183b9c592..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/inputTypeNoCycle/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -input InputA { - b: InputB -} - -input InputB { - name: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/inputTypeSelfReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/inputTypeSelfReference/schema.graphqls deleted file mode 100644 index 2de5097d8f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/inputTypeSelfReference/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -input InputA { - a: InputA -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/interfaceCycle/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/interfaceCycle/schema.graphqls deleted file mode 100644 index e0cc446dc1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/interfaceCycle/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -interface I @table(name: "CUSTOMER") { - i: I -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/multipleCyclesThroughUnion/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/multipleCyclesThroughUnion/schema.graphqls deleted file mode 100644 index 527f610999..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/multipleCyclesThroughUnion/schema.graphqls +++ /dev/null @@ -1,13 +0,0 @@ -type TypeA { - u: U -} - -union U = TypeB | TypeC - -type TypeB { - path1: TypeA -} - -type TypeC { - path2: TypeA -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/multiplePathsInCycle/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/multiplePathsInCycle/schema.graphqls deleted file mode 100644 index 7344f46974..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/multiplePathsInCycle/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type TypeA { - path1: TypeB - path2: TypeB -} - -type TypeB { - path1: TypeA - path2: TypeA -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/objectTypeCycle/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/objectTypeCycle/schema.graphqls deleted file mode 100644 index e8b86b9da0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/objectTypeCycle/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type TypeA { - b: TypeB -} - -type TypeB { - a: TypeA -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/objectTypeCycleWithResolver/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/objectTypeCycleWithResolver/schema.graphqls deleted file mode 100644 index c8aa0685ae..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/objectTypeCycleWithResolver/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type TypeA { - b: TypeB -} - -type TypeB { - a: TypeA @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/objectTypeSelfReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/objectTypeSelfReference/schema.graphqls deleted file mode 100644 index f0e9afc58a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/cycle/objectTypeSelfReference/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type TypeA { - a: TypeA -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/entity/keyIsReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/entity/keyIsReference/schema.graphqls deleted file mode 100644 index ded9d547f9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/entity/keyIsReference/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -union _Entity = Customer - -type Customer @table @key(fields: "addressId") { - id: ID - addressId: Int @reference(path: [{table: "ADDRESS"}]) @field(name: "ADDRESS_ID") -} - diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/entity/keyNotFound/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/entity/keyNotFound/schema.graphqls deleted file mode 100644 index cafc5a6dfc..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/entity/keyNotFound/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -union _Entity = Customer - -type Customer @table @key(fields: "nonExistentField") { - id: ID -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/entity/keyNotFoundSimilar/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/entity/keyNotFoundSimilar/schema.graphqls deleted file mode 100644 index d9bc542993..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/entity/keyNotFoundSimilar/schema.graphqls +++ /dev/null @@ -1,6 +0,0 @@ -union _Entity = Customer - -type Customer @table @key(fields: "cusomerId") { - id: ID - customerId: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/entity/nestedKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/entity/nestedKey/schema.graphqls deleted file mode 100644 index a7476af852..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/entity/nestedKey/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -union _Entity = Customer - -type Customer @table @key(fields: "address { id }") { - address: Address -} - -type Address @table { - id: ID -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/entity/noTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/entity/noTable/schema.graphqls deleted file mode 100644 index 571150571a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/entity/noTable/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -union _Entity = Customer - -type Customer @key(fields: "id") { - id: ID -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/exception/missingClassName/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/exception/missingClassName/schema.graphqls deleted file mode 100644 index fda72a5fd0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/exception/missingClassName/schema.graphqls +++ /dev/null @@ -1,4 +0,0 @@ -type SomeError implements Error @error(handlers: [{handler: GENERIC, description: "bad word detected"}]) { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/inputDirective/recordOnly/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/inputDirective/recordOnly/schema.graphqls deleted file mode 100644 index 33c3e57194..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/inputDirective/recordOnly/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - test(in: TestInput): ID @notGenerated -} - -input TestInput @record(record: {className: "no.sikt.graphitron.codereferences.records.CustomerJavaRecord"}) { - someID: ID -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/inputDirective/tableAndRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/inputDirective/tableAndRecord/schema.graphqls deleted file mode 100644 index 110cdb56ab..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/inputDirective/tableAndRecord/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - test(in: TestInput): ID @notGenerated -} - -input TestInput @table(name: "ADDRESS") @record(record: {className: "no.sikt.graphitron.codereferences.records.CustomerJavaRecord"}) { - someID: ID -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/inputDirective/tableOnly/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/inputDirective/tableOnly/schema.graphqls deleted file mode 100644 index 4870a7ba23..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/inputDirective/tableOnly/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - test(in: TestInput): ID @notGenerated -} - -input TestInput @table(name: "ADDRESS") { - addressId: Int @field(name: "ADDRESS_ID") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/node/allTypesUsingNodeInterface/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/node/allTypesUsingNodeInterface/schema.graphqls deleted file mode 100644 index fc37603154..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/node/allTypesUsingNodeInterface/schema.graphqls +++ /dev/null @@ -1,13 +0,0 @@ -type Query { - filmA(id: ID!): FilmA - filmB(id: ID!): FilmB - node(id: ID!): Node -} - -type FilmA implements Node @table(name: "FILM") { - id: ID! -} - -type FilmB implements Node @table(name: "FILM") { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/node/listed/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/node/listed/schema.graphqls deleted file mode 100644 index 5f5298b6e4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/node/listed/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - nodes(ids: [ID!]): [Node] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/node/notAllTypesUsingNodeInterface/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/node/notAllTypesUsingNodeInterface/schema.graphqls deleted file mode 100644 index c256e4b3b8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/node/notAllTypesUsingNodeInterface/schema.graphqls +++ /dev/null @@ -1,13 +0,0 @@ -type Query { - filmC(id: ID!): FilmC - filmD(id: ID!): FilmD - node(id: ID!): Node -} - -type FilmC implements Node @table(name: "FILM") { - id: ID! -} - -type FilmD @table(name: "FILM") { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/node/splitQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/node/splitQuery/schema.graphqls deleted file mode 100644 index 89df4490c4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/node/splitQuery/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Wrapper { - id: ID! - - node(id: ID!): Node! @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/node/tooFewArguments/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/node/tooFewArguments/schema.graphqls deleted file mode 100644 index 2039d85ec0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/node/tooFewArguments/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - node: Node @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/node/tooManyArguments/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/node/tooManyArguments/schema.graphqls deleted file mode 100644 index ea2331b771..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/node/tooManyArguments/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - node(id: ID!, title: String): Node -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/conditionConflict/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/conditionConflict/schema.graphqls deleted file mode 100644 index 7585d57582..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/conditionConflict/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - address: Address -} - -interface Address @table(name: "ADDRESS") @discriminate(on: "DISTRICT"){ - customer: CustomerTable @condition(condition: {name: "DUMMY_CONDITION"}) -} - -type AddressInDistrictOne implements Address @table(name: "ADDRESS") @discriminator(value: "ONE") { - customer: CustomerTable -} - -type AddressInDistrictTwo implements Address @table(name: "ADDRESS") @discriminator(value: "TWO") { - customer: CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/conditionReferenceInTypeConflict/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/conditionReferenceInTypeConflict/schema.graphqls deleted file mode 100644 index 1f3555971e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/conditionReferenceInTypeConflict/schema.graphqls +++ /dev/null @@ -1,17 +0,0 @@ -type Query { - address: Address -} - -interface Address @table(name: "ADDRESS") @discriminate(on: "DISTRICT"){ - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressInDistrictOne implements Address @table(name: "ADDRESS") @discriminator(value: "ONE") { - postalCode: String @field(name: "POSTAL_CODE") - customer: CustomerTable @reference(path: [{condition: {name: "DUMMY_CONDITION"}}]) -} - -type AddressInDistrictTwo implements Address @table(name: "ADDRESS") @discriminator(value: "TWO") { - postalCode: String @field(name: "POSTAL_CODE") - customer: CustomerTable @reference(path: [{condition: {name: "DUMMY_CONDITION", method: "WRONG"}}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/discriminateFieldDoesNotExist/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/discriminateFieldDoesNotExist/schema.graphqls deleted file mode 100644 index 074b6be48d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/discriminateFieldDoesNotExist/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -interface AddressByDistrict @discriminate(on: "COLUMN_DOES_NOT_EXIST") @table(name: "ADDRESS") { - postalCode: String @field(name: "POSTAL_CODE") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/discriminateFieldIsNotString/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/discriminateFieldIsNotString/schema.graphqls deleted file mode 100644 index 9c4b4bcc8b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/discriminateFieldIsNotString/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -interface AddressByDistrict @discriminate(on: "CITY_ID") @table(name: "ADDRESS") { - postalCode: String @field(name: "POSTAL_CODE") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/fieldInTypeConflict/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/fieldInTypeConflict/schema.graphqls deleted file mode 100644 index 166cbdfd05..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/fieldInTypeConflict/schema.graphqls +++ /dev/null @@ -1,17 +0,0 @@ -type Query { - address: Address -} - -interface Address @table(name: "ADDRESS") @discriminate(on: "DISTRICT"){ - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressInDistrictOne implements Address @table(name: "ADDRESS") @discriminator(value: "ONE") { - postalCode: String @field(name: "POSTAL_CODE") - sharedField: String @field(name: "WRONG_1") -} - -type AddressInDistrictTwo implements Address @table(name: "ADDRESS") @discriminator(value: "TWO") { - postalCode: String @field(name: "POSTAL_CODE") - sharedField: String @field(name: "WRONG_2") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/fieldOverride/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/fieldOverride/schema.graphqls deleted file mode 100644 index e7fd0f20a5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/fieldOverride/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - address: Address -} - -interface Address @table(name: "ADDRESS") @discriminate(on: "DISTRICT"){ - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressInDistrictOne implements Address @table(name: "ADDRESS") @discriminator(value: "ONE") { - postalCode: String @field(name: "ADDRESS_") -} - -type AddressInDistrictTwo implements Address @table(name: "ADDRESS") @discriminator(value: "TWO") { - postalCode: String @field(name: "POSTAL_CODE") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/missingDiscriminate/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/missingDiscriminate/schema.graphqls deleted file mode 100644 index 1f3018f0c6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/missingDiscriminate/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -interface Address @table { - postalCode: String @field(name: "POSTAL_CODE") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/missingTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/missingTable/schema.graphqls deleted file mode 100644 index d215f80129..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/missingTable/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -interface Address @discriminate(on: "DISTRICT") { - postalCode: String @field(name: "POSTAL_CODE") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/referenceConflict/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/referenceConflict/schema.graphqls deleted file mode 100644 index e9d50d3c5a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/referenceConflict/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - address: Address -} - -interface Address @table(name: "ADDRESS") @discriminate(on: "DISTRICT"){ - customer: CustomerTable @reference(path: [{table: "CUSTOMER"}]) -} - -type AddressInDistrictOne implements Address @table(name: "ADDRESS") @discriminator(value: "ONE") { - customer: CustomerTable @reference(path: [{key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY"}]) -} - -type AddressInDistrictTwo implements Address @table(name: "ADDRESS") @discriminator(value: "TWO") { - customer: CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/referenceInTypeConflict/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/referenceInTypeConflict/schema.graphqls deleted file mode 100644 index b1bdc4b9d9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/referenceInTypeConflict/schema.graphqls +++ /dev/null @@ -1,17 +0,0 @@ -type Query { - address: Address -} - -interface Address @table(name: "ADDRESS") @discriminate(on: "DISTRICT"){ - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressInDistrictOne implements Address @table(name: "ADDRESS") @discriminator(value: "ONE") { - postalCode: String @field(name: "POSTAL_CODE") - customer: CustomerTable @reference(path: [{key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY"}]) -} - -type AddressInDistrictTwo implements Address @table(name: "ADDRESS") @discriminator(value: "TWO") { - postalCode: String @field(name: "POSTAL_CODE") - customer: CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/referenceMatches/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/referenceMatches/schema.graphqls deleted file mode 100644 index af44516677..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/referenceMatches/schema.graphqls +++ /dev/null @@ -1,17 +0,0 @@ -type Query { - address: Address -} - -interface Address @table(name: "ADDRESS") @discriminate(on: "DISTRICT"){ - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressInDistrictOne implements Address @table(name: "ADDRESS") @discriminator(value: "ONE") { - postalCode: String @field(name: "POSTAL_CODE") - customer: CustomerTable @reference(path: [{key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY"}]) -} - -type AddressInDistrictTwo implements Address @table(name: "ADDRESS") @discriminator(value: "TWO") { - postalCode: String @field(name: "POSTAL_CODE") - customer: CustomerTable @reference(path: [{key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/singleTableInterfaceHasTypeWithDifferentTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/singleTableInterfaceHasTypeWithDifferentTable/schema.graphqls deleted file mode 100644 index 8bac219217..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/singleTableInterfaceHasTypeWithDifferentTable/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -interface AddressByDistrict @discriminate(on: "DISTRICT") @table(name: "ADDRESS") { - postalCode: String @field(name: "POSTAL_CODE") -} - -type Address implements AddressByDistrict @discriminator(value: "ONE") @table(name: "SOME_OTHER_TABLE"){ - postalCode: String @field(name: "POSTAL_CODE") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/splitQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/splitQuery/schema.graphqls deleted file mode 100644 index 7c9937b28f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/splitQuery/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer @table { - address: AddressInterface @splitQuery -} - -interface AddressInterface @discriminate(on: "DISTRICT") @table(name: "ADDRESS") { - postalCode: String @field(name: "POSTAL_CODE") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/typeWithDiscriminatorDoesNotImplementAnyInterface/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/typeWithDiscriminatorDoesNotImplementAnyInterface/schema.graphqls deleted file mode 100644 index ca536290e8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/typeWithDiscriminatorDoesNotImplementAnyInterface/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Address @discriminator(value: "ONE") { - postalCode: String @field(name: "POSTAL_CODE") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/typeWithDiscriminatorDoesNotImplementSingleTableInterface/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/typeWithDiscriminatorDoesNotImplementSingleTableInterface/schema.graphqls deleted file mode 100644 index 4463d446aa..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/typeWithDiscriminatorDoesNotImplementSingleTableInterface/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -interface Address { - postalCode: String @field(name: "POSTAL_CODE") -} - -type AddressInDistrictOne @discriminator(value: "ONE") { - postalCode: String @field(name: "POSTAL_CODE") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/typeWithoutDiscriminatorImplementsSingleTableInterface/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/typeWithoutDiscriminatorImplementsSingleTableInterface/schema.graphqls deleted file mode 100644 index 8d98411877..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/interface/singleTable/typeWithoutDiscriminatorImplementsSingleTableInterface/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -interface AddressByDistrict @discriminate(on: "DISTRICT") @table { - postalCode: String @field(name: "POSTAL_CODE") -} - -type Address implements AddressByDistrict { - postalCode: String @field(name: "POSTAL_CODE") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/javarecord/inputNestedUnmappedField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/javarecord/inputNestedUnmappedField/schema.graphqls deleted file mode 100644 index dcd9358875..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/javarecord/inputNestedUnmappedField/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - test(in: TestInput): ID @notGenerated -} - -input TestInput @record(record: {className: "no.sikt.graphitron.codereferences.records.CustomerJavaRecord"}) { - someID: ID - nested: NestedInput -} - -input NestedInput { - invalidNestedField: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/javarecord/inputSuggestion/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/javarecord/inputSuggestion/schema.graphqls deleted file mode 100644 index 8f09e7f0d6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/javarecord/inputSuggestion/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Query { - test(in: TestInput): ID @notGenerated -} - -# Field 'emaill' (typo) expects setEmaill which doesn't exist, -# but setEmail exists and should be suggested -input TestInput @record(record: {className: "no.sikt.graphitron.codereferences.records.CustomerJavaRecord"}) { - emaill: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/javarecord/inputUnmappedField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/javarecord/inputUnmappedField/schema.graphqls deleted file mode 100644 index 5fd0c7c786..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/javarecord/inputUnmappedField/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - test(in: TestInput): ID @notGenerated -} - -input TestInput @record(record: {className: "no.sikt.graphitron.codereferences.records.CustomerJavaRecord"}) { - invalidField: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/javarecord/inputValidMapping/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/javarecord/inputValidMapping/schema.graphqls deleted file mode 100644 index 8d7c4de5aa..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/javarecord/inputValidMapping/schema.graphqls +++ /dev/null @@ -1,20 +0,0 @@ -type Query { - test(in: TestInput): ID @notGenerated -} - -input TestInput @record(record: {className: "no.sikt.graphitron.codereferences.records.CustomerJavaRecord"}) { - someID: ID - myField: ID @field(name: "OTHER_ID", javaName: "otherID") - invalidField: String @notGenerated - nested: NestedInput - jooqNested: JooqNestedInput -} - -input NestedInput { - addressId: String -} - -# Nested input with @table should NOT be validated against parent Java record -input JooqNestedInput @table(name: "ADDRESS") { - unmappedField: String @field(name: "POSTAL_CODE") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/javarecord/nestedRecordUnmappedField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/javarecord/nestedRecordUnmappedField/schema.graphqls deleted file mode 100644 index acbd996aa8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/javarecord/nestedRecordUnmappedField/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - test(in: OuterInput): ID @notGenerated -} - -# Outer record references inner record via testCustomerInnerRecord field -input OuterInput @record(record: {className: "no.sikt.graphitron.codereferences.records.MapperCustomerJavaRecord"}) { - name: String - testCustomerInnerRecord: InnerInput -} - -# Inner record has an invalid field that should be detected -input InnerInput @record(record: {className: "no.sikt.graphitron.codereferences.records.MapperCustomerInnerJavaRecord"}) { - someInt: Int - invalidField: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/javarecord/outputResolverUnmappedField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/javarecord/outputResolverUnmappedField/schema.graphqls deleted file mode 100644 index 240356c668..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/javarecord/outputResolverUnmappedField/schema.graphqls +++ /dev/null @@ -1,13 +0,0 @@ -type Query { - test: TestOutput @notGenerated -} - -# Output type with @record - resolver field 'related' has @field with undefined name not in Java record -type TestOutput @record(record: {className: "no.sikt.graphitron.codereferences.records.CustomerJavaRecord"}) { - someID: ID - related: Address @field(name: "undefinedField") @splitQuery -} - -type Address @table { - addressId: Int @field(name: "ADDRESS_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/javarecord/outputSuggestion/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/javarecord/outputSuggestion/schema.graphqls deleted file mode 100644 index ffd5dea732..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/javarecord/outputSuggestion/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Query { - test: TestOutput @notGenerated -} - -# Field 'efail' (typo) expects getEfail which doesn't exist, -# but getEmail exists and should be suggested -type TestOutput @record(record: {className: "no.sikt.graphitron.codereferences.records.CustomerJavaRecord"}) { - efail: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/javarecord/outputUnmappedField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/javarecord/outputUnmappedField/schema.graphqls deleted file mode 100644 index 46d27c8dc8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/javarecord/outputUnmappedField/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Query { - test: TestOutput @notGenerated -} - -# Output type with @record - field 'invalidField' has no getter in Java record -type TestOutput @record(record: {className: "no.sikt.graphitron.codereferences.records.CustomerJavaRecord"}) { - someID: ID - invalidField: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/javarecord/outputUpperCaseFieldWithoutJavaName/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/javarecord/outputUpperCaseFieldWithoutJavaName/schema.graphqls deleted file mode 100644 index 7767941904..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/javarecord/outputUpperCaseFieldWithoutJavaName/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Query { - test: TestOutput @notGenerated -} - -# @field(name: "EMAIL") without javaName produces getter getEMAIL() which doesn't match getEmail() -type TestOutput @record(record: {className: "no.sikt.graphitron.codereferences.records.CustomerJavaRecord"}) { - someID: ID - email: String @field(name: "EMAIL") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/javarecord/outputValidMapping/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/javarecord/outputValidMapping/schema.graphqls deleted file mode 100644 index ba0bdcd693..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/javarecord/outputValidMapping/schema.graphqls +++ /dev/null @@ -1,17 +0,0 @@ -type Query { - test: TestOutput @notGenerated -} - -# Output type with @record - validates getter methods -type TestOutput @record(record: {className: "no.sikt.graphitron.codereferences.records.CustomerJavaRecord"}) { - someID: ID - email: String @field(name: "EMAIL", javaName: "email") - myField: ID @field(name: "OTHER_ID", javaName: "otherID") - invalidField: String @notGenerated - wrapper: Wrapper -} - -# Nested wrapper type without @record - its fields are validated against parent Java record (flattened) -type Wrapper { - addressId: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/implementationWithoutTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/implementationWithoutTable/schema.graphqls deleted file mode 100644 index 57471c76af..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/implementationWithoutTable/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - someInterface: SomeInterface -} - -interface SomeInterface { - id: ID -} - -type Customer implements SomeInterface { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/interfaceOutsideRoot/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/interfaceOutsideRoot/schema.graphqls deleted file mode 100644 index b33c2132a4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/interfaceOutsideRoot/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Payment @notGenerated -} - -type Payment @table { - staffAndCustomers: [PersonWithEmail] @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/listedNoPrimaryKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/listedNoPrimaryKey/schema.graphqls deleted file mode 100644 index 0a6d8a9aa6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/listedNoPrimaryKey/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: [SomeInterface] -} - -interface SomeInterface { - usesysid: String -} - -type PgUser implements SomeInterface @table(name: "PG_USER") { - usesysid: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/multiplePathsWithoutMultitableReferenceDirective/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/multiplePathsWithoutMultitableReferenceDirective/schema.graphqls deleted file mode 100644 index 831bd0d2c6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/multiplePathsWithoutMultitableReferenceDirective/schema.graphqls +++ /dev/null @@ -1,13 +0,0 @@ -type Query { - query: Film @notGenerated -} - -type Film @table { - languages: [LanguageUnion] @splitQuery -} - -union LanguageUnion = Language - -type Language @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/splitQueryReferenceInNestedQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/splitQueryReferenceInNestedQuery/schema.graphqls deleted file mode 100644 index cce36ddb67..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/splitQueryReferenceInNestedQuery/schema.graphqls +++ /dev/null @@ -1,23 +0,0 @@ -type Query { - query: Payment @notGenerated -} - -type Payment @table { - staffAndCustomers: [PersonWithAddress] @splitQuery -} - -interface PersonWithAddress { - address: Address @splitQuery -} - -type StaffWithEmail implements PersonWithAddress @table(name: "STAFF") { - address: Address @splitQuery -} - -type CustomerWithEmail implements PersonWithAddress @table(name: "CUSTOMER") { - address: Address @splitQuery -} - -type Address @table { - id: ID -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/splitQueryRequiredOnMultitableFieldOutsideRoot/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/splitQueryRequiredOnMultitableFieldOutsideRoot/schema.graphqls deleted file mode 100644 index b7a0065cd5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/splitQueryRequiredOnMultitableFieldOutsideRoot/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Payment @notGenerated -} - -type Payment @table { - staffAndCustomers: [PersonWithEmail] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/twoImplementationsWithoutTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/twoImplementationsWithoutTable/schema.graphqls deleted file mode 100644 index 9ba68a24c1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/twoImplementationsWithoutTable/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - someInterface: SomeInterface -} - -interface SomeInterface { - id: ID -} - -type Customer implements SomeInterface { - id: ID -} - -type Address implements SomeInterface { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/twoTypesWithoutTableInUnion/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/twoTypesWithoutTableInUnion/schema.graphqls deleted file mode 100644 index e8433deb92..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/twoTypesWithoutTableInUnion/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Query { - someUnion: SomeUnion -} - -union SomeUnion = Customer | Address - -type Address { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/typeWithoutTableInUnion/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/typeWithoutTableInUnion/schema.graphqls deleted file mode 100644 index c568d39de3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/typeWithoutTableInUnion/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Query { - someUnion: SomeUnion -} - -union SomeUnion = Customer diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/unionOutsideRoot/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/unionOutsideRoot/schema.graphqls deleted file mode 100644 index 2ed7853f95..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/unionOutsideRoot/schema.graphqls +++ /dev/null @@ -1,17 +0,0 @@ -type Query { - query: Payment @notGenerated -} - -type Payment @table { - staffAndCustomers: [PersonWithEmail] @splitQuery -} - -union PersonWithEmail = Staff | Customer - -type Staff @table(name: "STAFF") { - email: String -} - -type Customer @table(name: "CUSTOMER") { - email: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/withInvalidReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/withInvalidReference/schema.graphqls deleted file mode 100644 index 480cca958b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/withInvalidReference/schema.graphqls +++ /dev/null @@ -1,13 +0,0 @@ -type Query { - query: Film @notGenerated -} - -type Film @table { - languages: [LanguageUnion] @splitQuery @multitableReference(routes: {typeName: "Language", path: [{table: "LANGUAGE"}]}) -} - -union LanguageUnion = Language - -type Language @table { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/withReferenceDirective/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/withReferenceDirective/schema.graphqls deleted file mode 100644 index 11bbbb1bd9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/withReferenceDirective/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Payment @notGenerated -} - -type Payment @table { - staffAndCustomers: [PersonWithEmail] @splitQuery @reference(path: [{table: "CUSTOMER"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/withValidReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/withValidReference/schema.graphqls deleted file mode 100644 index e9af67acd0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/multitable/withValidReference/schema.graphqls +++ /dev/null @@ -1,19 +0,0 @@ -type Query { - query: Film @notGenerated -} - -type Film @table { - languages: [LanguageUnion] @splitQuery @multitableReference(routes: [ - {typeName: "Language", path: [{key: "FILM__FILM_LANGUAGE_ID_FKEY"}]}, - {typeName: "OriginalLanguage", path: [{key: "FILM__FILM_ORIGINAL_LANGUAGE_ID_FKEY"}]}]) -} - -union LanguageUnion = Language | OriginalLanguage - -type Language @table { - id: ID -} - -type OriginalLanguage @table(name: "LANGUAGE") { - id: ID -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/bothIterable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/bothIterable/schema.graphqls deleted file mode 100644 index beacc598b8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/bothIterable/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: [CustomerInputTable]): Response @mutation(typeName: UPDATE) -} - -type Response { - id: [ID] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/bothIterableWithExtraField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/bothIterableWithExtraField/schema.graphqls deleted file mode 100644 index 58dc2ee6ce..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/bothIterableWithExtraField/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Mutation { - mutation(in: [CustomerInputTable]): Response @mutation(typeName: UPDATE) -} - -type Response { - id0: [ID] - id1: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/bothNotIterable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/bothNotIterable/schema.graphqls deleted file mode 100644 index fdb3913db2..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/bothNotIterable/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: CustomerInputTable): Response @mutation(typeName: UPDATE) -} - -type Response { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/bothNotIterableWithErrors/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/bothNotIterableWithErrors/schema.graphqls deleted file mode 100644 index d118ce1c41..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/bothNotIterableWithErrors/schema.graphqls +++ /dev/null @@ -1,13 +0,0 @@ -type Mutation { - mutation(in: CustomerInputTable): Response @mutation(typeName: UPDATE) -} - -type Response { - id: ID - errors: [SomeError] -} - -type SomeError implements Error { - path: [String] - message: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/bothOuterIterable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/bothOuterIterable/schema.graphqls deleted file mode 100644 index 8ed1c2eafe..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/bothOuterIterable/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: [CustomerInputTable]): [Response] @mutation(typeName: UPDATE) -} - -type Response { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/id/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/id/schema.graphqls deleted file mode 100644 index 5f6ece564e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/id/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerInputTable!): ID! @mutation(typeName: DELETE) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/mismatchBetweenInputAndOutputTables/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/mismatchBetweenInputAndOutputTables/schema.graphqls deleted file mode 100644 index 7988c63798..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/mismatchBetweenInputAndOutputTables/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: CustomerNodeInputTable!): VacationDestination @mutation(typeName: DELETE) -} - -type VacationDestination @table(name: "VACATION_DESTINATION") { - destination: Int @field(name: "DESTINATION_ID") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/missingFieldToMatchPrimaryKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/missingFieldToMatchPrimaryKey/schema.graphqls deleted file mode 100644 index ffa8831b63..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/missingFieldToMatchPrimaryKey/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: VacationDestinationInput!): ID! @mutation(typeName: DELETE) -} - -input VacationDestinationInput @table(name: "VACATION_DESTINATION") { - destination: Int! @field(name: "DESTINATION_ID") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/missingMultipleFieldsToMatchPrimaryKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/missingMultipleFieldsToMatchPrimaryKey/schema.graphqls deleted file mode 100644 index 781485ec94..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/missingMultipleFieldsToMatchPrimaryKey/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: VacationDestinationInput!): ID! @mutation(typeName: DELETE) -} - -input VacationDestinationInput @table(name: "VACATION_DESTINATION") { - countryName: String @field(name: "COUNTRY_NAME") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/multipleDataFields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/multipleDataFields/schema.graphqls deleted file mode 100644 index 1c40779c9f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/multipleDataFields/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Mutation { - mutation(in: CustomerNodeInputTable!): Wrapper @mutation(typeName: DELETE) -} - -type Wrapper { - data1: CustomerNode - data2: CustomerNode -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/nodeId/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/nodeId/schema.graphqls deleted file mode 100644 index 4cbf432921..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/nodeId/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerNodeInputTable!): ID! @mutation(typeName: DELETE) @nodeId(typeName: "CustomerNode") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/nullableInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/nullableInput/schema.graphqls deleted file mode 100644 index a2b755109f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/nullableInput/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerNodeInputTable): ID @mutation(typeName: DELETE) @nodeId(typeName: "CustomerNode") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/nullableNodeId/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/nullableNodeId/schema.graphqls deleted file mode 100644 index 8b73961458..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/nullableNodeId/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: CustomerInput!): ID! @mutation(typeName: DELETE) @nodeId(typeName: "CustomerNode") -} - -input CustomerInput @table(name: "CUSTOMER") { - id: ID @nodeId(typeName: "CustomerNode") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/onePrimaryKeyFieldNullable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/onePrimaryKeyFieldNullable/schema.graphqls deleted file mode 100644 index 35fad4bf5e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/onePrimaryKeyFieldNullable/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Mutation { - mutation(in: VacationDestinationInput!): ID! @mutation(typeName: DELETE) -} - -input VacationDestinationInput @table(name: "VACATION_DESTINATION") { - destination: Int @field(name: "DESTINATION_ID") - countryName: String! @field(name: "COUNTRY_NAME") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/onlyErrorExceptionUnionField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/onlyErrorExceptionUnionField/schema.graphqls deleted file mode 100644 index 8e5aba7cba..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/onlyErrorExceptionUnionField/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: CustomerNodeInputTable!): Wrapper @mutation(typeName: DELETE) -} - -type Wrapper { - error: [ValidationError] -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/onlyErrorsField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/onlyErrorsField/schema.graphqls deleted file mode 100644 index aba5a5dd19..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/onlyErrorsField/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: CustomerNodeInputTable!): Wrapper @mutation(typeName: DELETE) -} - -type Wrapper { - errors: [ValidationError] -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/primaryKeyFields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/primaryKeyFields/schema.graphqls deleted file mode 100644 index 87a30cafa2..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/primaryKeyFields/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Mutation { - mutation(in: VacationDestinationInput!): Int! @field(name: "DESTINATION_ID") @mutation(typeName: DELETE) -} - -input VacationDestinationInput @table(name: "VACATION_DESTINATION") { - destination: Int! @field(name: "DESTINATION_ID") - countryName: String! @field(name: "COUNTRY_NAME") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/referenceId/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/referenceId/schema.graphqls deleted file mode 100644 index 2f5c59c28b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/referenceId/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: CustomerInput!): ID! @mutation(typeName: DELETE) @nodeId(typeName: "CustomerNode") -} - -input CustomerInput @table(name: "CUSTOMER") { - id: ID! @field(name: "ADDRESS_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/referenceNodeId/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/referenceNodeId/schema.graphqls deleted file mode 100644 index 45d9b09ac2..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/referenceNodeId/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Mutation { - mutation(in: CustomerInput!): ID! @mutation(typeName: DELETE) @nodeId(typeName: "CustomerNode") -} - -input CustomerInput @table(name: "CUSTOMER") { - id: ID! @nodeId(typeName: "Address") -} - -type Address implements Node @table @node { - id: ID! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/returningScalar/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/returningScalar/schema.graphqls deleted file mode 100644 index 4cbf432921..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/returningScalar/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerNodeInputTable!): ID! @mutation(typeName: DELETE) @nodeId(typeName: "CustomerNode") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/returningTableObject/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/returningTableObject/schema.graphqls deleted file mode 100644 index 13f6cd83e1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/returningTableObject/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerNodeInputTable!): CustomerNode @mutation(typeName: DELETE) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/returningWrappedScalar/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/returningWrappedScalar/schema.graphqls deleted file mode 100644 index da7ddb81ca..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/returningWrappedScalar/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Mutation { - mutation(in: CustomerNodeInputTable!): Wrapper @mutation(typeName: DELETE) -} - -type Wrapper { - customer: ID! @nodeId(typeName: "CustomerNode") - errors: [ValidationError] -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/returningWrappedTableObject/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/returningWrappedTableObject/schema.graphqls deleted file mode 100644 index d6a36242c3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/returningWrappedTableObject/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Mutation { - mutation(in: CustomerNodeInputTable!): Wrapper @mutation(typeName: DELETE) -} - -type Wrapper { - customer: CustomerNode - errors: [ValidationError] -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/withNestedReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/withNestedReference/schema.graphqls deleted file mode 100644 index 7a2e53a78a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/withNestedReference/schema.graphqls +++ /dev/null @@ -1,16 +0,0 @@ -type Mutation { - mutation(in: CustomerNodeInputTable!): Customer @mutation(typeName: DELETE) -} - -type Customer implements Node @node @table { - id: ID! - address: AddressWrapper -} - -type AddressWrapper { - address: Address -} - -type Address @table { - id: ID! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/withNodeIdReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/withNodeIdReference/schema.graphqls deleted file mode 100644 index 4614a74d46..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/withNodeIdReference/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Mutation { - mutation(in: CustomerNodeInputTable!): Customer @mutation(typeName: DELETE) -} - -type Customer implements Node @node @table { - id: ID! - addressId: ID @nodeId(typeName: "Address") -} - -type Address implements Node @node @table { - id: ID! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/withReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/withReference/schema.graphqls deleted file mode 100644 index 99945ecbaa..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/withReference/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Mutation { - mutation(in: CustomerNodeInputTable!): Customer @mutation(typeName: DELETE) -} - -type Customer implements Node @node @table { - id: ID! - address: Address -} - -type Address @table { - id: ID! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/withWrappedNodeIdReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/withWrappedNodeIdReference/schema.graphqls deleted file mode 100644 index 55ba047994..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/withWrappedNodeIdReference/schema.graphqls +++ /dev/null @@ -1,16 +0,0 @@ -type Mutation { - mutation(in: CustomerNodeInputTable): Customer @mutation(typeName: DELETE) -} - -type Customer implements Node @node @table { - id: ID! - address: AddressWrapper -} - -type AddressWrapper { - addressId: ID @nodeId(typeName: "Address") -} - -type Address implements Node @node @table { - id: ID! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/withoutJooqRecordInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/withoutJooqRecordInput/schema.graphqls deleted file mode 100644 index fd7698ff8c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/delete/withoutJooqRecordInput/schema.graphqls +++ /dev/null @@ -1,4 +0,0 @@ -type Mutation { - mutation(id: ID! @nodeId(typeName: "CustomerNode")): ID! @mutation(typeName: DELETE) @nodeId(typeName: "CustomerNode") -} - diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insert/disabledNodeIdStrategyAndIdFieldInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insert/disabledNodeIdStrategyAndIdFieldInput/schema.graphqls deleted file mode 100644 index f9cad7a495..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insert/disabledNodeIdStrategyAndIdFieldInput/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerInputTable!): Customer @mutation(typeName: INSERT) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insert/disabledNodeIdStrategyAndNoIdFieldInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insert/disabledNodeIdStrategyAndNoIdFieldInput/schema.graphqls deleted file mode 100644 index 77999a30c0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insert/disabledNodeIdStrategyAndNoIdFieldInput/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: CustomerInput!): Customer @mutation(typeName: INSERT) -} - -input CustomerInput @table(name: "CUSTOMER") { - customerId: Int @field(name: "CUSTOMER_ID") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insert/multipleInputRecords/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insert/multipleInputRecords/schema.graphqls deleted file mode 100644 index 2185a10ffd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insert/multipleInputRecords/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - query(in0: CustomerNodeInputTable, in1: CustomerNodeInputTable): CustomerNode @mutation(typeName: INSERT) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insert/multipleMutationsWithIdInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insert/multipleMutationsWithIdInput/schema.graphqls deleted file mode 100644 index 6112654282..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insert/multipleMutationsWithIdInput/schema.graphqls +++ /dev/null @@ -1,4 +0,0 @@ -type Mutation { - mutation1(in: CustomerInputTable!): Customer @mutation(typeName: INSERT) - mutation2(in: CustomerInputTable!): Customer @mutation(typeName: INSERT) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insert/nonNullableInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insert/nonNullableInput/schema.graphqls deleted file mode 100644 index 59aa3fd6bd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insert/nonNullableInput/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerNodeInputTable!): ID @mutation(typeName: INSERT) @nodeId(typeName: "CustomerNode") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insert/nonNullableInputList/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insert/nonNullableInputList/schema.graphqls deleted file mode 100644 index 01fb7acb3a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insert/nonNullableInputList/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: [CustomerNodeInputTable!]!): [ID] @mutation(typeName: INSERT) @nodeId(typeName: "CustomerNode") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insert/nonNullableListWithNullableItems/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insert/nonNullableListWithNullableItems/schema.graphqls deleted file mode 100644 index f618839e4d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insert/nonNullableListWithNullableItems/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: [CustomerNodeInputTable]!): [ID] @mutation(typeName: INSERT) @nodeId(typeName: "CustomerNode") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insert/nullableInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insert/nullableInput/schema.graphqls deleted file mode 100644 index a7472ec108..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insert/nullableInput/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerNodeInputTable): ID @mutation(typeName: INSERT) @nodeId(typeName: "CustomerNode") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insert/nullableInputList/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insert/nullableInputList/schema.graphqls deleted file mode 100644 index 1666aff82b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insert/nullableInputList/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: [CustomerNodeInputTable!]): [ID] @mutation(typeName: INSERT) @nodeId(typeName: "CustomerNode") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insert/withReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insert/withReference/schema.graphqls deleted file mode 100644 index 75b0a6144f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insert/withReference/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Mutation { - mutation(in: CustomerNodeInputTable!): Customer @mutation(typeName: INSERT) -} - -type Customer implements Node @node @table { - id: ID! @nodeId - address: Address -} - -type Address implements Node @node @table { - id: ID! @nodeId -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insertWithoutRecords/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insertWithoutRecords/schema.graphqls deleted file mode 100644 index 3574351dcd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/insertWithoutRecords/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation: ID! @mutation(typeName: INSERT) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/iterableNestedInputField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/iterableNestedInputField/schema.graphqls deleted file mode 100644 index 25bdf9a830..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/iterableNestedInputField/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Mutation { - mutation(in: Customer): ID! @service(service: {name: "DUMMY_SERVICE"}) -} - -input Customer @table { - wrapper: [Wrapper] -} - -input Wrapper { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/missingInsertField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/missingInsertField/schema.graphqls deleted file mode 100644 index 76e21ee21a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/missingInsertField/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Mutation { - mutation(in: Customer): ID! @mutation(typeName: INSERT) -} - -input Customer @table { - customer_id: String! - activebool: Boolean! - last_name: String! - store_id: String! - address_id: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/missingInsertFieldWithDefault/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/missingInsertFieldWithDefault/schema.graphqls deleted file mode 100644 index e103807d8e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/missingInsertFieldWithDefault/schema.graphqls +++ /dev/null @@ -1,10 +0,0 @@ -type Mutation { - mutation(in: Film): ID! @mutation(typeName: INSERT) -} - -input Film @table { - film_id: ID! - title: String! - language_id: Int! - fulltext: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/missingInsertRequiredField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/missingInsertRequiredField/schema.graphqls deleted file mode 100644 index 8bcc62ee39..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/missingInsertRequiredField/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Mutation { - mutation(in: Customer): ID! @mutation(typeName: INSERT) -} - -input Customer @table { - customer_id: String! - activebool: Boolean! - first_name: String # Required in DB - last_name: String! - store_id: String! - address_id: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/multipleInputRecords/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/multipleInputRecords/schema.graphqls deleted file mode 100644 index 958e294c27..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/multipleInputRecords/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in0: CustomerInputTable, in1: AddressInput): ID -} - -input AddressInput @table(name: "ADDRESS") { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/noHandlingSet/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/noHandlingSet/schema.graphqls deleted file mode 100644 index 093458149b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/noHandlingSet/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/noRecordInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/noRecordInput/schema.graphqls deleted file mode 100644 index 41815a6c5d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/noRecordInput/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: ID): ID @mutation(typeName: UPDATE) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/onlyInputIterable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/onlyInputIterable/schema.graphqls deleted file mode 100644 index 678d1e1ccd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/onlyInputIterable/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: [CustomerInputTable]): Response @mutation(typeName: UPDATE) -} - -type Response { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/onlyInputIterableWithErrors/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/onlyInputIterableWithErrors/schema.graphqls deleted file mode 100644 index 2113ed60e5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/onlyInputIterableWithErrors/schema.graphqls +++ /dev/null @@ -1,13 +0,0 @@ -type Mutation { - mutation(in: [CustomerInputTable]): Response @mutation(typeName: UPDATE) -} - -type Response { - id: ID - errors: [SomeError] -} - -type SomeError implements Error { - path: [String] - message: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/onlyOutputFieldIterable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/onlyOutputFieldIterable/schema.graphqls deleted file mode 100644 index 10e6b30eaf..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/onlyOutputFieldIterable/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: CustomerInputTable): Response @mutation(typeName: UPDATE) -} - -type Response { - id: [ID] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/onlyOutputFieldIterableWithExtraField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/onlyOutputFieldIterableWithExtraField/schema.graphqls deleted file mode 100644 index 15129f9fde..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/onlyOutputFieldIterableWithExtraField/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Mutation { - mutation(in: CustomerInputTable): Response @mutation(typeName: UPDATE) -} - -type Response { - id0: [ID] - id1: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/onlyOutputIterable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/onlyOutputIterable/schema.graphqls deleted file mode 100644 index 2e024846f2..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/onlyOutputIterable/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: CustomerInputTable): [Response] @mutation(typeName: UPDATE) -} - -type Response { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/upsert/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/upsert/schema.graphqls deleted file mode 100644 index 7ebde6a07d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/upsert/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - upsertCustomer(in: CustomerInputTable): ID @mutation(typeName: UPSERT) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/wrappedInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/wrappedInput/schema.graphqls deleted file mode 100644 index d04fd443ad..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/mutation/wrappedInput/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: Input): ID @mutation(typeName: UPDATE) -} - -input Input { - in: CustomerInputTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeDirective/columnDoesNotExist/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeDirective/columnDoesNotExist/schema.graphqls deleted file mode 100644 index 0f237d7f07..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeDirective/columnDoesNotExist/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Language implements Node @table @node(keyColumns: ["WRONG"]){ - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeDirective/duplicateTypeId/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeDirective/duplicateTypeId/schema.graphqls deleted file mode 100644 index 118966b5f8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeDirective/duplicateTypeId/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Film implements Node @node @table { - id: ID! -} - -type Customer implements Node @node(typeId: "Film") @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeDirective/keyColumnsMatchingPrimaryKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeDirective/keyColumnsMatchingPrimaryKey/schema.graphqls deleted file mode 100644 index 1c68bc6204..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeDirective/keyColumnsMatchingPrimaryKey/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Language implements Node @table @node(keyColumns: ["LANGUAGE_ID"]){ - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeDirective/keyColumnsMatchingUniqueKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeDirective/keyColumnsMatchingUniqueKey/schema.graphqls deleted file mode 100644 index 4968e720fa..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeDirective/keyColumnsMatchingUniqueKey/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Actor implements Node @table @node(keyColumns: ["LAST_NAME", "ACTOR_ID"]){ - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeDirective/keyColumnsNotMatchingKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeDirective/keyColumnsNotMatchingKey/schema.graphqls deleted file mode 100644 index 09a72ef38a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeDirective/keyColumnsNotMatchingKey/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Language implements Node @table @node(keyColumns: ["LANGUAGE_ID", "NAME"]){ - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeDirective/missingTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeDirective/missingTable/schema.graphqls deleted file mode 100644 index 5600b9590c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeDirective/missingTable/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Query { - node(id: ID!): Node # Node interface - - query: Customer @notGenerated -} - -type Customer implements Node @node { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeDirective/multipleTypesWithSameTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeDirective/multipleTypesWithSameTable/schema.graphqls deleted file mode 100644 index 6c5326a7c2..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeDirective/multipleTypesWithSameTable/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type FilmA implements Node @node @table(name: "FILM") { - id: ID! -} - -type FilmB implements Node @node @table(name: "FILM") { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeDirective/notImplementingNode/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeDirective/notImplementingNode/schema.graphqls deleted file mode 100644 index ea6588b9b6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeDirective/notImplementingNode/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Customer @notGenerated -} - -type Customer @node @table { - name: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeDirective/typeIdRequired/missingTypeId/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeDirective/typeIdRequired/missingTypeId/schema.graphqls deleted file mode 100644 index 615beaa52d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeDirective/typeIdRequired/missingTypeId/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer implements Node @node @table { - id: ID! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeDirective/typeIdRequired/withTypeId/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeDirective/typeIdRequired/withTypeId/schema.graphqls deleted file mode 100644 index 39a2e38ada..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeDirective/typeIdRequired/withTypeId/schema.graphqls +++ /dev/null @@ -1,4 +0,0 @@ -type Customer implements Node @node(typeId: "Customer") @table { - id: ID! - name: String @field(name: "FIRST_NAME") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/ambiguousImplicitNodeType/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/ambiguousImplicitNodeType/schema.graphqls deleted file mode 100644 index 2504ddb2d7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/ambiguousImplicitNodeType/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Customer implements Node @node @table(name: "CUSTOMER") { - id: ID! @nodeId -} - -type AnotherCustomer implements Node @node @table(name: "CUSTOMER") { - id: ID! @nodeId -} - -input CustomerFilter @table(name: "CUSTOMER") { - id: ID! @nodeId -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/fkOverlapsPk/insertMutation/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/fkOverlapsPk/insertMutation/schema.graphqls deleted file mode 100644 index fe63865587..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/fkOverlapsPk/insertMutation/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Mutation { - mutation(in: FilmActorInput): ID @mutation(typeName: INSERT) @nodeId(typeName: "FilmActor") -} - -input FilmActorInput @table(name: "FILM_ACTOR") { - filmId: ID! @nodeId(typeName: "Film") -} - -type Film implements Node @node @table { - id: ID! @nodeId -} - -type FilmActor implements Node @node @table(name: "FILM_ACTOR") { - id: ID! @nodeId -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/fkOverlapsPk/nonMutation/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/fkOverlapsPk/nonMutation/schema.graphqls deleted file mode 100644 index 6977351d54..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/fkOverlapsPk/nonMutation/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -input FilmActorFilter @table(name: "FILM_ACTOR") { - filmId: ID! @nodeId(typeName: "Film") -} - -type Film implements Node @node @table { - id: ID! @nodeId -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/fkOverlapsPk/updateMutation/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/fkOverlapsPk/updateMutation/schema.graphqls deleted file mode 100644 index 69c4fa3ef2..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/fkOverlapsPk/updateMutation/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Mutation { - mutation(in: FilmActorInput): ID @mutation(typeName: UPDATE) -} - -input FilmActorInput @table(name: "FILM_ACTOR") { - filmId: ID! @nodeId(typeName: "Film") -} - -type Film implements Node @node @table { - id: ID! @nodeId -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/foreignKeyReferencesWrongKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/foreignKeyReferencesWrongKey/schema.graphqls deleted file mode 100644 index 3dafeaea86..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/foreignKeyReferencesWrongKey/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -input FilmActorFilter @table(name: "FILM_ACTOR") { - actorId: ID! @nodeId(typeName: "Actor") @reference(path: [{key: "FILM_ACTOR__FILM_ACTOR_ACTOR_ID_LAST_NAME_FKEY"}]) -} - -type Actor implements Node @node @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/implicitReferenceInJavaRecordInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/implicitReferenceInJavaRecordInput/schema.graphqls deleted file mode 100644 index 44ba879f4a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/implicitReferenceInJavaRecordInput/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - filmActors(in: [FilmActorInput]): ID @service(service: {className: "no.sikt.graphitron.codereferences.services.JavaRecordInputFetchService"}) -} - -input FilmActorInput @record(record: {className: "no.sikt.graphitron.codereferences.records.FilmActorInputJavaRecord"}) { - customerIds: [ID!]! @nodeId(typeName: "CustomerNode") @field(name: "rental") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/inJooqRecordInputWithAmbiguousReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/inJooqRecordInputWithAmbiguousReference/schema.graphqls deleted file mode 100644 index a14cc8795d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/inJooqRecordInputWithAmbiguousReference/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -input FilmFilter @table(name: "FILM") { - languageId: ID! @nodeId(typeName: "Language") @reference(path: [{table: "LANGUAGE"}]) -} - -type Language implements Node @node @table { - id: ID! @nodeId -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/inJooqRecordInputWithInverseForeignKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/inJooqRecordInputWithInverseForeignKey/schema.graphqls deleted file mode 100644 index 30ab7e02ab..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/inJooqRecordInputWithInverseForeignKey/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -input CustomerFilter @table(name: "CUSTOMER") { - paymentId: ID! @nodeId(typeName: "Payment") -} - -type Payment implements Node @node @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/inJooqRecordInputWithReferenceViaTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/inJooqRecordInputWithReferenceViaTable/schema.graphqls deleted file mode 100644 index 317b0a941f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/inJooqRecordInputWithReferenceViaTable/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -input CustomerFilter @table(name: "CUSTOMER") { - cityId: ID! @nodeId(typeName: "City") @reference(path: [{table: "ADDRESS"}]) -} - -type City implements Node @node @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/invalidReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/invalidReference/schema.graphqls deleted file mode 100644 index 317c513452..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/invalidReference/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(category: ID! @nodeId(typeName: "Category")): CustomerNode -} - -type Category implements Node @table @node { - id: ID! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/invalidSelfReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/invalidSelfReference/schema.graphqls deleted file mode 100644 index b225fbd498..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/invalidSelfReference/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(parentId: ID! @nodeId(typeName: "CustomerNode") @reference(path: [{table: "CUSTOMER"}])): CustomerNode -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/javaRecordReferenceWithIdScalar/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/javaRecordReferenceWithIdScalar/schema.graphqls deleted file mode 100644 index e60bbe9271..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/javaRecordReferenceWithIdScalar/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -input CustomerInput @record(record: {className: "no.sikt.graphitron.codereferences.records.CustomerJavaRecord"}) { - countryId: ID @nodeId(typeName: "Country") @field(name: "address") @reference(path: [{key: "ADDRESS__ADDRESS_CITY_ID_FKEY"}]) -} - -type Country implements Node @node @table { - id: ID! @nodeId -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/lookup/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/lookup/schema.graphqls deleted file mode 100644 index e9efce78dd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/lookup/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(customerId: [ID!]! @nodeId(typeName: "CustomerNode") @lookupKey): [CustomerNode] -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/lookupInputTypeWithImplicitNodeIdReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/lookupInputTypeWithImplicitNodeIdReference/schema.graphqls deleted file mode 100644 index b3a7315624..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/lookupInputTypeWithImplicitNodeIdReference/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(input: LookupInput @lookupKey): [Address] -} - -type Address @table { - cityId: Int @field(name: "CITY_ID") -} - -input LookupInput { - customerId: [ID!]! @nodeId(typeName: "CustomerNode") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/lookupOnImplicitNodeIdReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/lookupOnImplicitNodeIdReference/schema.graphqls deleted file mode 100644 index a1ffd2d5e4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/lookupOnImplicitNodeIdReference/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(customerId: [ID!]! @nodeId(typeName: "CustomerNode") @lookupKey): [Address] -} - -type Address @table { - cityId: Int @field(name: "CITY_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/nonIdOrStringField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/nonIdOrStringField/schema.graphqls deleted file mode 100644 index 6f6805fe94..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/nonIdOrStringField/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(id: Int @nodeId(typeName: "CustomerNode")): CustomerNode -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/onStringField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/onStringField/schema.graphqls deleted file mode 100644 index 4d3bda1184..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/onStringField/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(id: String @nodeId(typeName: "CustomerNode")): CustomerNode -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/oneToManyWithImplicitNodeIdStep/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/oneToManyWithImplicitNodeIdStep/schema.graphqls deleted file mode 100644 index 7423d659a3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/oneToManyWithImplicitNodeIdStep/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - addresses(storeId: ID @nodeId(typeName: "Store") @reference(path: [{table: "CUSTOMER"}])): [Address] -} - -type Address @table { - id: ID! -} - -type Store implements Node @table @node { - id: ID! @nodeId -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/typeDoesNotExist/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/typeDoesNotExist/schema.graphqls deleted file mode 100644 index 258fa2b0e9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/typeDoesNotExist/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(addressId: ID @nodeId(typeName: "Address")): CustomerNode -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/typeDoesNotExistInJooqRecordInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/typeDoesNotExistInJooqRecordInput/schema.graphqls deleted file mode 100644 index f9f1d294ac..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/typeDoesNotExistInJooqRecordInput/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - query(input: CustomerInput): CustomerNode -} - - -input CustomerInput @table(name: "CUSTOMER") { - someId: ID @nodeId(typeName: "DoesNotExist") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/typeDoesNotHaveNodeDirective/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/typeDoesNotHaveNodeDirective/schema.graphqls deleted file mode 100644 index b920acefa9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/typeDoesNotHaveNodeDirective/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(addressId: ID @nodeId(typeName: "Address")): CustomerNode -} - -type Address @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/withExternalField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/withExternalField/schema.graphqls deleted file mode 100644 index ec0cde6200..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/withExternalField/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(id: ID! @nodeId(typeName: "CustomerNode") @externalField): CustomerNode -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/withField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/withField/schema.graphqls deleted file mode 100644 index 770f77e920..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/input/withField/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(id: ID! @nodeId(typeName: "CustomerNode") @field(name: "CUSTOMER_ID")): CustomerNode -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/ambiguousNodeTypeForNodeId/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/ambiguousNodeTypeForNodeId/schema.graphqls deleted file mode 100644 index b4b4920eb0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/ambiguousNodeTypeForNodeId/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer @table(name: "CUSTOMER") { - id: ID! @nodeId -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/ambiguousNodeTypeForReferenceNodeId/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/ambiguousNodeTypeForReferenceNodeId/schema.graphqls deleted file mode 100644 index a473104ec3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/ambiguousNodeTypeForReferenceNodeId/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Customer @table(name: "CUSTOMER") { - addressId: ID! @nodeId @reference(path: [{table: "ADDRESS"}]) -} - - -type A implements Node @node @table(name: "ADDRESS") { - id: ID! @nodeId -} - -type B implements Node @node @table(name: "ADDRESS") { - id: ID! @nodeId -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/invalidReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/invalidReference/schema.graphqls deleted file mode 100644 index 213bae3d17..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/invalidReference/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Category implements Node @table @node { - id: ID! - customerId: ID! @nodeId(typeName: "CustomerNode") @reference(path: [{table: "CUSTOMER"}]) -} - diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/invalidSelfReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/invalidSelfReference/schema.graphqls deleted file mode 100644 index 6fbf0cb5fe..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/invalidSelfReference/schema.graphqls +++ /dev/null @@ -1,4 +0,0 @@ -type Customer implements Node @table @node { - id: ID! - parent: ID @nodeId(typeName: "Customer") @reference(path: [{table: "CUSTOMER"}]) -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/noWrapping/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/noWrapping/schema.graphqls deleted file mode 100644 index e0980bc1a6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/noWrapping/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(in: CustomerNodeInputTable): ID @nodeId(typeName: "CustomerNode") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/nonIdOrStringField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/nonIdOrStringField/schema.graphqls deleted file mode 100644 index b8caa8bc1e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/nonIdOrStringField/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer implements Node @node @table { - id: Int @nodeId(typeName: "Customer") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/onStringField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/onStringField/schema.graphqls deleted file mode 100644 index 4d3bda1184..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/onStringField/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(id: String @nodeId(typeName: "CustomerNode")): CustomerNode -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/typeDoesNotExist/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/typeDoesNotExist/schema.graphqls deleted file mode 100644 index 7ca84b915c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/typeDoesNotExist/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer implements Node @node @table { - addressId: ID @nodeId(typeName: "Address") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/typeDoesNotHaveNodeDirective/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/typeDoesNotHaveNodeDirective/schema.graphqls deleted file mode 100644 index 8fee4228e5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/typeDoesNotHaveNodeDirective/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer implements Node @node @table { - addressId: ID @nodeId(typeName: "Address") -} - -type Address @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/typeNameOmittedOnMutationReturningNodeId/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/typeNameOmittedOnMutationReturningNodeId/schema.graphqls deleted file mode 100644 index 68c11c2b22..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/typeNameOmittedOnMutationReturningNodeId/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerNodeInputTable!): ID @mutation(typeName: DELETE) @nodeId -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/unknownIdField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/unknownIdField/schema.graphqls deleted file mode 100644 index 93111243bf..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/unknownIdField/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(input: CustomerNodeInputTable): ID @mutation(typeName: DELETE) -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/withExternalField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/withExternalField/schema.graphqls deleted file mode 100644 index 82646fb0b7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/withExternalField/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer implements Node @node @table { - id: ID! @nodeId(typeName: "Customer") @externalField -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/withField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/withField/schema.graphqls deleted file mode 100644 index ce0dcd7b6c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/nodeId/output/withField/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer implements Node @node @table { - id: ID! @nodeId(typeName: "Customer") @field(name: "CUSTOMER_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/orderByInput/enumValueMissingOrderDirective/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/orderByInput/enumValueMissingOrderDirective/schema.graphqls deleted file mode 100644 index 4d17c3403a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/orderByInput/enumValueMissingOrderDirective/schema.graphqls +++ /dev/null @@ -1,18 +0,0 @@ -type Query { - query(orderBy: TestOrder @orderBy): [CustomerTable] -} - -input TestOrder { - field: TestOrderByField! - direction: OrderDirection! -} - -enum OrderDirection { - ASC - DESC -} - -enum TestOrderByField { - NAME @order(index: "IDX_LAST_NAME") - EMAIL -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/orderByInput/missingDirectionEnum/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/orderByInput/missingDirectionEnum/schema.graphqls deleted file mode 100644 index fa334ea7e5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/orderByInput/missingDirectionEnum/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(orderBy: BadInput @orderBy): [CustomerTable] -} - -input BadInput { - orderByField: OrderByField! -} - -enum OrderByField { - NAME @order(index: "IDX_LAST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/orderByInput/missingOrderByEnum/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/orderByInput/missingOrderByEnum/schema.graphqls deleted file mode 100644 index d6665e3773..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/orderByInput/missingOrderByEnum/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(orderBy: BadInput @orderBy): [CustomerTable] -} - -input BadInput { - direction: OrderDirection! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/orderByInput/missingOrderDirective/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/orderByInput/missingOrderDirective/schema.graphqls deleted file mode 100644 index ced6ac724b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/orderByInput/missingOrderDirective/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(orderBy: Order @orderBy): [CustomerTable] -} - -enum OrderByField { - NAME -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/paginationOrdering/withDefaultOrder/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/paginationOrdering/withDefaultOrder/schema.graphqls deleted file mode 100644 index 9ed7b4f098..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/paginationOrdering/withDefaultOrder/schema.graphqls +++ /dev/null @@ -1,22 +0,0 @@ -type Query { - # FILM_LIST is a view without primary key - # With @defaultOrder, this should pass validation - # Note: idx_title exists on FILM table, not FILM_LIST view - but validation only checks directive presence - filmLists(first: Int, after: String): FilmListConnection @defaultOrder(index: "idx_title") -} - -type FilmListConnection { - edges: [FilmListEdge] - pageInfo: PageInfo -} - -type FilmListEdge { - cursor: String - node: FilmList -} - -type FilmList @table(name: "FILM_LIST") { - title: String - description: String - category: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/paginationOrdering/withNullableOrderByNoDefault/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/paginationOrdering/withNullableOrderByNoDefault/schema.graphqls deleted file mode 100644 index 75f1807e00..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/paginationOrdering/withNullableOrderByNoDefault/schema.graphqls +++ /dev/null @@ -1,36 +0,0 @@ -type Query { - # FILM_LIST is a view without primary key - # With nullable @orderBy but no @defaultOrder, this should fail validation - # because when user doesn't provide orderBy, there's no fallback ordering - filmLists(first: Int, after: String, orderBy: FilmListOrderByInput @orderBy): FilmListConnection -} - -type FilmListConnection { - edges: [FilmListEdge] - pageInfo: PageInfo -} - -type FilmListEdge { - cursor: String - node: FilmList -} - -type FilmList @table(name: "FILM_LIST") { - title: String - description: String - category: String -} - -input FilmListOrderByInput { - orderByField: FilmListOrderByField! - direction: OrderDirection! -} - -enum FilmListOrderByField { - TITLE @order(index: "idx_title") -} - -enum OrderDirection { - ASC - DESC -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/paginationOrdering/withOrderBy/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/paginationOrdering/withOrderBy/schema.graphqls deleted file mode 100644 index 565c29bf29..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/paginationOrdering/withOrderBy/schema.graphqls +++ /dev/null @@ -1,36 +0,0 @@ -type Query { - # FILM_LIST is a view without primary key - # With non-nullable @orderBy (orderBy!), this should pass validation because user must always provide ordering - filmLists(first: Int, after: String, orderBy: FilmListOrderByInput! @orderBy): FilmListConnection -} - -type FilmListConnection { - edges: [FilmListEdge] - pageInfo: PageInfo -} - -type FilmListEdge { - cursor: String - node: FilmList -} - -type FilmList @table(name: "FILM_LIST") { - title: String - description: String - category: String -} - -input FilmListOrderByInput { - orderByField: FilmListOrderByField! - direction: OrderDirection! -} - -enum FilmListOrderByField { - # Note: idx_title exists on FILM table, not FILM_LIST view - but validation only checks directive presence - TITLE @order(index: "idx_title") -} - -enum OrderDirection { - ASC - DESC -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/paginationOrdering/withoutOrdering/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/paginationOrdering/withoutOrdering/schema.graphqls deleted file mode 100644 index 02cc206d6e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/paginationOrdering/withoutOrdering/schema.graphqls +++ /dev/null @@ -1,21 +0,0 @@ -type Query { - # FILM_LIST is a view without primary key - # This should fail validation because it's paginated without @defaultOrder or @orderBy - filmLists(first: Int, after: String): FilmListConnection -} - -type FilmListConnection { - edges: [FilmListEdge] - pageInfo: PageInfo -} - -type FilmListEdge { - cursor: String - node: FilmList -} - -type FilmList @table(name: "FILM_LIST") { - title: String - description: String - category: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallAmbiguousRoutine/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallAmbiguousRoutine/schema.graphqls deleted file mode 100644 index 6c2b156bd8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallAmbiguousRoutine/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer @table { - lastDay: String @experimental_procedureCall(procedure: "last_day", arguments: "_1: LAST_UPDATE") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallMissingParam/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallMissingParam/schema.graphqls deleted file mode 100644 index 9ba1d324a9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallMissingParam/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer @table { - balance: Float @experimental_procedureCall(procedure: "get_customer_balance", arguments: "p_customer_id: CUSTOMER_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallNonexistentColumn/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallNonexistentColumn/schema.graphqls deleted file mode 100644 index faec3fe56d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallNonexistentColumn/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer @table { - heldBy: ID @experimental_procedureCall(procedure: "inventory_held_by_customer", arguments: "p_inventory_id: NONEXISTENT_COLUMN") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallNotAFunction/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallNotAFunction/schema.graphqls deleted file mode 100644 index 19aaaf8d27..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallNotAFunction/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Film @table { - reset: ID @experimental_procedureCall(procedure: "reset_film_rental_duration", arguments: "p_film_id: FILM_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallOnInterfaceDeclaration/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallOnInterfaceDeclaration/schema.graphqls deleted file mode 100644 index f07e75ba4d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallOnInterfaceDeclaration/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -interface SomeInterface { - heldBy: ID @experimental_procedureCall(procedure: "inventory_held_by_customer", arguments: "p_inventory_id: CUSTOMER_ID") -} - -type Customer implements SomeInterface @table { - heldBy: ID @experimental_procedureCall(procedure: "inventory_held_by_customer", arguments: "p_inventory_id: CUSTOMER_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallOnInterfaceTypedField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallOnInterfaceTypedField/schema.graphqls deleted file mode 100644 index bd553db430..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallOnInterfaceTypedField/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -interface SomeInterface { - id: ID -} - -type Other implements SomeInterface @table(name: "ACTOR") { - id: ID @field(name: "ACTOR_ID") -} - -type Customer @table { - held: SomeInterface @experimental_procedureCall(procedure: "inventory_held_by_customer", arguments: "p_inventory_id: CUSTOMER_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallOnMutationRoot/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallOnMutationRoot/schema.graphqls deleted file mode 100644 index 1a3fee0f08..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallOnMutationRoot/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - heldBy: ID @experimental_procedureCall(procedure: "inventory_held_by_customer", arguments: "p_inventory_id: INVENTORY_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallOnObjectTypedField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallOnObjectTypedField/schema.graphqls deleted file mode 100644 index 4d6523b268..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallOnObjectTypedField/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Other @table(name: "ACTOR") { - id: ID @field(name: "ACTOR_ID") -} - -type Customer @table { - held: Other @experimental_procedureCall(procedure: "inventory_held_by_customer", arguments: "p_inventory_id: CUSTOMER_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallOnQueryRoot/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallOnQueryRoot/schema.graphqls deleted file mode 100644 index 662b01f419..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallOnQueryRoot/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - heldBy: ID @experimental_procedureCall(procedure: "inventory_held_by_customer", arguments: "p_inventory_id: INVENTORY_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallOnTypeWithoutTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallOnTypeWithoutTable/schema.graphqls deleted file mode 100644 index 8fad171670..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallOnTypeWithoutTable/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Container { - heldBy: ID @experimental_procedureCall(procedure: "inventory_held_by_customer", arguments: "p_inventory_id: INVENTORY_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallOnUnionTypedField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallOnUnionTypedField/schema.graphqls deleted file mode 100644 index 257447a85b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallOnUnionTypedField/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Actor @table { - id: ID @field(name: "ACTOR_ID") -} - -union SomeUnion = Actor - -type Customer @table { - held: SomeUnion @experimental_procedureCall(procedure: "inventory_held_by_customer", arguments: "p_inventory_id: CUSTOMER_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallReturnTypeMismatch/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallReturnTypeMismatch/schema.graphqls deleted file mode 100644 index 1119be4a45..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallReturnTypeMismatch/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer @table { - heldBy: String @experimental_procedureCall(procedure: "inventory_held_by_customer", arguments: "p_inventory_id: CUSTOMER_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallTargetHasFieldDirective/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallTargetHasFieldDirective/schema.graphqls deleted file mode 100644 index f02c144bc6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallTargetHasFieldDirective/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - someInventory(inventoryId: ID): Customer @experimental_procedureCall( - procedure: "inventory_held_by_customer", - arguments: "p_inventory_id: inventoryId", - target: "heldBy" - ) -} - -type Customer @table { - heldBy: ID @field(name: "CUSTOMER_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallTargetHasReferenceDirective/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallTargetHasReferenceDirective/schema.graphqls deleted file mode 100644 index d21ea26c83..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallTargetHasReferenceDirective/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - someInventory(inventoryId: ID): Customer @experimental_procedureCall( - procedure: "inventory_held_by_customer", - arguments: "p_inventory_id: inventoryId", - target: "heldBy" - ) -} - -type Customer @table { - heldBy: ID @reference(path: [{table: "ADDRESS"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallTargetMissingDataFetcher/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallTargetMissingDataFetcher/schema.graphqls deleted file mode 100644 index 853d64e0df..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallTargetMissingDataFetcher/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Store @table { - buddy: Customer @experimental_procedureCall( - procedure: "inventory_held_by_customer", - arguments: "p_inventory_id: STORE_ID", - target: "heldBy" - ) -} - -type Customer @table { - heldBy: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallTargetMissingTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallTargetMissingTable/schema.graphqls deleted file mode 100644 index c88bb8d112..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallTargetMissingTable/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - someInventory(inventoryId: ID): Untabled @experimental_procedureCall( - procedure: "inventory_held_by_customer", - arguments: "p_inventory_id: inventoryId", - target: "heldBy" - ) -} - -type Untabled { - heldBy: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallTargetNonObjectReturnType/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallTargetNonObjectReturnType/schema.graphqls deleted file mode 100644 index 5803683dfa..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallTargetNonObjectReturnType/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - someInventory(inventoryId: ID): ID @experimental_procedureCall( - procedure: "inventory_held_by_customer", - arguments: "p_inventory_id: inventoryId", - target: "heldBy" - ) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallTargetNotScalar/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallTargetNotScalar/schema.graphqls deleted file mode 100644 index 38c6890b02..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallTargetNotScalar/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - someInventory(inventoryId: ID): Customer @experimental_procedureCall( - procedure: "inventory_held_by_customer", - arguments: "p_inventory_id: inventoryId", - target: "nested" - ) -} - -type Other @table(name: "ADDRESS") { - id: ID -} - -type Customer @table { - nested: Other -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallTargetReturnTypeMismatch/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallTargetReturnTypeMismatch/schema.graphqls deleted file mode 100644 index ee0a208359..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallTargetReturnTypeMismatch/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - someInventory(inventoryId: ID): Customer @experimental_procedureCall( - procedure: "inventory_held_by_customer", - arguments: "p_inventory_id: inventoryId", - target: "heldBy" - ) -} - -type Customer @table { - heldBy: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallTargetUnknownArgument/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallTargetUnknownArgument/schema.graphqls deleted file mode 100644 index 0b057e4d2d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallTargetUnknownArgument/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - someInventory(inventoryId: ID): Customer @experimental_procedureCall( - procedure: "inventory_held_by_customer", - arguments: "p_inventory_id: fakeArg", - target: "heldBy" - ) -} - -type Customer @table { - heldBy: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallTargetUnknownField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallTargetUnknownField/schema.graphqls deleted file mode 100644 index 64422d37c5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallTargetUnknownField/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - someInventory(inventoryId: ID): Customer @experimental_procedureCall( - procedure: "inventory_held_by_customer", - arguments: "p_inventory_id: inventoryId", - target: "doesNotExist" - ) -} - -type Customer @table { - heldBy: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallUnknownParam/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallUnknownParam/schema.graphqls deleted file mode 100644 index 358ea4ceff..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallUnknownParam/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer @table { - heldBy: ID @experimental_procedureCall(procedure: "inventory_held_by_customer", arguments: "p_inventory_id: CUSTOMER_ID, fake: CUSTOMER_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallUnknownRoutine/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallUnknownRoutine/schema.graphqls deleted file mode 100644 index 554bdd6117..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallUnknownRoutine/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer @table { - heldBy: ID @experimental_procedureCall(procedure: "no_such_routine", arguments: "p_inventory_id: CUSTOMER_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallWithExternalFieldDirective/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallWithExternalFieldDirective/schema.graphqls deleted file mode 100644 index 82d43094b0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallWithExternalFieldDirective/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Customer @table { - heldBy: ID - @experimental_procedureCall(procedure: "inventory_held_by_customer", arguments: "p_inventory_id: CUSTOMER_ID") - @externalField -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallWithFieldDirective/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallWithFieldDirective/schema.graphqls deleted file mode 100644 index 81cf2e8e65..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallWithFieldDirective/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Customer @table { - heldBy: ID - @experimental_procedureCall(procedure: "inventory_held_by_customer", arguments: "p_inventory_id: CUSTOMER_ID") - @field(name: "CUSTOMER_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallWithReferenceDirective/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallWithReferenceDirective/schema.graphqls deleted file mode 100644 index ed5a0817f5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/procedureCall/procedureCallWithReferenceDirective/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Customer @table { - heldBy: ID - @experimental_procedureCall(procedure: "inventory_held_by_customer", arguments: "p_inventory_id: CUSTOMER_ID") - @reference(path: [{table: "ADDRESS"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/chainedReferences/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/chainedReferences/schema.graphqls deleted file mode 100644 index c2bf57e0a9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/chainedReferences/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - address : Address -} - -type Address @table { - id: ID! - payments: [Payment] @reference(path: [{key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY"}, {table: "PAYMENT"}]) -} - -type Payment @table { - id: Int @field(name: "PAYMENT_ID") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/constructTypeInvalidSelectionField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/constructTypeInvalidSelectionField/schema.graphqls deleted file mode 100644 index def216589b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/constructTypeInvalidSelectionField/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer @table { - field: Inner @experimental_constructType(selection: "nonExistent") -} - -type Inner { - f: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/constructTypeNonexistentColumn/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/constructTypeNonexistentColumn/schema.graphqls deleted file mode 100644 index a748822220..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/constructTypeNonexistentColumn/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer @table { - field: Inner @experimental_constructType(selection: "f: NONEXISTENT_COLUMN") -} - -type Inner { - f: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/constructTypeOnFieldWithoutResolvableTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/constructTypeOnFieldWithoutResolvableTable/schema.graphqls deleted file mode 100644 index 7e867831ab..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/constructTypeOnFieldWithoutResolvableTable/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer { - field: Inner @experimental_constructType(selection: "f") -} - -type Inner { - f: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/constructTypeTargetHasTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/constructTypeTargetHasTable/schema.graphqls deleted file mode 100644 index e36e31b079..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/constructTypeTargetHasTable/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Customer @table { - field: Address @experimental_constructType(selection: "f") -} - -type Address @table { - f: String -} - diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/constructTypeWithExternalFieldDirective/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/constructTypeWithExternalFieldDirective/schema.graphqls deleted file mode 100644 index e8bb78bd28..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/constructTypeWithExternalFieldDirective/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer @table { - field: Inner @experimental_constructType(selection: "f") @externalField -} - -type Inner { - f: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/constructTypeWithFieldDirective/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/constructTypeWithFieldDirective/schema.graphqls deleted file mode 100644 index c589446f65..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/constructTypeWithFieldDirective/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer @table { - field: Inner @experimental_constructType(selection: "f") @field(name: "SomeField") -} - -type Inner { - f: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/constructTypeWithNestedObject/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/constructTypeWithNestedObject/schema.graphqls deleted file mode 100644 index 362e995d58..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/constructTypeWithNestedObject/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Customer @table { - field: Inner @experimental_constructType(selection: "nested") -} - -type Inner { - nested: Nested -} - -type Nested { - f: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/errorUnionWithOneSubtype/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/errorUnionWithOneSubtype/schema.graphqls deleted file mode 100644 index 39ed3c9b01..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/errorUnionWithOneSubtype/schema.graphqls +++ /dev/null @@ -1,14 +0,0 @@ -type Mutation { - mutation: Response @mutation(typeName: UPDATE) @notGenerated -} - -type Response { - errors: [ErrorUnion] -} - -union ErrorUnion = Error1 - -type Error1 implements Error { - path: [String!]! - message: String! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/externalFieldAndFieldDirectives/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/externalFieldAndFieldDirectives/schema.graphqls deleted file mode 100644 index abb0de1f62..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/externalFieldAndFieldDirectives/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - name: String @field(name: "name") @externalField -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/externalFieldDuplicatedMethod/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/externalFieldDuplicatedMethod/schema.graphqls deleted file mode 100644 index 1a14e4a6dd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/externalFieldDuplicatedMethod/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - duplicated: String @externalField -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/externalFieldMethodWrongGenericType/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/externalFieldMethodWrongGenericType/schema.graphqls deleted file mode 100644 index 02235df278..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/externalFieldMethodWrongGenericType/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - wrongReturnType: String @externalField -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/externalFieldMethodWrongGenericTypeParameter/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/externalFieldMethodWrongGenericTypeParameter/schema.graphqls deleted file mode 100644 index 6b14763a19..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/externalFieldMethodWrongGenericTypeParameter/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - wrongGenericReturnType: String @externalField -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/externalFieldMissingMethod/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/externalFieldMissingMethod/schema.graphqls deleted file mode 100644 index 26cb618388..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/externalFieldMissingMethod/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - somethingNotDefined: String @externalField -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/externalFieldNoTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/externalFieldNoTable/schema.graphqls deleted file mode 100644 index 491d54b413..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/externalFieldNoTable/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Customer -} - -type Customer { - name: String @externalField -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/externalFieldWrappedType/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/externalFieldWrappedType/schema.graphqls deleted file mode 100644 index c68d4ffff3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/externalFieldWrappedType/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - something: Something -} - -type Something { - name: String @externalField -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/incompletePaginationFields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/incompletePaginationFields/schema.graphqls deleted file mode 100644 index b8a9c006a8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/incompletePaginationFields/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(first: Int): CustomerConnection -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/interfaceWithOneType/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/interfaceWithOneType/schema.graphqls deleted file mode 100644 index 17e9e2ef7f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/interfaceWithOneType/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - someInterface: SomeInterface -} - -interface SomeInterface { - id: Int -} - -type Customer implements SomeInterface @table(name: "CUSTOMER"){ - id: Int @field(name:"CUSTOMER_ID") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/invalidSelfReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/invalidSelfReference/schema.graphqls deleted file mode 100644 index b538a4542f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/invalidSelfReference/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - city: City -} - -type City @table { - city: City @splitQuery -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/listedNestedListedField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/listedNestedListedField/schema.graphqls deleted file mode 100644 index 0a6b1fad16..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/listedNestedListedField/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in0: [Wrapper]!): CustomerTable -} - -input Wrapper { - in1: [ID]! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/listedOptionalInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/listedOptionalInput/schema.graphqls deleted file mode 100644 index fbb53661f3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/listedOptionalInput/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(in: [DummyInput]): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/listedWrapperType/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/listedWrapperType/schema.graphqls deleted file mode 100644 index 942a3e55fa..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/listedWrapperType/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - name: [CustomerName] -} - -type CustomerName { - firstName: String @field(name: "FIRST_NAME") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/listedWrapperTypeWithTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/listedWrapperTypeWithTable/schema.graphqls deleted file mode 100644 index 0b66257725..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/listedWrapperTypeWithTable/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - name: [CustomerName] -} - -type CustomerName @table(name: "CUSTOMER") { - firstName: String @field(name: "FIRST_NAME") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/lookupAndOrderBy/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/lookupAndOrderBy/schema.graphqls deleted file mode 100644 index a04fc9f25f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/lookupAndOrderBy/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(email: String @lookupKey, orderBy: Order @orderBy): [CustomerTable] -} - -enum OrderByField { - NAME @order(index: "IDX_LAST_NAME") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/lookupAndPagination/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/lookupAndPagination/schema.graphqls deleted file mode 100644 index 0c10653dfd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/lookupAndPagination/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - customers(first: Int = 100, after: String, customer_id: [ID] @lookupKey): CustomerConnection -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/lookupAndReferenceOnArgument/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/lookupAndReferenceOnArgument/schema.graphqls deleted file mode 100644 index 1806f1c483..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/lookupAndReferenceOnArgument/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(customerId: [Int!]! @field(name: "CUSTOMER_ID") @lookupKey @reference(path: [{table: "CUSTOMER"}])): [Address] -} - -type Address @table { - cityId: Int @field(name: "CITY_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/lookupInputType/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/lookupInputType/schema.graphqls deleted file mode 100644 index 555af2615a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/lookupInputType/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query(input: LookupInput @lookupKey): [Address] -} - -type Address @table { - cityId: Int @field(name: "CITY_ID") -} - -input LookupInput { - addressId: [Int!]! @field(name: "ADDRESS_ID") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/lookupInputTypeWithReferenceFields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/lookupInputTypeWithReferenceFields/schema.graphqls deleted file mode 100644 index bc5d9f2b11..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/lookupInputTypeWithReferenceFields/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - query(input: LookupInput @lookupKey): [Address] -} - -type Address @table { - cityId: Int @field(name: "CITY_ID") -} - -input LookupInput { - customerId: [Int!]! @field(name: "CUSTOMER_ID") @reference(path: [{table: "CUSTOMER"}]) - cityId: [Int!]! @field(name: "CITY_ID") @reference(path: [{table: "CITY"}]) -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/multipleForeignKeysNoRef/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/multipleForeignKeysNoRef/schema.graphqls deleted file mode 100644 index 4b2a73415f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/multipleForeignKeysNoRef/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - film: Film -} - -type Language @table{ - id : Int @field(name: "Language_ID") -} - -type Film @table { - film_id: Int - language: Language -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/multipleForeignKeysWithRef/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/multipleForeignKeysWithRef/schema.graphqls deleted file mode 100644 index af8e353da2..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/multipleForeignKeysWithRef/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - film: Film -} - -type Language @table{ - id : Int @field(name: "Language_ID") -} - -type Film @table { - film_id: Int - language: Language @reference(path: [{key: "FILM__FILM_LANGUAGE_ID_FKEY"}]) -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/nestedListedWrapperType/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/nestedListedWrapperType/schema.graphqls deleted file mode 100644 index f0fc17c878..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/nestedListedWrapperType/schema.graphqls +++ /dev/null @@ -1,15 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - nameWrapper: NameWrapper -} - -type NameWrapper { - name: [CustomerName] -} - -type CustomerName { - firstName: String @field(name: "FIRST_NAME") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/noForeignKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/noForeignKey/schema.graphqls deleted file mode 100644 index 6f232a0384..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/noForeignKey/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - film:Film -} - -type Film @table{ - payment: Payment @splitQuery @reference(path: [{table: "Payment"}]) -} - -type Payment @table{ - id: Int @field(name: "PAYMENT_ID") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/noPaginationFields/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/noPaginationFields/schema.graphqls deleted file mode 100644 index 4a146d9dda..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/noPaginationFields/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query: CustomerConnection -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/oneToManyMultiStepInputReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/oneToManyMultiStepInputReference/schema.graphqls deleted file mode 100644 index e05263c8f2..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/oneToManyMultiStepInputReference/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - cities(email: String @field(name: "EMAIL") @reference(path: [{table: "ADDRESS"}, {table: "CUSTOMER"}])): [City] -} - -type City @table { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/reverseJoin/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/reverseJoin/schema.graphqls deleted file mode 100644 index 31d1076250..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/reverseJoin/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Address @table { - customer: CustomerTable @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/reverseSelfReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/reverseSelfReference/schema.graphqls deleted file mode 100644 index 5e6625b8b9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/reverseSelfReference/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Film -} - -type Film @table { - sequels: [Film] @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/reverseSelfReferenceDifferentTypes/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/reverseSelfReferenceDifferentTypes/schema.graphqls deleted file mode 100644 index 5254d936a7..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/reverseSelfReferenceDifferentTypes/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Film -} - -type Film @table { - sequels: [Sequel] @splitQuery @reference(path: [{key: "FILM__SEQUEL_FKEY"}]) -} - -type Sequel @table(name: "FILM") { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/reverseSelfReferenceWithCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/reverseSelfReferenceWithCondition/schema.graphqls deleted file mode 100644 index f29d042b15..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/reverseSelfReferenceWithCondition/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Film -} - -type Film @table { - sequels: [Film] @splitQuery @reference(path: [{condition: {className: "no.sikt.graphitron.codereferences.dummyreferences.DummyCondition"}}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/reverseSelfReferenceWithKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/reverseSelfReferenceWithKey/schema.graphqls deleted file mode 100644 index a8df319f31..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/reverseSelfReferenceWithKey/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Film -} - -type Film @table { - sequels: [Film] @splitQuery @reference(path: [{key: "FILM__SEQUEL_FKEY"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/scalarFieldWithMultiplePossiblePaths/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/scalarFieldWithMultiplePossiblePaths/schema.graphqls deleted file mode 100644 index cdeaaf0dfc..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/scalarFieldWithMultiplePossiblePaths/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - film: Film -} - -type Film @table { - film_id: Int - languageId: Int @field(name: "Language_ID") @reference(path: [{table: "LANGUAGE"}]) -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/scalarFieldWithMultiplePossiblePathsWithKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/scalarFieldWithMultiplePossiblePathsWithKey/schema.graphqls deleted file mode 100644 index dc52ef10fc..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/scalarFieldWithMultiplePossiblePathsWithKey/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - film: Film -} - -type Film @table { - film_id: Int - languageId: Int @field(name: "Language_ID") @reference(path: [{key: "FILM__FILM_LANGUAGE_ID_FKEY"}]) -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/scalarFieldWithMultiplePossiblePathsWithKeyAndTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/scalarFieldWithMultiplePossiblePathsWithKeyAndTable/schema.graphqls deleted file mode 100644 index 4fc26200e1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/scalarFieldWithMultiplePossiblePathsWithKeyAndTable/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - film: Film -} - -type Film @table { - film_id: Int - languageId: Int @field(name: "Language_ID") @reference(path: [{key: "FILM__FILM_LANGUAGE_ID_FKEY", table: "LANGUAGE"}]) -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/selfReferenceWithSplitQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/selfReferenceWithSplitQuery/schema.graphqls deleted file mode 100644 index 9e73e8eb43..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/selfReferenceWithSplitQuery/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Film -} - -type Film @table { - sequel: Film @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/selfReferenceWithoutSplitQuery/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/selfReferenceWithoutSplitQuery/schema.graphqls deleted file mode 100644 index f192df882e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/selfReferenceWithoutSplitQuery/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Film -} - -type Film @table { - sequel: Sequel @reference(path: [{key: "FILM__SEQUEL_FKEY"}]) -} - -type Sequel @table(name: "FILM") { - id: ID -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/sharedSubtypeShouldNotBeValidatedAsReference/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/sharedSubtypeShouldNotBeValidatedAsReference/schema.graphqls deleted file mode 100644 index dbd2ccaa4b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/sharedSubtypeShouldNotBeValidatedAsReference/schema.graphqls +++ /dev/null @@ -1,16 +0,0 @@ -type Query { - actor: Actor - customer: Customer -} - -type Actor @table { - name: NameWrapper -} - -type Customer @table { - name: NameWrapper -} - -type NameWrapper { - firstName: String @field(name: "FIRST_NAME") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/tableWithSameNameAsSchema/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/tableWithSameNameAsSchema/schema.graphqls deleted file mode 100644 index ce056a1661..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/tableWithSameNameAsSchema/schema.graphqls +++ /dev/null @@ -1,13 +0,0 @@ -type Query { - query: Public -} - - -type Public @table(name: "PUBLIC") { # Java field name for table is "PUBLIC_" - dummyColumn: String @field(name: "DUMMY_COLUMN") - vacation: Vacation -} - -type Vacation @table { - vacationId: Int @field(name: "VACATION_ID") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/unionWithOneType/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/unionWithOneType/schema.graphqls deleted file mode 100644 index 01acb47f0c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/query/unionWithOneType/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Query { - someUnion: SomeUnion -} - -union SomeUnion = Customer - -type Customer @table(name: "CUSTOMER") { - customer_id: Int -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/reading/logReadSchemaFiles/notASchema.txt b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/reading/logReadSchemaFiles/notASchema.txt deleted file mode 100644 index 1baa608b80..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/reading/logReadSchemaFiles/notASchema.txt +++ /dev/null @@ -1 +0,0 @@ -should not be read \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/reading/logReadSchemaFiles/schema1.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/reading/logReadSchemaFiles/schema1.graphqls deleted file mode 100644 index 3077e452a0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/reading/logReadSchemaFiles/schema1.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/reading/logReadSchemaFiles/subdir/schema2.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/reading/logReadSchemaFiles/subdir/schema2.graphqls deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/reading/logReadSchemaFiles/subdir/subsubdir/schema3.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/reading/logReadSchemaFiles/subdir/subsubdir/schema3.graphqls deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/service/java/default/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/service/java/default/schema.graphqls deleted file mode 100644 index 03d9ac1c0b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/service/java/default/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - queryJavaRecord: DummyTypeRecord @service(service: {className: "ResolverFetchService", method: "queryJavaRecord"}) -} - -type DummyTypeRecord @record(record: {className: "CustomerJavaRecord"}){ - customer: CustomerTable @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/service/java/listed/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/service/java/listed/schema.graphqls deleted file mode 100644 index f98c40fd74..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/service/java/listed/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - queryJavaRecord: DummyTypeRecord @service(service: {className: "ResolverFetchService", method: "queryJavaRecord"}) -} - -type DummyTypeRecord @record(record: {className: "CustomerJavaRecord"}){ - customer: [CustomerTable] @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/service/java/notType/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/service/java/notType/schema.graphqls deleted file mode 100644 index 7e04c6233b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/service/java/notType/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -type Query { - queryJavaRecord: DummyTypeRecord @service(service: {className: "ResolverFetchService", method: "queryJavaRecord"}) -} - -type DummyTypeRecord @record(record: {className: "CustomerJavaRecord"}){ - customer: CustomerUnion @splitQuery -} - -union CustomerUnion = CustomerTable \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/service/java/paginated/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/service/java/paginated/schema.graphqls deleted file mode 100644 index 948f4b4740..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/service/java/paginated/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - queryJavaRecord: DummyTypeRecord @service(service: {className: "ResolverFetchService", method: "queryJavaRecord"}) -} - -type DummyTypeRecord @record(record: {className: "CustomerJavaRecord"}){ - customer(first: Int = 100, after: String): CustomerConnection @splitQuery -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/service/java/typeWithoutTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/service/java/typeWithoutTable/schema.graphqls deleted file mode 100644 index e2f615ba15..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/service/java/typeWithoutTable/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - queryJavaRecord: DummyTypeRecord @service(service: {className: "ResolverFetchService", method: "queryJavaRecord"}) -} - -type DummyTypeRecord @record(record: {className: "CustomerJavaRecord"}){ - wrapper: Wrapper @splitQuery -} - -type Wrapper { - id: ID -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/service/java/withTableParent/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/service/java/withTableParent/schema.graphqls deleted file mode 100644 index 5cf7191cc8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/service/java/withTableParent/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type ParentNode implements Node @node(typeId: "parent", keyColumns: ["customer_id"]) @table(name: "CUSTOMER") { - id: ID! @nodeId - customerJavaRecords: CustomerJavaRecord @service(service: {className: "ResolverFetchService", method: "queryJavaRecord"}) @splitQuery -} - -type CustomerJavaRecord @record(record: {className: "CustomerJavaRecord"}){ - customer: CustomerTable @splitQuery # No FK from CUSTOMER to CUSTOMER, but the Java record has a matching getter -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/thresholdEvaluator/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/thresholdEvaluator/schema.graphqls deleted file mode 100644 index 6afe53d55e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/thresholdEvaluator/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query: Customer -} - -type Customer @table { - email: String -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argument/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argument/schema.graphqls deleted file mode 100644 index eb7da9a6ff..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argument/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(wrong: String): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentReferenceFieldNotInTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentReferenceFieldNotInTable/schema.graphqls deleted file mode 100644 index 885ccb953d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentReferenceFieldNotInTable/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -# STORE_ID exists in CUSTOMER (the return type's table) but not in CATEGORY. -# The @reference directs the column lookup to CATEGORY, where it should fail. -type Query { - customers(storeId: Int @field(name: "STORE_ID") @reference(path: [{table: "CATEGORY"}])): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentReferenceKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentReferenceKey/schema.graphqls deleted file mode 100644 index 56ad4f96a3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentReferenceKey/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Dummy { - id(id: ID @reference(path: {key: "UNKNOWN_KEY"})): ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentReferenceKeyFieldNotInTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentReferenceKeyFieldNotInTable/schema.graphqls deleted file mode 100644 index 32ab4aa46a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentReferenceKeyFieldNotInTable/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -# CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY points from CUSTOMER to ADDRESS. -# STORE_ID exists in CUSTOMER but not in ADDRESS, so this should fail. -type Query { - customers(storeId: Int @field(name: "STORE_ID") @reference(path: [{key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY"}])): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentReferenceMultiPathFieldNotInTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentReferenceMultiPathFieldNotInTable/schema.graphqls deleted file mode 100644 index 5f16b482e3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentReferenceMultiPathFieldNotInTable/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -# Multi-step path: CUSTOMER -> ADDRESS (via key) -> CITY (via table). -# STORE_ID exists in CUSTOMER but not in CITY, so this should fail. -type Query { - customers(storeId: Int @field(name: "STORE_ID") @reference(path: [{key: "CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY"}, {table: "CITY"}])): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentReferenceTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentReferenceTable/schema.graphqls deleted file mode 100644 index b7cd10a38f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentReferenceTable/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Dummy { - id(id: ID @reference(path: {table: "UNKNOWN_TABLE"})): ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentReferenceWithOverrideCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentReferenceWithOverrideCondition/schema.graphqls deleted file mode 100644 index be79c1d7c1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentReferenceWithOverrideCondition/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -# Field has @reference and @condition(override: true). The condition overrides column-based -# filtering, so the field not existing in CATEGORY should not cause an error. -type Query { - customers(wrong: String @reference(path: [{table: "CATEGORY"}]) @condition(condition: {name: "DUMMY_CONDITION"}, override: true)): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentWithCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentWithCondition/schema.graphqls deleted file mode 100644 index 9b8f0dbc99..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentWithCondition/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(wrong: String @condition(condition: {name: "DUMMY_CONDITION"})): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentWithFieldCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentWithFieldCondition/schema.graphqls deleted file mode 100644 index 94153011f4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentWithFieldCondition/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(wrong: String): CustomerTable @condition(condition: {name: "DUMMY_CONDITION"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentWithFieldOverrideCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentWithFieldOverrideCondition/schema.graphqls deleted file mode 100644 index 45cbd2c7f6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentWithFieldOverrideCondition/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(wrong: String): CustomerTable @condition(condition: {name: "DUMMY_CONDITION"}, override: true) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentWithOverrideCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentWithOverrideCondition/schema.graphqls deleted file mode 100644 index 24255abadc..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentWithOverrideCondition/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(wrong: String @condition(condition: {name: "DUMMY_CONDITION"}, override: true)): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentWithTypeCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentWithTypeCondition/schema.graphqls deleted file mode 100644 index 17c09cb3e6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentWithTypeCondition/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: Input @condition(condition: {name: "DUMMY_CONDITION"})): CustomerTable -} - -input Input { - wrong: String -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentWithTypeOverrideCondition/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentWithTypeOverrideCondition/schema.graphqls deleted file mode 100644 index 80f9fe4b38..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/argumentWithTypeOverrideCondition/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: Input @condition(condition: {name: "DUMMY_CONDITION"}, override: true)): CustomerTable -} - -input Input { - wrong: String -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/enum/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/enum/schema.graphqls deleted file mode 100644 index 16bdff36f0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/enum/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -enum Enum @enum(enumReference: {name: "UNKNOWN_ENUM"}) { - E -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/externalField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/externalField/schema.graphqls deleted file mode 100644 index 8d9cf0635e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/externalField/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer @table { - name: String @externalField -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/field/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/field/schema.graphqls deleted file mode 100644 index c946fb1b56..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/field/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer @table { - wrong: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/fieldInMutationWithConflictingTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/fieldInMutationWithConflictingTable/schema.graphqls deleted file mode 100644 index 072289d4e6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/fieldInMutationWithConflictingTable/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Mutation { - mutation(in: CustomerNodeInputTable!): Address @mutation(typeName: DELETE) -} - -type Address implements Node @node @table { - wrong: Int! -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/fieldReferenceKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/fieldReferenceKey/schema.graphqls deleted file mode 100644 index 5452e31c8f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/fieldReferenceKey/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Dummy { - id: ID @reference(path: {key: "UNKNOWN_KEY"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/fieldReferenceTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/fieldReferenceTable/schema.graphqls deleted file mode 100644 index aa404949e4..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/fieldReferenceTable/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Dummy { - id: ID @reference(path: {table: "UNKNOWN_TABLE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/fieldWithImplicitTableFromInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/fieldWithImplicitTableFromInput/schema.graphqls deleted file mode 100644 index b0a8d6eef5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/fieldWithImplicitTableFromInput/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(in: CustomerNodeInputTable!): String @field(name: "WRONG") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/fieldWrapped/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/fieldWrapped/schema.graphqls deleted file mode 100644 index acbc559ed6..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/fieldWrapped/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer @table { - wrapper: Wrapper -} - -type Wrapper { - wrong: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/id/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/id/schema.graphqls deleted file mode 100644 index d25ec9b660..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/id/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer @table { - wrong: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/inputFieldReferenceFieldNotInTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/inputFieldReferenceFieldNotInTable/schema.graphqls deleted file mode 100644 index 1a916fc2c0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/inputFieldReferenceFieldNotInTable/schema.graphqls +++ /dev/null @@ -1,9 +0,0 @@ -# STORE_ID exists in CUSTOMER (the field's return type table) but not in CATEGORY. -# The @reference directs the column lookup to CATEGORY, where it should fail. -type Query { - query(in: Input!): CustomerTable -} - -input Input { - storeId: Int @field(name: "STORE_ID") @reference(path: [{table: "CATEGORY"}]) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/inputFieldReferenceKey/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/inputFieldReferenceKey/schema.graphqls deleted file mode 100644 index da889cccb2..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/inputFieldReferenceKey/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -input Dummy { - id: ID @reference(path: {key: "UNKNOWN_KEY"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/inputFieldReferenceTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/inputFieldReferenceTable/schema.graphqls deleted file mode 100644 index abc5a7c9f8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/inputFieldReferenceTable/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -input Dummy { - id: ID @reference(path: {table: "UNKNOWN_TABLE"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/inputTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/inputTable/schema.graphqls deleted file mode 100644 index 73d0d6f5c5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/inputTable/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -input Dummy @table(name: "UNKNOWN_TABLE") { - id: ID! -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/inputType/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/inputType/schema.graphqls deleted file mode 100644 index 1d9b09fd0d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/inputType/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(in: INVALID): ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/javaRecordInputJooqRecordOutput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/javaRecordInputJooqRecordOutput/schema.graphqls deleted file mode 100644 index 5f1605ebeb..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/javaRecordInputJooqRecordOutput/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - customer(input: Input!): CustomerTable @service(service: {className: "no.sikt.graphitron.codereferences.services.JavaRecordInputFetchService"}) -} - -input Input @record(record: {className: "no.sikt.graphitron.codereferences.records.CustomerJavaRecord"}) { - someID: String -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/knownArgument/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/knownArgument/schema.graphqls deleted file mode 100644 index 19a776dac9..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/knownArgument/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(email: String): CustomerTable -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/knownField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/knownField/schema.graphqls deleted file mode 100644 index b7d8f6b111..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/knownField/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Customer @table { - email: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/notGeneratedArgument/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/notGeneratedArgument/schema.graphqls deleted file mode 100644 index 91f215f10a..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/notGeneratedArgument/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query(wrong: String): CustomerTable @notGenerated -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/service/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/service/schema.graphqls deleted file mode 100644 index 68a52de4b5..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/service/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation: ID @service(service: {name: "INVALID"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputCountMismatch/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputCountMismatch/schema.graphqls deleted file mode 100644 index 75ba272e24..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputCountMismatch/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - test(input: CustomerInput): String @service(service: {className: "no.sikt.graphitron.codereferences.services.TypeMismatchService", method: "checkNestedWrongCount"}) -} - -input CustomerInput @table(name: "CUSTOMER") { - customerId: Int @field(name: "CUSTOMER_ID") - address: AddressInput -} - -input AddressInput @table(name: "ADDRESS") { - addressId: Int @field(name: "ADDRESS_ID") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputCountWithAllFeatures/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputCountWithAllFeatures/schema.graphqls deleted file mode 100644 index 3e272a586e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputCountWithAllFeatures/schema.graphqls +++ /dev/null @@ -1,35 +0,0 @@ -type Query { - test(input: TestInput, orderBy: TestOrderByInput @orderBy, first: Int = 100, after: String): TestConnection @service(service: {className: "no.sikt.graphitron.codereferences.services.TypeMismatchService", method: "checkAllInputFeatures"}, contextArguments: ["ctx1", "ctx2"]) -} - -input TestInput @table(name: "CUSTOMER") { - customerId: Int @field(name: "CUSTOMER_ID") -} - -type TestConnection { - edges: [TestEdge] - pageInfo: PageInfo -} - -type TestEdge { - cursor: String - node: TestNode -} - -type TestNode @table(name: "CUSTOMER") { - customerId: Int @field(name: "CUSTOMER_ID") -} - -input TestOrderByInput { - orderByField: TestOrderByField! - direction: OrderDirection! -} - -enum TestOrderByField { - NAME @order(index: "idx_last_name") -} - -enum OrderDirection { - ASC - DESC -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputListedNonListParam/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputListedNonListParam/schema.graphqls deleted file mode 100644 index 573ff1775c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputListedNonListParam/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - test(input: [TestInput]): String @service(service: {className: "no.sikt.graphitron.codereferences.services.TypeMismatchService", method: "check"}) -} - -input TestInput @table(name: "CUSTOMER") { - customerId: ID @field(name: "CUSTOMER_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputListedTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputListedTable/schema.graphqls deleted file mode 100644 index d4dfffeef1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputListedTable/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - test(input: [TestInput]): String @service(service: {className: "no.sikt.graphitron.codereferences.services.TypeMismatchService", method: "checkList"}) -} - -input TestInput @table(name: "CUSTOMER") { - customerId: Int @field(name: "CUSTOMER_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputListedTableTypeMismatch/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputListedTableTypeMismatch/schema.graphqls deleted file mode 100644 index f18d61bae8..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputListedTableTypeMismatch/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - test(input: [TestInput]): String @service(service: {className: "no.sikt.graphitron.codereferences.services.TypeMismatchService", method: "checkIncorrect"}) -} - -input TestInput @table(name: "CUSTOMER") { - customerId: Int @field(name: "CUSTOMER_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputMissingDirective/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputMissingDirective/schema.graphqls deleted file mode 100644 index 5003828375..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputMissingDirective/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - test(input: TestInput): String @service(service: {className: "no.sikt.graphitron.codereferences.services.ResolverFetchService", method: "query"}) -} - -input TestInput { - value: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputNestedTableWithRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputNestedTableWithRecord/schema.graphqls deleted file mode 100644 index c630d71fbd..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputNestedTableWithRecord/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - test(input: CustomerInput): String @service(service: {className: "no.sikt.graphitron.codereferences.services.TypeMismatchService", method: "checkNested"}) -} - -input CustomerInput @table(name: "CUSTOMER") { - customerId: Int @field(name: "CUSTOMER_ID") - address: AddressInput -} - -input AddressInput @table(name: "ADDRESS") { - addressId: Int @field(name: "ADDRESS_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputNonListedListParam/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputNonListedListParam/schema.graphqls deleted file mode 100644 index 77cfd81f50..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputNonListedListParam/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - test(input: TestInput): String @service(service: {className: "no.sikt.graphitron.codereferences.services.TypeMismatchService", method: "checkList"}) -} - -input TestInput @table(name: "CUSTOMER") { - customerId: ID @field(name: "CUSTOMER_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputTableTypeMismatch/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputTableTypeMismatch/schema.graphqls deleted file mode 100644 index d1bf73b0f3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputTableTypeMismatch/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - test(input: TestInput): String @service(service: {className: "no.sikt.graphitron.codereferences.services.TypeMismatchService", method: "checkString"}) -} - -input TestInput @table(name: "CUSTOMER") { - customerId: Int @field(name: "CUSTOMER_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputTypeMismatch/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputTypeMismatch/schema.graphqls deleted file mode 100644 index ca30d61531..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputTypeMismatch/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - test(input: TestInput): String @service(service: {className: "no.sikt.graphitron.codereferences.services.TypeMismatchService", method: "check"}) -} - -input TestInput @record(record: {className: "no.sikt.graphitron.codereferences.records.CustomerJavaRecord"}) { - someID: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputValidRecord/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputValidRecord/schema.graphqls deleted file mode 100644 index deb4e60863..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/serviceInputValidRecord/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - test(input: TestInput): String @service(service: {className: "no.sikt.graphitron.codereferences.services.TypeMismatchService", method: "check"}) -} - -input TestInput @table(name: "CUSTOMER") { - customerId: Int @field(name: "CUSTOMER_ID") -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/tableObjectWithServiceField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/tableObjectWithServiceField/schema.graphqls deleted file mode 100644 index 2e491494fb..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/tableObjectWithServiceField/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - customer: Customer -} - -type Customer @table { - details: CustomerDetails @splitQuery @service(service: {className: "no.sikt.graphitron.codereferences.services.MapperFetchService", method: "fetchCustomerDetails"}) -} - -type CustomerDetails @record(record: {className: "no.sikt.graphitron.codereferences.records.CustomerJavaRecord"}) { - someID: String - email: String -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/type/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/type/schema.graphqls deleted file mode 100644 index 5ef88707a3..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/type/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Query { - query: INVALID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/typeDistance/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/typeDistance/schema.graphqls deleted file mode 100644 index 5bb611b031..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/typeDistance/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Typee -} - -type Type { - id: ID -} - -type UnrelatedType { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/typeDistanceEqual/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/typeDistanceEqual/schema.graphqls deleted file mode 100644 index c91fc9fa8b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/typeDistanceEqual/schema.graphqls +++ /dev/null @@ -1,11 +0,0 @@ -type Query { - query: Type -} - -type Type0 { - id: ID -} - -type Type1 { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/typeInNestedUnion/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/typeInNestedUnion/schema.graphqls deleted file mode 100644 index 3710e61e44..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/typeInNestedUnion/schema.graphqls +++ /dev/null @@ -1,6 +0,0 @@ -type Query { - query: Union -} - -union Union = UnionInner | DummyType -union UnionInner = DummyType | INVALID diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/typeInUnion/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/typeInUnion/schema.graphqls deleted file mode 100644 index 3b061cdb5d..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/typeInUnion/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -type Query { - query: U -} - -union U = DummyType | INVALID diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/typeTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/typeTable/schema.graphqls deleted file mode 100644 index 6b7c137dfa..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/typeTable/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Dummy @table(name: "UNKNOWN_TABLE") { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/undefinedServiceMethod/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/undefinedServiceMethod/schema.graphqls deleted file mode 100644 index 61f00acdeb..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/undefinedServiceMethod/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation: ID @service(service: {name: "RESOLVER_MUTATION_SERVICE", method: "UNDEFINED"}) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/unknownNotGeneratedField/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/unknownNotGeneratedField/schema.graphqls deleted file mode 100644 index f203d1d2cb..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/unknownNotGeneratedField/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Customer @table { - wrong: String @notGenerated - wrongWrapper: WrongWrapper -} - -type WrongWrapper { - wrong: String @notGenerated -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/wrappedFieldWithImplicitTableFromInput/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/wrappedFieldWithImplicitTableFromInput/schema.graphqls deleted file mode 100644 index 90c3de399c..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/wrappedFieldWithImplicitTableFromInput/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Query { - query(in: CustomerNodeInputTable!): CustomerNoTable -} - -type CustomerNoTable { - wrong: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/wrapperTypeWithTable/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/wrapperTypeWithTable/schema.graphqls deleted file mode 100644 index 93423dcaee..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/validation/unknown/wrapperTypeWithTable/schema.graphqls +++ /dev/null @@ -1,7 +0,0 @@ -type Customer @table { - name: CustomerName -} - -type CustomerName @table(name: "CUSTOMER") { - firstName: String @field(name: "FIRST_NAME") -} \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/wiring/default/expected/QueryGeneratedDataFetcher.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/wiring/default/expected/QueryGeneratedDataFetcher.java deleted file mode 100644 index d50e638b5f..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/wiring/default/expected/QueryGeneratedDataFetcher.java +++ /dev/null @@ -1,13 +0,0 @@ -import fake.code.generated.queries.QueryDBQueries; -import fake.graphql.example.model.Customer; -import graphql.schema.DataFetcher; -import java.util.concurrent.CompletableFuture; -import no.sikt.graphql.helpers.resolvers.DataFetcherHelper; - -public class QueryGeneratedDataFetcher { - public static DataFetcher<CompletableFuture<Customer>> query() { - return _iv_env -> { - return new DataFetcherHelper(_iv_env).load((_iv_ctx, _iv_selectionSet) -> QueryDBQueries.queryForQuery(_iv_ctx, _iv_selectionSet)); - } ; - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/wiring/default/expected/Wiring.java b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/wiring/default/expected/Wiring.java deleted file mode 100644 index 312c6b9495..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/wiring/default/expected/Wiring.java +++ /dev/null @@ -1,15 +0,0 @@ -import fake.code.generated.resolvers.operations.QueryGeneratedDataFetcher; -import graphql.schema.idl.RuntimeWiring; -import graphql.schema.idl.TypeRuntimeWiring; - -public class Wiring { - public static RuntimeWiring.Builder getRuntimeWiringBuilder() { - var wiring = RuntimeWiring.newRuntimeWiring(); - wiring.type(TypeRuntimeWiring.newTypeWiring("Query").dataFetcher("query", QueryGeneratedDataFetcher.query())); - return wiring; - } - - public static RuntimeWiring getRuntimeWiring() { - return getRuntimeWiringBuilder().build(); - } -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/wiring/entity/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/wiring/entity/schema.graphqls deleted file mode 100644 index ca24519a03..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/wiring/entity/schema.graphqls +++ /dev/null @@ -1,10 +0,0 @@ -union _Entity = Dummy - -type Query { - _entities(representations: [_Any!]!): [_Entity]! - dummy: Dummy -} - -type Dummy @key(fields: "id") { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/wiring/interface/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/wiring/interface/schema.graphqls deleted file mode 100644 index 105a611239..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/wiring/interface/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -interface I { - string: String -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/wiring/mutation/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/wiring/mutation/schema.graphqls deleted file mode 100644 index da868add74..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/wiring/mutation/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -type Mutation { - mutation(in: CustomerInputTable): CustomerTable @mutation(typeName: INSERT) -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/wiring/noGenerators/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/wiring/noGenerators/schema.graphqls deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/wiring/node/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/wiring/node/schema.graphqls deleted file mode 100644 index 7fd49a497e..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/wiring/node/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - customer: Customer - node(id: ID): Node -} - -type Customer implements Node @table @node { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/wiring/scalars/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/wiring/scalars/schema.graphqls deleted file mode 100644 index 0e797617b0..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/wiring/scalars/schema.graphqls +++ /dev/null @@ -1,3 +0,0 @@ -scalar LocalTime #defined in ExtendedScalars.LocalTime -scalar BigInteger #defined in ExtendedScalars.GraphQLBigInteger -scalar MyLittleScalar #not recognized by ExtendedScalars \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/wiring/twoFetchers/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/wiring/twoFetchers/schema.graphqls deleted file mode 100644 index b0a692c23b..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/wiring/twoFetchers/schema.graphqls +++ /dev/null @@ -1,8 +0,0 @@ -type Query { - customer: Customer - payment: Payment -} - -type Payment { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/wiring/twoTypes/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/wiring/twoTypes/schema.graphqls deleted file mode 100644 index deca39a6a1..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/wiring/twoTypes/schema.graphqls +++ /dev/null @@ -1,12 +0,0 @@ -type Query { - customer: Customer -} - -type Customer { - id: ID - address: Address @splitQuery -} - -type Address { - id: ID -} diff --git a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/wiring/union/schema.graphqls b/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/wiring/union/schema.graphqls deleted file mode 100644 index 8c19dac5ef..0000000000 --- a/graphitron-codegen-parent/graphitron-java-codegen/src/test/resources/wiring/union/schema.graphqls +++ /dev/null @@ -1,5 +0,0 @@ -union U = A - -type A { - string: String -} diff --git a/graphitron-codegen-parent/graphitron-javapoet/pom.xml b/graphitron-codegen-parent/graphitron-javapoet/pom.xml deleted file mode 100644 index 619f2974bf..0000000000 --- a/graphitron-codegen-parent/graphitron-javapoet/pom.xml +++ /dev/null @@ -1,79 +0,0 @@ -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>no.sikt</groupId> - <artifactId>graphitron-codegen-parent</artifactId> - <version>${revision}${changelist}</version> - </parent> - <artifactId>graphitron-javapoet</artifactId> - <name>${project.groupId}:${project.artifactId}</name> - <url>https://github.com/sikt-no/graphitron</url> - - <properties> - <argLine/> - </properties> - - <dependencies> - <dependency> - <groupId>org.assertj</groupId> - <artifactId>assertj-core</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.junit.vintage</groupId> - <artifactId>junit-vintage-engine</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>com.google.testing.compile</groupId> - <artifactId>compile-testing</artifactId> - <version>0.23.0</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>com.google.jimfs</groupId> - <artifactId>jimfs</artifactId> - <version>1.3.1</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.mockito</groupId> - <artifactId>mockito-core</artifactId> - <version>5.23.0</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.eclipse.jdt</groupId> - <artifactId>ecj</artifactId> - <version>3.45.0</version> - <scope>test</scope> - </dependency> - </dependencies> - - <build> - <!-- This is needed for Mockito to work without warnings on newer Java versions --> - <!-- See https://javadoc.io/doc/org.mockito/mockito-core/latest/org.mockito/org/mockito/Mockito.html#0.3 --> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-dependency-plugin</artifactId> - <executions> - <execution> - <goals> - <goal>properties</goal> - </goals> - </execution> - </executions> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - <configuration> - <argLine>@{argLine} -javaagent:${org.mockito:mockito-core:jar}</argLine> - <skipTests>true</skipTests> - </configuration> - </plugin> - </plugins> - </build> -</project> \ No newline at end of file diff --git a/graphitron-codegen-parent/graphitron-javapoet/src/main/java/no/sikt/graphitron/javapoet/CodeBlocks.java b/graphitron-codegen-parent/graphitron-javapoet/src/main/java/no/sikt/graphitron/javapoet/CodeBlocks.java deleted file mode 100644 index 1b0631d4fc..0000000000 --- a/graphitron-codegen-parent/graphitron-javapoet/src/main/java/no/sikt/graphitron/javapoet/CodeBlocks.java +++ /dev/null @@ -1,229 +0,0 @@ -package no.sikt.graphitron.javapoet; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.function.Function; -import java.util.function.Supplier; -import java.util.stream.Collector; -import java.util.stream.Stream; - -/** - * An append-only, ordered collection of {@link CodeBlock} instances with ergonomic methods for - * conditional addition, transformation, and joining. - * - * <p>Use this instead of {@code ArrayList<CodeBlock>} when you need to accumulate code blocks - * and join them later. Empty blocks are automatically filtered on {@link #join}. - * - * <pre>{@code - * CodeBlock result = CodeBlocks.create() - * .add("$T.foo()", SomeClass.class) - * .addIf(needsBar, ".bar()") - * .add(".baz($L)", value) - * .join(",\n"); - * }</pre> - */ -public final class CodeBlocks implements Iterable<CodeBlock> { - private final List<CodeBlock> blocks; - - private CodeBlocks(List<CodeBlock> blocks) { - this.blocks = blocks; - } - - /** - * Creates an empty {@link CodeBlocks}. - */ - public static CodeBlocks create() { - return new CodeBlocks(new ArrayList<>()); - } - - /** - * Creates a {@link CodeBlocks} containing the given blocks. - */ - public static CodeBlocks of(CodeBlock... blocks) { - var result = new CodeBlocks(new ArrayList<>(blocks.length)); - Collections.addAll(result.blocks, blocks); - return result; - } - - /** - * Creates a {@link CodeBlocks} from an existing iterable. - */ - public static CodeBlocks from(Iterable<CodeBlock> blocks) { - return create().addAll(blocks); - } - - /** - * Creates a {@link CodeBlocks} from an existing iterable of named variables. - */ - public static CodeBlocks fromVars(Iterable<String> vars) { - var result = create(); - for (var v : vars) { - result.addVar(v); - } - return result; - } - - /** - * Returns a {@link Collector} that accumulates {@link CodeBlock} elements into a {@link CodeBlocks}. - */ - public static Collector<CodeBlock, ?, CodeBlocks> collector() { - return Collector.of( - CodeBlocks::create, - CodeBlocks::addBlock, - (a, b) -> { a.blocks.addAll(b.blocks); return a; } - ); - } - - /** - * Returns a {@link Collector} that accumulates variable names into a {@link CodeBlocks} - * by wrapping each with {@link CodeBlock#ofVar(String)}. - */ - public static Collector<String, ?, CodeBlocks> varCollector() { - return Collector.of( - CodeBlocks::create, - (result, v) -> result.blocks.add(CodeBlock.ofVar(v)), - (a, b) -> { a.blocks.addAll(b.blocks); return a; } - ); - } - - /** - * Appends a code block built from the given format and arguments. - */ - public CodeBlocks add(String format, Object... args) { - return add(CodeBlock.of(format, args)); - } - - /** - * Appends a pre-built code block. - */ - public CodeBlocks add(CodeBlock block) { - blocks.add(block); - return this; - } - - /** - * Appends a code block built from the given variable. - */ - public CodeBlocks addVar(String variable) { - return add("$N", variable); - } - - /** - * Appends a code block only if the predicate is true. - */ - public CodeBlocks addIf(boolean predicate, String format, Object... args) { - return predicate ? add(CodeBlock.of(format, args)) : this; - } - - /** - * Appends a pre-built code block only if the predicate is true. - */ - public CodeBlocks addIf(boolean predicate, CodeBlock block) { - return predicate ? add(block) : this; - } - - /** - * Appends a lazily-built code block only if the predicate is true. - */ - public CodeBlocks addIf(boolean predicate, Supplier<CodeBlock> supplier) { - if (predicate) { - return add(supplier.get()); - } - return this; - } - - /** - * Appends a code block built from the given variable only if the predicate is true. - */ - public CodeBlocks addVarIf(boolean predicate, String variable) { - return predicate ? add("$N", variable) : this; - } - - /** - * Appends all code blocks from another {@link CodeBlocks}. - */ - public CodeBlocks addAll(CodeBlocks other) { - blocks.addAll(other.blocks); - return this; - } - - /** - * Appends all code blocks from an iterable. - */ - public CodeBlocks addAll(Iterable<CodeBlock> other) { - other.forEach(blocks::add); - return this; - } - - /** - * Appends all code blocks from a stream. - */ - public CodeBlocks addAll(Stream<CodeBlock> stream) { - stream.forEach(blocks::add); - return this; - } - - /** - * Returns a new {@link CodeBlocks} with the given function applied to each element. - */ - public CodeBlocks map(Function<CodeBlock, CodeBlock> transform) { - var result = new CodeBlocks(new ArrayList<>(blocks.size())); - for (var block : blocks) { - result.blocks.add(transform.apply(block)); - } - return result; - } - - /** - * Joins all non-empty blocks with the given separator. - */ - public CodeBlock join(String separator) { - return CodeBlock.join(separator, blocks); - } - - /** - * Joins all non-empty blocks with no separator. - */ - public CodeBlock join() { - return CodeBlock.join(blocks); - } - - /** - * Returns true if this collection contains no blocks. - */ - public boolean isEmpty() { - return blocks.isEmpty(); - } - - /** - * Returns the number of blocks in this collection. - */ - public int size() { - return blocks.size(); - } - - /** - * Returns an unmodifiable view of the underlying list. - */ - public List<CodeBlock> toList() { - return Collections.unmodifiableList(blocks); - } - - /** - * Returns a sequential stream over the blocks. - */ - public Stream<CodeBlock> stream() { - return blocks.stream(); - } - - @Override - public Iterator<CodeBlock> iterator() { - return Collections.unmodifiableList(blocks).iterator(); - } - - private void addBlock(CodeBlock block) { - blocks.add(block); - } -} diff --git a/graphitron-codegen-parent/graphitron-javapoet/src/main/java/no/sikt/graphitron/javapoet/Wrappers.java b/graphitron-codegen-parent/graphitron-javapoet/src/main/java/no/sikt/graphitron/javapoet/Wrappers.java deleted file mode 100644 index 5c23204a79..0000000000 --- a/graphitron-codegen-parent/graphitron-javapoet/src/main/java/no/sikt/graphitron/javapoet/Wrappers.java +++ /dev/null @@ -1,23 +0,0 @@ -package no.sikt.graphitron.javapoet; - -import java.util.function.UnaryOperator; - -public class Wrappers { - /** - * returns a transform that wraps the receiver builder's accumulated content in {@code if (conditionValue != null) { ... }}. - */ - public static UnaryOperator<CodeBlock.Builder> wrapNotNull(String conditionValue) { - return wrapNotNull(CodeBlock.ofVar(conditionValue)); - } - - /** - * returns a transform that wraps the receiver builder's accumulated content in {@code if (conditionValue != null) { ... }}. - */ - public static UnaryOperator<CodeBlock.Builder> wrapNotNull(CodeBlock conditionValue) { - return b -> CodeBlock - .builder() - .beginControlFlow("if ($L != null)", conditionValue) - .add(b.build()) - .endControlFlow(); - } -} diff --git a/graphitron-codegen-parent/graphitron-javapoet/src/test/java/no/sikt/graphitron/javapoet/CodeBlockTest.java b/graphitron-codegen-parent/graphitron-javapoet/src/test/java/no/sikt/graphitron/javapoet/CodeBlockTest.java deleted file mode 100644 index 5b9b6c43e0..0000000000 --- a/graphitron-codegen-parent/graphitron-javapoet/src/test/java/no/sikt/graphitron/javapoet/CodeBlockTest.java +++ /dev/null @@ -1,650 +0,0 @@ -/* - * Copyright (C) 2015 Square, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * Modified by Sikt for internal use in the Graphitron project. - */ -package no.sikt.graphitron.javapoet; - -import org.junit.Test; - -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -public final class CodeBlockTest { - @Test - public void equalsAndHashCode() { - CodeBlock a = CodeBlock.builder().build(); - CodeBlock b = CodeBlock.builder().build(); - assertThat(a.equals(b)).isTrue(); - assertThat(a.hashCode()).isEqualTo(b.hashCode()); - a = CodeBlock.builder().add("$L", "taco").build(); - b = CodeBlock.builder().add("$L", "taco").build(); - assertThat(a.equals(b)).isTrue(); - assertThat(a.hashCode()).isEqualTo(b.hashCode()); - } - - @Test - public void of() { - CodeBlock a = CodeBlock.of("$L taco", "delicious"); - assertThat(a.toString()).isEqualTo("delicious taco"); - } - - @Test - public void isEmpty() { - assertTrue(CodeBlock.builder().isEmpty()); - assertTrue(CodeBlock.builder().add("").isEmpty()); - assertTrue(CodeBlock.builder().addIf(false, "a").isEmpty()); - assertFalse(CodeBlock.builder().add(" ").isEmpty()); - } - - @Test - public void indentCannotBeIndexed() { - try { - CodeBlock.builder().add("$1>", "taco").build(); - fail(); - } catch (IllegalArgumentException exp) { - assertThat(exp) - .hasMessage("$$, $>, $<, $[, $], $W, and $Z may not have an index"); - } - } - - @Test - public void deindentCannotBeIndexed() { - try { - CodeBlock.builder().add("$1<", "taco").build(); - fail(); - } catch (IllegalArgumentException exp) { - assertThat(exp) - .hasMessage("$$, $>, $<, $[, $], $W, and $Z may not have an index"); - } - } - - @Test - public void dollarSignEscapeCannotBeIndexed() { - try { - CodeBlock.builder().add("$1$", "taco").build(); - fail(); - } catch (IllegalArgumentException exp) { - assertThat(exp) - .hasMessage("$$, $>, $<, $[, $], $W, and $Z may not have an index"); - } - } - - @Test - public void statementBeginningCannotBeIndexed() { - try { - CodeBlock.builder().add("$1[", "taco").build(); - fail(); - } catch (IllegalArgumentException exp) { - assertThat(exp) - .hasMessage("$$, $>, $<, $[, $], $W, and $Z may not have an index"); - } - } - - @Test - public void statementEndingCannotBeIndexed() { - try { - CodeBlock.builder().add("$1]", "taco").build(); - fail(); - } catch (IllegalArgumentException exp) { - assertThat(exp) - .hasMessage("$$, $>, $<, $[, $], $W, and $Z may not have an index"); - } - } - - @Test - public void nameFormatCanBeIndexed() { - CodeBlock block = CodeBlock.builder().add("$1N", "taco").build(); - assertThat(block.toString()).isEqualTo("taco"); - } - - @Test - public void literalFormatCanBeIndexed() { - CodeBlock block = CodeBlock.builder().add("$1L", "taco").build(); - assertThat(block.toString()).isEqualTo("taco"); - } - - @Test - public void stringFormatCanBeIndexed() { - CodeBlock block = CodeBlock.builder().add("$1S", "taco").build(); - assertThat(block.toString()).isEqualTo("\"taco\""); - } - - @Test - public void typeFormatCanBeIndexed() { - CodeBlock block = CodeBlock.builder().add("$1T", String.class).build(); - assertThat(block.toString()).isEqualTo("java.lang.String"); - } - - @Test - public void simpleNamedArgument() { - Map<String, Object> map = new LinkedHashMap<>(); - map.put("text", "taco"); - CodeBlock block = CodeBlock.builder().addNamed("$text:S", map).build(); - assertThat(block.toString()).isEqualTo("\"taco\""); - } - - @Test - public void repeatedNamedArgument() { - Map<String, Object> map = new LinkedHashMap<>(); - map.put("text", "tacos"); - CodeBlock block = CodeBlock.builder() - .addNamed("\"I like \" + $text:S + \". Do you like \" + $text:S + \"?\"", map) - .build(); - assertThat(block.toString()).isEqualTo( - "\"I like \" + \"tacos\" + \". Do you like \" + \"tacos\" + \"?\""); - } - - @Test - public void namedAndNoArgFormat() { - Map<String, Object> map = new LinkedHashMap<>(); - map.put("text", "tacos"); - CodeBlock block = CodeBlock.builder() - .addNamed("$>\n$text:L for $$3.50", map).build(); - assertThat(block.toString()).isEqualTo("\n tacos for $3.50"); - } - - @Test - public void missingNamedArgument() { - try { - Map<String, Object> map = new LinkedHashMap<>(); - CodeBlock.builder().addNamed("$text:S", map).build(); - fail(); - } catch (IllegalArgumentException expected) { - assertThat(expected).hasMessage("Missing named argument for $text"); - } - } - - @Test - public void lowerCaseNamed() { - try { - Map<String, Object> map = new LinkedHashMap<>(); - map.put("Text", "tacos"); - CodeBlock block = CodeBlock.builder().addNamed("$Text:S", map).build(); - fail(); - } catch (IllegalArgumentException expected) { - assertThat(expected).hasMessage("argument 'Text' must start with a lowercase character"); - } - } - - @Test - public void multipleNamedArguments() { - Map<String, Object> map = new LinkedHashMap<>(); - map.put("pipe", System.class); - map.put("text", "tacos"); - - CodeBlock block = CodeBlock.builder() - .addNamed("$pipe:T.out.println(\"Let's eat some $text:L\");", map) - .build(); - - assertThat(block.toString()).isEqualTo( - "java.lang.System.out.println(\"Let's eat some tacos\");"); - } - - @Test - public void namedNewline() { - Map<String, Object> map = new LinkedHashMap<>(); - map.put("clazz", Integer.class); - CodeBlock block = CodeBlock.builder().addNamed("$clazz:T\n", map).build(); - assertThat(block.toString()).isEqualTo("java.lang.Integer\n"); - } - - @Test - public void danglingNamed() { - Map<String, Object> map = new LinkedHashMap<>(); - map.put("clazz", Integer.class); - try { - CodeBlock.builder().addNamed("$clazz:T$", map).build(); - fail(); - } catch (IllegalArgumentException expected) { - assertThat(expected).hasMessage("dangling $ at end"); - } - } - - @Test - public void indexTooHigh() { - try { - CodeBlock.builder().add("$2T", String.class).build(); - fail(); - } catch (IllegalArgumentException expected) { - assertThat(expected).hasMessage("index 2 for '$2T' not in range (received 1 arguments)"); - } - } - - @Test - public void indexIsZero() { - try { - CodeBlock.builder().add("$0T", String.class).build(); - fail(); - } catch (IllegalArgumentException expected) { - assertThat(expected).hasMessage("index 0 for '$0T' not in range (received 1 arguments)"); - } - } - - @Test - public void indexIsNegative() { - try { - CodeBlock.builder().add("$-1T", String.class).build(); - fail(); - } catch (IllegalArgumentException expected) { - assertThat(expected).hasMessage("invalid format string: '$-1T'"); - } - } - - @Test - public void indexWithoutFormatType() { - try { - CodeBlock.builder().add("$1", String.class).build(); - fail(); - } catch (IllegalArgumentException expected) { - assertThat(expected).hasMessage("dangling format characters in '$1'"); - } - } - - @Test - public void indexWithoutFormatTypeNotAtStringEnd() { - try { - CodeBlock.builder().add("$1 taco", String.class).build(); - fail(); - } catch (IllegalArgumentException expected) { - assertThat(expected).hasMessage("invalid format string: '$1 taco'"); - } - } - - @Test - public void indexButNoArguments() { - try { - CodeBlock.builder().add("$1T").build(); - fail(); - } catch (IllegalArgumentException expected) { - assertThat(expected).hasMessage("index 1 for '$1T' not in range (received 0 arguments)"); - } - } - - @Test - public void formatIndicatorAlone() { - try { - CodeBlock.builder().add("$", String.class).build(); - fail(); - } catch (IllegalArgumentException expected) { - assertThat(expected).hasMessage("dangling format characters in '$'"); - } - } - - @Test - public void formatIndicatorWithoutIndexOrFormatType() { - try { - CodeBlock.builder().add("$ tacoString", String.class).build(); - fail(); - } catch (IllegalArgumentException expected) { - assertThat(expected).hasMessage("invalid format string: '$ tacoString'"); - } - } - - @Test - public void sameIndexCanBeUsedWithDifferentFormats() { - CodeBlock block = CodeBlock.builder() - .add("$1T.out.println($1S)", ClassName.get(System.class)) - .build(); - assertThat(block.toString()).isEqualTo("java.lang.System.out.println(\"java.lang.System\")"); - } - - @Test - public void tooManyStatementEnters() { - CodeBlock codeBlock = CodeBlock.builder().add("$[$[").build(); - try { - // We can't report this error until rendering type because code blocks might be composed. - codeBlock.toString(); - fail(); - } catch (IllegalStateException expected) { - assertThat(expected).hasMessage("statement enter $[ followed by statement enter $["); - } - } - - @Test - public void statementExitWithoutStatementEnter() { - CodeBlock codeBlock = CodeBlock.builder().add("$]").build(); - try { - // We can't report this error until rendering type because code blocks might be composed. - codeBlock.toString(); - fail(); - } catch (IllegalStateException expected) { - assertThat(expected).hasMessage("statement exit $] has no matching statement enter $["); - } - } - - @Test - public void join() { - List<CodeBlock> codeBlocks = new ArrayList<>(); - codeBlocks.add(CodeBlock.of("$S", "hello")); - codeBlocks.add(CodeBlock.of("$T", ClassName.get("world", "World"))); - codeBlocks.add(CodeBlock.of("need tacos")); - - CodeBlock joined = CodeBlock.join(" || ", codeBlocks); - assertThat(joined.toString()).isEqualTo("\"hello\" || world.World || need tacos"); - } - - @Test - public void joining() { - List<CodeBlock> codeBlocks = new ArrayList<>(); - codeBlocks.add(CodeBlock.of("$S", "hello")); - codeBlocks.add(CodeBlock.of("$T", ClassName.get("world", "World"))); - codeBlocks.add(CodeBlock.of("need tacos")); - - CodeBlock joined = codeBlocks.stream().collect(CodeBlock.joining(" || ")); - assertThat(joined.toString()).isEqualTo("\"hello\" || world.World || need tacos"); - } - - @Test - public void joiningSingle() { - List<CodeBlock> codeBlocks = new ArrayList<>(); - codeBlocks.add(CodeBlock.of("$S", "hello")); - - CodeBlock joined = codeBlocks.stream().collect(CodeBlock.joining(" || ")); - assertThat(joined.toString()).isEqualTo("\"hello\""); - } - - @Test - public void joiningWithPrefixAndSuffix() { - List<CodeBlock> codeBlocks = new ArrayList<>(); - codeBlocks.add(CodeBlock.of("$S", "hello")); - codeBlocks.add(CodeBlock.of("$T", ClassName.get("world", "World"))); - codeBlocks.add(CodeBlock.of("need tacos")); - - CodeBlock joined = codeBlocks.stream().collect(CodeBlock.joining(" || ", "start {", "} end")); - assertThat(joined.toString()).isEqualTo("start {\"hello\" || world.World || need tacos} end"); - } - - @Test - public void clear() { - CodeBlock block = CodeBlock.builder() - .addStatement("$S", "Test string") - .clear() - .build(); - - assertThat(block.toString()).isEmpty(); - } - - @Test - public void ternary() { - CodeBlock block = CodeBlock.ternary( - CodeBlock.of("x != null"), - CodeBlock.of("x"), - CodeBlock.of("y")); - assertThat(block.toString()).isEqualTo("x != null ? x : y"); - } - - @Test - public void ternaryWithTypes() { - CodeBlock block = CodeBlock.ternary( - CodeBlock.of("$N != null", "value"), - CodeBlock.of("$T.of($N)", ClassName.get("java.util", "List"), "value"), - CodeBlock.of("$T.of()", ClassName.get("java.util", "List"))); - assertThat(block.toString()).isEqualTo("value != null ? java.util.List.of(value) : java.util.List.of()"); - } - - @Test - public void ternaryOnBuilder() { - CodeBlock block = CodeBlock.builder() - .add("var x = ") - .ternary(CodeBlock.of("a"), CodeBlock.of("b"), CodeBlock.of("c")) - .build(); - assertThat(block.toString()).isEqualTo("var x = a ? b : c"); - } - - @Test - public void ternaryIfOnBuilder() { - CodeBlock withTernary = CodeBlock.builder() - .ternaryIf(true, CodeBlock.of("a"), CodeBlock.of("b"), CodeBlock.of("c")) - .build(); - assertThat(withTernary.toString()).isEqualTo("a ? b : c"); - - CodeBlock without = CodeBlock.builder() - .ternaryIf(false, CodeBlock.of("a"), CodeBlock.of("b"), CodeBlock.of("c")) - .build(); - assertThat(without.isEmpty()).isTrue(); - } - - @Test - public void staticMethodCallNoArgs() { - CodeBlock block = CodeBlock.methodCall(ClassName.get("org.jooq", "DSL"), "trueCondition"); - assertThat(block.toString()).isEqualTo("org.jooq.DSL.trueCondition()"); - } - - @Test - public void staticMethodCallWithArgs() { - CodeBlock block = CodeBlock.methodCall( - ClassName.get("org.jooq", "DSL"), "select", - CodeBlock.of("field1"), CodeBlock.of("field2")); - assertThat(block.toString()).isEqualTo("org.jooq.DSL.select(field1, field2)"); - } - - @Test - public void staticMethodCallWithList() { - List<CodeBlock> args = List.of(CodeBlock.of("a"), CodeBlock.of("b"), CodeBlock.of("c")); - CodeBlock block = CodeBlock.methodCall(ClassName.get("java.util", "List"), "of", args); - assertThat(block.toString()).isEqualTo("java.util.List.of(a, b, c)"); - } - - @Test - public void staticMethodCallFiltersEmptyArgs() { - CodeBlock block = CodeBlock.methodCall( - ClassName.get("org.jooq", "DSL"), "row", - CodeBlock.of("field1"), CodeBlock.empty(), CodeBlock.of("field2")); - assertThat(block.toString()).isEqualTo("org.jooq.DSL.row(field1, field2)"); - } - - @Test - public void instanceMethodCallNoArgs() { - CodeBlock block = CodeBlock.methodCall("myVar", "toString"); - assertThat(block.toString()).isEqualTo("myVar.toString()"); - } - - @Test - public void instanceMethodCallWithArgs() { - CodeBlock block = CodeBlock.methodCall("record", "set", - CodeBlock.of("$S", "name"), CodeBlock.of("value")); - assertThat(block.toString()).isEqualTo("record.set(\"name\", value)"); - } - - @Test - public void instanceMethodCallWithList() { - List<CodeBlock> args = List.of(CodeBlock.of("x"), CodeBlock.of("y")); - CodeBlock block = CodeBlock.methodCall("obj", "method", args); - assertThat(block.toString()).isEqualTo("obj.method(x, y)"); - } - - @Test - public void methodCallNoArgs() { - CodeBlock block = CodeBlock.methodCall("doSomething"); - assertThat(block.toString()).isEqualTo("doSomething()"); - } - - @Test - public void methodCallWithArgs() { - CodeBlock block = CodeBlock.methodCall("process", - CodeBlock.of("input"), CodeBlock.of("$S", "config")); - assertThat(block.toString()).isEqualTo("process(input, \"config\")"); - } - - @Test - public void methodCallWithList() { - List<CodeBlock> args = List.of(CodeBlock.of("a"), CodeBlock.of("b")); - CodeBlock block = CodeBlock.methodCall("compute", args); - assertThat(block.toString()).isEqualTo("compute(a, b)"); - } - - @Test - public void methodCallFiltersEmptyArgs() { - CodeBlock block = CodeBlock.methodCall("foo", - CodeBlock.empty(), CodeBlock.of("bar"), CodeBlock.empty()); - assertThat(block.toString()).isEqualTo("foo(bar)"); - } - - @Test - public void methodCallOnBuilder() { - CodeBlock block = CodeBlock.builder() - .methodCall(ClassName.get("org.jooq", "DSL"), "select", CodeBlock.of("field1")) - .build(); - assertThat(block.toString()).isEqualTo("org.jooq.DSL.select(field1)"); - } - - @Test - public void instanceMethodCallOnBuilder() { - CodeBlock block = CodeBlock.builder() - .methodCall("ctx", "configuration") - .build(); - assertThat(block.toString()).isEqualTo("ctx.configuration()"); - } - - @Test - public void localMethodCallOnBuilder() { - CodeBlock block = CodeBlock.builder() - .methodCall("init", CodeBlock.of("env")) - .build(); - assertThat(block.toString()).isEqualTo("init(env)"); - } - - @Test - public void methodCallSingleArg() { - CodeBlock block = CodeBlock.methodCall( - ClassName.get("java.util", "Objects"), "requireNonNull", - CodeBlock.of("value")); - assertThat(block.toString()).isEqualTo("java.util.Objects.requireNonNull(value)"); - } - - @Test - public void methodCallAllEmptyArgs() { - CodeBlock block = CodeBlock.methodCall( - ClassName.get("org.jooq", "DSL"), "row", - CodeBlock.empty(), CodeBlock.empty()); - assertThat(block.toString()).isEqualTo("org.jooq.DSL.row()"); - } - - // --- assign --- - - @Test - public void assign() { - CodeBlock block = CodeBlock.assign("myVar", CodeBlock.of("getValue()")); - assertThat(block.toString()).isEqualTo("myVar = getValue();\n"); - } - - @Test - public void assignWithFormat() { - CodeBlock block = CodeBlock.assign("result", "$T.of($N)", ClassName.get("java.util", "List"), "items"); - assertThat(block.toString()).isEqualTo("result = java.util.List.of(items);\n"); - } - - @Test - public void assignOnBuilder() { - CodeBlock block = CodeBlock.builder() - .assign("x", CodeBlock.of("42")) - .assign("y", CodeBlock.of("x + 1")) - .build(); - assertThat(block.toString()).isEqualTo("x = 42;\ny = x + 1;\n"); - } - - @Test - public void assignIfOnBuilder() { - CodeBlock block = CodeBlock.builder() - .assignIf(true, "x", CodeBlock.of("1")) - .assignIf(false, "y", CodeBlock.of("2")) - .build(); - assertThat(block.toString()).isEqualTo("x = 1;\n"); - } - - @Test - public void assignIfWithFormatOnBuilder() { - CodeBlock block = CodeBlock.builder() - .assignIf(true, "x", "$L + $L", "a", "b") - .assignIf(false, "y", "$L", "c") - .build(); - assertThat(block.toString()).isEqualTo("x = a + b;\n"); - } - - // --- apply / applyIf --- - - @Test - public void applyRunsTheTransform() { - CodeBlock result = CodeBlock - .builder() - .add("inner") - .apply(b -> CodeBlock.builder().add("wrap($L)", b.build())) - .build(); - assertThat(result.toString()).isEqualTo("wrap(inner)"); - } - - @Test - public void applyPreservesChain() { - CodeBlock result = CodeBlock - .builder() - .add("a") - .apply(b -> CodeBlock.builder().add("[$L]", b.build())) - .add("b") - .build(); - assertThat(result.toString()).isEqualTo("[a]b"); - } - - @Test - public void applyIfTrueRunsTransform() { - CodeBlock result = CodeBlock - .builder() - .add("x") - .applyIf(true, b -> CodeBlock.builder().add("($L)", b.build())) - .build(); - assertThat(result.toString()).isEqualTo("(x)"); - } - - @Test - public void applyIfFalseIsIdentity() { - CodeBlock result = CodeBlock - .builder() - .add("x") - .applyIf(false, b -> CodeBlock.builder().add("($L)", b.build())) - .build(); - assertThat(result.toString()).isEqualTo("x"); - } - - @Test - public void applyFoldsTransformResultBackIntoReceiver() { - CodeBlock.Builder builder = CodeBlock.builder().add("x"); - CodeBlock.Builder returned = builder.apply(b -> CodeBlock.builder().add("($L)", b.build())); - assertThat(returned).isSameAs(builder); - assertThat(builder.build().toString()).isEqualTo("(x)"); - } - - @Test - public void applyIfTrueFoldsResultBackIntoReceiver() { - CodeBlock.Builder builder = CodeBlock.builder().add("x"); - CodeBlock.Builder returned = builder.applyIf(true, b -> CodeBlock.builder().add("($L)", b.build())); - assertThat(returned).isSameAs(builder); - assertThat(builder.build().toString()).isEqualTo("(x)"); - } - - @Test - public void applyIfFalseLeavesReceiverUnchanged() { - CodeBlock.Builder builder = CodeBlock.builder().add("x"); - CodeBlock.Builder returned = builder.applyIf(false, b -> CodeBlock.builder().add("($L)", b.build())); - assertThat(returned).isSameAs(builder); - assertThat(builder.build().toString()).isEqualTo("x"); - } -} diff --git a/graphitron-codegen-parent/graphitron-javapoet/src/test/java/no/sikt/graphitron/javapoet/CodeBlocksTest.java b/graphitron-codegen-parent/graphitron-javapoet/src/test/java/no/sikt/graphitron/javapoet/CodeBlocksTest.java deleted file mode 100644 index 73b662fd5b..0000000000 --- a/graphitron-codegen-parent/graphitron-javapoet/src/test/java/no/sikt/graphitron/javapoet/CodeBlocksTest.java +++ /dev/null @@ -1,149 +0,0 @@ -package no.sikt.graphitron.javapoet; - -import org.junit.Test; - -import java.util.List; -import java.util.stream.Stream; - -import static org.assertj.core.api.Assertions.assertThat; - -public final class CodeBlocksTest { - - @Test - public void createAndAddWithFormat() { - CodeBlock result = CodeBlocks.create() - .add("$L", "a") - .add("$N", "b") - .join(", "); - assertThat(result.toString()).isEqualTo("a, b"); - } - - @Test - public void conditionalAdd() { - CodeBlock result = CodeBlocks.create() - .add("first") - .addIf(true, "second") - .addIf(false, "skipped") - .add("third") - .join(", "); - assertThat(result.toString()).isEqualTo("first, second, third"); - } - - @Test - public void conditionalAddWithSupplier() { - CodeBlock result = CodeBlocks.create() - .add("a") - .addIf(true, () -> CodeBlock.of("b")) - .addIf(false, () -> { throw new AssertionError("should not be called"); }) - .join(", "); - assertThat(result.toString()).isEqualTo("a, b"); - } - - @Test - public void emptyBlocksAreFilteredOnJoin() { - CodeBlock result = CodeBlocks.create() - .add("first") - .add(CodeBlock.empty()) - .add("second") - .addIf(false, "skipped") - .join(", "); - assertThat(result.toString()).isEqualTo("first, second"); - } - - @Test - public void joinWithNoSeparator() { - CodeBlock result = CodeBlocks.create() - .add("a") - .add("b") - .join(); - assertThat(result.toString()).isEqualTo("ab"); - } - - @Test - public void ofFactory() { - CodeBlock result = CodeBlocks - .of(CodeBlock.of("a"), CodeBlock.of("b"), CodeBlock.of("c")) - .join(", "); - assertThat(result.toString()).isEqualTo("a, b, c"); - } - - @Test - public void fromIterable() { - var list = List.of(CodeBlock.of("x"), CodeBlock.of("y")); - CodeBlock result = CodeBlocks.from(list).join(" + "); - assertThat(result.toString()).isEqualTo("x + y"); - } - - @Test - public void addAllFromCodeBlocks() { - var first = CodeBlocks.create().add("a").add("b"); - var second = CodeBlocks.create().add("c").add("d"); - CodeBlock result = first.addAll(second).join(", "); - assertThat(result.toString()).isEqualTo("a, b, c, d"); - } - - @Test - public void addAllFromStream() { - CodeBlock result = CodeBlocks.create() - .add("start") - .addAll(Stream.of("x", "y").map(CodeBlock::of)) - .join(", "); - assertThat(result.toString()).isEqualTo("start, x, y"); - } - - @Test - public void collector() { - CodeBlocks collected = Stream.of("a", "b", "c") - .map(CodeBlock::ofVar) - .collect(CodeBlocks.collector()); - assertThat(collected.size()).isEqualTo(3); - assertThat(collected.join(", ").toString()).isEqualTo("a, b, c"); - } - - @Test - public void varCollector() { - CodeBlocks collected = Stream.of("a", "b", "c") - .collect(CodeBlocks.varCollector()); - assertThat(collected.size()).isEqualTo(3); - assertThat(collected.join(", ").toString()).isEqualTo("a, b, c"); - } - - @Test - public void mapTransformsElements() { - CodeBlock result = CodeBlocks.create() - .add("a") - .add("b") - .map(block -> CodeBlock.of("[$L]", block)) - .join(", "); - assertThat(result.toString()).isEqualTo("[a], [b]"); - } - - @Test - public void emptyCodeBlocks() { - var blocks = CodeBlocks.create(); - assertThat(blocks.isEmpty()).isTrue(); - assertThat(blocks.size()).isEqualTo(0); - assertThat(blocks.join(", ").isEmpty()).isTrue(); - } - - @Test - public void iterableAndToList() { - var blocks = CodeBlocks.of(CodeBlock.of("a"), CodeBlock.of("b")); - assertThat(blocks.toList()).hasSize(2); - assertThat(blocks.size()).isEqualTo(2); - } - - @Test - public void typicalGeneratorPattern() { - boolean hasPagination = true; - boolean hasTransform = false; - - CodeBlock result = CodeBlocks.create() - .add("queryFunction") - .addIf(hasPagination, "pageSize") - .addIf(hasTransform, "transformFunction") - .join(",\n"); - - assertThat(result.toString()).isEqualTo("queryFunction,\npageSize"); - } -} diff --git a/graphitron-codegen-parent/pom.xml b/graphitron-codegen-parent/pom.xml deleted file mode 100644 index 0373e1490f..0000000000 --- a/graphitron-codegen-parent/pom.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> - -<project xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>no.sikt</groupId> - <artifactId>graphitron-parent</artifactId> - <version>${revision}${changelist}</version> - </parent> - - <artifactId>graphitron-codegen-parent</artifactId> - <name>${project.groupId}:${project.artifactId}</name> - <url>https://github.com/sikt-no/graphitron</url> - <packaging>pom</packaging> - - <modules> - <module>graphitron-java-codegen</module> - <module>graphitron-javapoet</module> - </modules> - -</project> diff --git a/graphitron-common/README.md b/graphitron-common/README.md deleted file mode 100644 index 7384996232..0000000000 --- a/graphitron-common/README.md +++ /dev/null @@ -1,305 +0,0 @@ -# Graphitron Common Module - -Shared utilities and components for the Graphitron framework, including the exception handling framework, GraphQL helpers, and servlet utilities. - -## Exception Handling Framework - -Transforms Java exceptions into GraphQL-compliant error responses with user-friendly messages. The framework supports both **Top-Level Errors** (in the GraphQL response's `errors` array) and **Ad Hoc Error Fields** (errors as part of your schema). - -### Top-Level Errors vs Ad Hoc Error Fields - -#### Top-Level Errors -Top-level errors appear in the standard GraphQL `errors` array at the root of the response. These are best for: -- **Technical/exceptional issues**: Network problems, authentication failures, rate limiting -- **Developer errors**: Malformed queries, missing required arguments -- **System failures**: Database offline, service unavailable -- **Unhandled exceptions**: Unexpected runtime errors - -Example response with top-level error (from approval tests): -```json -{ - "errors": [ - { - "message": "An exception occurred. The error has been logged with id [UUID].", - "locations": [{"line": 2, "column": 5}], - "path": ["allCustomerEmails_topLevelError"], - "extensions": { - "classification": "DataFetchingException" - } - } - ], - "data": { - "allCustomerEmails_topLevelError": null - } -} -``` - -#### Ad Hoc Error Fields (Schema-Based Errors) -Ad hoc error fields are part of your GraphQL schema, typically in mutation payloads. These are best for: -- **Business logic errors**: Validation failures, constraint violations -- **User-facing errors**: Form validation, duplicate entries, invalid input -- **Expected error conditions**: Part of normal application flow -- **Partial success scenarios**: Some operations succeed while others fail - -Example schema with ad hoc errors: -```graphql -type FilmMutationPayload { - errors: [Error!] # Ad hoc error field - film: Film # Can be returned even if errors exist -} -``` - -Example response with ad hoc error (from approval tests): -```json -{ - "data": { - "updateFilmReleaseYear_handledError": { - "errors": [ - { - "__typename": "InvalidInput", - "message": "Release year must be between 1901 and 2155", - "path": ["updateFilmReleaseYear_handledError"] - } - ], - "film": null - } - } -} -``` - -### Architecture Overview - -``` -GraphQL Execution - ↓ -CustomExecutionStrategy (intercepts exceptions) - ↓ -SchemaBasedErrorStrategy (attempts schema-based handling) - ↓ -SchemaErrorMapper (maps to schema errors) OR TopLevelErrorHandler (creates top-level errors) - ↓ -Error Payload (returned to client) -``` - -### How Graphitron Handles Both Error Types - -The framework intelligently routes exceptions to either schema-based (ad hoc) errors or top-level errors: - -1. **Schema-Based Errors (when configured)**: If an exception occurs in a field that returns a payload with an `errors` field, and the exception matches your `@error` directive configuration, it becomes a schema-based error -2. **Top-Level Errors (fallback)**: All other exceptions become top-level errors, including unmatched exceptions and exceptions in fields without error payloads - -### Core Components - -#### 1. CustomExecutionStrategy -- **Purpose**: Intercepts exceptions during field resolution and determines error type -- **Routes to Schema-Based**: When SchemaBasedErrorStrategy can handle the exception -- **Routes to Top-Level**: When exception is unrecognized or field has no error payload - -#### 2. SchemaBasedErrorStrategy -- **Purpose**: Manages schema-based error handling for configured operations -- **Function**: Checks if exception matches `@error` directives and creates payload with errors array - -#### 3. SchemaErrorMapper -- **Purpose**: Maps exceptions to schema-based error objects -- **Function**: Matches database/business logic exceptions to appropriate error types - -#### 4. TopLevelErrorHandler -- **Purpose**: Handles top-level errors for unrecognized exceptions -- **Function**: Logs with unique IDs and creates standard GraphQL errors - -### Generated Components - -Graphitron generates exception handling code based on your GraphQL schema `@error` directives: - -#### Generated Classes -- **GeneratedExceptionStrategyConfiguration**: Maps operations to exception types they handle -- **GeneratedExceptionToErrorMappingProvider**: Provides exception-to-error mappings per operation -- **ExceptionStrategyImpl**: Your custom implementation extending SchemaBasedErrorStrategy -- **Error type classes**: Java classes for each error type defined in the schema - -These classes are generated in the `target/generated-sources` directory when you run `mvn graphitron:generate-code`. - -### Exception Mapping System - -The framework uses a two-tier mapping system: - -#### 1. Matchers -Determine if an exception matches specific criteria: - -- **GenericExceptionMatcher**: Matches exceptions by class type and optional message substring -- **DataAccessMatcher**: Extends GenericExceptionMatcher to also match SQL error codes - -#### 2. Content-to-Error Mappings -Handle matched exceptions and create error objects: - -- **ExceptionContentToErrorMapping**: Base interface for all mappings -- **GenericExceptionContentToErrorMapping**: Maps business logic exceptions -- **DataAccessExceptionContentToErrorMapping**: Maps database exceptions - -### Special Exception Types - -#### ValidationViolationGraphQLException -- **Purpose**: Thrown when Jakarta Bean Validation fails -- **Contains**: Field-level validation errors -- **Usage**: Automatically created when validation constraints are violated - -### Exception Routing Flow - -When an exception occurs during field resolution: - -1. `CustomExecutionStrategy` intercepts the exception -2. Passes to `SchemaBasedErrorStrategy` to check for `@error` directive matches -3. **If matched → Schema-Based Error**: - - `SchemaErrorMapper` creates error object based on `@error` configuration - - Returns payload with populated `errors` array - - Response has data with errors, no top-level errors -4. **If not matched → Top-Level Error**: - - Falls back to `TopLevelErrorHandler` - - Logs exception with unique ID - - Response has null data with top-level errors array - -### Schema-Driven Generation - -Define error types in your GraphQL schema with `@error` directives: - -```graphql -interface Error { - path: [String!]! - message: String! -} - -type InvalidInput implements Error @error(handlers: [ - { - handler: DATABASE, - sqlState: "23514", - matches: "year_check", - description: "Release year must be between 1901 and 2155" - }, - { - handler: BUSINESS_LOGIC, - className: "java.lang.IllegalArgumentException", - matches: "invalid year", - description: "Invalid year provided" - } -]) { - path: [String!]! - message: String! -} - -type FilmMutationPayload { - errors: [Error!] - film: Film -} - -type Mutation { - createFilm(input: FilmInput!): FilmMutationPayload -} -``` - -When you run `mvn graphitron:generate-code`, Graphitron generates: -- Error type classes (e.g., `InvalidInput.java`) -- Payload classes with errors field (e.g., `FilmMutationPayload.java`) -- Exception configuration mapping these errors to operations -- Resolver/Datafetcher methods that automatically use the exception handling - -### Implementation Setup - -See the [graphitron-example-server](../graphitron-example/graphitron-example-server/src/main/java/no/sikt/graphitron/example/server/GraphqlServlet.java) for a complete implementation. - -Use the `ExceptionHandlingBuilder` to configure exception handling: - -```java -private static ExecutionStrategy getCustomExecutionStrategy() { - var dataAccessMapper = new DataAccessExceptionMapperImpl(); - var configuration = new GeneratedExceptionStrategyConfiguration(); - var mappingProvider = new GeneratedExceptionToErrorMappingProvider(); - - return ExceptionHandlingBuilder.create() - .withDataAccessMapper(dataAccessMapper) - .withSchemaBasedStrategy(new SchemaBasedErrorStrategyImpl( - configuration, - mappingProvider, - dataAccessMapper - )) - .build(); -} - -// In your servlet or GraphQL setup: -GraphQL graphQL = GraphQL.newGraphQL(schema) - .queryExecutionStrategy(getCustomExecutionStrategy()) - .mutationExecutionStrategy(getCustomExecutionStrategy()) - .build(); -``` - -You can provide your own implementation of `DataAccessExceptionMapper` to customize how database exceptions are mapped to user-friendly messages. You can use the `ErrorMessageFormatter` class provided in this module to convert SQL error codes into readable messages. - -### Database Error Formatting - -The `ErrorMessageFormatter` class provides user-friendly messages for common SQL errors: - -| SQL State | Error Type | User Message | -|-----------|-------------------|-------------------------------------| -| 23505 | Unique constraint | "Duplicate value not allowed" | -| 23503 | Foreign key | "Referenced record does not exist" | -| 23502 | Not null | "Required field cannot be empty" | -| 23514 | Check constraint | "Value violates constraint: [name]" | -| 22001 | Data too long | "Value exceeds maximum length" | - -For check constraints, the formatter attempts to extract and humanize the constraint name (e.g., "year_check" becomes "year"). - -### Best Practices - -#### When to Use Ad Hoc Errors -- **Validation failures**: Invalid input that users can fix -- **Business rule violations**: Duplicate usernames, insufficient balance, etc. -- **Partial success**: When some operations succeed and others fail -- **User-actionable errors**: Errors users can understand and resolve - -#### When to Use Top-Level Errors -- **Authentication/Authorization**: Not logged in, insufficient permissions -- **System failures**: Database offline, service unavailable -- **Developer errors**: Malformed queries, type mismatches -- **Unexpected exceptions**: Null pointers, network timeouts - -#### Configuration Tips -1. **Define all user-facing errors in schema** with `@error` directives -2. **Let technical errors fall through** to become top-level errors -3. **Use descriptive error messages** in `@error` descriptions -4. **Include path information** in error types to help locate issues -5. **Keep error messages user-friendly** without exposing internals - -### Custom Exception Strategy Example - -Extend `SchemaBasedErrorStrategy` to handle application-specific exceptions. See [ExceptionStrategyImpl.java](../graphitron-example/graphitron-example-server/src/main/java/no/sikt/graphitron/example/exceptionhandling/SchemaBasedErrorStrategyImpl.java) in the example project: - -```java -public class ExceptionStrategyImpl extends SchemaBasedErrorStrategy { - - @Override - protected Object createDefaultDataAccessError( - String operationName, - String message) { - // Return your default error type for unmatched database exceptions - return new GenericDatabaseError(List.of(operationName), message); - } - - @Override - protected Object createDefaultBusinessLogicError( - String operationName, - String message) { - // Return your default error type for unmatched business logic exceptions - return new GenericError(List.of(operationName), message); - } -} -``` - -## Other Components - -### GraphQL Helpers -- **NodeIdStrategy**: Relay node ID encoding/decoding -- **QueryHelper**: jOOQ query building utilities -- **ResolverHelpers**: Data fetching utilities - -### Servlet Support -- **GraphitronServlet**: Base servlet for GraphQL endpoints -- **GraphitronInstrumentation**: Performance monitoring and logging diff --git a/graphitron-common/pom.xml b/graphitron-common/pom.xml deleted file mode 100644 index d4c4e6b29e..0000000000 --- a/graphitron-common/pom.xml +++ /dev/null @@ -1,84 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>no.sikt</groupId> - <artifactId>graphitron-parent</artifactId> - <version>${revision}${changelist}</version> - </parent> - - <artifactId>graphitron-common</artifactId> - <name>${project.groupId}:${project.artifactId}</name> - <url>https://github.com/sikt-no/graphitron</url> - - <dependencies> - <dependency> - <groupId>org.jooq</groupId> - <artifactId>jooq</artifactId> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>org.jooq</groupId> - <artifactId>jooq-codegen</artifactId> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>com.graphql-java</groupId> - <artifactId>graphql-java</artifactId> - </dependency> - <dependency> - <groupId>com.graphql-java</groupId> - <artifactId>graphql-java-extended-scalars</artifactId> - </dependency> - <dependency> - <groupId>com.apollographql.federation</groupId> - <artifactId>federation-graphql-java-support</artifactId> - </dependency> - <dependency> - <groupId>org.json</groupId> - <artifactId>json</artifactId> - <version>20251224</version> - </dependency> - <dependency> - <groupId>jakarta.platform</groupId> - <artifactId>jakarta.jakartaee-api</artifactId> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>org.apache.commons</groupId> - <artifactId>commons-text</artifactId> - </dependency> - <dependency> - <groupId>org.jetbrains</groupId> - <artifactId>annotations</artifactId> - </dependency> - <dependency> - <groupId>com.fasterxml.jackson.core</groupId> - <artifactId>jackson-databind</artifactId> - </dependency> - <dependency> - <groupId>com.fasterxml.jackson.datatype</groupId> - <artifactId>jackson-datatype-jsr310</artifactId> - </dependency> - - <dependency> - <groupId>org.junit.jupiter</groupId> - <artifactId>junit-jupiter-engine</artifactId> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>org.assertj</groupId> - <artifactId>assertj-core</artifactId> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>org.mockito</groupId> - <artifactId>mockito-junit-jupiter</artifactId> - <scope>test</scope> - </dependency> - </dependencies> -</project> diff --git a/graphitron-common/src/main/java/no/sikt/graphql/DefaultGraphitronContext.java b/graphitron-common/src/main/java/no/sikt/graphql/DefaultGraphitronContext.java deleted file mode 100644 index eacb82554b..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/DefaultGraphitronContext.java +++ /dev/null @@ -1,31 +0,0 @@ -package no.sikt.graphql; - -import graphql.schema.DataFetchingEnvironment; -import org.jooq.DSLContext; - -import static graphql.util.StringKit.capitalize; - -public class DefaultGraphitronContext implements GraphitronContext { - private final DSLContext ctx; - - public DefaultGraphitronContext(DSLContext ctx) { - this.ctx = ctx; - } - - @Override - public DSLContext getDslContext(DataFetchingEnvironment env) { - return ctx; - } - - @Override - public <T> T getContextArgument(DataFetchingEnvironment env, String name) { - return env.getGraphQlContext().get(name); - } - - @Override - public String getDataLoaderName(DataFetchingEnvironment env) { - return String.format("%sFor%s", - capitalize(env.getField().getName()), - env.getExecutionStepInfo().getObjectType().getName()); - } -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/GraphitronContext.java b/graphitron-common/src/main/java/no/sikt/graphql/GraphitronContext.java deleted file mode 100644 index 36fff2d4c7..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/GraphitronContext.java +++ /dev/null @@ -1,30 +0,0 @@ -package no.sikt.graphql; - -import graphql.schema.DataFetchingEnvironment; -import org.jooq.DSLContext; - -public interface GraphitronContext { - /*** - * Used by Graphitron so it can access the database. - * - * @param env An object containing information about what is being fetched etc. See https://www.graphql-java.com/documentation/data-fetching/#the-interesting-parts-of-the-datafetchingenvironment for more information. - * @return The jOOQ DSLContext that Graphitron should use. - */ - DSLContext getDslContext(DataFetchingEnvironment env); - - /*** - * Used by Graphitron to get the values for contextArguments. - * @param env An object containing information about what is being fetched etc. See https://www.graphql-java.com/documentation/data-fetching/#the-interesting-parts-of-the-datafetchingenvironment for more information. - * @param name The name of the contextArgument we're looking for - * @return The value of the contextArgument - * @param <T> The type of the contextArgument - */ - <T> T getContextArgument(DataFetchingEnvironment env, String name); - - /*** - * Used by Graphitron when it needs to use a DataLoader to carry out the operation. - * @param env An object containing information about what is being fetched etc. See https://www.graphql-java.com/documentation/data-fetching/#the-interesting-parts-of-the-datafetchingenvironment for more information. - * @return The name of the DataLoader that should be used - */ - String getDataLoaderName(DataFetchingEnvironment env); -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/NodeIdHandler.java b/graphitron-common/src/main/java/no/sikt/graphql/NodeIdHandler.java deleted file mode 100644 index 4c823320b4..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/NodeIdHandler.java +++ /dev/null @@ -1,7 +0,0 @@ -package no.sikt.graphql; - -import org.jooq.Table; - -public interface NodeIdHandler { - Table<?> getTable(String id); -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/NodeIdStrategy.java b/graphitron-common/src/main/java/no/sikt/graphql/NodeIdStrategy.java deleted file mode 100644 index e87b360f9e..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/NodeIdStrategy.java +++ /dev/null @@ -1,187 +0,0 @@ -package no.sikt.graphql; - -import org.jooq.*; -import org.jooq.impl.UpdatableRecordImpl; - -import java.nio.charset.StandardCharsets; -import java.time.LocalDate; -import java.time.OffsetDateTime; -import java.util.*; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -import static org.jooq.impl.DSL.noCondition; -import static org.jooq.impl.DSL.row; - -public class NodeIdStrategy { - public SelectField<String> createId(String typeId, Field<?>... keyColumnFields) { - return row(keyColumnFields) - .mapping(String.class, Functions.nullOnAnyNull((Object[] values) -> { - String[] stringValues = Arrays.stream(values) - .map(Object::toString) - .toArray(String[]::new); - return createId(typeId, stringValues); - })); - } - - public String createId(UpdatableRecordImpl<?> record, String typeId, Field<?>... keyColumnFields) { - var values = new String[keyColumnFields.length]; - record.into(keyColumnFields).into(values); - return createId(typeId, values); - } - - protected String createId(String typeId, String... keyColumns) { - var csv = Arrays - .stream(keyColumns) - .map(x -> x.replace(",", "%2C")) - .collect(Collectors.joining(",")); - var id = String.format("%s:%s", typeId, csv); - return enc(id); - } - - protected static String enc(String s) { - return Base64.getUrlEncoder().withoutPadding().encodeToString(s.getBytes(StandardCharsets.UTF_8)); - } - - public String getTypeId(String base64EncodedId) { - String id = dec(base64EncodedId); - return getTypeIdPartOf(base64EncodedId, id); - } - - private static String getTypeIdPartOf(String base64Id, String id) { - if (id.indexOf(':') < 0) { - throw new IllegalArgumentException(String.format("%s (%s) is not a valid id", base64Id, id)); - } - return id.substring(0, id.indexOf(':')); - } - - private static String dec(String s) { - try { - return new String(Base64.getUrlDecoder().decode(s), StandardCharsets.UTF_8); - } catch (NullPointerException | IllegalArgumentException e) { - throw new IllegalArgumentException(String.format("%s contains illegal characters", s), e); - } - } - - public Condition hasId(String typeId, String base64Id, Field<?>... keyColumnFields) { - return hasIds(typeId, Set.of(base64Id), keyColumnFields); - } - - public Condition hasId(String typeId, UpdatableRecordImpl<?> record, Field<?>... keyColumnFields) { - return Arrays.stream(keyColumnFields).anyMatch(it -> record.get(it) == null) ? - noCondition() - : hasIds(typeId, Set.of(createId(record, typeId, keyColumnFields)), keyColumnFields); - } - - public Condition hasIds(String typeId, List<UpdatableRecordImpl<?>> records, Field<?>... keyColumnFields) { - return hasIds(typeId, records.stream().map(it -> createId(it, typeId, keyColumnFields)).collect(Collectors.toSet()), keyColumnFields); - } - - public Condition hasIds(String typeId, Collection<String> base64Ids, Field<?>... keyColumnFields) { - var rows = getRows(typeId, keyColumnFields, new HashSet<>(base64Ids)); - return row(keyColumnFields).in(rows); - } - - /** - * Populates the record's PK columns from an encoded node ID. The PK fields end up - * with {@code changed=true}; under jOOQ's default {@code Settings.updatablePrimaryKeys=false} - * this has no effect on UPDATE statements, but consumers that flip that setting - * will see the PKs in UPDATE SET clauses. - */ - public void setId(UpdatableRecordImpl<?> record, String id, String typeId, Field<?>... idFields) { - setFields(record, id, typeId, idFields); - } - - /** - * Decode a node ID into a new table record, populating the supplied fields with the decoded key values. - * - * @throws IllegalArgumentException if {@code fields} is empty, if {@code typeId} does not match - * the type encoded in {@code id}, or if the number of decoded - * values does not match the number of fields. - */ - public <T extends UpdatableRecordImpl<T>> T nodeIdToTableRecord(String id, String typeId, List<TableField<T, ?>> fields) { - T record = fields.stream().findFirst() - .map(TableField::getTable) - .map(RecordQualifier::newRecord) - .orElseThrow(() -> new IllegalArgumentException("Cannot decode node ID for typeId '" + typeId + "' without target fields")); - - setFields(record, id, typeId, fields.toArray(Field[]::new)); - return record; - } - - public void setReferenceId(UpdatableRecordImpl<?> record, String id, String typeId, Field<?>... idFields) { - setFields(record, id, typeId, idFields); - } - - private void setFields(UpdatableRecordImpl<?> record, String id, String typeId, Field<?>... keyColumnFields) { - var values = new String[keyColumnFields.length]; - if (id != null) { - values = unpackIdValues(typeId, id, keyColumnFields); - } - record.from(values, keyColumnFields); - } - - private List<? extends RowN> getRows(String typeId, Field<?>[] fields, Set<String> base64Ids) { - return base64Ids.stream().map(base64Id -> { - String[] values = unpackIdValues(typeId, base64Id, fields); - - return row(IntStream.range(0, values.length) - .mapToObj(i -> { - var f = fields[i]; - return getFieldValue(f, values[i]); - }).toList()); - }).toList(); - } - - public String[] unpackIdValues(String typeId, String base64Id, Field<?>... fields) { - String id = dec(base64Id); - var foundTypeId = getTypeIdPartOf(id, id); - var keyPart = id.substring(id.indexOf(':') + 1); - - if (!Objects.equals(typeId, foundTypeId)) { - throw new IllegalArgumentException("TypeId " + typeId + " does not match foundTypeId " + foundTypeId); - } - - var values = Arrays - .stream(keyPart.split(",")) - .map(x -> x.replace("%2C", ",")) - .toArray(String[]::new); - - if (values.length != fields.length) { - throw new IllegalArgumentException(String.format("The number of base64 encoded ids: %s needs to match the number of key columns %s", - values.length, fields.length)); - } - return values; - } - - public <T> T getFieldValue(Field<T> field, String value) { - var fieldType = field.getDataType().getType(); - if (fieldType.isAssignableFrom(OffsetDateTime.class)) { - return (T) OffsetDateTime.parse(value); - } else if (fieldType.isAssignableFrom(LocalDate.class)) { - return (T) LocalDate.parse(value); - } - - return field.getDataType().convert(value); - } - - /** - * Check whether two strings are equal if decoded as node IDs. Returns {@code false} if decoding fails. - * - * <p>Used by the {@code _entities} query to match representation IDs from the router against - * IDs produced by the local service. These may differ in base64 padding while still decoding - * to the same value. - * - * <pre>{@code - * // "QzoxCg==" and "QzoxCg" both decode to "C:1\n", so this returns true: - * nodeIdStrategy.areEqualNodeIds("QzoxCg==", "QzoxCg"); - * }</pre> - */ - public boolean areEqualNodeIds(String a, String b) { - try { - return dec(a).equals(dec(b)); - } catch (Exception e) { - return false; - } - } -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/directives/GenerationDirective.java b/graphitron-common/src/main/java/no/sikt/graphql/directives/GenerationDirective.java deleted file mode 100644 index 6c5009b9c5..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/directives/GenerationDirective.java +++ /dev/null @@ -1,63 +0,0 @@ -package no.sikt.graphql.directives; - -import java.util.EnumSet; - -/** - * Contains all the available generator directives and their parameters. - * This must match what is defined in the Graphitron directive schema. - */ -public enum GenerationDirective { - SPLIT_QUERY("splitQuery"), - NOT_GENERATED("notGenerated"), - TABLE("table", EnumSet.of(GenerationDirectiveParam.NAME)), - FIELD("field", EnumSet.of(GenerationDirectiveParam.NAME, GenerationDirectiveParam.JAVA_NAME)), - /** - * @deprecated Use {@link #ORDER} with the index parameter instead. - */ - @Deprecated - INDEX("index", EnumSet.of(GenerationDirectiveParam.NAME)), - ORDER("order", EnumSet.of(GenerationDirectiveParam.INDEX, GenerationDirectiveParam.FIELDS, GenerationDirectiveParam.PRIMARY_KEY)), - SERVICE("service", EnumSet.of(GenerationDirectiveParam.SERVICE, GenerationDirectiveParam.CONTEXT_ARGUMENTS)), - TABLE_METHOD("tableMethod", EnumSet.of(GenerationDirectiveParam.TABLE_METHOD_REFERENCE, GenerationDirectiveParam.CONTEXT_ARGUMENTS)), - MULTITABLE_REFERENCE("multitableReference", EnumSet.of(GenerationDirectiveParam.ROUTES)), - RECORD("record", EnumSet.of(GenerationDirectiveParam.RECORD)), - ERROR("error", EnumSet.of(GenerationDirectiveParam.HANDLERS)), - MUTATION("mutation", EnumSet.of(GenerationDirectiveParam.TYPE)), - LOOKUP_KEY("lookupKey"), - REFERENCE("reference", EnumSet.of(GenerationDirectiveParam.PATH)), - ENUM("enum", EnumSet.of(GenerationDirectiveParam.ENUM)), - CONDITION("condition", EnumSet.of(GenerationDirectiveParam.CONDITION, GenerationDirectiveParam.OVERRIDE, GenerationDirectiveParam.CONTEXT_ARGUMENTS)), - ORDER_BY("orderBy"), - DEFAULT_ORDER("defaultOrder", EnumSet.of(GenerationDirectiveParam.INDEX, GenerationDirectiveParam.FIELDS, GenerationDirectiveParam.PRIMARY_KEY, GenerationDirectiveParam.DIRECTION)), - DISCRIMINATE("discriminate", EnumSet.of(GenerationDirectiveParam.ON)), - DISCRIMINATOR("discriminator", EnumSet.of(GenerationDirectiveParam.VALUE)), - EXTERNAL_FIELD("externalField"), - NODE("node", EnumSet.of(GenerationDirectiveParam.TYPE_ID, GenerationDirectiveParam.KEY_COLUMNS)), - NODE_ID("nodeId", EnumSet.of(GenerationDirectiveParam.TYPE_NAME)), - CONSTRUCT_TYPE("experimental_constructType", EnumSet.of(GenerationDirectiveParam.SELECTION)), - PROCEDURE_CALL("experimental_procedureCall", EnumSet.of(GenerationDirectiveParam.PROCEDURE, GenerationDirectiveParam.ARGUMENTS, GenerationDirectiveParam.TARGET)); - - private final String name; - - private final EnumSet<GenerationDirectiveParam> paramSet; - - GenerationDirective(String name) { - this.name = name; - this.paramSet = EnumSet.noneOf(GenerationDirectiveParam.class); - } - - GenerationDirective(String name, EnumSet<GenerationDirectiveParam> paramSet) { - this.name = name; - this.paramSet = paramSet; - } - - public String getName() { - return name; - } - - public void checkParamIsValid(GenerationDirectiveParam param) { - if (!paramSet.contains(param)) { - throw new IllegalArgumentException("Directive " + name + " has no parameter called " + param.getName() + "."); - } - } -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/directives/GenerationDirectiveParam.java b/graphitron-common/src/main/java/no/sikt/graphql/directives/GenerationDirectiveParam.java deleted file mode 100644 index c577c8ccaf..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/directives/GenerationDirectiveParam.java +++ /dev/null @@ -1,56 +0,0 @@ -package no.sikt.graphql.directives; - -/** - * Contains all the available directive parameters. - * This must match what is defined in the Graphitron directive schema. - */ -public enum GenerationDirectiveParam { - KEY("key"), - NAME("name"), - JAVA_NAME("javaName"), - TABLE("table"), - CONDITION("condition"), - OVERRIDE("override"), - PATH("path"), - TYPE("typeName"), - ENUM("enumReference"), - SERVICE("service"), - TABLE_METHOD_REFERENCE("tableMethodReference"), - ROUTES("routes"), - ERROR("error"), - METHOD("method"), - - RECORD("record"), - HANDLERS("handlers"), - HANDLER("handler"), - CLASS_NAME("className"), - CONTEXT_ARGUMENTS("contextArguments"), - CODE("code"), - SQL_STATE("sqlState"), - MATCHES("matches"), - DESCRIPTION("description"), - ON("on"), - VALUE("value"), - TYPE_ID("typeId"), - KEY_COLUMNS("keyColumns"), - TYPE_NAME("typeName"), - INDEX("index"), - FIELDS("fields"), - PRIMARY_KEY("primaryKey"), - COLLATE("collate"), - DIRECTION("direction"), - SELECTION("selection"), - PROCEDURE("procedure"), - ARGUMENTS("arguments"), - TARGET("target"); - - private final String name; - - GenerationDirectiveParam(String name) { - this.name = name; - } - - public String getName() { - return name; - } -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/exception/CustomExecutionStrategy.java b/graphitron-common/src/main/java/no/sikt/graphql/exception/CustomExecutionStrategy.java deleted file mode 100644 index 0422256b65..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/exception/CustomExecutionStrategy.java +++ /dev/null @@ -1,41 +0,0 @@ -package no.sikt.graphql.exception; - -import graphql.execution.AsyncExecutionStrategy; -import graphql.execution.ExecutionStrategyParameters; -import graphql.schema.DataFetchingEnvironment; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Optional; -import java.util.concurrent.CompletableFuture; - -/** - * Custom execution strategy that routes exceptions to either schema-based or top-level errors. - * <p> - * This is the main entry point for exception handling in the GraphQL execution layer. - * It first attempts to handle exceptions as schema-based errors (via SchemaBasedErrorStrategy), - * and if that's not possible, falls back to top-level errors (via TopLevelErrorHandler). - */ -public class CustomExecutionStrategy extends AsyncExecutionStrategy { - private static final Logger LOGGER = LoggerFactory.getLogger(CustomExecutionStrategy.class); - - private final SchemaBasedErrorStrategy schemaBasedErrorStrategy; - - public CustomExecutionStrategy(TopLevelErrorHandler topLevelErrorHandler, SchemaBasedErrorStrategy schemaBasedErrorStrategy) { - super(topLevelErrorHandler); - this.schemaBasedErrorStrategy = schemaBasedErrorStrategy; - } - - @Override - protected <T> CompletableFuture<T> handleFetchingException(DataFetchingEnvironment environment, ExecutionStrategyParameters parameters, Throwable e) { - Optional<CompletableFuture<Object>> schemaBasedResult = schemaBasedErrorStrategy.handleException(environment, e); - - if (schemaBasedResult.isPresent()) { - LOGGER.debug("Exception handled as schema-based error:", e); - return (CompletableFuture<T>) schemaBasedResult.get(); - } - - LOGGER.debug("Exception will become top-level error:", e); - return super.handleFetchingException(environment, parameters, e); - } -} \ No newline at end of file diff --git a/graphitron-common/src/main/java/no/sikt/graphql/exception/DataAccessExceptionContentToErrorMapping.java b/graphitron-common/src/main/java/no/sikt/graphql/exception/DataAccessExceptionContentToErrorMapping.java deleted file mode 100644 index 006f3faed1..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/exception/DataAccessExceptionContentToErrorMapping.java +++ /dev/null @@ -1,24 +0,0 @@ -package no.sikt.graphql.exception; - -import org.jooq.exception.DataAccessException; - -import java.util.List; - -public class DataAccessExceptionContentToErrorMapping implements ExceptionContentToErrorMapping { - final private DataAccessMatcher dataAccessExceptionMapping; - final private ErrorHandler errorHandler; - - public DataAccessExceptionContentToErrorMapping(DataAccessMatcher dataAccessExceptionMapping, ErrorHandler errorHandler) { - this.dataAccessExceptionMapping = dataAccessExceptionMapping; - this.errorHandler = errorHandler; - } - - public boolean matches(DataAccessException exception) { - return dataAccessExceptionMapping.matches(exception); - } - - @Override - public Object handleError(List<String> path, String defaultMessage) { - return errorHandler.handleError(path, defaultMessage); - } -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/exception/DataAccessExceptionMapper.java b/graphitron-common/src/main/java/no/sikt/graphql/exception/DataAccessExceptionMapper.java deleted file mode 100644 index 4d9d49c4ad..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/exception/DataAccessExceptionMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package no.sikt.graphql.exception; - -import org.jooq.exception.DataAccessException; - -public interface DataAccessExceptionMapper { - - default String getMsgFromException(DataAccessException exception) { - return exception.getMessage(); - } -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/exception/DataAccessExceptionMapperImpl.java b/graphitron-common/src/main/java/no/sikt/graphql/exception/DataAccessExceptionMapperImpl.java deleted file mode 100644 index 05e6663360..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/exception/DataAccessExceptionMapperImpl.java +++ /dev/null @@ -1,58 +0,0 @@ -package no.sikt.graphql.exception; - -import org.jooq.exception.DataAccessException; - -/** - * Implementation of DataAccessExceptionMapper that uses ErrorMessageFormatter - * to provide consistent and user-friendly error messages for database exceptions. - */ -public class DataAccessExceptionMapperImpl implements DataAccessExceptionMapper { - - private final ErrorMessageFormatter formatter; - private final boolean includeDebugInfo; - - /** - * Create a mapper with default settings (no debug info). - */ - public DataAccessExceptionMapperImpl() { - this(new ErrorMessageFormatter(), false); - } - - /** - * Create a mapper with custom formatter and debug settings. - * - * @param formatter The error message formatter to use - * @param includeDebugInfo Whether to include technical details in error messages - */ - public DataAccessExceptionMapperImpl(ErrorMessageFormatter formatter, boolean includeDebugInfo) { - this.formatter = formatter; - this.includeDebugInfo = includeDebugInfo; - } - - @Override - public String getMsgFromException(DataAccessException exception) { - String userMessage = formatter.formatDataAccessException(exception); - - if (includeDebugInfo) { - return appendDebugInfo(userMessage, exception); - } - - return userMessage; - } - - /** - * Append debug information to the error message. - * Useful in development environments. - */ - private String appendDebugInfo(String message, DataAccessException exception) { - StringBuilder debugMessage = new StringBuilder(message); - - var sqlException = exception.getCause(java.sql.SQLException.class); - if (sqlException != null) { - debugMessage.append(" [SQL State: ").append(sqlException.getSQLState()); - debugMessage.append(", Error Code: ").append(sqlException.getErrorCode()).append("]"); - } - - return debugMessage.toString(); - } -} \ No newline at end of file diff --git a/graphitron-common/src/main/java/no/sikt/graphql/exception/DataAccessMatcher.java b/graphitron-common/src/main/java/no/sikt/graphql/exception/DataAccessMatcher.java deleted file mode 100644 index 0a454e47e1..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/exception/DataAccessMatcher.java +++ /dev/null @@ -1,32 +0,0 @@ -package no.sikt.graphql.exception; - -import org.jooq.exception.DataAccessException; - -import java.sql.SQLException; - -/** - * Matcher for DataAccessException that checks SQL error code, SQL state, and message content. - * This class extends GenericExceptionMatcher to add SQL-specific matching logic. - */ -public class DataAccessMatcher extends GenericExceptionMatcher { - private final String errorCode; - private final String sqlState; - - public DataAccessMatcher(String errorCode, String sqlState, String substringOfExceptionMessage) { - super(DataAccessException.class.getName(), substringOfExceptionMessage); - this.errorCode = errorCode; - this.sqlState = sqlState; - } - - boolean matches(DataAccessException exception) { - SQLException sqlException = exception.getCause(SQLException.class); - - if (sqlException == null) { - return false; - } - - boolean codeMatches = errorCode == null || errorCode.equals(Integer.toString(sqlException.getErrorCode())); - boolean sqlStateMatches = sqlState == null || sqlState.equals(sqlException.getSQLState()); - return codeMatches && sqlStateMatches && super.matches(exception); - } -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/exception/ErrorMessageFormatter.java b/graphitron-common/src/main/java/no/sikt/graphql/exception/ErrorMessageFormatter.java deleted file mode 100644 index 8066d9a1a1..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/exception/ErrorMessageFormatter.java +++ /dev/null @@ -1,86 +0,0 @@ -package no.sikt.graphql.exception; - -import org.jooq.exception.DataAccessException; - -import java.sql.SQLException; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Simple formatter for database exception error messages. - * Provides basic user-friendly messages for common SQL errors. - */ -public class ErrorMessageFormatter { - - // Pattern to extract constraint names from database error messages - private static final Pattern CONSTRAINT_PATTERN = Pattern.compile( - "constraint\\s+[\"']?([^\"'\\s]+)[\"']?", - Pattern.CASE_INSENSITIVE - ); - - /** - * Extract a user-friendly message from a DataAccessException. - */ - public String formatDataAccessException(DataAccessException exception) { - SQLException sqlException = exception.getCause(SQLException.class); - - if (sqlException == null || sqlException.getMessage() == null) { - return getDefaultMessage(exception); - } - - String sqlMessage = sqlException.getMessage(); - String sqlState = sqlException.getSQLState(); - - // Handle common SQL states with simple messages - if (sqlState != null) { - return switch (sqlState) { - case "23505" -> "Duplicate value not allowed"; - case "23503" -> "Referenced record does not exist"; - case "23502" -> "Required field cannot be empty"; - case "23514" -> formatCheckConstraint(sqlMessage); - case "22001" -> "Value exceeds maximum length"; - default -> cleanupMessage(sqlMessage); - }; - } - - return cleanupMessage(sqlMessage); - } - - /** - * Format check constraint violation - try to extract the constraint name. - */ - private String formatCheckConstraint(String sqlMessage) { - Matcher matcher = CONSTRAINT_PATTERN.matcher(sqlMessage); - if (matcher.find()) { - String constraintName = matcher.group(1); - // Simple cleanup: remove common suffixes and convert to readable format - String cleaned = constraintName.toLowerCase() - .replaceAll("_check$", "") - .replace('_', ' '); - return "Value violates constraint: " + cleaned; - } - return "Value does not meet validation requirements"; - } - - /** - * Basic cleanup of SQL error messages. - */ - private String cleanupMessage(String message) { - // Remove common prefixes and normalize - return message - .replaceAll("ERROR:\\s*", "") - .replaceAll("\\s+", " ") - .trim(); - } - - /** - * Get default message when SQL exception is not available. - */ - private String getDefaultMessage(Throwable exception) { - String message = exception.getMessage(); - if (message == null || message.isBlank()) { - return "Database operation failed"; - } - return cleanupMessage(message); - } -} \ No newline at end of file diff --git a/graphitron-common/src/main/java/no/sikt/graphql/exception/ExceptionContentToErrorMapping.java b/graphitron-common/src/main/java/no/sikt/graphql/exception/ExceptionContentToErrorMapping.java deleted file mode 100644 index db440fbe36..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/exception/ExceptionContentToErrorMapping.java +++ /dev/null @@ -1,12 +0,0 @@ -package no.sikt.graphql.exception; - -import java.util.List; - -public interface ExceptionContentToErrorMapping { - Object handleError(List<String> path, String defaultMessage); - - @FunctionalInterface - interface ErrorHandler { - Object handleError(List<String> path, String defaultMessage); - } -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/exception/ExceptionHandlingBuilder.java b/graphitron-common/src/main/java/no/sikt/graphql/exception/ExceptionHandlingBuilder.java deleted file mode 100644 index 84e96d2907..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/exception/ExceptionHandlingBuilder.java +++ /dev/null @@ -1,73 +0,0 @@ -package no.sikt.graphql.exception; - -import graphql.execution.ExecutionStrategy; - -/** - * Builder for creating a fully configured exception handling setup for GraphQL Java. - * <p> - * This builder sets up both schema-based (ad-hoc) and top-level error handling. - * Schema-based errors appear in payload "errors" fields, while top-level errors - * appear in the GraphQL response's root "errors" array. - */ -public class ExceptionHandlingBuilder { - - private DataAccessExceptionMapper dataAccessMapper; - private SchemaBasedErrorStrategy schemaBasedStrategy; - private TopLevelErrorHandler topLevelErrorHandler; - - - /** - * Set the data access exception mapper. - * This mapper extracts messages from database exceptions. - */ - public ExceptionHandlingBuilder withDataAccessMapper(DataAccessExceptionMapper dataAccessMapper) { - this.dataAccessMapper = dataAccessMapper; - return this; - } - - /** - * Set the schema-based error strategy implementation. - * This handles exceptions that should become errors in payload fields. - */ - public ExceptionHandlingBuilder withSchemaBasedStrategy(SchemaBasedErrorStrategy strategy) { - this.schemaBasedStrategy = strategy; - return this; - } - - /** - * Set a custom top-level error handler. - * If not set, a default handler will be created using the data access mapper. - * This handles exceptions that don't match schema @error directives. - */ - public ExceptionHandlingBuilder withTopLevelErrorHandler(TopLevelErrorHandler handler) { - this.topLevelErrorHandler = handler; - return this; - } - - /** - * Build the configured execution strategy. - * - * @return A CustomExecutionStrategy with all components properly wired - * @throws IllegalStateException if required components are not set - */ - public ExecutionStrategy build() { - // Validate required components - if (schemaBasedStrategy == null) { - throw new IllegalStateException( - "Schema-based error strategy must be provided. Call withSchemaBasedStrategy()." - ); - } - - // Create top-level error handler if not provided - if (topLevelErrorHandler == null) { - if (dataAccessMapper == null) { - throw new IllegalStateException( - "Either provide a TopLevelErrorHandler or a DataAccessExceptionMapper to create the default handler." - ); - } - topLevelErrorHandler = new TopLevelErrorHandler(dataAccessMapper); - } - - return new CustomExecutionStrategy(topLevelErrorHandler, schemaBasedStrategy); - } -} \ No newline at end of file diff --git a/graphitron-common/src/main/java/no/sikt/graphql/exception/ExceptionStrategyConfiguration.java b/graphitron-common/src/main/java/no/sikt/graphql/exception/ExceptionStrategyConfiguration.java deleted file mode 100644 index 001d029345..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/exception/ExceptionStrategyConfiguration.java +++ /dev/null @@ -1,33 +0,0 @@ -package no.sikt.graphql.exception; - -import java.util.List; -import java.util.Map; -import java.util.Set; - -/** - * Defines the structure for exception strategy configurations. - * Implementations of this interface should provide mappings of supported exception types to operations - * and mappings of field names to payload creators. - */ -public interface ExceptionStrategyConfiguration { - /** - * Gets a map where the key is the exception type to be handled, - * and the value is a list of mutation names that should be error-handled for this exception. - * - * @return a map of exception types to mutation names - */ - Map<Class<? extends Throwable>, Set<String>> getFieldsForException(); - - /** - * Gets a map where the key is the mutation name, - * and the value is a PayloadCreator that creates the payload for the mutation. - * - * @return a map of mutation names to payload creators - */ - Map<String, PayloadCreator> getPayloadForField(); - - @FunctionalInterface - interface PayloadCreator { - Object createPayload(List<?> errors); - } -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/exception/ExceptionToErrorMappingProvider.java b/graphitron-common/src/main/java/no/sikt/graphql/exception/ExceptionToErrorMappingProvider.java deleted file mode 100644 index 0a0b0ee6a7..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/exception/ExceptionToErrorMappingProvider.java +++ /dev/null @@ -1,20 +0,0 @@ -package no.sikt.graphql.exception; - -import java.util.List; -import java.util.Map; - -public interface ExceptionToErrorMappingProvider { - /** - * Returns DataAccessException mappings for operations. - * - * @return Map with operation field names as keys and corresponding exception-to-error mappings as values. - */ - Map<String, List<DataAccessExceptionContentToErrorMapping>> getDataAccessMappingsForOperation(); - - /** - * Returns generic exception mappings for operations. - * - * @return Map with operation field names as keys and corresponding exception-to-error mappings as values. - */ - Map<String, List<GenericExceptionContentToErrorMapping>> getGenericMappingsForOperation(); -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/exception/GenericExceptionContentToErrorMapping.java b/graphitron-common/src/main/java/no/sikt/graphql/exception/GenericExceptionContentToErrorMapping.java deleted file mode 100644 index ea374b5a47..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/exception/GenericExceptionContentToErrorMapping.java +++ /dev/null @@ -1,23 +0,0 @@ -package no.sikt.graphql.exception; - -import java.util.List; - -public class GenericExceptionContentToErrorMapping implements ExceptionContentToErrorMapping { - final private GenericExceptionMatcher genericExceptionMatcher; - final private ErrorHandler errorHandler; - - public GenericExceptionContentToErrorMapping(GenericExceptionMatcher genericExceptionMatcher, ErrorHandler errorHandler) { - this.genericExceptionMatcher = genericExceptionMatcher; - this.errorHandler = errorHandler; - } - - public boolean matches(Throwable exception) { - return genericExceptionMatcher.matches(exception); - } - - @Override - public Object handleError(List<String> path, String defaultMessage) { - return errorHandler.handleError(path, defaultMessage); - } - -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/exception/GenericExceptionMatcher.java b/graphitron-common/src/main/java/no/sikt/graphql/exception/GenericExceptionMatcher.java deleted file mode 100644 index 4667d9cb4c..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/exception/GenericExceptionMatcher.java +++ /dev/null @@ -1,47 +0,0 @@ -package no.sikt.graphql.exception; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Objects; -import java.util.Optional; -import java.util.stream.Stream; - -/** - * Generic matcher for exceptions that checks class type and message content. - * Can match against the full exception cause chain. - */ -public class GenericExceptionMatcher { - private static final Logger LOGGER = LoggerFactory.getLogger(GenericExceptionMatcher.class); - - private final String substringOfExceptionMessage; - private final String fullyQualifiedClassName; - - public GenericExceptionMatcher(String fullyQualifiedClassName, String substringOfExceptionMessage) { - this.substringOfExceptionMessage = substringOfExceptionMessage; - this.fullyQualifiedClassName = fullyQualifiedClassName; - } - - boolean matches(Throwable throwable) { - return streamCauses(throwable) - .anyMatch(it -> { - try { - return Class.forName(fullyQualifiedClassName, true, Thread.currentThread().getContextClassLoader()) - .isInstance(it) && messageMatches(it.getMessage()); - } catch (ClassNotFoundException e) { - LOGGER.warn("Could not find exception class '{}'. Ensure the class is on the classpath.", fullyQualifiedClassName); - return false; - } - }); - } - - private Stream<Throwable> streamCauses(Throwable throwable) { - return Stream.iterate(throwable, Objects::nonNull, Throwable::getCause); - } - - private boolean messageMatches(String actualExceptionMsg) { - return Optional.ofNullable(this.substringOfExceptionMessage) - .map(it -> actualExceptionMsg != null && actualExceptionMsg.contains(it)) - .orElse(true); - } -} \ No newline at end of file diff --git a/graphitron-common/src/main/java/no/sikt/graphql/exception/SchemaBasedErrorStrategy.java b/graphitron-common/src/main/java/no/sikt/graphql/exception/SchemaBasedErrorStrategy.java deleted file mode 100644 index 19ff113ab8..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/exception/SchemaBasedErrorStrategy.java +++ /dev/null @@ -1,129 +0,0 @@ -package no.sikt.graphql.exception; - -import graphql.execution.ResultPath; -import graphql.schema.DataFetchingEnvironment; -import org.jooq.exception.DataAccessException; - -import java.util.List; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; - -/** - * Strategy for handling exceptions as schema-based (ad-hoc) errors. - * <p> - * Schema-based errors are part of your GraphQL schema, typically in mutation/query payloads - * with an "errors" field. These are used for expected business logic errors like validation - * failures, constraint violations, or any errors that users can understand and potentially fix. - * <p> - * This strategy only handles exceptions that: - * 1. Occur in operations that return a payload with an "errors" field - * 2. Match the @error directive configuration in the schema - * <p> - * Exceptions not handled here fall through to become top-level errors. - */ -public abstract class SchemaBasedErrorStrategy { - - private final ExceptionStrategyConfiguration configuration; - private final SchemaErrorMapper schemaErrorMapper; - - public SchemaBasedErrorStrategy(ExceptionStrategyConfiguration configuration, - ExceptionToErrorMappingProvider mappingProvider, - DataAccessExceptionMapper dataAccessExceptionMapper) { - this.configuration = configuration; - this.schemaErrorMapper = new SchemaErrorMapper( - mappingProvider.getDataAccessMappingsForOperation(), - mappingProvider.getGenericMappingsForOperation(), - dataAccessExceptionMapper - ); - } - - /** - * Attempts to handle an exception as a schema-based error. - * Returns an Optional containing the error payload if the exception matches schema configuration, - * or Optional.empty() if the exception should become a top-level error instead. - */ - public Optional<CompletableFuture<Object>> handleException(DataFetchingEnvironment environment, Throwable thrownException) { - String operationName = environment.getFieldDefinition().getName(); - - // Unwrap CompletionException from async operations - Throwable exception = unwrapCompletionException(thrownException); - - // Check if this exception type is configured for handling - for (var entry : configuration.getFieldsForException().entrySet()) { - Class<? extends Throwable> exceptionType = entry.getKey(); - if (exceptionType.isInstance(exception) && - entry.getValue().contains(operationName)) { - - // Delegate to specific handler based on exception type - if (exception instanceof ValidationViolationGraphQLException) { - return handleValidationException( - (ValidationViolationGraphQLException) exception, - operationName); - } else if (exception instanceof IllegalArgumentException) { - return handleIllegalArgumentException( - (IllegalArgumentException) exception, - operationName, - environment.getExecutionStepInfo().getPath()); - } else if (exception instanceof DataAccessException) { - return handleDataAccessException( - (DataAccessException) exception, - operationName); - } else { - return handleBusinessLogicException(exception, operationName); - } - } - } - return Optional.empty(); - } - - /** - * Unwraps CompletionException from async operations. - * If the exception is a CompletionException with a cause, returns the cause. - * Otherwise, returns the exception itself. - */ - private Throwable unwrapCompletionException(Throwable throwable) { - if (throwable instanceof java.util.concurrent.CompletionException && throwable.getCause() != null) { - return throwable.getCause(); - } - return throwable; - } - - /** - * Handle validation exceptions. Must be implemented by subclasses. - */ - public abstract Optional<CompletableFuture<Object>> handleValidationException(ValidationViolationGraphQLException e, String operationName); - - /** - * Handle illegal argument exceptions. Must be implemented by subclasses. - */ - public abstract Optional<CompletableFuture<Object>> handleIllegalArgumentException(IllegalArgumentException e, String operationName, ResultPath path); - - protected Optional<CompletableFuture<Object>> handleDataAccessException(DataAccessException e, String operationName) { - Object error = schemaErrorMapper.mapDataAccessException( - e, - operationName, - this::createDefaultDataAccessError - ); - return createPayload(operationName, List.of(error)); - } - - protected Optional<CompletableFuture<Object>> handleBusinessLogicException(Throwable e, String operationName) { - return schemaErrorMapper.mapBusinessLogicException(e, operationName) - .flatMap(error -> createPayload(operationName, List.of(error))); - } - - /** - * Create a payload containing the errors for the operation. - */ - protected Optional<CompletableFuture<Object>> createPayload(String operationName, List<?> errors) { - return Optional.ofNullable(configuration.getPayloadForField().get(operationName)) - .map(creator -> creator.createPayload(errors)) - .map(CompletableFuture::completedFuture); - } - - /** - * Create a default error for data access exceptions. - * Can be overridden by subclasses to customize the default error format. - */ - protected abstract Object createDefaultDataAccessError(String operationName, String message); -} \ No newline at end of file diff --git a/graphitron-common/src/main/java/no/sikt/graphql/exception/SchemaErrorMapper.java b/graphitron-common/src/main/java/no/sikt/graphql/exception/SchemaErrorMapper.java deleted file mode 100644 index e2b21b25ab..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/exception/SchemaErrorMapper.java +++ /dev/null @@ -1,77 +0,0 @@ -package no.sikt.graphql.exception; - -import org.jooq.exception.DataAccessException; - -import java.util.List; -import java.util.Map; -import java.util.Optional; - -/** - * Maps exceptions to schema-based error objects. - * <p> - * This mapper converts Java exceptions into GraphQL error objects that are defined - * in the schema (via @error directives). These errors become part of the data response - * in payload fields, not top-level errors. - * <p> - * Only exceptions that match the configured @error directives are mapped. - * Unmatched exceptions are not handled here and will become top-level errors. - */ -public class SchemaErrorMapper { - - private final Map<String, List<DataAccessExceptionContentToErrorMapping>> dataAccessMappingsForOperation; - private final Map<String, List<GenericExceptionContentToErrorMapping>> genericMappingsForOperation; - private final DataAccessExceptionMapper dataAccessExceptionMapper; - - public SchemaErrorMapper( - Map<String, List<DataAccessExceptionContentToErrorMapping>> dataAccessMappingsForOperation, - Map<String, List<GenericExceptionContentToErrorMapping>> genericMappingsForOperation, - DataAccessExceptionMapper dataAccessExceptionMapper) { - this.dataAccessMappingsForOperation = dataAccessMappingsForOperation; - this.genericMappingsForOperation = genericMappingsForOperation; - this.dataAccessExceptionMapper = dataAccessExceptionMapper; - } - - /** - * Maps a DataAccessException to an error object for the specified operation. - * First tries to find a matching configured mapping, otherwise returns a default error. - */ - public Object mapDataAccessException(DataAccessException exception, String operationName, DataAccessDefaultErrorCreator defaultErrorCreator) { - return Optional.ofNullable(dataAccessMappingsForOperation.get(operationName)) - .flatMap(mappings -> findMatchingDataAccessMapping(exception, operationName, mappings)) - .orElseGet(() -> defaultErrorCreator.createDefaultError(operationName, dataAccessExceptionMapper.getMsgFromException(exception))); - } - - /** - * Maps a generic business logic exception to an error object for the specified operation. - * Returns an Optional containing the mapped error if a matching mapping is found. - */ - public Optional<Object> mapBusinessLogicException(Throwable exception, String operationName) { - return Optional.ofNullable(genericMappingsForOperation.get(operationName)) - .flatMap(mappings -> findMatchingGenericMapping(exception, operationName, mappings)); - } - - private Optional<Object> findMatchingDataAccessMapping(DataAccessException exception, String operationName, - List<DataAccessExceptionContentToErrorMapping> mappings) { - return mappings.stream() - .filter(mapping -> mapping.matches(exception)) - .findFirst() - .map(mapping -> mapping.handleError(List.of(operationName), exception.getMessage())); - } - - private Optional<Object> findMatchingGenericMapping(Throwable exception, String operationName, - List<GenericExceptionContentToErrorMapping> mappings) { - return mappings.stream() - .filter(mapping -> mapping.matches(exception)) - .findFirst() - .map(mapping -> mapping.handleError(List.of(operationName), exception.getMessage())); - } - - /** - * Functional interface for creating default DataAccess errors. - * This is used when no specific mapping is found for a DataAccessException. - */ - @FunctionalInterface - public interface DataAccessDefaultErrorCreator { - Object createDefaultError(String operationName, String message); - } -} \ No newline at end of file diff --git a/graphitron-common/src/main/java/no/sikt/graphql/exception/TopLevelErrorHandler.java b/graphitron-common/src/main/java/no/sikt/graphql/exception/TopLevelErrorHandler.java deleted file mode 100644 index ce39a802d7..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/exception/TopLevelErrorHandler.java +++ /dev/null @@ -1,70 +0,0 @@ -package no.sikt.graphql.exception; - -import graphql.GraphQLError; -import graphql.GraphqlErrorBuilder; -import graphql.execution.DataFetcherExceptionHandlerParameters; -import graphql.execution.DataFetcherExceptionHandlerResult; -import graphql.execution.SimpleDataFetcherExceptionHandler; -import org.jooq.exception.DataAccessException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.List; -import java.util.UUID; -import java.util.concurrent.CompletableFuture; - -/** - * Handles exceptions that should become top-level GraphQL errors. - * <p> - * Top-level errors appear in the standard GraphQL "errors" array at the root of the response. - * These are used for technical/exceptional issues like system failures, authentication errors, - * or any unhandled exceptions that aren't part of normal business logic flow. - * <p> - * Exceptions that reach this handler were not handled by SchemaBasedErrorStrategy, - * meaning they don't have corresponding @error directives in the schema. - */ -public class TopLevelErrorHandler extends SimpleDataFetcherExceptionHandler { - private static final Logger LOGGER = LoggerFactory.getLogger(TopLevelErrorHandler.class); - - private final DataAccessExceptionMapper dataAccessExceptionMapper; - - public TopLevelErrorHandler(DataAccessExceptionMapper dataAccessExceptionMapper) { - this.dataAccessExceptionMapper = dataAccessExceptionMapper; - } - - @Override - public CompletableFuture<DataFetcherExceptionHandlerResult> handleException(DataFetcherExceptionHandlerParameters handlerParameters) { - Throwable exception = unwrap(handlerParameters.getException()); - List<GraphQLError> errors; - - if (exception instanceof ValidationViolationGraphQLException) { - errors = ((ValidationViolationGraphQLException) exception).getUnderlyingErrors(); - } else if (exception instanceof IllegalArgumentException) { - errors = List.of(GraphqlErrorBuilder.newError(handlerParameters.getDataFetchingEnvironment()) - .message(exception.getMessage()) - .build()); - } else if (exception instanceof DataAccessException) { - var exceptionID = UUID.randomUUID(); - LOGGER.error("DataAccessException with id {} caused an unhandled, generic GraphQL-error: ", exceptionID, exception); - errors = List.of( - GraphqlErrorBuilder.newError(handlerParameters.getDataFetchingEnvironment()) - .message("An exception occurred. The error has been logged with id " + exceptionID + ": " + dataAccessExceptionMapper.getMsgFromException((DataAccessException) exception)) - .build() - ); - } else { - var exceptionID = UUID.randomUUID(); - LOGGER.error("Exception with id {} caused an unhandled, generic GraphQL-error: ", exceptionID, exception); - - // Return a generic exception message that does not expose the internal cause - errors = List.of( - GraphqlErrorBuilder.newError(handlerParameters.getDataFetchingEnvironment()) - .message("An exception occurred. The error has been logged with id " + exceptionID + ".") - .build() - ); - } - return CompletableFuture.completedFuture( - DataFetcherExceptionHandlerResult.newResult() - .errors(errors) - .build()); - } -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/exception/ValidationViolationGraphQLException.java b/graphitron-common/src/main/java/no/sikt/graphql/exception/ValidationViolationGraphQLException.java deleted file mode 100644 index 99c7bcdbf1..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/exception/ValidationViolationGraphQLException.java +++ /dev/null @@ -1,16 +0,0 @@ -package no.sikt.graphql.exception; - -import graphql.GraphQLError; -import graphql.execution.AbortExecutionException; - -import java.io.Serial; -import java.util.Collection; - -public class ValidationViolationGraphQLException extends AbortExecutionException { - @Serial - private static final long serialVersionUID = 1L; - - public ValidationViolationGraphQLException(Collection<GraphQLError> validationErrors) { - super(validationErrors); - } -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/federation/FieldSetKey.java b/graphitron-common/src/main/java/no/sikt/graphql/federation/FieldSetKey.java deleted file mode 100644 index 28b84cb8aa..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/federation/FieldSetKey.java +++ /dev/null @@ -1,8 +0,0 @@ -package no.sikt.graphql.federation; - -import java.util.List; - -public interface FieldSetKey { - List<String> getKeys(); - List<FieldSetKey> getNestedKeys(); -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/federation/fieldsets/CompoundFieldSetKey.java b/graphitron-common/src/main/java/no/sikt/graphql/federation/fieldsets/CompoundFieldSetKey.java deleted file mode 100644 index 55f49f022b..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/federation/fieldsets/CompoundFieldSetKey.java +++ /dev/null @@ -1,18 +0,0 @@ -package no.sikt.graphql.federation.fieldsets; - -import no.sikt.graphql.federation.FieldSetKey; - -import java.util.List; -import java.util.stream.Collectors; - -public record CompoundFieldSetKey(List<FieldSetKey> keys) implements FieldSetKey { - @Override - public List<String> getKeys() { // A compound key can not contain another compound key directly, so all instances here will have exactly 1 key. - return keys.stream().filter(it -> it.getNestedKeys().isEmpty()).map(it -> it.getKeys().get(0)).collect(Collectors.toList()); - } - - @Override - public List<FieldSetKey> getNestedKeys() { // A compound key can not contain another compound key directly, so only nested entity keys will be returned here. - return keys.stream().filter(it -> !it.getNestedKeys().isEmpty()).collect(Collectors.toList()); - } -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/federation/fieldsets/FederationFieldSet.java b/graphitron-common/src/main/java/no/sikt/graphql/federation/fieldsets/FederationFieldSet.java deleted file mode 100644 index ed3d32a832..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/federation/fieldsets/FederationFieldSet.java +++ /dev/null @@ -1,37 +0,0 @@ -package no.sikt.graphql.federation.fieldsets; - -import graphql.language.Field; -import no.sikt.graphql.federation.FieldSetKey; -import no.sikt.graphql.schema.SelectionSetParser; - -import java.util.List; - -/** - * The top level of entity keys for a type. One entry here corresponds to one key directive in the schema. - */ -public record FederationFieldSet(List<FieldSetKey> keys) { - public static FederationFieldSet fromString(List<String> rawKeys) { - return new FederationFieldSet(rawKeys.stream().map(FederationFieldSet::parseKeys).toList()); - } - - private static FieldSetKey parseKeys(String rawKey) { - return new CompoundFieldSetKey( - SelectionSetParser.parseFields(rawKey).stream().map(FederationFieldSet::toFieldSetKey).toList() - ); - } - - private static FieldSetKey toFieldSetKey(Field field) { - if (field.getSelectionSet() == null || field.getSelectionSet().getSelections().isEmpty()) { - return new SimpleFieldSetKey(field.getName()); - } - - var nestedFields = field - .getSelectionSet() - .getSelections() - .stream() - .map(Field.class::cast) - .map(FederationFieldSet::toFieldSetKey) - .toList(); - return new NestedFieldSetKey(new CompoundFieldSetKey(nestedFields), field.getName()); - } -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/federation/fieldsets/NestedFieldSetKey.java b/graphitron-common/src/main/java/no/sikt/graphql/federation/fieldsets/NestedFieldSetKey.java deleted file mode 100644 index 53f5ebb7d3..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/federation/fieldsets/NestedFieldSetKey.java +++ /dev/null @@ -1,17 +0,0 @@ -package no.sikt.graphql.federation.fieldsets; - -import no.sikt.graphql.federation.FieldSetKey; - -import java.util.List; - -public record NestedFieldSetKey(FieldSetKey key, String source) implements FieldSetKey { - @Override - public List<String> getKeys() { - return List.of(source); - } - - @Override - public List<FieldSetKey> getNestedKeys() { - return List.of(key); - } -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/federation/fieldsets/SimpleFieldSetKey.java b/graphitron-common/src/main/java/no/sikt/graphql/federation/fieldsets/SimpleFieldSetKey.java deleted file mode 100644 index a0811c4276..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/federation/fieldsets/SimpleFieldSetKey.java +++ /dev/null @@ -1,17 +0,0 @@ -package no.sikt.graphql.federation.fieldsets; - -import no.sikt.graphql.federation.FieldSetKey; - -import java.util.List; - -public record SimpleFieldSetKey(String key) implements FieldSetKey { - @Override - public List<String> getKeys() { - return List.of(key); - } - - @Override - public List<FieldSetKey> getNestedKeys() { - return List.of(); - } -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/helpers/functions/DBCount.java b/graphitron-common/src/main/java/no/sikt/graphql/helpers/functions/DBCount.java deleted file mode 100644 index 253c28abb1..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/helpers/functions/DBCount.java +++ /dev/null @@ -1,10 +0,0 @@ -package no.sikt.graphql.helpers.functions; - -import org.jooq.DSLContext; - -import java.util.Set; - -@FunctionalInterface -public interface DBCount<T> { - Object callDBMethod(DSLContext ctx, Set<T> idSet); -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/helpers/functions/DBQuery.java b/graphitron-common/src/main/java/no/sikt/graphql/helpers/functions/DBQuery.java deleted file mode 100644 index b37cb3a15e..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/helpers/functions/DBQuery.java +++ /dev/null @@ -1,12 +0,0 @@ -package no.sikt.graphql.helpers.functions; - -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; - -import java.util.Map; -import java.util.Set; - -@FunctionalInterface -public interface DBQuery<K, V> { - Map<K, V> callDBMethod(DSLContext ctx, Set<K> keys, SelectionSet selectionSet); -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/helpers/functions/DBQueryRoot.java b/graphitron-common/src/main/java/no/sikt/graphql/helpers/functions/DBQueryRoot.java deleted file mode 100644 index 80431726c0..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/helpers/functions/DBQueryRoot.java +++ /dev/null @@ -1,9 +0,0 @@ -package no.sikt.graphql.helpers.functions; - -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.jooq.DSLContext; - -@FunctionalInterface -public interface DBQueryRoot<T> { - T callDBMethod(DSLContext ctx, SelectionSet selectionSet); -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/helpers/functions/DataLoaderMapper.java b/graphitron-common/src/main/java/no/sikt/graphql/helpers/functions/DataLoaderMapper.java deleted file mode 100644 index b179e06751..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/helpers/functions/DataLoaderMapper.java +++ /dev/null @@ -1,12 +0,0 @@ -package no.sikt.graphql.helpers.functions; - -import no.sikt.graphql.helpers.selection.SelectionSet; - -import java.util.Map; -import java.util.Set; -import java.util.concurrent.CompletableFuture; - -@FunctionalInterface -public interface DataLoaderMapper<K, V> { - CompletableFuture<Map<K, V>> map(Set<K> keys, SelectionSet set); -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/helpers/functions/TransformCall.java b/graphitron-common/src/main/java/no/sikt/graphql/helpers/functions/TransformCall.java deleted file mode 100644 index f981a823e4..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/helpers/functions/TransformCall.java +++ /dev/null @@ -1,8 +0,0 @@ -package no.sikt.graphql.helpers.functions; - -import no.sikt.graphql.helpers.transform.AbstractTransformer; - -@FunctionalInterface -public interface TransformCall<A extends AbstractTransformer, V0, V1> { - V1 transform(A transform, V0 input); -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/helpers/mappers/MapperHelper.java b/graphitron-common/src/main/java/no/sikt/graphql/helpers/mappers/MapperHelper.java deleted file mode 100644 index 3823fb2720..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/helpers/mappers/MapperHelper.java +++ /dev/null @@ -1,51 +0,0 @@ -package no.sikt.graphql.helpers.mappers; - -import no.sikt.graphql.NodeIdStrategy; -import org.jooq.Field; -import org.jooq.UpdatableRecord; -import org.jooq.impl.UpdatableRecordImpl; - -import java.util.Arrays; -import java.util.List; -import java.util.Objects; -import java.util.function.Function; - -public class MapperHelper { - - /** - * Validates that all non-null lists have the same size. - * Used for merged listed @nodeId fields targeting the same jOOQ record list. - * @param lists The lists to validate - * @throws IllegalArgumentException if lists have different sizes - */ - public static void validateListLengths(List<?>... lists) { - var nonNullLists = Arrays.stream(lists).filter(Objects::nonNull).toList(); - nonNullLists.stream() - .filter(list -> list.size() != nonNullLists.get(0).size()) - .findFirst() - .ifPresent(list -> { - throw new IllegalArgumentException( - "Listed @nodeId fields targeting the same record must have the same length. " + - "Expected " + nonNullLists.get(0).size() + " but got " + list.size()); - }); - } - - public static <T extends UpdatableRecord<T>> void validateOverlappingNodeIdColumns( - NodeIdStrategy nodeIdStrategy, - String nodeIdValue, - T targetRecord, - String typeId, - String overlappingColumnName, - Function<T, Object> getterLambda, - Field<?>... columns - ) { - var firstValue = getterLambda.apply(targetRecord); - if (firstValue != null) { - T newJooqRecord = targetRecord.copy(); - nodeIdStrategy.setReferenceId((UpdatableRecordImpl<?>) newJooqRecord, nodeIdValue, typeId, columns); - if (!firstValue.equals(getterLambda.apply(newJooqRecord))) { - throw new IllegalArgumentException(String.format("Conflicting values for column: %s", overlappingColumnName)); - } - } - } -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/helpers/query/AfterTokenWithTypeName.java b/graphitron-common/src/main/java/no/sikt/graphql/helpers/query/AfterTokenWithTypeName.java deleted file mode 100644 index bc9eefad1f..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/helpers/query/AfterTokenWithTypeName.java +++ /dev/null @@ -1,7 +0,0 @@ -package no.sikt.graphql.helpers.query; - -public record AfterTokenWithTypeName(String typeName, Object[] fields) { - public boolean matches(String otherTypeName) { - return this.typeName().equals(otherTypeName); - } -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/helpers/query/QueryHelper.java b/graphitron-common/src/main/java/no/sikt/graphql/helpers/query/QueryHelper.java deleted file mode 100644 index 36da22c164..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/helpers/query/QueryHelper.java +++ /dev/null @@ -1,191 +0,0 @@ -package no.sikt.graphql.helpers.query; - -import org.jooq.Record; -import org.jooq.*; -import org.jooq.impl.DSL; -import org.jooq.impl.TableImpl; -import org.json.JSONArray; -import org.json.JSONObject; - -import java.lang.constant.Constable; -import java.nio.charset.StandardCharsets; -import java.util.*; -import java.util.stream.IntStream; -import java.util.stream.Stream; - -import static org.jooq.impl.DSL.*; - -public class QueryHelper { - - public static SortField<?>[] getSortFields(TableImpl<?> table, String selectedIndexName, String sortOrder) { - var indexes = table.getIndexes(); - return indexes.stream() - .filter(it -> it.getName().equalsIgnoreCase(selectedIndexName)) - .findFirst() - .orElseThrow() - .getFields().stream() - .map(field -> field.$sortOrder(sortOrder.equalsIgnoreCase("ASC") ? SortOrder.ASC : SortOrder.DESC)) - .map(it -> it.$field(table.field(it.$field()))) - .toArray(SortField<?>[]::new); - } - - public static Field<?>[] getOrderByValues(DSLContext ctx, OrderField<?>[] orderByFields, String token) { - - var fields = Stream.of(orderByFields) - .map(it -> it instanceof Field ? (Field<?>) it : ((SortField<?>) it).$field()) - .toArray(Field[]::new); - - if (token == null || token.isBlank()) { - return new Field<?>[]{}; - } - - try { - var jsonText = new String(Base64.getUrlDecoder().decode(token), StandardCharsets.UTF_8); - Object[] array = new JSONArray(jsonText).toList().toArray(); - - var record = ctx.newRecord(fields); - record.fromArray(array); - List<Object> list = record.intoList(); - - return IntStream.range(0, fields.length) - .mapToObj(i -> DSL.val(list.get(i), fields[i].getDataType())) - .toArray(Field[]::new); - } catch (Exception e) { - throw new IllegalArgumentException("Ugyldig verdi/format på token brukt til paginering (after): '" + token + "'", e); - } - } - - public static <R extends Record> SelectField<String> getOrderByToken(TableImpl<R> table, OrderField<?>[] orderByFields) { - var fields = Stream.of(orderByFields) - .map(it -> it instanceof Field ? (Field<?>) it : ((SortField<?>) it).$field()) - .toArray(Field[]::new); - return jsonArray(table.fields(fields)).convertFrom(QueryHelper::encodeToken); - } - - private static String encodeToken(JSON json) { - return Base64.getUrlEncoder().withoutPadding().encodeToString(json.data().getBytes(StandardCharsets.UTF_8)); - } - - public static <R extends Record> SelectField<String> getOrderByTokenForMultitableInterface(TableImpl<R> table, OrderField<?>[] orderByFields, String typeName) { - return jsonObject( - key("typeName").value(field(inline(typeName))), - key("fields").value(field(getOrderByToken(table, orderByFields))) - ).convertFrom(QueryHelper::encodeToken); - } - - public static AfterTokenWithTypeName getOrderByValuesForMultitableInterface(DSLContext ctx, Map<String, OrderField<?>[]> orderByFields, String token) { - if (token == null || token.isBlank()) { - return null; - } - - try { - var jsonText = new String(Base64.getUrlDecoder().decode(token), StandardCharsets.UTF_8); - var jsonObject = new JSONObject(jsonText); - - Object[] array = jsonObject.getJSONArray("fields").toList().toArray(); - String typeName = jsonObject.getString("typeName"); - - var fields = Stream.of(orderByFields.get(typeName)) - .map(it -> it instanceof Field ? (Field<?>) it : ((SortField<?>) it).$field()) - .toArray(Field[]::new); - - var record = ctx.newRecord(fields); - record.fromArray(array); - List<Object> list = record.intoList(); - - return new AfterTokenWithTypeName(typeName, list.toArray()); - } catch (Exception e) { - throw new IllegalArgumentException("Ugyldig verdi/format på token brukt til paginering (after): '" + token + "'", e); - } - } - - public static Map<String, Object> makeObjectMap(String[] labels, Object[] row) { - var resultMap = new HashMap<String, Object>(); - for (int i = 0; i < row.length; i++) { - var rowValue = row[i]; - if (rowValue == null) { - continue; - } - resultMap.put(labels[i], rowValue); - } - return resultMap; - } - - public static SelectField<Map> rowOfMap(String label, Object row) { - if (row == null) { - return null; - } - return DSL.row(row).mapping(Map.class, r -> Map.of(label, r)); - } - - public static SelectField<Map> rowOfMap(List<String> labels, List<Object> row) { - if (row.stream().allMatch(Objects::isNull)) { - return null; - } - return DSL.row(row).mapping(Map.class, r -> makeObjectMap(labels.toArray(new String[0]), r)); - } - - public static SelectField<Map> rowOfMap(Map.Entry<String, Object> ...entries) { - var entryList = List.of(entries); - var values = entryList.stream().map(Map.Entry::getValue).toList(); - if (values.stream().allMatch(Objects::isNull)) { - return null; - } - var keys = entryList.stream().map(Map.Entry::getKey).toList(); - return DSL.row(values).mapping(Map.class, r -> makeObjectMap(keys.toArray(new String[0]), r)); - } - - private static <T, U> HashMap<T, U> buildEnumMap(List<T> from, List<U> to) { - var i1 = from.iterator(); - var i2 = to.iterator(); - var map = new HashMap<T, U>(); - while (i1.hasNext()) { - map.put(i1.next(), i2.next()); - } - return map; - } - - // Extend Constable to remove potential ambiguity with the generics being Object. - public static <T extends Constable, U extends Constable> U makeEnumMap(T value, List<T> from, List<U> to) { - if (value == null) { - return null; - } - var map = buildEnumMap(from, to); - return map.getOrDefault(value, null); - } - - public static <T extends Constable, U extends Constable> List<U> makeEnumMap(List<T> values, List<T> from, List<U> to) { - if (values == null) { - return null; - } - var map = buildEnumMap(from, to); - return values - .stream() - .map(it -> it == null ? null : map.getOrDefault(it, null)) - .toList(); - } - - /** - * Maps a {@link Record} containing a subset of column values into a new {@link TableRecord}, - * populating only the specified fields. The values in {@code r} are matched to {@code fields} - * by position. - * - * <p>This is primarily used for constructing resolver keys where only the primary key fields - * need to be populated, and serves as a workaround for a - * <a href="https://github.com/jOOQ/jOOQ/issues/19711">jOOQ bug</a> where - * {@code RecordN.into(TableRecord)} fails on Oracle.</p> - * - * @param record the source record whose values are mapped by position onto {@code fields} - * @param fields the target table fields; must be non-empty and belong to the same table - * @return a new table record with the given fields populated from {@code r} - */ - public static <T extends TableRecord<T>, U extends Record> T intoTableRecord(U record, List<TableField<T, ?>> fields) { - T tableRecord = fields.stream().findFirst() - .map(TableField::getTable) - .map(RecordQualifier::newRecord) - .orElseThrow(() -> new RuntimeException("Creating table record failed.")); - - tableRecord.fromArray(record.intoArray(), fields.toArray(TableField[]::new)); - return tableRecord; - } -} \ No newline at end of file diff --git a/graphitron-common/src/main/java/no/sikt/graphql/helpers/resolvers/AbstractFetcher.java b/graphitron-common/src/main/java/no/sikt/graphql/helpers/resolvers/AbstractFetcher.java deleted file mode 100644 index 9c3da78d6a..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/helpers/resolvers/AbstractFetcher.java +++ /dev/null @@ -1,139 +0,0 @@ -package no.sikt.graphql.helpers.resolvers; - -import graphql.relay.DefaultConnectionCursor; -import graphql.relay.DefaultEdge; -import graphql.relay.DefaultPageInfo; -import graphql.relay.Edge; -import graphql.schema.DataFetchingEnvironment; -import no.sikt.graphql.helpers.functions.DataLoaderMapper; -import no.sikt.graphql.helpers.selection.ConnectionSelectionSet; -import no.sikt.graphql.helpers.selection.SelectionSet; -import no.sikt.graphql.relay.ConnectionImpl; -import org.apache.commons.lang3.tuple.Pair; -import org.dataloader.DataLoader; -import org.dataloader.DataLoaderFactory; -import org.dataloader.MappedBatchLoaderWithContext; - -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.function.Function; -import java.util.stream.Collectors; - -public abstract class AbstractFetcher extends EnvironmentHandler { - /** - * Create a dataloader for a resolver. - * @param env Environment for the resolver. - */ - protected AbstractFetcher(DataFetchingEnvironment env) { - super(env); - } - - protected <K> KeyWithPath<K> asKeyPath(K key) { - return new KeyWithPath<>(key, executionPath); - } - - protected <K> Set<KeyWithPath<K>> asKeyPaths(Set<K> keys) { - return keys.stream().map(this::asKeyPath).collect(Collectors.toSet()); - } - - protected <K, V> DataLoader<KeyWithPath<K>, V> getLoader(DataLoaderMapper<KeyWithPath<K>, V> mapFunction) { - return env.getDataLoaderRegistry().computeIfAbsent(dataloaderName, name -> - DataLoaderFactory.newMappedDataLoader((MappedBatchLoaderWithContext<KeyWithPath<K>, V>) (keys, batchEnvLoader) -> - mapFunction.map(keys, new SelectionSet(getSelectionSetsFromEnvironment(batchEnvLoader))) - ) - ); - } - - protected <K, V> DataLoader<KeyWithPath<K>, V> getConnectionLoader(DataLoaderMapper<KeyWithPath<K>, V> mapFunction) { - return env.getDataLoaderRegistry().computeIfAbsent(dataloaderName, name -> - DataLoaderFactory.newMappedDataLoader((MappedBatchLoaderWithContext<KeyWithPath<K>, V>) (keys, batchEnvLoader) -> - mapFunction.map(keys, new ConnectionSelectionSet(getSelectionSetsFromEnvironment(batchEnvLoader))) - ) - ); - } - - protected static <K, V> Map<KeyWithPath<K>, V> resultAsMap(Set<KeyWithPath<K>> keys, Map<K, V> dbResult) { - return keys - .stream() - .filter(it -> it.key() != null) - .filter(it -> dbResult.get(it.key()) != null) - .collect( - Collectors.toMap( - Function.identity(), - it -> { - var dbValue = dbResult.get(it.key()); - return dbValue instanceof List<?> ? (V)((List<?>)dbValue).stream().filter(Objects::nonNull).toList() : dbValue; - } - ) - ); - } - - protected static <T> ConnectionImpl<T> getPaginatedConnection(List<Pair<String, T>> dbResult, int pageSize, Integer totalCount) { - return createPagedResult(dbResult, pageSize, totalCount); - } - - protected static <K, V> Map<KeyWithPath<K>, ConnectionImpl<V>> getPaginatedConnection(Map<KeyWithPath<K>, List<Pair<String, V>>> dbResult, int pageSize, Object countFunctionResult) { - if (countFunctionResult == null) { - return dbResult.entrySet().stream().collect(Collectors.toMap( - Map.Entry::getKey, - entry -> createPagedResult(entry.getValue(), pageSize, null) - )); - } - - if (countFunctionResult instanceof Integer singleCount) { - return dbResult.entrySet().stream().collect(Collectors.toMap( - Map.Entry::getKey, - entry -> createPagedResult(entry.getValue(), pageSize, singleCount) - )); - } else if (countFunctionResult instanceof Map<?, ?> countMap) { - @SuppressWarnings("unchecked") - Map<K, Integer> typedCountMap = (Map<K, Integer>) countMap; - return dbResult.entrySet().stream().collect(Collectors.toMap( - Map.Entry::getKey, - entry -> { - Integer count = typedCountMap.getOrDefault(entry.getKey().key(), 0); - return createPagedResult(entry.getValue(), pageSize, count); - } - )); - } else { - throw new IllegalStateException( - "Unsupported count result type: " + countFunctionResult.getClass().getSimpleName() + - ". Expected Integer or Map<K, Integer>." - ); - } - } - - protected static <T> ConnectionImpl<T> createPagedResult(List<Pair<String, T>> dbResult, int pageSize, Integer totalCount) { - var items = dbResult.subList(0, Math.min(dbResult.size(), pageSize)); - - List<Edge<T>> edges = items - .stream() - .map(item -> new DefaultEdge<>(item != null ? item.getRight() : null, new DefaultConnectionCursor(item != null ? item.getLeft() : null))) - .collect(Collectors.toList()); - - return ConnectionImpl - .<T>builder() - .setPageInfo(getDefaultPageInfo(dbResult.size() > pageSize, items)) - .setNodes(items.stream().map(Pair::getRight).toList()) - .setEdges(edges) - .setTotalCount(totalCount) - .build(); - } - - private static <T> DefaultPageInfo getDefaultPageInfo(boolean hasNextPage, List<Pair<String, T>> items) { - if (items.isEmpty()) { - return new DefaultPageInfo(null, null, false, hasNextPage); - } - - var itemStart = items.get(0); - var itemEnd = items.get(items.size() - 1); - return new DefaultPageInfo( - new DefaultConnectionCursor(itemStart != null ? itemStart.getLeft() : null), - new DefaultConnectionCursor(itemEnd != null ? itemEnd.getLeft() : null), - false, - hasNextPage - ); - } -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/helpers/resolvers/ArgumentPresence.java b/graphitron-common/src/main/java/no/sikt/graphql/helpers/resolvers/ArgumentPresence.java deleted file mode 100644 index 77e3f794c8..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/helpers/resolvers/ArgumentPresence.java +++ /dev/null @@ -1,78 +0,0 @@ -package no.sikt.graphql.helpers.resolvers; - -import java.util.*; - -/** - * Tracks which fields were provided in a GraphQL arguments map, without retaining values. - * Built from {@code env.getArguments()} by stripping all values and keeping only the key structure. - * Object fields become named children, list items become indexed children ("0", "1", ...), - * and leaf values (including explicit nulls) become {@link #EMPTY} presence markers. - */ -public class ArgumentPresence { - public static final ArgumentPresence EMPTY = new ArgumentPresence(Map.of()); - - private final Map<String, ArgumentPresence> children; - - public ArgumentPresence(Map<String, ArgumentPresence> children) { - this.children = children; - } - - /** Check if a direct child field was provided. */ - public boolean hasField(String name) { - return children.containsKey(name); - } - - /** Navigate to a child field's subtree. Returns EMPTY if not present. */ - public ArgumentPresence child(String name) { - return children.getOrDefault(name, EMPTY); - } - - /** Navigate to a list item's subtree by index. Returns EMPTY if not present. */ - public ArgumentPresence itemAt(int index) { - return children.getOrDefault(String.valueOf(index), EMPTY); - } - - /** - * Wrap this node as a single-item list presence. - * Used by RecordTransformer single-item overloads that wrap input in List.of(). - */ - public ArgumentPresence asSingleItem() { - return new ArgumentPresence(Map.of("0", this)); - } - - public boolean isEmpty() { - return children.isEmpty(); - } - - /** - * Build from a GraphQL arguments map, stripping all values and retaining only key structure. - * Explicit nulls are preserved as present (key exists → EMPTY node), while absent fields - * have no entry at all. This mirrors GraphQL Java's behavior where explicitly provided null - * fields appear as keys with null values in {@code env.getArguments()}, while omitted fields - * are absent from the map entirely. - */ - @SuppressWarnings("unchecked") - public static ArgumentPresence build(Map<String, Object> arguments) { - var result = new LinkedHashMap<String, ArgumentPresence>(); - for (var entry : arguments.entrySet()) { - var key = entry.getKey(); - var value = entry.getValue(); - if (value instanceof Map<?, ?>) { - result.put(key, build((Map<String, Object>) value)); - } else if (value instanceof List<?> list) { - var listChildren = new LinkedHashMap<String, ArgumentPresence>(); - for (int i = 0; i < list.size(); i++) { - var item = list.get(i); - if (item instanceof Map<?, ?>) { - listChildren.put(String.valueOf(i), build((Map<String, Object>) item)); - } - } - result.put(key, new ArgumentPresence(listChildren)); - } else { - // Leaf value (scalar, enum, or explicit null) — presence recorded, value discarded. - result.put(key, EMPTY); - } - } - return new ArgumentPresence(result); - } -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/helpers/resolvers/DataFetcherHelper.java b/graphitron-common/src/main/java/no/sikt/graphql/helpers/resolvers/DataFetcherHelper.java deleted file mode 100644 index 037884fb36..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/helpers/resolvers/DataFetcherHelper.java +++ /dev/null @@ -1,387 +0,0 @@ -package no.sikt.graphql.helpers.resolvers; - -import graphql.ErrorType; -import graphql.GraphqlErrorBuilder; -import graphql.schema.DataFetchingEnvironment; -import no.sikt.graphql.exception.ValidationViolationGraphQLException; -import no.sikt.graphql.helpers.functions.DBCount; -import no.sikt.graphql.NodeIdStrategy; -import no.sikt.graphql.helpers.functions.DBQuery; -import no.sikt.graphql.helpers.functions.DBQueryRoot; -import no.sikt.graphql.helpers.selection.SelectionSet; -import no.sikt.graphql.relay.ConnectionImpl; -import org.apache.commons.lang3.tuple.Pair; -import org.dataloader.DataLoaderFactory; -import org.dataloader.MappedBatchLoaderWithContext; - -import java.util.*; -import java.util.concurrent.CompletableFuture; -import java.util.function.BiFunction; -import java.util.function.Function; -import java.util.stream.Collectors; - -import static no.sikt.graphql.naming.GraphQLReservedName.CONNECTION_TOTAL_COUNT; - -public class DataFetcherHelper extends AbstractFetcher { - /** - * Create a dataloader for a resolver. - * @param env Environment for the resolver. - */ - public DataFetcherHelper(DataFetchingEnvironment env) { - super(env); - } - - /** - * Load the data for a root resolver. - * @param dbFunction Function to call to retrieve the query data. - * @return A resolver result. - * @param <T> Type that the resolver fetches. - */ - public <T> CompletableFuture<T> load(DBQueryRoot<T> dbFunction) { - return CompletableFuture.completedFuture(dbFunction.callDBMethod(dslContext, select)); - } - - /** - * Load the data for a root resolver. The result is paginated. - * @param pageSize Size of the pages for pagination. - * @param dbFunction Function to call to retrieve the query data. - * @return A paginated resolver result. - * @param <T> Type that the resolver fetches. - */ - public <T> CompletableFuture<ConnectionImpl<T>> loadPaginated( - int pageSize, - DBQueryRoot<List<Pair<String, T>>> dbFunction - ) { - return loadPaginated(pageSize, dbFunction, null); - } - - - /** - * Load the data for a root resolver. The result is paginated. - * @param pageSize Size of the pages for pagination. - * @param dbFunction Function to call to retrieve the query data. - * @param countFunction Function to call to retrieve the total count of elements that could be potentially - * retrieved. This parameter will be null if the schema does not contain the optional - * {@code totalCount} field. - * @return A paginated resolver result. - * @param <T> Type that the resolver fetches. - */ - public <T> CompletableFuture<ConnectionImpl<T>> loadPaginated( - int pageSize, - DBQueryRoot<List<Pair<String, T>>> dbFunction, - DBCount<String> countFunction - ) { - return CompletableFuture.completedFuture( - getPaginatedConnection( - dbFunction.callDBMethod(dslContext, connectionSelect), - pageSize, - countFunction != null && connectionSelect.contains(CONNECTION_TOTAL_COUNT.getName()) - ? (Integer) countFunction.callDBMethod(dslContext, Set.of()) - : null - ) - ); - } - - /** - * Load the data for a resolver. - * @param dbFunction Function to call to retrieve the query data. - * @param key Key for the queried element. - * @return A resolver result. - * @param <V> Type that the resolver fetches. - */ - public <K, V> CompletableFuture<V> load(K key, DBQuery<K, V> dbFunction) { - return getLoader((Set<KeyWithPath<K>> keys, SelectionSet set) -> getMappedDataLoader(keys, set, dbFunction)) - .load(asKeyPath(key), env); - } - - /** - * Load the data for a resolver. The result is paginated. - * @param pageSize Size of the pages for pagination. - * @param dbFunction Function to call to retrieve the query data. - * @return A paginated resolver result. - */ - public <K, V> CompletableFuture<ConnectionImpl<V>> loadPaginated( - K key, - int pageSize, - DBQuery<K, List<Pair<String, V>>> dbFunction - ) { - return loadPaginated(key, pageSize, dbFunction, null); - } - - /** - * Load the data for a resolver. The result is paginated. - * @param pageSize Size of the pages for pagination. - * @param dbFunction Function to call to retrieve the query data. - * @param countFunction Function to call to retrieve the total count of elements that could be potentially - * retrieved. This parameter will be null if the schema does not contain the optional - * {@code totalCount} field. - * @return A paginated resolver result. - */ - public <K, V> CompletableFuture<ConnectionImpl<V>> loadPaginated( - K key, - int pageSize, - DBQuery<K, List<Pair<String, V>>> dbFunction, - DBCount<K> countFunction - ) { - return getConnectionLoader((Set<KeyWithPath<K>> keys, SelectionSet set) -> getMappedDataLoader(keys, set, pageSize, dbFunction, countFunction)) - .load(asKeyPath(key), env); - } - - /** - * Load the data for a resolver. - * @param dbFunction Function to call to retrieve the query data. - * @param key ID of the queried element. - * @return A resolver result. - * @param <V> Type that the resolver fetches. - */ - public <K, V> CompletableFuture<List<V>> loadNonNullable(K key, DBQuery<K, List<V>> dbFunction) { - return getLoader((Set<KeyWithPath<K>> keys, SelectionSet set) -> getMappedDataLoader(keys, set, dbFunction)) - .load(asKeyPath(key), env) - .thenApply(data -> Optional.ofNullable(data).orElse(List.of())); - } - - /** - * Load the data for a resolver in a lookup format. - * @param keys The lookup keys that are necessary for match rows in the result with the original resolver input. - * @param dbFunction Function to call to retrieve the query data. - * @return A resolver result without pagination. - * @param <K> The key type that this lookup uses. - * @param <V> Type that the resolver fetches. - */ - public <K, V> CompletableFuture<List<V>> loadLookup(List<List<K>> keys, DBQuery<String, V> dbFunction) { - if (keys.isEmpty()) { - return CompletableFuture.completedFuture(List.of()); - } - return loadByKeysOrdered(mergeKeys(keys, env), dbFunction); - } - - public static <K> List<String> mergeKeys(List<List<K>> keys, DataFetchingEnvironment env) { - if (keys.isEmpty()) { - return List.of(); - } - - // This assumes all keys are correlated. - var nKeys = keys.get(0).size(); - if (keys.stream().map(List::size).anyMatch(it -> it != nKeys)) { - throw new ValidationViolationGraphQLException( - List.of( - GraphqlErrorBuilder - .newError(env) - .path(env.getExecutionStepInfo().getPath()) - .message("Keys sets have differing lengths. For this type of query, each key field is required to be an array of equal length.") - .errorType(ErrorType.ValidationError) - .build() - ) - ); - } - - var mergedKeys = new ArrayList<>(Collections.nCopies(nKeys, "")); - for (var keyList : keys) { - for (int i = 0; i < nKeys; i++) { - var currentKey = mergedKeys.get(i); - mergedKeys.set(i, (currentKey.isEmpty() ? "" : currentKey + ",") + keyList.get(i)); - } - } - - return mergedKeys; - } - - /** - * Load values for a list of resolver keys, preserving order and nulls. - * - * <p>The DB query is invoked only with the non-null subset of {@code keys}, but the returned - * list has the same length as {@code keys}, with {@code null} at every index where {@code keys} - * contained {@code null} or where no DB row matched. - * - * @param keys ordered list of keys; may be {@code null} or contain {@code null} elements. - * @param dbFunction function to fetch values for the non-null keys. - * @return ordered result list, length-matched to {@code keys}; an empty list when {@code keys} - * is {@code null} or empty. - */ - public <K, V> CompletableFuture<List<V>> loadByResolverKeys(List<K> keys, DBQuery<K, V> dbFunction) { - if (keys == null || keys.isEmpty()) { - return CompletableFuture.completedFuture(List.of()); - } - return loadByKeysOrdered(keys, dbFunction); - } - - private <K, V> CompletableFuture<List<V>> loadByKeysOrdered(List<K> keys, DBQuery<K, V> dbFunction) { - var nonNullKeySet = keys.stream().filter(Objects::nonNull).collect(Collectors.toSet()); - var dbResult = dbFunction.callDBMethod(dslContext, nonNullKeySet, select); - var orderedResult = keys.stream().map(dbResult::get).toList(); - return CompletableFuture.completedFuture(orderedResult); - } - - public <V> CompletableFuture<List<V>> loadLookupEntities( - List<?> inputList, - Map<String, DBQuery<Map<String, Object>, ? extends V>> typeNameToDBQueryMap - ) { - return loadLookupEntities(null, inputList, typeNameToDBQueryMap); - } - - public <V> CompletableFuture<List<V>> loadLookupEntities( - NodeIdStrategy nodeIdStrategy, - List<?> inputList, - Map<String, DBQuery<Map<String, Object>, ? extends V>> typeNameToDBQueryMap - ) { - List<Map<String, Object>> representations; - if (inputList.isEmpty() || inputList.stream().findAny().get() instanceof Map) { - representations = (List<Map<String, Object>>) inputList; - } else { - representations = (List<Map<String, Object>>) inputList.get(0); - } - - return loadLookupMultipleSources( - representations, - it -> (String) it.getOrDefault("__typename", null), - typeNameToDBQueryMap, - (representation, entities) -> getEntityForRepresentation(representation, entities, nodeIdStrategy), - "Resolving __typename in representation failed for entity.", - "Cannot resolve entity with __typename '%s'." - ); - } - - static <V> V getEntityForRepresentation(Map<String, Object> representation, Map<Map<String, Object>, V> entities, NodeIdStrategy nodeIdStrategy) { - return entities.entrySet().stream() - .filter(entity -> representation.entrySet().stream() - .allMatch(r -> representationKeyMatchesEntity(r, entity, nodeIdStrategy))) - .map(Map.Entry::getValue) - .findFirst() - .orElse(null); - } - - private static <V> boolean representationKeyMatchesEntity(Map.Entry<String, Object> representationKey, Map.Entry<Map<String, Object>, V> entity, NodeIdStrategy nodeIdStrategy) { - Map<String, Object> representationForEntity = entity.getKey(); - if (!representationForEntity.containsKey(representationKey.getKey())) { - return false; - } - - var valueForEntity = representationForEntity.get(representationKey.getKey()); - if (valueForEntity instanceof String entityValString && representationKey.getValue() instanceof String repValString) { - if (entityValString.equals(representationKey.getValue())) { - return true; - } - return Optional.ofNullable(nodeIdStrategy) - .map(n -> n.areEqualNodeIds(entityValString, repValString)) - .orElse(false); - } - return valueForEntity.toString().equals(representationKey.getValue().toString()); - } - - /** - * Load data from multiple DB sources, returning results in input order. - * - * @param inputList The ordered list of input elements. Determines the order of the returned results. - * @param sourceResolver Function that maps each input element to a source identifier used to select the DB query. - * @param sourceToDBQueryMap Map from source identifier to the DB function that fetches elements for that source. - * @param inputToResultLookup Function that matches an input key to a value in the results map. - * @return A resolver result with elements ordered to match {@code inputList}. Elements not found will be {@code null}. - */ - public <K, V> CompletableFuture<List<V>> loadLookupMultipleSources( - List<K> inputList, - Function<K, String> sourceResolver, - Map<String, DBQuery<K, ? extends V>> sourceToDBQueryMap, - BiFunction<K, Map<K, V>, V> inputToResultLookup, - String sourceResolverReturnedNullError, - String dbQueryForSourceMissingError - ) { - if (inputList.isEmpty()) { - return CompletableFuture.completedFuture(List.of()); - } - - Map<K, V> allResults = new HashMap<>(); - inputList.stream() - .collect(Collectors.groupingBy(it -> { - var source = sourceResolver.apply(it); - if (source == null) { - throw new IllegalArgumentException(sourceResolverReturnedNullError); - } - return source; - }, Collectors.toSet()) - ) - .forEach((dbQueryKey, inputSet) -> { - if (dbQueryKey == null) { - throw new IllegalArgumentException(sourceResolverReturnedNullError); - } - var query = Optional.ofNullable(sourceToDBQueryMap.getOrDefault(dbQueryKey, null)) - .orElseThrow(() -> new IllegalArgumentException(String.format(dbQueryForSourceMissingError, dbQueryKey))); - - allResults.putAll(query.callDBMethod(dslContext, inputSet, select)); - }); - return CompletableFuture.completedFuture(inputList.stream().map(it -> inputToResultLookup.apply(it, allResults)).toList()); - } - - /** - * Load the data for an interface resolver. - * @param loaderName The source from which the data should be loaded. - * @param key The specific key that should be loaded. - * @param dbFunction Function to call to retrieve the query data. - * @return A resolver result without pagination. - * @param <V1> Type that the resolver fetches. - */ - public <K, V1, V0 extends V1> CompletableFuture<V1> loadInterface(String loaderName, K key, DBQuery<K, V0> dbFunction) { - return env - .getDataLoaderRegistry() - .<K, V1>computeIfAbsent(loaderName, name -> - DataLoaderFactory.newMappedDataLoader((MappedBatchLoaderWithContext<K, V0>) (keys, loaderEnvironment) -> - CompletableFuture.completedFuture(dbFunction.callDBMethod(dslContext, keys, new SelectionSet(getSelectionSetsFromEnvironment(loaderEnvironment)))) - ) - ) - .load(key, env); - } - - /** - * Load the data for a delete resolver. - * @param dbFunction Function to call to retrieve the IDs. - * @param idFilteringFunction Function to call to filter out undeleted IDs. - * @return A resolver result. - * @param <T> Type that the resolver fetches. - */ - public <T, U> CompletableFuture<U> loadDelete(DBQueryRoot<T> dbFunction, Function<T, U> idFilteringFunction) { - return CompletableFuture.completedFuture(idFilteringFunction.apply(dbFunction.callDBMethod(dslContext, select))); - } - - /** - * Load the data for a resolver returning wrapped data. - * @param dbFunction Function to call to retrieve the data. - * @param wrappingFunction Function to call to wrap the data. - * @return A resolver result. - * @param <T> Type that the resolver fetches. - */ - public <T, U> CompletableFuture<U> loadWrapped(DBQueryRoot<T> dbFunction, Function<T, U> wrappingFunction) { - return CompletableFuture.completedFuture(wrappingFunction.apply(dbFunction.callDBMethod(dslContext, select))); - } - - private <K, V> CompletableFuture<Map<KeyWithPath<K>, ConnectionImpl<V>>> getMappedDataLoader( - Set<KeyWithPath<K>> keys, - SelectionSet selectionSet, - int pageSize, - DBQuery<K, List<Pair<String, V>>> dbFunction, - DBCount<K> countFunction - ) { - if (keys.isEmpty()) { - return CompletableFuture.completedFuture(Map.of()); - } - - var idSet = keys.stream().map(KeyWithPath::key).collect(Collectors.toSet()); - return CompletableFuture.completedFuture( - getPaginatedConnection( - resultAsMap(keys, dbFunction.callDBMethod(dslContext, idSet, selectionSet)), - pageSize, - countFunction != null && connectionSelect.contains(CONNECTION_TOTAL_COUNT.getName()) - ? countFunction.callDBMethod(dslContext, idSet) - : null - ) - ); - } - - private <K, V> CompletableFuture<Map<KeyWithPath<K>, V>> getMappedDataLoader(Set<KeyWithPath<K>> keys, SelectionSet selectionSet, DBQuery<K, V> dbFunction) { - keys = keys.stream().filter(Objects::nonNull).filter(it -> it.key() != null).collect(Collectors.toSet()); - if (keys.isEmpty()) { - return CompletableFuture.completedFuture(Map.of()); - } - - var idSet = keys.stream().map(KeyWithPath::key).collect(Collectors.toSet()); - return CompletableFuture.completedFuture(resultAsMap(keys, dbFunction.callDBMethod(dslContext, idSet, selectionSet))); - } -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/helpers/resolvers/EnvironmentHandler.java b/graphitron-common/src/main/java/no/sikt/graphql/helpers/resolvers/EnvironmentHandler.java deleted file mode 100644 index 7a50096acf..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/helpers/resolvers/EnvironmentHandler.java +++ /dev/null @@ -1,105 +0,0 @@ -package no.sikt.graphql.helpers.resolvers; - -import graphql.schema.DataFetchingEnvironment; -import graphql.schema.DataFetchingFieldSelectionSet; -import no.sikt.graphql.GraphitronContext; -import no.sikt.graphql.helpers.selection.ConnectionSelectionSet; -import no.sikt.graphql.helpers.selection.SelectionSet; -import org.dataloader.BatchLoaderEnvironment; -import org.jooq.DSLContext; -import org.jooq.Row; - -import java.util.*; - -/** - * Helper class for generated code that helps simplify the extraction of required data from a DataFetchingEnvironment. - */ -public class EnvironmentHandler { - protected final DataFetchingEnvironment env; - protected final Map<String, Object> localContext; - protected final String executionPath; - protected final DSLContext dslContext; - protected final SelectionSet select, connectionSelect; - protected final Set<String> arguments; - protected final ArgumentPresence argumentPresence; - protected final Map<String, Map<String, Row>> nextKeys; - protected final String dataloaderName; - - public EnvironmentHandler(DataFetchingEnvironment env) { - this.env = env; - GraphitronContext graphitronContext = env.getGraphQlContext().get("graphitronContext"); - if (graphitronContext == null) { - throw new IllegalStateException("A GraphitronContext must be registered in ExecutionInput.graphQLContext under the name \"graphitronContext\". Graphitron needs this to find the right DSLContext for queries."); - } - - dslContext = graphitronContext.getDslContext(env); - dataloaderName = graphitronContext.getDataLoaderName(env); - - arguments = flattenArgumentKeys(env.getArguments()); - argumentPresence = ArgumentPresence.build(env.getArguments()); - select = new SelectionSet(getSelectionSetsFromEnvironment(env)); - select.setArgumentPresence(argumentPresence); - connectionSelect = new ConnectionSelectionSet(getSelectionSetsFromEnvironment(env)); - executionPath = env.getExecutionStepInfo().getPath().toString(); - localContext = Map.of(); - nextKeys = Map.of(); - } - - public DataFetchingEnvironment getEnv() { - return env; - } - - public DSLContext getCtx() { - return dslContext; - } - - public SelectionSet getSelect() { - return select; - } - - public Set<String> getArguments() { - return arguments; - } - - public ArgumentPresence getArgumentPresence() { - return argumentPresence; - } - - protected static List<DataFetchingFieldSelectionSet> getSelectionSetsFromEnvironment(BatchLoaderEnvironment loaderEnvironment) { - return ((List<DataFetchingEnvironment>) (List<?>) loaderEnvironment.getKeyContextsList()).stream() - .map(DataFetchingEnvironment::getSelectionSet) - .toList(); - } - - private static DataFetchingFieldSelectionSet getSelectionSetsFromEnvironment(DataFetchingEnvironment env) { - return env.getSelectionSet(); - } - - private static Set<String> flattenArgumentKeys(Map<String, Object> arguments) { - return flattenArgumentKeys(arguments, ""); - } - - protected static Set<String> flattenArgumentKeys(Map<String, Object> arguments, String path) { - var result = new HashSet<String>(); - for (var arg : arguments.entrySet()) { - var key = arg.getKey(); - var value = arg.getValue(); - var nextPath = path.isEmpty() ? key : path + "/" + key; - result.add(nextPath); - - if (value instanceof Map) { - result.addAll(flattenArgumentKeys((Map<String, Object>) value, nextPath)); - } - - if (value instanceof List<?> listValue) { - listValue.stream() - .filter(it -> it instanceof Map) - .forEach(it -> result.addAll(flattenArgumentKeys((Map<String, Object>) it, nextPath)) - ); - } - } - - return result; - } - -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/helpers/resolvers/KeyWithPath.java b/graphitron-common/src/main/java/no/sikt/graphql/helpers/resolvers/KeyWithPath.java deleted file mode 100644 index a191780e20..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/helpers/resolvers/KeyWithPath.java +++ /dev/null @@ -1,3 +0,0 @@ -package no.sikt.graphql.helpers.resolvers; - -public record KeyWithPath<K>(K key, String path) {} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/helpers/resolvers/ResolverHelpers.java b/graphitron-common/src/main/java/no/sikt/graphql/helpers/resolvers/ResolverHelpers.java deleted file mode 100644 index 49e86d740a..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/helpers/resolvers/ResolverHelpers.java +++ /dev/null @@ -1,141 +0,0 @@ -package no.sikt.graphql.helpers.resolvers; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.jooq.Field; -import org.jooq.UpdatableRecord; - -import java.util.*; -import java.util.function.Function; -import java.util.stream.Collectors; - -public class ResolverHelpers { - private final static ObjectMapper MAPPER = new ObjectMapper(); - static { - MAPPER.findAndRegisterModules(); // We really don't want to re-run this every time we map an object. - } - - public static int getPageSize(Integer first, int max, int defaultMax) { - return Optional.ofNullable(first).map(it -> Math.min(max, it)).orElse(defaultMax); - } - - public static List<String> formatString(List<?> l) { - return l.stream().map(it -> it != null ? it.toString() : "null").collect(Collectors.toList()); - } - - public static List<String> formatString(Object o) { - return formatString(List.of(o)); - } - - public static <T> T transformDTO(Object data, Class<T> targetClass) { - if (data == null) { - return null; - } - - return MAPPER.convertValue(data, targetClass); - } - - public static <T> List<T> transformDTOList(Object data, Class<T> targetClass) { - if (data == null) { - return null; - } - - return ((List<Object>) data).stream().map(it -> MAPPER.convertValue(it, targetClass)).toList(); - } - - /** - * Validates that all non-null values in the map are equal. - * Used to ensure multiple GraphQL fields mapping to the same database column have consistent values. - * - * @param fieldNameToValue map of GraphQL field names to their values (must preserve insertion order) - * @throws IllegalArgumentException if two non-null values differ - */ - public static void assertSameColumnValues(Map<String, Object> fieldNameToValue) { - var nonNullEntries = fieldNameToValue.entrySet().stream() - .filter(e -> e.getValue() != null) - .toList(); - - if (nonNullEntries.size() < 2) { - return; - } - - var firstEntry = nonNullEntries.get(0); - var conflictingEntry = nonNullEntries.stream() - .skip(1) - .filter(e -> !e.getValue().equals(firstEntry.getValue())) - .findFirst() - .orElse(null); - - if (conflictingEntry != null) { - throw new IllegalArgumentException( - "Input fields " + firstEntry.getKey() + " and " + conflictingEntry.getKey() + - " have conflicting values. This usually indicates that the ids correspond to different entities."); - } - } - - /** - * Validates that all non-null values are equal. - * Accepts alternating field names and values, preserving the order for deterministic error messages. - * - * @param keysAndValues alternating field names (String) and values (Object), e.g. "field1", value1, "field2", value2 - * @throws IllegalArgumentException if two non-null values differ, or if argument count is not even - */ - public static void assertSameColumnValues(Object... keysAndValues) { - if (keysAndValues.length % 2 != 0) { - throw new IllegalArgumentException("Expected even number of arguments (key-value pairs)"); - } - var map = new LinkedHashMap<String, Object>(); - for (int i = 0; i < keysAndValues.length; i += 2) { - map.put((String) keysAndValues[i], keysAndValues[i + 1]); - } - assertSameColumnValues(map); - } - - /** - * Prepares jOOQ table records for a {@code store()} call by reconciling input with existing database state. - * For records with matching keys, non-PK fields that are touched in {@code inputRecords} are applied onto - * the corresponding record in {@code existingRecords}, preparing them for UPDATE. - * For records without a match, the record is added as-is with its PK fields marked as touched to trigger an INSERT. - * - * @param existingRecords records fetched from the database - * @param inputRecords new records whose touched fields will be applied - * @return list of records ready for store - */ - public static <T extends UpdatableRecord<T>> List<T> prepareRecordsForStore(List<T> existingRecords, List<T> inputRecords) { - var preparedRecords = new ArrayList<T>(); - var existingByKey = existingRecords.stream().collect(Collectors.toMap(UpdatableRecord::key, Function.identity())); - inputRecords.forEach(r -> { - if (existingByKey.containsKey(r.key())) { - var prepared = applyTouchedFields(existingByKey.get(r.key()), r); - preparedRecords.add(prepared); - } else { - r.key().fieldStream().forEach(f -> r.changed(f, true)); // Set PK to changed to trigger an INSERT - preparedRecords.add(r); - } - }); - return preparedRecords; - } - - /** - * Prepares a single record for a jOOQ {@code store()} call by matching it against existing records. - * - * @param existingRecords records fetched from the database, matched by primary key - * @param inputRecord record whose touched fields will be applied - * @return the prepared record, or {@code null} if no match was found - */ - public static <T extends UpdatableRecord<T>> T prepareRecordsForStore(List<T> existingRecords, T inputRecord) { - return prepareRecordsForStore(existingRecords, List.of(inputRecord)).stream().findFirst() - .orElseThrow(() -> new RuntimeException("Preparing TableRecord for store failed.")); - } - - private static <T extends UpdatableRecord<T>> T applyTouchedFields(T existingRecord, T inputRecord) { - inputRecord.fieldStream() - .filter(it -> existingRecord.key().fieldStream().noneMatch(pkField -> pkField.equals(it))) - .filter(inputRecord::changed) - .forEach(field -> setField(existingRecord, field, inputRecord)); - return existingRecord; - } - - private static <V> void setField(UpdatableRecord<?> target, Field<V> field, UpdatableRecord<?> source) { - target.set(field, source.get(field)); - } -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/helpers/resolvers/ServiceDataFetcherHelper.java b/graphitron-common/src/main/java/no/sikt/graphql/helpers/resolvers/ServiceDataFetcherHelper.java deleted file mode 100644 index 9fa0c87200..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/helpers/resolvers/ServiceDataFetcherHelper.java +++ /dev/null @@ -1,239 +0,0 @@ -package no.sikt.graphql.helpers.resolvers; - -import graphql.schema.DataFetchingEnvironment; -import no.sikt.graphql.helpers.functions.TransformCall; -import no.sikt.graphql.helpers.selection.SelectionSet; -import no.sikt.graphql.helpers.transform.AbstractTransformer; -import no.sikt.graphql.relay.ConnectionImpl; -import org.apache.commons.lang3.tuple.Pair; -import org.jooq.UpdatableRecord; - -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.concurrent.CompletableFuture; -import java.util.function.Function; -import java.util.function.Supplier; -import java.util.stream.Collectors; - -import static no.sikt.graphql.naming.GraphQLReservedName.CONNECTION_TOTAL_COUNT; - -public class ServiceDataFetcherHelper<A extends AbstractTransformer> extends AbstractFetcher { - private final A abstractTransformer; - - /** - * Create a dataloader for a resolver. - * @param env Environment for the resolver. - */ - public ServiceDataFetcherHelper(DataFetchingEnvironment env) { - this(env, null); - } - - /** - * Create a dataloader for a resolver. - * @param abstractTransformer A transformer that can transform jOOQ and Java-records to GraphQL and back. - */ - public ServiceDataFetcherHelper(A abstractTransformer) { - this(abstractTransformer.getEnv(), abstractTransformer); - } - - /** - * Create a dataloader for a resolver. - * @param env Environment for the resolver. - * @param abstractTransformer A transformer that can transform jOOQ records to Java-records and back. - */ - private ServiceDataFetcherHelper(DataFetchingEnvironment env, A abstractTransformer) { - super(env); - this.abstractTransformer = abstractTransformer; - } - - public A getAbstractTransformer() { - return abstractTransformer; - } - - /** - * Load the data for a root resolver. - * @param dbFunction Function to call to retrieve the query data. - * @return A resolver result. - * @param <T> Type that the query returns. - * @param <U> Type that the resolver fetches. - */ - public <T, U> CompletableFuture<U> load(Supplier<T> dbFunction, TransformCall<A, T, U> dbTransform) { - return CompletableFuture.completedFuture(dbTransform.transform(abstractTransformer, dbFunction.get())); - } - - /** - * Load the data for a root resolver. The result is paginated. - * @param pageSize Size of the pages for pagination. - * @param dbFunction Function to call to retrieve the query data. - * @param dbTransform Function that maps the query output to the resolver output. - * @return A paginated resolver result. - * @param <T> Type that the query returns. - */ - public <T, U> CompletableFuture<ConnectionImpl<U>> loadPaginated( - int pageSize, - Supplier<List<Pair<String, T>>> dbFunction, - TransformCall<A, List<Pair<String, T>>, List<Pair<String, U>>> dbTransform - ) { - return loadPaginated(pageSize, dbFunction, null, dbTransform); - } - - /** - * Load the data for a root resolver. The result is paginated. - * @param pageSize Size of the pages for pagination. - * @param dbFunction Function to call to retrieve the query data. - * @param countFunction Function to call to retrieve the total count of elements that could be potentially - * retrieved. This parameter will be null if the schema does not contain the optional - * {@code totalCount} field. - * @param dbTransform Function that maps the query output to the resolver output. - * @return A paginated resolver result. - * @param <T> Type that the query returns. - */ - public <T, U> CompletableFuture<ConnectionImpl<U>> loadPaginated( - int pageSize, - Supplier<List<Pair<String, T>>> dbFunction, - Function<Set<String>, Integer> countFunction, - TransformCall<A, List<Pair<String, T>>, List<Pair<String, U>>> dbTransform - ) { - return CompletableFuture.completedFuture( - getPaginatedConnection( - dbTransform.transform(abstractTransformer, dbFunction.get()), - pageSize, - countFunction != null && connectionSelect.contains(CONNECTION_TOTAL_COUNT.getName()) - ? countFunction.apply(Set.of()) - : null - ) - ); - } - - /** - * Load the data for a resolver. - * @param dbFunction Function to call to retrieve the query data. - * @param dbTransform Function that maps the query output to the resolver output. - * @param key ID of the queried element. - * @return A resolver result. - * @param <V0> Type that the query returns. - * @param <V1> Type that the resolver fetches. - */ - public <K, V0, V1> CompletableFuture<V1> load(K key, Function<Set<K>, Map<K, V0>> dbFunction, TransformCall<A, V0, V1> dbTransform) { - return getLoader((Set<KeyWithPath<K>> keys, SelectionSet set) -> getMappedDataLoader(keys, dbFunction, dbTransform)) - .load(asKeyPath(key), env); - } - - /** - * Load the data for a resolver. The result is paginated. - * @param pageSize Size of the pages for pagination. - * @param dbFunction Function to call to retrieve the query data. - * @param dbTransform Function that maps the query output to the resolver output. - * @return A paginated resolver result. - * @param <V0> Type that the query returns. - */ - public <K, V0, V1> CompletableFuture<ConnectionImpl<V1>> loadPaginated( - K key, - int pageSize, - Function<Set<K>, Map<K, List<Pair<String, V0>>>> dbFunction, - TransformCall<A, List<Pair<String, V0>>, List<Pair<String, V1>>> dbTransform - ) { - return loadPaginated(key, pageSize, dbFunction, null, dbTransform); - } - - /** - * Load the data for a resolver. The result is paginated. - * @param pageSize Size of the pages for pagination. - * @param dbFunction Function to call to retrieve the query data. - * @param countFunction Function to call to retrieve the total count of elements that could be potentially - * retrieved. This parameter will be null if the schema does not contain the optional - * {@code totalCount} field. - * @param dbTransform Function that maps the query output to the resolver output. - * @return A paginated resolver result. - * @param <V0> Type that the query returns. - */ - public <K, V0, V1> CompletableFuture<ConnectionImpl<V1>> loadPaginated( - K key, - int pageSize, - Function<Set<K>, Map<K, List<Pair<String, V0>>>> dbFunction, - Function<Set<K>, Map<K,Integer>> countFunction, - TransformCall<A, List<Pair<String, V0>>, List<Pair<String, V1>>> dbTransform - ) { - return getConnectionLoader((Set<KeyWithPath<K>> keys, SelectionSet set) -> getMappedDataLoader(keys, pageSize, dbFunction, countFunction, dbTransform)) - .load(asKeyPath(key), env); - } - - /** - * Load the data for a resolver. The result is paginated. - * @param dbFunction Function to call to retrieve the query data. - * @param dbTransform Function to call to transform the output to schema types. - * @param key ID of the queried element. - * @return A resolver result. - * @param <V0> Type that the resolver fetches. - */ - public <K, V0, V1> CompletableFuture<List<V1>> loadNonNullable(K key, Function<Set<K>, Map<K, List<V0>>> dbFunction, TransformCall<A, List<V0>, List<V1>> dbTransform) { - return getLoader((Set<KeyWithPath<K>> keys, SelectionSet set) -> getMappedDataLoader(keys, dbFunction, dbTransform)) - .load(asKeyPath(key), env) - .thenApply(data -> Optional.ofNullable(data).orElse(List.of())); - } - - private <K, V0, V1> CompletableFuture<Map<KeyWithPath<K>, ConnectionImpl<V1>>> getMappedDataLoader( - Set<KeyWithPath<K>> keys, - int pageSize, - Function<Set<K>, Map<K, List<Pair<String, V0>>>> dbFunction, - Function<Set<K>, Map<K, Integer>> countFunction, - TransformCall<A, List<Pair<String, V0>>, List<Pair<String, V1>>> dbTransform - ) { - if (keys.isEmpty()) { - return CompletableFuture.completedFuture(Map.of()); - } - - var idSet = keys.stream().map(KeyWithPath::key).collect(Collectors.toSet()); - return CompletableFuture.completedFuture( - getPaginatedConnection( - connectionSelect.contains(CONNECTION_TOTAL_COUNT.getName()) - ? resultAsMap(keys, dbFunction.apply(idSet)) - .entrySet() - .stream() - .collect(Collectors.toMap(Map.Entry::getKey, it -> dbTransform.transform(abstractTransformer, it.getValue()))) : Map.of(), - pageSize, - countFunction != null && connectionSelect.contains(CONNECTION_TOTAL_COUNT.getName()) - ? countFunction.apply(idSet) - : null - ) - ); - } - - private <K, V0, V1> CompletableFuture<Map<KeyWithPath<K>, V1>> getMappedDataLoader(Set<KeyWithPath<K>> keys, Function<Set<K>, Map<K, V0>> dbFunction, TransformCall<A, V0, V1> dbTransform) { - if (keys.isEmpty()) { - return CompletableFuture.completedFuture(Map.of()); - } - - return CompletableFuture.completedFuture( - resultAsMapWithPkOnlyKeys(keys, dbFunction) - .entrySet() - .stream() - .collect(Collectors.toMap(Map.Entry::getKey, it -> dbTransform.transform(abstractTransformer, it.getValue()))) - ); - } - - /** - * Like {@link #resultAsMap}, but strips non-PK columns from {@link UpdatableRecord} keys - * returned by the service so equality with the requested PK-only lookup keys holds. - */ - protected <K, V> Map<KeyWithPath<K>, V> resultAsMapWithPkOnlyKeys(Set<KeyWithPath<K>> keys, Function<Set<K>, Map<K, V>> dbFunction) { - var keySet = keys.stream().map(KeyWithPath::key).collect(Collectors.toSet()); - var stripped = dbFunction.apply(keySet).entrySet().stream() - .collect(Collectors.toMap(e -> stripNonPkColumns(e.getKey()), Map.Entry::getValue)); - return resultAsMap(keys, stripped); - } - - /** - * Returns an {@link UpdatableRecord} key with non-PK columns stripped; other keys are - * returned unchanged. - */ - @SuppressWarnings("unchecked") - static <K> K stripNonPkColumns(K key) { - if (key instanceof UpdatableRecord<?> record) { - return (K) record.key().into(record.getClass()); - } - return key; - } -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/helpers/selection/ConnectionSelectionSet.java b/graphitron-common/src/main/java/no/sikt/graphql/helpers/selection/ConnectionSelectionSet.java deleted file mode 100644 index 483b5b7c75..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/helpers/selection/ConnectionSelectionSet.java +++ /dev/null @@ -1,28 +0,0 @@ -package no.sikt.graphql.helpers.selection; - -import graphql.schema.DataFetchingFieldSelectionSet; - -import java.util.List; -import java.util.regex.Pattern; - -/** - * A helper class for generated code. Helps with checking the selection set from the {@link graphql.schema.DataFetchingEnvironment} - * for fields used in queries that use the connection types that follow the - * <a href="https://relay.dev/graphql/connections.htm">cursor connection specification</a>. - */ -public class ConnectionSelectionSet extends SelectionSet { - private final static String CONNECTION_NODE_REGEX_PATTERN_PREFIX = "^(edges/node/|nodes/|)"; - - public ConnectionSelectionSet(List<DataFetchingFieldSelectionSet> selectionSets) { - super(selectionSets); - } - - public ConnectionSelectionSet(DataFetchingFieldSelectionSet selectionSet) { - super(selectionSet); - } - - public boolean contains(String path) { - var pattern = Pattern.compile(CONNECTION_NODE_REGEX_PATTERN_PREFIX + path); - return selectionSet.stream().anyMatch(it -> pattern.matcher(it).matches()); - } -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/helpers/selection/SelectionSet.java b/graphitron-common/src/main/java/no/sikt/graphql/helpers/selection/SelectionSet.java deleted file mode 100644 index 3a61b67369..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/helpers/selection/SelectionSet.java +++ /dev/null @@ -1,76 +0,0 @@ -package no.sikt.graphql.helpers.selection; - -import graphql.schema.DataFetchingFieldSelectionSet; -import graphql.schema.SelectedField; -import no.sikt.graphql.helpers.resolvers.ArgumentPresence; -import org.jooq.Field; -import org.jooq.SelectField; - -import java.util.List; -import java.util.Set; -import java.util.function.Supplier; -import java.util.stream.Collectors; - -import static org.jooq.impl.DSL.inline; -import static org.jooq.impl.DSL.noField; - -/** - * A helper class for generated code. Helps with checking the selection set from the {@link graphql.schema.DataFetchingEnvironment} - * for fields used in queries and mutations. - */ -public class SelectionSet { - protected final Set<String> selectionSet; - private final String prefix; - private ArgumentPresence argumentPresence; - - public SelectionSet(List<DataFetchingFieldSelectionSet> selectionSets) { - this.selectionSet = selectionSets.stream() - .flatMap(selectionSet -> selectionSet.getFields().stream()) - .map(SelectedField::getQualifiedName) - .collect(Collectors.toSet()); - prefix = ""; - } - - public SelectionSet(DataFetchingFieldSelectionSet selectionSet) { - this(List.of(selectionSet)); - } - - private SelectionSet(Set<String> selectionSet, String prefix) { - this.selectionSet = selectionSet; - this.prefix = prefix + "/"; - } - - public SelectionSet withPrefix(String prefix) { - return new SelectionSet(selectionSet, prefix); - } - - public <T> Field<T> optional(String path, Field<T> field, T _default) { - return contains(path) ? field : noField(inline(_default)); - } - - public <T> Field<T> optional(String path, Field<T> field) { - return contains(path) ? field : noField(inline((T) null)); - } - - public <T> SelectField<T> ifRequested(String path, Supplier<SelectField<T>> fieldSupplier) { - return contains(path) ? fieldSupplier.get() : noField(inline((T) null)); - } - - public boolean contains(String path) { - return selectionSet.stream().anyMatch(it -> it.contains(prefix + path)); - } - - public void setArgumentPresence(ArgumentPresence argumentPresence) { - this.argumentPresence = argumentPresence; - } - - public ArgumentPresence getArgumentPresence() { - return argumentPresence; - } - - /** Check if a field is present at a specific list index in the argument presence tree. */ - public boolean hasArgumentAtIndex(String listName, int index, String fieldName) { - return argumentPresence != null - && argumentPresence.child(listName).itemAt(index).hasField(fieldName); - } -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/helpers/transform/AbstractTransformer.java b/graphitron-common/src/main/java/no/sikt/graphql/helpers/transform/AbstractTransformer.java deleted file mode 100644 index a48833696c..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/helpers/transform/AbstractTransformer.java +++ /dev/null @@ -1,22 +0,0 @@ -package no.sikt.graphql.helpers.transform; - -import graphql.GraphQLError; -import graphql.schema.DataFetchingEnvironment; -import no.sikt.graphql.exception.ValidationViolationGraphQLException; -import no.sikt.graphql.helpers.resolvers.EnvironmentHandler; - -import java.util.HashSet; - -public abstract class AbstractTransformer extends EnvironmentHandler { - protected final HashSet<GraphQLError> _iv_validationErrors = new HashSet<>(); - - public AbstractTransformer(DataFetchingEnvironment env) { - super(env); - } - - public void validate() { - if (!_iv_validationErrors.isEmpty()) { - throw new ValidationViolationGraphQLException(_iv_validationErrors); - } - } -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/naming/GraphQLReservedName.java b/graphitron-common/src/main/java/no/sikt/graphql/naming/GraphQLReservedName.java deleted file mode 100644 index 7cdabafe00..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/naming/GraphQLReservedName.java +++ /dev/null @@ -1,75 +0,0 @@ -package no.sikt.graphql.naming; - -import com.apollographql.federation.graphqljava.FederationDirectives; -import com.apollographql.federation.graphqljava._Entity; -import com.apollographql.federation.graphqljava._FieldSet; -import com.apollographql.federation.graphqljava._Service; - -import static graphql.relay.Relay.NODE; -import static graphql.relay.Relay.pageInfoType; -import static org.apache.commons.lang3.StringUtils.uncapitalize; - -/** - * Enum of various names or substrings that have special meanings in the schema. - * These should always be used rather than specifying them as Strings in various places throughout the code. - */ -public enum GraphQLReservedName { - TYPE_NAME("__typename"), - PAGINATION_FIRST("first"), - PAGINATION_AFTER("after"), - PAGINATION_LAST("last"), - PAGINATION_BEFORE("before"), - - CONNECTION_NODE_FIELD("node"), - CONNECTION_NODES_FIELD("nodes"), - CONNECTION_CURSOR_FIELD("cursor"), - CONNECTION_EDGE_FIELD("edges"), - CONNECTION_PAGE_INFO_NODE(pageInfoType.getName()), - CONNECTION_PAGE_INFO_FIELD(uncapitalize(CONNECTION_PAGE_INFO_NODE.getName())), - HAS_PREVIOUS_PAGE_FIELD("hasPreviousPage"), - HAS_NEXT_PAGE_FIELD("hasNextPage"), - START_CURSOR_FIELD("startCursor"), - END_CURSOR_FIELD("endCursor"), - - CONNECTION_TOTAL_COUNT("totalCount"), - - NODE_TYPE(NODE), - NODE_ID("id"), - ERROR_TYPE("Error"), - ERROR_FIELD("errors"), - SCHEMA_CONNECTION_SUFFIX("Connection"), - SCHEMA_EDGE_SUFFIX("Edge"), - SCHEMA_QUERY("Query"), - SCHEMA_MUTATION("Mutation"), - SCHEMA_SUBSCRIPTION("Subscription"), - SCHEMA("schema"), - OPERATION_QUERY(uncapitalize(SCHEMA_QUERY.getName())), - OPERATION_MUTATION(uncapitalize(SCHEMA_MUTATION.getName())), - - FEDERATION_KEY(FederationDirectives.keyName), - FEDERATION_KEY_FIELDS(FederationDirectives.fieldsArgumentName), - FEDERATION_KEY_RESOLVABLE("resolvable"), - FEDERATION_LINK("link"), - FEDERATION_LINK_IMPORT("import"), - FEDERATION_TAG("tag"), - FEDERATION_TAG_ARGUMENT("name"), - FEDERATION_SERVICE_FIELD(_Service.fieldName), - FEDERATION_SERVICE_TYPE(_Service.typeName), - FEDERATION_ENTITIES_FIELD(_Entity.fieldName), - FEDERATION_ENTITY_UNION(_Entity.typeName), - FEDERATION_REPRESENTATIONS_ARGUMENT(_Entity.argumentName), - FEDERATION_EXTERNAL(FederationDirectives.externalName), - FEDERATION_REQUIRES(FederationDirectives.requiresName), - FEDERATION_SHAREABLE("shareable"), - FEDERATION_FIELD_SET(_FieldSet.typeName); - - private final String name; - - GraphQLReservedName(String name) { - this.name = name; - } - - public String getName() { - return name; - } -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/naming/LocalContextNames.java b/graphitron-common/src/main/java/no/sikt/graphql/naming/LocalContextNames.java deleted file mode 100644 index befbfcd535..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/naming/LocalContextNames.java +++ /dev/null @@ -1,16 +0,0 @@ -package no.sikt.graphql.naming; - -public enum LocalContextNames { - DSL_CONTEXT("DSLContext"), - NEXT_KEYS("nextKeys"); - - private final String name; - - LocalContextNames(String name) { - this.name = name; - } - - public String getName() { - return name; - } -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/relay/ConnectionImpl.java b/graphitron-common/src/main/java/no/sikt/graphql/relay/ConnectionImpl.java deleted file mode 100644 index 20e9c266db..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/relay/ConnectionImpl.java +++ /dev/null @@ -1,72 +0,0 @@ -package no.sikt.graphql.relay; - -import graphql.relay.DefaultConnection; -import graphql.relay.Edge; -import graphql.relay.PageInfo; - -import java.util.List; - -/** - * Helper class for handling extended connection types based on the - * <a href="https://relay.dev/graphql/connections.htm">cursor connection specification</a>. - * The fields {@code nodes} and {@code totalCount} are added to the standard connection type. These fields are not part - * of the official specification, but are commonly used in GraphQL APIs. They are optional in this implementation and - * can be omitted if not needed. - */ -public class ConnectionImpl<T> extends DefaultConnection<T> { - private final List<T> nodes; - private final Integer totalCount; - - public ConnectionImpl(List<Edge<T>> edges, List<T> nodes, PageInfo pageInfo, Integer totalCount) { - super(edges, pageInfo); - this.nodes = (nodes != null) ? nodes : List.of(); - this.totalCount = totalCount; - } - - public List<T> getNodes() { - return nodes; - } - - public Integer getTotalCount() { - return totalCount; - } - - public static <T> Builder<T> builder() { - return new Builder<>(); - } - - public static class Builder<T> { - private List<Edge<T>> edges; - private List<T> nodes = List.of(); - private PageInfo pageInfo; - private Integer totalCount = 0; - - public Builder() { - } - - public Builder<T> setEdges(List<Edge<T>> edges) { - this.edges = edges; - return this; - } - - public Builder<T> setNodes(List<T> nodes) { - this.nodes = (nodes != null) ? nodes : List.of(); - return this; - } - - public Builder<T> setPageInfo(PageInfo pageInfo) { - this.pageInfo = pageInfo; - return this; - } - - public Builder<T> setTotalCount(Integer totalCount) { - this.totalCount = totalCount; - return this; - } - - public ConnectionImpl<T> build() { - return new ConnectionImpl<>(edges, nodes, pageInfo, totalCount); - } - - } -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/schema/CustomScalars.java b/graphitron-common/src/main/java/no/sikt/graphql/schema/CustomScalars.java deleted file mode 100644 index bf508ae62c..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/schema/CustomScalars.java +++ /dev/null @@ -1,136 +0,0 @@ -package no.sikt.graphql.schema; - -import com.apollographql.federation.graphqljava._FieldSet; -import graphql.GraphQLContext; -import graphql.execution.CoercedVariables; -import graphql.language.IntValue; -import graphql.language.StringValue; -import graphql.language.Value; -import graphql.schema.Coercing; -import graphql.schema.CoercingParseLiteralException; -import graphql.schema.CoercingParseValueException; -import graphql.schema.CoercingSerializeException; -import graphql.schema.GraphQLScalarType; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.math.BigInteger; -import java.util.Locale; -import java.util.UUID; - -import static graphql.Assert.assertShouldNeverHappen; -import static graphql.scalar.CoercingUtil.i18nMsg; -import static graphql.scalar.CoercingUtil.typeName; - -public class CustomScalars { - - /** - * Custom scalar for the FieldSet type in Apollo Federation. - * FieldSet replaces _FieldSet in version 2 of Apollo Federation. - */ - public static final GraphQLScalarType FieldSet = - GraphQLScalarType.newScalar(_FieldSet.type) - .name("FieldSet") - .build(); - - /** - * If FieldSet is not imported via the @link directive, it's name is prefixed with federation__. - */ - public static final GraphQLScalarType Federation__FieldSet = - GraphQLScalarType.newScalar(FieldSet) - .name("federation__FieldSet") - .build(); - - /** - * Custom ID scalar that serializes and parses values as Strings instead of Objects - */ - public static final GraphQLScalarType GraphQLID = GraphQLScalarType.newScalar() - .name("ID") - .description("Overrides the default ID scalar") - .coercing( - new IDStringCoercing()).build(); - - private static class IDStringCoercing implements Coercing<String, String> { - private String convertImpl(Object input) { - if (input instanceof String) { - return (String) input; - } - if (input instanceof Integer) { - return String.valueOf(input); - } - if (input instanceof Long) { - return String.valueOf(input); - } - if (input instanceof UUID) { - return String.valueOf(input); - } - if (input instanceof BigInteger) { - return String.valueOf(input); - } - return String.valueOf(input); - } - - @NotNull - private String serializeImpl(Object input, @NotNull Locale locale) { - String result = String.valueOf(input); - if (result == null) { - throw new CoercingSerializeException( - "Expected type 'ID' but was '" + typeName(input) + "'." - ); - } - return result; - } - - @NotNull - private String parseValueImpl(Object input, @NotNull Locale locale) { - String result = convertImpl(input); - if (result == null) { - throw new CoercingParseValueException( - i18nMsg(locale, "ID.notId", typeName(input)) - ); - } - return result; - } - - private String parseLiteralImpl(Object input, @NotNull Locale locale) { - if (input instanceof StringValue) { - return ((StringValue) input).getValue(); - } - if (input instanceof IntValue) { - return ((IntValue) input).getValue().toString(); - } - throw new CoercingParseLiteralException( - i18nMsg(locale, "ID.unexpectedAstType", typeName(input)) - ); - } - - @NotNull - private StringValue valueToLiteralImpl(Object input, @NotNull Locale locale) { - String result = convertImpl(input); - if (result == null) { - assertShouldNeverHappen(i18nMsg(locale, "ID.notId", typeName(input))); - } - return StringValue.newStringValue(result).build(); - } - - @Override - public String serialize(@NotNull Object dataFetcherResult, @NotNull GraphQLContext graphQLContext, @NotNull Locale locale) throws CoercingSerializeException { - return serializeImpl(dataFetcherResult, locale); - } - - @Override - public String parseValue(@NotNull Object input, @NotNull GraphQLContext graphQLContext, @NotNull Locale locale) throws CoercingParseValueException { - return parseValueImpl(input, locale); - } - - @Override - public @Nullable String parseLiteral(@NotNull Value<?> input, @NotNull CoercedVariables variables, @NotNull GraphQLContext graphQLContext, @NotNull Locale locale) throws CoercingParseLiteralException { - return parseLiteralImpl(input, locale); - } - - @Override - public @NotNull Value<?> valueToLiteral(@NotNull Object input, @NotNull GraphQLContext graphQLContext, @NotNull Locale locale) { - return valueToLiteralImpl(input, locale); - } - } -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/schema/FederationHelper.java b/graphitron-common/src/main/java/no/sikt/graphql/schema/FederationHelper.java deleted file mode 100644 index f760079b7b..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/schema/FederationHelper.java +++ /dev/null @@ -1,50 +0,0 @@ -package no.sikt.graphql.schema; - -import com.apollographql.federation.graphqljava.Federation; -import graphql.schema.DataFetcher; -import graphql.schema.GraphQLSchema; -import graphql.schema.TypeResolver; -import graphql.schema.idl.RuntimeWiring; -import graphql.schema.idl.TypeDefinitionRegistry; - -/** - * Helper class for building Apollo Federation schemas. - * This class provides convenient methods for transforming a GraphQL schema - * into a Federation 2 compatible schema. - */ -public class FederationHelper { - - /** - * Builds a Federation 2 compatible GraphQL schema without entity resolution. - * Use this method when you want federation support (e.g., @shareable, @external directives) - * but don't have any resolvable entities in the schema. - */ - public static GraphQLSchema buildFederatedSchema( - TypeDefinitionRegistry registry, - RuntimeWiring.Builder wiringBuilder - ) { - return Federation - .transform(registry, wiringBuilder.build()) - .setFederation2(true) - .build(); - } - - /** - * Builds a Federation 2 compatible GraphQL schema with entity resolution. - * Use this method when your schema has resolvable entities (types with @key directive - * and resolvable: true). - */ - public static GraphQLSchema buildFederatedSchema( - TypeDefinitionRegistry registry, - RuntimeWiring.Builder wiringBuilder, - TypeResolver entityTypeResolver, - DataFetcher<?> entityFetcher - ) { - return Federation - .transform(registry, wiringBuilder.build()) - .setFederation2(true) - .resolveEntityType(entityTypeResolver) - .fetchEntities(entityFetcher) - .build(); - } -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/schema/FieldType.java b/graphitron-common/src/main/java/no/sikt/graphql/schema/FieldType.java deleted file mode 100644 index fbae7284f0..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/schema/FieldType.java +++ /dev/null @@ -1,43 +0,0 @@ -package no.sikt.graphql.schema; - -import graphql.language.Type; -import graphql.language.TypeName; - -import java.util.ArrayList; - -/** - * Class that extracts information about a field's type. - */ -public class FieldType { - private String name; - public FieldType(Type<?> fieldType) { - setFields(fieldType); - } - - protected void setFields(Type<?> fieldType) { - ArrayList<Type<?>> orderedTypeList = extractNestedTypes(fieldType); - for (Type<?> objectType : orderedTypeList) { - if (objectType instanceof TypeName) { - name = ((TypeName) objectType).getName(); - } - } - } - - protected ArrayList<Type<?>> extractNestedTypes(Type<?> t) { - var typeList = new ArrayList<Type<?>>(); - typeList.add(t); - while(!(t instanceof TypeName)) { - var subType = (Type<?>) t.getNamedChildren().getChildOrNull("type"); - typeList.add(subType); - t = subType; - } - return typeList; - } - - /** - * @return The name of the data type as specified in the schema. - */ - public String getName() { - return name; - } -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/schema/SchemaReadingHelper.java b/graphitron-common/src/main/java/no/sikt/graphql/schema/SchemaReadingHelper.java deleted file mode 100644 index c2a294ec8b..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/schema/SchemaReadingHelper.java +++ /dev/null @@ -1,100 +0,0 @@ -package no.sikt.graphql.schema; - -import graphql.language.Document; -import graphql.parser.MultiSourceReader; -import graphql.parser.Parser; -import graphql.parser.ParserEnvironment; -import graphql.parser.ParserOptions; -import graphql.schema.idl.SchemaParser; -import graphql.schema.idl.TypeDefinitionRegistry; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Collection; -import java.util.Set; -import java.util.stream.Collectors; - - -/** - * Class for reading schema files from disk and classpath. - */ -public class SchemaReadingHelper { - - public static Document readSchemas(Collection<String> sources) { - MultiSourceReader.Builder builder = MultiSourceReader.newMultiSourceReader(); - sources.forEach(path -> builder.string(readContent(path) + System.lineSeparator(), path)); - - var multiSourceReader = builder.trackData(true).build(); - return new Parser() - .parseDocument( - ParserEnvironment.newParserEnvironment() - .parserOptions(ParserOptions.getDefaultSdlParserOptions()) - .document(multiSourceReader) - .build()); - } - - /** - * Read the set of schema paths and combine them to a GraphQL {@link TypeDefinitionRegistry}. - * @param schemas The schema paths to be used. - * @return A {@link TypeDefinitionRegistry} from the found schema files. - */ - public static TypeDefinitionRegistry getTypeDefinitionRegistry(Set<String> schemas) { - return new SchemaParser().buildRegistry(readSchemas(schemas)); - } - - /** - * Tries to read content from classpath first, then falls back to filesystem - */ - private static String readContent(String path) { - // Normalize path for classloader (no leading slash) - String normalizedPath = path.startsWith("/") ? path.substring(1) : path; - - String content = readFromClasspath(normalizedPath); - if (content != null) { - return content; - } - - try { - Path filePath = Paths.get(path); - if (Files.exists(filePath)) { - return fileAsString(filePath); - } - } catch (Exception ignored) { - // exception thrown below - } - throw new RuntimeException("Schema file not found: " + path); - } - - /** - * Read content from classpath resource using the context classloader. - * This ensures resources are found correctly in frameworks like Quarkus dev mode - * where the application's resources may be in a different classloader than this library. - */ - private static String readFromClasspath(String resourcePath) { - ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - try (InputStream is = classLoader.getResourceAsStream(resourcePath)) { - if (is == null) { - return null; - } - try (BufferedReader reader = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { - return reader.lines().collect(Collectors.joining(System.lineSeparator())); - } - } catch (IOException e) { - return null; - } - } - - public static String fileAsString(Path path) { - try { - return Files.readString(path, StandardCharsets.UTF_8); - } catch (IOException e) { - throw new RuntimeException(e); - } - } -} diff --git a/graphitron-common/src/main/java/no/sikt/graphql/schema/SelectionSetParser.java b/graphitron-common/src/main/java/no/sikt/graphql/schema/SelectionSetParser.java deleted file mode 100644 index 1d8feef858..0000000000 --- a/graphitron-common/src/main/java/no/sikt/graphql/schema/SelectionSetParser.java +++ /dev/null @@ -1,35 +0,0 @@ -package no.sikt.graphql.schema; - -import graphql.language.Field; -import graphql.language.OperationDefinition; -import graphql.parser.Parser; - -import java.util.List; - -/** - * Parses a string containing GraphQL field selections using graphql-java's {@link Parser}. - * This supports the standard GraphQL selection set syntax including aliases and nesting. - */ -public class SelectionSetParser { - private SelectionSetParser() {} - - /** - * Parses a selection string into a list of {@link Field} AST nodes. - * The input should contain fields as they would appear inside a GraphQL selection set, - * e.g. {@code "firstName: FIRST_NAME, lastName: LAST_NAME"} or {@code "id name address { city }"}. - * - * @param selectionString the field selection content, with or without surrounding braces - * @return list of parsed {@link Field} nodes - */ - public static List<Field> parseFields(String selectionString) { - var stripped = selectionString.strip(); - var wrapped = stripped.startsWith("{") && stripped.endsWith("}") ? stripped : "{ " + selectionString + " }"; - var document = Parser.parse(wrapped); - return ((OperationDefinition) document.getDefinitions().get(0)) - .getSelectionSet() - .getSelections() - .stream() - .map(Field.class::cast) - .toList(); - } -} diff --git a/graphitron-common/src/main/resources/directives.graphqls b/graphitron-common/src/main/resources/directives.graphqls deleted file mode 100644 index 1e388595ae..0000000000 --- a/graphitron-common/src/main/resources/directives.graphqls +++ /dev/null @@ -1,342 +0,0 @@ -"""Create a new resolver and a separate query for fetching of the annotated field.""" -directive @splitQuery on FIELD_DEFINITION - -""" -Any field with this directive set is exempt from code generation. This should be used on resolvers that are to be manually implemented. -Can be set on an input field to prevent generation of record mappers. -""" -directive @notGenerated on FIELD_DEFINITION | ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION | INTERFACE | UNION - -"""Connect this type to a jOOQ table. All the containing fields will by default be assumed to be located there.""" -directive @table(name: String) on OBJECT | INPUT_OBJECT | INTERFACE - -""" -The default assumption for generating fields is that the name of each schema field corresponds exactly to a jOOQ table record field -in the related jOOQ table (set by @table), or a field in a Java record if that is used instead. -This directive overrides the assumption, allowing to correctly map schema field names that diverge from what is available in the record. - -The second parameter is used exclusively for Java records, and is kept separate to support cases where Java and jOOQ records need to interact. -It defaults to the value of the first parameter. -""" -directive @field(name: String!, javaName: String) on FIELD_DEFINITION | ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION | ENUM_VALUE - -""" -The @externalField directive indicates that the annotated field is -retrieved using a static method implemented in Java. -This is typically used when the field's value requires custom logic implemented in Java." - -For more information, see documentation [here](https://github.com/sikt-no/graphitron/tree/main/graphitron-codegen-parent/graphitron-java-codegen/README.md#custom-field-logic-with-externalfield). -""" -directive @externalField on FIELD_DEFINITION - -"""Links this schema enum to a Java enum class. Available values are set in the plugin configuration.""" -directive @enum(enumReference: ExternalCodeReference!) on ENUM - -""" -Use an external service to do the DB-operations. -The signature of the method must match the inputs of the mutation or query. -Available values are set in the plugin configuration. - -Context arguments must be added to the GraphQLContext at run-time. -""" -directive @service(service: ExternalCodeReference!, contextArguments: [String!]) on FIELD_DEFINITION - -""" -The @error directive serves to map specific Java exceptions to GraphQL errors. -This directive is applied to error types in the schema and accepts a list of -handlers with parameters, specifying how various exceptions should be mapped. -""" -directive @error(handlers: [ErrorHandler!]!) on OBJECT - -""" -Defines the handlers for the @error directive. Each handler has properties -which help to map exceptions to GraphQL errors. -""" -input ErrorHandler { - """ - Determines which error handler to use. DATABASE and GENERIC are the two options - currently available. - """ - handler: ErrorHandlerType! - - """ - Specifies the fully qualified name of the exception class. Required for the - GENERIC handler and defaults to org.jooq.exception.DataAccessException if not - provided for the DATABASE handler. - """ - className: String - - """ - For the DATABASE handler, this is the database error code associated with the exception. - Not used for the GENERIC handler. - """ - code: String - - """ - For the DATABASE handler, this is the SQL state code (e.g. "23503" for foreign key violation). - SQL state codes are standardized and work across database vendors. - Can be used together with or instead of 'code'. - """ - sqlState: String - - """ - A string that the exception message must contain in order to be handled. - If not present, the handler will be used for all exceptions of the specified class. - """ - matches: String - - """ - Provides a description of the error to be returned to the user. If not provided, - the exception message will be used. - """ - description: String -} - -""" -Determines the type of the error handler to use. -""" -enum ErrorHandlerType { - GENERIC, - DATABASE -} - -""" -Helps create connections between tables where a simple implicit join would be insufficient. -In addition, this directive permits fields to be mapped to different tables than their surrounding object. -If neither table or key are provided and none can be automatically inferred, the condition is assumed to be sufficient to complete the join. -""" -directive @reference( - """The ordered list of reference elements composes the path from the table of this type to the table corresponding to the type of the field.""" - path: [ReferenceElement!]! -) on FIELD_DEFINITION | ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -""" -Similar to the reference directive, but for fields returning data from multiple tables. -""" -directive @multitableReference( - routes: [ReferencesForType!] -) on FIELD_DEFINITION - -input ReferencesForType { - "Name of the GraphQL type the reference path should apply to. This name is case sensitive." - typeName: String! - - "The ordered list of reference elements composes the path from the table of this type to the table corresponding to the type specified in the typeName parameter." - path: [ReferenceElement!]! -} - -"""Adjust constraints for this field, argument or input field.""" -directive @condition( - """Condition to be used. Available values are set in the plugin configuration.""" - condition: ExternalCodeReference, - """If true, this condition should be used instead of the usual checks that are generated.""" - override: Boolean = false, - """Arguments to include from the GraphQLContext. Context arguments must be added to the GraphQLContext at run-time.""" - contextArguments: [String!] -) on FIELD_DEFINITION | ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @lookupKey on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION -directive @mutation(typeName: MutationType!) on FIELD_DEFINITION - -"""Handle this input argument as orderBy functionality""" -directive @orderBy on ARGUMENT_DEFINITION - -"""Connect this enum value to an index with the given name. Deprecated: use @order(index:) instead.""" -directive @index(name: String) on ENUM_VALUE - -"""Connect this enum value to a sorting specification. Exactly one of index, fields, or primaryKey must be set.""" -directive @order( - """Name of the database index to use""" - index: String - """Field(s) to sort by, with optional collation""" - fields: [FieldSort!] - """Use primary key fields for sorting""" - primaryKey: Boolean = false -) on ENUM_VALUE - -"""Field sort specification for @order and @defaultOrder directives""" -input FieldSort { - """Database field name (as defined in the jOOQ table)""" - name: String! - """Collation to apply (e.g., "xdanish_ai"). Database-specific.""" - collate: String -} - -""" -Specifies the default sort order for this field when no @orderBy input is provided. -Uses a database index, field names, or primary key for consistent, efficient sorting. -If @orderBy input is also present and the user provides an orderBy value, that takes precedence. -Exactly one of index, fields, or primaryKey must be set. -""" -directive @defaultOrder( - """Name of the database index to use for sorting""" - index: String - """Field(s) to sort by, with optional collation""" - fields: [FieldSort!] - """Use primary key fields for sorting""" - primaryKey: Boolean = false - """Sort direction (default: ASC)""" - direction: SortDirection = ASC -) on FIELD_DEFINITION - -enum SortDirection { ASC, DESC } - -"""Wrap type in the given Java record. Currently, this can only be used with services.""" -directive @record(record: ExternalCodeReference) on OBJECT | INPUT_OBJECT - -enum MutationType { UPDATE, DELETE, INSERT, UPSERT } - -input ExternalCodeReference { - name: String @deprecated(reason: "Fases ut til fordel for `class`"), - """Navnet på klassen man ønsker å referere til. - - Dersom pakken klassen finnes i er importert i `externalReferences` i graphitron-konfigurasjonen så holder det med det forenklede navnet, ellers må det fullstendige navnet (fqcn) oppgis.""" - className: String - """Navnet på metoden man ønsker å referere til.""" - method: String -} - -input ReferenceElement { - """The jOOQ table to connect to.""" - table: String, - """The key to use to create this reference.""" - key: String, - """Extra condition for this reference. Available values are set in the plugin configuration.""" - condition: ExternalCodeReference -} - -directive @discriminate( - """Column that should be used to decide which subtype an object belongs to""" - on: String! -) on INTERFACE | UNION - -directive @discriminator( - """The descriminator value that means an object belongs to this subtype""" - value: String! -) on OBJECT - -directive @node( - """ - Value that identifies the type. It is embedded in the ID, and indicates where to look for the object identified by the ID. - If nothing is specified here, we use the name of the type. - Setting typeId can be set when you want a shorter ID, or an ID that remains the same even if the name of the type changes. - """ - typeId: String - - """ - Defines the order of the primary or unique key columns in the node ID. - These columns must correspond to the primary key or another unique key defined in the database schema. - - If you do not specify keyColumns, we use the primary key in the database and the order set there. - Note that in such a case, changing the primary key will cause the IDs to change, which can be undesirable. - """ - keyColumns: [String!] -) on OBJECT - -""" -Specifies that the field is a globally unique ID in accordance with our implementation of [Global Object Identification](https://graphql.org/learn/global-object-identification/). -If used as a reference in jOOQ record input types, the primary or unique key the foreign targets must match the key defined in the referenced type's @node-configuration. -""" -directive @nodeId( - """ - Name of the type the ID belongs to (case-sensitive). The type must have the @node directive set. - - This parameter is optional - if omitted, Graphitron will deduce the node type as follows: - * For object fields without the @reference directive, uses the containing type (if it is a node type) - * For fields with the @reference directive or jOOQ record input fields, uses the node type with the same table (if unambiguous) - """ - typeName: String -) on FIELD_DEFINITION | INPUT_FIELD_DEFINITION | ARGUMENT_DEFINITION - - -""" -Specifies that the table that is used on the field should be the jOOQ table returned from the specified tableMethod -""" -directive @tableMethod(tableMethodReference: ExternalCodeReference!, contextArguments: [String!]) on FIELD_DEFINITION - -""" -Specifies how fields should be resolved for nested types. This would typically be used with non-resolvable federation entities. -""" -directive @experimental_constructType( - """ - The selection argument specifies how we can construct the type of this field. - The key side references the field in the type we are constructing while the value side denotes the column we want to fetch the data from. - This is similar to what goes inside a selection set in GraphQL. The differences are: - - Does not support arguments - - Does not support variables - - Does not support nesting - - Examples: - ```graphql - @experimental_constructType(selection: "firstName: FIRST_NAME, lastName: LAST_NAME") - @experimental_constructType(selection: \""" - first_name, - surname: LAST_NAME - \""") - ``` - """ - selection: String -) on FIELD_DEFINITION - -""" -Specifies that this field should be resolved by calling a jOOQ-generated routine (function) inline. - -Currently: -- Only scalar-returning functions (`Field<T>`) are supported. OUT / INOUT parameters and record-returning procedures are not supported. -- Argument order is deduced from the routine's IN parameter order. The `arguments` map is keyed by parameter name, not positional. - -The directive has two attachment points, distinguished structurally by the presence of `target`: - -1. **Inline mode** (no `target`): the directive sits on a scalar field, and the function call fills in that field inline in the query. - Every argument value names a column on the surrounding type's table. - -2. **Target mode** (`target` set): the directive sits on a *data-fetcher field* (root field, field with arguments, or `@splitQuery` field) - whose return type is an object or list of objects, and `target` names a sibling scalar field on that return type whose spot the - function call fills. Uses top-level GraphQL arguments on the directive-bearing field as inputs. - -Mixing column- and argument-sources within a single directive is not allowed. -""" -directive @experimental_procedureCall( - """ - The routine name as returned by jOOQ's `Routine.getName()`, e.g. `inventory_held_by_customer`. - This matches the database name of the routine and is matched case-insensitively. - - If the same routine name exists in multiple database schemas, qualify it with `schema.routine` - (e.g. `audit.last_day`) to disambiguate. The schema prefix is only required when the bare name - is ambiguous; unique names work unqualified. - """ - procedure: String!, - """ - Mapping of routine IN parameter names to argument sources, using the same syntax as `@experimental_constructType`'s `selection` argument. - - The key side is the routine parameter name exactly as returned by jOOQ's `Parameter.getName()` - this is typically snake_case (e.g. `p_inventory_id`). - The value side is interpreted according to the directive's mode: - - In **inline mode** (no `target`): a column name on the surrounding table (e.g. `INVENTORY_ID`). - - In **target mode** (`target` set): the name of a top-level GraphQL argument on the directive-bearing field (e.g. `inventoryId`). - - Empty `arguments` are only valid when the function has zero IN parameters. - - Examples: - ```graphql - @experimental_procedureCall(procedure: "inventory_held_by_customer", arguments: "p_inventory_id: INVENTORY_ID") - @experimental_procedureCall(procedure: "some_func", arguments: \""" - p_first: FIRST_COLUMN, - p_second: SECOND_COLUMN - \""") - @experimental_procedureCall( - procedure: "inventory_held_by_customer", - target: "heldBy", - arguments: "p_inventory_id: inventoryId" - ) - ``` - """ - arguments: String, - """ - Names a scalar field in the data-fetcher's return type whose cell the function call fills (target mode). - When set, the directive must sit on a data-fetcher field (root field, field with arguments, or `@splitQuery` field) whose return - type is an object or list thereof. The named target must be a scalar field on the return type. Argument values then name GraphQL arguments on the directive-bearing field. - - Currently only a single field name is supported - nested paths (e.g. `foo.bar`) are not implemented. - """ - target: String -) on FIELD_DEFINITION diff --git a/graphitron-common/src/test/java/no/sikt/graphql/NodeIdStrategyTest.java b/graphitron-common/src/test/java/no/sikt/graphql/NodeIdStrategyTest.java deleted file mode 100644 index 2233d0beb5..0000000000 --- a/graphitron-common/src/test/java/no/sikt/graphql/NodeIdStrategyTest.java +++ /dev/null @@ -1,118 +0,0 @@ -package no.sikt.graphql; - -import no.sikt.jooq.example.VacationDestinationRecord; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; - -import static no.sikt.jooq.example.VacationDestination.VACATION_DESTINATION; -import static org.junit.jupiter.api.Assertions.*; - -class NodeIdStrategyTest { - @Test - void shouldCreateId() { - var actualId = new NodeIdStrategy().createId("1337", "keyColumn1", "keyColumn2"); - - assertEquals("MTMzNzprZXlDb2x1bW4xLGtleUNvbHVtbjI", actualId); - } - - @Test - void shouldReturnTypeId() { - assertEquals("1337", new NodeIdStrategy().getTypeId("MTMzNzprZXlDb2x1bW4xLGtleUNvbHVtbjI")); - } - - @Test - void shouldHandleKeyColumnsWithComma() { - assertEquals("MTQ6MCwxLDIlMkMsMw", new NodeIdStrategy().createId("14", "0", "1", "2,", "3")); - } - - @Test - void shouldThrowErrorWhenWrongId() { - var ex = assertThrows( - IllegalArgumentException.class, - () -> new NodeIdStrategy().getTypeId("MCwxLDIlMkMsMw") - ); - - assertEquals("MCwxLDIlMkMsMw (0,1,2%2C,3) is not a valid id", ex.getMessage()); - } - - @Test - @DisplayName("Setting primary key fields for record") - void setUniqueIdForRecord() { - var vacationDestinationRecord = new VacationDestinationRecord(); - new NodeIdStrategy().setId( - vacationDestinationRecord, - "VmFjYXRpb25EZXN0aW5hdGlvbjoxMjM0LE5vcndheQ==", // Decoded: VacationDestination:1234,Norway - "VacationDestination", - VACATION_DESTINATION.getPrimaryKey().getFieldsArray() - ); - - assertEquals(1234, vacationDestinationRecord.getDestinationId()); - assertEquals("Norway", vacationDestinationRecord.getCountryName()); - - assertTrue(vacationDestinationRecord.changed()); - } - - @Test - @DisplayName("Setting primary key fields for record, with the key fields provided in another order") - void setUniqueIdForRecordReverseOrder() { - var vacationDestinationRecord = new VacationDestinationRecord(); - new NodeIdStrategy().setId( - vacationDestinationRecord, - "VmFjYXRpb25EZXN0aW5hdGlvbjpOb3J3YXksMTIzNA==", // Decoded: VacationDestination:Norway,1234 - "VacationDestination", - VACATION_DESTINATION.COUNTRY_NAME, - VACATION_DESTINATION.DESTINATION_ID - ); - - assertEquals(1234, vacationDestinationRecord.getDestinationId()); - assertEquals("Norway", vacationDestinationRecord.getCountryName()); - - assertTrue(vacationDestinationRecord.changed()); - } - - @Test - @DisplayName("Setting foreign key fields for record") - void setReferenceIdForRecord() { - var vacationDestinationRecord = new VacationDestinationRecord(); - - new NodeIdStrategy().setReferenceId( - vacationDestinationRecord, - "VjoxMjM0LDE=", // Decoded: V:1234,1 - "V", - VACATION_DESTINATION.VACATION_ID, - VACATION_DESTINATION.EXTRA_KEY - ); - assertEquals(1234, vacationDestinationRecord.getVacationId()); - assertEquals(1, vacationDestinationRecord.getExtraKey()); - - assertTrue(vacationDestinationRecord.changed()); - } - - @Test - @DisplayName("nodeIdToTableRecord creates a record with node ID fields populated") - void nodeIdIsMappedToTableRecord() { - var record = new NodeIdStrategy().nodeIdToTableRecord( - "VmFjYXRpb25EZXN0aW5hdGlvbjoxMjM0LE5vcndheQ==", // Decoded: VacationDestination:1234,Norway - "VacationDestination", - List.of(VACATION_DESTINATION.DESTINATION_ID, VACATION_DESTINATION.COUNTRY_NAME) - ); - - assertNotNull(record); - assertEquals(1234, record.getDestinationId()); - assertEquals("Norway", record.getCountryName()); - } - - @Test - @DisplayName("Node IDs with different base64 padding are considered equal") - void nodeIdsWithDifferentPaddingAreEqual() { - assertTrue(new NodeIdStrategy().areEqualNodeIds("QzoxCg==", "QzoxCg")); - } - - @Test - @DisplayName("areEqualNodeIds returns false when decoding fails, even if inputs are equal") - void returnsFalseWhenDecodingFails() { - assertFalse(new NodeIdStrategy().areEqualNodeIds("@", "@")); - } -} \ No newline at end of file diff --git a/graphitron-common/src/test/java/no/sikt/graphql/exception/DataAccessMatcherTest.java b/graphitron-common/src/test/java/no/sikt/graphql/exception/DataAccessMatcherTest.java deleted file mode 100644 index e478db0fed..0000000000 --- a/graphitron-common/src/test/java/no/sikt/graphql/exception/DataAccessMatcherTest.java +++ /dev/null @@ -1,88 +0,0 @@ -package no.sikt.graphql.exception; - -import org.jooq.exception.DataAccessException; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.sql.SQLException; - -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class DataAccessMatcherTest { - - private static DataAccessException createExceptionWithSqlCause(int errorCode, String sqlState, String message) { - var sqlException = new SQLException(message, sqlState, errorCode); - return new DataAccessException(message, sqlException); - } - - @Test - @DisplayName("matches on error code only") - void matchesOnErrorCode() { - var matcher = new DataAccessMatcher("1", null, null); - assertTrue(matcher.matches(createExceptionWithSqlCause(1, "23000", "some message"))); - } - - @Test - @DisplayName("does not match when error code differs") - void notMatchesWrongErrorCode() { - var matcher = new DataAccessMatcher("1", null, null); - assertFalse(matcher.matches(createExceptionWithSqlCause(2, "23000", "some message"))); - } - - @Test - @DisplayName("matches on sqlState only") - void matchesOnSqlState() { - var matcher = new DataAccessMatcher(null, "23503", null); - assertTrue(matcher.matches(createExceptionWithSqlCause(0, "23503", "some message"))); - } - - @Test - @DisplayName("does not match when sqlState differs") - void notMatchesWrongSqlState() { - var matcher = new DataAccessMatcher(null, "23503", null); - assertFalse(matcher.matches(createExceptionWithSqlCause(0, "23514", "some message"))); - } - - @Test - @DisplayName("matches on both error code and sqlState") - void matchesOnBothCodeAndSqlState() { - var matcher = new DataAccessMatcher("1", "23000", null); - assertTrue(matcher.matches(createExceptionWithSqlCause(1, "23000", "some message"))); - } - - @Test - @DisplayName("does not match when code matches but sqlState differs") - void notMatchesCodeMatchesSqlStateDiffers() { - var matcher = new DataAccessMatcher("1", "23503", null); - assertFalse(matcher.matches(createExceptionWithSqlCause(1, "23000", "some message"))); - } - - @Test - @DisplayName("matches on sqlState with message substring") - void matchesOnSqlStateWithMessage() { - var matcher = new DataAccessMatcher(null, "23514", "year_check"); - assertTrue(matcher.matches(createExceptionWithSqlCause(0, "23514", "violates constraint year_check"))); - } - - @Test - @DisplayName("does not match when sqlState matches but message does not") - void notMatchesSqlStateMatchesMessageDiffers() { - var matcher = new DataAccessMatcher(null, "23514", "year_check"); - assertFalse(matcher.matches(createExceptionWithSqlCause(0, "23514", "violates constraint other_check"))); - } - - @Test - @DisplayName("matches when neither code nor sqlState is specified") - void matchesWhenNeitherCodeNorSqlState() { - var matcher = new DataAccessMatcher(null, null, null); - assertTrue(matcher.matches(createExceptionWithSqlCause(0, "23503", "some message"))); - } - - @Test - @DisplayName("does not match when no SQL cause exists") - void notMatchesNoSqlCause() { - var matcher = new DataAccessMatcher(null, "23503", null); - assertFalse(matcher.matches(new DataAccessException("no sql cause"))); - } -} diff --git a/graphitron-common/src/test/java/no/sikt/graphql/exception/ErrorMessageFormatterTest.java b/graphitron-common/src/test/java/no/sikt/graphql/exception/ErrorMessageFormatterTest.java deleted file mode 100644 index e2c8013c57..0000000000 --- a/graphitron-common/src/test/java/no/sikt/graphql/exception/ErrorMessageFormatterTest.java +++ /dev/null @@ -1,149 +0,0 @@ -package no.sikt.graphql.exception; - -import org.jooq.exception.DataAccessException; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.sql.SQLException; - -import static org.assertj.core.api.Assertions.assertThat; - -class ErrorMessageFormatterTest { - - private ErrorMessageFormatter formatter; - - @BeforeEach - void setUp() { - formatter = new ErrorMessageFormatter(); - } - - @Test - @DisplayName("formats unique constraint violation") - void shouldFormatUniqueConstraintViolation() { - SQLException sqlException = new SQLException( - "ERROR: duplicate key value violates unique constraint \"user_email_key\"", - "23505" - ); - DataAccessException exception = new DataAccessException("Database error", sqlException); - - String result = formatter.formatDataAccessException(exception); - - assertThat(result).isEqualTo("Duplicate value not allowed"); - } - - @Test - @DisplayName("formats foreign key constraint violation") - void shouldFormatForeignKeyViolation() { - SQLException sqlException = new SQLException( - "ERROR: violates foreign key constraint", - "23503" - ); - DataAccessException exception = new DataAccessException("Database error", sqlException); - - String result = formatter.formatDataAccessException(exception); - - assertThat(result).isEqualTo("Referenced record does not exist"); - } - - @Test - @DisplayName("formats not null constraint violation") - void shouldFormatNotNullViolation() { - SQLException sqlException = new SQLException( - "ERROR: null value in column violates not-null constraint", - "23502" - ); - DataAccessException exception = new DataAccessException("Database error", sqlException); - - String result = formatter.formatDataAccessException(exception); - - assertThat(result).isEqualTo("Required field cannot be empty"); - } - - @Test - @DisplayName("formats check constraint violation with constraint name") - void shouldFormatCheckConstraintViolation() { - SQLException sqlException = new SQLException( - "ERROR: new row for relation \"film\" violates check constraint \"year_check\"", - "23514" - ); - DataAccessException exception = new DataAccessException("Database error", sqlException); - - String result = formatter.formatDataAccessException(exception); - - assertThat(result).isEqualTo("Value violates constraint: year"); - } - - @Test - @DisplayName("formats check constraint violation without constraint name") - void shouldFormatCheckConstraintViolationWithoutName() { - SQLException sqlException = new SQLException( - "ERROR: violates check constraint", - "23514" - ); - DataAccessException exception = new DataAccessException("Database error", sqlException); - - String result = formatter.formatDataAccessException(exception); - - assertThat(result).isEqualTo("Value does not meet validation requirements"); - } - - @Test - @DisplayName("formats data too long error") - void shouldFormatDataTooLong() { - SQLException sqlException = new SQLException( - "ERROR: value too long for type character varying(100)", - "22001" - ); - DataAccessException exception = new DataAccessException("Database error", sqlException); - - String result = formatter.formatDataAccessException(exception); - - assertThat(result).isEqualTo("Value exceeds maximum length"); - } - - @Test - @DisplayName("cleans up generic SQL error messages") - void shouldCleanupGenericSqlError() { - SQLException sqlException = new SQLException( - "ERROR: Something went wrong", - "99999" - ); - DataAccessException exception = new DataAccessException("Database error", sqlException); - - String result = formatter.formatDataAccessException(exception); - - assertThat(result).isEqualTo("Something went wrong"); - } - - @Test - @DisplayName("handles DataAccessException without SQL cause") - void shouldHandleExceptionWithoutSqlCause() { - DataAccessException exception = new DataAccessException("Connection timeout"); - - String result = formatter.formatDataAccessException(exception); - - assertThat(result).isEqualTo("Connection timeout"); - } - - @Test - @DisplayName("handles SQLException with null message") - void shouldHandleSqlExceptionWithNullMessage() { - SQLException sqlException = new SQLException(null, "23505"); - DataAccessException exception = new DataAccessException("Database error", sqlException); - - String result = formatter.formatDataAccessException(exception); - - assertThat(result).isEqualTo("Database error"); - } - - @Test - @DisplayName("handles exception with blank message") - void shouldHandleExceptionWithBlankMessage() { - DataAccessException exception = new DataAccessException(" "); - - String result = formatter.formatDataAccessException(exception); - - assertThat(result).isEqualTo("Database operation failed"); - } -} \ No newline at end of file diff --git a/graphitron-common/src/test/java/no/sikt/graphql/exception/ExceptionStrategyTest.java b/graphitron-common/src/test/java/no/sikt/graphql/exception/ExceptionStrategyTest.java deleted file mode 100644 index c8539abd2d..0000000000 --- a/graphitron-common/src/test/java/no/sikt/graphql/exception/ExceptionStrategyTest.java +++ /dev/null @@ -1,222 +0,0 @@ -package no.sikt.graphql.exception; - -import graphql.execution.ExecutionStepInfo; -import graphql.execution.ResultPath; -import graphql.schema.DataFetchingEnvironment; -import graphql.schema.GraphQLFieldDefinition; -import org.jooq.exception.DataAccessException; -import org.jooq.exception.IntegrityConstraintViolationException; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; - -import java.net.BindException; -import java.util.*; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; - -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -@ExtendWith(MockitoExtension.class) -public class ExceptionStrategyTest { - - private static final String MUTATION1_NAME = "mutation1"; - private static final String MUTATION_1_PAYLOAD = "mutation1Payload"; - - @Mock - private DataFetchingEnvironment mockEnvironment; - @Mock - private GraphQLFieldDefinition mockFieldDefinition; - - private SchemaBasedErrorStrategy underTest; - - private final DataAccessExceptionMapper dataAccessExceptionMapper = new DataAccessExceptionMapper() { - @Override - public String getMsgFromException(DataAccessException exception) { - return "configured exception message"; - } - }; - - @BeforeEach - void setUp() { - var exceptionToErrorMappingProvider = new TestExceptionToErrorMappingProvider(); - underTest = new TestSchemaBasedErrorStrategy( - new TestMutationExceptionStrategyConfiguration(), - exceptionToErrorMappingProvider, - dataAccessExceptionMapper - ); - when(mockEnvironment.getFieldDefinition()).thenReturn(mockFieldDefinition); - when(mockFieldDefinition.getName()).thenReturn(MUTATION1_NAME); - } - - @Test - @DisplayName("handleException returns payload when ValidationViolationGraphQLException should be handled") - void shouldReturnPayloadWhenValidationViolationGraphQLExceptionShouldBeHandled() throws ExecutionException, InterruptedException { - Throwable thrownException = new ValidationViolationGraphQLException(List.of()); - - assertThat(underTest.handleException(mockEnvironment, thrownException).orElseThrow().get()).isEqualTo(MUTATION_1_PAYLOAD); - } - - @Test - @DisplayName("handleException returns payload when IllegalArgumentException should be handled") - void shouldReturnPayloadWhenIllegalArgumentExceptionShouldBeHandled() throws ExecutionException, InterruptedException { - var executionStepInfo = mock(ExecutionStepInfo.class); - when(executionStepInfo.getPath()).thenReturn(mock(ResultPath.class)); - when(mockEnvironment.getExecutionStepInfo()).thenReturn(executionStepInfo); - Throwable thrownException = new IllegalArgumentException(); - - assertThat(underTest.handleException(mockEnvironment, thrownException).orElseThrow().get()).isEqualTo(MUTATION_1_PAYLOAD); - } - - @Test - @DisplayName("handleException returns payload when DataAccessException should be handled") - void shouldReturnPayloadWhenDataAccessExceptionShouldBeHandled() throws ExecutionException, InterruptedException { - Throwable thrownException = new DataAccessException("error"); - - assertThat(underTest.handleException(mockEnvironment, thrownException).orElseThrow().get()).isEqualTo(MUTATION_1_PAYLOAD); - } - - @Test - @DisplayName("handleException returns payload when exception extending DataAccessException should be handled") - void shouldReturnPayloadWhenExtensionOfDataAccessExceptionShouldBeHandled() throws ExecutionException, InterruptedException { - Throwable thrownException = new IntegrityConstraintViolationException("error"); //IntegrityConstraintViolationException extends DataAccessException - - assertThat(underTest.handleException(mockEnvironment, thrownException).orElseThrow().get()).isEqualTo(MUTATION_1_PAYLOAD); - } - - @Test - @DisplayName("handleException returns payload when some generic exception matches") - void shouldReturnPayloadWhenSomeGenericExceptionMatches() throws ExecutionException, InterruptedException { - Throwable thrownException = new BindException("the exception must contain substring of message to be handled"); - - assertThat(underTest.handleException(mockEnvironment, thrownException).orElseThrow().get()).isEqualTo(MUTATION_1_PAYLOAD); - } - - @Test - @DisplayName("handleException returns empty when the exception message does not match") - void shouldReturnEmptyWhenTheExceptionMessageDoesNotMatch() { - Throwable thrownException = new BindException("wrong message"); - - assertThat(underTest.handleException(mockEnvironment, thrownException)).isEmpty(); - } - - @Test - @DisplayName("handleException returns empty when the exception type does not match") - void shouldReturnEmptyWhenTheExceptionTypeDoesNotMatch() { - Throwable thrownException = new ArithmeticException("some message"); - - assertThat(underTest.handleException(mockEnvironment, thrownException)).isEmpty(); - } - - @Test - @DisplayName("handleException returns empty when the mutation is not configured for the exception type") - void shouldReturnEmptyWhenTheMutationIsNotConfiguredForTheExceptionType() { - when(mockFieldDefinition.getName()).thenReturn("unconfigured_mutation"); - Throwable thrownException = new ValidationViolationGraphQLException(List.of()); - - assertThat(underTest.handleException(mockEnvironment, thrownException)).isEmpty(); - } - - private static class TestSchemaBasedErrorStrategy extends SchemaBasedErrorStrategy { - - public TestSchemaBasedErrorStrategy( - ExceptionStrategyConfiguration configuration, - ExceptionToErrorMappingProvider mappingProvider, - DataAccessExceptionMapper dataAccessMapper) { - super(configuration, mappingProvider, dataAccessMapper); - } - - @Override - public Optional<CompletableFuture<Object>> handleValidationException( - ValidationViolationGraphQLException e, - String operationName) { - return Optional.of(CompletableFuture.completedFuture(MUTATION_1_PAYLOAD)); - } - - @Override - public Optional<CompletableFuture<Object>> handleIllegalArgumentException( - IllegalArgumentException e, - String operationName, - ResultPath path) { - return Optional.of(CompletableFuture.completedFuture(MUTATION_1_PAYLOAD)); - } - - @Override - protected Object createDefaultDataAccessError(String operationName, String message) { - return new SomeError(List.of(operationName), message); - } - - @Override - protected Optional<CompletableFuture<Object>> createPayload(String operationName, List<?> errors) { - // For testing, just return the constant payload - return Optional.of(CompletableFuture.completedFuture(MUTATION_1_PAYLOAD)); - } - } - - // Test configuration classes - private static class TestMutationExceptionStrategyConfiguration implements ExceptionStrategyConfiguration { - @Override - public Map<Class<? extends Throwable>, Set<String>> getFieldsForException() { - Map<Class<? extends Throwable>, Set<String>> fieldMapping = new HashMap<>(); - fieldMapping.put(ValidationViolationGraphQLException.class, Set.of(MUTATION1_NAME)); - fieldMapping.put(IllegalArgumentException.class, Set.of(MUTATION1_NAME)); - fieldMapping.put(DataAccessException.class, Set.of(MUTATION1_NAME)); - fieldMapping.put(BindException.class, Set.of(MUTATION1_NAME)); - return fieldMapping; - } - - @Override - public Map<String, PayloadCreator> getPayloadForField() { - Map<String, PayloadCreator> payloadMapping = new HashMap<>(); - payloadMapping.put(MUTATION1_NAME, errors -> MUTATION_1_PAYLOAD); - return payloadMapping; - } - } - - private static class TestExceptionToErrorMappingProvider implements ExceptionToErrorMappingProvider { - private final Map<String, List<DataAccessExceptionContentToErrorMapping>> dataAccessMappingsForOperation; - private final Map<String, List<GenericExceptionContentToErrorMapping>> genericMappingsForOperation; - - public TestExceptionToErrorMappingProvider() { - dataAccessMappingsForOperation = new HashMap<>(); - genericMappingsForOperation = new HashMap<>(); - - var m1 = new DataAccessExceptionContentToErrorMapping( - new DataAccessMatcher("20997", null, null), - (path, msg) -> new SomeError(path, "This is an error")); - - var mutation1DatabaseList = List.of(m1); - - var m2 = new GenericExceptionContentToErrorMapping( - new GenericExceptionMatcher("java.lang.ArithmeticException", null), - (path, msg) -> new SomeError(path, "This is an error")); - var m3 = new GenericExceptionContentToErrorMapping( - new GenericExceptionMatcher("java.net.BindException", "substring of message"), - SomeError::new); - - var mutation1GenericList = List.of(m2, m3); - - dataAccessMappingsForOperation.put(MUTATION1_NAME, mutation1DatabaseList); - genericMappingsForOperation.put(MUTATION1_NAME, mutation1GenericList); - } - - @Override - public Map<String, List<DataAccessExceptionContentToErrorMapping>> getDataAccessMappingsForOperation() { - return dataAccessMappingsForOperation; - } - - @Override - public Map<String, List<GenericExceptionContentToErrorMapping>> getGenericMappingsForOperation() { - return genericMappingsForOperation; - } - } - - // Simple error class for testing - private record SomeError(List<String> path, String msg) { - } -} \ No newline at end of file diff --git a/graphitron-common/src/test/java/no/sikt/graphql/exception/GenericExceptionMatcherTest.java b/graphitron-common/src/test/java/no/sikt/graphql/exception/GenericExceptionMatcherTest.java deleted file mode 100644 index 8c5db44e9e..0000000000 --- a/graphitron-common/src/test/java/no/sikt/graphql/exception/GenericExceptionMatcherTest.java +++ /dev/null @@ -1,95 +0,0 @@ -package no.sikt.graphql.exception; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.concurrent.CancellationException; - -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; - - -class GenericExceptionMatcherTest { - - private GenericExceptionMatcher underTest; - - @BeforeEach - void setUp() { - underTest = new GenericExceptionMatcher("java.lang.IllegalStateException", "test message"); - } - - @Test - @DisplayName("matches returns true when exception class and message match") - void matchesClassAndMessage() { - Throwable throwable = new IllegalStateException("test message"); - - assertTrue(underTest.matches(throwable)); - } - - @Test - @DisplayName("matches returns true when exception class and message match as substring of the exception message") - void matchesClassAndMessageSubstring() { - Throwable throwable = new IllegalStateException("some message that contains test message bla bla"); - - assertTrue(underTest.matches(throwable)); - } - - @Test - @DisplayName("matches returns false when exception class does not match") - void notMatchesWrongClass() { - Throwable throwable = new IllegalArgumentException("test message"); - - assertFalse(underTest.matches(throwable)); - } - - @Test - @DisplayName("matches returns false when exception message does not match") - void notMatchesWrongMessage() { - Throwable throwable = new IllegalStateException("different message"); - - assertFalse(underTest.matches(throwable)); - } - - @Test - @DisplayName("matches returns true when exception class and message match in cause") - void matchesInCause() { - Throwable cause = new IllegalStateException("test message"); - Throwable throwable = new IllegalArgumentException("different message", cause); - - assertTrue(underTest.matches(throwable)); - } - - @Test - @DisplayName("matches returns true when exception class matches via instanceOf") - void matchesSubclass() { - Throwable throwable = new CancellationException("test message"); //CancellationException is a subclass of IllegalStateException - - assertTrue(underTest.matches(throwable)); - } - - @Test - @DisplayName("matches returns false when exception class is superclass of the provided class") - void notMatchesSuperclass() { - Throwable throwable = new RuntimeException("test message"); //RuntimeException is a superclass of IllegalStateException - - assertFalse(underTest.matches(throwable)); - } - - @Test - @DisplayName("matches returns false when no exception message is provided") - void notMatchesNullMessage() { - Throwable throwable = new IllegalStateException(); - - assertFalse(underTest.matches(throwable)); - } - - @Test - @DisplayName("matches returns false when exception class is not found on classpath") - void notMatchesUnknownClass() { - var matcher = new GenericExceptionMatcher("com.example.NonExistentException", null); - Throwable throwable = new RuntimeException("any message"); - - assertFalse(matcher.matches(throwable)); - } -} \ No newline at end of file diff --git a/graphitron-common/src/test/java/no/sikt/graphql/exception/TopLevelErrorHandlerHandlerTest.java b/graphitron-common/src/test/java/no/sikt/graphql/exception/TopLevelErrorHandlerHandlerTest.java deleted file mode 100644 index e025ffddbe..0000000000 --- a/graphitron-common/src/test/java/no/sikt/graphql/exception/TopLevelErrorHandlerHandlerTest.java +++ /dev/null @@ -1,96 +0,0 @@ -package no.sikt.graphql.exception; - -import graphql.GraphqlErrorBuilder; -import graphql.execution.DataFetcherExceptionHandlerParameters; -import graphql.execution.DataFetcherExceptionHandlerResult; -import graphql.execution.ExecutionStepInfo; -import graphql.language.Field; -import graphql.schema.DataFetchingEnvironment; -import org.jooq.exception.DataAccessException; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; - -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - - -@ExtendWith(MockitoExtension.class) -class TopLevelErrorHandlerHandlerTest { - - @Mock - private DataFetcherExceptionHandlerParameters mockHandlerParameters; - @Mock - private DataFetchingEnvironment mockDataFetchingEnvironment; - - private final DataAccessExceptionMapper dataAccessExceptionMapper = new DataAccessExceptionMapper() { - @Override - public String getMsgFromException(DataAccessException exception) { - return "configured exception message"; - } - }; - - @Test - public void shouldHandleValidationViolationGraphQLException() { - String exceptionMsg = "Validation violation"; - when(mockHandlerParameters.getException()).thenReturn(new ValidationViolationGraphQLException(List.of(GraphqlErrorBuilder.newError().message(exceptionMsg).build()))); - - DataFetcherExceptionHandlerResult result = new TopLevelErrorHandler(dataAccessExceptionMapper).handleException(mockHandlerParameters).join(); - - assertThat(result.getErrors()).hasSize(1); - assertThat(result.getErrors().get(0).getMessage()).isEqualTo(exceptionMsg); - } - - @Test - public void shouldHandleIllegalArgumentException() { - setupDataFetchingEnvironmentMock(); - - String exceptionMsg = "Illegal argument"; - when(mockHandlerParameters.getException()).thenReturn(new IllegalArgumentException(exceptionMsg)); - - DataFetcherExceptionHandlerResult result = new TopLevelErrorHandler(dataAccessExceptionMapper).handleException(mockHandlerParameters).join(); - - assertThat(result.getErrors()).hasSize(1); - assertThat(result.getErrors().get(0).getMessage()).isEqualTo(exceptionMsg); - } - - @Test - public void shouldHandleDataAccessException() { - setupDataFetchingEnvironmentMock(); - - String exceptionMsg = "Database exception"; - when(mockHandlerParameters.getException()).thenReturn(new DataAccessException(exceptionMsg)); - - DataFetcherExceptionHandlerResult result = new TopLevelErrorHandler(dataAccessExceptionMapper).handleException(mockHandlerParameters).join(); - - assertThat(result.getErrors()).hasSize(1); - String actualErrorMessage = result.getErrors().get(0).getMessage(); - assertThat(actualErrorMessage).startsWith("An exception occurred. The error has been logged with id "); - assertThat(actualErrorMessage).endsWith(dataAccessExceptionMapper.getMsgFromException(new DataAccessException(exceptionMsg))); - } - - @Test - public void shouldHandleUnrecognizedException() { - setupDataFetchingEnvironmentMock(); - - String exceptionMsg = "Implementation details that should not be exposed"; - when(mockHandlerParameters.getException()).thenReturn(new Exception(exceptionMsg)); - - DataFetcherExceptionHandlerResult result = new TopLevelErrorHandler(dataAccessExceptionMapper).handleException(mockHandlerParameters).join(); - - assertThat(result.getErrors()).hasSize(1); - String actualErrorMessage = result.getErrors().get(0).getMessage(); - assertThat(actualErrorMessage).startsWith("An exception occurred. The error has been logged with id "); - assertThat(actualErrorMessage).doesNotContain(exceptionMsg); - } - - private void setupDataFetchingEnvironmentMock() { - when(mockDataFetchingEnvironment.getField()).thenReturn(mock(Field.class)); - when(mockDataFetchingEnvironment.getExecutionStepInfo()).thenReturn(mock(ExecutionStepInfo.class)); - when(mockHandlerParameters.getDataFetchingEnvironment()).thenReturn(mockDataFetchingEnvironment); - } -} \ No newline at end of file diff --git a/graphitron-common/src/test/java/no/sikt/graphql/helpers/resolvers/ArgumentPresenceTest.java b/graphitron-common/src/test/java/no/sikt/graphql/helpers/resolvers/ArgumentPresenceTest.java deleted file mode 100644 index 2fc41bd85d..0000000000 --- a/graphitron-common/src/test/java/no/sikt/graphql/helpers/resolvers/ArgumentPresenceTest.java +++ /dev/null @@ -1,299 +0,0 @@ -package no.sikt.graphql.helpers.resolvers; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static org.assertj.core.api.Assertions.assertThat; - -class ArgumentPresenceTest { - - @Nested - @DisplayName("build") - class BuildTest { - - @Test - @DisplayName("list input with per-element fields") - void listInputWithPerElementFields() { - Map<String, Object> arguments = Map.of( - "in", List.of( - Map.of("id", "123", "name", "test"), - Map.of("id", "456", "active", true) - ) - ); - - var presence = ArgumentPresence.build(arguments); - - assertThat(presence.hasField("in")).isTrue(); - assertThat(presence.child("in").itemAt(0).hasField("id")).isTrue(); - assertThat(presence.child("in").itemAt(0).hasField("name")).isTrue(); - assertThat(presence.child("in").itemAt(0).hasField("active")).isFalse(); - assertThat(presence.child("in").itemAt(1).hasField("id")).isTrue(); - assertThat(presence.child("in").itemAt(1).hasField("active")).isTrue(); - assertThat(presence.child("in").itemAt(1).hasField("name")).isFalse(); - } - - @Test - @DisplayName("single non-list scalar argument") - void singleNonListArgument() { - Map<String, Object> arguments = Map.of("title", "hello"); - - var presence = ArgumentPresence.build(arguments); - - assertThat(presence.hasField("title")).isTrue(); - assertThat(presence.child("title").isEmpty()).isTrue(); - } - - @Test - @DisplayName("nested map inside list elements") - void nestedMapInsideListElements() { - Map<String, Object> arguments = Map.of( - "in", List.of( - Map.of("address", Map.of("city", "Oslo", "zip", "0123")), - Map.of("address", Map.of("city", "Bergen")) - ) - ); - - var presence = ArgumentPresence.build(arguments); - - assertThat(presence.child("in").itemAt(0).child("address").hasField("city")).isTrue(); - assertThat(presence.child("in").itemAt(0).child("address").hasField("zip")).isTrue(); - assertThat(presence.child("in").itemAt(1).child("address").hasField("city")).isTrue(); - assertThat(presence.child("in").itemAt(1).child("address").hasField("zip")).isFalse(); - } - - @Test - @DisplayName("single map argument (not in a list)") - void singleMapArgument() { - Map<String, Object> arguments = Map.of( - "in", Map.of("id", "123", "name", "test") - ); - - var presence = ArgumentPresence.build(arguments); - - assertThat(presence.hasField("in")).isTrue(); - assertThat(presence.child("in").hasField("id")).isTrue(); - assertThat(presence.child("in").hasField("name")).isTrue(); - } - - @Test - @DisplayName("explicit null is present, absent field is not") - void explicitNullVsAbsent() { - var element0 = new HashMap<String, Object>(); - element0.put("id", "123"); - element0.put("name", null); - - var element1 = new HashMap<String, Object>(); - element1.put("id", "456"); - - Map<String, Object> arguments = Map.of("in", List.of(element0, element1)); - - var presence = ArgumentPresence.build(arguments); - - assertThat(presence.child("in").itemAt(0).hasField("id")).isTrue(); - assertThat(presence.child("in").itemAt(0).hasField("name")).isTrue(); - assertThat(presence.child("in").itemAt(1).hasField("id")).isTrue(); - assertThat(presence.child("in").itemAt(1).hasField("name")).isFalse(); - } - - @Test - @DisplayName("deeply nested: list → object → list → object") - void deeplyNested() { - Map<String, Object> arguments = Map.of( - "in", List.of( - Map.of("films", List.of( - Map.of("title", "Film A", "rentalDuration", 3), - Map.of("title", "Film B") - )) - ) - ); - - var presence = ArgumentPresence.build(arguments); - - assertThat(presence.child("in").itemAt(0).child("films").itemAt(0).hasField("title")).isTrue(); - assertThat(presence.child("in").itemAt(0).child("films").itemAt(0).hasField("rentalDuration")).isTrue(); - assertThat(presence.child("in").itemAt(0).child("films").itemAt(1).hasField("title")).isTrue(); - assertThat(presence.child("in").itemAt(0).child("films").itemAt(1).hasField("rentalDuration")).isFalse(); - } - } - - @Nested - @DisplayName("navigation") - class NavigationTest { - - @Test - @DisplayName("EMPTY returns EMPTY for all navigation and false for hasField") - void emptyBehavior() { - assertThat(ArgumentPresence.EMPTY.hasField("anything")).isFalse(); - assertThat(ArgumentPresence.EMPTY.child("anything")).isSameAs(ArgumentPresence.EMPTY); - assertThat(ArgumentPresence.EMPTY.itemAt(0)).isSameAs(ArgumentPresence.EMPTY); - assertThat(ArgumentPresence.EMPTY.isEmpty()).isTrue(); - } - - @Test - @DisplayName("missing child returns EMPTY") - void missingChildReturnsEmpty() { - var presence = ArgumentPresence.build(Map.of("a", "value")); - - assertThat(presence.child("missing")).isSameAs(ArgumentPresence.EMPTY); - assertThat(presence.child("missing").hasField("x")).isFalse(); - } - - @Test - @DisplayName("out of range index returns EMPTY") - void outOfRangeIndexReturnsEmpty() { - var presence = ArgumentPresence.build(Map.of("in", List.of(Map.of("id", "1")))); - - assertThat(presence.child("in").itemAt(99).hasField("id")).isFalse(); - } - } - - @Nested - @DisplayName("asSingleItem") - class AsSingleItemTest { - - @Test - @DisplayName("wraps this node so itemAt(0) returns it") - void wrapsAsSingleItem() { - var presence = ArgumentPresence.build(Map.of("id", "123", "name", "test")); - - var wrapped = presence.asSingleItem(); - - assertThat(wrapped.itemAt(0).hasField("id")).isTrue(); - assertThat(wrapped.itemAt(0).hasField("name")).isTrue(); - assertThat(wrapped.itemAt(1).hasField("id")).isFalse(); - } - - @Test - @DisplayName("single-item wrapping of a non-list input mirrors List.of() pattern") - void singleItemMirrorsListOfPattern() { - // Simulates: input is a single map {title: "X", rentalDuration: null} - // RecordTransformer wraps in List.of() and calls asSingleItem() - var element = new HashMap<String, Object>(); - element.put("title", "X"); - element.put("rentalDuration", null); - - var presence = ArgumentPresence.build(Map.of("in", element)); - var inPresence = presence.child("in"); - - // The single-item overload wraps: asSingleItem() - var wrapped = inPresence.asSingleItem(); - - // Mapper iterates and calls itemAt(0): - var item0 = wrapped.itemAt(0); - assertThat(item0.hasField("title")).isTrue(); - assertThat(item0.hasField("rentalDuration")).isTrue(); - } - } - - @Nested - @DisplayName("end-to-end") - class EndToEndTest { - - @Test - @DisplayName("explicit null vs absent in list mutation input") - void explicitNullVsAbsentInListMutation() { - var element0 = new HashMap<String, Object>(); - element0.put("title", "Film A"); - element0.put("rentalDuration", null); - - var element1 = new HashMap<String, Object>(); - element1.put("title", "Film B"); - - Map<String, Object> arguments = Map.of("in", List.of(element0, element1)); - - var presence = ArgumentPresence.build(arguments); - var inPresence = presence.child("in"); - - var args0 = inPresence.itemAt(0); - assertThat(args0.hasField("title")).isTrue(); - assertThat(args0.hasField("rentalDuration")).isTrue(); - - var args1 = inPresence.itemAt(1); - assertThat(args1.hasField("title")).isTrue(); - assertThat(args1.hasField("rentalDuration")).isFalse(); - } - - @Test - @DisplayName("non-record wrapper fields inside a list item require child() navigation") - void nonRecordWrapperFieldsRequireChildNavigation() { - // Simulates the pattern: input: [{termin: {arstall: 2026, termintype: "VAR"}}] - // The generated mapper checks fields inside a non-record wrapper (termin) using - // _iv_args.child("termin").hasField("arstall"), NOT _iv_args.hasField("arstall"). - Map<String, Object> arguments = Map.of( - "input", List.of( - Map.of("termin", Map.of("arstall", 2026, "termintype", "VAR")) - ) - ); - - var presence = ArgumentPresence.build(arguments); - var item0 = presence.child("input").itemAt(0); - - // The wrapper field itself is present at the element level - assertThat(item0.hasField("termin")).isTrue(); - - // Fields inside the wrapper are NOT direct children of the element - assertThat(item0.hasField("arstall")).as("arstall is not a direct child of the element").isFalse(); - assertThat(item0.hasField("termintype")).as("termintype is not a direct child of the element").isFalse(); - - // They must be accessed via child() navigation - assertThat(item0.child("termin").hasField("arstall")).isTrue(); - assertThat(item0.child("termin").hasField("termintype")).isTrue(); - } - - @Test - @DisplayName("double-nested non-record wrapper requires chained child() navigation") - void doubleNestedNonRecordWrapper() { - // Simulates: input: [{outer: {inner: {field: "value"}}}] - Map<String, Object> arguments = Map.of( - "input", List.of( - Map.of("outer", Map.of("inner", Map.of("field", "value"))) - ) - ); - - var presence = ArgumentPresence.build(arguments); - var item0 = presence.child("input").itemAt(0); - - assertThat(item0.hasField("outer")).isTrue(); - assertThat(item0.hasField("inner")).as("inner is not a direct child of the element").isFalse(); - assertThat(item0.hasField("field")).as("field is not a direct child of the element").isFalse(); - - assertThat(item0.child("outer").hasField("inner")).isTrue(); - assertThat(item0.child("outer").child("inner").hasField("field")).isTrue(); - } - - @Test - @DisplayName("nested non-list input inside a list item") - void nestedNonListInsideListItem() { - // Simulates: in: [{fornavn: "Ola", folkeregistrertAdresse: {gate: "Gata 1", postnummer: "0123"}}] - Map<String, Object> arguments = Map.of( - "input", List.of( - Map.of( - "fornavn", "Ola", - "folkeregistrertAdresse", Map.of("gate", "Gata 1", "postnummer", "0123") - ) - ) - ); - - var presence = ArgumentPresence.build(arguments); - var item0 = presence.child("input").itemAt(0); - - assertThat(item0.hasField("fornavn")).isTrue(); - assertThat(item0.hasField("folkeregistrertAdresse")).isTrue(); - - // Nested mapper receives child("folkeregistrertAdresse") - var addrPresence = item0.child("folkeregistrertAdresse"); - - // Single-item overload wraps with asSingleItem() - var wrapped = addrPresence.asSingleItem(); - var addrItem = wrapped.itemAt(0); - - assertThat(addrItem.hasField("gate")).isTrue(); - assertThat(addrItem.hasField("postnummer")).isTrue(); - } - } -} diff --git a/graphitron-common/src/test/java/no/sikt/graphql/helpers/resolvers/EnvironmentHandlerTest.java b/graphitron-common/src/test/java/no/sikt/graphql/helpers/resolvers/EnvironmentHandlerTest.java deleted file mode 100644 index 6e025acfa7..0000000000 --- a/graphitron-common/src/test/java/no/sikt/graphql/helpers/resolvers/EnvironmentHandlerTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package no.sikt.graphql.helpers.resolvers; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Map; - -import static no.sikt.graphql.helpers.resolvers.EnvironmentHandler.*; -import static org.assertj.core.api.Assertions.assertThat; - -class EnvironmentHandlerTest { - - @Test - @DisplayName("flattens simple arguments") - void listedInputArguments() { - Map<String, Object> arguments = Map.of( - "in", - List.of( - Map.of( - "id", "123", - "name", "test" - ), - Map.of( - "id", "123", - "active", true - ) - ) - ); - - assertThat(flattenArgumentKeys(arguments, "")) - .containsExactlyInAnyOrder("in", "in/id", "in/name", "in/active"); - } -} diff --git a/graphitron-common/src/test/java/no/sikt/graphql/helpers/resolvers/PrepareTableRecordsForStoreTest.java b/graphitron-common/src/test/java/no/sikt/graphql/helpers/resolvers/PrepareTableRecordsForStoreTest.java deleted file mode 100644 index 7b697866b6..0000000000 --- a/graphitron-common/src/test/java/no/sikt/graphql/helpers/resolvers/PrepareTableRecordsForStoreTest.java +++ /dev/null @@ -1,104 +0,0 @@ -package no.sikt.graphql.helpers.resolvers; - -import no.sikt.jooq.example.VacationRecord; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; - -import static no.sikt.jooq.example.Vacation.VACATION; -import static org.assertj.core.api.Assertions.assertThat; - -@DisplayName("ResolverHelpers - prepareRecordsForStore") -class PrepareTableRecordsForStoreTest { - - @Test - @DisplayName("Should copy touched fields from input to stored record") - void shouldCopyTouchedFields() { - var stored = new VacationRecord(1L, "Beach trip"); - stored.touched(false); - - var input = new VacationRecord(); - input.setVacationId(1L); - input.set(VACATION.DESCRIPTION, "Mountain trip"); - - var result = ResolverHelpers.prepareRecordsForStore(List.of(stored), input); - - assertThat(result.getDescription()) - .withFailMessage("Description from input record should be set in the resulting record.") - .isEqualTo("Mountain trip"); - - assertThat(result.touched(VACATION.DESCRIPTION)) - .withFailMessage("The description field from the input record should be 'touched' in the merged record.") - .isEqualTo(true); - - assertThat(result.touched(VACATION.VACATION_ID)) - .withFailMessage("Primary key field should not be 'touched'.") - .isEqualTo(false); - } - - @Test - @DisplayName("Should preserve untouched fields from stored record") - void shouldPreserveUntouchedFields() { - var stored = new VacationRecord(1L, "Beach trip"); - stored.touched(false); - - var input = new VacationRecord(); - input.setVacationId(1L); - - var result = ResolverHelpers.prepareRecordsForStore(List.of(stored), input); - - assertThat(result.getDescription()) - .withFailMessage("The description from the stored record should be preserved.") - .isEqualTo("Beach trip"); - - assertThat(result.touched(VACATION.DESCRIPTION)) - .withFailMessage("The description field from the input record should not be 'touched'.") - .isEqualTo(false); - } - - - @Test - @DisplayName("Should merge lists by matching primary keys") - void shouldMergeListsByKey() { - var stored1 = new VacationRecord(1L, "Beach trip"); - stored1.touched(false); - var stored2 = new VacationRecord(2L, "City tour"); - stored2.touched(false); - - var input1 = new VacationRecord(); - input1.setVacationId(1L); - input1.set(VACATION.DESCRIPTION, "Updated beach trip"); - - var input2 = new VacationRecord(); - input2.setVacationId(2L); - input2.set(VACATION.DESCRIPTION, "Updated city tour"); - - var result = ResolverHelpers.prepareRecordsForStore(List.of(stored1, stored2), List.of(input1, input2)); - - assertThat(result).hasSize(2); - assertThat(result.get(0).getVacationId()).isEqualTo(1); - assertThat(result.get(0).getDescription()).isEqualTo("Updated beach trip"); - - assertThat(result.get(1).getVacationId()).isEqualTo(2); - assertThat(result.get(1).getDescription()).isEqualTo("Updated city tour"); - } - - @Test - @DisplayName("Should add input record when no matching key in stored records") - void shouldAddNewRecordWhenKeyNotFound() { - var stored = new VacationRecord(1L, "Beach trip"); - stored.touched(false); - - var input = new VacationRecord(2L, "Mountain trip"); - - var result = ResolverHelpers.prepareRecordsForStore(List.of(stored), List.of(input)); - - assertThat(result).hasSize(1); - assertThat(result.get(0).getVacationId()).isEqualTo(2); - assertThat(result.get(0).touched(VACATION.VACATION_ID)) - .withFailMessage("Primary key field should be touched for new records to trigger INSERT.") - .isEqualTo(true); - assertThat(result.get(0).getDescription()).isEqualTo("Mountain trip"); - } -} diff --git a/graphitron-common/src/test/java/no/sikt/graphql/helpers/resolvers/ResolverHelpersTest.java b/graphitron-common/src/test/java/no/sikt/graphql/helpers/resolvers/ResolverHelpersTest.java deleted file mode 100644 index b8bb3d8c49..0000000000 --- a/graphitron-common/src/test/java/no/sikt/graphql/helpers/resolvers/ResolverHelpersTest.java +++ /dev/null @@ -1,83 +0,0 @@ -package no.sikt.graphql.helpers.resolvers; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThatCode; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -@DisplayName("ResolverHelpers - assertSameColumnValues") -class ResolverHelpersTest { - - @Test - @DisplayName("Should pass when all values are equal") - void shouldPassWhenAllValuesEqual() { - assertThatCode(() -> ResolverHelpers.assertSameColumnValues( - "id", 1, "actor", 1, "other", 1 - )).doesNotThrowAnyException(); - } - - @Test - @DisplayName("Should pass when all values are null") - void shouldPassWhenAllValuesNull() { - assertThatCode(() -> ResolverHelpers.assertSameColumnValues( - "id", null, "actor", null - )).doesNotThrowAnyException(); - } - - @Test - @DisplayName("Should pass when only one non-null value") - void shouldPassWhenOnlyOneNonNullValue() { - assertThatCode(() -> ResolverHelpers.assertSameColumnValues( - "id", 1, "actor", null - )).doesNotThrowAnyException(); - } - - @Test - @DisplayName("Should throw when two values differ") - void shouldThrowWhenValuesDiffer() { - assertThatThrownBy(() -> ResolverHelpers.assertSameColumnValues( - "id", 1, "actor", 2 - )) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("Input fields id and actor have conflicting values. This usually indicates that the ids correspond to different entities."); - } - - @Test - @DisplayName("Should throw with first conflicting pair when multiple differ") - void shouldThrowWithFirstConflictingPair() { - assertThatThrownBy(() -> ResolverHelpers.assertSameColumnValues( - "id", 1, "secondId", 2, "actor", 3 - )) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("Input fields id and secondId have conflicting values. This usually indicates that the ids correspond to different entities."); - } - - @Test - @DisplayName("Should pass with empty arguments") - void shouldPassWithEmptyArguments() { - assertThatCode(() -> ResolverHelpers.assertSameColumnValues()) - .doesNotThrowAnyException(); - } - - @Test - @DisplayName("Should preserve insertion order in error message") - void shouldPreserveOrderInErrorMessage() { - // Fields are specified in order: actor, id - error should mention actor first - assertThatThrownBy(() -> ResolverHelpers.assertSameColumnValues( - "actor", 1, "id", 2 - )) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("Input fields actor and id have conflicting values. This usually indicates that the ids correspond to different entities."); - } - - @Test - @DisplayName("Should throw on odd number of arguments") - void shouldThrowOnOddArguments() { - assertThatThrownBy(() -> ResolverHelpers.assertSameColumnValues( - "id", 1, "actor" - )) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("Expected even number of arguments (key-value pairs)"); - } -} \ No newline at end of file diff --git a/graphitron-common/src/test/java/no/sikt/graphql/schema/SchemaReadingHelperTest.java b/graphitron-common/src/test/java/no/sikt/graphql/schema/SchemaReadingHelperTest.java deleted file mode 100644 index 6f4aa6cc27..0000000000 --- a/graphitron-common/src/test/java/no/sikt/graphql/schema/SchemaReadingHelperTest.java +++ /dev/null @@ -1,76 +0,0 @@ -package no.sikt.graphql.schema; - -import graphql.language.Document; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Set; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - - -@DisplayName("SchemaReadingHelper - Reading schemas from filesystem and classpath") -class SchemaReadingHelperTest { - - @TempDir - Path tempDir; - - private Path testSchemaFile; - - @BeforeEach - void setUp() throws IOException { - testSchemaFile = tempDir.resolve("test-schema.graphqls"); - Files.writeString(testSchemaFile, """ - type Query { - hello: String - } - - type User { - id: ID! - name: String - } - """); - } - - @Test - @DisplayName("Should read schema from filesystem using fileAsString") - void shouldReadSchemaFromFilesystem() { - String content = SchemaReadingHelper.fileAsString(testSchemaFile); - - assertThat(content).contains("type User"); - } - - @Test - @DisplayName("Should read schemas from filesystem paths") - void shouldReadSchemasFromFilesystem() { - Document document = SchemaReadingHelper.readSchemas(Set.of(testSchemaFile.toString())); - - assertThat(document).isNotNull(); - assertThat(document.getDefinitions()).isNotEmpty(); - } - - @Test - @DisplayName("Should read schema from classpath") - void shouldReadSchemaFromClasspath() { - Document document = SchemaReadingHelper.readSchemas(Set.of("test-schema-classpath.graphqls")); - - assertThat(document).isNotNull(); - assertThat(document.getDefinitions()).isNotEmpty(); - } - - @Test - @DisplayName("Should throw exception when schema not found") - void shouldThrowExceptionWhenSchemaNotFound() { - assertThatThrownBy(() -> - SchemaReadingHelper.readSchemas(Set.of("non-existent-schema.graphqls")) - ) - .isInstanceOf(RuntimeException.class) - .hasMessageContaining("Schema file not found: non-existent-schema.graphqls"); - } -} \ No newline at end of file diff --git a/graphitron-common/src/test/java/no/sikt/graphql/schema/SelectionSetParserTest.java b/graphitron-common/src/test/java/no/sikt/graphql/schema/SelectionSetParserTest.java deleted file mode 100644 index 7213f376ee..0000000000 --- a/graphitron-common/src/test/java/no/sikt/graphql/schema/SelectionSetParserTest.java +++ /dev/null @@ -1,71 +0,0 @@ -package no.sikt.graphql.schema; - -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -class SelectionSetParserTest { - - @Test - void parseSingleField() { - var fields = SelectionSetParser.parseFields("id"); - assertThat(fields).hasSize(1); - assertThat(fields.get(0).getName()).isEqualTo("id"); - assertThat(fields.get(0).getAlias()).isNull(); - } - - @Test - void parseMultipleFields() { - var fields = SelectionSetParser.parseFields("id name email"); - assertThat(fields).hasSize(3); - assertThat(fields).extracting("name").containsExactly("id", "name", "email"); - } - - @Test - void parseCommaDelimitedFields() { - var fields = SelectionSetParser.parseFields("firstName: FIRST_NAME, lastName: LAST_NAME"); - assertThat(fields).hasSize(2); - assertThat(fields.get(0).getAlias()).isEqualTo("firstName"); - assertThat(fields.get(0).getName()).isEqualTo("FIRST_NAME"); - assertThat(fields.get(1).getAlias()).isEqualTo("lastName"); - assertThat(fields.get(1).getName()).isEqualTo("LAST_NAME"); - } - - @Test - void parseNestedFields() { - var fields = SelectionSetParser.parseFields("user { id name }"); - assertThat(fields).hasSize(1); - assertThat(fields.get(0).getName()).isEqualTo("user"); - assertThat(fields.get(0).getSelectionSet()).isNotNull(); - - var nested = fields.get(0).getSelectionSet().getSelections(); - assertThat(nested).hasSize(2); - } - - @Test - void parseMixedAliasedAndUnaliasedFields() { - var fields = SelectionSetParser.parseFields("first_name, surname: LAST_NAME"); - assertThat(fields).hasSize(2); - assertThat(fields.get(0).getName()).isEqualTo("first_name"); - assertThat(fields.get(0).getAlias()).isNull(); - assertThat(fields.get(1).getAlias()).isEqualTo("surname"); - assertThat(fields.get(1).getName()).isEqualTo("LAST_NAME"); - } - - @Test - void parseInputAlreadyWrappedInBraces() { - var fields = SelectionSetParser.parseFields("{ firstName: FIRST_NAME, lastName: LAST_NAME }"); - assertThat(fields).hasSize(2); - assertThat(fields.get(0).getAlias()).isEqualTo("firstName"); - assertThat(fields.get(0).getName()).isEqualTo("FIRST_NAME"); - assertThat(fields.get(1).getAlias()).isEqualTo("lastName"); - assertThat(fields.get(1).getName()).isEqualTo("LAST_NAME"); - } - - @Test - void parseInvalidSelectionThrows() { - assertThatThrownBy(() -> SelectionSetParser.parseFields(":::")) - .isInstanceOf(Exception.class); - } -} diff --git a/graphitron-common/src/test/java/no/sikt/jooq/example/Keys.java b/graphitron-common/src/test/java/no/sikt/jooq/example/Keys.java deleted file mode 100644 index 87071986a3..0000000000 --- a/graphitron-common/src/test/java/no/sikt/jooq/example/Keys.java +++ /dev/null @@ -1,15 +0,0 @@ -package no.sikt.jooq.example; - -import org.jooq.ForeignKey; -import org.jooq.TableField; -import org.jooq.UniqueKey; -import org.jooq.impl.DSL; -import org.jooq.impl.Internal; - -@SuppressWarnings({"all", "unchecked", "rawtypes"}) -public class Keys { - public static final UniqueKey<VacationRecord> VACATION_PKEY = Internal.createUniqueKey(Vacation.VACATION, DSL.name("vacation_pkey"), new TableField[]{Vacation.VACATION.VACATION_ID}, true); - public static final UniqueKey<VacationDestinationRecord> VACATION_DESTINATION_PKEY = Internal.createUniqueKey(VacationDestination.VACATION_DESTINATION, DSL.name("vacation_destination_pkey"), new TableField[]{VacationDestination.VACATION_DESTINATION.DESTINATION_ID, VacationDestination.VACATION_DESTINATION.COUNTRY_NAME}, true); - - public static final ForeignKey<VacationDestinationRecord, VacationRecord> VACATION_DESTINATION__VACATION_DESTINATION_VACATION_FKEY = Internal.createForeignKey(VacationDestination.VACATION_DESTINATION, DSL.name("vacation_destination_vacation_fkey"), new TableField[]{VacationDestination.VACATION_DESTINATION.VACATION_ID, VacationDestination.VACATION_DESTINATION.EXTRA_KEY}, Keys.VACATION_PKEY, new TableField[]{Vacation.VACATION.VACATION_ID, Vacation.VACATION.EXTRA_KEY}, true); -} diff --git a/graphitron-common/src/test/java/no/sikt/jooq/example/Vacation.java b/graphitron-common/src/test/java/no/sikt/jooq/example/Vacation.java deleted file mode 100644 index 39113bb556..0000000000 --- a/graphitron-common/src/test/java/no/sikt/jooq/example/Vacation.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.jooq.example; - -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.UniqueKey; -import org.jooq.impl.DSL; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - -import java.io.Serial; - -public class Vacation extends TableImpl<VacationRecord> { - @Serial - private static final long serialVersionUID = 1L; - public static final Vacation VACATION = new Vacation(); - - public final TableField<VacationRecord, Long> VACATION_ID = createField(DSL.name("vacation_id"), SQLDataType.BIGINT.nullable(false).identity(true), this, ""); - public final TableField<VacationRecord, String> DESCRIPTION = createField(DSL.name("description"), SQLDataType.VARCHAR(45).nullable(false), this, ""); - public final TableField<VacationRecord, Long> EXTRA_KEY = createField(DSL.name("extra_key"), SQLDataType.BIGINT.nullable(false).identity(true), this, ""); - - public Vacation() { - super(DSL.name("vacation"), null, null, null, DSL.comment(""), TableOptions.table(), null); - } - - @Override - public UniqueKey<VacationRecord> getPrimaryKey() { - return Keys.VACATION_PKEY; - } -} diff --git a/graphitron-common/src/test/java/no/sikt/jooq/example/VacationDestination.java b/graphitron-common/src/test/java/no/sikt/jooq/example/VacationDestination.java deleted file mode 100644 index 1a7ed6cc96..0000000000 --- a/graphitron-common/src/test/java/no/sikt/jooq/example/VacationDestination.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.jooq.example; - -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.UniqueKey; -import org.jooq.impl.DSL; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - -import java.io.Serial; - -@SuppressWarnings({"all", "unchecked", "rawtypes"}) -public class VacationDestination extends TableImpl<VacationDestinationRecord> { - @Serial - private static final long serialVersionUID = 1L; - public static final VacationDestination VACATION_DESTINATION = new VacationDestination(); - - public final TableField<VacationDestinationRecord, Long> DESTINATION_ID = createField(DSL.name("destination_id"), SQLDataType.BIGINT.nullable(false).identity(true), this, ""); - public final TableField<VacationDestinationRecord, String> COUNTRY_NAME = createField(DSL.name("country_name"), SQLDataType.VARCHAR(45).nullable(false), this, ""); - public final TableField<VacationDestinationRecord, Long> VACATION_ID = createField(DSL.name("vacation_id"), SQLDataType.BIGINT, this, ""); - public final TableField<VacationDestinationRecord, Long> EXTRA_KEY = createField(DSL.name("extra_key"), SQLDataType.BIGINT.nullable(false).identity(true), this, ""); - - public VacationDestination() { - super(DSL.name("vacation_destination"), null, null, null, DSL.comment(""), TableOptions.table(), null); - } - - @Override - public Class<VacationDestinationRecord> getRecordType() { - return VacationDestinationRecord.class; - } - - @Override - public UniqueKey<VacationDestinationRecord> getPrimaryKey() { - return Keys.VACATION_DESTINATION_PKEY; - } - -} diff --git a/graphitron-common/src/test/java/no/sikt/jooq/example/VacationDestinationRecord.java b/graphitron-common/src/test/java/no/sikt/jooq/example/VacationDestinationRecord.java deleted file mode 100644 index f3939edc6c..0000000000 --- a/graphitron-common/src/test/java/no/sikt/jooq/example/VacationDestinationRecord.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.jooq.example; - -import org.jooq.Record2; -import org.jooq.impl.UpdatableRecordImpl; - -import java.io.Serial; - -@SuppressWarnings({"all", "unchecked", "rawtypes"}) -public class VacationDestinationRecord extends UpdatableRecordImpl<VacationDestinationRecord> { - @Serial - private static final long serialVersionUID = 1L; - - public void setDestinationId(Long value) { - set(0, value); - } - - public Long getDestinationId() { - return (Long) get(0); - } - - public void setCountryName(Long value) { - set(1, value); - } - - public String getCountryName() { - return (String) get(1); - } - - public void setVacationId(Long value) { - set(2, value); - } - - public Long getVacationId() { - return (Long) get(2); - } - - public void setExtraKey(Long value) { - set(3, value); - } - - public Long getExtraKey() { - return (Long) get(3); - } - - public VacationDestinationRecord() { - super(VacationDestination.VACATION_DESTINATION); - } - - @Override - public Record2<Long, String> key() { - return (Record2) super.key(); - } -} diff --git a/graphitron-common/src/test/java/no/sikt/jooq/example/VacationRecord.java b/graphitron-common/src/test/java/no/sikt/jooq/example/VacationRecord.java deleted file mode 100644 index 9811061c2d..0000000000 --- a/graphitron-common/src/test/java/no/sikt/jooq/example/VacationRecord.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.jooq.example; - -import org.jooq.Record1; -import org.jooq.impl.UpdatableRecordImpl; - -import java.io.Serial; - -@SuppressWarnings({"all", "unchecked", "rawtypes"}) -public class VacationRecord extends UpdatableRecordImpl<VacationRecord> { - @Serial - private static final long serialVersionUID = 1L; - - public void setVacationId(Long value) { - set(0, value); - } - - public Long getVacationId() { - return (Long) get(0); - } - - public void setDescription(String value) { - set(1, value); - } - - public String getDescription() { - return (String) get(1); - } - - public void setExtraKey(Long value) { - set(2, value); - } - - public Long getExtraKey() { - return (Long) get(2); - } - - public VacationRecord() { - super(Vacation.VACATION); - } - - public VacationRecord(Long vacationId, String description) { - super(Vacation.VACATION); - setVacationId(vacationId); - setDescription(description); - resetTouchedOnNotNull(); - } - - @Override - public Record1<Long> key() { - return (Record1) super.key(); - } -} diff --git a/graphitron-common/src/test/resources/test-schema-classpath.graphqls b/graphitron-common/src/test/resources/test-schema-classpath.graphqls deleted file mode 100644 index 6f155bbbec..0000000000 --- a/graphitron-common/src/test/resources/test-schema-classpath.graphqls +++ /dev/null @@ -1,17 +0,0 @@ -# Test schema for classpath loading tests -type Query { - testQuery: String - getUser(id: ID!): User -} - -type User { - id: ID! - username: String! - email: String -} - -type Product { - id: ID! - name: String! - price: Float -} \ No newline at end of file diff --git a/graphitron-example/README.md b/graphitron-example/README.md deleted file mode 100644 index a65e7151fd..0000000000 --- a/graphitron-example/README.md +++ /dev/null @@ -1,113 +0,0 @@ -# Graphitron Example - -This example demonstrates how to use Graphitron to generate GraphQL resolvers from a given GraphQL schema. The example is based on the Sakila test database. For more information, see [Sakila](https://www.jooq.org/sakila). -The `graphitron-example-server` is a Quarkus application that runs a GraphQL server with the generated resolvers. - -[Integration tests](#Integration-tests) are included to ensure that Graphitron generates resolvers that work as expected. - -<!-- START doctoc generated TOC please keep comment here to allow auto update --> -<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --> -**Table of Contents** - -- [Requirements](#requirements) -- [Quickstart](#quickstart) -- [Submodule structure](#submodule-structure) - - [graphitron-example-db](#graphitron-example-db) - - [JOOQ code generation](#jooq-code-generation) - - [graphitron-example-spec](#graphitron-example-spec) - - [graphitron-example-server](#graphitron-example-server) - - [graphitron-example-service](#graphitron-example-service) -- [Integration tests](#integration-tests) - - [Running approval tests against codegen variants](#running-approval-tests-against-codegen-variants) - -<!-- END doctoc generated TOC please keep comment here to allow auto update --> - - -## Requirements - -- Docker - for running the Postgres database -- [Mise](https://mise.jdx.dev/) - for task management (Recommended) - - Alternatively, you can use maven directly with java - - -## Quickstart - -To quickly get started with the Graphitron example, follow these steps (requires Mise) from this directory (`graphitron/graphitron-example`): - -1. **Build the project:** - - ```sh - mise r build - ``` - -2. **Start the Graphitron example server:** - - ```sh - mise r start - ``` - -## Submodule structure - -### graphitron-example-db - -This module uses the JOOQ code generator to generate Java classes from the Sakila database schema. These generated classes are required by Graphitron when generating the resolvers. - -#### JOOQ code generation - -The JOOQ code generation task is disabled by default. -If you need to regenerate the JOOQ classes, you will need to build the module with the `generate-jooq` profile. -This requires a running Postgres database with the Sakila schema. - -1. **Start the Sakila Postgres database:** - ```sh - mise r sakila - ``` -2. **Regenerate the JOOQ classes:** - ```sh - mise r jooq - ``` - -### graphitron-example-spec - -This module contains the schema that Graphitron will use to generate the resolvers. The GraphQL schema maps GraphQL types to the JOOQ generated classes based on the Sakila database schema. - -When building this module, the `graphitron-maven-plugin` will generate the resolvers based on the schema and the JOOQ classes. - -### graphitron-example-server - -This module contains the server that will run the generated resolvers. It is based on Quarkus and will start a GraphQL server that can be queried at [http://localhost:8088/graphql](http://localhost:8088/graphql). - -GraphiQL is available at [http://localhost:8088/graphiql](http://localhost:8088/graphiql). This is a graphical interface that can be used to query the server. - -Quarkus will start the server in development mode, which means that it will automatically reload when changes are made to the code. -Also _devservices_ is enabled, which means that the server will automatically run a Postgres database with the Sakila schema when started. - -### graphitron-example-service -This module contains code necessary for more advanced features of Graphitron, such as custom service classes and conditions. - -## Integration tests -The project includes integration tests to verify the functionality of the generated GraphQL resolvers. These tests are located in the [graphitron-example-server](graphitron-example-server/src/test/java) module. -There are two types of tests: - - **Approval** - tests that verify queries against the server and compare the results to expected results. To add a new test, simply add a new query to the `src/test/resources/approval/queries` directory. - - **Match** - these tests are more flexible and can be used to verify the results of a query against a custom matcher, e.g. hamcrest. - -The tests use the Quarkus test framework which automatically starts the server before running the tests. - -### Running approval tests against codegen variants -The default codegen configuration is defined as properties in [`graphitron-example/pom.xml`](pom.xml). Variant profiles in the same pom override individual flags. Variant runs rebuild the spec module with the override and execute `ApprovalQueryTest` against the variant. Defined variants: - -- `upsert-as-merge` — `generateUpsertAsStore=false` (emits `batchMerge` instead of `batchStore`). -- `jdbc-batching` — `useJdbcBatchingForDeletes=true` and `useJdbcBatchingForInserts=true`. Emits `batchDelete` and `batchInsert` instead of direct insert and delete statements. - -Approved files for a variant live under `graphitron-example-server/src/test/resources/approval/approvals/variants/<variant>/`. The `ApprovalQueryTest` looks up an approved file there first and falls back to the default approvals directory, so the variant directory only needs to contain the queries whose output actually differs from the default. - -Mise tasks: -```sh -mise r test-variant upsert-as-merge # run a single variant -mise r test-variants # run all known variants -``` - -To add a new variant: -1. Add a `<profile>` to `graphitron-example/pom.xml` that sets `approval.variant` and overrides the relevant `graphitron.*` properties. -2. Add the profile id to the matrix in `.github/workflows/maven-build.yml` and to the `test-variants` task in [`.mise.toml`](../.mise.toml). -3. Run `mise r test-variant <your-variant>` locally; promote any divergent `.received.json` files in the variant directory to `.approved.json`. \ No newline at end of file diff --git a/graphitron-example/graphitron-example-db/docker-compose.yml b/graphitron-example/graphitron-example-db/docker-compose.yml deleted file mode 100644 index 0519b528a9..0000000000 --- a/graphitron-example/graphitron-example-db/docker-compose.yml +++ /dev/null @@ -1,12 +0,0 @@ -services: - postgres: - image: sakiladb/postgres:15 - container_name: sakila_postgres - environment: - POSTGRES_USER: sakila - POSTGRES_PASSWORD: p_ssW0rd - POSTGRES_DB: sakila - ports: - - "5433:5432" - volumes: - - ./init:/docker-entrypoint-initdb.d diff --git a/graphitron-example/graphitron-example-db/init/init-script.sql b/graphitron-example/graphitron-example-db/init/init-script.sql deleted file mode 100644 index 10961427d3..0000000000 --- a/graphitron-example/graphitron-example-db/init/init-script.sql +++ /dev/null @@ -1,40 +0,0 @@ -ALTER TABLE FILM ALTER COLUMN rental_duration DROP NOT NULL; - -ALTER TABLE CUSTOMER ADD COLUMN IF NOT EXISTS USERNAMES TEXT[]; -ALTER TABLE CUSTOMER ADD COLUMN IF NOT EXISTS PAST_ADDRESS_IDS INTEGER[]; - -UPDATE CUSTOMER SET USERNAMES = ARRAY['user1', 'user2'] WHERE CUSTOMER_ID = 1; -UPDATE CUSTOMER SET USERNAMES = ARRAY[]::TEXT[] WHERE CUSTOMER_ID = 2; -UPDATE CUSTOMER SET USERNAMES = ARRAY['MyUsername'] WHERE CUSTOMER_ID = 3; - -UPDATE CUSTOMER SET PAST_ADDRESS_IDS = ARRAY[2, 3] WHERE CUSTOMER_ID = 1; -UPDATE CUSTOMER SET PAST_ADDRESS_IDS = ARRAY[]::INTEGER[] WHERE CUSTOMER_ID = 2; -UPDATE CUSTOMER SET PAST_ADDRESS_IDS = ARRAY[4] WHERE CUSTOMER_ID = 3; - --- Mixed-case names to demonstrate collation differences. --- With case-insensitive collation: ABNEY, abel, Acosta (alphabetical regardless of case). --- Without collation (default C locale): ABNEY, Acosta, abel (uppercase before lowercase). -UPDATE CUSTOMER SET LAST_NAME = 'abel' WHERE CUSTOMER_ID = 504; -- was ADAM -UPDATE CUSTOMER SET LAST_NAME = 'Acosta' WHERE CUSTOMER_ID = 36; -- was ADAMS - --- Create a case-insensitive collation for testing. -CREATE COLLATION IF NOT EXISTS case_insensitive (provider = icu, locale = 'und-u-ks-level2', deterministic = false); - --- Create self reference for testing. -ALTER TABLE ONLY FILM - ADD COLUMN IF NOT EXISTS SEQUEL BIGINT; -ALTER TABLE ONLY FILM DROP CONSTRAINT IF EXISTS SEQUEL_FKEY; -ALTER TABLE ONLY FILM - ADD CONSTRAINT SEQUEL_FKEY FOREIGN KEY(SEQUEL) REFERENCES FILM(FILM_ID); - -UPDATE FILM SET SEQUEL = 2 WHERE FILM_ID = 1; -UPDATE FILM SET SEQUEL = 4 WHERE FILM_ID = 3; -UPDATE FILM SET SEQUEL = 6 WHERE FILM_ID = 5; - - - --- Rows added for testing nested single table interface queries -INSERT INTO ADDRESS (address_id, address, district, city_id, postal_code, phone) -VALUES (1000, 'Example Street 1', 'Example District', 244, '22474', ''); -INSERT INTO CUSTOMER (customer_id, store_id, first_name, last_name, email, address_id) -VALUES (1000, 1, 'Example', 'Customer', 'EXAMPLE.CUSTOMER@example.com', 1000); \ No newline at end of file diff --git a/graphitron-example/graphitron-example-db/jooq-configuration.xml b/graphitron-example/graphitron-example-db/jooq-configuration.xml deleted file mode 100644 index 9c6dbea20b..0000000000 --- a/graphitron-example/graphitron-example-db/jooq-configuration.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="yes"?> -<configuration xmlns="http://www.jooq.org/xsd/jooq-codegen-3.19.0.xsd"> - <onError>FAIL</onError> - <generator> - <database> - <forcedTypes> - <forcedType> - <userType>java.lang.String</userType> - <includeTypes>integer</includeTypes> - <includeExpression> - .*\.film_id - </includeExpression> - <lambdaConverter> - <from>t -> Integer.toString(t)</from> - <to>u -> Integer.valueOf(u)</to> - </lambdaConverter> - </forcedType> - <forcedType> - <userType>java.lang.Integer</userType> - <includeTypes>smallint</includeTypes> - <converter>no.sikt.graphitron.converters.ShortToIntegerConverter</converter> - </forcedType> - </forcedTypes> - </database> - </generator> -</configuration> diff --git a/graphitron-example/graphitron-example-db/pom.xml b/graphitron-example/graphitron-example-db/pom.xml deleted file mode 100644 index 05cfc8a973..0000000000 --- a/graphitron-example/graphitron-example-db/pom.xml +++ /dev/null @@ -1,125 +0,0 @@ -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>no.sikt</groupId> - <artifactId>graphitron-example</artifactId> - <version>${revision}${changelist}</version> - </parent> - - <artifactId>graphitron-example-db</artifactId> - <name>graphitron-example-db</name> - - <properties> - <db.url>jdbc:postgresql://localhost:5433/sakila</db.url> - <db.username>sakila</db.username> - <db.password>p_ssW0rd</db.password> - </properties> - - <dependencies> - <dependency> - <groupId>no.sikt</groupId> - <artifactId>graphitron-common</artifactId> - <version>${revision}${changelist}</version> - </dependency> - <dependency> - <groupId>org.jooq</groupId> - <artifactId>jooq</artifactId> - </dependency> - <dependency> - <groupId>jakarta.validation</groupId> - <artifactId>jakarta.validation-api</artifactId> - </dependency> - </dependencies> - - <profiles> - <profile> - <id>jooq-codegen</id> - <activation> - <activeByDefault>false</activeByDefault> - </activation> - <build> - <plugins> - <plugin> - <groupId>org.codehaus.mojo</groupId> - <artifactId>sql-maven-plugin</artifactId> - <version>3.0.0</version> - <dependencies> - <dependency> - <groupId>org.postgresql</groupId> - <artifactId>postgresql</artifactId> - <version>${version.postgresql}</version> - </dependency> - </dependencies> - <executions> - <execution> - <id>run-init-scripts</id> - <phase>initialize</phase> - <goals> - <goal>execute</goal> - </goals> - <configuration> - <driver>org.postgresql.Driver</driver> - <url>${db.url}</url> - <username>${db.username}</username> - <password>${db.password}</password> - <fileset> - <basedir>${basedir}/init</basedir> - <includes> - <include>*.sql</include> - </includes> - </fileset> - </configuration> - </execution> - </executions> - </plugin> - <plugin> - <groupId>org.jooq</groupId> - <artifactId>jooq-codegen-maven</artifactId> - <executions> - <execution> - <id>jooq-code-generator</id> - <phase>generate-sources</phase> - <goals> - <goal>generate</goal> - </goals> - - <configuration> - <configurationFiles> - <configurationFile>jooq-configuration.xml</configurationFile> - </configurationFiles> - <jdbc> - <driver>org.postgresql.Driver</driver> - <url>${db.url}</url> - <user>${db.username}</user> - <password>${db.password}</password> - </jdbc> - <generator> - <database> - <inputSchema>public</inputSchema> - <includeIndexes>true</includeIndexes> - </database> - <target> - <packageName>${generatedJooqPackage}</packageName> - <directory>src/main/java</directory> - </target> - <generate> - <validationAnnotations>true</validationAnnotations> - </generate> - </generator> - </configuration> - </execution> - </executions> - <dependencies> - <dependency> - <groupId>org.postgresql</groupId> - <artifactId>postgresql</artifactId> - <version>${version.postgresql}</version> - </dependency> - </dependencies> - </plugin> - </plugins> - </build> - </profile> - </profiles> -</project> diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/converters/ShortToIntegerConverter.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/converters/ShortToIntegerConverter.java deleted file mode 100644 index 5140ff5c57..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/converters/ShortToIntegerConverter.java +++ /dev/null @@ -1,31 +0,0 @@ -package no.sikt.graphitron.converters; - -import org.jooq.Converter; - -import java.io.Serial; -import java.util.Optional; - -public class ShortToIntegerConverter implements Converter<Short, Integer> { - @Serial - private static final long serialVersionUID = 1L; - - @Override - public Integer from(Short databaseObject) { - return Optional.ofNullable(databaseObject).map(Short::intValue).orElse(null); - } - - @Override - public Short to(Integer userObject) { - return Optional.ofNullable(userObject).map(Integer::shortValue).orElse(null); - } - - @Override - public Class<Short> fromType() { - return Short.class; - } - - @Override - public Class<Integer> toType() { - return Integer.class; - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/DefaultCatalog.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/DefaultCatalog.java deleted file mode 100644 index 2711a303c8..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/DefaultCatalog.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq; - - -import java.util.Arrays; -import java.util.List; - -import org.jooq.Constants; -import org.jooq.Schema; -import org.jooq.impl.CatalogImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class DefaultCatalog extends CatalogImpl { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>DEFAULT_CATALOG</code> - */ - public static final DefaultCatalog DEFAULT_CATALOG = new DefaultCatalog(); - - /** - * Standard public schema - */ - public final Public PUBLIC = Public.PUBLIC; - - /** - * No further instances allowed - */ - private DefaultCatalog() { - super(""); - } - - @Override - public final List<Schema> getSchemas() { - return Arrays.asList( - Public.PUBLIC - ); - } - - /** - * A reference to the 3.20 minor release of the code generator. If this - * doesn't compile, it's because the runtime library uses an older minor - * release, namely: 3.20. You can turn off the generation of this reference - * by specifying /configuration/generator/generate/jooqVersionReference - */ - private static final String REQUIRE_RUNTIME_JOOQ_VERSION = Constants.VERSION_3_20; -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/Domains.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/Domains.java deleted file mode 100644 index 8c0c0ab06f..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/Domains.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq; - - -import org.jooq.Domain; -import org.jooq.Schema; -import org.jooq.impl.DSL; -import org.jooq.impl.Internal; -import org.jooq.impl.LazySchema; -import org.jooq.impl.SQLDataType; - - -/** - * Convenience access to all Domains in public. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class Domains { - - /** - * The domain <code>public.year</code>. - */ - public static final Domain<Integer> YEAR = Internal.createDomain( - schema() - , DSL.name("year") - , DSL.comment("") - , SQLDataType.INTEGER - , Internal.createCheck(null, null, "CHECK (((VALUE >= 1901) AND (VALUE <= 2155)))") - ); - - private static final Schema schema() { - return new LazySchema(DSL.name("public"), DSL.comment(""), () -> Public.PUBLIC); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/Indexes.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/Indexes.java deleted file mode 100644 index acfbd4ef63..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/Indexes.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq; - - -import no.sikt.graphitron.example.generated.jooq.tables.Actor; -import no.sikt.graphitron.example.generated.jooq.tables.Address; -import no.sikt.graphitron.example.generated.jooq.tables.City; -import no.sikt.graphitron.example.generated.jooq.tables.Customer; -import no.sikt.graphitron.example.generated.jooq.tables.Film; -import no.sikt.graphitron.example.generated.jooq.tables.FilmActor; -import no.sikt.graphitron.example.generated.jooq.tables.Inventory; -import no.sikt.graphitron.example.generated.jooq.tables.Payment; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_01; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_02; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_03; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_04; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_05; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_06; -import no.sikt.graphitron.example.generated.jooq.tables.Rental; -import no.sikt.graphitron.example.generated.jooq.tables.Store; - -import org.jooq.Index; -import org.jooq.OrderField; -import org.jooq.impl.DSL; -import org.jooq.impl.Internal; - - -/** - * A class modelling indexes of tables in public. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class Indexes { - - // ------------------------------------------------------------------------- - // INDEX definitions - // ------------------------------------------------------------------------- - - public static final Index FILM_FULLTEXT_IDX = Internal.createIndex(DSL.name("film_fulltext_idx"), Film.FILM, new OrderField[] { Film.FILM.FULLTEXT }, false); - public static final Index IDX_ACTOR_LAST_NAME = Internal.createIndex(DSL.name("idx_actor_last_name"), Actor.ACTOR, new OrderField[] { Actor.ACTOR.LAST_NAME }, false); - public static final Index IDX_FK_ADDRESS_ID = Internal.createIndex(DSL.name("idx_fk_address_id"), Customer.CUSTOMER, new OrderField[] { Customer.CUSTOMER.ADDRESS_ID }, false); - public static final Index IDX_FK_CITY_ID = Internal.createIndex(DSL.name("idx_fk_city_id"), Address.ADDRESS, new OrderField[] { Address.ADDRESS.CITY_ID }, false); - public static final Index IDX_FK_COUNTRY_ID = Internal.createIndex(DSL.name("idx_fk_country_id"), City.CITY, new OrderField[] { City.CITY.COUNTRY_ID }, false); - public static final Index IDX_FK_CUSTOMER_ID = Internal.createIndex(DSL.name("idx_fk_customer_id"), Payment.PAYMENT, new OrderField[] { Payment.PAYMENT.CUSTOMER_ID }, false); - public static final Index IDX_FK_FILM_ID = Internal.createIndex(DSL.name("idx_fk_film_id"), FilmActor.FILM_ACTOR, new OrderField[] { FilmActor.FILM_ACTOR.FILM_ID }, false); - public static final Index IDX_FK_INVENTORY_ID = Internal.createIndex(DSL.name("idx_fk_inventory_id"), Rental.RENTAL, new OrderField[] { Rental.RENTAL.INVENTORY_ID }, false); - public static final Index IDX_FK_LANGUAGE_ID = Internal.createIndex(DSL.name("idx_fk_language_id"), Film.FILM, new OrderField[] { Film.FILM.LANGUAGE_ID }, false); - public static final Index IDX_FK_ORIGINAL_LANGUAGE_ID = Internal.createIndex(DSL.name("idx_fk_original_language_id"), Film.FILM, new OrderField[] { Film.FILM.ORIGINAL_LANGUAGE_ID }, false); - public static final Index IDX_FK_PAYMENT_P2007_01_CUSTOMER_ID = Internal.createIndex(DSL.name("idx_fk_payment_p2007_01_customer_id"), PaymentP2007_01.PAYMENT_P2007_01, new OrderField[] { PaymentP2007_01.PAYMENT_P2007_01.CUSTOMER_ID }, false); - public static final Index IDX_FK_PAYMENT_P2007_01_STAFF_ID = Internal.createIndex(DSL.name("idx_fk_payment_p2007_01_staff_id"), PaymentP2007_01.PAYMENT_P2007_01, new OrderField[] { PaymentP2007_01.PAYMENT_P2007_01.STAFF_ID }, false); - public static final Index IDX_FK_PAYMENT_P2007_02_CUSTOMER_ID = Internal.createIndex(DSL.name("idx_fk_payment_p2007_02_customer_id"), PaymentP2007_02.PAYMENT_P2007_02, new OrderField[] { PaymentP2007_02.PAYMENT_P2007_02.CUSTOMER_ID }, false); - public static final Index IDX_FK_PAYMENT_P2007_02_STAFF_ID = Internal.createIndex(DSL.name("idx_fk_payment_p2007_02_staff_id"), PaymentP2007_02.PAYMENT_P2007_02, new OrderField[] { PaymentP2007_02.PAYMENT_P2007_02.STAFF_ID }, false); - public static final Index IDX_FK_PAYMENT_P2007_03_CUSTOMER_ID = Internal.createIndex(DSL.name("idx_fk_payment_p2007_03_customer_id"), PaymentP2007_03.PAYMENT_P2007_03, new OrderField[] { PaymentP2007_03.PAYMENT_P2007_03.CUSTOMER_ID }, false); - public static final Index IDX_FK_PAYMENT_P2007_03_STAFF_ID = Internal.createIndex(DSL.name("idx_fk_payment_p2007_03_staff_id"), PaymentP2007_03.PAYMENT_P2007_03, new OrderField[] { PaymentP2007_03.PAYMENT_P2007_03.STAFF_ID }, false); - public static final Index IDX_FK_PAYMENT_P2007_04_CUSTOMER_ID = Internal.createIndex(DSL.name("idx_fk_payment_p2007_04_customer_id"), PaymentP2007_04.PAYMENT_P2007_04, new OrderField[] { PaymentP2007_04.PAYMENT_P2007_04.CUSTOMER_ID }, false); - public static final Index IDX_FK_PAYMENT_P2007_04_STAFF_ID = Internal.createIndex(DSL.name("idx_fk_payment_p2007_04_staff_id"), PaymentP2007_04.PAYMENT_P2007_04, new OrderField[] { PaymentP2007_04.PAYMENT_P2007_04.STAFF_ID }, false); - public static final Index IDX_FK_PAYMENT_P2007_05_CUSTOMER_ID = Internal.createIndex(DSL.name("idx_fk_payment_p2007_05_customer_id"), PaymentP2007_05.PAYMENT_P2007_05, new OrderField[] { PaymentP2007_05.PAYMENT_P2007_05.CUSTOMER_ID }, false); - public static final Index IDX_FK_PAYMENT_P2007_05_STAFF_ID = Internal.createIndex(DSL.name("idx_fk_payment_p2007_05_staff_id"), PaymentP2007_05.PAYMENT_P2007_05, new OrderField[] { PaymentP2007_05.PAYMENT_P2007_05.STAFF_ID }, false); - public static final Index IDX_FK_PAYMENT_P2007_06_CUSTOMER_ID = Internal.createIndex(DSL.name("idx_fk_payment_p2007_06_customer_id"), PaymentP2007_06.PAYMENT_P2007_06, new OrderField[] { PaymentP2007_06.PAYMENT_P2007_06.CUSTOMER_ID }, false); - public static final Index IDX_FK_PAYMENT_P2007_06_STAFF_ID = Internal.createIndex(DSL.name("idx_fk_payment_p2007_06_staff_id"), PaymentP2007_06.PAYMENT_P2007_06, new OrderField[] { PaymentP2007_06.PAYMENT_P2007_06.STAFF_ID }, false); - public static final Index IDX_FK_STAFF_ID = Internal.createIndex(DSL.name("idx_fk_staff_id"), Payment.PAYMENT, new OrderField[] { Payment.PAYMENT.STAFF_ID }, false); - public static final Index IDX_FK_STORE_ID = Internal.createIndex(DSL.name("idx_fk_store_id"), Customer.CUSTOMER, new OrderField[] { Customer.CUSTOMER.STORE_ID }, false); - public static final Index IDX_LAST_NAME = Internal.createIndex(DSL.name("idx_last_name"), Customer.CUSTOMER, new OrderField[] { Customer.CUSTOMER.LAST_NAME }, false); - public static final Index IDX_STORE_ID_FILM_ID = Internal.createIndex(DSL.name("idx_store_id_film_id"), Inventory.INVENTORY, new OrderField[] { Inventory.INVENTORY.STORE_ID, Inventory.INVENTORY.FILM_ID }, false); - public static final Index IDX_TITLE = Internal.createIndex(DSL.name("idx_title"), Film.FILM, new OrderField[] { Film.FILM.TITLE }, false); - public static final Index IDX_UNQ_MANAGER_STAFF_ID = Internal.createIndex(DSL.name("idx_unq_manager_staff_id"), Store.STORE, new OrderField[] { Store.STORE.MANAGER_STAFF_ID }, true); - public static final Index IDX_UNQ_RENTAL_RENTAL_DATE_INVENTORY_ID_CUSTOMER_ID = Internal.createIndex(DSL.name("idx_unq_rental_rental_date_inventory_id_customer_id"), Rental.RENTAL, new OrderField[] { Rental.RENTAL.RENTAL_DATE, Rental.RENTAL.INVENTORY_ID, Rental.RENTAL.CUSTOMER_ID }, true); -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/Keys.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/Keys.java deleted file mode 100644 index d3c9e329b6..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/Keys.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq; - - -import no.sikt.graphitron.example.generated.jooq.tables.Actor; -import no.sikt.graphitron.example.generated.jooq.tables.Address; -import no.sikt.graphitron.example.generated.jooq.tables.Category; -import no.sikt.graphitron.example.generated.jooq.tables.City; -import no.sikt.graphitron.example.generated.jooq.tables.Country; -import no.sikt.graphitron.example.generated.jooq.tables.Customer; -import no.sikt.graphitron.example.generated.jooq.tables.Film; -import no.sikt.graphitron.example.generated.jooq.tables.FilmActor; -import no.sikt.graphitron.example.generated.jooq.tables.FilmCategory; -import no.sikt.graphitron.example.generated.jooq.tables.Inventory; -import no.sikt.graphitron.example.generated.jooq.tables.Language; -import no.sikt.graphitron.example.generated.jooq.tables.Payment; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_01; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_02; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_03; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_04; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_05; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_06; -import no.sikt.graphitron.example.generated.jooq.tables.Rental; -import no.sikt.graphitron.example.generated.jooq.tables.Staff; -import no.sikt.graphitron.example.generated.jooq.tables.Store; -import no.sikt.graphitron.example.generated.jooq.tables.records.ActorRecord; -import no.sikt.graphitron.example.generated.jooq.tables.records.AddressRecord; -import no.sikt.graphitron.example.generated.jooq.tables.records.CategoryRecord; -import no.sikt.graphitron.example.generated.jooq.tables.records.CityRecord; -import no.sikt.graphitron.example.generated.jooq.tables.records.CountryRecord; -import no.sikt.graphitron.example.generated.jooq.tables.records.CustomerRecord; -import no.sikt.graphitron.example.generated.jooq.tables.records.FilmActorRecord; -import no.sikt.graphitron.example.generated.jooq.tables.records.FilmCategoryRecord; -import no.sikt.graphitron.example.generated.jooq.tables.records.FilmRecord; -import no.sikt.graphitron.example.generated.jooq.tables.records.InventoryRecord; -import no.sikt.graphitron.example.generated.jooq.tables.records.LanguageRecord; -import no.sikt.graphitron.example.generated.jooq.tables.records.PaymentP2007_01Record; -import no.sikt.graphitron.example.generated.jooq.tables.records.PaymentP2007_02Record; -import no.sikt.graphitron.example.generated.jooq.tables.records.PaymentP2007_03Record; -import no.sikt.graphitron.example.generated.jooq.tables.records.PaymentP2007_04Record; -import no.sikt.graphitron.example.generated.jooq.tables.records.PaymentP2007_05Record; -import no.sikt.graphitron.example.generated.jooq.tables.records.PaymentP2007_06Record; -import no.sikt.graphitron.example.generated.jooq.tables.records.PaymentRecord; -import no.sikt.graphitron.example.generated.jooq.tables.records.RentalRecord; -import no.sikt.graphitron.example.generated.jooq.tables.records.StaffRecord; -import no.sikt.graphitron.example.generated.jooq.tables.records.StoreRecord; - -import org.jooq.ForeignKey; -import org.jooq.TableField; -import org.jooq.UniqueKey; -import org.jooq.impl.DSL; -import org.jooq.impl.Internal; -import org.jooq.impl.QOM.ForeignKeyRule; - - -/** - * A class modelling foreign key relationships and constraints of tables in - * public. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class Keys { - - // ------------------------------------------------------------------------- - // UNIQUE and PRIMARY KEY definitions - // ------------------------------------------------------------------------- - - public static final UniqueKey<ActorRecord> ACTOR_PKEY = Internal.createUniqueKey(Actor.ACTOR, DSL.name("actor_pkey"), new TableField[] { Actor.ACTOR.ACTOR_ID }, true); - public static final UniqueKey<AddressRecord> ADDRESS_PKEY = Internal.createUniqueKey(Address.ADDRESS, DSL.name("address_pkey"), new TableField[] { Address.ADDRESS.ADDRESS_ID }, true); - public static final UniqueKey<CategoryRecord> CATEGORY_PKEY = Internal.createUniqueKey(Category.CATEGORY, DSL.name("category_pkey"), new TableField[] { Category.CATEGORY.CATEGORY_ID }, true); - public static final UniqueKey<CityRecord> CITY_PKEY = Internal.createUniqueKey(City.CITY, DSL.name("city_pkey"), new TableField[] { City.CITY.CITY_ID }, true); - public static final UniqueKey<CountryRecord> COUNTRY_PKEY = Internal.createUniqueKey(Country.COUNTRY, DSL.name("country_pkey"), new TableField[] { Country.COUNTRY.COUNTRY_ID }, true); - public static final UniqueKey<CustomerRecord> CUSTOMER_PKEY = Internal.createUniqueKey(Customer.CUSTOMER, DSL.name("customer_pkey"), new TableField[] { Customer.CUSTOMER.CUSTOMER_ID }, true); - public static final UniqueKey<FilmRecord> FILM_PKEY = Internal.createUniqueKey(Film.FILM, DSL.name("film_pkey"), new TableField[] { Film.FILM.FILM_ID }, true); - public static final UniqueKey<FilmActorRecord> FILM_ACTOR_PKEY = Internal.createUniqueKey(FilmActor.FILM_ACTOR, DSL.name("film_actor_pkey"), new TableField[] { FilmActor.FILM_ACTOR.ACTOR_ID, FilmActor.FILM_ACTOR.FILM_ID }, true); - public static final UniqueKey<FilmCategoryRecord> FILM_CATEGORY_PKEY = Internal.createUniqueKey(FilmCategory.FILM_CATEGORY, DSL.name("film_category_pkey"), new TableField[] { FilmCategory.FILM_CATEGORY.FILM_ID, FilmCategory.FILM_CATEGORY.CATEGORY_ID }, true); - public static final UniqueKey<InventoryRecord> INVENTORY_PKEY = Internal.createUniqueKey(Inventory.INVENTORY, DSL.name("inventory_pkey"), new TableField[] { Inventory.INVENTORY.INVENTORY_ID }, true); - public static final UniqueKey<LanguageRecord> LANGUAGE_PKEY = Internal.createUniqueKey(Language.LANGUAGE, DSL.name("language_pkey"), new TableField[] { Language.LANGUAGE.LANGUAGE_ID }, true); - public static final UniqueKey<PaymentRecord> PAYMENT_PKEY = Internal.createUniqueKey(Payment.PAYMENT, DSL.name("payment_pkey"), new TableField[] { Payment.PAYMENT.PAYMENT_ID }, true); - public static final UniqueKey<RentalRecord> RENTAL_PKEY = Internal.createUniqueKey(Rental.RENTAL, DSL.name("rental_pkey"), new TableField[] { Rental.RENTAL.RENTAL_ID }, true); - public static final UniqueKey<StaffRecord> STAFF_PKEY = Internal.createUniqueKey(Staff.STAFF, DSL.name("staff_pkey"), new TableField[] { Staff.STAFF.STAFF_ID }, true); - public static final UniqueKey<StoreRecord> STORE_PKEY = Internal.createUniqueKey(Store.STORE, DSL.name("store_pkey"), new TableField[] { Store.STORE.STORE_ID }, true); - - // ------------------------------------------------------------------------- - // FOREIGN KEY definitions - // ------------------------------------------------------------------------- - - public static final ForeignKey<AddressRecord, CityRecord> ADDRESS__ADDRESS_CITY_ID_FKEY = Internal.createForeignKey(Address.ADDRESS, DSL.name("address_city_id_fkey"), new TableField[] { Address.ADDRESS.CITY_ID }, Keys.CITY_PKEY, new TableField[] { City.CITY.CITY_ID }, true, ForeignKeyRule.RESTRICT, ForeignKeyRule.CASCADE); - public static final ForeignKey<CityRecord, CountryRecord> CITY__CITY_COUNTRY_ID_FKEY = Internal.createForeignKey(City.CITY, DSL.name("city_country_id_fkey"), new TableField[] { City.CITY.COUNTRY_ID }, Keys.COUNTRY_PKEY, new TableField[] { Country.COUNTRY.COUNTRY_ID }, true, ForeignKeyRule.RESTRICT, ForeignKeyRule.CASCADE); - public static final ForeignKey<CustomerRecord, AddressRecord> CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY = Internal.createForeignKey(Customer.CUSTOMER, DSL.name("customer_address_id_fkey"), new TableField[] { Customer.CUSTOMER.ADDRESS_ID }, Keys.ADDRESS_PKEY, new TableField[] { Address.ADDRESS.ADDRESS_ID }, true, ForeignKeyRule.RESTRICT, ForeignKeyRule.CASCADE); - public static final ForeignKey<CustomerRecord, StoreRecord> CUSTOMER__CUSTOMER_STORE_ID_FKEY = Internal.createForeignKey(Customer.CUSTOMER, DSL.name("customer_store_id_fkey"), new TableField[] { Customer.CUSTOMER.STORE_ID }, Keys.STORE_PKEY, new TableField[] { Store.STORE.STORE_ID }, true, ForeignKeyRule.RESTRICT, ForeignKeyRule.CASCADE); - public static final ForeignKey<FilmRecord, LanguageRecord> FILM__FILM_LANGUAGE_ID_FKEY = Internal.createForeignKey(Film.FILM, DSL.name("film_language_id_fkey"), new TableField[] { Film.FILM.LANGUAGE_ID }, Keys.LANGUAGE_PKEY, new TableField[] { Language.LANGUAGE.LANGUAGE_ID }, true, ForeignKeyRule.RESTRICT, ForeignKeyRule.CASCADE); - public static final ForeignKey<FilmRecord, LanguageRecord> FILM__FILM_ORIGINAL_LANGUAGE_ID_FKEY = Internal.createForeignKey(Film.FILM, DSL.name("film_original_language_id_fkey"), new TableField[] { Film.FILM.ORIGINAL_LANGUAGE_ID }, Keys.LANGUAGE_PKEY, new TableField[] { Language.LANGUAGE.LANGUAGE_ID }, true, ForeignKeyRule.RESTRICT, ForeignKeyRule.CASCADE); - public static final ForeignKey<FilmRecord, FilmRecord> FILM__SEQUEL_FKEY = Internal.createForeignKey(Film.FILM, DSL.name("sequel_fkey"), new TableField[] { Film.FILM.SEQUEL }, Keys.FILM_PKEY, new TableField[] { Film.FILM.FILM_ID }, true, ForeignKeyRule.NO_ACTION, ForeignKeyRule.NO_ACTION); - public static final ForeignKey<FilmActorRecord, ActorRecord> FILM_ACTOR__FILM_ACTOR_ACTOR_ID_FKEY = Internal.createForeignKey(FilmActor.FILM_ACTOR, DSL.name("film_actor_actor_id_fkey"), new TableField[] { FilmActor.FILM_ACTOR.ACTOR_ID }, Keys.ACTOR_PKEY, new TableField[] { Actor.ACTOR.ACTOR_ID }, true, ForeignKeyRule.RESTRICT, ForeignKeyRule.CASCADE); - public static final ForeignKey<FilmActorRecord, FilmRecord> FILM_ACTOR__FILM_ACTOR_FILM_ID_FKEY = Internal.createForeignKey(FilmActor.FILM_ACTOR, DSL.name("film_actor_film_id_fkey"), new TableField[] { FilmActor.FILM_ACTOR.FILM_ID }, Keys.FILM_PKEY, new TableField[] { Film.FILM.FILM_ID }, true, ForeignKeyRule.RESTRICT, ForeignKeyRule.CASCADE); - public static final ForeignKey<FilmCategoryRecord, CategoryRecord> FILM_CATEGORY__FILM_CATEGORY_CATEGORY_ID_FKEY = Internal.createForeignKey(FilmCategory.FILM_CATEGORY, DSL.name("film_category_category_id_fkey"), new TableField[] { FilmCategory.FILM_CATEGORY.CATEGORY_ID }, Keys.CATEGORY_PKEY, new TableField[] { Category.CATEGORY.CATEGORY_ID }, true, ForeignKeyRule.RESTRICT, ForeignKeyRule.CASCADE); - public static final ForeignKey<FilmCategoryRecord, FilmRecord> FILM_CATEGORY__FILM_CATEGORY_FILM_ID_FKEY = Internal.createForeignKey(FilmCategory.FILM_CATEGORY, DSL.name("film_category_film_id_fkey"), new TableField[] { FilmCategory.FILM_CATEGORY.FILM_ID }, Keys.FILM_PKEY, new TableField[] { Film.FILM.FILM_ID }, true, ForeignKeyRule.RESTRICT, ForeignKeyRule.CASCADE); - public static final ForeignKey<InventoryRecord, FilmRecord> INVENTORY__INVENTORY_FILM_ID_FKEY = Internal.createForeignKey(Inventory.INVENTORY, DSL.name("inventory_film_id_fkey"), new TableField[] { Inventory.INVENTORY.FILM_ID }, Keys.FILM_PKEY, new TableField[] { Film.FILM.FILM_ID }, true, ForeignKeyRule.RESTRICT, ForeignKeyRule.CASCADE); - public static final ForeignKey<InventoryRecord, StoreRecord> INVENTORY__INVENTORY_STORE_ID_FKEY = Internal.createForeignKey(Inventory.INVENTORY, DSL.name("inventory_store_id_fkey"), new TableField[] { Inventory.INVENTORY.STORE_ID }, Keys.STORE_PKEY, new TableField[] { Store.STORE.STORE_ID }, true, ForeignKeyRule.RESTRICT, ForeignKeyRule.CASCADE); - public static final ForeignKey<PaymentRecord, CustomerRecord> PAYMENT__PAYMENT_CUSTOMER_ID_FKEY = Internal.createForeignKey(Payment.PAYMENT, DSL.name("payment_customer_id_fkey"), new TableField[] { Payment.PAYMENT.CUSTOMER_ID }, Keys.CUSTOMER_PKEY, new TableField[] { Customer.CUSTOMER.CUSTOMER_ID }, true, ForeignKeyRule.RESTRICT, ForeignKeyRule.CASCADE); - public static final ForeignKey<PaymentRecord, RentalRecord> PAYMENT__PAYMENT_RENTAL_ID_FKEY = Internal.createForeignKey(Payment.PAYMENT, DSL.name("payment_rental_id_fkey"), new TableField[] { Payment.PAYMENT.RENTAL_ID }, Keys.RENTAL_PKEY, new TableField[] { Rental.RENTAL.RENTAL_ID }, true, ForeignKeyRule.SET_NULL, ForeignKeyRule.CASCADE); - public static final ForeignKey<PaymentRecord, StaffRecord> PAYMENT__PAYMENT_STAFF_ID_FKEY = Internal.createForeignKey(Payment.PAYMENT, DSL.name("payment_staff_id_fkey"), new TableField[] { Payment.PAYMENT.STAFF_ID }, Keys.STAFF_PKEY, new TableField[] { Staff.STAFF.STAFF_ID }, true, ForeignKeyRule.RESTRICT, ForeignKeyRule.CASCADE); - public static final ForeignKey<PaymentP2007_01Record, CustomerRecord> PAYMENT_P2007_01__PAYMENT_P2007_01_CUSTOMER_ID_FKEY = Internal.createForeignKey(PaymentP2007_01.PAYMENT_P2007_01, DSL.name("payment_p2007_01_customer_id_fkey"), new TableField[] { PaymentP2007_01.PAYMENT_P2007_01.CUSTOMER_ID }, Keys.CUSTOMER_PKEY, new TableField[] { Customer.CUSTOMER.CUSTOMER_ID }, true, ForeignKeyRule.NO_ACTION, ForeignKeyRule.NO_ACTION); - public static final ForeignKey<PaymentP2007_01Record, RentalRecord> PAYMENT_P2007_01__PAYMENT_P2007_01_RENTAL_ID_FKEY = Internal.createForeignKey(PaymentP2007_01.PAYMENT_P2007_01, DSL.name("payment_p2007_01_rental_id_fkey"), new TableField[] { PaymentP2007_01.PAYMENT_P2007_01.RENTAL_ID }, Keys.RENTAL_PKEY, new TableField[] { Rental.RENTAL.RENTAL_ID }, true, ForeignKeyRule.NO_ACTION, ForeignKeyRule.NO_ACTION); - public static final ForeignKey<PaymentP2007_01Record, StaffRecord> PAYMENT_P2007_01__PAYMENT_P2007_01_STAFF_ID_FKEY = Internal.createForeignKey(PaymentP2007_01.PAYMENT_P2007_01, DSL.name("payment_p2007_01_staff_id_fkey"), new TableField[] { PaymentP2007_01.PAYMENT_P2007_01.STAFF_ID }, Keys.STAFF_PKEY, new TableField[] { Staff.STAFF.STAFF_ID }, true, ForeignKeyRule.NO_ACTION, ForeignKeyRule.NO_ACTION); - public static final ForeignKey<PaymentP2007_02Record, CustomerRecord> PAYMENT_P2007_02__PAYMENT_P2007_02_CUSTOMER_ID_FKEY = Internal.createForeignKey(PaymentP2007_02.PAYMENT_P2007_02, DSL.name("payment_p2007_02_customer_id_fkey"), new TableField[] { PaymentP2007_02.PAYMENT_P2007_02.CUSTOMER_ID }, Keys.CUSTOMER_PKEY, new TableField[] { Customer.CUSTOMER.CUSTOMER_ID }, true, ForeignKeyRule.NO_ACTION, ForeignKeyRule.NO_ACTION); - public static final ForeignKey<PaymentP2007_02Record, RentalRecord> PAYMENT_P2007_02__PAYMENT_P2007_02_RENTAL_ID_FKEY = Internal.createForeignKey(PaymentP2007_02.PAYMENT_P2007_02, DSL.name("payment_p2007_02_rental_id_fkey"), new TableField[] { PaymentP2007_02.PAYMENT_P2007_02.RENTAL_ID }, Keys.RENTAL_PKEY, new TableField[] { Rental.RENTAL.RENTAL_ID }, true, ForeignKeyRule.NO_ACTION, ForeignKeyRule.NO_ACTION); - public static final ForeignKey<PaymentP2007_02Record, StaffRecord> PAYMENT_P2007_02__PAYMENT_P2007_02_STAFF_ID_FKEY = Internal.createForeignKey(PaymentP2007_02.PAYMENT_P2007_02, DSL.name("payment_p2007_02_staff_id_fkey"), new TableField[] { PaymentP2007_02.PAYMENT_P2007_02.STAFF_ID }, Keys.STAFF_PKEY, new TableField[] { Staff.STAFF.STAFF_ID }, true, ForeignKeyRule.NO_ACTION, ForeignKeyRule.NO_ACTION); - public static final ForeignKey<PaymentP2007_03Record, CustomerRecord> PAYMENT_P2007_03__PAYMENT_P2007_03_CUSTOMER_ID_FKEY = Internal.createForeignKey(PaymentP2007_03.PAYMENT_P2007_03, DSL.name("payment_p2007_03_customer_id_fkey"), new TableField[] { PaymentP2007_03.PAYMENT_P2007_03.CUSTOMER_ID }, Keys.CUSTOMER_PKEY, new TableField[] { Customer.CUSTOMER.CUSTOMER_ID }, true, ForeignKeyRule.NO_ACTION, ForeignKeyRule.NO_ACTION); - public static final ForeignKey<PaymentP2007_03Record, RentalRecord> PAYMENT_P2007_03__PAYMENT_P2007_03_RENTAL_ID_FKEY = Internal.createForeignKey(PaymentP2007_03.PAYMENT_P2007_03, DSL.name("payment_p2007_03_rental_id_fkey"), new TableField[] { PaymentP2007_03.PAYMENT_P2007_03.RENTAL_ID }, Keys.RENTAL_PKEY, new TableField[] { Rental.RENTAL.RENTAL_ID }, true, ForeignKeyRule.NO_ACTION, ForeignKeyRule.NO_ACTION); - public static final ForeignKey<PaymentP2007_03Record, StaffRecord> PAYMENT_P2007_03__PAYMENT_P2007_03_STAFF_ID_FKEY = Internal.createForeignKey(PaymentP2007_03.PAYMENT_P2007_03, DSL.name("payment_p2007_03_staff_id_fkey"), new TableField[] { PaymentP2007_03.PAYMENT_P2007_03.STAFF_ID }, Keys.STAFF_PKEY, new TableField[] { Staff.STAFF.STAFF_ID }, true, ForeignKeyRule.NO_ACTION, ForeignKeyRule.NO_ACTION); - public static final ForeignKey<PaymentP2007_04Record, CustomerRecord> PAYMENT_P2007_04__PAYMENT_P2007_04_CUSTOMER_ID_FKEY = Internal.createForeignKey(PaymentP2007_04.PAYMENT_P2007_04, DSL.name("payment_p2007_04_customer_id_fkey"), new TableField[] { PaymentP2007_04.PAYMENT_P2007_04.CUSTOMER_ID }, Keys.CUSTOMER_PKEY, new TableField[] { Customer.CUSTOMER.CUSTOMER_ID }, true, ForeignKeyRule.NO_ACTION, ForeignKeyRule.NO_ACTION); - public static final ForeignKey<PaymentP2007_04Record, RentalRecord> PAYMENT_P2007_04__PAYMENT_P2007_04_RENTAL_ID_FKEY = Internal.createForeignKey(PaymentP2007_04.PAYMENT_P2007_04, DSL.name("payment_p2007_04_rental_id_fkey"), new TableField[] { PaymentP2007_04.PAYMENT_P2007_04.RENTAL_ID }, Keys.RENTAL_PKEY, new TableField[] { Rental.RENTAL.RENTAL_ID }, true, ForeignKeyRule.NO_ACTION, ForeignKeyRule.NO_ACTION); - public static final ForeignKey<PaymentP2007_04Record, StaffRecord> PAYMENT_P2007_04__PAYMENT_P2007_04_STAFF_ID_FKEY = Internal.createForeignKey(PaymentP2007_04.PAYMENT_P2007_04, DSL.name("payment_p2007_04_staff_id_fkey"), new TableField[] { PaymentP2007_04.PAYMENT_P2007_04.STAFF_ID }, Keys.STAFF_PKEY, new TableField[] { Staff.STAFF.STAFF_ID }, true, ForeignKeyRule.NO_ACTION, ForeignKeyRule.NO_ACTION); - public static final ForeignKey<PaymentP2007_05Record, CustomerRecord> PAYMENT_P2007_05__PAYMENT_P2007_05_CUSTOMER_ID_FKEY = Internal.createForeignKey(PaymentP2007_05.PAYMENT_P2007_05, DSL.name("payment_p2007_05_customer_id_fkey"), new TableField[] { PaymentP2007_05.PAYMENT_P2007_05.CUSTOMER_ID }, Keys.CUSTOMER_PKEY, new TableField[] { Customer.CUSTOMER.CUSTOMER_ID }, true, ForeignKeyRule.NO_ACTION, ForeignKeyRule.NO_ACTION); - public static final ForeignKey<PaymentP2007_05Record, RentalRecord> PAYMENT_P2007_05__PAYMENT_P2007_05_RENTAL_ID_FKEY = Internal.createForeignKey(PaymentP2007_05.PAYMENT_P2007_05, DSL.name("payment_p2007_05_rental_id_fkey"), new TableField[] { PaymentP2007_05.PAYMENT_P2007_05.RENTAL_ID }, Keys.RENTAL_PKEY, new TableField[] { Rental.RENTAL.RENTAL_ID }, true, ForeignKeyRule.NO_ACTION, ForeignKeyRule.NO_ACTION); - public static final ForeignKey<PaymentP2007_05Record, StaffRecord> PAYMENT_P2007_05__PAYMENT_P2007_05_STAFF_ID_FKEY = Internal.createForeignKey(PaymentP2007_05.PAYMENT_P2007_05, DSL.name("payment_p2007_05_staff_id_fkey"), new TableField[] { PaymentP2007_05.PAYMENT_P2007_05.STAFF_ID }, Keys.STAFF_PKEY, new TableField[] { Staff.STAFF.STAFF_ID }, true, ForeignKeyRule.NO_ACTION, ForeignKeyRule.NO_ACTION); - public static final ForeignKey<PaymentP2007_06Record, CustomerRecord> PAYMENT_P2007_06__PAYMENT_P2007_06_CUSTOMER_ID_FKEY = Internal.createForeignKey(PaymentP2007_06.PAYMENT_P2007_06, DSL.name("payment_p2007_06_customer_id_fkey"), new TableField[] { PaymentP2007_06.PAYMENT_P2007_06.CUSTOMER_ID }, Keys.CUSTOMER_PKEY, new TableField[] { Customer.CUSTOMER.CUSTOMER_ID }, true, ForeignKeyRule.NO_ACTION, ForeignKeyRule.NO_ACTION); - public static final ForeignKey<PaymentP2007_06Record, RentalRecord> PAYMENT_P2007_06__PAYMENT_P2007_06_RENTAL_ID_FKEY = Internal.createForeignKey(PaymentP2007_06.PAYMENT_P2007_06, DSL.name("payment_p2007_06_rental_id_fkey"), new TableField[] { PaymentP2007_06.PAYMENT_P2007_06.RENTAL_ID }, Keys.RENTAL_PKEY, new TableField[] { Rental.RENTAL.RENTAL_ID }, true, ForeignKeyRule.NO_ACTION, ForeignKeyRule.NO_ACTION); - public static final ForeignKey<PaymentP2007_06Record, StaffRecord> PAYMENT_P2007_06__PAYMENT_P2007_06_STAFF_ID_FKEY = Internal.createForeignKey(PaymentP2007_06.PAYMENT_P2007_06, DSL.name("payment_p2007_06_staff_id_fkey"), new TableField[] { PaymentP2007_06.PAYMENT_P2007_06.STAFF_ID }, Keys.STAFF_PKEY, new TableField[] { Staff.STAFF.STAFF_ID }, true, ForeignKeyRule.NO_ACTION, ForeignKeyRule.NO_ACTION); - public static final ForeignKey<RentalRecord, CustomerRecord> RENTAL__RENTAL_CUSTOMER_ID_FKEY = Internal.createForeignKey(Rental.RENTAL, DSL.name("rental_customer_id_fkey"), new TableField[] { Rental.RENTAL.CUSTOMER_ID }, Keys.CUSTOMER_PKEY, new TableField[] { Customer.CUSTOMER.CUSTOMER_ID }, true, ForeignKeyRule.RESTRICT, ForeignKeyRule.CASCADE); - public static final ForeignKey<RentalRecord, InventoryRecord> RENTAL__RENTAL_INVENTORY_ID_FKEY = Internal.createForeignKey(Rental.RENTAL, DSL.name("rental_inventory_id_fkey"), new TableField[] { Rental.RENTAL.INVENTORY_ID }, Keys.INVENTORY_PKEY, new TableField[] { Inventory.INVENTORY.INVENTORY_ID }, true, ForeignKeyRule.RESTRICT, ForeignKeyRule.CASCADE); - public static final ForeignKey<RentalRecord, StaffRecord> RENTAL__RENTAL_STAFF_ID_FKEY = Internal.createForeignKey(Rental.RENTAL, DSL.name("rental_staff_id_fkey"), new TableField[] { Rental.RENTAL.STAFF_ID }, Keys.STAFF_PKEY, new TableField[] { Staff.STAFF.STAFF_ID }, true, ForeignKeyRule.RESTRICT, ForeignKeyRule.CASCADE); - public static final ForeignKey<StaffRecord, AddressRecord> STAFF__STAFF_ADDRESS_ID_FKEY = Internal.createForeignKey(Staff.STAFF, DSL.name("staff_address_id_fkey"), new TableField[] { Staff.STAFF.ADDRESS_ID }, Keys.ADDRESS_PKEY, new TableField[] { Address.ADDRESS.ADDRESS_ID }, true, ForeignKeyRule.RESTRICT, ForeignKeyRule.CASCADE); - public static final ForeignKey<StaffRecord, StoreRecord> STAFF__STAFF_STORE_ID_FKEY = Internal.createForeignKey(Staff.STAFF, DSL.name("staff_store_id_fkey"), new TableField[] { Staff.STAFF.STORE_ID }, Keys.STORE_PKEY, new TableField[] { Store.STORE.STORE_ID }, true, ForeignKeyRule.NO_ACTION, ForeignKeyRule.NO_ACTION); - public static final ForeignKey<StoreRecord, AddressRecord> STORE__STORE_ADDRESS_ID_FKEY = Internal.createForeignKey(Store.STORE, DSL.name("store_address_id_fkey"), new TableField[] { Store.STORE.ADDRESS_ID }, Keys.ADDRESS_PKEY, new TableField[] { Address.ADDRESS.ADDRESS_ID }, true, ForeignKeyRule.RESTRICT, ForeignKeyRule.CASCADE); - public static final ForeignKey<StoreRecord, StaffRecord> STORE__STORE_MANAGER_STAFF_ID_FKEY = Internal.createForeignKey(Store.STORE, DSL.name("store_manager_staff_id_fkey"), new TableField[] { Store.STORE.MANAGER_STAFF_ID }, Keys.STAFF_PKEY, new TableField[] { Staff.STAFF.STAFF_ID }, true, ForeignKeyRule.RESTRICT, ForeignKeyRule.CASCADE); -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/Public.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/Public.java deleted file mode 100644 index 22ac2aebd1..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/Public.java +++ /dev/null @@ -1,400 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq; - - -import java.math.BigDecimal; -import java.util.Arrays; -import java.util.List; - -import no.sikt.graphitron.example.generated.jooq.tables.Actor; -import no.sikt.graphitron.example.generated.jooq.tables.ActorInfo; -import no.sikt.graphitron.example.generated.jooq.tables.Address; -import no.sikt.graphitron.example.generated.jooq.tables.Category; -import no.sikt.graphitron.example.generated.jooq.tables.City; -import no.sikt.graphitron.example.generated.jooq.tables.Country; -import no.sikt.graphitron.example.generated.jooq.tables.Customer; -import no.sikt.graphitron.example.generated.jooq.tables.CustomerList; -import no.sikt.graphitron.example.generated.jooq.tables.Film; -import no.sikt.graphitron.example.generated.jooq.tables.FilmActor; -import no.sikt.graphitron.example.generated.jooq.tables.FilmCategory; -import no.sikt.graphitron.example.generated.jooq.tables.FilmInStock; -import no.sikt.graphitron.example.generated.jooq.tables.FilmList; -import no.sikt.graphitron.example.generated.jooq.tables.FilmNotInStock; -import no.sikt.graphitron.example.generated.jooq.tables.Inventory; -import no.sikt.graphitron.example.generated.jooq.tables.Language; -import no.sikt.graphitron.example.generated.jooq.tables.NicerButSlowerFilmList; -import no.sikt.graphitron.example.generated.jooq.tables.Payment; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_01; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_02; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_03; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_04; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_05; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_06; -import no.sikt.graphitron.example.generated.jooq.tables.Rental; -import no.sikt.graphitron.example.generated.jooq.tables.RewardsReport; -import no.sikt.graphitron.example.generated.jooq.tables.SalesByFilmCategory; -import no.sikt.graphitron.example.generated.jooq.tables.SalesByStore; -import no.sikt.graphitron.example.generated.jooq.tables.Staff; -import no.sikt.graphitron.example.generated.jooq.tables.StaffList; -import no.sikt.graphitron.example.generated.jooq.tables.Store; -import no.sikt.graphitron.example.generated.jooq.tables.records.CustomerRecord; -import no.sikt.graphitron.example.generated.jooq.tables.records.FilmInStockRecord; -import no.sikt.graphitron.example.generated.jooq.tables.records.FilmNotInStockRecord; - -import org.jooq.Catalog; -import org.jooq.Configuration; -import org.jooq.Domain; -import org.jooq.Field; -import org.jooq.Result; -import org.jooq.Table; -import org.jooq.impl.DSL; -import org.jooq.impl.SchemaImpl; - - -/** - * Standard public schema - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class Public extends SchemaImpl { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>public</code> - */ - public static final Public PUBLIC = new Public(); - - /** - * The table <code>public.actor</code>. - */ - public final Actor ACTOR = Actor.ACTOR; - - /** - * The table <code>public.actor_info</code>. - */ - public final ActorInfo ACTOR_INFO = ActorInfo.ACTOR_INFO; - - /** - * The table <code>public.address</code>. - */ - public final Address ADDRESS = Address.ADDRESS; - - /** - * The table <code>public.category</code>. - */ - public final Category CATEGORY = Category.CATEGORY; - - /** - * The table <code>public.city</code>. - */ - public final City CITY = City.CITY; - - /** - * The table <code>public.country</code>. - */ - public final Country COUNTRY = Country.COUNTRY; - - /** - * The table <code>public.customer</code>. - */ - public final Customer CUSTOMER = Customer.CUSTOMER; - - /** - * The table <code>public.customer_list</code>. - */ - public final CustomerList CUSTOMER_LIST = CustomerList.CUSTOMER_LIST; - - /** - * The table <code>public.film</code>. - */ - public final Film FILM = Film.FILM; - - /** - * The table <code>public.film_actor</code>. - */ - public final FilmActor FILM_ACTOR = FilmActor.FILM_ACTOR; - - /** - * The table <code>public.film_category</code>. - */ - public final FilmCategory FILM_CATEGORY = FilmCategory.FILM_CATEGORY; - - /** - * The table <code>public.film_in_stock</code>. - */ - public final FilmInStock FILM_IN_STOCK = FilmInStock.FILM_IN_STOCK; - - /** - * Call <code>public.film_in_stock</code>. - */ - public static Result<FilmInStockRecord> FILM_IN_STOCK( - Configuration configuration - , Integer pFilmId - , Integer pStoreId - ) { - return configuration.dsl().selectFrom(no.sikt.graphitron.example.generated.jooq.tables.FilmInStock.FILM_IN_STOCK.call( - pFilmId - , pStoreId - )).fetch(); - } - - /** - * Get <code>public.film_in_stock</code> as a table. - */ - public static FilmInStock FILM_IN_STOCK( - Integer pFilmId - , Integer pStoreId - ) { - return no.sikt.graphitron.example.generated.jooq.tables.FilmInStock.FILM_IN_STOCK.call( - pFilmId, - pStoreId - ); - } - - /** - * Get <code>public.film_in_stock</code> as a table. - */ - public static FilmInStock FILM_IN_STOCK( - Field<Integer> pFilmId - , Field<Integer> pStoreId - ) { - return no.sikt.graphitron.example.generated.jooq.tables.FilmInStock.FILM_IN_STOCK.call( - pFilmId, - pStoreId - ); - } - - /** - * The table <code>public.film_list</code>. - */ - public final FilmList FILM_LIST = FilmList.FILM_LIST; - - /** - * The table <code>public.film_not_in_stock</code>. - */ - public final FilmNotInStock FILM_NOT_IN_STOCK = FilmNotInStock.FILM_NOT_IN_STOCK; - - /** - * Call <code>public.film_not_in_stock</code>. - */ - public static Result<FilmNotInStockRecord> FILM_NOT_IN_STOCK( - Configuration configuration - , Integer pFilmId - , Integer pStoreId - ) { - return configuration.dsl().selectFrom(no.sikt.graphitron.example.generated.jooq.tables.FilmNotInStock.FILM_NOT_IN_STOCK.call( - pFilmId - , pStoreId - )).fetch(); - } - - /** - * Get <code>public.film_not_in_stock</code> as a table. - */ - public static FilmNotInStock FILM_NOT_IN_STOCK( - Integer pFilmId - , Integer pStoreId - ) { - return no.sikt.graphitron.example.generated.jooq.tables.FilmNotInStock.FILM_NOT_IN_STOCK.call( - pFilmId, - pStoreId - ); - } - - /** - * Get <code>public.film_not_in_stock</code> as a table. - */ - public static FilmNotInStock FILM_NOT_IN_STOCK( - Field<Integer> pFilmId - , Field<Integer> pStoreId - ) { - return no.sikt.graphitron.example.generated.jooq.tables.FilmNotInStock.FILM_NOT_IN_STOCK.call( - pFilmId, - pStoreId - ); - } - - /** - * The table <code>public.inventory</code>. - */ - public final Inventory INVENTORY = Inventory.INVENTORY; - - /** - * The table <code>public.language</code>. - */ - public final Language LANGUAGE = Language.LANGUAGE; - - /** - * The table <code>public.nicer_but_slower_film_list</code>. - */ - public final NicerButSlowerFilmList NICER_BUT_SLOWER_FILM_LIST = NicerButSlowerFilmList.NICER_BUT_SLOWER_FILM_LIST; - - /** - * The table <code>public.payment</code>. - */ - public final Payment PAYMENT = Payment.PAYMENT; - - /** - * The table <code>public.payment_p2007_01</code>. - */ - public final PaymentP2007_01 PAYMENT_P2007_01 = PaymentP2007_01.PAYMENT_P2007_01; - - /** - * The table <code>public.payment_p2007_02</code>. - */ - public final PaymentP2007_02 PAYMENT_P2007_02 = PaymentP2007_02.PAYMENT_P2007_02; - - /** - * The table <code>public.payment_p2007_03</code>. - */ - public final PaymentP2007_03 PAYMENT_P2007_03 = PaymentP2007_03.PAYMENT_P2007_03; - - /** - * The table <code>public.payment_p2007_04</code>. - */ - public final PaymentP2007_04 PAYMENT_P2007_04 = PaymentP2007_04.PAYMENT_P2007_04; - - /** - * The table <code>public.payment_p2007_05</code>. - */ - public final PaymentP2007_05 PAYMENT_P2007_05 = PaymentP2007_05.PAYMENT_P2007_05; - - /** - * The table <code>public.payment_p2007_06</code>. - */ - public final PaymentP2007_06 PAYMENT_P2007_06 = PaymentP2007_06.PAYMENT_P2007_06; - - /** - * The table <code>public.rental</code>. - */ - public final Rental RENTAL = Rental.RENTAL; - - /** - * The table <code>public.rewards_report</code>. - */ - public final RewardsReport REWARDS_REPORT = RewardsReport.REWARDS_REPORT; - - /** - * Call <code>public.rewards_report</code>. - */ - public static Result<CustomerRecord> REWARDS_REPORT( - Configuration configuration - , Integer minMonthlyPurchases - , BigDecimal minDollarAmountPurchased - ) { - return configuration.dsl().selectFrom(no.sikt.graphitron.example.generated.jooq.tables.RewardsReport.REWARDS_REPORT.call( - minMonthlyPurchases - , minDollarAmountPurchased - )).fetch(); - } - - /** - * Get <code>public.rewards_report</code> as a table. - */ - public static RewardsReport REWARDS_REPORT( - Integer minMonthlyPurchases - , BigDecimal minDollarAmountPurchased - ) { - return no.sikt.graphitron.example.generated.jooq.tables.RewardsReport.REWARDS_REPORT.call( - minMonthlyPurchases, - minDollarAmountPurchased - ); - } - - /** - * Get <code>public.rewards_report</code> as a table. - */ - public static RewardsReport REWARDS_REPORT( - Field<Integer> minMonthlyPurchases - , Field<BigDecimal> minDollarAmountPurchased - ) { - return no.sikt.graphitron.example.generated.jooq.tables.RewardsReport.REWARDS_REPORT.call( - minMonthlyPurchases, - minDollarAmountPurchased - ); - } - - /** - * The table <code>public.sales_by_film_category</code>. - */ - public final SalesByFilmCategory SALES_BY_FILM_CATEGORY = SalesByFilmCategory.SALES_BY_FILM_CATEGORY; - - /** - * The table <code>public.sales_by_store</code>. - */ - public final SalesByStore SALES_BY_STORE = SalesByStore.SALES_BY_STORE; - - /** - * The table <code>public.staff</code>. - */ - public final Staff STAFF = Staff.STAFF; - - /** - * The table <code>public.staff_list</code>. - */ - public final StaffList STAFF_LIST = StaffList.STAFF_LIST; - - /** - * The table <code>public.store</code>. - */ - public final Store STORE = Store.STORE; - - /** - * No further instances allowed - */ - private Public() { - super(DSL.name("public"), null, DSL.comment("Standard public schema")); - } - - - @Override - public Catalog getCatalog() { - return DefaultCatalog.DEFAULT_CATALOG; - } - - @Override - public final List<Domain<?>> getDomains() { - return Arrays.asList( - Domains.YEAR - ); - } - - @Override - public final List<Table<?>> getTables() { - return Arrays.asList( - Actor.ACTOR, - ActorInfo.ACTOR_INFO, - Address.ADDRESS, - Category.CATEGORY, - City.CITY, - Country.COUNTRY, - Customer.CUSTOMER, - CustomerList.CUSTOMER_LIST, - Film.FILM, - FilmActor.FILM_ACTOR, - FilmCategory.FILM_CATEGORY, - FilmInStock.FILM_IN_STOCK, - FilmList.FILM_LIST, - FilmNotInStock.FILM_NOT_IN_STOCK, - Inventory.INVENTORY, - Language.LANGUAGE, - NicerButSlowerFilmList.NICER_BUT_SLOWER_FILM_LIST, - Payment.PAYMENT, - PaymentP2007_01.PAYMENT_P2007_01, - PaymentP2007_02.PAYMENT_P2007_02, - PaymentP2007_03.PAYMENT_P2007_03, - PaymentP2007_04.PAYMENT_P2007_04, - PaymentP2007_05.PAYMENT_P2007_05, - PaymentP2007_06.PAYMENT_P2007_06, - Rental.RENTAL, - RewardsReport.REWARDS_REPORT, - SalesByFilmCategory.SALES_BY_FILM_CATEGORY, - SalesByStore.SALES_BY_STORE, - Staff.STAFF, - StaffList.STAFF_LIST, - Store.STORE - ); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/Routines.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/Routines.java deleted file mode 100644 index dde87b6cfe..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/Routines.java +++ /dev/null @@ -1,381 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq; - - -import java.math.BigDecimal; -import java.time.LocalDate; -import java.time.LocalDateTime; - -import no.sikt.graphitron.example.generated.jooq.routines.GetCustomerBalance; -import no.sikt.graphitron.example.generated.jooq.routines.GroupConcat; -import no.sikt.graphitron.example.generated.jooq.routines.InventoryHeldByCustomer; -import no.sikt.graphitron.example.generated.jooq.routines.InventoryInStock; -import no.sikt.graphitron.example.generated.jooq.routines.LastDay; -import no.sikt.graphitron.example.generated.jooq.routines._GroupConcat; -import no.sikt.graphitron.example.generated.jooq.tables.FilmInStock; -import no.sikt.graphitron.example.generated.jooq.tables.FilmNotInStock; -import no.sikt.graphitron.example.generated.jooq.tables.RewardsReport; -import no.sikt.graphitron.example.generated.jooq.tables.records.CustomerRecord; -import no.sikt.graphitron.example.generated.jooq.tables.records.FilmInStockRecord; -import no.sikt.graphitron.example.generated.jooq.tables.records.FilmNotInStockRecord; - -import org.jooq.AggregateFunction; -import org.jooq.Configuration; -import org.jooq.Field; -import org.jooq.Result; - - -/** - * Convenience access to all stored procedures and functions in public. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class Routines { - - /** - * Call <code>public._group_concat</code> - */ - public static String _GroupConcat( - Configuration configuration - , String __1 - , String __2 - ) { - _GroupConcat f = new _GroupConcat(); - f.set__1(__1); - f.set__2(__2); - - f.execute(configuration); - return f.getReturnValue(); - } - - /** - * Get <code>public._group_concat</code> as a field. - */ - public static Field<String> _GroupConcat( - String __1 - , String __2 - ) { - _GroupConcat f = new _GroupConcat(); - f.set__1(__1); - f.set__2(__2); - - return f.asField(); - } - - /** - * Get <code>public._group_concat</code> as a field. - */ - public static Field<String> _GroupConcat( - Field<String> __1 - , Field<String> __2 - ) { - _GroupConcat f = new _GroupConcat(); - f.set__1(__1); - f.set__2(__2); - - return f.asField(); - } - - /** - * Call <code>public.get_customer_balance</code> - */ - public static BigDecimal getCustomerBalance( - Configuration configuration - , Integer pCustomerId - , LocalDateTime pEffectiveDate - ) { - GetCustomerBalance f = new GetCustomerBalance(); - f.setPCustomerId(pCustomerId); - f.setPEffectiveDate(pEffectiveDate); - - f.execute(configuration); - return f.getReturnValue(); - } - - /** - * Get <code>public.get_customer_balance</code> as a field. - */ - public static Field<BigDecimal> getCustomerBalance( - Integer pCustomerId - , LocalDateTime pEffectiveDate - ) { - GetCustomerBalance f = new GetCustomerBalance(); - f.setPCustomerId(pCustomerId); - f.setPEffectiveDate(pEffectiveDate); - - return f.asField(); - } - - /** - * Get <code>public.get_customer_balance</code> as a field. - */ - public static Field<BigDecimal> getCustomerBalance( - Field<Integer> pCustomerId - , Field<LocalDateTime> pEffectiveDate - ) { - GetCustomerBalance f = new GetCustomerBalance(); - f.setPCustomerId(pCustomerId); - f.setPEffectiveDate(pEffectiveDate); - - return f.asField(); - } - - /** - * Get <code>public.group_concat</code> as a field. - */ - public static AggregateFunction<String> groupConcat( - String __1 - ) { - GroupConcat f = new GroupConcat(); - f.set__1(__1); - - return f.asAggregateFunction(); - } - - /** - * Get <code>public.group_concat</code> as a field. - */ - public static AggregateFunction<String> groupConcat( - Field<String> __1 - ) { - GroupConcat f = new GroupConcat(); - f.set__1(__1); - - return f.asAggregateFunction(); - } - - /** - * Call <code>public.inventory_held_by_customer</code> - */ - public static Integer inventoryHeldByCustomer( - Configuration configuration - , Integer pInventoryId - ) { - InventoryHeldByCustomer f = new InventoryHeldByCustomer(); - f.setPInventoryId(pInventoryId); - - f.execute(configuration); - return f.getReturnValue(); - } - - /** - * Get <code>public.inventory_held_by_customer</code> as a field. - */ - public static Field<Integer> inventoryHeldByCustomer( - Integer pInventoryId - ) { - InventoryHeldByCustomer f = new InventoryHeldByCustomer(); - f.setPInventoryId(pInventoryId); - - return f.asField(); - } - - /** - * Get <code>public.inventory_held_by_customer</code> as a field. - */ - public static Field<Integer> inventoryHeldByCustomer( - Field<Integer> pInventoryId - ) { - InventoryHeldByCustomer f = new InventoryHeldByCustomer(); - f.setPInventoryId(pInventoryId); - - return f.asField(); - } - - /** - * Call <code>public.inventory_in_stock</code> - */ - public static Boolean inventoryInStock( - Configuration configuration - , Integer pInventoryId - ) { - InventoryInStock f = new InventoryInStock(); - f.setPInventoryId(pInventoryId); - - f.execute(configuration); - return f.getReturnValue(); - } - - /** - * Get <code>public.inventory_in_stock</code> as a field. - */ - public static Field<Boolean> inventoryInStock( - Integer pInventoryId - ) { - InventoryInStock f = new InventoryInStock(); - f.setPInventoryId(pInventoryId); - - return f.asField(); - } - - /** - * Get <code>public.inventory_in_stock</code> as a field. - */ - public static Field<Boolean> inventoryInStock( - Field<Integer> pInventoryId - ) { - InventoryInStock f = new InventoryInStock(); - f.setPInventoryId(pInventoryId); - - return f.asField(); - } - - /** - * Call <code>public.last_day</code> - */ - public static LocalDate lastDay( - Configuration configuration - , LocalDateTime __1 - ) { - LastDay f = new LastDay(); - f.set__1(__1); - - f.execute(configuration); - return f.getReturnValue(); - } - - /** - * Get <code>public.last_day</code> as a field. - */ - public static Field<LocalDate> lastDay( - LocalDateTime __1 - ) { - LastDay f = new LastDay(); - f.set__1(__1); - - return f.asField(); - } - - /** - * Get <code>public.last_day</code> as a field. - */ - public static Field<LocalDate> lastDay( - Field<LocalDateTime> __1 - ) { - LastDay f = new LastDay(); - f.set__1(__1); - - return f.asField(); - } - - /** - * Call <code>public.film_in_stock</code>. - */ - public static Result<FilmInStockRecord> filmInStock( - Configuration configuration - , Integer pFilmId - , Integer pStoreId - ) { - return configuration.dsl().selectFrom(no.sikt.graphitron.example.generated.jooq.tables.FilmInStock.FILM_IN_STOCK.call( - pFilmId - , pStoreId - )).fetch(); - } - - /** - * Get <code>public.film_in_stock</code> as a table. - */ - public static FilmInStock filmInStock( - Integer pFilmId - , Integer pStoreId - ) { - return no.sikt.graphitron.example.generated.jooq.tables.FilmInStock.FILM_IN_STOCK.call( - pFilmId, - pStoreId - ); - } - - /** - * Get <code>public.film_in_stock</code> as a table. - */ - public static FilmInStock filmInStock( - Field<Integer> pFilmId - , Field<Integer> pStoreId - ) { - return no.sikt.graphitron.example.generated.jooq.tables.FilmInStock.FILM_IN_STOCK.call( - pFilmId, - pStoreId - ); - } - - /** - * Call <code>public.film_not_in_stock</code>. - */ - public static Result<FilmNotInStockRecord> filmNotInStock( - Configuration configuration - , Integer pFilmId - , Integer pStoreId - ) { - return configuration.dsl().selectFrom(no.sikt.graphitron.example.generated.jooq.tables.FilmNotInStock.FILM_NOT_IN_STOCK.call( - pFilmId - , pStoreId - )).fetch(); - } - - /** - * Get <code>public.film_not_in_stock</code> as a table. - */ - public static FilmNotInStock filmNotInStock( - Integer pFilmId - , Integer pStoreId - ) { - return no.sikt.graphitron.example.generated.jooq.tables.FilmNotInStock.FILM_NOT_IN_STOCK.call( - pFilmId, - pStoreId - ); - } - - /** - * Get <code>public.film_not_in_stock</code> as a table. - */ - public static FilmNotInStock filmNotInStock( - Field<Integer> pFilmId - , Field<Integer> pStoreId - ) { - return no.sikt.graphitron.example.generated.jooq.tables.FilmNotInStock.FILM_NOT_IN_STOCK.call( - pFilmId, - pStoreId - ); - } - - /** - * Call <code>public.rewards_report</code>. - */ - public static Result<CustomerRecord> rewardsReport( - Configuration configuration - , Integer minMonthlyPurchases - , BigDecimal minDollarAmountPurchased - ) { - return configuration.dsl().selectFrom(no.sikt.graphitron.example.generated.jooq.tables.RewardsReport.REWARDS_REPORT.call( - minMonthlyPurchases - , minDollarAmountPurchased - )).fetch(); - } - - /** - * Get <code>public.rewards_report</code> as a table. - */ - public static RewardsReport rewardsReport( - Integer minMonthlyPurchases - , BigDecimal minDollarAmountPurchased - ) { - return no.sikt.graphitron.example.generated.jooq.tables.RewardsReport.REWARDS_REPORT.call( - minMonthlyPurchases, - minDollarAmountPurchased - ); - } - - /** - * Get <code>public.rewards_report</code> as a table. - */ - public static RewardsReport rewardsReport( - Field<Integer> minMonthlyPurchases - , Field<BigDecimal> minDollarAmountPurchased - ) { - return no.sikt.graphitron.example.generated.jooq.tables.RewardsReport.REWARDS_REPORT.call( - minMonthlyPurchases, - minDollarAmountPurchased - ); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/Tables.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/Tables.java deleted file mode 100644 index b8e4276a6e..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/Tables.java +++ /dev/null @@ -1,329 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq; - - -import java.math.BigDecimal; - -import no.sikt.graphitron.example.generated.jooq.tables.Actor; -import no.sikt.graphitron.example.generated.jooq.tables.ActorInfo; -import no.sikt.graphitron.example.generated.jooq.tables.Address; -import no.sikt.graphitron.example.generated.jooq.tables.Category; -import no.sikt.graphitron.example.generated.jooq.tables.City; -import no.sikt.graphitron.example.generated.jooq.tables.Country; -import no.sikt.graphitron.example.generated.jooq.tables.Customer; -import no.sikt.graphitron.example.generated.jooq.tables.CustomerList; -import no.sikt.graphitron.example.generated.jooq.tables.Film; -import no.sikt.graphitron.example.generated.jooq.tables.FilmActor; -import no.sikt.graphitron.example.generated.jooq.tables.FilmCategory; -import no.sikt.graphitron.example.generated.jooq.tables.FilmInStock; -import no.sikt.graphitron.example.generated.jooq.tables.FilmList; -import no.sikt.graphitron.example.generated.jooq.tables.FilmNotInStock; -import no.sikt.graphitron.example.generated.jooq.tables.Inventory; -import no.sikt.graphitron.example.generated.jooq.tables.Language; -import no.sikt.graphitron.example.generated.jooq.tables.NicerButSlowerFilmList; -import no.sikt.graphitron.example.generated.jooq.tables.Payment; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_01; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_02; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_03; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_04; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_05; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_06; -import no.sikt.graphitron.example.generated.jooq.tables.Rental; -import no.sikt.graphitron.example.generated.jooq.tables.RewardsReport; -import no.sikt.graphitron.example.generated.jooq.tables.SalesByFilmCategory; -import no.sikt.graphitron.example.generated.jooq.tables.SalesByStore; -import no.sikt.graphitron.example.generated.jooq.tables.Staff; -import no.sikt.graphitron.example.generated.jooq.tables.StaffList; -import no.sikt.graphitron.example.generated.jooq.tables.Store; -import no.sikt.graphitron.example.generated.jooq.tables.records.CustomerRecord; -import no.sikt.graphitron.example.generated.jooq.tables.records.FilmInStockRecord; -import no.sikt.graphitron.example.generated.jooq.tables.records.FilmNotInStockRecord; - -import org.jooq.Configuration; -import org.jooq.Field; -import org.jooq.Result; - - -/** - * Convenience access to all tables in public. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class Tables { - - /** - * The table <code>public.actor</code>. - */ - public static final Actor ACTOR = Actor.ACTOR; - - /** - * The table <code>public.actor_info</code>. - */ - public static final ActorInfo ACTOR_INFO = ActorInfo.ACTOR_INFO; - - /** - * The table <code>public.address</code>. - */ - public static final Address ADDRESS = Address.ADDRESS; - - /** - * The table <code>public.category</code>. - */ - public static final Category CATEGORY = Category.CATEGORY; - - /** - * The table <code>public.city</code>. - */ - public static final City CITY = City.CITY; - - /** - * The table <code>public.country</code>. - */ - public static final Country COUNTRY = Country.COUNTRY; - - /** - * The table <code>public.customer</code>. - */ - public static final Customer CUSTOMER = Customer.CUSTOMER; - - /** - * The table <code>public.customer_list</code>. - */ - public static final CustomerList CUSTOMER_LIST = CustomerList.CUSTOMER_LIST; - - /** - * The table <code>public.film</code>. - */ - public static final Film FILM = Film.FILM; - - /** - * The table <code>public.film_actor</code>. - */ - public static final FilmActor FILM_ACTOR = FilmActor.FILM_ACTOR; - - /** - * The table <code>public.film_category</code>. - */ - public static final FilmCategory FILM_CATEGORY = FilmCategory.FILM_CATEGORY; - - /** - * The table <code>public.film_in_stock</code>. - */ - public static final FilmInStock FILM_IN_STOCK = FilmInStock.FILM_IN_STOCK; - - /** - * Call <code>public.film_in_stock</code>. - */ - public static Result<FilmInStockRecord> FILM_IN_STOCK( - Configuration configuration - , Integer pFilmId - , Integer pStoreId - ) { - return configuration.dsl().selectFrom(no.sikt.graphitron.example.generated.jooq.tables.FilmInStock.FILM_IN_STOCK.call( - pFilmId - , pStoreId - )).fetch(); - } - - /** - * Get <code>public.film_in_stock</code> as a table. - */ - public static FilmInStock FILM_IN_STOCK( - Integer pFilmId - , Integer pStoreId - ) { - return no.sikt.graphitron.example.generated.jooq.tables.FilmInStock.FILM_IN_STOCK.call( - pFilmId, - pStoreId - ); - } - - /** - * Get <code>public.film_in_stock</code> as a table. - */ - public static FilmInStock FILM_IN_STOCK( - Field<Integer> pFilmId - , Field<Integer> pStoreId - ) { - return no.sikt.graphitron.example.generated.jooq.tables.FilmInStock.FILM_IN_STOCK.call( - pFilmId, - pStoreId - ); - } - - /** - * The table <code>public.film_list</code>. - */ - public static final FilmList FILM_LIST = FilmList.FILM_LIST; - - /** - * The table <code>public.film_not_in_stock</code>. - */ - public static final FilmNotInStock FILM_NOT_IN_STOCK = FilmNotInStock.FILM_NOT_IN_STOCK; - - /** - * Call <code>public.film_not_in_stock</code>. - */ - public static Result<FilmNotInStockRecord> FILM_NOT_IN_STOCK( - Configuration configuration - , Integer pFilmId - , Integer pStoreId - ) { - return configuration.dsl().selectFrom(no.sikt.graphitron.example.generated.jooq.tables.FilmNotInStock.FILM_NOT_IN_STOCK.call( - pFilmId - , pStoreId - )).fetch(); - } - - /** - * Get <code>public.film_not_in_stock</code> as a table. - */ - public static FilmNotInStock FILM_NOT_IN_STOCK( - Integer pFilmId - , Integer pStoreId - ) { - return no.sikt.graphitron.example.generated.jooq.tables.FilmNotInStock.FILM_NOT_IN_STOCK.call( - pFilmId, - pStoreId - ); - } - - /** - * Get <code>public.film_not_in_stock</code> as a table. - */ - public static FilmNotInStock FILM_NOT_IN_STOCK( - Field<Integer> pFilmId - , Field<Integer> pStoreId - ) { - return no.sikt.graphitron.example.generated.jooq.tables.FilmNotInStock.FILM_NOT_IN_STOCK.call( - pFilmId, - pStoreId - ); - } - - /** - * The table <code>public.inventory</code>. - */ - public static final Inventory INVENTORY = Inventory.INVENTORY; - - /** - * The table <code>public.language</code>. - */ - public static final Language LANGUAGE = Language.LANGUAGE; - - /** - * The table <code>public.nicer_but_slower_film_list</code>. - */ - public static final NicerButSlowerFilmList NICER_BUT_SLOWER_FILM_LIST = NicerButSlowerFilmList.NICER_BUT_SLOWER_FILM_LIST; - - /** - * The table <code>public.payment</code>. - */ - public static final Payment PAYMENT = Payment.PAYMENT; - - /** - * The table <code>public.payment_p2007_01</code>. - */ - public static final PaymentP2007_01 PAYMENT_P2007_01 = PaymentP2007_01.PAYMENT_P2007_01; - - /** - * The table <code>public.payment_p2007_02</code>. - */ - public static final PaymentP2007_02 PAYMENT_P2007_02 = PaymentP2007_02.PAYMENT_P2007_02; - - /** - * The table <code>public.payment_p2007_03</code>. - */ - public static final PaymentP2007_03 PAYMENT_P2007_03 = PaymentP2007_03.PAYMENT_P2007_03; - - /** - * The table <code>public.payment_p2007_04</code>. - */ - public static final PaymentP2007_04 PAYMENT_P2007_04 = PaymentP2007_04.PAYMENT_P2007_04; - - /** - * The table <code>public.payment_p2007_05</code>. - */ - public static final PaymentP2007_05 PAYMENT_P2007_05 = PaymentP2007_05.PAYMENT_P2007_05; - - /** - * The table <code>public.payment_p2007_06</code>. - */ - public static final PaymentP2007_06 PAYMENT_P2007_06 = PaymentP2007_06.PAYMENT_P2007_06; - - /** - * The table <code>public.rental</code>. - */ - public static final Rental RENTAL = Rental.RENTAL; - - /** - * The table <code>public.rewards_report</code>. - */ - public static final RewardsReport REWARDS_REPORT = RewardsReport.REWARDS_REPORT; - - /** - * Call <code>public.rewards_report</code>. - */ - public static Result<CustomerRecord> REWARDS_REPORT( - Configuration configuration - , Integer minMonthlyPurchases - , BigDecimal minDollarAmountPurchased - ) { - return configuration.dsl().selectFrom(no.sikt.graphitron.example.generated.jooq.tables.RewardsReport.REWARDS_REPORT.call( - minMonthlyPurchases - , minDollarAmountPurchased - )).fetch(); - } - - /** - * Get <code>public.rewards_report</code> as a table. - */ - public static RewardsReport REWARDS_REPORT( - Integer minMonthlyPurchases - , BigDecimal minDollarAmountPurchased - ) { - return no.sikt.graphitron.example.generated.jooq.tables.RewardsReport.REWARDS_REPORT.call( - minMonthlyPurchases, - minDollarAmountPurchased - ); - } - - /** - * Get <code>public.rewards_report</code> as a table. - */ - public static RewardsReport REWARDS_REPORT( - Field<Integer> minMonthlyPurchases - , Field<BigDecimal> minDollarAmountPurchased - ) { - return no.sikt.graphitron.example.generated.jooq.tables.RewardsReport.REWARDS_REPORT.call( - minMonthlyPurchases, - minDollarAmountPurchased - ); - } - - /** - * The table <code>public.sales_by_film_category</code>. - */ - public static final SalesByFilmCategory SALES_BY_FILM_CATEGORY = SalesByFilmCategory.SALES_BY_FILM_CATEGORY; - - /** - * The table <code>public.sales_by_store</code>. - */ - public static final SalesByStore SALES_BY_STORE = SalesByStore.SALES_BY_STORE; - - /** - * The table <code>public.staff</code>. - */ - public static final Staff STAFF = Staff.STAFF; - - /** - * The table <code>public.staff_list</code>. - */ - public static final StaffList STAFF_LIST = StaffList.STAFF_LIST; - - /** - * The table <code>public.store</code>. - */ - public static final Store STORE = Store.STORE; -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/enums/MpaaRating.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/enums/MpaaRating.java deleted file mode 100644 index 26ef7accf4..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/enums/MpaaRating.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.enums; - - -import no.sikt.graphitron.example.generated.jooq.Public; - -import org.jooq.Catalog; -import org.jooq.EnumType; -import org.jooq.Schema; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public enum MpaaRating implements EnumType { - - G("G"), - - PG("PG"), - - PG_13("PG-13"), - - R("R"), - - NC_17("NC-17"); - - private final String literal; - - private MpaaRating(String literal) { - this.literal = literal; - } - - @Override - public Catalog getCatalog() { - return getSchema().getCatalog(); - } - - @Override - public Schema getSchema() { - return Public.PUBLIC; - } - - @Override - public String getName() { - return "mpaa_rating"; - } - - @Override - public String getLiteral() { - return literal; - } - - /** - * Lookup a value of this EnumType by its literal. Returns - * <code>null</code>, if no such value could be found, see {@link - * EnumType#lookupLiteral(Class, String)}. - */ - public static MpaaRating lookupLiteral(String literal) { - return EnumType.lookupLiteral(MpaaRating.class, literal); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/routines/GetCustomerBalance.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/routines/GetCustomerBalance.java deleted file mode 100644 index b3c2791e30..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/routines/GetCustomerBalance.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.routines; - - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -import no.sikt.graphitron.example.generated.jooq.Public; - -import org.jooq.Field; -import org.jooq.Parameter; -import org.jooq.impl.AbstractRoutine; -import org.jooq.impl.DSL; -import org.jooq.impl.Internal; -import org.jooq.impl.SQLDataType; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class GetCustomerBalance extends AbstractRoutine<BigDecimal> { - - private static final long serialVersionUID = 1L; - - /** - * The parameter <code>public.get_customer_balance.RETURN_VALUE</code>. - */ - public static final Parameter<BigDecimal> RETURN_VALUE = Internal.createParameter("RETURN_VALUE", SQLDataType.NUMERIC, false, false); - - /** - * The parameter <code>public.get_customer_balance.p_customer_id</code>. - */ - public static final Parameter<Integer> P_CUSTOMER_ID = Internal.createParameter("p_customer_id", SQLDataType.INTEGER, false, false); - - /** - * The parameter <code>public.get_customer_balance.p_effective_date</code>. - */ - public static final Parameter<LocalDateTime> P_EFFECTIVE_DATE = Internal.createParameter("p_effective_date", SQLDataType.LOCALDATETIME(6), false, false); - - /** - * Create a new routine call instance - */ - public GetCustomerBalance() { - super("get_customer_balance", Public.PUBLIC, DSL.comment(""), SQLDataType.NUMERIC); - - setReturnParameter(RETURN_VALUE); - addInParameter(P_CUSTOMER_ID); - addInParameter(P_EFFECTIVE_DATE); - } - - /** - * Set the <code>p_customer_id</code> parameter IN value to the routine - */ - public void setPCustomerId(Integer value) { - setValue(P_CUSTOMER_ID, value); - } - - /** - * Set the <code>p_customer_id</code> parameter to the function to be used - * with a {@link org.jooq.Select} statement - */ - public void setPCustomerId(Field<Integer> field) { - setField(P_CUSTOMER_ID, field); - } - - /** - * Set the <code>p_effective_date</code> parameter IN value to the routine - */ - public void setPEffectiveDate(LocalDateTime value) { - setValue(P_EFFECTIVE_DATE, value); - } - - /** - * Set the <code>p_effective_date</code> parameter to the function to be - * used with a {@link org.jooq.Select} statement - */ - public void setPEffectiveDate(Field<LocalDateTime> field) { - setField(P_EFFECTIVE_DATE, field); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/routines/GroupConcat.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/routines/GroupConcat.java deleted file mode 100644 index 494f2cae6c..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/routines/GroupConcat.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.routines; - - -import no.sikt.graphitron.example.generated.jooq.Public; - -import org.jooq.Field; -import org.jooq.Parameter; -import org.jooq.impl.AbstractRoutine; -import org.jooq.impl.DSL; -import org.jooq.impl.Internal; -import org.jooq.impl.SQLDataType; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class GroupConcat extends AbstractRoutine<String> { - - private static final long serialVersionUID = 1L; - - /** - * The parameter <code>public.group_concat.RETURN_VALUE</code>. - */ - public static final Parameter<String> RETURN_VALUE = Internal.createParameter("RETURN_VALUE", SQLDataType.CLOB, false, false); - - /** - * The parameter <code>public.group_concat._1</code>. - */ - public static final Parameter<String> _1 = Internal.createParameter("_1", SQLDataType.CLOB, false, true); - - /** - * Create a new routine call instance - */ - public GroupConcat() { - super("group_concat", Public.PUBLIC, DSL.comment(""), SQLDataType.CLOB); - - setReturnParameter(RETURN_VALUE); - addInParameter(_1); - } - - /** - * Set the <code>_1</code> parameter IN value to the routine - */ - public void set__1(String value) { - setValue(_1, value); - } - - /** - * Set the <code>_1</code> parameter to the function to be used with a - * {@link org.jooq.Select} statement - */ - public void set__1(Field<String> field) { - setField(_1, field); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/routines/InventoryHeldByCustomer.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/routines/InventoryHeldByCustomer.java deleted file mode 100644 index 9343c8f2bb..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/routines/InventoryHeldByCustomer.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.routines; - - -import no.sikt.graphitron.example.generated.jooq.Public; - -import org.jooq.Field; -import org.jooq.Parameter; -import org.jooq.impl.AbstractRoutine; -import org.jooq.impl.DSL; -import org.jooq.impl.Internal; -import org.jooq.impl.SQLDataType; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class InventoryHeldByCustomer extends AbstractRoutine<Integer> { - - private static final long serialVersionUID = 1L; - - /** - * The parameter - * <code>public.inventory_held_by_customer.RETURN_VALUE</code>. - */ - public static final Parameter<Integer> RETURN_VALUE = Internal.createParameter("RETURN_VALUE", SQLDataType.INTEGER, false, false); - - /** - * The parameter - * <code>public.inventory_held_by_customer.p_inventory_id</code>. - */ - public static final Parameter<Integer> P_INVENTORY_ID = Internal.createParameter("p_inventory_id", SQLDataType.INTEGER, false, false); - - /** - * Create a new routine call instance - */ - public InventoryHeldByCustomer() { - super("inventory_held_by_customer", Public.PUBLIC, DSL.comment(""), SQLDataType.INTEGER); - - setReturnParameter(RETURN_VALUE); - addInParameter(P_INVENTORY_ID); - } - - /** - * Set the <code>p_inventory_id</code> parameter IN value to the routine - */ - public void setPInventoryId(Integer value) { - setValue(P_INVENTORY_ID, value); - } - - /** - * Set the <code>p_inventory_id</code> parameter to the function to be used - * with a {@link org.jooq.Select} statement - */ - public void setPInventoryId(Field<Integer> field) { - setField(P_INVENTORY_ID, field); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/routines/InventoryInStock.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/routines/InventoryInStock.java deleted file mode 100644 index d0d8d89186..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/routines/InventoryInStock.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.routines; - - -import no.sikt.graphitron.example.generated.jooq.Public; - -import org.jooq.Field; -import org.jooq.Parameter; -import org.jooq.impl.AbstractRoutine; -import org.jooq.impl.DSL; -import org.jooq.impl.Internal; -import org.jooq.impl.SQLDataType; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class InventoryInStock extends AbstractRoutine<Boolean> { - - private static final long serialVersionUID = 1L; - - /** - * The parameter <code>public.inventory_in_stock.RETURN_VALUE</code>. - */ - public static final Parameter<Boolean> RETURN_VALUE = Internal.createParameter("RETURN_VALUE", SQLDataType.BOOLEAN, false, false); - - /** - * The parameter <code>public.inventory_in_stock.p_inventory_id</code>. - */ - public static final Parameter<Integer> P_INVENTORY_ID = Internal.createParameter("p_inventory_id", SQLDataType.INTEGER, false, false); - - /** - * Create a new routine call instance - */ - public InventoryInStock() { - super("inventory_in_stock", Public.PUBLIC, DSL.comment(""), SQLDataType.BOOLEAN); - - setReturnParameter(RETURN_VALUE); - addInParameter(P_INVENTORY_ID); - } - - /** - * Set the <code>p_inventory_id</code> parameter IN value to the routine - */ - public void setPInventoryId(Integer value) { - setValue(P_INVENTORY_ID, value); - } - - /** - * Set the <code>p_inventory_id</code> parameter to the function to be used - * with a {@link org.jooq.Select} statement - */ - public void setPInventoryId(Field<Integer> field) { - setField(P_INVENTORY_ID, field); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/routines/LastDay.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/routines/LastDay.java deleted file mode 100644 index 7bbe2e8aa1..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/routines/LastDay.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.routines; - - -import java.time.LocalDate; -import java.time.LocalDateTime; - -import no.sikt.graphitron.example.generated.jooq.Public; - -import org.jooq.Field; -import org.jooq.Parameter; -import org.jooq.impl.AbstractRoutine; -import org.jooq.impl.DSL; -import org.jooq.impl.Internal; -import org.jooq.impl.SQLDataType; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class LastDay extends AbstractRoutine<LocalDate> { - - private static final long serialVersionUID = 1L; - - /** - * The parameter <code>public.last_day.RETURN_VALUE</code>. - */ - public static final Parameter<LocalDate> RETURN_VALUE = Internal.createParameter("RETURN_VALUE", SQLDataType.LOCALDATE, false, false); - - /** - * The parameter <code>public.last_day._1</code>. - */ - public static final Parameter<LocalDateTime> _1 = Internal.createParameter("_1", SQLDataType.LOCALDATETIME(6), false, true); - - /** - * Create a new routine call instance - */ - public LastDay() { - super("last_day", Public.PUBLIC, DSL.comment(""), SQLDataType.LOCALDATE); - - setReturnParameter(RETURN_VALUE); - addInParameter(_1); - } - - /** - * Set the <code>_1</code> parameter IN value to the routine - */ - public void set__1(LocalDateTime value) { - setValue(_1, value); - } - - /** - * Set the <code>_1</code> parameter to the function to be used with a - * {@link org.jooq.Select} statement - */ - public void set__1(Field<LocalDateTime> field) { - setField(_1, field); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/routines/_GroupConcat.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/routines/_GroupConcat.java deleted file mode 100644 index 5249735e6f..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/routines/_GroupConcat.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.routines; - - -import no.sikt.graphitron.example.generated.jooq.Public; - -import org.jooq.Field; -import org.jooq.Parameter; -import org.jooq.impl.AbstractRoutine; -import org.jooq.impl.DSL; -import org.jooq.impl.Internal; -import org.jooq.impl.SQLDataType; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class _GroupConcat extends AbstractRoutine<String> { - - private static final long serialVersionUID = 1L; - - /** - * The parameter <code>public._group_concat.RETURN_VALUE</code>. - */ - public static final Parameter<String> RETURN_VALUE = Internal.createParameter("RETURN_VALUE", SQLDataType.CLOB, false, false); - - /** - * The parameter <code>public._group_concat._1</code>. - */ - public static final Parameter<String> _1 = Internal.createParameter("_1", SQLDataType.CLOB, false, true); - - /** - * The parameter <code>public._group_concat._2</code>. - */ - public static final Parameter<String> _2 = Internal.createParameter("_2", SQLDataType.CLOB, false, true); - - /** - * Create a new routine call instance - */ - public _GroupConcat() { - super("_group_concat", Public.PUBLIC, DSL.comment(""), SQLDataType.CLOB); - - setReturnParameter(RETURN_VALUE); - addInParameter(_1); - addInParameter(_2); - } - - /** - * Set the <code>_1</code> parameter IN value to the routine - */ - public void set__1(String value) { - setValue(_1, value); - } - - /** - * Set the <code>_1</code> parameter to the function to be used with a - * {@link org.jooq.Select} statement - */ - public void set__1(Field<String> field) { - setField(_1, field); - } - - /** - * Set the <code>_2</code> parameter IN value to the routine - */ - public void set__2(String value) { - setValue(_2, value); - } - - /** - * Set the <code>_2</code> parameter to the function to be used with a - * {@link org.jooq.Select} statement - */ - public void set__2(Field<String> field) { - setField(_2, field); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Actor.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Actor.java deleted file mode 100644 index f59462f91f..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Actor.java +++ /dev/null @@ -1,309 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables; - - -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import no.sikt.graphitron.example.generated.jooq.Indexes; -import no.sikt.graphitron.example.generated.jooq.Keys; -import no.sikt.graphitron.example.generated.jooq.Public; -import no.sikt.graphitron.example.generated.jooq.tables.Film.FilmPath; -import no.sikt.graphitron.example.generated.jooq.tables.FilmActor.FilmActorPath; -import no.sikt.graphitron.example.generated.jooq.tables.records.ActorRecord; - -import org.jooq.Condition; -import org.jooq.Field; -import org.jooq.ForeignKey; -import org.jooq.Identity; -import org.jooq.Index; -import org.jooq.InverseForeignKey; -import org.jooq.Name; -import org.jooq.Path; -import org.jooq.PlainSQL; -import org.jooq.QueryPart; -import org.jooq.Record; -import org.jooq.SQL; -import org.jooq.Schema; -import org.jooq.Select; -import org.jooq.Stringly; -import org.jooq.Table; -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.UniqueKey; -import org.jooq.impl.DSL; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class Actor extends TableImpl<ActorRecord> { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>public.actor</code> - */ - public static final Actor ACTOR = new Actor(); - - /** - * The class holding records for this type - */ - @Override - public Class<ActorRecord> getRecordType() { - return ActorRecord.class; - } - - /** - * The column <code>public.actor.actor_id</code>. - */ - public final TableField<ActorRecord, Integer> ACTOR_ID = createField(DSL.name("actor_id"), SQLDataType.INTEGER.nullable(false).identity(true), this, ""); - - /** - * The column <code>public.actor.first_name</code>. - */ - public final TableField<ActorRecord, String> FIRST_NAME = createField(DSL.name("first_name"), SQLDataType.VARCHAR(45).nullable(false), this, ""); - - /** - * The column <code>public.actor.last_name</code>. - */ - public final TableField<ActorRecord, String> LAST_NAME = createField(DSL.name("last_name"), SQLDataType.VARCHAR(45).nullable(false), this, ""); - - /** - * The column <code>public.actor.last_update</code>. - */ - public final TableField<ActorRecord, LocalDateTime> LAST_UPDATE = createField(DSL.name("last_update"), SQLDataType.LOCALDATETIME(6).nullable(false).defaultValue(DSL.field(DSL.raw("now()"), SQLDataType.LOCALDATETIME)), this, ""); - - private Actor(Name alias, Table<ActorRecord> aliased) { - this(alias, aliased, (Field<?>[]) null, null); - } - - private Actor(Name alias, Table<ActorRecord> aliased, Field<?>[] parameters, Condition where) { - super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.table(), where); - } - - /** - * Create an aliased <code>public.actor</code> table reference - */ - public Actor(String alias) { - this(DSL.name(alias), ACTOR); - } - - /** - * Create an aliased <code>public.actor</code> table reference - */ - public Actor(Name alias) { - this(alias, ACTOR); - } - - /** - * Create a <code>public.actor</code> table reference - */ - public Actor() { - this(DSL.name("actor"), null); - } - - public <O extends Record> Actor(Table<O> path, ForeignKey<O, ActorRecord> childPath, InverseForeignKey<O, ActorRecord> parentPath) { - super(path, childPath, parentPath, ACTOR); - } - - /** - * A subtype implementing {@link Path} for simplified path-based joins. - */ - public static class ActorPath extends Actor implements Path<ActorRecord> { - - private static final long serialVersionUID = 1L; - public <O extends Record> ActorPath(Table<O> path, ForeignKey<O, ActorRecord> childPath, InverseForeignKey<O, ActorRecord> parentPath) { - super(path, childPath, parentPath); - } - private ActorPath(Name alias, Table<ActorRecord> aliased) { - super(alias, aliased); - } - - @Override - public ActorPath as(String alias) { - return new ActorPath(DSL.name(alias), this); - } - - @Override - public ActorPath as(Name alias) { - return new ActorPath(alias, this); - } - - @Override - public ActorPath as(Table<?> alias) { - return new ActorPath(alias.getQualifiedName(), this); - } - } - - @Override - public Schema getSchema() { - return aliased() ? null : Public.PUBLIC; - } - - @Override - public List<Index> getIndexes() { - return Arrays.asList(Indexes.IDX_ACTOR_LAST_NAME); - } - - @Override - public Identity<ActorRecord, Integer> getIdentity() { - return (Identity<ActorRecord, Integer>) super.getIdentity(); - } - - @Override - public UniqueKey<ActorRecord> getPrimaryKey() { - return Keys.ACTOR_PKEY; - } - - private transient FilmActorPath _filmActor; - - /** - * Get the implicit to-many join path to the <code>public.film_actor</code> - * table - */ - public FilmActorPath filmActor() { - if (_filmActor == null) - _filmActor = new FilmActorPath(this, null, Keys.FILM_ACTOR__FILM_ACTOR_ACTOR_ID_FKEY.getInverseKey()); - - return _filmActor; - } - - /** - * Get the implicit many-to-many join path to the <code>public.film</code> - * table - */ - public FilmPath film() { - return filmActor().film(); - } - - @Override - public Actor as(String alias) { - return new Actor(DSL.name(alias), this); - } - - @Override - public Actor as(Name alias) { - return new Actor(alias, this); - } - - @Override - public Actor as(Table<?> alias) { - return new Actor(alias.getQualifiedName(), this); - } - - /** - * Rename this table - */ - @Override - public Actor rename(String name) { - return new Actor(DSL.name(name), null); - } - - /** - * Rename this table - */ - @Override - public Actor rename(Name name) { - return new Actor(name, null); - } - - /** - * Rename this table - */ - @Override - public Actor rename(Table<?> name) { - return new Actor(name.getQualifiedName(), null); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Actor where(Condition condition) { - return new Actor(getQualifiedName(), aliased() ? this : null, null, condition); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Actor where(Collection<? extends Condition> conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Actor where(Condition... conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Actor where(Field<Boolean> condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Actor where(SQL condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Actor where(@Stringly.SQL String condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Actor where(@Stringly.SQL String condition, Object... binds) { - return where(DSL.condition(condition, binds)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Actor where(@Stringly.SQL String condition, QueryPart... parts) { - return where(DSL.condition(condition, parts)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Actor whereExists(Select<?> select) { - return where(DSL.exists(select)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Actor whereNotExists(Select<?> select) { - return where(DSL.notExists(select)); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/ActorInfo.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/ActorInfo.java deleted file mode 100644 index 12918d91de..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/ActorInfo.java +++ /dev/null @@ -1,241 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables; - - -import java.util.Collection; - -import no.sikt.graphitron.example.generated.jooq.Public; -import no.sikt.graphitron.example.generated.jooq.tables.records.ActorInfoRecord; - -import org.jooq.Condition; -import org.jooq.Field; -import org.jooq.Name; -import org.jooq.PlainSQL; -import org.jooq.QueryPart; -import org.jooq.SQL; -import org.jooq.Schema; -import org.jooq.Select; -import org.jooq.Stringly; -import org.jooq.Table; -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.impl.DSL; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class ActorInfo extends TableImpl<ActorInfoRecord> { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>public.actor_info</code> - */ - public static final ActorInfo ACTOR_INFO = new ActorInfo(); - - /** - * The class holding records for this type - */ - @Override - public Class<ActorInfoRecord> getRecordType() { - return ActorInfoRecord.class; - } - - /** - * The column <code>public.actor_info.actor_id</code>. - */ - public final TableField<ActorInfoRecord, Integer> ACTOR_ID = createField(DSL.name("actor_id"), SQLDataType.INTEGER, this, ""); - - /** - * The column <code>public.actor_info.first_name</code>. - */ - public final TableField<ActorInfoRecord, String> FIRST_NAME = createField(DSL.name("first_name"), SQLDataType.VARCHAR(45), this, ""); - - /** - * The column <code>public.actor_info.last_name</code>. - */ - public final TableField<ActorInfoRecord, String> LAST_NAME = createField(DSL.name("last_name"), SQLDataType.VARCHAR(45), this, ""); - - /** - * The column <code>public.actor_info.film_info</code>. - */ - public final TableField<ActorInfoRecord, String> FILM_INFO = createField(DSL.name("film_info"), SQLDataType.CLOB, this, ""); - - private ActorInfo(Name alias, Table<ActorInfoRecord> aliased) { - this(alias, aliased, (Field<?>[]) null, null); - } - - private ActorInfo(Name alias, Table<ActorInfoRecord> aliased, Field<?>[] parameters, Condition where) { - super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.view(""" - CREATE VIEW "actor_info" AS SELECT a.actor_id, - a.first_name, - a.last_name, - group_concat(DISTINCT (((c.name)::text || ': '::text) || ( SELECT group_concat((f.title)::text) AS group_concat - FROM ((film f - JOIN film_category fc_1 ON ((f.film_id = fc_1.film_id))) - JOIN film_actor fa_1 ON ((f.film_id = fa_1.film_id))) - WHERE ((fc_1.category_id = c.category_id) AND (fa_1.actor_id = a.actor_id)) - GROUP BY fa_1.actor_id))) AS film_info - FROM (((actor a - LEFT JOIN film_actor fa ON ((a.actor_id = fa.actor_id))) - LEFT JOIN film_category fc ON ((fa.film_id = fc.film_id))) - LEFT JOIN category c ON ((fc.category_id = c.category_id))) - GROUP BY a.actor_id, a.first_name, a.last_name; - """), where); - } - - /** - * Create an aliased <code>public.actor_info</code> table reference - */ - public ActorInfo(String alias) { - this(DSL.name(alias), ACTOR_INFO); - } - - /** - * Create an aliased <code>public.actor_info</code> table reference - */ - public ActorInfo(Name alias) { - this(alias, ACTOR_INFO); - } - - /** - * Create a <code>public.actor_info</code> table reference - */ - public ActorInfo() { - this(DSL.name("actor_info"), null); - } - - @Override - public Schema getSchema() { - return aliased() ? null : Public.PUBLIC; - } - - @Override - public ActorInfo as(String alias) { - return new ActorInfo(DSL.name(alias), this); - } - - @Override - public ActorInfo as(Name alias) { - return new ActorInfo(alias, this); - } - - @Override - public ActorInfo as(Table<?> alias) { - return new ActorInfo(alias.getQualifiedName(), this); - } - - /** - * Rename this table - */ - @Override - public ActorInfo rename(String name) { - return new ActorInfo(DSL.name(name), null); - } - - /** - * Rename this table - */ - @Override - public ActorInfo rename(Name name) { - return new ActorInfo(name, null); - } - - /** - * Rename this table - */ - @Override - public ActorInfo rename(Table<?> name) { - return new ActorInfo(name.getQualifiedName(), null); - } - - /** - * Create an inline derived table from this table - */ - @Override - public ActorInfo where(Condition condition) { - return new ActorInfo(getQualifiedName(), aliased() ? this : null, null, condition); - } - - /** - * Create an inline derived table from this table - */ - @Override - public ActorInfo where(Collection<? extends Condition> conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public ActorInfo where(Condition... conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public ActorInfo where(Field<Boolean> condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public ActorInfo where(SQL condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public ActorInfo where(@Stringly.SQL String condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public ActorInfo where(@Stringly.SQL String condition, Object... binds) { - return where(DSL.condition(condition, binds)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public ActorInfo where(@Stringly.SQL String condition, QueryPart... parts) { - return where(DSL.condition(condition, parts)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public ActorInfo whereExists(Select<?> select) { - return where(DSL.exists(select)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public ActorInfo whereNotExists(Select<?> select) { - return where(DSL.notExists(select)); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Address.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Address.java deleted file mode 100644 index afa087f885..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Address.java +++ /dev/null @@ -1,365 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables; - - -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import no.sikt.graphitron.converters.ShortToIntegerConverter; -import no.sikt.graphitron.example.generated.jooq.Indexes; -import no.sikt.graphitron.example.generated.jooq.Keys; -import no.sikt.graphitron.example.generated.jooq.Public; -import no.sikt.graphitron.example.generated.jooq.tables.City.CityPath; -import no.sikt.graphitron.example.generated.jooq.tables.Customer.CustomerPath; -import no.sikt.graphitron.example.generated.jooq.tables.Staff.StaffPath; -import no.sikt.graphitron.example.generated.jooq.tables.Store.StorePath; -import no.sikt.graphitron.example.generated.jooq.tables.records.AddressRecord; - -import org.jooq.Condition; -import org.jooq.Field; -import org.jooq.ForeignKey; -import org.jooq.Identity; -import org.jooq.Index; -import org.jooq.InverseForeignKey; -import org.jooq.Name; -import org.jooq.Path; -import org.jooq.PlainSQL; -import org.jooq.QueryPart; -import org.jooq.Record; -import org.jooq.SQL; -import org.jooq.Schema; -import org.jooq.Select; -import org.jooq.Stringly; -import org.jooq.Table; -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.UniqueKey; -import org.jooq.impl.DSL; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class Address extends TableImpl<AddressRecord> { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>public.address</code> - */ - public static final Address ADDRESS = new Address(); - - /** - * The class holding records for this type - */ - @Override - public Class<AddressRecord> getRecordType() { - return AddressRecord.class; - } - - /** - * The column <code>public.address.address_id</code>. - */ - public final TableField<AddressRecord, Integer> ADDRESS_ID = createField(DSL.name("address_id"), SQLDataType.INTEGER.nullable(false).identity(true), this, ""); - - /** - * The column <code>public.address.address</code>. - */ - public final TableField<AddressRecord, String> ADDRESS_ = createField(DSL.name("address"), SQLDataType.VARCHAR(50).nullable(false), this, ""); - - /** - * The column <code>public.address.address2</code>. - */ - public final TableField<AddressRecord, String> ADDRESS2 = createField(DSL.name("address2"), SQLDataType.VARCHAR(50), this, ""); - - /** - * The column <code>public.address.district</code>. - */ - public final TableField<AddressRecord, String> DISTRICT = createField(DSL.name("district"), SQLDataType.VARCHAR(20).nullable(false), this, ""); - - /** - * The column <code>public.address.city_id</code>. - */ - public final TableField<AddressRecord, Integer> CITY_ID = createField(DSL.name("city_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.address.postal_code</code>. - */ - public final TableField<AddressRecord, String> POSTAL_CODE = createField(DSL.name("postal_code"), SQLDataType.VARCHAR(10), this, ""); - - /** - * The column <code>public.address.phone</code>. - */ - public final TableField<AddressRecord, String> PHONE = createField(DSL.name("phone"), SQLDataType.VARCHAR(20).nullable(false), this, ""); - - /** - * The column <code>public.address.last_update</code>. - */ - public final TableField<AddressRecord, LocalDateTime> LAST_UPDATE = createField(DSL.name("last_update"), SQLDataType.LOCALDATETIME(6).nullable(false).defaultValue(DSL.field(DSL.raw("now()"), SQLDataType.LOCALDATETIME)), this, ""); - - private Address(Name alias, Table<AddressRecord> aliased) { - this(alias, aliased, (Field<?>[]) null, null); - } - - private Address(Name alias, Table<AddressRecord> aliased, Field<?>[] parameters, Condition where) { - super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.table(), where); - } - - /** - * Create an aliased <code>public.address</code> table reference - */ - public Address(String alias) { - this(DSL.name(alias), ADDRESS); - } - - /** - * Create an aliased <code>public.address</code> table reference - */ - public Address(Name alias) { - this(alias, ADDRESS); - } - - /** - * Create a <code>public.address</code> table reference - */ - public Address() { - this(DSL.name("address"), null); - } - - public <O extends Record> Address(Table<O> path, ForeignKey<O, AddressRecord> childPath, InverseForeignKey<O, AddressRecord> parentPath) { - super(path, childPath, parentPath, ADDRESS); - } - - /** - * A subtype implementing {@link Path} for simplified path-based joins. - */ - public static class AddressPath extends Address implements Path<AddressRecord> { - - private static final long serialVersionUID = 1L; - public <O extends Record> AddressPath(Table<O> path, ForeignKey<O, AddressRecord> childPath, InverseForeignKey<O, AddressRecord> parentPath) { - super(path, childPath, parentPath); - } - private AddressPath(Name alias, Table<AddressRecord> aliased) { - super(alias, aliased); - } - - @Override - public AddressPath as(String alias) { - return new AddressPath(DSL.name(alias), this); - } - - @Override - public AddressPath as(Name alias) { - return new AddressPath(alias, this); - } - - @Override - public AddressPath as(Table<?> alias) { - return new AddressPath(alias.getQualifiedName(), this); - } - } - - @Override - public Schema getSchema() { - return aliased() ? null : Public.PUBLIC; - } - - @Override - public List<Index> getIndexes() { - return Arrays.asList(Indexes.IDX_FK_CITY_ID); - } - - @Override - public Identity<AddressRecord, Integer> getIdentity() { - return (Identity<AddressRecord, Integer>) super.getIdentity(); - } - - @Override - public UniqueKey<AddressRecord> getPrimaryKey() { - return Keys.ADDRESS_PKEY; - } - - @Override - public List<ForeignKey<AddressRecord, ?>> getReferences() { - return Arrays.asList(Keys.ADDRESS__ADDRESS_CITY_ID_FKEY); - } - - private transient CityPath _city; - - /** - * Get the implicit join path to the <code>public.city</code> table. - */ - public CityPath city() { - if (_city == null) - _city = new CityPath(this, Keys.ADDRESS__ADDRESS_CITY_ID_FKEY, null); - - return _city; - } - - private transient CustomerPath _customer; - - /** - * Get the implicit to-many join path to the <code>public.customer</code> - * table - */ - public CustomerPath customer() { - if (_customer == null) - _customer = new CustomerPath(this, null, Keys.CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY.getInverseKey()); - - return _customer; - } - - private transient StaffPath _staff; - - /** - * Get the implicit to-many join path to the <code>public.staff</code> table - */ - public StaffPath staff() { - if (_staff == null) - _staff = new StaffPath(this, null, Keys.STAFF__STAFF_ADDRESS_ID_FKEY.getInverseKey()); - - return _staff; - } - - private transient StorePath _store; - - /** - * Get the implicit to-many join path to the <code>public.store</code> table - */ - public StorePath store() { - if (_store == null) - _store = new StorePath(this, null, Keys.STORE__STORE_ADDRESS_ID_FKEY.getInverseKey()); - - return _store; - } - - @Override - public Address as(String alias) { - return new Address(DSL.name(alias), this); - } - - @Override - public Address as(Name alias) { - return new Address(alias, this); - } - - @Override - public Address as(Table<?> alias) { - return new Address(alias.getQualifiedName(), this); - } - - /** - * Rename this table - */ - @Override - public Address rename(String name) { - return new Address(DSL.name(name), null); - } - - /** - * Rename this table - */ - @Override - public Address rename(Name name) { - return new Address(name, null); - } - - /** - * Rename this table - */ - @Override - public Address rename(Table<?> name) { - return new Address(name.getQualifiedName(), null); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Address where(Condition condition) { - return new Address(getQualifiedName(), aliased() ? this : null, null, condition); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Address where(Collection<? extends Condition> conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Address where(Condition... conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Address where(Field<Boolean> condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Address where(SQL condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Address where(@Stringly.SQL String condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Address where(@Stringly.SQL String condition, Object... binds) { - return where(DSL.condition(condition, binds)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Address where(@Stringly.SQL String condition, QueryPart... parts) { - return where(DSL.condition(condition, parts)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Address whereExists(Select<?> select) { - return where(DSL.exists(select)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Address whereNotExists(Select<?> select) { - return where(DSL.notExists(select)); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Category.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Category.java deleted file mode 100644 index 14c10c2e0b..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Category.java +++ /dev/null @@ -1,295 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables; - - -import java.time.LocalDateTime; -import java.util.Collection; - -import no.sikt.graphitron.example.generated.jooq.Keys; -import no.sikt.graphitron.example.generated.jooq.Public; -import no.sikt.graphitron.example.generated.jooq.tables.Film.FilmPath; -import no.sikt.graphitron.example.generated.jooq.tables.FilmCategory.FilmCategoryPath; -import no.sikt.graphitron.example.generated.jooq.tables.records.CategoryRecord; - -import org.jooq.Condition; -import org.jooq.Field; -import org.jooq.ForeignKey; -import org.jooq.Identity; -import org.jooq.InverseForeignKey; -import org.jooq.Name; -import org.jooq.Path; -import org.jooq.PlainSQL; -import org.jooq.QueryPart; -import org.jooq.Record; -import org.jooq.SQL; -import org.jooq.Schema; -import org.jooq.Select; -import org.jooq.Stringly; -import org.jooq.Table; -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.UniqueKey; -import org.jooq.impl.DSL; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class Category extends TableImpl<CategoryRecord> { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>public.category</code> - */ - public static final Category CATEGORY = new Category(); - - /** - * The class holding records for this type - */ - @Override - public Class<CategoryRecord> getRecordType() { - return CategoryRecord.class; - } - - /** - * The column <code>public.category.category_id</code>. - */ - public final TableField<CategoryRecord, Integer> CATEGORY_ID = createField(DSL.name("category_id"), SQLDataType.INTEGER.nullable(false).identity(true), this, ""); - - /** - * The column <code>public.category.name</code>. - */ - public final TableField<CategoryRecord, String> NAME = createField(DSL.name("name"), SQLDataType.VARCHAR(25).nullable(false), this, ""); - - /** - * The column <code>public.category.last_update</code>. - */ - public final TableField<CategoryRecord, LocalDateTime> LAST_UPDATE = createField(DSL.name("last_update"), SQLDataType.LOCALDATETIME(6).nullable(false).defaultValue(DSL.field(DSL.raw("now()"), SQLDataType.LOCALDATETIME)), this, ""); - - private Category(Name alias, Table<CategoryRecord> aliased) { - this(alias, aliased, (Field<?>[]) null, null); - } - - private Category(Name alias, Table<CategoryRecord> aliased, Field<?>[] parameters, Condition where) { - super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.table(), where); - } - - /** - * Create an aliased <code>public.category</code> table reference - */ - public Category(String alias) { - this(DSL.name(alias), CATEGORY); - } - - /** - * Create an aliased <code>public.category</code> table reference - */ - public Category(Name alias) { - this(alias, CATEGORY); - } - - /** - * Create a <code>public.category</code> table reference - */ - public Category() { - this(DSL.name("category"), null); - } - - public <O extends Record> Category(Table<O> path, ForeignKey<O, CategoryRecord> childPath, InverseForeignKey<O, CategoryRecord> parentPath) { - super(path, childPath, parentPath, CATEGORY); - } - - /** - * A subtype implementing {@link Path} for simplified path-based joins. - */ - public static class CategoryPath extends Category implements Path<CategoryRecord> { - - private static final long serialVersionUID = 1L; - public <O extends Record> CategoryPath(Table<O> path, ForeignKey<O, CategoryRecord> childPath, InverseForeignKey<O, CategoryRecord> parentPath) { - super(path, childPath, parentPath); - } - private CategoryPath(Name alias, Table<CategoryRecord> aliased) { - super(alias, aliased); - } - - @Override - public CategoryPath as(String alias) { - return new CategoryPath(DSL.name(alias), this); - } - - @Override - public CategoryPath as(Name alias) { - return new CategoryPath(alias, this); - } - - @Override - public CategoryPath as(Table<?> alias) { - return new CategoryPath(alias.getQualifiedName(), this); - } - } - - @Override - public Schema getSchema() { - return aliased() ? null : Public.PUBLIC; - } - - @Override - public Identity<CategoryRecord, Integer> getIdentity() { - return (Identity<CategoryRecord, Integer>) super.getIdentity(); - } - - @Override - public UniqueKey<CategoryRecord> getPrimaryKey() { - return Keys.CATEGORY_PKEY; - } - - private transient FilmCategoryPath _filmCategory; - - /** - * Get the implicit to-many join path to the - * <code>public.film_category</code> table - */ - public FilmCategoryPath filmCategory() { - if (_filmCategory == null) - _filmCategory = new FilmCategoryPath(this, null, Keys.FILM_CATEGORY__FILM_CATEGORY_CATEGORY_ID_FKEY.getInverseKey()); - - return _filmCategory; - } - - /** - * Get the implicit many-to-many join path to the <code>public.film</code> - * table - */ - public FilmPath film() { - return filmCategory().film(); - } - - @Override - public Category as(String alias) { - return new Category(DSL.name(alias), this); - } - - @Override - public Category as(Name alias) { - return new Category(alias, this); - } - - @Override - public Category as(Table<?> alias) { - return new Category(alias.getQualifiedName(), this); - } - - /** - * Rename this table - */ - @Override - public Category rename(String name) { - return new Category(DSL.name(name), null); - } - - /** - * Rename this table - */ - @Override - public Category rename(Name name) { - return new Category(name, null); - } - - /** - * Rename this table - */ - @Override - public Category rename(Table<?> name) { - return new Category(name.getQualifiedName(), null); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Category where(Condition condition) { - return new Category(getQualifiedName(), aliased() ? this : null, null, condition); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Category where(Collection<? extends Condition> conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Category where(Condition... conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Category where(Field<Boolean> condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Category where(SQL condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Category where(@Stringly.SQL String condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Category where(@Stringly.SQL String condition, Object... binds) { - return where(DSL.condition(condition, binds)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Category where(@Stringly.SQL String condition, QueryPart... parts) { - return where(DSL.condition(condition, parts)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Category whereExists(Select<?> select) { - return where(DSL.exists(select)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Category whereNotExists(Select<?> select) { - return where(DSL.notExists(select)); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/City.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/City.java deleted file mode 100644 index e0baf4e37b..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/City.java +++ /dev/null @@ -1,319 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables; - - -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import no.sikt.graphitron.converters.ShortToIntegerConverter; -import no.sikt.graphitron.example.generated.jooq.Indexes; -import no.sikt.graphitron.example.generated.jooq.Keys; -import no.sikt.graphitron.example.generated.jooq.Public; -import no.sikt.graphitron.example.generated.jooq.tables.Address.AddressPath; -import no.sikt.graphitron.example.generated.jooq.tables.Country.CountryPath; -import no.sikt.graphitron.example.generated.jooq.tables.records.CityRecord; - -import org.jooq.Condition; -import org.jooq.Field; -import org.jooq.ForeignKey; -import org.jooq.Identity; -import org.jooq.Index; -import org.jooq.InverseForeignKey; -import org.jooq.Name; -import org.jooq.Path; -import org.jooq.PlainSQL; -import org.jooq.QueryPart; -import org.jooq.Record; -import org.jooq.SQL; -import org.jooq.Schema; -import org.jooq.Select; -import org.jooq.Stringly; -import org.jooq.Table; -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.UniqueKey; -import org.jooq.impl.DSL; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class City extends TableImpl<CityRecord> { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>public.city</code> - */ - public static final City CITY = new City(); - - /** - * The class holding records for this type - */ - @Override - public Class<CityRecord> getRecordType() { - return CityRecord.class; - } - - /** - * The column <code>public.city.city_id</code>. - */ - public final TableField<CityRecord, Integer> CITY_ID = createField(DSL.name("city_id"), SQLDataType.INTEGER.nullable(false).identity(true), this, ""); - - /** - * The column <code>public.city.city</code>. - */ - public final TableField<CityRecord, String> CITY_ = createField(DSL.name("city"), SQLDataType.VARCHAR(50).nullable(false), this, ""); - - /** - * The column <code>public.city.country_id</code>. - */ - public final TableField<CityRecord, Integer> COUNTRY_ID = createField(DSL.name("country_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.city.last_update</code>. - */ - public final TableField<CityRecord, LocalDateTime> LAST_UPDATE = createField(DSL.name("last_update"), SQLDataType.LOCALDATETIME(6).nullable(false).defaultValue(DSL.field(DSL.raw("now()"), SQLDataType.LOCALDATETIME)), this, ""); - - private City(Name alias, Table<CityRecord> aliased) { - this(alias, aliased, (Field<?>[]) null, null); - } - - private City(Name alias, Table<CityRecord> aliased, Field<?>[] parameters, Condition where) { - super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.table(), where); - } - - /** - * Create an aliased <code>public.city</code> table reference - */ - public City(String alias) { - this(DSL.name(alias), CITY); - } - - /** - * Create an aliased <code>public.city</code> table reference - */ - public City(Name alias) { - this(alias, CITY); - } - - /** - * Create a <code>public.city</code> table reference - */ - public City() { - this(DSL.name("city"), null); - } - - public <O extends Record> City(Table<O> path, ForeignKey<O, CityRecord> childPath, InverseForeignKey<O, CityRecord> parentPath) { - super(path, childPath, parentPath, CITY); - } - - /** - * A subtype implementing {@link Path} for simplified path-based joins. - */ - public static class CityPath extends City implements Path<CityRecord> { - - private static final long serialVersionUID = 1L; - public <O extends Record> CityPath(Table<O> path, ForeignKey<O, CityRecord> childPath, InverseForeignKey<O, CityRecord> parentPath) { - super(path, childPath, parentPath); - } - private CityPath(Name alias, Table<CityRecord> aliased) { - super(alias, aliased); - } - - @Override - public CityPath as(String alias) { - return new CityPath(DSL.name(alias), this); - } - - @Override - public CityPath as(Name alias) { - return new CityPath(alias, this); - } - - @Override - public CityPath as(Table<?> alias) { - return new CityPath(alias.getQualifiedName(), this); - } - } - - @Override - public Schema getSchema() { - return aliased() ? null : Public.PUBLIC; - } - - @Override - public List<Index> getIndexes() { - return Arrays.asList(Indexes.IDX_FK_COUNTRY_ID); - } - - @Override - public Identity<CityRecord, Integer> getIdentity() { - return (Identity<CityRecord, Integer>) super.getIdentity(); - } - - @Override - public UniqueKey<CityRecord> getPrimaryKey() { - return Keys.CITY_PKEY; - } - - @Override - public List<ForeignKey<CityRecord, ?>> getReferences() { - return Arrays.asList(Keys.CITY__CITY_COUNTRY_ID_FKEY); - } - - private transient CountryPath _country; - - /** - * Get the implicit join path to the <code>public.country</code> table. - */ - public CountryPath country() { - if (_country == null) - _country = new CountryPath(this, Keys.CITY__CITY_COUNTRY_ID_FKEY, null); - - return _country; - } - - private transient AddressPath _address; - - /** - * Get the implicit to-many join path to the <code>public.address</code> - * table - */ - public AddressPath address() { - if (_address == null) - _address = new AddressPath(this, null, Keys.ADDRESS__ADDRESS_CITY_ID_FKEY.getInverseKey()); - - return _address; - } - - @Override - public City as(String alias) { - return new City(DSL.name(alias), this); - } - - @Override - public City as(Name alias) { - return new City(alias, this); - } - - @Override - public City as(Table<?> alias) { - return new City(alias.getQualifiedName(), this); - } - - /** - * Rename this table - */ - @Override - public City rename(String name) { - return new City(DSL.name(name), null); - } - - /** - * Rename this table - */ - @Override - public City rename(Name name) { - return new City(name, null); - } - - /** - * Rename this table - */ - @Override - public City rename(Table<?> name) { - return new City(name.getQualifiedName(), null); - } - - /** - * Create an inline derived table from this table - */ - @Override - public City where(Condition condition) { - return new City(getQualifiedName(), aliased() ? this : null, null, condition); - } - - /** - * Create an inline derived table from this table - */ - @Override - public City where(Collection<? extends Condition> conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public City where(Condition... conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public City where(Field<Boolean> condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public City where(SQL condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public City where(@Stringly.SQL String condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public City where(@Stringly.SQL String condition, Object... binds) { - return where(DSL.condition(condition, binds)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public City where(@Stringly.SQL String condition, QueryPart... parts) { - return where(DSL.condition(condition, parts)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public City whereExists(Select<?> select) { - return where(DSL.exists(select)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public City whereNotExists(Select<?> select) { - return where(DSL.notExists(select)); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Country.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Country.java deleted file mode 100644 index 6b7a22b799..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Country.java +++ /dev/null @@ -1,285 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables; - - -import java.time.LocalDateTime; -import java.util.Collection; - -import no.sikt.graphitron.example.generated.jooq.Keys; -import no.sikt.graphitron.example.generated.jooq.Public; -import no.sikt.graphitron.example.generated.jooq.tables.City.CityPath; -import no.sikt.graphitron.example.generated.jooq.tables.records.CountryRecord; - -import org.jooq.Condition; -import org.jooq.Field; -import org.jooq.ForeignKey; -import org.jooq.Identity; -import org.jooq.InverseForeignKey; -import org.jooq.Name; -import org.jooq.Path; -import org.jooq.PlainSQL; -import org.jooq.QueryPart; -import org.jooq.Record; -import org.jooq.SQL; -import org.jooq.Schema; -import org.jooq.Select; -import org.jooq.Stringly; -import org.jooq.Table; -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.UniqueKey; -import org.jooq.impl.DSL; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class Country extends TableImpl<CountryRecord> { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>public.country</code> - */ - public static final Country COUNTRY = new Country(); - - /** - * The class holding records for this type - */ - @Override - public Class<CountryRecord> getRecordType() { - return CountryRecord.class; - } - - /** - * The column <code>public.country.country_id</code>. - */ - public final TableField<CountryRecord, Integer> COUNTRY_ID = createField(DSL.name("country_id"), SQLDataType.INTEGER.nullable(false).identity(true), this, ""); - - /** - * The column <code>public.country.country</code>. - */ - public final TableField<CountryRecord, String> COUNTRY_ = createField(DSL.name("country"), SQLDataType.VARCHAR(50).nullable(false), this, ""); - - /** - * The column <code>public.country.last_update</code>. - */ - public final TableField<CountryRecord, LocalDateTime> LAST_UPDATE = createField(DSL.name("last_update"), SQLDataType.LOCALDATETIME(6).nullable(false).defaultValue(DSL.field(DSL.raw("now()"), SQLDataType.LOCALDATETIME)), this, ""); - - private Country(Name alias, Table<CountryRecord> aliased) { - this(alias, aliased, (Field<?>[]) null, null); - } - - private Country(Name alias, Table<CountryRecord> aliased, Field<?>[] parameters, Condition where) { - super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.table(), where); - } - - /** - * Create an aliased <code>public.country</code> table reference - */ - public Country(String alias) { - this(DSL.name(alias), COUNTRY); - } - - /** - * Create an aliased <code>public.country</code> table reference - */ - public Country(Name alias) { - this(alias, COUNTRY); - } - - /** - * Create a <code>public.country</code> table reference - */ - public Country() { - this(DSL.name("country"), null); - } - - public <O extends Record> Country(Table<O> path, ForeignKey<O, CountryRecord> childPath, InverseForeignKey<O, CountryRecord> parentPath) { - super(path, childPath, parentPath, COUNTRY); - } - - /** - * A subtype implementing {@link Path} for simplified path-based joins. - */ - public static class CountryPath extends Country implements Path<CountryRecord> { - - private static final long serialVersionUID = 1L; - public <O extends Record> CountryPath(Table<O> path, ForeignKey<O, CountryRecord> childPath, InverseForeignKey<O, CountryRecord> parentPath) { - super(path, childPath, parentPath); - } - private CountryPath(Name alias, Table<CountryRecord> aliased) { - super(alias, aliased); - } - - @Override - public CountryPath as(String alias) { - return new CountryPath(DSL.name(alias), this); - } - - @Override - public CountryPath as(Name alias) { - return new CountryPath(alias, this); - } - - @Override - public CountryPath as(Table<?> alias) { - return new CountryPath(alias.getQualifiedName(), this); - } - } - - @Override - public Schema getSchema() { - return aliased() ? null : Public.PUBLIC; - } - - @Override - public Identity<CountryRecord, Integer> getIdentity() { - return (Identity<CountryRecord, Integer>) super.getIdentity(); - } - - @Override - public UniqueKey<CountryRecord> getPrimaryKey() { - return Keys.COUNTRY_PKEY; - } - - private transient CityPath _city; - - /** - * Get the implicit to-many join path to the <code>public.city</code> table - */ - public CityPath city() { - if (_city == null) - _city = new CityPath(this, null, Keys.CITY__CITY_COUNTRY_ID_FKEY.getInverseKey()); - - return _city; - } - - @Override - public Country as(String alias) { - return new Country(DSL.name(alias), this); - } - - @Override - public Country as(Name alias) { - return new Country(alias, this); - } - - @Override - public Country as(Table<?> alias) { - return new Country(alias.getQualifiedName(), this); - } - - /** - * Rename this table - */ - @Override - public Country rename(String name) { - return new Country(DSL.name(name), null); - } - - /** - * Rename this table - */ - @Override - public Country rename(Name name) { - return new Country(name, null); - } - - /** - * Rename this table - */ - @Override - public Country rename(Table<?> name) { - return new Country(name.getQualifiedName(), null); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Country where(Condition condition) { - return new Country(getQualifiedName(), aliased() ? this : null, null, condition); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Country where(Collection<? extends Condition> conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Country where(Condition... conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Country where(Field<Boolean> condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Country where(SQL condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Country where(@Stringly.SQL String condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Country where(@Stringly.SQL String condition, Object... binds) { - return where(DSL.condition(condition, binds)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Country where(@Stringly.SQL String condition, QueryPart... parts) { - return where(DSL.condition(condition, parts)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Country whereExists(Select<?> select) { - return where(DSL.exists(select)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Country whereNotExists(Select<?> select) { - return where(DSL.notExists(select)); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Customer.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Customer.java deleted file mode 100644 index 9d558fec67..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Customer.java +++ /dev/null @@ -1,471 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables; - - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import no.sikt.graphitron.converters.ShortToIntegerConverter; -import no.sikt.graphitron.example.generated.jooq.Indexes; -import no.sikt.graphitron.example.generated.jooq.Keys; -import no.sikt.graphitron.example.generated.jooq.Public; -import no.sikt.graphitron.example.generated.jooq.tables.Address.AddressPath; -import no.sikt.graphitron.example.generated.jooq.tables.Payment.PaymentPath; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_01.PaymentP2007_01Path; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_02.PaymentP2007_02Path; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_03.PaymentP2007_03Path; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_04.PaymentP2007_04Path; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_05.PaymentP2007_05Path; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_06.PaymentP2007_06Path; -import no.sikt.graphitron.example.generated.jooq.tables.Rental.RentalPath; -import no.sikt.graphitron.example.generated.jooq.tables.Store.StorePath; -import no.sikt.graphitron.example.generated.jooq.tables.records.CustomerRecord; - -import org.jooq.Condition; -import org.jooq.Field; -import org.jooq.ForeignKey; -import org.jooq.Identity; -import org.jooq.Index; -import org.jooq.InverseForeignKey; -import org.jooq.Name; -import org.jooq.Path; -import org.jooq.PlainSQL; -import org.jooq.QueryPart; -import org.jooq.Record; -import org.jooq.SQL; -import org.jooq.Schema; -import org.jooq.Select; -import org.jooq.Stringly; -import org.jooq.Table; -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.UniqueKey; -import org.jooq.impl.DSL; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class Customer extends TableImpl<CustomerRecord> { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>public.customer</code> - */ - public static final Customer CUSTOMER = new Customer(); - - /** - * The class holding records for this type - */ - @Override - public Class<CustomerRecord> getRecordType() { - return CustomerRecord.class; - } - - /** - * The column <code>public.customer.customer_id</code>. - */ - public final TableField<CustomerRecord, Integer> CUSTOMER_ID = createField(DSL.name("customer_id"), SQLDataType.INTEGER.nullable(false).identity(true), this, ""); - - /** - * The column <code>public.customer.store_id</code>. - */ - public final TableField<CustomerRecord, Integer> STORE_ID = createField(DSL.name("store_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.customer.first_name</code>. - */ - public final TableField<CustomerRecord, String> FIRST_NAME = createField(DSL.name("first_name"), SQLDataType.VARCHAR(45).nullable(false), this, ""); - - /** - * The column <code>public.customer.last_name</code>. - */ - public final TableField<CustomerRecord, String> LAST_NAME = createField(DSL.name("last_name"), SQLDataType.VARCHAR(45).nullable(false), this, ""); - - /** - * The column <code>public.customer.email</code>. - */ - public final TableField<CustomerRecord, String> EMAIL = createField(DSL.name("email"), SQLDataType.VARCHAR(50), this, ""); - - /** - * The column <code>public.customer.address_id</code>. - */ - public final TableField<CustomerRecord, Integer> ADDRESS_ID = createField(DSL.name("address_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.customer.activebool</code>. - */ - public final TableField<CustomerRecord, Boolean> ACTIVEBOOL = createField(DSL.name("activebool"), SQLDataType.BOOLEAN.nullable(false).defaultValue(DSL.field(DSL.raw("true"), SQLDataType.BOOLEAN)), this, ""); - - /** - * The column <code>public.customer.create_date</code>. - */ - public final TableField<CustomerRecord, LocalDate> CREATE_DATE = createField(DSL.name("create_date"), SQLDataType.LOCALDATE.nullable(false).defaultValue(DSL.field(DSL.raw("('now'::text)::date"), SQLDataType.LOCALDATE)), this, ""); - - /** - * The column <code>public.customer.last_update</code>. - */ - public final TableField<CustomerRecord, LocalDateTime> LAST_UPDATE = createField(DSL.name("last_update"), SQLDataType.LOCALDATETIME(6).defaultValue(DSL.field(DSL.raw("now()"), SQLDataType.LOCALDATETIME)), this, ""); - - /** - * The column <code>public.customer.active</code>. - */ - public final TableField<CustomerRecord, Integer> ACTIVE = createField(DSL.name("active"), SQLDataType.INTEGER, this, ""); - - /** - * The column <code>public.customer.usernames</code>. - */ - public final TableField<CustomerRecord, String[]> USERNAMES = createField(DSL.name("usernames"), SQLDataType.CLOB.array(), this, ""); - - /** - * The column <code>public.customer.past_address_ids</code>. - */ - public final TableField<CustomerRecord, Integer[]> PAST_ADDRESS_IDS = createField(DSL.name("past_address_ids"), SQLDataType.INTEGER.array(), this, ""); - - private Customer(Name alias, Table<CustomerRecord> aliased) { - this(alias, aliased, (Field<?>[]) null, null); - } - - private Customer(Name alias, Table<CustomerRecord> aliased, Field<?>[] parameters, Condition where) { - super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.table(), where); - } - - /** - * Create an aliased <code>public.customer</code> table reference - */ - public Customer(String alias) { - this(DSL.name(alias), CUSTOMER); - } - - /** - * Create an aliased <code>public.customer</code> table reference - */ - public Customer(Name alias) { - this(alias, CUSTOMER); - } - - /** - * Create a <code>public.customer</code> table reference - */ - public Customer() { - this(DSL.name("customer"), null); - } - - public <O extends Record> Customer(Table<O> path, ForeignKey<O, CustomerRecord> childPath, InverseForeignKey<O, CustomerRecord> parentPath) { - super(path, childPath, parentPath, CUSTOMER); - } - - /** - * A subtype implementing {@link Path} for simplified path-based joins. - */ - public static class CustomerPath extends Customer implements Path<CustomerRecord> { - - private static final long serialVersionUID = 1L; - public <O extends Record> CustomerPath(Table<O> path, ForeignKey<O, CustomerRecord> childPath, InverseForeignKey<O, CustomerRecord> parentPath) { - super(path, childPath, parentPath); - } - private CustomerPath(Name alias, Table<CustomerRecord> aliased) { - super(alias, aliased); - } - - @Override - public CustomerPath as(String alias) { - return new CustomerPath(DSL.name(alias), this); - } - - @Override - public CustomerPath as(Name alias) { - return new CustomerPath(alias, this); - } - - @Override - public CustomerPath as(Table<?> alias) { - return new CustomerPath(alias.getQualifiedName(), this); - } - } - - @Override - public Schema getSchema() { - return aliased() ? null : Public.PUBLIC; - } - - @Override - public List<Index> getIndexes() { - return Arrays.asList(Indexes.IDX_FK_ADDRESS_ID, Indexes.IDX_FK_STORE_ID, Indexes.IDX_LAST_NAME); - } - - @Override - public Identity<CustomerRecord, Integer> getIdentity() { - return (Identity<CustomerRecord, Integer>) super.getIdentity(); - } - - @Override - public UniqueKey<CustomerRecord> getPrimaryKey() { - return Keys.CUSTOMER_PKEY; - } - - @Override - public List<ForeignKey<CustomerRecord, ?>> getReferences() { - return Arrays.asList(Keys.CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY, Keys.CUSTOMER__CUSTOMER_STORE_ID_FKEY); - } - - private transient AddressPath _address; - - /** - * Get the implicit join path to the <code>public.address</code> table. - */ - public AddressPath address() { - if (_address == null) - _address = new AddressPath(this, Keys.CUSTOMER__CUSTOMER_ADDRESS_ID_FKEY, null); - - return _address; - } - - private transient StorePath _store; - - /** - * Get the implicit join path to the <code>public.store</code> table. - */ - public StorePath store() { - if (_store == null) - _store = new StorePath(this, Keys.CUSTOMER__CUSTOMER_STORE_ID_FKEY, null); - - return _store; - } - - private transient PaymentPath _payment; - - /** - * Get the implicit to-many join path to the <code>public.payment</code> - * table - */ - public PaymentPath payment() { - if (_payment == null) - _payment = new PaymentPath(this, null, Keys.PAYMENT__PAYMENT_CUSTOMER_ID_FKEY.getInverseKey()); - - return _payment; - } - - private transient PaymentP2007_01Path _paymentP2007_01; - - /** - * Get the implicit to-many join path to the - * <code>public.payment_p2007_01</code> table - */ - public PaymentP2007_01Path paymentP2007_01() { - if (_paymentP2007_01 == null) - _paymentP2007_01 = new PaymentP2007_01Path(this, null, Keys.PAYMENT_P2007_01__PAYMENT_P2007_01_CUSTOMER_ID_FKEY.getInverseKey()); - - return _paymentP2007_01; - } - - private transient PaymentP2007_02Path _paymentP2007_02; - - /** - * Get the implicit to-many join path to the - * <code>public.payment_p2007_02</code> table - */ - public PaymentP2007_02Path paymentP2007_02() { - if (_paymentP2007_02 == null) - _paymentP2007_02 = new PaymentP2007_02Path(this, null, Keys.PAYMENT_P2007_02__PAYMENT_P2007_02_CUSTOMER_ID_FKEY.getInverseKey()); - - return _paymentP2007_02; - } - - private transient PaymentP2007_03Path _paymentP2007_03; - - /** - * Get the implicit to-many join path to the - * <code>public.payment_p2007_03</code> table - */ - public PaymentP2007_03Path paymentP2007_03() { - if (_paymentP2007_03 == null) - _paymentP2007_03 = new PaymentP2007_03Path(this, null, Keys.PAYMENT_P2007_03__PAYMENT_P2007_03_CUSTOMER_ID_FKEY.getInverseKey()); - - return _paymentP2007_03; - } - - private transient PaymentP2007_04Path _paymentP2007_04; - - /** - * Get the implicit to-many join path to the - * <code>public.payment_p2007_04</code> table - */ - public PaymentP2007_04Path paymentP2007_04() { - if (_paymentP2007_04 == null) - _paymentP2007_04 = new PaymentP2007_04Path(this, null, Keys.PAYMENT_P2007_04__PAYMENT_P2007_04_CUSTOMER_ID_FKEY.getInverseKey()); - - return _paymentP2007_04; - } - - private transient PaymentP2007_05Path _paymentP2007_05; - - /** - * Get the implicit to-many join path to the - * <code>public.payment_p2007_05</code> table - */ - public PaymentP2007_05Path paymentP2007_05() { - if (_paymentP2007_05 == null) - _paymentP2007_05 = new PaymentP2007_05Path(this, null, Keys.PAYMENT_P2007_05__PAYMENT_P2007_05_CUSTOMER_ID_FKEY.getInverseKey()); - - return _paymentP2007_05; - } - - private transient PaymentP2007_06Path _paymentP2007_06; - - /** - * Get the implicit to-many join path to the - * <code>public.payment_p2007_06</code> table - */ - public PaymentP2007_06Path paymentP2007_06() { - if (_paymentP2007_06 == null) - _paymentP2007_06 = new PaymentP2007_06Path(this, null, Keys.PAYMENT_P2007_06__PAYMENT_P2007_06_CUSTOMER_ID_FKEY.getInverseKey()); - - return _paymentP2007_06; - } - - private transient RentalPath _rental; - - /** - * Get the implicit to-many join path to the <code>public.rental</code> - * table - */ - public RentalPath rental() { - if (_rental == null) - _rental = new RentalPath(this, null, Keys.RENTAL__RENTAL_CUSTOMER_ID_FKEY.getInverseKey()); - - return _rental; - } - - @Override - public Customer as(String alias) { - return new Customer(DSL.name(alias), this); - } - - @Override - public Customer as(Name alias) { - return new Customer(alias, this); - } - - @Override - public Customer as(Table<?> alias) { - return new Customer(alias.getQualifiedName(), this); - } - - /** - * Rename this table - */ - @Override - public Customer rename(String name) { - return new Customer(DSL.name(name), null); - } - - /** - * Rename this table - */ - @Override - public Customer rename(Name name) { - return new Customer(name, null); - } - - /** - * Rename this table - */ - @Override - public Customer rename(Table<?> name) { - return new Customer(name.getQualifiedName(), null); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Customer where(Condition condition) { - return new Customer(getQualifiedName(), aliased() ? this : null, null, condition); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Customer where(Collection<? extends Condition> conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Customer where(Condition... conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Customer where(Field<Boolean> condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Customer where(SQL condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Customer where(@Stringly.SQL String condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Customer where(@Stringly.SQL String condition, Object... binds) { - return where(DSL.condition(condition, binds)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Customer where(@Stringly.SQL String condition, QueryPart... parts) { - return where(DSL.condition(condition, parts)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Customer whereExists(Select<?> select) { - return where(DSL.exists(select)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Customer whereNotExists(Select<?> select) { - return where(DSL.notExists(select)); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/CustomerList.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/CustomerList.java deleted file mode 100644 index f0e5e51c3f..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/CustomerList.java +++ /dev/null @@ -1,269 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables; - - -import java.util.Collection; - -import no.sikt.graphitron.converters.ShortToIntegerConverter; -import no.sikt.graphitron.example.generated.jooq.Public; -import no.sikt.graphitron.example.generated.jooq.tables.records.CustomerListRecord; - -import org.jooq.Condition; -import org.jooq.Field; -import org.jooq.Name; -import org.jooq.PlainSQL; -import org.jooq.QueryPart; -import org.jooq.SQL; -import org.jooq.Schema; -import org.jooq.Select; -import org.jooq.Stringly; -import org.jooq.Table; -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.impl.DSL; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class CustomerList extends TableImpl<CustomerListRecord> { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>public.customer_list</code> - */ - public static final CustomerList CUSTOMER_LIST = new CustomerList(); - - /** - * The class holding records for this type - */ - @Override - public Class<CustomerListRecord> getRecordType() { - return CustomerListRecord.class; - } - - /** - * The column <code>public.customer_list.id</code>. - */ - public final TableField<CustomerListRecord, Integer> ID = createField(DSL.name("id"), SQLDataType.INTEGER, this, ""); - - /** - * The column <code>public.customer_list.name</code>. - */ - public final TableField<CustomerListRecord, String> NAME = createField(DSL.name("name"), SQLDataType.CLOB, this, ""); - - /** - * The column <code>public.customer_list.address</code>. - */ - public final TableField<CustomerListRecord, String> ADDRESS = createField(DSL.name("address"), SQLDataType.VARCHAR(50), this, ""); - - /** - * The column <code>public.customer_list.zip code</code>. - */ - public final TableField<CustomerListRecord, String> ZIP_CODE = createField(DSL.name("zip code"), SQLDataType.VARCHAR(10), this, ""); - - /** - * The column <code>public.customer_list.phone</code>. - */ - public final TableField<CustomerListRecord, String> PHONE = createField(DSL.name("phone"), SQLDataType.VARCHAR(20), this, ""); - - /** - * The column <code>public.customer_list.city</code>. - */ - public final TableField<CustomerListRecord, String> CITY = createField(DSL.name("city"), SQLDataType.VARCHAR(50), this, ""); - - /** - * The column <code>public.customer_list.country</code>. - */ - public final TableField<CustomerListRecord, String> COUNTRY = createField(DSL.name("country"), SQLDataType.VARCHAR(50), this, ""); - - /** - * The column <code>public.customer_list.notes</code>. - */ - public final TableField<CustomerListRecord, String> NOTES = createField(DSL.name("notes"), SQLDataType.CLOB, this, ""); - - /** - * The column <code>public.customer_list.sid</code>. - */ - public final TableField<CustomerListRecord, Integer> SID = createField(DSL.name("sid"), SQLDataType.SMALLINT, this, "", new ShortToIntegerConverter()); - - private CustomerList(Name alias, Table<CustomerListRecord> aliased) { - this(alias, aliased, (Field<?>[]) null, null); - } - - private CustomerList(Name alias, Table<CustomerListRecord> aliased, Field<?>[] parameters, Condition where) { - super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.view(""" - CREATE VIEW "customer_list" AS SELECT cu.customer_id AS id, - (((cu.first_name)::text || ' '::text) || (cu.last_name)::text) AS name, - a.address, - a.postal_code AS "zip code", - a.phone, - city.city, - country.country, - CASE - WHEN cu.activebool THEN 'active'::text - ELSE ''::text - END AS notes, - cu.store_id AS sid - FROM (((customer cu - JOIN address a ON ((cu.address_id = a.address_id))) - JOIN city ON ((a.city_id = city.city_id))) - JOIN country ON ((city.country_id = country.country_id))); - """), where); - } - - /** - * Create an aliased <code>public.customer_list</code> table reference - */ - public CustomerList(String alias) { - this(DSL.name(alias), CUSTOMER_LIST); - } - - /** - * Create an aliased <code>public.customer_list</code> table reference - */ - public CustomerList(Name alias) { - this(alias, CUSTOMER_LIST); - } - - /** - * Create a <code>public.customer_list</code> table reference - */ - public CustomerList() { - this(DSL.name("customer_list"), null); - } - - @Override - public Schema getSchema() { - return aliased() ? null : Public.PUBLIC; - } - - @Override - public CustomerList as(String alias) { - return new CustomerList(DSL.name(alias), this); - } - - @Override - public CustomerList as(Name alias) { - return new CustomerList(alias, this); - } - - @Override - public CustomerList as(Table<?> alias) { - return new CustomerList(alias.getQualifiedName(), this); - } - - /** - * Rename this table - */ - @Override - public CustomerList rename(String name) { - return new CustomerList(DSL.name(name), null); - } - - /** - * Rename this table - */ - @Override - public CustomerList rename(Name name) { - return new CustomerList(name, null); - } - - /** - * Rename this table - */ - @Override - public CustomerList rename(Table<?> name) { - return new CustomerList(name.getQualifiedName(), null); - } - - /** - * Create an inline derived table from this table - */ - @Override - public CustomerList where(Condition condition) { - return new CustomerList(getQualifiedName(), aliased() ? this : null, null, condition); - } - - /** - * Create an inline derived table from this table - */ - @Override - public CustomerList where(Collection<? extends Condition> conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public CustomerList where(Condition... conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public CustomerList where(Field<Boolean> condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public CustomerList where(SQL condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public CustomerList where(@Stringly.SQL String condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public CustomerList where(@Stringly.SQL String condition, Object... binds) { - return where(DSL.condition(condition, binds)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public CustomerList where(@Stringly.SQL String condition, QueryPart... parts) { - return where(DSL.condition(condition, parts)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public CustomerList whereExists(Select<?> select) { - return where(DSL.exists(select)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public CustomerList whereNotExists(Select<?> select) { - return where(DSL.notExists(select)); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Film.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Film.java deleted file mode 100644 index 5e6532e1c9..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Film.java +++ /dev/null @@ -1,458 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables; - - -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import no.sikt.graphitron.converters.ShortToIntegerConverter; -import no.sikt.graphitron.example.generated.jooq.Domains; -import no.sikt.graphitron.example.generated.jooq.Indexes; -import no.sikt.graphitron.example.generated.jooq.Keys; -import no.sikt.graphitron.example.generated.jooq.Public; -import no.sikt.graphitron.example.generated.jooq.enums.MpaaRating; -import no.sikt.graphitron.example.generated.jooq.tables.Actor.ActorPath; -import no.sikt.graphitron.example.generated.jooq.tables.Category.CategoryPath; -import no.sikt.graphitron.example.generated.jooq.tables.Film.FilmPath; -import no.sikt.graphitron.example.generated.jooq.tables.FilmActor.FilmActorPath; -import no.sikt.graphitron.example.generated.jooq.tables.FilmCategory.FilmCategoryPath; -import no.sikt.graphitron.example.generated.jooq.tables.Inventory.InventoryPath; -import no.sikt.graphitron.example.generated.jooq.tables.Language.LanguagePath; -import no.sikt.graphitron.example.generated.jooq.tables.records.FilmRecord; - -import org.jooq.Condition; -import org.jooq.Converter; -import org.jooq.Field; -import org.jooq.ForeignKey; -import org.jooq.Identity; -import org.jooq.Index; -import org.jooq.InverseForeignKey; -import org.jooq.Name; -import org.jooq.Path; -import org.jooq.PlainSQL; -import org.jooq.QueryPart; -import org.jooq.Record; -import org.jooq.SQL; -import org.jooq.Schema; -import org.jooq.Select; -import org.jooq.Stringly; -import org.jooq.Table; -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.UniqueKey; -import org.jooq.impl.DSL; -import org.jooq.impl.DefaultDataType; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class Film extends TableImpl<FilmRecord> { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>public.film</code> - */ - public static final Film FILM = new Film(); - - /** - * The class holding records for this type - */ - @Override - public Class<FilmRecord> getRecordType() { - return FilmRecord.class; - } - - /** - * The column <code>public.film.film_id</code>. - */ - public final TableField<FilmRecord, String> FILM_ID = createField(DSL.name("film_id"), SQLDataType.INTEGER.nullable(false).identity(true), this, "", Converter.ofNullable(Integer.class, String.class, t -> Integer.toString(t), u -> Integer.valueOf(u))); - - /** - * The column <code>public.film.title</code>. - */ - public final TableField<FilmRecord, String> TITLE = createField(DSL.name("title"), SQLDataType.VARCHAR(255).nullable(false), this, ""); - - /** - * The column <code>public.film.description</code>. - */ - public final TableField<FilmRecord, String> DESCRIPTION = createField(DSL.name("description"), SQLDataType.CLOB, this, ""); - - /** - * The column <code>public.film.release_year</code>. - */ - public final TableField<FilmRecord, Integer> RELEASE_YEAR = createField(DSL.name("release_year"), Domains.YEAR.getDataType(), this, ""); - - /** - * The column <code>public.film.language_id</code>. - */ - public final TableField<FilmRecord, Integer> LANGUAGE_ID = createField(DSL.name("language_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.film.original_language_id</code>. - */ - public final TableField<FilmRecord, Integer> ORIGINAL_LANGUAGE_ID = createField(DSL.name("original_language_id"), SQLDataType.SMALLINT, this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.film.rental_duration</code>. - */ - public final TableField<FilmRecord, Integer> RENTAL_DURATION = createField(DSL.name("rental_duration"), SQLDataType.SMALLINT.defaultValue(DSL.field(DSL.raw("3"), SQLDataType.SMALLINT)), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.film.rental_rate</code>. - */ - public final TableField<FilmRecord, BigDecimal> RENTAL_RATE = createField(DSL.name("rental_rate"), SQLDataType.NUMERIC(4, 2).nullable(false).defaultValue(DSL.field(DSL.raw("4.99"), SQLDataType.NUMERIC)), this, ""); - - /** - * The column <code>public.film.length</code>. - */ - public final TableField<FilmRecord, Integer> LENGTH = createField(DSL.name("length"), SQLDataType.SMALLINT, this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.film.replacement_cost</code>. - */ - public final TableField<FilmRecord, BigDecimal> REPLACEMENT_COST = createField(DSL.name("replacement_cost"), SQLDataType.NUMERIC(5, 2).nullable(false).defaultValue(DSL.field(DSL.raw("19.99"), SQLDataType.NUMERIC)), this, ""); - - /** - * The column <code>public.film.rating</code>. - */ - public final TableField<FilmRecord, MpaaRating> RATING = createField(DSL.name("rating"), SQLDataType.VARCHAR.defaultValue(DSL.field(DSL.raw("'G'::mpaa_rating"), SQLDataType.VARCHAR)).asEnumDataType(MpaaRating.class), this, ""); - - /** - * The column <code>public.film.last_update</code>. - */ - public final TableField<FilmRecord, LocalDateTime> LAST_UPDATE = createField(DSL.name("last_update"), SQLDataType.LOCALDATETIME(6).nullable(false).defaultValue(DSL.field(DSL.raw("now()"), SQLDataType.LOCALDATETIME)), this, ""); - - /** - * The column <code>public.film.special_features</code>. - */ - public final TableField<FilmRecord, String[]> SPECIAL_FEATURES = createField(DSL.name("special_features"), SQLDataType.CLOB.array(), this, ""); - - /** - * @deprecated Unknown data type. If this is a qualified, user-defined type, - * it may have been excluded from code generation. If this is a built-in - * type, you can define an explicit {@link org.jooq.Binding} to specify how - * this type should be handled. Deprecation can be turned off using - * {@literal <deprecationOnUnknownTypes/>} in your code generator - * configuration. - */ - @Deprecated - public final TableField<FilmRecord, Object> FULLTEXT = createField(DSL.name("fulltext"), DefaultDataType.getDefaultDataType("\"pg_catalog\".\"tsvector\"").nullable(false), this, ""); - - /** - * The column <code>public.film.sequel</code>. - */ - public final TableField<FilmRecord, Long> SEQUEL = createField(DSL.name("sequel"), SQLDataType.BIGINT, this, ""); - - private Film(Name alias, Table<FilmRecord> aliased) { - this(alias, aliased, (Field<?>[]) null, null); - } - - private Film(Name alias, Table<FilmRecord> aliased, Field<?>[] parameters, Condition where) { - super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.table(), where); - } - - /** - * Create an aliased <code>public.film</code> table reference - */ - public Film(String alias) { - this(DSL.name(alias), FILM); - } - - /** - * Create an aliased <code>public.film</code> table reference - */ - public Film(Name alias) { - this(alias, FILM); - } - - /** - * Create a <code>public.film</code> table reference - */ - public Film() { - this(DSL.name("film"), null); - } - - public <O extends Record> Film(Table<O> path, ForeignKey<O, FilmRecord> childPath, InverseForeignKey<O, FilmRecord> parentPath) { - super(path, childPath, parentPath, FILM); - } - - /** - * A subtype implementing {@link Path} for simplified path-based joins. - */ - public static class FilmPath extends Film implements Path<FilmRecord> { - - private static final long serialVersionUID = 1L; - public <O extends Record> FilmPath(Table<O> path, ForeignKey<O, FilmRecord> childPath, InverseForeignKey<O, FilmRecord> parentPath) { - super(path, childPath, parentPath); - } - private FilmPath(Name alias, Table<FilmRecord> aliased) { - super(alias, aliased); - } - - @Override - public FilmPath as(String alias) { - return new FilmPath(DSL.name(alias), this); - } - - @Override - public FilmPath as(Name alias) { - return new FilmPath(alias, this); - } - - @Override - public FilmPath as(Table<?> alias) { - return new FilmPath(alias.getQualifiedName(), this); - } - } - - @Override - public Schema getSchema() { - return aliased() ? null : Public.PUBLIC; - } - - @Override - public List<Index> getIndexes() { - return Arrays.asList(Indexes.FILM_FULLTEXT_IDX, Indexes.IDX_FK_LANGUAGE_ID, Indexes.IDX_FK_ORIGINAL_LANGUAGE_ID, Indexes.IDX_TITLE); - } - - @Override - public Identity<FilmRecord, String> getIdentity() { - return (Identity<FilmRecord, String>) super.getIdentity(); - } - - @Override - public UniqueKey<FilmRecord> getPrimaryKey() { - return Keys.FILM_PKEY; - } - - @Override - public List<ForeignKey<FilmRecord, ?>> getReferences() { - return Arrays.asList(Keys.FILM__FILM_LANGUAGE_ID_FKEY, Keys.FILM__FILM_ORIGINAL_LANGUAGE_ID_FKEY, Keys.FILM__SEQUEL_FKEY); - } - - private transient LanguagePath _filmLanguageIdFkey; - - /** - * Get the implicit join path to the <code>public.language</code> table, via - * the <code>film_language_id_fkey</code> key. - */ - public LanguagePath filmLanguageIdFkey() { - if (_filmLanguageIdFkey == null) - _filmLanguageIdFkey = new LanguagePath(this, Keys.FILM__FILM_LANGUAGE_ID_FKEY, null); - - return _filmLanguageIdFkey; - } - - private transient LanguagePath _filmOriginalLanguageIdFkey; - - /** - * Get the implicit join path to the <code>public.language</code> table, via - * the <code>film_original_language_id_fkey</code> key. - */ - public LanguagePath filmOriginalLanguageIdFkey() { - if (_filmOriginalLanguageIdFkey == null) - _filmOriginalLanguageIdFkey = new LanguagePath(this, Keys.FILM__FILM_ORIGINAL_LANGUAGE_ID_FKEY, null); - - return _filmOriginalLanguageIdFkey; - } - - private transient FilmPath _film; - - /** - * Get the implicit join path to the <code>public.film</code> table. - */ - public FilmPath film() { - if (_film == null) - _film = new FilmPath(this, Keys.FILM__SEQUEL_FKEY, null); - - return _film; - } - - private transient FilmActorPath _filmActor; - - /** - * Get the implicit to-many join path to the <code>public.film_actor</code> - * table - */ - public FilmActorPath filmActor() { - if (_filmActor == null) - _filmActor = new FilmActorPath(this, null, Keys.FILM_ACTOR__FILM_ACTOR_FILM_ID_FKEY.getInverseKey()); - - return _filmActor; - } - - private transient FilmCategoryPath _filmCategory; - - /** - * Get the implicit to-many join path to the - * <code>public.film_category</code> table - */ - public FilmCategoryPath filmCategory() { - if (_filmCategory == null) - _filmCategory = new FilmCategoryPath(this, null, Keys.FILM_CATEGORY__FILM_CATEGORY_FILM_ID_FKEY.getInverseKey()); - - return _filmCategory; - } - - private transient InventoryPath _inventory; - - /** - * Get the implicit to-many join path to the <code>public.inventory</code> - * table - */ - public InventoryPath inventory() { - if (_inventory == null) - _inventory = new InventoryPath(this, null, Keys.INVENTORY__INVENTORY_FILM_ID_FKEY.getInverseKey()); - - return _inventory; - } - - /** - * Get the implicit many-to-many join path to the <code>public.actor</code> - * table - */ - public ActorPath actor() { - return filmActor().actor(); - } - - /** - * Get the implicit many-to-many join path to the - * <code>public.category</code> table - */ - public CategoryPath category() { - return filmCategory().category(); - } - - @Override - public Film as(String alias) { - return new Film(DSL.name(alias), this); - } - - @Override - public Film as(Name alias) { - return new Film(alias, this); - } - - @Override - public Film as(Table<?> alias) { - return new Film(alias.getQualifiedName(), this); - } - - /** - * Rename this table - */ - @Override - public Film rename(String name) { - return new Film(DSL.name(name), null); - } - - /** - * Rename this table - */ - @Override - public Film rename(Name name) { - return new Film(name, null); - } - - /** - * Rename this table - */ - @Override - public Film rename(Table<?> name) { - return new Film(name.getQualifiedName(), null); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Film where(Condition condition) { - return new Film(getQualifiedName(), aliased() ? this : null, null, condition); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Film where(Collection<? extends Condition> conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Film where(Condition... conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Film where(Field<Boolean> condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Film where(SQL condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Film where(@Stringly.SQL String condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Film where(@Stringly.SQL String condition, Object... binds) { - return where(DSL.condition(condition, binds)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Film where(@Stringly.SQL String condition, QueryPart... parts) { - return where(DSL.condition(condition, parts)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Film whereExists(Select<?> select) { - return where(DSL.exists(select)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Film whereNotExists(Select<?> select) { - return where(DSL.notExists(select)); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/FilmActor.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/FilmActor.java deleted file mode 100644 index fc7d2299b9..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/FilmActor.java +++ /dev/null @@ -1,307 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables; - - -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import no.sikt.graphitron.converters.ShortToIntegerConverter; -import no.sikt.graphitron.example.generated.jooq.Indexes; -import no.sikt.graphitron.example.generated.jooq.Keys; -import no.sikt.graphitron.example.generated.jooq.Public; -import no.sikt.graphitron.example.generated.jooq.tables.Actor.ActorPath; -import no.sikt.graphitron.example.generated.jooq.tables.Film.FilmPath; -import no.sikt.graphitron.example.generated.jooq.tables.records.FilmActorRecord; - -import org.jooq.Condition; -import org.jooq.Field; -import org.jooq.ForeignKey; -import org.jooq.Index; -import org.jooq.InverseForeignKey; -import org.jooq.Name; -import org.jooq.Path; -import org.jooq.PlainSQL; -import org.jooq.QueryPart; -import org.jooq.Record; -import org.jooq.SQL; -import org.jooq.Schema; -import org.jooq.Select; -import org.jooq.Stringly; -import org.jooq.Table; -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.UniqueKey; -import org.jooq.impl.DSL; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class FilmActor extends TableImpl<FilmActorRecord> { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>public.film_actor</code> - */ - public static final FilmActor FILM_ACTOR = new FilmActor(); - - /** - * The class holding records for this type - */ - @Override - public Class<FilmActorRecord> getRecordType() { - return FilmActorRecord.class; - } - - /** - * The column <code>public.film_actor.actor_id</code>. - */ - public final TableField<FilmActorRecord, Integer> ACTOR_ID = createField(DSL.name("actor_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.film_actor.film_id</code>. - */ - public final TableField<FilmActorRecord, Integer> FILM_ID = createField(DSL.name("film_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.film_actor.last_update</code>. - */ - public final TableField<FilmActorRecord, LocalDateTime> LAST_UPDATE = createField(DSL.name("last_update"), SQLDataType.LOCALDATETIME(6).nullable(false).defaultValue(DSL.field(DSL.raw("now()"), SQLDataType.LOCALDATETIME)), this, ""); - - private FilmActor(Name alias, Table<FilmActorRecord> aliased) { - this(alias, aliased, (Field<?>[]) null, null); - } - - private FilmActor(Name alias, Table<FilmActorRecord> aliased, Field<?>[] parameters, Condition where) { - super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.table(), where); - } - - /** - * Create an aliased <code>public.film_actor</code> table reference - */ - public FilmActor(String alias) { - this(DSL.name(alias), FILM_ACTOR); - } - - /** - * Create an aliased <code>public.film_actor</code> table reference - */ - public FilmActor(Name alias) { - this(alias, FILM_ACTOR); - } - - /** - * Create a <code>public.film_actor</code> table reference - */ - public FilmActor() { - this(DSL.name("film_actor"), null); - } - - public <O extends Record> FilmActor(Table<O> path, ForeignKey<O, FilmActorRecord> childPath, InverseForeignKey<O, FilmActorRecord> parentPath) { - super(path, childPath, parentPath, FILM_ACTOR); - } - - /** - * A subtype implementing {@link Path} for simplified path-based joins. - */ - public static class FilmActorPath extends FilmActor implements Path<FilmActorRecord> { - - private static final long serialVersionUID = 1L; - public <O extends Record> FilmActorPath(Table<O> path, ForeignKey<O, FilmActorRecord> childPath, InverseForeignKey<O, FilmActorRecord> parentPath) { - super(path, childPath, parentPath); - } - private FilmActorPath(Name alias, Table<FilmActorRecord> aliased) { - super(alias, aliased); - } - - @Override - public FilmActorPath as(String alias) { - return new FilmActorPath(DSL.name(alias), this); - } - - @Override - public FilmActorPath as(Name alias) { - return new FilmActorPath(alias, this); - } - - @Override - public FilmActorPath as(Table<?> alias) { - return new FilmActorPath(alias.getQualifiedName(), this); - } - } - - @Override - public Schema getSchema() { - return aliased() ? null : Public.PUBLIC; - } - - @Override - public List<Index> getIndexes() { - return Arrays.asList(Indexes.IDX_FK_FILM_ID); - } - - @Override - public UniqueKey<FilmActorRecord> getPrimaryKey() { - return Keys.FILM_ACTOR_PKEY; - } - - @Override - public List<ForeignKey<FilmActorRecord, ?>> getReferences() { - return Arrays.asList(Keys.FILM_ACTOR__FILM_ACTOR_ACTOR_ID_FKEY, Keys.FILM_ACTOR__FILM_ACTOR_FILM_ID_FKEY); - } - - private transient ActorPath _actor; - - /** - * Get the implicit join path to the <code>public.actor</code> table. - */ - public ActorPath actor() { - if (_actor == null) - _actor = new ActorPath(this, Keys.FILM_ACTOR__FILM_ACTOR_ACTOR_ID_FKEY, null); - - return _actor; - } - - private transient FilmPath _film; - - /** - * Get the implicit join path to the <code>public.film</code> table. - */ - public FilmPath film() { - if (_film == null) - _film = new FilmPath(this, Keys.FILM_ACTOR__FILM_ACTOR_FILM_ID_FKEY, null); - - return _film; - } - - @Override - public FilmActor as(String alias) { - return new FilmActor(DSL.name(alias), this); - } - - @Override - public FilmActor as(Name alias) { - return new FilmActor(alias, this); - } - - @Override - public FilmActor as(Table<?> alias) { - return new FilmActor(alias.getQualifiedName(), this); - } - - /** - * Rename this table - */ - @Override - public FilmActor rename(String name) { - return new FilmActor(DSL.name(name), null); - } - - /** - * Rename this table - */ - @Override - public FilmActor rename(Name name) { - return new FilmActor(name, null); - } - - /** - * Rename this table - */ - @Override - public FilmActor rename(Table<?> name) { - return new FilmActor(name.getQualifiedName(), null); - } - - /** - * Create an inline derived table from this table - */ - @Override - public FilmActor where(Condition condition) { - return new FilmActor(getQualifiedName(), aliased() ? this : null, null, condition); - } - - /** - * Create an inline derived table from this table - */ - @Override - public FilmActor where(Collection<? extends Condition> conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public FilmActor where(Condition... conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public FilmActor where(Field<Boolean> condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public FilmActor where(SQL condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public FilmActor where(@Stringly.SQL String condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public FilmActor where(@Stringly.SQL String condition, Object... binds) { - return where(DSL.condition(condition, binds)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public FilmActor where(@Stringly.SQL String condition, QueryPart... parts) { - return where(DSL.condition(condition, parts)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public FilmActor whereExists(Select<?> select) { - return where(DSL.exists(select)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public FilmActor whereNotExists(Select<?> select) { - return where(DSL.notExists(select)); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/FilmCategory.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/FilmCategory.java deleted file mode 100644 index c91f1bd1bd..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/FilmCategory.java +++ /dev/null @@ -1,300 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables; - - -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import no.sikt.graphitron.converters.ShortToIntegerConverter; -import no.sikt.graphitron.example.generated.jooq.Keys; -import no.sikt.graphitron.example.generated.jooq.Public; -import no.sikt.graphitron.example.generated.jooq.tables.Category.CategoryPath; -import no.sikt.graphitron.example.generated.jooq.tables.Film.FilmPath; -import no.sikt.graphitron.example.generated.jooq.tables.records.FilmCategoryRecord; - -import org.jooq.Condition; -import org.jooq.Field; -import org.jooq.ForeignKey; -import org.jooq.InverseForeignKey; -import org.jooq.Name; -import org.jooq.Path; -import org.jooq.PlainSQL; -import org.jooq.QueryPart; -import org.jooq.Record; -import org.jooq.SQL; -import org.jooq.Schema; -import org.jooq.Select; -import org.jooq.Stringly; -import org.jooq.Table; -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.UniqueKey; -import org.jooq.impl.DSL; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class FilmCategory extends TableImpl<FilmCategoryRecord> { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>public.film_category</code> - */ - public static final FilmCategory FILM_CATEGORY = new FilmCategory(); - - /** - * The class holding records for this type - */ - @Override - public Class<FilmCategoryRecord> getRecordType() { - return FilmCategoryRecord.class; - } - - /** - * The column <code>public.film_category.film_id</code>. - */ - public final TableField<FilmCategoryRecord, Integer> FILM_ID = createField(DSL.name("film_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.film_category.category_id</code>. - */ - public final TableField<FilmCategoryRecord, Integer> CATEGORY_ID = createField(DSL.name("category_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.film_category.last_update</code>. - */ - public final TableField<FilmCategoryRecord, LocalDateTime> LAST_UPDATE = createField(DSL.name("last_update"), SQLDataType.LOCALDATETIME(6).nullable(false).defaultValue(DSL.field(DSL.raw("now()"), SQLDataType.LOCALDATETIME)), this, ""); - - private FilmCategory(Name alias, Table<FilmCategoryRecord> aliased) { - this(alias, aliased, (Field<?>[]) null, null); - } - - private FilmCategory(Name alias, Table<FilmCategoryRecord> aliased, Field<?>[] parameters, Condition where) { - super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.table(), where); - } - - /** - * Create an aliased <code>public.film_category</code> table reference - */ - public FilmCategory(String alias) { - this(DSL.name(alias), FILM_CATEGORY); - } - - /** - * Create an aliased <code>public.film_category</code> table reference - */ - public FilmCategory(Name alias) { - this(alias, FILM_CATEGORY); - } - - /** - * Create a <code>public.film_category</code> table reference - */ - public FilmCategory() { - this(DSL.name("film_category"), null); - } - - public <O extends Record> FilmCategory(Table<O> path, ForeignKey<O, FilmCategoryRecord> childPath, InverseForeignKey<O, FilmCategoryRecord> parentPath) { - super(path, childPath, parentPath, FILM_CATEGORY); - } - - /** - * A subtype implementing {@link Path} for simplified path-based joins. - */ - public static class FilmCategoryPath extends FilmCategory implements Path<FilmCategoryRecord> { - - private static final long serialVersionUID = 1L; - public <O extends Record> FilmCategoryPath(Table<O> path, ForeignKey<O, FilmCategoryRecord> childPath, InverseForeignKey<O, FilmCategoryRecord> parentPath) { - super(path, childPath, parentPath); - } - private FilmCategoryPath(Name alias, Table<FilmCategoryRecord> aliased) { - super(alias, aliased); - } - - @Override - public FilmCategoryPath as(String alias) { - return new FilmCategoryPath(DSL.name(alias), this); - } - - @Override - public FilmCategoryPath as(Name alias) { - return new FilmCategoryPath(alias, this); - } - - @Override - public FilmCategoryPath as(Table<?> alias) { - return new FilmCategoryPath(alias.getQualifiedName(), this); - } - } - - @Override - public Schema getSchema() { - return aliased() ? null : Public.PUBLIC; - } - - @Override - public UniqueKey<FilmCategoryRecord> getPrimaryKey() { - return Keys.FILM_CATEGORY_PKEY; - } - - @Override - public List<ForeignKey<FilmCategoryRecord, ?>> getReferences() { - return Arrays.asList(Keys.FILM_CATEGORY__FILM_CATEGORY_CATEGORY_ID_FKEY, Keys.FILM_CATEGORY__FILM_CATEGORY_FILM_ID_FKEY); - } - - private transient CategoryPath _category; - - /** - * Get the implicit join path to the <code>public.category</code> table. - */ - public CategoryPath category() { - if (_category == null) - _category = new CategoryPath(this, Keys.FILM_CATEGORY__FILM_CATEGORY_CATEGORY_ID_FKEY, null); - - return _category; - } - - private transient FilmPath _film; - - /** - * Get the implicit join path to the <code>public.film</code> table. - */ - public FilmPath film() { - if (_film == null) - _film = new FilmPath(this, Keys.FILM_CATEGORY__FILM_CATEGORY_FILM_ID_FKEY, null); - - return _film; - } - - @Override - public FilmCategory as(String alias) { - return new FilmCategory(DSL.name(alias), this); - } - - @Override - public FilmCategory as(Name alias) { - return new FilmCategory(alias, this); - } - - @Override - public FilmCategory as(Table<?> alias) { - return new FilmCategory(alias.getQualifiedName(), this); - } - - /** - * Rename this table - */ - @Override - public FilmCategory rename(String name) { - return new FilmCategory(DSL.name(name), null); - } - - /** - * Rename this table - */ - @Override - public FilmCategory rename(Name name) { - return new FilmCategory(name, null); - } - - /** - * Rename this table - */ - @Override - public FilmCategory rename(Table<?> name) { - return new FilmCategory(name.getQualifiedName(), null); - } - - /** - * Create an inline derived table from this table - */ - @Override - public FilmCategory where(Condition condition) { - return new FilmCategory(getQualifiedName(), aliased() ? this : null, null, condition); - } - - /** - * Create an inline derived table from this table - */ - @Override - public FilmCategory where(Collection<? extends Condition> conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public FilmCategory where(Condition... conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public FilmCategory where(Field<Boolean> condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public FilmCategory where(SQL condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public FilmCategory where(@Stringly.SQL String condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public FilmCategory where(@Stringly.SQL String condition, Object... binds) { - return where(DSL.condition(condition, binds)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public FilmCategory where(@Stringly.SQL String condition, QueryPart... parts) { - return where(DSL.condition(condition, parts)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public FilmCategory whereExists(Select<?> select) { - return where(DSL.exists(select)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public FilmCategory whereNotExists(Select<?> select) { - return where(DSL.notExists(select)); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/FilmInStock.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/FilmInStock.java deleted file mode 100644 index 196a4e413c..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/FilmInStock.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables; - - -import no.sikt.graphitron.example.generated.jooq.Public; -import no.sikt.graphitron.example.generated.jooq.tables.records.FilmInStockRecord; - -import org.jooq.Condition; -import org.jooq.Field; -import org.jooq.Name; -import org.jooq.Schema; -import org.jooq.Table; -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.impl.DSL; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class FilmInStock extends TableImpl<FilmInStockRecord> { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>public.film_in_stock</code> - */ - public static final FilmInStock FILM_IN_STOCK = new FilmInStock(); - - /** - * The class holding records for this type - */ - @Override - public Class<FilmInStockRecord> getRecordType() { - return FilmInStockRecord.class; - } - - /** - * The column <code>public.film_in_stock.p_film_count</code>. - */ - public final TableField<FilmInStockRecord, Integer> P_FILM_COUNT = createField(DSL.name("p_film_count"), SQLDataType.INTEGER, this, ""); - - private FilmInStock(Name alias, Table<FilmInStockRecord> aliased) { - this(alias, aliased, new Field[] { - DSL.val(null, SQLDataType.INTEGER), - DSL.val(null, SQLDataType.INTEGER) - }); - } - - private FilmInStock(Name alias, Table<FilmInStockRecord> aliased, Field<?>[] parameters) { - this(alias, aliased, parameters, null); - } - - private FilmInStock(Name alias, Table<FilmInStockRecord> aliased, Field<?>[] parameters, Condition where) { - super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.function(), where); - } - - /** - * Create an aliased <code>public.film_in_stock</code> table reference - */ - public FilmInStock(String alias) { - this(DSL.name(alias), FILM_IN_STOCK); - } - - /** - * Create an aliased <code>public.film_in_stock</code> table reference - */ - public FilmInStock(Name alias) { - this(alias, FILM_IN_STOCK); - } - - /** - * Create a <code>public.film_in_stock</code> table reference - */ - public FilmInStock() { - this(DSL.name("film_in_stock"), null); - } - - @Override - public Schema getSchema() { - return aliased() ? null : Public.PUBLIC; - } - - @Override - public FilmInStock as(String alias) { - return new FilmInStock(DSL.name(alias), this, parameters); - } - - @Override - public FilmInStock as(Name alias) { - return new FilmInStock(alias, this, parameters); - } - - @Override - public FilmInStock as(Table<?> alias) { - return new FilmInStock(alias.getQualifiedName(), this, parameters); - } - - /** - * Rename this table - */ - @Override - public FilmInStock rename(String name) { - return new FilmInStock(DSL.name(name), null, parameters); - } - - /** - * Rename this table - */ - @Override - public FilmInStock rename(Name name) { - return new FilmInStock(name, null, parameters); - } - - /** - * Rename this table - */ - @Override - public FilmInStock rename(Table<?> name) { - return new FilmInStock(name.getQualifiedName(), null, parameters); - } - - /** - * Call this table-valued function - */ - public FilmInStock call( - Integer pFilmId - , Integer pStoreId - ) { - FilmInStock result = new FilmInStock(DSL.name("film_in_stock"), null, new Field[] { - DSL.val(pFilmId, SQLDataType.INTEGER), - DSL.val(pStoreId, SQLDataType.INTEGER) - }); - - return aliased() ? result.as(getUnqualifiedName()) : result; - } - - /** - * Call this table-valued function - */ - public FilmInStock call( - Field<Integer> pFilmId - , Field<Integer> pStoreId - ) { - FilmInStock result = new FilmInStock(DSL.name("film_in_stock"), null, new Field[] { - pFilmId, - pStoreId - }); - - return aliased() ? result.as(getUnqualifiedName()) : result; - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/FilmList.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/FilmList.java deleted file mode 100644 index c0820e03c3..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/FilmList.java +++ /dev/null @@ -1,264 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables; - - -import java.math.BigDecimal; -import java.util.Collection; - -import no.sikt.graphitron.converters.ShortToIntegerConverter; -import no.sikt.graphitron.example.generated.jooq.Public; -import no.sikt.graphitron.example.generated.jooq.enums.MpaaRating; -import no.sikt.graphitron.example.generated.jooq.tables.records.FilmListRecord; - -import org.jooq.Condition; -import org.jooq.Field; -import org.jooq.Name; -import org.jooq.PlainSQL; -import org.jooq.QueryPart; -import org.jooq.SQL; -import org.jooq.Schema; -import org.jooq.Select; -import org.jooq.Stringly; -import org.jooq.Table; -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.impl.DSL; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class FilmList extends TableImpl<FilmListRecord> { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>public.film_list</code> - */ - public static final FilmList FILM_LIST = new FilmList(); - - /** - * The class holding records for this type - */ - @Override - public Class<FilmListRecord> getRecordType() { - return FilmListRecord.class; - } - - /** - * The column <code>public.film_list.fid</code>. - */ - public final TableField<FilmListRecord, Integer> FID = createField(DSL.name("fid"), SQLDataType.INTEGER, this, ""); - - /** - * The column <code>public.film_list.title</code>. - */ - public final TableField<FilmListRecord, String> TITLE = createField(DSL.name("title"), SQLDataType.VARCHAR(255), this, ""); - - /** - * The column <code>public.film_list.description</code>. - */ - public final TableField<FilmListRecord, String> DESCRIPTION = createField(DSL.name("description"), SQLDataType.CLOB, this, ""); - - /** - * The column <code>public.film_list.category</code>. - */ - public final TableField<FilmListRecord, String> CATEGORY = createField(DSL.name("category"), SQLDataType.VARCHAR(25), this, ""); - - /** - * The column <code>public.film_list.price</code>. - */ - public final TableField<FilmListRecord, BigDecimal> PRICE = createField(DSL.name("price"), SQLDataType.NUMERIC(4, 2), this, ""); - - /** - * The column <code>public.film_list.length</code>. - */ - public final TableField<FilmListRecord, Integer> LENGTH = createField(DSL.name("length"), SQLDataType.SMALLINT, this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.film_list.rating</code>. - */ - public final TableField<FilmListRecord, MpaaRating> RATING = createField(DSL.name("rating"), SQLDataType.VARCHAR.asEnumDataType(MpaaRating.class), this, ""); - - /** - * The column <code>public.film_list.actors</code>. - */ - public final TableField<FilmListRecord, String> ACTORS = createField(DSL.name("actors"), SQLDataType.CLOB, this, ""); - - private FilmList(Name alias, Table<FilmListRecord> aliased) { - this(alias, aliased, (Field<?>[]) null, null); - } - - private FilmList(Name alias, Table<FilmListRecord> aliased, Field<?>[] parameters, Condition where) { - super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.view(""" - CREATE VIEW "film_list" AS SELECT film.film_id AS fid, - film.title, - film.description, - category.name AS category, - film.rental_rate AS price, - film.length, - film.rating, - group_concat((((actor.first_name)::text || ' '::text) || (actor.last_name)::text)) AS actors - FROM ((((category - LEFT JOIN film_category ON ((category.category_id = film_category.category_id))) - LEFT JOIN film ON ((film_category.film_id = film.film_id))) - JOIN film_actor ON ((film.film_id = film_actor.film_id))) - JOIN actor ON ((film_actor.actor_id = actor.actor_id))) - GROUP BY film.film_id, film.title, film.description, category.name, film.rental_rate, film.length, film.rating; - """), where); - } - - /** - * Create an aliased <code>public.film_list</code> table reference - */ - public FilmList(String alias) { - this(DSL.name(alias), FILM_LIST); - } - - /** - * Create an aliased <code>public.film_list</code> table reference - */ - public FilmList(Name alias) { - this(alias, FILM_LIST); - } - - /** - * Create a <code>public.film_list</code> table reference - */ - public FilmList() { - this(DSL.name("film_list"), null); - } - - @Override - public Schema getSchema() { - return aliased() ? null : Public.PUBLIC; - } - - @Override - public FilmList as(String alias) { - return new FilmList(DSL.name(alias), this); - } - - @Override - public FilmList as(Name alias) { - return new FilmList(alias, this); - } - - @Override - public FilmList as(Table<?> alias) { - return new FilmList(alias.getQualifiedName(), this); - } - - /** - * Rename this table - */ - @Override - public FilmList rename(String name) { - return new FilmList(DSL.name(name), null); - } - - /** - * Rename this table - */ - @Override - public FilmList rename(Name name) { - return new FilmList(name, null); - } - - /** - * Rename this table - */ - @Override - public FilmList rename(Table<?> name) { - return new FilmList(name.getQualifiedName(), null); - } - - /** - * Create an inline derived table from this table - */ - @Override - public FilmList where(Condition condition) { - return new FilmList(getQualifiedName(), aliased() ? this : null, null, condition); - } - - /** - * Create an inline derived table from this table - */ - @Override - public FilmList where(Collection<? extends Condition> conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public FilmList where(Condition... conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public FilmList where(Field<Boolean> condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public FilmList where(SQL condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public FilmList where(@Stringly.SQL String condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public FilmList where(@Stringly.SQL String condition, Object... binds) { - return where(DSL.condition(condition, binds)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public FilmList where(@Stringly.SQL String condition, QueryPart... parts) { - return where(DSL.condition(condition, parts)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public FilmList whereExists(Select<?> select) { - return where(DSL.exists(select)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public FilmList whereNotExists(Select<?> select) { - return where(DSL.notExists(select)); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/FilmNotInStock.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/FilmNotInStock.java deleted file mode 100644 index 20538f7616..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/FilmNotInStock.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables; - - -import no.sikt.graphitron.example.generated.jooq.Public; -import no.sikt.graphitron.example.generated.jooq.tables.records.FilmNotInStockRecord; - -import org.jooq.Condition; -import org.jooq.Field; -import org.jooq.Name; -import org.jooq.Schema; -import org.jooq.Table; -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.impl.DSL; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class FilmNotInStock extends TableImpl<FilmNotInStockRecord> { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>public.film_not_in_stock</code> - */ - public static final FilmNotInStock FILM_NOT_IN_STOCK = new FilmNotInStock(); - - /** - * The class holding records for this type - */ - @Override - public Class<FilmNotInStockRecord> getRecordType() { - return FilmNotInStockRecord.class; - } - - /** - * The column <code>public.film_not_in_stock.p_film_count</code>. - */ - public final TableField<FilmNotInStockRecord, Integer> P_FILM_COUNT = createField(DSL.name("p_film_count"), SQLDataType.INTEGER, this, ""); - - private FilmNotInStock(Name alias, Table<FilmNotInStockRecord> aliased) { - this(alias, aliased, new Field[] { - DSL.val(null, SQLDataType.INTEGER), - DSL.val(null, SQLDataType.INTEGER) - }); - } - - private FilmNotInStock(Name alias, Table<FilmNotInStockRecord> aliased, Field<?>[] parameters) { - this(alias, aliased, parameters, null); - } - - private FilmNotInStock(Name alias, Table<FilmNotInStockRecord> aliased, Field<?>[] parameters, Condition where) { - super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.function(), where); - } - - /** - * Create an aliased <code>public.film_not_in_stock</code> table reference - */ - public FilmNotInStock(String alias) { - this(DSL.name(alias), FILM_NOT_IN_STOCK); - } - - /** - * Create an aliased <code>public.film_not_in_stock</code> table reference - */ - public FilmNotInStock(Name alias) { - this(alias, FILM_NOT_IN_STOCK); - } - - /** - * Create a <code>public.film_not_in_stock</code> table reference - */ - public FilmNotInStock() { - this(DSL.name("film_not_in_stock"), null); - } - - @Override - public Schema getSchema() { - return aliased() ? null : Public.PUBLIC; - } - - @Override - public FilmNotInStock as(String alias) { - return new FilmNotInStock(DSL.name(alias), this, parameters); - } - - @Override - public FilmNotInStock as(Name alias) { - return new FilmNotInStock(alias, this, parameters); - } - - @Override - public FilmNotInStock as(Table<?> alias) { - return new FilmNotInStock(alias.getQualifiedName(), this, parameters); - } - - /** - * Rename this table - */ - @Override - public FilmNotInStock rename(String name) { - return new FilmNotInStock(DSL.name(name), null, parameters); - } - - /** - * Rename this table - */ - @Override - public FilmNotInStock rename(Name name) { - return new FilmNotInStock(name, null, parameters); - } - - /** - * Rename this table - */ - @Override - public FilmNotInStock rename(Table<?> name) { - return new FilmNotInStock(name.getQualifiedName(), null, parameters); - } - - /** - * Call this table-valued function - */ - public FilmNotInStock call( - Integer pFilmId - , Integer pStoreId - ) { - FilmNotInStock result = new FilmNotInStock(DSL.name("film_not_in_stock"), null, new Field[] { - DSL.val(pFilmId, SQLDataType.INTEGER), - DSL.val(pStoreId, SQLDataType.INTEGER) - }); - - return aliased() ? result.as(getUnqualifiedName()) : result; - } - - /** - * Call this table-valued function - */ - public FilmNotInStock call( - Field<Integer> pFilmId - , Field<Integer> pStoreId - ) { - FilmNotInStock result = new FilmNotInStock(DSL.name("film_not_in_stock"), null, new Field[] { - pFilmId, - pStoreId - }); - - return aliased() ? result.as(getUnqualifiedName()) : result; - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Inventory.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Inventory.java deleted file mode 100644 index 241b75453f..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Inventory.java +++ /dev/null @@ -1,332 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables; - - -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import no.sikt.graphitron.converters.ShortToIntegerConverter; -import no.sikt.graphitron.example.generated.jooq.Indexes; -import no.sikt.graphitron.example.generated.jooq.Keys; -import no.sikt.graphitron.example.generated.jooq.Public; -import no.sikt.graphitron.example.generated.jooq.tables.Film.FilmPath; -import no.sikt.graphitron.example.generated.jooq.tables.Rental.RentalPath; -import no.sikt.graphitron.example.generated.jooq.tables.Store.StorePath; -import no.sikt.graphitron.example.generated.jooq.tables.records.InventoryRecord; - -import org.jooq.Condition; -import org.jooq.Field; -import org.jooq.ForeignKey; -import org.jooq.Identity; -import org.jooq.Index; -import org.jooq.InverseForeignKey; -import org.jooq.Name; -import org.jooq.Path; -import org.jooq.PlainSQL; -import org.jooq.QueryPart; -import org.jooq.Record; -import org.jooq.SQL; -import org.jooq.Schema; -import org.jooq.Select; -import org.jooq.Stringly; -import org.jooq.Table; -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.UniqueKey; -import org.jooq.impl.DSL; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class Inventory extends TableImpl<InventoryRecord> { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>public.inventory</code> - */ - public static final Inventory INVENTORY = new Inventory(); - - /** - * The class holding records for this type - */ - @Override - public Class<InventoryRecord> getRecordType() { - return InventoryRecord.class; - } - - /** - * The column <code>public.inventory.inventory_id</code>. - */ - public final TableField<InventoryRecord, Integer> INVENTORY_ID = createField(DSL.name("inventory_id"), SQLDataType.INTEGER.nullable(false).identity(true), this, ""); - - /** - * The column <code>public.inventory.film_id</code>. - */ - public final TableField<InventoryRecord, Integer> FILM_ID = createField(DSL.name("film_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.inventory.store_id</code>. - */ - public final TableField<InventoryRecord, Integer> STORE_ID = createField(DSL.name("store_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.inventory.last_update</code>. - */ - public final TableField<InventoryRecord, LocalDateTime> LAST_UPDATE = createField(DSL.name("last_update"), SQLDataType.LOCALDATETIME(6).nullable(false).defaultValue(DSL.field(DSL.raw("now()"), SQLDataType.LOCALDATETIME)), this, ""); - - private Inventory(Name alias, Table<InventoryRecord> aliased) { - this(alias, aliased, (Field<?>[]) null, null); - } - - private Inventory(Name alias, Table<InventoryRecord> aliased, Field<?>[] parameters, Condition where) { - super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.table(), where); - } - - /** - * Create an aliased <code>public.inventory</code> table reference - */ - public Inventory(String alias) { - this(DSL.name(alias), INVENTORY); - } - - /** - * Create an aliased <code>public.inventory</code> table reference - */ - public Inventory(Name alias) { - this(alias, INVENTORY); - } - - /** - * Create a <code>public.inventory</code> table reference - */ - public Inventory() { - this(DSL.name("inventory"), null); - } - - public <O extends Record> Inventory(Table<O> path, ForeignKey<O, InventoryRecord> childPath, InverseForeignKey<O, InventoryRecord> parentPath) { - super(path, childPath, parentPath, INVENTORY); - } - - /** - * A subtype implementing {@link Path} for simplified path-based joins. - */ - public static class InventoryPath extends Inventory implements Path<InventoryRecord> { - - private static final long serialVersionUID = 1L; - public <O extends Record> InventoryPath(Table<O> path, ForeignKey<O, InventoryRecord> childPath, InverseForeignKey<O, InventoryRecord> parentPath) { - super(path, childPath, parentPath); - } - private InventoryPath(Name alias, Table<InventoryRecord> aliased) { - super(alias, aliased); - } - - @Override - public InventoryPath as(String alias) { - return new InventoryPath(DSL.name(alias), this); - } - - @Override - public InventoryPath as(Name alias) { - return new InventoryPath(alias, this); - } - - @Override - public InventoryPath as(Table<?> alias) { - return new InventoryPath(alias.getQualifiedName(), this); - } - } - - @Override - public Schema getSchema() { - return aliased() ? null : Public.PUBLIC; - } - - @Override - public List<Index> getIndexes() { - return Arrays.asList(Indexes.IDX_STORE_ID_FILM_ID); - } - - @Override - public Identity<InventoryRecord, Integer> getIdentity() { - return (Identity<InventoryRecord, Integer>) super.getIdentity(); - } - - @Override - public UniqueKey<InventoryRecord> getPrimaryKey() { - return Keys.INVENTORY_PKEY; - } - - @Override - public List<ForeignKey<InventoryRecord, ?>> getReferences() { - return Arrays.asList(Keys.INVENTORY__INVENTORY_FILM_ID_FKEY, Keys.INVENTORY__INVENTORY_STORE_ID_FKEY); - } - - private transient FilmPath _film; - - /** - * Get the implicit join path to the <code>public.film</code> table. - */ - public FilmPath film() { - if (_film == null) - _film = new FilmPath(this, Keys.INVENTORY__INVENTORY_FILM_ID_FKEY, null); - - return _film; - } - - private transient StorePath _store; - - /** - * Get the implicit join path to the <code>public.store</code> table. - */ - public StorePath store() { - if (_store == null) - _store = new StorePath(this, Keys.INVENTORY__INVENTORY_STORE_ID_FKEY, null); - - return _store; - } - - private transient RentalPath _rental; - - /** - * Get the implicit to-many join path to the <code>public.rental</code> - * table - */ - public RentalPath rental() { - if (_rental == null) - _rental = new RentalPath(this, null, Keys.RENTAL__RENTAL_INVENTORY_ID_FKEY.getInverseKey()); - - return _rental; - } - - @Override - public Inventory as(String alias) { - return new Inventory(DSL.name(alias), this); - } - - @Override - public Inventory as(Name alias) { - return new Inventory(alias, this); - } - - @Override - public Inventory as(Table<?> alias) { - return new Inventory(alias.getQualifiedName(), this); - } - - /** - * Rename this table - */ - @Override - public Inventory rename(String name) { - return new Inventory(DSL.name(name), null); - } - - /** - * Rename this table - */ - @Override - public Inventory rename(Name name) { - return new Inventory(name, null); - } - - /** - * Rename this table - */ - @Override - public Inventory rename(Table<?> name) { - return new Inventory(name.getQualifiedName(), null); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Inventory where(Condition condition) { - return new Inventory(getQualifiedName(), aliased() ? this : null, null, condition); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Inventory where(Collection<? extends Condition> conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Inventory where(Condition... conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Inventory where(Field<Boolean> condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Inventory where(SQL condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Inventory where(@Stringly.SQL String condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Inventory where(@Stringly.SQL String condition, Object... binds) { - return where(DSL.condition(condition, binds)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Inventory where(@Stringly.SQL String condition, QueryPart... parts) { - return where(DSL.condition(condition, parts)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Inventory whereExists(Select<?> select) { - return where(DSL.exists(select)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Inventory whereNotExists(Select<?> select) { - return where(DSL.notExists(select)); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Language.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Language.java deleted file mode 100644 index d4cbc30768..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Language.java +++ /dev/null @@ -1,299 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables; - - -import java.time.LocalDateTime; -import java.util.Collection; - -import no.sikt.graphitron.example.generated.jooq.Keys; -import no.sikt.graphitron.example.generated.jooq.Public; -import no.sikt.graphitron.example.generated.jooq.tables.Film.FilmPath; -import no.sikt.graphitron.example.generated.jooq.tables.records.LanguageRecord; - -import org.jooq.Condition; -import org.jooq.Field; -import org.jooq.ForeignKey; -import org.jooq.Identity; -import org.jooq.InverseForeignKey; -import org.jooq.Name; -import org.jooq.Path; -import org.jooq.PlainSQL; -import org.jooq.QueryPart; -import org.jooq.Record; -import org.jooq.SQL; -import org.jooq.Schema; -import org.jooq.Select; -import org.jooq.Stringly; -import org.jooq.Table; -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.UniqueKey; -import org.jooq.impl.DSL; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class Language extends TableImpl<LanguageRecord> { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>public.language</code> - */ - public static final Language LANGUAGE = new Language(); - - /** - * The class holding records for this type - */ - @Override - public Class<LanguageRecord> getRecordType() { - return LanguageRecord.class; - } - - /** - * The column <code>public.language.language_id</code>. - */ - public final TableField<LanguageRecord, Integer> LANGUAGE_ID = createField(DSL.name("language_id"), SQLDataType.INTEGER.nullable(false).identity(true), this, ""); - - /** - * The column <code>public.language.name</code>. - */ - public final TableField<LanguageRecord, String> NAME = createField(DSL.name("name"), SQLDataType.CHAR(20).nullable(false), this, ""); - - /** - * The column <code>public.language.last_update</code>. - */ - public final TableField<LanguageRecord, LocalDateTime> LAST_UPDATE = createField(DSL.name("last_update"), SQLDataType.LOCALDATETIME(6).nullable(false).defaultValue(DSL.field(DSL.raw("now()"), SQLDataType.LOCALDATETIME)), this, ""); - - private Language(Name alias, Table<LanguageRecord> aliased) { - this(alias, aliased, (Field<?>[]) null, null); - } - - private Language(Name alias, Table<LanguageRecord> aliased, Field<?>[] parameters, Condition where) { - super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.table(), where); - } - - /** - * Create an aliased <code>public.language</code> table reference - */ - public Language(String alias) { - this(DSL.name(alias), LANGUAGE); - } - - /** - * Create an aliased <code>public.language</code> table reference - */ - public Language(Name alias) { - this(alias, LANGUAGE); - } - - /** - * Create a <code>public.language</code> table reference - */ - public Language() { - this(DSL.name("language"), null); - } - - public <O extends Record> Language(Table<O> path, ForeignKey<O, LanguageRecord> childPath, InverseForeignKey<O, LanguageRecord> parentPath) { - super(path, childPath, parentPath, LANGUAGE); - } - - /** - * A subtype implementing {@link Path} for simplified path-based joins. - */ - public static class LanguagePath extends Language implements Path<LanguageRecord> { - - private static final long serialVersionUID = 1L; - public <O extends Record> LanguagePath(Table<O> path, ForeignKey<O, LanguageRecord> childPath, InverseForeignKey<O, LanguageRecord> parentPath) { - super(path, childPath, parentPath); - } - private LanguagePath(Name alias, Table<LanguageRecord> aliased) { - super(alias, aliased); - } - - @Override - public LanguagePath as(String alias) { - return new LanguagePath(DSL.name(alias), this); - } - - @Override - public LanguagePath as(Name alias) { - return new LanguagePath(alias, this); - } - - @Override - public LanguagePath as(Table<?> alias) { - return new LanguagePath(alias.getQualifiedName(), this); - } - } - - @Override - public Schema getSchema() { - return aliased() ? null : Public.PUBLIC; - } - - @Override - public Identity<LanguageRecord, Integer> getIdentity() { - return (Identity<LanguageRecord, Integer>) super.getIdentity(); - } - - @Override - public UniqueKey<LanguageRecord> getPrimaryKey() { - return Keys.LANGUAGE_PKEY; - } - - private transient FilmPath _filmLanguageIdFkey; - - /** - * Get the implicit to-many join path to the <code>public.film</code> table, - * via the <code>film_language_id_fkey</code> key - */ - public FilmPath filmLanguageIdFkey() { - if (_filmLanguageIdFkey == null) - _filmLanguageIdFkey = new FilmPath(this, null, Keys.FILM__FILM_LANGUAGE_ID_FKEY.getInverseKey()); - - return _filmLanguageIdFkey; - } - - private transient FilmPath _filmOriginalLanguageIdFkey; - - /** - * Get the implicit to-many join path to the <code>public.film</code> table, - * via the <code>film_original_language_id_fkey</code> key - */ - public FilmPath filmOriginalLanguageIdFkey() { - if (_filmOriginalLanguageIdFkey == null) - _filmOriginalLanguageIdFkey = new FilmPath(this, null, Keys.FILM__FILM_ORIGINAL_LANGUAGE_ID_FKEY.getInverseKey()); - - return _filmOriginalLanguageIdFkey; - } - - @Override - public Language as(String alias) { - return new Language(DSL.name(alias), this); - } - - @Override - public Language as(Name alias) { - return new Language(alias, this); - } - - @Override - public Language as(Table<?> alias) { - return new Language(alias.getQualifiedName(), this); - } - - /** - * Rename this table - */ - @Override - public Language rename(String name) { - return new Language(DSL.name(name), null); - } - - /** - * Rename this table - */ - @Override - public Language rename(Name name) { - return new Language(name, null); - } - - /** - * Rename this table - */ - @Override - public Language rename(Table<?> name) { - return new Language(name.getQualifiedName(), null); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Language where(Condition condition) { - return new Language(getQualifiedName(), aliased() ? this : null, null, condition); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Language where(Collection<? extends Condition> conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Language where(Condition... conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Language where(Field<Boolean> condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Language where(SQL condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Language where(@Stringly.SQL String condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Language where(@Stringly.SQL String condition, Object... binds) { - return where(DSL.condition(condition, binds)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Language where(@Stringly.SQL String condition, QueryPart... parts) { - return where(DSL.condition(condition, parts)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Language whereExists(Select<?> select) { - return where(DSL.exists(select)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Language whereNotExists(Select<?> select) { - return where(DSL.notExists(select)); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/NicerButSlowerFilmList.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/NicerButSlowerFilmList.java deleted file mode 100644 index 44ccf9f075..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/NicerButSlowerFilmList.java +++ /dev/null @@ -1,266 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables; - - -import java.math.BigDecimal; -import java.util.Collection; - -import no.sikt.graphitron.converters.ShortToIntegerConverter; -import no.sikt.graphitron.example.generated.jooq.Public; -import no.sikt.graphitron.example.generated.jooq.enums.MpaaRating; -import no.sikt.graphitron.example.generated.jooq.tables.records.NicerButSlowerFilmListRecord; - -import org.jooq.Condition; -import org.jooq.Field; -import org.jooq.Name; -import org.jooq.PlainSQL; -import org.jooq.QueryPart; -import org.jooq.SQL; -import org.jooq.Schema; -import org.jooq.Select; -import org.jooq.Stringly; -import org.jooq.Table; -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.impl.DSL; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class NicerButSlowerFilmList extends TableImpl<NicerButSlowerFilmListRecord> { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>public.nicer_but_slower_film_list</code> - */ - public static final NicerButSlowerFilmList NICER_BUT_SLOWER_FILM_LIST = new NicerButSlowerFilmList(); - - /** - * The class holding records for this type - */ - @Override - public Class<NicerButSlowerFilmListRecord> getRecordType() { - return NicerButSlowerFilmListRecord.class; - } - - /** - * The column <code>public.nicer_but_slower_film_list.fid</code>. - */ - public final TableField<NicerButSlowerFilmListRecord, Integer> FID = createField(DSL.name("fid"), SQLDataType.INTEGER, this, ""); - - /** - * The column <code>public.nicer_but_slower_film_list.title</code>. - */ - public final TableField<NicerButSlowerFilmListRecord, String> TITLE = createField(DSL.name("title"), SQLDataType.VARCHAR(255), this, ""); - - /** - * The column <code>public.nicer_but_slower_film_list.description</code>. - */ - public final TableField<NicerButSlowerFilmListRecord, String> DESCRIPTION = createField(DSL.name("description"), SQLDataType.CLOB, this, ""); - - /** - * The column <code>public.nicer_but_slower_film_list.category</code>. - */ - public final TableField<NicerButSlowerFilmListRecord, String> CATEGORY = createField(DSL.name("category"), SQLDataType.VARCHAR(25), this, ""); - - /** - * The column <code>public.nicer_but_slower_film_list.price</code>. - */ - public final TableField<NicerButSlowerFilmListRecord, BigDecimal> PRICE = createField(DSL.name("price"), SQLDataType.NUMERIC(4, 2), this, ""); - - /** - * The column <code>public.nicer_but_slower_film_list.length</code>. - */ - public final TableField<NicerButSlowerFilmListRecord, Integer> LENGTH = createField(DSL.name("length"), SQLDataType.SMALLINT, this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.nicer_but_slower_film_list.rating</code>. - */ - public final TableField<NicerButSlowerFilmListRecord, MpaaRating> RATING = createField(DSL.name("rating"), SQLDataType.VARCHAR.asEnumDataType(MpaaRating.class), this, ""); - - /** - * The column <code>public.nicer_but_slower_film_list.actors</code>. - */ - public final TableField<NicerButSlowerFilmListRecord, String> ACTORS = createField(DSL.name("actors"), SQLDataType.CLOB, this, ""); - - private NicerButSlowerFilmList(Name alias, Table<NicerButSlowerFilmListRecord> aliased) { - this(alias, aliased, (Field<?>[]) null, null); - } - - private NicerButSlowerFilmList(Name alias, Table<NicerButSlowerFilmListRecord> aliased, Field<?>[] parameters, Condition where) { - super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.view(""" - CREATE VIEW "nicer_but_slower_film_list" AS SELECT film.film_id AS fid, - film.title, - film.description, - category.name AS category, - film.rental_rate AS price, - film.length, - film.rating, - group_concat((((upper("substring"((actor.first_name)::text, 1, 1)) || lower("substring"((actor.first_name)::text, 2))) || upper("substring"((actor.last_name)::text, 1, 1))) || lower("substring"((actor.last_name)::text, 2)))) AS actors - FROM ((((category - LEFT JOIN film_category ON ((category.category_id = film_category.category_id))) - LEFT JOIN film ON ((film_category.film_id = film.film_id))) - JOIN film_actor ON ((film.film_id = film_actor.film_id))) - JOIN actor ON ((film_actor.actor_id = actor.actor_id))) - GROUP BY film.film_id, film.title, film.description, category.name, film.rental_rate, film.length, film.rating; - """), where); - } - - /** - * Create an aliased <code>public.nicer_but_slower_film_list</code> table - * reference - */ - public NicerButSlowerFilmList(String alias) { - this(DSL.name(alias), NICER_BUT_SLOWER_FILM_LIST); - } - - /** - * Create an aliased <code>public.nicer_but_slower_film_list</code> table - * reference - */ - public NicerButSlowerFilmList(Name alias) { - this(alias, NICER_BUT_SLOWER_FILM_LIST); - } - - /** - * Create a <code>public.nicer_but_slower_film_list</code> table reference - */ - public NicerButSlowerFilmList() { - this(DSL.name("nicer_but_slower_film_list"), null); - } - - @Override - public Schema getSchema() { - return aliased() ? null : Public.PUBLIC; - } - - @Override - public NicerButSlowerFilmList as(String alias) { - return new NicerButSlowerFilmList(DSL.name(alias), this); - } - - @Override - public NicerButSlowerFilmList as(Name alias) { - return new NicerButSlowerFilmList(alias, this); - } - - @Override - public NicerButSlowerFilmList as(Table<?> alias) { - return new NicerButSlowerFilmList(alias.getQualifiedName(), this); - } - - /** - * Rename this table - */ - @Override - public NicerButSlowerFilmList rename(String name) { - return new NicerButSlowerFilmList(DSL.name(name), null); - } - - /** - * Rename this table - */ - @Override - public NicerButSlowerFilmList rename(Name name) { - return new NicerButSlowerFilmList(name, null); - } - - /** - * Rename this table - */ - @Override - public NicerButSlowerFilmList rename(Table<?> name) { - return new NicerButSlowerFilmList(name.getQualifiedName(), null); - } - - /** - * Create an inline derived table from this table - */ - @Override - public NicerButSlowerFilmList where(Condition condition) { - return new NicerButSlowerFilmList(getQualifiedName(), aliased() ? this : null, null, condition); - } - - /** - * Create an inline derived table from this table - */ - @Override - public NicerButSlowerFilmList where(Collection<? extends Condition> conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public NicerButSlowerFilmList where(Condition... conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public NicerButSlowerFilmList where(Field<Boolean> condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public NicerButSlowerFilmList where(SQL condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public NicerButSlowerFilmList where(@Stringly.SQL String condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public NicerButSlowerFilmList where(@Stringly.SQL String condition, Object... binds) { - return where(DSL.condition(condition, binds)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public NicerButSlowerFilmList where(@Stringly.SQL String condition, QueryPart... parts) { - return where(DSL.condition(condition, parts)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public NicerButSlowerFilmList whereExists(Select<?> select) { - return where(DSL.exists(select)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public NicerButSlowerFilmList whereNotExists(Select<?> select) { - return where(DSL.notExists(select)); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Payment.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Payment.java deleted file mode 100644 index 079d02c94d..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Payment.java +++ /dev/null @@ -1,342 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables; - - -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import no.sikt.graphitron.converters.ShortToIntegerConverter; -import no.sikt.graphitron.example.generated.jooq.Indexes; -import no.sikt.graphitron.example.generated.jooq.Keys; -import no.sikt.graphitron.example.generated.jooq.Public; -import no.sikt.graphitron.example.generated.jooq.tables.Customer.CustomerPath; -import no.sikt.graphitron.example.generated.jooq.tables.Rental.RentalPath; -import no.sikt.graphitron.example.generated.jooq.tables.Staff.StaffPath; -import no.sikt.graphitron.example.generated.jooq.tables.records.PaymentRecord; - -import org.jooq.Condition; -import org.jooq.Field; -import org.jooq.ForeignKey; -import org.jooq.Identity; -import org.jooq.Index; -import org.jooq.InverseForeignKey; -import org.jooq.Name; -import org.jooq.Path; -import org.jooq.PlainSQL; -import org.jooq.QueryPart; -import org.jooq.Record; -import org.jooq.SQL; -import org.jooq.Schema; -import org.jooq.Select; -import org.jooq.Stringly; -import org.jooq.Table; -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.UniqueKey; -import org.jooq.impl.DSL; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class Payment extends TableImpl<PaymentRecord> { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>public.payment</code> - */ - public static final Payment PAYMENT = new Payment(); - - /** - * The class holding records for this type - */ - @Override - public Class<PaymentRecord> getRecordType() { - return PaymentRecord.class; - } - - /** - * The column <code>public.payment.payment_id</code>. - */ - public final TableField<PaymentRecord, Integer> PAYMENT_ID = createField(DSL.name("payment_id"), SQLDataType.INTEGER.nullable(false).identity(true), this, ""); - - /** - * The column <code>public.payment.customer_id</code>. - */ - public final TableField<PaymentRecord, Integer> CUSTOMER_ID = createField(DSL.name("customer_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.payment.staff_id</code>. - */ - public final TableField<PaymentRecord, Integer> STAFF_ID = createField(DSL.name("staff_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.payment.rental_id</code>. - */ - public final TableField<PaymentRecord, Integer> RENTAL_ID = createField(DSL.name("rental_id"), SQLDataType.INTEGER.nullable(false), this, ""); - - /** - * The column <code>public.payment.amount</code>. - */ - public final TableField<PaymentRecord, BigDecimal> AMOUNT = createField(DSL.name("amount"), SQLDataType.NUMERIC(5, 2).nullable(false), this, ""); - - /** - * The column <code>public.payment.payment_date</code>. - */ - public final TableField<PaymentRecord, LocalDateTime> PAYMENT_DATE = createField(DSL.name("payment_date"), SQLDataType.LOCALDATETIME(6).nullable(false), this, ""); - - private Payment(Name alias, Table<PaymentRecord> aliased) { - this(alias, aliased, (Field<?>[]) null, null); - } - - private Payment(Name alias, Table<PaymentRecord> aliased, Field<?>[] parameters, Condition where) { - super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.table(), where); - } - - /** - * Create an aliased <code>public.payment</code> table reference - */ - public Payment(String alias) { - this(DSL.name(alias), PAYMENT); - } - - /** - * Create an aliased <code>public.payment</code> table reference - */ - public Payment(Name alias) { - this(alias, PAYMENT); - } - - /** - * Create a <code>public.payment</code> table reference - */ - public Payment() { - this(DSL.name("payment"), null); - } - - public <O extends Record> Payment(Table<O> path, ForeignKey<O, PaymentRecord> childPath, InverseForeignKey<O, PaymentRecord> parentPath) { - super(path, childPath, parentPath, PAYMENT); - } - - /** - * A subtype implementing {@link Path} for simplified path-based joins. - */ - public static class PaymentPath extends Payment implements Path<PaymentRecord> { - - private static final long serialVersionUID = 1L; - public <O extends Record> PaymentPath(Table<O> path, ForeignKey<O, PaymentRecord> childPath, InverseForeignKey<O, PaymentRecord> parentPath) { - super(path, childPath, parentPath); - } - private PaymentPath(Name alias, Table<PaymentRecord> aliased) { - super(alias, aliased); - } - - @Override - public PaymentPath as(String alias) { - return new PaymentPath(DSL.name(alias), this); - } - - @Override - public PaymentPath as(Name alias) { - return new PaymentPath(alias, this); - } - - @Override - public PaymentPath as(Table<?> alias) { - return new PaymentPath(alias.getQualifiedName(), this); - } - } - - @Override - public Schema getSchema() { - return aliased() ? null : Public.PUBLIC; - } - - @Override - public List<Index> getIndexes() { - return Arrays.asList(Indexes.IDX_FK_CUSTOMER_ID, Indexes.IDX_FK_STAFF_ID); - } - - @Override - public Identity<PaymentRecord, Integer> getIdentity() { - return (Identity<PaymentRecord, Integer>) super.getIdentity(); - } - - @Override - public UniqueKey<PaymentRecord> getPrimaryKey() { - return Keys.PAYMENT_PKEY; - } - - @Override - public List<ForeignKey<PaymentRecord, ?>> getReferences() { - return Arrays.asList(Keys.PAYMENT__PAYMENT_CUSTOMER_ID_FKEY, Keys.PAYMENT__PAYMENT_RENTAL_ID_FKEY, Keys.PAYMENT__PAYMENT_STAFF_ID_FKEY); - } - - private transient CustomerPath _customer; - - /** - * Get the implicit join path to the <code>public.customer</code> table. - */ - public CustomerPath customer() { - if (_customer == null) - _customer = new CustomerPath(this, Keys.PAYMENT__PAYMENT_CUSTOMER_ID_FKEY, null); - - return _customer; - } - - private transient RentalPath _rental; - - /** - * Get the implicit join path to the <code>public.rental</code> table. - */ - public RentalPath rental() { - if (_rental == null) - _rental = new RentalPath(this, Keys.PAYMENT__PAYMENT_RENTAL_ID_FKEY, null); - - return _rental; - } - - private transient StaffPath _staff; - - /** - * Get the implicit join path to the <code>public.staff</code> table. - */ - public StaffPath staff() { - if (_staff == null) - _staff = new StaffPath(this, Keys.PAYMENT__PAYMENT_STAFF_ID_FKEY, null); - - return _staff; - } - - @Override - public Payment as(String alias) { - return new Payment(DSL.name(alias), this); - } - - @Override - public Payment as(Name alias) { - return new Payment(alias, this); - } - - @Override - public Payment as(Table<?> alias) { - return new Payment(alias.getQualifiedName(), this); - } - - /** - * Rename this table - */ - @Override - public Payment rename(String name) { - return new Payment(DSL.name(name), null); - } - - /** - * Rename this table - */ - @Override - public Payment rename(Name name) { - return new Payment(name, null); - } - - /** - * Rename this table - */ - @Override - public Payment rename(Table<?> name) { - return new Payment(name.getQualifiedName(), null); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Payment where(Condition condition) { - return new Payment(getQualifiedName(), aliased() ? this : null, null, condition); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Payment where(Collection<? extends Condition> conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Payment where(Condition... conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Payment where(Field<Boolean> condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Payment where(SQL condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Payment where(@Stringly.SQL String condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Payment where(@Stringly.SQL String condition, Object... binds) { - return where(DSL.condition(condition, binds)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Payment where(@Stringly.SQL String condition, QueryPart... parts) { - return where(DSL.condition(condition, parts)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Payment whereExists(Select<?> select) { - return where(DSL.exists(select)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Payment whereNotExists(Select<?> select) { - return where(DSL.notExists(select)); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/PaymentP2007_01.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/PaymentP2007_01.java deleted file mode 100644 index 250785dad1..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/PaymentP2007_01.java +++ /dev/null @@ -1,345 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables; - - -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import no.sikt.graphitron.converters.ShortToIntegerConverter; -import no.sikt.graphitron.example.generated.jooq.Indexes; -import no.sikt.graphitron.example.generated.jooq.Keys; -import no.sikt.graphitron.example.generated.jooq.Public; -import no.sikt.graphitron.example.generated.jooq.tables.Customer.CustomerPath; -import no.sikt.graphitron.example.generated.jooq.tables.Rental.RentalPath; -import no.sikt.graphitron.example.generated.jooq.tables.Staff.StaffPath; -import no.sikt.graphitron.example.generated.jooq.tables.records.PaymentP2007_01Record; - -import org.jooq.Check; -import org.jooq.Condition; -import org.jooq.Field; -import org.jooq.ForeignKey; -import org.jooq.Identity; -import org.jooq.Index; -import org.jooq.InverseForeignKey; -import org.jooq.Name; -import org.jooq.Path; -import org.jooq.PlainSQL; -import org.jooq.QueryPart; -import org.jooq.Record; -import org.jooq.SQL; -import org.jooq.Schema; -import org.jooq.Select; -import org.jooq.Stringly; -import org.jooq.Table; -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.impl.DSL; -import org.jooq.impl.Internal; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class PaymentP2007_01 extends TableImpl<PaymentP2007_01Record> { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>public.payment_p2007_01</code> - */ - public static final PaymentP2007_01 PAYMENT_P2007_01 = new PaymentP2007_01(); - - /** - * The class holding records for this type - */ - @Override - public Class<PaymentP2007_01Record> getRecordType() { - return PaymentP2007_01Record.class; - } - - /** - * The column <code>public.payment_p2007_01.payment_id</code>. - */ - public final TableField<PaymentP2007_01Record, Integer> PAYMENT_ID = createField(DSL.name("payment_id"), SQLDataType.INTEGER.nullable(false).identity(true), this, ""); - - /** - * The column <code>public.payment_p2007_01.customer_id</code>. - */ - public final TableField<PaymentP2007_01Record, Integer> CUSTOMER_ID = createField(DSL.name("customer_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.payment_p2007_01.staff_id</code>. - */ - public final TableField<PaymentP2007_01Record, Integer> STAFF_ID = createField(DSL.name("staff_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.payment_p2007_01.rental_id</code>. - */ - public final TableField<PaymentP2007_01Record, Integer> RENTAL_ID = createField(DSL.name("rental_id"), SQLDataType.INTEGER.nullable(false), this, ""); - - /** - * The column <code>public.payment_p2007_01.amount</code>. - */ - public final TableField<PaymentP2007_01Record, BigDecimal> AMOUNT = createField(DSL.name("amount"), SQLDataType.NUMERIC(5, 2).nullable(false), this, ""); - - /** - * The column <code>public.payment_p2007_01.payment_date</code>. - */ - public final TableField<PaymentP2007_01Record, LocalDateTime> PAYMENT_DATE = createField(DSL.name("payment_date"), SQLDataType.LOCALDATETIME(6).nullable(false), this, ""); - - private PaymentP2007_01(Name alias, Table<PaymentP2007_01Record> aliased) { - this(alias, aliased, (Field<?>[]) null, null); - } - - private PaymentP2007_01(Name alias, Table<PaymentP2007_01Record> aliased, Field<?>[] parameters, Condition where) { - super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.table(), where); - } - - /** - * Create an aliased <code>public.payment_p2007_01</code> table reference - */ - public PaymentP2007_01(String alias) { - this(DSL.name(alias), PAYMENT_P2007_01); - } - - /** - * Create an aliased <code>public.payment_p2007_01</code> table reference - */ - public PaymentP2007_01(Name alias) { - this(alias, PAYMENT_P2007_01); - } - - /** - * Create a <code>public.payment_p2007_01</code> table reference - */ - public PaymentP2007_01() { - this(DSL.name("payment_p2007_01"), null); - } - - public <O extends Record> PaymentP2007_01(Table<O> path, ForeignKey<O, PaymentP2007_01Record> childPath, InverseForeignKey<O, PaymentP2007_01Record> parentPath) { - super(path, childPath, parentPath, PAYMENT_P2007_01); - } - - /** - * A subtype implementing {@link Path} for simplified path-based joins. - */ - public static class PaymentP2007_01Path extends PaymentP2007_01 implements Path<PaymentP2007_01Record> { - - private static final long serialVersionUID = 1L; - public <O extends Record> PaymentP2007_01Path(Table<O> path, ForeignKey<O, PaymentP2007_01Record> childPath, InverseForeignKey<O, PaymentP2007_01Record> parentPath) { - super(path, childPath, parentPath); - } - private PaymentP2007_01Path(Name alias, Table<PaymentP2007_01Record> aliased) { - super(alias, aliased); - } - - @Override - public PaymentP2007_01Path as(String alias) { - return new PaymentP2007_01Path(DSL.name(alias), this); - } - - @Override - public PaymentP2007_01Path as(Name alias) { - return new PaymentP2007_01Path(alias, this); - } - - @Override - public PaymentP2007_01Path as(Table<?> alias) { - return new PaymentP2007_01Path(alias.getQualifiedName(), this); - } - } - - @Override - public Schema getSchema() { - return aliased() ? null : Public.PUBLIC; - } - - @Override - public List<Index> getIndexes() { - return Arrays.asList(Indexes.IDX_FK_PAYMENT_P2007_01_CUSTOMER_ID, Indexes.IDX_FK_PAYMENT_P2007_01_STAFF_ID); - } - - @Override - public Identity<PaymentP2007_01Record, Integer> getIdentity() { - return (Identity<PaymentP2007_01Record, Integer>) super.getIdentity(); - } - - @Override - public List<ForeignKey<PaymentP2007_01Record, ?>> getReferences() { - return Arrays.asList(Keys.PAYMENT_P2007_01__PAYMENT_P2007_01_CUSTOMER_ID_FKEY, Keys.PAYMENT_P2007_01__PAYMENT_P2007_01_RENTAL_ID_FKEY, Keys.PAYMENT_P2007_01__PAYMENT_P2007_01_STAFF_ID_FKEY); - } - - private transient CustomerPath _customer; - - /** - * Get the implicit join path to the <code>public.customer</code> table. - */ - public CustomerPath customer() { - if (_customer == null) - _customer = new CustomerPath(this, Keys.PAYMENT_P2007_01__PAYMENT_P2007_01_CUSTOMER_ID_FKEY, null); - - return _customer; - } - - private transient RentalPath _rental; - - /** - * Get the implicit join path to the <code>public.rental</code> table. - */ - public RentalPath rental() { - if (_rental == null) - _rental = new RentalPath(this, Keys.PAYMENT_P2007_01__PAYMENT_P2007_01_RENTAL_ID_FKEY, null); - - return _rental; - } - - private transient StaffPath _staff; - - /** - * Get the implicit join path to the <code>public.staff</code> table. - */ - public StaffPath staff() { - if (_staff == null) - _staff = new StaffPath(this, Keys.PAYMENT_P2007_01__PAYMENT_P2007_01_STAFF_ID_FKEY, null); - - return _staff; - } - - @Override - public List<Check<PaymentP2007_01Record>> getChecks() { - return Arrays.asList( - Internal.createCheck(this, DSL.name("payment_p2007_01_payment_date_check"), "(((payment_date >= '2007-01-01 00:00:00'::timestamp without time zone) AND (payment_date < '2007-02-01 00:00:00'::timestamp without time zone)))", true) - ); - } - - @Override - public PaymentP2007_01 as(String alias) { - return new PaymentP2007_01(DSL.name(alias), this); - } - - @Override - public PaymentP2007_01 as(Name alias) { - return new PaymentP2007_01(alias, this); - } - - @Override - public PaymentP2007_01 as(Table<?> alias) { - return new PaymentP2007_01(alias.getQualifiedName(), this); - } - - /** - * Rename this table - */ - @Override - public PaymentP2007_01 rename(String name) { - return new PaymentP2007_01(DSL.name(name), null); - } - - /** - * Rename this table - */ - @Override - public PaymentP2007_01 rename(Name name) { - return new PaymentP2007_01(name, null); - } - - /** - * Rename this table - */ - @Override - public PaymentP2007_01 rename(Table<?> name) { - return new PaymentP2007_01(name.getQualifiedName(), null); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_01 where(Condition condition) { - return new PaymentP2007_01(getQualifiedName(), aliased() ? this : null, null, condition); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_01 where(Collection<? extends Condition> conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_01 where(Condition... conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_01 where(Field<Boolean> condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public PaymentP2007_01 where(SQL condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public PaymentP2007_01 where(@Stringly.SQL String condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public PaymentP2007_01 where(@Stringly.SQL String condition, Object... binds) { - return where(DSL.condition(condition, binds)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public PaymentP2007_01 where(@Stringly.SQL String condition, QueryPart... parts) { - return where(DSL.condition(condition, parts)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_01 whereExists(Select<?> select) { - return where(DSL.exists(select)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_01 whereNotExists(Select<?> select) { - return where(DSL.notExists(select)); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/PaymentP2007_02.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/PaymentP2007_02.java deleted file mode 100644 index 1d1c883506..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/PaymentP2007_02.java +++ /dev/null @@ -1,345 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables; - - -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import no.sikt.graphitron.converters.ShortToIntegerConverter; -import no.sikt.graphitron.example.generated.jooq.Indexes; -import no.sikt.graphitron.example.generated.jooq.Keys; -import no.sikt.graphitron.example.generated.jooq.Public; -import no.sikt.graphitron.example.generated.jooq.tables.Customer.CustomerPath; -import no.sikt.graphitron.example.generated.jooq.tables.Rental.RentalPath; -import no.sikt.graphitron.example.generated.jooq.tables.Staff.StaffPath; -import no.sikt.graphitron.example.generated.jooq.tables.records.PaymentP2007_02Record; - -import org.jooq.Check; -import org.jooq.Condition; -import org.jooq.Field; -import org.jooq.ForeignKey; -import org.jooq.Identity; -import org.jooq.Index; -import org.jooq.InverseForeignKey; -import org.jooq.Name; -import org.jooq.Path; -import org.jooq.PlainSQL; -import org.jooq.QueryPart; -import org.jooq.Record; -import org.jooq.SQL; -import org.jooq.Schema; -import org.jooq.Select; -import org.jooq.Stringly; -import org.jooq.Table; -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.impl.DSL; -import org.jooq.impl.Internal; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class PaymentP2007_02 extends TableImpl<PaymentP2007_02Record> { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>public.payment_p2007_02</code> - */ - public static final PaymentP2007_02 PAYMENT_P2007_02 = new PaymentP2007_02(); - - /** - * The class holding records for this type - */ - @Override - public Class<PaymentP2007_02Record> getRecordType() { - return PaymentP2007_02Record.class; - } - - /** - * The column <code>public.payment_p2007_02.payment_id</code>. - */ - public final TableField<PaymentP2007_02Record, Integer> PAYMENT_ID = createField(DSL.name("payment_id"), SQLDataType.INTEGER.nullable(false).identity(true), this, ""); - - /** - * The column <code>public.payment_p2007_02.customer_id</code>. - */ - public final TableField<PaymentP2007_02Record, Integer> CUSTOMER_ID = createField(DSL.name("customer_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.payment_p2007_02.staff_id</code>. - */ - public final TableField<PaymentP2007_02Record, Integer> STAFF_ID = createField(DSL.name("staff_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.payment_p2007_02.rental_id</code>. - */ - public final TableField<PaymentP2007_02Record, Integer> RENTAL_ID = createField(DSL.name("rental_id"), SQLDataType.INTEGER.nullable(false), this, ""); - - /** - * The column <code>public.payment_p2007_02.amount</code>. - */ - public final TableField<PaymentP2007_02Record, BigDecimal> AMOUNT = createField(DSL.name("amount"), SQLDataType.NUMERIC(5, 2).nullable(false), this, ""); - - /** - * The column <code>public.payment_p2007_02.payment_date</code>. - */ - public final TableField<PaymentP2007_02Record, LocalDateTime> PAYMENT_DATE = createField(DSL.name("payment_date"), SQLDataType.LOCALDATETIME(6).nullable(false), this, ""); - - private PaymentP2007_02(Name alias, Table<PaymentP2007_02Record> aliased) { - this(alias, aliased, (Field<?>[]) null, null); - } - - private PaymentP2007_02(Name alias, Table<PaymentP2007_02Record> aliased, Field<?>[] parameters, Condition where) { - super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.table(), where); - } - - /** - * Create an aliased <code>public.payment_p2007_02</code> table reference - */ - public PaymentP2007_02(String alias) { - this(DSL.name(alias), PAYMENT_P2007_02); - } - - /** - * Create an aliased <code>public.payment_p2007_02</code> table reference - */ - public PaymentP2007_02(Name alias) { - this(alias, PAYMENT_P2007_02); - } - - /** - * Create a <code>public.payment_p2007_02</code> table reference - */ - public PaymentP2007_02() { - this(DSL.name("payment_p2007_02"), null); - } - - public <O extends Record> PaymentP2007_02(Table<O> path, ForeignKey<O, PaymentP2007_02Record> childPath, InverseForeignKey<O, PaymentP2007_02Record> parentPath) { - super(path, childPath, parentPath, PAYMENT_P2007_02); - } - - /** - * A subtype implementing {@link Path} for simplified path-based joins. - */ - public static class PaymentP2007_02Path extends PaymentP2007_02 implements Path<PaymentP2007_02Record> { - - private static final long serialVersionUID = 1L; - public <O extends Record> PaymentP2007_02Path(Table<O> path, ForeignKey<O, PaymentP2007_02Record> childPath, InverseForeignKey<O, PaymentP2007_02Record> parentPath) { - super(path, childPath, parentPath); - } - private PaymentP2007_02Path(Name alias, Table<PaymentP2007_02Record> aliased) { - super(alias, aliased); - } - - @Override - public PaymentP2007_02Path as(String alias) { - return new PaymentP2007_02Path(DSL.name(alias), this); - } - - @Override - public PaymentP2007_02Path as(Name alias) { - return new PaymentP2007_02Path(alias, this); - } - - @Override - public PaymentP2007_02Path as(Table<?> alias) { - return new PaymentP2007_02Path(alias.getQualifiedName(), this); - } - } - - @Override - public Schema getSchema() { - return aliased() ? null : Public.PUBLIC; - } - - @Override - public List<Index> getIndexes() { - return Arrays.asList(Indexes.IDX_FK_PAYMENT_P2007_02_CUSTOMER_ID, Indexes.IDX_FK_PAYMENT_P2007_02_STAFF_ID); - } - - @Override - public Identity<PaymentP2007_02Record, Integer> getIdentity() { - return (Identity<PaymentP2007_02Record, Integer>) super.getIdentity(); - } - - @Override - public List<ForeignKey<PaymentP2007_02Record, ?>> getReferences() { - return Arrays.asList(Keys.PAYMENT_P2007_02__PAYMENT_P2007_02_CUSTOMER_ID_FKEY, Keys.PAYMENT_P2007_02__PAYMENT_P2007_02_RENTAL_ID_FKEY, Keys.PAYMENT_P2007_02__PAYMENT_P2007_02_STAFF_ID_FKEY); - } - - private transient CustomerPath _customer; - - /** - * Get the implicit join path to the <code>public.customer</code> table. - */ - public CustomerPath customer() { - if (_customer == null) - _customer = new CustomerPath(this, Keys.PAYMENT_P2007_02__PAYMENT_P2007_02_CUSTOMER_ID_FKEY, null); - - return _customer; - } - - private transient RentalPath _rental; - - /** - * Get the implicit join path to the <code>public.rental</code> table. - */ - public RentalPath rental() { - if (_rental == null) - _rental = new RentalPath(this, Keys.PAYMENT_P2007_02__PAYMENT_P2007_02_RENTAL_ID_FKEY, null); - - return _rental; - } - - private transient StaffPath _staff; - - /** - * Get the implicit join path to the <code>public.staff</code> table. - */ - public StaffPath staff() { - if (_staff == null) - _staff = new StaffPath(this, Keys.PAYMENT_P2007_02__PAYMENT_P2007_02_STAFF_ID_FKEY, null); - - return _staff; - } - - @Override - public List<Check<PaymentP2007_02Record>> getChecks() { - return Arrays.asList( - Internal.createCheck(this, DSL.name("payment_p2007_02_payment_date_check"), "(((payment_date >= '2007-02-01 00:00:00'::timestamp without time zone) AND (payment_date < '2007-03-01 00:00:00'::timestamp without time zone)))", true) - ); - } - - @Override - public PaymentP2007_02 as(String alias) { - return new PaymentP2007_02(DSL.name(alias), this); - } - - @Override - public PaymentP2007_02 as(Name alias) { - return new PaymentP2007_02(alias, this); - } - - @Override - public PaymentP2007_02 as(Table<?> alias) { - return new PaymentP2007_02(alias.getQualifiedName(), this); - } - - /** - * Rename this table - */ - @Override - public PaymentP2007_02 rename(String name) { - return new PaymentP2007_02(DSL.name(name), null); - } - - /** - * Rename this table - */ - @Override - public PaymentP2007_02 rename(Name name) { - return new PaymentP2007_02(name, null); - } - - /** - * Rename this table - */ - @Override - public PaymentP2007_02 rename(Table<?> name) { - return new PaymentP2007_02(name.getQualifiedName(), null); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_02 where(Condition condition) { - return new PaymentP2007_02(getQualifiedName(), aliased() ? this : null, null, condition); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_02 where(Collection<? extends Condition> conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_02 where(Condition... conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_02 where(Field<Boolean> condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public PaymentP2007_02 where(SQL condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public PaymentP2007_02 where(@Stringly.SQL String condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public PaymentP2007_02 where(@Stringly.SQL String condition, Object... binds) { - return where(DSL.condition(condition, binds)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public PaymentP2007_02 where(@Stringly.SQL String condition, QueryPart... parts) { - return where(DSL.condition(condition, parts)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_02 whereExists(Select<?> select) { - return where(DSL.exists(select)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_02 whereNotExists(Select<?> select) { - return where(DSL.notExists(select)); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/PaymentP2007_03.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/PaymentP2007_03.java deleted file mode 100644 index e55c955aa7..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/PaymentP2007_03.java +++ /dev/null @@ -1,345 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables; - - -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import no.sikt.graphitron.converters.ShortToIntegerConverter; -import no.sikt.graphitron.example.generated.jooq.Indexes; -import no.sikt.graphitron.example.generated.jooq.Keys; -import no.sikt.graphitron.example.generated.jooq.Public; -import no.sikt.graphitron.example.generated.jooq.tables.Customer.CustomerPath; -import no.sikt.graphitron.example.generated.jooq.tables.Rental.RentalPath; -import no.sikt.graphitron.example.generated.jooq.tables.Staff.StaffPath; -import no.sikt.graphitron.example.generated.jooq.tables.records.PaymentP2007_03Record; - -import org.jooq.Check; -import org.jooq.Condition; -import org.jooq.Field; -import org.jooq.ForeignKey; -import org.jooq.Identity; -import org.jooq.Index; -import org.jooq.InverseForeignKey; -import org.jooq.Name; -import org.jooq.Path; -import org.jooq.PlainSQL; -import org.jooq.QueryPart; -import org.jooq.Record; -import org.jooq.SQL; -import org.jooq.Schema; -import org.jooq.Select; -import org.jooq.Stringly; -import org.jooq.Table; -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.impl.DSL; -import org.jooq.impl.Internal; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class PaymentP2007_03 extends TableImpl<PaymentP2007_03Record> { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>public.payment_p2007_03</code> - */ - public static final PaymentP2007_03 PAYMENT_P2007_03 = new PaymentP2007_03(); - - /** - * The class holding records for this type - */ - @Override - public Class<PaymentP2007_03Record> getRecordType() { - return PaymentP2007_03Record.class; - } - - /** - * The column <code>public.payment_p2007_03.payment_id</code>. - */ - public final TableField<PaymentP2007_03Record, Integer> PAYMENT_ID = createField(DSL.name("payment_id"), SQLDataType.INTEGER.nullable(false).identity(true), this, ""); - - /** - * The column <code>public.payment_p2007_03.customer_id</code>. - */ - public final TableField<PaymentP2007_03Record, Integer> CUSTOMER_ID = createField(DSL.name("customer_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.payment_p2007_03.staff_id</code>. - */ - public final TableField<PaymentP2007_03Record, Integer> STAFF_ID = createField(DSL.name("staff_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.payment_p2007_03.rental_id</code>. - */ - public final TableField<PaymentP2007_03Record, Integer> RENTAL_ID = createField(DSL.name("rental_id"), SQLDataType.INTEGER.nullable(false), this, ""); - - /** - * The column <code>public.payment_p2007_03.amount</code>. - */ - public final TableField<PaymentP2007_03Record, BigDecimal> AMOUNT = createField(DSL.name("amount"), SQLDataType.NUMERIC(5, 2).nullable(false), this, ""); - - /** - * The column <code>public.payment_p2007_03.payment_date</code>. - */ - public final TableField<PaymentP2007_03Record, LocalDateTime> PAYMENT_DATE = createField(DSL.name("payment_date"), SQLDataType.LOCALDATETIME(6).nullable(false), this, ""); - - private PaymentP2007_03(Name alias, Table<PaymentP2007_03Record> aliased) { - this(alias, aliased, (Field<?>[]) null, null); - } - - private PaymentP2007_03(Name alias, Table<PaymentP2007_03Record> aliased, Field<?>[] parameters, Condition where) { - super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.table(), where); - } - - /** - * Create an aliased <code>public.payment_p2007_03</code> table reference - */ - public PaymentP2007_03(String alias) { - this(DSL.name(alias), PAYMENT_P2007_03); - } - - /** - * Create an aliased <code>public.payment_p2007_03</code> table reference - */ - public PaymentP2007_03(Name alias) { - this(alias, PAYMENT_P2007_03); - } - - /** - * Create a <code>public.payment_p2007_03</code> table reference - */ - public PaymentP2007_03() { - this(DSL.name("payment_p2007_03"), null); - } - - public <O extends Record> PaymentP2007_03(Table<O> path, ForeignKey<O, PaymentP2007_03Record> childPath, InverseForeignKey<O, PaymentP2007_03Record> parentPath) { - super(path, childPath, parentPath, PAYMENT_P2007_03); - } - - /** - * A subtype implementing {@link Path} for simplified path-based joins. - */ - public static class PaymentP2007_03Path extends PaymentP2007_03 implements Path<PaymentP2007_03Record> { - - private static final long serialVersionUID = 1L; - public <O extends Record> PaymentP2007_03Path(Table<O> path, ForeignKey<O, PaymentP2007_03Record> childPath, InverseForeignKey<O, PaymentP2007_03Record> parentPath) { - super(path, childPath, parentPath); - } - private PaymentP2007_03Path(Name alias, Table<PaymentP2007_03Record> aliased) { - super(alias, aliased); - } - - @Override - public PaymentP2007_03Path as(String alias) { - return new PaymentP2007_03Path(DSL.name(alias), this); - } - - @Override - public PaymentP2007_03Path as(Name alias) { - return new PaymentP2007_03Path(alias, this); - } - - @Override - public PaymentP2007_03Path as(Table<?> alias) { - return new PaymentP2007_03Path(alias.getQualifiedName(), this); - } - } - - @Override - public Schema getSchema() { - return aliased() ? null : Public.PUBLIC; - } - - @Override - public List<Index> getIndexes() { - return Arrays.asList(Indexes.IDX_FK_PAYMENT_P2007_03_CUSTOMER_ID, Indexes.IDX_FK_PAYMENT_P2007_03_STAFF_ID); - } - - @Override - public Identity<PaymentP2007_03Record, Integer> getIdentity() { - return (Identity<PaymentP2007_03Record, Integer>) super.getIdentity(); - } - - @Override - public List<ForeignKey<PaymentP2007_03Record, ?>> getReferences() { - return Arrays.asList(Keys.PAYMENT_P2007_03__PAYMENT_P2007_03_CUSTOMER_ID_FKEY, Keys.PAYMENT_P2007_03__PAYMENT_P2007_03_RENTAL_ID_FKEY, Keys.PAYMENT_P2007_03__PAYMENT_P2007_03_STAFF_ID_FKEY); - } - - private transient CustomerPath _customer; - - /** - * Get the implicit join path to the <code>public.customer</code> table. - */ - public CustomerPath customer() { - if (_customer == null) - _customer = new CustomerPath(this, Keys.PAYMENT_P2007_03__PAYMENT_P2007_03_CUSTOMER_ID_FKEY, null); - - return _customer; - } - - private transient RentalPath _rental; - - /** - * Get the implicit join path to the <code>public.rental</code> table. - */ - public RentalPath rental() { - if (_rental == null) - _rental = new RentalPath(this, Keys.PAYMENT_P2007_03__PAYMENT_P2007_03_RENTAL_ID_FKEY, null); - - return _rental; - } - - private transient StaffPath _staff; - - /** - * Get the implicit join path to the <code>public.staff</code> table. - */ - public StaffPath staff() { - if (_staff == null) - _staff = new StaffPath(this, Keys.PAYMENT_P2007_03__PAYMENT_P2007_03_STAFF_ID_FKEY, null); - - return _staff; - } - - @Override - public List<Check<PaymentP2007_03Record>> getChecks() { - return Arrays.asList( - Internal.createCheck(this, DSL.name("payment_p2007_03_payment_date_check"), "(((payment_date >= '2007-03-01 00:00:00'::timestamp without time zone) AND (payment_date < '2007-04-01 00:00:00'::timestamp without time zone)))", true) - ); - } - - @Override - public PaymentP2007_03 as(String alias) { - return new PaymentP2007_03(DSL.name(alias), this); - } - - @Override - public PaymentP2007_03 as(Name alias) { - return new PaymentP2007_03(alias, this); - } - - @Override - public PaymentP2007_03 as(Table<?> alias) { - return new PaymentP2007_03(alias.getQualifiedName(), this); - } - - /** - * Rename this table - */ - @Override - public PaymentP2007_03 rename(String name) { - return new PaymentP2007_03(DSL.name(name), null); - } - - /** - * Rename this table - */ - @Override - public PaymentP2007_03 rename(Name name) { - return new PaymentP2007_03(name, null); - } - - /** - * Rename this table - */ - @Override - public PaymentP2007_03 rename(Table<?> name) { - return new PaymentP2007_03(name.getQualifiedName(), null); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_03 where(Condition condition) { - return new PaymentP2007_03(getQualifiedName(), aliased() ? this : null, null, condition); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_03 where(Collection<? extends Condition> conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_03 where(Condition... conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_03 where(Field<Boolean> condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public PaymentP2007_03 where(SQL condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public PaymentP2007_03 where(@Stringly.SQL String condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public PaymentP2007_03 where(@Stringly.SQL String condition, Object... binds) { - return where(DSL.condition(condition, binds)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public PaymentP2007_03 where(@Stringly.SQL String condition, QueryPart... parts) { - return where(DSL.condition(condition, parts)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_03 whereExists(Select<?> select) { - return where(DSL.exists(select)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_03 whereNotExists(Select<?> select) { - return where(DSL.notExists(select)); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/PaymentP2007_04.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/PaymentP2007_04.java deleted file mode 100644 index 2692fd5b61..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/PaymentP2007_04.java +++ /dev/null @@ -1,345 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables; - - -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import no.sikt.graphitron.converters.ShortToIntegerConverter; -import no.sikt.graphitron.example.generated.jooq.Indexes; -import no.sikt.graphitron.example.generated.jooq.Keys; -import no.sikt.graphitron.example.generated.jooq.Public; -import no.sikt.graphitron.example.generated.jooq.tables.Customer.CustomerPath; -import no.sikt.graphitron.example.generated.jooq.tables.Rental.RentalPath; -import no.sikt.graphitron.example.generated.jooq.tables.Staff.StaffPath; -import no.sikt.graphitron.example.generated.jooq.tables.records.PaymentP2007_04Record; - -import org.jooq.Check; -import org.jooq.Condition; -import org.jooq.Field; -import org.jooq.ForeignKey; -import org.jooq.Identity; -import org.jooq.Index; -import org.jooq.InverseForeignKey; -import org.jooq.Name; -import org.jooq.Path; -import org.jooq.PlainSQL; -import org.jooq.QueryPart; -import org.jooq.Record; -import org.jooq.SQL; -import org.jooq.Schema; -import org.jooq.Select; -import org.jooq.Stringly; -import org.jooq.Table; -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.impl.DSL; -import org.jooq.impl.Internal; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class PaymentP2007_04 extends TableImpl<PaymentP2007_04Record> { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>public.payment_p2007_04</code> - */ - public static final PaymentP2007_04 PAYMENT_P2007_04 = new PaymentP2007_04(); - - /** - * The class holding records for this type - */ - @Override - public Class<PaymentP2007_04Record> getRecordType() { - return PaymentP2007_04Record.class; - } - - /** - * The column <code>public.payment_p2007_04.payment_id</code>. - */ - public final TableField<PaymentP2007_04Record, Integer> PAYMENT_ID = createField(DSL.name("payment_id"), SQLDataType.INTEGER.nullable(false).identity(true), this, ""); - - /** - * The column <code>public.payment_p2007_04.customer_id</code>. - */ - public final TableField<PaymentP2007_04Record, Integer> CUSTOMER_ID = createField(DSL.name("customer_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.payment_p2007_04.staff_id</code>. - */ - public final TableField<PaymentP2007_04Record, Integer> STAFF_ID = createField(DSL.name("staff_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.payment_p2007_04.rental_id</code>. - */ - public final TableField<PaymentP2007_04Record, Integer> RENTAL_ID = createField(DSL.name("rental_id"), SQLDataType.INTEGER.nullable(false), this, ""); - - /** - * The column <code>public.payment_p2007_04.amount</code>. - */ - public final TableField<PaymentP2007_04Record, BigDecimal> AMOUNT = createField(DSL.name("amount"), SQLDataType.NUMERIC(5, 2).nullable(false), this, ""); - - /** - * The column <code>public.payment_p2007_04.payment_date</code>. - */ - public final TableField<PaymentP2007_04Record, LocalDateTime> PAYMENT_DATE = createField(DSL.name("payment_date"), SQLDataType.LOCALDATETIME(6).nullable(false), this, ""); - - private PaymentP2007_04(Name alias, Table<PaymentP2007_04Record> aliased) { - this(alias, aliased, (Field<?>[]) null, null); - } - - private PaymentP2007_04(Name alias, Table<PaymentP2007_04Record> aliased, Field<?>[] parameters, Condition where) { - super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.table(), where); - } - - /** - * Create an aliased <code>public.payment_p2007_04</code> table reference - */ - public PaymentP2007_04(String alias) { - this(DSL.name(alias), PAYMENT_P2007_04); - } - - /** - * Create an aliased <code>public.payment_p2007_04</code> table reference - */ - public PaymentP2007_04(Name alias) { - this(alias, PAYMENT_P2007_04); - } - - /** - * Create a <code>public.payment_p2007_04</code> table reference - */ - public PaymentP2007_04() { - this(DSL.name("payment_p2007_04"), null); - } - - public <O extends Record> PaymentP2007_04(Table<O> path, ForeignKey<O, PaymentP2007_04Record> childPath, InverseForeignKey<O, PaymentP2007_04Record> parentPath) { - super(path, childPath, parentPath, PAYMENT_P2007_04); - } - - /** - * A subtype implementing {@link Path} for simplified path-based joins. - */ - public static class PaymentP2007_04Path extends PaymentP2007_04 implements Path<PaymentP2007_04Record> { - - private static final long serialVersionUID = 1L; - public <O extends Record> PaymentP2007_04Path(Table<O> path, ForeignKey<O, PaymentP2007_04Record> childPath, InverseForeignKey<O, PaymentP2007_04Record> parentPath) { - super(path, childPath, parentPath); - } - private PaymentP2007_04Path(Name alias, Table<PaymentP2007_04Record> aliased) { - super(alias, aliased); - } - - @Override - public PaymentP2007_04Path as(String alias) { - return new PaymentP2007_04Path(DSL.name(alias), this); - } - - @Override - public PaymentP2007_04Path as(Name alias) { - return new PaymentP2007_04Path(alias, this); - } - - @Override - public PaymentP2007_04Path as(Table<?> alias) { - return new PaymentP2007_04Path(alias.getQualifiedName(), this); - } - } - - @Override - public Schema getSchema() { - return aliased() ? null : Public.PUBLIC; - } - - @Override - public List<Index> getIndexes() { - return Arrays.asList(Indexes.IDX_FK_PAYMENT_P2007_04_CUSTOMER_ID, Indexes.IDX_FK_PAYMENT_P2007_04_STAFF_ID); - } - - @Override - public Identity<PaymentP2007_04Record, Integer> getIdentity() { - return (Identity<PaymentP2007_04Record, Integer>) super.getIdentity(); - } - - @Override - public List<ForeignKey<PaymentP2007_04Record, ?>> getReferences() { - return Arrays.asList(Keys.PAYMENT_P2007_04__PAYMENT_P2007_04_CUSTOMER_ID_FKEY, Keys.PAYMENT_P2007_04__PAYMENT_P2007_04_RENTAL_ID_FKEY, Keys.PAYMENT_P2007_04__PAYMENT_P2007_04_STAFF_ID_FKEY); - } - - private transient CustomerPath _customer; - - /** - * Get the implicit join path to the <code>public.customer</code> table. - */ - public CustomerPath customer() { - if (_customer == null) - _customer = new CustomerPath(this, Keys.PAYMENT_P2007_04__PAYMENT_P2007_04_CUSTOMER_ID_FKEY, null); - - return _customer; - } - - private transient RentalPath _rental; - - /** - * Get the implicit join path to the <code>public.rental</code> table. - */ - public RentalPath rental() { - if (_rental == null) - _rental = new RentalPath(this, Keys.PAYMENT_P2007_04__PAYMENT_P2007_04_RENTAL_ID_FKEY, null); - - return _rental; - } - - private transient StaffPath _staff; - - /** - * Get the implicit join path to the <code>public.staff</code> table. - */ - public StaffPath staff() { - if (_staff == null) - _staff = new StaffPath(this, Keys.PAYMENT_P2007_04__PAYMENT_P2007_04_STAFF_ID_FKEY, null); - - return _staff; - } - - @Override - public List<Check<PaymentP2007_04Record>> getChecks() { - return Arrays.asList( - Internal.createCheck(this, DSL.name("payment_p2007_04_payment_date_check"), "(((payment_date >= '2007-04-01 00:00:00'::timestamp without time zone) AND (payment_date < '2007-05-01 00:00:00'::timestamp without time zone)))", true) - ); - } - - @Override - public PaymentP2007_04 as(String alias) { - return new PaymentP2007_04(DSL.name(alias), this); - } - - @Override - public PaymentP2007_04 as(Name alias) { - return new PaymentP2007_04(alias, this); - } - - @Override - public PaymentP2007_04 as(Table<?> alias) { - return new PaymentP2007_04(alias.getQualifiedName(), this); - } - - /** - * Rename this table - */ - @Override - public PaymentP2007_04 rename(String name) { - return new PaymentP2007_04(DSL.name(name), null); - } - - /** - * Rename this table - */ - @Override - public PaymentP2007_04 rename(Name name) { - return new PaymentP2007_04(name, null); - } - - /** - * Rename this table - */ - @Override - public PaymentP2007_04 rename(Table<?> name) { - return new PaymentP2007_04(name.getQualifiedName(), null); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_04 where(Condition condition) { - return new PaymentP2007_04(getQualifiedName(), aliased() ? this : null, null, condition); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_04 where(Collection<? extends Condition> conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_04 where(Condition... conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_04 where(Field<Boolean> condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public PaymentP2007_04 where(SQL condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public PaymentP2007_04 where(@Stringly.SQL String condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public PaymentP2007_04 where(@Stringly.SQL String condition, Object... binds) { - return where(DSL.condition(condition, binds)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public PaymentP2007_04 where(@Stringly.SQL String condition, QueryPart... parts) { - return where(DSL.condition(condition, parts)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_04 whereExists(Select<?> select) { - return where(DSL.exists(select)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_04 whereNotExists(Select<?> select) { - return where(DSL.notExists(select)); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/PaymentP2007_05.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/PaymentP2007_05.java deleted file mode 100644 index 3f5e855aef..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/PaymentP2007_05.java +++ /dev/null @@ -1,345 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables; - - -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import no.sikt.graphitron.converters.ShortToIntegerConverter; -import no.sikt.graphitron.example.generated.jooq.Indexes; -import no.sikt.graphitron.example.generated.jooq.Keys; -import no.sikt.graphitron.example.generated.jooq.Public; -import no.sikt.graphitron.example.generated.jooq.tables.Customer.CustomerPath; -import no.sikt.graphitron.example.generated.jooq.tables.Rental.RentalPath; -import no.sikt.graphitron.example.generated.jooq.tables.Staff.StaffPath; -import no.sikt.graphitron.example.generated.jooq.tables.records.PaymentP2007_05Record; - -import org.jooq.Check; -import org.jooq.Condition; -import org.jooq.Field; -import org.jooq.ForeignKey; -import org.jooq.Identity; -import org.jooq.Index; -import org.jooq.InverseForeignKey; -import org.jooq.Name; -import org.jooq.Path; -import org.jooq.PlainSQL; -import org.jooq.QueryPart; -import org.jooq.Record; -import org.jooq.SQL; -import org.jooq.Schema; -import org.jooq.Select; -import org.jooq.Stringly; -import org.jooq.Table; -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.impl.DSL; -import org.jooq.impl.Internal; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class PaymentP2007_05 extends TableImpl<PaymentP2007_05Record> { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>public.payment_p2007_05</code> - */ - public static final PaymentP2007_05 PAYMENT_P2007_05 = new PaymentP2007_05(); - - /** - * The class holding records for this type - */ - @Override - public Class<PaymentP2007_05Record> getRecordType() { - return PaymentP2007_05Record.class; - } - - /** - * The column <code>public.payment_p2007_05.payment_id</code>. - */ - public final TableField<PaymentP2007_05Record, Integer> PAYMENT_ID = createField(DSL.name("payment_id"), SQLDataType.INTEGER.nullable(false).identity(true), this, ""); - - /** - * The column <code>public.payment_p2007_05.customer_id</code>. - */ - public final TableField<PaymentP2007_05Record, Integer> CUSTOMER_ID = createField(DSL.name("customer_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.payment_p2007_05.staff_id</code>. - */ - public final TableField<PaymentP2007_05Record, Integer> STAFF_ID = createField(DSL.name("staff_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.payment_p2007_05.rental_id</code>. - */ - public final TableField<PaymentP2007_05Record, Integer> RENTAL_ID = createField(DSL.name("rental_id"), SQLDataType.INTEGER.nullable(false), this, ""); - - /** - * The column <code>public.payment_p2007_05.amount</code>. - */ - public final TableField<PaymentP2007_05Record, BigDecimal> AMOUNT = createField(DSL.name("amount"), SQLDataType.NUMERIC(5, 2).nullable(false), this, ""); - - /** - * The column <code>public.payment_p2007_05.payment_date</code>. - */ - public final TableField<PaymentP2007_05Record, LocalDateTime> PAYMENT_DATE = createField(DSL.name("payment_date"), SQLDataType.LOCALDATETIME(6).nullable(false), this, ""); - - private PaymentP2007_05(Name alias, Table<PaymentP2007_05Record> aliased) { - this(alias, aliased, (Field<?>[]) null, null); - } - - private PaymentP2007_05(Name alias, Table<PaymentP2007_05Record> aliased, Field<?>[] parameters, Condition where) { - super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.table(), where); - } - - /** - * Create an aliased <code>public.payment_p2007_05</code> table reference - */ - public PaymentP2007_05(String alias) { - this(DSL.name(alias), PAYMENT_P2007_05); - } - - /** - * Create an aliased <code>public.payment_p2007_05</code> table reference - */ - public PaymentP2007_05(Name alias) { - this(alias, PAYMENT_P2007_05); - } - - /** - * Create a <code>public.payment_p2007_05</code> table reference - */ - public PaymentP2007_05() { - this(DSL.name("payment_p2007_05"), null); - } - - public <O extends Record> PaymentP2007_05(Table<O> path, ForeignKey<O, PaymentP2007_05Record> childPath, InverseForeignKey<O, PaymentP2007_05Record> parentPath) { - super(path, childPath, parentPath, PAYMENT_P2007_05); - } - - /** - * A subtype implementing {@link Path} for simplified path-based joins. - */ - public static class PaymentP2007_05Path extends PaymentP2007_05 implements Path<PaymentP2007_05Record> { - - private static final long serialVersionUID = 1L; - public <O extends Record> PaymentP2007_05Path(Table<O> path, ForeignKey<O, PaymentP2007_05Record> childPath, InverseForeignKey<O, PaymentP2007_05Record> parentPath) { - super(path, childPath, parentPath); - } - private PaymentP2007_05Path(Name alias, Table<PaymentP2007_05Record> aliased) { - super(alias, aliased); - } - - @Override - public PaymentP2007_05Path as(String alias) { - return new PaymentP2007_05Path(DSL.name(alias), this); - } - - @Override - public PaymentP2007_05Path as(Name alias) { - return new PaymentP2007_05Path(alias, this); - } - - @Override - public PaymentP2007_05Path as(Table<?> alias) { - return new PaymentP2007_05Path(alias.getQualifiedName(), this); - } - } - - @Override - public Schema getSchema() { - return aliased() ? null : Public.PUBLIC; - } - - @Override - public List<Index> getIndexes() { - return Arrays.asList(Indexes.IDX_FK_PAYMENT_P2007_05_CUSTOMER_ID, Indexes.IDX_FK_PAYMENT_P2007_05_STAFF_ID); - } - - @Override - public Identity<PaymentP2007_05Record, Integer> getIdentity() { - return (Identity<PaymentP2007_05Record, Integer>) super.getIdentity(); - } - - @Override - public List<ForeignKey<PaymentP2007_05Record, ?>> getReferences() { - return Arrays.asList(Keys.PAYMENT_P2007_05__PAYMENT_P2007_05_CUSTOMER_ID_FKEY, Keys.PAYMENT_P2007_05__PAYMENT_P2007_05_RENTAL_ID_FKEY, Keys.PAYMENT_P2007_05__PAYMENT_P2007_05_STAFF_ID_FKEY); - } - - private transient CustomerPath _customer; - - /** - * Get the implicit join path to the <code>public.customer</code> table. - */ - public CustomerPath customer() { - if (_customer == null) - _customer = new CustomerPath(this, Keys.PAYMENT_P2007_05__PAYMENT_P2007_05_CUSTOMER_ID_FKEY, null); - - return _customer; - } - - private transient RentalPath _rental; - - /** - * Get the implicit join path to the <code>public.rental</code> table. - */ - public RentalPath rental() { - if (_rental == null) - _rental = new RentalPath(this, Keys.PAYMENT_P2007_05__PAYMENT_P2007_05_RENTAL_ID_FKEY, null); - - return _rental; - } - - private transient StaffPath _staff; - - /** - * Get the implicit join path to the <code>public.staff</code> table. - */ - public StaffPath staff() { - if (_staff == null) - _staff = new StaffPath(this, Keys.PAYMENT_P2007_05__PAYMENT_P2007_05_STAFF_ID_FKEY, null); - - return _staff; - } - - @Override - public List<Check<PaymentP2007_05Record>> getChecks() { - return Arrays.asList( - Internal.createCheck(this, DSL.name("payment_p2007_05_payment_date_check"), "(((payment_date >= '2007-05-01 00:00:00'::timestamp without time zone) AND (payment_date < '2007-06-01 00:00:00'::timestamp without time zone)))", true) - ); - } - - @Override - public PaymentP2007_05 as(String alias) { - return new PaymentP2007_05(DSL.name(alias), this); - } - - @Override - public PaymentP2007_05 as(Name alias) { - return new PaymentP2007_05(alias, this); - } - - @Override - public PaymentP2007_05 as(Table<?> alias) { - return new PaymentP2007_05(alias.getQualifiedName(), this); - } - - /** - * Rename this table - */ - @Override - public PaymentP2007_05 rename(String name) { - return new PaymentP2007_05(DSL.name(name), null); - } - - /** - * Rename this table - */ - @Override - public PaymentP2007_05 rename(Name name) { - return new PaymentP2007_05(name, null); - } - - /** - * Rename this table - */ - @Override - public PaymentP2007_05 rename(Table<?> name) { - return new PaymentP2007_05(name.getQualifiedName(), null); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_05 where(Condition condition) { - return new PaymentP2007_05(getQualifiedName(), aliased() ? this : null, null, condition); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_05 where(Collection<? extends Condition> conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_05 where(Condition... conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_05 where(Field<Boolean> condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public PaymentP2007_05 where(SQL condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public PaymentP2007_05 where(@Stringly.SQL String condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public PaymentP2007_05 where(@Stringly.SQL String condition, Object... binds) { - return where(DSL.condition(condition, binds)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public PaymentP2007_05 where(@Stringly.SQL String condition, QueryPart... parts) { - return where(DSL.condition(condition, parts)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_05 whereExists(Select<?> select) { - return where(DSL.exists(select)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_05 whereNotExists(Select<?> select) { - return where(DSL.notExists(select)); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/PaymentP2007_06.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/PaymentP2007_06.java deleted file mode 100644 index cea12c90b2..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/PaymentP2007_06.java +++ /dev/null @@ -1,345 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables; - - -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import no.sikt.graphitron.converters.ShortToIntegerConverter; -import no.sikt.graphitron.example.generated.jooq.Indexes; -import no.sikt.graphitron.example.generated.jooq.Keys; -import no.sikt.graphitron.example.generated.jooq.Public; -import no.sikt.graphitron.example.generated.jooq.tables.Customer.CustomerPath; -import no.sikt.graphitron.example.generated.jooq.tables.Rental.RentalPath; -import no.sikt.graphitron.example.generated.jooq.tables.Staff.StaffPath; -import no.sikt.graphitron.example.generated.jooq.tables.records.PaymentP2007_06Record; - -import org.jooq.Check; -import org.jooq.Condition; -import org.jooq.Field; -import org.jooq.ForeignKey; -import org.jooq.Identity; -import org.jooq.Index; -import org.jooq.InverseForeignKey; -import org.jooq.Name; -import org.jooq.Path; -import org.jooq.PlainSQL; -import org.jooq.QueryPart; -import org.jooq.Record; -import org.jooq.SQL; -import org.jooq.Schema; -import org.jooq.Select; -import org.jooq.Stringly; -import org.jooq.Table; -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.impl.DSL; -import org.jooq.impl.Internal; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class PaymentP2007_06 extends TableImpl<PaymentP2007_06Record> { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>public.payment_p2007_06</code> - */ - public static final PaymentP2007_06 PAYMENT_P2007_06 = new PaymentP2007_06(); - - /** - * The class holding records for this type - */ - @Override - public Class<PaymentP2007_06Record> getRecordType() { - return PaymentP2007_06Record.class; - } - - /** - * The column <code>public.payment_p2007_06.payment_id</code>. - */ - public final TableField<PaymentP2007_06Record, Integer> PAYMENT_ID = createField(DSL.name("payment_id"), SQLDataType.INTEGER.nullable(false).identity(true), this, ""); - - /** - * The column <code>public.payment_p2007_06.customer_id</code>. - */ - public final TableField<PaymentP2007_06Record, Integer> CUSTOMER_ID = createField(DSL.name("customer_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.payment_p2007_06.staff_id</code>. - */ - public final TableField<PaymentP2007_06Record, Integer> STAFF_ID = createField(DSL.name("staff_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.payment_p2007_06.rental_id</code>. - */ - public final TableField<PaymentP2007_06Record, Integer> RENTAL_ID = createField(DSL.name("rental_id"), SQLDataType.INTEGER.nullable(false), this, ""); - - /** - * The column <code>public.payment_p2007_06.amount</code>. - */ - public final TableField<PaymentP2007_06Record, BigDecimal> AMOUNT = createField(DSL.name("amount"), SQLDataType.NUMERIC(5, 2).nullable(false), this, ""); - - /** - * The column <code>public.payment_p2007_06.payment_date</code>. - */ - public final TableField<PaymentP2007_06Record, LocalDateTime> PAYMENT_DATE = createField(DSL.name("payment_date"), SQLDataType.LOCALDATETIME(6).nullable(false), this, ""); - - private PaymentP2007_06(Name alias, Table<PaymentP2007_06Record> aliased) { - this(alias, aliased, (Field<?>[]) null, null); - } - - private PaymentP2007_06(Name alias, Table<PaymentP2007_06Record> aliased, Field<?>[] parameters, Condition where) { - super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.table(), where); - } - - /** - * Create an aliased <code>public.payment_p2007_06</code> table reference - */ - public PaymentP2007_06(String alias) { - this(DSL.name(alias), PAYMENT_P2007_06); - } - - /** - * Create an aliased <code>public.payment_p2007_06</code> table reference - */ - public PaymentP2007_06(Name alias) { - this(alias, PAYMENT_P2007_06); - } - - /** - * Create a <code>public.payment_p2007_06</code> table reference - */ - public PaymentP2007_06() { - this(DSL.name("payment_p2007_06"), null); - } - - public <O extends Record> PaymentP2007_06(Table<O> path, ForeignKey<O, PaymentP2007_06Record> childPath, InverseForeignKey<O, PaymentP2007_06Record> parentPath) { - super(path, childPath, parentPath, PAYMENT_P2007_06); - } - - /** - * A subtype implementing {@link Path} for simplified path-based joins. - */ - public static class PaymentP2007_06Path extends PaymentP2007_06 implements Path<PaymentP2007_06Record> { - - private static final long serialVersionUID = 1L; - public <O extends Record> PaymentP2007_06Path(Table<O> path, ForeignKey<O, PaymentP2007_06Record> childPath, InverseForeignKey<O, PaymentP2007_06Record> parentPath) { - super(path, childPath, parentPath); - } - private PaymentP2007_06Path(Name alias, Table<PaymentP2007_06Record> aliased) { - super(alias, aliased); - } - - @Override - public PaymentP2007_06Path as(String alias) { - return new PaymentP2007_06Path(DSL.name(alias), this); - } - - @Override - public PaymentP2007_06Path as(Name alias) { - return new PaymentP2007_06Path(alias, this); - } - - @Override - public PaymentP2007_06Path as(Table<?> alias) { - return new PaymentP2007_06Path(alias.getQualifiedName(), this); - } - } - - @Override - public Schema getSchema() { - return aliased() ? null : Public.PUBLIC; - } - - @Override - public List<Index> getIndexes() { - return Arrays.asList(Indexes.IDX_FK_PAYMENT_P2007_06_CUSTOMER_ID, Indexes.IDX_FK_PAYMENT_P2007_06_STAFF_ID); - } - - @Override - public Identity<PaymentP2007_06Record, Integer> getIdentity() { - return (Identity<PaymentP2007_06Record, Integer>) super.getIdentity(); - } - - @Override - public List<ForeignKey<PaymentP2007_06Record, ?>> getReferences() { - return Arrays.asList(Keys.PAYMENT_P2007_06__PAYMENT_P2007_06_CUSTOMER_ID_FKEY, Keys.PAYMENT_P2007_06__PAYMENT_P2007_06_RENTAL_ID_FKEY, Keys.PAYMENT_P2007_06__PAYMENT_P2007_06_STAFF_ID_FKEY); - } - - private transient CustomerPath _customer; - - /** - * Get the implicit join path to the <code>public.customer</code> table. - */ - public CustomerPath customer() { - if (_customer == null) - _customer = new CustomerPath(this, Keys.PAYMENT_P2007_06__PAYMENT_P2007_06_CUSTOMER_ID_FKEY, null); - - return _customer; - } - - private transient RentalPath _rental; - - /** - * Get the implicit join path to the <code>public.rental</code> table. - */ - public RentalPath rental() { - if (_rental == null) - _rental = new RentalPath(this, Keys.PAYMENT_P2007_06__PAYMENT_P2007_06_RENTAL_ID_FKEY, null); - - return _rental; - } - - private transient StaffPath _staff; - - /** - * Get the implicit join path to the <code>public.staff</code> table. - */ - public StaffPath staff() { - if (_staff == null) - _staff = new StaffPath(this, Keys.PAYMENT_P2007_06__PAYMENT_P2007_06_STAFF_ID_FKEY, null); - - return _staff; - } - - @Override - public List<Check<PaymentP2007_06Record>> getChecks() { - return Arrays.asList( - Internal.createCheck(this, DSL.name("payment_p2007_06_payment_date_check"), "(((payment_date >= '2007-06-01 00:00:00'::timestamp without time zone) AND (payment_date < '2007-07-01 00:00:00'::timestamp without time zone)))", true) - ); - } - - @Override - public PaymentP2007_06 as(String alias) { - return new PaymentP2007_06(DSL.name(alias), this); - } - - @Override - public PaymentP2007_06 as(Name alias) { - return new PaymentP2007_06(alias, this); - } - - @Override - public PaymentP2007_06 as(Table<?> alias) { - return new PaymentP2007_06(alias.getQualifiedName(), this); - } - - /** - * Rename this table - */ - @Override - public PaymentP2007_06 rename(String name) { - return new PaymentP2007_06(DSL.name(name), null); - } - - /** - * Rename this table - */ - @Override - public PaymentP2007_06 rename(Name name) { - return new PaymentP2007_06(name, null); - } - - /** - * Rename this table - */ - @Override - public PaymentP2007_06 rename(Table<?> name) { - return new PaymentP2007_06(name.getQualifiedName(), null); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_06 where(Condition condition) { - return new PaymentP2007_06(getQualifiedName(), aliased() ? this : null, null, condition); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_06 where(Collection<? extends Condition> conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_06 where(Condition... conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_06 where(Field<Boolean> condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public PaymentP2007_06 where(SQL condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public PaymentP2007_06 where(@Stringly.SQL String condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public PaymentP2007_06 where(@Stringly.SQL String condition, Object... binds) { - return where(DSL.condition(condition, binds)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public PaymentP2007_06 where(@Stringly.SQL String condition, QueryPart... parts) { - return where(DSL.condition(condition, parts)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_06 whereExists(Select<?> select) { - return where(DSL.exists(select)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public PaymentP2007_06 whereNotExists(Select<?> select) { - return where(DSL.notExists(select)); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Rental.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Rental.java deleted file mode 100644 index fb9f1bd411..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Rental.java +++ /dev/null @@ -1,444 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables; - - -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import no.sikt.graphitron.converters.ShortToIntegerConverter; -import no.sikt.graphitron.example.generated.jooq.Indexes; -import no.sikt.graphitron.example.generated.jooq.Keys; -import no.sikt.graphitron.example.generated.jooq.Public; -import no.sikt.graphitron.example.generated.jooq.tables.Customer.CustomerPath; -import no.sikt.graphitron.example.generated.jooq.tables.Inventory.InventoryPath; -import no.sikt.graphitron.example.generated.jooq.tables.Payment.PaymentPath; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_01.PaymentP2007_01Path; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_02.PaymentP2007_02Path; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_03.PaymentP2007_03Path; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_04.PaymentP2007_04Path; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_05.PaymentP2007_05Path; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_06.PaymentP2007_06Path; -import no.sikt.graphitron.example.generated.jooq.tables.Staff.StaffPath; -import no.sikt.graphitron.example.generated.jooq.tables.records.RentalRecord; - -import org.jooq.Condition; -import org.jooq.Field; -import org.jooq.ForeignKey; -import org.jooq.Identity; -import org.jooq.Index; -import org.jooq.InverseForeignKey; -import org.jooq.Name; -import org.jooq.Path; -import org.jooq.PlainSQL; -import org.jooq.QueryPart; -import org.jooq.Record; -import org.jooq.SQL; -import org.jooq.Schema; -import org.jooq.Select; -import org.jooq.Stringly; -import org.jooq.Table; -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.UniqueKey; -import org.jooq.impl.DSL; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class Rental extends TableImpl<RentalRecord> { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>public.rental</code> - */ - public static final Rental RENTAL = new Rental(); - - /** - * The class holding records for this type - */ - @Override - public Class<RentalRecord> getRecordType() { - return RentalRecord.class; - } - - /** - * The column <code>public.rental.rental_id</code>. - */ - public final TableField<RentalRecord, Integer> RENTAL_ID = createField(DSL.name("rental_id"), SQLDataType.INTEGER.nullable(false).identity(true), this, ""); - - /** - * The column <code>public.rental.rental_date</code>. - */ - public final TableField<RentalRecord, LocalDateTime> RENTAL_DATE = createField(DSL.name("rental_date"), SQLDataType.LOCALDATETIME(6).nullable(false), this, ""); - - /** - * The column <code>public.rental.inventory_id</code>. - */ - public final TableField<RentalRecord, Integer> INVENTORY_ID = createField(DSL.name("inventory_id"), SQLDataType.INTEGER.nullable(false), this, ""); - - /** - * The column <code>public.rental.customer_id</code>. - */ - public final TableField<RentalRecord, Integer> CUSTOMER_ID = createField(DSL.name("customer_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.rental.return_date</code>. - */ - public final TableField<RentalRecord, LocalDateTime> RETURN_DATE = createField(DSL.name("return_date"), SQLDataType.LOCALDATETIME(6), this, ""); - - /** - * The column <code>public.rental.staff_id</code>. - */ - public final TableField<RentalRecord, Integer> STAFF_ID = createField(DSL.name("staff_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.rental.last_update</code>. - */ - public final TableField<RentalRecord, LocalDateTime> LAST_UPDATE = createField(DSL.name("last_update"), SQLDataType.LOCALDATETIME(6).nullable(false).defaultValue(DSL.field(DSL.raw("now()"), SQLDataType.LOCALDATETIME)), this, ""); - - private Rental(Name alias, Table<RentalRecord> aliased) { - this(alias, aliased, (Field<?>[]) null, null); - } - - private Rental(Name alias, Table<RentalRecord> aliased, Field<?>[] parameters, Condition where) { - super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.table(), where); - } - - /** - * Create an aliased <code>public.rental</code> table reference - */ - public Rental(String alias) { - this(DSL.name(alias), RENTAL); - } - - /** - * Create an aliased <code>public.rental</code> table reference - */ - public Rental(Name alias) { - this(alias, RENTAL); - } - - /** - * Create a <code>public.rental</code> table reference - */ - public Rental() { - this(DSL.name("rental"), null); - } - - public <O extends Record> Rental(Table<O> path, ForeignKey<O, RentalRecord> childPath, InverseForeignKey<O, RentalRecord> parentPath) { - super(path, childPath, parentPath, RENTAL); - } - - /** - * A subtype implementing {@link Path} for simplified path-based joins. - */ - public static class RentalPath extends Rental implements Path<RentalRecord> { - - private static final long serialVersionUID = 1L; - public <O extends Record> RentalPath(Table<O> path, ForeignKey<O, RentalRecord> childPath, InverseForeignKey<O, RentalRecord> parentPath) { - super(path, childPath, parentPath); - } - private RentalPath(Name alias, Table<RentalRecord> aliased) { - super(alias, aliased); - } - - @Override - public RentalPath as(String alias) { - return new RentalPath(DSL.name(alias), this); - } - - @Override - public RentalPath as(Name alias) { - return new RentalPath(alias, this); - } - - @Override - public RentalPath as(Table<?> alias) { - return new RentalPath(alias.getQualifiedName(), this); - } - } - - @Override - public Schema getSchema() { - return aliased() ? null : Public.PUBLIC; - } - - @Override - public List<Index> getIndexes() { - return Arrays.asList(Indexes.IDX_FK_INVENTORY_ID, Indexes.IDX_UNQ_RENTAL_RENTAL_DATE_INVENTORY_ID_CUSTOMER_ID); - } - - @Override - public Identity<RentalRecord, Integer> getIdentity() { - return (Identity<RentalRecord, Integer>) super.getIdentity(); - } - - @Override - public UniqueKey<RentalRecord> getPrimaryKey() { - return Keys.RENTAL_PKEY; - } - - @Override - public List<ForeignKey<RentalRecord, ?>> getReferences() { - return Arrays.asList(Keys.RENTAL__RENTAL_CUSTOMER_ID_FKEY, Keys.RENTAL__RENTAL_INVENTORY_ID_FKEY, Keys.RENTAL__RENTAL_STAFF_ID_FKEY); - } - - private transient CustomerPath _customer; - - /** - * Get the implicit join path to the <code>public.customer</code> table. - */ - public CustomerPath customer() { - if (_customer == null) - _customer = new CustomerPath(this, Keys.RENTAL__RENTAL_CUSTOMER_ID_FKEY, null); - - return _customer; - } - - private transient InventoryPath _inventory; - - /** - * Get the implicit join path to the <code>public.inventory</code> table. - */ - public InventoryPath inventory() { - if (_inventory == null) - _inventory = new InventoryPath(this, Keys.RENTAL__RENTAL_INVENTORY_ID_FKEY, null); - - return _inventory; - } - - private transient StaffPath _staff; - - /** - * Get the implicit join path to the <code>public.staff</code> table. - */ - public StaffPath staff() { - if (_staff == null) - _staff = new StaffPath(this, Keys.RENTAL__RENTAL_STAFF_ID_FKEY, null); - - return _staff; - } - - private transient PaymentP2007_01Path _paymentP2007_01; - - /** - * Get the implicit to-many join path to the - * <code>public.payment_p2007_01</code> table - */ - public PaymentP2007_01Path paymentP2007_01() { - if (_paymentP2007_01 == null) - _paymentP2007_01 = new PaymentP2007_01Path(this, null, Keys.PAYMENT_P2007_01__PAYMENT_P2007_01_RENTAL_ID_FKEY.getInverseKey()); - - return _paymentP2007_01; - } - - private transient PaymentP2007_02Path _paymentP2007_02; - - /** - * Get the implicit to-many join path to the - * <code>public.payment_p2007_02</code> table - */ - public PaymentP2007_02Path paymentP2007_02() { - if (_paymentP2007_02 == null) - _paymentP2007_02 = new PaymentP2007_02Path(this, null, Keys.PAYMENT_P2007_02__PAYMENT_P2007_02_RENTAL_ID_FKEY.getInverseKey()); - - return _paymentP2007_02; - } - - private transient PaymentP2007_03Path _paymentP2007_03; - - /** - * Get the implicit to-many join path to the - * <code>public.payment_p2007_03</code> table - */ - public PaymentP2007_03Path paymentP2007_03() { - if (_paymentP2007_03 == null) - _paymentP2007_03 = new PaymentP2007_03Path(this, null, Keys.PAYMENT_P2007_03__PAYMENT_P2007_03_RENTAL_ID_FKEY.getInverseKey()); - - return _paymentP2007_03; - } - - private transient PaymentP2007_04Path _paymentP2007_04; - - /** - * Get the implicit to-many join path to the - * <code>public.payment_p2007_04</code> table - */ - public PaymentP2007_04Path paymentP2007_04() { - if (_paymentP2007_04 == null) - _paymentP2007_04 = new PaymentP2007_04Path(this, null, Keys.PAYMENT_P2007_04__PAYMENT_P2007_04_RENTAL_ID_FKEY.getInverseKey()); - - return _paymentP2007_04; - } - - private transient PaymentP2007_05Path _paymentP2007_05; - - /** - * Get the implicit to-many join path to the - * <code>public.payment_p2007_05</code> table - */ - public PaymentP2007_05Path paymentP2007_05() { - if (_paymentP2007_05 == null) - _paymentP2007_05 = new PaymentP2007_05Path(this, null, Keys.PAYMENT_P2007_05__PAYMENT_P2007_05_RENTAL_ID_FKEY.getInverseKey()); - - return _paymentP2007_05; - } - - private transient PaymentP2007_06Path _paymentP2007_06; - - /** - * Get the implicit to-many join path to the - * <code>public.payment_p2007_06</code> table - */ - public PaymentP2007_06Path paymentP2007_06() { - if (_paymentP2007_06 == null) - _paymentP2007_06 = new PaymentP2007_06Path(this, null, Keys.PAYMENT_P2007_06__PAYMENT_P2007_06_RENTAL_ID_FKEY.getInverseKey()); - - return _paymentP2007_06; - } - - private transient PaymentPath _payment; - - /** - * Get the implicit to-many join path to the <code>public.payment</code> - * table - */ - public PaymentPath payment() { - if (_payment == null) - _payment = new PaymentPath(this, null, Keys.PAYMENT__PAYMENT_RENTAL_ID_FKEY.getInverseKey()); - - return _payment; - } - - @Override - public Rental as(String alias) { - return new Rental(DSL.name(alias), this); - } - - @Override - public Rental as(Name alias) { - return new Rental(alias, this); - } - - @Override - public Rental as(Table<?> alias) { - return new Rental(alias.getQualifiedName(), this); - } - - /** - * Rename this table - */ - @Override - public Rental rename(String name) { - return new Rental(DSL.name(name), null); - } - - /** - * Rename this table - */ - @Override - public Rental rename(Name name) { - return new Rental(name, null); - } - - /** - * Rename this table - */ - @Override - public Rental rename(Table<?> name) { - return new Rental(name.getQualifiedName(), null); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Rental where(Condition condition) { - return new Rental(getQualifiedName(), aliased() ? this : null, null, condition); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Rental where(Collection<? extends Condition> conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Rental where(Condition... conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Rental where(Field<Boolean> condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Rental where(SQL condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Rental where(@Stringly.SQL String condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Rental where(@Stringly.SQL String condition, Object... binds) { - return where(DSL.condition(condition, binds)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Rental where(@Stringly.SQL String condition, QueryPart... parts) { - return where(DSL.condition(condition, parts)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Rental whereExists(Select<?> select) { - return where(DSL.exists(select)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Rental whereNotExists(Select<?> select) { - return where(DSL.notExists(select)); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/RewardsReport.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/RewardsReport.java deleted file mode 100644 index 8c7d76536f..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/RewardsReport.java +++ /dev/null @@ -1,223 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables; - - -import java.math.BigDecimal; -import java.time.LocalDate; -import java.time.LocalDateTime; - -import no.sikt.graphitron.converters.ShortToIntegerConverter; -import no.sikt.graphitron.example.generated.jooq.Public; -import no.sikt.graphitron.example.generated.jooq.tables.records.CustomerRecord; - -import org.jooq.Condition; -import org.jooq.Field; -import org.jooq.Identity; -import org.jooq.Name; -import org.jooq.Schema; -import org.jooq.Table; -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.impl.DSL; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class RewardsReport extends TableImpl<CustomerRecord> { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>public.rewards_report</code> - */ - public static final RewardsReport REWARDS_REPORT = new RewardsReport(); - - /** - * The class holding records for this type - */ - @Override - public Class<CustomerRecord> getRecordType() { - return CustomerRecord.class; - } - - /** - * The column <code>public.rewards_report.customer_id</code>. - */ - public final TableField<CustomerRecord, Integer> CUSTOMER_ID = createField(DSL.name("customer_id"), SQLDataType.INTEGER.nullable(false).identity(true).defaultValue(DSL.field(DSL.raw("nextval('customer_customer_id_seq'::regclass)"), SQLDataType.INTEGER)), this, ""); - - /** - * The column <code>public.rewards_report.store_id</code>. - */ - public final TableField<CustomerRecord, Integer> STORE_ID = createField(DSL.name("store_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.rewards_report.first_name</code>. - */ - public final TableField<CustomerRecord, String> FIRST_NAME = createField(DSL.name("first_name"), SQLDataType.VARCHAR(45).nullable(false), this, ""); - - /** - * The column <code>public.rewards_report.last_name</code>. - */ - public final TableField<CustomerRecord, String> LAST_NAME = createField(DSL.name("last_name"), SQLDataType.VARCHAR(45).nullable(false), this, ""); - - /** - * The column <code>public.rewards_report.email</code>. - */ - public final TableField<CustomerRecord, String> EMAIL = createField(DSL.name("email"), SQLDataType.VARCHAR(50), this, ""); - - /** - * The column <code>public.rewards_report.address_id</code>. - */ - public final TableField<CustomerRecord, Integer> ADDRESS_ID = createField(DSL.name("address_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.rewards_report.activebool</code>. - */ - public final TableField<CustomerRecord, Boolean> ACTIVEBOOL = createField(DSL.name("activebool"), SQLDataType.BOOLEAN.nullable(false).defaultValue(DSL.field(DSL.raw("true"), SQLDataType.BOOLEAN)), this, ""); - - /** - * The column <code>public.rewards_report.create_date</code>. - */ - public final TableField<CustomerRecord, LocalDate> CREATE_DATE = createField(DSL.name("create_date"), SQLDataType.LOCALDATE.nullable(false).defaultValue(DSL.field(DSL.raw("('now'::text)::date"), SQLDataType.LOCALDATE)), this, ""); - - /** - * The column <code>public.rewards_report.last_update</code>. - */ - public final TableField<CustomerRecord, LocalDateTime> LAST_UPDATE = createField(DSL.name("last_update"), SQLDataType.LOCALDATETIME(6).defaultValue(DSL.field(DSL.raw("now()"), SQLDataType.LOCALDATETIME)), this, ""); - - /** - * The column <code>public.rewards_report.active</code>. - */ - public final TableField<CustomerRecord, Integer> ACTIVE = createField(DSL.name("active"), SQLDataType.INTEGER, this, ""); - - /** - * The column <code>public.rewards_report.usernames</code>. - */ - public final TableField<CustomerRecord, String[]> USERNAMES = createField(DSL.name("usernames"), SQLDataType.CLOB.array(), this, ""); - - /** - * The column <code>public.rewards_report.past_address_ids</code>. - */ - public final TableField<CustomerRecord, Integer[]> PAST_ADDRESS_IDS = createField(DSL.name("past_address_ids"), SQLDataType.INTEGER.array(), this, ""); - - private RewardsReport(Name alias, Table<CustomerRecord> aliased) { - this(alias, aliased, new Field[] { - DSL.val(null, SQLDataType.INTEGER), - DSL.val(null, SQLDataType.NUMERIC) - }); - } - - private RewardsReport(Name alias, Table<CustomerRecord> aliased, Field<?>[] parameters) { - this(alias, aliased, parameters, null); - } - - private RewardsReport(Name alias, Table<CustomerRecord> aliased, Field<?>[] parameters, Condition where) { - super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.function(), where); - } - - /** - * Create an aliased <code>public.rewards_report</code> table reference - */ - public RewardsReport(String alias) { - this(DSL.name(alias), REWARDS_REPORT); - } - - /** - * Create an aliased <code>public.rewards_report</code> table reference - */ - public RewardsReport(Name alias) { - this(alias, REWARDS_REPORT); - } - - /** - * Create a <code>public.rewards_report</code> table reference - */ - public RewardsReport() { - this(DSL.name("rewards_report"), null); - } - - @Override - public Schema getSchema() { - return aliased() ? null : Public.PUBLIC; - } - - @Override - public Identity<CustomerRecord, Integer> getIdentity() { - return (Identity<CustomerRecord, Integer>) super.getIdentity(); - } - - @Override - public RewardsReport as(String alias) { - return new RewardsReport(DSL.name(alias), this, parameters); - } - - @Override - public RewardsReport as(Name alias) { - return new RewardsReport(alias, this, parameters); - } - - @Override - public RewardsReport as(Table<?> alias) { - return new RewardsReport(alias.getQualifiedName(), this, parameters); - } - - /** - * Rename this table - */ - @Override - public RewardsReport rename(String name) { - return new RewardsReport(DSL.name(name), null, parameters); - } - - /** - * Rename this table - */ - @Override - public RewardsReport rename(Name name) { - return new RewardsReport(name, null, parameters); - } - - /** - * Rename this table - */ - @Override - public RewardsReport rename(Table<?> name) { - return new RewardsReport(name.getQualifiedName(), null, parameters); - } - - /** - * Call this table-valued function - */ - public RewardsReport call( - Integer minMonthlyPurchases - , BigDecimal minDollarAmountPurchased - ) { - RewardsReport result = new RewardsReport(DSL.name("rewards_report"), null, new Field[] { - DSL.val(minMonthlyPurchases, SQLDataType.INTEGER), - DSL.val(minDollarAmountPurchased, SQLDataType.NUMERIC) - }); - - return aliased() ? result.as(getUnqualifiedName()) : result; - } - - /** - * Call this table-valued function - */ - public RewardsReport call( - Field<Integer> minMonthlyPurchases - , Field<BigDecimal> minDollarAmountPurchased - ) { - RewardsReport result = new RewardsReport(DSL.name("rewards_report"), null, new Field[] { - minMonthlyPurchases, - minDollarAmountPurchased - }); - - return aliased() ? result.as(getUnqualifiedName()) : result; - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/SalesByFilmCategory.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/SalesByFilmCategory.java deleted file mode 100644 index 7c198c2511..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/SalesByFilmCategory.java +++ /dev/null @@ -1,230 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables; - - -import java.math.BigDecimal; -import java.util.Collection; - -import no.sikt.graphitron.example.generated.jooq.Public; -import no.sikt.graphitron.example.generated.jooq.tables.records.SalesByFilmCategoryRecord; - -import org.jooq.Condition; -import org.jooq.Field; -import org.jooq.Name; -import org.jooq.PlainSQL; -import org.jooq.QueryPart; -import org.jooq.SQL; -import org.jooq.Schema; -import org.jooq.Select; -import org.jooq.Stringly; -import org.jooq.Table; -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.impl.DSL; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class SalesByFilmCategory extends TableImpl<SalesByFilmCategoryRecord> { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>public.sales_by_film_category</code> - */ - public static final SalesByFilmCategory SALES_BY_FILM_CATEGORY = new SalesByFilmCategory(); - - /** - * The class holding records for this type - */ - @Override - public Class<SalesByFilmCategoryRecord> getRecordType() { - return SalesByFilmCategoryRecord.class; - } - - /** - * The column <code>public.sales_by_film_category.category</code>. - */ - public final TableField<SalesByFilmCategoryRecord, String> CATEGORY = createField(DSL.name("category"), SQLDataType.VARCHAR(25), this, ""); - - /** - * The column <code>public.sales_by_film_category.total_sales</code>. - */ - public final TableField<SalesByFilmCategoryRecord, BigDecimal> TOTAL_SALES = createField(DSL.name("total_sales"), SQLDataType.NUMERIC, this, ""); - - private SalesByFilmCategory(Name alias, Table<SalesByFilmCategoryRecord> aliased) { - this(alias, aliased, (Field<?>[]) null, null); - } - - private SalesByFilmCategory(Name alias, Table<SalesByFilmCategoryRecord> aliased, Field<?>[] parameters, Condition where) { - super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.view(""" - CREATE VIEW "sales_by_film_category" AS SELECT c.name AS category, - sum(p.amount) AS total_sales - FROM (((((payment p - JOIN rental r ON ((p.rental_id = r.rental_id))) - JOIN inventory i ON ((r.inventory_id = i.inventory_id))) - JOIN film f ON ((i.film_id = f.film_id))) - JOIN film_category fc ON ((f.film_id = fc.film_id))) - JOIN category c ON ((fc.category_id = c.category_id))) - GROUP BY c.name - ORDER BY (sum(p.amount)) DESC; - """), where); - } - - /** - * Create an aliased <code>public.sales_by_film_category</code> table - * reference - */ - public SalesByFilmCategory(String alias) { - this(DSL.name(alias), SALES_BY_FILM_CATEGORY); - } - - /** - * Create an aliased <code>public.sales_by_film_category</code> table - * reference - */ - public SalesByFilmCategory(Name alias) { - this(alias, SALES_BY_FILM_CATEGORY); - } - - /** - * Create a <code>public.sales_by_film_category</code> table reference - */ - public SalesByFilmCategory() { - this(DSL.name("sales_by_film_category"), null); - } - - @Override - public Schema getSchema() { - return aliased() ? null : Public.PUBLIC; - } - - @Override - public SalesByFilmCategory as(String alias) { - return new SalesByFilmCategory(DSL.name(alias), this); - } - - @Override - public SalesByFilmCategory as(Name alias) { - return new SalesByFilmCategory(alias, this); - } - - @Override - public SalesByFilmCategory as(Table<?> alias) { - return new SalesByFilmCategory(alias.getQualifiedName(), this); - } - - /** - * Rename this table - */ - @Override - public SalesByFilmCategory rename(String name) { - return new SalesByFilmCategory(DSL.name(name), null); - } - - /** - * Rename this table - */ - @Override - public SalesByFilmCategory rename(Name name) { - return new SalesByFilmCategory(name, null); - } - - /** - * Rename this table - */ - @Override - public SalesByFilmCategory rename(Table<?> name) { - return new SalesByFilmCategory(name.getQualifiedName(), null); - } - - /** - * Create an inline derived table from this table - */ - @Override - public SalesByFilmCategory where(Condition condition) { - return new SalesByFilmCategory(getQualifiedName(), aliased() ? this : null, null, condition); - } - - /** - * Create an inline derived table from this table - */ - @Override - public SalesByFilmCategory where(Collection<? extends Condition> conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public SalesByFilmCategory where(Condition... conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public SalesByFilmCategory where(Field<Boolean> condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public SalesByFilmCategory where(SQL condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public SalesByFilmCategory where(@Stringly.SQL String condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public SalesByFilmCategory where(@Stringly.SQL String condition, Object... binds) { - return where(DSL.condition(condition, binds)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public SalesByFilmCategory where(@Stringly.SQL String condition, QueryPart... parts) { - return where(DSL.condition(condition, parts)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public SalesByFilmCategory whereExists(Select<?> select) { - return where(DSL.exists(select)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public SalesByFilmCategory whereNotExists(Select<?> select) { - return where(DSL.notExists(select)); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/SalesByStore.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/SalesByStore.java deleted file mode 100644 index e83d875772..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/SalesByStore.java +++ /dev/null @@ -1,236 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables; - - -import java.math.BigDecimal; -import java.util.Collection; - -import no.sikt.graphitron.example.generated.jooq.Public; -import no.sikt.graphitron.example.generated.jooq.tables.records.SalesByStoreRecord; - -import org.jooq.Condition; -import org.jooq.Field; -import org.jooq.Name; -import org.jooq.PlainSQL; -import org.jooq.QueryPart; -import org.jooq.SQL; -import org.jooq.Schema; -import org.jooq.Select; -import org.jooq.Stringly; -import org.jooq.Table; -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.impl.DSL; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class SalesByStore extends TableImpl<SalesByStoreRecord> { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>public.sales_by_store</code> - */ - public static final SalesByStore SALES_BY_STORE = new SalesByStore(); - - /** - * The class holding records for this type - */ - @Override - public Class<SalesByStoreRecord> getRecordType() { - return SalesByStoreRecord.class; - } - - /** - * The column <code>public.sales_by_store.store</code>. - */ - public final TableField<SalesByStoreRecord, String> STORE = createField(DSL.name("store"), SQLDataType.CLOB, this, ""); - - /** - * The column <code>public.sales_by_store.manager</code>. - */ - public final TableField<SalesByStoreRecord, String> MANAGER = createField(DSL.name("manager"), SQLDataType.CLOB, this, ""); - - /** - * The column <code>public.sales_by_store.total_sales</code>. - */ - public final TableField<SalesByStoreRecord, BigDecimal> TOTAL_SALES = createField(DSL.name("total_sales"), SQLDataType.NUMERIC, this, ""); - - private SalesByStore(Name alias, Table<SalesByStoreRecord> aliased) { - this(alias, aliased, (Field<?>[]) null, null); - } - - private SalesByStore(Name alias, Table<SalesByStoreRecord> aliased, Field<?>[] parameters, Condition where) { - super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.view(""" - CREATE VIEW "sales_by_store" AS SELECT (((c.city)::text || ','::text) || (cy.country)::text) AS store, - (((m.first_name)::text || ' '::text) || (m.last_name)::text) AS manager, - sum(p.amount) AS total_sales - FROM (((((((payment p - JOIN rental r ON ((p.rental_id = r.rental_id))) - JOIN inventory i ON ((r.inventory_id = i.inventory_id))) - JOIN store s ON ((i.store_id = s.store_id))) - JOIN address a ON ((s.address_id = a.address_id))) - JOIN city c ON ((a.city_id = c.city_id))) - JOIN country cy ON ((c.country_id = cy.country_id))) - JOIN staff m ON ((s.manager_staff_id = m.staff_id))) - GROUP BY cy.country, c.city, s.store_id, m.first_name, m.last_name - ORDER BY cy.country, c.city; - """), where); - } - - /** - * Create an aliased <code>public.sales_by_store</code> table reference - */ - public SalesByStore(String alias) { - this(DSL.name(alias), SALES_BY_STORE); - } - - /** - * Create an aliased <code>public.sales_by_store</code> table reference - */ - public SalesByStore(Name alias) { - this(alias, SALES_BY_STORE); - } - - /** - * Create a <code>public.sales_by_store</code> table reference - */ - public SalesByStore() { - this(DSL.name("sales_by_store"), null); - } - - @Override - public Schema getSchema() { - return aliased() ? null : Public.PUBLIC; - } - - @Override - public SalesByStore as(String alias) { - return new SalesByStore(DSL.name(alias), this); - } - - @Override - public SalesByStore as(Name alias) { - return new SalesByStore(alias, this); - } - - @Override - public SalesByStore as(Table<?> alias) { - return new SalesByStore(alias.getQualifiedName(), this); - } - - /** - * Rename this table - */ - @Override - public SalesByStore rename(String name) { - return new SalesByStore(DSL.name(name), null); - } - - /** - * Rename this table - */ - @Override - public SalesByStore rename(Name name) { - return new SalesByStore(name, null); - } - - /** - * Rename this table - */ - @Override - public SalesByStore rename(Table<?> name) { - return new SalesByStore(name.getQualifiedName(), null); - } - - /** - * Create an inline derived table from this table - */ - @Override - public SalesByStore where(Condition condition) { - return new SalesByStore(getQualifiedName(), aliased() ? this : null, null, condition); - } - - /** - * Create an inline derived table from this table - */ - @Override - public SalesByStore where(Collection<? extends Condition> conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public SalesByStore where(Condition... conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public SalesByStore where(Field<Boolean> condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public SalesByStore where(SQL condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public SalesByStore where(@Stringly.SQL String condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public SalesByStore where(@Stringly.SQL String condition, Object... binds) { - return where(DSL.condition(condition, binds)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public SalesByStore where(@Stringly.SQL String condition, QueryPart... parts) { - return where(DSL.condition(condition, parts)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public SalesByStore whereExists(Select<?> select) { - return where(DSL.exists(select)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public SalesByStore whereNotExists(Select<?> select) { - return where(DSL.notExists(select)); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Staff.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Staff.java deleted file mode 100644 index da250d41c0..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Staff.java +++ /dev/null @@ -1,458 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables; - - -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import no.sikt.graphitron.converters.ShortToIntegerConverter; -import no.sikt.graphitron.example.generated.jooq.Keys; -import no.sikt.graphitron.example.generated.jooq.Public; -import no.sikt.graphitron.example.generated.jooq.tables.Address.AddressPath; -import no.sikt.graphitron.example.generated.jooq.tables.Payment.PaymentPath; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_01.PaymentP2007_01Path; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_02.PaymentP2007_02Path; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_03.PaymentP2007_03Path; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_04.PaymentP2007_04Path; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_05.PaymentP2007_05Path; -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_06.PaymentP2007_06Path; -import no.sikt.graphitron.example.generated.jooq.tables.Rental.RentalPath; -import no.sikt.graphitron.example.generated.jooq.tables.Store.StorePath; -import no.sikt.graphitron.example.generated.jooq.tables.records.StaffRecord; - -import org.jooq.Condition; -import org.jooq.Field; -import org.jooq.ForeignKey; -import org.jooq.Identity; -import org.jooq.InverseForeignKey; -import org.jooq.Name; -import org.jooq.Path; -import org.jooq.PlainSQL; -import org.jooq.QueryPart; -import org.jooq.Record; -import org.jooq.SQL; -import org.jooq.Schema; -import org.jooq.Select; -import org.jooq.Stringly; -import org.jooq.Table; -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.UniqueKey; -import org.jooq.impl.DSL; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class Staff extends TableImpl<StaffRecord> { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>public.staff</code> - */ - public static final Staff STAFF = new Staff(); - - /** - * The class holding records for this type - */ - @Override - public Class<StaffRecord> getRecordType() { - return StaffRecord.class; - } - - /** - * The column <code>public.staff.staff_id</code>. - */ - public final TableField<StaffRecord, Integer> STAFF_ID = createField(DSL.name("staff_id"), SQLDataType.INTEGER.nullable(false).identity(true), this, ""); - - /** - * The column <code>public.staff.first_name</code>. - */ - public final TableField<StaffRecord, String> FIRST_NAME = createField(DSL.name("first_name"), SQLDataType.VARCHAR(45).nullable(false), this, ""); - - /** - * The column <code>public.staff.last_name</code>. - */ - public final TableField<StaffRecord, String> LAST_NAME = createField(DSL.name("last_name"), SQLDataType.VARCHAR(45).nullable(false), this, ""); - - /** - * The column <code>public.staff.address_id</code>. - */ - public final TableField<StaffRecord, Integer> ADDRESS_ID = createField(DSL.name("address_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.staff.email</code>. - */ - public final TableField<StaffRecord, String> EMAIL = createField(DSL.name("email"), SQLDataType.VARCHAR(50), this, ""); - - /** - * The column <code>public.staff.store_id</code>. - */ - public final TableField<StaffRecord, Integer> STORE_ID = createField(DSL.name("store_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.staff.active</code>. - */ - public final TableField<StaffRecord, Boolean> ACTIVE = createField(DSL.name("active"), SQLDataType.BOOLEAN.nullable(false).defaultValue(DSL.field(DSL.raw("true"), SQLDataType.BOOLEAN)), this, ""); - - /** - * The column <code>public.staff.username</code>. - */ - public final TableField<StaffRecord, String> USERNAME = createField(DSL.name("username"), SQLDataType.VARCHAR(16).nullable(false), this, ""); - - /** - * The column <code>public.staff.password</code>. - */ - public final TableField<StaffRecord, String> PASSWORD = createField(DSL.name("password"), SQLDataType.VARCHAR(40), this, ""); - - /** - * The column <code>public.staff.last_update</code>. - */ - public final TableField<StaffRecord, LocalDateTime> LAST_UPDATE = createField(DSL.name("last_update"), SQLDataType.LOCALDATETIME(6).nullable(false).defaultValue(DSL.field(DSL.raw("now()"), SQLDataType.LOCALDATETIME)), this, ""); - - /** - * The column <code>public.staff.picture</code>. - */ - public final TableField<StaffRecord, byte[]> PICTURE = createField(DSL.name("picture"), SQLDataType.BLOB, this, ""); - - private Staff(Name alias, Table<StaffRecord> aliased) { - this(alias, aliased, (Field<?>[]) null, null); - } - - private Staff(Name alias, Table<StaffRecord> aliased, Field<?>[] parameters, Condition where) { - super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.table(), where); - } - - /** - * Create an aliased <code>public.staff</code> table reference - */ - public Staff(String alias) { - this(DSL.name(alias), STAFF); - } - - /** - * Create an aliased <code>public.staff</code> table reference - */ - public Staff(Name alias) { - this(alias, STAFF); - } - - /** - * Create a <code>public.staff</code> table reference - */ - public Staff() { - this(DSL.name("staff"), null); - } - - public <O extends Record> Staff(Table<O> path, ForeignKey<O, StaffRecord> childPath, InverseForeignKey<O, StaffRecord> parentPath) { - super(path, childPath, parentPath, STAFF); - } - - /** - * A subtype implementing {@link Path} for simplified path-based joins. - */ - public static class StaffPath extends Staff implements Path<StaffRecord> { - - private static final long serialVersionUID = 1L; - public <O extends Record> StaffPath(Table<O> path, ForeignKey<O, StaffRecord> childPath, InverseForeignKey<O, StaffRecord> parentPath) { - super(path, childPath, parentPath); - } - private StaffPath(Name alias, Table<StaffRecord> aliased) { - super(alias, aliased); - } - - @Override - public StaffPath as(String alias) { - return new StaffPath(DSL.name(alias), this); - } - - @Override - public StaffPath as(Name alias) { - return new StaffPath(alias, this); - } - - @Override - public StaffPath as(Table<?> alias) { - return new StaffPath(alias.getQualifiedName(), this); - } - } - - @Override - public Schema getSchema() { - return aliased() ? null : Public.PUBLIC; - } - - @Override - public Identity<StaffRecord, Integer> getIdentity() { - return (Identity<StaffRecord, Integer>) super.getIdentity(); - } - - @Override - public UniqueKey<StaffRecord> getPrimaryKey() { - return Keys.STAFF_PKEY; - } - - @Override - public List<ForeignKey<StaffRecord, ?>> getReferences() { - return Arrays.asList(Keys.STAFF__STAFF_ADDRESS_ID_FKEY, Keys.STAFF__STAFF_STORE_ID_FKEY); - } - - private transient AddressPath _address; - - /** - * Get the implicit join path to the <code>public.address</code> table. - */ - public AddressPath address() { - if (_address == null) - _address = new AddressPath(this, Keys.STAFF__STAFF_ADDRESS_ID_FKEY, null); - - return _address; - } - - private transient StorePath _store; - - /** - * Get the implicit join path to the <code>public.store</code> table. - */ - public StorePath store() { - if (_store == null) - _store = new StorePath(this, Keys.STAFF__STAFF_STORE_ID_FKEY, null); - - return _store; - } - - private transient PaymentP2007_01Path _paymentP2007_01; - - /** - * Get the implicit to-many join path to the - * <code>public.payment_p2007_01</code> table - */ - public PaymentP2007_01Path paymentP2007_01() { - if (_paymentP2007_01 == null) - _paymentP2007_01 = new PaymentP2007_01Path(this, null, Keys.PAYMENT_P2007_01__PAYMENT_P2007_01_STAFF_ID_FKEY.getInverseKey()); - - return _paymentP2007_01; - } - - private transient PaymentP2007_02Path _paymentP2007_02; - - /** - * Get the implicit to-many join path to the - * <code>public.payment_p2007_02</code> table - */ - public PaymentP2007_02Path paymentP2007_02() { - if (_paymentP2007_02 == null) - _paymentP2007_02 = new PaymentP2007_02Path(this, null, Keys.PAYMENT_P2007_02__PAYMENT_P2007_02_STAFF_ID_FKEY.getInverseKey()); - - return _paymentP2007_02; - } - - private transient PaymentP2007_03Path _paymentP2007_03; - - /** - * Get the implicit to-many join path to the - * <code>public.payment_p2007_03</code> table - */ - public PaymentP2007_03Path paymentP2007_03() { - if (_paymentP2007_03 == null) - _paymentP2007_03 = new PaymentP2007_03Path(this, null, Keys.PAYMENT_P2007_03__PAYMENT_P2007_03_STAFF_ID_FKEY.getInverseKey()); - - return _paymentP2007_03; - } - - private transient PaymentP2007_04Path _paymentP2007_04; - - /** - * Get the implicit to-many join path to the - * <code>public.payment_p2007_04</code> table - */ - public PaymentP2007_04Path paymentP2007_04() { - if (_paymentP2007_04 == null) - _paymentP2007_04 = new PaymentP2007_04Path(this, null, Keys.PAYMENT_P2007_04__PAYMENT_P2007_04_STAFF_ID_FKEY.getInverseKey()); - - return _paymentP2007_04; - } - - private transient PaymentP2007_05Path _paymentP2007_05; - - /** - * Get the implicit to-many join path to the - * <code>public.payment_p2007_05</code> table - */ - public PaymentP2007_05Path paymentP2007_05() { - if (_paymentP2007_05 == null) - _paymentP2007_05 = new PaymentP2007_05Path(this, null, Keys.PAYMENT_P2007_05__PAYMENT_P2007_05_STAFF_ID_FKEY.getInverseKey()); - - return _paymentP2007_05; - } - - private transient PaymentP2007_06Path _paymentP2007_06; - - /** - * Get the implicit to-many join path to the - * <code>public.payment_p2007_06</code> table - */ - public PaymentP2007_06Path paymentP2007_06() { - if (_paymentP2007_06 == null) - _paymentP2007_06 = new PaymentP2007_06Path(this, null, Keys.PAYMENT_P2007_06__PAYMENT_P2007_06_STAFF_ID_FKEY.getInverseKey()); - - return _paymentP2007_06; - } - - private transient PaymentPath _payment; - - /** - * Get the implicit to-many join path to the <code>public.payment</code> - * table - */ - public PaymentPath payment() { - if (_payment == null) - _payment = new PaymentPath(this, null, Keys.PAYMENT__PAYMENT_STAFF_ID_FKEY.getInverseKey()); - - return _payment; - } - - private transient RentalPath _rental; - - /** - * Get the implicit to-many join path to the <code>public.rental</code> - * table - */ - public RentalPath rental() { - if (_rental == null) - _rental = new RentalPath(this, null, Keys.RENTAL__RENTAL_STAFF_ID_FKEY.getInverseKey()); - - return _rental; - } - - @Override - public Staff as(String alias) { - return new Staff(DSL.name(alias), this); - } - - @Override - public Staff as(Name alias) { - return new Staff(alias, this); - } - - @Override - public Staff as(Table<?> alias) { - return new Staff(alias.getQualifiedName(), this); - } - - /** - * Rename this table - */ - @Override - public Staff rename(String name) { - return new Staff(DSL.name(name), null); - } - - /** - * Rename this table - */ - @Override - public Staff rename(Name name) { - return new Staff(name, null); - } - - /** - * Rename this table - */ - @Override - public Staff rename(Table<?> name) { - return new Staff(name.getQualifiedName(), null); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Staff where(Condition condition) { - return new Staff(getQualifiedName(), aliased() ? this : null, null, condition); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Staff where(Collection<? extends Condition> conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Staff where(Condition... conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Staff where(Field<Boolean> condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Staff where(SQL condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Staff where(@Stringly.SQL String condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Staff where(@Stringly.SQL String condition, Object... binds) { - return where(DSL.condition(condition, binds)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Staff where(@Stringly.SQL String condition, QueryPart... parts) { - return where(DSL.condition(condition, parts)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Staff whereExists(Select<?> select) { - return where(DSL.exists(select)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Staff whereNotExists(Select<?> select) { - return where(DSL.notExists(select)); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/StaffList.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/StaffList.java deleted file mode 100644 index eb6c6dd2e3..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/StaffList.java +++ /dev/null @@ -1,260 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables; - - -import java.util.Collection; - -import no.sikt.graphitron.converters.ShortToIntegerConverter; -import no.sikt.graphitron.example.generated.jooq.Public; -import no.sikt.graphitron.example.generated.jooq.tables.records.StaffListRecord; - -import org.jooq.Condition; -import org.jooq.Field; -import org.jooq.Name; -import org.jooq.PlainSQL; -import org.jooq.QueryPart; -import org.jooq.SQL; -import org.jooq.Schema; -import org.jooq.Select; -import org.jooq.Stringly; -import org.jooq.Table; -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.impl.DSL; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class StaffList extends TableImpl<StaffListRecord> { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>public.staff_list</code> - */ - public static final StaffList STAFF_LIST = new StaffList(); - - /** - * The class holding records for this type - */ - @Override - public Class<StaffListRecord> getRecordType() { - return StaffListRecord.class; - } - - /** - * The column <code>public.staff_list.id</code>. - */ - public final TableField<StaffListRecord, Integer> ID = createField(DSL.name("id"), SQLDataType.INTEGER, this, ""); - - /** - * The column <code>public.staff_list.name</code>. - */ - public final TableField<StaffListRecord, String> NAME = createField(DSL.name("name"), SQLDataType.CLOB, this, ""); - - /** - * The column <code>public.staff_list.address</code>. - */ - public final TableField<StaffListRecord, String> ADDRESS = createField(DSL.name("address"), SQLDataType.VARCHAR(50), this, ""); - - /** - * The column <code>public.staff_list.zip code</code>. - */ - public final TableField<StaffListRecord, String> ZIP_CODE = createField(DSL.name("zip code"), SQLDataType.VARCHAR(10), this, ""); - - /** - * The column <code>public.staff_list.phone</code>. - */ - public final TableField<StaffListRecord, String> PHONE = createField(DSL.name("phone"), SQLDataType.VARCHAR(20), this, ""); - - /** - * The column <code>public.staff_list.city</code>. - */ - public final TableField<StaffListRecord, String> CITY = createField(DSL.name("city"), SQLDataType.VARCHAR(50), this, ""); - - /** - * The column <code>public.staff_list.country</code>. - */ - public final TableField<StaffListRecord, String> COUNTRY = createField(DSL.name("country"), SQLDataType.VARCHAR(50), this, ""); - - /** - * The column <code>public.staff_list.sid</code>. - */ - public final TableField<StaffListRecord, Integer> SID = createField(DSL.name("sid"), SQLDataType.SMALLINT, this, "", new ShortToIntegerConverter()); - - private StaffList(Name alias, Table<StaffListRecord> aliased) { - this(alias, aliased, (Field<?>[]) null, null); - } - - private StaffList(Name alias, Table<StaffListRecord> aliased, Field<?>[] parameters, Condition where) { - super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.view(""" - CREATE VIEW "staff_list" AS SELECT s.staff_id AS id, - (((s.first_name)::text || ' '::text) || (s.last_name)::text) AS name, - a.address, - a.postal_code AS "zip code", - a.phone, - city.city, - country.country, - s.store_id AS sid - FROM (((staff s - JOIN address a ON ((s.address_id = a.address_id))) - JOIN city ON ((a.city_id = city.city_id))) - JOIN country ON ((city.country_id = country.country_id))); - """), where); - } - - /** - * Create an aliased <code>public.staff_list</code> table reference - */ - public StaffList(String alias) { - this(DSL.name(alias), STAFF_LIST); - } - - /** - * Create an aliased <code>public.staff_list</code> table reference - */ - public StaffList(Name alias) { - this(alias, STAFF_LIST); - } - - /** - * Create a <code>public.staff_list</code> table reference - */ - public StaffList() { - this(DSL.name("staff_list"), null); - } - - @Override - public Schema getSchema() { - return aliased() ? null : Public.PUBLIC; - } - - @Override - public StaffList as(String alias) { - return new StaffList(DSL.name(alias), this); - } - - @Override - public StaffList as(Name alias) { - return new StaffList(alias, this); - } - - @Override - public StaffList as(Table<?> alias) { - return new StaffList(alias.getQualifiedName(), this); - } - - /** - * Rename this table - */ - @Override - public StaffList rename(String name) { - return new StaffList(DSL.name(name), null); - } - - /** - * Rename this table - */ - @Override - public StaffList rename(Name name) { - return new StaffList(name, null); - } - - /** - * Rename this table - */ - @Override - public StaffList rename(Table<?> name) { - return new StaffList(name.getQualifiedName(), null); - } - - /** - * Create an inline derived table from this table - */ - @Override - public StaffList where(Condition condition) { - return new StaffList(getQualifiedName(), aliased() ? this : null, null, condition); - } - - /** - * Create an inline derived table from this table - */ - @Override - public StaffList where(Collection<? extends Condition> conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public StaffList where(Condition... conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public StaffList where(Field<Boolean> condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public StaffList where(SQL condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public StaffList where(@Stringly.SQL String condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public StaffList where(@Stringly.SQL String condition, Object... binds) { - return where(DSL.condition(condition, binds)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public StaffList where(@Stringly.SQL String condition, QueryPart... parts) { - return where(DSL.condition(condition, parts)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public StaffList whereExists(Select<?> select) { - return where(DSL.exists(select)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public StaffList whereNotExists(Select<?> select) { - return where(DSL.notExists(select)); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Store.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Store.java deleted file mode 100644 index 54ee351c0c..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/Store.java +++ /dev/null @@ -1,346 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables; - - -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import no.sikt.graphitron.converters.ShortToIntegerConverter; -import no.sikt.graphitron.example.generated.jooq.Indexes; -import no.sikt.graphitron.example.generated.jooq.Keys; -import no.sikt.graphitron.example.generated.jooq.Public; -import no.sikt.graphitron.example.generated.jooq.tables.Address.AddressPath; -import no.sikt.graphitron.example.generated.jooq.tables.Customer.CustomerPath; -import no.sikt.graphitron.example.generated.jooq.tables.Inventory.InventoryPath; -import no.sikt.graphitron.example.generated.jooq.tables.Staff.StaffPath; -import no.sikt.graphitron.example.generated.jooq.tables.records.StoreRecord; - -import org.jooq.Condition; -import org.jooq.Field; -import org.jooq.ForeignKey; -import org.jooq.Identity; -import org.jooq.Index; -import org.jooq.InverseForeignKey; -import org.jooq.Name; -import org.jooq.Path; -import org.jooq.PlainSQL; -import org.jooq.QueryPart; -import org.jooq.Record; -import org.jooq.SQL; -import org.jooq.Schema; -import org.jooq.Select; -import org.jooq.Stringly; -import org.jooq.Table; -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.UniqueKey; -import org.jooq.impl.DSL; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class Store extends TableImpl<StoreRecord> { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of <code>public.store</code> - */ - public static final Store STORE = new Store(); - - /** - * The class holding records for this type - */ - @Override - public Class<StoreRecord> getRecordType() { - return StoreRecord.class; - } - - /** - * The column <code>public.store.store_id</code>. - */ - public final TableField<StoreRecord, Integer> STORE_ID = createField(DSL.name("store_id"), SQLDataType.INTEGER.nullable(false).identity(true), this, ""); - - /** - * The column <code>public.store.manager_staff_id</code>. - */ - public final TableField<StoreRecord, Integer> MANAGER_STAFF_ID = createField(DSL.name("manager_staff_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.store.address_id</code>. - */ - public final TableField<StoreRecord, Integer> ADDRESS_ID = createField(DSL.name("address_id"), SQLDataType.SMALLINT.nullable(false), this, "", new ShortToIntegerConverter()); - - /** - * The column <code>public.store.last_update</code>. - */ - public final TableField<StoreRecord, LocalDateTime> LAST_UPDATE = createField(DSL.name("last_update"), SQLDataType.LOCALDATETIME(6).nullable(false).defaultValue(DSL.field(DSL.raw("now()"), SQLDataType.LOCALDATETIME)), this, ""); - - private Store(Name alias, Table<StoreRecord> aliased) { - this(alias, aliased, (Field<?>[]) null, null); - } - - private Store(Name alias, Table<StoreRecord> aliased, Field<?>[] parameters, Condition where) { - super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.table(), where); - } - - /** - * Create an aliased <code>public.store</code> table reference - */ - public Store(String alias) { - this(DSL.name(alias), STORE); - } - - /** - * Create an aliased <code>public.store</code> table reference - */ - public Store(Name alias) { - this(alias, STORE); - } - - /** - * Create a <code>public.store</code> table reference - */ - public Store() { - this(DSL.name("store"), null); - } - - public <O extends Record> Store(Table<O> path, ForeignKey<O, StoreRecord> childPath, InverseForeignKey<O, StoreRecord> parentPath) { - super(path, childPath, parentPath, STORE); - } - - /** - * A subtype implementing {@link Path} for simplified path-based joins. - */ - public static class StorePath extends Store implements Path<StoreRecord> { - - private static final long serialVersionUID = 1L; - public <O extends Record> StorePath(Table<O> path, ForeignKey<O, StoreRecord> childPath, InverseForeignKey<O, StoreRecord> parentPath) { - super(path, childPath, parentPath); - } - private StorePath(Name alias, Table<StoreRecord> aliased) { - super(alias, aliased); - } - - @Override - public StorePath as(String alias) { - return new StorePath(DSL.name(alias), this); - } - - @Override - public StorePath as(Name alias) { - return new StorePath(alias, this); - } - - @Override - public StorePath as(Table<?> alias) { - return new StorePath(alias.getQualifiedName(), this); - } - } - - @Override - public Schema getSchema() { - return aliased() ? null : Public.PUBLIC; - } - - @Override - public List<Index> getIndexes() { - return Arrays.asList(Indexes.IDX_UNQ_MANAGER_STAFF_ID); - } - - @Override - public Identity<StoreRecord, Integer> getIdentity() { - return (Identity<StoreRecord, Integer>) super.getIdentity(); - } - - @Override - public UniqueKey<StoreRecord> getPrimaryKey() { - return Keys.STORE_PKEY; - } - - @Override - public List<ForeignKey<StoreRecord, ?>> getReferences() { - return Arrays.asList(Keys.STORE__STORE_ADDRESS_ID_FKEY, Keys.STORE__STORE_MANAGER_STAFF_ID_FKEY); - } - - private transient AddressPath _address; - - /** - * Get the implicit join path to the <code>public.address</code> table. - */ - public AddressPath address() { - if (_address == null) - _address = new AddressPath(this, Keys.STORE__STORE_ADDRESS_ID_FKEY, null); - - return _address; - } - - private transient StaffPath _staff; - - /** - * Get the implicit join path to the <code>public.staff</code> table. - */ - public StaffPath staff() { - if (_staff == null) - _staff = new StaffPath(this, Keys.STORE__STORE_MANAGER_STAFF_ID_FKEY, null); - - return _staff; - } - - private transient CustomerPath _customer; - - /** - * Get the implicit to-many join path to the <code>public.customer</code> - * table - */ - public CustomerPath customer() { - if (_customer == null) - _customer = new CustomerPath(this, null, Keys.CUSTOMER__CUSTOMER_STORE_ID_FKEY.getInverseKey()); - - return _customer; - } - - private transient InventoryPath _inventory; - - /** - * Get the implicit to-many join path to the <code>public.inventory</code> - * table - */ - public InventoryPath inventory() { - if (_inventory == null) - _inventory = new InventoryPath(this, null, Keys.INVENTORY__INVENTORY_STORE_ID_FKEY.getInverseKey()); - - return _inventory; - } - - @Override - public Store as(String alias) { - return new Store(DSL.name(alias), this); - } - - @Override - public Store as(Name alias) { - return new Store(alias, this); - } - - @Override - public Store as(Table<?> alias) { - return new Store(alias.getQualifiedName(), this); - } - - /** - * Rename this table - */ - @Override - public Store rename(String name) { - return new Store(DSL.name(name), null); - } - - /** - * Rename this table - */ - @Override - public Store rename(Name name) { - return new Store(name, null); - } - - /** - * Rename this table - */ - @Override - public Store rename(Table<?> name) { - return new Store(name.getQualifiedName(), null); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Store where(Condition condition) { - return new Store(getQualifiedName(), aliased() ? this : null, null, condition); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Store where(Collection<? extends Condition> conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Store where(Condition... conditions) { - return where(DSL.and(conditions)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Store where(Field<Boolean> condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Store where(SQL condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Store where(@Stringly.SQL String condition) { - return where(DSL.condition(condition)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Store where(@Stringly.SQL String condition, Object... binds) { - return where(DSL.condition(condition, binds)); - } - - /** - * Create an inline derived table from this table - */ - @Override - @PlainSQL - public Store where(@Stringly.SQL String condition, QueryPart... parts) { - return where(DSL.condition(condition, parts)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Store whereExists(Select<?> select) { - return where(DSL.exists(select)); - } - - /** - * Create an inline derived table from this table - */ - @Override - public Store whereNotExists(Select<?> select) { - return where(DSL.notExists(select)); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/ActorInfoRecord.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/ActorInfoRecord.java deleted file mode 100644 index a052bc6460..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/ActorInfoRecord.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables.records; - - -import jakarta.validation.constraints.Size; - -import no.sikt.graphitron.example.generated.jooq.tables.ActorInfo; - -import org.jooq.impl.TableRecordImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class ActorInfoRecord extends TableRecordImpl<ActorInfoRecord> { - - private static final long serialVersionUID = 1L; - - /** - * Setter for <code>public.actor_info.actor_id</code>. - */ - public void setActorId(Integer value) { - set(0, value); - } - - /** - * Getter for <code>public.actor_info.actor_id</code>. - */ - public Integer getActorId() { - return (Integer) get(0); - } - - /** - * Setter for <code>public.actor_info.first_name</code>. - */ - public void setFirstName(String value) { - set(1, value); - } - - /** - * Getter for <code>public.actor_info.first_name</code>. - */ - @Size(max = 45) - public String getFirstName() { - return (String) get(1); - } - - /** - * Setter for <code>public.actor_info.last_name</code>. - */ - public void setLastName(String value) { - set(2, value); - } - - /** - * Getter for <code>public.actor_info.last_name</code>. - */ - @Size(max = 45) - public String getLastName() { - return (String) get(2); - } - - /** - * Setter for <code>public.actor_info.film_info</code>. - */ - public void setFilmInfo(String value) { - set(3, value); - } - - /** - * Getter for <code>public.actor_info.film_info</code>. - */ - public String getFilmInfo() { - return (String) get(3); - } - - // ------------------------------------------------------------------------- - // Constructors - // ------------------------------------------------------------------------- - - /** - * Create a detached ActorInfoRecord - */ - public ActorInfoRecord() { - super(ActorInfo.ACTOR_INFO); - } - - /** - * Create a detached, initialised ActorInfoRecord - */ - public ActorInfoRecord(Integer actorId, String firstName, String lastName, String filmInfo) { - super(ActorInfo.ACTOR_INFO); - - setActorId(actorId); - setFirstName(firstName); - setLastName(lastName); - setFilmInfo(filmInfo); - resetTouchedOnNotNull(); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/ActorRecord.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/ActorRecord.java deleted file mode 100644 index be8bb07025..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/ActorRecord.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables.records; - - -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; - -import java.time.LocalDateTime; - -import no.sikt.graphitron.example.generated.jooq.tables.Actor; - -import org.jooq.Record1; -import org.jooq.impl.UpdatableRecordImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class ActorRecord extends UpdatableRecordImpl<ActorRecord> { - - private static final long serialVersionUID = 1L; - - /** - * Setter for <code>public.actor.actor_id</code>. - */ - public void setActorId(Integer value) { - set(0, value); - } - - /** - * Getter for <code>public.actor.actor_id</code>. - */ - public Integer getActorId() { - return (Integer) get(0); - } - - /** - * Setter for <code>public.actor.first_name</code>. - */ - public void setFirstName(String value) { - set(1, value); - } - - /** - * Getter for <code>public.actor.first_name</code>. - */ - @NotNull - @Size(max = 45) - public String getFirstName() { - return (String) get(1); - } - - /** - * Setter for <code>public.actor.last_name</code>. - */ - public void setLastName(String value) { - set(2, value); - } - - /** - * Getter for <code>public.actor.last_name</code>. - */ - @NotNull - @Size(max = 45) - public String getLastName() { - return (String) get(2); - } - - /** - * Setter for <code>public.actor.last_update</code>. - */ - public void setLastUpdate(LocalDateTime value) { - set(3, value); - } - - /** - * Getter for <code>public.actor.last_update</code>. - */ - public LocalDateTime getLastUpdate() { - return (LocalDateTime) get(3); - } - - // ------------------------------------------------------------------------- - // Primary key information - // ------------------------------------------------------------------------- - - @Override - public Record1<Integer> key() { - return (Record1) super.key(); - } - - // ------------------------------------------------------------------------- - // Constructors - // ------------------------------------------------------------------------- - - /** - * Create a detached ActorRecord - */ - public ActorRecord() { - super(Actor.ACTOR); - } - - /** - * Create a detached, initialised ActorRecord - */ - public ActorRecord(Integer actorId, String firstName, String lastName, LocalDateTime lastUpdate) { - super(Actor.ACTOR); - - setActorId(actorId); - setFirstName(firstName); - setLastName(lastName); - setLastUpdate(lastUpdate); - resetTouchedOnNotNull(); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/AddressRecord.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/AddressRecord.java deleted file mode 100644 index d71d99262d..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/AddressRecord.java +++ /dev/null @@ -1,183 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables.records; - - -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; - -import java.time.LocalDateTime; - -import no.sikt.graphitron.example.generated.jooq.tables.Address; - -import org.jooq.Record1; -import org.jooq.impl.UpdatableRecordImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class AddressRecord extends UpdatableRecordImpl<AddressRecord> { - - private static final long serialVersionUID = 1L; - - /** - * Setter for <code>public.address.address_id</code>. - */ - public void setAddressId(Integer value) { - set(0, value); - } - - /** - * Getter for <code>public.address.address_id</code>. - */ - public Integer getAddressId() { - return (Integer) get(0); - } - - /** - * Setter for <code>public.address.address</code>. - */ - public void setAddress(String value) { - set(1, value); - } - - /** - * Getter for <code>public.address.address</code>. - */ - @NotNull - @Size(max = 50) - public String getAddress() { - return (String) get(1); - } - - /** - * Setter for <code>public.address.address2</code>. - */ - public void setAddress2(String value) { - set(2, value); - } - - /** - * Getter for <code>public.address.address2</code>. - */ - @Size(max = 50) - public String getAddress2() { - return (String) get(2); - } - - /** - * Setter for <code>public.address.district</code>. - */ - public void setDistrict(String value) { - set(3, value); - } - - /** - * Getter for <code>public.address.district</code>. - */ - @NotNull - @Size(max = 20) - public String getDistrict() { - return (String) get(3); - } - - /** - * Setter for <code>public.address.city_id</code>. - */ - public void setCityId(Integer value) { - set(4, value); - } - - /** - * Getter for <code>public.address.city_id</code>. - */ - @NotNull - public Integer getCityId() { - return (Integer) get(4); - } - - /** - * Setter for <code>public.address.postal_code</code>. - */ - public void setPostalCode(String value) { - set(5, value); - } - - /** - * Getter for <code>public.address.postal_code</code>. - */ - @Size(max = 10) - public String getPostalCode() { - return (String) get(5); - } - - /** - * Setter for <code>public.address.phone</code>. - */ - public void setPhone(String value) { - set(6, value); - } - - /** - * Getter for <code>public.address.phone</code>. - */ - @NotNull - @Size(max = 20) - public String getPhone() { - return (String) get(6); - } - - /** - * Setter for <code>public.address.last_update</code>. - */ - public void setLastUpdate(LocalDateTime value) { - set(7, value); - } - - /** - * Getter for <code>public.address.last_update</code>. - */ - public LocalDateTime getLastUpdate() { - return (LocalDateTime) get(7); - } - - // ------------------------------------------------------------------------- - // Primary key information - // ------------------------------------------------------------------------- - - @Override - public Record1<Integer> key() { - return (Record1) super.key(); - } - - // ------------------------------------------------------------------------- - // Constructors - // ------------------------------------------------------------------------- - - /** - * Create a detached AddressRecord - */ - public AddressRecord() { - super(Address.ADDRESS); - } - - /** - * Create a detached, initialised AddressRecord - */ - public AddressRecord(Integer addressId, String address, String address2, String district, Integer cityId, String postalCode, String phone, LocalDateTime lastUpdate) { - super(Address.ADDRESS); - - setAddressId(addressId); - setAddress(address); - setAddress2(address2); - setDistrict(district); - setCityId(cityId); - setPostalCode(postalCode); - setPhone(phone); - setLastUpdate(lastUpdate); - resetTouchedOnNotNull(); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/CategoryRecord.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/CategoryRecord.java deleted file mode 100644 index 104675b3ef..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/CategoryRecord.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables.records; - - -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; - -import java.time.LocalDateTime; - -import no.sikt.graphitron.example.generated.jooq.tables.Category; - -import org.jooq.Record1; -import org.jooq.impl.UpdatableRecordImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class CategoryRecord extends UpdatableRecordImpl<CategoryRecord> { - - private static final long serialVersionUID = 1L; - - /** - * Setter for <code>public.category.category_id</code>. - */ - public void setCategoryId(Integer value) { - set(0, value); - } - - /** - * Getter for <code>public.category.category_id</code>. - */ - public Integer getCategoryId() { - return (Integer) get(0); - } - - /** - * Setter for <code>public.category.name</code>. - */ - public void setName(String value) { - set(1, value); - } - - /** - * Getter for <code>public.category.name</code>. - */ - @NotNull - @Size(max = 25) - public String getName() { - return (String) get(1); - } - - /** - * Setter for <code>public.category.last_update</code>. - */ - public void setLastUpdate(LocalDateTime value) { - set(2, value); - } - - /** - * Getter for <code>public.category.last_update</code>. - */ - public LocalDateTime getLastUpdate() { - return (LocalDateTime) get(2); - } - - // ------------------------------------------------------------------------- - // Primary key information - // ------------------------------------------------------------------------- - - @Override - public Record1<Integer> key() { - return (Record1) super.key(); - } - - // ------------------------------------------------------------------------- - // Constructors - // ------------------------------------------------------------------------- - - /** - * Create a detached CategoryRecord - */ - public CategoryRecord() { - super(Category.CATEGORY); - } - - /** - * Create a detached, initialised CategoryRecord - */ - public CategoryRecord(Integer categoryId, String name, LocalDateTime lastUpdate) { - super(Category.CATEGORY); - - setCategoryId(categoryId); - setName(name); - setLastUpdate(lastUpdate); - resetTouchedOnNotNull(); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/CityRecord.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/CityRecord.java deleted file mode 100644 index 0257867778..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/CityRecord.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables.records; - - -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; - -import java.time.LocalDateTime; - -import no.sikt.graphitron.example.generated.jooq.tables.City; - -import org.jooq.Record1; -import org.jooq.impl.UpdatableRecordImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class CityRecord extends UpdatableRecordImpl<CityRecord> { - - private static final long serialVersionUID = 1L; - - /** - * Setter for <code>public.city.city_id</code>. - */ - public void setCityId(Integer value) { - set(0, value); - } - - /** - * Getter for <code>public.city.city_id</code>. - */ - public Integer getCityId() { - return (Integer) get(0); - } - - /** - * Setter for <code>public.city.city</code>. - */ - public void setCity(String value) { - set(1, value); - } - - /** - * Getter for <code>public.city.city</code>. - */ - @NotNull - @Size(max = 50) - public String getCity() { - return (String) get(1); - } - - /** - * Setter for <code>public.city.country_id</code>. - */ - public void setCountryId(Integer value) { - set(2, value); - } - - /** - * Getter for <code>public.city.country_id</code>. - */ - @NotNull - public Integer getCountryId() { - return (Integer) get(2); - } - - /** - * Setter for <code>public.city.last_update</code>. - */ - public void setLastUpdate(LocalDateTime value) { - set(3, value); - } - - /** - * Getter for <code>public.city.last_update</code>. - */ - public LocalDateTime getLastUpdate() { - return (LocalDateTime) get(3); - } - - // ------------------------------------------------------------------------- - // Primary key information - // ------------------------------------------------------------------------- - - @Override - public Record1<Integer> key() { - return (Record1) super.key(); - } - - // ------------------------------------------------------------------------- - // Constructors - // ------------------------------------------------------------------------- - - /** - * Create a detached CityRecord - */ - public CityRecord() { - super(City.CITY); - } - - /** - * Create a detached, initialised CityRecord - */ - public CityRecord(Integer cityId, String city, Integer countryId, LocalDateTime lastUpdate) { - super(City.CITY); - - setCityId(cityId); - setCity(city); - setCountryId(countryId); - setLastUpdate(lastUpdate); - resetTouchedOnNotNull(); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/CountryRecord.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/CountryRecord.java deleted file mode 100644 index 39568fb50a..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/CountryRecord.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables.records; - - -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; - -import java.time.LocalDateTime; - -import no.sikt.graphitron.example.generated.jooq.tables.Country; - -import org.jooq.Record1; -import org.jooq.impl.UpdatableRecordImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class CountryRecord extends UpdatableRecordImpl<CountryRecord> { - - private static final long serialVersionUID = 1L; - - /** - * Setter for <code>public.country.country_id</code>. - */ - public void setCountryId(Integer value) { - set(0, value); - } - - /** - * Getter for <code>public.country.country_id</code>. - */ - public Integer getCountryId() { - return (Integer) get(0); - } - - /** - * Setter for <code>public.country.country</code>. - */ - public void setCountry(String value) { - set(1, value); - } - - /** - * Getter for <code>public.country.country</code>. - */ - @NotNull - @Size(max = 50) - public String getCountry() { - return (String) get(1); - } - - /** - * Setter for <code>public.country.last_update</code>. - */ - public void setLastUpdate(LocalDateTime value) { - set(2, value); - } - - /** - * Getter for <code>public.country.last_update</code>. - */ - public LocalDateTime getLastUpdate() { - return (LocalDateTime) get(2); - } - - // ------------------------------------------------------------------------- - // Primary key information - // ------------------------------------------------------------------------- - - @Override - public Record1<Integer> key() { - return (Record1) super.key(); - } - - // ------------------------------------------------------------------------- - // Constructors - // ------------------------------------------------------------------------- - - /** - * Create a detached CountryRecord - */ - public CountryRecord() { - super(Country.COUNTRY); - } - - /** - * Create a detached, initialised CountryRecord - */ - public CountryRecord(Integer countryId, String country, LocalDateTime lastUpdate) { - super(Country.COUNTRY); - - setCountryId(countryId); - setCountry(country); - setLastUpdate(lastUpdate); - resetTouchedOnNotNull(); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/CustomerListRecord.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/CustomerListRecord.java deleted file mode 100644 index 9752a25a28..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/CustomerListRecord.java +++ /dev/null @@ -1,181 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables.records; - - -import jakarta.validation.constraints.Size; - -import no.sikt.graphitron.example.generated.jooq.tables.CustomerList; - -import org.jooq.impl.TableRecordImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class CustomerListRecord extends TableRecordImpl<CustomerListRecord> { - - private static final long serialVersionUID = 1L; - - /** - * Setter for <code>public.customer_list.id</code>. - */ - public void setId(Integer value) { - set(0, value); - } - - /** - * Getter for <code>public.customer_list.id</code>. - */ - public Integer getId() { - return (Integer) get(0); - } - - /** - * Setter for <code>public.customer_list.name</code>. - */ - public void setName(String value) { - set(1, value); - } - - /** - * Getter for <code>public.customer_list.name</code>. - */ - public String getName() { - return (String) get(1); - } - - /** - * Setter for <code>public.customer_list.address</code>. - */ - public void setAddress(String value) { - set(2, value); - } - - /** - * Getter for <code>public.customer_list.address</code>. - */ - @Size(max = 50) - public String getAddress() { - return (String) get(2); - } - - /** - * Setter for <code>public.customer_list.zip code</code>. - */ - public void setZipCode(String value) { - set(3, value); - } - - /** - * Getter for <code>public.customer_list.zip code</code>. - */ - @Size(max = 10) - public String getZipCode() { - return (String) get(3); - } - - /** - * Setter for <code>public.customer_list.phone</code>. - */ - public void setPhone(String value) { - set(4, value); - } - - /** - * Getter for <code>public.customer_list.phone</code>. - */ - @Size(max = 20) - public String getPhone() { - return (String) get(4); - } - - /** - * Setter for <code>public.customer_list.city</code>. - */ - public void setCity(String value) { - set(5, value); - } - - /** - * Getter for <code>public.customer_list.city</code>. - */ - @Size(max = 50) - public String getCity() { - return (String) get(5); - } - - /** - * Setter for <code>public.customer_list.country</code>. - */ - public void setCountry(String value) { - set(6, value); - } - - /** - * Getter for <code>public.customer_list.country</code>. - */ - @Size(max = 50) - public String getCountry() { - return (String) get(6); - } - - /** - * Setter for <code>public.customer_list.notes</code>. - */ - public void setNotes(String value) { - set(7, value); - } - - /** - * Getter for <code>public.customer_list.notes</code>. - */ - public String getNotes() { - return (String) get(7); - } - - /** - * Setter for <code>public.customer_list.sid</code>. - */ - public void setSid(Integer value) { - set(8, value); - } - - /** - * Getter for <code>public.customer_list.sid</code>. - */ - public Integer getSid() { - return (Integer) get(8); - } - - // ------------------------------------------------------------------------- - // Constructors - // ------------------------------------------------------------------------- - - /** - * Create a detached CustomerListRecord - */ - public CustomerListRecord() { - super(CustomerList.CUSTOMER_LIST); - } - - /** - * Create a detached, initialised CustomerListRecord - */ - public CustomerListRecord(Integer id, String name, String address, String zipCode, String phone, String city, String country, String notes, Integer sid) { - super(CustomerList.CUSTOMER_LIST); - - setId(id); - setName(name); - setAddress(address); - setZipCode(zipCode); - setPhone(phone); - setCity(city); - setCountry(country); - setNotes(notes); - setSid(sid); - resetTouchedOnNotNull(); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/CustomerRecord.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/CustomerRecord.java deleted file mode 100644 index 23dff243e2..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/CustomerRecord.java +++ /dev/null @@ -1,242 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables.records; - - -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; - -import java.time.LocalDate; -import java.time.LocalDateTime; - -import no.sikt.graphitron.example.generated.jooq.tables.Customer; - -import org.jooq.Record1; -import org.jooq.impl.UpdatableRecordImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class CustomerRecord extends UpdatableRecordImpl<CustomerRecord> { - - private static final long serialVersionUID = 1L; - - /** - * Setter for <code>public.customer.customer_id</code>. - */ - public void setCustomerId(Integer value) { - set(0, value); - } - - /** - * Getter for <code>public.customer.customer_id</code>. - */ - public Integer getCustomerId() { - return (Integer) get(0); - } - - /** - * Setter for <code>public.customer.store_id</code>. - */ - public void setStoreId(Integer value) { - set(1, value); - } - - /** - * Getter for <code>public.customer.store_id</code>. - */ - @NotNull - public Integer getStoreId() { - return (Integer) get(1); - } - - /** - * Setter for <code>public.customer.first_name</code>. - */ - public void setFirstName(String value) { - set(2, value); - } - - /** - * Getter for <code>public.customer.first_name</code>. - */ - @NotNull - @Size(max = 45) - public String getFirstName() { - return (String) get(2); - } - - /** - * Setter for <code>public.customer.last_name</code>. - */ - public void setLastName(String value) { - set(3, value); - } - - /** - * Getter for <code>public.customer.last_name</code>. - */ - @NotNull - @Size(max = 45) - public String getLastName() { - return (String) get(3); - } - - /** - * Setter for <code>public.customer.email</code>. - */ - public void setEmail(String value) { - set(4, value); - } - - /** - * Getter for <code>public.customer.email</code>. - */ - @Size(max = 50) - public String getEmail() { - return (String) get(4); - } - - /** - * Setter for <code>public.customer.address_id</code>. - */ - public void setAddressId(Integer value) { - set(5, value); - } - - /** - * Getter for <code>public.customer.address_id</code>. - */ - @NotNull - public Integer getAddressId() { - return (Integer) get(5); - } - - /** - * Setter for <code>public.customer.activebool</code>. - */ - public void setActivebool(Boolean value) { - set(6, value); - } - - /** - * Getter for <code>public.customer.activebool</code>. - */ - public Boolean getActivebool() { - return (Boolean) get(6); - } - - /** - * Setter for <code>public.customer.create_date</code>. - */ - public void setCreateDate(LocalDate value) { - set(7, value); - } - - /** - * Getter for <code>public.customer.create_date</code>. - */ - public LocalDate getCreateDate() { - return (LocalDate) get(7); - } - - /** - * Setter for <code>public.customer.last_update</code>. - */ - public void setLastUpdate(LocalDateTime value) { - set(8, value); - } - - /** - * Getter for <code>public.customer.last_update</code>. - */ - public LocalDateTime getLastUpdate() { - return (LocalDateTime) get(8); - } - - /** - * Setter for <code>public.customer.active</code>. - */ - public void setActive(Integer value) { - set(9, value); - } - - /** - * Getter for <code>public.customer.active</code>. - */ - public Integer getActive() { - return (Integer) get(9); - } - - /** - * Setter for <code>public.customer.usernames</code>. - */ - public void setUsernames(String[] value) { - set(10, value); - } - - /** - * Getter for <code>public.customer.usernames</code>. - */ - public String[] getUsernames() { - return (String[]) get(10); - } - - /** - * Setter for <code>public.customer.past_address_ids</code>. - */ - public void setPastAddressIds(Integer[] value) { - set(11, value); - } - - /** - * Getter for <code>public.customer.past_address_ids</code>. - */ - public Integer[] getPastAddressIds() { - return (Integer[]) get(11); - } - - // ------------------------------------------------------------------------- - // Primary key information - // ------------------------------------------------------------------------- - - @Override - public Record1<Integer> key() { - return (Record1) super.key(); - } - - // ------------------------------------------------------------------------- - // Constructors - // ------------------------------------------------------------------------- - - /** - * Create a detached CustomerRecord - */ - public CustomerRecord() { - super(Customer.CUSTOMER); - } - - /** - * Create a detached, initialised CustomerRecord - */ - public CustomerRecord(Integer customerId, Integer storeId, String firstName, String lastName, String email, Integer addressId, Boolean activebool, LocalDate createDate, LocalDateTime lastUpdate, Integer active, String[] usernames, Integer[] pastAddressIds) { - super(Customer.CUSTOMER); - - setCustomerId(customerId); - setStoreId(storeId); - setFirstName(firstName); - setLastName(lastName); - setEmail(email); - setAddressId(addressId); - setActivebool(activebool); - setCreateDate(createDate); - setLastUpdate(lastUpdate); - setActive(active); - setUsernames(usernames); - setPastAddressIds(pastAddressIds); - resetTouchedOnNotNull(); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/FilmActorRecord.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/FilmActorRecord.java deleted file mode 100644 index bdade95079..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/FilmActorRecord.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables.records; - - -import jakarta.validation.constraints.NotNull; - -import java.time.LocalDateTime; - -import no.sikt.graphitron.example.generated.jooq.tables.FilmActor; - -import org.jooq.Record2; -import org.jooq.impl.UpdatableRecordImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class FilmActorRecord extends UpdatableRecordImpl<FilmActorRecord> { - - private static final long serialVersionUID = 1L; - - /** - * Setter for <code>public.film_actor.actor_id</code>. - */ - public void setActorId(Integer value) { - set(0, value); - } - - /** - * Getter for <code>public.film_actor.actor_id</code>. - */ - @NotNull - public Integer getActorId() { - return (Integer) get(0); - } - - /** - * Setter for <code>public.film_actor.film_id</code>. - */ - public void setFilmId(Integer value) { - set(1, value); - } - - /** - * Getter for <code>public.film_actor.film_id</code>. - */ - @NotNull - public Integer getFilmId() { - return (Integer) get(1); - } - - /** - * Setter for <code>public.film_actor.last_update</code>. - */ - public void setLastUpdate(LocalDateTime value) { - set(2, value); - } - - /** - * Getter for <code>public.film_actor.last_update</code>. - */ - public LocalDateTime getLastUpdate() { - return (LocalDateTime) get(2); - } - - // ------------------------------------------------------------------------- - // Primary key information - // ------------------------------------------------------------------------- - - @Override - public Record2<Integer, Integer> key() { - return (Record2) super.key(); - } - - // ------------------------------------------------------------------------- - // Constructors - // ------------------------------------------------------------------------- - - /** - * Create a detached FilmActorRecord - */ - public FilmActorRecord() { - super(FilmActor.FILM_ACTOR); - } - - /** - * Create a detached, initialised FilmActorRecord - */ - public FilmActorRecord(Integer actorId, Integer filmId, LocalDateTime lastUpdate) { - super(FilmActor.FILM_ACTOR); - - setActorId(actorId); - setFilmId(filmId); - setLastUpdate(lastUpdate); - resetTouchedOnNotNull(); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/FilmCategoryRecord.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/FilmCategoryRecord.java deleted file mode 100644 index d5ee559386..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/FilmCategoryRecord.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables.records; - - -import jakarta.validation.constraints.NotNull; - -import java.time.LocalDateTime; - -import no.sikt.graphitron.example.generated.jooq.tables.FilmCategory; - -import org.jooq.Record2; -import org.jooq.impl.UpdatableRecordImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class FilmCategoryRecord extends UpdatableRecordImpl<FilmCategoryRecord> { - - private static final long serialVersionUID = 1L; - - /** - * Setter for <code>public.film_category.film_id</code>. - */ - public void setFilmId(Integer value) { - set(0, value); - } - - /** - * Getter for <code>public.film_category.film_id</code>. - */ - @NotNull - public Integer getFilmId() { - return (Integer) get(0); - } - - /** - * Setter for <code>public.film_category.category_id</code>. - */ - public void setCategoryId(Integer value) { - set(1, value); - } - - /** - * Getter for <code>public.film_category.category_id</code>. - */ - @NotNull - public Integer getCategoryId() { - return (Integer) get(1); - } - - /** - * Setter for <code>public.film_category.last_update</code>. - */ - public void setLastUpdate(LocalDateTime value) { - set(2, value); - } - - /** - * Getter for <code>public.film_category.last_update</code>. - */ - public LocalDateTime getLastUpdate() { - return (LocalDateTime) get(2); - } - - // ------------------------------------------------------------------------- - // Primary key information - // ------------------------------------------------------------------------- - - @Override - public Record2<Integer, Integer> key() { - return (Record2) super.key(); - } - - // ------------------------------------------------------------------------- - // Constructors - // ------------------------------------------------------------------------- - - /** - * Create a detached FilmCategoryRecord - */ - public FilmCategoryRecord() { - super(FilmCategory.FILM_CATEGORY); - } - - /** - * Create a detached, initialised FilmCategoryRecord - */ - public FilmCategoryRecord(Integer filmId, Integer categoryId, LocalDateTime lastUpdate) { - super(FilmCategory.FILM_CATEGORY); - - setFilmId(filmId); - setCategoryId(categoryId); - setLastUpdate(lastUpdate); - resetTouchedOnNotNull(); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/FilmInStockRecord.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/FilmInStockRecord.java deleted file mode 100644 index 73032eb736..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/FilmInStockRecord.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables.records; - - -import no.sikt.graphitron.example.generated.jooq.tables.FilmInStock; - -import org.jooq.impl.TableRecordImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class FilmInStockRecord extends TableRecordImpl<FilmInStockRecord> { - - private static final long serialVersionUID = 1L; - - /** - * Setter for <code>public.film_in_stock.p_film_count</code>. - */ - public void setPFilmCount(Integer value) { - set(0, value); - } - - /** - * Getter for <code>public.film_in_stock.p_film_count</code>. - */ - public Integer getPFilmCount() { - return (Integer) get(0); - } - - // ------------------------------------------------------------------------- - // Constructors - // ------------------------------------------------------------------------- - - /** - * Create a detached FilmInStockRecord - */ - public FilmInStockRecord() { - super(FilmInStock.FILM_IN_STOCK); - } - - /** - * Create a detached, initialised FilmInStockRecord - */ - public FilmInStockRecord(Integer pFilmCount) { - super(FilmInStock.FILM_IN_STOCK); - - setPFilmCount(pFilmCount); - resetTouchedOnNotNull(); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/FilmListRecord.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/FilmListRecord.java deleted file mode 100644 index 4d18d9414e..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/FilmListRecord.java +++ /dev/null @@ -1,166 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables.records; - - -import jakarta.validation.constraints.Size; - -import java.math.BigDecimal; - -import no.sikt.graphitron.example.generated.jooq.enums.MpaaRating; -import no.sikt.graphitron.example.generated.jooq.tables.FilmList; - -import org.jooq.impl.TableRecordImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class FilmListRecord extends TableRecordImpl<FilmListRecord> { - - private static final long serialVersionUID = 1L; - - /** - * Setter for <code>public.film_list.fid</code>. - */ - public void setFid(Integer value) { - set(0, value); - } - - /** - * Getter for <code>public.film_list.fid</code>. - */ - public Integer getFid() { - return (Integer) get(0); - } - - /** - * Setter for <code>public.film_list.title</code>. - */ - public void setTitle(String value) { - set(1, value); - } - - /** - * Getter for <code>public.film_list.title</code>. - */ - @Size(max = 255) - public String getTitle() { - return (String) get(1); - } - - /** - * Setter for <code>public.film_list.description</code>. - */ - public void setDescription(String value) { - set(2, value); - } - - /** - * Getter for <code>public.film_list.description</code>. - */ - public String getDescription() { - return (String) get(2); - } - - /** - * Setter for <code>public.film_list.category</code>. - */ - public void setCategory(String value) { - set(3, value); - } - - /** - * Getter for <code>public.film_list.category</code>. - */ - @Size(max = 25) - public String getCategory() { - return (String) get(3); - } - - /** - * Setter for <code>public.film_list.price</code>. - */ - public void setPrice(BigDecimal value) { - set(4, value); - } - - /** - * Getter for <code>public.film_list.price</code>. - */ - public BigDecimal getPrice() { - return (BigDecimal) get(4); - } - - /** - * Setter for <code>public.film_list.length</code>. - */ - public void setLength(Integer value) { - set(5, value); - } - - /** - * Getter for <code>public.film_list.length</code>. - */ - public Integer getLength() { - return (Integer) get(5); - } - - /** - * Setter for <code>public.film_list.rating</code>. - */ - public void setRating(MpaaRating value) { - set(6, value); - } - - /** - * Getter for <code>public.film_list.rating</code>. - */ - public MpaaRating getRating() { - return (MpaaRating) get(6); - } - - /** - * Setter for <code>public.film_list.actors</code>. - */ - public void setActors(String value) { - set(7, value); - } - - /** - * Getter for <code>public.film_list.actors</code>. - */ - public String getActors() { - return (String) get(7); - } - - // ------------------------------------------------------------------------- - // Constructors - // ------------------------------------------------------------------------- - - /** - * Create a detached FilmListRecord - */ - public FilmListRecord() { - super(FilmList.FILM_LIST); - } - - /** - * Create a detached, initialised FilmListRecord - */ - public FilmListRecord(Integer fid, String title, String description, String category, BigDecimal price, Integer length, MpaaRating rating, String actors) { - super(FilmList.FILM_LIST); - - setFid(fid); - setTitle(title); - setDescription(description); - setCategory(category); - setPrice(price); - setLength(length); - setRating(rating); - setActors(actors); - resetTouchedOnNotNull(); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/FilmNotInStockRecord.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/FilmNotInStockRecord.java deleted file mode 100644 index cd8edb150f..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/FilmNotInStockRecord.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables.records; - - -import no.sikt.graphitron.example.generated.jooq.tables.FilmNotInStock; - -import org.jooq.impl.TableRecordImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class FilmNotInStockRecord extends TableRecordImpl<FilmNotInStockRecord> { - - private static final long serialVersionUID = 1L; - - /** - * Setter for <code>public.film_not_in_stock.p_film_count</code>. - */ - public void setPFilmCount(Integer value) { - set(0, value); - } - - /** - * Getter for <code>public.film_not_in_stock.p_film_count</code>. - */ - public Integer getPFilmCount() { - return (Integer) get(0); - } - - // ------------------------------------------------------------------------- - // Constructors - // ------------------------------------------------------------------------- - - /** - * Create a detached FilmNotInStockRecord - */ - public FilmNotInStockRecord() { - super(FilmNotInStock.FILM_NOT_IN_STOCK); - } - - /** - * Create a detached, initialised FilmNotInStockRecord - */ - public FilmNotInStockRecord(Integer pFilmCount) { - super(FilmNotInStock.FILM_NOT_IN_STOCK); - - setPFilmCount(pFilmCount); - resetTouchedOnNotNull(); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/FilmRecord.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/FilmRecord.java deleted file mode 100644 index 920f19513a..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/FilmRecord.java +++ /dev/null @@ -1,297 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables.records; - - -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -import no.sikt.graphitron.example.generated.jooq.enums.MpaaRating; -import no.sikt.graphitron.example.generated.jooq.tables.Film; - -import org.jooq.Record1; -import org.jooq.impl.UpdatableRecordImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class FilmRecord extends UpdatableRecordImpl<FilmRecord> { - - private static final long serialVersionUID = 1L; - - /** - * Setter for <code>public.film.film_id</code>. - */ - public void setFilmId(String value) { - set(0, value); - } - - /** - * Getter for <code>public.film.film_id</code>. - */ - public String getFilmId() { - return (String) get(0); - } - - /** - * Setter for <code>public.film.title</code>. - */ - public void setTitle(String value) { - set(1, value); - } - - /** - * Getter for <code>public.film.title</code>. - */ - @NotNull - @Size(max = 255) - public String getTitle() { - return (String) get(1); - } - - /** - * Setter for <code>public.film.description</code>. - */ - public void setDescription(String value) { - set(2, value); - } - - /** - * Getter for <code>public.film.description</code>. - */ - public String getDescription() { - return (String) get(2); - } - - /** - * Setter for <code>public.film.release_year</code>. - */ - public void setReleaseYear(Integer value) { - set(3, value); - } - - /** - * Getter for <code>public.film.release_year</code>. - */ - public Integer getReleaseYear() { - return (Integer) get(3); - } - - /** - * Setter for <code>public.film.language_id</code>. - */ - public void setLanguageId(Integer value) { - set(4, value); - } - - /** - * Getter for <code>public.film.language_id</code>. - */ - @NotNull - public Integer getLanguageId() { - return (Integer) get(4); - } - - /** - * Setter for <code>public.film.original_language_id</code>. - */ - public void setOriginalLanguageId(Integer value) { - set(5, value); - } - - /** - * Getter for <code>public.film.original_language_id</code>. - */ - public Integer getOriginalLanguageId() { - return (Integer) get(5); - } - - /** - * Setter for <code>public.film.rental_duration</code>. - */ - public void setRentalDuration(Integer value) { - set(6, value); - } - - /** - * Getter for <code>public.film.rental_duration</code>. - */ - public Integer getRentalDuration() { - return (Integer) get(6); - } - - /** - * Setter for <code>public.film.rental_rate</code>. - */ - public void setRentalRate(BigDecimal value) { - set(7, value); - } - - /** - * Getter for <code>public.film.rental_rate</code>. - */ - public BigDecimal getRentalRate() { - return (BigDecimal) get(7); - } - - /** - * Setter for <code>public.film.length</code>. - */ - public void setLength(Integer value) { - set(8, value); - } - - /** - * Getter for <code>public.film.length</code>. - */ - public Integer getLength() { - return (Integer) get(8); - } - - /** - * Setter for <code>public.film.replacement_cost</code>. - */ - public void setReplacementCost(BigDecimal value) { - set(9, value); - } - - /** - * Getter for <code>public.film.replacement_cost</code>. - */ - public BigDecimal getReplacementCost() { - return (BigDecimal) get(9); - } - - /** - * Setter for <code>public.film.rating</code>. - */ - public void setRating(MpaaRating value) { - set(10, value); - } - - /** - * Getter for <code>public.film.rating</code>. - */ - public MpaaRating getRating() { - return (MpaaRating) get(10); - } - - /** - * Setter for <code>public.film.last_update</code>. - */ - public void setLastUpdate(LocalDateTime value) { - set(11, value); - } - - /** - * Getter for <code>public.film.last_update</code>. - */ - public LocalDateTime getLastUpdate() { - return (LocalDateTime) get(11); - } - - /** - * Setter for <code>public.film.special_features</code>. - */ - public void setSpecialFeatures(String[] value) { - set(12, value); - } - - /** - * Getter for <code>public.film.special_features</code>. - */ - public String[] getSpecialFeatures() { - return (String[]) get(12); - } - - /** - * @deprecated Unknown data type. If this is a qualified, user-defined type, - * it may have been excluded from code generation. If this is a built-in - * type, you can define an explicit {@link org.jooq.Binding} to specify how - * this type should be handled. Deprecation can be turned off using - * {@literal <deprecationOnUnknownTypes/>} in your code generator - * configuration. - */ - @Deprecated - public void setFulltext(Object value) { - set(13, value); - } - - /** - * @deprecated Unknown data type. If this is a qualified, user-defined type, - * it may have been excluded from code generation. If this is a built-in - * type, you can define an explicit {@link org.jooq.Binding} to specify how - * this type should be handled. Deprecation can be turned off using - * {@literal <deprecationOnUnknownTypes/>} in your code generator - * configuration. - */ - @Deprecated - @NotNull - public Object getFulltext() { - return get(13); - } - - /** - * Setter for <code>public.film.sequel</code>. - */ - public void setSequel(Long value) { - set(14, value); - } - - /** - * Getter for <code>public.film.sequel</code>. - */ - public Long getSequel() { - return (Long) get(14); - } - - // ------------------------------------------------------------------------- - // Primary key information - // ------------------------------------------------------------------------- - - @Override - public Record1<String> key() { - return (Record1) super.key(); - } - - // ------------------------------------------------------------------------- - // Constructors - // ------------------------------------------------------------------------- - - /** - * Create a detached FilmRecord - */ - public FilmRecord() { - super(Film.FILM); - } - - /** - * Create a detached, initialised FilmRecord - */ - public FilmRecord(String filmId, String title, String description, Integer releaseYear, Integer languageId, Integer originalLanguageId, Integer rentalDuration, BigDecimal rentalRate, Integer length, BigDecimal replacementCost, MpaaRating rating, LocalDateTime lastUpdate, String[] specialFeatures, Object fulltext, Long sequel) { - super(Film.FILM); - - setFilmId(filmId); - setTitle(title); - setDescription(description); - setReleaseYear(releaseYear); - setLanguageId(languageId); - setOriginalLanguageId(originalLanguageId); - setRentalDuration(rentalDuration); - setRentalRate(rentalRate); - setLength(length); - setReplacementCost(replacementCost); - setRating(rating); - setLastUpdate(lastUpdate); - setSpecialFeatures(specialFeatures); - setFulltext(fulltext); - setSequel(sequel); - resetTouchedOnNotNull(); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/InventoryRecord.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/InventoryRecord.java deleted file mode 100644 index 62ca279059..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/InventoryRecord.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables.records; - - -import jakarta.validation.constraints.NotNull; - -import java.time.LocalDateTime; - -import no.sikt.graphitron.example.generated.jooq.tables.Inventory; - -import org.jooq.Record1; -import org.jooq.impl.UpdatableRecordImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class InventoryRecord extends UpdatableRecordImpl<InventoryRecord> { - - private static final long serialVersionUID = 1L; - - /** - * Setter for <code>public.inventory.inventory_id</code>. - */ - public void setInventoryId(Integer value) { - set(0, value); - } - - /** - * Getter for <code>public.inventory.inventory_id</code>. - */ - public Integer getInventoryId() { - return (Integer) get(0); - } - - /** - * Setter for <code>public.inventory.film_id</code>. - */ - public void setFilmId(Integer value) { - set(1, value); - } - - /** - * Getter for <code>public.inventory.film_id</code>. - */ - @NotNull - public Integer getFilmId() { - return (Integer) get(1); - } - - /** - * Setter for <code>public.inventory.store_id</code>. - */ - public void setStoreId(Integer value) { - set(2, value); - } - - /** - * Getter for <code>public.inventory.store_id</code>. - */ - @NotNull - public Integer getStoreId() { - return (Integer) get(2); - } - - /** - * Setter for <code>public.inventory.last_update</code>. - */ - public void setLastUpdate(LocalDateTime value) { - set(3, value); - } - - /** - * Getter for <code>public.inventory.last_update</code>. - */ - public LocalDateTime getLastUpdate() { - return (LocalDateTime) get(3); - } - - // ------------------------------------------------------------------------- - // Primary key information - // ------------------------------------------------------------------------- - - @Override - public Record1<Integer> key() { - return (Record1) super.key(); - } - - // ------------------------------------------------------------------------- - // Constructors - // ------------------------------------------------------------------------- - - /** - * Create a detached InventoryRecord - */ - public InventoryRecord() { - super(Inventory.INVENTORY); - } - - /** - * Create a detached, initialised InventoryRecord - */ - public InventoryRecord(Integer inventoryId, Integer filmId, Integer storeId, LocalDateTime lastUpdate) { - super(Inventory.INVENTORY); - - setInventoryId(inventoryId); - setFilmId(filmId); - setStoreId(storeId); - setLastUpdate(lastUpdate); - resetTouchedOnNotNull(); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/LanguageRecord.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/LanguageRecord.java deleted file mode 100644 index 66eaea0c1b..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/LanguageRecord.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables.records; - - -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; - -import java.time.LocalDateTime; - -import no.sikt.graphitron.example.generated.jooq.tables.Language; - -import org.jooq.Record1; -import org.jooq.impl.UpdatableRecordImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class LanguageRecord extends UpdatableRecordImpl<LanguageRecord> { - - private static final long serialVersionUID = 1L; - - /** - * Setter for <code>public.language.language_id</code>. - */ - public void setLanguageId(Integer value) { - set(0, value); - } - - /** - * Getter for <code>public.language.language_id</code>. - */ - public Integer getLanguageId() { - return (Integer) get(0); - } - - /** - * Setter for <code>public.language.name</code>. - */ - public void setName(String value) { - set(1, value); - } - - /** - * Getter for <code>public.language.name</code>. - */ - @NotNull - @Size(max = 20) - public String getName() { - return (String) get(1); - } - - /** - * Setter for <code>public.language.last_update</code>. - */ - public void setLastUpdate(LocalDateTime value) { - set(2, value); - } - - /** - * Getter for <code>public.language.last_update</code>. - */ - public LocalDateTime getLastUpdate() { - return (LocalDateTime) get(2); - } - - // ------------------------------------------------------------------------- - // Primary key information - // ------------------------------------------------------------------------- - - @Override - public Record1<Integer> key() { - return (Record1) super.key(); - } - - // ------------------------------------------------------------------------- - // Constructors - // ------------------------------------------------------------------------- - - /** - * Create a detached LanguageRecord - */ - public LanguageRecord() { - super(Language.LANGUAGE); - } - - /** - * Create a detached, initialised LanguageRecord - */ - public LanguageRecord(Integer languageId, String name, LocalDateTime lastUpdate) { - super(Language.LANGUAGE); - - setLanguageId(languageId); - setName(name); - setLastUpdate(lastUpdate); - resetTouchedOnNotNull(); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/NicerButSlowerFilmListRecord.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/NicerButSlowerFilmListRecord.java deleted file mode 100644 index 3e545aa47c..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/NicerButSlowerFilmListRecord.java +++ /dev/null @@ -1,166 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables.records; - - -import jakarta.validation.constraints.Size; - -import java.math.BigDecimal; - -import no.sikt.graphitron.example.generated.jooq.enums.MpaaRating; -import no.sikt.graphitron.example.generated.jooq.tables.NicerButSlowerFilmList; - -import org.jooq.impl.TableRecordImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class NicerButSlowerFilmListRecord extends TableRecordImpl<NicerButSlowerFilmListRecord> { - - private static final long serialVersionUID = 1L; - - /** - * Setter for <code>public.nicer_but_slower_film_list.fid</code>. - */ - public void setFid(Integer value) { - set(0, value); - } - - /** - * Getter for <code>public.nicer_but_slower_film_list.fid</code>. - */ - public Integer getFid() { - return (Integer) get(0); - } - - /** - * Setter for <code>public.nicer_but_slower_film_list.title</code>. - */ - public void setTitle(String value) { - set(1, value); - } - - /** - * Getter for <code>public.nicer_but_slower_film_list.title</code>. - */ - @Size(max = 255) - public String getTitle() { - return (String) get(1); - } - - /** - * Setter for <code>public.nicer_but_slower_film_list.description</code>. - */ - public void setDescription(String value) { - set(2, value); - } - - /** - * Getter for <code>public.nicer_but_slower_film_list.description</code>. - */ - public String getDescription() { - return (String) get(2); - } - - /** - * Setter for <code>public.nicer_but_slower_film_list.category</code>. - */ - public void setCategory(String value) { - set(3, value); - } - - /** - * Getter for <code>public.nicer_but_slower_film_list.category</code>. - */ - @Size(max = 25) - public String getCategory() { - return (String) get(3); - } - - /** - * Setter for <code>public.nicer_but_slower_film_list.price</code>. - */ - public void setPrice(BigDecimal value) { - set(4, value); - } - - /** - * Getter for <code>public.nicer_but_slower_film_list.price</code>. - */ - public BigDecimal getPrice() { - return (BigDecimal) get(4); - } - - /** - * Setter for <code>public.nicer_but_slower_film_list.length</code>. - */ - public void setLength(Integer value) { - set(5, value); - } - - /** - * Getter for <code>public.nicer_but_slower_film_list.length</code>. - */ - public Integer getLength() { - return (Integer) get(5); - } - - /** - * Setter for <code>public.nicer_but_slower_film_list.rating</code>. - */ - public void setRating(MpaaRating value) { - set(6, value); - } - - /** - * Getter for <code>public.nicer_but_slower_film_list.rating</code>. - */ - public MpaaRating getRating() { - return (MpaaRating) get(6); - } - - /** - * Setter for <code>public.nicer_but_slower_film_list.actors</code>. - */ - public void setActors(String value) { - set(7, value); - } - - /** - * Getter for <code>public.nicer_but_slower_film_list.actors</code>. - */ - public String getActors() { - return (String) get(7); - } - - // ------------------------------------------------------------------------- - // Constructors - // ------------------------------------------------------------------------- - - /** - * Create a detached NicerButSlowerFilmListRecord - */ - public NicerButSlowerFilmListRecord() { - super(NicerButSlowerFilmList.NICER_BUT_SLOWER_FILM_LIST); - } - - /** - * Create a detached, initialised NicerButSlowerFilmListRecord - */ - public NicerButSlowerFilmListRecord(Integer fid, String title, String description, String category, BigDecimal price, Integer length, MpaaRating rating, String actors) { - super(NicerButSlowerFilmList.NICER_BUT_SLOWER_FILM_LIST); - - setFid(fid); - setTitle(title); - setDescription(description); - setCategory(category); - setPrice(price); - setLength(length); - setRating(rating); - setActors(actors); - resetTouchedOnNotNull(); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/PaymentP2007_01Record.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/PaymentP2007_01Record.java deleted file mode 100644 index 1358194a0a..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/PaymentP2007_01Record.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables.records; - - -import jakarta.validation.constraints.NotNull; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_01; - -import org.jooq.impl.TableRecordImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class PaymentP2007_01Record extends TableRecordImpl<PaymentP2007_01Record> { - - private static final long serialVersionUID = 1L; - - /** - * Setter for <code>public.payment_p2007_01.payment_id</code>. - */ - public void setPaymentId(Integer value) { - set(0, value); - } - - /** - * Getter for <code>public.payment_p2007_01.payment_id</code>. - */ - public Integer getPaymentId() { - return (Integer) get(0); - } - - /** - * Setter for <code>public.payment_p2007_01.customer_id</code>. - */ - public void setCustomerId(Integer value) { - set(1, value); - } - - /** - * Getter for <code>public.payment_p2007_01.customer_id</code>. - */ - @NotNull - public Integer getCustomerId() { - return (Integer) get(1); - } - - /** - * Setter for <code>public.payment_p2007_01.staff_id</code>. - */ - public void setStaffId(Integer value) { - set(2, value); - } - - /** - * Getter for <code>public.payment_p2007_01.staff_id</code>. - */ - @NotNull - public Integer getStaffId() { - return (Integer) get(2); - } - - /** - * Setter for <code>public.payment_p2007_01.rental_id</code>. - */ - public void setRentalId(Integer value) { - set(3, value); - } - - /** - * Getter for <code>public.payment_p2007_01.rental_id</code>. - */ - @NotNull - public Integer getRentalId() { - return (Integer) get(3); - } - - /** - * Setter for <code>public.payment_p2007_01.amount</code>. - */ - public void setAmount(BigDecimal value) { - set(4, value); - } - - /** - * Getter for <code>public.payment_p2007_01.amount</code>. - */ - @NotNull - public BigDecimal getAmount() { - return (BigDecimal) get(4); - } - - /** - * Setter for <code>public.payment_p2007_01.payment_date</code>. - */ - public void setPaymentDate(LocalDateTime value) { - set(5, value); - } - - /** - * Getter for <code>public.payment_p2007_01.payment_date</code>. - */ - @NotNull - public LocalDateTime getPaymentDate() { - return (LocalDateTime) get(5); - } - - // ------------------------------------------------------------------------- - // Constructors - // ------------------------------------------------------------------------- - - /** - * Create a detached PaymentP2007_01Record - */ - public PaymentP2007_01Record() { - super(PaymentP2007_01.PAYMENT_P2007_01); - } - - /** - * Create a detached, initialised PaymentP2007_01Record - */ - public PaymentP2007_01Record(Integer paymentId, Integer customerId, Integer staffId, Integer rentalId, BigDecimal amount, LocalDateTime paymentDate) { - super(PaymentP2007_01.PAYMENT_P2007_01); - - setPaymentId(paymentId); - setCustomerId(customerId); - setStaffId(staffId); - setRentalId(rentalId); - setAmount(amount); - setPaymentDate(paymentDate); - resetTouchedOnNotNull(); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/PaymentP2007_02Record.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/PaymentP2007_02Record.java deleted file mode 100644 index 76bf5a9615..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/PaymentP2007_02Record.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables.records; - - -import jakarta.validation.constraints.NotNull; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_02; - -import org.jooq.impl.TableRecordImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class PaymentP2007_02Record extends TableRecordImpl<PaymentP2007_02Record> { - - private static final long serialVersionUID = 1L; - - /** - * Setter for <code>public.payment_p2007_02.payment_id</code>. - */ - public void setPaymentId(Integer value) { - set(0, value); - } - - /** - * Getter for <code>public.payment_p2007_02.payment_id</code>. - */ - public Integer getPaymentId() { - return (Integer) get(0); - } - - /** - * Setter for <code>public.payment_p2007_02.customer_id</code>. - */ - public void setCustomerId(Integer value) { - set(1, value); - } - - /** - * Getter for <code>public.payment_p2007_02.customer_id</code>. - */ - @NotNull - public Integer getCustomerId() { - return (Integer) get(1); - } - - /** - * Setter for <code>public.payment_p2007_02.staff_id</code>. - */ - public void setStaffId(Integer value) { - set(2, value); - } - - /** - * Getter for <code>public.payment_p2007_02.staff_id</code>. - */ - @NotNull - public Integer getStaffId() { - return (Integer) get(2); - } - - /** - * Setter for <code>public.payment_p2007_02.rental_id</code>. - */ - public void setRentalId(Integer value) { - set(3, value); - } - - /** - * Getter for <code>public.payment_p2007_02.rental_id</code>. - */ - @NotNull - public Integer getRentalId() { - return (Integer) get(3); - } - - /** - * Setter for <code>public.payment_p2007_02.amount</code>. - */ - public void setAmount(BigDecimal value) { - set(4, value); - } - - /** - * Getter for <code>public.payment_p2007_02.amount</code>. - */ - @NotNull - public BigDecimal getAmount() { - return (BigDecimal) get(4); - } - - /** - * Setter for <code>public.payment_p2007_02.payment_date</code>. - */ - public void setPaymentDate(LocalDateTime value) { - set(5, value); - } - - /** - * Getter for <code>public.payment_p2007_02.payment_date</code>. - */ - @NotNull - public LocalDateTime getPaymentDate() { - return (LocalDateTime) get(5); - } - - // ------------------------------------------------------------------------- - // Constructors - // ------------------------------------------------------------------------- - - /** - * Create a detached PaymentP2007_02Record - */ - public PaymentP2007_02Record() { - super(PaymentP2007_02.PAYMENT_P2007_02); - } - - /** - * Create a detached, initialised PaymentP2007_02Record - */ - public PaymentP2007_02Record(Integer paymentId, Integer customerId, Integer staffId, Integer rentalId, BigDecimal amount, LocalDateTime paymentDate) { - super(PaymentP2007_02.PAYMENT_P2007_02); - - setPaymentId(paymentId); - setCustomerId(customerId); - setStaffId(staffId); - setRentalId(rentalId); - setAmount(amount); - setPaymentDate(paymentDate); - resetTouchedOnNotNull(); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/PaymentP2007_03Record.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/PaymentP2007_03Record.java deleted file mode 100644 index f398c6abad..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/PaymentP2007_03Record.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables.records; - - -import jakarta.validation.constraints.NotNull; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_03; - -import org.jooq.impl.TableRecordImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class PaymentP2007_03Record extends TableRecordImpl<PaymentP2007_03Record> { - - private static final long serialVersionUID = 1L; - - /** - * Setter for <code>public.payment_p2007_03.payment_id</code>. - */ - public void setPaymentId(Integer value) { - set(0, value); - } - - /** - * Getter for <code>public.payment_p2007_03.payment_id</code>. - */ - public Integer getPaymentId() { - return (Integer) get(0); - } - - /** - * Setter for <code>public.payment_p2007_03.customer_id</code>. - */ - public void setCustomerId(Integer value) { - set(1, value); - } - - /** - * Getter for <code>public.payment_p2007_03.customer_id</code>. - */ - @NotNull - public Integer getCustomerId() { - return (Integer) get(1); - } - - /** - * Setter for <code>public.payment_p2007_03.staff_id</code>. - */ - public void setStaffId(Integer value) { - set(2, value); - } - - /** - * Getter for <code>public.payment_p2007_03.staff_id</code>. - */ - @NotNull - public Integer getStaffId() { - return (Integer) get(2); - } - - /** - * Setter for <code>public.payment_p2007_03.rental_id</code>. - */ - public void setRentalId(Integer value) { - set(3, value); - } - - /** - * Getter for <code>public.payment_p2007_03.rental_id</code>. - */ - @NotNull - public Integer getRentalId() { - return (Integer) get(3); - } - - /** - * Setter for <code>public.payment_p2007_03.amount</code>. - */ - public void setAmount(BigDecimal value) { - set(4, value); - } - - /** - * Getter for <code>public.payment_p2007_03.amount</code>. - */ - @NotNull - public BigDecimal getAmount() { - return (BigDecimal) get(4); - } - - /** - * Setter for <code>public.payment_p2007_03.payment_date</code>. - */ - public void setPaymentDate(LocalDateTime value) { - set(5, value); - } - - /** - * Getter for <code>public.payment_p2007_03.payment_date</code>. - */ - @NotNull - public LocalDateTime getPaymentDate() { - return (LocalDateTime) get(5); - } - - // ------------------------------------------------------------------------- - // Constructors - // ------------------------------------------------------------------------- - - /** - * Create a detached PaymentP2007_03Record - */ - public PaymentP2007_03Record() { - super(PaymentP2007_03.PAYMENT_P2007_03); - } - - /** - * Create a detached, initialised PaymentP2007_03Record - */ - public PaymentP2007_03Record(Integer paymentId, Integer customerId, Integer staffId, Integer rentalId, BigDecimal amount, LocalDateTime paymentDate) { - super(PaymentP2007_03.PAYMENT_P2007_03); - - setPaymentId(paymentId); - setCustomerId(customerId); - setStaffId(staffId); - setRentalId(rentalId); - setAmount(amount); - setPaymentDate(paymentDate); - resetTouchedOnNotNull(); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/PaymentP2007_04Record.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/PaymentP2007_04Record.java deleted file mode 100644 index dda0408739..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/PaymentP2007_04Record.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables.records; - - -import jakarta.validation.constraints.NotNull; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_04; - -import org.jooq.impl.TableRecordImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class PaymentP2007_04Record extends TableRecordImpl<PaymentP2007_04Record> { - - private static final long serialVersionUID = 1L; - - /** - * Setter for <code>public.payment_p2007_04.payment_id</code>. - */ - public void setPaymentId(Integer value) { - set(0, value); - } - - /** - * Getter for <code>public.payment_p2007_04.payment_id</code>. - */ - public Integer getPaymentId() { - return (Integer) get(0); - } - - /** - * Setter for <code>public.payment_p2007_04.customer_id</code>. - */ - public void setCustomerId(Integer value) { - set(1, value); - } - - /** - * Getter for <code>public.payment_p2007_04.customer_id</code>. - */ - @NotNull - public Integer getCustomerId() { - return (Integer) get(1); - } - - /** - * Setter for <code>public.payment_p2007_04.staff_id</code>. - */ - public void setStaffId(Integer value) { - set(2, value); - } - - /** - * Getter for <code>public.payment_p2007_04.staff_id</code>. - */ - @NotNull - public Integer getStaffId() { - return (Integer) get(2); - } - - /** - * Setter for <code>public.payment_p2007_04.rental_id</code>. - */ - public void setRentalId(Integer value) { - set(3, value); - } - - /** - * Getter for <code>public.payment_p2007_04.rental_id</code>. - */ - @NotNull - public Integer getRentalId() { - return (Integer) get(3); - } - - /** - * Setter for <code>public.payment_p2007_04.amount</code>. - */ - public void setAmount(BigDecimal value) { - set(4, value); - } - - /** - * Getter for <code>public.payment_p2007_04.amount</code>. - */ - @NotNull - public BigDecimal getAmount() { - return (BigDecimal) get(4); - } - - /** - * Setter for <code>public.payment_p2007_04.payment_date</code>. - */ - public void setPaymentDate(LocalDateTime value) { - set(5, value); - } - - /** - * Getter for <code>public.payment_p2007_04.payment_date</code>. - */ - @NotNull - public LocalDateTime getPaymentDate() { - return (LocalDateTime) get(5); - } - - // ------------------------------------------------------------------------- - // Constructors - // ------------------------------------------------------------------------- - - /** - * Create a detached PaymentP2007_04Record - */ - public PaymentP2007_04Record() { - super(PaymentP2007_04.PAYMENT_P2007_04); - } - - /** - * Create a detached, initialised PaymentP2007_04Record - */ - public PaymentP2007_04Record(Integer paymentId, Integer customerId, Integer staffId, Integer rentalId, BigDecimal amount, LocalDateTime paymentDate) { - super(PaymentP2007_04.PAYMENT_P2007_04); - - setPaymentId(paymentId); - setCustomerId(customerId); - setStaffId(staffId); - setRentalId(rentalId); - setAmount(amount); - setPaymentDate(paymentDate); - resetTouchedOnNotNull(); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/PaymentP2007_05Record.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/PaymentP2007_05Record.java deleted file mode 100644 index 058e3961ba..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/PaymentP2007_05Record.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables.records; - - -import jakarta.validation.constraints.NotNull; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_05; - -import org.jooq.impl.TableRecordImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class PaymentP2007_05Record extends TableRecordImpl<PaymentP2007_05Record> { - - private static final long serialVersionUID = 1L; - - /** - * Setter for <code>public.payment_p2007_05.payment_id</code>. - */ - public void setPaymentId(Integer value) { - set(0, value); - } - - /** - * Getter for <code>public.payment_p2007_05.payment_id</code>. - */ - public Integer getPaymentId() { - return (Integer) get(0); - } - - /** - * Setter for <code>public.payment_p2007_05.customer_id</code>. - */ - public void setCustomerId(Integer value) { - set(1, value); - } - - /** - * Getter for <code>public.payment_p2007_05.customer_id</code>. - */ - @NotNull - public Integer getCustomerId() { - return (Integer) get(1); - } - - /** - * Setter for <code>public.payment_p2007_05.staff_id</code>. - */ - public void setStaffId(Integer value) { - set(2, value); - } - - /** - * Getter for <code>public.payment_p2007_05.staff_id</code>. - */ - @NotNull - public Integer getStaffId() { - return (Integer) get(2); - } - - /** - * Setter for <code>public.payment_p2007_05.rental_id</code>. - */ - public void setRentalId(Integer value) { - set(3, value); - } - - /** - * Getter for <code>public.payment_p2007_05.rental_id</code>. - */ - @NotNull - public Integer getRentalId() { - return (Integer) get(3); - } - - /** - * Setter for <code>public.payment_p2007_05.amount</code>. - */ - public void setAmount(BigDecimal value) { - set(4, value); - } - - /** - * Getter for <code>public.payment_p2007_05.amount</code>. - */ - @NotNull - public BigDecimal getAmount() { - return (BigDecimal) get(4); - } - - /** - * Setter for <code>public.payment_p2007_05.payment_date</code>. - */ - public void setPaymentDate(LocalDateTime value) { - set(5, value); - } - - /** - * Getter for <code>public.payment_p2007_05.payment_date</code>. - */ - @NotNull - public LocalDateTime getPaymentDate() { - return (LocalDateTime) get(5); - } - - // ------------------------------------------------------------------------- - // Constructors - // ------------------------------------------------------------------------- - - /** - * Create a detached PaymentP2007_05Record - */ - public PaymentP2007_05Record() { - super(PaymentP2007_05.PAYMENT_P2007_05); - } - - /** - * Create a detached, initialised PaymentP2007_05Record - */ - public PaymentP2007_05Record(Integer paymentId, Integer customerId, Integer staffId, Integer rentalId, BigDecimal amount, LocalDateTime paymentDate) { - super(PaymentP2007_05.PAYMENT_P2007_05); - - setPaymentId(paymentId); - setCustomerId(customerId); - setStaffId(staffId); - setRentalId(rentalId); - setAmount(amount); - setPaymentDate(paymentDate); - resetTouchedOnNotNull(); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/PaymentP2007_06Record.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/PaymentP2007_06Record.java deleted file mode 100644 index 08b2d65edd..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/PaymentP2007_06Record.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables.records; - - -import jakarta.validation.constraints.NotNull; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -import no.sikt.graphitron.example.generated.jooq.tables.PaymentP2007_06; - -import org.jooq.impl.TableRecordImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class PaymentP2007_06Record extends TableRecordImpl<PaymentP2007_06Record> { - - private static final long serialVersionUID = 1L; - - /** - * Setter for <code>public.payment_p2007_06.payment_id</code>. - */ - public void setPaymentId(Integer value) { - set(0, value); - } - - /** - * Getter for <code>public.payment_p2007_06.payment_id</code>. - */ - public Integer getPaymentId() { - return (Integer) get(0); - } - - /** - * Setter for <code>public.payment_p2007_06.customer_id</code>. - */ - public void setCustomerId(Integer value) { - set(1, value); - } - - /** - * Getter for <code>public.payment_p2007_06.customer_id</code>. - */ - @NotNull - public Integer getCustomerId() { - return (Integer) get(1); - } - - /** - * Setter for <code>public.payment_p2007_06.staff_id</code>. - */ - public void setStaffId(Integer value) { - set(2, value); - } - - /** - * Getter for <code>public.payment_p2007_06.staff_id</code>. - */ - @NotNull - public Integer getStaffId() { - return (Integer) get(2); - } - - /** - * Setter for <code>public.payment_p2007_06.rental_id</code>. - */ - public void setRentalId(Integer value) { - set(3, value); - } - - /** - * Getter for <code>public.payment_p2007_06.rental_id</code>. - */ - @NotNull - public Integer getRentalId() { - return (Integer) get(3); - } - - /** - * Setter for <code>public.payment_p2007_06.amount</code>. - */ - public void setAmount(BigDecimal value) { - set(4, value); - } - - /** - * Getter for <code>public.payment_p2007_06.amount</code>. - */ - @NotNull - public BigDecimal getAmount() { - return (BigDecimal) get(4); - } - - /** - * Setter for <code>public.payment_p2007_06.payment_date</code>. - */ - public void setPaymentDate(LocalDateTime value) { - set(5, value); - } - - /** - * Getter for <code>public.payment_p2007_06.payment_date</code>. - */ - @NotNull - public LocalDateTime getPaymentDate() { - return (LocalDateTime) get(5); - } - - // ------------------------------------------------------------------------- - // Constructors - // ------------------------------------------------------------------------- - - /** - * Create a detached PaymentP2007_06Record - */ - public PaymentP2007_06Record() { - super(PaymentP2007_06.PAYMENT_P2007_06); - } - - /** - * Create a detached, initialised PaymentP2007_06Record - */ - public PaymentP2007_06Record(Integer paymentId, Integer customerId, Integer staffId, Integer rentalId, BigDecimal amount, LocalDateTime paymentDate) { - super(PaymentP2007_06.PAYMENT_P2007_06); - - setPaymentId(paymentId); - setCustomerId(customerId); - setStaffId(staffId); - setRentalId(rentalId); - setAmount(amount); - setPaymentDate(paymentDate); - resetTouchedOnNotNull(); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/PaymentRecord.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/PaymentRecord.java deleted file mode 100644 index 407419fe32..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/PaymentRecord.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables.records; - - -import jakarta.validation.constraints.NotNull; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -import no.sikt.graphitron.example.generated.jooq.tables.Payment; - -import org.jooq.Record1; -import org.jooq.impl.UpdatableRecordImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class PaymentRecord extends UpdatableRecordImpl<PaymentRecord> { - - private static final long serialVersionUID = 1L; - - /** - * Setter for <code>public.payment.payment_id</code>. - */ - public void setPaymentId(Integer value) { - set(0, value); - } - - /** - * Getter for <code>public.payment.payment_id</code>. - */ - public Integer getPaymentId() { - return (Integer) get(0); - } - - /** - * Setter for <code>public.payment.customer_id</code>. - */ - public void setCustomerId(Integer value) { - set(1, value); - } - - /** - * Getter for <code>public.payment.customer_id</code>. - */ - @NotNull - public Integer getCustomerId() { - return (Integer) get(1); - } - - /** - * Setter for <code>public.payment.staff_id</code>. - */ - public void setStaffId(Integer value) { - set(2, value); - } - - /** - * Getter for <code>public.payment.staff_id</code>. - */ - @NotNull - public Integer getStaffId() { - return (Integer) get(2); - } - - /** - * Setter for <code>public.payment.rental_id</code>. - */ - public void setRentalId(Integer value) { - set(3, value); - } - - /** - * Getter for <code>public.payment.rental_id</code>. - */ - @NotNull - public Integer getRentalId() { - return (Integer) get(3); - } - - /** - * Setter for <code>public.payment.amount</code>. - */ - public void setAmount(BigDecimal value) { - set(4, value); - } - - /** - * Getter for <code>public.payment.amount</code>. - */ - @NotNull - public BigDecimal getAmount() { - return (BigDecimal) get(4); - } - - /** - * Setter for <code>public.payment.payment_date</code>. - */ - public void setPaymentDate(LocalDateTime value) { - set(5, value); - } - - /** - * Getter for <code>public.payment.payment_date</code>. - */ - @NotNull - public LocalDateTime getPaymentDate() { - return (LocalDateTime) get(5); - } - - // ------------------------------------------------------------------------- - // Primary key information - // ------------------------------------------------------------------------- - - @Override - public Record1<Integer> key() { - return (Record1) super.key(); - } - - // ------------------------------------------------------------------------- - // Constructors - // ------------------------------------------------------------------------- - - /** - * Create a detached PaymentRecord - */ - public PaymentRecord() { - super(Payment.PAYMENT); - } - - /** - * Create a detached, initialised PaymentRecord - */ - public PaymentRecord(Integer paymentId, Integer customerId, Integer staffId, Integer rentalId, BigDecimal amount, LocalDateTime paymentDate) { - super(Payment.PAYMENT); - - setPaymentId(paymentId); - setCustomerId(customerId); - setStaffId(staffId); - setRentalId(rentalId); - setAmount(amount); - setPaymentDate(paymentDate); - resetTouchedOnNotNull(); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/RentalRecord.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/RentalRecord.java deleted file mode 100644 index 00237a266a..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/RentalRecord.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables.records; - - -import jakarta.validation.constraints.NotNull; - -import java.time.LocalDateTime; - -import no.sikt.graphitron.example.generated.jooq.tables.Rental; - -import org.jooq.Record1; -import org.jooq.impl.UpdatableRecordImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class RentalRecord extends UpdatableRecordImpl<RentalRecord> { - - private static final long serialVersionUID = 1L; - - /** - * Setter for <code>public.rental.rental_id</code>. - */ - public void setRentalId(Integer value) { - set(0, value); - } - - /** - * Getter for <code>public.rental.rental_id</code>. - */ - public Integer getRentalId() { - return (Integer) get(0); - } - - /** - * Setter for <code>public.rental.rental_date</code>. - */ - public void setRentalDate(LocalDateTime value) { - set(1, value); - } - - /** - * Getter for <code>public.rental.rental_date</code>. - */ - @NotNull - public LocalDateTime getRentalDate() { - return (LocalDateTime) get(1); - } - - /** - * Setter for <code>public.rental.inventory_id</code>. - */ - public void setInventoryId(Integer value) { - set(2, value); - } - - /** - * Getter for <code>public.rental.inventory_id</code>. - */ - @NotNull - public Integer getInventoryId() { - return (Integer) get(2); - } - - /** - * Setter for <code>public.rental.customer_id</code>. - */ - public void setCustomerId(Integer value) { - set(3, value); - } - - /** - * Getter for <code>public.rental.customer_id</code>. - */ - @NotNull - public Integer getCustomerId() { - return (Integer) get(3); - } - - /** - * Setter for <code>public.rental.return_date</code>. - */ - public void setReturnDate(LocalDateTime value) { - set(4, value); - } - - /** - * Getter for <code>public.rental.return_date</code>. - */ - public LocalDateTime getReturnDate() { - return (LocalDateTime) get(4); - } - - /** - * Setter for <code>public.rental.staff_id</code>. - */ - public void setStaffId(Integer value) { - set(5, value); - } - - /** - * Getter for <code>public.rental.staff_id</code>. - */ - @NotNull - public Integer getStaffId() { - return (Integer) get(5); - } - - /** - * Setter for <code>public.rental.last_update</code>. - */ - public void setLastUpdate(LocalDateTime value) { - set(6, value); - } - - /** - * Getter for <code>public.rental.last_update</code>. - */ - public LocalDateTime getLastUpdate() { - return (LocalDateTime) get(6); - } - - // ------------------------------------------------------------------------- - // Primary key information - // ------------------------------------------------------------------------- - - @Override - public Record1<Integer> key() { - return (Record1) super.key(); - } - - // ------------------------------------------------------------------------- - // Constructors - // ------------------------------------------------------------------------- - - /** - * Create a detached RentalRecord - */ - public RentalRecord() { - super(Rental.RENTAL); - } - - /** - * Create a detached, initialised RentalRecord - */ - public RentalRecord(Integer rentalId, LocalDateTime rentalDate, Integer inventoryId, Integer customerId, LocalDateTime returnDate, Integer staffId, LocalDateTime lastUpdate) { - super(Rental.RENTAL); - - setRentalId(rentalId); - setRentalDate(rentalDate); - setInventoryId(inventoryId); - setCustomerId(customerId); - setReturnDate(returnDate); - setStaffId(staffId); - setLastUpdate(lastUpdate); - resetTouchedOnNotNull(); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/SalesByFilmCategoryRecord.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/SalesByFilmCategoryRecord.java deleted file mode 100644 index 3282243314..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/SalesByFilmCategoryRecord.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables.records; - - -import jakarta.validation.constraints.Size; - -import java.math.BigDecimal; - -import no.sikt.graphitron.example.generated.jooq.tables.SalesByFilmCategory; - -import org.jooq.impl.TableRecordImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class SalesByFilmCategoryRecord extends TableRecordImpl<SalesByFilmCategoryRecord> { - - private static final long serialVersionUID = 1L; - - /** - * Setter for <code>public.sales_by_film_category.category</code>. - */ - public void setCategory(String value) { - set(0, value); - } - - /** - * Getter for <code>public.sales_by_film_category.category</code>. - */ - @Size(max = 25) - public String getCategory() { - return (String) get(0); - } - - /** - * Setter for <code>public.sales_by_film_category.total_sales</code>. - */ - public void setTotalSales(BigDecimal value) { - set(1, value); - } - - /** - * Getter for <code>public.sales_by_film_category.total_sales</code>. - */ - public BigDecimal getTotalSales() { - return (BigDecimal) get(1); - } - - // ------------------------------------------------------------------------- - // Constructors - // ------------------------------------------------------------------------- - - /** - * Create a detached SalesByFilmCategoryRecord - */ - public SalesByFilmCategoryRecord() { - super(SalesByFilmCategory.SALES_BY_FILM_CATEGORY); - } - - /** - * Create a detached, initialised SalesByFilmCategoryRecord - */ - public SalesByFilmCategoryRecord(String category, BigDecimal totalSales) { - super(SalesByFilmCategory.SALES_BY_FILM_CATEGORY); - - setCategory(category); - setTotalSales(totalSales); - resetTouchedOnNotNull(); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/SalesByStoreRecord.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/SalesByStoreRecord.java deleted file mode 100644 index 906ce50c19..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/SalesByStoreRecord.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables.records; - - -import java.math.BigDecimal; - -import no.sikt.graphitron.example.generated.jooq.tables.SalesByStore; - -import org.jooq.impl.TableRecordImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class SalesByStoreRecord extends TableRecordImpl<SalesByStoreRecord> { - - private static final long serialVersionUID = 1L; - - /** - * Setter for <code>public.sales_by_store.store</code>. - */ - public void setStore(String value) { - set(0, value); - } - - /** - * Getter for <code>public.sales_by_store.store</code>. - */ - public String getStore() { - return (String) get(0); - } - - /** - * Setter for <code>public.sales_by_store.manager</code>. - */ - public void setManager(String value) { - set(1, value); - } - - /** - * Getter for <code>public.sales_by_store.manager</code>. - */ - public String getManager() { - return (String) get(1); - } - - /** - * Setter for <code>public.sales_by_store.total_sales</code>. - */ - public void setTotalSales(BigDecimal value) { - set(2, value); - } - - /** - * Getter for <code>public.sales_by_store.total_sales</code>. - */ - public BigDecimal getTotalSales() { - return (BigDecimal) get(2); - } - - // ------------------------------------------------------------------------- - // Constructors - // ------------------------------------------------------------------------- - - /** - * Create a detached SalesByStoreRecord - */ - public SalesByStoreRecord() { - super(SalesByStore.SALES_BY_STORE); - } - - /** - * Create a detached, initialised SalesByStoreRecord - */ - public SalesByStoreRecord(String store, String manager, BigDecimal totalSales) { - super(SalesByStore.SALES_BY_STORE); - - setStore(store); - setManager(manager); - setTotalSales(totalSales); - resetTouchedOnNotNull(); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/StaffListRecord.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/StaffListRecord.java deleted file mode 100644 index 6189a85db6..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/StaffListRecord.java +++ /dev/null @@ -1,166 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables.records; - - -import jakarta.validation.constraints.Size; - -import no.sikt.graphitron.example.generated.jooq.tables.StaffList; - -import org.jooq.impl.TableRecordImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class StaffListRecord extends TableRecordImpl<StaffListRecord> { - - private static final long serialVersionUID = 1L; - - /** - * Setter for <code>public.staff_list.id</code>. - */ - public void setId(Integer value) { - set(0, value); - } - - /** - * Getter for <code>public.staff_list.id</code>. - */ - public Integer getId() { - return (Integer) get(0); - } - - /** - * Setter for <code>public.staff_list.name</code>. - */ - public void setName(String value) { - set(1, value); - } - - /** - * Getter for <code>public.staff_list.name</code>. - */ - public String getName() { - return (String) get(1); - } - - /** - * Setter for <code>public.staff_list.address</code>. - */ - public void setAddress(String value) { - set(2, value); - } - - /** - * Getter for <code>public.staff_list.address</code>. - */ - @Size(max = 50) - public String getAddress() { - return (String) get(2); - } - - /** - * Setter for <code>public.staff_list.zip code</code>. - */ - public void setZipCode(String value) { - set(3, value); - } - - /** - * Getter for <code>public.staff_list.zip code</code>. - */ - @Size(max = 10) - public String getZipCode() { - return (String) get(3); - } - - /** - * Setter for <code>public.staff_list.phone</code>. - */ - public void setPhone(String value) { - set(4, value); - } - - /** - * Getter for <code>public.staff_list.phone</code>. - */ - @Size(max = 20) - public String getPhone() { - return (String) get(4); - } - - /** - * Setter for <code>public.staff_list.city</code>. - */ - public void setCity(String value) { - set(5, value); - } - - /** - * Getter for <code>public.staff_list.city</code>. - */ - @Size(max = 50) - public String getCity() { - return (String) get(5); - } - - /** - * Setter for <code>public.staff_list.country</code>. - */ - public void setCountry(String value) { - set(6, value); - } - - /** - * Getter for <code>public.staff_list.country</code>. - */ - @Size(max = 50) - public String getCountry() { - return (String) get(6); - } - - /** - * Setter for <code>public.staff_list.sid</code>. - */ - public void setSid(Integer value) { - set(7, value); - } - - /** - * Getter for <code>public.staff_list.sid</code>. - */ - public Integer getSid() { - return (Integer) get(7); - } - - // ------------------------------------------------------------------------- - // Constructors - // ------------------------------------------------------------------------- - - /** - * Create a detached StaffListRecord - */ - public StaffListRecord() { - super(StaffList.STAFF_LIST); - } - - /** - * Create a detached, initialised StaffListRecord - */ - public StaffListRecord(Integer id, String name, String address, String zipCode, String phone, String city, String country, Integer sid) { - super(StaffList.STAFF_LIST); - - setId(id); - setName(name); - setAddress(address); - setZipCode(zipCode); - setPhone(phone); - setCity(city); - setCountry(country); - setSid(sid); - resetTouchedOnNotNull(); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/StaffRecord.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/StaffRecord.java deleted file mode 100644 index 5aa1db0e2a..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/StaffRecord.java +++ /dev/null @@ -1,229 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables.records; - - -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; - -import java.time.LocalDateTime; - -import no.sikt.graphitron.example.generated.jooq.tables.Staff; - -import org.jooq.Record1; -import org.jooq.impl.UpdatableRecordImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class StaffRecord extends UpdatableRecordImpl<StaffRecord> { - - private static final long serialVersionUID = 1L; - - /** - * Setter for <code>public.staff.staff_id</code>. - */ - public void setStaffId(Integer value) { - set(0, value); - } - - /** - * Getter for <code>public.staff.staff_id</code>. - */ - public Integer getStaffId() { - return (Integer) get(0); - } - - /** - * Setter for <code>public.staff.first_name</code>. - */ - public void setFirstName(String value) { - set(1, value); - } - - /** - * Getter for <code>public.staff.first_name</code>. - */ - @NotNull - @Size(max = 45) - public String getFirstName() { - return (String) get(1); - } - - /** - * Setter for <code>public.staff.last_name</code>. - */ - public void setLastName(String value) { - set(2, value); - } - - /** - * Getter for <code>public.staff.last_name</code>. - */ - @NotNull - @Size(max = 45) - public String getLastName() { - return (String) get(2); - } - - /** - * Setter for <code>public.staff.address_id</code>. - */ - public void setAddressId(Integer value) { - set(3, value); - } - - /** - * Getter for <code>public.staff.address_id</code>. - */ - @NotNull - public Integer getAddressId() { - return (Integer) get(3); - } - - /** - * Setter for <code>public.staff.email</code>. - */ - public void setEmail(String value) { - set(4, value); - } - - /** - * Getter for <code>public.staff.email</code>. - */ - @Size(max = 50) - public String getEmail() { - return (String) get(4); - } - - /** - * Setter for <code>public.staff.store_id</code>. - */ - public void setStoreId(Integer value) { - set(5, value); - } - - /** - * Getter for <code>public.staff.store_id</code>. - */ - @NotNull - public Integer getStoreId() { - return (Integer) get(5); - } - - /** - * Setter for <code>public.staff.active</code>. - */ - public void setActive(Boolean value) { - set(6, value); - } - - /** - * Getter for <code>public.staff.active</code>. - */ - public Boolean getActive() { - return (Boolean) get(6); - } - - /** - * Setter for <code>public.staff.username</code>. - */ - public void setUsername(String value) { - set(7, value); - } - - /** - * Getter for <code>public.staff.username</code>. - */ - @NotNull - @Size(max = 16) - public String getUsername() { - return (String) get(7); - } - - /** - * Setter for <code>public.staff.password</code>. - */ - public void setPassword(String value) { - set(8, value); - } - - /** - * Getter for <code>public.staff.password</code>. - */ - @Size(max = 40) - public String getPassword() { - return (String) get(8); - } - - /** - * Setter for <code>public.staff.last_update</code>. - */ - public void setLastUpdate(LocalDateTime value) { - set(9, value); - } - - /** - * Getter for <code>public.staff.last_update</code>. - */ - public LocalDateTime getLastUpdate() { - return (LocalDateTime) get(9); - } - - /** - * Setter for <code>public.staff.picture</code>. - */ - public void setPicture(byte[] value) { - set(10, value); - } - - /** - * Getter for <code>public.staff.picture</code>. - */ - public byte[] getPicture() { - return (byte[]) get(10); - } - - // ------------------------------------------------------------------------- - // Primary key information - // ------------------------------------------------------------------------- - - @Override - public Record1<Integer> key() { - return (Record1) super.key(); - } - - // ------------------------------------------------------------------------- - // Constructors - // ------------------------------------------------------------------------- - - /** - * Create a detached StaffRecord - */ - public StaffRecord() { - super(Staff.STAFF); - } - - /** - * Create a detached, initialised StaffRecord - */ - public StaffRecord(Integer staffId, String firstName, String lastName, Integer addressId, String email, Integer storeId, Boolean active, String username, String password, LocalDateTime lastUpdate, byte[] picture) { - super(Staff.STAFF); - - setStaffId(staffId); - setFirstName(firstName); - setLastName(lastName); - setAddressId(addressId); - setEmail(email); - setStoreId(storeId); - setActive(active); - setUsername(username); - setPassword(password); - setLastUpdate(lastUpdate); - setPicture(picture); - resetTouchedOnNotNull(); - } -} diff --git a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/StoreRecord.java b/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/StoreRecord.java deleted file mode 100644 index 99ad7c59c6..0000000000 --- a/graphitron-example/graphitron-example-db/src/main/java/no/sikt/graphitron/example/generated/jooq/tables/records/StoreRecord.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package no.sikt.graphitron.example.generated.jooq.tables.records; - - -import jakarta.validation.constraints.NotNull; - -import java.time.LocalDateTime; - -import no.sikt.graphitron.example.generated.jooq.tables.Store; - -import org.jooq.Record1; -import org.jooq.impl.UpdatableRecordImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes", "this-escape" }) -public class StoreRecord extends UpdatableRecordImpl<StoreRecord> { - - private static final long serialVersionUID = 1L; - - /** - * Setter for <code>public.store.store_id</code>. - */ - public void setStoreId(Integer value) { - set(0, value); - } - - /** - * Getter for <code>public.store.store_id</code>. - */ - public Integer getStoreId() { - return (Integer) get(0); - } - - /** - * Setter for <code>public.store.manager_staff_id</code>. - */ - public void setManagerStaffId(Integer value) { - set(1, value); - } - - /** - * Getter for <code>public.store.manager_staff_id</code>. - */ - @NotNull - public Integer getManagerStaffId() { - return (Integer) get(1); - } - - /** - * Setter for <code>public.store.address_id</code>. - */ - public void setAddressId(Integer value) { - set(2, value); - } - - /** - * Getter for <code>public.store.address_id</code>. - */ - @NotNull - public Integer getAddressId() { - return (Integer) get(2); - } - - /** - * Setter for <code>public.store.last_update</code>. - */ - public void setLastUpdate(LocalDateTime value) { - set(3, value); - } - - /** - * Getter for <code>public.store.last_update</code>. - */ - public LocalDateTime getLastUpdate() { - return (LocalDateTime) get(3); - } - - // ------------------------------------------------------------------------- - // Primary key information - // ------------------------------------------------------------------------- - - @Override - public Record1<Integer> key() { - return (Record1) super.key(); - } - - // ------------------------------------------------------------------------- - // Constructors - // ------------------------------------------------------------------------- - - /** - * Create a detached StoreRecord - */ - public StoreRecord() { - super(Store.STORE); - } - - /** - * Create a detached, initialised StoreRecord - */ - public StoreRecord(Integer storeId, Integer managerStaffId, Integer addressId, LocalDateTime lastUpdate) { - super(Store.STORE); - - setStoreId(storeId); - setManagerStaffId(managerStaffId); - setAddressId(addressId); - setLastUpdate(lastUpdate); - resetTouchedOnNotNull(); - } -} diff --git a/graphitron-example/graphitron-example-server/pom.xml b/graphitron-example/graphitron-example-server/pom.xml deleted file mode 100644 index 048286b5c5..0000000000 --- a/graphitron-example/graphitron-example-server/pom.xml +++ /dev/null @@ -1,164 +0,0 @@ -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>no.sikt</groupId> - <artifactId>graphitron-example</artifactId> - <version>${revision}${changelist}</version> - </parent> - - <artifactId>graphitron-example-server</artifactId> - - <properties> - <quarkus.platform.version>3.35.1</quarkus.platform.version> - <quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id> - <quarkus.platform.group-id>io.quarkus</quarkus.platform.group-id> - </properties> - - <dependencyManagement> - <dependencies> - <dependency> - <groupId>${quarkus.platform.group-id}</groupId> - <artifactId>${quarkus.platform.artifact-id}</artifactId> - <version>${quarkus.platform.version}</version> - <type>pom</type> - <scope>import</scope> - </dependency> - </dependencies> - </dependencyManagement> - - <dependencies> - <dependency> - <groupId>no.sikt</groupId> - <artifactId>graphitron-example-spec</artifactId> - <version>${revision}${changelist}</version> - </dependency> - <dependency> - <groupId>no.sikt</groupId> - <artifactId>graphitron-common</artifactId> - <version>${revision}${changelist}</version> - </dependency> - <dependency> - <groupId>no.sikt</groupId> - <artifactId>graphitron-servlet</artifactId> - <version>${revision}${changelist}</version> - </dependency> - <dependency> - <groupId>no.sikt</groupId> - <artifactId>graphitron-schema-transform</artifactId> - <version>${revision}${changelist}</version> - </dependency> - <dependency> - <groupId>io.quarkus</groupId> - <artifactId>quarkus-arc</artifactId> - </dependency> - <dependency> - <groupId>io.quarkus</groupId> - <artifactId>quarkus-rest</artifactId> - </dependency> - <dependency> - <groupId>io.quarkus</groupId> - <artifactId>quarkus-undertow</artifactId> - </dependency> - <dependency> - <groupId>io.quarkus</groupId> - <artifactId>quarkus-config-yaml</artifactId> - </dependency> - <dependency> - <groupId>io.quarkus</groupId> - <artifactId>quarkus-jdbc-postgresql</artifactId> - </dependency> - <dependency> - <groupId>io.quarkus</groupId> - <artifactId>quarkus-agroal</artifactId> - </dependency> - <dependency> - <groupId>io.quarkus</groupId> - <artifactId>quarkus-jsonb</artifactId> - </dependency> - <dependency> - <groupId>io.quarkus</groupId> - <artifactId>quarkus-hibernate-validator</artifactId> - </dependency> - <dependency> - <groupId>io.quarkus</groupId> - <artifactId>quarkus-junit5</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>io.rest-assured</groupId> - <artifactId>rest-assured</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>com.approvaltests</groupId> - <artifactId>approvaltests</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>com.fasterxml.jackson.datatype</groupId> - <artifactId>jackson-datatype-jsr310</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.assertj</groupId> - <artifactId>assertj-core</artifactId> - <scope>test</scope> - </dependency> - </dependencies> - - <build> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-resources-plugin</artifactId> - <executions> - <execution> - <id>copy-db-init-scripts</id> - <phase>generate-resources</phase> - <goals> - <goal>copy-resources</goal> - </goals> - <configuration> - <outputDirectory>${project.build.outputDirectory}</outputDirectory> - <resources> - <resource> - <directory>${project.basedir}/../graphitron-example-db/init</directory> - <includes> - <include>*.sql</include> - </includes> - </resource> - </resources> - </configuration> - </execution> - </executions> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - <configuration> - <systemPropertyVariables> - <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager> - <maven.home>${maven.home}</maven.home> - <approval.variant>${approval.variant}</approval.variant> - </systemPropertyVariables> - </configuration> - </plugin> - <plugin> - <groupId>io.quarkus</groupId> - <artifactId>quarkus-maven-plugin</artifactId> - <version>${quarkus.platform.version}</version> - <extensions>true</extensions> - <executions> - <execution> - <goals> - <goal>build</goal> - <goal>generate-code</goal> - <goal>generate-code-tests</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> -</project> diff --git a/graphitron-example/graphitron-example-server/src/main/java/no/sikt/graphitron/example/datafetchers/QueryDataFetcher.java b/graphitron-example/graphitron-example-server/src/main/java/no/sikt/graphitron/example/datafetchers/QueryDataFetcher.java deleted file mode 100644 index 16f2c21f52..0000000000 --- a/graphitron-example/graphitron-example-server/src/main/java/no/sikt/graphitron/example/datafetchers/QueryDataFetcher.java +++ /dev/null @@ -1,29 +0,0 @@ -package no.sikt.graphitron.example.datafetchers; - -import graphql.schema.DataFetcher; -import no.sikt.graphitron.example.generated.graphitron.model.Address; -import no.sikt.graphql.helpers.resolvers.DataFetcherHelper; - -import java.util.concurrent.CompletableFuture; - -public class QueryDataFetcher { - public static DataFetcher<CompletableFuture<String>> helloWorld() { - return env -> new DataFetcherHelper(env).load( - (ctx, selectionSet) -> { return "Hello, World!";}); - } - - public static DataFetcher<CompletableFuture<Address>> addressExample() { - return env -> new DataFetcherHelper(env).load( - (ctx, selectionSet) -> { - return new Address( - null, - "1234", - "Street 1A", - "District", - null, - "ZIP1234", - "98765432", - null); - }); - } -} diff --git a/graphitron-example/graphitron-example-server/src/main/java/no/sikt/graphitron/example/exceptionhandling/SchemaBasedErrorStrategyImpl.java b/graphitron-example/graphitron-example-server/src/main/java/no/sikt/graphitron/example/exceptionhandling/SchemaBasedErrorStrategyImpl.java deleted file mode 100644 index b728445c79..0000000000 --- a/graphitron-example/graphitron-example-server/src/main/java/no/sikt/graphitron/example/exceptionhandling/SchemaBasedErrorStrategyImpl.java +++ /dev/null @@ -1,60 +0,0 @@ -package no.sikt.graphitron.example.exceptionhandling; - -import graphql.execution.ResultPath; -import no.sikt.graphitron.example.generated.graphitron.model.InvalidInput; -import no.sikt.graphql.exception.*; - -import java.util.List; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; -import java.util.stream.Collectors; - -/** - * Implementation of schema-based error strategy for GraphQL operations. - * Handles validation and illegal argument exceptions by mapping them to InvalidInput errors - * that appear in the payload's errors field (not as top-level errors). - */ -public class SchemaBasedErrorStrategyImpl extends SchemaBasedErrorStrategy { - - public SchemaBasedErrorStrategyImpl( - ExceptionStrategyConfiguration configuration, - ExceptionToErrorMappingProvider mappingProvider, - DataAccessExceptionMapper dataAccessMapper) { - super(configuration, mappingProvider, dataAccessMapper); - } - - @Override - public Optional<CompletableFuture<Object>> handleValidationException(ValidationViolationGraphQLException e, String operationName) { - List<InvalidInput> errors = - e.getUnderlyingErrors() - .stream() - .map(it -> new InvalidInput( - it.getPath() - .stream() - .map(Object::toString) - .collect(Collectors.toList()), - it.getMessage())) - .collect(Collectors.toList()); - - return createPayload(operationName, errors); - } - - @Override - public Optional<CompletableFuture<Object>> handleIllegalArgumentException(IllegalArgumentException e, String operationName, ResultPath path) { - return createPayload(operationName, List.of( - new InvalidInput( - path.toList().stream().map(Object::toString).collect(Collectors.toList()), - e.getMessage()) - ) - ); - } - - @Override - protected Object createDefaultDataAccessError(String operationName, String message) { - // Create a default InvalidInput error for data access exceptions - return new InvalidInput( - List.of(operationName), - message - ); - } -} \ No newline at end of file diff --git a/graphitron-example/graphitron-example-server/src/main/java/no/sikt/graphitron/example/server/GraphqlServlet.java b/graphitron-example/graphitron-example-server/src/main/java/no/sikt/graphitron/example/server/GraphqlServlet.java deleted file mode 100644 index d76b667199..0000000000 --- a/graphitron-example/graphitron-example-server/src/main/java/no/sikt/graphitron/example/server/GraphqlServlet.java +++ /dev/null @@ -1,111 +0,0 @@ -package no.sikt.graphitron.example.server; - -import graphql.ExecutionInput; -import graphql.GraphQL; -import graphql.execution.ExecutionStrategy; -import graphql.schema.GraphQLSchema; -import graphql.schema.idl.TypeRuntimeWiring; -import io.agroal.api.AgroalDataSource; -import jakarta.inject.Inject; -import jakarta.servlet.annotation.WebServlet; -import jakarta.servlet.http.HttpServletRequest; -import no.fellesstudentsystem.schema_transformer.transform.SchemaFeatureFilter; -import no.sikt.graphitron.example.datafetchers.QueryDataFetcher; -import no.sikt.graphitron.example.exceptionhandling.SchemaBasedErrorStrategyImpl; -import no.sikt.graphitron.example.generated.graphitron.exception.GeneratedExceptionStrategyConfiguration; -import no.sikt.graphitron.example.generated.graphitron.exception.GeneratedExceptionToErrorMappingProvider; -import no.sikt.graphitron.example.generated.graphitron.graphitron.Graphitron; -import no.sikt.graphitron.servlet.GraphitronServlet; -import no.sikt.graphql.DefaultGraphitronContext; -import no.sikt.graphql.NodeIdStrategy; -import no.sikt.graphql.exception.DataAccessExceptionMapperImpl; -import no.sikt.graphql.exception.ExceptionHandlingBuilder; -import org.jetbrains.annotations.NotNull; -import org.jooq.DSLContext; -import org.jooq.SQLDialect; -import org.jooq.impl.DSL; -import org.jooq.impl.DefaultConfiguration; - -import java.io.Serial; -import java.util.Arrays; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Collectors; - -@WebServlet(name = "GraphqlServlet", urlPatterns = {"graphql/*"}, loadOnStartup = 1) -public class GraphqlServlet extends GraphitronServlet { - @Serial - private static final long serialVersionUID = 1L; - private static final String FEATURE_FLAGS_HEADER = "X-Feature-Flags"; - private static final Map<Set<String>, GraphQLSchema> schemaCache = new ConcurrentHashMap<>(); - private final AgroalDataSource dataSource; - - @Inject - public GraphqlServlet(AgroalDataSource dataSource) { - this.dataSource = dataSource; - } - - @Inject - public NodeIdStrategy nodeIdStrategy; - - @Override - protected GraphQL getSchema(HttpServletRequest request) { - var registry = Graphitron.getTypeRegistry(); - var newWiring = Graphitron.getRuntimeWiringBuilder(nodeIdStrategy); - - - newWiring.type( - TypeRuntimeWiring.newTypeWiring("Query") - .dataFetcher("helloWorld", QueryDataFetcher.helloWorld()) - ); - - newWiring.type( - TypeRuntimeWiring.newTypeWiring("City") - .dataFetcher("addressExample", QueryDataFetcher.addressExample()) - ); - var schema = Graphitron.getFederatedSchema(registry, newWiring, nodeIdStrategy); - - schema = applyFeatureFlags(request, schema); - - var executionStrategy = getCustomExecutionStrategy(); - return GraphQL.newGraphQL(schema) - .queryExecutionStrategy(executionStrategy) - .mutationExecutionStrategy(executionStrategy).build(); - } - - private GraphQLSchema applyFeatureFlags(HttpServletRequest request, GraphQLSchema schema) { - var featureFlagsHeader = request.getHeader(FEATURE_FLAGS_HEADER); - Set<String> featureFlags = featureFlagsHeader == null || featureFlagsHeader.isEmpty() - ? Set.of() - : Arrays.stream(featureFlagsHeader.split(",")) - .map(String::trim) - .filter(s -> !s.isEmpty()) - .collect(Collectors.toSet()); - - return schemaCache.computeIfAbsent(featureFlags, - flags -> new SchemaFeatureFilter(flags).getFilteredGraphQLSchema(schema)); - } - - private static @NotNull ExecutionStrategy getCustomExecutionStrategy() { - var dataAccessMapper = new DataAccessExceptionMapperImpl(); - return new ExceptionHandlingBuilder() - .withDataAccessMapper(dataAccessMapper) - .withSchemaBasedStrategy(new SchemaBasedErrorStrategyImpl( - new GeneratedExceptionStrategyConfiguration(), - new GeneratedExceptionToErrorMappingProvider(), - dataAccessMapper - )) - .build(); - } - - @Override - protected ExecutionInput buildExecutionInput(ExecutionInput.Builder builder) { - var config = new DefaultConfiguration(); - config.set(SQLDialect.POSTGRES); - config.set(dataSource); - QueryCapturingExecuteListener.getInstanceIfEnabled().ifPresent(config::set); - DSLContext ctx = DSL.using(config); - return builder.graphQLContext(Map.of("graphitronContext", new DefaultGraphitronContext(ctx))).build(); - } -} diff --git a/graphitron-example/graphitron-example-server/src/main/java/no/sikt/graphitron/example/server/QueryCapturingExecuteListener.java b/graphitron-example/graphitron-example-server/src/main/java/no/sikt/graphitron/example/server/QueryCapturingExecuteListener.java deleted file mode 100644 index 8d20962957..0000000000 --- a/graphitron-example/graphitron-example-server/src/main/java/no/sikt/graphitron/example/server/QueryCapturingExecuteListener.java +++ /dev/null @@ -1,82 +0,0 @@ -package no.sikt.graphitron.example.server; - -import org.jooq.ExecuteContext; -import org.jooq.ExecuteListener; - -import java.util.Collections; -import java.util.List; -import java.util.Optional; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.atomic.AtomicBoolean; - -/** - * A jOOQ ExecuteListener that captures all executed SQL queries. - * Used for testing to verify which database queries are actually executed. - * <p> - * Must be explicitly enabled via {@link #enable()} before it will capture queries. - */ -public class QueryCapturingExecuteListener implements ExecuteListener { - - private static final QueryCapturingExecuteListener INSTANCE = new QueryCapturingExecuteListener(); - private static final AtomicBoolean enabled = new AtomicBoolean(false); - private final List<String> executedQueries = new CopyOnWriteArrayList<>(); - - private QueryCapturingExecuteListener() {} - - public static QueryCapturingExecuteListener getInstance() { - return INSTANCE; - } - - public static Optional<QueryCapturingExecuteListener> getInstanceIfEnabled() { - return enabled.get() ? Optional.of(INSTANCE) : Optional.empty(); - } - - public static void enable() { - enabled.set(true); - } - - public static void disable() { - enabled.set(false); - } - - public static boolean isEnabled() { - return enabled.get(); - } - - @Override - public void executeStart(ExecuteContext ctx) { - if (ctx.sql() != null) { - executedQueries.add(ctx.sql()); - } - } - - /** - * Returns all captured SQL queries. - */ - public List<String> getExecutedQueries() { - return Collections.unmodifiableList(executedQueries); - } - - /** - * Checks if any COUNT query was executed. - */ - public boolean hasCountQuery() { - return countCountQueries() > 0; - } - - /** - * Returns the number of COUNT queries executed. - */ - public long countCountQueries() { - return executedQueries.stream() - .filter(q -> q.toLowerCase().contains("count(")) - .count(); - } - - /** - * Clears all captured queries. Should be called before each test. - */ - public void clear() { - executedQueries.clear(); - } -} diff --git a/graphitron-example/graphitron-example-server/src/main/java/no/sikt/graphitron/example/server/SubNodeIdStrategy.java b/graphitron-example/graphitron-example-server/src/main/java/no/sikt/graphitron/example/server/SubNodeIdStrategy.java deleted file mode 100644 index a8a3c61054..0000000000 --- a/graphitron-example/graphitron-example-server/src/main/java/no/sikt/graphitron/example/server/SubNodeIdStrategy.java +++ /dev/null @@ -1,8 +0,0 @@ -package no.sikt.graphitron.example.server; - -import jakarta.inject.Singleton; -import no.sikt.graphql.NodeIdStrategy; - -@Singleton -public class SubNodeIdStrategy extends NodeIdStrategy { -} diff --git a/graphitron-example/graphitron-example-server/src/main/resources/META-INF/jooq-validation-mapping.xml b/graphitron-example/graphitron-example-server/src/main/resources/META-INF/jooq-validation-mapping.xml deleted file mode 100644 index 66928a0a35..0000000000 --- a/graphitron-example/graphitron-example-server/src/main/resources/META-INF/jooq-validation-mapping.xml +++ /dev/null @@ -1,10 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<constraint-mappings - xmlns="http://jboss.org/xml/ns/javax/validation/mapping" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/mapping - validation-mapping-1.1.xsd" - version="1.1"> - - <bean class="no.sikt.graphitron.example.generated.jooq.tables.records.FilmRecord" ignore-annotations="false"/> -</constraint-mappings> \ No newline at end of file diff --git a/graphitron-example/graphitron-example-server/src/main/resources/META-INF/resources/graphiql/index.html b/graphitron-example/graphitron-example-server/src/main/resources/META-INF/resources/graphiql/index.html deleted file mode 100644 index 05c979729d..0000000000 --- a/graphitron-example/graphitron-example-server/src/main/resources/META-INF/resources/graphiql/index.html +++ /dev/null @@ -1,81 +0,0 @@ -<!-- - * Copyright (c) 2021 GraphQL Contributors - * All rights reserved. - * - * This source code is licensed under the license found in the - * LICENSE file in the root directory of this source tree. ---> -<!doctype html> -<html lang="en"> - <head> - <meta charset="UTF-8"> - <title>GraphiQL - - - - - - - - - - - - - - -
Loading...
- - - diff --git a/graphitron-example/graphitron-example-server/src/main/resources/META-INF/resources/graphiql/vendor/graphiql-plugin-explorer.umd.js b/graphitron-example/graphitron-example-server/src/main/resources/META-INF/resources/graphiql/vendor/graphiql-plugin-explorer.umd.js deleted file mode 100644 index 3842b111a1..0000000000 --- a/graphitron-example/graphitron-example-server/src/main/resources/META-INF/resources/graphiql/vendor/graphiql-plugin-explorer.umd.js +++ /dev/null @@ -1,13 +0,0 @@ -(function(j,N){typeof exports=="object"&&typeof module!="undefined"?N(exports,require("@graphiql/react"),require("react"),require("graphql")):typeof define=="function"&&define.amd?define(["exports","@graphiql/react","react","graphql"],N):(j=typeof globalThis!="undefined"?globalThis:j||self,N(j.GraphiQLPluginExplorer={},j.GraphiQL.React,j.React,j.GraphiQL.GraphQL))})(this,function(j,N,M,Ue){"use strict";var xt=Object.defineProperty;var qe=Object.getOwnPropertySymbols;var wt=Object.prototype.hasOwnProperty,Ft=Object.prototype.propertyIsEnumerable;var Be=(j,N,M)=>N in j?xt(j,N,{enumerable:!0,configurable:!0,writable:!0,value:M}):j[N]=M,he=(j,N)=>{for(var M in N||(N={}))wt.call(N,M)&&Be(j,M,N[M]);if(qe)for(var M of qe(N))Ft.call(N,M)&&Be(j,M,N[M]);return j};function be(i){if(i&&i.__esModule)return i;var t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});return i&&Object.keys(i).forEach(function(a){if(a!=="default"){var r=Object.getOwnPropertyDescriptor(i,a);Object.defineProperty(t,a,r.get?r:{enumerable:!0,get:function(){return i[a]}})}}),t.default=i,Object.freeze(t)}var ze=be(M),He=be(Ue);function Se(i){return i&&Object.prototype.hasOwnProperty.call(i,"default")&&Object.keys(i).length===1?i.default:i}var ae={},oe={},ke=Se(ze),Ge=Se(He);Object.defineProperty(oe,"__esModule",{value:!0});var We=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(i){return typeof i}:function(i){return i&&typeof Symbol=="function"&&i.constructor===Symbol&&i!==Symbol.prototype?"symbol":typeof i},_e=function(){function i(t,a){var r=[],e=!0,o=!1,c=void 0;try{for(var f=t[Symbol.iterator](),u;!(e=(u=f.next()).done)&&(r.push(u.value),!(a&&r.length===a));e=!0);}catch(n){o=!0,c=n}finally{try{!e&&f.return&&f.return()}finally{if(o)throw c}}return r}return function(t,a){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return i(t,a);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),k=Object.assign||function(i){for(var t=1;t0?_=""+b+g:_=b;var E=c.type.toString(),A=(0,v.parseType)(E),V={kind:"VariableDefinition",variable:{kind:"Variable",name:{kind:"Name",value:_}},type:A,directives:[]},H=function(F){return(r.props.definition.variableDefinitions||[]).find(function(T){return T.variable.name.value===F})},I=void 0,Q={};if(typeof o!="undefined"&&o!==null){var G=(0,v.visit)(o,{Variable:function(F){var T=F.name.value,J=H(T);if(Q[T]=Q[T]+1||1,!!J)return J.defaultValue}}),K=V.type.kind==="NonNullType",L=K?k({},V,{type:V.type.type}):V;I=k({},L,{defaultValue:G})}else I=V;var te=Object.entries(Q).filter(function(C){var F=_e(C,2);F[0];var T=F[1];return T<2}).map(function(C){var F=_e(C,2),T=F[0];return F[1],T});if(I){var X=r.props.setArgValue(I,!1);if(X){var re=X.definitions.find(function(C){return!!C.operation&&!!C.name&&!!C.name.value&&!!r.props.definition.name&&!!r.props.definition.name.value?C.name.value===r.props.definition.name.value:!1}),y=[].concat(q(re.variableDefinitions||[]),[I]).filter(function(C){return te.indexOf(C.variable.name.value)===-1}),S=k({},re,{variableDefinitions:y}),O=X.definitions,D=O.map(function(C){return re===C?S:C}),R=k({},X,{definitions:D});r.props.onCommit(R)}}},d=function(){if(!(!o||!o.name||!o.name.value)){var b=o.name.value,g=(r.props.definition.variableDefinitions||[]).find(function(L){return L.variable.name.value===b});if(!!g){var _=g.defaultValue,E=r.props.setArgValue(_,{commit:!1});if(E){var A=E.definitions.find(function(L){return L.name.value===r.props.definition.name.value});if(!A)return;var V=0;(0,v.visit)(A,{Variable:function(te){te.name.value===b&&(V=V+1)}});var H=A.variableDefinitions||[];V<2&&(H=H.filter(function(L){return L.variable.name.value!==b}));var I=k({},A,{variableDefinitions:H}),Q=E.definitions,G=Q.map(function(L){return A===L?I:L}),K=k({},E,{definitions:G});r.props.onCommit(K)}}}},h=o&&o.kind==="Variable",w=this.state.displayArgActions?l.createElement("button",{type:"submit",className:"toolbar-button",title:h?"Remove the variable":"Extract the current value into a GraphQL variable",onClick:function(b){b.preventDefault(),b.stopPropagation(),h?d():p()},style:f.styles.actionButtonStyle},l.createElement("span",{style:{color:f.colors.variable}},"$")):null;return l.createElement("div",{style:{cursor:"pointer",minHeight:"16px",WebkitUserSelect:"none",userSelect:"none"},"data-arg-name":c.name,"data-arg-type":u.name,className:"graphiql-explorer-"+c.name},l.createElement("span",{style:{cursor:"pointer"},onClick:function(b){var g=!o;g?r.props.addArg(!0):r.props.removeArg(!0),r.setState({displayArgActions:g})}},(0,v.isInputObjectType)(u)?l.createElement("span",null,o?this.props.styleConfig.arrowOpen:this.props.styleConfig.arrowClosed):l.createElement(le,{checked:!!o,styleConfig:this.props.styleConfig}),l.createElement("span",{style:{color:f.colors.attribute},title:c.description,onMouseEnter:function(){o!==null&&typeof o!="undefined"&&r.setState({displayArgActions:!0})},onMouseLeave:function(){return r.setState({displayArgActions:!1})}},c.name,Ae(c)?"*":"",": ",w," ")," "),n||l.createElement("span",null)," ")}}]),t}(l.PureComponent),ot=function(i){z(t,i);function t(){var a,r,e,o;U(this,t);for(var c=arguments.length,f=Array(c),u=0;u0;_&&r.setState({displayFieldActions:!0})},onMouseLeave:function(){return r.setState({displayFieldActions:!1})}},(0,v.isObjectType)(s)?l.createElement("span",null,n?this.props.styleConfig.arrowOpen:this.props.styleConfig.arrowClosed):null,(0,v.isObjectType)(s)?null:l.createElement(le,{checked:!!n,styleConfig:this.props.styleConfig}),l.createElement("span",{style:{color:u.colors.property},className:"graphiql-explorer-field-view"},o.name),this.state.displayFieldActions?l.createElement("button",{type:"submit",className:"toolbar-button",title:"Extract selections into a new reusable fragment",onClick:function(_){_.preventDefault(),_.stopPropagation();var E=s.name,A=E+"Fragment",V=(h||[]).filter(function(L){return L.name.value.startsWith(A)}).length;V>0&&(A=""+A+V);var H=n?n.selectionSet?n.selectionSet.selections:[]:[],I=[{kind:"FragmentSpread",name:{kind:"Name",value:A},directives:[]}],Q={kind:"FragmentDefinition",name:{kind:"Name",value:A},typeCondition:{kind:"NamedType",name:{kind:"Name",value:s.name}},directives:[],selectionSet:{kind:"SelectionSet",selections:H}},G=r._modifyChildSelections(I,!1);if(G){var K=k({},G,{definitions:[].concat(q(G.definitions),[Q])});r.props.onCommit(K)}else console.warn("Unable to complete extractFragment operation")},style:k({},u.styles.actionButtonStyle)},l.createElement("span",null,"\u2026")):null),n&&p.length?l.createElement("div",{style:{marginLeft:16},className:"graphiql-explorer-graphql-arguments"},p.map(function(g){return l.createElement(rt,{key:g.name,parentField:o,arg:g,selection:n,modifyArguments:r._setArguments,getDefaultScalarArgValue:r.props.getDefaultScalarArgValue,makeDefaultArg:r.props.makeDefaultArg,onRunOperation:r.props.onRunOperation,styleConfig:r.props.styleConfig,onCommit:r.props.onCommit,definition:r.props.definition})})):null);if(n&&((0,v.isObjectType)(s)||(0,v.isInterfaceType)(s)||(0,v.isUnionType)(s))){var m=(0,v.isUnionType)(s)?{}:s.getFields(),b=n?n.selectionSet?n.selectionSet.selections:[]:[];return l.createElement("div",{className:"graphiql-explorer-"+o.name},w,l.createElement("div",{style:{marginLeft:16}},h?h.map(function(g){var _=c.getType(g.typeCondition.name.value),E=g.name.value;return _?l.createElement(lt,{key:E,fragment:g,selections:b,modifySelections:r._modifyChildSelections,schema:c,styleConfig:r.props.styleConfig,onCommit:r.props.onCommit}):null}):null,Object.keys(m).sort().map(function(g){return l.createElement(t,{key:g,field:m[g],selections:b,modifySelections:r._modifyChildSelections,schema:c,getDefaultFieldNames:f,getDefaultScalarArgValue:r.props.getDefaultScalarArgValue,makeDefaultArg:r.props.makeDefaultArg,onRunOperation:r.props.onRunOperation,styleConfig:r.props.styleConfig,onCommit:r.props.onCommit,definition:r.props.definition,availableFragments:r.props.availableFragments})}),(0,v.isInterfaceType)(s)||(0,v.isUnionType)(s)?c.getPossibleTypes(s).map(function(g){return l.createElement(ot,{key:g.name,implementingType:g,selections:b,modifySelections:r._modifyChildSelections,schema:c,getDefaultFieldNames:f,getDefaultScalarArgValue:r.props.getDefaultScalarArgValue,makeDefaultArg:r.props.makeDefaultArg,onRunOperation:r.props.onRunOperation,styleConfig:r.props.styleConfig,onCommit:r.props.onCommit,definition:r.props.definition})}):null))}return w}}]),t}(l.PureComponent);function st(i){try{return i.trim()?(0,v.parse)(i,{noLocation:!0}):null}catch(t){return new Error(t)}}var ut={kind:"OperationDefinition",operation:"query",variableDefinitions:[],name:{kind:"Name",value:"MyQuery"},directives:[],selectionSet:{kind:"SelectionSet",selections:[]}},ue={kind:"Document",definitions:[ut]},Y=null;function pt(i){if(Y&&Y[0]===i)return Y[1];var t=st(i);return t?t instanceof Error?Y?Y[1]:ue:(Y=[i,t],t):ue}var Ve={buttonStyle:{fontSize:"1.2em",padding:"0px",backgroundColor:"white",border:"none",margin:"5px 0px",height:"40px",width:"100%",display:"block",maxWidth:"none"},actionButtonStyle:{padding:"0px",backgroundColor:"white",border:"none",margin:"0px",maxWidth:"none",height:"15px",width:"15px",display:"inline-block",fontSize:"smaller"},explorerActionsStyle:{margin:"4px -8px -8px",paddingLeft:"8px",bottom:"0px",width:"100%",textAlign:"center",background:"none",borderTop:"none",borderBottom:"none"}},ct=function(i){z(t,i);function t(){var a,r,e,o;U(this,t);for(var c=arguments.length,f=Array(c),u=0;u`.docExplorerWrap{height:unset!important;min-width:unset!important;width:unset!important}.doc-explorer-title{font-size:var(--font-size-h2);font-weight:var(--font-weight-medium)}.doc-explorer-rhs{display:none}.graphiql-explorer-root{font-family:var(--font-family-mono)!important;font-size:var(--font-size-body)!important;padding:0!important}.graphiql-explorer-root>div:first-child{padding-left:var(--px-8)}.graphiql-explorer-root input{background:hsl(var(--color-base))}.graphiql-explorer-root select{background-color:hsl(var(--color-base));border:1px solid hsla(var(--color-neutral),var(--alpha-secondary));border-radius:var(--border-radius-4);color:hsl(var(--color-neutral));margin:0 var(--px-4);padding:var(--px-4) var(--px-6)} -`)(),de={exports:{}},ee={};/* -object-assign -(c) Sindre Sorhus -@license MIT -*/var je=Object.getOwnPropertySymbols,yt=Object.prototype.hasOwnProperty,ht=Object.prototype.propertyIsEnumerable;function bt(i){if(i==null)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(i)}function St(){try{if(!Object.assign)return!1;var i=new String("abc");if(i[5]="de",Object.getOwnPropertyNames(i)[0]==="5")return!1;for(var t={},a=0;a<10;a++)t["_"+String.fromCharCode(a)]=a;var r=Object.getOwnPropertyNames(t).map(function(o){return t[o]});if(r.join("")!=="0123456789")return!1;var e={};return"abcdefghijklmnopqrst".split("").forEach(function(o){e[o]=o}),Object.keys(Object.assign({},e)).join("")==="abcdefghijklmnopqrst"}catch{return!1}}St();/** @license React v17.0.2 - * react-jsx-runtime.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var kt=ke,Re=60103;if(ee.Fragment=60107,typeof Symbol=="function"&&Symbol.for){var Le=Symbol.for;Re=Le("react.element"),ee.Fragment=Le("react.fragment")}var _t=kt.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,Ct=Object.prototype.hasOwnProperty,Et={key:!0,ref:!0,__self:!0,__source:!0};function Me(i,t,a){var r,e={},o=null,c=null;a!==void 0&&(o=""+a),t.key!==void 0&&(o=""+t.key),t.ref!==void 0&&(c=t.ref);for(r in t)Ct.call(t,r)&&!Et.hasOwnProperty(r)&&(e[r]=t[r]);if(i&&i.defaultProps)for(r in t=i.defaultProps,t)e[r]===void 0&&(e[r]=t[r]);return{$$typeof:Re,type:i,key:o,ref:c,props:e,_owner:_t.current}}ee.jsx=Me,ee.jsxs=Me,de.exports=ee;const P=de.exports.jsx,Pe=de.exports.jsxs;function At(i){const{setOperationName:t}=N.useEditorContext({nonNull:!0}),{schema:a}=N.useSchemaContext({nonNull:!0}),{run:r}=N.useExecutionContext({nonNull:!0});return P(gt,he({schema:a,onRunOperation:e=>{e&&t(e),r()},explorerIsOpen:!0,colors:{keyword:"hsl(var(--color-primary))",def:"hsl(var(--color-tertiary))",property:"hsl(var(--color-info))",qualifier:"hsl(var(--color-secondary))",attribute:"hsl(var(--color-tertiary))",number:"hsl(var(--color-success))",string:"hsl(var(--color-warning))",builtin:"hsl(var(--color-success))",string2:"hsl(var(--color-secondary))",variable:"hsl(var(--color-secondary))",atom:"hsl(var(--color-tertiary))"},arrowOpen:P("svg",{viewBox:"0 -4 13 15",style:{color:"hsla(var(--color-neutral), var(--alpha-tertiary, 0.4))",marginRight:"var(--px-4)",height:"var(--px-16)",width:"var(--px-16)"},children:P("path",{d:"M3.35355 6.85355L6.14645 9.64645C6.34171 9.84171 6.65829 9.84171 6.85355 9.64645L9.64645 6.85355C9.96143 6.53857 9.73835 6 9.29289 6L3.70711 6C3.26165 6 3.03857 6.53857 3.35355 6.85355Z",fill:"currentColor"})}),arrowClosed:P("svg",{viewBox:"0 -2 13 15",style:{color:"hsla(var(--color-neutral), var(--alpha-tertiary, 0.4))",marginRight:"var(--px-4)",height:"var(--px-16)",width:"var(--px-16)"},children:P("path",{d:"M6.35355 11.1464L9.14645 8.35355C9.34171 8.15829 9.34171 7.84171 9.14645 7.64645L6.35355 4.85355C6.03857 4.53857 5.5 4.76165 5.5 5.20711V10.7929C5.5 11.2383 6.03857 11.4614 6.35355 11.1464Z",fill:"currentColor"})}),checkboxUnchecked:P("svg",{viewBox:"0 0 15 15",style:{color:"hsla(var(--color-neutral), var(--alpha-tertiary, 0.4))",marginRight:"var(--px-4)",height:"var(--px-16)",width:"var(--px-16)"},children:P("circle",{cx:"7.5",cy:"7.5",r:"6",stroke:"currentColor",fill:"none"})}),checkboxChecked:Pe("svg",{viewBox:"0 0 15 15",style:{color:"hsl(var(--color-info))",marginRight:"var(--px-4)",height:"var(--px-16)",width:"var(--px-16)"},children:[P("circle",{cx:"7.5",cy:"7.5",r:"7.5",fill:"currentColor"}),P("path",{d:"M4.64641 7.00106L6.8801 9.23256L10.5017 5.61325",fill:"none",stroke:"white",strokeWidth:"1.5"})]}),styles:{buttonStyle:{backgroundColor:"transparent",border:"none",color:"hsla(var(--color-neutral), var(--alpha-secondary, 0.6))",cursor:"pointer",fontSize:"1em"},explorerActionsStyle:{padding:"var(--px-8) var(--px-4)"},actionButtonStyle:{backgroundColor:"transparent",border:"none",color:"hsla(var(--color-neutral), var(--alpha-secondary, 0.6))",cursor:"pointer",fontSize:"1em"}}},i))}function Ot(i){const t=M.useRef(i);return t.current=i,M.useMemo(()=>({title:"GraphiQL Explorer",icon:()=>Pe("svg",{height:"1em",strokeWidth:"1.5",viewBox:"0 0 24 24",fill:"none",children:[P("path",{d:"M18 6H20M22 6H20M20 6V4M20 6V8",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"}),P("path",{d:"M21.4 20H2.6C2.26863 20 2 19.7314 2 19.4V11H21.4C21.7314 11 22 11.2686 22 11.6V19.4C22 19.7314 21.7314 20 21.4 20Z",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"}),P("path",{d:"M2 11V4.6C2 4.26863 2.26863 4 2.6 4H8.77805C8.92127 4 9.05977 4.05124 9.16852 4.14445L12.3315 6.85555C12.4402 6.94876 12.5787 7 12.722 7H14",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"})]}),content:()=>P(At,he({},t.current))}),[])}j.useExplorerPlugin=Ot,Object.defineProperties(j,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}); diff --git a/graphitron-example/graphitron-example-server/src/main/resources/META-INF/resources/graphiql/vendor/graphiql.min.css b/graphitron-example/graphitron-example-server/src/main/resources/META-INF/resources/graphiql/vendor/graphiql.min.css deleted file mode 100644 index 6318023d0e..0000000000 --- a/graphitron-example/graphitron-example-server/src/main/resources/META-INF/resources/graphiql/vendor/graphiql.min.css +++ /dev/null @@ -1,641 +0,0 @@ -/*!*********************************************************************************************!*\ - !*** css ../../../node_modules/css-loader/dist/cjs.js!../../graphiql-react/font/roboto.css ***! - \*********************************************************************************************/ -@font-face { - font-family: Roboto; - font-style: italic; - font-weight: 400; - font-display: swap; - src: url(data:font/woff2;base64,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) - format('woff2'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, - U+FE2E-FE2F; -} -@font-face { - font-family: Roboto; - font-style: italic; - font-weight: 400; - font-display: swap; - src: url(data:font/woff2;base64,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) - format('woff2'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -@font-face { - font-family: Roboto; - font-style: italic; - font-weight: 400; - font-display: swap; - src: url(data:font/woff2;base64,d09GMgABAAAAAAMwAA4AAAAABZgAAALdAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGiYbIBw2BmAANBEMCoI4ghsLEAABNgIkAxwEIAWDCgcgG3YEyI7DdHsjE9IUV+CFDh74vPL9/MmgO0un0soqjWt7En2kQoCMtXsRxyxkMqP9iO6NfSiUaLJuoRIKnhI0+ImbcWOB5XOAFVmCgxZQQmuBJRhZtsUCXm/492Dyuk2YZJdkdApZeOzyEQgKOwDgRjASBEEBVmAlgACtOHEhpjLyyrACMAB0vaLa6cAw5bc5bvhA2uwO7zXAyKPmkYNnAJgBxLEMDxFLqVBPI6EQ/daTr/QOAgfCngRoZc4UZiL623qCkf/oHVsfRCOuAIbJyF4ajQQKQLmQhNBAA4aygH9b19Xw4iAC8DkKM6WrYw/ABMAOWEAamA7sgBWACgAUSlc3SCmlc95o45idYD92Qt/+5gF19v3FALtB9+7dq/h6/Ljyu/zzYfnngwdlHxO+k39nOcO/e7nPf2vCoo3HVlmNTdnWwW3JZffuVU6cQX14kb3qUGOOJ+mjP9iMeb1Nivq5gXpJUWm+cmVK56e6PjI2uce23hHlG48vyDvym5/5q+wbkjq90rN+z53D6zXqmVUPVshZoVtrZgc4vleS1NNrni6VR8I/vTrpzpPwu1+1Pel4xBIzK16W3KcLNnVGl2RGZHbPXBAvhw4M02Ci/t0BBfw/p79XS9V7CKAMF0++DK9rtI/7MXvGATjz0TEA4K4oef476t9dS555BAoLBYCA6ei/FSzVgvg/cIR45gpTaLWeLiB+oa4xJuTks7r7/xwCmCzlpoJKALCDQmkyEsCsN0mELUADghGsGgAF6c9IXkabDYyqg6WMkZd9z7BT5gaphhhqnOH66aOvkTQhggQLpsk0xBB9DNSLJttgPQTQJBtoIE0JEY2wb+1lhF6GG62XngKUGKLFECMNkW2kZgP10+M31GZUwfojwkU0uAcQkISKFNtqGMlau3vIjjRUjMANjYkDNKeouYh7CRBmuD4CHQgHG6GXET8oT7ZU6QqUStddiABBJPSv6P315AAA) - format('woff2'); - unicode-range: U+1F00-1FFF; -} -@font-face { - font-family: Roboto; - font-style: italic; - font-weight: 400; - font-display: swap; - src: url(data:font/woff2;base64,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) - format('woff2'); - unicode-range: U+0370-03FF; -} -@font-face { - font-family: Roboto; - font-style: italic; - font-weight: 400; - font-display: swap; - src: url(data:font/woff2;base64,d09GMgABAAAAAA8YAA4AAAAAIAwAAA7AAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGjQbhlocNgZgAIEAEQwKqgSlAAuCFgABNgIkA4QoBCAFgwoHIBt7G6OilpNWKhD8VYINh9o6+IoibkckFlELYovEnhpqEw5rTn/e1suwBSjaNcu4suz9n3jcWQcRrZXVPXCMsw+MIR+FMuwj40/HiI9xLIFVlPzc/Dy/zT/3XR5pAGb8ja8LKxcWukgzwYhaYGNU/ZQFxqLUVbuKhLd+MV/4m+w5Zhh/TqIcXmFFha2pbQiiNXT2bz+xUcQ2ClBzETSjEUCShW9ljKqw9VUk7wy62bj2txdropFFKSzBta/GGt+Y27eGWiiWyt7ti0gzFst8qOChQ0ge4e4Xlam50l6yu9/9571CniizBRTuQZii8rm9Jr3MJgXO5YHQ3fG/aiWhUC9UCdG2QoIRVa66XrCQtr6N6d8LoO2fUBohjoNU0/lfEUIVAcAkglGnCGlSg8wqhwgFeZAnQEDWpEUo2+9j5/Cu5Dy+i3cj9dodvLthT+/jQXc+j+9jQ4rqABCgQFVZgfgbAXENFhRCfbAhSLvJmn6RxTicVSDHB8Ca+Dznc0Prx37oR1d4uq/bnwjmW1rxklSRuTn+CMHl/qVl73Pmgos3js84a3+7n77Iq+1vE+1Fe3EhBXNMmbNkzZa9pZZz5IzPDdJur1AZsxYCloY5KVb4Id2f00SQWKZSyXIZxEFWb0ciZZweIg8biEPPNMhI8ZFLF97yWrRtwsAfKm+mqTSkjNRXIJrSEARYZDpddprdgvERSxcFBLCwysSIBqbLTaXhv2f1A0M8oA30gf5m+sC+2Pj79CaTVAsJ99HmgMzkreYnj7uutWi3UZCfeEK3Tp7cg4LQ/QaGwOPB9geMQt8AsFuWoEsXXiiY1jpMckLx8uE3sWE+MOLIUDHqk+R+m7xPvo7+098gHWLLQNHq1djde79LPpSvKM6AiH99Hmb+irlbd3fp3ZrbtzYPEtmzFO10pFtaeULsgC6LMEdY/2D3Brv7XjMJlrmHZcjjUJMYXcIDQaKhRP2xtyjW4vtCx/AR2IYtAaVikUCEbFqOgZggNHw9TiTV0zivDoHumy5YOohObF03tTrQ4VJlsBoLVDxVP/tDiqGrWr4E+6dyMcgcXBHwjcvr/Wio6T8/k2j3OHZ7eEDLUvDYK0qwnHYVzdyxP6a+hhg6UzcgxO0qdGIquQ71IHGYGYFAgyY689cq3+BFK+UiisgwhzE80guq+evJ7BabrUvK89hDJ6GjaKnXnHitv5Kiv71suv9EU0JXyUb011Rpa9fDLWF9SPrArCFyfg46z168k3t2zuGwtbZT1/xVsaOxlwjJ7KV+eFNfSxJie1oCtpsVqnixnwdz5u2z4oToO5UhpzRdZZMnPr1WRb0EyaYInb9lcHiuauG7pwjRQ8pZyD+89BCy7roasB0G/tFty5j8x3YGm069vWUZqwXisRsa+XTgOhfV/vxvhS0czgPe3oieIlQz2Spt5ypuqKo4fvp2+SIadwu6N9UfWxL75NKakCgf59Aidg4vWB9lT4ud57P8FGjmUT8XYDza6guZC2dpxRBWBi89oRP77VGElIrA6MCemtZEzOKmnqPApyu9WSAF3ksWM8OYQDxnfYS2X+7t9b9Ys+Bp6vl409pkS8dxps+CulHTNUbAluhid+nMSJBU6dB07+5VxIcfL+sJyb2PfcTKD8qEwLQYzAApmcHCQOhpnK38zNesrPt9GAWVoSAMu+fy1x3OO2aaIRnikpKp5Wq3s4dhKdEn8MNHNTpF8nOSHI2uvRsuCCB3X/1Hvhs2KFQQJzdlfCHbyWzHiD6tNK/OtKP4Iv6oTf+Ao82ctyoJgsYG2PdbyJmmKw24GJ9vKTHiPCYcyOmWm7V4D+WLusFvhQI4Q0qYoqt695xlHuBq4nxuxC12FVN0bYqZdp3dWv6/GLeQZyXqPUzRDQife3X1jsGFjkDF3SGGih4lJ+Fbc656cy7M77xWfXL+KZDGaxo0lg/jarRdQiti/KN64OEeYHkxQoOTg1Egqg6WXysFevCW+hMb4tEo3j0j1++jQlmjPMe+IPZG7d7Wa3i3yuAfaRwrnL7aVwBntBUGqxhnRPnEThy6KcpCyh6GIW7aJvFu3IS33aPuWyBVIqrjuqJQJzVn0Ou9fUMXjiX6SzzfwTuFY/i+HufuKnZvJ+NuyVZiGO+do48TDlQHpvs0p77olAj34NKGKB/nsEuJSOFUEjHcZdIhCyfyBcnDcH8na8ZuJ6/i3HETuX+C8BQK6oI/i9aVooM1gT/kmpS4XU2/XlZV4RJ0qMbvs0yj3EgL61X9bbdEqjMjI1ssIPyIluCo/XLptIB1rOwcsQCLiem7yuNwKrZw6zRux41z3Mm0XdL0vasNKW6rNzoTB8mYfrpIUcqasfsH+tmqCoZHDea9KqaeIxzc2PJND7xwvqdxsEMea+cfe0HjEzw2nd8D69PPTch6nhvipm2unCIr8P/T3G1GPJoPt7uacVpUcHxDzUmk3vw7apHGZ5xwVNhG1CV0RKIenNnv9c62liKv93C/g58BKSxXqCDObE39QHZQ4tWH9U7POCj2DBMPcHFrBCO1iLupF/RXajiqRVOiyZY11ZMG8j1Kzs3kdOPlRryX8pM3H3ELYY/c13SvAU9Tvhvp/eRsBYN566dxdtkq2Y3h3Pxa+YbsgQwdziq8inG4ypu1ZxCX4n1VPp/lG+fp/TS3HOmpzOpNwJWUo/fUjyZiF3p2RqUQJ+D/qv0/g7tQonUlUTZTzK1pBeVT5+b2M5PylRq67/zKbiGu4vdyapef4ZT2iv++xUZ85i+NTuaOh+D5oE52pK9rkGRE8P9Rjs3fOoM7cPNlxfFHkXaAFjv4Se9UKfanensobAYrlzdy9Sh5dGyklWArycbCyuxlVv7f9ZtwLqqvQ9n1QK3bjF3htCfLAbYe3mQl5hQHzT8tvWniSWjH51BZCfniQKRxJ8YB9XrrJMPszqtKraJYBsOR6dohF7OFEIcQG6hb+jRZbrCy4Ytc190n72O+u+0K/KiIVW+OhdVZCSOsM74QyW8m6hNRCKpDOHUrOuBrc137WvmqWW+Ykz5pekYdK+3a33Xesm7n2TdEM9hanBkr79zfedaVbEz2zG9C42AreNDYM3lzQgqW5MRIHnfroBdTNiaUcpcZmElNWU84zXd2WSnfKb8fDYOdVzsn1r3f/Owhkx/ou9QweWXoBT3+Oi7TJTDQgZexYsNbNmSFH7zNtT44OJ0MNr22MYW98XkoB9UmhYoRmbIJFamn7uNw8u6F0sJtv7mz3EPfs3A+Edau0g0Ws2N04UBKIcpFdemhNQin5yORRsaEDH19UKSr4ZZ1oS6EludGhdkfmsB5XhbfVteJ0POCy6ltu9WbdycW5sB32JZko3yQsWLh0qZc86629z4/JuEij7bwof4Ec7Nc+9j/DfgWeNz5AAQPAJCCHjJC1gRJGrSAAJ/X/10iV+QSC2CgmAY/shNMh18hpAxcEuTlkDmyMizaBN5AU5pQbgAoAIYAdiARDIJGShoMSeQxWJFRp4cxwdeBjsONlkrjsTQ6ARvSkCaEj+gkTIg6cTLs3NhmIIIHWendyzREcarpFFJBk7mYTilvX0aPuuKjdDq0tZROq0WjM6Ejvjyjjrwx87gCKTRmHpvvLyAVlnTBRHIj0yU05Bm505C+sHEfcu30+pcoAx1zQHbS2MFXOu6wVkrjJ2l0wkH9KU0ceUQn7Q2uc3L3nPoYNj8ip524AU+BdEC1QyneD1RqLObISfKS4gHDlGeJFUyTZgp4a7IBigCtM/T6WuFoyDDY8lgoyKTGGztjBKSlhZqWQ7Z4CdLSQlFakC2ehbS0YIsO2eJJSNs91GWj141Rl1UD5bxaJ49MgcqmtYiUzJ2L4rlz/tHQa8mRhkyHjfuBLDu9/lPKICd5HxhLMvsZ0flRQhzJBKAhf4irAiKEbaruhDCQE1KrDO0LmjsXm+bO+UtDryJ3GjKxP3A/oCtD7P03SJXc7RekRgQAYoAWxCXXGoEY4ATiiotU4D5ox5qmLCZw2ceZpxNf1W141usmAJD7RO/XO4hjwL5cedhoT84LX+UOMCu7GA7QX37Kk/bYuqtHQHsy2n7OFXBLa9WhyscvAnGs9ozYEsxRf87Mxm3FKYWPiyjd/d7peoekWgb2j//py51391nW3IoUXC377AfbJKxVYgBMbMPDbKX4y2H83DKdHy7F+qFQb20L5Nm+hx/Ut7PNEviUcmc2YoB3FrdniRGJi9OHSj5Pd4d7pt4uqZaJJzLOvZQ7t/ZT1kxHaj50xmDbhHWaI8AdoIfHXwZ6K1uQq1cPREr6Vj6Z7vsIr2osSx5dVjU6487j9hjTduP2JC6i9MjRZuu9NtUydJCXY3zVvig/GSnQdWOwTQLN5osL8KQ9jcaa4tQez29CO5EIamI/x7UHxxrXZjwSF/J0LSGgXHvsXis4xbZR8snSvk7474vX+QUPZxOTBBdjX8a1BYfAtad66hjFkcws6VAl8Iuxe23RlCkiqPde+TkMTzlOAAG68Hqx6cZAyHPJX1rtAoBPvxwjAH/k/vPN5uefzJorDUKGAhCk7v7LAJlhUeyvl7uB/CCaYVCaEfjA5D+48Y5lGvYdj5V9KFk9l6jcwWip6JYumbPjjHnGsjp58OMFK5kFPzcSUMY71OUwN/+yOj6y3AcvV5zl1CflL/sy98o2qRx/0fAObsL/j7jefYpoKPXinOv8PLcZL1/5eu7w5VSJcyrFPfVS8HI42lh7hvT4SIW1ZvqY02TfZc5sceQG4UPVry+jRS5e9K29zL7IkmpteFBt0qA9irCg2RoYb6YMQMBALWXeSAKgCKXjUAlIewyTZAA8Apws8h4Jip7LRldmUSs702p1X0bjN1p011kuJEmWI1WMKNHS6TJjwjTJ0+UmSQGJJ5x8pUQRjFZwLAjxy9wX8zRWF+bNQqkyh+ECRtwlCR+EdH0lrDDxC0dHlEfrjtx7GytNDHiiJsGo05w1e4WjrV3xxYy6p0tmxzgBWbqRaHyyMEvIiORUUYxtoUT1elpBX0OHcsa3jge+xSo+kwmM+AFiLIEIAAAA) - format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, - U+01AF-01B0, U+1EA0-1EF9, U+20AB; -} -@font-face { - font-family: Roboto; - font-style: italic; - font-weight: 400; - font-display: swap; - src: url(data:font/woff2;base64,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) - format('woff2'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, - U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -@font-face { - font-family: Roboto; - font-style: italic; - font-weight: 400; - font-display: swap; - src: url(data:font/woff2;base64,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) - format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, - U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, - U+FEFF, U+FFFD; -} -@font-face { - font-family: Roboto; - font-style: italic; - font-weight: 500; - font-display: swap; - src: url(data:font/woff2;base64,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) - format('woff2'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, - U+FE2E-FE2F; -} -@font-face { - font-family: Roboto; - font-style: italic; - font-weight: 500; - font-display: swap; - src: url(data:font/woff2;base64,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) - format('woff2'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -@font-face { - font-family: Roboto; - font-style: italic; - font-weight: 500; - font-display: swap; - src: url(data:font/woff2;base64,d09GMgABAAAAAANUAA4AAAAABbwAAAMBAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGiYbIBw2BmAANBEMCoI0ghgLEAABNgIkAxwEIAWDMgcgG5sECK4GbGM62A+KOMNGmZWUwcdhKI9l4Sh/WwYP/3af9w0W4ERa2bOg405uoSptTooGKkF8HniO5b+Iojvye4dReBbNtVHwcLQTG2gBzQfYOqjJ/XYU/jItwgxa4I3czM4Fj9LAAnlHz+dzgSO71Jqn2QML8H66dROj0qAFLYnRhtm0b89/erW/v8l/LA6we9gCizDBtQzSf4EtkcwDT6RtmgYEQXnDKGQslZyX/CkQSFgBAE4ERggEAgmwACwQgADMsONAJKVkFWEBgAJgwMz1NlLWec3G+jtZu+rXO1i7rx/sZi0AEwB5WVY28FUE1CORQAjvtSPftAwCQQjGAbTUfm4qwrvbNmDEf5pjR4JoxElAiYiMWjQyIAEy4EBGAA4UNKCgIMC7a5Cej2sCAA+SMEEyYA2AMQBWgCmQAObACrAAQAUAJCSDMEDmo7CztfXoRGu7SUeVdbvosOq6N6PHnZ2yf9l3eXPj/q2qXdkjBL+qrix1cYsqzItOvXfRPaMXkUvPeFWoxr7tZB8gfxIhMauBapmSUhO8d3O8wUt0MoI7UAxLzt0/zhCwJnVHrsPYXenm8suPeLYORWqn/3wwK6Qp+frDiYGvxHSXFzoXfpihfmlODl9oFbOqKa8nXbZgd6axNivh4JS8xEZKChij/nuDBPx/MrxQA/WBACCtK44947xa66g/k0YcALjxaesDuBuQP/7x/3bTwmQACVMkAAQYd/7HYBqK1H97hriqWIzlN7cD8Qu1mY6Ql7eR9v8qAcCY/apKqAgArEBCCmOEAExoJiOUENTgBAI3NSBhwSjIbLboV0Blo3PIiN06hxVFfmrr0WtMvzYtWg3SBPDjz58mVY8eLTrpNOm6NfKhidepk6ZAbgbym+oG6PoN0zXxUaBHgx6Demiy6Zq0GdIl3aB6ndo04r7WvSV0/Qa0Nd2+yKcNFCrSvh/6dNKO3xV33aBeEXxNZKTyQUaverfOR49+LZno1XUboBt4oSzpEiXLUSjZDgF8+JHBMIY0KQAA) - format('woff2'); - unicode-range: U+1F00-1FFF; -} -@font-face { - font-family: Roboto; - font-style: italic; - font-weight: 500; - font-display: swap; - src: url(data:font/woff2;base64,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) - format('woff2'); - unicode-range: U+0370-03FF; -} -@font-face { - font-family: Roboto; - font-style: italic; - font-weight: 500; - font-display: swap; - src: url(data:font/woff2;base64,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) - format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, - U+01AF-01B0, U+1EA0-1EF9, U+20AB; -} -@font-face { - font-family: Roboto; - font-style: italic; - font-weight: 500; - font-display: swap; - src: url(data:font/woff2;base64,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) - format('woff2'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, - U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -@font-face { - font-family: Roboto; - font-style: italic; - font-weight: 500; - font-display: swap; - src: url(data:font/woff2;base64,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) - format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, - U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, - U+FEFF, U+FFFD; -} -@font-face { - font-family: Roboto; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(data:font/woff2;base64,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) - format('woff2'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, - U+FE2E-FE2F; -} -@font-face { - font-family: Roboto; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(data:font/woff2;base64,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) - format('woff2'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -@font-face { - font-family: Roboto; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(data:font/woff2;base64,d09GMgABAAAAAALsAA4AAAAABWAAAAKbAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGiYbIBw2BmAANBEMCoIYgXsLEAABNgIkAxwEIAWCdAcgG0AEAB6HcYyyEjO2Dy0eKLv4XvfsrGs+wIhEBOHOERRRTI2158fc/aln0WYmSJq8uTRSIgUyIVMqpfa/7uYHCqzWDuHREj0f5UuuL+ZAokTaYgiIs5sF5aUutjO7QhBlgMaYvCAIIqqoCggoq0+HjRlX70MGclDLyR3Z8fb0q/ectzCv30obmLesvO5hBhRhcp7kToaLpaRXpL0htKmb5C3rIgzUIwA1fnqrhHSbqXhA3v+sK1wRtcWuhdyg9E5tGXERkaAhroCGeNqCnJxAm6m1Sb58SICvFhXFWnVAAWQoYRjYADJUQQqIYm0uSZKkfpYv1sv21dm9b7kWbV6i3BQ2Z/sOf/hl+ezXH88LRz75pnLuq4/MO/Zx+eyHc3x9VDn3yfx9n1ILyusq3ps75y90fVZ657PJ2iXgF+odHbvzv7Lrm+uTsPR0WJqYcelN7180rHDDnbeWbrx0QHht49uXjCzffOsd5RsvGvHe4yF5o+Ej97/ZMP62+Z+3Wz/08CtZ/FezhpdvG/nb6PMhC9vNvHFx3Du9X47etewROuONg4L0v2eI+L9X7dt0evq+gNihfvWttiuWK4f8VmxWBM/+WK8b8F6Y9evfLf57r9SjuA2URBAobPm/Smni3y3+n1TqgQEACsl5awAI/5AetjNp65A+/38vDAUXaayPL4CMKHYkEFC0DlfIlbAMegyqlmGU2eSTO58TTHX2xLyWvlczc/wY7eDo5WxlYenKyMvNg9Go5MAatqis2Jty2oytLaPupFxOlsgFObsjM05dBxMHVwcMbeFma4xFh8jZxUr2e62Th09I7Bd96I2RI3gzYzqKcsHjqZzGjsamlojTwdmCy9bKFNm7IBcudRU5BU09BQ5eTm5coMaMAw==) - format('woff2'); - unicode-range: U+1F00-1FFF; -} -@font-face { - font-family: Roboto; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(data:font/woff2;base64,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) - format('woff2'); - unicode-range: U+0370-03FF; -} -@font-face { - font-family: Roboto; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(data:font/woff2;base64,d09GMgABAAAAAA2oAA4AAAAAHqAAAA1TAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGjQbhlocNgZgAIEAEQwKpzCiKguCFgABNgIkA4QoBCAFgnQHIBsPGqOiVnFWWRD8RUImd2GxGAljk2gcqPUJjX6sRnWJIw3uCR6ILv03uzO7gQrfXeBCSq30KiEFfa2TEv5Mbw7wtEszkukgZUI6op2o/++etP84lubf8X9FzbJCVahWuCRlnD6ISTaXVKgpMU2KIFDiUma3cM5CAO9TYmtx0+R5cq20u5dkNv+cR87kv6onZPvCFF2VuMve8aZED8QKiF2Fq6okYMcadRWgdLWuFVrja5ge0Jp+eZyjhlmj1Dj6/FaEwCAIAIiChEl6BEDIiCgIcdQhEBhAABCAAATgRxQaMFSs7OYHSm0HE6mg1LEPngJK3Vpnp4MSSNf2RDrwgBBEegAQgAEYpMUI0BoBCFKRQKDI6pIgIa0gCov/+IGCT1qA6lfABv0x1N1O17/1r1GluCv6q17tAeI7Oj6jQYbBQ79pLm8ttupnyKl18VD9gdtyVL/0H+V9vVrv15/0StKCEEg8uuhjiDGmmGOJNbbY4wgZhMz6Cwa+xKEOkMvpM5CHYBhprq9DOMnoQhBrcogNeVVtqWIS5U10RjuioKoP4IvNd5i/7BJL4OYmMKEbYOaFDyZGoC/2OyDICAUSApCchNKV5IPMwfkO85cHBGBZDUxFmIHrUjERmrVs/cKQEpACckBumhzQPxetj27KCaIVBWqx0gdEaNjYvE4HAzAmKaxbwJ17lFDbkww2wgjbYoEXOtiLDQgDWQEgi6tVwpABTeTkTG8rB8JAt9ufER5QLGGKNEJVJIlVYtX13fXT9W/YFq1BGCJEqIhEsVKsuFa6frh+xc9JxwLa9J72DvB2fj7reannM54+yd7KIikOgX5KPllaE0zyFIy4cKAUYNwF2QBQPQDTAQDKLE3YYfYUw8ID0ZOAhRo/dr1wkebt8zGRjuUoNGOLCbZWTAeXBdla1qLxQ+/rW9IMTMKvlWQJBkIZgjL86fO/PdTzpEf8xB+r+duvefnrH4yiETPKkEGeJxsYe37P/vFSk7t6Qni4EPrdJftzKewFwtWCacRnOedfdRMNmxAKNTsn6Na43kdvRIwa3sfoex3ZZ3JPALnMPgp2pSAkVbFKbIeyQHwmbNpwVwiqjh7/ceslqcxrF6rXojf+leic8KIihlLCGavY91EOU86D3May+x/+2j/+38b6ii9C2Bh5VLNppQKHqegUdR01i7DQRIsPDLrnPKtp/rSPhT4MdtlwqxInVbaj6gANEgS6jm/c0h69hiqF8HYzKblTWlWVadWIMlVnPjrEOoNgs6zF9O5yV+0mOkODdf1rRElraARrybSCtdlnmXA1YhT7b/lD/h+hXTls/Zq+xnfW16W4zAshCUiV8nTXsswQDadaM1XchmKDvU2MP7cushlqHGCTlzHUULp8J/fIdXPT0aQdLDzMcNZ+bG+cR/hNG3hryBYiabqUjJJsvkqsPFj5WPCFUGd/94Ph4UIJe34vN7jyMmaQu9TMz3HmRZ9CeU6ZeAtgtNOMqTTgg3/ey1UmkjgJCTcpeX1Ym9qiMxGnPRvlbntO78ry9e+NlDbGBsrHy5aB8swZvnJrIHnHUJ5j1Jk9d31GaXvGs8g6O9tEnOt8Y1Y5v81bV9hmZ9jcPiLQq+kP7ruY3vjW9f8bruSUM0GkVKqtW73PZdTDYNmv2QTy/NmRB8u3LY9NLC4N36HdraEPHoS2nSV9LDQod5dioxZ0ev+nwLn2wQqh+JQ47Vt3FG1j9OyeqXOQ8n5Pw9YUIiuWFptA9+7TfbTxgJ0rKebEj3nRjUN+JTVeEhyR8GRWg7ON+0ZDRPS/H3MfPZI+2iAZi80+lB41xw99KvDPAWv3ggsTPF7LPtVbuFjbc4ka6R6lC/sRsWpI6qPpo6+8z2C6PzZHdh2d0maiZ/5yvQJrLqbte6HXgnHe2a4g5qSJ/dAw2Sz5rCtX924lIUWpKRASs2LYnyeTZ9wLyecNXD7ov2dTZ98NyZea7LO5/lbStKm7Z3dtvJs0eeYW+Ud17Vp6aduek5w6lnzw+7lblZbxJxf38DmI+2SOM9kKPm8X+CiiYsD8dC07ucq2i+ueOSr3BdKd4Zm/4jyqnbp+6PrTiKAW3xQjywKf3uTevaYVGjdXs2GKWQq1x1g23wLrzFxLzrf7AmX9tmz9uHhxpNViDHXG3SrZagv8PmySrmQ4bF7m0dNZRHuXPST12ZQZFyZOxuwybUd1y1/JX2XynNDyoX+eTpp5P0jv/wPPurNpU6dvJ4fs3Xhr6pQjN/z9uNbHr9WkjpHLnmvH/Ss589O8kaGK+f+/lTq/Zu5pbx9BHT1o8v68RGPtRYUIR0I30Gn3xa9v3lznXB/Ht+BeaI6/O3htO8fUnPwFWHUPZ8zDnQz6rx91G0ILi9/dqtRWR/zyfEOtroMawiP7uk3DQ3MUrZALlVP3WVhNVnLWaqZU3eo8ry++oWXN2m5sVObELzsPprNravGCYrTUqntD1sRa/2Ldvca1SlZN8LAq1PT+4p6n2yMa/W5huHVs4/K54eP5w2En54wmCra7enrTMm8XR8NVb68GjSfEiXvprzafSoaz38TNeOhwEZVlzU3hFaYxhI6iBVY1r1pum11oWwbf+SaNn2NPvCrtTrQ16l5ZxZnorJG2jLu1jdrQSkqhJR01PUz3/UVrjnVAY50nYmXWWOookdhuWLVU1UquFoXPhVBUFS2XyVlipeU9s8O9vF6d4hWsQHJFb3evzJlQM8Z3dxtVLVMl4SQLJ/m6uBMxswHVNCJ+xNRLX92d7Kgz6lcp8uCcWHxswbGRS/bLb1huyMnEK+Mtill3UqgsSv3z9clfafiZ+M+7tLfFw+epGDEwADbZ+CqKsIiD9CEAU7RDlxQYEiQRkCBLMAeFmcwrWWtaSOdkFUT7868oLPiQJAFg8HUpEuQYKl1G5pTvBcacsoMQGs4RoVVmEd7pX2QRnBCWgRHdbBbJSSEeGNn9DYvihGDyj+p2fftiEeOUMNK7jRjEeqhm0bwWmiyaFv1P9zBaMCwthvcjZ4d0MNpjSXGUY1GwFmtXSwq1WNuajoKxv+QgfoKL7dooYU65R/gwp6wihDpoFViZhaOZdCycZmEWGN7kXxZBu3AOjGhhs0g6hHJgZOIbFkW74POPanGd2zC9U9g1ogJsCRoBU5LTjGtHCLJpLnBJol1mCqyCG4g7bJA5WIkAkAfLISswp+IRTswpmwih4TwTOpkW4W06gZjJK2ENeXQdEDN5LSQhj64jZDamQhYOug6IefobYaJXBdgJDAGh6HTintAVwmxXXLKov6i1qD93mFNxiHLMKTsJoQ6eCMMyC0dX6ahLsQJXRAb034KFyHtAvMBbsJQhrwQmeIHQCBEi2slVYSdEIS1WlyzqLyot6s8t5lSoqMecsl2nUge3BVZm4ej8zVGXYtX/cAI1iBXsCL6ENAndlphT7hIYc0oXeITj+wB8QY5wCU5OO6OlxZhBfiU/Vuh2ADBSL/AxXjQHoJw2F91187W6qfeDMcTOrZeB0Up9IEl/kvO2HLX6k3lXvSUY5EHbCCFvddNjAQ7vaiWpVunuXW2+lh55IX2DReV1R8LlQas56YC+IEN14LV/sLVX3M6jTZVxt408LEC7+lBJ7j42HjabECTxIC/k2qW6ySbvVokpD4no/UXWwoDtM1j3sMbB3G7qk88b+0IVuWo162+YdFGnpIHJPiPtv7Kls7WXPOw32rqy7nZ5PQv2g/jn4EtAPLEqWePdIkqVh/HyeCJRnWLAGsUaSs3TpYH04LGO7UNYd7Oovpb2sSK61UyCzPe4PiXq0sCnFF9rL4pHebSpMu520WALaO87ZOv2jY5oC1GhJFZvsXc1toyxd1GQXCVps5xXoTQpx7wrzd4rSF9rUTHEkrTtVkRxq0/wuIfVC2phdQ97F2OLhL2r0+VMgnGfcketktGrTI80e28RXVARyj1W6i1u72W5aAECMCLTflw7uEUkd8nfPll8AODUtzS5AbgtfH79N/bntq+ODwXAFwMAAXY3bwD4VhVhbzU+Nl+UTjEbaQdY/P9LUkWRkI1sMjTZpcoZoPLSKM8TbC5FGoMxlSGkybG4ZSnCxXemyVaay87UmqfIaFQyVJ7FLf5jiSoFl7NprmaSJL8wyTzKJjOZCvM4Q4E/LYE/Rc1uZpiTjDY/0MP8qVvKIDqbv+hsrmC0Ocxoc5KxKhxmbby8AebR+8VvvYyX5vo4WWRtCIdq0PHA+8LbbiNi/W1MOkXGe8p7Y6TCCfGJ8f3l/WsNpYSx6VMytbftRXOfrKBa0T6w9rVl2NkYbhBgCjPYUPxgvFYIAgMjCiYE4EMHUIT0BVoCjgoCaEkNgujS1Yx3lUAVMeRTCwfDlxpEA+hUIINMCiBIIoFEspFBDx10vWgZyGQYkKSCJ3QmnVi07LYROXWVT7KTwtrxsACHINc1jEMLHzKIcXI2F1VMIIdUooVyQDQBhSRnemlZq0wfY8yVdDfO04PmwIsbh4JMzND2QJ5dS2DPHO2xIn0cLTIgSNiSSlIsCSdd55lQ0MYNZ+xxxANfHNHUkaUDyoLpLsShAA==) - format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, - U+01AF-01B0, U+1EA0-1EF9, U+20AB; -} -@font-face { - font-family: Roboto; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(data:font/woff2;base64,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) - format('woff2'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, - U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -@font-face { - font-family: Roboto; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(data:font/woff2;base64,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) - format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, - U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, - U+FEFF, U+FFFD; -} -@font-face { - font-family: Roboto; - font-style: normal; - font-weight: 500; - font-display: swap; - src: url(data:font/woff2;base64,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) - format('woff2'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, - U+FE2E-FE2F; -} -@font-face { - font-family: Roboto; - font-style: normal; - font-weight: 500; - font-display: swap; - src: url(data:font/woff2;base64,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) - format('woff2'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -@font-face { - font-family: Roboto; - font-style: normal; - font-weight: 500; - font-display: swap; - src: url(data:font/woff2;base64,d09GMgABAAAAAAMAAA4AAAAABWwAAAKuAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGiYbIBw2BmAANBEMCoIYgXkLEAABNgIkAxwEIAWDAAcgG0oEAB6D426JQgSiDJGrY+EepR5ejwf4/fWd+/C1EBKYZDS7sRFxHTf9uCJn/m9Of4qsOwRQBbqEex0QSbKziM9Pj42dA85/tYTLU84Cj+f+PIAlq3AtV5GCrQWUqr11TNFedSEUjKs7rSju46fX7RWCSHFAeYQcQRBEKIqiAgIKlGZBdO5a3w4akEBWj6orkgSzThrq5iF0WjfiKGe7e/0dAHkwOR8nW+GblHR72hyEGmzEl02NcDPu9oBKt35NVVBcoyEuIJNhau72SE3EHkhapkdqCiZGhBhliQWUJVETSCQCNfr8o/boWoBjI3miLHqQC4ojH22AaUBxFAUpIBJlJeIVGIvLFI6PlFi4hGYVs0brZ4ZZlT0rbz1SLT+50xlW3X269vh2x+CpO/n7bw02ebvIys0wMkpteMHUIq4PGfxCRBdKjxXGaDRIc42rK+a/qgeebsfBvjGMiQ14cnJjW8fSe6fHlr2NIrgbeH2jS+k9X+md9WJP/5IvZ8LRg1cQ3gz+dJMePnr2/6ZSiy3c9rHc87Zj4tqOx0WLe1U0VR2OOEt9kq4gV/r/NBEyVbPvpL70poCoTunu3LVVZ4nW3xWV8gAKP5VqBMD10Pruq+7/52x5c4B8EQjkzs5oyJ/1JzxT0mgEACA3XjUZACFDut7UuAEqPZepikCuTcprJBVAcSJREzIBeaYSC4kSGAs2BJU5IFLcQjt+sxNAqr55kwOx947iBrvVCRYwpBuDQusVLFWyFCmCVcEwCg8JVsPPK1GwEjxesNZJv6dyHtID6dYP8UnUCvPAemHBGiA+jD6CVgilD8+tWyfSPRiYXwVJDNNkydPUzvrRmeBZvFdArqSTDSCJ3ALcvDp0JBHWjTK8pb0Qvx7N35CkXo0yFRq1qZAgVaJkYiA7H3AA) - format('woff2'); - unicode-range: U+1F00-1FFF; -} -@font-face { - font-family: Roboto; - font-style: normal; - font-weight: 500; - font-display: swap; - src: url(data:font/woff2;base64,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) - format('woff2'); - unicode-range: U+0370-03FF; -} -@font-face { - font-family: Roboto; - font-style: normal; - font-weight: 500; - font-display: swap; - src: url(data:font/woff2;base64,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) - format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, - U+01AF-01B0, U+1EA0-1EF9, U+20AB; -} -@font-face { - font-family: Roboto; - font-style: normal; - font-weight: 500; - font-display: swap; - src: url(data:font/woff2;base64,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) - format('woff2'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, - U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -@font-face { - font-family: Roboto; - font-style: normal; - font-weight: 500; - font-display: swap; - src: url(data:font/woff2;base64,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) - format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, - U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, - U+FEFF, U+FFFD; -} - -/*!************************************************************************************************!*\ - !*** css ../../../node_modules/css-loader/dist/cjs.js!../../graphiql-react/font/fira-code.css ***! - \************************************************************************************************/ -@font-face { - font-family: Fira Code; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(data:font/woff;base64,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) - format('woff'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, - U+FE2E-FE2F; -} -@font-face { - font-family: Fira Code; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(data:font/woff;base64,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) - format('woff'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -@font-face { - font-family: Fira Code; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(data:font/woff;base64,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) - format('woff'); - unicode-range: U+1F00-1FFF; -} -@font-face { - font-family: Fira Code; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(data:font/woff;base64,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) - format('woff'); - unicode-range: U+0370-03FF; -} -@font-face { - font-family: Fira Code; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(data:font/woff;base64,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) - format('woff'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, - U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -@font-face { - font-family: Fira Code; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(data:font/woff;base64,d09GRgABAAAAAGmoAA8AAAAAw9QAAQABAAAAAAAAAAAAAAAAAAAAAAAAAABHREVGAAABWAAAAD4AAABSBboFKkdQT1MAAAGYAAAAIAAAACBEdkx1R1NVQgAAAbgAAB2lAABDmkK5r6FPUy8yAAAfYAAAAFsAAABgbi0j31NUQVQAAB+8AAAAKgAAAC55kWzdY21hcAAAH+gAAAG8AAACfnQbS85nYXNwAAAhpAAAAAgAAAAIAAAAEGdseWYAACGsAABAtQAAb2ymrer7aGVhZAAAYmQAAAA2AAAANhL1JvtoaGVhAABinAAAACAAAAAkAzn+tmhtdHgAAGK8AAACZwAABdbECm3rbG9jYQAAZSQAAANBAAADhkisLKVtYXhwAABoaAAAABwAAAAgAjACg25hbWUAAGiEAAABCwAAAkgzWFNlcG9zdAAAaZAAAAAWAAAAIP+fADN42gXBgQWAQBgG0Pf9IKQ5bo4gLZKQFkhyG92IvSfKAliVSWxid4jTJW6PeH2i6yotTTIyRBRmzMIPDl0G6QAAAAEAAAAKABwAHgABREZMVAAIAAQAAAAA//8AAAAAAAB42lzJA5QgMRRE0Zc21rZt27Zt27Zt27Zt27ZtW9kcTgc3qfoIwOOLVgGrUJFSlbjRsHuHVtxo2qFxS260qt+pDUl6NG/TjBs9unfvzg224eQvUjIemfLXKByPQgXzV4pHpYIVpI1K5q8Rj07lSsnpoEqyZ1KlCvK/CP7+xQQEGjp+iGwEshnIViDbgewEshvIHj4GqM4A1fmEali/VSdKNGrTtrWI0qRD/YYiVqu2DVuJJMpUygzKbMo8ykLKEspybTq37iCqAI0IT0SiEpM4xCchiUlOatKTiazkIDf5KEQxSlKWClSmOrWoQz0a0IgmNKMlbehAF3rQh/4MZAjDGMEoxjKeiUxmKtOZyWzmsYBFLGU5q1jDOjayma1sZye72ct+DnKYoxznJKc5y3kucYVr3OQ2d3nAI57wnFe84R0f+cI3fvBbOMITkURUEUPEFvFEIkAgAB0NHUPlcEpfGUoZVukqPaWtdJSIFFoVbYB2QrumPdETyX1K7Vzy1tAn6Kvke88wjE7GMDOG+8P9YaYy96j3nFXJ/WE1sV5If9ll7Gb2DvuSU+j/zKngXPHmeHOcR24zv5Rfyu3ivnJ/eI43Trar/H8MjwOs3mAUQGf+NmsbQ9u8YrZthLNtBrNtBLO9YLZt2/a+XN/oHAf8WvuKEbd9mG9m+qJvtb8guz673l/b/x0+Dh8PlAhMBn1p8CxWBCsSvB2aihUJLQ87eM1wy/B74jZxO/w30jN9MTI68j4aiDaP9o/uj96MYTEvtjl2Nl413jl+Uawef5xoKlZP9EzcFauD+TrZVpouTU92Td7UMlom+TzVPtUdxOjU9dTT1M90y3Tf9OH0xfT9jJFpnFmdOZhNZJnsUsC1N+fLUbmVue35VF7Lz81vhhDIglZDB+EErMB7AfFVpCnSEzmK3Ec/A+IQthTbjVt4Tbw5fhp/ShhEY+IsoH5JVibbkhvJ4xRCWdRl6ilt0LXpxfROphSDMUOZ2cxrtgTbku3LHmbvcgpXm1vM7eRL8Rg/lJ/Nv+Z/CgGhozBUOC08FQ3g1FRcLx6UQhInjQVmS+WMXE6eLK+V/yo+BVEGKxOVhWpI5dTh6lzNB5wZbTOIszqia/p6/Wg5A0Rd46zx24yZglnV7GqONuea682z5m1Lsurane3B9lR7s/3aPmxft187hRzI6Q1ivHMVxEu3AERD9yyIh570v5SzAY8qO+v4+547CZCEEIYwhGw2hJANw2was2GYHULEwGaRRoyAiBgpphQRIyIiRdxSRJ40pXSLETEiRkoRY8R0l+KWImKkkW4pIg8PIiLy8FC60oh0i4iUIg/1f9/z3jv3MvF77/Oemfs77zn/93zOnTNhmxqbWppWNT2bVzKvel5yXpJY55ihxZiB+7EqDmBd9GJlHKTPYnV8jot4PHfyJ7gr4FsF3z1YS91YTXuxnvZhRfVgTd2mb/CP8XL+cdmBOukzRFg/71Ie1/ErVMBJTlKhXw/PuvS9b2fuXmmlYsolkt2lkhzQKGy+5BN2HsbV5/OE8lz4M+2BOmXqotzvPRK+nz6X4SAFKD+HPsZniPFuGn2Y/8TXLAfBu9RZihMjdUuNtYyaERsjdVmhRPInFPHUUnvsK8hPksnkqFn/FyW/XPIDcWq7lmTKQAnR4HL9V+H9h4iR/gN93Y0U/kXonST2vpWIjWcXiJnGy7OriCRaTj8hp/HM7OjsqBCTPp1uhxdpT0TdculFxI0H8HpPmS15BjV1pa8p8/tt9n5y+Bf4NV7mxgCLUjU10GLstdvc2hoXuQbVRY2L0gdtHCBpijSmG9Pp3endwpx0vXtBZ4vGUizxlaXL4F0I3u5RvM8lnvOYzJzH6RahE0EJ7DY5c27PuZ1OCo1lojRzyfCH/rMYX73tGsr2u5eNEeQiRebss5eN8dU9uOqhs0NjLHFjfHXrq2VgHdZAJ0udbozLEOMypC4t1Vq3Qmeue2kNmRgxX9GPG/wYqyglY7nRrW9OxDXUF3l1uRdhwwNyGh682vxqM5FoloLdItNwC1G6xKRupG6AV2i8Za5X6hy8ToEWWKZ19aFcX+qxsBczUXEEtoqXjRxVqt81lNzQsMGLKtWDqFa6l086QVoaWlK9GtWCWXehmNaopoDxrKsgVdbAKrRkC+ouaihSv8xqvS599fMSVQTrqJxqqUlm/Q1rqVpPffYFKJanyolE5zzyClW5Uj2Ogj9VktHIg8ZPoeWM11m8JFtr1lFrszd6WrMOYEW0z25XLYO8xapVpR5bweYqCWmhPetFKwWtkdazcQ314/LX832snPvuJcQk7yXvgd5UzWq3XPIayHlrYNO15AmsrhNIXRb3IgE/QPkjj3XyimvQuIJU9ZND5CSH3EsIm3Vgx+BzDKmNqCZZA3ZQI0pITSWw3dbAXta6tsB7C1KX1WQiSrbRzP8kooRrKJVA6kVUgohK3MsnuSC5yVy+aiOauX4m+nnmQ42oFoxnroDdsgb2fbbkzAvwvoDUZXVeRODHaJ4fUSXV03xaSmtkBa7yzdtFWrFDtCKV/okfApkr5uXXIr823k0kcdSAlGtk9epR4JqQmZkYUg8oL3D3HjkS0SgqRh8lqZmWIaItUmeZb6TtKkC7CpCKJr1DXP9UTO6nu+/vial//Q0y9Temyz3u2mAXNMZZ6nHKNSGpTFT1h6g+cLeXxoZibKVVtIF2SJ3tvnmai6G5GKl330QGVuS+B/kiJ7hOom1FXrWY5xmDZ2z6XBvtK9tBcjXaNAiBPXRNyGwvPpDr1BS4uxCINk6NGOF1tJ32SZ3HxZzEg5lFMxGR1nqQIomb9U/dS5ip6pzWAr4bnufrh+uHhTqT8yZtqXP797JGNcf1ndRedxXstDXQRlCuO0Oc2IX29NX3WV/Vqkedm+q767uVhp9jBvln+TXpp7fpIqdG2k0m54mZyXmv5HotKHlMTsnjuod1D238hf2F/YjhtsY51y1XuA9+l0EvKrMlB8mUDNbZGfADmWgKy8jwr3Gz35PVlKYWWb+dMu57xUz9XqTe+GFG1O9wLyH88rtgG+CzAannsxI+K+tXvvyOjXTc7nG7QVs00nluuXFbQFLWwOZryUrUVInUZa95kcoc+aAbJd7HKE4NmJ3ttIm66IDEuc01lNyG1IuhAzF0uJeNobJn6krQFfBagdTzaoZXc33zS0VCuOoZWD188J8tF90R3QFWobG/7npF14MUWANboKP+mMwrj5G67AcDc/UGPII7ZAtW1iaZqWddQ6mzicMakczcV44nuhPdVn/qzYojoIfgdSix3bLx98ZjhiY6NKYPgvH4a/DaCrpcma1tDcqtScwX1uLFhBouk6HT9K8SV6E78xBjm4x7D/Uj5yLdooc8muWZZMYTMTPjCVKNc8YwOTOG3UvjTE15CnoVXleRusypjU+tnDIMOgQ6hNR6FtRGwQbABpCSzPezIPtB9iP1FLqg0DWjK9qsI7FtxmbQzfDajFTKJdaBtIO0I/XKtaJc64xW9IRHGikyo3FGY7QZ72xdLdEW8Lj24CIZ1RRIsTWwH9ayhNoJqctaM6Maf49eCc9I2dF300G3ruoNYiZ+Ln7Oi6IaqyJ+wr1sDBWR8vOgLfA6Ej8izKl5NOV++QnQFGi397kTfwOkAuQNvLMzYHf0Evg6jX+xxH8aZJk1sCVW9aU7KNcUb1I/fwZES8nQIH03tPYX0Wppg4NyA2LmpYHyy0RaF1bbSwfKz5SfsVFMmV8+GnQXvHaVv6UtSE6pffEh6GbQzeUHtL8rohXE5Z0a749KvAXwagHdqMxqpFAuVb5S2LLwMxh9BxEzXo/S2//ZnvWBqJj5QBSpxv0BvH6A3EsI13TC3idT8z5S9am5gdhv4NpkI56AC/S8RrxcIn4f5IQ1sB/XkodR02GkLlvhRQzeRZNG2ttfjroGhdoJtZ76y3idUOZeVn30hcRa4gl5qt4mc30pInhkDewnbcnEu+jd29Hb6pcZ35vyzPrGSBEkul2Dz0Ci34sAe4sTPZDoSfRoBC0z3gP1RuxDsg9cgvpm0I3KbMlm1NSeWKks9FnHv4IYmonxbhanOC3ROMipQDRQGbNxxnbUUK4qPyUqHei7MtA8nxEo2lMzesYjZSEVOsM/p5+oX3R1nlcZWzujBDWcVJUPi0oEbenC6xFlVmUr2rJpRreycFtq+RetCidGUintjB9HDUtV5SOycg+iHXdB5yqzKhj9xNUZCWVhlSb+JVWpE5URxi9+ScxULY0Pe+MXHySnqil+Na7P0dM2xKtAz2o0Py3lioirSvF6TJkt2YmacuO9ysI9O8TbtGe/lBVNK62W+fyGmKlZU2r8+bwOq2np5PuT79toqDjWTjz5pkbzM8S4/tYtHVuA0a5G3lnNseXjqC86+ZiycExf5jEo68Z0gr5Cl0fqodJiMVNaPG2hFxOic0rNtNS0lI1p0rNJz4inVWlMP+uWm3QXkdwALfIZgZwjM/lc5VNhHZloYvsR0Z/Rt0aKYPJe11Bu7/QaL4LJO8iZvGN66fRSjWDbpG3E00drBOslgnXwwzqufqjMllyAmhZU3xL28+FdERG8b3fF/+RZcrRrKD8aqUZS8oickkfuZSOJPYg9AH1PI/kFGZmbIJesgW3UkqfJlJxG6rJf9CIBP0TzR1KfPixmpg8jVfXpV8mZftW9tB9aJrWAenP1l6QfUiDHrIFt1pK9qKkXqcs+mlGfvoPqR1KfGhczU+NIVX1qjJypMfey6hXNFc2gEVX/ZbdcRR3svjWwrbZkxQ1430Dqsl/JqFecoeVhdbsyaKeYge301N1+hOHSlRHHxbRK1T8m5YphLWpE22S17NDydWRgdZLzcS8GKVMQOp/Ml1IfDZ2LLJDa1/qmMSF6A1tO5J/SLtB4fhUp84+qX60a0Y6QcmFIeYyUaclS9ts05biv3EBmyuEphzPKU/aq8k6p5XXrJzlvBHhDeA3wTngyXpPIyToJyj/tm+rmD5DJH0AqurwKpFd1O9Vjt5hLPuFpgWykhYG71VQwglqrNWr21eaSoSQltZX3Yd6u80n1KJM2CpH2ffC59jXzdmlfGjlZink3rFVe8xTzLpCpPFd5ThW3I++kKn5KPY6C9SkJa/0qN+upWjp7DPM2Wpt23NdqJzPt8LTAGE7zxvDT0pZm9Usj5w3lvuKYGih9HD4jnthUFfmmaug4U0VIRe3FhajzvpjmT7uFaG69mNaRLQK5pNF8Rj0GxVyyx4sD5AgtDNz1UH52P0/baW3qRl9tE/aW9ql6okiHkbdY1brVYzHYXCXhffsMfU/2bTyzZLW+Q/Si1so6fD1DpqytrM3qlWEtVT6QV82vvI38BqT+WJQlNJ69sh+cUb9TyIkq96Mq3upGxeTvZRVUh5YvlZGotMY1/khEyXAZl1mt/G4Qg3w9t6qABz1V7X3+2DDdVRKecz9hT3LpHC/JVpfREYuk/J7YRyZSHalW9U4QWCRm76fsxPtcVe/REquJnYdKwuptqn7+OfUFtErm/DvWplX7c/4IZllsWsy/34f7XD3/Yjrn9X7lfY1hv/C/Uu+1slaVByOBxzclkq9m9cMKiaTXWmWvr/wmVvqblW/699twv80pJPJjWK8xHJAYLqjfMuTAlAdigMewxPA1XpK9/s2Atam+ounFGtg2dVtGcaqn2CuKf61+m5GzTHlY8Z/g4yqeoPPBM0goLqe1tFXm037fVLdiF5mKXUjde1N0Ytw2sK1insdaeKydUC/3PKESZLmY3FMf3nufcwe1RNI1IZ8NfL6X0uuBuwIqCq5XOc1dL7PuobUS/xvzlPfIlAyVDGmM0cJrYFfgcVwInppwPySvfu+VdGtMn5PeO601HUDOVuWh3oMHNPE6wMns8co5aK3M/+zL2UOmbKBsILBH9Kri78t+Xat+a5HTqTykyLXc7ipyQneusd5aldHahd48RmfoEt1lI89yp3zTGCYdJTPpKFJ7kvlk7BmwA64JcV54v3B47Fu43yVmva68cB13m8Uk9lF78H61mFfvUjIwbx2eBzXUPKmRWM32ej3eJ8S8cqUoV1pS6d/nkQOLwsj2Lb3t9VbMW9N/IL01z5aIXXNNeF9mrsQGqS5wdyx4xq5nbh32V87iRmuxHi+G4hoysa5Yl2392KsFvWBl8NgixCk9P/ZswW6wPLA1wji2GPP8kbzKPfXjfZPG22/rnXAFrFZJeCYN0mNp7ducfG6Gr6CNsoZ6fCOtrYvMhK4JXpR1+Y/AtojZKKvGlue/h/s1Yv6cm+B9Th6VkRrU2tKuCf9jLzaQcvrBwF0RjRv5aWHyJWsTl/rfuM6QmTh/4nyrO7Ee5Ji8evmHkF/pjNZTyHLkRTWuz6vHdjAlz62CtTxfnzlnZT8rlO62xpnvn2/I81s686zAcdV6Wz1WgMWUhLToCt2RkbnI6ZGfFUpLffP0UK40D6ltWzfsiZjX9rtkJt/Fd1IdE5DrGs8XZEyuqN+Qa8KPe1GB9FMscHeAcrP7oCQuFngSLikJPglP2hF4En5HV94jiUWIrK901u+wW/V32HS24qQT1ibf8ldyH1p5CbPCKhbKnLCKJ9SjE+wtJWGtDn5Nn9BSI2i1iAVaN6kh2LrY4UDrTqpHibYORFqXeE5xo1XkhCoGPwm30C6p97K16HpPNzZEJroyulLuzZiB0ZvAjsNjkRCONuD+kLx6JbpRIqH7ZK7sbnK+w0tknQzD1zt7PKUlVhGPf6zEj3l8GxnejJizeidWo9bsa5aRiSVjSV2LnSDaO/YzDuwJWFSJr5G/DhofHUlj4jlrk/xnkYkn9VTFalQgb71qDKpHD1ibknDfb9K+r+PUCForrRXd9LUWkSm6WHTRahW/g7xB1TqjHgmwASVhrY9ZLfR66n+/bpxoYGYNBdeNEsb11bAifZmNPmN99T9fN4G53BdUNIcCime9daOKIKL4tSxFRxW/NoJis7XYOV8xSSZ2MnZSFWuR16+K76pHFKxHSUiLI/Rl/Zw+kaXlfzaP0/kvqmZcYlzCavEQ8kpV65x69IGNVvJ8u0bZdnFyBK311go2+1oryRSsKVijWsuRt0y1zqtHA9h8JeF25Wi73h6xXWQtssufk/fJRLZGtlotuou8dap1QT0ugi1X8ny7WMfrKyPM/33Wcpb7Wp1kchbkLMicMeSkVOuieqwGq1ISbleutusLz7VrgWjFrcWivhbmfwyXakVBHqjWJZl7X9ZnpvvIue7zcOtGa+su/z/PxC7Lzr0g60zsb4JnYsEnFujlSZnG7H51OqwVHPSUnTbMlz0Fe3S+rEDedlX+W/VIg61X8vxZ8H09Cx5hbppn1sY/8rTM+9jD74y/o628h7yrqvV36nEB7KyS57XuWi26OILWXt88rZ1kzE6kVmsHyCbV+nv1aHdNyHVfi80Cmhe4S9P47PEzVWonfbViqPWb/sz4mf2qdgMpI3rxY7TZ7PC5to/vSvu+nd2u8SXWxvmfvuPhP27luJWZdTBukSrdtB5Fd8AalITXQRN/RD9zZmW3qmjAN9KaeskU9SLVVoG8qVq3ZIY1qd9m14R/3VMEaaNXAneLnvseu5BW2GdJ7rCWl+fpMuak+5fnqlsk57s85q5+z/qKSwsbQJOgVzLnnGO8M/1vaD1RsONKwrPpL+ip3RFGmrl0Tc3/fKJzoTPVzsDn0z+qRx8sqoRxHX1O8Qk07fz9wv9zR/im1P8XWTvCcGhHaAntCIVS5v+rfFdq+fMs5X8OKS8MKRdJmc+P/B1q1CNrhf5+NOoOmcI9hXv8+6u4346UZNQ3gLwrr3Kf65ZdpdF9S0scAVukJDz/82jIPmHTl7JHfVSHtQLytTEP8+/n31ct94z+lmp9Wz3SYBeVhLRoiPP1mWvWyG3PfeKb6uViH8i9i9TqPYBdF/PyzyP/fK6et+a4ZU9pPP+iHv2uCXngxQOyh34scLeD8v3Tvjjm+EraYEuPPUKGNoKSfvtLejNgrK57Oftx6E/5+3mul0eNgTymP9XZUYVSK4T/m9a+QP1B9MQ/FfqtVesVhQHJzV6ZnWg3xp/O++dLJ1D2FOkZTeSOrDwbz3fUYx/u9ivJ6PXIGBUGNFr0d7QKuyJyVgdXRI495zHwZa4ErOZjXMnH+SR/ns/gesfrj5xq1f+u9MdfgpPmFAb4yefm5jh4ynxBDmISusz/fW4LrFRK/Dux7kAx2Bh4FSD6CRiFZnodzwEfpFbkfoK66JO0iz5Fu+nT9CZ9xq+pRl+JnkKD9d9fBFdsrihskSjq9IztAL1F99hwCddyM7fxRu7iXvTAWb7G9wyZUlNr5pvlpsNsN3tNnzllLpib5r6T55Q79c4Cp83Z4Ox0ep1jzrvOVedBpDBSEamPNEfkd9OCpJgpSEb0bKSg0przyN6bN3AfhUcUqRCqRu4V4khEYn/m9b6j37fl145insgxfoHLuJyn8Cd5F+/mbt7HPfzbvJ8P8O/y7/MR7uN+lDaj2k0MK3oYdezM1GkI7DJyLzvrbb3iu5rvgkPfWZ7x5Stgg8gddJoCvmt4kDgffk4i4NsP1kQmv8kpzviaat4LzTuwZwHfbbi/hNxLZtj3ZV5r9x9z2WVMwpaCNYINBhhWVN5VsKMBlsD9dlhPgKH1Y46ABVrPxs4Ws0EZE8v5kcmtp+HM/sMs/X8FpM8amBG/NJ0BORryGwDpseb7zaX9iLMu5NcJUibm+3GENiL7bMhvJTEfs6Z+TAtRf6l6OUJSIBUhUoUWnw6RqPSrRxh6mC2y286HnUfuGsmLZHafnBO8WFiO+C2EnZKn76BfH/z6OB7wa4V2E/yKg374fRK/UQKon67VK7B76sfE3rdwOkUGdlm9rVIjXgfxPahBaK7Sanj2Y/8hLbmfTOQZWW3Sc8WU5m2D7xrNY/0MS9q8yLu4bw/WHLmAu1YhoywZvQ53jUEf/ZdYQiT+LwV4iY4ZOFSYctzzIfeUk5cEdshiGiVruRzj8dtYtZ8EH2VPksQ3FfJegVqG+Ld4vvxbpAxvohx+Aat/P1b9rgCPg78I/jv8B/ypAC+Senr8enJGVFtMES7lXv5D/vUAbQCdwge4j3cHaBVFaCgrrkL4lmE36udukAhUwhrsrKa1/qdCrf/JW6YzdQwxWCt9nLbLeC2hFb5PecAnQhMoRt9n/86C2p779EVpyXGkfJvoTaWF+qtBNw3RNXqf3bbW8QJu4w28E31zlAf5Mt/hJ6bAlJu0WWrWmh1mn3nLDJnr5oETkWeZpWImd6njPd00WXOu2Xt+F/d18KhDmtnhTxAb+abE+f4Of1hbVIC0kKM8gT/Nb/Ie3su/xwf5EH+O/whRDfBbsl/s5g3Exi23MVMPr4A9Re5Tp03rgi9qmQ/+DL7NAd8a2DByh53ajC/0YsQ5O+BbEvAlsA6s9Q7HqK+ejPAeYmPX8Fhh2JFlr78WYEMoDTVz1meGztNbsq+TsELxOyC7uhjYOPG7RF0g80N+m0BqxXw/6K4ijpwL+bWAvGNN/WS3pOvqVeTtlnQrRKIos80nTMYdDX/X6oXyE8kbL6v7NVn1+jdKfEtyop63RH8h4D1fvdfDez0fD3tHcuFxMOC9zHo798g497jT9ybd0+3YTxDfVICvCPBZWkc/MTcpB9H+W6ZjEl7hUcy5P+JPh1c4F4+4widgdh7lN2UdXszaRfAkxJ/lP+bPBNhCsMP8ef6NAEuCHeIB3hNgFWBBRV3RWAlv8V7cO6qW9TzNXchdqvPLkV5ngvEW/5OiHncwIp4oHhXE0CMhsex/o5p9OqNloEL3dGXfUJWioArZ0S8Rj1MBlckhlXEyVnVZKiijKl2qssWq0NGQylqp8wXxWBZQKRuhLV8MqMylxX6Z7VpOTydog54VGFyNhBUh/zeBef6qaVWNco2jERYVMsV+o6A54HgSx+tXsOJf5yUYrR8KRVQiEQ0E/g64wdslqUONeKq/7y9XzUpZlyXoRdVWI54WqL+SVoe+w384pP0R0T7hf4+tld9oN9Oe4PcTfQ55SfSmQtdRpRNkqA2p5PoxH1IjrvZjflNjni5zFnXwb/p/x2igY1dxXGbAEs1ZrkY847lvVFNRmsnQZfgGW/ojoZa2hlq6WFp6+T8Ay31tswAAAHjaY2Bh2ck4gYGVgYHlC8skBgaGSRCaaTWDEVMFkObm4GQFUgwsDQwM6kD5bCDmYAAC5xAXJ4YDDLz//rPv+VsDFCxhfpHAwDD//nWgWbKsiUAlCgysAEDREo0AeNpjYARCDiBmYBABkzIMTOXpGSUgJgMTAzOIZGRinACk9jAwAAA5UANTAAB42nWLM3idYQCF31PEtvPdG9tObdt2m9q27a61bW+1bfzZn3qOl/pweoFaQG3Ar2pV83VqlQD5GOoQhDtpFDCPCmWoS60rtW7UelPrnXE1fibERBi7iTWFpqmZYo7Y7LaNts12H7t/eUVFBeCOIZ1CdlSRnX8hfU2QCashC/5FKhjoClBhg/If5Z/L35a/KQ2xrgJYm6wV1l5rsJVhzbdSPp77ePZj5MeQWvEIyAU68wa0jV+kNdrAf6UojmNxTokqVmtKuc4NziqdwzzgEOc5wlHlKls5nFQrhDMuuOGBL374E0AoYYQTicFOIsmkkEoa6eSQSx75FHKbC9xRIU90imKa0owWtKI9HehIJ3rSi970pR8DGUkJoxnDOMYzhalMYzqzuKlO3FK+ojmheCUrQSnqrLY6oXYs4p0KeKj2Oq+OymM3e3RaRWrDaV1gF4t5zwH2c5BT1KUWtXGkDg444YoPnnjhTQiBBBGMOzZiiSKaeGKUSRzZZJBJFgUkMZaG1KM+jWlAI5rQnHa0pg1t6UEXutKNlgxgKIMYzHCGKIthTGYCE5nEDEYxkwRG8Ia3vOAVr3lZCYILfzYAAQAB//8AD3janFoHWFNJ175zS7I2NEBARVAMEBEEIYTQQg+9g0iHoChdOgIqSkekKFgRuys2VNaG23TX3vu3vbtuX91mgVz+c2/CJfr374GE5M3MOe8pc+bMBIzEIoY3kWnURYzA+NgszAHDok0FpuYCUwHS54lmWkiljo5SBwvRTB6ffevg6CixNzAQ6vP4hAPzUsgOiyAnDT4h9gxdRb0zdPWm5wbZBk+3nTpxnMFUeaw4VimOz1g6y8RkFvOgLr64m0mlvNyFkwZTpxr08hThruHjxvGM9IxEk7yy3LJKJtL/MEOnW1lhOGaJYWQjpQR2YzHMy5QQIQkSIVOCWKD6Mv8gOvsFOntStQ1d+gal0jsp5cvt6Hf8q+Fh9Ty+Ps8CQxiG8dDbFMahxhz6DsahvIccOoBGxxpx6BktNIVD3x1Fec849D34gw//AOj7wH0ipqvhbso31TMVsg+wAe+ksxYcQ134EyFtuQiV0PsWo/m0MR2KgjvV5rTSc1rpKa3oKf4YInQO5MlA3jhMn9Ho5WBhIRIJJPbuOOGgfuWop6+DiyCC9iY4RIbHN8GJlZENET9/K8lOlMnWLr/xRWXtb/HrT6XSbSg68XBLTGCpd+jaFFSbWWhN8/UdUvFLpQto7zyaKtiUIKaUpuENGfFVQRPHK1owsK16+EdyCVWOGYN2ewNDvgWTGTyhvoEB6JYZ8iAXzHCpg64Zfr3xZJTSa2144dnSJe+VlqyXJXhc7dxHP922E02gyn29C2W2Oc/u3Xie7zenSB6/B8kf/4DcdjG+rKZFjA7w5VjWl+8vAF9i+8D2SLB9PDaVsdwG11gu09chWIMNDHSJTSHLOv137QnqrAwcCFyx89g8+jyyqHg0kIefOv5RrtngaduKjw8e+nPbfBGldFxL/4URbOQWglwCm4SZgGShqZT6r6Xju1UNRI1aQ/C61zUQVEND2H+tBPw2CFqMmMiBBgEEX/3go/2IpnG8aOgrQkefvEfPbacNWyhlG3iBncHmr446f+diHGrMoe/M5lDeQw4dsBoda8ShZ6yACRIC6glMxowwETE8zuHTVN8dIqyEQMJkjaobOADrRIi2FKItwjDFTAsmrrD6R8Kug4+EXWAqNhXweHjx7qd1qbtvLWnsj8zyaIkNXrPEK3r30oBVcvqpEN1Ovmu4Dbn91o/G9seFBuW5OrnUfrTj0svSmTPQng5Vgb0fsGOjPEbtJ6WA4SYRmMKDSFI9P3wYf+Mw3qoqppSqM7jfy+3M+JsYRnyj8avaq1J4lhLf0DeR/dAvyJ6+SSlbBk+0tJDBLeATdjzrVQOuKoygxhz6Dsah4NURdACNjjXi0DOI4bF2+Efia+Chx3gVliCURLGM9Y6UofP1nJyTTRkfRoUmdMk7uulMSjmUGXuwJcZTXuwkPr2TwNogw++C7evZTITYKMF0PSRBUOuqDx8ei5tcVn2Pe34Etq/Aa1TNKlCO0ESYYQczKMZbEiaOE/vwEn1KOejSDVxHPgeuxsCVj46heFUasJUDDm5kLPDSExE2uIOUEBEmONR0kZ5ET480D9tnRfDwH/peIBwRhPnusD++fMAUV/xW4IbVuSZDUuKacWHbek+VLZgSSRzRjp0usEEmhJCJHrLBpUz8DGgjxB/D2/kz+hWNH7uTfNswp3NPhCoMqHoad39WhR+DeIJ3WRlsHZ2hrqM0s/aTIQ+jIQ8nYkbAWB/niTTZCMmoy58E3sYFk3Ql9rpkdOE3vfu+LSz8dl/vN4UnN/b1bdy6v28jfuQ2/f6JY8j9wR3kfaqfPvsQ6SEz+hP6V/j5GpmCZrUONjNmcpkxghpz6DsYh/IecugAGh1rxKBcZhCAmsFYP4Y7W7OBsVDLAnNDPh/x+WKZDMn4YAa7pHQFUNnxuH1fFzPmwPO3KHNjuB39ro7fhnA75G5QfXijb0dB3wbvNqqcMUfbvFtiOmFwR/L34kElGZK/DKz87cazPDQD6d18XjDK/hnHU71XqQC9R5UDy1nq2g5blQE8C01hF2GfGS8DY0PW2RqSaJ+5nxneIqSnyHz4SELfIAPkuIEq2dTH/F/3Ut9rrSyrKl1RJsmhyseOb/V+dKi1/zf/1rETUAZKfYzc97bRz+gb8KNCPGR/fbAYYv0YMiCBUkLtN9Da4RwdZfrAQMRUK3uS2BGzLuXSWWVX7JnmJ1uP9qG0f5AxcTpnuUx1XFpbvvODOBpRylsg7V8gbT5Im4AZMhVCYk8KR+QgtVxoblDtxRdI2Phr94VDqPHTz1LXRr1FKX+89+WOy8n0MKWk21Q9jk1Ld64BeYn0m+RO8NJkzAzkqTdYQ74N/t8npOPybGVz6sxTllk95ds+LSj+BjKz6PjmI31btu/v24IfWffXGRe9kNqMgOx1wUeQ22iG6iMR/Sn9iyZDQfc1sKUKbNHBDDW6oThoPMIf2f9JSfymVLTpNt10pg+lDyP+mU07Ll/u2kN8uXjLQkNVDx6uOkYpP3y/vpjGKphVOx/ibgcWzVHL5AoX6xkLsQ2uafm093pDE5y0K/tq58a/5y8OOLM8Zl2CQ11Z06W8oiu17fdiFwUdiAteHuy5qTbnVAFaXnZqcVJMiU+4rHC+T0qgaFZGV97iHYmRIYXernPiFa6x/uLpyWwtjwD7UplOD5gwVklN+fjBw3QUOVGXvD7oQF5fv15dacnpXKVlCVswJUZfXWzJ6YU3Wtqu5R7qbGjshNqU3HK/rPz+amL30PyerVt7iP2wAtQy2LU+l1vrI6gxh76DcSjvIYcOoNGxRhyq3gXswIJq4MbDsAy2TZXgSajkCC05TkvevkBufbkdPsQQU9/JfUwvAzZA4YVfiR5bd/fd/W7b9h8/6Ovc+6BnL1NvyYmDT6FGppD4IE3uYua6w9wi9Y4XLUHqHQJ+F1xCNsj2HboCnbxE76f3vo2Owl7xOy5QNaim4PmqdfgXzGxbmL0KZr+h9jFiJOBHj9K2Z1EeKjyO66l+xQUEFGa8H6xkR7N+clL7aTwjox1QU3UHkQFFQoogUkIUht8RDtXjH6kKiKANG1pJz642riaac7XmnILJ5GZABaQEm47NBhn6bG6JeZrzhUSiOW+I2bwTIqbDgPeQeMTbs60tfRcZOh9YvO0k/aS7vsxhTZS18kDohQt0aFibzaa+9ozvPVx0ysYo/AKD+zt398UVpU4xrjYzOdWjWh3uhyYuzUjPgPipGfBcgJcby+utJ6OoFYceH0Wpxxx6VGusOYf2a6FLOPSEFsrn0JNPMIwY/gvQd8ELczAXzIupubAx8E21Oun/1ieGjo6I9Qg7FqowfGJqYUFkHN9Dqr7Xyc52jbcPc6uLze6UedQubHnzk3sJqfOlCV42Pi2exZXG0+vp5zEd+ZE+PgvsxumgjPjECaiSCCcl9C9PZOK3ei0tim1dUtKz5vd37jkSu0QJHpxulhoRmaL6pFS5MDM1SVqCPt74zpuHmVheAStmUZ9gAmw62MCdDoG4mC8SyPTs2TrCcBcYGKBCl42JrX0RaQNNpzLHd/b+VtfmtCQyrt7KcjnRFRLd9Gzv9hdtdXnUBeHLjdfvrT6VmOWp+sc9iMm6U6BnDHhrGmQM5yCLV4sTU5vwveHNLlGKD5J7Pi8p/XxbxrGgKJ9Gv6ajka2VDrPyXX0b/967bbBDLi+wtb1+Z82xaCY+p2gRIxvio2DjczqMsawJerrHYJku04t4GQpE4td0gsKRDhic79HbOcl18/zm/tj0gZrE1VKwzaUwKqF6tlUl9YnwpWtLTNjqZ7u3vWj3kI+7eafpdNIiT1zH05/R1AC2WfLGYaZMBfGSWbAl2FBmyDfQFei/qhQ+4yMHCzFXjEE9it5lX6wwj9sgb8lY1t9b9qBjxa2q0g8LF/U4T2tK24qOE4RkhzJgRdj2qtZ95ML9k0U6dXq2pl1xK6voMvrr3ucNxZ/3dH1eFeBdfd1vl+qJyHN6eHTQ5oq33n7IsOsBdkLw/FTMFNiZ4KP5+cp1gCYJUSgVszoyslYRHvTugs0fFRbdXFN/djGO0wmlPeNwc6IN3avsDpxru8TFG9yx43nb8sc7jGx10cM3+/YfhFiw2tiVGahemUKMQ6049PgoSj3m0KNaY805tF/I5A9UczIGojlZ++QqFEIBgzookkoYUwjZvNXujpIief4SlKFLH+4dHMzooz4xMVpuYBAb/7BuaIDwr7ub3hYKXqml48h5ZCsmZ7R4Mf4YyXsLsTowaseQrJ8k+tyeKlIvaZnGe+44NbKS4UPS1MFnU3xiUsqx5VJ/08nT3SLfy96vpF886f0getPcFWUlnf5Ni95pWuXqnBib/d6y+jfL6ZTqimUrC0pLydZtwrGz6xMydyWNHTvJycTCPmRlVPebitYceYRYHOocHLI0TJJmPrctI2dvChLOGmjOzlldU1JexXjnChSkH6kHmD6zL6jrLrjFgU0yPrxChe4nkre09caluOXGTuulHqhOR0fvWaci8Bep8x0jZqsQ9SGTK0/By3zeWNgbhCCJO4+hkXsiMBn/AlkO/YQU9AWU7OTj4yT19SWNhzLr6wm9evSrr51EoZDY+WJILYs0BllakkZnc5Mg5uqxbNZEqbOGGEWtOPT4KEo95tCjWmPHcugxLdScQ/sJxsr36TiiEqycgE1RdyEkX+yOS18zlKjcRt9/MG3rk0Y6CJ1z8vV1cvT2BtZrjv7aYVYzNfNEK/5S22Icu8/u7Z9gFGszQqIxOPiedKUtcMHnqpfoLm3USxrTFqp3cQ/0BXr3pQV1gYneUqhUv8NLActGawNhKOELlKFzY63mWFVHrOmj36UuDHqEeekLqoSm3c2khPUezCc/oy6AlQnqcyI+TrUY5GYAn2BY+SJ2zYymBF/7hcRwZE8iqiXJblsnO9smW/dMdrZLtO6uG2uVE+6WPcUql5RYr6gYeoL/vSDO1Wfo5shf0rhSHu0c5R46koOgDTKneESqWqUmDa+0T/A8l9jd2js5JMI9b9400nhd5Hw2CVfl1ssdIy1ViIkOPBGD1JeYDtOjR7MB4fNF6vWm918Krrbx0DeNWuimP9WnqWO819nE7rbeyaER8vx506gv5TaT3RWHf9W1MbJ1e2n6X+kED7Lc2R0+Wb3DYwyTTvCrMSlRn1tZD2pVc0OtZY8nrL+SkXmlq+vq4sxrXU0tzU1NzU2kpPGffTuft8KuuPt5S/OV+7evXr179wpoY+Wy2Z6mznYM41ArDj0+ilKPOfSo1lhzDu2HZwLrpAdh7DTurPoaY3NDgg8/Yj2Znozb/Bj6wL/jcg7wb7+am3kNebfGzxkyCluTZKealNLYIq+Mb2qSL33VnB8t6b8Dh27n0y9no8kpxNyYsiv3uk5EXLm74XgEx4/P8OP8SQwPAnoT/GkGXbdM0zHxXm+ZOLrqpNSurpSmT6rt6yGQ6g+dRYudY+1D3VbG5G+YZb6yrHRDgN/GsmXVM81q6cj06Oj09LBwNJCQMAHlk/5sd2Q0V0/THmUrEwrVlhSkxJc23rj70Qdvf333Gsm2RdAV0XFs5NVd0WhLJOCzCWjILJ1R7+1Ysy8o/njz4azedh2XnbL5TD8UXFvnkE1K1C1RJT1WSF3ojIxrZBoiuf9lpjfCRvRw3RdbubV1oVf0QPfVncCpQkdG9VCfqM4FhY3q4uepHr+mqRNq3mNSoumGwLUyiUAs0E5n7W4IN0td66jT3uu8Obb1YEji8UO1dY45UXE1oJCU+PkUv3QV4pMjg0EjNESN0A6dTEhXt0M4dg+qjjnpgBkyvV6xVAK7s6mhdpsHPhTqSWUS4t6ePchsuryv3VphZmfqKKroc3jYJlg7eRVhtOpFTduEsRvGjDnUR3uvwgceVdNbMcTkFfEzWGHFdJH/9QlXc8AVjh6GcduKVlFuQd7O+Izj5dXvege5dSxalimpzFm8OXbltcL2K75p7jtLEkPm+jlNM/IvSoxfpfCxK7KUhspt5HbGRiHL0gtaPKJdl0g8gMFZyOEkiJhsJC90CKG+CcGp00TLhpQ6uBOa1pktVo54ZObWOBtfH5vI8orIxQcWhq+Q+ponW2eUuiRkJDrb+ilsZ0YHFCztfUh9ElgT4xrj7uhs4RDsn9CQUbI9SjSzWGiUleOZoJD7JXu5hLlJPa3Nwxxrugevklb3P2V2ke3AbAI1A/yOZah3D7YvkgmgR9LsKuQExy1BB07/8UcvytWne5NzXRdaSc1m9a/BS2p+16dVNaq2uKRpBmxHwXTPsHvrje5JAgilWCMZFcYmzu+2goR3P5m8eSNprDLITFrgS/AHv22LmLe7E6ehCrAy2Dq3hKtzI6gVhx4fRanHHHpUa6w5hzJ1DjEXH6QMuPGAG3NKR4iU0as+pOv6kR2aQxoPfgvb9DKijhkrgrGtMBaOvkqto7qEePBbU9cPZw819F7a3rCHoIYGYU4wYTt0hzjBzAN9pBfMG8fMQwimqI/qcNKupw9e+uvZWfoQqrtJf4Vbo6f0UtREG6huoPMws4qOJ6UwcyLDTgdnWguZmqSUbjMvPNEyNW9F4DQnuuM4skGzge1nOf2lOg26QSWRQGEB0QN2szJYz5VzntOg1GMOPcp64waU1keg79XzfDceZDBE4wFw7fxde3s1MX5dzX9Rl88qGAnnsD+Jn8hp7C28IUJ8hMQIyRBRnUN/jMTwRN/PQdbsEzntlbfspyN9I3Xu/9k3EteGztTX4x/UoX+4LkrTnYGsf6M7A4FfjHZn+7Xkcl2W8v/WZSkHd3NdFvH+evDSs4UYBrXHmL05lEAiaf9yeaX1SwTuOvl705tPl618Xt/+R2PL8/rOH94/2Nh7aeuu61v2XN6y5fqady/1MNnKZJ/2QzsbX38w+/x1JuJQg6ZDdtuwdUgo+B9uYRBEQ+u+Afft3WtqauEeaWDXHtK87/G10swUy1UBNnHd6NHQb/iMkjUrEiPdCiyoT9bX0CVzrMflvSFzcpavLW9Y4xYTYDC1dObUl+9u3EhURgSFhMklwOcs8PkN+EyEajH99b5Do1+7W4pbfnLBwpPLlp9amHEap4Z+R435NTX5+StXUp/kXmysuVyQf7Gh9mIBo4X8YOPOnZs379y5EfSsh+w1osohT43UenQFI3e1hvCsb4KP3HsaGiIxHvfld999+cWjR19Ur5vhs9g/tsrLuSLHmg5yp8rpDvoAvZ9uR4VoPopFBY30n/TN7s+aPcuGr92ki+06h5pLmV3zPcjrceyN4Fj1jRslNmfMwX/upc8Hoi3oraFHcM93iaw9u5QenNXcDHlWBt74BFhO43YInM+sS3dyNCS4Uc3AQu+1Px/Em4VDN7Z+2h45o7Z4UY1XSdRlqnxhX37qiUt/dLc3r/9q/+rlPiUNfqEJC9mbx8WQw7+AbJtRL/O19jquVRCJZGpXcAqn1LybGVQZGNmWsPRf7cWPwgtdd8d07ApeGVUijPQpD9mUm9Dgmxx3kSpP7kmJborT4YWvzSl/Pz8uLUnhu7EmvciuXpIbWbTUw3NxdDDjmQ7mFhGY8DRVg1nySCAi9HCzNfQ6/MuhJfiXu5AhVe46tLmhEnUO7UEn0D7Ghi1gwyClZG8j+KbaPc+rJgBxkYC4OUX1lUehe8GBlOLb7cs+jMj0WBvftMm7UCFPcWuklA102MwpGR80N98uigtb6Omxd8eSlTJDQ/zoyI44RXM3zvUHuKGhvrYOsTYBG/ZbAHx7RIOLt22Wc/6WMIQ3bKqtlecH5uyRkL59+TlHc0oulq/oy7WreESVW4qLjI076b+Pe9G/ntlRWOu0cmFXyaKUc52bPi5NPfZi83co4jTD5MPhX4k/1DfLCrG6QN/owaeoKglbvbnk6TWrILtrge0c9rt5K8yJvc3nc37hbhzcIcVNcIJpfHRwzfUR0/CMxJr4e1lx446Se+s67+RtXJ63JLRqrW9w51L/ipQ385zT3da2dWxWPQpsSk5LW1VWWkNOWdjp4XRmZUH/osVH86uPODt0Fac2xllazqsbepmcG2A+NaJ8fmnjWmJ8eILzdFlhSmZlJVhTP/yQJKlSTDyShThTox3NHGUyR3AqV2n4ozUA99lwecG8fvqnc+LziGygCORakdqwur5s8QYfJD9UWtyfsfQqVbp66PBt+ssP6qQrZRsfH0o7dCtxz7ae9pL0dXFF2edXd15djOFINPwX0YK3MVUA9Dto6Xv1rs0A/ysqKCgmKiQoaqOiOWNRs59f86KMZgXyLklblJ9VsLgoYVNS0qaEpA0J8RsxhNph3ZriNUyMlAK+2FwiwNef9UOmheiLrIX7VSswGOMAYyrxNu4bHHZd49wyA63EYq/OFShDoHq4/bC33Hmuck5GZd+q1WjAIz3NoyJLWRBmPcfByjG0tYyRJwZbmkCe2pPCkZBrrwT1WoYXIys5q3K1Z3hszM51ETvlSTYFzqFB/v7JE33lPpWyTEmYYgPelhYl9ZkwwScgodDRI8RS7DDb3jrGfE6c2axoZ1tGqzlY0YxvwHSgYxBCdy5FhoREJhFKhITRWrob6Sz7/uz4hvyCgoI0dFFC1x08WA6zZMC1AvxjArNep8iuVXCGkPU8UbF3eUSXW8KsBbKAAG83o8AZeejRePqkScjMxbWfFpfYuYeZm7s5SSW6k5CyrFpHkA0VBc3S+GIa+w2menFya/OVUyExE4qeWjMxcWaQTVIyaZ0V5JGnCK8Nz24NCOwqcCqVfKJMGW/hLVMEeqNngklpGeI5s+P9/bOc4zenxm9IMDKhn0bN9LD0nOvkALZ5DD8lCvEarfWJW7YiGZ2L2090QV+Vp2MEMgJ+69nYz2Tr72iwuNXJGu8AuzC3MkcXZnGU27zEQ+s2vDkvVO65rbJuY0lZ2tKo6Ih4+nZwokzmHejvjX7w8eBNDfZIyM+b7xwqEPi5B6Wl0+usZk8y8xZb2yP/GRYCgdmMKWJzxl8Ww38T7cBHnznRZTg6yrSdxBCj9GBNjKxHtOTwgIUkXeFd7Af3u+v3DtLDx+2SLNC8CL/o0MXCyHgjC6t434AMh86Vp48Zo6Sp+iGhjnaSOdB3IhH+EdFCFfH4WBso/g6QdvwrwpRKB6QdkK8AcQCkksoHpEODiPH7RBOLrNUg5jCmmSoDZJ0GkcGYClZOpwaZxc3q0iAe+C2ikFICsh6QLwExgjHr2TEbNGMs8AdEO4tsVCPAsIwwJZ9rGJaxDMuAIalhWMYyzAZdpIZhGcuwDBiO1zAsw5DqGirApcSnGAERFyNDeow7aeOGCnJwLAcjhp/DLjhAQXZgYyErsGgYQalrB/qvy0MUM31oJVNXiggjzy51qdhxyMfdyU5pvajyyMrVauEdmqpDf/yfCgfopUHvWxq9U17V++qCTmD1rWD14W8xi3ti1fdnJ9QveVWLqkN7rcNNDcg/QeWDfCvMRS0f/R/r02sE8jxIG/nQ7srVHhGx83Z2RuyAmrXEOSwowA9qlptvlWOmQ6hiPRGvpvbo7PgRaohOi3L0hjIWGK8pY5YSq3kjZWwQ1yaMIbQPugo+CmROXRkOr5YNtM8m3F4SYWMTIbEPt9liF25rG25nF2lrGwnzNtOb8ZcwT4erwIRIj11FeJwiWWCwa1OaiSgJBaZ4mwXZ0q2oxcB/lk8ys/5ODP+IvyBo2Icmszq5f6YUgH7uDTqR7OuXnOznmzw7aI76xRqvtDQv39RUQmgTYJXi461UgrSN9CZW2gRsqjYT9tJT69jjiMf6JQsMgZX3qFwUnOplHjSXXoNabeBLevwtVqg3SGdOC57DP5EF2HPgacichsu1mJr/N689Q51dQ0NdnUNRR7izc2ios3M4WjeCFTmFhTk5h4c7v/aX8ckd8Mnn7P9ATVR/N67NHT8m2KivdAkNdXEOCaGUQxlE92BXmMwpPNxJFsbOpkvxz4lHmtl6Ir1XZm+b+uHkQGYwzMbHDOUSXeizMCdZeLjMiZmNvcX+D1e5ev/g7maEIvYihmuEXxE5v+pYSkBObuB+/+zsgKYM/w3uS+PuBbuEhbk4AcPyuNbwtIro8OxoRbhyZUJogve8ZEVo3OLUwRVarLG7dAyJAetxGr2ceD2WgPZJ04LlIsUbGbeBii7Q69/I6p1/v6LyWGpgTm4A8WjEKtosWlmdGJLgHZukCIlblBYPfJbGRGTH+DFVeR96SfCJBKhVB4CGLoZQBhoggoke1nuvfrvHg2TO9/TMV/jle3jkQzOyROGX5+6R76fId2f6UyV2gQwn69lVoGfOpwhDPT0ZYS6m9HBiAl0nQbXPGh49aniGamHFTSDr6ZzGbUX02XQURvenI8+ibY2IKc4YbOSkH6XUnM8IiVAEOWwKD7iJYh8SwhQeEiEyBXi9664Tszvm0J9bd8zZdkS+6y3rjrnIwrrDdocqHYnk9KdEB62ooQ+jaOZRg96uZfQxj1pagd4G3lnD9qQ/L5qpzvOhRj1tIuIabrrxHnm/+lm0DPGzGoi4Jp7A+4WRG+O9E1gy/oIs4vGwQ1jJ8DB4oBQ8IIX3J7CjzOrGmuHzberV7fX/WN3I+j8vb2Dzgv6BmMfrYO/T4KAKhxGcOWvoygx1CLTfMXtnTtyux1VVj3fF5e7MluLvbH12YyA1qR4ZoNhvv0OxyKAuKW3g2jOIciJIOqWR5GCDQyHWZf4ljbloIgi+NHtnbtzu76uqvt8dl7Mz2xF/p+fZtYG0pDr6J/rAd9/Csfen+qTUgRsgCfuZfko08hrZvBXCNymGegbseZJP8KC4C+E0JNNjGnopHCXFhIU7TjQGlntRs8dYxCv8EszGzKY8lwbGbClzGzvrDcvGhoZGyzdmjXUr7eY11hn7yelFMfnuE8a75sXTi9z9pgFUkYSWKVLsGuam+KIVSRV+xmCNJXC4oOFgz6lWk9HBR1RDdzNCBlmCRvm4WW9ImqoqmyVqjTGB5d484LUgMmzBrDdm87zLgniNjEK6xjdlboNdioKuYxTWTfNzR1vi81zGTfDMj0Fb5CyHgv+o7TsAoji6x6fs3kkSC6IiKggCHqggiHCUowuIiEhVlCIGoiD2Ehv2XqJgTTHWxIYVDaYY8083PTGmfWlfTL70HhW82+H/ZvbuWA5Ufk1YdnfKazPz5s17M2uTGy3TFfOdS0nW3b14Br7OjuG87/XJ1Y2fbUFQKg1Kxaml4p2t+1Tj2L04jx3TFTc885DOUA0yfY340x/Js6LXgRn5Gu1H/GtqeH1PyNmq5sRDDrzPEFkYxRN/aXpznXgp0FoHIcg5reZkQg48qzVK2Q5pZJOfrUYp/YHt2LaN+whfw58C/inQj9+BfozxGbadKJiiTuocpZni8Nvjo2PGdXJ9YkVmT/eZMTk5MX3Cg9hhPL1rJCLoX2w7vSLquYs5Q1vTt+XrTQ0cfHJ8dOyYTt0PrWwFtJ94iwqwouA46LP0qm6AiiPebkmDgujRQ275SpzyY+Py7nM9sDrLzR2fBoxj71MxSukcrltUEM5n1c5R/Vq8cSyf0qcBi5+KJfuOnFznnHTpeWBFhmsfjiQ2v5Or4ETeEZObG9PbGKwS79XiDWFcR58liuDEkQ/y7/zY2DGcViDcgVbE20dT07F9CkxAgFpT3h2dmxvtHiZQqnw9gaZJTpI/0qGO0LZ6DDYXxuqNlJex/bi4jP1FTpaxvbgEnk7F470L8YF4dj8rtT+2ghOPjbg7NlDrLZP9VYZL2N6yrfwBjjSUkTS8J54VLWQl8fgx+yPnZAGaRo0cjp0aaixlT+Jxpez6iViBMZaVOJS04iOr2PVSPI49WQrw98YKoLGI4BR6kZZDZJyKUUdDxA+e5Hml7zMeH3jSi6SD0sAvDvV3eP1/oqwoSTr1/aAvJFlzn24aRL6jOcL7yx0mejVuBOqXkFTPJGNBdFFoaFF0gTHJE8eW71qfE5axq27honO7MsJy1u/iEC4DhOtWCNz/YlQdb9w5Tco4hJjC0NDCGBXCFBXCuUUL62wQiAVGLx0tRrNeHbdecI0hjY0TSCMf2HzM0wYCpUZZS92r6ooQ69VAaOEjtOgRWqgWhwrYkopfhx7uJU4/ADfgxIIL7gA8hoYMEStlGj/fPWdhfvKkbDB74yJGhFuW0Puj0mLSY9LKs0YGxkykNCZiboZptKmvf98a3NfPAx4ncprz2a8kVbcR+QsvGpAMq0mXHsLryJ3okCA2cA4N5Loa1jouMYTvyGHXib/y8dQyjHMnJWd5l07lrzMOje0WvbCsbEFMN4LHHKAv79JtXBFXwAqqqlzEPDGhMGFl6LpFeFlIRlifNX2GZoTgzYtXDG6YqH8caFHWNbmR4UID36vR1IBNWUe3KfeRf3DATqvC1ic3PKNPRtTyKGjtd6AOt0gMLW0SEJC4tDYJtml2d41tohwmFdFKPrngaJ8ovqr+v7OdQt61zg7E8jReRevpZET57J0ILSo72GmpEmq8njw1Lm5qsjDVeDs/obXWQMcr34OV7YpTJQM6ZolDCIEF2NQFQU7jp00/4gVqjjkLcuDOZqklGobAXWrsDFZydzpH9C5XIRHuuOWXw6rJ1+GddrccpWMsRxsztaspuqrF25zqara6pobt1yyygjXPnMaXgPpZ0iHJgMPYDEHbz+bP4U6VNMg5L/z74iRbmcaWxu2x55X3+OIiPD2dbruTYX/dZr1LK9pj4VNLPZ5Ev7DLzC4xx7ajX5hPSNnmE8xT04A2kSwQjRgbJxoR2vBt4DWYMmip2qZwIYVaS0/RhkmQ46Tm3NwKOXA3j1ZL8FZGuoYUlEFnSKWCHhfkiQahCE073tZWvV0GnXHrW7nPrW8Vl1bGrOXrVkn2Nr4VX1wcnwR2bo+A1AGFiYkTJiizWiUhSUHoKv1Ckq3Uemnk15og65tNksq8gqTkgoLkpIIBqYGDUwfwJxv+5VYzmwQFpA4cmBrAkYFcT7HdVrme4PIEnCdAvpDDnGFs/CqXQM4p66g5JeQpN1wFiS8Se7I7Cz0x0KHviXXsHd7/sXa7m42aBa70tf1F2+Uqtcve1u+IWryb0ukX8gGb/k/ivherxNjcNXTfCvxWQ7L+mYbkukRd13jmoooDIenm7BY1O2vrqpfFndeXfP7eeV+FeqkwrlRXK041NXhRdTUfhyUgj6r/wTjEN6wCUVL+F8ehZHkTdBfEc0QLDUc59lW+pKUGom1GDTntpnkLkDo0qyAz1EqrW3bl0uR7mqlVku/qLBg9ZWRsysRU4GHJ2PSCYbmFnSMWVPyp5aK9nPI43wLgFFqS75YSY8bIW5C2hxe6wPzpGTrPPPbVO5FsG0h0STtoamoyX0OwZ1NaDePnvHkF10Po/DuQfvMyeoWulc+I9NF4EIL7zclifJ0Xmo2YjyAn+rj0G9ToDnYP7o5DMfYNob6usrrXwNcoj6RZlpPkRSVGKT/bDf8UwpzhDC37jN3YhYOZbMI/SB8pf9cqv5zH53DdZaXx9LENbM4sWN2Mn4w3bDh6FuhrbBpC9+uyBR27URDgr28ah7j+HqKuvcXYDkEokYLl0KZfwkvYALLj+vxgFKlWCtr0VJAk80XVVcEc1/B3Ngo+vN0CX9Ar1uWC3uF3pxe3a+1+MIoGW55rm4nvzO6CCfnzdq3v72Lu3Gzv6h84VVfeqnXWDk6tNl+7GuQVdQV/Z2LN660LfMkCfZrmyiVizHkLy8iLeunhwnfxY5EMrAtkt/qJv8rnd3NqSanshQb2Arl0J7pUesiHLejxBpRw3ZWegvr59Ye+6v+VMuZutOCP6QY4co/JljsSA9QMUb2roqXiUTq01e2pcBVt1bZuNsS0mDsP3o5Cc4VljyquWgfF7F0+o8itwnP2Q9WdrJrszk2Mv29LNfcevmHaysnrs7w0Sk4yX0SIXrb6L1WZ30XWvraZ+X3vA+cDtwaxL4O2Bu897XOgLn7rMOwLf/Ypi7C3D/tcdwxm+nLLA5Swm8vZOjyfX8ux00r8OfPh10p2EzvBRhi2Z/lyvvIawn08QIs7t5mSoOO3SYQ3v3whj12WVzb+a3wbbX0GZMxKhDA/2Uaeb0NIK+Ad0Zsr2A56VLdVYAzjOF3vglPWdVWX0sTQX1WVt9ycpJgbfe5CRoeTUtpDz09NW/z50fsxWfQjKMw9k4x3IO7DJ9kPv701PmfcB0044iWNumxqsuSD3v9U6P168x/qvLQhCOS3HPy/RJet7t1J5F4GJwL20EApQHEaT160dFVWc3exXKRMqWW+i/E5MvVWNvcdA0x3gHnNCvOcgFn/GJ/r3of0pWq6mNvgbp3r6oWNji3XEaLqjiGUrR7tm04ee0o5rhw7Tx4TRwJfN4fLJYDDWlJKwZ0Qkkvi0AuAAT9NupDvdOE6PfrGGmu9TDqT6yLlGqRcQ7jpF+InvUyeQ1RdQ3aTPiF+27cLL7M9R/gXGumbPAfg8jq0njwH2Fyk0whwxQFXTb+gq9LLkgyWnptodV+xb/y2drkcClsE4MK2e73GPg8cIexzFlpXV0dnwR88v7WJHgkLh1VgaS5W74IG2PfyslXP3WvbQ5bogMnR5u52/PhxugL+KL9qzGzyfUvw9IaDdU2AY22E4k7eAMcIBfsWB0SznXjRfzFKoeJ8uRknDOU2cXrZcOIKtvK2WLGH5dv2oBXRGEe8DprsDni1Y7f9OCm0ZrpUbl+DiP6J+QUjrxu5ogTgf9ivfBFiayrlG74CsdV8+TY1pU/MftInFqc2a6KUljXjNTXJa1hR3Mm1NqtKZhOsmBZqV0zauhQus4m+aIkh19gvvP7l1kAaf1Gp0AEsQYWmH7tq4N0GLn2G/GwJpB80pLSCjxe3hUeyrNbicaRZXJ+qMM29OLjG6tsSDZrEGkewa5IJIo5gzXlZm/OJNQeV8hxN7MFeB33I3qafy3nihIEznxi0m8Fc1ZNo/VW3qzP5KW5BRE5CZcTK7TuXR01NyAxfGLfz+RfzTiyV89iH+uDAGcH93nr/ykXDkAeDgpzYZ9ivJ+79zdYftnfFgbxvJ6Ft0hTpJZilBwMd4nyBeuRSONBd9epOWIPeoG7MMRq0B0nOnA2pSkleHHy28mQ/vwH9TleeC16YnFIVcrbyrJehv+dp0n3JypVLlixfLr10ztPHy/ts5engpalpS0NOTj3jBf+gXMiSEalVwec2Pbxm7e7da9c8zPvhBganW3T7YcU2AAU3y8DgLDzFKvvq2VC4q2Jwceb0UB2nzZXUzX8mZlLkqrSyU5V5x5eufej9xNLYPRNPXco8uHDtm/mNWeXp03T72ZWO4yIrwuKdWLjX5AOLig/PdmZfYHenWfHT43I7kAGR9Rsztz1wLw4wX2Gd/N/JmU/2dSrJSZ4YgDBKAV0bCVacQbsjUs83bnnZzuF054IjBtjUYYQrzIfcmrwjMdc407Si1h3/7M588bk+bHrPPTWF1YOCawrft3g/02crPdXnQADuLD8YELDQx3P/xTnPzLt4KtZw0mMA1t2Y98ycPxhCmO/fEft3+zmc4YSfbvbNMvzQAp91yPnK+sRZQ2anTpmOH2cTA0aRJ7pZHh89rMuhQ+OPyQ+OLsiLMS568M+5DVmbB21Z1yv9gWiM5mJU8eQEwJQBmErkEjECcYjA4KV+kwB+QjD/kUrY4t9Bu/Zh355hP+Ce7Icf2dLncXoHnC6XKFnzjs9l17D73OPzyEllLVkgzhLgGdJmsRdI7Igp0WwFgtyV6FEpQEq0fyNIxedMDuH17ME9bDFeJSWymZvZHLxpM97Ca3xPfOllchFR1SdGLyse5OLu3ZBzC3egT9HXBCxX3puhHxuMrjS9/Pp12y99rdL2UtkAML5HJfSyVCV2T/RWIWLtbgTNM8eEZ/I5UXOR+i1b2FPpRr43wZhOu8DTyJHwxEfbFY0H1O6/o19YbtB74LI6EoDu0yhBItIhNbLDFRL8o1jYW0qMdIj5qpYWrnMoq0au6JlMJYa8OE7pIB1azjJY2iL8r1r1myLAWYiq7bSy5VSQo9iTfX2AfY098YuKhxTCPtrMLmPjZjzAUqxGUcfg16V86iXOE6jxEKM9UCLiN/hRaxikf3OYJL7IMN8jaxH14pGQ4dboSMnwqKh5o0Tb4Y7QdvVIVveF89Z7RLlA6lke7r0F8rdJHpK7bovgTrUDyUG8sJ79wf48hxfqtihb8GesP5nJYZ1hY2mT5C4iOC028htAm/EjZ862k1n0NZ9ue7v0lgc/ljE6v7/+3iNHeozMKF4fILkrQyYdj3btVd4/vSDAGJrvyd6BE2fK2fLdmSWxFCGg07fpE2mzvMbaPwaiKCF3g3ZnvvbZ4LiL3+Gd/llpSS+nhqis0dGmjAzliPXBVLQiKWlFUeGq5ORVZIHmRV6TfGt3Mv53cXlJ5cQplQUUTXxg4hT+NH9sTV7O9vHjt+eMqR6r4PyavNxt48dvyx1TM1aMK6MUKZ1AOrvvaCWtt6TSnpYfpBOs1zHW6yDejXdB7HselAyQTkgpONpm40LqSpQmBdC/dTocxCPiTdCbpMuyUURcsR6DrKH9QDvzEwNkZhl7vp/J7Uk3kze7VCYblQ9mYoNH7GDzeSktMN6dfTqTQ2i6IF2WfhcQnEGL88CrEXO1To67mfrhhDIF2rcMx3ub3KTfzecGx7tjw0zlAxI4k33mERckjeRjyqUpTdoG2jAEJYh+SdXvCoHjxrsTEVLuIiY1tfH5NkJrfw3zcbEf1lNP6xkfvbo2tc/gJQtixkX2wh26JlaOnrra9N6F5GU5/eMMg4f2kDzHHdtQ8t2yCWuwm9v6UvdkU3LmwPv6RsN2/wNXf19kYXVPmMaX+ATmR817bxWWmzwClDOVMwcUHflq2ZbG5ypSZs6YW6Yse/XFiTty47Ldia4LsA5qD2aTRfJc5IuGaDW6IM2ru7ezYEPMvqFqtBVrvzZHAscdyCoLmZpWXpEwYxgZVOdRfmjOY68UHtw1vjyg4Bie2zB5RXRUVVnOan8ZzsgVRIbPzI8uj1ulfG3Ii55/cdKjr/bVdc+fG5O/Y7wyqmTL8OErRhtDEEa5bKyUL5eougLmXLhU7CFS/iP/fuTQF9PgIz5ySWPHHrqqxod70B/xlHNTZ9RXco4+bJpLP4U2CUWJjhy5qpZFW0cVDCqT1nGhU4uHiSyyYNrehMyoBTm5FYYpZQe3FCWExd9/Yua0o/FZUUtzcuf4VZQdrJmQEB47qTY0cIhxxwb4sx0OTQTN9g8YFRcQY+wXtmZe5nI//4qUcSuTooNnDhiUlhAYHeZlXPNg5jJ//ynDxq9MVt7oP35AZGJ0SP/xg4wJsYjC2G6U5spXQQYDUGTrr1a5ajjTbE8TJklzC1mPBtf+sXTpH7W1fy9b9ndd+uTQFMMov4ypk3PCsr0TBszJeejpcTsyqi8VF1+q3nqpqPh5+eph9l1tLfvu8GHcu7YW9z78l8EwwbPPos2rl/T3LPGJeOnC4iN5D236tXrrrxs3/rq1+tdNSEKF+EspE+jtArZjAAp1PEMUQ1wdyNIPEWaet8Eb+pmrd3fREmTspv+sXfufTZu+Xzdq04Xy2fXl5fWzZ58vLz+/9UZ6RO2q3eGzTkTFRsbJVzd8v3nTd+vWfbep4sLmjKIZF2fPenb69Gdnzb44Y+nRuFFdfvn0UxIyptY/OAth5EZyxRcse6lfW+vf3+hN4aeH2Kbh7Qw/sIJzkco9FnbDBOsKVs7WUUycZ/e5WvUq+XBynlxi+Qe/M7hsiPIUGTG4bDAbTB5TSsljM5R3yBD+JQo6id4nTk+5t3nKXHNQG7+Ws72wcHtO1vaiou1ZAVkhIVkByZWVcGB0U2np5tQRmx64f2Pqg/65CYljBhTfPxEsIdJROUIO6jsgqs5T5OBOfYcb+5wmIETIfU2h5IAuXczqIteFlziwc+dOXboSSV41n+R/EcJ4KiqgiSRG/U4frJnBp8fPlpJHjh6FRTiJObeorm7ROV5yOnai8XiN3aaJZ4F4TVUVIgBjB40ntNmGkNX8QfhDNojQJUv+WLKEr2/6glZxtWqVsaisDc3idRfNgv+rqkj5RquKaA7zvb0uIt//H6gt6ZH2luQxznr2Kz2s2yglo+9ts5xyAfZGzNcVQ9oPtjSWrhzBdfoOkgFnqhFPnKnuE2g4IXqFyBF+K7jf2IcQ0eFMeJOuX25Kxz/LW0VbdURdrDYOv3B3DP0E4xslu6Wg3VIHaYV5ye7d9C9LJ3lr40VdIr+UiFolSJd4axaZQaYiesu1KZ1kCGhO4ptZWji3Tu2mTzkAcQCAiPIwQKgDCLL48pWtLgvWVmxZSbJMg9UYgdXYAOhHESiO44W4TvdAAusxKk7lQS/WgfYO9SBGzYIshjSvyDCgMgKiNzNrDw2bf37NkJG7l42Kn/d44dq8DTWl8/YviVcXZ4mzkzeI5RmppFlK70HEX4mBldrnHQKTBp1JHzNAx/zcRlZWFxTvXTCy4yuXqEv40HPJCc6ULOartZ1T7sM+5ivKc50Sqkozt5FTnWbw9RpeDyEvFvApzuD2ssWIHgUrOBG52L+vpn5d02oPs7FijbGHpu0RCw5isK402Ey41HUHwjd/BihlAKW3FYoWkgaa8s8ey3kbQAeYWrga2MR8RcT5PkI61LU5zqcx1+1BPnYf/pW57GE9W8b1VrCOm1kX/Mdm/DciFu+21xxq7Nu+5qA3Z6Pj9AtpqN37w0vaSzdHuqWhmiA3VS41xZPJ8nJeS/RJvl2NXxBlNSiXpNQo8wVX/rd+gkkaHoUfxv9ewdzYBXGTL6xjPff3BY6bUD5wvFHdO5etrnh81dsAOseyeRh1s3xvGW9/lDYy0zFmWs4N1hXNj8BFHUCKtELqhlCiHZbmFqkF2X7oWkRI+ssdIjn1conVQ+UtVgEwGKCZwGrBeiyHerVyt/4TvZhd6+3j407GK4d8Y92x+2Lla/m5e7/8O0G75eFKBXvVw9fdZXvPKE/2agUpGbF9O41w9MFaSpGTNNYWD07sjkVPaRkPHsEXgpaTcsTtosF1fH14jnSrJb6to8GINvSEvhgpcHQUJ3GtWNoMPpsrVGz697RR6Lvh7XjHgDTXyemgtSbJW6VkXGzTyY0YNGsEpKXgIvNoW+o/55vS0ccitRD0sEgFHr6G+XmWfFjw4OzIA4VBZXnQ0kj1lnL5Jn0UpHyv5fq3O2V8lnkzrzoSXUvClddrlReewl/hL/GYxod0s/j8amLv0Pf+p3pRr1Lx85304oFFzXpR+dhDOcVl/D/Xinmvsh1qE/C9OznATaSGm5T/ET9WdU/bpe61bOm3/6/pfS2HpKNmCrCOnACrhrWPHI2GtQ2bzzX61d5j8Zca/WobIQBLfGnBcYRogDoODwf97TgiHFU5Hwm7QdvGy8thJDwgerfgpelf9HFZVr+WlYkBfagTpY9bJlpK6WO0k+Uvyz+yrLxcqzxPEmqVV/C3+GvmCXGziShfwtJGgDXJNn4aeoD23ANpKXhy86iyrEHONFu6InXGSxGSvuXxNeA6gUaquw9F5M6AQ9X9d3iZcgRBiRvfQq2bUCsFLxewVGoR+5gutUcTVX8Vd7Y3gcuKvjbOQqmyjq5aIxxXyvFFZFGtpVO0PjYBcUlD3UioK8axXbfLzUD+tsckLYUt4Wmjk1EOoIHDFPwSrad9pM7oPyqHiJgPW/0KY9GkdvsVRGhe/Gq8YiFWX1kMhV8XGDnezW6Hdroces3auGpQWPrQrh7ZLd1q+arDrcTQyS80ZWDYnic3hfeN9rF5JtrpltD3jhwad2BTP61vTnjrepYtWxmWlO7TwVzAfRVWvwW04glo24XSFeuOScE/BTYpv7t27yQB9xRkQbmYRLgYVEUoPGLF1K8izD/WlFIyLGlCiinW398UmVw6PCQ5Mm6cLQVyJySlbprcTTpBPJWvF2N3/yG+vkP82TVyPbHYz2Ty45f30CFeZL/sExToMTA2diBPypgWTHyUvcreChw5KMh1u2vQIByJsGU5fp0upV4owGFnt2MT2ZuK6jXbvEdnlqW0FnlgWsbkkY6bvuFXK0D1dyIiN/ORs1QJ8ipA5UCDo5Ba3dXohlao2rsLxs0CJff4RYcnl6QED4uIyx+WVJJsivNTJThsQkp0nN8AeC5O0qQLyW7pNzncPyY6uSRJlblfXNRwtQbIX6QPK4H0KY7yzxZSf1LyCQiwS90nNNTHEB7RX9MKyWoztXWRZa0aCBEYf5PoAvl31IHbkImgMrH4HhFYUP70gPkW2yW8vTtxH0kHFiuZyz2+5vk1NXw/XS34Y/PkNaCJTOa14ms8psuQjqdSE02UPXR6nGs9yzyd/kjjpQcgJU9NgTJzIeUapIzhKSL6GApRwcN3iT5aLX4s0RcscfSFG/PVO5m0i1Xscgw8SiZuMvBLRGe18FGiBqI1Oqt8tRMgaGoCj0AVLpEPg67eYNWkEtvrQCmKd6TOmdZZ0uHaq6FKS43kyK1q9XvBZYMhvWxJV760pOsMAsZz2+Ef+dkOgWj5UVvOzgmp3wnl6VJRsAUPD9ksMwceBHYXDeYsFakWJUDiOMlBgJSCt9r3YFDS0QGWRhpkLKlUtsPlIFoHaDV2aEQLDWBp4QAMv+02vrgE2A6NBHhJ+L4XSEAZvnMnj+jquzYOFeXwFOllukBTDi5rm9uospaj9a3K0Tf5fzagKYcatfCyreUaHcvpzSYEspSu2NtY7MjSyMe6xgMtDft9Y4nBAGrFAMPPyNWM2SSZzC9LJnmk5SJNtFy0/MVVQtUSV2PApClTJgUYXZdI0VfZ/sX4Ahu+GBfbEJNO1vtHYriv6z3UrWbu3Bq30F7r2BK8okIZwLpV4BViv4KGPj7W2qRHehnEBKLCvwr8VT3DAh+orHwgMKxnFV1wW1RI4tzTZ+3Q3Zv5bgnflzML3MoFtw7JBczcikuyWtWFb7AwG490ciuEFSIF38Q3EZIt0zWccYulewvunIhVxsDbIOlD8yCL2Y5CirrK9lVxmVbhCQ4McugtZSjhvg5tbMdjtONQPoe58fM6TVvZ4P7k2B5aiaHENuXVjTynDCPPsb8FyVXNgqq6g3SQaA+tTHoBfFA4XqpEMPbVTm3x5ipppSwrJWyKaA78Jgtl7o5Tkh/XSK52yVS0ml6Ipod1UXWU1iIRIxCfcgALSoccbwUKUU1/ckI9YNzxbUcYO5L++q058qYr9uZUqa7CHv7Bvr7B/uwb4ndnmqmm7ziJ9gQ8zRLCoBx70J8aDHYM5DP7owNsTY8kmn7iZIfJobF4fMny8W1AIKLpE13UeloJUk/LW3QoW+QgQgHEkbOmJlsPkJLxLtsKw9ZCoIN3N0cchayrRclH7GuRJHvth7W1RbkU/KgmXnndDvMxe6oW+542sD/eJvZ9bWDf2wb2/W1iP2BLRRi/LfmSevkzEfFs+UVekhYQ6+KZXWpy6Z0gfxYd6GZKOv2Hy6DegdG83XrLznSb/D26V2hI9ct0or6X5hmvD4qJCQqIjcXTA2NiAgfHxsrOpsDB0dGDA022O9DwhexO3tfdI+ZI7Ucc8ozDhhnDEhN199g/9gelZ0qfU5POV8QhwMVDZVY5jic+s+UXyH1QRjRdFylyXWUDaRrFiobqIrceG8frdpV+ont1A0Xs3uAbIusNeOJo3Hkm7jiyUfop+7ffss8Dbwulj2iYbno7vg48Nr40IqI0Pq4sIqIsLjgqKjgkIkI33VgYGV4YFlYYHlkIp09Dh0ZHDw2NBuydZV+6X6cXWref9htltkgdeTs0PcG3X1DPKd4VqeFpcb4ewb0rDJWyb1Dw4MCwlJKgoIEBYdmZnJMR8nBaKr+OqNr7aanyH9JLHr6M581h3jQCeVr/nxbY69PdMbZJjhZmdp19f96w6fGmaYawPiO8QhPZ92Ge12o63G9KGDOwl2tJZ2dfbrP20iFao/tI0uPT0Id+53Eg+Xsao+8tMMt6X/w2nhnCSvW9Pxt3CHKnQG6ivptd/jdHstwAfbete1T5y3/SvXp3IX+Z733xJTW44wjFnIY7690/zt23L/djjnWB/AoN1RcB1vMcK6R01nWj+3Q3IeUpNcXGpU6HLyAO+4S0nBKdXsWMDWTpSsaydfox7P0QniufokCtPXf5KmbO1vvmsa+H/n/vNtYKAAAAAAEAAAAFAINF8JSAXw889QADB9AAAAAA2wktdwAAAADdVa6+8iv8GAlQCWAAAAAGAAIAAAAAAAB42mNgZGBg3/O3hoGBM+GT9rcNnAFAERTAqAkAkugF7njaldMDkCNhEIbh/s+2bRTOtm3btm3bZuFs27Zt28rk5k/m3rrMVs16d1JPfd2dMSJtk1rIHjzrHXkcI21rkR1mYCox2RRrcSUIs3GD9eICUhxrbc2DZ3nIt7iLpriIhqiF2UHIjegogZy2mWiOycGzfpHnsdc2CROwPAiHMBbn8T0ER3ELg2ztcR7KzrnBs0zyvGO9m3Yew0qcD8JgZERPDHW4jLk47jivQZBI21ztyEs4hvk4ggHoiFlYgpU4ibEYz/PLiJnIh6zIjILIhpJIiSzhWM/fOiIenrFlwAuT2Vosxm4s5BxKkdcB2Ykb9jrtqVujCzoDbMMMEhp7XTfZlPxIZkcvVHWuh7PM0pGlIWiHsxBAbScf2u7T77RnqwE12FYRX7EfPD+9LdI2IwJZGY0jbfNMIpdiPzXfgPs+4uIkfVXme8nL9OXZriK1YGukbd749Lf5n/vv6susNfVF8EzNl8zOk+vgZpbHYYyN2jzsSxe9bozRSE1/nfwN+J239cl338hApIuj5hzNYoAe75i3g4DFX96S8jJFKsp8qckgo4yVt/IXN2WbbCMbYq5sl8z8MwD+Fuut9VYSSlepz36KSnNJLmMjxI4QS1hUd9VTdddpPXs9+7zVjc2/z/9N6lmse+iCro/mTZ3R1ddz1LRcO3+k1u2MZJ7qbvVrt/FMFzPq/e8X6Xa6jZFETzCS/XmlxUimK5pr9WY92tWYapNv72Yx65NZzLvSL61PEWIDFj9x++a6p0pLBq7Ls85vZ60uq5TqseqtBqoEaoiKq6qofioFR+pKP1jFpdusNv8Dwsk8NgB42mzBA4wdURQA0Id5nD+8g9q2HdS2bds2gtq2bduMartBHdTGxnsOQqgO6oEGo3FoKlqAVqNt6CaOcVXcAI/Bu/EVfAs/xW/wZ2KTyqQ1GUzGkalkAVlNzpKH5C35SrPSyrQenUCn00V0Ld1BvxiGUcXobcw3bjDEKrImbBibyGawxWwdO8Rus0/c5il5fl6KD+eT+Ey+hK/nu/hRkUE0EOPEVHFKerKKrC9bya5ygFyiqMquaqr2qpcaqiao6WqROqeeaqJtXVF31av1Nn1Xv9Dv9TeTm9XNRuZm81EiSFRNDE4csJiVx6plNbU6WL2tYdYMa4t10XplfbSxHduZ7PJ2V3uuvffPr045Z5Cz3bnofHLLuE3dae4194VXyhvqrfX2e4/8VH5Rv6O/2t/r/4BCUBoqQE1oBK2hC/SFYTAepsBcWAbrYQcch29B7mBCsCI4GjwPvbBy2CmcGJ4Mf0Q8yhxVjkZHU6Ml0ZpoSzKvR1/idHGbeFW8N76Q9Eb8NH4Xf0shf3cFD0BwxAAAAGubZxufU5Latm3btm3b7qC2bdu2bQ6KXSLN7w5RixhL7CZuEF9JkSxIViNbkwPJCeRa8hz5kIpLeVQnagx1nvpEJ6YJuirdiF5FX6Ef0p+YsswQZiIzj3nIJmItthP7mINcXq4cN5Abxz3ia/ML+adCJCwWnoqa2FccKS4X14sHxKviA/Gl+ElKLGWQeKmuNEU6JaeSi8gN5X7ybHmv/FHhFUfJqhT6aw9ln5pZraQOV9f9vFe9pj7WEmqhVlirqbXTxmlbtCPaLT2j3lYfpI/Vp/53k37VyGUMNRabyc365krzppXG4qzw9yJWRaup9clOYKeyadu2y9nt7ZH2W4dwCjktnb7ODGe7c8cl3WruCPeYe8G97T6LkbE+sfeABeVBTdAV9AejwBSwFKwBp8B3L6k32XvmA3+7f9V/6L/yPwcJgigoHVQNugczgpXB5uBccDP4GiYJ2dAPC4ZVw5bh1vBJZEW1o4HRmugZzACLwPZwNFwLt8ND8Ay8Bh/CN/AbSorSIxYZKESlUUc0Ak1Hy9BW9BCnxizOj0vg6rgZ7oUH4zF4Cl6M1/0AyhMX1gAAAHjaY2BkYGA8xMTGkMBQwcAF5CEDZgYWACjvAbd42pSQxVmEMRBAH+5cccgNd3fngut13eV3HAqglq2BAqiAbpB8g+tGXzI+QCXXFFFQXAHkQLiAVnLChdRyJ1zEAvfCxfQV1AuX0FiwJlxKV4FfuJaRghs0F0B1wa2w9skyBiZn2CSIEcdFMcQAg4zQyxPprTggTgTFGglsAihtGdZ/O9gYJJ84pO0X8XCJY2DjoOjQfl1MHKbop58YCa3hEaSPEAYZ+nExyOKQ4ox+JNJrnM5vY2+85r1H5Ik80gSwGaWPAZ39NMscsMLSE332+Wbd+8n+91jqk/YREWwcEroC9RY9j4jSI+mQQwibBCYuDn3ad5o+DGxi9LPNGhs8LpwhFWYeAJG3V+0AeNpjYGYAg/9zGIyAFCMDGgAAKpQB0gAA) - format('woff'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, - U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, - U+FEFF, U+FFFD; -} - -/*!********************************************************************************************!*\ - !*** css ../../../node_modules/css-loader/dist/cjs.js!../../graphiql-react/dist/style.css ***! - \********************************************************************************************/ -.graphiql-container *{box-sizing:border-box;font-variant-ligatures:none}.graphiql-container,.CodeMirror-info,.CodeMirror-lint-tooltip,.graphiql-dialog,.graphiql-dialog-overlay,.graphiql-tooltip,[data-radix-popper-content-wrapper]{--color-primary: 320, 95%, 43%;--color-secondary: 242, 51%, 61%;--color-tertiary: 188, 100%, 36%;--color-info: 208, 100%, 46%;--color-success: 158, 60%, 42%;--color-warning: 36, 100%, 41%;--color-error: 13, 93%, 58%;--color-neutral: 219, 28%, 32%;--color-base: 219, 28%, 100%;--alpha-secondary: .76;--alpha-tertiary: .5;--alpha-background-heavy: .15;--alpha-background-medium: .1;--alpha-background-light: .07;--font-family: "Roboto", sans-serif;--font-family-mono: "Fira Code", monospace;--font-size-hint:.75rem;--font-size-inline-code:.8125rem;--font-size-body:.9375rem;--font-size-h4:1.125rem;--font-size-h3:1.375rem;--font-size-h2:1.8125rem;--font-weight-regular: 400;--font-weight-medium: 500;--line-height: 1.5;--px-2: 2px;--px-4: 4px;--px-6: 6px;--px-8: 8px;--px-10: 10px;--px-12: 12px;--px-16: 16px;--px-20: 20px;--px-24: 24px;--border-radius-2: 2px;--border-radius-4: 4px;--border-radius-8: 8px;--border-radius-12: 12px;--popover-box-shadow: 0px 6px 20px rgba(59, 76, 106, .13), 0px 1.34018px 4.46726px rgba(59, 76, 106, .0774939), 0px .399006px 1.33002px rgba(59, 76, 106, .0525061);--popover-border: none;--sidebar-width: 60px;--toolbar-width: 40px;--session-header-height: 51px}@media (prefers-color-scheme: dark){body:not(.graphiql-light) .graphiql-container,body:not(.graphiql-light) .CodeMirror-info,body:not(.graphiql-light) .CodeMirror-lint-tooltip,body:not(.graphiql-light) .graphiql-dialog,body:not(.graphiql-light) .graphiql-dialog-overlay,body:not(.graphiql-light) .graphiql-tooltip,body:not(.graphiql-light) [data-radix-popper-content-wrapper]{--color-primary: 338, 100%, 67%;--color-secondary: 243, 100%, 77%;--color-tertiary: 188, 100%, 44%;--color-info: 208, 100%, 72%;--color-success: 158, 100%, 42%;--color-warning: 30, 100%, 80%;--color-error: 13, 100%, 58%;--color-neutral: 219, 29%, 78%;--color-base: 219, 29%, 18%;--popover-box-shadow: none;--popover-border: 1px solid hsl(var(--color-neutral))}}body.graphiql-dark .graphiql-container,body.graphiql-dark .CodeMirror-info,body.graphiql-dark .CodeMirror-lint-tooltip,body.graphiql-dark .graphiql-dialog,body.graphiql-dark .graphiql-dialog-overlay,body.graphiql-dark .graphiql-tooltip,body.graphiql-dark [data-radix-popper-content-wrapper]{--color-primary: 338, 100%, 67%;--color-secondary: 243, 100%, 77%;--color-tertiary: 188, 100%, 44%;--color-info: 208, 100%, 72%;--color-success: 158, 100%, 42%;--color-warning: 30, 100%, 80%;--color-error: 13, 100%, 58%;--color-neutral: 219, 29%, 78%;--color-base: 219, 29%, 18%;--popover-box-shadow: none;--popover-border: 1px solid hsl(var(--color-neutral))}.graphiql-container,.CodeMirror-info,.CodeMirror-lint-tooltip,.graphiql-dialog,.graphiql-container:is(button),.CodeMirror-info:is(button),.CodeMirror-lint-tooltip:is(button),.graphiql-dialog:is(button){color:hsla(var(--color-neutral),1);font-family:var(--font-family);font-size:var(--font-size-body);font-weight:var(----font-weight-regular);line-height:var(--line-height)}.graphiql-container input,.CodeMirror-info input,.CodeMirror-lint-tooltip input,.graphiql-dialog input{color:hsla(var(--color-neutral),1);font-family:var(--font-family);font-size:var(--font-size-caption)}.graphiql-container input::placeholder,.CodeMirror-info input::placeholder,.CodeMirror-lint-tooltip input::placeholder,.graphiql-dialog input::placeholder{color:hsla(var(--color-neutral),var(--alpha-secondary))}.graphiql-container a,.CodeMirror-info a,.CodeMirror-lint-tooltip a,.graphiql-dialog a{color:hsl(var(--color-primary))}.graphiql-container a:focus,.CodeMirror-info a:focus,.CodeMirror-lint-tooltip a:focus,.graphiql-dialog a:focus{outline:hsl(var(--color-primary)) auto 1px}.graphiql-un-styled,button.graphiql-un-styled{all:unset;border-radius:var(--border-radius-4);cursor:pointer}:is(.graphiql-un-styled,button.graphiql-un-styled):hover{background-color:hsla(var(--color-neutral),var(--alpha-background-light))}:is(.graphiql-un-styled,button.graphiql-un-styled):active{background-color:hsla(var(--color-neutral),var(--alpha-background-medium))}:is(.graphiql-un-styled,button.graphiql-un-styled):focus{outline:hsla(var(--color-neutral),var(--alpha-background-heavy)) auto 1px}.graphiql-button,button.graphiql-button{background-color:hsla(var(--color-neutral),var(--alpha-background-light));border:none;border-radius:var(--border-radius-4);color:hsla(var(--color-neutral),1);cursor:pointer;font-size:var(--font-size-body);padding:var(--px-8) var(--px-12)}:is(.graphiql-button,button.graphiql-button):hover,:is(.graphiql-button,button.graphiql-button):active{background-color:hsla(var(--color-neutral),var(--alpha-background-medium))}:is(.graphiql-button,button.graphiql-button):focus{outline:hsla(var(--color-neutral),var(--alpha-background-heavy)) auto 1px}.graphiql-button-success:is(.graphiql-button,button.graphiql-button){background-color:hsla(var(--color-success),var(--alpha-background-heavy))}.graphiql-button-error:is(.graphiql-button,button.graphiql-button){background-color:hsla(var(--color-error),var(--alpha-background-heavy))}.graphiql-button-group{background-color:hsla(var(--color-neutral),var(--alpha-background-light));border-radius:calc(var(--border-radius-4) + var(--px-4));display:flex;padding:var(--px-4)}.graphiql-button-group>button.graphiql-button{background-color:transparent}.graphiql-button-group>button.graphiql-button:hover{background-color:hsla(var(--color-neutral),var(--alpha-background-light))}.graphiql-button-group>button.graphiql-button.active{background-color:hsl(var(--color-base));cursor:default}.graphiql-button-group>*+*{margin-left:var(--px-8)}.graphiql-dialog-overlay{position:fixed;inset:0;background-color:hsla(var(--color-neutral),var(--alpha-background-heavy));z-index:10}.graphiql-dialog{background-color:hsl(var(--color-base));border:var(--popover-border);border-radius:var(--border-radius-12);box-shadow:var(--popover-box-shadow);margin:0;max-height:80vh;max-width:80vw;overflow:auto;padding:0;width:unset;transform:translate(-50%,-50%);top:50%;left:50%;position:fixed;z-index:10}.graphiql-dialog-close>svg{color:hsla(var(--color-neutral),var(--alpha-secondary));display:block;height:var(--px-12);padding:var(--px-12);width:var(--px-12)}.graphiql-dropdown-content{background-color:hsl(var(--color-base));border:var(--popover-border);border-radius:var(--border-radius-8);box-shadow:var(--popover-box-shadow);font-size:inherit;max-width:250px;padding:var(--px-4);font-family:var(--font-family);color:hsl(var(--color-neutral));max-height:min(calc(var(--radix-dropdown-menu-content-available-height) - 10px),400px);overflow-y:scroll}.graphiql-dropdown-item{border-radius:var(--border-radius-4);font-size:inherit;margin:var(--px-4);overflow:hidden;padding:var(--px-6) var(--px-8);text-overflow:ellipsis;white-space:nowrap;outline:none;cursor:pointer;line-height:var(--line-height)}.graphiql-dropdown-item[data-selected],.graphiql-dropdown-item[data-current-nav],.graphiql-dropdown-item:hover{background-color:hsla(var(--color-neutral),var(--alpha-background-light));color:inherit}.graphiql-dropdown-item:not(:first-child){margin-top:0}:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) blockquote{margin-left:0;margin-right:0;padding-left:var(--px-8)}:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) code,:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) pre{border-radius:var(--border-radius-4);font-family:var(--font-family-mono);font-size:var(--font-size-inline-code)}:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) code{padding:var(--px-2)}:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) pre{overflow:auto;padding:var(--px-6) var(--px-8)}:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) pre code{background-color:initial;border-radius:0;padding:0}:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) ol,:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) ul{padding-left:var(--px-16)}:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) ol{list-style-type:decimal}:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) ul{list-style-type:disc}:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) img{border-radius:var(--border-radius-4);max-height:120px;max-width:100%}:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation)>:first-child{margin-top:0}:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation)>:last-child{margin-bottom:0}:is(.graphiql-markdown-description,.CodeMirror-hint-information-description,.CodeMirror-info .info-description) a{color:hsl(var(--color-primary));text-decoration:none}:is(.graphiql-markdown-description,.CodeMirror-hint-information-description,.CodeMirror-info .info-description) a:hover{text-decoration:underline}:is(.graphiql-markdown-description,.CodeMirror-hint-information-description,.CodeMirror-info .info-description) blockquote{border-left:1.5px solid hsla(var(--color-neutral),var(--alpha-tertiary))}:is(.graphiql-markdown-description,.CodeMirror-hint-information-description,.CodeMirror-info .info-description) code,:is(.graphiql-markdown-description,.CodeMirror-hint-information-description,.CodeMirror-info .info-description) pre{background-color:hsla(var(--color-neutral),var(--alpha-background-light));color:hsla(var(--color-neutral),1)}:is(.graphiql-markdown-description,.CodeMirror-hint-information-description,.CodeMirror-info .info-description)>*{margin:var(--px-12) 0}:is(.graphiql-markdown-deprecation,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-deprecation) a{color:hsl(var(--color-warning));text-decoration:underline}:is(.graphiql-markdown-deprecation,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-deprecation) blockquote{border-left:1.5px solid hsl(var(--color-warning))}:is(.graphiql-markdown-deprecation,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-deprecation) code,:is(.graphiql-markdown-deprecation,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-deprecation) pre{background-color:hsla(var(--color-warning),var(--alpha-background-heavy))}:is(.graphiql-markdown-deprecation,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-deprecation)>*{margin:var(--px-8) 0}.graphiql-markdown-preview>:not(:first-child){display:none}.CodeMirror-hint-information-deprecation,.CodeMirror-info .info-deprecation{background-color:hsla(var(--color-warning),var(--alpha-background-light));border:1px solid hsl(var(--color-warning));border-radius:var(--border-radius-4);color:hsl(var(--color-warning));margin-top:var(--px-12);padding:var(--px-6) var(--px-8)}.CodeMirror-hint-information-deprecation-label,.CodeMirror-info .info-deprecation-label{font-size:var(--font-size-hint);font-weight:var(--font-weight-medium)}.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-deprecation-reason{margin-top:var(--px-6)}.graphiql-spinner{height:56px;margin:auto;margin-top:var(--px-16);width:56px}.graphiql-spinner:after{animation:rotation .8s linear 0s infinite;border:4px solid transparent;border-radius:100%;border-top:4px solid hsla(var(--color-neutral),var(--alpha-tertiary));content:"";display:inline-block;height:46px;vertical-align:middle;width:46px}@keyframes rotation{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.graphiql-tooltip{background:hsl(var(--color-base));border:var(--popover-border);border-radius:var(--border-radius-4);box-shadow:var(--popover-box-shadow);color:hsl(var(--color-neutral));font-size:inherit;padding:var(--px-4) var(--px-6);font-family:var(--font-family)}.graphiql-tabs{display:flex;align-items:center;overflow-x:auto;padding:var(--px-12)}.graphiql-tabs>:not(:first-child){margin-left:var(--px-12)}.graphiql-tab{align-items:stretch;border-radius:var(--border-radius-8);color:hsla(var(--color-neutral),var(--alpha-secondary));display:flex}.graphiql-tab>button.graphiql-tab-close{visibility:hidden}.graphiql-tab.graphiql-tab-active>button.graphiql-tab-close,.graphiql-tab:hover>button.graphiql-tab-close,.graphiql-tab:focus-within>button.graphiql-tab-close{visibility:unset}.graphiql-tab.graphiql-tab-active{background-color:hsla(var(--color-neutral),var(--alpha-background-heavy));color:hsla(var(--color-neutral),1)}button.graphiql-tab-button{padding:var(--px-4) 0 var(--px-4) var(--px-8)}button.graphiql-tab-close{align-items:center;display:flex;padding:var(--px-4) var(--px-8)}button.graphiql-tab-close>svg{height:var(--px-8);width:var(--px-8)}.graphiql-history-header{font-size:var(--font-size-h2);font-weight:var(--font-weight-medium);display:flex;justify-content:space-between;align-items:center}.graphiql-history-header button{font-size:var(--font-size-inline-code);padding:var(--px-6) var(--px-10)}.graphiql-history-items{margin:var(--px-16) 0 0;list-style:none;padding:0}.graphiql-history-item{border-radius:var(--border-radius-4);color:hsla(var(--color-neutral),var(--alpha-secondary));display:flex;font-size:var(--font-size-inline-code);font-family:var(--font-family-mono);height:34px}.graphiql-history-item:hover{color:hsla(var(--color-neutral),1);background-color:hsla(var(--color-neutral),var(--alpha-background-light))}.graphiql-history-item:not(:first-child){margin-top:var(--px-4)}.graphiql-history-item.editable{background-color:hsla(var(--color-primary),var(--alpha-background-medium))}.graphiql-history-item.editable>input{background:transparent;border:none;flex:1;margin:0;outline:none;padding:0 var(--px-10);width:100%}.graphiql-history-item.editable>input::placeholder{color:hsla(var(--color-neutral),var(--alpha-secondary))}.graphiql-history-item.editable>button{color:hsl(var(--color-primary));padding:0 var(--px-10)}.graphiql-history-item.editable>button:active{background-color:hsla(var(--color-primary),var(--alpha-background-heavy))}.graphiql-history-item.editable>button:focus{outline:hsl(var(--color-primary)) auto 1px}.graphiql-history-item.editable>button>svg{display:block}button.graphiql-history-item-label{flex:1;padding:var(--px-8) var(--px-10);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}button.graphiql-history-item-action{align-items:center;color:hsla(var(--color-neutral),var(--alpha-secondary));display:flex;padding:var(--px-8) var(--px-6)}button.graphiql-history-item-action:hover{color:hsla(var(--color-neutral),1)}button.graphiql-history-item-action>svg{height:14px;width:14px}.graphiql-history-item-spacer{height:var(--px-16)}.graphiql-doc-explorer-default-value{color:hsl(var(--color-success))}a.graphiql-doc-explorer-type-name{color:hsl(var(--color-warning));text-decoration:none}a.graphiql-doc-explorer-type-name:hover{text-decoration:underline}a.graphiql-doc-explorer-type-name:focus{outline:hsl(var(--color-warning)) auto 1px}.graphiql-doc-explorer-argument>*+*{margin-top:var(--px-12)}.graphiql-doc-explorer-argument-name{color:hsl(var(--color-secondary))}.graphiql-doc-explorer-argument-deprecation{background-color:hsla(var(--color-warning),var(--alpha-background-light));border:1px solid hsl(var(--color-warning));border-radius:var(--border-radius-4);color:hsl(var(--color-warning));padding:var(--px-8)}.graphiql-doc-explorer-argument-deprecation-label{font-size:var(--font-size-hint);font-weight:var(--font-weight-medium)}.graphiql-doc-explorer-deprecation{background-color:hsla(var(--color-warning),var(--alpha-background-light));border:1px solid hsl(var(--color-warning));border-radius:var(--px-4);color:hsl(var(--color-warning));padding:var(--px-8)}.graphiql-doc-explorer-deprecation-label{font-size:var(--font-size-hint);font-weight:var(--font-weight-medium)}.graphiql-doc-explorer-directive{color:hsl(var(--color-secondary))}.graphiql-doc-explorer-section-title{align-items:center;display:flex;font-size:var(--font-size-hint);font-weight:var(--font-weight-medium);line-height:1}.graphiql-doc-explorer-section-title>svg{height:var(--px-16);margin-right:var(--px-8);width:var(--px-16)}.graphiql-doc-explorer-section-content{margin-left:var(--px-8);margin-top:var(--px-16)}.graphiql-doc-explorer-section-content>*+*{margin-top:var(--px-16)}.graphiql-doc-explorer-root-type{color:hsl(var(--color-info))}.graphiql-doc-explorer-search{color:hsla(var(--color-neutral),var(--alpha-secondary))}.graphiql-doc-explorer-search:not([data-state="idle"]){border:var(--popover-border);border-radius:var(--border-radius-4);box-shadow:var(--popover-box-shadow);color:hsla(var(--color-neutral),1)}.graphiql-doc-explorer-search:not([data-state="idle"]) .graphiql-doc-explorer-search-input{background:hsl(var(--color-base))}.graphiql-doc-explorer-search-input{align-items:center;background-color:hsla(var(--color-neutral),var(--alpha-background-light));border-radius:var(--border-radius-4);display:flex;padding:var(--px-8) var(--px-12)}.graphiql-doc-explorer-search [role=combobox]{border:none;background-color:transparent;margin-left:var(--px-4);width:100%}.graphiql-doc-explorer-search [role=combobox]:focus{outline:none}.graphiql-doc-explorer-search [role=listbox]{background-color:hsl(var(--color-base));border:none;border-bottom-left-radius:var(--border-radius-4);border-bottom-right-radius:var(--border-radius-4);border-top:1px solid hsla(var(--color-neutral),var(--alpha-background-heavy));max-height:400px;overflow-y:auto;margin:0;font-size:var(--font-size-body);padding:var(--px-4);position:relative}.graphiql-doc-explorer-search [role=option]{border-radius:var(--border-radius-4);color:hsla(var(--color-neutral),var(--alpha-secondary));overflow-x:hidden;padding:var(--px-8) var(--px-12);text-overflow:ellipsis;white-space:nowrap;cursor:pointer}.graphiql-doc-explorer-search [role=option][data-headlessui-state=active]{background-color:hsla(var(--color-neutral),var(--alpha-background-light))}.graphiql-doc-explorer-search [role=option]:hover{background-color:hsla(var(--color-neutral),var(--alpha-background-medium))}.graphiql-doc-explorer-search [role=option][data-headlessui-state=active]:hover{background-color:hsla(var(--color-neutral),var(--alpha-background-heavy))}:is(.graphiql-doc-explorer-search [role="option"])+:is(.graphiql-doc-explorer-search [role="option"]){margin-top:var(--px-4)}.graphiql-doc-explorer-search-type{color:hsl(var(--color-info))}.graphiql-doc-explorer-search-field{color:hsl(var(--color-warning))}.graphiql-doc-explorer-search-argument{color:hsl(var(--color-secondary))}.graphiql-doc-explorer-search-divider{color:hsla(var(--color-neutral),var(--alpha-secondary));font-size:var(--font-size-hint);font-weight:var(--font-weight-medium);margin-top:var(--px-8);padding:var(--px-8) var(--px-12)}.graphiql-doc-explorer-search-empty{color:hsla(var(--color-neutral),var(--alpha-secondary));padding:var(--px-8) var(--px-12)}a.graphiql-doc-explorer-field-name{color:hsl(var(--color-info));text-decoration:none}a.graphiql-doc-explorer-field-name:hover{text-decoration:underline}a.graphiql-doc-explorer-field-name:focus{outline:hsl(var(--color-info)) auto 1px}.graphiql-doc-explorer-item>:not(:first-child){margin-top:var(--px-12)}.graphiql-doc-explorer-argument-multiple{margin-left:var(--px-8)}.graphiql-doc-explorer-enum-value{color:hsl(var(--color-info))}.graphiql-doc-explorer-header{display:flex;justify-content:space-between;position:relative}.graphiql-doc-explorer-header:focus-within .graphiql-doc-explorer-title{visibility:hidden}.graphiql-doc-explorer-header:focus-within .graphiql-doc-explorer-back:not(:focus){color:transparent}.graphiql-doc-explorer-header-content{display:flex;flex-direction:column;min-width:0}.graphiql-doc-explorer-search{position:absolute;right:0;top:0}.graphiql-doc-explorer-search:focus-within{left:0}.graphiql-doc-explorer-search [role=combobox]{height:24px;width:4ch}.graphiql-doc-explorer-search [role=combobox]:focus{width:100%}a.graphiql-doc-explorer-back{align-items:center;color:hsla(var(--color-neutral),var(--alpha-secondary));display:flex;text-decoration:none}a.graphiql-doc-explorer-back:hover{text-decoration:underline}a.graphiql-doc-explorer-back:focus{outline:hsla(var(--color-neutral),var(--alpha-secondary)) auto 1px}a.graphiql-doc-explorer-back:focus+.graphiql-doc-explorer-title{visibility:unset}a.graphiql-doc-explorer-back>svg{height:var(--px-8);margin-right:var(--px-8);width:var(--px-8)}.graphiql-doc-explorer-title{font-weight:var(--font-weight-medium);font-size:var(--font-size-h2);overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.graphiql-doc-explorer-title:not(:first-child){font-size:var(--font-size-h3);margin-top:var(--px-8)}.graphiql-doc-explorer-content>*{color:hsla(var(--color-neutral),var(--alpha-secondary));margin-top:var(--px-20)}.graphiql-doc-explorer-error{background-color:hsla(var(--color-error),var(--alpha-background-heavy));border:1px solid hsl(var(--color-error));border-radius:var(--border-radius-8);color:hsl(var(--color-error));padding:var(--px-8) var(--px-12)}.CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{padding:0 4px}.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid black;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor .CodeMirror-line::selection,.cm-fat-cursor .CodeMirror-line>span::selection,.cm-fat-cursor .CodeMirror-line>span>span::selection{background:transparent}.cm-fat-cursor .CodeMirror-line::-moz-selection,.cm-fat-cursor .CodeMirror-line>span::-moz-selection,.cm-fat-cursor .CodeMirror-line>span>span::-moz-selection{background:transparent}.cm-fat-cursor{caret-color:transparent}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:0;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-variable-3,.cm-s-default .cm-type{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta,.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error,.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:white}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-50px;margin-right:-50px;padding-bottom:50px;height:100%;outline:none;position:relative;z-index:0}.CodeMirror-sizer{position:relative;border-right:50px solid transparent}.CodeMirror-vscrollbar,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{position:absolute;z-index:6;display:none;outline:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-50px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:none!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:transparent;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre.CodeMirror-line,.CodeMirror-wrap pre.CodeMirror-line-like{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:none}.CodeMirror-scroll,.CodeMirror-sizer,.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors,.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:#ff06}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:""}span.CodeMirror-selectedtext{background:none}.graphiql-container .CodeMirror{height:100%;position:absolute;width:100%}.graphiql-container .CodeMirror{font-family:var(--font-family-mono)}.graphiql-container .CodeMirror,.graphiql-container .CodeMirror-gutters{background:none;background-color:var(--editor-background, hsl(var(--color-base)))}.graphiql-container .CodeMirror-linenumber{padding:0}.graphiql-container .CodeMirror-gutters{border:none}.cm-s-graphiql{color:hsla(var(--color-neutral),var(--alpha-tertiary))}.cm-s-graphiql .cm-keyword{color:hsl(var(--color-primary))}.cm-s-graphiql .cm-def{color:hsl(var(--color-tertiary))}.cm-s-graphiql .cm-punctuation{color:hsla(var(--color-neutral),var(--alpha-tertiary))}.cm-s-graphiql .cm-variable{color:hsl(var(--color-secondary))}.cm-s-graphiql .cm-atom{color:hsl(var(--color-tertiary))}.cm-s-graphiql .cm-number{color:hsl(var(--color-success))}.cm-s-graphiql .cm-string{color:hsl(var(--color-warning))}.cm-s-graphiql .cm-builtin{color:hsl(var(--color-success))}.cm-s-graphiql .cm-string-2{color:hsl(var(--color-secondary))}.cm-s-graphiql .cm-attribute,.cm-s-graphiql .cm-meta{color:hsl(var(--color-tertiary))}.cm-s-graphiql .cm-property{color:hsl(var(--color-info))}.cm-s-graphiql .cm-qualifier{color:hsl(var(--color-secondary))}.cm-s-graphiql .cm-comment{color:hsla(var(--color-neutral),var(--alpha-secondary))}.cm-s-graphiql .cm-ws{color:hsla(var(--color-neutral),var(--alpha-tertiary))}.cm-s-graphiql .cm-invalidchar{color:hsl(var(--color-error))}.cm-s-graphiql .CodeMirror-cursor{border-left:2px solid hsla(var(--color-neutral),var(--alpha-secondary))}.cm-s-graphiql .CodeMirror-linenumber{color:hsla(var(--color-neutral),var(--alpha-tertiary))}.graphiql-container div.CodeMirror span.CodeMirror-matchingbracket,.graphiql-container div.CodeMirror span.CodeMirror-nonmatchingbracket{color:hsl(var(--color-warning))}.graphiql-container .CodeMirror-selected,.graphiql-container .CodeMirror-focused .CodeMirror-selected{background:hsla(var(--color-neutral),var(--alpha-background-heavy))}.graphiql-container .CodeMirror-dialog{background:inherit;color:inherit;left:0;right:0;overflow:hidden;padding:var(--px-2) var(--px-6);position:absolute;z-index:6}.graphiql-container .CodeMirror-dialog-top{border-bottom:1px solid hsla(var(--color-neutral),var(--alpha-background-heavy));padding-bottom:var(--px-12);top:0}.graphiql-container .CodeMirror-dialog-bottom{border-top:1px solid hsla(var(--color-neutral),var(--alpha-background-heavy));bottom:0;padding-top:var(--px-12)}.graphiql-container .CodeMirror-search-hint{display:none}.graphiql-container .CodeMirror-dialog input{border:1px solid hsla(var(--color-neutral),var(--alpha-background-heavy));border-radius:var(--border-radius-4);padding:var(--px-4)}.graphiql-container .CodeMirror-dialog input:focus{outline:hsl(var(--color-primary)) solid 2px}.graphiql-container .cm-searching{background-color:hsla(var(--color-warning),var(--alpha-background-light));padding-bottom:1.5px;padding-top:.5px}.CodeMirror-foldmarker{color:#00f;text-shadow:#b9f 1px 1px 2px,#b9f -1px -1px 2px,#b9f 1px -1px 2px,#b9f -1px 1px 2px;font-family:arial;line-height:.3;cursor:pointer}.CodeMirror-foldgutter{width:.7em}.CodeMirror-foldgutter-open,.CodeMirror-foldgutter-folded{cursor:pointer}.CodeMirror-foldgutter-open:after{content:"▾"}.CodeMirror-foldgutter-folded:after{content:"▸"}.CodeMirror-foldgutter{width:var(--px-12)}.CodeMirror-foldmarker{background-color:hsl(var(--color-info));border-radius:var(--border-radius-4);color:hsl(var(--color-base));font-family:inherit;margin:0 var(--px-4);padding:0 var(--px-8);text-shadow:none}.CodeMirror-foldgutter-open,.CodeMirror-foldgutter-folded{color:hsla(var(--color-neutral),var(--alpha-tertiary))}.CodeMirror-foldgutter-open:after,.CodeMirror-foldgutter-folded:after{margin:0 var(--px-2)}.graphiql-editor{height:100%;position:relative;width:100%}.graphiql-editor.hidden{left:-9999px;position:absolute;top:-9999px;visibility:hidden}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid black;border-radius:4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-marker{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}.CodeMirror-lint-line-error{background-color:#b74c5114}.CodeMirror-lint-line-warning{background-color:#ffd3001a}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-repeat:repeat-x;background-size:10px 3px;background-position:0 95%}.cm-s-graphiql .CodeMirror-lint-mark-error{color:hsl(var(--color-error))}.CodeMirror-lint-mark-error{background-image:linear-gradient(45deg,transparent 65%,hsl(var(--color-error)) 80%,transparent 90%),linear-gradient(135deg,transparent 5%,hsl(var(--color-error)) 15%,transparent 25%),linear-gradient(135deg,transparent 45%,hsl(var(--color-error)) 55%,transparent 65%),linear-gradient(45deg,transparent 25%,hsl(var(--color-error)) 35%,transparent 50%)}.cm-s-graphiql .CodeMirror-lint-mark-warning{color:hsl(var(--color-warning))}.CodeMirror-lint-mark-warning{background-image:linear-gradient(45deg,transparent 65%,hsl(var(--color-warning)) 80%,transparent 90%),linear-gradient(135deg,transparent 5%,hsl(var(--color-warning)) 15%,transparent 25%),linear-gradient(135deg,transparent 45%,hsl(var(--color-warning)) 55%,transparent 65%),linear-gradient(45deg,transparent 25%,hsl(var(--color-warning)) 35%,transparent 50%)}.CodeMirror-lint-tooltip{background-color:hsl(var(--color-base));border:var(--popover-border);border-radius:var(--border-radius-8);box-shadow:var(--popover-box-shadow);font-size:var(--font-size-body);font-family:var(--font-family);max-width:600px;overflow:hidden;padding:var(--px-12)}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{background-image:none;padding:0}.CodeMirror-lint-message-error{color:hsl(var(--color-error))}.CodeMirror-lint-message-warning{color:hsl(var(--color-warning))}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px #0003;border-radius:3px;border:1px solid silver;background:white;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-hints{background:hsl(var(--color-base));border:var(--popover-border);border-radius:var(--border-radius-8);box-shadow:var(--popover-box-shadow);display:grid;font-family:var(--font-family);font-size:var(--font-size-body);grid-template-columns:auto fit-content(300px);max-height:264px;padding:0}.CodeMirror-hint{border-radius:var(--border-radius-4);color:hsla(var(--color-neutral),var(--alpha-secondary));grid-column:1 / 2;margin:var(--px-4);padding:var(--px-6) var(--px-8)!important}.CodeMirror-hint:not(:first-child){margin-top:0}li.CodeMirror-hint-active{background:hsla(var(--color-primary),var(--alpha-background-medium));color:hsl(var(--color-primary))}.CodeMirror-hint-information{border-left:1px solid hsla(var(--color-neutral),var(--alpha-background-heavy));grid-column:2 / 3;grid-row:1 / 99999;max-height:264px;overflow:auto;padding:var(--px-12)}.CodeMirror-hint-information-header{display:flex;align-items:baseline}.CodeMirror-hint-information-field-name{font-size:var(--font-size-h4);font-weight:var(--font-weight-medium)}.CodeMirror-hint-information-type-name-pill{border:1px solid hsla(var(--color-neutral),var(--alpha-tertiary));border-radius:var(--border-radius-4);color:hsla(var(--color-neutral),var(--alpha-secondary));margin-left:var(--px-6);padding:var(--px-4)}.CodeMirror-hint-information-type-name{color:inherit;text-decoration:none}.CodeMirror-hint-information-type-name:hover{text-decoration:underline dotted}.CodeMirror-hint-information-description{color:hsla(var(--color-neutral),var(--alpha-secondary));margin-top:var(--px-12)}.CodeMirror-info{background-color:hsl(var(--color-base));border:var(--popover-border);border-radius:var(--border-radius-8);box-shadow:var(--popover-box-shadow);color:hsla(var(--color-neutral),1);max-height:300px;max-width:400px;opacity:0;overflow:auto;padding:var(--px-12);position:fixed;transition:opacity .15s;z-index:10}.CodeMirror-info a{color:inherit;text-decoration:none}.CodeMirror-info a:hover{text-decoration:underline dotted}.CodeMirror-info .CodeMirror-info-header{display:flex;align-items:baseline}.CodeMirror-info .CodeMirror-info-header>.type-name,.CodeMirror-info .CodeMirror-info-header>.field-name,.CodeMirror-info .CodeMirror-info-header>.arg-name,.CodeMirror-info .CodeMirror-info-header>.directive-name,.CodeMirror-info .CodeMirror-info-header>.enum-value{font-size:var(--font-size-h4);font-weight:var(--font-weight-medium)}.CodeMirror-info .type-name-pill{border:1px solid hsla(var(--color-neutral),var(--alpha-tertiary));border-radius:var(--border-radius-4);color:hsla(var(--color-neutral),var(--alpha-secondary));margin-left:var(--px-6);padding:var(--px-4)}.CodeMirror-info .info-description{color:hsla(var(--color-neutral),var(--alpha-secondary));margin-top:var(--px-12);overflow:hidden}.CodeMirror-jump-token{text-decoration:underline dotted;cursor:pointer}.auto-inserted-leaf.cm-property{animation-duration:6s;animation-name:insertionFade;border-radius:var(--border-radius-4);padding:var(--px-2)}@keyframes insertionFade{0%,to{background-color:none}15%,85%{background-color:hsla(var(--color-warning),var(--alpha-background-light))}}button.graphiql-toolbar-button{display:flex;align-items:center;justify-content:center;height:var(--toolbar-width);width:var(--toolbar-width)}button.graphiql-toolbar-button.error{background:hsla(var(--color-error),var(--alpha-background-heavy))}.graphiql-execute-button-wrapper{position:relative}button.graphiql-execute-button{background-color:hsl(var(--color-primary));border:none;border-radius:var(--border-radius-8);cursor:pointer;height:var(--toolbar-width);padding:0;width:var(--toolbar-width)}button.graphiql-execute-button:hover{background-color:hsla(var(--color-primary),.9)}button.graphiql-execute-button:active{background-color:hsla(var(--color-primary),.8)}button.graphiql-execute-button:focus{outline:hsla(var(--color-primary),.8) auto 1px}button.graphiql-execute-button>svg{color:#fff;display:block;height:var(--px-16);margin:auto;width:var(--px-16)}button.graphiql-toolbar-menu{display:block;height:var(--toolbar-width);width:var(--toolbar-width)} - -/*!*********************************************************************************************************************!*\ - !*** css ../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js!./style.css ***! - \*********************************************************************************************************************/ -/* Everything */ -.graphiql-container { - background-color: hsl(var(--color-base)); - display: flex; - height: 100%; - margin: 0; - overflow: hidden; - width: 100%; -} -/* The sidebar */ -.graphiql-container .graphiql-sidebar { - display: flex; - flex-direction: column; - justify-content: space-between; - padding: var(--px-8); - width: var(--sidebar-width); -} -.graphiql-container .graphiql-sidebar .graphiql-sidebar-section { - display: flex; - flex-direction: column; - gap: var(--px-8); -} -.graphiql-container .graphiql-sidebar button { - display: flex; - align-items: center; - justify-content: center; - color: hsla(var(--color-neutral), var(--alpha-secondary)); - height: calc(var(--sidebar-width) - (2 * var(--px-8))); - width: calc(var(--sidebar-width) - (2 * var(--px-8))); -} -.graphiql-container .graphiql-sidebar button.active { - color: hsla(var(--color-neutral), 1); -} -.graphiql-container .graphiql-sidebar button:not(:first-child) { - margin-top: var(--px-4); -} -.graphiql-container .graphiql-sidebar button > svg { - height: var(--px-20); - width: var(--px-20); -} -/* The main content, i.e. everything except the sidebar */ -.graphiql-container .graphiql-main { - display: flex; - flex: 1; - min-width: 0; -} -/* The current session and tabs */ -.graphiql-container .graphiql-sessions { - background-color: hsla(var(--color-neutral), var(--alpha-background-light)); - /* Adding the 8px of padding to the inner border radius of the query editor */ - border-radius: calc(var(--border-radius-12) + var(--px-8)); - display: flex; - flex-direction: column; - flex: 1; - max-height: 100%; - margin: var(--px-16); - margin-left: 0; - min-width: 0; -} -/* The session header containing tabs and the logo */ -.graphiql-container .graphiql-session-header { - align-items: center; - display: flex; - justify-content: space-between; - height: var(--session-header-height); -} -/* The button to add a new tab */ -button.graphiql-tab-add { - height: 100%; - padding: var(--px-4); -} -button.graphiql-tab-add > svg { - color: hsla(var(--color-neutral), var(--alpha-secondary)); - display: block; - height: var(--px-16); - width: var(--px-16); -} -/* The right-hand-side of the session header */ -.graphiql-container .graphiql-session-header-right { - align-items: center; - display: flex; -} -/* The GraphiQL logo */ -.graphiql-container .graphiql-logo { - color: hsla(var(--color-neutral), var(--alpha-secondary)); - font-size: var(--font-size-h4); - font-weight: var(--font-weight-medium); - padding: var(--px-12) var(--px-16); -} -/* Undo default link styling for the default GraphiQL logo link */ -.graphiql-container .graphiql-logo .graphiql-logo-link { - color: hsla(var(--color-neutral), var(--alpha-secondary)); - text-decoration: none; -} -/* The editor of the session */ -.graphiql-container .graphiql-session { - display: flex; - flex: 1; - padding: 0 var(--px-8) var(--px-8); -} -/* All editors (query, variable, headers) */ -.graphiql-container .graphiql-editors { - background-color: hsl(var(--color-base)); - border-radius: calc(var(--border-radius-12)); - box-shadow: var(--popover-box-shadow); - display: flex; - flex: 1; - flex-direction: column; -} -.graphiql-container .graphiql-editors.full-height { - margin-top: calc(var(--px-8) - var(--session-header-height)); -} -/* The query editor and the toolbar */ -.graphiql-container .graphiql-query-editor { - border-bottom: 1px solid - hsla(var(--color-neutral), var(--alpha-background-heavy)); - padding: var(--px-16); - column-gap: var(--px-16); - display: flex; - width: 100%; -} -/* The vertical toolbar next to the query editor */ -.graphiql-container .graphiql-toolbar { - width: var(--toolbar-width); -} -.graphiql-container .graphiql-toolbar > * + * { - margin-top: var(--px-8); -} -/* The toolbar icons */ -.graphiql-toolbar-icon { - color: hsla(var(--color-neutral), var(--alpha-tertiary)); - display: block; - height: calc(var(--toolbar-width) - (var(--px-8) * 2)); - width: calc(var(--toolbar-width) - (var(--px-8) * 2)); -} -/* The tab bar for editor tools */ -.graphiql-container .graphiql-editor-tools { - cursor: row-resize; - display: flex; - width: 100%; - column-gap: var(--px-8); - padding: var(--px-8); -} -.graphiql-container .graphiql-editor-tools button { - color: hsla(var(--color-neutral), var(--alpha-secondary)); -} -.graphiql-container .graphiql-editor-tools button.active { - color: hsla(var(--color-neutral), 1); -} -/* The tab buttons to switch between editor tools */ -.graphiql-container - .graphiql-editor-tools - > button:not(.graphiql-toggle-editor-tools) { - padding: var(--px-8) var(--px-12); -} -.graphiql-container .graphiql-editor-tools .graphiql-toggle-editor-tools { - margin-left: auto; -} -/* An editor tool, e.g. variable or header editor */ -.graphiql-container .graphiql-editor-tool { - flex: 1; - padding: var(--px-16); -} -/** - * The way CodeMirror editors are styled they overflow their containing - * element. For some OS-browser-combinations this might cause overlap issues, - * setting the position of this to `relative` makes sure this element will - * always be on top of any editors. - */ -.graphiql-container .graphiql-toolbar, -.graphiql-container .graphiql-editor-tools, -.graphiql-container .graphiql-editor-tool { - position: relative; -} -/* The response view */ -.graphiql-container .graphiql-response { - --editor-background: transparent; - display: flex; - width: 100%; - flex-direction: column; -} -/* The results editor wrapping container */ -.graphiql-container .graphiql-response .result-window { - position: relative; - flex: 1; -} -/* The footer below the response view */ -.graphiql-container .graphiql-footer { - border-top: 1px solid - hsla(var(--color-neutral), var(--alpha-background-heavy)); -} -/* The plugin container */ -.graphiql-container .graphiql-plugin { - border-left: 1px solid - hsla(var(--color-neutral), var(--alpha-background-heavy)); - flex: 1; - overflow-y: auto; - padding: var(--px-16); -} -/* Generic drag bar for horizontal resizing */ -.graphiql-horizontal-drag-bar { - width: var(--px-12); - cursor: col-resize; -} -.graphiql-horizontal-drag-bar:hover::after { - border: var(--px-2) solid - hsla(var(--color-neutral), var(--alpha-background-heavy)); - border-radius: var(--border-radius-2); - content: ''; - display: block; - height: 25%; - margin: 0 auto; - position: relative; - /* (100% - 25%) / 2 = 37.5% */ - top: 37.5%; - width: 0; -} -.graphiql-container .graphiql-chevron-icon { - color: hsla(var(--color-neutral), var(--alpha-tertiary)); - display: block; - height: var(--px-12); - margin: var(--px-12); - width: var(--px-12); -} -/* Generic spin animation */ -.graphiql-spin { - animation: spin 0.8s linear 0s infinite; -} -@keyframes spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} -/* The header of the settings dialog */ -.graphiql-dialog .graphiql-dialog-header { - align-items: center; - display: flex; - justify-content: space-between; - padding: var(--px-24); -} -/* The title of the settings dialog */ -.graphiql-dialog .graphiql-dialog-title { - font-size: var(--font-size-h3); - font-weight: var(--font-weight-medium); - margin: 0; -} -/* A section inside the settings dialog */ -.graphiql-dialog .graphiql-dialog-section { - align-items: center; - border-top: 1px solid - hsla(var(--color-neutral), var(--alpha-background-heavy)); - display: flex; - justify-content: space-between; - padding: var(--px-24); -} -.graphiql-dialog .graphiql-dialog-section > :not(:first-child) { - margin-left: var(--px-24); -} -/* The section title in the settings dialog */ -.graphiql-dialog .graphiql-dialog-section-title { - font-size: var(--font-size-h4); - font-weight: var(--font-weight-medium); -} -/* The section caption in the settings dialog */ -.graphiql-dialog .graphiql-dialog-section-caption { - color: hsla(var(--color-neutral), var(--alpha-secondary)); -} -.graphiql-dialog .graphiql-warning-text { - color: hsl(var(--color-warning)); - font-weight: var(--font-weight-medium); -} -.graphiql-dialog .graphiql-table { - border-collapse: collapse; - width: 100%; -} -.graphiql-dialog .graphiql-table :is(th, td) { - border: 1px solid hsla(var(--color-neutral), var(--alpha-background-heavy)); - padding: var(--px-8) var(--px-12); -} -/* A single key the short-key dialog */ -.graphiql-dialog .graphiql-key { - background-color: hsla(var(--color-neutral), var(--alpha-background-medium)); - border-radius: var(--border-radius-4); - padding: var(--px-4); -} -/* Avoid showing native tooltips for icons with titles */ -.graphiql-container svg { - pointer-events: none; -} - - -/*# sourceMappingURL=graphiql.min.css.map*/ \ No newline at end of file diff --git a/graphitron-example/graphitron-example-server/src/main/resources/META-INF/resources/graphiql/vendor/graphiql.min.js b/graphitron-example/graphitron-example-server/src/main/resources/META-INF/resources/graphiql/vendor/graphiql.min.js deleted file mode 100644 index b424322a1a..0000000000 --- a/graphitron-example/graphitron-example-server/src/main/resources/META-INF/resources/graphiql/vendor/graphiql.min.js +++ /dev/null @@ -1,83669 +0,0 @@ -/******/ (function() { // webpackBootstrap -/******/ "use strict"; -/******/ var __webpack_modules__ = ({ - -/***/ "../../../node_modules/@emotion/is-prop-valid/dist/is-prop-valid.browser.esm.js": -/*!**************************************************************************************!*\ - !*** ../../../node_modules/@emotion/is-prop-valid/dist/is-prop-valid.browser.esm.js ***! - \**************************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = void 0; -var _memoize = _interopRequireDefault(__webpack_require__(/*! @emotion/memoize */ "../../../node_modules/@emotion/memoize/dist/memoize.browser.esm.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -var reactPropsRegex = /^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|download|draggable|encType|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|inert|itemProp|itemScope|itemType|itemID|itemRef|on|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/; // https://esbench.com/bench/5bfee68a4cd7e6009ef61d23 - -var index = (0, _memoize.default)(function (prop) { - return reactPropsRegex.test(prop) || prop.charCodeAt(0) === 111 - /* o */ && prop.charCodeAt(1) === 110 - /* n */ && prop.charCodeAt(2) < 91; -} -/* Z+1 */); -var _default = index; -exports["default"] = _default; - -/***/ }), - -/***/ "../../../node_modules/@emotion/memoize/dist/memoize.browser.esm.js": -/*!**************************************************************************!*\ - !*** ../../../node_modules/@emotion/memoize/dist/memoize.browser.esm.js ***! - \**************************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = void 0; -function memoize(fn) { - var cache = {}; - return function (arg) { - if (cache[arg] === undefined) cache[arg] = fn(arg); - return cache[arg]; - }; -} -var _default = memoize; -exports["default"] = _default; - -/***/ }), - -/***/ "../../../node_modules/@floating-ui/core/dist/floating-ui.core.esm.js": -/*!****************************************************************************!*\ - !*** ../../../node_modules/@floating-ui/core/dist/floating-ui.core.esm.js ***! - \****************************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.computePosition = exports.autoPlacement = exports.arrow = void 0; -exports.detectOverflow = detectOverflow; -exports.offset = exports.limitShift = exports.inline = exports.hide = exports.flip = void 0; -exports.rectToClientRect = rectToClientRect; -exports.size = exports.shift = void 0; -function getAlignment(placement) { - return placement.split('-')[1]; -} -function getLengthFromAxis(axis) { - return axis === 'y' ? 'height' : 'width'; -} -function getSide(placement) { - return placement.split('-')[0]; -} -function getMainAxisFromPlacement(placement) { - return ['top', 'bottom'].includes(getSide(placement)) ? 'x' : 'y'; -} -function computeCoordsFromPlacement(_ref, placement, rtl) { - let { - reference, - floating - } = _ref; - const commonX = reference.x + reference.width / 2 - floating.width / 2; - const commonY = reference.y + reference.height / 2 - floating.height / 2; - const mainAxis = getMainAxisFromPlacement(placement); - const length = getLengthFromAxis(mainAxis); - const commonAlign = reference[length] / 2 - floating[length] / 2; - const side = getSide(placement); - const isVertical = mainAxis === 'x'; - let coords; - switch (side) { - case 'top': - coords = { - x: commonX, - y: reference.y - floating.height - }; - break; - case 'bottom': - coords = { - x: commonX, - y: reference.y + reference.height - }; - break; - case 'right': - coords = { - x: reference.x + reference.width, - y: commonY - }; - break; - case 'left': - coords = { - x: reference.x - floating.width, - y: commonY - }; - break; - default: - coords = { - x: reference.x, - y: reference.y - }; - } - switch (getAlignment(placement)) { - case 'start': - coords[mainAxis] -= commonAlign * (rtl && isVertical ? -1 : 1); - break; - case 'end': - coords[mainAxis] += commonAlign * (rtl && isVertical ? -1 : 1); - break; - } - return coords; -} - -/** - * Computes the `x` and `y` coordinates that will place the floating element - * next to a reference element when it is given a certain positioning strategy. - * - * This export does not have any `platform` interface logic. You will need to - * write one for the platform you are using Floating UI with. - */ -const computePosition = async (reference, floating, config) => { - const { - placement = 'bottom', - strategy = 'absolute', - middleware = [], - platform - } = config; - const validMiddleware = middleware.filter(Boolean); - const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating)); - let rects = await platform.getElementRects({ - reference, - floating, - strategy - }); - let { - x, - y - } = computeCoordsFromPlacement(rects, placement, rtl); - let statefulPlacement = placement; - let middlewareData = {}; - let resetCount = 0; - for (let i = 0; i < validMiddleware.length; i++) { - const { - name, - fn - } = validMiddleware[i]; - const { - x: nextX, - y: nextY, - data, - reset - } = await fn({ - x, - y, - initialPlacement: placement, - placement: statefulPlacement, - strategy, - middlewareData, - rects, - platform, - elements: { - reference, - floating - } - }); - x = nextX != null ? nextX : x; - y = nextY != null ? nextY : y; - middlewareData = { - ...middlewareData, - [name]: { - ...middlewareData[name], - ...data - } - }; - if (reset && resetCount <= 50) { - resetCount++; - if (typeof reset === 'object') { - if (reset.placement) { - statefulPlacement = reset.placement; - } - if (reset.rects) { - rects = reset.rects === true ? await platform.getElementRects({ - reference, - floating, - strategy - }) : reset.rects; - } - ({ - x, - y - } = computeCoordsFromPlacement(rects, statefulPlacement, rtl)); - } - i = -1; - continue; - } - } - return { - x, - y, - placement: statefulPlacement, - strategy, - middlewareData - }; -}; -exports.computePosition = computePosition; -function evaluate(value, param) { - return typeof value === 'function' ? value(param) : value; -} -function expandPaddingObject(padding) { - return { - top: 0, - right: 0, - bottom: 0, - left: 0, - ...padding - }; -} -function getSideObjectFromPadding(padding) { - return typeof padding !== 'number' ? expandPaddingObject(padding) : { - top: padding, - right: padding, - bottom: padding, - left: padding - }; -} -function rectToClientRect(rect) { - return { - ...rect, - top: rect.y, - left: rect.x, - right: rect.x + rect.width, - bottom: rect.y + rect.height - }; -} - -/** - * Resolves with an object of overflow side offsets that determine how much the - * element is overflowing a given clipping boundary on each side. - * - positive = overflowing the boundary by that number of pixels - * - negative = how many pixels left before it will overflow - * - 0 = lies flush with the boundary - * @see https://floating-ui.com/docs/detectOverflow - */ -async function detectOverflow(state, options) { - var _await$platform$isEle; - if (options === void 0) { - options = {}; - } - const { - x, - y, - platform, - rects, - elements, - strategy - } = state; - const { - boundary = 'clippingAncestors', - rootBoundary = 'viewport', - elementContext = 'floating', - altBoundary = false, - padding = 0 - } = evaluate(options, state); - const paddingObject = getSideObjectFromPadding(padding); - const altContext = elementContext === 'floating' ? 'reference' : 'floating'; - const element = elements[altBoundary ? altContext : elementContext]; - const clippingClientRect = rectToClientRect(await platform.getClippingRect({ - element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))), - boundary, - rootBoundary, - strategy - })); - const rect = elementContext === 'floating' ? { - ...rects.floating, - x, - y - } : rects.reference; - const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating)); - const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) ? (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || { - x: 1, - y: 1 - } : { - x: 1, - y: 1 - }; - const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({ - rect, - offsetParent, - strategy - }) : rect); - return { - top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y, - bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y, - left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x, - right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x - }; -} -const min = Math.min; -const max = Math.max; -function within(min$1, value, max$1) { - return max(min$1, min(value, max$1)); -} - -/** - * Provides data to position an inner element of the floating element so that it - * appears centered to the reference element. - * @see https://floating-ui.com/docs/arrow - */ -const arrow = options => ({ - name: 'arrow', - options, - async fn(state) { - const { - x, - y, - placement, - rects, - platform, - elements - } = state; - // Since `element` is required, we don't Partial<> the type. - const { - element, - padding = 0 - } = evaluate(options, state) || {}; - if (element == null) { - return {}; - } - const paddingObject = getSideObjectFromPadding(padding); - const coords = { - x, - y - }; - const axis = getMainAxisFromPlacement(placement); - const length = getLengthFromAxis(axis); - const arrowDimensions = await platform.getDimensions(element); - const isYAxis = axis === 'y'; - const minProp = isYAxis ? 'top' : 'left'; - const maxProp = isYAxis ? 'bottom' : 'right'; - const clientProp = isYAxis ? 'clientHeight' : 'clientWidth'; - const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length]; - const startDiff = coords[axis] - rects.reference[axis]; - const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element)); - let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0; - - // DOM platform can return `window` as the `offsetParent`. - if (!clientSize || !(await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent)))) { - clientSize = elements.floating[clientProp] || rects.floating[length]; - } - const centerToReference = endDiff / 2 - startDiff / 2; - - // If the padding is large enough that it causes the arrow to no longer be - // centered, modify the padding so that it is centered. - const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1; - const minPadding = min(paddingObject[minProp], largestPossiblePadding); - const maxPadding = min(paddingObject[maxProp], largestPossiblePadding); - - // Make sure the arrow doesn't overflow the floating element if the center - // point is outside the floating element's bounds. - const min$1 = minPadding; - const max = clientSize - arrowDimensions[length] - maxPadding; - const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference; - const offset = within(min$1, center, max); - - // If the reference is small enough that the arrow's padding causes it to - // to point to nothing for an aligned placement, adjust the offset of the - // floating element itself. This stops `shift()` from taking action, but can - // be worked around by calling it again after the `arrow()` if desired. - const shouldAddOffset = getAlignment(placement) != null && center != offset && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0; - const alignmentOffset = shouldAddOffset ? center < min$1 ? min$1 - center : max - center : 0; - return { - [axis]: coords[axis] - alignmentOffset, - data: { - [axis]: offset, - centerOffset: center - offset - } - }; - } -}); -exports.arrow = arrow; -const sides = ['top', 'right', 'bottom', 'left']; -const allPlacements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + "-start", side + "-end"), []); -const oppositeSideMap = { - left: 'right', - right: 'left', - bottom: 'top', - top: 'bottom' -}; -function getOppositePlacement(placement) { - return placement.replace(/left|right|bottom|top/g, side => oppositeSideMap[side]); -} -function getAlignmentSides(placement, rects, rtl) { - if (rtl === void 0) { - rtl = false; - } - const alignment = getAlignment(placement); - const mainAxis = getMainAxisFromPlacement(placement); - const length = getLengthFromAxis(mainAxis); - let mainAlignmentSide = mainAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top'; - if (rects.reference[length] > rects.floating[length]) { - mainAlignmentSide = getOppositePlacement(mainAlignmentSide); - } - return { - main: mainAlignmentSide, - cross: getOppositePlacement(mainAlignmentSide) - }; -} -const oppositeAlignmentMap = { - start: 'end', - end: 'start' -}; -function getOppositeAlignmentPlacement(placement) { - return placement.replace(/start|end/g, alignment => oppositeAlignmentMap[alignment]); -} -function getPlacementList(alignment, autoAlignment, allowedPlacements) { - const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement); - return allowedPlacementsSortedByAlignment.filter(placement => { - if (alignment) { - return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false); - } - return true; - }); -} -/** - * Optimizes the visibility of the floating element by choosing the placement - * that has the most space available automatically, without needing to specify a - * preferred placement. Alternative to `flip`. - * @see https://floating-ui.com/docs/autoPlacement - */ -const autoPlacement = function (options) { - if (options === void 0) { - options = {}; - } - return { - name: 'autoPlacement', - options, - async fn(state) { - var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE; - const { - rects, - middlewareData, - placement, - platform, - elements - } = state; - const { - crossAxis = false, - alignment, - allowedPlacements = allPlacements, - autoAlignment = true, - ...detectOverflowOptions - } = evaluate(options, state); - const placements = alignment !== undefined || allowedPlacements === allPlacements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements; - const overflow = await detectOverflow(state, detectOverflowOptions); - const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0; - const currentPlacement = placements[currentIndex]; - if (currentPlacement == null) { - return {}; - } - const { - main, - cross - } = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))); - - // Make `computeCoords` start from the right place. - if (placement !== currentPlacement) { - return { - reset: { - placement: placements[0] - } - }; - } - const currentOverflows = [overflow[getSide(currentPlacement)], overflow[main], overflow[cross]]; - const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), { - placement: currentPlacement, - overflows: currentOverflows - }]; - const nextPlacement = placements[currentIndex + 1]; - - // There are more placements to check. - if (nextPlacement) { - return { - data: { - index: currentIndex + 1, - overflows: allOverflows - }, - reset: { - placement: nextPlacement - } - }; - } - const placementsSortedByMostSpace = allOverflows.map(d => { - const alignment = getAlignment(d.placement); - return [d.placement, alignment && crossAxis ? - // Check along the mainAxis and main crossAxis side. - d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) : - // Check only the mainAxis. - d.overflows[0], d.overflows]; - }).sort((a, b) => a[1] - b[1]); - const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0, - // Aligned placements should not check their opposite crossAxis - // side. - getAlignment(d[0]) ? 2 : 3).every(v => v <= 0)); - const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0]; - if (resetPlacement !== placement) { - return { - data: { - index: currentIndex + 1, - overflows: allOverflows - }, - reset: { - placement: resetPlacement - } - }; - } - return {}; - } - }; -}; -exports.autoPlacement = autoPlacement; -function getExpandedPlacements(placement) { - const oppositePlacement = getOppositePlacement(placement); - return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)]; -} -function getSideList(side, isStart, rtl) { - const lr = ['left', 'right']; - const rl = ['right', 'left']; - const tb = ['top', 'bottom']; - const bt = ['bottom', 'top']; - switch (side) { - case 'top': - case 'bottom': - if (rtl) return isStart ? rl : lr; - return isStart ? lr : rl; - case 'left': - case 'right': - return isStart ? tb : bt; - default: - return []; - } -} -function getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) { - const alignment = getAlignment(placement); - let list = getSideList(getSide(placement), direction === 'start', rtl); - if (alignment) { - list = list.map(side => side + "-" + alignment); - if (flipAlignment) { - list = list.concat(list.map(getOppositeAlignmentPlacement)); - } - } - return list; -} - -/** - * Optimizes the visibility of the floating element by flipping the `placement` - * in order to keep it in view when the preferred placement(s) will overflow the - * clipping boundary. Alternative to `autoPlacement`. - * @see https://floating-ui.com/docs/flip - */ -const flip = function (options) { - if (options === void 0) { - options = {}; - } - return { - name: 'flip', - options, - async fn(state) { - var _middlewareData$flip; - const { - placement, - middlewareData, - rects, - initialPlacement, - platform, - elements - } = state; - const { - mainAxis: checkMainAxis = true, - crossAxis: checkCrossAxis = true, - fallbackPlacements: specifiedFallbackPlacements, - fallbackStrategy = 'bestFit', - fallbackAxisSideDirection = 'none', - flipAlignment = true, - ...detectOverflowOptions - } = evaluate(options, state); - const side = getSide(placement); - const isBasePlacement = getSide(initialPlacement) === initialPlacement; - const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)); - const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement)); - if (!specifiedFallbackPlacements && fallbackAxisSideDirection !== 'none') { - fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl)); - } - const placements = [initialPlacement, ...fallbackPlacements]; - const overflow = await detectOverflow(state, detectOverflowOptions); - const overflows = []; - let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || []; - if (checkMainAxis) { - overflows.push(overflow[side]); - } - if (checkCrossAxis) { - const { - main, - cross - } = getAlignmentSides(placement, rects, rtl); - overflows.push(overflow[main], overflow[cross]); - } - overflowsData = [...overflowsData, { - placement, - overflows - }]; - - // One or more sides is overflowing. - if (!overflows.every(side => side <= 0)) { - var _middlewareData$flip2, _overflowsData$filter; - const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1; - const nextPlacement = placements[nextIndex]; - if (nextPlacement) { - // Try next placement and re-run the lifecycle. - return { - data: { - index: nextIndex, - overflows: overflowsData - }, - reset: { - placement: nextPlacement - } - }; - } - - // First, find the candidates that fit on the mainAxis side of overflow, - // then find the placement that fits the best on the main crossAxis side. - let resetPlacement = (_overflowsData$filter = overflowsData.filter(d => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement; - - // Otherwise fallback. - if (!resetPlacement) { - switch (fallbackStrategy) { - case 'bestFit': - { - var _overflowsData$map$so; - const placement = (_overflowsData$map$so = overflowsData.map(d => [d.placement, d.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$map$so[0]; - if (placement) { - resetPlacement = placement; - } - break; - } - case 'initialPlacement': - resetPlacement = initialPlacement; - break; - } - } - if (placement !== resetPlacement) { - return { - reset: { - placement: resetPlacement - } - }; - } - } - return {}; - } - }; -}; -exports.flip = flip; -function getSideOffsets(overflow, rect) { - return { - top: overflow.top - rect.height, - right: overflow.right - rect.width, - bottom: overflow.bottom - rect.height, - left: overflow.left - rect.width - }; -} -function isAnySideFullyClipped(overflow) { - return sides.some(side => overflow[side] >= 0); -} -/** - * Provides data to hide the floating element in applicable situations, such as - * when it is not in the same clipping context as the reference element. - * @see https://floating-ui.com/docs/hide - */ -const hide = function (options) { - if (options === void 0) { - options = {}; - } - return { - name: 'hide', - options, - async fn(state) { - const { - rects - } = state; - const { - strategy = 'referenceHidden', - ...detectOverflowOptions - } = evaluate(options, state); - switch (strategy) { - case 'referenceHidden': - { - const overflow = await detectOverflow(state, { - ...detectOverflowOptions, - elementContext: 'reference' - }); - const offsets = getSideOffsets(overflow, rects.reference); - return { - data: { - referenceHiddenOffsets: offsets, - referenceHidden: isAnySideFullyClipped(offsets) - } - }; - } - case 'escaped': - { - const overflow = await detectOverflow(state, { - ...detectOverflowOptions, - altBoundary: true - }); - const offsets = getSideOffsets(overflow, rects.floating); - return { - data: { - escapedOffsets: offsets, - escaped: isAnySideFullyClipped(offsets) - } - }; - } - default: - { - return {}; - } - } - } - }; -}; -exports.hide = hide; -function getBoundingRect(rects) { - const minX = min(...rects.map(rect => rect.left)); - const minY = min(...rects.map(rect => rect.top)); - const maxX = max(...rects.map(rect => rect.right)); - const maxY = max(...rects.map(rect => rect.bottom)); - return { - x: minX, - y: minY, - width: maxX - minX, - height: maxY - minY - }; -} -function getRectsByLine(rects) { - const sortedRects = rects.slice().sort((a, b) => a.y - b.y); - const groups = []; - let prevRect = null; - for (let i = 0; i < sortedRects.length; i++) { - const rect = sortedRects[i]; - if (!prevRect || rect.y - prevRect.y > prevRect.height / 2) { - groups.push([rect]); - } else { - groups[groups.length - 1].push(rect); - } - prevRect = rect; - } - return groups.map(rect => rectToClientRect(getBoundingRect(rect))); -} -/** - * Provides improved positioning for inline reference elements that can span - * over multiple lines, such as hyperlinks or range selections. - * @see https://floating-ui.com/docs/inline - */ -const inline = function (options) { - if (options === void 0) { - options = {}; - } - return { - name: 'inline', - options, - async fn(state) { - const { - placement, - elements, - rects, - platform, - strategy - } = state; - // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a - // ClientRect's bounds, despite the event listener being triggered. A - // padding of 2 seems to handle this issue. - const { - padding = 2, - x, - y - } = evaluate(options, state); - const nativeClientRects = Array.from((await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) || []); - const clientRects = getRectsByLine(nativeClientRects); - const fallback = rectToClientRect(getBoundingRect(nativeClientRects)); - const paddingObject = getSideObjectFromPadding(padding); - function getBoundingClientRect() { - // There are two rects and they are disjoined. - if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) { - // Find the first rect in which the point is fully inside. - return clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom) || fallback; - } - - // There are 2 or more connected rects. - if (clientRects.length >= 2) { - if (getMainAxisFromPlacement(placement) === 'x') { - const firstRect = clientRects[0]; - const lastRect = clientRects[clientRects.length - 1]; - const isTop = getSide(placement) === 'top'; - const top = firstRect.top; - const bottom = lastRect.bottom; - const left = isTop ? firstRect.left : lastRect.left; - const right = isTop ? firstRect.right : lastRect.right; - const width = right - left; - const height = bottom - top; - return { - top, - bottom, - left, - right, - width, - height, - x: left, - y: top - }; - } - const isLeftSide = getSide(placement) === 'left'; - const maxRight = max(...clientRects.map(rect => rect.right)); - const minLeft = min(...clientRects.map(rect => rect.left)); - const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight); - const top = measureRects[0].top; - const bottom = measureRects[measureRects.length - 1].bottom; - const left = minLeft; - const right = maxRight; - const width = right - left; - const height = bottom - top; - return { - top, - bottom, - left, - right, - width, - height, - x: left, - y: top - }; - } - return fallback; - } - const resetRects = await platform.getElementRects({ - reference: { - getBoundingClientRect - }, - floating: elements.floating, - strategy - }); - if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) { - return { - reset: { - rects: resetRects - } - }; - } - return {}; - } - }; -}; -exports.inline = inline; -async function convertValueToCoords(state, options) { - const { - placement, - platform, - elements - } = state; - const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)); - const side = getSide(placement); - const alignment = getAlignment(placement); - const isVertical = getMainAxisFromPlacement(placement) === 'x'; - const mainAxisMulti = ['left', 'top'].includes(side) ? -1 : 1; - const crossAxisMulti = rtl && isVertical ? -1 : 1; - const rawValue = evaluate(options, state); - - // eslint-disable-next-line prefer-const - let { - mainAxis, - crossAxis, - alignmentAxis - } = typeof rawValue === 'number' ? { - mainAxis: rawValue, - crossAxis: 0, - alignmentAxis: null - } : { - mainAxis: 0, - crossAxis: 0, - alignmentAxis: null, - ...rawValue - }; - if (alignment && typeof alignmentAxis === 'number') { - crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis; - } - return isVertical ? { - x: crossAxis * crossAxisMulti, - y: mainAxis * mainAxisMulti - } : { - x: mainAxis * mainAxisMulti, - y: crossAxis * crossAxisMulti - }; -} - -/** - * Modifies the placement by translating the floating element along the - * specified axes. - * A number (shorthand for `mainAxis` or distance), or an axes configuration - * object may be passed. - * @see https://floating-ui.com/docs/offset - */ -const offset = function (options) { - if (options === void 0) { - options = 0; - } - return { - name: 'offset', - options, - async fn(state) { - const { - x, - y - } = state; - const diffCoords = await convertValueToCoords(state, options); - return { - x: x + diffCoords.x, - y: y + diffCoords.y, - data: diffCoords - }; - } - }; -}; -exports.offset = offset; -function getCrossAxis(axis) { - return axis === 'x' ? 'y' : 'x'; -} - -/** - * Optimizes the visibility of the floating element by shifting it in order to - * keep it in view when it will overflow the clipping boundary. - * @see https://floating-ui.com/docs/shift - */ -const shift = function (options) { - if (options === void 0) { - options = {}; - } - return { - name: 'shift', - options, - async fn(state) { - const { - x, - y, - placement - } = state; - const { - mainAxis: checkMainAxis = true, - crossAxis: checkCrossAxis = false, - limiter = { - fn: _ref => { - let { - x, - y - } = _ref; - return { - x, - y - }; - } - }, - ...detectOverflowOptions - } = evaluate(options, state); - const coords = { - x, - y - }; - const overflow = await detectOverflow(state, detectOverflowOptions); - const mainAxis = getMainAxisFromPlacement(getSide(placement)); - const crossAxis = getCrossAxis(mainAxis); - let mainAxisCoord = coords[mainAxis]; - let crossAxisCoord = coords[crossAxis]; - if (checkMainAxis) { - const minSide = mainAxis === 'y' ? 'top' : 'left'; - const maxSide = mainAxis === 'y' ? 'bottom' : 'right'; - const min = mainAxisCoord + overflow[minSide]; - const max = mainAxisCoord - overflow[maxSide]; - mainAxisCoord = within(min, mainAxisCoord, max); - } - if (checkCrossAxis) { - const minSide = crossAxis === 'y' ? 'top' : 'left'; - const maxSide = crossAxis === 'y' ? 'bottom' : 'right'; - const min = crossAxisCoord + overflow[minSide]; - const max = crossAxisCoord - overflow[maxSide]; - crossAxisCoord = within(min, crossAxisCoord, max); - } - const limitedCoords = limiter.fn({ - ...state, - [mainAxis]: mainAxisCoord, - [crossAxis]: crossAxisCoord - }); - return { - ...limitedCoords, - data: { - x: limitedCoords.x - x, - y: limitedCoords.y - y - } - }; - } - }; -}; -/** - * Built-in `limiter` that will stop `shift()` at a certain point. - */ -exports.shift = shift; -const limitShift = function (options) { - if (options === void 0) { - options = {}; - } - return { - options, - fn(state) { - const { - x, - y, - placement, - rects, - middlewareData - } = state; - const { - offset = 0, - mainAxis: checkMainAxis = true, - crossAxis: checkCrossAxis = true - } = evaluate(options, state); - const coords = { - x, - y - }; - const mainAxis = getMainAxisFromPlacement(placement); - const crossAxis = getCrossAxis(mainAxis); - let mainAxisCoord = coords[mainAxis]; - let crossAxisCoord = coords[crossAxis]; - const rawOffset = evaluate(offset, state); - const computedOffset = typeof rawOffset === 'number' ? { - mainAxis: rawOffset, - crossAxis: 0 - } : { - mainAxis: 0, - crossAxis: 0, - ...rawOffset - }; - if (checkMainAxis) { - const len = mainAxis === 'y' ? 'height' : 'width'; - const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis; - const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis; - if (mainAxisCoord < limitMin) { - mainAxisCoord = limitMin; - } else if (mainAxisCoord > limitMax) { - mainAxisCoord = limitMax; - } - } - if (checkCrossAxis) { - var _middlewareData$offse, _middlewareData$offse2; - const len = mainAxis === 'y' ? 'width' : 'height'; - const isOriginSide = ['top', 'left'].includes(getSide(placement)); - const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis); - const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0); - if (crossAxisCoord < limitMin) { - crossAxisCoord = limitMin; - } else if (crossAxisCoord > limitMax) { - crossAxisCoord = limitMax; - } - } - return { - [mainAxis]: mainAxisCoord, - [crossAxis]: crossAxisCoord - }; - } - }; -}; - -/** - * Provides data that allows you to change the size of the floating element — - * for instance, prevent it from overflowing the clipping boundary or match the - * width of the reference element. - * @see https://floating-ui.com/docs/size - */ -exports.limitShift = limitShift; -const size = function (options) { - if (options === void 0) { - options = {}; - } - return { - name: 'size', - options, - async fn(state) { - const { - placement, - rects, - platform, - elements - } = state; - const { - apply = () => {}, - ...detectOverflowOptions - } = evaluate(options, state); - const overflow = await detectOverflow(state, detectOverflowOptions); - const side = getSide(placement); - const alignment = getAlignment(placement); - const axis = getMainAxisFromPlacement(placement); - const isXAxis = axis === 'x'; - const { - width, - height - } = rects.floating; - let heightSide; - let widthSide; - if (side === 'top' || side === 'bottom') { - heightSide = side; - widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right'; - } else { - widthSide = side; - heightSide = alignment === 'end' ? 'top' : 'bottom'; - } - const overflowAvailableHeight = height - overflow[heightSide]; - const overflowAvailableWidth = width - overflow[widthSide]; - const noShift = !state.middlewareData.shift; - let availableHeight = overflowAvailableHeight; - let availableWidth = overflowAvailableWidth; - if (isXAxis) { - const maximumClippingWidth = width - overflow.left - overflow.right; - availableWidth = alignment || noShift ? min(overflowAvailableWidth, maximumClippingWidth) : maximumClippingWidth; - } else { - const maximumClippingHeight = height - overflow.top - overflow.bottom; - availableHeight = alignment || noShift ? min(overflowAvailableHeight, maximumClippingHeight) : maximumClippingHeight; - } - if (noShift && !alignment) { - const xMin = max(overflow.left, 0); - const xMax = max(overflow.right, 0); - const yMin = max(overflow.top, 0); - const yMax = max(overflow.bottom, 0); - if (isXAxis) { - availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right)); - } else { - availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom)); - } - } - await apply({ - ...state, - availableWidth, - availableHeight - }); - const nextDimensions = await platform.getDimensions(elements.floating); - if (width !== nextDimensions.width || height !== nextDimensions.height) { - return { - reset: { - rects: true - } - }; - } - return {}; - } - }; -}; -exports.size = size; - -/***/ }), - -/***/ "../../../node_modules/@floating-ui/dom/dist/floating-ui.dom.esm.js": -/*!**************************************************************************!*\ - !*** ../../../node_modules/@floating-ui/dom/dist/floating-ui.dom.esm.js ***! - \**************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -Object.defineProperty(exports, "arrow", ({ - enumerable: true, - get: function () { - return _core.arrow; - } -})); -Object.defineProperty(exports, "autoPlacement", ({ - enumerable: true, - get: function () { - return _core.autoPlacement; - } -})); -exports.autoUpdate = autoUpdate; -exports.computePosition = void 0; -Object.defineProperty(exports, "detectOverflow", ({ - enumerable: true, - get: function () { - return _core.detectOverflow; - } -})); -Object.defineProperty(exports, "flip", ({ - enumerable: true, - get: function () { - return _core.flip; - } -})); -exports.getOverflowAncestors = getOverflowAncestors; -Object.defineProperty(exports, "hide", ({ - enumerable: true, - get: function () { - return _core.hide; - } -})); -Object.defineProperty(exports, "inline", ({ - enumerable: true, - get: function () { - return _core.inline; - } -})); -Object.defineProperty(exports, "limitShift", ({ - enumerable: true, - get: function () { - return _core.limitShift; - } -})); -Object.defineProperty(exports, "offset", ({ - enumerable: true, - get: function () { - return _core.offset; - } -})); -exports.platform = void 0; -Object.defineProperty(exports, "shift", ({ - enumerable: true, - get: function () { - return _core.shift; - } -})); -Object.defineProperty(exports, "size", ({ - enumerable: true, - get: function () { - return _core.size; - } -})); -var _core = __webpack_require__(/*! @floating-ui/core */ "../../../node_modules/@floating-ui/core/dist/floating-ui.core.esm.js"); -function getWindow(node) { - var _node$ownerDocument; - return ((_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window; -} -function getComputedStyle$1(element) { - return getWindow(element).getComputedStyle(element); -} -function isNode(value) { - return value instanceof getWindow(value).Node; -} -function getNodeName(node) { - return isNode(node) ? (node.nodeName || '').toLowerCase() : ''; -} -function isHTMLElement(value) { - return value instanceof getWindow(value).HTMLElement; -} -function isElement(value) { - return value instanceof getWindow(value).Element; -} -function isShadowRoot(node) { - // Browsers without `ShadowRoot` support. - if (typeof ShadowRoot === 'undefined') { - return false; - } - const OwnElement = getWindow(node).ShadowRoot; - return node instanceof OwnElement || node instanceof ShadowRoot; -} -function isOverflowElement(element) { - const { - overflow, - overflowX, - overflowY, - display - } = getComputedStyle$1(element); - return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !['inline', 'contents'].includes(display); -} -function isTableElement(element) { - return ['table', 'td', 'th'].includes(getNodeName(element)); -} -function isContainingBlock(element) { - const safari = isSafari(); - const css = getComputedStyle$1(element); - - // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block - return css.transform !== 'none' || css.perspective !== 'none' || !safari && (css.backdropFilter ? css.backdropFilter !== 'none' : false) || !safari && (css.filter ? css.filter !== 'none' : false) || ['transform', 'perspective', 'filter'].some(value => (css.willChange || '').includes(value)) || ['paint', 'layout', 'strict', 'content'].some(value => (css.contain || '').includes(value)); -} -function isSafari() { - if (typeof CSS === 'undefined' || !CSS.supports) return false; - return CSS.supports('-webkit-backdrop-filter', 'none'); -} -function isLastTraversableNode(node) { - return ['html', 'body', '#document'].includes(getNodeName(node)); -} -const min = Math.min; -const max = Math.max; -const round = Math.round; -function getCssDimensions(element) { - const css = getComputedStyle$1(element); - // In testing environments, the `width` and `height` properties are empty - // strings for SVG elements, returning NaN. Fallback to `0` in this case. - let width = parseFloat(css.width) || 0; - let height = parseFloat(css.height) || 0; - const hasOffset = isHTMLElement(element); - const offsetWidth = hasOffset ? element.offsetWidth : width; - const offsetHeight = hasOffset ? element.offsetHeight : height; - const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight; - if (shouldFallback) { - width = offsetWidth; - height = offsetHeight; - } - return { - width, - height, - fallback: shouldFallback - }; -} -function unwrapElement(element) { - return !isElement(element) ? element.contextElement : element; -} -const FALLBACK_SCALE = { - x: 1, - y: 1 -}; -function getScale(element) { - const domElement = unwrapElement(element); - if (!isHTMLElement(domElement)) { - return FALLBACK_SCALE; - } - const rect = domElement.getBoundingClientRect(); - const { - width, - height, - fallback - } = getCssDimensions(domElement); - let x = (fallback ? round(rect.width) : rect.width) / width; - let y = (fallback ? round(rect.height) : rect.height) / height; - - // 0, NaN, or Infinity should always fallback to 1. - - if (!x || !Number.isFinite(x)) { - x = 1; - } - if (!y || !Number.isFinite(y)) { - y = 1; - } - return { - x, - y - }; -} -const noOffsets = { - x: 0, - y: 0 -}; -function getVisualOffsets(element, isFixed, floatingOffsetParent) { - var _win$visualViewport, _win$visualViewport2; - if (isFixed === void 0) { - isFixed = true; - } - if (!isSafari()) { - return noOffsets; - } - const win = element ? getWindow(element) : window; - if (!floatingOffsetParent || isFixed && floatingOffsetParent !== win) { - return noOffsets; - } - return { - x: ((_win$visualViewport = win.visualViewport) == null ? void 0 : _win$visualViewport.offsetLeft) || 0, - y: ((_win$visualViewport2 = win.visualViewport) == null ? void 0 : _win$visualViewport2.offsetTop) || 0 - }; -} -function getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) { - if (includeScale === void 0) { - includeScale = false; - } - if (isFixedStrategy === void 0) { - isFixedStrategy = false; - } - const clientRect = element.getBoundingClientRect(); - const domElement = unwrapElement(element); - let scale = FALLBACK_SCALE; - if (includeScale) { - if (offsetParent) { - if (isElement(offsetParent)) { - scale = getScale(offsetParent); - } - } else { - scale = getScale(element); - } - } - const visualOffsets = getVisualOffsets(domElement, isFixedStrategy, offsetParent); - let x = (clientRect.left + visualOffsets.x) / scale.x; - let y = (clientRect.top + visualOffsets.y) / scale.y; - let width = clientRect.width / scale.x; - let height = clientRect.height / scale.y; - if (domElement) { - const win = getWindow(domElement); - const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent; - let currentIFrame = win.frameElement; - while (currentIFrame && offsetParent && offsetWin !== win) { - const iframeScale = getScale(currentIFrame); - const iframeRect = currentIFrame.getBoundingClientRect(); - const css = getComputedStyle(currentIFrame); - iframeRect.x += (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x; - iframeRect.y += (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y; - x *= iframeScale.x; - y *= iframeScale.y; - width *= iframeScale.x; - height *= iframeScale.y; - x += iframeRect.x; - y += iframeRect.y; - currentIFrame = getWindow(currentIFrame).frameElement; - } - } - return (0, _core.rectToClientRect)({ - width, - height, - x, - y - }); -} -function getDocumentElement(node) { - return ((isNode(node) ? node.ownerDocument : node.document) || window.document).documentElement; -} -function getNodeScroll(element) { - if (isElement(element)) { - return { - scrollLeft: element.scrollLeft, - scrollTop: element.scrollTop - }; - } - return { - scrollLeft: element.pageXOffset, - scrollTop: element.pageYOffset - }; -} -function convertOffsetParentRelativeRectToViewportRelativeRect(_ref) { - let { - rect, - offsetParent, - strategy - } = _ref; - const isOffsetParentAnElement = isHTMLElement(offsetParent); - const documentElement = getDocumentElement(offsetParent); - if (offsetParent === documentElement) { - return rect; - } - let scroll = { - scrollLeft: 0, - scrollTop: 0 - }; - let scale = { - x: 1, - y: 1 - }; - const offsets = { - x: 0, - y: 0 - }; - if (isOffsetParentAnElement || !isOffsetParentAnElement && strategy !== 'fixed') { - if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) { - scroll = getNodeScroll(offsetParent); - } - if (isHTMLElement(offsetParent)) { - const offsetRect = getBoundingClientRect(offsetParent); - scale = getScale(offsetParent); - offsets.x = offsetRect.x + offsetParent.clientLeft; - offsets.y = offsetRect.y + offsetParent.clientTop; - } - } - return { - width: rect.width * scale.x, - height: rect.height * scale.y, - x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x, - y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y - }; -} -function getWindowScrollBarX(element) { - // If has a CSS width greater than the viewport, then this will be - // incorrect for RTL. - return getBoundingClientRect(getDocumentElement(element)).left + getNodeScroll(element).scrollLeft; -} - -// Gets the entire size of the scrollable document area, even extending outside -// of the `` and `` rect bounds if horizontally scrollable. -function getDocumentRect(element) { - const html = getDocumentElement(element); - const scroll = getNodeScroll(element); - const body = element.ownerDocument.body; - const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth); - const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight); - let x = -scroll.scrollLeft + getWindowScrollBarX(element); - const y = -scroll.scrollTop; - if (getComputedStyle$1(body).direction === 'rtl') { - x += max(html.clientWidth, body.clientWidth) - width; - } - return { - width, - height, - x, - y - }; -} -function getParentNode(node) { - if (getNodeName(node) === 'html') { - return node; - } - const result = - // Step into the shadow DOM of the parent of a slotted node. - node.assignedSlot || - // DOM Element detected. - node.parentNode || - // ShadowRoot detected. - isShadowRoot(node) && node.host || - // Fallback. - getDocumentElement(node); - return isShadowRoot(result) ? result.host : result; -} -function getNearestOverflowAncestor(node) { - const parentNode = getParentNode(node); - if (isLastTraversableNode(parentNode)) { - // `getParentNode` will never return a `Document` due to the fallback - // check, so it's either the or element. - return parentNode.ownerDocument.body; - } - if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) { - return parentNode; - } - return getNearestOverflowAncestor(parentNode); -} -function getOverflowAncestors(node, list) { - var _node$ownerDocument; - if (list === void 0) { - list = []; - } - const scrollableAncestor = getNearestOverflowAncestor(node); - const isBody = scrollableAncestor === ((_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.body); - const win = getWindow(scrollableAncestor); - if (isBody) { - return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : []); - } - return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor)); -} -function getViewportRect(element, strategy) { - const win = getWindow(element); - const html = getDocumentElement(element); - const visualViewport = win.visualViewport; - let width = html.clientWidth; - let height = html.clientHeight; - let x = 0; - let y = 0; - if (visualViewport) { - width = visualViewport.width; - height = visualViewport.height; - const visualViewportBased = isSafari(); - if (!visualViewportBased || visualViewportBased && strategy === 'fixed') { - x = visualViewport.offsetLeft; - y = visualViewport.offsetTop; - } - } - return { - width, - height, - x, - y - }; -} - -// Returns the inner client rect, subtracting scrollbars if present. -function getInnerBoundingClientRect(element, strategy) { - const clientRect = getBoundingClientRect(element, true, strategy === 'fixed'); - const top = clientRect.top + element.clientTop; - const left = clientRect.left + element.clientLeft; - const scale = isHTMLElement(element) ? getScale(element) : { - x: 1, - y: 1 - }; - const width = element.clientWidth * scale.x; - const height = element.clientHeight * scale.y; - const x = left * scale.x; - const y = top * scale.y; - return { - width, - height, - x, - y - }; -} -function getClientRectFromClippingAncestor(element, clippingAncestor, strategy) { - let rect; - if (clippingAncestor === 'viewport') { - rect = getViewportRect(element, strategy); - } else if (clippingAncestor === 'document') { - rect = getDocumentRect(getDocumentElement(element)); - } else if (isElement(clippingAncestor)) { - rect = getInnerBoundingClientRect(clippingAncestor, strategy); - } else { - const visualOffsets = getVisualOffsets(element); - rect = { - ...clippingAncestor, - x: clippingAncestor.x - visualOffsets.x, - y: clippingAncestor.y - visualOffsets.y - }; - } - return (0, _core.rectToClientRect)(rect); -} -function hasFixedPositionAncestor(element, stopNode) { - const parentNode = getParentNode(element); - if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) { - return false; - } - return getComputedStyle$1(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode); -} - -// A "clipping ancestor" is an `overflow` element with the characteristic of -// clipping (or hiding) child elements. This returns all clipping ancestors -// of the given element up the tree. -function getClippingElementAncestors(element, cache) { - const cachedResult = cache.get(element); - if (cachedResult) { - return cachedResult; - } - let result = getOverflowAncestors(element).filter(el => isElement(el) && getNodeName(el) !== 'body'); - let currentContainingBlockComputedStyle = null; - const elementIsFixed = getComputedStyle$1(element).position === 'fixed'; - let currentNode = elementIsFixed ? getParentNode(element) : element; - - // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block - while (isElement(currentNode) && !isLastTraversableNode(currentNode)) { - const computedStyle = getComputedStyle$1(currentNode); - const currentNodeIsContaining = isContainingBlock(currentNode); - if (!currentNodeIsContaining && computedStyle.position === 'fixed') { - currentContainingBlockComputedStyle = null; - } - const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && ['absolute', 'fixed'].includes(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode); - if (shouldDropCurrentNode) { - // Drop non-containing blocks. - result = result.filter(ancestor => ancestor !== currentNode); - } else { - // Record last containing block for next iteration. - currentContainingBlockComputedStyle = computedStyle; - } - currentNode = getParentNode(currentNode); - } - cache.set(element, result); - return result; -} - -// Gets the maximum area that the element is visible in due to any number of -// clipping ancestors. -function getClippingRect(_ref) { - let { - element, - boundary, - rootBoundary, - strategy - } = _ref; - const elementClippingAncestors = boundary === 'clippingAncestors' ? getClippingElementAncestors(element, this._c) : [].concat(boundary); - const clippingAncestors = [...elementClippingAncestors, rootBoundary]; - const firstClippingAncestor = clippingAncestors[0]; - const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => { - const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy); - accRect.top = max(rect.top, accRect.top); - accRect.right = min(rect.right, accRect.right); - accRect.bottom = min(rect.bottom, accRect.bottom); - accRect.left = max(rect.left, accRect.left); - return accRect; - }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy)); - return { - width: clippingRect.right - clippingRect.left, - height: clippingRect.bottom - clippingRect.top, - x: clippingRect.left, - y: clippingRect.top - }; -} -function getDimensions(element) { - return getCssDimensions(element); -} -function getTrueOffsetParent(element, polyfill) { - if (!isHTMLElement(element) || getComputedStyle$1(element).position === 'fixed') { - return null; - } - if (polyfill) { - return polyfill(element); - } - return element.offsetParent; -} -function getContainingBlock(element) { - let currentNode = getParentNode(element); - while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) { - if (isContainingBlock(currentNode)) { - return currentNode; - } else { - currentNode = getParentNode(currentNode); - } - } - return null; -} - -// Gets the closest ancestor positioned element. Handles some edge cases, -// such as table ancestors and cross browser bugs. -function getOffsetParent(element, polyfill) { - const window = getWindow(element); - if (!isHTMLElement(element)) { - return window; - } - let offsetParent = getTrueOffsetParent(element, polyfill); - while (offsetParent && isTableElement(offsetParent) && getComputedStyle$1(offsetParent).position === 'static') { - offsetParent = getTrueOffsetParent(offsetParent, polyfill); - } - if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle$1(offsetParent).position === 'static' && !isContainingBlock(offsetParent))) { - return window; - } - return offsetParent || getContainingBlock(element) || window; -} -function getRectRelativeToOffsetParent(element, offsetParent, strategy) { - const isOffsetParentAnElement = isHTMLElement(offsetParent); - const documentElement = getDocumentElement(offsetParent); - const isFixed = strategy === 'fixed'; - const rect = getBoundingClientRect(element, true, isFixed, offsetParent); - let scroll = { - scrollLeft: 0, - scrollTop: 0 - }; - const offsets = { - x: 0, - y: 0 - }; - if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { - if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) { - scroll = getNodeScroll(offsetParent); - } - if (isHTMLElement(offsetParent)) { - const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent); - offsets.x = offsetRect.x + offsetParent.clientLeft; - offsets.y = offsetRect.y + offsetParent.clientTop; - } else if (documentElement) { - offsets.x = getWindowScrollBarX(documentElement); - } - } - return { - x: rect.left + scroll.scrollLeft - offsets.x, - y: rect.top + scroll.scrollTop - offsets.y, - width: rect.width, - height: rect.height - }; -} -const platform = { - getClippingRect, - convertOffsetParentRelativeRectToViewportRelativeRect, - isElement, - getDimensions, - getOffsetParent, - getDocumentElement, - getScale, - async getElementRects(_ref) { - let { - reference, - floating, - strategy - } = _ref; - const getOffsetParentFn = this.getOffsetParent || getOffsetParent; - const getDimensionsFn = this.getDimensions; - return { - reference: getRectRelativeToOffsetParent(reference, await getOffsetParentFn(floating), strategy), - floating: { - x: 0, - y: 0, - ...(await getDimensionsFn(floating)) - } - }; - }, - getClientRects: element => Array.from(element.getClientRects()), - isRTL: element => getComputedStyle$1(element).direction === 'rtl' -}; - -/** - * Automatically updates the position of the floating element when necessary. - * Should only be called when the floating element is mounted on the DOM or - * visible on the screen. - * @returns cleanup function that should be invoked when the floating element is - * removed from the DOM or hidden from the screen. - * @see https://floating-ui.com/docs/autoUpdate - */ -exports.platform = platform; -function autoUpdate(reference, floating, update, options) { - if (options === void 0) { - options = {}; - } - const { - ancestorScroll = true, - ancestorResize = true, - elementResize = true, - animationFrame = false - } = options; - const ancestors = ancestorScroll || ancestorResize ? [...(isElement(reference) ? getOverflowAncestors(reference) : reference.contextElement ? getOverflowAncestors(reference.contextElement) : []), ...getOverflowAncestors(floating)] : []; - ancestors.forEach(ancestor => { - // ignores Window, checks for [object VisualViewport] - const isVisualViewport = !isElement(ancestor) && ancestor.toString().includes('V'); - if (ancestorScroll && (animationFrame ? isVisualViewport : true)) { - ancestor.addEventListener('scroll', update, { - passive: true - }); - } - ancestorResize && ancestor.addEventListener('resize', update); - }); - let observer = null; - if (elementResize) { - observer = new ResizeObserver(() => { - update(); - }); - isElement(reference) && !animationFrame && observer.observe(reference); - if (!isElement(reference) && reference.contextElement && !animationFrame) { - observer.observe(reference.contextElement); - } - observer.observe(floating); - } - let frameId; - let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null; - if (animationFrame) { - frameLoop(); - } - function frameLoop() { - const nextRefRect = getBoundingClientRect(reference); - if (prevRefRect && (nextRefRect.x !== prevRefRect.x || nextRefRect.y !== prevRefRect.y || nextRefRect.width !== prevRefRect.width || nextRefRect.height !== prevRefRect.height)) { - update(); - } - prevRefRect = nextRefRect; - frameId = requestAnimationFrame(frameLoop); - } - update(); - return () => { - var _observer; - ancestors.forEach(ancestor => { - ancestorScroll && ancestor.removeEventListener('scroll', update); - ancestorResize && ancestor.removeEventListener('resize', update); - }); - (_observer = observer) == null ? void 0 : _observer.disconnect(); - observer = null; - if (animationFrame) { - cancelAnimationFrame(frameId); - } - }; -} - -/** - * Computes the `x` and `y` coordinates that will place the floating element - * next to a reference element when it is given a certain CSS positioning - * strategy. - */ -const computePosition = (reference, floating, options) => { - // This caches the expensive `getClippingElementAncestors` function so that - // multiple lifecycle resets re-use the same result. It only lives for a - // single call. If other functions become expensive, we can add them as well. - const cache = new Map(); - const mergedOptions = { - platform, - ...options - }; - const platformWithCache = { - ...mergedOptions.platform, - _c: cache - }; - return (0, _core.computePosition)(reference, floating, { - ...mergedOptions, - platform: platformWithCache - }); -}; -exports.computePosition = computePosition; - -/***/ }), - -/***/ "../../../node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.esm.js": -/*!**************************************************************************************!*\ - !*** ../../../node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.esm.js ***! - \**************************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.arrow = void 0; -Object.defineProperty(exports, "autoPlacement", ({ - enumerable: true, - get: function () { - return _dom.autoPlacement; - } -})); -Object.defineProperty(exports, "autoUpdate", ({ - enumerable: true, - get: function () { - return _dom.autoUpdate; - } -})); -Object.defineProperty(exports, "computePosition", ({ - enumerable: true, - get: function () { - return _dom.computePosition; - } -})); -Object.defineProperty(exports, "detectOverflow", ({ - enumerable: true, - get: function () { - return _dom.detectOverflow; - } -})); -Object.defineProperty(exports, "flip", ({ - enumerable: true, - get: function () { - return _dom.flip; - } -})); -Object.defineProperty(exports, "getOverflowAncestors", ({ - enumerable: true, - get: function () { - return _dom.getOverflowAncestors; - } -})); -Object.defineProperty(exports, "hide", ({ - enumerable: true, - get: function () { - return _dom.hide; - } -})); -Object.defineProperty(exports, "inline", ({ - enumerable: true, - get: function () { - return _dom.inline; - } -})); -Object.defineProperty(exports, "limitShift", ({ - enumerable: true, - get: function () { - return _dom.limitShift; - } -})); -Object.defineProperty(exports, "offset", ({ - enumerable: true, - get: function () { - return _dom.offset; - } -})); -Object.defineProperty(exports, "platform", ({ - enumerable: true, - get: function () { - return _dom.platform; - } -})); -Object.defineProperty(exports, "shift", ({ - enumerable: true, - get: function () { - return _dom.shift; - } -})); -Object.defineProperty(exports, "size", ({ - enumerable: true, - get: function () { - return _dom.size; - } -})); -exports.useFloating = useFloating; -var _dom = __webpack_require__(/*! @floating-ui/dom */ "../../../node_modules/@floating-ui/dom/dist/floating-ui.dom.esm.js"); -var React = _interopRequireWildcard(__webpack_require__(/*! react */ "react")); -var ReactDOM = _interopRequireWildcard(__webpack_require__(/*! react-dom */ "react-dom")); -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } -/** - * Provides data to position an inner element of the floating element so that it - * appears centered to the reference element. - * This wraps the core `arrow` middleware to allow React refs as the element. - * @see https://floating-ui.com/docs/arrow - */ -const arrow = options => { - function isRef(value) { - return {}.hasOwnProperty.call(value, 'current'); - } - return { - name: 'arrow', - options, - fn(state) { - const { - element, - padding - } = typeof options === 'function' ? options(state) : options; - if (element && isRef(element)) { - if (element.current != null) { - return (0, _dom.arrow)({ - element: element.current, - padding - }).fn(state); - } - return {}; - } else if (element) { - return (0, _dom.arrow)({ - element, - padding - }).fn(state); - } - return {}; - } - }; -}; -exports.arrow = arrow; -var index = typeof document !== 'undefined' ? React.useLayoutEffect : React.useEffect; - -// Fork of `fast-deep-equal` that only does the comparisons we need and compares -// functions -function deepEqual(a, b) { - if (a === b) { - return true; - } - if (typeof a !== typeof b) { - return false; - } - if (typeof a === 'function' && a.toString() === b.toString()) { - return true; - } - let length, i, keys; - if (a && b && typeof a == 'object') { - if (Array.isArray(a)) { - length = a.length; - if (length != b.length) return false; - for (i = length; i-- !== 0;) { - if (!deepEqual(a[i], b[i])) { - return false; - } - } - return true; - } - keys = Object.keys(a); - length = keys.length; - if (length !== Object.keys(b).length) { - return false; - } - for (i = length; i-- !== 0;) { - if (!{}.hasOwnProperty.call(b, keys[i])) { - return false; - } - } - for (i = length; i-- !== 0;) { - const key = keys[i]; - if (key === '_owner' && a.$$typeof) { - continue; - } - if (!deepEqual(a[key], b[key])) { - return false; - } - } - return true; - } - return a !== a && b !== b; -} -function getDPR(element) { - if (typeof window === 'undefined') { - return 1; - } - const win = element.ownerDocument.defaultView || window; - return win.devicePixelRatio || 1; -} -function roundByDPR(element, value) { - const dpr = getDPR(element); - return Math.round(value * dpr) / dpr; -} -function useLatestRef(value) { - const ref = React.useRef(value); - index(() => { - ref.current = value; - }); - return ref; -} - -/** - * Provides data to position a floating element. - * @see https://floating-ui.com/docs/react - */ -function useFloating(options) { - if (options === void 0) { - options = {}; - } - const { - placement = 'bottom', - strategy = 'absolute', - middleware = [], - platform, - elements: { - reference: externalReference, - floating: externalFloating - } = {}, - transform = true, - whileElementsMounted, - open - } = options; - const [data, setData] = React.useState({ - x: 0, - y: 0, - strategy, - placement, - middlewareData: {}, - isPositioned: false - }); - const [latestMiddleware, setLatestMiddleware] = React.useState(middleware); - if (!deepEqual(latestMiddleware, middleware)) { - setLatestMiddleware(middleware); - } - const [_reference, _setReference] = React.useState(null); - const [_floating, _setFloating] = React.useState(null); - const setReference = React.useCallback(node => { - if (node != referenceRef.current) { - referenceRef.current = node; - _setReference(node); - } - }, [_setReference]); - const setFloating = React.useCallback(node => { - if (node !== floatingRef.current) { - floatingRef.current = node; - _setFloating(node); - } - }, [_setFloating]); - const referenceEl = externalReference || _reference; - const floatingEl = externalFloating || _floating; - const referenceRef = React.useRef(null); - const floatingRef = React.useRef(null); - const dataRef = React.useRef(data); - const whileElementsMountedRef = useLatestRef(whileElementsMounted); - const platformRef = useLatestRef(platform); - const update = React.useCallback(() => { - if (!referenceRef.current || !floatingRef.current) { - return; - } - const config = { - placement, - strategy, - middleware: latestMiddleware - }; - if (platformRef.current) { - config.platform = platformRef.current; - } - (0, _dom.computePosition)(referenceRef.current, floatingRef.current, config).then(data => { - const fullData = { - ...data, - isPositioned: true - }; - if (isMountedRef.current && !deepEqual(dataRef.current, fullData)) { - dataRef.current = fullData; - ReactDOM.flushSync(() => { - setData(fullData); - }); - } - }); - }, [latestMiddleware, placement, strategy, platformRef]); - index(() => { - if (open === false && dataRef.current.isPositioned) { - dataRef.current.isPositioned = false; - setData(data => ({ - ...data, - isPositioned: false - })); - } - }, [open]); - const isMountedRef = React.useRef(false); - index(() => { - isMountedRef.current = true; - return () => { - isMountedRef.current = false; - }; - }, []); - index(() => { - if (referenceEl) referenceRef.current = referenceEl; - if (floatingEl) floatingRef.current = floatingEl; - if (referenceEl && floatingEl) { - if (whileElementsMountedRef.current) { - return whileElementsMountedRef.current(referenceEl, floatingEl, update); - } else { - update(); - } - } - }, [referenceEl, floatingEl, update, whileElementsMountedRef]); - const refs = React.useMemo(() => ({ - reference: referenceRef, - floating: floatingRef, - setReference, - setFloating - }), [setReference, setFloating]); - const elements = React.useMemo(() => ({ - reference: referenceEl, - floating: floatingEl - }), [referenceEl, floatingEl]); - const floatingStyles = React.useMemo(() => { - const initialStyles = { - position: strategy, - left: 0, - top: 0 - }; - if (!elements.floating) { - return initialStyles; - } - const x = roundByDPR(elements.floating, data.x); - const y = roundByDPR(elements.floating, data.y); - if (transform) { - return { - ...initialStyles, - transform: "translate(" + x + "px, " + y + "px)", - ...(getDPR(elements.floating) >= 1.5 && { - willChange: 'transform' - }) - }; - } - return { - position: strategy, - left: x, - top: y - }; - }, [strategy, transform, elements.floating, data.x, data.y]); - return React.useMemo(() => ({ - ...data, - update, - refs, - elements, - floatingStyles - }), [data, update, refs, elements, floatingStyles]); -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/animation/dist/Animation.es.js": -/*!***********************************************************************!*\ - !*** ../../../node_modules/@motionone/animation/dist/Animation.es.js ***! - \***********************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.Animation = void 0; -var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); -var _easingEs = __webpack_require__(/*! ./utils/easing.es.js */ "../../../node_modules/@motionone/animation/dist/utils/easing.es.js"); -class Animation { - constructor(output) { - let keyframes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [0, 1]; - let { - easing, - duration: initialDuration = _utils.defaults.duration, - delay = _utils.defaults.delay, - endDelay = _utils.defaults.endDelay, - repeat = _utils.defaults.repeat, - offset, - direction = "normal" - } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - this.startTime = null; - this.rate = 1; - this.t = 0; - this.cancelTimestamp = null; - this.easing = _utils.noopReturn; - this.duration = 0; - this.totalDuration = 0; - this.repeat = 0; - this.playState = "idle"; - this.finished = new Promise((resolve, reject) => { - this.resolve = resolve; - this.reject = reject; - }); - easing = easing || _utils.defaults.easing; - if ((0, _utils.isEasingGenerator)(easing)) { - const custom = easing.createAnimation(keyframes); - easing = custom.easing; - keyframes = custom.keyframes || keyframes; - initialDuration = custom.duration || initialDuration; - } - this.repeat = repeat; - this.easing = (0, _utils.isEasingList)(easing) ? _utils.noopReturn : (0, _easingEs.getEasingFunction)(easing); - this.updateDuration(initialDuration); - const interpolate$1 = (0, _utils.interpolate)(keyframes, offset, (0, _utils.isEasingList)(easing) ? easing.map(_easingEs.getEasingFunction) : _utils.noopReturn); - this.tick = timestamp => { - var _a; - // TODO: Temporary fix for OptionsResolver typing - delay = delay; - let t = 0; - if (this.pauseTime !== undefined) { - t = this.pauseTime; - } else { - t = (timestamp - this.startTime) * this.rate; - } - this.t = t; - // Convert to seconds - t /= 1000; - // Rebase on delay - t = Math.max(t - delay, 0); - /** - * If this animation has finished, set the current time - * to the total duration. - */ - if (this.playState === "finished" && this.pauseTime === undefined) { - t = this.totalDuration; - } - /** - * Get the current progress (0-1) of the animation. If t is > - * than duration we'll get values like 2.5 (midway through the - * third iteration) - */ - const progress = t / this.duration; - // TODO progress += iterationStart - /** - * Get the current iteration (0 indexed). For instance the floor of - * 2.5 is 2. - */ - let currentIteration = Math.floor(progress); - /** - * Get the current progress of the iteration by taking the remainder - * so 2.5 is 0.5 through iteration 2 - */ - let iterationProgress = progress % 1.0; - if (!iterationProgress && progress >= 1) { - iterationProgress = 1; - } - /** - * If iteration progress is 1 we count that as the end - * of the previous iteration. - */ - iterationProgress === 1 && currentIteration--; - /** - * Reverse progress if we're not running in "normal" direction - */ - const iterationIsOdd = currentIteration % 2; - if (direction === "reverse" || direction === "alternate" && iterationIsOdd || direction === "alternate-reverse" && !iterationIsOdd) { - iterationProgress = 1 - iterationProgress; - } - const p = t >= this.totalDuration ? 1 : Math.min(iterationProgress, 1); - const latest = interpolate$1(this.easing(p)); - output(latest); - const isAnimationFinished = this.pauseTime === undefined && (this.playState === "finished" || t >= this.totalDuration + endDelay); - if (isAnimationFinished) { - this.playState = "finished"; - (_a = this.resolve) === null || _a === void 0 ? void 0 : _a.call(this, latest); - } else if (this.playState !== "idle") { - this.frameRequestId = requestAnimationFrame(this.tick); - } - }; - this.play(); - } - play() { - const now = performance.now(); - this.playState = "running"; - if (this.pauseTime !== undefined) { - this.startTime = now - this.pauseTime; - } else if (!this.startTime) { - this.startTime = now; - } - this.cancelTimestamp = this.startTime; - this.pauseTime = undefined; - this.frameRequestId = requestAnimationFrame(this.tick); - } - pause() { - this.playState = "paused"; - this.pauseTime = this.t; - } - finish() { - this.playState = "finished"; - this.tick(0); - } - stop() { - var _a; - this.playState = "idle"; - if (this.frameRequestId !== undefined) { - cancelAnimationFrame(this.frameRequestId); - } - (_a = this.reject) === null || _a === void 0 ? void 0 : _a.call(this, false); - } - cancel() { - this.stop(); - this.tick(this.cancelTimestamp); - } - reverse() { - this.rate *= -1; - } - commitStyles() {} - updateDuration(duration) { - this.duration = duration; - this.totalDuration = duration * (this.repeat + 1); - } - get currentTime() { - return this.t; - } - set currentTime(t) { - if (this.pauseTime !== undefined || this.rate === 0) { - this.pauseTime = t; - } else { - this.startTime = performance.now() - t / this.rate; - } - } - get playbackRate() { - return this.rate; - } - set playbackRate(rate) { - this.rate = rate; - } -} -exports.Animation = Animation; - -/***/ }), - -/***/ "../../../node_modules/@motionone/animation/dist/index.es.js": -/*!*******************************************************************!*\ - !*** ../../../node_modules/@motionone/animation/dist/index.es.js ***! - \*******************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -Object.defineProperty(exports, "Animation", ({ - enumerable: true, - get: function () { - return _AnimationEs.Animation; - } -})); -Object.defineProperty(exports, "getEasingFunction", ({ - enumerable: true, - get: function () { - return _easingEs.getEasingFunction; - } -})); -var _AnimationEs = __webpack_require__(/*! ./Animation.es.js */ "../../../node_modules/@motionone/animation/dist/Animation.es.js"); -var _easingEs = __webpack_require__(/*! ./utils/easing.es.js */ "../../../node_modules/@motionone/animation/dist/utils/easing.es.js"); - -/***/ }), - -/***/ "../../../node_modules/@motionone/animation/dist/utils/easing.es.js": -/*!**************************************************************************!*\ - !*** ../../../node_modules/@motionone/animation/dist/utils/easing.es.js ***! - \**************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.getEasingFunction = getEasingFunction; -var _easing = __webpack_require__(/*! @motionone/easing */ "../../../node_modules/@motionone/easing/dist/index.es.js"); -var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); -const namedEasings = { - ease: (0, _easing.cubicBezier)(0.25, 0.1, 0.25, 1.0), - "ease-in": (0, _easing.cubicBezier)(0.42, 0.0, 1.0, 1.0), - "ease-in-out": (0, _easing.cubicBezier)(0.42, 0.0, 0.58, 1.0), - "ease-out": (0, _easing.cubicBezier)(0.0, 0.0, 0.58, 1.0) -}; -const functionArgsRegex = /\((.*?)\)/; -function getEasingFunction(definition) { - // If already an easing function, return - if ((0, _utils.isFunction)(definition)) return definition; - // If an easing curve definition, return bezier function - if ((0, _utils.isCubicBezier)(definition)) return (0, _easing.cubicBezier)(...definition); - // If we have a predefined easing function, return - if (namedEasings[definition]) return namedEasings[definition]; - // If this is a steps function, attempt to create easing curve - if (definition.startsWith("steps")) { - const args = functionArgsRegex.exec(definition); - if (args) { - const argsArray = args[1].split(","); - return (0, _easing.steps)(parseFloat(argsArray[0]), argsArray[1].trim()); - } - } - return _utils.noopReturn; -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/animate/animate-style.es.js": -/*!*****************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/animate/animate-style.es.js ***! - \*****************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.animateStyle = animateStyle; -var _dataEs = __webpack_require__(/*! ./data.es.js */ "../../../node_modules/@motionone/dom/dist/animate/data.es.js"); -var _cssVarEs = __webpack_require__(/*! ./utils/css-var.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/css-var.es.js"); -var _animation = __webpack_require__(/*! @motionone/animation */ "../../../node_modules/@motionone/animation/dist/index.es.js"); -var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); -var _transformsEs = __webpack_require__(/*! ./utils/transforms.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/transforms.es.js"); -var _easingEs = __webpack_require__(/*! ./utils/easing.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/easing.es.js"); -var _featureDetectionEs = __webpack_require__(/*! ./utils/feature-detection.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/feature-detection.es.js"); -var _keyframesEs = __webpack_require__(/*! ./utils/keyframes.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/keyframes.es.js"); -var _styleEs = __webpack_require__(/*! ./style.es.js */ "../../../node_modules/@motionone/dom/dist/animate/style.es.js"); -var _getStyleNameEs = __webpack_require__(/*! ./utils/get-style-name.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/get-style-name.es.js"); -var _stopAnimationEs = __webpack_require__(/*! ./utils/stop-animation.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/stop-animation.es.js"); -function getDevToolsRecord() { - return window.__MOTION_DEV_TOOLS_RECORD; -} -function animateStyle(element, key, keyframesDefinition) { - let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; - const record = getDevToolsRecord(); - const isRecording = options.record !== false && record; - let animation; - let { - duration = _utils.defaults.duration, - delay = _utils.defaults.delay, - endDelay = _utils.defaults.endDelay, - repeat = _utils.defaults.repeat, - easing = _utils.defaults.easing, - direction, - offset, - allowWebkitAcceleration = false - } = options; - const data = (0, _dataEs.getAnimationData)(element); - let canAnimateNatively = _featureDetectionEs.supports.waapi(); - const valueIsTransform = (0, _transformsEs.isTransform)(key); - /** - * If this is an individual transform, we need to map its - * key to a CSS variable and update the element's transform style - */ - valueIsTransform && (0, _transformsEs.addTransformToElement)(element, key); - const name = (0, _getStyleNameEs.getStyleName)(key); - const motionValue = (0, _dataEs.getMotionValue)(data.values, name); - /** - * Get definition of value, this will be used to convert numerical - * keyframes into the default value type. - */ - const definition = _transformsEs.transformDefinitions.get(name); - /** - * Stop the current animation, if any. Because this will trigger - * commitStyles (DOM writes) and we might later trigger DOM reads, - * this is fired now and we return a factory function to create - * the actual animation that can get called in batch, - */ - (0, _stopAnimationEs.stopAnimation)(motionValue.animation, !((0, _utils.isEasingGenerator)(easing) && motionValue.generator) && options.record !== false); - /** - * Batchable factory function containing all DOM reads. - */ - return () => { - const readInitialValue = () => { - var _a, _b; - return (_b = (_a = _styleEs.style.get(element, name)) !== null && _a !== void 0 ? _a : definition === null || definition === void 0 ? void 0 : definition.initialValue) !== null && _b !== void 0 ? _b : 0; - }; - /** - * Replace null values with the previous keyframe value, or read - * it from the DOM if it's the first keyframe. - */ - let keyframes = (0, _keyframesEs.hydrateKeyframes)((0, _keyframesEs.keyframesList)(keyframesDefinition), readInitialValue); - if ((0, _utils.isEasingGenerator)(easing)) { - const custom = easing.createAnimation(keyframes, readInitialValue, valueIsTransform, name, motionValue); - easing = custom.easing; - if (custom.keyframes !== undefined) keyframes = custom.keyframes; - if (custom.duration !== undefined) duration = custom.duration; - } - /** - * If this is a CSS variable we need to register it with the browser - * before it can be animated natively. We also set it with setProperty - * rather than directly onto the element.style object. - */ - if ((0, _cssVarEs.isCssVar)(name)) { - if (_featureDetectionEs.supports.cssRegisterProperty()) { - (0, _cssVarEs.registerCssVariable)(name); - } else { - canAnimateNatively = false; - } - } - /** - * If we can animate this value with WAAPI, do so. Currently this only - * feature detects CSS.registerProperty but could check WAAPI too. - */ - if (canAnimateNatively) { - /** - * Convert numbers to default value types. Currently this only supports - * transforms but it could also support other value types. - */ - if (definition) { - keyframes = keyframes.map(value => (0, _utils.isNumber)(value) ? definition.toDefaultUnit(value) : value); - } - /** - * If this browser doesn't support partial/implicit keyframes we need to - * explicitly provide one. - */ - if (keyframes.length === 1 && (!_featureDetectionEs.supports.partialKeyframes() || isRecording)) { - keyframes.unshift(readInitialValue()); - } - const animationOptions = { - delay: _utils.time.ms(delay), - duration: _utils.time.ms(duration), - endDelay: _utils.time.ms(endDelay), - easing: !(0, _utils.isEasingList)(easing) ? (0, _easingEs.convertEasing)(easing) : undefined, - direction, - iterations: repeat + 1, - fill: "both" - }; - animation = element.animate({ - [name]: keyframes, - offset, - easing: (0, _utils.isEasingList)(easing) ? easing.map(_easingEs.convertEasing) : undefined - }, animationOptions); - /** - * Polyfill finished Promise in browsers that don't support it - */ - if (!animation.finished) { - animation.finished = new Promise((resolve, reject) => { - animation.onfinish = resolve; - animation.oncancel = reject; - }); - } - const target = keyframes[keyframes.length - 1]; - animation.finished.then(() => { - // Apply styles to target - _styleEs.style.set(element, name, target); - // Ensure fill modes don't persist - animation.cancel(); - }).catch(_utils.noop); - /** - * This forces Webkit to run animations on the main thread by exploiting - * this condition: - * https://trac.webkit.org/browser/webkit/trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp?rev=281238#L1099 - * - * This fixes Webkit's timing bugs, like accelerated animations falling - * out of sync with main thread animations and massive delays in starting - * accelerated animations in WKWebView. - */ - if (!allowWebkitAcceleration) animation.playbackRate = 1.000001; - /** - * If we can't animate the value natively then we can fallback to the numbers-only - * polyfill for transforms. - */ - } else if (valueIsTransform) { - /** - * If any keyframe is a string (because we measured it from the DOM), we need to convert - * it into a number before passing to the Animation polyfill. - */ - keyframes = keyframes.map(value => typeof value === "string" ? parseFloat(value) : value); - /** - * If we only have a single keyframe, we need to create an initial keyframe by reading - * the current value from the DOM. - */ - if (keyframes.length === 1) { - keyframes.unshift(parseFloat(readInitialValue())); - } - const render = latest => { - if (definition) latest = definition.toDefaultUnit(latest); - _styleEs.style.set(element, name, latest); - }; - animation = new _animation.Animation(render, keyframes, Object.assign(Object.assign({}, options), { - duration, - easing - })); - } else { - const target = keyframes[keyframes.length - 1]; - _styleEs.style.set(element, name, definition && (0, _utils.isNumber)(target) ? definition.toDefaultUnit(target) : target); - } - if (isRecording) { - record(element, key, keyframes, { - duration, - delay: delay, - easing, - repeat, - offset - }, "motion-one"); - } - motionValue.setAnimation(animation); - return animation; - }; -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/animate/data.es.js": -/*!********************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/animate/data.es.js ***! - \********************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.getAnimationData = getAnimationData; -exports.getMotionValue = getMotionValue; -var _types = __webpack_require__(/*! @motionone/types */ "../../../node_modules/@motionone/types/dist/index.es.js"); -const data = new WeakMap(); -function getAnimationData(element) { - if (!data.has(element)) { - data.set(element, { - transforms: [], - values: new Map() - }); - } - return data.get(element); -} -function getMotionValue(motionValues, name) { - if (!motionValues.has(name)) { - motionValues.set(name, new _types.MotionValue()); - } - return motionValues.get(name); -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/animate/index.es.js": -/*!*********************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/animate/index.es.js ***! - \*********************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.animate = animate; -var _animateStyleEs = __webpack_require__(/*! ./animate-style.es.js */ "../../../node_modules/@motionone/dom/dist/animate/animate-style.es.js"); -var _optionsEs = __webpack_require__(/*! ./utils/options.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/options.es.js"); -var _resolveElementsEs = __webpack_require__(/*! ../utils/resolve-elements.es.js */ "../../../node_modules/@motionone/dom/dist/utils/resolve-elements.es.js"); -var _controlsEs = __webpack_require__(/*! ./utils/controls.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/controls.es.js"); -var _staggerEs = __webpack_require__(/*! ../utils/stagger.es.js */ "../../../node_modules/@motionone/dom/dist/utils/stagger.es.js"); -function animate(elements, keyframes) { - let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - elements = (0, _resolveElementsEs.resolveElements)(elements); - const numElements = elements.length; - /** - * Create and start new animations - */ - const animationFactories = []; - for (let i = 0; i < numElements; i++) { - const element = elements[i]; - for (const key in keyframes) { - const valueOptions = (0, _optionsEs.getOptions)(options, key); - valueOptions.delay = (0, _staggerEs.resolveOption)(valueOptions.delay, i, numElements); - const animation = (0, _animateStyleEs.animateStyle)(element, key, keyframes[key], valueOptions); - animationFactories.push(animation); - } - } - return (0, _controlsEs.withControls)(animationFactories, options, - /** - * TODO: - * If easing is set to spring or glide, duration will be dynamically - * generated. Ideally we would dynamically generate this from - * animation.effect.getComputedTiming().duration but this isn't - * supported in iOS13 or our number polyfill. Perhaps it's possible - * to Proxy animations returned from animateStyle that has duration - * as a getter. - */ - options.duration); -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/animate/style.es.js": -/*!*********************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/animate/style.es.js ***! - \*********************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.style = void 0; -var _cssVarEs = __webpack_require__(/*! ./utils/css-var.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/css-var.es.js"); -var _getStyleNameEs = __webpack_require__(/*! ./utils/get-style-name.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/get-style-name.es.js"); -var _transformsEs = __webpack_require__(/*! ./utils/transforms.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/transforms.es.js"); -const style = { - get: (element, name) => { - name = (0, _getStyleNameEs.getStyleName)(name); - let value = (0, _cssVarEs.isCssVar)(name) ? element.style.getPropertyValue(name) : getComputedStyle(element)[name]; - if (!value && value !== 0) { - const definition = _transformsEs.transformDefinitions.get(name); - if (definition) value = definition.initialValue; - } - return value; - }, - set: (element, name, value) => { - name = (0, _getStyleNameEs.getStyleName)(name); - if ((0, _cssVarEs.isCssVar)(name)) { - element.style.setProperty(name, value); - } else { - element.style[name] = value; - } - } -}; -exports.style = style; - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/animate/utils/controls.es.js": -/*!******************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/animate/utils/controls.es.js ***! - \******************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.withControls = exports.controls = void 0; -var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); -var _stopAnimationEs = __webpack_require__(/*! ./stop-animation.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/stop-animation.es.js"); -const createAnimation = factory => factory(); -const withControls = function (animationFactory, options) { - let duration = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _utils.defaults.duration; - return new Proxy({ - animations: animationFactory.map(createAnimation).filter(Boolean), - duration, - options - }, controls); -}; -/** - * TODO: - * Currently this returns the first animation, ideally it would return - * the first active animation. - */ -exports.withControls = withControls; -const getActiveAnimation = state => state.animations[0]; -const controls = { - get: (target, key) => { - const activeAnimation = getActiveAnimation(target); - switch (key) { - case "duration": - return target.duration; - case "currentTime": - return _utils.time.s((activeAnimation === null || activeAnimation === void 0 ? void 0 : activeAnimation[key]) || 0); - case "playbackRate": - case "playState": - return activeAnimation === null || activeAnimation === void 0 ? void 0 : activeAnimation[key]; - case "finished": - if (!target.finished) { - target.finished = Promise.all(target.animations.map(selectFinished)).catch(_utils.noop); - } - return target.finished; - case "stop": - return () => { - target.animations.forEach(animation => (0, _stopAnimationEs.stopAnimation)(animation)); - }; - case "forEachNative": - /** - * This is for internal use only, fire a callback for each - * underlying animation. - */ - return callback => { - target.animations.forEach(animation => callback(animation, target)); - }; - default: - return typeof (activeAnimation === null || activeAnimation === void 0 ? void 0 : activeAnimation[key]) === "undefined" ? undefined : () => target.animations.forEach(animation => animation[key]()); - } - }, - set: (target, key, value) => { - switch (key) { - case "currentTime": - value = _utils.time.ms(value); - case "currentTime": - case "playbackRate": - for (let i = 0; i < target.animations.length; i++) { - target.animations[i][key] = value; - } - return true; - } - return false; - } -}; -exports.controls = controls; -const selectFinished = animation => animation.finished; - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/animate/utils/css-var.es.js": -/*!*****************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/animate/utils/css-var.es.js ***! - \*****************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.isCssVar = void 0; -exports.registerCssVariable = registerCssVariable; -exports.registeredProperties = void 0; -var _transformsEs = __webpack_require__(/*! ./transforms.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/transforms.es.js"); -const isCssVar = name => name.startsWith("--"); -exports.isCssVar = isCssVar; -const registeredProperties = new Set(); -exports.registeredProperties = registeredProperties; -function registerCssVariable(name) { - if (registeredProperties.has(name)) return; - registeredProperties.add(name); - try { - const { - syntax, - initialValue - } = _transformsEs.transformDefinitions.has(name) ? _transformsEs.transformDefinitions.get(name) : {}; - CSS.registerProperty({ - name, - inherits: false, - syntax, - initialValue - }); - } catch (e) {} -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/animate/utils/easing.es.js": -/*!****************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/animate/utils/easing.es.js ***! - \****************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.cubicBezierAsString = exports.convertEasing = void 0; -var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); -const convertEasing = easing => (0, _utils.isCubicBezier)(easing) ? cubicBezierAsString(easing) : easing; -exports.convertEasing = convertEasing; -const cubicBezierAsString = _ref => { - let [a, b, c, d] = _ref; - return `cubic-bezier(${a}, ${b}, ${c}, ${d})`; -}; -exports.cubicBezierAsString = cubicBezierAsString; - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/animate/utils/feature-detection.es.js": -/*!***************************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/animate/utils/feature-detection.es.js ***! - \***************************************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.supports = void 0; -const testAnimation = keyframes => document.createElement("div").animate(keyframes, { - duration: 0.001 -}); -const featureTests = { - cssRegisterProperty: () => typeof CSS !== "undefined" && Object.hasOwnProperty.call(CSS, "registerProperty"), - waapi: () => Object.hasOwnProperty.call(Element.prototype, "animate"), - partialKeyframes: () => { - try { - testAnimation({ - opacity: [1] - }); - } catch (e) { - return false; - } - return true; - }, - finished: () => Boolean(testAnimation({ - opacity: [0, 1] - }).finished) -}; -const results = {}; -const supports = {}; -exports.supports = supports; -for (const key in featureTests) { - supports[key] = () => { - if (results[key] === undefined) results[key] = featureTests[key](); - return results[key]; - }; -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/animate/utils/get-style-name.es.js": -/*!************************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/animate/utils/get-style-name.es.js ***! - \************************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.getStyleName = getStyleName; -var _transformsEs = __webpack_require__(/*! ./transforms.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/transforms.es.js"); -function getStyleName(key) { - if (_transformsEs.transformAlias[key]) key = _transformsEs.transformAlias[key]; - return (0, _transformsEs.isTransform)(key) ? (0, _transformsEs.asTransformCssVar)(key) : key; -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/animate/utils/keyframes.es.js": -/*!*******************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/animate/utils/keyframes.es.js ***! - \*******************************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.hydrateKeyframes = hydrateKeyframes; -exports.keyframesList = void 0; -function hydrateKeyframes(keyframes, readInitialValue) { - for (let i = 0; i < keyframes.length; i++) { - if (keyframes[i] === null) { - keyframes[i] = i ? keyframes[i - 1] : readInitialValue(); - } - } - return keyframes; -} -const keyframesList = keyframes => Array.isArray(keyframes) ? keyframes : [keyframes]; -exports.keyframesList = keyframesList; - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/animate/utils/options.es.js": -/*!*****************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/animate/utils/options.es.js ***! - \*****************************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.getOptions = void 0; -const getOptions = (options, key) => -/** - * TODO: Make test for this - * Always return a new object otherwise delay is overwritten by results of stagger - * and this results in no stagger - */ -options[key] ? Object.assign(Object.assign({}, options), options[key]) : Object.assign({}, options); -exports.getOptions = getOptions; - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/animate/utils/stop-animation.es.js": -/*!************************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/animate/utils/stop-animation.es.js ***! - \************************************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.stopAnimation = stopAnimation; -function stopAnimation(animation) { - let needsCommit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; - if (!animation || animation.playState === "finished") return; - // Suppress error thrown by WAAPI - try { - if (animation.stop) { - animation.stop(); - } else { - needsCommit && animation.commitStyles(); - animation.cancel(); - } - } catch (e) {} -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/animate/utils/style-object.es.js": -/*!**********************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/animate/utils/style-object.es.js ***! - \**********************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.createStyles = createStyles; -var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); -var _transformsEs = __webpack_require__(/*! ./transforms.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/transforms.es.js"); -function createStyles(keyframes) { - const initialKeyframes = {}; - const transformKeys = []; - for (let key in keyframes) { - const value = keyframes[key]; - if ((0, _transformsEs.isTransform)(key)) { - if (_transformsEs.transformAlias[key]) key = _transformsEs.transformAlias[key]; - transformKeys.push(key); - key = (0, _transformsEs.asTransformCssVar)(key); - } - let initialKeyframe = Array.isArray(value) ? value[0] : value; - /** - * If this is a number and we have a default value type, convert the number - * to this type. - */ - const definition = _transformsEs.transformDefinitions.get(key); - if (definition) { - initialKeyframe = (0, _utils.isNumber)(value) ? definition.toDefaultUnit(value) : value; - } - initialKeyframes[key] = initialKeyframe; - } - if (transformKeys.length) { - initialKeyframes.transform = (0, _transformsEs.buildTransformTemplate)(transformKeys); - } - return initialKeyframes; -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/animate/utils/style-string.es.js": -/*!**********************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/animate/utils/style-string.es.js ***! - \**********************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.createStyleString = createStyleString; -var _styleObjectEs = __webpack_require__(/*! ./style-object.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/style-object.es.js"); -const camelLetterToPipeLetter = letter => `-${letter.toLowerCase()}`; -const camelToPipeCase = str => str.replace(/[A-Z]/g, camelLetterToPipeLetter); -function createStyleString() { - let target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - const styles = (0, _styleObjectEs.createStyles)(target); - let style = ""; - for (const key in styles) { - style += key.startsWith("--") ? key : camelToPipeCase(key); - style += `: ${styles[key]}; `; - } - return style; -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/animate/utils/transforms.es.js": -/*!********************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/animate/utils/transforms.es.js ***! - \********************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.transformDefinitions = exports.transformAlias = exports.isTransform = exports.compareTransformOrder = exports.buildTransformTemplate = exports.axes = exports.asTransformCssVar = exports.addTransformToElement = void 0; -var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); -var _dataEs = __webpack_require__(/*! ../data.es.js */ "../../../node_modules/@motionone/dom/dist/animate/data.es.js"); -/** - * A list of all transformable axes. We'll use this list to generated a version - * of each axes for each transform. - */ -const axes = ["", "X", "Y", "Z"]; -/** - * An ordered array of each transformable value. By default, transform values - * will be sorted to this order. - */ -exports.axes = axes; -const order = ["translate", "scale", "rotate", "skew"]; -const transformAlias = { - x: "translateX", - y: "translateY", - z: "translateZ" -}; -exports.transformAlias = transformAlias; -const rotation = { - syntax: "", - initialValue: "0deg", - toDefaultUnit: v => v + "deg" -}; -const baseTransformProperties = { - translate: { - syntax: "", - initialValue: "0px", - toDefaultUnit: v => v + "px" - }, - rotate: rotation, - scale: { - syntax: "", - initialValue: 1, - toDefaultUnit: _utils.noopReturn - }, - skew: rotation -}; -const transformDefinitions = new Map(); -exports.transformDefinitions = transformDefinitions; -const asTransformCssVar = name => `--motion-${name}`; -/** - * Generate a list of every possible transform key - */ -exports.asTransformCssVar = asTransformCssVar; -const transforms = ["x", "y", "z"]; -order.forEach(name => { - axes.forEach(axis => { - transforms.push(name + axis); - transformDefinitions.set(asTransformCssVar(name + axis), baseTransformProperties[name]); - }); -}); -/** - * A function to use with Array.sort to sort transform keys by their default order. - */ -const compareTransformOrder = (a, b) => transforms.indexOf(a) - transforms.indexOf(b); -/** - * Provide a quick way to check if a string is the name of a transform - */ -exports.compareTransformOrder = compareTransformOrder; -const transformLookup = new Set(transforms); -const isTransform = name => transformLookup.has(name); -exports.isTransform = isTransform; -const addTransformToElement = (element, name) => { - // Map x to translateX etc - if (transformAlias[name]) name = transformAlias[name]; - const { - transforms - } = (0, _dataEs.getAnimationData)(element); - (0, _utils.addUniqueItem)(transforms, name); - /** - * TODO: An optimisation here could be to cache the transform in element data - * and only update if this has changed. - */ - element.style.transform = buildTransformTemplate(transforms); -}; -exports.addTransformToElement = addTransformToElement; -const buildTransformTemplate = transforms => transforms.sort(compareTransformOrder).reduce(transformListToString, "").trim(); -exports.buildTransformTemplate = buildTransformTemplate; -const transformListToString = (template, name) => `${template} ${name}(var(${asTransformCssVar(name)}))`; - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/easing/create-generator-easing.es.js": -/*!**************************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/easing/create-generator-easing.es.js ***! - \**************************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.createGeneratorEasing = createGeneratorEasing; -var _generators = __webpack_require__(/*! @motionone/generators */ "../../../node_modules/@motionone/generators/dist/index.es.js"); -function createGeneratorEasing(createGenerator) { - const keyframesCache = new WeakMap(); - return function () { - let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - const generatorCache = new Map(); - const getGenerator = function () { - let from = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; - let to = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100; - let velocity = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; - let isScale = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; - const key = `${from}-${to}-${velocity}-${isScale}`; - if (!generatorCache.has(key)) { - generatorCache.set(key, createGenerator(Object.assign({ - from, - to, - velocity, - restSpeed: isScale ? 0.05 : 2, - restDistance: isScale ? 0.01 : 0.5 - }, options))); - } - return generatorCache.get(key); - }; - const getKeyframes = generator => { - if (!keyframesCache.has(generator)) { - keyframesCache.set(generator, (0, _generators.pregenerateKeyframes)(generator)); - } - return keyframesCache.get(generator); - }; - return { - createAnimation: (keyframes, getOrigin, canUseGenerator, name, motionValue) => { - var _a, _b; - let settings; - const numKeyframes = keyframes.length; - let shouldUseGenerator = canUseGenerator && numKeyframes <= 2 && keyframes.every(isNumberOrNull); - if (shouldUseGenerator) { - const target = keyframes[numKeyframes - 1]; - const unresolvedOrigin = numKeyframes === 1 ? null : keyframes[0]; - let velocity = 0; - let origin = 0; - const prevGenerator = motionValue === null || motionValue === void 0 ? void 0 : motionValue.generator; - if (prevGenerator) { - /** - * If we have a generator for this value we can use it to resolve - * the animations's current value and velocity. - */ - const { - animation, - generatorStartTime - } = motionValue; - const startTime = (animation === null || animation === void 0 ? void 0 : animation.startTime) || generatorStartTime || 0; - const currentTime = (animation === null || animation === void 0 ? void 0 : animation.currentTime) || performance.now() - startTime; - const prevGeneratorCurrent = prevGenerator(currentTime).current; - origin = (_a = unresolvedOrigin) !== null && _a !== void 0 ? _a : prevGeneratorCurrent; - if (numKeyframes === 1 || numKeyframes === 2 && keyframes[0] === null) { - velocity = (0, _generators.calcGeneratorVelocity)(t => prevGenerator(t).current, currentTime, prevGeneratorCurrent); - } - } else { - origin = (_b = unresolvedOrigin) !== null && _b !== void 0 ? _b : parseFloat(getOrigin()); - } - const generator = getGenerator(origin, target, velocity, name === null || name === void 0 ? void 0 : name.includes("scale")); - const keyframesMetadata = getKeyframes(generator); - settings = Object.assign(Object.assign({}, keyframesMetadata), { - easing: "linear" - }); - // TODO Add test for this - if (motionValue) { - motionValue.generator = generator; - motionValue.generatorStartTime = performance.now(); - } - } else { - const keyframesMetadata = getKeyframes(getGenerator(0, 100)); - settings = { - easing: "ease", - duration: keyframesMetadata.overshootDuration - }; - } - return settings; - } - }; - }; -} -const isNumberOrNull = value => typeof value !== "string"; - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/easing/glide/index.es.js": -/*!**************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/easing/glide/index.es.js ***! - \**************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.glide = void 0; -var _generators = __webpack_require__(/*! @motionone/generators */ "../../../node_modules/@motionone/generators/dist/index.es.js"); -var _createGeneratorEasingEs = __webpack_require__(/*! ../create-generator-easing.es.js */ "../../../node_modules/@motionone/dom/dist/easing/create-generator-easing.es.js"); -const glide = (0, _createGeneratorEasingEs.createGeneratorEasing)(_generators.glide); -exports.glide = glide; - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/easing/spring/index.es.js": -/*!***************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/easing/spring/index.es.js ***! - \***************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.spring = void 0; -var _generators = __webpack_require__(/*! @motionone/generators */ "../../../node_modules/@motionone/generators/dist/index.es.js"); -var _createGeneratorEasingEs = __webpack_require__(/*! ../create-generator-easing.es.js */ "../../../node_modules/@motionone/dom/dist/easing/create-generator-easing.es.js"); -const spring = (0, _createGeneratorEasingEs.createGeneratorEasing)(_generators.spring); -exports.spring = spring; - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/gestures/in-view.es.js": -/*!************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/gestures/in-view.es.js ***! - \************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.inView = inView; -var _resolveElementsEs = __webpack_require__(/*! ../utils/resolve-elements.es.js */ "../../../node_modules/@motionone/dom/dist/utils/resolve-elements.es.js"); -const thresholds = { - any: 0, - all: 1 -}; -function inView(elementOrSelector, onStart) { - let { - root, - margin: rootMargin, - amount = "any" - } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - /** - * If this browser doesn't support IntersectionObserver, return a dummy stop function. - * Default triggering of onStart is tricky - it could be used for starting/stopping - * videos, lazy loading content etc. We could provide an option to enable a fallback, or - * provide a fallback callback option. - */ - if (typeof IntersectionObserver === "undefined") { - return () => {}; - } - const elements = (0, _resolveElementsEs.resolveElements)(elementOrSelector); - const activeIntersections = new WeakMap(); - const onIntersectionChange = entries => { - entries.forEach(entry => { - const onEnd = activeIntersections.get(entry.target); - /** - * If there's no change to the intersection, we don't need to - * do anything here. - */ - if (entry.isIntersecting === Boolean(onEnd)) return; - if (entry.isIntersecting) { - const newOnEnd = onStart(entry); - if (typeof newOnEnd === "function") { - activeIntersections.set(entry.target, newOnEnd); - } else { - observer.unobserve(entry.target); - } - } else if (onEnd) { - onEnd(entry); - activeIntersections.delete(entry.target); - } - }); - }; - const observer = new IntersectionObserver(onIntersectionChange, { - root, - rootMargin, - threshold: typeof amount === "number" ? amount : thresholds[amount] - }); - elements.forEach(element => observer.observe(element)); - return () => observer.disconnect(); -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/gestures/resize/handle-element.es.js": -/*!**************************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/gestures/resize/handle-element.es.js ***! - \**************************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.resizeElement = resizeElement; -var _resolveElementsEs = __webpack_require__(/*! ../../utils/resolve-elements.es.js */ "../../../node_modules/@motionone/dom/dist/utils/resolve-elements.es.js"); -const resizeHandlers = new WeakMap(); -let observer; -function getElementSize(target, borderBoxSize) { - if (borderBoxSize) { - const { - inlineSize, - blockSize - } = borderBoxSize[0]; - return { - width: inlineSize, - height: blockSize - }; - } else if (target instanceof SVGElement && "getBBox" in target) { - return target.getBBox(); - } else { - return { - width: target.offsetWidth, - height: target.offsetHeight - }; - } -} -function notifyTarget(_ref) { - let { - target, - contentRect, - borderBoxSize - } = _ref; - var _a; - (_a = resizeHandlers.get(target)) === null || _a === void 0 ? void 0 : _a.forEach(handler => { - handler({ - target, - contentSize: contentRect, - get size() { - return getElementSize(target, borderBoxSize); - } - }); - }); -} -function notifyAll(entries) { - entries.forEach(notifyTarget); -} -function createResizeObserver() { - if (typeof ResizeObserver === "undefined") return; - observer = new ResizeObserver(notifyAll); -} -function resizeElement(target, handler) { - if (!observer) createResizeObserver(); - const elements = (0, _resolveElementsEs.resolveElements)(target); - elements.forEach(element => { - let elementHandlers = resizeHandlers.get(element); - if (!elementHandlers) { - elementHandlers = new Set(); - resizeHandlers.set(element, elementHandlers); - } - elementHandlers.add(handler); - observer === null || observer === void 0 ? void 0 : observer.observe(element); - }); - return () => { - elements.forEach(element => { - const elementHandlers = resizeHandlers.get(element); - elementHandlers === null || elementHandlers === void 0 ? void 0 : elementHandlers.delete(handler); - if (!(elementHandlers === null || elementHandlers === void 0 ? void 0 : elementHandlers.size)) { - observer === null || observer === void 0 ? void 0 : observer.unobserve(element); - } - }); - }; -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/gestures/resize/handle-window.es.js": -/*!*************************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/gestures/resize/handle-window.es.js ***! - \*************************************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.resizeWindow = resizeWindow; -const windowCallbacks = new Set(); -let windowResizeHandler; -function createWindowResizeHandler() { - windowResizeHandler = () => { - const size = { - width: window.innerWidth, - height: window.innerHeight - }; - const info = { - target: window, - size, - contentSize: size - }; - windowCallbacks.forEach(callback => callback(info)); - }; - window.addEventListener("resize", windowResizeHandler); -} -function resizeWindow(callback) { - windowCallbacks.add(callback); - if (!windowResizeHandler) createWindowResizeHandler(); - return () => { - windowCallbacks.delete(callback); - if (!windowCallbacks.size && windowResizeHandler) { - windowResizeHandler = undefined; - } - }; -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/gestures/resize/index.es.js": -/*!*****************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/gestures/resize/index.es.js ***! - \*****************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.resize = resize; -var _handleElementEs = __webpack_require__(/*! ./handle-element.es.js */ "../../../node_modules/@motionone/dom/dist/gestures/resize/handle-element.es.js"); -var _handleWindowEs = __webpack_require__(/*! ./handle-window.es.js */ "../../../node_modules/@motionone/dom/dist/gestures/resize/handle-window.es.js"); -function resize(a, b) { - return typeof a === "function" ? (0, _handleWindowEs.resizeWindow)(a) : (0, _handleElementEs.resizeElement)(a, b); -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/gestures/scroll/index.es.js": -/*!*****************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/gestures/scroll/index.es.js ***! - \*****************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.scroll = scroll; -var _tslib = __webpack_require__(/*! tslib */ "../../../node_modules/tslib/tslib.es6.js"); -var _indexEs = __webpack_require__(/*! ../resize/index.es.js */ "../../../node_modules/@motionone/dom/dist/gestures/resize/index.es.js"); -var _infoEs = __webpack_require__(/*! ./info.es.js */ "../../../node_modules/@motionone/dom/dist/gestures/scroll/info.es.js"); -var _onScrollHandlerEs = __webpack_require__(/*! ./on-scroll-handler.es.js */ "../../../node_modules/@motionone/dom/dist/gestures/scroll/on-scroll-handler.es.js"); -const scrollListeners = new WeakMap(); -const resizeListeners = new WeakMap(); -const onScrollHandlers = new WeakMap(); -const getEventTarget = element => element === document.documentElement ? window : element; -function scroll(onScroll) { - let _a = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var { - container = document.documentElement - } = _a, - options = (0, _tslib.__rest)(_a, ["container"]); - let containerHandlers = onScrollHandlers.get(container); - /** - * Get the onScroll handlers for this container. - * If one isn't found, create a new one. - */ - if (!containerHandlers) { - containerHandlers = new Set(); - onScrollHandlers.set(container, containerHandlers); - } - /** - * Create a new onScroll handler for the provided callback. - */ - const info = (0, _infoEs.createScrollInfo)(); - const containerHandler = (0, _onScrollHandlerEs.createOnScrollHandler)(container, onScroll, info, options); - containerHandlers.add(containerHandler); - /** - * Check if there's a scroll event listener for this container. - * If not, create one. - */ - if (!scrollListeners.has(container)) { - const listener = () => { - const time = performance.now(); - for (const handler of containerHandlers) handler.measure(); - for (const handler of containerHandlers) handler.update(time); - for (const handler of containerHandlers) handler.notify(); - }; - scrollListeners.set(container, listener); - const target = getEventTarget(container); - window.addEventListener("resize", listener, { - passive: true - }); - if (container !== document.documentElement) { - resizeListeners.set(container, (0, _indexEs.resize)(container, listener)); - } - target.addEventListener("scroll", listener, { - passive: true - }); - } - const listener = scrollListeners.get(container); - const onLoadProcesss = requestAnimationFrame(listener); - return () => { - var _a; - if (typeof onScroll !== "function") onScroll.stop(); - cancelAnimationFrame(onLoadProcesss); - /** - * Check if we even have any handlers for this container. - */ - const containerHandlers = onScrollHandlers.get(container); - if (!containerHandlers) return; - containerHandlers.delete(containerHandler); - if (containerHandlers.size) return; - /** - * If no more handlers, remove the scroll listener too. - */ - const listener = scrollListeners.get(container); - scrollListeners.delete(container); - if (listener) { - getEventTarget(container).removeEventListener("scroll", listener); - (_a = resizeListeners.get(container)) === null || _a === void 0 ? void 0 : _a(); - window.removeEventListener("resize", listener); - } - }; -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/gestures/scroll/info.es.js": -/*!****************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/gestures/scroll/info.es.js ***! - \****************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.createScrollInfo = void 0; -exports.updateScrollInfo = updateScrollInfo; -var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); -/** - * A time in milliseconds, beyond which we consider the scroll velocity to be 0. - */ -const maxElapsed = 50; -const createAxisInfo = () => ({ - current: 0, - offset: [], - progress: 0, - scrollLength: 0, - targetOffset: 0, - targetLength: 0, - containerLength: 0, - velocity: 0 -}); -const createScrollInfo = () => ({ - time: 0, - x: createAxisInfo(), - y: createAxisInfo() -}); -exports.createScrollInfo = createScrollInfo; -const keys = { - x: { - length: "Width", - position: "Left" - }, - y: { - length: "Height", - position: "Top" - } -}; -function updateAxisInfo(element, axisName, info, time) { - const axis = info[axisName]; - const { - length, - position - } = keys[axisName]; - const prev = axis.current; - const prevTime = info.time; - axis.current = element["scroll" + position]; - axis.scrollLength = element["scroll" + length] - element["client" + length]; - axis.offset.length = 0; - axis.offset[0] = 0; - axis.offset[1] = axis.scrollLength; - axis.progress = (0, _utils.progress)(0, axis.scrollLength, axis.current); - const elapsed = time - prevTime; - axis.velocity = elapsed > maxElapsed ? 0 : (0, _utils.velocityPerSecond)(axis.current - prev, elapsed); -} -function updateScrollInfo(element, info, time) { - updateAxisInfo(element, "x", info, time); - updateAxisInfo(element, "y", info, time); - info.time = time; -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/gestures/scroll/offsets/edge.es.js": -/*!************************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/gestures/scroll/offsets/edge.es.js ***! - \************************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.namedEdges = void 0; -exports.resolveEdge = resolveEdge; -var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); -const namedEdges = { - start: 0, - center: 0.5, - end: 1 -}; -exports.namedEdges = namedEdges; -function resolveEdge(edge, length) { - let inset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; - let delta = 0; - /** - * If we have this edge defined as a preset, replace the definition - * with the numerical value. - */ - if (namedEdges[edge] !== undefined) { - edge = namedEdges[edge]; - } - /** - * Handle unit values - */ - if ((0, _utils.isString)(edge)) { - const asNumber = parseFloat(edge); - if (edge.endsWith("px")) { - delta = asNumber; - } else if (edge.endsWith("%")) { - edge = asNumber / 100; - } else if (edge.endsWith("vw")) { - delta = asNumber / 100 * document.documentElement.clientWidth; - } else if (edge.endsWith("vh")) { - delta = asNumber / 100 * document.documentElement.clientHeight; - } else { - edge = asNumber; - } - } - /** - * If the edge is defined as a number, handle as a progress value. - */ - if ((0, _utils.isNumber)(edge)) { - delta = length * edge; - } - return inset + delta; -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/gestures/scroll/offsets/index.es.js": -/*!*************************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/gestures/scroll/offsets/index.es.js ***! - \*************************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.resolveOffsets = resolveOffsets; -var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); -var _insetEs = __webpack_require__(/*! ./inset.es.js */ "../../../node_modules/@motionone/dom/dist/gestures/scroll/offsets/inset.es.js"); -var _presetsEs = __webpack_require__(/*! ./presets.es.js */ "../../../node_modules/@motionone/dom/dist/gestures/scroll/offsets/presets.es.js"); -var _offsetEs = __webpack_require__(/*! ./offset.es.js */ "../../../node_modules/@motionone/dom/dist/gestures/scroll/offsets/offset.es.js"); -const point = { - x: 0, - y: 0 -}; -function resolveOffsets(container, info, options) { - let { - offset: offsetDefinition = _presetsEs.ScrollOffset.All - } = options; - const { - target = container, - axis = "y" - } = options; - const lengthLabel = axis === "y" ? "height" : "width"; - const inset = target !== container ? (0, _insetEs.calcInset)(target, container) : point; - /** - * Measure the target and container. If they're the same thing then we - * use the container's scrollWidth/Height as the target, from there - * all other calculations can remain the same. - */ - const targetSize = target === container ? { - width: container.scrollWidth, - height: container.scrollHeight - } : { - width: target.clientWidth, - height: target.clientHeight - }; - const containerSize = { - width: container.clientWidth, - height: container.clientHeight - }; - /** - * Reset the length of the resolved offset array rather than creating a new one. - * TODO: More reusable data structures for targetSize/containerSize would also be good. - */ - info[axis].offset.length = 0; - /** - * Populate the offset array by resolving the user's offset definition into - * a list of pixel scroll offets. - */ - let hasChanged = !info[axis].interpolate; - const numOffsets = offsetDefinition.length; - for (let i = 0; i < numOffsets; i++) { - const offset = (0, _offsetEs.resolveOffset)(offsetDefinition[i], containerSize[lengthLabel], targetSize[lengthLabel], inset[axis]); - if (!hasChanged && offset !== info[axis].interpolatorOffsets[i]) { - hasChanged = true; - } - info[axis].offset[i] = offset; - } - /** - * If the pixel scroll offsets have changed, create a new interpolator function - * to map scroll value into a progress. - */ - if (hasChanged) { - info[axis].interpolate = (0, _utils.interpolate)((0, _utils.defaultOffset)(numOffsets), info[axis].offset); - info[axis].interpolatorOffsets = [...info[axis].offset]; - } - info[axis].progress = info[axis].interpolate(info[axis].current); -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/gestures/scroll/offsets/inset.es.js": -/*!*************************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/gestures/scroll/offsets/inset.es.js ***! - \*************************************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.calcInset = calcInset; -function calcInset(element, container) { - let inset = { - x: 0, - y: 0 - }; - let current = element; - while (current && current !== container) { - if (current instanceof HTMLElement) { - inset.x += current.offsetLeft; - inset.y += current.offsetTop; - current = current.offsetParent; - } else if (current instanceof SVGGraphicsElement && "getBBox" in current) { - const { - top, - left - } = current.getBBox(); - inset.x += left; - inset.y += top; - /** - * Assign the next parent element as the tag. - */ - while (current && current.tagName !== "svg") { - current = current.parentNode; - } - } - } - return inset; -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/gestures/scroll/offsets/offset.es.js": -/*!**************************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/gestures/scroll/offsets/offset.es.js ***! - \**************************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.resolveOffset = resolveOffset; -var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); -var _edgeEs = __webpack_require__(/*! ./edge.es.js */ "../../../node_modules/@motionone/dom/dist/gestures/scroll/offsets/edge.es.js"); -const defaultOffset = [0, 0]; -function resolveOffset(offset, containerLength, targetLength, targetInset) { - let offsetDefinition = Array.isArray(offset) ? offset : defaultOffset; - let targetPoint = 0; - let containerPoint = 0; - if ((0, _utils.isNumber)(offset)) { - /** - * If we're provided offset: [0, 0.5, 1] then each number x should become - * [x, x], so we default to the behaviour of mapping 0 => 0 of both target - * and container etc. - */ - offsetDefinition = [offset, offset]; - } else if ((0, _utils.isString)(offset)) { - offset = offset.trim(); - if (offset.includes(" ")) { - offsetDefinition = offset.split(" "); - } else { - /** - * If we're provided a definition like "100px" then we want to apply - * that only to the top of the target point, leaving the container at 0. - * Whereas a named offset like "end" should be applied to both. - */ - offsetDefinition = [offset, _edgeEs.namedEdges[offset] ? offset : `0`]; - } - } - targetPoint = (0, _edgeEs.resolveEdge)(offsetDefinition[0], targetLength, targetInset); - containerPoint = (0, _edgeEs.resolveEdge)(offsetDefinition[1], containerLength); - return targetPoint - containerPoint; -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/gestures/scroll/offsets/presets.es.js": -/*!***************************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/gestures/scroll/offsets/presets.es.js ***! - \***************************************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.ScrollOffset = void 0; -const ScrollOffset = { - Enter: [[0, 1], [1, 1]], - Exit: [[0, 0], [1, 0]], - Any: [[1, 0], [0, 1]], - All: [[0, 0], [1, 1]] -}; -exports.ScrollOffset = ScrollOffset; - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/gestures/scroll/on-scroll-handler.es.js": -/*!*****************************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/gestures/scroll/on-scroll-handler.es.js ***! - \*****************************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.createOnScrollHandler = createOnScrollHandler; -var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); -var _infoEs = __webpack_require__(/*! ./info.es.js */ "../../../node_modules/@motionone/dom/dist/gestures/scroll/info.es.js"); -var _indexEs = __webpack_require__(/*! ./offsets/index.es.js */ "../../../node_modules/@motionone/dom/dist/gestures/scroll/offsets/index.es.js"); -function measure(container) { - let target = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : container; - let info = arguments.length > 2 ? arguments[2] : undefined; - /** - * Find inset of target within scrollable container - */ - info.x.targetOffset = 0; - info.y.targetOffset = 0; - if (target !== container) { - let node = target; - while (node && node != container) { - info.x.targetOffset += node.offsetLeft; - info.y.targetOffset += node.offsetTop; - node = node.offsetParent; - } - } - info.x.targetLength = target === container ? target.scrollWidth : target.clientWidth; - info.y.targetLength = target === container ? target.scrollHeight : target.clientHeight; - info.x.containerLength = container.clientWidth; - info.y.containerLength = container.clientHeight; -} -function createOnScrollHandler(element, onScroll, info) { - let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; - const axis = options.axis || "y"; - return { - measure: () => measure(element, options.target, info), - update: time => { - (0, _infoEs.updateScrollInfo)(element, info, time); - if (options.offset || options.target) { - (0, _indexEs.resolveOffsets)(element, info, options); - } - }, - notify: typeof onScroll === "function" ? () => onScroll(info) : scrubAnimation(onScroll, info[axis]) - }; -} -function scrubAnimation(controls, axisInfo) { - controls.pause(); - controls.forEachNative((animation, _ref) => { - let { - easing - } = _ref; - var _a, _b; - if (animation.updateDuration) { - if (!easing) animation.easing = _utils.noopReturn; - animation.updateDuration(1); - } else { - const timingOptions = { - duration: 1000 - }; - if (!easing) timingOptions.easing = "linear"; - (_b = (_a = animation.effect) === null || _a === void 0 ? void 0 : _a.updateTiming) === null || _b === void 0 ? void 0 : _b.call(_a, timingOptions); - } - }); - return () => { - controls.currentTime = axisInfo.progress; - }; -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/index.es.js": -/*!*************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/index.es.js ***! - \*************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -Object.defineProperty(exports, "ScrollOffset", ({ - enumerable: true, - get: function () { - return _presetsEs.ScrollOffset; - } -})); -Object.defineProperty(exports, "animate", ({ - enumerable: true, - get: function () { - return _indexEs.animate; - } -})); -Object.defineProperty(exports, "animateStyle", ({ - enumerable: true, - get: function () { - return _animateStyleEs.animateStyle; - } -})); -Object.defineProperty(exports, "createMotionState", ({ - enumerable: true, - get: function () { - return _indexEs7.createMotionState; - } -})); -Object.defineProperty(exports, "createStyleString", ({ - enumerable: true, - get: function () { - return _styleStringEs.createStyleString; - } -})); -Object.defineProperty(exports, "createStyles", ({ - enumerable: true, - get: function () { - return _styleObjectEs.createStyles; - } -})); -Object.defineProperty(exports, "getAnimationData", ({ - enumerable: true, - get: function () { - return _dataEs.getAnimationData; - } -})); -Object.defineProperty(exports, "getStyleName", ({ - enumerable: true, - get: function () { - return _getStyleNameEs.getStyleName; - } -})); -Object.defineProperty(exports, "glide", ({ - enumerable: true, - get: function () { - return _indexEs4.glide; - } -})); -Object.defineProperty(exports, "inView", ({ - enumerable: true, - get: function () { - return _inViewEs.inView; - } -})); -Object.defineProperty(exports, "mountedStates", ({ - enumerable: true, - get: function () { - return _indexEs7.mountedStates; - } -})); -Object.defineProperty(exports, "resize", ({ - enumerable: true, - get: function () { - return _indexEs5.resize; - } -})); -Object.defineProperty(exports, "scroll", ({ - enumerable: true, - get: function () { - return _indexEs6.scroll; - } -})); -Object.defineProperty(exports, "spring", ({ - enumerable: true, - get: function () { - return _indexEs3.spring; - } -})); -Object.defineProperty(exports, "stagger", ({ - enumerable: true, - get: function () { - return _staggerEs.stagger; - } -})); -Object.defineProperty(exports, "style", ({ - enumerable: true, - get: function () { - return _styleEs.style; - } -})); -Object.defineProperty(exports, "timeline", ({ - enumerable: true, - get: function () { - return _indexEs2.timeline; - } -})); -Object.defineProperty(exports, "withControls", ({ - enumerable: true, - get: function () { - return _controlsEs.withControls; - } -})); -var _indexEs = __webpack_require__(/*! ./animate/index.es.js */ "../../../node_modules/@motionone/dom/dist/animate/index.es.js"); -var _animateStyleEs = __webpack_require__(/*! ./animate/animate-style.es.js */ "../../../node_modules/@motionone/dom/dist/animate/animate-style.es.js"); -var _indexEs2 = __webpack_require__(/*! ./timeline/index.es.js */ "../../../node_modules/@motionone/dom/dist/timeline/index.es.js"); -var _staggerEs = __webpack_require__(/*! ./utils/stagger.es.js */ "../../../node_modules/@motionone/dom/dist/utils/stagger.es.js"); -var _indexEs3 = __webpack_require__(/*! ./easing/spring/index.es.js */ "../../../node_modules/@motionone/dom/dist/easing/spring/index.es.js"); -var _indexEs4 = __webpack_require__(/*! ./easing/glide/index.es.js */ "../../../node_modules/@motionone/dom/dist/easing/glide/index.es.js"); -var _styleEs = __webpack_require__(/*! ./animate/style.es.js */ "../../../node_modules/@motionone/dom/dist/animate/style.es.js"); -var _inViewEs = __webpack_require__(/*! ./gestures/in-view.es.js */ "../../../node_modules/@motionone/dom/dist/gestures/in-view.es.js"); -var _indexEs5 = __webpack_require__(/*! ./gestures/resize/index.es.js */ "../../../node_modules/@motionone/dom/dist/gestures/resize/index.es.js"); -var _indexEs6 = __webpack_require__(/*! ./gestures/scroll/index.es.js */ "../../../node_modules/@motionone/dom/dist/gestures/scroll/index.es.js"); -var _presetsEs = __webpack_require__(/*! ./gestures/scroll/offsets/presets.es.js */ "../../../node_modules/@motionone/dom/dist/gestures/scroll/offsets/presets.es.js"); -var _controlsEs = __webpack_require__(/*! ./animate/utils/controls.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/controls.es.js"); -var _dataEs = __webpack_require__(/*! ./animate/data.es.js */ "../../../node_modules/@motionone/dom/dist/animate/data.es.js"); -var _getStyleNameEs = __webpack_require__(/*! ./animate/utils/get-style-name.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/get-style-name.es.js"); -var _indexEs7 = __webpack_require__(/*! ./state/index.es.js */ "../../../node_modules/@motionone/dom/dist/state/index.es.js"); -var _styleObjectEs = __webpack_require__(/*! ./animate/utils/style-object.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/style-object.es.js"); -var _styleStringEs = __webpack_require__(/*! ./animate/utils/style-string.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/style-string.es.js"); - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/state/gestures/hover.es.js": -/*!****************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/state/gestures/hover.es.js ***! - \****************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.hover = void 0; -var _eventsEs = __webpack_require__(/*! ../utils/events.es.js */ "../../../node_modules/@motionone/dom/dist/state/utils/events.es.js"); -const mouseEvent = (element, name, action) => event => { - if (event.pointerType && event.pointerType !== "mouse") return; - action(); - (0, _eventsEs.dispatchPointerEvent)(element, name, event); -}; -const hover = { - isActive: options => Boolean(options.hover), - subscribe: (element, _ref) => { - let { - enable, - disable - } = _ref; - const onEnter = mouseEvent(element, "hoverstart", enable); - const onLeave = mouseEvent(element, "hoverend", disable); - element.addEventListener("pointerenter", onEnter); - element.addEventListener("pointerleave", onLeave); - return () => { - element.removeEventListener("pointerenter", onEnter); - element.removeEventListener("pointerleave", onLeave); - }; - } -}; -exports.hover = hover; - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/state/gestures/in-view.es.js": -/*!******************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/state/gestures/in-view.es.js ***! - \******************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.inView = void 0; -var _tslib = __webpack_require__(/*! tslib */ "../../../node_modules/tslib/tslib.es6.js"); -var _eventsEs = __webpack_require__(/*! ../utils/events.es.js */ "../../../node_modules/@motionone/dom/dist/state/utils/events.es.js"); -var _inViewEs = __webpack_require__(/*! ../../gestures/in-view.es.js */ "../../../node_modules/@motionone/dom/dist/gestures/in-view.es.js"); -const inView = { - isActive: options => Boolean(options.inView), - subscribe: (element, _ref, _ref2) => { - let { - enable, - disable - } = _ref; - let { - inViewOptions = {} - } = _ref2; - const { - once - } = inViewOptions, - viewOptions = (0, _tslib.__rest)(inViewOptions, ["once"]); - return (0, _inViewEs.inView)(element, enterEntry => { - enable(); - (0, _eventsEs.dispatchViewEvent)(element, "viewenter", enterEntry); - if (!once) { - return leaveEntry => { - disable(); - (0, _eventsEs.dispatchViewEvent)(element, "viewleave", leaveEntry); - }; - } - }, viewOptions); - } -}; -exports.inView = inView; - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/state/gestures/press.es.js": -/*!****************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/state/gestures/press.es.js ***! - \****************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.press = void 0; -var _eventsEs = __webpack_require__(/*! ../utils/events.es.js */ "../../../node_modules/@motionone/dom/dist/state/utils/events.es.js"); -const press = { - isActive: options => Boolean(options.press), - subscribe: (element, _ref) => { - let { - enable, - disable - } = _ref; - const onPointerUp = event => { - disable(); - (0, _eventsEs.dispatchPointerEvent)(element, "pressend", event); - window.removeEventListener("pointerup", onPointerUp); - }; - const onPointerDown = event => { - enable(); - (0, _eventsEs.dispatchPointerEvent)(element, "pressstart", event); - window.addEventListener("pointerup", onPointerUp); - }; - element.addEventListener("pointerdown", onPointerDown); - return () => { - element.removeEventListener("pointerdown", onPointerDown); - window.removeEventListener("pointerup", onPointerUp); - }; - } -}; -exports.press = press; - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/state/index.es.js": -/*!*******************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/state/index.es.js ***! - \*******************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.createMotionState = createMotionState; -exports.mountedStates = void 0; -var _tslib = __webpack_require__(/*! tslib */ "../../../node_modules/tslib/tslib.es6.js"); -var _heyListen = __webpack_require__(/*! hey-listen */ "../../../node_modules/hey-listen/dist/hey-listen.es.js"); -var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); -var _animateStyleEs = __webpack_require__(/*! ../animate/animate-style.es.js */ "../../../node_modules/@motionone/dom/dist/animate/animate-style.es.js"); -var _styleEs = __webpack_require__(/*! ../animate/style.es.js */ "../../../node_modules/@motionone/dom/dist/animate/style.es.js"); -var _optionsEs = __webpack_require__(/*! ../animate/utils/options.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/options.es.js"); -var _hasChangedEs = __webpack_require__(/*! ./utils/has-changed.es.js */ "../../../node_modules/@motionone/dom/dist/state/utils/has-changed.es.js"); -var _resolveVariantEs = __webpack_require__(/*! ./utils/resolve-variant.es.js */ "../../../node_modules/@motionone/dom/dist/state/utils/resolve-variant.es.js"); -var _scheduleEs = __webpack_require__(/*! ./utils/schedule.es.js */ "../../../node_modules/@motionone/dom/dist/state/utils/schedule.es.js"); -var _inViewEs = __webpack_require__(/*! ./gestures/in-view.es.js */ "../../../node_modules/@motionone/dom/dist/state/gestures/in-view.es.js"); -var _hoverEs = __webpack_require__(/*! ./gestures/hover.es.js */ "../../../node_modules/@motionone/dom/dist/state/gestures/hover.es.js"); -var _pressEs = __webpack_require__(/*! ./gestures/press.es.js */ "../../../node_modules/@motionone/dom/dist/state/gestures/press.es.js"); -var _eventsEs = __webpack_require__(/*! ./utils/events.es.js */ "../../../node_modules/@motionone/dom/dist/state/utils/events.es.js"); -const gestures = { - inView: _inViewEs.inView, - hover: _hoverEs.hover, - press: _pressEs.press -}; -/** - * A list of state types, in priority order. If a value is defined in - * a righter-most type, it will override any definition in a lefter-most. - */ -const stateTypes = ["initial", "animate", ...Object.keys(gestures), "exit"]; -/** - * A global store of all generated motion states. This can be used to lookup - * a motion state for a given Element. - */ -const mountedStates = new WeakMap(); -exports.mountedStates = mountedStates; -function createMotionState() { - let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - let parent = arguments.length > 1 ? arguments[1] : undefined; - /** - * The element represented by the motion state. This is an empty reference - * when we create the state to support SSR and allow for later mounting - * in view libraries. - * - * @ts-ignore - */ - let element; - /** - * Calculate a depth that we can use to order motion states by tree depth. - */ - let depth = parent ? parent.getDepth() + 1 : 0; - /** - * Track which states are currently active. - */ - const activeStates = { - initial: true, - animate: true - }; - /** - * A map of functions that, when called, will remove event listeners for - * a given gesture. - */ - const gestureSubscriptions = {}; - /** - * Initialise a context to share through motion states. This - * will be populated by variant names (if any). - */ - const context = {}; - for (const name of stateTypes) { - context[name] = typeof options[name] === "string" ? options[name] : parent === null || parent === void 0 ? void 0 : parent.getContext()[name]; - } - /** - * If initial is set to false we use the animate prop as the initial - * animation state. - */ - const initialVariantSource = options.initial === false ? "animate" : "initial"; - /** - * Destructure an initial target out from the resolved initial variant. - */ - let _a = (0, _resolveVariantEs.resolveVariant)(options[initialVariantSource] || context[initialVariantSource], options.variants) || {}, - target = (0, _tslib.__rest)(_a, ["transition"]); - /** - * The base target is a cached map of values that we'll use to animate - * back to if a value is removed from all active state types. This - * is usually the initial value as read from the DOM, for instance if - * it hasn't been defined in initial. - */ - const baseTarget = Object.assign({}, target); - /** - * A generator that will be processed by the global animation scheduler. - * This yeilds when it switches from reading the DOM to writing to it - * to prevent layout thrashing. - */ - function* animateUpdates() { - var _a, _b; - const prevTarget = target; - target = {}; - const animationOptions = {}; - for (const name of stateTypes) { - if (!activeStates[name]) continue; - const variant = (0, _resolveVariantEs.resolveVariant)(options[name]); - if (!variant) continue; - for (const key in variant) { - if (key === "transition") continue; - target[key] = variant[key]; - animationOptions[key] = (0, _optionsEs.getOptions)((_b = (_a = variant.transition) !== null && _a !== void 0 ? _a : options.transition) !== null && _b !== void 0 ? _b : {}, key); - } - } - const allTargetKeys = new Set([...Object.keys(target), ...Object.keys(prevTarget)]); - const animationFactories = []; - allTargetKeys.forEach(key => { - var _a; - if (target[key] === undefined) { - target[key] = baseTarget[key]; - } - if ((0, _hasChangedEs.hasChanged)(prevTarget[key], target[key])) { - (_a = baseTarget[key]) !== null && _a !== void 0 ? _a : baseTarget[key] = _styleEs.style.get(element, key); - animationFactories.push((0, _animateStyleEs.animateStyle)(element, key, target[key], animationOptions[key])); - } - }); - // Wait for all animation states to read from the DOM - yield; - const animations = animationFactories.map(factory => factory()).filter(Boolean); - if (!animations.length) return; - const animationTarget = target; - element.dispatchEvent((0, _eventsEs.motionEvent)("motionstart", animationTarget)); - Promise.all(animations.map(animation => animation.finished)).then(() => { - element.dispatchEvent((0, _eventsEs.motionEvent)("motioncomplete", animationTarget)); - }).catch(_utils.noop); - } - const setGesture = (name, isActive) => () => { - activeStates[name] = isActive; - (0, _scheduleEs.scheduleAnimation)(state); - }; - const updateGestureSubscriptions = () => { - for (const name in gestures) { - const isGestureActive = gestures[name].isActive(options); - const remove = gestureSubscriptions[name]; - if (isGestureActive && !remove) { - gestureSubscriptions[name] = gestures[name].subscribe(element, { - enable: setGesture(name, true), - disable: setGesture(name, false) - }, options); - } else if (!isGestureActive && remove) { - remove(); - delete gestureSubscriptions[name]; - } - } - }; - const state = { - update: newOptions => { - if (!element) return; - options = newOptions; - updateGestureSubscriptions(); - (0, _scheduleEs.scheduleAnimation)(state); - }, - setActive: (name, isActive) => { - if (!element) return; - activeStates[name] = isActive; - (0, _scheduleEs.scheduleAnimation)(state); - }, - animateUpdates, - getDepth: () => depth, - getTarget: () => target, - getOptions: () => options, - getContext: () => context, - mount: newElement => { - (0, _heyListen.invariant)(Boolean(newElement), "Animation state must be mounted with valid Element"); - element = newElement; - mountedStates.set(element, state); - updateGestureSubscriptions(); - return () => { - mountedStates.delete(element); - (0, _scheduleEs.unscheduleAnimation)(state); - for (const key in gestureSubscriptions) { - gestureSubscriptions[key](); - } - }; - }, - isMounted: () => Boolean(element) - }; - return state; -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/state/utils/events.es.js": -/*!**************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/state/utils/events.es.js ***! - \**************************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.dispatchPointerEvent = dispatchPointerEvent; -exports.dispatchViewEvent = dispatchViewEvent; -exports.motionEvent = void 0; -const motionEvent = (name, target) => new CustomEvent(name, { - detail: { - target - } -}); -exports.motionEvent = motionEvent; -function dispatchPointerEvent(element, name, event) { - element.dispatchEvent(new CustomEvent(name, { - detail: { - originalEvent: event - } - })); -} -function dispatchViewEvent(element, name, entry) { - element.dispatchEvent(new CustomEvent(name, { - detail: { - originalEntry: entry - } - })); -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/state/utils/has-changed.es.js": -/*!*******************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/state/utils/has-changed.es.js ***! - \*******************************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.hasChanged = hasChanged; -exports.shallowCompare = shallowCompare; -function hasChanged(a, b) { - if (typeof a !== typeof b) return true; - if (Array.isArray(a) && Array.isArray(b)) return !shallowCompare(a, b); - return a !== b; -} -function shallowCompare(next, prev) { - const prevLength = prev.length; - if (prevLength !== next.length) return false; - for (let i = 0; i < prevLength; i++) { - if (prev[i] !== next[i]) return false; - } - return true; -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/state/utils/is-variant.es.js": -/*!******************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/state/utils/is-variant.es.js ***! - \******************************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.isVariant = isVariant; -function isVariant(definition) { - return typeof definition === "object"; -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/state/utils/resolve-variant.es.js": -/*!***********************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/state/utils/resolve-variant.es.js ***! - \***********************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.resolveVariant = resolveVariant; -var _isVariantEs = __webpack_require__(/*! ./is-variant.es.js */ "../../../node_modules/@motionone/dom/dist/state/utils/is-variant.es.js"); -function resolveVariant(definition, variants) { - if ((0, _isVariantEs.isVariant)(definition)) { - return definition; - } else if (definition && variants) { - return variants[definition]; - } -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/state/utils/schedule.es.js": -/*!****************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/state/utils/schedule.es.js ***! - \****************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.scheduleAnimation = scheduleAnimation; -exports.unscheduleAnimation = unscheduleAnimation; -var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); -let scheduled = undefined; -function processScheduledAnimations() { - if (!scheduled) return; - const generators = scheduled.sort(compareByDepth).map(fireAnimateUpdates); - generators.forEach(fireNext); - generators.forEach(fireNext); - scheduled = undefined; -} -function scheduleAnimation(state) { - if (!scheduled) { - scheduled = [state]; - requestAnimationFrame(processScheduledAnimations); - } else { - (0, _utils.addUniqueItem)(scheduled, state); - } -} -function unscheduleAnimation(state) { - scheduled && (0, _utils.removeItem)(scheduled, state); -} -const compareByDepth = (a, b) => a.getDepth() - b.getDepth(); -const fireAnimateUpdates = state => state.animateUpdates(); -const fireNext = iterator => iterator.next(); - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/timeline/index.es.js": -/*!**********************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/timeline/index.es.js ***! - \**********************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.createAnimationsFromTimeline = createAnimationsFromTimeline; -exports.timeline = timeline; -var _tslib = __webpack_require__(/*! tslib */ "../../../node_modules/tslib/tslib.es6.js"); -var _heyListen = __webpack_require__(/*! hey-listen */ "../../../node_modules/hey-listen/dist/hey-listen.es.js"); -var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); -var _staggerEs = __webpack_require__(/*! ../utils/stagger.es.js */ "../../../node_modules/@motionone/dom/dist/utils/stagger.es.js"); -var _animateStyleEs = __webpack_require__(/*! ../animate/animate-style.es.js */ "../../../node_modules/@motionone/dom/dist/animate/animate-style.es.js"); -var _controlsEs = __webpack_require__(/*! ../animate/utils/controls.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/controls.es.js"); -var _keyframesEs = __webpack_require__(/*! ../animate/utils/keyframes.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/keyframes.es.js"); -var _optionsEs = __webpack_require__(/*! ../animate/utils/options.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/options.es.js"); -var _resolveElementsEs = __webpack_require__(/*! ../utils/resolve-elements.es.js */ "../../../node_modules/@motionone/dom/dist/utils/resolve-elements.es.js"); -var _transformsEs = __webpack_require__(/*! ../animate/utils/transforms.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/transforms.es.js"); -var _calcTimeEs = __webpack_require__(/*! ./utils/calc-time.es.js */ "../../../node_modules/@motionone/dom/dist/timeline/utils/calc-time.es.js"); -var _editEs = __webpack_require__(/*! ./utils/edit.es.js */ "../../../node_modules/@motionone/dom/dist/timeline/utils/edit.es.js"); -var _sortEs = __webpack_require__(/*! ./utils/sort.es.js */ "../../../node_modules/@motionone/dom/dist/timeline/utils/sort.es.js"); -function timeline(definition) { - let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var _a; - const animationDefinitions = createAnimationsFromTimeline(definition, options); - /** - * Create and start animations - */ - const animationFactories = animationDefinitions.map(definition => (0, _animateStyleEs.animateStyle)(...definition)).filter(Boolean); - return (0, _controlsEs.withControls)(animationFactories, options, - // Get the duration from the first animation definition - (_a = animationDefinitions[0]) === null || _a === void 0 ? void 0 : _a[3].duration); -} -function createAnimationsFromTimeline(definition) { - let _a = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var { - defaultOptions = {} - } = _a, - timelineOptions = (0, _tslib.__rest)(_a, ["defaultOptions"]); - const animationDefinitions = []; - const elementSequences = new Map(); - const elementCache = {}; - const timeLabels = new Map(); - let prevTime = 0; - let currentTime = 0; - let totalDuration = 0; - /** - * Build the timeline by mapping over the definition array and converting - * the definitions into keyframes and offsets with absolute time values. - * These will later get converted into relative offsets in a second pass. - */ - for (let i = 0; i < definition.length; i++) { - const segment = definition[i]; - /** - * If this is a timeline label, mark it and skip the rest of this iteration. - */ - if ((0, _utils.isString)(segment)) { - timeLabels.set(segment, currentTime); - continue; - } else if (!Array.isArray(segment)) { - timeLabels.set(segment.name, (0, _calcTimeEs.calcNextTime)(currentTime, segment.at, prevTime, timeLabels)); - continue; - } - const [elementDefinition, keyframes, options = {}] = segment; - /** - * If a relative or absolute time value has been specified we need to resolve - * it in relation to the currentTime. - */ - if (options.at !== undefined) { - currentTime = (0, _calcTimeEs.calcNextTime)(currentTime, options.at, prevTime, timeLabels); - } - /** - * Keep track of the maximum duration in this definition. This will be - * applied to currentTime once the definition has been parsed. - */ - let maxDuration = 0; - /** - * Find all the elements specified in the definition and parse value - * keyframes from their timeline definitions. - */ - const elements = (0, _resolveElementsEs.resolveElements)(elementDefinition, elementCache); - const numElements = elements.length; - for (let elementIndex = 0; elementIndex < numElements; elementIndex++) { - const element = elements[elementIndex]; - const elementSequence = getElementSequence(element, elementSequences); - for (const key in keyframes) { - const valueSequence = getValueSequence(key, elementSequence); - let valueKeyframes = (0, _keyframesEs.keyframesList)(keyframes[key]); - const valueOptions = (0, _optionsEs.getOptions)(options, key); - let { - duration = defaultOptions.duration || _utils.defaults.duration, - easing = defaultOptions.easing || _utils.defaults.easing - } = valueOptions; - if ((0, _utils.isEasingGenerator)(easing)) { - const valueIsTransform = (0, _transformsEs.isTransform)(key); - (0, _heyListen.invariant)(valueKeyframes.length === 2 || !valueIsTransform, "spring must be provided 2 keyframes within timeline"); - const custom = easing.createAnimation(valueKeyframes, - // TODO We currently only support explicit keyframes - // so this doesn't currently read from the DOM - () => "0", valueIsTransform); - easing = custom.easing; - if (custom.keyframes !== undefined) valueKeyframes = custom.keyframes; - if (custom.duration !== undefined) duration = custom.duration; - } - const delay = (0, _staggerEs.resolveOption)(options.delay, elementIndex, numElements) || 0; - const startTime = currentTime + delay; - const targetTime = startTime + duration; - /** - * - */ - let { - offset = (0, _utils.defaultOffset)(valueKeyframes.length) - } = valueOptions; - /** - * If there's only one offset of 0, fill in a second with length 1 - * - * TODO: Ensure there's a test that covers this removal - */ - if (offset.length === 1 && offset[0] === 0) { - offset[1] = 1; - } - /** - * Fill out if offset if fewer offsets than keyframes - */ - const remainder = length - valueKeyframes.length; - remainder > 0 && (0, _utils.fillOffset)(offset, remainder); - /** - * If only one value has been set, ie [1], push a null to the start of - * the keyframe array. This will let us mark a keyframe at this point - * that will later be hydrated with the previous value. - */ - valueKeyframes.length === 1 && valueKeyframes.unshift(null); - /** - * Add keyframes, mapping offsets to absolute time. - */ - (0, _editEs.addKeyframes)(valueSequence, valueKeyframes, easing, offset, startTime, targetTime); - maxDuration = Math.max(delay + duration, maxDuration); - totalDuration = Math.max(targetTime, totalDuration); - } - } - prevTime = currentTime; - currentTime += maxDuration; - } - /** - * For every element and value combination create a new animation. - */ - elementSequences.forEach((valueSequences, element) => { - for (const key in valueSequences) { - const valueSequence = valueSequences[key]; - /** - * Arrange all the keyframes in ascending time order. - */ - valueSequence.sort(_sortEs.compareByTime); - const keyframes = []; - const valueOffset = []; - const valueEasing = []; - /** - * For each keyframe, translate absolute times into - * relative offsets based on the total duration of the timeline. - */ - for (let i = 0; i < valueSequence.length; i++) { - const { - at, - value, - easing - } = valueSequence[i]; - keyframes.push(value); - valueOffset.push((0, _utils.progress)(0, totalDuration, at)); - valueEasing.push(easing || _utils.defaults.easing); - } - /** - * If the first keyframe doesn't land on offset: 0 - * provide one by duplicating the initial keyframe. This ensures - * it snaps to the first keyframe when the animation starts. - */ - if (valueOffset[0] !== 0) { - valueOffset.unshift(0); - keyframes.unshift(keyframes[0]); - valueEasing.unshift("linear"); - } - /** - * If the last keyframe doesn't land on offset: 1 - * provide one with a null wildcard value. This will ensure it - * stays static until the end of the animation. - */ - if (valueOffset[valueOffset.length - 1] !== 1) { - valueOffset.push(1); - keyframes.push(null); - } - animationDefinitions.push([element, key, keyframes, Object.assign(Object.assign(Object.assign({}, defaultOptions), { - duration: totalDuration, - easing: valueEasing, - offset: valueOffset - }), timelineOptions)]); - } - }); - return animationDefinitions; -} -function getElementSequence(element, sequences) { - !sequences.has(element) && sequences.set(element, {}); - return sequences.get(element); -} -function getValueSequence(name, sequences) { - if (!sequences[name]) sequences[name] = []; - return sequences[name]; -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/timeline/utils/calc-time.es.js": -/*!********************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/timeline/utils/calc-time.es.js ***! - \********************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.calcNextTime = calcNextTime; -var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); -function calcNextTime(current, next, prev, labels) { - var _a; - if ((0, _utils.isNumber)(next)) { - return next; - } else if (next.startsWith("-") || next.startsWith("+")) { - return Math.max(0, current + parseFloat(next)); - } else if (next === "<") { - return prev; - } else { - return (_a = labels.get(next)) !== null && _a !== void 0 ? _a : current; - } -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/timeline/utils/edit.es.js": -/*!***************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/timeline/utils/edit.es.js ***! - \***************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.addKeyframes = addKeyframes; -exports.eraseKeyframes = eraseKeyframes; -var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); -function eraseKeyframes(sequence, startTime, endTime) { - for (let i = 0; i < sequence.length; i++) { - const keyframe = sequence[i]; - if (keyframe.at > startTime && keyframe.at < endTime) { - (0, _utils.removeItem)(sequence, keyframe); - // If we remove this item we have to push the pointer back one - i--; - } - } -} -function addKeyframes(sequence, keyframes, easing, offset, startTime, endTime) { - /** - * Erase every existing value between currentTime and targetTime, - * this will essentially splice this timeline into any currently - * defined ones. - */ - eraseKeyframes(sequence, startTime, endTime); - for (let i = 0; i < keyframes.length; i++) { - sequence.push({ - value: keyframes[i], - at: (0, _utils.mix)(startTime, endTime, offset[i]), - easing: (0, _utils.getEasingForSegment)(easing, i) - }); - } -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/timeline/utils/sort.es.js": -/*!***************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/timeline/utils/sort.es.js ***! - \***************************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.compareByTime = compareByTime; -function compareByTime(a, b) { - if (a.at === b.at) { - return a.value === null ? 1 : -1; - } else { - return a.at - b.at; - } -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/utils/resolve-elements.es.js": -/*!******************************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/utils/resolve-elements.es.js ***! - \******************************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.resolveElements = resolveElements; -function resolveElements(elements, selectorCache) { - var _a; - if (typeof elements === "string") { - if (selectorCache) { - (_a = selectorCache[elements]) !== null && _a !== void 0 ? _a : selectorCache[elements] = document.querySelectorAll(elements); - elements = selectorCache[elements]; - } else { - elements = document.querySelectorAll(elements); - } - } else if (elements instanceof Element) { - elements = [elements]; - } - /** - * Return an empty array - */ - return Array.from(elements || []); -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/dom/dist/utils/stagger.es.js": -/*!*********************************************************************!*\ - !*** ../../../node_modules/@motionone/dom/dist/utils/stagger.es.js ***! - \*********************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.getFromIndex = getFromIndex; -exports.resolveOption = resolveOption; -exports.stagger = stagger; -var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); -var _animation = __webpack_require__(/*! @motionone/animation */ "../../../node_modules/@motionone/animation/dist/index.es.js"); -function stagger() { - let duration = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0.1; - let { - start = 0, - from = 0, - easing - } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - return (i, total) => { - const fromIndex = (0, _utils.isNumber)(from) ? from : getFromIndex(from, total); - const distance = Math.abs(fromIndex - i); - let delay = duration * distance; - if (easing) { - const maxDelay = total * duration; - const easingFunction = (0, _animation.getEasingFunction)(easing); - delay = easingFunction(delay / maxDelay) * maxDelay; - } - return start + delay; - }; -} -function getFromIndex(from, total) { - if (from === "first") { - return 0; - } else { - const lastIndex = total - 1; - return from === "last" ? lastIndex : lastIndex / 2; - } -} -function resolveOption(option, i, total) { - return typeof option === "function" ? option(i, total) : option; -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/easing/dist/cubic-bezier.es.js": -/*!***********************************************************************!*\ - !*** ../../../node_modules/@motionone/easing/dist/cubic-bezier.es.js ***! - \***********************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.cubicBezier = cubicBezier; -var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); -/* - Bezier function generator - - This has been modified from Gaëtan Renaudeau's BezierEasing - https://github.com/gre/bezier-easing/blob/master/src/index.js - https://github.com/gre/bezier-easing/blob/master/LICENSE - - I've removed the newtonRaphsonIterate algo because in benchmarking it - wasn't noticiably faster than binarySubdivision, indeed removing it - usually improved times, depending on the curve. - - I also removed the lookup table, as for the added bundle size and loop we're - only cutting ~4 or so subdivision iterations. I bumped the max iterations up - to 12 to compensate and this still tended to be faster for no perceivable - loss in accuracy. - - Usage - const easeOut = cubicBezier(.17,.67,.83,.67); - const x = easeOut(0.5); // returns 0.627... -*/ -// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2. -const calcBezier = (t, a1, a2) => (((1.0 - 3.0 * a2 + 3.0 * a1) * t + (3.0 * a2 - 6.0 * a1)) * t + 3.0 * a1) * t; -const subdivisionPrecision = 0.0000001; -const subdivisionMaxIterations = 12; -function binarySubdivide(x, lowerBound, upperBound, mX1, mX2) { - let currentX; - let currentT; - let i = 0; - do { - currentT = lowerBound + (upperBound - lowerBound) / 2.0; - currentX = calcBezier(currentT, mX1, mX2) - x; - if (currentX > 0.0) { - upperBound = currentT; - } else { - lowerBound = currentT; - } - } while (Math.abs(currentX) > subdivisionPrecision && ++i < subdivisionMaxIterations); - return currentT; -} -function cubicBezier(mX1, mY1, mX2, mY2) { - // If this is a linear gradient, return linear easing - if (mX1 === mY1 && mX2 === mY2) return _utils.noopReturn; - const getTForX = aX => binarySubdivide(aX, 0, 1, mX1, mX2); - // If animation is at start/end, return t without easing - return t => t === 0 || t === 1 ? t : calcBezier(getTForX(t), mY1, mY2); -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/easing/dist/index.es.js": -/*!****************************************************************!*\ - !*** ../../../node_modules/@motionone/easing/dist/index.es.js ***! - \****************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -Object.defineProperty(exports, "cubicBezier", ({ - enumerable: true, - get: function () { - return _cubicBezierEs.cubicBezier; - } -})); -Object.defineProperty(exports, "steps", ({ - enumerable: true, - get: function () { - return _stepsEs.steps; - } -})); -var _cubicBezierEs = __webpack_require__(/*! ./cubic-bezier.es.js */ "../../../node_modules/@motionone/easing/dist/cubic-bezier.es.js"); -var _stepsEs = __webpack_require__(/*! ./steps.es.js */ "../../../node_modules/@motionone/easing/dist/steps.es.js"); - -/***/ }), - -/***/ "../../../node_modules/@motionone/easing/dist/steps.es.js": -/*!****************************************************************!*\ - !*** ../../../node_modules/@motionone/easing/dist/steps.es.js ***! - \****************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.steps = void 0; -var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); -const steps = function (steps) { - let direction = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "end"; - return progress => { - progress = direction === "end" ? Math.min(progress, 0.999) : Math.max(progress, 0.001); - const expanded = progress * steps; - const rounded = direction === "end" ? Math.floor(expanded) : Math.ceil(expanded); - return (0, _utils.clamp)(0, 1, rounded / steps); - }; -}; -exports.steps = steps; - -/***/ }), - -/***/ "../../../node_modules/@motionone/generators/dist/glide/index.es.js": -/*!**************************************************************************!*\ - !*** ../../../node_modules/@motionone/generators/dist/glide/index.es.js ***! - \**************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.glide = void 0; -var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); -var _velocityEs = __webpack_require__(/*! ../utils/velocity.es.js */ "../../../node_modules/@motionone/generators/dist/utils/velocity.es.js"); -var _indexEs = __webpack_require__(/*! ../spring/index.es.js */ "../../../node_modules/@motionone/generators/dist/spring/index.es.js"); -const glide = _ref => { - let { - from = 0, - velocity = 0.0, - power = 0.8, - decay = 0.325, - bounceDamping, - bounceStiffness, - changeTarget, - min, - max, - restDistance = 0.5, - restSpeed - } = _ref; - decay = _utils.time.ms(decay); - const state = { - hasReachedTarget: false, - done: false, - current: from, - target: from - }; - const isOutOfBounds = v => min !== undefined && v < min || max !== undefined && v > max; - const nearestBoundary = v => { - if (min === undefined) return max; - if (max === undefined) return min; - return Math.abs(min - v) < Math.abs(max - v) ? min : max; - }; - let amplitude = power * velocity; - const ideal = from + amplitude; - const target = changeTarget === undefined ? ideal : changeTarget(ideal); - state.target = target; - /** - * If the target has changed we need to re-calculate the amplitude, otherwise - * the animation will start from the wrong position. - */ - if (target !== ideal) amplitude = target - from; - const calcDelta = t => -amplitude * Math.exp(-t / decay); - const calcLatest = t => target + calcDelta(t); - const applyFriction = t => { - const delta = calcDelta(t); - const latest = calcLatest(t); - state.done = Math.abs(delta) <= restDistance; - state.current = state.done ? target : latest; - }; - /** - * Ideally this would resolve for t in a stateless way, we could - * do that by always precalculating the animation but as we know - * this will be done anyway we can assume that spring will - * be discovered during that. - */ - let timeReachedBoundary; - let spring$1; - const checkCatchBoundary = t => { - if (!isOutOfBounds(state.current)) return; - timeReachedBoundary = t; - spring$1 = (0, _indexEs.spring)({ - from: state.current, - to: nearestBoundary(state.current), - velocity: (0, _velocityEs.calcGeneratorVelocity)(calcLatest, t, state.current), - damping: bounceDamping, - stiffness: bounceStiffness, - restDistance, - restSpeed - }); - }; - checkCatchBoundary(0); - return t => { - /** - * We need to resolve the friction to figure out if we need a - * spring but we don't want to do this twice per frame. So here - * we flag if we updated for this frame and later if we did - * we can skip doing it again. - */ - let hasUpdatedFrame = false; - if (!spring$1 && timeReachedBoundary === undefined) { - hasUpdatedFrame = true; - applyFriction(t); - checkCatchBoundary(t); - } - /** - * If we have a spring and the provided t is beyond the moment the friction - * animation crossed the min/max boundary, use the spring. - */ - if (timeReachedBoundary !== undefined && t > timeReachedBoundary) { - state.hasReachedTarget = true; - return spring$1(t - timeReachedBoundary); - } else { - state.hasReachedTarget = false; - !hasUpdatedFrame && applyFriction(t); - return state; - } - }; -}; -exports.glide = glide; - -/***/ }), - -/***/ "../../../node_modules/@motionone/generators/dist/index.es.js": -/*!********************************************************************!*\ - !*** ../../../node_modules/@motionone/generators/dist/index.es.js ***! - \********************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -Object.defineProperty(exports, "calcGeneratorVelocity", ({ - enumerable: true, - get: function () { - return _velocityEs.calcGeneratorVelocity; - } -})); -Object.defineProperty(exports, "glide", ({ - enumerable: true, - get: function () { - return _indexEs.glide; - } -})); -Object.defineProperty(exports, "pregenerateKeyframes", ({ - enumerable: true, - get: function () { - return _pregenerateKeyframesEs.pregenerateKeyframes; - } -})); -Object.defineProperty(exports, "spring", ({ - enumerable: true, - get: function () { - return _indexEs2.spring; - } -})); -var _indexEs = __webpack_require__(/*! ./glide/index.es.js */ "../../../node_modules/@motionone/generators/dist/glide/index.es.js"); -var _indexEs2 = __webpack_require__(/*! ./spring/index.es.js */ "../../../node_modules/@motionone/generators/dist/spring/index.es.js"); -var _pregenerateKeyframesEs = __webpack_require__(/*! ./utils/pregenerate-keyframes.es.js */ "../../../node_modules/@motionone/generators/dist/utils/pregenerate-keyframes.es.js"); -var _velocityEs = __webpack_require__(/*! ./utils/velocity.es.js */ "../../../node_modules/@motionone/generators/dist/utils/velocity.es.js"); - -/***/ }), - -/***/ "../../../node_modules/@motionone/generators/dist/spring/defaults.es.js": -/*!******************************************************************************!*\ - !*** ../../../node_modules/@motionone/generators/dist/spring/defaults.es.js ***! - \******************************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.defaults = void 0; -const defaults = { - stiffness: 100.0, - damping: 10.0, - mass: 1.0 -}; -exports.defaults = defaults; - -/***/ }), - -/***/ "../../../node_modules/@motionone/generators/dist/spring/index.es.js": -/*!***************************************************************************!*\ - !*** ../../../node_modules/@motionone/generators/dist/spring/index.es.js ***! - \***************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.spring = void 0; -var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); -var _defaultsEs = __webpack_require__(/*! ./defaults.es.js */ "../../../node_modules/@motionone/generators/dist/spring/defaults.es.js"); -var _utilsEs = __webpack_require__(/*! ./utils.es.js */ "../../../node_modules/@motionone/generators/dist/spring/utils.es.js"); -var _hasReachedTargetEs = __webpack_require__(/*! ../utils/has-reached-target.es.js */ "../../../node_modules/@motionone/generators/dist/utils/has-reached-target.es.js"); -var _velocityEs = __webpack_require__(/*! ../utils/velocity.es.js */ "../../../node_modules/@motionone/generators/dist/utils/velocity.es.js"); -const spring = function () { - let { - stiffness = _defaultsEs.defaults.stiffness, - damping = _defaultsEs.defaults.damping, - mass = _defaultsEs.defaults.mass, - from = 0, - to = 1, - velocity = 0.0, - restSpeed = 2, - restDistance = 0.5 - } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - velocity = velocity ? _utils.time.s(velocity) : 0.0; - const state = { - done: false, - hasReachedTarget: false, - current: from, - target: to - }; - const initialDelta = to - from; - const undampedAngularFreq = Math.sqrt(stiffness / mass) / 1000; - const dampingRatio = (0, _utilsEs.calcDampingRatio)(stiffness, damping, mass); - let resolveSpring; - if (dampingRatio < 1) { - const angularFreq = undampedAngularFreq * Math.sqrt(1 - dampingRatio * dampingRatio); - // Underdamped spring (bouncy) - resolveSpring = t => to - Math.exp(-dampingRatio * undampedAngularFreq * t) * ((-velocity + dampingRatio * undampedAngularFreq * initialDelta) / angularFreq * Math.sin(angularFreq * t) + initialDelta * Math.cos(angularFreq * t)); - } else { - // Critically damped spring - resolveSpring = t => { - return to - Math.exp(-undampedAngularFreq * t) * (initialDelta + (-velocity + undampedAngularFreq * initialDelta) * t); - }; - } - return t => { - state.current = resolveSpring(t); - const currentVelocity = t === 0 ? velocity : (0, _velocityEs.calcGeneratorVelocity)(resolveSpring, t, state.current); - const isBelowVelocityThreshold = Math.abs(currentVelocity) <= restSpeed; - const isBelowDisplacementThreshold = Math.abs(to - state.current) <= restDistance; - state.done = isBelowVelocityThreshold && isBelowDisplacementThreshold; - state.hasReachedTarget = (0, _hasReachedTargetEs.hasReachedTarget)(from, to, state.current); - return state; - }; -}; -exports.spring = spring; - -/***/ }), - -/***/ "../../../node_modules/@motionone/generators/dist/spring/utils.es.js": -/*!***************************************************************************!*\ - !*** ../../../node_modules/@motionone/generators/dist/spring/utils.es.js ***! - \***************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.calcDampingRatio = void 0; -var _defaultsEs = __webpack_require__(/*! ./defaults.es.js */ "../../../node_modules/@motionone/generators/dist/spring/defaults.es.js"); -const calcDampingRatio = function () { - let stiffness = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _defaultsEs.defaults.stiffness; - let damping = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _defaultsEs.defaults.damping; - let mass = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _defaultsEs.defaults.mass; - return damping / (2 * Math.sqrt(stiffness * mass)); -}; -exports.calcDampingRatio = calcDampingRatio; - -/***/ }), - -/***/ "../../../node_modules/@motionone/generators/dist/utils/has-reached-target.es.js": -/*!***************************************************************************************!*\ - !*** ../../../node_modules/@motionone/generators/dist/utils/has-reached-target.es.js ***! - \***************************************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.hasReachedTarget = hasReachedTarget; -function hasReachedTarget(origin, target, current) { - return origin < target && current >= target || origin > target && current <= target; -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/generators/dist/utils/pregenerate-keyframes.es.js": -/*!******************************************************************************************!*\ - !*** ../../../node_modules/@motionone/generators/dist/utils/pregenerate-keyframes.es.js ***! - \******************************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.pregenerateKeyframes = pregenerateKeyframes; -var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); -const timeStep = 10; -const maxDuration = 10000; -function pregenerateKeyframes(generator) { - let toUnit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _utils.noopReturn; - let overshootDuration = undefined; - let timestamp = timeStep; - let state = generator(0); - const keyframes = [toUnit(state.current)]; - while (!state.done && timestamp < maxDuration) { - state = generator(timestamp); - keyframes.push(toUnit(state.done ? state.target : state.current)); - if (overshootDuration === undefined && state.hasReachedTarget) { - overshootDuration = timestamp; - } - timestamp += timeStep; - } - const duration = timestamp - timeStep; - /** - * If generating an animation that didn't actually move, - * generate a second keyframe so we have an origin and target. - */ - if (keyframes.length === 1) keyframes.push(state.current); - return { - keyframes, - duration: duration / 1000, - overshootDuration: (overshootDuration !== null && overshootDuration !== void 0 ? overshootDuration : duration) / 1000 - }; -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/generators/dist/utils/velocity.es.js": -/*!*****************************************************************************!*\ - !*** ../../../node_modules/@motionone/generators/dist/utils/velocity.es.js ***! - \*****************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.calcGeneratorVelocity = calcGeneratorVelocity; -var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); -const sampleT = 5; // ms -function calcGeneratorVelocity(resolveValue, t, current) { - const prevT = Math.max(t - sampleT, 0); - return (0, _utils.velocityPerSecond)(current - resolveValue(prevT), t - prevT); -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/types/dist/MotionValue.es.js": -/*!*********************************************************************!*\ - !*** ../../../node_modules/@motionone/types/dist/MotionValue.es.js ***! - \*********************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.MotionValue = void 0; -/** - * The MotionValue tracks the state of a single animatable - * value. Currently, updatedAt and current are unused. The - * long term idea is to use this to minimise the number - * of DOM reads, and to abstract the DOM interactions here. - */ -class MotionValue { - setAnimation(animation) { - this.animation = animation; - animation === null || animation === void 0 ? void 0 : animation.finished.then(() => this.clearAnimation()).catch(() => {}); - } - clearAnimation() { - this.animation = this.generator = undefined; - } -} -exports.MotionValue = MotionValue; - -/***/ }), - -/***/ "../../../node_modules/@motionone/types/dist/index.es.js": -/*!***************************************************************!*\ - !*** ../../../node_modules/@motionone/types/dist/index.es.js ***! - \***************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -Object.defineProperty(exports, "MotionValue", ({ - enumerable: true, - get: function () { - return _MotionValueEs.MotionValue; - } -})); -var _MotionValueEs = __webpack_require__(/*! ./MotionValue.es.js */ "../../../node_modules/@motionone/types/dist/MotionValue.es.js"); - -/***/ }), - -/***/ "../../../node_modules/@motionone/utils/dist/array.es.js": -/*!***************************************************************!*\ - !*** ../../../node_modules/@motionone/utils/dist/array.es.js ***! - \***************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.addUniqueItem = addUniqueItem; -exports.removeItem = removeItem; -function addUniqueItem(array, item) { - array.indexOf(item) === -1 && array.push(item); -} -function removeItem(arr, item) { - const index = arr.indexOf(item); - index > -1 && arr.splice(index, 1); -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/utils/dist/clamp.es.js": -/*!***************************************************************!*\ - !*** ../../../node_modules/@motionone/utils/dist/clamp.es.js ***! - \***************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.clamp = void 0; -const clamp = (min, max, v) => Math.min(Math.max(v, min), max); -exports.clamp = clamp; - -/***/ }), - -/***/ "../../../node_modules/@motionone/utils/dist/defaults.es.js": -/*!******************************************************************!*\ - !*** ../../../node_modules/@motionone/utils/dist/defaults.es.js ***! - \******************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.defaults = void 0; -const defaults = { - duration: 0.3, - delay: 0, - endDelay: 0, - repeat: 0, - easing: "ease" -}; -exports.defaults = defaults; - -/***/ }), - -/***/ "../../../node_modules/@motionone/utils/dist/easing.es.js": -/*!****************************************************************!*\ - !*** ../../../node_modules/@motionone/utils/dist/easing.es.js ***! - \****************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.getEasingForSegment = getEasingForSegment; -var _isEasingListEs = __webpack_require__(/*! ./is-easing-list.es.js */ "../../../node_modules/@motionone/utils/dist/is-easing-list.es.js"); -var _wrapEs = __webpack_require__(/*! ./wrap.es.js */ "../../../node_modules/@motionone/utils/dist/wrap.es.js"); -function getEasingForSegment(easing, i) { - return (0, _isEasingListEs.isEasingList)(easing) ? easing[(0, _wrapEs.wrap)(0, easing.length, i)] : easing; -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/utils/dist/index.es.js": -/*!***************************************************************!*\ - !*** ../../../node_modules/@motionone/utils/dist/index.es.js ***! - \***************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -Object.defineProperty(exports, "addUniqueItem", ({ - enumerable: true, - get: function () { - return _arrayEs.addUniqueItem; - } -})); -Object.defineProperty(exports, "clamp", ({ - enumerable: true, - get: function () { - return _clampEs.clamp; - } -})); -Object.defineProperty(exports, "defaultOffset", ({ - enumerable: true, - get: function () { - return _offsetEs.defaultOffset; - } -})); -Object.defineProperty(exports, "defaults", ({ - enumerable: true, - get: function () { - return _defaultsEs.defaults; - } -})); -Object.defineProperty(exports, "fillOffset", ({ - enumerable: true, - get: function () { - return _offsetEs.fillOffset; - } -})); -Object.defineProperty(exports, "getEasingForSegment", ({ - enumerable: true, - get: function () { - return _easingEs.getEasingForSegment; - } -})); -Object.defineProperty(exports, "interpolate", ({ - enumerable: true, - get: function () { - return _interpolateEs.interpolate; - } -})); -Object.defineProperty(exports, "isCubicBezier", ({ - enumerable: true, - get: function () { - return _isCubicBezierEs.isCubicBezier; - } -})); -Object.defineProperty(exports, "isEasingGenerator", ({ - enumerable: true, - get: function () { - return _isEasingGeneratorEs.isEasingGenerator; - } -})); -Object.defineProperty(exports, "isEasingList", ({ - enumerable: true, - get: function () { - return _isEasingListEs.isEasingList; - } -})); -Object.defineProperty(exports, "isFunction", ({ - enumerable: true, - get: function () { - return _isFunctionEs.isFunction; - } -})); -Object.defineProperty(exports, "isNumber", ({ - enumerable: true, - get: function () { - return _isNumberEs.isNumber; - } -})); -Object.defineProperty(exports, "isString", ({ - enumerable: true, - get: function () { - return _isStringEs.isString; - } -})); -Object.defineProperty(exports, "mix", ({ - enumerable: true, - get: function () { - return _mixEs.mix; - } -})); -Object.defineProperty(exports, "noop", ({ - enumerable: true, - get: function () { - return _noopEs.noop; - } -})); -Object.defineProperty(exports, "noopReturn", ({ - enumerable: true, - get: function () { - return _noopEs.noopReturn; - } -})); -Object.defineProperty(exports, "progress", ({ - enumerable: true, - get: function () { - return _progressEs.progress; - } -})); -Object.defineProperty(exports, "removeItem", ({ - enumerable: true, - get: function () { - return _arrayEs.removeItem; - } -})); -Object.defineProperty(exports, "time", ({ - enumerable: true, - get: function () { - return _timeEs.time; - } -})); -Object.defineProperty(exports, "velocityPerSecond", ({ - enumerable: true, - get: function () { - return _velocityEs.velocityPerSecond; - } -})); -Object.defineProperty(exports, "wrap", ({ - enumerable: true, - get: function () { - return _wrapEs.wrap; - } -})); -var _arrayEs = __webpack_require__(/*! ./array.es.js */ "../../../node_modules/@motionone/utils/dist/array.es.js"); -var _clampEs = __webpack_require__(/*! ./clamp.es.js */ "../../../node_modules/@motionone/utils/dist/clamp.es.js"); -var _defaultsEs = __webpack_require__(/*! ./defaults.es.js */ "../../../node_modules/@motionone/utils/dist/defaults.es.js"); -var _easingEs = __webpack_require__(/*! ./easing.es.js */ "../../../node_modules/@motionone/utils/dist/easing.es.js"); -var _interpolateEs = __webpack_require__(/*! ./interpolate.es.js */ "../../../node_modules/@motionone/utils/dist/interpolate.es.js"); -var _isCubicBezierEs = __webpack_require__(/*! ./is-cubic-bezier.es.js */ "../../../node_modules/@motionone/utils/dist/is-cubic-bezier.es.js"); -var _isEasingGeneratorEs = __webpack_require__(/*! ./is-easing-generator.es.js */ "../../../node_modules/@motionone/utils/dist/is-easing-generator.es.js"); -var _isEasingListEs = __webpack_require__(/*! ./is-easing-list.es.js */ "../../../node_modules/@motionone/utils/dist/is-easing-list.es.js"); -var _isFunctionEs = __webpack_require__(/*! ./is-function.es.js */ "../../../node_modules/@motionone/utils/dist/is-function.es.js"); -var _isNumberEs = __webpack_require__(/*! ./is-number.es.js */ "../../../node_modules/@motionone/utils/dist/is-number.es.js"); -var _isStringEs = __webpack_require__(/*! ./is-string.es.js */ "../../../node_modules/@motionone/utils/dist/is-string.es.js"); -var _mixEs = __webpack_require__(/*! ./mix.es.js */ "../../../node_modules/@motionone/utils/dist/mix.es.js"); -var _noopEs = __webpack_require__(/*! ./noop.es.js */ "../../../node_modules/@motionone/utils/dist/noop.es.js"); -var _offsetEs = __webpack_require__(/*! ./offset.es.js */ "../../../node_modules/@motionone/utils/dist/offset.es.js"); -var _progressEs = __webpack_require__(/*! ./progress.es.js */ "../../../node_modules/@motionone/utils/dist/progress.es.js"); -var _timeEs = __webpack_require__(/*! ./time.es.js */ "../../../node_modules/@motionone/utils/dist/time.es.js"); -var _velocityEs = __webpack_require__(/*! ./velocity.es.js */ "../../../node_modules/@motionone/utils/dist/velocity.es.js"); -var _wrapEs = __webpack_require__(/*! ./wrap.es.js */ "../../../node_modules/@motionone/utils/dist/wrap.es.js"); - -/***/ }), - -/***/ "../../../node_modules/@motionone/utils/dist/interpolate.es.js": -/*!*********************************************************************!*\ - !*** ../../../node_modules/@motionone/utils/dist/interpolate.es.js ***! - \*********************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.interpolate = interpolate; -var _mixEs = __webpack_require__(/*! ./mix.es.js */ "../../../node_modules/@motionone/utils/dist/mix.es.js"); -var _noopEs = __webpack_require__(/*! ./noop.es.js */ "../../../node_modules/@motionone/utils/dist/noop.es.js"); -var _offsetEs = __webpack_require__(/*! ./offset.es.js */ "../../../node_modules/@motionone/utils/dist/offset.es.js"); -var _progressEs = __webpack_require__(/*! ./progress.es.js */ "../../../node_modules/@motionone/utils/dist/progress.es.js"); -var _easingEs = __webpack_require__(/*! ./easing.es.js */ "../../../node_modules/@motionone/utils/dist/easing.es.js"); -var _clampEs = __webpack_require__(/*! ./clamp.es.js */ "../../../node_modules/@motionone/utils/dist/clamp.es.js"); -function interpolate(output) { - let input = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (0, _offsetEs.defaultOffset)(output.length); - let easing = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _noopEs.noopReturn; - const length = output.length; - /** - * If the input length is lower than the output we - * fill the input to match. This currently assumes the input - * is an animation progress value so is a good candidate for - * moving outside the function. - */ - const remainder = length - input.length; - remainder > 0 && (0, _offsetEs.fillOffset)(input, remainder); - return t => { - let i = 0; - for (; i < length - 2; i++) { - if (t < input[i + 1]) break; - } - let progressInRange = (0, _clampEs.clamp)(0, 1, (0, _progressEs.progress)(input[i], input[i + 1], t)); - const segmentEasing = (0, _easingEs.getEasingForSegment)(easing, i); - progressInRange = segmentEasing(progressInRange); - return (0, _mixEs.mix)(output[i], output[i + 1], progressInRange); - }; -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/utils/dist/is-cubic-bezier.es.js": -/*!*************************************************************************!*\ - !*** ../../../node_modules/@motionone/utils/dist/is-cubic-bezier.es.js ***! - \*************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.isCubicBezier = void 0; -var _isNumberEs = __webpack_require__(/*! ./is-number.es.js */ "../../../node_modules/@motionone/utils/dist/is-number.es.js"); -const isCubicBezier = easing => Array.isArray(easing) && (0, _isNumberEs.isNumber)(easing[0]); -exports.isCubicBezier = isCubicBezier; - -/***/ }), - -/***/ "../../../node_modules/@motionone/utils/dist/is-easing-generator.es.js": -/*!*****************************************************************************!*\ - !*** ../../../node_modules/@motionone/utils/dist/is-easing-generator.es.js ***! - \*****************************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.isEasingGenerator = void 0; -const isEasingGenerator = easing => typeof easing === "object" && Boolean(easing.createAnimation); -exports.isEasingGenerator = isEasingGenerator; - -/***/ }), - -/***/ "../../../node_modules/@motionone/utils/dist/is-easing-list.es.js": -/*!************************************************************************!*\ - !*** ../../../node_modules/@motionone/utils/dist/is-easing-list.es.js ***! - \************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.isEasingList = void 0; -var _isNumberEs = __webpack_require__(/*! ./is-number.es.js */ "../../../node_modules/@motionone/utils/dist/is-number.es.js"); -const isEasingList = easing => Array.isArray(easing) && !(0, _isNumberEs.isNumber)(easing[0]); -exports.isEasingList = isEasingList; - -/***/ }), - -/***/ "../../../node_modules/@motionone/utils/dist/is-function.es.js": -/*!*********************************************************************!*\ - !*** ../../../node_modules/@motionone/utils/dist/is-function.es.js ***! - \*********************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.isFunction = void 0; -const isFunction = value => typeof value === "function"; -exports.isFunction = isFunction; - -/***/ }), - -/***/ "../../../node_modules/@motionone/utils/dist/is-number.es.js": -/*!*******************************************************************!*\ - !*** ../../../node_modules/@motionone/utils/dist/is-number.es.js ***! - \*******************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.isNumber = void 0; -const isNumber = value => typeof value === "number"; -exports.isNumber = isNumber; - -/***/ }), - -/***/ "../../../node_modules/@motionone/utils/dist/is-string.es.js": -/*!*******************************************************************!*\ - !*** ../../../node_modules/@motionone/utils/dist/is-string.es.js ***! - \*******************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.isString = void 0; -const isString = value => typeof value === "string"; -exports.isString = isString; - -/***/ }), - -/***/ "../../../node_modules/@motionone/utils/dist/mix.es.js": -/*!*************************************************************!*\ - !*** ../../../node_modules/@motionone/utils/dist/mix.es.js ***! - \*************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.mix = void 0; -const mix = (min, max, progress) => -progress * min + progress * max + min; -exports.mix = mix; - -/***/ }), - -/***/ "../../../node_modules/@motionone/utils/dist/noop.es.js": -/*!**************************************************************!*\ - !*** ../../../node_modules/@motionone/utils/dist/noop.es.js ***! - \**************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.noopReturn = exports.noop = void 0; -const noop = () => {}; -exports.noop = noop; -const noopReturn = v => v; -exports.noopReturn = noopReturn; - -/***/ }), - -/***/ "../../../node_modules/@motionone/utils/dist/offset.es.js": -/*!****************************************************************!*\ - !*** ../../../node_modules/@motionone/utils/dist/offset.es.js ***! - \****************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.defaultOffset = defaultOffset; -exports.fillOffset = fillOffset; -var _mixEs = __webpack_require__(/*! ./mix.es.js */ "../../../node_modules/@motionone/utils/dist/mix.es.js"); -var _progressEs = __webpack_require__(/*! ./progress.es.js */ "../../../node_modules/@motionone/utils/dist/progress.es.js"); -function fillOffset(offset, remaining) { - const min = offset[offset.length - 1]; - for (let i = 1; i <= remaining; i++) { - const offsetProgress = (0, _progressEs.progress)(0, remaining, i); - offset.push((0, _mixEs.mix)(min, 1, offsetProgress)); - } -} -function defaultOffset(length) { - const offset = [0]; - fillOffset(offset, length - 1); - return offset; -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/utils/dist/progress.es.js": -/*!******************************************************************!*\ - !*** ../../../node_modules/@motionone/utils/dist/progress.es.js ***! - \******************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.progress = void 0; -const progress = (min, max, value) => max - min === 0 ? 1 : (value - min) / (max - min); -exports.progress = progress; - -/***/ }), - -/***/ "../../../node_modules/@motionone/utils/dist/time.es.js": -/*!**************************************************************!*\ - !*** ../../../node_modules/@motionone/utils/dist/time.es.js ***! - \**************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.time = void 0; -const time = { - ms: seconds => seconds * 1000, - s: milliseconds => milliseconds / 1000 -}; -exports.time = time; - -/***/ }), - -/***/ "../../../node_modules/@motionone/utils/dist/velocity.es.js": -/*!******************************************************************!*\ - !*** ../../../node_modules/@motionone/utils/dist/velocity.es.js ***! - \******************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.velocityPerSecond = velocityPerSecond; -/* - Convert velocity into velocity per second - - @param [number]: Unit per frame - @param [number]: Frame duration in ms -*/ -function velocityPerSecond(velocity, frameDuration) { - return frameDuration ? velocity * (1000 / frameDuration) : 0; -} - -/***/ }), - -/***/ "../../../node_modules/@motionone/utils/dist/wrap.es.js": -/*!**************************************************************!*\ - !*** ../../../node_modules/@motionone/utils/dist/wrap.es.js ***! - \**************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.wrap = void 0; -const wrap = (min, max, v) => { - const rangeSize = max - min; - return ((v - min) % rangeSize + rangeSize) % rangeSize + min; -}; -exports.wrap = wrap; - -/***/ }), - -/***/ "../../../node_modules/@n1ru4l/push-pull-async-iterable-iterator/index.js": -/*!********************************************************************************!*\ - !*** ../../../node_modules/@n1ru4l/push-pull-async-iterable-iterator/index.js ***! - \********************************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -function createDeferred() { - const d = {}; - d.promise = new Promise((resolve, reject) => { - d.resolve = resolve; - d.reject = reject; - }); - return d; -} -const SYMBOL_FINISHED = Symbol(); -const SYMBOL_NEW_VALUE = Symbol(); -/** - * makePushPullAsyncIterableIterator - * - * The iterable will publish values until return or throw is called. - * Afterwards it is in the completed state and cannot be used for publishing any further values. - * It will handle back-pressure and keep pushed values until they are consumed by a source. - */ -function makePushPullAsyncIterableIterator() { - let isRunning = true; - const values = []; - let newValueD = createDeferred(); - const finishedD = createDeferred(); - const asyncIterableIterator = async function* PushPullAsyncIterableIterator() { - while (true) { - if (values.length > 0) { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - yield values.shift(); - } else { - const result = await Promise.race([newValueD.promise, finishedD.promise]); - if (result === SYMBOL_FINISHED) { - break; - } - if (result !== SYMBOL_NEW_VALUE) { - throw result; - } - } - } - }(); - function pushValue(value) { - if (isRunning === false) { - // TODO: Should this throw? - return; - } - values.push(value); - newValueD.resolve(SYMBOL_NEW_VALUE); - newValueD = createDeferred(); - } - // We monkey patch the original generator for clean-up - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const originalReturn = asyncIterableIterator.return.bind(asyncIterableIterator); - asyncIterableIterator.return = function () { - isRunning = false; - finishedD.resolve(SYMBOL_FINISHED); - return originalReturn(...arguments); - }; - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const originalThrow = asyncIterableIterator.throw.bind(asyncIterableIterator); - asyncIterableIterator.throw = err => { - isRunning = false; - finishedD.resolve(err); - return originalThrow(err); - }; - return { - pushValue, - asyncIterableIterator - }; -} -const makeAsyncIterableIteratorFromSink = make => { - const { - pushValue, - asyncIterableIterator - } = makePushPullAsyncIterableIterator(); - const dispose = make({ - next: value => { - pushValue(value); - }, - complete: () => { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - asyncIterableIterator.return(); - }, - error: err => { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - asyncIterableIterator.throw(err); - } - }); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const originalReturn = asyncIterableIterator.return; - let returnValue = undefined; - asyncIterableIterator.return = () => { - if (returnValue === undefined) { - dispose(); - returnValue = originalReturn(); - } - return returnValue; - }; - return asyncIterableIterator; -}; -function applyAsyncIterableIteratorToSink(asyncIterableIterator, sink) { - const run = async () => { - try { - for await (const value of asyncIterableIterator) { - sink.next(value); - } - sink.complete(); - } catch (err) { - sink.error(err); - } - }; - run(); - return () => { - var _a; - (_a = asyncIterableIterator.return) === null || _a === void 0 ? void 0 : _a.call(asyncIterableIterator); - }; -} -function isAsyncIterable(input) { - return typeof input === "object" && input !== null && ( - // The AsyncGenerator check is for Safari on iOS which currently does not have - // Symbol.asyncIterator implemented - // That means every custom AsyncIterable must be built using a AsyncGeneratorFunction (async function * () {}) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - input[Symbol.toStringTag] === "AsyncGenerator" || Symbol.asyncIterator && Symbol.asyncIterator in input); -} -exports.applyAsyncIterableIteratorToSink = applyAsyncIterableIteratorToSink; -exports.isAsyncIterable = isAsyncIterable; -exports.makeAsyncIterableIteratorFromSink = makeAsyncIterableIteratorFromSink; -exports.makePushPullAsyncIterableIterator = makePushPullAsyncIterableIterator; - -/***/ }), - -/***/ "../../../node_modules/@radix-ui/primitive/dist/index.js": -/*!***************************************************************!*\ - !*** ../../../node_modules/@radix-ui/primitive/dist/index.js ***! - \***************************************************************/ -/***/ (function(module) { - - - -function $parcel$export(e, n, v, s) { - Object.defineProperty(e, n, { - get: v, - set: s, - enumerable: true, - configurable: true - }); -} -$parcel$export(module.exports, "composeEventHandlers", () => $1a6a90a521dcd173$export$b9ecd428b558ff10); -function $1a6a90a521dcd173$export$b9ecd428b558ff10(originalEventHandler, ourEventHandler) { - let { - checkForDefaultPrevented = true - } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - return function handleEvent(event) { - originalEventHandler === null || originalEventHandler === void 0 || originalEventHandler(event); - if (checkForDefaultPrevented === false || !event.defaultPrevented) return ourEventHandler === null || ourEventHandler === void 0 ? void 0 : ourEventHandler(event); - }; -} - -/***/ }), - -/***/ "../../../node_modules/@radix-ui/react-arrow/dist/index.js": -/*!*****************************************************************!*\ - !*** ../../../node_modules/@radix-ui/react-arrow/dist/index.js ***! - \*****************************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - - -var $eQpDd$babelruntimehelpersextends = __webpack_require__(/*! @babel/runtime/helpers/extends */ "../../../node_modules/@babel/runtime/helpers/extends.js"); -var $eQpDd$react = __webpack_require__(/*! react */ "react"); -var $eQpDd$radixuireactprimitive = __webpack_require__(/*! @radix-ui/react-primitive */ "../../../node_modules/@radix-ui/react-primitive/dist/index.js"); -function $parcel$export(e, n, v, s) { - Object.defineProperty(e, n, { - get: v, - set: s, - enumerable: true, - configurable: true - }); -} -function $parcel$interopDefault(a) { - return a && a.__esModule ? a.default : a; -} -$parcel$export(module.exports, "Arrow", () => $09f4ad68a9251bc3$export$21b07c8f274aebd5); -$parcel$export(module.exports, "Root", () => $09f4ad68a9251bc3$export$be92b6f5f03c0fe9); - -/* ------------------------------------------------------------------------------------------------- - * Arrow - * -----------------------------------------------------------------------------------------------*/ -const $09f4ad68a9251bc3$var$NAME = 'Arrow'; -const $09f4ad68a9251bc3$export$21b07c8f274aebd5 = /*#__PURE__*/$eQpDd$react.forwardRef((props, forwardedRef) => { - const { - children: children, - width = 10, - height = 5, - ...arrowProps - } = props; - return /*#__PURE__*/$eQpDd$react.createElement($eQpDd$radixuireactprimitive.Primitive.svg, $parcel$interopDefault($eQpDd$babelruntimehelpersextends)({}, arrowProps, { - ref: forwardedRef, - width: width, - height: height, - viewBox: "0 0 30 10", - preserveAspectRatio: "none" - }), props.asChild ? children : /*#__PURE__*/$eQpDd$react.createElement("polygon", { - points: "0,0 30,0 15,10" - })); -}); -/*#__PURE__*/ -Object.assign($09f4ad68a9251bc3$export$21b07c8f274aebd5, { - displayName: $09f4ad68a9251bc3$var$NAME -}); -/* -----------------------------------------------------------------------------------------------*/ -const $09f4ad68a9251bc3$export$be92b6f5f03c0fe9 = $09f4ad68a9251bc3$export$21b07c8f274aebd5; - -/***/ }), - -/***/ "../../../node_modules/@radix-ui/react-collection/dist/index.js": -/*!**********************************************************************!*\ - !*** ../../../node_modules/@radix-ui/react-collection/dist/index.js ***! - \**********************************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - - -var $hnlpS$react = __webpack_require__(/*! react */ "react"); -var $hnlpS$radixuireactcontext = __webpack_require__(/*! @radix-ui/react-context */ "../../../node_modules/@radix-ui/react-context/dist/index.js"); -var $hnlpS$radixuireactcomposerefs = __webpack_require__(/*! @radix-ui/react-compose-refs */ "../../../node_modules/@radix-ui/react-compose-refs/dist/index.js"); -var $hnlpS$radixuireactslot = __webpack_require__(/*! @radix-ui/react-slot */ "../../../node_modules/@radix-ui/react-slot/dist/index.js"); -function $parcel$export(e, n, v, s) { - Object.defineProperty(e, n, { - get: v, - set: s, - enumerable: true, - configurable: true - }); -} -function $parcel$interopDefault(a) { - return a && a.__esModule ? a.default : a; -} -$parcel$export(module.exports, "createCollection", () => $1a96635ec239608b$export$c74125a8e3af6bb2); - -// We have resorted to returning slots directly rather than exposing primitives that can then -// be slotted like ``. -// This is because we encountered issues with generic types that cannot be statically analysed -// due to creating them dynamically via createCollection. -function $1a96635ec239608b$export$c74125a8e3af6bb2(name) { - /* ----------------------------------------------------------------------------------------------- - * CollectionProvider - * ---------------------------------------------------------------------------------------------*/ - const PROVIDER_NAME = name + 'CollectionProvider'; - const [createCollectionContext, createCollectionScope] = $hnlpS$radixuireactcontext.createContextScope(PROVIDER_NAME); - const [CollectionProviderImpl, useCollectionContext] = createCollectionContext(PROVIDER_NAME, { - collectionRef: { - current: null - }, - itemMap: new Map() - }); - const CollectionProvider = props => { - const { - scope: scope, - children: children - } = props; - const ref = $parcel$interopDefault($hnlpS$react).useRef(null); - const itemMap = $parcel$interopDefault($hnlpS$react).useRef(new Map()).current; - return /*#__PURE__*/$parcel$interopDefault($hnlpS$react).createElement(CollectionProviderImpl, { - scope: scope, - itemMap: itemMap, - collectionRef: ref - }, children); - }; - /*#__PURE__*/ - Object.assign(CollectionProvider, { - displayName: PROVIDER_NAME - }); - /* ----------------------------------------------------------------------------------------------- - * CollectionSlot - * ---------------------------------------------------------------------------------------------*/ - const COLLECTION_SLOT_NAME = name + 'CollectionSlot'; - const CollectionSlot = /*#__PURE__*/$parcel$interopDefault($hnlpS$react).forwardRef((props, forwardedRef) => { - const { - scope: scope, - children: children - } = props; - const context = useCollectionContext(COLLECTION_SLOT_NAME, scope); - const composedRefs = $hnlpS$radixuireactcomposerefs.useComposedRefs(forwardedRef, context.collectionRef); - return /*#__PURE__*/$parcel$interopDefault($hnlpS$react).createElement($hnlpS$radixuireactslot.Slot, { - ref: composedRefs - }, children); - }); - /*#__PURE__*/ - Object.assign(CollectionSlot, { - displayName: COLLECTION_SLOT_NAME - }); - /* ----------------------------------------------------------------------------------------------- - * CollectionItem - * ---------------------------------------------------------------------------------------------*/ - const ITEM_SLOT_NAME = name + 'CollectionItemSlot'; - const ITEM_DATA_ATTR = 'data-radix-collection-item'; - const CollectionItemSlot = /*#__PURE__*/$parcel$interopDefault($hnlpS$react).forwardRef((props, forwardedRef) => { - const { - scope: scope, - children: children, - ...itemData - } = props; - const ref = $parcel$interopDefault($hnlpS$react).useRef(null); - const composedRefs = $hnlpS$radixuireactcomposerefs.useComposedRefs(forwardedRef, ref); - const context = useCollectionContext(ITEM_SLOT_NAME, scope); - $parcel$interopDefault($hnlpS$react).useEffect(() => { - context.itemMap.set(ref, { - ref: ref, - ...itemData - }); - return () => void context.itemMap.delete(ref); - }); - return /*#__PURE__*/$parcel$interopDefault($hnlpS$react).createElement($hnlpS$radixuireactslot.Slot, { - [ITEM_DATA_ATTR]: '', - ref: composedRefs - }, children); - }); - /*#__PURE__*/ - Object.assign(CollectionItemSlot, { - displayName: ITEM_SLOT_NAME - }); - /* ----------------------------------------------------------------------------------------------- - * useCollection - * ---------------------------------------------------------------------------------------------*/ - function useCollection(scope) { - const context = useCollectionContext(name + 'CollectionConsumer', scope); - const getItems = $parcel$interopDefault($hnlpS$react).useCallback(() => { - const collectionNode = context.collectionRef.current; - if (!collectionNode) return []; - const orderedNodes = Array.from(collectionNode.querySelectorAll(`[${ITEM_DATA_ATTR}]`)); - const items = Array.from(context.itemMap.values()); - const orderedItems = items.sort((a, b) => orderedNodes.indexOf(a.ref.current) - orderedNodes.indexOf(b.ref.current)); - return orderedItems; - }, [context.collectionRef, context.itemMap]); - return getItems; - } - return [{ - Provider: CollectionProvider, - Slot: CollectionSlot, - ItemSlot: CollectionItemSlot - }, useCollection, createCollectionScope]; -} - -/***/ }), - -/***/ "../../../node_modules/@radix-ui/react-compose-refs/dist/index.js": -/*!************************************************************************!*\ - !*** ../../../node_modules/@radix-ui/react-compose-refs/dist/index.js ***! - \************************************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - - -var $dJwbH$react = __webpack_require__(/*! react */ "react"); -function $parcel$export(e, n, v, s) { - Object.defineProperty(e, n, { - get: v, - set: s, - enumerable: true, - configurable: true - }); -} -$parcel$export(module.exports, "composeRefs", () => $9c2aaba23466b352$export$43e446d32b3d21af); -$parcel$export(module.exports, "useComposedRefs", () => $9c2aaba23466b352$export$c7b2cbe3552a0d05); - -/** - * Set a given ref to a given value - * This utility takes care of different types of refs: callback refs and RefObject(s) - */ -function $9c2aaba23466b352$var$setRef(ref, value) { - if (typeof ref === 'function') ref(value);else if (ref !== null && ref !== undefined) ref.current = value; -} -/** - * A utility to compose multiple refs together - * Accepts callback refs and RefObject(s) - */ -function $9c2aaba23466b352$export$43e446d32b3d21af() { - for (var _len = arguments.length, refs = new Array(_len), _key = 0; _key < _len; _key++) { - refs[_key] = arguments[_key]; - } - return node => refs.forEach(ref => $9c2aaba23466b352$var$setRef(ref, node)); -} -/** - * A custom hook that composes multiple refs - * Accepts callback refs and RefObject(s) - */ -function $9c2aaba23466b352$export$c7b2cbe3552a0d05() { - for (var _len2 = arguments.length, refs = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - refs[_key2] = arguments[_key2]; - } - // eslint-disable-next-line react-hooks/exhaustive-deps - return $dJwbH$react.useCallback($9c2aaba23466b352$export$43e446d32b3d21af(...refs), refs); -} - -/***/ }), - -/***/ "../../../node_modules/@radix-ui/react-context/dist/index.js": -/*!*******************************************************************!*\ - !*** ../../../node_modules/@radix-ui/react-context/dist/index.js ***! - \*******************************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - - -var $4O1Ne$react = __webpack_require__(/*! react */ "react"); -function $parcel$export(e, n, v, s) { - Object.defineProperty(e, n, { - get: v, - set: s, - enumerable: true, - configurable: true - }); -} -$parcel$export(module.exports, "createContext", () => $dec3cc0142d4f286$export$fd42f52fd3ae1109); -$parcel$export(module.exports, "createContextScope", () => $dec3cc0142d4f286$export$50c7b4e9d9f19c1); -function $dec3cc0142d4f286$export$fd42f52fd3ae1109(rootComponentName, defaultContext) { - const Context = /*#__PURE__*/$4O1Ne$react.createContext(defaultContext); - function Provider(props) { - const { - children: children, - ...context - } = props; // Only re-memoize when prop values change - // eslint-disable-next-line react-hooks/exhaustive-deps - const value = $4O1Ne$react.useMemo(() => context, Object.values(context)); - return /*#__PURE__*/$4O1Ne$react.createElement(Context.Provider, { - value: value - }, children); - } - function useContext(consumerName) { - const context = $4O1Ne$react.useContext(Context); - if (context) return context; - if (defaultContext !== undefined) return defaultContext; // if a defaultContext wasn't specified, it's a required context. - throw new Error(`\`${consumerName}\` must be used within \`${rootComponentName}\``); - } - Provider.displayName = rootComponentName + 'Provider'; - return [Provider, useContext]; -} -/* ------------------------------------------------------------------------------------------------- - * createContextScope - * -----------------------------------------------------------------------------------------------*/ -function $dec3cc0142d4f286$export$50c7b4e9d9f19c1(scopeName) { - let createContextScopeDeps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; - let defaultContexts = []; - /* ----------------------------------------------------------------------------------------------- - * createContext - * ---------------------------------------------------------------------------------------------*/ - function $dec3cc0142d4f286$export$fd42f52fd3ae1109(rootComponentName, defaultContext) { - const BaseContext = /*#__PURE__*/$4O1Ne$react.createContext(defaultContext); - const index = defaultContexts.length; - defaultContexts = [...defaultContexts, defaultContext]; - function Provider(props) { - const { - scope: scope, - children: children, - ...context - } = props; - const Context = (scope === null || scope === void 0 ? void 0 : scope[scopeName][index]) || BaseContext; // Only re-memoize when prop values change - // eslint-disable-next-line react-hooks/exhaustive-deps - const value = $4O1Ne$react.useMemo(() => context, Object.values(context)); - return /*#__PURE__*/$4O1Ne$react.createElement(Context.Provider, { - value: value - }, children); - } - function useContext(consumerName, scope) { - const Context = (scope === null || scope === void 0 ? void 0 : scope[scopeName][index]) || BaseContext; - const context = $4O1Ne$react.useContext(Context); - if (context) return context; - if (defaultContext !== undefined) return defaultContext; // if a defaultContext wasn't specified, it's a required context. - throw new Error(`\`${consumerName}\` must be used within \`${rootComponentName}\``); - } - Provider.displayName = rootComponentName + 'Provider'; - return [Provider, useContext]; - } - /* ----------------------------------------------------------------------------------------------- - * createScope - * ---------------------------------------------------------------------------------------------*/ - const createScope = () => { - const scopeContexts = defaultContexts.map(defaultContext => { - return /*#__PURE__*/$4O1Ne$react.createContext(defaultContext); - }); - return function useScope(scope) { - const contexts = (scope === null || scope === void 0 ? void 0 : scope[scopeName]) || scopeContexts; - return $4O1Ne$react.useMemo(() => ({ - [`__scope${scopeName}`]: { - ...scope, - [scopeName]: contexts - } - }), [scope, contexts]); - }; - }; - createScope.scopeName = scopeName; - return [$dec3cc0142d4f286$export$fd42f52fd3ae1109, $dec3cc0142d4f286$var$composeContextScopes(createScope, ...createContextScopeDeps)]; -} -/* ------------------------------------------------------------------------------------------------- - * composeContextScopes - * -----------------------------------------------------------------------------------------------*/ -function $dec3cc0142d4f286$var$composeContextScopes() { - for (var _len = arguments.length, scopes = new Array(_len), _key = 0; _key < _len; _key++) { - scopes[_key] = arguments[_key]; - } - const baseScope = scopes[0]; - if (scopes.length === 1) return baseScope; - const createScope1 = () => { - const scopeHooks = scopes.map(createScope => ({ - useScope: createScope(), - scopeName: createScope.scopeName - })); - return function useComposedScopes(overrideScopes) { - const nextScopes1 = scopeHooks.reduce((nextScopes, _ref) => { - let { - useScope: useScope, - scopeName: scopeName - } = _ref; - // We are calling a hook inside a callback which React warns against to avoid inconsistent - // renders, however, scoping doesn't have render side effects so we ignore the rule. - // eslint-disable-next-line react-hooks/rules-of-hooks - const scopeProps = useScope(overrideScopes); - const currentScope = scopeProps[`__scope${scopeName}`]; - return { - ...nextScopes, - ...currentScope - }; - }, {}); - return $4O1Ne$react.useMemo(() => ({ - [`__scope${baseScope.scopeName}`]: nextScopes1 - }), [nextScopes1]); - }; - }; - createScope1.scopeName = baseScope.scopeName; - return createScope1; -} - -/***/ }), - -/***/ "../../../node_modules/@radix-ui/react-dialog/dist/index.js": -/*!******************************************************************!*\ - !*** ../../../node_modules/@radix-ui/react-dialog/dist/index.js ***! - \******************************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - - -var $aJCrN$babelruntimehelpersextends = __webpack_require__(/*! @babel/runtime/helpers/extends */ "../../../node_modules/@babel/runtime/helpers/extends.js"); -var $aJCrN$react = __webpack_require__(/*! react */ "react"); -var $aJCrN$radixuiprimitive = __webpack_require__(/*! @radix-ui/primitive */ "../../../node_modules/@radix-ui/primitive/dist/index.js"); -var $aJCrN$radixuireactcomposerefs = __webpack_require__(/*! @radix-ui/react-compose-refs */ "../../../node_modules/@radix-ui/react-compose-refs/dist/index.js"); -var $aJCrN$radixuireactcontext = __webpack_require__(/*! @radix-ui/react-context */ "../../../node_modules/@radix-ui/react-context/dist/index.js"); -var $aJCrN$radixuireactid = __webpack_require__(/*! @radix-ui/react-id */ "../../../node_modules/@radix-ui/react-id/dist/index.js"); -var $aJCrN$radixuireactusecontrollablestate = __webpack_require__(/*! @radix-ui/react-use-controllable-state */ "../../../node_modules/@radix-ui/react-use-controllable-state/dist/index.js"); -var $aJCrN$radixuireactdismissablelayer = __webpack_require__(/*! @radix-ui/react-dismissable-layer */ "../../../node_modules/@radix-ui/react-dismissable-layer/dist/index.js"); -var $aJCrN$radixuireactfocusscope = __webpack_require__(/*! @radix-ui/react-focus-scope */ "../../../node_modules/@radix-ui/react-focus-scope/dist/index.js"); -var $aJCrN$radixuireactportal = __webpack_require__(/*! @radix-ui/react-portal */ "../../../node_modules/@radix-ui/react-portal/dist/index.js"); -var $aJCrN$radixuireactpresence = __webpack_require__(/*! @radix-ui/react-presence */ "../../../node_modules/@radix-ui/react-presence/dist/index.js"); -var $aJCrN$radixuireactprimitive = __webpack_require__(/*! @radix-ui/react-primitive */ "../../../node_modules/@radix-ui/react-primitive/dist/index.js"); -var $aJCrN$radixuireactfocusguards = __webpack_require__(/*! @radix-ui/react-focus-guards */ "../../../node_modules/@radix-ui/react-focus-guards/dist/index.js"); -var $aJCrN$reactremovescroll = __webpack_require__(/*! react-remove-scroll */ "../../../node_modules/react-remove-scroll/dist/es2015/index.js"); -var $aJCrN$ariahidden = __webpack_require__(/*! aria-hidden */ "../../../node_modules/aria-hidden/dist/es2015/index.js"); -var $aJCrN$radixuireactslot = __webpack_require__(/*! @radix-ui/react-slot */ "../../../node_modules/@radix-ui/react-slot/dist/index.js"); -function $parcel$export(e, n, v, s) { - Object.defineProperty(e, n, { - get: v, - set: s, - enumerable: true, - configurable: true - }); -} -function $parcel$interopDefault(a) { - return a && a.__esModule ? a.default : a; -} -$parcel$export(module.exports, "createDialogScope", () => $f4833395aa1bca1a$export$cc702773b8ea3e41); -$parcel$export(module.exports, "Dialog", () => $f4833395aa1bca1a$export$3ddf2d174ce01153); -$parcel$export(module.exports, "DialogTrigger", () => $f4833395aa1bca1a$export$2e1e1122cf0cba88); -$parcel$export(module.exports, "DialogPortal", () => $f4833395aa1bca1a$export$dad7c95542bacce0); -$parcel$export(module.exports, "DialogOverlay", () => $f4833395aa1bca1a$export$bd1d06c79be19e17); -$parcel$export(module.exports, "DialogContent", () => $f4833395aa1bca1a$export$b6d9565de1e068cf); -$parcel$export(module.exports, "DialogTitle", () => $f4833395aa1bca1a$export$16f7638e4a34b909); -$parcel$export(module.exports, "DialogDescription", () => $f4833395aa1bca1a$export$94e94c2ec2c954d5); -$parcel$export(module.exports, "DialogClose", () => $f4833395aa1bca1a$export$fba2fb7cd781b7ac); -$parcel$export(module.exports, "Root", () => $f4833395aa1bca1a$export$be92b6f5f03c0fe9); -$parcel$export(module.exports, "Trigger", () => $f4833395aa1bca1a$export$41fb9f06171c75f4); -$parcel$export(module.exports, "Portal", () => $f4833395aa1bca1a$export$602eac185826482c); -$parcel$export(module.exports, "Overlay", () => $f4833395aa1bca1a$export$c6fdb837b070b4ff); -$parcel$export(module.exports, "Content", () => $f4833395aa1bca1a$export$7c6e2c02157bb7d2); -$parcel$export(module.exports, "Title", () => $f4833395aa1bca1a$export$f99233281efd08a0); -$parcel$export(module.exports, "Description", () => $f4833395aa1bca1a$export$393edc798c47379d); -$parcel$export(module.exports, "Close", () => $f4833395aa1bca1a$export$f39c2d165cd861fe); -$parcel$export(module.exports, "WarningProvider", () => $f4833395aa1bca1a$export$69b62a49393917d6); - -/* ------------------------------------------------------------------------------------------------- - * Dialog - * -----------------------------------------------------------------------------------------------*/ -const $f4833395aa1bca1a$var$DIALOG_NAME = 'Dialog'; -const [$f4833395aa1bca1a$var$createDialogContext, $f4833395aa1bca1a$export$cc702773b8ea3e41] = $aJCrN$radixuireactcontext.createContextScope($f4833395aa1bca1a$var$DIALOG_NAME); -const [$f4833395aa1bca1a$var$DialogProvider, $f4833395aa1bca1a$var$useDialogContext] = $f4833395aa1bca1a$var$createDialogContext($f4833395aa1bca1a$var$DIALOG_NAME); -const $f4833395aa1bca1a$export$3ddf2d174ce01153 = props => { - const { - __scopeDialog: __scopeDialog, - children: children, - open: openProp, - defaultOpen: defaultOpen, - onOpenChange: onOpenChange, - modal = true - } = props; - const triggerRef = $aJCrN$react.useRef(null); - const contentRef = $aJCrN$react.useRef(null); - const [open = false, setOpen] = $aJCrN$radixuireactusecontrollablestate.useControllableState({ - prop: openProp, - defaultProp: defaultOpen, - onChange: onOpenChange - }); - return /*#__PURE__*/$aJCrN$react.createElement($f4833395aa1bca1a$var$DialogProvider, { - scope: __scopeDialog, - triggerRef: triggerRef, - contentRef: contentRef, - contentId: $aJCrN$radixuireactid.useId(), - titleId: $aJCrN$radixuireactid.useId(), - descriptionId: $aJCrN$radixuireactid.useId(), - open: open, - onOpenChange: setOpen, - onOpenToggle: $aJCrN$react.useCallback(() => setOpen(prevOpen => !prevOpen), [setOpen]), - modal: modal - }, children); -}; -/*#__PURE__*/ -Object.assign($f4833395aa1bca1a$export$3ddf2d174ce01153, { - displayName: $f4833395aa1bca1a$var$DIALOG_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * DialogTrigger - * -----------------------------------------------------------------------------------------------*/ -const $f4833395aa1bca1a$var$TRIGGER_NAME = 'DialogTrigger'; -const $f4833395aa1bca1a$export$2e1e1122cf0cba88 = /*#__PURE__*/$aJCrN$react.forwardRef((props, forwardedRef) => { - const { - __scopeDialog: __scopeDialog, - ...triggerProps - } = props; - const context = $f4833395aa1bca1a$var$useDialogContext($f4833395aa1bca1a$var$TRIGGER_NAME, __scopeDialog); - const composedTriggerRef = $aJCrN$radixuireactcomposerefs.useComposedRefs(forwardedRef, context.triggerRef); - return /*#__PURE__*/$aJCrN$react.createElement($aJCrN$radixuireactprimitive.Primitive.button, $parcel$interopDefault($aJCrN$babelruntimehelpersextends)({ - type: "button", - "aria-haspopup": "dialog", - "aria-expanded": context.open, - "aria-controls": context.contentId, - "data-state": $f4833395aa1bca1a$var$getState(context.open) - }, triggerProps, { - ref: composedTriggerRef, - onClick: $aJCrN$radixuiprimitive.composeEventHandlers(props.onClick, context.onOpenToggle) - })); -}); -/*#__PURE__*/ -Object.assign($f4833395aa1bca1a$export$2e1e1122cf0cba88, { - displayName: $f4833395aa1bca1a$var$TRIGGER_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * DialogPortal - * -----------------------------------------------------------------------------------------------*/ -const $f4833395aa1bca1a$var$PORTAL_NAME = 'DialogPortal'; -const [$f4833395aa1bca1a$var$PortalProvider, $f4833395aa1bca1a$var$usePortalContext] = $f4833395aa1bca1a$var$createDialogContext($f4833395aa1bca1a$var$PORTAL_NAME, { - forceMount: undefined -}); -const $f4833395aa1bca1a$export$dad7c95542bacce0 = props => { - const { - __scopeDialog: __scopeDialog, - forceMount: forceMount, - children: children, - container: container - } = props; - const context = $f4833395aa1bca1a$var$useDialogContext($f4833395aa1bca1a$var$PORTAL_NAME, __scopeDialog); - return /*#__PURE__*/$aJCrN$react.createElement($f4833395aa1bca1a$var$PortalProvider, { - scope: __scopeDialog, - forceMount: forceMount - }, $aJCrN$react.Children.map(children, child => /*#__PURE__*/$aJCrN$react.createElement($aJCrN$radixuireactpresence.Presence, { - present: forceMount || context.open - }, /*#__PURE__*/$aJCrN$react.createElement($aJCrN$radixuireactportal.Portal, { - asChild: true, - container: container - }, child)))); -}; -/*#__PURE__*/ -Object.assign($f4833395aa1bca1a$export$dad7c95542bacce0, { - displayName: $f4833395aa1bca1a$var$PORTAL_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * DialogOverlay - * -----------------------------------------------------------------------------------------------*/ -const $f4833395aa1bca1a$var$OVERLAY_NAME = 'DialogOverlay'; -const $f4833395aa1bca1a$export$bd1d06c79be19e17 = /*#__PURE__*/$aJCrN$react.forwardRef((props, forwardedRef) => { - const portalContext = $f4833395aa1bca1a$var$usePortalContext($f4833395aa1bca1a$var$OVERLAY_NAME, props.__scopeDialog); - const { - forceMount = portalContext.forceMount, - ...overlayProps - } = props; - const context = $f4833395aa1bca1a$var$useDialogContext($f4833395aa1bca1a$var$OVERLAY_NAME, props.__scopeDialog); - return context.modal ? /*#__PURE__*/$aJCrN$react.createElement($aJCrN$radixuireactpresence.Presence, { - present: forceMount || context.open - }, /*#__PURE__*/$aJCrN$react.createElement($f4833395aa1bca1a$var$DialogOverlayImpl, $parcel$interopDefault($aJCrN$babelruntimehelpersextends)({}, overlayProps, { - ref: forwardedRef - }))) : null; -}); -/*#__PURE__*/ -Object.assign($f4833395aa1bca1a$export$bd1d06c79be19e17, { - displayName: $f4833395aa1bca1a$var$OVERLAY_NAME -}); -const $f4833395aa1bca1a$var$DialogOverlayImpl = /*#__PURE__*/$aJCrN$react.forwardRef((props, forwardedRef) => { - const { - __scopeDialog: __scopeDialog, - ...overlayProps - } = props; - const context = $f4833395aa1bca1a$var$useDialogContext($f4833395aa1bca1a$var$OVERLAY_NAME, __scopeDialog); - return /*#__PURE__*/ (// Make sure `Content` is scrollable even when it doesn't live inside `RemoveScroll` - // ie. when `Overlay` and `Content` are siblings - $aJCrN$react.createElement($aJCrN$reactremovescroll.RemoveScroll, { - as: $aJCrN$radixuireactslot.Slot, - allowPinchZoom: true, - shards: [context.contentRef] - }, /*#__PURE__*/$aJCrN$react.createElement($aJCrN$radixuireactprimitive.Primitive.div, $parcel$interopDefault($aJCrN$babelruntimehelpersextends)({ - "data-state": $f4833395aa1bca1a$var$getState(context.open) - }, overlayProps, { - ref: forwardedRef // We re-enable pointer-events prevented by `Dialog.Content` to allow scrolling the overlay. - , - - style: { - pointerEvents: 'auto', - ...overlayProps.style - } - }))) - ); -}); -/* ------------------------------------------------------------------------------------------------- - * DialogContent - * -----------------------------------------------------------------------------------------------*/ -const $f4833395aa1bca1a$var$CONTENT_NAME = 'DialogContent'; -const $f4833395aa1bca1a$export$b6d9565de1e068cf = /*#__PURE__*/$aJCrN$react.forwardRef((props, forwardedRef) => { - const portalContext = $f4833395aa1bca1a$var$usePortalContext($f4833395aa1bca1a$var$CONTENT_NAME, props.__scopeDialog); - const { - forceMount = portalContext.forceMount, - ...contentProps - } = props; - const context = $f4833395aa1bca1a$var$useDialogContext($f4833395aa1bca1a$var$CONTENT_NAME, props.__scopeDialog); - return /*#__PURE__*/$aJCrN$react.createElement($aJCrN$radixuireactpresence.Presence, { - present: forceMount || context.open - }, context.modal ? /*#__PURE__*/$aJCrN$react.createElement($f4833395aa1bca1a$var$DialogContentModal, $parcel$interopDefault($aJCrN$babelruntimehelpersextends)({}, contentProps, { - ref: forwardedRef - })) : /*#__PURE__*/$aJCrN$react.createElement($f4833395aa1bca1a$var$DialogContentNonModal, $parcel$interopDefault($aJCrN$babelruntimehelpersextends)({}, contentProps, { - ref: forwardedRef - }))); -}); -/*#__PURE__*/ -Object.assign($f4833395aa1bca1a$export$b6d9565de1e068cf, { - displayName: $f4833395aa1bca1a$var$CONTENT_NAME -}); -/* -----------------------------------------------------------------------------------------------*/ -const $f4833395aa1bca1a$var$DialogContentModal = /*#__PURE__*/$aJCrN$react.forwardRef((props, forwardedRef) => { - const context = $f4833395aa1bca1a$var$useDialogContext($f4833395aa1bca1a$var$CONTENT_NAME, props.__scopeDialog); - const contentRef = $aJCrN$react.useRef(null); - const composedRefs = $aJCrN$radixuireactcomposerefs.useComposedRefs(forwardedRef, context.contentRef, contentRef); // aria-hide everything except the content (better supported equivalent to setting aria-modal) - $aJCrN$react.useEffect(() => { - const content = contentRef.current; - if (content) return $aJCrN$ariahidden.hideOthers(content); - }, []); - return /*#__PURE__*/$aJCrN$react.createElement($f4833395aa1bca1a$var$DialogContentImpl, $parcel$interopDefault($aJCrN$babelruntimehelpersextends)({}, props, { - ref: composedRefs // we make sure focus isn't trapped once `DialogContent` has been closed - , - - trapFocus: context.open, - disableOutsidePointerEvents: true, - onCloseAutoFocus: $aJCrN$radixuiprimitive.composeEventHandlers(props.onCloseAutoFocus, event => { - var _context$triggerRef$c; - event.preventDefault(); - (_context$triggerRef$c = context.triggerRef.current) === null || _context$triggerRef$c === void 0 || _context$triggerRef$c.focus(); - }), - onPointerDownOutside: $aJCrN$radixuiprimitive.composeEventHandlers(props.onPointerDownOutside, event => { - const originalEvent = event.detail.originalEvent; - const ctrlLeftClick = originalEvent.button === 0 && originalEvent.ctrlKey === true; - const isRightClick = originalEvent.button === 2 || ctrlLeftClick; // If the event is a right-click, we shouldn't close because - // it is effectively as if we right-clicked the `Overlay`. - if (isRightClick) event.preventDefault(); - }) // When focus is trapped, a `focusout` event may still happen. - , - - onFocusOutside: $aJCrN$radixuiprimitive.composeEventHandlers(props.onFocusOutside, event => event.preventDefault()) - })); -}); -/* -----------------------------------------------------------------------------------------------*/ -const $f4833395aa1bca1a$var$DialogContentNonModal = /*#__PURE__*/$aJCrN$react.forwardRef((props, forwardedRef) => { - const context = $f4833395aa1bca1a$var$useDialogContext($f4833395aa1bca1a$var$CONTENT_NAME, props.__scopeDialog); - const hasInteractedOutsideRef = $aJCrN$react.useRef(false); - const hasPointerDownOutsideRef = $aJCrN$react.useRef(false); - return /*#__PURE__*/$aJCrN$react.createElement($f4833395aa1bca1a$var$DialogContentImpl, $parcel$interopDefault($aJCrN$babelruntimehelpersextends)({}, props, { - ref: forwardedRef, - trapFocus: false, - disableOutsidePointerEvents: false, - onCloseAutoFocus: event => { - var _props$onCloseAutoFoc; - (_props$onCloseAutoFoc = props.onCloseAutoFocus) === null || _props$onCloseAutoFoc === void 0 || _props$onCloseAutoFoc.call(props, event); - if (!event.defaultPrevented) { - var _context$triggerRef$c2; - if (!hasInteractedOutsideRef.current) (_context$triggerRef$c2 = context.triggerRef.current) === null || _context$triggerRef$c2 === void 0 || _context$triggerRef$c2.focus(); // Always prevent auto focus because we either focus manually or want user agent focus - event.preventDefault(); - } - hasInteractedOutsideRef.current = false; - hasPointerDownOutsideRef.current = false; - }, - onInteractOutside: event => { - var _props$onInteractOuts, _context$triggerRef$c3; - (_props$onInteractOuts = props.onInteractOutside) === null || _props$onInteractOuts === void 0 || _props$onInteractOuts.call(props, event); - if (!event.defaultPrevented) { - hasInteractedOutsideRef.current = true; - if (event.detail.originalEvent.type === 'pointerdown') hasPointerDownOutsideRef.current = true; - } // Prevent dismissing when clicking the trigger. - // As the trigger is already setup to close, without doing so would - // cause it to close and immediately open. - const target = event.target; - const targetIsTrigger = (_context$triggerRef$c3 = context.triggerRef.current) === null || _context$triggerRef$c3 === void 0 ? void 0 : _context$triggerRef$c3.contains(target); - if (targetIsTrigger) event.preventDefault(); // On Safari if the trigger is inside a container with tabIndex={0}, when clicked - // we will get the pointer down outside event on the trigger, but then a subsequent - // focus outside event on the container, we ignore any focus outside event when we've - // already had a pointer down outside event. - if (event.detail.originalEvent.type === 'focusin' && hasPointerDownOutsideRef.current) event.preventDefault(); - } - })); -}); -/* -----------------------------------------------------------------------------------------------*/ -const $f4833395aa1bca1a$var$DialogContentImpl = /*#__PURE__*/$aJCrN$react.forwardRef((props, forwardedRef) => { - const { - __scopeDialog: __scopeDialog, - trapFocus: trapFocus, - onOpenAutoFocus: onOpenAutoFocus, - onCloseAutoFocus: onCloseAutoFocus, - ...contentProps - } = props; - const context = $f4833395aa1bca1a$var$useDialogContext($f4833395aa1bca1a$var$CONTENT_NAME, __scopeDialog); - const contentRef = $aJCrN$react.useRef(null); - const composedRefs = $aJCrN$radixuireactcomposerefs.useComposedRefs(forwardedRef, contentRef); // Make sure the whole tree has focus guards as our `Dialog` will be - // the last element in the DOM (beacuse of the `Portal`) - $aJCrN$radixuireactfocusguards.useFocusGuards(); - return /*#__PURE__*/$aJCrN$react.createElement($aJCrN$react.Fragment, null, /*#__PURE__*/$aJCrN$react.createElement($aJCrN$radixuireactfocusscope.FocusScope, { - asChild: true, - loop: true, - trapped: trapFocus, - onMountAutoFocus: onOpenAutoFocus, - onUnmountAutoFocus: onCloseAutoFocus - }, /*#__PURE__*/$aJCrN$react.createElement($aJCrN$radixuireactdismissablelayer.DismissableLayer, $parcel$interopDefault($aJCrN$babelruntimehelpersextends)({ - role: "dialog", - id: context.contentId, - "aria-describedby": context.descriptionId, - "aria-labelledby": context.titleId, - "data-state": $f4833395aa1bca1a$var$getState(context.open) - }, contentProps, { - ref: composedRefs, - onDismiss: () => context.onOpenChange(false) - }))), false); -}); -/* ------------------------------------------------------------------------------------------------- - * DialogTitle - * -----------------------------------------------------------------------------------------------*/ -const $f4833395aa1bca1a$var$TITLE_NAME = 'DialogTitle'; -const $f4833395aa1bca1a$export$16f7638e4a34b909 = /*#__PURE__*/$aJCrN$react.forwardRef((props, forwardedRef) => { - const { - __scopeDialog: __scopeDialog, - ...titleProps - } = props; - const context = $f4833395aa1bca1a$var$useDialogContext($f4833395aa1bca1a$var$TITLE_NAME, __scopeDialog); - return /*#__PURE__*/$aJCrN$react.createElement($aJCrN$radixuireactprimitive.Primitive.h2, $parcel$interopDefault($aJCrN$babelruntimehelpersextends)({ - id: context.titleId - }, titleProps, { - ref: forwardedRef - })); -}); -/*#__PURE__*/ -Object.assign($f4833395aa1bca1a$export$16f7638e4a34b909, { - displayName: $f4833395aa1bca1a$var$TITLE_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * DialogDescription - * -----------------------------------------------------------------------------------------------*/ -const $f4833395aa1bca1a$var$DESCRIPTION_NAME = 'DialogDescription'; -const $f4833395aa1bca1a$export$94e94c2ec2c954d5 = /*#__PURE__*/$aJCrN$react.forwardRef((props, forwardedRef) => { - const { - __scopeDialog: __scopeDialog, - ...descriptionProps - } = props; - const context = $f4833395aa1bca1a$var$useDialogContext($f4833395aa1bca1a$var$DESCRIPTION_NAME, __scopeDialog); - return /*#__PURE__*/$aJCrN$react.createElement($aJCrN$radixuireactprimitive.Primitive.p, $parcel$interopDefault($aJCrN$babelruntimehelpersextends)({ - id: context.descriptionId - }, descriptionProps, { - ref: forwardedRef - })); -}); -/*#__PURE__*/ -Object.assign($f4833395aa1bca1a$export$94e94c2ec2c954d5, { - displayName: $f4833395aa1bca1a$var$DESCRIPTION_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * DialogClose - * -----------------------------------------------------------------------------------------------*/ -const $f4833395aa1bca1a$var$CLOSE_NAME = 'DialogClose'; -const $f4833395aa1bca1a$export$fba2fb7cd781b7ac = /*#__PURE__*/$aJCrN$react.forwardRef((props, forwardedRef) => { - const { - __scopeDialog: __scopeDialog, - ...closeProps - } = props; - const context = $f4833395aa1bca1a$var$useDialogContext($f4833395aa1bca1a$var$CLOSE_NAME, __scopeDialog); - return /*#__PURE__*/$aJCrN$react.createElement($aJCrN$radixuireactprimitive.Primitive.button, $parcel$interopDefault($aJCrN$babelruntimehelpersextends)({ - type: "button" - }, closeProps, { - ref: forwardedRef, - onClick: $aJCrN$radixuiprimitive.composeEventHandlers(props.onClick, () => context.onOpenChange(false)) - })); -}); -/*#__PURE__*/ -Object.assign($f4833395aa1bca1a$export$fba2fb7cd781b7ac, { - displayName: $f4833395aa1bca1a$var$CLOSE_NAME -}); -/* -----------------------------------------------------------------------------------------------*/ -function $f4833395aa1bca1a$var$getState(open) { - return open ? 'open' : 'closed'; -} -const $f4833395aa1bca1a$var$TITLE_WARNING_NAME = 'DialogTitleWarning'; -const [$f4833395aa1bca1a$export$69b62a49393917d6, $f4833395aa1bca1a$var$useWarningContext] = $aJCrN$radixuireactcontext.createContext($f4833395aa1bca1a$var$TITLE_WARNING_NAME, { - contentName: $f4833395aa1bca1a$var$CONTENT_NAME, - titleName: $f4833395aa1bca1a$var$TITLE_NAME, - docsSlug: 'dialog' -}); -const $f4833395aa1bca1a$var$TitleWarning = _ref => { - let { - titleId: titleId - } = _ref; - const titleWarningContext = $f4833395aa1bca1a$var$useWarningContext($f4833395aa1bca1a$var$TITLE_WARNING_NAME); - const MESSAGE = `\`${titleWarningContext.contentName}\` requires a \`${titleWarningContext.titleName}\` for the component to be accessible for screen reader users. - -If you want to hide the \`${titleWarningContext.titleName}\`, you can wrap it with our VisuallyHidden component. - -For more information, see https://radix-ui.com/primitives/docs/components/${titleWarningContext.docsSlug}`; - $aJCrN$react.useEffect(() => { - if (titleId) { - const hasTitle = document.getElementById(titleId); - if (!hasTitle) throw new Error(MESSAGE); - } - }, [MESSAGE, titleId]); - return null; -}; -const $f4833395aa1bca1a$var$DESCRIPTION_WARNING_NAME = 'DialogDescriptionWarning'; -const $f4833395aa1bca1a$var$DescriptionWarning = _ref2 => { - let { - contentRef: contentRef, - descriptionId: descriptionId - } = _ref2; - const descriptionWarningContext = $f4833395aa1bca1a$var$useWarningContext($f4833395aa1bca1a$var$DESCRIPTION_WARNING_NAME); - const MESSAGE = `Warning: Missing \`Description\` or \`aria-describedby={undefined}\` for {${descriptionWarningContext.contentName}}.`; - $aJCrN$react.useEffect(() => { - var _contentRef$current; - const describedById = (_contentRef$current = contentRef.current) === null || _contentRef$current === void 0 ? void 0 : _contentRef$current.getAttribute('aria-describedby'); // if we have an id and the user hasn't set aria-describedby={undefined} - if (descriptionId && describedById) { - const hasDescription = document.getElementById(descriptionId); - if (!hasDescription) console.warn(MESSAGE); - } - }, [MESSAGE, contentRef, descriptionId]); - return null; -}; -const $f4833395aa1bca1a$export$be92b6f5f03c0fe9 = $f4833395aa1bca1a$export$3ddf2d174ce01153; -const $f4833395aa1bca1a$export$41fb9f06171c75f4 = $f4833395aa1bca1a$export$2e1e1122cf0cba88; -const $f4833395aa1bca1a$export$602eac185826482c = $f4833395aa1bca1a$export$dad7c95542bacce0; -const $f4833395aa1bca1a$export$c6fdb837b070b4ff = $f4833395aa1bca1a$export$bd1d06c79be19e17; -const $f4833395aa1bca1a$export$7c6e2c02157bb7d2 = $f4833395aa1bca1a$export$b6d9565de1e068cf; -const $f4833395aa1bca1a$export$f99233281efd08a0 = $f4833395aa1bca1a$export$16f7638e4a34b909; -const $f4833395aa1bca1a$export$393edc798c47379d = $f4833395aa1bca1a$export$94e94c2ec2c954d5; -const $f4833395aa1bca1a$export$f39c2d165cd861fe = $f4833395aa1bca1a$export$fba2fb7cd781b7ac; - -/***/ }), - -/***/ "../../../node_modules/@radix-ui/react-direction/dist/index.js": -/*!*********************************************************************!*\ - !*** ../../../node_modules/@radix-ui/react-direction/dist/index.js ***! - \*********************************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - - -var $9g4ps$react = __webpack_require__(/*! react */ "react"); -function $parcel$export(e, n, v, s) { - Object.defineProperty(e, n, { - get: v, - set: s, - enumerable: true, - configurable: true - }); -} -$parcel$export(module.exports, "useDirection", () => $cc45c1b701a63adc$export$b39126d51d94e6f3); -$parcel$export(module.exports, "Provider", () => $cc45c1b701a63adc$export$2881499e37b75b9a); -$parcel$export(module.exports, "DirectionProvider", () => $cc45c1b701a63adc$export$c760c09fdd558351); -const $cc45c1b701a63adc$var$DirectionContext = /*#__PURE__*/$9g4ps$react.createContext(undefined); -/* ------------------------------------------------------------------------------------------------- - * Direction - * -----------------------------------------------------------------------------------------------*/ -const $cc45c1b701a63adc$export$c760c09fdd558351 = props => { - const { - dir: dir, - children: children - } = props; - return /*#__PURE__*/$9g4ps$react.createElement($cc45c1b701a63adc$var$DirectionContext.Provider, { - value: dir - }, children); -}; -/* -----------------------------------------------------------------------------------------------*/ -function $cc45c1b701a63adc$export$b39126d51d94e6f3(localDir) { - const globalDir = $9g4ps$react.useContext($cc45c1b701a63adc$var$DirectionContext); - return localDir || globalDir || 'ltr'; -} -const $cc45c1b701a63adc$export$2881499e37b75b9a = $cc45c1b701a63adc$export$c760c09fdd558351; - -/***/ }), - -/***/ "../../../node_modules/@radix-ui/react-dismissable-layer/dist/index.js": -/*!*****************************************************************************!*\ - !*** ../../../node_modules/@radix-ui/react-dismissable-layer/dist/index.js ***! - \*****************************************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - - -var $g2vWm$babelruntimehelpersextends = __webpack_require__(/*! @babel/runtime/helpers/extends */ "../../../node_modules/@babel/runtime/helpers/extends.js"); -var $g2vWm$react = __webpack_require__(/*! react */ "react"); -var $g2vWm$radixuiprimitive = __webpack_require__(/*! @radix-ui/primitive */ "../../../node_modules/@radix-ui/primitive/dist/index.js"); -var $g2vWm$radixuireactprimitive = __webpack_require__(/*! @radix-ui/react-primitive */ "../../../node_modules/@radix-ui/react-primitive/dist/index.js"); -var $g2vWm$radixuireactcomposerefs = __webpack_require__(/*! @radix-ui/react-compose-refs */ "../../../node_modules/@radix-ui/react-compose-refs/dist/index.js"); -var $g2vWm$radixuireactusecallbackref = __webpack_require__(/*! @radix-ui/react-use-callback-ref */ "../../../node_modules/@radix-ui/react-use-callback-ref/dist/index.js"); -var $g2vWm$radixuireactuseescapekeydown = __webpack_require__(/*! @radix-ui/react-use-escape-keydown */ "../../../node_modules/@radix-ui/react-use-escape-keydown/dist/index.js"); -function $parcel$export(e, n, v, s) { - Object.defineProperty(e, n, { - get: v, - set: s, - enumerable: true, - configurable: true - }); -} -function $parcel$interopDefault(a) { - return a && a.__esModule ? a.default : a; -} -$parcel$export(module.exports, "DismissableLayer", () => $d715e0554b679f1f$export$177fb62ff3ec1f22); -$parcel$export(module.exports, "DismissableLayerBranch", () => $d715e0554b679f1f$export$4d5eb2109db14228); -$parcel$export(module.exports, "Root", () => $d715e0554b679f1f$export$be92b6f5f03c0fe9); -$parcel$export(module.exports, "Branch", () => $d715e0554b679f1f$export$aecb2ddcb55c95be); - -/* ------------------------------------------------------------------------------------------------- - * DismissableLayer - * -----------------------------------------------------------------------------------------------*/ -const $d715e0554b679f1f$var$DISMISSABLE_LAYER_NAME = 'DismissableLayer'; -const $d715e0554b679f1f$var$CONTEXT_UPDATE = 'dismissableLayer.update'; -const $d715e0554b679f1f$var$POINTER_DOWN_OUTSIDE = 'dismissableLayer.pointerDownOutside'; -const $d715e0554b679f1f$var$FOCUS_OUTSIDE = 'dismissableLayer.focusOutside'; -let $d715e0554b679f1f$var$originalBodyPointerEvents; -const $d715e0554b679f1f$var$DismissableLayerContext = /*#__PURE__*/$g2vWm$react.createContext({ - layers: new Set(), - layersWithOutsidePointerEventsDisabled: new Set(), - branches: new Set() -}); -const $d715e0554b679f1f$export$177fb62ff3ec1f22 = /*#__PURE__*/$g2vWm$react.forwardRef((props, forwardedRef) => { - var _node$ownerDocument; - const { - disableOutsidePointerEvents = false, - onEscapeKeyDown: onEscapeKeyDown, - onPointerDownOutside: onPointerDownOutside, - onFocusOutside: onFocusOutside, - onInteractOutside: onInteractOutside, - onDismiss: onDismiss, - ...layerProps - } = props; - const context = $g2vWm$react.useContext($d715e0554b679f1f$var$DismissableLayerContext); - const [node1, setNode] = $g2vWm$react.useState(null); - const ownerDocument = (_node$ownerDocument = node1 === null || node1 === void 0 ? void 0 : node1.ownerDocument) !== null && _node$ownerDocument !== void 0 ? _node$ownerDocument : globalThis === null || globalThis === void 0 ? void 0 : globalThis.document; - const [, force] = $g2vWm$react.useState({}); - const composedRefs = $g2vWm$radixuireactcomposerefs.useComposedRefs(forwardedRef, node => setNode(node)); - const layers = Array.from(context.layers); - const [highestLayerWithOutsidePointerEventsDisabled] = [...context.layersWithOutsidePointerEventsDisabled].slice(-1); // prettier-ignore - const highestLayerWithOutsidePointerEventsDisabledIndex = layers.indexOf(highestLayerWithOutsidePointerEventsDisabled); // prettier-ignore - const index = node1 ? layers.indexOf(node1) : -1; - const isBodyPointerEventsDisabled = context.layersWithOutsidePointerEventsDisabled.size > 0; - const isPointerEventsEnabled = index >= highestLayerWithOutsidePointerEventsDisabledIndex; - const pointerDownOutside = $d715e0554b679f1f$var$usePointerDownOutside(event => { - const target = event.target; - const isPointerDownOnBranch = [...context.branches].some(branch => branch.contains(target)); - if (!isPointerEventsEnabled || isPointerDownOnBranch) return; - onPointerDownOutside === null || onPointerDownOutside === void 0 || onPointerDownOutside(event); - onInteractOutside === null || onInteractOutside === void 0 || onInteractOutside(event); - if (!event.defaultPrevented) onDismiss === null || onDismiss === void 0 || onDismiss(); - }, ownerDocument); - const focusOutside = $d715e0554b679f1f$var$useFocusOutside(event => { - const target = event.target; - const isFocusInBranch = [...context.branches].some(branch => branch.contains(target)); - if (isFocusInBranch) return; - onFocusOutside === null || onFocusOutside === void 0 || onFocusOutside(event); - onInteractOutside === null || onInteractOutside === void 0 || onInteractOutside(event); - if (!event.defaultPrevented) onDismiss === null || onDismiss === void 0 || onDismiss(); - }, ownerDocument); - $g2vWm$radixuireactuseescapekeydown.useEscapeKeydown(event => { - const isHighestLayer = index === context.layers.size - 1; - if (!isHighestLayer) return; - onEscapeKeyDown === null || onEscapeKeyDown === void 0 || onEscapeKeyDown(event); - if (!event.defaultPrevented && onDismiss) { - event.preventDefault(); - onDismiss(); - } - }, ownerDocument); - $g2vWm$react.useEffect(() => { - if (!node1) return; - if (disableOutsidePointerEvents) { - if (context.layersWithOutsidePointerEventsDisabled.size === 0) { - $d715e0554b679f1f$var$originalBodyPointerEvents = ownerDocument.body.style.pointerEvents; - ownerDocument.body.style.pointerEvents = 'none'; - } - context.layersWithOutsidePointerEventsDisabled.add(node1); - } - context.layers.add(node1); - $d715e0554b679f1f$var$dispatchUpdate(); - return () => { - if (disableOutsidePointerEvents && context.layersWithOutsidePointerEventsDisabled.size === 1) ownerDocument.body.style.pointerEvents = $d715e0554b679f1f$var$originalBodyPointerEvents; - }; - }, [node1, ownerDocument, disableOutsidePointerEvents, context]); - /** - * We purposefully prevent combining this effect with the `disableOutsidePointerEvents` effect - * because a change to `disableOutsidePointerEvents` would remove this layer from the stack - * and add it to the end again so the layering order wouldn't be _creation order_. - * We only want them to be removed from context stacks when unmounted. - */ - $g2vWm$react.useEffect(() => { - return () => { - if (!node1) return; - context.layers.delete(node1); - context.layersWithOutsidePointerEventsDisabled.delete(node1); - $d715e0554b679f1f$var$dispatchUpdate(); - }; - }, [node1, context]); - $g2vWm$react.useEffect(() => { - const handleUpdate = () => force({}); - document.addEventListener($d715e0554b679f1f$var$CONTEXT_UPDATE, handleUpdate); - return () => document.removeEventListener($d715e0554b679f1f$var$CONTEXT_UPDATE, handleUpdate); - }, []); - return /*#__PURE__*/$g2vWm$react.createElement($g2vWm$radixuireactprimitive.Primitive.div, $parcel$interopDefault($g2vWm$babelruntimehelpersextends)({}, layerProps, { - ref: composedRefs, - style: { - pointerEvents: isBodyPointerEventsDisabled ? isPointerEventsEnabled ? 'auto' : 'none' : undefined, - ...props.style - }, - onFocusCapture: $g2vWm$radixuiprimitive.composeEventHandlers(props.onFocusCapture, focusOutside.onFocusCapture), - onBlurCapture: $g2vWm$radixuiprimitive.composeEventHandlers(props.onBlurCapture, focusOutside.onBlurCapture), - onPointerDownCapture: $g2vWm$radixuiprimitive.composeEventHandlers(props.onPointerDownCapture, pointerDownOutside.onPointerDownCapture) - })); -}); -/*#__PURE__*/ -Object.assign($d715e0554b679f1f$export$177fb62ff3ec1f22, { - displayName: $d715e0554b679f1f$var$DISMISSABLE_LAYER_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * DismissableLayerBranch - * -----------------------------------------------------------------------------------------------*/ -const $d715e0554b679f1f$var$BRANCH_NAME = 'DismissableLayerBranch'; -const $d715e0554b679f1f$export$4d5eb2109db14228 = /*#__PURE__*/$g2vWm$react.forwardRef((props, forwardedRef) => { - const context = $g2vWm$react.useContext($d715e0554b679f1f$var$DismissableLayerContext); - const ref = $g2vWm$react.useRef(null); - const composedRefs = $g2vWm$radixuireactcomposerefs.useComposedRefs(forwardedRef, ref); - $g2vWm$react.useEffect(() => { - const node = ref.current; - if (node) { - context.branches.add(node); - return () => { - context.branches.delete(node); - }; - } - }, [context.branches]); - return /*#__PURE__*/$g2vWm$react.createElement($g2vWm$radixuireactprimitive.Primitive.div, $parcel$interopDefault($g2vWm$babelruntimehelpersextends)({}, props, { - ref: composedRefs - })); -}); -/*#__PURE__*/ -Object.assign($d715e0554b679f1f$export$4d5eb2109db14228, { - displayName: $d715e0554b679f1f$var$BRANCH_NAME -}); -/* -----------------------------------------------------------------------------------------------*/ /** - * Listens for `pointerdown` outside a react subtree. We use `pointerdown` rather than `pointerup` - * to mimic layer dismissing behaviour present in OS. - * Returns props to pass to the node we want to check for outside events. - */ -function $d715e0554b679f1f$var$usePointerDownOutside(onPointerDownOutside) { - let ownerDocument = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : globalThis === null || globalThis === void 0 ? void 0 : globalThis.document; - const handlePointerDownOutside = $g2vWm$radixuireactusecallbackref.useCallbackRef(onPointerDownOutside); - const isPointerInsideReactTreeRef = $g2vWm$react.useRef(false); - const handleClickRef = $g2vWm$react.useRef(() => {}); - $g2vWm$react.useEffect(() => { - const handlePointerDown = event => { - if (event.target && !isPointerInsideReactTreeRef.current) { - const eventDetail = { - originalEvent: event - }; - function handleAndDispatchPointerDownOutsideEvent() { - $d715e0554b679f1f$var$handleAndDispatchCustomEvent($d715e0554b679f1f$var$POINTER_DOWN_OUTSIDE, handlePointerDownOutside, eventDetail, { - discrete: true - }); - } - /** - * On touch devices, we need to wait for a click event because browsers implement - * a ~350ms delay between the time the user stops touching the display and when the - * browser executres events. We need to ensure we don't reactivate pointer-events within - * this timeframe otherwise the browser may execute events that should have been prevented. - * - * Additionally, this also lets us deal automatically with cancellations when a click event - * isn't raised because the page was considered scrolled/drag-scrolled, long-pressed, etc. - * - * This is why we also continuously remove the previous listener, because we cannot be - * certain that it was raised, and therefore cleaned-up. - */ - if (event.pointerType === 'touch') { - ownerDocument.removeEventListener('click', handleClickRef.current); - handleClickRef.current = handleAndDispatchPointerDownOutsideEvent; - ownerDocument.addEventListener('click', handleClickRef.current, { - once: true - }); - } else handleAndDispatchPointerDownOutsideEvent(); - } - isPointerInsideReactTreeRef.current = false; - }; - /** - * if this hook executes in a component that mounts via a `pointerdown` event, the event - * would bubble up to the document and trigger a `pointerDownOutside` event. We avoid - * this by delaying the event listener registration on the document. - * This is not React specific, but rather how the DOM works, ie: - * ``` - * button.addEventListener('pointerdown', () => { - * console.log('I will log'); - * document.addEventListener('pointerdown', () => { - * console.log('I will also log'); - * }) - * }); - */ - const timerId = window.setTimeout(() => { - ownerDocument.addEventListener('pointerdown', handlePointerDown); - }, 0); - return () => { - window.clearTimeout(timerId); - ownerDocument.removeEventListener('pointerdown', handlePointerDown); - ownerDocument.removeEventListener('click', handleClickRef.current); - }; - }, [ownerDocument, handlePointerDownOutside]); - return { - // ensures we check React component tree (not just DOM tree) - onPointerDownCapture: () => isPointerInsideReactTreeRef.current = true - }; -} -/** - * Listens for when focus happens outside a react subtree. - * Returns props to pass to the root (node) of the subtree we want to check. - */ -function $d715e0554b679f1f$var$useFocusOutside(onFocusOutside) { - let ownerDocument = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : globalThis === null || globalThis === void 0 ? void 0 : globalThis.document; - const handleFocusOutside = $g2vWm$radixuireactusecallbackref.useCallbackRef(onFocusOutside); - const isFocusInsideReactTreeRef = $g2vWm$react.useRef(false); - $g2vWm$react.useEffect(() => { - const handleFocus = event => { - if (event.target && !isFocusInsideReactTreeRef.current) { - const eventDetail = { - originalEvent: event - }; - $d715e0554b679f1f$var$handleAndDispatchCustomEvent($d715e0554b679f1f$var$FOCUS_OUTSIDE, handleFocusOutside, eventDetail, { - discrete: false - }); - } - }; - ownerDocument.addEventListener('focusin', handleFocus); - return () => ownerDocument.removeEventListener('focusin', handleFocus); - }, [ownerDocument, handleFocusOutside]); - return { - onFocusCapture: () => isFocusInsideReactTreeRef.current = true, - onBlurCapture: () => isFocusInsideReactTreeRef.current = false - }; -} -function $d715e0554b679f1f$var$dispatchUpdate() { - const event = new CustomEvent($d715e0554b679f1f$var$CONTEXT_UPDATE); - document.dispatchEvent(event); -} -function $d715e0554b679f1f$var$handleAndDispatchCustomEvent(name, handler, detail, _ref) { - let { - discrete: discrete - } = _ref; - const target = detail.originalEvent.target; - const event = new CustomEvent(name, { - bubbles: false, - cancelable: true, - detail: detail - }); - if (handler) target.addEventListener(name, handler, { - once: true - }); - if (discrete) $g2vWm$radixuireactprimitive.dispatchDiscreteCustomEvent(target, event);else target.dispatchEvent(event); -} -const $d715e0554b679f1f$export$be92b6f5f03c0fe9 = $d715e0554b679f1f$export$177fb62ff3ec1f22; -const $d715e0554b679f1f$export$aecb2ddcb55c95be = $d715e0554b679f1f$export$4d5eb2109db14228; - -/***/ }), - -/***/ "../../../node_modules/@radix-ui/react-dropdown-menu/dist/index.js": -/*!*************************************************************************!*\ - !*** ../../../node_modules/@radix-ui/react-dropdown-menu/dist/index.js ***! - \*************************************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - - -var $7dQ7Q$babelruntimehelpersextends = __webpack_require__(/*! @babel/runtime/helpers/extends */ "../../../node_modules/@babel/runtime/helpers/extends.js"); -var $7dQ7Q$react = __webpack_require__(/*! react */ "react"); -var $7dQ7Q$radixuiprimitive = __webpack_require__(/*! @radix-ui/primitive */ "../../../node_modules/@radix-ui/primitive/dist/index.js"); -var $7dQ7Q$radixuireactcomposerefs = __webpack_require__(/*! @radix-ui/react-compose-refs */ "../../../node_modules/@radix-ui/react-compose-refs/dist/index.js"); -var $7dQ7Q$radixuireactcontext = __webpack_require__(/*! @radix-ui/react-context */ "../../../node_modules/@radix-ui/react-context/dist/index.js"); -var $7dQ7Q$radixuireactusecontrollablestate = __webpack_require__(/*! @radix-ui/react-use-controllable-state */ "../../../node_modules/@radix-ui/react-use-controllable-state/dist/index.js"); -var $7dQ7Q$radixuireactprimitive = __webpack_require__(/*! @radix-ui/react-primitive */ "../../../node_modules/@radix-ui/react-primitive/dist/index.js"); -var $7dQ7Q$radixuireactmenu = __webpack_require__(/*! @radix-ui/react-menu */ "../../../node_modules/@radix-ui/react-menu/dist/index.js"); -var $7dQ7Q$radixuireactid = __webpack_require__(/*! @radix-ui/react-id */ "../../../node_modules/@radix-ui/react-id/dist/index.js"); -function $parcel$export(e, n, v, s) { - Object.defineProperty(e, n, { - get: v, - set: s, - enumerable: true, - configurable: true - }); -} -function $parcel$interopDefault(a) { - return a && a.__esModule ? a.default : a; -} -$parcel$export(module.exports, "createDropdownMenuScope", () => $d1bf075a6b218014$export$c0623cd925aeb687); -$parcel$export(module.exports, "DropdownMenu", () => $d1bf075a6b218014$export$e44a253a59704894); -$parcel$export(module.exports, "DropdownMenuTrigger", () => $d1bf075a6b218014$export$d2469213b3befba9); -$parcel$export(module.exports, "DropdownMenuPortal", () => $d1bf075a6b218014$export$cd369b4d4d54efc9); -$parcel$export(module.exports, "DropdownMenuContent", () => $d1bf075a6b218014$export$6e76d93a37c01248); -$parcel$export(module.exports, "DropdownMenuGroup", () => $d1bf075a6b218014$export$246bebaba3a2f70e); -$parcel$export(module.exports, "DropdownMenuLabel", () => $d1bf075a6b218014$export$76e48c5b57f24495); -$parcel$export(module.exports, "DropdownMenuItem", () => $d1bf075a6b218014$export$ed97964d1871885d); -$parcel$export(module.exports, "DropdownMenuCheckboxItem", () => $d1bf075a6b218014$export$53a69729da201fa9); -$parcel$export(module.exports, "DropdownMenuRadioGroup", () => $d1bf075a6b218014$export$3323ad73d55f587e); -$parcel$export(module.exports, "DropdownMenuRadioItem", () => $d1bf075a6b218014$export$e4f69b41b1637536); -$parcel$export(module.exports, "DropdownMenuItemIndicator", () => $d1bf075a6b218014$export$42355ae145153fb6); -$parcel$export(module.exports, "DropdownMenuSeparator", () => $d1bf075a6b218014$export$da160178fd3bc7e9); -$parcel$export(module.exports, "DropdownMenuArrow", () => $d1bf075a6b218014$export$34b8980744021ec5); -$parcel$export(module.exports, "DropdownMenuSub", () => $d1bf075a6b218014$export$2f307d81a64f5442); -$parcel$export(module.exports, "DropdownMenuSubTrigger", () => $d1bf075a6b218014$export$21dcb7ec56f874cf); -$parcel$export(module.exports, "DropdownMenuSubContent", () => $d1bf075a6b218014$export$f34ec8bc2482cc5f); -$parcel$export(module.exports, "Root", () => $d1bf075a6b218014$export$be92b6f5f03c0fe9); -$parcel$export(module.exports, "Trigger", () => $d1bf075a6b218014$export$41fb9f06171c75f4); -$parcel$export(module.exports, "Portal", () => $d1bf075a6b218014$export$602eac185826482c); -$parcel$export(module.exports, "Content", () => $d1bf075a6b218014$export$7c6e2c02157bb7d2); -$parcel$export(module.exports, "Group", () => $d1bf075a6b218014$export$eb2fcfdbd7ba97d4); -$parcel$export(module.exports, "Label", () => $d1bf075a6b218014$export$b04be29aa201d4f5); -$parcel$export(module.exports, "Item", () => $d1bf075a6b218014$export$6d08773d2e66f8f2); -$parcel$export(module.exports, "CheckboxItem", () => $d1bf075a6b218014$export$16ce288f89fa631c); -$parcel$export(module.exports, "RadioGroup", () => $d1bf075a6b218014$export$a98f0dcb43a68a25); -$parcel$export(module.exports, "RadioItem", () => $d1bf075a6b218014$export$371ab307eab489c0); -$parcel$export(module.exports, "ItemIndicator", () => $d1bf075a6b218014$export$c3468e2714d175fa); -$parcel$export(module.exports, "Separator", () => $d1bf075a6b218014$export$1ff3c3f08ae963c0); -$parcel$export(module.exports, "Arrow", () => $d1bf075a6b218014$export$21b07c8f274aebd5); -$parcel$export(module.exports, "Sub", () => $d1bf075a6b218014$export$d7a01e11500dfb6f); -$parcel$export(module.exports, "SubTrigger", () => $d1bf075a6b218014$export$2ea8a7a591ac5eac); -$parcel$export(module.exports, "SubContent", () => $d1bf075a6b218014$export$6d4de93b380beddf); - -/* ------------------------------------------------------------------------------------------------- - * DropdownMenu - * -----------------------------------------------------------------------------------------------*/ -const $d1bf075a6b218014$var$DROPDOWN_MENU_NAME = 'DropdownMenu'; -const [$d1bf075a6b218014$var$createDropdownMenuContext, $d1bf075a6b218014$export$c0623cd925aeb687] = $7dQ7Q$radixuireactcontext.createContextScope($d1bf075a6b218014$var$DROPDOWN_MENU_NAME, [$7dQ7Q$radixuireactmenu.createMenuScope]); -const $d1bf075a6b218014$var$useMenuScope = $7dQ7Q$radixuireactmenu.createMenuScope(); -const [$d1bf075a6b218014$var$DropdownMenuProvider, $d1bf075a6b218014$var$useDropdownMenuContext] = $d1bf075a6b218014$var$createDropdownMenuContext($d1bf075a6b218014$var$DROPDOWN_MENU_NAME); -const $d1bf075a6b218014$export$e44a253a59704894 = props => { - const { - __scopeDropdownMenu: __scopeDropdownMenu, - children: children, - dir: dir, - open: openProp, - defaultOpen: defaultOpen, - onOpenChange: onOpenChange, - modal = true - } = props; - const menuScope = $d1bf075a6b218014$var$useMenuScope(__scopeDropdownMenu); - const triggerRef = $7dQ7Q$react.useRef(null); - const [open = false, setOpen] = $7dQ7Q$radixuireactusecontrollablestate.useControllableState({ - prop: openProp, - defaultProp: defaultOpen, - onChange: onOpenChange - }); - return /*#__PURE__*/$7dQ7Q$react.createElement($d1bf075a6b218014$var$DropdownMenuProvider, { - scope: __scopeDropdownMenu, - triggerId: $7dQ7Q$radixuireactid.useId(), - triggerRef: triggerRef, - contentId: $7dQ7Q$radixuireactid.useId(), - open: open, - onOpenChange: setOpen, - onOpenToggle: $7dQ7Q$react.useCallback(() => setOpen(prevOpen => !prevOpen), [setOpen]), - modal: modal - }, /*#__PURE__*/$7dQ7Q$react.createElement($7dQ7Q$radixuireactmenu.Root, $parcel$interopDefault($7dQ7Q$babelruntimehelpersextends)({}, menuScope, { - open: open, - onOpenChange: setOpen, - dir: dir, - modal: modal - }), children)); -}; -/*#__PURE__*/ -Object.assign($d1bf075a6b218014$export$e44a253a59704894, { - displayName: $d1bf075a6b218014$var$DROPDOWN_MENU_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * DropdownMenuTrigger - * -----------------------------------------------------------------------------------------------*/ -const $d1bf075a6b218014$var$TRIGGER_NAME = 'DropdownMenuTrigger'; -const $d1bf075a6b218014$export$d2469213b3befba9 = /*#__PURE__*/$7dQ7Q$react.forwardRef((props, forwardedRef) => { - const { - __scopeDropdownMenu: __scopeDropdownMenu, - disabled = false, - ...triggerProps - } = props; - const context = $d1bf075a6b218014$var$useDropdownMenuContext($d1bf075a6b218014$var$TRIGGER_NAME, __scopeDropdownMenu); - const menuScope = $d1bf075a6b218014$var$useMenuScope(__scopeDropdownMenu); - return /*#__PURE__*/$7dQ7Q$react.createElement($7dQ7Q$radixuireactmenu.Anchor, $parcel$interopDefault($7dQ7Q$babelruntimehelpersextends)({ - asChild: true - }, menuScope), /*#__PURE__*/$7dQ7Q$react.createElement($7dQ7Q$radixuireactprimitive.Primitive.button, $parcel$interopDefault($7dQ7Q$babelruntimehelpersextends)({ - type: "button", - id: context.triggerId, - "aria-haspopup": "menu", - "aria-expanded": context.open, - "aria-controls": context.open ? context.contentId : undefined, - "data-state": context.open ? 'open' : 'closed', - "data-disabled": disabled ? '' : undefined, - disabled: disabled - }, triggerProps, { - ref: $7dQ7Q$radixuireactcomposerefs.composeRefs(forwardedRef, context.triggerRef), - onPointerDown: $7dQ7Q$radixuiprimitive.composeEventHandlers(props.onPointerDown, event => { - // only call handler if it's the left button (mousedown gets triggered by all mouse buttons) - // but not when the control key is pressed (avoiding MacOS right click) - if (!disabled && event.button === 0 && event.ctrlKey === false) { - context.onOpenToggle(); // prevent trigger focusing when opening - // this allows the content to be given focus without competition - if (!context.open) event.preventDefault(); - } - }), - onKeyDown: $7dQ7Q$radixuiprimitive.composeEventHandlers(props.onKeyDown, event => { - if (disabled) return; - if (['Enter', ' '].includes(event.key)) context.onOpenToggle(); - if (event.key === 'ArrowDown') context.onOpenChange(true); // prevent keydown from scrolling window / first focused item to execute - // that keydown (inadvertently closing the menu) - if (['Enter', ' ', 'ArrowDown'].includes(event.key)) event.preventDefault(); - }) - }))); -}); -/*#__PURE__*/ -Object.assign($d1bf075a6b218014$export$d2469213b3befba9, { - displayName: $d1bf075a6b218014$var$TRIGGER_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * DropdownMenuPortal - * -----------------------------------------------------------------------------------------------*/ -const $d1bf075a6b218014$var$PORTAL_NAME = 'DropdownMenuPortal'; -const $d1bf075a6b218014$export$cd369b4d4d54efc9 = props => { - const { - __scopeDropdownMenu: __scopeDropdownMenu, - ...portalProps - } = props; - const menuScope = $d1bf075a6b218014$var$useMenuScope(__scopeDropdownMenu); - return /*#__PURE__*/$7dQ7Q$react.createElement($7dQ7Q$radixuireactmenu.Portal, $parcel$interopDefault($7dQ7Q$babelruntimehelpersextends)({}, menuScope, portalProps)); -}; -/*#__PURE__*/ -Object.assign($d1bf075a6b218014$export$cd369b4d4d54efc9, { - displayName: $d1bf075a6b218014$var$PORTAL_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * DropdownMenuContent - * -----------------------------------------------------------------------------------------------*/ -const $d1bf075a6b218014$var$CONTENT_NAME = 'DropdownMenuContent'; -const $d1bf075a6b218014$export$6e76d93a37c01248 = /*#__PURE__*/$7dQ7Q$react.forwardRef((props, forwardedRef) => { - const { - __scopeDropdownMenu: __scopeDropdownMenu, - ...contentProps - } = props; - const context = $d1bf075a6b218014$var$useDropdownMenuContext($d1bf075a6b218014$var$CONTENT_NAME, __scopeDropdownMenu); - const menuScope = $d1bf075a6b218014$var$useMenuScope(__scopeDropdownMenu); - const hasInteractedOutsideRef = $7dQ7Q$react.useRef(false); - return /*#__PURE__*/$7dQ7Q$react.createElement($7dQ7Q$radixuireactmenu.Content, $parcel$interopDefault($7dQ7Q$babelruntimehelpersextends)({ - id: context.contentId, - "aria-labelledby": context.triggerId - }, menuScope, contentProps, { - ref: forwardedRef, - onCloseAutoFocus: $7dQ7Q$radixuiprimitive.composeEventHandlers(props.onCloseAutoFocus, event => { - var _context$triggerRef$c; - if (!hasInteractedOutsideRef.current) (_context$triggerRef$c = context.triggerRef.current) === null || _context$triggerRef$c === void 0 || _context$triggerRef$c.focus(); - hasInteractedOutsideRef.current = false; // Always prevent auto focus because we either focus manually or want user agent focus - event.preventDefault(); - }), - onInteractOutside: $7dQ7Q$radixuiprimitive.composeEventHandlers(props.onInteractOutside, event => { - const originalEvent = event.detail.originalEvent; - const ctrlLeftClick = originalEvent.button === 0 && originalEvent.ctrlKey === true; - const isRightClick = originalEvent.button === 2 || ctrlLeftClick; - if (!context.modal || isRightClick) hasInteractedOutsideRef.current = true; - }), - style: { - ...props.style, - '--radix-dropdown-menu-content-transform-origin': 'var(--radix-popper-transform-origin)', - '--radix-dropdown-menu-content-available-width': 'var(--radix-popper-available-width)', - '--radix-dropdown-menu-content-available-height': 'var(--radix-popper-available-height)', - '--radix-dropdown-menu-trigger-width': 'var(--radix-popper-anchor-width)', - '--radix-dropdown-menu-trigger-height': 'var(--radix-popper-anchor-height)' - } - })); -}); -/*#__PURE__*/ -Object.assign($d1bf075a6b218014$export$6e76d93a37c01248, { - displayName: $d1bf075a6b218014$var$CONTENT_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * DropdownMenuGroup - * -----------------------------------------------------------------------------------------------*/ -const $d1bf075a6b218014$var$GROUP_NAME = 'DropdownMenuGroup'; -const $d1bf075a6b218014$export$246bebaba3a2f70e = /*#__PURE__*/$7dQ7Q$react.forwardRef((props, forwardedRef) => { - const { - __scopeDropdownMenu: __scopeDropdownMenu, - ...groupProps - } = props; - const menuScope = $d1bf075a6b218014$var$useMenuScope(__scopeDropdownMenu); - return /*#__PURE__*/$7dQ7Q$react.createElement($7dQ7Q$radixuireactmenu.Group, $parcel$interopDefault($7dQ7Q$babelruntimehelpersextends)({}, menuScope, groupProps, { - ref: forwardedRef - })); -}); -/*#__PURE__*/ -Object.assign($d1bf075a6b218014$export$246bebaba3a2f70e, { - displayName: $d1bf075a6b218014$var$GROUP_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * DropdownMenuLabel - * -----------------------------------------------------------------------------------------------*/ -const $d1bf075a6b218014$var$LABEL_NAME = 'DropdownMenuLabel'; -const $d1bf075a6b218014$export$76e48c5b57f24495 = /*#__PURE__*/$7dQ7Q$react.forwardRef((props, forwardedRef) => { - const { - __scopeDropdownMenu: __scopeDropdownMenu, - ...labelProps - } = props; - const menuScope = $d1bf075a6b218014$var$useMenuScope(__scopeDropdownMenu); - return /*#__PURE__*/$7dQ7Q$react.createElement($7dQ7Q$radixuireactmenu.Label, $parcel$interopDefault($7dQ7Q$babelruntimehelpersextends)({}, menuScope, labelProps, { - ref: forwardedRef - })); -}); -/*#__PURE__*/ -Object.assign($d1bf075a6b218014$export$76e48c5b57f24495, { - displayName: $d1bf075a6b218014$var$LABEL_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * DropdownMenuItem - * -----------------------------------------------------------------------------------------------*/ -const $d1bf075a6b218014$var$ITEM_NAME = 'DropdownMenuItem'; -const $d1bf075a6b218014$export$ed97964d1871885d = /*#__PURE__*/$7dQ7Q$react.forwardRef((props, forwardedRef) => { - const { - __scopeDropdownMenu: __scopeDropdownMenu, - ...itemProps - } = props; - const menuScope = $d1bf075a6b218014$var$useMenuScope(__scopeDropdownMenu); - return /*#__PURE__*/$7dQ7Q$react.createElement($7dQ7Q$radixuireactmenu.Item, $parcel$interopDefault($7dQ7Q$babelruntimehelpersextends)({}, menuScope, itemProps, { - ref: forwardedRef - })); -}); -/*#__PURE__*/ -Object.assign($d1bf075a6b218014$export$ed97964d1871885d, { - displayName: $d1bf075a6b218014$var$ITEM_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * DropdownMenuCheckboxItem - * -----------------------------------------------------------------------------------------------*/ -const $d1bf075a6b218014$var$CHECKBOX_ITEM_NAME = 'DropdownMenuCheckboxItem'; -const $d1bf075a6b218014$export$53a69729da201fa9 = /*#__PURE__*/$7dQ7Q$react.forwardRef((props, forwardedRef) => { - const { - __scopeDropdownMenu: __scopeDropdownMenu, - ...checkboxItemProps - } = props; - const menuScope = $d1bf075a6b218014$var$useMenuScope(__scopeDropdownMenu); - return /*#__PURE__*/$7dQ7Q$react.createElement($7dQ7Q$radixuireactmenu.CheckboxItem, $parcel$interopDefault($7dQ7Q$babelruntimehelpersextends)({}, menuScope, checkboxItemProps, { - ref: forwardedRef - })); -}); -/*#__PURE__*/ -Object.assign($d1bf075a6b218014$export$53a69729da201fa9, { - displayName: $d1bf075a6b218014$var$CHECKBOX_ITEM_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * DropdownMenuRadioGroup - * -----------------------------------------------------------------------------------------------*/ -const $d1bf075a6b218014$var$RADIO_GROUP_NAME = 'DropdownMenuRadioGroup'; -const $d1bf075a6b218014$export$3323ad73d55f587e = /*#__PURE__*/$7dQ7Q$react.forwardRef((props, forwardedRef) => { - const { - __scopeDropdownMenu: __scopeDropdownMenu, - ...radioGroupProps - } = props; - const menuScope = $d1bf075a6b218014$var$useMenuScope(__scopeDropdownMenu); - return /*#__PURE__*/$7dQ7Q$react.createElement($7dQ7Q$radixuireactmenu.RadioGroup, $parcel$interopDefault($7dQ7Q$babelruntimehelpersextends)({}, menuScope, radioGroupProps, { - ref: forwardedRef - })); -}); -/*#__PURE__*/ -Object.assign($d1bf075a6b218014$export$3323ad73d55f587e, { - displayName: $d1bf075a6b218014$var$RADIO_GROUP_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * DropdownMenuRadioItem - * -----------------------------------------------------------------------------------------------*/ -const $d1bf075a6b218014$var$RADIO_ITEM_NAME = 'DropdownMenuRadioItem'; -const $d1bf075a6b218014$export$e4f69b41b1637536 = /*#__PURE__*/$7dQ7Q$react.forwardRef((props, forwardedRef) => { - const { - __scopeDropdownMenu: __scopeDropdownMenu, - ...radioItemProps - } = props; - const menuScope = $d1bf075a6b218014$var$useMenuScope(__scopeDropdownMenu); - return /*#__PURE__*/$7dQ7Q$react.createElement($7dQ7Q$radixuireactmenu.RadioItem, $parcel$interopDefault($7dQ7Q$babelruntimehelpersextends)({}, menuScope, radioItemProps, { - ref: forwardedRef - })); -}); -/*#__PURE__*/ -Object.assign($d1bf075a6b218014$export$e4f69b41b1637536, { - displayName: $d1bf075a6b218014$var$RADIO_ITEM_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * DropdownMenuItemIndicator - * -----------------------------------------------------------------------------------------------*/ -const $d1bf075a6b218014$var$INDICATOR_NAME = 'DropdownMenuItemIndicator'; -const $d1bf075a6b218014$export$42355ae145153fb6 = /*#__PURE__*/$7dQ7Q$react.forwardRef((props, forwardedRef) => { - const { - __scopeDropdownMenu: __scopeDropdownMenu, - ...itemIndicatorProps - } = props; - const menuScope = $d1bf075a6b218014$var$useMenuScope(__scopeDropdownMenu); - return /*#__PURE__*/$7dQ7Q$react.createElement($7dQ7Q$radixuireactmenu.ItemIndicator, $parcel$interopDefault($7dQ7Q$babelruntimehelpersextends)({}, menuScope, itemIndicatorProps, { - ref: forwardedRef - })); -}); -/*#__PURE__*/ -Object.assign($d1bf075a6b218014$export$42355ae145153fb6, { - displayName: $d1bf075a6b218014$var$INDICATOR_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * DropdownMenuSeparator - * -----------------------------------------------------------------------------------------------*/ -const $d1bf075a6b218014$var$SEPARATOR_NAME = 'DropdownMenuSeparator'; -const $d1bf075a6b218014$export$da160178fd3bc7e9 = /*#__PURE__*/$7dQ7Q$react.forwardRef((props, forwardedRef) => { - const { - __scopeDropdownMenu: __scopeDropdownMenu, - ...separatorProps - } = props; - const menuScope = $d1bf075a6b218014$var$useMenuScope(__scopeDropdownMenu); - return /*#__PURE__*/$7dQ7Q$react.createElement($7dQ7Q$radixuireactmenu.Separator, $parcel$interopDefault($7dQ7Q$babelruntimehelpersextends)({}, menuScope, separatorProps, { - ref: forwardedRef - })); -}); -/*#__PURE__*/ -Object.assign($d1bf075a6b218014$export$da160178fd3bc7e9, { - displayName: $d1bf075a6b218014$var$SEPARATOR_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * DropdownMenuArrow - * -----------------------------------------------------------------------------------------------*/ -const $d1bf075a6b218014$var$ARROW_NAME = 'DropdownMenuArrow'; -const $d1bf075a6b218014$export$34b8980744021ec5 = /*#__PURE__*/$7dQ7Q$react.forwardRef((props, forwardedRef) => { - const { - __scopeDropdownMenu: __scopeDropdownMenu, - ...arrowProps - } = props; - const menuScope = $d1bf075a6b218014$var$useMenuScope(__scopeDropdownMenu); - return /*#__PURE__*/$7dQ7Q$react.createElement($7dQ7Q$radixuireactmenu.Arrow, $parcel$interopDefault($7dQ7Q$babelruntimehelpersextends)({}, menuScope, arrowProps, { - ref: forwardedRef - })); -}); -/*#__PURE__*/ -Object.assign($d1bf075a6b218014$export$34b8980744021ec5, { - displayName: $d1bf075a6b218014$var$ARROW_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * DropdownMenuSub - * -----------------------------------------------------------------------------------------------*/ -const $d1bf075a6b218014$export$2f307d81a64f5442 = props => { - const { - __scopeDropdownMenu: __scopeDropdownMenu, - children: children, - open: openProp, - onOpenChange: onOpenChange, - defaultOpen: defaultOpen - } = props; - const menuScope = $d1bf075a6b218014$var$useMenuScope(__scopeDropdownMenu); - const [open = false, setOpen] = $7dQ7Q$radixuireactusecontrollablestate.useControllableState({ - prop: openProp, - defaultProp: defaultOpen, - onChange: onOpenChange - }); - return /*#__PURE__*/$7dQ7Q$react.createElement($7dQ7Q$radixuireactmenu.Sub, $parcel$interopDefault($7dQ7Q$babelruntimehelpersextends)({}, menuScope, { - open: open, - onOpenChange: setOpen - }), children); -}; -/* ------------------------------------------------------------------------------------------------- - * DropdownMenuSubTrigger - * -----------------------------------------------------------------------------------------------*/ -const $d1bf075a6b218014$var$SUB_TRIGGER_NAME = 'DropdownMenuSubTrigger'; -const $d1bf075a6b218014$export$21dcb7ec56f874cf = /*#__PURE__*/$7dQ7Q$react.forwardRef((props, forwardedRef) => { - const { - __scopeDropdownMenu: __scopeDropdownMenu, - ...subTriggerProps - } = props; - const menuScope = $d1bf075a6b218014$var$useMenuScope(__scopeDropdownMenu); - return /*#__PURE__*/$7dQ7Q$react.createElement($7dQ7Q$radixuireactmenu.SubTrigger, $parcel$interopDefault($7dQ7Q$babelruntimehelpersextends)({}, menuScope, subTriggerProps, { - ref: forwardedRef - })); -}); -/*#__PURE__*/ -Object.assign($d1bf075a6b218014$export$21dcb7ec56f874cf, { - displayName: $d1bf075a6b218014$var$SUB_TRIGGER_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * DropdownMenuSubContent - * -----------------------------------------------------------------------------------------------*/ -const $d1bf075a6b218014$var$SUB_CONTENT_NAME = 'DropdownMenuSubContent'; -const $d1bf075a6b218014$export$f34ec8bc2482cc5f = /*#__PURE__*/$7dQ7Q$react.forwardRef((props, forwardedRef) => { - const { - __scopeDropdownMenu: __scopeDropdownMenu, - ...subContentProps - } = props; - const menuScope = $d1bf075a6b218014$var$useMenuScope(__scopeDropdownMenu); - return /*#__PURE__*/$7dQ7Q$react.createElement($7dQ7Q$radixuireactmenu.SubContent, $parcel$interopDefault($7dQ7Q$babelruntimehelpersextends)({}, menuScope, subContentProps, { - ref: forwardedRef, - style: { - ...props.style, - '--radix-dropdown-menu-content-transform-origin': 'var(--radix-popper-transform-origin)', - '--radix-dropdown-menu-content-available-width': 'var(--radix-popper-available-width)', - '--radix-dropdown-menu-content-available-height': 'var(--radix-popper-available-height)', - '--radix-dropdown-menu-trigger-width': 'var(--radix-popper-anchor-width)', - '--radix-dropdown-menu-trigger-height': 'var(--radix-popper-anchor-height)' - } - })); -}); -/*#__PURE__*/ -Object.assign($d1bf075a6b218014$export$f34ec8bc2482cc5f, { - displayName: $d1bf075a6b218014$var$SUB_CONTENT_NAME -}); -/* -----------------------------------------------------------------------------------------------*/ -const $d1bf075a6b218014$export$be92b6f5f03c0fe9 = $d1bf075a6b218014$export$e44a253a59704894; -const $d1bf075a6b218014$export$41fb9f06171c75f4 = $d1bf075a6b218014$export$d2469213b3befba9; -const $d1bf075a6b218014$export$602eac185826482c = $d1bf075a6b218014$export$cd369b4d4d54efc9; -const $d1bf075a6b218014$export$7c6e2c02157bb7d2 = $d1bf075a6b218014$export$6e76d93a37c01248; -const $d1bf075a6b218014$export$eb2fcfdbd7ba97d4 = $d1bf075a6b218014$export$246bebaba3a2f70e; -const $d1bf075a6b218014$export$b04be29aa201d4f5 = $d1bf075a6b218014$export$76e48c5b57f24495; -const $d1bf075a6b218014$export$6d08773d2e66f8f2 = $d1bf075a6b218014$export$ed97964d1871885d; -const $d1bf075a6b218014$export$16ce288f89fa631c = $d1bf075a6b218014$export$53a69729da201fa9; -const $d1bf075a6b218014$export$a98f0dcb43a68a25 = $d1bf075a6b218014$export$3323ad73d55f587e; -const $d1bf075a6b218014$export$371ab307eab489c0 = $d1bf075a6b218014$export$e4f69b41b1637536; -const $d1bf075a6b218014$export$c3468e2714d175fa = $d1bf075a6b218014$export$42355ae145153fb6; -const $d1bf075a6b218014$export$1ff3c3f08ae963c0 = $d1bf075a6b218014$export$da160178fd3bc7e9; -const $d1bf075a6b218014$export$21b07c8f274aebd5 = $d1bf075a6b218014$export$34b8980744021ec5; -const $d1bf075a6b218014$export$d7a01e11500dfb6f = $d1bf075a6b218014$export$2f307d81a64f5442; -const $d1bf075a6b218014$export$2ea8a7a591ac5eac = $d1bf075a6b218014$export$21dcb7ec56f874cf; -const $d1bf075a6b218014$export$6d4de93b380beddf = $d1bf075a6b218014$export$f34ec8bc2482cc5f; - -/***/ }), - -/***/ "../../../node_modules/@radix-ui/react-focus-guards/dist/index.js": -/*!************************************************************************!*\ - !*** ../../../node_modules/@radix-ui/react-focus-guards/dist/index.js ***! - \************************************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - - -var $cnctE$react = __webpack_require__(/*! react */ "react"); -function $parcel$export(e, n, v, s) { - Object.defineProperty(e, n, { - get: v, - set: s, - enumerable: true, - configurable: true - }); -} -$parcel$export(module.exports, "FocusGuards", () => $71476a6ed7dbbaf3$export$ac5b58043b79449b); -$parcel$export(module.exports, "Root", () => $71476a6ed7dbbaf3$export$be92b6f5f03c0fe9); -$parcel$export(module.exports, "useFocusGuards", () => $71476a6ed7dbbaf3$export$b7ece24a22aeda8c); - -/** Number of components which have requested interest to have focus guards */ -let $71476a6ed7dbbaf3$var$count = 0; -function $71476a6ed7dbbaf3$export$ac5b58043b79449b(props) { - $71476a6ed7dbbaf3$export$b7ece24a22aeda8c(); - return props.children; -} -/** - * Injects a pair of focus guards at the edges of the whole DOM tree - * to ensure `focusin` & `focusout` events can be caught consistently. - */ -function $71476a6ed7dbbaf3$export$b7ece24a22aeda8c() { - $cnctE$react.useEffect(() => { - var _edgeGuards$, _edgeGuards$2; - const edgeGuards = document.querySelectorAll('[data-radix-focus-guard]'); - document.body.insertAdjacentElement('afterbegin', (_edgeGuards$ = edgeGuards[0]) !== null && _edgeGuards$ !== void 0 ? _edgeGuards$ : $71476a6ed7dbbaf3$var$createFocusGuard()); - document.body.insertAdjacentElement('beforeend', (_edgeGuards$2 = edgeGuards[1]) !== null && _edgeGuards$2 !== void 0 ? _edgeGuards$2 : $71476a6ed7dbbaf3$var$createFocusGuard()); - $71476a6ed7dbbaf3$var$count++; - return () => { - if ($71476a6ed7dbbaf3$var$count === 1) document.querySelectorAll('[data-radix-focus-guard]').forEach(node => node.remove()); - $71476a6ed7dbbaf3$var$count--; - }; - }, []); -} -function $71476a6ed7dbbaf3$var$createFocusGuard() { - const element = document.createElement('span'); - element.setAttribute('data-radix-focus-guard', ''); - element.tabIndex = 0; - element.style.cssText = 'outline: none; opacity: 0; position: fixed; pointer-events: none'; - return element; -} -const $71476a6ed7dbbaf3$export$be92b6f5f03c0fe9 = $71476a6ed7dbbaf3$export$ac5b58043b79449b; - -/***/ }), - -/***/ "../../../node_modules/@radix-ui/react-focus-scope/dist/index.js": -/*!***********************************************************************!*\ - !*** ../../../node_modules/@radix-ui/react-focus-scope/dist/index.js ***! - \***********************************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - - -var $buum9$babelruntimehelpersextends = __webpack_require__(/*! @babel/runtime/helpers/extends */ "../../../node_modules/@babel/runtime/helpers/extends.js"); -var $buum9$react = __webpack_require__(/*! react */ "react"); -var $buum9$radixuireactcomposerefs = __webpack_require__(/*! @radix-ui/react-compose-refs */ "../../../node_modules/@radix-ui/react-compose-refs/dist/index.js"); -var $buum9$radixuireactprimitive = __webpack_require__(/*! @radix-ui/react-primitive */ "../../../node_modules/@radix-ui/react-primitive/dist/index.js"); -var $buum9$radixuireactusecallbackref = __webpack_require__(/*! @radix-ui/react-use-callback-ref */ "../../../node_modules/@radix-ui/react-use-callback-ref/dist/index.js"); -function $parcel$export(e, n, v, s) { - Object.defineProperty(e, n, { - get: v, - set: s, - enumerable: true, - configurable: true - }); -} -function $parcel$interopDefault(a) { - return a && a.__esModule ? a.default : a; -} -$parcel$export(module.exports, "FocusScope", () => $2bc01e66e04aa9ed$export$20e40289641fbbb6); -$parcel$export(module.exports, "Root", () => $2bc01e66e04aa9ed$export$be92b6f5f03c0fe9); -const $2bc01e66e04aa9ed$var$AUTOFOCUS_ON_MOUNT = 'focusScope.autoFocusOnMount'; -const $2bc01e66e04aa9ed$var$AUTOFOCUS_ON_UNMOUNT = 'focusScope.autoFocusOnUnmount'; -const $2bc01e66e04aa9ed$var$EVENT_OPTIONS = { - bubbles: false, - cancelable: true -}; -/* ------------------------------------------------------------------------------------------------- - * FocusScope - * -----------------------------------------------------------------------------------------------*/ -const $2bc01e66e04aa9ed$var$FOCUS_SCOPE_NAME = 'FocusScope'; -const $2bc01e66e04aa9ed$export$20e40289641fbbb6 = /*#__PURE__*/$buum9$react.forwardRef((props, forwardedRef) => { - const { - loop = false, - trapped = false, - onMountAutoFocus: onMountAutoFocusProp, - onUnmountAutoFocus: onUnmountAutoFocusProp, - ...scopeProps - } = props; - const [container1, setContainer] = $buum9$react.useState(null); - const onMountAutoFocus = $buum9$radixuireactusecallbackref.useCallbackRef(onMountAutoFocusProp); - const onUnmountAutoFocus = $buum9$radixuireactusecallbackref.useCallbackRef(onUnmountAutoFocusProp); - const lastFocusedElementRef = $buum9$react.useRef(null); - const composedRefs = $buum9$radixuireactcomposerefs.useComposedRefs(forwardedRef, node => setContainer(node)); - const focusScope = $buum9$react.useRef({ - paused: false, - pause() { - this.paused = true; - }, - resume() { - this.paused = false; - } - }).current; // Takes care of trapping focus if focus is moved outside programmatically for example - $buum9$react.useEffect(() => { - if (trapped) { - function handleFocusIn(event) { - if (focusScope.paused || !container1) return; - const target = event.target; - if (container1.contains(target)) lastFocusedElementRef.current = target;else $2bc01e66e04aa9ed$var$focus(lastFocusedElementRef.current, { - select: true - }); - } - function handleFocusOut(event) { - if (focusScope.paused || !container1) return; - const relatedTarget = event.relatedTarget; // A `focusout` event with a `null` `relatedTarget` will happen in at least two cases: - // - // 1. When the user switches app/tabs/windows/the browser itself loses focus. - // 2. In Google Chrome, when the focused element is removed from the DOM. - // - // We let the browser do its thing here because: - // - // 1. The browser already keeps a memory of what's focused for when the page gets refocused. - // 2. In Google Chrome, if we try to focus the deleted focused element (as per below), it - // throws the CPU to 100%, so we avoid doing anything for this reason here too. - if (relatedTarget === null) return; // If the focus has moved to an actual legitimate element (`relatedTarget !== null`) - // that is outside the container, we move focus to the last valid focused element inside. - if (!container1.contains(relatedTarget)) $2bc01e66e04aa9ed$var$focus(lastFocusedElementRef.current, { - select: true - }); - } // When the focused element gets removed from the DOM, browsers move focus - // back to the document.body. In this case, we move focus to the container - // to keep focus trapped correctly. - function handleMutations(mutations) { - const focusedElement = document.activeElement; - for (const mutation of mutations) { - if (mutation.removedNodes.length > 0) { - if (!(container1 !== null && container1 !== void 0 && container1.contains(focusedElement))) $2bc01e66e04aa9ed$var$focus(container1); - } - } - } - document.addEventListener('focusin', handleFocusIn); - document.addEventListener('focusout', handleFocusOut); - const mutationObserver = new MutationObserver(handleMutations); - if (container1) mutationObserver.observe(container1, { - childList: true, - subtree: true - }); - return () => { - document.removeEventListener('focusin', handleFocusIn); - document.removeEventListener('focusout', handleFocusOut); - mutationObserver.disconnect(); - }; - } - }, [trapped, container1, focusScope.paused]); - $buum9$react.useEffect(() => { - if (container1) { - $2bc01e66e04aa9ed$var$focusScopesStack.add(focusScope); - const previouslyFocusedElement = document.activeElement; - const hasFocusedCandidate = container1.contains(previouslyFocusedElement); - if (!hasFocusedCandidate) { - const mountEvent = new CustomEvent($2bc01e66e04aa9ed$var$AUTOFOCUS_ON_MOUNT, $2bc01e66e04aa9ed$var$EVENT_OPTIONS); - container1.addEventListener($2bc01e66e04aa9ed$var$AUTOFOCUS_ON_MOUNT, onMountAutoFocus); - container1.dispatchEvent(mountEvent); - if (!mountEvent.defaultPrevented) { - $2bc01e66e04aa9ed$var$focusFirst($2bc01e66e04aa9ed$var$removeLinks($2bc01e66e04aa9ed$var$getTabbableCandidates(container1)), { - select: true - }); - if (document.activeElement === previouslyFocusedElement) $2bc01e66e04aa9ed$var$focus(container1); - } - } - return () => { - container1.removeEventListener($2bc01e66e04aa9ed$var$AUTOFOCUS_ON_MOUNT, onMountAutoFocus); // We hit a react bug (fixed in v17) with focusing in unmount. - // We need to delay the focus a little to get around it for now. - // See: https://github.com/facebook/react/issues/17894 - setTimeout(() => { - const unmountEvent = new CustomEvent($2bc01e66e04aa9ed$var$AUTOFOCUS_ON_UNMOUNT, $2bc01e66e04aa9ed$var$EVENT_OPTIONS); - container1.addEventListener($2bc01e66e04aa9ed$var$AUTOFOCUS_ON_UNMOUNT, onUnmountAutoFocus); - container1.dispatchEvent(unmountEvent); - if (!unmountEvent.defaultPrevented) $2bc01e66e04aa9ed$var$focus(previouslyFocusedElement !== null && previouslyFocusedElement !== void 0 ? previouslyFocusedElement : document.body, { - select: true - }); - // we need to remove the listener after we `dispatchEvent` - container1.removeEventListener($2bc01e66e04aa9ed$var$AUTOFOCUS_ON_UNMOUNT, onUnmountAutoFocus); - $2bc01e66e04aa9ed$var$focusScopesStack.remove(focusScope); - }, 0); - }; - } - }, [container1, onMountAutoFocus, onUnmountAutoFocus, focusScope]); // Takes care of looping focus (when tabbing whilst at the edges) - const handleKeyDown = $buum9$react.useCallback(event => { - if (!loop && !trapped) return; - if (focusScope.paused) return; - const isTabKey = event.key === 'Tab' && !event.altKey && !event.ctrlKey && !event.metaKey; - const focusedElement = document.activeElement; - if (isTabKey && focusedElement) { - const container = event.currentTarget; - const [first, last] = $2bc01e66e04aa9ed$var$getTabbableEdges(container); - const hasTabbableElementsInside = first && last; // we can only wrap focus if we have tabbable edges - if (!hasTabbableElementsInside) { - if (focusedElement === container) event.preventDefault(); - } else { - if (!event.shiftKey && focusedElement === last) { - event.preventDefault(); - if (loop) $2bc01e66e04aa9ed$var$focus(first, { - select: true - }); - } else if (event.shiftKey && focusedElement === first) { - event.preventDefault(); - if (loop) $2bc01e66e04aa9ed$var$focus(last, { - select: true - }); - } - } - } - }, [loop, trapped, focusScope.paused]); - return /*#__PURE__*/$buum9$react.createElement($buum9$radixuireactprimitive.Primitive.div, $parcel$interopDefault($buum9$babelruntimehelpersextends)({ - tabIndex: -1 - }, scopeProps, { - ref: composedRefs, - onKeyDown: handleKeyDown - })); -}); -/*#__PURE__*/ -Object.assign($2bc01e66e04aa9ed$export$20e40289641fbbb6, { - displayName: $2bc01e66e04aa9ed$var$FOCUS_SCOPE_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * Utils - * -----------------------------------------------------------------------------------------------*/ /** - * Attempts focusing the first element in a list of candidates. - * Stops when focus has actually moved. - */ -function $2bc01e66e04aa9ed$var$focusFirst(candidates) { - let { - select = false - } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - const previouslyFocusedElement = document.activeElement; - for (const candidate of candidates) { - $2bc01e66e04aa9ed$var$focus(candidate, { - select: select - }); - if (document.activeElement !== previouslyFocusedElement) return; - } -} -/** - * Returns the first and last tabbable elements inside a container. - */ -function $2bc01e66e04aa9ed$var$getTabbableEdges(container) { - const candidates = $2bc01e66e04aa9ed$var$getTabbableCandidates(container); - const first = $2bc01e66e04aa9ed$var$findVisible(candidates, container); - const last = $2bc01e66e04aa9ed$var$findVisible(candidates.reverse(), container); - return [first, last]; -} -/** - * Returns a list of potential tabbable candidates. - * - * NOTE: This is only a close approximation. For example it doesn't take into account cases like when - * elements are not visible. This cannot be worked out easily by just reading a property, but rather - * necessitate runtime knowledge (computed styles, etc). We deal with these cases separately. - * - * See: https://developer.mozilla.org/en-US/docs/Web/API/TreeWalker - * Credit: https://github.com/discord/focus-layers/blob/master/src/util/wrapFocus.tsx#L1 - */ -function $2bc01e66e04aa9ed$var$getTabbableCandidates(container) { - const nodes = []; - const walker = document.createTreeWalker(container, NodeFilter.SHOW_ELEMENT, { - acceptNode: node => { - const isHiddenInput = node.tagName === 'INPUT' && node.type === 'hidden'; - if (node.disabled || node.hidden || isHiddenInput) return NodeFilter.FILTER_SKIP; // `.tabIndex` is not the same as the `tabindex` attribute. It works on the - // runtime's understanding of tabbability, so this automatically accounts - // for any kind of element that could be tabbed to. - return node.tabIndex >= 0 ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP; - } - }); - while (walker.nextNode()) nodes.push(walker.currentNode); // we do not take into account the order of nodes with positive `tabIndex` as it - // hinders accessibility to have tab order different from visual order. - return nodes; -} -/** - * Returns the first visible element in a list. - * NOTE: Only checks visibility up to the `container`. - */ -function $2bc01e66e04aa9ed$var$findVisible(elements, container) { - for (const element of elements) { - // we stop checking if it's hidden at the `container` level (excluding) - if (!$2bc01e66e04aa9ed$var$isHidden(element, { - upTo: container - })) return element; - } -} -function $2bc01e66e04aa9ed$var$isHidden(node, _ref) { - let { - upTo: upTo - } = _ref; - if (getComputedStyle(node).visibility === 'hidden') return true; - while (node) { - // we stop at `upTo` (excluding it) - if (upTo !== undefined && node === upTo) return false; - if (getComputedStyle(node).display === 'none') return true; - node = node.parentElement; - } - return false; -} -function $2bc01e66e04aa9ed$var$isSelectableInput(element) { - return element instanceof HTMLInputElement && 'select' in element; -} -function $2bc01e66e04aa9ed$var$focus(element) { - let { - select = false - } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - // only focus if that element is focusable - if (element && element.focus) { - const previouslyFocusedElement = document.activeElement; // NOTE: we prevent scrolling on focus, to minimize jarring transitions for users - element.focus({ - preventScroll: true - }); // only select if its not the same element, it supports selection and we need to select - if (element !== previouslyFocusedElement && $2bc01e66e04aa9ed$var$isSelectableInput(element) && select) element.select(); - } -} -/* ------------------------------------------------------------------------------------------------- - * FocusScope stack - * -----------------------------------------------------------------------------------------------*/ -const $2bc01e66e04aa9ed$var$focusScopesStack = $2bc01e66e04aa9ed$var$createFocusScopesStack(); -function $2bc01e66e04aa9ed$var$createFocusScopesStack() { - /** A stack of focus scopes, with the active one at the top */let stack = []; - return { - add(focusScope) { - // pause the currently active focus scope (at the top of the stack) - const activeFocusScope = stack[0]; - if (focusScope !== activeFocusScope) activeFocusScope === null || activeFocusScope === void 0 || activeFocusScope.pause(); - // remove in case it already exists (because we'll re-add it at the top of the stack) - stack = $2bc01e66e04aa9ed$var$arrayRemove(stack, focusScope); - stack.unshift(focusScope); - }, - remove(focusScope) { - var _stack$; - stack = $2bc01e66e04aa9ed$var$arrayRemove(stack, focusScope); - (_stack$ = stack[0]) === null || _stack$ === void 0 || _stack$.resume(); - } - }; -} -function $2bc01e66e04aa9ed$var$arrayRemove(array, item) { - const updatedArray = [...array]; - const index = updatedArray.indexOf(item); - if (index !== -1) updatedArray.splice(index, 1); - return updatedArray; -} -function $2bc01e66e04aa9ed$var$removeLinks(items) { - return items.filter(item => item.tagName !== 'A'); -} -const $2bc01e66e04aa9ed$export$be92b6f5f03c0fe9 = $2bc01e66e04aa9ed$export$20e40289641fbbb6; - -/***/ }), - -/***/ "../../../node_modules/@radix-ui/react-id/dist/index.js": -/*!**************************************************************!*\ - !*** ../../../node_modules/@radix-ui/react-id/dist/index.js ***! - \**************************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - - -var $47woD$react = __webpack_require__(/*! react */ "react"); -var $47woD$radixuireactuselayouteffect = __webpack_require__(/*! @radix-ui/react-use-layout-effect */ "../../../node_modules/@radix-ui/react-use-layout-effect/dist/index.js"); -function $parcel$export(e, n, v, s) { - Object.defineProperty(e, n, { - get: v, - set: s, - enumerable: true, - configurable: true - }); -} -$parcel$export(module.exports, "useId", () => $dc478e4659f630c5$export$f680877a34711e37); -const $dc478e4659f630c5$var$useReactId = $47woD$react['useId'.toString()] || (() => undefined); -let $dc478e4659f630c5$var$count = 0; -function $dc478e4659f630c5$export$f680877a34711e37(deterministicId) { - const [id, setId] = $47woD$react.useState($dc478e4659f630c5$var$useReactId()); // React versions older than 18 will have client-side ids only. - $47woD$radixuireactuselayouteffect.useLayoutEffect(() => { - if (!deterministicId) setId(reactId => reactId !== null && reactId !== void 0 ? reactId : String($dc478e4659f630c5$var$count++)); - }, [deterministicId]); - return deterministicId || (id ? `radix-${id}` : ''); -} - -/***/ }), - -/***/ "../../../node_modules/@radix-ui/react-menu/dist/index.js": -/*!****************************************************************!*\ - !*** ../../../node_modules/@radix-ui/react-menu/dist/index.js ***! - \****************************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - - -var $cnSS2$babelruntimehelpersextends = __webpack_require__(/*! @babel/runtime/helpers/extends */ "../../../node_modules/@babel/runtime/helpers/extends.js"); -var $cnSS2$react = __webpack_require__(/*! react */ "react"); -var $cnSS2$radixuiprimitive = __webpack_require__(/*! @radix-ui/primitive */ "../../../node_modules/@radix-ui/primitive/dist/index.js"); -var $cnSS2$radixuireactcollection = __webpack_require__(/*! @radix-ui/react-collection */ "../../../node_modules/@radix-ui/react-collection/dist/index.js"); -var $cnSS2$radixuireactcomposerefs = __webpack_require__(/*! @radix-ui/react-compose-refs */ "../../../node_modules/@radix-ui/react-compose-refs/dist/index.js"); -var $cnSS2$radixuireactcontext = __webpack_require__(/*! @radix-ui/react-context */ "../../../node_modules/@radix-ui/react-context/dist/index.js"); -var $cnSS2$radixuireactdirection = __webpack_require__(/*! @radix-ui/react-direction */ "../../../node_modules/@radix-ui/react-direction/dist/index.js"); -var $cnSS2$radixuireactdismissablelayer = __webpack_require__(/*! @radix-ui/react-dismissable-layer */ "../../../node_modules/@radix-ui/react-dismissable-layer/dist/index.js"); -var $cnSS2$radixuireactfocusguards = __webpack_require__(/*! @radix-ui/react-focus-guards */ "../../../node_modules/@radix-ui/react-focus-guards/dist/index.js"); -var $cnSS2$radixuireactfocusscope = __webpack_require__(/*! @radix-ui/react-focus-scope */ "../../../node_modules/@radix-ui/react-focus-scope/dist/index.js"); -var $cnSS2$radixuireactid = __webpack_require__(/*! @radix-ui/react-id */ "../../../node_modules/@radix-ui/react-id/dist/index.js"); -var $cnSS2$radixuireactpopper = __webpack_require__(/*! @radix-ui/react-popper */ "../../../node_modules/@radix-ui/react-popper/dist/index.js"); -var $cnSS2$radixuireactportal = __webpack_require__(/*! @radix-ui/react-portal */ "../../../node_modules/@radix-ui/react-portal/dist/index.js"); -var $cnSS2$radixuireactpresence = __webpack_require__(/*! @radix-ui/react-presence */ "../../../node_modules/@radix-ui/react-presence/dist/index.js"); -var $cnSS2$radixuireactprimitive = __webpack_require__(/*! @radix-ui/react-primitive */ "../../../node_modules/@radix-ui/react-primitive/dist/index.js"); -var $cnSS2$radixuireactrovingfocus = __webpack_require__(/*! @radix-ui/react-roving-focus */ "../../../node_modules/@radix-ui/react-roving-focus/dist/index.js"); -var $cnSS2$radixuireactslot = __webpack_require__(/*! @radix-ui/react-slot */ "../../../node_modules/@radix-ui/react-slot/dist/index.js"); -var $cnSS2$radixuireactusecallbackref = __webpack_require__(/*! @radix-ui/react-use-callback-ref */ "../../../node_modules/@radix-ui/react-use-callback-ref/dist/index.js"); -var $cnSS2$ariahidden = __webpack_require__(/*! aria-hidden */ "../../../node_modules/aria-hidden/dist/es2015/index.js"); -var $cnSS2$reactremovescroll = __webpack_require__(/*! react-remove-scroll */ "../../../node_modules/react-remove-scroll/dist/es2015/index.js"); -function $parcel$export(e, n, v, s) { - Object.defineProperty(e, n, { - get: v, - set: s, - enumerable: true, - configurable: true - }); -} -function $parcel$interopDefault(a) { - return a && a.__esModule ? a.default : a; -} -$parcel$export(module.exports, "createMenuScope", () => $213e4d2df823067d$export$4027731b685e72eb); -$parcel$export(module.exports, "Menu", () => $213e4d2df823067d$export$d9b273488cd8ce6f); -$parcel$export(module.exports, "MenuAnchor", () => $213e4d2df823067d$export$9fa5ebd18bee4d43); -$parcel$export(module.exports, "MenuPortal", () => $213e4d2df823067d$export$793392f970497feb); -$parcel$export(module.exports, "MenuContent", () => $213e4d2df823067d$export$479f0f2f71193efe); -$parcel$export(module.exports, "MenuGroup", () => $213e4d2df823067d$export$22a631d1f72787bb); -$parcel$export(module.exports, "MenuLabel", () => $213e4d2df823067d$export$dd37bec0e8a99143); -$parcel$export(module.exports, "MenuItem", () => $213e4d2df823067d$export$2ce376c2cc3355c8); -$parcel$export(module.exports, "MenuCheckboxItem", () => $213e4d2df823067d$export$f6f243521332502d); -$parcel$export(module.exports, "MenuRadioGroup", () => $213e4d2df823067d$export$ea2200c9eee416b3); -$parcel$export(module.exports, "MenuRadioItem", () => $213e4d2df823067d$export$69bd225e9817f6d0); -$parcel$export(module.exports, "MenuItemIndicator", () => $213e4d2df823067d$export$a2593e23056970a3); -$parcel$export(module.exports, "MenuSeparator", () => $213e4d2df823067d$export$1cec7dcdd713e220); -$parcel$export(module.exports, "MenuArrow", () => $213e4d2df823067d$export$bcdda4773debf5fa); -$parcel$export(module.exports, "MenuSub", () => $213e4d2df823067d$export$71bdb9d1e2909932); -$parcel$export(module.exports, "MenuSubTrigger", () => $213e4d2df823067d$export$5fbbb3ba7297405f); -$parcel$export(module.exports, "MenuSubContent", () => $213e4d2df823067d$export$e7142ab31822bde6); -$parcel$export(module.exports, "Root", () => $213e4d2df823067d$export$be92b6f5f03c0fe9); -$parcel$export(module.exports, "Anchor", () => $213e4d2df823067d$export$b688253958b8dfe7); -$parcel$export(module.exports, "Portal", () => $213e4d2df823067d$export$602eac185826482c); -$parcel$export(module.exports, "Content", () => $213e4d2df823067d$export$7c6e2c02157bb7d2); -$parcel$export(module.exports, "Group", () => $213e4d2df823067d$export$eb2fcfdbd7ba97d4); -$parcel$export(module.exports, "Label", () => $213e4d2df823067d$export$b04be29aa201d4f5); -$parcel$export(module.exports, "Item", () => $213e4d2df823067d$export$6d08773d2e66f8f2); -$parcel$export(module.exports, "CheckboxItem", () => $213e4d2df823067d$export$16ce288f89fa631c); -$parcel$export(module.exports, "RadioGroup", () => $213e4d2df823067d$export$a98f0dcb43a68a25); -$parcel$export(module.exports, "RadioItem", () => $213e4d2df823067d$export$371ab307eab489c0); -$parcel$export(module.exports, "ItemIndicator", () => $213e4d2df823067d$export$c3468e2714d175fa); -$parcel$export(module.exports, "Separator", () => $213e4d2df823067d$export$1ff3c3f08ae963c0); -$parcel$export(module.exports, "Arrow", () => $213e4d2df823067d$export$21b07c8f274aebd5); -$parcel$export(module.exports, "Sub", () => $213e4d2df823067d$export$d7a01e11500dfb6f); -$parcel$export(module.exports, "SubTrigger", () => $213e4d2df823067d$export$2ea8a7a591ac5eac); -$parcel$export(module.exports, "SubContent", () => $213e4d2df823067d$export$6d4de93b380beddf); -const $213e4d2df823067d$var$SELECTION_KEYS = ['Enter', ' ']; -const $213e4d2df823067d$var$FIRST_KEYS = ['ArrowDown', 'PageUp', 'Home']; -const $213e4d2df823067d$var$LAST_KEYS = ['ArrowUp', 'PageDown', 'End']; -const $213e4d2df823067d$var$FIRST_LAST_KEYS = [...$213e4d2df823067d$var$FIRST_KEYS, ...$213e4d2df823067d$var$LAST_KEYS]; -const $213e4d2df823067d$var$SUB_OPEN_KEYS = { - ltr: [...$213e4d2df823067d$var$SELECTION_KEYS, 'ArrowRight'], - rtl: [...$213e4d2df823067d$var$SELECTION_KEYS, 'ArrowLeft'] -}; -const $213e4d2df823067d$var$SUB_CLOSE_KEYS = { - ltr: ['ArrowLeft'], - rtl: ['ArrowRight'] -}; -/* ------------------------------------------------------------------------------------------------- - * Menu - * -----------------------------------------------------------------------------------------------*/ -const $213e4d2df823067d$var$MENU_NAME = 'Menu'; -const [$213e4d2df823067d$var$Collection, $213e4d2df823067d$var$useCollection, $213e4d2df823067d$var$createCollectionScope] = $cnSS2$radixuireactcollection.createCollection($213e4d2df823067d$var$MENU_NAME); -const [$213e4d2df823067d$var$createMenuContext, $213e4d2df823067d$export$4027731b685e72eb] = $cnSS2$radixuireactcontext.createContextScope($213e4d2df823067d$var$MENU_NAME, [$213e4d2df823067d$var$createCollectionScope, $cnSS2$radixuireactpopper.createPopperScope, $cnSS2$radixuireactrovingfocus.createRovingFocusGroupScope]); -const $213e4d2df823067d$var$usePopperScope = $cnSS2$radixuireactpopper.createPopperScope(); -const $213e4d2df823067d$var$useRovingFocusGroupScope = $cnSS2$radixuireactrovingfocus.createRovingFocusGroupScope(); -const [$213e4d2df823067d$var$MenuProvider, $213e4d2df823067d$var$useMenuContext] = $213e4d2df823067d$var$createMenuContext($213e4d2df823067d$var$MENU_NAME); -const [$213e4d2df823067d$var$MenuRootProvider, $213e4d2df823067d$var$useMenuRootContext] = $213e4d2df823067d$var$createMenuContext($213e4d2df823067d$var$MENU_NAME); -const $213e4d2df823067d$export$d9b273488cd8ce6f = props => { - const { - __scopeMenu: __scopeMenu, - open = false, - children: children, - dir: dir, - onOpenChange: onOpenChange, - modal = true - } = props; - const popperScope = $213e4d2df823067d$var$usePopperScope(__scopeMenu); - const [content, setContent] = $cnSS2$react.useState(null); - const isUsingKeyboardRef = $cnSS2$react.useRef(false); - const handleOpenChange = $cnSS2$radixuireactusecallbackref.useCallbackRef(onOpenChange); - const direction = $cnSS2$radixuireactdirection.useDirection(dir); - $cnSS2$react.useEffect(() => { - // Capture phase ensures we set the boolean before any side effects execute - // in response to the key or pointer event as they might depend on this value. - const handleKeyDown = () => { - isUsingKeyboardRef.current = true; - document.addEventListener('pointerdown', handlePointer, { - capture: true, - once: true - }); - document.addEventListener('pointermove', handlePointer, { - capture: true, - once: true - }); - }; - const handlePointer = () => isUsingKeyboardRef.current = false; - document.addEventListener('keydown', handleKeyDown, { - capture: true - }); - return () => { - document.removeEventListener('keydown', handleKeyDown, { - capture: true - }); - document.removeEventListener('pointerdown', handlePointer, { - capture: true - }); - document.removeEventListener('pointermove', handlePointer, { - capture: true - }); - }; - }, []); - return /*#__PURE__*/$cnSS2$react.createElement($cnSS2$radixuireactpopper.Root, popperScope, /*#__PURE__*/$cnSS2$react.createElement($213e4d2df823067d$var$MenuProvider, { - scope: __scopeMenu, - open: open, - onOpenChange: handleOpenChange, - content: content, - onContentChange: setContent - }, /*#__PURE__*/$cnSS2$react.createElement($213e4d2df823067d$var$MenuRootProvider, { - scope: __scopeMenu, - onClose: $cnSS2$react.useCallback(() => handleOpenChange(false), [handleOpenChange]), - isUsingKeyboardRef: isUsingKeyboardRef, - dir: direction, - modal: modal - }, children))); -}; -/*#__PURE__*/ -Object.assign($213e4d2df823067d$export$d9b273488cd8ce6f, { - displayName: $213e4d2df823067d$var$MENU_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * MenuAnchor - * -----------------------------------------------------------------------------------------------*/ -const $213e4d2df823067d$var$ANCHOR_NAME = 'MenuAnchor'; -const $213e4d2df823067d$export$9fa5ebd18bee4d43 = /*#__PURE__*/$cnSS2$react.forwardRef((props, forwardedRef) => { - const { - __scopeMenu: __scopeMenu, - ...anchorProps - } = props; - const popperScope = $213e4d2df823067d$var$usePopperScope(__scopeMenu); - return /*#__PURE__*/$cnSS2$react.createElement($cnSS2$radixuireactpopper.Anchor, $parcel$interopDefault($cnSS2$babelruntimehelpersextends)({}, popperScope, anchorProps, { - ref: forwardedRef - })); -}); -/*#__PURE__*/ -Object.assign($213e4d2df823067d$export$9fa5ebd18bee4d43, { - displayName: $213e4d2df823067d$var$ANCHOR_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * MenuPortal - * -----------------------------------------------------------------------------------------------*/ -const $213e4d2df823067d$var$PORTAL_NAME = 'MenuPortal'; -const [$213e4d2df823067d$var$PortalProvider, $213e4d2df823067d$var$usePortalContext] = $213e4d2df823067d$var$createMenuContext($213e4d2df823067d$var$PORTAL_NAME, { - forceMount: undefined -}); -const $213e4d2df823067d$export$793392f970497feb = props => { - const { - __scopeMenu: __scopeMenu, - forceMount: forceMount, - children: children, - container: container - } = props; - const context = $213e4d2df823067d$var$useMenuContext($213e4d2df823067d$var$PORTAL_NAME, __scopeMenu); - return /*#__PURE__*/$cnSS2$react.createElement($213e4d2df823067d$var$PortalProvider, { - scope: __scopeMenu, - forceMount: forceMount - }, /*#__PURE__*/$cnSS2$react.createElement($cnSS2$radixuireactpresence.Presence, { - present: forceMount || context.open - }, /*#__PURE__*/$cnSS2$react.createElement($cnSS2$radixuireactportal.Portal, { - asChild: true, - container: container - }, children))); -}; -/*#__PURE__*/ -Object.assign($213e4d2df823067d$export$793392f970497feb, { - displayName: $213e4d2df823067d$var$PORTAL_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * MenuContent - * -----------------------------------------------------------------------------------------------*/ -const $213e4d2df823067d$var$CONTENT_NAME = 'MenuContent'; -const [$213e4d2df823067d$var$MenuContentProvider, $213e4d2df823067d$var$useMenuContentContext] = $213e4d2df823067d$var$createMenuContext($213e4d2df823067d$var$CONTENT_NAME); -const $213e4d2df823067d$export$479f0f2f71193efe = /*#__PURE__*/$cnSS2$react.forwardRef((props, forwardedRef) => { - const portalContext = $213e4d2df823067d$var$usePortalContext($213e4d2df823067d$var$CONTENT_NAME, props.__scopeMenu); - const { - forceMount = portalContext.forceMount, - ...contentProps - } = props; - const context = $213e4d2df823067d$var$useMenuContext($213e4d2df823067d$var$CONTENT_NAME, props.__scopeMenu); - const rootContext = $213e4d2df823067d$var$useMenuRootContext($213e4d2df823067d$var$CONTENT_NAME, props.__scopeMenu); - return /*#__PURE__*/$cnSS2$react.createElement($213e4d2df823067d$var$Collection.Provider, { - scope: props.__scopeMenu - }, /*#__PURE__*/$cnSS2$react.createElement($cnSS2$radixuireactpresence.Presence, { - present: forceMount || context.open - }, /*#__PURE__*/$cnSS2$react.createElement($213e4d2df823067d$var$Collection.Slot, { - scope: props.__scopeMenu - }, rootContext.modal ? /*#__PURE__*/$cnSS2$react.createElement($213e4d2df823067d$var$MenuRootContentModal, $parcel$interopDefault($cnSS2$babelruntimehelpersextends)({}, contentProps, { - ref: forwardedRef - })) : /*#__PURE__*/$cnSS2$react.createElement($213e4d2df823067d$var$MenuRootContentNonModal, $parcel$interopDefault($cnSS2$babelruntimehelpersextends)({}, contentProps, { - ref: forwardedRef - }))))); -}); -/* ---------------------------------------------------------------------------------------------- */ -const $213e4d2df823067d$var$MenuRootContentModal = /*#__PURE__*/$cnSS2$react.forwardRef((props, forwardedRef) => { - const context = $213e4d2df823067d$var$useMenuContext($213e4d2df823067d$var$CONTENT_NAME, props.__scopeMenu); - const ref = $cnSS2$react.useRef(null); - const composedRefs = $cnSS2$radixuireactcomposerefs.useComposedRefs(forwardedRef, ref); // Hide everything from ARIA except the `MenuContent` - $cnSS2$react.useEffect(() => { - const content = ref.current; - if (content) return $cnSS2$ariahidden.hideOthers(content); - }, []); - return /*#__PURE__*/$cnSS2$react.createElement($213e4d2df823067d$var$MenuContentImpl, $parcel$interopDefault($cnSS2$babelruntimehelpersextends)({}, props, { - ref: composedRefs // we make sure we're not trapping once it's been closed - , - - trapFocus: context.open // make sure to only disable pointer events when open - , - - disableOutsidePointerEvents: context.open, - disableOutsideScroll: true // When focus is trapped, a `focusout` event may still happen. - , - - onFocusOutside: $cnSS2$radixuiprimitive.composeEventHandlers(props.onFocusOutside, event => event.preventDefault(), { - checkForDefaultPrevented: false - }), - onDismiss: () => context.onOpenChange(false) - })); -}); -const $213e4d2df823067d$var$MenuRootContentNonModal = /*#__PURE__*/$cnSS2$react.forwardRef((props, forwardedRef) => { - const context = $213e4d2df823067d$var$useMenuContext($213e4d2df823067d$var$CONTENT_NAME, props.__scopeMenu); - return /*#__PURE__*/$cnSS2$react.createElement($213e4d2df823067d$var$MenuContentImpl, $parcel$interopDefault($cnSS2$babelruntimehelpersextends)({}, props, { - ref: forwardedRef, - trapFocus: false, - disableOutsidePointerEvents: false, - disableOutsideScroll: false, - onDismiss: () => context.onOpenChange(false) - })); -}); -/* ---------------------------------------------------------------------------------------------- */ -const $213e4d2df823067d$var$MenuContentImpl = /*#__PURE__*/$cnSS2$react.forwardRef((props, forwardedRef) => { - const { - __scopeMenu: __scopeMenu, - loop = false, - trapFocus: trapFocus, - onOpenAutoFocus: onOpenAutoFocus, - onCloseAutoFocus: onCloseAutoFocus, - disableOutsidePointerEvents: disableOutsidePointerEvents, - onEntryFocus: onEntryFocus, - onEscapeKeyDown: onEscapeKeyDown, - onPointerDownOutside: onPointerDownOutside, - onFocusOutside: onFocusOutside, - onInteractOutside: onInteractOutside, - onDismiss: onDismiss, - disableOutsideScroll: disableOutsideScroll, - ...contentProps - } = props; - const context = $213e4d2df823067d$var$useMenuContext($213e4d2df823067d$var$CONTENT_NAME, __scopeMenu); - const rootContext = $213e4d2df823067d$var$useMenuRootContext($213e4d2df823067d$var$CONTENT_NAME, __scopeMenu); - const popperScope = $213e4d2df823067d$var$usePopperScope(__scopeMenu); - const rovingFocusGroupScope = $213e4d2df823067d$var$useRovingFocusGroupScope(__scopeMenu); - const getItems = $213e4d2df823067d$var$useCollection(__scopeMenu); - const [currentItemId, setCurrentItemId] = $cnSS2$react.useState(null); - const contentRef = $cnSS2$react.useRef(null); - const composedRefs = $cnSS2$radixuireactcomposerefs.useComposedRefs(forwardedRef, contentRef, context.onContentChange); - const timerRef = $cnSS2$react.useRef(0); - const searchRef = $cnSS2$react.useRef(''); - const pointerGraceTimerRef = $cnSS2$react.useRef(0); - const pointerGraceIntentRef = $cnSS2$react.useRef(null); - const pointerDirRef = $cnSS2$react.useRef('right'); - const lastPointerXRef = $cnSS2$react.useRef(0); - const ScrollLockWrapper = disableOutsideScroll ? $cnSS2$reactremovescroll.RemoveScroll : $cnSS2$react.Fragment; - const scrollLockWrapperProps = disableOutsideScroll ? { - as: $cnSS2$radixuireactslot.Slot, - allowPinchZoom: true - } : undefined; - const handleTypeaheadSearch = key => { - var _items$find, _items$find2; - const search = searchRef.current + key; - const items = getItems().filter(item => !item.disabled); - const currentItem = document.activeElement; - const currentMatch = (_items$find = items.find(item => item.ref.current === currentItem)) === null || _items$find === void 0 ? void 0 : _items$find.textValue; - const values = items.map(item => item.textValue); - const nextMatch = $213e4d2df823067d$var$getNextMatch(values, search, currentMatch); - const newItem = (_items$find2 = items.find(item => item.textValue === nextMatch)) === null || _items$find2 === void 0 ? void 0 : _items$find2.ref.current; // Reset `searchRef` 1 second after it was last updated - (function updateSearch(value) { - searchRef.current = value; - window.clearTimeout(timerRef.current); - if (value !== '') timerRef.current = window.setTimeout(() => updateSearch(''), 1000); - })(search); - if (newItem) - /** - * Imperative focus during keydown is risky so we prevent React's batching updates - * to avoid potential bugs. See: https://github.com/facebook/react/issues/20332 - */ - setTimeout(() => newItem.focus()); - }; - $cnSS2$react.useEffect(() => { - return () => window.clearTimeout(timerRef.current); - }, []); // Make sure the whole tree has focus guards as our `MenuContent` may be - // the last element in the DOM (beacuse of the `Portal`) - $cnSS2$radixuireactfocusguards.useFocusGuards(); - const isPointerMovingToSubmenu = $cnSS2$react.useCallback(event => { - var _pointerGraceIntentRe, _pointerGraceIntentRe2; - const isMovingTowards = pointerDirRef.current === ((_pointerGraceIntentRe = pointerGraceIntentRef.current) === null || _pointerGraceIntentRe === void 0 ? void 0 : _pointerGraceIntentRe.side); - return isMovingTowards && $213e4d2df823067d$var$isPointerInGraceArea(event, (_pointerGraceIntentRe2 = pointerGraceIntentRef.current) === null || _pointerGraceIntentRe2 === void 0 ? void 0 : _pointerGraceIntentRe2.area); - }, []); - return /*#__PURE__*/$cnSS2$react.createElement($213e4d2df823067d$var$MenuContentProvider, { - scope: __scopeMenu, - searchRef: searchRef, - onItemEnter: $cnSS2$react.useCallback(event => { - if (isPointerMovingToSubmenu(event)) event.preventDefault(); - }, [isPointerMovingToSubmenu]), - onItemLeave: $cnSS2$react.useCallback(event => { - var _contentRef$current; - if (isPointerMovingToSubmenu(event)) return; - (_contentRef$current = contentRef.current) === null || _contentRef$current === void 0 || _contentRef$current.focus(); - setCurrentItemId(null); - }, [isPointerMovingToSubmenu]), - onTriggerLeave: $cnSS2$react.useCallback(event => { - if (isPointerMovingToSubmenu(event)) event.preventDefault(); - }, [isPointerMovingToSubmenu]), - pointerGraceTimerRef: pointerGraceTimerRef, - onPointerGraceIntentChange: $cnSS2$react.useCallback(intent => { - pointerGraceIntentRef.current = intent; - }, []) - }, /*#__PURE__*/$cnSS2$react.createElement(ScrollLockWrapper, scrollLockWrapperProps, /*#__PURE__*/$cnSS2$react.createElement($cnSS2$radixuireactfocusscope.FocusScope, { - asChild: true, - trapped: trapFocus, - onMountAutoFocus: $cnSS2$radixuiprimitive.composeEventHandlers(onOpenAutoFocus, event => { - var _contentRef$current2; - // when opening, explicitly focus the content area only and leave - // `onEntryFocus` in control of focusing first item - event.preventDefault(); - (_contentRef$current2 = contentRef.current) === null || _contentRef$current2 === void 0 || _contentRef$current2.focus(); - }), - onUnmountAutoFocus: onCloseAutoFocus - }, /*#__PURE__*/$cnSS2$react.createElement($cnSS2$radixuireactdismissablelayer.DismissableLayer, { - asChild: true, - disableOutsidePointerEvents: disableOutsidePointerEvents, - onEscapeKeyDown: onEscapeKeyDown, - onPointerDownOutside: onPointerDownOutside, - onFocusOutside: onFocusOutside, - onInteractOutside: onInteractOutside, - onDismiss: onDismiss - }, /*#__PURE__*/$cnSS2$react.createElement($cnSS2$radixuireactrovingfocus.Root, $parcel$interopDefault($cnSS2$babelruntimehelpersextends)({ - asChild: true - }, rovingFocusGroupScope, { - dir: rootContext.dir, - orientation: "vertical", - loop: loop, - currentTabStopId: currentItemId, - onCurrentTabStopIdChange: setCurrentItemId, - onEntryFocus: $cnSS2$radixuiprimitive.composeEventHandlers(onEntryFocus, event => { - // only focus first item when using keyboard - if (!rootContext.isUsingKeyboardRef.current) event.preventDefault(); - }) - }), /*#__PURE__*/$cnSS2$react.createElement($cnSS2$radixuireactpopper.Content, $parcel$interopDefault($cnSS2$babelruntimehelpersextends)({ - role: "menu", - "aria-orientation": "vertical", - "data-state": $213e4d2df823067d$var$getOpenState(context.open), - "data-radix-menu-content": "", - dir: rootContext.dir - }, popperScope, contentProps, { - ref: composedRefs, - style: { - outline: 'none', - ...contentProps.style - }, - onKeyDown: $cnSS2$radixuiprimitive.composeEventHandlers(contentProps.onKeyDown, event => { - // submenu key events bubble through portals. We only care about keys in this menu. - const target = event.target; - const isKeyDownInside = target.closest('[data-radix-menu-content]') === event.currentTarget; - const isModifierKey = event.ctrlKey || event.altKey || event.metaKey; - const isCharacterKey = event.key.length === 1; - if (isKeyDownInside) { - // menus should not be navigated using tab key so we prevent it - if (event.key === 'Tab') event.preventDefault(); - if (!isModifierKey && isCharacterKey) handleTypeaheadSearch(event.key); - } // focus first/last item based on key pressed - const content = contentRef.current; - if (event.target !== content) return; - if (!$213e4d2df823067d$var$FIRST_LAST_KEYS.includes(event.key)) return; - event.preventDefault(); - const items = getItems().filter(item => !item.disabled); - const candidateNodes = items.map(item => item.ref.current); - if ($213e4d2df823067d$var$LAST_KEYS.includes(event.key)) candidateNodes.reverse(); - $213e4d2df823067d$var$focusFirst(candidateNodes); - }), - onBlur: $cnSS2$radixuiprimitive.composeEventHandlers(props.onBlur, event => { - // clear search buffer when leaving the menu - if (!event.currentTarget.contains(event.target)) { - window.clearTimeout(timerRef.current); - searchRef.current = ''; - } - }), - onPointerMove: $cnSS2$radixuiprimitive.composeEventHandlers(props.onPointerMove, $213e4d2df823067d$var$whenMouse(event => { - const target = event.target; - const pointerXHasChanged = lastPointerXRef.current !== event.clientX; // We don't use `event.movementX` for this check because Safari will - // always return `0` on a pointer event. - if (event.currentTarget.contains(target) && pointerXHasChanged) { - const newDir = event.clientX > lastPointerXRef.current ? 'right' : 'left'; - pointerDirRef.current = newDir; - lastPointerXRef.current = event.clientX; - } - })) - }))))))); -}); -/*#__PURE__*/ -Object.assign($213e4d2df823067d$export$479f0f2f71193efe, { - displayName: $213e4d2df823067d$var$CONTENT_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * MenuGroup - * -----------------------------------------------------------------------------------------------*/ -const $213e4d2df823067d$var$GROUP_NAME = 'MenuGroup'; -const $213e4d2df823067d$export$22a631d1f72787bb = /*#__PURE__*/$cnSS2$react.forwardRef((props, forwardedRef) => { - const { - __scopeMenu: __scopeMenu, - ...groupProps - } = props; - return /*#__PURE__*/$cnSS2$react.createElement($cnSS2$radixuireactprimitive.Primitive.div, $parcel$interopDefault($cnSS2$babelruntimehelpersextends)({ - role: "group" - }, groupProps, { - ref: forwardedRef - })); -}); -/*#__PURE__*/ -Object.assign($213e4d2df823067d$export$22a631d1f72787bb, { - displayName: $213e4d2df823067d$var$GROUP_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * MenuLabel - * -----------------------------------------------------------------------------------------------*/ -const $213e4d2df823067d$var$LABEL_NAME = 'MenuLabel'; -const $213e4d2df823067d$export$dd37bec0e8a99143 = /*#__PURE__*/$cnSS2$react.forwardRef((props, forwardedRef) => { - const { - __scopeMenu: __scopeMenu, - ...labelProps - } = props; - return /*#__PURE__*/$cnSS2$react.createElement($cnSS2$radixuireactprimitive.Primitive.div, $parcel$interopDefault($cnSS2$babelruntimehelpersextends)({}, labelProps, { - ref: forwardedRef - })); -}); -/*#__PURE__*/ -Object.assign($213e4d2df823067d$export$dd37bec0e8a99143, { - displayName: $213e4d2df823067d$var$LABEL_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * MenuItem - * -----------------------------------------------------------------------------------------------*/ -const $213e4d2df823067d$var$ITEM_NAME = 'MenuItem'; -const $213e4d2df823067d$var$ITEM_SELECT = 'menu.itemSelect'; -const $213e4d2df823067d$export$2ce376c2cc3355c8 = /*#__PURE__*/$cnSS2$react.forwardRef((props, forwardedRef) => { - const { - disabled = false, - onSelect: onSelect, - ...itemProps - } = props; - const ref = $cnSS2$react.useRef(null); - const rootContext = $213e4d2df823067d$var$useMenuRootContext($213e4d2df823067d$var$ITEM_NAME, props.__scopeMenu); - const contentContext = $213e4d2df823067d$var$useMenuContentContext($213e4d2df823067d$var$ITEM_NAME, props.__scopeMenu); - const composedRefs = $cnSS2$radixuireactcomposerefs.useComposedRefs(forwardedRef, ref); - const isPointerDownRef = $cnSS2$react.useRef(false); - const handleSelect = () => { - const menuItem = ref.current; - if (!disabled && menuItem) { - const itemSelectEvent = new CustomEvent($213e4d2df823067d$var$ITEM_SELECT, { - bubbles: true, - cancelable: true - }); - menuItem.addEventListener($213e4d2df823067d$var$ITEM_SELECT, event => onSelect === null || onSelect === void 0 ? void 0 : onSelect(event), { - once: true - }); - $cnSS2$radixuireactprimitive.dispatchDiscreteCustomEvent(menuItem, itemSelectEvent); - if (itemSelectEvent.defaultPrevented) isPointerDownRef.current = false;else rootContext.onClose(); - } - }; - return /*#__PURE__*/$cnSS2$react.createElement($213e4d2df823067d$var$MenuItemImpl, $parcel$interopDefault($cnSS2$babelruntimehelpersextends)({}, itemProps, { - ref: composedRefs, - disabled: disabled, - onClick: $cnSS2$radixuiprimitive.composeEventHandlers(props.onClick, handleSelect), - onPointerDown: event => { - var _props$onPointerDown; - (_props$onPointerDown = props.onPointerDown) === null || _props$onPointerDown === void 0 || _props$onPointerDown.call(props, event); - isPointerDownRef.current = true; - }, - onPointerUp: $cnSS2$radixuiprimitive.composeEventHandlers(props.onPointerUp, event => { - var _event$currentTarget; - // Pointer down can move to a different menu item which should activate it on pointer up. - // We dispatch a click for selection to allow composition with click based triggers and to - // prevent Firefox from getting stuck in text selection mode when the menu closes. - if (!isPointerDownRef.current) (_event$currentTarget = event.currentTarget) === null || _event$currentTarget === void 0 || _event$currentTarget.click(); - }), - onKeyDown: $cnSS2$radixuiprimitive.composeEventHandlers(props.onKeyDown, event => { - const isTypingAhead = contentContext.searchRef.current !== ''; - if (disabled || isTypingAhead && event.key === ' ') return; - if ($213e4d2df823067d$var$SELECTION_KEYS.includes(event.key)) { - event.currentTarget.click(); - /** - * We prevent default browser behaviour for selection keys as they should trigger - * a selection only: - * - prevents space from scrolling the page. - * - if keydown causes focus to move, prevents keydown from firing on the new target. - */ - event.preventDefault(); - } - }) - })); -}); -/*#__PURE__*/ -Object.assign($213e4d2df823067d$export$2ce376c2cc3355c8, { - displayName: $213e4d2df823067d$var$ITEM_NAME -}); -/* ---------------------------------------------------------------------------------------------- */ -const $213e4d2df823067d$var$MenuItemImpl = /*#__PURE__*/$cnSS2$react.forwardRef((props, forwardedRef) => { - const { - __scopeMenu: __scopeMenu, - disabled = false, - textValue: textValue, - ...itemProps - } = props; - const contentContext = $213e4d2df823067d$var$useMenuContentContext($213e4d2df823067d$var$ITEM_NAME, __scopeMenu); - const rovingFocusGroupScope = $213e4d2df823067d$var$useRovingFocusGroupScope(__scopeMenu); - const ref = $cnSS2$react.useRef(null); - const composedRefs = $cnSS2$radixuireactcomposerefs.useComposedRefs(forwardedRef, ref); - const [isFocused, setIsFocused] = $cnSS2$react.useState(false); // get the item's `.textContent` as default strategy for typeahead `textValue` - const [textContent, setTextContent] = $cnSS2$react.useState(''); - $cnSS2$react.useEffect(() => { - const menuItem = ref.current; - if (menuItem) { - var _menuItem$textContent; - setTextContent(((_menuItem$textContent = menuItem.textContent) !== null && _menuItem$textContent !== void 0 ? _menuItem$textContent : '').trim()); - } - }, [itemProps.children]); - return /*#__PURE__*/$cnSS2$react.createElement($213e4d2df823067d$var$Collection.ItemSlot, { - scope: __scopeMenu, - disabled: disabled, - textValue: textValue !== null && textValue !== void 0 ? textValue : textContent - }, /*#__PURE__*/$cnSS2$react.createElement($cnSS2$radixuireactrovingfocus.Item, $parcel$interopDefault($cnSS2$babelruntimehelpersextends)({ - asChild: true - }, rovingFocusGroupScope, { - focusable: !disabled - }), /*#__PURE__*/$cnSS2$react.createElement($cnSS2$radixuireactprimitive.Primitive.div, $parcel$interopDefault($cnSS2$babelruntimehelpersextends)({ - role: "menuitem", - "data-highlighted": isFocused ? '' : undefined, - "aria-disabled": disabled || undefined, - "data-disabled": disabled ? '' : undefined - }, itemProps, { - ref: composedRefs, - onPointerMove: $cnSS2$radixuiprimitive.composeEventHandlers(props.onPointerMove, $213e4d2df823067d$var$whenMouse(event => { - if (disabled) contentContext.onItemLeave(event);else { - contentContext.onItemEnter(event); - if (!event.defaultPrevented) { - const item = event.currentTarget; - item.focus(); - } - } - })), - onPointerLeave: $cnSS2$radixuiprimitive.composeEventHandlers(props.onPointerLeave, $213e4d2df823067d$var$whenMouse(event => contentContext.onItemLeave(event))), - onFocus: $cnSS2$radixuiprimitive.composeEventHandlers(props.onFocus, () => setIsFocused(true)), - onBlur: $cnSS2$radixuiprimitive.composeEventHandlers(props.onBlur, () => setIsFocused(false)) - })))); -}); -/* ------------------------------------------------------------------------------------------------- - * MenuCheckboxItem - * -----------------------------------------------------------------------------------------------*/ -const $213e4d2df823067d$var$CHECKBOX_ITEM_NAME = 'MenuCheckboxItem'; -const $213e4d2df823067d$export$f6f243521332502d = /*#__PURE__*/$cnSS2$react.forwardRef((props, forwardedRef) => { - const { - checked = false, - onCheckedChange: onCheckedChange, - ...checkboxItemProps - } = props; - return /*#__PURE__*/$cnSS2$react.createElement($213e4d2df823067d$var$ItemIndicatorProvider, { - scope: props.__scopeMenu, - checked: checked - }, /*#__PURE__*/$cnSS2$react.createElement($213e4d2df823067d$export$2ce376c2cc3355c8, $parcel$interopDefault($cnSS2$babelruntimehelpersextends)({ - role: "menuitemcheckbox", - "aria-checked": $213e4d2df823067d$var$isIndeterminate(checked) ? 'mixed' : checked - }, checkboxItemProps, { - ref: forwardedRef, - "data-state": $213e4d2df823067d$var$getCheckedState(checked), - onSelect: $cnSS2$radixuiprimitive.composeEventHandlers(checkboxItemProps.onSelect, () => onCheckedChange === null || onCheckedChange === void 0 ? void 0 : onCheckedChange($213e4d2df823067d$var$isIndeterminate(checked) ? true : !checked), { - checkForDefaultPrevented: false - }) - }))); -}); -/*#__PURE__*/ -Object.assign($213e4d2df823067d$export$f6f243521332502d, { - displayName: $213e4d2df823067d$var$CHECKBOX_ITEM_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * MenuRadioGroup - * -----------------------------------------------------------------------------------------------*/ -const $213e4d2df823067d$var$RADIO_GROUP_NAME = 'MenuRadioGroup'; -const [$213e4d2df823067d$var$RadioGroupProvider, $213e4d2df823067d$var$useRadioGroupContext] = $213e4d2df823067d$var$createMenuContext($213e4d2df823067d$var$RADIO_GROUP_NAME, { - value: undefined, - onValueChange: () => {} -}); -const $213e4d2df823067d$export$ea2200c9eee416b3 = /*#__PURE__*/$cnSS2$react.forwardRef((props, forwardedRef) => { - const { - value: value, - onValueChange: onValueChange, - ...groupProps - } = props; - const handleValueChange = $cnSS2$radixuireactusecallbackref.useCallbackRef(onValueChange); - return /*#__PURE__*/$cnSS2$react.createElement($213e4d2df823067d$var$RadioGroupProvider, { - scope: props.__scopeMenu, - value: value, - onValueChange: handleValueChange - }, /*#__PURE__*/$cnSS2$react.createElement($213e4d2df823067d$export$22a631d1f72787bb, $parcel$interopDefault($cnSS2$babelruntimehelpersextends)({}, groupProps, { - ref: forwardedRef - }))); -}); -/*#__PURE__*/ -Object.assign($213e4d2df823067d$export$ea2200c9eee416b3, { - displayName: $213e4d2df823067d$var$RADIO_GROUP_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * MenuRadioItem - * -----------------------------------------------------------------------------------------------*/ -const $213e4d2df823067d$var$RADIO_ITEM_NAME = 'MenuRadioItem'; -const $213e4d2df823067d$export$69bd225e9817f6d0 = /*#__PURE__*/$cnSS2$react.forwardRef((props, forwardedRef) => { - const { - value: value, - ...radioItemProps - } = props; - const context = $213e4d2df823067d$var$useRadioGroupContext($213e4d2df823067d$var$RADIO_ITEM_NAME, props.__scopeMenu); - const checked = value === context.value; - return /*#__PURE__*/$cnSS2$react.createElement($213e4d2df823067d$var$ItemIndicatorProvider, { - scope: props.__scopeMenu, - checked: checked - }, /*#__PURE__*/$cnSS2$react.createElement($213e4d2df823067d$export$2ce376c2cc3355c8, $parcel$interopDefault($cnSS2$babelruntimehelpersextends)({ - role: "menuitemradio", - "aria-checked": checked - }, radioItemProps, { - ref: forwardedRef, - "data-state": $213e4d2df823067d$var$getCheckedState(checked), - onSelect: $cnSS2$radixuiprimitive.composeEventHandlers(radioItemProps.onSelect, () => { - var _context$onValueChang; - return (_context$onValueChang = context.onValueChange) === null || _context$onValueChang === void 0 ? void 0 : _context$onValueChang.call(context, value); - }, { - checkForDefaultPrevented: false - }) - }))); -}); -/*#__PURE__*/ -Object.assign($213e4d2df823067d$export$69bd225e9817f6d0, { - displayName: $213e4d2df823067d$var$RADIO_ITEM_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * MenuItemIndicator - * -----------------------------------------------------------------------------------------------*/ -const $213e4d2df823067d$var$ITEM_INDICATOR_NAME = 'MenuItemIndicator'; -const [$213e4d2df823067d$var$ItemIndicatorProvider, $213e4d2df823067d$var$useItemIndicatorContext] = $213e4d2df823067d$var$createMenuContext($213e4d2df823067d$var$ITEM_INDICATOR_NAME, { - checked: false -}); -const $213e4d2df823067d$export$a2593e23056970a3 = /*#__PURE__*/$cnSS2$react.forwardRef((props, forwardedRef) => { - const { - __scopeMenu: __scopeMenu, - forceMount: forceMount, - ...itemIndicatorProps - } = props; - const indicatorContext = $213e4d2df823067d$var$useItemIndicatorContext($213e4d2df823067d$var$ITEM_INDICATOR_NAME, __scopeMenu); - return /*#__PURE__*/$cnSS2$react.createElement($cnSS2$radixuireactpresence.Presence, { - present: forceMount || $213e4d2df823067d$var$isIndeterminate(indicatorContext.checked) || indicatorContext.checked === true - }, /*#__PURE__*/$cnSS2$react.createElement($cnSS2$radixuireactprimitive.Primitive.span, $parcel$interopDefault($cnSS2$babelruntimehelpersextends)({}, itemIndicatorProps, { - ref: forwardedRef, - "data-state": $213e4d2df823067d$var$getCheckedState(indicatorContext.checked) - }))); -}); -/*#__PURE__*/ -Object.assign($213e4d2df823067d$export$a2593e23056970a3, { - displayName: $213e4d2df823067d$var$ITEM_INDICATOR_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * MenuSeparator - * -----------------------------------------------------------------------------------------------*/ -const $213e4d2df823067d$var$SEPARATOR_NAME = 'MenuSeparator'; -const $213e4d2df823067d$export$1cec7dcdd713e220 = /*#__PURE__*/$cnSS2$react.forwardRef((props, forwardedRef) => { - const { - __scopeMenu: __scopeMenu, - ...separatorProps - } = props; - return /*#__PURE__*/$cnSS2$react.createElement($cnSS2$radixuireactprimitive.Primitive.div, $parcel$interopDefault($cnSS2$babelruntimehelpersextends)({ - role: "separator", - "aria-orientation": "horizontal" - }, separatorProps, { - ref: forwardedRef - })); -}); -/*#__PURE__*/ -Object.assign($213e4d2df823067d$export$1cec7dcdd713e220, { - displayName: $213e4d2df823067d$var$SEPARATOR_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * MenuArrow - * -----------------------------------------------------------------------------------------------*/ -const $213e4d2df823067d$var$ARROW_NAME = 'MenuArrow'; -const $213e4d2df823067d$export$bcdda4773debf5fa = /*#__PURE__*/$cnSS2$react.forwardRef((props, forwardedRef) => { - const { - __scopeMenu: __scopeMenu, - ...arrowProps - } = props; - const popperScope = $213e4d2df823067d$var$usePopperScope(__scopeMenu); - return /*#__PURE__*/$cnSS2$react.createElement($cnSS2$radixuireactpopper.Arrow, $parcel$interopDefault($cnSS2$babelruntimehelpersextends)({}, popperScope, arrowProps, { - ref: forwardedRef - })); -}); -/*#__PURE__*/ -Object.assign($213e4d2df823067d$export$bcdda4773debf5fa, { - displayName: $213e4d2df823067d$var$ARROW_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * MenuSub - * -----------------------------------------------------------------------------------------------*/ -const $213e4d2df823067d$var$SUB_NAME = 'MenuSub'; -const [$213e4d2df823067d$var$MenuSubProvider, $213e4d2df823067d$var$useMenuSubContext] = $213e4d2df823067d$var$createMenuContext($213e4d2df823067d$var$SUB_NAME); -const $213e4d2df823067d$export$71bdb9d1e2909932 = props => { - const { - __scopeMenu: __scopeMenu, - children: children, - open = false, - onOpenChange: onOpenChange - } = props; - const parentMenuContext = $213e4d2df823067d$var$useMenuContext($213e4d2df823067d$var$SUB_NAME, __scopeMenu); - const popperScope = $213e4d2df823067d$var$usePopperScope(__scopeMenu); - const [trigger, setTrigger] = $cnSS2$react.useState(null); - const [content, setContent] = $cnSS2$react.useState(null); - const handleOpenChange = $cnSS2$radixuireactusecallbackref.useCallbackRef(onOpenChange); // Prevent the parent menu from reopening with open submenus. - $cnSS2$react.useEffect(() => { - if (parentMenuContext.open === false) handleOpenChange(false); - return () => handleOpenChange(false); - }, [parentMenuContext.open, handleOpenChange]); - return /*#__PURE__*/$cnSS2$react.createElement($cnSS2$radixuireactpopper.Root, popperScope, /*#__PURE__*/$cnSS2$react.createElement($213e4d2df823067d$var$MenuProvider, { - scope: __scopeMenu, - open: open, - onOpenChange: handleOpenChange, - content: content, - onContentChange: setContent - }, /*#__PURE__*/$cnSS2$react.createElement($213e4d2df823067d$var$MenuSubProvider, { - scope: __scopeMenu, - contentId: $cnSS2$radixuireactid.useId(), - triggerId: $cnSS2$radixuireactid.useId(), - trigger: trigger, - onTriggerChange: setTrigger - }, children))); -}; -/*#__PURE__*/ -Object.assign($213e4d2df823067d$export$71bdb9d1e2909932, { - displayName: $213e4d2df823067d$var$SUB_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * MenuSubTrigger - * -----------------------------------------------------------------------------------------------*/ -const $213e4d2df823067d$var$SUB_TRIGGER_NAME = 'MenuSubTrigger'; -const $213e4d2df823067d$export$5fbbb3ba7297405f = /*#__PURE__*/$cnSS2$react.forwardRef((props, forwardedRef) => { - const context = $213e4d2df823067d$var$useMenuContext($213e4d2df823067d$var$SUB_TRIGGER_NAME, props.__scopeMenu); - const rootContext = $213e4d2df823067d$var$useMenuRootContext($213e4d2df823067d$var$SUB_TRIGGER_NAME, props.__scopeMenu); - const subContext = $213e4d2df823067d$var$useMenuSubContext($213e4d2df823067d$var$SUB_TRIGGER_NAME, props.__scopeMenu); - const contentContext = $213e4d2df823067d$var$useMenuContentContext($213e4d2df823067d$var$SUB_TRIGGER_NAME, props.__scopeMenu); - const openTimerRef = $cnSS2$react.useRef(null); - const { - pointerGraceTimerRef: pointerGraceTimerRef, - onPointerGraceIntentChange: onPointerGraceIntentChange - } = contentContext; - const scope = { - __scopeMenu: props.__scopeMenu - }; - const clearOpenTimer = $cnSS2$react.useCallback(() => { - if (openTimerRef.current) window.clearTimeout(openTimerRef.current); - openTimerRef.current = null; - }, []); - $cnSS2$react.useEffect(() => clearOpenTimer, [clearOpenTimer]); - $cnSS2$react.useEffect(() => { - const pointerGraceTimer = pointerGraceTimerRef.current; - return () => { - window.clearTimeout(pointerGraceTimer); - onPointerGraceIntentChange(null); - }; - }, [pointerGraceTimerRef, onPointerGraceIntentChange]); - return /*#__PURE__*/$cnSS2$react.createElement($213e4d2df823067d$export$9fa5ebd18bee4d43, $parcel$interopDefault($cnSS2$babelruntimehelpersextends)({ - asChild: true - }, scope), /*#__PURE__*/$cnSS2$react.createElement($213e4d2df823067d$var$MenuItemImpl, $parcel$interopDefault($cnSS2$babelruntimehelpersextends)({ - id: subContext.triggerId, - "aria-haspopup": "menu", - "aria-expanded": context.open, - "aria-controls": subContext.contentId, - "data-state": $213e4d2df823067d$var$getOpenState(context.open) - }, props, { - ref: $cnSS2$radixuireactcomposerefs.composeRefs(forwardedRef, subContext.onTriggerChange) // This is redundant for mouse users but we cannot determine pointer type from - , - - onClick: event => { - var _props$onClick; - (_props$onClick = props.onClick) === null || _props$onClick === void 0 || _props$onClick.call(props, event); - if (props.disabled || event.defaultPrevented) return; - /** - * We manually focus because iOS Safari doesn't always focus on click (e.g. buttons) - * and we rely heavily on `onFocusOutside` for submenus to close when switching - * between separate submenus. - */ - event.currentTarget.focus(); - if (!context.open) context.onOpenChange(true); - }, - onPointerMove: $cnSS2$radixuiprimitive.composeEventHandlers(props.onPointerMove, $213e4d2df823067d$var$whenMouse(event => { - contentContext.onItemEnter(event); - if (event.defaultPrevented) return; - if (!props.disabled && !context.open && !openTimerRef.current) { - contentContext.onPointerGraceIntentChange(null); - openTimerRef.current = window.setTimeout(() => { - context.onOpenChange(true); - clearOpenTimer(); - }, 100); - } - })), - onPointerLeave: $cnSS2$radixuiprimitive.composeEventHandlers(props.onPointerLeave, $213e4d2df823067d$var$whenMouse(event => { - var _context$content; - clearOpenTimer(); - const contentRect = (_context$content = context.content) === null || _context$content === void 0 ? void 0 : _context$content.getBoundingClientRect(); - if (contentRect) { - var _context$content2; - // TODO: make sure to update this when we change positioning logic - const side = (_context$content2 = context.content) === null || _context$content2 === void 0 ? void 0 : _context$content2.dataset.side; - const rightSide = side === 'right'; - const bleed = rightSide ? -5 : 5; - const contentNearEdge = contentRect[rightSide ? 'left' : 'right']; - const contentFarEdge = contentRect[rightSide ? 'right' : 'left']; - contentContext.onPointerGraceIntentChange({ - area: [ - // consistently within polygon bounds - { - x: event.clientX + bleed, - y: event.clientY - }, { - x: contentNearEdge, - y: contentRect.top - }, { - x: contentFarEdge, - y: contentRect.top - }, { - x: contentFarEdge, - y: contentRect.bottom - }, { - x: contentNearEdge, - y: contentRect.bottom - }], - side: side - }); - window.clearTimeout(pointerGraceTimerRef.current); - pointerGraceTimerRef.current = window.setTimeout(() => contentContext.onPointerGraceIntentChange(null), 300); - } else { - contentContext.onTriggerLeave(event); - if (event.defaultPrevented) return; // There's 100ms where the user may leave an item before the submenu was opened. - contentContext.onPointerGraceIntentChange(null); - } - })), - onKeyDown: $cnSS2$radixuiprimitive.composeEventHandlers(props.onKeyDown, event => { - const isTypingAhead = contentContext.searchRef.current !== ''; - if (props.disabled || isTypingAhead && event.key === ' ') return; - if ($213e4d2df823067d$var$SUB_OPEN_KEYS[rootContext.dir].includes(event.key)) { - var _context$content3; - context.onOpenChange(true); // The trigger may hold focus if opened via pointer interaction - // so we ensure content is given focus again when switching to keyboard. - (_context$content3 = context.content) === null || _context$content3 === void 0 || _context$content3.focus(); // prevent window from scrolling - event.preventDefault(); - } - }) - }))); -}); -/*#__PURE__*/ -Object.assign($213e4d2df823067d$export$5fbbb3ba7297405f, { - displayName: $213e4d2df823067d$var$SUB_TRIGGER_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * MenuSubContent - * -----------------------------------------------------------------------------------------------*/ -const $213e4d2df823067d$var$SUB_CONTENT_NAME = 'MenuSubContent'; -const $213e4d2df823067d$export$e7142ab31822bde6 = /*#__PURE__*/$cnSS2$react.forwardRef((props, forwardedRef) => { - const portalContext = $213e4d2df823067d$var$usePortalContext($213e4d2df823067d$var$CONTENT_NAME, props.__scopeMenu); - const { - forceMount = portalContext.forceMount, - ...subContentProps - } = props; - const context = $213e4d2df823067d$var$useMenuContext($213e4d2df823067d$var$CONTENT_NAME, props.__scopeMenu); - const rootContext = $213e4d2df823067d$var$useMenuRootContext($213e4d2df823067d$var$CONTENT_NAME, props.__scopeMenu); - const subContext = $213e4d2df823067d$var$useMenuSubContext($213e4d2df823067d$var$SUB_CONTENT_NAME, props.__scopeMenu); - const ref = $cnSS2$react.useRef(null); - const composedRefs = $cnSS2$radixuireactcomposerefs.useComposedRefs(forwardedRef, ref); - return /*#__PURE__*/$cnSS2$react.createElement($213e4d2df823067d$var$Collection.Provider, { - scope: props.__scopeMenu - }, /*#__PURE__*/$cnSS2$react.createElement($cnSS2$radixuireactpresence.Presence, { - present: forceMount || context.open - }, /*#__PURE__*/$cnSS2$react.createElement($213e4d2df823067d$var$Collection.Slot, { - scope: props.__scopeMenu - }, /*#__PURE__*/$cnSS2$react.createElement($213e4d2df823067d$var$MenuContentImpl, $parcel$interopDefault($cnSS2$babelruntimehelpersextends)({ - id: subContext.contentId, - "aria-labelledby": subContext.triggerId - }, subContentProps, { - ref: composedRefs, - align: "start", - side: rootContext.dir === 'rtl' ? 'left' : 'right', - disableOutsidePointerEvents: false, - disableOutsideScroll: false, - trapFocus: false, - onOpenAutoFocus: event => { - var _ref$current; - // when opening a submenu, focus content for keyboard users only - if (rootContext.isUsingKeyboardRef.current) (_ref$current = ref.current) === null || _ref$current === void 0 || _ref$current.focus(); - event.preventDefault(); - } // The menu might close because of focusing another menu item in the parent menu. We - , - - onCloseAutoFocus: event => event.preventDefault(), - onFocusOutside: $cnSS2$radixuiprimitive.composeEventHandlers(props.onFocusOutside, event => { - // We prevent closing when the trigger is focused to avoid triggering a re-open animation - // on pointer interaction. - if (event.target !== subContext.trigger) context.onOpenChange(false); - }), - onEscapeKeyDown: $cnSS2$radixuiprimitive.composeEventHandlers(props.onEscapeKeyDown, event => { - rootContext.onClose(); // ensure pressing escape in submenu doesn't escape full screen mode - event.preventDefault(); - }), - onKeyDown: $cnSS2$radixuiprimitive.composeEventHandlers(props.onKeyDown, event => { - // Submenu key events bubble through portals. We only care about keys in this menu. - const isKeyDownInside = event.currentTarget.contains(event.target); - const isCloseKey = $213e4d2df823067d$var$SUB_CLOSE_KEYS[rootContext.dir].includes(event.key); - if (isKeyDownInside && isCloseKey) { - var _subContext$trigger; - context.onOpenChange(false); // We focus manually because we prevented it in `onCloseAutoFocus` - (_subContext$trigger = subContext.trigger) === null || _subContext$trigger === void 0 || _subContext$trigger.focus(); // prevent window from scrolling - event.preventDefault(); - } - }) - }))))); -}); -/*#__PURE__*/ -Object.assign($213e4d2df823067d$export$e7142ab31822bde6, { - displayName: $213e4d2df823067d$var$SUB_CONTENT_NAME -}); -/* -----------------------------------------------------------------------------------------------*/ -function $213e4d2df823067d$var$getOpenState(open) { - return open ? 'open' : 'closed'; -} -function $213e4d2df823067d$var$isIndeterminate(checked) { - return checked === 'indeterminate'; -} -function $213e4d2df823067d$var$getCheckedState(checked) { - return $213e4d2df823067d$var$isIndeterminate(checked) ? 'indeterminate' : checked ? 'checked' : 'unchecked'; -} -function $213e4d2df823067d$var$focusFirst(candidates) { - const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement; - for (const candidate of candidates) { - // if focus is already where we want to go, we don't want to keep going through the candidates - if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return; - candidate.focus(); - if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return; - } -} -/** - * Wraps an array around itself at a given start index - * Example: `wrapArray(['a', 'b', 'c', 'd'], 2) === ['c', 'd', 'a', 'b']` - */ -function $213e4d2df823067d$var$wrapArray(array, startIndex) { - return array.map((_, index) => array[(startIndex + index) % array.length]); -} -/** - * This is the "meat" of the typeahead matching logic. It takes in all the values, - * the search and the current match, and returns the next match (or `undefined`). - * - * We normalize the search because if a user has repeatedly pressed a character, - * we want the exact same behavior as if we only had that one character - * (ie. cycle through options starting with that character) - * - * We also reorder the values by wrapping the array around the current match. - * This is so we always look forward from the current match, and picking the first - * match will always be the correct one. - * - * Finally, if the normalized search is exactly one character, we exclude the - * current match from the values because otherwise it would be the first to match always - * and focus would never move. This is as opposed to the regular case, where we - * don't want focus to move if the current match still matches. - */ -function $213e4d2df823067d$var$getNextMatch(values, search, currentMatch) { - const isRepeated = search.length > 1 && Array.from(search).every(char => char === search[0]); - const normalizedSearch = isRepeated ? search[0] : search; - const currentMatchIndex = currentMatch ? values.indexOf(currentMatch) : -1; - let wrappedValues = $213e4d2df823067d$var$wrapArray(values, Math.max(currentMatchIndex, 0)); - const excludeCurrentMatch = normalizedSearch.length === 1; - if (excludeCurrentMatch) wrappedValues = wrappedValues.filter(v => v !== currentMatch); - const nextMatch = wrappedValues.find(value => value.toLowerCase().startsWith(normalizedSearch.toLowerCase())); - return nextMatch !== currentMatch ? nextMatch : undefined; -} -// Determine if a point is inside of a polygon. -// Based on https://github.com/substack/point-in-polygon -function $213e4d2df823067d$var$isPointInPolygon(point, polygon) { - const { - x: x, - y: y - } = point; - let inside = false; - for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) { - const xi = polygon[i].x; - const yi = polygon[i].y; - const xj = polygon[j].x; - const yj = polygon[j].y; // prettier-ignore - const intersect = yi > y !== yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi; - if (intersect) inside = !inside; - } - return inside; -} -function $213e4d2df823067d$var$isPointerInGraceArea(event, area) { - if (!area) return false; - const cursorPos = { - x: event.clientX, - y: event.clientY - }; - return $213e4d2df823067d$var$isPointInPolygon(cursorPos, area); -} -function $213e4d2df823067d$var$whenMouse(handler) { - return event => event.pointerType === 'mouse' ? handler(event) : undefined; -} -const $213e4d2df823067d$export$be92b6f5f03c0fe9 = $213e4d2df823067d$export$d9b273488cd8ce6f; -const $213e4d2df823067d$export$b688253958b8dfe7 = $213e4d2df823067d$export$9fa5ebd18bee4d43; -const $213e4d2df823067d$export$602eac185826482c = $213e4d2df823067d$export$793392f970497feb; -const $213e4d2df823067d$export$7c6e2c02157bb7d2 = $213e4d2df823067d$export$479f0f2f71193efe; -const $213e4d2df823067d$export$eb2fcfdbd7ba97d4 = $213e4d2df823067d$export$22a631d1f72787bb; -const $213e4d2df823067d$export$b04be29aa201d4f5 = $213e4d2df823067d$export$dd37bec0e8a99143; -const $213e4d2df823067d$export$6d08773d2e66f8f2 = $213e4d2df823067d$export$2ce376c2cc3355c8; -const $213e4d2df823067d$export$16ce288f89fa631c = $213e4d2df823067d$export$f6f243521332502d; -const $213e4d2df823067d$export$a98f0dcb43a68a25 = $213e4d2df823067d$export$ea2200c9eee416b3; -const $213e4d2df823067d$export$371ab307eab489c0 = $213e4d2df823067d$export$69bd225e9817f6d0; -const $213e4d2df823067d$export$c3468e2714d175fa = $213e4d2df823067d$export$a2593e23056970a3; -const $213e4d2df823067d$export$1ff3c3f08ae963c0 = $213e4d2df823067d$export$1cec7dcdd713e220; -const $213e4d2df823067d$export$21b07c8f274aebd5 = $213e4d2df823067d$export$bcdda4773debf5fa; -const $213e4d2df823067d$export$d7a01e11500dfb6f = $213e4d2df823067d$export$71bdb9d1e2909932; -const $213e4d2df823067d$export$2ea8a7a591ac5eac = $213e4d2df823067d$export$5fbbb3ba7297405f; -const $213e4d2df823067d$export$6d4de93b380beddf = $213e4d2df823067d$export$e7142ab31822bde6; - -/***/ }), - -/***/ "../../../node_modules/@radix-ui/react-popper/dist/index.js": -/*!******************************************************************!*\ - !*** ../../../node_modules/@radix-ui/react-popper/dist/index.js ***! - \******************************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - - -var $50Iv9$babelruntimehelpersextends = __webpack_require__(/*! @babel/runtime/helpers/extends */ "../../../node_modules/@babel/runtime/helpers/extends.js"); -var $50Iv9$react = __webpack_require__(/*! react */ "react"); -var $50Iv9$floatinguireactdom = __webpack_require__(/*! @floating-ui/react-dom */ "../../../node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.esm.js"); -var $50Iv9$radixuireactarrow = __webpack_require__(/*! @radix-ui/react-arrow */ "../../../node_modules/@radix-ui/react-arrow/dist/index.js"); -var $50Iv9$radixuireactcomposerefs = __webpack_require__(/*! @radix-ui/react-compose-refs */ "../../../node_modules/@radix-ui/react-compose-refs/dist/index.js"); -var $50Iv9$radixuireactcontext = __webpack_require__(/*! @radix-ui/react-context */ "../../../node_modules/@radix-ui/react-context/dist/index.js"); -var $50Iv9$radixuireactprimitive = __webpack_require__(/*! @radix-ui/react-primitive */ "../../../node_modules/@radix-ui/react-primitive/dist/index.js"); -var $50Iv9$radixuireactusecallbackref = __webpack_require__(/*! @radix-ui/react-use-callback-ref */ "../../../node_modules/@radix-ui/react-use-callback-ref/dist/index.js"); -var $50Iv9$radixuireactuselayouteffect = __webpack_require__(/*! @radix-ui/react-use-layout-effect */ "../../../node_modules/@radix-ui/react-use-layout-effect/dist/index.js"); -var $50Iv9$radixuireactusesize = __webpack_require__(/*! @radix-ui/react-use-size */ "../../../node_modules/@radix-ui/react-use-size/dist/index.js"); -function $parcel$export(e, n, v, s) { - Object.defineProperty(e, n, { - get: v, - set: s, - enumerable: true, - configurable: true - }); -} -function $parcel$interopDefault(a) { - return a && a.__esModule ? a.default : a; -} -$parcel$export(module.exports, "createPopperScope", () => $34310caa050a8d63$export$722aac194ae923); -$parcel$export(module.exports, "Popper", () => $34310caa050a8d63$export$badac9ada3a0bdf9); -$parcel$export(module.exports, "PopperAnchor", () => $34310caa050a8d63$export$ecd4e1ccab6ed6d); -$parcel$export(module.exports, "PopperContent", () => $34310caa050a8d63$export$bc4ae5855d3c4fc); -$parcel$export(module.exports, "PopperArrow", () => $34310caa050a8d63$export$79d62cd4e10a3fd0); -$parcel$export(module.exports, "Root", () => $34310caa050a8d63$export$be92b6f5f03c0fe9); -$parcel$export(module.exports, "Anchor", () => $34310caa050a8d63$export$b688253958b8dfe7); -$parcel$export(module.exports, "Content", () => $34310caa050a8d63$export$7c6e2c02157bb7d2); -$parcel$export(module.exports, "Arrow", () => $34310caa050a8d63$export$21b07c8f274aebd5); -$parcel$export(module.exports, "SIDE_OPTIONS", () => $34310caa050a8d63$export$36f0086da09c4b9f); -$parcel$export(module.exports, "ALIGN_OPTIONS", () => $34310caa050a8d63$export$3671ffab7b302fc9); -const $34310caa050a8d63$export$36f0086da09c4b9f = ['top', 'right', 'bottom', 'left']; -const $34310caa050a8d63$export$3671ffab7b302fc9 = ['start', 'center', 'end']; -/* ------------------------------------------------------------------------------------------------- - * Popper - * -----------------------------------------------------------------------------------------------*/ -const $34310caa050a8d63$var$POPPER_NAME = 'Popper'; -const [$34310caa050a8d63$var$createPopperContext, $34310caa050a8d63$export$722aac194ae923] = $50Iv9$radixuireactcontext.createContextScope($34310caa050a8d63$var$POPPER_NAME); -const [$34310caa050a8d63$var$PopperProvider, $34310caa050a8d63$var$usePopperContext] = $34310caa050a8d63$var$createPopperContext($34310caa050a8d63$var$POPPER_NAME); -const $34310caa050a8d63$export$badac9ada3a0bdf9 = props => { - const { - __scopePopper: __scopePopper, - children: children - } = props; - const [anchor, setAnchor] = $50Iv9$react.useState(null); - return /*#__PURE__*/$50Iv9$react.createElement($34310caa050a8d63$var$PopperProvider, { - scope: __scopePopper, - anchor: anchor, - onAnchorChange: setAnchor - }, children); -}; -/*#__PURE__*/ -Object.assign($34310caa050a8d63$export$badac9ada3a0bdf9, { - displayName: $34310caa050a8d63$var$POPPER_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * PopperAnchor - * -----------------------------------------------------------------------------------------------*/ -const $34310caa050a8d63$var$ANCHOR_NAME = 'PopperAnchor'; -const $34310caa050a8d63$export$ecd4e1ccab6ed6d = /*#__PURE__*/$50Iv9$react.forwardRef((props, forwardedRef) => { - const { - __scopePopper: __scopePopper, - virtualRef: virtualRef, - ...anchorProps - } = props; - const context = $34310caa050a8d63$var$usePopperContext($34310caa050a8d63$var$ANCHOR_NAME, __scopePopper); - const ref = $50Iv9$react.useRef(null); - const composedRefs = $50Iv9$radixuireactcomposerefs.useComposedRefs(forwardedRef, ref); - $50Iv9$react.useEffect(() => { - // Consumer can anchor the popper to something that isn't - // a DOM node e.g. pointer position, so we override the - // `anchorRef` with their virtual ref in this case. - context.onAnchorChange((virtualRef === null || virtualRef === void 0 ? void 0 : virtualRef.current) || ref.current); - }); - return virtualRef ? null : /*#__PURE__*/$50Iv9$react.createElement($50Iv9$radixuireactprimitive.Primitive.div, $parcel$interopDefault($50Iv9$babelruntimehelpersextends)({}, anchorProps, { - ref: composedRefs - })); -}); -/*#__PURE__*/ -Object.assign($34310caa050a8d63$export$ecd4e1ccab6ed6d, { - displayName: $34310caa050a8d63$var$ANCHOR_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * PopperContent - * -----------------------------------------------------------------------------------------------*/ -const $34310caa050a8d63$var$CONTENT_NAME = 'PopperContent'; -const [$34310caa050a8d63$var$PopperContentProvider, $34310caa050a8d63$var$useContentContext] = $34310caa050a8d63$var$createPopperContext($34310caa050a8d63$var$CONTENT_NAME); -const $34310caa050a8d63$export$bc4ae5855d3c4fc = /*#__PURE__*/$50Iv9$react.forwardRef((props, forwardedRef) => { - var _arrowSize$width, _arrowSize$height, _middlewareData$arrow, _middlewareData$arrow2, _middlewareData$arrow3, _middlewareData$trans, _middlewareData$trans2, _middlewareData$hide; - const { - __scopePopper: __scopePopper, - side = 'bottom', - sideOffset = 0, - align = 'center', - alignOffset = 0, - arrowPadding = 0, - collisionBoundary = [], - collisionPadding: collisionPaddingProp = 0, - sticky = 'partial', - hideWhenDetached = false, - avoidCollisions = true, - onPlaced: onPlaced, - ...contentProps - } = props; - const context = $34310caa050a8d63$var$usePopperContext($34310caa050a8d63$var$CONTENT_NAME, __scopePopper); - const [content, setContent] = $50Iv9$react.useState(null); - const composedRefs = $50Iv9$radixuireactcomposerefs.useComposedRefs(forwardedRef, node => setContent(node)); - const [arrow, setArrow] = $50Iv9$react.useState(null); - const arrowSize = $50Iv9$radixuireactusesize.useSize(arrow); - const arrowWidth = (_arrowSize$width = arrowSize === null || arrowSize === void 0 ? void 0 : arrowSize.width) !== null && _arrowSize$width !== void 0 ? _arrowSize$width : 0; - const arrowHeight = (_arrowSize$height = arrowSize === null || arrowSize === void 0 ? void 0 : arrowSize.height) !== null && _arrowSize$height !== void 0 ? _arrowSize$height : 0; - const desiredPlacement = side + (align !== 'center' ? '-' + align : ''); - const collisionPadding = typeof collisionPaddingProp === 'number' ? collisionPaddingProp : { - top: 0, - right: 0, - bottom: 0, - left: 0, - ...collisionPaddingProp - }; - const boundary = Array.isArray(collisionBoundary) ? collisionBoundary : [collisionBoundary]; - const hasExplicitBoundaries = boundary.length > 0; - const detectOverflowOptions = { - padding: collisionPadding, - boundary: boundary.filter($34310caa050a8d63$var$isNotNull), - // with `strategy: 'fixed'`, this is the only way to get it to respect boundaries - altBoundary: hasExplicitBoundaries - }; - const { - refs: refs, - floatingStyles: floatingStyles, - placement: placement, - isPositioned: isPositioned, - middlewareData: middlewareData - } = $50Iv9$floatinguireactdom.useFloating({ - // default to `fixed` strategy so users don't have to pick and we also avoid focus scroll issues - strategy: 'fixed', - placement: desiredPlacement, - whileElementsMounted: $50Iv9$floatinguireactdom.autoUpdate, - elements: { - reference: context.anchor - }, - middleware: [$50Iv9$floatinguireactdom.offset({ - mainAxis: sideOffset + arrowHeight, - alignmentAxis: alignOffset - }), avoidCollisions && $50Iv9$floatinguireactdom.shift({ - mainAxis: true, - crossAxis: false, - limiter: sticky === 'partial' ? $50Iv9$floatinguireactdom.limitShift() : undefined, - ...detectOverflowOptions - }), avoidCollisions && $50Iv9$floatinguireactdom.flip({ - ...detectOverflowOptions - }), $50Iv9$floatinguireactdom.size({ - ...detectOverflowOptions, - apply: _ref => { - let { - elements: elements, - rects: rects, - availableWidth: availableWidth, - availableHeight: availableHeight - } = _ref; - const { - width: anchorWidth, - height: anchorHeight - } = rects.reference; - const contentStyle = elements.floating.style; - contentStyle.setProperty('--radix-popper-available-width', `${availableWidth}px`); - contentStyle.setProperty('--radix-popper-available-height', `${availableHeight}px`); - contentStyle.setProperty('--radix-popper-anchor-width', `${anchorWidth}px`); - contentStyle.setProperty('--radix-popper-anchor-height', `${anchorHeight}px`); - } - }), arrow && $50Iv9$floatinguireactdom.arrow({ - element: arrow, - padding: arrowPadding - }), $34310caa050a8d63$var$transformOrigin({ - arrowWidth: arrowWidth, - arrowHeight: arrowHeight - }), hideWhenDetached && $50Iv9$floatinguireactdom.hide({ - strategy: 'referenceHidden' - })] - }); - const [placedSide, placedAlign] = $34310caa050a8d63$var$getSideAndAlignFromPlacement(placement); - const handlePlaced = $50Iv9$radixuireactusecallbackref.useCallbackRef(onPlaced); - $50Iv9$radixuireactuselayouteffect.useLayoutEffect(() => { - if (isPositioned) handlePlaced === null || handlePlaced === void 0 || handlePlaced(); - }, [isPositioned, handlePlaced]); - const arrowX = (_middlewareData$arrow = middlewareData.arrow) === null || _middlewareData$arrow === void 0 ? void 0 : _middlewareData$arrow.x; - const arrowY = (_middlewareData$arrow2 = middlewareData.arrow) === null || _middlewareData$arrow2 === void 0 ? void 0 : _middlewareData$arrow2.y; - const cannotCenterArrow = ((_middlewareData$arrow3 = middlewareData.arrow) === null || _middlewareData$arrow3 === void 0 ? void 0 : _middlewareData$arrow3.centerOffset) !== 0; - const [contentZIndex, setContentZIndex] = $50Iv9$react.useState(); - $50Iv9$radixuireactuselayouteffect.useLayoutEffect(() => { - if (content) setContentZIndex(window.getComputedStyle(content).zIndex); - }, [content]); - return /*#__PURE__*/$50Iv9$react.createElement("div", { - ref: refs.setFloating, - "data-radix-popper-content-wrapper": "", - style: { - ...floatingStyles, - transform: isPositioned ? floatingStyles.transform : 'translate(0, -200%)', - // keep off the page when measuring - minWidth: 'max-content', - zIndex: contentZIndex, - ['--radix-popper-transform-origin']: [(_middlewareData$trans = middlewareData.transformOrigin) === null || _middlewareData$trans === void 0 ? void 0 : _middlewareData$trans.x, (_middlewareData$trans2 = middlewareData.transformOrigin) === null || _middlewareData$trans2 === void 0 ? void 0 : _middlewareData$trans2.y].join(' ') - } // Floating UI interally calculates logical alignment based the `dir` attribute on - , - - dir: props.dir - }, /*#__PURE__*/$50Iv9$react.createElement($34310caa050a8d63$var$PopperContentProvider, { - scope: __scopePopper, - placedSide: placedSide, - onArrowChange: setArrow, - arrowX: arrowX, - arrowY: arrowY, - shouldHideArrow: cannotCenterArrow - }, /*#__PURE__*/$50Iv9$react.createElement($50Iv9$radixuireactprimitive.Primitive.div, $parcel$interopDefault($50Iv9$babelruntimehelpersextends)({ - "data-side": placedSide, - "data-align": placedAlign - }, contentProps, { - ref: composedRefs, - style: { - ...contentProps.style, - // if the PopperContent hasn't been placed yet (not all measurements done) - // we prevent animations so that users's animation don't kick in too early referring wrong sides - animation: !isPositioned ? 'none' : undefined, - // hide the content if using the hide middleware and should be hidden - opacity: (_middlewareData$hide = middlewareData.hide) !== null && _middlewareData$hide !== void 0 && _middlewareData$hide.referenceHidden ? 0 : undefined - } - })))); -}); -/*#__PURE__*/ -Object.assign($34310caa050a8d63$export$bc4ae5855d3c4fc, { - displayName: $34310caa050a8d63$var$CONTENT_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * PopperArrow - * -----------------------------------------------------------------------------------------------*/ -const $34310caa050a8d63$var$ARROW_NAME = 'PopperArrow'; -const $34310caa050a8d63$var$OPPOSITE_SIDE = { - top: 'bottom', - right: 'left', - bottom: 'top', - left: 'right' -}; -const $34310caa050a8d63$export$79d62cd4e10a3fd0 = /*#__PURE__*/$50Iv9$react.forwardRef(function $34310caa050a8d63$export$79d62cd4e10a3fd0(props, forwardedRef) { - const { - __scopePopper: __scopePopper, - ...arrowProps - } = props; - const contentContext = $34310caa050a8d63$var$useContentContext($34310caa050a8d63$var$ARROW_NAME, __scopePopper); - const baseSide = $34310caa050a8d63$var$OPPOSITE_SIDE[contentContext.placedSide]; - return /*#__PURE__*/ (// we have to use an extra wrapper because `ResizeObserver` (used by `useSize`) - // doesn't report size as we'd expect on SVG elements. - // it reports their bounding box which is effectively the largest path inside the SVG. - $50Iv9$react.createElement("span", { - ref: contentContext.onArrowChange, - style: { - position: 'absolute', - left: contentContext.arrowX, - top: contentContext.arrowY, - [baseSide]: 0, - transformOrigin: { - top: '', - right: '0 0', - bottom: 'center 0', - left: '100% 0' - }[contentContext.placedSide], - transform: { - top: 'translateY(100%)', - right: 'translateY(50%) rotate(90deg) translateX(-50%)', - bottom: `rotate(180deg)`, - left: 'translateY(50%) rotate(-90deg) translateX(50%)' - }[contentContext.placedSide], - visibility: contentContext.shouldHideArrow ? 'hidden' : undefined - } - }, /*#__PURE__*/$50Iv9$react.createElement($50Iv9$radixuireactarrow.Root, $parcel$interopDefault($50Iv9$babelruntimehelpersextends)({}, arrowProps, { - ref: forwardedRef, - style: { - ...arrowProps.style, - // ensures the element can be measured correctly (mostly for if SVG) - display: 'block' - } - }))) - ); -}); -/*#__PURE__*/ -Object.assign($34310caa050a8d63$export$79d62cd4e10a3fd0, { - displayName: $34310caa050a8d63$var$ARROW_NAME -}); -/* -----------------------------------------------------------------------------------------------*/ -function $34310caa050a8d63$var$isNotNull(value) { - return value !== null; -} -const $34310caa050a8d63$var$transformOrigin = options => ({ - name: 'transformOrigin', - options: options, - fn(data) { - var _middlewareData$arrow4, _middlewareData$arrow5, _middlewareData$arrow6, _middlewareData$arrow7, _middlewareData$arrow8; - const { - placement: placement, - rects: rects, - middlewareData: middlewareData - } = data; - const cannotCenterArrow = ((_middlewareData$arrow4 = middlewareData.arrow) === null || _middlewareData$arrow4 === void 0 ? void 0 : _middlewareData$arrow4.centerOffset) !== 0; - const isArrowHidden = cannotCenterArrow; - const arrowWidth = isArrowHidden ? 0 : options.arrowWidth; - const arrowHeight = isArrowHidden ? 0 : options.arrowHeight; - const [placedSide, placedAlign] = $34310caa050a8d63$var$getSideAndAlignFromPlacement(placement); - const noArrowAlign = { - start: '0%', - center: '50%', - end: '100%' - }[placedAlign]; - const arrowXCenter = ((_middlewareData$arrow5 = (_middlewareData$arrow6 = middlewareData.arrow) === null || _middlewareData$arrow6 === void 0 ? void 0 : _middlewareData$arrow6.x) !== null && _middlewareData$arrow5 !== void 0 ? _middlewareData$arrow5 : 0) + arrowWidth / 2; - const arrowYCenter = ((_middlewareData$arrow7 = (_middlewareData$arrow8 = middlewareData.arrow) === null || _middlewareData$arrow8 === void 0 ? void 0 : _middlewareData$arrow8.y) !== null && _middlewareData$arrow7 !== void 0 ? _middlewareData$arrow7 : 0) + arrowHeight / 2; - let x = ''; - let y = ''; - if (placedSide === 'bottom') { - x = isArrowHidden ? noArrowAlign : `${arrowXCenter}px`; - y = `${-arrowHeight}px`; - } else if (placedSide === 'top') { - x = isArrowHidden ? noArrowAlign : `${arrowXCenter}px`; - y = `${rects.floating.height + arrowHeight}px`; - } else if (placedSide === 'right') { - x = `${-arrowHeight}px`; - y = isArrowHidden ? noArrowAlign : `${arrowYCenter}px`; - } else if (placedSide === 'left') { - x = `${rects.floating.width + arrowHeight}px`; - y = isArrowHidden ? noArrowAlign : `${arrowYCenter}px`; - } - return { - data: { - x: x, - y: y - } - }; - } -}); -function $34310caa050a8d63$var$getSideAndAlignFromPlacement(placement) { - const [side, align = 'center'] = placement.split('-'); - return [side, align]; -} -const $34310caa050a8d63$export$be92b6f5f03c0fe9 = $34310caa050a8d63$export$badac9ada3a0bdf9; -const $34310caa050a8d63$export$b688253958b8dfe7 = $34310caa050a8d63$export$ecd4e1ccab6ed6d; -const $34310caa050a8d63$export$7c6e2c02157bb7d2 = $34310caa050a8d63$export$bc4ae5855d3c4fc; -const $34310caa050a8d63$export$21b07c8f274aebd5 = $34310caa050a8d63$export$79d62cd4e10a3fd0; - -/***/ }), - -/***/ "../../../node_modules/@radix-ui/react-portal/dist/index.js": -/*!******************************************************************!*\ - !*** ../../../node_modules/@radix-ui/react-portal/dist/index.js ***! - \******************************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - - -var $amzHf$babelruntimehelpersextends = __webpack_require__(/*! @babel/runtime/helpers/extends */ "../../../node_modules/@babel/runtime/helpers/extends.js"); -var $amzHf$react = __webpack_require__(/*! react */ "react"); -var $amzHf$reactdom = __webpack_require__(/*! react-dom */ "react-dom"); -var $amzHf$radixuireactprimitive = __webpack_require__(/*! @radix-ui/react-primitive */ "../../../node_modules/@radix-ui/react-primitive/dist/index.js"); -function $parcel$export(e, n, v, s) { - Object.defineProperty(e, n, { - get: v, - set: s, - enumerable: true, - configurable: true - }); -} -function $parcel$interopDefault(a) { - return a && a.__esModule ? a.default : a; -} -$parcel$export(module.exports, "Portal", () => $913a70b877676c16$export$602eac185826482c); -$parcel$export(module.exports, "Root", () => $913a70b877676c16$export$be92b6f5f03c0fe9); - -/* ------------------------------------------------------------------------------------------------- - * Portal - * -----------------------------------------------------------------------------------------------*/ -const $913a70b877676c16$var$PORTAL_NAME = 'Portal'; -const $913a70b877676c16$export$602eac185826482c = /*#__PURE__*/$amzHf$react.forwardRef((props, forwardedRef) => { - var _globalThis$document; - const { - container = globalThis === null || globalThis === void 0 ? void 0 : (_globalThis$document = globalThis.document) === null || _globalThis$document === void 0 ? void 0 : _globalThis$document.body, - ...portalProps - } = props; - return container ? /*#__PURE__*/$parcel$interopDefault($amzHf$reactdom).createPortal( /*#__PURE__*/$amzHf$react.createElement($amzHf$radixuireactprimitive.Primitive.div, $parcel$interopDefault($amzHf$babelruntimehelpersextends)({}, portalProps, { - ref: forwardedRef - })), container) : null; -}); -/*#__PURE__*/ -Object.assign($913a70b877676c16$export$602eac185826482c, { - displayName: $913a70b877676c16$var$PORTAL_NAME -}); -/* -----------------------------------------------------------------------------------------------*/ -const $913a70b877676c16$export$be92b6f5f03c0fe9 = $913a70b877676c16$export$602eac185826482c; - -/***/ }), - -/***/ "../../../node_modules/@radix-ui/react-presence/dist/index.js": -/*!********************************************************************!*\ - !*** ../../../node_modules/@radix-ui/react-presence/dist/index.js ***! - \********************************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - - -var $fnLeV$react = __webpack_require__(/*! react */ "react"); -var $fnLeV$reactdom = __webpack_require__(/*! react-dom */ "react-dom"); -var $fnLeV$radixuireactcomposerefs = __webpack_require__(/*! @radix-ui/react-compose-refs */ "../../../node_modules/@radix-ui/react-compose-refs/dist/index.js"); -var $fnLeV$radixuireactuselayouteffect = __webpack_require__(/*! @radix-ui/react-use-layout-effect */ "../../../node_modules/@radix-ui/react-use-layout-effect/dist/index.js"); -function $parcel$export(e, n, v, s) { - Object.defineProperty(e, n, { - get: v, - set: s, - enumerable: true, - configurable: true - }); -} -$parcel$export(module.exports, "Presence", () => $a2fa0214bb2735a1$export$99c2b779aa4e8b8b); -function $8f63844556d0d3cd$export$3e6543de14f8614f(initialState, machine) { - return $fnLeV$react.useReducer((state, event) => { - const nextState = machine[state][event]; - return nextState !== null && nextState !== void 0 ? nextState : state; - }, initialState); -} -const $a2fa0214bb2735a1$export$99c2b779aa4e8b8b = props => { - const { - present: present, - children: children - } = props; - const presence = $a2fa0214bb2735a1$var$usePresence(present); - const child = typeof children === 'function' ? children({ - present: presence.isPresent - }) : $fnLeV$react.Children.only(children); - const ref = $fnLeV$radixuireactcomposerefs.useComposedRefs(presence.ref, child.ref); - const forceMount = typeof children === 'function'; - return forceMount || presence.isPresent ? /*#__PURE__*/$fnLeV$react.cloneElement(child, { - ref: ref - }) : null; -}; -$a2fa0214bb2735a1$export$99c2b779aa4e8b8b.displayName = 'Presence'; -/* ------------------------------------------------------------------------------------------------- - * usePresence - * -----------------------------------------------------------------------------------------------*/ -function $a2fa0214bb2735a1$var$usePresence(present) { - const [node1, setNode] = $fnLeV$react.useState(); - const stylesRef = $fnLeV$react.useRef({}); - const prevPresentRef = $fnLeV$react.useRef(present); - const prevAnimationNameRef = $fnLeV$react.useRef('none'); - const initialState = present ? 'mounted' : 'unmounted'; - const [state, send] = $8f63844556d0d3cd$export$3e6543de14f8614f(initialState, { - mounted: { - UNMOUNT: 'unmounted', - ANIMATION_OUT: 'unmountSuspended' - }, - unmountSuspended: { - MOUNT: 'mounted', - ANIMATION_END: 'unmounted' - }, - unmounted: { - MOUNT: 'mounted' - } - }); - $fnLeV$react.useEffect(() => { - const currentAnimationName = $a2fa0214bb2735a1$var$getAnimationName(stylesRef.current); - prevAnimationNameRef.current = state === 'mounted' ? currentAnimationName : 'none'; - }, [state]); - $fnLeV$radixuireactuselayouteffect.useLayoutEffect(() => { - const styles = stylesRef.current; - const wasPresent = prevPresentRef.current; - const hasPresentChanged = wasPresent !== present; - if (hasPresentChanged) { - const prevAnimationName = prevAnimationNameRef.current; - const currentAnimationName = $a2fa0214bb2735a1$var$getAnimationName(styles); - if (present) send('MOUNT');else if (currentAnimationName === 'none' || (styles === null || styles === void 0 ? void 0 : styles.display) === 'none') - // If there is no exit animation or the element is hidden, animations won't run - // so we unmount instantly - send('UNMOUNT');else { - /** - * When `present` changes to `false`, we check changes to animation-name to - * determine whether an animation has started. We chose this approach (reading - * computed styles) because there is no `animationrun` event and `animationstart` - * fires after `animation-delay` has expired which would be too late. - */ - const isAnimating = prevAnimationName !== currentAnimationName; - if (wasPresent && isAnimating) send('ANIMATION_OUT');else send('UNMOUNT'); - } - prevPresentRef.current = present; - } - }, [present, send]); - $fnLeV$radixuireactuselayouteffect.useLayoutEffect(() => { - if (node1) { - /** - * Triggering an ANIMATION_OUT during an ANIMATION_IN will fire an `animationcancel` - * event for ANIMATION_IN after we have entered `unmountSuspended` state. So, we - * make sure we only trigger ANIMATION_END for the currently active animation. - */ - const handleAnimationEnd = event => { - const currentAnimationName = $a2fa0214bb2735a1$var$getAnimationName(stylesRef.current); - const isCurrentAnimation = currentAnimationName.includes(event.animationName); - if (event.target === node1 && isCurrentAnimation) - // With React 18 concurrency this update is applied - // a frame after the animation ends, creating a flash of visible content. - // By manually flushing we ensure they sync within a frame, removing the flash. - $fnLeV$reactdom.flushSync(() => send('ANIMATION_END')); - }; - const handleAnimationStart = event => { - if (event.target === node1) - // if animation occurred, store its name as the previous animation. - prevAnimationNameRef.current = $a2fa0214bb2735a1$var$getAnimationName(stylesRef.current); - }; - node1.addEventListener('animationstart', handleAnimationStart); - node1.addEventListener('animationcancel', handleAnimationEnd); - node1.addEventListener('animationend', handleAnimationEnd); - return () => { - node1.removeEventListener('animationstart', handleAnimationStart); - node1.removeEventListener('animationcancel', handleAnimationEnd); - node1.removeEventListener('animationend', handleAnimationEnd); - }; - } else - // Transition to the unmounted state if the node is removed prematurely. - // We avoid doing so during cleanup as the node may change but still exist. - send('ANIMATION_END'); - }, [node1, send]); - return { - isPresent: ['mounted', 'unmountSuspended'].includes(state), - ref: $fnLeV$react.useCallback(node => { - if (node) stylesRef.current = getComputedStyle(node); - setNode(node); - }, []) - }; -} -/* -----------------------------------------------------------------------------------------------*/ -function $a2fa0214bb2735a1$var$getAnimationName(styles) { - return (styles === null || styles === void 0 ? void 0 : styles.animationName) || 'none'; -} - -/***/ }), - -/***/ "../../../node_modules/@radix-ui/react-primitive/dist/index.js": -/*!*********************************************************************!*\ - !*** ../../../node_modules/@radix-ui/react-primitive/dist/index.js ***! - \*********************************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - - -var $iMixA$babelruntimehelpersextends = __webpack_require__(/*! @babel/runtime/helpers/extends */ "../../../node_modules/@babel/runtime/helpers/extends.js"); -var $iMixA$react = __webpack_require__(/*! react */ "react"); -var $iMixA$reactdom = __webpack_require__(/*! react-dom */ "react-dom"); -var $iMixA$radixuireactslot = __webpack_require__(/*! @radix-ui/react-slot */ "../../../node_modules/@radix-ui/react-slot/dist/index.js"); -function $parcel$export(e, n, v, s) { - Object.defineProperty(e, n, { - get: v, - set: s, - enumerable: true, - configurable: true - }); -} -function $parcel$interopDefault(a) { - return a && a.__esModule ? a.default : a; -} -$parcel$export(module.exports, "Primitive", () => $c3def6332c2749a6$export$250ffa63cdc0d034); -$parcel$export(module.exports, "Root", () => $c3def6332c2749a6$export$be92b6f5f03c0fe9); -$parcel$export(module.exports, "dispatchDiscreteCustomEvent", () => $c3def6332c2749a6$export$6d1a0317bde7de7f); -const $c3def6332c2749a6$var$NODES = ['a', 'button', 'div', 'form', 'h2', 'h3', 'img', 'input', 'label', 'li', 'nav', 'ol', 'p', 'span', 'svg', 'ul']; // Temporary while we await merge of this fix: -// https://github.com/DefinitelyTyped/DefinitelyTyped/pull/55396 -// prettier-ignore -/* ------------------------------------------------------------------------------------------------- - * Primitive - * -----------------------------------------------------------------------------------------------*/ -const $c3def6332c2749a6$export$250ffa63cdc0d034 = $c3def6332c2749a6$var$NODES.reduce((primitive, node) => { - const Node = /*#__PURE__*/$iMixA$react.forwardRef((props, forwardedRef) => { - const { - asChild: asChild, - ...primitiveProps - } = props; - const Comp = asChild ? $iMixA$radixuireactslot.Slot : node; - $iMixA$react.useEffect(() => { - window[Symbol.for('radix-ui')] = true; - }, []); - return /*#__PURE__*/$iMixA$react.createElement(Comp, $parcel$interopDefault($iMixA$babelruntimehelpersextends)({}, primitiveProps, { - ref: forwardedRef - })); - }); - Node.displayName = `Primitive.${node}`; - return { - ...primitive, - [node]: Node - }; -}, {}); -/* ------------------------------------------------------------------------------------------------- - * Utils - * -----------------------------------------------------------------------------------------------*/ /** - * Flush custom event dispatch - * https://github.com/radix-ui/primitives/pull/1378 - * - * React batches *all* event handlers since version 18, this introduces certain considerations when using custom event types. - * - * Internally, React prioritises events in the following order: - * - discrete - * - continuous - * - default - * - * https://github.com/facebook/react/blob/a8a4742f1c54493df00da648a3f9d26e3db9c8b5/packages/react-dom/src/events/ReactDOMEventListener.js#L294-L350 - * - * `discrete` is an important distinction as updates within these events are applied immediately. - * React however, is not able to infer the priority of custom event types due to how they are detected internally. - * Because of this, it's possible for updates from custom events to be unexpectedly batched when - * dispatched by another `discrete` event. - * - * In order to ensure that updates from custom events are applied predictably, we need to manually flush the batch. - * This utility should be used when dispatching a custom event from within another `discrete` event, this utility - * is not nessesary when dispatching known event types, or if dispatching a custom type inside a non-discrete event. - * For example: - * - * dispatching a known click 👎 - * target.dispatchEvent(new Event(‘click’)) - * - * dispatching a custom type within a non-discrete event 👎 - * onScroll={(event) => event.target.dispatchEvent(new CustomEvent(‘customType’))} - * - * dispatching a custom type within a `discrete` event 👍 - * onPointerDown={(event) => dispatchDiscreteCustomEvent(event.target, new CustomEvent(‘customType’))} - * - * Note: though React classifies `focus`, `focusin` and `focusout` events as `discrete`, it's not recommended to use - * this utility with them. This is because it's possible for those handlers to be called implicitly during render - * e.g. when focus is within a component as it is unmounted, or when managing focus on mount. - */ -function $c3def6332c2749a6$export$6d1a0317bde7de7f(target, event) { - if (target) $iMixA$reactdom.flushSync(() => target.dispatchEvent(event)); -} -/* -----------------------------------------------------------------------------------------------*/ -const $c3def6332c2749a6$export$be92b6f5f03c0fe9 = $c3def6332c2749a6$export$250ffa63cdc0d034; - -/***/ }), - -/***/ "../../../node_modules/@radix-ui/react-roving-focus/dist/index.js": -/*!************************************************************************!*\ - !*** ../../../node_modules/@radix-ui/react-roving-focus/dist/index.js ***! - \************************************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - - -var $9QJ9Y$babelruntimehelpersextends = __webpack_require__(/*! @babel/runtime/helpers/extends */ "../../../node_modules/@babel/runtime/helpers/extends.js"); -var $9QJ9Y$react = __webpack_require__(/*! react */ "react"); -var $9QJ9Y$radixuiprimitive = __webpack_require__(/*! @radix-ui/primitive */ "../../../node_modules/@radix-ui/primitive/dist/index.js"); -var $9QJ9Y$radixuireactcollection = __webpack_require__(/*! @radix-ui/react-collection */ "../../../node_modules/@radix-ui/react-collection/dist/index.js"); -var $9QJ9Y$radixuireactcomposerefs = __webpack_require__(/*! @radix-ui/react-compose-refs */ "../../../node_modules/@radix-ui/react-compose-refs/dist/index.js"); -var $9QJ9Y$radixuireactcontext = __webpack_require__(/*! @radix-ui/react-context */ "../../../node_modules/@radix-ui/react-context/dist/index.js"); -var $9QJ9Y$radixuireactid = __webpack_require__(/*! @radix-ui/react-id */ "../../../node_modules/@radix-ui/react-id/dist/index.js"); -var $9QJ9Y$radixuireactprimitive = __webpack_require__(/*! @radix-ui/react-primitive */ "../../../node_modules/@radix-ui/react-primitive/dist/index.js"); -var $9QJ9Y$radixuireactusecallbackref = __webpack_require__(/*! @radix-ui/react-use-callback-ref */ "../../../node_modules/@radix-ui/react-use-callback-ref/dist/index.js"); -var $9QJ9Y$radixuireactusecontrollablestate = __webpack_require__(/*! @radix-ui/react-use-controllable-state */ "../../../node_modules/@radix-ui/react-use-controllable-state/dist/index.js"); -var $9QJ9Y$radixuireactdirection = __webpack_require__(/*! @radix-ui/react-direction */ "../../../node_modules/@radix-ui/react-direction/dist/index.js"); -function $parcel$export(e, n, v, s) { - Object.defineProperty(e, n, { - get: v, - set: s, - enumerable: true, - configurable: true - }); -} -function $parcel$interopDefault(a) { - return a && a.__esModule ? a.default : a; -} -$parcel$export(module.exports, "createRovingFocusGroupScope", () => $0063afae63b3fa70$export$c7109489551a4f4); -$parcel$export(module.exports, "RovingFocusGroup", () => $0063afae63b3fa70$export$8699f7c8af148338); -$parcel$export(module.exports, "RovingFocusGroupItem", () => $0063afae63b3fa70$export$ab9df7c53fe8454); -$parcel$export(module.exports, "Root", () => $0063afae63b3fa70$export$be92b6f5f03c0fe9); -$parcel$export(module.exports, "Item", () => $0063afae63b3fa70$export$6d08773d2e66f8f2); -const $0063afae63b3fa70$var$ENTRY_FOCUS = 'rovingFocusGroup.onEntryFocus'; -const $0063afae63b3fa70$var$EVENT_OPTIONS = { - bubbles: false, - cancelable: true -}; -/* ------------------------------------------------------------------------------------------------- - * RovingFocusGroup - * -----------------------------------------------------------------------------------------------*/ -const $0063afae63b3fa70$var$GROUP_NAME = 'RovingFocusGroup'; -const [$0063afae63b3fa70$var$Collection, $0063afae63b3fa70$var$useCollection, $0063afae63b3fa70$var$createCollectionScope] = $9QJ9Y$radixuireactcollection.createCollection($0063afae63b3fa70$var$GROUP_NAME); -const [$0063afae63b3fa70$var$createRovingFocusGroupContext, $0063afae63b3fa70$export$c7109489551a4f4] = $9QJ9Y$radixuireactcontext.createContextScope($0063afae63b3fa70$var$GROUP_NAME, [$0063afae63b3fa70$var$createCollectionScope]); -const [$0063afae63b3fa70$var$RovingFocusProvider, $0063afae63b3fa70$var$useRovingFocusContext] = $0063afae63b3fa70$var$createRovingFocusGroupContext($0063afae63b3fa70$var$GROUP_NAME); -const $0063afae63b3fa70$export$8699f7c8af148338 = /*#__PURE__*/$9QJ9Y$react.forwardRef((props, forwardedRef) => { - return /*#__PURE__*/$9QJ9Y$react.createElement($0063afae63b3fa70$var$Collection.Provider, { - scope: props.__scopeRovingFocusGroup - }, /*#__PURE__*/$9QJ9Y$react.createElement($0063afae63b3fa70$var$Collection.Slot, { - scope: props.__scopeRovingFocusGroup - }, /*#__PURE__*/$9QJ9Y$react.createElement($0063afae63b3fa70$var$RovingFocusGroupImpl, $parcel$interopDefault($9QJ9Y$babelruntimehelpersextends)({}, props, { - ref: forwardedRef - })))); -}); -/*#__PURE__*/ -Object.assign($0063afae63b3fa70$export$8699f7c8af148338, { - displayName: $0063afae63b3fa70$var$GROUP_NAME -}); -/* -----------------------------------------------------------------------------------------------*/ -const $0063afae63b3fa70$var$RovingFocusGroupImpl = /*#__PURE__*/$9QJ9Y$react.forwardRef((props, forwardedRef) => { - const { - __scopeRovingFocusGroup: __scopeRovingFocusGroup, - orientation: orientation, - loop = false, - dir: dir, - currentTabStopId: currentTabStopIdProp, - defaultCurrentTabStopId: defaultCurrentTabStopId, - onCurrentTabStopIdChange: onCurrentTabStopIdChange, - onEntryFocus: onEntryFocus, - ...groupProps - } = props; - const ref = $9QJ9Y$react.useRef(null); - const composedRefs = $9QJ9Y$radixuireactcomposerefs.useComposedRefs(forwardedRef, ref); - const direction = $9QJ9Y$radixuireactdirection.useDirection(dir); - const [currentTabStopId = null, setCurrentTabStopId] = $9QJ9Y$radixuireactusecontrollablestate.useControllableState({ - prop: currentTabStopIdProp, - defaultProp: defaultCurrentTabStopId, - onChange: onCurrentTabStopIdChange - }); - const [isTabbingBackOut, setIsTabbingBackOut] = $9QJ9Y$react.useState(false); - const handleEntryFocus = $9QJ9Y$radixuireactusecallbackref.useCallbackRef(onEntryFocus); - const getItems = $0063afae63b3fa70$var$useCollection(__scopeRovingFocusGroup); - const isClickFocusRef = $9QJ9Y$react.useRef(false); - const [focusableItemsCount, setFocusableItemsCount] = $9QJ9Y$react.useState(0); - $9QJ9Y$react.useEffect(() => { - const node = ref.current; - if (node) { - node.addEventListener($0063afae63b3fa70$var$ENTRY_FOCUS, handleEntryFocus); - return () => node.removeEventListener($0063afae63b3fa70$var$ENTRY_FOCUS, handleEntryFocus); - } - }, [handleEntryFocus]); - return /*#__PURE__*/$9QJ9Y$react.createElement($0063afae63b3fa70$var$RovingFocusProvider, { - scope: __scopeRovingFocusGroup, - orientation: orientation, - dir: direction, - loop: loop, - currentTabStopId: currentTabStopId, - onItemFocus: $9QJ9Y$react.useCallback(tabStopId => setCurrentTabStopId(tabStopId), [setCurrentTabStopId]), - onItemShiftTab: $9QJ9Y$react.useCallback(() => setIsTabbingBackOut(true), []), - onFocusableItemAdd: $9QJ9Y$react.useCallback(() => setFocusableItemsCount(prevCount => prevCount + 1), []), - onFocusableItemRemove: $9QJ9Y$react.useCallback(() => setFocusableItemsCount(prevCount => prevCount - 1), []) - }, /*#__PURE__*/$9QJ9Y$react.createElement($9QJ9Y$radixuireactprimitive.Primitive.div, $parcel$interopDefault($9QJ9Y$babelruntimehelpersextends)({ - tabIndex: isTabbingBackOut || focusableItemsCount === 0 ? -1 : 0, - "data-orientation": orientation - }, groupProps, { - ref: composedRefs, - style: { - outline: 'none', - ...props.style - }, - onMouseDown: $9QJ9Y$radixuiprimitive.composeEventHandlers(props.onMouseDown, () => { - isClickFocusRef.current = true; - }), - onFocus: $9QJ9Y$radixuiprimitive.composeEventHandlers(props.onFocus, event => { - // We normally wouldn't need this check, because we already check - // that the focus is on the current target and not bubbling to it. - // We do this because Safari doesn't focus buttons when clicked, and - // instead, the wrapper will get focused and not through a bubbling event. - const isKeyboardFocus = !isClickFocusRef.current; - if (event.target === event.currentTarget && isKeyboardFocus && !isTabbingBackOut) { - const entryFocusEvent = new CustomEvent($0063afae63b3fa70$var$ENTRY_FOCUS, $0063afae63b3fa70$var$EVENT_OPTIONS); - event.currentTarget.dispatchEvent(entryFocusEvent); - if (!entryFocusEvent.defaultPrevented) { - const items = getItems().filter(item => item.focusable); - const activeItem = items.find(item => item.active); - const currentItem = items.find(item => item.id === currentTabStopId); - const candidateItems = [activeItem, currentItem, ...items].filter(Boolean); - const candidateNodes = candidateItems.map(item => item.ref.current); - $0063afae63b3fa70$var$focusFirst(candidateNodes); - } - } - isClickFocusRef.current = false; - }), - onBlur: $9QJ9Y$radixuiprimitive.composeEventHandlers(props.onBlur, () => setIsTabbingBackOut(false)) - }))); -}); -/* ------------------------------------------------------------------------------------------------- - * RovingFocusGroupItem - * -----------------------------------------------------------------------------------------------*/ -const $0063afae63b3fa70$var$ITEM_NAME = 'RovingFocusGroupItem'; -const $0063afae63b3fa70$export$ab9df7c53fe8454 = /*#__PURE__*/$9QJ9Y$react.forwardRef((props, forwardedRef) => { - const { - __scopeRovingFocusGroup: __scopeRovingFocusGroup, - focusable = true, - active = false, - tabStopId: tabStopId, - ...itemProps - } = props; - const autoId = $9QJ9Y$radixuireactid.useId(); - const id = tabStopId || autoId; - const context = $0063afae63b3fa70$var$useRovingFocusContext($0063afae63b3fa70$var$ITEM_NAME, __scopeRovingFocusGroup); - const isCurrentTabStop = context.currentTabStopId === id; - const getItems = $0063afae63b3fa70$var$useCollection(__scopeRovingFocusGroup); - const { - onFocusableItemAdd: onFocusableItemAdd, - onFocusableItemRemove: onFocusableItemRemove - } = context; - $9QJ9Y$react.useEffect(() => { - if (focusable) { - onFocusableItemAdd(); - return () => onFocusableItemRemove(); - } - }, [focusable, onFocusableItemAdd, onFocusableItemRemove]); - return /*#__PURE__*/$9QJ9Y$react.createElement($0063afae63b3fa70$var$Collection.ItemSlot, { - scope: __scopeRovingFocusGroup, - id: id, - focusable: focusable, - active: active - }, /*#__PURE__*/$9QJ9Y$react.createElement($9QJ9Y$radixuireactprimitive.Primitive.span, $parcel$interopDefault($9QJ9Y$babelruntimehelpersextends)({ - tabIndex: isCurrentTabStop ? 0 : -1, - "data-orientation": context.orientation - }, itemProps, { - ref: forwardedRef, - onMouseDown: $9QJ9Y$radixuiprimitive.composeEventHandlers(props.onMouseDown, event => { - // We prevent focusing non-focusable items on `mousedown`. - // Even though the item has tabIndex={-1}, that only means take it out of the tab order. - if (!focusable) event.preventDefault(); // Safari doesn't focus a button when clicked so we run our logic on mousedown also - else context.onItemFocus(id); - }), - onFocus: $9QJ9Y$radixuiprimitive.composeEventHandlers(props.onFocus, () => context.onItemFocus(id)), - onKeyDown: $9QJ9Y$radixuiprimitive.composeEventHandlers(props.onKeyDown, event => { - if (event.key === 'Tab' && event.shiftKey) { - context.onItemShiftTab(); - return; - } - if (event.target !== event.currentTarget) return; - const focusIntent = $0063afae63b3fa70$var$getFocusIntent(event, context.orientation, context.dir); - if (focusIntent !== undefined) { - event.preventDefault(); - const items = getItems().filter(item => item.focusable); - let candidateNodes = items.map(item => item.ref.current); - if (focusIntent === 'last') candidateNodes.reverse();else if (focusIntent === 'prev' || focusIntent === 'next') { - if (focusIntent === 'prev') candidateNodes.reverse(); - const currentIndex = candidateNodes.indexOf(event.currentTarget); - candidateNodes = context.loop ? $0063afae63b3fa70$var$wrapArray(candidateNodes, currentIndex + 1) : candidateNodes.slice(currentIndex + 1); - } - /** - * Imperative focus during keydown is risky so we prevent React's batching updates - * to avoid potential bugs. See: https://github.com/facebook/react/issues/20332 - */ - setTimeout(() => $0063afae63b3fa70$var$focusFirst(candidateNodes)); - } - }) - }))); -}); -/*#__PURE__*/ -Object.assign($0063afae63b3fa70$export$ab9df7c53fe8454, { - displayName: $0063afae63b3fa70$var$ITEM_NAME -}); -/* -----------------------------------------------------------------------------------------------*/ // prettier-ignore -const $0063afae63b3fa70$var$MAP_KEY_TO_FOCUS_INTENT = { - ArrowLeft: 'prev', - ArrowUp: 'prev', - ArrowRight: 'next', - ArrowDown: 'next', - PageUp: 'first', - Home: 'first', - PageDown: 'last', - End: 'last' -}; -function $0063afae63b3fa70$var$getDirectionAwareKey(key, dir) { - if (dir !== 'rtl') return key; - return key === 'ArrowLeft' ? 'ArrowRight' : key === 'ArrowRight' ? 'ArrowLeft' : key; -} -function $0063afae63b3fa70$var$getFocusIntent(event, orientation, dir) { - const key = $0063afae63b3fa70$var$getDirectionAwareKey(event.key, dir); - if (orientation === 'vertical' && ['ArrowLeft', 'ArrowRight'].includes(key)) return undefined; - if (orientation === 'horizontal' && ['ArrowUp', 'ArrowDown'].includes(key)) return undefined; - return $0063afae63b3fa70$var$MAP_KEY_TO_FOCUS_INTENT[key]; -} -function $0063afae63b3fa70$var$focusFirst(candidates) { - const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement; - for (const candidate of candidates) { - // if focus is already where we want to go, we don't want to keep going through the candidates - if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return; - candidate.focus(); - if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return; - } -} -/** - * Wraps an array around itself at a given start index - * Example: `wrapArray(['a', 'b', 'c', 'd'], 2) === ['c', 'd', 'a', 'b']` - */ -function $0063afae63b3fa70$var$wrapArray(array, startIndex) { - return array.map((_, index) => array[(startIndex + index) % array.length]); -} -const $0063afae63b3fa70$export$be92b6f5f03c0fe9 = $0063afae63b3fa70$export$8699f7c8af148338; -const $0063afae63b3fa70$export$6d08773d2e66f8f2 = $0063afae63b3fa70$export$ab9df7c53fe8454; - -/***/ }), - -/***/ "../../../node_modules/@radix-ui/react-slot/dist/index.js": -/*!****************************************************************!*\ - !*** ../../../node_modules/@radix-ui/react-slot/dist/index.js ***! - \****************************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - - -var $dAvBt$babelruntimehelpersextends = __webpack_require__(/*! @babel/runtime/helpers/extends */ "../../../node_modules/@babel/runtime/helpers/extends.js"); -var $dAvBt$react = __webpack_require__(/*! react */ "react"); -var $dAvBt$radixuireactcomposerefs = __webpack_require__(/*! @radix-ui/react-compose-refs */ "../../../node_modules/@radix-ui/react-compose-refs/dist/index.js"); -function $parcel$export(e, n, v, s) { - Object.defineProperty(e, n, { - get: v, - set: s, - enumerable: true, - configurable: true - }); -} -function $parcel$interopDefault(a) { - return a && a.__esModule ? a.default : a; -} -$parcel$export(module.exports, "Slot", () => $82dc8d030dec7549$export$8c6ed5c666ac1360); -$parcel$export(module.exports, "Slottable", () => $82dc8d030dec7549$export$d9f1ccf0bdb05d45); -$parcel$export(module.exports, "Root", () => $82dc8d030dec7549$export$be92b6f5f03c0fe9); - -/* ------------------------------------------------------------------------------------------------- - * Slot - * -----------------------------------------------------------------------------------------------*/ -const $82dc8d030dec7549$export$8c6ed5c666ac1360 = /*#__PURE__*/$dAvBt$react.forwardRef((props, forwardedRef) => { - const { - children: children, - ...slotProps - } = props; - const childrenArray = $dAvBt$react.Children.toArray(children); - const slottable = childrenArray.find($82dc8d030dec7549$var$isSlottable); - if (slottable) { - // the new element to render is the one passed as a child of `Slottable` - const newElement = slottable.props.children; - const newChildren = childrenArray.map(child => { - if (child === slottable) { - // because the new element will be the one rendered, we are only interested - // in grabbing its children (`newElement.props.children`) - if ($dAvBt$react.Children.count(newElement) > 1) return $dAvBt$react.Children.only(null); - return /*#__PURE__*/$dAvBt$react.isValidElement(newElement) ? newElement.props.children : null; - } else return child; - }); - return /*#__PURE__*/$dAvBt$react.createElement($82dc8d030dec7549$var$SlotClone, $parcel$interopDefault($dAvBt$babelruntimehelpersextends)({}, slotProps, { - ref: forwardedRef - }), /*#__PURE__*/$dAvBt$react.isValidElement(newElement) ? /*#__PURE__*/$dAvBt$react.cloneElement(newElement, undefined, newChildren) : null); - } - return /*#__PURE__*/$dAvBt$react.createElement($82dc8d030dec7549$var$SlotClone, $parcel$interopDefault($dAvBt$babelruntimehelpersextends)({}, slotProps, { - ref: forwardedRef - }), children); -}); -$82dc8d030dec7549$export$8c6ed5c666ac1360.displayName = 'Slot'; -/* ------------------------------------------------------------------------------------------------- - * SlotClone - * -----------------------------------------------------------------------------------------------*/ -const $82dc8d030dec7549$var$SlotClone = /*#__PURE__*/$dAvBt$react.forwardRef((props, forwardedRef) => { - const { - children: children, - ...slotProps - } = props; - if ( /*#__PURE__*/$dAvBt$react.isValidElement(children)) return /*#__PURE__*/$dAvBt$react.cloneElement(children, { - ...$82dc8d030dec7549$var$mergeProps(slotProps, children.props), - ref: forwardedRef ? $dAvBt$radixuireactcomposerefs.composeRefs(forwardedRef, children.ref) : children.ref - }); - return $dAvBt$react.Children.count(children) > 1 ? $dAvBt$react.Children.only(null) : null; -}); -$82dc8d030dec7549$var$SlotClone.displayName = 'SlotClone'; -/* ------------------------------------------------------------------------------------------------- - * Slottable - * -----------------------------------------------------------------------------------------------*/ -const $82dc8d030dec7549$export$d9f1ccf0bdb05d45 = _ref => { - let { - children: children - } = _ref; - return /*#__PURE__*/$dAvBt$react.createElement($dAvBt$react.Fragment, null, children); -}; -/* ---------------------------------------------------------------------------------------------- */ -function $82dc8d030dec7549$var$isSlottable(child) { - return /*#__PURE__*/$dAvBt$react.isValidElement(child) && child.type === $82dc8d030dec7549$export$d9f1ccf0bdb05d45; -} -function $82dc8d030dec7549$var$mergeProps(slotProps, childProps) { - // all child props should override - const overrideProps = { - ...childProps - }; - for (const propName in childProps) { - const slotPropValue = slotProps[propName]; - const childPropValue = childProps[propName]; - const isHandler = /^on[A-Z]/.test(propName); - if (isHandler) { - // if the handler exists on both, we compose them - if (slotPropValue && childPropValue) overrideProps[propName] = function () { - childPropValue(...arguments); - slotPropValue(...arguments); - };else if (slotPropValue) overrideProps[propName] = slotPropValue; - } else if (propName === 'style') overrideProps[propName] = { - ...slotPropValue, - ...childPropValue - };else if (propName === 'className') overrideProps[propName] = [slotPropValue, childPropValue].filter(Boolean).join(' '); - } - return { - ...slotProps, - ...overrideProps - }; -} -const $82dc8d030dec7549$export$be92b6f5f03c0fe9 = $82dc8d030dec7549$export$8c6ed5c666ac1360; - -/***/ }), - -/***/ "../../../node_modules/@radix-ui/react-tooltip/dist/index.js": -/*!*******************************************************************!*\ - !*** ../../../node_modules/@radix-ui/react-tooltip/dist/index.js ***! - \*******************************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - - -var $iVrL9$babelruntimehelpersextends = __webpack_require__(/*! @babel/runtime/helpers/extends */ "../../../node_modules/@babel/runtime/helpers/extends.js"); -var $iVrL9$react = __webpack_require__(/*! react */ "react"); -var $iVrL9$radixuiprimitive = __webpack_require__(/*! @radix-ui/primitive */ "../../../node_modules/@radix-ui/primitive/dist/index.js"); -var $iVrL9$radixuireactcomposerefs = __webpack_require__(/*! @radix-ui/react-compose-refs */ "../../../node_modules/@radix-ui/react-compose-refs/dist/index.js"); -var $iVrL9$radixuireactcontext = __webpack_require__(/*! @radix-ui/react-context */ "../../../node_modules/@radix-ui/react-context/dist/index.js"); -var $iVrL9$radixuireactdismissablelayer = __webpack_require__(/*! @radix-ui/react-dismissable-layer */ "../../../node_modules/@radix-ui/react-dismissable-layer/dist/index.js"); -var $iVrL9$radixuireactid = __webpack_require__(/*! @radix-ui/react-id */ "../../../node_modules/@radix-ui/react-id/dist/index.js"); -var $iVrL9$radixuireactpopper = __webpack_require__(/*! @radix-ui/react-popper */ "../../../node_modules/@radix-ui/react-popper/dist/index.js"); -var $iVrL9$radixuireactportal = __webpack_require__(/*! @radix-ui/react-portal */ "../../../node_modules/@radix-ui/react-portal/dist/index.js"); -var $iVrL9$radixuireactpresence = __webpack_require__(/*! @radix-ui/react-presence */ "../../../node_modules/@radix-ui/react-presence/dist/index.js"); -var $iVrL9$radixuireactprimitive = __webpack_require__(/*! @radix-ui/react-primitive */ "../../../node_modules/@radix-ui/react-primitive/dist/index.js"); -var $iVrL9$radixuireactslot = __webpack_require__(/*! @radix-ui/react-slot */ "../../../node_modules/@radix-ui/react-slot/dist/index.js"); -var $iVrL9$radixuireactusecontrollablestate = __webpack_require__(/*! @radix-ui/react-use-controllable-state */ "../../../node_modules/@radix-ui/react-use-controllable-state/dist/index.js"); -var $iVrL9$radixuireactvisuallyhidden = __webpack_require__(/*! @radix-ui/react-visually-hidden */ "../../../node_modules/@radix-ui/react-visually-hidden/dist/index.js"); -function $parcel$export(e, n, v, s) { - Object.defineProperty(e, n, { - get: v, - set: s, - enumerable: true, - configurable: true - }); -} -function $parcel$interopDefault(a) { - return a && a.__esModule ? a.default : a; -} -$parcel$export(module.exports, "createTooltipScope", () => $c34afbc43c90cc6f$export$1c540a2224f0d865); -$parcel$export(module.exports, "TooltipProvider", () => $c34afbc43c90cc6f$export$f78649fb9ca566b8); -$parcel$export(module.exports, "Tooltip", () => $c34afbc43c90cc6f$export$28c660c63b792dea); -$parcel$export(module.exports, "TooltipTrigger", () => $c34afbc43c90cc6f$export$8c610744efcf8a1d); -$parcel$export(module.exports, "TooltipPortal", () => $c34afbc43c90cc6f$export$7b36b8f925ab7497); -$parcel$export(module.exports, "TooltipContent", () => $c34afbc43c90cc6f$export$e9003e2be37ec060); -$parcel$export(module.exports, "TooltipArrow", () => $c34afbc43c90cc6f$export$c27ee0ad710f7559); -$parcel$export(module.exports, "Provider", () => $c34afbc43c90cc6f$export$2881499e37b75b9a); -$parcel$export(module.exports, "Root", () => $c34afbc43c90cc6f$export$be92b6f5f03c0fe9); -$parcel$export(module.exports, "Trigger", () => $c34afbc43c90cc6f$export$41fb9f06171c75f4); -$parcel$export(module.exports, "Portal", () => $c34afbc43c90cc6f$export$602eac185826482c); -$parcel$export(module.exports, "Content", () => $c34afbc43c90cc6f$export$7c6e2c02157bb7d2); -$parcel$export(module.exports, "Arrow", () => $c34afbc43c90cc6f$export$21b07c8f274aebd5); -const [$c34afbc43c90cc6f$var$createTooltipContext, $c34afbc43c90cc6f$export$1c540a2224f0d865] = $iVrL9$radixuireactcontext.createContextScope('Tooltip', [$iVrL9$radixuireactpopper.createPopperScope]); -const $c34afbc43c90cc6f$var$usePopperScope = $iVrL9$radixuireactpopper.createPopperScope(); -/* ------------------------------------------------------------------------------------------------- - * TooltipProvider - * -----------------------------------------------------------------------------------------------*/ -const $c34afbc43c90cc6f$var$PROVIDER_NAME = 'TooltipProvider'; -const $c34afbc43c90cc6f$var$DEFAULT_DELAY_DURATION = 700; -const $c34afbc43c90cc6f$var$TOOLTIP_OPEN = 'tooltip.open'; -const [$c34afbc43c90cc6f$var$TooltipProviderContextProvider, $c34afbc43c90cc6f$var$useTooltipProviderContext] = $c34afbc43c90cc6f$var$createTooltipContext($c34afbc43c90cc6f$var$PROVIDER_NAME); -const $c34afbc43c90cc6f$export$f78649fb9ca566b8 = props => { - const { - __scopeTooltip: __scopeTooltip, - delayDuration = $c34afbc43c90cc6f$var$DEFAULT_DELAY_DURATION, - skipDelayDuration = 300, - disableHoverableContent = false, - children: children - } = props; - const [isOpenDelayed, setIsOpenDelayed] = $iVrL9$react.useState(true); - const isPointerInTransitRef = $iVrL9$react.useRef(false); - const skipDelayTimerRef = $iVrL9$react.useRef(0); - $iVrL9$react.useEffect(() => { - const skipDelayTimer = skipDelayTimerRef.current; - return () => window.clearTimeout(skipDelayTimer); - }, []); - return /*#__PURE__*/$iVrL9$react.createElement($c34afbc43c90cc6f$var$TooltipProviderContextProvider, { - scope: __scopeTooltip, - isOpenDelayed: isOpenDelayed, - delayDuration: delayDuration, - onOpen: $iVrL9$react.useCallback(() => { - window.clearTimeout(skipDelayTimerRef.current); - setIsOpenDelayed(false); - }, []), - onClose: $iVrL9$react.useCallback(() => { - window.clearTimeout(skipDelayTimerRef.current); - skipDelayTimerRef.current = window.setTimeout(() => setIsOpenDelayed(true), skipDelayDuration); - }, [skipDelayDuration]), - isPointerInTransitRef: isPointerInTransitRef, - onPointerInTransitChange: $iVrL9$react.useCallback(inTransit => { - isPointerInTransitRef.current = inTransit; - }, []), - disableHoverableContent: disableHoverableContent - }, children); -}; -/*#__PURE__*/ -Object.assign($c34afbc43c90cc6f$export$f78649fb9ca566b8, { - displayName: $c34afbc43c90cc6f$var$PROVIDER_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * Tooltip - * -----------------------------------------------------------------------------------------------*/ -const $c34afbc43c90cc6f$var$TOOLTIP_NAME = 'Tooltip'; -const [$c34afbc43c90cc6f$var$TooltipContextProvider, $c34afbc43c90cc6f$var$useTooltipContext] = $c34afbc43c90cc6f$var$createTooltipContext($c34afbc43c90cc6f$var$TOOLTIP_NAME); -const $c34afbc43c90cc6f$export$28c660c63b792dea = props => { - const { - __scopeTooltip: __scopeTooltip, - children: children, - open: openProp, - defaultOpen = false, - onOpenChange: onOpenChange, - disableHoverableContent: disableHoverableContentProp, - delayDuration: delayDurationProp - } = props; - const providerContext = $c34afbc43c90cc6f$var$useTooltipProviderContext($c34afbc43c90cc6f$var$TOOLTIP_NAME, props.__scopeTooltip); - const popperScope = $c34afbc43c90cc6f$var$usePopperScope(__scopeTooltip); - const [trigger, setTrigger] = $iVrL9$react.useState(null); - const contentId = $iVrL9$radixuireactid.useId(); - const openTimerRef = $iVrL9$react.useRef(0); - const disableHoverableContent = disableHoverableContentProp !== null && disableHoverableContentProp !== void 0 ? disableHoverableContentProp : providerContext.disableHoverableContent; - const delayDuration = delayDurationProp !== null && delayDurationProp !== void 0 ? delayDurationProp : providerContext.delayDuration; - const wasOpenDelayedRef = $iVrL9$react.useRef(false); - const [open1 = false, setOpen] = $iVrL9$radixuireactusecontrollablestate.useControllableState({ - prop: openProp, - defaultProp: defaultOpen, - onChange: open => { - if (open) { - providerContext.onOpen(); // as `onChange` is called within a lifecycle method we - // avoid dispatching via `dispatchDiscreteCustomEvent`. - document.dispatchEvent(new CustomEvent($c34afbc43c90cc6f$var$TOOLTIP_OPEN)); - } else providerContext.onClose(); - onOpenChange === null || onOpenChange === void 0 || onOpenChange(open); - } - }); - const stateAttribute = $iVrL9$react.useMemo(() => { - return open1 ? wasOpenDelayedRef.current ? 'delayed-open' : 'instant-open' : 'closed'; - }, [open1]); - const handleOpen = $iVrL9$react.useCallback(() => { - window.clearTimeout(openTimerRef.current); - wasOpenDelayedRef.current = false; - setOpen(true); - }, [setOpen]); - const handleClose = $iVrL9$react.useCallback(() => { - window.clearTimeout(openTimerRef.current); - setOpen(false); - }, [setOpen]); - const handleDelayedOpen = $iVrL9$react.useCallback(() => { - window.clearTimeout(openTimerRef.current); - openTimerRef.current = window.setTimeout(() => { - wasOpenDelayedRef.current = true; - setOpen(true); - }, delayDuration); - }, [delayDuration, setOpen]); - $iVrL9$react.useEffect(() => { - return () => window.clearTimeout(openTimerRef.current); - }, []); - return /*#__PURE__*/$iVrL9$react.createElement($iVrL9$radixuireactpopper.Root, popperScope, /*#__PURE__*/$iVrL9$react.createElement($c34afbc43c90cc6f$var$TooltipContextProvider, { - scope: __scopeTooltip, - contentId: contentId, - open: open1, - stateAttribute: stateAttribute, - trigger: trigger, - onTriggerChange: setTrigger, - onTriggerEnter: $iVrL9$react.useCallback(() => { - if (providerContext.isOpenDelayed) handleDelayedOpen();else handleOpen(); - }, [providerContext.isOpenDelayed, handleDelayedOpen, handleOpen]), - onTriggerLeave: $iVrL9$react.useCallback(() => { - if (disableHoverableContent) handleClose();else - // Clear the timer in case the pointer leaves the trigger before the tooltip is opened. - window.clearTimeout(openTimerRef.current); - }, [handleClose, disableHoverableContent]), - onOpen: handleOpen, - onClose: handleClose, - disableHoverableContent: disableHoverableContent - }, children)); -}; -/*#__PURE__*/ -Object.assign($c34afbc43c90cc6f$export$28c660c63b792dea, { - displayName: $c34afbc43c90cc6f$var$TOOLTIP_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * TooltipTrigger - * -----------------------------------------------------------------------------------------------*/ -const $c34afbc43c90cc6f$var$TRIGGER_NAME = 'TooltipTrigger'; -const $c34afbc43c90cc6f$export$8c610744efcf8a1d = /*#__PURE__*/$iVrL9$react.forwardRef((props, forwardedRef) => { - const { - __scopeTooltip: __scopeTooltip, - ...triggerProps - } = props; - const context = $c34afbc43c90cc6f$var$useTooltipContext($c34afbc43c90cc6f$var$TRIGGER_NAME, __scopeTooltip); - const providerContext = $c34afbc43c90cc6f$var$useTooltipProviderContext($c34afbc43c90cc6f$var$TRIGGER_NAME, __scopeTooltip); - const popperScope = $c34afbc43c90cc6f$var$usePopperScope(__scopeTooltip); - const ref = $iVrL9$react.useRef(null); - const composedRefs = $iVrL9$radixuireactcomposerefs.useComposedRefs(forwardedRef, ref, context.onTriggerChange); - const isPointerDownRef = $iVrL9$react.useRef(false); - const hasPointerMoveOpenedRef = $iVrL9$react.useRef(false); - const handlePointerUp = $iVrL9$react.useCallback(() => isPointerDownRef.current = false, []); - $iVrL9$react.useEffect(() => { - return () => document.removeEventListener('pointerup', handlePointerUp); - }, [handlePointerUp]); - return /*#__PURE__*/$iVrL9$react.createElement($iVrL9$radixuireactpopper.Anchor, $parcel$interopDefault($iVrL9$babelruntimehelpersextends)({ - asChild: true - }, popperScope), /*#__PURE__*/$iVrL9$react.createElement($iVrL9$radixuireactprimitive.Primitive.button, $parcel$interopDefault($iVrL9$babelruntimehelpersextends)({ - // We purposefully avoid adding `type=button` here because tooltip triggers are also - // commonly anchors and the anchor `type` attribute signifies MIME type. - "aria-describedby": context.open ? context.contentId : undefined, - "data-state": context.stateAttribute - }, triggerProps, { - ref: composedRefs, - onPointerMove: $iVrL9$radixuiprimitive.composeEventHandlers(props.onPointerMove, event => { - if (event.pointerType === 'touch') return; - if (!hasPointerMoveOpenedRef.current && !providerContext.isPointerInTransitRef.current) { - context.onTriggerEnter(); - hasPointerMoveOpenedRef.current = true; - } - }), - onPointerLeave: $iVrL9$radixuiprimitive.composeEventHandlers(props.onPointerLeave, () => { - context.onTriggerLeave(); - hasPointerMoveOpenedRef.current = false; - }), - onPointerDown: $iVrL9$radixuiprimitive.composeEventHandlers(props.onPointerDown, () => { - isPointerDownRef.current = true; - document.addEventListener('pointerup', handlePointerUp, { - once: true - }); - }), - onFocus: $iVrL9$radixuiprimitive.composeEventHandlers(props.onFocus, () => { - if (!isPointerDownRef.current) context.onOpen(); - }), - onBlur: $iVrL9$radixuiprimitive.composeEventHandlers(props.onBlur, context.onClose), - onClick: $iVrL9$radixuiprimitive.composeEventHandlers(props.onClick, context.onClose) - }))); -}); -/*#__PURE__*/ -Object.assign($c34afbc43c90cc6f$export$8c610744efcf8a1d, { - displayName: $c34afbc43c90cc6f$var$TRIGGER_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * TooltipPortal - * -----------------------------------------------------------------------------------------------*/ -const $c34afbc43c90cc6f$var$PORTAL_NAME = 'TooltipPortal'; -const [$c34afbc43c90cc6f$var$PortalProvider, $c34afbc43c90cc6f$var$usePortalContext] = $c34afbc43c90cc6f$var$createTooltipContext($c34afbc43c90cc6f$var$PORTAL_NAME, { - forceMount: undefined -}); -const $c34afbc43c90cc6f$export$7b36b8f925ab7497 = props => { - const { - __scopeTooltip: __scopeTooltip, - forceMount: forceMount, - children: children, - container: container - } = props; - const context = $c34afbc43c90cc6f$var$useTooltipContext($c34afbc43c90cc6f$var$PORTAL_NAME, __scopeTooltip); - return /*#__PURE__*/$iVrL9$react.createElement($c34afbc43c90cc6f$var$PortalProvider, { - scope: __scopeTooltip, - forceMount: forceMount - }, /*#__PURE__*/$iVrL9$react.createElement($iVrL9$radixuireactpresence.Presence, { - present: forceMount || context.open - }, /*#__PURE__*/$iVrL9$react.createElement($iVrL9$radixuireactportal.Portal, { - asChild: true, - container: container - }, children))); -}; -/*#__PURE__*/ -Object.assign($c34afbc43c90cc6f$export$7b36b8f925ab7497, { - displayName: $c34afbc43c90cc6f$var$PORTAL_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * TooltipContent - * -----------------------------------------------------------------------------------------------*/ -const $c34afbc43c90cc6f$var$CONTENT_NAME = 'TooltipContent'; -const $c34afbc43c90cc6f$export$e9003e2be37ec060 = /*#__PURE__*/$iVrL9$react.forwardRef((props, forwardedRef) => { - const portalContext = $c34afbc43c90cc6f$var$usePortalContext($c34afbc43c90cc6f$var$CONTENT_NAME, props.__scopeTooltip); - const { - forceMount = portalContext.forceMount, - side = 'top', - ...contentProps - } = props; - const context = $c34afbc43c90cc6f$var$useTooltipContext($c34afbc43c90cc6f$var$CONTENT_NAME, props.__scopeTooltip); - return /*#__PURE__*/$iVrL9$react.createElement($iVrL9$radixuireactpresence.Presence, { - present: forceMount || context.open - }, context.disableHoverableContent ? /*#__PURE__*/$iVrL9$react.createElement($c34afbc43c90cc6f$var$TooltipContentImpl, $parcel$interopDefault($iVrL9$babelruntimehelpersextends)({ - side: side - }, contentProps, { - ref: forwardedRef - })) : /*#__PURE__*/$iVrL9$react.createElement($c34afbc43c90cc6f$var$TooltipContentHoverable, $parcel$interopDefault($iVrL9$babelruntimehelpersextends)({ - side: side - }, contentProps, { - ref: forwardedRef - }))); -}); -const $c34afbc43c90cc6f$var$TooltipContentHoverable = /*#__PURE__*/$iVrL9$react.forwardRef((props, forwardedRef) => { - const context = $c34afbc43c90cc6f$var$useTooltipContext($c34afbc43c90cc6f$var$CONTENT_NAME, props.__scopeTooltip); - const providerContext = $c34afbc43c90cc6f$var$useTooltipProviderContext($c34afbc43c90cc6f$var$CONTENT_NAME, props.__scopeTooltip); - const ref = $iVrL9$react.useRef(null); - const composedRefs = $iVrL9$radixuireactcomposerefs.useComposedRefs(forwardedRef, ref); - const [pointerGraceArea, setPointerGraceArea] = $iVrL9$react.useState(null); - const { - trigger: trigger, - onClose: onClose - } = context; - const content = ref.current; - const { - onPointerInTransitChange: onPointerInTransitChange - } = providerContext; - const handleRemoveGraceArea = $iVrL9$react.useCallback(() => { - setPointerGraceArea(null); - onPointerInTransitChange(false); - }, [onPointerInTransitChange]); - const handleCreateGraceArea = $iVrL9$react.useCallback((event, hoverTarget) => { - const currentTarget = event.currentTarget; - const exitPoint = { - x: event.clientX, - y: event.clientY - }; - const exitSide = $c34afbc43c90cc6f$var$getExitSideFromRect(exitPoint, currentTarget.getBoundingClientRect()); - const paddedExitPoints = $c34afbc43c90cc6f$var$getPaddedExitPoints(exitPoint, exitSide); - const hoverTargetPoints = $c34afbc43c90cc6f$var$getPointsFromRect(hoverTarget.getBoundingClientRect()); - const graceArea = $c34afbc43c90cc6f$var$getHull([...paddedExitPoints, ...hoverTargetPoints]); - setPointerGraceArea(graceArea); - onPointerInTransitChange(true); - }, [onPointerInTransitChange]); - $iVrL9$react.useEffect(() => { - return () => handleRemoveGraceArea(); - }, [handleRemoveGraceArea]); - $iVrL9$react.useEffect(() => { - if (trigger && content) { - const handleTriggerLeave = event => handleCreateGraceArea(event, content); - const handleContentLeave = event => handleCreateGraceArea(event, trigger); - trigger.addEventListener('pointerleave', handleTriggerLeave); - content.addEventListener('pointerleave', handleContentLeave); - return () => { - trigger.removeEventListener('pointerleave', handleTriggerLeave); - content.removeEventListener('pointerleave', handleContentLeave); - }; - } - }, [trigger, content, handleCreateGraceArea, handleRemoveGraceArea]); - $iVrL9$react.useEffect(() => { - if (pointerGraceArea) { - const handleTrackPointerGrace = event => { - const target = event.target; - const pointerPosition = { - x: event.clientX, - y: event.clientY - }; - const hasEnteredTarget = (trigger === null || trigger === void 0 ? void 0 : trigger.contains(target)) || (content === null || content === void 0 ? void 0 : content.contains(target)); - const isPointerOutsideGraceArea = !$c34afbc43c90cc6f$var$isPointInPolygon(pointerPosition, pointerGraceArea); - if (hasEnteredTarget) handleRemoveGraceArea();else if (isPointerOutsideGraceArea) { - handleRemoveGraceArea(); - onClose(); - } - }; - document.addEventListener('pointermove', handleTrackPointerGrace); - return () => document.removeEventListener('pointermove', handleTrackPointerGrace); - } - }, [trigger, content, pointerGraceArea, onClose, handleRemoveGraceArea]); - return /*#__PURE__*/$iVrL9$react.createElement($c34afbc43c90cc6f$var$TooltipContentImpl, $parcel$interopDefault($iVrL9$babelruntimehelpersextends)({}, props, { - ref: composedRefs - })); -}); -const [$c34afbc43c90cc6f$var$VisuallyHiddenContentContextProvider, $c34afbc43c90cc6f$var$useVisuallyHiddenContentContext] = $c34afbc43c90cc6f$var$createTooltipContext($c34afbc43c90cc6f$var$TOOLTIP_NAME, { - isInside: false -}); -const $c34afbc43c90cc6f$var$TooltipContentImpl = /*#__PURE__*/$iVrL9$react.forwardRef((props, forwardedRef) => { - const { - __scopeTooltip: __scopeTooltip, - children: children, - 'aria-label': ariaLabel, - onEscapeKeyDown: onEscapeKeyDown, - onPointerDownOutside: onPointerDownOutside, - ...contentProps - } = props; - const context = $c34afbc43c90cc6f$var$useTooltipContext($c34afbc43c90cc6f$var$CONTENT_NAME, __scopeTooltip); - const popperScope = $c34afbc43c90cc6f$var$usePopperScope(__scopeTooltip); - const { - onClose: onClose - } = context; // Close this tooltip if another one opens - $iVrL9$react.useEffect(() => { - document.addEventListener($c34afbc43c90cc6f$var$TOOLTIP_OPEN, onClose); - return () => document.removeEventListener($c34afbc43c90cc6f$var$TOOLTIP_OPEN, onClose); - }, [onClose]); // Close the tooltip if the trigger is scrolled - $iVrL9$react.useEffect(() => { - if (context.trigger) { - const handleScroll = event => { - const target = event.target; - if (target !== null && target !== void 0 && target.contains(context.trigger)) onClose(); - }; - window.addEventListener('scroll', handleScroll, { - capture: true - }); - return () => window.removeEventListener('scroll', handleScroll, { - capture: true - }); - } - }, [context.trigger, onClose]); - return /*#__PURE__*/$iVrL9$react.createElement($iVrL9$radixuireactdismissablelayer.DismissableLayer, { - asChild: true, - disableOutsidePointerEvents: false, - onEscapeKeyDown: onEscapeKeyDown, - onPointerDownOutside: onPointerDownOutside, - onFocusOutside: event => event.preventDefault(), - onDismiss: onClose - }, /*#__PURE__*/$iVrL9$react.createElement($iVrL9$radixuireactpopper.Content, $parcel$interopDefault($iVrL9$babelruntimehelpersextends)({ - "data-state": context.stateAttribute - }, popperScope, contentProps, { - ref: forwardedRef, - style: { - ...contentProps.style, - '--radix-tooltip-content-transform-origin': 'var(--radix-popper-transform-origin)', - '--radix-tooltip-content-available-width': 'var(--radix-popper-available-width)', - '--radix-tooltip-content-available-height': 'var(--radix-popper-available-height)', - '--radix-tooltip-trigger-width': 'var(--radix-popper-anchor-width)', - '--radix-tooltip-trigger-height': 'var(--radix-popper-anchor-height)' - } - }), /*#__PURE__*/$iVrL9$react.createElement($iVrL9$radixuireactslot.Slottable, null, children), /*#__PURE__*/$iVrL9$react.createElement($c34afbc43c90cc6f$var$VisuallyHiddenContentContextProvider, { - scope: __scopeTooltip, - isInside: true - }, /*#__PURE__*/$iVrL9$react.createElement($iVrL9$radixuireactvisuallyhidden.Root, { - id: context.contentId, - role: "tooltip" - }, ariaLabel || children)))); -}); -/*#__PURE__*/ -Object.assign($c34afbc43c90cc6f$export$e9003e2be37ec060, { - displayName: $c34afbc43c90cc6f$var$CONTENT_NAME -}); -/* ------------------------------------------------------------------------------------------------- - * TooltipArrow - * -----------------------------------------------------------------------------------------------*/ -const $c34afbc43c90cc6f$var$ARROW_NAME = 'TooltipArrow'; -const $c34afbc43c90cc6f$export$c27ee0ad710f7559 = /*#__PURE__*/$iVrL9$react.forwardRef((props, forwardedRef) => { - const { - __scopeTooltip: __scopeTooltip, - ...arrowProps - } = props; - const popperScope = $c34afbc43c90cc6f$var$usePopperScope(__scopeTooltip); - const visuallyHiddenContentContext = $c34afbc43c90cc6f$var$useVisuallyHiddenContentContext($c34afbc43c90cc6f$var$ARROW_NAME, __scopeTooltip); // if the arrow is inside the `VisuallyHidden`, we don't want to render it all to - // prevent issues in positioning the arrow due to the duplicate - return visuallyHiddenContentContext.isInside ? null : /*#__PURE__*/$iVrL9$react.createElement($iVrL9$radixuireactpopper.Arrow, $parcel$interopDefault($iVrL9$babelruntimehelpersextends)({}, popperScope, arrowProps, { - ref: forwardedRef - })); -}); -/*#__PURE__*/ -Object.assign($c34afbc43c90cc6f$export$c27ee0ad710f7559, { - displayName: $c34afbc43c90cc6f$var$ARROW_NAME -}); -/* -----------------------------------------------------------------------------------------------*/ -function $c34afbc43c90cc6f$var$getExitSideFromRect(point, rect) { - const top = Math.abs(rect.top - point.y); - const bottom = Math.abs(rect.bottom - point.y); - const right = Math.abs(rect.right - point.x); - const left = Math.abs(rect.left - point.x); - switch (Math.min(top, bottom, right, left)) { - case left: - return 'left'; - case right: - return 'right'; - case top: - return 'top'; - case bottom: - return 'bottom'; - default: - throw new Error('unreachable'); - } -} -function $c34afbc43c90cc6f$var$getPaddedExitPoints(exitPoint, exitSide) { - let padding = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 5; - const paddedExitPoints = []; - switch (exitSide) { - case 'top': - paddedExitPoints.push({ - x: exitPoint.x - padding, - y: exitPoint.y + padding - }, { - x: exitPoint.x + padding, - y: exitPoint.y + padding - }); - break; - case 'bottom': - paddedExitPoints.push({ - x: exitPoint.x - padding, - y: exitPoint.y - padding - }, { - x: exitPoint.x + padding, - y: exitPoint.y - padding - }); - break; - case 'left': - paddedExitPoints.push({ - x: exitPoint.x + padding, - y: exitPoint.y - padding - }, { - x: exitPoint.x + padding, - y: exitPoint.y + padding - }); - break; - case 'right': - paddedExitPoints.push({ - x: exitPoint.x - padding, - y: exitPoint.y - padding - }, { - x: exitPoint.x - padding, - y: exitPoint.y + padding - }); - break; - } - return paddedExitPoints; -} -function $c34afbc43c90cc6f$var$getPointsFromRect(rect) { - const { - top: top, - right: right, - bottom: bottom, - left: left - } = rect; - return [{ - x: left, - y: top - }, { - x: right, - y: top - }, { - x: right, - y: bottom - }, { - x: left, - y: bottom - }]; -} // Determine if a point is inside of a polygon. -// Based on https://github.com/substack/point-in-polygon -function $c34afbc43c90cc6f$var$isPointInPolygon(point, polygon) { - const { - x: x, - y: y - } = point; - let inside = false; - for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) { - const xi = polygon[i].x; - const yi = polygon[i].y; - const xj = polygon[j].x; - const yj = polygon[j].y; // prettier-ignore - const intersect = yi > y !== yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi; - if (intersect) inside = !inside; - } - return inside; -} // Returns a new array of points representing the convex hull of the given set of points. -// https://www.nayuki.io/page/convex-hull-algorithm -function $c34afbc43c90cc6f$var$getHull(points) { - const newPoints = points.slice(); - newPoints.sort((a, b) => { - if (a.x < b.x) return -1;else if (a.x > b.x) return 1;else if (a.y < b.y) return -1;else if (a.y > b.y) return 1;else return 0; - }); - return $c34afbc43c90cc6f$var$getHullPresorted(newPoints); -} // Returns the convex hull, assuming that each points[i] <= points[i + 1]. Runs in O(n) time. -function $c34afbc43c90cc6f$var$getHullPresorted(points) { - if (points.length <= 1) return points.slice(); - const upperHull = []; - for (let i = 0; i < points.length; i++) { - const p = points[i]; - while (upperHull.length >= 2) { - const q = upperHull[upperHull.length - 1]; - const r = upperHull[upperHull.length - 2]; - if ((q.x - r.x) * (p.y - r.y) >= (q.y - r.y) * (p.x - r.x)) upperHull.pop();else break; - } - upperHull.push(p); - } - upperHull.pop(); - const lowerHull = []; - for (let i1 = points.length - 1; i1 >= 0; i1--) { - const p = points[i1]; - while (lowerHull.length >= 2) { - const q = lowerHull[lowerHull.length - 1]; - const r = lowerHull[lowerHull.length - 2]; - if ((q.x - r.x) * (p.y - r.y) >= (q.y - r.y) * (p.x - r.x)) lowerHull.pop();else break; - } - lowerHull.push(p); - } - lowerHull.pop(); - if (upperHull.length === 1 && lowerHull.length === 1 && upperHull[0].x === lowerHull[0].x && upperHull[0].y === lowerHull[0].y) return upperHull;else return upperHull.concat(lowerHull); -} -const $c34afbc43c90cc6f$export$2881499e37b75b9a = $c34afbc43c90cc6f$export$f78649fb9ca566b8; -const $c34afbc43c90cc6f$export$be92b6f5f03c0fe9 = $c34afbc43c90cc6f$export$28c660c63b792dea; -const $c34afbc43c90cc6f$export$41fb9f06171c75f4 = $c34afbc43c90cc6f$export$8c610744efcf8a1d; -const $c34afbc43c90cc6f$export$602eac185826482c = $c34afbc43c90cc6f$export$7b36b8f925ab7497; -const $c34afbc43c90cc6f$export$7c6e2c02157bb7d2 = $c34afbc43c90cc6f$export$e9003e2be37ec060; -const $c34afbc43c90cc6f$export$21b07c8f274aebd5 = $c34afbc43c90cc6f$export$c27ee0ad710f7559; - -/***/ }), - -/***/ "../../../node_modules/@radix-ui/react-use-callback-ref/dist/index.js": -/*!****************************************************************************!*\ - !*** ../../../node_modules/@radix-ui/react-use-callback-ref/dist/index.js ***! - \****************************************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - - -var $92muK$react = __webpack_require__(/*! react */ "react"); -function $parcel$export(e, n, v, s) { - Object.defineProperty(e, n, { - get: v, - set: s, - enumerable: true, - configurable: true - }); -} -$parcel$export(module.exports, "useCallbackRef", () => $28e03942f763e819$export$25bec8c6f54ee79a); - -/** - * A custom hook that converts a callback to a ref to avoid triggering re-renders when passed as a - * prop or avoid re-executing effects when passed as a dependency - */ -function $28e03942f763e819$export$25bec8c6f54ee79a(callback) { - const callbackRef = $92muK$react.useRef(callback); - $92muK$react.useEffect(() => { - callbackRef.current = callback; - }); // https://github.com/facebook/react/issues/19240 - return $92muK$react.useMemo(() => function () { - var _callbackRef$current; - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - return (_callbackRef$current = callbackRef.current) === null || _callbackRef$current === void 0 ? void 0 : _callbackRef$current.call(callbackRef, ...args); - }, []); -} - -/***/ }), - -/***/ "../../../node_modules/@radix-ui/react-use-controllable-state/dist/index.js": -/*!**********************************************************************************!*\ - !*** ../../../node_modules/@radix-ui/react-use-controllable-state/dist/index.js ***! - \**********************************************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - - -var $ijazI$react = __webpack_require__(/*! react */ "react"); -var $ijazI$radixuireactusecallbackref = __webpack_require__(/*! @radix-ui/react-use-callback-ref */ "../../../node_modules/@radix-ui/react-use-callback-ref/dist/index.js"); -function $parcel$export(e, n, v, s) { - Object.defineProperty(e, n, { - get: v, - set: s, - enumerable: true, - configurable: true - }); -} -$parcel$export(module.exports, "useControllableState", () => $b84d42d44371bff7$export$6f32135080cb4c3); -function $b84d42d44371bff7$export$6f32135080cb4c3(_ref) { - let { - prop: prop, - defaultProp: defaultProp, - onChange = () => {} - } = _ref; - const [uncontrolledProp, setUncontrolledProp] = $b84d42d44371bff7$var$useUncontrolledState({ - defaultProp: defaultProp, - onChange: onChange - }); - const isControlled = prop !== undefined; - const value1 = isControlled ? prop : uncontrolledProp; - const handleChange = $ijazI$radixuireactusecallbackref.useCallbackRef(onChange); - const setValue = $ijazI$react.useCallback(nextValue => { - if (isControlled) { - const setter = nextValue; - const value = typeof nextValue === 'function' ? setter(prop) : nextValue; - if (value !== prop) handleChange(value); - } else setUncontrolledProp(nextValue); - }, [isControlled, prop, setUncontrolledProp, handleChange]); - return [value1, setValue]; -} -function $b84d42d44371bff7$var$useUncontrolledState(_ref2) { - let { - defaultProp: defaultProp, - onChange: onChange - } = _ref2; - const uncontrolledState = $ijazI$react.useState(defaultProp); - const [value] = uncontrolledState; - const prevValueRef = $ijazI$react.useRef(value); - const handleChange = $ijazI$radixuireactusecallbackref.useCallbackRef(onChange); - $ijazI$react.useEffect(() => { - if (prevValueRef.current !== value) { - handleChange(value); - prevValueRef.current = value; - } - }, [value, prevValueRef, handleChange]); - return uncontrolledState; -} - -/***/ }), - -/***/ "../../../node_modules/@radix-ui/react-use-escape-keydown/dist/index.js": -/*!******************************************************************************!*\ - !*** ../../../node_modules/@radix-ui/react-use-escape-keydown/dist/index.js ***! - \******************************************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - - -var $b0gz3$react = __webpack_require__(/*! react */ "react"); -var $b0gz3$radixuireactusecallbackref = __webpack_require__(/*! @radix-ui/react-use-callback-ref */ "../../../node_modules/@radix-ui/react-use-callback-ref/dist/index.js"); -function $parcel$export(e, n, v, s) { - Object.defineProperty(e, n, { - get: v, - set: s, - enumerable: true, - configurable: true - }); -} -$parcel$export(module.exports, "useEscapeKeydown", () => $24c84e9f83c4454f$export$3a72a57244d6e765); - -/** - * Listens for when the escape key is down - */ -function $24c84e9f83c4454f$export$3a72a57244d6e765(onEscapeKeyDownProp) { - let ownerDocument = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : globalThis === null || globalThis === void 0 ? void 0 : globalThis.document; - const onEscapeKeyDown = $b0gz3$radixuireactusecallbackref.useCallbackRef(onEscapeKeyDownProp); - $b0gz3$react.useEffect(() => { - const handleKeyDown = event => { - if (event.key === 'Escape') onEscapeKeyDown(event); - }; - ownerDocument.addEventListener('keydown', handleKeyDown); - return () => ownerDocument.removeEventListener('keydown', handleKeyDown); - }, [onEscapeKeyDown, ownerDocument]); -} - -/***/ }), - -/***/ "../../../node_modules/@radix-ui/react-use-layout-effect/dist/index.js": -/*!*****************************************************************************!*\ - !*** ../../../node_modules/@radix-ui/react-use-layout-effect/dist/index.js ***! - \*****************************************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - - -var $caHyQ$react = __webpack_require__(/*! react */ "react"); -function $parcel$export(e, n, v, s) { - Object.defineProperty(e, n, { - get: v, - set: s, - enumerable: true, - configurable: true - }); -} -$parcel$export(module.exports, "useLayoutEffect", () => $ca21affb0542a8a4$export$e5c5a5f917a5871c); - -/** - * On the server, React emits a warning when calling `useLayoutEffect`. - * This is because neither `useLayoutEffect` nor `useEffect` run on the server. - * We use this safe version which suppresses the warning by replacing it with a noop on the server. - * - * See: https://reactjs.org/docs/hooks-reference.html#uselayouteffect - */ -const $ca21affb0542a8a4$export$e5c5a5f917a5871c = Boolean(globalThis === null || globalThis === void 0 ? void 0 : globalThis.document) ? $caHyQ$react.useLayoutEffect : () => {}; - -/***/ }), - -/***/ "../../../node_modules/@radix-ui/react-use-size/dist/index.js": -/*!********************************************************************!*\ - !*** ../../../node_modules/@radix-ui/react-use-size/dist/index.js ***! - \********************************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - - -var $ksDzM$react = __webpack_require__(/*! react */ "react"); -var $ksDzM$radixuireactuselayouteffect = __webpack_require__(/*! @radix-ui/react-use-layout-effect */ "../../../node_modules/@radix-ui/react-use-layout-effect/dist/index.js"); -function $parcel$export(e, n, v, s) { - Object.defineProperty(e, n, { - get: v, - set: s, - enumerable: true, - configurable: true - }); -} -$parcel$export(module.exports, "useSize", () => $d2c1d285af17635b$export$1ab7ae714698c4b8); -function $d2c1d285af17635b$export$1ab7ae714698c4b8(element) { - const [size, setSize] = $ksDzM$react.useState(undefined); - $ksDzM$radixuireactuselayouteffect.useLayoutEffect(() => { - if (element) { - // provide size as early as possible - setSize({ - width: element.offsetWidth, - height: element.offsetHeight - }); - const resizeObserver = new ResizeObserver(entries => { - if (!Array.isArray(entries)) return; - // Since we only observe the one element, we don't need to loop over the - // array - if (!entries.length) return; - const entry = entries[0]; - let width; - let height; - if ('borderBoxSize' in entry) { - const borderSizeEntry = entry['borderBoxSize']; // iron out differences between browsers - const borderSize = Array.isArray(borderSizeEntry) ? borderSizeEntry[0] : borderSizeEntry; - width = borderSize['inlineSize']; - height = borderSize['blockSize']; - } else { - // for browsers that don't support `borderBoxSize` - // we calculate it ourselves to get the correct border box. - width = element.offsetWidth; - height = element.offsetHeight; - } - setSize({ - width: width, - height: height - }); - }); - resizeObserver.observe(element, { - box: 'border-box' - }); - return () => resizeObserver.unobserve(element); - } else - // We only want to reset to `undefined` when the element becomes `null`, - // not if it changes to another element. - setSize(undefined); - }, [element]); - return size; -} - -/***/ }), - -/***/ "../../../node_modules/@radix-ui/react-visually-hidden/dist/index.js": -/*!***************************************************************************!*\ - !*** ../../../node_modules/@radix-ui/react-visually-hidden/dist/index.js ***! - \***************************************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - - -var $awrN2$babelruntimehelpersextends = __webpack_require__(/*! @babel/runtime/helpers/extends */ "../../../node_modules/@babel/runtime/helpers/extends.js"); -var $awrN2$react = __webpack_require__(/*! react */ "react"); -var $awrN2$radixuireactprimitive = __webpack_require__(/*! @radix-ui/react-primitive */ "../../../node_modules/@radix-ui/react-primitive/dist/index.js"); -function $parcel$export(e, n, v, s) { - Object.defineProperty(e, n, { - get: v, - set: s, - enumerable: true, - configurable: true - }); -} -function $parcel$interopDefault(a) { - return a && a.__esModule ? a.default : a; -} -$parcel$export(module.exports, "VisuallyHidden", () => $685371e9c20848e2$export$439d29a4e110a164); -$parcel$export(module.exports, "Root", () => $685371e9c20848e2$export$be92b6f5f03c0fe9); - -/* ------------------------------------------------------------------------------------------------- - * VisuallyHidden - * -----------------------------------------------------------------------------------------------*/ -const $685371e9c20848e2$var$NAME = 'VisuallyHidden'; -const $685371e9c20848e2$export$439d29a4e110a164 = /*#__PURE__*/$awrN2$react.forwardRef((props, forwardedRef) => { - return /*#__PURE__*/$awrN2$react.createElement($awrN2$radixuireactprimitive.Primitive.span, $parcel$interopDefault($awrN2$babelruntimehelpersextends)({}, props, { - ref: forwardedRef, - style: { - // See: https://github.com/twbs/bootstrap/blob/master/scss/mixins/_screen-reader.scss - position: 'absolute', - border: 0, - width: 1, - height: 1, - padding: 0, - margin: -1, - overflow: 'hidden', - clip: 'rect(0, 0, 0, 0)', - whiteSpace: 'nowrap', - wordWrap: 'normal', - ...props.style - } - })); -}); -/*#__PURE__*/ -Object.assign($685371e9c20848e2$export$439d29a4e110a164, { - displayName: $685371e9c20848e2$var$NAME -}); -/* -----------------------------------------------------------------------------------------------*/ -const $685371e9c20848e2$export$be92b6f5f03c0fe9 = $685371e9c20848e2$export$439d29a4e110a164; - -/***/ }), - -/***/ "../../../node_modules/aria-hidden/dist/es2015/index.js": -/*!**************************************************************!*\ - !*** ../../../node_modules/aria-hidden/dist/es2015/index.js ***! - \**************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.suppressOthers = exports.supportsInert = exports.inertOthers = exports.hideOthers = void 0; -var getDefaultParent = function (originalTarget) { - if (typeof document === 'undefined') { - return null; - } - var sampleTarget = Array.isArray(originalTarget) ? originalTarget[0] : originalTarget; - return sampleTarget.ownerDocument.body; -}; -var counterMap = new WeakMap(); -var uncontrolledNodes = new WeakMap(); -var markerMap = {}; -var lockCount = 0; -var unwrapHost = function (node) { - return node && (node.host || unwrapHost(node.parentNode)); -}; -var correctTargets = function (parent, targets) { - return targets.map(function (target) { - if (parent.contains(target)) { - return target; - } - var correctedTarget = unwrapHost(target); - if (correctedTarget && parent.contains(correctedTarget)) { - return correctedTarget; - } - console.error('aria-hidden', target, 'in not contained inside', parent, '. Doing nothing'); - return null; - }).filter(function (x) { - return Boolean(x); - }); -}; -/** - * Marks everything except given node(or nodes) as aria-hidden - * @param {Element | Element[]} originalTarget - elements to keep on the page - * @param [parentNode] - top element, defaults to document.body - * @param {String} [markerName] - a special attribute to mark every node - * @param {String} [controlAttribute] - html Attribute to control - * @return {Undo} undo command - */ -var applyAttributeToOthers = function (originalTarget, parentNode, markerName, controlAttribute) { - var targets = correctTargets(parentNode, Array.isArray(originalTarget) ? originalTarget : [originalTarget]); - if (!markerMap[markerName]) { - markerMap[markerName] = new WeakMap(); - } - var markerCounter = markerMap[markerName]; - var hiddenNodes = []; - var elementsToKeep = new Set(); - var elementsToStop = new Set(targets); - var keep = function (el) { - if (!el || elementsToKeep.has(el)) { - return; - } - elementsToKeep.add(el); - keep(el.parentNode); - }; - targets.forEach(keep); - var deep = function (parent) { - if (!parent || elementsToStop.has(parent)) { - return; - } - Array.prototype.forEach.call(parent.children, function (node) { - if (elementsToKeep.has(node)) { - deep(node); - } else { - var attr = node.getAttribute(controlAttribute); - var alreadyHidden = attr !== null && attr !== 'false'; - var counterValue = (counterMap.get(node) || 0) + 1; - var markerValue = (markerCounter.get(node) || 0) + 1; - counterMap.set(node, counterValue); - markerCounter.set(node, markerValue); - hiddenNodes.push(node); - if (counterValue === 1 && alreadyHidden) { - uncontrolledNodes.set(node, true); - } - if (markerValue === 1) { - node.setAttribute(markerName, 'true'); - } - if (!alreadyHidden) { - node.setAttribute(controlAttribute, 'true'); - } - } - }); - }; - deep(parentNode); - elementsToKeep.clear(); - lockCount++; - return function () { - hiddenNodes.forEach(function (node) { - var counterValue = counterMap.get(node) - 1; - var markerValue = markerCounter.get(node) - 1; - counterMap.set(node, counterValue); - markerCounter.set(node, markerValue); - if (!counterValue) { - if (!uncontrolledNodes.has(node)) { - node.removeAttribute(controlAttribute); - } - uncontrolledNodes.delete(node); - } - if (!markerValue) { - node.removeAttribute(markerName); - } - }); - lockCount--; - if (!lockCount) { - // clear - counterMap = new WeakMap(); - counterMap = new WeakMap(); - uncontrolledNodes = new WeakMap(); - markerMap = {}; - } - }; -}; -/** - * Marks everything except given node(or nodes) as aria-hidden - * @param {Element | Element[]} originalTarget - elements to keep on the page - * @param [parentNode] - top element, defaults to document.body - * @param {String} [markerName] - a special attribute to mark every node - * @return {Undo} undo command - */ -var hideOthers = function (originalTarget, parentNode, markerName) { - if (markerName === void 0) { - markerName = 'data-aria-hidden'; - } - var targets = Array.from(Array.isArray(originalTarget) ? originalTarget : [originalTarget]); - var activeParentNode = parentNode || getDefaultParent(originalTarget); - if (!activeParentNode) { - return function () { - return null; - }; - } - // we should not hide ariaLive elements - https://github.com/theKashey/aria-hidden/issues/10 - targets.push.apply(targets, Array.from(activeParentNode.querySelectorAll('[aria-live]'))); - return applyAttributeToOthers(targets, activeParentNode, markerName, 'aria-hidden'); -}; -/** - * Marks everything except given node(or nodes) as inert - * @param {Element | Element[]} originalTarget - elements to keep on the page - * @param [parentNode] - top element, defaults to document.body - * @param {String} [markerName] - a special attribute to mark every node - * @return {Undo} undo command - */ -exports.hideOthers = hideOthers; -var inertOthers = function (originalTarget, parentNode, markerName) { - if (markerName === void 0) { - markerName = 'data-inert-ed'; - } - var activeParentNode = parentNode || getDefaultParent(originalTarget); - if (!activeParentNode) { - return function () { - return null; - }; - } - return applyAttributeToOthers(originalTarget, activeParentNode, markerName, 'inert'); -}; -/** - * @returns if current browser supports inert - */ -exports.inertOthers = inertOthers; -var supportsInert = function () { - return typeof HTMLElement !== 'undefined' && HTMLElement.prototype.hasOwnProperty('inert'); -}; -/** - * Automatic function to "suppress" DOM elements - _hide_ or _inert_ in the best possible way - * @param {Element | Element[]} originalTarget - elements to keep on the page - * @param [parentNode] - top element, defaults to document.body - * @param {String} [markerName] - a special attribute to mark every node - * @return {Undo} undo command - */ -exports.supportsInert = supportsInert; -var suppressOthers = function (originalTarget, parentNode, markerName) { - if (markerName === void 0) { - markerName = 'data-suppressed'; - } - return (supportsInert() ? inertOthers : hideOthers)(originalTarget, parentNode, markerName); -}; -exports.suppressOthers = suppressOthers; - -/***/ }), - -/***/ "../../../node_modules/clsx/dist/clsx.m.js": -/*!*************************************************!*\ - !*** ../../../node_modules/clsx/dist/clsx.m.js ***! - \*************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.clsx = clsx; -exports["default"] = void 0; -function r(e) { - var t, - f, - n = ""; - if ("string" == typeof e || "number" == typeof e) n += e;else if ("object" == typeof e) if (Array.isArray(e)) for (t = 0; t < e.length; t++) e[t] && (f = r(e[t])) && (n && (n += " "), n += f);else for (t in e) e[t] && (n && (n += " "), n += t); - return n; -} -function clsx() { - for (var e, t, f = 0, n = ""; f < arguments.length;) (e = arguments[f++]) && (t = r(e)) && (n && (n += " "), n += t); - return n; -} -var _default = clsx; -exports["default"] = _default; - -/***/ }), - -/***/ "../../../node_modules/copy-to-clipboard/index.js": -/*!********************************************************!*\ - !*** ../../../node_modules/copy-to-clipboard/index.js ***! - \********************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - - -var deselectCurrent = __webpack_require__(/*! toggle-selection */ "../../../node_modules/toggle-selection/index.js"); -var clipboardToIE11Formatting = { - "text/plain": "Text", - "text/html": "Url", - "default": "Text" -}; -var defaultMessage = "Copy to clipboard: #{key}, Enter"; -function format(message) { - var copyKey = (/mac os x/i.test(navigator.userAgent) ? "⌘" : "Ctrl") + "+C"; - return message.replace(/#{\s*key\s*}/g, copyKey); -} -function copy(text, options) { - var debug, - message, - reselectPrevious, - range, - selection, - mark, - success = false; - if (!options) { - options = {}; - } - debug = options.debug || false; - try { - reselectPrevious = deselectCurrent(); - range = document.createRange(); - selection = document.getSelection(); - mark = document.createElement("span"); - mark.textContent = text; - // avoid screen readers from reading out loud the text - mark.ariaHidden = "true"; - // reset user styles for span element - mark.style.all = "unset"; - // prevents scrolling to the end of the page - mark.style.position = "fixed"; - mark.style.top = 0; - mark.style.clip = "rect(0, 0, 0, 0)"; - // used to preserve spaces and line breaks - mark.style.whiteSpace = "pre"; - // do not inherit user-select (it may be `none`) - mark.style.webkitUserSelect = "text"; - mark.style.MozUserSelect = "text"; - mark.style.msUserSelect = "text"; - mark.style.userSelect = "text"; - mark.addEventListener("copy", function (e) { - e.stopPropagation(); - if (options.format) { - e.preventDefault(); - if (typeof e.clipboardData === "undefined") { - // IE 11 - debug && console.warn("unable to use e.clipboardData"); - debug && console.warn("trying IE specific stuff"); - window.clipboardData.clearData(); - var format = clipboardToIE11Formatting[options.format] || clipboardToIE11Formatting["default"]; - window.clipboardData.setData(format, text); - } else { - // all other browsers - e.clipboardData.clearData(); - e.clipboardData.setData(options.format, text); - } - } - if (options.onCopy) { - e.preventDefault(); - options.onCopy(e.clipboardData); - } - }); - document.body.appendChild(mark); - range.selectNodeContents(mark); - selection.addRange(range); - var successful = document.execCommand("copy"); - if (!successful) { - throw new Error("copy command was unsuccessful"); - } - success = true; - } catch (err) { - debug && console.error("unable to copy using execCommand: ", err); - debug && console.warn("trying IE specific stuff"); - try { - window.clipboardData.setData(options.format || "text", text); - options.onCopy && options.onCopy(window.clipboardData); - success = true; - } catch (err) { - debug && console.error("unable to copy using clipboardData: ", err); - debug && console.error("falling back to prompt"); - message = format("message" in options ? options.message : defaultMessage); - window.prompt(message, text); - } - } finally { - if (selection) { - if (typeof selection.removeRange == "function") { - selection.removeRange(range); - } else { - selection.removeAllRanges(); - } - } - if (mark) { - document.body.removeChild(mark); - } - reselectPrevious(); - } - return success; -} -module.exports = copy; - -/***/ }), - -/***/ "../../../node_modules/detect-node-es/esm/browser.js": -/*!***********************************************************!*\ - !*** ../../../node_modules/detect-node-es/esm/browser.js ***! - \***********************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.isNode = void 0; -const isNode = false; -exports.isNode = isNode; - -/***/ }), - -/***/ "../../../node_modules/framer-motion/dist/cjs/index.js": -/*!*************************************************************!*\ - !*** ../../../node_modules/framer-motion/dist/cjs/index.js ***! - \*************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -var tslib = __webpack_require__(/*! tslib */ "../../../node_modules/tslib/tslib.es6.js"); -var React = __webpack_require__(/*! react */ "react"); -var heyListen = __webpack_require__(/*! hey-listen */ "../../../node_modules/hey-listen/dist/hey-listen.es.js"); -var styleValueTypes = __webpack_require__(/*! style-value-types */ "../../../node_modules/style-value-types/dist/valueTypes.cjs.js"); -var popmotion = __webpack_require__(/*! popmotion */ "../../../node_modules/popmotion/dist/popmotion.cjs.js"); -var sync = __webpack_require__(/*! framesync */ "../../../node_modules/framesync/dist/framesync.cjs.js"); -var dom = __webpack_require__(/*! @motionone/dom */ "../../../node_modules/@motionone/dom/dist/index.es.js"); -function _interopDefaultLegacy(e) { - return e && typeof e === 'object' && 'default' in e ? e : { - 'default': e - }; -} -function _interopNamespace(e) { - if (e && e.__esModule) return e; - var n = Object.create(null); - if (e) { - Object.keys(e).forEach(function (k) { - if (k !== 'default') { - var d = Object.getOwnPropertyDescriptor(e, k); - Object.defineProperty(n, k, d.get ? d : { - enumerable: true, - get: function () { - return e[k]; - } - }); - } - }); - } - n["default"] = e; - return Object.freeze(n); -} -var React__namespace = /*#__PURE__*/_interopNamespace(React); -var React__default = /*#__PURE__*/_interopDefaultLegacy(React); -var sync__default = /*#__PURE__*/_interopDefaultLegacy(sync); - -/** - * Browser-safe usage of process - */ -var defaultEnvironment = "production"; -var env = typeof process === "undefined" || process.env === undefined ? defaultEnvironment : "development" || 0; -var createDefinition = function (propNames) { - return { - isEnabled: function (props) { - return propNames.some(function (name) { - return !!props[name]; - }); - } - }; -}; -var featureDefinitions = { - measureLayout: createDefinition(["layout", "layoutId", "drag"]), - animation: createDefinition(["animate", "exit", "variants", "whileHover", "whileTap", "whileFocus", "whileDrag", "whileInView"]), - exit: createDefinition(["exit"]), - drag: createDefinition(["drag", "dragControls"]), - focus: createDefinition(["whileFocus"]), - hover: createDefinition(["whileHover", "onHoverStart", "onHoverEnd"]), - tap: createDefinition(["whileTap", "onTap", "onTapStart", "onTapCancel"]), - pan: createDefinition(["onPan", "onPanStart", "onPanSessionStart", "onPanEnd"]), - inView: createDefinition(["whileInView", "onViewportEnter", "onViewportLeave"]) -}; -function loadFeatures(features) { - for (var key in features) { - if (features[key] === null) continue; - if (key === "projectionNodeConstructor") { - featureDefinitions.projectionNodeConstructor = features[key]; - } else { - featureDefinitions[key].Component = features[key]; - } - } -} -var LazyContext = React.createContext({ - strict: false -}); -var featureNames = Object.keys(featureDefinitions); -var numFeatures = featureNames.length; -/** - * Load features via renderless components based on the provided MotionProps. - */ -function useFeatures(props, visualElement, preloadedFeatures) { - var features = []; - var lazyContext = React.useContext(LazyContext); - if (!visualElement) return null; - /** - * If we're in development mode, check to make sure we're not rendering a motion component - * as a child of LazyMotion, as this will break the file-size benefits of using it. - */ - if (env !== "production" && preloadedFeatures && lazyContext.strict) { - heyListen.invariant(false, "You have rendered a `motion` component within a `LazyMotion` component. This will break tree shaking. Import and render a `m` component instead."); - } - for (var i = 0; i < numFeatures; i++) { - var name_1 = featureNames[i]; - var _a = featureDefinitions[name_1], - isEnabled = _a.isEnabled, - Component = _a.Component; - /** - * It might be possible in the future to use this moment to - * dynamically request functionality. In initial tests this - * was producing a lot of duplication amongst bundles. - */ - if (isEnabled(props) && Component) { - features.push(React__namespace.createElement(Component, tslib.__assign({ - key: name_1 - }, props, { - visualElement: visualElement - }))); - } - } - return features; -} - -/** - * @public - */ -var MotionConfigContext = React.createContext({ - transformPagePoint: function (p) { - return p; - }, - isStatic: false, - reducedMotion: "never" -}); -var MotionContext = React.createContext({}); -function useVisualElementContext() { - return React.useContext(MotionContext).visualElement; -} - -/** - * @public - */ -var PresenceContext = React.createContext(null); -var isBrowser = typeof document !== "undefined"; -var useIsomorphicLayoutEffect = isBrowser ? React.useLayoutEffect : React.useEffect; - -// Does this device prefer reduced motion? Returns `null` server-side. -var prefersReducedMotion = { - current: null -}; -var hasDetected = false; -function initPrefersReducedMotion() { - hasDetected = true; - if (!isBrowser) return; - if (window.matchMedia) { - var motionMediaQuery_1 = window.matchMedia("(prefers-reduced-motion)"); - var setReducedMotionPreferences = function () { - return prefersReducedMotion.current = motionMediaQuery_1.matches; - }; - motionMediaQuery_1.addListener(setReducedMotionPreferences); - setReducedMotionPreferences(); - } else { - prefersReducedMotion.current = false; - } -} -/** - * A hook that returns `true` if we should be using reduced motion based on the current device's Reduced Motion setting. - * - * This can be used to implement changes to your UI based on Reduced Motion. For instance, replacing motion-sickness inducing - * `x`/`y` animations with `opacity`, disabling the autoplay of background videos, or turning off parallax motion. - * - * It will actively respond to changes and re-render your components with the latest setting. - * - * ```jsx - * export function Sidebar({ isOpen }) { - * const shouldReduceMotion = useReducedMotion() - * const closedX = shouldReduceMotion ? 0 : "-100%" - * - * return ( - * - * ) - * } - * ``` - * - * @return boolean - * - * @public - */ -function useReducedMotion() { - /** - * Lazy initialisation of prefersReducedMotion - */ - !hasDetected && initPrefersReducedMotion(); - var _a = tslib.__read(React.useState(prefersReducedMotion.current), 1), - shouldReduceMotion = _a[0]; - /** - * TODO See if people miss automatically updating shouldReduceMotion setting - */ - return shouldReduceMotion; -} -function useReducedMotionConfig() { - var reducedMotionPreference = useReducedMotion(); - var reducedMotion = React.useContext(MotionConfigContext).reducedMotion; - if (reducedMotion === "never") { - return false; - } else if (reducedMotion === "always") { - return true; - } else { - return reducedMotionPreference; - } -} -function useVisualElement(Component, visualState, props, createVisualElement) { - var lazyContext = React.useContext(LazyContext); - var parent = useVisualElementContext(); - var presenceContext = React.useContext(PresenceContext); - var shouldReduceMotion = useReducedMotionConfig(); - var visualElementRef = React.useRef(undefined); - /** - * If we haven't preloaded a renderer, check to see if we have one lazy-loaded - */ - if (!createVisualElement) createVisualElement = lazyContext.renderer; - if (!visualElementRef.current && createVisualElement) { - visualElementRef.current = createVisualElement(Component, { - visualState: visualState, - parent: parent, - props: props, - presenceId: presenceContext === null || presenceContext === void 0 ? void 0 : presenceContext.id, - blockInitialAnimation: (presenceContext === null || presenceContext === void 0 ? void 0 : presenceContext.initial) === false, - shouldReduceMotion: shouldReduceMotion - }); - } - var visualElement = visualElementRef.current; - useIsomorphicLayoutEffect(function () { - visualElement === null || visualElement === void 0 ? void 0 : visualElement.syncRender(); - }); - React.useEffect(function () { - var _a; - (_a = visualElement === null || visualElement === void 0 ? void 0 : visualElement.animationState) === null || _a === void 0 ? void 0 : _a.animateChanges(); - }); - useIsomorphicLayoutEffect(function () { - return function () { - return visualElement === null || visualElement === void 0 ? void 0 : visualElement.notifyUnmount(); - }; - }, []); - return visualElement; -} -function isRefObject(ref) { - return typeof ref === "object" && Object.prototype.hasOwnProperty.call(ref, "current"); -} - -/** - * Creates a ref function that, when called, hydrates the provided - * external ref and VisualElement. - */ -function useMotionRef(visualState, visualElement, externalRef) { - return React.useCallback(function (instance) { - var _a; - instance && ((_a = visualState.mount) === null || _a === void 0 ? void 0 : _a.call(visualState, instance)); - if (visualElement) { - instance ? visualElement.mount(instance) : visualElement.unmount(); - } - if (externalRef) { - if (typeof externalRef === "function") { - externalRef(instance); - } else if (isRefObject(externalRef)) { - externalRef.current = instance; - } - } - }, - /** - * Only pass a new ref callback to React if we've received a visual element - * factory. Otherwise we'll be mounting/remounting every time externalRef - * or other dependencies change. - */ - [visualElement]); -} - -/** - * Decides if the supplied variable is an array of variant labels - */ -function isVariantLabels(v) { - return Array.isArray(v); -} -/** - * Decides if the supplied variable is variant label - */ -function isVariantLabel(v) { - return typeof v === "string" || isVariantLabels(v); -} -/** - * Creates an object containing the latest state of every MotionValue on a VisualElement - */ -function getCurrent(visualElement) { - var current = {}; - visualElement.forEachValue(function (value, key) { - return current[key] = value.get(); - }); - return current; -} -/** - * Creates an object containing the latest velocity of every MotionValue on a VisualElement - */ -function getVelocity$1(visualElement) { - var velocity = {}; - visualElement.forEachValue(function (value, key) { - return velocity[key] = value.getVelocity(); - }); - return velocity; -} -function resolveVariantFromProps(props, definition, custom, currentValues, currentVelocity) { - var _a; - if (currentValues === void 0) { - currentValues = {}; - } - if (currentVelocity === void 0) { - currentVelocity = {}; - } - /** - * If the variant definition is a function, resolve. - */ - if (typeof definition === "function") { - definition = definition(custom !== null && custom !== void 0 ? custom : props.custom, currentValues, currentVelocity); - } - /** - * If the variant definition is a variant label, or - * the function returned a variant label, resolve. - */ - if (typeof definition === "string") { - definition = (_a = props.variants) === null || _a === void 0 ? void 0 : _a[definition]; - } - /** - * At this point we've resolved both functions and variant labels, - * but the resolved variant label might itself have been a function. - * If so, resolve. This can only have returned a valid target object. - */ - if (typeof definition === "function") { - definition = definition(custom !== null && custom !== void 0 ? custom : props.custom, currentValues, currentVelocity); - } - return definition; -} -function resolveVariant(visualElement, definition, custom) { - var props = visualElement.getProps(); - return resolveVariantFromProps(props, definition, custom !== null && custom !== void 0 ? custom : props.custom, getCurrent(visualElement), getVelocity$1(visualElement)); -} -function checkIfControllingVariants(props) { - var _a; - return typeof ((_a = props.animate) === null || _a === void 0 ? void 0 : _a.start) === "function" || isVariantLabel(props.initial) || isVariantLabel(props.animate) || isVariantLabel(props.whileHover) || isVariantLabel(props.whileDrag) || isVariantLabel(props.whileTap) || isVariantLabel(props.whileFocus) || isVariantLabel(props.exit); -} -function checkIfVariantNode(props) { - return Boolean(checkIfControllingVariants(props) || props.variants); -} -function getCurrentTreeVariants(props, context) { - if (checkIfControllingVariants(props)) { - var initial = props.initial, - animate = props.animate; - return { - initial: initial === false || isVariantLabel(initial) ? initial : undefined, - animate: isVariantLabel(animate) ? animate : undefined - }; - } - return props.inherit !== false ? context : {}; -} -function useCreateMotionContext(props) { - var _a = getCurrentTreeVariants(props, React.useContext(MotionContext)), - initial = _a.initial, - animate = _a.animate; - return React.useMemo(function () { - return { - initial: initial, - animate: animate - }; - }, [variantLabelsAsDependency(initial), variantLabelsAsDependency(animate)]); -} -function variantLabelsAsDependency(prop) { - return Array.isArray(prop) ? prop.join(" ") : prop; -} - -/** - * Creates a constant value over the lifecycle of a component. - * - * Even if `useMemo` is provided an empty array as its final argument, it doesn't offer - * a guarantee that it won't re-run for performance reasons later on. By using `useConstant` - * you can ensure that initialisers don't execute twice or more. - */ -function useConstant(init) { - var ref = React.useRef(null); - if (ref.current === null) { - ref.current = init(); - } - return ref.current; -} - -/** - * This should only ever be modified on the client otherwise it'll - * persist through server requests. If we need instanced states we - * could lazy-init via root. - */ -var globalProjectionState = { - /** - * Global flag as to whether the tree has animated since the last time - * we resized the window - */ - hasAnimatedSinceResize: true, - /** - * We set this to true once, on the first update. Any nodes added to the tree beyond that - * update will be given a `data-projection-id` attribute. - */ - hasEverUpdated: false -}; -var id$1 = 1; -function useProjectionId() { - return useConstant(function () { - if (globalProjectionState.hasEverUpdated) { - return id$1++; - } - }); -} -var LayoutGroupContext = React.createContext({}); - -/** - * Internal, exported only for usage in Framer - */ -var SwitchLayoutGroupContext = React.createContext({}); -function useProjection(projectionId, _a, visualElement, ProjectionNodeConstructor) { - var _b; - var layoutId = _a.layoutId, - layout = _a.layout, - drag = _a.drag, - dragConstraints = _a.dragConstraints, - layoutScroll = _a.layoutScroll; - var initialPromotionConfig = React.useContext(SwitchLayoutGroupContext); - if (!ProjectionNodeConstructor || !visualElement || (visualElement === null || visualElement === void 0 ? void 0 : visualElement.projection)) { - return; - } - visualElement.projection = new ProjectionNodeConstructor(projectionId, visualElement.getLatestValues(), (_b = visualElement.parent) === null || _b === void 0 ? void 0 : _b.projection); - visualElement.projection.setOptions({ - layoutId: layoutId, - layout: layout, - alwaysMeasureLayout: Boolean(drag) || dragConstraints && isRefObject(dragConstraints), - visualElement: visualElement, - scheduleRender: function () { - return visualElement.scheduleRender(); - }, - /** - * TODO: Update options in an effect. This could be tricky as it'll be too late - * to update by the time layout animations run. - * We also need to fix this safeToRemove by linking it up to the one returned by usePresence, - * ensuring it gets called if there's no potential layout animations. - * - */ - animationType: typeof layout === "string" ? layout : "both", - initialPromotionConfig: initialPromotionConfig, - layoutScroll: layoutScroll - }); -} -var VisualElementHandler = /** @class */function (_super) { - tslib.__extends(VisualElementHandler, _super); - function VisualElementHandler() { - return _super !== null && _super.apply(this, arguments) || this; - } - /** - * Update visual element props as soon as we know this update is going to be commited. - */ - VisualElementHandler.prototype.getSnapshotBeforeUpdate = function () { - this.updateProps(); - return null; - }; - VisualElementHandler.prototype.componentDidUpdate = function () {}; - VisualElementHandler.prototype.updateProps = function () { - var _a = this.props, - visualElement = _a.visualElement, - props = _a.props; - if (visualElement) visualElement.setProps(props); - }; - VisualElementHandler.prototype.render = function () { - return this.props.children; - }; - return VisualElementHandler; -}(React__default["default"].Component); - -/** - * Create a `motion` component. - * - * This function accepts a Component argument, which can be either a string (ie "div" - * for `motion.div`), or an actual React component. - * - * Alongside this is a config option which provides a way of rendering the provided - * component "offline", or outside the React render cycle. - */ -function createMotionComponent(_a) { - var preloadedFeatures = _a.preloadedFeatures, - createVisualElement = _a.createVisualElement, - projectionNodeConstructor = _a.projectionNodeConstructor, - useRender = _a.useRender, - useVisualState = _a.useVisualState, - Component = _a.Component; - preloadedFeatures && loadFeatures(preloadedFeatures); - function MotionComponent(props, externalRef) { - var layoutId = useLayoutId(props); - props = tslib.__assign(tslib.__assign({}, props), { - layoutId: layoutId - }); - /** - * If we're rendering in a static environment, we only visually update the component - * as a result of a React-rerender rather than interactions or animations. This - * means we don't need to load additional memory structures like VisualElement, - * or any gesture/animation features. - */ - var config = React.useContext(MotionConfigContext); - var features = null; - var context = useCreateMotionContext(props); - /** - * Create a unique projection ID for this component. If a new component is added - * during a layout animation we'll use this to query the DOM and hydrate its ref early, allowing - * us to measure it as soon as any layout effect flushes pending layout animations. - * - * Performance note: It'd be better not to have to search the DOM for these elements. - * For newly-entering components it could be enough to only correct treeScale, in which - * case we could mount in a scale-correction mode. This wouldn't be enough for - * shared element transitions however. Perhaps for those we could revert to a root node - * that gets forceRendered and layout animations are triggered on its layout effect. - */ - var projectionId = config.isStatic ? undefined : useProjectionId(); - /** - * - */ - var visualState = useVisualState(props, config.isStatic); - if (!config.isStatic && isBrowser) { - /** - * Create a VisualElement for this component. A VisualElement provides a common - * interface to renderer-specific APIs (ie DOM/Three.js etc) as well as - * providing a way of rendering to these APIs outside of the React render loop - * for more performant animations and interactions - */ - context.visualElement = useVisualElement(Component, visualState, tslib.__assign(tslib.__assign({}, config), props), createVisualElement); - useProjection(projectionId, props, context.visualElement, projectionNodeConstructor || featureDefinitions.projectionNodeConstructor); - /** - * Load Motion gesture and animation features. These are rendered as renderless - * components so each feature can optionally make use of React lifecycle methods. - */ - features = useFeatures(props, context.visualElement, preloadedFeatures); - } - /** - * The mount order and hierarchy is specific to ensure our element ref - * is hydrated by the time features fire their effects. - */ - return React__namespace.createElement(VisualElementHandler, { - visualElement: context.visualElement, - props: tslib.__assign(tslib.__assign({}, config), props) - }, features, React__namespace.createElement(MotionContext.Provider, { - value: context - }, useRender(Component, props, projectionId, useMotionRef(visualState, context.visualElement, externalRef), visualState, config.isStatic, context.visualElement))); - } - return React.forwardRef(MotionComponent); -} -function useLayoutId(_a) { - var _b; - var layoutId = _a.layoutId; - var layoutGroupId = (_b = React.useContext(LayoutGroupContext)) === null || _b === void 0 ? void 0 : _b.id; - return layoutGroupId && layoutId !== undefined ? layoutGroupId + "-" + layoutId : layoutId; -} - -/** - * Convert any React component into a `motion` component. The provided component - * **must** use `React.forwardRef` to the underlying DOM component you want to animate. - * - * ```jsx - * const Component = React.forwardRef((props, ref) => { - * return
- * }) - * - * const MotionComponent = motion(Component) - * ``` - * - * @public - */ -function createMotionProxy(createConfig) { - function custom(Component, customMotionComponentConfig) { - if (customMotionComponentConfig === void 0) { - customMotionComponentConfig = {}; - } - return createMotionComponent(createConfig(Component, customMotionComponentConfig)); - } - if (typeof Proxy === "undefined") { - return custom; - } - /** - * A cache of generated `motion` components, e.g `motion.div`, `motion.input` etc. - * Rather than generating them anew every render. - */ - var componentCache = new Map(); - return new Proxy(custom, { - /** - * Called when `motion` is referenced with a prop: `motion.div`, `motion.input` etc. - * The prop name is passed through as `key` and we can use that to generate a `motion` - * DOM component with that name. - */ - get: function (_target, key) { - /** - * If this element doesn't exist in the component cache, create it and cache. - */ - if (!componentCache.has(key)) { - componentCache.set(key, custom(key)); - } - return componentCache.get(key); - } - }); -} - -/** - * We keep these listed seperately as we use the lowercase tag names as part - * of the runtime bundle to detect SVG components - */ -var lowercaseSVGElements = ["animate", "circle", "defs", "desc", "ellipse", "g", "image", "line", "filter", "marker", "mask", "metadata", "path", "pattern", "polygon", "polyline", "rect", "stop", "svg", "switch", "symbol", "text", "tspan", "use", "view"]; -function isSVGComponent(Component) { - if ( - /** - * If it's not a string, it's a custom React component. Currently we only support - * HTML custom React components. - */ - typeof Component !== "string" || - /** - * If it contains a dash, the element is a custom HTML webcomponent. - */ - Component.includes("-")) { - return false; - } else if ( - /** - * If it's in our list of lowercase SVG tags, it's an SVG component - */ - lowercaseSVGElements.indexOf(Component) > -1 || - /** - * If it contains a capital letter, it's an SVG component - */ - /[A-Z]/.test(Component)) { - return true; - } - return false; -} -var scaleCorrectors = {}; -function addScaleCorrector(correctors) { - Object.assign(scaleCorrectors, correctors); -} - -/** - * A list of all transformable axes. We'll use this list to generated a version - * of each axes for each transform. - */ -var transformAxes = ["", "X", "Y", "Z"]; -/** - * An ordered array of each transformable value. By default, transform values - * will be sorted to this order. - */ -var order = ["translate", "scale", "rotate", "skew"]; -/** - * Generate a list of every possible transform key. - */ -var transformProps = ["transformPerspective", "x", "y", "z"]; -order.forEach(function (operationKey) { - return transformAxes.forEach(function (axesKey) { - return transformProps.push(operationKey + axesKey); - }); -}); -/** - * A function to use with Array.sort to sort transform keys by their default order. - */ -function sortTransformProps(a, b) { - return transformProps.indexOf(a) - transformProps.indexOf(b); -} -/** - * A quick lookup for transform props. - */ -var transformPropSet = new Set(transformProps); -function isTransformProp(key) { - return transformPropSet.has(key); -} -/** - * A quick lookup for transform origin props - */ -var transformOriginProps = new Set(["originX", "originY", "originZ"]); -function isTransformOriginProp(key) { - return transformOriginProps.has(key); -} -function isForcedMotionValue(key, _a) { - var layout = _a.layout, - layoutId = _a.layoutId; - return isTransformProp(key) || isTransformOriginProp(key) || (layout || layoutId !== undefined) && (!!scaleCorrectors[key] || key === "opacity"); -} -var isMotionValue = function (value) { - return Boolean(value !== null && typeof value === "object" && value.getVelocity); -}; -var translateAlias = { - x: "translateX", - y: "translateY", - z: "translateZ", - transformPerspective: "perspective" -}; -/** - * Build a CSS transform style from individual x/y/scale etc properties. - * - * This outputs with a default order of transforms/scales/rotations, this can be customised by - * providing a transformTemplate function. - */ -function buildTransform(_a, _b, transformIsDefault, transformTemplate) { - var transform = _a.transform, - transformKeys = _a.transformKeys; - var _c = _b.enableHardwareAcceleration, - enableHardwareAcceleration = _c === void 0 ? true : _c, - _d = _b.allowTransformNone, - allowTransformNone = _d === void 0 ? true : _d; - // The transform string we're going to build into. - var transformString = ""; - // Transform keys into their default order - this will determine the output order. - transformKeys.sort(sortTransformProps); - // Track whether the defined transform has a defined z so we don't add a - // second to enable hardware acceleration - var transformHasZ = false; - // Loop over each transform and build them into transformString - var numTransformKeys = transformKeys.length; - for (var i = 0; i < numTransformKeys; i++) { - var key = transformKeys[i]; - transformString += "".concat(translateAlias[key] || key, "(").concat(transform[key], ") "); - if (key === "z") transformHasZ = true; - } - if (!transformHasZ && enableHardwareAcceleration) { - transformString += "translateZ(0)"; - } else { - transformString = transformString.trim(); - } - // If we have a custom `transform` template, pass our transform values and - // generated transformString to that before returning - if (transformTemplate) { - transformString = transformTemplate(transform, transformIsDefault ? "" : transformString); - } else if (allowTransformNone && transformIsDefault) { - transformString = "none"; - } - return transformString; -} -/** - * Build a transformOrigin style. Uses the same defaults as the browser for - * undefined origins. - */ -function buildTransformOrigin(_a) { - var _b = _a.originX, - originX = _b === void 0 ? "50%" : _b, - _c = _a.originY, - originY = _c === void 0 ? "50%" : _c, - _d = _a.originZ, - originZ = _d === void 0 ? 0 : _d; - return "".concat(originX, " ").concat(originY, " ").concat(originZ); -} - -/** - * Returns true if the provided key is a CSS variable - */ -function isCSSVariable$1(key) { - return key.startsWith("--"); -} - -/** - * Provided a value and a ValueType, returns the value as that value type. - */ -var getValueAsType = function (value, type) { - return type && typeof value === "number" ? type.transform(value) : value; -}; -var int = tslib.__assign(tslib.__assign({}, styleValueTypes.number), { - transform: Math.round -}); -var numberValueTypes = { - // Border props - borderWidth: styleValueTypes.px, - borderTopWidth: styleValueTypes.px, - borderRightWidth: styleValueTypes.px, - borderBottomWidth: styleValueTypes.px, - borderLeftWidth: styleValueTypes.px, - borderRadius: styleValueTypes.px, - radius: styleValueTypes.px, - borderTopLeftRadius: styleValueTypes.px, - borderTopRightRadius: styleValueTypes.px, - borderBottomRightRadius: styleValueTypes.px, - borderBottomLeftRadius: styleValueTypes.px, - // Positioning props - width: styleValueTypes.px, - maxWidth: styleValueTypes.px, - height: styleValueTypes.px, - maxHeight: styleValueTypes.px, - size: styleValueTypes.px, - top: styleValueTypes.px, - right: styleValueTypes.px, - bottom: styleValueTypes.px, - left: styleValueTypes.px, - // Spacing props - padding: styleValueTypes.px, - paddingTop: styleValueTypes.px, - paddingRight: styleValueTypes.px, - paddingBottom: styleValueTypes.px, - paddingLeft: styleValueTypes.px, - margin: styleValueTypes.px, - marginTop: styleValueTypes.px, - marginRight: styleValueTypes.px, - marginBottom: styleValueTypes.px, - marginLeft: styleValueTypes.px, - // Transform props - rotate: styleValueTypes.degrees, - rotateX: styleValueTypes.degrees, - rotateY: styleValueTypes.degrees, - rotateZ: styleValueTypes.degrees, - scale: styleValueTypes.scale, - scaleX: styleValueTypes.scale, - scaleY: styleValueTypes.scale, - scaleZ: styleValueTypes.scale, - skew: styleValueTypes.degrees, - skewX: styleValueTypes.degrees, - skewY: styleValueTypes.degrees, - distance: styleValueTypes.px, - translateX: styleValueTypes.px, - translateY: styleValueTypes.px, - translateZ: styleValueTypes.px, - x: styleValueTypes.px, - y: styleValueTypes.px, - z: styleValueTypes.px, - perspective: styleValueTypes.px, - transformPerspective: styleValueTypes.px, - opacity: styleValueTypes.alpha, - originX: styleValueTypes.progressPercentage, - originY: styleValueTypes.progressPercentage, - originZ: styleValueTypes.px, - // Misc - zIndex: int, - // SVG - fillOpacity: styleValueTypes.alpha, - strokeOpacity: styleValueTypes.alpha, - numOctaves: int -}; -function buildHTMLStyles(state, latestValues, options, transformTemplate) { - var _a; - var style = state.style, - vars = state.vars, - transform = state.transform, - transformKeys = state.transformKeys, - transformOrigin = state.transformOrigin; - // Empty the transformKeys array. As we're throwing out refs to its items - // this might not be as cheap as suspected. Maybe using the array as a buffer - // with a manual incrementation would be better. - transformKeys.length = 0; - // Track whether we encounter any transform or transformOrigin values. - var hasTransform = false; - var hasTransformOrigin = false; - // Does the calculated transform essentially equal "none"? - var transformIsNone = true; - /** - * Loop over all our latest animated values and decide whether to handle them - * as a style or CSS variable. - * - * Transforms and transform origins are kept seperately for further processing. - */ - for (var key in latestValues) { - var value = latestValues[key]; - /** - * If this is a CSS variable we don't do any further processing. - */ - if (isCSSVariable$1(key)) { - vars[key] = value; - continue; - } - // Convert the value to its default value type, ie 0 -> "0px" - var valueType = numberValueTypes[key]; - var valueAsType = getValueAsType(value, valueType); - if (isTransformProp(key)) { - // If this is a transform, flag to enable further transform processing - hasTransform = true; - transform[key] = valueAsType; - transformKeys.push(key); - // If we already know we have a non-default transform, early return - if (!transformIsNone) continue; - // Otherwise check to see if this is a default transform - if (value !== ((_a = valueType.default) !== null && _a !== void 0 ? _a : 0)) transformIsNone = false; - } else if (isTransformOriginProp(key)) { - transformOrigin[key] = valueAsType; - // If this is a transform origin, flag and enable further transform-origin processing - hasTransformOrigin = true; - } else { - style[key] = valueAsType; - } - } - if (hasTransform) { - style.transform = buildTransform(state, options, transformIsNone, transformTemplate); - } else if (transformTemplate) { - style.transform = transformTemplate({}, ""); - } else if (!latestValues.transform && style.transform) { - style.transform = "none"; - } - if (hasTransformOrigin) { - style.transformOrigin = buildTransformOrigin(transformOrigin); - } -} -var createHtmlRenderState = function () { - return { - style: {}, - transform: {}, - transformKeys: [], - transformOrigin: {}, - vars: {} - }; -}; -function copyRawValuesOnly(target, source, props) { - for (var key in source) { - if (!isMotionValue(source[key]) && !isForcedMotionValue(key, props)) { - target[key] = source[key]; - } - } -} -function useInitialMotionValues(_a, visualState, isStatic) { - var transformTemplate = _a.transformTemplate; - return React.useMemo(function () { - var state = createHtmlRenderState(); - buildHTMLStyles(state, visualState, { - enableHardwareAcceleration: !isStatic - }, transformTemplate); - var vars = state.vars, - style = state.style; - return tslib.__assign(tslib.__assign({}, vars), style); - }, [visualState]); -} -function useStyle(props, visualState, isStatic) { - var styleProp = props.style || {}; - var style = {}; - /** - * Copy non-Motion Values straight into style - */ - copyRawValuesOnly(style, styleProp, props); - Object.assign(style, useInitialMotionValues(props, visualState, isStatic)); - if (props.transformValues) { - style = props.transformValues(style); - } - return style; -} -function useHTMLProps(props, visualState, isStatic) { - // The `any` isn't ideal but it is the type of createElement props argument - var htmlProps = {}; - var style = useStyle(props, visualState, isStatic); - if (Boolean(props.drag) && props.dragListener !== false) { - // Disable the ghost element when a user drags - htmlProps.draggable = false; - // Disable text selection - style.userSelect = style.WebkitUserSelect = style.WebkitTouchCallout = "none"; - // Disable scrolling on the draggable direction - style.touchAction = props.drag === true ? "none" : "pan-".concat(props.drag === "x" ? "y" : "x"); - } - htmlProps.style = style; - return htmlProps; -} - -/** - * A list of all valid MotionProps. - * - * @privateRemarks - * This doesn't throw if a `MotionProp` name is missing - it should. - */ -var validMotionProps = new Set(["initial", "animate", "exit", "style", "variants", "transition", "transformTemplate", "transformValues", "custom", "inherit", "layout", "layoutId", "layoutDependency", "onLayoutAnimationStart", "onLayoutAnimationComplete", "onLayoutMeasure", "onBeforeLayoutMeasure", "onAnimationStart", "onAnimationComplete", "onUpdate", "onDragStart", "onDrag", "onDragEnd", "onMeasureDragConstraints", "onDirectionLock", "onDragTransitionEnd", "drag", "dragControls", "dragListener", "dragConstraints", "dragDirectionLock", "dragSnapToOrigin", "_dragX", "_dragY", "dragElastic", "dragMomentum", "dragPropagation", "dragTransition", "whileDrag", "onPan", "onPanStart", "onPanEnd", "onPanSessionStart", "onTap", "onTapStart", "onTapCancel", "onHoverStart", "onHoverEnd", "whileFocus", "whileTap", "whileHover", "whileInView", "onViewportEnter", "onViewportLeave", "viewport", "layoutScroll"]); -/** - * Check whether a prop name is a valid `MotionProp` key. - * - * @param key - Name of the property to check - * @returns `true` is key is a valid `MotionProp`. - * - * @public - */ -function isValidMotionProp(key) { - return validMotionProps.has(key); -} -var shouldForward = function (key) { - return !isValidMotionProp(key); -}; -function loadExternalIsValidProp(isValidProp) { - if (!isValidProp) return; - // Explicitly filter our events - shouldForward = function (key) { - return key.startsWith("on") ? !isValidMotionProp(key) : isValidProp(key); - }; -} -/** - * Emotion and Styled Components both allow users to pass through arbitrary props to their components - * to dynamically generate CSS. They both use the `@emotion/is-prop-valid` package to determine which - * of these should be passed to the underlying DOM node. - * - * However, when styling a Motion component `styled(motion.div)`, both packages pass through *all* props - * as it's seen as an arbitrary component rather than a DOM node. Motion only allows arbitrary props - * passed through the `custom` prop so it doesn't *need* the payload or computational overhead of - * `@emotion/is-prop-valid`, however to fix this problem we need to use it. - * - * By making it an optionalDependency we can offer this functionality only in the situations where it's - * actually required. - */ -try { - /** - * We attempt to import this package but require won't be defined in esm environments, in that case - * isPropValid will have to be provided via `MotionContext`. In a 6.0.0 this should probably be removed - * in favour of explicit injection. - */ - loadExternalIsValidProp((__webpack_require__(/*! @emotion/is-prop-valid */ "../../../node_modules/@emotion/is-prop-valid/dist/is-prop-valid.browser.esm.js")["default"])); -} catch (_a) { - // We don't need to actually do anything here - the fallback is the existing `isPropValid`. -} -function filterProps(props, isDom, forwardMotionProps) { - var filteredProps = {}; - for (var key in props) { - if (shouldForward(key) || forwardMotionProps === true && isValidMotionProp(key) || !isDom && !isValidMotionProp(key) || - // If trying to use native HTML drag events, forward drag listeners - props["draggable"] && key.startsWith("onDrag")) { - filteredProps[key] = props[key]; - } - } - return filteredProps; -} -function calcOrigin$1(origin, offset, size) { - return typeof origin === "string" ? origin : styleValueTypes.px.transform(offset + size * origin); -} -/** - * The SVG transform origin defaults are different to CSS and is less intuitive, - * so we use the measured dimensions of the SVG to reconcile these. - */ -function calcSVGTransformOrigin(dimensions, originX, originY) { - var pxOriginX = calcOrigin$1(originX, dimensions.x, dimensions.width); - var pxOriginY = calcOrigin$1(originY, dimensions.y, dimensions.height); - return "".concat(pxOriginX, " ").concat(pxOriginY); -} -var dashKeys = { - offset: "stroke-dashoffset", - array: "stroke-dasharray" -}; -var camelKeys = { - offset: "strokeDashoffset", - array: "strokeDasharray" -}; -/** - * Build SVG path properties. Uses the path's measured length to convert - * our custom pathLength, pathSpacing and pathOffset into stroke-dashoffset - * and stroke-dasharray attributes. - * - * This function is mutative to reduce per-frame GC. - */ -function buildSVGPath(attrs, length, spacing, offset, useDashCase) { - if (spacing === void 0) { - spacing = 1; - } - if (offset === void 0) { - offset = 0; - } - if (useDashCase === void 0) { - useDashCase = true; - } - // Normalise path length by setting SVG attribute pathLength to 1 - attrs.pathLength = 1; - // We use dash case when setting attributes directly to the DOM node and camel case - // when defining props on a React component. - var keys = useDashCase ? dashKeys : camelKeys; - // Build the dash offset - attrs[keys.offset] = styleValueTypes.px.transform(-offset); - // Build the dash array - var pathLength = styleValueTypes.px.transform(length); - var pathSpacing = styleValueTypes.px.transform(spacing); - attrs[keys.array] = "".concat(pathLength, " ").concat(pathSpacing); -} - -/** - * Build SVG visual attrbutes, like cx and style.transform - */ -function buildSVGAttrs(state, _a, options, transformTemplate) { - var attrX = _a.attrX, - attrY = _a.attrY, - originX = _a.originX, - originY = _a.originY, - pathLength = _a.pathLength, - _b = _a.pathSpacing, - pathSpacing = _b === void 0 ? 1 : _b, - _c = _a.pathOffset, - pathOffset = _c === void 0 ? 0 : _c, - // This is object creation, which we try to avoid per-frame. - latest = tslib.__rest(_a, ["attrX", "attrY", "originX", "originY", "pathLength", "pathSpacing", "pathOffset"]); - buildHTMLStyles(state, latest, options, transformTemplate); - state.attrs = state.style; - state.style = {}; - var attrs = state.attrs, - style = state.style, - dimensions = state.dimensions; - /** - * However, we apply transforms as CSS transforms. So if we detect a transform we take it from attrs - * and copy it into style. - */ - if (attrs.transform) { - if (dimensions) style.transform = attrs.transform; - delete attrs.transform; - } - // Parse transformOrigin - if (dimensions && (originX !== undefined || originY !== undefined || style.transform)) { - style.transformOrigin = calcSVGTransformOrigin(dimensions, originX !== undefined ? originX : 0.5, originY !== undefined ? originY : 0.5); - } - // Treat x/y not as shortcuts but as actual attributes - if (attrX !== undefined) attrs.x = attrX; - if (attrY !== undefined) attrs.y = attrY; - // Build SVG path if one has been defined - if (pathLength !== undefined) { - buildSVGPath(attrs, pathLength, pathSpacing, pathOffset, false); - } -} -var createSvgRenderState = function () { - return tslib.__assign(tslib.__assign({}, createHtmlRenderState()), { - attrs: {} - }); -}; -function useSVGProps(props, visualState) { - var visualProps = React.useMemo(function () { - var state = createSvgRenderState(); - buildSVGAttrs(state, visualState, { - enableHardwareAcceleration: false - }, props.transformTemplate); - return tslib.__assign(tslib.__assign({}, state.attrs), { - style: tslib.__assign({}, state.style) - }); - }, [visualState]); - if (props.style) { - var rawStyles = {}; - copyRawValuesOnly(rawStyles, props.style, props); - visualProps.style = tslib.__assign(tslib.__assign({}, rawStyles), visualProps.style); - } - return visualProps; -} -function createUseRender(forwardMotionProps) { - if (forwardMotionProps === void 0) { - forwardMotionProps = false; - } - var useRender = function (Component, props, projectionId, ref, _a, isStatic) { - var latestValues = _a.latestValues; - var useVisualProps = isSVGComponent(Component) ? useSVGProps : useHTMLProps; - var visualProps = useVisualProps(props, latestValues, isStatic); - var filteredProps = filterProps(props, typeof Component === "string", forwardMotionProps); - var elementProps = tslib.__assign(tslib.__assign(tslib.__assign({}, filteredProps), visualProps), { - ref: ref - }); - if (projectionId) { - elementProps["data-projection-id"] = projectionId; - } - return React.createElement(Component, elementProps); - }; - return useRender; -} -var CAMEL_CASE_PATTERN = /([a-z])([A-Z])/g; -var REPLACE_TEMPLATE = "$1-$2"; -/** - * Convert camelCase to dash-case properties. - */ -var camelToDash = function (str) { - return str.replace(CAMEL_CASE_PATTERN, REPLACE_TEMPLATE).toLowerCase(); -}; -function renderHTML(element, _a, styleProp, projection) { - var style = _a.style, - vars = _a.vars; - Object.assign(element.style, style, projection && projection.getProjectionStyles(styleProp)); - // Loop over any CSS variables and assign those. - for (var key in vars) { - element.style.setProperty(key, vars[key]); - } -} - -/** - * A set of attribute names that are always read/written as camel case. - */ -var camelCaseAttributes = new Set(["baseFrequency", "diffuseConstant", "kernelMatrix", "kernelUnitLength", "keySplines", "keyTimes", "limitingConeAngle", "markerHeight", "markerWidth", "numOctaves", "targetX", "targetY", "surfaceScale", "specularConstant", "specularExponent", "stdDeviation", "tableValues", "viewBox", "gradientTransform", "pathLength"]); -function renderSVG(element, renderState, _styleProp, projection) { - renderHTML(element, renderState, undefined, projection); - for (var key in renderState.attrs) { - element.setAttribute(!camelCaseAttributes.has(key) ? camelToDash(key) : key, renderState.attrs[key]); - } -} -function scrapeMotionValuesFromProps$1(props) { - var style = props.style; - var newValues = {}; - for (var key in style) { - if (isMotionValue(style[key]) || isForcedMotionValue(key, props)) { - newValues[key] = style[key]; - } - } - return newValues; -} -function scrapeMotionValuesFromProps(props) { - var newValues = scrapeMotionValuesFromProps$1(props); - for (var key in props) { - if (isMotionValue(props[key])) { - var targetKey = key === "x" || key === "y" ? "attr" + key.toUpperCase() : key; - newValues[targetKey] = props[key]; - } - } - return newValues; -} -function isAnimationControls(v) { - return typeof v === "object" && typeof v.start === "function"; -} -var isKeyframesTarget = function (v) { - return Array.isArray(v); -}; -var isCustomValue = function (v) { - return Boolean(v && typeof v === "object" && v.mix && v.toValue); -}; -var resolveFinalValueInKeyframes = function (v) { - // TODO maybe throw if v.length - 1 is placeholder token? - return isKeyframesTarget(v) ? v[v.length - 1] || 0 : v; -}; - -/** - * If the provided value is a MotionValue, this returns the actual value, otherwise just the value itself - * - * TODO: Remove and move to library - */ -function resolveMotionValue(value) { - var unwrappedValue = isMotionValue(value) ? value.get() : value; - return isCustomValue(unwrappedValue) ? unwrappedValue.toValue() : unwrappedValue; -} -function makeState(_a, props, context, presenceContext) { - var scrapeMotionValuesFromProps = _a.scrapeMotionValuesFromProps, - createRenderState = _a.createRenderState, - onMount = _a.onMount; - var state = { - latestValues: makeLatestValues(props, context, presenceContext, scrapeMotionValuesFromProps), - renderState: createRenderState() - }; - if (onMount) { - state.mount = function (instance) { - return onMount(props, instance, state); - }; - } - return state; -} -var makeUseVisualState = function (config) { - return function (props, isStatic) { - var context = React.useContext(MotionContext); - var presenceContext = React.useContext(PresenceContext); - return isStatic ? makeState(config, props, context, presenceContext) : useConstant(function () { - return makeState(config, props, context, presenceContext); - }); - }; -}; -function makeLatestValues(props, context, presenceContext, scrapeMotionValues) { - var values = {}; - var blockInitialAnimation = (presenceContext === null || presenceContext === void 0 ? void 0 : presenceContext.initial) === false; - var motionValues = scrapeMotionValues(props); - for (var key in motionValues) { - values[key] = resolveMotionValue(motionValues[key]); - } - var initial = props.initial, - animate = props.animate; - var isControllingVariants = checkIfControllingVariants(props); - var isVariantNode = checkIfVariantNode(props); - if (context && isVariantNode && !isControllingVariants && props.inherit !== false) { - initial !== null && initial !== void 0 ? initial : initial = context.initial; - animate !== null && animate !== void 0 ? animate : animate = context.animate; - } - var initialAnimationIsBlocked = blockInitialAnimation || initial === false; - var variantToSet = initialAnimationIsBlocked ? animate : initial; - if (variantToSet && typeof variantToSet !== "boolean" && !isAnimationControls(variantToSet)) { - var list = Array.isArray(variantToSet) ? variantToSet : [variantToSet]; - list.forEach(function (definition) { - var resolved = resolveVariantFromProps(props, definition); - if (!resolved) return; - var transitionEnd = resolved.transitionEnd; - resolved.transition; - var target = tslib.__rest(resolved, ["transitionEnd", "transition"]); - for (var key in target) { - var valueTarget = target[key]; - if (Array.isArray(valueTarget)) { - /** - * Take final keyframe if the initial animation is blocked because - * we want to initialise at the end of that blocked animation. - */ - var index = initialAnimationIsBlocked ? valueTarget.length - 1 : 0; - valueTarget = valueTarget[index]; - } - if (valueTarget !== null) { - values[key] = valueTarget; - } - } - for (var key in transitionEnd) values[key] = transitionEnd[key]; - }); - } - return values; -} -var svgMotionConfig = { - useVisualState: makeUseVisualState({ - scrapeMotionValuesFromProps: scrapeMotionValuesFromProps, - createRenderState: createSvgRenderState, - onMount: function (props, instance, _a) { - var renderState = _a.renderState, - latestValues = _a.latestValues; - try { - renderState.dimensions = typeof instance.getBBox === "function" ? instance.getBBox() : instance.getBoundingClientRect(); - } catch (e) { - // Most likely trying to measure an unrendered element under Firefox - renderState.dimensions = { - x: 0, - y: 0, - width: 0, - height: 0 - }; - } - buildSVGAttrs(renderState, latestValues, { - enableHardwareAcceleration: false - }, props.transformTemplate); - renderSVG(instance, renderState); - } - }) -}; -var htmlMotionConfig = { - useVisualState: makeUseVisualState({ - scrapeMotionValuesFromProps: scrapeMotionValuesFromProps$1, - createRenderState: createHtmlRenderState - }) -}; -function createDomMotionConfig(Component, _a, preloadedFeatures, createVisualElement, projectionNodeConstructor) { - var _b = _a.forwardMotionProps, - forwardMotionProps = _b === void 0 ? false : _b; - var baseConfig = isSVGComponent(Component) ? svgMotionConfig : htmlMotionConfig; - return tslib.__assign(tslib.__assign({}, baseConfig), { - preloadedFeatures: preloadedFeatures, - useRender: createUseRender(forwardMotionProps), - createVisualElement: createVisualElement, - projectionNodeConstructor: projectionNodeConstructor, - Component: Component - }); -} -exports.AnimationType = void 0; -(function (AnimationType) { - AnimationType["Animate"] = "animate"; - AnimationType["Hover"] = "whileHover"; - AnimationType["Tap"] = "whileTap"; - AnimationType["Drag"] = "whileDrag"; - AnimationType["Focus"] = "whileFocus"; - AnimationType["InView"] = "whileInView"; - AnimationType["Exit"] = "exit"; -})(exports.AnimationType || (exports.AnimationType = {})); -function addDomEvent(target, eventName, handler, options) { - if (options === void 0) { - options = { - passive: true - }; - } - target.addEventListener(eventName, handler, options); - return function () { - return target.removeEventListener(eventName, handler); - }; -} -/** - * Attaches an event listener directly to the provided DOM element. - * - * Bypassing React's event system can be desirable, for instance when attaching non-passive - * event handlers. - * - * ```jsx - * const ref = useRef(null) - * - * useDomEvent(ref, 'wheel', onWheel, { passive: false }) - * - * return
- * ``` - * - * @param ref - React.RefObject that's been provided to the element you want to bind the listener to. - * @param eventName - Name of the event you want listen for. - * @param handler - Function to fire when receiving the event. - * @param options - Options to pass to `Event.addEventListener`. - * - * @public - */ -function useDomEvent(ref, eventName, handler, options) { - React.useEffect(function () { - var element = ref.current; - if (handler && element) { - return addDomEvent(element, eventName, handler, options); - } - }, [ref, eventName, handler, options]); -} - -/** - * - * @param props - * @param ref - * @internal - */ -function useFocusGesture(_a) { - var whileFocus = _a.whileFocus, - visualElement = _a.visualElement; - var onFocus = function () { - var _a; - (_a = visualElement.animationState) === null || _a === void 0 ? void 0 : _a.setActive(exports.AnimationType.Focus, true); - }; - var onBlur = function () { - var _a; - (_a = visualElement.animationState) === null || _a === void 0 ? void 0 : _a.setActive(exports.AnimationType.Focus, false); - }; - useDomEvent(visualElement, "focus", whileFocus ? onFocus : undefined); - useDomEvent(visualElement, "blur", whileFocus ? onBlur : undefined); -} -function isMouseEvent(event) { - // PointerEvent inherits from MouseEvent so we can't use a straight instanceof check. - if (typeof PointerEvent !== "undefined" && event instanceof PointerEvent) { - return !!(event.pointerType === "mouse"); - } - return event instanceof MouseEvent; -} -function isTouchEvent(event) { - var hasTouches = !!event.touches; - return hasTouches; -} - -/** - * Filters out events not attached to the primary pointer (currently left mouse button) - * @param eventHandler - */ -function filterPrimaryPointer(eventHandler) { - return function (event) { - var isMouseEvent = event instanceof MouseEvent; - var isPrimaryPointer = !isMouseEvent || isMouseEvent && event.button === 0; - if (isPrimaryPointer) { - eventHandler(event); - } - }; -} -var defaultPagePoint = { - pageX: 0, - pageY: 0 -}; -function pointFromTouch(e, pointType) { - if (pointType === void 0) { - pointType = "page"; - } - var primaryTouch = e.touches[0] || e.changedTouches[0]; - var point = primaryTouch || defaultPagePoint; - return { - x: point[pointType + "X"], - y: point[pointType + "Y"] - }; -} -function pointFromMouse(point, pointType) { - if (pointType === void 0) { - pointType = "page"; - } - return { - x: point[pointType + "X"], - y: point[pointType + "Y"] - }; -} -function extractEventInfo(event, pointType) { - if (pointType === void 0) { - pointType = "page"; - } - return { - point: isTouchEvent(event) ? pointFromTouch(event, pointType) : pointFromMouse(event, pointType) - }; -} -var wrapHandler = function (handler, shouldFilterPrimaryPointer) { - if (shouldFilterPrimaryPointer === void 0) { - shouldFilterPrimaryPointer = false; - } - var listener = function (event) { - return handler(event, extractEventInfo(event)); - }; - return shouldFilterPrimaryPointer ? filterPrimaryPointer(listener) : listener; -}; - -// We check for event support via functions in case they've been mocked by a testing suite. -var supportsPointerEvents = function () { - return isBrowser && window.onpointerdown === null; -}; -var supportsTouchEvents = function () { - return isBrowser && window.ontouchstart === null; -}; -var supportsMouseEvents = function () { - return isBrowser && window.onmousedown === null; -}; -var mouseEventNames = { - pointerdown: "mousedown", - pointermove: "mousemove", - pointerup: "mouseup", - pointercancel: "mousecancel", - pointerover: "mouseover", - pointerout: "mouseout", - pointerenter: "mouseenter", - pointerleave: "mouseleave" -}; -var touchEventNames = { - pointerdown: "touchstart", - pointermove: "touchmove", - pointerup: "touchend", - pointercancel: "touchcancel" -}; -function getPointerEventName(name) { - if (supportsPointerEvents()) { - return name; - } else if (supportsTouchEvents()) { - return touchEventNames[name]; - } else if (supportsMouseEvents()) { - return mouseEventNames[name]; - } - return name; -} -function addPointerEvent(target, eventName, handler, options) { - return addDomEvent(target, getPointerEventName(eventName), wrapHandler(handler, eventName === "pointerdown"), options); -} -function usePointerEvent(ref, eventName, handler, options) { - return useDomEvent(ref, getPointerEventName(eventName), handler && wrapHandler(handler, eventName === "pointerdown"), options); -} -function createLock(name) { - var lock = null; - return function () { - var openLock = function () { - lock = null; - }; - if (lock === null) { - lock = name; - return openLock; - } - return false; - }; -} -var globalHorizontalLock = createLock("dragHorizontal"); -var globalVerticalLock = createLock("dragVertical"); -function getGlobalLock(drag) { - var lock = false; - if (drag === "y") { - lock = globalVerticalLock(); - } else if (drag === "x") { - lock = globalHorizontalLock(); - } else { - var openHorizontal_1 = globalHorizontalLock(); - var openVertical_1 = globalVerticalLock(); - if (openHorizontal_1 && openVertical_1) { - lock = function () { - openHorizontal_1(); - openVertical_1(); - }; - } else { - // Release the locks because we don't use them - if (openHorizontal_1) openHorizontal_1(); - if (openVertical_1) openVertical_1(); - } - } - return lock; -} -function isDragActive() { - // Check the gesture lock - if we get it, it means no drag gesture is active - // and we can safely fire the tap gesture. - var openGestureLock = getGlobalLock(true); - if (!openGestureLock) return true; - openGestureLock(); - return false; -} -function createHoverEvent(visualElement, isActive, callback) { - return function (event, info) { - var _a; - if (!isMouseEvent(event) || isDragActive()) return; - /** - * Ensure we trigger animations before firing event callback - */ - (_a = visualElement.animationState) === null || _a === void 0 ? void 0 : _a.setActive(exports.AnimationType.Hover, isActive); - callback === null || callback === void 0 ? void 0 : callback(event, info); - }; -} -function useHoverGesture(_a) { - var onHoverStart = _a.onHoverStart, - onHoverEnd = _a.onHoverEnd, - whileHover = _a.whileHover, - visualElement = _a.visualElement; - usePointerEvent(visualElement, "pointerenter", onHoverStart || whileHover ? createHoverEvent(visualElement, true, onHoverStart) : undefined, { - passive: !onHoverStart - }); - usePointerEvent(visualElement, "pointerleave", onHoverEnd || whileHover ? createHoverEvent(visualElement, false, onHoverEnd) : undefined, { - passive: !onHoverEnd - }); -} - -/** - * Recursively traverse up the tree to check whether the provided child node - * is the parent or a descendant of it. - * - * @param parent - Element to find - * @param child - Element to test against parent - */ -var isNodeOrChild = function (parent, child) { - if (!child) { - return false; - } else if (parent === child) { - return true; - } else { - return isNodeOrChild(parent, child.parentElement); - } -}; -function useUnmountEffect(callback) { - return React.useEffect(function () { - return function () { - return callback(); - }; - }, []); -} - -/** - * @param handlers - - * @internal - */ -function useTapGesture(_a) { - var onTap = _a.onTap, - onTapStart = _a.onTapStart, - onTapCancel = _a.onTapCancel, - whileTap = _a.whileTap, - visualElement = _a.visualElement; - var hasPressListeners = onTap || onTapStart || onTapCancel || whileTap; - var isPressing = React.useRef(false); - var cancelPointerEndListeners = React.useRef(null); - /** - * Only set listener to passive if there are no external listeners. - */ - var eventOptions = { - passive: !(onTapStart || onTap || onTapCancel || onPointerDown) - }; - function removePointerEndListener() { - var _a; - (_a = cancelPointerEndListeners.current) === null || _a === void 0 ? void 0 : _a.call(cancelPointerEndListeners); - cancelPointerEndListeners.current = null; - } - function checkPointerEnd() { - var _a; - removePointerEndListener(); - isPressing.current = false; - (_a = visualElement.animationState) === null || _a === void 0 ? void 0 : _a.setActive(exports.AnimationType.Tap, false); - return !isDragActive(); - } - function onPointerUp(event, info) { - if (!checkPointerEnd()) return; - /** - * We only count this as a tap gesture if the event.target is the same - * as, or a child of, this component's element - */ - !isNodeOrChild(visualElement.getInstance(), event.target) ? onTapCancel === null || onTapCancel === void 0 ? void 0 : onTapCancel(event, info) : onTap === null || onTap === void 0 ? void 0 : onTap(event, info); - } - function onPointerCancel(event, info) { - if (!checkPointerEnd()) return; - onTapCancel === null || onTapCancel === void 0 ? void 0 : onTapCancel(event, info); - } - function onPointerDown(event, info) { - var _a; - removePointerEndListener(); - if (isPressing.current) return; - isPressing.current = true; - cancelPointerEndListeners.current = popmotion.pipe(addPointerEvent(window, "pointerup", onPointerUp, eventOptions), addPointerEvent(window, "pointercancel", onPointerCancel, eventOptions)); - /** - * Ensure we trigger animations before firing event callback - */ - (_a = visualElement.animationState) === null || _a === void 0 ? void 0 : _a.setActive(exports.AnimationType.Tap, true); - onTapStart === null || onTapStart === void 0 ? void 0 : onTapStart(event, info); - } - usePointerEvent(visualElement, "pointerdown", hasPressListeners ? onPointerDown : undefined, eventOptions); - useUnmountEffect(removePointerEndListener); -} -var warned = new Set(); -function warnOnce(condition, message, element) { - if (condition || warned.has(message)) return; - console.warn(message); - if (element) console.warn(element); - warned.add(message); -} - -/** - * Map an IntersectionHandler callback to an element. We only ever make one handler for one - * element, so even though these handlers might all be triggered by different - * observers, we can keep them in the same map. - */ -var observerCallbacks = new WeakMap(); -/** - * Multiple observers can be created for multiple element/document roots. Each with - * different settings. So here we store dictionaries of observers to each root, - * using serialised settings (threshold/margin) as lookup keys. - */ -var observers = new WeakMap(); -var fireObserverCallback = function (entry) { - var _a; - (_a = observerCallbacks.get(entry.target)) === null || _a === void 0 ? void 0 : _a(entry); -}; -var fireAllObserverCallbacks = function (entries) { - entries.forEach(fireObserverCallback); -}; -function initIntersectionObserver(_a) { - var root = _a.root, - options = tslib.__rest(_a, ["root"]); - var lookupRoot = root || document; - /** - * If we don't have an observer lookup map for this root, create one. - */ - if (!observers.has(lookupRoot)) { - observers.set(lookupRoot, {}); - } - var rootObservers = observers.get(lookupRoot); - var key = JSON.stringify(options); - /** - * If we don't have an observer for this combination of root and settings, - * create one. - */ - if (!rootObservers[key]) { - rootObservers[key] = new IntersectionObserver(fireAllObserverCallbacks, tslib.__assign({ - root: root - }, options)); - } - return rootObservers[key]; -} -function observeIntersection(element, options, callback) { - var rootInteresectionObserver = initIntersectionObserver(options); - observerCallbacks.set(element, callback); - rootInteresectionObserver.observe(element); - return function () { - observerCallbacks.delete(element); - rootInteresectionObserver.unobserve(element); - }; -} -function useViewport(_a) { - var visualElement = _a.visualElement, - whileInView = _a.whileInView, - onViewportEnter = _a.onViewportEnter, - onViewportLeave = _a.onViewportLeave, - _b = _a.viewport, - viewport = _b === void 0 ? {} : _b; - var state = React.useRef({ - hasEnteredView: false, - isInView: false - }); - var shouldObserve = Boolean(whileInView || onViewportEnter || onViewportLeave); - if (viewport.once && state.current.hasEnteredView) shouldObserve = false; - var useObserver = typeof IntersectionObserver === "undefined" ? useMissingIntersectionObserver : useIntersectionObserver; - useObserver(shouldObserve, state.current, visualElement, viewport); -} -var thresholdNames = { - some: 0, - all: 1 -}; -function useIntersectionObserver(shouldObserve, state, visualElement, _a) { - var root = _a.root, - rootMargin = _a.margin, - _b = _a.amount, - amount = _b === void 0 ? "some" : _b, - once = _a.once; - React.useEffect(function () { - if (!shouldObserve) return; - var options = { - root: root === null || root === void 0 ? void 0 : root.current, - rootMargin: rootMargin, - threshold: typeof amount === "number" ? amount : thresholdNames[amount] - }; - var intersectionCallback = function (entry) { - var _a; - var isIntersecting = entry.isIntersecting; - /** - * If there's been no change in the viewport state, early return. - */ - if (state.isInView === isIntersecting) return; - state.isInView = isIntersecting; - /** - * Handle hasEnteredView. If this is only meant to run once, and - * element isn't visible, early return. Otherwise set hasEnteredView to true. - */ - if (once && !isIntersecting && state.hasEnteredView) { - return; - } else if (isIntersecting) { - state.hasEnteredView = true; - } - (_a = visualElement.animationState) === null || _a === void 0 ? void 0 : _a.setActive(exports.AnimationType.InView, isIntersecting); - /** - * Use the latest committed props rather than the ones in scope - * when this observer is created - */ - var props = visualElement.getProps(); - var callback = isIntersecting ? props.onViewportEnter : props.onViewportLeave; - callback === null || callback === void 0 ? void 0 : callback(entry); - }; - return observeIntersection(visualElement.getInstance(), options, intersectionCallback); - }, [shouldObserve, root, rootMargin, amount]); -} -/** - * If IntersectionObserver is missing, we activate inView and fire onViewportEnter - * on mount. This way, the page will be in the state the author expects users - * to see it in for everyone. - */ -function useMissingIntersectionObserver(shouldObserve, state, visualElement, _a) { - var _b = _a.fallback, - fallback = _b === void 0 ? true : _b; - React.useEffect(function () { - if (!shouldObserve || !fallback) return; - if (env !== "production") { - warnOnce(false, "IntersectionObserver not available on this device. whileInView animations will trigger on mount."); - } - /** - * Fire this in an rAF because, at this point, the animation state - * won't have flushed for the first time and there's certain logic in - * there that behaves differently on the initial animation. - * - * This hook should be quite rarely called so setting this in an rAF - * is preferred to changing the behaviour of the animation state. - */ - requestAnimationFrame(function () { - var _a; - state.hasEnteredView = true; - var onViewportEnter = visualElement.getProps().onViewportEnter; - onViewportEnter === null || onViewportEnter === void 0 ? void 0 : onViewportEnter(null); - (_a = visualElement.animationState) === null || _a === void 0 ? void 0 : _a.setActive(exports.AnimationType.InView, true); - }); - }, [shouldObserve]); -} -var makeRenderlessComponent = function (hook) { - return function (props) { - hook(props); - return null; - }; -}; -var gestureAnimations = { - inView: makeRenderlessComponent(useViewport), - tap: makeRenderlessComponent(useTapGesture), - focus: makeRenderlessComponent(useFocusGesture), - hover: makeRenderlessComponent(useHoverGesture) -}; -var counter = 0; -var incrementId = function () { - return counter++; -}; -var useId = function () { - return useConstant(incrementId); -}; -/** - * Ideally we'd use the following code to support React 18 optionally. - * But this fairly fails in Webpack (otherwise treeshaking wouldn't work at all). - * Need to come up with a different way of figuring this out. - */ -// export const useId = (React as any).useId -// ? (React as any).useId -// : () => useConstant(incrementId) - -/** - * When a component is the child of `AnimatePresence`, it can use `usePresence` - * to access information about whether it's still present in the React tree. - * - * ```jsx - * import { usePresence } from "framer-motion" - * - * export const Component = () => { - * const [isPresent, safeToRemove] = usePresence() - * - * useEffect(() => { - * !isPresent && setTimeout(safeToRemove, 1000) - * }, [isPresent]) - * - * return
- * } - * ``` - * - * If `isPresent` is `false`, it means that a component has been removed the tree, but - * `AnimatePresence` won't really remove it until `safeToRemove` has been called. - * - * @public - */ -function usePresence() { - var context = React.useContext(PresenceContext); - if (context === null) return [true, null]; - var isPresent = context.isPresent, - onExitComplete = context.onExitComplete, - register = context.register; - // It's safe to call the following hooks conditionally (after an early return) because the context will always - // either be null or non-null for the lifespan of the component. - // Replace with useId when released in React - var id = useId(); - React.useEffect(function () { - return register(id); - }, []); - var safeToRemove = function () { - return onExitComplete === null || onExitComplete === void 0 ? void 0 : onExitComplete(id); - }; - return !isPresent && onExitComplete ? [false, safeToRemove] : [true]; -} -/** - * Similar to `usePresence`, except `useIsPresent` simply returns whether or not the component is present. - * There is no `safeToRemove` function. - * - * ```jsx - * import { useIsPresent } from "framer-motion" - * - * export const Component = () => { - * const isPresent = useIsPresent() - * - * useEffect(() => { - * !isPresent && console.log("I've been removed!") - * }, [isPresent]) - * - * return
- * } - * ``` - * - * @public - */ -function useIsPresent() { - return isPresent(React.useContext(PresenceContext)); -} -function isPresent(context) { - return context === null ? true : context.isPresent; -} -function shallowCompare(next, prev) { - if (!Array.isArray(prev)) return false; - var prevLength = prev.length; - if (prevLength !== next.length) return false; - for (var i = 0; i < prevLength; i++) { - if (prev[i] !== next[i]) return false; - } - return true; -} - -/** - * Converts seconds to milliseconds - * - * @param seconds - Time in seconds. - * @return milliseconds - Converted time in milliseconds. - */ -var secondsToMilliseconds = function (seconds) { - return seconds * 1000; -}; -var easingLookup = { - linear: popmotion.linear, - easeIn: popmotion.easeIn, - easeInOut: popmotion.easeInOut, - easeOut: popmotion.easeOut, - circIn: popmotion.circIn, - circInOut: popmotion.circInOut, - circOut: popmotion.circOut, - backIn: popmotion.backIn, - backInOut: popmotion.backInOut, - backOut: popmotion.backOut, - anticipate: popmotion.anticipate, - bounceIn: popmotion.bounceIn, - bounceInOut: popmotion.bounceInOut, - bounceOut: popmotion.bounceOut -}; -var easingDefinitionToFunction = function (definition) { - if (Array.isArray(definition)) { - // If cubic bezier definition, create bezier curve - heyListen.invariant(definition.length === 4, "Cubic bezier arrays must contain four numerical values."); - var _a = tslib.__read(definition, 4), - x1 = _a[0], - y1 = _a[1], - x2 = _a[2], - y2 = _a[3]; - return popmotion.cubicBezier(x1, y1, x2, y2); - } else if (typeof definition === "string") { - // Else lookup from table - heyListen.invariant(easingLookup[definition] !== undefined, "Invalid easing type '".concat(definition, "'")); - return easingLookup[definition]; - } - return definition; -}; -var isEasingArray = function (ease) { - return Array.isArray(ease) && typeof ease[0] !== "number"; -}; - -/** - * Check if a value is animatable. Examples: - * - * ✅: 100, "100px", "#fff" - * ❌: "block", "url(2.jpg)" - * @param value - * - * @internal - */ -var isAnimatable = function (key, value) { - // If the list of keys tat might be non-animatable grows, replace with Set - if (key === "zIndex") return false; - // If it's a number or a keyframes array, we can animate it. We might at some point - // need to do a deep isAnimatable check of keyframes, or let Popmotion handle this, - // but for now lets leave it like this for performance reasons - if (typeof value === "number" || Array.isArray(value)) return true; - if (typeof value === "string" && - // It's animatable if we have a string - styleValueTypes.complex.test(value) && - // And it contains numbers and/or colors - !value.startsWith("url(") // Unless it starts with "url(" - ) { - return true; - } - return false; -}; -var underDampedSpring = function () { - return { - type: "spring", - stiffness: 500, - damping: 25, - restSpeed: 10 - }; -}; -var criticallyDampedSpring = function (to) { - return { - type: "spring", - stiffness: 550, - damping: to === 0 ? 2 * Math.sqrt(550) : 30, - restSpeed: 10 - }; -}; -var linearTween = function () { - return { - type: "keyframes", - ease: "linear", - duration: 0.3 - }; -}; -var keyframes = function (values) { - return { - type: "keyframes", - duration: 0.8, - values: values - }; -}; -var defaultTransitions = { - x: underDampedSpring, - y: underDampedSpring, - z: underDampedSpring, - rotate: underDampedSpring, - rotateX: underDampedSpring, - rotateY: underDampedSpring, - rotateZ: underDampedSpring, - scaleX: criticallyDampedSpring, - scaleY: criticallyDampedSpring, - scale: criticallyDampedSpring, - opacity: linearTween, - backgroundColor: linearTween, - color: linearTween, - default: criticallyDampedSpring -}; -var getDefaultTransition = function (valueKey, to) { - var transitionFactory; - if (isKeyframesTarget(to)) { - transitionFactory = keyframes; - } else { - transitionFactory = defaultTransitions[valueKey] || defaultTransitions.default; - } - return tslib.__assign({ - to: to - }, transitionFactory(to)); -}; - -/** - * A map of default value types for common values - */ -var defaultValueTypes = tslib.__assign(tslib.__assign({}, numberValueTypes), { - // Color props - color: styleValueTypes.color, - backgroundColor: styleValueTypes.color, - outlineColor: styleValueTypes.color, - fill: styleValueTypes.color, - stroke: styleValueTypes.color, - // Border props - borderColor: styleValueTypes.color, - borderTopColor: styleValueTypes.color, - borderRightColor: styleValueTypes.color, - borderBottomColor: styleValueTypes.color, - borderLeftColor: styleValueTypes.color, - filter: styleValueTypes.filter, - WebkitFilter: styleValueTypes.filter -}); -/** - * Gets the default ValueType for the provided value key - */ -var getDefaultValueType = function (key) { - return defaultValueTypes[key]; -}; -function getAnimatableNone(key, value) { - var _a; - var defaultValueType = getDefaultValueType(key); - if (defaultValueType !== styleValueTypes.filter) defaultValueType = styleValueTypes.complex; - // If value is not recognised as animatable, ie "none", create an animatable version origin based on the target - return (_a = defaultValueType.getAnimatableNone) === null || _a === void 0 ? void 0 : _a.call(defaultValueType, value); -} -var instantAnimationState = { - current: false -}; - -/** - * Decide whether a transition is defined on a given Transition. - * This filters out orchestration options and returns true - * if any options are left. - */ -function isTransitionDefined(_a) { - _a.when; - _a.delay; - _a.delayChildren; - _a.staggerChildren; - _a.staggerDirection; - _a.repeat; - _a.repeatType; - _a.repeatDelay; - _a.from; - var transition = tslib.__rest(_a, ["when", "delay", "delayChildren", "staggerChildren", "staggerDirection", "repeat", "repeatType", "repeatDelay", "from"]); - return !!Object.keys(transition).length; -} -var legacyRepeatWarning = false; -/** - * Convert Framer Motion's Transition type into Popmotion-compatible options. - */ -function convertTransitionToAnimationOptions(_a) { - var ease = _a.ease, - times = _a.times, - yoyo = _a.yoyo, - flip = _a.flip, - loop = _a.loop, - transition = tslib.__rest(_a, ["ease", "times", "yoyo", "flip", "loop"]); - var options = tslib.__assign({}, transition); - if (times) options["offset"] = times; - /** - * Convert any existing durations from seconds to milliseconds - */ - if (transition.duration) options["duration"] = secondsToMilliseconds(transition.duration); - if (transition.repeatDelay) options.repeatDelay = secondsToMilliseconds(transition.repeatDelay); - /** - * Map easing names to Popmotion's easing functions - */ - if (ease) { - options["ease"] = isEasingArray(ease) ? ease.map(easingDefinitionToFunction) : easingDefinitionToFunction(ease); - } - /** - * Support legacy transition API - */ - if (transition.type === "tween") options.type = "keyframes"; - /** - * TODO: These options are officially removed from the API. - */ - if (yoyo || loop || flip) { - heyListen.warning(!legacyRepeatWarning, "yoyo, loop and flip have been removed from the API. Replace with repeat and repeatType options."); - legacyRepeatWarning = true; - if (yoyo) { - options.repeatType = "reverse"; - } else if (loop) { - options.repeatType = "loop"; - } else if (flip) { - options.repeatType = "mirror"; - } - options.repeat = loop || yoyo || flip || transition.repeat; - } - /** - * TODO: Popmotion 9 has the ability to automatically detect whether to use - * a keyframes or spring animation, but does so by detecting velocity and other spring options. - * It'd be good to introduce a similar thing here. - */ - if (transition.type !== "spring") options.type = "keyframes"; - return options; -} -/** - * Get the delay for a value by checking Transition with decreasing specificity. - */ -function getDelayFromTransition(transition, key) { - var _a, _b; - var valueTransition = getValueTransition(transition, key) || {}; - return (_b = (_a = valueTransition.delay) !== null && _a !== void 0 ? _a : transition.delay) !== null && _b !== void 0 ? _b : 0; -} -function hydrateKeyframes(options) { - if (Array.isArray(options.to) && options.to[0] === null) { - options.to = tslib.__spreadArray([], tslib.__read(options.to), false); - options.to[0] = options.from; - } - return options; -} -function getPopmotionAnimationOptions(transition, options, key) { - var _a; - if (Array.isArray(options.to)) { - (_a = transition.duration) !== null && _a !== void 0 ? _a : transition.duration = 0.8; - } - hydrateKeyframes(options); - /** - * Get a default transition if none is determined to be defined. - */ - if (!isTransitionDefined(transition)) { - transition = tslib.__assign(tslib.__assign({}, transition), getDefaultTransition(key, options.to)); - } - return tslib.__assign(tslib.__assign({}, options), convertTransitionToAnimationOptions(transition)); -} -/** - * - */ -function getAnimation(key, value, target, transition, onComplete) { - var _a; - var valueTransition = getValueTransition(transition, key); - var origin = (_a = valueTransition.from) !== null && _a !== void 0 ? _a : value.get(); - var isTargetAnimatable = isAnimatable(key, target); - if (origin === "none" && isTargetAnimatable && typeof target === "string") { - /** - * If we're trying to animate from "none", try and get an animatable version - * of the target. This could be improved to work both ways. - */ - origin = getAnimatableNone(key, target); - } else if (isZero(origin) && typeof target === "string") { - origin = getZeroUnit(target); - } else if (!Array.isArray(target) && isZero(target) && typeof origin === "string") { - target = getZeroUnit(origin); - } - var isOriginAnimatable = isAnimatable(key, origin); - heyListen.warning(isOriginAnimatable === isTargetAnimatable, "You are trying to animate ".concat(key, " from \"").concat(origin, "\" to \"").concat(target, "\". ").concat(origin, " is not an animatable value - to enable this animation set ").concat(origin, " to a value animatable to ").concat(target, " via the `style` property.")); - function start() { - var options = { - from: origin, - to: target, - velocity: value.getVelocity(), - onComplete: onComplete, - onUpdate: function (v) { - return value.set(v); - } - }; - return valueTransition.type === "inertia" || valueTransition.type === "decay" ? popmotion.inertia(tslib.__assign(tslib.__assign({}, options), valueTransition)) : popmotion.animate(tslib.__assign(tslib.__assign({}, getPopmotionAnimationOptions(valueTransition, options, key)), { - onUpdate: function (v) { - var _a; - options.onUpdate(v); - (_a = valueTransition.onUpdate) === null || _a === void 0 ? void 0 : _a.call(valueTransition, v); - }, - onComplete: function () { - var _a; - options.onComplete(); - (_a = valueTransition.onComplete) === null || _a === void 0 ? void 0 : _a.call(valueTransition); - } - })); - } - function set() { - var _a, _b; - var finalTarget = resolveFinalValueInKeyframes(target); - value.set(finalTarget); - onComplete(); - (_a = valueTransition === null || valueTransition === void 0 ? void 0 : valueTransition.onUpdate) === null || _a === void 0 ? void 0 : _a.call(valueTransition, finalTarget); - (_b = valueTransition === null || valueTransition === void 0 ? void 0 : valueTransition.onComplete) === null || _b === void 0 ? void 0 : _b.call(valueTransition); - return { - stop: function () {} - }; - } - return !isOriginAnimatable || !isTargetAnimatable || valueTransition.type === false ? set : start; -} -function isZero(value) { - return value === 0 || typeof value === "string" && parseFloat(value) === 0 && value.indexOf(" ") === -1; -} -function getZeroUnit(potentialUnitType) { - return typeof potentialUnitType === "number" ? 0 : getAnimatableNone("", potentialUnitType); -} -function getValueTransition(transition, key) { - return transition[key] || transition["default"] || transition; -} -/** - * Start animation on a MotionValue. This function is an interface between - * Framer Motion and Popmotion - */ -function startAnimation(key, value, target, transition) { - if (transition === void 0) { - transition = {}; - } - if (instantAnimationState.current) { - transition = { - type: false - }; - } - return value.start(function (onComplete) { - var delayTimer; - var controls; - var animation = getAnimation(key, value, target, transition, onComplete); - var delay = getDelayFromTransition(transition, key); - var start = function () { - return controls = animation(); - }; - if (delay) { - delayTimer = window.setTimeout(start, secondsToMilliseconds(delay)); - } else { - start(); - } - return function () { - clearTimeout(delayTimer); - controls === null || controls === void 0 ? void 0 : controls.stop(); - }; - }); -} - -/** - * Check if value is a numerical string, ie a string that is purely a number eg "100" or "-100.1" - */ -var isNumericalString = function (v) { - return /^\-?\d*\.?\d+$/.test(v); -}; - -/** - * Check if the value is a zero value string like "0px" or "0%" - */ -var isZeroValueString = function (v) { - return /^0[^.\s]+$/.test(v); -}; -function addUniqueItem(arr, item) { - arr.indexOf(item) === -1 && arr.push(item); -} -function removeItem(arr, item) { - var index = arr.indexOf(item); - index > -1 && arr.splice(index, 1); -} -// Adapted from array-move -function moveItem(_a, fromIndex, toIndex) { - var _b = tslib.__read(_a), - arr = _b.slice(0); - var startIndex = fromIndex < 0 ? arr.length + fromIndex : fromIndex; - if (startIndex >= 0 && startIndex < arr.length) { - var endIndex = toIndex < 0 ? arr.length + toIndex : toIndex; - var _c = tslib.__read(arr.splice(fromIndex, 1), 1), - item = _c[0]; - arr.splice(endIndex, 0, item); - } - return arr; -} -var SubscriptionManager = /** @class */function () { - function SubscriptionManager() { - this.subscriptions = []; - } - SubscriptionManager.prototype.add = function (handler) { - var _this = this; - addUniqueItem(this.subscriptions, handler); - return function () { - return removeItem(_this.subscriptions, handler); - }; - }; - SubscriptionManager.prototype.notify = function (a, b, c) { - var numSubscriptions = this.subscriptions.length; - if (!numSubscriptions) return; - if (numSubscriptions === 1) { - /** - * If there's only a single handler we can just call it without invoking a loop. - */ - this.subscriptions[0](a, b, c); - } else { - for (var i = 0; i < numSubscriptions; i++) { - /** - * Check whether the handler exists before firing as it's possible - * the subscriptions were modified during this loop running. - */ - var handler = this.subscriptions[i]; - handler && handler(a, b, c); - } - } - }; - SubscriptionManager.prototype.getSize = function () { - return this.subscriptions.length; - }; - SubscriptionManager.prototype.clear = function () { - this.subscriptions.length = 0; - }; - return SubscriptionManager; -}(); -var isFloat = function (value) { - return !isNaN(parseFloat(value)); -}; -/** - * `MotionValue` is used to track the state and velocity of motion values. - * - * @public - */ -var MotionValue = /** @class */function () { - /** - * @param init - The initiating value - * @param config - Optional configuration options - * - * - `transformer`: A function to transform incoming values with. - * - * @internal - */ - function MotionValue(init) { - var _this = this; - /** - * This will be replaced by the build step with the latest version number. - * When MotionValues are provided to motion components, warn if versions are mixed. - */ - this.version = "6.5.1"; - /** - * Duration, in milliseconds, since last updating frame. - * - * @internal - */ - this.timeDelta = 0; - /** - * Timestamp of the last time this `MotionValue` was updated. - * - * @internal - */ - this.lastUpdated = 0; - /** - * Functions to notify when the `MotionValue` updates. - * - * @internal - */ - this.updateSubscribers = new SubscriptionManager(); - /** - * Functions to notify when the velocity updates. - * - * @internal - */ - this.velocityUpdateSubscribers = new SubscriptionManager(); - /** - * Functions to notify when the `MotionValue` updates and `render` is set to `true`. - * - * @internal - */ - this.renderSubscribers = new SubscriptionManager(); - /** - * Tracks whether this value can output a velocity. Currently this is only true - * if the value is numerical, but we might be able to widen the scope here and support - * other value types. - * - * @internal - */ - this.canTrackVelocity = false; - this.updateAndNotify = function (v, render) { - if (render === void 0) { - render = true; - } - _this.prev = _this.current; - _this.current = v; - // Update timestamp - var _a = sync.getFrameData(), - delta = _a.delta, - timestamp = _a.timestamp; - if (_this.lastUpdated !== timestamp) { - _this.timeDelta = delta; - _this.lastUpdated = timestamp; - sync__default["default"].postRender(_this.scheduleVelocityCheck); - } - // Update update subscribers - if (_this.prev !== _this.current) { - _this.updateSubscribers.notify(_this.current); - } - // Update velocity subscribers - if (_this.velocityUpdateSubscribers.getSize()) { - _this.velocityUpdateSubscribers.notify(_this.getVelocity()); - } - // Update render subscribers - if (render) { - _this.renderSubscribers.notify(_this.current); - } - }; - /** - * Schedule a velocity check for the next frame. - * - * This is an instanced and bound function to prevent generating a new - * function once per frame. - * - * @internal - */ - this.scheduleVelocityCheck = function () { - return sync__default["default"].postRender(_this.velocityCheck); - }; - /** - * Updates `prev` with `current` if the value hasn't been updated this frame. - * This ensures velocity calculations return `0`. - * - * This is an instanced and bound function to prevent generating a new - * function once per frame. - * - * @internal - */ - this.velocityCheck = function (_a) { - var timestamp = _a.timestamp; - if (timestamp !== _this.lastUpdated) { - _this.prev = _this.current; - _this.velocityUpdateSubscribers.notify(_this.getVelocity()); - } - }; - this.hasAnimated = false; - this.prev = this.current = init; - this.canTrackVelocity = isFloat(this.current); - } - /** - * Adds a function that will be notified when the `MotionValue` is updated. - * - * It returns a function that, when called, will cancel the subscription. - * - * When calling `onChange` inside a React component, it should be wrapped with the - * `useEffect` hook. As it returns an unsubscribe function, this should be returned - * from the `useEffect` function to ensure you don't add duplicate subscribers.. - * - * ```jsx - * export const MyComponent = () => { - * const x = useMotionValue(0) - * const y = useMotionValue(0) - * const opacity = useMotionValue(1) - * - * useEffect(() => { - * function updateOpacity() { - * const maxXY = Math.max(x.get(), y.get()) - * const newOpacity = transform(maxXY, [0, 100], [1, 0]) - * opacity.set(newOpacity) - * } - * - * const unsubscribeX = x.onChange(updateOpacity) - * const unsubscribeY = y.onChange(updateOpacity) - * - * return () => { - * unsubscribeX() - * unsubscribeY() - * } - * }, []) - * - * return - * } - * ``` - * - * @privateRemarks - * - * We could look into a `useOnChange` hook if the above lifecycle management proves confusing. - * - * ```jsx - * useOnChange(x, () => {}) - * ``` - * - * @param subscriber - A function that receives the latest value. - * @returns A function that, when called, will cancel this subscription. - * - * @public - */ - MotionValue.prototype.onChange = function (subscription) { - return this.updateSubscribers.add(subscription); - }; - MotionValue.prototype.clearListeners = function () { - this.updateSubscribers.clear(); - }; - /** - * Adds a function that will be notified when the `MotionValue` requests a render. - * - * @param subscriber - A function that's provided the latest value. - * @returns A function that, when called, will cancel this subscription. - * - * @internal - */ - MotionValue.prototype.onRenderRequest = function (subscription) { - // Render immediately - subscription(this.get()); - return this.renderSubscribers.add(subscription); - }; - /** - * Attaches a passive effect to the `MotionValue`. - * - * @internal - */ - MotionValue.prototype.attach = function (passiveEffect) { - this.passiveEffect = passiveEffect; - }; - /** - * Sets the state of the `MotionValue`. - * - * @remarks - * - * ```jsx - * const x = useMotionValue(0) - * x.set(10) - * ``` - * - * @param latest - Latest value to set. - * @param render - Whether to notify render subscribers. Defaults to `true` - * - * @public - */ - MotionValue.prototype.set = function (v, render) { - if (render === void 0) { - render = true; - } - if (!render || !this.passiveEffect) { - this.updateAndNotify(v, render); - } else { - this.passiveEffect(v, this.updateAndNotify); - } - }; - /** - * Returns the latest state of `MotionValue` - * - * @returns - The latest state of `MotionValue` - * - * @public - */ - MotionValue.prototype.get = function () { - return this.current; - }; - /** - * @public - */ - MotionValue.prototype.getPrevious = function () { - return this.prev; - }; - /** - * Returns the latest velocity of `MotionValue` - * - * @returns - The latest velocity of `MotionValue`. Returns `0` if the state is non-numerical. - * - * @public - */ - MotionValue.prototype.getVelocity = function () { - // This could be isFloat(this.prev) && isFloat(this.current), but that would be wasteful - return this.canTrackVelocity ? - // These casts could be avoided if parseFloat would be typed better - popmotion.velocityPerSecond(parseFloat(this.current) - parseFloat(this.prev), this.timeDelta) : 0; - }; - /** - * Registers a new animation to control this `MotionValue`. Only one - * animation can drive a `MotionValue` at one time. - * - * ```jsx - * value.start() - * ``` - * - * @param animation - A function that starts the provided animation - * - * @internal - */ - MotionValue.prototype.start = function (animation) { - var _this = this; - this.stop(); - return new Promise(function (resolve) { - _this.hasAnimated = true; - _this.stopAnimation = animation(resolve); - }).then(function () { - return _this.clearAnimation(); - }); - }; - /** - * Stop the currently active animation. - * - * @public - */ - MotionValue.prototype.stop = function () { - if (this.stopAnimation) this.stopAnimation(); - this.clearAnimation(); - }; - /** - * Returns `true` if this value is currently animating. - * - * @public - */ - MotionValue.prototype.isAnimating = function () { - return !!this.stopAnimation; - }; - MotionValue.prototype.clearAnimation = function () { - this.stopAnimation = null; - }; - /** - * Destroy and clean up subscribers to this `MotionValue`. - * - * The `MotionValue` hooks like `useMotionValue` and `useTransform` automatically - * handle the lifecycle of the returned `MotionValue`, so this method is only necessary if you've manually - * created a `MotionValue` via the `motionValue` function. - * - * @public - */ - MotionValue.prototype.destroy = function () { - this.updateSubscribers.clear(); - this.renderSubscribers.clear(); - this.stop(); - }; - return MotionValue; -}(); -function motionValue(init) { - return new MotionValue(init); -} - -/** - * Tests a provided value against a ValueType - */ -var testValueType = function (v) { - return function (type) { - return type.test(v); - }; -}; - -/** - * ValueType for "auto" - */ -var auto = { - test: function (v) { - return v === "auto"; - }, - parse: function (v) { - return v; - } -}; - -/** - * A list of value types commonly used for dimensions - */ -var dimensionValueTypes = [styleValueTypes.number, styleValueTypes.px, styleValueTypes.percent, styleValueTypes.degrees, styleValueTypes.vw, styleValueTypes.vh, auto]; -/** - * Tests a dimensional value against the list of dimension ValueTypes - */ -var findDimensionValueType = function (v) { - return dimensionValueTypes.find(testValueType(v)); -}; - -/** - * A list of all ValueTypes - */ -var valueTypes = tslib.__spreadArray(tslib.__spreadArray([], tslib.__read(dimensionValueTypes), false), [styleValueTypes.color, styleValueTypes.complex], false); -/** - * Tests a value against the list of ValueTypes - */ -var findValueType = function (v) { - return valueTypes.find(testValueType(v)); -}; - -/** - * Set VisualElement's MotionValue, creating a new MotionValue for it if - * it doesn't exist. - */ -function setMotionValue(visualElement, key, value) { - if (visualElement.hasValue(key)) { - visualElement.getValue(key).set(value); - } else { - visualElement.addValue(key, motionValue(value)); - } -} -function setTarget(visualElement, definition) { - var resolved = resolveVariant(visualElement, definition); - var _a = resolved ? visualElement.makeTargetAnimatable(resolved, false) : {}, - _b = _a.transitionEnd, - transitionEnd = _b === void 0 ? {} : _b; - _a.transition; - var target = tslib.__rest(_a, ["transitionEnd", "transition"]); - target = tslib.__assign(tslib.__assign({}, target), transitionEnd); - for (var key in target) { - var value = resolveFinalValueInKeyframes(target[key]); - setMotionValue(visualElement, key, value); - } -} -function setVariants(visualElement, variantLabels) { - var reversedLabels = tslib.__spreadArray([], tslib.__read(variantLabels), false).reverse(); - reversedLabels.forEach(function (key) { - var _a; - var variant = visualElement.getVariant(key); - variant && setTarget(visualElement, variant); - (_a = visualElement.variantChildren) === null || _a === void 0 ? void 0 : _a.forEach(function (child) { - setVariants(child, variantLabels); - }); - }); -} -function setValues(visualElement, definition) { - if (Array.isArray(definition)) { - return setVariants(visualElement, definition); - } else if (typeof definition === "string") { - return setVariants(visualElement, [definition]); - } else { - setTarget(visualElement, definition); - } -} -function checkTargetForNewValues(visualElement, target, origin) { - var _a, _b, _c; - var _d; - var newValueKeys = Object.keys(target).filter(function (key) { - return !visualElement.hasValue(key); - }); - var numNewValues = newValueKeys.length; - if (!numNewValues) return; - for (var i = 0; i < numNewValues; i++) { - var key = newValueKeys[i]; - var targetValue = target[key]; - var value = null; - /** - * If the target is a series of keyframes, we can use the first value - * in the array. If this first value is null, we'll still need to read from the DOM. - */ - if (Array.isArray(targetValue)) { - value = targetValue[0]; - } - /** - * If the target isn't keyframes, or the first keyframe was null, we need to - * first check if an origin value was explicitly defined in the transition as "from", - * if not read the value from the DOM. As an absolute fallback, take the defined target value. - */ - if (value === null) { - value = (_b = (_a = origin[key]) !== null && _a !== void 0 ? _a : visualElement.readValue(key)) !== null && _b !== void 0 ? _b : target[key]; - } - /** - * If value is still undefined or null, ignore it. Preferably this would throw, - * but this was causing issues in Framer. - */ - if (value === undefined || value === null) continue; - if (typeof value === "string" && (isNumericalString(value) || isZeroValueString(value))) { - // If this is a number read as a string, ie "0" or "200", convert it to a number - value = parseFloat(value); - } else if (!findValueType(value) && styleValueTypes.complex.test(targetValue)) { - value = getAnimatableNone(key, targetValue); - } - visualElement.addValue(key, motionValue(value)); - (_c = (_d = origin)[key]) !== null && _c !== void 0 ? _c : _d[key] = value; - visualElement.setBaseTarget(key, value); - } -} -function getOriginFromTransition(key, transition) { - if (!transition) return; - var valueTransition = transition[key] || transition["default"] || transition; - return valueTransition.from; -} -function getOrigin(target, transition, visualElement) { - var _a, _b; - var origin = {}; - for (var key in target) { - origin[key] = (_a = getOriginFromTransition(key, transition)) !== null && _a !== void 0 ? _a : (_b = visualElement.getValue(key)) === null || _b === void 0 ? void 0 : _b.get(); - } - return origin; -} -function animateVisualElement(visualElement, definition, options) { - if (options === void 0) { - options = {}; - } - visualElement.notifyAnimationStart(definition); - var animation; - if (Array.isArray(definition)) { - var animations = definition.map(function (variant) { - return animateVariant(visualElement, variant, options); - }); - animation = Promise.all(animations); - } else if (typeof definition === "string") { - animation = animateVariant(visualElement, definition, options); - } else { - var resolvedDefinition = typeof definition === "function" ? resolveVariant(visualElement, definition, options.custom) : definition; - animation = animateTarget(visualElement, resolvedDefinition, options); - } - return animation.then(function () { - return visualElement.notifyAnimationComplete(definition); - }); -} -function animateVariant(visualElement, variant, options) { - var _a; - if (options === void 0) { - options = {}; - } - var resolved = resolveVariant(visualElement, variant, options.custom); - var _b = (resolved || {}).transition, - transition = _b === void 0 ? visualElement.getDefaultTransition() || {} : _b; - if (options.transitionOverride) { - transition = options.transitionOverride; - } - /** - * If we have a variant, create a callback that runs it as an animation. - * Otherwise, we resolve a Promise immediately for a composable no-op. - */ - var getAnimation = resolved ? function () { - return animateTarget(visualElement, resolved, options); - } : function () { - return Promise.resolve(); - }; - /** - * If we have children, create a callback that runs all their animations. - * Otherwise, we resolve a Promise immediately for a composable no-op. - */ - var getChildAnimations = ((_a = visualElement.variantChildren) === null || _a === void 0 ? void 0 : _a.size) ? function (forwardDelay) { - if (forwardDelay === void 0) { - forwardDelay = 0; - } - var _a = transition.delayChildren, - delayChildren = _a === void 0 ? 0 : _a, - staggerChildren = transition.staggerChildren, - staggerDirection = transition.staggerDirection; - return animateChildren(visualElement, variant, delayChildren + forwardDelay, staggerChildren, staggerDirection, options); - } : function () { - return Promise.resolve(); - }; - /** - * If the transition explicitly defines a "when" option, we need to resolve either - * this animation or all children animations before playing the other. - */ - var when = transition.when; - if (when) { - var _c = tslib.__read(when === "beforeChildren" ? [getAnimation, getChildAnimations] : [getChildAnimations, getAnimation], 2), - first = _c[0], - last = _c[1]; - return first().then(last); - } else { - return Promise.all([getAnimation(), getChildAnimations(options.delay)]); - } -} -/** - * @internal - */ -function animateTarget(visualElement, definition, _a) { - var _b; - var _c = _a === void 0 ? {} : _a, - _d = _c.delay, - delay = _d === void 0 ? 0 : _d, - transitionOverride = _c.transitionOverride, - type = _c.type; - var _e = visualElement.makeTargetAnimatable(definition), - _f = _e.transition, - transition = _f === void 0 ? visualElement.getDefaultTransition() : _f, - transitionEnd = _e.transitionEnd, - target = tslib.__rest(_e, ["transition", "transitionEnd"]); - if (transitionOverride) transition = transitionOverride; - var animations = []; - var animationTypeState = type && ((_b = visualElement.animationState) === null || _b === void 0 ? void 0 : _b.getState()[type]); - for (var key in target) { - var value = visualElement.getValue(key); - var valueTarget = target[key]; - if (!value || valueTarget === undefined || animationTypeState && shouldBlockAnimation(animationTypeState, key)) { - continue; - } - var valueTransition = tslib.__assign({ - delay: delay - }, transition); - /** - * Make animation instant if this is a transform prop and we should reduce motion. - */ - if (visualElement.shouldReduceMotion && isTransformProp(key)) { - valueTransition = tslib.__assign(tslib.__assign({}, valueTransition), { - type: false, - delay: 0 - }); - } - var animation = startAnimation(key, value, valueTarget, valueTransition); - animations.push(animation); - } - return Promise.all(animations).then(function () { - transitionEnd && setTarget(visualElement, transitionEnd); - }); -} -function animateChildren(visualElement, variant, delayChildren, staggerChildren, staggerDirection, options) { - if (delayChildren === void 0) { - delayChildren = 0; - } - if (staggerChildren === void 0) { - staggerChildren = 0; - } - if (staggerDirection === void 0) { - staggerDirection = 1; - } - var animations = []; - var maxStaggerDuration = (visualElement.variantChildren.size - 1) * staggerChildren; - var generateStaggerDuration = staggerDirection === 1 ? function (i) { - if (i === void 0) { - i = 0; - } - return i * staggerChildren; - } : function (i) { - if (i === void 0) { - i = 0; - } - return maxStaggerDuration - i * staggerChildren; - }; - Array.from(visualElement.variantChildren).sort(sortByTreeOrder).forEach(function (child, i) { - animations.push(animateVariant(child, variant, tslib.__assign(tslib.__assign({}, options), { - delay: delayChildren + generateStaggerDuration(i) - })).then(function () { - return child.notifyAnimationComplete(variant); - })); - }); - return Promise.all(animations); -} -function stopAnimation(visualElement) { - visualElement.forEachValue(function (value) { - return value.stop(); - }); -} -function sortByTreeOrder(a, b) { - return a.sortNodePosition(b); -} -/** - * Decide whether we should block this animation. Previously, we achieved this - * just by checking whether the key was listed in protectedKeys, but this - * posed problems if an animation was triggered by afterChildren and protectedKeys - * had been set to true in the meantime. - */ -function shouldBlockAnimation(_a, key) { - var protectedKeys = _a.protectedKeys, - needsAnimating = _a.needsAnimating; - var shouldBlock = protectedKeys.hasOwnProperty(key) && needsAnimating[key] !== true; - needsAnimating[key] = false; - return shouldBlock; -} -var variantPriorityOrder = [exports.AnimationType.Animate, exports.AnimationType.InView, exports.AnimationType.Focus, exports.AnimationType.Hover, exports.AnimationType.Tap, exports.AnimationType.Drag, exports.AnimationType.Exit]; -var reversePriorityOrder = tslib.__spreadArray([], tslib.__read(variantPriorityOrder), false).reverse(); -var numAnimationTypes = variantPriorityOrder.length; -function animateList(visualElement) { - return function (animations) { - return Promise.all(animations.map(function (_a) { - var animation = _a.animation, - options = _a.options; - return animateVisualElement(visualElement, animation, options); - })); - }; -} -function createAnimationState(visualElement) { - var animate = animateList(visualElement); - var state = createState(); - var allAnimatedKeys = {}; - var isInitialRender = true; - /** - * This function will be used to reduce the animation definitions for - * each active animation type into an object of resolved values for it. - */ - var buildResolvedTypeValues = function (acc, definition) { - var resolved = resolveVariant(visualElement, definition); - if (resolved) { - resolved.transition; - var transitionEnd = resolved.transitionEnd, - target = tslib.__rest(resolved, ["transition", "transitionEnd"]); - acc = tslib.__assign(tslib.__assign(tslib.__assign({}, acc), target), transitionEnd); - } - return acc; - }; - function isAnimated(key) { - return allAnimatedKeys[key] !== undefined; - } - /** - * This just allows us to inject mocked animation functions - * @internal - */ - function setAnimateFunction(makeAnimator) { - animate = makeAnimator(visualElement); - } - /** - * When we receive new props, we need to: - * 1. Create a list of protected keys for each type. This is a directory of - * value keys that are currently being "handled" by types of a higher priority - * so that whenever an animation is played of a given type, these values are - * protected from being animated. - * 2. Determine if an animation type needs animating. - * 3. Determine if any values have been removed from a type and figure out - * what to animate those to. - */ - function animateChanges(options, changedActiveType) { - var _a; - var props = visualElement.getProps(); - var context = visualElement.getVariantContext(true) || {}; - /** - * A list of animations that we'll build into as we iterate through the animation - * types. This will get executed at the end of the function. - */ - var animations = []; - /** - * Keep track of which values have been removed. Then, as we hit lower priority - * animation types, we can check if they contain removed values and animate to that. - */ - var removedKeys = new Set(); - /** - * A dictionary of all encountered keys. This is an object to let us build into and - * copy it without iteration. Each time we hit an animation type we set its protected - * keys - the keys its not allowed to animate - to the latest version of this object. - */ - var encounteredKeys = {}; - /** - * If a variant has been removed at a given index, and this component is controlling - * variant animations, we want to ensure lower-priority variants are forced to animate. - */ - var removedVariantIndex = Infinity; - var _loop_1 = function (i) { - var type = reversePriorityOrder[i]; - var typeState = state[type]; - var prop = (_a = props[type]) !== null && _a !== void 0 ? _a : context[type]; - var propIsVariant = isVariantLabel(prop); - /** - * If this type has *just* changed isActive status, set activeDelta - * to that status. Otherwise set to null. - */ - var activeDelta = type === changedActiveType ? typeState.isActive : null; - if (activeDelta === false) removedVariantIndex = i; - /** - * If this prop is an inherited variant, rather than been set directly on the - * component itself, we want to make sure we allow the parent to trigger animations. - * - * TODO: Can probably change this to a !isControllingVariants check - */ - var isInherited = prop === context[type] && prop !== props[type] && propIsVariant; - /** - * - */ - if (isInherited && isInitialRender && visualElement.manuallyAnimateOnMount) { - isInherited = false; - } - /** - * Set all encountered keys so far as the protected keys for this type. This will - * be any key that has been animated or otherwise handled by active, higher-priortiy types. - */ - typeState.protectedKeys = tslib.__assign({}, encounteredKeys); - // Check if we can skip analysing this prop early - if ( - // If it isn't active and hasn't *just* been set as inactive - !typeState.isActive && activeDelta === null || - // If we didn't and don't have any defined prop for this animation type - !prop && !typeState.prevProp || - // Or if the prop doesn't define an animation - isAnimationControls(prop) || typeof prop === "boolean") { - return "continue"; - } - /** - * As we go look through the values defined on this type, if we detect - * a changed value or a value that was removed in a higher priority, we set - * this to true and add this prop to the animation list. - */ - var variantDidChange = checkVariantsDidChange(typeState.prevProp, prop); - var shouldAnimateType = variantDidChange || - // If we're making this variant active, we want to always make it active - type === changedActiveType && typeState.isActive && !isInherited && propIsVariant || - // If we removed a higher-priority variant (i is in reverse order) - i > removedVariantIndex && propIsVariant; - /** - * As animations can be set as variant lists, variants or target objects, we - * coerce everything to an array if it isn't one already - */ - var definitionList = Array.isArray(prop) ? prop : [prop]; - /** - * Build an object of all the resolved values. We'll use this in the subsequent - * animateChanges calls to determine whether a value has changed. - */ - var resolvedValues = definitionList.reduce(buildResolvedTypeValues, {}); - if (activeDelta === false) resolvedValues = {}; - /** - * Now we need to loop through all the keys in the prev prop and this prop, - * and decide: - * 1. If the value has changed, and needs animating - * 2. If it has been removed, and needs adding to the removedKeys set - * 3. If it has been removed in a higher priority type and needs animating - * 4. If it hasn't been removed in a higher priority but hasn't changed, and - * needs adding to the type's protectedKeys list. - */ - var _b = typeState.prevResolvedValues, - prevResolvedValues = _b === void 0 ? {} : _b; - var allKeys = tslib.__assign(tslib.__assign({}, prevResolvedValues), resolvedValues); - var markToAnimate = function (key) { - shouldAnimateType = true; - removedKeys.delete(key); - typeState.needsAnimating[key] = true; - }; - for (var key in allKeys) { - var next = resolvedValues[key]; - var prev = prevResolvedValues[key]; - // If we've already handled this we can just skip ahead - if (encounteredKeys.hasOwnProperty(key)) continue; - /** - * If the value has changed, we probably want to animate it. - */ - if (next !== prev) { - /** - * If both values are keyframes, we need to shallow compare them to - * detect whether any value has changed. If it has, we animate it. - */ - if (isKeyframesTarget(next) && isKeyframesTarget(prev)) { - if (!shallowCompare(next, prev) || variantDidChange) { - markToAnimate(key); - } else { - /** - * If it hasn't changed, we want to ensure it doesn't animate by - * adding it to the list of protected keys. - */ - typeState.protectedKeys[key] = true; - } - } else if (next !== undefined) { - // If next is defined and doesn't equal prev, it needs animating - markToAnimate(key); - } else { - // If it's undefined, it's been removed. - removedKeys.add(key); - } - } else if (next !== undefined && removedKeys.has(key)) { - /** - * If next hasn't changed and it isn't undefined, we want to check if it's - * been removed by a higher priority - */ - markToAnimate(key); - } else { - /** - * If it hasn't changed, we add it to the list of protected values - * to ensure it doesn't get animated. - */ - typeState.protectedKeys[key] = true; - } - } - /** - * Update the typeState so next time animateChanges is called we can compare the - * latest prop and resolvedValues to these. - */ - typeState.prevProp = prop; - typeState.prevResolvedValues = resolvedValues; - /** - * - */ - if (typeState.isActive) { - encounteredKeys = tslib.__assign(tslib.__assign({}, encounteredKeys), resolvedValues); - } - if (isInitialRender && visualElement.blockInitialAnimation) { - shouldAnimateType = false; - } - /** - * If this is an inherited prop we want to hard-block animations - * TODO: Test as this should probably still handle animations triggered - * by removed values? - */ - if (shouldAnimateType && !isInherited) { - animations.push.apply(animations, tslib.__spreadArray([], tslib.__read(definitionList.map(function (animation) { - return { - animation: animation, - options: tslib.__assign({ - type: type - }, options) - }; - })), false)); - } - }; - /** - * Iterate through all animation types in reverse priority order. For each, we want to - * detect which values it's handling and whether or not they've changed (and therefore - * need to be animated). If any values have been removed, we want to detect those in - * lower priority props and flag for animation. - */ - for (var i = 0; i < numAnimationTypes; i++) { - _loop_1(i); - } - allAnimatedKeys = tslib.__assign({}, encounteredKeys); - /** - * If there are some removed value that haven't been dealt with, - * we need to create a new animation that falls back either to the value - * defined in the style prop, or the last read value. - */ - if (removedKeys.size) { - var fallbackAnimation_1 = {}; - removedKeys.forEach(function (key) { - var fallbackTarget = visualElement.getBaseTarget(key); - if (fallbackTarget !== undefined) { - fallbackAnimation_1[key] = fallbackTarget; - } - }); - animations.push({ - animation: fallbackAnimation_1 - }); - } - var shouldAnimate = Boolean(animations.length); - if (isInitialRender && props.initial === false && !visualElement.manuallyAnimateOnMount) { - shouldAnimate = false; - } - isInitialRender = false; - return shouldAnimate ? animate(animations) : Promise.resolve(); - } - /** - * Change whether a certain animation type is active. - */ - function setActive(type, isActive, options) { - var _a; - // If the active state hasn't changed, we can safely do nothing here - if (state[type].isActive === isActive) return Promise.resolve(); - // Propagate active change to children - (_a = visualElement.variantChildren) === null || _a === void 0 ? void 0 : _a.forEach(function (child) { - var _a; - return (_a = child.animationState) === null || _a === void 0 ? void 0 : _a.setActive(type, isActive); - }); - state[type].isActive = isActive; - var animations = animateChanges(options, type); - for (var key in state) { - state[key].protectedKeys = {}; - } - return animations; - } - return { - isAnimated: isAnimated, - animateChanges: animateChanges, - setActive: setActive, - setAnimateFunction: setAnimateFunction, - getState: function () { - return state; - } - }; -} -function checkVariantsDidChange(prev, next) { - if (typeof next === "string") { - return next !== prev; - } else if (isVariantLabels(next)) { - return !shallowCompare(next, prev); - } - return false; -} -function createTypeState(isActive) { - if (isActive === void 0) { - isActive = false; - } - return { - isActive: isActive, - protectedKeys: {}, - needsAnimating: {}, - prevResolvedValues: {} - }; -} -function createState() { - var _a; - return _a = {}, _a[exports.AnimationType.Animate] = createTypeState(true), _a[exports.AnimationType.InView] = createTypeState(), _a[exports.AnimationType.Hover] = createTypeState(), _a[exports.AnimationType.Tap] = createTypeState(), _a[exports.AnimationType.Drag] = createTypeState(), _a[exports.AnimationType.Focus] = createTypeState(), _a[exports.AnimationType.Exit] = createTypeState(), _a; -} -var animations = { - animation: makeRenderlessComponent(function (_a) { - var visualElement = _a.visualElement, - animate = _a.animate; - /** - * We dynamically generate the AnimationState manager as it contains a reference - * to the underlying animation library. We only want to load that if we load this, - * so people can optionally code split it out using the `m` component. - */ - visualElement.animationState || (visualElement.animationState = createAnimationState(visualElement)); - /** - * Subscribe any provided AnimationControls to the component's VisualElement - */ - if (isAnimationControls(animate)) { - React.useEffect(function () { - return animate.subscribe(visualElement); - }, [animate]); - } - }), - exit: makeRenderlessComponent(function (props) { - var custom = props.custom, - visualElement = props.visualElement; - var _a = tslib.__read(usePresence(), 2), - isPresent = _a[0], - safeToRemove = _a[1]; - var presenceContext = React.useContext(PresenceContext); - React.useEffect(function () { - var _a, _b; - visualElement.isPresent = isPresent; - var animation = (_a = visualElement.animationState) === null || _a === void 0 ? void 0 : _a.setActive(exports.AnimationType.Exit, !isPresent, { - custom: (_b = presenceContext === null || presenceContext === void 0 ? void 0 : presenceContext.custom) !== null && _b !== void 0 ? _b : custom - }); - !isPresent && (animation === null || animation === void 0 ? void 0 : animation.then(safeToRemove)); - }, [isPresent]); - }) -}; - -/** - * @internal - */ -var PanSession = /** @class */function () { - function PanSession(event, handlers, _a) { - var _this = this; - var _b = _a === void 0 ? {} : _a, - transformPagePoint = _b.transformPagePoint; - /** - * @internal - */ - this.startEvent = null; - /** - * @internal - */ - this.lastMoveEvent = null; - /** - * @internal - */ - this.lastMoveEventInfo = null; - /** - * @internal - */ - this.handlers = {}; - this.updatePoint = function () { - if (!(_this.lastMoveEvent && _this.lastMoveEventInfo)) return; - var info = getPanInfo(_this.lastMoveEventInfo, _this.history); - var isPanStarted = _this.startEvent !== null; - // Only start panning if the offset is larger than 3 pixels. If we make it - // any larger than this we'll want to reset the pointer history - // on the first update to avoid visual snapping to the cursoe. - var isDistancePastThreshold = popmotion.distance(info.offset, { - x: 0, - y: 0 - }) >= 3; - if (!isPanStarted && !isDistancePastThreshold) return; - var point = info.point; - var timestamp = sync.getFrameData().timestamp; - _this.history.push(tslib.__assign(tslib.__assign({}, point), { - timestamp: timestamp - })); - var _a = _this.handlers, - onStart = _a.onStart, - onMove = _a.onMove; - if (!isPanStarted) { - onStart && onStart(_this.lastMoveEvent, info); - _this.startEvent = _this.lastMoveEvent; - } - onMove && onMove(_this.lastMoveEvent, info); - }; - this.handlePointerMove = function (event, info) { - _this.lastMoveEvent = event; - _this.lastMoveEventInfo = transformPoint(info, _this.transformPagePoint); - // Because Safari doesn't trigger mouseup events when it's above a ` ' + e.phrase("(Use line:column or scroll% syntax)") + ""; - } - c(i, "getJumpDialog"); - function a(e, t) { - var n = Number(t); - return /^[-+]/.test(t) ? e.getCursor().line + n : n - 1; - } - c(a, "interpretLine"), o.commands.jumpToLine = function (e) { - var t = e.getCursor(); - s(e, i(e), e.phrase("Jump to line:"), t.line + 1 + ":" + t.ch, function (n) { - if (n) { - var r; - if (r = /^\s*([\+\-]?\d+)\s*\:\s*(\d+)\s*$/.exec(n)) e.setCursor(a(e, r[1]), Number(r[2]));else if (r = /^\s*([\+\-]?\d+(\.\d+)?)\%\s*/.exec(n)) { - var l = Math.round(e.lineCount() * Number(r[1]) / 100); - /^[-+]/.test(r[1]) && (l = t.line + l + 1), e.setCursor(l - 1, t.ch); - } else (r = /^\s*\:?\s*([\+\-]?\d+)\s*/.exec(n)) && e.setCursor(a(e, r[1]), t.ch); - } - }); - }, o.keyMap.default["Alt-G"] = "jumpToLine"; - }); -})(); -var d = b.exports; -const j = f.getDefaultExportFromCjs(d), - y = h({ - __proto__: null, - default: j - }, [d]); -exports.jumpToLine = y; - -/***/ }), - -/***/ "../../graphiql-react/dist/jump.cjs.js": -/*!*********************************************!*\ - !*** ../../graphiql-react/dist/jump.cjs.js ***! - \*********************************************/ -/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { - - - -var c = Object.defineProperty; -var s = (e, r) => c(e, "name", { - value: r, - configurable: !0 -}); -const u = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"), - d = __webpack_require__(/*! ./SchemaReference.cjs.js */ "../../graphiql-react/dist/SchemaReference.cjs.js"); -__webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -__webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -__webpack_require__(/*! ./forEachState.cjs.js */ "../../graphiql-react/dist/forEachState.cjs.js"); -u.CodeMirror.defineOption("jump", !1, (e, r, n) => { - if (n && n !== u.CodeMirror.Init) { - const t = e.state.jump.onMouseOver; - u.CodeMirror.off(e.getWrapperElement(), "mouseover", t); - const i = e.state.jump.onMouseOut; - u.CodeMirror.off(e.getWrapperElement(), "mouseout", i), u.CodeMirror.off(document, "keydown", e.state.jump.onKeyDown), delete e.state.jump; - } - if (r) { - const t = e.state.jump = { - options: r, - onMouseOver: M.bind(null, e), - onMouseOut: m.bind(null, e), - onKeyDown: g.bind(null, e) - }; - u.CodeMirror.on(e.getWrapperElement(), "mouseover", t.onMouseOver), u.CodeMirror.on(e.getWrapperElement(), "mouseout", t.onMouseOut), u.CodeMirror.on(document, "keydown", t.onKeyDown); - } -}); -function M(e, r) { - const n = r.target || r.srcElement; - if (!(n instanceof HTMLElement) || (n == null ? void 0 : n.nodeName) !== "SPAN") return; - const t = n.getBoundingClientRect(), - i = { - left: (t.left + t.right) / 2, - top: (t.top + t.bottom) / 2 - }; - e.state.jump.cursor = i, e.state.jump.isHoldingModifier && l(e); -} -s(M, "onMouseOver"); -function m(e) { - if (!e.state.jump.isHoldingModifier && e.state.jump.cursor) { - e.state.jump.cursor = null; - return; - } - e.state.jump.isHoldingModifier && e.state.jump.marker && p(e); -} -s(m, "onMouseOut"); -function g(e, r) { - if (e.state.jump.isHoldingModifier || !k(r.key)) return; - e.state.jump.isHoldingModifier = !0, e.state.jump.cursor && l(e); - const n = s(o => { - o.code === r.code && (e.state.jump.isHoldingModifier = !1, e.state.jump.marker && p(e), u.CodeMirror.off(document, "keyup", n), u.CodeMirror.off(document, "click", t), e.off("mousedown", i)); - }, "onKeyUp"), - t = s(o => { - const { - destination: a, - options: f - } = e.state.jump; - a && f.onClick(a, o); - }, "onClick"), - i = s((o, a) => { - e.state.jump.destination && (a.codemirrorIgnore = !0); - }, "onMouseDown"); - u.CodeMirror.on(document, "keyup", n), u.CodeMirror.on(document, "click", t), e.on("mousedown", i); -} -s(g, "onKeyDown"); -const j = typeof navigator < "u" && navigator && navigator.appVersion.includes("Mac"); -function k(e) { - return e === (j ? "Meta" : "Control"); -} -s(k, "isJumpModifier"); -function l(e) { - if (e.state.jump.marker) return; - const { - cursor: r, - options: n - } = e.state.jump, - t = e.coordsChar(r), - i = e.getTokenAt(t, !0), - o = n.getDestination || e.getHelper(t, "jump"); - if (o) { - const a = o(i, n, e); - if (a) { - const f = e.markText({ - line: t.line, - ch: i.start - }, { - line: t.line, - ch: i.end - }, { - className: "CodeMirror-jump-token" - }); - e.state.jump.marker = f, e.state.jump.destination = a; - } - } -} -s(l, "enableJumpMode"); -function p(e) { - const { - marker: r - } = e.state.jump; - e.state.jump.marker = null, e.state.jump.destination = null, r.clear(); -} -s(p, "disableJumpMode"); -u.CodeMirror.registerHelper("jump", "graphql", (e, r) => { - if (!r.schema || !r.onClick || !e.state) return; - const { - state: n - } = e, - { - kind: t, - step: i - } = n, - o = d.getTypeInfo(r.schema, n); - if (t === "Field" && i === 0 && o.fieldDef || t === "AliasedField" && i === 2 && o.fieldDef) return d.getFieldReference(o); - if (t === "Directive" && i === 1 && o.directiveDef) return d.getDirectiveReference(o); - if (t === "Argument" && i === 0 && o.argDef) return d.getArgumentReference(o); - if (t === "EnumValue" && o.enumValue) return d.getEnumValueReference(o); - if (t === "NamedType" && o.type) return d.getTypeReference(o); -}); - -/***/ }), - -/***/ "../../graphiql-react/dist/lint.cjs.js": -/*!*********************************************!*\ - !*** ../../graphiql-react/dist/lint.cjs.js ***! - \*********************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -var W = Object.defineProperty; -var s = (h, v) => W(h, "name", { - value: v, - configurable: !0 -}); -const x = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -function q(h, v) { - for (var l = 0; l < v.length; l++) { - const u = v[l]; - if (typeof u != "string" && !Array.isArray(u)) { - for (const g in u) if (g !== "default" && !(g in h)) { - const c = Object.getOwnPropertyDescriptor(u, g); - c && Object.defineProperty(h, g, c.get ? c : { - enumerable: !0, - get: () => u[g] - }); - } - } - } - return Object.freeze(Object.defineProperty(h, Symbol.toStringTag, { - value: "Module" - })); -} -s(q, "_mergeNamespaces"); -var B = { - exports: {} -}; -(function (h, v) { - (function (l) { - l(x.requireCodemirror()); - })(function (l) { - var u = "CodeMirror-lint-markers", - g = "CodeMirror-lint-line-"; - function c(t, e, r) { - var n = document.createElement("div"); - n.className = "CodeMirror-lint-tooltip cm-s-" + t.options.theme, n.appendChild(r.cloneNode(!0)), t.state.lint.options.selfContain ? t.getWrapperElement().appendChild(n) : document.body.appendChild(n); - function i(o) { - if (!n.parentNode) return l.off(document, "mousemove", i); - n.style.top = Math.max(0, o.clientY - n.offsetHeight - 5) + "px", n.style.left = o.clientX + 5 + "px"; - } - return s(i, "position"), l.on(document, "mousemove", i), i(e), n.style.opacity != null && (n.style.opacity = 1), n; - } - s(c, "showTooltip"); - function L(t) { - t.parentNode && t.parentNode.removeChild(t); - } - s(L, "rm"); - function A(t) { - t.parentNode && (t.style.opacity == null && L(t), t.style.opacity = 0, setTimeout(function () { - L(t); - }, 600)); - } - s(A, "hideTooltip"); - function M(t, e, r, n) { - var i = c(t, e, r); - function o() { - l.off(n, "mouseout", o), i && (A(i), i = null); - } - s(o, "hide"); - var a = setInterval(function () { - if (i) for (var f = n;; f = f.parentNode) { - if (f && f.nodeType == 11 && (f = f.host), f == document.body) return; - if (!f) { - o(); - break; - } - } - if (!i) return clearInterval(a); - }, 400); - l.on(n, "mouseout", o); - } - s(M, "showTooltipFor"); - function F(t, e, r) { - this.marked = [], e instanceof Function && (e = { - getAnnotations: e - }), (!e || e === !0) && (e = {}), this.options = {}, this.linterOptions = e.options || {}; - for (var n in C) this.options[n] = C[n]; - for (var n in e) C.hasOwnProperty(n) ? e[n] != null && (this.options[n] = e[n]) : e.options || (this.linterOptions[n] = e[n]); - this.timeout = null, this.hasGutter = r, this.onMouseOver = function (i) { - U(t, i); - }, this.waitingFor = 0; - } - s(F, "LintState"); - var C = { - highlightLines: !1, - tooltips: !0, - delay: 500, - lintOnChange: !0, - getAnnotations: null, - async: !1, - selfContain: null, - formatAnnotation: null, - onUpdateLinting: null - }; - function E(t) { - var e = t.state.lint; - e.hasGutter && t.clearGutter(u), e.options.highlightLines && G(t); - for (var r = 0; r < e.marked.length; ++r) e.marked[r].clear(); - e.marked.length = 0; - } - s(E, "clearMarks"); - function G(t) { - t.eachLine(function (e) { - var r = e.wrapClass && /\bCodeMirror-lint-line-\w+\b/.exec(e.wrapClass); - r && t.removeLineClass(e, "wrap", r[0]); - }); - } - s(G, "clearErrorLines"); - function I(t, e, r, n, i) { - var o = document.createElement("div"), - a = o; - return o.className = "CodeMirror-lint-marker CodeMirror-lint-marker-" + r, n && (a = o.appendChild(document.createElement("div")), a.className = "CodeMirror-lint-marker CodeMirror-lint-marker-multiple"), i != !1 && l.on(a, "mouseover", function (f) { - M(t, f, e, a); - }), o; - } - s(I, "makeMarker"); - function D(t, e) { - return t == "error" ? t : e; - } - s(D, "getMaxSeverity"); - function j(t) { - for (var e = [], r = 0; r < t.length; ++r) { - var n = t[r], - i = n.from.line; - (e[i] || (e[i] = [])).push(n); - } - return e; - } - s(j, "groupByLine"); - function N(t) { - var e = t.severity; - e || (e = "error"); - var r = document.createElement("div"); - return r.className = "CodeMirror-lint-message CodeMirror-lint-message-" + e, typeof t.messageHTML < "u" ? r.innerHTML = t.messageHTML : r.appendChild(document.createTextNode(t.message)), r; - } - s(N, "annotationTooltip"); - function H(t, e) { - var r = t.state.lint, - n = ++r.waitingFor; - function i() { - n = -1, t.off("change", i); - } - s(i, "abort"), t.on("change", i), e(t.getValue(), function (o, a) { - t.off("change", i), r.waitingFor == n && (a && o instanceof l && (o = a), t.operation(function () { - O(t, o); - })); - }, r.linterOptions, t); - } - s(H, "lintAsync"); - function k(t) { - var e = t.state.lint; - if (e) { - var r = e.options, - n = r.getAnnotations || t.getHelper(l.Pos(0, 0), "lint"); - if (n) if (r.async || n.async) H(t, n);else { - var i = n(t.getValue(), e.linterOptions, t); - if (!i) return; - i.then ? i.then(function (o) { - t.operation(function () { - O(t, o); - }); - }) : t.operation(function () { - O(t, i); - }); - } - } - } - s(k, "startLinting"); - function O(t, e) { - var r = t.state.lint; - if (r) { - var n = r.options; - E(t); - for (var i = j(e), o = 0; o < i.length; ++o) { - var a = i[o]; - if (a) { - var f = []; - a = a.filter(function (w) { - return f.indexOf(w.message) > -1 ? !1 : f.push(w.message); - }); - for (var p = null, m = r.hasGutter && document.createDocumentFragment(), T = 0; T < a.length; ++T) { - var d = a[T], - y = d.severity; - y || (y = "error"), p = D(p, y), n.formatAnnotation && (d = n.formatAnnotation(d)), r.hasGutter && m.appendChild(N(d)), d.to && r.marked.push(t.markText(d.from, d.to, { - className: "CodeMirror-lint-mark CodeMirror-lint-mark-" + y, - __annotation: d - })); - } - r.hasGutter && t.setGutterMarker(o, u, I(t, m, p, i[o].length > 1, n.tooltips)), n.highlightLines && t.addLineClass(o, "wrap", g + p); - } - } - n.onUpdateLinting && n.onUpdateLinting(e, i, t); - } - } - s(O, "updateLinting"); - function b(t) { - var e = t.state.lint; - e && (clearTimeout(e.timeout), e.timeout = setTimeout(function () { - k(t); - }, e.options.delay)); - } - s(b, "onChange"); - function P(t, e, r) { - for (var n = r.target || r.srcElement, i = document.createDocumentFragment(), o = 0; o < e.length; o++) { - var a = e[o]; - i.appendChild(N(a)); - } - M(t, r, i, n); - } - s(P, "popupTooltips"); - function U(t, e) { - var r = e.target || e.srcElement; - if (/\bCodeMirror-lint-mark-/.test(r.className)) { - for (var n = r.getBoundingClientRect(), i = (n.left + n.right) / 2, o = (n.top + n.bottom) / 2, a = t.findMarksAt(t.coordsChar({ - left: i, - top: o - }, "client")), f = [], p = 0; p < a.length; ++p) { - var m = a[p].__annotation; - m && f.push(m); - } - f.length && P(t, f, e); - } - } - s(U, "onMouseOver"), l.defineOption("lint", !1, function (t, e, r) { - if (r && r != l.Init && (E(t), t.state.lint.options.lintOnChange !== !1 && t.off("change", b), l.off(t.getWrapperElement(), "mouseover", t.state.lint.onMouseOver), clearTimeout(t.state.lint.timeout), delete t.state.lint), e) { - for (var n = t.getOption("gutters"), i = !1, o = 0; o < n.length; ++o) n[o] == u && (i = !0); - var a = t.state.lint = new F(t, e, i); - a.options.lintOnChange && t.on("change", b), a.options.tooltips != !1 && a.options.tooltips != "gutter" && l.on(t.getWrapperElement(), "mouseover", a.onMouseOver), k(t); - } - }), l.defineExtension("performLint", function () { - k(this); - }); - }); -})(); -var _ = B.exports; -const R = x.getDefaultExportFromCjs(_), - V = q({ - __proto__: null, - default: R - }, [_]); -exports.lint = V; - -/***/ }), - -/***/ "../../graphiql-react/dist/lint.cjs2.js": -/*!**********************************************!*\ - !*** ../../graphiql-react/dist/lint.cjs2.js ***! - \**********************************************/ -/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { - - - -const t = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"), - c = __webpack_require__(/*! graphql-language-service */ "../../graphql-language-service/esm/index.js"); -__webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -const a = ["error", "warning", "information", "hint"], - g = { - "GraphQL: Validation": "validation", - "GraphQL: Deprecation": "deprecation", - "GraphQL: Syntax": "syntax" - }; -t.CodeMirror.registerHelper("lint", "graphql", (n, s) => { - const { - schema: r, - validationRules: i, - externalFragments: o - } = s; - return c.getDiagnostics(n, r, i, void 0, o).map(e => ({ - message: e.message, - severity: e.severity ? a[e.severity - 1] : a[0], - type: e.source ? g[e.source] : void 0, - from: t.CodeMirror.Pos(e.range.start.line, e.range.start.character), - to: t.CodeMirror.Pos(e.range.end.line, e.range.end.character) - })); -}); - -/***/ }), - -/***/ "../../graphiql-react/dist/lint.cjs3.js": -/*!**********************************************!*\ - !*** ../../graphiql-react/dist/lint.cjs3.js ***! - \**********************************************/ -/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { - - - -var V = Object.defineProperty; -var t = (e, n) => V(e, "name", { - value: n, - configurable: !0 -}); -const I = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"), - b = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -__webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -function C(e) { - d = e, E = e.length, s = u = N = -1, o(), y(); - const n = q(); - return p("EOF"), n; -} -t(C, "jsonParse"); -let d, E, s, u, N, r, l; -function q() { - const e = s, - n = []; - if (p("{"), !x("}")) { - do n.push(M()); while (x(",")); - p("}"); - } - return { - kind: "Object", - start: e, - end: N, - members: n - }; -} -t(q, "parseObj"); -function M() { - const e = s, - n = l === "String" ? G() : null; - p("String"), p(":"); - const i = B(); - return { - kind: "Member", - start: e, - end: N, - key: n, - value: i - }; -} -t(M, "parseMember"); -function v() { - const e = s, - n = []; - if (p("["), !x("]")) { - do n.push(B()); while (x(",")); - p("]"); - } - return { - kind: "Array", - start: e, - end: N, - values: n - }; -} -t(v, "parseArr"); -function B() { - switch (l) { - case "[": - return v(); - case "{": - return q(); - case "String": - case "Number": - case "Boolean": - case "Null": - const e = G(); - return y(), e; - } - p("Value"); -} -t(B, "parseVal"); -function G() { - return { - kind: l, - start: s, - end: u, - value: JSON.parse(d.slice(s, u)) - }; -} -t(G, "curToken"); -function p(e) { - if (l === e) { - y(); - return; - } - let n; - if (l === "EOF") n = "[end of file]";else if (u - s > 1) n = "`" + d.slice(s, u) + "`";else { - const i = d.slice(s).match(/^.+?\b/); - n = "`" + (i ? i[0] : d[s]) + "`"; - } - throw k(`Expected ${e} but found ${n}.`); -} -t(p, "expect"); -class j extends Error { - constructor(n, i) { - super(n), this.position = i; - } -} -t(j, "JSONSyntaxError"); -function k(e) { - return new j(e, { - start: s, - end: u - }); -} -t(k, "syntaxError"); -function x(e) { - if (l === e) return y(), !0; -} -t(x, "skip"); -function o() { - return u < E && (u++, r = u === E ? 0 : d.charCodeAt(u)), r; -} -t(o, "ch"); -function y() { - for (N = u; r === 9 || r === 10 || r === 13 || r === 32;) o(); - if (r === 0) { - l = "EOF"; - return; - } - switch (s = u, r) { - case 34: - return l = "String", D(); - case 45: - case 48: - case 49: - case 50: - case 51: - case 52: - case 53: - case 54: - case 55: - case 56: - case 57: - return l = "Number", H(); - case 102: - if (d.slice(s, s + 5) !== "false") break; - u += 4, o(), l = "Boolean"; - return; - case 110: - if (d.slice(s, s + 4) !== "null") break; - u += 3, o(), l = "Null"; - return; - case 116: - if (d.slice(s, s + 4) !== "true") break; - u += 3, o(), l = "Boolean"; - return; - } - l = d[s], o(); -} -t(y, "lex"); -function D() { - for (o(); r !== 34 && r > 31;) if (r === 92) switch (r = o(), r) { - case 34: - case 47: - case 92: - case 98: - case 102: - case 110: - case 114: - case 116: - o(); - break; - case 117: - o(), w(), w(), w(), w(); - break; - default: - throw k("Bad character escape sequence."); - } else { - if (u === E) throw k("Unterminated string."); - o(); - } - if (r === 34) { - o(); - return; - } - throw k("Unterminated string."); -} -t(D, "readString"); -function w() { - if (r >= 48 && r <= 57 || r >= 65 && r <= 70 || r >= 97 && r <= 102) return o(); - throw k("Expected hexadecimal digit."); -} -t(w, "readHex"); -function H() { - r === 45 && o(), r === 48 ? o() : $(), r === 46 && (o(), $()), (r === 69 || r === 101) && (r = o(), (r === 43 || r === 45) && o(), $()); -} -t(H, "readNumber"); -function $() { - if (r < 48 || r > 57) throw k("Expected decimal digit."); - do o(); while (r >= 48 && r <= 57); -} -t($, "readDigits"); -I.CodeMirror.registerHelper("lint", "graphql-variables", (e, n, i) => { - if (!e) return []; - let f; - try { - f = C(e); - } catch (c) { - if (c instanceof j) return [F(i, c.position, c.message)]; - throw c; - } - const { - variableToType: a - } = n; - return a ? U(i, a, f) : []; -}); -function U(e, n, i) { - var f; - const a = []; - for (const c of i.members) if (c) { - const h = (f = c.key) === null || f === void 0 ? void 0 : f.value, - m = n[h]; - if (m) for (const [O, Q] of g(m, c.value)) a.push(F(e, O, Q));else a.push(F(e, c.key, `Variable "$${h}" does not appear in any GraphQL query.`)); - } - return a; -} -t(U, "validateVariables"); -function g(e, n) { - if (!e || !n) return []; - if (e instanceof b.GraphQLNonNull) return n.kind === "Null" ? [[n, `Type "${e}" is non-nullable and cannot be null.`]] : g(e.ofType, n); - if (n.kind === "Null") return []; - if (e instanceof b.GraphQLList) { - const i = e.ofType; - if (n.kind === "Array") { - const f = n.values || []; - return L(f, a => g(i, a)); - } - return g(i, n); - } - if (e instanceof b.GraphQLInputObjectType) { - if (n.kind !== "Object") return [[n, `Type "${e}" must be an Object.`]]; - const i = Object.create(null), - f = L(n.members, a => { - var c; - const h = (c = a == null ? void 0 : a.key) === null || c === void 0 ? void 0 : c.value; - i[h] = !0; - const m = e.getFields()[h]; - if (!m) return [[a.key, `Type "${e}" does not have a field "${h}".`]]; - const O = m ? m.type : void 0; - return g(O, a.value); - }); - for (const a of Object.keys(e.getFields())) { - const c = e.getFields()[a]; - !i[a] && c.type instanceof b.GraphQLNonNull && !c.defaultValue && f.push([n, `Object of type "${e}" is missing required field "${a}".`]); - } - return f; - } - return e.name === "Boolean" && n.kind !== "Boolean" || e.name === "String" && n.kind !== "String" || e.name === "ID" && n.kind !== "Number" && n.kind !== "String" || e.name === "Float" && n.kind !== "Number" || e.name === "Int" && (n.kind !== "Number" || (n.value | 0) !== n.value) ? [[n, `Expected value of type "${e}".`]] : (e instanceof b.GraphQLEnumType || e instanceof b.GraphQLScalarType) && (n.kind !== "String" && n.kind !== "Number" && n.kind !== "Boolean" && n.kind !== "Null" || _(e.parseValue(n.value))) ? [[n, `Expected value of type "${e}".`]] : []; -} -t(g, "validateValue"); -function F(e, n, i) { - return { - message: i, - severity: "error", - type: "validation", - from: e.posFromIndex(n.start), - to: e.posFromIndex(n.end) - }; -} -t(F, "lintError"); -function _(e) { - return e == null || e !== e; -} -t(_, "isNullish"); -function L(e, n) { - return Array.prototype.concat.apply([], e.map(n)); -} -t(L, "mapCat"); - -/***/ }), - -/***/ "../../graphiql-react/dist/matchbrackets.cjs.js": -/*!******************************************************!*\ - !*** ../../graphiql-react/dist/matchbrackets.cjs.js ***! - \******************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -var i = Object.defineProperty; -var s = (e, c) => i(e, "name", { - value: c, - configurable: !0 -}); -const u = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"), - f = __webpack_require__(/*! ./matchbrackets.cjs2.js */ "../../graphiql-react/dist/matchbrackets.cjs2.js"); -function b(e, c) { - for (var o = 0; o < c.length; o++) { - const t = c[o]; - if (typeof t != "string" && !Array.isArray(t)) { - for (const r in t) if (r !== "default" && !(r in e)) { - const a = Object.getOwnPropertyDescriptor(t, r); - a && Object.defineProperty(e, r, a.get ? a : { - enumerable: !0, - get: () => t[r] - }); - } - } - } - return Object.freeze(Object.defineProperty(e, Symbol.toStringTag, { - value: "Module" - })); -} -s(b, "_mergeNamespaces"); -var n = f.requireMatchbrackets(); -const l = u.getDefaultExportFromCjs(n), - m = b({ - __proto__: null, - default: l - }, [n]); -exports.matchbrackets = m; - -/***/ }), - -/***/ "../../graphiql-react/dist/matchbrackets.cjs2.js": -/*!*******************************************************!*\ - !*** ../../graphiql-react/dist/matchbrackets.cjs2.js ***! - \*******************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -var R = Object.defineProperty; -var f = (L, y) => R(L, "name", { - value: y, - configurable: !0 -}); -const F = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -var T = { - exports: {} - }, - E; -function I() { - return E || (E = 1, function (L, y) { - (function (o) { - o(F.requireCodemirror()); - })(function (o) { - var S = /MSIE \d/.test(navigator.userAgent) && (document.documentMode == null || document.documentMode < 8), - g = o.Pos, - B = { - "(": ")>", - ")": "(<", - "[": "]>", - "]": "[<", - "{": "}>", - "}": "{<", - "<": ">>", - ">": "<<" - }; - function A(t) { - return t && t.bracketRegex || /[(){}[\]]/; - } - f(A, "bracketRegex"); - function b(t, r, e) { - var s = t.getLineHandle(r.line), - n = r.ch - 1, - h = e && e.afterCursor; - h == null && (h = /(^| )cm-fat-cursor($| )/.test(t.getWrapperElement().className)); - var l = A(e), - u = !h && n >= 0 && l.test(s.text.charAt(n)) && B[s.text.charAt(n)] || l.test(s.text.charAt(n + 1)) && B[s.text.charAt(++n)]; - if (!u) return null; - var a = u.charAt(1) == ">" ? 1 : -1; - if (e && e.strict && a > 0 != (n == r.ch)) return null; - var k = t.getTokenTypeAt(g(r.line, n + 1)), - i = H(t, g(r.line, n + (a > 0 ? 1 : 0)), a, k, e); - return i == null ? null : { - from: g(r.line, n), - to: i && i.pos, - match: i && i.ch == u.charAt(0), - forward: a > 0 - }; - } - f(b, "findMatchingBracket"); - function H(t, r, e, s, n) { - for (var h = n && n.maxScanLineLength || 1e4, l = n && n.maxScanLines || 1e3, u = [], a = A(n), k = e > 0 ? Math.min(r.line + l, t.lastLine() + 1) : Math.max(t.firstLine() - 1, r.line - l), i = r.line; i != k; i += e) { - var c = t.getLine(i); - if (c) { - var v = e > 0 ? 0 : c.length - 1, - q = e > 0 ? c.length : -1; - if (!(c.length > h)) for (i == r.line && (v = r.ch - (e < 0 ? 1 : 0)); v != q; v += e) { - var d = c.charAt(v); - if (a.test(d) && (s === void 0 || (t.getTokenTypeAt(g(i, v + 1)) || "") == (s || ""))) { - var m = B[d]; - if (m && m.charAt(1) == ">" == e > 0) u.push(d);else if (u.length) u.pop();else return { - pos: g(i, v), - ch: d - }; - } - } - } - } - return i - e == (e > 0 ? t.lastLine() : t.firstLine()) ? !1 : null; - } - f(H, "scanForBracket"); - function M(t, r, e) { - for (var s = t.state.matchBrackets.maxHighlightLineLength || 1e3, n = e && e.highlightNonMatching, h = [], l = t.listSelections(), u = 0; u < l.length; u++) { - var a = l[u].empty() && b(t, l[u].head, e); - if (a && (a.match || n !== !1) && t.getLine(a.from.line).length <= s) { - var k = a.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket"; - h.push(t.markText(a.from, g(a.from.line, a.from.ch + 1), { - className: k - })), a.to && t.getLine(a.to.line).length <= s && h.push(t.markText(a.to, g(a.to.line, a.to.ch + 1), { - className: k - })); - } - } - if (h.length) { - S && t.state.focused && t.focus(); - var i = f(function () { - t.operation(function () { - for (var c = 0; c < h.length; c++) h[c].clear(); - }); - }, "clear"); - if (r) setTimeout(i, 800);else return i; - } - } - f(M, "matchBrackets"); - function x(t) { - t.operation(function () { - t.state.matchBrackets.currentlyHighlighted && (t.state.matchBrackets.currentlyHighlighted(), t.state.matchBrackets.currentlyHighlighted = null), t.state.matchBrackets.currentlyHighlighted = M(t, !1, t.state.matchBrackets); - }); - } - f(x, "doMatchBrackets"); - function p(t) { - t.state.matchBrackets && t.state.matchBrackets.currentlyHighlighted && (t.state.matchBrackets.currentlyHighlighted(), t.state.matchBrackets.currentlyHighlighted = null); - } - f(p, "clearHighlighted"), o.defineOption("matchBrackets", !1, function (t, r, e) { - e && e != o.Init && (t.off("cursorActivity", x), t.off("focus", x), t.off("blur", p), p(t)), r && (t.state.matchBrackets = typeof r == "object" ? r : {}, t.on("cursorActivity", x), t.on("focus", x), t.on("blur", p)); - }), o.defineExtension("matchBrackets", function () { - M(this, !0); - }), o.defineExtension("findMatchingBracket", function (t, r, e) { - return (e || typeof r == "boolean") && (e ? (e.strict = r, r = e) : r = r ? { - strict: !0 - } : null), b(this, t, r); - }), o.defineExtension("scanForBracket", function (t, r, e, s) { - return H(this, t, r, e, s); - }); - }); - }()), T.exports; -} -f(I, "requireMatchbrackets"); -exports.requireMatchbrackets = I; - -/***/ }), - -/***/ "../../graphiql-react/dist/mode-indent.cjs.js": -/*!****************************************************!*\ - !*** ../../graphiql-react/dist/mode-indent.cjs.js ***! - \****************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -var o = Object.defineProperty; -var v = (n, t) => o(n, "name", { - value: t, - configurable: !0 -}); -function s(n, t) { - var e, i; - const { - levels: l, - indentLevel: d - } = n; - return ((!l || l.length === 0 ? d : l.at(-1) - (!((e = this.electricInput) === null || e === void 0) && e.test(t) ? 1 : 0)) || 0) * (((i = this.config) === null || i === void 0 ? void 0 : i.indentUnit) || 0); -} -v(s, "indent"); -exports.indent = s; - -/***/ }), - -/***/ "../../graphiql-react/dist/mode.cjs.js": -/*!*********************************************!*\ - !*** ../../graphiql-react/dist/mode.cjs.js ***! - \*********************************************/ -/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { - - - -var n = Object.defineProperty; -var s = (e, r) => n(e, "name", { - value: r, - configurable: !0 -}); -const o = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"), - t = __webpack_require__(/*! graphql-language-service */ "../../graphql-language-service/esm/index.js"), - i = __webpack_require__(/*! ./mode-indent.cjs.js */ "../../graphiql-react/dist/mode-indent.cjs.js"); -__webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -const l = s(e => { - const r = t.onlineParser({ - eatWhitespace: a => a.eatWhile(t.isIgnored), - lexRules: t.LexRules, - parseRules: t.ParseRules, - editorConfig: { - tabSize: e.tabSize - } - }); - return { - config: e, - startState: r.startState, - token: r.token, - indent: i.indent, - electricInput: /^\s*[})\]]/, - fold: "brace", - lineComment: "#", - closeBrackets: { - pairs: '()[]{}""', - explode: "()[]{}" - } - }; -}, "graphqlModeFactory"); -o.CodeMirror.defineMode("graphql", l); - -/***/ }), - -/***/ "../../graphiql-react/dist/mode.cjs2.js": -/*!**********************************************!*\ - !*** ../../graphiql-react/dist/mode.cjs2.js ***! - \**********************************************/ -/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { - - - -var n = Object.defineProperty; -var u = (t, r) => n(t, "name", { - value: r, - configurable: !0 -}); -const i = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"), - e = __webpack_require__(/*! graphql-language-service */ "../../graphql-language-service/esm/index.js"), - s = __webpack_require__(/*! ./mode-indent.cjs.js */ "../../graphiql-react/dist/mode-indent.cjs.js"); -__webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -i.CodeMirror.defineMode("graphql-variables", t => { - const r = e.onlineParser({ - eatWhitespace: a => a.eatSpace(), - lexRules: c, - parseRules: o, - editorConfig: { - tabSize: t.tabSize - } - }); - return { - config: t, - startState: r.startState, - token: r.token, - indent: s.indent, - electricInput: /^\s*[}\]]/, - fold: "brace", - closeBrackets: { - pairs: '[]{}""', - explode: "[]{}" - } - }; -}); -const c = { - Punctuation: /^\[|]|\{|\}|:|,/, - Number: /^-?(?:0|(?:[1-9][0-9]*))(?:\.[0-9]*)?(?:[eE][+-]?[0-9]+)?/, - String: /^"(?:[^"\\]|\\(?:"|\/|\\|b|f|n|r|t|u[0-9a-fA-F]{4}))*"?/, - Keyword: /^true|false|null/ - }, - o = { - Document: [e.p("{"), e.list("Variable", e.opt(e.p(","))), e.p("}")], - Variable: [l("variable"), e.p(":"), "Value"], - Value(t) { - switch (t.kind) { - case "Number": - return "NumberValue"; - case "String": - return "StringValue"; - case "Punctuation": - switch (t.value) { - case "[": - return "ListValue"; - case "{": - return "ObjectValue"; - } - return null; - case "Keyword": - switch (t.value) { - case "true": - case "false": - return "BooleanValue"; - case "null": - return "NullValue"; - } - return null; - } - }, - NumberValue: [e.t("Number", "number")], - StringValue: [e.t("String", "string")], - BooleanValue: [e.t("Keyword", "builtin")], - NullValue: [e.t("Keyword", "keyword")], - ListValue: [e.p("["), e.list("Value", e.opt(e.p(","))), e.p("]")], - ObjectValue: [e.p("{"), e.list("ObjectField", e.opt(e.p(","))), e.p("}")], - ObjectField: [l("attribute"), e.p(":"), "Value"] - }; -function l(t) { - return { - style: t, - match: r => r.kind === "String", - update(r, a) { - r.name = a.value.slice(1, -1); - } - }; -} -u(l, "namedKey"); - -/***/ }), - -/***/ "../../graphiql-react/dist/mode.cjs3.js": -/*!**********************************************!*\ - !*** ../../graphiql-react/dist/mode.cjs3.js ***! - \**********************************************/ -/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { - - - -const a = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"), - e = __webpack_require__(/*! graphql-language-service */ "../../graphql-language-service/esm/index.js"), - l = __webpack_require__(/*! ./mode-indent.cjs.js */ "../../graphiql-react/dist/mode-indent.cjs.js"); -__webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -a.CodeMirror.defineMode("graphql-results", r => { - const t = e.onlineParser({ - eatWhitespace: u => u.eatSpace(), - lexRules: n, - parseRules: s, - editorConfig: { - tabSize: r.tabSize - } - }); - return { - config: r, - startState: t.startState, - token: t.token, - indent: l.indent, - electricInput: /^\s*[}\]]/, - fold: "brace", - closeBrackets: { - pairs: '[]{}""', - explode: "[]{}" - } - }; -}); -const n = { - Punctuation: /^\[|]|\{|\}|:|,/, - Number: /^-?(?:0|(?:[1-9][0-9]*))(?:\.[0-9]*)?(?:[eE][+-]?[0-9]+)?/, - String: /^"(?:[^"\\]|\\(?:"|\/|\\|b|f|n|r|t|u[0-9a-fA-F]{4}))*"?/, - Keyword: /^true|false|null/ - }, - s = { - Document: [e.p("{"), e.list("Entry", e.p(",")), e.p("}")], - Entry: [e.t("String", "def"), e.p(":"), "Value"], - Value(r) { - switch (r.kind) { - case "Number": - return "NumberValue"; - case "String": - return "StringValue"; - case "Punctuation": - switch (r.value) { - case "[": - return "ListValue"; - case "{": - return "ObjectValue"; - } - return null; - case "Keyword": - switch (r.value) { - case "true": - case "false": - return "BooleanValue"; - case "null": - return "NullValue"; - } - return null; - } - }, - NumberValue: [e.t("Number", "number")], - StringValue: [e.t("String", "string")], - BooleanValue: [e.t("Keyword", "builtin")], - NullValue: [e.t("Keyword", "keyword")], - ListValue: [e.p("["), e.list("Value", e.p(",")), e.p("]")], - ObjectValue: [e.p("{"), e.list("ObjectField", e.p(",")), e.p("}")], - ObjectField: [e.t("String", "property"), e.p(":"), "Value"] - }; - -/***/ }), - -/***/ "../../graphiql-react/dist/search.cjs.js": -/*!***********************************************!*\ - !*** ../../graphiql-react/dist/search.cjs.js ***! - \***********************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -var K = Object.defineProperty; -var a = (S, O) => K(S, "name", { - value: O, - configurable: !0 -}); -const Q = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"), - L = __webpack_require__(/*! ./searchcursor.cjs2.js */ "../../graphiql-react/dist/searchcursor.cjs2.js"), - z = __webpack_require__(/*! ./dialog.cjs2.js */ "../../graphiql-react/dist/dialog.cjs2.js"); -function U(S, O) { - for (var i = 0; i < O.length; i++) { - const y = O[i]; - if (typeof y != "string" && !Array.isArray(y)) { - for (const v in y) if (v !== "default" && !(v in S)) { - const h = Object.getOwnPropertyDescriptor(y, v); - h && Object.defineProperty(S, v, h.get ? h : { - enumerable: !0, - get: () => y[v] - }); - } - } - } - return Object.freeze(Object.defineProperty(S, Symbol.toStringTag, { - value: "Module" - })); -} -a(U, "_mergeNamespaces"); -var B = { - exports: {} -}; -(function (S, O) { - (function (i) { - i(Q.requireCodemirror(), L.requireSearchcursor(), z.requireDialog()); - })(function (i) { - i.defineOption("search", { - bottom: !1 - }); - function y(e, n) { - return typeof e == "string" ? e = new RegExp(e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"), n ? "gi" : "g") : e.global || (e = new RegExp(e.source, e.ignoreCase ? "gi" : "g")), { - token: function (t) { - e.lastIndex = t.pos; - var o = e.exec(t.string); - if (o && o.index == t.pos) return t.pos += o[0].length || 1, "searching"; - o ? t.pos = o.index : t.skipToEnd(); - } - }; - } - a(y, "searchOverlay"); - function v() { - this.posFrom = this.posTo = this.lastQuery = this.query = null, this.overlay = null; - } - a(v, "SearchState"); - function h(e) { - return e.state.search || (e.state.search = new v()); - } - a(h, "getSearchState"); - function m(e) { - return typeof e == "string" && e == e.toLowerCase(); - } - a(m, "queryCaseInsensitive"); - function N(e, n, t) { - return e.getSearchCursor(n, t, { - caseFold: m(n), - multiline: !0 - }); - } - a(N, "getSearchCursor"); - function j(e, n, t, o, r) { - e.openDialog(n, o, { - value: t, - selectValueOnOpen: !0, - closeOnEnter: !1, - onClose: function () { - w(e); - }, - onKeyDown: r, - bottom: e.options.search.bottom - }); - } - a(j, "persistentDialog"); - function R(e, n, t, o, r) { - e.openDialog ? e.openDialog(n, r, { - value: o, - selectValueOnOpen: !0, - bottom: e.options.search.bottom - }) : r(prompt(t, o)); - } - a(R, "dialog"); - function k(e, n, t, o) { - e.openConfirm ? e.openConfirm(n, o) : confirm(t) && o[0](); - } - a(k, "confirmDialog"); - function C(e) { - return e.replace(/\\([nrt\\])/g, function (n, t) { - return t == "n" ? ` -` : t == "r" ? "\r" : t == "t" ? " " : t == "\\" ? "\\" : n; - }); - } - a(C, "parseString"); - function T(e) { - var n = e.match(/^\/(.*)\/([a-z]*)$/); - if (n) try { - e = new RegExp(n[1], n[2].indexOf("i") == -1 ? "" : "i"); - } catch {} else e = C(e); - return (typeof e == "string" ? e == "" : e.test("")) && (e = /x^/), e; - } - a(T, "parseQuery"); - function D(e, n, t) { - n.queryText = t, n.query = T(t), e.removeOverlay(n.overlay, m(n.query)), n.overlay = y(n.query, m(n.query)), e.addOverlay(n.overlay), e.showMatchesOnScrollbar && (n.annotate && (n.annotate.clear(), n.annotate = null), n.annotate = e.showMatchesOnScrollbar(n.query, m(n.query))); - } - a(D, "startSearch"); - function b(e, n, t, o) { - var r = h(e); - if (r.query) return P(e, n); - var s = e.getSelection() || r.lastQuery; - if (s instanceof RegExp && s.source == "x^" && (s = null), t && e.openDialog) { - var c = null, - u = a(function (f, x) { - i.e_stop(x), f && (f != r.queryText && (D(e, r, f), r.posFrom = r.posTo = e.getCursor()), c && (c.style.opacity = 1), P(e, x.shiftKey, function (d, g) { - var p; - g.line < 3 && document.querySelector && (p = e.display.wrapper.querySelector(".CodeMirror-dialog")) && p.getBoundingClientRect().bottom - 4 > e.cursorCoords(g, "window").top && ((c = p).style.opacity = .4); - })); - }, "searchNext"); - j(e, _(e), s, u, function (f, x) { - var d = i.keyName(f), - g = e.getOption("extraKeys"), - p = g && g[d] || i.keyMap[e.getOption("keyMap")][d]; - p == "findNext" || p == "findPrev" || p == "findPersistentNext" || p == "findPersistentPrev" ? (i.e_stop(f), D(e, h(e), x), e.execCommand(p)) : (p == "find" || p == "findPersistent") && (i.e_stop(f), u(x, f)); - }), o && s && (D(e, r, s), P(e, n)); - } else R(e, _(e), "Search for:", s, function (f) { - f && !r.query && e.operation(function () { - D(e, r, f), r.posFrom = r.posTo = e.getCursor(), P(e, n); - }); - }); - } - a(b, "doSearch"); - function P(e, n, t) { - e.operation(function () { - var o = h(e), - r = N(e, o.query, n ? o.posFrom : o.posTo); - !r.find(n) && (r = N(e, o.query, n ? i.Pos(e.lastLine()) : i.Pos(e.firstLine(), 0)), !r.find(n)) || (e.setSelection(r.from(), r.to()), e.scrollIntoView({ - from: r.from(), - to: r.to() - }, 20), o.posFrom = r.from(), o.posTo = r.to(), t && t(r.from(), r.to())); - }); - } - a(P, "findNext"); - function w(e) { - e.operation(function () { - var n = h(e); - n.lastQuery = n.query, n.query && (n.query = n.queryText = null, e.removeOverlay(n.overlay), n.annotate && (n.annotate.clear(), n.annotate = null)); - }); - } - a(w, "clearSearch"); - function l(e, n) { - var t = e ? document.createElement(e) : document.createDocumentFragment(); - for (var o in n) t[o] = n[o]; - for (var r = 2; r < arguments.length; r++) { - var s = arguments[r]; - t.appendChild(typeof s == "string" ? document.createTextNode(s) : s); - } - return t; - } - a(l, "el"); - function _(e) { - return l("", null, l("span", { - className: "CodeMirror-search-label" - }, e.phrase("Search:")), " ", l("input", { - type: "text", - style: "width: 10em", - className: "CodeMirror-search-field" - }), " ", l("span", { - style: "color: #888", - className: "CodeMirror-search-hint" - }, e.phrase("(Use /re/ syntax for regexp search)"))); - } - a(_, "getQueryDialog"); - function A(e) { - return l("", null, " ", l("input", { - type: "text", - style: "width: 10em", - className: "CodeMirror-search-field" - }), " ", l("span", { - style: "color: #888", - className: "CodeMirror-search-hint" - }, e.phrase("(Use /re/ syntax for regexp search)"))); - } - a(A, "getReplaceQueryDialog"); - function I(e) { - return l("", null, l("span", { - className: "CodeMirror-search-label" - }, e.phrase("With:")), " ", l("input", { - type: "text", - style: "width: 10em", - className: "CodeMirror-search-field" - })); - } - a(I, "getReplacementQueryDialog"); - function V(e) { - return l("", null, l("span", { - className: "CodeMirror-search-label" - }, e.phrase("Replace?")), " ", l("button", {}, e.phrase("Yes")), " ", l("button", {}, e.phrase("No")), " ", l("button", {}, e.phrase("All")), " ", l("button", {}, e.phrase("Stop"))); - } - a(V, "getDoReplaceConfirm"); - function E(e, n, t) { - e.operation(function () { - for (var o = N(e, n); o.findNext();) if (typeof n != "string") { - var r = e.getRange(o.from(), o.to()).match(n); - o.replace(t.replace(/\$(\d)/g, function (s, c) { - return r[c]; - })); - } else o.replace(t); - }); - } - a(E, "replaceAll"); - function F(e, n) { - if (!e.getOption("readOnly")) { - var t = e.getSelection() || h(e).lastQuery, - o = n ? e.phrase("Replace all:") : e.phrase("Replace:"), - r = l("", null, l("span", { - className: "CodeMirror-search-label" - }, o), A(e)); - R(e, r, o, t, function (s) { - s && (s = T(s), R(e, I(e), e.phrase("Replace with:"), "", function (c) { - if (c = C(c), n) E(e, s, c);else { - w(e); - var u = N(e, s, e.getCursor("from")), - f = a(function () { - var d = u.from(), - g; - !(g = u.findNext()) && (u = N(e, s), !(g = u.findNext()) || d && u.from().line == d.line && u.from().ch == d.ch) || (e.setSelection(u.from(), u.to()), e.scrollIntoView({ - from: u.from(), - to: u.to() - }), k(e, V(e), e.phrase("Replace?"), [function () { - x(g); - }, f, function () { - E(e, s, c); - }])); - }, "advance"), - x = a(function (d) { - u.replace(typeof s == "string" ? c : c.replace(/\$(\d)/g, function (g, p) { - return d[p]; - })), f(); - }, "doReplace"); - f(); - } - })); - }); - } - } - a(F, "replace"), i.commands.find = function (e) { - w(e), b(e); - }, i.commands.findPersistent = function (e) { - w(e), b(e, !1, !0); - }, i.commands.findPersistentNext = function (e) { - b(e, !1, !0, !0); - }, i.commands.findPersistentPrev = function (e) { - b(e, !0, !0, !0); - }, i.commands.findNext = b, i.commands.findPrev = function (e) { - b(e, !0); - }, i.commands.clearSearch = w, i.commands.replace = F, i.commands.replaceAll = function (e) { - F(e, !0); - }; - }); -})(); -var $ = B.exports; -const W = Q.getDefaultExportFromCjs($), - Y = U({ - __proto__: null, - default: W - }, [$]); -exports.search = Y; - -/***/ }), - -/***/ "../../graphiql-react/dist/searchcursor.cjs.js": -/*!*****************************************************!*\ - !*** ../../graphiql-react/dist/searchcursor.cjs.js ***! - \*****************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -var n = Object.defineProperty; -var u = (r, o) => n(r, "name", { - value: o, - configurable: !0 -}); -const i = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"), - f = __webpack_require__(/*! ./searchcursor.cjs2.js */ "../../graphiql-react/dist/searchcursor.cjs2.js"); -function l(r, o) { - for (var c = 0; c < o.length; c++) { - const e = o[c]; - if (typeof e != "string" && !Array.isArray(e)) { - for (const t in e) if (t !== "default" && !(t in r)) { - const s = Object.getOwnPropertyDescriptor(e, t); - s && Object.defineProperty(r, t, s.get ? s : { - enumerable: !0, - get: () => e[t] - }); - } - } - } - return Object.freeze(Object.defineProperty(r, Symbol.toStringTag, { - value: "Module" - })); -} -u(l, "_mergeNamespaces"); -var a = f.requireSearchcursor(); -const g = i.getDefaultExportFromCjs(a), - p = l({ - __proto__: null, - default: g - }, [a]); -exports.searchcursor = p; - -/***/ }), - -/***/ "../../graphiql-react/dist/searchcursor.cjs2.js": -/*!******************************************************!*\ - !*** ../../graphiql-react/dist/searchcursor.cjs2.js ***! - \******************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -var W = Object.defineProperty; -var o = (d, E) => W(d, "name", { - value: E, - configurable: !0 -}); -const G = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -var N = { - exports: {} - }, - b; -function H() { - return b || (b = 1, function (d, E) { - (function (m) { - m(G.requireCodemirror()); - })(function (m) { - var a = m.Pos; - function B(e) { - var t = e.flags; - return t !== null && t !== void 0 ? t : (e.ignoreCase ? "i" : "") + (e.global ? "g" : "") + (e.multiline ? "m" : ""); - } - o(B, "regexpFlags"); - function F(e, t) { - for (var n = B(e), r = n, l = 0; l < t.length; l++) r.indexOf(t.charAt(l)) == -1 && (r += t.charAt(l)); - return n == r ? e : new RegExp(e.source, r); - } - o(F, "ensureFlags"); - function R(e) { - return /\\s|\\n|\n|\\W|\\D|\[\^/.test(e.source); - } - o(R, "maybeMultiline"); - function I(e, t, n) { - t = F(t, "g"); - for (var r = n.line, l = n.ch, i = e.lastLine(); r <= i; r++, l = 0) { - t.lastIndex = l; - var h = e.getLine(r), - f = t.exec(h); - if (f) return { - from: a(r, f.index), - to: a(r, f.index + f[0].length), - match: f - }; - } - } - o(I, "searchRegexpForward"); - function j(e, t, n) { - if (!R(t)) return I(e, t, n); - t = F(t, "gm"); - for (var r, l = 1, i = n.line, h = e.lastLine(); i <= h;) { - for (var f = 0; f < l && !(i > h); f++) { - var p = e.getLine(i++); - r = r == null ? p : r + ` -` + p; - } - l = l * 2, t.lastIndex = n.ch; - var u = t.exec(r); - if (u) { - var s = r.slice(0, u.index).split(` -`), - c = u[0].split(` -`), - g = n.line + s.length - 1, - v = s[s.length - 1].length; - return { - from: a(g, v), - to: a(g + c.length - 1, c.length == 1 ? v + c[0].length : c[c.length - 1].length), - match: u - }; - } - } - } - o(j, "searchRegexpForwardMultiline"); - function z(e, t, n) { - for (var r, l = 0; l <= e.length;) { - t.lastIndex = l; - var i = t.exec(e); - if (!i) break; - var h = i.index + i[0].length; - if (h > e.length - n) break; - (!r || h > r.index + r[0].length) && (r = i), l = i.index + 1; - } - return r; - } - o(z, "lastMatchIn"); - function D(e, t, n) { - t = F(t, "g"); - for (var r = n.line, l = n.ch, i = e.firstLine(); r >= i; r--, l = -1) { - var h = e.getLine(r), - f = z(h, t, l < 0 ? 0 : h.length - l); - if (f) return { - from: a(r, f.index), - to: a(r, f.index + f[0].length), - match: f - }; - } - } - o(D, "searchRegexpBackward"); - function A(e, t, n) { - if (!R(t)) return D(e, t, n); - t = F(t, "gm"); - for (var r, l = 1, i = e.getLine(n.line).length - n.ch, h = n.line, f = e.firstLine(); h >= f;) { - for (var p = 0; p < l && h >= f; p++) { - var u = e.getLine(h--); - r = r == null ? u : u + ` -` + r; - } - l *= 2; - var s = z(r, t, i); - if (s) { - var c = r.slice(0, s.index).split(` -`), - g = s[0].split(` -`), - v = h + c.length, - x = c[c.length - 1].length; - return { - from: a(v, x), - to: a(v + g.length - 1, g.length == 1 ? x + g[0].length : g[g.length - 1].length), - match: s - }; - } - } - } - o(A, "searchRegexpBackwardMultiline"); - var P, k; - String.prototype.normalize ? (P = o(function (e) { - return e.normalize("NFD").toLowerCase(); - }, "doFold"), k = o(function (e) { - return e.normalize("NFD"); - }, "noFold")) : (P = o(function (e) { - return e.toLowerCase(); - }, "doFold"), k = o(function (e) { - return e; - }, "noFold")); - function L(e, t, n, r) { - if (e.length == t.length) return n; - for (var l = 0, i = n + Math.max(0, e.length - t.length);;) { - if (l == i) return l; - var h = l + i >> 1, - f = r(e.slice(0, h)).length; - if (f == n) return h; - f > n ? i = h : l = h + 1; - } - } - o(L, "adjustPos"); - function y(e, t, n, r) { - if (!t.length) return null; - var l = r ? P : k, - i = l(t).split(/\r|\n\r?/); - t: for (var h = n.line, f = n.ch, p = e.lastLine() + 1 - i.length; h <= p; h++, f = 0) { - var u = e.getLine(h).slice(f), - s = l(u); - if (i.length == 1) { - var c = s.indexOf(i[0]); - if (c == -1) continue t; - var n = L(u, s, c, l) + f; - return { - from: a(h, L(u, s, c, l) + f), - to: a(h, L(u, s, c + i[0].length, l) + f) - }; - } else { - var g = s.length - i[0].length; - if (s.slice(g) != i[0]) continue t; - for (var v = 1; v < i.length - 1; v++) if (l(e.getLine(h + v)) != i[v]) continue t; - var x = e.getLine(h + i.length - 1), - O = l(x), - S = i[i.length - 1]; - if (O.slice(0, S.length) != S) continue t; - return { - from: a(h, L(u, s, g, l) + f), - to: a(h + i.length - 1, L(x, O, S.length, l)) - }; - } - } - } - o(y, "searchStringForward"); - function C(e, t, n, r) { - if (!t.length) return null; - var l = r ? P : k, - i = l(t).split(/\r|\n\r?/); - t: for (var h = n.line, f = n.ch, p = e.firstLine() - 1 + i.length; h >= p; h--, f = -1) { - var u = e.getLine(h); - f > -1 && (u = u.slice(0, f)); - var s = l(u); - if (i.length == 1) { - var c = s.lastIndexOf(i[0]); - if (c == -1) continue t; - return { - from: a(h, L(u, s, c, l)), - to: a(h, L(u, s, c + i[0].length, l)) - }; - } else { - var g = i[i.length - 1]; - if (s.slice(0, g.length) != g) continue t; - for (var v = 1, n = h - i.length + 1; v < i.length - 1; v++) if (l(e.getLine(n + v)) != i[v]) continue t; - var x = e.getLine(h + 1 - i.length), - O = l(x); - if (O.slice(O.length - i[0].length) != i[0]) continue t; - return { - from: a(h + 1 - i.length, L(x, O, x.length - i[0].length, l)), - to: a(h, L(u, s, g.length, l)) - }; - } - } - } - o(C, "searchStringBackward"); - function w(e, t, n, r) { - this.atOccurrence = !1, this.afterEmptyMatch = !1, this.doc = e, n = n ? e.clipPos(n) : a(0, 0), this.pos = { - from: n, - to: n - }; - var l; - typeof r == "object" ? l = r.caseFold : (l = r, r = null), typeof t == "string" ? (l == null && (l = !1), this.matches = function (i, h) { - return (i ? C : y)(e, t, h, l); - }) : (t = F(t, "gm"), !r || r.multiline !== !1 ? this.matches = function (i, h) { - return (i ? A : j)(e, t, h); - } : this.matches = function (i, h) { - return (i ? D : I)(e, t, h); - }); - } - o(w, "SearchCursor"), w.prototype = { - findNext: function () { - return this.find(!1); - }, - findPrevious: function () { - return this.find(!0); - }, - find: function (e) { - var t = this.doc.clipPos(e ? this.pos.from : this.pos.to); - if (this.afterEmptyMatch && this.atOccurrence && (t = a(t.line, t.ch), e ? (t.ch--, t.ch < 0 && (t.line--, t.ch = (this.doc.getLine(t.line) || "").length)) : (t.ch++, t.ch > (this.doc.getLine(t.line) || "").length && (t.ch = 0, t.line++)), m.cmpPos(t, this.doc.clipPos(t)) != 0)) return this.atOccurrence = !1; - var n = this.matches(e, t); - if (this.afterEmptyMatch = n && m.cmpPos(n.from, n.to) == 0, n) return this.pos = n, this.atOccurrence = !0, this.pos.match || !0; - var r = a(e ? this.doc.firstLine() : this.doc.lastLine() + 1, 0); - return this.pos = { - from: r, - to: r - }, this.atOccurrence = !1; - }, - from: function () { - if (this.atOccurrence) return this.pos.from; - }, - to: function () { - if (this.atOccurrence) return this.pos.to; - }, - replace: function (e, t) { - if (this.atOccurrence) { - var n = m.splitLines(e); - this.doc.replaceRange(n, this.pos.from, this.pos.to, t), this.pos.to = a(this.pos.from.line + n.length - 1, n[n.length - 1].length + (n.length == 1 ? this.pos.from.ch : 0)); - } - } - }, m.defineExtension("getSearchCursor", function (e, t, n) { - return new w(this.doc, e, t, n); - }), m.defineDocExtension("getSearchCursor", function (e, t, n) { - return new w(this, e, t, n); - }), m.defineExtension("selectMatches", function (e, t) { - for (var n = [], r = this.getSearchCursor(e, this.getCursor("from"), t); r.findNext() && !(m.cmpPos(r.to(), this.getCursor("to")) > 0);) n.push({ - anchor: r.from(), - head: r.to() - }); - n.length && this.setSelections(n, 0); - }); - }); - }()), N.exports; -} -o(H, "requireSearchcursor"); -exports.requireSearchcursor = H; - -/***/ }), - -/***/ "../../graphiql-react/dist/show-hint.cjs.js": -/*!**************************************************!*\ - !*** ../../graphiql-react/dist/show-hint.cjs.js ***! - \**************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -var ct = Object.defineProperty; -var p = (H, A) => ct(H, "name", { - value: A, - configurable: !0 -}); -const G = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -function lt(H, A) { - for (var r = 0; r < A.length; r++) { - const w = A[r]; - if (typeof w != "string" && !Array.isArray(w)) { - for (const v in w) if (v !== "default" && !(v in H)) { - const b = Object.getOwnPropertyDescriptor(w, v); - b && Object.defineProperty(H, v, b.get ? b : { - enumerable: !0, - get: () => w[v] - }); - } - } - } - return Object.freeze(Object.defineProperty(H, Symbol.toStringTag, { - value: "Module" - })); -} -p(lt, "_mergeNamespaces"); -var ht = { - exports: {} -}; -(function (H, A) { - (function (r) { - r(G.requireCodemirror()); - })(function (r) { - var w = "CodeMirror-hint", - v = "CodeMirror-hint-active"; - r.showHint = function (t, e, i) { - if (!e) return t.showHint(i); - i && i.async && (e.async = !0); - var n = { - hint: e - }; - if (i) for (var s in i) n[s] = i[s]; - return t.showHint(n); - }, r.defineExtension("showHint", function (t) { - t = tt(this, this.getCursor("start"), t); - var e = this.listSelections(); - if (!(e.length > 1)) { - if (this.somethingSelected()) { - if (!t.hint.supportsSelection) return; - for (var i = 0; i < e.length; i++) if (e[i].head.line != e[i].anchor.line) return; - } - this.state.completionActive && this.state.completionActive.close(); - var n = this.state.completionActive = new b(this, t); - n.options.hint && (r.signal(this, "startCompletion", this), n.update(!0)); - } - }), r.defineExtension("closeHint", function () { - this.state.completionActive && this.state.completionActive.close(); - }); - function b(t, e) { - if (this.cm = t, this.options = e, this.widget = null, this.debounce = 0, this.tick = 0, this.startPos = this.cm.getCursor("start"), this.startLen = this.cm.getLine(this.startPos.line).length - this.cm.getSelection().length, this.options.updateOnCursorActivity) { - var i = this; - t.on("cursorActivity", this.activityFunc = function () { - i.cursorActivity(); - }); - } - } - p(b, "Completion"); - var Q = window.requestAnimationFrame || function (t) { - return setTimeout(t, 1e3 / 60); - }, - Z = window.cancelAnimationFrame || clearTimeout; - b.prototype = { - close: function () { - this.active() && (this.cm.state.completionActive = null, this.tick = null, this.options.updateOnCursorActivity && this.cm.off("cursorActivity", this.activityFunc), this.widget && this.data && r.signal(this.data, "close"), this.widget && this.widget.close(), r.signal(this.cm, "endCompletion", this.cm)); - }, - active: function () { - return this.cm.state.completionActive == this; - }, - pick: function (t, e) { - var i = t.list[e], - n = this; - this.cm.operation(function () { - i.hint ? i.hint(n.cm, t, i) : n.cm.replaceRange(_(i), i.from || t.from, i.to || t.to, "complete"), r.signal(t, "pick", i), n.cm.scrollIntoView(); - }), this.options.closeOnPick && this.close(); - }, - cursorActivity: function () { - this.debounce && (Z(this.debounce), this.debounce = 0); - var t = this.startPos; - this.data && (t = this.data.from); - var e = this.cm.getCursor(), - i = this.cm.getLine(e.line); - if (e.line != this.startPos.line || i.length - e.ch != this.startLen - this.startPos.ch || e.ch < t.ch || this.cm.somethingSelected() || !e.ch || this.options.closeCharacters.test(i.charAt(e.ch - 1))) this.close();else { - var n = this; - this.debounce = Q(function () { - n.update(); - }), this.widget && this.widget.disable(); - } - }, - update: function (t) { - if (this.tick != null) { - var e = this, - i = ++this.tick; - U(this.options.hint, this.cm, this.options, function (n) { - e.tick == i && e.finishUpdate(n, t); - }); - } - }, - finishUpdate: function (t, e) { - this.data && r.signal(this.data, "update"); - var i = this.widget && this.widget.picked || e && this.options.completeSingle; - this.widget && this.widget.close(), this.data = t, t && t.list.length && (i && t.list.length == 1 ? this.pick(t, 0) : (this.widget = new K(this, t), r.signal(t, "shown"))); - } - }; - function tt(t, e, i) { - var n = t.options.hintOptions, - s = {}; - for (var c in D) s[c] = D[c]; - if (n) for (var c in n) n[c] !== void 0 && (s[c] = n[c]); - if (i) for (var c in i) i[c] !== void 0 && (s[c] = i[c]); - return s.hint.resolve && (s.hint = s.hint.resolve(t, e)), s; - } - p(tt, "parseOptions"); - function _(t) { - return typeof t == "string" ? t : t.text; - } - p(_, "getText"); - function et(t, e) { - var i = { - Up: function () { - e.moveFocus(-1); - }, - Down: function () { - e.moveFocus(1); - }, - PageUp: function () { - e.moveFocus(-e.menuSize() + 1, !0); - }, - PageDown: function () { - e.moveFocus(e.menuSize() - 1, !0); - }, - Home: function () { - e.setFocus(0); - }, - End: function () { - e.setFocus(e.length - 1); - }, - Enter: e.pick, - Tab: e.pick, - Esc: e.close - }, - n = /Mac/.test(navigator.platform); - n && (i["Ctrl-P"] = function () { - e.moveFocus(-1); - }, i["Ctrl-N"] = function () { - e.moveFocus(1); - }); - var s = t.options.customKeys, - c = s ? {} : i; - function o(u, l) { - var a; - typeof l != "string" ? a = p(function (S) { - return l(S, e); - }, "bound") : i.hasOwnProperty(l) ? a = i[l] : a = l, c[u] = a; - } - if (p(o, "addBinding"), s) for (var f in s) s.hasOwnProperty(f) && o(f, s[f]); - var h = t.options.extraKeys; - if (h) for (var f in h) h.hasOwnProperty(f) && o(f, h[f]); - return c; - } - p(et, "buildKeyMap"); - function B(t, e) { - for (; e && e != t;) { - if (e.nodeName.toUpperCase() === "LI" && e.parentNode == t) return e; - e = e.parentNode; - } - } - p(B, "getHintElement"); - function K(t, e) { - this.id = "cm-complete-" + Math.floor(Math.random(1e6)), this.completion = t, this.data = e, this.picked = !1; - var i = this, - n = t.cm, - s = n.getInputField().ownerDocument, - c = s.defaultView || s.parentWindow, - o = this.hints = s.createElement("ul"); - o.setAttribute("role", "listbox"), o.setAttribute("aria-expanded", "true"), o.id = this.id; - var f = t.cm.options.theme; - o.className = "CodeMirror-hints " + f, this.selectedHint = e.selectedHint || 0; - for (var h = e.list, u = 0; u < h.length; ++u) { - var l = o.appendChild(s.createElement("li")), - a = h[u], - S = w + (u != this.selectedHint ? "" : " " + v); - a.className != null && (S = a.className + " " + S), l.className = S, u == this.selectedHint && l.setAttribute("aria-selected", "true"), l.id = this.id + "-" + u, l.setAttribute("role", "option"), a.render ? a.render(l, e, a) : l.appendChild(s.createTextNode(a.displayText || _(a))), l.hintId = u; - } - var T = t.options.container || s.body, - y = n.cursorCoords(t.options.alignWithWord ? e.from : null), - k = y.left, - O = y.bottom, - j = !0, - F = 0, - E = 0; - if (T !== s.body) { - var st = ["absolute", "relative", "fixed"].indexOf(c.getComputedStyle(T).position) !== -1, - W = st ? T : T.offsetParent, - M = W.getBoundingClientRect(), - q = s.body.getBoundingClientRect(); - F = M.left - q.left - W.scrollLeft, E = M.top - q.top - W.scrollTop; - } - o.style.left = k - F + "px", o.style.top = O - E + "px"; - var N = c.innerWidth || Math.max(s.body.offsetWidth, s.documentElement.offsetWidth), - L = c.innerHeight || Math.max(s.body.offsetHeight, s.documentElement.offsetHeight); - T.appendChild(o), n.getInputField().setAttribute("aria-autocomplete", "list"), n.getInputField().setAttribute("aria-owns", this.id), n.getInputField().setAttribute("aria-activedescendant", this.id + "-" + this.selectedHint); - var m = t.options.moveOnOverlap ? o.getBoundingClientRect() : new DOMRect(), - z = t.options.paddingForScrollbar ? o.scrollHeight > o.clientHeight + 1 : !1, - x; - setTimeout(function () { - x = n.getScrollInfo(); - }); - var ot = m.bottom - L; - if (ot > 0) { - var P = m.bottom - m.top, - rt = y.top - (y.bottom - m.top); - if (rt - P > 0) o.style.top = (O = y.top - P - E) + "px", j = !1;else if (P > L) { - o.style.height = L - 5 + "px", o.style.top = (O = y.bottom - m.top - E) + "px"; - var V = n.getCursor(); - e.from.ch != V.ch && (y = n.cursorCoords(V), o.style.left = (k = y.left - F) + "px", m = o.getBoundingClientRect()); - } - } - var C = m.right - N; - if (z && (C += n.display.nativeBarWidth), C > 0 && (m.right - m.left > N && (o.style.width = N - 5 + "px", C -= m.right - m.left - N), o.style.left = (k = y.left - C - F) + "px"), z) for (var I = o.firstChild; I; I = I.nextSibling) I.style.paddingRight = n.display.nativeBarWidth + "px"; - if (n.addKeyMap(this.keyMap = et(t, { - moveFocus: function (d, g) { - i.changeActive(i.selectedHint + d, g); - }, - setFocus: function (d) { - i.changeActive(d); - }, - menuSize: function () { - return i.screenAmount(); - }, - length: h.length, - close: function () { - t.close(); - }, - pick: function () { - i.pick(); - }, - data: e - })), t.options.closeOnUnfocus) { - var Y; - n.on("blur", this.onBlur = function () { - Y = setTimeout(function () { - t.close(); - }, 100); - }), n.on("focus", this.onFocus = function () { - clearTimeout(Y); - }); - } - n.on("scroll", this.onScroll = function () { - var d = n.getScrollInfo(), - g = n.getWrapperElement().getBoundingClientRect(); - x || (x = n.getScrollInfo()); - var X = O + x.top - d.top, - R = X - (c.pageYOffset || (s.documentElement || s.body).scrollTop); - if (j || (R += o.offsetHeight), R <= g.top || R >= g.bottom) return t.close(); - o.style.top = X + "px", o.style.left = k + x.left - d.left + "px"; - }), r.on(o, "dblclick", function (d) { - var g = B(o, d.target || d.srcElement); - g && g.hintId != null && (i.changeActive(g.hintId), i.pick()); - }), r.on(o, "click", function (d) { - var g = B(o, d.target || d.srcElement); - g && g.hintId != null && (i.changeActive(g.hintId), t.options.completeOnSingleClick && i.pick()); - }), r.on(o, "mousedown", function () { - setTimeout(function () { - n.focus(); - }, 20); - }); - var $ = this.getSelectedHintRange(); - return ($.from !== 0 || $.to !== 0) && this.scrollToActive(), r.signal(e, "select", h[this.selectedHint], o.childNodes[this.selectedHint]), !0; - } - p(K, "Widget"), K.prototype = { - close: function () { - if (this.completion.widget == this) { - this.completion.widget = null, this.hints.parentNode && this.hints.parentNode.removeChild(this.hints), this.completion.cm.removeKeyMap(this.keyMap); - var t = this.completion.cm.getInputField(); - t.removeAttribute("aria-activedescendant"), t.removeAttribute("aria-owns"); - var e = this.completion.cm; - this.completion.options.closeOnUnfocus && (e.off("blur", this.onBlur), e.off("focus", this.onFocus)), e.off("scroll", this.onScroll); - } - }, - disable: function () { - this.completion.cm.removeKeyMap(this.keyMap); - var t = this; - this.keyMap = { - Enter: function () { - t.picked = !0; - } - }, this.completion.cm.addKeyMap(this.keyMap); - }, - pick: function () { - this.completion.pick(this.data, this.selectedHint); - }, - changeActive: function (t, e) { - if (t >= this.data.list.length ? t = e ? this.data.list.length - 1 : 0 : t < 0 && (t = e ? 0 : this.data.list.length - 1), this.selectedHint != t) { - var i = this.hints.childNodes[this.selectedHint]; - i && (i.className = i.className.replace(" " + v, ""), i.removeAttribute("aria-selected")), i = this.hints.childNodes[this.selectedHint = t], i.className += " " + v, i.setAttribute("aria-selected", "true"), this.completion.cm.getInputField().setAttribute("aria-activedescendant", i.id), this.scrollToActive(), r.signal(this.data, "select", this.data.list[this.selectedHint], i); - } - }, - scrollToActive: function () { - var t = this.getSelectedHintRange(), - e = this.hints.childNodes[t.from], - i = this.hints.childNodes[t.to], - n = this.hints.firstChild; - e.offsetTop < this.hints.scrollTop ? this.hints.scrollTop = e.offsetTop - n.offsetTop : i.offsetTop + i.offsetHeight > this.hints.scrollTop + this.hints.clientHeight && (this.hints.scrollTop = i.offsetTop + i.offsetHeight - this.hints.clientHeight + n.offsetTop); - }, - screenAmount: function () { - return Math.floor(this.hints.clientHeight / this.hints.firstChild.offsetHeight) || 1; - }, - getSelectedHintRange: function () { - var t = this.completion.options.scrollMargin || 0; - return { - from: Math.max(0, this.selectedHint - t), - to: Math.min(this.data.list.length - 1, this.selectedHint + t) - }; - } - }; - function it(t, e) { - if (!t.somethingSelected()) return e; - for (var i = [], n = 0; n < e.length; n++) e[n].supportsSelection && i.push(e[n]); - return i; - } - p(it, "applicableHelpers"); - function U(t, e, i, n) { - if (t.async) t(e, n, i);else { - var s = t(e, i); - s && s.then ? s.then(n) : n(s); - } - } - p(U, "fetchHints"); - function nt(t, e) { - var i = t.getHelpers(e, "hint"), - n; - if (i.length) { - var s = p(function (c, o, f) { - var h = it(c, i); - function u(l) { - if (l == h.length) return o(null); - U(h[l], c, f, function (a) { - a && a.list.length > 0 ? o(a) : u(l + 1); - }); - } - p(u, "run"), u(0); - }, "resolved"); - return s.async = !0, s.supportsSelection = !0, s; - } else return (n = t.getHelper(t.getCursor(), "hintWords")) ? function (c) { - return r.hint.fromList(c, { - words: n - }); - } : r.hint.anyword ? function (c, o) { - return r.hint.anyword(c, o); - } : function () {}; - } - p(nt, "resolveAutoHints"), r.registerHelper("hint", "auto", { - resolve: nt - }), r.registerHelper("hint", "fromList", function (t, e) { - var i = t.getCursor(), - n = t.getTokenAt(i), - s, - c = r.Pos(i.line, n.start), - o = i; - n.start < i.ch && /\w/.test(n.string.charAt(i.ch - n.start - 1)) ? s = n.string.substr(0, i.ch - n.start) : (s = "", c = i); - for (var f = [], h = 0; h < e.words.length; h++) { - var u = e.words[h]; - u.slice(0, s.length) == s && f.push(u); - } - if (f.length) return { - list: f, - from: c, - to: o - }; - }), r.commands.autocomplete = r.showHint; - var D = { - hint: r.hint.auto, - completeSingle: !0, - alignWithWord: !0, - closeCharacters: /[\s()\[\]{};:>,]/, - closeOnPick: !0, - closeOnUnfocus: !0, - updateOnCursorActivity: !0, - completeOnSingleClick: !0, - container: null, - customKeys: null, - extraKeys: null, - paddingForScrollbar: !0, - moveOnOverlap: !0 - }; - r.defineOption("hintOptions", null); - }); -})(); -var J = ht.exports; -const at = G.getDefaultExportFromCjs(J), - ft = lt({ - __proto__: null, - default: at - }, [J]); -exports.showHint = ft; - -/***/ }), - -/***/ "../../graphiql-react/dist/sublime.cjs.js": -/*!************************************************!*\ - !*** ../../graphiql-react/dist/sublime.cjs.js ***! - \************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -var _ = Object.defineProperty; -var v = (m, B) => _(m, "name", { - value: B, - configurable: !0 -}); -const E = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"), - Y = __webpack_require__(/*! ./searchcursor.cjs2.js */ "../../graphiql-react/dist/searchcursor.cjs2.js"), - z = __webpack_require__(/*! ./matchbrackets.cjs2.js */ "../../graphiql-react/dist/matchbrackets.cjs2.js"); -function J(m, B) { - for (var h = 0; h < B.length; h++) { - const a = B[h]; - if (typeof a != "string" && !Array.isArray(a)) { - for (const f in a) if (f !== "default" && !(f in m)) { - const A = Object.getOwnPropertyDescriptor(a, f); - A && Object.defineProperty(m, f, A.get ? A : { - enumerable: !0, - get: () => a[f] - }); - } - } - } - return Object.freeze(Object.defineProperty(m, Symbol.toStringTag, { - value: "Module" - })); -} -v(J, "_mergeNamespaces"); -var G = { - exports: {} -}; -(function (m, B) { - (function (h) { - h(E.requireCodemirror(), Y.requireSearchcursor(), z.requireMatchbrackets()); - })(function (h) { - var a = h.commands, - f = h.Pos; - function A(e, t, n) { - if (n < 0 && t.ch == 0) return e.clipPos(f(t.line - 1)); - var r = e.getLine(t.line); - if (n > 0 && t.ch >= r.length) return e.clipPos(f(t.line + 1, 0)); - for (var l = "start", i, o = t.ch, s = o, u = n < 0 ? 0 : r.length, d = 0; s != u; s += n, d++) { - var p = r.charAt(n < 0 ? s - 1 : s), - c = p != "_" && h.isWordChar(p) ? "w" : "o"; - if (c == "w" && p.toUpperCase() == p && (c = "W"), l == "start") c != "o" ? (l = "in", i = c) : o = s + n;else if (l == "in" && i != c) { - if (i == "w" && c == "W" && n < 0 && s--, i == "W" && c == "w" && n > 0) if (s == o + 1) { - i = "w"; - continue; - } else s--; - break; - } - } - return f(t.line, s); - } - v(A, "findPosSubword"); - function T(e, t) { - e.extendSelectionsBy(function (n) { - return e.display.shift || e.doc.extend || n.empty() ? A(e.doc, n.head, t) : t < 0 ? n.from() : n.to(); - }); - } - v(T, "moveSubword"), a.goSubwordLeft = function (e) { - T(e, -1); - }, a.goSubwordRight = function (e) { - T(e, 1); - }, a.scrollLineUp = function (e) { - var t = e.getScrollInfo(); - if (!e.somethingSelected()) { - var n = e.lineAtHeight(t.top + t.clientHeight, "local"); - e.getCursor().line >= n && e.execCommand("goLineUp"); - } - e.scrollTo(null, t.top - e.defaultTextHeight()); - }, a.scrollLineDown = function (e) { - var t = e.getScrollInfo(); - if (!e.somethingSelected()) { - var n = e.lineAtHeight(t.top, "local") + 1; - e.getCursor().line <= n && e.execCommand("goLineDown"); - } - e.scrollTo(null, t.top + e.defaultTextHeight()); - }, a.splitSelectionByLine = function (e) { - for (var t = e.listSelections(), n = [], r = 0; r < t.length; r++) for (var l = t[r].from(), i = t[r].to(), o = l.line; o <= i.line; ++o) i.line > l.line && o == i.line && i.ch == 0 || n.push({ - anchor: o == l.line ? l : f(o, 0), - head: o == i.line ? i : f(o) - }); - e.setSelections(n, 0); - }, a.singleSelectionTop = function (e) { - var t = e.listSelections()[0]; - e.setSelection(t.anchor, t.head, { - scroll: !1 - }); - }, a.selectLine = function (e) { - for (var t = e.listSelections(), n = [], r = 0; r < t.length; r++) { - var l = t[r]; - n.push({ - anchor: f(l.from().line, 0), - head: f(l.to().line + 1, 0) - }); - } - e.setSelections(n); - }; - function x(e, t) { - if (e.isReadOnly()) return h.Pass; - e.operation(function () { - for (var n = e.listSelections().length, r = [], l = -1, i = 0; i < n; i++) { - var o = e.listSelections()[i].head; - if (!(o.line <= l)) { - var s = f(o.line + (t ? 0 : 1), 0); - e.replaceRange(` -`, s, null, "+insertLine"), e.indentLine(s.line, null, !0), r.push({ - head: s, - anchor: s - }), l = o.line + 1; - } - } - e.setSelections(r); - }), e.execCommand("indentAuto"); - } - v(x, "insertLine"), a.insertLineAfter = function (e) { - return x(e, !1); - }, a.insertLineBefore = function (e) { - return x(e, !0); - }; - function K(e, t) { - for (var n = t.ch, r = n, l = e.getLine(t.line); n && h.isWordChar(l.charAt(n - 1));) --n; - for (; r < l.length && h.isWordChar(l.charAt(r));) ++r; - return { - from: f(t.line, n), - to: f(t.line, r), - word: l.slice(n, r) - }; - } - v(K, "wordAt"), a.selectNextOccurrence = function (e) { - var t = e.getCursor("from"), - n = e.getCursor("to"), - r = e.state.sublimeFindFullWord == e.doc.sel; - if (h.cmpPos(t, n) == 0) { - var l = K(e, t); - if (!l.word) return; - e.setSelection(l.from, l.to), r = !0; - } else { - var i = e.getRange(t, n), - o = r ? new RegExp("\\b" + i + "\\b") : i, - s = e.getSearchCursor(o, n), - u = s.findNext(); - if (u || (s = e.getSearchCursor(o, f(e.firstLine(), 0)), u = s.findNext()), !u || H(e.listSelections(), s.from(), s.to())) return; - e.addSelection(s.from(), s.to()); - } - r && (e.state.sublimeFindFullWord = e.doc.sel); - }, a.skipAndSelectNextOccurrence = function (e) { - var t = e.getCursor("anchor"), - n = e.getCursor("head"); - a.selectNextOccurrence(e), h.cmpPos(t, n) != 0 && e.doc.setSelections(e.doc.listSelections().filter(function (r) { - return r.anchor != t || r.head != n; - })); - }; - function y(e, t) { - for (var n = e.listSelections(), r = [], l = 0; l < n.length; l++) { - var i = n[l], - o = e.findPosV(i.anchor, t, "line", i.anchor.goalColumn), - s = e.findPosV(i.head, t, "line", i.head.goalColumn); - o.goalColumn = i.anchor.goalColumn != null ? i.anchor.goalColumn : e.cursorCoords(i.anchor, "div").left, s.goalColumn = i.head.goalColumn != null ? i.head.goalColumn : e.cursorCoords(i.head, "div").left; - var u = { - anchor: o, - head: s - }; - r.push(i), r.push(u); - } - e.setSelections(r); - } - v(y, "addCursorToSelection"), a.addCursorToPrevLine = function (e) { - y(e, -1); - }, a.addCursorToNextLine = function (e) { - y(e, 1); - }; - function H(e, t, n) { - for (var r = 0; r < e.length; r++) if (h.cmpPos(e[r].from(), t) == 0 && h.cmpPos(e[r].to(), n) == 0) return !0; - return !1; - } - v(H, "isSelectedRange"); - var P = "(){}[]"; - function U(e) { - for (var t = e.listSelections(), n = [], r = 0; r < t.length; r++) { - var l = t[r], - i = l.head, - o = e.scanForBracket(i, -1); - if (!o) return !1; - for (;;) { - var s = e.scanForBracket(i, 1); - if (!s) return !1; - if (s.ch == P.charAt(P.indexOf(o.ch) + 1)) { - var u = f(o.pos.line, o.pos.ch + 1); - if (h.cmpPos(u, l.from()) == 0 && h.cmpPos(s.pos, l.to()) == 0) { - if (o = e.scanForBracket(o.pos, -1), !o) return !1; - } else { - n.push({ - anchor: u, - head: s.pos - }); - break; - } - } - i = f(s.pos.line, s.pos.ch + 1); - } - } - return e.setSelections(n), !0; - } - v(U, "selectBetweenBrackets"), a.selectScope = function (e) { - U(e) || e.execCommand("selectAll"); - }, a.selectBetweenBrackets = function (e) { - if (!U(e)) return h.Pass; - }; - function I(e) { - return e ? /\bpunctuation\b/.test(e) ? e : void 0 : null; - } - v(I, "puncType"), a.goToBracket = function (e) { - e.extendSelectionsBy(function (t) { - var n = e.scanForBracket(t.head, 1, I(e.getTokenTypeAt(t.head))); - if (n && h.cmpPos(n.pos, t.head) != 0) return n.pos; - var r = e.scanForBracket(t.head, -1, I(e.getTokenTypeAt(f(t.head.line, t.head.ch + 1)))); - return r && f(r.pos.line, r.pos.ch + 1) || t.head; - }); - }, a.swapLineUp = function (e) { - if (e.isReadOnly()) return h.Pass; - for (var t = e.listSelections(), n = [], r = e.firstLine() - 1, l = [], i = 0; i < t.length; i++) { - var o = t[i], - s = o.from().line - 1, - u = o.to().line; - l.push({ - anchor: f(o.anchor.line - 1, o.anchor.ch), - head: f(o.head.line - 1, o.head.ch) - }), o.to().ch == 0 && !o.empty() && --u, s > r ? n.push(s, u) : n.length && (n[n.length - 1] = u), r = u; - } - e.operation(function () { - for (var d = 0; d < n.length; d += 2) { - var p = n[d], - c = n[d + 1], - b = e.getLine(p); - e.replaceRange("", f(p, 0), f(p + 1, 0), "+swapLine"), c > e.lastLine() ? e.replaceRange(` -` + b, f(e.lastLine()), null, "+swapLine") : e.replaceRange(b + ` -`, f(c, 0), null, "+swapLine"); - } - e.setSelections(l), e.scrollIntoView(); - }); - }, a.swapLineDown = function (e) { - if (e.isReadOnly()) return h.Pass; - for (var t = e.listSelections(), n = [], r = e.lastLine() + 1, l = t.length - 1; l >= 0; l--) { - var i = t[l], - o = i.to().line + 1, - s = i.from().line; - i.to().ch == 0 && !i.empty() && o--, o < r ? n.push(o, s) : n.length && (n[n.length - 1] = s), r = s; - } - e.operation(function () { - for (var u = n.length - 2; u >= 0; u -= 2) { - var d = n[u], - p = n[u + 1], - c = e.getLine(d); - d == e.lastLine() ? e.replaceRange("", f(d - 1), f(d), "+swapLine") : e.replaceRange("", f(d, 0), f(d + 1, 0), "+swapLine"), e.replaceRange(c + ` -`, f(p, 0), null, "+swapLine"); - } - e.scrollIntoView(); - }); - }, a.toggleCommentIndented = function (e) { - e.toggleComment({ - indent: !0 - }); - }, a.joinLines = function (e) { - for (var t = e.listSelections(), n = [], r = 0; r < t.length; r++) { - for (var l = t[r], i = l.from(), o = i.line, s = l.to().line; r < t.length - 1 && t[r + 1].from().line == s;) s = t[++r].to().line; - n.push({ - start: o, - end: s, - anchor: !l.empty() && i - }); - } - e.operation(function () { - for (var u = 0, d = [], p = 0; p < n.length; p++) { - for (var c = n[p], b = c.anchor && f(c.anchor.line - u, c.anchor.ch), w, g = c.start; g <= c.end; g++) { - var S = g - u; - g == c.end && (w = f(S, e.getLine(S).length + 1)), S < e.lastLine() && (e.replaceRange(" ", f(S), f(S + 1, /^\s*/.exec(e.getLine(S + 1))[0].length)), ++u); - } - d.push({ - anchor: b || w, - head: w - }); - } - e.setSelections(d, 0); - }); - }, a.duplicateLine = function (e) { - e.operation(function () { - for (var t = e.listSelections().length, n = 0; n < t; n++) { - var r = e.listSelections()[n]; - r.empty() ? e.replaceRange(e.getLine(r.head.line) + ` -`, f(r.head.line, 0)) : e.replaceRange(e.getRange(r.from(), r.to()), r.from()); - } - e.scrollIntoView(); - }); - }; - function R(e, t, n) { - if (e.isReadOnly()) return h.Pass; - for (var r = e.listSelections(), l = [], i, o = 0; o < r.length; o++) { - var s = r[o]; - if (!s.empty()) { - for (var u = s.from().line, d = s.to().line; o < r.length - 1 && r[o + 1].from().line == d;) d = r[++o].to().line; - r[o].to().ch || d--, l.push(u, d); - } - } - l.length ? i = !0 : l.push(e.firstLine(), e.lastLine()), e.operation(function () { - for (var p = [], c = 0; c < l.length; c += 2) { - var b = l[c], - w = l[c + 1], - g = f(b, 0), - S = f(w), - F = e.getRange(g, S, !1); - t ? F.sort(function (k, L) { - return k < L ? -n : k == L ? 0 : n; - }) : F.sort(function (k, L) { - var W = k.toUpperCase(), - M = L.toUpperCase(); - return W != M && (k = W, L = M), k < L ? -n : k == L ? 0 : n; - }), e.replaceRange(F, g, S), i && p.push({ - anchor: g, - head: f(w + 1, 0) - }); - } - i && e.setSelections(p, 0); - }); - } - v(R, "sortLines"), a.sortLines = function (e) { - R(e, !0, 1); - }, a.reverseSortLines = function (e) { - R(e, !0, -1); - }, a.sortLinesInsensitive = function (e) { - R(e, !1, 1); - }, a.reverseSortLinesInsensitive = function (e) { - R(e, !1, -1); - }, a.nextBookmark = function (e) { - var t = e.state.sublimeBookmarks; - if (t) for (; t.length;) { - var n = t.shift(), - r = n.find(); - if (r) return t.push(n), e.setSelection(r.from, r.to); - } - }, a.prevBookmark = function (e) { - var t = e.state.sublimeBookmarks; - if (t) for (; t.length;) { - t.unshift(t.pop()); - var n = t[t.length - 1].find(); - if (!n) t.pop();else return e.setSelection(n.from, n.to); - } - }, a.toggleBookmark = function (e) { - for (var t = e.listSelections(), n = e.state.sublimeBookmarks || (e.state.sublimeBookmarks = []), r = 0; r < t.length; r++) { - for (var l = t[r].from(), i = t[r].to(), o = t[r].empty() ? e.findMarksAt(l) : e.findMarks(l, i), s = 0; s < o.length; s++) if (o[s].sublimeBookmark) { - o[s].clear(); - for (var u = 0; u < n.length; u++) n[u] == o[s] && n.splice(u--, 1); - break; - } - s == o.length && n.push(e.markText(l, i, { - sublimeBookmark: !0, - clearWhenEmpty: !1 - })); - } - }, a.clearBookmarks = function (e) { - var t = e.state.sublimeBookmarks; - if (t) for (var n = 0; n < t.length; n++) t[n].clear(); - t.length = 0; - }, a.selectBookmarks = function (e) { - var t = e.state.sublimeBookmarks, - n = []; - if (t) for (var r = 0; r < t.length; r++) { - var l = t[r].find(); - l ? n.push({ - anchor: l.from, - head: l.to - }) : t.splice(r--, 0); - } - n.length && e.setSelections(n, 0); - }; - function D(e, t) { - e.operation(function () { - for (var n = e.listSelections(), r = [], l = [], i = 0; i < n.length; i++) { - var o = n[i]; - o.empty() ? (r.push(i), l.push("")) : l.push(t(e.getRange(o.from(), o.to()))); - } - e.replaceSelections(l, "around", "case"); - for (var i = r.length - 1, s; i >= 0; i--) { - var o = n[r[i]]; - if (!(s && h.cmpPos(o.head, s) > 0)) { - var u = K(e, o.head); - s = u.from, e.replaceRange(t(u.word), u.from, u.to); - } - } - }); - } - v(D, "modifyWordOrSelection"), a.smartBackspace = function (e) { - if (e.somethingSelected()) return h.Pass; - e.operation(function () { - for (var t = e.listSelections(), n = e.getOption("indentUnit"), r = t.length - 1; r >= 0; r--) { - var l = t[r].head, - i = e.getRange({ - line: l.line, - ch: 0 - }, l), - o = h.countColumn(i, null, e.getOption("tabSize")), - s = e.findPosH(l, -1, "char", !1); - if (i && !/\S/.test(i) && o % n == 0) { - var u = new f(l.line, h.findColumn(i, o - n, n)); - u.ch != l.ch && (s = u); - } - e.replaceRange("", s, l, "+delete"); - } - }); - }, a.delLineRight = function (e) { - e.operation(function () { - for (var t = e.listSelections(), n = t.length - 1; n >= 0; n--) e.replaceRange("", t[n].anchor, f(t[n].to().line), "+delete"); - e.scrollIntoView(); - }); - }, a.upcaseAtCursor = function (e) { - D(e, function (t) { - return t.toUpperCase(); - }); - }, a.downcaseAtCursor = function (e) { - D(e, function (t) { - return t.toLowerCase(); - }); - }, a.setSublimeMark = function (e) { - e.state.sublimeMark && e.state.sublimeMark.clear(), e.state.sublimeMark = e.setBookmark(e.getCursor()); - }, a.selectToSublimeMark = function (e) { - var t = e.state.sublimeMark && e.state.sublimeMark.find(); - t && e.setSelection(e.getCursor(), t); - }, a.deleteToSublimeMark = function (e) { - var t = e.state.sublimeMark && e.state.sublimeMark.find(); - if (t) { - var n = e.getCursor(), - r = t; - if (h.cmpPos(n, r) > 0) { - var l = r; - r = n, n = l; - } - e.state.sublimeKilled = e.getRange(n, r), e.replaceRange("", n, r); - } - }, a.swapWithSublimeMark = function (e) { - var t = e.state.sublimeMark && e.state.sublimeMark.find(); - t && (e.state.sublimeMark.clear(), e.state.sublimeMark = e.setBookmark(e.getCursor()), e.setCursor(t)); - }, a.sublimeYank = function (e) { - e.state.sublimeKilled != null && e.replaceSelection(e.state.sublimeKilled, null, "paste"); - }, a.showInCenter = function (e) { - var t = e.cursorCoords(null, "local"); - e.scrollTo(null, (t.top + t.bottom) / 2 - e.getScrollInfo().clientHeight / 2); - }; - function N(e) { - var t = e.getCursor("from"), - n = e.getCursor("to"); - if (h.cmpPos(t, n) == 0) { - var r = K(e, t); - if (!r.word) return; - t = r.from, n = r.to; - } - return { - from: t, - to: n, - query: e.getRange(t, n), - word: r - }; - } - v(N, "getTarget"); - function O(e, t) { - var n = N(e); - if (n) { - var r = n.query, - l = e.getSearchCursor(r, t ? n.to : n.from); - (t ? l.findNext() : l.findPrevious()) ? e.setSelection(l.from(), l.to()) : (l = e.getSearchCursor(r, t ? f(e.firstLine(), 0) : e.clipPos(f(e.lastLine()))), (t ? l.findNext() : l.findPrevious()) ? e.setSelection(l.from(), l.to()) : n.word && e.setSelection(n.from, n.to)); - } - } - v(O, "findAndGoTo"), a.findUnder = function (e) { - O(e, !0); - }, a.findUnderPrevious = function (e) { - O(e, !1); - }, a.findAllUnder = function (e) { - var t = N(e); - if (t) { - for (var n = e.getSearchCursor(t.query), r = [], l = -1; n.findNext();) r.push({ - anchor: n.from(), - head: n.to() - }), n.from().line <= t.from.line && n.from().ch <= t.from.ch && l++; - e.setSelections(r, l); - } - }; - var C = h.keyMap; - C.macSublime = { - "Cmd-Left": "goLineStartSmart", - "Shift-Tab": "indentLess", - "Shift-Ctrl-K": "deleteLine", - "Alt-Q": "wrapLines", - "Ctrl-Left": "goSubwordLeft", - "Ctrl-Right": "goSubwordRight", - "Ctrl-Alt-Up": "scrollLineUp", - "Ctrl-Alt-Down": "scrollLineDown", - "Cmd-L": "selectLine", - "Shift-Cmd-L": "splitSelectionByLine", - Esc: "singleSelectionTop", - "Cmd-Enter": "insertLineAfter", - "Shift-Cmd-Enter": "insertLineBefore", - "Cmd-D": "selectNextOccurrence", - "Shift-Cmd-Space": "selectScope", - "Shift-Cmd-M": "selectBetweenBrackets", - "Cmd-M": "goToBracket", - "Cmd-Ctrl-Up": "swapLineUp", - "Cmd-Ctrl-Down": "swapLineDown", - "Cmd-/": "toggleCommentIndented", - "Cmd-J": "joinLines", - "Shift-Cmd-D": "duplicateLine", - F5: "sortLines", - "Shift-F5": "reverseSortLines", - "Cmd-F5": "sortLinesInsensitive", - "Shift-Cmd-F5": "reverseSortLinesInsensitive", - F2: "nextBookmark", - "Shift-F2": "prevBookmark", - "Cmd-F2": "toggleBookmark", - "Shift-Cmd-F2": "clearBookmarks", - "Alt-F2": "selectBookmarks", - Backspace: "smartBackspace", - "Cmd-K Cmd-D": "skipAndSelectNextOccurrence", - "Cmd-K Cmd-K": "delLineRight", - "Cmd-K Cmd-U": "upcaseAtCursor", - "Cmd-K Cmd-L": "downcaseAtCursor", - "Cmd-K Cmd-Space": "setSublimeMark", - "Cmd-K Cmd-A": "selectToSublimeMark", - "Cmd-K Cmd-W": "deleteToSublimeMark", - "Cmd-K Cmd-X": "swapWithSublimeMark", - "Cmd-K Cmd-Y": "sublimeYank", - "Cmd-K Cmd-C": "showInCenter", - "Cmd-K Cmd-G": "clearBookmarks", - "Cmd-K Cmd-Backspace": "delLineLeft", - "Cmd-K Cmd-1": "foldAll", - "Cmd-K Cmd-0": "unfoldAll", - "Cmd-K Cmd-J": "unfoldAll", - "Ctrl-Shift-Up": "addCursorToPrevLine", - "Ctrl-Shift-Down": "addCursorToNextLine", - "Cmd-F3": "findUnder", - "Shift-Cmd-F3": "findUnderPrevious", - "Alt-F3": "findAllUnder", - "Shift-Cmd-[": "fold", - "Shift-Cmd-]": "unfold", - "Cmd-I": "findIncremental", - "Shift-Cmd-I": "findIncrementalReverse", - "Cmd-H": "replace", - F3: "findNext", - "Shift-F3": "findPrev", - fallthrough: "macDefault" - }, h.normalizeKeyMap(C.macSublime), C.pcSublime = { - "Shift-Tab": "indentLess", - "Shift-Ctrl-K": "deleteLine", - "Alt-Q": "wrapLines", - "Ctrl-T": "transposeChars", - "Alt-Left": "goSubwordLeft", - "Alt-Right": "goSubwordRight", - "Ctrl-Up": "scrollLineUp", - "Ctrl-Down": "scrollLineDown", - "Ctrl-L": "selectLine", - "Shift-Ctrl-L": "splitSelectionByLine", - Esc: "singleSelectionTop", - "Ctrl-Enter": "insertLineAfter", - "Shift-Ctrl-Enter": "insertLineBefore", - "Ctrl-D": "selectNextOccurrence", - "Shift-Ctrl-Space": "selectScope", - "Shift-Ctrl-M": "selectBetweenBrackets", - "Ctrl-M": "goToBracket", - "Shift-Ctrl-Up": "swapLineUp", - "Shift-Ctrl-Down": "swapLineDown", - "Ctrl-/": "toggleCommentIndented", - "Ctrl-J": "joinLines", - "Shift-Ctrl-D": "duplicateLine", - F9: "sortLines", - "Shift-F9": "reverseSortLines", - "Ctrl-F9": "sortLinesInsensitive", - "Shift-Ctrl-F9": "reverseSortLinesInsensitive", - F2: "nextBookmark", - "Shift-F2": "prevBookmark", - "Ctrl-F2": "toggleBookmark", - "Shift-Ctrl-F2": "clearBookmarks", - "Alt-F2": "selectBookmarks", - Backspace: "smartBackspace", - "Ctrl-K Ctrl-D": "skipAndSelectNextOccurrence", - "Ctrl-K Ctrl-K": "delLineRight", - "Ctrl-K Ctrl-U": "upcaseAtCursor", - "Ctrl-K Ctrl-L": "downcaseAtCursor", - "Ctrl-K Ctrl-Space": "setSublimeMark", - "Ctrl-K Ctrl-A": "selectToSublimeMark", - "Ctrl-K Ctrl-W": "deleteToSublimeMark", - "Ctrl-K Ctrl-X": "swapWithSublimeMark", - "Ctrl-K Ctrl-Y": "sublimeYank", - "Ctrl-K Ctrl-C": "showInCenter", - "Ctrl-K Ctrl-G": "clearBookmarks", - "Ctrl-K Ctrl-Backspace": "delLineLeft", - "Ctrl-K Ctrl-1": "foldAll", - "Ctrl-K Ctrl-0": "unfoldAll", - "Ctrl-K Ctrl-J": "unfoldAll", - "Ctrl-Alt-Up": "addCursorToPrevLine", - "Ctrl-Alt-Down": "addCursorToNextLine", - "Ctrl-F3": "findUnder", - "Shift-Ctrl-F3": "findUnderPrevious", - "Alt-F3": "findAllUnder", - "Shift-Ctrl-[": "fold", - "Shift-Ctrl-]": "unfold", - "Ctrl-I": "findIncremental", - "Shift-Ctrl-I": "findIncrementalReverse", - "Ctrl-H": "replace", - F3: "findNext", - "Shift-F3": "findPrev", - fallthrough: "pcDefault" - }, h.normalizeKeyMap(C.pcSublime); - var V = C.default == C.macDefault; - C.sublime = V ? C.macSublime : C.pcSublime; - }); -})(); -var q = G.exports; -const Q = E.getDefaultExportFromCjs(q), - X = J({ - __proto__: null, - default: Q - }, [q]); -exports.sublime = X; - -/***/ }), - -/***/ "../../graphiql-toolkit/esm/async-helpers/index.js": -/*!*********************************************************!*\ - !*** ../../graphiql-toolkit/esm/async-helpers/index.js ***! - \*********************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.fetcherReturnToPromise = fetcherReturnToPromise; -exports.isAsyncIterable = isAsyncIterable; -exports.isObservable = isObservable; -exports.isPromise = isPromise; -var __awaiter = void 0 && (void 0).__awaiter || function (thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function (resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -function isPromise(value) { - return typeof value === 'object' && value !== null && typeof value.then === 'function'; -} -function observableToPromise(observable) { - return new Promise((resolve, reject) => { - const subscription = observable.subscribe({ - next(v) { - resolve(v); - subscription.unsubscribe(); - }, - error: reject, - complete() { - reject(new Error('no value resolved')); - } - }); - }); -} -function isObservable(value) { - return typeof value === 'object' && value !== null && 'subscribe' in value && typeof value.subscribe === 'function'; -} -function isAsyncIterable(input) { - return typeof input === 'object' && input !== null && (input[Symbol.toStringTag] === 'AsyncGenerator' || Symbol.asyncIterator in input); -} -function asyncIterableToPromise(input) { - var _a; - return __awaiter(this, void 0, void 0, function* () { - const iteratorReturn = (_a = ('return' in input ? input : input[Symbol.asyncIterator]()).return) === null || _a === void 0 ? void 0 : _a.bind(input); - const iteratorNext = ('next' in input ? input : input[Symbol.asyncIterator]()).next.bind(input); - const result = yield iteratorNext(); - void (iteratorReturn === null || iteratorReturn === void 0 ? void 0 : iteratorReturn()); - return result.value; - }); -} -function fetcherReturnToPromise(fetcherResult) { - return __awaiter(this, void 0, void 0, function* () { - const result = yield fetcherResult; - if (isAsyncIterable(result)) { - return asyncIterableToPromise(result); - } - if (isObservable(result)) { - return observableToPromise(result); - } - return result; - }); -} - -/***/ }), - -/***/ "../../graphiql-toolkit/esm/create-fetcher/createFetcher.js": -/*!******************************************************************!*\ - !*** ../../graphiql-toolkit/esm/create-fetcher/createFetcher.js ***! - \******************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.createGraphiQLFetcher = createGraphiQLFetcher; -var _lib = __webpack_require__(/*! ./lib */ "../../graphiql-toolkit/esm/create-fetcher/lib.js"); -function createGraphiQLFetcher(options) { - let httpFetch; - if (typeof window !== 'undefined' && window.fetch) { - httpFetch = window.fetch; - } - if ((options === null || options === void 0 ? void 0 : options.enableIncrementalDelivery) === null || options.enableIncrementalDelivery !== false) { - options.enableIncrementalDelivery = true; - } - if (options.fetch) { - httpFetch = options.fetch; - } - if (!httpFetch) { - throw new Error('No valid fetcher implementation available'); - } - const simpleFetcher = (0, _lib.createSimpleFetcher)(options, httpFetch); - const httpFetcher = options.enableIncrementalDelivery ? (0, _lib.createMultipartFetcher)(options, httpFetch) : simpleFetcher; - return (graphQLParams, fetcherOpts) => { - if (graphQLParams.operationName === 'IntrospectionQuery') { - return (options.schemaFetcher || simpleFetcher)(graphQLParams, fetcherOpts); - } - const isSubscription = (fetcherOpts === null || fetcherOpts === void 0 ? void 0 : fetcherOpts.documentAST) ? (0, _lib.isSubscriptionWithName)(fetcherOpts.documentAST, graphQLParams.operationName || undefined) : false; - if (isSubscription) { - const wsFetcher = (0, _lib.getWsFetcher)(options, fetcherOpts); - if (!wsFetcher) { - throw new Error(`Your GraphiQL createFetcher is not properly configured for websocket subscriptions yet. ${options.subscriptionUrl ? `Provided URL ${options.subscriptionUrl} failed` : 'Please provide subscriptionUrl, wsClient or legacyClient option first.'}`); - } - return wsFetcher(graphQLParams); - } - return httpFetcher(graphQLParams, fetcherOpts); - }; -} - -/***/ }), - -/***/ "../../graphiql-toolkit/esm/create-fetcher/index.js": -/*!**********************************************************!*\ - !*** ../../graphiql-toolkit/esm/create-fetcher/index.js ***! - \**********************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -var _exportNames = { - createGraphiQLFetcher: true -}; -Object.defineProperty(exports, "createGraphiQLFetcher", ({ - enumerable: true, - get: function () { - return _createFetcher.createGraphiQLFetcher; - } -})); -var _types = __webpack_require__(/*! ./types */ "../../graphiql-toolkit/esm/create-fetcher/types.js"); -Object.keys(_types).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; - if (key in exports && exports[key] === _types[key]) return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _types[key]; - } - }); -}); -var _createFetcher = __webpack_require__(/*! ./createFetcher */ "../../graphiql-toolkit/esm/create-fetcher/createFetcher.js"); - -/***/ }), - -/***/ "../../graphiql-toolkit/esm/create-fetcher/lib.js": -/*!********************************************************!*\ - !*** ../../graphiql-toolkit/esm/create-fetcher/lib.js ***! - \********************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.isSubscriptionWithName = exports.getWsFetcher = exports.createWebsocketsFetcherFromUrl = exports.createWebsocketsFetcherFromClient = exports.createSimpleFetcher = exports.createMultipartFetcher = exports.createLegacyWebsocketsFetcher = void 0; -var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -var _meros = __webpack_require__(/*! meros */ "../../../node_modules/meros/browser/index.mjs"); -var _pushPullAsyncIterableIterator = __webpack_require__(/*! @n1ru4l/push-pull-async-iterable-iterator */ "../../../node_modules/@n1ru4l/push-pull-async-iterable-iterator/index.js"); -var __awaiter = void 0 && (void 0).__awaiter || function (thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function (resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __await = void 0 && (void 0).__await || function (v) { - return this instanceof __await ? (this.v = v, this) : new __await(v); -}; -var __asyncValues = void 0 && (void 0).__asyncValues || function (o) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var m = o[Symbol.asyncIterator], - i; - return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { - return this; - }, i); - function verb(n) { - i[n] = o[n] && function (v) { - return new Promise(function (resolve, reject) { - v = o[n](v), settle(resolve, reject, v.done, v.value); - }); - }; - } - function settle(resolve, reject, d, v) { - Promise.resolve(v).then(function (v) { - resolve({ - value: v, - done: d - }); - }, reject); - } -}; -var __asyncGenerator = void 0 && (void 0).__asyncGenerator || function (thisArg, _arguments, generator) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var g = generator.apply(thisArg, _arguments || []), - i, - q = []; - return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { - return this; - }, i; - function verb(n) { - if (g[n]) i[n] = function (v) { - return new Promise(function (a, b) { - q.push([n, v, a, b]) > 1 || resume(n, v); - }); - }; - } - function resume(n, v) { - try { - step(g[n](v)); - } catch (e) { - settle(q[0][3], e); - } - } - function step(r) { - r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); - } - function fulfill(value) { - resume("next", value); - } - function reject(value) { - resume("throw", value); - } - function settle(f, v) { - if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); - } -}; -const errorHasCode = err => { - return typeof err === 'object' && err !== null && 'code' in err; -}; -const isSubscriptionWithName = (document, name) => { - let isSubscription = false; - (0, _graphql.visit)(document, { - OperationDefinition(node) { - var _a; - if (name === ((_a = node.name) === null || _a === void 0 ? void 0 : _a.value) && node.operation === 'subscription') { - isSubscription = true; - } - } - }); - return isSubscription; -}; -exports.isSubscriptionWithName = isSubscriptionWithName; -const createSimpleFetcher = (options, httpFetch) => (graphQLParams, fetcherOpts) => __awaiter(void 0, void 0, void 0, function* () { - const data = yield httpFetch(options.url, { - method: 'POST', - body: JSON.stringify(graphQLParams), - headers: Object.assign(Object.assign({ - 'content-type': 'application/json' - }, options.headers), fetcherOpts === null || fetcherOpts === void 0 ? void 0 : fetcherOpts.headers) - }); - return data.json(); -}); -exports.createSimpleFetcher = createSimpleFetcher; -const createWebsocketsFetcherFromUrl = (url, connectionParams) => { - let wsClient; - try { - const { - createClient - } = __webpack_require__(/*! graphql-ws */ "../../../node_modules/graphql-ws/lib/index.js"); - wsClient = createClient({ - url, - connectionParams - }); - return createWebsocketsFetcherFromClient(wsClient); - } catch (err) { - if (errorHasCode(err) && err.code === 'MODULE_NOT_FOUND') { - throw new Error("You need to install the 'graphql-ws' package to use websockets when passing a 'subscriptionUrl'"); - } - console.error(`Error creating websocket client for ${url}`, err); - } -}; -exports.createWebsocketsFetcherFromUrl = createWebsocketsFetcherFromUrl; -const createWebsocketsFetcherFromClient = wsClient => graphQLParams => (0, _pushPullAsyncIterableIterator.makeAsyncIterableIteratorFromSink)(sink => wsClient.subscribe(graphQLParams, Object.assign(Object.assign({}, sink), { - error(err) { - if (err instanceof CloseEvent) { - sink.error(new Error(`Socket closed with event ${err.code} ${err.reason || ''}`.trim())); - } else { - sink.error(err); - } - } -}))); -exports.createWebsocketsFetcherFromClient = createWebsocketsFetcherFromClient; -const createLegacyWebsocketsFetcher = legacyWsClient => graphQLParams => { - const observable = legacyWsClient.request(graphQLParams); - return (0, _pushPullAsyncIterableIterator.makeAsyncIterableIteratorFromSink)(sink => observable.subscribe(sink).unsubscribe); -}; -exports.createLegacyWebsocketsFetcher = createLegacyWebsocketsFetcher; -const createMultipartFetcher = (options, httpFetch) => function (graphQLParams, fetcherOpts) { - return __asyncGenerator(this, arguments, function* () { - var e_1, _a; - const response = yield __await(httpFetch(options.url, { - method: 'POST', - body: JSON.stringify(graphQLParams), - headers: Object.assign(Object.assign({ - 'content-type': 'application/json', - accept: 'application/json, multipart/mixed' - }, options.headers), fetcherOpts === null || fetcherOpts === void 0 ? void 0 : fetcherOpts.headers) - }).then(r => (0, _meros.meros)(r, { - multiple: true - }))); - if (!(0, _pushPullAsyncIterableIterator.isAsyncIterable)(response)) { - return yield __await(yield yield __await(response.json())); - } - try { - for (var response_1 = __asyncValues(response), response_1_1; response_1_1 = yield __await(response_1.next()), !response_1_1.done;) { - const chunk = response_1_1.value; - if (chunk.some(part => !part.json)) { - const message = chunk.map(part => `Headers::\n${part.headers}\n\nBody::\n${part.body}`); - throw new Error(`Expected multipart chunks to be of json type. got:\n${message}`); - } - yield yield __await(chunk.map(part => part.body)); - } - } catch (e_1_1) { - e_1 = { - error: e_1_1 - }; - } finally { - try { - if (response_1_1 && !response_1_1.done && (_a = response_1.return)) yield __await(_a.call(response_1)); - } finally { - if (e_1) throw e_1.error; - } - } - }); -}; -exports.createMultipartFetcher = createMultipartFetcher; -const getWsFetcher = (options, fetcherOpts) => { - if (options.wsClient) { - return createWebsocketsFetcherFromClient(options.wsClient); - } - if (options.subscriptionUrl) { - return createWebsocketsFetcherFromUrl(options.subscriptionUrl, Object.assign(Object.assign({}, options.wsConnectionParams), fetcherOpts === null || fetcherOpts === void 0 ? void 0 : fetcherOpts.headers)); - } - const legacyWebsocketsClient = options.legacyClient || options.legacyWsClient; - if (legacyWebsocketsClient) { - return createLegacyWebsocketsFetcher(legacyWebsocketsClient); - } -}; -exports.getWsFetcher = getWsFetcher; - -/***/ }), - -/***/ "../../graphiql-toolkit/esm/create-fetcher/types.js": -/*!**********************************************************!*\ - !*** ../../graphiql-toolkit/esm/create-fetcher/types.js ***! - \**********************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); - -/***/ }), - -/***/ "../../graphiql-toolkit/esm/format/index.js": -/*!**************************************************!*\ - !*** ../../graphiql-toolkit/esm/format/index.js ***! - \**************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.formatError = formatError; -exports.formatResult = formatResult; -function stringify(obj) { - return JSON.stringify(obj, null, 2); -} -function formatSingleError(error) { - return Object.assign(Object.assign({}, error), { - message: error.message, - stack: error.stack - }); -} -function handleSingleError(error) { - if (error instanceof Error) { - return formatSingleError(error); - } - return error; -} -function formatError(error) { - if (Array.isArray(error)) { - return stringify({ - errors: error.map(e => handleSingleError(e)) - }); - } - return stringify({ - errors: [handleSingleError(error)] - }); -} -function formatResult(result) { - return stringify(result); -} - -/***/ }), - -/***/ "../../graphiql-toolkit/esm/graphql-helpers/auto-complete.js": -/*!*******************************************************************!*\ - !*** ../../graphiql-toolkit/esm/graphql-helpers/auto-complete.js ***! - \*******************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.fillLeafs = fillLeafs; -var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -function fillLeafs(schema, docString, getDefaultFieldNames) { - const insertions = []; - if (!schema || !docString) { - return { - insertions, - result: docString - }; - } - let ast; - try { - ast = (0, _graphql.parse)(docString); - } catch (_a) { - return { - insertions, - result: docString - }; - } - const fieldNameFn = getDefaultFieldNames || defaultGetDefaultFieldNames; - const typeInfo = new _graphql.TypeInfo(schema); - (0, _graphql.visit)(ast, { - leave(node) { - typeInfo.leave(node); - }, - enter(node) { - typeInfo.enter(node); - if (node.kind === 'Field' && !node.selectionSet) { - const fieldType = typeInfo.getType(); - const selectionSet = buildSelectionSet(isFieldType(fieldType), fieldNameFn); - if (selectionSet && node.loc) { - const indent = getIndentation(docString, node.loc.start); - insertions.push({ - index: node.loc.end, - string: ' ' + (0, _graphql.print)(selectionSet).replaceAll('\n', '\n' + indent) - }); - } - } - } - }); - return { - insertions, - result: withInsertions(docString, insertions) - }; -} -function defaultGetDefaultFieldNames(type) { - if (!('getFields' in type)) { - return []; - } - const fields = type.getFields(); - if (fields.id) { - return ['id']; - } - if (fields.edges) { - return ['edges']; - } - if (fields.node) { - return ['node']; - } - const leafFieldNames = []; - for (const fieldName of Object.keys(fields)) { - if ((0, _graphql.isLeafType)(fields[fieldName].type)) { - leafFieldNames.push(fieldName); - } - } - return leafFieldNames; -} -function buildSelectionSet(type, getDefaultFieldNames) { - const namedType = (0, _graphql.getNamedType)(type); - if (!type || (0, _graphql.isLeafType)(type)) { - return; - } - const fieldNames = getDefaultFieldNames(namedType); - if (!Array.isArray(fieldNames) || fieldNames.length === 0 || !('getFields' in namedType)) { - return; - } - return { - kind: _graphql.Kind.SELECTION_SET, - selections: fieldNames.map(fieldName => { - const fieldDef = namedType.getFields()[fieldName]; - const fieldType = fieldDef ? fieldDef.type : null; - return { - kind: _graphql.Kind.FIELD, - name: { - kind: _graphql.Kind.NAME, - value: fieldName - }, - selectionSet: buildSelectionSet(fieldType, getDefaultFieldNames) - }; - }) - }; -} -function withInsertions(initial, insertions) { - if (insertions.length === 0) { - return initial; - } - let edited = ''; - let prevIndex = 0; - for (const { - index, - string - } of insertions) { - edited += initial.slice(prevIndex, index) + string; - prevIndex = index; - } - edited += initial.slice(prevIndex); - return edited; -} -function getIndentation(str, index) { - let indentStart = index; - let indentEnd = index; - while (indentStart) { - const c = str.charCodeAt(indentStart - 1); - if (c === 10 || c === 13 || c === 0x2028 || c === 0x2029) { - break; - } - indentStart--; - if (c !== 9 && c !== 11 && c !== 12 && c !== 32 && c !== 160) { - indentEnd = indentStart; - } - } - return str.slice(indentStart, indentEnd); -} -function isFieldType(fieldType) { - if (fieldType) { - return fieldType; - } -} - -/***/ }), - -/***/ "../../graphiql-toolkit/esm/graphql-helpers/index.js": -/*!***********************************************************!*\ - !*** ../../graphiql-toolkit/esm/graphql-helpers/index.js ***! - \***********************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -var _autoComplete = __webpack_require__(/*! ./auto-complete */ "../../graphiql-toolkit/esm/graphql-helpers/auto-complete.js"); -Object.keys(_autoComplete).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (key in exports && exports[key] === _autoComplete[key]) return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _autoComplete[key]; - } - }); -}); -var _mergeAst = __webpack_require__(/*! ./merge-ast */ "../../graphiql-toolkit/esm/graphql-helpers/merge-ast.js"); -Object.keys(_mergeAst).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (key in exports && exports[key] === _mergeAst[key]) return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _mergeAst[key]; - } - }); -}); -var _operationName = __webpack_require__(/*! ./operation-name */ "../../graphiql-toolkit/esm/graphql-helpers/operation-name.js"); -Object.keys(_operationName).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (key in exports && exports[key] === _operationName[key]) return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _operationName[key]; - } - }); -}); - -/***/ }), - -/***/ "../../graphiql-toolkit/esm/graphql-helpers/merge-ast.js": -/*!***************************************************************!*\ - !*** ../../graphiql-toolkit/esm/graphql-helpers/merge-ast.js ***! - \***************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.mergeAst = mergeAst; -var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -function uniqueBy(array, iteratee) { - var _a; - const FilteredMap = new Map(); - const result = []; - for (const item of array) { - if (item.kind === 'Field') { - const uniqueValue = iteratee(item); - const existing = FilteredMap.get(uniqueValue); - if ((_a = item.directives) === null || _a === void 0 ? void 0 : _a.length) { - const itemClone = Object.assign({}, item); - result.push(itemClone); - } else if ((existing === null || existing === void 0 ? void 0 : existing.selectionSet) && item.selectionSet) { - existing.selectionSet.selections = [...existing.selectionSet.selections, ...item.selectionSet.selections]; - } else if (!existing) { - const itemClone = Object.assign({}, item); - FilteredMap.set(uniqueValue, itemClone); - result.push(itemClone); - } - } else { - result.push(item); - } - } - return result; -} -function inlineRelevantFragmentSpreads(fragmentDefinitions, selections, selectionSetType) { - var _a; - const selectionSetTypeName = selectionSetType ? (0, _graphql.getNamedType)(selectionSetType).name : null; - const outputSelections = []; - const seenSpreads = []; - for (let selection of selections) { - if (selection.kind === 'FragmentSpread') { - const fragmentName = selection.name.value; - if (!selection.directives || selection.directives.length === 0) { - if (seenSpreads.includes(fragmentName)) { - continue; - } else { - seenSpreads.push(fragmentName); - } - } - const fragmentDefinition = fragmentDefinitions[selection.name.value]; - if (fragmentDefinition) { - const { - typeCondition, - directives, - selectionSet - } = fragmentDefinition; - selection = { - kind: _graphql.Kind.INLINE_FRAGMENT, - typeCondition, - directives, - selectionSet - }; - } - } - if (selection.kind === _graphql.Kind.INLINE_FRAGMENT && (!selection.directives || ((_a = selection.directives) === null || _a === void 0 ? void 0 : _a.length) === 0)) { - const fragmentTypeName = selection.typeCondition ? selection.typeCondition.name.value : null; - if (!fragmentTypeName || fragmentTypeName === selectionSetTypeName) { - outputSelections.push(...inlineRelevantFragmentSpreads(fragmentDefinitions, selection.selectionSet.selections, selectionSetType)); - continue; - } - } - outputSelections.push(selection); - } - return outputSelections; -} -function mergeAst(documentAST, schema) { - const typeInfo = schema ? new _graphql.TypeInfo(schema) : null; - const fragmentDefinitions = Object.create(null); - for (const definition of documentAST.definitions) { - if (definition.kind === _graphql.Kind.FRAGMENT_DEFINITION) { - fragmentDefinitions[definition.name.value] = definition; - } - } - const flattenVisitors = { - SelectionSet(node) { - const selectionSetType = typeInfo ? typeInfo.getParentType() : null; - let { - selections - } = node; - selections = inlineRelevantFragmentSpreads(fragmentDefinitions, selections, selectionSetType); - return Object.assign(Object.assign({}, node), { - selections - }); - }, - FragmentDefinition() { - return null; - } - }; - const flattenedAST = (0, _graphql.visit)(documentAST, typeInfo ? (0, _graphql.visitWithTypeInfo)(typeInfo, flattenVisitors) : flattenVisitors); - const deduplicateVisitors = { - SelectionSet(node) { - let { - selections - } = node; - selections = uniqueBy(selections, selection => selection.alias ? selection.alias.value : selection.name.value); - return Object.assign(Object.assign({}, node), { - selections - }); - }, - FragmentDefinition() { - return null; - } - }; - return (0, _graphql.visit)(flattenedAST, deduplicateVisitors); -} - -/***/ }), - -/***/ "../../graphiql-toolkit/esm/graphql-helpers/operation-name.js": -/*!********************************************************************!*\ - !*** ../../graphiql-toolkit/esm/graphql-helpers/operation-name.js ***! - \********************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.getSelectedOperationName = getSelectedOperationName; -function getSelectedOperationName(prevOperations, prevSelectedOperationName, operations) { - if (!operations || operations.length < 1) { - return; - } - const names = operations.map(op => { - var _a; - return (_a = op.name) === null || _a === void 0 ? void 0 : _a.value; - }); - if (prevSelectedOperationName && names.includes(prevSelectedOperationName)) { - return prevSelectedOperationName; - } - if (prevSelectedOperationName && prevOperations) { - const prevNames = prevOperations.map(op => { - var _a; - return (_a = op.name) === null || _a === void 0 ? void 0 : _a.value; - }); - const prevIndex = prevNames.indexOf(prevSelectedOperationName); - if (prevIndex !== -1 && prevIndex < names.length) { - return names[prevIndex]; - } - } - return names[0]; -} - -/***/ }), - -/***/ "../../graphiql-toolkit/esm/index.js": -/*!*******************************************!*\ - !*** ../../graphiql-toolkit/esm/index.js ***! - \*******************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -var _asyncHelpers = __webpack_require__(/*! ./async-helpers */ "../../graphiql-toolkit/esm/async-helpers/index.js"); -Object.keys(_asyncHelpers).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (key in exports && exports[key] === _asyncHelpers[key]) return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _asyncHelpers[key]; - } - }); -}); -var _createFetcher = __webpack_require__(/*! ./create-fetcher */ "../../graphiql-toolkit/esm/create-fetcher/index.js"); -Object.keys(_createFetcher).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (key in exports && exports[key] === _createFetcher[key]) return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _createFetcher[key]; - } - }); -}); -var _format = __webpack_require__(/*! ./format */ "../../graphiql-toolkit/esm/format/index.js"); -Object.keys(_format).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (key in exports && exports[key] === _format[key]) return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _format[key]; - } - }); -}); -var _graphqlHelpers = __webpack_require__(/*! ./graphql-helpers */ "../../graphiql-toolkit/esm/graphql-helpers/index.js"); -Object.keys(_graphqlHelpers).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (key in exports && exports[key] === _graphqlHelpers[key]) return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _graphqlHelpers[key]; - } - }); -}); -var _storage = __webpack_require__(/*! ./storage */ "../../graphiql-toolkit/esm/storage/index.js"); -Object.keys(_storage).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (key in exports && exports[key] === _storage[key]) return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _storage[key]; - } - }); -}); - -/***/ }), - -/***/ "../../graphiql-toolkit/esm/storage/base.js": -/*!**************************************************!*\ - !*** ../../graphiql-toolkit/esm/storage/base.js ***! - \**************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.StorageAPI = void 0; -function isQuotaError(storage, e) { - return e instanceof DOMException && (e.code === 22 || e.code === 1014 || e.name === 'QuotaExceededError' || e.name === 'NS_ERROR_DOM_QUOTA_REACHED') && storage.length !== 0; -} -class StorageAPI { - constructor(storage) { - if (storage) { - this.storage = storage; - } else if (storage === null) { - this.storage = null; - } else if (typeof window === 'undefined') { - this.storage = null; - } else { - this.storage = { - getItem: window.localStorage.getItem.bind(window.localStorage), - setItem: window.localStorage.setItem.bind(window.localStorage), - removeItem: window.localStorage.removeItem.bind(window.localStorage), - get length() { - let keys = 0; - for (const key in window.localStorage) { - if (key.indexOf(`${STORAGE_NAMESPACE}:`) === 0) { - keys += 1; - } - } - return keys; - }, - clear() { - for (const key in window.localStorage) { - if (key.indexOf(`${STORAGE_NAMESPACE}:`) === 0) { - window.localStorage.removeItem(key); - } - } - } - }; - } - } - get(name) { - if (!this.storage) { - return null; - } - const key = `${STORAGE_NAMESPACE}:${name}`; - const value = this.storage.getItem(key); - if (value === 'null' || value === 'undefined') { - this.storage.removeItem(key); - return null; - } - return value || null; - } - set(name, value) { - let quotaError = false; - let error = null; - if (this.storage) { - const key = `${STORAGE_NAMESPACE}:${name}`; - if (value) { - try { - this.storage.setItem(key, value); - } catch (e) { - error = e instanceof Error ? e : new Error(`${e}`); - quotaError = isQuotaError(this.storage, e); - } - } else { - this.storage.removeItem(key); - } - } - return { - isQuotaError: quotaError, - error - }; - } - clear() { - if (this.storage) { - this.storage.clear(); - } - } -} -exports.StorageAPI = StorageAPI; -const STORAGE_NAMESPACE = 'graphiql'; - -/***/ }), - -/***/ "../../graphiql-toolkit/esm/storage/custom.js": -/*!****************************************************!*\ - !*** ../../graphiql-toolkit/esm/storage/custom.js ***! - \****************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.createLocalStorage = createLocalStorage; -function createLocalStorage(_ref) { - let { - namespace - } = _ref; - const storageKeyPrefix = `${namespace}:`; - const getStorageKey = key => `${storageKeyPrefix}${key}`; - const storage = { - setItem: (key, value) => localStorage.setItem(getStorageKey(key), value), - getItem: key => localStorage.getItem(getStorageKey(key)), - removeItem: key => localStorage.removeItem(getStorageKey(key)), - get length() { - let keys = 0; - for (const key in window.localStorage) { - if (key.indexOf(storageKeyPrefix) === 0) { - keys += 1; - } - } - return keys; - }, - clear() { - for (const key in window.localStorage) { - if (key.indexOf(storageKeyPrefix) === 0) { - window.localStorage.removeItem(key); - } - } - } - }; - return storage; -} - -/***/ }), - -/***/ "../../graphiql-toolkit/esm/storage/history.js": -/*!*****************************************************!*\ - !*** ../../graphiql-toolkit/esm/storage/history.js ***! - \*****************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.HistoryStore = void 0; -var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -var _query = __webpack_require__(/*! ./query */ "../../graphiql-toolkit/esm/storage/query.js"); -const MAX_QUERY_SIZE = 100000; -class HistoryStore { - constructor(storage, maxHistoryLength) { - var _this = this; - this.storage = storage; - this.maxHistoryLength = maxHistoryLength; - this.updateHistory = _ref => { - let { - query, - variables, - headers, - operationName - } = _ref; - if (!this.shouldSaveQuery(query, variables, headers, this.history.fetchRecent())) { - return; - } - this.history.push({ - query, - variables, - headers, - operationName - }); - const historyQueries = this.history.items; - const favoriteQueries = this.favorite.items; - this.queries = historyQueries.concat(favoriteQueries); - }; - this.deleteHistory = function (_ref2) { - let { - query, - variables, - headers, - operationName, - favorite - } = _ref2; - let clearFavorites = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - function deleteFromStore(store) { - const found = store.items.find(x => x.query === query && x.variables === variables && x.headers === headers && x.operationName === operationName); - if (found) { - store.delete(found); - } - } - if (favorite || clearFavorites) { - deleteFromStore(_this.favorite); - } - if (!favorite || clearFavorites) { - deleteFromStore(_this.history); - } - _this.queries = [..._this.history.items, ..._this.favorite.items]; - }; - this.history = new _query.QueryStore('queries', this.storage, this.maxHistoryLength); - this.favorite = new _query.QueryStore('favorites', this.storage, null); - this.queries = [...this.history.fetchAll(), ...this.favorite.fetchAll()]; - } - shouldSaveQuery(query, variables, headers, lastQuerySaved) { - if (!query) { - return false; - } - try { - (0, _graphql.parse)(query); - } catch (_a) { - return false; - } - if (query.length > MAX_QUERY_SIZE) { - return false; - } - if (!lastQuerySaved) { - return true; - } - if (JSON.stringify(query) === JSON.stringify(lastQuerySaved.query)) { - if (JSON.stringify(variables) === JSON.stringify(lastQuerySaved.variables)) { - if (JSON.stringify(headers) === JSON.stringify(lastQuerySaved.headers)) { - return false; - } - if (headers && !lastQuerySaved.headers) { - return false; - } - } - if (variables && !lastQuerySaved.variables) { - return false; - } - } - return true; - } - toggleFavorite(_ref3) { - let { - query, - variables, - headers, - operationName, - label, - favorite - } = _ref3; - const item = { - query, - variables, - headers, - operationName, - label - }; - if (favorite) { - item.favorite = false; - this.favorite.delete(item); - this.history.push(item); - } else { - item.favorite = true; - this.favorite.push(item); - this.history.delete(item); - } - this.queries = [...this.history.items, ...this.favorite.items]; - } - editLabel(_ref4, index) { - let { - query, - variables, - headers, - operationName, - label, - favorite - } = _ref4; - const item = { - query, - variables, - headers, - operationName, - label - }; - if (favorite) { - this.favorite.edit(Object.assign(Object.assign({}, item), { - favorite - }), index); - } else { - this.history.edit(item, index); - } - this.queries = [...this.history.items, ...this.favorite.items]; - } -} -exports.HistoryStore = HistoryStore; - -/***/ }), - -/***/ "../../graphiql-toolkit/esm/storage/index.js": -/*!***************************************************!*\ - !*** ../../graphiql-toolkit/esm/storage/index.js ***! - \***************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -var _base = __webpack_require__(/*! ./base */ "../../graphiql-toolkit/esm/storage/base.js"); -Object.keys(_base).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (key in exports && exports[key] === _base[key]) return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _base[key]; - } - }); -}); -var _history = __webpack_require__(/*! ./history */ "../../graphiql-toolkit/esm/storage/history.js"); -Object.keys(_history).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (key in exports && exports[key] === _history[key]) return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _history[key]; - } - }); -}); -var _query = __webpack_require__(/*! ./query */ "../../graphiql-toolkit/esm/storage/query.js"); -Object.keys(_query).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (key in exports && exports[key] === _query[key]) return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _query[key]; - } - }); -}); -var _custom = __webpack_require__(/*! ./custom */ "../../graphiql-toolkit/esm/storage/custom.js"); -Object.keys(_custom).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (key in exports && exports[key] === _custom[key]) return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _custom[key]; - } - }); -}); - -/***/ }), - -/***/ "../../graphiql-toolkit/esm/storage/query.js": -/*!***************************************************!*\ - !*** ../../graphiql-toolkit/esm/storage/query.js ***! - \***************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.QueryStore = void 0; -class QueryStore { - constructor(key, storage) { - let maxSize = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; - this.key = key; - this.storage = storage; - this.maxSize = maxSize; - this.items = this.fetchAll(); - } - get length() { - return this.items.length; - } - contains(item) { - return this.items.some(x => x.query === item.query && x.variables === item.variables && x.headers === item.headers && x.operationName === item.operationName); - } - edit(item, index) { - if (typeof index === 'number' && this.items[index]) { - const found = this.items[index]; - if (found.query === item.query && found.variables === item.variables && found.headers === item.headers && found.operationName === item.operationName) { - this.items.splice(index, 1, item); - this.save(); - return; - } - } - const itemIndex = this.items.findIndex(x => x.query === item.query && x.variables === item.variables && x.headers === item.headers && x.operationName === item.operationName); - if (itemIndex !== -1) { - this.items.splice(itemIndex, 1, item); - this.save(); - } - } - delete(item) { - const itemIndex = this.items.findIndex(x => x.query === item.query && x.variables === item.variables && x.headers === item.headers && x.operationName === item.operationName); - if (itemIndex !== -1) { - this.items.splice(itemIndex, 1); - this.save(); - } - } - fetchRecent() { - return this.items.at(-1); - } - fetchAll() { - const raw = this.storage.get(this.key); - if (raw) { - return JSON.parse(raw)[this.key]; - } - return []; - } - push(item) { - const items = [...this.items, item]; - if (this.maxSize && items.length > this.maxSize) { - items.shift(); - } - for (let attempts = 0; attempts < 5; attempts++) { - const response = this.storage.set(this.key, JSON.stringify({ - [this.key]: items - })); - if (!(response === null || response === void 0 ? void 0 : response.error)) { - this.items = items; - } else if (response.isQuotaError && this.maxSize) { - items.shift(); - } else { - return; - } - } - } - save() { - this.storage.set(this.key, JSON.stringify({ - [this.key]: this.items - })); - } -} -exports.QueryStore = QueryStore; - -/***/ }), - -/***/ "./components/GraphiQL.tsx": -/*!*********************************!*\ - !*** ./components/GraphiQL.tsx ***! - \*********************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.GraphiQL = GraphiQL; -exports.GraphiQLInterface = GraphiQLInterface; -var _react = _interopRequireWildcard(__webpack_require__(/*! react */ "react")); -var _react2 = __webpack_require__(/*! @graphiql/react */ "../../graphiql-react/dist/index.js"); -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } -function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } -const majorVersion = parseInt(_react.default.version.slice(0, 2), 10); -if (majorVersion < 16) { - throw new Error(['GraphiQL 0.18.0 and after is not compatible with React 15 or below.', 'If you are using a CDN source (jsdelivr, unpkg, etc), follow this example:', 'https://github.com/graphql/graphiql/blob/master/examples/graphiql-cdn/index.html#L49'].join('\n')); -} -/** - * The top-level React component for GraphiQL, intended to encompass the entire - * browser viewport. - * - * @see https://github.com/graphql/graphiql#usage - */ - -function GraphiQL(_ref) { - var _props$disableTabs; - let { - dangerouslyAssumeSchemaIsValid, - defaultQuery, - defaultTabs, - externalFragments, - fetcher, - getDefaultFieldNames, - headers, - inputValueDeprecation, - introspectionQueryName, - maxHistoryLength, - onEditOperationName, - onSchemaChange, - onTabChange, - onTogglePluginVisibility, - operationName, - plugins, - query, - response, - schema, - schemaDescription, - shouldPersistHeaders, - storage, - validationRules, - variables, - visiblePlugin, - defaultHeaders, - ...props - } = _ref; - // Ensure props are correct - if (typeof fetcher !== 'function') { - throw new TypeError('The `GraphiQL` component requires a `fetcher` function to be passed as prop.'); - } - return /*#__PURE__*/_react.default.createElement(_react2.GraphiQLProvider, { - getDefaultFieldNames: getDefaultFieldNames, - dangerouslyAssumeSchemaIsValid: dangerouslyAssumeSchemaIsValid, - defaultQuery: defaultQuery, - defaultHeaders: defaultHeaders, - defaultTabs: defaultTabs, - externalFragments: externalFragments, - fetcher: fetcher, - headers: headers, - inputValueDeprecation: inputValueDeprecation, - introspectionQueryName: introspectionQueryName, - maxHistoryLength: maxHistoryLength, - onEditOperationName: onEditOperationName, - onSchemaChange: onSchemaChange, - onTabChange: onTabChange, - onTogglePluginVisibility: onTogglePluginVisibility, - plugins: plugins, - visiblePlugin: visiblePlugin, - operationName: operationName, - query: query, - response: response, - schema: schema, - schemaDescription: schemaDescription, - shouldPersistHeaders: shouldPersistHeaders, - storage: storage, - validationRules: validationRules, - variables: variables - }, /*#__PURE__*/_react.default.createElement(GraphiQLInterface, _extends({ - showPersistHeadersSettings: shouldPersistHeaders !== false, - disableTabs: (_props$disableTabs = props.disableTabs) !== null && _props$disableTabs !== void 0 ? _props$disableTabs : false - }, props))); -} - -// Export main windows/panes to be used separately if desired. -GraphiQL.Logo = GraphiQLLogo; -GraphiQL.Toolbar = GraphiQLToolbar; -GraphiQL.Footer = GraphiQLFooter; -function GraphiQLInterface(props) { - var _props$isHeadersEdito, _pluginContext$visibl, _props$toolbar, _props$toolbar2; - const isHeadersEditorEnabled = (_props$isHeadersEdito = props.isHeadersEditorEnabled) !== null && _props$isHeadersEdito !== void 0 ? _props$isHeadersEdito : true; - const editorContext = (0, _react2.useEditorContext)({ - nonNull: true - }); - const executionContext = (0, _react2.useExecutionContext)({ - nonNull: true - }); - const schemaContext = (0, _react2.useSchemaContext)({ - nonNull: true - }); - const storageContext = (0, _react2.useStorageContext)(); - const pluginContext = (0, _react2.usePluginContext)(); - const copy = (0, _react2.useCopyQuery)({ - onCopyQuery: props.onCopyQuery - }); - const merge = (0, _react2.useMergeQuery)(); - const prettify = (0, _react2.usePrettifyEditors)(); - const { - theme, - setTheme - } = (0, _react2.useTheme)(); - const PluginContent = pluginContext === null || pluginContext === void 0 ? void 0 : (_pluginContext$visibl = pluginContext.visiblePlugin) === null || _pluginContext$visibl === void 0 ? void 0 : _pluginContext$visibl.content; - const pluginResize = (0, _react2.useDragResize)({ - defaultSizeRelation: 1 / 3, - direction: 'horizontal', - initiallyHidden: pluginContext !== null && pluginContext !== void 0 && pluginContext.visiblePlugin ? undefined : 'first', - onHiddenElementChange(resizableElement) { - if (resizableElement === 'first') { - pluginContext === null || pluginContext === void 0 ? void 0 : pluginContext.setVisiblePlugin(null); - } - }, - sizeThresholdSecond: 200, - storageKey: 'docExplorerFlex' - }); - const editorResize = (0, _react2.useDragResize)({ - direction: 'horizontal', - storageKey: 'editorFlex' - }); - const editorToolsResize = (0, _react2.useDragResize)({ - defaultSizeRelation: 3, - direction: 'vertical', - initiallyHidden: (() => { - if (props.defaultEditorToolsVisibility === 'variables' || props.defaultEditorToolsVisibility === 'headers') { - return; - } - if (typeof props.defaultEditorToolsVisibility === 'boolean') { - return props.defaultEditorToolsVisibility ? undefined : 'second'; - } - return editorContext.initialVariables || editorContext.initialHeaders ? undefined : 'second'; - })(), - sizeThresholdSecond: 60, - storageKey: 'secondaryEditorFlex' - }); - const [activeSecondaryEditor, setActiveSecondaryEditor] = (0, _react.useState)(() => { - if (props.defaultEditorToolsVisibility === 'variables' || props.defaultEditorToolsVisibility === 'headers') { - return props.defaultEditorToolsVisibility; - } - return !editorContext.initialVariables && editorContext.initialHeaders && isHeadersEditorEnabled ? 'headers' : 'variables'; - }); - const [showDialog, setShowDialog] = (0, _react.useState)(null); - const [clearStorageStatus, setClearStorageStatus] = (0, _react.useState)(null); - const children = _react.default.Children.toArray(props.children); - const logo = children.find(child => isChildComponentType(child, GraphiQL.Logo)) || /*#__PURE__*/_react.default.createElement(GraphiQL.Logo, null); - const toolbar = children.find(child => isChildComponentType(child, GraphiQL.Toolbar)) || /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_react2.ToolbarButton, { - onClick: prettify, - label: "Prettify query (Shift-Ctrl-P)" - }, /*#__PURE__*/_react.default.createElement(_react2.PrettifyIcon, { - className: "graphiql-toolbar-icon", - "aria-hidden": "true" - })), /*#__PURE__*/_react.default.createElement(_react2.ToolbarButton, { - onClick: merge, - label: "Merge fragments into query (Shift-Ctrl-M)" - }, /*#__PURE__*/_react.default.createElement(_react2.MergeIcon, { - className: "graphiql-toolbar-icon", - "aria-hidden": "true" - })), /*#__PURE__*/_react.default.createElement(_react2.ToolbarButton, { - onClick: copy, - label: "Copy query (Shift-Ctrl-C)" - }, /*#__PURE__*/_react.default.createElement(_react2.CopyIcon, { - className: "graphiql-toolbar-icon", - "aria-hidden": "true" - })), ((_props$toolbar = props.toolbar) === null || _props$toolbar === void 0 ? void 0 : _props$toolbar.additionalContent) && props.toolbar.additionalContent, ((_props$toolbar2 = props.toolbar) === null || _props$toolbar2 === void 0 ? void 0 : _props$toolbar2.additionalComponent) && /*#__PURE__*/_react.default.createElement(props.toolbar.additionalComponent, null)); - const footer = children.find(child => isChildComponentType(child, GraphiQL.Footer)); - const onClickReference = (0, _react.useCallback)(() => { - if (pluginResize.hiddenElement === 'first') { - pluginResize.setHiddenElement(null); - } - }, [pluginResize]); - const handleClearData = (0, _react.useCallback)(() => { - try { - storageContext === null || storageContext === void 0 ? void 0 : storageContext.clear(); - setClearStorageStatus('success'); - } catch { - setClearStorageStatus('error'); - } - }, [storageContext]); - const handlePersistHeaders = (0, _react.useCallback)(event => { - editorContext.setShouldPersistHeaders(event.currentTarget.dataset.value === 'true'); - }, [editorContext]); - const handleChangeTheme = (0, _react.useCallback)(event => { - const selectedTheme = event.currentTarget.dataset.theme; - setTheme(selectedTheme || null); - }, [setTheme]); - const handleAddTab = editorContext.addTab; - const handleRefetchSchema = schemaContext.introspect; - const handleReorder = editorContext.moveTab; - const handleShowDialog = (0, _react.useCallback)(event => { - setShowDialog(event.currentTarget.dataset.value); - }, []); - const handlePluginClick = (0, _react.useCallback)(e => { - const context = pluginContext; - const pluginIndex = Number(e.currentTarget.dataset.index); - const plugin = context.plugins.find((_, index) => pluginIndex === index); - const isVisible = plugin === context.visiblePlugin; - if (isVisible) { - context.setVisiblePlugin(null); - pluginResize.setHiddenElement('first'); - } else { - context.setVisiblePlugin(plugin); - pluginResize.setHiddenElement(null); - } - }, [pluginContext, pluginResize]); - const handleToolsTabClick = (0, _react.useCallback)(event => { - if (editorToolsResize.hiddenElement === 'second') { - editorToolsResize.setHiddenElement(null); - } - setActiveSecondaryEditor(event.currentTarget.dataset.name); - }, [editorToolsResize]); - const toggleEditorTools = (0, _react.useCallback)(() => { - editorToolsResize.setHiddenElement(editorToolsResize.hiddenElement === 'second' ? null : 'second'); - }, [editorToolsResize]); - const handleOpenShortKeysDialog = (0, _react.useCallback)(isOpen => { - if (!isOpen) { - setShowDialog(null); - } - }, []); - const handleOpenSettingsDialog = (0, _react.useCallback)(isOpen => { - if (!isOpen) { - setShowDialog(null); - setClearStorageStatus(null); - } - }, []); - const addTab = /*#__PURE__*/_react.default.createElement(_react2.Tooltip, { - label: "Add tab" - }, /*#__PURE__*/_react.default.createElement(_react2.UnStyledButton, { - type: "button", - className: "graphiql-tab-add", - onClick: handleAddTab, - "aria-label": "Add tab" - }, /*#__PURE__*/_react.default.createElement(_react2.PlusIcon, { - "aria-hidden": "true" - }))); - return /*#__PURE__*/_react.default.createElement(_react2.Tooltip.Provider, null, /*#__PURE__*/_react.default.createElement("div", { - "data-testid": "graphiql-container", - className: "graphiql-container" - }, /*#__PURE__*/_react.default.createElement("div", { - className: "graphiql-sidebar" - }, /*#__PURE__*/_react.default.createElement("div", { - className: "graphiql-sidebar-section" - }, pluginContext === null || pluginContext === void 0 ? void 0 : pluginContext.plugins.map((plugin, index) => { - const isVisible = plugin === pluginContext.visiblePlugin; - const label = `${isVisible ? 'Hide' : 'Show'} ${plugin.title}`; - const Icon = plugin.icon; - return /*#__PURE__*/_react.default.createElement(_react2.Tooltip, { - key: plugin.title, - label: label - }, /*#__PURE__*/_react.default.createElement(_react2.UnStyledButton, { - type: "button", - className: isVisible ? 'active' : '', - onClick: handlePluginClick, - "data-index": index, - "aria-label": label - }, /*#__PURE__*/_react.default.createElement(Icon, { - "aria-hidden": "true" - }))); - })), /*#__PURE__*/_react.default.createElement("div", { - className: "graphiql-sidebar-section" - }, /*#__PURE__*/_react.default.createElement(_react2.Tooltip, { - label: "Re-fetch GraphQL schema" - }, /*#__PURE__*/_react.default.createElement(_react2.UnStyledButton, { - type: "button", - disabled: schemaContext.isFetching, - onClick: handleRefetchSchema, - "aria-label": "Re-fetch GraphQL schema" - }, /*#__PURE__*/_react.default.createElement(_react2.ReloadIcon, { - className: schemaContext.isFetching ? 'graphiql-spin' : '', - "aria-hidden": "true" - }))), /*#__PURE__*/_react.default.createElement(_react2.Tooltip, { - label: "Open short keys dialog" - }, /*#__PURE__*/_react.default.createElement(_react2.UnStyledButton, { - type: "button", - "data-value": "short-keys", - onClick: handleShowDialog, - "aria-label": "Open short keys dialog" - }, /*#__PURE__*/_react.default.createElement(_react2.KeyboardShortcutIcon, { - "aria-hidden": "true" - }))), /*#__PURE__*/_react.default.createElement(_react2.Tooltip, { - label: "Open settings dialog" - }, /*#__PURE__*/_react.default.createElement(_react2.UnStyledButton, { - type: "button", - "data-value": "settings", - onClick: handleShowDialog, - "aria-label": "Open settings dialog" - }, /*#__PURE__*/_react.default.createElement(_react2.SettingsIcon, { - "aria-hidden": "true" - }))))), /*#__PURE__*/_react.default.createElement("div", { - className: "graphiql-main" - }, /*#__PURE__*/_react.default.createElement("div", { - ref: pluginResize.firstRef, - style: { - // Make sure the container shrinks when containing long - // non-breaking texts - minWidth: '200px' - } - }, /*#__PURE__*/_react.default.createElement("div", { - className: "graphiql-plugin" - }, PluginContent ? /*#__PURE__*/_react.default.createElement(PluginContent, null) : null)), (pluginContext === null || pluginContext === void 0 ? void 0 : pluginContext.visiblePlugin) && /*#__PURE__*/_react.default.createElement("div", { - className: "graphiql-horizontal-drag-bar", - ref: pluginResize.dragBarRef - }), /*#__PURE__*/_react.default.createElement("div", { - ref: pluginResize.secondRef, - className: "graphiql-sessions" - }, /*#__PURE__*/_react.default.createElement("div", { - className: "graphiql-session-header" - }, props.disableTabs ? null : /*#__PURE__*/_react.default.createElement(_react2.Tabs, { - values: editorContext.tabs, - onReorder: handleReorder, - "aria-label": "Select active operation" - }, editorContext.tabs.length > 1 && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, editorContext.tabs.map((tab, index) => /*#__PURE__*/_react.default.createElement(_react2.Tab, { - key: tab.id, - value: tab, - isActive: index === editorContext.activeTabIndex - }, /*#__PURE__*/_react.default.createElement(_react2.Tab.Button, { - "aria-controls": "graphiql-session", - id: `graphiql-session-tab-${index}`, - onClick: () => { - executionContext.stop(); - editorContext.changeTab(index); - } - }, tab.title), /*#__PURE__*/_react.default.createElement(_react2.Tab.Close, { - onClick: () => { - if (editorContext.activeTabIndex === index) { - executionContext.stop(); - } - editorContext.closeTab(index); - } - }))), addTab)), /*#__PURE__*/_react.default.createElement("div", { - className: "graphiql-session-header-right" - }, editorContext.tabs.length === 1 && addTab, logo)), /*#__PURE__*/_react.default.createElement("div", { - role: "tabpanel", - id: "graphiql-session", - className: "graphiql-session", - "aria-labelledby": `graphiql-session-tab-${editorContext.activeTabIndex}` - }, /*#__PURE__*/_react.default.createElement("div", { - ref: editorResize.firstRef - }, /*#__PURE__*/_react.default.createElement("div", { - className: `graphiql-editors${editorContext.tabs.length === 1 ? ' full-height' : ''}` - }, /*#__PURE__*/_react.default.createElement("div", { - ref: editorToolsResize.firstRef - }, /*#__PURE__*/_react.default.createElement("section", { - className: "graphiql-query-editor", - "aria-label": "Query Editor" - }, /*#__PURE__*/_react.default.createElement(_react2.QueryEditor, { - editorTheme: props.editorTheme, - keyMap: props.keyMap, - onClickReference: onClickReference, - onCopyQuery: props.onCopyQuery, - onEdit: props.onEditQuery, - readOnly: props.readOnly - }), /*#__PURE__*/_react.default.createElement("div", { - className: "graphiql-toolbar", - role: "toolbar", - "aria-label": "Editor Commands" - }, /*#__PURE__*/_react.default.createElement(_react2.ExecuteButton, null), toolbar))), /*#__PURE__*/_react.default.createElement("div", { - ref: editorToolsResize.dragBarRef - }, /*#__PURE__*/_react.default.createElement("div", { - className: "graphiql-editor-tools" - }, /*#__PURE__*/_react.default.createElement(_react2.UnStyledButton, { - type: "button", - className: activeSecondaryEditor === 'variables' && editorToolsResize.hiddenElement !== 'second' ? 'active' : '', - onClick: handleToolsTabClick, - "data-name": "variables" - }, "Variables"), isHeadersEditorEnabled && /*#__PURE__*/_react.default.createElement(_react2.UnStyledButton, { - type: "button", - className: activeSecondaryEditor === 'headers' && editorToolsResize.hiddenElement !== 'second' ? 'active' : '', - onClick: handleToolsTabClick, - "data-name": "headers" - }, "Headers"), /*#__PURE__*/_react.default.createElement(_react2.Tooltip, { - label: editorToolsResize.hiddenElement === 'second' ? 'Show editor tools' : 'Hide editor tools' - }, /*#__PURE__*/_react.default.createElement(_react2.UnStyledButton, { - type: "button", - onClick: toggleEditorTools, - "aria-label": editorToolsResize.hiddenElement === 'second' ? 'Show editor tools' : 'Hide editor tools', - className: "graphiql-toggle-editor-tools" - }, editorToolsResize.hiddenElement === 'second' ? /*#__PURE__*/_react.default.createElement(_react2.ChevronUpIcon, { - className: "graphiql-chevron-icon", - "aria-hidden": "true" - }) : /*#__PURE__*/_react.default.createElement(_react2.ChevronDownIcon, { - className: "graphiql-chevron-icon", - "aria-hidden": "true" - }))))), /*#__PURE__*/_react.default.createElement("div", { - ref: editorToolsResize.secondRef - }, /*#__PURE__*/_react.default.createElement("section", { - className: "graphiql-editor-tool", - "aria-label": activeSecondaryEditor === 'variables' ? 'Variables' : 'Headers' - }, /*#__PURE__*/_react.default.createElement(_react2.VariableEditor, { - editorTheme: props.editorTheme, - isHidden: activeSecondaryEditor !== 'variables', - keyMap: props.keyMap, - onEdit: props.onEditVariables, - onClickReference: onClickReference, - readOnly: props.readOnly - }), isHeadersEditorEnabled && /*#__PURE__*/_react.default.createElement(_react2.HeaderEditor, { - editorTheme: props.editorTheme, - isHidden: activeSecondaryEditor !== 'headers', - keyMap: props.keyMap, - onEdit: props.onEditHeaders, - readOnly: props.readOnly - }))))), /*#__PURE__*/_react.default.createElement("div", { - className: "graphiql-horizontal-drag-bar", - ref: editorResize.dragBarRef - }), /*#__PURE__*/_react.default.createElement("div", { - ref: editorResize.secondRef - }, /*#__PURE__*/_react.default.createElement("div", { - className: "graphiql-response" - }, executionContext.isFetching ? /*#__PURE__*/_react.default.createElement(_react2.Spinner, null) : null, /*#__PURE__*/_react.default.createElement(_react2.ResponseEditor, { - editorTheme: props.editorTheme, - responseTooltip: props.responseTooltip, - keyMap: props.keyMap - }), footer))))), /*#__PURE__*/_react.default.createElement(_react2.Dialog, { - open: showDialog === 'short-keys', - onOpenChange: handleOpenShortKeysDialog - }, /*#__PURE__*/_react.default.createElement("div", { - className: "graphiql-dialog-header" - }, /*#__PURE__*/_react.default.createElement(_react2.Dialog.Title, { - className: "graphiql-dialog-title" - }, "Short Keys"), /*#__PURE__*/_react.default.createElement(_react2.Dialog.Close, null)), /*#__PURE__*/_react.default.createElement("div", { - className: "graphiql-dialog-section" - }, /*#__PURE__*/_react.default.createElement(ShortKeys, { - keyMap: props.keyMap || 'sublime' - }))), /*#__PURE__*/_react.default.createElement(_react2.Dialog, { - open: showDialog === 'settings', - onOpenChange: handleOpenSettingsDialog - }, /*#__PURE__*/_react.default.createElement("div", { - className: "graphiql-dialog-header" - }, /*#__PURE__*/_react.default.createElement(_react2.Dialog.Title, { - className: "graphiql-dialog-title" - }, "Settings"), /*#__PURE__*/_react.default.createElement(_react2.Dialog.Close, null)), props.showPersistHeadersSettings ? /*#__PURE__*/_react.default.createElement("div", { - className: "graphiql-dialog-section" - }, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", { - className: "graphiql-dialog-section-title" - }, "Persist headers"), /*#__PURE__*/_react.default.createElement("div", { - className: "graphiql-dialog-section-caption" - }, "Save headers upon reloading.", ' ', /*#__PURE__*/_react.default.createElement("span", { - className: "graphiql-warning-text" - }, "Only enable if you trust this device."))), /*#__PURE__*/_react.default.createElement(_react2.ButtonGroup, null, /*#__PURE__*/_react.default.createElement(_react2.Button, { - type: "button", - id: "enable-persist-headers", - className: editorContext.shouldPersistHeaders ? 'active' : '', - "data-value": "true", - onClick: handlePersistHeaders - }, "On"), /*#__PURE__*/_react.default.createElement(_react2.Button, { - type: "button", - id: "disable-persist-headers", - className: editorContext.shouldPersistHeaders ? '' : 'active', - onClick: handlePersistHeaders - }, "Off"))) : null, /*#__PURE__*/_react.default.createElement("div", { - className: "graphiql-dialog-section" - }, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", { - className: "graphiql-dialog-section-title" - }, "Theme"), /*#__PURE__*/_react.default.createElement("div", { - className: "graphiql-dialog-section-caption" - }, "Adjust how the interface looks like.")), /*#__PURE__*/_react.default.createElement(_react2.ButtonGroup, null, /*#__PURE__*/_react.default.createElement(_react2.Button, { - type: "button", - className: theme === null ? 'active' : '', - onClick: handleChangeTheme - }, "System"), /*#__PURE__*/_react.default.createElement(_react2.Button, { - type: "button", - className: theme === 'light' ? 'active' : '', - "data-theme": "light", - onClick: handleChangeTheme - }, "Light"), /*#__PURE__*/_react.default.createElement(_react2.Button, { - type: "button", - className: theme === 'dark' ? 'active' : '', - "data-theme": "dark", - onClick: handleChangeTheme - }, "Dark"))), storageContext ? /*#__PURE__*/_react.default.createElement("div", { - className: "graphiql-dialog-section" - }, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", { - className: "graphiql-dialog-section-title" - }, "Clear storage"), /*#__PURE__*/_react.default.createElement("div", { - className: "graphiql-dialog-section-caption" - }, "Remove all locally stored data and start fresh.")), /*#__PURE__*/_react.default.createElement(_react2.Button, { - type: "button", - state: clearStorageStatus || undefined, - disabled: clearStorageStatus === 'success', - onClick: handleClearData - }, { - success: 'Cleared data', - error: 'Failed' - }[clearStorageStatus] || 'Clear data')) : null))); -} -const modifier = typeof window !== 'undefined' && window.navigator.platform.toLowerCase().indexOf('mac') === 0 ? 'Cmd' : 'Ctrl'; -const SHORT_KEYS = Object.entries({ - 'Search in editor': [modifier, 'F'], - 'Search in documentation': [modifier, 'K'], - 'Execute query': [modifier, 'Enter'], - 'Prettify editors': ['Ctrl', 'Shift', 'P'], - 'Merge fragments definitions into operation definition': ['Ctrl', 'Shift', 'M'], - 'Copy query': ['Ctrl', 'Shift', 'C'], - 'Re-fetch schema using introspection': ['Ctrl', 'Shift', 'R'] -}); -function ShortKeys(_ref2) { - let { - keyMap - } = _ref2; - return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("table", { - className: "graphiql-table" - }, /*#__PURE__*/_react.default.createElement("thead", null, /*#__PURE__*/_react.default.createElement("tr", null, /*#__PURE__*/_react.default.createElement("th", null, "Short Key"), /*#__PURE__*/_react.default.createElement("th", null, "Function"))), /*#__PURE__*/_react.default.createElement("tbody", null, SHORT_KEYS.map(_ref3 => { - let [title, keys] = _ref3; - return /*#__PURE__*/_react.default.createElement("tr", { - key: title - }, /*#__PURE__*/_react.default.createElement("td", null, keys.map((key, index, array) => /*#__PURE__*/_react.default.createElement(_react.Fragment, { - key: key - }, /*#__PURE__*/_react.default.createElement("code", { - className: "graphiql-key" - }, key), index !== array.length - 1 && ' + '))), /*#__PURE__*/_react.default.createElement("td", null, title)); - }))), /*#__PURE__*/_react.default.createElement("p", null, "The editors use", ' ', /*#__PURE__*/_react.default.createElement("a", { - href: "https://codemirror.net/5/doc/manual.html#keymaps", - target: "_blank", - rel: "noopener noreferrer" - }, "CodeMirror Key Maps"), ' ', "that add more short keys. This instance of Graph", /*#__PURE__*/_react.default.createElement("em", null, "i"), "QL uses", ' ', /*#__PURE__*/_react.default.createElement("code", null, keyMap), ".")); -} - -// Configure the UI by providing this Component as a child of GraphiQL. -function GraphiQLLogo(props) { - return /*#__PURE__*/_react.default.createElement("div", { - className: "graphiql-logo" - }, props.children || /*#__PURE__*/_react.default.createElement("a", { - className: "graphiql-logo-link", - href: "https://github.com/graphql/graphiql", - target: "_blank", - rel: "noreferrer" - }, "Graph", /*#__PURE__*/_react.default.createElement("em", null, "i"), "QL")); -} -GraphiQLLogo.displayName = 'GraphiQLLogo'; - -// Configure the UI by providing this Component as a child of GraphiQL. -function GraphiQLToolbar(props) { - // eslint-disable-next-line react/jsx-no-useless-fragment - return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, props.children); -} -GraphiQLToolbar.displayName = 'GraphiQLToolbar'; - -// Configure the UI by providing this Component as a child of GraphiQL. -function GraphiQLFooter(props) { - return /*#__PURE__*/_react.default.createElement("div", { - className: "graphiql-footer" - }, props.children); -} -GraphiQLFooter.displayName = 'GraphiQLFooter'; - -// Determines if the React child is of the same type of the provided React component -function isChildComponentType(child, component) { - var _child$type; - if (child !== null && child !== void 0 && (_child$type = child.type) !== null && _child$type !== void 0 && _child$type.displayName && child.type.displayName === component.displayName) { - return true; - } - return child.type === component; -} - -/***/ }), - -/***/ "../../graphql-language-service/esm/index.js": -/*!***************************************************!*\ - !*** ../../graphql-language-service/esm/index.js ***! - \***************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -Object.defineProperty(exports, "CharacterStream", ({ - enumerable: true, - get: function () { - return _parser.CharacterStream; - } -})); -Object.defineProperty(exports, "CompletionItemKind", ({ - enumerable: true, - get: function () { - return _types.CompletionItemKind; - } -})); -Object.defineProperty(exports, "DIAGNOSTIC_SEVERITY", ({ - enumerable: true, - get: function () { - return _interface.DIAGNOSTIC_SEVERITY; - } -})); -Object.defineProperty(exports, "FileChangeTypeKind", ({ - enumerable: true, - get: function () { - return _types.FileChangeTypeKind; - } -})); -Object.defineProperty(exports, "LexRules", ({ - enumerable: true, - get: function () { - return _parser.LexRules; - } -})); -Object.defineProperty(exports, "ParseRules", ({ - enumerable: true, - get: function () { - return _parser.ParseRules; - } -})); -Object.defineProperty(exports, "Position", ({ - enumerable: true, - get: function () { - return _utils.Position; - } -})); -Object.defineProperty(exports, "Range", ({ - enumerable: true, - get: function () { - return _utils.Range; - } -})); -Object.defineProperty(exports, "RuleKinds", ({ - enumerable: true, - get: function () { - return _parser.RuleKinds; - } -})); -Object.defineProperty(exports, "SEVERITY", ({ - enumerable: true, - get: function () { - return _interface.SEVERITY; - } -})); -Object.defineProperty(exports, "SuggestionCommand", ({ - enumerable: true, - get: function () { - return _interface.SuggestionCommand; - } -})); -Object.defineProperty(exports, "canUseDirective", ({ - enumerable: true, - get: function () { - return _interface.canUseDirective; - } -})); -Object.defineProperty(exports, "collectVariables", ({ - enumerable: true, - get: function () { - return _utils.collectVariables; - } -})); -Object.defineProperty(exports, "getASTNodeAtPosition", ({ - enumerable: true, - get: function () { - return _utils.getASTNodeAtPosition; - } -})); -Object.defineProperty(exports, "getAutocompleteSuggestions", ({ - enumerable: true, - get: function () { - return _interface.getAutocompleteSuggestions; - } -})); -Object.defineProperty(exports, "getDefinitionQueryResultForDefinitionNode", ({ - enumerable: true, - get: function () { - return _interface.getDefinitionQueryResultForDefinitionNode; - } -})); -Object.defineProperty(exports, "getDefinitionQueryResultForField", ({ - enumerable: true, - get: function () { - return _interface.getDefinitionQueryResultForField; - } -})); -Object.defineProperty(exports, "getDefinitionQueryResultForFragmentSpread", ({ - enumerable: true, - get: function () { - return _interface.getDefinitionQueryResultForFragmentSpread; - } -})); -Object.defineProperty(exports, "getDefinitionQueryResultForNamedType", ({ - enumerable: true, - get: function () { - return _interface.getDefinitionQueryResultForNamedType; - } -})); -Object.defineProperty(exports, "getDefinitionState", ({ - enumerable: true, - get: function () { - return _interface.getDefinitionState; - } -})); -Object.defineProperty(exports, "getDiagnostics", ({ - enumerable: true, - get: function () { - return _interface.getDiagnostics; - } -})); -Object.defineProperty(exports, "getFieldDef", ({ - enumerable: true, - get: function () { - return _interface.getFieldDef; - } -})); -Object.defineProperty(exports, "getFragmentDefinitions", ({ - enumerable: true, - get: function () { - return _interface.getFragmentDefinitions; - } -})); -Object.defineProperty(exports, "getFragmentDependencies", ({ - enumerable: true, - get: function () { - return _utils.getFragmentDependencies; - } -})); -Object.defineProperty(exports, "getFragmentDependenciesForAST", ({ - enumerable: true, - get: function () { - return _utils.getFragmentDependenciesForAST; - } -})); -Object.defineProperty(exports, "getHoverInformation", ({ - enumerable: true, - get: function () { - return _interface.getHoverInformation; - } -})); -Object.defineProperty(exports, "getOperationASTFacts", ({ - enumerable: true, - get: function () { - return _utils.getOperationASTFacts; - } -})); -Object.defineProperty(exports, "getOperationFacts", ({ - enumerable: true, - get: function () { - return _utils.getOperationFacts; - } -})); -Object.defineProperty(exports, "getOutline", ({ - enumerable: true, - get: function () { - return _interface.getOutline; - } -})); -Object.defineProperty(exports, "getQueryFacts", ({ - enumerable: true, - get: function () { - return _utils.getQueryFacts; - } -})); -Object.defineProperty(exports, "getRange", ({ - enumerable: true, - get: function () { - return _interface.getRange; - } -})); -Object.defineProperty(exports, "getTokenAtPosition", ({ - enumerable: true, - get: function () { - return _interface.getTokenAtPosition; - } -})); -Object.defineProperty(exports, "getTypeInfo", ({ - enumerable: true, - get: function () { - return _interface.getTypeInfo; - } -})); -Object.defineProperty(exports, "getVariableCompletions", ({ - enumerable: true, - get: function () { - return _interface.getVariableCompletions; - } -})); -Object.defineProperty(exports, "getVariablesJSONSchema", ({ - enumerable: true, - get: function () { - return _utils.getVariablesJSONSchema; - } -})); -Object.defineProperty(exports, "isIgnored", ({ - enumerable: true, - get: function () { - return _parser.isIgnored; - } -})); -Object.defineProperty(exports, "list", ({ - enumerable: true, - get: function () { - return _parser.list; - } -})); -Object.defineProperty(exports, "offsetToPosition", ({ - enumerable: true, - get: function () { - return _utils.offsetToPosition; - } -})); -Object.defineProperty(exports, "onlineParser", ({ - enumerable: true, - get: function () { - return _parser.onlineParser; - } -})); -Object.defineProperty(exports, "opt", ({ - enumerable: true, - get: function () { - return _parser.opt; - } -})); -Object.defineProperty(exports, "p", ({ - enumerable: true, - get: function () { - return _parser.p; - } -})); -Object.defineProperty(exports, "pointToOffset", ({ - enumerable: true, - get: function () { - return _utils.pointToOffset; - } -})); -Object.defineProperty(exports, "t", ({ - enumerable: true, - get: function () { - return _parser.t; - } -})); -Object.defineProperty(exports, "validateQuery", ({ - enumerable: true, - get: function () { - return _interface.validateQuery; - } -})); -Object.defineProperty(exports, "validateWithCustomRules", ({ - enumerable: true, - get: function () { - return _utils.validateWithCustomRules; - } -})); -var _interface = __webpack_require__(/*! ./interface */ "../../graphql-language-service/esm/interface/index.js"); -var _parser = __webpack_require__(/*! ./parser */ "../../graphql-language-service/esm/parser/index.js"); -var _types = __webpack_require__(/*! ./types */ "../../graphql-language-service/esm/types.js"); -var _utils = __webpack_require__(/*! ./utils */ "../../graphql-language-service/esm/utils/index.js"); - -/***/ }), - -/***/ "../../graphql-language-service/esm/interface/autocompleteUtils.js": -/*!*************************************************************************!*\ - !*** ../../graphql-language-service/esm/interface/autocompleteUtils.js ***! - \*************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.forEachState = forEachState; -exports.getDefinitionState = getDefinitionState; -exports.getFieldDef = getFieldDef; -exports.hintList = hintList; -exports.objectValues = objectValues; -var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -function getDefinitionState(tokenState) { - let definitionState; - forEachState(tokenState, state => { - switch (state.kind) { - case 'Query': - case 'ShortQuery': - case 'Mutation': - case 'Subscription': - case 'FragmentDefinition': - definitionState = state; - break; - } - }); - return definitionState; -} -function getFieldDef(schema, type, fieldName) { - if (fieldName === _graphql.SchemaMetaFieldDef.name && schema.getQueryType() === type) { - return _graphql.SchemaMetaFieldDef; - } - if (fieldName === _graphql.TypeMetaFieldDef.name && schema.getQueryType() === type) { - return _graphql.TypeMetaFieldDef; - } - if (fieldName === _graphql.TypeNameMetaFieldDef.name && (0, _graphql.isCompositeType)(type)) { - return _graphql.TypeNameMetaFieldDef; - } - if ('getFields' in type) { - return type.getFields()[fieldName]; - } - return null; -} -function forEachState(stack, fn) { - const reverseStateStack = []; - let state = stack; - while (state === null || state === void 0 ? void 0 : state.kind) { - reverseStateStack.push(state); - state = state.prevState; - } - for (let i = reverseStateStack.length - 1; i >= 0; i--) { - fn(reverseStateStack[i]); - } -} -function objectValues(object) { - const keys = Object.keys(object); - const len = keys.length; - const values = new Array(len); - for (let i = 0; i < len; ++i) { - values[i] = object[keys[i]]; - } - return values; -} -function hintList(token, list) { - return filterAndSortList(list, normalizeText(token.string)); -} -function filterAndSortList(list, text) { - if (!text) { - return filterNonEmpty(list, entry => !entry.isDeprecated); - } - const byProximity = list.map(entry => ({ - proximity: getProximity(normalizeText(entry.label), text), - entry - })); - return filterNonEmpty(filterNonEmpty(byProximity, pair => pair.proximity <= 2), pair => !pair.entry.isDeprecated).sort((a, b) => (a.entry.isDeprecated ? 1 : 0) - (b.entry.isDeprecated ? 1 : 0) || a.proximity - b.proximity || a.entry.label.length - b.entry.label.length).map(pair => pair.entry); -} -function filterNonEmpty(array, predicate) { - const filtered = array.filter(predicate); - return filtered.length === 0 ? array : filtered; -} -function normalizeText(text) { - return text.toLowerCase().replaceAll(/\W/g, ''); -} -function getProximity(suggestion, text) { - let proximity = lexicalDistance(text, suggestion); - if (suggestion.length > text.length) { - proximity -= suggestion.length - text.length - 1; - proximity += suggestion.indexOf(text) === 0 ? 0 : 0.5; - } - return proximity; -} -function lexicalDistance(a, b) { - let i; - let j; - const d = []; - const aLength = a.length; - const bLength = b.length; - for (i = 0; i <= aLength; i++) { - d[i] = [i]; - } - for (j = 1; j <= bLength; j++) { - d[0][j] = j; - } - for (i = 1; i <= aLength; i++) { - for (j = 1; j <= bLength; j++) { - const cost = a[i - 1] === b[j - 1] ? 0 : 1; - d[i][j] = Math.min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + cost); - if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) { - d[i][j] = Math.min(d[i][j], d[i - 2][j - 2] + cost); - } - } - } - return d[aLength][bLength]; -} - -/***/ }), - -/***/ "../../graphql-language-service/esm/interface/getAutocompleteSuggestions.js": -/*!**********************************************************************************!*\ - !*** ../../graphql-language-service/esm/interface/getAutocompleteSuggestions.js ***! - \**********************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.SuggestionCommand = exports.GraphQLDocumentMode = void 0; -exports.canUseDirective = canUseDirective; -exports.getAutocompleteSuggestions = getAutocompleteSuggestions; -exports.getFragmentDefinitions = getFragmentDefinitions; -exports.getTokenAtPosition = getTokenAtPosition; -exports.getTypeInfo = getTypeInfo; -exports.getVariableCompletions = getVariableCompletions; -exports.runOnlineParser = runOnlineParser; -var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -var _types = __webpack_require__(/*! ../types */ "../../graphql-language-service/esm/types.js"); -var _parser = __webpack_require__(/*! ../parser */ "../../graphql-language-service/esm/parser/index.js"); -var _autocompleteUtils = __webpack_require__(/*! ./autocompleteUtils */ "../../graphql-language-service/esm/interface/autocompleteUtils.js"); -const SuggestionCommand = { - command: 'editor.action.triggerSuggest', - title: 'Suggestions' -}; -exports.SuggestionCommand = SuggestionCommand; -const collectFragmentDefs = op => { - const externalFragments = []; - if (op) { - try { - (0, _graphql.visit)((0, _graphql.parse)(op), { - FragmentDefinition(def) { - externalFragments.push(def); - } - }); - } catch (_a) { - return []; - } - } - return externalFragments; -}; -const typeSystemKinds = [_graphql.Kind.SCHEMA_DEFINITION, _graphql.Kind.OPERATION_TYPE_DEFINITION, _graphql.Kind.SCALAR_TYPE_DEFINITION, _graphql.Kind.OBJECT_TYPE_DEFINITION, _graphql.Kind.INTERFACE_TYPE_DEFINITION, _graphql.Kind.UNION_TYPE_DEFINITION, _graphql.Kind.ENUM_TYPE_DEFINITION, _graphql.Kind.INPUT_OBJECT_TYPE_DEFINITION, _graphql.Kind.DIRECTIVE_DEFINITION, _graphql.Kind.SCHEMA_EXTENSION, _graphql.Kind.SCALAR_TYPE_EXTENSION, _graphql.Kind.OBJECT_TYPE_EXTENSION, _graphql.Kind.INTERFACE_TYPE_EXTENSION, _graphql.Kind.UNION_TYPE_EXTENSION, _graphql.Kind.ENUM_TYPE_EXTENSION, _graphql.Kind.INPUT_OBJECT_TYPE_EXTENSION]; -const hasTypeSystemDefinitions = sdl => { - let hasTypeSystemDef = false; - if (sdl) { - try { - (0, _graphql.visit)((0, _graphql.parse)(sdl), { - enter(node) { - if (node.kind === 'Document') { - return; - } - if (typeSystemKinds.includes(node.kind)) { - hasTypeSystemDef = true; - return _graphql.BREAK; - } - return false; - } - }); - } catch (_a) { - return hasTypeSystemDef; - } - } - return hasTypeSystemDef; -}; -function getAutocompleteSuggestions(schema, queryText, cursor, contextToken, fragmentDefs, options) { - var _a; - const opts = Object.assign(Object.assign({}, options), { - schema - }); - const token = contextToken || getTokenAtPosition(queryText, cursor, 1); - const state = token.state.kind === 'Invalid' ? token.state.prevState : token.state; - const mode = (options === null || options === void 0 ? void 0 : options.mode) || getDocumentMode(queryText, options === null || options === void 0 ? void 0 : options.uri); - if (!state) { - return []; - } - const { - kind, - step, - prevState - } = state; - const typeInfo = getTypeInfo(schema, token.state); - if (kind === _parser.RuleKinds.DOCUMENT) { - if (mode === GraphQLDocumentMode.TYPE_SYSTEM) { - return getSuggestionsForTypeSystemDefinitions(token); - } - return getSuggestionsForExecutableDefinitions(token); - } - if (kind === _parser.RuleKinds.EXTEND_DEF) { - return getSuggestionsForExtensionDefinitions(token); - } - if (((_a = prevState === null || prevState === void 0 ? void 0 : prevState.prevState) === null || _a === void 0 ? void 0 : _a.kind) === _parser.RuleKinds.EXTENSION_DEFINITION && state.name) { - return (0, _autocompleteUtils.hintList)(token, []); - } - if ((prevState === null || prevState === void 0 ? void 0 : prevState.kind) === _graphql.Kind.SCALAR_TYPE_EXTENSION) { - return (0, _autocompleteUtils.hintList)(token, Object.values(schema.getTypeMap()).filter(_graphql.isScalarType).map(type => ({ - label: type.name, - kind: _types.CompletionItemKind.Function - }))); - } - if ((prevState === null || prevState === void 0 ? void 0 : prevState.kind) === _graphql.Kind.OBJECT_TYPE_EXTENSION) { - return (0, _autocompleteUtils.hintList)(token, Object.values(schema.getTypeMap()).filter(type => (0, _graphql.isObjectType)(type) && !type.name.startsWith('__')).map(type => ({ - label: type.name, - kind: _types.CompletionItemKind.Function - }))); - } - if ((prevState === null || prevState === void 0 ? void 0 : prevState.kind) === _graphql.Kind.INTERFACE_TYPE_EXTENSION) { - return (0, _autocompleteUtils.hintList)(token, Object.values(schema.getTypeMap()).filter(_graphql.isInterfaceType).map(type => ({ - label: type.name, - kind: _types.CompletionItemKind.Function - }))); - } - if ((prevState === null || prevState === void 0 ? void 0 : prevState.kind) === _graphql.Kind.UNION_TYPE_EXTENSION) { - return (0, _autocompleteUtils.hintList)(token, Object.values(schema.getTypeMap()).filter(_graphql.isUnionType).map(type => ({ - label: type.name, - kind: _types.CompletionItemKind.Function - }))); - } - if ((prevState === null || prevState === void 0 ? void 0 : prevState.kind) === _graphql.Kind.ENUM_TYPE_EXTENSION) { - return (0, _autocompleteUtils.hintList)(token, Object.values(schema.getTypeMap()).filter(type => (0, _graphql.isEnumType)(type) && !type.name.startsWith('__')).map(type => ({ - label: type.name, - kind: _types.CompletionItemKind.Function - }))); - } - if ((prevState === null || prevState === void 0 ? void 0 : prevState.kind) === _graphql.Kind.INPUT_OBJECT_TYPE_EXTENSION) { - return (0, _autocompleteUtils.hintList)(token, Object.values(schema.getTypeMap()).filter(_graphql.isInputObjectType).map(type => ({ - label: type.name, - kind: _types.CompletionItemKind.Function - }))); - } - if (kind === _parser.RuleKinds.IMPLEMENTS || kind === _parser.RuleKinds.NAMED_TYPE && (prevState === null || prevState === void 0 ? void 0 : prevState.kind) === _parser.RuleKinds.IMPLEMENTS) { - return getSuggestionsForImplements(token, state, schema, queryText, typeInfo); - } - if (kind === _parser.RuleKinds.SELECTION_SET || kind === _parser.RuleKinds.FIELD || kind === _parser.RuleKinds.ALIASED_FIELD) { - return getSuggestionsForFieldNames(token, typeInfo, opts); - } - if (kind === _parser.RuleKinds.ARGUMENTS || kind === _parser.RuleKinds.ARGUMENT && step === 0) { - const { - argDefs - } = typeInfo; - if (argDefs) { - return (0, _autocompleteUtils.hintList)(token, argDefs.map(argDef => { - var _a; - return { - label: argDef.name, - insertText: argDef.name + ': ', - command: SuggestionCommand, - detail: String(argDef.type), - documentation: (_a = argDef.description) !== null && _a !== void 0 ? _a : undefined, - kind: _types.CompletionItemKind.Variable, - type: argDef.type - }; - })); - } - } - if ((kind === _parser.RuleKinds.OBJECT_VALUE || kind === _parser.RuleKinds.OBJECT_FIELD && step === 0) && typeInfo.objectFieldDefs) { - const objectFields = (0, _autocompleteUtils.objectValues)(typeInfo.objectFieldDefs); - const completionKind = kind === _parser.RuleKinds.OBJECT_VALUE ? _types.CompletionItemKind.Value : _types.CompletionItemKind.Field; - return (0, _autocompleteUtils.hintList)(token, objectFields.map(field => { - var _a; - return { - label: field.name, - detail: String(field.type), - documentation: (_a = field.description) !== null && _a !== void 0 ? _a : undefined, - kind: completionKind, - type: field.type - }; - })); - } - if (kind === _parser.RuleKinds.ENUM_VALUE || kind === _parser.RuleKinds.LIST_VALUE && step === 1 || kind === _parser.RuleKinds.OBJECT_FIELD && step === 2 || kind === _parser.RuleKinds.ARGUMENT && step === 2) { - return getSuggestionsForInputValues(token, typeInfo, queryText, schema); - } - if (kind === _parser.RuleKinds.VARIABLE && step === 1) { - const namedInputType = (0, _graphql.getNamedType)(typeInfo.inputType); - const variableDefinitions = getVariableCompletions(queryText, schema, token); - return (0, _autocompleteUtils.hintList)(token, variableDefinitions.filter(v => v.detail === (namedInputType === null || namedInputType === void 0 ? void 0 : namedInputType.name))); - } - if (kind === _parser.RuleKinds.TYPE_CONDITION && step === 1 || kind === _parser.RuleKinds.NAMED_TYPE && prevState != null && prevState.kind === _parser.RuleKinds.TYPE_CONDITION) { - return getSuggestionsForFragmentTypeConditions(token, typeInfo, schema, kind); - } - if (kind === _parser.RuleKinds.FRAGMENT_SPREAD && step === 1) { - return getSuggestionsForFragmentSpread(token, typeInfo, schema, queryText, Array.isArray(fragmentDefs) ? fragmentDefs : collectFragmentDefs(fragmentDefs)); - } - const unwrappedState = unwrapType(state); - if (mode === GraphQLDocumentMode.TYPE_SYSTEM && !unwrappedState.needsAdvance && kind === _parser.RuleKinds.NAMED_TYPE || kind === _parser.RuleKinds.LIST_TYPE) { - if (unwrappedState.kind === _parser.RuleKinds.FIELD_DEF) { - return (0, _autocompleteUtils.hintList)(token, Object.values(schema.getTypeMap()).filter(type => (0, _graphql.isOutputType)(type) && !type.name.startsWith('__')).map(type => ({ - label: type.name, - kind: _types.CompletionItemKind.Function - }))); - } - if (unwrappedState.kind === _parser.RuleKinds.INPUT_VALUE_DEF) { - return (0, _autocompleteUtils.hintList)(token, Object.values(schema.getTypeMap()).filter(type => (0, _graphql.isInputType)(type) && !type.name.startsWith('__')).map(type => ({ - label: type.name, - kind: _types.CompletionItemKind.Function - }))); - } - } - if (kind === _parser.RuleKinds.VARIABLE_DEFINITION && step === 2 || kind === _parser.RuleKinds.LIST_TYPE && step === 1 || kind === _parser.RuleKinds.NAMED_TYPE && prevState && (prevState.kind === _parser.RuleKinds.VARIABLE_DEFINITION || prevState.kind === _parser.RuleKinds.LIST_TYPE || prevState.kind === _parser.RuleKinds.NON_NULL_TYPE)) { - return getSuggestionsForVariableDefinition(token, schema, kind); - } - if (kind === _parser.RuleKinds.DIRECTIVE) { - return getSuggestionsForDirective(token, state, schema, kind); - } - return []; -} -const insertSuffix = ' {\n $1\n}'; -const getInsertText = field => { - const { - type - } = field; - if ((0, _graphql.isCompositeType)(type)) { - return insertSuffix; - } - if ((0, _graphql.isListType)(type) && (0, _graphql.isCompositeType)(type.ofType)) { - return insertSuffix; - } - if ((0, _graphql.isNonNullType)(type)) { - if ((0, _graphql.isCompositeType)(type.ofType)) { - return insertSuffix; - } - if ((0, _graphql.isListType)(type.ofType) && (0, _graphql.isCompositeType)(type.ofType.ofType)) { - return insertSuffix; - } - } - return null; -}; -function getSuggestionsForTypeSystemDefinitions(token) { - return (0, _autocompleteUtils.hintList)(token, [{ - label: 'extend', - kind: _types.CompletionItemKind.Function - }, { - label: 'type', - kind: _types.CompletionItemKind.Function - }, { - label: 'interface', - kind: _types.CompletionItemKind.Function - }, { - label: 'union', - kind: _types.CompletionItemKind.Function - }, { - label: 'input', - kind: _types.CompletionItemKind.Function - }, { - label: 'scalar', - kind: _types.CompletionItemKind.Function - }, { - label: 'schema', - kind: _types.CompletionItemKind.Function - }]); -} -function getSuggestionsForExecutableDefinitions(token) { - return (0, _autocompleteUtils.hintList)(token, [{ - label: 'query', - kind: _types.CompletionItemKind.Function - }, { - label: 'mutation', - kind: _types.CompletionItemKind.Function - }, { - label: 'subscription', - kind: _types.CompletionItemKind.Function - }, { - label: 'fragment', - kind: _types.CompletionItemKind.Function - }, { - label: '{', - kind: _types.CompletionItemKind.Constructor - }]); -} -function getSuggestionsForExtensionDefinitions(token) { - return (0, _autocompleteUtils.hintList)(token, [{ - label: 'type', - kind: _types.CompletionItemKind.Function - }, { - label: 'interface', - kind: _types.CompletionItemKind.Function - }, { - label: 'union', - kind: _types.CompletionItemKind.Function - }, { - label: 'input', - kind: _types.CompletionItemKind.Function - }, { - label: 'scalar', - kind: _types.CompletionItemKind.Function - }, { - label: 'schema', - kind: _types.CompletionItemKind.Function - }]); -} -function getSuggestionsForFieldNames(token, typeInfo, options) { - var _a; - if (typeInfo.parentType) { - const { - parentType - } = typeInfo; - let fields = []; - if ('getFields' in parentType) { - fields = (0, _autocompleteUtils.objectValues)(parentType.getFields()); - } - if ((0, _graphql.isCompositeType)(parentType)) { - fields.push(_graphql.TypeNameMetaFieldDef); - } - if (parentType === ((_a = options === null || options === void 0 ? void 0 : options.schema) === null || _a === void 0 ? void 0 : _a.getQueryType())) { - fields.push(_graphql.SchemaMetaFieldDef, _graphql.TypeMetaFieldDef); - } - return (0, _autocompleteUtils.hintList)(token, fields.map((field, index) => { - var _a; - const suggestion = { - sortText: String(index) + field.name, - label: field.name, - detail: String(field.type), - documentation: (_a = field.description) !== null && _a !== void 0 ? _a : undefined, - deprecated: Boolean(field.deprecationReason), - isDeprecated: Boolean(field.deprecationReason), - deprecationReason: field.deprecationReason, - kind: _types.CompletionItemKind.Field, - type: field.type - }; - if (options === null || options === void 0 ? void 0 : options.fillLeafsOnComplete) { - const insertText = getInsertText(field); - if (insertText) { - suggestion.insertText = field.name + insertText; - suggestion.insertTextFormat = _types.InsertTextFormat.Snippet; - suggestion.command = SuggestionCommand; - } - } - return suggestion; - })); - } - return []; -} -function getSuggestionsForInputValues(token, typeInfo, queryText, schema) { - const namedInputType = (0, _graphql.getNamedType)(typeInfo.inputType); - const queryVariables = getVariableCompletions(queryText, schema, token).filter(v => v.detail === namedInputType.name); - if (namedInputType instanceof _graphql.GraphQLEnumType) { - const values = namedInputType.getValues(); - return (0, _autocompleteUtils.hintList)(token, values.map(value => { - var _a; - return { - label: value.name, - detail: String(namedInputType), - documentation: (_a = value.description) !== null && _a !== void 0 ? _a : undefined, - deprecated: Boolean(value.deprecationReason), - isDeprecated: Boolean(value.deprecationReason), - deprecationReason: value.deprecationReason, - kind: _types.CompletionItemKind.EnumMember, - type: namedInputType - }; - }).concat(queryVariables)); - } - if (namedInputType === _graphql.GraphQLBoolean) { - return (0, _autocompleteUtils.hintList)(token, queryVariables.concat([{ - label: 'true', - detail: String(_graphql.GraphQLBoolean), - documentation: 'Not false.', - kind: _types.CompletionItemKind.Variable, - type: _graphql.GraphQLBoolean - }, { - label: 'false', - detail: String(_graphql.GraphQLBoolean), - documentation: 'Not true.', - kind: _types.CompletionItemKind.Variable, - type: _graphql.GraphQLBoolean - }])); - } - return queryVariables; -} -function getSuggestionsForImplements(token, tokenState, schema, documentText, typeInfo) { - if (tokenState.needsSeparator) { - return []; - } - const typeMap = schema.getTypeMap(); - const schemaInterfaces = (0, _autocompleteUtils.objectValues)(typeMap).filter(_graphql.isInterfaceType); - const schemaInterfaceNames = schemaInterfaces.map(_ref => { - let { - name - } = _ref; - return name; - }); - const inlineInterfaces = new Set(); - runOnlineParser(documentText, (_, state) => { - var _a, _b, _c, _d, _e; - if (state.name) { - if (state.kind === _parser.RuleKinds.INTERFACE_DEF && !schemaInterfaceNames.includes(state.name)) { - inlineInterfaces.add(state.name); - } - if (state.kind === _parser.RuleKinds.NAMED_TYPE && ((_a = state.prevState) === null || _a === void 0 ? void 0 : _a.kind) === _parser.RuleKinds.IMPLEMENTS) { - if (typeInfo.interfaceDef) { - const existingType = (_b = typeInfo.interfaceDef) === null || _b === void 0 ? void 0 : _b.getInterfaces().find(_ref2 => { - let { - name - } = _ref2; - return name === state.name; - }); - if (existingType) { - return; - } - const type = schema.getType(state.name); - const interfaceConfig = (_c = typeInfo.interfaceDef) === null || _c === void 0 ? void 0 : _c.toConfig(); - typeInfo.interfaceDef = new _graphql.GraphQLInterfaceType(Object.assign(Object.assign({}, interfaceConfig), { - interfaces: [...interfaceConfig.interfaces, type || new _graphql.GraphQLInterfaceType({ - name: state.name, - fields: {} - })] - })); - } else if (typeInfo.objectTypeDef) { - const existingType = (_d = typeInfo.objectTypeDef) === null || _d === void 0 ? void 0 : _d.getInterfaces().find(_ref3 => { - let { - name - } = _ref3; - return name === state.name; - }); - if (existingType) { - return; - } - const type = schema.getType(state.name); - const objectTypeConfig = (_e = typeInfo.objectTypeDef) === null || _e === void 0 ? void 0 : _e.toConfig(); - typeInfo.objectTypeDef = new _graphql.GraphQLObjectType(Object.assign(Object.assign({}, objectTypeConfig), { - interfaces: [...objectTypeConfig.interfaces, type || new _graphql.GraphQLInterfaceType({ - name: state.name, - fields: {} - })] - })); - } - } - } - }); - const currentTypeToExtend = typeInfo.interfaceDef || typeInfo.objectTypeDef; - const siblingInterfaces = (currentTypeToExtend === null || currentTypeToExtend === void 0 ? void 0 : currentTypeToExtend.getInterfaces()) || []; - const siblingInterfaceNames = siblingInterfaces.map(_ref4 => { - let { - name - } = _ref4; - return name; - }); - const possibleInterfaces = schemaInterfaces.concat([...inlineInterfaces].map(name => ({ - name - }))).filter(_ref5 => { - let { - name - } = _ref5; - return name !== (currentTypeToExtend === null || currentTypeToExtend === void 0 ? void 0 : currentTypeToExtend.name) && !siblingInterfaceNames.includes(name); - }); - return (0, _autocompleteUtils.hintList)(token, possibleInterfaces.map(type => { - const result = { - label: type.name, - kind: _types.CompletionItemKind.Interface, - type - }; - if (type === null || type === void 0 ? void 0 : type.description) { - result.documentation = type.description; - } - return result; - })); -} -function getSuggestionsForFragmentTypeConditions(token, typeInfo, schema, _kind) { - let possibleTypes; - if (typeInfo.parentType) { - if ((0, _graphql.isAbstractType)(typeInfo.parentType)) { - const abstractType = (0, _graphql.assertAbstractType)(typeInfo.parentType); - const possibleObjTypes = schema.getPossibleTypes(abstractType); - const possibleIfaceMap = Object.create(null); - for (const type of possibleObjTypes) { - for (const iface of type.getInterfaces()) { - possibleIfaceMap[iface.name] = iface; - } - } - possibleTypes = possibleObjTypes.concat((0, _autocompleteUtils.objectValues)(possibleIfaceMap)); - } else { - possibleTypes = [typeInfo.parentType]; - } - } else { - const typeMap = schema.getTypeMap(); - possibleTypes = (0, _autocompleteUtils.objectValues)(typeMap).filter(type => (0, _graphql.isCompositeType)(type) && !type.name.startsWith('__')); - } - return (0, _autocompleteUtils.hintList)(token, possibleTypes.map(type => { - const namedType = (0, _graphql.getNamedType)(type); - return { - label: String(type), - documentation: (namedType === null || namedType === void 0 ? void 0 : namedType.description) || '', - kind: _types.CompletionItemKind.Field - }; - })); -} -function getSuggestionsForFragmentSpread(token, typeInfo, schema, queryText, fragmentDefs) { - if (!queryText) { - return []; - } - const typeMap = schema.getTypeMap(); - const defState = (0, _autocompleteUtils.getDefinitionState)(token.state); - const fragments = getFragmentDefinitions(queryText); - if (fragmentDefs && fragmentDefs.length > 0) { - fragments.push(...fragmentDefs); - } - const relevantFrags = fragments.filter(frag => typeMap[frag.typeCondition.name.value] && !(defState && defState.kind === _parser.RuleKinds.FRAGMENT_DEFINITION && defState.name === frag.name.value) && (0, _graphql.isCompositeType)(typeInfo.parentType) && (0, _graphql.isCompositeType)(typeMap[frag.typeCondition.name.value]) && (0, _graphql.doTypesOverlap)(schema, typeInfo.parentType, typeMap[frag.typeCondition.name.value])); - return (0, _autocompleteUtils.hintList)(token, relevantFrags.map(frag => ({ - label: frag.name.value, - detail: String(typeMap[frag.typeCondition.name.value]), - documentation: `fragment ${frag.name.value} on ${frag.typeCondition.name.value}`, - kind: _types.CompletionItemKind.Field, - type: typeMap[frag.typeCondition.name.value] - }))); -} -const getParentDefinition = (state, kind) => { - var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k; - if (((_a = state.prevState) === null || _a === void 0 ? void 0 : _a.kind) === kind) { - return state.prevState; - } - if (((_c = (_b = state.prevState) === null || _b === void 0 ? void 0 : _b.prevState) === null || _c === void 0 ? void 0 : _c.kind) === kind) { - return state.prevState.prevState; - } - if (((_f = (_e = (_d = state.prevState) === null || _d === void 0 ? void 0 : _d.prevState) === null || _e === void 0 ? void 0 : _e.prevState) === null || _f === void 0 ? void 0 : _f.kind) === kind) { - return state.prevState.prevState.prevState; - } - if (((_k = (_j = (_h = (_g = state.prevState) === null || _g === void 0 ? void 0 : _g.prevState) === null || _h === void 0 ? void 0 : _h.prevState) === null || _j === void 0 ? void 0 : _j.prevState) === null || _k === void 0 ? void 0 : _k.kind) === kind) { - return state.prevState.prevState.prevState.prevState; - } -}; -function getVariableCompletions(queryText, schema, token) { - let variableName = null; - let variableType; - const definitions = Object.create({}); - runOnlineParser(queryText, (_, state) => { - if ((state === null || state === void 0 ? void 0 : state.kind) === _parser.RuleKinds.VARIABLE && state.name) { - variableName = state.name; - } - if ((state === null || state === void 0 ? void 0 : state.kind) === _parser.RuleKinds.NAMED_TYPE && variableName) { - const parentDefinition = getParentDefinition(state, _parser.RuleKinds.TYPE); - if (parentDefinition === null || parentDefinition === void 0 ? void 0 : parentDefinition.type) { - variableType = schema.getType(parentDefinition === null || parentDefinition === void 0 ? void 0 : parentDefinition.type); - } - } - if (variableName && variableType && !definitions[variableName]) { - definitions[variableName] = { - detail: variableType.toString(), - insertText: token.string === '$' ? variableName : '$' + variableName, - label: variableName, - type: variableType, - kind: _types.CompletionItemKind.Variable - }; - variableName = null; - variableType = null; - } - }); - return (0, _autocompleteUtils.objectValues)(definitions); -} -function getFragmentDefinitions(queryText) { - const fragmentDefs = []; - runOnlineParser(queryText, (_, state) => { - if (state.kind === _parser.RuleKinds.FRAGMENT_DEFINITION && state.name && state.type) { - fragmentDefs.push({ - kind: _parser.RuleKinds.FRAGMENT_DEFINITION, - name: { - kind: _graphql.Kind.NAME, - value: state.name - }, - selectionSet: { - kind: _parser.RuleKinds.SELECTION_SET, - selections: [] - }, - typeCondition: { - kind: _parser.RuleKinds.NAMED_TYPE, - name: { - kind: _graphql.Kind.NAME, - value: state.type - } - } - }); - } - }); - return fragmentDefs; -} -function getSuggestionsForVariableDefinition(token, schema, _kind) { - const inputTypeMap = schema.getTypeMap(); - const inputTypes = (0, _autocompleteUtils.objectValues)(inputTypeMap).filter(_graphql.isInputType); - return (0, _autocompleteUtils.hintList)(token, inputTypes.map(type => ({ - label: type.name, - documentation: type.description, - kind: _types.CompletionItemKind.Variable - }))); -} -function getSuggestionsForDirective(token, state, schema, _kind) { - var _a; - if ((_a = state.prevState) === null || _a === void 0 ? void 0 : _a.kind) { - const directives = schema.getDirectives().filter(directive => canUseDirective(state.prevState, directive)); - return (0, _autocompleteUtils.hintList)(token, directives.map(directive => ({ - label: directive.name, - documentation: directive.description || '', - kind: _types.CompletionItemKind.Function - }))); - } - return []; -} -function getTokenAtPosition(queryText, cursor) { - let offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; - let styleAtCursor = null; - let stateAtCursor = null; - let stringAtCursor = null; - const token = runOnlineParser(queryText, (stream, state, style, index) => { - if (index !== cursor.line || stream.getCurrentPosition() + offset < cursor.character + 1) { - return; - } - styleAtCursor = style; - stateAtCursor = Object.assign({}, state); - stringAtCursor = stream.current(); - return 'BREAK'; - }); - return { - start: token.start, - end: token.end, - string: stringAtCursor || token.string, - state: stateAtCursor || token.state, - style: styleAtCursor || token.style - }; -} -function runOnlineParser(queryText, callback) { - const lines = queryText.split('\n'); - const parser = (0, _parser.onlineParser)(); - let state = parser.startState(); - let style = ''; - let stream = new _parser.CharacterStream(''); - for (let i = 0; i < lines.length; i++) { - stream = new _parser.CharacterStream(lines[i]); - while (!stream.eol()) { - style = parser.token(stream, state); - const code = callback(stream, state, style, i); - if (code === 'BREAK') { - break; - } - } - callback(stream, state, style, i); - if (!state.kind) { - state = parser.startState(); - } - } - return { - start: stream.getStartOfToken(), - end: stream.getCurrentPosition(), - string: stream.current(), - state, - style - }; -} -function canUseDirective(state, directive) { - if (!(state === null || state === void 0 ? void 0 : state.kind)) { - return false; - } - const { - kind, - prevState - } = state; - const { - locations - } = directive; - switch (kind) { - case _parser.RuleKinds.QUERY: - return locations.includes(_graphql.DirectiveLocation.QUERY); - case _parser.RuleKinds.MUTATION: - return locations.includes(_graphql.DirectiveLocation.MUTATION); - case _parser.RuleKinds.SUBSCRIPTION: - return locations.includes(_graphql.DirectiveLocation.SUBSCRIPTION); - case _parser.RuleKinds.FIELD: - case _parser.RuleKinds.ALIASED_FIELD: - return locations.includes(_graphql.DirectiveLocation.FIELD); - case _parser.RuleKinds.FRAGMENT_DEFINITION: - return locations.includes(_graphql.DirectiveLocation.FRAGMENT_DEFINITION); - case _parser.RuleKinds.FRAGMENT_SPREAD: - return locations.includes(_graphql.DirectiveLocation.FRAGMENT_SPREAD); - case _parser.RuleKinds.INLINE_FRAGMENT: - return locations.includes(_graphql.DirectiveLocation.INLINE_FRAGMENT); - case _parser.RuleKinds.SCHEMA_DEF: - return locations.includes(_graphql.DirectiveLocation.SCHEMA); - case _parser.RuleKinds.SCALAR_DEF: - return locations.includes(_graphql.DirectiveLocation.SCALAR); - case _parser.RuleKinds.OBJECT_TYPE_DEF: - return locations.includes(_graphql.DirectiveLocation.OBJECT); - case _parser.RuleKinds.FIELD_DEF: - return locations.includes(_graphql.DirectiveLocation.FIELD_DEFINITION); - case _parser.RuleKinds.INTERFACE_DEF: - return locations.includes(_graphql.DirectiveLocation.INTERFACE); - case _parser.RuleKinds.UNION_DEF: - return locations.includes(_graphql.DirectiveLocation.UNION); - case _parser.RuleKinds.ENUM_DEF: - return locations.includes(_graphql.DirectiveLocation.ENUM); - case _parser.RuleKinds.ENUM_VALUE: - return locations.includes(_graphql.DirectiveLocation.ENUM_VALUE); - case _parser.RuleKinds.INPUT_DEF: - return locations.includes(_graphql.DirectiveLocation.INPUT_OBJECT); - case _parser.RuleKinds.INPUT_VALUE_DEF: - const prevStateKind = prevState === null || prevState === void 0 ? void 0 : prevState.kind; - switch (prevStateKind) { - case _parser.RuleKinds.ARGUMENTS_DEF: - return locations.includes(_graphql.DirectiveLocation.ARGUMENT_DEFINITION); - case _parser.RuleKinds.INPUT_DEF: - return locations.includes(_graphql.DirectiveLocation.INPUT_FIELD_DEFINITION); - } - } - return false; -} -function getTypeInfo(schema, tokenState) { - let argDef; - let argDefs; - let directiveDef; - let enumValue; - let fieldDef; - let inputType; - let objectTypeDef; - let objectFieldDefs; - let parentType; - let type; - let interfaceDef; - (0, _autocompleteUtils.forEachState)(tokenState, state => { - var _a; - switch (state.kind) { - case _parser.RuleKinds.QUERY: - case 'ShortQuery': - type = schema.getQueryType(); - break; - case _parser.RuleKinds.MUTATION: - type = schema.getMutationType(); - break; - case _parser.RuleKinds.SUBSCRIPTION: - type = schema.getSubscriptionType(); - break; - case _parser.RuleKinds.INLINE_FRAGMENT: - case _parser.RuleKinds.FRAGMENT_DEFINITION: - if (state.type) { - type = schema.getType(state.type); - } - break; - case _parser.RuleKinds.FIELD: - case _parser.RuleKinds.ALIASED_FIELD: - { - if (!type || !state.name) { - fieldDef = null; - } else { - fieldDef = parentType ? (0, _autocompleteUtils.getFieldDef)(schema, parentType, state.name) : null; - type = fieldDef ? fieldDef.type : null; - } - break; - } - case _parser.RuleKinds.SELECTION_SET: - parentType = (0, _graphql.getNamedType)(type); - break; - case _parser.RuleKinds.DIRECTIVE: - directiveDef = state.name ? schema.getDirective(state.name) : null; - break; - case _parser.RuleKinds.INTERFACE_DEF: - if (state.name) { - objectTypeDef = null; - interfaceDef = new _graphql.GraphQLInterfaceType({ - name: state.name, - interfaces: [], - fields: {} - }); - } - break; - case _parser.RuleKinds.OBJECT_TYPE_DEF: - if (state.name) { - interfaceDef = null; - objectTypeDef = new _graphql.GraphQLObjectType({ - name: state.name, - interfaces: [], - fields: {} - }); - } - break; - case _parser.RuleKinds.ARGUMENTS: - { - if (state.prevState) { - switch (state.prevState.kind) { - case _parser.RuleKinds.FIELD: - argDefs = fieldDef && fieldDef.args; - break; - case _parser.RuleKinds.DIRECTIVE: - argDefs = directiveDef && directiveDef.args; - break; - case _parser.RuleKinds.ALIASED_FIELD: - { - const name = (_a = state.prevState) === null || _a === void 0 ? void 0 : _a.name; - if (!name) { - argDefs = null; - break; - } - const field = parentType ? (0, _autocompleteUtils.getFieldDef)(schema, parentType, name) : null; - if (!field) { - argDefs = null; - break; - } - argDefs = field.args; - break; - } - default: - argDefs = null; - break; - } - } else { - argDefs = null; - } - break; - } - case _parser.RuleKinds.ARGUMENT: - if (argDefs) { - for (let i = 0; i < argDefs.length; i++) { - if (argDefs[i].name === state.name) { - argDef = argDefs[i]; - break; - } - } - } - inputType = argDef === null || argDef === void 0 ? void 0 : argDef.type; - break; - case _parser.RuleKinds.ENUM_VALUE: - const enumType = (0, _graphql.getNamedType)(inputType); - enumValue = enumType instanceof _graphql.GraphQLEnumType ? enumType.getValues().find(val => val.value === state.name) : null; - break; - case _parser.RuleKinds.LIST_VALUE: - const nullableType = (0, _graphql.getNullableType)(inputType); - inputType = nullableType instanceof _graphql.GraphQLList ? nullableType.ofType : null; - break; - case _parser.RuleKinds.OBJECT_VALUE: - const objectType = (0, _graphql.getNamedType)(inputType); - objectFieldDefs = objectType instanceof _graphql.GraphQLInputObjectType ? objectType.getFields() : null; - break; - case _parser.RuleKinds.OBJECT_FIELD: - const objectField = state.name && objectFieldDefs ? objectFieldDefs[state.name] : null; - inputType = objectField === null || objectField === void 0 ? void 0 : objectField.type; - break; - case _parser.RuleKinds.NAMED_TYPE: - if (state.name) { - type = schema.getType(state.name); - } - break; - } - }); - return { - argDef, - argDefs, - directiveDef, - enumValue, - fieldDef, - inputType, - objectFieldDefs, - parentType, - type, - interfaceDef, - objectTypeDef - }; -} -var GraphQLDocumentMode; -exports.GraphQLDocumentMode = GraphQLDocumentMode; -(function (GraphQLDocumentMode) { - GraphQLDocumentMode["TYPE_SYSTEM"] = "TYPE_SYSTEM"; - GraphQLDocumentMode["EXECUTABLE"] = "EXECUTABLE"; -})(GraphQLDocumentMode || (exports.GraphQLDocumentMode = GraphQLDocumentMode = {})); -function getDocumentMode(documentText, uri) { - if (uri === null || uri === void 0 ? void 0 : uri.endsWith('.graphqls')) { - return GraphQLDocumentMode.TYPE_SYSTEM; - } - return hasTypeSystemDefinitions(documentText) ? GraphQLDocumentMode.TYPE_SYSTEM : GraphQLDocumentMode.EXECUTABLE; -} -function unwrapType(state) { - if (state.prevState && state.kind && [_parser.RuleKinds.NAMED_TYPE, _parser.RuleKinds.LIST_TYPE, _parser.RuleKinds.TYPE, _parser.RuleKinds.NON_NULL_TYPE].includes(state.kind)) { - return unwrapType(state.prevState); - } - return state; -} - -/***/ }), - -/***/ "../../graphql-language-service/esm/interface/getDefinition.js": -/*!*********************************************************************!*\ - !*** ../../graphql-language-service/esm/interface/getDefinition.js ***! - \*********************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.LANGUAGE = void 0; -exports.getDefinitionQueryResultForDefinitionNode = getDefinitionQueryResultForDefinitionNode; -exports.getDefinitionQueryResultForField = getDefinitionQueryResultForField; -exports.getDefinitionQueryResultForFragmentSpread = getDefinitionQueryResultForFragmentSpread; -exports.getDefinitionQueryResultForNamedType = getDefinitionQueryResultForNamedType; -var _utils = __webpack_require__(/*! ../utils */ "../../graphql-language-service/esm/utils/index.js"); -var __awaiter = void 0 && (void 0).__awaiter || function (thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function (resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -const LANGUAGE = 'GraphQL'; -exports.LANGUAGE = LANGUAGE; -function assert(value, message) { - if (!value) { - throw new Error(message); - } -} -function getRange(text, node) { - const location = node.loc; - assert(location, 'Expected ASTNode to have a location.'); - return (0, _utils.locToRange)(text, location); -} -function getPosition(text, node) { - const location = node.loc; - assert(location, 'Expected ASTNode to have a location.'); - return (0, _utils.offsetToPosition)(text, location.start); -} -function getDefinitionQueryResultForNamedType(text, node, dependencies) { - return __awaiter(this, void 0, void 0, function* () { - const name = node.name.value; - const defNodes = dependencies.filter(_ref => { - let { - definition - } = _ref; - return definition.name && definition.name.value === name; - }); - if (defNodes.length === 0) { - throw new Error(`Definition not found for GraphQL type ${name}`); - } - const definitions = defNodes.map(_ref2 => { - let { - filePath, - content, - definition - } = _ref2; - return getDefinitionForNodeDefinition(filePath || '', content, definition); - }); - return { - definitions, - queryRange: definitions.map(_ => getRange(text, node)) - }; - }); -} -function getDefinitionQueryResultForField(fieldName, typeName, dependencies) { - var _a; - return __awaiter(this, void 0, void 0, function* () { - const defNodes = dependencies.filter(_ref3 => { - let { - definition - } = _ref3; - return definition.name && definition.name.value === typeName; - }); - if (defNodes.length === 0) { - throw new Error(`Definition not found for GraphQL type ${typeName}`); - } - const definitions = []; - for (const { - filePath, - content, - definition - } of defNodes) { - const fieldDefinition = (_a = definition.fields) === null || _a === void 0 ? void 0 : _a.find(item => item.name.value === fieldName); - if (fieldDefinition == null) { - continue; - } - definitions.push(getDefinitionForFieldDefinition(filePath || '', content, fieldDefinition)); - } - return { - definitions, - queryRange: [] - }; - }); -} -function getDefinitionQueryResultForFragmentSpread(text, fragment, dependencies) { - return __awaiter(this, void 0, void 0, function* () { - const name = fragment.name.value; - const defNodes = dependencies.filter(_ref4 => { - let { - definition - } = _ref4; - return definition.name.value === name; - }); - if (defNodes.length === 0) { - throw new Error(`Definition not found for GraphQL fragment ${name}`); - } - const definitions = defNodes.map(_ref5 => { - let { - filePath, - content, - definition - } = _ref5; - return getDefinitionForFragmentDefinition(filePath || '', content, definition); - }); - return { - definitions, - queryRange: definitions.map(_ => getRange(text, fragment)) - }; - }); -} -function getDefinitionQueryResultForDefinitionNode(path, text, definition) { - return { - definitions: [getDefinitionForFragmentDefinition(path, text, definition)], - queryRange: definition.name ? [getRange(text, definition.name)] : [] - }; -} -function getDefinitionForFragmentDefinition(path, text, definition) { - const { - name - } = definition; - if (!name) { - throw new Error('Expected ASTNode to have a Name.'); - } - return { - path, - position: getPosition(text, definition), - range: getRange(text, definition), - name: name.value || '', - language: LANGUAGE, - projectRoot: path - }; -} -function getDefinitionForNodeDefinition(path, text, definition) { - const { - name - } = definition; - assert(name, 'Expected ASTNode to have a Name.'); - return { - path, - position: getPosition(text, definition), - range: getRange(text, definition), - name: name.value || '', - language: LANGUAGE, - projectRoot: path - }; -} -function getDefinitionForFieldDefinition(path, text, definition) { - const { - name - } = definition; - assert(name, 'Expected ASTNode to have a Name.'); - return { - path, - position: getPosition(text, definition), - range: getRange(text, definition), - name: name.value || '', - language: LANGUAGE, - projectRoot: path - }; -} - -/***/ }), - -/***/ "../../graphql-language-service/esm/interface/getDiagnostics.js": -/*!**********************************************************************!*\ - !*** ../../graphql-language-service/esm/interface/getDiagnostics.js ***! - \**********************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.SEVERITY = exports.DIAGNOSTIC_SEVERITY = void 0; -exports.getDiagnostics = getDiagnostics; -exports.getRange = getRange; -exports.validateQuery = validateQuery; -var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -var _parser = __webpack_require__(/*! ../parser */ "../../graphql-language-service/esm/parser/index.js"); -var _utils = __webpack_require__(/*! ../utils */ "../../graphql-language-service/esm/utils/index.js"); -const SEVERITY = { - Error: 'Error', - Warning: 'Warning', - Information: 'Information', - Hint: 'Hint' -}; -exports.SEVERITY = SEVERITY; -const DIAGNOSTIC_SEVERITY = { - [SEVERITY.Error]: 1, - [SEVERITY.Warning]: 2, - [SEVERITY.Information]: 3, - [SEVERITY.Hint]: 4 -}; -exports.DIAGNOSTIC_SEVERITY = DIAGNOSTIC_SEVERITY; -const invariant = (condition, message) => { - if (!condition) { - throw new Error(message); - } -}; -function getDiagnostics(query) { - let schema = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; - let customRules = arguments.length > 2 ? arguments[2] : undefined; - let isRelayCompatMode = arguments.length > 3 ? arguments[3] : undefined; - let externalFragments = arguments.length > 4 ? arguments[4] : undefined; - var _a, _b; - let ast = null; - let fragments = ''; - if (externalFragments) { - fragments = typeof externalFragments === 'string' ? externalFragments : externalFragments.reduce((acc, node) => acc + (0, _graphql.print)(node) + '\n\n', ''); - } - const enhancedQuery = fragments ? `${query}\n\n${fragments}` : query; - try { - ast = (0, _graphql.parse)(enhancedQuery); - } catch (error) { - if (error instanceof _graphql.GraphQLError) { - const range = getRange((_b = (_a = error.locations) === null || _a === void 0 ? void 0 : _a[0]) !== null && _b !== void 0 ? _b : { - line: 0, - column: 0 - }, enhancedQuery); - return [{ - severity: DIAGNOSTIC_SEVERITY.Error, - message: error.message, - source: 'GraphQL: Syntax', - range - }]; - } - throw error; - } - return validateQuery(ast, schema, customRules, isRelayCompatMode); -} -function validateQuery(ast) { - let schema = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; - let customRules = arguments.length > 2 ? arguments[2] : undefined; - let isRelayCompatMode = arguments.length > 3 ? arguments[3] : undefined; - if (!schema) { - return []; - } - const validationErrorAnnotations = (0, _utils.validateWithCustomRules)(schema, ast, customRules, isRelayCompatMode).flatMap(error => annotations(error, DIAGNOSTIC_SEVERITY.Error, 'Validation')); - const deprecationWarningAnnotations = (0, _graphql.validate)(schema, ast, [_graphql.NoDeprecatedCustomRule]).flatMap(error => annotations(error, DIAGNOSTIC_SEVERITY.Warning, 'Deprecation')); - return validationErrorAnnotations.concat(deprecationWarningAnnotations); -} -function annotations(error, severity, type) { - if (!error.nodes) { - return []; - } - const highlightedNodes = []; - for (const [i, node] of error.nodes.entries()) { - const highlightNode = node.kind !== 'Variable' && 'name' in node && node.name !== undefined ? node.name : 'variable' in node && node.variable !== undefined ? node.variable : node; - if (highlightNode) { - invariant(error.locations, 'GraphQL validation error requires locations.'); - const loc = error.locations[i]; - const highlightLoc = getLocation(highlightNode); - const end = loc.column + (highlightLoc.end - highlightLoc.start); - highlightedNodes.push({ - source: `GraphQL: ${type}`, - message: error.message, - severity, - range: new _utils.Range(new _utils.Position(loc.line - 1, loc.column - 1), new _utils.Position(loc.line - 1, end)) - }); - } - } - return highlightedNodes; -} -function getRange(location, queryText) { - const parser = (0, _parser.onlineParser)(); - const state = parser.startState(); - const lines = queryText.split('\n'); - invariant(lines.length >= location.line, 'Query text must have more lines than where the error happened'); - let stream = null; - for (let i = 0; i < location.line; i++) { - stream = new _parser.CharacterStream(lines[i]); - while (!stream.eol()) { - const style = parser.token(stream, state); - if (style === 'invalidchar') { - break; - } - } - } - invariant(stream, 'Expected Parser stream to be available.'); - const line = location.line - 1; - const start = stream.getStartOfToken(); - const end = stream.getCurrentPosition(); - return new _utils.Range(new _utils.Position(line, start), new _utils.Position(line, end)); -} -function getLocation(node) { - const typeCastedNode = node; - const location = typeCastedNode.loc; - invariant(location, 'Expected ASTNode to have a location.'); - return location; -} - -/***/ }), - -/***/ "../../graphql-language-service/esm/interface/getHoverInformation.js": -/*!***************************************************************************!*\ - !*** ../../graphql-language-service/esm/interface/getHoverInformation.js ***! - \***************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.getHoverInformation = getHoverInformation; -var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -var _getAutocompleteSuggestions = __webpack_require__(/*! ./getAutocompleteSuggestions */ "../../graphql-language-service/esm/interface/getAutocompleteSuggestions.js"); -function getHoverInformation(schema, queryText, cursor, contextToken, config) { - const token = contextToken || (0, _getAutocompleteSuggestions.getTokenAtPosition)(queryText, cursor); - if (!schema || !token || !token.state) { - return ''; - } - const { - kind, - step - } = token.state; - const typeInfo = (0, _getAutocompleteSuggestions.getTypeInfo)(schema, token.state); - const options = Object.assign(Object.assign({}, config), { - schema - }); - if (kind === 'Field' && step === 0 && typeInfo.fieldDef || kind === 'AliasedField' && step === 2 && typeInfo.fieldDef) { - const into = []; - renderMdCodeStart(into, options); - renderField(into, typeInfo, options); - renderMdCodeEnd(into, options); - renderDescription(into, options, typeInfo.fieldDef); - return into.join('').trim(); - } - if (kind === 'Directive' && step === 1 && typeInfo.directiveDef) { - const into = []; - renderMdCodeStart(into, options); - renderDirective(into, typeInfo, options); - renderMdCodeEnd(into, options); - renderDescription(into, options, typeInfo.directiveDef); - return into.join('').trim(); - } - if (kind === 'Argument' && step === 0 && typeInfo.argDef) { - const into = []; - renderMdCodeStart(into, options); - renderArg(into, typeInfo, options); - renderMdCodeEnd(into, options); - renderDescription(into, options, typeInfo.argDef); - return into.join('').trim(); - } - if (kind === 'EnumValue' && typeInfo.enumValue && 'description' in typeInfo.enumValue) { - const into = []; - renderMdCodeStart(into, options); - renderEnumValue(into, typeInfo, options); - renderMdCodeEnd(into, options); - renderDescription(into, options, typeInfo.enumValue); - return into.join('').trim(); - } - if (kind === 'NamedType' && typeInfo.type && 'description' in typeInfo.type) { - const into = []; - renderMdCodeStart(into, options); - renderType(into, typeInfo, options, typeInfo.type); - renderMdCodeEnd(into, options); - renderDescription(into, options, typeInfo.type); - return into.join('').trim(); - } - return ''; -} -function renderMdCodeStart(into, options) { - if (options.useMarkdown) { - text(into, '```graphql\n'); - } -} -function renderMdCodeEnd(into, options) { - if (options.useMarkdown) { - text(into, '\n```'); - } -} -function renderField(into, typeInfo, options) { - renderQualifiedField(into, typeInfo, options); - renderTypeAnnotation(into, typeInfo, options, typeInfo.type); -} -function renderQualifiedField(into, typeInfo, options) { - if (!typeInfo.fieldDef) { - return; - } - const fieldName = typeInfo.fieldDef.name; - if (fieldName.slice(0, 2) !== '__') { - renderType(into, typeInfo, options, typeInfo.parentType); - text(into, '.'); - } - text(into, fieldName); -} -function renderDirective(into, typeInfo, _options) { - if (!typeInfo.directiveDef) { - return; - } - const name = '@' + typeInfo.directiveDef.name; - text(into, name); -} -function renderArg(into, typeInfo, options) { - if (typeInfo.directiveDef) { - renderDirective(into, typeInfo, options); - } else if (typeInfo.fieldDef) { - renderQualifiedField(into, typeInfo, options); - } - if (!typeInfo.argDef) { - return; - } - const { - name - } = typeInfo.argDef; - text(into, '('); - text(into, name); - renderTypeAnnotation(into, typeInfo, options, typeInfo.inputType); - text(into, ')'); -} -function renderTypeAnnotation(into, typeInfo, options, t) { - text(into, ': '); - renderType(into, typeInfo, options, t); -} -function renderEnumValue(into, typeInfo, options) { - if (!typeInfo.enumValue) { - return; - } - const { - name - } = typeInfo.enumValue; - renderType(into, typeInfo, options, typeInfo.inputType); - text(into, '.'); - text(into, name); -} -function renderType(into, typeInfo, options, t) { - if (!t) { - return; - } - if (t instanceof _graphql.GraphQLNonNull) { - renderType(into, typeInfo, options, t.ofType); - text(into, '!'); - } else if (t instanceof _graphql.GraphQLList) { - text(into, '['); - renderType(into, typeInfo, options, t.ofType); - text(into, ']'); - } else { - text(into, t.name); - } -} -function renderDescription(into, options, def) { - if (!def) { - return; - } - const description = typeof def.description === 'string' ? def.description : null; - if (description) { - text(into, '\n\n'); - text(into, description); - } - renderDeprecation(into, options, def); -} -function renderDeprecation(into, _options, def) { - if (!def) { - return; - } - const reason = def.deprecationReason || null; - if (!reason) { - return; - } - text(into, '\n\n'); - text(into, 'Deprecated: '); - text(into, reason); -} -function text(into, content) { - into.push(content); -} - -/***/ }), - -/***/ "../../graphql-language-service/esm/interface/getOutline.js": -/*!******************************************************************!*\ - !*** ../../graphql-language-service/esm/interface/getOutline.js ***! - \******************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.getOutline = getOutline; -var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -var _utils = __webpack_require__(/*! ../utils */ "../../graphql-language-service/esm/utils/index.js"); -const { - INLINE_FRAGMENT -} = _graphql.Kind; -const OUTLINEABLE_KINDS = { - Field: true, - OperationDefinition: true, - Document: true, - SelectionSet: true, - Name: true, - FragmentDefinition: true, - FragmentSpread: true, - InlineFragment: true, - ObjectTypeDefinition: true, - InputObjectTypeDefinition: true, - InterfaceTypeDefinition: true, - EnumTypeDefinition: true, - EnumValueDefinition: true, - InputValueDefinition: true, - FieldDefinition: true -}; -function getOutline(documentText) { - let ast; - try { - ast = (0, _graphql.parse)(documentText); - } catch (_a) { - return null; - } - const visitorFns = outlineTreeConverter(documentText); - const outlineTrees = (0, _graphql.visit)(ast, { - leave(node) { - if (visitorFns !== undefined && node.kind in visitorFns) { - return visitorFns[node.kind](node); - } - return null; - } - }); - return { - outlineTrees - }; -} -function outlineTreeConverter(docText) { - const meta = node => { - return { - representativeName: node.name, - startPosition: (0, _utils.offsetToPosition)(docText, node.loc.start), - endPosition: (0, _utils.offsetToPosition)(docText, node.loc.end), - kind: node.kind, - children: node.selectionSet || node.fields || node.values || node.arguments || [] - }; - }; - return { - Field(node) { - const tokenizedText = node.alias ? [buildToken('plain', node.alias), buildToken('plain', ': ')] : []; - tokenizedText.push(buildToken('plain', node.name)); - return Object.assign({ - tokenizedText - }, meta(node)); - }, - OperationDefinition: node => Object.assign({ - tokenizedText: [buildToken('keyword', node.operation), buildToken('whitespace', ' '), buildToken('class-name', node.name)] - }, meta(node)), - Document: node => node.definitions, - SelectionSet: node => concatMap(node.selections, child => { - return child.kind === INLINE_FRAGMENT ? child.selectionSet : child; - }), - Name: node => node.value, - FragmentDefinition: node => Object.assign({ - tokenizedText: [buildToken('keyword', 'fragment'), buildToken('whitespace', ' '), buildToken('class-name', node.name)] - }, meta(node)), - InterfaceTypeDefinition: node => Object.assign({ - tokenizedText: [buildToken('keyword', 'interface'), buildToken('whitespace', ' '), buildToken('class-name', node.name)] - }, meta(node)), - EnumTypeDefinition: node => Object.assign({ - tokenizedText: [buildToken('keyword', 'enum'), buildToken('whitespace', ' '), buildToken('class-name', node.name)] - }, meta(node)), - EnumValueDefinition: node => Object.assign({ - tokenizedText: [buildToken('plain', node.name)] - }, meta(node)), - ObjectTypeDefinition: node => Object.assign({ - tokenizedText: [buildToken('keyword', 'type'), buildToken('whitespace', ' '), buildToken('class-name', node.name)] - }, meta(node)), - InputObjectTypeDefinition: node => Object.assign({ - tokenizedText: [buildToken('keyword', 'input'), buildToken('whitespace', ' '), buildToken('class-name', node.name)] - }, meta(node)), - FragmentSpread: node => Object.assign({ - tokenizedText: [buildToken('plain', '...'), buildToken('class-name', node.name)] - }, meta(node)), - InputValueDefinition(node) { - return Object.assign({ - tokenizedText: [buildToken('plain', node.name)] - }, meta(node)); - }, - FieldDefinition(node) { - return Object.assign({ - tokenizedText: [buildToken('plain', node.name)] - }, meta(node)); - }, - InlineFragment: node => node.selectionSet - }; -} -function buildToken(kind, value) { - return { - kind, - value - }; -} -function concatMap(arr, fn) { - const res = []; - for (let i = 0; i < arr.length; i++) { - const x = fn(arr[i], i); - if (Array.isArray(x)) { - res.push(...x); - } else { - res.push(x); - } - } - return res; -} - -/***/ }), - -/***/ "../../graphql-language-service/esm/interface/index.js": -/*!*************************************************************!*\ - !*** ../../graphql-language-service/esm/interface/index.js ***! - \*************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -var _exportNames = { - getOutline: true, - getHoverInformation: true -}; -Object.defineProperty(exports, "getHoverInformation", ({ - enumerable: true, - get: function () { - return _getHoverInformation.getHoverInformation; - } -})); -Object.defineProperty(exports, "getOutline", ({ - enumerable: true, - get: function () { - return _getOutline.getOutline; - } -})); -var _autocompleteUtils = __webpack_require__(/*! ./autocompleteUtils */ "../../graphql-language-service/esm/interface/autocompleteUtils.js"); -Object.keys(_autocompleteUtils).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; - if (key in exports && exports[key] === _autocompleteUtils[key]) return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _autocompleteUtils[key]; - } - }); -}); -var _getAutocompleteSuggestions = __webpack_require__(/*! ./getAutocompleteSuggestions */ "../../graphql-language-service/esm/interface/getAutocompleteSuggestions.js"); -Object.keys(_getAutocompleteSuggestions).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; - if (key in exports && exports[key] === _getAutocompleteSuggestions[key]) return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _getAutocompleteSuggestions[key]; - } - }); -}); -var _getDefinition = __webpack_require__(/*! ./getDefinition */ "../../graphql-language-service/esm/interface/getDefinition.js"); -Object.keys(_getDefinition).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; - if (key in exports && exports[key] === _getDefinition[key]) return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _getDefinition[key]; - } - }); -}); -var _getDiagnostics = __webpack_require__(/*! ./getDiagnostics */ "../../graphql-language-service/esm/interface/getDiagnostics.js"); -Object.keys(_getDiagnostics).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; - if (key in exports && exports[key] === _getDiagnostics[key]) return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _getDiagnostics[key]; - } - }); -}); -var _getOutline = __webpack_require__(/*! ./getOutline */ "../../graphql-language-service/esm/interface/getOutline.js"); -var _getHoverInformation = __webpack_require__(/*! ./getHoverInformation */ "../../graphql-language-service/esm/interface/getHoverInformation.js"); - -/***/ }), - -/***/ "../../graphql-language-service/esm/parser/CharacterStream.js": -/*!********************************************************************!*\ - !*** ../../graphql-language-service/esm/parser/CharacterStream.js ***! - \********************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = void 0; -class CharacterStream { - constructor(sourceText) { - var _this = this; - this._start = 0; - this._pos = 0; - this.getStartOfToken = () => this._start; - this.getCurrentPosition = () => this._pos; - this.eol = () => this._sourceText.length === this._pos; - this.sol = () => this._pos === 0; - this.peek = () => { - return this._sourceText.charAt(this._pos) || null; - }; - this.next = () => { - const char = this._sourceText.charAt(this._pos); - this._pos++; - return char; - }; - this.eat = pattern => { - const isMatched = this._testNextCharacter(pattern); - if (isMatched) { - this._start = this._pos; - this._pos++; - return this._sourceText.charAt(this._pos - 1); - } - return undefined; - }; - this.eatWhile = match => { - let isMatched = this._testNextCharacter(match); - let didEat = false; - if (isMatched) { - didEat = isMatched; - this._start = this._pos; - } - while (isMatched) { - this._pos++; - isMatched = this._testNextCharacter(match); - didEat = true; - } - return didEat; - }; - this.eatSpace = () => this.eatWhile(/[\s\u00a0]/); - this.skipToEnd = () => { - this._pos = this._sourceText.length; - }; - this.skipTo = position => { - this._pos = position; - }; - this.match = function (pattern) { - let consume = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; - let caseFold = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let token = null; - let match = null; - if (typeof pattern === 'string') { - const regex = new RegExp(pattern, caseFold ? 'i' : 'g'); - match = regex.test(_this._sourceText.slice(_this._pos, _this._pos + pattern.length)); - token = pattern; - } else if (pattern instanceof RegExp) { - match = _this._sourceText.slice(_this._pos).match(pattern); - token = match === null || match === void 0 ? void 0 : match[0]; - } - if (match != null && (typeof pattern === 'string' || match instanceof Array && _this._sourceText.startsWith(match[0], _this._pos))) { - if (consume) { - _this._start = _this._pos; - if (token && token.length) { - _this._pos += token.length; - } - } - return match; - } - return false; - }; - this.backUp = num => { - this._pos -= num; - }; - this.column = () => this._pos; - this.indentation = () => { - const match = this._sourceText.match(/\s*/); - let indent = 0; - if (match && match.length !== 0) { - const whiteSpaces = match[0]; - let pos = 0; - while (whiteSpaces.length > pos) { - if (whiteSpaces.charCodeAt(pos) === 9) { - indent += 2; - } else { - indent++; - } - pos++; - } - } - return indent; - }; - this.current = () => this._sourceText.slice(this._start, this._pos); - this._sourceText = sourceText; - } - _testNextCharacter(pattern) { - const character = this._sourceText.charAt(this._pos); - let isMatched = false; - if (typeof pattern === 'string') { - isMatched = character === pattern; - } else { - isMatched = pattern instanceof RegExp ? pattern.test(character) : pattern(character); - } - return isMatched; - } -} -exports["default"] = CharacterStream; - -/***/ }), - -/***/ "../../graphql-language-service/esm/parser/RuleHelpers.js": -/*!****************************************************************!*\ - !*** ../../graphql-language-service/esm/parser/RuleHelpers.js ***! - \****************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.butNot = butNot; -exports.list = list; -exports.opt = opt; -exports.p = p; -exports.t = t; -function opt(ofRule) { - return { - ofRule - }; -} -function list(ofRule, separator) { - return { - ofRule, - isList: true, - separator - }; -} -function butNot(rule, exclusions) { - const ruleMatch = rule.match; - rule.match = token => { - let check = false; - if (ruleMatch) { - check = ruleMatch(token); - } - return check && exclusions.every(exclusion => exclusion.match && !exclusion.match(token)); - }; - return rule; -} -function t(kind, style) { - return { - style, - match: token => token.kind === kind - }; -} -function p(value, style) { - return { - style: style || 'punctuation', - match: token => token.kind === 'Punctuation' && token.value === value - }; -} - -/***/ }), - -/***/ "../../graphql-language-service/esm/parser/Rules.js": -/*!**********************************************************!*\ - !*** ../../graphql-language-service/esm/parser/Rules.js ***! - \**********************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.isIgnored = exports.ParseRules = exports.LexRules = void 0; -var _RuleHelpers = __webpack_require__(/*! ./RuleHelpers */ "../../graphql-language-service/esm/parser/RuleHelpers.js"); -var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -const isIgnored = ch => ch === ' ' || ch === '\t' || ch === ',' || ch === '\n' || ch === '\r' || ch === '\uFEFF' || ch === '\u00A0'; -exports.isIgnored = isIgnored; -const LexRules = { - Name: /^[_A-Za-z][_0-9A-Za-z]*/, - Punctuation: /^(?:!|\$|\(|\)|\.\.\.|:|=|&|@|\[|]|\{|\||\})/, - Number: /^-?(?:0|(?:[1-9][0-9]*))(?:\.[0-9]*)?(?:[eE][+-]?[0-9]+)?/, - String: /^(?:"""(?:\\"""|[^"]|"[^"]|""[^"])*(?:""")?|"(?:[^"\\]|\\(?:"|\/|\\|b|f|n|r|t|u[0-9a-fA-F]{4}))*"?)/, - Comment: /^#.*/ -}; -exports.LexRules = LexRules; -const ParseRules = { - Document: [(0, _RuleHelpers.list)('Definition')], - Definition(token) { - switch (token.value) { - case '{': - return 'ShortQuery'; - case 'query': - return 'Query'; - case 'mutation': - return 'Mutation'; - case 'subscription': - return 'Subscription'; - case 'fragment': - return _graphql.Kind.FRAGMENT_DEFINITION; - case 'schema': - return 'SchemaDef'; - case 'scalar': - return 'ScalarDef'; - case 'type': - return 'ObjectTypeDef'; - case 'interface': - return 'InterfaceDef'; - case 'union': - return 'UnionDef'; - case 'enum': - return 'EnumDef'; - case 'input': - return 'InputDef'; - case 'extend': - return 'ExtendDef'; - case 'directive': - return 'DirectiveDef'; - } - }, - ShortQuery: ['SelectionSet'], - Query: [word('query'), (0, _RuleHelpers.opt)(name('def')), (0, _RuleHelpers.opt)('VariableDefinitions'), (0, _RuleHelpers.list)('Directive'), 'SelectionSet'], - Mutation: [word('mutation'), (0, _RuleHelpers.opt)(name('def')), (0, _RuleHelpers.opt)('VariableDefinitions'), (0, _RuleHelpers.list)('Directive'), 'SelectionSet'], - Subscription: [word('subscription'), (0, _RuleHelpers.opt)(name('def')), (0, _RuleHelpers.opt)('VariableDefinitions'), (0, _RuleHelpers.list)('Directive'), 'SelectionSet'], - VariableDefinitions: [(0, _RuleHelpers.p)('('), (0, _RuleHelpers.list)('VariableDefinition'), (0, _RuleHelpers.p)(')')], - VariableDefinition: ['Variable', (0, _RuleHelpers.p)(':'), 'Type', (0, _RuleHelpers.opt)('DefaultValue')], - Variable: [(0, _RuleHelpers.p)('$', 'variable'), name('variable')], - DefaultValue: [(0, _RuleHelpers.p)('='), 'Value'], - SelectionSet: [(0, _RuleHelpers.p)('{'), (0, _RuleHelpers.list)('Selection'), (0, _RuleHelpers.p)('}')], - Selection(token, stream) { - return token.value === '...' ? stream.match(/[\s\u00a0,]*(on\b|@|{)/, false) ? 'InlineFragment' : 'FragmentSpread' : stream.match(/[\s\u00a0,]*:/, false) ? 'AliasedField' : 'Field'; - }, - AliasedField: [name('property'), (0, _RuleHelpers.p)(':'), name('qualifier'), (0, _RuleHelpers.opt)('Arguments'), (0, _RuleHelpers.list)('Directive'), (0, _RuleHelpers.opt)('SelectionSet')], - Field: [name('property'), (0, _RuleHelpers.opt)('Arguments'), (0, _RuleHelpers.list)('Directive'), (0, _RuleHelpers.opt)('SelectionSet')], - Arguments: [(0, _RuleHelpers.p)('('), (0, _RuleHelpers.list)('Argument'), (0, _RuleHelpers.p)(')')], - Argument: [name('attribute'), (0, _RuleHelpers.p)(':'), 'Value'], - FragmentSpread: [(0, _RuleHelpers.p)('...'), name('def'), (0, _RuleHelpers.list)('Directive')], - InlineFragment: [(0, _RuleHelpers.p)('...'), (0, _RuleHelpers.opt)('TypeCondition'), (0, _RuleHelpers.list)('Directive'), 'SelectionSet'], - FragmentDefinition: [word('fragment'), (0, _RuleHelpers.opt)((0, _RuleHelpers.butNot)(name('def'), [word('on')])), 'TypeCondition', (0, _RuleHelpers.list)('Directive'), 'SelectionSet'], - TypeCondition: [word('on'), 'NamedType'], - Value(token) { - switch (token.kind) { - case 'Number': - return 'NumberValue'; - case 'String': - return 'StringValue'; - case 'Punctuation': - switch (token.value) { - case '[': - return 'ListValue'; - case '{': - return 'ObjectValue'; - case '$': - return 'Variable'; - case '&': - return 'NamedType'; - } - return null; - case 'Name': - switch (token.value) { - case 'true': - case 'false': - return 'BooleanValue'; - } - if (token.value === 'null') { - return 'NullValue'; - } - return 'EnumValue'; - } - }, - NumberValue: [(0, _RuleHelpers.t)('Number', 'number')], - StringValue: [{ - style: 'string', - match: token => token.kind === 'String', - update(state, token) { - if (token.value.startsWith('"""')) { - state.inBlockstring = !token.value.slice(3).endsWith('"""'); - } - } - }], - BooleanValue: [(0, _RuleHelpers.t)('Name', 'builtin')], - NullValue: [(0, _RuleHelpers.t)('Name', 'keyword')], - EnumValue: [name('string-2')], - ListValue: [(0, _RuleHelpers.p)('['), (0, _RuleHelpers.list)('Value'), (0, _RuleHelpers.p)(']')], - ObjectValue: [(0, _RuleHelpers.p)('{'), (0, _RuleHelpers.list)('ObjectField'), (0, _RuleHelpers.p)('}')], - ObjectField: [name('attribute'), (0, _RuleHelpers.p)(':'), 'Value'], - Type(token) { - return token.value === '[' ? 'ListType' : 'NonNullType'; - }, - ListType: [(0, _RuleHelpers.p)('['), 'Type', (0, _RuleHelpers.p)(']'), (0, _RuleHelpers.opt)((0, _RuleHelpers.p)('!'))], - NonNullType: ['NamedType', (0, _RuleHelpers.opt)((0, _RuleHelpers.p)('!'))], - NamedType: [type('atom')], - Directive: [(0, _RuleHelpers.p)('@', 'meta'), name('meta'), (0, _RuleHelpers.opt)('Arguments')], - DirectiveDef: [word('directive'), (0, _RuleHelpers.p)('@', 'meta'), name('meta'), (0, _RuleHelpers.opt)('ArgumentsDef'), word('on'), (0, _RuleHelpers.list)('DirectiveLocation', (0, _RuleHelpers.p)('|'))], - InterfaceDef: [word('interface'), name('atom'), (0, _RuleHelpers.opt)('Implements'), (0, _RuleHelpers.list)('Directive'), (0, _RuleHelpers.p)('{'), (0, _RuleHelpers.list)('FieldDef'), (0, _RuleHelpers.p)('}')], - Implements: [word('implements'), (0, _RuleHelpers.list)('NamedType', (0, _RuleHelpers.p)('&'))], - DirectiveLocation: [name('string-2')], - SchemaDef: [word('schema'), (0, _RuleHelpers.list)('Directive'), (0, _RuleHelpers.p)('{'), (0, _RuleHelpers.list)('OperationTypeDef'), (0, _RuleHelpers.p)('}')], - OperationTypeDef: [name('keyword'), (0, _RuleHelpers.p)(':'), name('atom')], - ScalarDef: [word('scalar'), name('atom'), (0, _RuleHelpers.list)('Directive')], - ObjectTypeDef: [word('type'), name('atom'), (0, _RuleHelpers.opt)('Implements'), (0, _RuleHelpers.list)('Directive'), (0, _RuleHelpers.p)('{'), (0, _RuleHelpers.list)('FieldDef'), (0, _RuleHelpers.p)('}')], - FieldDef: [name('property'), (0, _RuleHelpers.opt)('ArgumentsDef'), (0, _RuleHelpers.p)(':'), 'Type', (0, _RuleHelpers.list)('Directive')], - ArgumentsDef: [(0, _RuleHelpers.p)('('), (0, _RuleHelpers.list)('InputValueDef'), (0, _RuleHelpers.p)(')')], - InputValueDef: [name('attribute'), (0, _RuleHelpers.p)(':'), 'Type', (0, _RuleHelpers.opt)('DefaultValue'), (0, _RuleHelpers.list)('Directive')], - UnionDef: [word('union'), name('atom'), (0, _RuleHelpers.list)('Directive'), (0, _RuleHelpers.p)('='), (0, _RuleHelpers.list)('UnionMember', (0, _RuleHelpers.p)('|'))], - UnionMember: ['NamedType'], - EnumDef: [word('enum'), name('atom'), (0, _RuleHelpers.list)('Directive'), (0, _RuleHelpers.p)('{'), (0, _RuleHelpers.list)('EnumValueDef'), (0, _RuleHelpers.p)('}')], - EnumValueDef: [name('string-2'), (0, _RuleHelpers.list)('Directive')], - InputDef: [word('input'), name('atom'), (0, _RuleHelpers.list)('Directive'), (0, _RuleHelpers.p)('{'), (0, _RuleHelpers.list)('InputValueDef'), (0, _RuleHelpers.p)('}')], - ExtendDef: [word('extend'), 'ExtensionDefinition'], - ExtensionDefinition(token) { - switch (token.value) { - case 'schema': - return _graphql.Kind.SCHEMA_EXTENSION; - case 'scalar': - return _graphql.Kind.SCALAR_TYPE_EXTENSION; - case 'type': - return _graphql.Kind.OBJECT_TYPE_EXTENSION; - case 'interface': - return _graphql.Kind.INTERFACE_TYPE_EXTENSION; - case 'union': - return _graphql.Kind.UNION_TYPE_EXTENSION; - case 'enum': - return _graphql.Kind.ENUM_TYPE_EXTENSION; - case 'input': - return _graphql.Kind.INPUT_OBJECT_TYPE_EXTENSION; - } - }, - [_graphql.Kind.SCHEMA_EXTENSION]: ['SchemaDef'], - [_graphql.Kind.SCALAR_TYPE_EXTENSION]: ['ScalarDef'], - [_graphql.Kind.OBJECT_TYPE_EXTENSION]: ['ObjectTypeDef'], - [_graphql.Kind.INTERFACE_TYPE_EXTENSION]: ['InterfaceDef'], - [_graphql.Kind.UNION_TYPE_EXTENSION]: ['UnionDef'], - [_graphql.Kind.ENUM_TYPE_EXTENSION]: ['EnumDef'], - [_graphql.Kind.INPUT_OBJECT_TYPE_EXTENSION]: ['InputDef'] -}; -exports.ParseRules = ParseRules; -function word(value) { - return { - style: 'keyword', - match: token => token.kind === 'Name' && token.value === value - }; -} -function name(style) { - return { - style, - match: token => token.kind === 'Name', - update(state, token) { - state.name = token.value; - } - }; -} -function type(style) { - return { - style, - match: token => token.kind === 'Name', - update(state, token) { - var _a; - if ((_a = state.prevState) === null || _a === void 0 ? void 0 : _a.prevState) { - state.name = token.value; - state.prevState.prevState.type = token.value; - } - } - }; -} - -/***/ }), - -/***/ "../../graphql-language-service/esm/parser/index.js": -/*!**********************************************************!*\ - !*** ../../graphql-language-service/esm/parser/index.js ***! - \**********************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -var _exportNames = { - CharacterStream: true, - LexRules: true, - ParseRules: true, - isIgnored: true, - butNot: true, - list: true, - opt: true, - p: true, - t: true, - onlineParser: true -}; -Object.defineProperty(exports, "CharacterStream", ({ - enumerable: true, - get: function () { - return _CharacterStream.default; - } -})); -Object.defineProperty(exports, "LexRules", ({ - enumerable: true, - get: function () { - return _Rules.LexRules; - } -})); -Object.defineProperty(exports, "ParseRules", ({ - enumerable: true, - get: function () { - return _Rules.ParseRules; - } -})); -Object.defineProperty(exports, "butNot", ({ - enumerable: true, - get: function () { - return _RuleHelpers.butNot; - } -})); -Object.defineProperty(exports, "isIgnored", ({ - enumerable: true, - get: function () { - return _Rules.isIgnored; - } -})); -Object.defineProperty(exports, "list", ({ - enumerable: true, - get: function () { - return _RuleHelpers.list; - } -})); -Object.defineProperty(exports, "onlineParser", ({ - enumerable: true, - get: function () { - return _onlineParser.default; - } -})); -Object.defineProperty(exports, "opt", ({ - enumerable: true, - get: function () { - return _RuleHelpers.opt; - } -})); -Object.defineProperty(exports, "p", ({ - enumerable: true, - get: function () { - return _RuleHelpers.p; - } -})); -Object.defineProperty(exports, "t", ({ - enumerable: true, - get: function () { - return _RuleHelpers.t; - } -})); -var _CharacterStream = _interopRequireDefault(__webpack_require__(/*! ./CharacterStream */ "../../graphql-language-service/esm/parser/CharacterStream.js")); -var _Rules = __webpack_require__(/*! ./Rules */ "../../graphql-language-service/esm/parser/Rules.js"); -var _RuleHelpers = __webpack_require__(/*! ./RuleHelpers */ "../../graphql-language-service/esm/parser/RuleHelpers.js"); -var _onlineParser = _interopRequireDefault(__webpack_require__(/*! ./onlineParser */ "../../graphql-language-service/esm/parser/onlineParser.js")); -var _types = __webpack_require__(/*! ./types */ "../../graphql-language-service/esm/parser/types.js"); -Object.keys(_types).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; - if (key in exports && exports[key] === _types[key]) return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _types[key]; - } - }); -}); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/***/ }), - -/***/ "../../graphql-language-service/esm/parser/onlineParser.js": -/*!*****************************************************************!*\ - !*** ../../graphql-language-service/esm/parser/onlineParser.js ***! - \*****************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = onlineParser; -var _Rules = __webpack_require__(/*! ./Rules */ "../../graphql-language-service/esm/parser/Rules.js"); -var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -function onlineParser() { - let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { - eatWhitespace: stream => stream.eatWhile(_Rules.isIgnored), - lexRules: _Rules.LexRules, - parseRules: _Rules.ParseRules, - editorConfig: {} - }; - return { - startState() { - const initialState = { - level: 0, - step: 0, - name: null, - kind: null, - type: null, - rule: null, - needsSeparator: false, - prevState: null - }; - pushRule(options.parseRules, initialState, _graphql.Kind.DOCUMENT); - return initialState; - }, - token(stream, state) { - return getToken(stream, state, options); - } - }; -} -function getToken(stream, state, options) { - var _a; - if (state.inBlockstring) { - if (stream.match(/.*"""/)) { - state.inBlockstring = false; - return 'string'; - } - stream.skipToEnd(); - return 'string'; - } - const { - lexRules, - parseRules, - eatWhitespace, - editorConfig - } = options; - if (state.rule && state.rule.length === 0) { - popRule(state); - } else if (state.needsAdvance) { - state.needsAdvance = false; - advanceRule(state, true); - } - if (stream.sol()) { - const tabSize = (editorConfig === null || editorConfig === void 0 ? void 0 : editorConfig.tabSize) || 2; - state.indentLevel = Math.floor(stream.indentation() / tabSize); - } - if (eatWhitespace(stream)) { - return 'ws'; - } - const token = lex(lexRules, stream); - if (!token) { - const matchedSomething = stream.match(/\S+/); - if (!matchedSomething) { - stream.match(/\s/); - } - pushRule(SpecialParseRules, state, 'Invalid'); - return 'invalidchar'; - } - if (token.kind === 'Comment') { - pushRule(SpecialParseRules, state, 'Comment'); - return 'comment'; - } - const backupState = assign({}, state); - if (token.kind === 'Punctuation') { - if (/^[{([]/.test(token.value)) { - if (state.indentLevel !== undefined) { - state.levels = (state.levels || []).concat(state.indentLevel + 1); - } - } else if (/^[})\]]/.test(token.value)) { - const levels = state.levels = (state.levels || []).slice(0, -1); - if (state.indentLevel && levels.length > 0 && levels.at(-1) < state.indentLevel) { - state.indentLevel = levels.at(-1); - } - } - } - while (state.rule) { - let expected = typeof state.rule === 'function' ? state.step === 0 ? state.rule(token, stream) : null : state.rule[state.step]; - if (state.needsSeparator) { - expected = expected === null || expected === void 0 ? void 0 : expected.separator; - } - if (expected) { - if (expected.ofRule) { - expected = expected.ofRule; - } - if (typeof expected === 'string') { - pushRule(parseRules, state, expected); - continue; - } - if ((_a = expected.match) === null || _a === void 0 ? void 0 : _a.call(expected, token)) { - if (expected.update) { - expected.update(state, token); - } - if (token.kind === 'Punctuation') { - advanceRule(state, true); - } else { - state.needsAdvance = true; - } - return expected.style; - } - } - unsuccessful(state); - } - assign(state, backupState); - pushRule(SpecialParseRules, state, 'Invalid'); - return 'invalidchar'; -} -function assign(to, from) { - const keys = Object.keys(from); - for (let i = 0; i < keys.length; i++) { - to[keys[i]] = from[keys[i]]; - } - return to; -} -const SpecialParseRules = { - Invalid: [], - Comment: [] -}; -function pushRule(rules, state, ruleKind) { - if (!rules[ruleKind]) { - throw new TypeError('Unknown rule: ' + ruleKind); - } - state.prevState = Object.assign({}, state); - state.kind = ruleKind; - state.name = null; - state.type = null; - state.rule = rules[ruleKind]; - state.step = 0; - state.needsSeparator = false; -} -function popRule(state) { - if (!state.prevState) { - return; - } - state.kind = state.prevState.kind; - state.name = state.prevState.name; - state.type = state.prevState.type; - state.rule = state.prevState.rule; - state.step = state.prevState.step; - state.needsSeparator = state.prevState.needsSeparator; - state.prevState = state.prevState.prevState; -} -function advanceRule(state, successful) { - var _a; - if (isList(state) && state.rule) { - const step = state.rule[state.step]; - if (step.separator) { - const { - separator - } = step; - state.needsSeparator = !state.needsSeparator; - if (!state.needsSeparator && separator.ofRule) { - return; - } - } - if (successful) { - return; - } - } - state.needsSeparator = false; - state.step++; - while (state.rule && !(Array.isArray(state.rule) && state.step < state.rule.length)) { - popRule(state); - if (state.rule) { - if (isList(state)) { - if ((_a = state.rule) === null || _a === void 0 ? void 0 : _a[state.step].separator) { - state.needsSeparator = !state.needsSeparator; - } - } else { - state.needsSeparator = false; - state.step++; - } - } - } -} -function isList(state) { - const step = Array.isArray(state.rule) && typeof state.rule[state.step] !== 'string' && state.rule[state.step]; - return step && step.isList; -} -function unsuccessful(state) { - while (state.rule && !(Array.isArray(state.rule) && state.rule[state.step].ofRule)) { - popRule(state); - } - if (state.rule) { - advanceRule(state, false); - } -} -function lex(lexRules, stream) { - const kinds = Object.keys(lexRules); - for (let i = 0; i < kinds.length; i++) { - const match = stream.match(lexRules[kinds[i]]); - if (match && match instanceof Array) { - return { - kind: kinds[i], - value: match[0] - }; - } - } -} - -/***/ }), - -/***/ "../../graphql-language-service/esm/parser/types.js": -/*!**********************************************************!*\ - !*** ../../graphql-language-service/esm/parser/types.js ***! - \**********************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.RuleKinds = exports.AdditionalRuleKinds = void 0; -var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -const AdditionalRuleKinds = { - ALIASED_FIELD: 'AliasedField', - ARGUMENTS: 'Arguments', - SHORT_QUERY: 'ShortQuery', - QUERY: 'Query', - MUTATION: 'Mutation', - SUBSCRIPTION: 'Subscription', - TYPE_CONDITION: 'TypeCondition', - INVALID: 'Invalid', - COMMENT: 'Comment', - SCHEMA_DEF: 'SchemaDef', - SCALAR_DEF: 'ScalarDef', - OBJECT_TYPE_DEF: 'ObjectTypeDef', - OBJECT_VALUE: 'ObjectValue', - LIST_VALUE: 'ListValue', - INTERFACE_DEF: 'InterfaceDef', - UNION_DEF: 'UnionDef', - ENUM_DEF: 'EnumDef', - ENUM_VALUE: 'EnumValue', - FIELD_DEF: 'FieldDef', - INPUT_DEF: 'InputDef', - INPUT_VALUE_DEF: 'InputValueDef', - ARGUMENTS_DEF: 'ArgumentsDef', - EXTEND_DEF: 'ExtendDef', - EXTENSION_DEFINITION: 'ExtensionDefinition', - DIRECTIVE_DEF: 'DirectiveDef', - IMPLEMENTS: 'Implements', - VARIABLE_DEFINITIONS: 'VariableDefinitions', - TYPE: 'Type' -}; -exports.AdditionalRuleKinds = AdditionalRuleKinds; -const RuleKinds = Object.assign(Object.assign({}, _graphql.Kind), AdditionalRuleKinds); -exports.RuleKinds = RuleKinds; - -/***/ }), - -/***/ "../../graphql-language-service/esm/types.js": -/*!***************************************************!*\ - !*** ../../graphql-language-service/esm/types.js ***! - \***************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.FileChangeTypeKind = exports.CompletionItemKind = void 0; -Object.defineProperty(exports, "InsertTextFormat", ({ - enumerable: true, - get: function () { - return _vscodeLanguageserverTypes.InsertTextFormat; - } -})); -var _vscodeLanguageserverTypes = __webpack_require__(/*! vscode-languageserver-types */ "../../../node_modules/vscode-languageserver-types/lib/esm/main.js"); -const FileChangeTypeKind = { - Created: 1, - Changed: 2, - Deleted: 3 -}; -exports.FileChangeTypeKind = FileChangeTypeKind; -var CompletionItemKind; -exports.CompletionItemKind = CompletionItemKind; -(function (CompletionItemKind) { - CompletionItemKind.Text = 1; - CompletionItemKind.Method = 2; - CompletionItemKind.Function = 3; - CompletionItemKind.Constructor = 4; - CompletionItemKind.Field = 5; - CompletionItemKind.Variable = 6; - CompletionItemKind.Class = 7; - CompletionItemKind.Interface = 8; - CompletionItemKind.Module = 9; - CompletionItemKind.Property = 10; - CompletionItemKind.Unit = 11; - CompletionItemKind.Value = 12; - CompletionItemKind.Enum = 13; - CompletionItemKind.Keyword = 14; - CompletionItemKind.Snippet = 15; - CompletionItemKind.Color = 16; - CompletionItemKind.File = 17; - CompletionItemKind.Reference = 18; - CompletionItemKind.Folder = 19; - CompletionItemKind.EnumMember = 20; - CompletionItemKind.Constant = 21; - CompletionItemKind.Struct = 22; - CompletionItemKind.Event = 23; - CompletionItemKind.Operator = 24; - CompletionItemKind.TypeParameter = 25; -})(CompletionItemKind || (exports.CompletionItemKind = CompletionItemKind = {})); - -/***/ }), - -/***/ "../../graphql-language-service/esm/utils/Range.js": -/*!*********************************************************!*\ - !*** ../../graphql-language-service/esm/utils/Range.js ***! - \*********************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.Range = exports.Position = void 0; -exports.locToRange = locToRange; -exports.offsetToPosition = offsetToPosition; -class Range { - constructor(start, end) { - this.containsPosition = position => { - if (this.start.line === position.line) { - return this.start.character <= position.character; - } - if (this.end.line === position.line) { - return this.end.character >= position.character; - } - return this.start.line <= position.line && this.end.line >= position.line; - }; - this.start = start; - this.end = end; - } - setStart(line, character) { - this.start = new Position(line, character); - } - setEnd(line, character) { - this.end = new Position(line, character); - } -} -exports.Range = Range; -class Position { - constructor(line, character) { - this.lessThanOrEqualTo = position => this.line < position.line || this.line === position.line && this.character <= position.character; - this.line = line; - this.character = character; - } - setLine(line) { - this.line = line; - } - setCharacter(character) { - this.character = character; - } -} -exports.Position = Position; -function offsetToPosition(text, loc) { - const EOL = '\n'; - const buf = text.slice(0, loc); - const lines = buf.split(EOL).length - 1; - const lastLineIndex = buf.lastIndexOf(EOL); - return new Position(lines, loc - lastLineIndex - 1); -} -function locToRange(text, loc) { - const start = offsetToPosition(text, loc.start); - const end = offsetToPosition(text, loc.end); - return new Range(start, end); -} - -/***/ }), - -/***/ "../../graphql-language-service/esm/utils/collectVariables.js": -/*!********************************************************************!*\ - !*** ../../graphql-language-service/esm/utils/collectVariables.js ***! - \********************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.collectVariables = collectVariables; -var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -function collectVariables(schema, documentAST) { - const variableToType = Object.create(null); - for (const definition of documentAST.definitions) { - if (definition.kind === 'OperationDefinition') { - const { - variableDefinitions - } = definition; - if (variableDefinitions) { - for (const { - variable, - type - } of variableDefinitions) { - const inputType = (0, _graphql.typeFromAST)(schema, type); - if (inputType) { - variableToType[variable.name.value] = inputType; - } else if (type.kind === _graphql.Kind.NAMED_TYPE && type.name.value === 'Float') { - variableToType[variable.name.value] = _graphql.GraphQLFloat; - } - } - } - } - } - return variableToType; -} - -/***/ }), - -/***/ "../../graphql-language-service/esm/utils/fragmentDependencies.js": -/*!************************************************************************!*\ - !*** ../../graphql-language-service/esm/utils/fragmentDependencies.js ***! - \************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.getFragmentDependenciesForAST = exports.getFragmentDependencies = void 0; -var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -var _nullthrows = _interopRequireDefault(__webpack_require__(/*! nullthrows */ "../../../node_modules/nullthrows/nullthrows.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -const getFragmentDependencies = (operationString, fragmentDefinitions) => { - if (!fragmentDefinitions) { - return []; - } - let parsedOperation; - try { - parsedOperation = (0, _graphql.parse)(operationString); - } catch (_a) { - return []; - } - return getFragmentDependenciesForAST(parsedOperation, fragmentDefinitions); -}; -exports.getFragmentDependencies = getFragmentDependencies; -const getFragmentDependenciesForAST = (parsedOperation, fragmentDefinitions) => { - if (!fragmentDefinitions) { - return []; - } - const existingFrags = new Map(); - const referencedFragNames = new Set(); - (0, _graphql.visit)(parsedOperation, { - FragmentDefinition(node) { - existingFrags.set(node.name.value, true); - }, - FragmentSpread(node) { - if (!referencedFragNames.has(node.name.value)) { - referencedFragNames.add(node.name.value); - } - } - }); - const asts = new Set(); - for (const name of referencedFragNames) { - if (!existingFrags.has(name) && fragmentDefinitions.has(name)) { - asts.add((0, _nullthrows.default)(fragmentDefinitions.get(name))); - } - } - const referencedFragments = []; - for (const ast of asts) { - (0, _graphql.visit)(ast, { - FragmentSpread(node) { - if (!referencedFragNames.has(node.name.value) && fragmentDefinitions.get(node.name.value)) { - asts.add((0, _nullthrows.default)(fragmentDefinitions.get(node.name.value))); - referencedFragNames.add(node.name.value); - } - } - }); - if (!existingFrags.has(ast.name.value)) { - referencedFragments.push(ast); - } - } - return referencedFragments; -}; -exports.getFragmentDependenciesForAST = getFragmentDependenciesForAST; - -/***/ }), - -/***/ "../../graphql-language-service/esm/utils/getASTNodeAtPosition.js": -/*!************************************************************************!*\ - !*** ../../graphql-language-service/esm/utils/getASTNodeAtPosition.js ***! - \************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.getASTNodeAtPosition = getASTNodeAtPosition; -exports.pointToOffset = pointToOffset; -var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -function getASTNodeAtPosition(query, ast, point) { - const offset = pointToOffset(query, point); - let nodeContainingPosition; - (0, _graphql.visit)(ast, { - enter(node) { - if (node.kind !== 'Name' && node.loc && node.loc.start <= offset && offset <= node.loc.end) { - nodeContainingPosition = node; - } else { - return false; - } - }, - leave(node) { - if (node.loc && node.loc.start <= offset && offset <= node.loc.end) { - return false; - } - } - }); - return nodeContainingPosition; -} -function pointToOffset(text, point) { - const linesUntilPosition = text.split('\n').slice(0, point.line); - return point.character + linesUntilPosition.map(line => line.length + 1).reduce((a, b) => a + b, 0); -} - -/***/ }), - -/***/ "../../graphql-language-service/esm/utils/getOperationFacts.js": -/*!*********************************************************************!*\ - !*** ../../graphql-language-service/esm/utils/getOperationFacts.js ***! - \*********************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = getOperationFacts; -exports.getOperationASTFacts = getOperationASTFacts; -exports.getQueryFacts = void 0; -var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -var _collectVariables = __webpack_require__(/*! ./collectVariables */ "../../graphql-language-service/esm/utils/collectVariables.js"); -function getOperationASTFacts(documentAST, schema) { - const variableToType = schema ? (0, _collectVariables.collectVariables)(schema, documentAST) : undefined; - const operations = []; - (0, _graphql.visit)(documentAST, { - OperationDefinition(node) { - operations.push(node); - } - }); - return { - variableToType, - operations - }; -} -function getOperationFacts(schema, documentString) { - if (!documentString) { - return; - } - try { - const documentAST = (0, _graphql.parse)(documentString); - return Object.assign(Object.assign({}, getOperationASTFacts(documentAST, schema)), { - documentAST - }); - } catch (_a) { - return; - } -} -const getQueryFacts = getOperationFacts; -exports.getQueryFacts = getQueryFacts; - -/***/ }), - -/***/ "../../graphql-language-service/esm/utils/getVariablesJSONSchema.js": -/*!**************************************************************************!*\ - !*** ../../graphql-language-service/esm/utils/getVariablesJSONSchema.js ***! - \**************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.defaultJSONSchemaOptions = void 0; -exports.getVariablesJSONSchema = getVariablesJSONSchema; -var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -const defaultJSONSchemaOptions = { - useMarkdownDescription: false -}; -exports.defaultJSONSchemaOptions = defaultJSONSchemaOptions; -function text(into, newText) { - into.push(newText); -} -function renderType(into, t) { - if ((0, _graphql.isNonNullType)(t)) { - renderType(into, t.ofType); - text(into, '!'); - } else if ((0, _graphql.isListType)(t)) { - text(into, '['); - renderType(into, t.ofType); - text(into, ']'); - } else { - text(into, t.name); - } -} -function renderDefinitionDescription(t, useMarkdown, description) { - const into = []; - const type = 'type' in t ? t.type : t; - if ('type' in t && t.description) { - text(into, t.description); - text(into, '\n\n'); - } - text(into, renderTypeToString(type, useMarkdown)); - if (description) { - text(into, '\n'); - text(into, description); - } else if (!(0, _graphql.isScalarType)(type) && 'description' in type && type.description) { - text(into, '\n'); - text(into, type.description); - } else if ('ofType' in type && !(0, _graphql.isScalarType)(type.ofType) && 'description' in type.ofType && type.ofType.description) { - text(into, '\n'); - text(into, type.ofType.description); - } - return into.join(''); -} -function renderTypeToString(t, useMarkdown) { - const into = []; - if (useMarkdown) { - text(into, '```graphql\n'); - } - renderType(into, t); - if (useMarkdown) { - text(into, '\n```'); - } - return into.join(''); -} -const defaultScalarTypesMap = { - Int: { - type: 'integer' - }, - String: { - type: 'string' - }, - Float: { - type: 'number' - }, - ID: { - type: 'string' - }, - Boolean: { - type: 'boolean' - }, - DateTime: { - type: 'string' - } -}; -class Marker { - constructor() { - this.set = new Set(); - } - mark(name) { - if (this.set.has(name)) { - return false; - } - this.set.add(name); - return true; - } -} -function getJSONSchemaFromGraphQLType(fieldOrType, options) { - var _a, _b; - let definition = Object.create(null); - const definitions = Object.create(null); - const isField = ('type' in fieldOrType); - const type = isField ? fieldOrType.type : fieldOrType; - const baseType = (0, _graphql.isNonNullType)(type) ? type.ofType : type; - const required = (0, _graphql.isNonNullType)(type); - if ((0, _graphql.isScalarType)(baseType)) { - if ((_a = options === null || options === void 0 ? void 0 : options.scalarSchemas) === null || _a === void 0 ? void 0 : _a[baseType.name]) { - definition = JSON.parse(JSON.stringify(options.scalarSchemas[baseType.name])); - } else { - definition.type = ['string', 'number', 'boolean', 'integer']; - } - if (!required) { - if (Array.isArray(definition.type)) { - definition.type.push('null'); - } else if (definition.type) { - definition.type = [definition.type, 'null']; - } else if (definition.enum) { - definition.enum.push(null); - } else if (definition.oneOf) { - definition.oneOf.push({ - type: 'null' - }); - } else { - definition = { - oneOf: [definition, { - type: 'null' - }] - }; - } - } - } else if ((0, _graphql.isEnumType)(baseType)) { - definition.enum = baseType.getValues().map(val => val.name); - if (!required) { - definition.enum.push(null); - } - } else if ((0, _graphql.isListType)(baseType)) { - if (required) { - definition.type = 'array'; - } else { - definition.type = ['array', 'null']; - } - const { - definition: def, - definitions: defs - } = getJSONSchemaFromGraphQLType(baseType.ofType, options); - definition.items = def; - if (defs) { - for (const defName of Object.keys(defs)) { - definitions[defName] = defs[defName]; - } - } - } else if ((0, _graphql.isInputObjectType)(baseType)) { - if (required) { - definition.$ref = `#/definitions/${baseType.name}`; - } else { - definition.oneOf = [{ - $ref: `#/definitions/${baseType.name}` - }, { - type: 'null' - }]; - } - if ((_b = options === null || options === void 0 ? void 0 : options.definitionMarker) === null || _b === void 0 ? void 0 : _b.mark(baseType.name)) { - const fields = baseType.getFields(); - const fieldDef = { - type: 'object', - properties: {}, - required: [] - }; - fieldDef.description = renderDefinitionDescription(baseType); - if (options === null || options === void 0 ? void 0 : options.useMarkdownDescription) { - fieldDef.markdownDescription = renderDefinitionDescription(baseType, true); - } - for (const fieldName of Object.keys(fields)) { - const field = fields[fieldName]; - const { - required: fieldRequired, - definition: fieldDefinition, - definitions: typeDefinitions - } = getJSONSchemaFromGraphQLType(field, options); - fieldDef.properties[fieldName] = fieldDefinition; - if (fieldRequired) { - fieldDef.required.push(fieldName); - } - if (typeDefinitions) { - for (const [defName, value] of Object.entries(typeDefinitions)) { - definitions[defName] = value; - } - } - } - definitions[baseType.name] = fieldDef; - } - } - if ('defaultValue' in fieldOrType && fieldOrType.defaultValue !== undefined) { - definition.default = fieldOrType.defaultValue; - } - const { - description - } = definition; - definition.description = renderDefinitionDescription(fieldOrType, false, description); - if (options === null || options === void 0 ? void 0 : options.useMarkdownDescription) { - definition.markdownDescription = renderDefinitionDescription(fieldOrType, true, description); - } - return { - required, - definition, - definitions - }; -} -function getVariablesJSONSchema(variableToType, options) { - var _a; - const jsonSchema = { - $schema: 'http://json-schema.org/draft-04/schema', - type: 'object', - properties: {}, - required: [] - }; - const runtimeOptions = Object.assign(Object.assign({}, options), { - definitionMarker: new Marker(), - scalarSchemas: Object.assign(Object.assign({}, defaultScalarTypesMap), options === null || options === void 0 ? void 0 : options.scalarSchemas) - }); - if (variableToType) { - for (const [variableName, type] of Object.entries(variableToType)) { - const { - definition, - required, - definitions - } = getJSONSchemaFromGraphQLType(type, runtimeOptions); - jsonSchema.properties[variableName] = definition; - if (required) { - (_a = jsonSchema.required) === null || _a === void 0 ? void 0 : _a.push(variableName); - } - if (definitions) { - jsonSchema.definitions = Object.assign(Object.assign({}, jsonSchema === null || jsonSchema === void 0 ? void 0 : jsonSchema.definitions), definitions); - } - } - } - return jsonSchema; -} - -/***/ }), - -/***/ "../../graphql-language-service/esm/utils/index.js": -/*!*********************************************************!*\ - !*** ../../graphql-language-service/esm/utils/index.js ***! - \*********************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -Object.defineProperty(exports, "Position", ({ - enumerable: true, - get: function () { - return _Range.Position; - } -})); -Object.defineProperty(exports, "Range", ({ - enumerable: true, - get: function () { - return _Range.Range; - } -})); -Object.defineProperty(exports, "collectVariables", ({ - enumerable: true, - get: function () { - return _collectVariables.collectVariables; - } -})); -Object.defineProperty(exports, "getASTNodeAtPosition", ({ - enumerable: true, - get: function () { - return _getASTNodeAtPosition.getASTNodeAtPosition; - } -})); -Object.defineProperty(exports, "getFragmentDependencies", ({ - enumerable: true, - get: function () { - return _fragmentDependencies.getFragmentDependencies; - } -})); -Object.defineProperty(exports, "getFragmentDependenciesForAST", ({ - enumerable: true, - get: function () { - return _fragmentDependencies.getFragmentDependenciesForAST; - } -})); -Object.defineProperty(exports, "getOperationASTFacts", ({ - enumerable: true, - get: function () { - return _getOperationFacts.getOperationASTFacts; - } -})); -Object.defineProperty(exports, "getOperationFacts", ({ - enumerable: true, - get: function () { - return _getOperationFacts.default; - } -})); -Object.defineProperty(exports, "getQueryFacts", ({ - enumerable: true, - get: function () { - return _getOperationFacts.getQueryFacts; - } -})); -Object.defineProperty(exports, "getVariablesJSONSchema", ({ - enumerable: true, - get: function () { - return _getVariablesJSONSchema.getVariablesJSONSchema; - } -})); -Object.defineProperty(exports, "locToRange", ({ - enumerable: true, - get: function () { - return _Range.locToRange; - } -})); -Object.defineProperty(exports, "offsetToPosition", ({ - enumerable: true, - get: function () { - return _Range.offsetToPosition; - } -})); -Object.defineProperty(exports, "pointToOffset", ({ - enumerable: true, - get: function () { - return _getASTNodeAtPosition.pointToOffset; - } -})); -Object.defineProperty(exports, "validateWithCustomRules", ({ - enumerable: true, - get: function () { - return _validateWithCustomRules.validateWithCustomRules; - } -})); -var _fragmentDependencies = __webpack_require__(/*! ./fragmentDependencies */ "../../graphql-language-service/esm/utils/fragmentDependencies.js"); -var _getVariablesJSONSchema = __webpack_require__(/*! ./getVariablesJSONSchema */ "../../graphql-language-service/esm/utils/getVariablesJSONSchema.js"); -var _getASTNodeAtPosition = __webpack_require__(/*! ./getASTNodeAtPosition */ "../../graphql-language-service/esm/utils/getASTNodeAtPosition.js"); -var _Range = __webpack_require__(/*! ./Range */ "../../graphql-language-service/esm/utils/Range.js"); -var _validateWithCustomRules = __webpack_require__(/*! ./validateWithCustomRules */ "../../graphql-language-service/esm/utils/validateWithCustomRules.js"); -var _collectVariables = __webpack_require__(/*! ./collectVariables */ "../../graphql-language-service/esm/utils/collectVariables.js"); -var _getOperationFacts = _interopRequireWildcard(__webpack_require__(/*! ./getOperationFacts */ "../../graphql-language-service/esm/utils/getOperationFacts.js")); -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } - -/***/ }), - -/***/ "../../graphql-language-service/esm/utils/validateWithCustomRules.js": -/*!***************************************************************************!*\ - !*** ../../graphql-language-service/esm/utils/validateWithCustomRules.js ***! - \***************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.validateWithCustomRules = validateWithCustomRules; -var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -const specifiedSDLRules = [_graphql.LoneSchemaDefinitionRule, _graphql.UniqueOperationTypesRule, _graphql.UniqueTypeNamesRule, _graphql.UniqueEnumValueNamesRule, _graphql.UniqueFieldDefinitionNamesRule, _graphql.UniqueDirectiveNamesRule, _graphql.KnownTypeNamesRule, _graphql.KnownDirectivesRule, _graphql.UniqueDirectivesPerLocationRule, _graphql.PossibleTypeExtensionsRule, _graphql.UniqueArgumentNamesRule, _graphql.UniqueInputFieldNamesRule]; -function validateWithCustomRules(schema, ast, customRules, isRelayCompatMode, isSchemaDocument) { - const rules = _graphql.specifiedRules.filter(rule => { - if (rule === _graphql.NoUnusedFragmentsRule || rule === _graphql.ExecutableDefinitionsRule) { - return false; - } - if (isRelayCompatMode && rule === _graphql.KnownFragmentNamesRule) { - return false; - } - return true; - }); - if (customRules) { - Array.prototype.push.apply(rules, customRules); - } - if (isSchemaDocument) { - Array.prototype.push.apply(rules, specifiedSDLRules); - } - const errors = (0, _graphql.validate)(schema, ast, rules); - return errors.filter(error => { - if (error.message.includes('Unknown directive') && error.nodes) { - const node = error.nodes[0]; - if (node && node.kind === _graphql.Kind.DIRECTIVE) { - const name = node.name.value; - if (name === 'arguments' || name === 'argumentDefinitions') { - return false; - } - } - } - return true; - }); -} - -/***/ }), - -/***/ "./style.css": -/*!*******************!*\ - !*** ./style.css ***! - \*******************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -__webpack_require__.r(__webpack_exports__); -// extracted by mini-css-extract-plugin - - -/***/ }), - -/***/ "../../graphiql-react/dist/style.css": -/*!*******************************************!*\ - !*** ../../graphiql-react/dist/style.css ***! - \*******************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -__webpack_require__.r(__webpack_exports__); -// extracted by mini-css-extract-plugin - - -/***/ }), - -/***/ "../../graphiql-react/font/fira-code.css": -/*!***********************************************!*\ - !*** ../../graphiql-react/font/fira-code.css ***! - \***********************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -__webpack_require__.r(__webpack_exports__); -// extracted by mini-css-extract-plugin - - -/***/ }), - -/***/ "../../graphiql-react/font/roboto.css": -/*!********************************************!*\ - !*** ../../graphiql-react/font/roboto.css ***! - \********************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -__webpack_require__.r(__webpack_exports__); -// extracted by mini-css-extract-plugin - - -/***/ }), - -/***/ "react": -/*!************************!*\ - !*** external "React" ***! - \************************/ -/***/ (function(module) { - -module.exports = window["React"]; - -/***/ }), - -/***/ "react-dom": -/*!***************************!*\ - !*** external "ReactDOM" ***! - \***************************/ -/***/ (function(module) { - -module.exports = window["ReactDOM"]; - -/***/ }), - -/***/ "../../../node_modules/@headlessui/react/dist/headlessui.dev.cjs": -/*!***********************************************************************!*\ - !*** ../../../node_modules/@headlessui/react/dist/headlessui.dev.cjs ***! - \***********************************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - -var __create = Object.create; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); -var __publicField = (obj, key, value) => { - __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); - return value; -}; - -// src/index.ts -var src_exports = {}; -__export(src_exports, { - Combobox: () => Combobox, - Dialog: () => Dialog, - Disclosure: () => Disclosure, - FocusTrap: () => FocusTrap, - Listbox: () => Listbox, - Menu: () => Menu, - Popover: () => Popover, - Portal: () => Portal, - RadioGroup: () => RadioGroup, - Switch: () => Switch, - Tab: () => Tab, - Transition: () => Transition -}); -module.exports = __toCommonJS(src_exports); - -// src/components/combobox/combobox.tsx -var import_react19 = __toESM(__webpack_require__(/*! react */ "react"), 1); - -// src/hooks/use-computed.ts -var import_react3 = __webpack_require__(/*! react */ "react"); - -// src/hooks/use-iso-morphic-effect.ts -var import_react = __webpack_require__(/*! react */ "react"); - -// src/utils/env.ts -var Env = class { - constructor() { - __publicField(this, "current", this.detect()); - __publicField(this, "handoffState", "pending"); - __publicField(this, "currentId", 0); - } - set(env2) { - if (this.current === env2) - return; - this.handoffState = "pending"; - this.currentId = 0; - this.current = env2; - } - reset() { - this.set(this.detect()); - } - nextId() { - return ++this.currentId; - } - get isServer() { - return this.current === "server"; - } - get isClient() { - return this.current === "client"; - } - detect() { - if (typeof window === "undefined" || typeof document === "undefined") { - return "server"; - } - return "client"; - } - handoff() { - if (this.handoffState === "pending") { - this.handoffState = "complete"; - } - } - get isHandoffComplete() { - return this.handoffState === "complete"; - } -}; -var env = new Env(); - -// src/hooks/use-iso-morphic-effect.ts -var useIsoMorphicEffect = (effect, deps) => { - if (env.isServer) { - (0, import_react.useEffect)(effect, deps); - } else { - (0, import_react.useLayoutEffect)(effect, deps); - } -}; - -// src/hooks/use-latest-value.ts -var import_react2 = __webpack_require__(/*! react */ "react"); -function useLatestValue(value) { - let cache = (0, import_react2.useRef)(value); - useIsoMorphicEffect(() => { - cache.current = value; - }, [value]); - return cache; -} - -// src/hooks/use-computed.ts -function useComputed(cb, dependencies) { - let [value, setValue] = (0, import_react3.useState)(cb); - let cbRef = useLatestValue(cb); - useIsoMorphicEffect(() => setValue(cbRef.current), [cbRef, setValue, ...dependencies]); - return value; -} - -// src/hooks/use-disposables.ts -var import_react4 = __webpack_require__(/*! react */ "react"); - -// src/utils/micro-task.ts -function microTask(cb) { - if (typeof queueMicrotask === "function") { - queueMicrotask(cb); - } else { - Promise.resolve().then(cb).catch( - (e) => setTimeout(() => { - throw e; - }) - ); - } -} - -// src/utils/disposables.ts -function disposables() { - let _disposables = []; - let api = { - addEventListener(element, name, listener, options) { - element.addEventListener(name, listener, options); - return api.add(() => element.removeEventListener(name, listener, options)); - }, - requestAnimationFrame(...args) { - let raf = requestAnimationFrame(...args); - return api.add(() => cancelAnimationFrame(raf)); - }, - nextFrame(...args) { - return api.requestAnimationFrame(() => { - return api.requestAnimationFrame(...args); - }); - }, - setTimeout(...args) { - let timer = setTimeout(...args); - return api.add(() => clearTimeout(timer)); - }, - microTask(...args) { - let task = { current: true }; - microTask(() => { - if (task.current) { - args[0](); - } - }); - return api.add(() => { - task.current = false; - }); - }, - style(node, property, value) { - let previous = node.style.getPropertyValue(property); - Object.assign(node.style, { [property]: value }); - return this.add(() => { - Object.assign(node.style, { [property]: previous }); - }); - }, - group(cb) { - let d = disposables(); - cb(d); - return this.add(() => d.dispose()); - }, - add(cb) { - _disposables.push(cb); - return () => { - let idx = _disposables.indexOf(cb); - if (idx >= 0) { - for (let dispose of _disposables.splice(idx, 1)) { - dispose(); - } - } - }; - }, - dispose() { - for (let dispose of _disposables.splice(0)) { - dispose(); - } - } - }; - return api; -} - -// src/hooks/use-disposables.ts -function useDisposables() { - let [d] = (0, import_react4.useState)(disposables); - (0, import_react4.useEffect)(() => () => d.dispose(), [d]); - return d; -} - -// src/hooks/use-event.ts -var import_react5 = __toESM(__webpack_require__(/*! react */ "react"), 1); -var useEvent = ( - // TODO: Add React.useEvent ?? once the useEvent hook is available - function useEvent2(cb) { - let cache = useLatestValue(cb); - return import_react5.default.useCallback((...args) => cache.current(...args), [cache]); - } -); - -// src/hooks/use-id.ts -var import_react7 = __toESM(__webpack_require__(/*! react */ "react"), 1); - -// src/hooks/use-server-handoff-complete.ts -var import_react6 = __webpack_require__(/*! react */ "react"); -function useServerHandoffComplete() { - let [complete, setComplete] = (0, import_react6.useState)(env.isHandoffComplete); - if (complete && env.isHandoffComplete === false) { - setComplete(false); - } - (0, import_react6.useEffect)(() => { - if (complete === true) - return; - setComplete(true); - }, [complete]); - (0, import_react6.useEffect)(() => env.handoff(), []); - return complete; -} - -// src/hooks/use-id.ts -var _a; -var useId = ( - // Prefer React's `useId` if it's available. - // @ts-expect-error - `useId` doesn't exist in React < 18. - (_a = import_react7.default.useId) != null ? _a : function useId2() { - let ready = useServerHandoffComplete(); - let [id, setId] = import_react7.default.useState(ready ? () => env.nextId() : null); - useIsoMorphicEffect(() => { - if (id === null) - setId(env.nextId()); - }, [id]); - return id != null ? "" + id : void 0; - } -); - -// src/hooks/use-outside-click.ts -var import_react10 = __webpack_require__(/*! react */ "react"); - -// src/utils/match.ts -function match(value, lookup, ...args) { - if (value in lookup) { - let returnValue = lookup[value]; - return typeof returnValue === "function" ? returnValue(...args) : returnValue; - } - let error = new Error( - `Tried to handle "${value}" but there is no handler defined. Only defined handlers are: ${Object.keys( - lookup - ).map((key) => `"${key}"`).join(", ")}.` - ); - if (Error.captureStackTrace) - Error.captureStackTrace(error, match); - throw error; -} - -// src/utils/owner.ts -function getOwnerDocument(element) { - if (env.isServer) - return null; - if (element instanceof Node) - return element.ownerDocument; - if (element == null ? void 0 : element.hasOwnProperty("current")) { - if (element.current instanceof Node) - return element.current.ownerDocument; - } - return document; -} - -// src/utils/focus-management.ts -var focusableSelector = [ - "[contentEditable=true]", - "[tabindex]", - "a[href]", - "area[href]", - "button:not([disabled])", - "iframe", - "input:not([disabled])", - "select:not([disabled])", - "textarea:not([disabled])" -].map( - false ? ( - // TODO: Remove this once JSDOM fixes the issue where an element that is - // "hidden" can be the document.activeElement, because this is not possible - // in real browsers. - 0 - ) : (selector) => `${selector}:not([tabindex='-1'])` -).join(","); -function getFocusableElements(container = document.body) { - if (container == null) - return []; - return Array.from(container.querySelectorAll(focusableSelector)).sort( - // We want to move `tabIndex={0}` to the end of the list, this is what the browser does as well. - (a, z) => Math.sign((a.tabIndex || Number.MAX_SAFE_INTEGER) - (z.tabIndex || Number.MAX_SAFE_INTEGER)) - ); -} -function isFocusableElement(element, mode = 0 /* Strict */) { - var _a3; - if (element === ((_a3 = getOwnerDocument(element)) == null ? void 0 : _a3.body)) - return false; - return match(mode, { - [0 /* Strict */]() { - return element.matches(focusableSelector); - }, - [1 /* Loose */]() { - let next = element; - while (next !== null) { - if (next.matches(focusableSelector)) - return true; - next = next.parentElement; - } - return false; - } - }); -} -function restoreFocusIfNecessary(element) { - let ownerDocument = getOwnerDocument(element); - disposables().nextFrame(() => { - if (ownerDocument && !isFocusableElement(ownerDocument.activeElement, 0 /* Strict */)) { - focusElement(element); - } - }); -} -if (typeof window !== "undefined" && typeof document !== "undefined") { - document.addEventListener( - "keydown", - (event) => { - if (event.metaKey || event.altKey || event.ctrlKey) { - return; - } - document.documentElement.dataset.headlessuiFocusVisible = ""; - }, - true - ); - document.addEventListener( - "click", - (event) => { - if (event.detail === 1 /* Mouse */) { - delete document.documentElement.dataset.headlessuiFocusVisible; - } else if (event.detail === 0 /* Keyboard */) { - document.documentElement.dataset.headlessuiFocusVisible = ""; - } - }, - true - ); -} -function focusElement(element) { - element == null ? void 0 : element.focus({ preventScroll: true }); -} -var selectableSelector = ["textarea", "input"].join(","); -function isSelectableElement(element) { - var _a3, _b; - return (_b = (_a3 = element == null ? void 0 : element.matches) == null ? void 0 : _a3.call(element, selectableSelector)) != null ? _b : false; -} -function sortByDomNode(nodes, resolveKey = (i) => i) { - return nodes.slice().sort((aItem, zItem) => { - let a = resolveKey(aItem); - let z = resolveKey(zItem); - if (a === null || z === null) - return 0; - let position = a.compareDocumentPosition(z); - if (position & Node.DOCUMENT_POSITION_FOLLOWING) - return -1; - if (position & Node.DOCUMENT_POSITION_PRECEDING) - return 1; - return 0; - }); -} -function focusFrom(current, focus) { - return focusIn(getFocusableElements(), focus, { relativeTo: current }); -} -function focusIn(container, focus, { - sorted = true, - relativeTo = null, - skipElements = [] -} = {}) { - let ownerDocument = Array.isArray(container) ? container.length > 0 ? container[0].ownerDocument : document : container.ownerDocument; - let elements = Array.isArray(container) ? sorted ? sortByDomNode(container) : container : getFocusableElements(container); - if (skipElements.length > 0 && elements.length > 1) { - elements = elements.filter((x) => !skipElements.includes(x)); - } - relativeTo = relativeTo != null ? relativeTo : ownerDocument.activeElement; - let direction = (() => { - if (focus & (1 /* First */ | 4 /* Next */)) - return 1 /* Next */; - if (focus & (2 /* Previous */ | 8 /* Last */)) - return -1 /* Previous */; - throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last"); - })(); - let startIndex = (() => { - if (focus & 1 /* First */) - return 0; - if (focus & 2 /* Previous */) - return Math.max(0, elements.indexOf(relativeTo)) - 1; - if (focus & 4 /* Next */) - return Math.max(0, elements.indexOf(relativeTo)) + 1; - if (focus & 8 /* Last */) - return elements.length - 1; - throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last"); - })(); - let focusOptions = focus & 32 /* NoScroll */ ? { preventScroll: true } : {}; - let offset = 0; - let total = elements.length; - let next = void 0; - do { - if (offset >= total || offset + total <= 0) - return 0 /* Error */; - let nextIdx = startIndex + offset; - if (focus & 16 /* WrapAround */) { - nextIdx = (nextIdx + total) % total; - } else { - if (nextIdx < 0) - return 3 /* Underflow */; - if (nextIdx >= total) - return 1 /* Overflow */; - } - next = elements[nextIdx]; - next == null ? void 0 : next.focus(focusOptions); - offset += direction; - } while (next !== ownerDocument.activeElement); - if (focus & (4 /* Next */ | 2 /* Previous */) && isSelectableElement(next)) { - next.select(); - } - return 2 /* Success */; -} - -// src/hooks/use-document-event.ts -var import_react8 = __webpack_require__(/*! react */ "react"); -function useDocumentEvent(type, listener, options) { - let listenerRef = useLatestValue(listener); - (0, import_react8.useEffect)(() => { - function handler(event) { - listenerRef.current(event); - } - document.addEventListener(type, handler, options); - return () => document.removeEventListener(type, handler, options); - }, [type, options]); -} - -// src/hooks/use-window-event.ts -var import_react9 = __webpack_require__(/*! react */ "react"); -function useWindowEvent(type, listener, options) { - let listenerRef = useLatestValue(listener); - (0, import_react9.useEffect)(() => { - function handler(event) { - listenerRef.current(event); - } - window.addEventListener(type, handler, options); - return () => window.removeEventListener(type, handler, options); - }, [type, options]); -} - -// src/hooks/use-outside-click.ts -function useOutsideClick(containers, cb, enabled = true) { - let enabledRef = (0, import_react10.useRef)(false); - (0, import_react10.useEffect)( - false ? 0 : () => { - requestAnimationFrame(() => { - enabledRef.current = enabled; - }); - }, - [enabled] - ); - function handleOutsideClick(event, resolveTarget) { - if (!enabledRef.current) - return; - if (event.defaultPrevented) - return; - let target = resolveTarget(event); - if (target === null) { - return; - } - if (!target.getRootNode().contains(target)) - return; - let _containers = function resolve(containers2) { - if (typeof containers2 === "function") { - return resolve(containers2()); - } - if (Array.isArray(containers2)) { - return containers2; - } - if (containers2 instanceof Set) { - return containers2; - } - return [containers2]; - }(containers); - for (let container of _containers) { - if (container === null) - continue; - let domNode = container instanceof HTMLElement ? container : container.current; - if (domNode == null ? void 0 : domNode.contains(target)) { - return; - } - if (event.composed && event.composedPath().includes(domNode)) { - return; - } - } - if ( - // This check alllows us to know whether or not we clicked on a "focusable" element like a - // button or an input. This is a backwards compatibility check so that you can open a and click on another which should close Menu A and open Menu B. We might - // revisit that so that you will require 2 clicks instead. - !isFocusableElement(target, 1 /* Loose */) && // This could be improved, but the `Combobox.Button` adds tabIndex={-1} to make it - // unfocusable via the keyboard so that tabbing to the next item from the input doesn't - // first go to the button. - target.tabIndex !== -1 - ) { - event.preventDefault(); - } - return cb(event, target); - } - let initialClickTarget = (0, import_react10.useRef)(null); - useDocumentEvent( - "mousedown", - (event) => { - var _a3, _b; - if (enabledRef.current) { - initialClickTarget.current = ((_b = (_a3 = event.composedPath) == null ? void 0 : _a3.call(event)) == null ? void 0 : _b[0]) || event.target; - } - }, - true - ); - useDocumentEvent( - "click", - (event) => { - if (!initialClickTarget.current) { - return; - } - handleOutsideClick(event, () => { - return initialClickTarget.current; - }); - initialClickTarget.current = null; - }, - // We will use the `capture` phase so that layers in between with `event.stopPropagation()` - // don't "cancel" this outside click check. E.g.: A `Menu` inside a `DialogPanel` if the `Menu` - // is open, and you click outside of it in the `DialogPanel` the `Menu` should close. However, - // the `DialogPanel` has a `onClick(e) { e.stopPropagation() }` which would cancel this. - true - ); - useWindowEvent( - "blur", - (event) => handleOutsideClick( - event, - () => window.document.activeElement instanceof HTMLIFrameElement ? window.document.activeElement : null - ), - true - ); -} - -// src/hooks/use-resolve-button-type.ts -var import_react11 = __webpack_require__(/*! react */ "react"); -function resolveType(props) { - var _a3; - if (props.type) - return props.type; - let tag = (_a3 = props.as) != null ? _a3 : "button"; - if (typeof tag === "string" && tag.toLowerCase() === "button") - return "button"; - return void 0; -} -function useResolveButtonType(props, ref) { - let [type, setType] = (0, import_react11.useState)(() => resolveType(props)); - useIsoMorphicEffect(() => { - setType(resolveType(props)); - }, [props.type, props.as]); - useIsoMorphicEffect(() => { - if (type) - return; - if (!ref.current) - return; - if (ref.current instanceof HTMLButtonElement && !ref.current.hasAttribute("type")) { - setType("button"); - } - }, [type, ref]); - return type; -} - -// src/hooks/use-sync-refs.ts -var import_react12 = __webpack_require__(/*! react */ "react"); -var Optional = Symbol(); -function optionalRef(cb, isOptional = true) { - return Object.assign(cb, { [Optional]: isOptional }); -} -function useSyncRefs(...refs) { - let cache = (0, import_react12.useRef)(refs); - (0, import_react12.useEffect)(() => { - cache.current = refs; - }, [refs]); - let syncRefs = useEvent((value) => { - for (let ref of cache.current) { - if (ref == null) - continue; - if (typeof ref === "function") - ref(value); - else - ref.current = value; - } - }); - return refs.every( - (ref) => ref == null || // @ts-expect-error - (ref == null ? void 0 : ref[Optional]) - ) ? void 0 : syncRefs; -} - -// src/hooks/use-tree-walker.ts -var import_react13 = __webpack_require__(/*! react */ "react"); -function useTreeWalker({ - container, - accept, - walk, - enabled = true -}) { - let acceptRef = (0, import_react13.useRef)(accept); - let walkRef = (0, import_react13.useRef)(walk); - (0, import_react13.useEffect)(() => { - acceptRef.current = accept; - walkRef.current = walk; - }, [accept, walk]); - useIsoMorphicEffect(() => { - if (!container) - return; - if (!enabled) - return; - let ownerDocument = getOwnerDocument(container); - if (!ownerDocument) - return; - let accept2 = acceptRef.current; - let walk2 = walkRef.current; - let acceptNode = Object.assign((node) => accept2(node), { acceptNode: accept2 }); - let walker = ownerDocument.createTreeWalker( - container, - NodeFilter.SHOW_ELEMENT, - acceptNode, - // @ts-expect-error This `false` is a simple small fix for older browsers - false - ); - while (walker.nextNode()) - walk2(walker.currentNode); - }, [container, enabled, acceptRef, walkRef]); -} - -// src/utils/calculate-active-index.ts -function assertNever(x) { - throw new Error("Unexpected object: " + x); -} -function calculateActiveIndex(action, resolvers) { - let items = resolvers.resolveItems(); - if (items.length <= 0) - return null; - let currentActiveIndex = resolvers.resolveActiveIndex(); - let activeIndex = currentActiveIndex != null ? currentActiveIndex : -1; - let nextActiveIndex = (() => { - switch (action.focus) { - case 0 /* First */: - return items.findIndex((item) => !resolvers.resolveDisabled(item)); - case 1 /* Previous */: { - let idx = items.slice().reverse().findIndex((item, idx2, all) => { - if (activeIndex !== -1 && all.length - idx2 - 1 >= activeIndex) - return false; - return !resolvers.resolveDisabled(item); - }); - if (idx === -1) - return idx; - return items.length - 1 - idx; - } - case 2 /* Next */: - return items.findIndex((item, idx) => { - if (idx <= activeIndex) - return false; - return !resolvers.resolveDisabled(item); - }); - case 3 /* Last */: { - let idx = items.slice().reverse().findIndex((item) => !resolvers.resolveDisabled(item)); - if (idx === -1) - return idx; - return items.length - 1 - idx; - } - case 4 /* Specific */: - return items.findIndex((item) => resolvers.resolveId(item) === action.id); - case 5 /* Nothing */: - return null; - default: - assertNever(action); - } - })(); - return nextActiveIndex === -1 ? currentActiveIndex : nextActiveIndex; -} - -// src/utils/render.ts -var import_react14 = __webpack_require__(/*! react */ "react"); - -// src/utils/class-names.ts -function classNames(...classes) { - return classes.filter(Boolean).join(" "); -} - -// src/utils/render.ts -function render({ - ourProps, - theirProps, - slot, - defaultTag, - features, - visible = true, - name -}) { - let props = mergeProps(theirProps, ourProps); - if (visible) - return _render(props, slot, defaultTag, name); - let featureFlags = features != null ? features : 0 /* None */; - if (featureFlags & 2 /* Static */) { - let { static: isStatic = false, ...rest } = props; - if (isStatic) - return _render(rest, slot, defaultTag, name); - } - if (featureFlags & 1 /* RenderStrategy */) { - let { unmount = true, ...rest } = props; - let strategy = unmount ? 0 /* Unmount */ : 1 /* Hidden */; - return match(strategy, { - [0 /* Unmount */]() { - return null; - }, - [1 /* Hidden */]() { - return _render( - { ...rest, ...{ hidden: true, style: { display: "none" } } }, - slot, - defaultTag, - name - ); - } - }); - } - return _render(props, slot, defaultTag, name); -} -function _render(props, slot = {}, tag, name) { - let { - as: Component = tag, - children, - refName = "ref", - ...rest - } = omit(props, ["unmount", "static"]); - let refRelatedProps = props.ref !== void 0 ? { [refName]: props.ref } : {}; - let resolvedChildren = typeof children === "function" ? children(slot) : children; - if ("className" in rest && rest.className && typeof rest.className === "function") { - rest.className = rest.className(slot); - } - let dataAttributes = {}; - if (slot) { - let exposeState = false; - let states = []; - for (let [k, v] of Object.entries(slot)) { - if (typeof v === "boolean") { - exposeState = true; - } - if (v === true) { - states.push(k); - } - } - if (exposeState) - dataAttributes[`data-headlessui-state`] = states.join(" "); - } - if (Component === import_react14.Fragment) { - if (Object.keys(compact(rest)).length > 0) { - if (!(0, import_react14.isValidElement)(resolvedChildren) || Array.isArray(resolvedChildren) && resolvedChildren.length > 1) { - throw new Error( - [ - 'Passing props on "Fragment"!', - "", - `The current component <${name} /> is rendering a "Fragment".`, - `However we need to passthrough the following props:`, - Object.keys(rest).map((line) => ` - ${line}`).join("\n"), - "", - "You can apply a few solutions:", - [ - 'Add an `as="..."` prop, to ensure that we render an actual element instead of a "Fragment".', - "Render a single element as the child so that we can forward the props onto that element." - ].map((line) => ` - ${line}`).join("\n") - ].join("\n") - ); - } - let childProps = resolvedChildren.props; - let newClassName = typeof (childProps == null ? void 0 : childProps.className) === "function" ? (...args) => classNames(childProps == null ? void 0 : childProps.className(...args), rest.className) : classNames(childProps == null ? void 0 : childProps.className, rest.className); - let classNameProps = newClassName ? { className: newClassName } : {}; - return (0, import_react14.cloneElement)( - resolvedChildren, - Object.assign( - {}, - // Filter out undefined values so that they don't override the existing values - mergeProps(resolvedChildren.props, compact(omit(rest, ["ref"]))), - dataAttributes, - refRelatedProps, - mergeRefs(resolvedChildren.ref, refRelatedProps.ref), - classNameProps - ) - ); - } - } - return (0, import_react14.createElement)( - Component, - Object.assign( - {}, - omit(rest, ["ref"]), - Component !== import_react14.Fragment && refRelatedProps, - Component !== import_react14.Fragment && dataAttributes - ), - resolvedChildren - ); -} -function mergeRefs(...refs) { - return { - ref: refs.every((ref) => ref == null) ? void 0 : (value) => { - for (let ref of refs) { - if (ref == null) - continue; - if (typeof ref === "function") - ref(value); - else - ref.current = value; - } - } - }; -} -function mergeProps(...listOfProps) { - var _a3; - if (listOfProps.length === 0) - return {}; - if (listOfProps.length === 1) - return listOfProps[0]; - let target = {}; - let eventHandlers = {}; - for (let props of listOfProps) { - for (let prop in props) { - if (prop.startsWith("on") && typeof props[prop] === "function") { - (_a3 = eventHandlers[prop]) != null ? _a3 : eventHandlers[prop] = []; - eventHandlers[prop].push(props[prop]); - } else { - target[prop] = props[prop]; - } - } - } - if (target.disabled || target["aria-disabled"]) { - return Object.assign( - target, - // Set all event listeners that we collected to `undefined`. This is - // important because of the `cloneElement` from above, which merges the - // existing and new props, they don't just override therefore we have to - // explicitly nullify them. - Object.fromEntries(Object.keys(eventHandlers).map((eventName) => [eventName, void 0])) - ); - } - for (let eventName in eventHandlers) { - Object.assign(target, { - [eventName](event, ...args) { - let handlers = eventHandlers[eventName]; - for (let handler of handlers) { - if ((event instanceof Event || (event == null ? void 0 : event.nativeEvent) instanceof Event) && event.defaultPrevented) { - return; - } - handler(event, ...args); - } - } - }); - } - return target; -} -function forwardRefWithAs(component) { - var _a3; - return Object.assign((0, import_react14.forwardRef)(component), { - displayName: (_a3 = component.displayName) != null ? _a3 : component.name - }); -} -function compact(object) { - let clone = Object.assign({}, object); - for (let key in clone) { - if (clone[key] === void 0) - delete clone[key]; - } - return clone; -} -function omit(object, keysToOmit = []) { - let clone = Object.assign({}, object); - for (let key of keysToOmit) { - if (key in clone) - delete clone[key]; - } - return clone; -} - -// src/utils/bugs.ts -function isDisabledReactIssue7711(element) { - let parent = element.parentElement; - let legend = null; - while (parent && !(parent instanceof HTMLFieldSetElement)) { - if (parent instanceof HTMLLegendElement) - legend = parent; - parent = parent.parentElement; - } - let isParentDisabled = (parent == null ? void 0 : parent.getAttribute("disabled")) === ""; - if (isParentDisabled && isFirstLegend(legend)) - return false; - return isParentDisabled; -} -function isFirstLegend(element) { - if (!element) - return false; - let previous = element.previousElementSibling; - while (previous !== null) { - if (previous instanceof HTMLLegendElement) - return false; - previous = previous.previousElementSibling; - } - return true; -} - -// src/utils/form.ts -function objectToFormEntries(source = {}, parentKey = null, entries = []) { - for (let [key, value] of Object.entries(source)) { - append(entries, composeKey(parentKey, key), value); - } - return entries; -} -function composeKey(parent, key) { - return parent ? parent + "[" + key + "]" : key; -} -function append(entries, key, value) { - if (Array.isArray(value)) { - for (let [subkey, subvalue] of value.entries()) { - append(entries, composeKey(key, subkey.toString()), subvalue); - } - } else if (value instanceof Date) { - entries.push([key, value.toISOString()]); - } else if (typeof value === "boolean") { - entries.push([key, value ? "1" : "0"]); - } else if (typeof value === "string") { - entries.push([key, value]); - } else if (typeof value === "number") { - entries.push([key, `${value}`]); - } else if (value === null || value === void 0) { - entries.push([key, ""]); - } else { - objectToFormEntries(value, key, entries); - } -} -function attemptSubmit(element) { - var _a3; - let form = (_a3 = element == null ? void 0 : element.form) != null ? _a3 : element.closest("form"); - if (!form) - return; - for (let element2 of form.elements) { - if (element2.tagName === "INPUT" && element2.type === "submit" || element2.tagName === "BUTTON" && element2.type === "submit" || element2.nodeName === "INPUT" && element2.type === "image") { - element2.click(); - return; - } - } -} - -// src/internal/hidden.tsx -var DEFAULT_VISUALLY_HIDDEN_TAG = "div"; -function VisuallyHidden(props, ref) { - let { features = 1 /* None */, ...theirProps } = props; - let ourProps = { - ref, - "aria-hidden": (features & 2 /* Focusable */) === 2 /* Focusable */ ? true : void 0, - style: { - position: "fixed", - top: 1, - left: 1, - width: 1, - height: 0, - padding: 0, - margin: -1, - overflow: "hidden", - clip: "rect(0, 0, 0, 0)", - whiteSpace: "nowrap", - borderWidth: "0", - ...(features & 4 /* Hidden */) === 4 /* Hidden */ && !((features & 2 /* Focusable */) === 2 /* Focusable */) && { display: "none" } - } - }; - return render({ - ourProps, - theirProps, - slot: {}, - defaultTag: DEFAULT_VISUALLY_HIDDEN_TAG, - name: "Hidden" - }); -} -var Hidden = forwardRefWithAs(VisuallyHidden); - -// src/internal/open-closed.tsx -var import_react15 = __toESM(__webpack_require__(/*! react */ "react"), 1); -var Context = (0, import_react15.createContext)(null); -Context.displayName = "OpenClosedContext"; -function useOpenClosed() { - return (0, import_react15.useContext)(Context); -} -function OpenClosedProvider({ value, children }) { - return /* @__PURE__ */ import_react15.default.createElement(Context.Provider, { value }, children); -} - -// src/hooks/use-controllable.ts -var import_react16 = __webpack_require__(/*! react */ "react"); -function useControllable(controlledValue, onChange, defaultValue) { - let [internalValue, setInternalValue] = (0, import_react16.useState)(defaultValue); - let isControlled = controlledValue !== void 0; - let wasControlled = (0, import_react16.useRef)(isControlled); - let didWarnOnUncontrolledToControlled = (0, import_react16.useRef)(false); - let didWarnOnControlledToUncontrolled = (0, import_react16.useRef)(false); - if (isControlled && !wasControlled.current && !didWarnOnUncontrolledToControlled.current) { - didWarnOnUncontrolledToControlled.current = true; - wasControlled.current = isControlled; - console.error( - "A component is changing from uncontrolled to controlled. This may be caused by the value changing from undefined to a defined value, which should not happen." - ); - } else if (!isControlled && wasControlled.current && !didWarnOnControlledToUncontrolled.current) { - didWarnOnControlledToUncontrolled.current = true; - wasControlled.current = isControlled; - console.error( - "A component is changing from controlled to uncontrolled. This may be caused by the value changing from a defined value to undefined, which should not happen." - ); - } - return [ - isControlled ? controlledValue : internalValue, - useEvent((value) => { - if (isControlled) { - return onChange == null ? void 0 : onChange(value); - } else { - setInternalValue(value); - return onChange == null ? void 0 : onChange(value); - } - }) - ]; -} - -// src/hooks/use-watch.ts -var import_react17 = __webpack_require__(/*! react */ "react"); -function useWatch(cb, dependencies) { - let track = (0, import_react17.useRef)([]); - let action = useEvent(cb); - (0, import_react17.useEffect)(() => { - let oldValues = [...track.current]; - for (let [idx, value] of dependencies.entries()) { - if (track.current[idx] !== value) { - let returnValue = action(dependencies, oldValues); - track.current = dependencies; - return returnValue; - } - } - }, [action, ...dependencies]); -} - -// src/hooks/use-tracked-pointer.ts -var import_react18 = __webpack_require__(/*! react */ "react"); -function eventToPosition(evt) { - return [evt.screenX, evt.screenY]; -} -function useTrackedPointer() { - let lastPos = (0, import_react18.useRef)([-1, -1]); - return { - wasMoved(evt) { - if (false) {} - let newPos = eventToPosition(evt); - if (lastPos.current[0] === newPos[0] && lastPos.current[1] === newPos[1]) { - return false; - } - lastPos.current = newPos; - return true; - }, - update(evt) { - lastPos.current = eventToPosition(evt); - } - }; -} - -// src/utils/platform.ts -function isIOS() { - return ( - // Check if it is an iPhone - /iPhone/gi.test(window.navigator.platform) || // Check if it is an iPad. iPad reports itself as "MacIntel", but we can check if it is a touch - // screen. Let's hope that Apple doesn't release a touch screen Mac (or maybe this would then - // work as expected 🤔). - /Mac/gi.test(window.navigator.platform) && window.navigator.maxTouchPoints > 0 - ); -} -function isAndroid() { - return /Android/gi.test(window.navigator.userAgent); -} -function isMobile() { - return isIOS() || isAndroid(); -} - -// src/components/combobox/combobox.tsx -function adjustOrderedState(state, adjustment = (i) => i) { - let currentActiveOption = state.activeOptionIndex !== null ? state.options[state.activeOptionIndex] : null; - let sortedOptions = sortByDomNode( - adjustment(state.options.slice()), - (option) => option.dataRef.current.domRef.current - ); - let adjustedActiveOptionIndex = currentActiveOption ? sortedOptions.indexOf(currentActiveOption) : null; - if (adjustedActiveOptionIndex === -1) { - adjustedActiveOptionIndex = null; - } - return { - options: sortedOptions, - activeOptionIndex: adjustedActiveOptionIndex - }; -} -var reducers = { - [1 /* CloseCombobox */](state) { - var _a3; - if ((_a3 = state.dataRef.current) == null ? void 0 : _a3.disabled) - return state; - if (state.comboboxState === 1 /* Closed */) - return state; - return { ...state, activeOptionIndex: null, comboboxState: 1 /* Closed */ }; - }, - [0 /* OpenCombobox */](state) { - var _a3; - if ((_a3 = state.dataRef.current) == null ? void 0 : _a3.disabled) - return state; - if (state.comboboxState === 0 /* Open */) - return state; - let activeOptionIndex = state.activeOptionIndex; - if (state.dataRef.current) { - let { isSelected } = state.dataRef.current; - let optionIdx = state.options.findIndex((option) => isSelected(option.dataRef.current.value)); - if (optionIdx !== -1) { - activeOptionIndex = optionIdx; - } - } - return { ...state, comboboxState: 0 /* Open */, activeOptionIndex }; - }, - [2 /* GoToOption */](state, action) { - var _a3, _b, _c, _d; - if ((_a3 = state.dataRef.current) == null ? void 0 : _a3.disabled) - return state; - if (((_b = state.dataRef.current) == null ? void 0 : _b.optionsRef.current) && !((_c = state.dataRef.current) == null ? void 0 : _c.optionsPropsRef.current.static) && state.comboboxState === 1 /* Closed */) { - return state; - } - let adjustedState = adjustOrderedState(state); - if (adjustedState.activeOptionIndex === null) { - let localActiveOptionIndex = adjustedState.options.findIndex( - (option) => !option.dataRef.current.disabled - ); - if (localActiveOptionIndex !== -1) { - adjustedState.activeOptionIndex = localActiveOptionIndex; - } - } - let activeOptionIndex = calculateActiveIndex(action, { - resolveItems: () => adjustedState.options, - resolveActiveIndex: () => adjustedState.activeOptionIndex, - resolveId: (item) => item.id, - resolveDisabled: (item) => item.dataRef.current.disabled - }); - return { - ...state, - ...adjustedState, - activeOptionIndex, - activationTrigger: (_d = action.trigger) != null ? _d : 1 /* Other */ - }; - }, - [3 /* RegisterOption */]: (state, action) => { - var _a3, _b; - let option = { id: action.id, dataRef: action.dataRef }; - let adjustedState = adjustOrderedState(state, (options) => [...options, option]); - if (state.activeOptionIndex === null) { - if ((_a3 = state.dataRef.current) == null ? void 0 : _a3.isSelected(action.dataRef.current.value)) { - adjustedState.activeOptionIndex = adjustedState.options.indexOf(option); - } - } - let nextState = { - ...state, - ...adjustedState, - activationTrigger: 1 /* Other */ - }; - if (((_b = state.dataRef.current) == null ? void 0 : _b.__demoMode) && state.dataRef.current.value === void 0) { - nextState.activeOptionIndex = 0; - } - return nextState; - }, - [4 /* UnregisterOption */]: (state, action) => { - let adjustedState = adjustOrderedState(state, (options) => { - let idx = options.findIndex((a) => a.id === action.id); - if (idx !== -1) - options.splice(idx, 1); - return options; - }); - return { - ...state, - ...adjustedState, - activationTrigger: 1 /* Other */ - }; - }, - [5 /* RegisterLabel */]: (state, action) => { - return { - ...state, - labelId: action.id - }; - } -}; -var ComboboxActionsContext = (0, import_react19.createContext)(null); -ComboboxActionsContext.displayName = "ComboboxActionsContext"; -function useActions(component) { - let context = (0, import_react19.useContext)(ComboboxActionsContext); - if (context === null) { - let err = new Error(`<${component} /> is missing a parent component.`); - if (Error.captureStackTrace) - Error.captureStackTrace(err, useActions); - throw err; - } - return context; -} -var ComboboxDataContext = (0, import_react19.createContext)(null); -ComboboxDataContext.displayName = "ComboboxDataContext"; -function useData(component) { - let context = (0, import_react19.useContext)(ComboboxDataContext); - if (context === null) { - let err = new Error(`<${component} /> is missing a parent component.`); - if (Error.captureStackTrace) - Error.captureStackTrace(err, useData); - throw err; - } - return context; -} -function stateReducer(state, action) { - return match(action.type, reducers, state, action); -} -var DEFAULT_COMBOBOX_TAG = import_react19.Fragment; -function ComboboxFn(props, ref) { - let { - value: controlledValue, - defaultValue, - onChange: controlledOnChange, - form: formName, - name, - by = (a, z) => a === z, - disabled = false, - __demoMode = false, - nullable = false, - multiple = false, - ...theirProps - } = props; - let [value = multiple ? [] : void 0, theirOnChange] = useControllable( - controlledValue, - controlledOnChange, - defaultValue - ); - let [state, dispatch] = (0, import_react19.useReducer)(stateReducer, { - dataRef: (0, import_react19.createRef)(), - comboboxState: __demoMode ? 0 /* Open */ : 1 /* Closed */, - options: [], - activeOptionIndex: null, - activationTrigger: 1 /* Other */, - labelId: null - }); - let defaultToFirstOption = (0, import_react19.useRef)(false); - let optionsPropsRef = (0, import_react19.useRef)({ static: false, hold: false }); - let labelRef = (0, import_react19.useRef)(null); - let inputRef = (0, import_react19.useRef)(null); - let buttonRef = (0, import_react19.useRef)(null); - let optionsRef = (0, import_react19.useRef)(null); - let compare = useEvent( - // @ts-expect-error Eventually we'll want to tackle this, but for now this will do. - typeof by === "string" ? (a, z) => { - let property = by; - return (a == null ? void 0 : a[property]) === (z == null ? void 0 : z[property]); - } : by - ); - let isSelected = (0, import_react19.useCallback)( - (compareValue) => match(data.mode, { - [1 /* Multi */]: () => value.some((option) => compare(option, compareValue)), - [0 /* Single */]: () => compare(value, compareValue) - }), - [value] - ); - let data = (0, import_react19.useMemo)( - () => ({ - ...state, - optionsPropsRef, - labelRef, - inputRef, - buttonRef, - optionsRef, - value, - defaultValue, - disabled, - mode: multiple ? 1 /* Multi */ : 0 /* Single */, - get activeOptionIndex() { - if (defaultToFirstOption.current && state.activeOptionIndex === null && state.options.length > 0) { - let localActiveOptionIndex = state.options.findIndex( - (option) => !option.dataRef.current.disabled - ); - if (localActiveOptionIndex !== -1) { - return localActiveOptionIndex; - } - } - return state.activeOptionIndex; - }, - compare, - isSelected, - nullable, - __demoMode - }), - [value, defaultValue, disabled, multiple, nullable, __demoMode, state] - ); - let lastActiveOption = (0, import_react19.useRef)( - data.activeOptionIndex !== null ? data.options[data.activeOptionIndex] : null - ); - (0, import_react19.useEffect)(() => { - let currentActiveOption = data.activeOptionIndex !== null ? data.options[data.activeOptionIndex] : null; - if (lastActiveOption.current !== currentActiveOption) { - lastActiveOption.current = currentActiveOption; - } - }); - useIsoMorphicEffect(() => { - state.dataRef.current = data; - }, [data]); - useOutsideClick( - [data.buttonRef, data.inputRef, data.optionsRef], - () => actions.closeCombobox(), - data.comboboxState === 0 /* Open */ - ); - let slot = (0, import_react19.useMemo)( - () => ({ - open: data.comboboxState === 0 /* Open */, - disabled, - activeIndex: data.activeOptionIndex, - activeOption: data.activeOptionIndex === null ? null : data.options[data.activeOptionIndex].dataRef.current.value, - value - }), - [data, disabled, value] - ); - let selectOption = useEvent((id) => { - let option = data.options.find((item) => item.id === id); - if (!option) - return; - onChange(option.dataRef.current.value); - }); - let selectActiveOption = useEvent(() => { - if (data.activeOptionIndex !== null) { - let { dataRef, id } = data.options[data.activeOptionIndex]; - onChange(dataRef.current.value); - actions.goToOption(4 /* Specific */, id); - } - }); - let openCombobox = useEvent(() => { - dispatch({ type: 0 /* OpenCombobox */ }); - defaultToFirstOption.current = true; - }); - let closeCombobox = useEvent(() => { - dispatch({ type: 1 /* CloseCombobox */ }); - defaultToFirstOption.current = false; - }); - let goToOption = useEvent((focus, id, trigger) => { - defaultToFirstOption.current = false; - if (focus === 4 /* Specific */) { - return dispatch({ type: 2 /* GoToOption */, focus: 4 /* Specific */, id, trigger }); - } - return dispatch({ type: 2 /* GoToOption */, focus, trigger }); - }); - let registerOption = useEvent((id, dataRef) => { - dispatch({ type: 3 /* RegisterOption */, id, dataRef }); - return () => { - var _a3; - if (((_a3 = lastActiveOption.current) == null ? void 0 : _a3.id) === id) { - defaultToFirstOption.current = true; - } - dispatch({ type: 4 /* UnregisterOption */, id }); - }; - }); - let registerLabel = useEvent((id) => { - dispatch({ type: 5 /* RegisterLabel */, id }); - return () => dispatch({ type: 5 /* RegisterLabel */, id: null }); - }); - let onChange = useEvent((value2) => { - return match(data.mode, { - [0 /* Single */]() { - return theirOnChange == null ? void 0 : theirOnChange(value2); - }, - [1 /* Multi */]() { - let copy = data.value.slice(); - let idx = copy.findIndex((item) => compare(item, value2)); - if (idx === -1) { - copy.push(value2); - } else { - copy.splice(idx, 1); - } - return theirOnChange == null ? void 0 : theirOnChange(copy); - } - }); - }); - let actions = (0, import_react19.useMemo)( - () => ({ - onChange, - registerOption, - registerLabel, - goToOption, - closeCombobox, - openCombobox, - selectActiveOption, - selectOption - }), - [] - ); - let ourProps = ref === null ? {} : { ref }; - let form = (0, import_react19.useRef)(null); - let d = useDisposables(); - (0, import_react19.useEffect)(() => { - if (!form.current) - return; - if (defaultValue === void 0) - return; - d.addEventListener(form.current, "reset", () => { - onChange(defaultValue); - }); - }, [ - form, - onChange - /* Explicitly ignoring `defaultValue` */ - ]); - return /* @__PURE__ */ import_react19.default.createElement(ComboboxActionsContext.Provider, { value: actions }, /* @__PURE__ */ import_react19.default.createElement(ComboboxDataContext.Provider, { value: data }, /* @__PURE__ */ import_react19.default.createElement( - OpenClosedProvider, - { - value: match(data.comboboxState, { - [0 /* Open */]: 1 /* Open */, - [1 /* Closed */]: 2 /* Closed */ - }) - }, - name != null && value != null && objectToFormEntries({ [name]: value }).map(([name2, value2], idx) => /* @__PURE__ */ import_react19.default.createElement( - Hidden, - { - features: 4 /* Hidden */, - ref: idx === 0 ? (element) => { - var _a3; - form.current = (_a3 = element == null ? void 0 : element.closest("form")) != null ? _a3 : null; - } : void 0, - ...compact({ - key: name2, - as: "input", - type: "hidden", - hidden: true, - readOnly: true, - form: formName, - name: name2, - value: value2 - }) - } - )), - render({ - ourProps, - theirProps, - slot, - defaultTag: DEFAULT_COMBOBOX_TAG, - name: "Combobox" - }) - ))); -} -var DEFAULT_INPUT_TAG = "input"; -function InputFn(props, ref) { - var _a3, _b, _c, _d; - let internalId = useId(); - let { - id = `headlessui-combobox-input-${internalId}`, - onChange, - displayValue, - // @ts-ignore: We know this MAY NOT exist for a given tag but we only care when it _does_ exist. - type = "text", - ...theirProps - } = props; - let data = useData("Combobox.Input"); - let actions = useActions("Combobox.Input"); - let inputRef = useSyncRefs(data.inputRef, ref); - let isTyping = (0, import_react19.useRef)(false); - let d = useDisposables(); - let currentDisplayValue = function() { - var _a4; - if (typeof displayValue === "function" && data.value !== void 0) { - return (_a4 = displayValue(data.value)) != null ? _a4 : ""; - } else if (typeof data.value === "string") { - return data.value; - } else { - return ""; - } - }(); - useWatch( - ([currentDisplayValue2, state], [oldCurrentDisplayValue, oldState]) => { - if (isTyping.current) - return; - if (!data.inputRef.current) - return; - if (oldState === 0 /* Open */ && state === 1 /* Closed */) { - data.inputRef.current.value = currentDisplayValue2; - } else if (currentDisplayValue2 !== oldCurrentDisplayValue) { - data.inputRef.current.value = currentDisplayValue2; - } - }, - [currentDisplayValue, data.comboboxState] - ); - useWatch( - ([newState], [oldState]) => { - if (newState === 0 /* Open */ && oldState === 1 /* Closed */) { - let input = data.inputRef.current; - if (!input) - return; - let currentValue = input.value; - let { selectionStart, selectionEnd, selectionDirection } = input; - input.value = ""; - input.value = currentValue; - if (selectionDirection !== null) { - input.setSelectionRange(selectionStart, selectionEnd, selectionDirection); - } else { - input.setSelectionRange(selectionStart, selectionEnd); - } - } - }, - [data.comboboxState] - ); - let isComposing = (0, import_react19.useRef)(false); - let composedChangeEvent = (0, import_react19.useRef)(null); - let handleCompositionStart = useEvent(() => { - isComposing.current = true; - }); - let handleCompositionEnd = useEvent(() => { - d.nextFrame(() => { - isComposing.current = false; - if (composedChangeEvent.current) { - actions.openCombobox(); - onChange == null ? void 0 : onChange(composedChangeEvent.current); - composedChangeEvent.current = null; - } - }); - }); - let handleKeyDown = useEvent((event) => { - isTyping.current = true; - switch (event.key) { - case "Backspace" /* Backspace */: - case "Delete" /* Delete */: - if (data.mode !== 0 /* Single */) - return; - if (!data.nullable) - return; - let input = event.currentTarget; - d.requestAnimationFrame(() => { - if (input.value === "") { - actions.onChange(null); - if (data.optionsRef.current) { - data.optionsRef.current.scrollTop = 0; - } - actions.goToOption(5 /* Nothing */); - } - }); - break; - case "Enter" /* Enter */: - isTyping.current = false; - if (data.comboboxState !== 0 /* Open */) - return; - if (isComposing.current) - return; - event.preventDefault(); - event.stopPropagation(); - if (data.activeOptionIndex === null) { - actions.closeCombobox(); - return; - } - actions.selectActiveOption(); - if (data.mode === 0 /* Single */) { - actions.closeCombobox(); - } - break; - case "ArrowDown" /* ArrowDown */: - isTyping.current = false; - event.preventDefault(); - event.stopPropagation(); - return match(data.comboboxState, { - [0 /* Open */]: () => { - actions.goToOption(2 /* Next */); - }, - [1 /* Closed */]: () => { - actions.openCombobox(); - } - }); - case "ArrowUp" /* ArrowUp */: - isTyping.current = false; - event.preventDefault(); - event.stopPropagation(); - return match(data.comboboxState, { - [0 /* Open */]: () => { - actions.goToOption(1 /* Previous */); - }, - [1 /* Closed */]: () => { - actions.openCombobox(); - d.nextFrame(() => { - if (!data.value) { - actions.goToOption(3 /* Last */); - } - }); - } - }); - case "Home" /* Home */: - if (event.shiftKey) { - break; - } - isTyping.current = false; - event.preventDefault(); - event.stopPropagation(); - return actions.goToOption(0 /* First */); - case "PageUp" /* PageUp */: - isTyping.current = false; - event.preventDefault(); - event.stopPropagation(); - return actions.goToOption(0 /* First */); - case "End" /* End */: - if (event.shiftKey) { - break; - } - isTyping.current = false; - event.preventDefault(); - event.stopPropagation(); - return actions.goToOption(3 /* Last */); - case "PageDown" /* PageDown */: - isTyping.current = false; - event.preventDefault(); - event.stopPropagation(); - return actions.goToOption(3 /* Last */); - case "Escape" /* Escape */: - isTyping.current = false; - if (data.comboboxState !== 0 /* Open */) - return; - event.preventDefault(); - if (data.optionsRef.current && !data.optionsPropsRef.current.static) { - event.stopPropagation(); - } - return actions.closeCombobox(); - case "Tab" /* Tab */: - isTyping.current = false; - if (data.comboboxState !== 0 /* Open */) - return; - if (data.mode === 0 /* Single */) - actions.selectActiveOption(); - actions.closeCombobox(); - break; - } - }); - let handleChange = useEvent((event) => { - if (isComposing.current) { - composedChangeEvent.current = event; - return; - } - actions.openCombobox(); - onChange == null ? void 0 : onChange(event); - }); - let handleBlur = useEvent(() => { - isTyping.current = false; - }); - let labelledby = useComputed(() => { - if (!data.labelId) - return void 0; - return [data.labelId].join(" "); - }, [data.labelId]); - let slot = (0, import_react19.useMemo)( - () => ({ open: data.comboboxState === 0 /* Open */, disabled: data.disabled }), - [data] - ); - let ourProps = { - ref: inputRef, - id, - role: "combobox", - type, - "aria-controls": (_a3 = data.optionsRef.current) == null ? void 0 : _a3.id, - "aria-expanded": data.disabled ? void 0 : data.comboboxState === 0 /* Open */, - "aria-activedescendant": data.activeOptionIndex === null ? void 0 : (_b = data.options[data.activeOptionIndex]) == null ? void 0 : _b.id, - "aria-labelledby": labelledby, - "aria-autocomplete": "list", - defaultValue: (_d = (_c = props.defaultValue) != null ? _c : data.defaultValue !== void 0 ? displayValue == null ? void 0 : displayValue(data.defaultValue) : null) != null ? _d : data.defaultValue, - disabled: data.disabled, - onCompositionStart: handleCompositionStart, - onCompositionEnd: handleCompositionEnd, - onKeyDown: handleKeyDown, - onChange: handleChange, - onBlur: handleBlur - }; - return render({ - ourProps, - theirProps, - slot, - defaultTag: DEFAULT_INPUT_TAG, - name: "Combobox.Input" - }); -} -var DEFAULT_BUTTON_TAG = "button"; -function ButtonFn(props, ref) { - var _a3; - let data = useData("Combobox.Button"); - let actions = useActions("Combobox.Button"); - let buttonRef = useSyncRefs(data.buttonRef, ref); - let internalId = useId(); - let { id = `headlessui-combobox-button-${internalId}`, ...theirProps } = props; - let d = useDisposables(); - let handleKeyDown = useEvent((event) => { - switch (event.key) { - case "ArrowDown" /* ArrowDown */: - event.preventDefault(); - event.stopPropagation(); - if (data.comboboxState === 1 /* Closed */) { - actions.openCombobox(); - } - return d.nextFrame(() => { - var _a4; - return (_a4 = data.inputRef.current) == null ? void 0 : _a4.focus({ preventScroll: true }); - }); - case "ArrowUp" /* ArrowUp */: - event.preventDefault(); - event.stopPropagation(); - if (data.comboboxState === 1 /* Closed */) { - actions.openCombobox(); - d.nextFrame(() => { - if (!data.value) { - actions.goToOption(3 /* Last */); - } - }); - } - return d.nextFrame(() => { - var _a4; - return (_a4 = data.inputRef.current) == null ? void 0 : _a4.focus({ preventScroll: true }); - }); - case "Escape" /* Escape */: - if (data.comboboxState !== 0 /* Open */) - return; - event.preventDefault(); - if (data.optionsRef.current && !data.optionsPropsRef.current.static) { - event.stopPropagation(); - } - actions.closeCombobox(); - return d.nextFrame(() => { - var _a4; - return (_a4 = data.inputRef.current) == null ? void 0 : _a4.focus({ preventScroll: true }); - }); - default: - return; - } - }); - let handleClick = useEvent((event) => { - if (isDisabledReactIssue7711(event.currentTarget)) - return event.preventDefault(); - if (data.comboboxState === 0 /* Open */) { - actions.closeCombobox(); - } else { - event.preventDefault(); - actions.openCombobox(); - } - d.nextFrame(() => { - var _a4; - return (_a4 = data.inputRef.current) == null ? void 0 : _a4.focus({ preventScroll: true }); - }); - }); - let labelledby = useComputed(() => { - if (!data.labelId) - return void 0; - return [data.labelId, id].join(" "); - }, [data.labelId, id]); - let slot = (0, import_react19.useMemo)( - () => ({ - open: data.comboboxState === 0 /* Open */, - disabled: data.disabled, - value: data.value - }), - [data] - ); - let ourProps = { - ref: buttonRef, - id, - type: useResolveButtonType(props, data.buttonRef), - tabIndex: -1, - "aria-haspopup": "listbox", - "aria-controls": (_a3 = data.optionsRef.current) == null ? void 0 : _a3.id, - "aria-expanded": data.disabled ? void 0 : data.comboboxState === 0 /* Open */, - "aria-labelledby": labelledby, - disabled: data.disabled, - onClick: handleClick, - onKeyDown: handleKeyDown - }; - return render({ - ourProps, - theirProps, - slot, - defaultTag: DEFAULT_BUTTON_TAG, - name: "Combobox.Button" - }); -} -var DEFAULT_LABEL_TAG = "label"; -function LabelFn(props, ref) { - let internalId = useId(); - let { id = `headlessui-combobox-label-${internalId}`, ...theirProps } = props; - let data = useData("Combobox.Label"); - let actions = useActions("Combobox.Label"); - let labelRef = useSyncRefs(data.labelRef, ref); - useIsoMorphicEffect(() => actions.registerLabel(id), [id]); - let handleClick = useEvent(() => { - var _a3; - return (_a3 = data.inputRef.current) == null ? void 0 : _a3.focus({ preventScroll: true }); - }); - let slot = (0, import_react19.useMemo)( - () => ({ open: data.comboboxState === 0 /* Open */, disabled: data.disabled }), - [data] - ); - let ourProps = { ref: labelRef, id, onClick: handleClick }; - return render({ - ourProps, - theirProps, - slot, - defaultTag: DEFAULT_LABEL_TAG, - name: "Combobox.Label" - }); -} -var DEFAULT_OPTIONS_TAG = "ul"; -var OptionsRenderFeatures = 1 /* RenderStrategy */ | 2 /* Static */; -function OptionsFn(props, ref) { - let internalId = useId(); - let { id = `headlessui-combobox-options-${internalId}`, hold = false, ...theirProps } = props; - let data = useData("Combobox.Options"); - let optionsRef = useSyncRefs(data.optionsRef, ref); - let usesOpenClosedState = useOpenClosed(); - let visible = (() => { - if (usesOpenClosedState !== null) { - return (usesOpenClosedState & 1 /* Open */) === 1 /* Open */; - } - return data.comboboxState === 0 /* Open */; - })(); - useIsoMorphicEffect(() => { - var _a3; - data.optionsPropsRef.current.static = (_a3 = props.static) != null ? _a3 : false; - }, [data.optionsPropsRef, props.static]); - useIsoMorphicEffect(() => { - data.optionsPropsRef.current.hold = hold; - }, [data.optionsPropsRef, hold]); - useTreeWalker({ - container: data.optionsRef.current, - enabled: data.comboboxState === 0 /* Open */, - accept(node) { - if (node.getAttribute("role") === "option") - return NodeFilter.FILTER_REJECT; - if (node.hasAttribute("role")) - return NodeFilter.FILTER_SKIP; - return NodeFilter.FILTER_ACCEPT; - }, - walk(node) { - node.setAttribute("role", "none"); - } - }); - let labelledby = useComputed( - () => { - var _a3, _b; - return (_b = data.labelId) != null ? _b : (_a3 = data.buttonRef.current) == null ? void 0 : _a3.id; - }, - [data.labelId, data.buttonRef.current] - ); - let slot = (0, import_react19.useMemo)( - () => ({ open: data.comboboxState === 0 /* Open */ }), - [data] - ); - let ourProps = { - "aria-labelledby": labelledby, - role: "listbox", - "aria-multiselectable": data.mode === 1 /* Multi */ ? true : void 0, - id, - ref: optionsRef - }; - return render({ - ourProps, - theirProps, - slot, - defaultTag: DEFAULT_OPTIONS_TAG, - features: OptionsRenderFeatures, - visible, - name: "Combobox.Options" - }); -} -var DEFAULT_OPTION_TAG = "li"; -function OptionFn(props, ref) { - var _a3, _b; - let internalId = useId(); - let { - id = `headlessui-combobox-option-${internalId}`, - disabled = false, - value, - ...theirProps - } = props; - let data = useData("Combobox.Option"); - let actions = useActions("Combobox.Option"); - let active = data.activeOptionIndex !== null ? data.options[data.activeOptionIndex].id === id : false; - let selected = data.isSelected(value); - let internalOptionRef = (0, import_react19.useRef)(null); - let bag = useLatestValue({ - disabled, - value, - domRef: internalOptionRef, - textValue: (_b = (_a3 = internalOptionRef.current) == null ? void 0 : _a3.textContent) == null ? void 0 : _b.toLowerCase() - }); - let optionRef = useSyncRefs(ref, internalOptionRef); - let select = useEvent(() => actions.selectOption(id)); - useIsoMorphicEffect(() => actions.registerOption(id, bag), [bag, id]); - let enableScrollIntoView = (0, import_react19.useRef)(data.__demoMode ? false : true); - useIsoMorphicEffect(() => { - if (!data.__demoMode) - return; - let d = disposables(); - d.requestAnimationFrame(() => { - enableScrollIntoView.current = true; - }); - return d.dispose; - }, []); - useIsoMorphicEffect(() => { - if (data.comboboxState !== 0 /* Open */) - return; - if (!active) - return; - if (!enableScrollIntoView.current) - return; - if (data.activationTrigger === 0 /* Pointer */) - return; - let d = disposables(); - d.requestAnimationFrame(() => { - var _a4, _b2; - (_b2 = (_a4 = internalOptionRef.current) == null ? void 0 : _a4.scrollIntoView) == null ? void 0 : _b2.call(_a4, { block: "nearest" }); - }); - return d.dispose; - }, [ - internalOptionRef, - active, - data.comboboxState, - data.activationTrigger, - /* We also want to trigger this when the position of the active item changes so that we can re-trigger the scrollIntoView */ - data.activeOptionIndex - ]); - let handleClick = useEvent((event) => { - if (disabled) - return event.preventDefault(); - select(); - if (data.mode === 0 /* Single */) { - actions.closeCombobox(); - } - if (!isMobile()) { - requestAnimationFrame(() => { - var _a4; - return (_a4 = data.inputRef.current) == null ? void 0 : _a4.focus(); - }); - } - }); - let handleFocus = useEvent(() => { - if (disabled) - return actions.goToOption(5 /* Nothing */); - actions.goToOption(4 /* Specific */, id); - }); - let pointer = useTrackedPointer(); - let handleEnter = useEvent((evt) => pointer.update(evt)); - let handleMove = useEvent((evt) => { - if (!pointer.wasMoved(evt)) - return; - if (disabled) - return; - if (active) - return; - actions.goToOption(4 /* Specific */, id, 0 /* Pointer */); - }); - let handleLeave = useEvent((evt) => { - if (!pointer.wasMoved(evt)) - return; - if (disabled) - return; - if (!active) - return; - if (data.optionsPropsRef.current.hold) - return; - actions.goToOption(5 /* Nothing */); - }); - let slot = (0, import_react19.useMemo)( - () => ({ active, selected, disabled }), - [active, selected, disabled] - ); - let ourProps = { - id, - ref: optionRef, - role: "option", - tabIndex: disabled === true ? void 0 : -1, - "aria-disabled": disabled === true ? true : void 0, - // According to the WAI-ARIA best practices, we should use aria-checked for - // multi-select,but Voice-Over disagrees. So we use aria-checked instead for - // both single and multi-select. - "aria-selected": selected, - disabled: void 0, - // Never forward the `disabled` prop - onClick: handleClick, - onFocus: handleFocus, - onPointerEnter: handleEnter, - onMouseEnter: handleEnter, - onPointerMove: handleMove, - onMouseMove: handleMove, - onPointerLeave: handleLeave, - onMouseLeave: handleLeave - }; - return render({ - ourProps, - theirProps, - slot, - defaultTag: DEFAULT_OPTION_TAG, - name: "Combobox.Option" - }); -} -var ComboboxRoot = forwardRefWithAs(ComboboxFn); -var Button = forwardRefWithAs(ButtonFn); -var Input = forwardRefWithAs(InputFn); -var Label = forwardRefWithAs(LabelFn); -var Options = forwardRefWithAs(OptionsFn); -var Option = forwardRefWithAs(OptionFn); -var Combobox = Object.assign(ComboboxRoot, { Input, Button, Label, Options, Option }); - -// src/components/dialog/dialog.tsx -var import_react31 = __toESM(__webpack_require__(/*! react */ "react"), 1); - -// src/components/focus-trap/focus-trap.tsx -var import_react25 = __toESM(__webpack_require__(/*! react */ "react"), 1); - -// src/hooks/use-tab-direction.ts -var import_react20 = __webpack_require__(/*! react */ "react"); -function useTabDirection() { - let direction = (0, import_react20.useRef)(0 /* Forwards */); - useWindowEvent( - "keydown", - (event) => { - if (event.key === "Tab") { - direction.current = event.shiftKey ? 1 /* Backwards */ : 0 /* Forwards */; - } - }, - true - ); - return direction; -} - -// src/hooks/use-is-mounted.ts -var import_react21 = __webpack_require__(/*! react */ "react"); -function useIsMounted() { - let mounted = (0, import_react21.useRef)(false); - useIsoMorphicEffect(() => { - mounted.current = true; - return () => { - mounted.current = false; - }; - }, []); - return mounted; -} - -// src/hooks/use-owner.ts -var import_react22 = __webpack_require__(/*! react */ "react"); -function useOwnerDocument(...args) { - return (0, import_react22.useMemo)(() => getOwnerDocument(...args), [...args]); -} - -// src/hooks/use-event-listener.ts -var import_react23 = __webpack_require__(/*! react */ "react"); -function useEventListener(element, type, listener, options) { - let listenerRef = useLatestValue(listener); - (0, import_react23.useEffect)(() => { - element = element != null ? element : window; - function handler(event) { - listenerRef.current(event); - } - element.addEventListener(type, handler, options); - return () => element.removeEventListener(type, handler, options); - }, [element, type, options]); -} - -// src/utils/document-ready.ts -function onDocumentReady(cb) { - function check() { - if (document.readyState === "loading") - return; - cb(); - document.removeEventListener("DOMContentLoaded", check); - } - if (typeof window !== "undefined" && typeof document !== "undefined") { - document.addEventListener("DOMContentLoaded", check); - check(); - } -} - -// src/hooks/use-on-unmount.ts -var import_react24 = __webpack_require__(/*! react */ "react"); -function useOnUnmount(cb) { - let stableCb = useEvent(cb); - let trulyUnmounted = (0, import_react24.useRef)(false); - (0, import_react24.useEffect)(() => { - trulyUnmounted.current = false; - return () => { - trulyUnmounted.current = true; - microTask(() => { - if (!trulyUnmounted.current) - return; - stableCb(); - }); - }; - }, [stableCb]); -} - -// src/components/focus-trap/focus-trap.tsx -function resolveContainers(containers) { - if (!containers) - return /* @__PURE__ */ new Set(); - if (typeof containers === "function") - return new Set(containers()); - let all = /* @__PURE__ */ new Set(); - for (let container of containers.current) { - if (container.current instanceof HTMLElement) { - all.add(container.current); - } - } - return all; -} -var DEFAULT_FOCUS_TRAP_TAG = "div"; -var Features3 = /* @__PURE__ */ ((Features4) => { - Features4[Features4["None"] = 1] = "None"; - Features4[Features4["InitialFocus"] = 2] = "InitialFocus"; - Features4[Features4["TabLock"] = 4] = "TabLock"; - Features4[Features4["FocusLock"] = 8] = "FocusLock"; - Features4[Features4["RestoreFocus"] = 16] = "RestoreFocus"; - Features4[Features4["All"] = 30] = "All"; - return Features4; -})(Features3 || {}); -function FocusTrapFn(props, ref) { - let container = (0, import_react25.useRef)(null); - let focusTrapRef = useSyncRefs(container, ref); - let { initialFocus, containers, features = 30 /* All */, ...theirProps } = props; - if (!useServerHandoffComplete()) { - features = 1 /* None */; - } - let ownerDocument = useOwnerDocument(container); - useRestoreFocus({ ownerDocument }, Boolean(features & 16 /* RestoreFocus */)); - let previousActiveElement = useInitialFocus( - { ownerDocument, container, initialFocus }, - Boolean(features & 2 /* InitialFocus */) - ); - useFocusLock( - { ownerDocument, container, containers, previousActiveElement }, - Boolean(features & 8 /* FocusLock */) - ); - let direction = useTabDirection(); - let handleFocus = useEvent((e) => { - let el = container.current; - if (!el) - return; - let wrapper = false ? 0 : (cb) => cb(); - wrapper(() => { - match(direction.current, { - [0 /* Forwards */]: () => { - focusIn(el, 1 /* First */, { skipElements: [e.relatedTarget] }); - }, - [1 /* Backwards */]: () => { - focusIn(el, 8 /* Last */, { skipElements: [e.relatedTarget] }); - } - }); - }); - }); - let d = useDisposables(); - let recentlyUsedTabKey = (0, import_react25.useRef)(false); - let ourProps = { - ref: focusTrapRef, - onKeyDown(e) { - if (e.key == "Tab") { - recentlyUsedTabKey.current = true; - d.requestAnimationFrame(() => { - recentlyUsedTabKey.current = false; - }); - } - }, - onBlur(e) { - let allContainers = resolveContainers(containers); - if (container.current instanceof HTMLElement) - allContainers.add(container.current); - let relatedTarget = e.relatedTarget; - if (!(relatedTarget instanceof HTMLElement)) - return; - if (relatedTarget.dataset.headlessuiFocusGuard === "true") { - return; - } - if (!contains(allContainers, relatedTarget)) { - if (recentlyUsedTabKey.current) { - focusIn( - container.current, - match(direction.current, { - [0 /* Forwards */]: () => 4 /* Next */, - [1 /* Backwards */]: () => 2 /* Previous */ - }) | 16 /* WrapAround */, - { relativeTo: e.target } - ); - } else if (e.target instanceof HTMLElement) { - focusElement(e.target); - } - } - } - }; - return /* @__PURE__ */ import_react25.default.createElement(import_react25.default.Fragment, null, Boolean(features & 4 /* TabLock */) && /* @__PURE__ */ import_react25.default.createElement( - Hidden, - { - as: "button", - type: "button", - "data-headlessui-focus-guard": true, - onFocus: handleFocus, - features: 2 /* Focusable */ - } - ), render({ - ourProps, - theirProps, - defaultTag: DEFAULT_FOCUS_TRAP_TAG, - name: "FocusTrap" - }), Boolean(features & 4 /* TabLock */) && /* @__PURE__ */ import_react25.default.createElement( - Hidden, - { - as: "button", - type: "button", - "data-headlessui-focus-guard": true, - onFocus: handleFocus, - features: 2 /* Focusable */ - } - )); -} -var FocusTrapRoot = forwardRefWithAs(FocusTrapFn); -var FocusTrap = Object.assign(FocusTrapRoot, { - features: Features3 -}); -var history = []; -onDocumentReady(() => { - function handle(e) { - if (!(e.target instanceof HTMLElement)) - return; - if (e.target === document.body) - return; - if (history[0] === e.target) - return; - history.unshift(e.target); - history = history.filter((x) => x != null && x.isConnected); - history.splice(10); - } - window.addEventListener("click", handle, { capture: true }); - window.addEventListener("mousedown", handle, { capture: true }); - window.addEventListener("focus", handle, { capture: true }); - document.body.addEventListener("click", handle, { capture: true }); - document.body.addEventListener("mousedown", handle, { capture: true }); - document.body.addEventListener("focus", handle, { capture: true }); -}); -function useRestoreElement(enabled = true) { - let localHistory = (0, import_react25.useRef)(history.slice()); - useWatch( - ([newEnabled], [oldEnabled]) => { - if (oldEnabled === true && newEnabled === false) { - microTask(() => { - localHistory.current.splice(0); - }); - } - if (oldEnabled === false && newEnabled === true) { - localHistory.current = history.slice(); - } - }, - [enabled, history, localHistory] - ); - return useEvent(() => { - var _a3; - return (_a3 = localHistory.current.find((x) => x != null && x.isConnected)) != null ? _a3 : null; - }); -} -function useRestoreFocus({ ownerDocument }, enabled) { - let getRestoreElement = useRestoreElement(enabled); - useWatch(() => { - if (enabled) - return; - if ((ownerDocument == null ? void 0 : ownerDocument.activeElement) === (ownerDocument == null ? void 0 : ownerDocument.body)) { - focusElement(getRestoreElement()); - } - }, [enabled]); - useOnUnmount(() => { - if (!enabled) - return; - focusElement(getRestoreElement()); - }); -} -function useInitialFocus({ - ownerDocument, - container, - initialFocus -}, enabled) { - let previousActiveElement = (0, import_react25.useRef)(null); - let mounted = useIsMounted(); - useWatch(() => { - if (!enabled) - return; - let containerElement = container.current; - if (!containerElement) - return; - microTask(() => { - if (!mounted.current) { - return; - } - let activeElement = ownerDocument == null ? void 0 : ownerDocument.activeElement; - if (initialFocus == null ? void 0 : initialFocus.current) { - if ((initialFocus == null ? void 0 : initialFocus.current) === activeElement) { - previousActiveElement.current = activeElement; - return; - } - } else if (containerElement.contains(activeElement)) { - previousActiveElement.current = activeElement; - return; - } - if (initialFocus == null ? void 0 : initialFocus.current) { - focusElement(initialFocus.current); - } else { - if (focusIn(containerElement, 1 /* First */) === 0 /* Error */) { - console.warn("There are no focusable elements inside the "); - } - } - previousActiveElement.current = ownerDocument == null ? void 0 : ownerDocument.activeElement; - }); - }, [enabled]); - return previousActiveElement; -} -function useFocusLock({ - ownerDocument, - container, - containers, - previousActiveElement -}, enabled) { - let mounted = useIsMounted(); - useEventListener( - ownerDocument == null ? void 0 : ownerDocument.defaultView, - "focus", - (event) => { - if (!enabled) - return; - if (!mounted.current) - return; - let allContainers = resolveContainers(containers); - if (container.current instanceof HTMLElement) - allContainers.add(container.current); - let previous = previousActiveElement.current; - if (!previous) - return; - let toElement = event.target; - if (toElement && toElement instanceof HTMLElement) { - if (!contains(allContainers, toElement)) { - event.preventDefault(); - event.stopPropagation(); - focusElement(previous); - } else { - previousActiveElement.current = toElement; - focusElement(toElement); - } - } else { - focusElement(previousActiveElement.current); - } - }, - true - ); -} -function contains(containers, element) { - for (let container of containers) { - if (container.contains(element)) - return true; - } - return false; -} - -// src/components/portal/portal.tsx -var import_react27 = __toESM(__webpack_require__(/*! react */ "react"), 1); -var import_react_dom = __webpack_require__(/*! react-dom */ "react-dom"); - -// src/internal/portal-force-root.tsx -var import_react26 = __toESM(__webpack_require__(/*! react */ "react"), 1); -var ForcePortalRootContext = (0, import_react26.createContext)(false); -function usePortalRoot() { - return (0, import_react26.useContext)(ForcePortalRootContext); -} -function ForcePortalRoot(props) { - return /* @__PURE__ */ import_react26.default.createElement(ForcePortalRootContext.Provider, { value: props.force }, props.children); -} - -// src/components/portal/portal.tsx -function usePortalTarget(ref) { - let forceInRoot = usePortalRoot(); - let groupTarget = (0, import_react27.useContext)(PortalGroupContext); - let ownerDocument = useOwnerDocument(ref); - let [target, setTarget] = (0, import_react27.useState)(() => { - if (!forceInRoot && groupTarget !== null) - return null; - if (env.isServer) - return null; - let existingRoot = ownerDocument == null ? void 0 : ownerDocument.getElementById("headlessui-portal-root"); - if (existingRoot) - return existingRoot; - if (ownerDocument === null) - return null; - let root = ownerDocument.createElement("div"); - root.setAttribute("id", "headlessui-portal-root"); - return ownerDocument.body.appendChild(root); - }); - (0, import_react27.useEffect)(() => { - if (target === null) - return; - if (!(ownerDocument == null ? void 0 : ownerDocument.body.contains(target))) { - ownerDocument == null ? void 0 : ownerDocument.body.appendChild(target); - } - }, [target, ownerDocument]); - (0, import_react27.useEffect)(() => { - if (forceInRoot) - return; - if (groupTarget === null) - return; - setTarget(groupTarget.current); - }, [groupTarget, setTarget, forceInRoot]); - return target; -} -var DEFAULT_PORTAL_TAG = import_react27.Fragment; -function PortalFn(props, ref) { - let theirProps = props; - let internalPortalRootRef = (0, import_react27.useRef)(null); - let portalRef = useSyncRefs( - optionalRef((ref2) => { - internalPortalRootRef.current = ref2; - }), - ref - ); - let ownerDocument = useOwnerDocument(internalPortalRootRef); - let target = usePortalTarget(internalPortalRootRef); - let [element] = (0, import_react27.useState)( - () => { - var _a3; - return env.isServer ? null : (_a3 = ownerDocument == null ? void 0 : ownerDocument.createElement("div")) != null ? _a3 : null; - } - ); - let parent = (0, import_react27.useContext)(PortalParentContext); - let ready = useServerHandoffComplete(); - useIsoMorphicEffect(() => { - if (!target || !element) - return; - if (!target.contains(element)) { - element.setAttribute("data-headlessui-portal", ""); - target.appendChild(element); - } - }, [target, element]); - useIsoMorphicEffect(() => { - if (!element) - return; - if (!parent) - return; - return parent.register(element); - }, [parent, element]); - useOnUnmount(() => { - var _a3; - if (!target || !element) - return; - if (element instanceof Node && target.contains(element)) { - target.removeChild(element); - } - if (target.childNodes.length <= 0) { - (_a3 = target.parentElement) == null ? void 0 : _a3.removeChild(target); - } - }); - if (!ready) - return null; - let ourProps = { ref: portalRef }; - return !target || !element ? null : (0, import_react_dom.createPortal)( - render({ - ourProps, - theirProps, - defaultTag: DEFAULT_PORTAL_TAG, - name: "Portal" - }), - element - ); -} -var DEFAULT_GROUP_TAG = import_react27.Fragment; -var PortalGroupContext = (0, import_react27.createContext)(null); -function GroupFn(props, ref) { - let { target, ...theirProps } = props; - let groupRef = useSyncRefs(ref); - let ourProps = { ref: groupRef }; - return /* @__PURE__ */ import_react27.default.createElement(PortalGroupContext.Provider, { value: target }, render({ - ourProps, - theirProps, - defaultTag: DEFAULT_GROUP_TAG, - name: "Popover.Group" - })); -} -var PortalParentContext = (0, import_react27.createContext)(null); -function useNestedPortals() { - let parent = (0, import_react27.useContext)(PortalParentContext); - let portals = (0, import_react27.useRef)([]); - let register = useEvent((portal) => { - portals.current.push(portal); - if (parent) - parent.register(portal); - return () => unregister(portal); - }); - let unregister = useEvent((portal) => { - let idx = portals.current.indexOf(portal); - if (idx !== -1) - portals.current.splice(idx, 1); - if (parent) - parent.unregister(portal); - }); - let api = (0, import_react27.useMemo)( - () => ({ register, unregister, portals }), - [register, unregister, portals] - ); - return [ - portals, - (0, import_react27.useMemo)(() => { - return function PortalWrapper({ children }) { - return /* @__PURE__ */ import_react27.default.createElement(PortalParentContext.Provider, { value: api }, children); - }; - }, [api]) - ]; -} -var PortalRoot = forwardRefWithAs(PortalFn); -var Group = forwardRefWithAs(GroupFn); -var Portal = Object.assign(PortalRoot, { Group }); - -// src/components/description/description.tsx -var import_react28 = __toESM(__webpack_require__(/*! react */ "react"), 1); -var DescriptionContext = (0, import_react28.createContext)(null); -function useDescriptionContext() { - let context = (0, import_react28.useContext)(DescriptionContext); - if (context === null) { - let err = new Error( - "You used a component, but it is not inside a relevant parent." - ); - if (Error.captureStackTrace) - Error.captureStackTrace(err, useDescriptionContext); - throw err; - } - return context; -} -function useDescriptions() { - let [descriptionIds, setDescriptionIds] = (0, import_react28.useState)([]); - return [ - // The actual id's as string or undefined - descriptionIds.length > 0 ? descriptionIds.join(" ") : void 0, - // The provider component - (0, import_react28.useMemo)(() => { - return function DescriptionProvider(props) { - let register = useEvent((value) => { - setDescriptionIds((existing) => [...existing, value]); - return () => setDescriptionIds((existing) => { - let clone = existing.slice(); - let idx = clone.indexOf(value); - if (idx !== -1) - clone.splice(idx, 1); - return clone; - }); - }); - let contextBag = (0, import_react28.useMemo)( - () => ({ register, slot: props.slot, name: props.name, props: props.props }), - [register, props.slot, props.name, props.props] - ); - return /* @__PURE__ */ import_react28.default.createElement(DescriptionContext.Provider, { value: contextBag }, props.children); - }; - }, [setDescriptionIds]) - ]; -} -var DEFAULT_DESCRIPTION_TAG = "p"; -function DescriptionFn(props, ref) { - let internalId = useId(); - let { id = `headlessui-description-${internalId}`, ...theirProps } = props; - let context = useDescriptionContext(); - let descriptionRef = useSyncRefs(ref); - useIsoMorphicEffect(() => context.register(id), [id, context.register]); - let ourProps = { ref: descriptionRef, ...context.props, id }; - return render({ - ourProps, - theirProps, - slot: context.slot || {}, - defaultTag: DEFAULT_DESCRIPTION_TAG, - name: context.name || "Description" - }); -} -var DescriptionRoot = forwardRefWithAs(DescriptionFn); -var Description = Object.assign(DescriptionRoot, { - // -}); - -// src/internal/stack-context.tsx -var import_react29 = __toESM(__webpack_require__(/*! react */ "react"), 1); -var StackContext = (0, import_react29.createContext)(() => { -}); -StackContext.displayName = "StackContext"; -function useStackContext() { - return (0, import_react29.useContext)(StackContext); -} -function StackProvider({ - children, - onUpdate, - type, - element, - enabled -}) { - let parentUpdate = useStackContext(); - let notify = useEvent((...args) => { - onUpdate == null ? void 0 : onUpdate(...args); - parentUpdate(...args); - }); - useIsoMorphicEffect(() => { - let shouldNotify = enabled === void 0 || enabled === true; - shouldNotify && notify(0 /* Add */, type, element); - return () => { - shouldNotify && notify(1 /* Remove */, type, element); - }; - }, [notify, type, element, enabled]); - return /* @__PURE__ */ import_react29.default.createElement(StackContext.Provider, { value: notify }, children); -} - -// src/use-sync-external-store-shim/index.ts -var React11 = __toESM(__webpack_require__(/*! react */ "react"), 1); - -// src/use-sync-external-store-shim/useSyncExternalStoreShimClient.ts -var React10 = __toESM(__webpack_require__(/*! react */ "react"), 1); -function isPolyfill(x, y) { - return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y; -} -var is = typeof Object.is === "function" ? Object.is : isPolyfill; -var { useState: useState8, useEffect: useEffect14, useLayoutEffect: useLayoutEffect2, useDebugValue } = React10; -var didWarnOld18Alpha = false; -var didWarnUncachedGetSnapshot = false; -function useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) { - if (true) { - if (!didWarnOld18Alpha) { - if ("startTransition" in React10) { - didWarnOld18Alpha = true; - console.error( - "You are using an outdated, pre-release alpha of React 18 that does not support useSyncExternalStore. The use-sync-external-store shim will not work correctly. Upgrade to a newer pre-release." - ); - } - } - } - const value = getSnapshot(); - if (true) { - if (!didWarnUncachedGetSnapshot) { - const cachedValue = getSnapshot(); - if (!is(value, cachedValue)) { - console.error("The result of getSnapshot should be cached to avoid an infinite loop"); - didWarnUncachedGetSnapshot = true; - } - } - } - const [{ inst }, forceUpdate] = useState8({ inst: { value, getSnapshot } }); - useLayoutEffect2(() => { - inst.value = value; - inst.getSnapshot = getSnapshot; - if (checkIfSnapshotChanged(inst)) { - forceUpdate({ inst }); - } - }, [subscribe, value, getSnapshot]); - useEffect14(() => { - if (checkIfSnapshotChanged(inst)) { - forceUpdate({ inst }); - } - const handleStoreChange = () => { - if (checkIfSnapshotChanged(inst)) { - forceUpdate({ inst }); - } - }; - return subscribe(handleStoreChange); - }, [subscribe]); - useDebugValue(value); - return value; -} -function checkIfSnapshotChanged(inst) { - const latestGetSnapshot = inst.getSnapshot; - const prevValue = inst.value; - try { - const nextValue = latestGetSnapshot(); - return !is(prevValue, nextValue); - } catch (error) { - return true; - } -} - -// src/use-sync-external-store-shim/useSyncExternalStoreShimServer.ts -function useSyncExternalStore2(subscribe, getSnapshot, getServerSnapshot) { - return getSnapshot(); -} - -// src/use-sync-external-store-shim/index.ts -var canUseDOM = !!(typeof window !== "undefined" && typeof window.document !== "undefined" && typeof window.document.createElement !== "undefined"); -var isServerEnvironment = !canUseDOM; -var shim = isServerEnvironment ? useSyncExternalStore2 : useSyncExternalStore; -var useSyncExternalStore3 = "useSyncExternalStore" in React11 ? ((r) => r.useSyncExternalStore)(React11) : shim; - -// src/hooks/use-store.ts -function useStore(store) { - return useSyncExternalStore3(store.subscribe, store.getSnapshot, store.getSnapshot); -} - -// src/utils/store.ts -function createStore(initial, actions) { - let state = initial(); - let listeners = /* @__PURE__ */ new Set(); - return { - getSnapshot() { - return state; - }, - subscribe(onChange) { - listeners.add(onChange); - return () => listeners.delete(onChange); - }, - dispatch(key, ...args) { - let newState = actions[key].call(state, ...args); - if (newState) { - state = newState; - listeners.forEach((listener) => listener()); - } - } - }; -} - -// src/hooks/document-overflow/adjust-scrollbar-padding.ts -function adjustScrollbarPadding() { - let scrollbarWidthBefore; - return { - before({ doc }) { - var _a3; - let documentElement = doc.documentElement; - let ownerWindow = (_a3 = doc.defaultView) != null ? _a3 : window; - scrollbarWidthBefore = ownerWindow.innerWidth - documentElement.clientWidth; - }, - after({ doc, d }) { - let documentElement = doc.documentElement; - let scrollbarWidthAfter = documentElement.clientWidth - documentElement.offsetWidth; - let scrollbarWidth = scrollbarWidthBefore - scrollbarWidthAfter; - d.style(documentElement, "paddingRight", `${scrollbarWidth}px`); - } - }; -} - -// src/hooks/document-overflow/handle-ios-locking.ts -function handleIOSLocking() { - if (!isIOS()) { - return {}; - } - let scrollPosition; - return { - before() { - scrollPosition = window.pageYOffset; - }, - after({ doc, d, meta }) { - function inAllowedContainer(el) { - return meta.containers.flatMap((resolve) => resolve()).some((container) => container.contains(el)); - } - d.style(doc.body, "marginTop", `-${scrollPosition}px`); - window.scrollTo(0, 0); - let scrollToElement = null; - d.addEventListener( - doc, - "click", - (e) => { - if (!(e.target instanceof HTMLElement)) { - return; - } - try { - let anchor = e.target.closest("a"); - if (!anchor) - return; - let { hash } = new URL(anchor.href); - let el = doc.querySelector(hash); - if (el && !inAllowedContainer(el)) { - scrollToElement = el; - } - } catch (err) { - } - }, - true - ); - d.addEventListener( - doc, - "touchmove", - (e) => { - if (e.target instanceof HTMLElement && !inAllowedContainer(e.target)) { - e.preventDefault(); - } - }, - { passive: false } - ); - d.add(() => { - window.scrollTo(0, window.pageYOffset + scrollPosition); - if (scrollToElement && scrollToElement.isConnected) { - scrollToElement.scrollIntoView({ block: "nearest" }); - scrollToElement = null; - } - }); - } - }; -} - -// src/hooks/document-overflow/prevent-scroll.ts -function preventScroll() { - return { - before({ doc, d }) { - d.style(doc.documentElement, "overflow", "hidden"); - } - }; -} - -// src/hooks/document-overflow/overflow-store.ts -function buildMeta(fns) { - let tmp = {}; - for (let fn of fns) { - Object.assign(tmp, fn(tmp)); - } - return tmp; -} -var overflows = createStore(() => /* @__PURE__ */ new Map(), { - PUSH(doc, meta) { - var _a3; - let entry = (_a3 = this.get(doc)) != null ? _a3 : { - doc, - count: 0, - d: disposables(), - meta: /* @__PURE__ */ new Set() - }; - entry.count++; - entry.meta.add(meta); - this.set(doc, entry); - return this; - }, - POP(doc, meta) { - let entry = this.get(doc); - if (entry) { - entry.count--; - entry.meta.delete(meta); - } - return this; - }, - SCROLL_PREVENT({ doc, d, meta }) { - let ctx = { - doc, - d, - meta: buildMeta(meta) - }; - let steps = [ - handleIOSLocking(), - adjustScrollbarPadding(), - preventScroll() - ]; - steps.forEach(({ before }) => before == null ? void 0 : before(ctx)); - steps.forEach(({ after }) => after == null ? void 0 : after(ctx)); - }, - SCROLL_ALLOW({ d }) { - d.dispose(); - }, - TEARDOWN({ doc }) { - this.delete(doc); - } -}); -overflows.subscribe(() => { - let docs = overflows.getSnapshot(); - let styles = /* @__PURE__ */ new Map(); - for (let [doc] of docs) { - styles.set(doc, doc.documentElement.style.overflow); - } - for (let entry of docs.values()) { - let isHidden = styles.get(entry.doc) === "hidden"; - let isLocked = entry.count !== 0; - let willChange = isLocked && !isHidden || !isLocked && isHidden; - if (willChange) { - overflows.dispatch(entry.count > 0 ? "SCROLL_PREVENT" : "SCROLL_ALLOW", entry); - } - if (entry.count === 0) { - overflows.dispatch("TEARDOWN", entry); - } - } -}); - -// src/hooks/document-overflow/use-document-overflow.ts -function useDocumentOverflowLockedEffect(doc, shouldBeLocked, meta) { - let store = useStore(overflows); - let entry = doc ? store.get(doc) : void 0; - let locked = entry ? entry.count > 0 : false; - useIsoMorphicEffect(() => { - if (!doc || !shouldBeLocked) { - return; - } - overflows.dispatch("PUSH", doc, meta); - return () => overflows.dispatch("POP", doc, meta); - }, [shouldBeLocked, doc]); - return locked; -} - -// src/hooks/use-inert.tsx -var originals = /* @__PURE__ */ new Map(); -var counts = /* @__PURE__ */ new Map(); -function useInert(node, enabled = true) { - useIsoMorphicEffect(() => { - var _a3; - if (!enabled) - return; - let element = typeof node === "function" ? node() : node.current; - if (!element) - return; - function cleanup() { - var _a4; - if (!element) - return; - let count2 = (_a4 = counts.get(element)) != null ? _a4 : 1; - if (count2 === 1) - counts.delete(element); - else - counts.set(element, count2 - 1); - if (count2 !== 1) - return; - let original = originals.get(element); - if (!original) - return; - if (original["aria-hidden"] === null) - element.removeAttribute("aria-hidden"); - else - element.setAttribute("aria-hidden", original["aria-hidden"]); - element.inert = original.inert; - originals.delete(element); - } - let count = (_a3 = counts.get(element)) != null ? _a3 : 0; - counts.set(element, count + 1); - if (count !== 0) - return cleanup; - originals.set(element, { - "aria-hidden": element.getAttribute("aria-hidden"), - inert: element.inert - }); - element.setAttribute("aria-hidden", "true"); - element.inert = true; - return cleanup; - }, [node, enabled]); -} - -// src/hooks/use-root-containers.tsx -var import_react30 = __toESM(__webpack_require__(/*! react */ "react"), 1); -function useRootContainers({ - defaultContainers = [], - portals -} = {}) { - let mainTreeNodeRef = (0, import_react30.useRef)(null); - let ownerDocument = useOwnerDocument(mainTreeNodeRef); - let resolveContainers2 = useEvent(() => { - var _a3; - let containers = []; - for (let container of defaultContainers) { - if (container === null) - continue; - if (container instanceof HTMLElement) { - containers.push(container); - } else if ("current" in container && container.current instanceof HTMLElement) { - containers.push(container.current); - } - } - if (portals == null ? void 0 : portals.current) { - for (let portal of portals.current) { - containers.push(portal); - } - } - for (let container of (_a3 = ownerDocument == null ? void 0 : ownerDocument.querySelectorAll("html > *, body > *")) != null ? _a3 : []) { - if (container === document.body) - continue; - if (container === document.head) - continue; - if (!(container instanceof HTMLElement)) - continue; - if (container.id === "headlessui-portal-root") - continue; - if (container.contains(mainTreeNodeRef.current)) - continue; - if (containers.some((defaultContainer) => container.contains(defaultContainer))) - continue; - containers.push(container); - } - return containers; - }); - return { - resolveContainers: resolveContainers2, - contains: useEvent( - (element) => resolveContainers2().some((container) => container.contains(element)) - ), - mainTreeNodeRef, - MainTreeNode: (0, import_react30.useMemo)(() => { - return function MainTreeNode() { - return /* @__PURE__ */ import_react30.default.createElement(Hidden, { features: 4 /* Hidden */, ref: mainTreeNodeRef }); - }; - }, [mainTreeNodeRef]) - }; -} - -// src/components/dialog/dialog.tsx -var reducers2 = { - [0 /* SetTitleId */](state, action) { - if (state.titleId === action.id) - return state; - return { ...state, titleId: action.id }; - } -}; -var DialogContext = (0, import_react31.createContext)(null); -DialogContext.displayName = "DialogContext"; -function useDialogContext(component) { - let context = (0, import_react31.useContext)(DialogContext); - if (context === null) { - let err = new Error(`<${component} /> is missing a parent component.`); - if (Error.captureStackTrace) - Error.captureStackTrace(err, useDialogContext); - throw err; - } - return context; -} -function useScrollLock(ownerDocument, enabled, resolveAllowedContainers = () => [document.body]) { - useDocumentOverflowLockedEffect(ownerDocument, enabled, (meta) => { - var _a3; - return { - containers: [...(_a3 = meta.containers) != null ? _a3 : [], resolveAllowedContainers] - }; - }); -} -function stateReducer2(state, action) { - return match(action.type, reducers2, state, action); -} -var DEFAULT_DIALOG_TAG = "div"; -var DialogRenderFeatures = 1 /* RenderStrategy */ | 2 /* Static */; -function DialogFn(props, ref) { - var _a3; - let internalId = useId(); - let { - id = `headlessui-dialog-${internalId}`, - open, - onClose, - initialFocus, - __demoMode = false, - ...theirProps - } = props; - let [nestedDialogCount, setNestedDialogCount] = (0, import_react31.useState)(0); - let usesOpenClosedState = useOpenClosed(); - if (open === void 0 && usesOpenClosedState !== null) { - open = (usesOpenClosedState & 1 /* Open */) === 1 /* Open */; - } - let internalDialogRef = (0, import_react31.useRef)(null); - let dialogRef = useSyncRefs(internalDialogRef, ref); - let ownerDocument = useOwnerDocument(internalDialogRef); - let hasOpen = props.hasOwnProperty("open") || usesOpenClosedState !== null; - let hasOnClose = props.hasOwnProperty("onClose"); - if (!hasOpen && !hasOnClose) { - throw new Error( - `You have to provide an \`open\` and an \`onClose\` prop to the \`Dialog\` component.` - ); - } - if (!hasOpen) { - throw new Error( - `You provided an \`onClose\` prop to the \`Dialog\`, but forgot an \`open\` prop.` - ); - } - if (!hasOnClose) { - throw new Error( - `You provided an \`open\` prop to the \`Dialog\`, but forgot an \`onClose\` prop.` - ); - } - if (typeof open !== "boolean") { - throw new Error( - `You provided an \`open\` prop to the \`Dialog\`, but the value is not a boolean. Received: ${open}` - ); - } - if (typeof onClose !== "function") { - throw new Error( - `You provided an \`onClose\` prop to the \`Dialog\`, but the value is not a function. Received: ${onClose}` - ); - } - let dialogState = open ? 0 /* Open */ : 1 /* Closed */; - let [state, dispatch] = (0, import_react31.useReducer)(stateReducer2, { - titleId: null, - descriptionId: null, - panelRef: (0, import_react31.createRef)() - }); - let close = useEvent(() => onClose(false)); - let setTitleId = useEvent((id2) => dispatch({ type: 0 /* SetTitleId */, id: id2 })); - let ready = useServerHandoffComplete(); - let enabled = ready ? __demoMode ? false : dialogState === 0 /* Open */ : false; - let hasNestedDialogs = nestedDialogCount > 1; - let hasParentDialog = (0, import_react31.useContext)(DialogContext) !== null; - let [portals, PortalWrapper] = useNestedPortals(); - let { - resolveContainers: resolveRootContainers, - mainTreeNodeRef, - MainTreeNode - } = useRootContainers({ - portals, - defaultContainers: [(_a3 = state.panelRef.current) != null ? _a3 : internalDialogRef.current] - }); - let position = !hasNestedDialogs ? "leaf" : "parent"; - let isClosing = usesOpenClosedState !== null ? (usesOpenClosedState & 4 /* Closing */) === 4 /* Closing */ : false; - let inertOthersEnabled = (() => { - if (hasParentDialog) - return false; - if (isClosing) - return false; - return enabled; - })(); - let resolveRootOfMainTreeNode = (0, import_react31.useCallback)(() => { - var _a4, _b; - return (_b = Array.from((_a4 = ownerDocument == null ? void 0 : ownerDocument.querySelectorAll("body > *")) != null ? _a4 : []).find((root) => { - if (root.id === "headlessui-portal-root") - return false; - return root.contains(mainTreeNodeRef.current) && root instanceof HTMLElement; - })) != null ? _b : null; - }, [mainTreeNodeRef]); - useInert(resolveRootOfMainTreeNode, inertOthersEnabled); - let inertParentDialogs = (() => { - if (hasNestedDialogs) - return true; - return enabled; - })(); - let resolveRootOfParentDialog = (0, import_react31.useCallback)(() => { - var _a4, _b; - return (_b = Array.from((_a4 = ownerDocument == null ? void 0 : ownerDocument.querySelectorAll("[data-headlessui-portal]")) != null ? _a4 : []).find( - (root) => root.contains(mainTreeNodeRef.current) && root instanceof HTMLElement - )) != null ? _b : null; - }, [mainTreeNodeRef]); - useInert(resolveRootOfParentDialog, inertParentDialogs); - let outsideClickEnabled = (() => { - if (!enabled) - return false; - if (hasNestedDialogs) - return false; - return true; - })(); - useOutsideClick(resolveRootContainers, close, outsideClickEnabled); - let escapeToCloseEnabled = (() => { - if (hasNestedDialogs) - return false; - if (dialogState !== 0 /* Open */) - return false; - return true; - })(); - useEventListener(ownerDocument == null ? void 0 : ownerDocument.defaultView, "keydown", (event) => { - if (!escapeToCloseEnabled) - return; - if (event.defaultPrevented) - return; - if (event.key !== "Escape" /* Escape */) - return; - event.preventDefault(); - event.stopPropagation(); - close(); - }); - let scrollLockEnabled = (() => { - if (isClosing) - return false; - if (dialogState !== 0 /* Open */) - return false; - if (hasParentDialog) - return false; - return true; - })(); - useScrollLock(ownerDocument, scrollLockEnabled, resolveRootContainers); - (0, import_react31.useEffect)(() => { - if (dialogState !== 0 /* Open */) - return; - if (!internalDialogRef.current) - return; - let observer = new ResizeObserver((entries) => { - for (let entry of entries) { - let rect = entry.target.getBoundingClientRect(); - if (rect.x === 0 && rect.y === 0 && rect.width === 0 && rect.height === 0) { - close(); - } - } - }); - observer.observe(internalDialogRef.current); - return () => observer.disconnect(); - }, [dialogState, internalDialogRef, close]); - let [describedby, DescriptionProvider] = useDescriptions(); - let contextBag = (0, import_react31.useMemo)( - () => [{ dialogState, close, setTitleId }, state], - [dialogState, state, close, setTitleId] - ); - let slot = (0, import_react31.useMemo)( - () => ({ open: dialogState === 0 /* Open */ }), - [dialogState] - ); - let ourProps = { - ref: dialogRef, - id, - role: "dialog", - "aria-modal": dialogState === 0 /* Open */ ? true : void 0, - "aria-labelledby": state.titleId, - "aria-describedby": describedby - }; - return /* @__PURE__ */ import_react31.default.createElement( - StackProvider, - { - type: "Dialog", - enabled: dialogState === 0 /* Open */, - element: internalDialogRef, - onUpdate: useEvent((message, type) => { - if (type !== "Dialog") - return; - match(message, { - [0 /* Add */]: () => setNestedDialogCount((count) => count + 1), - [1 /* Remove */]: () => setNestedDialogCount((count) => count - 1) - }); - }) - }, - /* @__PURE__ */ import_react31.default.createElement(ForcePortalRoot, { force: true }, /* @__PURE__ */ import_react31.default.createElement(Portal, null, /* @__PURE__ */ import_react31.default.createElement(DialogContext.Provider, { value: contextBag }, /* @__PURE__ */ import_react31.default.createElement(Portal.Group, { target: internalDialogRef }, /* @__PURE__ */ import_react31.default.createElement(ForcePortalRoot, { force: false }, /* @__PURE__ */ import_react31.default.createElement(DescriptionProvider, { slot, name: "Dialog.Description" }, /* @__PURE__ */ import_react31.default.createElement( - FocusTrap, - { - initialFocus, - containers: resolveRootContainers, - features: enabled ? match(position, { - parent: FocusTrap.features.RestoreFocus, - leaf: FocusTrap.features.All & ~FocusTrap.features.FocusLock - }) : FocusTrap.features.None - }, - /* @__PURE__ */ import_react31.default.createElement(PortalWrapper, null, render({ - ourProps, - theirProps, - slot, - defaultTag: DEFAULT_DIALOG_TAG, - features: DialogRenderFeatures, - visible: dialogState === 0 /* Open */, - name: "Dialog" - })) - ))))))), - /* @__PURE__ */ import_react31.default.createElement(MainTreeNode, null) - ); -} -var DEFAULT_OVERLAY_TAG = "div"; -function OverlayFn(props, ref) { - let internalId = useId(); - let { id = `headlessui-dialog-overlay-${internalId}`, ...theirProps } = props; - let [{ dialogState, close }] = useDialogContext("Dialog.Overlay"); - let overlayRef = useSyncRefs(ref); - let handleClick = useEvent((event) => { - if (event.target !== event.currentTarget) - return; - if (isDisabledReactIssue7711(event.currentTarget)) - return event.preventDefault(); - event.preventDefault(); - event.stopPropagation(); - close(); - }); - let slot = (0, import_react31.useMemo)( - () => ({ open: dialogState === 0 /* Open */ }), - [dialogState] - ); - let ourProps = { - ref: overlayRef, - id, - "aria-hidden": true, - onClick: handleClick - }; - return render({ - ourProps, - theirProps, - slot, - defaultTag: DEFAULT_OVERLAY_TAG, - name: "Dialog.Overlay" - }); -} -var DEFAULT_BACKDROP_TAG = "div"; -function BackdropFn(props, ref) { - let internalId = useId(); - let { id = `headlessui-dialog-backdrop-${internalId}`, ...theirProps } = props; - let [{ dialogState }, state] = useDialogContext("Dialog.Backdrop"); - let backdropRef = useSyncRefs(ref); - (0, import_react31.useEffect)(() => { - if (state.panelRef.current === null) { - throw new Error( - `A component is being used, but a component is missing.` - ); - } - }, [state.panelRef]); - let slot = (0, import_react31.useMemo)( - () => ({ open: dialogState === 0 /* Open */ }), - [dialogState] - ); - let ourProps = { - ref: backdropRef, - id, - "aria-hidden": true - }; - return /* @__PURE__ */ import_react31.default.createElement(ForcePortalRoot, { force: true }, /* @__PURE__ */ import_react31.default.createElement(Portal, null, render({ - ourProps, - theirProps, - slot, - defaultTag: DEFAULT_BACKDROP_TAG, - name: "Dialog.Backdrop" - }))); -} -var DEFAULT_PANEL_TAG = "div"; -function PanelFn(props, ref) { - let internalId = useId(); - let { id = `headlessui-dialog-panel-${internalId}`, ...theirProps } = props; - let [{ dialogState }, state] = useDialogContext("Dialog.Panel"); - let panelRef = useSyncRefs(ref, state.panelRef); - let slot = (0, import_react31.useMemo)( - () => ({ open: dialogState === 0 /* Open */ }), - [dialogState] - ); - let handleClick = useEvent((event) => { - event.stopPropagation(); - }); - let ourProps = { - ref: panelRef, - id, - onClick: handleClick - }; - return render({ - ourProps, - theirProps, - slot, - defaultTag: DEFAULT_PANEL_TAG, - name: "Dialog.Panel" - }); -} -var DEFAULT_TITLE_TAG = "h2"; -function TitleFn(props, ref) { - let internalId = useId(); - let { id = `headlessui-dialog-title-${internalId}`, ...theirProps } = props; - let [{ dialogState, setTitleId }] = useDialogContext("Dialog.Title"); - let titleRef = useSyncRefs(ref); - (0, import_react31.useEffect)(() => { - setTitleId(id); - return () => setTitleId(null); - }, [id, setTitleId]); - let slot = (0, import_react31.useMemo)( - () => ({ open: dialogState === 0 /* Open */ }), - [dialogState] - ); - let ourProps = { ref: titleRef, id }; - return render({ - ourProps, - theirProps, - slot, - defaultTag: DEFAULT_TITLE_TAG, - name: "Dialog.Title" - }); -} -var DialogRoot = forwardRefWithAs(DialogFn); -var Backdrop = forwardRefWithAs(BackdropFn); -var Panel = forwardRefWithAs(PanelFn); -var Overlay = forwardRefWithAs(OverlayFn); -var Title = forwardRefWithAs(TitleFn); -var Dialog = Object.assign(DialogRoot, { - Backdrop, - Panel, - Overlay, - Title, - Description -}); - -// src/components/disclosure/disclosure.tsx -var import_react33 = __toESM(__webpack_require__(/*! react */ "react"), 1); - -// src/utils/start-transition.ts -var import_react32 = __toESM(__webpack_require__(/*! react */ "react"), 1); -var _a2; -var startTransition = ( - // Prefer React's `startTransition` if it's available. - // @ts-expect-error - `startTransition` doesn't exist in React < 18. - (_a2 = import_react32.default.startTransition) != null ? _a2 : function startTransition2(cb) { - cb(); - } -); - -// src/components/disclosure/disclosure.tsx -var reducers3 = { - [0 /* ToggleDisclosure */]: (state) => ({ - ...state, - disclosureState: match(state.disclosureState, { - [0 /* Open */]: 1 /* Closed */, - [1 /* Closed */]: 0 /* Open */ - }) - }), - [1 /* CloseDisclosure */]: (state) => { - if (state.disclosureState === 1 /* Closed */) - return state; - return { ...state, disclosureState: 1 /* Closed */ }; - }, - [4 /* LinkPanel */](state) { - if (state.linkedPanel === true) - return state; - return { ...state, linkedPanel: true }; - }, - [5 /* UnlinkPanel */](state) { - if (state.linkedPanel === false) - return state; - return { ...state, linkedPanel: false }; - }, - [2 /* SetButtonId */](state, action) { - if (state.buttonId === action.buttonId) - return state; - return { ...state, buttonId: action.buttonId }; - }, - [3 /* SetPanelId */](state, action) { - if (state.panelId === action.panelId) - return state; - return { ...state, panelId: action.panelId }; - } -}; -var DisclosureContext = (0, import_react33.createContext)(null); -DisclosureContext.displayName = "DisclosureContext"; -function useDisclosureContext(component) { - let context = (0, import_react33.useContext)(DisclosureContext); - if (context === null) { - let err = new Error(`<${component} /> is missing a parent component.`); - if (Error.captureStackTrace) - Error.captureStackTrace(err, useDisclosureContext); - throw err; - } - return context; -} -var DisclosureAPIContext = (0, import_react33.createContext)(null); -DisclosureAPIContext.displayName = "DisclosureAPIContext"; -function useDisclosureAPIContext(component) { - let context = (0, import_react33.useContext)(DisclosureAPIContext); - if (context === null) { - let err = new Error(`<${component} /> is missing a parent component.`); - if (Error.captureStackTrace) - Error.captureStackTrace(err, useDisclosureAPIContext); - throw err; - } - return context; -} -var DisclosurePanelContext = (0, import_react33.createContext)(null); -DisclosurePanelContext.displayName = "DisclosurePanelContext"; -function useDisclosurePanelContext() { - return (0, import_react33.useContext)(DisclosurePanelContext); -} -function stateReducer3(state, action) { - return match(action.type, reducers3, state, action); -} -var DEFAULT_DISCLOSURE_TAG = import_react33.Fragment; -function DisclosureFn(props, ref) { - let { defaultOpen = false, ...theirProps } = props; - let internalDisclosureRef = (0, import_react33.useRef)(null); - let disclosureRef = useSyncRefs( - ref, - optionalRef( - (ref2) => { - internalDisclosureRef.current = ref2; - }, - props.as === void 0 || // @ts-expect-error The `as` prop _can_ be a Fragment - props.as === import_react33.Fragment - ) - ); - let panelRef = (0, import_react33.useRef)(null); - let buttonRef = (0, import_react33.useRef)(null); - let reducerBag = (0, import_react33.useReducer)(stateReducer3, { - disclosureState: defaultOpen ? 0 /* Open */ : 1 /* Closed */, - linkedPanel: false, - buttonRef, - panelRef, - buttonId: null, - panelId: null - }); - let [{ disclosureState, buttonId }, dispatch] = reducerBag; - let close = useEvent((focusableElement) => { - dispatch({ type: 1 /* CloseDisclosure */ }); - let ownerDocument = getOwnerDocument(internalDisclosureRef); - if (!ownerDocument) - return; - if (!buttonId) - return; - let restoreElement = (() => { - if (!focusableElement) - return ownerDocument.getElementById(buttonId); - if (focusableElement instanceof HTMLElement) - return focusableElement; - if (focusableElement.current instanceof HTMLElement) - return focusableElement.current; - return ownerDocument.getElementById(buttonId); - })(); - restoreElement == null ? void 0 : restoreElement.focus(); - }); - let api = (0, import_react33.useMemo)(() => ({ close }), [close]); - let slot = (0, import_react33.useMemo)( - () => ({ open: disclosureState === 0 /* Open */, close }), - [disclosureState, close] - ); - let ourProps = { - ref: disclosureRef - }; - return /* @__PURE__ */ import_react33.default.createElement(DisclosureContext.Provider, { value: reducerBag }, /* @__PURE__ */ import_react33.default.createElement(DisclosureAPIContext.Provider, { value: api }, /* @__PURE__ */ import_react33.default.createElement( - OpenClosedProvider, - { - value: match(disclosureState, { - [0 /* Open */]: 1 /* Open */, - [1 /* Closed */]: 2 /* Closed */ - }) - }, - render({ - ourProps, - theirProps, - slot, - defaultTag: DEFAULT_DISCLOSURE_TAG, - name: "Disclosure" - }) - ))); -} -var DEFAULT_BUTTON_TAG2 = "button"; -function ButtonFn2(props, ref) { - let internalId = useId(); - let { id = `headlessui-disclosure-button-${internalId}`, ...theirProps } = props; - let [state, dispatch] = useDisclosureContext("Disclosure.Button"); - let panelContext = useDisclosurePanelContext(); - let isWithinPanel = panelContext === null ? false : panelContext === state.panelId; - let internalButtonRef = (0, import_react33.useRef)(null); - let buttonRef = useSyncRefs(internalButtonRef, ref, !isWithinPanel ? state.buttonRef : null); - (0, import_react33.useEffect)(() => { - if (isWithinPanel) - return; - dispatch({ type: 2 /* SetButtonId */, buttonId: id }); - return () => { - dispatch({ type: 2 /* SetButtonId */, buttonId: null }); - }; - }, [id, dispatch, isWithinPanel]); - let handleKeyDown = useEvent((event) => { - var _a3; - if (isWithinPanel) { - if (state.disclosureState === 1 /* Closed */) - return; - switch (event.key) { - case " " /* Space */: - case "Enter" /* Enter */: - event.preventDefault(); - event.stopPropagation(); - dispatch({ type: 0 /* ToggleDisclosure */ }); - (_a3 = state.buttonRef.current) == null ? void 0 : _a3.focus(); - break; - } - } else { - switch (event.key) { - case " " /* Space */: - case "Enter" /* Enter */: - event.preventDefault(); - event.stopPropagation(); - dispatch({ type: 0 /* ToggleDisclosure */ }); - break; - } - } - }); - let handleKeyUp = useEvent((event) => { - switch (event.key) { - case " " /* Space */: - event.preventDefault(); - break; - } - }); - let handleClick = useEvent((event) => { - var _a3; - if (isDisabledReactIssue7711(event.currentTarget)) - return; - if (props.disabled) - return; - if (isWithinPanel) { - dispatch({ type: 0 /* ToggleDisclosure */ }); - (_a3 = state.buttonRef.current) == null ? void 0 : _a3.focus(); - } else { - dispatch({ type: 0 /* ToggleDisclosure */ }); - } - }); - let slot = (0, import_react33.useMemo)( - () => ({ open: state.disclosureState === 0 /* Open */ }), - [state] - ); - let type = useResolveButtonType(props, internalButtonRef); - let ourProps = isWithinPanel ? { ref: buttonRef, type, onKeyDown: handleKeyDown, onClick: handleClick } : { - ref: buttonRef, - id, - type, - "aria-expanded": props.disabled ? void 0 : state.disclosureState === 0 /* Open */, - "aria-controls": state.linkedPanel ? state.panelId : void 0, - onKeyDown: handleKeyDown, - onKeyUp: handleKeyUp, - onClick: handleClick - }; - return render({ - ourProps, - theirProps, - slot, - defaultTag: DEFAULT_BUTTON_TAG2, - name: "Disclosure.Button" - }); -} -var DEFAULT_PANEL_TAG2 = "div"; -var PanelRenderFeatures = 1 /* RenderStrategy */ | 2 /* Static */; -function PanelFn2(props, ref) { - let internalId = useId(); - let { id = `headlessui-disclosure-panel-${internalId}`, ...theirProps } = props; - let [state, dispatch] = useDisclosureContext("Disclosure.Panel"); - let { close } = useDisclosureAPIContext("Disclosure.Panel"); - let panelRef = useSyncRefs(ref, state.panelRef, (el) => { - startTransition(() => dispatch({ type: el ? 4 /* LinkPanel */ : 5 /* UnlinkPanel */ })); - }); - (0, import_react33.useEffect)(() => { - dispatch({ type: 3 /* SetPanelId */, panelId: id }); - return () => { - dispatch({ type: 3 /* SetPanelId */, panelId: null }); - }; - }, [id, dispatch]); - let usesOpenClosedState = useOpenClosed(); - let visible = (() => { - if (usesOpenClosedState !== null) { - return (usesOpenClosedState & 1 /* Open */) === 1 /* Open */; - } - return state.disclosureState === 0 /* Open */; - })(); - let slot = (0, import_react33.useMemo)( - () => ({ open: state.disclosureState === 0 /* Open */, close }), - [state, close] - ); - let ourProps = { - ref: panelRef, - id - }; - return /* @__PURE__ */ import_react33.default.createElement(DisclosurePanelContext.Provider, { value: state.panelId }, render({ - ourProps, - theirProps, - slot, - defaultTag: DEFAULT_PANEL_TAG2, - features: PanelRenderFeatures, - visible, - name: "Disclosure.Panel" - })); -} -var DisclosureRoot = forwardRefWithAs(DisclosureFn); -var Button2 = forwardRefWithAs(ButtonFn2); -var Panel2 = forwardRefWithAs(PanelFn2); -var Disclosure = Object.assign(DisclosureRoot, { Button: Button2, Panel: Panel2 }); - -// src/components/listbox/listbox.tsx -var import_react35 = __toESM(__webpack_require__(/*! react */ "react"), 1); - -// src/hooks/use-text-value.ts -var import_react34 = __webpack_require__(/*! react */ "react"); - -// src/utils/get-text-value.ts -var emojiRegex = /([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g; -function getTextContents(element) { - var _a3, _b; - let currentInnerText = (_a3 = element.innerText) != null ? _a3 : ""; - let copy = element.cloneNode(true); - if (!(copy instanceof HTMLElement)) { - return currentInnerText; - } - let dropped = false; - for (let child of copy.querySelectorAll('[hidden],[aria-hidden],[role="img"]')) { - child.remove(); - dropped = true; - } - let value = dropped ? (_b = copy.innerText) != null ? _b : "" : currentInnerText; - if (emojiRegex.test(value)) { - value = value.replace(emojiRegex, ""); - } - return value; -} -function getTextValue(element) { - let label = element.getAttribute("aria-label"); - if (typeof label === "string") - return label.trim(); - let labelledby = element.getAttribute("aria-labelledby"); - if (labelledby) { - let labels = labelledby.split(" ").map((labelledby2) => { - let labelEl = document.getElementById(labelledby2); - if (labelEl) { - let label2 = labelEl.getAttribute("aria-label"); - if (typeof label2 === "string") - return label2.trim(); - return getTextContents(labelEl).trim(); - } - return null; - }).filter(Boolean); - if (labels.length > 0) - return labels.join(", "); - } - return getTextContents(element).trim(); -} - -// src/hooks/use-text-value.ts -function useTextValue(element) { - let cacheKey = (0, import_react34.useRef)(""); - let cacheValue = (0, import_react34.useRef)(""); - return useEvent(() => { - let el = element.current; - if (!el) - return ""; - let currentKey = el.innerText; - if (cacheKey.current === currentKey) { - return cacheValue.current; - } - let value = getTextValue(el).trim().toLowerCase(); - cacheKey.current = currentKey; - cacheValue.current = value; - return value; - }); -} - -// src/components/listbox/listbox.tsx -function adjustOrderedState2(state, adjustment = (i) => i) { - let currentActiveOption = state.activeOptionIndex !== null ? state.options[state.activeOptionIndex] : null; - let sortedOptions = sortByDomNode( - adjustment(state.options.slice()), - (option) => option.dataRef.current.domRef.current - ); - let adjustedActiveOptionIndex = currentActiveOption ? sortedOptions.indexOf(currentActiveOption) : null; - if (adjustedActiveOptionIndex === -1) { - adjustedActiveOptionIndex = null; - } - return { - options: sortedOptions, - activeOptionIndex: adjustedActiveOptionIndex - }; -} -var reducers4 = { - [1 /* CloseListbox */](state) { - if (state.dataRef.current.disabled) - return state; - if (state.listboxState === 1 /* Closed */) - return state; - return { ...state, activeOptionIndex: null, listboxState: 1 /* Closed */ }; - }, - [0 /* OpenListbox */](state) { - if (state.dataRef.current.disabled) - return state; - if (state.listboxState === 0 /* Open */) - return state; - let activeOptionIndex = state.activeOptionIndex; - let { isSelected } = state.dataRef.current; - let optionIdx = state.options.findIndex((option) => isSelected(option.dataRef.current.value)); - if (optionIdx !== -1) { - activeOptionIndex = optionIdx; - } - return { ...state, listboxState: 0 /* Open */, activeOptionIndex }; - }, - [2 /* GoToOption */](state, action) { - var _a3; - if (state.dataRef.current.disabled) - return state; - if (state.listboxState === 1 /* Closed */) - return state; - let adjustedState = adjustOrderedState2(state); - let activeOptionIndex = calculateActiveIndex(action, { - resolveItems: () => adjustedState.options, - resolveActiveIndex: () => adjustedState.activeOptionIndex, - resolveId: (option) => option.id, - resolveDisabled: (option) => option.dataRef.current.disabled - }); - return { - ...state, - ...adjustedState, - searchQuery: "", - activeOptionIndex, - activationTrigger: (_a3 = action.trigger) != null ? _a3 : 1 /* Other */ - }; - }, - [3 /* Search */]: (state, action) => { - if (state.dataRef.current.disabled) - return state; - if (state.listboxState === 1 /* Closed */) - return state; - let wasAlreadySearching = state.searchQuery !== ""; - let offset = wasAlreadySearching ? 0 : 1; - let searchQuery = state.searchQuery + action.value.toLowerCase(); - let reOrderedOptions = state.activeOptionIndex !== null ? state.options.slice(state.activeOptionIndex + offset).concat(state.options.slice(0, state.activeOptionIndex + offset)) : state.options; - let matchingOption = reOrderedOptions.find( - (option) => { - var _a3; - return !option.dataRef.current.disabled && ((_a3 = option.dataRef.current.textValue) == null ? void 0 : _a3.startsWith(searchQuery)); - } - ); - let matchIdx = matchingOption ? state.options.indexOf(matchingOption) : -1; - if (matchIdx === -1 || matchIdx === state.activeOptionIndex) - return { ...state, searchQuery }; - return { - ...state, - searchQuery, - activeOptionIndex: matchIdx, - activationTrigger: 1 /* Other */ - }; - }, - [4 /* ClearSearch */](state) { - if (state.dataRef.current.disabled) - return state; - if (state.listboxState === 1 /* Closed */) - return state; - if (state.searchQuery === "") - return state; - return { ...state, searchQuery: "" }; - }, - [5 /* RegisterOption */]: (state, action) => { - let option = { id: action.id, dataRef: action.dataRef }; - let adjustedState = adjustOrderedState2(state, (options) => [...options, option]); - if (state.activeOptionIndex === null) { - if (state.dataRef.current.isSelected(action.dataRef.current.value)) { - adjustedState.activeOptionIndex = adjustedState.options.indexOf(option); - } - } - return { ...state, ...adjustedState }; - }, - [6 /* UnregisterOption */]: (state, action) => { - let adjustedState = adjustOrderedState2(state, (options) => { - let idx = options.findIndex((a) => a.id === action.id); - if (idx !== -1) - options.splice(idx, 1); - return options; - }); - return { - ...state, - ...adjustedState, - activationTrigger: 1 /* Other */ - }; - }, - [7 /* RegisterLabel */]: (state, action) => { - return { - ...state, - labelId: action.id - }; - } -}; -var ListboxActionsContext = (0, import_react35.createContext)(null); -ListboxActionsContext.displayName = "ListboxActionsContext"; -function useActions2(component) { - let context = (0, import_react35.useContext)(ListboxActionsContext); - if (context === null) { - let err = new Error(`<${component} /> is missing a parent component.`); - if (Error.captureStackTrace) - Error.captureStackTrace(err, useActions2); - throw err; - } - return context; -} -var ListboxDataContext = (0, import_react35.createContext)(null); -ListboxDataContext.displayName = "ListboxDataContext"; -function useData2(component) { - let context = (0, import_react35.useContext)(ListboxDataContext); - if (context === null) { - let err = new Error(`<${component} /> is missing a parent component.`); - if (Error.captureStackTrace) - Error.captureStackTrace(err, useData2); - throw err; - } - return context; -} -function stateReducer4(state, action) { - return match(action.type, reducers4, state, action); -} -var DEFAULT_LISTBOX_TAG = import_react35.Fragment; -function ListboxFn(props, ref) { - let { - value: controlledValue, - defaultValue, - form: formName, - name, - onChange: controlledOnChange, - by = (a, z) => a === z, - disabled = false, - horizontal = false, - multiple = false, - ...theirProps - } = props; - const orientation = horizontal ? "horizontal" : "vertical"; - let listboxRef = useSyncRefs(ref); - let [value = multiple ? [] : void 0, theirOnChange] = useControllable( - controlledValue, - controlledOnChange, - defaultValue - ); - let [state, dispatch] = (0, import_react35.useReducer)(stateReducer4, { - dataRef: (0, import_react35.createRef)(), - listboxState: 1 /* Closed */, - options: [], - searchQuery: "", - labelId: null, - activeOptionIndex: null, - activationTrigger: 1 /* Other */ - }); - let optionsPropsRef = (0, import_react35.useRef)({ static: false, hold: false }); - let labelRef = (0, import_react35.useRef)(null); - let buttonRef = (0, import_react35.useRef)(null); - let optionsRef = (0, import_react35.useRef)(null); - let compare = useEvent( - typeof by === "string" ? (a, z) => { - let property = by; - return (a == null ? void 0 : a[property]) === (z == null ? void 0 : z[property]); - } : by - ); - let isSelected = (0, import_react35.useCallback)( - (compareValue) => match(data.mode, { - [1 /* Multi */]: () => value.some((option) => compare(option, compareValue)), - [0 /* Single */]: () => compare(value, compareValue) - }), - [value] - ); - let data = (0, import_react35.useMemo)( - () => ({ - ...state, - value, - disabled, - mode: multiple ? 1 /* Multi */ : 0 /* Single */, - orientation, - compare, - isSelected, - optionsPropsRef, - labelRef, - buttonRef, - optionsRef - }), - [value, disabled, multiple, state] - ); - useIsoMorphicEffect(() => { - state.dataRef.current = data; - }, [data]); - useOutsideClick( - [data.buttonRef, data.optionsRef], - (event, target) => { - var _a3; - dispatch({ type: 1 /* CloseListbox */ }); - if (!isFocusableElement(target, 1 /* Loose */)) { - event.preventDefault(); - (_a3 = data.buttonRef.current) == null ? void 0 : _a3.focus(); - } - }, - data.listboxState === 0 /* Open */ - ); - let slot = (0, import_react35.useMemo)( - () => ({ open: data.listboxState === 0 /* Open */, disabled, value }), - [data, disabled, value] - ); - let selectOption = useEvent((id) => { - let option = data.options.find((item) => item.id === id); - if (!option) - return; - onChange(option.dataRef.current.value); - }); - let selectActiveOption = useEvent(() => { - if (data.activeOptionIndex !== null) { - let { dataRef, id } = data.options[data.activeOptionIndex]; - onChange(dataRef.current.value); - dispatch({ type: 2 /* GoToOption */, focus: 4 /* Specific */, id }); - } - }); - let openListbox = useEvent(() => dispatch({ type: 0 /* OpenListbox */ })); - let closeListbox = useEvent(() => dispatch({ type: 1 /* CloseListbox */ })); - let goToOption = useEvent((focus, id, trigger) => { - if (focus === 4 /* Specific */) { - return dispatch({ type: 2 /* GoToOption */, focus: 4 /* Specific */, id, trigger }); - } - return dispatch({ type: 2 /* GoToOption */, focus, trigger }); - }); - let registerOption = useEvent((id, dataRef) => { - dispatch({ type: 5 /* RegisterOption */, id, dataRef }); - return () => dispatch({ type: 6 /* UnregisterOption */, id }); - }); - let registerLabel = useEvent((id) => { - dispatch({ type: 7 /* RegisterLabel */, id }); - return () => dispatch({ type: 7 /* RegisterLabel */, id: null }); - }); - let onChange = useEvent((value2) => { - return match(data.mode, { - [0 /* Single */]() { - return theirOnChange == null ? void 0 : theirOnChange(value2); - }, - [1 /* Multi */]() { - let copy = data.value.slice(); - let idx = copy.findIndex((item) => compare(item, value2)); - if (idx === -1) { - copy.push(value2); - } else { - copy.splice(idx, 1); - } - return theirOnChange == null ? void 0 : theirOnChange(copy); - } - }); - }); - let search = useEvent((value2) => dispatch({ type: 3 /* Search */, value: value2 })); - let clearSearch = useEvent(() => dispatch({ type: 4 /* ClearSearch */ })); - let actions = (0, import_react35.useMemo)( - () => ({ - onChange, - registerOption, - registerLabel, - goToOption, - closeListbox, - openListbox, - selectActiveOption, - selectOption, - search, - clearSearch - }), - [] - ); - let ourProps = { ref: listboxRef }; - let form = (0, import_react35.useRef)(null); - let d = useDisposables(); - (0, import_react35.useEffect)(() => { - if (!form.current) - return; - if (defaultValue === void 0) - return; - d.addEventListener(form.current, "reset", () => { - onChange(defaultValue); - }); - }, [ - form, - onChange - /* Explicitly ignoring `defaultValue` */ - ]); - return /* @__PURE__ */ import_react35.default.createElement(ListboxActionsContext.Provider, { value: actions }, /* @__PURE__ */ import_react35.default.createElement(ListboxDataContext.Provider, { value: data }, /* @__PURE__ */ import_react35.default.createElement( - OpenClosedProvider, - { - value: match(data.listboxState, { - [0 /* Open */]: 1 /* Open */, - [1 /* Closed */]: 2 /* Closed */ - }) - }, - name != null && value != null && objectToFormEntries({ [name]: value }).map(([name2, value2], idx) => /* @__PURE__ */ import_react35.default.createElement( - Hidden, - { - features: 4 /* Hidden */, - ref: idx === 0 ? (element) => { - var _a3; - form.current = (_a3 = element == null ? void 0 : element.closest("form")) != null ? _a3 : null; - } : void 0, - ...compact({ - key: name2, - as: "input", - type: "hidden", - hidden: true, - readOnly: true, - form: formName, - name: name2, - value: value2 - }) - } - )), - render({ ourProps, theirProps, slot, defaultTag: DEFAULT_LISTBOX_TAG, name: "Listbox" }) - ))); -} -var DEFAULT_BUTTON_TAG3 = "button"; -function ButtonFn3(props, ref) { - var _a3; - let internalId = useId(); - let { id = `headlessui-listbox-button-${internalId}`, ...theirProps } = props; - let data = useData2("Listbox.Button"); - let actions = useActions2("Listbox.Button"); - let buttonRef = useSyncRefs(data.buttonRef, ref); - let d = useDisposables(); - let handleKeyDown = useEvent((event) => { - switch (event.key) { - case " " /* Space */: - case "Enter" /* Enter */: - case "ArrowDown" /* ArrowDown */: - event.preventDefault(); - actions.openListbox(); - d.nextFrame(() => { - if (!data.value) - actions.goToOption(0 /* First */); - }); - break; - case "ArrowUp" /* ArrowUp */: - event.preventDefault(); - actions.openListbox(); - d.nextFrame(() => { - if (!data.value) - actions.goToOption(3 /* Last */); - }); - break; - } - }); - let handleKeyUp = useEvent((event) => { - switch (event.key) { - case " " /* Space */: - event.preventDefault(); - break; - } - }); - let handleClick = useEvent((event) => { - if (isDisabledReactIssue7711(event.currentTarget)) - return event.preventDefault(); - if (data.listboxState === 0 /* Open */) { - actions.closeListbox(); - d.nextFrame(() => { - var _a4; - return (_a4 = data.buttonRef.current) == null ? void 0 : _a4.focus({ preventScroll: true }); - }); - } else { - event.preventDefault(); - actions.openListbox(); - } - }); - let labelledby = useComputed(() => { - if (!data.labelId) - return void 0; - return [data.labelId, id].join(" "); - }, [data.labelId, id]); - let slot = (0, import_react35.useMemo)( - () => ({ - open: data.listboxState === 0 /* Open */, - disabled: data.disabled, - value: data.value - }), - [data] - ); - let ourProps = { - ref: buttonRef, - id, - type: useResolveButtonType(props, data.buttonRef), - "aria-haspopup": "listbox", - "aria-controls": (_a3 = data.optionsRef.current) == null ? void 0 : _a3.id, - "aria-expanded": data.disabled ? void 0 : data.listboxState === 0 /* Open */, - "aria-labelledby": labelledby, - disabled: data.disabled, - onKeyDown: handleKeyDown, - onKeyUp: handleKeyUp, - onClick: handleClick - }; - return render({ - ourProps, - theirProps, - slot, - defaultTag: DEFAULT_BUTTON_TAG3, - name: "Listbox.Button" - }); -} -var DEFAULT_LABEL_TAG2 = "label"; -function LabelFn2(props, ref) { - let internalId = useId(); - let { id = `headlessui-listbox-label-${internalId}`, ...theirProps } = props; - let data = useData2("Listbox.Label"); - let actions = useActions2("Listbox.Label"); - let labelRef = useSyncRefs(data.labelRef, ref); - useIsoMorphicEffect(() => actions.registerLabel(id), [id]); - let handleClick = useEvent(() => { - var _a3; - return (_a3 = data.buttonRef.current) == null ? void 0 : _a3.focus({ preventScroll: true }); - }); - let slot = (0, import_react35.useMemo)( - () => ({ open: data.listboxState === 0 /* Open */, disabled: data.disabled }), - [data] - ); - let ourProps = { ref: labelRef, id, onClick: handleClick }; - return render({ - ourProps, - theirProps, - slot, - defaultTag: DEFAULT_LABEL_TAG2, - name: "Listbox.Label" - }); -} -var DEFAULT_OPTIONS_TAG2 = "ul"; -var OptionsRenderFeatures2 = 1 /* RenderStrategy */ | 2 /* Static */; -function OptionsFn2(props, ref) { - var _a3; - let internalId = useId(); - let { id = `headlessui-listbox-options-${internalId}`, ...theirProps } = props; - let data = useData2("Listbox.Options"); - let actions = useActions2("Listbox.Options"); - let optionsRef = useSyncRefs(data.optionsRef, ref); - let d = useDisposables(); - let searchDisposables = useDisposables(); - let usesOpenClosedState = useOpenClosed(); - let visible = (() => { - if (usesOpenClosedState !== null) { - return (usesOpenClosedState & 1 /* Open */) === 1 /* Open */; - } - return data.listboxState === 0 /* Open */; - })(); - (0, import_react35.useEffect)(() => { - var _a4; - let container = data.optionsRef.current; - if (!container) - return; - if (data.listboxState !== 0 /* Open */) - return; - if (container === ((_a4 = getOwnerDocument(container)) == null ? void 0 : _a4.activeElement)) - return; - container.focus({ preventScroll: true }); - }, [data.listboxState, data.optionsRef]); - let handleKeyDown = useEvent((event) => { - searchDisposables.dispose(); - switch (event.key) { - case " " /* Space */: - if (data.searchQuery !== "") { - event.preventDefault(); - event.stopPropagation(); - return actions.search(event.key); - } - case "Enter" /* Enter */: - event.preventDefault(); - event.stopPropagation(); - if (data.activeOptionIndex !== null) { - let { dataRef } = data.options[data.activeOptionIndex]; - actions.onChange(dataRef.current.value); - } - if (data.mode === 0 /* Single */) { - actions.closeListbox(); - disposables().nextFrame(() => { - var _a4; - return (_a4 = data.buttonRef.current) == null ? void 0 : _a4.focus({ preventScroll: true }); - }); - } - break; - case match(data.orientation, { vertical: "ArrowDown" /* ArrowDown */, horizontal: "ArrowRight" /* ArrowRight */ }): - event.preventDefault(); - event.stopPropagation(); - return actions.goToOption(2 /* Next */); - case match(data.orientation, { vertical: "ArrowUp" /* ArrowUp */, horizontal: "ArrowLeft" /* ArrowLeft */ }): - event.preventDefault(); - event.stopPropagation(); - return actions.goToOption(1 /* Previous */); - case "Home" /* Home */: - case "PageUp" /* PageUp */: - event.preventDefault(); - event.stopPropagation(); - return actions.goToOption(0 /* First */); - case "End" /* End */: - case "PageDown" /* PageDown */: - event.preventDefault(); - event.stopPropagation(); - return actions.goToOption(3 /* Last */); - case "Escape" /* Escape */: - event.preventDefault(); - event.stopPropagation(); - actions.closeListbox(); - return d.nextFrame(() => { - var _a4; - return (_a4 = data.buttonRef.current) == null ? void 0 : _a4.focus({ preventScroll: true }); - }); - case "Tab" /* Tab */: - event.preventDefault(); - event.stopPropagation(); - break; - default: - if (event.key.length === 1) { - actions.search(event.key); - searchDisposables.setTimeout(() => actions.clearSearch(), 350); - } - break; - } - }); - let labelledby = useComputed( - () => { - var _a4, _b, _c; - return (_c = (_a4 = data.labelRef.current) == null ? void 0 : _a4.id) != null ? _c : (_b = data.buttonRef.current) == null ? void 0 : _b.id; - }, - [data.labelRef.current, data.buttonRef.current] - ); - let slot = (0, import_react35.useMemo)( - () => ({ open: data.listboxState === 0 /* Open */ }), - [data] - ); - let ourProps = { - "aria-activedescendant": data.activeOptionIndex === null ? void 0 : (_a3 = data.options[data.activeOptionIndex]) == null ? void 0 : _a3.id, - "aria-multiselectable": data.mode === 1 /* Multi */ ? true : void 0, - "aria-labelledby": labelledby, - "aria-orientation": data.orientation, - id, - onKeyDown: handleKeyDown, - role: "listbox", - tabIndex: 0, - ref: optionsRef - }; - return render({ - ourProps, - theirProps, - slot, - defaultTag: DEFAULT_OPTIONS_TAG2, - features: OptionsRenderFeatures2, - visible, - name: "Listbox.Options" - }); -} -var DEFAULT_OPTION_TAG2 = "li"; -function OptionFn2(props, ref) { - let internalId = useId(); - let { - id = `headlessui-listbox-option-${internalId}`, - disabled = false, - value, - ...theirProps - } = props; - let data = useData2("Listbox.Option"); - let actions = useActions2("Listbox.Option"); - let active = data.activeOptionIndex !== null ? data.options[data.activeOptionIndex].id === id : false; - let selected = data.isSelected(value); - let internalOptionRef = (0, import_react35.useRef)(null); - let getTextValue2 = useTextValue(internalOptionRef); - let bag = useLatestValue({ - disabled, - value, - domRef: internalOptionRef, - get textValue() { - return getTextValue2(); - } - }); - let optionRef = useSyncRefs(ref, internalOptionRef); - useIsoMorphicEffect(() => { - if (data.listboxState !== 0 /* Open */) - return; - if (!active) - return; - if (data.activationTrigger === 0 /* Pointer */) - return; - let d = disposables(); - d.requestAnimationFrame(() => { - var _a3, _b; - (_b = (_a3 = internalOptionRef.current) == null ? void 0 : _a3.scrollIntoView) == null ? void 0 : _b.call(_a3, { block: "nearest" }); - }); - return d.dispose; - }, [ - internalOptionRef, - active, - data.listboxState, - data.activationTrigger, - /* We also want to trigger this when the position of the active item changes so that we can re-trigger the scrollIntoView */ - data.activeOptionIndex - ]); - useIsoMorphicEffect(() => actions.registerOption(id, bag), [bag, id]); - let handleClick = useEvent((event) => { - if (disabled) - return event.preventDefault(); - actions.onChange(value); - if (data.mode === 0 /* Single */) { - actions.closeListbox(); - disposables().nextFrame(() => { - var _a3; - return (_a3 = data.buttonRef.current) == null ? void 0 : _a3.focus({ preventScroll: true }); - }); - } - }); - let handleFocus = useEvent(() => { - if (disabled) - return actions.goToOption(5 /* Nothing */); - actions.goToOption(4 /* Specific */, id); - }); - let pointer = useTrackedPointer(); - let handleEnter = useEvent((evt) => pointer.update(evt)); - let handleMove = useEvent((evt) => { - if (!pointer.wasMoved(evt)) - return; - if (disabled) - return; - if (active) - return; - actions.goToOption(4 /* Specific */, id, 0 /* Pointer */); - }); - let handleLeave = useEvent((evt) => { - if (!pointer.wasMoved(evt)) - return; - if (disabled) - return; - if (!active) - return; - actions.goToOption(5 /* Nothing */); - }); - let slot = (0, import_react35.useMemo)( - () => ({ active, selected, disabled }), - [active, selected, disabled] - ); - let ourProps = { - id, - ref: optionRef, - role: "option", - tabIndex: disabled === true ? void 0 : -1, - "aria-disabled": disabled === true ? true : void 0, - // According to the WAI-ARIA best practices, we should use aria-checked for - // multi-select,but Voice-Over disagrees. So we use aria-checked instead for - // both single and multi-select. - "aria-selected": selected, - disabled: void 0, - // Never forward the `disabled` prop - onClick: handleClick, - onFocus: handleFocus, - onPointerEnter: handleEnter, - onMouseEnter: handleEnter, - onPointerMove: handleMove, - onMouseMove: handleMove, - onPointerLeave: handleLeave, - onMouseLeave: handleLeave - }; - return render({ - ourProps, - theirProps, - slot, - defaultTag: DEFAULT_OPTION_TAG2, - name: "Listbox.Option" - }); -} -var ListboxRoot = forwardRefWithAs(ListboxFn); -var Button3 = forwardRefWithAs(ButtonFn3); -var Label2 = forwardRefWithAs(LabelFn2); -var Options2 = forwardRefWithAs(OptionsFn2); -var Option2 = forwardRefWithAs(OptionFn2); -var Listbox = Object.assign(ListboxRoot, { Button: Button3, Label: Label2, Options: Options2, Option: Option2 }); - -// src/components/menu/menu.tsx -var import_react36 = __toESM(__webpack_require__(/*! react */ "react"), 1); -function adjustOrderedState3(state, adjustment = (i) => i) { - let currentActiveItem = state.activeItemIndex !== null ? state.items[state.activeItemIndex] : null; - let sortedItems = sortByDomNode( - adjustment(state.items.slice()), - (item) => item.dataRef.current.domRef.current - ); - let adjustedActiveItemIndex = currentActiveItem ? sortedItems.indexOf(currentActiveItem) : null; - if (adjustedActiveItemIndex === -1) { - adjustedActiveItemIndex = null; - } - return { - items: sortedItems, - activeItemIndex: adjustedActiveItemIndex - }; -} -var reducers5 = { - [1 /* CloseMenu */](state) { - if (state.menuState === 1 /* Closed */) - return state; - return { ...state, activeItemIndex: null, menuState: 1 /* Closed */ }; - }, - [0 /* OpenMenu */](state) { - if (state.menuState === 0 /* Open */) - return state; - return { - ...state, - /* We can turn off demo mode once we re-open the `Menu` */ - __demoMode: false, - menuState: 0 /* Open */ - }; - }, - [2 /* GoToItem */]: (state, action) => { - var _a3; - let adjustedState = adjustOrderedState3(state); - let activeItemIndex = calculateActiveIndex(action, { - resolveItems: () => adjustedState.items, - resolveActiveIndex: () => adjustedState.activeItemIndex, - resolveId: (item) => item.id, - resolveDisabled: (item) => item.dataRef.current.disabled - }); - return { - ...state, - ...adjustedState, - searchQuery: "", - activeItemIndex, - activationTrigger: (_a3 = action.trigger) != null ? _a3 : 1 /* Other */ - }; - }, - [3 /* Search */]: (state, action) => { - let wasAlreadySearching = state.searchQuery !== ""; - let offset = wasAlreadySearching ? 0 : 1; - let searchQuery = state.searchQuery + action.value.toLowerCase(); - let reOrderedItems = state.activeItemIndex !== null ? state.items.slice(state.activeItemIndex + offset).concat(state.items.slice(0, state.activeItemIndex + offset)) : state.items; - let matchingItem = reOrderedItems.find( - (item) => { - var _a3; - return ((_a3 = item.dataRef.current.textValue) == null ? void 0 : _a3.startsWith(searchQuery)) && !item.dataRef.current.disabled; - } - ); - let matchIdx = matchingItem ? state.items.indexOf(matchingItem) : -1; - if (matchIdx === -1 || matchIdx === state.activeItemIndex) - return { ...state, searchQuery }; - return { - ...state, - searchQuery, - activeItemIndex: matchIdx, - activationTrigger: 1 /* Other */ - }; - }, - [4 /* ClearSearch */](state) { - if (state.searchQuery === "") - return state; - return { ...state, searchQuery: "", searchActiveItemIndex: null }; - }, - [5 /* RegisterItem */]: (state, action) => { - let adjustedState = adjustOrderedState3(state, (items) => [ - ...items, - { id: action.id, dataRef: action.dataRef } - ]); - return { ...state, ...adjustedState }; - }, - [6 /* UnregisterItem */]: (state, action) => { - let adjustedState = adjustOrderedState3(state, (items) => { - let idx = items.findIndex((a) => a.id === action.id); - if (idx !== -1) - items.splice(idx, 1); - return items; - }); - return { - ...state, - ...adjustedState, - activationTrigger: 1 /* Other */ - }; - } -}; -var MenuContext = (0, import_react36.createContext)(null); -MenuContext.displayName = "MenuContext"; -function useMenuContext(component) { - let context = (0, import_react36.useContext)(MenuContext); - if (context === null) { - let err = new Error(`<${component} /> is missing a parent component.`); - if (Error.captureStackTrace) - Error.captureStackTrace(err, useMenuContext); - throw err; - } - return context; -} -function stateReducer5(state, action) { - return match(action.type, reducers5, state, action); -} -var DEFAULT_MENU_TAG = import_react36.Fragment; -function MenuFn(props, ref) { - let { __demoMode = false, ...theirProps } = props; - let reducerBag = (0, import_react36.useReducer)(stateReducer5, { - __demoMode, - menuState: __demoMode ? 0 /* Open */ : 1 /* Closed */, - buttonRef: (0, import_react36.createRef)(), - itemsRef: (0, import_react36.createRef)(), - items: [], - searchQuery: "", - activeItemIndex: null, - activationTrigger: 1 /* Other */ - }); - let [{ menuState, itemsRef, buttonRef }, dispatch] = reducerBag; - let menuRef = useSyncRefs(ref); - useOutsideClick( - [buttonRef, itemsRef], - (event, target) => { - var _a3; - dispatch({ type: 1 /* CloseMenu */ }); - if (!isFocusableElement(target, 1 /* Loose */)) { - event.preventDefault(); - (_a3 = buttonRef.current) == null ? void 0 : _a3.focus(); - } - }, - menuState === 0 /* Open */ - ); - let close = useEvent(() => { - dispatch({ type: 1 /* CloseMenu */ }); - }); - let slot = (0, import_react36.useMemo)( - () => ({ open: menuState === 0 /* Open */, close }), - [menuState, close] - ); - let ourProps = { ref: menuRef }; - return /* @__PURE__ */ import_react36.default.createElement(MenuContext.Provider, { value: reducerBag }, /* @__PURE__ */ import_react36.default.createElement( - OpenClosedProvider, - { - value: match(menuState, { - [0 /* Open */]: 1 /* Open */, - [1 /* Closed */]: 2 /* Closed */ - }) - }, - render({ - ourProps, - theirProps, - slot, - defaultTag: DEFAULT_MENU_TAG, - name: "Menu" - }) - )); -} -var DEFAULT_BUTTON_TAG4 = "button"; -function ButtonFn4(props, ref) { - var _a3; - let internalId = useId(); - let { id = `headlessui-menu-button-${internalId}`, ...theirProps } = props; - let [state, dispatch] = useMenuContext("Menu.Button"); - let buttonRef = useSyncRefs(state.buttonRef, ref); - let d = useDisposables(); - let handleKeyDown = useEvent((event) => { - switch (event.key) { - case " " /* Space */: - case "Enter" /* Enter */: - case "ArrowDown" /* ArrowDown */: - event.preventDefault(); - event.stopPropagation(); - dispatch({ type: 0 /* OpenMenu */ }); - d.nextFrame(() => dispatch({ type: 2 /* GoToItem */, focus: 0 /* First */ })); - break; - case "ArrowUp" /* ArrowUp */: - event.preventDefault(); - event.stopPropagation(); - dispatch({ type: 0 /* OpenMenu */ }); - d.nextFrame(() => dispatch({ type: 2 /* GoToItem */, focus: 3 /* Last */ })); - break; - } - }); - let handleKeyUp = useEvent((event) => { - switch (event.key) { - case " " /* Space */: - event.preventDefault(); - break; - } - }); - let handleClick = useEvent((event) => { - if (isDisabledReactIssue7711(event.currentTarget)) - return event.preventDefault(); - if (props.disabled) - return; - if (state.menuState === 0 /* Open */) { - dispatch({ type: 1 /* CloseMenu */ }); - d.nextFrame(() => { - var _a4; - return (_a4 = state.buttonRef.current) == null ? void 0 : _a4.focus({ preventScroll: true }); - }); - } else { - event.preventDefault(); - dispatch({ type: 0 /* OpenMenu */ }); - } - }); - let slot = (0, import_react36.useMemo)( - () => ({ open: state.menuState === 0 /* Open */ }), - [state] - ); - let ourProps = { - ref: buttonRef, - id, - type: useResolveButtonType(props, state.buttonRef), - "aria-haspopup": "menu", - "aria-controls": (_a3 = state.itemsRef.current) == null ? void 0 : _a3.id, - "aria-expanded": props.disabled ? void 0 : state.menuState === 0 /* Open */, - onKeyDown: handleKeyDown, - onKeyUp: handleKeyUp, - onClick: handleClick - }; - return render({ - ourProps, - theirProps, - slot, - defaultTag: DEFAULT_BUTTON_TAG4, - name: "Menu.Button" - }); -} -var DEFAULT_ITEMS_TAG = "div"; -var ItemsRenderFeatures = 1 /* RenderStrategy */ | 2 /* Static */; -function ItemsFn(props, ref) { - var _a3, _b; - let internalId = useId(); - let { id = `headlessui-menu-items-${internalId}`, ...theirProps } = props; - let [state, dispatch] = useMenuContext("Menu.Items"); - let itemsRef = useSyncRefs(state.itemsRef, ref); - let ownerDocument = useOwnerDocument(state.itemsRef); - let searchDisposables = useDisposables(); - let usesOpenClosedState = useOpenClosed(); - let visible = (() => { - if (usesOpenClosedState !== null) { - return (usesOpenClosedState & 1 /* Open */) === 1 /* Open */; - } - return state.menuState === 0 /* Open */; - })(); - (0, import_react36.useEffect)(() => { - let container = state.itemsRef.current; - if (!container) - return; - if (state.menuState !== 0 /* Open */) - return; - if (container === (ownerDocument == null ? void 0 : ownerDocument.activeElement)) - return; - container.focus({ preventScroll: true }); - }, [state.menuState, state.itemsRef, ownerDocument]); - useTreeWalker({ - container: state.itemsRef.current, - enabled: state.menuState === 0 /* Open */, - accept(node) { - if (node.getAttribute("role") === "menuitem") - return NodeFilter.FILTER_REJECT; - if (node.hasAttribute("role")) - return NodeFilter.FILTER_SKIP; - return NodeFilter.FILTER_ACCEPT; - }, - walk(node) { - node.setAttribute("role", "none"); - } - }); - let handleKeyDown = useEvent((event) => { - var _a4, _b2; - searchDisposables.dispose(); - switch (event.key) { - case " " /* Space */: - if (state.searchQuery !== "") { - event.preventDefault(); - event.stopPropagation(); - return dispatch({ type: 3 /* Search */, value: event.key }); - } - case "Enter" /* Enter */: - event.preventDefault(); - event.stopPropagation(); - dispatch({ type: 1 /* CloseMenu */ }); - if (state.activeItemIndex !== null) { - let { dataRef } = state.items[state.activeItemIndex]; - (_b2 = (_a4 = dataRef.current) == null ? void 0 : _a4.domRef.current) == null ? void 0 : _b2.click(); - } - restoreFocusIfNecessary(state.buttonRef.current); - break; - case "ArrowDown" /* ArrowDown */: - event.preventDefault(); - event.stopPropagation(); - return dispatch({ type: 2 /* GoToItem */, focus: 2 /* Next */ }); - case "ArrowUp" /* ArrowUp */: - event.preventDefault(); - event.stopPropagation(); - return dispatch({ type: 2 /* GoToItem */, focus: 1 /* Previous */ }); - case "Home" /* Home */: - case "PageUp" /* PageUp */: - event.preventDefault(); - event.stopPropagation(); - return dispatch({ type: 2 /* GoToItem */, focus: 0 /* First */ }); - case "End" /* End */: - case "PageDown" /* PageDown */: - event.preventDefault(); - event.stopPropagation(); - return dispatch({ type: 2 /* GoToItem */, focus: 3 /* Last */ }); - case "Escape" /* Escape */: - event.preventDefault(); - event.stopPropagation(); - dispatch({ type: 1 /* CloseMenu */ }); - disposables().nextFrame(() => { - var _a5; - return (_a5 = state.buttonRef.current) == null ? void 0 : _a5.focus({ preventScroll: true }); - }); - break; - case "Tab" /* Tab */: - event.preventDefault(); - event.stopPropagation(); - dispatch({ type: 1 /* CloseMenu */ }); - disposables().nextFrame(() => { - focusFrom( - state.buttonRef.current, - event.shiftKey ? 2 /* Previous */ : 4 /* Next */ - ); - }); - break; - default: - if (event.key.length === 1) { - dispatch({ type: 3 /* Search */, value: event.key }); - searchDisposables.setTimeout(() => dispatch({ type: 4 /* ClearSearch */ }), 350); - } - break; - } - }); - let handleKeyUp = useEvent((event) => { - switch (event.key) { - case " " /* Space */: - event.preventDefault(); - break; - } - }); - let slot = (0, import_react36.useMemo)( - () => ({ open: state.menuState === 0 /* Open */ }), - [state] - ); - let ourProps = { - "aria-activedescendant": state.activeItemIndex === null ? void 0 : (_a3 = state.items[state.activeItemIndex]) == null ? void 0 : _a3.id, - "aria-labelledby": (_b = state.buttonRef.current) == null ? void 0 : _b.id, - id, - onKeyDown: handleKeyDown, - onKeyUp: handleKeyUp, - role: "menu", - tabIndex: 0, - ref: itemsRef - }; - return render({ - ourProps, - theirProps, - slot, - defaultTag: DEFAULT_ITEMS_TAG, - features: ItemsRenderFeatures, - visible, - name: "Menu.Items" - }); -} -var DEFAULT_ITEM_TAG = import_react36.Fragment; -function ItemFn(props, ref) { - let internalId = useId(); - let { id = `headlessui-menu-item-${internalId}`, disabled = false, ...theirProps } = props; - let [state, dispatch] = useMenuContext("Menu.Item"); - let active = state.activeItemIndex !== null ? state.items[state.activeItemIndex].id === id : false; - let internalItemRef = (0, import_react36.useRef)(null); - let itemRef = useSyncRefs(ref, internalItemRef); - useIsoMorphicEffect(() => { - if (state.__demoMode) - return; - if (state.menuState !== 0 /* Open */) - return; - if (!active) - return; - if (state.activationTrigger === 0 /* Pointer */) - return; - let d = disposables(); - d.requestAnimationFrame(() => { - var _a3, _b; - (_b = (_a3 = internalItemRef.current) == null ? void 0 : _a3.scrollIntoView) == null ? void 0 : _b.call(_a3, { block: "nearest" }); - }); - return d.dispose; - }, [ - state.__demoMode, - internalItemRef, - active, - state.menuState, - state.activationTrigger, - /* We also want to trigger this when the position of the active item changes so that we can re-trigger the scrollIntoView */ - state.activeItemIndex - ]); - let getTextValue2 = useTextValue(internalItemRef); - let bag = (0, import_react36.useRef)({ - disabled, - domRef: internalItemRef, - get textValue() { - return getTextValue2(); - } - }); - useIsoMorphicEffect(() => { - bag.current.disabled = disabled; - }, [bag, disabled]); - useIsoMorphicEffect(() => { - dispatch({ type: 5 /* RegisterItem */, id, dataRef: bag }); - return () => dispatch({ type: 6 /* UnregisterItem */, id }); - }, [bag, id]); - let close = useEvent(() => { - dispatch({ type: 1 /* CloseMenu */ }); - }); - let handleClick = useEvent((event) => { - if (disabled) - return event.preventDefault(); - dispatch({ type: 1 /* CloseMenu */ }); - restoreFocusIfNecessary(state.buttonRef.current); - }); - let handleFocus = useEvent(() => { - if (disabled) - return dispatch({ type: 2 /* GoToItem */, focus: 5 /* Nothing */ }); - dispatch({ type: 2 /* GoToItem */, focus: 4 /* Specific */, id }); - }); - let pointer = useTrackedPointer(); - let handleEnter = useEvent((evt) => pointer.update(evt)); - let handleMove = useEvent((evt) => { - if (!pointer.wasMoved(evt)) - return; - if (disabled) - return; - if (active) - return; - dispatch({ - type: 2 /* GoToItem */, - focus: 4 /* Specific */, - id, - trigger: 0 /* Pointer */ - }); - }); - let handleLeave = useEvent((evt) => { - if (!pointer.wasMoved(evt)) - return; - if (disabled) - return; - if (!active) - return; - dispatch({ type: 2 /* GoToItem */, focus: 5 /* Nothing */ }); - }); - let slot = (0, import_react36.useMemo)( - () => ({ active, disabled, close }), - [active, disabled, close] - ); - let ourProps = { - id, - ref: itemRef, - role: "menuitem", - tabIndex: disabled === true ? void 0 : -1, - "aria-disabled": disabled === true ? true : void 0, - disabled: void 0, - // Never forward the `disabled` prop - onClick: handleClick, - onFocus: handleFocus, - onPointerEnter: handleEnter, - onMouseEnter: handleEnter, - onPointerMove: handleMove, - onMouseMove: handleMove, - onPointerLeave: handleLeave, - onMouseLeave: handleLeave - }; - return render({ - ourProps, - theirProps, - slot, - defaultTag: DEFAULT_ITEM_TAG, - name: "Menu.Item" - }); -} -var MenuRoot = forwardRefWithAs(MenuFn); -var Button4 = forwardRefWithAs(ButtonFn4); -var Items = forwardRefWithAs(ItemsFn); -var Item = forwardRefWithAs(ItemFn); -var Menu = Object.assign(MenuRoot, { Button: Button4, Items, Item }); - -// src/components/popover/popover.tsx -var import_react37 = __toESM(__webpack_require__(/*! react */ "react"), 1); -var reducers6 = { - [0 /* TogglePopover */]: (state) => { - let nextState = { - ...state, - popoverState: match(state.popoverState, { - [0 /* Open */]: 1 /* Closed */, - [1 /* Closed */]: 0 /* Open */ - }) - }; - if (nextState.popoverState === 0 /* Open */) { - nextState.__demoMode = false; - } - return nextState; - }, - [1 /* ClosePopover */](state) { - if (state.popoverState === 1 /* Closed */) - return state; - return { ...state, popoverState: 1 /* Closed */ }; - }, - [2 /* SetButton */](state, action) { - if (state.button === action.button) - return state; - return { ...state, button: action.button }; - }, - [3 /* SetButtonId */](state, action) { - if (state.buttonId === action.buttonId) - return state; - return { ...state, buttonId: action.buttonId }; - }, - [4 /* SetPanel */](state, action) { - if (state.panel === action.panel) - return state; - return { ...state, panel: action.panel }; - }, - [5 /* SetPanelId */](state, action) { - if (state.panelId === action.panelId) - return state; - return { ...state, panelId: action.panelId }; - } -}; -var PopoverContext = (0, import_react37.createContext)(null); -PopoverContext.displayName = "PopoverContext"; -function usePopoverContext(component) { - let context = (0, import_react37.useContext)(PopoverContext); - if (context === null) { - let err = new Error(`<${component} /> is missing a parent component.`); - if (Error.captureStackTrace) - Error.captureStackTrace(err, usePopoverContext); - throw err; - } - return context; -} -var PopoverAPIContext = (0, import_react37.createContext)(null); -PopoverAPIContext.displayName = "PopoverAPIContext"; -function usePopoverAPIContext(component) { - let context = (0, import_react37.useContext)(PopoverAPIContext); - if (context === null) { - let err = new Error(`<${component} /> is missing a parent component.`); - if (Error.captureStackTrace) - Error.captureStackTrace(err, usePopoverAPIContext); - throw err; - } - return context; -} -var PopoverGroupContext = (0, import_react37.createContext)(null); -PopoverGroupContext.displayName = "PopoverGroupContext"; -function usePopoverGroupContext() { - return (0, import_react37.useContext)(PopoverGroupContext); -} -var PopoverPanelContext = (0, import_react37.createContext)(null); -PopoverPanelContext.displayName = "PopoverPanelContext"; -function usePopoverPanelContext() { - return (0, import_react37.useContext)(PopoverPanelContext); -} -function stateReducer6(state, action) { - return match(action.type, reducers6, state, action); -} -var DEFAULT_POPOVER_TAG = "div"; -function PopoverFn(props, ref) { - var _a3; - let { __demoMode = false, ...theirProps } = props; - let internalPopoverRef = (0, import_react37.useRef)(null); - let popoverRef = useSyncRefs( - ref, - optionalRef((ref2) => { - internalPopoverRef.current = ref2; - }) - ); - let buttons = (0, import_react37.useRef)([]); - let reducerBag = (0, import_react37.useReducer)(stateReducer6, { - __demoMode, - popoverState: __demoMode ? 0 /* Open */ : 1 /* Closed */, - buttons, - button: null, - buttonId: null, - panel: null, - panelId: null, - beforePanelSentinel: (0, import_react37.createRef)(), - afterPanelSentinel: (0, import_react37.createRef)() - }); - let [ - { popoverState, button, buttonId, panel, panelId, beforePanelSentinel, afterPanelSentinel }, - dispatch - ] = reducerBag; - let ownerDocument = useOwnerDocument((_a3 = internalPopoverRef.current) != null ? _a3 : button); - let isPortalled = (0, import_react37.useMemo)(() => { - if (!button) - return false; - if (!panel) - return false; - for (let root2 of document.querySelectorAll("body > *")) { - if (Number(root2 == null ? void 0 : root2.contains(button)) ^ Number(root2 == null ? void 0 : root2.contains(panel))) { - return true; - } - } - let elements = getFocusableElements(); - let buttonIdx = elements.indexOf(button); - let beforeIdx = (buttonIdx + elements.length - 1) % elements.length; - let afterIdx = (buttonIdx + 1) % elements.length; - let beforeElement = elements[beforeIdx]; - let afterElement = elements[afterIdx]; - if (!panel.contains(beforeElement) && !panel.contains(afterElement)) { - return true; - } - return false; - }, [button, panel]); - let buttonIdRef = useLatestValue(buttonId); - let panelIdRef = useLatestValue(panelId); - let registerBag = (0, import_react37.useMemo)( - () => ({ - buttonId: buttonIdRef, - panelId: panelIdRef, - close: () => dispatch({ type: 1 /* ClosePopover */ }) - }), - [buttonIdRef, panelIdRef, dispatch] - ); - let groupContext = usePopoverGroupContext(); - let registerPopover = groupContext == null ? void 0 : groupContext.registerPopover; - let isFocusWithinPopoverGroup = useEvent(() => { - var _a4; - return (_a4 = groupContext == null ? void 0 : groupContext.isFocusWithinPopoverGroup()) != null ? _a4 : (ownerDocument == null ? void 0 : ownerDocument.activeElement) && ((button == null ? void 0 : button.contains(ownerDocument.activeElement)) || (panel == null ? void 0 : panel.contains(ownerDocument.activeElement))); - }); - (0, import_react37.useEffect)(() => registerPopover == null ? void 0 : registerPopover(registerBag), [registerPopover, registerBag]); - let [portals, PortalWrapper] = useNestedPortals(); - let root = useRootContainers({ - portals, - defaultContainers: [button, panel] - }); - useEventListener( - ownerDocument == null ? void 0 : ownerDocument.defaultView, - "focus", - (event) => { - var _a4, _b, _c, _d; - if (event.target === window) - return; - if (!(event.target instanceof HTMLElement)) - return; - if (popoverState !== 0 /* Open */) - return; - if (isFocusWithinPopoverGroup()) - return; - if (!button) - return; - if (!panel) - return; - if (root.contains(event.target)) - return; - if ((_b = (_a4 = beforePanelSentinel.current) == null ? void 0 : _a4.contains) == null ? void 0 : _b.call(_a4, event.target)) - return; - if ((_d = (_c = afterPanelSentinel.current) == null ? void 0 : _c.contains) == null ? void 0 : _d.call(_c, event.target)) - return; - dispatch({ type: 1 /* ClosePopover */ }); - }, - true - ); - useOutsideClick( - root.resolveContainers, - (event, target) => { - dispatch({ type: 1 /* ClosePopover */ }); - if (!isFocusableElement(target, 1 /* Loose */)) { - event.preventDefault(); - button == null ? void 0 : button.focus(); - } - }, - popoverState === 0 /* Open */ - ); - let close = useEvent( - (focusableElement) => { - dispatch({ type: 1 /* ClosePopover */ }); - let restoreElement = (() => { - if (!focusableElement) - return button; - if (focusableElement instanceof HTMLElement) - return focusableElement; - if ("current" in focusableElement && focusableElement.current instanceof HTMLElement) - return focusableElement.current; - return button; - })(); - restoreElement == null ? void 0 : restoreElement.focus(); - } - ); - let api = (0, import_react37.useMemo)( - () => ({ close, isPortalled }), - [close, isPortalled] - ); - let slot = (0, import_react37.useMemo)( - () => ({ open: popoverState === 0 /* Open */, close }), - [popoverState, close] - ); - let ourProps = { ref: popoverRef }; - return /* @__PURE__ */ import_react37.default.createElement(PopoverPanelContext.Provider, { value: null }, /* @__PURE__ */ import_react37.default.createElement(PopoverContext.Provider, { value: reducerBag }, /* @__PURE__ */ import_react37.default.createElement(PopoverAPIContext.Provider, { value: api }, /* @__PURE__ */ import_react37.default.createElement( - OpenClosedProvider, - { - value: match(popoverState, { - [0 /* Open */]: 1 /* Open */, - [1 /* Closed */]: 2 /* Closed */ - }) - }, - /* @__PURE__ */ import_react37.default.createElement(PortalWrapper, null, render({ - ourProps, - theirProps, - slot, - defaultTag: DEFAULT_POPOVER_TAG, - name: "Popover" - }), /* @__PURE__ */ import_react37.default.createElement(root.MainTreeNode, null)) - )))); -} -var DEFAULT_BUTTON_TAG5 = "button"; -function ButtonFn5(props, ref) { - let internalId = useId(); - let { id = `headlessui-popover-button-${internalId}`, ...theirProps } = props; - let [state, dispatch] = usePopoverContext("Popover.Button"); - let { isPortalled } = usePopoverAPIContext("Popover.Button"); - let internalButtonRef = (0, import_react37.useRef)(null); - let sentinelId = `headlessui-focus-sentinel-${useId()}`; - let groupContext = usePopoverGroupContext(); - let closeOthers = groupContext == null ? void 0 : groupContext.closeOthers; - let panelContext = usePopoverPanelContext(); - let isWithinPanel = panelContext !== null; - (0, import_react37.useEffect)(() => { - if (isWithinPanel) - return; - dispatch({ type: 3 /* SetButtonId */, buttonId: id }); - return () => { - dispatch({ type: 3 /* SetButtonId */, buttonId: null }); - }; - }, [isWithinPanel, id, dispatch]); - let [uniqueIdentifier] = (0, import_react37.useState)(() => Symbol()); - let buttonRef = useSyncRefs( - internalButtonRef, - ref, - isWithinPanel ? null : (button) => { - if (button) { - state.buttons.current.push(uniqueIdentifier); - } else { - let idx = state.buttons.current.indexOf(uniqueIdentifier); - if (idx !== -1) - state.buttons.current.splice(idx, 1); - } - if (state.buttons.current.length > 1) { - console.warn( - "You are already using a but only 1 is supported." - ); - } - button && dispatch({ type: 2 /* SetButton */, button }); - } - ); - let withinPanelButtonRef = useSyncRefs(internalButtonRef, ref); - let ownerDocument = useOwnerDocument(internalButtonRef); - let handleKeyDown = useEvent((event) => { - var _a3, _b, _c; - if (isWithinPanel) { - if (state.popoverState === 1 /* Closed */) - return; - switch (event.key) { - case " " /* Space */: - case "Enter" /* Enter */: - event.preventDefault(); - (_b = (_a3 = event.target).click) == null ? void 0 : _b.call(_a3); - dispatch({ type: 1 /* ClosePopover */ }); - (_c = state.button) == null ? void 0 : _c.focus(); - break; - } - } else { - switch (event.key) { - case " " /* Space */: - case "Enter" /* Enter */: - event.preventDefault(); - event.stopPropagation(); - if (state.popoverState === 1 /* Closed */) - closeOthers == null ? void 0 : closeOthers(state.buttonId); - dispatch({ type: 0 /* TogglePopover */ }); - break; - case "Escape" /* Escape */: - if (state.popoverState !== 0 /* Open */) - return closeOthers == null ? void 0 : closeOthers(state.buttonId); - if (!internalButtonRef.current) - return; - if ((ownerDocument == null ? void 0 : ownerDocument.activeElement) && !internalButtonRef.current.contains(ownerDocument.activeElement)) { - return; - } - event.preventDefault(); - event.stopPropagation(); - dispatch({ type: 1 /* ClosePopover */ }); - break; - } - } - }); - let handleKeyUp = useEvent((event) => { - if (isWithinPanel) - return; - if (event.key === " " /* Space */) { - event.preventDefault(); - } - }); - let handleClick = useEvent((event) => { - var _a3, _b; - if (isDisabledReactIssue7711(event.currentTarget)) - return; - if (props.disabled) - return; - if (isWithinPanel) { - dispatch({ type: 1 /* ClosePopover */ }); - (_a3 = state.button) == null ? void 0 : _a3.focus(); - } else { - event.preventDefault(); - event.stopPropagation(); - if (state.popoverState === 1 /* Closed */) - closeOthers == null ? void 0 : closeOthers(state.buttonId); - dispatch({ type: 0 /* TogglePopover */ }); - (_b = state.button) == null ? void 0 : _b.focus(); - } - }); - let handleMouseDown = useEvent((event) => { - event.preventDefault(); - event.stopPropagation(); - }); - let visible = state.popoverState === 0 /* Open */; - let slot = (0, import_react37.useMemo)(() => ({ open: visible }), [visible]); - let type = useResolveButtonType(props, internalButtonRef); - let ourProps = isWithinPanel ? { - ref: withinPanelButtonRef, - type, - onKeyDown: handleKeyDown, - onClick: handleClick - } : { - ref: buttonRef, - id: state.buttonId, - type, - "aria-expanded": props.disabled ? void 0 : state.popoverState === 0 /* Open */, - "aria-controls": state.panel ? state.panelId : void 0, - onKeyDown: handleKeyDown, - onKeyUp: handleKeyUp, - onClick: handleClick, - onMouseDown: handleMouseDown - }; - let direction = useTabDirection(); - let handleFocus = useEvent(() => { - let el = state.panel; - if (!el) - return; - function run() { - let result = match(direction.current, { - [0 /* Forwards */]: () => focusIn(el, 1 /* First */), - [1 /* Backwards */]: () => focusIn(el, 8 /* Last */) - }); - if (result === 0 /* Error */) { - focusIn( - getFocusableElements().filter((el2) => el2.dataset.headlessuiFocusGuard !== "true"), - match(direction.current, { - [0 /* Forwards */]: 4 /* Next */, - [1 /* Backwards */]: 2 /* Previous */ - }), - { relativeTo: state.button } - ); - } - } - if (false) {} else { - run(); - } - }); - return /* @__PURE__ */ import_react37.default.createElement(import_react37.default.Fragment, null, render({ - ourProps, - theirProps, - slot, - defaultTag: DEFAULT_BUTTON_TAG5, - name: "Popover.Button" - }), visible && !isWithinPanel && isPortalled && /* @__PURE__ */ import_react37.default.createElement( - Hidden, - { - id: sentinelId, - features: 2 /* Focusable */, - "data-headlessui-focus-guard": true, - as: "button", - type: "button", - onFocus: handleFocus - } - )); -} -var DEFAULT_OVERLAY_TAG2 = "div"; -var OverlayRenderFeatures = 1 /* RenderStrategy */ | 2 /* Static */; -function OverlayFn2(props, ref) { - let internalId = useId(); - let { id = `headlessui-popover-overlay-${internalId}`, ...theirProps } = props; - let [{ popoverState }, dispatch] = usePopoverContext("Popover.Overlay"); - let overlayRef = useSyncRefs(ref); - let usesOpenClosedState = useOpenClosed(); - let visible = (() => { - if (usesOpenClosedState !== null) { - return (usesOpenClosedState & 1 /* Open */) === 1 /* Open */; - } - return popoverState === 0 /* Open */; - })(); - let handleClick = useEvent((event) => { - if (isDisabledReactIssue7711(event.currentTarget)) - return event.preventDefault(); - dispatch({ type: 1 /* ClosePopover */ }); - }); - let slot = (0, import_react37.useMemo)( - () => ({ open: popoverState === 0 /* Open */ }), - [popoverState] - ); - let ourProps = { - ref: overlayRef, - id, - "aria-hidden": true, - onClick: handleClick - }; - return render({ - ourProps, - theirProps, - slot, - defaultTag: DEFAULT_OVERLAY_TAG2, - features: OverlayRenderFeatures, - visible, - name: "Popover.Overlay" - }); -} -var DEFAULT_PANEL_TAG3 = "div"; -var PanelRenderFeatures2 = 1 /* RenderStrategy */ | 2 /* Static */; -function PanelFn3(props, ref) { - let internalId = useId(); - let { id = `headlessui-popover-panel-${internalId}`, focus = false, ...theirProps } = props; - let [state, dispatch] = usePopoverContext("Popover.Panel"); - let { close, isPortalled } = usePopoverAPIContext("Popover.Panel"); - let beforePanelSentinelId = `headlessui-focus-sentinel-before-${useId()}`; - let afterPanelSentinelId = `headlessui-focus-sentinel-after-${useId()}`; - let internalPanelRef = (0, import_react37.useRef)(null); - let panelRef = useSyncRefs(internalPanelRef, ref, (panel) => { - dispatch({ type: 4 /* SetPanel */, panel }); - }); - let ownerDocument = useOwnerDocument(internalPanelRef); - useIsoMorphicEffect(() => { - dispatch({ type: 5 /* SetPanelId */, panelId: id }); - return () => { - dispatch({ type: 5 /* SetPanelId */, panelId: null }); - }; - }, [id, dispatch]); - let usesOpenClosedState = useOpenClosed(); - let visible = (() => { - if (usesOpenClosedState !== null) { - return (usesOpenClosedState & 1 /* Open */) === 1 /* Open */; - } - return state.popoverState === 0 /* Open */; - })(); - let handleKeyDown = useEvent((event) => { - var _a3; - switch (event.key) { - case "Escape" /* Escape */: - if (state.popoverState !== 0 /* Open */) - return; - if (!internalPanelRef.current) - return; - if ((ownerDocument == null ? void 0 : ownerDocument.activeElement) && !internalPanelRef.current.contains(ownerDocument.activeElement)) { - return; - } - event.preventDefault(); - event.stopPropagation(); - dispatch({ type: 1 /* ClosePopover */ }); - (_a3 = state.button) == null ? void 0 : _a3.focus(); - break; - } - }); - (0, import_react37.useEffect)(() => { - var _a3; - if (props.static) - return; - if (state.popoverState === 1 /* Closed */ && ((_a3 = props.unmount) != null ? _a3 : true)) { - dispatch({ type: 4 /* SetPanel */, panel: null }); - } - }, [state.popoverState, props.unmount, props.static, dispatch]); - (0, import_react37.useEffect)(() => { - if (state.__demoMode) - return; - if (!focus) - return; - if (state.popoverState !== 0 /* Open */) - return; - if (!internalPanelRef.current) - return; - let activeElement = ownerDocument == null ? void 0 : ownerDocument.activeElement; - if (internalPanelRef.current.contains(activeElement)) - return; - focusIn(internalPanelRef.current, 1 /* First */); - }, [state.__demoMode, focus, internalPanelRef, state.popoverState]); - let slot = (0, import_react37.useMemo)( - () => ({ open: state.popoverState === 0 /* Open */, close }), - [state, close] - ); - let ourProps = { - ref: panelRef, - id, - onKeyDown: handleKeyDown, - onBlur: focus && state.popoverState === 0 /* Open */ ? (event) => { - var _a3, _b, _c, _d, _e; - let el = event.relatedTarget; - if (!el) - return; - if (!internalPanelRef.current) - return; - if ((_a3 = internalPanelRef.current) == null ? void 0 : _a3.contains(el)) - return; - dispatch({ type: 1 /* ClosePopover */ }); - if (((_c = (_b = state.beforePanelSentinel.current) == null ? void 0 : _b.contains) == null ? void 0 : _c.call(_b, el)) || ((_e = (_d = state.afterPanelSentinel.current) == null ? void 0 : _d.contains) == null ? void 0 : _e.call(_d, el))) { - el.focus({ preventScroll: true }); - } - } : void 0, - tabIndex: -1 - }; - let direction = useTabDirection(); - let handleBeforeFocus = useEvent(() => { - let el = internalPanelRef.current; - if (!el) - return; - function run() { - match(direction.current, { - [0 /* Forwards */]: () => { - var _a3; - let result = focusIn(el, 1 /* First */); - if (result === 0 /* Error */) { - (_a3 = state.afterPanelSentinel.current) == null ? void 0 : _a3.focus(); - } - }, - [1 /* Backwards */]: () => { - var _a3; - (_a3 = state.button) == null ? void 0 : _a3.focus({ preventScroll: true }); - } - }); - } - if (false) {} else { - run(); - } - }); - let handleAfterFocus = useEvent(() => { - let el = internalPanelRef.current; - if (!el) - return; - function run() { - match(direction.current, { - [0 /* Forwards */]: () => { - var _a3; - if (!state.button) - return; - let elements = getFocusableElements(); - let idx = elements.indexOf(state.button); - let before = elements.slice(0, idx + 1); - let after = elements.slice(idx + 1); - let combined = [...after, ...before]; - for (let element of combined.slice()) { - if (element.dataset.headlessuiFocusGuard === "true" || ((_a3 = state.panel) == null ? void 0 : _a3.contains(element))) { - let idx2 = combined.indexOf(element); - if (idx2 !== -1) - combined.splice(idx2, 1); - } - } - focusIn(combined, 1 /* First */, { sorted: false }); - }, - [1 /* Backwards */]: () => { - var _a3; - let result = focusIn(el, 2 /* Previous */); - if (result === 0 /* Error */) { - (_a3 = state.button) == null ? void 0 : _a3.focus(); - } - } - }); - } - if (false) {} else { - run(); - } - }); - return /* @__PURE__ */ import_react37.default.createElement(PopoverPanelContext.Provider, { value: id }, visible && isPortalled && /* @__PURE__ */ import_react37.default.createElement( - Hidden, - { - id: beforePanelSentinelId, - ref: state.beforePanelSentinel, - features: 2 /* Focusable */, - "data-headlessui-focus-guard": true, - as: "button", - type: "button", - onFocus: handleBeforeFocus - } - ), render({ - ourProps, - theirProps, - slot, - defaultTag: DEFAULT_PANEL_TAG3, - features: PanelRenderFeatures2, - visible, - name: "Popover.Panel" - }), visible && isPortalled && /* @__PURE__ */ import_react37.default.createElement( - Hidden, - { - id: afterPanelSentinelId, - ref: state.afterPanelSentinel, - features: 2 /* Focusable */, - "data-headlessui-focus-guard": true, - as: "button", - type: "button", - onFocus: handleAfterFocus - } - )); -} -var DEFAULT_GROUP_TAG2 = "div"; -function GroupFn2(props, ref) { - let internalGroupRef = (0, import_react37.useRef)(null); - let groupRef = useSyncRefs(internalGroupRef, ref); - let [popovers, setPopovers] = (0, import_react37.useState)([]); - let unregisterPopover = useEvent((registerbag) => { - setPopovers((existing) => { - let idx = existing.indexOf(registerbag); - if (idx !== -1) { - let clone = existing.slice(); - clone.splice(idx, 1); - return clone; - } - return existing; - }); - }); - let registerPopover = useEvent((registerbag) => { - setPopovers((existing) => [...existing, registerbag]); - return () => unregisterPopover(registerbag); - }); - let isFocusWithinPopoverGroup = useEvent(() => { - var _a3; - let ownerDocument = getOwnerDocument(internalGroupRef); - if (!ownerDocument) - return false; - let element = ownerDocument.activeElement; - if ((_a3 = internalGroupRef.current) == null ? void 0 : _a3.contains(element)) - return true; - return popovers.some((bag) => { - var _a4, _b; - return ((_a4 = ownerDocument.getElementById(bag.buttonId.current)) == null ? void 0 : _a4.contains(element)) || ((_b = ownerDocument.getElementById(bag.panelId.current)) == null ? void 0 : _b.contains(element)); - }); - }); - let closeOthers = useEvent((buttonId) => { - for (let popover of popovers) { - if (popover.buttonId.current !== buttonId) - popover.close(); - } - }); - let contextBag = (0, import_react37.useMemo)( - () => ({ - registerPopover, - unregisterPopover, - isFocusWithinPopoverGroup, - closeOthers - }), - [registerPopover, unregisterPopover, isFocusWithinPopoverGroup, closeOthers] - ); - let slot = (0, import_react37.useMemo)(() => ({}), []); - let theirProps = props; - let ourProps = { ref: groupRef }; - return /* @__PURE__ */ import_react37.default.createElement(PopoverGroupContext.Provider, { value: contextBag }, render({ - ourProps, - theirProps, - slot, - defaultTag: DEFAULT_GROUP_TAG2, - name: "Popover.Group" - })); -} -var PopoverRoot = forwardRefWithAs(PopoverFn); -var Button5 = forwardRefWithAs(ButtonFn5); -var Overlay2 = forwardRefWithAs(OverlayFn2); -var Panel3 = forwardRefWithAs(PanelFn3); -var Group2 = forwardRefWithAs(GroupFn2); -var Popover = Object.assign(PopoverRoot, { Button: Button5, Overlay: Overlay2, Panel: Panel3, Group: Group2 }); - -// src/components/radio-group/radio-group.tsx -var import_react40 = __toESM(__webpack_require__(/*! react */ "react"), 1); - -// src/hooks/use-flags.ts -var import_react38 = __webpack_require__(/*! react */ "react"); -function useFlags(initialFlags = 0) { - let [flags, setFlags] = (0, import_react38.useState)(initialFlags); - let mounted = useIsMounted(); - let addFlag = (0, import_react38.useCallback)( - (flag) => { - if (!mounted.current) - return; - setFlags((flags2) => flags2 | flag); - }, - [flags, mounted] - ); - let hasFlag = (0, import_react38.useCallback)((flag) => Boolean(flags & flag), [flags]); - let removeFlag = (0, import_react38.useCallback)( - (flag) => { - if (!mounted.current) - return; - setFlags((flags2) => flags2 & ~flag); - }, - [setFlags, mounted] - ); - let toggleFlag = (0, import_react38.useCallback)( - (flag) => { - if (!mounted.current) - return; - setFlags((flags2) => flags2 ^ flag); - }, - [setFlags] - ); - return { flags, addFlag, hasFlag, removeFlag, toggleFlag }; -} - -// src/components/label/label.tsx -var import_react39 = __toESM(__webpack_require__(/*! react */ "react"), 1); -var LabelContext = (0, import_react39.createContext)( - null -); -function useLabelContext() { - let context = (0, import_react39.useContext)(LabelContext); - if (context === null) { - let err = new Error("You used a